Import Cobalt 23.master.0.307905
diff --git a/.codespellignorelines b/.codespellignorelines
index e2b2905..90892e7 100644
--- a/.codespellignorelines
+++ b/.codespellignorelines
@@ -1,3 +1,8 @@
     vp9AllowList.get("Technicolor").add("STING");
   return SkSurface::MakeRenderTarget(gr_context_.get(), SkBudgeted::kNo,
             texture_infos.push_back(TextureInfo("uv", "ba"));
+/*  If zlib is available and you want to support the flate compression
+// Onces represent initializations that should only ever happen once per
+      gr_texture_.reset(new GrBackendTexture(texture_size.width(),
+                                             texture_size.height(),
+                                             GrMipMapped::kNo, texture_info));
diff --git a/.gitignore b/.gitignore
index 1fc585f..9a5a5ca 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@
 .idea
 /venv/*
 _certs/
+.coverage
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index e80ac24..2ee0961 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -117,7 +117,7 @@
         name: check if starboard interface changed
         entry: python ./precommit_hooks/warn_that_starboard_interface_changed_wrapper.py
         language: python
-        files: '^starboard/*.h$'
+        files: '^starboard/[^/]+\.h$'
         stages: [push]
     -   id: download-resources
         name: download resources
@@ -153,7 +153,7 @@
         description: Run Python 2 unittests
         entry: python precommit_hooks/run_python2_unittests.py
         language: python
-        language_version: python2
+        language_version: python2.7
         additional_dependencies: ['mock']
         types: [python]
     -   id: osslint
diff --git a/README.md b/README.md
index 8ca8618..6c96aa9 100644
--- a/README.md
+++ b/README.md
@@ -50,7 +50,7 @@
     writable pages are not executable is a strong security protocol that can
     prevent a wide spectrum of attacks. But, as a side effect, this also means
     no ability to JIT.
-  * **Heterogenous Development Environments.** This is slowly evening out, but
+  * **Heterogeneous Development Environments.** This is slowly evening out, but
     all CE devices run on custom hardware, often with proprietary methods of
     building, packaging, deploying, and running programs. Almost all CE devices
     have ARM processors instead of the more familiar x86. Sometimes the
@@ -141,7 +141,7 @@
 All source locations are specified relative to `src/` (this directory).
 
   * `base/` - Chromium's Base library. Contains common utilities, and a light
-    platform abstraction, which has been superceded in Cobalt by Starboard.
+    platform abstraction, which has been superseded in Cobalt by Starboard.
   * `net/` - Chromium's Network library. Contains enough infrastructure to
     support the network needs of an HTTP User-Agent (like Chromium or Cobalt),
     an HTTP server, a DIAL server, and several abstractions for networking
@@ -149,7 +149,7 @@
   * `cobalt/` - The home of all Cobalt application code. This includes the Web
     Implementation, Layout Engine, Renderer, and some other Cobalt-specific
     features.
-      * `cobalt/build/` - The core build generation system, `gyp_cobalt`, and
+      * `cobalt/build/` - The core build generation system, `gn.py`, and
         configurations for supported platforms. (NOTE: This should eventually be
         mostly moved into `starboard/`.)
       * `cobalt/doc/` - Contains a wide range of detailed information and guides
@@ -162,11 +162,8 @@
     [`README.md`](starboard/README.md) for more detailed information about
     porting Starboard (and Cobalt) to a new platform.
   * `third_party/` - Where all of Cobalt's third-party dependencies live. We
-    don't mean to be perjorative, we love our third-party libraries! This
+    don't mean to be pejorative, we love our third-party libraries! This
     location is dictated by Google OSS release management rules...
-      * `third_party/starboard/` - The location for third-party ports. This
-        directory will be scanned automatically by gyp_cobalt for available
-        Starboard ports.
 
 
 ## Building and Running the Code
@@ -196,4 +193,4 @@
 
 ## Origin of this Repository
 
-This is a fork of the chromium repository at http://git.chromium.org/git/chromium.git
\ No newline at end of file
+This is a fork of the chromium repository at http://git.chromium.org/git/chromium.git
diff --git a/_env.py b/_env.py
deleted file mode 100644
index d398413..0000000
--- a/_env.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Copyright 2017 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Load the project environment."""
-
-from imp import load_source
-from os import path
-
-_ENVIRONMENT_PATH = path.abspath(path.join(path.dirname(__file__), 'starboard',
-                                           'tools', 'environment.py'))
-load_source('environment', _ENVIRONMENT_PATH)
diff --git a/base/BUILD.gn b/base/BUILD.gn
index c0af895..8a5bc66 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -2283,10 +2283,13 @@
 
   configs += [ "//build/config/compiler:wexit_time_destructors" ]
   if (!is_debug) {
-    if (!is_starboard) {
+    if (is_starboard) {
+      configs -= [ "//starboard/build/config:size" ]
+      configs += [ "//starboard/build/config:speed" ]
+    } else {
       configs -= [ "//build/config/compiler:default_optimization" ]
+      configs += [ "//build/config/compiler:optimize_max" ]
     }
-    configs += [ "//build/config/compiler:optimize_max" ]
   }
 }
 
@@ -2388,10 +2391,13 @@
   }
 
   if (!is_debug) {
-    if (!is_starboard) {
+    if (is_starboard) {
+      configs -= [ "//starboard/build/config:size" ]
+      configs += [ "//starboard/build/config:speed" ]
+    } else {
       configs -= [ "//build/config/compiler:default_optimization" ]
+      configs += [ "//build/config/compiler:optimize_max" ]
     }
-    configs += [ "//build/config/compiler:optimize_max" ]
   }
 }
 
@@ -2459,10 +2465,13 @@
   }
 
   if (!is_debug) {
-    if (!is_starboard) {
+    if (is_starboard) {
+      configs -= [ "//starboard/build/config:size" ]
+      configs += [ "//starboard/build/config:speed" ]
+    } else {
       configs -= [ "//build/config/compiler:default_optimization" ]
+      configs += [ "//build/config/compiler:optimize_max" ]
     }
-    configs += [ "//build/config/compiler:optimize_max" ]
   }
 
   # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
@@ -2579,6 +2588,9 @@
 
 copy("base_unittests_bundle_data") {
   testonly = true
+  if (is_starboard) {
+    install_content = true
+  }
   sources = [
     "//tools/metrics/histograms/enums.xml",
     "test/data/file_util/binary_file.bin",
@@ -2604,6 +2616,13 @@
     "test/data/serializer_test_nowhitespace.json",
   ]
   if (is_starboard) {
+    sources += [
+      "test/data/file_util/red.png",
+      "test/data/file_version_info_unittest/FileVersionInfoTest1.dll",
+      "test/data/file_version_info_unittest/FileVersionInfoTest2.dll",
+      "test/data/pe_image/pe_image_test_32.dll",
+      "test/data/pe_image/pe_image_test_64.dll",
+    ]
     sources -= [ "//tools/metrics/histograms/enums.xml" ]
     outputs = [ "$sb_static_contents_output_data_dir/test/base/{{source_target_relative}}" ]
   } else {
@@ -3175,6 +3194,12 @@
   public_deps = [
     ":base_unittests_bundle_data",
   ]
+  if (is_starboard){
+    content_deps = [
+      ":base_unittests_bundle_data",
+      "//third_party/icu:icudata",
+    ]
+  }
 
   data = [
     "test/data/",
diff --git a/base/base.gyp b/base/base.gyp
deleted file mode 100644
index 5aafb30..0000000
--- a/base/base.gyp
+++ /dev/null
@@ -1,1069 +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.
-
-{
-  'variables': {
-    'chromium_code': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'base',
-      'type': '<(component)',
-      'dependencies': [
-        '<(DEPTH)/nb/nb.gyp:nb',
-        '<(DEPTH)/starboard/client_porting/eztime/eztime.gyp:eztime',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/testing/gtest.gyp:gtest_prod',
-        '<(DEPTH)/third_party/modp_b64/modp_b64.gyp:modp_b64',
-        'base_static',
-        'third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-      ],
-      'sources': [
-        'allocator/allocator_check.cc',
-        'allocator/allocator_check.h',
-        'allocator/allocator_extension.cc',
-        'allocator/allocator_extension.h',
-        # No usage found for Cobalt yet.
-        # 'allocator/allocator_shim.cc',
-        # 'allocator/allocator_shim.h',
-        'at_exit.cc',
-        'at_exit.h',
-        'atomic_ref_count.h',
-        'atomic_sequence_num.h',
-        'atomicops.h',
-        'atomicops_internals_atomicword_compat.h',
-        'atomicops_internals_portable.h',
-        'atomicops_internals_x86_msvc.h',
-        'auto_reset.h',
-        'barrier_closure.cc',
-        'barrier_closure.h',
-        'base64.cc',
-        'base64.h',
-        'base64url.cc',
-        'base64url.h',
-        'base_export.h',
-        'base_paths.cc',
-        'base_paths.h',
-        'base_paths_starboard.cc',
-        'base_paths_starboard.h',
-        'base_switches.h',
-        'base_switches.cc',
-        'big_endian.cc',
-        'big_endian.h',
-        'bind.h',
-        'bind_helpers.h',
-        'bind_internal.h',
-        'bit_cast.h',
-        'bits.h',
-        'build_time.cc',
-        'build_time.h',
-        'callback.h',
-        'callback_forward.h',
-        'callback_helpers.cc',
-        'callback_helpers.h',
-        'callback_internal.cc',
-        'callback_internal.h',
-        'callback_list.h',
-        'cancelable_callback.h',
-        'command_line.cc',
-        'command_line.h',
-        'compiler_specific.h',
-        'containers/adapters.h',
-        'containers/circular_deque.h',
-        'containers/flat_map.h',
-        'containers/flat_set.h',
-        'containers/flat_tree.h',
-        'containers/hash_tables.h',
-        'containers/id_map.h',
-        'containers/linked_list.h',
-        'containers/mru_cache.h',
-        'containers/small_map.h',
-        'containers/span.h',
-        'containers/stack.h',
-        'containers/stack_container.h',
-        'containers/vector_buffer.h',
-        # No usage are found for these files yet and they create API leaks.
-        # 'cpu.cc',
-        # 'cpu.h',
-        'critical_closure.h',
-
-        # This file depends on files from the 'debug/allocator' target,
-        # but this target does not depend on 'debug/allocator'.
-        'debug/activity_tracker.cc',
-        'debug/activity_tracker.h',
-        'debug/alias.cc',
-        'debug/alias.h',
-        'debug/asan_invalid_access.cc',
-        'debug/asan_invalid_access.h',
-        'debug/crash_logging.cc',
-        'debug/crash_logging.h',
-        'debug/debugger.cc',
-        'debug/debugger.h',
-        'debug/debugger_starboard.cc',
-        'debug/dump_without_crashing.cc',
-        'debug/dump_without_crashing.h',
-        'debug/leak_annotations.h',
-        'debug/leak_tracker.h',
-        'debug/profiler.cc',
-        'debug/profiler.h',
-        'debug/stack_trace.cc',
-        'debug/stack_trace.h',
-        'debug/stack_trace_starboard.cc',
-        'debug/task_annotator.cc',
-        'debug/task_annotator.h',
-        # No usage found for Cobalt yet.
-        # 'debug/thread_heap_usage_tracker.cc',
-        # 'debug/thread_heap_usage_tracker.h',
-        'deferred_sequenced_task_runner.cc',
-        'deferred_sequenced_task_runner.h',
-        'environment.cc',
-        'environment.h',
-        'event_types.h',
-        'export_template.h',
-        'feature_list.cc',
-        'feature_list.h',
-        'file_version_info.h',
-        'files/dir_reader_fallback.h',
-        'files/dir_reader_starboard.h',
-        'files/file.cc',
-        'files/file.h',
-        'files/file_enumerator.cc',
-        'files/file_enumerator.h',
-        'files/file_enumerator_starboard.cc',
-        'files/file_path.cc',
-        'files/file_path.h',
-        'files/file_path_constants.cc',
-        'files/file_proxy.cc',
-        'files/file_proxy.h',
-        'files/file_starboard.cc',
-        'files/file_tracing.cc',
-        'files/file_tracing.h',
-        'files/file_util.cc',
-        'files/file_util.h',
-        'files/file_util_starboard.cc',
-        'files/important_file_writer.cc',
-        'files/important_file_writer.h',
-        'files/platform_file.h',
-        'files/scoped_file.cc',
-        'files/scoped_file.h',
-        'files/scoped_temp_dir.cc',
-        'files/scoped_temp_dir.h',
-        'format_macros.h',
-        'gtest_prod_util.h',
-        'guid.cc',
-        'guid.h',
-        'hash.cc',
-        'hash.h',
-        'json/json_file_value_serializer.cc',
-        'json/json_file_value_serializer.h',
-        'json/json_parser.cc',
-        'json/json_parser.h',
-        'json/json_reader.cc',
-        'json/json_reader.h',
-        'json/json_string_value_serializer.cc',
-        'json/json_string_value_serializer.h',
-        'json/json_value_converter.cc',
-        'json/json_value_converter.h',
-        'json/json_writer.cc',
-        'json/json_writer.h',
-        'json/string_escape.cc',
-        'json/string_escape.h',
-        'lazy_instance.h',
-        'lazy_instance_helpers.cc',
-        'lazy_instance_helpers.h',
-        'location.cc',
-        'location.h',
-        'logging.cc',
-        'logging.h',
-        'macros.h',
-        'md5.cc',
-        'md5.h',
-        'memory/aligned_memory.cc',
-        'memory/aligned_memory.h',
-        'memory/free_deleter.h',
-        'memory/linked_ptr.h',
-        'memory/memory_coordinator_client.cc',
-        'memory/memory_coordinator_client.h',
-        'memory/memory_coordinator_client_registry.cc',
-        'memory/memory_coordinator_client_registry.h',
-        'memory/memory_coordinator_proxy.cc',
-        'memory/memory_coordinator_proxy.h',
-        'memory/memory_pressure_listener.cc',
-        'memory/memory_pressure_listener.h',
-        'memory/ptr_util.h',
-        'memory/raw_scoped_refptr_mismatch_checker.h',
-        'memory/ref_counted.cc',
-        'memory/ref_counted.h',
-        'memory/ref_counted_delete_on_sequence.h',
-        'memory/ref_counted_memory.cc',
-        'memory/ref_counted_memory.h',
-        'memory/scoped_policy.h',
-        'memory/scoped_refptr.h',
-        'memory/shared_memory.h',
-        'memory/singleton.h',
-        'memory/weak_ptr.cc',
-        'memory/weak_ptr.h',
-        'message_loop/message_loop.cc',
-        'message_loop/message_loop.h',
-        'message_loop/message_loop_current.cc',
-        'message_loop/message_loop_current.h',
-        'message_loop/message_loop_for_io.h',
-        'message_loop/message_loop_for_ui.h',
-        'message_loop/message_loop_task_runner.cc',
-        'message_loop/message_loop_task_runner.h',
-        'message_loop/message_pump.cc',
-        'message_loop/message_pump.h',
-        'message_loop/message_pump_default.cc',
-        'message_loop/message_pump_default.h',
-        'message_loop/message_pump_io_starboard.cc',
-        'message_loop/message_pump_io_starboard.h',
-        'message_loop/message_pump_ui_starboard.cc',
-        'message_loop/message_pump_ui_starboard.h',
-        'message_loop/pending_task_queue.cc',
-        'message_loop/pending_task_queue.h',
-        'message_loop/timer_slack.h',
-        'metrics/bucket_ranges.cc',
-        'metrics/bucket_ranges.h',
-        'metrics/dummy_histogram.cc',
-        'metrics/dummy_histogram.h',
-        # Cobalt does not need field trials which are experimental features in
-        # production.
-        # 'metrics/field_trial.cc',
-        # 'metrics/field_trial.h',
-        # 'metrics/field_trial_params.cc',
-        # 'metrics/field_trial_params.h',
-        'metrics/histogram.cc',
-        'metrics/histogram.h',
-        'metrics/histogram_base.cc',
-        'metrics/histogram_base.h',
-        'metrics/histogram_macros.h',
-        'metrics/histogram_macros_internal.h',
-        'metrics/histogram_macros_local.h',
-        'metrics/histogram_functions.cc',
-        'metrics/histogram_functions.h',
-        'metrics/histogram_samples.cc',
-        'metrics/histogram_samples.h',
-        'metrics/histogram_snapshot_manager.cc',
-        'metrics/histogram_snapshot_manager.h',
-        'metrics/metrics_hashes.cc',
-        'metrics/metrics_hashes.h',
-        'metrics/persistent_histogram_allocator.cc',
-        'metrics/persistent_histogram_allocator.h',
-        'metrics/persistent_histogram_storage.cc',
-        'metrics/persistent_histogram_storage.h',
-        'metrics/persistent_memory_allocator.cc',
-        'metrics/persistent_memory_allocator.h',
-        'metrics/persistent_sample_map.cc',
-        'metrics/persistent_sample_map.h',
-        'metrics/sample_map.cc',
-        'metrics/sample_map.h',
-        'metrics/sample_vector.cc',
-        'metrics/sample_vector.h',
-        'metrics/sparse_histogram.cc',
-        'metrics/sparse_histogram.h',
-        'metrics/statistics_recorder.cc',
-        'metrics/statistics_recorder.h',
-        'observer_list.h',
-        'observer_list_internal.cc',
-        'observer_list_internal.h',
-        'observer_list_threadsafe.cc',
-        'observer_list_threadsafe.h',
-        'observer_list_types.cc',
-        'observer_list_types.h',
-        'optional.h',
-        'path_service.cc',
-        'path_service.h',
-        'pending_task.cc',
-        'pending_task.h',
-        'pickle.cc',
-        'pickle.h',
-        'post_task_and_reply_with_result_internal.h',
-        'power_monitor/power_monitor.cc',
-        'power_monitor/power_monitor.h',
-        'power_monitor/power_monitor_device_source_stub.cc',
-        'power_monitor/power_monitor_device_source.cc',
-        'power_monitor/power_monitor_device_source.h',
-        'power_monitor/power_monitor_source.cc',
-        'power_monitor/power_monitor_source.h',
-        'power_monitor/power_observer.h',
-        'process/memory.cc',
-        'process/memory.h',
-        'process/memory_starboard.cc',
-        'process/process_handle.cc',
-        'process/process_starboard.cc',
-        'profiler/native_stack_sampler.cc',
-        'profiler/native_stack_sampler.h',
-        'profiler/native_stack_sampler_starboard.cc',
-        'profiler/stack_sampling_profiler.cc',
-        'profiler/stack_sampling_profiler.h',
-        'rand_util.cc',
-        'rand_util.h',
-        'rand_util_starboard.cc',
-        'run_loop.cc',
-        'run_loop.h',
-        'sampling_heap_profiler/lock_free_address_hash_set.cc',
-        'sampling_heap_profiler/lock_free_address_hash_set.h',
-        'sampling_heap_profiler/module_cache.cc',
-        'sampling_heap_profiler/module_cache.h',
-        'sampling_heap_profiler/module_cache_starboard.cc',
-        'scoped_clear_errno.h',
-        'scoped_generic.h',
-        'scoped_observer.h',
-        'sequence_checker.h',
-        'sequence_checker_impl.cc',
-        'sequence_checker_impl.h',
-        'sequence_token.cc',
-        'sequence_token.h',
-        'sequenced_task_runner.cc',
-        'sequenced_task_runner.h',
-        'sequenced_task_runner_helpers.h',
-        'sha1.cc',
-        'sha1.h',
-        'single_thread_task_runner.cc',
-        'single_thread_task_runner.h',
-        'stl_util.h',
-        'strings/latin1_string_conversions.cc',
-        'strings/latin1_string_conversions.h',
-        'strings/nullable_string16.cc',
-        'strings/nullable_string16.h',
-        'strings/pattern.cc',
-        'strings/pattern.h',
-        'strings/safe_sprintf.cc',
-        'strings/safe_sprintf.h',
-        'strings/strcat.cc',
-        'strings/strcat.h',
-        'strings/string16.cc',
-        'strings/string16.h',
-        'strings/string_number_conversions.cc',
-        'strings/string_number_conversions.h',
-        'strings/string_piece.cc',
-        'strings/string_piece.h',
-        'strings/string_piece_forward.h',
-        'strings/string_split.cc',
-        'strings/string_split.h',
-        'strings/string_tokenizer.h',
-        'strings/string_util.cc',
-        'strings/string_util.h',
-        'strings/string_util_constants.cc',
-        'strings/string_util_starboard.h',
-        'strings/stringize_macros.h',
-        'strings/stringprintf.cc',
-        'strings/stringprintf.h',
-        'strings/sys_string_conversions.h',
-        'strings/sys_string_conversions_starboard.cc',
-        'strings/utf_offset_string_conversions.cc',
-        'strings/utf_offset_string_conversions.h',
-        'strings/utf_string_conversion_utils.cc',
-        'strings/utf_string_conversion_utils.h',
-        'strings/utf_string_conversions.cc',
-        'strings/utf_string_conversions.h',
-        'supports_user_data.cc',
-        'supports_user_data.h',
-        'synchronization/atomic_flag.cc',
-        'synchronization/atomic_flag.h',
-        'synchronization/cancellation_flag.h',
-        'synchronization/condition_variable.h',
-        'synchronization/condition_variable_starboard.cc',
-        'synchronization/lock.cc',
-        'synchronization/lock.h',
-        'synchronization/lock_impl.h',
-        'synchronization/lock_impl_starboard.cc',
-        'synchronization/spin_wait.h',
-        'synchronization/waitable_event.h',
-        'synchronization/waitable_event_starboard.cc',
-        'sys_byteorder.h',
-        'sys_info.cc',
-        'sys_info.h',
-        'sys_info_internal.h',
-        'sys_info_starboard.cc',
-        'syslog_logging.cc',
-        'syslog_logging.h',
-        'system/system_monitor.cc',
-        'system/system_monitor.h',
-        'task/cancelable_task_tracker.cc',
-        'task/cancelable_task_tracker.h',
-        'task/lazy_task_runner.cc',
-        'task/lazy_task_runner.h',
-        'task/post_task.cc',
-        'task/post_task.h',
-        'task/scoped_set_task_priority_for_current_thread.cc',
-        'task/scoped_set_task_priority_for_current_thread.h',
-        'task/sequence_manager/associated_thread_id.h',
-        'task/sequence_manager/enqueue_order.cc',
-        'task/sequence_manager/enqueue_order.h',
-        'task/sequence_manager/graceful_queue_shutdown_helper.cc',
-        'task/sequence_manager/graceful_queue_shutdown_helper.h',
-        'task/sequence_manager/intrusive_heap.h',
-        'task/sequence_manager/lazily_deallocated_deque.h',
-        'task/sequence_manager/lazy_now.cc',
-        'task/sequence_manager/lazy_now.h',
-        'task/sequence_manager/real_time_domain.cc',
-        'task/sequence_manager/real_time_domain.h',
-        'task/sequence_manager/sequence_manager.cc',
-        'task/sequence_manager/sequence_manager.h',
-        'task/sequence_manager/sequence_manager_impl.cc',
-        'task/sequence_manager/sequence_manager_impl.h',
-        'task/sequence_manager/sequenced_task_source.h',
-        'task/sequence_manager/task_queue.cc',
-        'task/sequence_manager/task_queue.h',
-        'task/sequence_manager/task_queue_impl.cc',
-        'task/sequence_manager/task_queue_impl.h',
-        'task/sequence_manager/task_queue_proxy.cc',
-        'task/sequence_manager/task_queue_proxy.h',
-        'task/sequence_manager/task_queue_selector.cc',
-        'task/sequence_manager/task_queue_selector.h',
-        'task/sequence_manager/task_queue_selector_logic.h',
-        'task/sequence_manager/task_queue_task_runner.cc',
-        'task/sequence_manager/task_queue_task_runner.h',
-        'task/sequence_manager/task_time_observer.h',
-        'task/sequence_manager/tasks.cc',
-        'task/sequence_manager/tasks.h',
-        'task_runner.cc',
-        'task_runner.h',
-        'task_runner_util.h',
-        'task/sequence_manager/thread_controller.h',
-        'task/sequence_manager/thread_controller_impl.cc',
-        'task/sequence_manager/thread_controller_impl.h',
-        'task/sequence_manager/thread_controller_with_message_pump_impl.cc',
-        'task/sequence_manager/thread_controller_with_message_pump_impl.h',
-        'task/sequence_manager/time_domain.cc',
-        'task/sequence_manager/time_domain.h',
-        'task/sequence_manager/work_queue.cc',
-        'task/sequence_manager/work_queue.h',
-        'task/sequence_manager/work_queue_sets.cc',
-        'task/sequence_manager/work_queue_sets.h',
-        'task/single_thread_task_runner_thread_mode.h',
-        'task/task_executor.cc',
-        'task/task_executor.h',
-        'task/task_scheduler/can_schedule_sequence_observer.h',
-        'task/task_scheduler/delayed_task_manager.cc',
-        'task/task_scheduler/delayed_task_manager.h',
-        'task/task_scheduler/environment_config.cc',
-        'task/task_scheduler/environment_config.h',
-        'task/task_scheduler/initialization_util.cc',
-        'task/task_scheduler/initialization_util.h',
-        'task/task_scheduler/platform_native_worker_pool_win.cc',
-        'task/task_scheduler/platform_native_worker_pool_win.h',
-        'task/task_scheduler/priority_queue.cc',
-        'task/task_scheduler/priority_queue.h',
-        'task/task_scheduler/scheduler_lock.h',
-        'task/task_scheduler/scheduler_lock_impl.cc',
-        'task/task_scheduler/scheduler_lock_impl.h',
-        'task/task_scheduler/scheduler_single_thread_task_runner_manager.cc',
-        'task/task_scheduler/scheduler_single_thread_task_runner_manager.h',
-        'task/task_scheduler/scheduler_worker.cc',
-        'task/task_scheduler/scheduler_worker.h',
-        'task/task_scheduler/scheduler_worker_observer.h',
-        'task/task_scheduler/scheduler_worker_params.h',
-        'task/task_scheduler/scheduler_worker_pool.cc',
-        'task/task_scheduler/scheduler_worker_pool.h',
-        'task/task_scheduler/scheduler_worker_pool_impl.cc',
-        'task/task_scheduler/scheduler_worker_pool_impl.h',
-        'task/task_scheduler/scheduler_worker_pool_params.cc',
-        'task/task_scheduler/scheduler_worker_pool_params.h',
-        'task/task_scheduler/scheduler_worker_stack.cc',
-        'task/task_scheduler/scheduler_worker_stack.h',
-        'task/task_scheduler/sequence.cc',
-        'task/task_scheduler/sequence.h',
-        'task/task_scheduler/sequence_sort_key.cc',
-        'task/task_scheduler/sequence_sort_key.h',
-        'task/task_scheduler/service_thread.cc',
-        'task/task_scheduler/service_thread.h',
-        'task/task_scheduler/task.cc',
-        'task/task_scheduler/task.h',
-        'task/task_scheduler/task_scheduler.cc',
-        'task/task_scheduler/task_scheduler.h',
-        'task/task_scheduler/task_scheduler_impl.cc',
-        'task/task_scheduler/task_scheduler_impl.h',
-        'task/task_scheduler/task_tracker.cc',
-        'task/task_scheduler/task_tracker.h',
-        'task/task_scheduler/tracked_ref.h',
-        'task/task_traits.cc',
-        'task/task_traits.h',
-        'task/task_traits_details.h',
-        'task/task_traits_extension.h',
-        'template_util.h',
-        'third_party/dmg_fp/dmg_fp.h',
-        'third_party/dmg_fp/dtoa_wrapper.cc',
-        'third_party/dmg_fp/g_fmt.cc',
-        'third_party/icu/icu_utf.cc',
-        'third_party/icu/icu_utf.h',
-        'third_party/nspr/prtime.cc',
-        'third_party/nspr/prtime.h',
-        'third_party/superfasthash/superfasthash.c',
-        'third_party/valgrind/memcheck.h',
-        'threading/platform_thread.h',
-        'threading/platform_thread_starboard.cc',
-        'threading/post_task_and_reply_impl.cc',
-        'threading/post_task_and_reply_impl.h',
-        'threading/scoped_blocking_call.cc',
-        'threading/scoped_blocking_call.h',
-        'threading/sequence_local_storage_map.cc',
-        'threading/sequence_local_storage_map.h',
-        'threading/sequence_local_storage_slot.cc',
-        'threading/sequence_local_storage_slot.h',
-        'threading/sequenced_task_runner_handle.cc',
-        'threading/sequenced_task_runner_handle.h',
-        'threading/simple_thread.cc',
-        'threading/simple_thread.h',
-        'threading/thread.cc',
-        'threading/thread.h',
-        'threading/thread_checker.h',
-        'threading/thread_checker_impl.cc',
-        'threading/thread_checker_impl.h',
-        'threading/thread_collision_warner.cc',
-        'threading/thread_collision_warner.h',
-        'threading/thread_id_name_manager.cc',
-        'threading/thread_id_name_manager.h',
-        'threading/thread_local.h',
-        'threading/thread_local_storage.cc',
-        'threading/thread_local_storage.h',
-        'threading/thread_local_storage_starboard.cc',
-        'threading/thread_restrictions.cc',
-        'threading/thread_restrictions.h',
-        'threading/thread_task_runner_handle.cc',
-        'threading/thread_task_runner_handle.h',
-        'threading/watchdog.cc',
-        'threading/watchdog.h',
-        'time/clock.cc',
-        'time/clock.h',
-        'time/default_clock.cc',
-        'time/default_clock.h',
-        'time/default_tick_clock.cc',
-        'time/default_tick_clock.h',
-        'time/tick_clock.cc',
-        'time/tick_clock.h',
-        'time/time.cc',
-        'time/time.h',
-        'time/time_now_starboard.cc',
-        'time/time_override.cc',
-        'time/time_override.h',
-        'time/time_to_iso8601.cc',
-        'time/time_to_iso8601.h',
-        'time/time_starboard.cc',
-        'timer/elapsed_timer.cc',
-        'timer/elapsed_timer.h',
-        'timer/hi_res_timer_manager.h',
-        'timer/timer.cc',
-        'timer/timer.h',
-        'trace_event/auto_open_close_event.cc',
-        'trace_event/auto_open_close_event.h',
-        'trace_event/blame_context.cc',
-        'trace_event/blame_context.h',
-        'trace_event/category_registry.cc',
-        'trace_event/category_registry.h',
-        'trace_event/common/trace_event_common.h',
-        'trace_event/event_name_filter.cc',
-        'trace_event/event_name_filter.h',
-        'trace_event/heap_profiler.h',
-        'trace_event/heap_profiler_allocation_context.cc',
-        'trace_event/heap_profiler_allocation_context.h',
-        'trace_event/heap_profiler_allocation_context_tracker.cc',
-        'trace_event/heap_profiler_allocation_context_tracker.h',
-        'trace_event/heap_profiler_event_filter.cc',
-        'trace_event/heap_profiler_event_filter.h',
-        'trace_event/memory_allocator_dump.cc',
-        'trace_event/memory_allocator_dump.h',
-        'trace_event/memory_allocator_dump_guid.cc',
-        'trace_event/memory_allocator_dump_guid.h',
-        'trace_event/memory_dump_provider_info.cc',
-        'trace_event/memory_dump_provider_info.h',
-        'trace_event/memory_infra_background_whitelist.cc',
-        'trace_event/memory_infra_background_whitelist.h',
-        'trace_event/memory_usage_estimator.cc',
-        'trace_event/memory_usage_estimator.h',
-        'trace_event/process_memory_dump.cc',
-        'trace_event/process_memory_dump.h',
-        'trace_event/trace_buffer.cc',
-        'trace_event/trace_buffer.h',
-        'trace_event/trace_category.h',
-        'trace_event/trace_config.cc',
-        'trace_event/trace_config.h',
-        'trace_event/trace_config_category_filter.cc',
-        'trace_event/trace_config_category_filter.h',
-        'trace_event/trace_event.h',
-        'trace_event/trace_event_argument.cc',
-        'trace_event/trace_event_argument.h',
-        'trace_event/trace_event_filter.cc',
-        'trace_event/trace_event_filter.h',
-        'trace_event/trace_event_impl.cc',
-        'trace_event/trace_event_impl.h',
-        'trace_event/trace_event_memory_overhead.cc',
-        'trace_event/trace_event_memory_overhead.h',
-        'trace_event/trace_event_system_stats_monitor.cc',
-        'trace_event/trace_event_system_stats_monitor.h',
-        'trace_event/trace_log.cc',
-        'trace_event/trace_log.h',
-        'trace_event/trace_log_constants.cc',
-        'trace_event/tracing_agent.cc',
-        'trace_event/tracing_agent.h',
-        'tuple.h',
-        'unguessable_token.cc',
-        'unguessable_token.h',
-        'value_conversions.cc',
-        'value_conversions.h',
-        'value_iterators.cc',
-        'value_iterators.h',
-        'values.cc',
-        'values.h',
-        'version.cc',
-        'version.h',
-        'vlog.cc',
-        'vlog.h',
-      ],
-    },
-    {
-      'target_name': 'base_i18n',
-      'type': '<(component)',
-      'dependencies': [
-        'base',
-        'third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-        '<(DEPTH)/third_party/icu/icu.gyp:icui18n',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/starboard/client_porting/icu_init/icu_init.gyp:icu_init',
-      ],
-      'export_dependent_settings': [
-        'base',
-      ],
-      'defines': [
-        'BASE_I18N_IMPLEMENTATION',
-      ],
-      'sources': [
-        'i18n/base_i18n_export.h',
-        'i18n/base_i18n_switches.cc',
-        'i18n/base_i18n_switches.h',
-        'i18n/bidi_line_iterator.cc',
-        'i18n/bidi_line_iterator.h',
-        'i18n/break_iterator.cc',
-        'i18n/break_iterator.h',
-        'i18n/case_conversion.cc',
-        'i18n/case_conversion.h',
-        'i18n/char_iterator.cc',
-        'i18n/char_iterator.h',
-        'i18n/character_encoding.cc',
-        'i18n/character_encoding.h',
-        'i18n/encoding_detection.cc',
-        'i18n/encoding_detection.h',
-        'i18n/file_util_icu.cc',
-        'i18n/file_util_icu.h',
-        'i18n/i18n_constants.cc',
-        'i18n/i18n_constants.h',
-        'i18n/icu_string_conversions.cc',
-        'i18n/icu_string_conversions.h',
-        'i18n/icu_util.cc',
-        'i18n/icu_util.h',
-        'i18n/message_formatter.cc',
-        'i18n/message_formatter.h',
-        'i18n/number_formatting.cc',
-        'i18n/number_formatting.h',
-        'i18n/rtl.cc',
-        'i18n/rtl.h',
-        'i18n/streaming_utf8_validator.cc',
-        'i18n/streaming_utf8_validator.h',
-        'i18n/string_compare.cc',
-        'i18n/string_compare.h',
-        'i18n/string_search.cc',
-        'i18n/string_search.h',
-        'i18n/time_formatting.cc',
-        'i18n/time_formatting.h',
-        'i18n/timezone.cc',
-        'i18n/timezone.h',
-        'i18n/unicodestring.h',
-        'i18n/utf8_validator_tables.cc',
-        'i18n/utf8_validator_tables.h',
-      ],
-    },
-    {
-      # This is the subset of files from base that should not be used with a
-      # dynamic library. Note that this library cannot depend on base because
-      # base depends on base_static.
-      'target_name': 'base_static',
-      'type': 'static_library',
-      'toolsets': ['host', 'target'],
-      'sources': [
-      ],
-    },
-    {
-      'target_name': 'debugging_flags',
-      'type': 'none',
-      'toolsets': ['host', 'target'],
-      'sources': [
-      ],
-    },
-    {
-      'target_name': 'base_unittests',
-      'type': '<(gtest_target_type)',
-      'defines': [
-        'GMOCK_NO_MOVE_MOCK',
-        'BASE_DONT_ENFORCE_THREAD_NAME_LENGTH',
-      ],
-      'sources': [
-        'at_exit_unittest.cc',
-        'atomicops_unittest.cc',
-        'barrier_closure_unittest.cc',
-        'base64_unittest.cc',
-        'base64url_unittest.cc',
-        'big_endian_unittest.cc',
-        'bind_unittest.cc',
-        'bit_cast_unittest.cc',
-        'bits_unittest.cc',
-        'component_export_unittest.cc',
-        'containers/unique_ptr_adapters_unittest.cc',
-        'debug/alias_unittest.cc',
-        'metrics/persistent_histogram_storage_unittest.cc',
-        'no_destructor_unittest.cc',
-        'observer_list_threadsafe_unittest.cc',
-        'sampling_heap_profiler/lock_free_address_hash_set_unittest.cc',
-        'sampling_heap_profiler/module_cache_unittest.cc',
-        'scoped_clear_last_error_unittest.cc',
-        'strings/char_traits_unittest.cc',
-        'strings/strcat_unittest.cc',
-        'system/system_monitor_unittest.cc',
-        # See the comment above histogram_enum_reader.cc for details.
-        # 'test/metrics/histogram_enum_reader_unittest.cc',
-        'test/metrics/histogram_tester_unittest.cc',
-        'test/metrics/user_action_tester_unittest.cc',
-        'thread_annotations_unittest.cc',
-        'threading/sequence_bound_unittest.cc',
-        'trace_event/memory_infra_background_whitelist_unittest.cc',
-        'callback_helpers_unittest.cc',
-        'callback_list_unittest.cc',
-        'callback_unittest.cc',
-        'cancelable_callback_unittest.cc',
-        'command_line_unittest.cc',
-        'containers/adapters_unittest.cc',
-        'containers/circular_deque_unittest.cc',
-        'containers/flat_map_unittest.cc',
-        'containers/flat_set_unittest.cc',
-        'containers/flat_tree_unittest.cc',
-        'containers/hash_tables_unittest.cc',
-        'containers/id_map_unittest.cc',
-        'containers/linked_list_unittest.cc',
-        'containers/mru_cache_unittest.cc',
-        'containers/small_map_unittest.cc',
-        'containers/span_unittest.cc',
-        'containers/stack_container_unittest.cc',
-        'containers/vector_buffer_unittest.cc',
-        # cpu.cc is not compiled due to lack of usage.
-        # 'cpu_unittest.cc',
-        'debug/debugger_unittest.cc',
-        'debug/leak_tracker_unittest.cc',
-        'debug/task_annotator_unittest.cc',
-        'deferred_sequenced_task_runner_unittest.cc',
-        'files/file_enumerator_unittest.cc',
-        'files/file_path_unittest.cc',
-        'files/file_proxy_unittest.cc',
-        'files/file_unittest.cc',
-        'files/file_util_unittest.cc',
-        'files/important_file_writer_unittest.cc',
-        'files/scoped_temp_dir_unittest.cc',
-        'gmock_unittest.cc',
-        'guid_unittest.cc',
-        'hash_unittest.cc',
-        'i18n/bidi_line_iterator_unittest.cc',
-        'i18n/break_iterator_unittest.cc',
-        'i18n/case_conversion_unittest.cc',
-        'i18n/char_iterator_unittest.cc',
-        'i18n/character_encoding_unittest.cc',
-        'i18n/file_util_icu_unittest.cc',
-        'i18n/icu_string_conversions_unittest.cc',
-        'i18n/message_formatter_unittest.cc',
-        'i18n/number_formatting_unittest.cc',
-        'i18n/rtl_unittest.cc',
-        'i18n/streaming_utf8_validator_unittest.cc',
-        'i18n/string_search_unittest.cc',
-        'i18n/time_formatting_unittest.cc',
-        'i18n/timezone_unittest.cc',
-        'json/json_parser_unittest.cc',
-        'json/json_reader_unittest.cc',
-        'json/json_value_converter_unittest.cc',
-        'json/json_value_serializer_unittest.cc',
-        'json/json_writer_unittest.cc',
-        'json/string_escape_unittest.cc',
-        'lazy_instance_unittest.cc',
-        'log_once_unittest.cc',
-        'log_once_unittest_1.h',
-        'log_once_unittest_2.h',
-        'logging_unittest.cc',
-        'md5_unittest.cc',
-        'memory/aligned_memory_unittest.cc',
-        'memory/linked_ptr_unittest.cc',
-        'memory/memory_coordinator_client_registry_unittest.cc',
-        'memory/ptr_util_unittest.cc',
-        'memory/ref_counted_memory_unittest.cc',
-        'memory/ref_counted_unittest.cc',
-        'memory/singleton_unittest.cc',
-        'memory/weak_ptr_unittest.cc',
-        'message_loop/message_loop_io_posix_unittest.cc',
-        'message_loop/message_loop_task_runner_unittest.cc',
-        'message_loop/message_loop_unittest.cc',
-        'metrics/bucket_ranges_unittest.cc',
-        'metrics/histogram_base_unittest.cc',
-        'metrics/histogram_functions_unittest.cc',
-        'metrics/histogram_samples_unittest.cc',
-        'metrics/histogram_unittest.cc',
-        'metrics/metrics_hashes_unittest.cc',
-        'metrics/persistent_histogram_allocator_unittest.cc',
-        'metrics/persistent_memory_allocator_unittest.cc',
-        'metrics/persistent_sample_map_unittest.cc',
-        'metrics/sample_map_unittest.cc',
-        'metrics/sample_vector_unittest.cc',
-        'metrics/sparse_histogram_unittest.cc',
-        'metrics/statistics_recorder_unittest.cc',
-        'observer_list_unittest.cc',
-        'optional_unittest.cc',
-        'path_service_unittest.cc',
-        'pickle_unittest.cc',
-        'power_monitor/power_monitor_unittest.cc',
-        'rand_util_unittest.cc',
-        'run_loop_unittest.cc',
-        'safe_numerics_unittest.cc',
-        'scoped_generic_unittest.cc',
-        'scoped_native_library_unittest.cc',
-        'security_unittest.cc',
-        'sequence_checker_unittest.cc',
-        'sequence_token_unittest.cc',
-        'sequenced_task_runner_unittest.cc',
-        'sha1_unittest.cc',
-        'stl_util_unittest.cc',
-        'strings/nullable_string16_unittest.cc',
-        'strings/pattern_unittest.cc',
-        'strings/safe_sprintf_unittest.cc',
-        'strings/string16_unittest.cc',
-        'strings/string_number_conversions_unittest.cc',
-        'strings/string_piece_unittest.cc',
-        'strings/string_split_unittest.cc',
-        'strings/string_tokenizer_unittest.cc',
-        'strings/string_util_unittest.cc',
-        'strings/stringize_macros_unittest.cc',
-        'strings/stringprintf_unittest.cc',
-        'strings/sys_string_conversions_unittest.cc',
-        'strings/utf_offset_string_conversions_unittest.cc',
-        'strings/utf_string_conversions_unittest.cc',
-        'supports_user_data_unittest.cc',
-        'synchronization/atomic_flag_unittest.cc',
-        'synchronization/condition_variable_unittest.cc',
-        'synchronization/lock_unittest.cc',
-        'synchronization/waitable_event_unittest.cc',
-        'sys_byteorder_unittest.cc',
-        'sys_info_unittest.cc',
-        'task/cancelable_task_tracker_unittest.cc',
-        'task/lazy_task_runner_unittest.cc',
-        'task/post_task_unittest.cc',
-        'task/scoped_set_task_priority_for_current_thread_unittest.cc',
-        'task/sequence_manager/intrusive_heap_unittest.cc',
-        'task/sequence_manager/lazily_deallocated_deque_unittest.cc',
-        'task/sequence_manager/sequence_manager_impl_unittest.cc',
-        'task/sequence_manager/task_queue_selector_unittest.cc',
-        'task/sequence_manager/time_domain_unittest.cc',
-        'task/sequence_manager/work_queue_sets_unittest.cc',
-        'task/sequence_manager/work_queue_unittest.cc',
-        'task/task_scheduler/delayed_task_manager_unittest.cc',
-        'task/task_scheduler/priority_queue_unittest.cc',
-        'task/task_scheduler/scheduler_lock_unittest.cc',
-        'task/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc',
-        'task/task_scheduler/scheduler_worker_pool_impl_unittest.cc',
-        'task/task_scheduler/scheduler_worker_pool_unittest.cc',
-        'task/task_scheduler/scheduler_worker_stack_unittest.cc',
-        'task/task_scheduler/scheduler_worker_unittest.cc',
-        'task/task_scheduler/sequence_sort_key_unittest.cc',
-        'task/task_scheduler/sequence_unittest.cc',
-        'task/task_scheduler/service_thread_unittest.cc',
-        'task/task_scheduler/task_scheduler_impl_unittest.cc',
-        'task/task_scheduler/task_tracker_unittest.cc',
-        'task/task_scheduler/tracked_ref_unittest.cc',
-        'task/task_traits_extension_unittest.cc',
-        'task/task_traits_unittest.cc',
-        'template_util_unittest.cc',
-        'test/mock_callback_unittest.cc',
-        'test/scoped_mock_clock_override_unittest.cc',
-        'test/scoped_mock_time_message_loop_task_runner_unittest.cc',
-        'test/scoped_task_environment_unittest.cc',
-        'test/test_mock_time_task_runner_unittest.cc',
-        'test/test_pending_task_unittest.cc',
-        'test/test_reg_util_win_unittest.cc',
-        'test/trace_event_analyzer_unittest.cc',
-        'threading/platform_thread_unittest.cc',
-        'threading/post_task_and_reply_impl_unittest.cc',
-        'threading/scoped_blocking_call_unittest.cc',
-        'threading/sequence_local_storage_map_unittest.cc',
-        'threading/sequence_local_storage_slot_unittest.cc',
-        'threading/sequenced_task_runner_handle_unittest.cc',
-        'threading/simple_thread_unittest.cc',
-        'threading/thread_checker_unittest.cc',
-        'threading/thread_collision_warner_unittest.cc',
-        'threading/thread_id_name_manager_unittest.cc',
-        'threading/thread_local_storage_unittest.cc',
-        'threading/thread_local_unittest.cc',
-        'threading/thread_restrictions_unittest.cc',
-        'threading/thread_task_runner_handle_unittest.cc',
-        'threading/thread_unittest.cc',
-        'threading/watchdog_unittest.cc',
-        'time/pr_time_unittest.cc',
-        'time/time_unittest.cc',
-        'timer/hi_res_timer_manager_unittest.cc',
-        'timer/mock_timer_unittest.cc',
-        'timer/timer_unittest.cc',
-        'tools_sanity_unittest.cc',
-        'trace_event/event_name_filter_unittest.cc',
-        'trace_event/memory_usage_estimator_unittest.cc',
-        'trace_event/trace_category_unittest.cc',
-        'trace_event/trace_event_argument_unittest.cc',
-        'trace_event/trace_event_filter_test_utils.cc',
-        'trace_event/trace_event_filter_test_utils.h',
-        'trace_event/trace_event_system_stats_monitor_unittest.cc',
-        'trace_event/blame_context_unittest.cc',
-        'trace_event/trace_event_unittest.cc',
-        'tuple_unittest.cc',
-        'unguessable_token_unittest.cc',
-        'value_iterators_unittest.cc',
-        'values_unittest.cc',
-        'version_unittest.cc',
-        'vlog_unittest.cc',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/third_party/icu/icu.gyp:icui18n',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'base',
-        'base_i18n',
-        'base_static',
-        'test_support_base',
-        'third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-      ],
-      'conditions': [
-          ['cobalt_copy_test_data == 1', {
-            'variables': {
-              'content_test_input_files': [
-                '<(DEPTH)/base/test/data',
-              ],
-              'content_test_output_subdir': 'base/test',
-            },
-            'includes': [ '../starboard/build/copy_test_data.gypi' ],
-          }],
-      ],
-      'msvs_disabled_warnings': [
-        # forcing value to bool 'true' or 'false' (performance warning)
-        4800,
-        # Destructor is explicitly deleted.
-        4624,
-      ],
-      'includes': ['<(DEPTH)/base/test/test.gypi'],
-    },
-    {
-      'target_name': 'test_support_base',
-      'type': 'static_library',
-      'dependencies': [
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/third_party/icu/icu.gyp:icui18n',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        '<(DEPTH)/third_party/libxml/libxml.gyp:libxml',
-        'base',
-        'base_static',
-        'base_i18n',
-      ],
-      'export_dependent_settings': [
-        'base',
-      ],
-      'sources': [
-        'task/sequence_manager/test/fake_task.cc',
-        'task/sequence_manager/test/fake_task.h',
-        'task/sequence_manager/test/lazy_thread_controller_for_test.cc',
-        'task/sequence_manager/test/lazy_thread_controller_for_test.h',
-        'task/sequence_manager/test/mock_time_domain.cc',
-        'task/sequence_manager/test/mock_time_domain.h',
-        'task/sequence_manager/test/sequence_manager_for_test.cc',
-        'task/sequence_manager/test/sequence_manager_for_test.h',
-        'task/sequence_manager/test/test_task_queue.cc',
-        'task/sequence_manager/test/test_task_queue.h',
-        'task/sequence_manager/test/test_task_time_observer.h',
-        'metrics/user_metrics.cc',
-        'metrics/user_metrics.h',
-        'task/task_scheduler/test_task_factory.cc',
-        'task/task_scheduler/test_task_factory.h',
-        'task/task_scheduler/test_utils.cc',
-        'task/task_scheduler/test_utils.h',
-        'test/bind_test_util.h',
-        "test/fuzzed_data_provider.cc",
-        "test/fuzzed_data_provider.h",
-        'test/gtest_util.h',
-        'test/icu_test_util.cc',
-        'test/icu_test_util.h',
-        # The enum reader requires libxml reader and writer which hasn't been
-        # enabled in Cobalt, if the enum reader turns out useful in the future,
-        # update/fix the libxml reader/writer.
-        # 'test/metrics/histogram_enum_reader.cc',
-        # 'test/metrics/histogram_enum_reader.h',
-        'test/malloc_wrapper.h',
-        'test/metrics/histogram_tester.cc',
-        'test/metrics/histogram_tester.h',
-        'test/metrics/user_action_tester.cc',
-        'test/metrics/user_action_tester.h',
-        'test/mock_devices_changed_observer.cc',
-        'test/mock_devices_changed_observer.h',
-        'test/mock_log.cc',
-        'test/mock_log.h',
-        'test/null_task_runner.cc',
-        'test/null_task_runner.h',
-        'test/power_monitor_test_base.cc',
-        'test/power_monitor_test_base.h',
-        'test/scoped_feature_list.cc',
-        'test/scoped_feature_list.h',
-        'test/scoped_mock_clock_override.cc',
-        'test/scoped_mock_clock_override.h',
-        'test/scoped_mock_time_message_loop_task_runner.cc',
-        'test/scoped_mock_time_message_loop_task_runner.h',
-        'test/scoped_task_environment.cc',
-        'test/scoped_task_environment.h',
-        'test/sequenced_task_runner_test_template.cc',
-        'test/sequenced_task_runner_test_template.h',
-        'test/simple_test_clock.cc',
-        'test/simple_test_clock.h',
-        'test/simple_test_tick_clock.cc',
-        'test/simple_test_tick_clock.h',
-        'test/task_runner_test_template.cc',
-        'test/task_runner_test_template.h',
-        'test/test_io_thread.cc',
-        'test/test_io_thread.h',
-        'test/test_mock_time_task_runner.cc',
-        'test/test_mock_time_task_runner.h',
-        'test/test_pending_task.cc',
-        'test/test_pending_task.h',
-        'test/test_simple_task_runner.cc',
-        'test/test_simple_task_runner.h',
-        'test/test_suite.cc',
-        'test/test_suite.h',
-        'test/test_switches.cc',
-        'test/test_switches.h',
-        'test/test_timeouts.cc',
-        'test/test_timeouts.h',
-        'test/time_helpers.cc',
-        'test/time_helpers.h',
-        'test/trace_event_analyzer.cc',
-        'test/trace_event_analyzer.h',
-        'test/trace_to_file.cc',
-        'test/trace_to_file.h',
-        'test/values_test_util.cc',
-        'test/values_test_util.h',
-        'timer/mock_timer.cc',
-        'timer/mock_timer.h',
-      ],
-    },
-    {
-      'target_name': 'base_unittests_deploy',
-      'type': 'none',
-      'dependencies': [
-        'base_unittests',
-      ],
-      'variables': {
-        'executable_name': 'base_unittests',
-      },
-      'includes': [ '../starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/base/base_paths_starboard.cc b/base/base_paths_starboard.cc
index 2cd0d46..c13f645 100644
--- a/base/base_paths_starboard.cc
+++ b/base/base_paths_starboard.cc
@@ -58,7 +58,7 @@
                                      path.size());
       DCHECK(success);
       if (success) {
-        // Append "test" to match the output of copy_test_data.gypi
+        // Append "test" to match the output of the files copied during builds.
         *result = FilePath(path.data()).Append(FILE_PATH_LITERAL("test"));
         return true;
       }
diff --git a/base/bits.h b/base/bits.h
index ac46aa2..400253c 100644
--- a/base/bits.h
+++ b/base/bits.h
@@ -41,6 +41,12 @@
   return (size + alignment - 1) & ~(alignment - 1);
 }
 
+// Round up |size| to a multiple of alignment, which must be a power of two.
+inline constexpr size_t AlignUp(size_t size, size_t alignment) {
+  DCHECK(IsPowerOfTwo(alignment));
+  return (size + alignment - 1) & ~(alignment - 1);
+}
+
 // CountLeadingZeroBits(value) returns the number of zero bits following the
 // most significant 1 bit in |value| if |value| is non-zero, otherwise it
 // returns {sizeof(T) * 8}.
diff --git a/base/bits_unittest.cc b/base/bits_unittest.cc
index c94cbc5..4ea08ad 100644
--- a/base/bits_unittest.cc
+++ b/base/bits_unittest.cc
@@ -61,6 +61,18 @@
   EXPECT_EQ(kSizeTMax / 2 + 1, Align(1, kSizeTMax / 2 + 1));
 }
 
+TEST(BitsTest, AlignUp) {
+  static constexpr size_t kSizeTMax = std::numeric_limits<size_t>::max();
+  EXPECT_EQ(0ul, AlignUp(0, 4));
+  EXPECT_EQ(4ul, AlignUp(1, 4));
+  EXPECT_EQ(4096ul, AlignUp(1, 4096));
+  EXPECT_EQ(4096ul, AlignUp(4096, 4096));
+  EXPECT_EQ(4096ul, AlignUp(4095, 4096));
+  EXPECT_EQ(8192ul, AlignUp(4097, 4096));
+  EXPECT_EQ(kSizeTMax - 31, AlignUp(kSizeTMax - 62, 32));
+  EXPECT_EQ(kSizeTMax / 2 + 1, AlignUp(1, kSizeTMax / 2 + 1));
+}
+
 TEST(BitsTest, CountLeadingZeroBits8) {
   EXPECT_EQ(8u, CountLeadingZeroBits(uint8_t{0}));
   EXPECT_EQ(7u, CountLeadingZeroBits(uint8_t{1}));
diff --git a/base/containers/flat_tree.h b/base/containers/flat_tree.h
index 8c7e5f0..228b7d1 100644
--- a/base/containers/flat_tree.h
+++ b/base/containers/flat_tree.h
@@ -278,6 +278,9 @@
   const_iterator find(const K& key) const;
 
   template <typename K>
+  bool contains(const K& key) const;
+
+  template <typename K>
   std::pair<iterator, iterator> equal_range(const K& key);
 
   template <typename K>
@@ -876,6 +879,13 @@
 
 template <class Key, class Value, class GetKeyFromValue, class KeyCompare>
 template <typename K>
+bool flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::contains(const K& key) const {
+  auto lower = lower_bound(key);
+  return lower != end() && !key_comp()(key, GetKeyFromValue()(*lower));
+}
+
+template <class Key, class Value, class GetKeyFromValue, class KeyCompare>
+template <typename K>
 auto flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::equal_range(
     const K& key) -> std::pair<iterator, iterator> {
   auto res = as_const().equal_range(key);
diff --git a/base/containers/flat_tree_unittest.cc b/base/containers/flat_tree_unittest.cc
index 2e3441c..5e3d956 100644
--- a/base/containers/flat_tree_unittest.cc
+++ b/base/containers/flat_tree_unittest.cc
@@ -1165,6 +1165,22 @@
   }
 }
 
+// bool contains(const key_type& key) const
+
+TEST(FlatTree, Contains) {
+  const IntTree cont({5, 6, 7, 8, 9, 10, 11, 12});
+
+  EXPECT_TRUE(cont.contains(5));
+  EXPECT_TRUE(cont.contains(6));
+  EXPECT_TRUE(cont.contains(7));
+  EXPECT_TRUE(cont.contains(8));
+  EXPECT_TRUE(cont.contains(9));
+  EXPECT_TRUE(cont.contains(10));
+  EXPECT_TRUE(cont.contains(11));
+  EXPECT_TRUE(cont.contains(12));
+  EXPECT_FALSE(cont.contains(4));
+}
+
 // pair<iterator, iterator> equal_range(const key_type& key)
 // pair<const_iterator, const_iterator> equal_range(const key_type& key) const
 
diff --git a/base/files/file_enumerator_starboard.cc b/base/files/file_enumerator_starboard.cc
index 386b2dd..978e940 100644
--- a/base/files/file_enumerator_starboard.cc
+++ b/base/files/file_enumerator_starboard.cc
@@ -114,7 +114,6 @@
   // set.
   bool found_dot_dot = false;
 
-#if SB_API_VERSION >= 12
   std::vector<char> entry(kSbFileMaxName);
 
   while (SbDirectoryGetNext(dir, entry.data(), entry.size())) {
@@ -124,17 +123,6 @@
     }
     ret.push_back(GenerateEntry(entry.data()));
   }
-#else   // SB_API_VERSION >= 12
-  SbDirectoryEntry entry;
-
-  while (SbDirectoryGetNext(dir, &entry)) {
-    const char dot_dot_str[] = "..";
-    if (!strncmp(entry.name, dot_dot_str, sizeof(dot_dot_str))) {
-      found_dot_dot = true;
-    }
-    ret.push_back(GenerateEntry(entry.name));
-  }
-#endif  // SB_API_VERSION >= 12
 
   if ((INCLUDE_DOT_DOT & file_type_) && !found_dot_dot) {
     ret.push_back(GenerateEntry(".."));
diff --git a/base/files/important_file_writer.cc b/base/files/important_file_writer.cc
index 360b675..4cb45e4 100644
--- a/base/files/important_file_writer.cc
+++ b/base/files/important_file_writer.cc
@@ -136,13 +136,7 @@
 bool ImportantFileWriter::WriteFileAtomically(const FilePath& path,
                                               StringPiece data,
                                               StringPiece histogram_suffix) {
-#if SB_API_VERSION >= 12
   return SbFileAtomicReplace(path.value().c_str(), data.data(), data.size());
-#else
-  SB_NOTREACHED()
-      << "SbFileAtomicReplace is not available before starboard version 12";
-  return false;
-#endif
 }
 #else
 // static
diff --git a/base/files/important_file_writer_unittest.cc b/base/files/important_file_writer_unittest.cc
index bd5007f..d444eed 100644
--- a/base/files/important_file_writer_unittest.cc
+++ b/base/files/important_file_writer_unittest.cc
@@ -23,7 +23,6 @@
 #include "base/timer/mock_timer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12
 namespace base {
 
 namespace {
@@ -357,4 +356,3 @@
 
 }  // namespace base
 
-#endif  // SB_API_VERSION >= 12
diff --git a/base/location.h b/base/location.h
index cb3ef5b..0b30f9d 100644
--- a/base/location.h
+++ b/base/location.h
@@ -72,6 +72,22 @@
                                  const char* file_name,
                                  int line_number);
 
+// The macros defined here will expand to the Current function.
+#if BUILDFLAG(ENABLE_LOCATION_SOURCE)
+
+  static Location Current(const char* file_name = __FILE__,
+                        int line_number = __LINE__) {
+    return Location("", file_name, line_number, nullptr);
+  }
+
+#else  // BUILDFLAG(ENABLE_LOCATION_SOURCE)
+
+  static Location Current() {
+    return Location(nullptr, nullptr);
+  }
+
+#endif  // BUILDFLAG(ENABLE_LOCATION_SOURCE)
+
  private:
   const char* function_name_ = nullptr;
   const char* file_name_ = nullptr;
diff --git a/base/logging.cc b/base/logging.cc
index ee5704a..a9d61c6 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -1029,7 +1029,7 @@
     stream_ << CurrentProcessId() << ':';
 #endif
   if (g_log_thread_id)
-    stream_ << base::PlatformThread::CurrentId() << ':';
+    stream_ << base::PlatformThread::GetName() << '/' << base::PlatformThread::CurrentId() << ":";
   if (g_log_timestamp) {
 #if defined(STARBOARD)
     EzTimeValue time_value;
diff --git a/base/numerics/safe_conversions.h b/base/numerics/safe_conversions.h
index df4ab04..c07cf74 100644
--- a/base/numerics/safe_conversions.h
+++ b/base/numerics/safe_conversions.h
@@ -5,6 +5,7 @@
 #ifndef BASE_NUMERICS_SAFE_CONVERSIONS_H_
 #define BASE_NUMERICS_SAFE_CONVERSIONS_H_
 
+#include <cmath>
 #include <limits>
 #include <ostream>
 #include <type_traits>
@@ -338,6 +339,33 @@
 // Explicitly make a shorter size_t alias for convenience.
 using SizeT = StrictNumeric<size_t>;
 
+// floating -> integral conversions that saturate and thus can actually return
+// an integral type.  In most cases, these should be preferred over the std::
+// versions.
+template <typename Dst = int,
+          typename Src,
+          typename = std::enable_if_t<std::is_integral<Dst>::value &&
+                                      std::is_floating_point<Src>::value>>
+Dst ClampFloor(Src value) {
+  return saturated_cast<Dst>(std::floor(value));
+}
+template <typename Dst = int,
+          typename Src,
+          typename = std::enable_if_t<std::is_integral<Dst>::value &&
+                                      std::is_floating_point<Src>::value>>
+Dst ClampCeil(Src value) {
+  return saturated_cast<Dst>(std::ceil(value));
+}
+template <typename Dst = int,
+          typename Src,
+          typename = std::enable_if_t<std::is_integral<Dst>::value &&
+                                      std::is_floating_point<Src>::value>>
+Dst ClampRound(Src value) {
+  const Src rounded =
+      (value >= 0.0f) ? std::floor(value + 0.5f) : std::ceil(value - 0.5f);
+  return saturated_cast<Dst>(rounded);
+}
+
 }  // namespace base
 
 #endif  // BASE_NUMERICS_SAFE_CONVERSIONS_H_
diff --git a/base/strings/utf_string_conversions.cc b/base/strings/utf_string_conversions.cc
index a83d106..b14410c 100644
--- a/base/strings/utf_string_conversions.cc
+++ b/base/strings/utf_string_conversions.cc
@@ -200,7 +200,10 @@
   bool res = DoUTFConversion(src_str.data(), src_len32, dest, &dest_len32);
 
   dest_str->resize(dest_len32);
-  dest_str->shrink_to_fit();
+  // dest_str->shrink_to_fit();
+  // Workaround for missing symbols linking issue for Xcode 13.2.1
+  // Mac builds.
+  dest_str->reserve(0);
 
   return res;
 }
diff --git a/base/synchronization/condition_variable.h b/base/synchronization/condition_variable.h
index 1f882d3..19701a1 100644
--- a/base/synchronization/condition_variable.h
+++ b/base/synchronization/condition_variable.h
@@ -80,7 +80,7 @@
 #include "starboard/types.h"
 #endif
 
-#if defined(STARBOARD) && SB_API_VERSION >= 12
+#if defined(STARBOARD)
 #include "starboard/condition_variable.h"
 #endif
 
diff --git a/base/test/test.gypi b/base/test/test.gypi
deleted file mode 100644
index c99d14d..0000000
--- a/base/test/test.gypi
+++ /dev/null
@@ -1,16 +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 this file for a main() function that simply instantiates and runs a
-# base::TestSuite.
-{
-  'dependencies': [
-    '<(DEPTH)/base/base.gyp:test_support_base',
-    '<(DEPTH)/testing/gmock.gyp:gmock',
-    '<(DEPTH)/testing/gtest.gyp:gtest',
-  ],
-  'sources': [
-    '<(DEPTH)/base/test/run_all_unittests.cc',
-  ],
-}
diff --git a/base/third_party/dynamic_annotations/dynamic_annotations.gyp b/base/third_party/dynamic_annotations/dynamic_annotations.gyp
deleted file mode 100644
index 20a7a71..0000000
--- a/base/third_party/dynamic_annotations/dynamic_annotations.gyp
+++ /dev/null
@@ -1,21 +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.
-
-{
-  'targets': [
-    {
-      'target_name': 'dynamic_annotations',
-      'type': 'static_library',
-      'toolsets': ['host', 'target'],
-      'include_dirs': [
-        '../../../',
-      ],
-      'sources': [
-        'dynamic_annotations.c',
-        'dynamic_annotations.h',
-        '../valgrind/valgrind.h',
-      ],
-    },
-  ],
-}
diff --git a/base/time/time.cc b/base/time/time.cc
index ff018e3..5b180b1 100644
--- a/base/time/time.cc
+++ b/base/time/time.cc
@@ -30,11 +30,8 @@
 TimeTicksNowFunction g_time_ticks_now_function =
     &subtle::TimeTicksNowIgnoringOverride;
 
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
 ThreadTicksNowFunction g_thread_ticks_now_function =
     &subtle::ThreadTicksNowIgnoringOverride;
-#endif
-
 }  // namespace internal
 
 // TimeDelta ------------------------------------------------------------------
@@ -323,12 +320,8 @@
 
 // static
 ThreadTicks ThreadTicks::Now() {
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
-#if SB_API_VERSION >= 12
   if (SbTimeIsTimeThreadNowSupported())
-#endif
     return internal::g_thread_ticks_now_function();
-#endif
   return ThreadTicks();
 }
 
diff --git a/base/time/time.h b/base/time/time.h
index 7cc797e..58305d8 100644
--- a/base/time/time.h
+++ b/base/time/time.h
@@ -59,6 +59,7 @@
 #include "base/base_export.h"
 #include "base/compiler_specific.h"
 #include "base/logging.h"
+#include "base/numerics/clamped_math.h"
 #include "base/numerics/safe_math.h"
 #include "build/build_config.h"
 
@@ -726,6 +727,47 @@
                                    const Exploded& rhs) WARN_UNUSED_RESULT;
 };
 
+template <typename T>
+constexpr TimeDelta Days(T n) {
+  return TimeDelta::FromInternalValue(MakeClampedNum(n) *
+                                      Time::kMicrosecondsPerDay);
+}
+template <typename T>
+constexpr TimeDelta Hours(T n) {
+  return TimeDelta::FromInternalValue(MakeClampedNum(n) *
+                                      Time::kMicrosecondsPerHour);
+}
+template <typename T>
+constexpr TimeDelta Minutes(T n) {
+  return TimeDelta::FromInternalValue(MakeClampedNum(n) *
+                                      Time::kMicrosecondsPerMinute);
+}
+template <typename T>
+constexpr TimeDelta Seconds(T n) {
+  return TimeDelta::FromInternalValue(MakeClampedNum(n) *
+                                      Time::kMicrosecondsPerSecond);
+}
+template <typename T>
+constexpr TimeDelta Milliseconds(T n) {
+  return TimeDelta::FromInternalValue(MakeClampedNum(n) *
+                                      Time::kMicrosecondsPerMillisecond);
+}
+template <typename T>
+constexpr TimeDelta Microseconds(T n) {
+  return TimeDelta::FromInternalValue(MakeClampedNum(n));
+}
+template <typename T>
+constexpr TimeDelta Nanoseconds(T n) {
+  return TimeDelta::FromInternalValue(MakeClampedNum(n) /
+                                      Time::kNanosecondsPerMicrosecond);
+}
+template <typename T>
+constexpr TimeDelta Hertz(T n) {
+  return n ? TimeDelta::FromInternalValue(Time::kMicrosecondsPerSecond /
+                                          MakeClampedNum(n))
+           : TimeDelta::Max();
+}
+
 // static
 constexpr TimeDelta TimeDelta::FromDays(int days) {
   return days == std::numeric_limits<int>::max()
@@ -996,13 +1038,7 @@
   // Returns true if ThreadTicks::Now() is supported on this system.
   static bool IsSupported() WARN_UNUSED_RESULT {
 #if defined(STARBOARD)
-#if SB_API_VERSION >= 12
     return SbTimeIsTimeThreadNowSupported();
-#elif SB_HAS(TIME_THREAD_NOW)
-    return true;
-#else
-    return false;
-#endif
 #else
 #if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
     (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_ANDROID) ||  \
diff --git a/base/time/time_now_starboard.cc b/base/time/time_now_starboard.cc
index bdb35ac..8892846 100644
--- a/base/time/time_now_starboard.cc
+++ b/base/time/time_now_starboard.cc
@@ -62,13 +62,9 @@
 
 namespace subtle {
 ThreadTicks ThreadTicksNowIgnoringOverride() {
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
-#if SB_API_VERSION >= 12
   if (SbTimeIsTimeThreadNowSupported())
-#endif
     return ThreadTicks() +
            TimeDelta::FromMicroseconds(SbTimeGetMonotonicThreadNow());
-#endif
   return ThreadTicks();
 }
 }  // namespace subtle
diff --git a/base/time/time_override.cc b/base/time/time_override.cc
index 97c074a..09692b5 100644
--- a/base/time/time_override.cc
+++ b/base/time/time_override.cc
@@ -26,10 +26,8 @@
   }
   if (time_ticks_override)
     internal::g_time_ticks_now_function = time_ticks_override;
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
   if (thread_ticks_override)
     internal::g_thread_ticks_now_function = thread_ticks_override;
-#endif
 }
 
 ScopedTimeClockOverrides::~ScopedTimeClockOverrides() {
@@ -37,9 +35,7 @@
   internal::g_time_now_from_system_time_function =
       &TimeNowFromSystemTimeIgnoringOverride;
   internal::g_time_ticks_now_function = &TimeTicksNowIgnoringOverride;
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
   internal::g_thread_ticks_now_function = &ThreadTicksNowIgnoringOverride;
-#endif
 #if DCHECK_IS_ON()
   overrides_active_ = false;
 #endif
diff --git a/base/time/time_unittest.cc b/base/time/time_unittest.cc
index eb0dcd1..f36e5e8 100644
--- a/base/time/time_unittest.cc
+++ b/base/time/time_unittest.cc
@@ -999,7 +999,6 @@
 // static
 ThreadTicks ThreadTicksOverride::now_ticks_;
 
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
 // IOS doesn't support ThreadTicks::Now().
 #if defined(OS_IOS)
 #define MAYBE_NowOverride DISABLED_NowOverride
@@ -1007,12 +1006,10 @@
 #define MAYBE_NowOverride NowOverride
 #endif
 TEST(ThreadTicks, MAYBE_NowOverride) {
-#if SB_API_VERSION >= 12
   if (!SbTimeIsTimeThreadNowSupported()) {
     SB_LOG(INFO) << "Time thread now not supported. Test skipped.";
     return;
   }
-#endif  // SB_API_VERSION >= 12
 
   ThreadTicksOverride::now_ticks_ = ThreadTicks::Min();
 
@@ -1049,8 +1046,6 @@
   EXPECT_LE(initial_thread_ticks, subtle::ThreadTicksNowIgnoringOverride());
   EXPECT_GT(ThreadTicks::Max(), subtle::ThreadTicksNowIgnoringOverride());
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(TIME_THREAD_NOW)
 
 TEST(ThreadTicks, ThreadNow) {
   if (ThreadTicks::IsSupported()) {
diff --git a/base/util/values/values_util.gyp b/base/util/values/values_util.gyp
deleted file mode 100644
index 0c537c0..0000000
--- a/base/util/values/values_util.gyp
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the 'License');
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an 'AS IS' BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'values_util',
-      'type': 'static_library',
-      'sources': [
-        'values_util.cc',
-        'values_util.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-    },
-  ]
-}
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 22b5a42..6260b81 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1585,7 +1585,7 @@
         cflags += [ "-Wno-nonportable-include-path" ]
       }
 
-      if (current_toolchain == host_toolchain || !use_xcode_clang) {
+      if ((current_toolchain == host_toolchain || !use_xcode_clang) && !using_old_compiler) {
         # Flags NaCl (Clang 3.7) and Xcode 9.2 (Clang clang-900.0.39.2) do not
         # recognize.
         cflags += [
@@ -1642,7 +1642,12 @@
 
 config("chromium_code") {
   if (is_win) {
-    cflags = [ "/W4" ]  # Warning level 4.
+    if (is_starboard) {
+      # The platform should set warning flags.
+      cflags = []
+    } else {
+      cflags = [ "/W4" ]  # Warning level 4.
+    }
 
     if (is_clang) {
       # Opt in to additional [[nodiscard]] on standard library methods.
@@ -1748,6 +1753,10 @@
       "/wd4267",  # TODO(jschuh): size_t to int.
       "/wd4996",  # Deprecated function warning.
     ]
+    if (is_starboard) {
+      # The platform should set warning flags.
+      cflags -= [ "/W3" ]
+    }
     defines += [
       "_CRT_NONSTDC_NO_WARNINGS",
       "_CRT_NONSTDC_NO_DEPRECATE",
@@ -1888,8 +1897,11 @@
       defines = [ "_HAS_EXCEPTIONS=0" ]
     }
   } else {
-    cflags_cc = [ "-fno-exceptions" ]
-    cflags_objcc = cflags_cc
+    # This hack ensures raspi does not compile anything with -fno-exceptions.
+    if (!defined(enable_exceptions_override) || !enable_exceptions_override) {
+      cflags_cc = [ "-fno-exceptions" ]
+      cflags_objcc = cflags_cc
+    }
   }
 }
 
diff --git a/build/config/win/visual_studio_version.gni b/build/config/win/visual_studio_version.gni
index b46c531..47f16c4 100644
--- a/build/config/win/visual_studio_version.gni
+++ b/build/config/win/visual_studio_version.gni
@@ -12,8 +12,12 @@
     # installation location.
     windows_sdk_path = "C:/Program Files (x86)/Windows Kits/10"
 
-    # Version of Windows SDK.
-    wdk_version = "10.0.17763.0"
+    # Version of Windows SDK. XB1 requires >=10.0.22000.0.
+    if (current_os == "winuwp") {
+      wdk_version = "10.0.22000.0"
+    } else {
+      wdk_version = "10.0.17763.0"
+    }
   }
 
   if (is_docker_build) {
diff --git a/build/toolchain/cc_wrapper.gni b/build/toolchain/cc_wrapper.gni
index 070461f..f2d368d 100644
--- a/build/toolchain/cc_wrapper.gni
+++ b/build/toolchain/cc_wrapper.gni
@@ -35,15 +35,36 @@
 declare_args() {
   # Set to "ccache", "icecc" or "distcc".  Probably doesn't work on windows.
   cc_wrapper = ""
+
+  if (is_starboard) {
+    enable_sccache = getenv("SCCACHE") == "1"
+  }
+}
+
+if (is_starboard && getenv("SCCACHE") == "") {
+  enable_sccache = host_os == "win" && cobalt_fastbuild
+}
+
+if (is_starboard && enable_sccache) {
+  _set_sccache_gcs_bucket = getenv("SCCACHE_GCS_BUCKET") != ""
+  _set_sccache_gcs_key_path = getenv("SCCACHE_GCS_KEY_PATH") != ""
+  _set_sccache_gcs_oauth_url = getenv("SCCACHE_GCS_OAUTH_URL") != ""
+  _set_sccache_gcs_rw_mode = getenv("SCCACHE_GCS_RW_MODE") != ""
+  _set_sccache_dir = getenv("SCCACHE_DIR") != ""
+  assert((_set_sccache_dir) || (_set_sccache_gcs_bucket &&
+             (_set_sccache_gcs_key_path || _set_sccache_gcs_oauth_url) &&
+             _set_sccache_gcs_rw_mode),
+         "Set Sccache environment variables before use.")
 }
 
 if (is_starboard && cc_wrapper == "") {
   # TODO(https://crbug.com/gn/273): Use sccache locally as well.
-  if (host_os == "win" && cobalt_fastbuild) {
-    cc_wrapper = "sccache.exe"
+  if (enable_sccache) {
+    cc_wrapper = "sccache"
   } else if (host_os != "win") {
     cc_wrapper = "ccache"
   }
+  print("Build Accelerator: " + cc_wrapper)
 }
 
 assert(!use_goma || cc_wrapper == "",
diff --git a/build/toolchain/concurrent_links.gni b/build/toolchain/concurrent_links.gni
index f1a42c9..e074dfd 100644
--- a/build/toolchain/concurrent_links.gni
+++ b/build/toolchain/concurrent_links.gni
@@ -20,10 +20,10 @@
   # links at once than we do compiles, because linking is memory-intensive.
   # The default to use varies by platform and by the amount of memory
   # available, so we call out to a script to get the right value.
-  concurrent_links = -1
+  concurrent_links = getenv("COBALT_CONCURRENT_LINKS")
 }
 
-if (concurrent_links == -1) {
+if (concurrent_links == "") {
   if (use_thin_lto) {
     _args = [ "--reserve_mem_gb=10" ]
     if (use_goma_thin_lto) {
@@ -101,6 +101,10 @@
   }
 } else {
   assert(!use_thin_lto, "can't explicitly set concurrent_links with thinlto")
+
+  # Convert the value to a number if it's a string.
+  concurrent_links =
+      exec_script("//starboard/build/echo.py", [ concurrent_links ], "value")
   concurrent_links_logs =
       [ "concurrent_links set by GN arg (value=$concurrent_links)" ]
 }
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index b432d20..f325e56 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -384,9 +384,9 @@
       depfile = "{{output}}.d"
 
       # TODO(b/206642994): see if we can remove this condition. It's needed for
-      # now to add cflags for evergreen-arm* platforms but we haven't yet
-      # decided whether cflags should be added here for all platforms.
-      if (is_starboard && sb_is_evergreen && target_cpu == "arm") {
+      # now to add cflags for evergreen platforms but we haven't yet decided
+      # whether cflags should be added here for all platforms.
+      if (is_starboard && sb_is_evergreen) {
         command = "$asm -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{asmflags}}${extra_asmflags} -c {{source}} -o {{output}}"
       } else {
         command = "$asm -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}}${extra_asmflags} -c {{source}} -o {{output}}"
@@ -453,9 +453,9 @@
       tocfile = sofile + ".TOC"
 
       # TODO(b/206642994): see if we can remove this condition. It's needed for
-      # now because we use the ld.lld linker for evergreen-arm* and need to pass
-      # options as `option` instead of `-Wl,option`.
-      if (is_starboard && sb_is_evergreen && target_cpu == "arm") {
+      # now because we use the ld.lld linker for evergreen platforms and need to
+      # pass options as `option` instead of `-Wl,option`.
+      if (is_starboard && sb_is_evergreen) {
         link_command = "$ld -shared -soname=\"$soname\" {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" @\"$rspfile\""
       } else {
         link_command = "$ld -shared -Wl,-soname=\"$soname\" {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" @\"$rspfile\""
@@ -487,9 +487,9 @@
       if (target_cpu == "mipsel" && is_component_build && is_android) {
         rspfile_content = "-Wl,--start-group -Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive {{libs}} -Wl,--end-group$tail_lib_dependencies"
         # TODO(b/206642994): see if we can remove this condition. It's needed for
-        # now because we use the ld.lld linker for evergreen-arm* and need to
-        # pass options as `option` instead of `-Wl,option`.
-      } else if (is_starboard && sb_is_evergreen && target_cpu == "arm") {
+        # now because we use the ld.lld linker for evergreen platforms and need
+        # to pass options as `option` instead of `-Wl,option`.
+      } else if (is_starboard && sb_is_evergreen) {
         rspfile_content = "--whole-archive {{inputs}} {{solibs}} --no-whole-archive {{libs}}$tail_lib_dependencies"
       } else {
         rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive {{libs}}$tail_lib_dependencies"
@@ -612,7 +612,12 @@
         start_group_flag = "-Wl,--start-group"
         end_group_flag = "-Wl,--end-group "
       }
-      link_command = "$ld {{ldflags}}${extra_ldflags} {{libs}} -o \"$unstripped_outfile\" $start_group_flag @\"$rspfile\" {{solibs}} $end_group_flag$tail_lib_dependencies"
+
+      if (using_old_compiler) {
+        link_command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\" $start_group_flag @\"$rspfile\" {{solibs}} $end_group_flag {{libs}} $tail_lib_dependencies"
+      } else {
+        link_command = "$ld {{ldflags}}${extra_ldflags} {{libs}} -o \"$unstripped_outfile\" $start_group_flag @\"$rspfile\" {{solibs}} $end_group_flag$tail_lib_dependencies"
+      }
 
       # Generate a map file to be used for binary size analysis.
       # Map file adds ~10% to the link time on a z620.
diff --git a/build/toolchain/win/msvc_toolchain.gni b/build/toolchain/win/msvc_toolchain.gni
index 2755047..52225b0 100644
--- a/build/toolchain/win/msvc_toolchain.gni
+++ b/build/toolchain/win/msvc_toolchain.gni
@@ -126,7 +126,7 @@
 
     tool("alink") {
       rspfile = "{{output}}.rsp"
-      command = "$env_wrapper$lib /OUT:{{output}} /nologo ${sys_lib_flags}{{arflags}} @$rspfile"
+      command = "$env_wrapper$lib /ignore:4221 /OUT:{{output}} /nologo ${sys_lib_flags}{{arflags}} @$rspfile"
       description = "LIB {{output}}"
       outputs = [
         # Ignore {{output_extension}} and always use .lib, there's no reason to
diff --git a/build_gyp/apk_test.gypi b/build_gyp/apk_test.gypi
deleted file mode 100644
index d6027d0..0000000
--- a/build_gyp/apk_test.gypi
+++ /dev/null
@@ -1,81 +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 is meant to be included into a target to provide a rule
-# to build APK based test suites.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'test_suite_name_apk',
-#   'type': 'none',
-#   'variables': {
-#     'test_suite_name': 'test_suite_name',  # string
-#     'input_shlib_path' : '/path/to/test_suite.so',  # string
-#     'input_jars_paths': ['/path/to/test_suite.jar', ... ],  # list
-#   },
-#   'includes': ['path/to/this/gypi/file'],
-# }
-#
-
-{
-  'variables' : {
-    'conditions' : [
-      ['OS == "lb_shell" and target_arch == "android"', {
-        'chromium_src_dir' : '<(PRODUCT_DIR)/../../../../external/chromium',
-      },{
-        'chromium_src_dir' : '<(ant_build_out)/../..',
-      }],
-    ],
-  },
-  'dependencies': [
-    '<(DEPTH)/base/base.gyp:base_java',
-  ],
-  'target_conditions': [
-    ['_toolset == "target"', {
-      'conditions': [
-        ['((OS == "android" and gtest_target_type == "shared_library") or (OS == "lb_shell" and target_arch == "android"))', {
-          'actions': [{
-            'action_name': 'apk_<(test_suite_name)',
-            'message': 'Building <(test_suite_name) test apk.',
-            'inputs': [
-              '<(DEPTH)/testing/android/AndroidManifest.xml',
-              '<(DEPTH)/testing/android/generate_native_test.py',
-              '<(input_shlib_path)',
-              '>@(input_jars_paths)',
-            ],
-            'outputs': [
-              '<(PRODUCT_DIR)/<(test_suite_name)_apk/<(test_suite_name)-debug.apk',
-            ],
-            'action': [
-              '<(DEPTH)/testing/android/generate_native_test.py',
-              '--native_library',
-              '<(input_shlib_path)',
-              '--output',
-              '<(PRODUCT_DIR)/<(test_suite_name)_apk',
-              '--strip-binary=<(android_strip)',
-              '--app_abi',
-              '<(android_app_abi)',
-              '--ant-args',
-              '-DPRODUCT_DIR=<(ant_build_out)',
-              '--ant-args',
-              '-DANDROID_SDK=<(android_sdk)',
-              '--ant-args',
-              '-DANDROID_SDK_ROOT=<(android_sdk_root)',
-              '--ant-args',
-              '-DANDROID_SDK_TOOLS=<(android_sdk_tools)',
-              '--ant-args',
-              '-DANDROID_SDK_VERSION=<(android_sdk_version)',
-              '--ant-args',
-              '-DANDROID_GDBSERVER=<(android_gdbserver)',
-              '--ant-args',
-              '-DCHROMIUM_SRC=<(chromium_src_dir)',
-              '--ant-args',
-              '-DINPUT_JARS_PATHS=>(input_jars_paths)',
-            ],
-          }],
-        }],  # 'OS == "android" and gtest_target_type == "shared_library"
-      ],  # conditions
-    }],
-  ],  # target_conditions
-}
diff --git a/build_gyp/common.gypi b/build_gyp/common.gypi
deleted file mode 100644
index a037283..0000000
--- a/build_gyp/common.gypi
+++ /dev/null
@@ -1,356 +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.
-
-#####################################################################
-# If you modify this file, PLEASE REMEMBER TO UPDATE
-# //cobalt/build/config/base.gni or //starboard/build/config/base.gni
-# AS WELL
-#####################################################################
-
-# IMPORTANT:
-# Please don't directly include this file if you are building via gyp_cobalt,
-# since gyp_cobalt is automatically forcing its inclusion.
-{
-  # Variables expected to be overridden in the platform's
-  # gyp_configuration.gypi.
-  'variables': {
-    # Putting a variables dict inside another variables dict looks kind of
-    # weird.  This is done so that 'host_arch', 'android_build_type', etc are
-    # defined as variables within the outer variables dict here.  This is
-    # necessary to get these variables defined for the conditions within this
-    # variables dict that operate on these variables.
-    'variables': {
-      'variables': {
-        'variables': {
-          'host_arch%':
-            'x64', # Building on any other arch is not supported
-        },
-
-        # Copy conditionally-set variables out one scope.
-        'host_arch%': '<(host_arch)',
-
-        # Default architecture we're building for is the architecture we're
-        # building on.
-        'target_arch%': '<(host_arch)',
-
-        # Sets whether we're building with the Android SDK/NDK (and hence with
-        # Ant, value 0), or as part of the Android system (and hence with the
-        # Android build system, value 1).
-        'android_build_type%': 0,
-      },
-
-      # Copy conditionally-set variables out one scope.
-      'host_arch%': '<(host_arch)',
-      'target_arch%': '<(target_arch)',
-      'android_build_type%': '<(android_build_type)',
-
-      # Set ARM-v7 compilation flags
-      'armv7%': 0,
-
-      # Set Neon compilation flags (only meaningful if armv7==1).
-      'arm_neon%': 1,
-
-      # The system root for cross-compiles. Default: none.
-      'sysroot%': '',
-
-      # Use system libjpeg. Note that the system's libjepg will be used even if
-      # use_libjpeg_turbo is set.
-      'use_system_libjpeg%': 0,
-
-      # Variable 'component' is for cases where we would like to build some
-      # components as dynamic shared libraries but still need variable
-      # 'library' for static libraries.
-      # By default, component is set to whatever library is set to and
-      # it can be overridden by the GYP command line or by ~/.gyp/include.gypi.
-      'component%': 'static_library',
-
-      # Enable building with ASAN (Clang's -fsanitize=address option).
-      # -fsanitize=address only works with clang, but asan=1 implies clang=1
-      # See https://sites.google.com/a/chromium.org/dev/developers/testing/addresssanitizer
-      'asan%': 0,
-
-      # Enable building with TSAN (Clang's -fsanitize=thread option).
-      # -fsanitize=thread only works with clang, but tsan=1 implies clang=1
-      # See http://clang.llvm.org/docs/ThreadSanitizer.html
-      'tsan%': 0,
-
-      # Set this to true when building with Clang.
-      # See http://code.google.com/p/chromium/wiki/Clang for details.
-      'clang%': 0,
-
-      'os_posix%': 0,
-      'os_bsd%': 0,
-    },
-
-    # Make sure that cobalt is defined. This is needed in
-    # the case where the code is built using Chromium stock
-    # build tools.
-    'cobalt%': 0,
-
-    # Copy conditionally-set variables out one scope.
-    'target_arch%': '<(target_arch)',
-    'host_arch%': '<(host_arch)',
-    'library%': 'static_library',
-    'os_bsd%': '<(os_bsd)',
-    'os_posix%': '<(os_posix)',
-    'armv7%': '<(armv7)',
-    'arm_neon%': '<(arm_neon)',
-    'sysroot%': '<(sysroot)',
-    'component%': '<(component)',
-    'asan%': '<(asan)',
-    'tsan%': '<(tsan)',
-    'use_system_libjpeg%': '<(use_system_libjpeg)',
-    'android_build_type%': '<(android_build_type)',
-
-    # Use system protobuf instead of bundled one.
-    'use_system_protobuf%': 0,
-
-    # TODO(sgk): eliminate this if possible.
-    # It would be nicer to support this via a setting in 'target_defaults'
-    # in chrome/app/locales/locales.gypi overriding the setting in the
-    # 'Debug' configuration in the 'target_defaults' dict below,
-    # but that doesn't work as we'd like.
-    'msvs_debug_link_incremental%': '2',
-
-    # Clang stuff.
-    'clang%': '<(clang)',
-    'make_clang_dir%': 'third_party/llvm-build/Release+Asserts',
-
-    # These two variables can be set in GYP_DEFINES while running
-    # |gclient runhooks| to let clang run a plugin in every compilation.
-    # Only has an effect if 'clang=1' is in GYP_DEFINES as well.
-    # Example:
-    #     GYP_DEFINES='clang=1 clang_load=/abs/path/to/libPrintFunctionNames.dylib clang_add_plugin=print-fns' gclient runhooks
-
-    'clang_load%': '',
-    'clang_add_plugin%': '',
-
-    # Set Thumb compilation flags.
-    'arm_thumb%': 0,
-
-    # Set ARM fpu compilation flags (only meaningful if armv7==1 and
-    # arm_neon==0).
-    'arm_fpu%': 'vfpv3',
-
-    # Set ARM float abi compilation flag.
-    'arm_float_abi%': 'softfp',
-
-    # .gyp files or targets should set chromium_code to 1 if they build
-    # Chromium-specific code, as opposed to external code.  This variable is
-    # used to control such things as the set of warnings to enable, and
-    # whether warnings are treated as errors.
-    'chromium_code%': 0,
-
-    # Crashpad relies on excluding files in GYP based on platform specific
-    # names, so it has its own set of filename_rules.gypi located under
-    # "third_party/mini_chromium/build/".
-    'crashpad_code%': 0,
-
-    # TODO(thakis): Make this a blacklist instead, http://crbug.com/101600
-    'enable_wexit_time_destructors%': 0,
-
-    # Native Client is enabled by default.
-    'disable_nacl%': 0,
-
-    # Sets the default version name and code for Android app, by default we
-    # do a developer build.
-    'android_app_version_name%': 'Developer Build',
-    'android_app_version_code%': 0,
-
-    'windows_sdk_path%': 'C:/Program Files (x86)/Windows Kits/10',
-
-    'conditions': [
-      ['target_arch=="android"', {
-        # Location of Android NDK.
-        'variables': {
-          'variables': {
-            'variables': {
-              'android_ndk_root%': '<!pymod_do_main(starboard.build.gyp_functions getenv ANDROID_NDK_ROOT)',
-            },
-            'android_ndk_root%': '<(android_ndk_root)',
-            'conditions': [
-              ['target_arch == "x86"', {
-                'android_app_abi%': 'x86',
-                'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-9/arch-x86',
-              }],
-              ['target_arch=="arm" or (OS=="lb_shell" and target_arch=="android")', {
-                'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-9/arch-arm',
-                'conditions': [
-                  ['armv7==0', {
-                    'android_app_abi%': 'armeabi',
-                  }, {
-                    'android_app_abi%': 'armeabi-v7a',
-                  }],
-                ],
-              }],
-            ],
-          },
-          'android_ndk_root%': '<(android_ndk_root)',
-          'android_app_abi%': '<(android_app_abi)',
-          'android_ndk_sysroot%': '<(android_ndk_sysroot)',
-        },
-        'android_ndk_root%': '<(android_ndk_root)',
-        'android_ndk_sysroot': '<(android_ndk_sysroot)',
-        'android_ndk_include': '<(android_ndk_sysroot)/usr/include',
-        'android_ndk_lib': '<(android_ndk_sysroot)/usr/lib',
-        'android_app_abi%': '<(android_app_abi)',
-
-        # Location of the "strip" binary, used by both gyp and scripts.
-        'android_strip%' : '<!(/bin/echo -n <(android_toolchain)/*-strip)',
-
-        # Provides an absolute path to PRODUCT_DIR (e.g. out/Release). Used
-        # to specify the output directory for Ant in the Android build.
-        'ant_build_out': '`cd <(PRODUCT_DIR) && pwd -P`',
-
-        # Disable Native Client.
-        'disable_nacl%': 1,
-
-        # When building as part of the Android system, use system libraries
-        # where possible to reduce ROM size.
-        'use_system_icu%': '<(android_build_type)',
-        'use_system_stlport%': '<(android_build_type)',
-
-        # Copy it out one scope.
-        'android_build_type%': '<(android_build_type)',
-      }],  # target_arch=="android"
-
-      ['asan==1 and OS!="win"', {
-        'clang%': 1,
-      }],
-      ['tsan==1', {
-        'clang%': 1,
-      }],
-    ],
-  },
-  'target_defaults': {
-    'variables': {
-      # The condition that operates on chromium_code is in a target_conditions
-      # section, and will not have access to the default fallback value of
-      # chromium_code at the top of this file, or to the chromium_code
-      # variable placed at the root variables scope of .gyp files, because
-      # those variables are not set at target scope.  As a workaround,
-      # if chromium_code is not set at target scope, define it in target scope
-      # to contain whatever value it has during early variable expansion.
-      # That's enough to make it available during target conditional
-      # processing.
-      'chromium_code%': '<(chromium_code)',
-
-      # The crashpad_code variable operates the same way as described above for
-      # the chromium_code variable.
-      'crashpad_code%': '<(crashpad_code)',
-
-      # See http://msdn.microsoft.com/en-us/library/aa652360(VS.71).aspx
-      'win_release_Optimization%': '2', # 2 = /Os
-      'win_debug_Optimization%': '0',   # 0 = /Od
-
-      # See http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspx
-      # Tri-state: blank is default, 1 on, 0 off
-      'win_release_OmitFramePointers%': '0',
-      # Tri-state: blank is default, 1 on, 0 off
-      'win_debug_OmitFramePointers%': '',
-
-      # See http://msdn.microsoft.com/en-us/library/8wtf2dfz(VS.71).aspx
-      'win_debug_RuntimeChecks%': '3',    # 3 = all checks enabled, 0 = off
-
-      # See http://msdn.microsoft.com/en-us/library/47238hez(VS.71).aspx
-      'win_debug_InlineFunctionExpansion%': '',    # empty = default, 0 = off,
-      'win_release_InlineFunctionExpansion%': '2', # 1 = only __inline, 2 = max
-
-      # VS inserts quite a lot of extra checks to algorithms like
-      # std::partial_sort in Debug build which make them O(N^2)
-      # instead of O(N*logN). This is particularly slow under memory
-      # tools like ThreadSanitizer so we want it to be disablable.
-      # See http://msdn.microsoft.com/en-us/library/aa985982(v=VS.80).aspx
-      'win_debug_disable_iterator_debugging%': '0',
-
-      'release_extra_cflags%': '',
-      'debug_extra_cflags%': '',
-
-      # the non-qualified versions are widely assumed to be *nix-only
-      'win_release_extra_cflags%': '',
-      'win_debug_extra_cflags%': '',
-
-      # TODO(thakis): Make this a blacklist instead, http://crbug.com/101600
-      'enable_wexit_time_destructors%': '<(enable_wexit_time_destructors)',
-
-      # Only used by Windows build for now.  Can be used to build into a
-      # differet output directory, e.g., a build_dir_prefix of VS2010_ would
-      # output files in src/build/VS2010_{Debug,Release}.
-      'build_dir_prefix%': '',
-
-      # Targets are by default not nacl untrusted code.
-      'nacl_untrusted_build%': 0,
-
-      'pnacl_compile_flags': [
-        # pnacl uses the clang compiler so we need to suppress all the
-        # same warnings as we do for clang.
-        # TODO(sbc): Remove these if/when they are removed from the clang
-        # build.
-        '-Wno-unused-function',
-        '-Wno-char-subscripts',
-        '-Wno-unnamed-type-template-args',
-      ],
-
-      # See http://msdn.microsoft.com/en-us/library/aa652367.aspx
-      'win_release_RuntimeLibrary%': '0', # 0 = /MT (nondebug static)
-      'win_debug_RuntimeLibrary%': '1',   # 1 = /MTd (debug static)
-
-      # See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Optimize-Options.html
-      'mac_release_optimization%': '3', # Use -O3 unless overridden
-      'mac_debug_optimization%': '0',   # Use -O0 unless overridden
-    },
-    'defines': [
-      'USE_OPENSSL=1',
-    ],
-    'conditions': [
-      ['component=="shared_library"', {
-        'defines': ['COMPONENT_BUILD'],
-      }],
-    ],  # conditions for 'target_defaults'
-    'target_conditions': [
-      ['enable_wexit_time_destructors==1', {
-        'conditions': [
-          [ 'clang==1', {
-            'cflags': [
-              '-Wexit-time-destructors',
-            ],
-            'xcode_settings': {
-              'WARNING_CFLAGS': [
-                '-Wexit-time-destructors',
-              ],
-            },
-          }],
-        ],
-      }],
-      ['chromium_code!=0', {
-        'includes': [
-           # Rules for excluding e.g. foo_win.cc from the build on non-Windows.
-          'filename_rules.gypi',
-        ],
-      }],
-      ['crashpad_code!=0', {
-        'includes': [
-           # Rules for excluding e.g. foo_win.cc from the build on non-Windows.
-          '<(DEPTH)/third_party/mini_chromium/build/filename_rules.gypi',
-        ],
-      }],
-      ['chromium_code!=0 or crashpad_code!=0', {
-        # In Chromium code, we define __STDC_foo_MACROS in order to get the
-        # C99 macros on Mac and Linux.
-        'defines': [
-          '__STDC_CONSTANT_MACROS',
-          '__STDC_FORMAT_MACROS',
-        ],
-        'conditions': [
-          ['(OS == "win" or target_arch=="xb1") and component=="shared_library"', {
-            'msvs_disabled_warnings': [
-              4251,  # class 'std::xx' needs to have dll-interface.
-              4715,  # Not all control paths return a value.
-            ],
-          }],
-        ],
-      }],
-    ],  # target_conditions for 'target_defaults'
-  },
-}
diff --git a/build_gyp/filename_rules.gypi b/build_gyp/filename_rules.gypi
deleted file mode 100644
index 13b4735..0000000
--- a/build_gyp/filename_rules.gypi
+++ /dev/null
@@ -1,97 +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 gypi file defines the patterns used for determining whether a
-# file is excluded from the build on a given platform.  It is
-# included by common.gypi for chromium_code.
-
-{
-  'target_conditions': [
-    ['OS!="win" or >(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_win(_unittest)?\\.(h|cc)$'],
-                    ['exclude', '(^|/)win/'],
-                    ['exclude', '(^|/)win_[^/]*\\.(h|cc)$'] ],
-    }],
-    ['OS!="mac" or >(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_(cocoa|mac)(_unittest)?\\.(h|cc|mm?)$'],
-                    ['exclude', '(^|/)(cocoa|mac)/'] ],
-    }],
-    ['OS!="ios" or >(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_ios(_unittest)?\\.(h|cc|mm?)$'],
-                    ['exclude', '(^|/)ios/'] ],
-    }],
-    ['(OS!="mac" and OS!="ios") or >(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '\\.mm?$' ] ],
-    }],
-    # Do not exclude the linux files on *BSD since most of them can be
-    # shared at this point.
-    # In case a file is not needed, it is going to be excluded later on.
-    # TODO(evan): the above is not correct; we shouldn't build _linux
-    # files on non-linux.
-    ['OS!="linux" and OS!="openbsd" and OS!="freebsd" or >(nacl_untrusted_build)==1', {
-      'sources/': [
-        ['exclude', '_linux(_unittest)?\\.(h|cc)$'],
-        ['exclude', '(^|/)linux/'],
-      ],
-    }],
-    ['OS!="android" and (OS!="lb_shell" or "<(target_arch)"!="android")', {
-      'sources/': [
-        ['exclude', '_android(_unittest)?\\.cc$'],
-        ['exclude', '(^|/)android/'],
-      ],
-    }],
-    ['(OS=="win" and >(nacl_untrusted_build)==0) or OS=="lb_shell" or OS=="starboard"', {
-      'sources/': [
-        ['exclude', '_posix(_unittest)?\\.(h|cc)$'],
-        ['exclude', '(^|/)posix/'],
-      ],
-    }],
-    ['>(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_chromeos(_unittest)?\\.(h|cc)$'] ]
-    }],
-    ['>(nacl_untrusted_build)==0', {
-      'sources/': [
-        ['exclude', '_nacl(_unittest)?\\.(h|cc)$'],
-      ],
-    }],
-    ['OS!="linux" and OS!="openbsd" and OS!="freebsd" or >(nacl_untrusted_build)==1', {
-      'sources/': [
-        ['exclude', '_xdg(_unittest)?\\.(h|cc)$'],
-      ],
-    }],
-    ['>(nacl_untrusted_build)==1', {
-      'sources/': [
-        ['exclude', '_(x|x11)(_unittest)?\\.(h|cc)$'],
-        ['exclude', '(^|/)x11_[^/]*\\.(h|cc)$'],
-      ],
-    }],
-    ['>(nacl_untrusted_build)==1', {
-      'sources/': [
-        ['exclude', '_gtk(_browsertest|_unittest)?\\.(h|cc)$'],
-        ['exclude', '(^|/)gtk/'],
-        ['exclude', '(^|/)gtk_[^/]*\\.(h|cc)$'],
-      ],
-    }],
-    ['>(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_views\\.(h|cc)$'] ]
-    }],
-    ['>(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_aura(_unittest)?\\.(h|cc)$'],
-                    ['exclude', '_aura(_browsertest)?\\.(h|cc)$'],
-                    ['exclude', '(^|/)aura/'],
-      ]
-    }],
-    ['>(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_aurax11\\.(h|cc)$'] ]
-    }],
-    ['OS!="win" or >(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_aurawin\\.(h|cc)$'] ]
-    }],
-    ['>(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_ash(_browsertest|_unittest)?\\.(h|cc)$'],
-                    ['exclude', '(^|/)ash/'],
-      ]
-    }],
-  ]
-}
diff --git a/build_gyp/protoc.gypi b/build_gyp/protoc.gypi
deleted file mode 100644
index 622c853..0000000
--- a/build_gyp/protoc.gypi
+++ /dev/null
@@ -1,144 +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.
-
-# Modifications Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is meant to be included into a target to provide a rule
-# to invoke protoc in a consistent manner. For Java-targets, see
-# protoc_java.gypi.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'my_proto_lib',
-#   'type': 'static_library',
-#   'sources': [
-#     'foo.proto',
-#     'bar.proto',
-#   ],
-#   'variables': {
-#     # Optional, see below: 'proto_in_dir': '.'
-#     'proto_out_dir': 'dir/for/my_proto_lib'
-#   },
-#   'includes': ['path/to/this/gypi/file'],
-# }
-# If necessary, you may add normal .cc files to the sources list or other gyp
-# dependencies.  The proto headers are guaranteed to be generated before any
-# source files, even within this target, are compiled.
-#
-# The 'proto_in_dir' variable must be the relative path to the
-# directory containing the .proto files.  If left out, it defaults to '.'.
-#
-# The 'proto_out_dir' variable specifies the path suffix that output
-# files are generated under.  Targets that gyp-depend on my_proto_lib
-# will be able to include the resulting proto headers with an include
-# like:
-#   #include "dir/for/my_proto_lib/foo.pb.h"
-#
-# If you need to add an EXPORT macro to a protobuf's c++ header, set the
-# 'cc_generator_options' variable with the value: 'dllexport_decl=FOO_EXPORT:'
-# e.g. 'dllexport_decl=BASE_EXPORT:'
-#
-# It is likely you also need to #include a file for the above EXPORT macro to
-# work. You can do so with the 'cc_include' variable.
-# e.g. 'base/base_export.h'
-#
-# Implementation notes:
-# A proto_out_dir of foo/bar produces
-#   <(SHARED_INTERMEDIATE_DIR)/protoc_out/foo/bar/{file1,file2}.pb.{cc,h}
-#   <(SHARED_INTERMEDIATE_DIR)/pyproto/foo/bar/{file1,file2}_pb2.py
-
-{
-  'variables': {
-    'protoc_wrapper': '<(DEPTH)/tools/protoc_wrapper/protoc_wrapper.py',
-    'cc_dir': '<(SHARED_INTERMEDIATE_DIR)/protoc_out/<(proto_out_dir)',
-    'py_dir': '<(PRODUCT_DIR)/pyproto/<(proto_out_dir)',
-    'cc_generator_options%': '',
-    'cc_include%': '',
-    'proto_in_dir%': '.',
-    'conditions': [
-      ['host_os=="win"', {
-        'protoc_dir': '<(DEPTH)/tools',
-        'protoc_bin': '<(DEPTH)/tools/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
-        'protoc': '<(DEPTH)/tools/protoc.exe',
-      }, {
-        'conditions': [
-          ['use_system_protobuf==0', {
-            'protoc': '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
-          }, { # use_system_protobuf==1
-            'protoc': '<!pymod_do_main(starboard.build.gyp_functions find_program protoc)',
-          }],
-        ],
-      }],
-    ],
-  },
-  'rules': [
-    {
-      'rule_name': 'genproto',
-      'extension': 'proto',
-      'inputs': [
-        '<(protoc_wrapper)',
-        '<(protoc)',
-      ],
-      'outputs': [
-        '<(py_dir)/<(RULE_INPUT_ROOT)_pb2.py',
-        '<(cc_dir)/<(RULE_INPUT_ROOT).pb.cc',
-        '<(cc_dir)/<(RULE_INPUT_ROOT).pb.h',
-      ],
-      'action': [
-        'python2',
-        '<(protoc_wrapper)',
-        '--include',
-        '<(cc_include)',
-        '--protobuf',
-        '<(cc_dir)/<(RULE_INPUT_ROOT).pb.h',
-        # Using the --arg val form (instead of --arg=val) allows gyp's msvs rule
-        # generation to correct 'val' which is a path.
-        '--proto-in-dir','<(proto_in_dir)',
-        # Naively you'd use <(RULE_INPUT_PATH) here, but protoc requires
-        # --proto_path is a strict prefix of the path given as an argument.
-        '--proto-in-file','<(RULE_INPUT_ROOT)<(RULE_INPUT_EXT)',
-        '--use-system-protobuf=<(use_system_protobuf)',
-        '--',
-        '<(protoc)',
-        '--cpp_out', '<(cc_generator_options)<(cc_dir)',
-        '--python_out', '<(py_dir)',
-      ],
-      'message': 'Generating C++ and Python code from <(RULE_INPUT_PATH)',
-      'process_outputs_as_sources': 1,
-    },
-  ],
-  'dependencies': [
-    '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-  ],
-  'include_dirs': [
-    '<(SHARED_INTERMEDIATE_DIR)/protoc_out',
-    '<(DEPTH)',
-  ],
-  'all_dependent_settings': {
-    'include_dirs': [
-      '<(SHARED_INTERMEDIATE_DIR)/protoc_out',
-      '<(DEPTH)',
-    ]
-  },
-  'export_dependent_settings': [
-    # The generated headers reference headers within protobuf_lite,
-    # so dependencies must be able to find those headers too.
-    '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-  ],
-  # This target exports a hard dependency because it generates header
-  # files.
-  'hard_dependency': 1,
-}
diff --git a/build_gyp/win_precompile.gypi b/build_gyp/win_precompile.gypi
deleted file mode 100644
index b992a0f..0000000
--- a/build_gyp/win_precompile.gypi
+++ /dev/null
@@ -1,21 +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 this file to make targets in your .gyp use the default
-# precompiled header on Windows, in debug builds only as the official
-# builders blow up (out of memory) if precompiled headers are used for
-# release builds.
-
-{
-  'conditions': [
-    ['(OS=="win" or (OS=="lb_shell" and target_arch=="xb360")) and \
-      chromium_win_pch==1', {
-        'target_defaults': {
-          'msvs_precompiled_header': '<(DEPTH)/build/precompile.h',
-          'msvs_precompiled_source': '<(DEPTH)/build/precompile.cc',
-          'sources': ['<(DEPTH)/build/precompile.cc'],
-        }
-      }],
-  ],
-}
diff --git a/buildtools/.gitignore b/buildtools/.gitignore
index c2c8dc2..afaa3ca 100644
--- a/buildtools/.gitignore
+++ b/buildtools/.gitignore
@@ -1,12 +1,4 @@
 *.pyc
-third_party/libc++/trunk
-third_party/libc++abi/trunk
-third_party/libunwind/trunk
-linux64/gn
 linux64/clang-format
-mac/gn
 mac/clang-format
-win/gn.exe
 win/clang-format.exe
-android/doclava/
-android/doclava.tar.gz
diff --git a/buildtools/DEPS b/buildtools/DEPS
deleted file mode 100644
index fde9a08..0000000
--- a/buildtools/DEPS
+++ /dev/null
@@ -1,25 +0,0 @@
-use_relative_paths = True
-
-vars = {
-  "chromium_url": "https://chromium.googlesource.com",
-
-  "clang_format_rev": "0653eee0c81ea04715c635dd0885e8096ff6ba6d",   # r302580
-  "libcxx_revision": "3a07dd740be63878167a0ea19fe81869954badd7",    # r303878
-  "libcxxabi_revision": "4072e8fd76febee37f60aeda76d6d9f5e3791daa", # r303806
-  "libunwind_revision": "41f982e5887185b904a456e20dfcd58e6be6cc19", # r306442
-}
-
-deps = {
-  "clang_format/script":
-    Var("chromium_url") + "/chromium/llvm-project/cfe/tools/clang-format.git@" +
-    Var("clang_format_rev"),
-  "third_party/libc++/trunk":
-    Var("chromium_url") + "/chromium/llvm-project/libcxx.git" + "@" +
-    Var("libcxx_revision"),
-  "third_party/libc++abi/trunk":
-    Var("chromium_url") + "/chromium/llvm-project/libcxxabi.git" + "@" +
-    Var("libcxxabi_revision"),
-  "third_party/libunwind/trunk":
-    Var("chromium_url") + "/external/llvm.org/libunwind.git" + "@" +
-    Var("libunwind_revision"),
-}
diff --git a/buildtools/linux64/gn.sha1 b/buildtools/linux64/gn.sha1
deleted file mode 100644
index a7db55c..0000000
--- a/buildtools/linux64/gn.sha1
+++ /dev/null
@@ -1 +0,0 @@
-1984d9f627869e631a3e5e6b25032a202b805c6e
\ No newline at end of file
diff --git a/buildtools/mac/clang-format.sha1 b/buildtools/mac/clang-format.sha1
new file mode 100644
index 0000000..8a00b61
--- /dev/null
+++ b/buildtools/mac/clang-format.sha1
@@ -0,0 +1 @@
+0679b295e2ce2fce7919d1e8d003e497475f24a3
diff --git a/buildtools/win/clang-format.exe.sha1 b/buildtools/win/clang-format.exe.sha1
new file mode 100644
index 0000000..fbb0ae5
--- /dev/null
+++ b/buildtools/win/clang-format.exe.sha1
@@ -0,0 +1 @@
+c8455d43d052eb79f65d046c6b02c169857b963b
diff --git a/cobalt/.gitattributes b/cobalt/.gitattributes
index 0f70607..10dbe12 100644
--- a/cobalt/.gitattributes
+++ b/cobalt/.gitattributes
@@ -19,7 +19,6 @@
 *.y                     text eol=lf
 .clang-format           text eol=lf
 codereview.settings     text eol=lf
-gyp_cobalt              text eol=lf
 
 # Images should be treated as binary files.
 *.exe                   binary
diff --git a/cobalt/BUILD.gn b/cobalt/BUILD.gn
index 7fbccdc..2a4e0b6 100644
--- a/cobalt/BUILD.gn
+++ b/cobalt/BUILD.gn
@@ -18,6 +18,7 @@
     ":default",
     "//cobalt/bindings/testing:bindings_test",
     "//cobalt/browser:browser_test",
+    "//cobalt/cssom:cssom_test",
     "//cobalt/dom:dom_test",
     "//cobalt/dom/testing:dom_testing",
     "//cobalt/dom_parser:dom_parser_test",
@@ -64,6 +65,9 @@
     deps += [
       "//base/util/values:values_util",
       "//cobalt/updater",
+      "//cobalt/updater:crash_sandbox",
+      "//cobalt/updater:noop_sandbox",
+      "//cobalt/updater:one_app_only_sandbox",
       "//components/client_update_protocol",
       "//components/crx_file",
       "//components/prefs",
diff --git a/cobalt/_env.py b/cobalt/_env.py
deleted file mode 100644
index 332eabc..0000000
--- a/cobalt/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source  # pylint: disable=deprecated-module
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print('%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV))
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/account/account.gyp b/cobalt/account/account.gyp
deleted file mode 100644
index bd42634..0000000
--- a/cobalt/account/account.gyp
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'account',
-      'type': 'static_library',
-      'sources': [
-        'account_manager.h',
-        'account_manager.cc',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/audio/BUILD.gn b/cobalt/audio/BUILD.gn
index 88bfeb1..6e9c962 100644
--- a/cobalt/audio/BUILD.gn
+++ b/cobalt/audio/BUILD.gn
@@ -81,6 +81,4 @@
     "//testing/gtest",
   ]
   deps += cobalt_platform_dependencies
-
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/cobalt/audio/audio.gyp b/cobalt/audio/audio.gyp
deleted file mode 100644
index c0488c2..0000000
--- a/cobalt/audio/audio.gyp
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'audio',
-      'type': 'static_library',
-      'sources': [
-        'async_audio_decoder.cc',
-        'async_audio_decoder.h',
-        'audio_buffer.cc',
-        'audio_buffer.h',
-        'audio_buffer_source_node.cc',
-        'audio_buffer_source_node.h',
-        'audio_context.cc',
-        'audio_context.h',
-        'audio_destination_node.cc',
-        'audio_destination_node.h',
-        'audio_device.cc',
-        'audio_device.h',
-        'audio_file_reader.cc',
-        'audio_file_reader.h',
-        'audio_file_reader_wav.cc',
-        'audio_file_reader_wav.h',
-        'audio_helpers.h',
-        'audio_node.cc',
-        'audio_node.h',
-        'audio_node_input.cc',
-        'audio_node_input.h',
-        'audio_node_output.cc',
-        'audio_node_output.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-        '<(DEPTH)/cobalt/media/media.gyp:media',
-      ],
-      'export_dependent_settings': [
-        # Additionally, ensure that the include directories for generated
-        # headers are put on the include directories for targets that depend
-        # on this one.
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ]
-    },
-  ],
-}
diff --git a/cobalt/audio/audio_context.cc b/cobalt/audio/audio_context.cc
index 4ea6847..fae4b53 100644
--- a/cobalt/audio/audio_context.cc
+++ b/cobalt/audio/audio_context.cc
@@ -19,7 +19,8 @@
 
 #include "base/callback.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/dom/dom_settings.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace cobalt {
 namespace audio {
@@ -27,7 +28,8 @@
 AudioContext::AudioContext(script::EnvironmentSettings* settings)
     : dom::EventTarget(settings),
       global_environment_(
-          base::polymorphic_downcast<dom::DOMSettings*>(settings)
+          base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+              ->context()
               ->global_environment()),
       ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
       ALLOW_THIS_IN_INITIALIZER_LIST(
diff --git a/cobalt/audio/audio_device.cc b/cobalt/audio/audio_device.cc
index 7755e7f..7aae3b4 100644
--- a/cobalt/audio/audio_device.cc
+++ b/cobalt/audio/audio_device.cc
@@ -44,13 +44,7 @@
                                      int* offset_in_frames, bool* is_playing,
                                      bool* is_eos_reached, void* context);
 
-#if SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
   static void ConsumeFramesFunc(int frames_consumed, void* context);
-#else   // SB_API_VERSION >=  12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-  static void ConsumeFramesFunc(int frames_consumed,
-                                SbTime frames_consumed_at,
-                                void* context);
-#endif  // SB_API_VERSION >=  12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 
   void UpdateSourceStatus(int* frames_in_buffer, int* offset_in_frames,
                           bool* is_playing, bool* is_eos_reached);
@@ -143,15 +137,8 @@
                            is_eos_reached);
 }
 
-#if SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 // static
 void AudioDevice::Impl::ConsumeFramesFunc(int frames_consumed, void* context) {
-#else   // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-void AudioDevice::Impl::ConsumeFramesFunc(int frames_consumed,
-                                          SbTime frames_consumed_at,
-                                          void* context) {
-  SB_UNREFERENCED_PARAMETER(frames_consumed_at);
-#endif  // SB_API_VERSION >=  12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
   AudioDevice::Impl* impl = reinterpret_cast<AudioDevice::Impl*>(context);
   DCHECK(impl);
 
diff --git a/cobalt/audio/audio_file_reader_wav.cc b/cobalt/audio/audio_file_reader_wav.cc
index 882a496..30caa8f 100644
--- a/cobalt/audio/audio_file_reader_wav.cc
+++ b/cobalt/audio/audio_file_reader_wav.cc
@@ -122,10 +122,7 @@
         break;
       }
     } else if (chunk_id == kWAVChunkID_data && i == 1) {
-      if (!ParseWAV_data(data, offset, chunk_size, is_src_sample_in_float)) {
-        DLOG(WARNING) << "Parse data chunk failed.";
-        break;
-      }
+      ParseWAV_data(data, offset, chunk_size, is_src_sample_in_float);
     } else {
       DLOG(WARNING) << "Malformed audio chunk.";
       break;
@@ -182,7 +179,7 @@
   return true;
 }
 
-bool AudioFileReaderWAV::ParseWAV_data(const uint8* data, size_t offset,
+void AudioFileReaderWAV::ParseWAV_data(const uint8* data, size_t offset,
                                        size_t size,
                                        bool is_src_sample_in_float) {
   // Set number of frames based on size of data chunk.
@@ -281,8 +278,6 @@
     }
   }
 #endif  // SB_IS(LITTLE_ENDIAN)
-
-  return true;
 }
 
 }  // namespace audio
diff --git a/cobalt/audio/audio_file_reader_wav.h b/cobalt/audio/audio_file_reader_wav.h
index bf3b95a..901aad1 100644
--- a/cobalt/audio/audio_file_reader_wav.h
+++ b/cobalt/audio/audio_file_reader_wav.h
@@ -16,6 +16,7 @@
 #define COBALT_AUDIO_AUDIO_FILE_READER_WAV_H_
 
 #include <memory>
+#include <utility>
 
 #include "cobalt/audio/audio_file_reader.h"
 #include "cobalt/audio/audio_helpers.h"
@@ -47,7 +48,7 @@
   void ParseChunks(const uint8* data, size_t size);
   bool ParseWAV_fmt(const uint8* data, size_t offset, size_t size,
                     bool* is_src_sample_in_float);
-  bool ParseWAV_data(const uint8* data, size_t offset, size_t size,
+  void ParseWAV_data(const uint8* data, size_t offset, size_t size,
                      bool is_src_sample_in_float);
 
   bool is_valid() { return audio_bus_ != NULL; }
diff --git a/cobalt/audio/audio_node_input_output_test.cc b/cobalt/audio/audio_node_input_output_test.cc
index 41a2ca2..12cb069 100644
--- a/cobalt/audio/audio_node_input_output_test.cc
+++ b/cobalt/audio/audio_node_input_output_test.cc
@@ -22,9 +22,11 @@
 #include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/testing/stub_environment_settings.h"
 #include "cobalt/dom/window.h"
-#include "cobalt/script/global_environment.h"
+#include "cobalt/script/environment_settings.h"
 #include "cobalt/script/javascript_engine.h"
 #include "cobalt/script/typed_arrays.h"
+#include "cobalt/web/agent.h"
+#include "cobalt/web/context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 // TODO: Consolidate AudioBus creation code
@@ -69,21 +71,18 @@
 };
 
 void FillAudioBusFromOneSource(
-    std::unique_ptr<AudioBus> src_data,
+    script::EnvironmentSettings* settings, std::unique_ptr<AudioBus> src_data,
     const AudioNodeChannelInterpretation& interpretation, AudioBus* audio_bus,
     bool* silence) {
-  dom::testing::StubEnvironmentSettings environment_settings;
-
-  scoped_refptr<AudioContext> audio_context(
-      new AudioContext(&environment_settings));
+  scoped_refptr<AudioContext> audio_context(new AudioContext(settings));
   scoped_refptr<AudioBufferSourceNode> source(
-      audio_context->CreateBufferSource(&environment_settings));
+      audio_context->CreateBufferSource(settings));
   scoped_refptr<AudioBuffer> buffer(
       new AudioBuffer(audio_context->sample_rate(), std::move(src_data)));
   source->set_buffer(buffer);
 
   scoped_refptr<AudioDestinationNodeMock> destination(
-      new AudioDestinationNodeMock(&environment_settings, audio_context.get()));
+      new AudioDestinationNodeMock(settings, audio_context.get()));
   destination->set_channel_interpretation(interpretation);
   source->Connect(destination, 0, 0, NULL);
   source->Start(0, 0, NULL);
@@ -93,36 +92,30 @@
 
 class AudioNodeInputOutputTest : public ::testing::Test {
  public:
-  AudioNodeInputOutputTest()
-      : engine_(script::JavaScriptEngine::CreateEngine()),
-        global_environment_(engine_->CreateGlobalEnvironment()) {
-    environment_settings_ = std::unique_ptr<script::EnvironmentSettings>(
+  AudioNodeInputOutputTest() {
+    web_context_.reset(web::Agent::CreateContext("AudioNodeInputOutputTest"));
+    web_context_->setup_environment_settings(
         new dom::testing::StubEnvironmentSettings);
-    global_environment_->CreateGlobalObject();
+    web_context_->global_environment()->CreateGlobalObject();
   }
 
-  ~AudioNodeInputOutputTest() {
-    global_environment_->SetReportEvalCallback(base::Closure());
-    global_environment_->SetReportErrorCallback(
-        script::GlobalEnvironment::ReportErrorCallback());
-    global_environment_ = nullptr;
-  }
+  ~AudioNodeInputOutputTest() {}
 
   script::GlobalEnvironment* global_environment() const {
-    return global_environment_.get();
+    return web_context_->global_environment();
   }
 
   script::EnvironmentSettings* environment_settings() const {
-    return environment_settings_.get();
+    DCHECK(web_context_->environment_settings()->context());
+    return web_context_->environment_settings();
   }
 
  protected:
   base::MessageLoop message_loop_;
 
  private:
-  std::unique_ptr<script::JavaScriptEngine> engine_;
-  scoped_refptr<script::GlobalEnvironment> global_environment_;
-  std::unique_ptr<script::EnvironmentSettings> environment_settings_;
+  // The Web Instance includes the Script Realm.
+  std::unique_ptr<web::Context> web_context_;
 };
 
 TEST_F(AudioNodeInputOutputTest, StereoToStereoSpeakersLayoutTest) {
@@ -147,8 +140,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -189,8 +182,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -228,8 +221,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -263,8 +256,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -301,8 +294,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -343,8 +336,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -385,8 +378,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -427,8 +420,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -469,8 +462,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -507,8 +500,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -545,8 +538,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -583,8 +576,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -621,8 +614,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
@@ -659,8 +652,8 @@
                    AudioBus::kFloat32, AudioBus::kInterleaved));
   audio_bus->ZeroAllFrames();
   bool silence = true;
-  FillAudioBusFromOneSource(std::move(src_data), kInterpretation,
-                            audio_bus.get(), &silence);
+  FillAudioBusFromOneSource(environment_settings(), std::move(src_data),
+                            kInterpretation, audio_bus.get(), &silence);
   EXPECT_FALSE(silence);
 
   for (size_t channel = 0; channel < kNumOfDestChannels; ++channel) {
diff --git a/cobalt/audio/audio_test.gyp b/cobalt/audio/audio_test.gyp
deleted file mode 100644
index 97bd3f9..0000000
--- a/cobalt/audio/audio_test.gyp
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'audio_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'audio_node_input_output_test.cc',
-      ],
-      'dependencies': [
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/media/media.gyp:media',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-
-        # TODO: Remove the dependency below, it works around the fact that
-        #       ScriptValueFactory has non-virtual method CreatePromise().
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'audio_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'audio_test',
-      ],
-      'variables': {
-        'executable_name': 'audio_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/base/application_state.h b/cobalt/base/application_state.h
index d536189..e3c71c7 100644
--- a/cobalt/base/application_state.h
+++ b/cobalt/base/application_state.h
@@ -26,42 +26,42 @@
 // Starboard lifecycle states in order to explicitly represent Cobalt-specific
 // substates that Starboard does not enforce.
 enum ApplicationState {
+  // The state where the application is running in the foreground, fully
+  // visible, with all necessary graphics resources available. A possible
+  // initial state, where loading happens while in the foreground.
+  kApplicationStateStarted = 1,
+
   // The application is still visible, and therefore still requires graphics
   // resources, but the web application may wish to take actions such as pause
   // video. The application is expected to be able to move back into the Started
   // state very quickly.
-  kApplicationStateBlurred,
+  kApplicationStateBlurred = 2,
 
   // The state where the application is running on the background, but the
   // background tasks are still running, such as audio playback, or updating
   // of recommendations. The application is expected to be able to move back
   // into the Blurred state very quickly.
-  kApplicationStateConcealed,
+  kApplicationStateConcealed = 3,
 
   // The application was stopped to the point where graphics and video resources
   // are invalid and execution should be halted until resumption.
-  kApplicationStateFrozen,
-
-  // The state where the application is running in the foreground, fully
-  // visible, with all necessary graphics resources available. A possible
-  // initial state, where loading happens while in the foreground.
-  kApplicationStateStarted,
+  kApplicationStateFrozen = 4,
 
   // Representation of a idle/terminal/shutdown state with no resources.
-  kApplicationStateStopped,
+  kApplicationStateStopped = 5,
 };
 
 // Returns a human-readable string for the given |state|.
 static inline const char *GetApplicationStateString(ApplicationState state) {
   switch (state) {
+    case kApplicationStateStarted:
+      return "kApplicationStateStarted";
     case kApplicationStateBlurred:
       return "kApplicationStateBlurred";
     case kApplicationStateConcealed:
       return "kApplicationStateConcealed";
     case kApplicationStateFrozen:
       return "kApplicationStateFrozen";
-    case kApplicationStateStarted:
-      return "kApplicationStateStarted";
     case kApplicationStateStopped:
       return "kApplicationStateStopped";
   }
diff --git a/cobalt/base/base.gyp b/cobalt/base/base.gyp
deleted file mode 100644
index 920a39c..0000000
--- a/cobalt/base/base.gyp
+++ /dev/null
@@ -1,136 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'base',
-      # Override library name, to avoid conflicting with Chromium base when
-      # generating PDBs.
-      'product_name': 'cobalt_base',
-      'type': 'static_library',
-      'defines': ["COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS=1"],
-      'direct_dependent_settings': {
-         'defines': ["COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS=1"],
-      },
-      'sources': [
-        'accessibility_caption_settings_changed_event.h',
-        'accessibility_settings_changed_event.h',
-        'accessibility_text_to_speech_settings_changed_event.h',
-        'address_sanitizer.h',
-        'camera_transform.h',
-        'circular_buffer_shell.cc',
-        'circular_buffer_shell.h',
-        'clock.h',
-        'cobalt_paths.h',
-        'compiler.h',
-        'console_log.h',
-        'c_val.cc',
-        'c_val.h',
-        'c_val_collection_entry_stats.h',
-        'c_val_collection_timer_stats.h',
-        'c_val_time_interval_entry_stats.h',
-        'c_val_time_interval_timer_stats.h',
-        'date_time_configuration_changed_event.h',
-        'deep_link_event.h',
-        'do_main.h',
-        'do_main_starboard.h',
-        'event.h',
-        'event_dispatcher.cc',
-        'event_dispatcher.h',
-        'get_application_key.cc',
-        'get_application_key.h',
-        'init_cobalt.cc',
-        'init_cobalt.h',
-        'language.cc',
-        'language.h',
-        'localized_strings.cc',
-        'localized_strings.h',
-        'log_message_handler.cc',
-        'log_message_handler.h',
-        'math.h',
-        'message_queue.h',
-        'on_screen_keyboard_hidden_event.h',
-        'on_screen_keyboard_shown_event.h',
-        'path_provider.cc',
-        'path_provider.h',
-        'poller.h',
-        'polymorphic_downcast.h',
-        'polymorphic_equatable.h',
-        'ref_counted_lock.h',
-        'source_location.cc',
-        'source_location.h',
-        'startup_timer.cc',
-        'startup_timer.h',
-        'stop_watch.cc',
-        'stop_watch.h',
-        'token.cc',
-        'token.h',
-        'tokens.cc',
-        'tokens.h',
-        'type_id.h',
-        'window_size_changed_event.h',
-        'unicode/character.cc',
-        'unicode/character.h',
-        'unicode/character_values.h',
-        'unused.h',
-        'version_compatibility.cc',
-        'version_compatibility.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/base/base.gyp:base_i18n',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        '<(DEPTH)/third_party/libxml/libxml.gyp:libxml',
-      ],
-      'include_dirs': [
-        '<(DEPTH)/third_party/libxml/src/include',
-      ],
-      'export_dependent_settings': [
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-    },
-    {
-      'target_name': 'base_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'circular_buffer_shell_unittest.cc',
-        'c_val_collection_entry_stats_test.cc',
-        'c_val_collection_timer_stats_test.cc',
-        'c_val_test.cc',
-        'c_val_time_interval_entry_stats_test.cc',
-        'c_val_time_interval_timer_stats_test.cc',
-        'token_test.cc',
-        'fixed_size_lru_cache_test.cc',
-      ],
-      'dependencies': [
-        'base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'base_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'base_test',
-      ],
-      'variables': {
-        'executable_name': 'base_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/base/token.cc b/cobalt/base/token.cc
index 825cb50..7773595 100644
--- a/cobalt/base/token.cc
+++ b/cobalt/base/token.cc
@@ -89,6 +89,7 @@
 
   uint32 slot = hash(str) % Token::kHashSlotCount;
   // First check if we already have this token.
+  // Most common path, so lock free.
   for (uint32 i = 0; i < Token::kStringsPerSlot; ++i) {
     uint32 index = slot * Token::kStringsPerSlot + i;
     if (hash_table_[index].empty()) {
@@ -101,12 +102,17 @@
 
   base::AutoLock auto_lock(lock_);
   // Now try to create this token in the table.
+  // Also check again if the token exists after acquiring the lock, because
+  // another thread may have added it before we acquired the lock.
   for (uint32 i = 0; i < Token::kStringsPerSlot; ++i) {
     uint32 index = slot * Token::kStringsPerSlot + i;
     if (hash_table_[index].empty()) {
       hash_table_[index] = str;
       return hash_table_[index].c_str();
     }
+    if (hash_table_[index] == str) {
+      return hash_table_[index].c_str();
+    }
   }
 
   // This should never happen in production as we use a quite large bin size
diff --git a/cobalt/base/tokens.h b/cobalt/base/tokens.h
index 3077c2c..954b441 100644
--- a/cobalt/base/tokens.h
+++ b/cobalt/base/tokens.h
@@ -46,6 +46,7 @@
     MacroOpWithNameOnly(click)                                       \
     MacroOpWithNameOnly(close)                                       \
     MacroOpWithNameOnly(complete)                                    \
+    MacroOpWithNameOnly(controllerchange)                            \
     MacroOpWithNameOnly(dataavailable)                               \
     MacroOpWithNameOnly(deviceorientation)                           \
     MacroOpWithNameOnly(durationchange)                              \
@@ -65,6 +66,7 @@
     MacroOpWithNameOnly(keypress)                                    \
     MacroOpWithNameOnly(keystatuseschange)                           \
     MacroOpWithNameOnly(keyup)                                       \
+    MacroOpWithNameOnly(languagechange)                              \
     MacroOpWithNameOnly(load)                                        \
     MacroOpWithNameOnly(loadeddata)                                  \
     MacroOpWithNameOnly(loadedmetadata)                              \
@@ -74,6 +76,7 @@
     MacroOpWithNameOnly(lostpointercapture)                          \
     MacroOpWithNameOnly(mark)                                        \
     MacroOpWithNameOnly(message)                                     \
+    MacroOpWithNameOnly(messageerror)                                \
     MacroOpWithNameOnly(mousedown)                                   \
     MacroOpWithNameOnly(mouseenter)                                  \
     MacroOpWithNameOnly(mouseleave)                                  \
@@ -101,6 +104,7 @@
     MacroOpWithNameOnly(ratechange)                                  \
     MacroOpWithNameOnly(ready)                                       \
     MacroOpWithNameOnly(readystatechange)                            \
+    MacroOpWithNameOnly(rejectionhandled)                            \
     MacroOpWithNameOnly(removals)                                    \
     MacroOpWithNameOnly(removesourcebuffer)                          \
     MacroOpWithNameOnly(removetrack)                                 \
@@ -119,6 +123,7 @@
     MacroOpWithNameOnly(sourceended)                                 \
     MacroOpWithNameOnly(sourceopen)                                  \
     MacroOpWithNameOnly(start)                                       \
+    MacroOpWithNameOnly(statechange)                                 \
     MacroOpWithNameOnly(stop)                                        \
     MacroOpWithNameOnly(storage)                                     \
     MacroOpWithNameOnly(stalled)                                     \
@@ -128,10 +133,12 @@
     MacroOpWithNameOnly(timeout)                                     \
     MacroOpWithNameOnly(timeupdate)                                  \
     MacroOpWithNameOnly(transitionend)                               \
+    MacroOpWithNameOnly(unhandledrejection)                          \
     MacroOpWithNameOnly(unload)                                      \
     MacroOpWithNameOnly(update)                                      \
     MacroOpWithNameOnly(updateend)                                   \
     MacroOpWithNameOnly(updatestart)                                 \
+    MacroOpWithNameOnly(updatefound)                                 \
     MacroOpWithNameOnly(visibilitychange)                            \
     MacroOpWithNameOnly(voiceschanged)                               \
     MacroOpWithNameOnly(volumechange)                                \
diff --git a/cobalt/base/wrap_main_starboard.h b/cobalt/base/wrap_main_starboard.h
index 79524b4..4d4bd74 100644
--- a/cobalt/base/wrap_main_starboard.h
+++ b/cobalt/base/wrap_main_starboard.h
@@ -56,7 +56,7 @@
 #if SB_API_VERSION >= 13
       preload_function(data->argument_count, data->argument_values, data->link,
                        base::Bind(&SbSystemRequestStop, 0), event->timestamp);
-#else  // SB_API_VERSION >= 13
+#else   // SB_API_VERSION >= 13
       preload_function(data->argument_count, data->argument_values, data->link,
                        base::Bind(&SbSystemRequestStop, 0),
                        SbTimeGetMonotonicNow());
@@ -82,7 +82,7 @@
 #if SB_API_VERSION >= 13
       start_function(data->argument_count, data->argument_values, data->link,
                      base::Bind(&SbSystemRequestStop, 0), event->timestamp);
-#else  // SB_API_VERSION >= 13
+#else   // SB_API_VERSION >= 13
       start_function(data->argument_count, data->argument_values, data->link,
                      base::Bind(&SbSystemRequestStop, 0),
                      SbTimeGetMonotonicNow());
@@ -132,24 +132,17 @@
 #endif  // SB_API_VERSION >= 13
     case kSbEventTypeLowMemory:
     case kSbEventTypeWindowSizeChanged:
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
     case kSbEventTypeOnScreenKeyboardShown:
     case kSbEventTypeOnScreenKeyboardHidden:
     case kSbEventTypeOnScreenKeyboardFocused:
     case kSbEventTypeOnScreenKeyboardBlurred:
     case kSbEventTypeOnScreenKeyboardSuggestionsUpdated:
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
     case kSbEventTypeAccessibilityCaptionSettingsChanged:
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
-#if SB_API_VERSION >= 12
 #if SB_API_VERSION >= 13
     case kSbEventTypeAccessibilityTextToSpeechSettingsChanged:
 #else
     case kSbEventTypeAccessiblityTextToSpeechSettingsChanged:
 #endif  // SB_API_VERSION >= 13
-#endif  // SB_API_VERSION >= 12
 #if SB_API_VERSION >= 13
     case kSbEventTypeOsNetworkDisconnected:
     case kSbEventTypeOsNetworkConnected:
diff --git a/cobalt/bindings/_env.py b/cobalt/bindings/_env.py
index 8844e2c..4b705c2 100644
--- a/cobalt/bindings/_env.py
+++ b/cobalt/bindings/_env.py
@@ -13,29 +13,22 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-"""Ask the parent directory to load the project environment."""
+"""Sets PYTHONPATH for third_party/blink modules to work correctly."""
 
-from imp import load_source
-import os
 from os import path
 import sys
 
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
+_REPO_ROOT = path.abspath(
+    path.join(path.dirname(__file__), path.pardir, path.pardir))
+_BLINK_PATHS = [
+    path.join(_REPO_ROOT, 'third_party', 'blink', 'Tools', 'Scripts'),
+    path.join(_REPO_ROOT, 'third_party', 'blink', 'Source', 'bindings',
+              'scripts'),
+]
 
-# Add blink's Python tools to the path.
+if _REPO_ROOT not in sys.path:
+  sys.path.insert(0, _REPO_ROOT)
 
-from cobalt.tools import paths  # pylint: disable=g-import-not-at-top
-
-sys.path.append(
-    os.path.normpath(
-        os.path.join(paths.REPOSITORY_ROOT, 'third_party', 'blink', 'Tools',
-                     'Scripts')))
-
-sys.path.append(
-    os.path.normpath(
-        os.path.join(paths.REPOSITORY_ROOT, 'third_party', 'blink', 'Source',
-                     'bindings', 'scripts')))
+for path in _BLINK_PATHS:
+  if path not in sys.path:
+    sys.path.append(path)
diff --git a/cobalt/bindings/bindings.gypi b/cobalt/bindings/bindings.gypi
deleted file mode 100644
index 3b33a64..0000000
--- a/cobalt/bindings/bindings.gypi
+++ /dev/null
@@ -1,575 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is intended to be included into another .gyp file that will have
-# a number of variables defined, which will drive the bindings generation
-# targets below. A .gyp file that includes this should depend on the 'bindings'
-# target which will be defined in this gyp file.
-#
-# Input variables:
-#   source_idl_files: All IDL files for which a bindings wrapper should be
-#       created.
-#   generated_header_idl_files: IDL files for IDL dictionaries and IDL enums. A
-#       header will be generated for these that can be #included in
-#   dependency_idl_files: IDL files that are dependencies of other IDLs, but no
-#       bindings wrapper will be created. For example, partial interfaces and
-#       the right-hand-side of implements statements.
-#
-# Other variables, such as bindings_defines, can be set in the including .gyp
-# file to affect how the bindings are built. See comments in the variables
-# section below.
-#
-# Output:
-#   generated_bindings: A gyp target that will generate all bindings source
-#       files. At most one target can declare generated_bindings as a
-#       dependency. The target that depends on generated_bindings will compile
-#       the generated sources, since generated_bindings will export the required
-#       gyp variables to its dependent.
-#
-# Basic flow of data:
-#   [All Static files] -> GlobalObjectsPickle
-#     - GlobalObjectsPickle is a python pickle of all interfaces with the Global
-#       or PrimaryGlobal extended attribute
-#   GlobalObjectsPickle -> GlobalConstructors.idl
-#     - GlobalConstructors.idl defines a partial interface that exposes all of
-#       the interfaces Interface Objects, also known as constructors.
-#   [All Static and Generated IDL files] -> InterfacesInfoComponent.pickle
-#     - Preprocessed interface data from the IDLs
-#     - In Blink, this is per-component, but we don't have multiple components
-#       in Cobalt at this point.
-#   [InterfacesInfoComponent.pickle] -> InterfacesInfoOverall.pickle
-#     - Pickles for all components are combined into a global pickle that covers
-#       all interfaces across all modules.
-#   InterfacesInfoOverall.pickle -> [Bindings for all interfaces]
-#
-# This is built and based on the flow for Blink's IDL parsing and code
-# generation pipeline:
-# http://www.chromium.org/developers/design-documents/idl-build
-{
-  'variables': {
-    # Get the engine variables and blink's variables and pull them out to this
-    # 'variables' scope so we can use them in this file.
-    'includes': [
-      '../script/engine_variables.gypi',
-      '../../third_party/blink/Source/bindings/scripts/scripts.gypi',
-    ],
-    'variables': {
-      # Specify a default component for generated window IDL. This should be
-      # removed when the concept of 'components' in the blink IDL parsing scripts
-      # is refactored out, since it doesn't really apply to Cobalt.
-      'window_component%': 'dom',
-    },
-
-    # Define these variables in the including .gyp file and their lists will get
-    # merged in, giving some control to how the bindings are built.
-    'bindings_defines': ['<@(engine_defines)'],
-    'bindings_dependencies': ['<@(engine_dependencies)'],
-    'bindings_include_dirs': ['<@(engine_include_dirs)'],
-    'bindings_templates_dir': '<(engine_templates_dir)',
-    'idl_compiler_script': '<(engine_idl_compiler)',
-    'conversion_header_generator_script': '<(engine_conversion_header_generator_script)',
-
-    # Templates that are shared by the code generation for multiple engines.
-    'shared_template_files': [
-      'templates/dictionary.h.template',
-      'templates/interface-base.cc.template',
-      'templates/interface-base.h.template',
-      'templates/callback-interface-base.cc.template',
-      'templates/callback-interface-base.h.template',
-    ],
-
-    # The following lists of IDL files should be set in the including .gyp file.
-
-    # Bindings for the interfaces in this list will be generated, and there must
-    # be an implementation declared in a header that lives in the same
-    # directory of each IDL.
-    'source_idl_files': [],
-
-    # For each IDL file in this list, a header file that can be #included in
-    # Cobalt will be generated, as well as a .cc file that implements the
-    # conversion to/from a JS value.
-    'generated_header_idl_files': [],
-
-    # Partial interfaces and the right-side of "implements"
-    # Code will not get generated for these interfaces; they are used to add
-    # functionality to other interfaces.
-    'dependency_idl_files': [],
-
-    # Bindings for these will not be generated, but attempts to access their
-    # Constructors will be an event in the unsupported property mechanism.
-    'unsupported_interface_idl_files': [],
-
-    'window_component%': '<(window_component)',
-
-    'prefix': '<(generated_bindings_prefix)',
-
-    # The location of blink's bindings scripts, such as idl_compiler.py
-    'bindings_scripts_dir': '<(bindings_scripts_dir)',
-
-    # PLY, Web IDL parser, and Blink IDL parser sources
-    'idl_lexer_parser_files': ['<@(idl_lexer_parser_files)'],
-
-    # Jinja bytecode cache, PLY lex/parse table cache
-    'idl_cache_files': ['<@(idl_cache_files)'],
-
-    # Jinja sources
-    'jinja_module_files': ['<@(jinja_module_files)'],
-
-    # Cobalt's Jinja templates
-    'code_generator_template_files': [
-      '<@(engine_template_files)',
-      '<@(shared_template_files)'
-    ],
-
-    # Dependencies of the bindings generation that are not captured as inputs
-    'bindings_extra_inputs': [
-      '<@(idl_lexer_parser_files)',
-      '<@(idl_cache_files)',
-      '<@(idl_compiler_files)',
-      '<(DEPTH)/cobalt/bindings/code_generator_cobalt.py',
-      '<(DEPTH)/cobalt/bindings/expression_generator.py',
-      '<(DEPTH)/cobalt/bindings/contexts.py',
-      '<(DEPTH)/cobalt/bindings/idl_compiler_cobalt.py',
-      '<(DEPTH)/cobalt/bindings/generate_conversion_header.py',
-      '<(DEPTH)/cobalt/bindings/name_conversion.py',
-      '<(DEPTH)/cobalt/bindings/overload_context.py',
-      '<@(code_generator_template_files)',
-      '<@(engine_bindings_scripts)',
-    ],
-
-    # Caches and intermediate structures.
-    'bindings_scripts_output_dir': '<(bindings_output_dir)/scripts',
-
-    # Directory containing generated IDL files.
-    'generated_idls_output_dir': '<(bindings_output_dir)/idl',
-
-    # Base directory into which generated bindings source files will be
-    # generated. Directory structure will mirror the directory structure
-    # that the .idl files came from.
-    'generated_source_output_dir': '<(bindings_output_dir)/source',
-
-    # File containing a whitelist of Extended Attributes that the code generation
-    # pipeline understands
-    'extended_attributes_file': 'IDLExtendedAttributes.txt',
-
-    # Blink interface info is calculated in two stages. First at a per-component level
-    # (in Blink this is core or modules) and then these are combined. While Cobalt
-    # currently does not and may not need to distinguish between components, we adhere to
-    # Blink's process for simplicity.
-    'component_info_pickle':
-        '<(bindings_scripts_output_dir)/component_info.pickle',
-    'interfaces_info_individual_pickle':
-        '<(bindings_scripts_output_dir)/interfaces_info_individual.pickle',
-    'interfaces_info_combined_pickle':
-        '<(bindings_scripts_output_dir)/interfaces_info_overall.pickle',
-
-    # All source files that will be generated from the source IDL files.
-    'generated_sources':
-        ['<!@pymod_do_main(cobalt.build.path_conversion -s'
-         ' --output_directory <(generated_source_output_dir)'
-         ' --output_extension cc --output_prefix <(prefix)_'
-         ' --base_directory <(DEPTH)'
-         ' <@(source_idl_files))'],
-
-    # .cc files that implement conversion functions to/from a JS value for
-    # generated types (enums and dictionaries).
-    'generated_type_conversions':
-        ['<!@pymod_do_main(cobalt.build.path_conversion -s'
-         ' --output_directory <(generated_source_output_dir)'
-         ' --output_extension cc --output_prefix <(prefix)_'
-         ' --base_directory <(DEPTH)'
-         ' <@(generated_header_idl_files))'],
-
-    # Generated IDL file that will define all the constructors that should be
-    # on the Window object
-    'global_constructors_generated_idl_file':
-        '<(generated_idls_output_dir)/<(window_component)/window_constructors.idl',
-
-    # Dummy header file which is generated because the idl compiler assumes
-    # there is a header for each IDL.
-    'global_constructors_generated_header_file':
-        '<(generated_idls_output_dir)/<(window_component)/window_constructors.h',
-
-    # Generated header file that contains forward declarations for converting
-    # to/from JS value and generated types.
-    'generated_type_conversion_header_file':
-        '<(generated_source_output_dir)/<(prefix)_gen_type_conversion.h',
-  },
-
-  'targets': [
-    {
-      # Create a target that depends on this target to compile the generated
-      # source files. There should be only one such target.
-      # Based on blink/Source/bindings/core/v8/generated.gyp:bindings_core_v8_generated_individual
-      'target_name': 'generated_bindings',
-      'type': 'none',
-      # The 'binding' rule generates .h files, so mark as hard_dependency, per:
-      # https://code.google.com/p/gyp/wiki/InputFormatReference#Linking_Dependencies
-      'hard_dependency': 1,
-      'dependencies': [
-        'cached_jinja_templates',
-        'cached_lex_yacc_tables',
-        'generated_types',
-        'generated_type_conversion',
-        'global_constructors_idls',
-        'interfaces_info_overall',
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        '<@(bindings_dependencies)',
-      ],
-      'export_dependent_settings': [
-        '<@(bindings_dependencies)',
-      ],
-      'sources': [
-        '<@(source_idl_files)',
-      ],
-      'rules': [{
-        'rule_name': 'binding',
-        'extension': 'idl',
-        'msvs_external_rule': 1,
-        'inputs': [
-          # Script source files, etc.
-          '<@(bindings_extra_inputs)',
-
-          # This file is global, so if it changes all files are rebuilt.
-          # However, this file will only change when dependency structure
-          # changes, so shouldn't change too much.
-          # See blink/Source/bindings/core/v8/generated.gyp for more info
-          '<(interfaces_info_combined_pickle)',
-
-          # Similarly, all files are rebuilt if a partial interface or
-          # right side of 'implements' changes.
-          # See blink/Source/bindings/core/v8/generated.gyp for more info
-          '<@(dependency_idl_files)',
-
-          # Also add as a dependency the set of unsupported IDL files.
-          '<@(unsupported_interface_idl_files)',
-
-          # The generated constructors IDL is also a partial interface, and
-          # we need to rebuild if it is modified.
-          '<(global_constructors_generated_idl_file)',
-
-          # The whitelist of what extended attributes we support. If an attribute
-          # not in this list is encountered, it will cause an error in the
-          # pipeline.
-          '<(extended_attributes_file)',
-
-          # Forward declarations of conversion functions for generated types.
-          '<(generated_type_conversion_header_file)',
-        ],
-        'outputs': [
-          '<!@pymod_do_main(cobalt.build.path_conversion -s -p <(prefix)_ '
-              '-e cc -d <(generated_source_output_dir) -b <(DEPTH) <(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT))',
-          '<!@pymod_do_main(cobalt.build.path_conversion -s -p <(prefix)_ '
-              '-e h -d <(generated_source_output_dir) -b <(DEPTH) <(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT))'
-        ],
-        'action': [
-          'python2',
-          '<(idl_compiler_script)',
-          '--cache-dir',
-          '<(bindings_scripts_output_dir)',
-          '--output-dir',
-          '<(generated_source_output_dir)',
-          '--interfaces-info',
-          '<(interfaces_info_combined_pickle)',
-          '--component-info',
-          '<(component_info_pickle)',
-          '--extended-attributes',
-          '<(extended_attributes_file)',
-          '<(RULE_INPUT_PATH)',
-        ],
-        'message': 'Generating binding from <(RULE_INPUT_PATH)',
-      }],
-      # The target that depends on this will build the bindings source.
-      'direct_dependent_settings': {
-        'defines': [ '<@(bindings_defines)' ],
-        'include_dirs': [
-          '<@(bindings_include_dirs)',
-          '<(generated_source_output_dir)',
-        ],
-        'sources': [
-          '<@(generated_sources)',
-          '<@(generated_type_conversions)',
-        ],
-        'defines': [ '<@(bindings_defines)'],
-      }
-    },
-
-    {
-      # Based on the generated_bindings target above. Main difference is that
-      # this produces two .h files, and takes the dictionary idl files as input.
-      'target_name': 'generated_types',
-      'type': 'none',
-      'hard_dependency': 1,
-      'dependencies': [
-        'cached_jinja_templates',
-        'cached_lex_yacc_tables',
-        'global_constructors_idls',
-        'interfaces_info_overall',
-      ],
-      'sources': [
-        '<@(generated_header_idl_files)',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(generated_source_output_dir)',
-        ]
-      },
-      'rules': [{
-        'rule_name': 'binding',
-        'extension': 'idl',
-        'msvs_external_rule': 1,
-        'inputs': [
-          # Script source files, etc.
-          '<@(bindings_extra_inputs)',
-
-          # This file is global, so if it changes all files are rebuilt.
-          # However, this file will only change when dependency structure
-          # changes, so shouldn't change too much.
-          # See blink/Source/bindings/core/v8/generated.gyp for more info
-          '<(interfaces_info_combined_pickle)',
-
-          # Similarly, all files are rebuilt if a partial interface or
-          # right side of 'implements' changes.
-          # See blink/Source/bindings/core/v8/generated.gyp for more info
-          '<@(dependency_idl_files)',
-
-          # Also add as a dependency the set of unsupported IDL files.
-          '<@(unsupported_interface_idl_files)',
-
-          # The generated constructors IDL is also a partial interface, and
-          # we need to rebuild if it is modified.
-          '<(global_constructors_generated_idl_file)',
-
-          # The whitelist of what extended attributes we support. If an attribute
-          # not in this list is encountered, it will cause an error in the
-          # pipeline.
-          '<(extended_attributes_file)',
-        ],
-        'outputs': [
-          '<!@pymod_do_main(cobalt.build.path_conversion -s '
-              '-e h -d <(generated_source_output_dir) -b <(DEPTH) <(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT))',
-          '<!@pymod_do_main(cobalt.build.path_conversion -s -p <(prefix)_ '
-              '-e cc -d <(generated_source_output_dir) -b <(DEPTH) <(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT))'
-        ],
-        'action': [
-          'python2',
-          '<(idl_compiler_script)',
-          '--cache-dir',
-          '<(bindings_scripts_output_dir)',
-          '--output-dir',
-          '<(generated_source_output_dir)',
-          '--interfaces-info',
-          '<(interfaces_info_combined_pickle)',
-          '--component-info',
-          '<(component_info_pickle)',
-          '--extended-attributes',
-          '<(extended_attributes_file)',
-          '<(RULE_INPUT_PATH)',
-        ],
-        'message': 'Generating dictionary from <(RULE_INPUT_PATH)',
-      }],
-    },
-    {
-      # Create a target that depends on this target to compile the generated
-      # source files. There should be only one such target.
-      # Based on blink/Source/bindings/core/v8/generated.gyp:bindings_core_v8_generated_individual
-      'target_name': 'generated_type_conversion',
-      'type': 'none',
-      # The 'binding' rule generates .h files, so mark as hard_dependency, per:
-      # https://code.google.com/p/gyp/wiki/InputFormatReference#Linking_Dependencies
-      'hard_dependency': 1,
-      'dependencies': [
-        'cached_jinja_templates',
-        'cached_lex_yacc_tables',
-        'global_constructors_idls',
-        'interfaces_info_overall',
-        '<@(bindings_dependencies)',
-      ],
-      'export_dependent_settings': [
-        '<@(bindings_dependencies)',
-      ],
-      'sources': [
-        '<@(source_idl_files)',
-        '<@(generated_header_idl_files)',
-        'shared/idl_conditional_macros.h',
-      ],
-      'actions': [{
-        'action_name': 'generate_type_conversion_header',
-        'inputs': [
-          # Script source files, etc.
-          '<@(bindings_extra_inputs)',
-
-          # This file is global, so if it changes all files are rebuilt.
-          # However, this file will only change when dependency structure
-          # changes, so shouldn't change too much.
-          # See blink/Source/bindings/core/v8/generated.gyp for more info
-          '<(interfaces_info_combined_pickle)',
-
-          # Similarly, all files are rebuilt if a partial interface or
-          # right side of 'implements' changes.
-          # See blink/Source/bindings/core/v8/generated.gyp for more info
-          '<@(dependency_idl_files)',
-
-          # Also add as a dependency the set of unsupported IDL files.
-          '<@(unsupported_interface_idl_files)',
-
-          # The generated constructors IDL is also a partial interface, and
-          # we need to rebuild if it is modified.
-          '<(global_constructors_generated_idl_file)',
-
-          # The whitelist of what extended attributes we support. If an attribute
-          # not in this list is encountered, it will cause an error in the
-          # pipeline.
-          '<(extended_attributes_file)',
-        ],
-        'outputs': [
-          '<(generated_type_conversion_header_file)',
-        ],
-        'action': [
-          'python2',
-          '<(conversion_header_generator_script)',
-          '--cache-dir',
-          '<(bindings_scripts_output_dir)',
-          '--output-dir',
-          '<(generated_source_output_dir)',
-          '--interfaces-info',
-          '<(interfaces_info_combined_pickle)',
-          '--component-info',
-          '<(component_info_pickle)',
-        ],
-        'message': 'Generating generated type conversion header',
-      }],
-    },
-
-    {
-      # Based on blink/Source/bindings/core/generated.gyp:core_global_objects
-      'target_name': 'global_objects',
-      'variables': {
-        'idl_files': [
-          '<@(source_idl_files)', '<@(generated_header_idl_files)'
-        ],
-        'output_file': '<(bindings_scripts_output_dir)/GlobalObjects.pickle',
-      },
-      'includes': ['../../third_party/blink/Source/bindings/scripts/global_objects.gypi'],
-    },
-
-    {
-      # Based on blink/Source/bindings/core/generated.gyp:core_global_constructors_idls
-      'target_name': 'global_constructors_idls',
-      'dependencies': [
-        'global_objects',
-      ],
-      'variables': {
-        'idl_files': [
-          '<@(source_idl_files)',
-          '<@(unsupported_interface_idl_files)',
-        ],
-        'global_objects_file':
-          '<(bindings_scripts_output_dir)/GlobalObjects.pickle',
-        'global_names_idl_files': [
-          'Window',
-          '<(global_constructors_generated_idl_file)',
-        ],
-        'outputs': [
-          '<(global_constructors_generated_idl_file)',
-          '<(global_constructors_generated_header_file)',
-        ],
-      },
-      'includes': ['../../third_party/blink/Source/bindings/scripts/global_constructors.gypi'],
-    },
-
-    {
-      # Based on blink/Source/bindings/core/generated.gyp:interfaces_info_individual_core
-      'target_name': 'interfaces_info_individual',
-      'dependencies': [
-        'cached_lex_yacc_tables',
-        'global_constructors_idls',
-      ],
-      'variables': {
-        'static_idl_files': [
-          '<@(source_idl_files)',
-          '<@(generated_header_idl_files)',
-          '<@(dependency_idl_files)',
-          '<@(unsupported_interface_idl_files)'],
-        'generated_idl_files': ['<(global_constructors_generated_idl_file)'],
-        'component_info_file':'<(component_info_pickle)',
-        'interfaces_info_file': '<(interfaces_info_individual_pickle)',
-        'output_file': '<(interfaces_info_file)',
-        'cache_directory': '<(bindings_scripts_output_dir)',
-        'root_directory': '../..',
-      },
-      'includes': ['../../third_party/blink/Source/bindings/scripts/interfaces_info_individual.gypi'],
-    },
-
-    {
-      # Based on blink/Source/bindings/modules/generated.gyp:interfaces_info_overall
-      'target_name': 'interfaces_info_overall',
-      'dependencies': [
-          'interfaces_info_individual',
-      ],
-      'variables': {
-        'input_files': ['<(interfaces_info_individual_pickle)'],
-        'output_file': '<(interfaces_info_combined_pickle)',
-      },
-      'includes': ['../../third_party/blink/Source/bindings/scripts/interfaces_info_overall.gypi'],
-    },
-
-    {
-      # Borrowed from blink/Source/bindings/scripts/scripts.gyp:cached_lex_yacc_tables
-      'target_name': 'cached_lex_yacc_tables',
-      'type': 'none',
-      'actions': [{
-        'action_name': 'cache_lex_yacc_tables',
-        'inputs': [
-          '<@(idl_lexer_parser_files)',
-        ],
-        'outputs': [
-          '<(bindings_scripts_output_dir)/lextab.py',
-          '<(bindings_scripts_output_dir)/parsetab.pickle',
-        ],
-        'action': [
-          'python2',
-          '<(bindings_scripts_dir)/blink_idl_parser.py',
-          '<(bindings_scripts_output_dir)',
-        ],
-        'message': 'Caching PLY lex & yacc lex/parse tables',
-      }],
-    },
-    {
-      # Borrowed from blink/Source/bindings/scripts/scripts.gyp:cached_jinja_templates
-      'target_name': 'cached_jinja_templates',
-      'type': 'none',
-      'actions': [{
-        'action_name': 'cache_jinja_templates',
-        'inputs': [
-          '<@(jinja_module_files)',
-          '<(DEPTH)/cobalt/bindings/code_generator_cobalt.py',
-          '<(DEPTH)/cobalt/bindings/path_generator.py',
-          '<@(code_generator_template_files)',
-        ],
-        'outputs': [
-          '<(bindings_scripts_output_dir)/cached_jinja_templates.stamp',  # Dummy to track dependency
-        ],
-        'action': [
-          'python2',
-          '<(DEPTH)/cobalt/bindings/code_generator_cobalt.py',
-          '<(bindings_scripts_output_dir)',
-          '<(bindings_templates_dir)',
-          '<(bindings_scripts_output_dir)/cached_jinja_templates.stamp',
-        ],
-        'message': 'Caching bytecode of Jinja templates',
-      }],
-    },
-  ],
-}
diff --git a/cobalt/bindings/bindings_templates.gni b/cobalt/bindings/bindings_templates.gni
index 12f18ad..f990a8c 100644
--- a/cobalt/bindings/bindings_templates.gni
+++ b/cobalt/bindings/bindings_templates.gni
@@ -37,8 +37,7 @@
 # Template definitions.
 template("idl_compile") {
   action_foreach(target_name) {
-    script = "//starboard/build/run_bash.py"
-    py_script = engine_idl_compiler
+    script = engine_idl_compiler
 
     sources = invoker.sources
 
@@ -54,7 +53,6 @@
       _extended_attributes_file,
       invoker.component_info,
       invoker.interfaces_info,
-      py_script,
     ]
     inputs += _bindings_extra_inputs
 
@@ -73,8 +71,6 @@
     ]
 
     args = [
-      "python2",
-      rebase_path(py_script, root_build_dir),
       "--cache-directory",
       rebase_path(invoker.cache_directory),
       "--output-directory",
@@ -92,15 +88,13 @@
 
 template("generate_type_conversion") {
   action(target_name) {
-    script = "//starboard/build/run_bash.py"
-    py_script = engine_conversion_header_generator_script
+    script = engine_conversion_header_generator_script
 
     deps = invoker.deps
 
     public_deps = engine_dependencies
 
     inputs = [
-      py_script,
       _extended_attributes_file,
       invoker.global_names_idl_file,
       "//cobalt/bindings/shared/idl_conditional_macros.h",
@@ -113,8 +107,6 @@
     outputs = [ "${invoker.output_dir}/${generated_bindings_prefix}_gen_type_conversion.h" ]
 
     args = [
-      "python2",
-      rebase_path(py_script, root_build_dir),
       "--cache-directory",
       rebase_path(invoker.cache_directory, root_build_dir),
       "--output-dir",
@@ -129,13 +121,9 @@
 
 template("compute_global_objects") {
   action(target_name) {
-    script = "//starboard/build/run_bash.py"
-    py_script = "$bindings_scripts_dir/compute_global_objects.py"
+    script = "$bindings_scripts_dir/compute_global_objects.py"
 
-    inputs = [
-      py_script,
-      "$bindings_scripts_dir/utilities.py",
-    ]
+    inputs = [ "$bindings_scripts_dir/utilities.py" ]
     inputs += invoker.idl_files
 
     outputs = [ invoker.global_objects_file ]
@@ -144,8 +132,6 @@
     write_file(idl_files_list, rebase_path(invoker.idl_files, root_build_dir))
 
     args = [
-      "python2",
-      rebase_path(py_script, root_build_dir),
       "--idl-files-list",
       rebase_path(idl_files_list, root_build_dir),
       "--",
@@ -156,13 +142,11 @@
 
 template("compute_global_constructors_idls") {
   action(target_name) {
-    script = "//starboard/build/run_bash.py"
-    py_script = "$bindings_scripts_dir/generate_global_constructors.py"
+    script = "$bindings_scripts_dir/generate_global_constructors.py"
 
     deps = invoker.deps
 
     inputs = [
-      py_script,
       "$bindings_scripts_dir/utilities.py",
       invoker.global_objects_file,
     ]
@@ -179,8 +163,6 @@
     write_file(idl_files_list, rebase_path(invoker.idl_files, root_build_dir))
 
     args = [
-      "python2",
-      rebase_path(py_script, root_build_dir),
       "--idl-files-list",
       rebase_path(idl_files_list, root_build_dir),
       "--global-objects-file",
@@ -194,13 +176,11 @@
 
 template("compute_interfaces_info_individual") {
   action(target_name) {
-    script = "//starboard/build/run_bash.py"
-    py_script = "$bindings_scripts_dir/compute_interfaces_info_individual.py"
+    script = "$bindings_scripts_dir/compute_interfaces_info_individual.py"
 
     deps = invoker.deps
 
     inputs = [
-      py_script,
       "$bindings_scripts_dir/utilities.py",
       _extended_attributes_file,
       invoker.generated_idl_files,
@@ -221,8 +201,6 @@
         rebase_path(invoker.dependency_idl_files, root_build_dir)
     dependency_idl_files_list = string_join(" ", dependency_idl_files_paths)
     args = [
-      "python2",
-      rebase_path(py_script, root_build_dir),
       "--cache-directory",
       rebase_path(invoker.cache_directory, root_build_dir),
       "--root-directory",
@@ -247,21 +225,15 @@
 
 template("generate_interfaces_info_overall") {
   action(target_name) {
-    script = "//starboard/build/run_bash.py"
-    py_script = "$bindings_scripts_dir/compute_interfaces_info_overall.py"
+    script = "$bindings_scripts_dir/compute_interfaces_info_overall.py"
 
     deps = invoker.deps
 
-    inputs = [
-      py_script,
-      invoker.individual_interfaces_file,
-    ]
+    inputs = [ invoker.individual_interfaces_file ]
 
     outputs = [ invoker.combined_interfaces_file ]
 
     args = [
-      "python2",
-      rebase_path(py_script, root_build_dir),
       "--",
       rebase_path(invoker.individual_interfaces_file, root_build_dir),
       rebase_path(invoker.combined_interfaces_file, root_build_dir),
@@ -271,32 +243,23 @@
 
 template("cache_lex_tables") {
   action(target_name) {
-    script = "//starboard/build/run_bash.py"
-    py_script = "$bindings_scripts_dir/blink_idl_parser.py"
+    script = "$bindings_scripts_dir/blink_idl_parser.py"
 
-    inputs = [ py_script ]
-    inputs += idl_lexer_parser_files
-
+    inputs = idl_lexer_parser_files
     outputs = [
       "${invoker.output_dir}/lextab.py",
       "${invoker.output_dir}/parsetab.pickle",
     ]
 
-    args = [
-      "python2",
-      rebase_path(py_script, root_build_dir),
-      rebase_path(invoker.output_dir, root_build_dir),
-    ]
+    args = [ rebase_path(invoker.output_dir, root_build_dir) ]
   }
 }
 
 template("cache_templates") {
   action(target_name) {
-    script = "//starboard/build/run_bash.py"
-    py_script = "//cobalt/bindings/code_generator_cobalt.py"
+    script = "//cobalt/bindings/code_generator_cobalt.py"
 
     inputs = [
-      py_script,
       "//cobalt/bindings/path_generator.py",
       "//third_party/jinja2/__init__.py",
       "//third_party/markupsafe/__init__.py",  # jinja2 dep
@@ -333,8 +296,6 @@
     ]
 
     args = [
-      "python2",
-      rebase_path(py_script, root_build_dir),
       rebase_path("${invoker.output_dir}", root_build_dir),
       rebase_path("$engine_templates_dir", root_build_dir),
       rebase_path("${invoker.output_dir}/cached_jinja_templates.stamp",
diff --git a/cobalt/bindings/blink_variables.gni b/cobalt/bindings/blink_variables.gni
index d19986d..e5b4752 100644
--- a/cobalt/bindings/blink_variables.gni
+++ b/cobalt/bindings/blink_variables.gni
@@ -12,12 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Migrated from third_party/blink/Source/bindings/scripts/scripts.gypi
-######################################################################
 bindings_scripts_dir = "//third_party/blink/Source/bindings/scripts"
 
-# Migrated from third_party/blink/Source/bindings/scripts/scripts.gni
-#####################################################################
 idl_compiler_files = [
   "//third_party/blink/Source/bindings/scripts/idl_compiler.py",
 
diff --git a/cobalt/bindings/code_generator_cobalt.py b/cobalt/bindings/code_generator_cobalt.py
index 9305930..e82d1eb 100644
--- a/cobalt/bindings/code_generator_cobalt.py
+++ b/cobalt/bindings/code_generator_cobalt.py
@@ -77,9 +77,9 @@
       if (special in operation.specials and operation.arguments and
           str(operation.arguments[0].idl_type) == 'unsigned long'))
   assert len(special_operations) <= 1, (
-      'Multiple indexed %ss defined on interface: %s' % (special,
-                                                         interface.name))
-  return special_operations[0] if len(special_operations) else None
+      'Multiple indexed %ss defined on interface: %s' %
+      (special, interface.name))
+  return special_operations[0] if special_operations else None
 
 
 def get_indexed_property_getter(interface):
@@ -107,7 +107,7 @@
           str(operation.arguments[0].idl_type) == 'DOMString'))
   assert len(special_operations) <= 1, (
       'Multiple named %ss defined on interface: %s' % (special, interface.name))
-  return special_operations[0] if len(special_operations) else None
+  return special_operations[0] if special_operations else None
 
 
 def get_named_property_getter(interface):
@@ -186,8 +186,9 @@
   __metaclass__ = abc.ABCMeta
 
   def __init__(self, templates_dir, info_provider, cache_dir, output_dir):
-    super(CodeGeneratorCobalt, self).__init__(
-        'CodeGeneratorCobalt', info_provider, cache_dir, output_dir)
+    super(CodeGeneratorCobalt,
+          self).__init__('CodeGeneratorCobalt', info_provider, cache_dir,
+                         output_dir)
     # CodeGeneratorBase inititalizes this with the v8 template path, so
     # reinitialize it with cobalt's template path
 
@@ -196,15 +197,14 @@
     # cache was prepopulated.
     self.jinja_env = initialize_jinja_env(cache_dir,
                                           os.path.abspath(templates_dir))
-    self.path_builder = path_generator.PathBuilder(
-        self.generated_file_prefix, self.info_provider, cobalt_dir, output_dir)
+    self.path_builder = path_generator.PathBuilder(self.generated_file_prefix,
+                                                   self.info_provider,
+                                                   cobalt_dir, output_dir)
 
-  @abc.abstractproperty
   def generated_file_prefix(self):
     """The prefix to prepend to all generated source files."""
     pass
 
-  @abc.abstractproperty
   def expression_generator(self):
     """An instance that implements the ExpressionGenerator class."""
     pass
@@ -221,10 +221,9 @@
           definitions, definition_name, definitions.interfaces[definition_name])
     if definition_name in definitions.dictionaries:
       return self.generate_dictionary_code(
-          definitions, definition_name,
-          definitions.dictionaries[definition_name])
+          definition_name, definitions.dictionaries[definition_name])
     if definition_name in definitions.enumerations:
-      return self.generate_enum_code(definitions, definition_name,
+      return self.generate_enum_code(definition_name,
                                      definitions.enumerations[definition_name])
     raise ValueError('%s is not in IDL definitions' % definition_name)
 
@@ -249,15 +248,14 @@
     cc_path = self.path_builder.BindingsImplementationPath(interface_name)
     return (
         (header_path, header_text),
-        (cc_path, cc_text),)
+        (cc_path, cc_text),
+    )
 
-  def generate_dictionary_code(self, definitions, dictionary_name, dictionary):
+  def generate_dictionary_code(self, dictionary_name, dictionary):
     header_template_filename = 'dictionary.h.template'
     conversion_template_filename = 'dictionary-conversion.cc.template'
-    implementation_context = self.build_dictionary_context(
-        dictionary, definitions, False)
-    conversion_context = self.build_dictionary_context(dictionary, definitions,
-                                                       True)
+    implementation_context = self.build_dictionary_context(dictionary, False)
+    conversion_context = self.build_dictionary_context(dictionary, True)
 
     header_text = self.render_template(header_template_filename,
                                        implementation_context)
@@ -270,9 +268,10 @@
             dictionary_name))
     return (
         (header_path, header_text),
-        (conversion_impl_path, conversion_text),)
+        (conversion_impl_path, conversion_text),
+    )
 
-  def generate_enum_code(self, definitions, enumeration_name, enumeration):
+  def generate_enum_code(self, enumeration_name, enumeration):
     header_template_filename = 'enumeration.h.template'
     conversion_template_filename = 'enumeration-conversion.cc.template'
     context_builder = ContextBuilder(self.info_provider)
@@ -296,7 +295,8 @@
     )
     return (
         (header_path, header_text),
-        (conversion_impl_path, conversion_text),)
+        (conversion_impl_path, conversion_text),
+    )
 
   def generate_conversion_code(self):
     enumerations = list(self.info_provider.enumerations.keys())
@@ -378,9 +378,10 @@
             self.path_builder.NamespaceComponents(interface_name))
         conditional = interface_info['conditional']
         is_callback_interface = interface_name in IdlType.callback_interfaces
+        impl_name = interface_info.get('implemented_as') or interface_name
         referenced_classes.append({
             'fully_qualified_name':
-                '%s::%s' % (namespace, interface_name),
+                '%s::%s' % (namespace, impl_name),
             'include':
                 self.path_builder.ImplementationHeaderPath(interface_name),
             'conditional':
@@ -391,8 +392,8 @@
         if include_bindings_class:
           referenced_classes.append({
               'fully_qualified_name':
-                  '%s::%s' % (namespace,
-                              self.path_builder.BindingsClass(interface_name)),
+                  '%s::%s' %
+                  (namespace, self.path_builder.BindingsClass(impl_name)),
               'include':
                   self.path_builder.BindingsHeaderIncludePath(interface_name),
               'conditional':
@@ -406,7 +407,8 @@
     """Shared stuff."""
     # Make sure extension is .py, not .pyc or .pyo, so doesn't depend on caching
     module_path_pyname = os.path.join(
-        module_path, os.path.splitext(module_filename)[0] + '.py')
+        module_path,
+        os.path.splitext(module_filename)[0] + '.py')
 
     # Ensure that posix forward slashes are used
     context = {
@@ -421,7 +423,7 @@
     }
     return context
 
-  def build_dictionary_context(self, dictionary, definitions, for_conversion):
+  def build_dictionary_context(self, dictionary, for_conversion):
     context_builder = ContextBuilder(self.info_provider)
     context = {
         'class_name':
@@ -445,8 +447,8 @@
     referenced_class_contexts = self.referenced_class_contexts(
         referenced_interface_names, for_conversion)
 
-    context['includes'] = sorted(interface['include']
-                                 for interface in referenced_class_contexts)
+    context['includes'] = sorted(
+        interface['include'] for interface in referenced_class_contexts)
     context['forward_declarations'] = sorted(
         referenced_class_contexts, key=lambda x: x['fully_qualified_name'])
     context['components'] = self.path_builder.NamespaceComponents(
@@ -455,27 +457,29 @@
 
   def build_interface_context(self, interface, interface_info, definitions):
     context_builder = ContextBuilder(self.info_provider)
+    impl_class = interface.extended_attributes.get('ImplementedAs',
+                                                   interface.name)
 
     context = {
         # Parameters used for template rendering.
         'today':
             date.today(),
         'binding_class':
-            self.path_builder.BindingsClass(interface.name),
+            self.path_builder.BindingsClass(impl_class),
         'fully_qualified_binding_class':
-            self.path_builder.FullBindingsClassName(interface.name),
+            self.path_builder.FullBindingsClassName(impl_class, interface.name),
         'header_file':
             self.path_builder.BindingsHeaderIncludePath(interface.name),
         'impl_class':
-            interface.name,
+            impl_class,
         'fully_qualified_impl_class':
-            self.path_builder.FullClassName(interface.name),
+            self.path_builder.FullClassName(impl_class, interface.name),
         'interface_name':
             interface.name,
         'is_global_interface':
             is_global_interface(interface),
-        'has_interface_object': (
-            'NoInterfaceObject' not in interface.extended_attributes),
+        'has_interface_object': ('NoInterfaceObject'
+                                 not in interface.extended_attributes),
         'conditional':
             interface.extended_attributes.get('Conditional', None),
     }
@@ -543,9 +547,12 @@
           interface_name not in IdlType.enums and
           not interfaces_info[interface_name]['unsupported'] and
           not interfaces_info[interface_name]['is_dictionary']):
+        interface_info = interfaces_info[interface_name]
         all_interfaces.append({
+            'impl_name': (interface_info.get('implemented_as') or
+                          interface_name),
             'name': interface_name,
-            'conditional': interfaces_info[interface_name]['conditional'],
+            'conditional': interface_info['conditional'],
         })
 
     context['implementation_includes'] = sorted(
@@ -599,11 +606,11 @@
     context['supports_indexed_properties'] = (
         context['indexed_property_getter'] or
         context['indexed_property_setter'])
-    context['supports_named_properties'] = (context['named_property_setter'] or
-                                            context['named_property_getter'] or
-                                            context['named_property_deleter'])
+    context['supports_named_properties'] = (
+        context['named_property_setter'] or context['named_property_getter'] or
+        context['named_property_deleter'])
 
-    names = sorted([key for key in interfaces_info])
+    names = sorted(list(interfaces_info))
     context['unique_id'] = names.index(interface.name)
 
     return context
@@ -619,7 +626,7 @@
     templates_dir = argv[2]
     dummy_filename = argv[3]
   except IndexError:
-    print 'Usage: %s CACHE_DIR TEMPLATES_DIR DUMMY_FILENAME' % argv[0]
+    print('Usage: %s CACHE_DIR TEMPLATES_DIR DUMMY_FILENAME' % argv[0])
     return 1
 
   # Delete all jinja2 .cache files, since they will get regenerated anyways.
@@ -636,15 +643,13 @@
   # cache here and when it's read during code generation.
   jinja_env = initialize_jinja_env(cache_dir, os.path.abspath(templates_dir))
   template_filenames = [
-      filename
-      for filename in os.listdir(templates_dir)
+      filename for filename in os.listdir(templates_dir)
       # Skip .svn, directories, etc.
       if filename.endswith(('.template'))
   ]
   assert template_filenames, 'Expected at least one template to be cached.'
   shared_template_filenames = [
-      filename
-      for filename in os.listdir(SHARED_TEMPLATES_DIR)
+      filename for filename in os.listdir(SHARED_TEMPLATES_DIR)
       # Skip .svn, directories, etc.
       if filename.endswith(('.template'))
   ]
diff --git a/cobalt/bindings/contexts.py b/cobalt/bindings/contexts.py
index b61ca73..c61b3cf 100644
--- a/cobalt/bindings/contexts.py
+++ b/cobalt/bindings/contexts.py
@@ -19,15 +19,15 @@
 """
 
 import _env  # pylint: disable=unused-import
+from cobalt.bindings.name_conversion import capitalize_function_name
+from cobalt.bindings.name_conversion import convert_to_cobalt_constant_name
+from cobalt.bindings.name_conversion import convert_to_cobalt_enumeration_value
+from cobalt.bindings.name_conversion import convert_to_cobalt_name
+from cobalt.bindings.name_conversion import get_interface_name
+from cobalt.bindings.overload_context import get_overload_contexts
 from idl_definitions import IdlTypedef
 from idl_types import IdlPromiseType
 from idl_types import IdlSequenceType
-from name_conversion import capitalize_function_name
-from name_conversion import convert_to_cobalt_constant_name
-from name_conversion import convert_to_cobalt_enumeration_value
-from name_conversion import convert_to_cobalt_name
-from name_conversion import get_interface_name
-from overload_context import get_overload_contexts
 from v8_attributes import is_constructor_attribute
 from v8_interface import method_overloads_by_name
 import v8_utilities
@@ -200,7 +200,7 @@
     elif extended_attributes.get('TreatUndefinedAs', '') == 'EmptyString':
       flags.append('kConversionFlagTreatUndefinedAsEmptyString')
 
-  if extended_attributes.has_key('Clamp'):
+  if 'Clamp' in extended_attributes:
     flags.append('kConversionFlagClamped')
 
   if is_object_type(idl_type):
@@ -262,6 +262,13 @@
     return '::cobalt::script::UnionType%d<%s >' % (len(cobalt_types),
                                                    ', '.join(cobalt_types))
 
+  def get_implemented_interface_name(self, idl_type):
+    interface_name = get_interface_name(idl_type)
+    interface_info = self.info_provider.interfaces_info.get(interface_name)
+    name = (interface_info['implemented_as']
+            if interface_info else None) or interface_name
+    return name
+
   def idl_type_to_cobalt_type(self, idl_type):
     """Map IDL type to C++ type."""
     assert not isinstance(idl_type, IdlTypedef)
@@ -272,9 +279,10 @@
       cobalt_type = idl_string_type_to_cobalt(idl_type)
     elif idl_type.is_callback_interface:
       cobalt_type = '::cobalt::script::CallbackInterfaceTraits<%s >' % (
-          get_interface_name(idl_type))
+          self.get_implemented_interface_name(idl_type))
     elif idl_type.is_interface_type:
-      cobalt_type = 'scoped_refptr<%s>' % get_interface_name(idl_type)
+      cobalt_type = 'scoped_refptr<%s>' % self.get_implemented_interface_name(
+          idl_type)
     elif idl_type.is_union_type:
       cobalt_type = self.idl_union_type_to_cobalt(idl_type)
     elif idl_type.is_enum:
@@ -306,7 +314,8 @@
     """Map type of IDL TypedObject to C++ type."""
     idl_type = self.resolve_typedef(typed_object.idl_type)
     if idl_type.is_callback_function:
-      cobalt_type = interface.name + '::' + get_interface_name(idl_type)
+      cobalt_type = interface.name + '::' + self.get_implemented_interface_name(
+          idl_type)
     else:
       cobalt_type = self.idl_type_to_cobalt_type(idl_type)
     if getattr(typed_object, 'is_variadic', False):
@@ -379,8 +388,9 @@
     context = {
         'call_with':
             interface.extended_attributes.get('ConstructorCallWith', None),
-        'raises_exception': (interface.extended_attributes.get(
-            'RaisesException', None) == 'Constructor'),
+        'raises_exception':
+            (interface.extended_attributes.get('RaisesException',
+                                               None) == 'Constructor'),
     }
 
     context.update(self.partial_context(interface, constructor))
@@ -389,28 +399,17 @@
   def method_context(self, interface, operation):
     """Create template values for generating method bindings."""
     context = {
-        'idl_name':
-            operation.name,
-        'name':
-            capitalize_function_name(operation.name),
-        'type':
-            self.typed_object_to_cobalt_type(interface, operation),
-        'is_static':
-            operation.is_static,
-        'on_instance':
-            v8_utilities.on_instance(interface, operation),
-        'on_interface':
-            v8_utilities.on_interface(interface, operation),
-        'on_prototype':
-            v8_utilities.on_prototype(interface, operation),
-        'call_with':
-            operation.extended_attributes.get('CallWith', None),
-        'raises_exception':
-            operation.extended_attributes.has_key('RaisesException'),
-        'conditional':
-            operation.extended_attributes.get('Conditional', None),
-        'unsupported':
-            'NotSupported' in operation.extended_attributes,
+        'idl_name': operation.name,
+        'name': capitalize_function_name(operation.name),
+        'type': self.typed_object_to_cobalt_type(interface, operation),
+        'is_static': operation.is_static,
+        'on_instance': v8_utilities.on_instance(interface, operation),
+        'on_interface': v8_utilities.on_interface(interface, operation),
+        'on_prototype': v8_utilities.on_prototype(interface, operation),
+        'call_with': operation.extended_attributes.get('CallWith', None),
+        'raises_exception': 'RaisesException' in operation.extended_attributes,
+        'conditional': operation.extended_attributes.get('Conditional', None),
+        'unsupported': 'NotSupported' in operation.extended_attributes,
     }
     context.update(self.partial_context(interface, operation))
     return context
@@ -458,10 +457,8 @@
       cobalt_name = 'AnonymousNamed%s' % function_suffix[special_type]
 
     context = {
-        'name':
-            cobalt_name,
-        'raises_exception':
-            operation.extended_attributes.has_key('RaisesException'),
+        'name': cobalt_name,
+        'raises_exception': 'RaisesException' in operation.extended_attributes,
     }
 
     if special_type in ('getter', 'deleter'):
@@ -502,7 +499,7 @@
         'call_with':
             attribute.extended_attributes.get('CallWith', None),
         'raises_exception':
-            attribute.extended_attributes.has_key('RaisesException'),
+            'RaisesException' in attribute.extended_attributes,
         'conversion_flags':
             get_conversion_flags(
                 self.resolve_typedef(attribute.idl_type),
@@ -525,13 +522,17 @@
           if a.name == forwarded_attribute_name
       ]
       assert len(matching_attributes) == 1
-      context['put_forwards'] = self.attribute_context(
-          forwarded_interface, matching_attributes[0], definitions)
+      context['put_forwards'] = self.attribute_context(forwarded_interface,
+                                                       matching_attributes[0],
+                                                       definitions)
     context[
         'has_setter'] = not attribute.is_read_only or forwarded_attribute_name
     if is_constructor_attribute(attribute):
+      interface_name = get_interface_name(attribute.idl_type)
+      impl_class = self.get_implemented_interface_name(attribute.idl_type)
       context['is_constructor_attribute'] = True
-      context['interface_name'] = get_interface_name(attribute.idl_type)
+      context['interface_name'] = interface_name
+      context['impl_class'] = impl_class
       # Blink's IDL parser uses the convention that attributes ending with
       # 'ConstructorConstructor' are for Named Constructors.
       context['is_named_constructor_attribute'] = (
diff --git a/cobalt/bindings/flatten_idls_test.py b/cobalt/bindings/flatten_idls_test.py
index a0f5317..2eef9f9 100644
--- a/cobalt/bindings/flatten_idls_test.py
+++ b/cobalt/bindings/flatten_idls_test.py
@@ -13,7 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
 """Unit tests for FlattenedInterface class."""
 
 import os
@@ -21,7 +20,7 @@
 import unittest
 
 import _env  # pylint: disable=unused-import
-import flatten_idls
+from cobalt.bindings import flatten_idls
 
 
 def _TestDataPath():
@@ -36,6 +35,7 @@
 
 @unittest.skip('Test has bitrotted.')
 class FlattenedInterfacesTest(unittest.TestCase):
+  # pylint: disable=protected-access
 
   def testFlattenIdl(self):
     test_idls = ['TestInterface.idl']
@@ -58,8 +58,8 @@
     result = flatten_idls._FlattenInterfaces(_TestDataPathGenerator(test_idls))
     self.assertEqual(1, len(result))
     self.assertEqual('NamedConstructorInterface', result[0].name)
-    self.assertItemsEqual(
-        ['Apple', 'NamedConstructorInterface'], result[0].constructors)
+    self.assertItemsEqual(['Apple', 'NamedConstructorInterface'],
+                          result[0].constructors)
 
   def testNamedConstructorWithNoInterfaceObject(self):
     test_idls = ['NamedConstructorInterfaceWithNoInterfaceObject.idl']
@@ -88,16 +88,18 @@
 class FlattenedInterfaceDifferenceTest(unittest.TestCase):
 
   def testAssertsOnDifferentInterfaces(self):
-    lhs = flatten_idls.FlattenedInterface(name='Toyota',
-                                          operations=[],
-                                          attributes=[],
-                                          constants=[],
-                                          constructors=[])
-    rhs = flatten_idls.FlattenedInterface(name='Honda',
-                                          operations=[],
-                                          attributes=[],
-                                          constants=[],
-                                          constructors=[])
+    lhs = flatten_idls.FlattenedInterface(
+        name='Toyota',
+        operations=[],
+        attributes=[],
+        constants=[],
+        constructors=[])
+    rhs = flatten_idls.FlattenedInterface(
+        name='Honda',
+        operations=[],
+        attributes=[],
+        constants=[],
+        constructors=[])
     with self.assertRaises(AssertionError):
       flatten_idls.FlattenedInterface.Difference(lhs, rhs)
 
diff --git a/cobalt/bindings/generate_conversion_header.py b/cobalt/bindings/generate_conversion_header.py
index fa43994..69d0c1e 100644
--- a/cobalt/bindings/generate_conversion_header.py
+++ b/cobalt/bindings/generate_conversion_header.py
@@ -17,7 +17,7 @@
 JavaScript values.
 """
 
-from optparse import OptionParser
+from optparse import OptionParser  # pylint: disable=deprecated-module
 import os
 import pickle
 
@@ -26,9 +26,9 @@
 
 
 def create_component_info_provider(interfaces_info_path, component_info_path):
-  with open(os.path.join(interfaces_info_path)) as interface_info_file:
+  with open(os.path.join(interfaces_info_path), 'rb') as interface_info_file:
     interfaces_info = pickle.load(interface_info_file)
-  with open(os.path.join(component_info_path)) as component_info_file:
+  with open(os.path.join(component_info_path), 'rb') as component_info_file:
     component_info = pickle.load(component_info_file)
   return ComponentInfoProviderCobalt(interfaces_info, component_info)
 
diff --git a/cobalt/bindings/idl_compiler_cobalt.py b/cobalt/bindings/idl_compiler_cobalt.py
index e9f0079..da34fe7 100644
--- a/cobalt/bindings/idl_compiler_cobalt.py
+++ b/cobalt/bindings/idl_compiler_cobalt.py
@@ -17,7 +17,7 @@
 third_party/blink/Source/bindings/scripts/idl_compiler.py.
 """
 
-from optparse import OptionParser
+from optparse import OptionParser  # pylint: disable=deprecated-module
 import os
 import pickle
 
@@ -29,9 +29,9 @@
 
 
 def create_component_info_provider(interfaces_info_path, component_info_path):
-  with open(os.path.join(interfaces_info_path)) as interface_info_file:
+  with open(os.path.join(interfaces_info_path), 'rb') as interface_info_file:
     interfaces_info = pickle.load(interface_info_file)
-  with open(os.path.join(component_info_path)) as component_info_file:
+  with open(os.path.join(component_info_path), 'rb') as component_info_file:
     component_info = pickle.load(component_info_file)
   return ComponentInfoProviderCobalt(interfaces_info, component_info)
 
@@ -52,13 +52,15 @@
   if options.output_directory is None:
     parser.error('Must specify output directory using --output-directory.')
   if len(args) != 1:
-    parser.error('Must specify exactly 1 input file as argument, but %d given.'
-                 % len(args))
+    parser.error(
+        'Must specify exactly 1 input file as argument, but %d given.' %
+        len(args))
   idl_filename = os.path.realpath(args[0])
   return options, idl_filename
 
 
 class IdlCompilerCobalt(IdlCompiler):
+  """IDL Compiler for Cobalt."""
 
   def __init__(self, *args, **kwargs):
     IdlCompiler.__init__(self, *args, **kwargs)
@@ -70,7 +72,7 @@
     # care about components in Cobalt.
     assert len(definitions) == 1
     output_code_list = self.code_generator.generate_code(
-        definitions.values()[0], interface_name)
+        list(definitions.values())[0], interface_name)
 
     # Generator may choose to omit the file.
     if output_code_list is None:
diff --git a/cobalt/bindings/overload_context.py b/cobalt/bindings/overload_context.py
index 5a374d2..e44d989 100644
--- a/cobalt/bindings/overload_context.py
+++ b/cobalt/bindings/overload_context.py
@@ -147,9 +147,9 @@
 
   # Extract argument and IDL type to simplify accessing these in each loop.
   arguments = [method['arguments'][index] for method in methods]
-  arguments_methods = zip(arguments, methods)
+  arguments_methods = list(zip(arguments, methods))
   idl_types = [argument['idl_type_object'] for argument in arguments]
-  idl_types_methods = zip(idl_types, methods)
+  idl_types_methods = list(zip(idl_types, methods))
 
   # We can't do a single loop through all methods or simply sort them, because
   # a method may be listed in multiple steps of the resolution algorithm, and
diff --git a/cobalt/bindings/path_generator.py b/cobalt/bindings/path_generator.py
index e058f29..192ff59 100644
--- a/cobalt/bindings/path_generator.py
+++ b/cobalt/bindings/path_generator.py
@@ -15,6 +15,7 @@
 
 import os
 
+from cobalt.bindings.name_conversion import convert_to_cobalt_name
 from cobalt.build.path_conversion import ConvertPath
 
 
@@ -58,7 +59,7 @@
       enum_info = self.info_provider.enumerations[interface_name]
       idl_path = enum_info['full_path']
     else:
-      raise KeyError('Unknown interface name %s', interface_name)
+      raise KeyError('Unknown interface name %s' % interface_name)
 
     rel_idl_path = os.path.relpath(idl_path, self.interfaces_root)
     components = os.path.dirname(rel_idl_path).split(os.sep)
@@ -67,8 +68,9 @@
     # we treat it as an extension IDL.
     real_interfaces_root = os.path.realpath(self.interfaces_root)
     real_idl_path = os.path.realpath(os.path.dirname(idl_path))
-    interfaces_root_is_in_components_path = (os.path.commonprefix(
-        [real_interfaces_root, real_idl_path]) == real_interfaces_root)
+    interfaces_root_is_in_components_path = (
+        os.path.commonprefix([real_interfaces_root,
+                              real_idl_path]) == real_interfaces_root)
 
     if interfaces_root_is_in_components_path:
       return [os.path.basename(self.interfaces_root)] + components
@@ -86,22 +88,27 @@
     """Get the name of the generated bindings class."""
     return self.engine_prefix.capitalize() + interface_name
 
-  def FullBindingsClassName(self, interface_name):
+  def FullBindingsClassName(self, impl_name, interface_name):
     """Get the fully qualified name of the generated bindings class."""
     return '%s::%s' % (self.Namespace(interface_name),
-                       self.BindingsClass(interface_name))
+                       self.BindingsClass(impl_name))
 
-  def FullClassName(self, interface_name):
+  def FullClassName(self, impl_name, interface_name=None):
     """Get the fully qualified name of the implementation class."""
+    interface_name = interface_name or impl_name
     components = self.NamespaceComponents(interface_name)
-    return '::'.join(components + [interface_name])
+    return '::'.join(components + [impl_name])
 
   def ImplementationHeaderPath(self, interface_name):
     """Get an #include path to the interface's implementation .h file."""
     interface_info = self.interfaces_info[interface_name]
     path = ConvertPath(
         interface_info['full_path'], forward_slashes=True, output_extension='h')
-    return os.path.relpath(path, os.path.dirname(self.interfaces_root))
+    dirname = os.path.dirname(
+        os.path.relpath(path, os.path.dirname(self.interfaces_root)))
+    name = convert_to_cobalt_name(
+        interface_info.get('implemented_as') or interface_name)
+    return dirname + '/' + name + '.h'
 
   def BindingsHeaderIncludePath(self, interface_name):
     """Get an #include path to the interface's generated .h file."""
diff --git a/cobalt/bindings/path_generator_test.py b/cobalt/bindings/path_generator_test.py
index 6ac518c..a819b45 100644
--- a/cobalt/bindings/path_generator_test.py
+++ b/cobalt/bindings/path_generator_test.py
@@ -12,10 +12,10 @@
 # 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.
+"""Path generator unit tests."""
 
 import unittest
 
-import _env  # pylint: disable=unused-import
 from cobalt.bindings.path_generator import PathBuilder
 
 
@@ -42,7 +42,8 @@
 
   def testFullBindingsClass(self):
     self.assertEqual(
-        self.path_builder.FullBindingsClassName('TestInterface'),
+        self.path_builder.FullBindingsClassName('TestInterface',
+                                                'TestInterface'),
         'root::this::is::a::PreTestInterface')
 
   def testFullClass(self):
diff --git a/cobalt/bindings/shared/idl_conditional_macros.h b/cobalt/bindings/shared/idl_conditional_macros.h
index 8eac582..3dd9d74 100644
--- a/cobalt/bindings/shared/idl_conditional_macros.h
+++ b/cobalt/bindings/shared/idl_conditional_macros.h
@@ -23,12 +23,9 @@
 // Conditionals that are dependent on Starboard feature macros that get defined
 // in header files.
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 // This is used to conditionally define the On Screen Keyboard interface and
 // attribute.
 #define COBALT_ENABLE_ON_SCREEN_KEYBOARD
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
 // This is used to conditionally define setMaxVideoCapabilities() in
 // HTMLVideoElement.
diff --git a/cobalt/bindings/testing/BUILD.gn b/cobalt/bindings/testing/BUILD.gn
index ca902da..a1c5e2c 100644
--- a/cobalt/bindings/testing/BUILD.gn
+++ b/cobalt/bindings/testing/BUILD.gn
@@ -53,6 +53,7 @@
   "arbitrary_interface.idl",
   "base_interface.idl",
   "boolean_type_test_interface.idl",
+  "bytestring_type_test_interface.idl",
   "callback_function_interface.idl",
   "callback_interface_interface.idl",
   "conditional_interface.idl",
@@ -71,6 +72,7 @@
   "extended_idl_attributes_interface.idl",
   "garbage_collection_test_interface.idl",
   "global_interface_parent.idl",
+  "implemented_as_interface.idl",
   "indexed_getter_interface.idl",
   "interface_with_any.idl",
   "interface_with_any_dictionary.idl",
@@ -151,6 +153,7 @@
     "any_dictionary_bindings_test.cc",
     "array_buffers_test.cc",
     "boolean_type_bindings_test.cc",
+    "bytestring_type_bindings_test.cc",
     "callback_function_test.cc",
     "callback_interface_test.cc",
     "conditional_attribute_test.cc",
@@ -169,6 +172,7 @@
     "get_own_property_descriptor.cc",
     "getter_setter_test.cc",
     "global_interface_bindings_test.cc",
+    "implemented_as_interface_test.cc",
     "interface_object_test.cc",
     "nullable_types_bindings_test.cc",
     "numeric_type_bindings_test.cc",
diff --git a/cobalt/bindings/testing/bindings_test_base.h b/cobalt/bindings/testing/bindings_test_base.h
index f8a0ba8..c23cb13 100644
--- a/cobalt/bindings/testing/bindings_test_base.h
+++ b/cobalt/bindings/testing/bindings_test_base.h
@@ -47,18 +47,18 @@
 class BindingsTestBase : public ::testing::Test {
  protected:
   BindingsTestBase()
-      : environment_settings_(new script::EnvironmentSettings),
-        engine_(script::JavaScriptEngine::CreateEngine()),
+      : engine_(script::JavaScriptEngine::CreateEngine()),
         global_environment_(engine_->CreateGlobalEnvironment()),
+        environment_settings_(new script::EnvironmentSettings()),
         window_(new Window()) {
     global_environment_->CreateGlobalObject(window_,
                                             environment_settings_.get());
   }
 
   explicit BindingsTestBase(const scoped_refptr<Window> window)
-      : environment_settings_(new script::EnvironmentSettings),
-        engine_(script::JavaScriptEngine::CreateEngine()),
+      : engine_(script::JavaScriptEngine::CreateEngine()),
         global_environment_(engine_->CreateGlobalEnvironment()),
+        environment_settings_(new script::EnvironmentSettings()),
         window_(window) {
     global_environment_->CreateGlobalObject(window_,
                                             environment_settings_.get());
@@ -89,9 +89,9 @@
 
  protected:
   base::test::ScopedTaskEnvironment task_env_;
-  const std::unique_ptr<script::EnvironmentSettings> environment_settings_;
   const std::unique_ptr<script::JavaScriptEngine> engine_;
   const scoped_refptr<script::GlobalEnvironment> global_environment_;
+  const std::unique_ptr<script::EnvironmentSettings> environment_settings_;
   const scoped_refptr<Window> window_;
 };
 
diff --git a/cobalt/bindings/testing/bytestring_type_bindings_test.cc b/cobalt/bindings/testing/bytestring_type_bindings_test.cc
new file mode 100644
index 0000000..929b84e
--- /dev/null
+++ b/cobalt/bindings/testing/bytestring_type_bindings_test.cc
@@ -0,0 +1,56 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/bindings/testing/bindings_test_base.h"
+#include "cobalt/bindings/testing/bytestring_type_test_interface.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::Return;
+
+namespace cobalt {
+namespace bindings {
+namespace testing {
+
+namespace {
+typedef InterfaceBindingsTest<BytestringTypeTestInterface>
+    BytestringTypeBindingsTest;
+}  // namespace
+
+TEST_F(BytestringTypeBindingsTest, BytestringReturnValue) {
+  EXPECT_TRUE(
+      EvaluateScript("var result = test.bytestringReturnOperation();", NULL));
+
+  std::string result;
+  EXPECT_TRUE(EvaluateScript("typeof result;", &result));
+  EXPECT_STREQ("string", result.c_str());
+
+  EXPECT_TRUE(EvaluateScript("result;", &result));
+  EXPECT_STREQ("\001\002\003", result.c_str());
+}
+
+TEST_F(BytestringTypeBindingsTest, BytestringArgumentOperation) {
+  EXPECT_TRUE(EvaluateScript(
+      "var result = test.bytestringArgumentOperation('byteString');", NULL));
+
+  std::string result;
+  EXPECT_TRUE(EvaluateScript("typeof result;", &result));
+  EXPECT_STREQ("string", result.c_str());
+
+  EXPECT_TRUE(EvaluateScript("result;", &result));
+  EXPECT_STREQ("byteString", result.c_str());
+}
+
+}  // namespace testing
+}  // namespace bindings
+}  // namespace cobalt
diff --git a/cobalt/bindings/testing/bytestring_type_test_interface.h b/cobalt/bindings/testing/bytestring_type_test_interface.h
new file mode 100644
index 0000000..bea1005
--- /dev/null
+++ b/cobalt/bindings/testing/bytestring_type_test_interface.h
@@ -0,0 +1,43 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_BINDINGS_TESTING_BYTESTRING_TYPE_TEST_INTERFACE_H_
+#define COBALT_BINDINGS_TESTING_BYTESTRING_TYPE_TEST_INTERFACE_H_
+
+#include <vector>
+
+#include "cobalt/script/wrappable.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace cobalt {
+namespace bindings {
+namespace testing {
+
+class BytestringTypeTestInterface : public script::Wrappable {
+ public:
+  std::vector<uint8_t> BytestringReturnOperation() {
+    return std::vector<uint8_t>{1, 2, 3};
+  }
+  std::vector<uint8_t> BytestringArgumentOperation(std::vector<uint8_t> arg1) {
+    return arg1;
+  }
+
+  DEFINE_WRAPPABLE_TYPE(BytestringTypeTestInterface);
+};
+
+}  // namespace testing
+}  // namespace bindings
+}  // namespace cobalt
+
+#endif  // COBALT_BINDINGS_TESTING_BYTESTRING_TYPE_TEST_INTERFACE_H_
diff --git a/cobalt/bindings/testing/bytestring_type_test_interface.idl b/cobalt/bindings/testing/bytestring_type_test_interface.idl
new file mode 100644
index 0000000..9b486ea
--- /dev/null
+++ b/cobalt/bindings/testing/bytestring_type_test_interface.idl
@@ -0,0 +1,18 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+interface BytestringTypeTestInterface {
+  ByteString bytestringReturnOperation();
+  ByteString bytestringArgumentOperation(ByteString arg1);
+};
diff --git a/cobalt/bindings/testing/implemented_as_interface.h b/cobalt/bindings/testing/implemented_as_interface.h
new file mode 100644
index 0000000..de7962f
--- /dev/null
+++ b/cobalt/bindings/testing/implemented_as_interface.h
@@ -0,0 +1,37 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_BINDINGS_TESTING_IMPLEMENTED_AS_INTERFACE_H_
+#define COBALT_BINDINGS_TESTING_IMPLEMENTED_AS_INTERFACE_H_
+
+#include <string>
+
+#include "cobalt/script/wrappable.h"
+
+namespace cobalt {
+namespace bindings {
+namespace testing {
+
+class ImplementedAsInterface : public script::Wrappable {
+ public:
+  std::string ImplementedAsInterfaceFunction() { return "bar"; }
+
+  DEFINE_WRAPPABLE_TYPE(ImplementedAsInterface);
+};
+
+}  // namespace testing
+}  // namespace bindings
+}  // namespace cobalt
+
+#endif  // COBALT_BINDINGS_TESTING_IMPLEMENTED_AS_INTERFACE_H_
diff --git a/cobalt/bindings/testing/implemented_as_interface.idl b/cobalt/bindings/testing/implemented_as_interface.idl
new file mode 100644
index 0000000..e150b74
--- /dev/null
+++ b/cobalt/bindings/testing/implemented_as_interface.idl
@@ -0,0 +1,18 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+[ImplementedAs = ImplementedAsOtherInterface]
+interface ImplementedAsInterface {
+  DOMString implementedAsInterfaceFunction();
+};
diff --git a/cobalt/bindings/testing/implemented_as_interface_test.cc b/cobalt/bindings/testing/implemented_as_interface_test.cc
new file mode 100644
index 0000000..611a6f4
--- /dev/null
+++ b/cobalt/bindings/testing/implemented_as_interface_test.cc
@@ -0,0 +1,39 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/bindings/testing/bindings_test_base.h"
+#include "cobalt/bindings/testing/implemented_as_other_interface.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::Return;
+
+namespace cobalt {
+namespace bindings {
+namespace testing {
+
+namespace {
+typedef InterfaceBindingsTest<ImplementedAsOtherInterface>
+    ImplementedAsInterfaceTest;
+}  // namespace
+
+TEST_F(ImplementedAsInterfaceTest, ImplementedAsInterfaceFunctionExists) {
+  std::string result;
+  EXPECT_TRUE(
+      EvaluateScript("test.implementedAsInterfaceFunction();", &result));
+  EXPECT_STREQ("foo", result.c_str());
+}
+
+}  // namespace testing
+}  // namespace bindings
+}  // namespace cobalt
diff --git a/cobalt/bindings/testing/implemented_as_other_interface.h b/cobalt/bindings/testing/implemented_as_other_interface.h
new file mode 100644
index 0000000..b594743
--- /dev/null
+++ b/cobalt/bindings/testing/implemented_as_other_interface.h
@@ -0,0 +1,37 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_BINDINGS_TESTING_IMPLEMENTED_AS_OTHER_INTERFACE_H_
+#define COBALT_BINDINGS_TESTING_IMPLEMENTED_AS_OTHER_INTERFACE_H_
+
+#include <string>
+
+#include "cobalt/script/wrappable.h"
+
+namespace cobalt {
+namespace bindings {
+namespace testing {
+
+class ImplementedAsOtherInterface : public script::Wrappable {
+ public:
+  std::string ImplementedAsInterfaceFunction() { return "foo"; }
+
+  DEFINE_WRAPPABLE_TYPE(ImplementedAsOtherInterface);
+};
+
+}  // namespace testing
+}  // namespace bindings
+}  // namespace cobalt
+
+#endif  // COBALT_BINDINGS_TESTING_IMPLEMENTED_AS_OTHER_INTERFACE_H_
diff --git a/cobalt/bindings/testing/testing.gyp b/cobalt/bindings/testing/testing.gyp
deleted file mode 100644
index 2898f07..0000000
--- a/cobalt/bindings/testing/testing.gyp
+++ /dev/null
@@ -1,237 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../bindings.gypi',
-  ],
-  'variables': {
-    # Base directory into which generated sources and intermediate files should
-    # be generated.
-    'bindings_output_dir': '<(SHARED_INTERMEDIATE_DIR)/bindings/testing',
-
-    # Bindings for the interfaces in this list will be generated, and there must
-    # be an implementation declared in a header that lives in the same
-    # directory of each IDL.
-    'source_idl_files': [
-        'anonymous_indexed_getter_interface.idl',
-        'anonymous_named_getter_interface.idl',
-        'anonymous_named_indexed_getter_interface.idl',
-        'arbitrary_interface.idl',
-        'base_interface.idl',
-        'boolean_type_test_interface.idl',
-        'callback_function_interface.idl',
-        'callback_interface_interface.idl',
-        'conditional_interface.idl',
-        'constants_interface.idl',
-        'constructor_interface.idl',
-        'constructor_with_arguments_interface.idl',
-        'convert_simple_object_interface.idl',
-        'derived_getter_setter_interface.idl',
-        'derived_interface.idl',
-        'dictionary_interface.idl',
-        'disabled_interface.idl',
-        'dom_string_test_interface.idl',
-        'enumeration_interface.idl',
-        'exception_object_interface.idl',
-        'exceptions_interface.idl',
-        'extended_idl_attributes_interface.idl',
-        'garbage_collection_test_interface.idl',
-        'global_interface_parent.idl',
-        'indexed_getter_interface.idl',
-        'interface_with_any.idl',
-        'interface_with_any_dictionary.idl',
-        'interface_with_date.idl',
-        'interface_with_unsupported_properties.idl',
-        'named_constructor_interface.idl',
-        'named_getter_interface.idl',
-        'named_indexed_getter_interface.idl',
-        'nested_put_forwards_interface.idl',
-        'no_constructor_interface.idl',
-        'no_interface_object_interface.idl',
-        'nullable_types_test_interface.idl',
-        'numeric_types_test_interface.idl',
-        'object_type_bindings_interface.idl',
-        'operations_test_interface.idl',
-        'promise_interface.idl',
-        'put_forwards_interface.idl',
-        'sequence_user.idl',
-        'single_operation_interface.idl',
-        'static_properties_interface.idl',
-        'stringifier_anonymous_operation_interface.idl',
-        'stringifier_attribute_interface.idl',
-        'stringifier_operation_interface.idl',
-        'target_interface.idl',
-        'union_types_interface.idl',
-        'window.idl',
-    ],
-
-    'generated_header_idl_files': [
-        'derived_dictionary.idl',
-        'dictionary_with_dictionary_member.idl',
-        'test_dictionary.idl',
-        'test_enum.idl'
-    ],
-
-    # Partial interfaces and the right-side of "implements"
-    # Code will not get generated for these interfaces; they are used to add
-    # functionality to other interfaces.
-    'dependency_idl_files': [
-        'implemented_interface.idl',
-        'partial_interface.idl',
-        'interface_with_unsupported_properties_partial.idl',
-    ],
-
-    'unsupported_interface_idl_files': [
-      'unsupported_interface.idl',
-    ],
-
-    # Specify component for generated window IDL.
-    'window_component': 'testing',
-
-    'bindings_dependencies': ['<(DEPTH)/testing/gmock.gyp:gmock'],
-
-    'bindings_defines': [
-      'ENABLE_CONDITIONAL_INTERFACE',
-      'ENABLE_CONDITIONAL_PROPERTY',
-    ],
-  },
-
-  'targets': [
-    {
-      'target_name': 'bindings',
-      'type': 'static_library',
-      'dependencies': [
-        # The generated_bindings target comes from bindings.gypi.
-        'generated_bindings',
-      ],
-    },
-    {
-      'target_name': 'bindings_test_implementation',
-      'type': 'static_library',
-      'sources': [
-        'constants_interface.cc',
-        'constructor_interface.cc',
-        'exceptions_interface.cc',
-        'garbage_collection_test_interface.cc',
-        'named_constructor_interface.cc',
-        'operations_test_interface.cc',
-        'put_forwards_interface.cc',
-        'static_properties_interface.cc',
-      ],
-      'defines': [ '<@(bindings_defines)'],
-      'dependencies': [
-        'generated_types',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'export_dependent_settings': [
-        'generated_types',
-      ],
-    },
-    {
-      'target_name': 'bindings_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'array_buffers_test.cc',
-        'any_bindings_test.cc',
-        'any_dictionary_bindings_test.cc',
-        'boolean_type_bindings_test.cc',
-        'callback_function_test.cc',
-        'callback_interface_test.cc',
-        'conditional_attribute_test.cc',
-        'constants_bindings_test.cc',
-        'constructor_bindings_test.cc',
-        'convert_simple_object_test.cc',
-        'date_bindings_test.cc',
-        'dependent_interface_test.cc',
-        'dictionary_test.cc',
-        'dom_string_bindings_test.cc',
-        'enumeration_bindings_test.cc',
-        'evaluate_script_test.cc',
-        'exceptions_bindings_test.cc',
-        'extended_attributes_test.cc',
-        'garbage_collection_test.cc',
-        'get_own_property_descriptor.cc',
-        'getter_setter_test.cc',
-        'global_interface_bindings_test.cc',
-        'interface_object_test.cc',
-        'nullable_types_bindings_test.cc',
-        'numeric_type_bindings_test.cc',
-        'object_type_bindings_test.cc',
-        'operations_bindings_test.cc',
-        'optional_arguments_bindings_test.cc',
-        'promise_test.cc',
-        'put_forwards_test.cc',
-        'sequence_bindings_test.cc',
-        'stack_trace_test.cc',
-        'static_properties_bindings_test.cc',
-        'stringifier_bindings_test.cc',
-        'union_type_bindings_test.cc',
-        'unsupported_test.cc',
-        'variadic_arguments_bindings_test.cc',
-      ],
-      'defines': [ '<@(bindings_defines)'],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'bindings',
-        'bindings_test_implementation',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'bindings_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'bindings_test',
-      ],
-      'variables': {
-        'executable_name': 'bindings_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-    {
-      'target_name': 'bindings_sandbox',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'bindings_sandbox_main.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/script/script.gyp:standalone_javascript_runner',
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        'bindings',
-        'bindings_test_implementation',
-      ]
-    },
-
-    {
-      'target_name': 'bindings_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'bindings_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'bindings_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/bindings/v8c/_env.py b/cobalt/bindings/v8c/_env.py
index 021908e..332eabc 100644
--- a/cobalt/bindings/v8c/_env.py
+++ b/cobalt/bindings/v8c/_env.py
@@ -15,12 +15,12 @@
 #
 """Ask the parent directory to load the project environment."""
 
-from imp import load_source
+from imp import load_source  # pylint: disable=deprecated-module
 from os import path
 import sys
 
 _ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
 if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
+  print('%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV))
   sys.exit(1)
 load_source('', _ENV)
diff --git a/cobalt/bindings/v8c/idl_compiler_v8c.py b/cobalt/bindings/v8c/idl_compiler_v8c.py
index 56b6cf7..4b0c8bc 100644
--- a/cobalt/bindings/v8c/idl_compiler_v8c.py
+++ b/cobalt/bindings/v8c/idl_compiler_v8c.py
@@ -24,4 +24,14 @@
 from cobalt.bindings.v8c.code_generator_v8c import CodeGeneratorV8c
 
 if __name__ == '__main__':
-  sys.exit(generate_bindings(CodeGeneratorV8c))
+  # TODO(b/225964218): The flakiness here should be resolved and retries
+  # removed.
+  # Retry up to 5 times as this can be flaky
+  latest_error = None
+  for i in range(5):
+    try:
+      sys.exit(generate_bindings(CodeGeneratorV8c))
+    except EOFError as e:
+      latest_error = e
+  if latest_error:
+    raise latest_error
diff --git a/cobalt/bindings/v8c/templates/interface.cc.template b/cobalt/bindings/v8c/templates/interface.cc.template
index 29db60a..a11e229 100644
--- a/cobalt/bindings/v8c/templates/interface.cc.template
+++ b/cobalt/bindings/v8c/templates/interface.cc.template
@@ -540,8 +540,8 @@
     v8::Local<v8::FunctionTemplate> parent_template = {{parent_interface}}::GetTemplate(isolate);
     function_template->Inherit(parent_template);
     static_assert(
-        std::is_base_of<{{parent_interface_name}}, {{interface_name}}>::value,
-        "Expected {{interface_name}} to have C++ parent class "
+        std::is_base_of<{{parent_interface_name}}, {{impl_class}}>::value,
+        "Expected {{impl_class}} to have C++ parent class "
         "{{parent_interface_name}}, because that is its WebIDL parent.");
   }
 {% elif is_exception_interface %}
@@ -637,9 +637,7 @@
 {% if attribute.interface_name == interface_name %}
           function_template
 {% else %}
-          // Note that we use "attribute.interface_name", and not
-          // "attribute.idl_name", because of named constructors.
-          V8c{{attribute.interface_name}}::GetTemplate(isolate)
+          V8c{{attribute.impl_class}}::GetTemplate(isolate)
 {% endif %}
       );
     }
@@ -859,9 +857,9 @@
 #if defined({{interface.conditional}})
 {% endif %}
   wrapper_factory_->RegisterWrappableType(
-      {{interface.name}}::{{interface.name}}WrappableType(),
-      base::Bind(V8c{{interface.name}}::CreateWrapper),
-      base::Bind(V8c{{interface.name}}::GetTemplate));
+      {{interface.impl_name}}::{{interface.impl_name}}WrappableType(),
+      base::Bind(V8c{{interface.impl_name}}::CreateWrapper),
+      base::Bind(V8c{{interface.impl_name}}::GetTemplate));
 {% if interface.conditional %}
 #endif  // defined({{interface.conditional}})
 {% endif %}
diff --git a/cobalt/black_box_tests/README.md b/cobalt/black_box_tests/README.md
index 2fd70f4..409390c 100644
--- a/cobalt/black_box_tests/README.md
+++ b/cobalt/black_box_tests/README.md
@@ -43,6 +43,11 @@
      Note: When declaring a gtest_filter, it will override the filters defined
      in GetWebPlatformTestFilters in configuration.py.
 
+  If you see a HTTPConnection error which eventually
+  causes a TimeoutException for the test, you might want
+  to add "--server_binding_address localhost" in your
+  python command.
+
 ## Tests
 
 Each script in tests/ includes one python unittest test case.
diff --git a/cobalt/black_box_tests/_env.py b/cobalt/black_box_tests/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/cobalt/black_box_tests/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/black_box_tests/black_box_cobalt_runner.py b/cobalt/black_box_tests/black_box_cobalt_runner.py
index fb0783c..f9ec2df 100644
--- a/cobalt/black_box_tests/black_box_cobalt_runner.py
+++ b/cobalt/black_box_tests/black_box_cobalt_runner.py
@@ -17,7 +17,6 @@
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
 from cobalt.tools.automated_testing import cobalt_runner
 
 # The following constants and logics are shared between this module and
diff --git a/cobalt/black_box_tests/black_box_tests.py b/cobalt/black_box_tests/black_box_tests.py
index bfb73d8..e80713f 100644
--- a/cobalt/black_box_tests/black_box_tests.py
+++ b/cobalt/black_box_tests/black_box_tests.py
@@ -25,9 +25,8 @@
 import sys
 import unittest
 
-import _env  # pylint: disable=unused-import
 from cobalt.black_box_tests import black_box_cobalt_runner
-from proxy_server import ProxyServer
+from cobalt.black_box_tests.proxy_server import ProxyServer
 from starboard.tools import abstract_launcher
 from starboard.tools import build
 from starboard.tools import command_line
@@ -68,6 +67,8 @@
     'soft_mic_platform_service_test',
     'web_debugger',
     'web_platform_tests',
+    'web_worker_test',
+    'service_worker_test',
 ]
 # These tests can only be run on platforms whose app launcher can send deep
 # links.
diff --git a/cobalt/black_box_tests/proxy_server.py b/cobalt/black_box_tests/proxy_server.py
index ddf9a5f..70ef34d 100644
--- a/cobalt/black_box_tests/proxy_server.py
+++ b/cobalt/black_box_tests/proxy_server.py
@@ -31,6 +31,7 @@
 
 
 class ProxyServer(object):
+  """HTTP Proxy Server."""
 
   def __init__(self,
                hostname='0.0.0.0',
@@ -38,14 +39,14 @@
                host_resolve_map=None,
                client_ips=None):
     self.command = [
-        'python',
+        'python3',
         os.path.join(SRC_DIR, 'third_party', 'proxy_py', 'proxy.py'),
         '--hostname', hostname, '--port', port, '--log-level', 'WARNING'
     ]
     self.host_resolver_path = None
 
     if host_resolve_map:
-      with tempfile.NamedTemporaryFile(delete=False) as hosts:
+      with tempfile.NamedTemporaryFile('w', delete=False) as hosts:
         json.dump(host_resolve_map, hosts)
       self.host_resolver_path = hosts.name
       self.command += ['--host_resolver', self.host_resolver_path]
diff --git a/cobalt/black_box_tests/testdata/service_worker_test.html b/cobalt/black_box_tests/testdata/service_worker_test.html
new file mode 100644
index 0000000..fc52dbd
--- /dev/null
+++ b/cobalt/black_box_tests/testdata/service_worker_test.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<!--
+  Copyright 2022 The Cobalt Authors. All Rights Reserved.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!--
+  Note: This is a very basic test of the existing minimal Service Worker
+  functionality. This can be expanded as more functionality is implemented.
+-->
+
+<head>
+    <title>Cobalt Service Worker Test</title>
+    <script src='black_box_js_test_utils.js'></script>
+</head>
+
+<body>
+    <script>
+        var message_event_count = 0;
+        console.log('running');
+        if ('serviceWorker' in navigator) {
+            navigator.serviceWorker.register('..:..')
+                .then(function (registration) {
+                    notReached();
+                }, function (error) {
+                    console.log(`(Expected) Test invalid script URL: ${error}`);
+                    assertEqual("TypeError", `${error}`);
+                    message_event_count += 1;
+                });
+            navigator.serviceWorker.register('arg:service_worker_test.js')
+                .then(function (registration) {
+                    notReached();
+                }, function (error) {
+                    console.log(`(Expected) Test script URL that is not http or https: ${error}`);
+                    assertEqual("TypeError", `${error}`);
+                    message_event_count += 1;
+                });
+            navigator.serviceWorker.register('http:%2fservice_worker_test.js')
+                .then(function (registration) {
+                    notReached();
+                }, function (error) {
+                    console.log(`(Expected) Test script URL with escaped slash: ${error}`);
+                    assertEqual("TypeError", `${error}`);
+                    message_event_count += 1;
+                });
+            navigator.serviceWorker.register('service_worker_test.js', {
+                scope: '..:..',
+            })
+                .then(function (registration) {
+                    notReached();
+                }, function (error) {
+                    console.log(`(Expected) Test invalid scope URL: ${error}`);
+                    assertEqual("TypeError", `${error}`);
+                    message_event_count += 1;
+                });
+            navigator.serviceWorker.register('service_worker_test.js', {
+                scope: 'arg:/',
+            })
+                .then(function (registration) {
+                    notReached();
+                }, function (error) {
+                    console.log(`(Expected) Test scope URL that is not http or https: ${error}`);
+                    assertEqual("TypeError", `${error}`);
+                    message_event_count += 1;
+                });
+            navigator.serviceWorker.register('service_worker_test.js', {
+                scope: '/%5c',
+            })
+                .then(function (registration) {
+                    notReached();
+                }, function (error) {
+                    console.log(`(Expected) Test scope URL with escaped slash: ${error}`);
+                    assertEqual("TypeError", `${error}`);
+                    message_event_count += 1;
+                });
+            // Repeat a few times to test the 'equivalent job' and finish job logic.
+            for (let repeated = 0; repeated < 15; repeated++) {
+                navigator.serviceWorker.register('http://www.example.com/', {
+                    scope: '/',
+                })
+                    .then(function (registration) {
+                        notReached();
+                    }, function (error) {
+                        console.log(`(Expected) Test Script URL is not trusted: ${error}`);
+                        assertEqual("SecurityError: Service Worker Register failed: Script URL is Not Trusted.", `${error}`);
+                        message_event_count += 1;
+                    });
+            }
+        }
+        navigator.serviceWorker.register('http://127.0.0.100:2345/')
+            .then(function (registration) {
+                notReached();
+            }, function (error) {
+                console.log(`(Expected) Test script URL with different origin: ${error}`);
+                assertEqual("SecurityError: Service Worker Register failed: Script URL and referrer origin are not the same.", `${error}`);
+                message_event_count += 1;
+            });
+
+        navigator.serviceWorker.register('service_worker_test.js', {
+            scope: 'http://127.0.0.100:2345/',
+        })
+            .then(function (registration) {
+                notReached();
+            }, function (error) {
+                console.log(`(Expected) Test scope URL with different origin: ${error}`);
+                assertEqual("SecurityError: Service Worker Register failed: Scope URL and referrer origin are not the same.", `${error}`);
+                message_event_count += 1;
+            });
+
+        // Finally, test a succeeding registration.
+        navigator.serviceWorker.register('service_worker_test.js', {
+            scope: '/registration/scope',
+        })
+            .then(function (registration) {
+                console.log(`(Expected) Registration Succeeded: ${registration}`);
+                assertNotEqual(null, registration);
+                assertEqual(null, registration.installing);
+                assertEqual(null, registration.waiting);
+                assertEqual(null, registration.active);
+
+                // The default value for RegistrationOptions.type is 'imports'.
+                assertEqual('imports', registration.updateViaCache);
+                assertTrue(registration.scope.endsWith('/registration/scope'));
+                message_event_count += 1;
+            }, function (error) {
+                notReached();
+            });
+
+        window.setTimeout(
+            () => {
+                assertEqual(24, message_event_count);
+                console.log("Events: ", message_event_count)
+                onEndTest();
+            }, 500);
+
+        console.log('end');
+    </script>
+</body>
diff --git a/cobalt/black_box_tests/testdata/web_worker_test.html b/cobalt/black_box_tests/testdata/web_worker_test.html
new file mode 100644
index 0000000..9839984
--- /dev/null
+++ b/cobalt/black_box_tests/testdata/web_worker_test.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<!--
+  Copyright 2022 The Cobalt Authors. All Rights Reserved.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!--
+  Note: This is a very basic test of the existing minimal Web Worker
+  functionality. This can be expanded as more functionality is implemented,
+  but probably will be superseded by Web Platform Tests.
+-->
+<head>
+    <title>Cobalt Web Worker Test</title>
+    <script src='black_box_js_test_utils.js'></script>
+</head>
+
+<body>
+<script>
+    var message_event_count = 0;
+    console.log('running');
+    var worker = new Worker('web_worker_test.js');
+    console.log(worker);
+    var data = "window data";
+    worker.onmessage = function (event) {
+        console.log('window got onmessage from worker: ' + event.data);
+        message_event_count += 1;
+        if (message_event_count == 1) {
+            assertEqual(event.data, 'worker data');
+        } else if (message_event_count % 2 == 0) {
+            assertEqual(event.data, 'worker received correct message');
+        } else {
+            assertEqual(event.data, data.toUpperCase());
+        }
+        if (message_event_count == 5) {
+            window.setTimeout(
+                () => {
+                    assertEqual(message_event_count, 5);
+                    onEndTest();
+                }, 250);
+        }
+        if (message_event_count > 5) {
+            notReached();
+        }
+    };
+    worker.onerror = function (event) {
+        console.log('window got onerror');
+        notReached();
+    };
+    console.log('posting');
+    worker.postMessage(data);
+    window.setTimeout(
+        () => { console.log('posting'); worker.postMessage(data); }, 250);
+    console.log('end');
+</script>
+</body>
diff --git a/cobalt/black_box_tests/testdata/web_worker_test.js b/cobalt/black_box_tests/testdata/web_worker_test.js
new file mode 100644
index 0000000..9d84a22
--- /dev/null
+++ b/cobalt/black_box_tests/testdata/web_worker_test.js
@@ -0,0 +1,26 @@
+// Copyright 2022 The Cobalt Authors.All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+var data = "worker data";
+this.postMessage(data);
+this.onmessage = function (event) {
+    if (event.data === 'window data') {
+        this.postMessage('worker received correct message');
+    } else {
+        this.postMessage('worker received wrong message')
+    }
+    var data = event.data.toUpperCase();
+    this.postMessage(data);
+};
+this
diff --git a/cobalt/black_box_tests/tests/_env.py b/cobalt/black_box_tests/tests/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/cobalt/black_box_tests/tests/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/black_box_tests/tests/allow_eval.py b/cobalt/black_box_tests/tests/allow_eval.py
index 3df2594..503ffbb 100644
--- a/cobalt/black_box_tests/tests/allow_eval.py
+++ b/cobalt/black_box_tests/tests/allow_eval.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests if Cobalt client page can use eval() when CSP is missing."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/cancel_sync_loads_when_suspended.py b/cobalt/black_box_tests/tests/cancel_sync_loads_when_suspended.py
index 19c6879..4036853 100644
--- a/cobalt/black_box_tests/tests/cancel_sync_loads_when_suspended.py
+++ b/cobalt/black_box_tests/tests/cancel_sync_loads_when_suspended.py
@@ -36,14 +36,12 @@
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import,g-bad-import-order
-
 import logging
 import os
-import SimpleHTTPServer
+from six.moves import SimpleHTTPServer
+from six.moves.urllib.parse import urlparse
 import threading
 import traceback
-import urlparse
 
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass
@@ -66,7 +64,7 @@
   def do_GET(self):  # pylint: disable=invalid-name
     """Handles HTTP GET requests for resources."""
 
-    parsed_path = urlparse.urlparse(self.path)
+    parsed_path = urlparse(self.path)
     if parsed_path.path == '/testdata/' + _CANCEL_SYNC_LOADS_WHEN_SUSPENDED_JS:
       _received_script_resource_request.set()
       # It is important not to send any response back, so we block.
@@ -81,7 +79,7 @@
 class CancelSyncLoadsWhenSuspended(black_box_tests.BlackBoxTestCase):
   """Tests cancellation of synchronous loading of scripts on Suspend."""
 
-  def _LoadPage(self, webdriver, url):
+  def _load_page(self, webdriver, url):
     """Instructs webdriver to navigate to url."""
     try:
       # Note: The following is a blocking request, and returns only when the
@@ -101,7 +99,7 @@
           target_url = server.GetURL(file_name='../testdata/' +
                                      _CANCEL_SYNC_LOADS_WHEN_SUSPENDED_HTML)
           cobalt_launcher_thread = threading.Thread(
-              target=CancelSyncLoadsWhenSuspended._LoadPage,
+              target=CancelSyncLoadsWhenSuspended._load_page,
               args=(self, runner.webdriver, target_url))
           cobalt_launcher_thread.start()
 
@@ -109,7 +107,7 @@
           logging.info('Waiting for script resource request')
           request_received = _received_script_resource_request.wait(
               _MAX_ALLOTTED_TIME_SECONDS)
-          logging.info('Request received: {}'.format(request_received))
+          logging.info('Request received: %s', request_received)
           # Step 5. Wait for a request for javascript resource.
           self.assertTrue(request_received)
 
@@ -128,7 +126,7 @@
     except:  # pylint: disable=bare-except
       traceback.print_exc()
       # Consider an exception being thrown as a test failure.
-      self.assertTrue(False)
+      self.fail('Test failure')
     finally:
       logging.info('Cleaning up.')
       _test_finished.set()
diff --git a/cobalt/black_box_tests/tests/compression_test.py b/cobalt/black_box_tests/tests/compression_test.py
index 807b091..505cc45 100644
--- a/cobalt/black_box_tests/tests/compression_test.py
+++ b/cobalt/black_box_tests/tests/compression_test.py
@@ -20,7 +20,7 @@
   import brotli
 except ImportError:
   brotli = None
-from SimpleHTTPServer import SimpleHTTPRequestHandler
+from six.moves.SimpleHTTPServer import SimpleHTTPRequestHandler
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/conceal_visibility.py b/cobalt/black_box_tests/tests/conceal_visibility.py
index bc9a4cc..5df63de 100644
--- a/cobalt/black_box_tests/tests/conceal_visibility.py
+++ b/cobalt/black_box_tests/tests/conceal_visibility.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests correct visibility changes during and after conceal event."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/deep_links.py b/cobalt/black_box_tests/tests/deep_links.py
index 5e4ee00..4a69ffe 100644
--- a/cobalt/black_box_tests/tests/deep_links.py
+++ b/cobalt/black_box_tests/tests/deep_links.py
@@ -32,11 +32,11 @@
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import,g-bad-import-order
-
 import inspect
 import logging
 import os
+from six.moves import SimpleHTTPServer
+from six.moves.urllib.parse import urlparse
 import threading
 import time
 import traceback
@@ -45,9 +45,6 @@
 from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
-import SimpleHTTPServer
-import urlparse
-
 _DEEP_LINKS_HTML = 'deep_links.html'
 _DEEP_LINKS_JS = 'deep_links.js'
 _MAX_ALLOTTED_TIME_SECONDS = 60
@@ -64,7 +61,7 @@
   def do_GET(self):  # pylint: disable=invalid-name
     """Handles HTTP GET requests for resources."""
 
-    parsed_path = urlparse.urlparse(self.path)
+    parsed_path = urlparse(self.path)
     if parsed_path.path == '/testdata/' + _DEEP_LINKS_JS:
       # It is important not to send any response back, so we block.
       logging.info('Waiting on links to be fired.')
@@ -81,7 +78,7 @@
 class DeepLink(black_box_tests.BlackBoxTestCase):
   """Tests firing deep links before web module is loaded."""
 
-  def _LoadPage(self, webdriver, url):
+  def _load_page(self, webdriver, url):
     """Instructs webdriver to navigate to url."""
     try:
       # Note: The following is a blocking request, and returns only when the
@@ -91,7 +88,7 @@
     except:  # pylint: disable=bare-except
       traceback.print_exc()
 
-  def _SendLink(self, query_parameter=''):
+  def _send_link(self, query_parameter=''):
     """Test sending links into Cobalt after it's started."""
 
     logging.info('[ RUN ] ' + inspect.stack()[1][3] + ' ' + query_parameter)
@@ -105,14 +102,14 @@
           if query_parameter != '':
             target_url += '?' + query_parameter
           cobalt_launcher_thread = threading.Thread(
-              target=DeepLink._LoadPage,
+              target=DeepLink._load_page,
               args=(self, runner.webdriver, target_url))
           cobalt_launcher_thread.start()
 
           # Step 3. Send 3 deep links
           for i in range(1, 4):
             link = 'link ' + str(i)
-            logging.info('Sending link : ' + link)
+            logging.info('Sending link : %s', link)
             self.assertTrue(runner.SendDeepLink(link))
           logging.info('Links fired.')
           # Step 4. Load & run the javascript resource.
@@ -123,19 +120,19 @@
           # of time (current default is 30 seconds).
           success = runner.JSTestsSucceeded()
           if success:
-            logging.info('[ OK ] ' + inspect.stack()[1][3])
+            logging.info('[ OK ] %s', inspect.stack()[1][3])
           else:
-            logging.info('[ FAILED ] ' + inspect.stack()[1][3])
+            logging.info('[ FAILED ] %s', inspect.stack()[1][3])
           self.assertTrue(success)
     except:  # pylint: disable=bare-except
       traceback.print_exc()
       # Consider an exception being thrown as a test failure.
-      self.assertTrue(False)
+      self.fail('Test failure')
     finally:
       logging.info('Cleaning up.')
       _script_loading_signal.set()
 
-  def _StartLink(self, query_parameter=''):
+  def _start_link(self, query_parameter=''):
     """Test the initial link provided when starting Cobalt."""
 
     logging.info('[ RUN ] ' + inspect.stack()[1][3] + ' ' + query_parameter)
@@ -149,12 +146,12 @@
           url=url, target_params=['--link=' + initial_deep_link]) as runner:
         success = runner.JSTestsSucceeded()
         if success:
-          logging.info('[ OK ] ' + inspect.stack()[1][3])
+          logging.info('[ OK ] %s', inspect.stack()[1][3])
         else:
-          logging.info('[ FAILED ] ' + inspect.stack()[1][3])
+          logging.info('[ FAILED ] %s', inspect.stack()[1][3])
         self.assertTrue(success)
 
-  def _DelayedLink(self, query_parameter=''):
+  def _delayed_link(self, query_parameter=''):
     """Test sending links into Cobalt after it's started."""
 
     logging.info('[ RUN ] ' + inspect.stack()[1][3] + ' ' + query_parameter)
@@ -168,7 +165,7 @@
           if query_parameter != '':
             target_url += '?' + query_parameter
           cobalt_launcher_thread = threading.Thread(
-              target=DeepLink._LoadPage,
+              target=DeepLink._load_page,
               args=(self, runner.webdriver, target_url))
           cobalt_launcher_thread.start()
 
@@ -180,7 +177,7 @@
 
           # Step 5. Send deep link
           link = 'link 3'  # Expected by our test JS
-          logging.info('Sending link : ' + link)
+          logging.info('Sending link : %s', link)
           self.assertTrue(runner.SendDeepLink(link))
           logging.info('Links fired.')
 
@@ -189,104 +186,116 @@
           # of time (current default is 30 seconds).
           success = runner.JSTestsSucceeded()
           if success:
-            logging.info('[ OK ] ' + inspect.stack()[1][3])
+            logging.info('[ OK ] %s', inspect.stack()[1][3])
           else:
-            logging.info('[ FAILED ] ' + inspect.stack()[1][3])
+            logging.info('[ FAILED ] %s', inspect.stack()[1][3])
           self.assertTrue(success)
     except:  # pylint: disable=bare-except
       traceback.print_exc()
       # Consider an exception being thrown as a test failure.
-      self.assertTrue(False)
+      self.fail('Test failure')
     finally:
       logging.info('Cleaning up.')
       _script_loading_signal.set()
 
   def test_delayed_link_unconsumed(self):
     """Test that a deep link does not have to be consumed."""
-    return self._DelayedLink('consumed&delayedlink')
+    return self._delayed_link('consumed&delayedlink')
 
   def test_delayed_link_and_consume(self):
     """Test that a deep link is received."""
-    return self._DelayedLink('consume&delayedlink')
+    return self._delayed_link('consume&delayedlink')
 
   def test_send_link_unconsumed(self):
     """Test that the link does not have to be consumed."""
-    return self._SendLink()
+    return self._send_link()
 
   def test_send_link_and_consume(self):
     """Test that the last link is received."""
-    return self._SendLink('consume')
+    return self._send_link('consume')
 
   def test_send_link_and_consume_with_initial_deep_link(self):
     """Test that the link is visible in initialDeepLink."""
-    return self._SendLink('consume&initial')
+    return self._send_link('consume&initial')
 
   def test_send_link_and_navigate_and_consume(self):
     """Test that the link is received after navigating."""
-    return self._SendLink('navigate_immediate')
+    return self._send_link('navigate_immediate')
 
   def test_send_link_and_navigate_with_delay_and_consume(self):
     """Test that the link is received after navigating with a delay."""
-    return self._SendLink('navigate_delayed')
+    return self._send_link('navigate_delayed')
 
   def test_send_link_and_navigate_and_consume_with_initial_deep_link(self):
     """Test that the link is received in initialDeepLink after navigating."""
-    return self._SendLink('navigate_immediate&initial')
+    return self._send_link('navigate_immediate&initial')
 
   def test_send_link_and_navigate_with_delay_and_consume_with_initial_deep_link(
       self):
-    """Test that the link is received in initialDeepLink after navigating with a delay."""
-    return self._SendLink('navigate_delayed&initial')
+    """Test that the link is received in initialDeepLink after navigating with
+    a delay.
+    """
+    return self._send_link('navigate_delayed&initial')
 
   def test_send_link_and_consume_and_navigate(self):
     """Test that a consumed link is not received again after navigating."""
-    return self._SendLink('consume&navigate_immediate')
+    return self._send_link('consume&navigate_immediate')
 
   def test_send_link_and_consume_and_navigate_with_delay(self):
-    """Test that a consumed link is not received again after navigating with a delay."""
-    return self._SendLink('consume&navigate_delayed')
+    """Test that a consumed link is not received again after navigating with a
+    delay.
+    """
+    return self._send_link('consume&navigate_delayed')
 
   def test_send_link_and_consume_with_initial_deep_link_and_navigate(self):
-    """Test that a link consumed with initialDeepLink is not received again after navigating."""
-    return self._SendLink('consume&initial&navigate_immediate')
+    """Test that a link consumed with initialDeepLink is not received again
+    after navigating.
+    """
+    return self._send_link('consume&initial&navigate_immediate')
 
   def test_start_link_unconsumed(self):
     """Test that the link does not have to be consumed."""
-    return self._StartLink()
+    return self._start_link()
 
   def test_start_link_and_consume(self):
     """Test that the last link is received."""
-    return self._StartLink('consume')
+    return self._start_link('consume')
 
   def test_start_link_and_consume_with_initial_deep_link(self):
     """Test that the link is visible in initialDeepLink."""
-    return self._StartLink('consume&initial')
+    return self._start_link('consume&initial')
 
   def test_start_link_and_navigate_and_consume(self):
     """Test that the link is received after navigating."""
-    return self._StartLink('navigate_immediate')
+    return self._start_link('navigate_immediate')
 
   def test_start_link_and_navigate_with_delay_and_consume(self):
     """Test that the link is received after navigating with a delay."""
-    return self._StartLink('navigate_delayed')
+    return self._start_link('navigate_delayed')
 
   def test_start_link_and_navigate_and_consume_with_initial_deep_link(self):
     """Test that the link is received in initialDeepLink after navigating."""
-    return self._StartLink('navigate_immediate&initial')
+    return self._start_link('navigate_immediate&initial')
 
-  def test_start_link_and_navigate_with_delay_and_consume_with_initial_deep_link(
+  def test_start_link_and_navigate_with_delay_and_consume_with_initial_deep_link(  # pylint:disable=line-too-long
       self):
-    """Test that the link is received in initialDeepLink after navigating with a delay."""
-    return self._StartLink('navigate_delayed&initial')
+    """Test that the link is received in initialDeepLink after navigating with a
+    delay.
+    """
+    return self._start_link('navigate_delayed&initial')
 
   def test_start_link_and_consume_and_navigate(self):
     """Test that a consumed link is not received again after navigating."""
-    return self._StartLink('consume&navigate_immediate')
+    return self._start_link('consume&navigate_immediate')
 
   def test_start_link_and_consume_and_navigate_with_delay(self):
-    """Test that a consumed link is not received again after navigating with a delay."""
-    return self._StartLink('consume&navigate_delayed')
+    """Test that a consumed link is not received again after navigating with a
+    delay.
+    """
+    return self._start_link('consume&navigate_delayed')
 
   def test_start_link_and_consume_with_initial_deep_link_and_navigate(self):
-    """Test that a link consumed with initialDeepLink is not received again after navigating."""
-    return self._StartLink('consume&initial&navigate_immediate')
+    """Test that a link consumed with initialDeepLink is not received again
+    after navigating.
+    """
+    return self._start_link('consume&initial&navigate_immediate')
diff --git a/cobalt/black_box_tests/tests/disable_eval_with_csp.py b/cobalt/black_box_tests/tests/disable_eval_with_csp.py
index 45f22df..3fd19bb 100644
--- a/cobalt/black_box_tests/tests/disable_eval_with_csp.py
+++ b/cobalt/black_box_tests/tests/disable_eval_with_csp.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests if Cobalt prohibits eval() when CSP is present in client page."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/freeze_timers.py b/cobalt/black_box_tests/tests/freeze_timers.py
index 538743c..cbcbce3 100644
--- a/cobalt/black_box_tests/tests/freeze_timers.py
+++ b/cobalt/black_box_tests/tests/freeze_timers.py
@@ -17,8 +17,6 @@
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 import time
 
 from cobalt.black_box_tests import black_box_tests
diff --git a/cobalt/black_box_tests/tests/freeze_visibility.py b/cobalt/black_box_tests/tests/freeze_visibility.py
index 678264b..d10c95c 100644
--- a/cobalt/black_box_tests/tests/freeze_visibility.py
+++ b/cobalt/black_box_tests/tests/freeze_visibility.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests correct visibility changes during and after freeze event."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/override_ua_parameters.py b/cobalt/black_box_tests/tests/override_ua_parameters.py
index 4f5fd45..01768ae 100644
--- a/cobalt/black_box_tests/tests/override_ua_parameters.py
+++ b/cobalt/black_box_tests/tests/override_ua_parameters.py
@@ -18,7 +18,7 @@
 from __future__ import print_function
 
 import os
-import SimpleHTTPServer
+from six.moves import SimpleHTTPServer
 
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass
diff --git a/cobalt/black_box_tests/tests/persistent_cookie.py b/cobalt/black_box_tests/tests/persistent_cookie.py
index 31da099..209bc09 100644
--- a/cobalt/black_box_tests/tests/persistent_cookie.py
+++ b/cobalt/black_box_tests/tests/persistent_cookie.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests Cobalt can have persistent cookie across sessions/launches."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 from cobalt.tools.automated_testing import webdriver_utils
diff --git a/cobalt/black_box_tests/tests/pointer_test.py b/cobalt/black_box_tests/tests/pointer_test.py
index 02e9a00..be12585 100644
--- a/cobalt/black_box_tests/tests/pointer_test.py
+++ b/cobalt/black_box_tests/tests/pointer_test.py
@@ -23,8 +23,6 @@
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import,g-bad-import-order
-
 import logging
 import traceback
 
@@ -71,7 +69,7 @@
           bottom_six = find_element_by_id(runner, 'bottom_six')
 
           # Perform mouse actions with ActionChains.
-          #   https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.action_chains.html#module-selenium.webdriver.common.action_chains
+          #   https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.action_chains.html#module-selenium.webdriver.common.action_chains  # pylint: disable=line-too-long
           actions = ActionChains(runner.webdriver)
           actions.move_to_element(top_one).pause(_SLEEP_AFTER_MOVE_TIME)
           actions.move_to_element(top_two).pause(_SLEEP_AFTER_MOVE_TIME)
@@ -98,6 +96,6 @@
     except:  # pylint: disable=bare-except
       traceback.print_exc()
       # Consider an exception being thrown as a test failure.
-      self.assertTrue(False)
+      self.fail('Test failure')
     finally:
       logging.info('Cleaning up.')
diff --git a/cobalt/black_box_tests/tests/preload_font.py b/cobalt/black_box_tests/tests/preload_font.py
index 479d963..5f8a5ae 100644
--- a/cobalt/black_box_tests/tests/preload_font.py
+++ b/cobalt/black_box_tests/tests/preload_font.py
@@ -11,6 +11,7 @@
 # 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.
+"""Tests that fonts are loaded correctly after preload event."""
 
 from __future__ import absolute_import
 from __future__ import division
@@ -18,8 +19,6 @@
 
 import time
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/preload_launch_parameter.py b/cobalt/black_box_tests/tests/preload_launch_parameter.py
index 8d9316b..a0675af 100644
--- a/cobalt/black_box_tests/tests/preload_launch_parameter.py
+++ b/cobalt/black_box_tests/tests/preload_launch_parameter.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests preload launch parameter."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
@@ -40,7 +39,7 @@
 
       # Test with another parameter.
       with self.CreateCobaltRunner(
-          url=url + "?foo=bar", target_params=['--preload']) as runner:
+          url=url + '?foo=bar', target_params=['--preload']) as runner:
         runner.WaitForJSTestsSetup()
         self.assertTrue(runner.IsInPreload())
         runner.SendResume()
diff --git a/cobalt/black_box_tests/tests/preload_visibility.py b/cobalt/black_box_tests/tests/preload_visibility.py
index eb0a148..7d75050 100644
--- a/cobalt/black_box_tests/tests/preload_visibility.py
+++ b/cobalt/black_box_tests/tests/preload_visibility.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests preload visibility."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/retry_async_script_loads_after_suspend.py b/cobalt/black_box_tests/tests/retry_async_script_loads_after_suspend.py
index 70ad4c0..3359b4f 100644
--- a/cobalt/black_box_tests/tests/retry_async_script_loads_after_suspend.py
+++ b/cobalt/black_box_tests/tests/retry_async_script_loads_after_suspend.py
@@ -37,14 +37,12 @@
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import,g-bad-import-order
-
 import logging
 import os
-import SimpleHTTPServer
+from six.moves import SimpleHTTPServer
+from six.moves.urllib.parse import urlparse
 import threading
 import traceback
-import urlparse
 
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import MakeRequestHandlerClass
@@ -69,7 +67,7 @@
   def do_GET(self):  # pylint: disable=invalid-name
     """Handles HTTP GET requests for resources."""
 
-    parsed_path = urlparse.urlparse(self.path)
+    parsed_path = urlparse(self.path)
 
     if parsed_path.path == '/testdata/' + _JS_FILE_TO_REQUEST:
       _received_script_resource_request.set()
@@ -92,7 +90,7 @@
 class RetryAsyncScriptLoadsAfterSuspend(black_box_tests.BlackBoxTestCase):
   """Tests cancellation of synchronous loading of scripts on Suspend."""
 
-  def _LoadPage(self, webdriver, url):
+  def _load_page(self, webdriver, url):
     """Instructs webdriver to navigate to url."""
     try:
       # Note: The following is a blocking request, and returns only when the
@@ -112,7 +110,7 @@
           target_url = server.GetURL(file_name='../testdata/' +
                                      _HTML_FILE_TO_REQUEST)
           cobalt_launcher_thread = threading.Thread(
-              target=RetryAsyncScriptLoadsAfterSuspend._LoadPage,
+              target=RetryAsyncScriptLoadsAfterSuspend._load_page,
               args=(self, runner.webdriver, target_url))
           cobalt_launcher_thread.start()
 
@@ -120,7 +118,7 @@
           logging.info('Waiting for script resource request')
           request_received = _received_script_resource_request.wait(
               _MAX_ALLOTTED_TIME_SECONDS)
-          logging.info('Request received: {}'.format(request_received))
+          logging.info('Request received: %s', request_received)
           # Step 5. Wait for a request for javascript resource.
           self.assertTrue(request_received)
 
@@ -139,7 +137,7 @@
     except:  # pylint: disable=bare-except
       traceback.print_exc()
       # Consider an exception being thrown as a test failure.
-      self.assertTrue(False)
+      self.fail('Test failure')
     finally:
       logging.info('Cleaning up.')
       _test_finished.set()
diff --git a/cobalt/black_box_tests/tests/service_worker_test.py b/cobalt/black_box_tests/tests/service_worker_test.py
new file mode 100644
index 0000000..6348564
--- /dev/null
+++ b/cobalt/black_box_tests/tests/service_worker_test.py
@@ -0,0 +1,29 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests basic Service Worker functionality."""
+
+from cobalt.black_box_tests import black_box_tests
+from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
+
+
+class ServiceWorkerTest(black_box_tests.BlackBoxTestCase):
+  """Test basic Service Worker functionality."""
+
+  def test_simple(self):
+
+    with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server:
+      url = server.GetURL(file_name='testdata/service_worker_test.html')
+
+      with self.CreateCobaltRunner(url=url) as runner:
+        self.assertTrue(runner.JSTestsSucceeded())
diff --git a/cobalt/black_box_tests/tests/signal_handler_doesnt_crash.py b/cobalt/black_box_tests/tests/signal_handler_doesnt_crash.py
index e2962d7..8374c3f 100644
--- a/cobalt/black_box_tests/tests/signal_handler_doesnt_crash.py
+++ b/cobalt/black_box_tests/tests/signal_handler_doesnt_crash.py
@@ -11,6 +11,7 @@
 # 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.
+"""Tests if Cobalt signal handler is robust."""
 
 from __future__ import absolute_import
 from __future__ import division
@@ -19,8 +20,6 @@
 import signal
 import time
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 
 
@@ -28,7 +27,7 @@
   """Flood the process with CONT signals, ensuring signal handler is robust."""
 
   def setUp(self):
-    if 'linux' not in self.launcher_params.platform:
+    if 'linux' not in self.launcher_params.platform:  # pylint: disable=unsupported-membership-test
       self.skipTest('This test needs POSIX system signal handlers')
 
   def test_simple(self):
diff --git a/cobalt/black_box_tests/tests/soft_mic_platform_service_test.py b/cobalt/black_box_tests/tests/soft_mic_platform_service_test.py
index d68322a..caf506e 100644
--- a/cobalt/black_box_tests/tests/soft_mic_platform_service_test.py
+++ b/cobalt/black_box_tests/tests/soft_mic_platform_service_test.py
@@ -17,8 +17,6 @@
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 from cobalt.tools.automated_testing import webdriver_utils
@@ -36,29 +34,34 @@
       # The webpage listens for NUMPAD0 through NUMPAD9 at opening
       # to test hasHardMicSupport and hasSoftMicSupport switch values.
       with self.CreateCobaltRunner(url=url) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD0 to test testIncorrectRequests
         runner.SendKeys(keys.Keys.NUMPAD0)
         self.assertTrue(runner.JSTestsSucceeded())
 
       with self.CreateCobaltRunner(url=url) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD1 to test bothUndefined
         runner.SendKeys(keys.Keys.NUMPAD1)
         self.assertTrue(runner.JSTestsSucceeded())
 
       with self.CreateCobaltRunner(
           url=url, target_params=['--has_soft_mic_support=true']) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD2 to test hardMicUndefinedSoftMicTrue
         runner.SendKeys(keys.Keys.NUMPAD2)
         self.assertTrue(runner.JSTestsSucceeded())
 
       with self.CreateCobaltRunner(
           url=url, target_params=['--has_soft_mic_support=false']) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD3 to test hardMicUndefinedSoftMicFalse
         runner.SendKeys(keys.Keys.NUMPAD3)
         self.assertTrue(runner.JSTestsSucceeded())
 
       with self.CreateCobaltRunner(
           url=url, target_params=['--has_hard_mic_support=true']) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD4 to test hardMicTrueSoftMicUndefined
         runner.SendKeys(keys.Keys.NUMPAD4)
         self.assertTrue(runner.JSTestsSucceeded())
@@ -68,6 +71,7 @@
           target_params=([
               '--has_hard_mic_support=true', '--has_soft_mic_support=true'
           ])) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD5 to test hardMicTrueSoftMicTrue
         runner.SendKeys(keys.Keys.NUMPAD5)
         self.assertTrue(runner.JSTestsSucceeded())
@@ -77,12 +81,14 @@
           target_params=([
               '--has_hard_mic_support=true', '--has_soft_mic_support=false'
           ])) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD6 to test hardMicTrueSoftMicFalse
         runner.SendKeys(keys.Keys.NUMPAD6)
         self.assertTrue(runner.JSTestsSucceeded())
 
       with self.CreateCobaltRunner(
           url=url, target_params=['--has_hard_mic_support=false']) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD7 to test hardMicFalseSoftMicUndefined
         runner.SendKeys(keys.Keys.NUMPAD7)
         self.assertTrue(runner.JSTestsSucceeded())
@@ -92,6 +98,7 @@
           target_params=([
               '--has_hard_mic_support=false', '--has_soft_mic_support=true'
           ])) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD8 to test hardMicFalseSoftMicTrue
         runner.SendKeys(keys.Keys.NUMPAD8)
         self.assertTrue(runner.JSTestsSucceeded())
@@ -101,6 +108,7 @@
           target_params=([
               '--has_hard_mic_support=false', '--has_soft_mic_support=false'
           ])) as runner:
+        runner.WaitForActiveElement()
         # Press NUMPAD9 to test hardMicFalseSoftMicFalse
         runner.SendKeys(keys.Keys.NUMPAD9)
         self.assertTrue(runner.JSTestsSucceeded())
@@ -108,24 +116,28 @@
       # The webpage listens for NUMPAD0 through NUMPAD9 at opening with SHIFT
       # to test micGesture tap and hold switch values.
       with self.CreateCobaltRunner(url=url) as runner:
+        runner.WaitForActiveElement()
         # Press SHIFT, NUMPAD0 to test micGestureNull
         runner.SendKeys([keys.Keys.SHIFT, keys.Keys.NUMPAD0])
         self.assertTrue(runner.JSTestsSucceeded())
 
       with self.CreateCobaltRunner(
           url=url, target_params=['--mic_gesture=foo']) as runner:
+        runner.WaitForActiveElement()
         # Press SHIFT, NUMPAD0 to test micGestureNull
         runner.SendKeys([keys.Keys.SHIFT, keys.Keys.NUMPAD0])
         self.assertTrue(runner.JSTestsSucceeded())
 
       with self.CreateCobaltRunner(
           url=url, target_params=['--mic_gesture=hold']) as runner:
+        runner.WaitForActiveElement()
         # Press SHIFT, NUMPAD1 to test micGestureHold
         runner.SendKeys([keys.Keys.SHIFT, keys.Keys.NUMPAD1])
         self.assertTrue(runner.JSTestsSucceeded())
 
       with self.CreateCobaltRunner(
           url=url, target_params=['--mic_gesture=tap']) as runner:
+        runner.WaitForActiveElement()
         # Press SHIFT, NUMPAD2 to test micGestureTap
         runner.SendKeys([keys.Keys.SHIFT, keys.Keys.NUMPAD2])
         self.assertTrue(runner.JSTestsSucceeded())
diff --git a/cobalt/black_box_tests/tests/suspend_visibility.py b/cobalt/black_box_tests/tests/suspend_visibility.py
index 17fa597..7055d3f 100644
--- a/cobalt/black_box_tests/tests/suspend_visibility.py
+++ b/cobalt/black_box_tests/tests/suspend_visibility.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests correct visibility changes during and after suspend event."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/timer_hit_after_preload.py b/cobalt/black_box_tests/tests/timer_hit_after_preload.py
index 16decec..f48a93f 100644
--- a/cobalt/black_box_tests/tests/timer_hit_after_preload.py
+++ b/cobalt/black_box_tests/tests/timer_hit_after_preload.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests if Cobalt properly handles time expiration after preload mode."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/timer_hit_in_preload.py b/cobalt/black_box_tests/tests/timer_hit_in_preload.py
index e77b1e1..edb0c8f 100644
--- a/cobalt/black_box_tests/tests/timer_hit_in_preload.py
+++ b/cobalt/black_box_tests/tests/timer_hit_in_preload.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests if Cobalt properly handles time expiration during preload mode."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
 
diff --git a/cobalt/black_box_tests/tests/web_debugger.py b/cobalt/black_box_tests/tests/web_debugger.py
index be9b723..5d2d209 100644
--- a/cobalt/black_box_tests/tests/web_debugger.py
+++ b/cobalt/black_box_tests/tests/web_debugger.py
@@ -19,13 +19,12 @@
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import,g-bad-import-order
-
 import json
 import logging
 import os
+from six.moves.urllib.parse import urlsplit
+from six.moves.urllib.parse import urlunsplit
 import sys
-import urlparse
 
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
@@ -246,10 +245,10 @@
 
   def create_debugger_connection(self):
     devtools_url = self.runner.GetCval('Cobalt.Server.DevTools')
-    parts = list(urlparse.urlsplit(devtools_url))
+    parts = list(urlsplit(devtools_url))
     parts[0] = 'ws'  # scheme
     parts[2] = '/devtools/page/cobalt'  # path
-    ws_url = urlparse.urlunsplit(parts)
+    ws_url = urlunsplit(parts)
     return DebuggerConnection(ws_url)
 
   def test_runtime(self):
diff --git a/cobalt/black_box_tests/tests/web_platform_tests.py b/cobalt/black_box_tests/tests/web_platform_tests.py
index 84df8c3..2c4fe56 100644
--- a/cobalt/black_box_tests/tests/web_platform_tests.py
+++ b/cobalt/black_box_tests/tests/web_platform_tests.py
@@ -11,13 +11,12 @@
 # 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.
+"""Tests Cobalt web platforms."""
 
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 
-import _env  # pylint: disable=unused-import
-
 from cobalt.black_box_tests import black_box_tests
 from cobalt.black_box_tests.web_platform_test_server import WebPlatformTestServer
 from starboard.tools import abstract_launcher
@@ -47,27 +46,27 @@
       if self.launcher_params.IsEvergreen():
         loader_platform_config = build.GetPlatformConfig(
             self.launcher_params.loader_platform)
-        loader_platform_cobalt_config = loader_platform_config.GetApplicationConfiguration(
+        cobalt_config = loader_platform_config.GetApplicationConfiguration(
             'cobalt')
-        for filter in loader_platform_cobalt_config.GetWebPlatformTestFilters():
-          if filter not in filters:
-            filters.append(filter)
+        for filter_ in cobalt_config.GetWebPlatformTestFilters():
+          if filter_ not in filters:
+            filters.append(filter_)
 
       used_filters = []
 
-      for filter in filters:
-        if filter == test_filter.DISABLE_TESTING:
+      for filter_ in filters:
+        if filter_ == test_filter.DISABLE_TESTING:
           return
-        if filter == test_filter.FILTER_ALL:
+        if filter_ == test_filter.FILTER_ALL:
           return
-        if isinstance(filter, test_filter.TestFilter):
-          if filter.config and filter.config != self.launcher_params.config:
+        if isinstance(filter_, test_filter.TestFilter):
+          if filter_.config and filter_.config != self.launcher_params.config:
             continue
-          if filter.test_name and filter.test_name == test_filter.FILTER_ALL:
+          if filter_.test_name and filter_.test_name == test_filter.FILTER_ALL:
             return
-          used_filters.append(filter.test_name)
+          used_filters.append(filter_.test_name)
         else:
-          used_filters.append(filter)
+          used_filters.append(filter_)
 
       if used_filters:
         target_params.append('--gtest_filter=-{}'.format(
diff --git a/cobalt/black_box_tests/tests/web_worker_test.py b/cobalt/black_box_tests/tests/web_worker_test.py
new file mode 100644
index 0000000..1ac8046
--- /dev/null
+++ b/cobalt/black_box_tests/tests/web_worker_test.py
@@ -0,0 +1,29 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests basic Web Worker functionality."""
+
+from cobalt.black_box_tests import black_box_tests
+from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
+
+
+class WebWorkerTest(black_box_tests.BlackBoxTestCase):
+  """Test basic Web Worker functionality."""
+
+  def test_simple(self):
+
+    with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server:
+      url = server.GetURL(file_name='testdata/web_worker_test.html')
+
+      with self.CreateCobaltRunner(url=url) as runner:
+        self.assertTrue(runner.JSTestsSucceeded())
diff --git a/cobalt/black_box_tests/threaded_web_server.py b/cobalt/black_box_tests/threaded_web_server.py
index 2a37dd6..1064355 100644
--- a/cobalt/black_box_tests/threaded_web_server.py
+++ b/cobalt/black_box_tests/threaded_web_server.py
@@ -19,13 +19,13 @@
 
 import logging
 import os
-import SimpleHTTPServer
+from six.moves import SimpleHTTPServer
+from six.moves import socketserver
 import socket
-import SocketServer
 import threading
 
 
-class _ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
+class _ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
   pass
 
 
@@ -54,8 +54,8 @@
                                               self._base_path)
       return potential_path
 
-    def log_message(self, format, *args):
-      logging.info(format % (args))
+    def log_message(self, format_string, *args):
+      logging.info(format_string % (args))  # pylint: disable=logging-not-lazy
 
   return TestDataHTTPRequestHandler
 
@@ -67,6 +67,7 @@
                handler=MakeRequestHandlerClass(os.path.dirname(__file__)),
                binding_address=None):
     _ThreadedTCPServer.allow_reuse_address = True
+    _ThreadedTCPServer.block_on_close = False
 
     if not binding_address:
       # No specific binding address specified. Bind to any interfaces instead.
diff --git a/cobalt/black_box_tests/web_platform_test_server.py b/cobalt/black_box_tests/web_platform_test_server.py
index d3a9d96..50ebda8 100644
--- a/cobalt/black_box_tests/web_platform_test_server.py
+++ b/cobalt/black_box_tests/web_platform_test_server.py
@@ -23,7 +23,7 @@
 WPT_DIR = os.path.join(SRC_DIR, 'third_party', 'web_platform_tests')
 sys.path.insert(0, WPT_DIR)
 
-# pylint: disable=g-import-not-at-top
+# pylint: disable=wrong-import-position
 from tools.serve import serve
 from tools.wptserve.wptserve import stash
 
@@ -46,9 +46,9 @@
     kwargs = vars(serve.get_parser().parse_args())
 
     # Configuration script to setup server used for serving web platform tests.
-    config = serve.load_config(os.path.join(WPT_DIR, 'config.default.json'),
-                               os.path.join(WPT_DIR, 'config.json'),
-                               **kwargs)
+    config = serve.load_config(
+        os.path.join(WPT_DIR, 'config.default.json'),
+        os.path.join(WPT_DIR, 'config.json'), **kwargs)
     config['ports']['http'][0] = int(self._wpt_http_port)
 
     serve.setup_logger(config['log_level'])
@@ -56,13 +56,13 @@
     with stash.StashServer((self._binding_address, serve.get_port()),
                            authkey=str(uuid.uuid4())):
       with serve.get_ssl_environment(config) as ssl_env:
-        _, self._servers = serve.start(config, ssl_env,
-                                       serve.default_routes(), **kwargs)
+        _, self._servers = serve.start(config, ssl_env, serve.default_routes(),
+                                       **kwargs)
         self._server_started = True
 
         try:
-          while any(item.is_alive()
-                    for item in serve.iter_procs(self._servers)):
+          while any(
+              item.is_alive() for item in serve.iter_procs(self._servers)):
             for item in serve.iter_procs(self._servers):
               item.join(1)
         except KeyboardInterrupt:
@@ -77,7 +77,7 @@
     return self
 
   def __exit__(self, exc_type, exc_value, traceback):
-    for _, servers in self._servers.iteritems():
+    for servers in self._servers.values():
       for _, server in servers:
         server.kill()
     self._server_thread.join()
diff --git a/cobalt/browser/BUILD.gn b/cobalt/browser/BUILD.gn
index 6c9ae83..899f2c5 100644
--- a/cobalt/browser/BUILD.gn
+++ b/cobalt/browser/BUILD.gn
@@ -66,7 +66,19 @@
     ]
   }
   if (!is_gold) {
-    content_deps += [ "//cobalt/debug:copy_backend_web_files" ]
+    content_deps += [
+      "//cobalt/debug/backend/content:copy_backend_web_files",
+      "//cobalt/debug/console/content:copy_console_web_files",
+      "//cobalt/debug/remote/content:copy_remote_web_files",
+      "//third_party/devtools:build_release_devtools",
+      "//third_party/devtools:copy_devtools_modules",
+      "//third_party/devtools:copy_inspector_images",
+      "//third_party/devtools:frontend_protocol_sources",
+      "//third_party/devtools:supported_css_properties",
+    ]
+  }
+  if (defined(platform_i18n_config_path)) {
+    content_deps += [ platform_i18n_config_path ]
   }
 }
 
@@ -104,6 +116,8 @@
     "render_tree_combiner.h",
     "screen_shot_writer.cc",
     "screen_shot_writer.h",
+    "service_worker_registry.cc",
+    "service_worker_registry.h",
     "splash_screen.cc",
     "splash_screen.h",
     "splash_screen_cache.cc",
@@ -163,6 +177,8 @@
     "//cobalt/system_window",
     "//cobalt/trace_event",
     "//cobalt/ui_navigation",
+    "//cobalt/watchdog",
+    "//cobalt/web",
     "//cobalt/webdriver",
     "//cobalt/websocket",
     "//cobalt/worker",
@@ -176,14 +192,19 @@
     "//url",
   ]
 
-  if (!is_gold) {
+  if (is_gold) {
+    defines = [ "COBALT_FORCE_HTTPS" ]
+  } else {
     sources += [
       "debug_console.cc",
       "debug_console.h",
       "lifecycle_console_commands.cc",
       "lifecycle_console_commands.h",
     ]
-    defines = [ "ENABLE_ABOUT_SCHEME" ]
+    defines = [
+      "ENABLE_ABOUT_SCHEME",
+      "COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING",
+    ]
     deps += [
       "//cobalt/debug",
       "//cobalt/debug:console_command_manager",
@@ -276,6 +297,7 @@
   deps = [
     # Ensure that all the files have been generated before trying to compile.
     ":generated_types",
+    "//cobalt/h5vcc",
     "//cobalt/webdriver",
   ]
 }
@@ -389,3 +411,14 @@
 cache_templates("cached_jinja_templates") {
   output_dir = _bindings_scripts_output_dir
 }
+
+target(final_executable_type, "snapshot_app_stats") {
+  sources = [ "snapshot_app_stats.cc" ]
+  deps = [
+    ":browser",
+    ":browser_switches",
+    ":cobalt",
+    "//cobalt/base",
+    "//third_party/protobuf:protobuf_lite",
+  ]
+}
diff --git a/cobalt/browser/application.cc b/cobalt/browser/application.cc
index e048e2f..9cd3339 100644
--- a/cobalt/browser/application.cc
+++ b/cobalt/browser/application.cc
@@ -72,6 +72,7 @@
 #endif  // defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 #include "cobalt/system_window/input_event.h"
 #include "cobalt/trace_event/scoped_trace_to_file.h"
+#include "cobalt/watchdog/watchdog.h"
 #include "starboard/configuration.h"
 #include "starboard/event.h"
 #include "starboard/system.h"
@@ -103,13 +104,7 @@
 #if defined(ENABLE_WEBDRIVER) || defined(ENABLE_DEBUGGER)
 std::string GetDevServersListenIp() {
   bool ip_v6;
-#if SB_API_VERSION >= 12
   ip_v6 = SbSocketIsIpv6Supported();
-#elif SB_HAS(IPV6)
-  ip_v6 = true;
-#else
-  ip_v6 = false;
-#endif
   // Default to INADDR_ANY
   std::string listen_ip(ip_v6 ? "::" : "0.0.0.0");
 
@@ -586,7 +581,15 @@
           kMemoryTrackerCommandShortHelp, kMemoryTrackerCommandLongHelp))
 #endif  // defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
 {
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::CreateInstance();
+  DCHECK(watchdog);
+
   DCHECK(!quit_closure_.is_null());
+  if (should_preload) {
+    preload_timestamp_ = timestamp;
+  } else {
+    start_timestamp_ = timestamp;
+  }
   // Check to see if a timed_trace has been set, indicating that we should
   // begin a timed trace upon startup.
   base::TimeDelta trace_duration = GetTimedTraceDuration();
@@ -644,12 +647,11 @@
   unconsumed_deep_link_ = GetInitialDeepLink();
   DLOG(INFO) << "Initial deep link: " << unconsumed_deep_link_;
 
-  WebModule::Options web_options;
+  WebModule::Options web_options("MainWebModule");
   storage::StorageManager::Options storage_manager_options;
   network::NetworkModule::Options network_module_options;
   // Create the main components of our browser.
   BrowserModule::Options options(web_options);
-  options.web_module_options.name = "MainWebModule";
   network_module_options.preferred_language = language;
   options.command_line_auto_mem_settings =
       memory_settings::GetSettings(*command_line);
@@ -669,7 +671,8 @@
   ApplyCommandLineSettingsToRendererOptions(&options.renderer_module_options);
 
   if (command_line->HasSwitch(browser::switches::kDisableJavaScriptJit)) {
-    options.web_module_options.javascript_engine_options.disable_jit = true;
+    options.web_module_options.web_options.javascript_engine_options
+        .disable_jit = true;
   }
 
   if (command_line->HasSwitch(
@@ -683,12 +686,10 @@
     storage_manager_options.savegame_options.factory =
         &storage::SavegameFake::Create;
   }
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
+
   if (command_line->HasSwitch(browser::switches::kDisableOnScreenKeyboard)) {
     options.enable_on_screen_keyboard = false;
   }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
 #endif  // defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
 
@@ -727,7 +728,8 @@
   }
 
   // User can specify an extra search path entry for files loaded via file://.
-  options.web_module_options.extra_web_file_dir = GetExtraWebFileDir();
+  options.web_module_options.web_options.extra_web_file_dir =
+      GetExtraWebFileDir();
   SecurityFlags security_flags{csp::kCSPRequired, network::kHTTPSRequired};
   // Set callback to be notified when a navigation occurs that destroys the
   // underlying WebModule.
@@ -805,12 +807,18 @@
   options.web_module_options.csp_enforcement_mode = dom::kCspEnforcementEnable;
 
   options.requested_viewport_size = requested_viewport_size;
+
+  // Set callback to collect unload event time before firing document's unload
+  // event.
+  options.web_module_options.collect_unload_event_time_callback = base::Bind(
+      &Application::CollectUnloadEventTimingInfo, base::Unretained(this));
+
   account_manager_.reset(new account::AccountManager());
 
   storage_manager_.reset(new storage::StorageManager(storage_manager_options));
 
   network_module_.reset(new network::NetworkModule(
-      CreateUserAgentString(browser::GetUserAgentPlatformInfoFromSystem()),
+      CreateUserAgentString(GetUserAgentPlatformInfoFromSystem()),
       storage_manager_.get(), &event_dispatcher_, network_module_options));
 
   AddCrashHandlerAnnotations();
@@ -845,9 +853,6 @@
 #endif
       options));
 
-  DCHECK(browser_module_);
-  browser_module_->SetApplicationStartOrPreloadTimestamp(should_preload,
-                                                         timestamp);
   UpdateUserAgent();
 
   // Register event callbacks.
@@ -855,7 +860,6 @@
       &Application::OnWindowSizeChangedEvent, base::Unretained(this));
   event_dispatcher_.AddEventCallback(base::WindowSizeChangedEvent::TypeId(),
                                      window_size_change_event_callback_);
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   on_screen_keyboard_shown_event_callback_ = base::Bind(
       &Application::OnOnScreenKeyboardShownEvent, base::Unretained(this));
   event_dispatcher_.AddEventCallback(base::OnScreenKeyboardShownEvent::TypeId(),
@@ -881,16 +885,11 @@
   event_dispatcher_.AddEventCallback(
       base::OnScreenKeyboardSuggestionsUpdatedEvent::TypeId(),
       on_screen_keyboard_suggestions_updated_event_callback_);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   on_caption_settings_changed_event_callback_ = base::Bind(
       &Application::OnCaptionSettingsChangedEvent, base::Unretained(this));
   event_dispatcher_.AddEventCallback(
       base::AccessibilityCaptionSettingsChangedEvent::TypeId(),
       on_caption_settings_changed_event_callback_);
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   on_window_on_online_event_callback_ =
       base::Bind(&Application::OnWindowOnOnlineEvent, base::Unretained(this));
   event_dispatcher_.AddEventCallback(base::WindowOnOnlineEvent::TypeId(),
@@ -958,10 +957,12 @@
 }
 
 Application::~Application() {
-// explicitly reset here because the destruction of the object is complex
-// and involves a thread join. If this were to hang the app then having
-// the destruction at this point gives a real file-line number and a place
-// for the debugger to land.
+  // explicitly reset here because the destruction of the object is complex
+  // and involves a thread join. If this were to hang the app then having
+  // the destruction at this point gives a real file-line number and a place
+  // for the debugger to land.
+  watchdog::Watchdog::DeleteInstance();
+
 #if defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
   memory_tracker_tool_.reset(NULL);
 #endif  // defined(ENABLE_DEBUGGER) && defined(STARBOARD_ALLOWS_MEMORY_TRACKING)
@@ -969,7 +970,6 @@
   // Unregister event callbacks.
   event_dispatcher_.RemoveEventCallback(base::WindowSizeChangedEvent::TypeId(),
                                         window_size_change_event_callback_);
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   event_dispatcher_.RemoveEventCallback(
       base::OnScreenKeyboardShownEvent::TypeId(),
       on_screen_keyboard_shown_event_callback_);
@@ -985,13 +985,9 @@
   event_dispatcher_.RemoveEventCallback(
       base::OnScreenKeyboardSuggestionsUpdatedEvent::TypeId(),
       on_screen_keyboard_suggestions_updated_event_callback_);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   event_dispatcher_.RemoveEventCallback(
       base::AccessibilityCaptionSettingsChangedEvent::TypeId(),
       on_caption_settings_changed_event_callback_);
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 #if SB_API_VERSION >= 13
   event_dispatcher_.RemoveEventCallback(
       base::DateTimeConfigurationChangedEvent::TypeId(),
@@ -1006,10 +1002,12 @@
         base::Bind(&Application::Start, base::Unretained(this), timestamp));
     return;
   }
+  DCHECK_CALLED_ON_VALID_THREAD(application_event_thread_checker_);
 
+  if (!start_timestamp_.has_value()) {
+    start_timestamp_ = timestamp;
+  }
   OnApplicationEvent(kSbEventTypeStart, timestamp);
-  browser_module_->SetApplicationStartOrPreloadTimestamp(false /*is_preload*/,
-                                                         timestamp);
 }
 
 void Application::Quit() {
@@ -1018,6 +1016,7 @@
         FROM_HERE, base::Bind(&Application::Quit, base::Unretained(this)));
     return;
   }
+  DCHECK_CALLED_ON_VALID_THREAD(application_event_thread_checker_);
 
   quit_closure_.Run();
 }
@@ -1060,7 +1059,6 @@
           static_cast<SbEventWindowSizeChangedData*>(starboard_event->data)
               ->size));
       break;
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
     case kSbEventTypeOnScreenKeyboardShown:
       DCHECK(starboard_event->data);
       DispatchEventInternal(new base::OnScreenKeyboardShownEvent(
@@ -1083,8 +1081,6 @@
       DispatchEventInternal(new base::OnScreenKeyboardSuggestionsUpdatedEvent(
           *static_cast<int*>(starboard_event->data)));
       break;
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
     case kSbEventTypeLink: {
 #if SB_API_VERSION >= 13
       DispatchDeepLink(static_cast<const char*>(starboard_event->data),
@@ -1101,21 +1097,11 @@
     case kSbEventTypeAccessiblitySettingsChanged:
 #endif  // SB_API_VERSION >= 13
       DispatchEventInternal(new base::AccessibilitySettingsChangedEvent());
-#if SB_API_VERSION < 12
-      // Also dispatch the newer text-to-speech settings changed event since
-      // the specific kSbEventTypeAccessib(i)lityTextToSpeechSettingsChanged
-      // event is not available in this starboard version.
-      DispatchEventInternal(
-          new base::AccessibilityTextToSpeechSettingsChangedEvent());
-#endif
       break;
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
     case kSbEventTypeAccessibilityCaptionSettingsChanged:
       DispatchEventInternal(
           new base::AccessibilityCaptionSettingsChangedEvent());
       break;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
-#if SB_API_VERSION >= 12
 #if SB_API_VERSION >= 13
     case kSbEventTypeAccessibilityTextToSpeechSettingsChanged:
 #else
@@ -1124,7 +1110,6 @@
       DispatchEventInternal(
           new base::AccessibilityTextToSpeechSettingsChangedEvent());
       break;
-#endif
 #if SB_API_VERSION >= 13
     case kSbEventTypeOsNetworkDisconnected:
       DispatchEventInternal(new base::WindowOnOfflineEvent());
@@ -1157,85 +1142,88 @@
   TRACE_EVENT0("cobalt::browser", "Application::OnApplicationEvent()");
   DCHECK_CALLED_ON_VALID_THREAD(application_event_thread_checker_);
 
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+
   switch (event_type) {
     case kSbEventTypeStop:
-      DLOG(INFO) << "Got quit event.";
+      LOG(INFO) << "Got quit event.";
+      if (watchdog) watchdog->UpdateState(base::kApplicationStateStopped);
       Quit();
-      DLOG(INFO) << "Finished quitting.";
+      LOG(INFO) << "Finished quitting.";
       break;
     case kSbEventTypeStart:
-      DLOG(INFO) << "Got start event.";
+      LOG(INFO) << "Got start event.";
       browser_module_->Reveal(timestamp);
       browser_module_->Focus(timestamp);
-      DLOG(INFO) << "Finished starting.";
+      LOG(INFO) << "Finished starting.";
       break;
 #if SB_API_VERSION >= 13
     case kSbEventTypeBlur:
-      DLOG(INFO) << "Got blur event.";
+      LOG(INFO) << "Got blur event.";
       browser_module_->Blur(timestamp);
-      DLOG(INFO) << "Finished blurring.";
+      LOG(INFO) << "Finished blurring.";
       break;
     case kSbEventTypeFocus:
-      DLOG(INFO) << "Got focus event.";
+      LOG(INFO) << "Got focus event.";
       browser_module_->Focus(timestamp);
-      DLOG(INFO) << "Finished focusing.";
+      LOG(INFO) << "Finished focusing.";
       break;
     case kSbEventTypeConceal:
-      DLOG(INFO) << "Got conceal event.";
+      LOG(INFO) << "Got conceal event.";
       browser_module_->Conceal(timestamp);
-      DLOG(INFO) << "Finished concealing.";
+      LOG(INFO) << "Finished concealing.";
       break;
     case kSbEventTypeReveal:
       DCHECK(SbSystemSupportsResume());
-      DLOG(INFO) << "Got reveal event.";
+      LOG(INFO) << "Got reveal event.";
       browser_module_->Reveal(timestamp);
-      DLOG(INFO) << "Finished revealing.";
+      LOG(INFO) << "Finished revealing.";
       break;
     case kSbEventTypeFreeze:
-      DLOG(INFO) << "Got freeze event.";
+      LOG(INFO) << "Got freeze event.";
       browser_module_->Freeze(timestamp);
 #if SB_IS(EVERGREEN)
       if (updater_module_) updater_module_->Suspend();
 #endif
-      DLOG(INFO) << "Finished freezing.";
+      LOG(INFO) << "Finished freezing.";
       break;
     case kSbEventTypeUnfreeze:
-      DLOG(INFO) << "Got unfreeze event.";
+      LOG(INFO) << "Got unfreeze event.";
       browser_module_->Unfreeze(timestamp);
 #if SB_IS(EVERGREEN)
       if (updater_module_) updater_module_->Resume();
 #endif
-      DLOG(INFO) << "Finished unfreezing.";
+      LOG(INFO) << "Finished unfreezing.";
       break;
 #else
     case kSbEventTypePause:
-      DLOG(INFO) << "Got pause event.";
+      LOG(INFO) << "Got pause event.";
       browser_module_->Blur(timestamp);
-      DLOG(INFO) << "Finished pausing.";
+      LOG(INFO) << "Finished pausing.";
       break;
     case kSbEventTypeUnpause:
-      DLOG(INFO) << "Got unpause event.";
+      LOG(INFO) << "Got unpause event.";
       browser_module_->Focus(timestamp);
-      DLOG(INFO) << "Finished unpausing.";
+      LOG(INFO) << "Finished unpausing.";
       break;
     case kSbEventTypeSuspend:
-      DLOG(INFO) << "Got suspend event.";
+      LOG(INFO) << "Got suspend event.";
       browser_module_->Conceal(timestamp);
       browser_module_->Freeze(timestamp);
 #if SB_IS(EVERGREEN)
       if (updater_module_) updater_module_->Suspend();
 #endif
-      DLOG(INFO) << "Finished suspending.";
+      LOG(INFO) << "Finished suspending.";
       break;
     case kSbEventTypeResume:
       DCHECK(SbSystemSupportsResume());
-      DLOG(INFO) << "Got resume event.";
+      LOG(INFO) << "Got resume event.";
       browser_module_->Unfreeze(timestamp);
       browser_module_->Reveal(timestamp);
 #if SB_IS(EVERGREEN)
       if (updater_module_) updater_module_->Resume();
 #endif
-      DLOG(INFO) << "Finished resuming.";
+      LOG(INFO) << "Finished resuming.";
       break;
 #endif  // SB_API_VERSION >= 13
     case kSbEventTypeLowMemory:
@@ -1246,24 +1234,17 @@
     // All of the remaining event types are unexpected:
     case kSbEventTypePreload:
     case kSbEventTypeWindowSizeChanged:
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
     case kSbEventTypeAccessibilityCaptionSettingsChanged:
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
-#if SB_API_VERSION >= 12
 #if SB_API_VERSION >= 13
     case kSbEventTypeAccessibilityTextToSpeechSettingsChanged:
 #else
     case kSbEventTypeAccessiblityTextToSpeechSettingsChanged:
 #endif  // SB_API_VERSION >= 13
-#endif  // SB_API_VERSION >= 12
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
     case kSbEventTypeOnScreenKeyboardBlurred:
     case kSbEventTypeOnScreenKeyboardFocused:
     case kSbEventTypeOnScreenKeyboardHidden:
     case kSbEventTypeOnScreenKeyboardShown:
     case kSbEventTypeOnScreenKeyboardSuggestionsUpdated:
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 #if SB_API_VERSION >= 13
     case kSbEventTypeAccessibilitySettingsChanged:
 #else
@@ -1284,6 +1265,7 @@
       NOTREACHED() << "Unexpected event type: " << event_type;
       return;
   }
+  if (watchdog) watchdog->UpdateState(browser_module_->GetApplicationState());
 }
 
 void Application::OnWindowSizeChangedEvent(const base::Event* event) {
@@ -1304,7 +1286,6 @@
   browser_module_->OnWindowSizeChanged(viewport_size);
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void Application::OnOnScreenKeyboardShownEvent(const base::Event* event) {
   TRACE_EVENT0("cobalt::browser",
                "Application::OnOnScreenKeyboardShownEvent()");
@@ -1345,10 +1326,7 @@
       base::polymorphic_downcast<
           const base::OnScreenKeyboardSuggestionsUpdatedEvent*>(event));
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 void Application::OnCaptionSettingsChangedEvent(const base::Event* event) {
   TRACE_EVENT0("cobalt::browser",
                "Application::OnCaptionSettingsChangedEvent()");
@@ -1356,7 +1334,6 @@
       base::polymorphic_downcast<
           const base::AccessibilityCaptionSettingsChangedEvent*>(event));
 }
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 
 void Application::OnWindowOnOnlineEvent(const base::Event* event) {
   browser_module_->OnWindowOnOnlineEvent(
@@ -1378,14 +1355,34 @@
 }
 #endif
 
-void Application::WebModuleCreated() {
+void Application::WebModuleCreated(WebModule* web_module) {
   TRACE_EVENT0("cobalt::browser", "Application::WebModuleCreated()");
+  DCHECK(web_module);
+  if (preload_timestamp_.has_value()) {
+    web_module->SetApplicationStartOrPreloadTimestamp(
+        true, preload_timestamp_.value());
+  }
+  if (start_timestamp_.has_value()) {
+    web_module->SetApplicationStartOrPreloadTimestamp(false,
+                                                      start_timestamp_.value());
+  }
   DispatchDeepLinkIfNotConsumed();
 #if defined(ENABLE_WEBDRIVER)
   if (web_driver_module_) {
     web_driver_module_->OnWindowRecreated();
   }
 #endif
+  if (!unload_event_start_time_.is_null() ||
+      !unload_event_end_time_.is_null()) {
+    web_module->SetUnloadEventTimingInfo(unload_event_start_time_,
+                                         unload_event_end_time_);
+  }
+}
+
+void Application::CollectUnloadEventTimingInfo(base::TimeTicks start_time,
+                                               base::TimeTicks end_time) {
+  unload_event_start_time_ = start_time;
+  unload_event_end_time_ = end_time;
 }
 
 Application::CValStats::CValStats()
diff --git a/cobalt/browser/application.h b/cobalt/browser/application.h
index 7915a9d..65f8f67 100644
--- a/cobalt/browser/application.h
+++ b/cobalt/browser/application.h
@@ -28,7 +28,9 @@
 #include "cobalt/base/event_dispatcher.h"
 #include "cobalt/browser/browser_module.h"
 #include "cobalt/browser/memory_tracker/tool.h"
+#include "cobalt/network/network_module.h"
 #include "cobalt/system_window/system_window.h"
+#include "starboard/time.h"
 #if SB_IS(EVERGREEN)
 #include "cobalt/updater/updater_module.h"
 #endif
@@ -73,19 +75,12 @@
   // Called to handle a window size change event.
   void OnWindowSizeChangedEvent(const base::Event* event);
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   void OnOnScreenKeyboardShownEvent(const base::Event* event);
   void OnOnScreenKeyboardHiddenEvent(const base::Event* event);
   void OnOnScreenKeyboardFocusedEvent(const base::Event* event);
   void OnOnScreenKeyboardBlurredEvent(const base::Event* event);
   void OnOnScreenKeyboardSuggestionsUpdatedEvent(const base::Event* event);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   void OnCaptionSettingsChangedEvent(const base::Event* event);
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
-
   void OnWindowOnOnlineEvent(const base::Event* event);
   void OnWindowOnOfflineEvent(const base::Event* event);
 
@@ -94,7 +89,10 @@
 #endif
 
   // Called when a navigation occurs in the BrowserModule.
-  void WebModuleCreated();
+  void WebModuleCreated(WebModule* web_module);
+
+  void CollectUnloadEventTimingInfo(base::TimeTicks start_time,
+                                    base::TimeTicks end_time);
 
   // A conduit for system events.
   base::EventDispatcher event_dispatcher_;
@@ -118,17 +116,12 @@
 
   // Event callbacks.
   base::EventCallback window_size_change_event_callback_;
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   base::EventCallback on_screen_keyboard_shown_event_callback_;
   base::EventCallback on_screen_keyboard_hidden_event_callback_;
   base::EventCallback on_screen_keyboard_focused_event_callback_;
   base::EventCallback on_screen_keyboard_blurred_event_callback_;
   base::EventCallback on_screen_keyboard_suggestions_updated_event_callback_;
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   base::EventCallback on_caption_settings_changed_event_callback_;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 #if SB_API_VERSION >= SB_NETWORK_EVENT_VERSION
   base::EventCallback on_window_on_online_event_callback_;
   base::EventCallback on_window_on_offline_event_callback_;
@@ -194,6 +187,14 @@
   void UpdatePeriodicStats();
   void DispatchEventInternal(base::Event* event);
 
+  base::Optional<SbTimeMonotonic> preload_timestamp_;
+  base::Optional<SbTimeMonotonic> start_timestamp_;
+
+  // These represent the 'document unload timing info' from the spec to be
+  // passed to the next document.
+  base::TimeTicks unload_event_start_time_;
+  base::TimeTicks unload_event_end_time_;
+
   // The message loop that will handle UI events.
   base::MessageLoop* message_loop_;
 
diff --git a/cobalt/browser/browser.gyp b/cobalt/browser/browser.gyp
deleted file mode 100644
index 6091c14..0000000
--- a/cobalt/browser/browser.gyp
+++ /dev/null
@@ -1,242 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'browser',
-      'type': 'static_library',
-      'sources': [
-        'application.cc',
-        'application.h',
-        'browser_module.cc',
-        'browser_module.h',
-        'device_authentication.cc',
-        'device_authentication.h',
-        'lifecycle_observer.h',
-        'memory_settings/auto_mem.cc',
-        'memory_settings/auto_mem.h',
-        'memory_settings/auto_mem_settings.cc',
-        'memory_settings/auto_mem_settings.h',
-        'memory_settings/calculations.cc',
-        'memory_settings/calculations.h',
-        'memory_settings/checker.cc',
-        'memory_settings/checker.h',
-        'memory_settings/constants.h',
-        'memory_settings/scaling_function.cc',
-        'memory_settings/scaling_function.h',
-        'memory_settings/memory_settings.cc',
-        'memory_settings/memory_settings.h',
-        'memory_settings/pretty_print.cc',
-        'memory_settings/pretty_print.h',
-        'memory_settings/table_printer.cc',
-        'memory_settings/table_printer.h',
-        'memory_settings/texture_dimensions.h',
-        'memory_tracker/tool.cc',
-        'memory_tracker/tool.h',
-        'memory_tracker/tool/buffered_file_writer.cc',
-        'memory_tracker/tool/buffered_file_writer.h',
-        'memory_tracker/tool/compressed_time_series_tool.cc',
-        'memory_tracker/tool/compressed_time_series_tool.h',
-        'memory_tracker/tool/histogram_table_csv_base.h',
-        'memory_tracker/tool/internal_fragmentation_tool.cc',
-        'memory_tracker/tool/internal_fragmentation_tool.h',
-        'memory_tracker/tool/leak_finder_tool.cc',
-        'memory_tracker/tool/leak_finder_tool.h',
-        'memory_tracker/tool/log_writer_tool.cc',
-        'memory_tracker/tool/log_writer_tool.h',
-        'memory_tracker/tool/malloc_stats_tool.cc',
-        'memory_tracker/tool/malloc_stats_tool.h',
-        'memory_tracker/tool/malloc_logger_tool.cc',
-        'memory_tracker/tool/malloc_logger_tool.h',
-        'memory_tracker/tool/memory_size_binner_tool.cc',
-        'memory_tracker/tool/memory_size_binner_tool.h',
-        'memory_tracker/tool/params.cc',
-        'memory_tracker/tool/params.h',
-        'memory_tracker/tool/print_csv_tool.cc',
-        'memory_tracker/tool/print_csv_tool.h',
-        'memory_tracker/tool/print_tool.cc',
-        'memory_tracker/tool/print_tool.h',
-        'memory_tracker/tool/tool_impl.cc',
-        'memory_tracker/tool/tool_impl.h',
-        'memory_tracker/tool/tool_thread.cc',
-        'memory_tracker/tool/tool_thread.h',
-        'memory_tracker/tool/util.cc',
-        'memory_tracker/tool/util.h',
-        'on_screen_keyboard_starboard_bridge.cc',
-        'on_screen_keyboard_starboard_bridge.h',
-        'render_tree_combiner.cc',
-        'render_tree_combiner.h',
-        'screen_shot_writer.cc',
-        'screen_shot_writer.h',
-        'splash_screen.cc',
-        'splash_screen.h',
-        'splash_screen_cache.cc',
-        'splash_screen_cache.h',
-        'suspend_fuzzer.cc',
-        'suspend_fuzzer.h',
-        'switches.cc',
-        'switches.h',
-        'system_platform_error_handler.cc',
-        'system_platform_error_handler.h',
-        'url_handler.cc',
-        'url_handler.h',
-        'user_agent_platform_info.cc',
-        'user_agent_platform_info.h',
-        'user_agent_string.cc',
-        'user_agent_string.h',
-        'web_module.cc',
-        'web_module.h',
-        'web_module_stat_tracker.cc',
-        'web_module_stat_tracker.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/account/account.gyp:account',
-        '<(DEPTH)/cobalt/audio/audio.gyp:audio',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/configuration/configuration.gyp:configuration',
-        '<(DEPTH)/cobalt/css_parser/css_parser.gyp:css_parser',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/dom_parser/dom_parser.gyp:dom_parser',
-        '<(DEPTH)/cobalt/encoding/encoding.gyp:text_encoding',
-        '<(DEPTH)/cobalt/fetch/fetch.gyp:fetch',
-        '<(DEPTH)/cobalt/h5vcc/h5vcc.gyp:h5vcc',
-        '<(DEPTH)/cobalt/input/input.gyp:input',
-        '<(DEPTH)/cobalt/layout/layout.gyp:layout',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-        '<(DEPTH)/cobalt/media/media.gyp:media',
-        '<(DEPTH)/cobalt/media_capture/media_capture.gyp:*',
-        '<(DEPTH)/cobalt/media_session/media_session.gyp:media_session',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/cobalt/overlay_info/overlay_info.gyp:overlay_info',
-        '<(DEPTH)/cobalt/renderer/renderer.gyp:renderer',
-        '<(DEPTH)/cobalt/renderer/test/png_utils/png_utils.gyp:png_utils',
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-        '<(DEPTH)/cobalt/sso/sso.gyp:sso',
-        '<(DEPTH)/cobalt/subtlecrypto/subtlecrypto.gyp:subtlecrypto',
-        '<(DEPTH)/cobalt/system_window/system_window.gyp:system_window',
-        '<(DEPTH)/cobalt/trace_event/trace_event.gyp:trace_event',
-        '<(DEPTH)/cobalt/ui_navigation/ui_navigation.gyp:ui_navigation',
-        '<(DEPTH)/cobalt/webdriver/webdriver.gyp:webdriver',
-        '<(DEPTH)/cobalt/websocket/websocket.gyp:websocket',
-        '<(DEPTH)/cobalt/worker/worker.gyp:*',
-        '<(DEPTH)/cobalt/xhr/xhr.gyp:xhr',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/nb/nb.gyp:nb',
-        '<(DEPTH)/third_party/icu/icu.gyp:icui18n',
-        '<(DEPTH)/url/url.gyp:url',
-        'browser_bindings.gyp:bindings',
-        '<(cobalt_webapi_extension_gyp_target)',
-      ],
-      # This target doesn't generate any headers, but it exposes generated
-      # header files (for idl dictionaries) through this module's public header
-      # files. So mark this target as a hard dependency to ensure that any
-      # dependent targets wait until this target (and its hard dependencies) are
-      # built.
-      #'hard_dependency': 1,
-      'export_dependent_settings': [
-        # Additionally, ensure that the include directories for generated
-        # headers are put on the include directories for targets that depend
-        # on this one.
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-      ],
-      'include_dirs': [
-        # For cobalt_build_id.h
-        '<(SHARED_INTERMEDIATE_DIR)',
-      ],
-      'conditions': [
-        ['max_cobalt_cpu_usage != -1', {
-          'defines': [ 'COBALT_MAX_CPU_USAGE_IN_BYTES' ],
-        }],
-        ['max_cobalt_gpu_usage != -1', {
-          'defines': [ 'COBALT_MAX_GPU_USAGE_IN_BYTES' ],
-        }],
-        ['enable_about_scheme == 1', {
-          'defines': [ 'ENABLE_ABOUT_SCHEME' ],
-        }],
-        ['enable_debugger == 1', {
-          'sources': [
-            'debug_console.cc',
-            'debug_console.h',
-            'lifecycle_console_commands.cc',
-            'lifecycle_console_commands.h',
-          ],
-          'dependencies': [
-            '<(DEPTH)/cobalt/debug/debug.gyp:debug',
-          ],
-        }],
-        ['sb_evergreen == 1', {
-          'dependencies': [
-            '<(DEPTH)/cobalt/updater/updater.gyp:updater',
-          ],
-        }, {
-          'dependencies': [
-            '<@(cobalt_platform_dependencies)',
-          ],
-        }],
-        ['"<(cobalt_webapi_extension_source_idl_files)"!="" or "<(cobalt_webapi_extension_generated_header_idl_files)"!=""', {
-          'defines': [
-            'COBALT_WEBAPI_EXTENSION_DEFINED',
-          ],
-        }],
-      ],
-    },
-
-    {
-      'target_name': 'browser_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'device_authentication_test.cc',
-        'memory_settings/auto_mem_test.cc',
-        'memory_settings/auto_mem_settings_test.cc',
-        'memory_settings/calculations_test.cc',
-        'memory_settings/memory_settings_test.cc',
-        'memory_settings/pretty_print_test.cc',
-        'memory_settings/table_printer_test.cc',
-        'memory_settings/test_common.h',
-        'memory_tracker/tool/tool_impl_test.cc',
-        'memory_tracker/tool/util_test.cc',
-        'user_agent_string_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-        '<(DEPTH)/cobalt/storage/storage.gyp:storage',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'browser',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'browser_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'browser_test',
-      ],
-      'variables': {
-        'executable_name': 'browser_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-  ],
-}
diff --git a/cobalt/browser/browser_bindings.gyp b/cobalt/browser/browser_bindings.gyp
deleted file mode 100644
index 921ae85..0000000
--- a/cobalt/browser/browser_bindings.gyp
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'bindings',
-      'type': 'static_library',
-      'dependencies': [
-        '../h5vcc/h5vcc.gyp:h5vcc',
-        '../webdriver/webdriver.gyp:webdriver',
-        # The generated_bindings target will add all necessary sources to this
-        # target.
-        'browser_bindings_gen.gyp:generated_bindings',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/browser/browser_bindings_gen.gyp b/cobalt/browser/browser_bindings_gen.gyp
deleted file mode 100644
index fc7c2d7..0000000
--- a/cobalt/browser/browser_bindings_gen.gyp
+++ /dev/null
@@ -1,395 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../bindings/bindings.gypi',
-  ],
-  'variables': {
-    # Base directory into which generated sources and intermediate files should
-    # be generated.
-    'bindings_output_dir': '<(SHARED_INTERMEDIATE_DIR)/bindings/browser',
-
-    # Bindings for the interfaces in this list will be generated, and there must
-    # be an implementation declared in a header that lives in the same
-    # directory of each IDL.
-    'source_idl_files': [
-        '../audio/audio_buffer.idl',
-        '../audio/audio_buffer_source_node.idl',
-        '../audio/audio_context.idl',
-        '../audio/audio_destination_node.idl',
-        '../audio/audio_node.idl',
-
-        '../cssom/css.idl',
-        '../cssom/css_condition_rule.idl',
-        '../cssom/css_grouping_rule.idl',
-        '../cssom/css_font_face_rule.idl',
-        '../cssom/css_media_rule.idl',
-        '../cssom/css_keyframe_rule.idl',
-        '../cssom/css_keyframes_rule.idl',
-        '../cssom/css_rule.idl',
-        '../cssom/css_rule_list.idl',
-        '../cssom/css_style_declaration.idl',
-        '../cssom/css_style_rule.idl',
-        '../cssom/css_style_sheet.idl',
-        '../cssom/media_list.idl',
-        '../cssom/style_sheet.idl',
-        '../cssom/style_sheet_list.idl',
-
-        '../dom/abort_controller.idl',
-        '../dom/abort_signal.idl',
-        '../dom/animation_event.idl',
-        '../dom/attr.idl',
-        '../dom/audio_track.idl',
-        '../dom/audio_track_list.idl',
-        '../dom/blob.idl',
-        '../dom/c_val_view.idl',
-        '../dom/camera_3d.idl',
-        '../dom/captions/system_caption_settings.idl',
-        '../dom/cdata_section.idl',
-        '../dom/character_data.idl',
-        '../dom/cobalt_ua_data_values_interface.idl',
-        '../dom/comment.idl',
-        '../dom/crypto.idl',
-        '../dom/custom_event.idl',
-        '../dom/device_orientation_event.idl',
-        '../dom/document.idl',
-        '../dom/document_timeline.idl',
-        '../dom/document_type.idl',
-        '../dom/dom_exception.idl',
-        '../dom/dom_implementation.idl',
-        '../dom/dom_parser.idl',
-        '../dom/dom_rect.idl',
-        '../dom/dom_rect_list.idl',
-        '../dom/dom_rect_read_only.idl',
-        '../dom/dom_string_map.idl',
-        '../dom/dom_token_list.idl',
-        '../dom/element.idl',
-        '../dom/eme/media_encrypted_event.idl',
-        '../dom/eme/media_key_message_event.idl',
-        '../dom/eme/media_key_session.idl',
-        '../dom/eme/media_key_status_map.idl',
-        '../dom/eme/media_key_system_access.idl',
-        '../dom/eme/media_keys.idl',
-        '../dom/error_event.idl',
-        '../dom/event.idl',
-        '../dom/event_listener.idl',
-        '../dom/event_target.idl',
-        '../dom/focus_event.idl',
-        '../dom/history.idl',
-        '../dom/html_anchor_element.idl',
-        '../dom/html_audio_element.idl',
-        '../dom/html_body_element.idl',
-        '../dom/html_br_element.idl',
-        '../dom/html_collection.idl',
-        '../dom/html_div_element.idl',
-        '../dom/html_element.idl',
-        '../dom/html_head_element.idl',
-        '../dom/html_heading_element.idl',
-        '../dom/html_html_element.idl',
-        '../dom/html_image_element.idl',
-        '../dom/html_link_element.idl',
-        '../dom/html_media_element.idl',
-        '../dom/html_meta_element.idl',
-        '../dom/html_paragraph_element.idl',
-        '../dom/html_script_element.idl',
-        '../dom/html_span_element.idl',
-        '../dom/html_style_element.idl',
-        '../dom/html_title_element.idl',
-        '../dom/html_unknown_element.idl',
-        '../dom/html_video_element.idl',
-        '../dom/input_event.idl',
-        '../dom/intersection_observer.idl',
-        '../dom/intersection_observer_entry.idl',
-        '../dom/keyboard_event.idl',
-        '../dom/location.idl',
-        '../dom/lottie_frame_custom_event.idl',
-        '../dom/lottie_player.idl',
-        '../dom/media_error.idl',
-        '../dom/media_query_list.idl',
-        '../dom/media_source.idl',
-        '../dom/memory_info.idl',
-        '../dom/message_event.idl',
-        '../dom/mime_type_array.idl',
-        '../dom/mouse_event.idl',
-        '../dom/mutation_observer.idl',
-        '../dom/mutation_record.idl',
-        '../dom/named_node_map.idl',
-        '../dom/navigator.idl',
-        '../dom/navigator_ua_data.idl',
-        '../dom/node.idl',
-        '../dom/node_list.idl',
-        '../dom/on_error_event_listener.idl',
-        '../dom/on_screen_keyboard.idl',
-        '../dom/performance.idl',
-        '../dom/performance_entry.idl',
-        '../dom/performance_lifecycle_timing.idl',
-        '../dom/performance_mark.idl',
-        '../dom/performance_measure.idl',
-        '../dom/performance_observer.idl',
-        '../dom/performance_observer_entry_list.idl',
-        '../dom/performance_resource_timing.idl',
-        '../dom/performance_timing.idl',
-        '../dom/plugin_array.idl',
-        '../dom/pointer_event.idl',
-        '../dom/progress_event.idl',
-        '../dom/screen.idl',
-        '../dom/screenshot.idl',
-        '../dom/security_policy_violation_event.idl',
-        '../dom/source_buffer.idl',
-        '../dom/source_buffer_list.idl',
-        '../dom/storage.idl',
-        '../dom/storage_event.idl',
-        '../dom/test_runner.idl',
-        '../dom/text.idl',
-        '../dom/time_ranges.idl',
-        '../dom/track_default.idl',
-        '../dom/track_default_list.idl',
-        '../dom/track_event.idl',
-        '../dom/transition_event.idl',
-        '../dom/ui_event.idl',
-        '../dom/url.idl',
-        '../dom/video_playback_quality.idl',
-        '../dom/video_track.idl',
-        '../dom/video_track_list.idl',
-        '../dom/wheel_event.idl',
-        '../dom/window.idl',
-        '../dom/xml_document.idl',
-        '../dom/xml_serializer.idl',
-
-        '../encoding/text_decoder.idl',
-        '../encoding/text_encoder.idl',
-
-        '../fetch/fetch_internal.idl',
-
-        '../h5vcc/dial/dial_http_request.idl',
-        '../h5vcc/dial/dial_http_response.idl',
-        '../h5vcc/dial/dial_server.idl',
-        '../h5vcc/h5vcc.idl',
-        '../h5vcc/h5vcc_accessibility.idl',
-        '../h5vcc/h5vcc_account_info.idl',
-        '../h5vcc/h5vcc_account_manager.idl',
-        '../h5vcc/h5vcc_audio_config.idl',
-        '../h5vcc/h5vcc_audio_config_array.idl',
-        '../h5vcc/h5vcc_crash_log.idl',
-        '../h5vcc/h5vcc_deep_link_event_target.idl',
-        '../h5vcc/h5vcc_platform_service.idl',
-        '../h5vcc/h5vcc_runtime.idl',
-        '../h5vcc/h5vcc_runtime_event_target.idl',
-        '../h5vcc/h5vcc_settings.idl',
-        '../h5vcc/h5vcc_sso.idl',
-        '../h5vcc/h5vcc_storage.idl',
-        '../h5vcc/h5vcc_screen.idl',
-        '../h5vcc/h5vcc_system.idl',
-        '../h5vcc/h5vcc_trace_event.idl',
-        '../h5vcc/h5vcc_updater.idl',
-
-        '../media_capture/blob_event.idl',
-        '../media_capture/media_device_info.idl',
-        '../media_capture/media_devices.idl',
-        '../media_capture/media_recorder.idl',
-
-        '../media_session/media_metadata.idl',
-        '../media_session/media_session.idl',
-
-        '../media_stream/media_stream.idl',
-        '../media_stream/media_stream_track.idl',
-
-        '../speech/speech_recognition.idl',
-        '../speech/speech_recognition_alternative.idl',
-        '../speech/speech_recognition_error.idl',
-        '../speech/speech_recognition_event.idl',
-        '../speech/speech_recognition_result.idl',
-        '../speech/speech_recognition_result_list.idl',
-
-        '../speech/speech_synthesis.idl',
-        '../speech/speech_synthesis_error_event.idl',
-        '../speech/speech_synthesis_event.idl',
-        '../speech/speech_synthesis_utterance.idl',
-        '../speech/speech_synthesis_voice.idl',
-
-        '../subtlecrypto/crypto_key.idl',
-        '../subtlecrypto/subtle_crypto.idl',
-
-        '../web_animations/animatable.idl',
-        '../web_animations/animation.idl',
-        '../web_animations/animation_effect_read_only.idl',
-        '../web_animations/animation_effect_timing_read_only.idl',
-        '../web_animations/animation_timeline.idl',
-        '../web_animations/keyframe.idl',
-        '../web_animations/keyframe_effect_read_only.idl',
-
-        '../webdriver/script_executor.idl',
-        '../webdriver/script_executor_params.idl',
-        '../webdriver/script_executor_result.idl',
-
-        '../websocket/close_event.idl',
-        '../websocket/web_socket.idl',
-
-        '../worker/service_worker_container.idl',
-
-        '../xhr/xml_http_request.idl',
-        '../xhr/xml_http_request_event_target.idl',
-        '../xhr/xml_http_request_upload.idl',
-
-        '<@(cobalt_webapi_extension_source_idl_files)',
-    ],
-
-    # IDL files that will end up generating a .h that will be #included in
-    # Cobalt directly. IDL files for dictionaries and enums.
-    'generated_header_idl_files': [
-        '../audio/audio_node_channel_count_mode.idl',
-        '../audio/audio_node_channel_interpretation.idl',
-        '../debug/console/console_command.idl',
-        '../debug/console/debug_console_mode.idl',
-        '../dom/blob_property_bag.idl',
-        '../dom/captions/caption_character_edge_style.idl',
-        '../dom/captions/caption_color.idl',
-        '../dom/captions/caption_font_family.idl',
-        '../dom/captions/caption_font_size_percentage.idl',
-        '../dom/captions/caption_opacity_percentage.idl',
-        '../dom/captions/caption_state.idl',
-        '../dom/cobalt_ua_data_values.idl',
-        '../dom/custom_event_init.idl',
-        '../dom/device_orientation_event_init.idl',
-        '../dom/document_ready_state.idl',
-        '../dom/dom_parser_supported_type.idl',
-        '../dom/eme/media_encrypted_event_init.idl',
-        '../dom/eme/media_key_message_event_init.idl',
-        '../dom/eme/media_key_message_type.idl',
-        '../dom/eme/media_key_session_type.idl',
-        '../dom/eme/media_key_status.idl',
-        '../dom/eme/media_key_system_configuration.idl',
-        '../dom/eme/media_key_system_media_capability.idl',
-        '../dom/eme/media_keys_requirement.idl',
-        '../dom/error_event_init.idl',
-        '../dom/event_init.idl',
-        '../dom/event_modifier_init.idl',
-        '../dom/focus_event_init.idl',
-        '../dom/input_event_init.idl',
-        '../dom/intersection_observer_entry_init.idl',
-        '../dom/intersection_observer_init.idl',
-        '../dom/keyboard_event_init.idl',
-        '../dom/lottie_frame_custom_event_detail.idl',
-        '../dom/media_source_end_of_stream_error.idl',
-        '../dom/media_source_ready_state.idl',
-        '../dom/mouse_event_init.idl',
-        '../dom/mutation_observer_init.idl',
-        '../dom/navigator_ua_brand_version.idl',
-        '../dom/performance_observer_callback_options.idl',
-        '../dom/performance_observer_init.idl',
-        '../dom/pointer_event_init.idl',
-        '../dom/source_buffer_append_mode.idl',
-        '../dom/track_default_type.idl',
-        '../dom/ua_data_values.idl',
-        '../dom/ua_low_entropy_json.idl',
-        '../dom/ui_event_init.idl',
-        '../dom/visibility_state.idl',
-        '../dom/wheel_event_init.idl',
-        '../encoding/text_decode_options.idl',
-        '../encoding/text_decoder_options.idl',
-        '../encoding/text_encoder_encode_into_result.idl',
-        '../h5vcc/h5vcc_crash_type.idl',
-        '../media_capture/blob_event_init.idl',
-        '../media_capture/media_device_kind.idl',
-        '../media_capture/media_recorder_options.idl',
-        '../media_capture/recording_state.idl',
-        '../media_session/media_image.idl',
-        '../media_session/media_metadata_init.idl',
-        '../media_session/media_position_state.idl',
-        '../media_session/media_session_action.idl',
-        '../media_session/media_session_action_details.idl',
-        '../media_session/media_session_playback_state.idl',
-        '../media_stream/media_stream_constraints.idl',
-        '../media_stream/media_track_settings.idl',
-        '../speech/speech_recognition_error_code.idl',
-        '../speech/speech_synthesis_error_code.idl',
-        '../subtlecrypto/aes_ctr_params.idl',
-        '../subtlecrypto/algorithm.idl',
-        '../subtlecrypto/import_key_algorithm_params.idl',
-        '../subtlecrypto/key_format.idl',
-        '../subtlecrypto/key_type.idl',
-        '../subtlecrypto/key_usage.idl',
-        '../web_animations/animation_fill_mode.idl',
-        '../web_animations/animation_playback_direction.idl',
-        '../websocket/close_event_init.idl',
-        '<@(cobalt_webapi_extension_generated_header_idl_files)',
-    ],
-
-    # Partial interfaces and the right-side of "implements". Also includes
-    # callback interfaces.
-    # Code will not get generated for these interfaces; they are used to add
-    # functionality to other interfaces.
-    'dependency_idl_files': [
-        '../cssom/link_style.idl',
-
-        '../dom/buffer_source.idl',
-        '../dom/captions/navigator_system_caption_settings.idl',
-        '../dom/document_cobalt.idl',
-        '../dom/document_cssom.idl',
-        '../dom/document_html5.idl',
-        '../dom/document_page_lifecycle.idl',
-        '../dom/document_page_visibility.idl',
-        '../dom/document_web_animations_api.idl',
-        '../dom/element_css_inline_style.idl',
-        '../dom/element_cssom_view.idl',
-        '../dom/element_dom_parsing_and_serialization.idl',
-        '../dom/element_pointer_events.idl',
-        '../dom/eme/html_media_element.idl',
-        '../dom/eme/navigator.idl',
-        '../dom/global_crypto.idl',
-        '../dom/global_event_handlers.idl',
-        '../dom/html_element_cssom_view.idl',
-        '../dom/mouse_event_cssom_view.idl',
-        '../dom/navigator_id.idl',
-        '../dom/navigator_language.idl',
-        '../dom/navigator_licenses.idl',
-        '../dom/navigator_online.idl',
-        '../dom/navigator_plugins.idl',
-        '../dom/navigator_storage_utils.idl',
-        '../dom/navigator_ua.idl',
-        '../dom/non_document_type_child_node.idl',
-        '../dom/non_element_parent_node.idl',
-        '../dom/parent_node.idl',
-        '../dom/performance_entry_list.idl',
-        '../dom/performance_high_resolution_time.idl',
-        '../dom/speech_synthesis_getter.idl',
-        '../dom/url_mse.idl',
-        '../dom/url_utils.idl',
-        '../dom/window_animation_timing.idl',
-        '../dom/window_cssom.idl',
-        '../dom/window_cssom_view.idl',
-        '../dom/window_event_handlers.idl',
-        '../dom/window_local_storage.idl',
-        '../dom/window_on_screen_keyboard.idl',
-        '../dom/window_performance.idl',
-        '../dom/window_session_storage.idl',
-        '../dom/window_timers.idl',
-        '../media_capture/navigator.idl',
-        '../media_session/navigator_media_session.idl',
-        '../worker/navigator.idl',
-    ],
-
-    'conditions': [
-      ['enable_debugger==1', {
-        'source_idl_files': [
-            '../debug/backend/css_agent.idl',
-            '../debug/backend/debug_backend.idl',
-            '../debug/console/debug_hub.idl',
-            '../debug/console/debugger_event_target.idl',
-        ],
-      }],
-    ],
-  },
-}
diff --git a/cobalt/browser/browser_module.cc b/cobalt/browser/browser_module.cc
index faf23cf..75e3351 100644
--- a/cobalt/browser/browser_module.cc
+++ b/cobalt/browser/browser_module.cc
@@ -38,7 +38,6 @@
 #include "cobalt/browser/on_screen_keyboard_starboard_bridge.h"
 #include "cobalt/browser/screen_shot_writer.h"
 #include "cobalt/browser/switches.h"
-#include "cobalt/browser/webapi_extension.h"
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/cssom/viewport_size.h"
 #include "cobalt/dom/csp_delegate_factory.h"
@@ -197,14 +196,6 @@
 
 #endif  // defined(ENABLE_DEBUGGER)
 
-#if SB_API_VERSION < 12
-scoped_refptr<script::Wrappable> CreateExtensionInterface(
-    const scoped_refptr<dom::Window>& window,
-    script::GlobalEnvironment* global_environment) {
-  return CreateWebAPIExtensionObject(window, global_environment);
-}
-#endif
-
 renderer::RendererModule::Options RendererModuleWithCameraOptions(
     renderer::RendererModule::Options options,
     scoped_refptr<input::Camera3D> camera_3d) {
@@ -249,15 +240,12 @@
       updater_module_(updater_module),
 #endif
       splash_screen_cache_(new SplashScreenCache()),
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
       on_screen_keyboard_bridge_(
           OnScreenKeyboardStarboardBridge::IsSupported() &&
                   options.enable_on_screen_keyboard
               ? new OnScreenKeyboardStarboardBridge(base::Bind(
                     &BrowserModule::GetSbWindow, base::Unretained(this)))
               : NULL),
-#endif  // SB_API_VERSION >= 12 ||
-      // SB_HAS(ON_SCREEN_KEYBOARD)
       web_module_loaded_(base::WaitableEvent::ResetPolicy::MANUAL,
                          base::WaitableEvent::InitialState::NOT_SIGNALED),
       web_module_created_callback_(options_.web_module_created_callback),
@@ -306,7 +294,8 @@
       main_web_module_generation_(0),
       next_timeline_id_(1),
       current_splash_screen_timeline_id_(-1),
-      current_main_web_module_timeline_id_(-1) {
+      current_main_web_module_timeline_id_(-1),
+      service_worker_registry_(network_module) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::BrowserModule()");
 
   // Apply platform memory setting adjustments and defaults.
@@ -360,9 +349,11 @@
   }
 
   // Setup our main web module to have the H5VCC API injected into it.
-  DCHECK(!ContainsKey(options_.web_module_options.injected_window_attributes,
-                      "h5vcc"));
-  options_.web_module_options.injected_window_attributes["h5vcc"] =
+  DCHECK(!ContainsKey(
+      options_.web_module_options.web_options.injected_global_object_attributes,
+      "h5vcc"));
+  options_.web_module_options.web_options
+      .injected_global_object_attributes["h5vcc"] =
       base::Bind(&BrowserModule::CreateH5vcc, base::Unretained(this));
 
   if (command_line->HasSwitch(switches::kDisableTimerResolutionLimit)) {
@@ -372,21 +363,6 @@
   options_.web_module_options.enable_inline_script_warnings =
       !command_line->HasSwitch(switches::kSilenceInlineScriptWarnings);
 
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-  options_.web_module_options.enable_partial_layout =
-      !command_line->HasSwitch(switches::kDisablePartialLayout);
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
-#if SB_API_VERSION < 12
-  base::Optional<std::string> extension_object_name =
-      GetWebAPIExtensionObjectPropertyName();
-  if (extension_object_name) {
-    options_.web_module_options
-        .injected_window_attributes[*extension_object_name] =
-        base::Bind(&CreateExtensionInterface);
-  }
-#endif
-
 #if defined(ENABLE_DEBUGGER) && defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
   if (command_line->HasSwitch(switches::kInputFuzzer)) {
     OnFuzzerToggle(std::string());
@@ -533,10 +509,8 @@
   pending_navigate_url_ = GURL::EmptyGURL();
 
 #if defined(ENABLE_DEBUGGER)
-  // Save the debugger state to be restored in the new WebModule.
-  std::unique_ptr<debug::backend::DebuggerState> debugger_state;
   if (web_module_) {
-    debugger_state = web_module_->FreezeDebugger();
+    web_module_->FreezeDebugger(&debugger_state_);
   }
 #endif  // defined(ENABLE_DEBUGGER)
 
@@ -612,10 +586,6 @@
     options.camera_3d = input_device_manager_->camera_3d();
   }
 
-  // Make sure that automem has been run before creating the WebModule, so that
-  // we use properly configured options for all parameters.
-  DCHECK(auto_mem_);
-
   options.provide_screenshot_function =
       base::Bind(&ScreenShotWriter::RequestScreenshotToMemoryUnencoded,
                  base::Unretained(screen_shot_writer_.get()));
@@ -632,13 +602,15 @@
         (wait_for_generation == main_web_module_generation_);
   }
 
-  options.debugger_state = debugger_state.get();
+  options.debugger_state = debugger_state_.get();
 #endif  // ENABLE_DEBUGGER
 
   // Pass down this callback from to Web module.
   options.maybe_freeze_callback =
       base::Bind(&BrowserModule::OnMaybeFreeze, base::Unretained(this));
 
+  options.web_options.network_module = network_module_;
+
   web_module_.reset(new WebModule(
       url, application_state_,
       base::Bind(&BrowserModule::QueueOnRenderTreeProduced,
@@ -646,13 +618,10 @@
       base::Bind(&BrowserModule::OnError, base::Unretained(this)),
       base::Bind(&BrowserModule::OnWindowClose, base::Unretained(this)),
       base::Bind(&BrowserModule::OnWindowMinimize, base::Unretained(this)),
-      can_play_type_handler_.get(), media_module_.get(), network_module_,
-      viewport_size, GetResourceProvider(), kLayoutMaxRefreshFrequencyInHz,
-      options));
+      can_play_type_handler_.get(), media_module_.get(), viewport_size,
+      GetResourceProvider(), kLayoutMaxRefreshFrequencyInHz,
+      service_worker_registry_.service_worker_jobs(), options));
   lifecycle_observers_.AddObserver(web_module_.get());
-  if (!web_module_created_callback_.is_null()) {
-    web_module_created_callback_.Run();
-  }
 
   if (system_window_) {
     web_module_->GetUiNavRoot()->SetContainerWindow(
@@ -666,8 +635,7 @@
   DCHECK(web_module_);
   web_module_->ExecuteJavascript(
       "location.reload();",
-      base::SourceLocation("[object BrowserModule]", 1, 1),
-      NULL /* output: succeeded */);
+      base::SourceLocation("[object BrowserModule]", 1, 1));
 }
 
 #if SB_HAS(CORE_DUMP_HANDLER_SUPPORT)
@@ -721,8 +689,8 @@
   TRACE_EVENT0("cobalt::browser", "BrowserModule::RequestScreenshotToFile()");
   DCHECK(screen_shot_writer_);
 
-  scoped_refptr<render_tree::Node> render_tree =
-      web_module_->DoSynchronousLayoutAndGetRenderTree();
+  scoped_refptr<render_tree::Node> render_tree;
+  web_module_->DoSynchronousLayoutAndGetRenderTree(&render_tree);
   if (!render_tree) {
     LOG(WARNING) << "Unable to get animated render tree";
     return;
@@ -739,8 +707,8 @@
   TRACE_EVENT0("cobalt::browser", "BrowserModule::RequestScreenshotToMemory()");
   DCHECK(screen_shot_writer_);
 
-  scoped_refptr<render_tree::Node> render_tree =
-      web_module_->DoSynchronousLayoutAndGetRenderTree();
+  scoped_refptr<render_tree::Node> render_tree;
+  web_module_->DoSynchronousLayoutAndGetRenderTree(&render_tree);
   if (!render_tree) {
     LOG(WARNING) << "Unable to get animated render tree";
     return;
@@ -946,7 +914,6 @@
   return;
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void BrowserModule::OnOnScreenKeyboardShown(
     const base::OnScreenKeyboardShownEvent* event) {
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
@@ -995,17 +962,13 @@
     web_module_->InjectOnScreenKeyboardSuggestionsUpdatedEvent(event->ticket());
   }
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 void BrowserModule::OnCaptionSettingsChanged(
     const base::AccessibilityCaptionSettingsChangedEvent* event) {
   if (web_module_) {
     web_module_->InjectCaptionSettingsChangedEvent();
   }
 }
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 
 #if SB_API_VERSION >= 13
 void BrowserModule::OnDateTimeConfigurationChanged(
@@ -1104,7 +1067,6 @@
 
 #endif  // defined(ENABLE_DEBUGGER)
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void BrowserModule::OnOnScreenKeyboardInputEventProduced(
     base::Token type, const dom::InputEventInit& event) {
   TRACE_EVENT0("cobalt::browser",
@@ -1125,8 +1087,6 @@
 
   InjectOnScreenKeyboardInputEventToMainWebModule(type, event);
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
 void BrowserModule::OnKeyEventProduced(base::Token type,
                                        const dom::KeyboardEventInit& event) {
@@ -1213,7 +1173,6 @@
   web_module_->InjectKeyboardEvent(type, event);
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void BrowserModule::InjectOnScreenKeyboardInputEventToMainWebModule(
     base::Token type, const dom::InputEventInit& event) {
   TRACE_EVENT0(
@@ -1231,8 +1190,6 @@
   DCHECK(web_module_);
   web_module_->InjectOnScreenKeyboardInputEvent(type, event);
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
 void BrowserModule::OnError(const GURL& url, const std::string& error) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::OnError()");
@@ -1434,7 +1391,7 @@
     std::unique_ptr<webdriver::WindowDriver>* out_window_driver) {
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
   DCHECK(web_module_);
-  *out_window_driver = web_module_->CreateWindowDriver(window_id);
+  web_module_->CreateWindowDriver(window_id, out_window_driver);
 }
 #endif  // defined(ENABLE_WEBDRIVER)
 
@@ -1442,7 +1399,7 @@
 std::unique_ptr<debug::DebugClient> BrowserModule::CreateDebugClient(
     debug::DebugClient::Delegate* delegate) {
   // Repost to our message loop to ensure synchronous access to |web_module_|.
-  debug::backend::DebugDispatcher* debug_dispatcher = NULL;
+  debug::backend::DebugDispatcher* debug_dispatcher = nullptr;
   self_message_loop_->task_runner()->PostBlockingTask(
       FROM_HERE,
       base::Bind(&BrowserModule::GetDebugDispatcherInternal,
@@ -1456,7 +1413,7 @@
     debug::backend::DebugDispatcher** out_debug_dispatcher) {
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
   DCHECK(web_module_);
-  *out_debug_dispatcher = web_module_->GetDebugDispatcher();
+  web_module_->GetDebugDispatcher(out_debug_dispatcher);
 }
 #endif  // ENABLE_DEBUGGER
 
@@ -1481,14 +1438,6 @@
   ConcealInternal(timestamp);
 }
 
-void BrowserModule::Focus(SbTimeMonotonic timestamp) {
-  TRACE_EVENT0("cobalt::browser", "BrowserModule::Focus()");
-  DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
-  DCHECK(application_state_ == base::kApplicationStateBlurred);
-  FOR_EACH_OBSERVER(LifecycleObserver, lifecycle_observers_, Focus(timestamp));
-  application_state_ = base::kApplicationStateStarted;
-}
-
 void BrowserModule::Freeze(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::Freeze()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
@@ -1497,6 +1446,15 @@
   FreezeInternal(timestamp);
 }
 
+void BrowserModule::Unfreeze(SbTimeMonotonic timestamp) {
+  TRACE_EVENT0("cobalt::browser", "BrowserModule::Unfreeze()");
+  DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
+  DCHECK(application_state_ == base::kApplicationStateFrozen);
+  application_state_ = base::kApplicationStateConcealed;
+  UnfreezeInternal(timestamp);
+  NavigatePendingURL();
+}
+
 void BrowserModule::Reveal(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::Reveal()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
@@ -1505,13 +1463,16 @@
   RevealInternal(timestamp);
 }
 
-void BrowserModule::Unfreeze(SbTimeMonotonic timestamp) {
-  TRACE_EVENT0("cobalt::browser", "BrowserModule::Unfreeze()");
+void BrowserModule::Focus(SbTimeMonotonic timestamp) {
+  TRACE_EVENT0("cobalt::browser", "BrowserModule::Focus()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
-  DCHECK(application_state_ == base::kApplicationStateFrozen);
-  application_state_ = base::kApplicationStateConcealed;
-  UnfreezeInternal(timestamp);
-  NavigatePendingURL();
+  DCHECK(application_state_ == base::kApplicationStateBlurred);
+  FOR_EACH_OBSERVER(LifecycleObserver, lifecycle_observers_, Focus(timestamp));
+  application_state_ = base::kApplicationStateStarted;
+}
+
+base::ApplicationState BrowserModule::GetApplicationState() {
+  return application_state_;
 }
 
 void BrowserModule::ReduceMemory() {
@@ -1535,11 +1496,7 @@
     const int64_t& used_cpu_memory,
     const base::Optional<int64_t>& used_gpu_memory) {
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
-  if (!auto_mem_) {
-    return;
-  }
-
-  memory_settings_checker_.RunChecks(*auto_mem_, used_cpu_memory,
+  memory_settings_checker_.RunChecks(auto_mem_, used_cpu_memory,
                                      used_gpu_memory);
 }
 
@@ -1670,17 +1627,15 @@
       base::Bind(&BrowserModule::OnPointerEventProduced,
                  base::Unretained(this)),
       base::Bind(&BrowserModule::OnWheelEventProduced, base::Unretained(this)),
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
       base::Bind(&BrowserModule::OnOnScreenKeyboardInputEventProduced,
                  base::Unretained(this)),
-#endif  // SB_API_VERSION >= 12 ||
-      // SB_HAS(ON_SCREEN_KEYBOARD)
       system_window_.get());
 
   InitializeComponents();
 }
 
 void BrowserModule::InstantiateRendererModule() {
+  TRACE_EVENT0("cobalt::browser", "BrowserModule::InstantiateRendererModule()");
   DCHECK_EQ(base::MessageLoop::current(), self_message_loop_);
   DCHECK(system_window_);
   DCHECK(!renderer_module_);
@@ -1830,7 +1785,7 @@
 // Set the Stub resource provider to media module and to web module
 // at Concealed state.
 #if SB_API_VERSION >= 13
-  media_module_->Resume(GetResourceProvider());
+  if (media_module_) media_module_->Resume(GetResourceProvider());
 #endif  // SB_API_VERSION >= 13
 
   FOR_EACH_OBSERVER(LifecycleObserver, lifecycle_observers_,
@@ -1942,7 +1897,7 @@
 
   // No window and no viewport size was requested, so we return a conservative
   // default.
-  math::Size default_size(1280, 720);
+  math::Size default_size(1920, 1080);
   default_size =
       math::RoundOut(viewport_transform.MapRect(math::RectF(default_size)))
           .size();
@@ -1952,35 +1907,33 @@
 
 void BrowserModule::ApplyAutoMemSettings() {
   TRACE_EVENT0("cobalt::browser", "BrowserModule::ApplyAutoMemSettings()");
-  auto_mem_.reset(new memory_settings::AutoMem(
-      GetViewportSize().width_height(), options_.command_line_auto_mem_settings,
-      options_.build_auto_mem_settings));
-
-  LOG(INFO) << auto_mem_->ToPrettyPrintString(SbLogIsTty());
+  auto_mem_.ConstructSettings(GetViewportSize().width_height(),
+                              options_.command_line_auto_mem_settings,
+                              options_.build_auto_mem_settings);
 
   // Web Module options.
   options_.web_module_options.encoded_image_cache_capacity =
-      static_cast<int>(auto_mem_->encoded_image_cache_size_in_bytes()->value());
+      static_cast<int>(auto_mem_.encoded_image_cache_size_in_bytes()->value());
   options_.web_module_options.image_cache_capacity =
-      static_cast<int>(auto_mem_->image_cache_size_in_bytes()->value());
+      static_cast<int>(auto_mem_.image_cache_size_in_bytes()->value());
   options_.web_module_options.remote_typeface_cache_capacity = static_cast<int>(
-      auto_mem_->remote_typeface_cache_size_in_bytes()->value());
+      auto_mem_.remote_typeface_cache_size_in_bytes()->value());
   if (web_module_) {
     web_module_->SetImageCacheCapacity(
-        auto_mem_->image_cache_size_in_bytes()->value());
+        auto_mem_.image_cache_size_in_bytes()->value());
     web_module_->SetRemoteTypefaceCacheCapacity(
-        auto_mem_->remote_typeface_cache_size_in_bytes()->value());
+        auto_mem_.remote_typeface_cache_size_in_bytes()->value());
   }
 
   // Renderer Module options.
   options_.renderer_module_options.skia_cache_size_in_bytes =
-      static_cast<int>(auto_mem_->skia_cache_size_in_bytes()->value());
+      static_cast<int>(auto_mem_.skia_cache_size_in_bytes()->value());
   options_.renderer_module_options.offscreen_target_cache_size_in_bytes =
       static_cast<int>(
-          auto_mem_->offscreen_target_cache_size_in_bytes()->value());
+          auto_mem_.offscreen_target_cache_size_in_bytes()->value());
 
   const memory_settings::TextureDimensions skia_glyph_atlas_texture_dimensions =
-      auto_mem_->skia_atlas_texture_dimensions()->value();
+      auto_mem_.skia_atlas_texture_dimensions()->value();
   if (skia_glyph_atlas_texture_dimensions.bytes_per_pixel() > 0) {
     // Right now the bytes_per_pixel is assumed in the engine. Any other value
     // is currently forbidden.
@@ -2090,8 +2043,7 @@
 }
 
 scoped_refptr<script::Wrappable> BrowserModule::CreateH5vcc(
-    const scoped_refptr<dom::Window>& window,
-    script::GlobalEnvironment* global_environment) {
+    script::EnvironmentSettings* settings) {
   h5vcc::H5vcc::Settings h5vcc_settings;
   h5vcc_settings.media_module = media_module_.get();
   h5vcc_settings.network_module = network_module_;
@@ -2100,16 +2052,19 @@
 #endif
   h5vcc_settings.account_manager = account_manager_;
   h5vcc_settings.event_dispatcher = event_dispatcher_;
-  h5vcc_settings.user_agent_data = window->navigator()->user_agent_data();
-  h5vcc_settings.global_environment = global_environment;
 
-  return scoped_refptr<script::Wrappable>(new h5vcc::H5vcc(h5vcc_settings));
-}
+  auto* dom_settings = base::polymorphic_downcast<dom::DOMSettings*>(settings);
 
-void BrowserModule::SetApplicationStartOrPreloadTimestamp(
-    bool is_preload, SbTimeMonotonic timestamp) {
-  DCHECK(web_module_);
-  web_module_->SetApplicationStartOrPreloadTimestamp(is_preload, timestamp);
+  h5vcc_settings.user_agent_data =
+      dom_settings->window()->navigator()->user_agent_data();
+  h5vcc_settings.global_environment =
+      dom_settings->context()->global_environment();
+
+  auto* h5vcc_object = new h5vcc::H5vcc(h5vcc_settings);
+  if (!web_module_created_callback_.is_null()) {
+    web_module_created_callback_.Run(web_module_.get());
+  }
+  return scoped_refptr<script::Wrappable>(h5vcc_object);
 }
 
 void BrowserModule::SetDeepLinkTimestamp(SbTimeMonotonic timestamp) {
diff --git a/cobalt/browser/browser_module.h b/cobalt/browser/browser_module.h
index dc79f84..10d69c5 100644
--- a/cobalt/browser/browser_module.h
+++ b/cobalt/browser/browser_module.h
@@ -21,6 +21,7 @@
 #include <vector>
 
 #include "base/observer_list.h"
+#include "base/optional.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread.h"
@@ -40,6 +41,7 @@
 #include "cobalt/browser/memory_settings/checker.h"
 #include "cobalt/browser/render_tree_combiner.h"
 #include "cobalt/browser/screen_shot_writer.h"
+#include "cobalt/browser/service_worker_registry.h"
 #include "cobalt/browser/splash_screen.h"
 #include "cobalt/browser/suspend_fuzzer.h"
 #include "cobalt/browser/system_platform_error_handler.h"
@@ -91,6 +93,7 @@
 // different subsystems together.
 class BrowserModule {
  public:
+  typedef base::Callback<void(WebModule*)> WebModuleCreatedCallback;
   // All browser subcomponent options should have default constructors that
   // setup reasonable default options.
   struct Options {
@@ -103,7 +106,7 @@
     renderer::RendererModule::Options renderer_module_options;
     WebModule::Options web_module_options;
     media::MediaModule::Options media_module_options;
-    base::Closure web_module_created_callback;
+    WebModuleCreatedCallback web_module_created_callback;
     memory_settings::AutoMemSettings command_line_auto_mem_settings;
     memory_settings::AutoMemSettings build_auto_mem_settings;
     base::Optional<GURL> fallback_splash_screen_url;
@@ -183,6 +186,9 @@
   void Reveal(SbTimeMonotonic timestamp);
   void Focus(SbTimeMonotonic timestamp);
 
+  // Gets current application state.
+  base::ApplicationState GetApplicationState();
+
   // Attempt to reduce overall memory consumption. Called in response to a
   // system indication that memory usage is nearing a critical level.
   void ReduceMemory();
@@ -197,7 +203,6 @@
   // Called when a kSbEventTypeWindowSizeChange event is fired.
   void OnWindowSizeChanged(const cssom::ViewportSize& viewport_size);
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   void OnOnScreenKeyboardShown(const base::OnScreenKeyboardShownEvent* event);
   void OnOnScreenKeyboardHidden(const base::OnScreenKeyboardHiddenEvent* event);
   void OnOnScreenKeyboardFocused(
@@ -206,13 +211,8 @@
       const base::OnScreenKeyboardBlurredEvent* event);
   void OnOnScreenKeyboardSuggestionsUpdated(
       const base::OnScreenKeyboardSuggestionsUpdatedEvent* event);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   void OnCaptionSettingsChanged(
       const base::AccessibilityCaptionSettingsChangedEvent* event);
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 
   void OnWindowOnOnlineEvent(const base::Event* event);
   void OnWindowOnOfflineEvent(const base::Event* event);
@@ -229,9 +229,6 @@
   static void GetParamMap(const std::string& url,
                           std::map<std::string, std::string>& map);
 
-  // Pass the application preload or start timestamps from Starboard.
-  void SetApplicationStartOrPreloadTimestamp(bool is_preload,
-                                             SbTimeMonotonic timestamp);
   // Pass the deeplink timestamp from Starboard.
   void SetDeepLinkTimestamp(SbTimeMonotonic timestamp);
 
@@ -280,14 +277,11 @@
   // persist the user's preference.
   void SaveDebugConsoleMode();
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   // Glue function to deal with the production of an input event from an on
   // screen keyboard input device, and manage handing it off to the web module
   // for interpretation.
   void OnOnScreenKeyboardInputEventProduced(base::Token type,
                                             const dom::InputEventInit& event);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
   // Glue function to deal with the production of a keyboard input event from a
   // keyboard input device, and manage handing it off to the web module for
@@ -306,13 +300,10 @@
   // interpretation.
   void OnWheelEventProduced(base::Token type, const dom::WheelEventInit& event);
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   // Injects an on screen keyboard input event directly into the main web
   // module.
   void InjectOnScreenKeyboardInputEventToMainWebModule(
       base::Token type, const dom::InputEventInit& event);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
   // Injects a key event directly into the main web module, useful for setting
   // up an input fuzzer whose input should be sent directly to the main
@@ -452,8 +443,8 @@
   // Gets a viewport size to use for now. This may change depending on the
   // current application state. While concealed, this returns the requested
   // viewport size. If there was no requested viewport size, it returns a
-  // default viewport size of 1280x720 (720p). Once a system window is created,
-  // it returns the confirmed size of the window.
+  // default viewport size of 1920x1080 (1080p). Once a system window is
+  // created, it returns the confirmed size of the window.
   cssom::ViewportSize GetViewportSize();
 
   // Applies the current AutoMem settings to all applicable submodules.
@@ -477,8 +468,7 @@
 
   // Function that creates the H5vcc object that will be injected into WebModule
   scoped_refptr<script::Wrappable> CreateH5vcc(
-      const scoped_refptr<dom::Window>& window,
-      script::GlobalEnvironment* global_environment);
+      script::EnvironmentSettings* settings);
 
   // TODO:
   //     WeakPtr usage here can be avoided if BrowserModule has a thread to
@@ -499,7 +489,7 @@
   base::WeakPtr<BrowserModule> weak_this_;
 
   // Memory configuration tool.
-  std::unique_ptr<memory_settings::AutoMem> auto_mem_;
+  memory_settings::AutoMem auto_mem_;
 
   // A copy of the BrowserModule Options passed into the constructor.
   Options options_;
@@ -544,7 +534,7 @@
   // Allows checking if particular media type can be played.
   std::unique_ptr<media::CanPlayTypeHandler> can_play_type_handler_;
 
-  // Sets up the network component for requesting internet resources.
+  // Manages the network component for requesting internet resources.
   network::NetworkModule* network_module_;
 
 #if SB_IS(EVERGREEN)
@@ -588,7 +578,7 @@
 
   // This will be called after a WebModule has been recreated, which could occur
   // on navigation.
-  base::Closure web_module_created_callback_;
+  WebModuleCreatedCallback web_module_created_callback_;
 
   // The time when a URL navigation starts. This is recorded after the previous
   // WebModule is destroyed.
@@ -637,6 +627,9 @@
   // An object that registers and owns console commands for controlling
   // Cobalt's lifecycle.
   LifecycleConsoleCommands lifecycle_console_commands_;
+
+  // Saves the previous debugger state to be restored in the new WebModule.
+  std::unique_ptr<debug::backend::DebuggerState> debugger_state_;
 #endif  // defined(ENABLE_DEBUGGER)
 
   // The splash screen. The pointer wrapped here should be non-NULL iff
@@ -722,6 +715,9 @@
   // Save the current window size before transitioning to Concealed state,
   // and reuse this value to recreate the window.
   math::Size window_size_;
+
+  // Manages the Service Workers.
+  ServiceWorkerRegistry service_worker_registry_;
 };
 
 }  // namespace browser
diff --git a/cobalt/browser/cobalt.gyp b/cobalt/browser/cobalt.gyp
deleted file mode 100644
index 5a9c801..0000000
--- a/cobalt/browser/cobalt.gyp
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'cobalt',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'main.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-        '<(DEPTH)/net/net.gyp:net',
-      ],
-      'conditions': [
-        ['cobalt_splash_screen_file != ""', {
-          'dependencies': [
-            '<(DEPTH)/cobalt/browser/splash_screen/splash_screen.gyp:copy_splash_screen',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'cobalt_deploy',
-      'type': 'none',
-      'dependencies': [
-        'cobalt',
-      ],
-      'variables': {
-        'executable_name': 'cobalt',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      # Convenience target to build cobalt and copy the demos into
-      # content/data/test/cobalt/demos
-      'target_name': 'cobalt_with_demos',
-      'type': 'none',
-      'dependencies': [
-        'cobalt',
-        '<(DEPTH)/cobalt/demos/demos.gyp:copy_demos',
-      ],
-    },
-    {
-      'target_name': 'snapshot_app_stats',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'snapshot_app_stats.cc',
-      ],
-      'dependencies': [
-        'cobalt',
-        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-        '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-      ],
-    },
-    {
-      'target_name': 'snapshot_app_stats_deploy',
-      'type': 'none',
-      'dependencies': [
-        'snapshot_app_stats',
-      ],
-      'variables': {
-        'executable_name': 'snapshot_app_stats',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-  'conditions': [
-    ['final_executable_type == "shared_library" and sb_evergreen != 1', {
-      'targets': [
-        {
-          'target_name': 'cobalt_bin',
-          'type': 'executable',
-          'dependencies': [
-            'cobalt',
-          ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/cobalt/browser/debug_console.cc b/cobalt/browser/debug_console.cc
index 74264c7..2414afb 100644
--- a/cobalt/browser/debug_console.cc
+++ b/cobalt/browser/debug_console.cc
@@ -24,6 +24,7 @@
 #include "cobalt/dom/csp_delegate_factory.h"
 #include "cobalt/dom/mutation_observer_task_manager.h"
 #include "cobalt/dom/window.h"
+#include "cobalt/web/context.h"
 
 namespace cobalt {
 namespace browser {
@@ -95,8 +96,7 @@
 scoped_refptr<script::Wrappable> CreateDebugHub(
     const debug::console::DebugHub::GetHudModeCallback& get_hud_mode_function,
     const debug::CreateDebugClientCallback& create_debug_client_callback,
-    const scoped_refptr<dom::Window>& window,
-    script::GlobalEnvironment* global_environment) {
+    script::EnvironmentSettings* settings) {
   return new debug::console::DebugHub(get_hud_mode_function,
                                       create_debug_client_callback);
 }
@@ -114,8 +114,7 @@
     const base::Closure& maybe_freeze_callback) {
   mode_ = GetInitialMode();
 
-  WebModule::Options web_module_options;
-  web_module_options.name = "DebugConsoleWebModule";
+  WebModule::Options web_module_options("DebugConsoleWebModule");
   // The debug console does not load any image assets.
   web_module_options.image_cache_capacity = 0;
   // Disable CSP for the Debugger's WebModule. This will also allow eval() in
@@ -131,7 +130,7 @@
   // Attach a DebugHub object to the "debugHub" Window attribute for this
   // web module so that JavaScript within this WebModule has access to DebugHub
   // functionality.
-  web_module_options.injected_window_attributes["debugHub"] =
+  web_module_options.web_options.injected_global_object_attributes["debugHub"] =
       base::Bind(&CreateDebugHub,
                  base::Bind(&DebugConsole::GetMode, base::Unretained(this)),
                  create_debug_client_callback);
@@ -139,15 +138,17 @@
   // Pass down this callback from Browser module to Web module eventually.
   web_module_options.maybe_freeze_callback = maybe_freeze_callback;
 
-  web_module_.reset(new WebModule(
-      GURL(kInitialDebugConsoleUrl), initial_application_state,
-      render_tree_produced_callback,
-      base::Bind(&DebugConsole::OnError, base::Unretained(this)),
-      WebModule::CloseCallback(), /* window_close_callback */
-      base::Closure(),            /* window_minimize_callback */
-      NULL /* can_play_type_handler */, NULL /* media_module */,
-      network_module, window_dimensions, resource_provider, layout_refresh_rate,
-      web_module_options));
+  web_module_options.web_options.network_module = network_module;
+
+  web_module_.reset(
+      new WebModule(GURL(kInitialDebugConsoleUrl), initial_application_state,
+                    render_tree_produced_callback,
+                    base::Bind(&DebugConsole::OnError, base::Unretained(this)),
+                    WebModule::CloseCallback(), /* window_close_callback */
+                    base::Closure(),            /* window_minimize_callback */
+                    NULL /* can_play_type_handler */, NULL /* media_module */,
+                    window_dimensions, resource_provider, layout_refresh_rate,
+                    NULL /* service_worker_jobs */, web_module_options));
 }
 
 DebugConsole::~DebugConsole() {}
@@ -189,7 +190,6 @@
   return false;
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 bool DebugConsole::FilterOnScreenKeyboardInputEvent(
     base::Token type, const dom::InputEventInit& event) {
   // Return true to indicate the event should still be handled.
@@ -198,8 +198,6 @@
   web_module_->InjectOnScreenKeyboardInputEvent(type, event);
   return false;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
 void DebugConsole::CycleMode() {
   base::AutoLock lock(mode_mutex_);
diff --git a/cobalt/browser/debug_console.h b/cobalt/browser/debug_console.h
index ebb8d03..aacd33b 100644
--- a/cobalt/browser/debug_console.h
+++ b/cobalt/browser/debug_console.h
@@ -70,14 +70,11 @@
   // false if it was consumed within this function.
   bool FilterWheelEvent(base::Token type, const dom::WheelEventInit& event);
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   // Filters an on screen keyboard input event.
   // Returns true if the event should be passed on to other handlers,
   // false if it was consumed within this function.
   bool FilterOnScreenKeyboardInputEvent(base::Token type,
                                         const dom::InputEventInit& event);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
   const WebModule& web_module() const { return *web_module_; }
   WebModule& web_module() { return *web_module_; }
@@ -95,16 +92,12 @@
   }
 
   // LifecycleObserver implementation.
-  void Blur(SbTimeMonotonic timestamp) override {
-    web_module_->Blur(0);
-  }
+  void Blur(SbTimeMonotonic timestamp) override { web_module_->Blur(0); }
   void Conceal(render_tree::ResourceProvider* resource_provider,
                SbTimeMonotonic timestamp) override {
     web_module_->Conceal(resource_provider, 0);
   }
-  void Freeze(SbTimeMonotonic timestamp) override {
-    web_module_->Freeze(0);
-  }
+  void Freeze(SbTimeMonotonic timestamp) override { web_module_->Freeze(0); }
   void Unfreeze(render_tree::ResourceProvider* resource_provider,
                 SbTimeMonotonic timestamp) override {
     web_module_->Unfreeze(resource_provider, 0);
@@ -113,15 +106,11 @@
               SbTimeMonotonic timestamp) override {
     web_module_->Reveal(resource_provider, 0);
   }
-  void Focus(SbTimeMonotonic timestamp) override {
-     web_module_->Focus(0);
-  }
+  void Focus(SbTimeMonotonic timestamp) override { web_module_->Focus(0); }
 
   void ReduceMemory() { web_module_->ReduceMemory(); }
 
-  bool IsReadyToFreeze() {
-    return web_module_->IsReadyToFreeze();
-  }
+  bool IsReadyToFreeze() { return web_module_->IsReadyToFreeze(); }
 
  private:
   void OnError(const GURL& url, const std::string& error) {
diff --git a/cobalt/browser/idl_files.gni b/cobalt/browser/idl_files.gni
index d86cff1..9f9b2aa 100644
--- a/cobalt/browser/idl_files.gni
+++ b/cobalt/browser/idl_files.gni
@@ -128,6 +128,7 @@
   "//cobalt/dom/performance_lifecycle_timing.idl",
   "//cobalt/dom/performance_mark.idl",
   "//cobalt/dom/performance_measure.idl",
+  "//cobalt/dom/performance_navigation_timing.idl",
   "//cobalt/dom/performance_observer.idl",
   "//cobalt/dom/performance_observer_entry_list.idl",
   "//cobalt/dom/performance_resource_timing.idl",
@@ -228,7 +229,14 @@
   "//cobalt/websocket/close_event.idl",
   "//cobalt/websocket/web_socket.idl",
 
+  "//cobalt/worker/dedicated_worker_global_scope.idl",
+  "//cobalt/worker/message_port.idl",
+  "//cobalt/worker/navigation_preload_manager.idl",
+  "//cobalt/worker/service_worker.idl",
   "//cobalt/worker/service_worker_container.idl",
+  "//cobalt/worker/service_worker_registration.idl",
+  "//cobalt/worker/worker.idl",
+  "//cobalt/worker/worker_global_scope.idl",
 
   "//cobalt/xhr/xml_http_request.idl",
   "//cobalt/xhr/xml_http_request_event_target.idl",
@@ -284,6 +292,7 @@
   "//cobalt/dom/media_source_ready_state.idl",
   "//cobalt/dom/mouse_event_init.idl",
   "//cobalt/dom/mutation_observer_init.idl",
+  "//cobalt/dom/navigation_type.idl",
   "//cobalt/dom/navigator_ua_brand_version.idl",
   "//cobalt/dom/performance_observer_callback_options.idl",
   "//cobalt/dom/performance_observer_init.idl",
@@ -299,6 +308,8 @@
   "//cobalt/encoding/text_decoder_options.idl",
   "//cobalt/encoding/text_encoder_encode_into_result.idl",
   "//cobalt/h5vcc/h5vcc_crash_type.idl",
+  "//cobalt/h5vcc/watchdog_state.idl",
+  "//cobalt/h5vcc/watchdog_replace.idl",
   "//cobalt/media_capture/blob_event_init.idl",
   "//cobalt/media_capture/media_device_kind.idl",
   "//cobalt/media_capture/media_recorder_options.idl",
@@ -322,6 +333,13 @@
   "//cobalt/web_animations/animation_fill_mode.idl",
   "//cobalt/web_animations/animation_playback_direction.idl",
   "//cobalt/websocket/close_event_init.idl",
+  "//cobalt/worker/navigation_preload_state.idl",
+  "//cobalt/worker/registration_options.idl",
+  "//cobalt/worker/service_worker_state.idl",
+  "//cobalt/worker/service_worker_update_via_cache.idl",
+  "//cobalt/worker/structured_serialize_options.idl",
+  "//cobalt/worker/worker_options.idl",
+  "//cobalt/worker/worker_type.idl",
 ]
 
 # Partial interfaces and the right-side of "implements". Also includes
@@ -375,5 +393,6 @@
   "//cobalt/dom/window_timers.idl",
   "//cobalt/media_capture/navigator.idl",
   "//cobalt/media_session/navigator_media_session.idl",
+  "//cobalt/worker/abstract_worker.idl",
   "//cobalt/worker/navigator.idl",
 ]
diff --git a/cobalt/browser/memory_settings/auto_mem.cc b/cobalt/browser/memory_settings/auto_mem.cc
index 18d47b8..aac335d 100644
--- a/cobalt/browser/memory_settings/auto_mem.cc
+++ b/cobalt/browser/memory_settings/auto_mem.cc
@@ -232,17 +232,6 @@
 
 }  // namespace
 
-AutoMem::AutoMem(const math::Size& ui_resolution,
-                 const AutoMemSettings& command_line_settings,
-                 const AutoMemSettings& build_settings) {
-  TRACE_EVENT0("cobalt::browser", "AutoMem::AutoMem()");
-  ConstructSettings(ui_resolution, command_line_settings, build_settings);
-
-  std::vector<MemorySetting*> memory_settings = AllMemorySettingsMutable();
-}
-
-AutoMem::~AutoMem() {}
-
 const IntSetting* AutoMem::remote_typeface_cache_size_in_bytes() const {
   return remote_typeface_cache_size_in_bytes_.get();
 }
@@ -286,7 +275,7 @@
 }
 
 // Make sure that this is the same as AllMemorySettings().
-std::vector<MemorySetting*> AutoMem::AllMemorySettingsMutable() {
+std::vector<MemorySetting*> AutoMem::AllMemorySettingsMutable() const {
   std::vector<MemorySetting*> all_settings;
   // Keep these in alphabetical order.
   all_settings.push_back(encoded_image_cache_size_in_bytes_.get());
@@ -298,10 +287,12 @@
   return all_settings;
 }
 
-std::string AutoMem::ToPrettyPrintString(bool use_color_ascii) const {
+void AutoMem::LogToPrettyPrintString(const math::Size& ui_resolution,
+                                     bool use_color_ascii) {
+#if !defined(COBALT_BUILD_TYPE_GOLD)
   std::stringstream ss;
 
-  ss << "AutoMem:\n";
+  ss << "AutoMem (resolution: " << ui_resolution << "):\n";
   std::vector<const MemorySetting*> all_settings = AllMemorySettings();
   ss << GeneratePrettyPrintTable(use_color_ascii, all_settings);
 
@@ -344,8 +335,12 @@
     ss << MakeBorder(ss_error.str(), '*');
   }
 
-  std::string output_str = ss.str();
-  return output_str;
+  std::string output_str(ss.str());
+  if (output_str != previous_log_) {
+    LOG(INFO) << output_str;
+    previous_log_.swap(output_str);
+  }
+#endif
 }
 
 int64_t AutoMem::SumAllMemoryOfType(
@@ -356,6 +351,7 @@
 void AutoMem::ConstructSettings(const math::Size& ui_resolution,
                                 const AutoMemSettings& command_line_settings,
                                 const AutoMemSettings& build_settings) {
+  TRACE_EVENT0("cobalt::browser", "AutoMem::ConstructSettings()");
   max_cpu_bytes_ = CreateCpuSetting(command_line_settings, build_settings);
   max_gpu_bytes_ = CreateGpuSetting(command_line_settings, build_settings);
 
@@ -441,6 +437,8 @@
   for (size_t i = 0; i < all_memory_settings.size(); ++i) {
     CheckConstrainingValues(*all_memory_settings[i]);
   }
+
+  LogToPrettyPrintString(ui_resolution, SbLogIsTty());
 }
 
 }  // namespace memory_settings
diff --git a/cobalt/browser/memory_settings/auto_mem.h b/cobalt/browser/memory_settings/auto_mem.h
index e9dfb87..8014e14 100644
--- a/cobalt/browser/memory_settings/auto_mem.h
+++ b/cobalt/browser/memory_settings/auto_mem.h
@@ -37,10 +37,12 @@
 // calculated.
 class AutoMem {
  public:
-  explicit AutoMem(const math::Size& ui_resolution,
-                   const AutoMemSettings& command_line_settings,
-                   const AutoMemSettings& build_settings);
-  ~AutoMem();
+  AutoMem() {}
+  ~AutoMem() {}
+
+  void ConstructSettings(const math::Size& ui_resolution,
+                         const AutoMemSettings& command_line_settings,
+                         const AutoMemSettings& build_settings);
 
   const IntSetting* encoded_image_cache_size_in_bytes() const;
   const IntSetting* image_cache_size_in_bytes() const;
@@ -57,23 +59,19 @@
   const IntSetting* max_cpu_bytes() const;
   const IntSetting* max_gpu_bytes() const;
 
-  // Generates a string table of the memory settings and available memory for
-  // cpu and gpu. This is used during startup to display memory configuration
-  // information.
-  std::string ToPrettyPrintString(bool use_color_ascii) const;
-
   // Reports the total memory that all settings that match memory_type
   // consume.
   int64_t SumAllMemoryOfType(MemorySetting::MemoryType memory_type) const;
 
  private:
-  void ConstructSettings(const math::Size& ui_resolution,
-                         const AutoMemSettings& command_line_settings,
-                         const AutoMemSettings& build_settings);
+  // Logs a table of the memory settings and available memory for cpu and gpu.
+  // This is used during startup to display memory configuration information.
+  void LogToPrettyPrintString(const math::Size& ui_resolution,
+                              bool use_color_ascii);
 
   // AllMemorySettings - does not include cpu & gpu max memory.
   std::vector<const MemorySetting*> AllMemorySettings() const;
-  std::vector<MemorySetting*> AllMemorySettingsMutable();
+  std::vector<MemorySetting*> AllMemorySettingsMutable() const;
 
   // All of the following are included in AllMemorySettings().
   std::unique_ptr<IntSetting> encoded_image_cache_size_in_bytes_;
@@ -88,7 +86,10 @@
   std::unique_ptr<IntSetting> max_cpu_bytes_;
   std::unique_ptr<IntSetting> max_gpu_bytes_;
 
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+  std::string previous_log_;
   std::vector<std::string> error_msgs_;
+#endif
 
   FRIEND_TEST(AutoMem, AllMemorySettingsAreOrderedByName);
   FRIEND_TEST(AutoMem, ConstrainedCPUEnvironment);
diff --git a/cobalt/browser/memory_settings/auto_mem_settings.cc b/cobalt/browser/memory_settings/auto_mem_settings.cc
index 21f87b9..7267f3e 100644
--- a/cobalt/browser/memory_settings/auto_mem_settings.cc
+++ b/cobalt/browser/memory_settings/auto_mem_settings.cc
@@ -213,18 +213,6 @@
   settings.offscreen_target_cache_size_in_bytes =
       MakeValidIfGreaterThanOrEqualToZero(
           config->CobaltOffscreenTargetCacheSizeInBytes());
-
-#if SB_API_VERSION < 12
-#if defined(COBALT_MAX_CPU_USAGE_IN_BYTES)
-  settings.max_cpu_in_bytes =
-      MakeValidIfGreaterThanOrEqualToZero(COBALT_MAX_CPU_USAGE_IN_BYTES);
-#endif  // defined(COBALT_MAX_CPU_USAGE_IN_BYTES)
-#if defined(COBALT_MAX_GPU_USAGE_IN_BYTES)
-  settings.max_gpu_in_bytes =
-      MakeValidIfGreaterThanOrEqualToZero(COBALT_MAX_GPU_USAGE_IN_BYTES);
-#endif  // defined(COBALT_MAX_GPU_USAGE_IN_BYTES)
-#endif  // SB_API_VERSION < 12
-
   settings.reduce_gpu_memory_by =
       MakeValidIfGreaterThanOrEqualToZero(config->CobaltReduceGpuMemoryBy());
 
diff --git a/cobalt/browser/memory_settings/auto_mem_test.cc b/cobalt/browser/memory_settings/auto_mem_test.cc
index c49fef7..df9ac1f 100644
--- a/cobalt/browser/memory_settings/auto_mem_test.cc
+++ b/cobalt/browser/memory_settings/auto_mem_test.cc
@@ -63,7 +63,9 @@
   for (int i = 0; i <= 1; ++i) {
     AutoMemSettings build_settings = GetDefaultBuildSettings();
 
-    AutoMem auto_mem(kResolution1080p, command_line_settings, build_settings);
+    AutoMem auto_mem;
+    auto_mem.ConstructSettings(kResolution1080p, command_line_settings,
+                               build_settings);
 
     EXPECT_MEMORY_SETTING(auto_mem.image_cache_size_in_bytes(),
                           MemorySetting::kCmdLine, MemorySetting::kGPU, 1234);
@@ -92,7 +94,9 @@
   AutoMemSettings build_settings(AutoMemSettings::kTypeBuild);
   build_settings.cobalt_image_cache_size_in_bytes = 1234;
 
-  AutoMem auto_mem(kResolution1080p, command_line_settings, build_settings);
+  AutoMem auto_mem;
+  auto_mem.ConstructSettings(kResolution1080p, command_line_settings,
+                             build_settings);
 
   EXPECT_MEMORY_SETTING(
       auto_mem.image_cache_size_in_bytes(), MemorySetting::kAutoSet,
@@ -111,9 +115,12 @@
   build_settings_with_default.skia_texture_atlas_dimensions =
       TextureDimensions(1234, 5678, 2);
 
-  AutoMem auto_mem(kResolution1080p, EmptyCommandLine(), build_settings);
-  AutoMem auto_mem_with_default(kResolution1080p, EmptyCommandLine(),
-                                build_settings_with_default);
+  AutoMem auto_mem;
+  auto_mem.ConstructSettings(kResolution1080p, EmptyCommandLine(),
+                             build_settings);
+  AutoMem auto_mem_with_default;
+  auto_mem_with_default.ConstructSettings(kResolution1080p, EmptyCommandLine(),
+                                          build_settings_with_default);
 
   // Expect that when the skia_atlas_texture_dimensions is specified in the
   // build settings that it will bind to the auto-set value (computed from
@@ -136,9 +143,12 @@
   AutoMemSettings build_settings_with_default(AutoMemSettings::kTypeBuild);
   build_settings_with_default.skia_cache_size_in_bytes = 1234;
 
-  AutoMem auto_mem(kResolution1080p, EmptyCommandLine(), build_settings);
-  AutoMem auto_mem_with_skia_cache(kResolution1080p, EmptyCommandLine(),
-                                   build_settings_with_default);
+  AutoMem auto_mem;
+  auto_mem.ConstructSettings(kResolution1080p, EmptyCommandLine(),
+                             build_settings);
+  AutoMem auto_mem_with_skia_cache;
+  auto_mem_with_skia_cache.ConstructSettings(
+      kResolution1080p, EmptyCommandLine(), build_settings_with_default);
 
   EXPECT_MEMORY_SETTING(auto_mem.skia_cache_size_in_bytes(),
                         MemorySetting::kAutoSet, MemorySetting::kGPU,
@@ -152,7 +162,9 @@
 TEST(AutoMem, AllMemorySettingsAreOrderedByName) {
   AutoMemSettings build_settings(AutoMemSettings::kTypeBuild);
 
-  AutoMem auto_mem(kResolution1080p, EmptyCommandLine(), build_settings);
+  AutoMem auto_mem;
+  auto_mem.ConstructSettings(kResolution1080p, EmptyCommandLine(),
+                             build_settings);
 
   std::vector<const MemorySetting*> settings = auto_mem.AllMemorySettings();
 
@@ -167,7 +179,9 @@
   AutoMemSettings command_line_settings(AutoMemSettings::kTypeCommandLine);
   AutoMemSettings build_settings(AutoMemSettings::kTypeBuild);
 
-  AutoMem auto_mem(kResolution1080p, command_line_settings, build_settings);
+  AutoMem auto_mem;
+  auto_mem.ConstructSettings(kResolution1080p, command_line_settings,
+                             build_settings);
 
   EXPECT_EQ(SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats),
             auto_mem.max_gpu_bytes()->valid());
diff --git a/cobalt/browser/null_webapi_extension.cc b/cobalt/browser/null_webapi_extension.cc
deleted file mode 100644
index fb81ef8..0000000
--- a/cobalt/browser/null_webapi_extension.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/browser/webapi_extension.h"
-
-#include "base/compiler_specific.h"
-#include "cobalt/script/global_environment.h"
-
-#if SB_API_VERSION < 12
-
-namespace cobalt {
-namespace browser {
-
-base::Optional<std::string> GetWebAPIExtensionObjectPropertyName() {
-  return base::nullopt;
-}
-
-scoped_refptr<script::Wrappable> CreateWebAPIExtensionObject(
-    const scoped_refptr<dom::Window>& window,
-    script::GlobalEnvironment* global_environment) {
-
-  // We should never get called if GetWindowExtensionObjectName() above returns
-  // base::nullopt.
-  NOTREACHED();
-
-  return scoped_refptr<script::Wrappable>();
-}
-
-}  // namespace browser
-}  // namespace cobalt
-
-#endif  // SB_API_VERSION < 12
diff --git a/cobalt/browser/null_webapi_extension.gyp b/cobalt/browser/null_webapi_extension.gyp
deleted file mode 100644
index 5081a68..0000000
--- a/cobalt/browser/null_webapi_extension.gyp
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'targets': [
-    {
-      'target_name': 'null_webapi_extension',
-      'type': 'static_library',
-      'sources': [
-        'null_webapi_extension.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/script/script.gyp:script',
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/browser/on_screen_keyboard_starboard_bridge.cc b/cobalt/browser/on_screen_keyboard_starboard_bridge.cc
index 1ef37b2..39b998c 100644
--- a/cobalt/browser/on_screen_keyboard_starboard_bridge.cc
+++ b/cobalt/browser/on_screen_keyboard_starboard_bridge.cc
@@ -14,21 +14,18 @@
 
 #include "cobalt/browser/on_screen_keyboard_starboard_bridge.h"
 
+#include <memory>
+
 #include "base/bind.h"
 #include "base/callback.h"
 
 #include "starboard/event.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 namespace cobalt {
 namespace browser {
 // static
 bool OnScreenKeyboardStarboardBridge::IsSupported() {
-#if SB_API_VERSION >= 12
   return SbWindowOnScreenKeyboardIsSupported();
-#else
-  return true;
-#endif
 }
 
 void OnScreenKeyboardStarboardBridge::Show(const char* input_text, int ticket) {
@@ -71,13 +68,13 @@
 }
 
 bool OnScreenKeyboardStarboardBridge::SuggestionsSupported() const {
-// Delay providing the SbWindow until as late as possible.
+  // Delay providing the SbWindow until as late as possible.
   return SbWindowOnScreenKeyboardSuggestionsSupported(
       sb_window_provider_.Run());
 }
 
-scoped_refptr<dom::DOMRect>
-OnScreenKeyboardStarboardBridge::BoundingRect() const {
+scoped_refptr<dom::DOMRect> OnScreenKeyboardStarboardBridge::BoundingRect()
+    const {
   // Delay providing the SbWindow until as late as possible.
   SbWindowRect sb_window_rect = SbWindowRect();
   if (!SbWindowGetOnScreenKeyboardBoundingRect(sb_window_provider_.Run(),
@@ -101,5 +98,3 @@
 }
 }  // namespace browser
 }  // namespace cobalt
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/cobalt/browser/on_screen_keyboard_starboard_bridge.h b/cobalt/browser/on_screen_keyboard_starboard_bridge.h
index 4b7bcfb..f73cc11 100644
--- a/cobalt/browser/on_screen_keyboard_starboard_bridge.h
+++ b/cobalt/browser/on_screen_keyboard_starboard_bridge.h
@@ -21,7 +21,6 @@
 #include "cobalt/dom/on_screen_keyboard_bridge.h"
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 namespace cobalt {
 namespace browser {
 
@@ -65,6 +64,4 @@
 
 }  // namespace browser
 }  // namespace cobalt
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 #endif  // COBALT_BROWSER_ON_SCREEN_KEYBOARD_STARBOARD_BRIDGE_H_
diff --git a/cobalt/browser/service_worker_registry.cc b/cobalt/browser/service_worker_registry.cc
new file mode 100644
index 0000000..71a3a4f
--- /dev/null
+++ b/cobalt/browser/service_worker_registry.cc
@@ -0,0 +1,91 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/browser/service_worker_registry.h"
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/message_loop/message_loop.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/threading/thread.h"
+#include "base/trace_event/trace_event.h"
+#include "cobalt/network/network_module.h"
+#include "cobalt/worker/service_worker_jobs.h"
+
+namespace cobalt {
+namespace browser {
+
+namespace {
+// Signals the given WaitableEvent.
+void SignalWaitableEvent(base::WaitableEvent* event) { event->Signal(); }
+}  // namespace
+
+void ServiceWorkerRegistry::WillDestroyCurrentMessageLoop() {
+  // TODO clear all member variables allocated form the thread.
+  service_worker_jobs_.reset();
+}
+
+ServiceWorkerRegistry::ServiceWorkerRegistry(
+    network::NetworkModule* network_module)
+    : thread_("ServiceWorkerRegistry") {
+  if (!thread_.Start()) return;
+  DCHECK(message_loop());
+
+  message_loop()->task_runner()->PostTask(
+      FROM_HERE, base::Bind(&ServiceWorkerRegistry::Initialize,
+                            base::Unretained(this), network_module));
+
+  // Register as a destruction observer to shut down the Web Agent once all
+  // pending tasks have been executed and the message loop is about to be
+  // destroyed. This allows us to safely stop the thread, drain the task queue,
+  // then destroy the internal components before the message loop is reset.
+  // No posted tasks will be executed once the thread is stopped.
+  message_loop()->task_runner()->PostTask(
+      FROM_HERE,
+      base::Bind(&base::MessageLoop::AddDestructionObserver,
+                 base::Unretained(message_loop()), base::Unretained(this)));
+
+  // This works almost like a PostBlockingTask, except that any blocking that
+  // may be necessary happens when Stop() is called instead of right now.
+  message_loop()->task_runner()->PostTask(
+      FROM_HERE, base::Bind(&SignalWaitableEvent,
+                            base::Unretained(&destruction_observer_added_)));
+}
+
+ServiceWorkerRegistry::~ServiceWorkerRegistry() {
+  DCHECK(message_loop());
+  DCHECK(thread_.IsRunning());
+
+  // Ensure that the destruction observer got added before stopping the thread.
+  // Stop the thread. This will cause the destruction observer to be notified.
+  destruction_observer_added_.Wait();
+  thread_.Stop();
+}
+
+worker::ServiceWorkerJobs* ServiceWorkerRegistry::service_worker_jobs() {
+  // Ensure that the thread had a chance to allocate the object.
+  destruction_observer_added_.Wait();
+  return service_worker_jobs_.get();
+}
+
+void ServiceWorkerRegistry::Initialize(network::NetworkModule* network_module) {
+  TRACE_EVENT0("cobalt::browser", "ServiceWorkerRegistry::Initialize()");
+  DCHECK_EQ(base::MessageLoop::current(), message_loop());
+  service_worker_jobs_.reset(
+      new worker::ServiceWorkerJobs(network_module, message_loop()));
+}
+
+}  // namespace browser
+}  // namespace cobalt
diff --git a/cobalt/browser/service_worker_registry.h b/cobalt/browser/service_worker_registry.h
new file mode 100644
index 0000000..4b4239b
--- /dev/null
+++ b/cobalt/browser/service_worker_registry.h
@@ -0,0 +1,68 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_BROWSER_SERVICE_WORKER_REGISTRY_H_
+#define COBALT_BROWSER_SERVICE_WORKER_REGISTRY_H_
+
+#include <memory>
+
+#include "base/message_loop/message_loop.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/threading/thread.h"
+#include "cobalt/network/network_module.h"
+#include "cobalt/worker/service_worker_jobs.h"
+
+namespace cobalt {
+namespace browser {
+
+// The Service Worker Registry tracks all registered service workers, processes
+// mutations to the registry in a thread, and ensures that the scripts and
+// metadata are stored persistently on disk.
+class ServiceWorkerRegistry : public base::MessageLoop::DestructionObserver {
+ public:
+  explicit ServiceWorkerRegistry(network::NetworkModule* network_module);
+  ~ServiceWorkerRegistry();
+
+  // The message loop this object is running on.
+  base::MessageLoop* message_loop() const { return thread_.message_loop(); }
+
+  // From base::MessageLoop::DestructionObserver.
+  void WillDestroyCurrentMessageLoop() override;
+
+  worker::ServiceWorkerJobs* service_worker_jobs();
+
+ private:
+  // Called by the constructor to perform any other initialization required on
+  // the dedicated thread.
+  void Initialize(network::NetworkModule* network_module);
+
+  // The thread created and owned by the Service Worker Registry.
+  // All registry mutations occur on this thread. The thread has to outlive all
+  // web Agents that use service workers.,
+  base::Thread thread_;
+
+  // This event is used to signal when the destruction observers have been
+  // added to the message loop. This is then used in Stop() to ensure that
+  // processing doesn't continue until the thread is cleanly shutdown.
+  base::WaitableEvent destruction_observer_added_ = {
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      base::WaitableEvent::InitialState::NOT_SIGNALED};
+
+  std::unique_ptr<worker::ServiceWorkerJobs> service_worker_jobs_;
+};
+
+}  // namespace browser
+}  // namespace cobalt
+
+#endif  // COBALT_BROWSER_SERVICE_WORKER_REGISTRY_H_
diff --git a/cobalt/browser/splash_screen.cc b/cobalt/browser/splash_screen.cc
index 751001c..bd642dc 100644
--- a/cobalt/browser/splash_screen.cc
+++ b/cobalt/browser/splash_screen.cc
@@ -65,12 +65,12 @@
       self_message_loop_(base::MessageLoop::current()),
       on_splash_screen_shutdown_complete_(on_splash_screen_shutdown_complete),
       shutdown_signaled_(false) {
-  WebModule::Options web_module_options;
-  web_module_options.name = "SplashScreenWebModule";
+  WebModule::Options web_module_options("SplashScreenWebModule");
 
   // We want the splash screen to load and appear as quickly as possible, so
   // we set it and its image decoding thread to be high priority.
-  web_module_options.thread_priority = base::ThreadPriority::HIGHEST;
+  web_module_options.web_options.thread_priority =
+      base::ThreadPriority::HIGHEST;
   web_module_options.loader_thread_priority = base::ThreadPriority::HIGHEST;
   web_module_options.animated_image_decode_thread_priority =
       base::ThreadPriority::HIGHEST;
@@ -80,7 +80,10 @@
          (splash_screen_cache && splash_screen_cache->IsSplashScreenCached()));
   if (splash_screen_cache && splash_screen_cache->IsSplashScreenCached()) {
     url_to_pass = splash_screen_cache->GetCachedSplashScreenUrl();
-    web_module_options.can_fetch_cache = true;
+    web_module_options.web_options.read_cache_callback =
+        base::Bind(&browser::SplashScreenCache::ReadCachedSplashScreen,
+                   base::Unretained(splash_screen_cache));
+
     web_module_options.splash_screen_cache = splash_screen_cache;
   }
 
@@ -97,14 +100,16 @@
   // Pass down this callback from Browser module to Web module eventually.
   web_module_options.maybe_freeze_callback = maybe_freeze_callback;
 
+  web_module_options.web_options.network_module = network_module;
+
   DCHECK(url_to_pass);
   web_module_.reset(new WebModule(
       *url_to_pass, initial_application_state, render_tree_produced_callback_,
       base::Bind(&OnError), on_window_close,
       base::Closure(),  // window_minimize_callback
       NULL /* can_play_type_handler */, NULL /* media_module */,
-      network_module, window_dimensions, resource_provider, layout_refresh_rate,
-      web_module_options));
+      window_dimensions, resource_provider, layout_refresh_rate,
+      NULL /* service_worker_jobs */, web_module_options));
 }
 
 SplashScreen::~SplashScreen() {
diff --git a/cobalt/browser/stack_size_constants.h b/cobalt/browser/stack_size_constants.h
index 06ed95d..42b9dfa 100644
--- a/cobalt/browser/stack_size_constants.h
+++ b/cobalt/browser/stack_size_constants.h
@@ -30,6 +30,8 @@
 #endif
 const size_t kWebModuleStackSize =
     kBaseStackSize + base::kAsanAdditionalStackSize;
+
+const size_t kWorkerStackSize = kBaseStackSize + base::kAsanAdditionalStackSize;
 }  // namespace browser
 }  // namespace cobalt
 
diff --git a/cobalt/browser/switches.cc b/cobalt/browser/switches.cc
index 178dde3..0312eaf 100644
--- a/cobalt/browser/switches.cc
+++ b/cobalt/browser/switches.cc
@@ -133,11 +133,6 @@
     "sessions and no data being persisted to future sessions. It effectively "
     "makes the app run as if it has no local storage.";
 
-const char kDisablePartialLayout[] = "disable_partial_layout";
-const char kDisablePartialLayoutHelp[] =
-    "Causes layout to re-compute the boxes for the entire DOM rather than "
-    "re-using boxes for elements that have not been invalidated.";
-
 const char kProd[] = "prod";
 const char kProdHelp[] =
     "Several checks are not enabled by default in non-production(gold) build. "
@@ -217,15 +212,16 @@
 const char kWebDriverPortHelp[] =
     "Port that the WebDriver server should be listening on.";
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 const char kDisableOnScreenKeyboard[] = "disable_on_screen_keyboard";
 const char kDisableOnScreenKeyboardHelp[] =
     "Disable the on screen keyboard for testing.";
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
 #endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
+const char kCompressUpdate[] = "compress_update";
+const char kCompressUpdateHelp[] =
+    "The updater should compress the update package";
+
 const char kMinLogLevel[] = "min_log_level";
 const char kMinLogLevelHelp[] =
     "Set the minimum logging level: info|warning|error|fatal.";
@@ -391,7 +387,7 @@
     "(for example h5vcc-embedded://foobar.html) and all files referenced must "
     "be content or embedded files as well. If none is passed "
     "(case-insensitive), no splash screen will be constructed. If "
-    "no value is set, the URL in gyp_configuration.gypi or base.gypi will be "
+    "no value is set, the URL in the Cobalt configuration extension will be "
     "used.";
 
 const char kFallbackSplashScreenTopics[] = "fallback_splash_screen_topics";
@@ -452,8 +448,7 @@
         {kIgnoreCertificateErrors, kIgnoreCertificateErrorsHelp},
         {kInputFuzzer, kInputFuzzerHelp}, {kMemoryTracker, kMemoryTrackerHelp},
         {kMinCompatibilityVersion, kMinCompatibilityVersionHelp},
-        {kNullSavegame, kNullSavegameHelp},
-        {kDisablePartialLayout, kDisablePartialLayoutHelp}, {kProd, kProdHelp},
+        {kNullSavegame, kNullSavegameHelp}, {kProd, kProdHelp},
         {kRequireCSP, kRequireCSPHelp},
         {kRequireHTTPSLocation, kRequireHTTPSLocationHelp},
         {kShutdownAfter, kShutdownAfterHelp},
@@ -463,11 +458,9 @@
         {kUserAgentClientHints, kUserAgentClientHintsHelp},
         {kUserAgentOsNameVersion, kUserAgentOsNameVersionHelp},
         {kUseTTS, kUseTTSHelp}, {kWebDriverPort, kWebDriverPortHelp},
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
         {kDisableOnScreenKeyboard, kDisableOnScreenKeyboardHelp},
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 #endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
+        {kCompressUpdate, kCompressUpdateHelp},
         {kDisableJavaScriptJit, kDisableJavaScriptJitHelp},
         {kDisableMapToMesh, kDisableMapToMeshHelp},
         {kDisableTimerResolutionLimit, kDisableTimerResolutionLimitHelp},
diff --git a/cobalt/browser/switches.h b/cobalt/browser/switches.h
index 3159a68..8348964 100644
--- a/cobalt/browser/switches.h
+++ b/cobalt/browser/switches.h
@@ -64,8 +64,6 @@
 extern const char kMinCompatibilityVersionHelp[];
 extern const char kNullSavegame[];
 extern const char kNullSavegameHelp[];
-extern const char kDisablePartialLayout[];
-extern const char kDisablePartialLayoutHelp[];
 extern const char kProd[];
 extern const char kProdHelp[];
 extern const char kRequireCSP[];
@@ -88,14 +86,12 @@
 extern const char kUseTTSHelp[];
 extern const char kWebDriverPort[];
 extern const char kWebDriverPortHelp[];
-
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 extern const char kDisableOnScreenKeyboard[];
 extern const char kDisableOnScreenKeyboardHelp[];
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 #endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
+extern const char kCompressUpdate[];
+extern const char kCompressUpdateHelp[];
 extern const char kDisableJavaScriptJit[];
 extern const char kDisableJavaScriptJitHelp[];
 extern const char kDisableMapToMesh[];
diff --git a/cobalt/browser/user_agent_platform_info.cc b/cobalt/browser/user_agent_platform_info.cc
index aab3d91..a862c3c 100644
--- a/cobalt/browser/user_agent_platform_info.cc
+++ b/cobalt/browser/user_agent_platform_info.cc
@@ -269,15 +269,9 @@
   }
 #endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
 
-#if SB_API_VERSION >= 12
   // System Integrator
   result = SbSystemGetProperty(kSbSystemPropertySystemIntegratorName, value,
                                kSystemPropertyMaxLength);
-#else
-  // Original Design Manufacturer (ODM)
-  result = SbSystemGetProperty(kSbSystemPropertyOriginalDesignManufacturerName,
-                               value, kSystemPropertyMaxLength);
-#endif
   if (result) {
     info.set_original_design_manufacturer(value);
   }
diff --git a/cobalt/browser/web_module.cc b/cobalt/browser/web_module.cc
index 6315007..0da0b70 100644
--- a/cobalt/browser/web_module.cc
+++ b/cobalt/browser/web_module.cc
@@ -52,6 +52,7 @@
 #include "cobalt/dom/keyboard_event_init.h"
 #include "cobalt/dom/local_storage_database.h"
 #include "cobalt/dom/mutation_observer_task_manager.h"
+#include "cobalt/dom/navigation_type.h"
 #include "cobalt/dom/navigator.h"
 #include "cobalt/dom/pointer_event.h"
 #include "cobalt/dom/storage.h"
@@ -63,13 +64,14 @@
 #include "cobalt/dom_parser/parser.h"
 #include "cobalt/layout/topmost_event_target.h"
 #include "cobalt/loader/image/animated_image_tracker.h"
+#include "cobalt/loader/loader_factory.h"
 #include "cobalt/loader/switches.h"
 #include "cobalt/media/decoder_buffer_allocator.h"
 #include "cobalt/media/media_module.h"
 #include "cobalt/media_session/media_session_client.h"
-#include "cobalt/script/error_report.h"
-#include "cobalt/script/javascript_engine.h"
 #include "cobalt/storage/storage_manager.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "starboard/accessibility.h"
 #include "starboard/common/log.h"
 #include "starboard/gles.h"
@@ -114,7 +116,7 @@
 // execute synchronously with respect to one another.
 class WebModule::Impl {
  public:
-  explicit Impl(const ConstructionData& data);
+  Impl(web::Context* web_context, const ConstructionData& data);
   ~Impl();
 
 #if defined(ENABLE_DEBUGGER)
@@ -124,14 +126,13 @@
   }
 #endif  // ENABLE_DEBUGGER
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   // Injects an on screen keyboard input event into the web module. Event is
   // directed at a specific element if the element is non-null. Otherwise, the
   // currently focused element receives the event. If element is specified, we
   // must be on the WebModule's message loop.
-  void InjectOnScreenKeyboardInputEvent(scoped_refptr<dom::Element> element,
-                                        base::Token type,
-                                        const dom::InputEventInit& event);
+  void InjectOnScreenKeyboardInputEvent(
+      base::Token type, const dom::InputEventInit& event,
+      scoped_refptr<dom::Element> element = scoped_refptr<dom::Element>());
   // Injects an on screen keyboard shown event into the web module. Event is
   // directed at the on screen keyboard element.
   void InjectOnScreenKeyboardShownEvent(int ticket);
@@ -147,30 +148,30 @@
   // Injects an on screen keyboard suggestions updated event into the web
   // module. Event is directed at the on screen keyboard element.
   void InjectOnScreenKeyboardSuggestionsUpdatedEvent(int ticket);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
   // Injects a keyboard event into the web module. Event is directed at a
   // specific element if the element is non-null. Otherwise, the currently
   // focused element receives the event. If element is specified, we must be
   // on the WebModule's message loop
-  void InjectKeyboardEvent(scoped_refptr<dom::Element> element,
-                           base::Token type,
-                           const dom::KeyboardEventInit& event);
+  void InjectKeyboardEvent(
+      base::Token type, const dom::KeyboardEventInit& event,
+      scoped_refptr<dom::Element> element = scoped_refptr<dom::Element>());
 
   // Injects a pointer event into the web module. Event is directed at a
   // specific element if the element is non-null. Otherwise, the currently
   // focused element receives the event. If element is specified, we must be
   // on the WebModule's message loop
-  void InjectPointerEvent(scoped_refptr<dom::Element> element, base::Token type,
-                          const dom::PointerEventInit& event);
+  void InjectPointerEvent(
+      base::Token type, const dom::PointerEventInit& event,
+      scoped_refptr<dom::Element> element = scoped_refptr<dom::Element>());
 
   // Injects a wheel event into the web module. Event is directed at a
   // specific element if the element is non-null. Otherwise, the currently
   // focused element receives the event. If element is specified, we must be
   // on the WebModule's message loop
-  void InjectWheelEvent(scoped_refptr<dom::Element> element, base::Token type,
-                        const dom::WheelEventInit& event);
+  void InjectWheelEvent(
+      base::Token type, const dom::WheelEventInit& event,
+      scoped_refptr<dom::Element> element = scoped_refptr<dom::Element>());
 
   // Injects a beforeunload event into the web module. If this event is not
   // handled by the web application, |on_before_unload_fired_but_not_handled_|
@@ -188,8 +189,7 @@
   // and signals |got_result|.
   void ExecuteJavascript(const std::string& script_utf8,
                          const base::SourceLocation& script_location,
-                         base::WaitableEvent* got_result, std::string* result,
-                         bool* out_succeeded);
+                         std::string* result, bool* out_succeeded);
 
   // Clears disables timer related objects
   // so that the message loop can easily exit
@@ -206,13 +206,9 @@
 #if defined(ENABLE_DEBUGGER)
   void WaitForWebDebugger();
 
-  bool IsFinishedWaitingForWebDebugger() {
-    return wait_for_web_debugger_finished_.IsSignaled();
-  }
-
   void FreezeDebugger(
       std::unique_ptr<debug::backend::DebuggerState>* debugger_state) {
-    *debugger_state = debug_module_->Freeze();
+    if (debugger_state) *debugger_state = debug_module_->Freeze();
   }
 #endif  // defined(ENABLE_DEBUGGER)
 
@@ -240,14 +236,10 @@
   void Focus(SbTimeMonotonic timestamp);
 
   void ReduceMemory();
-  void GetJavaScriptHeapStatistics(
-      const JavaScriptHeapStatisticsCallback& callback);
 
   void LogScriptError(const base::SourceLocation& source_location,
                       const std::string& error_message);
 
-  void CancelSynchronousLoads();
-
   void IsReadyToFreeze(volatile bool* is_ready_to_freeze) {
     if (window_->media_session()->media_session_client() == NULL) {
       *is_ready_to_freeze = true;
@@ -265,6 +257,9 @@
                                              SbTimeMonotonic timestamp);
   void SetDeepLinkTimestamp(SbTimeMonotonic timestamp);
 
+  void SetUnloadEventTimingInfo(base::TimeTicks start_time,
+                                base::TimeTicks end_time);
+
  private:
   class DocumentLoadedObserver;
 
@@ -274,11 +269,6 @@
   // Disable callbacks in all resource caches owned by the WebModule.
   void DisableCallbacksInResourceCaches();
 
-  // Injects a list of custom window attributes into the WebModule's window
-  // object.
-  void InjectCustomWindowAttributes(
-      const Options::InjectedWindowAttributes& attributes);
-
   // Called by |layout_manager_| after it runs the animation frame callbacks.
   void OnRanAnimationFrameCallbacks();
 
@@ -304,11 +294,27 @@
 
   scoped_refptr<script::GlobalEnvironment> global_environment() {
     DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-    return global_environment_;
+    return web_context_->global_environment();
   }
 
   void OnLoadComplete(const base::Optional<std::string>& error) {
     if (error) error_callback_.Run(window_->location()->url(), *error);
+
+    // Create Performance navigation timing info after document loading
+    // completed.
+    DCHECK(window_);
+    DCHECK(window_->performance());
+    if (window_->GetDocumentLoader()) {
+      net::LoadTimingInfo load_timing_info =
+          window_->GetDocumentLoader()->get_load_timing_info();
+      // Check if the load happens through net mdoule.
+      bool is_load_timing_info_valid =
+          !load_timing_info.request_start.is_null();
+      if (is_load_timing_info_valid) {
+        window_->document()->CreatePerformanceNavigationTiming(
+            window_->performance(), load_timing_info);
+      }
+    }
   }
 
   // Report an error encountered while running JS.
@@ -332,7 +338,7 @@
   // thread that it is created in.
   THREAD_CHECKER(thread_checker_);
 
-  std::string name_;
+  web::Context* web_context_;
 
   // Simple flag used for basic error checking.
   bool is_running_;
@@ -355,9 +361,6 @@
   // DOM (HTML / XML) parser.
   std::unique_ptr<dom_parser::Parser> dom_parser_;
 
-  // FetcherFactory that is used to create a fetcher according to URL.
-  std::unique_ptr<loader::FetcherFactory> fetcher_factory_;
-
   // LoaderFactory that is used to acquire references to resources from a
   // URL.
   std::unique_ptr<loader::LoaderFactory> loader_factory_;
@@ -392,25 +395,9 @@
   // Post and run tasks to notify MutationObservers.
   dom::MutationObserverTaskManager mutation_observer_task_manager_;
 
-  // JavaScript engine for the browser.
-  std::unique_ptr<script::JavaScriptEngine> javascript_engine_;
-
-  // JavaScript Global Object for the browser. There should be one per window,
-  // but since there is only one window, we can have one per browser.
-  scoped_refptr<script::GlobalEnvironment> global_environment_;
-
-  // Used by |Console| to obtain a JavaScript stack trace.
-  std::unique_ptr<script::ExecutionState> execution_state_;
-
-  // Interface for the document to execute JavaScript code.
-  std::unique_ptr<script::ScriptRunner> script_runner_;
-
   // Object to register and retrieve MediaSource object with a string key.
   std::unique_ptr<dom::MediaSource::Registry> media_source_registry_;
 
-  // Object to register and retrieve Blob objects with a string key.
-  std::unique_ptr<dom::Blob::Registry> blob_registry_;
-
   // The Window object wraps all DOM-related components.
   scoped_refptr<dom::Window> window_;
 
@@ -424,9 +411,6 @@
   std::unique_ptr<media::DecoderBufferMemoryInfo>
       stub_decoder_buffer_memory_info_;
 
-  // Environment Settings object
-  std::unique_ptr<dom::DOMSettings> environment_settings_;
-
   // Called by |OnRenderTreeProduced|.
   OnRenderTreeProducedCallback render_tree_produced_callback_;
 
@@ -446,9 +430,7 @@
 
   // Used to avoid a deadlock when running |Impl::Pause| while waiting for the
   // web debugger to connect.
-  base::WaitableEvent wait_for_web_debugger_finished_ = {
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED};
+  starboard::atomic_bool* waiting_for_web_debugger_;
 
   // Interface to report behaviour relevant to the web debugger.
   debug::backend::DebuggerHooksImpl debugger_hooks_;
@@ -473,11 +455,14 @@
   // synchronously.  It is manually reset so that events like Freeze can be
   // correctly execute, even if there are multiple synchronous loads in queue
   // before the freeze (or other) event handlers.
-  base::WaitableEvent synchronous_loader_interrupt_ = {
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED};
+  base::WaitableEvent* synchronous_loader_interrupt_;
+
+  base::Callback<void(base::TimeTicks, base::TimeTicks)>
+      report_unload_timing_info_callback_;
 };
 
+void WebModule::WillDestroyCurrentMessageLoop() { impl_.reset(); }
+
 class WebModule::Impl::DocumentLoadedObserver : public dom::DocumentObserver {
  public:
   typedef std::vector<base::Closure> ClosureVector;
@@ -497,20 +482,30 @@
   ClosureVector loaded_callbacks_;
 };
 
-WebModule::Impl::Impl(const ConstructionData& data)
-    : name_(data.options.name),
+WebModule::Impl::Impl(web::Context* web_context, const ConstructionData& data)
+    : web_context_(web_context),
       is_running_(false),
       is_render_tree_rasterization_pending_(
           base::StringPrintf("%s.IsRenderTreeRasterizationPending",
-                             name_.c_str()),
+                             web_context_->name().c_str()),
           false, "True when a render tree is produced but not yet rasterized."),
       resource_provider_(data.resource_provider),
-      resource_provider_type_id_(data.resource_provider->GetTypeId()) {
+      resource_provider_type_id_(data.resource_provider->GetTypeId()),
+#if defined(ENABLE_DEBUGGER)
+      waiting_for_web_debugger_(data.waiting_for_web_debugger),
+#endif  // defined(ENABLE_DEBUGGER)
+      synchronous_loader_interrupt_(data.synchronous_loader_interrupt) {
+  DCHECK(web_context_);
+#if defined(COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING)
+  script::JavaScriptEngine::ErrorHandler error_handler =
+      base::Bind(&WebModule::Impl::LogScriptError, base::Unretained(this));
+  web_context_->javascript_engine()->RegisterErrorHandler(error_handler);
+#endif
+
   css_parser::Parser::SupportsMapToMeshFlag supports_map_to_mesh =
       data.options.enable_map_to_mesh
           ? css_parser::Parser::kSupportsMapToMesh
           : css_parser::Parser::kDoesNotSupportMapToMesh;
-
   css_parser_ =
       css_parser::Parser::Create(debugger_hooks_, supports_map_to_mesh);
   DCHECK(css_parser_);
@@ -521,32 +516,17 @@
       data.options.require_csp));
   DCHECK(dom_parser_);
 
-  blob_registry_.reset(new dom::Blob::Registry);
-
-  base::Callback<int(const std::string&, std::unique_ptr<char[]>*)>
-      read_cache_callback;
-  if (data.options.can_fetch_cache) {
-    read_cache_callback =
-        base::Bind(&browser::SplashScreenCache::ReadCachedSplashScreen,
-                   base::Unretained(data.options.splash_screen_cache));
-  }
-
   on_before_unload_fired_but_not_handled_ =
       data.options.on_before_unload_fired_but_not_handled;
 
   should_retain_remote_typeface_cache_on_freeze_ =
       data.options.should_retain_remote_typeface_cache_on_freeze;
 
-  fetcher_factory_.reset(new loader::FetcherFactory(
-      data.network_module, data.options.extra_web_file_dir,
-      dom::URL::MakeBlobResolverCallback(blob_registry_.get()),
-      read_cache_callback));
-  DCHECK(fetcher_factory_);
-
   DCHECK_LE(0, data.options.encoded_image_cache_capacity);
   loader_factory_.reset(new loader::LoaderFactory(
-      name_.c_str(), fetcher_factory_.get(), resource_provider_,
-      debugger_hooks_, data.options.encoded_image_cache_capacity,
+      web_context_->name().c_str(), web_context_->fetcher_factory(),
+      resource_provider_, debugger_hooks_,
+      data.options.encoded_image_cache_capacity,
       data.options.loader_thread_priority));
 
   animated_image_tracker_.reset(new loader::image::AnimatedImageTracker(
@@ -554,8 +534,8 @@
 
   DCHECK_LE(0, data.options.image_cache_capacity);
   image_cache_ = loader::image::CreateImageCache(
-      base::StringPrintf("%s.ImageCache", name_.c_str()), debugger_hooks_,
-      static_cast<uint32>(data.options.image_cache_capacity),
+      base::StringPrintf("%s.ImageCache", web_context_->name().c_str()),
+      debugger_hooks_, static_cast<uint32>(data.options.image_cache_capacity),
       loader_factory_.get());
   DCHECK(image_cache_);
 
@@ -566,7 +546,8 @@
 
   DCHECK_LE(0, data.options.remote_typeface_cache_capacity);
   remote_typeface_cache_ = loader::font::CreateRemoteTypefaceCache(
-      base::StringPrintf("%s.RemoteTypefaceCache", name_.c_str()),
+      base::StringPrintf("%s.RemoteTypefaceCache",
+                         web_context_->name().c_str()),
       debugger_hooks_,
       static_cast<uint32>(data.options.remote_typeface_cache_capacity),
       loader_factory_.get());
@@ -574,43 +555,22 @@
 
   DCHECK_LE(0, data.options.mesh_cache_capacity);
   mesh_cache_ = loader::mesh::CreateMeshCache(
-      base::StringPrintf("%s.MeshCache", name_.c_str()), debugger_hooks_,
-      static_cast<uint32>(data.options.mesh_cache_capacity),
+      base::StringPrintf("%s.MeshCache", web_context_->name().c_str()),
+      debugger_hooks_, static_cast<uint32>(data.options.mesh_cache_capacity),
       loader_factory_.get());
   DCHECK(mesh_cache_);
 
-  local_storage_database_.reset(
-      new dom::LocalStorageDatabase(data.network_module->storage_manager()));
+  local_storage_database_.reset(new dom::LocalStorageDatabase(
+      web_context_->network_module()->storage_manager()));
   DCHECK(local_storage_database_);
 
-  web_module_stat_tracker_.reset(
-      new browser::WebModuleStatTracker(name_, data.options.track_event_stats));
+  web_module_stat_tracker_.reset(new browser::WebModuleStatTracker(
+      web_context_->name(), data.options.track_event_stats));
   DCHECK(web_module_stat_tracker_);
 
   platform_info_.reset(new browser::UserAgentPlatformInfo());
   DCHECK(platform_info_);
 
-  javascript_engine_ = script::JavaScriptEngine::CreateEngine(
-      data.options.javascript_engine_options);
-  DCHECK(javascript_engine_);
-
-#if defined(COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING)
-  script::JavaScriptEngine::ErrorHandler error_handler =
-      base::Bind(&WebModule::Impl::LogScriptError, base::Unretained(this));
-  javascript_engine_->RegisterErrorHandler(error_handler);
-#endif
-
-  global_environment_ = javascript_engine_->CreateGlobalEnvironment();
-  DCHECK(global_environment_);
-
-  execution_state_ =
-      script::ExecutionState::CreateExecutionState(global_environment_);
-  DCHECK(execution_state_);
-
-  script_runner_ =
-      script::ScriptRunner::CreateScriptRunner(global_environment_);
-  DCHECK(script_runner_);
-
   media_source_registry_.reset(new dom::MediaSource::Registry);
 
   const media::DecoderBufferMemoryInfo* memory_info = nullptr;
@@ -623,36 +583,31 @@
     memory_info = stub_decoder_buffer_memory_info_.get();
   }
 
-  environment_settings_.reset(new dom::DOMSettings(
-      kDOMMaxElementDepth, fetcher_factory_.get(), data.network_module,
-      media_source_registry_.get(), blob_registry_.get(),
-      data.can_play_type_handler, memory_info, javascript_engine_.get(),
-      global_environment_.get(), debugger_hooks_,
-      &mutation_observer_task_manager_, data.options.dom_settings_options));
-  DCHECK(environment_settings_);
+  web_context_->setup_environment_settings(new dom::DOMSettings(
+      debugger_hooks_, kDOMMaxElementDepth, media_source_registry_.get(),
+      data.can_play_type_handler, memory_info, &mutation_observer_task_manager_,
+      data.service_worker_jobs, data.options.dom_settings_options));
+  DCHECK(web_context_->environment_settings());
 
   system_caption_settings_ = new cobalt::dom::captions::SystemCaptionSettings(
-      environment_settings_.get());
+      web_context_->environment_settings());
 
   dom::Window::CacheCallback splash_screen_cache_callback =
       CacheUrlContentCallback(data.options.splash_screen_cache);
 
   // These members will reference other |Traceable|s, however are not
   // accessible from |Window|, so we must explicitly add them as roots.
-  global_environment_->AddRoot(&mutation_observer_task_manager_);
-  global_environment_->AddRoot(media_source_registry_.get());
-  global_environment_->AddRoot(blob_registry_.get());
+  web_context_->global_environment()->AddRoot(&mutation_observer_task_manager_);
+  web_context_->global_environment()->AddRoot(media_source_registry_.get());
 
 #if defined(ENABLE_DEBUGGER)
   if (data.options.wait_for_web_debugger) {
     // Post a task that blocks the message loop and waits for the web debugger.
     // This must be posted before the the window's task to load the document.
+    waiting_for_web_debugger_->store(true);
     base::MessageLoop::current()->task_runner()->PostTask(
         FROM_HERE, base::Bind(&WebModule::Impl::WaitForWebDebugger,
                               base::Unretained(this)));
-  } else {
-    // We're not going to wait for the web debugger, so consider it finished.
-    wait_for_web_debugger_finished_.Signal();
   }
 #endif  // defined(ENABLE_DEBUGGER)
 
@@ -664,23 +619,26 @@
 
   std::unique_ptr<UserAgentPlatformInfo> platform_info(
       new UserAgentPlatformInfo());
+  DCHECK(web_context_->network_module());
   window_ = new dom::Window(
-      environment_settings_.get(), data.window_dimensions,
+      web_context_->environment_settings(), data.window_dimensions,
       data.initial_application_state, css_parser_.get(), dom_parser_.get(),
-      fetcher_factory_.get(), loader_factory_.get(), &resource_provider_,
-      animated_image_tracker_.get(), image_cache_.get(),
+      web_context_->fetcher_factory(), loader_factory_.get(),
+      &resource_provider_, animated_image_tracker_.get(), image_cache_.get(),
       reduced_image_cache_capacity_manager_.get(), remote_typeface_cache_.get(),
       mesh_cache_.get(), local_storage_database_.get(),
-      data.can_play_type_handler, data.media_module, execution_state_.get(),
-      script_runner_.get(), global_environment_->script_value_factory(),
+      data.can_play_type_handler, data.media_module,
+      web_context_->execution_state(), web_context_->script_runner(),
+      web_context_->global_environment()->script_value_factory(),
       media_source_registry_.get(),
       web_module_stat_tracker_->dom_stat_tracker(), data.initial_url,
-      data.network_module->GetUserAgent(), platform_info_.get(),
-      data.network_module->preferred_language(),
+      web_context_->network_module()->GetUserAgent(), platform_info_.get(),
+      web_context_->network_module()->preferred_language(),
       base::GetSystemLanguageScript(), data.options.navigation_callback,
       base::Bind(&WebModule::Impl::OnLoadComplete, base::Unretained(this)),
-      data.network_module->cookie_jar(), data.network_module->GetPostSender(),
-      data.options.require_csp, data.options.csp_enforcement_mode,
+      web_context_->network_module()->cookie_jar(),
+      web_context_->network_module()->GetPostSender(), data.options.require_csp,
+      data.options.csp_enforcement_mode,
       base::Bind(&WebModule::Impl::OnCspPolicyChanged, base::Unretained(this)),
       base::Bind(&WebModule::Impl::OnRanAnimationFrameCallbacks,
                  base::Unretained(this)),
@@ -689,7 +647,7 @@
       base::Bind(&WebModule::Impl::OnStartDispatchEvent,
                  base::Unretained(this)),
       base::Bind(&WebModule::Impl::OnStopDispatchEvent, base::Unretained(this)),
-      data.options.provide_screenshot_function, &synchronous_loader_interrupt_,
+      data.options.provide_screenshot_function, synchronous_loader_interrupt_,
       data.options.enable_inline_script_warnings, data.ui_nav_root,
       data.options.enable_map_to_mesh, data.options.csp_insecure_allowed_token,
       data.dom_max_element_depth, data.options.video_playback_rate_multiplier,
@@ -708,9 +666,13 @@
   window_weak_ = base::AsWeakPtr(window_.get());
   DCHECK(window_weak_);
 
-  environment_settings_->set_window(window_);
+  dom::DOMSettings* dom_settings =
+      base::polymorphic_downcast<dom::DOMSettings*>(
+          web_context_->environment_settings());
+  dom_settings->set_window(window_);
 
-  global_environment_->CreateGlobalObject(window_, environment_settings_.get());
+  web_context_->global_environment()->CreateGlobalObject(
+      window_, web_context_->environment_settings());
 
   render_tree_produced_callback_ = data.render_tree_produced_callback;
   DCHECK(!render_tree_produced_callback_.is_null());
@@ -725,12 +687,13 @@
   bool is_concealed =
       (data.initial_application_state == base::kApplicationStateConcealed);
   layout_manager_.reset(new layout::LayoutManager(
-      is_concealed, name_, window_.get(),
+      is_concealed, web_context_->name(), window_.get(),
       base::Bind(&WebModule::Impl::OnRenderTreeProduced,
                  base::Unretained(this)),
       base::Bind(&WebModule::Impl::HandlePointerEvents, base::Unretained(this)),
       data.options.layout_trigger, data.dom_max_element_depth,
-      data.layout_refresh_rate, data.network_module->preferred_language(),
+      data.layout_refresh_rate,
+      web_context_->network_module()->preferred_language(),
       data.options.enable_image_animations,
       web_module_stat_tracker_->layout_stat_tracker(),
       data.options.clear_window_with_background_color));
@@ -740,38 +703,36 @@
   if (data.options.csp_enforcement_mode == dom::kCspEnforcementDisable) {
     // If CSP is disabled, enable eval(). Otherwise, it will be enabled by
     // a CSP directive.
-    global_environment_->EnableEval();
+    web_context_->global_environment()->EnableEval();
   }
 #endif
 
-  global_environment_->SetReportEvalCallback(
+  web_context_->global_environment()->SetReportEvalCallback(
       base::Bind(&dom::CspDelegate::ReportEval,
                  base::Unretained(window_->document()->csp_delegate())));
 
-  global_environment_->SetReportErrorCallback(
+  web_context_->global_environment()->SetReportErrorCallback(
       base::Bind(&WebModule::Impl::ReportScriptError, base::Unretained(this)));
 
-  InjectCustomWindowAttributes(data.options.injected_window_attributes);
-
   if (!data.options.loaded_callbacks.empty()) {
     document_load_observer_.reset(
         new DocumentLoadedObserver(data.options.loaded_callbacks));
     window_->document()->AddObserver(document_load_observer_.get());
   }
 
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-  window_->document()->SetPartialLayout(data.options.enable_partial_layout);
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
 #if defined(ENABLE_DEBUGGER)
   debug_overlay_.reset(
       new debug::backend::RenderOverlay(render_tree_produced_callback_));
 
   debug_module_.reset(new debug::backend::DebugModule(
-      &debugger_hooks_, global_environment_.get(), debug_overlay_.get(),
-      resource_provider_, window_, data.options.debugger_state));
+      &debugger_hooks_, web_context_->global_environment(),
+      debug_overlay_.get(), resource_provider_, window_,
+      data.options.debugger_state));
 #endif  // ENABLE_DEBUGGER
 
+  report_unload_timing_info_callback_ =
+      data.options.collect_unload_event_time_callback;
+
   is_running_ = true;
 }
 
@@ -779,10 +740,21 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(is_running_);
   is_running_ = false;
-  global_environment_->SetReportEvalCallback(base::Closure());
-  global_environment_->SetReportErrorCallback(
-      script::GlobalEnvironment::ReportErrorCallback());
+
+  // Collect document's unload event start time.
+  base::TimeTicks unload_event_start_time = base::TimeTicks::Now();
+
   window_->DispatchEvent(new dom::Event(base::Tokens::unload()));
+
+  // Collect document's unload event end time.
+  base::TimeTicks unload_event_end_time = base::TimeTicks::Now();
+
+  // Send the unload event start/end time back to application.
+  if (!report_unload_timing_info_callback_.is_null()) {
+    report_unload_timing_info_callback_.Run(unload_event_start_time,
+                                            unload_event_end_time);
+  }
+
   document_load_observer_.reset();
 
 #if defined(ENABLE_DEBUGGER)
@@ -798,33 +770,27 @@
 
   topmost_event_target_.reset();
   layout_manager_.reset();
-  environment_settings_.reset();
   stub_decoder_buffer_memory_info_.reset();
   window_weak_.reset();
   window_->ClearPointerStateForShutdown();
   window_ = NULL;
   media_source_registry_.reset();
-  blob_registry_.reset();
-  script_runner_.reset();
-  execution_state_.reset();
-  global_environment_ = NULL;
-  javascript_engine_.reset();
-  web_module_stat_tracker_.reset();
+  web_context_->ShutDownJavaScriptEngine();
   platform_info_.reset();
   local_storage_database_.reset();
   mesh_cache_.reset();
   remote_typeface_cache_.reset();
-  image_cache_.reset();
   animated_image_tracker_.reset();
-  fetcher_factory_.reset();
   dom_parser_.reset();
   css_parser_.reset();
+  image_cache_.reset();
+  web_module_stat_tracker_.reset();
 }
 
 void WebModule::Impl::InjectInputEvent(scoped_refptr<dom::Element> element,
                                        const scoped_refptr<dom::Event>& event) {
   TRACE_EVENT1("cobalt::browser", "WebModule::Impl::InjectInputEvent()",
-               "event", event->type().c_str());
+               "event", TRACE_STR_COPY(event->type().c_str()));
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(is_running_);
   DCHECK(window_);
@@ -846,10 +812,9 @@
   }
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void WebModule::Impl::InjectOnScreenKeyboardInputEvent(
-    scoped_refptr<dom::Element> element, base::Token type,
-    const dom::InputEventInit& event) {
+    base::Token type, const dom::InputEventInit& event,
+    scoped_refptr<dom::Element> element) {
   scoped_refptr<dom::InputEvent> input_event(
       new dom::InputEvent(type, window_, event));
   InjectInputEvent(element, input_event);
@@ -900,58 +865,61 @@
 
   window_->on_screen_keyboard()->DispatchSuggestionsUpdatedEvent(ticket);
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
-void WebModule::Impl::InjectKeyboardEvent(scoped_refptr<dom::Element> element,
-                                          base::Token type,
-                                          const dom::KeyboardEventInit& event) {
+
+void WebModule::Impl::InjectKeyboardEvent(base::Token type,
+                                          const dom::KeyboardEventInit& event,
+                                          scoped_refptr<dom::Element> element) {
   scoped_refptr<dom::KeyboardEvent> keyboard_event(
       new dom::KeyboardEvent(type, window_, event));
   InjectInputEvent(element, keyboard_event);
 }
 
-void WebModule::Impl::InjectPointerEvent(scoped_refptr<dom::Element> element,
-                                         base::Token type,
-                                         const dom::PointerEventInit& event) {
+void WebModule::Impl::InjectPointerEvent(base::Token type,
+                                         const dom::PointerEventInit& event,
+                                         scoped_refptr<dom::Element> element) {
   scoped_refptr<dom::PointerEvent> pointer_event(
       new dom::PointerEvent(type, window_, event));
   InjectInputEvent(element, pointer_event);
 }
 
-void WebModule::Impl::InjectWheelEvent(scoped_refptr<dom::Element> element,
-                                       base::Token type,
-                                       const dom::WheelEventInit& event) {
+void WebModule::Impl::InjectWheelEvent(base::Token type,
+                                       const dom::WheelEventInit& event,
+                                       scoped_refptr<dom::Element> element) {
   scoped_refptr<dom::WheelEvent> wheel_event(
       new dom::WheelEvent(type, window_, event));
   InjectInputEvent(element, wheel_event);
 }
 
 void WebModule::Impl::UpdateDateTimeConfiguration() {
-  if (javascript_engine_) {
-    javascript_engine_->UpdateDateTimeConfiguration();
+  if (web_context_ && web_context_->javascript_engine()) {
+    web_context_->javascript_engine()->UpdateDateTimeConfiguration();
   }
 }
 
 void WebModule::Impl::ExecuteJavascript(
     const std::string& script_utf8, const base::SourceLocation& script_location,
-    base::WaitableEvent* got_result, std::string* result, bool* out_succeeded) {
+    std::string* result, bool* out_succeeded) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(is_running_);
-  DCHECK(script_runner_);
+  DCHECK(web_context_->script_runner());
 
   // JavaScript is being run. Track it in the global stats.
   dom::GlobalStats::GetInstance()->StartJavaScriptEvent();
 
   // This should only be called for Cobalt JavaScript, error reports are
   // allowed.
-  *result = script_runner_->Execute(script_utf8, script_location,
-                                    false /*mute_errors*/, out_succeeded);
+  if (result) {
+    *result = web_context_->script_runner()->Execute(
+        script_utf8, script_location, false /*mute_errors*/, out_succeeded);
+  } else {
+    web_context_->script_runner()->Execute(
+        script_utf8, script_location, false /*mute_errors*/, out_succeeded);
+  }
+
 
   // JavaScript is done running. Stop tracking it in the global stats.
   dom::GlobalStats::GetInstance()->StopJavaScriptEvent();
-
-  got_result->Signal();
 }
 
 void WebModule::Impl::ClearAllIntervalsAndTimeouts() {
@@ -1014,10 +982,6 @@
   }
 }
 
-void WebModule::Impl::CancelSynchronousLoads() {
-  synchronous_loader_interrupt_.Signal();
-}
-
 void WebModule::Impl::DoSynchronousLayoutAndGetRenderTree(
     scoped_refptr<render_tree::Node>* render_tree) {
   TRACE_EVENT0("cobalt::browser",
@@ -1025,12 +989,13 @@
   DCHECK(render_tree);
   scoped_refptr<render_tree::Node> tree =
       window_->document()->DoSynchronousLayoutAndGetRenderTree();
-  *render_tree = tree;
+  if (render_tree) *render_tree = tree;
 }
 
 void WebModule::Impl::SetApplicationStartOrPreloadTimestamp(
     bool is_preload, SbTimeMonotonic timestamp) {
   DCHECK(window_);
+  DCHECK(window_->performance());
   window_->performance()->SetApplicationStartOrPreloadTimestamp(is_preload,
                                                                 timestamp);
 }
@@ -1040,6 +1005,14 @@
   window_->performance()->SetDeepLinkTimestamp(timestamp);
 }
 
+void WebModule::Impl::SetUnloadEventTimingInfo(base::TimeTicks start_time,
+                                               base::TimeTicks end_time) {
+  DCHECK(window_);
+  if (window_->document()) {
+    window_->document()->SetUnloadEventTimingInfo(start_time, end_time);
+  }
+}
+
 void WebModule::Impl::OnCspPolicyChanged() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(is_running_);
@@ -1051,9 +1024,9 @@
   bool allow_eval =
       window_->document()->csp_delegate()->AllowEval(&eval_disabled_message);
   if (allow_eval) {
-    global_environment_->EnableEval();
+    web_context_->global_environment()->EnableEval();
   } else {
-    global_environment_->DisableEval(eval_disabled_message);
+    web_context_->global_environment()->DisableEval(eval_disabled_message);
   }
 }
 
@@ -1074,7 +1047,7 @@
   DCHECK(window_);
   DCHECK(window_weak_);
   DCHECK(window_->document());
-  DCHECK(global_environment_);
+  DCHECK(web_context_->global_environment());
 
   window_driver_out->reset(new webdriver::WindowDriver(
       window_id, window_weak_,
@@ -1094,23 +1067,10 @@
                   "\n-------------------------------------";
   // This blocks until the web debugger connects.
   debug_module_->debug_dispatcher()->SetPaused(true);
-  wait_for_web_debugger_finished_.Signal();
+  waiting_for_web_debugger_->store(false);
 }
 #endif  // defined(ENABLE_DEBUGGER)
 
-void WebModule::Impl::InjectCustomWindowAttributes(
-    const Options::InjectedWindowAttributes& attributes) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(global_environment_);
-
-  for (Options::InjectedWindowAttributes::const_iterator iter =
-           attributes.begin();
-       iter != attributes.end(); ++iter) {
-    global_environment_->Bind(
-        iter->first, iter->second.Run(window_, global_environment_.get()));
-  }
-}
-
 void WebModule::Impl::SetImageCacheCapacity(int64_t bytes) {
   image_cache_->SetCapacity(static_cast<uint32>(bytes));
 }
@@ -1130,7 +1090,12 @@
 
 void WebModule::Impl::SetMediaModule(media::MediaModule* media_module) {
   SB_DCHECK(media_module);
-  environment_settings_->set_decoder_buffer_memory_info(
+
+  dom::DOMSettings* dom_settings =
+      base::polymorphic_downcast<dom::DOMSettings*>(
+          web_context_->environment_settings());
+
+  dom_settings->set_decoder_buffer_memory_info(
       media_module->GetDecoderBufferAllocator());
   window_->set_web_media_player_factory(media_module);
 }
@@ -1195,9 +1160,9 @@
   debug_overlay_->ClearInput();
 #endif
 
-  // Force garbage collection in |javascript_engine_|.
-  if (javascript_engine_) {
-    javascript_engine_->CollectGarbage();
+  // Force garbage collection in |javascript_engine|.
+  if (web_context_ && web_context_->javascript_engine()) {
+    web_context_->javascript_engine()->CollectGarbage();
   }
 
   loader_factory_->UpdateResourceProvider(resource_provider_);
@@ -1221,7 +1186,7 @@
 void WebModule::Impl::Unfreeze(render_tree::ResourceProvider* resource_provider,
                                SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::Impl::Unfreeze()");
-  synchronous_loader_interrupt_.Reset();
+  synchronous_loader_interrupt_->Reset();
   DCHECK(resource_provider);
 
   loader_factory_->Resume(resource_provider);
@@ -1231,7 +1196,7 @@
 void WebModule::Impl::Reveal(render_tree::ResourceProvider* resource_provider,
                              SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::Impl::Reveal()");
-  synchronous_loader_interrupt_.Reset();
+  synchronous_loader_interrupt_->Reset();
   DCHECK(resource_provider);
   SetResourceProvider(resource_provider);
 
@@ -1246,7 +1211,7 @@
 
 void WebModule::Impl::Focus(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::Impl::Focus()");
-  synchronous_loader_interrupt_.Reset();
+  synchronous_loader_interrupt_->Reset();
   SetApplicationState(base::kApplicationStateStarted, timestamp);
 }
 
@@ -1256,7 +1221,7 @@
   if (!is_running_) {
     return;
   }
-  synchronous_loader_interrupt_.Reset();
+  synchronous_loader_interrupt_->Reset();
 
   layout_manager_->Purge();
 
@@ -1264,22 +1229,12 @@
   PurgeResourceCaches(true /*should_retain_remote_typeface_cache*/);
   window_->document()->PurgeCachedResources();
 
-  // Force garbage collection in |javascript_engine_|.
-  if (javascript_engine_) {
-    javascript_engine_->CollectGarbage();
+  // Force garbage collection in |javascript_engine|.
+  if (web_context_ && web_context_->javascript_engine()) {
+    web_context_->javascript_engine()->CollectGarbage();
   }
 }
 
-void WebModule::Impl::GetJavaScriptHeapStatistics(
-    const JavaScriptHeapStatisticsCallback& callback) {
-  TRACE_EVENT0("cobalt::browser",
-               "WebModule::Impl::GetJavaScriptHeapStatistics()");
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  script::HeapStatistics heap_statistics =
-      javascript_engine_->GetHeapStatistics();
-  callback.Run(heap_statistics);
-}
-
 void WebModule::Impl::LogScriptError(
     const base::SourceLocation& source_location,
     const std::string& error_message) {
@@ -1359,347 +1314,284 @@
   } while (event && !layout_manager_->IsRenderTreePending());
 }
 
-WebModule::DestructionObserver::DestructionObserver(WebModule* web_module)
-    : web_module_(web_module) {}
-
-void WebModule::DestructionObserver::WillDestroyCurrentMessageLoop() {
-  web_module_->impl_.reset();
-}
-
-WebModule::Options::Options()
-    : name("WebModule"),
+WebModule::Options::Options(const std::string& name)
+    : web_options(name),
       layout_trigger(layout::LayoutManager::kOnDocumentMutation),
       mesh_cache_capacity(configuration::Configuration::GetInstance()
-                              ->CobaltMeshCacheSizeInBytes()) {}
+                              ->CobaltMeshCacheSizeInBytes()) {
+  web_options.stack_size = cobalt::browser::kWebModuleStackSize;
+}
 
 WebModule::WebModule(
     const GURL& initial_url, base::ApplicationState initial_application_state,
     const OnRenderTreeProducedCallback& render_tree_produced_callback,
-    const OnErrorCallback& error_callback,
-    const CloseCallback& window_close_callback,
+    OnErrorCallback error_callback, const CloseCallback& window_close_callback,
     const base::Closure& window_minimize_callback,
     media::CanPlayTypeHandler* can_play_type_handler,
-    media::MediaModule* media_module, network::NetworkModule* network_module,
-    const ViewportSize& window_dimensions,
+    media::MediaModule* media_module, const ViewportSize& window_dimensions,
     render_tree::ResourceProvider* resource_provider, float layout_refresh_rate,
-    const Options& options)
-    : thread_(options.name.c_str()),
-      ui_nav_root_(new ui_navigation::NavItem(
+    worker::ServiceWorkerJobs* service_worker_jobs, const Options& options)
+    : ui_nav_root_(new ui_navigation::NavItem(
           ui_navigation::kNativeItemTypeContainer,
           // Currently, events do not need to be processed for the root item.
           base::Closure(), base::Closure(), base::Closure())) {
   ConstructionData construction_data(
       initial_url, initial_application_state, render_tree_produced_callback,
       error_callback, window_close_callback, window_minimize_callback,
-      can_play_type_handler, media_module, network_module, window_dimensions,
-      resource_provider, kDOMMaxElementDepth, layout_refresh_rate, ui_nav_root_,
-      options);
+      can_play_type_handler, media_module, window_dimensions, resource_provider,
+      kDOMMaxElementDepth, layout_refresh_rate, ui_nav_root_,
+#if defined(ENABLE_DEBUGGER)
+      &waiting_for_web_debugger_,
+#endif  // defined(ENABLE_DEBUGGER)
+      &synchronous_loader_interrupt_, service_worker_jobs, options);
 
-  // Start the dedicated thread and create the internal implementation
-  // object on that thread.
-  base::Thread::Options thread_options(base::MessageLoop::TYPE_DEFAULT,
-                                       cobalt::browser::kWebModuleStackSize);
-  thread_options.priority = options.thread_priority;
-  thread_.StartWithOptions(thread_options);
-  DCHECK(message_loop());
-
-  // Block this thread until the initialization is complete.
-  // TODO: Figure out why this is necessary.
-  // It would be preferable to return immediately and let the WebModule
-  // continue in its own time, but without this wait there is a race condition
-  // such that inline scripts may be executed before the document elements they
-  // operate on are present.
-  message_loop()->task_runner()->PostBlockingTask(
-      FROM_HERE, base::Bind(&WebModule::Initialize, base::Unretained(this),
-                            construction_data));
+  web_agent_.reset(
+      new web::Agent(options.web_options,
+                     base::Bind(&WebModule::Initialize, base::Unretained(this),
+                                construction_data),
+                     this));
 }
 
 WebModule::~WebModule() {
   DCHECK(message_loop());
-
-  // Create a destruction observer to shut down the WebModule once all pending
-  // tasks have been executed and the message loop is about to be destroyed.
-  // This allows us to safely stop the thread, drain the task queue, then
-  // destroy the internal components before the message loop is set to NULL.
-  // No posted tasks will be executed once the thread is stopped.
-  DestructionObserver destruction_observer(this);
-  message_loop()->task_runner()->PostBlockingTask(
-      FROM_HERE, base::Bind(&base::MessageLoop::AddDestructionObserver,
-                            base::Unretained(message_loop()),
-                            base::Unretained(&destruction_observer)));
-
+  DCHECK(web_agent_);
   // This will cancel the timers for tasks, which help the thread exit
   ClearAllIntervalsAndTimeouts();
-
-  // Stop the thread. This will cause the destruction observer to be notified.
-  thread_.Stop();
+  web_agent_->WaitUntilDone();
+  web_agent_.reset();
 }
 
-void WebModule::Initialize(const ConstructionData& data) {
+void WebModule::Initialize(const ConstructionData& data,
+                           web::Context* context) {
   DCHECK_EQ(base::MessageLoop::current(), message_loop());
-  impl_.reset(new Impl(data));
+  impl_.reset(new Impl(context, data));
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
+// These are helper macros for jumping to the Impl thread without referencing
+// impl_ outside of the thread.
+
+// Ensure that we are on the WebModule thread where we can dereference impl_.
+// Post a task to the given function if we are not.
+#define TASK_TO_ENSURE_IMPL_ON_THREAD0(task_function, function)               \
+  DCHECK(message_loop());                                                     \
+  if (base::MessageLoop::current() != message_loop()) {                       \
+    message_loop()->task_runner()->task_function(                             \
+        FROM_HERE, base::Bind(&WebModule::function, base::Unretained(this))); \
+    return;                                                                   \
+  } else {                                                                    \
+    DCHECK(impl_);                                                            \
+  }
+
+// Ensure that we are on the WebModule thread where we can dereference impl_.
+// Post a task to the given function if we are not.
+#define TASK_TO_ENSURE_IMPL_ON_THREAD(task_function, function, ...)         \
+  DCHECK(message_loop());                                                   \
+  if (base::MessageLoop::current() != message_loop()) {                     \
+    message_loop()->task_runner()->task_function(                           \
+        FROM_HERE, base::Bind(&WebModule::function, base::Unretained(this), \
+                              ##__VA_ARGS__));                              \
+    return;                                                                 \
+  } else {                                                                  \
+    DCHECK(impl_);                                                          \
+  }
+
+// Ensure that we are on the WebModule thread where we can dereference impl_.
+// Post a task to the given function if we are not.
+#define POST_TO_ENSURE_IMPL_ON_THREAD0(function) \
+  TASK_TO_ENSURE_IMPL_ON_THREAD0(PostTask, function)
+
+// Ensure that we are on the WebModule thread where we can dereference impl_.
+// Post a task to the given function if we are not.
+#define POST_TO_ENSURE_IMPL_ON_THREAD(function, ...) \
+  TASK_TO_ENSURE_IMPL_ON_THREAD(PostTask, function, ##__VA_ARGS__)
+
+// Ensure that we are on the WebModule thread where we can dereference impl_.
+// Post a blocking task to the given function if we are not.
+#define POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD0(function) \
+  TASK_TO_ENSURE_IMPL_ON_THREAD0(PostBlockingTask, function)
+
+// Ensure that we are on the WebModule thread where we can dereference impl_.
+// Post a blocking task to the given function if we are not.
+#define POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(function, ...) \
+  TASK_TO_ENSURE_IMPL_ON_THREAD(PostBlockingTask, function, ##__VA_ARGS__)
 
 void WebModule::InjectOnScreenKeyboardInputEvent(
     base::Token type, const dom::InputEventInit& event) {
   TRACE_EVENT1("cobalt::browser",
                "WebModule::InjectOnScreenKeyboardInputEvent()", "type",
-               type.c_str());
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectOnScreenKeyboardInputEvent,
-                            base::Unretained(impl_.get()),
-                            scoped_refptr<dom::Element>(), type, event));
+               TRACE_STR_COPY(type.c_str()));
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectOnScreenKeyboardInputEvent, type, event);
+  impl_->InjectOnScreenKeyboardInputEvent(type, event);
 }
 
 void WebModule::InjectOnScreenKeyboardShownEvent(int ticket) {
   TRACE_EVENT1("cobalt::browser",
                "WebModule::InjectOnScreenKeyboardShownEvent()", "ticket",
                ticket);
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectOnScreenKeyboardShownEvent,
-                            base::Unretained(impl_.get()), ticket));
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectOnScreenKeyboardShownEvent, ticket);
+  impl_->InjectOnScreenKeyboardShownEvent(ticket);
 }
 
 void WebModule::InjectOnScreenKeyboardHiddenEvent(int ticket) {
   TRACE_EVENT1("cobalt::browser",
                "WebModule::InjectOnScreenKeyboardHiddenEvent()", "ticket",
                ticket);
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectOnScreenKeyboardHiddenEvent,
-                            base::Unretained(impl_.get()), ticket));
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectOnScreenKeyboardHiddenEvent, ticket);
+  impl_->InjectOnScreenKeyboardHiddenEvent(ticket);
 }
 
 void WebModule::InjectOnScreenKeyboardFocusedEvent(int ticket) {
   TRACE_EVENT1("cobalt::browser",
                "WebModule::InjectOnScreenKeyboardFocusedEvent()", "ticket",
                ticket);
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&WebModule::Impl::InjectOnScreenKeyboardFocusedEvent,
-                 base::Unretained(impl_.get()), ticket));
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectOnScreenKeyboardFocusedEvent, ticket);
+  impl_->InjectOnScreenKeyboardFocusedEvent(ticket);
 }
 
 void WebModule::InjectOnScreenKeyboardBlurredEvent(int ticket) {
   TRACE_EVENT1("cobalt::browser",
                "WebModule::InjectOnScreenKeyboardBlurredEvent()", "ticket",
                ticket);
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&WebModule::Impl::InjectOnScreenKeyboardBlurredEvent,
-                 base::Unretained(impl_.get()), ticket));
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectOnScreenKeyboardBlurredEvent, ticket);
+  impl_->InjectOnScreenKeyboardBlurredEvent(ticket);
 }
 
 void WebModule::InjectOnScreenKeyboardSuggestionsUpdatedEvent(int ticket) {
   TRACE_EVENT1("cobalt::browser",
                "WebModule::InjectOnScreenKeyboardSuggestionsUpdatedEvent()",
                "ticket", ticket);
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(
-          &WebModule::Impl::InjectOnScreenKeyboardSuggestionsUpdatedEvent,
-          base::Unretained(impl_.get()), ticket));
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectOnScreenKeyboardSuggestionsUpdatedEvent,
+                                ticket);
+  impl_->InjectOnScreenKeyboardSuggestionsUpdatedEvent(ticket);
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
+
 
 void WebModule::InjectKeyboardEvent(base::Token type,
                                     const dom::KeyboardEventInit& event) {
   TRACE_EVENT1("cobalt::browser", "WebModule::InjectKeyboardEvent()", "type",
-               type.c_str());
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectKeyboardEvent,
-                            base::Unretained(impl_.get()),
-                            scoped_refptr<dom::Element>(), type, event));
+               TRACE_STR_COPY(type.c_str()));
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectKeyboardEvent, type, event);
+  impl_->InjectKeyboardEvent(type, event);
 }
 
 void WebModule::InjectPointerEvent(base::Token type,
                                    const dom::PointerEventInit& event) {
   TRACE_EVENT1("cobalt::browser", "WebModule::InjectPointerEvent()", "type",
-               type.c_str());
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectPointerEvent,
-                            base::Unretained(impl_.get()),
-                            scoped_refptr<dom::Element>(), type, event));
+               TRACE_STR_COPY(type.c_str()));
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectPointerEvent, type, event);
+  impl_->InjectPointerEvent(type, event);
 }
 
 void WebModule::InjectWheelEvent(base::Token type,
                                  const dom::WheelEventInit& event) {
   TRACE_EVENT1("cobalt::browser", "WebModule::InjectWheelEvent()", "type",
-               type.c_str());
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectWheelEvent,
-                            base::Unretained(impl_.get()),
-                            scoped_refptr<dom::Element>(), type, event));
+               TRACE_STR_COPY(type.c_str()));
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectWheelEvent, type, event);
+  impl_->InjectWheelEvent(type, event);
 }
 
 void WebModule::InjectBeforeUnloadEvent() {
   TRACE_EVENT0("cobalt::browser", "WebModule::InjectBeforeUnloadEvent()");
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectBeforeUnloadEvent,
-                            base::Unretained(impl_.get())));
+  POST_TO_ENSURE_IMPL_ON_THREAD0(InjectBeforeUnloadEvent);
+  impl_->InjectBeforeUnloadEvent();
 }
 
 void WebModule::InjectCaptionSettingsChangedEvent() {
   TRACE_EVENT0("cobalt::browser",
                "WebModule::InjectCaptionSettingsChangedEvent()");
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectCaptionSettingsChangedEvent,
-                            base::Unretained(impl_.get())));
+  POST_TO_ENSURE_IMPL_ON_THREAD0(InjectCaptionSettingsChangedEvent);
+  impl_->InjectCaptionSettingsChangedEvent();
 }
 
 void WebModule::InjectWindowOnOnlineEvent(const base::Event* event) {
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectWindowOnOnlineEvent,
-                            base::Unretained(impl_.get())));
+  TRACE_EVENT0("cobalt::browser", "WebModule::InjectWindowOnOnlineEvent()");
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectWindowOnOnlineEvent, event);
+  impl_->InjectWindowOnOnlineEvent();
 }
 
 void WebModule::InjectWindowOnOfflineEvent(const base::Event* event) {
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::InjectWindowOnOfflineEvent,
-                            base::Unretained(impl_.get())));
+  TRACE_EVENT0("cobalt::browser", "WebModule::InjectWindowOnOfflineEvent()");
+  POST_TO_ENSURE_IMPL_ON_THREAD(InjectWindowOnOfflineEvent, event);
+  impl_->InjectWindowOnOfflineEvent();
 }
 
 void WebModule::UpdateDateTimeConfiguration() {
-  DCHECK(impl_);
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::UpdateDateTimeConfiguration,
-                            base::Unretained(impl_.get())));
+  TRACE_EVENT0("cobalt::browser", "WebModule::UpdateDateTimeConfiguration()");
+  POST_TO_ENSURE_IMPL_ON_THREAD0(UpdateDateTimeConfiguration);
+  impl_->UpdateDateTimeConfiguration();
 }
 
-std::string WebModule::ExecuteJavascript(
-    const std::string& script_utf8, const base::SourceLocation& script_location,
-    bool* out_succeeded) {
+void WebModule::ExecuteJavascript(const std::string& script_utf8,
+                                  const base::SourceLocation& script_location,
+                                  std::string* out_result,
+                                  bool* out_succeeded) {
   TRACE_EVENT0("cobalt::browser", "WebModule::ExecuteJavascript()");
-  DCHECK(message_loop());
-  DCHECK(impl_);
-
-  base::WaitableEvent got_result(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  std::string result;
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&WebModule::Impl::ExecuteJavascript,
-                 base::Unretained(impl_.get()), script_utf8, script_location,
-                 &got_result, &result, out_succeeded));
-  got_result.Wait();
-  return result;
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(ExecuteJavascript, script_utf8,
+                                          script_location, out_result,
+                                          out_succeeded);
+  impl_->ExecuteJavascript(script_utf8, script_location, out_result,
+                           out_succeeded);
 }
 
 void WebModule::ClearAllIntervalsAndTimeouts() {
   TRACE_EVENT0("cobalt::browser", "WebModule::ClearAllIntervalsAndTimeouts()");
-  DCHECK(message_loop());
-  DCHECK(impl_);
-
-  if (impl_) {
-    message_loop()->task_runner()->PostTask(
-        FROM_HERE, base::Bind(&WebModule::Impl::ClearAllIntervalsAndTimeouts,
-                              base::Unretained(impl_.get())));
-  }
+  POST_TO_ENSURE_IMPL_ON_THREAD0(ClearAllIntervalsAndTimeouts);
+  impl_->ClearAllIntervalsAndTimeouts();
 }
 
 #if defined(ENABLE_WEBDRIVER)
-std::unique_ptr<webdriver::WindowDriver> WebModule::CreateWindowDriver(
-    const webdriver::protocol::WindowId& window_id) {
-  DCHECK(message_loop());
-  DCHECK(impl_);
-
-  std::unique_ptr<webdriver::WindowDriver> window_driver;
-  message_loop()->task_runner()->PostBlockingTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::CreateWindowDriver,
-                            base::Unretained(impl_.get()), window_id,
-                            base::Unretained(&window_driver)));
-
-  return window_driver;
+void WebModule::CreateWindowDriver(
+    const webdriver::protocol::WindowId& window_id,
+    std::unique_ptr<webdriver::WindowDriver>* window_driver_out) {
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(CreateWindowDriver, window_id,
+                                          window_driver_out);
+  impl_->CreateWindowDriver(window_id, window_driver_out);
 }
 #endif  // defined(ENABLE_WEBDRIVER)
 
 #if defined(ENABLE_DEBUGGER)
 // May be called from any thread.
-debug::backend::DebugDispatcher* WebModule::GetDebugDispatcher() {
-  DCHECK(impl_);
-  return impl_->debug_dispatcher();
+void WebModule::GetDebugDispatcher(
+    debug::backend::DebugDispatcher** dispatcher) {
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(GetDebugDispatcher, dispatcher);
+  if (dispatcher) *dispatcher = impl_->debug_dispatcher();
 }
 
-std::unique_ptr<debug::backend::DebuggerState> WebModule::FreezeDebugger() {
-  DCHECK(message_loop());
-  DCHECK(impl_);
-
-  std::unique_ptr<debug::backend::DebuggerState> debugger_state;
-  message_loop()->task_runner()->PostBlockingTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::FreezeDebugger,
-                            base::Unretained(impl_.get()),
-                            base::Unretained(&debugger_state)));
-  return debugger_state;
+void WebModule::FreezeDebugger(
+    std::unique_ptr<debug::backend::DebuggerState>* debugger_state) {
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(FreezeDebugger, debugger_state);
+  impl_->FreezeDebugger(debugger_state);
 }
 #endif  // defined(ENABLE_DEBUGGER)
 
 void WebModule::SetSize(const ViewportSize& viewport_size) {
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::SetSize,
-                            base::Unretained(impl_.get()), viewport_size));
+  POST_TO_ENSURE_IMPL_ON_THREAD(SetSize, viewport_size);
+  impl_->SetSize(viewport_size);
 }
 
 void WebModule::UpdateCamera3D(
     const scoped_refptr<input::Camera3D>& camera_3d) {
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::UpdateCamera3D,
-                            base::Unretained(impl_.get()), camera_3d));
+  POST_TO_ENSURE_IMPL_ON_THREAD(UpdateCamera3D, camera_3d);
+  impl_->UpdateCamera3D(camera_3d);
 }
 
 void WebModule::SetMediaModule(media::MediaModule* media_module) {
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::SetMediaModule,
-                            base::Unretained(impl_.get()), media_module));
+  POST_TO_ENSURE_IMPL_ON_THREAD(SetMediaModule, media_module);
+  impl_->SetMediaModule(media_module);
 }
 
 void WebModule::SetImageCacheCapacity(int64_t bytes) {
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::SetImageCacheCapacity,
-                            base::Unretained(impl_.get()), bytes));
+  POST_TO_ENSURE_IMPL_ON_THREAD(SetImageCacheCapacity, bytes);
+  impl_->SetImageCacheCapacity(bytes);
 }
 
 void WebModule::SetRemoteTypefaceCacheCapacity(int64_t bytes) {
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::SetRemoteTypefaceCacheCapacity,
-                            base::Unretained(impl_.get()), bytes));
+  POST_TO_ENSURE_IMPL_ON_THREAD(SetRemoteTypefaceCacheCapacity, bytes);
+  impl_->SetRemoteTypefaceCacheCapacity(bytes);
 }
 
 void WebModule::Blur(SbTimeMonotonic timestamp) {
-  // Must only be called by a thread external from the WebModule thread.
-  DCHECK_NE(base::MessageLoop::current(), message_loop());
-
-  impl_->CancelSynchronousLoads();
-
-  auto impl_blur = base::Bind(&WebModule::Impl::Blur,
-                              base::Unretained(impl_.get()), timestamp);
-
+  synchronous_loader_interrupt_.Signal();
 #if defined(ENABLE_DEBUGGER)
   // We normally need to block here so that the call doesn't return until the
   // web application has had a chance to process the whole event. However, our
@@ -1709,151 +1601,116 @@
   // waiting for the debugger we post the pause task without blocking on it,
   // letting it eventually run when the debugger connects and the message loop
   // is unblocked again.
-  if (!impl_->IsFinishedWaitingForWebDebugger()) {
-    message_loop()->task_runner()->PostTask(FROM_HERE, impl_blur);
+  if (waiting_for_web_debugger_.load()) {
+    POST_TO_ENSURE_IMPL_ON_THREAD(Blur, timestamp);
+    impl_->Blur(timestamp);
     return;
   }
 #endif  // defined(ENABLE_DEBUGGER)
 
-  message_loop()->task_runner()->PostBlockingTask(FROM_HERE, impl_blur);
+  // We must block here so that the call doesn't return until the web
+  // application has had a chance to process the whole event.
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(Blur, timestamp);
+  impl_->Blur(timestamp);
 }
 
 void WebModule::Conceal(render_tree::ResourceProvider* resource_provider,
                         SbTimeMonotonic timestamp) {
-  // Must only be called by a thread external from the WebModule thread.
-  DCHECK_NE(base::MessageLoop::current(), message_loop());
-
-  impl_->CancelSynchronousLoads();
-
+  synchronous_loader_interrupt_.Signal();
   // We must block here so that the call doesn't return until the web
   // application has had a chance to process the whole event.
-  message_loop()->task_runner()->PostBlockingTask(
-      FROM_HERE,
-      base::Bind(&WebModule::Impl::Conceal, base::Unretained(impl_.get()),
-                 resource_provider, timestamp));
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(Conceal, resource_provider,
+                                          timestamp);
+  impl_->Conceal(resource_provider, timestamp);
 }
 
 void WebModule::Freeze(SbTimeMonotonic timestamp) {
-  // Must only be called by a thread external from the WebModule thread.
-  DCHECK_NE(base::MessageLoop::current(), message_loop());
-
   // We must block here so that the call doesn't return until the web
   // application has had a chance to process the whole event.
-  message_loop()->task_runner()->PostBlockingTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::Freeze,
-                            base::Unretained(impl_.get()), timestamp));
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(Freeze, timestamp);
+  impl_->Freeze(timestamp);
 }
 
 void WebModule::Unfreeze(render_tree::ResourceProvider* resource_provider,
                          SbTimeMonotonic timestamp) {
-  // Must only be called by a thread external from the WebModule thread.
-  DCHECK_NE(base::MessageLoop::current(), message_loop());
-
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&WebModule::Impl::Unfreeze, base::Unretained(impl_.get()),
-                 resource_provider, timestamp));
+  // We must block here so that the call doesn't return until the web
+  // application has had a chance to process the whole event.
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(Unfreeze, resource_provider,
+                                          timestamp);
+  impl_->Unfreeze(resource_provider, timestamp);
 }
 
 void WebModule::Reveal(render_tree::ResourceProvider* resource_provider,
                        SbTimeMonotonic timestamp) {
-  // Must only be called by a thread external from the WebModule thread.
-  DCHECK_NE(base::MessageLoop::current(), message_loop());
-
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&WebModule::Impl::Reveal, base::Unretained(impl_.get()),
-                 resource_provider, timestamp));
+  // We must block here so that the call doesn't return until the web
+  // application has had a chance to process the whole event.
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(Reveal, resource_provider, timestamp);
+  impl_->Reveal(resource_provider, timestamp);
 }
 
 void WebModule::Focus(SbTimeMonotonic timestamp) {
-  // Must only be called by a thread external from the WebModule thread.
-  DCHECK_NE(base::MessageLoop::current(), message_loop());
-
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::Focus,
-                            base::Unretained(impl_.get()), timestamp));
+  // We must block here so that the call doesn't return until the web
+  // application has had a chance to process the whole event.
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(Focus, timestamp);
+  impl_->Focus(timestamp);
 }
 
 void WebModule::ReduceMemory() {
-  // Must only be called by a thread external from the WebModule thread.
-  DCHECK_NE(base::MessageLoop::current(), message_loop());
-
-  impl_->CancelSynchronousLoads();
-
-  // We block here so that we block the Low Memory event handler until we have
-  // reduced our memory consumption.
-  message_loop()->task_runner()->PostBlockingTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::ReduceMemory,
-                            base::Unretained(impl_.get())));
+  synchronous_loader_interrupt_.Signal();
+  // We must block here so that the call doesn't return until the web
+  // application has had a chance to process the whole event.
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD0(ReduceMemory);
+  impl_->ReduceMemory();
 }
 
 void WebModule::RequestJavaScriptHeapStatistics(
-    const JavaScriptHeapStatisticsCallback& callback) {
-  // Must only be called by a thread external from the WebModule thread.
-  DCHECK_NE(base::MessageLoop::current(), message_loop());
+    const web::Agent::JavaScriptHeapStatisticsCallback& callback) {
+  web_agent_->RequestJavaScriptHeapStatistics(callback);
+}
 
-  message_loop()->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&WebModule::Impl::GetJavaScriptHeapStatistics,
-                            base::Unretained(impl_.get()), callback));
+void WebModule::GetIsReadyToFreeze(volatile bool* is_ready_to_freeze) {
+  // We must block here so that the call doesn't return until the thread
+  // has had a chance to fill in the return value.
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(GetIsReadyToFreeze,
+                                          is_ready_to_freeze);
+  impl_->IsReadyToFreeze(is_ready_to_freeze);
 }
 
 bool WebModule::IsReadyToFreeze() {
-  DCHECK_NE(base::MessageLoop::current(), message_loop());
-
   volatile bool is_ready_to_freeze = false;
-  message_loop()->task_runner()->PostBlockingTask(
-      FROM_HERE,
-      base::Bind(&WebModule::Impl::IsReadyToFreeze,
-                 base::Unretained(impl_.get()), &is_ready_to_freeze));
+  GetIsReadyToFreeze(&is_ready_to_freeze);
   return is_ready_to_freeze;
 }
 
-scoped_refptr<render_tree::Node>
-WebModule::DoSynchronousLayoutAndGetRenderTree() {
+void WebModule::DoSynchronousLayoutAndGetRenderTree(
+    scoped_refptr<render_tree::Node>* render_tree) {
   TRACE_EVENT0("cobalt::browser",
                "WebModule::DoSynchronousLayoutAndGetRenderTree()");
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  scoped_refptr<render_tree::Node> render_tree;
-  if (base::MessageLoop::current() != message_loop()) {
-    message_loop()->task_runner()->PostBlockingTask(
-        FROM_HERE,
-        base::Bind(&WebModule::Impl::DoSynchronousLayoutAndGetRenderTree,
-                   base::Unretained(impl_.get()), &render_tree));
-  } else {
-    impl_->DoSynchronousLayoutAndGetRenderTree(&render_tree);
-  }
-  return render_tree;
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(DoSynchronousLayoutAndGetRenderTree,
+                                          render_tree);
+  impl_->DoSynchronousLayoutAndGetRenderTree(render_tree);
 }
 
 void WebModule::SetApplicationStartOrPreloadTimestamp(
     bool is_preload, SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser",
                "WebModule::SetApplicationStartOrPreloadTimestamp()");
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  if (base::MessageLoop::current() != message_loop()) {
-    message_loop()->task_runner()->PostBlockingTask(
-        FROM_HERE,
-        base::Bind(&WebModule::Impl::SetApplicationStartOrPreloadTimestamp,
-                   base::Unretained(impl_.get()), is_preload, timestamp));
-  } else {
-    impl_->SetApplicationStartOrPreloadTimestamp(is_preload, timestamp);
-  }
+  POST_TO_ENSURE_IMPL_ON_THREAD(SetApplicationStartOrPreloadTimestamp,
+                                is_preload, timestamp);
+  impl_->SetApplicationStartOrPreloadTimestamp(is_preload, timestamp);
 }
 
 void WebModule::SetDeepLinkTimestamp(SbTimeMonotonic timestamp) {
   TRACE_EVENT0("cobalt::browser", "WebModule::SetDeepLinkTimestamp()");
-  DCHECK(message_loop());
-  DCHECK(impl_);
-  if (base::MessageLoop::current() != message_loop()) {
-    message_loop()->task_runner()->PostBlockingTask(
-        FROM_HERE, base::Bind(&WebModule::Impl::SetDeepLinkTimestamp,
-                              base::Unretained(impl_.get()), timestamp));
-  } else {
-    impl_->SetDeepLinkTimestamp(timestamp);
-  }
+  POST_AND_BLOCK_TO_ENSURE_IMPL_ON_THREAD(SetDeepLinkTimestamp, timestamp);
+  impl_->SetDeepLinkTimestamp(timestamp);
+}
+
+void WebModule::SetUnloadEventTimingInfo(base::TimeTicks start_time,
+                                         base::TimeTicks end_time) {
+  TRACE_EVENT0("cobalt::browser", "WebModule::SetUnloadEventTimingInfo()");
+  POST_TO_ENSURE_IMPL_ON_THREAD(SetUnloadEventTimingInfo, start_time, end_time);
+  impl_->SetUnloadEventTimingInfo(start_time, end_time);
 }
 
 }  // namespace browser
diff --git a/cobalt/browser/web_module.h b/cobalt/browser/web_module.h
index 2ed326d..4c42f19 100644
--- a/cobalt/browser/web_module.h
+++ b/cobalt/browser/web_module.h
@@ -21,7 +21,6 @@
 
 #include "base/callback.h"
 #include "base/containers/hash_tables.h"
-#include "base/files/file_path.h"
 #include "base/message_loop/message_loop.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread.h"
@@ -52,14 +51,14 @@
 #include "cobalt/math/size.h"
 #include "cobalt/media/can_play_type_handler.h"
 #include "cobalt/media/media_module.h"
-#include "cobalt/network/network_module.h"
 #include "cobalt/render_tree/node.h"
 #include "cobalt/render_tree/resource_provider.h"
-#include "cobalt/script/global_environment.h"
-#include "cobalt/script/javascript_engine.h"
-#include "cobalt/script/script_runner.h"
 #include "cobalt/ui_navigation/nav_item.h"
+#include "cobalt/web/agent.h"
+#include "cobalt/web/context.h"
 #include "cobalt/webdriver/session_driver.h"
+#include "cobalt/worker/service_worker_jobs.h"
+#include "starboard/atomic.h"
 #include "url/gurl.h"
 
 #if defined(ENABLE_DEBUGGER)
@@ -88,34 +87,21 @@
 // This necessarily implies that details contained within WebModule, such as the
 // DOM, are intentionally kept private, since these structures expect to be
 // accessed from only one thread.
-class WebModule : public LifecycleObserver {
+class WebModule : public base::MessageLoop::DestructionObserver,
+                  public LifecycleObserver {
  public:
   struct Options {
-    typedef base::Callback<scoped_refptr<script::Wrappable>(
-        const scoped_refptr<dom::Window>& window,
-        script::GlobalEnvironment* global_environment)>
-        CreateObjectFunction;
-    typedef base::hash_map<std::string, CreateObjectFunction>
-        InjectedWindowAttributes;
-
     // All optional parameters defined in this structure should have their
     // values initialized in the default constructor to useful defaults.
-    Options();
+    explicit Options(const std::string& name);
 
-    // The name of the WebModule.  This is useful for debugging purposes as in
-    // the case where multiple WebModule objects exist, it can be used to
-    // differentiate which objects belong to which WebModule.  It is used
-    // to name some CVals.
-    std::string name;
+    web::Agent::Options web_options;
 
     // The LayoutTrigger parameter dictates when a layout should be triggered.
     // Tests will often set this up so that layouts are only performed when
     // we specifically request them to be.
     layout::LayoutManager::LayoutTrigger layout_trigger;
 
-    // Optional directory to add to the search path for web files (file://).
-    base::FilePath extra_web_file_dir;
-
     // The navigation_callback functor will be called when JavaScript internal
     // to the WebModule requests a page navigation, e.g. by modifying
     // 'window.location.href'.
@@ -124,11 +110,6 @@
     // A list of callbacks to be called once the web page finishes loading.
     std::vector<base::Closure> loaded_callbacks;
 
-    // injected_window_attributes contains a map of attributes to be injected
-    // into the WebModule's window object upon construction.  This provides
-    // a mechanism to inject custom APIs into the WebModule object.
-    InjectedWindowAttributes injected_window_attributes;
-
     // Options to customize DOMSettings.
     dom::DOMSettings::Options dom_settings_options;
 
@@ -155,7 +136,7 @@
     int remote_typeface_cache_capacity = 4 * 1024 * 1024;
 
     // Mesh cache capacity in bytes.
-    int mesh_cache_capacity;
+    int mesh_cache_capacity = 0;
 
     // Whether map-to-mesh is enabled.
     bool enable_map_to_mesh = true;
@@ -175,11 +156,6 @@
     // help for platforms that are low on image memory while playing a video.
     float image_cache_capacity_multiplier_when_playing_video = 1.0f;
 
-    // Specifies the priority of the web module's thread.  This is the thread
-    // that is responsible for executing JavaScript, managing the DOM, and
-    // performing layouts.  The default value is base::ThreadPriority::NORMAL.
-    base::ThreadPriority thread_priority = base::ThreadPriority::NORMAL;
-
     // Specifies the priority that the web module's corresponding loader thread
     // will be assigned.  This is the thread responsible for performing resource
     // decoding, such as image decoding.  The default value is
@@ -197,8 +173,6 @@
     // To support 3D camera movements.
     scoped_refptr<input::Camera3D> camera_3d;
 
-    script::JavaScriptEngine::Options javascript_engine_options;
-
     // The video playback rate will be multiplied with the following value.  Its
     // default value is 1.0.
     float video_playback_rate_multiplier = 1.f;
@@ -212,7 +186,7 @@
     bool should_retain_remote_typeface_cache_on_freeze = false;
 
     // The splash screen cache object, owned by the BrowserModule.
-    SplashScreenCache* splash_screen_cache;
+    SplashScreenCache* splash_screen_cache = nullptr;
 
     // The beforeunload event can give a web page a chance to shut
     // itself down softly and ultimately call window.close(), however
@@ -222,12 +196,8 @@
     // no window.close() call pending.
     base::Closure on_before_unload_fired_but_not_handled;
 
-    // Whether or not the WebModule is allowed to fetch from cache via
-    // h5vcc-cache://.
-    bool can_fetch_cache = false;
-
     // The dom::OnScreenKeyboard forwards calls to this interface.
-    dom::OnScreenKeyboardBridge* on_screen_keyboard_bridge = NULL;
+    dom::OnScreenKeyboardBridge* on_screen_keyboard_bridge = nullptr;
 
     // This function takes in a render tree as input, and then calls the 2nd
     // argument (which is another callback) when the screenshot is available.
@@ -252,11 +222,6 @@
     // can allow the limit to be disabled.
     bool limit_performance_timer_resolution = true;
 
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-    // Whether layout is optimized to re-use boxes for still-valid elements.
-    bool enable_partial_layout = true;
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
 #if defined(ENABLE_DEBUGGER)
     // Whether the debugger should block until remote devtools connects.
     bool wait_for_web_debugger = false;
@@ -271,6 +236,11 @@
     // there is no playback during Concealed state, we should provide a chance
     // for Cobalt to freeze.
     base::Closure maybe_freeze_callback;
+
+    // This callback is for collecting previous document unload event start/end
+    // time.
+    base::Callback<void(base::TimeTicks, base::TimeTicks)>
+        collect_unload_event_time_callback;
   };
 
   typedef layout::LayoutManager::LayoutResults LayoutResults;
@@ -278,24 +248,22 @@
       OnRenderTreeProducedCallback;
   typedef base::Callback<void(const GURL&, const std::string&)> OnErrorCallback;
   typedef dom::Window::CloseCallback CloseCallback;
-  typedef base::Callback<void(const script::HeapStatistics&)>
-      JavaScriptHeapStatisticsCallback;
 
   WebModule(const GURL& initial_url,
             base::ApplicationState initial_application_state,
             const OnRenderTreeProducedCallback& render_tree_produced_callback,
-            const OnErrorCallback& error_callback,
+            OnErrorCallback error_callback,
             const CloseCallback& window_close_callback,
             const base::Closure& window_minimize_callback,
             media::CanPlayTypeHandler* can_play_type_handler,
             media::MediaModule* media_module,
-            network::NetworkModule* network_module,
             const cssom::ViewportSize& window_dimensions,
             render_tree::ResourceProvider* resource_provider,
-            float layout_refresh_rate, const Options& options);
+            float layout_refresh_rate,
+            worker::ServiceWorkerJobs* service_worker_jobs,
+            const Options& options);
   ~WebModule();
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   // Injects an on screen keyboard input event into the web module. The value
   // for type represents beforeinput or input.
   void InjectOnScreenKeyboardInputEvent(base::Token type,
@@ -311,8 +279,6 @@
   // Injects an on screen keyboard suggestions updated event into the web
   // module.
   void InjectOnScreenKeyboardSuggestionsUpdatedEvent(int ticket);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
   void InjectWindowOnOnlineEvent(const base::Event* event);
   void InjectWindowOnOfflineEvent(const base::Event* event);
@@ -343,26 +309,29 @@
   // Executes Javascript code in this web module.  The calling thread will
   // block until the JavaScript has executed and the output results are
   // available.
-  std::string ExecuteJavascript(const std::string& script_utf8,
-                                const base::SourceLocation& script_location,
-                                bool* out_succeeded);
+  void ExecuteJavascript(const std::string& script_utf8,
+                         const base::SourceLocation& script_location,
+                         std::string* out_result = nullptr,
+                         bool* out_succeeded = nullptr);
 
 #if defined(ENABLE_WEBDRIVER)
   // Creates a new webdriver::WindowDriver that interacts with the Window that
   // is owned by this WebModule instance.
-  std::unique_ptr<webdriver::WindowDriver> CreateWindowDriver(
-      const webdriver::protocol::WindowId& window_id);
+  void CreateWindowDriver(
+      const webdriver::protocol::WindowId& window_id,
+      std::unique_ptr<webdriver::WindowDriver>* window_driver_out);
 #endif
 
 #if defined(ENABLE_DEBUGGER)
   // Gets a reference to the debug dispatcher that interacts with this web
   // module. The debug dispatcher is part of the debug module owned by this web
   // module, which is lazily created by this function if necessary.
-  debug::backend::DebugDispatcher* GetDebugDispatcher();
+  void GetDebugDispatcher(debug::backend::DebugDispatcher** dispatcher);
 
   // Moves the debugger state out of this WebModule prior to navigating so that
   // it can be restored in the new WebModule after the navigation.
-  std::unique_ptr<debug::backend::DebuggerState> FreezeDebugger();
+  void FreezeDebugger(
+      std::unique_ptr<debug::backend::DebuggerState>* debugger_state);
 #endif  // ENABLE_DEBUGGER
 
   // Sets the size of this web module, possibly causing relayout and re-render
@@ -402,36 +371,48 @@
   // thread.  It is the responsibility of |callback| to get back to its
   // intended thread should it want to.
   void RequestJavaScriptHeapStatistics(
-      const JavaScriptHeapStatisticsCallback& callback);
+      const web::Agent::JavaScriptHeapStatisticsCallback& callback);
 
   // Indicate the web module is ready to freeze.
   bool IsReadyToFreeze();
 
-  scoped_refptr<render_tree::Node> DoSynchronousLayoutAndGetRenderTree();
+  void DoSynchronousLayoutAndGetRenderTree(
+      scoped_refptr<render_tree::Node>* render_tree = nullptr);
 
+  // Pass the application preload or start timestamps from Starboard.
   void SetApplicationStartOrPreloadTimestamp(bool is_preload,
                                              SbTimeMonotonic timestamp);
   void SetDeepLinkTimestamp(SbTimeMonotonic timestamp);
 
+  // From base::MessageLoop::DestructionObserver.
+  void WillDestroyCurrentMessageLoop() override;
+
+  // Set document's load timing info's unload event start/end time.
+  void SetUnloadEventTimingInfo(base::TimeTicks start_time,
+                                base::TimeTicks end_time);
+
  private:
   // Data required to construct a WebModule, initialized in the constructor and
   // passed to |Initialize|.
   struct ConstructionData {
-    ConstructionData(
-        const GURL& initial_url,
-        base::ApplicationState initial_application_state,
-        const OnRenderTreeProducedCallback& render_tree_produced_callback,
-        const OnErrorCallback& error_callback,
-        const CloseCallback& window_close_callback,
-        const base::Closure& window_minimize_callback,
-        media::CanPlayTypeHandler* can_play_type_handler,
-        media::MediaModule* media_module,
-        network::NetworkModule* network_module,
-        const cssom::ViewportSize& window_dimensions,
-        render_tree::ResourceProvider* resource_provider,
-        int dom_max_element_depth, float layout_refresh_rate,
-        const scoped_refptr<ui_navigation::NavItem>& ui_nav_root,
-        const Options& options)
+    ConstructionData(const GURL& initial_url,
+                     base::ApplicationState initial_application_state,
+                     OnRenderTreeProducedCallback render_tree_produced_callback,
+                     const OnErrorCallback& error_callback,
+                     CloseCallback window_close_callback,
+                     base::Closure window_minimize_callback,
+                     media::CanPlayTypeHandler* can_play_type_handler,
+                     media::MediaModule* media_module,
+                     const cssom::ViewportSize& window_dimensions,
+                     render_tree::ResourceProvider* resource_provider,
+                     int dom_max_element_depth, float layout_refresh_rate,
+                     const scoped_refptr<ui_navigation::NavItem>& ui_nav_root,
+#if defined(ENABLE_DEBUGGER)
+                     starboard::atomic_bool* waiting_for_web_debugger,
+#endif  // defined(ENABLE_DEBUGGER)
+                     base::WaitableEvent* synchronous_loader_interrupt,
+                     worker::ServiceWorkerJobs* service_worker_jobs,
+                     const Options& options)
         : initial_url(initial_url),
           initial_application_state(initial_application_state),
           render_tree_produced_callback(render_tree_produced_callback),
@@ -440,67 +421,84 @@
           window_minimize_callback(window_minimize_callback),
           can_play_type_handler(can_play_type_handler),
           media_module(media_module),
-          network_module(network_module),
           window_dimensions(window_dimensions),
           resource_provider(resource_provider),
           dom_max_element_depth(dom_max_element_depth),
           layout_refresh_rate(layout_refresh_rate),
           ui_nav_root(ui_nav_root),
-          options(options) {}
+#if defined(ENABLE_DEBUGGER)
+          waiting_for_web_debugger(waiting_for_web_debugger),
+#endif  // defined(ENABLE_DEBUGGER)
+          synchronous_loader_interrupt(synchronous_loader_interrupt),
+          service_worker_jobs(service_worker_jobs),
+          options(options) {
+    }
 
     GURL initial_url;
     base::ApplicationState initial_application_state;
     OnRenderTreeProducedCallback render_tree_produced_callback;
     OnErrorCallback error_callback;
-    const CloseCallback& window_close_callback;
-    const base::Closure& window_minimize_callback;
+    CloseCallback window_close_callback;
+    base::Closure window_minimize_callback;
     media::CanPlayTypeHandler* can_play_type_handler;
     media::MediaModule* media_module;
-    network::NetworkModule* network_module;
     cssom::ViewportSize window_dimensions;
     render_tree::ResourceProvider* resource_provider;
     int dom_max_element_depth;
     float layout_refresh_rate;
     scoped_refptr<ui_navigation::NavItem> ui_nav_root;
+#if defined(ENABLE_DEBUGGER)
+    starboard::atomic_bool* waiting_for_web_debugger;
+#endif  // defined(ENABLE_DEBUGGER)
+    base::WaitableEvent* synchronous_loader_interrupt;
+    worker::ServiceWorkerJobs* service_worker_jobs;
     Options options;
   };
 
   // Forward declaration of the private implementation class.
   class Impl;
 
-  // Destruction observer used to safely tear down this WebModule after the
-  // thread has been stopped.
-  class DestructionObserver : public base::MessageLoop::DestructionObserver {
-   public:
-    explicit DestructionObserver(WebModule* web_module);
-    void WillDestroyCurrentMessageLoop() override;
-
-   private:
-    WebModule* web_module_;
-  };
-
   // Called by the constructor to create the private implementation object and
   // perform any other initialization required on the dedicated thread.
-  void Initialize(const ConstructionData& data);
+  void Initialize(const ConstructionData& data, web::Context* context);
 
   void ClearAllIntervalsAndTimeouts();
 
   void CancelSynchronousLoads();
 
+  void GetIsReadyToFreeze(volatile bool* is_ready_to_freeze);
+
   // The message loop this object is running on.
-  base::MessageLoop* message_loop() const { return thread_.message_loop(); }
+  base::MessageLoop* message_loop() const {
+    DCHECK(web_agent_);
+    return web_agent_->message_loop();
+  }
 
   // Private implementation object.
   std::unique_ptr<Impl> impl_;
 
-  // The thread created and owned by this WebModule.
-  // All sub-objects of this object are created on this thread, and all public
-  // member functions are re-posted to this thread if necessary.
-  base::Thread thread_;
+  web::Agent* web_agent() const { return web_agent_.get(); }
+
+  // The Web Agent.
+  std::unique_ptr<web::Agent> web_agent_;
 
   // This is the root UI navigation container which contains all active UI
   // navigation items created by this web module.
   scoped_refptr<ui_navigation::NavItem> ui_nav_root_;
+
+#if defined(ENABLE_DEBUGGER)
+  // Used to avoid a deadlock when running |Blur| while waiting for the web
+  // debugger to connect. Initializes to false.
+  starboard::atomic_bool waiting_for_web_debugger_;
+#endif  // defined(ENABLE_DEBUGGER)
+
+  // This event is used to interrupt the loader when JavaScript is loaded
+  // synchronously.  It is manually reset so that events like Freeze can be
+  // correctly execute, even if there are multiple synchronous loads in queue
+  // before the freeze (or other) event handlers.
+  base::WaitableEvent synchronous_loader_interrupt_ = {
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      base::WaitableEvent::InitialState::NOT_SIGNALED};
 };
 
 }  // namespace browser
diff --git a/cobalt/browser/webapi_extension.h b/cobalt/browser/webapi_extension.h
deleted file mode 100644
index 433f8f3..0000000
--- a/cobalt/browser/webapi_extension.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_BROWSER_WEBAPI_EXTENSION_H_
-#define COBALT_BROWSER_WEBAPI_EXTENSION_H_
-
-#include <string>
-
-#include "base/memory/ref_counted.h"
-#include "base/optional.h"
-#include "cobalt/dom/window.h"
-#include "cobalt/script/global_environment.h"
-#include "cobalt/script/wrappable.h"
-
-#if SB_API_VERSION < 12
-
-namespace cobalt {
-namespace browser {
-
-// This file declares the interface that Cobalt calls in order to possibly
-// inject external functionality into the web app's JavaScript environment.
-// See cobalt/doc/webapi_extension.md for more information.
-
-// The implementation of this function should return the name of the property
-// to be injected into to the JavaScript window object.  If base::nullopt is
-// returned, then CreateWebExtensionObject() will not be subsequently called
-// and nothing will be injected.
-base::Optional<std::string> GetWebAPIExtensionObjectPropertyName();
-
-// The actual object that will be assigned to the window property with name
-// given by *GetWebExtensionObjectPropertyName().  The returned object should
-// be specified by an IDL interface.  It is passed a reference to |window|
-// so that it can access and introspect any properties of the window object.
-// It is passed |global_environment| so that it can access functions of the
-// GlobalEnvironment interface, such as using it to execute arbitrary
-// JavaScript.
-scoped_refptr<script::Wrappable> CreateWebAPIExtensionObject(
-    const scoped_refptr<dom::Window>& window,
-    script::GlobalEnvironment* global_environment);
-
-}  // namespace browser
-}  // namespace cobalt
-
-#if defined(COBALT_WEBAPI_EXTENSION_DEFINED)
-#pragma message( \
-  "Web Extension support is deprecated. Please migrate to Platform Services " \
-  "(cobalt/doc/platform_services.md).")
-#endif
-
-#elif defined(COBALT_WEBAPI_EXTENSION_DEFINED)
-
-#error \
-  "Web Extension support has been deprecated. Please use Platform Services " \
-  "(cobalt/doc/platform_services.md) instead."
-
-#endif  // SB_API_VERSION < 12
-
-#endif  // COBALT_BROWSER_WEBAPI_EXTENSION_H_
diff --git a/cobalt/build/_env.py b/cobalt/build/_env.py
deleted file mode 100644
index 332eabc..0000000
--- a/cobalt/build/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source  # pylint: disable=deprecated-module
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print('%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV))
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/build/all.gyp b/cobalt/build/all.gyp
deleted file mode 100644
index 080b70a..0000000
--- a/cobalt/build/all.gyp
+++ /dev/null
@@ -1,141 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file contains all targets that should be created by gyp_cobalt by
-# default.
-
-{
-  'targets': [
-    {
-      'target_name': 'Default',
-      'default_project': 1,
-      'type': 'none',
-      'dependencies': [
-        '<(DEPTH)/cobalt/browser/cobalt.gyp:cobalt',
-      ],
-    },
-
-    {
-      'target_name': 'All',
-      'type': 'none',
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base_unittests_deploy',
-        '<(DEPTH)/cobalt/audio/audio.gyp:*',
-        '<(DEPTH)/cobalt/audio/audio_test.gyp:*',
-        '<(DEPTH)/cobalt/base/base.gyp:*',
-        '<(DEPTH)/cobalt/bindings/testing/testing.gyp:*',
-        '<(DEPTH)/cobalt/browser/browser.gyp:*',
-        '<(DEPTH)/cobalt/browser/cobalt.gyp:*',
-        '<(DEPTH)/cobalt/csp/csp.gyp:*',
-        '<(DEPTH)/cobalt/css_parser/css_parser.gyp:*',
-        '<(DEPTH)/cobalt/cssom/cssom.gyp:*',
-        '<(DEPTH)/cobalt/cssom/cssom_test.gyp:*',
-        '<(DEPTH)/cobalt/dom/dom.gyp:*',
-        '<(DEPTH)/cobalt/dom/dom_test.gyp:*',
-        '<(DEPTH)/cobalt/dom/testing/dom_testing.gyp:*',
-        '<(DEPTH)/cobalt/dom_parser/dom_parser.gyp:*',
-        '<(DEPTH)/cobalt/dom_parser/dom_parser_test.gyp:*',
-        '<(DEPTH)/cobalt/encoding/encoding.gyp:*',
-        '<(DEPTH)/cobalt/encoding/encoding_test.gyp:*',
-        '<(DEPTH)/cobalt/extension/extension.gyp:*',
-        '<(DEPTH)/cobalt/h5vcc/h5vcc.gyp:*',
-        '<(DEPTH)/cobalt/input/input.gyp:*',
-        '<(DEPTH)/cobalt/layout/layout.gyp:*',
-        '<(DEPTH)/cobalt/layout_tests/layout_tests.gyp:*',
-        '<(DEPTH)/cobalt/loader/image/sandbox/sandbox.gyp:*',
-        '<(DEPTH)/cobalt/loader/loader.gyp:*',
-        '<(DEPTH)/cobalt/loader/origin.gyp:*',
-        '<(DEPTH)/cobalt/math/math.gyp:*',
-        '<(DEPTH)/cobalt/media/media.gyp:*',
-        '<(DEPTH)/cobalt/media/sandbox/sandbox.gyp:*',
-        '<(DEPTH)/cobalt/media_capture/media_capture.gyp:*',
-        '<(DEPTH)/cobalt/media_capture/media_capture_test.gyp:*',
-        '<(DEPTH)/cobalt/media_session/media_session.gyp:*',
-        '<(DEPTH)/cobalt/media_session/media_session_test.gyp:*',
-        '<(DEPTH)/cobalt/media_stream/media_stream.gyp:*',
-        '<(DEPTH)/cobalt/media_stream/media_stream_test.gyp:*',
-        '<(DEPTH)/cobalt/network/network.gyp:*',
-        '<(DEPTH)/cobalt/overlay_info/overlay_info.gyp:*',
-        '<(DEPTH)/cobalt/render_tree/render_tree.gyp:*',
-        '<(DEPTH)/cobalt/renderer/backend/backend.gyp:graphics_system_test_deploy',
-        '<(DEPTH)/cobalt/renderer/renderer.gyp:*',
-        '<(DEPTH)/cobalt/renderer/sandbox/sandbox.gyp:*',
-        '<(DEPTH)/cobalt/samples/simple_example/simple_example.gyp:*',
-        '<(DEPTH)/cobalt/script/engine.gyp:engine_shell',
-        '<(DEPTH)/cobalt/script/script.gyp:*',
-        '<(DEPTH)/cobalt/speech/sandbox/sandbox.gyp:*',
-        '<(DEPTH)/cobalt/speech/speech.gyp:*',
-        '<(DEPTH)/cobalt/storage/storage.gyp:*',
-        '<(DEPTH)/cobalt/storage/store/store.gyp:*',
-        '<(DEPTH)/cobalt/trace_event/trace_event.gyp:*',
-        '<(DEPTH)/cobalt/web_animations/web_animations.gyp:*',
-        '<(DEPTH)/cobalt/webdriver/webdriver.gyp:*',
-        '<(DEPTH)/cobalt/webdriver/webdriver_test.gyp:*',
-        '<(DEPTH)/cobalt/websocket/websocket.gyp:*',
-        '<(DEPTH)/cobalt/worker/worker.gyp:*',
-        '<(DEPTH)/cobalt/xhr/xhr.gyp:*',
-        '<(DEPTH)/crypto/crypto.gyp:crypto_unittests_deploy',
-        '<(DEPTH)/third_party/boringssl/boringssl_tool.gyp:*',
-        '<(DEPTH)/third_party/zlib/zlib.gyp:zip_unittests_deploy',
-        '<(DEPTH)/net/net.gyp:net_unittests_deploy',
-        '<(DEPTH)/starboard/client_porting/cwrappers/cwrappers_test.gyp:cwrappers_test_deploy',
-        '<(DEPTH)/starboard/common/common_test.gyp:common_test_deploy',
-        '<(DEPTH)/starboard/elf_loader/elf_loader.gyp:elf_loader_test_deploy',
-        '<(DEPTH)/starboard/loader_app/loader_app.gyp:loader_app_tests_deploy',
-        '<(DEPTH)/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp:nplb_evergreen_compat_tests_deploy',
-      ],
-      'conditions': [
-        ['sb_evergreen != 1', {
-          'dependencies': [
-            '<!@pymod_do_main(starboard.optional.get_optional_tests -g -d <(DEPTH))',
-          ],
-        }],
-        ['OS=="starboard"', {
-          'dependencies': [
-            '<(DEPTH)/nb/nb_test.gyp:nb_test_deploy',
-            '<(DEPTH)/nb/nb_test.gyp:reuse_allocator_benchmark',
-            '<(DEPTH)/starboard/starboard_all.gyp:starboard_all',
-          ],
-        }],
-        ['sb_evergreen==1', {
-          'dependencies': [
-            '<(DEPTH)/cobalt/updater/one_app_only_sandbox.gyp:*',
-            '<(DEPTH)/components/update_client/update_client.gyp:cobalt_slot_management_test_deploy',
-            '<(DEPTH)/third_party/musl/musl.gyp:musl_unittests',
-            '<(DEPTH)/starboard/loader_app/installation_manager.gyp:*',
-          ],
-        }],
-        ['sb_evergreen_compatible==1', {
-          'dependencies': [
-            '<(DEPTH)/third_party/crashpad/handler/handler.gyp:crashpad_handler',
-          ],
-        }],
-      ],
-    },
-  ],
-  'conditions': [
-    ['OS=="starboard"', {
-      'targets': [
-        {
-          # Subset of targets for a platform whose port is in progress.
-          'target_name': 'in_progress_targets',
-          'type': 'none',
-          'dependencies': [
-            '<(DEPTH)/cobalt/browser/cobalt.gyp:cobalt',
-          ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/cobalt/build/build_id.py b/cobalt/build/build_id.py
index 006e65c..a2f2ed3 100755
--- a/cobalt/build/build_id.py
+++ b/cobalt/build/build_id.py
@@ -11,7 +11,6 @@
 # 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.
-
 """Generate a Cobalt build ID header."""
 
 import datetime
@@ -37,7 +36,7 @@
 
   Args:
     output_path: Location of the build id header to write.
-    version_number: Build version number, generated when gyp_cobalt is run.
+    version_number: Build version number, generated when gn gen is run.
   Returns:
     0 on success.
   """
@@ -48,11 +47,12 @@
   date_rep = datetime.datetime.fromtimestamp(timestamp).strftime('%c')
 
   with open(output_path, 'w') as f:
-    f.write(template.format(
-        date_rep=date_rep,
-        timestamp=int(timestamp),
-        version_number=version_number,
-        username=username))
+    f.write(
+        template.format(
+            date_rep=date_rep,
+            timestamp=int(timestamp),
+            version_number=version_number,
+            username=username))
   return 0
 
 
diff --git a/cobalt/build/build_number.py b/cobalt/build/build_number.py
new file mode 100644
index 0000000..b0307e3
--- /dev/null
+++ b/cobalt/build/build_number.py
@@ -0,0 +1,123 @@
+# Copyright 2012 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Utilities for use by gyp_cobalt and other build tools."""
+
+import json
+import logging
+import os
+import subprocess
+from six.moves import urllib
+from cobalt.tools import paths
+
+_SUBREPO_PATHS = ['starboard/keyboxes']
+_VERSION_SERVER_URL = 'https://carbon-airlock-95823.appspot.com/build_version/generate'  # pylint:disable=line-too-long
+_XSSI_PREFIX = ")]}'\n"
+
+# The path to the build.id file that preserves a build ID.
+BUILD_ID_PATH = os.path.join(paths.BUILD_ROOT, 'build.id')
+
+
+def CheckRevInfo(key, cwd=None):
+  git_get_remote_args = ['git', 'config', '--get', 'remote.origin.url']
+  remote = subprocess.check_output(
+      git_get_remote_args, cwd=cwd).strip().decode('utf-8')
+
+  if remote.endswith('.git'):
+    remote = remote[:-len('.git')]
+
+  git_get_revision_args = ['git', 'rev-parse', 'HEAD']
+  revision = subprocess.check_output(
+      git_get_revision_args, cwd=cwd).strip().decode('utf-8')
+  return {key: '{}@{}'.format(remote, revision)}
+
+
+def GetRevinfo():
+  """Get absolute state of all git repos."""
+  try:
+    repo_root = subprocess.check_output(['git', 'rev-parse', '--show-toplevel'
+                                        ]).strip().decode('utf-8')
+  except subprocess.CalledProcessError:
+    logging.info('Could not get repo root. Trying again in src/')
+    try:
+      repo_root = subprocess.check_output(
+          ['git', '-C', 'src', 'rev-parse',
+           '--show-toplevel']).strip().decode('utf-8')
+    except subprocess.CalledProcessError as e:
+      logging.warning('Failed to get revision information: %s', e)
+      return {}
+
+  # First make sure we can add the cobalt_src repo.
+  try:
+    repos = CheckRevInfo('.', cwd=repo_root)
+  except subprocess.CalledProcessError as e:
+    logging.warning('Failed to get revision information: %s', e)
+    return {}
+
+  for rel_path in _SUBREPO_PATHS:
+    path = os.path.join(repo_root, rel_path)
+    try:
+      repos.update(CheckRevInfo(rel_path, cwd=path))
+    except subprocess.CalledProcessError as e:
+      logging.warning('Failed to get revision information for subrepo %s: %s',
+                      rel_path, e)
+      continue
+    except OSError as e:
+      logging.info('%s. Subrepository %s not found.', e, rel_path)
+      continue
+
+  return repos
+
+
+# We leave this function in for backwards compatibility.
+# New callers should use GetOrGenerateNewBuildNumber.
+def GetBuildNumber(version_server=_VERSION_SERVER_URL):
+  return GetOrGenerateNewBuildNumber(version_server)
+
+
+def GetOrGenerateNewBuildNumber(version_server=_VERSION_SERVER_URL):
+  """Send a request to the build version server for a build number."""
+
+  if os.path.isfile(BUILD_ID_PATH):
+    with open(BUILD_ID_PATH, 'r') as build_id_file:
+      build_number = int(build_id_file.read().replace('\n', ''))
+      logging.info('Retrieving build number from %s', BUILD_ID_PATH)
+      return build_number
+
+  revinfo = GetRevinfo()
+  json_deps = json.dumps(revinfo)
+  username = os.environ.get('USERNAME', os.environ.get('USER'))
+
+  post_data = {'deps': json_deps}
+  if username:
+    post_data['user'] = username
+
+  logging.debug('Post data is %s', post_data)
+  request = urllib.request.Request(version_server)
+  # TODO: retry on timeout.
+  try:
+    response = urllib.request.urlopen(  # pylint: disable=consider-using-with
+        request,
+        data=urllib.parse.urlencode(post_data).encode('utf-8'))
+    data = response.read().decode('utf-8')
+    if data.find(_XSSI_PREFIX) == 0:
+      data = data[len(_XSSI_PREFIX):]
+    results = json.loads(data)
+    build_number = results.get('build_number', 0)
+    return build_number
+  except urllib.error.HTTPError as e:
+    logging.warning('Failed to retrieve build number: %s', e)
+    return 0
+  except urllib.error.URLError as e:
+    logging.warning('Could not connect to %s: %s', version_server, e)
+    return 0
diff --git a/cobalt/build/cobalt_build_id.gyp b/cobalt/build/cobalt_build_id.gyp
deleted file mode 100644
index 23a96cc..0000000
--- a/cobalt/build/cobalt_build_id.gyp
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  'targets': [
-    {
-      'target_name': 'cobalt_build_id',
-      'type': 'none',
-      # Because we generate a header, we must set the hard_dependency flag.
-      'hard_dependency': 1,
-      'actions': [
-        {
-          'action_name': 'cobalt_build_id',
-          'variables': {
-            'build_id_py_path': 'build_id.py',
-            'output_path': '<(SHARED_INTERMEDIATE_DIR)/cobalt_build_id.h',
-          },
-          'inputs': [
-            '<(build_id_py_path)',
-          ],
-          'outputs': [
-            '<(output_path)',
-          ],
-          'action': [
-            'python2',
-            '<(build_id_py_path)',
-            '<(output_path)',
-            '<(cobalt_version)',
-          ],
-          'message': 'Generating build information',
-        },
-      ],
-    }
-  ] # end of targets
-}
diff --git a/cobalt/build/cobalt_configuration.gypi b/cobalt/build/cobalt_configuration.gypi
deleted file mode 100644
index d75f498..0000000
--- a/cobalt/build/cobalt_configuration.gypi
+++ /dev/null
@@ -1,707 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#####################################################################
-# If you modify this file, PLEASE REMEMBER TO UPDATE
-# //cobalt/build/config/base.gni AS WELL
-#####################################################################
-
-# This contains the defaults and documentation for all Cobalt-defined GYP
-# variables. Starboard-defined variables are specified in
-# starboard/build/base_configuration.gypi.
-#
-# starboard/build/cobalt_configuration includes this file automatically in all
-# .gyp files processed by starboard/build/gyp_cobalt.
-{
-  'variables': {
-    # Cobalt variables.
-
-    # We need to define some variables inside of an inner 'variables' scope
-    # so that they can be referenced by other outer variables here.  Also, it
-    # allows for the specification of default values that get referenced by
-    # a top level scope.
-    'variables': {
-      'cobalt_webapi_extension_source_idl_files%': [],
-      'cobalt_webapi_extension_generated_header_idl_files%': [],
-      # In cross-compiling for modules like V8, we need a gyp flag to tell
-      # that Cobalt is being compiled by MSVC and certain MSVC options should
-      # be specified. This is needed even with 'msvs_settings' since the later
-      # is not used by platforms that only uses MSVC for host build.
-      'cobalt_compiled_by_msvc%': 0,
-      'host_executable_suffix%': '<(EXECUTABLE_SUFFIX)',
-      'disable_v8_pointer_compression%': 0,
-    },
-    'host_executable_suffix%': '<(EXECUTABLE_SUFFIX)',
-    'disable_v8_pointer_compression%': 0,
-
-    # Whether Cobalt is being built.
-    'cobalt': 1,
-
-    # Contains the current build configuration.
-    'cobalt_config%': 'gold',
-    'cobalt_fastbuild%': 0,
-
-    # Deprecated. Implement the CobaltGraphicsExtensionApi function
-    # IsMapToMeshEnabled instead.
-    # If the CobaltGraphicsExtensionApi is not implemented, then Cobalt will
-    # fall back onto a default. For starboard API versions 12 and later, the
-    # default is true (i.e. Cobalt will assume map to mesh is supported).
-    # For earlier starboard API versions, if this gyp variable is redefined to
-    # a value other than -1, it will use the new value as the default. If it is
-    # not redefined, the default is false.
-    # Enable support for the map to mesh filter, which is primarily used to
-    # implement spherical video playback.
-    'enable_map_to_mesh%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltUserOnExitStrategy instead.
-    # This variable defines what Cobalt's preferred strategy should be for
-    # handling internally triggered application exit requests (e.g. the user
-    # chooses to back out of the application).
-    #   'stop'    -- The application should call SbSystemRequestStop() on exit,
-    #                resulting in a complete shutdown of the application.
-    #   'suspend' -- The application should call SbSystemRequestSuspend() on
-    #                exit, resulting in the application being "minimized".
-    #   'noexit'  -- The application should never allow the user to trigger an
-    #                exit, this will be managed by the system.
-    'cobalt_user_on_exit_strategy%': '',
-
-    # Contains the current font package selection.  This can be used to trade
-    # font quality, coverage, and latency for different font package sizes.
-    # The font package can be one of the following options:
-    #   'standard' -- The default package. It includes all sans-serif, serif,
-    #                 and FCC fonts, non-CJK fallback fonts in both 'normal' and
-    #                 'bold' weights, 'normal' weight CJK ('bold' weight CJK is
-    #                 synthesized from it), historic script fonts, and color
-    #                 emojis. This package is ~38.3MB.
-    #   'limited'  -- A significantly smaller package than 'standard'. This
-    #                 package removes all but 'normal' and 'bold' weighted
-    #                 sans-serif and serif, removes the FCC fonts (which must be
-    #                 provided by the system or downloaded from the web),
-    #                 replaces standard CJK with low quality CJK, removes
-    #                 historic script fonts, and replaces colored emojis with
-    #                 uncolored ones. Because low quality CJK cannot synthesize
-    #                 bold, bold glyphs are unavailable in Chinese, Japanese and
-    #                 Korean. This package is ~8.3MB.
-    #   'minimal'  -- The smallest possible font package. It only includes
-    #                 Roboto's Basic Latin characters. Everything else must be
-    #                 provided by the system or downloaded from the web. This
-    #                 package is ~40.0KB.
-    # NOTE: When bold is needed, but unavailable, it is typically synthesized,
-    #       resulting in lower quality glyphs than those generated directly from
-    #       a bold font. However, this does not occur with low quality CJK,
-    #       which is not high enough quality to synthesize. Its glyphs always
-    #       have a 'normal' weight.
-    'cobalt_font_package%': 'standard',
-
-    # Font package overrides can be used to modify the files included within the
-    # selected package. The following values are available:
-    #   -1 -- The package value for the specified category is not overridden.
-    #    0 -- The package value is overridden and no fonts for the specified
-    #         category are included.
-    #    1 -- The package value is overridden and fonts from the specified
-    #         category with a weight of 'normal' and a style of 'normal' are
-    #         included.
-    #    2 -- The package value is overridden and fonts from the specified
-    #         category with a weight of either 'normal' or bold' and a style of
-    #         'normal' are included.
-    #    3 -- The package value is overridden and fonts from the specified
-    #         category with a weight of either 'normal' or 'bold' and a style of
-    #         either 'normal' or 'italic' are included.
-    #    4 -- The package value is overridden and all available fonts from the
-    #         specified category are included. This may include additional
-    #         weights beyond 'normal' and 'bold'.
-    # See content/fonts/README.md for details on the specific values used by
-    # each of the packages use for the various font categories.
-    'cobalt_font_package_override_named_sans_serif%': -1,
-    'cobalt_font_package_override_named_serif%': -1,
-    'cobalt_font_package_override_named_fcc_fonts%': -1,
-    'cobalt_font_package_override_fallback_lang_non_cjk%': -1,
-    'cobalt_font_package_override_fallback_lang_cjk%': -1,
-    'cobalt_font_package_override_fallback_lang_cjk_low_quality%': -1,
-    'cobalt_font_package_override_fallback_historic%': -1,
-    'cobalt_font_package_override_fallback_color_emoji%': -1,
-    'cobalt_font_package_override_fallback_emoji%': -1,
-    'cobalt_font_package_override_fallback_symbols%': -1,
-
-    # Build version number.
-    'cobalt_version%': '<(BUILD_NUMBER)',
-
-    'cobalt_licenses_platform%': 'default',
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltRasterizerType instead.
-    # Defines what kind of rasterizer will be used.  This can be adjusted to
-    # force a stub graphics implementation.
-    # It can be one of the following options:
-    #   'direct-gles' -- Uses a light wrapper over OpenGL ES to handle most
-    #                    draw elements. This will fall back to the skia hardware
-    #                    rasterizer for some render tree node types, but is
-    #                    generally faster on the CPU and GPU. This can handle
-    #                    360 rendering.
-    #   'hardware'    -- As much hardware acceleration of graphics commands as
-    #                    possible. This uses skia to wrap OpenGL ES commands.
-    #                    Required for 360 rendering.
-    #   'stub'        -- Stub graphics rasterization.  A rasterizer object will
-    #                    still be available and valid, but it will do nothing.
-    'rasterizer_type%': '',
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltRenderDirtyRegionOnly instead.
-    # If set to 1, will enable support for rendering only the regions of the
-    # display that are modified due to animations, instead of re-rendering the
-    # entire scene each frame.  This feature can reduce startup time where
-    # usually there is a small loading spinner animating on the screen.  On GLES
-    # renderers, Cobalt will attempt to implement this support by using
-    # eglSurfaceAttrib(..., EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED), otherwise
-    # the dirty region will be silently disabled. Note that some GLES driver
-    # implementations may internally allocate an extra full screen surface to
-    # support this feature, and many have been noticed to not properly support
-    # this functionality (but they report that they do), and for these reasons
-    # this value is defaulted to 0.
-    'render_dirty_region_only%': -1,
-
-    # Override this value to adjust the default rasterizer setting for your
-    # platform.
-    'default_renderer_options_dependency%': '<(DEPTH)/cobalt/renderer/default_options_starboard.gyp:default_options',
-
-    # NOTE: Web Extension support is deprecated. Please use Platform Services
-    # (cobalt/doc/platform_services.md) instead.
-    #
-    # Override this to inject a custom interface into Cobalt's JavaScript
-    # `window` global object.  This implies that you will have to provide your
-    # own IDL files to describe that interface and all interfaces that it
-    # references.  See cobalt/doc/webapi_extension.md for more information.
-    'cobalt_webapi_extension_source_idl_files%': [
-      '<@(cobalt_webapi_extension_source_idl_files)',
-    ],
-    # Override this to have Cobalt build IDL files that result in generated
-    # header files that may need to be included from other C++ source files.
-    # This includes, for example, IDL enumerations.  See
-    # cobalt/doc/webapi_extension.md for more information.
-    'cobalt_webapi_extension_generated_header_idl_files%': [
-      '<@(cobalt_webapi_extension_generated_header_idl_files)',
-    ],
-
-    # This gyp target must implement the functions defined in
-    # <(DEPTH)/cobalt/browser/idl_extensions.h.  See
-    # cobalt/doc/webapi_extension.md for more information.
-    'cobalt_webapi_extension_gyp_target%':
-        '<(DEPTH)/cobalt/browser/null_webapi_extension.gyp:null_webapi_extension',
-
-    # Allow throttling of the frame rate. This is expressed in terms of
-    # milliseconds and can be a floating point number. Keep in mind that
-    # swapping frames may take some additional processing time, so it may be
-    # better to specify a lower delay. For example, '33' instead of '33.33'
-    # for 30 Hz refresh. This value is deprecated in favor of the usage of
-    # CobaltExtensionGraphicsApi::GetMinimumFrameIntervalInMilliseconds API.
-    # The default value has been moved into cobalt/renderer/pipeline.cc.
-    'cobalt_minimum_frame_time_in_milliseconds%': '-1',
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltEglSwapInterval instead.
-    # Cobalt will call eglSwapInterval() and specify this value before calling
-    # eglSwapBuffers() each frame.
-    'cobalt_egl_swap_interval%': -1,
-
-    # Set to 1 to build with DIAL support.
-    'in_app_dial%': 0,
-
-    # Set to 1 to enable H5vccAccountManager.
-    'enable_account_manager%': 0,
-
-    # Set to 1 to enable H5vccCrashLog.
-    'enable_crash_log%': 1,
-
-    # Set to 1 to enable H5vccSSO (Single Sign On).
-    'enable_sso%': 0,
-
-    # Set to 1 to enable filtering of HTTP headers before sending.
-    'enable_xhr_header_filtering%': 0,
-
-    # Set to 1 to enable setting Interceptors on the URLRequestJobFactory
-    'enable_configure_request_job_factory%': 0,
-
-    # List of platform-specific targets that get compiled into cobalt.
-    'cobalt_platform_dependencies%': [],
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltFallbackSplashScreenUrl instead.
-    # The URL of default build time splash screen - see
-    #   cobalt/doc/splash_screen.md for information about this.
-    'fallback_splash_screen_url%': '',
-    # The path to a splash screen to copy into content/data/web which can be
-    # accessed via a file URL starting with
-    # "file:///cobalt/browser/splash_screen/". If '', no file is copied.
-    'cobalt_splash_screen_file%': '',
-
-    # Some compiler can not compile with raw assembly(.S files) and v8
-    # converts asm to inline assembly for these platforms.
-    'cobalt_v8_emit_builtins_as_inline_asm%': 0,
-    'cobalt_compiled_by_msvc%': 0,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltEnableQuic instead.
-    'cobalt_enable_quic%': -1,
-
-    # Cache parameters
-    # Deprecated. These can now be configured by implementing
-    # the corresponding function in the CobaltExtensionConfigurationApi.
-
-    # The following set of parameters define how much memory is reserved for
-    # different Cobalt caches.  These caches affect CPU *and* GPU memory usage.
-    #
-    # The sum of the following caches effectively describes the maximum GPU
-    # texture memory usage (though it doesn't consider video textures and
-    # display color buffers):
-    #   - skia_cache_size_in_bytes (GLES2 rasterizer only)
-    #   - image_cache_size_in_bytes
-    #   - skia_glyph_atlas_width * skia_glyph_atlas_height
-    #
-    # The other caches affect CPU memory usage.
-
-    # Determines the capacity of the skia cache.  The Skia cache is maintained
-    # within Skia and is used to cache the results of complicated effects such
-    # as shadows, so that Skia draw calls that are used repeatedly across
-    # frames can be cached into surfaces.  This setting is only relevant when
-    # using the hardware-accelerated Skia rasterizer.
-    'skia_cache_size_in_bytes%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltOffscreenTargetCacheSizeInBytes instead.
-    # Determines the amount of GPU memory the offscreen target atlases will
-    # use. This is specific to the direct-GLES rasterizer and caches any render
-    # tree nodes which require skia for rendering. Two atlases will be allocated
-    # from this memory or multiple atlases of the frame size if the limit
-    # allows. It is recommended that enough memory be reserved for two RGBA
-    # atlases about a quarter of the frame size.
-    'offscreen_target_cache_size_in_bytes%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltEncodedImageCacheSizeInBytes instead.
-    # Determines the capacity of the encoded image cache, which manages encoded
-    # images downloaded from a web page. These images are cached within CPU
-    # memory.  This not only reduces network traffic to download the encoded
-    # images, but also allows the downloaded images to be held during suspend.
-    # Note that there is also a cache for the decoded images whose capacity is
-    # specified in |image_cache_size_in_bytes|.  The decoded images are often
-    # cached in the GPU memory and will be released during suspend.
-    #
-    # If a system meet the following requirements:
-    # 1. Has a fast image decoder.
-    # 2. Has enough CPU memory, or has a unified memory architecture that allows
-    #    sharing of CPU and GPU memory.
-    # Then it may consider to set |encoded_image_cache_size_in_bytes| to a much
-    # bigger value, and set the value of |image_cache_size_in_bytes| to a much
-    # smaller value. This allows the app to cache significant more images.
-    #
-    # Set this to 0 can disable the cache completely.
-    'encoded_image_cache_size_in_bytes%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltImageCacheSizeInBytes instead.
-    # Determines the capacity of the image cache, which manages image surfaces
-    # downloaded from a web page.  While it depends on the platform, often (and
-    # ideally) these images are cached within GPU memory.
-    # Set to -1 to automatically calculate the value at runtime, based on
-    # features like windows dimensions and the value of
-    # SbSystemGetTotalGPUMemory().
-    'image_cache_size_in_bytes%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltLocalTypeFaceCacheSizeInBytes instead.
-    # Determines the capacity of the local font cache, which manages all fonts
-    # loaded from local files. Newly encountered sections of font files are
-    # lazily loaded into the cache, enabling subsequent requests to the same
-    # file sections to be handled via direct memory access. Once the limit is
-    # reached, further requests are handled via file stream.
-    # Setting the value to 0 disables memory caching and causes all font file
-    # accesses to be done using file streams.
-    'local_font_cache_size_in_bytes%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltRemoteTypefaceCacheSizeInBytes instead.
-    # Determines the capacity of the remote font cache, which manages all
-    # fonts downloaded from a web page.
-    'remote_font_cache_size_in_bytes%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltMeshCacheSizeInBytes instead.
-    # Determines the capacity of the mesh cache. Each mesh is held compressed
-    # in main memory, to be inflated into a GPU buffer when needed for
-    # projection. When set to 'auto', will be adjusted according to whether
-    # the enable_map_to_mesh is true or not.  If enable_map_to_mesh is false,
-    # then the mesh cache size will be set to 0.
-    'mesh_cache_size_in_bytes%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltImageCacheCapactityMultiplierWhenPlayingVideo.
-    # Modifying this value to be non-1.0f will result in the image cache
-    # capacity being cleared and then temporarily reduced for the duration that
-    # a video is playing.  This can be useful for some platforms if they are
-    # particularly constrained for (GPU) memory during video playback.  When
-    # playing a video, the image cache is reduced to:
-    # image_cache_size_in_bytes *
-    #     image_cache_capacity_multiplier_when_playing_video.
-    'image_cache_capacity_multiplier_when_playing_video%': '',
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi functions
-    # CobaltSkiaGlyphAtlasWidth and CobaltSkiaGlyphAtlasHeight, respectively.
-    # Determines the size in pixels of the glyph atlas where rendered glyphs are
-    # cached. The resulting memory usage is 2 bytes of GPU memory per pixel.
-    # When a value is used that is too small, thrashing may occur that will
-    # result in visible stutter. Such thrashing is more likely to occur when CJK
-    # language glyphs are rendered and when the size of the glyphs in pixels is
-    # larger, such as for higher resolution displays.
-    # The negative default values indicates to the engine that these settings
-    # should be automatically set.
-    'skia_glyph_atlas_width%': '-1',
-    'skia_glyph_atlas_height%': '-1',
-
-    # Max Cobalt CPU usage specifies that the cobalt program should
-    # keep it's size below the specified size.
-    # This setting is deprecated. Implement starboard API function
-    # SbSystemGetTotalCPUMemory() instead.
-    'max_cobalt_cpu_usage%': -1,
-
-    # Max Cobalt GPU usage specifies that the cobalt program should
-    # keep it's size below the specified size.
-    # This setting is deprecated. Implement starboard API function
-    # SbSystemGetTotalGPUMemory() instead.
-    'max_cobalt_gpu_usage%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltReduceCpuMemoryBy instead.
-    # When specified this value will reduce the cpu memory consumption by
-    # the specified amount. -1 disables the value.
-    # When this value is specified then max_cobalt_cpu_usage will not be
-    # used in memory_constrainer, but will still be used for triggering
-    # a warning if the engine consumes more memory than this value specifies.
-    'reduce_cpu_memory_by%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltReduceGpuMemoryBy instead.
-    # When specified this value will reduce the gpu memory consumption by
-    # the specified amount. -1 disables the value.
-    # When this value is specified then max_cobalt_gpu_usage will not be
-    # used in memory_constrainer, but will still be used for triggering
-    # a warning if the engine consumes more memory than this value specifies.
-    'reduce_gpu_memory_by%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltEnableJit instead.
-    'cobalt_enable_jit%': -1,
-
-    # Deprecated. Implement the CobaltExtensionConfigurationApi function
-    # CobaltGcZeal instead.
-    # Can be set to enable zealous garbage collection, if |javascript_engine|
-    # supports it.  Zealous garbage collection will cause garbage collection
-    # to occur much more frequently than normal, for the purpose of finding or
-    # reproducing bugs.
-    'cobalt_gc_zeal%': -1,
-
-    # The cobalt_media_* variables defined below are deprecated. Their
-    # corresponding Starboard functions should be defined instead of setting
-    # their values through GYP.
-
-    # This can be set to "memory" or "file".  When it is set to "memory", the
-    # media buffers will be stored in main memory allocated by SbMemory
-    # functions.  When it is set to "file", the media buffers will be stored in
-    # a temporary file in the system cache folder acquired by calling
-    # SbSystemGetPath() with "kSbSystemPathCacheDirectory".  Note that when its
-    # value is "file" the media stack will still allocate memory to cache the
-    # the buffers in use.
-    'cobalt_media_buffer_storage_type%': '',
-    # When either |cobalt_media_buffer_initial_capacity| or
-    # |cobalt_media_buffer_allocation_unit| isn't zero, media buffers will be
-    # allocated using a memory pool.  Set the following variable to 1 to
-    # allocate the media buffer pool memory on demand and return all memory to
-    # the system when there is no media buffer allocated.  Setting the following
-    # value to 0 results in that Cobalt will allocate
-    # |cobalt_media_buffer_initial_capacity| bytes for media buffer on startup
-    # and will not release any media buffer memory back to the system even if
-    # there is no media buffers allocated.
-    'cobalt_media_buffer_pool_allocate_on_demand%': -1,
-    # The amount of memory that will be used to store media buffers allocated
-    # during system startup.  To allocate a large chunk at startup helps with
-    # reducing fragmentation and can avoid failures to allocate incrementally.
-    # This can be set to 0.
-    'cobalt_media_buffer_initial_capacity%': -1,
-    # The maximum amount of memory that will be used to store media buffers when
-    # video resolution is no larger than 1080p. This must be larger than sum of
-    # 1080p video budget and non-video budget.
-    'cobalt_media_buffer_max_capacity_1080p%': -1,
-    # The maximum amount of memory that will be used to store media buffers when
-    # video resolution is 4k. If 0, then memory can grow without bound. This
-    # must be larger than sum of 4k video budget and non-video budget.
-    'cobalt_media_buffer_max_capacity_4k%': -1,
-
-    # When the media stack needs more memory to store media buffers, it will
-    # allocate extra memory in units of |cobalt_media_buffer_allocation_unit|.
-    # This can be set to 0, in which case the media stack will allocate extra
-    # memory on demand.  When |cobalt_media_buffer_initial_capacity| and this
-    # value are both set to 0, the media stack will allocate individual buffers
-    # directly using SbMemory functions.
-    'cobalt_media_buffer_allocation_unit%': -1,
-
-    # The media buffer will be allocated using the following alignment.  Set
-    # this to a larger value may increase the memory consumption of media
-    # buffers.
-    'cobalt_media_buffer_alignment%': -1,
-    # Extra bytes allocated at the end of a media buffer to ensure that the
-    # buffer can be use optimally by specific instructions like SIMD.  Set to 0
-    # to remove any padding.
-    'cobalt_media_buffer_padding%': -1,
-
-    # The memory used when playing mp4 videos that is not in DASH format.  The
-    # resolution of such videos shouldn't go beyond 1080p.  Its value should be
-    # less than the sum of 'cobalt_media_buffer_non_video_budget' and
-    # 'cobalt_media_buffer_video_budget_1080p' but not less than 8 MB.
-    'cobalt_media_buffer_progressive_budget%': -1,
-
-    # Specifies the maximum amount of memory used by audio or text buffers of
-    # media source before triggering a garbage collection.  A large value will
-    # cause more memory being used by audio buffers but will also make
-    # JavaScript app less likely to re-download audio data.  Note that the
-    # JavaScript app may experience significant difficulty if this value is too
-    # low.
-    'cobalt_media_buffer_non_video_budget%': -1,
-
-    # Specifies the maximum amount of memory used by video buffers of media
-    # source before triggering a garbage collection when the video resolution is
-    # lower than 1080p (1920x1080).  A large value will cause more memory being
-    # used by video buffers but will also make JavaScript app less likely to
-    # re-download video data.  Note that the JavaScript app may experience
-    # significant difficulty if this value is too low.
-    'cobalt_media_buffer_video_budget_1080p%': -1,
-    # Specifies the maximum amount of memory used by video buffers of media
-    # source before triggering a garbage collection when the video resolution is
-    # lower than 4k (3840x2160).  A large value will cause more memory being
-    # used by video buffers but will also make JavaScript app less likely to
-    # re-download video data.  Note that the JavaScript app may experience
-    # significant difficulty if this value is too low.
-    'cobalt_media_buffer_video_budget_4k%': -1,
-
-    # Specifies the duration threshold of media source garbage collection.  When
-    # the accumulated duration in a source buffer exceeds this value, the media
-    # source implementation will try to eject existing buffers from the cache.
-    # This is usually triggered when the video being played has a simple content
-    # and the encoded data is small.  In such case this can limit how much is
-    # allocated for the book keeping data of the media buffers and avoid OOM of
-    # system heap.
-    # This should be set to 170 for most of the platforms.  But it can be
-    # further reduced on systems with extremely low memory.
-    'cobalt_media_source_garbage_collection_duration_threshold_in_seconds%': -1,
-
-    # TODO(b/212641065): Evaluate if any flags in defines_debug, defines_devel
-    # defines_qa need to be added to GN.
-    'defines_debug': [
-      'ALLOCATOR_STATS_TRACKING',
-      'COBALT_BOX_DUMP_ENABLED',
-      'COBALT_BUILD_TYPE_DEBUG',
-      'COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING',
-      'COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS',
-      'COBALT_SECURITY_SCREEN_CLEAR_TO_UGLY_COLOR',
-      'ENABLE_DEBUG_COMMAND_LINE_SWITCHES',
-      'ENABLE_DEBUG_C_VAL',
-      'ENABLE_IGNORE_CERTIFICATE_ERRORS',
-      'ENABLE_PARTIAL_LAYOUT_CONTROL',
-      'ENABLE_TEST_DATA',
-      'ENABLE_TEST_RUNNER',
-      'ENABLE_TOKEN_ALPHABETICAL_SORTING',
-
-      # TODO: Rename to COBALT_LOGGING_ENABLED.
-      '__LB_SHELL__FORCE_LOGGING__',
-
-      'SK_DEVELOPER',
-    ],
-    'defines_devel': [
-      'ALLOCATOR_STATS_TRACKING',
-      'COBALT_BUILD_TYPE_DEVEL',
-      'COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING',
-      'COBALT_ENABLE_VERSION_COMPATIBILITY_VALIDATIONS',
-      'COBALT_SECURITY_SCREEN_CLEAR_TO_UGLY_COLOR',
-      'ENABLE_DEBUG_COMMAND_LINE_SWITCHES',
-      'ENABLE_DEBUG_C_VAL',
-      'ENABLE_IGNORE_CERTIFICATE_ERRORS',
-      'ENABLE_PARTIAL_LAYOUT_CONTROL',
-      'ENABLE_TEST_DATA',
-      'ENABLE_TEST_RUNNER',
-      'ENABLE_TOKEN_ALPHABETICAL_SORTING',
-      '__LB_SHELL__FORCE_LOGGING__',
-      'SK_DEVELOPER',
-    ],
-    'defines_qa': [
-      'ALLOCATOR_STATS_TRACKING',
-      'COBALT_BUILD_TYPE_QA',
-      'COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING',
-      'COBALT_SECURITY_SCREEN_CLEAR_TO_UGLY_COLOR',
-      'ENABLE_DEBUG_COMMAND_LINE_SWITCHES',
-      'ENABLE_DEBUG_C_VAL',
-      'ENABLE_IGNORE_CERTIFICATE_ERRORS',
-      'ENABLE_PARTIAL_LAYOUT_CONTROL',
-      'ENABLE_TEST_DATA',
-      'ENABLE_TEST_RUNNER',
-    ],
-    'defines_gold': [
-      'ALLOCATOR_STATS_TRACKING',
-      'COBALT_BUILD_TYPE_GOLD',
-      'COBALT_FORCE_CSP',
-      'COBALT_FORCE_HTTPS',
-      'OFFICIAL_BUILD',  # Chromium base relies on this.
-      'TRACING_DISABLED',
-    ],
-  },
-
-  'target_defaults': {
-    'defines': [
-      'COBALT',
-    ],
-    'conditions': [
-      ['cobalt_media_buffer_pool_allocate_on_demand != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_POOL_ALLOCATE_ON_DEMAND=<(cobalt_media_buffer_pool_allocate_on_demand)',
-        ],
-      }],
-      ['cobalt_media_buffer_initial_capacity != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_INITIAL_CAPACITY=<(cobalt_media_buffer_initial_capacity)',
-        ],
-      }],
-      ['cobalt_media_buffer_max_capacity_1080p != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_MAX_CAPACITY_1080P=<(cobalt_media_buffer_max_capacity_1080p)',
-        ],
-      }],
-      ['cobalt_media_buffer_max_capacity_4k != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_MAX_CAPACITY_4K=<(cobalt_media_buffer_max_capacity_4k)',
-        ],
-      }],
-      ['cobalt_media_buffer_max_capacity_4k != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_MAX_CAPACITY_4K=<(cobalt_media_buffer_max_capacity_4k)',
-        ],
-      }],
-      ['cobalt_media_buffer_max_capacity_4k != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_MAX_CAPACITY_4K=<(cobalt_media_buffer_max_capacity_4k)',
-        ],
-      }],
-      ['cobalt_media_buffer_allocation_unit != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_ALLOCATION_UNIT=<(cobalt_media_buffer_allocation_unit)',
-        ],
-      }],
-      ['cobalt_media_buffer_alignment != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_ALIGNMENT=<(cobalt_media_buffer_alignment)',
-        ],
-      }],
-      ['cobalt_media_buffer_padding != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_PADDING=<(cobalt_media_buffer_padding)',
-        ],
-      }],
-      ['cobalt_media_buffer_progressive_budget != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_PROGRESSIVE_BUDGET=<(cobalt_media_buffer_progressive_budget)',
-        ],
-      }],
-      ['cobalt_media_buffer_non_video_budget != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_NON_VIDEO_BUDGET=<(cobalt_media_buffer_non_video_budget)',
-        ],
-      }],
-      ['cobalt_media_buffer_video_budget_1080p != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_VIDEO_BUDGET_1080P=<(cobalt_media_buffer_video_budget_1080p)',
-        ],
-      }],
-      ['cobalt_media_buffer_video_budget_4k != -1', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_VIDEO_BUDGET_4K=<(cobalt_media_buffer_video_budget_4k)',
-        ],
-      }],
-      ['cobalt_media_source_garbage_collection_duration_threshold_in_seconds != -1', {
-        'defines': [
-          'COBALT_MEDIA_SOURCE_GARBAGE_COLLECTION_DURATION_THRESHOLD_IN_SECONDS=<(cobalt_media_source_garbage_collection_duration_threshold_in_seconds)',
-        ],
-      }],
-      ['cobalt_media_buffer_storage_type == "memory"', {
-        'defines': [
-          'COBALT_MEDIA_BUFFER_STORAGE_TYPE_MEMORY=1',
-        ],
-      }, {
-        'conditions': [
-          ['cobalt_media_buffer_storage_type != ""', {
-            'defines': [
-              'COBALT_MEDIA_BUFFER_STORAGE_TYPE_FILE=1',
-            ],
-          }],
-        ],
-      }],
-      ['in_app_dial == 1', {
-        'defines': [
-          'DIAL_SERVER',
-        ],
-      }],
-      ['enable_debugger == 1', {
-        'defines': [
-          'ENABLE_DEBUGGER',
-        ],
-      }],
-      ['host_os=="win"', {
-        # A few flags to mute MSVC compiler errors that does not appear on Linux.
-        'compiler_flags_host': [
-          '/wd4267',  # Possible loss of precision from size_t to a smaller type.
-          '/wd4715',  # Not all control paths return value.
-        ],
-      }],
-    ],
-  }, # end of target_defaults
-
-  # For configurations other than Gold, set the flag that lets test data files
-  # be copied and carried along with the build.
-  # Clients must copy over all content; to avoid having to copy over extra data, we
-  # omit the test data
-  'conditions': [
-    ['cobalt_config != "gold"', {
-      'variables' : {
-        'enable_about_scheme': 1,
-        'enable_fake_microphone': 1,
-        'enable_network_logging': 1,
-        'enable_webdriver%': 1,
-      },
-    },
-    {
-      'variables' : {
-        'enable_about_scheme': 0,
-        'enable_fake_microphone': 0,
-        'enable_network_logging': 0,
-        'enable_webdriver': 0,
-      },
-    }],
-    ['cobalt_config != "gold"', {
-      'variables' : {
-        'cobalt_copy_test_data': 1,
-      },
-    },
-    {
-      'variables' : {
-        'cobalt_copy_test_data': 0,
-      },
-    }],
-  ],
-}
diff --git a/cobalt/build/cobalt_configuration.py b/cobalt/build/cobalt_configuration.py
index fd6c0c8..1201c9d 100644
--- a/cobalt/build/cobalt_configuration.py
+++ b/cobalt/build/cobalt_configuration.py
@@ -15,7 +15,6 @@
 
 import os
 
-import _env  # pylint: disable=unused-import
 from cobalt.tools import paths
 import cobalt.tools.webdriver_benchmark_config as wb_config
 from starboard.build import application_configuration
diff --git a/cobalt/build/config/__init__.py b/cobalt/build/config/__init__.py
deleted file mode 100644
index d8d53fc..0000000
--- a/cobalt/build/config/__init__.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/python
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Initialization for the config package.
-
-Note that this is an obsolete and deprecated package, and just exists for
-backwards compatibility. Please use starboard.build.PlatformConfiguration or
-cobalt.build.CobaltConfiguration instead, as appropriate.
-"""
-
-import sys
-
-import _env  # pylint: disable=unused-import
-import base
-import starboard
-from starboard.tools.build import GetPlatformConfig
-
-# This bit of voodoo fakes out the config.starboard module so that legacy
-# platforms will still GYP properly.
-sys.modules['config.starboard'] = starboard
-starboard.PlatformConfigStarboard = base.PlatformConfigBase
-
-# TODO: Add deprecation logging.warning() here once references are mostly
-# cleaned up.
diff --git a/cobalt/build/config/_env.py b/cobalt/build/config/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/cobalt/build/config/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/build/config/base.py b/cobalt/build/config/base.py
deleted file mode 100644
index 09a5be0..0000000
--- a/cobalt/build/config/base.py
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/python
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Base platform configuration for GYP.
-
-Note that this is an obsolete and deprecated module, and just exists for
-backwards compatibility. Please use starboard.build.PlatformConfiguration or
-cobalt.build.CobaltConfiguration instead, as appropriate.
-"""
-
-import _env  # pylint: disable=unused-import
-from starboard.build.platform_configuration import PlatformConfiguration
-
-
-PlatformConfigBase = PlatformConfiguration  # pylint: disable=invalid-name
-
-
-# TODO: Add deprecation logging.warning() here once references are mostly
-# cleaned up.
diff --git a/cobalt/build/contents_dir.gypi b/cobalt/build/contents_dir.gypi
deleted file mode 100644
index bb04a9d..0000000
--- a/cobalt/build/contents_dir.gypi
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Directories where static content files used by Cobalt are located.
-{
-  'variables': {
-    'static_contents_source_dir': '<(DEPTH)/cobalt/content',
-  },
-}
diff --git a/cobalt/build/copy_icu_data.gypi b/cobalt/build/copy_icu_data.gypi
deleted file mode 100644
index b935a29..0000000
--- a/cobalt/build/copy_icu_data.gypi
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is meant to be included by a GYP target that needs to copy the
-# platform specific ICU data into <(PRODUCT_DIR)/content.
-
-{
-  'includes': [ 'contents_dir.gypi' ],
-
-  'variables': {
-    'variables': {
-      # Target machine uses little endian convention
-      'little_endian%': 1,
-    },
-
-    'conditions': [
-      ['little_endian==1', {
-        'inputs_icu%': [ '<(static_contents_source_dir)/icu/icudt68l.dat' ],
-      }, {
-        'inputs_icu%': [ '<(static_contents_source_dir)/icu/icudt68b.dat' ],
-      }],
-    ],
-  },
-
-  'copies': [
-    {
-      'destination': '<(sb_static_contents_output_data_dir)/icu/',
-      'files': [ '<(inputs_icu)' ],
-    },
-  ],
-
-  'all_dependent_settings': {
-    'variables': {
-      'content_deploy_subdirs': [ 'icu' ]
-    }
-  },
-}
diff --git a/cobalt/build/copy_web_data.gypi b/cobalt/build/copy_web_data.gypi
deleted file mode 100644
index 787a7ea..0000000
--- a/cobalt/build/copy_web_data.gypi
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is meant to be included into an action to copy web data files into
-# the content directory, e.g. out/stub_debug/content/data/web.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'target_name_copy_web_files',
-#   'type': 'none',
-#   'variables': {
-#     'content_web_input_files': [
-#       'path/to/datafile.txt',     # The file will be copied.
-#       'path/to/data/directory',   # The directory and its content will be copied.
-#       'path/to/data/directory/',  # The directory's content will be copied.
-#     ]
-#     'content_web_output_subdir' : 'path/to/output/directory',
-#   },
-#   'includes': [ '<(DEPTH)/cobalt/build/copy_web_data.gypi' ],
-# },
-#
-# Meaning of the variables:
-#   content_web_input_files: list:
-#       Paths to data files or directories. When an item is a directory,
-#       without the final "/", the directory (along with the content) will be
-#       copied, otherwise only the content will be copied.
-#   content_web_output_subdir: string:
-#       Directory within the 'web' directory that all input files will be
-#       copied to.  Generally, this should be the directory of the gypi file
-#       containing the target (e.g. it should be "base" for the target in
-#       base/base.gyp).
-# It is recommended that content_web_input_files and content_web_output_subdir
-# have similar paths, so the directory structure in web/ will reflect that in
-# the source folder.
-
-{
-  'includes': [ 'contents_dir.gypi' ],
-
-  'actions': [
-    {
-      'action_name': 'copy_web_files',
-      'inputs': [
-        '<!@pymod_do_main(starboard.build.copy_data --inputs <(content_web_input_files))',
-      ],
-      'outputs': [
-        '<!@pymod_do_main(starboard.build.copy_data -o <(sb_static_contents_output_data_dir)/web/<(content_web_output_subdir) --outputs <(content_web_input_files))',
-      ],
-      'action': [
-        'python2',
-        '<(DEPTH)/starboard/build/copy_data.py',
-        '-o', '<(sb_static_contents_output_data_dir)/web/<(content_web_output_subdir)',
-        '<@(content_web_input_files)',
-      ],
-    },
-  ],
-
-  'all_dependent_settings': {
-    'variables': {
-      'content_deploy_subdirs': [ 'web/<(content_web_output_subdir)' ]
-    }
-  },
-}
diff --git a/cobalt/build/get_build_id.py b/cobalt/build/get_build_id.py
index 842e2d4..14f4f0d 100755
--- a/cobalt/build/get_build_id.py
+++ b/cobalt/build/get_build_id.py
@@ -15,13 +15,17 @@
 """Prints out the Cobalt Build ID."""
 
 import os
-from gyp_utils import GetOrGenerateNewBuildNumber
+from cobalt.build.build_number import GetOrGenerateNewBuildNumber
 
 
 def main():
+  # Note $BUILD_ID_SERVER_URL will always be set in CI.
   build_id_server_url = os.environ.get('BUILD_ID_SERVER_URL')
   if build_id_server_url:
-    print(GetOrGenerateNewBuildNumber(version_server=build_id_server_url))
+    build_num = GetOrGenerateNewBuildNumber(version_server=build_id_server_url)
+    if build_num == 0:
+      raise ValueError('The build number received was zero.')
+    print(build_num)
   else:
     # No need to generate a build id for local builds.
     print('0')
diff --git a/cobalt/build/get_starboard_path.py b/cobalt/build/get_starboard_path.py
deleted file mode 100755
index f2638f8..0000000
--- a/cobalt/build/get_starboard_path.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Prints the path to the given starboard platform's configuration directory.
-"""
-
-import sys
-
-import _env  # pylint: disable=unused-import
-from starboard.tools import platform
-
-
-def main():
-  platform_info = platform.Get(sys.argv[1])
-  if not platform_info:
-    return 1
-  print platform_info.path
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/cobalt/build/gn.py b/cobalt/build/gn.py
old mode 100644
new mode 100755
index 93af0bb..88fa813
--- a/cobalt/build/gn.py
+++ b/cobalt/build/gn.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python
 # Copyright 2021 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,19 +18,16 @@
 import os
 import shutil
 import subprocess
-import sys
 from pathlib import Path
+from typing import List
 
-_REPOSITORY_ROOT = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
-sys.path.append(_REPOSITORY_ROOT)
-from starboard.build.platforms import PLATFORMS  # pylint:disable=wrong-import-position
+from starboard.build.platforms import PLATFORMS
 
 _BUILD_TYPES = ['debug', 'devel', 'qa', 'gold']
 
 
 def main(out_directory: str, platform: str, build_type: str,
-         overwrite_args: bool, check_dependencies: bool):
+         overwrite_args: bool, gn_gen_args: List[str]):
   platform_path = PLATFORMS[platform]
   dst_args_gn_file = os.path.join(out_directory, 'args.gn')
   src_args_gn_file = os.path.join(platform_path, 'args.gn')
@@ -38,13 +36,13 @@
 
   if overwrite_args or not os.path.exists(dst_args_gn_file):
     shutil.copy(src_args_gn_file, dst_args_gn_file)
-
     with open(dst_args_gn_file, 'a') as f:
       f.write(f'build_type = "{build_type}"\n')
-  extra_args = []
-  if check_dependencies:
-    extra_args += ['--check']
-  gn_command = ['gn', 'gen', out_directory] + extra_args
+  else:
+    print(f'{dst_args_gn_file} already exists.' +
+          ' Running ninja will regenerate build files automatically.')
+
+  gn_command = ['gn', 'gen', out_directory] + gn_gen_args
   print(' '.join(gn_command))
   subprocess.check_call(gn_command)
 
@@ -64,7 +62,6 @@
       type=str,
       help='Path to the directory a named build folder, <platform>_<config>/, '
       'will be created in.')
-
   parser.add_argument(
       '-p',
       '--platform',
@@ -85,21 +82,15 @@
       help='Whether or not to overwrite an existing args.gn file if one exists '
       'in the out directory. In general, if the file exists, you should run '
       '`gn args <out_directory>` to edit it instead.')
-  parser.add_argument(
-      '--check',
-      default=False,
-      action='store_true',
-      help='Whether or not to generate the ninja files with the gn --check '
-      'option.')
-  args = parser.parse_args()
+  known_args, unknown_args = parser.parse_known_args()
 
-  if args.out_directory:
-    builds_out_directory = args.out_directory
+  if known_args.out_directory:
+    builds_out_directory = known_args.out_directory
   else:
     builds_directory = os.getenv('COBALT_BUILDS_DIRECTORY',
-                                 args.builds_directory or 'out')
-    builds_out_directory = os.path.join(builds_directory,
-                                        f'{args.platform}_{args.build_type}')
+                                 known_args.builds_directory or 'out')
+    builds_out_directory = os.path.join(
+        builds_directory, f'{known_args.platform}_{known_args.build_type}')
 
-  main(builds_out_directory, args.platform, args.build_type,
-       args.overwrite_args, args.check)
+  main(builds_out_directory, known_args.platform, known_args.build_type,
+       known_args.overwrite_args, unknown_args)
diff --git a/cobalt/build/gyp_cobalt b/cobalt/build/gyp_cobalt
deleted file mode 100755
index e32f97b..0000000
--- a/cobalt/build/gyp_cobalt
+++ /dev/null
@@ -1,147 +0,0 @@
-#!/usr/bin/env python2
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Wrapper to generate build files from .gyp files."""
-
-import argparse
-import logging
-import os
-import sys
-import textwrap
-
-import _env  # pylint: disable=unused-import
-from cobalt.build import cobalt_configuration
-from cobalt.build import gyp_utils
-from starboard.build.gyp_runner import GypRunner
-from starboard.tools import build
-from starboard.tools import command_line
-from starboard.tools import config
-from starboard.tools import log_level
-from starboard.tools import platform
-
-# Return values used by main().
-RETVAL_SUCCESS = 0
-RETVAL_ERROR = 1
-
-
-def _ListAsString(items):
-  return ', '.join('"%s"' % x for x in items)
-
-
-def _ParseCommandLineArguments(argv):
-  """Parses command line arguments."""
-
-  parser = argparse.ArgumentParser(
-      formatter_class=argparse.RawDescriptionHelpFormatter,
-      description=textwrap.dedent(__doc__))
-
-  parser.add_argument(
-      '-C',
-      '--config',
-      dest='build_configs',
-      metavar='CONFIG',
-      action='append',
-      default=[],
-      choices=config.GetAll(),
-      help='Specifies build configurations. Supported '
-      'configurations are %s. Can be specified multiple '
-      'times, creates all configurations if nothing is '
-      'given.' % _ListAsString(config.GetAll()))
-
-  gyp_debug_options = build.GypDebugOptions()
-  parser.add_argument(
-      '-D',
-      '--debug',
-      dest='debug',
-      metavar='DEBUGMODE',
-      action='append',
-      default=[],
-      choices=gyp_debug_options + ['all'],
-      help='Turn on a debugging mode for debugging GYP. '
-      'Supported modes are %s or "all" for all of '
-      'them.' % _ListAsString(gyp_debug_options))
-
-  parser.add_argument(
-      '--check', action='store_true', help='Check format of gyp files.')
-  parser.add_argument(
-      '-v',
-      '--verbose',
-      action='store_true',
-      help='Enables verbose logging. For more control over the '
-      "logging level use '--log_level' instead.")
-  parser.add_argument(
-      'platform',
-      choices=platform.GetAll(),
-      metavar='platform',
-      help='Target platform. Supported platforms are: %s.' %
-      (_ListAsString(platform.GetAll())))
-  parser.add_argument(
-      'build_file',
-      nargs='?',
-      default=None,
-      help='GYP build file. Uses all.gyp if nothing is given.')
-
-  command_line.AddLoggingArguments(parser, default='warning')
-
-  options = parser.parse_args(argv)
-  options.application = cobalt_configuration.APPLICATION_NAME
-  return options
-
-
-def _GetBuildConfigs(build_configs):
-  if build_configs:
-    return build_configs
-  else:
-    default_config, _ = build.GetDefaultConfigAndPlatform()
-    if default_config:
-      return default_config
-    else:
-      return config.GetAll()
-
-
-def main(argv):
-  options = _ParseCommandLineArguments(argv)
-
-  log_level.InitializeLogging(options)
-
-  if os.environ.get('GYP_DEFINES'):
-    logging.error('GYP_DEFINES environment variable is not supported.')
-    return RETVAL_ERROR
-
-  build_id_server_url = os.environ.get('BUILD_ID_SERVER_URL')
-  if build_id_server_url:
-    options.build_number = gyp_utils.GetOrGenerateNewBuildNumber(
-        version_server=build_id_server_url)
-  else:
-    options.build_number = gyp_utils.GetOrGenerateNewBuildNumber()
-
-  try:
-    gyp_runner = GypRunner(options)
-  except RuntimeError as e:
-    logging.error(e)
-    return RETVAL_ERROR
-
-  for config_name in _GetBuildConfigs(options.build_configs):
-    logging.info('Building config: %s', config_name)
-    gyp_return = gyp_runner.BuildConfig(config_name)
-    if gyp_return:
-      logging.error('GYP failed with error code %d.', gyp_return)
-      return gyp_return
-
-  logging.info('Done.')
-  return RETVAL_SUCCESS
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/cobalt/build/gyp_cobalt.bat b/cobalt/build/gyp_cobalt.bat
deleted file mode 100644
index 33a6d5a..0000000
--- a/cobalt/build/gyp_cobalt.bat
+++ /dev/null
@@ -1,27 +0,0 @@
-@echo off
-
-::
-:: Copyright 2014 The Cobalt Authors. All Rights Reserved.
-::
-:: Licensed under the Apache License, Version 2.0 (the "License");
-:: you may not use this file except in compliance with the License.
-:: You may obtain a copy of the License at
-::
-::     http://www.apache.org/licenses/LICENSE-2.0
-::
-:: Unless required by applicable law or agreed to in writing, software
-:: distributed under the License is distributed on an "AS IS" BASIS,
-:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-:: See the License for the specific language governing permissions and
-:: limitations under the License.
-::
-
-
-:: This is a workaround until Cobalt can GYP without using Bash specific
-:: commands.
-
-setlocal
-set SCRIPT_DIR=%~dp0
-set ARGS=%*
-
-python2 %SCRIPT_DIR%gyp_cobalt %ARGS%
diff --git a/cobalt/build/gyp_utils.py b/cobalt/build/gyp_utils.py
deleted file mode 100644
index 1ce84d2..0000000
--- a/cobalt/build/gyp_utils.py
+++ /dev/null
@@ -1,157 +0,0 @@
-# Copyright 2012 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Utilities for use by gyp_cobalt and other build tools."""
-
-import json
-import logging
-import os
-import re
-import subprocess
-import sys
-from six.moves import urllib
-import _env  # pylint: disable=unused-import
-from cobalt.tools import paths
-
-_SUBREPO_PATHS = ['starboard/keyboxes']
-_VERSION_SERVER_URL = 'https://carbon-airlock-95823.appspot.com/build_version/generate'  # pylint:disable=line-too-long
-_XSSI_PREFIX = ")]}'\n"
-
-# The path to the build.id file that preserves a build ID.
-BUILD_ID_PATH = os.path.join(paths.BUILD_ROOT, 'build.id')
-
-
-def CheckRevInfo(key, cwd=None):
-  git_get_remote_args = ['git', 'config', '--get', 'remote.origin.url']
-  remote = subprocess.check_output(
-      git_get_remote_args, cwd=cwd).strip().decode('utf-8')
-
-  if remote.endswith('.git'):
-    remote = remote[:-len('.git')]
-
-  git_get_revision_args = ['git', 'rev-parse', 'HEAD']
-  revision = subprocess.check_output(
-      git_get_revision_args, cwd=cwd).strip().decode('utf-8')
-  return {key: '{}@{}'.format(remote, revision)}
-
-
-def GetRevinfo():
-  """Get absolute state of all git repos."""
-  try:
-    repo_root = subprocess.check_output(['git', 'rev-parse', '--show-toplevel'
-                                        ]).strip().decode('utf-8')
-  except subprocess.CalledProcessError as e:
-    logging.info('Could not get repo root. Trying again in src/')
-    try:
-      repo_root = subprocess.check_output(
-          ['git', '-C', 'src', 'rev-parse',
-           '--show-toplevel']).strip().decode('utf-8')
-    except subprocess.CalledProcessError as e:
-      logging.warning('Failed to get revision information: %s', e)
-      return {}
-
-  # First make sure we can add the cobalt_src repo.
-  try:
-    repos = CheckRevInfo('.', cwd=repo_root)
-  except subprocess.CalledProcessError as e:
-    logging.warning('Failed to get revision information: %s', e)
-    return {}
-
-  for rel_path in _SUBREPO_PATHS:
-    path = os.path.join(repo_root, rel_path)
-    try:
-      repos.update(CheckRevInfo(rel_path, cwd=path))
-    except subprocess.CalledProcessError as e:
-      logging.warning('Failed to get revision information for subrepo %s: %s',
-                      rel_path, e)
-      continue
-    except OSError as e:
-      logging.info('%s. Subrepository %s not found.', e, rel_path)
-      continue
-
-  return repos
-
-
-# We leave this function in for backwards compatibility.
-# New callers should use GetOrGenerateNewBuildNumber.
-def GetBuildNumber(version_server=_VERSION_SERVER_URL):
-  return GetOrGenerateNewBuildNumber(version_server)
-
-
-def GetOrGenerateNewBuildNumber(version_server=_VERSION_SERVER_URL):
-  """Send a request to the build version server for a build number."""
-
-  if os.path.isfile(BUILD_ID_PATH):
-    with open(BUILD_ID_PATH, 'r') as build_id_file:
-      build_number = int(build_id_file.read().replace('\n', ''))
-      logging.info('Retrieving build number from %s', BUILD_ID_PATH)
-      return build_number
-
-  revinfo = GetRevinfo()
-  json_deps = json.dumps(revinfo)
-  username = os.environ.get('USERNAME', os.environ.get('USER'))
-
-  post_data = {'deps': json_deps}
-  if username:
-    post_data['user'] = username
-
-  logging.debug('Post data is %s', post_data)
-  request = urllib.request.Request(version_server)
-  # TODO: retry on timeout.
-  try:
-    response = urllib.request.urlopen(  # pylint: disable=consider-using-with
-        request,
-        data=urllib.parse.urlencode(post_data).encode('utf-8'))
-    data = response.read().decode('utf-8')
-    if data.find(_XSSI_PREFIX) == 0:
-      data = data[len(_XSSI_PREFIX):]
-    results = json.loads(data)
-    build_number = results.get('build_number', 0)
-    return build_number
-  except urllib.error.HTTPError as e:
-    logging.warning('Failed to retrieve build number: %s', e)
-    return 0
-  except urllib.error.URLError as e:
-    logging.warning('Could not connect to %s: %s', version_server, e)
-    return 0
-
-
-def GetConstantValue(file_path, constant_name):
-  """Return an rvalue from a C++ header file.
-
-  Search a C/C++ header file at |file_path| for an assignment to the
-  constant named |constant_name|. The rvalue for the assignment must be a
-  literal constant or an expression of literal constants.
-
-  Args:
-    file_path: Header file to search.
-    constant_name: Name of C++ rvalue to evaluate.
-
-  Returns:
-    constant_name as an evaluated expression.
-  """
-
-  search_re = re.compile(r'%s\s*=\s*([\d\+\-*/\s\(\)]*);' % constant_name)
-  with open(file_path, 'r') as f:
-    match = search_re.search(f.read())
-
-  if not match:
-    logging.critical(
-        'Could not query constant value.  The expression '
-        'should only have numbers, operators, spaces, and '
-        'parens.  Please check "%s" in %s.\n', constant_name, file_path)
-    sys.exit(1)
-
-  expression = match.group(1)
-  value = eval(expression)  # pylint:disable=eval-used
-  return value
diff --git a/cobalt/build/path_conversion.py b/cobalt/build/path_conversion.py
index 7caad28..874f111 100644
--- a/cobalt/build/path_conversion.py
+++ b/cobalt/build/path_conversion.py
@@ -104,5 +104,5 @@
 
 
 if __name__ == '__main__':
-  print DoMain(sys.argv[1:])
+  print(DoMain(sys.argv[1:]))
   sys.exit(0)
diff --git a/cobalt/build/path_conversion_test.py b/cobalt/build/path_conversion_test.py
index b03524f..e0245b1 100644
--- a/cobalt/build/path_conversion_test.py
+++ b/cobalt/build/path_conversion_test.py
@@ -12,12 +12,11 @@
 # 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.
-
+"""Path conversion test."""
 
 import os
 import unittest
 
-import _env  # pylint: disable=unused-import,relative-import
 from cobalt.build.path_conversion import ConvertPath
 
 
diff --git a/cobalt/build/save_build_id.py b/cobalt/build/save_build_id.py
index 322da05..cdd0d01 100755
--- a/cobalt/build/save_build_id.py
+++ b/cobalt/build/save_build_id.py
@@ -20,10 +20,10 @@
 import sys
 import textwrap
 
-import gyp_utils
+from cobalt.build import build_number
 
 _SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
-_BUILD_ID_PATH = gyp_utils.BUILD_ID_PATH
+_BUILD_ID_PATH = build_number.BUILD_ID_PATH
 
 # Return values used by main().
 RETVAL_SUCCESS = 0
@@ -65,10 +65,10 @@
   if not options.build_id:
     build_id_server_url = os.environ.get('BUILD_ID_SERVER_URL')
     if build_id_server_url:
-      options.build_id = gyp_utils.GetOrGenerateNewBuildNumber(
+      options.build_id = build_number.GetOrGenerateNewBuildNumber(
           version_server=build_id_server_url)
     else:
-      options.build_id = gyp_utils.GetOrGenerateNewBuildNumber()
+      options.build_id = build_number.GetOrGenerateNewBuildNumber()
 
   if not options.build_id:
     logging.error('Unable to retrieve build id.')
diff --git a/cobalt/configuration/configuration.cc b/cobalt/configuration/configuration.cc
index 6bc42a2..8e1fd64 100644
--- a/cobalt/configuration/configuration.cc
+++ b/cobalt/configuration/configuration.cc
@@ -56,18 +56,12 @@
 #endif
     return configuration_api_->CobaltUserOnExitStrategy();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_USER_ON_EXIT_STRATEGY)
 #error "COBALT_USER_ON_EXIT_STRATEGY is deprecated after Starboard version 12."
 #error "Implement CobaltExtensionConfigurationApi::CobaltUserOnExitStrategy()"
 #error "instead."
 #endif
   return "stop";
-#elif defined(COBALT_USER_ON_EXIT_STRATEGY)
-  return COBALT_USER_ON_EXIT_STRATEGY;
-#else
-  return "stop";
-#endif
 }
 
 bool Configuration::CobaltRenderDirtyRegionOnly() {
@@ -82,7 +76,6 @@
 #endif
     return configuration_api_->CobaltRenderDirtyRegionOnly();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_RENDER_DIRTY_REGION_ONLY)
 #error \
     "COBALT_RENDER_DIRTY_REGION_ONLY is deprecated after Starboard version 12."
@@ -91,11 +84,6 @@
 #error "instead."
 #endif
   return false;
-#elif defined(COBALT_RENDER_DIRTY_REGION_ONLY)
-  return true;
-#else
-  return false;
-#endif
 }
 
 int Configuration::CobaltEglSwapInterval() {
@@ -109,18 +97,12 @@
 #endif
     return configuration_api_->CobaltEglSwapInterval();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_EGL_SWAP_INTERVAL)
 #error "COBALT_EGL_SWAP_INTERVAL is deprecated after Starboard version 12."
 #error "Implement CobaltExtensionConfigurationApi::CobaltEglSwapInterval()"
 #error "instead."
 #endif
   return 1;
-#elif defined(COBALT_EGL_SWAP_INTERVAL)
-  return COBALT_EGL_SWAP_INTERVAL;
-#else
-  return 1;
-#endif
 }
 
 const char* Configuration::CobaltFallbackSplashScreenUrl() {
@@ -135,7 +117,6 @@
 #endif
     return configuration_api_->CobaltFallbackSplashScreenUrl();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_FALLBACK_SPLASH_SCREEN_URL)
 // NOLINTNEXTLINE(whitespace/line_length)
 #error \
@@ -146,11 +127,6 @@
 #error "instead."
 #endif
   return "none";
-#elif defined(COBALT_FALLBACK_SPLASH_SCREEN_URL)
-  return COBALT_FALLBACK_SPLASH_SCREEN_URL;
-#else
-  return "none";
-#endif
 }
 
 const char* Configuration::CobaltFallbackSplashScreenTopics() {
@@ -171,18 +147,12 @@
 #endif
     return configuration_api_->CobaltEnableQuic();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_ENABLE_QUIC)
 #error "COBALT_ENABLE_QUIC is deprecated after Starboard version 12."
 #error "Implement CobaltExtensionConfigurationApi::CobaltEnableQuic()"
 #error "instead."
 #endif
   return true;
-#elif defined(COBALT_ENABLE_QUIC)
-  return true;
-#else
-  return false;
-#endif
 }
 
 int Configuration::CobaltSkiaCacheSizeInBytes() {
@@ -197,7 +167,6 @@
 #endif
     return configuration_api_->CobaltSkiaCacheSizeInBytes();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_SKIA_CACHE_SIZE_IN_BYTES)
 #error \
     "COBALT_SKIA_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
@@ -205,11 +174,6 @@
 #error "instead."
 #endif
   return 4 * 1024 * 1024;
-#elif defined(COBALT_SKIA_CACHE_SIZE_IN_BYTES)
-  return COBALT_SKIA_CACHE_SIZE_IN_BYTES;
-#else
-  return 4 * 1024 * 1024;
-#endif
 }
 
 int Configuration::CobaltOffscreenTargetCacheSizeInBytes() {
@@ -225,7 +189,6 @@
 #endif
     return configuration_api_->CobaltOffscreenTargetCacheSizeInBytes();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_OFFSCREEN_TARGET_CACHE_SIZE_IN_BYTES)
 // NOLINTNEXTLINE(whitespace/line_length)
 #error \
@@ -236,11 +199,6 @@
 #error "instead."
 #endif
   return -1;
-#elif defined(COBALT_OFFSCREEN_TARGET_CACHE_SIZE_IN_BYTES)
-  return COBALT_OFFSCREEN_TARGET_CACHE_SIZE_IN_BYTES;
-#else
-  return -1;
-#endif
 }
 
 int Configuration::CobaltEncodedImageCacheSizeInBytes() {
@@ -256,7 +214,6 @@
 #endif
     return configuration_api_->CobaltEncodedImageCacheSizeInBytes();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_ENCODED_IMAGE_CACHE_SIZE_IN_BYTES)
 // NOLINTNEXTLINE(whitespace/line_length)
 #error \
@@ -267,11 +224,6 @@
 #error "instead."
 #endif
   return 1024 * 1024;
-#elif defined(COBALT_ENCODED_IMAGE_CACHE_SIZE_IN_BYTES)
-  return COBALT_ENCODED_IMAGE_CACHE_SIZE_IN_BYTES;
-#else
-  return 1024 * 1024;
-#endif
 }
 
 int Configuration::CobaltImageCacheSizeInBytes() {
@@ -286,7 +238,6 @@
 #endif
     return configuration_api_->CobaltImageCacheSizeInBytes();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_IMAGE_CACHE_SIZE_IN_BYTES)
 #error \
     "COBALT_IMAGE_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
@@ -295,11 +246,6 @@
 #error "instead."
 #endif
   return -1;
-#elif defined(COBALT_IMAGE_CACHE_SIZE_IN_BYTES)
-  return COBALT_IMAGE_CACHE_SIZE_IN_BYTES;
-#else
-  return -1;
-#endif
 }
 
 int Configuration::CobaltLocalTypefaceCacheSizeInBytes() {
@@ -314,7 +260,6 @@
 #endif
     return configuration_api_->CobaltLocalTypefaceCacheSizeInBytes();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES)
 // NOLINTNEXTLINE(whitespace/line_length)
 #error \
@@ -325,11 +270,6 @@
 #error "instead."
 #endif
   return 16 * 1024 * 1024;
-#elif defined(COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES)
-  return COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES;
-#else
-  return 16 * 1024 * 1024;
-#endif
 }
 
 int Configuration::CobaltRemoteTypefaceCacheSizeInBytes() {
@@ -344,7 +284,6 @@
 #endif
     return configuration_api_->CobaltRemoteTypefaceCacheSizeInBytes();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES)
 // NOLINTNEXTLINE(whitespace/line_length)
 #error \
@@ -355,11 +294,6 @@
 #error "instead."
 #endif
   return 4 * 1024 * 1024;
-#elif defined(COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES)
-  return COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES;
-#else
-  return 4 * 1024 * 1024;
-#endif
 }
 
 int Configuration::CobaltMeshCacheSizeInBytes() {
@@ -374,7 +308,6 @@
 #endif
     return configuration_api_->CobaltMeshCacheSizeInBytes();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_MESH_CACHE_SIZE_IN_BYTES)
 #error \
     "COBALT_MESH_CACHE_SIZE_IN_BYTES is deprecated after Starboard version 12."
@@ -382,11 +315,6 @@
 #error "instead."
 #endif
   return 1024 * 1024;
-#elif defined(COBALT_MESH_CACHE_SIZE_IN_BYTES)
-  return COBALT_MESH_CACHE_SIZE_IN_BYTES;
-#else
-  return 1024 * 1024;
-#endif
 }
 
 // Deprecated, only retained as config API placeholder.
@@ -407,7 +335,6 @@
     return configuration_api_
         ->CobaltImageCacheCapacityMultiplierWhenPlayingVideo();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_IMAGE_CACHE_CAPACITY_MULTIPLIER_WHEN_PLAYING_VIDEO)
 // NOLINTNEXTLINE(whitespace/line_length)
 #error \
@@ -418,11 +345,6 @@
 #error "instead."
 #endif
   return 1.0f;
-#elif defined(COBALT_IMAGE_CACHE_CAPACITY_MULTIPLIER_WHEN_PLAYING_VIDEO)
-  return COBALT_IMAGE_CACHE_CAPACITY_MULTIPLIER_WHEN_PLAYING_VIDEO;
-#else
-  return 1.0f;
-#endif
 }
 
 int Configuration::CobaltSkiaGlyphAtlasWidth() {
@@ -437,18 +359,12 @@
 #endif
     return configuration_api_->CobaltSkiaGlyphAtlasWidth();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_SKIA_GLYPH_ATLAS_WIDTH)
 #error "COBALT_SKIA_GLYPH_ATLAS_WIDTH is deprecated after Starboard version 12."
 #error "Implement CobaltExtensionConfigurationApi::CobaltSkiaGlyphAtlasWidth()"
 #error "instead."
 #endif
   return 2048;
-#elif defined(COBALT_SKIA_GLYPH_ATLAS_WIDTH)
-  return COBALT_SKIA_GLYPH_ATLAS_WIDTH;
-#else
-  return 2048;
-#endif
 }
 
 int Configuration::CobaltSkiaGlyphAtlasHeight() {
@@ -463,7 +379,6 @@
 #endif
     return configuration_api_->CobaltSkiaGlyphAtlasHeight();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_SKIA_GLYPH_ATLAS_HEIGHT)
 #error \
     "COBALT_SKIA_GLYPH_ATLAS_HEIGHT is deprecated after Starboard version 12."
@@ -471,11 +386,6 @@
 #error "instead."
 #endif
   return 2048;
-#elif defined(COBALT_SKIA_GLYPH_ATLAS_HEIGHT)
-  return COBALT_SKIA_GLYPH_ATLAS_HEIGHT;
-#else
-  return 2048;
-#endif
 }
 
 int Configuration::CobaltReduceCpuMemoryBy() {
@@ -489,18 +399,12 @@
 #endif
     return configuration_api_->CobaltReduceCpuMemoryBy();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_REDUCE_CPU_MEMORY_BY)
 #error "COBALT_REDUCE_CPU_MEMORY_BY is deprecated after Starboard version 12."
 #error "Implement CobaltExtensionConfigurationApi::CobaltReduceCpuMemoryBy()"
 #error "instead."
 #endif
   return -1;
-#elif defined(COBALT_REDUCE_CPU_MEMORY_BY)
-  return COBALT_REDUCE_CPU_MEMORY_BY;
-#else
-  return -1;
-#endif
 }
 
 int Configuration::CobaltReduceGpuMemoryBy() {
@@ -514,18 +418,12 @@
 #endif
     return configuration_api_->CobaltReduceGpuMemoryBy();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_REDUCE_GPU_MEMORY_BY)
 #error "COBALT_REDUCE_GPU_MEMORY_BY is deprecated after Starboard version 12."
 #error "Implement CobaltExtensionConfigurationApi::CobaltReduceGpuMemoryBy()"
 #error "instead."
 #endif
   return -1;
-#elif defined(COBALT_REDUCE_GPU_MEMORY_BY)
-  return COBALT_REDUCE_GPU_MEMORY_BY;
-#else
-  return -1;
-#endif
 }
 
 bool Configuration::CobaltGcZeal() {
@@ -539,18 +437,12 @@
 #endif
     return configuration_api_->CobaltGcZeal();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_GC_ZEAL)
 #error "COBALT_GC_ZEAL is deprecated after Starboard version 12."
 #error "Implement CobaltExtensionConfigurationApi::CobaltGcZeal()"
 #error "instead."
 #endif
   return false;
-#elif defined(COBALT_GC_ZEAL)
-  return true;
-#else
-  return false;
-#endif
 }
 
 const char* Configuration::CobaltRasterizerType() {
@@ -566,7 +458,6 @@
 #endif
     return configuration_api_->CobaltRasterizerType();
   }
-#if SB_API_VERSION >= 12
 #if defined(COBALT_FORCE_STUB_RASTERIZER) || \
     defined(COBALT_FORCE_DIRECT_GLES_RASTERIZER)
 #error "COBALT_FORCE_STUB_RASTERIZER and COBALT_FORCE_DIRECT_GLES_RASTERIZER"
@@ -574,13 +465,6 @@
 #error "CobaltExtensionConfigurationApi::CobaltRasterizerType() instead."
 #endif
   return "direct-gles";
-#elif defined(COBALT_FORCE_STUB_RASTERIZER)
-  return "stub";
-#elif defined(COBALT_FORCE_DIRECT_GLES_RASTERIZER)
-  return "direct-gles";
-#else
-  return "hardware";
-#endif
 }
 
 bool Configuration::CobaltEnableJit() {
@@ -594,7 +478,6 @@
 #endif
     return configuration_api_->CobaltEnableJit();
   }
-#if SB_API_VERSION >= 12
 #if defined(ENGINE_SUPPORTS_JIT) || defined(COBALT_DISABLE_JIT)
 #error "ENGINE_SUPPORTS_JIT and COBALT_DISABLE_JIT are deprecated after"
 #error "Starboard version 12."
@@ -602,13 +485,6 @@
 #error "instead."
 #endif
   return false;
-#elif defined(ENGINE_SUPPORTS_JIT)
-  return true;
-#elif defined(COBALT_DISABLE_JIT)
-  return false;
-#else
-  return false;
-#endif
 }
 
 }  // namespace configuration
diff --git a/cobalt/configuration/configuration.gyp b/cobalt/configuration/configuration.gyp
deleted file mode 100644
index 42eca51..0000000
--- a/cobalt/configuration/configuration.gyp
+++ /dev/null
@@ -1,158 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'configuration',
-      'type': 'static_library',
-      'sources': [
-        'configuration.cc',
-        'configuration.h',
-      ],
-      'conditions': [
-        ['cobalt_user_on_exit_strategy != ""', {
-          'defines': [
-            'COBALT_USER_ON_EXIT_STRATEGY="<(cobalt_user_on_exit_strategy)"',
-          ],
-        }],
-        ['render_dirty_region_only != -1', {
-          'defines': [
-            'COBALT_RENDER_DIRTY_REGION_ONLY=<(render_dirty_region_only)',
-          ],
-        }],
-        ['cobalt_egl_swap_interval != -1', {
-          'defines': [
-            'COBALT_EGL_SWAP_INTERVAL=<(cobalt_egl_swap_interval)',
-          ],
-        }],
-        ['fallback_splash_screen_url != ""', {
-          'defines': [
-            'COBALT_FALLBACK_SPLASH_SCREEN_URL="<(fallback_splash_screen_url)"',
-          ],
-        }],
-        ['cobalt_enable_quic != -1', {
-          'defines': [
-            'COBALT_ENABLE_QUIC',
-          ],
-        }],
-        ['skia_cache_size_in_bytes != -1', {
-          'defines': [
-            'COBALT_SKIA_CACHE_SIZE_IN_BYTES=<(skia_cache_size_in_bytes)',
-          ],
-        }],
-        ['offscreen_target_cache_size_in_bytes != -1', {
-          'defines': [
-            'COBALT_OFFSCREEN_TARGET_CACHE_SIZE_IN_BYTES=<(offscreen_target_cache_size_in_bytes)',
-          ],
-        }],
-        ['encoded_image_cache_size_in_bytes != -1', {
-          'defines': [
-            'COBALT_ENCODED_IMAGE_CACHE_SIZE_IN_BYTES=<(encoded_image_cache_size_in_bytes)',
-          ],
-        }],
-        ['image_cache_size_in_bytes != -1', {
-          'defines': [
-            'COBALT_IMAGE_CACHE_SIZE_IN_BYTES=<(image_cache_size_in_bytes)',
-          ],
-        }],
-        ['local_font_cache_size_in_bytes != -1', {
-          'defines': [
-            'COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES=<(local_font_cache_size_in_bytes)',
-          ],
-        }],
-        ['remote_font_cache_size_in_bytes != -1', {
-          'defines': [
-            'COBALT_REMOTE_TYPEFACE_CACHE_SIZE_IN_BYTES=<(remote_font_cache_size_in_bytes)',
-          ],
-        }],
-        ['mesh_cache_size_in_bytes != -1', {
-          'conditions': [
-            ['mesh_cache_size_in_bytes == "auto"', {
-              'defines': [
-                'COBALT_MESH_CACHE_SIZE_IN_BYTES=1*1024*1024',
-              ],
-            }, {
-              'defines': [
-                'COBALT_MESH_CACHE_SIZE_IN_BYTES=<(mesh_cache_size_in_bytes)',
-              ],
-            }],
-          ],
-        }],
-        ['image_cache_capacity_multiplier_when_playing_video != ""', {
-          'defines': [
-            'COBALT_IMAGE_CACHE_CAPACITY_MULTIPLIER_WHEN_PLAYING_VIDEO=<(image_cache_capacity_multiplier_when_playing_video)'
-          ],
-        }],
-        ['skia_glyph_atlas_width != -1', {
-          'defines': [
-            'COBALT_SKIA_GLYPH_ATLAS_WIDTH=<(skia_glyph_atlas_width)',
-          ],
-        }],
-        ['skia_glyph_atlas_height != -1', {
-          'defines': [
-            'COBALT_SKIA_GLYPH_ATLAS_HEIGHT=<(skia_glyph_atlas_height)',
-          ],
-        }],
-        ['reduce_cpu_memory_by != -1', {
-          'defines': [
-            'COBALT_REDUCE_CPU_MEMORY_BY=<(reduce_cpu_memory_by)',
-          ],
-        }],
-        ['reduce_gpu_memory_by != -1', {
-          'defines': [
-            'COBALT_REDUCE_GPU_MEMORY_BY=<(reduce_gpu_memory_by)',
-          ],
-        }],
-        ['cobalt_gc_zeal != -1', {
-          'defines': [
-            'COBALT_GC_ZEAL',
-          ],
-        }],
-        ['rasterizer_type != ""', {
-          'conditions': [
-            ['rasterizer_type == "stub"', {
-              'defines': [
-                'COBALT_FORCE_STUB_RASTERIZER',
-              ],
-            }],
-            ['rasterizer_type == "direct-gles"', {
-              'defines': [
-                'COBALT_FORCE_DIRECT_GLES_RASTERIZER',
-              ],
-            }],
-          ],
-        }],
-        ['cobalt_enable_jit != -1', {
-          'conditions': [
-            ['cobalt_enable_jit == 1', {
-              'defines': [ 'ENGINE_SUPPORTS_JIT' ],
-            }, {
-              'defines': [ 'COBALT_DISABLE_JIT' ],
-            }],
-          ],
-        }],
-        ['cobalt_enable_jit != -1', {
-          'conditions': [
-            ['cobalt_enable_jit == 1', {
-              'defines': [ 'ENGINE_SUPPORTS_JIT' ],
-            }, {
-              'defines': [ 'COBALT_DISABLE_JIT' ],
-            }],
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/cobalt/content/fonts/README.md b/cobalt/content/fonts/README.md
index 749c1bc..07d67cb 100644
--- a/cobalt/content/fonts/README.md
+++ b/cobalt/content/fonts/README.md
@@ -26,7 +26,7 @@
 To use this:
   1.  Select one of the package profiles below.
   2.  Add a variable named `cobalt_font_package` in your platform's
-      `gyp_configuration.gypi` file.
+      `platform_configuration/configuration.gni` file.
   3.  Optional: Add package overrides, which can be used to add or remove fonts
       from the package.
 
diff --git a/cobalt/content/fonts/config/android/fonts.xml b/cobalt/content/fonts/config/android/fonts.xml
index 1d10ac1..578c124 100644
--- a/cobalt/content/fonts/config/android/fonts.xml
+++ b/cobalt/content/fonts/config/android/fonts.xml
@@ -165,6 +165,8 @@
     <family>
         <font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansEthiopic-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansEthiopic-VF.ttf</font>
     </family>
     <family>
         <font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font>
@@ -179,6 +181,8 @@
         <font weight="400" style="normal">NotoSansArmenian-Regular.otf</font>
         <font weight="700" style="normal">NotoSansArmenian-Bold.ttf</font>
         <font weight="700" style="normal">NotoSansArmenian-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansArmenian-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansArmenian-VF.ttf</font>
     </family>
     <family>
         <font weight="400" style="normal">NotoSansGeorgian-Regular.ttf</font>
@@ -191,6 +195,8 @@
         <font weight="400" style="normal">NotoSansDevanagariUI-Regular.otf</font>
         <font weight="700" style="normal">NotoSansDevanagariUI-Bold.ttf</font>
         <font weight="700" style="normal">NotoSansDevanagariUI-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansDevanagariUI-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansDevanagariUI-VF.ttf</font>
     </family>
     <!-- Gujarati should come after Devanagari -->
     <family>
@@ -201,32 +207,44 @@
     <family>
         <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansGurmukhiUI-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansGurmukhiUI-VF.ttf</font>
     </family>
     <family>
         <font weight="400" style="normal">NotoSansTamilUI-Regular.ttf</font>
         <font weight="400" style="normal">NotoSansTamilUI-Regular.otf</font>
         <font weight="700" style="normal">NotoSansTamilUI-Bold.ttf</font>
         <font weight="700" style="normal">NotoSansTamilUI-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansTamilUI-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansTamilUI-VF.ttf</font>
     </family>
     <family>
         <font weight="400" style="normal">NotoSansMalayalamUI-Regular.ttf</font>
         <font weight="400" style="normal">NotoSansMalayalamUI-Regular.otf</font>
         <font weight="700" style="normal">NotoSansMalayalamUI-Bold.ttf</font>
         <font weight="700" style="normal">NotoSansMalayalamUI-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansMalayalamUI-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansMalayalamUI-VF.ttf</font>
     </family>
     <family>
         <font weight="400" style="normal">NotoSansBengaliUI-Regular.ttf</font>
         <font weight="400" style="normal">NotoSansBengaliUI-Regular.otf</font>
         <font weight="700" style="normal">NotoSansBengaliUI-Bold.ttf</font>
         <font weight="700" style="normal">NotoSansBengaliUI-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansBengaliUI-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansBengaliUI-VF.ttf</font>
     </family>
     <family>
         <font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansTeluguUI-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansTeluguUI-VF.ttf</font>
     </family>
     <family>
         <font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font>
+        <font weight="400" style="normal">NotoSansKannadaUI-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansKannadaUI-VF.ttf</font>
     </family>
     <family>
         <font weight="400" style="normal">NotoSansOriyaUI-Regular.ttf</font>
@@ -237,6 +255,8 @@
         <font weight="400" style="normal">NotoSansSinhala-Regular.otf</font>
         <font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font>
         <font weight="700" style="normal">NotoSansSinhala-Bold.otf</font>
+        <font weight="400" style="normal">NotoSansSinhala-VF.ttf</font>
+        <font weight="700" style="normal">NotoSansSinhala-VF.ttf</font>
     </family>
     <family>
         <font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font>
diff --git a/cobalt/content/fonts/font_configuration.gni b/cobalt/content/fonts/font_configuration.gni
index d4d25a6..761febe 100644
--- a/cobalt/content/fonts/font_configuration.gni
+++ b/cobalt/content/fonts/font_configuration.gni
@@ -26,7 +26,4 @@
   cobalt_font_package_override_fallback_color_emoji = -1
   cobalt_font_package_override_fallback_emoji = -1
   cobalt_font_package_override_fallback_symbols = -1
-
-  source_font_files_dir = "font_files"
-  copy_font_files = true
 }
diff --git a/cobalt/content/fonts/fonts.gyp b/cobalt/content/fonts/fonts.gyp
deleted file mode 100644
index edf844e..0000000
--- a/cobalt/content/fonts/fonts.gyp
+++ /dev/null
@@ -1,210 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'copy_font_data',
-      'type': 'none',
-      'includes': [ '../../build/contents_dir.gypi' ],
-      'variables': {
-        'source_font_files_dir': 'font_files',
-        'copy_font_files': 1,
-
-        'package_categories': [
-          # These all use late expansion so the conditionals below get evaluated first.
-          'sans-serif=>(package_named_sans_serif)',
-          'serif=>(package_named_serif)',
-          'fcc-captions=>(package_named_fcc_fonts)',
-          'fallback-lang-non-cjk=>(package_fallback_lang_non_cjk)',
-          'fallback-lang-cjk=>(package_fallback_lang_cjk)',
-          'fallback-lang-cjk-low-quality=>(package_fallback_lang_cjk_low_quality)',
-          'fallback-historic=>(package_fallback_historic)',
-          'fallback-color-emoji=>(package_fallback_color_emoji)',
-          'fallback-emoji=>(package_fallback_emoji)',
-          'fallback-symbols=>(package_fallback_symbols)',
-        ],
-
-        'conditions': [
-          # 'unlimited' is deprecated but is mapped to 'standard'
-          # 'expanded' also currently maps to 'standard' but this may change in the future
-          [ 'cobalt_font_package == "standard" or cobalt_font_package == "unlimited" or cobalt_font_package == "expanded"', {
-            'source_font_config_dir': 'config/common',
-
-            'package_named_sans_serif': 4,
-            'package_named_serif': 3,
-            'package_named_fcc_fonts': 2,
-            'package_fallback_lang_non_cjk': 2,
-            'package_fallback_lang_cjk': 1,
-            'package_fallback_lang_cjk_low_quality': 0,
-            'package_fallback_historic': 1,
-            'package_fallback_color_emoji': 1,
-            'package_fallback_emoji': 0,
-            'package_fallback_symbols': 1,
-          }],
-
-          # '10megabytes' and 'limited_with_jp' are deprecated but map to 'limited'
-          [ 'cobalt_font_package == "limited" or cobalt_font_package == "limited_with_jp" or cobalt_font_package == "10megabytes"', {
-            'source_font_config_dir': 'config/common',
-
-            'package_named_sans_serif': 2,
-            'package_named_serif': 0,
-            'package_named_fcc_fonts': 0,
-            'package_fallback_lang_non_cjk': 1,
-            'package_fallback_lang_cjk': 0,
-            'package_fallback_lang_cjk_low_quality': 1,
-            'package_fallback_historic': 0,
-            'package_fallback_color_emoji': 0,
-            'package_fallback_emoji': 1,
-            'package_fallback_symbols': 1,
-          }],
-
-          [ 'cobalt_font_package == "minimal"', {
-            'source_font_config_dir': 'config/common',
-
-            'package_named_sans_serif': 0,
-            'package_named_serif': 0,
-            'package_named_fcc_fonts': 0,
-            'package_fallback_lang_non_cjk': 0,
-            'package_fallback_lang_cjk': 0,
-            'package_fallback_lang_cjk_low_quality': 0,
-            'package_fallback_historic': 0,
-            'package_fallback_color_emoji': 0,
-            'package_fallback_emoji': 0,
-            'package_fallback_symbols': 0,
-          }],
-
-          [ 'cobalt_font_package == "empty"', {
-            'source_font_config_dir': 'config/empty',
-
-            'package_named_sans_serif': 0,
-            'package_named_serif': 0,
-            'package_named_fcc_fonts': 0,
-            'package_fallback_lang_non_cjk': 0,
-            'package_fallback_lang_cjk': 0,
-            'package_fallback_lang_cjk_low_quality': 0,
-            'package_fallback_historic': 0,
-            'package_fallback_color_emoji': 0,
-            'package_fallback_emoji': 0,
-            'package_fallback_symbols': 0,
-          }],
-
-
-          [ 'cobalt_font_package == "android_system"', {
-            # fonts.xml contains a superset of what we expect to find on Android
-            # devices. The Android SbFile implementation falls back to system font
-            # files for those not in cobalt content.
-            'source_font_config_dir': 'config/android',
-
-            # Don't copy font files for Android since it falls back to system
-            # font files for everything listed in fonts.xml.
-            'copy_font_files': 0,
-
-            'package_named_sans_serif': 0,
-            'package_named_serif': 0,
-            'package_named_fcc_fonts': 0,
-            'package_fallback_lang_non_cjk': 0,
-            'package_fallback_lang_cjk': 0,
-            'package_fallback_lang_cjk_low_quality': 0,
-            'package_fallback_historic': 0,
-            'package_fallback_color_emoji': 0,
-            'package_fallback_emoji': 0,
-            'package_fallback_symbols': 0,
-          }],
-
-          [ 'cobalt_font_package_override_named_sans_serif >= 0', {
-            'package_named_sans_serif': '<(cobalt_font_package_override_named_sans_serif)',
-          }],
-          [ 'cobalt_font_package_override_named_serif >= 0', {
-            'package_named_serif': '<(cobalt_font_package_override_named_serif)',
-          }],
-          [ 'cobalt_font_package_override_named_fcc_fonts >= 0', {
-            'package_named_fcc_fonts': '<(cobalt_font_package_override_named_fcc_fonts)',
-          }],
-          [ 'cobalt_font_package_override_fallback_lang_non_cjk >= 0', {
-            'package_fallback_lang_non_cjk': '<(cobalt_font_package_override_fallback_lang_non_cjk)',
-          }],
-          [ 'cobalt_font_package_override_fallback_lang_cjk >= 0', {
-            'package_fallback_lang_cjk': '<(cobalt_font_package_override_fallback_lang_cjk)',
-          }],
-          [ 'cobalt_font_package_override_fallback_lang_cjk_low_quality >= 0', {
-            'package_fallback_lang_cjk_low_quality': '<(cobalt_font_package_override_fallback_lang_cjk_low_quality)',
-          }],
-          [ 'cobalt_font_package_override_fallback_historic >= 0', {
-            'package_fallback_historic': '<(cobalt_font_package_override_fallback_historic)',
-          }],
-          [ 'cobalt_font_package_override_fallback_color_emoji >= 0', {
-            'package_fallback_color_emoji': '<(cobalt_font_package_override_fallback_color_emoji)',
-          }],
-          [ 'cobalt_font_package_override_fallback_emoji >= 0', {
-            'package_fallback_emoji': '<(cobalt_font_package_override_fallback_emoji)',
-          }],
-          [ 'cobalt_font_package_override_fallback_symbols >= 0', {
-            'package_fallback_symbols': '<(cobalt_font_package_override_fallback_symbols)',
-          }],
-        ],
-      },
-
-      'conditions': [
-        [ 'cobalt_font_package == "empty"', {
-          'copies': [{
-            'files': [ 'config/empty/fonts.xml' ],
-            'destination': '<(sb_static_contents_output_data_dir)/fonts/',
-          }],
-        }, {
-          'actions': [
-            {
-              'action_name': 'fonts_xml',
-              'inputs': [
-                  'scripts/filter_fonts.py',
-                  '<(source_font_config_dir)/fonts.xml',
-              ],
-              'outputs': [
-                '<(sb_static_contents_output_data_dir)/fonts/fonts.xml',
-              ],
-              'action': [
-                'python2', 'scripts/filter_fonts.py',
-                '-i', '<(source_font_config_dir)/fonts.xml',
-                '-o', '<(sb_static_contents_output_data_dir)/fonts/fonts.xml',
-                '<@(package_categories)',
-              ],
-            },
-          ],
-
-          'conditions': [
-            [ 'copy_font_files == 0', {
-              'copies': [{
-                # Copy at least the fallback Roboto Subsetted font.
-                'files': [ '<(source_font_files_dir)/Roboto-Regular-Subsetted.woff2' ],
-                'destination': '<(sb_static_contents_output_data_dir)/fonts/',
-              }],
-            }, {
-              'copies': [{
-                # Late expansion so <@(package_categories) is resolved.
-                'files': [ '>!@pymod_do_main(cobalt.content.fonts.scripts.filter_fonts -i <(source_font_config_dir)/fonts.xml -f <(source_font_files_dir) <@(package_categories))' ],
-                'destination': '<(sb_static_contents_output_data_dir)/fonts/',
-              }],
-            }],
-          ],
-        }],
-      ],
-
-      'all_dependent_settings': {
-        'variables': {
-          'content_deploy_subdirs': [ 'fonts' ]
-        }
-      },
-    },
-  ],
-}
diff --git a/cobalt/content/fonts/variables.gni b/cobalt/content/fonts/variables.gni
index 5b7eee4..92d3f0c 100644
--- a/cobalt/content/fonts/variables.gni
+++ b/cobalt/content/fonts/variables.gni
@@ -12,6 +12,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+declare_args() {
+  copy_font_files = true
+  source_font_files_dir = "font_files"
+}
+
 if (cobalt_font_package == "standard") {
   declare_args() {
     source_font_config_dir = "config/common"
diff --git a/cobalt/csp/csp.gyp b/cobalt/csp/csp.gyp
deleted file mode 100644
index 564888d..0000000
--- a/cobalt/csp/csp.gyp
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'csp',
-      'type': 'static_library',
-      'sources': [
-        'content_security_policy.cc',
-        'content_security_policy.h',
-        'crypto.cc',
-        'crypto.h',
-        'directive.cc',
-        'directive.h',
-        'directive_list.cc',
-        'directive_list.h',
-        'media_list_directive.cc',
-        'media_list_directive.h',
-        'parsers.h',
-        'source.cc',
-        'source.h',
-        'source_list.cc',
-        'source_list.h',
-        'source_list_directive.cc',
-        'source_list_directive.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-    },
-
-    {
-      'target_name': 'csp_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'content_security_policy_test.cc',
-        'source_list_test.cc',
-        'source_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'csp',
-        'csp_copy_test_data',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'csp_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'csp_test',
-      ],
-      'variables': {
-        'executable_name': 'csp_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-    {
-      'target_name': 'csp_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<(DEPTH)/cobalt/csp/testdata/',
-        ],
-        'content_test_output_subdir': 'cobalt/csp/testdata/',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/copy_test_data.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/csp/source_list.cc b/cobalt/csp/source_list.cc
index 57117c8..17345f4 100644
--- a/cobalt/csp/source_list.cc
+++ b/cobalt/csp/source_list.cc
@@ -123,12 +123,7 @@
     // This will be our host string if we are not using IPV6.
     host.append(valid_spec.c_str() + parsed.host.begin,
                 valid_spec.c_str() + parsed.host.begin + parsed.host.len);
-#if SB_API_VERSION >= 12 || SB_HAS(IPV6)
-#if SB_API_VERSION >= 12
-    if (SbSocketIsIpv6Supported())
-#endif
-      host = url.HostNoBrackets();
-#endif
+    if (SbSocketIsIpv6Supported()) host = url.HostNoBrackets();
     if (net::HostStringIsLocalhost(host)) {
       return true;
     }
diff --git a/cobalt/csp/testdata/empty.txt b/cobalt/csp/testdata/empty.txt
deleted file mode 100644
index e69de29..0000000
--- a/cobalt/csp/testdata/empty.txt
+++ /dev/null
diff --git a/cobalt/csp/testdata/invalid_hash.html b/cobalt/csp/testdata/invalid_hash.html
deleted file mode 100644
index dc8a14f..0000000
--- a/cobalt/csp/testdata/invalid_hash.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<!--
-  Copyright 2017 The Cobalt Authors. All Rights Reserved.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<html>
-
-<head>
-  <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'sha256-c3uoUQo23pT8hqB5MoAZnI9LiPUc+lWgGBKHfV07iAM=';">
-</head>
-
-<style>
-  body {
-    background-color: #00ff00;
-  }
-</style>
-<body></body>
-</html>
diff --git a/cobalt/csp/testdata/valid_hash.html b/cobalt/csp/testdata/valid_hash.html
deleted file mode 100644
index a06837c..0000000
--- a/cobalt/csp/testdata/valid_hash.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<!--
-  Copyright 2017 The Cobalt Authors. All Rights Reserved.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<html>
-
-<head>
-  <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'sha256-IegLaWGTFJzK5gbj1YVsl+RfqHIqXhXan88eiG9GQwE=';">
-</head>
-
-<style>
-  body {
-    background-color: #00ff00;
-  }
-</style>
-<body></body>
-</html>
diff --git a/cobalt/css_parser/css_parser.gyp b/cobalt/css_parser/css_parser.gyp
deleted file mode 100644
index 11b8c0a..0000000
--- a/cobalt/css_parser/css_parser.gyp
+++ /dev/null
@@ -1,155 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-
-    # Define the platform specific Bison binary.
-    'conditions': [
-      ['host_os=="win"', {
-        'bison_exe': 'win_bison',
-      }, {
-        'bison_exe': 'bison',
-      }],
-    ],
-  },
-
-  'targets': [
-
-    # Generates header files from Bison grammar that are privately included
-    # by CSS scanner and parser.
-    {
-      'target_name': 'css_grammar',
-      'type': 'none',
-      # This target generates header files which may be used by other targets.
-      'hard_dependency': 1,
-      'sources': [
-        'grammar.h',
-        'grammar.y'
-      ],
-      # Generated header files are stored in the intermediate directory
-      # under their module sub-directory.
-      'module_dir': [
-        'cobalt/css_parser',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(SHARED_INTERMEDIATE_DIR)',
-        ],
-      },
-      'rules': [
-        {
-          'rule_name': 'bison',
-          'extension': 'y',
-          'outputs': [
-            # Tokens and types, included by scanner.
-            '<(SHARED_INTERMEDIATE_DIR)/<(_module_dir)/<(RULE_INPUT_ROOT)_generated.h',
-            # LALR(1) parser tables and yy*() functions, included by parser.
-            '<(SHARED_INTERMEDIATE_DIR)/<(_module_dir)/<(RULE_INPUT_ROOT)_impl_generated.h',
-          ],
-          'action': [
-            '<(bison_exe)',
-            '-Wall',
-            '-Werror',
-            '--defines=<(SHARED_INTERMEDIATE_DIR)/<(_module_dir)/<(RULE_INPUT_ROOT)_generated.h',
-            '--output=<(SHARED_INTERMEDIATE_DIR)/<(_module_dir)/<(RULE_INPUT_ROOT)_impl_generated.h',
-            '<(RULE_INPUT_PATH)',
-          ],
-        },
-      ],
-    },
-
-    {
-      'target_name': 'css_parser',
-      'type': 'static_library',
-      'sources': [
-        'animation_shorthand_property_parse_structures.cc',
-        'animation_shorthand_property_parse_structures.h',
-        'background_shorthand_property_parse_structures.cc',
-        'background_shorthand_property_parse_structures.h',
-        'border_shorthand_property_parse_structures.cc',
-        'border_shorthand_property_parse_structures.h',
-        'flex_shorthand_property_parse_structures.cc',
-        'flex_shorthand_property_parse_structures.h',
-        'font_shorthand_property_parse_structures.cc',
-        'font_shorthand_property_parse_structures.h',
-        'margin_or_padding_shorthand.cc',
-        'margin_or_padding_shorthand.h',
-        'parser.cc',
-        'parser.h',
-        'position_parse_structures.cc',
-        'position_parse_structures.h',
-        'property_declaration.h',
-        'ref_counted_util.h',
-        'scanner.cc',
-        'scanner.h',
-        'shadow_property_parse_structures.cc',
-        'shadow_property_parse_structures.h',
-        'string_pool.h',
-        'text_decoration_shorthand_property_parse_structures.cc',
-        'text_decoration_shorthand_property_parse_structures.h',
-        'transition_shorthand_property_parse_structures.cc',
-        'transition_shorthand_property_parse_structures.h',
-        'trivial_string_piece.h',
-        'trivial_type_pairs.h',
-      ],
-      # Scanner exposes UChar32 in a header.
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(DEPTH)/third_party/icu/source/common',
-        ],
-      },
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/cssom/cssom.gyp:cssom',
-        '<(DEPTH)/nb/nb.gyp:nb',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        'css_grammar',
-      ],
-    },
-
-    {
-      'target_name': 'css_parser_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'parser_test.cc',
-        'ref_counted_util_test.cc',
-        'scanner_test.cc',
-        'trivial_string_piece_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'css_grammar',
-        'css_parser',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'css_parser_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'css_parser_test',
-      ],
-      'variables': {
-        'executable_name': 'css_parser_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-  ],
-}
diff --git a/cobalt/css_parser/grammar.y b/cobalt/css_parser/grammar.y
index 6909469..b23041e 100644
--- a/cobalt/css_parser/grammar.y
+++ b/cobalt/css_parser/grammar.y
@@ -394,6 +394,8 @@
 %token kCubicBezierFunctionToken        // cubic-bezier(
 %token kCueFunctionToken                // cue(
 %token kFormatFunctionToken             // format(
+%token kHslFunctionToken                // hsl(
+%token kHslaFunctionToken               // hsla(
 %token kLinearGradientFunctionToken     // linear-gradient(
 %token kLocalFunctionToken              // local(
 %token kMapToMeshFunctionToken          // map-to-mesh(
@@ -2751,6 +2753,25 @@
     $$ = AddRef(
         new cssom::RGBAColorValue(r, g, b, static_cast<uint8>(a * 0xff)));
   }
+  // HSL color model.
+  //   https://www.w3.org/TR/css-color-3/#hsl-color
+  | kHslFunctionToken maybe_whitespace integer comma positive_percentage comma
+      positive_percentage ')' {
+    uint8 h = static_cast<uint8>(ClampToRange(0, 360, $3));
+    $$ = AddRef(cssom::RGBAColorValue::FromHsla(h,
+      MakeScopedRefPtrAndRelease($5), MakeScopedRefPtrAndRelease($7), 0xff)
+        .get());
+  }
+  // HSLA color model.
+  //   https://www.w3.org/TR/css-color-3/#hsla-color
+  | kHslaFunctionToken maybe_whitespace integer comma positive_percentage comma
+      positive_percentage comma alpha')' {
+    uint8 h = static_cast<uint8>(ClampToRange(0, 360, $3));
+    float a = $9;  // Already clamped.
+    $$ = AddRef(cssom::RGBAColorValue::FromHsla(h,
+      MakeScopedRefPtrAndRelease($5), MakeScopedRefPtrAndRelease($7),
+      static_cast<uint8>(a * 0xff)).get());
+  }
   | kAquaToken maybe_whitespace {
     $$ = AddRef(cssom::RGBAColorValue::GetAqua().get());
   }
diff --git a/cobalt/css_parser/parser_test.cc b/cobalt/css_parser/parser_test.cc
index d57b564..3c1d879 100644
--- a/cobalt/css_parser/parser_test.cc
+++ b/cobalt/css_parser/parser_test.cc
@@ -17,6 +17,7 @@
 #include <cmath>
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
@@ -2082,6 +2083,32 @@
   EXPECT_EQ(0xffffffff, background_color->value());
 }
 
+TEST_F(ParserTest, ParsesBackgroundColorHsl) {
+  scoped_refptr<cssom::CSSDeclaredStyleData> style =
+      parser_.ParseStyleDeclarationList(
+          "background-color: hsl(100, 100%, 50%);", source_location_);
+
+  ASSERT_TRUE(style->IsDeclared(cssom::kBackgroundColorProperty));
+  scoped_refptr<cssom::RGBAColorValue> background_color =
+      dynamic_cast<cssom::RGBAColorValue*>(
+          style->GetPropertyValue(cssom::kBackgroundColorProperty).get());
+  ASSERT_TRUE(background_color);
+  EXPECT_EQ(0x54ff00ff, background_color->value());
+}
+
+TEST_F(ParserTest, ParsesBackgroundColorHsla) {
+  scoped_refptr<cssom::CSSDeclaredStyleData> style =
+      parser_.ParseStyleDeclarationList(
+          "background-color: hsla(100, 100%, 50%, 0.8);", source_location_);
+
+  ASSERT_TRUE(style->IsDeclared(cssom::kBackgroundColorProperty));
+  scoped_refptr<cssom::RGBAColorValue> background_color =
+      dynamic_cast<cssom::RGBAColorValue*>(
+          style->GetPropertyValue(cssom::kBackgroundColorProperty).get());
+  ASSERT_TRUE(background_color);
+  EXPECT_EQ(0x54ff00cc, background_color->value());
+}
+
 TEST_F(ParserTest, ParsesBackgroundColorWithKeywordAqua) {
   scoped_refptr<cssom::CSSDeclaredStyleData> style =
       parser_.ParseStyleDeclarationList("background-color: aqua;",
diff --git a/cobalt/css_parser/scanner.cc b/cobalt/css_parser/scanner.cc
index 132dbcb..289dd87 100644
--- a/cobalt/css_parser/scanner.cc
+++ b/cobalt/css_parser/scanner.cc
@@ -14,8 +14,6 @@
 
 #include "cobalt/css_parser/scanner.h"
 
-#include "starboard/client_porting/cwrappers/pow_wrapper.h"
-
 #include <limits>
 
 #include "base/strings/string_util.h"
@@ -29,6 +27,7 @@
 #include "cobalt/cssom/media_type_names.h"
 #include "cobalt/cssom/pseudo_class_names.h"
 #include "cobalt/cssom/pseudo_element_names.h"
+#include "starboard/client_porting/cwrappers/pow_wrapper.h"
 #include "third_party/icu/source/common/unicode/unistr.h"
 
 namespace cobalt {
@@ -2606,6 +2605,12 @@
         *known_function_token = kCueFunctionToken;
         return true;
       }
+      if (IsAsciiAlphaCaselessEqual(name.begin[0], 'h') &&
+          IsAsciiAlphaCaselessEqual(name.begin[1], 's') &&
+          IsAsciiAlphaCaselessEqual(name.begin[2], 'l')) {
+        *known_function_token = kHslFunctionToken;
+        return true;
+      }
       if (IsAsciiAlphaCaselessEqual(name.begin[0], 'n') &&
           IsAsciiAlphaCaselessEqual(name.begin[1], 'o') &&
           IsAsciiAlphaCaselessEqual(name.begin[2], 't')) {
@@ -2631,6 +2636,10 @@
         *known_function_token = kCalcFunctionToken;
         return true;
       }
+      if (IsEqualToCssIdentifier(name.begin, "hsla")) {
+        *known_function_token = kHslaFunctionToken;
+        return true;
+      }
       if (IsEqualToCssIdentifier(name.begin, "rgba")) {
         *known_function_token = kRGBAFunctionToken;
         return true;
diff --git a/cobalt/cssom/BUILD.gn b/cobalt/cssom/BUILD.gn
index fa236c6..6e77b8f 100644
--- a/cobalt/cssom/BUILD.gn
+++ b/cobalt/cssom/BUILD.gn
@@ -305,6 +305,7 @@
     "property_value_is_equal_test.cc",
     "property_value_to_string_test.cc",
     "property_value_visitor_test.cc",
+    "rgba_color_value_test.cc",
     "selector_test.cc",
     "selector_tree_test.cc",
     "selector_visitor_test.cc",
diff --git a/cobalt/cssom/attribute_selector.cc b/cobalt/cssom/attribute_selector.cc
index e53248b..b467613 100644
--- a/cobalt/cssom/attribute_selector.cc
+++ b/cobalt/cssom/attribute_selector.cc
@@ -19,6 +19,36 @@
 namespace cobalt {
 namespace cssom {
 
+namespace {
+
+std::string ValueMatchTypeToString(AttributeSelector::ValueMatchType type) {
+  // The full string isn't necessary. Simply convert the underlying type to
+  // a string.
+  return std::to_string(type);
+}
+
+// Helper function to convert the parameters to a single value.
+std::string GetValue(AttributeSelector::ValueMatchType value_match_type,
+                     const std::string& attribute_value) {
+  return ValueMatchTypeToString(value_match_type) + "_" + attribute_value;
+}
+
+}  // namespace
+
+AttributeSelector::AttributeSelector(const std::string& attribute_name)
+    : SimpleSelector(kAttributeSelector, base::Token(),
+                     base::Token(attribute_name)),
+      value_match_type_(kNoMatch) {}
+
+AttributeSelector::AttributeSelector(const std::string& attribute_name,
+                                     ValueMatchType value_match_type,
+                                     const std::string& attribute_value)
+    : SimpleSelector(kAttributeSelector, base::Token(),
+                     base::Token(attribute_name),
+                     GetValue(value_match_type, attribute_value)),
+      value_match_type_(value_match_type),
+      value_(attribute_value) {}
+
 void AttributeSelector::Accept(SelectorVisitor* visitor) {
   visitor->VisitAttributeSelector(this);
 }
diff --git a/cobalt/cssom/attribute_selector.h b/cobalt/cssom/attribute_selector.h
index 1eaf283..ee8e381 100644
--- a/cobalt/cssom/attribute_selector.h
+++ b/cobalt/cssom/attribute_selector.h
@@ -44,17 +44,10 @@
     kContains,
   };
 
-  explicit AttributeSelector(const std::string& attribute_name)
-      : SimpleSelector(kAttributeSelector, base::Token(),
-                       base::Token(attribute_name)),
-        value_match_type_(kNoMatch) {}
+  explicit AttributeSelector(const std::string& attribute_name);
   AttributeSelector(const std::string& attribute_name,
                     ValueMatchType value_match_type,
-                    const std::string& attribute_value)
-      : SimpleSelector(kAttributeSelector, base::Token(),
-                       base::Token(attribute_name)),
-        value_match_type_(value_match_type),
-        value_(attribute_value) {}
+                    const std::string& attribute_value);
   ~AttributeSelector() override {}
 
   // From Selector.
diff --git a/cobalt/cssom/compound_selector.cc b/cobalt/cssom/compound_selector.cc
index 2825f9e..a47d45b 100644
--- a/cobalt/cssom/compound_selector.cc
+++ b/cobalt/cssom/compound_selector.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <memory>
+#include <utility>
 
 #include "cobalt/cssom/pseudo_element.h"
 #include "cobalt/cssom/selector_visitor.h"
@@ -38,6 +39,12 @@
   if (rhs->text() < lhs->text()) {
     return false;
   }
+  if (lhs->value() < rhs->value()) {
+    return true;
+  }
+  if (rhs->value() < lhs->value()) {
+    return false;
+  }
 
   // Pseudo class selectors may contain compound selectors, which also need to
   // be compared.
diff --git a/cobalt/cssom/cssom.gyp b/cobalt/cssom/cssom.gyp
deleted file mode 100644
index 59ea816..0000000
--- a/cobalt/cssom/cssom.gyp
+++ /dev/null
@@ -1,300 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'cssom',
-      'type': 'static_library',
-      'sources': [
-        'absolute_url_value.cc',
-        'absolute_url_value.h',
-        'active_pseudo_class.cc',
-        'active_pseudo_class.h',
-        'after_pseudo_element.cc',
-        'after_pseudo_element.h',
-        'animation.h',
-        'animation_set.cc',
-        'animation_set.h',
-        'attribute_selector.cc',
-        'attribute_selector.h',
-        'before_pseudo_element.cc',
-        'before_pseudo_element.h',
-        'calc_value.cc',
-        'calc_value.h',
-        'cascade_precedence.h',
-        'cascaded_style.cc',
-        'cascaded_style.h',
-        'character_classification.h',
-        'child_combinator.cc',
-        'child_combinator.h',
-        'class_selector.cc',
-        'class_selector.h',
-        'cobalt_ui_nav_focus_transform_function.cc',
-        'cobalt_ui_nav_focus_transform_function.h',
-        'cobalt_ui_nav_spotlight_transform_function.cc',
-        'cobalt_ui_nav_spotlight_transform_function.h',
-        'color_stop.cc',
-        'color_stop.h',
-        'combinator.cc',
-        'combinator.h',
-        'combinator_visitor.h',
-        'complex_selector.cc',
-        'complex_selector.h',
-        'compound_selector.cc',
-        'compound_selector.h',
-        'computed_style.cc',
-        'computed_style.h',
-        'computed_style_utils.h',
-        'css.cc',
-        'css.h',
-        'css_computed_style_data.cc',
-        'css_computed_style_data.h',
-        'css_computed_style_declaration.cc',
-        'css_computed_style_declaration.h',
-        'css_condition_rule.cc',
-        'css_condition_rule.h',
-        'css_declaration_data.h',
-        'css_declaration_util.cc',
-        'css_declaration_util.h',
-        'css_declared_style_data.cc',
-        'css_declared_style_data.h',
-        'css_declared_style_declaration.cc',
-        'css_declared_style_declaration.h',
-        'css_font_face_declaration_data.cc',
-        'css_font_face_declaration_data.h',
-        'css_font_face_rule.cc',
-        'css_font_face_rule.h',
-        'css_grouping_rule.cc',
-        'css_grouping_rule.h',
-        'css_keyframe_rule.cc',
-        'css_keyframe_rule.h',
-        'css_keyframes_rule.cc',
-        'css_keyframes_rule.h',
-        'css_media_rule.cc',
-        'css_media_rule.h',
-        'css_parser.h',
-        'css_rule.cc',
-        'css_rule.h',
-        'css_rule_list.cc',
-        'css_rule_list.h',
-        'css_rule_style_declaration.cc',
-        'css_rule_style_declaration.h',
-        'css_rule_visitor.h',
-        'css_style_declaration.cc',
-        'css_style_declaration.h',
-        'css_style_rule.cc',
-        'css_style_rule.h',
-        'css_style_sheet.cc',
-        'css_style_sheet.h',
-        'css_transition.cc',
-        'css_transition.h',
-        'css_transition_set.cc',
-        'css_transition_set.h',
-        'descendant_combinator.cc',
-        'descendant_combinator.h',
-        'empty_pseudo_class.cc',
-        'empty_pseudo_class.h',
-        'filter_function.h',
-        'filter_function_list_value.cc',
-        'filter_function_list_value.h',
-        'focus_pseudo_class.cc',
-        'focus_pseudo_class.h',
-        'following_sibling_combinator.cc',
-        'following_sibling_combinator.h',
-        'font_style_value.cc',
-        'font_style_value.h',
-        'font_weight_value.cc',
-        'font_weight_value.h',
-        'hover_pseudo_class.cc',
-        'hover_pseudo_class.h',
-        'id_selector.cc',
-        'id_selector.h',
-        'integer_value.cc',
-        'integer_value.h',
-        'interpolate_property_value.cc',
-        'interpolate_property_value.h',
-        'interpolated_transform_property_value.cc',
-        'interpolated_transform_property_value.h',
-        'keyword_names.cc',
-        'keyword_names.h',
-        'keyword_value.cc',
-        'keyword_value.h',
-        'length_value.cc',
-        'length_value.h',
-        'linear_gradient_value.cc',
-        'linear_gradient_value.h',
-        'list_value.h',
-        'local_src_value.cc',
-        'local_src_value.h',
-        'map_to_mesh_function.cc',
-        'map_to_mesh_function.h',
-        'matrix_function.cc',
-        'matrix_function.h',
-        'media_feature.cc',
-        'media_feature.h',
-        'media_feature_keyword_value.cc',
-        'media_feature_keyword_value.h',
-        'media_feature_keyword_value_names.cc',
-        'media_feature_keyword_value_names.h',
-        'media_feature_names.cc',
-        'media_feature_names.h',
-        'media_list.cc',
-        'media_list.h',
-        'media_query.cc',
-        'media_query.h',
-        'media_type_names.cc',
-        'media_type_names.h',
-        'mutation_observer.h',
-        'next_sibling_combinator.cc',
-        'next_sibling_combinator.h',
-        'not_pseudo_class.cc',
-        'not_pseudo_class.h',
-        'number_value.cc',
-        'number_value.h',
-        'percentage_value.cc',
-        'percentage_value.h',
-        'property_definitions.cc',
-        'property_definitions.h',
-        'property_key_list_value.cc',
-        'property_key_list_value.h',
-        'property_list_value.h',
-        'property_value.h',
-        'property_value_visitor.cc',
-        'property_value_visitor.h',
-        'pseudo_class.h',
-        'pseudo_class_names.cc',
-        'pseudo_class_names.h',
-        'pseudo_element.h',
-        'pseudo_element_names.cc',
-        'pseudo_element_names.h',
-        'radial_gradient_value.cc',
-        'radial_gradient_value.h',
-        'ratio_value.cc',
-        'ratio_value.h',
-        'resolution_value.cc',
-        'resolution_value.h',
-        'rgba_color_value.cc',
-        'rgba_color_value.h',
-        'rotate_function.cc',
-        'rotate_function.h',
-        'scale_function.cc',
-        'scale_function.h',
-        'scoped_list_value.h',
-        'scoped_ref_list_value.h',
-        'selector.h',
-        'selector_tree.cc',
-        'selector_tree.h',
-        'selector_visitor.h',
-        'shadow_value.cc',
-        'shadow_value.h',
-        'simple_selector.h',
-        'specificity.cc',
-        'specificity.h',
-        'serializer.cc',
-        'serializer.h',
-        'string_value.cc',
-        'string_value.h',
-        'style_sheet.cc',
-        'style_sheet.h',
-        'style_sheet_list.cc',
-        'style_sheet_list.h',
-        'testing/mock_css_parser.h',
-        'time_list_value.cc',
-        'time_list_value.h',
-        'timing_function.cc',
-        'timing_function.h',
-        'timing_function_list_value.cc',
-        'timing_function_list_value.h',
-        'transform_function.h',
-        'transform_function_list_value.cc',
-        'transform_function_list_value.h',
-        'transform_function_visitor.h',
-        'transform_property_value.h',
-        'translate_function.cc',
-        'translate_function.h',
-        'type_selector.cc',
-        'type_selector.h',
-        'unicode_range_value.cc',
-        'unicode_range_value.h',
-        'universal_selector.cc',
-        'universal_selector.h',
-        'user_agent_style_sheet.cc',
-        'user_agent_style_sheet.h',
-        'url_src_value.cc',
-        'url_src_value.h',
-        'url_value.cc',
-        'url_value.h',
-        'viewport_size.h',
-      ],
-      'export_dependent_settings': [
-        # Additionally, ensure that the include directories for generated
-        # headers are put on the include directories for targets that depend
-        # on this one.
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-        '<(DEPTH)/cobalt/dom/dom_exception.gyp:dom_exception',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-        '<(DEPTH)/cobalt/ui_navigation/ui_navigation.gyp:ui_navigation',
-        '<(DEPTH)/url/url.gyp:url',
-        'embed_resources_as_header_files',
-      ],
-    },
-
-    {
-      # This target takes all files in the embedded_resources directory (e.g.
-      # the user agent style sheet) and embeds them as header files for
-      # inclusion into the binary.
-      'target_name': 'embed_resources_as_header_files',
-      'type': 'none',
-      # Because we generate a header, we must set the hard_dependency flag.
-      'hard_dependency': 1,
-      'variables': {
-        'script_path': '<(DEPTH)/cobalt/build/generate_data_header.py',
-        'output_path': '<(SHARED_INTERMEDIATE_DIR)/cobalt/cssom/embedded_resources.h',
-        'input_directory': 'embedded_resources',
-      },
-      'sources': [
-        '<(input_directory)/user_agent_style_sheet.css',
-      ],
-      'actions': [
-        {
-          'action_name': 'embed_resources_as_header_files',
-          'inputs': [
-            '<(script_path)',
-            '<@(_sources)',
-          ],
-          'outputs': [
-            '<(output_path)',
-          ],
-          'action': ['python2', '<(script_path)', 'CSSOMEmbeddedResources', '<(output_path)', '<(input_directory)'],
-          'message': 'Embedding cssom resources in "<(input_directory)" into header file, "<(output_path)".',
-        },
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(SHARED_INTERMEDIATE_DIR)',
-        ],
-      },
-    },
-  ],
-}
diff --git a/cobalt/cssom/cssom_test.gyp b/cobalt/cssom/cssom_test.gyp
deleted file mode 100644
index 92fb5d6..0000000
--- a/cobalt/cssom/cssom_test.gyp
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'cssom_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'cascade_precedence_test.cc',
-        'cascaded_style_test.cc',
-        'computed_style_test.cc',
-        'css_computed_style_data_property_set_matcher_test.cc',
-        'css_computed_style_data_test.cc',
-        'css_computed_style_declaration_test.cc',
-        'css_declared_style_data_test.cc',
-        'css_declared_style_declaration_test.cc',
-        'css_font_face_declaration_data_test.cc',
-        'css_font_face_rule_test.cc',
-        'css_grouping_rule_test.cc',
-        'css_property_definitions_test.cc',
-        'css_rule_list_test.cc',
-        'css_rule_visitor_test.cc',
-        'css_style_sheet_test.cc',
-        'css_transition_set_test.cc',
-        'interpolate_property_value_test.cc',
-        'keyword_value_test.cc',
-        'media_feature_test.cc',
-        'media_list_test.cc',
-        'media_query_test.cc',
-        'property_value_is_equal_test.cc',
-        'property_value_to_string_test.cc',
-        'property_value_visitor_test.cc',
-        'selector_test.cc',
-        'selector_tree_test.cc',
-        'selector_visitor_test.cc',
-        'serializer_test.cc',
-        'specificity_test.cc',
-        'style_sheet_list_test.cc',
-        'timing_function_test.cc',
-        'transform_function_visitor_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/css_parser/css_parser.gyp:css_parser',
-        '<(DEPTH)/cobalt/cssom/cssom.gyp:cssom',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'cssom_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'cssom_test',
-      ],
-      'variables': {
-        'executable_name': 'cssom_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/cssom/rgba_color_value.cc b/cobalt/cssom/rgba_color_value.cc
index 5a797c2..be81d94 100644
--- a/cobalt/cssom/rgba_color_value.cc
+++ b/cobalt/cssom/rgba_color_value.cc
@@ -85,6 +85,60 @@
   DISALLOW_COPY_AND_ASSIGN(NonTrivialStaticFields);
 };
 
+// Algorithm is adapted from
+// https://github.com/google/closure-library/blob/master/closure/goog/color/color.js#L297
+static float HueToRgb(float p, float q, float hue) {
+  const float one_sixth = 1.f / 6;
+  const float half = 1.f / 2;
+  const float two_third = 2.f / 3;
+
+  if (hue < 0) hue += 1;
+  if (hue > 1) hue -= 1;
+  if (hue < one_sixth) return p + (q - p) * 6 * hue;
+  if (hue < half) return q;
+  if (hue < two_third) return p + (q - p) * (two_third - hue) * 6;
+  return p;
+}
+
+scoped_refptr<RGBAColorValue> RGBAColorValue::FromHsla(int h, float s, float l,
+                                                       uint8 a) {
+  DCHECK_GE(h, 0);
+  DCHECK_LE(h, 360);
+  DCHECK_GE(s, 0);
+  DCHECK_LE(s, 1);
+  DCHECK_GE(l, 0);
+  DCHECK_LE(l, 1);
+
+  float h_norm = static_cast<float>(h) / 360;
+
+  float r = 0;
+  float g = 0;
+  float b = 0;
+
+  if (fabs(s) < 0.0000001) {
+    r = l;
+    g = l;
+    b = l;
+  } else {
+    float q = (l < 0.5) ? l * (1 + s) : l + s - l * s;
+    float p = 2 * l - q;
+
+    const float one_third = 1.f / 3;
+    r = HueToRgb(p, q, h_norm + one_third);
+    g = HueToRgb(p, q, h_norm);
+    b = HueToRgb(p, q, h_norm - one_third);
+  }
+
+  return base::MakeRefCounted<RGBAColorValue>(static_cast<uint8>(r * 0xff),
+                                              static_cast<uint8>(g * 0xff),
+                                              static_cast<uint8>(b * 0xff), a);
+}
+
+scoped_refptr<RGBAColorValue> RGBAColorValue::FromHsla(
+    int h, cssom::PercentageValue* s, cssom::PercentageValue* l, uint8 a) {
+  return FromHsla(h, s->value(), l->value(), a);
+}
+
 namespace {
 
 base::LazyInstance<NonTrivialStaticFields>::DestructorAtExit
diff --git a/cobalt/cssom/rgba_color_value.h b/cobalt/cssom/rgba_color_value.h
index 764487f..46b77ec 100644
--- a/cobalt/cssom/rgba_color_value.h
+++ b/cobalt/cssom/rgba_color_value.h
@@ -20,6 +20,7 @@
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
 #include "cobalt/base/polymorphic_equatable.h"
+#include "cobalt/cssom/percentage_value.h"
 #include "cobalt/cssom/property_value.h"
 
 namespace cobalt {
@@ -35,7 +36,7 @@
 //   - hsl(120, 75%, 75%)
 //   - fuchsia
 //
-// The data is maintained as a 32 bit integer layed out as RRGGBBAA, with
+// The data is maintained as a 32 bit integer laid out as RRGGBBAA, with
 // the red bytes being the most significant.
 //
 // Applies to properties such as background-color, color, etc.
@@ -61,6 +62,13 @@
   static const scoped_refptr<RGBAColorValue>& GetWhite();
   static const scoped_refptr<RGBAColorValue>& GetYellow();
 
+  static scoped_refptr<RGBAColorValue> FromHsla(int h,
+                                                cssom::PercentageValue* s,
+                                                cssom::PercentageValue* l,
+                                                uint8 a);
+  static scoped_refptr<RGBAColorValue> FromHsla(int h, float s, float l,
+                                                uint8 a);
+
   explicit RGBAColorValue(uint32 value) : value_(value) {}
 
   RGBAColorValue(uint8 r, uint8 g, uint8 b, uint8 a)
diff --git a/cobalt/cssom/rgba_color_value_test.cc b/cobalt/cssom/rgba_color_value_test.cc
new file mode 100644
index 0000000..290b92a
--- /dev/null
+++ b/cobalt/cssom/rgba_color_value_test.cc
@@ -0,0 +1,49 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/cssom/rgba_color_value.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cobalt {
+namespace cssom {
+namespace {
+
+TEST(RgbaColorValueTest, CreateFromHslaAchromatic) {
+  EXPECT_EQ(RGBAColorValue::FromHsla(60, 0, 1, 0xff)->value(), 0xffffffff);
+  EXPECT_EQ(RGBAColorValue::FromHsla(180, 0, 0.8f, 0x00)->value(), 0xcccccc00);
+}
+
+TEST(RgbaColorValueTest, CreateFromHslaBlack) {
+  EXPECT_EQ(RGBAColorValue::FromHsla(60, 1, 0.0, 0xff)->value(), 0x000000ff);
+  EXPECT_EQ(RGBAColorValue::FromHsla(180, 0.5, 0.0, 0xff)->value(), 0x000000ff);
+  EXPECT_EQ(RGBAColorValue::FromHsla(300, 0, 0.0, 0xff)->value(), 0x000000ff);
+}
+
+TEST(RgbaColorValueTest, CreateFromHsla) {
+  // Red
+  EXPECT_EQ(RGBAColorValue::FromHsla(0, 1.0, 0.5, 0xff)->value(), 0xff0000ff);
+  // Green
+  EXPECT_EQ(RGBAColorValue::FromHsla(120, 1.0, 0.5, 0xff)->value(), 0x00ff00ff);
+  // Blue
+  EXPECT_EQ(RGBAColorValue::FromHsla(240, 1.0, 0.5, 0xff)->value(), 0x0000ffff);
+  // Red
+  EXPECT_EQ(RGBAColorValue::FromHsla(360, 1.0, 0.5, 0xff)->value(), 0xff0000ff);
+
+  // Black
+}
+
+}  // namespace
+}  // namespace cssom
+}  // namespace cobalt
diff --git a/cobalt/cssom/simple_selector.h b/cobalt/cssom/simple_selector.h
index 11b6c70..d8f9063 100644
--- a/cobalt/cssom/simple_selector.h
+++ b/cobalt/cssom/simple_selector.h
@@ -15,6 +15,8 @@
 #ifndef COBALT_CSSOM_SIMPLE_SELECTOR_H_
 #define COBALT_CSSOM_SIMPLE_SELECTOR_H_
 
+#include <string>
+
 #include "base/compiler_specific.h"
 #include "cobalt/base/token.h"
 #include "cobalt/cssom/combinator.h"
@@ -40,7 +42,10 @@
 class SimpleSelector : public Selector {
  public:
   SimpleSelector(SimpleSelectorType type, base::Token prefix, base::Token text)
-      : type_(type), prefix_(prefix), text_(text) {}
+      : type_(type), prefix_(prefix), text_(text), value_("") {}
+  SimpleSelector(SimpleSelectorType type, base::Token prefix, base::Token text,
+                 const std::string& value)
+      : type_(type), prefix_(prefix), text_(text), value_(value) {}
   ~SimpleSelector() override {}
 
   // From Selector.
@@ -54,6 +59,7 @@
   // Returns token representation of the selector.
   base::Token prefix() const { return prefix_; }
   base::Token text() const { return text_; }
+  base::Token value() const { return base::Token(value_); }
 
   virtual PseudoElement* AsPseudoElement() { return NULL; }
   virtual UniversalSelector* AsUniversalSelector() { return NULL; }
@@ -75,6 +81,7 @@
   SimpleSelectorType type_;
   base::Token prefix_;
   base::Token text_;
+  std::string value_;
 };
 
 }  // namespace cssom
diff --git a/cobalt/debug/BUILD.gn b/cobalt/debug/BUILD.gn
index 567027e..a329978 100644
--- a/cobalt/debug/BUILD.gn
+++ b/cobalt/debug/BUILD.gn
@@ -60,11 +60,11 @@
   ]
   deps = [
     ":console_command_manager",
-    ":copy_backend_web_files",
-    ":copy_console_web_files",
-    ":copy_remote_web_files",
     "//cobalt/base",
     "//cobalt/cssom",
+    "//cobalt/debug/backend/content:copy_backend_web_files",
+    "//cobalt/debug/console/content:copy_console_web_files",
+    "//cobalt/debug/remote/content:copy_remote_web_files",
     "//cobalt/dom",
     "//cobalt/layout",
     "//cobalt/math",
@@ -91,53 +91,3 @@
     deps = [ "//cobalt/base" ]
   }
 }
-
-copy("copy_backend_web_files") {
-  install_content = true
-
-  sources = [
-    "backend/content/css_agent.js",
-    "backend/content/dom_agent.js",
-    "backend/content/overlay_agent.js",
-  ]
-
-  # Canonically this should be "cobalt/debug/backend" to match the source
-  # path, but we put it in the root of the content dir to reduce depth.
-  outputs = [ "$sb_static_contents_output_data_dir/web/debug_backend/{{source_file_part}}" ]
-}
-
-copy("copy_console_web_files") {
-  sources = [
-    "console/content/command_input.js",
-    "console/content/console_manager.js",
-    "console/content/console_values.js",
-    "console/content/debug_commands.js",
-    "console/content/debug_console.css",
-    "console/content/debug_console.html",
-    "console/content/debug_console.js",
-    "console/content/debugger_client.js",
-    "console/content/media_console.js",
-    "console/content/media_console_context.js",
-    "console/content/message_log.js",
-    "console/content/pirate.jpg",
-  ]
-
-  # Canonically this should be "cobalt/debug/console" to match the source
-  # path, but we put it in the root of the content dir to reduce depth.
-  outputs = [ "$sb_static_contents_output_data_dir/web/debug_console/{{source_file_part}}" ]
-}
-
-copy("copy_remote_web_files") {
-  sources = [
-    "remote/content/cobalt-logo-180.png",
-    "remote/content/favicon.ico",
-    "remote/content/index.html",
-    "remote/content/json/index.json",
-  ]
-
-  # Canonically this should be "cobalt/debug/remote" to match the source
-  # path, but we put it in the root of the content dir to reduce depth.
-  outputs = [
-    "$sb_static_contents_output_data_dir/web/debug_remote/{{source_file_part}}",
-  ]
-}
diff --git a/cobalt/debug/backend/content/BUILD.gn b/cobalt/debug/backend/content/BUILD.gn
new file mode 100644
index 0000000..a56ef43
--- /dev/null
+++ b/cobalt/debug/backend/content/BUILD.gn
@@ -0,0 +1,27 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+copy("copy_backend_web_files") {
+  install_content = true
+
+  sources = [
+    "css_agent.js",
+    "dom_agent.js",
+    "overlay_agent.js",
+  ]
+
+  # Canonically this should be "cobalt/debug/backend" to match the source
+  # path, but we put it in the root of the content dir to reduce depth.
+  outputs = [ "$sb_static_contents_output_data_dir/web/debug_backend/{{source_target_relative}}" ]
+}
diff --git a/cobalt/debug/backend/debug_module.cc b/cobalt/debug/backend/debug_module.cc
index a7fe6ab..b597002 100644
--- a/cobalt/debug/backend/debug_module.cc
+++ b/cobalt/debug/backend/debug_module.cc
@@ -82,8 +82,8 @@
                          render_tree::ResourceProvider* resource_provider,
                          dom::Window* window, DebuggerState* debugger_state,
                          base::MessageLoop* message_loop) {
-  ConstructionData data(debugger_hooks, global_environment,
-                        message_loop, render_overlay, resource_provider, window,
+  ConstructionData data(debugger_hooks, global_environment, message_loop,
+                        render_overlay, resource_provider, window,
                         debugger_state);
   Build(data);
 }
@@ -104,23 +104,17 @@
   DCHECK(data.message_loop);
 
   if (base::MessageLoop::current() == data.message_loop) {
-    BuildInternal(data, NULL);
+    BuildInternal(data);
   } else {
-    base::WaitableEvent created(
-        base::WaitableEvent::ResetPolicy::MANUAL,
-        base::WaitableEvent::InitialState::NOT_SIGNALED);
-    data.message_loop->task_runner()->PostTask(
+    data.message_loop->task_runner()->PostBlockingTask(
         FROM_HERE,
-        base::Bind(&DebugModule::BuildInternal, base::Unretained(this), data,
-                   base::Unretained(&created)));
-    created.Wait();
+        base::Bind(&DebugModule::BuildInternal, base::Unretained(this), data));
   }
 
   DCHECK(debug_dispatcher_);
 }
 
-void DebugModule::BuildInternal(const ConstructionData& data,
-                                base::WaitableEvent* created) {
+void DebugModule::BuildInternal(const ConstructionData& data) {
   DCHECK(base::MessageLoop::current() == data.message_loop);
   DCHECK(data.global_environment);
   DCHECK(data.render_overlay);
@@ -194,10 +188,6 @@
   tracing_agent_->Thaw(RemoveAgentState(kTracingAgent, agents_state));
 
   is_frozen_ = false;
-
-  if (created) {
-    created->Signal();
-  }
 }
 
 std::unique_ptr<DebuggerState> DebugModule::Freeze() {
diff --git a/cobalt/debug/backend/debug_module.h b/cobalt/debug/backend/debug_module.h
index 2e3aa91..da1778a 100644
--- a/cobalt/debug/backend/debug_module.h
+++ b/cobalt/debug/backend/debug_module.h
@@ -16,9 +16,9 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/message_loop/message_loop.h"
-#include "base/synchronization/waitable_event.h"
 #include "cobalt/base/debugger_hooks.h"
 #include "cobalt/debug/backend/css_agent.h"
 #include "cobalt/debug/backend/debug_backend.h"
@@ -108,8 +108,7 @@
   void Build(const ConstructionData& data);
 
   // Signals |created| when done, if not NULL.
-  void BuildInternal(const ConstructionData& data,
-                     base::WaitableEvent* created);
+  void BuildInternal(const ConstructionData& data);
 
   // Sends a protocol event to the frontend through |DebugDispatcher|.
   void SendEvent(const std::string& method, const std::string& params);
diff --git a/cobalt/debug/console/content/BUILD.gn b/cobalt/debug/console/content/BUILD.gn
new file mode 100644
index 0000000..bf89678
--- /dev/null
+++ b/cobalt/debug/console/content/BUILD.gn
@@ -0,0 +1,36 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+copy("copy_console_web_files") {
+  install_content = true
+
+  sources = [
+    "command_input.js",
+    "console_manager.js",
+    "console_values.js",
+    "debug_commands.js",
+    "debug_console.css",
+    "debug_console.html",
+    "debug_console.js",
+    "debugger_client.js",
+    "media_console.js",
+    "media_console_context.js",
+    "message_log.js",
+    "pirate.jpg",
+  ]
+
+  # Canonically this should be "cobalt/debug/console" to match the source
+  # path, but we put it in the root of the content dir to reduce depth.
+  outputs = [ "$sb_static_contents_output_data_dir/web/debug_console/{{source_target_relative}}" ]
+}
diff --git a/cobalt/debug/debug.gyp b/cobalt/debug/debug.gyp
deleted file mode 100644
index 75b9bec..0000000
--- a/cobalt/debug/debug.gyp
+++ /dev/null
@@ -1,143 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'debug',
-      'type': 'static_library',
-      'sources': [
-        'backend/agent_base.cc',
-        'backend/agent_base.h',
-        'backend/command_map.h',
-        'backend/css_agent.cc',
-        'backend/css_agent.h',
-        'backend/debug_backend.cc',
-        'backend/debug_backend.h',
-        'backend/debug_dispatcher.cc',
-        'backend/debug_dispatcher.h',
-        'backend/debug_module.cc',
-        'backend/debug_module.h',
-        'backend/debug_script_runner.cc',
-        'backend/debug_script_runner.h',
-        'backend/debugger_hooks_impl.cc',
-        'backend/debugger_hooks_impl.h',
-        'backend/dom_agent.cc',
-        'backend/dom_agent.h',
-        'backend/log_agent.cc',
-        'backend/log_agent.h',
-        'backend/overlay_agent.cc',
-        'backend/overlay_agent.h',
-        'backend/page_agent.cc',
-        'backend/page_agent.h',
-        'backend/render_layer.cc',
-        'backend/render_layer.h',
-        'backend/render_overlay.cc',
-        'backend/render_overlay.h',
-        'backend/script_debugger_agent.cc',
-        'backend/script_debugger_agent.h',
-        'backend/tracing_agent.cc',
-        'backend/tracing_agent.h',
-        'command.h',
-        'console/debug_hub.cc',
-        'console/debug_hub.h',
-        'console/debugger_event_target.cc',
-        'console/debugger_event_target.h',
-        'debug_client.cc',
-        'debug_client.h',
-        'json_object.cc',
-        'json_object.h',
-        'remote/debug_web_server.cc',
-        'remote/debug_web_server.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/script/script.gyp:script',
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-        '<(DEPTH)/net/net.gyp:http_server',
-        '<(DEPTH)/third_party/devtools/devtools.gyp:devtools',
-        'console_command_manager',
-        'copy_backend_web_files',
-        'copy_console_web_files',
-        'copy_remote_web_files',
-      ],
-    },
-
-    {
-      # Anything that implements a console command can depend on this without
-      # depending on the whole debug module.
-      'target_name': 'console_command_manager',
-      'type': 'static_library',
-      'conditions': [
-        # Everything is conditional so implementers of commands can depend on
-        # this unconditionally.
-        ['enable_debugger == 1', {
-          'sources': [
-            'console/command_manager.cc',
-            'console/command_manager.h',
-          ],
-          'dependencies': [
-            '<(DEPTH)/cobalt/base/base.gyp:base',
-          ],
-        }],
-      ],
-    },
-
-    {
-      'target_name': 'copy_backend_web_files',
-      'type': 'none',
-      'variables': {
-        'content_web_input_files': [
-          '<(DEPTH)/cobalt/debug/backend/content/',
-        ],
-        # Canonically this should be "cobalt/debug/backend" to match the source
-        # path, but we put it in the root of the content dir to reduce depth.
-        'content_web_output_subdir': 'debug_backend',
-      },
-      'includes': [ '<(DEPTH)/cobalt/build/copy_web_data.gypi' ],
-    },
-
-    {
-      'target_name': 'copy_console_web_files',
-      'type': 'none',
-      'variables': {
-        'content_web_input_files': [
-          '<(DEPTH)/cobalt/debug/console/content/',
-        ],
-        # Canonically this should be "cobalt/debug/console" to match the source
-        # path, but we put it in the root of the content dir to reduce depth.
-        'content_web_output_subdir': 'debug_console',
-      },
-      'includes': [ '<(DEPTH)/cobalt/build/copy_web_data.gypi' ],
-    },
-
-    {
-      'target_name': 'copy_remote_web_files',
-      'type': 'none',
-      'variables': {
-        'content_web_input_files': [
-          '<(DEPTH)/cobalt/debug/remote/content/',
-        ],
-        # Canonically this should be "cobalt/debug/remote" to match the source
-        # path, but we put it in the root of the content dir to reduce depth.
-        'content_web_output_subdir': 'debug_remote',
-      },
-      'includes': [ '<(DEPTH)/cobalt/build/copy_web_data.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/debug/remote/content/BUILD.gn b/cobalt/debug/remote/content/BUILD.gn
new file mode 100644
index 0000000..29aa8a0
--- /dev/null
+++ b/cobalt/debug/remote/content/BUILD.gn
@@ -0,0 +1,28 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+copy("copy_remote_web_files") {
+  install_content = true
+
+  sources = [
+    "cobalt-logo-180.png",
+    "favicon.ico",
+    "index.html",
+    "json/index.json",
+  ]
+
+  # Canonically this should be "cobalt/debug/remote" to match the source
+  # path, but we put it in the root of the content dir to reduce depth.
+  outputs = [ "$sb_static_contents_output_data_dir/web/debug_remote/{{source_target_relative}}" ]
+}
diff --git a/cobalt/demos/content/hybrid-navigation/hybrid-navigation-grid-rtl.html b/cobalt/demos/content/hybrid-navigation/hybrid-navigation-grid-rtl.html
new file mode 100644
index 0000000..672141c
--- /dev/null
+++ b/cobalt/demos/content/hybrid-navigation/hybrid-navigation-grid-rtl.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html>
+<!--
+ | This demo demonstrates how scroll container should behave in RTL mode.
+ -->
+<html>
+  <head>
+    <style>
+      body {
+        background-color: rgb(25,25,25);
+        color: rgb(200,200,200);
+        width: 1920px;
+        height: 720px;
+      }
+
+      .vscroll {
+        overflow: auto;
+        position: absolute;
+        transform: translate(100px,100px);
+        background-color: rgb(50,50,50);
+        width: 1080px;
+        height: 520px;
+      }
+
+      .hscroll {
+        overflow: auto;
+        position: relative;
+        background-color: rgb(75, 75, 75);
+        width: 1080px;
+        height: 320px;
+      }
+
+      /*
+       * focusItem is used as the actual focusable item. Its dimensions are
+       * static so that the underlying SbUiNavigation system knows how much to
+       * scroll to ensure it is fully visible. The scroll animation is usually
+       * calculated to bring the to-be-focused item into view, but if that item
+       * is resized after the animation starts, then the animation may no
+       * longer end with the larger item in full view.
+       */
+      .focusItem {
+        overflow: hidden;
+        position: absolute;
+        width: 300px;
+        height: 300px;
+        outline: none;
+      }
+
+      /*
+       * focusContent will react to focus changes. Its size will grow when
+       * its parent receives focus.
+       */
+      .focusContent {
+        overflow: hidden;
+        margin: 20px;
+        border: 5px solid rgb(0,0,0);
+        width: 250px;
+        height: 250px;
+        line-height: 250px;
+        text-align: center;
+        vertical-align: middle;
+        font-size: 100px;
+
+        /*
+         * The user may be scrolling through items quickly. Use a transition
+         * delay so that the transition is shown once the user settles on a
+         * focus item.
+         */
+        transition: transform 0.5s;
+        transition-delay: 0.1s;
+      }
+
+      /*
+       * Update focusContent when the parent is focused.
+       */
+      .focusItem:focus .focusContent {
+        background-color: rgb(240,240,240);
+        color: rgb(0,0,0);
+        transform: -cobalt-ui-nav-focus-transform() scale(1.1);
+      }
+
+      /*
+       * Add a spotlight to focusContent when the parent is focused.
+       */
+      .focusItem:focus .focusContent::after {
+        content: '';
+        position: absolute;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+        background: radial-gradient(rgba(255,0,0,0.5) 0%, rgba(255,0,0,0) 30%);
+        transform: -cobalt-ui-nav-spotlight-transform();
+      }
+    </style>
+  </head>
+
+  <body class="body">
+    <div class="vscroll">
+      <div class="hscroll" dir="rtl">
+        <!--
+         | translateX() should be honored when computing items' position in rtl mode.
+         | The right edge of A0 should be 50px from the right edge of the container when the
+         | page is rendered.
+         | User should be able to scroll items using the entire width of the container,
+         | meaning A0 should be visibly translated from the initial position to the right edge
+         | of the container.
+         | A0 should stop 50px from the right edge of the container when scrolling back to
+         | A0.
+         -->
+        <div id="start" class="focusItem" tabindex="-2" style="transform: translateX(-50px)">
+          <div class="focusContent">A0</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-350px)">
+          <div class="focusContent">A1</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-650px)">
+          <div class="focusContent">A2</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-950px)">
+          <div class="focusContent">A3</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-1250px)">
+          <div class="focusContent">A4</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-1550px)">
+          <div class="focusContent">A5</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-1850px)">
+          <div class="focusContent">A6</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-2150px)">
+          <div class="focusContent">A7</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-2450px)">
+          <div class="focusContent">A8</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-2750px)">
+          <div class="focusContent">A9</div>
+        </div>
+      </div>
+      <div class="hscroll" dir="rtl">
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-50px)">
+          <div class="focusContent">B0</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-350px)">
+          <div class="focusContent">B1</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-650px)">
+          <div class="focusContent">B2</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-950px)">
+          <div class="focusContent">B3</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-1250px)">
+          <div class="focusContent">B4</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-1550px)">
+          <div class="focusContent">B5</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-1850px)">
+          <div class="focusContent">B6</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-2150px)">
+          <div class="focusContent">B7</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-2450px)">
+          <div class="focusContent">B8</div>
+        </div>
+        <div class="focusItem" tabindex="-2" style="transform: translateX(-2750px)">
+          <div class="focusContent">B9</div>
+        </div>
+      </div>
+    </div>
+  </body>
+  <script>
+    window.onload = function() {
+      document.getElementById("start").focus();
+    }
+  </script>
+</html>
diff --git a/cobalt/demos/content/network-status-demo/index.html b/cobalt/demos/content/network-status-demo/index.html
new file mode 100644
index 0000000..944a2d2
--- /dev/null
+++ b/cobalt/demos/content/network-status-demo/index.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+
+<head>
+    <title>Test network status</title>
+</head>
+
+<body style="color: white;">
+    <h1>
+        <span>Network Status Value:</span>
+        <span id="net_stat">n/a</span>
+    </h1>
+
+    <script>
+        window.addEventListener('offline', function (e) {
+            console.log('offline');
+            document.getElementById('net_stat').innerHTML = "False";
+        });
+        window.addEventListener('online', function (e) {
+            console.log('online');
+            document.getElementById('net_stat').innerHTML = "True";
+        });
+    </script>
+</body>
diff --git a/cobalt/demos/content/performance-api-demo/performance-navigation-timing-demo.html b/cobalt/demos/content/performance-api-demo/performance-navigation-timing-demo.html
new file mode 100644
index 0000000..637b110
--- /dev/null
+++ b/cobalt/demos/content/performance-api-demo/performance-navigation-timing-demo.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <title>Performance Navigation Timing Demo</title>
+  <style>
+    body {
+      background-color: rgb(255, 255, 255);
+      color: #0047ab;
+      font-size: 50px;
+    }
+  </style>
+</head>
+
+<body>
+  <script>
+    function LogInfo(info, time) {
+      var message = info + ": " + time;
+      console.log(message);
+      document.getElementById('info').innerHTML += message + ".\n";
+    }
+
+    function path(pathname) {
+      var filename = pathname.substring(pathname.lastIndexOf('/') + 1);
+      return pathname.substring(0, pathname.length - filename.length);
+    }
+
+    function loadImage() {
+      var stored_entries = [];
+      var img_location = document.location.origin + path(document.location.pathname)
+          + "resources/square.png";
+      var img1 = img_location;
+      var img = document.createElement("img");
+      img.src = img1;
+      document.body.appendChild(img);
+    }
+
+    window.addEventListener("load", function() {
+      // Load image for logging resource timing info.
+      loadImage();
+
+      // Log performance time now.
+      let now = window.performance.now();
+      LogInfo("Performance now", now);
+
+      // Get navigation timing entry from performance entry buffer.
+      let navigationTiming = performance.getEntriesByType("navigation")[0];
+
+      // Log performance navigation timing info.
+      LogInfo("Unload event start", navigationTiming.unloadEventStart);
+      LogInfo("Unload event end", navigationTiming.unloadEventEnd);
+      LogInfo("Dom content loaded event start", navigationTiming.domContentLoadedEventStart);
+      LogInfo("Dom content loaded event end", navigationTiming.domContentLoadedEventEnd);
+      LogInfo("Dom complete", navigationTiming.domComplete);
+      LogInfo("Load event start", navigationTiming.loadEventStart);
+      LogInfo("Load event end", navigationTiming.loadEventEnd);
+
+      // Log performance resource timing info.
+      LogInfo("Fetch start", navigationTiming.fetchStart);
+      LogInfo("Connect start", navigationTiming.connectStart);
+      LogInfo("Connect end", navigationTiming.connectEnd);
+      LogInfo("Request start", navigationTiming.requestStart);
+      LogInfo("Response start", navigationTiming.responseStart);
+
+      // Check navigation type.
+      let navigationType = "Navigation type: ";
+      if (navigationTiming.type == PerformanceNavigation.TYPE_NAVIGATE) {
+        console.log(navigationType + "Navigation");
+      } else if (navigationTiming.type == PerformanceNavigation.TYPE_RELOAD) {
+        console.log(navigationType + "Reload");
+      }
+
+    });
+
+  </script>
+  <div>
+    <span id='info' style='white-space: pre; background-color:#00FF00'></span>
+  </div>
+</body>
+
+</html>
diff --git a/cobalt/demos/content/workers-demo/workers-demo.html b/cobalt/demos/content/workers-demo/workers-demo.html
new file mode 100644
index 0000000..2097bf4
--- /dev/null
+++ b/cobalt/demos/content/workers-demo/workers-demo.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <script type="text/javascript">
+        console.log('Starting workers')
+        worker_one = new Worker("console")
+        worker_two = new Worker("console.log")
+        worker_three = new Worker("console.log('foo');")
+        worker_four= new Worker("console.log('bar');")
+    </script>
+</head>
+
+<body style="background-color:#48C">Workers Demo</body>
+
+</html>
diff --git a/cobalt/demos/demos.gyp b/cobalt/demos/demos.gyp
deleted file mode 100644
index 502ec45..0000000
--- a/cobalt/demos/demos.gyp
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'copy_demos',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [ '<(DEPTH)/cobalt/demos/content/' ],
-        'content_test_output_subdir': 'demos',
-      },
-      'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-    },
-  ],
-}
diff --git a/cobalt/doc/memory_tuning.md b/cobalt/doc/memory_tuning.md
index 8f65ee8..662fb59 100644
--- a/cobalt/doc/memory_tuning.md
+++ b/cobalt/doc/memory_tuning.md
@@ -38,7 +38,7 @@
 sub-system, the type, and where it came from.
 
 **SETTING NAME:** This is the name of the memory setting. If a setting can be
-manually set through the command line or the build system, then it will be
+manually set through the command line or Cobalt extension, then it will be
 accessible by using this name. For example adding the command line argument
 `--image_cache_size_in_bytes=25165824` will manually set the Image Cache Size to
 24 megabytes. Also note that this is also equivalent:
@@ -64,9 +64,10 @@
     * `Starboard API`
       * The value used was reported by the result of a Starboard API function call.
       * Example: `SbSystemGetUsedCPUMemory()`
-    * `Build`
-      * Specified by the platform specific `*.gyp(i)` build file.
-      * For example: see `image_cache_size_in_bytes` in [`build/config/base.gypi`](../build/config/base.gypi)
+    * `Configuration Extension`
+      * Specified by the `CobaltExtensionConfigurationApi`.
+      * For example: see `CobaltImageCacheSizeInBytes` in
+        [`cobalt/configuration/configuration.cc`](../configuration/configuration.cc).
     * `CmdLine`
       * Read the memory setting value from the command line.
       * For example: `cobalt --image_cache_size_in_bytes=24MB`.
@@ -110,9 +111,6 @@
  * `CmdLine`
    * `max_cobalt_cpu_usage`: --max_cobalt_cpu_usage was used as a command argument.
    * `max_cobalt_gpu_usage`: --max_cobalt_gpu_usage was used as a command argument.
- * `Build`
-   * `max_cobalt_cpu_usage`: max_cobalt_cpu_usage was specified in a platform gyp file.
-   * `max_cobalt_gpu_usage`: max_cobalt_gpu_usage was specified in a platform gyp file.
 
 **TOTAL**: Represents the maximum available memory for settings. This value
 came from **SOURCE**.
@@ -132,20 +130,10 @@
 
 ## Setting Maximum Memory Values ##
 
-The max cpu and gpu memory of the system can be set either by command line or
-by modifying the gyp build file.
-
-Command Line:
+The max cpu and gpu memory of the system can be set by command line:
   * `--max_cobalt_cpu_usage=160MB`
   * `--max_cobalt_gpu_usage=160MB`
 
-Build settings:
-  * `starboard/<PLATFORM>/gyp_configuration.gypi`
-    * `max_cobalt_cpu_usage`
-    * `max_cobalt_gpu_usage`
-
-Command Line settings will override build settings.
-
 ### Memory Scaling ###
 
 There are two primary ways in which the memory consumption settings will scale down.
@@ -177,20 +165,22 @@
 Let's say that we are configuring platform called "XXX":
 
 We will configure XXX such that:
-  * `image_cache_size_in_bytes` will be set to 32MB in the build settings.
-  * `skia_atlas_texture_dimensions` will be set to `2048x2048x2` in the build settings.
+  * `image_cache_size_in_bytes` will be set to 32MB in the configuration
+     extension.
+  * `skia_atlas_texture_dimensions` will be set to `2048x2048x2` in the
+    configuration extension.
   * `max_cobalt_cpu_usage` will be set to 160MB on the command line.
 
 **Configuring `image_cache_size_in_bytes` to be 32MB:**
-  * in `starboard\<PLATFORM>\gyp_configuration.gypi`
-    * add `'image_cache_size_in_bytes': 32 * 1024 * 1024,`
+
+  * Implement the `CobaltExtensionConfigurationApi` function
+    `CobaltImageCacheSizeInBytes` to return `32 * 1024 * 1024`.
 
 **Configuring `skia_atlas_texture_dimensions` to be 2048x2048x2:**
 
-  * in `src\starboard\XXX\gyp_configuration.gypi`
-    * add `'skia_glyph_atlas_width': '2048'`
-    * add `'skia_glyph_atlas_height': '2048'`
-    * (note that the third dimension is assumed)
+  * Implement the `CobaltExtensionConfigurationApi` functions
+    `CobaltSkiaGlyphAtlasWidth` and `CobaltSkiaGlyphAtlasHeight` to both return
+    `2048`.
 
 **Configuring `max_cobalt_cpu_usage` to be 160MB:**
 
@@ -215,17 +205,17 @@
       CPU Memory settings will scale down their consumption in order to stay under
       the `max_cobalt_cpu_usage`. If memory consumption exceeds this value during
       runtime then a memory warning will be printed to stdout.
-    * Set via command line or else build system or else starboard.
+    * Set via command line or else starboard.
       * starboard value will bind to `SbSystemGetTotalCPUMemory()`.
   * `max_cobalt_gpu_usage`
     * This setting will set the maximum gpu memory that the app will consume.
       GPU Memory settings will scale down their consumption in order to stay under
       the `max_cobalt_gpu_usage`. If memory consumption exceeds this value during
       runtime then a memory warning will be printed to stdout.
-    * Set via command line or else build system or else starboard.
+    * Set via command line or else starboard.
       * starboard value will bind to `SbSystemGetTotalGPUMemory()`.
     * Note that `SbSystemGetTotalGPUMemory()` is optional. If no value exists
-      for `max_cobalt_gpu_usage` in build/commandline/starboard settings then no
+      for `max_cobalt_gpu_usage` in commandline/starboard settings then no
       GPU memory checking is performed.
 
 #### Memory Setting API ####
@@ -233,11 +223,11 @@
   * `image_cache_size_in_bytes`
     * See documentation *Image cache capacity* in `performance_tuning.md` for what
       this setting does.
-    * Set via command line, or else build system, or else automatically by Cobalt.
+    * Set via command line, or else Cobalt extension, or else automatically by Cobalt.
   * `remote_typeface_cache_size_in_bytes`
     * Determines the capacity of the remote typefaces cache which manages all typefaces
       downloaded from a web page.
-    * Set via command line, or else build system, or else automatically by Cobalt.
+    * Set via command line, or else Cobalt extension, or else automatically by Cobalt.
   * `skia_atlas_texture_dimensions`
     * Determines the size in pixels of the glyph atlas where rendered glyphs are
       cached. The resulting memory usage is 2 bytes of GPU memory per pixel.
@@ -247,18 +237,20 @@
       larger, such as for higher resolution displays.
       The negative default values indicates to the Cobalt that these settings
       should be automatically set.
-    * Set via command line, or else build system, or else automatically by Cobalt.
-    * Note that in the gyp build system, this setting is represented as two values:
-      * `skia_glyph_atlas_width` and
-      * `skia_glyph_atlas_height`
+    * Set via command line, or else through the Cobalt configuration extension,
+      or else automatically by Cobalt.
+    * Note that in the Cobalt configuration extension, this setting is
+      represented as two functions:
+      * `CobaltSkiaGlyphAtlasWidth` and
+      * `CobaltSkiaGlyphAtlasHeight`
   * `skia_cache_size_in_bytes`
     * See documentation *Glyph atlas size* in `performance_tuning.md` for what this
       setting does.
-    * Set via command line, or else build system or else automatically by Cobalt.
+    * Set via command line, or else Cobalt extension system or else automatically by Cobalt.
   * `software_surface_cache_size_in_bytes`
     * See documentation *Scratch Surface cache capacity* in `performance_tuning.md`
       for what this setting does.
-    * Set via command line, or else build system, or else automatically by Cobalt.
+    * Set via command line, or else Cobalt extension, or else automatically by Cobalt.
 
 #### Units for Command Line Settings ####
 
diff --git a/cobalt/doc/performance_tuning.md b/cobalt/doc/performance_tuning.md
index 2c29303..b130bcf 100644
--- a/cobalt/doc/performance_tuning.md
+++ b/cobalt/doc/performance_tuning.md
@@ -10,11 +10,8 @@
 has a set of tags keywords to make it easy to search for items related
 to a specific type of performance metric (e.g. "framerate").
 
-Many of the tweaks involve adding a new gyp variable to your platform's
-`gyp_configuration.gypi` file.  The default values for these variables are
-defined in either
-[`base_configuration.gypi`](../../starboard/build/base_configuration.gypi) or
-[`cobalt_configuration.gypi`](../build/cobalt_configuration.gypi).
+Many of the tweaks involve implementing a Cobalt extension and returning
+different values from specific functions.
 
 ### Use a Release Build
 
@@ -39,12 +36,12 @@
 as it can, limited only by the display's refresh rate, which is usually 60Hz.
 By artificially throttling this rate to a lower value, like 30Hz, CPU
 resources can be freed to work on other tasks.  You can enable framerate
-throttling by setting a value for `cobalt_minimum_frame_time_in_milliseconds`
-in your platform's `gyp_configuration.gypi` file.  Setting it to 33, for
-example, will throttle Cobalt's renderer to 30 frames per second.
+throttling by setting a return value for
+`GetMinimumFrameIntervalInMilliseconds` in your platform's Cobalt graphics
+extension.  Setting it to 33, for example, will throttle Cobalt's renderer to
+30 frames per second (as there'll be one frame every 33 milliseconds).
 
-**Tags:** *gyp_configuration.gypi, framerate, startup, browse-to-watch,
-           input latency.*
+**Tags:** *Cobalt extension, framerate, startup, browse-to-watch, input latency.*
 
 
 ### Image cache capacity
@@ -57,12 +54,12 @@
 make more network requests and image decodes for previously seen images.
 Cobalt will automatically set the image cache capacity to a reasonable value,
 but if you wish to override this, you can do so by setting the
-`image_cache_size_in_bytes` variable in your `gyp_configuration.gypi` file.  For
-the YouTube web app, we have found that at 1080p, 32MB will allow around
+`CobaltImageCacheSizeInBytes` function in your Cobalt configuration extension.
+For the YouTube web app, we have found that at 1080p, 32MB will allow around
 5 thumbnail shelves to stay resident at a time, with 720p and 4K resolutions
 using proportionally less and more memory, respectively.
 
-**Tags:** *gyp_configuration.gypi, cpu memory, gpu memory.*
+**Tags:** *Cobalt extension, cpu memory, gpu memory.*
 
 
 ### Image cache capacity multiplier during video playback
@@ -75,32 +72,11 @@
 more likely that Cobalt will have to re-download and decode images after
 returning from video playback.  Note that this feature is not well tested.
 The feature can be activated by setting
-`image_cache_capacity_multiplier_when_playing_video` to a value between
-`0.0` and `1.0` in your `gyp_configuration.gypi` file.  The image cache
+`CobaltImageCacheCapacityMultiplierWhenPlayingVideo` to a value between
+`0.0` and `1.0` in your Cobalt configuration extension.  The image cache
 capacity will be multiplied by this value during video playback.
 
-**Tags:** *gyp_configuration.gypi, gpu memory.*
-
-
-### Scratch Surface cache capacity
-
-This only affects GLES renderers.  While rasterizing a frame, it is
-occasionally necessary to render to a temporary offscreen surface and then
-apply that surface to the original render target.  Offscreen surface
-rendering may also need to be performed multiple times per frame.  The
-scratch surface cache will keep allocated a set of scratch textures that
-will be reused (within and across frames) for offscreen rendering.  Reusing
-offscreen surfaces allows render target allocations, which can be expensive
-on some platforms, to be minimized.  However, it has been found that some
-platforms (especially those with tiled renderers, like the Raspberry Pi's
-Broadcom VideoCore), reading and writing again and again to the same texture
-can result in performance degradation.  Memory may also be potentially saved
-by disabling this cache, since when it is enabled, if the cache is filled, it
-may be occupying memory that it is not currently using.  This setting can
-be adjusted by setting `surface_cache_size_in_bytes` in your
-`gyp_configuration.gypi` file.  A value of `0` will disable the surface cache.
-
-**Tags:** *gyp_configuration.gypi, gpu memory, framerate.*
+**Tags:** *Cobalt extension, gpu memory.*
 
 
 ### Glyph atlas size
@@ -114,12 +90,12 @@
 modifications to this setting, be sure to test many languages, as some
 are more demanding (e.g. Chinese and Japanese) on the glyph cache than
 others.  This value can be adjusted by changing the values of
-the `skia_glyph_atlas_width` and `skia_glyph_atlas_height` variables in your
-`gyp_configuration.gypi` file.  Note that by default, these will be
+the `CobaltSkiaGlyphAtlasWidth` and `CobaltSkiaGlyphAtlasHeight` variables in
+your Cobalt configuration extension.  Note that by default, these will be
 automatically configured by Cobalt to values found to be optimal for
 the application's resolution.
 
-**Tags:** *gyp_configuration.gypi, gpu memory, input latency, framerate.*
+**Tags:** *Cobalt extension, gpu memory, input latency, framerate.*
 
 
 ### Software surface cache capacity
@@ -131,9 +107,10 @@
 renders, the results are cached and re-used across frames.  The software
 surface cache is crucial to achieving an acceptable framerate on Blitter API
 platforms.  The size of this cache is specified by the
-`software_surface_cache_size_in_bytes` variable in `gyp_configuration.gypi`.
+`CobaltSoftwareSurfaceCacheSizeInBytes` variable in your Cobalt configuration
+extension.
 
-**Tags:** *gyp_configuration.gypi, gpu memory, framerate.*
+**Tags:** *Cobalt extension, gpu memory, framerate.*
 
 
 ### Toggle Just-In-Time JavaScript Compilation
@@ -148,7 +125,7 @@
 it by implementing the CobaltExtensionConfigurationApi method
 `CobaltEnableJit()` to return `true` to enable JIT, or `false` to disable it.
 
-**Tags:** *gyp_configuration.gypi, startup, browse-to-watch, input latency,
+**Tags:** *Cobalt extension, startup, browse-to-watch, input latency,
            cpu memory.*
 
 
@@ -194,7 +171,7 @@
 on a Blitter API platform, enabling this functionality will result in the
 allocation and blit of a fullscreen "intermediate" back buffer target.
 
-**Tags:** *startup, framerate, gpu memory.*
+**Tags:** *Cobalt extension, startup, framerate, gpu memory.*
 
 
 ### Ensure that thread priorities are respected
@@ -217,27 +194,34 @@
 
 Huge performance improvements can be obtained by ensuring that the right
 optimizations are enabled by your compiler and linker flag settings.  You
-can set these up within `gyp_configuration.gypi` by adjusting the list
-variables `compiler_flags` and `linker_flags`.  See also
-`compiler_flags_gold` and `linker_flags_gold` which describe flags that
-apply only to gold builds where performance is critical.  Note that
-unless you explicitly set this up, it is unlikely that compiler/linker
-flags will carry over from external shell environment settings; they
-must be set explicitly in `gyp_configuration.gypi`.
+can set these up within `platform_configuration/BUILD.gn` by adjusting the
+`cflags`, `ldflags`, and more. Keep in mind you can use `is_gold` and other
+such boolean values to only apply optimizations where performance is critical.
+Note that unless you explicitly set this up, it is unlikely that
+compiler/linker flags will carry over from external shell environment settings;
+they must be set explicitly in `platform_configuration/BUILD.gn`.
 
 **Tags:** *framerate, startup, browse-to-watch, input latency*
 
 #### Optimize for size vs speed
 
-For qa and gold configs, different compiler flags can be used for gyp targets
+For qa and gold configs, different compiler flags can be used for GN targets
 which should be optimized for size vs speed. This can be used to reduce the
-executable size with minimal impact on performance. On top of the base
-`compiler_flags_qa` and `compiler_flags_gold`, the gyp variables
-`compiler_flags_qa_size`, `compiler_flags_qa_speed`, `compiler_flags_gold_size`,
-and `compiler_flags_gold_speed` will be used. Performance-critical gyp targets
-specify `optimize_target_for_speed`: 1, and these will use compiler flags
-`compiler_flags_<config>` + `compiler_flags_<config>_speed`; other gyp targets
-will use `compiler_flags_<config>` + `compiler_flags_<config>_size`.
+executable size with minimal impact on performance.
+
+To set these flags, implement size and/or speed configs (preferably in
+`platform_configuration/BUILD.gn`), and point to them using the
+`size_config_path` and `speed_config_path` variables, set in
+`platform_configuration/configuration.gni`.
+
+Performance-critical targets remove the `size` config and add the `speed` config like so:
+
+```
+configs -= [ "//starboard/build/config:size" ]
+configs += [ "//starboard/build/config:speed" ]
+```
+
+The size config is applied by default.
 
 **Tags:** *cpu memory, package size*
 
@@ -278,11 +262,11 @@
 memory allocations.  It should be carefully evaluated however whether
 dlmalloc performs better or worse than your system allocator, in terms
 of both memory fragmentation efficiency as well as runtime performance.
-To use dlmalloc, you should adjust your starboard_platform.gyp file to
+To use dlmalloc, you should adjust your `starboard_platform` target to
 use the Starboard [`starboard/memory.h`](../../starboard/memory.h) function
 implementations defined in
 [`starboard/shared/dlmalloc/`](../../starboard/shared/dlmalloc).  To use
-your system allocator, you should adjust your starboard_platform.gyp file
+your system allocator, you should adjust your `starboard_platform` target
 to use the Starboard [`starboard/memory.h`](../../starboard/memory.h) function
 implementations defined in
 [`starboard/shared/iso/`](../../starboard/shared/iso).
@@ -299,11 +283,11 @@
 memory.  However, depending on your platform and your system allocator,
 overall memory usage may improve if media buffer allocations were made
 normally via the system allocator instead.  This can be achieved by setting
-`cobalt_media_buffer_initial_capacity` and `cobalt_media_buffer_allocation_unit`
-to 0 in gyp_configuration.gypi.  Note also that if you choose to pre-allocate
-memory, for 1080p video it has been found that 24MB is a good media buffer size.
-The pre-allocated media buffer capacity size can be adjusted by modifying the
-value of `cobalt_media_buffer_initial_capacity` mentioned above.
+`SbMediaGetInitialBufferCapacity` and `SbMediaGetBufferAllocationUnit`
+to 0 in your implementation of media.h.  Note also that if you choose to
+pre-allocate memory, for 1080p video it has been found that 24MB is a good
+media buffer size. The pre-allocated media buffer capacity size can be adjusted
+by modifying the value of `SbMediaGetInitialBufferCapacity` mentioned above.
 
 **Tags:** *configuration_public.h, cpu memory.*
 
@@ -311,12 +295,9 @@
 ### Adjust media buffer size settings
 
 Many of the parameters around media buffer allocation can be adjusted in your
-gyp_configuration.gypi file.  The variables in question are the family of
-`cobalt_media_*` variables, whose default values are specified in
-[`cobalt_configuration.gypi`](../build/cobalt_configuration.gypi).  In
-particular, if your maximum video output resolution is less than 1080, then you
-may lower the budgets for many of the categories according to your maximum
-resolution.
+media.h Starboard implementation. In particular, if your maximum video output
+resolution is less than 1080, then you may lower the budgets for many of the
+categories according to your maximum resolution.
 
 **Tags:** *cpu memory*
 
diff --git a/cobalt/doc/voice_search.md b/cobalt/doc/voice_search.md
index 1847282..3153553 100644
--- a/cobalt/doc/voice_search.md
+++ b/cobalt/doc/voice_search.md
@@ -2,19 +2,20 @@
 
 Cobalt enables voice search through either:
 
-1. A subset of the [MediaRecorder Web API](https://www.w3.org/TR/mediastream-recording/#mediarecorder-api).
+1. A subset of the [MediaRecorder Web API](https://www.w3.org/TR/mediastream-recording/#mediarecorder-api)
 2. A subset of the [Speech Recognition Web API](https://w3c.github.io/speech-api/#speechreco-section)
 
 Only one or the other can be used, and we recommend that the MediaRecorder API
-is followed, as we are considering deprecating the Speech Recognition API.
-
-**The Speech Recognition API is deprecated as of Starboard 13.**
+is followed, as the Speech Recognition API is deprecated as of Starboard 13.
 
 In both approaches, in order to check whether to enable voice control or not,
 web apps will call the [MediaDevices.enumerateDevices()](https://www.w3.org/TR/mediacapture-streams/#dom-mediadevices-enumeratedevices%28%29)
 Web API function within which Cobalt will in turn call a subset of the
 [Starboard SbMicrophone API](../../starboard/microphone.h).
 
+Partners can add microphone support and microphone gesture options using the
+optional SoftMicPlatformService, detailed below.
+
 ## MediaRecorder API
 
 To enable the MediaRecorder API in Cobalt, the complete
@@ -63,3 +64,49 @@
 
 Web applications are expected to use the MediaRecorder API. This in turn relies
 on the SbMicrophone API as detailed above.
+
+## SoftMicPlatformService
+
+In `starboard/linux/shared/soft_mic_platform_service.cc` there is an example
+stub implementation of the SoftMicPlatformService. Platforms can optionally
+implement this [CobaltPlatformService](https://cobalt.dev/gen/cobalt/doc/
+platform_services.html) to specify if they support the `soft mic` and/or `hard mic`
+for voice search. The `soft mic` refers to the software activation of the microphone
+for voice search through the UI microphone button on the Youtube Web Application
+search page. The `hard mic` refers to hardware button activation of the microphone
+for voice search. Platforms can also specify the optional `micGesture`. This
+specifies the type of UI prompt the YouTube Web Application should display to guide
+the user to start voice search. The options include an empty or `null` value for no
+prompt, `"TAP"` for tap the `soft mic` and/or `hard mic` to start voice search, or
+`"HOLD"` for hold the `soft mic` and/or the `hard mic` to start voice search.
+
+The Web Application messages to the platform will be singular strings, encoded with
+enclosing quotation marks to make them JSON compliant:
+
+```
+"\"notifySearchActive\""
+
+
+"\"notifySearchInactive\""
+```
+
+These messages notify the platform when the user is entering or exiting the Youtube
+Web Application search page. Only a synchronous `true` or `false` response is sent
+from the platform to confirm that the message was correctly received and parsed.
+
+```
+"\"getMicSupport\""
+```
+
+A similar synchronous `true` or `false` response is sent from the platform confirming
+the message was correctly received and parsed. The platform will also send an
+asynchronous string encoded JSON object with the above mentioned microphone
+preferences:
+
+```
+"{
+    'hasHardMicSupport' : boolean,
+    'hasSoftMicSupport' : boolean,
+    'micGesture' : string,
+ }"
+```
diff --git a/cobalt/doc/webapi_extension.md b/cobalt/doc/webapi_extension.md
deleted file mode 100644
index 811b9fa..0000000
--- a/cobalt/doc/webapi_extension.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# Cobalt Web Extension Support
-
-## Deprecation
-Please note that Web Extension support is deprecated. Please use Platform
-Services (cobalt/doc/platform_services.md) instead. This is an effort to move
-away from injecting compile-time modules into the Cobalt layer in favor of
-using runtime extensions provided by the Starboard layer.
-
-## Overview
-Cobalt provides a facility for extending the JavaScript Web API.  This allows
-custom web apps running on Cobalt to make calls through a custom API to
-C++ Cobalt code defined per Starboard platform.  This can allow for closer
-integration between the web app hosted by Cobalt and the system on which that
-web app is running.
-
-The Cobalt Web Extension support will allow you to attach an instance of a
-custom class to the JavaScript `window` global object so that it can be
-referenced from a web app in JavaScript as in the following example:
-
-```
-window.myInterface.RunMyFunction()
-```
-
-## Build-level modifications
-
-In order to extend the interface, one should add the following lines to the
-`variables` section of `<platform-directory>/cobalt/configuration.gypi` (see
-Starboard's
-[Application Customization](../../starboard/doc/building.md#application-customization)
-for more information):
-
-1. `cobalt_webapi_extension_source_idl_files`
-   This should be a list of [IDL files](https://en.wikipedia.org/wiki/Web_IDL)
-   that define the collection of new interfaces introduced by your extensions.
-   One of these new interfaces can be selected to be injected into the `window`
-   element (see 3. `cobalt_webapi_extension_gyp_target` for information on how
-   to do this).  Each IDL file listed here simultaneously defines a JavaScript
-   and a C++ interface.  For each IDL file, you will be expected to also provide
-   a header file in the same directory that re-declares (in C++) the interface
-   declared in the IDL file, as well as an implementation of all the methods
-   within it (either inline in the header file or in a corresponding source
-   file).
-2. `cobalt_webapi_extension_generated_header_idl_files`
-   This is a list of all files that may result in automatic header file
-   generation that might be referenced from other C++ code.  An example of
-   this is the definition of `enum`s that may then be referenced as types in
-   a file from 1. `cobalt_webapi_extension_source_idl_files`.
-3. `cobalt_webapi_extension_gyp_target`
-   This is the gyp target that will provide the IDL interface implementations,
-   as well as any necessary auxiliary code.  It will be added as a dependency of
-   [browser/cobalt.gyp:cobalt](../browser/cobalt.gyp).  It is expected that
-   this target will implement the interface defined in
-   [browser/webapi_extension.h](../browser/webapi_extension.h), which let you
-   name the injected window property, and provide a function to instantiate it
-   (i.e. to let you select which IDL object is the "entry point").
-
-The first two lists get included by
-[cobalt/browser/browser_bindings_gen.gyp](cobalt/browser/browser_bindings_gen.gyp),
-where you can look to see many examples of existing Cobalt IDL files that define
-the Web API available through Cobalt.  For each of these, you can also
-examine their corresponding `.h` files and in most cases their `.cc` files as
-well.
-
-An example configuration for these variables is available at
-[starboard/shared/test_webapi_extension/test_webapi_extension.gypi](../../starboard/shared/test_webapi_extension/test_webapi_extension.gypi), which
-contains the following variable definitions:
-
-```
-'cobalt_webapi_extension_source_idl_files': [
-  'my_new_interface.idl'
-],
-'cobalt_webapi_extension_generated_header_idl_files': [
-  'my_new_enum.idl'
-],
-'cobalt_webapi_extension_gyp_target':
-  '<(DEPTH)/starboard/shared/test_webapi_extension/webapi_extension.gyp:cobalt_test_webapi_extension',
-```
-
-## Implementing the [webapi_extension.h](../browser/webapi_extension.h) interface
-
-As discussed above in 3. `cobalt_webapi_extension_gyp_target`, you must provide
-an implementation of the two functions declared in
-[browser/webapi_extension.h](../browser/webapi_extension.h).
-
-### `GetWebAPIExtensionObjectPropertyName()`
-You should implement `GetWebAPIExtensionObjectPropertyName()` to return the name
-of the injected `window` property.  For example, in the example from the
-beginning of this document, `window.myInterface.RunMyFunction()`, we would have
-the function return `std::string("myInterface")`.  If you return `nullopt` from
-this function, it is assumed that you do not wish to extend the web interface.
-
-Note that you should NOT name your `window` property the same as your class name
-as described in the IDL file, it will result in a name collision in the
-JavaScript environment.
-
-### `CreateWebAPIExtensionObject()`
-This function should instantiate and return the object to be accessed from
-`window`.  The object must be defined by an IDL file.
-
-## Debugging
-You may find the Cobalt debug console to be particularly useful for debugging
-IDL additions and changes.  In it, you can enter arbitrary JavaScript and then
-hit enter to execute it.  You can toggle it open by hitting either CTRL+O or
-F1, and you may have to hit the key twice to skip past the HUD mode.
-
-Here is an example of an example interface being exercised through the
-debug console:
-
-![Debug console web extension example](resources/webapi_extension_example.jpg)
diff --git a/cobalt/dom/BUILD.gn b/cobalt/dom/BUILD.gn
index c594de0..f8a437c 100644
--- a/cobalt/dom/BUILD.gn
+++ b/cobalt/dom/BUILD.gn
@@ -75,6 +75,7 @@
     "directionality.h",
     "document.cc",
     "document.h",
+    "document_load_timing_info.h",
     "document_timeline.cc",
     "document_timeline.h",
     "document_type.cc",
@@ -256,6 +257,8 @@
     "performance_mark.h",
     "performance_measure.cc",
     "performance_measure.h",
+    "performance_navigation_timing.cc",
+    "performance_navigation_timing.h",
     "performance_observer.cc",
     "performance_observer.h",
     "performance_observer_entry_list.cc",
@@ -332,7 +335,14 @@
     "xml_serializer.h",
   ]
 
-  public_deps = [ "//cobalt/browser:generated_types" ]
+  if (use_skia_next) {
+    defines = [ "USE_SKIA_NEXT" ]
+  }
+
+  public_deps = [
+    "//cobalt/browser:generated_types",
+    "//cobalt/web",
+  ]
 
   deps = [
     ":dom_exception",
@@ -357,6 +367,7 @@
     "//cobalt/storage/store:memory_store",
     "//cobalt/system_window",
     "//cobalt/ui_navigation",
+    "//cobalt/web",
     "//cobalt/web_animations",
     "//cobalt/worker",
     "//crypto",
@@ -455,7 +466,6 @@
     "//cobalt/csp",
     "//cobalt/css_parser",
     "//cobalt/cssom",
-    "//cobalt/cssom:cssom_test",
     "//cobalt/dom/testing:dom_testing",
     "//cobalt/dom_parser",
     "//cobalt/h5vcc",
@@ -475,4 +485,6 @@
     "//testing/gtest",
     "//url",
   ]
+
+  content_deps = [ ":licenses" ]
 }
diff --git a/cobalt/dom/attr.cc b/cobalt/dom/attr.cc
index 7b6950e..3c3fe45 100644
--- a/cobalt/dom/attr.cc
+++ b/cobalt/dom/attr.cc
@@ -35,7 +35,7 @@
 }
 
 const std::string& Attr::node_value() const {
-#ifdef __LB_SHELL__FORCE_LOGGING__
+#ifdef COBALT_LOGGING_ENABLED
   // TODO: All warnings logged from Web APIs should contain JavaScript call
   //       stack and should be deduplicated by JavaScript location.
   static bool duplicate_warning = false;
@@ -43,7 +43,7 @@
     duplicate_warning = true;
     LOG(WARNING) << "Use of deprecated Web API: Attr.nodeValue.";
   }
-#endif  // __LB_SHELL__FORCE_LOGGING__
+#endif  // COBALT_LOGGING_ENABLED
 
   return value_;
 }
diff --git a/cobalt/dom/blob.cc b/cobalt/dom/blob.cc
index 8893cf3..6199841 100644
--- a/cobalt/dom/blob.cc
+++ b/cobalt/dom/blob.cc
@@ -17,7 +17,8 @@
 #include "base/lazy_instance.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/blob_property_bag.h"
-#include "cobalt/dom/dom_settings.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace cobalt {
 namespace dom {
@@ -82,11 +83,15 @@
     : buffer_reference_(
           this, buffer.IsEmpty()
                     ? script::ArrayBuffer::New(
-                          base::polymorphic_downcast<DOMSettings*>(settings)
+                          base::polymorphic_downcast<web::EnvironmentSettings*>(
+                              settings)
+                              ->context()
                               ->global_environment(),
                           0)
                     : script::ArrayBuffer::New(
-                          base::polymorphic_downcast<DOMSettings*>(settings)
+                          base::polymorphic_downcast<web::EnvironmentSettings*>(
+                              settings)
+                              ->context()
                               ->global_environment(),
                           buffer->Data(), buffer->ByteLength())) {
   DCHECK(settings);
@@ -101,11 +106,13 @@
 Blob::Blob(script::EnvironmentSettings* settings,
            const script::Sequence<BlobPart>& blob_parts,
            const BlobPropertyBag& options)
-    : buffer_reference_(this,
-                        script::ArrayBuffer::New(
-                            base::polymorphic_downcast<DOMSettings*>(settings)
-                                ->global_environment(),
-                            TotalDataLength(blob_parts))),
+    : buffer_reference_(
+          this,
+          script::ArrayBuffer::New(
+              base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+                  ->context()
+                  ->global_environment(),
+              TotalDataLength(blob_parts))),
       type_(options.type()) {
   DCHECK(settings);
   uint8* destination = static_cast<uint8*>(buffer_reference_.value().Data());
diff --git a/cobalt/dom/blob_test.cc b/cobalt/dom/blob_test.cc
index eabba0b..996396a 100644
--- a/cobalt/dom/blob_test.cc
+++ b/cobalt/dom/blob_test.cc
@@ -12,9 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/dom/blob.h"
+
 #include <algorithm>
 
-#include "cobalt/dom/blob.h"
 #include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/testing/stub_window.h"
 #include "cobalt/script/data_view.h"
diff --git a/cobalt/dom/captions/system_caption_settings.cc b/cobalt/dom/captions/system_caption_settings.cc
index 3a447f7..3a78d88 100644
--- a/cobalt/dom/captions/system_caption_settings.cc
+++ b/cobalt/dom/captions/system_caption_settings.cc
@@ -35,7 +35,6 @@
 namespace dom {
 namespace captions {
 
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 namespace {
 
 CaptionColor ToCobaltCaptionColor(SbAccessibilityCaptionColor color) {
@@ -173,7 +172,6 @@
 
 }  // namespace
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 
 void SystemCaptionSettings::OnCaptionSettingsChanged() {
   DispatchEventNameAndRunCallback(
@@ -182,7 +180,6 @@
 }
 
 base::Optional<std::string> SystemCaptionSettings::background_color() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -200,13 +197,9 @@
   } else {
     return std::string(color);
   }
-#else
-  return base::nullopt;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 CaptionState SystemCaptionSettings::background_color_state() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -215,13 +208,9 @@
   } else {
     return CaptionState::kCaptionStateUnsupported;
   }
-#else
-  return CaptionState::kCaptionStateUnsupported;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 base::Optional<std::string> SystemCaptionSettings::background_opacity() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -239,13 +228,9 @@
   } else {
     return std::string(opacity);
   }
-#else
-  return base::nullopt;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 CaptionState SystemCaptionSettings::background_opacity_state() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -254,13 +239,9 @@
   } else {
     return CaptionState::kCaptionStateUnsupported;
   }
-#else
-  return CaptionState::kCaptionStateUnsupported;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 base::Optional<std::string> SystemCaptionSettings::character_edge_style() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -280,13 +261,9 @@
   } else {
     return std::string(character_edge_style);
   }
-#else
-  return base::nullopt;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 CaptionState SystemCaptionSettings::character_edge_style_state() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -295,13 +272,9 @@
   } else {
     return CaptionState::kCaptionStateUnsupported;
   }
-#else
-  return CaptionState::kCaptionStateUnsupported;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 base::Optional<std::string> SystemCaptionSettings::font_color() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -319,13 +292,9 @@
   } else {
     return std::string(color);
   }
-#else
-  return base::nullopt;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 CaptionState SystemCaptionSettings::font_color_state() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -334,13 +303,9 @@
   } else {
     return CaptionState::kCaptionStateUnsupported;
   }
-#else
-  return CaptionState::kCaptionStateUnsupported;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 base::Optional<std::string> SystemCaptionSettings::font_family() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -358,13 +323,9 @@
   } else {
     return std::string(font_family);
   }
-#else
-  return base::nullopt;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 CaptionState SystemCaptionSettings::font_family_state() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -373,13 +334,9 @@
   } else {
     return CaptionState::kCaptionStateUnsupported;
   }
-#else
-  return CaptionState::kCaptionStateUnsupported;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 base::Optional<std::string> SystemCaptionSettings::font_opacity() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -397,13 +354,9 @@
   } else {
     return std::string(opacity);
   }
-#else
-  return base::nullopt;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 CaptionState SystemCaptionSettings::font_opacity_state() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -412,13 +365,9 @@
   } else {
     return CaptionState::kCaptionStateUnsupported;
   }
-#else
-  return CaptionState::kCaptionStateUnsupported;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 base::Optional<std::string> SystemCaptionSettings::font_size() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -437,13 +386,9 @@
   } else {
     return std::string(font_size);
   }
-#else
-  return base::nullopt;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 CaptionState SystemCaptionSettings::font_size_state() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -452,13 +397,9 @@
   } else {
     return CaptionState::kCaptionStateUnsupported;
   }
-#else
-  return CaptionState::kCaptionStateUnsupported;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 base::Optional<std::string> SystemCaptionSettings::window_color() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -476,13 +417,9 @@
   } else {
     return std::string(color);
   }
-#else
-  return base::nullopt;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 CaptionState SystemCaptionSettings::window_color_state() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -491,13 +428,9 @@
   } else {
     return CaptionState::kCaptionStateUnsupported;
   }
-#else
-  return CaptionState::kCaptionStateUnsupported;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 base::Optional<std::string> SystemCaptionSettings::window_opacity() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -515,13 +448,9 @@
   } else {
     return std::string(opacity);
   }
-#else
-  return base::nullopt;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 CaptionState SystemCaptionSettings::window_opacity_state() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
@@ -530,71 +459,46 @@
   } else {
     return CaptionState::kCaptionStateUnsupported;
   }
-#else
-  return CaptionState::kCaptionStateUnsupported;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 bool SystemCaptionSettings::is_enabled() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
   DCHECK(supports_is_enabled());
 
-  return (success && caption_settings.supports_is_enabled) ?
-             caption_settings.is_enabled : false;
-
-#else
-  return false;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
+  return (success && caption_settings.supports_is_enabled)
+             ? caption_settings.is_enabled
+             : false;
 }
 
 void SystemCaptionSettings::set_is_enabled(bool active) {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   DCHECK(supports_set_enabled());
   SbAccessibilitySetCaptionsEnabled(active);
-#else
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 bool SystemCaptionSettings::supports_is_enabled() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   return (success) ? caption_settings.supports_is_enabled : false;
-
-#else
-  return false;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 bool SystemCaptionSettings::supports_set_enabled() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   return (success) ? caption_settings.supports_set_enabled : false;
-
-#else
-  return false;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 bool SystemCaptionSettings::supports_override() {
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   SbAccessibilityCaptionSettings caption_settings;
   memset(&caption_settings, 0, sizeof(caption_settings));
   bool success = SbAccessibilityGetCaptionSettings(&caption_settings);
 
   return (success) ? caption_settings.supports_override : false;
-
-#else
-  return false;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 }
 
 const EventTarget::EventListenerScriptValue* SystemCaptionSettings::onchanged()
diff --git a/cobalt/dom/document.cc b/cobalt/dom/document.cc
index 949ff8d..e2cdd67 100644
--- a/cobalt/dom/document.cc
+++ b/cobalt/dom/document.cc
@@ -59,6 +59,7 @@
 #include "cobalt/dom/mouse_event.h"
 #include "cobalt/dom/named_node_map.h"
 #include "cobalt/dom/node_descendants_iterator.h"
+#include "cobalt/dom/performance.h"
 #include "cobalt/dom/text.h"
 #include "cobalt/dom/ui_event.h"
 #include "cobalt/dom/wheel_event.h"
@@ -87,9 +88,6 @@
       is_computed_style_dirty_(true),
       are_font_faces_dirty_(true),
       are_keyframes_dirty_(true),
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-      partial_layout_is_enabled_(true),
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
       selector_tree_(new cssom::SelectorTree()),
       should_recreate_selector_tree_(false),
       navigation_start_clock_(options.navigation_start_clock
@@ -105,7 +103,8 @@
       render_postponed_(false),
       frozenness_(false),
       ALLOW_THIS_IN_INITIALIZER_LIST(intersection_observer_task_manager_(
-          new IntersectionObserverTaskManager())) {
+          new IntersectionObserverTaskManager())),
+      navigation_type_(kNavigationTypeNavigate) {
   DCHECK(html_element_context_);
   DCHECK(options.url.is_empty() || options.url.is_valid());
   application_lifecycle_state_->AddObserver(this);
@@ -126,7 +125,8 @@
   location_ = new Location(
       options.url, options.hashchange_callback, options.navigation_callback,
       base::Bind(&CspDelegate::CanLoad, base::Unretained(csp_delegate_.get()),
-                 CspDelegate::kLocation));
+                 CspDelegate::kLocation),
+      base::Bind(&Document::SetNavigationType, base::Unretained(this)));
 
   font_cache_.reset(new FontCache(
       html_element_context_->resource_provider(),
@@ -900,12 +900,6 @@
 
 void Document::SampleTimelineTime() { default_timeline_->Sample(); }
 
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-void Document::SetPartialLayout(bool enabled) {
-  partial_layout_is_enabled_ = enabled;
-}
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
 ViewportSize Document::viewport_size() {
   return viewport_size_.value_or(ViewportSize());
 }
@@ -1148,6 +1142,46 @@
   tracer->Trace(initial_computed_style_declaration_);
 }
 
+void Document::CreatePerformanceNavigationTiming(
+    Performance* performance, const net::LoadTimingInfo& timing_info) {
+  // To create the navigation timing entry for document, given a loadTiminginfo,
+  // a navigationType and a null service worker timing info, do the following:
+  //   https://www.w3.org/TR/2022/WD-navigation-timing-2-20220224/#marking-navigation-timing
+  // 1. Let global be document's relevant global object.
+  // 2. Let navigationTimingEntry be a new PerformanceNavigationTiming object
+  // in global's realm.
+  // 3. Setup the resource timing entry for navigationTimingEntry given
+  // "navigation", document's address, and fetchTiming.
+  // 4. Set navigationTimingEntry's document load timing to document's
+  // load timing info.
+  // 5. Set navigationTimingEntry's previous document unload timing to
+  // document's previous document unload timing.
+  // 6. Set navigationTimingEntry's redirect count to redirectCount.
+  // 7. Set navigationTimingEntry's navigation type to navigationType.
+  // 8. Set navigationTimingEntry's service worker timing to
+  // serviceWorkerTiming.
+  scoped_refptr<PerformanceNavigationTiming> navigation_timing(
+      new PerformanceNavigationTiming(timing_info, location_->url().spec(),
+                                      performance, this,
+                                      performance->GetTimeOrigin()));
+
+  // 9. Set document's navigation timing entry to
+  // navigationTimingEntry.
+  navigation_timing_entry_ = navigation_timing;
+  // 10. add navigationTimingEntry to global's performance entry buffer.
+  performance->AddEntryToPerformanceEntryBuffer(navigation_timing_entry_);
+  // 11. To queue the navigation timing entry for Document document, queue
+  // document's navigation timing entry.
+  performance->QueuePerformanceEntry(navigation_timing_entry_);
+}
+
+void Document::SetUnloadEventTimingInfo(base::TimeTicks start_time,
+                                        base::TimeTicks end_time) {
+  document_load_timing_info_.unload_event_start = start_time;
+  document_load_timing_info_.unload_event_end = end_time;
+}
+
+
 void Document::set_render_postponed(bool render_postponed) {
   bool unpostponed = render_postponed_ && !render_postponed;
   render_postponed_ = render_postponed;
@@ -1156,6 +1190,28 @@
   }
 }
 
+void Document::CollectTimingInfoAndDispatchEvent() {
+  DCHECK(html_element_context_);
+  Performance* performance = html_element_context_->performance();
+  bool is_performance_valid = performance != nullptr;
+
+  // Set document load timing info's dom content loaded event start time
+  // before user agent dispatches the DOMConentLoaded event.
+  if (is_performance_valid) {
+    document_load_timing_info_.dom_content_loaded_event_start =
+        performance->Now();
+  }
+
+  PostToDispatchEventName(FROM_HERE, base::Tokens::domcontentloaded());
+
+  // Set document load timing info's dom content loaded event end time
+  // after user agent completes handling the DOMConentLoaded event.
+  if (is_performance_valid) {
+    document_load_timing_info_.dom_content_loaded_event_end =
+        performance->Now();
+  }
+}
+
 void Document::OnRootElementUnableToProvideOffsetDimensions() {
   window_->OnDocumentRootElementUnableToProvideOffsetDimensions();
 }
@@ -1173,6 +1229,16 @@
     UpdateComputedStyles();
   }
 
+  DCHECK(html_element_context_);
+  Performance* performance = html_element_context_->performance();
+  bool is_performance_valid = performance != nullptr;
+
+  // Set document load timing info's dom complete time before user agent set the
+  // current document readiness to "complete".
+  if (is_performance_valid) {
+    document_load_timing_info_.dom_complete = performance->Now();
+  }
+
   // Adjust the document ready state to reflect the fact that the document has
   // finished loading.  Performing this update and firing the readystatechange
   // event before the load event matches Chromium's behavior.
@@ -1182,9 +1248,21 @@
   // have changed the document ready state.
   DispatchEvent(new Event(base::Tokens::readystatechange()));
 
+  // Set document load timing info's load event start time before user agent
+  // dispatch the load event for the document.
+  if (is_performance_valid) {
+    document_load_timing_info_.load_event_start = performance->Now();
+  }
+
   // Dispatch the document's onload event.
   DispatchEvent(new Event(base::Tokens::load()));
 
+  // Set document load timing info's load event end time after user agent
+  // completes handling the load event for the document.
+  if (is_performance_valid) {
+    document_load_timing_info_.load_event_end = performance->Now();
+  }
+
   // After all JavaScript OnLoad event handlers have executed, signal to let
   // any Document observers know that a load event has occurred.
   SignalOnLoadToObservers();
diff --git a/cobalt/dom/document.h b/cobalt/dom/document.h
index 32b4fbc..6bf0ee6 100644
--- a/cobalt/dom/document.h
+++ b/cobalt/dom/document.h
@@ -41,6 +41,7 @@
 #include "cobalt/cssom/viewport_size.h"
 #include "cobalt/dom/application_lifecycle_state.h"
 #include "cobalt/dom/csp_delegate_type.h"
+#include "cobalt/dom/document_load_timing_info.h"
 #include "cobalt/dom/document_ready_state.h"
 #include "cobalt/dom/document_timeline.h"
 #include "cobalt/dom/event.h"
@@ -48,6 +49,7 @@
 #include "cobalt/dom/intersection_observer_task_manager.h"
 #include "cobalt/dom/location.h"
 #include "cobalt/dom/node.h"
+#include "cobalt/dom/performance_navigation_timing.h"
 #include "cobalt/dom/pointer_state.h"
 #include "cobalt/dom/visibility_state.h"
 #include "cobalt/math/size.h"
@@ -75,6 +77,7 @@
 class HTMLMediaElement;
 class HTMLScriptElement;
 class Location;
+class Performance;
 class Text;
 class Window;
 
@@ -384,11 +387,6 @@
 
   CspDelegate* csp_delegate() const { return csp_delegate_.get(); }
 
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-  bool partial_layout_is_enabled() { return partial_layout_is_enabled_; }
-  void SetPartialLayout(bool enabled);
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
   // Triggers a synchronous layout.
   scoped_refptr<render_tree::Node> DoSynchronousLayoutAndGetRenderTree();
   void DoSynchronousLayout();
@@ -481,6 +479,43 @@
   DEFINE_WRAPPABLE_TYPE(Document);
   void TraceMembers(script::Tracer* tracer) override;
 
+  // PerformanceNavigationTiming related API.
+  void CreatePerformanceNavigationTiming(
+      Performance* performance, const net::LoadTimingInfo& timing_info);
+  base::TimeTicks GetDocumentUnloadEventStartTime() const {
+    return document_load_timing_info_.unload_event_start;
+  }
+  base::TimeTicks GetDocumentUnloadEventEndTime() const {
+    return document_load_timing_info_.unload_event_end;
+  }
+  DOMHighResTimeStamp GetDocumentContentLoadedEventStartTime() const {
+    return document_load_timing_info_.dom_content_loaded_event_start;
+  }
+  DOMHighResTimeStamp GetDocumentContentLoadedEventEndTime() const {
+    return document_load_timing_info_.dom_content_loaded_event_end;
+  }
+  DOMHighResTimeStamp GetDocumentDomCompleteTime() const {
+    return document_load_timing_info_.dom_complete;
+  }
+  DOMHighResTimeStamp GetDocumentLoadEventStartTime() const {
+    return document_load_timing_info_.load_event_start;
+  }
+  DOMHighResTimeStamp GetDocumentLoadEventEndTime() const {
+    return document_load_timing_info_.load_event_end;
+  }
+  NavigationType GetNavigationType() const { return navigation_type_; }
+
+  // Collect dom content loaded timing info and dispatch dom content loaded
+  // event.
+  void CollectTimingInfoAndDispatchEvent();
+
+  void SetNavigationType(NavigationType navigation_type) {
+    navigation_type_ = navigation_type;
+  }
+
+  void SetUnloadEventTimingInfo(base::TimeTicks start_time,
+                                base::TimeTicks end_time);
+
  protected:
   ~Document() override;
 
@@ -555,9 +590,6 @@
   bool is_computed_style_dirty_;
   bool are_font_faces_dirty_;
   bool are_keyframes_dirty_;
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-  bool partial_layout_is_enabled_;
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
 
   // Viewport size.
   base::Optional<cssom::ViewportSize> viewport_size_;
@@ -644,6 +676,11 @@
 
   scoped_refptr<IntersectionObserverTaskManager>
       intersection_observer_task_manager_;
+
+  scoped_refptr<PerformanceNavigationTiming> navigation_timing_entry_;
+
+  DocumentLoadTimingInfo document_load_timing_info_;
+  NavigationType navigation_type_;
 };
 
 }  // namespace dom
diff --git a/cobalt/dom/document_load_timing_info.h b/cobalt/dom/document_load_timing_info.h
new file mode 100644
index 0000000..322d6d8
--- /dev/null
+++ b/cobalt/dom/document_load_timing_info.h
@@ -0,0 +1,64 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_DOM_DOCUMENT_LOAD_TIMING_INFO_H_
+#define COBALT_DOM_DOCUMENT_LOAD_TIMING_INFO_H_
+
+#include "cobalt/dom/performance_high_resolution_time.h"
+
+namespace cobalt {
+namespace dom {
+
+// Implements the DocumentLoadTimingInfo struct for saving document loading
+// related timing info.
+//   https://html.spec.whatwg.org/multipage/dom.html#document-load-timing-info
+struct DocumentLoadTimingInfo {
+  DocumentLoadTimingInfo() = default;
+  DocumentLoadTimingInfo(const DocumentLoadTimingInfo& other) = default;
+  ~DocumentLoadTimingInfo() = default;
+
+  // If the previous document and the current document have the same origin,
+  // these timestamps are measured immediately after the user agent handles the
+  // unload event of the previous document. If there is no previous document
+  // or the previous document has a different origin than the current document,
+  // these attributes will be zero.
+  base::TimeTicks unload_event_start;
+  base::TimeTicks unload_event_end;
+
+  // This timestamp is measured before the user agent dispatches the
+  // DOMContentLoaded event.
+  DOMHighResTimeStamp dom_content_loaded_event_start = 0.0;
+
+  // This timestamp is measured after the user agent completes handling of
+  // the DOMContentLoaded event.
+  DOMHighResTimeStamp dom_content_loaded_event_end = 0.0;
+
+  // This timestamp is measured before the user agent sets the current
+  // document readiness to "complete". See document readiness for a precise
+  // definition.
+  DOMHighResTimeStamp dom_complete = 0.0;
+
+  // This timestamp is measured before the user agent dispatches the load
+  // event for the document.
+  DOMHighResTimeStamp load_event_start = 0.0;
+
+  // This timestamp is measured after the user agent completes handling
+  // the load event for the document.
+  DOMHighResTimeStamp load_event_end = 0.0;
+};
+
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_DOCUMENT_LOAD_TIMING_INFO_H_
diff --git a/cobalt/dom/dom.gyp b/cobalt/dom/dom.gyp
deleted file mode 100644
index c02e614..0000000
--- a/cobalt/dom/dom.gyp
+++ /dev/null
@@ -1,399 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [ '../build/contents_dir.gypi' ],
-
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'dom',
-      'type': 'static_library',
-      'sources': [
-        'abort_controller.h',
-        'abort_controller.cc',
-        'abort_signal.h',
-        'abort_signal.cc',
-        'animation_event.h',
-        'animation_frame_request_callback_list.cc',
-        'animation_frame_request_callback_list.h',
-        'attr.cc',
-        'attr.h',
-        'audio_track.h',
-        'audio_track_list.h',
-        'base64.cc',
-        'base64.h',
-        'benchmark_stat_names.cc',
-        'benchmark_stat_names.h',
-        'blob.cc',
-        'blob.h',
-        'blob_property_bag.h',
-        'buffer_source.cc',
-        'buffer_source.h',
-        'c_val_view.cc',
-        'c_val_view.h',
-        'camera_3d.cc',
-        'camera_3d.h',
-        'captions/system_caption_settings.cc',
-        'captions/system_caption_settings.h',
-        'cdata_section.cc',
-        'cdata_section.h',
-        'character_data.cc',
-        'character_data.h',
-        'cobalt_ua_data_values_interface.cc',
-        'cobalt_ua_data_values_interface.h',
-        'comment.cc',
-        'comment.h',
-        'crypto.cc',
-        'crypto.h',
-        'csp_delegate.cc',
-        'csp_delegate.h',
-        'csp_delegate_enum.h',
-        'csp_delegate_factory.cc',
-        'csp_delegate_factory.h',
-        'csp_violation_reporter.cc',
-        'csp_violation_reporter.h',
-        'css_animations_adapter.cc',
-        'css_animations_adapter.h',
-        'css_transitions_adapter.cc',
-        'css_transitions_adapter.h',
-        'custom_event.h',
-        'device_orientation_event.cc',
-        'device_orientation_event.h',
-        'device_orientation_event_init.h',
-        'directionality.h',
-        'document.cc',
-        'document.h',
-        'document_timeline.cc',
-        'document_timeline.h',
-        'document_type.cc',
-        'document_type.h',
-        'dom_animatable.cc',
-        'dom_animatable.h',
-        'dom_implementation.cc',
-        'dom_implementation.h',
-        'dom_parser.cc',
-        'dom_parser.h',
-        'dom_rect.h',
-        'dom_rect_list.cc',
-        'dom_rect_list.h',
-        'dom_rect_read_only.h',
-        'dom_settings.cc',
-        'dom_settings.h',
-        'dom_stat_tracker.cc',
-        'dom_stat_tracker.h',
-        'dom_string_map.cc',
-        'dom_string_map.h',
-        'dom_token_list.cc',
-        'dom_token_list.h',
-        'element.cc',
-        'element.h',
-        'element_intersection_observer_module.cc',
-        'element_intersection_observer_module.h',
-        'eme/media_encrypted_event.cc',
-        'eme/media_encrypted_event.h',
-        'eme/media_key_message_event.cc',
-        'eme/media_key_message_event.h',
-        'eme/media_key_session.cc',
-        'eme/media_key_session.h',
-        'eme/media_key_status_map.cc',
-        'eme/media_key_status_map.h',
-        'eme/media_key_system_access.cc',
-        'eme/media_key_system_access.h',
-        'eme/media_keys.cc',
-        'eme/media_keys.h',
-        'error_event.h',
-        'event.cc',
-        'event.h',
-        'event_init.h',
-        'event_listener.h',
-        'event_queue.cc',
-        'event_queue.h',
-        'event_target.cc',
-        'event_target.h',
-        'event_target_listener_info.cc',
-        'event_target_listener_info.h',
-        'focus_event.cc',
-        'focus_event.h',
-        'focus_event_init.h',
-        'font_cache.cc',
-        'font_cache.h',
-        'font_face.cc',
-        'font_face.h',
-        'font_face_updater.cc',
-        'font_face_updater.h',
-        'font_list.cc',
-        'font_list.h',
-        'global_stats.cc',
-        'global_stats.h',
-        'history.cc',
-        'history.h',
-        'html_anchor_element.cc',
-        'html_anchor_element.h',
-        'html_audio_element.cc',
-        'html_audio_element.h',
-        'html_body_element.cc',
-        'html_body_element.h',
-        'html_br_element.cc',
-        'html_br_element.h',
-        'html_collection.cc',
-        'html_collection.h',
-        'html_div_element.cc',
-        'html_div_element.h',
-        'html_element.cc',
-        'html_element.h',
-        'html_element_context.cc',
-        'html_element_context.h',
-        'html_element_factory.cc',
-        'html_element_factory.h',
-        'html_head_element.cc',
-        'html_head_element.h',
-        'html_heading_element.cc',
-        'html_heading_element.h',
-        'html_html_element.cc',
-        'html_html_element.h',
-        'html_image_element.cc',
-        'html_image_element.h',
-        'html_link_element.cc',
-        'html_link_element.h',
-        'html_media_element.cc',
-        'html_media_element.h',
-        'html_meta_element.cc',
-        'html_meta_element.h',
-        'html_paragraph_element.cc',
-        'html_paragraph_element.h',
-        'html_script_element.cc',
-        'html_script_element.h',
-        'html_span_element.cc',
-        'html_span_element.h',
-        'html_style_element.cc',
-        'html_style_element.h',
-        'html_title_element.cc',
-        'html_title_element.h',
-        'html_unknown_element.h',
-        'html_video_element.cc',
-        'html_video_element.h',
-        'initial_computed_style.cc',
-        'initial_computed_style.h',
-        'input_event.cc',
-        'input_event.h',
-        'input_event_init.h',
-        'intersection_observer.cc',
-        'intersection_observer.h',
-        'intersection_observer_entry.cc',
-        'intersection_observer_entry.h',
-        'intersection_observer_entry_init.h',
-        'intersection_observer_init.h',
-        'intersection_observer_task_manager.cc',
-        'intersection_observer_task_manager.h',
-        'keyboard_event.cc',
-        'keyboard_event.h',
-        'keyboard_event_init.h',
-        'keycode.h',
-        'keyframes_map_updater.cc',
-        'keyframes_map_updater.h',
-        'layout_boxes.h',
-        'local_storage_database.cc',
-        'local_storage_database.h',
-        'location.cc',
-        'location.h',
-        'lottie_player.cc',
-        'lottie_player.h',
-        'media_query_list.cc',
-        'media_query_list.h',
-        'media_source.cc',
-        'media_source.h',
-        'memory_info.cc',
-        'memory_info.h',
-        'message_event.cc',
-        'message_event.h',
-        'mime_type_array.cc',
-        'mime_type_array.h',
-        'mouse_event.cc',
-        'mouse_event.h',
-        'mouse_event_init.h',
-        'mutation_observer.cc',
-        'mutation_observer.h',
-        'mutation_observer_init.h',
-        'mutation_observer_task_manager.cc',
-        'mutation_observer_task_manager.h',
-        'mutation_record.cc',
-        'mutation_record.h',
-        'mutation_reporter.cc',
-        'mutation_reporter.h',
-        'named_node_map.cc',
-        'named_node_map.h',
-        'navigator.cc',
-        'navigator.h',
-        'navigator_ua_data.cc',
-        'navigator_ua_data.h',
-        'node.cc',
-        'node.h',
-        'node_children_iterator.h',
-        'node_collection.h',
-        'node_descendants_iterator.h',
-        'node_list.cc',
-        'node_list.h',
-        'node_list_live.cc',
-        'node_list_live.h',
-        'on_error_event_listener.cc',
-        'on_error_event_listener.h',
-        'on_screen_keyboard.cc',
-        'on_screen_keyboard.h',
-        'on_screen_keyboard_bridge.h',
-        'application_lifecycle_state.cc',
-        'application_lifecycle_state.h',
-        'performance.cc',
-        'performance.h',
-        'performance_entry.cc',
-        'performance_entry.h',
-        'performance_entry_list_impl.cc',
-        'performance_entry_list_impl.h',
-        'performance_lifecycle_timing.cc',
-        'performance_lifecycle_timing.h',
-        'performance_mark.cc',
-        'performance_mark.h',
-        'performance_measure.cc',
-        'performance_measure.h',
-        'performance_observer.cc',
-        'performance_observer.h',
-        'performance_observer_entry_list.cc',
-        'performance_observer_entry_list.h',
-        'performance_resource_timing.cc',
-        'performance_resource_timing.h',
-        'performance_timing.cc',
-        'performance_timing.h',
-        'performance_high_resolution_time.h',
-        'plugin_array.cc',
-        'plugin_array.h',
-        'pointer_event.cc',
-        'pointer_event.h',
-        'pointer_event_init.h',
-        'pointer_state.cc',
-        'pointer_state.h',
-        'progress_event.cc',
-        'progress_event.h',
-        'pseudo_element.cc',
-        'pseudo_element.h',
-        'registered_observer.h',
-        'registered_observer_list.cc',
-        'registered_observer_list.h',
-        'rule_matching.cc',
-        'rule_matching.h',
-        'screen.h',
-        'screenshot.cc',
-        'screenshot.h',
-        'screenshot_manager.cc',
-        'screenshot_manager.h',
-        'security_policy_violation_event.cc',
-        'security_policy_violation_event.h',
-        'serializer.cc',
-        'serializer.h',
-        'source_buffer.cc',
-        'source_buffer.h',
-        'source_buffer_list.cc',
-        'source_buffer_list.h',
-        'storage.cc',
-        'storage.h',
-        'storage_area.cc',
-        'storage_area.h',
-        'storage_event.cc',
-        'storage_event.h',
-        'test_runner.cc',
-        'test_runner.h',
-        'text.cc',
-        'text.h',
-        'time_ranges.cc',
-        'time_ranges.h',
-        'track_base.h',
-        'track_default.h',
-        'track_default_list.h',
-        'track_event.h',
-        'transition_event.h',
-        'ui_event.cc',
-        'ui_event.h',
-        'ui_event_init.h',
-        'ui_event_with_key_state.cc',
-        'ui_event_with_key_state.h',
-        'url.cc',
-        'url.h',
-        'url_registry.h',
-        'url_utils.cc',
-        'url_utils.h',
-        'user_agent_platform_info.h',
-        'video_track.h',
-        'video_track_list.h',
-        'wheel_event.cc',
-        'wheel_event.h',
-        'wheel_event_init.h',
-        'window.cc',
-        'window.h',
-        'window_timers.cc',
-        'window_timers.h',
-        'xml_document.h',
-        'xml_serializer.cc',
-        'xml_serializer.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-        '<(DEPTH)/cobalt/csp/csp.gyp:csp',
-        '<(DEPTH)/cobalt/cssom/cssom.gyp:cssom',
-        '<(DEPTH)/cobalt/dom/dom_exception.gyp:dom_exception',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/cobalt/media/media.gyp:media',
-        '<(DEPTH)/cobalt/media_capture/media_capture.gyp:media_capture',
-        '<(DEPTH)/cobalt/media_session/media_session.gyp:media_session',
-        # Interface layer to avoid directly depending on network.
-        '<(DEPTH)/cobalt/network_bridge/network_bridge.gyp:network_bridge',
-        '<(DEPTH)/cobalt/script/script.gyp:script',
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-        '<(DEPTH)/cobalt/storage/storage.gyp:storage',
-        '<(DEPTH)/cobalt/system_window/system_window.gyp:system_window',
-        '<(DEPTH)/cobalt/ui_navigation/ui_navigation.gyp:ui_navigation',
-        '<(DEPTH)/cobalt/web_animations/web_animations.gyp:web_animations',
-        '<(DEPTH)/cobalt/worker/worker.gyp:worker',
-        '<(DEPTH)/nb/nb.gyp:nb',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-      # This target doesn't generate any headers, but it exposes generated
-      # header files (for idl dictionaries) through this module's public header
-      # files. So mark this target as a hard dependency to ensure that any
-      # dependent targets wait until this target (and its hard dependencies) are
-      # built.
-      'hard_dependency': 1,
-      'export_dependent_settings': [
-        # Additionally, ensure that the include directories for generated
-        # headers are put on the include directories for targets that depend on
-        # this one.
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ],
-      'copies': [
-        {
-          'destination': '<(sb_static_contents_output_data_dir)/licenses',
-          'files': ['<(static_contents_source_dir)/licenses/platform/<(cobalt_licenses_platform)/licenses_cobalt.txt'],
-        },
-      ],
-      'all_dependent_settings': {
-        'variables': {
-          'content_deploy_subdirs': [ 'licenses' ]
-        }
-      },
-    },
-  ],
-}
diff --git a/cobalt/dom/dom_exception.gyp b/cobalt/dom/dom_exception.gyp
deleted file mode 100644
index f409227..0000000
--- a/cobalt/dom/dom_exception.gyp
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'dom_exception',
-      'type': 'static_library',
-      'sources': [
-        'dom_exception.cc',
-        'dom_exception.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/script/script.gyp:script',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/dom/dom_settings.cc b/cobalt/dom/dom_settings.cc
index 49b2d71..43e614d 100644
--- a/cobalt/dom/dom_settings.cc
+++ b/cobalt/dom/dom_settings.cc
@@ -22,40 +22,29 @@
 namespace dom {
 
 DOMSettings::DOMSettings(
-    const int max_dom_element_depth, loader::FetcherFactory* fetcher_factory,
-    network::NetworkModule* network_module,
-    MediaSourceRegistry* media_source_registry, Blob::Registry* blob_registry,
+    const base::DebuggerHooks& debugger_hooks, const int max_dom_element_depth,
+    MediaSourceRegistry* media_source_registry,
     media::CanPlayTypeHandler* can_play_type_handler,
     const media::DecoderBufferMemoryInfo* decoder_buffer_memory_info,
-    script::JavaScriptEngine* engine,
-    script::GlobalEnvironment* global_environment,
-    const base::DebuggerHooks& debugger_hooks,
     MutationObserverTaskManager* mutation_observer_task_manager,
-    const Options& options)
-    : max_dom_element_depth_(max_dom_element_depth),
+    worker::ServiceWorkerJobs* service_worker_jobs, const Options& options)
+    : EnvironmentSettings(debugger_hooks),
+      max_dom_element_depth_(max_dom_element_depth),
       microphone_options_(options.microphone_options),
-      fetcher_factory_(fetcher_factory),
-      network_module_(network_module),
       media_source_registry_(media_source_registry),
-      blob_registry_(blob_registry),
       can_play_type_handler_(can_play_type_handler),
       decoder_buffer_memory_info_(decoder_buffer_memory_info),
-      javascript_engine_(engine),
-      global_environment_(global_environment),
-      debugger_hooks_(debugger_hooks),
-      mutation_observer_task_manager_(mutation_observer_task_manager) {}
+      mutation_observer_task_manager_(mutation_observer_task_manager),
+      service_worker_jobs_(service_worker_jobs) {}
 
 DOMSettings::~DOMSettings() {}
 
 void DOMSettings::set_window(const scoped_refptr<Window>& window) {
   window_ = window;
+  set_base_url(window->document()->url_as_gurl());
 }
 scoped_refptr<Window> DOMSettings::window() const { return window_; }
 
-const GURL& DOMSettings::base_url() const {
-  return window()->document()->url_as_gurl();
-}
-
 loader::Origin DOMSettings::document_origin() const {
   return window()->document()->location()->GetOriginAsObject();
 }
diff --git a/cobalt/dom/dom_settings.h b/cobalt/dom/dom_settings.h
index e5d8b78..75a74f4 100644
--- a/cobalt/dom/dom_settings.h
+++ b/cobalt/dom/dom_settings.h
@@ -17,14 +17,14 @@
 
 #include "base/memory/ref_counted.h"
 #include "cobalt/base/debugger_hooks.h"
-#include "cobalt/dom/blob.h"
 #include "cobalt/dom/mutation_observer_task_manager.h"
 #include "cobalt/dom/url_registry.h"
 #include "cobalt/dom/url_utils.h"
 #include "cobalt/media/can_play_type_handler.h"
 #include "cobalt/media/decoder_buffer_memory_info.h"
-#include "cobalt/script/environment_settings.h"
 #include "cobalt/speech/microphone.h"
+#include "cobalt/web/environment_settings.h"
+#include "cobalt/worker/service_worker_jobs.h"
 
 namespace cobalt {
 
@@ -44,7 +44,7 @@
 
 // A package of global state to be passed around to script objects
 // that ask for it in their IDL custom attributes.
-class DOMSettings : public script::EnvironmentSettings {
+class DOMSettings : public web::EnvironmentSettings {
  public:
   typedef UrlRegistry<MediaSource> MediaSourceRegistry;
   // Hold optional settings for DOMSettings.
@@ -53,17 +53,13 @@
     speech::Microphone::Options microphone_options;
   };
 
-  DOMSettings(const int max_dom_element_depth,
-              loader::FetcherFactory* fetcher_factory,
-              network::NetworkModule* network_module,
+  DOMSettings(const base::DebuggerHooks& debugger_hooks,
+              const int max_dom_element_depth,
               MediaSourceRegistry* media_source_registry,
-              Blob::Registry* blob_registry,
               media::CanPlayTypeHandler* can_play_type_handler,
               const media::DecoderBufferMemoryInfo* decoder_buffer_memory_info,
-              script::JavaScriptEngine* engine,
-              script::GlobalEnvironment* global_environment_proxy,
-              const base::DebuggerHooks& debugger_hooks,
               MutationObserverTaskManager* mutation_observer_task_manager,
+              worker::ServiceWorkerJobs* service_worker_jobs,
               const Options& options = Options());
   ~DOMSettings() override;
 
@@ -75,20 +71,6 @@
   void set_window(const scoped_refptr<Window>& window);
   scoped_refptr<Window> window() const;
 
-  void set_fetcher_factory(loader::FetcherFactory* fetcher_factory) {
-    fetcher_factory_ = fetcher_factory;
-  }
-  loader::FetcherFactory* fetcher_factory() const { return fetcher_factory_; }
-  void set_network_module(network::NetworkModule* network_module) {
-    network_module_ = network_module;
-  }
-  network::NetworkModule* network_module() const { return network_module_; }
-  script::JavaScriptEngine* javascript_engine() const {
-    return javascript_engine_;
-  }
-  script::GlobalEnvironment* global_environment() const {
-    return global_environment_;
-  }
   MediaSourceRegistry* media_source_registry() const {
     return media_source_registry_;
   }
@@ -114,33 +96,25 @@
   media::CanPlayTypeHandler* can_play_type_handler() const {
     return can_play_type_handler_;
   }
-  const base::DebuggerHooks& debugger_hooks() const { return debugger_hooks_; }
   MutationObserverTaskManager* mutation_observer_task_manager() const {
     return mutation_observer_task_manager_;
   }
-  Blob::Registry* blob_registry() const { return blob_registry_; }
 
-  // An absolute URL used to resolve relative URLs.
-  virtual const GURL& base_url() const;
-
+  worker::ServiceWorkerJobs* service_worker_jobs() const {
+    return service_worker_jobs_;
+  }
   // Return's document's origin.
   loader::Origin document_origin() const;
 
  private:
   const int max_dom_element_depth_;
   const speech::Microphone::Options microphone_options_;
-  loader::FetcherFactory* fetcher_factory_;
-  network::NetworkModule* network_module_;
   scoped_refptr<Window> window_;
   MediaSourceRegistry* media_source_registry_;
-  Blob::Registry* blob_registry_;
   media::CanPlayTypeHandler* can_play_type_handler_;
   const media::DecoderBufferMemoryInfo* decoder_buffer_memory_info_;
-  script::JavaScriptEngine* javascript_engine_;
-  script::GlobalEnvironment* global_environment_;
-  const base::DebuggerHooks& debugger_hooks_;
   MutationObserverTaskManager* mutation_observer_task_manager_;
-
+  worker::ServiceWorkerJobs* service_worker_jobs_;
   DISALLOW_COPY_AND_ASSIGN(DOMSettings);
 };
 
diff --git a/cobalt/dom/dom_test.gyp b/cobalt/dom/dom_test.gyp
deleted file mode 100644
index 84aed7e..0000000
--- a/cobalt/dom/dom_test.gyp
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      # For the convenience, some tests depend on dom_parser.gyp:dom_parser. To
-      # avoid the dependency cycle between the two gyp files, dom_test is
-      # separated into its own gyp file.
-      'target_name': 'dom_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'blob_test.cc',
-        'comment_test.cc',
-        'crypto_test.cc',
-        'csp_delegate_test.cc',
-        'custom_event_test.cc',
-        'document_test.cc',
-        'document_type_test.cc',
-        'dom_implementation_test.cc',
-        'dom_parser_test.cc',
-        'dom_rect_list_test.cc',
-        'dom_string_map_test.cc',
-        'dom_token_list_test.cc',
-        'element_test.cc',
-        'error_event_test.cc',
-        'event_queue_test.cc',
-        'event_target_test.cc',
-        'event_test.cc',
-        'font_cache_test.cc',
-        'html_element_factory_test.cc',
-        'html_element_test.cc',
-        'html_link_element_test.cc',
-        'intersection_observer_test.cc',
-        'keyboard_event_test.cc',
-        'local_storage_database_test.cc',
-        'location_test.cc',
-        'media_query_list_test.cc',
-        'mutation_observer_test.cc',
-        'named_node_map_test.cc',
-        'navigator_licenses_test.cc',
-        'node_dispatch_event_test.cc',
-        'node_list_live_test.cc',
-        'node_list_test.cc',
-        'node_test.cc',
-        'on_screen_keyboard_test.cc',
-        'application_lifecycle_state_test.cc',
-        'performance_observer_test.cc',
-        'performance_test.cc',
-        'rule_matching_test.cc',
-        'screen_test.cc',
-        'serializer_test.cc',
-        'storage_area_test.cc',
-        'text_test.cc',
-        'time_ranges_test.cc',
-        'url_utils_test.cc',
-        'user_agent_data_test.cc',
-        'window_test.cc',
-        'window_timers_test.cc',
-        'xml_document_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/css_parser/css_parser.gyp:css_parser',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/dom/testing/dom_testing.gyp:dom_testing',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/cobalt/script/script.gyp:script',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'dom_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'dom_test',
-      ],
-      'variables': {
-        'executable_name': 'dom_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/dom/eme/media_key_session.cc b/cobalt/dom/eme/media_key_session.cc
index 3eca031..bf5c16b 100644
--- a/cobalt/dom/eme/media_key_session.cc
+++ b/cobalt/dom/eme/media_key_session.cc
@@ -19,7 +19,6 @@
 
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/dom_exception.h"
-#include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/eme/eme_helpers.h"
 #include "cobalt/dom/eme/media_key_message_event.h"
 #include "cobalt/dom/eme/media_key_message_event_init.h"
@@ -27,6 +26,8 @@
 #include "cobalt/script/array_buffer.h"
 #include "cobalt/script/array_buffer_view.h"
 #include "cobalt/script/script_value_factory.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace cobalt {
 namespace dom {
@@ -230,9 +231,10 @@
     SbDrmSessionRequestType type, std::unique_ptr<uint8[]> message,
     int message_size) {
   DCHECK(settings);
-  DOMSettings* dom_settings =
-      base::polymorphic_downcast<DOMSettings*>(settings);
-  auto* global_environment = dom_settings->global_environment();
+  auto* global_environment =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+          ->context()
+          ->global_environment();
   DCHECK(global_environment);
   MediaKeyMessageEventInit media_key_message_event_init;
   // 10.9.4. If a license request for the requested license type can be
diff --git a/cobalt/dom/eme/media_key_status_map.cc b/cobalt/dom/eme/media_key_status_map.cc
index 88b21c2..3423bce 100644
--- a/cobalt/dom/eme/media_key_status_map.cc
+++ b/cobalt/dom/eme/media_key_status_map.cc
@@ -16,9 +16,10 @@
 
 #include "base/logging.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/dom/dom_settings.h"
 #include "cobalt/script/array_buffer.h"
 #include "cobalt/script/array_buffer_view.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace cobalt {
 namespace dom {
@@ -61,11 +62,13 @@
 BufferSource ConvertStringToBufferSource(script::EnvironmentSettings* settings,
                                          const std::string& str) {
   DCHECK(settings);
-  DOMSettings* dom_settings =
-      base::polymorphic_downcast<dom::DOMSettings*>(settings);
-  DCHECK(dom_settings->global_environment());
-  script::Handle<script::ArrayBuffer> array_buffer = script::ArrayBuffer::New(
-      dom_settings->global_environment(), str.data(), str.size());
+  auto* global_environment =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+          ->context()
+          ->global_environment();
+  DCHECK(global_environment);
+  script::Handle<script::ArrayBuffer> array_buffer =
+      script::ArrayBuffer::New(global_environment, str.data(), str.size());
   return BufferSource(array_buffer);
 }
 
diff --git a/cobalt/dom/eme/media_keys.cc b/cobalt/dom/eme/media_keys.cc
index 66286b2..c29c300 100644
--- a/cobalt/dom/eme/media_keys.cc
+++ b/cobalt/dom/eme/media_keys.cc
@@ -17,8 +17,10 @@
 #include "base/bind.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/dom_exception.h"
+#include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/eme/eme_helpers.h"
 #include "cobalt/dom/eme/media_key_session.h"
+#include "cobalt/web/context.h"
 
 namespace cobalt {
 namespace dom {
@@ -100,8 +102,9 @@
     script::ExceptionState* exception_state) {
   std::vector<uint8_t> metrics;
   if (drm_system_->GetMetrics(&metrics)) {
-    return script::Uint8Array::New(dom_settings_->global_environment(),
-                                   metrics.data(), metrics.size());
+    return script::Uint8Array::New(
+        dom_settings_->context()->global_environment(), metrics.data(),
+        metrics.size());
   }
   DOMException::Raise(DOMException::kNotSupportedErr, exception_state);
   return script::Handle<script::Uint8Array>();
diff --git a/cobalt/dom/event_target.cc b/cobalt/dom/event_target.cc
index e663bb1..bd5aa1c 100644
--- a/cobalt/dom/event_target.cc
+++ b/cobalt/dom/event_target.cc
@@ -15,6 +15,7 @@
 #include "cobalt/dom/event_target.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -23,8 +24,8 @@
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/dom_exception.h"
-#include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/global_stats.h"
+#include "cobalt/script/environment_settings.h"
 #include "cobalt/xhr/xml_http_request_event_target.h"
 #include "nb/memory_scope.h"
 
@@ -34,8 +35,7 @@
 EventTarget::EventTarget(
     script::EnvironmentSettings* settings,
     UnpackOnErrorEventsBool onerror_event_parameter_handling)
-    : debugger_hooks_(
-          base::polymorphic_downcast<DOMSettings*>(settings)->debugger_hooks()),
+    : environment_settings_(settings),
       unpack_onerror_events_(onerror_event_parameter_handling ==
                              kUnpackOnErrorEvents) {}
 
@@ -66,7 +66,7 @@
   for (EventListenerInfos::iterator iter = event_listener_infos_.begin();
        iter != event_listener_infos_.end(); ++iter) {
     if ((*iter)->EqualTo(listener_info)) {
-      debugger_hooks_.AsyncTaskCanceled((*iter)->task());
+      debugger_hooks().AsyncTaskCanceled((*iter)->task());
       event_listener_infos_.erase(iter);
       return;
     }
@@ -91,7 +91,7 @@
   DCHECK(!event->IsBeingDispatched());
   DCHECK(event->initialized_flag());
   TRACE_EVENT1("cobalt::dom", "EventTarget::DispatchEvent", "event",
-               event->type().c_str());
+               TRACE_STR_COPY(event->type().c_str()));
   if (!event || event->IsBeingDispatched() || !event->initialized_flag()) {
     return false;
   }
@@ -252,7 +252,7 @@
       continue;
     }
 
-    base::ScopedAsyncTask async_task(debugger_hooks_, (*iter)->task());
+    base::ScopedAsyncTask async_task(debugger_hooks(), (*iter)->task());
     (*iter)->HandleEvent(event);
   }
 
@@ -273,7 +273,7 @@
     for (EventListenerInfos::iterator iter = event_listener_infos_.begin();
          iter != event_listener_infos_.end(); ++iter) {
       if ((*iter)->is_attribute() && (*iter)->type() == listener_info->type()) {
-        debugger_hooks_.AsyncTaskCanceled((*iter)->task());
+        debugger_hooks().AsyncTaskCanceled((*iter)->task());
         event_listener_infos_.erase(iter);
         break;
       }
@@ -293,7 +293,7 @@
     }
   }
 
-  debugger_hooks_.AsyncTaskScheduled(
+  debugger_hooks().AsyncTaskScheduled(
       listener_info->task(), listener_info->type().c_str(),
       base::DebuggerHooks::AsyncTaskFrequency::kRecurring);
   event_listener_infos_.push_back(std::move(listener_info));
diff --git a/cobalt/dom/event_target.h b/cobalt/dom/event_target.h
index 7aca7e7..7dc5fee 100644
--- a/cobalt/dom/event_target.h
+++ b/cobalt/dom/event_target.h
@@ -179,7 +179,6 @@
   }
 
   const EventListenerScriptValue* onload() {
-    DLOG(INFO) << "onload called";
     return GetAttributeEventListener(base::Tokens::load());
   }
   void set_onload(const EventListenerScriptValue& event_listener) {
@@ -358,7 +357,6 @@
   }
 
   const EventListenerScriptValue* onprogress() {
-    DLOG(INFO) << "onprogress called";
     return GetAttributeEventListener(base::Tokens::progress());
   }
   void set_onprogress(const EventListenerScriptValue& event_listener) {
@@ -483,7 +481,12 @@
   DEFINE_WRAPPABLE_TYPE(EventTarget);
   void TraceMembers(script::Tracer* tracer) override;
 
-  const base::DebuggerHooks& debugger_hooks() { return debugger_hooks_; }
+  const base::DebuggerHooks& debugger_hooks() const {
+    return environment_settings_->debugger_hooks();
+  }
+  script::EnvironmentSettings* environment_settings() const {
+    return environment_settings_;
+  }
 
  private:
   typedef std::vector<std::unique_ptr<EventTargetListenerInfo>>
@@ -499,7 +502,7 @@
 
   EventListenerInfos event_listener_infos_;
 
-  const base::DebuggerHooks& debugger_hooks_;
+  script::EnvironmentSettings* environment_settings_;
 
   // Tracks whether this current event listener should unpack the onerror
   // event object when calling its callback.  This is needed to implement
diff --git a/cobalt/dom/event_target_test.cc b/cobalt/dom/event_target_test.cc
index 94192f3..68eb284 100644
--- a/cobalt/dom/event_target_test.cc
+++ b/cobalt/dom/event_target_test.cc
@@ -18,12 +18,12 @@
 
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/dom_exception.h"
-#include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/global_stats.h"
 #include "cobalt/dom/testing/mock_event_listener.h"
 #include "cobalt/script/testing/fake_script_value.h"
 #include "cobalt/script/testing/mock_exception_state.h"
 #include "cobalt/test/mock_debugger_hooks.h"
+#include "cobalt/web/environment_settings.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
@@ -49,10 +49,7 @@
 
 class EventTargetTest : public ::testing::Test {
  protected:
-  EventTargetTest()
-      : environment_settings_(0, nullptr, nullptr, nullptr, nullptr, nullptr,
-                              nullptr, nullptr, nullptr, debugger_hooks_,
-                              nullptr, DOMSettings::Options()) {
+  EventTargetTest() : environment_settings_(debugger_hooks_) {
     EXPECT_TRUE(GlobalStats::GetInstance()->CheckNoLeaks());
   }
   ~EventTargetTest() override {
@@ -60,7 +57,7 @@
   }
 
   StrictMock<test::MockDebuggerHooks> debugger_hooks_;
-  DOMSettings environment_settings_;
+  web::EnvironmentSettings environment_settings_;
 };
 
 base::Optional<bool> DispatchEventOnCurrentTarget(
diff --git a/cobalt/dom/html_element_context.h b/cobalt/dom/html_element_context.h
index aa4de99..cb4183d 100644
--- a/cobalt/dom/html_element_context.h
+++ b/cobalt/dom/html_element_context.h
@@ -25,8 +25,8 @@
 #include "cobalt/dom/application_lifecycle_state.h"
 #include "cobalt/dom/dom_stat_tracker.h"
 #include "cobalt/dom/parser.h"
-#include "cobalt/dom/url_registry.h"
 #include "cobalt/dom/performance.h"
+#include "cobalt/dom/url_registry.h"
 #include "cobalt/loader/fetcher_factory.h"
 #include "cobalt/loader/font/remote_typeface_cache.h"
 #include "cobalt/loader/image/animated_image_tracker.h"
@@ -75,8 +75,7 @@
       const std::string& font_language_script,
       base::ApplicationState initial_application_state,
       base::WaitableEvent* synchronous_loader_interrupt,
-      Performance* performance,
-      bool enable_inline_script_warnings = false,
+      Performance* performance, bool enable_inline_script_warnings = false,
       float video_playback_rate_multiplier = 1.0);
   ~HTMLElementContext();
 
diff --git a/cobalt/dom/html_element_factory.cc b/cobalt/dom/html_element_factory.cc
index ad47e8d..12cc291 100644
--- a/cobalt/dom/html_element_factory.cc
+++ b/cobalt/dom/html_element_factory.cc
@@ -179,6 +179,11 @@
   } else {
     LOG_IF(WARNING, !IsValidCustomElementName(tag_name))
         << "Unknown HTML element: <" << tag_name << ">.";
+
+    // Check some common tags that should always be found.
+    DCHECK(tag_name != "script");
+    DCHECK(tag_name != "div");
+    DCHECK(tag_name != "html");
     return new HTMLUnknownElement(document, tag_name);
   }
 }
diff --git a/cobalt/dom/html_element_test.cc b/cobalt/dom/html_element_test.cc
index 7161d4f..e8936f9 100644
--- a/cobalt/dom/html_element_test.cc
+++ b/cobalt/dom/html_element_test.cc
@@ -22,7 +22,7 @@
 #include "cobalt/cssom/css_computed_style_data.h"
 #include "cobalt/cssom/css_declared_style_data.h"
 #include "cobalt/cssom/keyword_value.h"
-#include "cobalt/cssom/testing/mock_css_parser.h"
+#include "cobalt/cssom/testing/mock_css_parser.h"  // nogncheck
 #include "cobalt/cssom/viewport_size.h"
 #include "cobalt/dom/document.h"
 #include "cobalt/dom/dom_rect_list.h"
@@ -53,9 +53,7 @@
 ViewportSize kViewSize(320, 240);
 
 // Useful for using base::Bind() along with GMock actions.
-ACTION_P(InvokeCallback0, callback) {
-  callback.Run();
-}
+ACTION_P(InvokeCallback0, callback) { callback.Run(); }
 
 const char kFooBarDeclarationString[] = "foo: bar;";
 const char kDisplayInlineDeclarationString[] = "display: inline;";
diff --git a/cobalt/dom/html_link_element.cc b/cobalt/dom/html_link_element.cc
index 8bce236..906822d 100644
--- a/cobalt/dom/html_link_element.cc
+++ b/cobalt/dom/html_link_element.cc
@@ -209,9 +209,19 @@
   loader::Origin origin = document->location()
                               ? document->location()->GetOriginAsObject()
                               : loader::Origin();
+  disk_cache::ResourceType type;
+  if (rel() == "stylesheet") {
+    type = disk_cache::kCSS;
+  } else if (IsValidSplashScreenFormat(rel())) {
+    type = disk_cache::kSplashScreen;
+  } else {
+    LOG(WARNING) << "<link> has unsupported rel value: " << rel() << ".";
+    NOTIMPLEMENTED();
+    return;
+  }
 
   loader_ = html_element_context()->loader_factory()->CreateLinkLoader(
-      absolute_url_, origin, csp_callback, request_mode_,
+      absolute_url_, origin, csp_callback, request_mode_, type,
       base::Bind(&HTMLLinkElement::OnContentProduced, base::Unretained(this)),
       base::Bind(&HTMLLinkElement::OnLoadingComplete, base::Unretained(this)));
 }
diff --git a/cobalt/dom/html_link_element_test.cc b/cobalt/dom/html_link_element_test.cc
index f487593..0ca5bfa 100644
--- a/cobalt/dom/html_link_element_test.cc
+++ b/cobalt/dom/html_link_element_test.cc
@@ -14,7 +14,7 @@
 
 #include "cobalt/dom/html_link_element.h"
 #include "base/message_loop/message_loop.h"
-#include "cobalt/cssom/testing/mock_css_parser.h"
+#include "cobalt/cssom/testing/mock_css_parser.h"  // nogncheck
 #include "cobalt/dom/document.h"
 #include "cobalt/dom/dom_stat_tracker.h"
 #include "cobalt/dom/testing/stub_environment_settings.h"
diff --git a/cobalt/dom/html_media_element.cc b/cobalt/dom/html_media_element.cc
index 84edb94..7539d91 100644
--- a/cobalt/dom/html_media_element.cc
+++ b/cobalt/dom/html_media_element.cc
@@ -45,13 +45,11 @@
 
 #include "cobalt/dom/eme/media_encrypted_event.h"
 #include "cobalt/dom/eme/media_encrypted_event_init.h"
-#include "cobalt/media/base/media_log.h"
 
 namespace cobalt {
 namespace dom {
 
 using media::BufferedDataSource;
-using media::Ranges;
 using media::WebMediaPlayer;
 
 const char HTMLMediaElement::kMediaSourceUrlProtocol[] = "blob";
@@ -218,17 +216,8 @@
     return buffered;
   }
 
-  const Ranges<base::TimeDelta>& player_buffered =
-      player_->GetBufferedTimeRanges();
-
-  MLOG() << "================================";
-  for (int i = 0; i < static_cast<int>(player_buffered.size()); ++i) {
-    MLOG() << player_buffered.start(i).InSecondsF() << " - "
-           << player_buffered.end(i).InSecondsF();
-    buffered->Add(player_buffered.start(i).InSecondsF(),
-                  player_buffered.end(i).InSecondsF());
-  }
-
+  player_->UpdateBufferedTimeRanges(
+      [&](float start, float end) { buffered->Add(start, end); });
   return buffered;
 }
 
@@ -271,8 +260,6 @@
       NOTREACHED();
   }
   MLOG() << "(" << mime_type << ", " << key_system << ") => " << result;
-  LOG(INFO) << "HTMLMediaElement::canPlayType(" << mime_type << ", "
-            << key_system << ") -> " << result;
   return result;
 }
 
@@ -1681,36 +1668,12 @@
   return map_to_mesh_filter;
 }
 
-namespace {
-
-// Initialization data types are defined in
-// https://www.w3.org/TR/eme-initdata-registry/#registry.
-std::string ToInitDataTypeString(media::EmeInitDataType init_data_type) {
-  switch (init_data_type) {
-    case media::kEmeInitDataTypeCenc:
-      return "cenc";
-    case media::kEmeInitDataTypeFairplay:
-      return "fairplay";
-    case media::kEmeInitDataTypeKeyIds:
-      return "keyids";
-    case media::kEmeInitDataTypeWebM:
-      return "webm";
-    case media::kEmeInitDataTypeUnknown:
-      LOG(WARNING) << "Unknown EME initialization data type.";
-      return "";
-  }
-  // Some compilers error with "control reaches end of non-void function"
-  // without this.
-  NOTREACHED();
-  return "";
-}
-
-}  // namespace
-
 // See https://www.w3.org/TR/encrypted-media/#initdata-encountered.
 void HTMLMediaElement::EncryptedMediaInitDataEncountered(
-    media::EmeInitDataType init_data_type, const unsigned char* init_data,
+    const char* init_data_type, const unsigned char* init_data,
     unsigned int init_data_length) {
+  DCHECK(init_data_type);
+
   // 4. If the media data is CORS-same-origin and not mixed content.
 
   // 5. Queue a task to create an event named encrypted that does not bubble
@@ -1729,8 +1692,7 @@
   if (!current_url.SchemeIs("http") &&
       OriginIsSafe(request_mode_, current_url,
                    node_document()->location()->GetOriginAsObject())) {
-    media_encrypted_event_init.set_init_data_type(
-        ToInitDataTypeString(init_data_type));
+    media_encrypted_event_init.set_init_data_type(init_data_type);
     auto* global_environment =
         html_element_context()->script_runner()->GetGlobalEnvironment();
     media_encrypted_event_init.set_init_data(
diff --git a/cobalt/dom/html_media_element.h b/cobalt/dom/html_media_element.h
index 3d4bb1f..6d708fd 100644
--- a/cobalt/dom/html_media_element.h
+++ b/cobalt/dom/html_media_element.h
@@ -38,14 +38,15 @@
 
 class MediaSource;
 
-typedef media::ChunkDemuxer ChunkDemuxer;
-typedef media::WebMediaPlayer WebMediaPlayer;
-typedef media::WebMediaPlayerClient WebMediaPlayerClient;
-
 // The HTMLMediaElement is the base of HTMLAudioElement and HTMLVideoElement.
 //   https://www.w3.org/TR/html50/embedded-content-0.html#media-element
-class HTMLMediaElement : public HTMLElement, private WebMediaPlayerClient {
+class HTMLMediaElement : public HTMLElement,
+                         private cobalt::media::WebMediaPlayerClient {
  public:
+  typedef ::media::ChunkDemuxer ChunkDemuxer;
+  typedef ::cobalt::media::WebMediaPlayer WebMediaPlayer;
+  typedef ::cobalt::media::WebMediaPlayerClient WebMediaPlayerClient;
+
   HTMLMediaElement(Document* document, base::Token tag_name);
   ~HTMLMediaElement() override;
 
@@ -236,7 +237,7 @@
   std::string MaxVideoCapabilities() const override;
   bool PreferDecodeToTexture() override;
   void EncryptedMediaInitDataEncountered(
-      media::EmeInitDataType init_data_type, const unsigned char* init_data,
+      const char* init_data_type, const unsigned char* init_data,
       unsigned int init_data_length) override;
   void ClearMediaSource();
 
diff --git a/cobalt/dom/html_script_element.cc b/cobalt/dom/html_script_element.cc
index 0fc8836..0261bb6 100644
--- a/cobalt/dom/html_script_element.cc
+++ b/cobalt/dom/html_script_element.cc
@@ -115,6 +115,7 @@
 void HTMLScriptElement::OnParserEndTag() { Prepare(); }
 
 scoped_refptr<HTMLScriptElement> HTMLScriptElement::AsHTMLScriptElement() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   return this;
 }
 
@@ -329,7 +330,8 @@
               base::Unretained(html_element_context()->fetcher_factory()), url_,
               csp_callback, request_mode_,
               document_->location() ? document_->location()->GetOriginAsObject()
-                                    : loader::Origin()),
+                                    : loader::Origin(),
+              disk_cache::kUncompiledScript),
           base::Bind(&loader::TextDecoder::Create,
                      base::Bind(&HTMLScriptElement::OnSyncContentProduced,
                                 base::Unretained(this)),
diff --git a/cobalt/dom/html_video_element.cc b/cobalt/dom/html_video_element.cc
index eb7a30a..cc14883 100644
--- a/cobalt/dom/html_video_element.cc
+++ b/cobalt/dom/html_video_element.cc
@@ -62,16 +62,18 @@
   if (!player()) {
     return 0u;
   }
-  DCHECK_GE(player()->GetNaturalSize().width(), 0);
-  return static_cast<uint32>(player()->GetNaturalSize().width());
+  int width = player()->GetNaturalWidth();
+  DCHECK_GE(width, 0);
+  return static_cast<uint32>(width);
 }
 
 uint32 HTMLVideoElement::video_height() const {
   if (!player()) {
     return 0u;
   }
-  DCHECK_GE(player()->GetNaturalSize().height(), 0);
-  return static_cast<uint32>(player()->GetNaturalSize().height());
+  int height = player()->GetNaturalHeight();
+  DCHECK_GE(height, 0);
+  return static_cast<uint32>(height);
 }
 
 scoped_refptr<VideoPlaybackQuality> HTMLVideoElement::GetVideoPlaybackQuality(
diff --git a/cobalt/dom/intersection_observer_test.cc b/cobalt/dom/intersection_observer_test.cc
index 32b1db2..fc1d683 100644
--- a/cobalt/dom/intersection_observer_test.cc
+++ b/cobalt/dom/intersection_observer_test.cc
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 #include "cobalt/cssom/percentage_value.h"
-#include "cobalt/cssom/testing/mock_css_parser.h"
+#include "cobalt/cssom/testing/mock_css_parser.h"  // nogncheck
 #include "cobalt/dom/document.h"
 #include "cobalt/dom/dom_stat_tracker.h"
 #include "cobalt/dom/element.h"
diff --git a/cobalt/dom/location.cc b/cobalt/dom/location.cc
index dfcbea6..e34db7c 100644
--- a/cobalt/dom/location.cc
+++ b/cobalt/dom/location.cc
@@ -23,12 +23,15 @@
 
 Location::Location(const GURL& url, const base::Closure& hashchange_callback,
                    const base::Callback<void(const GURL&)>& navigation_callback,
-                   const csp::SecurityCallback& security_callback)
+                   const csp::SecurityCallback& security_callback,
+                   const base::Callback<void(NavigationType type)>&
+                       set_navigation_type_callback)
     : ALLOW_THIS_IN_INITIALIZER_LIST(url_utils_(
           url, base::Bind(&Location::Replace, base::Unretained(this)))),
       hashchange_callback_(hashchange_callback),
       navigation_callback_(navigation_callback),
-      security_callback_(security_callback) {}
+      security_callback_(security_callback),
+      set_navigation_type_callback_(set_navigation_type_callback) {}
 
 // Algorithm for Replace:
 //   https://www.w3.org/TR/html50/browsers.html#dom-location-replace
@@ -78,6 +81,9 @@
     if (!navigation_callback_.is_null()) {
       navigation_callback_.Run(new_url);
     }
+    if (!set_navigation_type_callback_.is_null()) {
+      set_navigation_type_callback_.Run(kNavigationTypeNavigate);
+    }
   }
 }
 
@@ -86,6 +92,9 @@
     LOG(INFO) << "Reloading URL: " << url();
     navigation_callback_.Run(url());
   }
+  if (!set_navigation_type_callback_.is_null()) {
+    set_navigation_type_callback_.Run(kNavigationTypeReload);
+  }
 }
 
 }  // namespace dom
diff --git a/cobalt/dom/location.h b/cobalt/dom/location.h
index d73dde0..b103683 100644
--- a/cobalt/dom/location.h
+++ b/cobalt/dom/location.h
@@ -19,6 +19,7 @@
 
 #include "base/callback.h"
 #include "cobalt/csp/content_security_policy.h"
+#include "cobalt/dom/navigation_type.h"
 #include "cobalt/dom/url_utils.h"
 #include "cobalt/script/wrappable.h"
 #include "url/gurl.h"
@@ -37,7 +38,9 @@
   // otherwise they can be empty.
   Location(const GURL& url, const base::Closure& hashchange_callback,
            const base::Callback<void(const GURL&)>& navigation_callback,
-           const csp::SecurityCallback& security_callback);
+           const csp::SecurityCallback& security_callback,
+           const base::Callback<void(NavigationType type)>&
+               set_navigation_type_callback);
 
   // Web API: Location
   //
@@ -102,6 +105,7 @@
   base::Closure hashchange_callback_;
   base::Callback<void(const GURL&)> navigation_callback_;
   csp::SecurityCallback security_callback_;
+  const base::Callback<void(NavigationType)> set_navigation_type_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(Location);
 };
diff --git a/cobalt/dom/location_test.cc b/cobalt/dom/location_test.cc
index 70385a4..a63cab6 100644
--- a/cobalt/dom/location_test.cc
+++ b/cobalt/dom/location_test.cc
@@ -62,8 +62,10 @@
   void Init(const GURL& url, const base::Closure& hashchange_callback,
             const base::Callback<void(const GURL&)>& navigation_callback,
             const csp::SecurityCallback& security_callback) {
+    base::Callback<void(NavigationType)> null_cb;
     location_ = new Location(url, hashchange_callback, navigation_callback,
-                             security_callback);
+                             security_callback,
+                             null_cb /*set_navigation_type_callback*/);
   }
 
   scoped_refptr<Location> location_;
diff --git a/cobalt/dom/lottie_player.cc b/cobalt/dom/lottie_player.cc
index fdd508e..57ee5de 100644
--- a/cobalt/dom/lottie_player.cc
+++ b/cobalt/dom/lottie_player.cc
@@ -16,6 +16,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
@@ -124,8 +125,12 @@
 }
 
 std::string LottiePlayer::renderer() const {
-  // Cobalt uses a custom compiled-in renderer.
+// Cobalt uses a custom compiled-in renderer.
+#if defined(USE_SKIA_NEXT)
+  return "skottie-m97";
+#else
   return "skottie-m79";
+#endif
 }
 
 void LottiePlayer::Load(std::string src) {
diff --git a/cobalt/dom/media_source.cc b/cobalt/dom/media_source.cc
index a970978..3707c32 100644
--- a/cobalt/dom/media_source.cc
+++ b/cobalt/dom/media_source.cc
@@ -52,20 +52,21 @@
 #include "base/compiler_specific.h"
 #include "base/guid.h"
 #include "base/logging.h"
+#include "base/trace_event/trace_event.h"
 #include "cobalt/base/tokens.h"
 #include "cobalt/dom/dom_exception.h"
 #include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/event.h"
-#include "cobalt/media/base/pipeline_status.h"
 #include "starboard/media.h"
+#include "third_party/chromium/media/base/pipeline_status.h"
 
 namespace cobalt {
 namespace dom {
 
-using media::CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR;
-using media::CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR;
-using media::PIPELINE_OK;
-using media::PipelineStatus;
+using ::media::CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR;
+using ::media::CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR;
+using ::media::PIPELINE_OK;
+using ::media::PipelineStatus;
 
 MediaSource::MediaSource(script::EnvironmentSettings* settings)
     : EventTarget(settings),
@@ -149,6 +150,7 @@
 scoped_refptr<SourceBuffer> MediaSource::AddSourceBuffer(
     script::EnvironmentSettings* settings, const std::string& type,
     script::ExceptionState* exception_state) {
+  TRACE_EVENT1("cobalt::dom", "MediaSource::AddSourceBuffer()", "type", type);
   DLOG(INFO) << "add SourceBuffer with type " << type;
 
   if (type.empty()) {
@@ -191,6 +193,7 @@
 void MediaSource::RemoveSourceBuffer(
     const scoped_refptr<SourceBuffer>& source_buffer,
     script::ExceptionState* exception_state) {
+  TRACE_EVENT0("cobalt::dom", "MediaSource::RemoveSourceBuffer()");
   if (source_buffer.get() == NULL) {
     DOMException::Raise(DOMException::kInvalidAccessErr, exception_state);
     return;
@@ -222,12 +225,14 @@
 }
 
 void MediaSource::EndOfStream(script::ExceptionState* exception_state) {
+  TRACE_EVENT0("cobalt::dom", "MediaSource::EndOfStream()");
   // If there is no error string provided, treat it as empty.
   EndOfStream(kMediaSourceEndOfStreamErrorNoError, exception_state);
 }
 
 void MediaSource::EndOfStream(MediaSourceEndOfStreamError error,
                               script::ExceptionState* exception_state) {
+  TRACE_EVENT1("cobalt::dom", "MediaSource::EndOfStream()", "error", error);
   if (!IsOpen() || IsUpdating()) {
     DOMException::Raise(DOMException::kInvalidStateErr, exception_state);
     return;
@@ -265,28 +270,24 @@
 // static
 bool MediaSource::IsTypeSupported(script::EnvironmentSettings* settings,
                                   const std::string& type) {
+  TRACE_EVENT1("cobalt::dom", "MediaSource::IsTypeSupported()", "type", type);
   DCHECK(settings);
   DOMSettings* dom_settings =
       base::polymorphic_downcast<DOMSettings*>(settings);
   DCHECK(dom_settings->can_play_type_handler());
   SbMediaSupportType support_type =
       dom_settings->can_play_type_handler()->CanPlayAdaptive(type.c_str(), "");
-  if (support_type == kSbMediaSupportTypeNotSupported) {
-    LOG(INFO) << "MediaSource::IsTypeSupported(" << type
-              << ") -> not supported/false";
-    return false;
+  switch (support_type) {
+    case kSbMediaSupportTypeNotSupported:
+      return false;
+    case kSbMediaSupportTypeMaybe:
+      return true;
+    case kSbMediaSupportTypeProbably:
+      return true;
+    default:
+      NOTREACHED();
+      return false;
   }
-  if (support_type == kSbMediaSupportTypeMaybe) {
-    LOG(INFO) << "MediaSource::IsTypeSupported(" << type << ") -> maybe/true";
-    return true;
-  }
-  if (support_type == kSbMediaSupportTypeProbably) {
-    LOG(INFO) << "MediaSource::IsTypeSupported(" << type
-              << ") -> probably/true";
-    return true;
-  }
-  NOTREACHED();
-  return false;
 }
 
 bool MediaSource::AttachToElement(HTMLMediaElement* media_element) {
diff --git a/cobalt/dom/media_source.h b/cobalt/dom/media_source.h
index 5951b33..0fb691c 100644
--- a/cobalt/dom/media_source.h
+++ b/cobalt/dom/media_source.h
@@ -61,9 +61,9 @@
 #include "cobalt/dom/time_ranges.h"
 #include "cobalt/dom/url_registry.h"
 #include "cobalt/dom/video_track.h"
-#include "cobalt/media/filters/chunk_demuxer.h"
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/script/exception_state.h"
+#include "third_party/chromium/media/filters/chunk_demuxer.h"
 
 namespace cobalt {
 namespace dom {
@@ -73,6 +73,7 @@
 //   https://www.w3.org/TR/2016/CR-media-source-20160705/#idl-def-MediaSource
 class MediaSource : public EventTarget {
  public:
+  typedef ::media::ChunkDemuxer ChunkDemuxer;
   typedef UrlRegistry<MediaSource> Registry;
 
   // Custom, not in any spec.
@@ -108,7 +109,7 @@
   //
   // HTMLMediaSource
   bool AttachToElement(HTMLMediaElement* media_element);
-  void SetChunkDemuxerAndOpen(media::ChunkDemuxer* chunk_demuxer);
+  void SetChunkDemuxerAndOpen(ChunkDemuxer* chunk_demuxer);
   void Close();
   bool IsClosed() const;
   scoped_refptr<TimeRanges> GetBufferedRange() const;
@@ -130,7 +131,7 @@
   bool IsUpdating() const;
   void ScheduleEvent(base::Token event_name);
 
-  media::ChunkDemuxer* chunk_demuxer_;
+  ChunkDemuxer* chunk_demuxer_;
   MediaSourceReadyState ready_state_;
   EventQueue event_queue_;
   base::WeakPtr<HTMLMediaElement> attached_element_;
diff --git a/cobalt/dom/memory_info.cc b/cobalt/dom/memory_info.cc
index cc0155f..401ec9f 100644
--- a/cobalt/dom/memory_info.cc
+++ b/cobalt/dom/memory_info.cc
@@ -17,6 +17,8 @@
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/dom_settings.h"
 #include "cobalt/script/javascript_engine.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace cobalt {
 namespace dom {
@@ -27,7 +29,9 @@
     return 0u;
   }
   return static_cast<uint32>(
-      base::polymorphic_downcast<DOMSettings*>(environment_settings)
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings)
+          ->context()
           ->javascript_engine()
           ->GetHeapStatistics()
           .total_heap_size);
@@ -39,7 +43,9 @@
     return 0u;
   }
   return static_cast<uint32>(
-      base::polymorphic_downcast<DOMSettings*>(environment_settings)
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings)
+          ->context()
           ->javascript_engine()
           ->GetHeapStatistics()
           .used_heap_size);
diff --git a/cobalt/dom/message_event.cc b/cobalt/dom/message_event.cc
index fa4359c..434ce9c 100644
--- a/cobalt/dom/message_event.cc
+++ b/cobalt/dom/message_event.cc
@@ -16,10 +16,12 @@
 #include "cobalt/dom/message_event.h"
 
 #include <string>
+#include <utility>
 
 #include "base/basictypes.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/dom/dom_settings.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "starboard/common/string.h"
 
 namespace {
@@ -46,15 +48,15 @@
 MessageEvent::ResponseTypeCode MessageEvent::GetResponseTypeCode(
     base::StringPiece to_match) {
   for (std::size_t i = 0; i != arraysize(kResponseTypes); ++i) {
-    if (strncmp(kResponseTypes[i], to_match.data(), to_match.size()) ==
-        0) {
+    if (strncmp(kResponseTypes[i], to_match.data(), to_match.size()) == 0) {
       return MessageEvent::ResponseTypeCode(i);
     }
   }
   return kResponseTypeCodeMax;
 }
 
-MessageEvent::ResponseType MessageEvent::data() const {
+MessageEvent::ResponseType MessageEvent::data(
+    script::EnvironmentSettings* settings) const {
   const char* data_pointer = NULL;
   int data_length = 0;
   if (data_) {
@@ -63,7 +65,9 @@
   }
 
   auto* global_environment =
-      base::polymorphic_downcast<DOMSettings*>(settings_)->global_environment();
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+          ->context()
+          ->global_environment();
   script::Handle<script::ArrayBuffer> response_buffer;
   if (response_type_ != kText) {
     auto buffer_copy =
@@ -78,7 +82,7 @@
       return ResponseType(string_response);
     }
     case kBlob: {
-      scoped_refptr<dom::Blob> blob = new dom::Blob(settings_, response_buffer);
+      scoped_refptr<dom::Blob> blob = new dom::Blob(settings, response_buffer);
       return ResponseType(blob);
     }
     case kArrayBuffer: {
diff --git a/cobalt/dom/message_event.h b/cobalt/dom/message_event.h
index e6fbdbb..bd55426 100644
--- a/cobalt/dom/message_event.h
+++ b/cobalt/dom/message_event.h
@@ -36,23 +36,19 @@
   typedef script::UnionType3<std::string, scoped_refptr<dom::Blob>,
                              script::Handle<script::ArrayBuffer> >
       ResponseType;
-  // These response codes are ordered in the likelyhood of being used.
+  // These response codes are ordered in the likelihood of being used.
   // Keeping them in expected order will help make code faster.
   enum ResponseTypeCode { kText, kBlob, kArrayBuffer, kResponseTypeCodeMax };
 
-  MessageEvent(base::Token type, script::EnvironmentSettings* settings,
-               ResponseTypeCode response_type,
+  MessageEvent(base::Token type, ResponseTypeCode response_type,
                const scoped_refptr<net::IOBufferWithSize>& data)
-      : Event(type),
-        settings_(settings),
-        response_type_(response_type),
-        data_(data) {}
+      : Event(type), response_type_(response_type), data_(data) {}
 
   // Creates an event with its "initialized flag" unset.
   explicit MessageEvent(UninitializedFlag uninitialized_flag)
       : Event(uninitialized_flag) {}
 
-  ResponseType data() const;
+  ResponseType data(script::EnvironmentSettings* settings) const;
 
   // These helper functions are custom, and not in any spec.
   static std::string GetResponseTypeAsString(const ResponseTypeCode code);
@@ -62,7 +58,6 @@
   DEFINE_WRAPPABLE_TYPE(MessageEvent)
 
  private:
-  script::EnvironmentSettings* settings_;
   ResponseTypeCode response_type_;
   scoped_refptr<net::IOBufferWithSize> data_;
 };
diff --git a/cobalt/dom/message_event.idl b/cobalt/dom/message_event.idl
index 5730495..f3d0c10 100644
--- a/cobalt/dom/message_event.idl
+++ b/cobalt/dom/message_event.idl
@@ -16,5 +16,5 @@
 // IDL source: https://html.spec.whatwg.org/multipage/comms.html#messageevent
 // Only the subset of the IDL that is necessary for Websockets is implemented.
 interface MessageEvent : Event {
-  readonly attribute DOMString data;
+  [CallWith = EnvironmentSettings] readonly attribute DOMString data;
 };
diff --git a/cobalt/dom/navigation_type.idl b/cobalt/dom/navigation_type.idl
new file mode 100644
index 0000000..4326021
--- /dev/null
+++ b/cobalt/dom/navigation_type.idl
@@ -0,0 +1,23 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://www.w3.org/TR/2022/WD-navigation-timing-2-20220224/#sec-performance-navigation-types
+
+// Cobalt only supports "navigate" and "reload".
+enum NavigationType {
+    "navigate",
+    "reload",
+    "back_forward",
+    "prerender"
+};
diff --git a/cobalt/dom/navigator.cc b/cobalt/dom/navigator.cc
index 6e1e73d..b82cd66 100644
--- a/cobalt/dom/navigator.cc
+++ b/cobalt/dom/navigator.cc
@@ -157,7 +157,9 @@
       plugins_(new PluginArray()),
       media_devices_(
           new media_capture::MediaDevices(settings, script_value_factory)),
-      service_worker_(new worker::ServiceWorkerContainer(script_value_factory)),
+      service_worker_(new worker::ServiceWorkerContainer(
+          settings, base::polymorphic_downcast<DOMSettings*>(settings)
+                        ->service_worker_jobs())),
       system_caption_settings_(captions),
       script_value_factory_(script_value_factory) {}
 
diff --git a/cobalt/dom/navigator_ua_data.cc b/cobalt/dom/navigator_ua_data.cc
index 73d9aed..46df53c 100644
--- a/cobalt/dom/navigator_ua_data.cc
+++ b/cobalt/dom/navigator_ua_data.cc
@@ -39,10 +39,8 @@
   all_high_entropy_values_.set_brands(brands_);
   all_high_entropy_values_.set_mobile(mobile_);
   all_high_entropy_values_.set_platform(platform_);
-#if SB_API_VERSION >= 12
   all_high_entropy_values_.set_architecture(SB_SABI_TARGET_ARCH);
   all_high_entropy_values_.set_bitness(SB_SABI_WORD_SIZE);
-#endif
   all_high_entropy_values_.set_model(platform_info->model().value_or(""));
   all_high_entropy_values_.set_platform_version(
       platform_info->firmware_version().value_or(""));
diff --git a/cobalt/dom/node.cc b/cobalt/dom/node.cc
index 7df763a..0b39848 100644
--- a/cobalt/dom/node.cc
+++ b/cobalt/dom/node.cc
@@ -15,6 +15,7 @@
 #include "cobalt/dom/node.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/lazy_instance.h"
@@ -58,7 +59,7 @@
   DCHECK(event->initialized_flag());
 
   TRACE_EVENT1("cobalt::dom", "Node::DispatchEvent", "event",
-               event->type().c_str());
+               TRACE_STR_COPY(event->type().c_str()));
 
   if (!event || event->IsBeingDispatched() || !event->initialized_flag()) {
     return false;
diff --git a/cobalt/dom/on_screen_keyboard_test.cc b/cobalt/dom/on_screen_keyboard_test.cc
index 08760bb..095595d 100644
--- a/cobalt/dom/on_screen_keyboard_test.cc
+++ b/cobalt/dom/on_screen_keyboard_test.cc
@@ -294,18 +294,12 @@
 
 }  // namespace
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
-
 bool SkipLocale() {
-#if SB_API_VERSION >= 12
   bool skipTests = !SbWindowOnScreenKeyboardIsSupported();
   if (skipTests) {
     SB_LOG(INFO) << "On screen keyboard not supported. Test skipped.";
   }
   return skipTests;
-#else
-  return false;
-#endif
 }
 
 TEST_F(OnScreenKeyboardTest, ObjectExists) {
@@ -708,36 +702,6 @@
   )";
   EXPECT_TRUE(EvaluateScript(script, NULL));
 }
-#else   // SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
-TEST_F(OnScreenKeyboardTest, ObjectDoesntExist) {
-  std::string result;
-
-  EXPECT_TRUE(
-      EvaluateScript("window.hasOwnProperty('onScreenKeyboard');", &result));
-  EXPECT_EQ("false", result);
-  EXPECT_TRUE(EvaluateScript("window.onScreenKeyboard;", &result));
-  EXPECT_FALSE(bindings::testing::IsAcceptablePrototypeString(
-      "OnScreenKeyboard", result));
-  EXPECT_TRUE(EvaluateScript("typeof window.onScreenKeyboard === 'undefined';",
-                             &result));
-  EXPECT_EQ("true", result);
-
-  // We should be able to assign anything we like to window.onScreenKeyboard.
-  const char number_script[] = R"(
-    window.onScreenKeyboard = 42;
-    window.onScreenKeyboard;
-  )";
-  EXPECT_TRUE(EvaluateScript(number_script, &result));
-  EXPECT_EQ("42", result);
-
-  const char object_script[] = R"(
-    window.onScreenKeyboard = {foo: 'bar'};
-    window.onScreenKeyboard.hasOwnProperty('foo');
-  )";
-  EXPECT_TRUE(EvaluateScript(object_script, &result));
-  EXPECT_EQ("true", result);
-}
-#endif  // SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 
 }  // namespace dom
 }  // namespace cobalt
diff --git a/cobalt/dom/performance.h b/cobalt/dom/performance.h
index d48c7ea..50a754b 100644
--- a/cobalt/dom/performance.h
+++ b/cobalt/dom/performance.h
@@ -20,9 +20,9 @@
 #include <map>
 #include <string>
 
-#include "base/time/default_tick_clock.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_checker.h"
+#include "base/time/default_tick_clock.h"
 #include "cobalt/base/application_state.h"
 #include "cobalt/base/clock.h"
 #include "cobalt/dom/event_target.h"
@@ -71,8 +71,7 @@
       base::TimeTicks monotonic_time) const;
 
   static DOMHighResTimeStamp MonotonicTimeToDOMHighResTimeStamp(
-      base::TimeTicks time_origin,
-      base::TimeTicks monotonic_time);
+      base::TimeTicks time_origin, base::TimeTicks monotonic_time);
 
   // Web API: Performance Timeline extensions to the Performance.
   //   https://www.w3.org/TR/performance-timeline-2/#extensions-to-the-performance-interface
@@ -111,12 +110,13 @@
   void CreatePerformanceResourceTiming(const net::LoadTimingInfo& timing_info,
                                        const std::string& initiator_type,
                                        const std::string& requested_url);
-  void CreatePerformanceLifecycleTiming();
+  void AddEntryToPerformanceEntryBuffer(
+      const scoped_refptr<PerformanceEntry>& entry) {
+    performance_entry_buffer_.push_back(entry);
+  }
   // Custom, not in any spec.
   // Internal getter method for the time origin value.
-  base::TimeTicks GetTimeOrigin() const {
-      return time_origin_;
-  }
+  base::TimeTicks GetTimeOrigin() const { return time_origin_; }
   // Register and unregisterthe performance observer.
   void UnregisterPerformanceObserver(
       const scoped_refptr<PerformanceObserver>& observer);
@@ -135,8 +135,8 @@
   void SetApplicationState(base::ApplicationState state,
                            SbTimeMonotonic timestamp);
 
-  void SetApplicationStartOrPreloadTimestamp(
-      bool is_preload, SbTimeMonotonic timestamp);
+  void SetApplicationStartOrPreloadTimestamp(bool is_preload,
+                                             SbTimeMonotonic timestamp);
 
   void SetDeepLinkTimestamp(SbTimeMonotonic timestamp);
 
@@ -144,7 +144,8 @@
   DEFINE_WRAPPABLE_TYPE(Performance);
 
  private:
-  unsigned long GetDroppedEntriesCount(const std::string& entry_type);
+  unsigned long GetDroppedEntriesCount(  // NOLINT(runtime/int)
+      const std::string& entry_type);
 
   base::TimeTicks time_origin_;
   const base::TickClock* tick_clock_;
@@ -172,10 +173,10 @@
       RegisteredPerformanceObserverList;
   RegisteredPerformanceObserverList registered_performance_observers_;
 
-  unsigned long resource_timing_buffer_size_limit_;
-  unsigned long resource_timing_buffer_current_size_;
+  unsigned long resource_timing_buffer_size_limit_;    // NOLINT(runtime/int)
+  unsigned long resource_timing_buffer_current_size_;  // NOLINT(runtime/int)
   bool resource_timing_buffer_full_event_pending_flag_;
-  unsigned long
+  unsigned long  // NOLINT(runtime/int)
       resource_timing_secondary_buffer_current_size_;
   std::deque<scoped_refptr<PerformanceResourceTiming>>
       resource_timing_secondary_buffer_;
diff --git a/cobalt/dom/performance_lifecycle_timing.cc b/cobalt/dom/performance_lifecycle_timing.cc
index d81ebb0..e06763f 100644
--- a/cobalt/dom/performance_lifecycle_timing.cc
+++ b/cobalt/dom/performance_lifecycle_timing.cc
@@ -21,32 +21,32 @@
 
 namespace {
 
-  std::string TranslateApplicationStateToString(
-      base::ApplicationState state) {
-    switch (state) {
-      case base::kApplicationStateBlurred:
-        return "ApplicationStateBlurred";
-      case base::kApplicationStateConcealed:
-        return "ApplicationStateConcealed";
-      case base::kApplicationStateFrozen:
-        return "ApplicationStateFrozen";
-      case base::kApplicationStateStarted:
-        return "ApplicationStateStarted";
-      case base::kApplicationStateStopped:
-        return "ApplicationStateStopped";
-    }
-
-    NOTREACHED() << "state = " << state;
-    return "INVALID_APPLICATION_STATE";
+std::string TranslateApplicationStateToString(base::ApplicationState state) {
+  switch (state) {
+    case base::kApplicationStateBlurred:
+      return "ApplicationStateBlurred";
+    case base::kApplicationStateConcealed:
+      return "ApplicationStateConcealed";
+    case base::kApplicationStateFrozen:
+      return "ApplicationStateFrozen";
+    case base::kApplicationStateStarted:
+      return "ApplicationStateStarted";
+    case base::kApplicationStateStopped:
+      return "ApplicationStateStopped";
   }
 
-    DOMHighResTimeStamp ConvertSbTimeMonotonicToDOMHiResTimeStamp(
-      const DOMHighResTimeStamp time_origin, SbTimeMonotonic monotonic_time) {
-    SbTimeMonotonic time_delta = SbTimeGetNow() - SbTimeGetMonotonicNow();
-    base::Time base_time = base::Time::FromSbTime(time_delta + monotonic_time);
-    return ClampTimeStampMinimumResolution(base_time.ToJsTime() - time_origin,
-        Performance::kPerformanceTimerMinResolutionInMicroseconds);
-  }
+  NOTREACHED() << "state = " << state;
+  return "INVALID_APPLICATION_STATE";
+}
+
+DOMHighResTimeStamp ConvertSbTimeMonotonicToDOMHiResTimeStamp(
+    const DOMHighResTimeStamp time_origin, SbTimeMonotonic monotonic_time) {
+  SbTimeMonotonic time_delta = SbTimeGetNow() - SbTimeGetMonotonicNow();
+  base::Time base_time = base::Time::FromSbTime(time_delta + monotonic_time);
+  return ClampTimeStampMinimumResolution(
+      base_time.ToJsTime() - time_origin,
+      Performance::kPerformanceTimerMinResolutionInMicroseconds);
+}
 
 }  // namespace
 
@@ -96,8 +96,7 @@
 }
 
 std::string PerformanceLifecycleTiming::last_state() const {
-  return TranslateApplicationStateToString(
-      lifecycle_timing_info_.last_state);
+  return TranslateApplicationStateToString(lifecycle_timing_info_.last_state);
 }
 
 void PerformanceLifecycleTiming::SetApplicationState(
@@ -112,10 +111,10 @@
       } else if (GetCurrentState() == base::kApplicationStateConcealed) {
         lifecycle_timing_info_.app_reveal = timestamp;
       } else {
-        DLOG(INFO) << "Current State: " <<
-            TranslateApplicationStateToString(GetCurrentState());
-        DLOG(INFO) << "Next State: " <<
-            TranslateApplicationStateToString(state);
+        DLOG(INFO) << "Current State: "
+                   << TranslateApplicationStateToString(GetCurrentState());
+        DLOG(INFO) << "Next State: "
+                   << TranslateApplicationStateToString(state);
         NOTREACHED() << "Invalid application state transition.";
       }
       break;
@@ -126,10 +125,10 @@
       } else if (GetCurrentState() == base::kApplicationStateFrozen) {
         lifecycle_timing_info_.app_unfreeze = timestamp;
       } else {
-        DLOG(INFO) << "Current State: " <<
-            TranslateApplicationStateToString(GetCurrentState());
-        DLOG(INFO) << "Next State: " <<
-            TranslateApplicationStateToString(state);
+        DLOG(INFO) << "Current State: "
+                   << TranslateApplicationStateToString(GetCurrentState());
+        DLOG(INFO) << "Next State: "
+                   << TranslateApplicationStateToString(state);
         NOTREACHED() << "Invalid application state transition.";
       }
       break;
@@ -138,7 +137,7 @@
       break;
     case base::kApplicationStateStarted:
       if (GetCurrentState() == base::kApplicationStateBlurred) {
-        if (lifecycle_timing_info_.app_preload != 0) {
+        if (lifecycle_timing_info_.app_start == 0) {
           lifecycle_timing_info_.app_start = timestamp;
         }
         lifecycle_timing_info_.app_focus = timestamp;
@@ -176,19 +175,17 @@
 
 void PerformanceLifecycleTiming::SetLifecycleTimingInfoState(
     base::ApplicationState state) {
-  lifecycle_timing_info_.last_state =
-      lifecycle_timing_info_.current_state;
+  lifecycle_timing_info_.last_state = lifecycle_timing_info_.current_state;
   lifecycle_timing_info_.current_state = state;
 }
 
 DOMHighResTimeStamp PerformanceLifecycleTiming::ReportDOMHighResTimeStamp(
     SbTimeMonotonic timestamp) const {
   if (timestamp != 0) {
-    return ConvertSbTimeMonotonicToDOMHiResTimeStamp(time_origin_,
-                                                     timestamp);
+    return ConvertSbTimeMonotonicToDOMHiResTimeStamp(time_origin_, timestamp);
   }
   return PerformanceEntry::start_time();
 }
 
 }  // namespace dom
-}  // namespace cobalt
\ No newline at end of file
+}  // namespace cobalt
diff --git a/cobalt/dom/performance_navigation_timing.cc b/cobalt/dom/performance_navigation_timing.cc
new file mode 100644
index 0000000..ca6c3eb
--- /dev/null
+++ b/cobalt/dom/performance_navigation_timing.cc
@@ -0,0 +1,92 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/dom/performance_navigation_timing.h"
+#include "cobalt/dom/performance.h"
+
+#include "cobalt/dom/document.h"
+
+namespace cobalt {
+namespace dom {
+
+namespace {
+//  https://www.w3.org/TR/resource-timing-2/#dom-performanceresourcetiming-initiatortype
+const char kPerformanceNavigationInitiatorType[] = "navigation";
+}  // namespace
+
+PerformanceNavigationTiming::PerformanceNavigationTiming(
+    const net::LoadTimingInfo& timing_info, const std::string& requested_url,
+    Performance* performance, Document* document, base::TimeTicks time_origin)
+    : PerformanceResourceTiming(timing_info,
+                                kPerformanceNavigationInitiatorType,
+                                requested_url, performance, time_origin),
+      document_(base::AsWeakPtr(document)),
+      time_origin_(time_origin) {}
+
+std::string PerformanceNavigationTiming::initiator_type() const {
+  return kPerformanceNavigationInitiatorType;
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::unload_event_start() const {
+  base::TimeTicks start_time = document_->GetDocumentUnloadEventStartTime();
+  if (start_time.is_null()) {
+    return 0.0;
+  }
+
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+                                                         start_time);
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::unload_event_end() const {
+  base::TimeTicks end_time = document_->GetDocumentUnloadEventEndTime();
+  if (end_time.is_null()) {
+    return 0.0;
+  }
+
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
+                                                         end_time);
+}
+
+DOMHighResTimeStamp
+PerformanceNavigationTiming::dom_content_loaded_event_start() const {
+  return document_->GetDocumentContentLoadedEventStartTime();
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::dom_content_loaded_event_end()
+    const {
+  return document_->GetDocumentContentLoadedEventEndTime();
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::dom_complete() const {
+  return document_->GetDocumentDomCompleteTime();
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::load_event_start() const {
+  return document_->GetDocumentLoadEventStartTime();
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::load_event_end() const {
+  return document_->GetDocumentLoadEventEndTime();
+}
+
+NavigationType PerformanceNavigationTiming::type() const {
+  return document_->GetNavigationType();
+}
+
+DOMHighResTimeStamp PerformanceNavigationTiming::duration() const {
+  return load_event_end() - start_time();
+}
+
+}  // namespace dom
+}  // namespace cobalt
diff --git a/cobalt/dom/performance_navigation_timing.h b/cobalt/dom/performance_navigation_timing.h
new file mode 100644
index 0000000..49b1a4b
--- /dev/null
+++ b/cobalt/dom/performance_navigation_timing.h
@@ -0,0 +1,78 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_DOM_PERFORMANCE_NAVIGATION_TIMING_H_
+#define COBALT_DOM_PERFORMANCE_NAVIGATION_TIMING_H_
+
+#include <string>
+
+#include "base/memory/weak_ptr.h"
+#include "cobalt/dom/navigation_type.h"
+#include "cobalt/dom/performance_entry.h"
+#include "cobalt/dom/performance_high_resolution_time.h"
+#include "cobalt/dom/performance_resource_timing.h"
+
+#include "cobalt/script/wrappable.h"
+#include "net/base/load_timing_info.h"
+
+namespace cobalt {
+namespace dom {
+
+class Document;
+class Performance;
+
+// Implements the Performance Navigation Timing IDL interface, as described
+// here:
+//   https://www.w3.org/TR/navigation-timing-2/
+class PerformanceNavigationTiming : public PerformanceResourceTiming {
+ public:
+  PerformanceNavigationTiming(const net::LoadTimingInfo& timing_info,
+                              const std::string& requested_url,
+                              Performance* performance, Document* document,
+                              base::TimeTicks time_origin);
+
+  // Web API.
+  DOMHighResTimeStamp unload_event_start() const;
+  DOMHighResTimeStamp unload_event_end() const;
+  DOMHighResTimeStamp dom_content_loaded_event_start() const;
+  DOMHighResTimeStamp dom_content_loaded_event_end() const;
+  DOMHighResTimeStamp dom_complete() const;
+  DOMHighResTimeStamp load_event_start() const;
+  DOMHighResTimeStamp load_event_end() const;
+  NavigationType type() const;
+
+  // PerformanceResourceTiming overrides.
+  std::string initiator_type() const override;
+
+  // PerformanceEntry overrides. Return a timestamp equal to the difference
+  // between loadEventEnd and its startTime.
+  DOMHighResTimeStamp duration() const override;
+
+  std::string entry_type() const override { return "navigation"; }
+  PerformanceEntryType EntryTypeEnum() const override {
+    return PerformanceEntry::kNavigation;
+  }
+
+  DEFINE_WRAPPABLE_TYPE(PerformanceNavigationTiming);
+
+ private:
+  base::WeakPtr<Document> document_;
+  base::TimeTicks time_origin_;
+
+  DISALLOW_COPY_AND_ASSIGN(PerformanceNavigationTiming);
+};
+}  // namespace dom
+}  // namespace cobalt
+
+#endif  // COBALT_DOM_PERFORMANCE_NAVIGATION_TIMING_H_
diff --git a/cobalt/dom/performance_navigation_timing.idl b/cobalt/dom/performance_navigation_timing.idl
new file mode 100644
index 0000000..4883cc3
--- /dev/null
+++ b/cobalt/dom/performance_navigation_timing.idl
@@ -0,0 +1,27 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://www.w3.org/TR/2022/WD-navigation-timing-2-20220224/
+
+[Exposed=Window]
+interface PerformanceNavigationTiming : PerformanceResourceTiming {
+  readonly attribute DOMHighResTimeStamp unloadEventStart;
+  readonly attribute DOMHighResTimeStamp unloadEventEnd;
+  readonly attribute DOMHighResTimeStamp domContentLoadedEventStart;
+  readonly attribute DOMHighResTimeStamp domContentLoadedEventEnd;
+  readonly attribute DOMHighResTimeStamp domComplete;
+  readonly attribute DOMHighResTimeStamp loadEventStart;
+  readonly attribute DOMHighResTimeStamp loadEventEnd;
+  readonly attribute NavigationType      type;
+};
diff --git a/cobalt/dom/performance_observer.cc b/cobalt/dom/performance_observer.cc
index 6e0855a..f6caf30 100644
--- a/cobalt/dom/performance_observer.cc
+++ b/cobalt/dom/performance_observer.cc
@@ -30,12 +30,18 @@
 // Implement the CallbackInternal interface for a JavaScript callback.
 class ScriptCallback : public PerformanceObserver::CallbackInternal {
  public:
-  ScriptCallback(const PerformanceObserver::PerformanceObserverCallbackArg& callback,
-                 PerformanceObserver* observer)
+  ScriptCallback(
+      const PerformanceObserver::PerformanceObserverCallbackArg& callback,
+      PerformanceObserver* observer)
       : callback_(observer, callback) {}
-  bool RunCallback(const scoped_refptr<PerformanceObserverEntryList>& entries,
-                   const scoped_refptr<PerformanceObserver>& observer) override {
-    script::CallbackResult<void> result = callback_.value().Run(entries, observer);
+  bool RunCallback(
+      const scoped_refptr<PerformanceObserverEntryList>& entries,
+      const scoped_refptr<PerformanceObserver>& observer) override {
+    // ScriptCallback's lifetime is bined with JS PerformanceObserver object. We
+    // should not run callback, When JS object has been destroyed.
+    if (callback_.referenced_value().IsNull()) return false;
+    script::CallbackResult<void> result =
+        callback_.value().Run(entries, observer);
     return !result.exception;
   }
 
@@ -49,8 +55,9 @@
   explicit NativeCallback(
       const PerformanceObserver::NativePerformanceObserverCallback& callback)
       : callback_(callback) {}
-  bool RunCallback(const scoped_refptr<PerformanceObserverEntryList>& entries,
-                   const scoped_refptr<PerformanceObserver>& observer) override {
+  bool RunCallback(
+      const scoped_refptr<PerformanceObserverEntryList>& entries,
+      const scoped_refptr<PerformanceObserver>& observer) override {
     callback_.Run(entries, observer);
     return true;
   }
@@ -65,8 +72,8 @@
     const NativePerformanceObserverCallback& native_callback,
     const scoped_refptr<Performance>& performance)
     : performance_(base::AsWeakPtr(performance.get())),
-    observer_type_(PerformanceObserverType::kUndefined),
-    is_registered_(false) {
+      observer_type_(PerformanceObserverType::kUndefined),
+      is_registered_(false) {
   callback_.reset(new NativeCallback(native_callback));
 }
 
@@ -74,19 +81,19 @@
     script::EnvironmentSettings* env_settings,
     const PerformanceObserverCallbackArg& callback)
     : performance_(
-          base::AsWeakPtr(base::polymorphic_downcast<DOMSettings*>(
-          env_settings)
-          ->window()
-          ->performance().get())),
-    observer_type_(PerformanceObserverType::kUndefined),
-    is_registered_(false) {
+          base::AsWeakPtr(base::polymorphic_downcast<DOMSettings*>(env_settings)
+                              ->window()
+                              ->performance()
+                              .get())),
+      observer_type_(PerformanceObserverType::kUndefined),
+      is_registered_(false) {
   callback_.reset(new ScriptCallback(callback, this));
 }
 
 PerformanceObserver::~PerformanceObserver() {}
 
 void PerformanceObserver::Observe(const PerformanceObserverInit& options,
-    script::ExceptionState* exception_state) {
+                                  script::ExceptionState* exception_state) {
   // The algorithm for registering the observer.
   //   https://www.w3.org/TR/2019/WD-performance-timeline-2-20191024/#observe-method
   // 1.  Let observer be the context object.
@@ -103,8 +110,7 @@
   }
   // 4.  If options's entryTypes is present and any other member is also
   // present, then throw a SyntaxError.
-  bool entry_types_present = has_entry_types &&
-     !options.entry_types().empty();
+  bool entry_types_present = has_entry_types && !options.entry_types().empty();
   bool type_present = has_type && !options.type().empty();
   if (entry_types_present && type_present) {
     DOMException::Raise(DOMException::kSyntaxErr, exception_state);
@@ -131,8 +137,7 @@
   }
   // 5.3  If observer's observer type is "multiple" and options's type member
   // is present, then throw an InvalidModificationError.
-  if (observer_type_ == PerformanceObserverType::kMultiple &&
-      type_present) {
+  if (observer_type_ == PerformanceObserverType::kMultiple && type_present) {
     DOMException::Raise(DOMException::kInvalidModificationErr, exception_state);
   }
   // 6  If observer's observer type is "multiple", run the following steps:
@@ -150,7 +155,7 @@
         entry_types.push_back(entry_type_string);
       } else {
         DLOG(WARNING) << "The entry type " + entry_type_string +
-            " does not exist or isn't supported.";
+                             " does not exist or isn't supported.";
       }
     }
     // 6.3  If the resulting entry types sequence is an empty sequence,
@@ -168,16 +173,16 @@
     if (is_registered_) {
       performance_->ReplaceRegisteredPerformanceObserverOptionsList(
           base::WrapRefCounted(this), options);
-    // 6.5  Otherwise, create and append a registered performance observer
-    // object to the list of registered performance observer objects of
-    // relevantGlobal, with observer set to the context object and options list
-    // set to a list containing options as its only item.
+      // 6.5  Otherwise, create and append a registered performance observer
+      // object to the list of registered performance observer objects of
+      // relevantGlobal, with observer set to the context object and options
+      // list set to a list containing options as its only item.
     } else {
-      performance_->RegisterPerformanceObserver(
-          base::WrapRefCounted(this), options);
+      performance_->RegisterPerformanceObserver(base::WrapRefCounted(this),
+                                                options);
       is_registered_ = true;
     }
-  // 7.  Otherwise, run the following steps:
+    // 7.  Otherwise, run the following steps:
   } else {
     // 7.1  Assert that observer's observer type is "single".
     DCHECK(observer_type_ == PerformanceObserverType::kSingle);
@@ -185,10 +190,10 @@
     // array of supported entry types, abort these steps. The user agent SHOULD
     // notify developers when this happens, for instance via a console warning.
     PerformanceEntryType options_type =
-          PerformanceEntry::ToEntryTypeEnum(options.type());
+        PerformanceEntry::ToEntryTypeEnum(options.type());
     if (options_type == PerformanceEntry::kInvalid) {
       DLOG(WARNING) << "The type " + options.type() +
-            " does not exist or isn't supported.";
+                           " does not exist or isn't supported.";
       return;
     }
     // 7.3  If the list of registered performance observer objects of
@@ -201,13 +206,13 @@
       // 7.3.2  Otherwise, append options to obs's options list.
       performance_->UpdateRegisteredPerformanceObserverOptionsList(
           base::WrapRefCounted(this), options);
-    // 7.4  Otherwise, create and append a registered performance observer
-    // object to the list of registered performance observer objects of
-    // relevantGlobal, with observer set to the context object and options
-    // list set to a list containing options as its only item.
+      // 7.4  Otherwise, create and append a registered performance observer
+      // object to the list of registered performance observer objects of
+      // relevantGlobal, with observer set to the context object and options
+      // list set to a list containing options as its only item.
     } else {
-      performance_->RegisterPerformanceObserver(
-          base::WrapRefCounted(this), options);
+      performance_->RegisterPerformanceObserver(base::WrapRefCounted(this),
+                                                options);
       is_registered_ = true;
     }
   }
diff --git a/cobalt/dom/performance_resource_timing.cc b/cobalt/dom/performance_resource_timing.cc
index 11dac39..4f7bba5 100644
--- a/cobalt/dom/performance_resource_timing.cc
+++ b/cobalt/dom/performance_resource_timing.cc
@@ -19,7 +19,7 @@
 namespace dom {
 
 namespace {
-  const std::string kPerformanceResourceTimingCacheMode = "local";
+const char kPerformanceResourceTimingCacheMode[] = "local";
 }
 
 PerformanceResourceTiming::PerformanceResourceTiming(
@@ -31,17 +31,17 @@
     const net::LoadTimingInfo& timing_info, const std::string& initiator_type,
     const std::string& requested_url, Performance* performance,
     base::TimeTicks time_origin)
-    : PerformanceEntry(
-          requested_url,
-          Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin,
-              timing_info.request_start),
-          Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin,
-              timing_info.receive_headers_end)),
+    : PerformanceEntry(requested_url,
+                       Performance::MonotonicTimeToDOMHighResTimeStamp(
+                           time_origin, timing_info.request_start),
+                       Performance::MonotonicTimeToDOMHighResTimeStamp(
+                           time_origin, timing_info.receive_headers_end)),
       initiator_type_(initiator_type),
       cache_mode_(kPerformanceResourceTimingCacheMode),
       transfer_size_(0),
       timing_info_(timing_info),
-      time_origin_(time_origin) {}
+      time_origin_(time_origin),
+      timing_info_response_end_(performance->Now()) {}
 
 std::string PerformanceResourceTiming::initiator_type() const {
   return initiator_type_;
@@ -51,71 +51,71 @@
   if (timing_info_.request_start.is_null()) {
     return PerformanceEntry::start_time();
   }
-  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
-      timing_info_.request_start);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(
+      time_origin_, timing_info_.request_start);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::domain_lookup_start() const {
   if (timing_info_.connect_timing.dns_start.is_null()) {
     return PerformanceEntry::start_time();
   }
-  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
-      timing_info_.connect_timing.dns_start);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(
+      time_origin_, timing_info_.connect_timing.dns_start);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::domain_lookup_end() const {
   if (timing_info_.connect_timing.dns_end.is_null()) {
     return PerformanceEntry::start_time();
   }
-  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
-      timing_info_.connect_timing.dns_end);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(
+      time_origin_, timing_info_.connect_timing.dns_end);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::connect_start() const {
   if (timing_info_.connect_timing.connect_start.is_null()) {
     return PerformanceEntry::start_time();
   }
-  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
-      timing_info_.connect_timing.connect_start);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(
+      time_origin_, timing_info_.connect_timing.connect_start);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::connect_end() const {
   if (timing_info_.connect_timing.connect_end.is_null()) {
     return PerformanceEntry::start_time();
   }
-  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
-      timing_info_.connect_timing.connect_end);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(
+      time_origin_, timing_info_.connect_timing.connect_end);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::secure_connection_start() const {
   if (timing_info_.connect_timing.ssl_start.is_null()) {
     return 0.0;
   }
-  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
-      timing_info_.connect_timing.ssl_start);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(
+      time_origin_, timing_info_.connect_timing.ssl_start);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::request_start() const {
   if (timing_info_.send_start.is_null()) {
     return PerformanceEntry::start_time();
   }
-  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
-      timing_info_.send_start);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(
+      time_origin_, timing_info_.send_start);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::response_start() const {
   if (timing_info_.receive_headers_end.is_null()) {
     PerformanceEntry::start_time();
   }
-  return Performance::MonotonicTimeToDOMHighResTimeStamp(time_origin_,
-      timing_info_.receive_headers_end);
+  return Performance::MonotonicTimeToDOMHighResTimeStamp(
+      time_origin_, timing_info_.receive_headers_end);
 }
 
 DOMHighResTimeStamp PerformanceResourceTiming::response_end() const {
-  return response_start();
+  return timing_info_response_end_;
 }
 
-unsigned long long PerformanceResourceTiming::transfer_size() const {
+uint64_t PerformanceResourceTiming::transfer_size() const {
   return transfer_size_;
 }
 
diff --git a/cobalt/dom/performance_resource_timing.h b/cobalt/dom/performance_resource_timing.h
index cab3c48..b9ed763 100644
--- a/cobalt/dom/performance_resource_timing.h
+++ b/cobalt/dom/performance_resource_timing.h
@@ -43,7 +43,7 @@
                             base::TimeTicks time_origin);
 
   // Web API.
-  std::string initiator_type() const;
+  virtual std::string initiator_type() const;
   DOMHighResTimeStamp fetch_start() const;
   DOMHighResTimeStamp domain_lookup_start() const;
   DOMHighResTimeStamp domain_lookup_end() const;
@@ -52,11 +52,10 @@
   DOMHighResTimeStamp secure_connection_start() const;
   DOMHighResTimeStamp request_start() const;
   DOMHighResTimeStamp response_start() const;
-  // As we don't have response start in LoadTimingInfo, we use
-  // response start instead.
-  // TODO: Add response_end into LoadTimingInfo.
+  // As we don't have response end in LoadTimingInfo, we collect the timestamp
+  // of loading completes instead.
   DOMHighResTimeStamp response_end() const;
-  unsigned long long transfer_size() const;
+  uint64_t transfer_size() const;
 
   std::string entry_type() const override { return "resource"; }
   PerformanceEntryType EntryTypeEnum() const override {
@@ -77,6 +76,7 @@
   std::string requested_url_;
   net::LoadTimingInfo timing_info_;
   base::TimeTicks time_origin_;
+  DOMHighResTimeStamp timing_info_response_end_;
 
   DISALLOW_COPY_AND_ASSIGN(PerformanceResourceTiming);
 };
diff --git a/cobalt/dom/pointer_state.cc b/cobalt/dom/pointer_state.cc
index 7b2b2b4..49ae842 100644
--- a/cobalt/dom/pointer_state.cc
+++ b/cobalt/dom/pointer_state.cc
@@ -15,6 +15,7 @@
 #include "cobalt/dom/pointer_state.h"
 
 #include <algorithm>
+#include <utility>
 
 #include "base/trace_event/trace_event.h"
 #include "cobalt/dom/mouse_event.h"
@@ -27,7 +28,7 @@
 
 void PointerState::QueuePointerEvent(const scoped_refptr<Event>& event) {
   TRACE_EVENT1("cobalt::dom", "PointerState::QueuePointerEvent()", "event",
-               event->type().c_str());
+               TRACE_STR_COPY(event->type().c_str()));
 
   // Only accept this for event types that are MouseEvents or known derivatives.
   SB_DCHECK(CanQueueEvent(event));
diff --git a/cobalt/dom/rule_matching_test.cc b/cobalt/dom/rule_matching_test.cc
index daf905f..e9573e0 100644
--- a/cobalt/dom/rule_matching_test.cc
+++ b/cobalt/dom/rule_matching_test.cc
@@ -158,6 +158,47 @@
             (*matching_rules)[0].first);
 }
 
+// [attr=value] should match <div attr="value"/>.
+TEST_F(RuleMatchingTest, AttributeSelectorMatchesFirstOne) {
+  head_->set_inner_html("<style>[attr=value] {} [attr=value2] {} {}</style>");
+  body_->set_inner_html("<div attr=\"value\"/>");
+  UpdateAllMatchingRules();
+
+  cssom::RulesWithCascadePrecedence* matching_rules =
+      body_->first_element_child()->AsHTMLElement()->matching_rules();
+  ASSERT_EQ(1, matching_rules->size());
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(0),
+            (*matching_rules)[0].first);
+}
+
+// [attr=value] should match <div attr="value"/>.
+TEST_F(RuleMatchingTest, AttributeSelectorMatchesSecondOne) {
+  head_->set_inner_html(
+      "<style>[attr=value1] {} [attr=value] {} [attr=value2] {}</style>");
+  body_->set_inner_html("<div attr=\"value\"/>");
+  UpdateAllMatchingRules();
+
+  cssom::RulesWithCascadePrecedence* matching_rules =
+      body_->first_element_child()->AsHTMLElement()->matching_rules();
+  ASSERT_EQ(1, matching_rules->size());
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(1),
+            (*matching_rules)[0].first);
+}
+
+// [attr=value] should match <div attr="value"/>.
+TEST_F(RuleMatchingTest, AttributeSelectorMatchesLastOne) {
+  head_->set_inner_html(
+      "<style>[attr=value1] {} [attr=value2] {} [attr=value] {}</style>");
+  body_->set_inner_html("<div attr=\"value\"/>");
+  UpdateAllMatchingRules();
+
+  cssom::RulesWithCascadePrecedence* matching_rules =
+      body_->first_element_child()->AsHTMLElement()->matching_rules();
+  ASSERT_EQ(1, matching_rules->size());
+  EXPECT_EQ(GetDocumentStyleSheet(0)->css_rules_same_origin()->Item(2),
+            (*matching_rules)[0].first);
+}
+
 // [attr="value"] should match <div attr="value"/>.
 TEST_F(RuleMatchingTest, AttributeSelectorMatchEqualsWithQuote) {
   head_->set_inner_html("<style>[attr=\"value\"] {}</style>");
@@ -257,7 +298,7 @@
   head_->set_inner_html("<style>:focus {}</style>");
   body_->set_inner_html("<div tabIndex=\"-1\"/>");
   body_->first_element_child()->AsHTMLElement()->Focus();
-  // This is required because RunFocusingSteps() earlies out as a result of the
+  // This is required because RunFocusingSteps() earliest out as a result of the
   // document not having a browsing context.
   root_->InvalidateMatchingRulesRecursively();
   UpdateAllMatchingRules();
diff --git a/cobalt/dom/screenshot_manager.cc b/cobalt/dom/screenshot_manager.cc
index b7aa043..0483259 100644
--- a/cobalt/dom/screenshot_manager.cc
+++ b/cobalt/dom/screenshot_manager.cc
@@ -15,12 +15,15 @@
 #include "cobalt/dom/screenshot_manager.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/time/time.h"
 #include "cobalt/dom/screenshot.h"
 #include "cobalt/render_tree/node.h"
 #include "cobalt/render_tree/resource_provider_stub.h"
 #include "cobalt/script/array_buffer.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace cobalt {
 namespace dom {
@@ -96,11 +99,12 @@
       break;
     }
     DLOG(INFO) << "Filling data in for the screenshot.";
-    DOMSettings* dom_settings =
-        base::polymorphic_downcast<dom::DOMSettings*>(environment_settings_);
-    script::Handle<script::ArrayBuffer> pixel_data =
-        script::ArrayBuffer::New(dom_settings->global_environment(),
-                                 encoded_image_data->GetMemory(), encoded_size);
+    script::Handle<script::ArrayBuffer> pixel_data = script::ArrayBuffer::New(
+        base::polymorphic_downcast<web::EnvironmentSettings*>(
+            environment_settings_)
+            ->context()
+            ->global_environment(),
+        encoded_image_data->GetMemory(), encoded_size);
     scoped_refptr<script::Wrappable> promise_result =
         new dom::Screenshot(pixel_data);
     promise.Resolve(promise_result);
diff --git a/cobalt/dom/source_buffer.cc b/cobalt/dom/source_buffer.cc
index de6fd76..ea5a50d 100644
--- a/cobalt/dom/source_buffer.cc
+++ b/cobalt/dom/source_buffer.cc
@@ -49,11 +49,12 @@
 #include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/time/time.h"
+#include "base/trace_event/trace_event.h"
 #include "cobalt/base/tokens.h"
 #include "cobalt/dom/dom_exception.h"
 #include "cobalt/dom/media_source.h"
-#include "cobalt/media/base/ranges.h"
-#include "cobalt/media/base/timestamp_constants.h"
+#include "third_party/chromium/media/base/ranges.h"
+#include "third_party/chromium/media/base/timestamp_constants.h"
 
 namespace cobalt {
 namespace dom {
@@ -65,7 +66,7 @@
   DCHECK_NE(time, -std::numeric_limits<double>::infinity());
 
   if (time == std::numeric_limits<double>::infinity()) {
-    return media::kInfiniteDuration;
+    return ::media::kInfiniteDuration;
   }
 
   // Don't use base::TimeDelta::Max() here, as we want the largest finite time
@@ -85,8 +86,7 @@
 
 SourceBuffer::SourceBuffer(script::EnvironmentSettings* settings,
                            const std::string& id, MediaSource* media_source,
-                           media::ChunkDemuxer* chunk_demuxer,
-                           EventQueue* event_queue)
+                           ChunkDemuxer* chunk_demuxer, EventQueue* event_queue)
     : EventTarget(settings),
       id_(id),
       chunk_demuxer_(chunk_demuxer),
@@ -104,6 +104,11 @@
   chunk_demuxer_->SetTracksWatcher(
       id_,
       base::Bind(&SourceBuffer::InitSegmentReceived, base::Unretained(this)));
+  chunk_demuxer_->SetParseWarningCallback(
+      id, base::BindRepeating([](::media::SourceBufferParseWarning warning) {
+        LOG(WARNING) << "Encountered SourceBufferParseWarning "
+                     << static_cast<int>(warning);
+      }));
 }
 
 void SourceBuffer::set_mode(SourceBufferAppendMode mode,
@@ -137,7 +142,7 @@
   }
 
   scoped_refptr<TimeRanges> time_ranges = new TimeRanges;
-  media::Ranges<base::TimeDelta> ranges =
+  ::media::Ranges<base::TimeDelta> ranges =
       chunk_demuxer_->GetBufferedRanges(id_);
   for (size_t i = 0; i < ranges.size(); i++) {
     time_ranges->Add(ranges.start(i).InSecondsF(), ranges.end(i).InSecondsF());
@@ -215,6 +220,8 @@
 
 void SourceBuffer::AppendBuffer(const script::Handle<script::ArrayBuffer>& data,
                                 script::ExceptionState* exception_state) {
+  TRACE_EVENT1("cobalt::dom", "SourceBuffer::AppendBuffer()", "size",
+               data->ByteLength());
   AppendBufferInternal(static_cast<const unsigned char*>(data->Data()),
                        data->ByteLength(), exception_state);
 }
@@ -222,11 +229,15 @@
 void SourceBuffer::AppendBuffer(
     const script::Handle<script::ArrayBufferView>& data,
     script::ExceptionState* exception_state) {
+  TRACE_EVENT1("cobalt::dom", "SourceBuffer::AppendBuffer()", "size",
+               data->ByteLength());
   AppendBufferInternal(static_cast<const unsigned char*>(data->RawData()),
                        data->ByteLength(), exception_state);
 }
 
 void SourceBuffer::Abort(script::ExceptionState* exception_state) {
+  TRACE_EVENT0("cobalt::dom", "SourceBuffer::Abort()");
+
   if (media_source_ == NULL) {
     DOMException::Raise(DOMException::kInvalidStateErr, exception_state);
     return;
@@ -427,6 +438,7 @@
 }
 
 void SourceBuffer::OnAppendTimer() {
+  TRACE_EVENT0("cobalt::dom", "SourceBuffer::OnAppendTimer()");
   const size_t kMaxAppendSize = 128 * 1024;
 
   DCHECK(updating_);
diff --git a/cobalt/dom/source_buffer.h b/cobalt/dom/source_buffer.h
index 3f3c7e5..56dba93 100644
--- a/cobalt/dom/source_buffer.h
+++ b/cobalt/dom/source_buffer.h
@@ -62,12 +62,12 @@
 #include "cobalt/dom/time_ranges.h"
 #include "cobalt/dom/track_default_list.h"
 #include "cobalt/dom/video_track_list.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/filters/chunk_demuxer.h"
 #include "cobalt/script/array_buffer.h"
 #include "cobalt/script/array_buffer_view.h"
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/script/exception_state.h"
+#include "third_party/chromium/media/base/media_tracks.h"
+#include "third_party/chromium/media/filters/chunk_demuxer.h"
 
 namespace cobalt {
 namespace dom {
@@ -79,10 +79,12 @@
 //   https://www.w3.org/TR/2016/CR-media-source-20160705/#sourcebuffer
 class SourceBuffer : public dom::EventTarget {
  public:
+  typedef ::media::ChunkDemuxer ChunkDemuxer;
+
   // Custom, not in any spec.
   //
   SourceBuffer(script::EnvironmentSettings* settings, const std::string& id,
-               MediaSource* media_source, media::ChunkDemuxer* chunk_demuxer,
+               MediaSource* media_source, ChunkDemuxer* chunk_demuxer,
                EventQueue* event_queue);
 
   // Web API: SourceBuffer
@@ -135,7 +137,7 @@
   void TraceMembers(script::Tracer* tracer) override;
 
  private:
-  typedef media::MediaTracks MediaTracks;
+  typedef ::media::MediaTracks MediaTracks;
 
   void InitSegmentReceived(std::unique_ptr<MediaTracks> tracks);
   void ScheduleEvent(base::Token event_name);
@@ -164,7 +166,7 @@
       const std::string& byte_stream_track_id) const;
 
   const std::string id_;
-  media::ChunkDemuxer* chunk_demuxer_;
+  ChunkDemuxer* chunk_demuxer_;
   MediaSource* media_source_;
   scoped_refptr<TrackDefaultList> track_defaults_ = new TrackDefaultList(NULL);
   EventQueue* event_queue_;
diff --git a/cobalt/dom/test_runner.cc b/cobalt/dom/test_runner.cc
index a03d7f2..d5e2b73 100644
--- a/cobalt/dom/test_runner.cc
+++ b/cobalt/dom/test_runner.cc
@@ -19,6 +19,8 @@
 #include "base/message_loop/message_loop.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/script/javascript_engine.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace cobalt {
 namespace dom {
@@ -55,9 +57,10 @@
     const TestRunnerCallbackArg& callback_arg) {
   DCHECK(settings);
   TestRunnerCallbackArg::Reference reference(this, callback_arg);
-  DOMSettings* dom_settings =
-      base::polymorphic_downcast<dom::DOMSettings*>(settings);
-  dom_settings->javascript_engine()->CollectGarbage();
+  base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+      ->context()
+      ->javascript_engine()
+      ->CollectGarbage();
   reference.value().Run();
 }
 
diff --git a/cobalt/dom/testing/BUILD.gn b/cobalt/dom/testing/BUILD.gn
index 6cc8596..5d92349 100644
--- a/cobalt/dom/testing/BUILD.gn
+++ b/cobalt/dom/testing/BUILD.gn
@@ -42,6 +42,7 @@
     "//cobalt/dom_parser",
     "//cobalt/loader",
     "//cobalt/script",
+    "//cobalt/web",
     "//testing/gmock",
     "//testing/gtest",
     "//url",
diff --git a/cobalt/dom/testing/dom_testing.gyp b/cobalt/dom/testing/dom_testing.gyp
deleted file mode 100644
index 35a11f1..0000000
--- a/cobalt/dom/testing/dom_testing.gyp
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'dom_testing',
-      'type': 'static_library',
-      'sources': [
-        'gtest_workarounds.h',
-        'html_collection_testing.h',
-        'mock_event_listener.h',
-        'mock_layout_boxes.h',
-        'stub_css_parser.cc',
-        'stub_css_parser.h',
-        'stub_environment_settings.h',
-        'stub_script_runner.cc',
-        'stub_script_runner.h',
-        'stub_window.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-        '<(DEPTH)/cobalt/browser/browser_bindings.gyp:bindings',
-        '<(DEPTH)/cobalt/cssom/cssom.gyp:cssom',
-        '<(DEPTH)/cobalt/css_parser/css_parser.gyp:css_parser',
-        '<(DEPTH)/cobalt/dom_parser/dom_parser.gyp:dom_parser',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/dom/testing/stub_environment_settings.h b/cobalt/dom/testing/stub_environment_settings.h
index 95ed623..a70eef3 100644
--- a/cobalt/dom/testing/stub_environment_settings.h
+++ b/cobalt/dom/testing/stub_environment_settings.h
@@ -25,8 +25,8 @@
 class StubEnvironmentSettings : public DOMSettings {
  public:
   explicit StubEnvironmentSettings(const Options& options = Options())
-      : DOMSettings(0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-                    nullptr, nullptr, null_debugger_hooks_, nullptr, options) {}
+      : DOMSettings(null_debugger_hooks_, 0, nullptr, nullptr, nullptr, nullptr,
+                    nullptr, options) {}
   ~StubEnvironmentSettings() override {}
 
  private:
diff --git a/cobalt/dom/testing/stub_window.h b/cobalt/dom/testing/stub_window.h
index 56def70..197191c 100644
--- a/cobalt/dom/testing/stub_window.h
+++ b/cobalt/dom/testing/stub_window.h
@@ -29,12 +29,16 @@
 #include "cobalt/cssom/viewport_size.h"
 #include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/local_storage_database.h"
+#include "cobalt/dom/testing/stub_environment_settings.h"
 #include "cobalt/dom/window.h"
 #include "cobalt/dom_parser/parser.h"
 #include "cobalt/loader/fetcher_factory.h"
 #include "cobalt/loader/loader_factory.h"
 #include "cobalt/script/global_environment.h"
 #include "cobalt/script/javascript_engine.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
+#include "cobalt/web/stub_web_context.h"
 #include "starboard/window.h"
 #include "url/gurl.h"
 
@@ -46,61 +50,59 @@
 class StubWindow {
  public:
   explicit StubWindow(
-      std::unique_ptr<script::EnvironmentSettings> environment_settings =
-          std::unique_ptr<script::EnvironmentSettings>())
+      const DOMSettings::Options& options = DOMSettings::Options())
       : message_loop_(base::MessageLoop::TYPE_DEFAULT),
         css_parser_(css_parser::Parser::Create()),
         dom_parser_(
             new dom_parser::Parser(base::Bind(&StubLoadCompleteCallback))),
-        fetcher_factory_(new loader::FetcherFactory(NULL)),
-        loader_factory_(new loader::LoaderFactory(
-            "Test", fetcher_factory_.get(), NULL, null_debugger_hooks_, 0,
-            base::ThreadPriority::DEFAULT)),
         local_storage_database_(NULL),
-        url_("about:blank"),
         dom_stat_tracker_(new dom::DomStatTracker("StubWindow")) {
-    engine_ = script::JavaScriptEngine::CreateEngine();
-    global_environment_ = engine_->CreateGlobalEnvironment();
-    environment_settings_ =
-        environment_settings.get()
-            ? std::move(environment_settings)
-            : std::unique_ptr<script::EnvironmentSettings>(new DOMSettings(
-                  0, NULL, NULL, NULL, NULL, NULL, NULL, engine_.get(),
-                  global_environment(), null_debugger_hooks_, NULL));
-    window_ = new dom::Window(
-        environment_settings_.get(), cssom::ViewportSize(1920, 1080),
-        base::kApplicationStateStarted, css_parser_.get(), dom_parser_.get(),
-        fetcher_factory_.get(), loader_factory_.get(), NULL, NULL, NULL, NULL,
-        NULL, NULL, &local_storage_database_, NULL, NULL, NULL, NULL,
-        global_environment_->script_value_factory(), NULL,
-        dom_stat_tracker_.get(), url_, "", NULL, "en-US", "en",
-        base::Callback<void(const GURL&)>(),
-        base::Bind(&StubLoadCompleteCallback), NULL,
-        network_bridge::PostSender(), csp::kCSPRequired,
-        dom::kCspEnforcementEnable, base::Closure() /* csp_policy_changed */,
-        base::Closure() /* ran_animation_frame_callbacks */,
-        dom::Window::CloseCallback() /* window_close */,
-        base::Closure() /* window_minimize */, NULL, NULL,
-        dom::Window::OnStartDispatchEventCallback(),
-        dom::Window::OnStopDispatchEventCallback(),
-        dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL);
-    base::polymorphic_downcast<dom::DOMSettings*>(environment_settings_.get())
+    web_context_.reset(new web::test::StubWebContext());
+    web_context_->setup_environment_settings(
+        new dom::testing::StubEnvironmentSettings(options));
+    web_context_->environment_settings()->set_base_url(GURL("about:blank"));
+    web_context_->set_fetcher_factory(new loader::FetcherFactory(NULL));
+    loader_factory_.reset(new loader::LoaderFactory(
+        "Test", web_context_->fetcher_factory(), NULL,
+        web_context_->environment_settings()->debugger_hooks(), 0,
+        base::ThreadPriority::DEFAULT)),
+        window_ = new dom::Window(
+            web_context_->environment_settings(),
+            cssom::ViewportSize(1920, 1080), base::kApplicationStateStarted,
+            css_parser_.get(), dom_parser_.get(),
+            web_context_->fetcher_factory(), loader_factory_.get(), NULL, NULL,
+            NULL, NULL, NULL, NULL, &local_storage_database_, NULL, NULL, NULL,
+            NULL, global_environment()->script_value_factory(), NULL,
+            dom_stat_tracker_.get(),
+            web_context_->environment_settings()->base_url(), "", NULL, "en-US",
+            "en", base::Callback<void(const GURL&)>(),
+            base::Bind(&StubLoadCompleteCallback), NULL,
+            network_bridge::PostSender(), csp::kCSPRequired,
+            dom::kCspEnforcementEnable,
+            base::Closure() /* csp_policy_changed */,
+            base::Closure() /* ran_animation_frame_callbacks */,
+            dom::Window::CloseCallback() /* window_close */,
+            base::Closure() /* window_minimize */, NULL, NULL,
+            dom::Window::OnStartDispatchEventCallback(),
+            dom::Window::OnStopDispatchEventCallback(),
+            dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), NULL);
+    base::polymorphic_downcast<dom::DOMSettings*>(
+        web_context_->environment_settings())
         ->set_window(window_);
-    global_environment_->CreateGlobalObject(window_,
-                                            environment_settings_.get());
+    global_environment()->CreateGlobalObject(
+        window_, web_context_->environment_settings());
   }
+  virtual ~StubWindow() { window_->DestroyTimers(); }
 
   scoped_refptr<dom::Window> window() { return window_; }
   scoped_refptr<script::GlobalEnvironment> global_environment() {
-    return global_environment_;
+    return web_context_->global_environment();
   }
   css_parser::Parser* css_parser() { return css_parser_.get(); }
   script::EnvironmentSettings* environment_settings() {
-    return environment_settings_.get();
+    return web_context_->environment_settings();
   }
 
-  ~StubWindow() { window_->DestroyTimers(); }
-
  private:
   static void StubLoadCompleteCallback(
       const base::Optional<std::string>& error) {}
@@ -109,14 +111,10 @@
   base::NullDebuggerHooks null_debugger_hooks_;
   std::unique_ptr<css_parser::Parser> css_parser_;
   std::unique_ptr<dom_parser::Parser> dom_parser_;
-  std::unique_ptr<loader::FetcherFactory> fetcher_factory_;
   std::unique_ptr<loader::LoaderFactory> loader_factory_;
   dom::LocalStorageDatabase local_storage_database_;
-  GURL url_;
   std::unique_ptr<dom::DomStatTracker> dom_stat_tracker_;
-  std::unique_ptr<script::EnvironmentSettings> environment_settings_;
-  std::unique_ptr<script::JavaScriptEngine> engine_;
-  scoped_refptr<script::GlobalEnvironment> global_environment_;
+  std::unique_ptr<web::Context> web_context_;
   scoped_refptr<dom::Window> window_;
 };
 
diff --git a/cobalt/dom/url.cc b/cobalt/dom/url.cc
index 35bf94c..c088a43 100644
--- a/cobalt/dom/url.cc
+++ b/cobalt/dom/url.cc
@@ -18,6 +18,9 @@
 #include "base/logging.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/dom_settings.h"
+#include "cobalt/dom/media_source.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "url/gurl.h"
 
 namespace cobalt {
@@ -51,17 +54,18 @@
 std::string URL::CreateObjectURL(
     script::EnvironmentSettings* environment_settings,
     const scoped_refptr<Blob>& blob) {
-  DOMSettings* dom_settings =
-      base::polymorphic_downcast<DOMSettings*>(environment_settings);
-  DCHECK(dom_settings);
-  DCHECK(dom_settings->blob_registry());
+  web::EnvironmentSettings* web_settings =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings);
+  DCHECK(web_settings);
+  DCHECK(web_settings->context()->blob_registry());
   if (!blob) {
     return "";
   }
 
   std::string blob_url = kBlobUrlProtocol;
   blob_url += ':' + base::GenerateGUID();
-  dom_settings->blob_registry()->Register(blob_url, blob);
+  web_settings->context()->blob_registry()->Register(blob_url, blob);
   return blob_url;
 }
 
@@ -86,7 +90,7 @@
   // 2. Otherwise, user agents must remove the entry from the Blob URL Store for
   // url.
   if (!dom_settings->media_source_registry()->Unregister(url) &&
-      !dom_settings->blob_registry()->Unregister(url)) {
+      !dom_settings->context()->blob_registry()->Unregister(url)) {
     DLOG(WARNING) << "Cannot find object for blob url " << url;
   }
 }
diff --git a/cobalt/dom/url.h b/cobalt/dom/url.h
index 188516b..e3bb795 100644
--- a/cobalt/dom/url.h
+++ b/cobalt/dom/url.h
@@ -18,7 +18,6 @@
 #include <string>
 
 #include "cobalt/dom/blob.h"
-#include "cobalt/dom/media_source.h"
 #include "cobalt/loader/blob_fetcher.h"
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/script/wrappable.h"
@@ -26,6 +25,8 @@
 namespace cobalt {
 namespace dom {
 
+class MediaSource;
+
 // The URL interface contains static functions CreateObjectURL() and
 // RevokeObjectURL().  The former is used to create urls in string from
 // JavaScript blob objects.  The latter is used to revoke the url.
diff --git a/cobalt/dom/window.cc b/cobalt/dom/window.cc
index 0dea02f..71df65b 100644
--- a/cobalt/dom/window.cc
+++ b/cobalt/dom/window.cc
@@ -29,7 +29,6 @@
 #include "cobalt/dom/camera_3d.h"
 #include "cobalt/dom/device_orientation_event.h"
 #include "cobalt/dom/document.h"
-#include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/element.h"
 #include "cobalt/dom/error_event.h"
 #include "cobalt/dom/error_event_init.h"
@@ -56,6 +55,8 @@
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/script/javascript_engine.h"
 #include "cobalt/speech/speech_synthesis.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "starboard/file.h"
 
 using cobalt::cssom::ViewportSize;
@@ -112,8 +113,7 @@
     csp::CSPHeaderPolicy require_csp, CspEnforcementType csp_enforcement_mode,
     const base::Closure& csp_policy_changed_callback,
     const base::Closure& ran_animation_frame_callbacks_callback,
-    const CloseCallback& window_close_callback,
-    const base::Closure& window_minimize_callback,
+    CloseCallback window_close_callback, base::Closure window_minimize_callback,
     OnScreenKeyboardBridge* on_screen_keyboard_bridge,
     const scoped_refptr<input::Camera3D>& camera_3d,
     const OnStartDispatchEventCallback& on_start_dispatch_event_callback,
@@ -216,7 +216,7 @@
     const loader::Decoder::OnCompleteFunction& load_complete_callback) {
   document_loader_.reset(new loader::Loader(
       base::Bind(&loader::FetcherFactory::CreateFetcher,
-                 base::Unretained(fetcher_factory), url),
+                 base::Unretained(fetcher_factory), url, disk_cache::kHTML),
       base::Bind(&Parser::ParseDocumentAsync, base::Unretained(dom_parser),
                  document_, base::SourceLocation(url.spec(), 1, 1)),
       load_complete_callback));
@@ -466,9 +466,10 @@
 
 void Window::Gc(script::EnvironmentSettings* settings) {
   if (settings) {
-    DOMSettings* dom_settings =
-        base::polymorphic_downcast<dom::DOMSettings*>(settings);
-    dom_settings->javascript_engine()->CollectGarbage();
+    base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+        ->context()
+        ->javascript_engine()
+        ->CollectGarbage();
   }
 }
 
@@ -507,7 +508,7 @@
 
 void Window::InjectEvent(const scoped_refptr<Event>& event) {
   TRACE_EVENT1("cobalt::dom", "Window::InjectEvent()", "event",
-               event->type().c_str());
+               TRACE_STR_COPY(event->type().c_str()));
 
   // Forward the event on to the correct object in DOM.
   if (event->GetWrappableType() == base::GetTypeId<KeyboardEvent>()) {
diff --git a/cobalt/dom/window.h b/cobalt/dom/window.h
index 2469cc3..254d0ec 100644
--- a/cobalt/dom/window.h
+++ b/cobalt/dom/window.h
@@ -163,8 +163,8 @@
       dom::CspEnforcementType csp_enforcement_mode,
       const base::Closure& csp_policy_changed_callback,
       const base::Closure& ran_animation_frame_callbacks_callback,
-      const CloseCallback& window_close_callback,
-      const base::Closure& window_minimize_callback,
+      CloseCallback window_close_callback,
+      base::Closure window_minimize_callback,
       OnScreenKeyboardBridge* on_screen_keyboard_bridge,
       const scoped_refptr<input::Camera3D>& camera_3d,
       const OnStartDispatchEventCallback&
@@ -411,6 +411,8 @@
 
   const scoped_refptr<media_session::MediaSession> media_session() const;
 
+  loader::Loader* GetDocumentLoader() const { return document_loader_.get(); }
+
   DEFINE_WRAPPABLE_TYPE(Window);
 
  private:
diff --git a/cobalt/dom/window_timers.cc b/cobalt/dom/window_timers.cc
index ef73f89..951f7ee 100644
--- a/cobalt/dom/window_timers.cc
+++ b/cobalt/dom/window_timers.cc
@@ -40,8 +40,9 @@
   }
 
   if (callbacks_active_) {
-    auto* timer = new Timer(type, owner_, dom_stat_tracker_, debugger_hooks_,
-                            handler, timeout, handle, this);
+    scoped_refptr<Timer> timer =
+        new Timer(type, owner_, dom_stat_tracker_, debugger_hooks_, handler,
+                  timeout, handle, this);
     if (application_state_ != base::kApplicationStateFrozen) {
       timer->StartOrResume();
     }
@@ -58,19 +59,31 @@
   return TryAddNewTimer(Timer::kOneShot, handler, timeout);
 }
 
-void WindowTimers::ClearTimeout(int handle) { timers_.erase(handle); }
+void WindowTimers::ClearTimeout(int handle) {
+  Timers::iterator timer = timers_.find(handle);
+  if (timer == timers_.end()) {
+    return;
+  }
+  if (timer->second) {
+    timer->second->Disable();
+  }
+  timers_.erase(timer);
+}
 
 int WindowTimers::SetInterval(const TimerCallbackArg& handler, int timeout) {
   TRACK_MEMORY_SCOPE("DOM");
   return TryAddNewTimer(Timer::kRepeating, handler, timeout);
 }
 
-void WindowTimers::ClearInterval(int handle) { timers_.erase(handle); }
+void WindowTimers::ClearInterval(int handle) { ClearTimeout(handle); }
 
 void WindowTimers::DisableCallbacks() {
   callbacks_active_ = false;
   // Immediately cancel any pending timers.
   for (auto& timer_entry : timers_) {
+    if (timer_entry.second) {
+      timer_entry.second->Disable();
+    }
     timer_entry.second = nullptr;
   }
 }
@@ -95,36 +108,6 @@
   return 0;
 }
 
-void WindowTimers::RunTimerCallback(int handle) {
-  TRACE_EVENT0("cobalt::dom", "WindowTimers::RunTimerCallback");
-  DCHECK(callbacks_active_)
-      << "All timer callbacks should have already been cancelled.";
-  Timers::iterator timer = timers_.find(handle);
-  DCHECK(timer != timers_.end());
-
-  // The callback is now being run. Track it in the global stats.
-  GlobalStats::GetInstance()->StartJavaScriptEvent();
-
-  {
-    // Keep a |TimerInfo| reference, so it won't be released when running the
-    // callback.
-    scoped_refptr<Timer> timer_info(timer->second);
-    timer_info->Run();
-  }
-
-  // After running the callback, double check whether the timer is still there
-  // since it might be deleted inside the callback.
-  timer = timers_.find(handle);
-  // If the timer is not deleted and is not running, it means it is an oneshot
-  // timer and has just fired the shot, and it should be deleted now.
-  if (timer != timers_.end() && !timer->second->timer()->IsRunning()) {
-    timers_.erase(timer);
-  }
-
-  // The callback has finished running. Stop tracking it in the global stats.
-  GlobalStats::GetInstance()->StopJavaScriptEvent();
-}
-
 void WindowTimers::SetApplicationState(base::ApplicationState state) {
   switch (state) {
     case base::kApplicationStateFrozen:
@@ -159,6 +142,7 @@
       debugger_hooks_(debugger_hooks),
       timeout_(timeout),
       handle_(handle),
+      active_(false),
       window_timers_(window_timers) {
   debugger_hooks_.AsyncTaskScheduled(
       this, type == Timer::kOneShot ? "SetTimeout" : "SetInterval",
@@ -188,8 +172,25 @@
 }
 
 void WindowTimers::Timer::Run() {
-  base::ScopedAsyncTask async_task(debugger_hooks_, this);
-  callback_.value().Run();
+  if (!active_) {
+    return;
+  }
+
+  // The callback is now being run. Track it in the global stats.
+  GlobalStats::GetInstance()->StartJavaScriptEvent();
+
+  {
+    base::ScopedAsyncTask async_task(debugger_hooks_, this);
+    callback_.value().Run();
+  }
+
+  // Remove one-shot timers from the timers list.
+  if (active_ && !timer_->IsRunning()) {
+    window_timers_->ClearTimeout(handle_);
+  }
+
+  // The callback has finished running. Stop tracking it in the global stats.
+  GlobalStats::GetInstance()->StopJavaScriptEvent();
 }
 
 void WindowTimers::Timer::Pause() {
@@ -203,6 +204,7 @@
 
 void WindowTimers::Timer::StartOrResume() {
   if (timer_ != nullptr) return;
+  active_ = true;
   switch (type_) {
     case kOneShot:
       if (desired_run_time_) {
@@ -230,20 +232,27 @@
         // The timer was paused and the desired run time is in the past.
         // Call the callback once before continuing the repeating timer.
         base::SequencedTaskRunnerHandle::Get()->PostTask(
-            FROM_HERE, base::Bind(&WindowTimers::RunTimerCallback,
-                                  base::Unretained(window_timers_), handle_));
+            FROM_HERE, base::Bind(&WindowTimers::Timer::Run, this));
       }
       break;
   }
 }
 
+void WindowTimers::Timer::Disable() {
+  // Prevent the timer callback from doing anything.
+  active_ = false;
+
+  // Clear the TimerBase object to release the reference to |this| in the
+  // user callback.
+  timer_.reset();
+}
+
 template <class TimerClass>
 std::unique_ptr<base::internal::TimerBase>
 WindowTimers::Timer::CreateAndStart() {
   auto* timer = new TimerClass();
   timer->Start(FROM_HERE, base::TimeDelta::FromMilliseconds(timeout_),
-               base::Bind(&WindowTimers::RunTimerCallback,
-                          base::Unretained(window_timers_), handle_));
+               base::Bind(&WindowTimers::Timer::Run, this));
   return std::unique_ptr<base::internal::TimerBase>(timer);
 }
 
diff --git a/cobalt/dom/window_timers.h b/cobalt/dom/window_timers.h
index 6d3db4a..fc81784 100644
--- a/cobalt/dom/window_timers.h
+++ b/cobalt/dom/window_timers.h
@@ -75,7 +75,6 @@
           const TimerCallbackArg& callback, int timeout, int handle,
           WindowTimers* window_timers);
 
-    base::internal::TimerBase* timer() { return timer_.get(); }
     void Run();
 
     // Pause this timer. The timer will not fire when paused.
@@ -84,6 +83,9 @@
     // time is in the past, it will fire immediately.
     void StartOrResume();
 
+    // Disable the timer callback.
+    void Disable();
+
    private:
     ~Timer();
 
@@ -98,6 +100,7 @@
     const base::DebuggerHooks& debugger_hooks_;
     int timeout_;
     int handle_;
+    bool active_;
     WindowTimers* window_timers_;
 
     // Store the desired run tim of a paused timer.
@@ -116,10 +119,6 @@
   // if none can be found.
   int GetFreeTimerHandle();
 
-  // This callback, when called by Timer, runs the callback in TimerInfo
-  // and removes the handle if necessary.
-  void RunTimerCallback(int handle);
-
   Timers timers_;
   int current_timer_index_ = 0;
   script::Wrappable* const owner_;
diff --git a/cobalt/dom_parser/dom_parser.gyp b/cobalt/dom_parser/dom_parser.gyp
deleted file mode 100644
index 0f6b510..0000000
--- a/cobalt/dom_parser/dom_parser.gyp
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'dom_parser',
-      'type': 'static_library',
-      'sources': [
-        'html_decoder.cc',
-        'html_decoder.h',
-        'libxml_html_parser_wrapper.cc',
-        'libxml_html_parser_wrapper.h',
-        'libxml_parser_wrapper.cc',
-        'libxml_parser_wrapper.h',
-        'libxml_xml_parser_wrapper.cc',
-        'libxml_xml_parser_wrapper.h',
-        'parser.cc',
-        'parser.h',
-        'xml_decoder.cc',
-        'xml_decoder.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/third_party/libxml/libxml.gyp:libxml',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/dom_parser/dom_parser_test.gyp b/cobalt/dom_parser/dom_parser_test.gyp
deleted file mode 100644
index aedb612..0000000
--- a/cobalt/dom_parser/dom_parser_test.gyp
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'dom_parser_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'html_decoder_test.cc',
-        'xml_decoder_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/dom/testing/dom_testing.gyp:dom_testing',
-        '<(DEPTH)/cobalt/dom_parser/dom_parser.gyp:dom_parser',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'dom_parser_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'dom_parser_test',
-      ],
-      'variables': {
-        'executable_name': 'dom_parser_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/dom_parser/libxml_parser_wrapper.cc b/cobalt/dom_parser/libxml_parser_wrapper.cc
index 4642ab1..d3bad2d 100644
--- a/cobalt/dom_parser/libxml_parser_wrapper.cc
+++ b/cobalt/dom_parser/libxml_parser_wrapper.cc
@@ -167,8 +167,8 @@
 }
 
 void Characters(void* context, const xmlChar* ch, int len) {
-  ToLibxmlParserWrapper(context)
-      ->OnCharacters(std::string(ToCString(ch), static_cast<size_t>(len)));
+  ToLibxmlParserWrapper(context)->OnCharacters(
+      std::string(ToCString(ch), static_cast<size_t>(len)));
 }
 
 void Comment(void* context, const xmlChar* value) {
@@ -200,8 +200,8 @@
 }
 
 void CDATABlock(void* context, const xmlChar* value, int len) {
-  ToLibxmlParserWrapper(context)
-      ->OnCDATABlock(std::string(ToCString(value), static_cast<size_t>(len)));
+  ToLibxmlParserWrapper(context)->OnCDATABlock(
+      std::string(ToCString(value), static_cast<size_t>(len)));
 }
 
 //////////////////////////////////////////////////////////////////
@@ -230,8 +230,9 @@
   }
 
   if (IsFullDocument()) {
-    document_->PostToDispatchEventName(FROM_HERE,
-                                       base::Tokens::domcontentloaded());
+    // Collect dom content loaded timing info and dispatch dom content
+    // loaded event.
+    document_->CollectTimingInfoAndDispatchEvent();
   }
 }
 
diff --git a/cobalt/encoding/BUILD.gn b/cobalt/encoding/BUILD.gn
index 708a621..96ce2b0 100644
--- a/cobalt/encoding/BUILD.gn
+++ b/cobalt/encoding/BUILD.gn
@@ -50,4 +50,6 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
+
+  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/cobalt/encoding/encoding.gyp b/cobalt/encoding/encoding.gyp
deleted file mode 100644
index cd55553..0000000
--- a/cobalt/encoding/encoding.gyp
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-    'variables': {
-        'sb_pedantic_warnings': 1,
-    },
-    'targets': [{
-        'target_name':
-            'text_encoding',
-        'type':
-            'static_library',
-        'sources': [
-            'text_decoder.cc',
-            'text_decoder.h',
-            'text_encoder.cc',
-            'text_encoder.h',
-        ],
-        'dependencies': [
-            '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-            '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        ],
-    },]
-}
diff --git a/cobalt/encoding/encoding_test.gyp b/cobalt/encoding/encoding_test.gyp
deleted file mode 100644
index 8ae690d..0000000
--- a/cobalt/encoding/encoding_test.gyp
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-    'variables': {
-        'sb_pedantic_warnings': 1,
-    },
-    'targets': [
-        {
-            'target_name': 'text_encoding_test',
-            'type': '<(gtest_target_type)',
-            'sources': [
-                'text_decoder_test.cc',
-                'text_encoder_test.cc',
-            ],
-            'dependencies': [
-                '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-                '<(DEPTH)/cobalt/dom/testing/dom_testing.gyp:dom_testing',
-                '<(DEPTH)/cobalt/encoding/encoding.gyp:text_encoding',
-                '<(DEPTH)/cobalt/script/script.gyp:script',
-                '<(DEPTH)/testing/gmock.gyp:gmock',
-                '<(DEPTH)/testing/gtest.gyp:gtest',
-            ],
-            'includes': ['<(DEPTH)/cobalt/test/test.gypi'],
-        },
-        {
-            'target_name': 'text_encoding_test_deploy',
-            'type': 'none',
-            'dependencies': ['text_encoding_test',],
-            'variables': {
-                'executable_name': 'text_encoding_test',
-            },
-            'includes': ['<(DEPTH)/starboard/build/deploy.gypi'],
-        },
-    ]
-}
diff --git a/cobalt/encoding/text_encoder.cc b/cobalt/encoding/text_encoder.cc
index 5ed7d5b..bcdd911 100644
--- a/cobalt/encoding/text_encoder.cc
+++ b/cobalt/encoding/text_encoder.cc
@@ -12,13 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/encoding/text_encoder.h"
+
 #include <algorithm>
 #include <string>
 
-#include "cobalt/encoding/text_encoder.h"
-
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/dom/dom_settings.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "third_party/icu/source/common/unicode/utext.h"
 #include "third_party/icu/source/common/unicode/utf8.h"
 
@@ -38,13 +39,13 @@
 
 script::Handle<script::Uint8Array> TextEncoder::Encode(
     script::EnvironmentSettings* settings, const std::string& input) {
-  dom::DOMSettings* dom_settings =
-      base::polymorphic_downcast<dom::DOMSettings*>(settings);
-
   // The conversion helper already translated the JSValue into a valid UTF-8
   // encoded string.
-  return script::Uint8Array::New(dom_settings->global_environment(),
-                                 input.data(), input.size());
+  return script::Uint8Array::New(
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+          ->context()
+          ->global_environment(),
+      input.data(), input.size());
 }
 
 TextEncoderEncodeIntoResult TextEncoder::EncodeInto(
diff --git a/cobalt/evergreen_tests/_env.py b/cobalt/evergreen_tests/_env.py
deleted file mode 100644
index 8a079e2..0000000
--- a/cobalt/evergreen_tests/_env.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from __future__ import print_function
-
-from imp import load_source  # pylint: disable=deprecated-module
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print('%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV))
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/evergreen_tests/evergreen_tests.py b/cobalt/evergreen_tests/evergreen_tests.py
index 23fc411..74eafb0 100644
--- a/cobalt/evergreen_tests/evergreen_tests.py
+++ b/cobalt/evergreen_tests/evergreen_tests.py
@@ -22,8 +22,6 @@
 import subprocess
 import sys
 
-import _env  # pylint: disable=unused-import
-
 from starboard.tools import abstract_launcher
 from starboard.tools import command_line
 from starboard.tools import log_level
@@ -59,6 +57,15 @@
       '--platform_under_test',
       default=_DEFAULT_PLATFORM_UNDER_TEST,
       help='The platform to run the tests on (e.g., linux or raspi).')
+  authentication_method = arg_parser.add_mutually_exclusive_group()
+  authentication_method.add_argument(
+      '--public-key-auth',
+      help='Public key authentication should be used with the remote device.',
+      action='store_true')
+  authentication_method.add_argument(
+      '--password-auth',
+      help='Password authentication should be used with the remote device.',
+      action='store_true')
   command_line.AddLauncherArguments(arg_parser)
   args = arg_parser.parse_args()
 
@@ -97,12 +104,22 @@
                                'starboard/evergreen/testing/run_all_tests.sh')
 
   # /bin/bash is executed since run_all_tests.sh may not be executable.
-  command = ['/bin/bash', run_all_tests, args.platform_under_test]
+  command = ['/bin/bash', run_all_tests]
 
   if launcher.device_id:
     # The automated tests run on this host should target a remote device.
+    command.append('-d')
     command.append(launcher.device_id)
 
+  if args.public_key_auth:
+    command.append('-a')
+    command.append('public-key')
+  elif args.password_auth:
+    command.append('-a')
+    command.append('password')
+
+  command.append(args.platform_under_test)
+
   return _Exec(command, env)
 
 
diff --git a/cobalt/extension/BUILD.gn b/cobalt/extension/BUILD.gn
index 2e1723b..fc63fc7 100644
--- a/cobalt/extension/BUILD.gn
+++ b/cobalt/extension/BUILD.gn
@@ -26,5 +26,4 @@
   if (sb_is_evergreen) {
     deps += cobalt_platform_dependencies
   }
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/cobalt/extension/extension.gyp b/cobalt/extension/extension.gyp
deleted file mode 100644
index f8905dd..0000000
--- a/cobalt/extension/extension.gyp
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'extension_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'extension_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'conditions': [
-        ['sb_evergreen == 0', {
-          'dependencies': [
-            '<@(cobalt_platform_dependencies)',
-          ],
-        }],
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'extension_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'extension_test',
-      ],
-      'variables': {
-        'executable_name': 'extension_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/fetch/fetch.gyp b/cobalt/fetch/fetch.gyp
deleted file mode 100644
index d9f11e3..0000000
--- a/cobalt/fetch/fetch.gyp
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'fetch',
-      'type': 'static_library',
-      'sources': [
-        'fetch_internal.cc',
-        'fetch_internal.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        '<(DEPTH)/cobalt/script/script.gyp:script',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/fetch/fetch_internal.cc b/cobalt/fetch/fetch_internal.cc
index 2b31ff9..c098897 100644
--- a/cobalt/fetch/fetch_internal.cc
+++ b/cobalt/fetch/fetch_internal.cc
@@ -16,7 +16,10 @@
 
 #include "base/strings/string_util.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/dom/dom_settings.h"
+#include "cobalt/dom/blob.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "url/gurl.h"
 
 namespace cobalt {
@@ -25,9 +28,7 @@
 // static
 bool FetchInternal::IsUrlValid(script::EnvironmentSettings* settings,
                                const std::string& url, bool allow_credentials) {
-  dom::DOMSettings* dom_settings =
-      base::polymorphic_downcast<dom::DOMSettings*>(settings);
-  GURL gurl = dom_settings->base_url().Resolve(url);
+  GURL gurl = settings->base_url().Resolve(url);
   return gurl.is_valid() &&
          (allow_credentials || (!gurl.has_username() && !gurl.has_password()));
 }
@@ -36,12 +37,13 @@
 script::Handle<script::Uint8Array> FetchInternal::EncodeToUTF8(
     script::EnvironmentSettings* settings, const std::string& text,
     script::ExceptionState* exception_state) {
-  dom::DOMSettings* dom_settings =
-      base::polymorphic_downcast<dom::DOMSettings*>(settings);
   // The conversion helper already translated the JSValue into a UTF-8 encoded
   // string. So just wrap the result in a Uint8Array.
-  return script::Uint8Array::New(dom_settings->global_environment(),
-                                 text.data(), text.size());
+  return script::Uint8Array::New(
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+          ->context()
+          ->global_environment(),
+      text.data(), text.size());
 }
 
 // static
@@ -73,11 +75,12 @@
 script::Handle<script::ArrayBuffer> FetchInternal::BlobToArrayBuffer(
     script::EnvironmentSettings* settings,
     const scoped_refptr<dom::Blob>& blob) {
-  dom::DOMSettings* dom_settings =
-      base::polymorphic_downcast<dom::DOMSettings*>(settings);
   // Create a copy of the data so that the caller cannot modify the Blob.
-  return script::ArrayBuffer::New(dom_settings->global_environment(),
-                                  blob->data(), blob->size());
+  return script::ArrayBuffer::New(
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+          ->context()
+          ->global_environment(),
+      blob->data(), blob->size());
 }
 
 }  // namespace fetch
diff --git a/cobalt/h5vcc/BUILD.gn b/cobalt/h5vcc/BUILD.gn
index 96de253..0469041 100644
--- a/cobalt/h5vcc/BUILD.gn
+++ b/cobalt/h5vcc/BUILD.gn
@@ -86,6 +86,7 @@
     "//cobalt/sso",
     "//cobalt/storage",
     "//cobalt/trace_event",
+    "//cobalt/watchdog",
     "//net",
     "//net:http_server",
     "//starboard",
diff --git a/cobalt/h5vcc/dial/dial_server.cc b/cobalt/h5vcc/dial/dial_server.cc
index 5764b88..f68f570 100644
--- a/cobalt/h5vcc/dial/dial_server.cc
+++ b/cobalt/h5vcc/dial/dial_server.cc
@@ -21,8 +21,9 @@
 
 #include "base/strings/string_util.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/dom/dom_settings.h"
 #include "cobalt/network/network_module.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "net/dial/dial_service_handler.h"
 #include "net/server/http_server_request_info.h"
 
@@ -74,12 +75,13 @@
 DialServer::DialServer(script::EnvironmentSettings* settings,
                        const std::string& service_name) {
   service_handler_ = new ServiceHandler(AsWeakPtr(), service_name);
-  dom::DOMSettings* dom_settings =
-      base::polymorphic_downcast<dom::DOMSettings*>(settings);
-  DCHECK(dom_settings);
+  auto* web_settings =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings);
+  DCHECK(web_settings);
 
-  if (dom_settings->network_module() && dom_settings->network_module()) {
-    dial_service_proxy_ = dom_settings->network_module()->dial_service_proxy();
+  if (web_settings && web_settings->context()->network_module()) {
+    dial_service_proxy_ =
+        web_settings->context()->network_module()->dial_service_proxy();
   }
   if (dial_service_proxy_) {
     DLOG(INFO) << "DialServer running at: "
diff --git a/cobalt/h5vcc/h5vcc.gyp b/cobalt/h5vcc/h5vcc.gyp
deleted file mode 100644
index ce59392..0000000
--- a/cobalt/h5vcc/h5vcc.gyp
+++ /dev/null
@@ -1,127 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'h5vcc',
-      'type': 'static_library',
-      'sources': [
-        'dial/dial_http_request.cc',
-        'dial/dial_http_request.h',
-        'dial/dial_http_response.cc',
-        'dial/dial_http_response.h',
-        'dial/dial_server.cc',
-        'dial/dial_server.h',
-        'h5vcc.cc',
-        'h5vcc.h',
-        'h5vcc_accessibility.cc',
-        'h5vcc_accessibility.h',
-        'h5vcc_account_info.cc',
-        'h5vcc_account_info.h',
-        'h5vcc_audio_config.cc',
-        'h5vcc_audio_config.h',
-        'h5vcc_audio_config_array.cc',
-        'h5vcc_audio_config_array.h',
-        'h5vcc_deep_link_event_target.cc',
-        'h5vcc_deep_link_event_target.h',
-        'h5vcc_event_listener_container.h',
-        'h5vcc_platform_service.cc',
-        'h5vcc_platform_service.h',
-        'h5vcc_runtime.cc',
-        'h5vcc_runtime.h',
-        'h5vcc_runtime_event_target.cc',
-        'h5vcc_runtime_event_target.h',
-        'h5vcc_screen.cc',
-        'h5vcc_screen.h',
-        'h5vcc_settings.cc',
-        'h5vcc_settings.h',
-        'h5vcc_storage.cc',
-        'h5vcc_storage.h',
-        'h5vcc_system.cc',
-        'h5vcc_system.h',
-        'h5vcc_trace_event.cc',
-        'h5vcc_trace_event.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/build/cobalt_build_id.gyp:cobalt_build_id',
-        '<(DEPTH)/cobalt/configuration/configuration.gyp:configuration',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-        '<(DEPTH)/net/net.gyp:net',
-      ],
-      'include_dirs': [
-        # For cobalt_build_id.h
-        '<(SHARED_INTERMEDIATE_DIR)',
-      ],
-      'conditions': [
-        ['enable_account_manager == 1', {
-          'sources': [
-            'h5vcc_account_manager.cc',
-            'h5vcc_account_manager.h',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'COBALT_ENABLE_ACCOUNT_MANAGER',
-            ],
-          },
-        }],
-        ['enable_crash_log == 1', {
-          'sources': [
-            'h5vcc_crash_log.cc',
-            'h5vcc_crash_log.h',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'COBALT_ENABLE_CRASH_LOG',
-            ],
-          },
-        }],
-        ['enable_sso == 1', {
-          'sources': [
-            'h5vcc_sso.cc',
-            'h5vcc_sso.h',
-          ],
-          'defines': [
-            'COBALT_ENABLE_SSO',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'COBALT_ENABLE_SSO',
-            ],
-          },
-        }],
-        ['sb_evergreen == 1', {
-          'sources': [
-            'h5vcc_updater.cc',
-            'h5vcc_updater.h',
-          ],
-         'dependencies': [
-           '<(DEPTH)/cobalt/updater/updater.gyp:updater',
-         ],
-        }],
-      ],
-    },
-
-    {
-      'target_name': 'h5vcc_testing',
-      'type': 'static_library',
-      'sources': [
-      ],
-    },
-  ],
-}
diff --git a/cobalt/h5vcc/h5vcc.idl b/cobalt/h5vcc/h5vcc.idl
index e55bbad..eb10236 100644
--- a/cobalt/h5vcc/h5vcc.idl
+++ b/cobalt/h5vcc/h5vcc.idl
@@ -27,7 +27,7 @@
 // during construction.
 
 // Note: every attribute defined here must have a corresponding interface idl
-// file included in browser_bindings_gen.gyp unconditionally, even if there is
+// file included in BUILD.gn unconditionally, even if there is
 // a condition before the declaration of the attribute.
 
 interface H5vcc {
diff --git a/cobalt/h5vcc/h5vcc_crash_log.cc b/cobalt/h5vcc/h5vcc_crash_log.cc
index 6eafc6f..41dad67 100644
--- a/cobalt/h5vcc/h5vcc_crash_log.cc
+++ b/cobalt/h5vcc/h5vcc_crash_log.cc
@@ -123,5 +123,68 @@
   }
 }
 
+bool H5vccCrashLog::Register(const std::string& name,
+                             const std::string& description,
+                             WatchdogState watchdog_state,
+                             int64_t time_interval, int64_t time_wait,
+                             WatchdogReplace watchdog_replace) {
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog) {
+    base::ApplicationState monitor_state;
+    switch (watchdog_state) {
+      case kWatchdogStateStarted:
+        monitor_state = base::kApplicationStateStarted;
+        break;
+      case kWatchdogStateBlurred:
+        monitor_state = base::kApplicationStateBlurred;
+        break;
+      case kWatchdogStateConcealed:
+        monitor_state = base::kApplicationStateConcealed;
+        break;
+      case kWatchdogStateFrozen:
+        monitor_state = base::kApplicationStateFrozen;
+        break;
+      default:
+        monitor_state = base::kApplicationStateStarted;
+    }
+    watchdog::Replace replace;
+    switch (watchdog_replace) {
+      case kWatchdogReplaceNone:
+        replace = watchdog::NONE;
+        break;
+      case kWatchdogReplacePing:
+        replace = watchdog::PING;
+        break;
+      case kWatchdogReplaceAll:
+        replace = watchdog::ALL;
+        break;
+      default:
+        replace = watchdog::NONE;
+    }
+    return watchdog->Register(name, description, monitor_state, time_interval,
+                              time_wait, replace);
+  }
+  return false;
+}
+
+bool H5vccCrashLog::Unregister(const std::string& name) {
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog) return watchdog->Unregister(name);
+  return false;
+}
+
+bool H5vccCrashLog::Ping(const std::string& name,
+                         const std::string& ping_info) {
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog) return watchdog->Ping(name, ping_info);
+  return false;
+}
+
+std::string H5vccCrashLog::GetWatchdogViolations(bool current) {
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog) return watchdog->GetWatchdogViolations(current);
+  return "";
+}
+
 }  // namespace h5vcc
 }  // namespace cobalt
diff --git a/cobalt/h5vcc/h5vcc_crash_log.h b/cobalt/h5vcc/h5vcc_crash_log.h
index 1ea13dc..3e44f11 100644
--- a/cobalt/h5vcc/h5vcc_crash_log.h
+++ b/cobalt/h5vcc/h5vcc_crash_log.h
@@ -18,7 +18,10 @@
 #include <string>
 
 #include "cobalt/h5vcc/h5vcc_crash_type.h"
+#include "cobalt/h5vcc/watchdog_replace.h"
+#include "cobalt/h5vcc/watchdog_state.h"
 #include "cobalt/script/wrappable.h"
+#include "cobalt/watchdog/watchdog.h"
 
 namespace cobalt {
 namespace h5vcc {
@@ -31,6 +34,16 @@
 
   void TriggerCrash(H5vccCrashType intent);
 
+  bool Register(const std::string& name, const std::string& description,
+                WatchdogState watchdog_state, int64_t time_interval,
+                int64_t time_wait, WatchdogReplace watchdog_replace);
+
+  bool Unregister(const std::string& name);
+
+  bool Ping(const std::string& name, const std::string& ping_info);
+
+  std::string GetWatchdogViolations(bool current);
+
   DEFINE_WRAPPABLE_TYPE(H5vccCrashLog);
 
  private:
diff --git a/cobalt/h5vcc/h5vcc_crash_log.idl b/cobalt/h5vcc/h5vcc_crash_log.idl
index c5df849..45b1353 100644
--- a/cobalt/h5vcc/h5vcc_crash_log.idl
+++ b/cobalt/h5vcc/h5vcc_crash_log.idl
@@ -31,4 +31,33 @@
   // type of crash. The result may vary by platform. This API is intended for
   // reliability testing only.
   void triggerCrash(H5vccCrashType intent);
+
+  // Returns true if Watchdog client was registered.
+  //   name, Watchdog client to register.
+  //   description, information on the Watchdog client.
+  //   monitor_state, application state up to which the client is monitored.
+  //   time_interval, maximum number of microseconds allowed between pings
+  //     before triggering a Watchdog violation.
+  //   time_wait, number of microseconds to initially wait before Watchdog
+  //     violations can be triggered.
+  //   replace, behavior with previously registered Watchdog clients of the
+  //     same name.
+  boolean register(DOMString name, DOMString description,
+                   WatchdogState watchdog_state, long long time_interval,
+                   long long time_wait, WatchdogReplace watchdog_replace);
+
+  // Returns true if Watchdog client was unregistered. Name determines the
+  // Watchdog client to unregister.
+  boolean unregister(DOMString name);
+
+  // Returns true if Watchdog client was pinged. Name determines the Watchdog
+  // client to ping with ping_info which can either be empty or contain relevant
+  // metadata.
+  boolean ping(DOMString name, DOMString ping_info);
+
+  // Returns a json string containing the Watchdog violations. Current boolean
+  // determines whether the current file representing ongoing violations or the
+  // previous file containing violations from previous app starts and since the
+  // last call (up to a limit) is returned.
+  DOMString getWatchdogViolations(boolean current);
 };
diff --git a/cobalt/h5vcc/h5vcc_platform_service.cc b/cobalt/h5vcc/h5vcc_platform_service.cc
index f20b5ca..4cbf743 100644
--- a/cobalt/h5vcc/h5vcc_platform_service.cc
+++ b/cobalt/h5vcc/h5vcc_platform_service.cc
@@ -18,7 +18,8 @@
 #include <vector>
 
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/dom/dom_settings.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "starboard/common/string.h"
 #include "starboard/configuration.h"
 
@@ -30,9 +31,10 @@
     script::EnvironmentSettings* settings, const std::string service_name,
     const ReceiveCallbackArg& receive_callback) {
   DCHECK(settings);
-  dom::DOMSettings* dom_settings =
-      base::polymorphic_downcast<dom::DOMSettings*>(settings);
-  auto* global_environment = dom_settings->global_environment();
+  auto* global_environment =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+          ->context()
+          ->global_environment();
   DCHECK(global_environment);
 
   const ExtPlatformServiceApi* platform_service_api =
diff --git a/cobalt/h5vcc/h5vcc_trace_event.cc b/cobalt/h5vcc/h5vcc_trace_event.cc
index a7c509e..2a06dee 100644
--- a/cobalt/h5vcc/h5vcc_trace_event.cc
+++ b/cobalt/h5vcc/h5vcc_trace_event.cc
@@ -45,12 +45,16 @@
   }
 }
 
-std::string H5vccTraceEvent::Read() {
+std::string H5vccTraceEvent::Read(const std::string& read_filename) {
   if (trace_to_file_) {
     Stop();
   }
   std::string trace;
-  if (!last_absolute_path_.empty()) {
+  if (!read_filename.empty()) {
+    auto path = trace_event::ScopedTraceToFile::filepath_to_absolute(
+        base::FilePath(read_filename));
+    ReadFileToString(path, &trace);
+  } else if (!last_absolute_path_.empty()) {
     ReadFileToString(last_absolute_path_, &trace);
   }
   return trace;
diff --git a/cobalt/h5vcc/h5vcc_trace_event.h b/cobalt/h5vcc/h5vcc_trace_event.h
index 9621448..5239af7 100644
--- a/cobalt/h5vcc/h5vcc_trace_event.h
+++ b/cobalt/h5vcc/h5vcc_trace_event.h
@@ -51,7 +51,7 @@
 
   void Start(const std::string& output_filename);
   void Stop();
-  std::string Read();
+  std::string Read(const std::string& output_filename);
 
   TRACE_EVENT0_FOR_EACH(DEFINE_H5VCC_TRACE_EVENT0)
   TRACE_EVENT1_FOR_EACH(DEFINE_H5VCC_TRACE_EVENT1)
diff --git a/cobalt/h5vcc/h5vcc_trace_event.idl b/cobalt/h5vcc/h5vcc_trace_event.idl
index 3e1a23c..0b2bccf 100644
--- a/cobalt/h5vcc/h5vcc_trace_event.idl
+++ b/cobalt/h5vcc/h5vcc_trace_event.idl
@@ -19,7 +19,7 @@
   // will be used.
   void start(optional DOMString output_filename = "");
   void stop();
-  DOMString read();
+  DOMString read(optional DOMString read_filename = "");
 
   void traceBegin(DOMString category, DOMString name);
   void traceEnd(DOMString category, DOMString name);
diff --git a/cobalt/h5vcc/h5vcc_updater.h b/cobalt/h5vcc/h5vcc_updater.h
index 8b869ff..22c3185 100644
--- a/cobalt/h5vcc/h5vcc_updater.h
+++ b/cobalt/h5vcc/h5vcc_updater.h
@@ -14,7 +14,7 @@
 
 // Note: this header will be used to generate bindings for the H5vccUpdater
 // interface even on non-evergreen platforms where this header is not included
-// in the h5vcc.gyp file. But eventually the updater attribute/interface will
+// in the BUILD.gn file. But eventually the updater attribute/interface will
 // not be present in the window.H5vcc interface on non-evergreen platforms.
 
 #ifndef COBALT_H5VCC_H5VCC_UPDATER_H_
diff --git a/cobalt/h5vcc/watchdog_replace.idl b/cobalt/h5vcc/watchdog_replace.idl
new file mode 100644
index 0000000..ad8a3d1
--- /dev/null
+++ b/cobalt/h5vcc/watchdog_replace.idl
@@ -0,0 +1,21 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Watchdog register behavior with previously registered clients of the same
+// name.
+enum WatchdogReplace {
+  "none",
+  "ping",
+  "all",
+};
diff --git a/cobalt/h5vcc/watchdog_state.idl b/cobalt/h5vcc/watchdog_state.idl
new file mode 100644
index 0000000..658e851
--- /dev/null
+++ b/cobalt/h5vcc/watchdog_state.idl
@@ -0,0 +1,21 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Watchdog application state, used to start/stop monitoring as needed.
+enum WatchdogState {
+  "started",
+  "blurred",
+  "concealed",
+  "frozen",
+};
diff --git a/cobalt/input/input.gyp b/cobalt/input/input.gyp
deleted file mode 100644
index ba1df1c..0000000
--- a/cobalt/input/input.gyp
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'input',
-      'type': 'static_library',
-      'sources': [
-        'camera_3d.h',
-        'create_default_camera_3d.h',
-        'input_device_manager.h',
-        'input_device_manager_desktop.cc',
-        'input_device_manager_desktop.h',
-        'input_device_manager_fuzzer.cc',
-        'input_device_manager_fuzzer.h',
-        'input_device_manager_starboard.cc',
-        'input_poller.h',
-        'input_poller_impl.cc',
-        'input_poller_impl.h',
-        'key_event_handler.cc',
-        'key_event_handler.h',
-        'key_repeat_filter.cc',
-        'key_repeat_filter.h',
-        'keypress_generator_filter.cc',
-        'keypress_generator_filter.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-        '<(DEPTH)/cobalt/system_window/system_window.gyp:system_window',
-      ],
-      'conditions': [
-        ['enable_vr==1', {
-          'sources': [
-            'private/camera_3d_vr.cc',
-            'private/camera_3d_vr.h',
-          ],
-        }, { # enable_vr!=1
-          'sources': [
-            'camera_3d_input_poller.cc',
-            'camera_3d_input_poller.h',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/cobalt/input/input_device_manager.h b/cobalt/input/input_device_manager.h
index b44e679..5f4567e 100644
--- a/cobalt/input/input_device_manager.h
+++ b/cobalt/input/input_device_manager.h
@@ -40,11 +40,8 @@
 typedef base::Callback<void(base::Token type, const dom::WheelEventInit&)>
     WheelEventCallback;
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 typedef base::Callback<void(base::Token type, const dom::InputEventInit&)>
     InputEventCallback;
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
 // InputDeviceManager listens to events from platform-specific input devices
 // and maps them to platform-independent keyboard key events.
@@ -56,10 +53,7 @@
       const KeyboardEventCallback& keyboard_event_callback,
       const PointerEventCallback& pointer_event_callback,
       const WheelEventCallback& wheel_event_callback,
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
       const InputEventCallback& input_event_callback,
-#endif  // SB_API_VERSION >= 12 ||
-      // SB_HAS(ON_SCREEN_KEYBOARD)
       system_window::SystemWindow* system_window);
 
   virtual ~InputDeviceManager() {}
diff --git a/cobalt/input/input_device_manager_desktop.cc b/cobalt/input/input_device_manager_desktop.cc
index 9dd65b6..2446fc7 100644
--- a/cobalt/input/input_device_manager_desktop.cc
+++ b/cobalt/input/input_device_manager_desktop.cc
@@ -52,19 +52,13 @@
     const KeyboardEventCallback& keyboard_event_callback,
     const PointerEventCallback& pointer_event_callback,
     const WheelEventCallback& wheel_event_callback,
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
     const InputEventCallback& input_event_callback,
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
     system_window::SystemWindow* system_window)
     : system_window_(system_window),
       system_window_input_event_callback_(
           base::Bind(&InputDeviceManagerDesktop::HandleSystemWindowInputEvent,
                      base::Unretained(this))),
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
       input_event_callback_(input_event_callback),
-#endif  // SB_API_VERSION >= 12 ||
-      // SB_HAS(ON_SCREEN_KEYBOARD)
       keypress_generator_filter_(keyboard_event_callback),
       pointer_event_callback_(pointer_event_callback),
       wheel_event_callback_(wheel_event_callback) {
@@ -298,7 +292,6 @@
   wheel_event_callback_.Run(type, wheel_event);
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void InputDeviceManagerDesktop::HandleInputEvent(
     const system_window::InputEvent* event) {
   // Note: we currently treat all dom::InputEvents as input (never beforeinput).
@@ -310,8 +303,6 @@
   input_event.set_is_composing(event->is_composing());
   input_event_callback_.Run(type, input_event);
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
 void InputDeviceManagerDesktop::HandleSystemWindowInputEvent(
     const base::Event* event) {
@@ -371,11 +362,8 @@
       HandleWheelEvent(input_event);
       break;
     case system_window::InputEvent::kInput:
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
       HandleInputEvent(input_event);
       break;
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
     case system_window::InputEvent::kKeyMove:
       break;
   }
diff --git a/cobalt/input/input_device_manager_desktop.h b/cobalt/input/input_device_manager_desktop.h
index 1d7a610..93697d4 100644
--- a/cobalt/input/input_device_manager_desktop.h
+++ b/cobalt/input/input_device_manager_desktop.h
@@ -28,10 +28,7 @@
       const KeyboardEventCallback& keyboard_event_callback,
       const PointerEventCallback& pointer_event_callback,
       const WheelEventCallback& wheel_event_callback,
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
       const InputEventCallback& input_event_callback,
-#endif  // SB_API_VERSION >= 12 ||
-      // SB_HAS(ON_SCREEN_KEYBOARD)
       system_window::SystemWindow* system_window);
 
   ~InputDeviceManagerDesktop() override;
@@ -45,10 +42,7 @@
   void HandleKeyboardEvent(bool is_key_down,
                            const system_window::InputEvent* input_event,
                            int key_code);
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   void HandleInputEvent(const system_window::InputEvent* event);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
   void HandlePointerEvent(base::Token type,
                           const system_window::InputEvent* input_event);
@@ -63,11 +57,8 @@
   // object is destroyed.
   base::EventCallback system_window_input_event_callback_;
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   // Called to handle an input_event.
   InputEventCallback input_event_callback_;
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
   // Keyboard event filters to process the events generated.
   KeypressGeneratorFilter keypress_generator_filter_;
diff --git a/cobalt/input/input_device_manager_starboard.cc b/cobalt/input/input_device_manager_starboard.cc
index f4228ce..719f3e6 100644
--- a/cobalt/input/input_device_manager_starboard.cc
+++ b/cobalt/input/input_device_manager_starboard.cc
@@ -24,18 +24,11 @@
     const KeyboardEventCallback& keyboard_event_callback,
     const PointerEventCallback& pointer_event_callback,
     const WheelEventCallback& wheel_event_callback,
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
     const InputEventCallback& input_event_callback,
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
     system_window::SystemWindow* system_window) {
   return std::unique_ptr<InputDeviceManager>(new InputDeviceManagerDesktop(
       keyboard_event_callback, pointer_event_callback, wheel_event_callback,
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
-      input_event_callback,
-#endif  // SB_API_VERSION >= 12 ||
-      // SB_HAS(ON_SCREEN_KEYBOARD)
-      system_window));
+      input_event_callback, system_window));
 }
 
 }  // namespace input
diff --git a/cobalt/layout/BUILD.gn b/cobalt/layout/BUILD.gn
index 1daa1a89..5070a65 100644
--- a/cobalt/layout/BUILD.gn
+++ b/cobalt/layout/BUILD.gn
@@ -96,6 +96,10 @@
     "white_space_processing.h",
   ]
 
+  if (is_debug) {
+    defines = [ "COBALT_BOX_DUMP_ENABLED" ]
+  }
+
   configs -= [ "//starboard/build/config:size" ]
   configs += [ "//starboard/build/config:speed" ]
 
diff --git a/cobalt/layout/box_generator.cc b/cobalt/layout/box_generator.cc
index 6a09ed1..a0e0438 100644
--- a/cobalt/layout/box_generator.cc
+++ b/cobalt/layout/box_generator.cc
@@ -116,14 +116,8 @@
   }
   generating_html_element_ = html_element;
 
-  bool partial_layout_is_enabled = true;
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-  partial_layout_is_enabled =
-      html_element->node_document()->partial_layout_is_enabled();
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
   // If the html element already has layout boxes, we can reuse them.
-  if (partial_layout_is_enabled && html_element->layout_boxes()) {
+  if (html_element->layout_boxes()) {
     LayoutBoxes* layout_boxes =
         base::polymorphic_downcast<LayoutBoxes*>(html_element->layout_boxes());
     DCHECK(boxes_.empty());
diff --git a/cobalt/layout/layout.gyp b/cobalt/layout/layout.gyp
deleted file mode 100644
index 201c0c2..0000000
--- a/cobalt/layout/layout.gyp
+++ /dev/null
@@ -1,160 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'layout',
-      'type': 'static_library',
-      'sources': [
-        'anonymous_block_box.cc',
-        'anonymous_block_box.h',
-        'base_direction.h',
-        'benchmark_stat_names.cc',
-        'benchmark_stat_names.h',
-        'block_container_box.cc',
-        'block_container_box.h',
-        'block_formatting_block_container_box.cc',
-        'block_formatting_block_container_box.h',
-        'block_formatting_context.cc',
-        'block_formatting_context.h',
-        'block_level_replaced_box.cc',
-        'block_level_replaced_box.h',
-        'box.cc',
-        'box.h',
-        'box_generator.cc',
-        'box_generator.h',
-        'box_intersection_observer_module.cc',
-        'box_intersection_observer_module.h',
-        'container_box.cc',
-        'container_box.h',
-        'flex_container_box.cc',
-        'flex_container_box.h',
-        'flex_formatting_context.cc',
-        'flex_formatting_context.h',
-        'flex_item.cc',
-        'flex_item.h',
-        'flex_line.cc',
-        'flex_line.h',
-        'letterboxed_image.cc',
-        'letterboxed_image.h',
-        'formatting_context.h',
-        'initial_containing_block.cc',
-        'initial_containing_block.h',
-        'inline_container_box.cc',
-        'inline_container_box.h',
-        'inline_formatting_context.cc',
-        'inline_formatting_context.h',
-        'inline_level_replaced_box.cc',
-        'inline_level_replaced_box.h',
-        'insets_layout_unit.cc',
-        'insets_layout_unit.h',
-        'intersection_observer_root.h',
-        'intersection_observer_target.cc',
-        'intersection_observer_target.h',
-        'layout.cc',
-        'layout.h',
-        'layout_unit.h',
-        'layout_boxes.cc',
-        'layout_boxes.h',
-        'layout_manager.cc',
-        'layout_manager.h',
-        'layout_stat_tracker.cc',
-        'layout_stat_tracker.h',
-        'line_box.cc',
-        'line_box.h',
-        'line_wrapping.cc',
-        'line_wrapping.h',
-        'paragraph.cc',
-        'paragraph.h',
-        'point_layout_unit.cc',
-        'point_layout_unit.h',
-        'replaced_box.cc',
-        'replaced_box.h',
-        'rect_layout_unit.cc',
-        'rect_layout_unit.h',
-        'render_tree_animations.h',
-        'size_layout_unit.cc',
-        'size_layout_unit.h',
-        'text_box.cc',
-        'text_box.h',
-        'topmost_event_target.cc',
-        'topmost_event_target.h',
-        'used_style.cc',
-        'used_style.h',
-        'vector2d_layout_unit.cc',
-        'vector2d_layout_unit.h',
-        'white_space_processing.cc',
-        'white_space_processing.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/cobalt/render_tree/render_tree.gyp:animations',
-        '<(DEPTH)/cobalt/render_tree/render_tree.gyp:render_tree',
-        '<(DEPTH)/cobalt/ui_navigation/ui_navigation.gyp:ui_navigation',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-      ],
-      # Exporting dom so that layout_test gets the transitive include paths to
-      # include generated headers.
-      'export_dependent_settings': [
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-      ],
-    },
-
-    {
-      'target_name': 'layout_testing',
-      'type': 'static_library',
-      'sources': [
-        'testing/mock_image.h',
-      ],
-    },
-
-    {
-      'target_name': 'layout_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'letterboxed_image_test.cc',
-        'layout_unit_test.cc',
-        'used_style_test.cc',
-        'white_space_processing_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/css_parser/css_parser.gyp:css_parser',
-        '<(DEPTH)/cobalt/layout/layout.gyp:layout_testing',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'layout',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'layout_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'layout_test',
-      ],
-      'variables': {
-        'executable_name': 'layout_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/layout_tests/BUILD.gn b/cobalt/layout_tests/BUILD.gn
index 01eb9e0..092b8df 100644
--- a/cobalt/layout_tests/BUILD.gn
+++ b/cobalt/layout_tests/BUILD.gn
@@ -63,6 +63,20 @@
     "//testing/gtest",
     "//url",
   ]
+
+  content_deps = [
+    "//cobalt/layout_tests/testdata:layout_copy_test_data",
+    "//cobalt/network:copy_ssl_certificates",
+    "//third_party/icu:icudata",
+  ]
+  if (cobalt_font_package == "empty") {
+    content_deps += [ "//cobalt/content/fonts:copy_font_data" ]
+  } else {
+    content_deps += [
+      "//cobalt/content/fonts:copy_fonts",
+      "//cobalt/content/fonts:fonts_xml",
+    ]
+  }
 }
 
 target(gtest_target_type, "web_platform_tests") {
@@ -84,4 +98,6 @@
     "//testing/gtest",
     "//url",
   ]
+
+  content_deps = [ "//cobalt/layout_tests/testdata:layout_copy_test_data" ]
 }
diff --git a/cobalt/layout_tests/layout_snapshot.cc b/cobalt/layout_tests/layout_snapshot.cc
index 703a6ad..13573c7 100644
--- a/cobalt/layout_tests/layout_snapshot.cc
+++ b/cobalt/layout_tests/layout_snapshot.cc
@@ -83,7 +83,7 @@
 
   // Use test runner mode to allow the content itself to dictate when it is
   // ready for layout should be performed.  See cobalt/dom/test_runner.h.
-  browser::WebModule::Options web_module_options;
+  browser::WebModule::Options web_module_options("SnapshotURL");
   web_module_options.layout_trigger = layout::LayoutManager::kTestRunnerMode;
   web_module_options.image_cache_capacity = kImageCacheCapacity;
   web_module_options.provide_screenshot_function = screenshot_provider;
@@ -91,6 +91,8 @@
   // we take advantage of the convenience of inline script tags.
   web_module_options.enable_inline_script_warnings = false;
 
+  web_module_options.web_options.network_module = &network_module;
+
   // Prepare a slot for our results to be placed when ready.
   base::Optional<browser::WebModule::LayoutResults> results;
 
@@ -104,7 +106,7 @@
       browser::WebModule::CloseCallback() /* window_close_callback */,
       base::Closure() /* window_minimize_callback */,
       NULL /* can_play_type_handler */, NULL /* web_media_player_factory */,
-      &network_module, viewport_size, resource_provider, 60.0f,
+      viewport_size, resource_provider, 60.0f, NULL /* service_worker_jobs */,
       web_module_options);
 
   run_loop.Run();
diff --git a/cobalt/layout_tests/layout_tests.gyp b/cobalt/layout_tests/layout_tests.gyp
deleted file mode 100644
index 05b34a6..0000000
--- a/cobalt/layout_tests/layout_tests.gyp
+++ /dev/null
@@ -1,118 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-
-  # A library to support code that wishes to load a URL and take a snapshot
-  # of the results.  "snapshot" in this case can mean a screenshot for
-  # layout tests, or a performance profile for benchmarks, or anything else.
-  # It uses the TestRunner interface to control when the snapshot is taken.
-  'targets': [
-    {
-      'target_name': 'layout_test_utils',
-      'type': 'static_library',
-      'sources': [
-        'layout_snapshot.cc',
-        'layout_snapshot.h',
-        'test_parser.cc',
-        'test_parser.h',
-        'test_utils.cc',
-        'test_utils.h',
-        'web_platform_test_parser.cc',
-        'web_platform_test_parser.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-        '<(DEPTH)/net/net.gyp:net',
-        'layout_copy_test_data',
-      ],
-    },
-
-    {
-      'target_name': 'layout_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<(DEPTH)/cobalt/layout_tests/testdata/',
-        ],
-        'content_test_output_subdir': 'cobalt/layout_tests',
-      },
-      'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-    },
-
-    {
-      'target_name': 'layout_tests',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'layout_tests.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-        '<(DEPTH)/cobalt/renderer/renderer.gyp:render_tree_pixel_tester',
-        '<(DEPTH)/url/url.gyp:url',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'layout_test_utils',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'layout_tests_deploy',
-      'type': 'none',
-      'dependencies': [
-        'layout_tests',
-      ],
-      'variables': {
-        'executable_name': 'layout_tests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-    {
-      'target_name': 'web_platform_tests',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'web_platform_tests.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-        '<(DEPTH)/url/url.gyp:url',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'layout_test_utils',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'web_platform_tests_deploy',
-      'type': 'none',
-      'dependencies': [
-        'web_platform_tests',
-      ],
-      'variables': {
-        'executable_name': 'web_platform_tests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-  ],
-}
diff --git a/cobalt/layout_tests/testdata/BUILD.gn b/cobalt/layout_tests/testdata/BUILD.gn
index 1c8dbad..172a734 100644
--- a/cobalt/layout_tests/testdata/BUILD.gn
+++ b/cobalt/layout_tests/testdata/BUILD.gn
@@ -13,6 +13,8 @@
 # limitations under the License.
 
 copy("layout_copy_test_data") {
+  testonly = true
+  install_content = true
   sources = [
     "animation-timing/5-animation-frame-callback-is-called-before-layout-occurs-expected.png",
     "animation-timing/5-animation-frame-callback-is-called-before-layout-occurs.html",
@@ -329,6 +331,8 @@
     "css-2-1/11-1-1-overflow-scroll-absolute-positioned-elements-unpositioned-scroller.html",
     "css-2-1/11-1-1-overflow-scroll-container-scrolled-expected.png",
     "css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl-expected.png",
+    "css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl-should-honor-transform-expected.png",
+    "css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl-should-honor-transform.html",
     "css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl.html",
     "css-2-1/11-1-1-overflow-scroll-container-scrolled.html",
     "css-2-1/11-1-1-overflow-scroll-expected.png",
@@ -1762,6 +1766,7 @@
     "web-platform-tests/resource-timing/web_platform_tests.txt",
     "web-platform-tests/streams/web_platform_tests.txt",
     "web-platform-tests/websockets/web_platform_tests.txt",
+    "web-platform-tests/workers/web_platform_tests.txt",
     "webappapis/6-1-5-2-onload-event-fires-on-window-expected.png",
     "webappapis/6-1-5-2-onload-event-fires-on-window-when-set-via-attribute-expected.png",
     "webappapis/6-1-5-2-onload-event-fires-on-window-when-set-via-attribute.html",
diff --git a/cobalt/layout_tests/testdata/css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl-should-honor-transform-expected.png b/cobalt/layout_tests/testdata/css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl-should-honor-transform-expected.png
new file mode 100644
index 0000000..8f9f3df
--- /dev/null
+++ b/cobalt/layout_tests/testdata/css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl-should-honor-transform-expected.png
Binary files differ
diff --git a/cobalt/layout_tests/testdata/css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl-should-honor-transform.html b/cobalt/layout_tests/testdata/css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl-should-honor-transform.html
new file mode 100644
index 0000000..e7ac419
--- /dev/null
+++ b/cobalt/layout_tests/testdata/css-2-1/11-1-1-overflow-scroll-container-scrolled-rtl-should-honor-transform.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<!--
+ | In a scroll container, elements' translateX should be honored in RTL mode.
+ |   https://www.w3.org/TR/CSS21/visufx.html
+ -->
+<html>
+<head>
+  <style>
+    .scroll {
+      overflow: auto;
+      position: absolute;
+      background-color: rgb(75, 75, 75);
+      width: 540px;
+      height: 320px;
+    }
+
+    .focusItem {
+      overflow: hidden;
+      position: absolute;
+      width: 300px;
+      height: 300px;
+      outline: none;
+    }
+
+    .focusContent {
+      overflow: hidden;
+      margin: 20px;
+      border: 5px solid rgb(0, 0, 0);
+      width: 250px;
+      height: 250px;
+      line-height: 250px;
+      text-align: center;
+      vertical-align: middle;
+      font-size: 100px;
+    }
+
+    /*
+     * Update focusContent when the parent is focused.
+     */
+    .focusItem:focus .focusContent {
+      background-color: rgb(240, 240, 240);
+    }
+  </style>
+</head>
+
+<body>
+  <div class="scroll" dir="rtl" id="scroller">
+    <!--
+     | translateX() should be honored when computing items' position in rtl mode.
+     | When page is rendered, A0 should be focused, the right edge of A0 should
+     | be 100px from the right edge of the container, and container's scrollLeft
+     | should be 0.
+     -->
+    <div id="start" class="focusItem" tabindex="-2" style="transform: translateX(-100px)">
+      <div class="focusContent">A0</div>
+    </div>
+    <div class="focusItem" tabindex="-2" style="transform: translateX(-400px)">
+      <div class="focusContent">A1</div>
+    </div>
+  </div>
+</body>
+
+<script>
+  window.onload = function () {
+    document.getElementById("start").focus();
+    var scroller = document.getElementById("scroller");
+    if (scroller.scrollLeft != 0) {
+      console.log("FAIL" +
+        "\nValue of: scrollLeft" +
+        "\n  Actual: " + scroller.scrollLeft +
+        "\nExpected: " + "0");
+      document.body.style.backgroundColor = "#FF0000";
+    }
+    if (window.testRunner) {
+      window.testRunner.notifyDone();
+    }
+  }
+</script>
+</html>
diff --git a/cobalt/layout_tests/testdata/css-2-1/layout_tests.txt b/cobalt/layout_tests/testdata/css-2-1/layout_tests.txt
index 500d277..1f012d0 100644
--- a/cobalt/layout_tests/testdata/css-2-1/layout_tests.txt
+++ b/cobalt/layout_tests/testdata/css-2-1/layout_tests.txt
@@ -97,6 +97,7 @@
 11-1-1-overflow-scroll-absolute-positioned-elements-unpositioned-scroller
 11-1-1-overflow-scroll-container-scrolled
 11-1-1-overflow-scroll-container-scrolled-rtl
+11-1-1-overflow-scroll-container-scrolled-rtl-should-honor-transform
 11-1-1-overflow-scroll-fixed-positioned-elements-transformed-scroller
 11-1-1-overflow-scroll-fixed-positioned-elements-untransformed-scroller
 11-1-1-overflow-scroll-should-affect-descendants-with-z-index
diff --git a/cobalt/layout_tests/testdata/web-platform-tests/fetch/web_platform_tests.txt b/cobalt/layout_tests/testdata/web-platform-tests/fetch/web_platform_tests.txt
index 72ab7d8..0d4967b 100644
--- a/cobalt/layout_tests/testdata/web-platform-tests/fetch/web_platform_tests.txt
+++ b/cobalt/layout_tests/testdata/web-platform-tests/fetch/web_platform_tests.txt
@@ -3,11 +3,11 @@
 # Cobalt doesn't support Workers, so disable related tests.
 # Cobalt fetch implementation only supports the Body mixin types text(),
 #   json(), and arrayBuffer(). Blob, URLSearchParams, and FormData are not
-#   well-supported by the javascript engine. Certain tests may be substitued
+#   well-supported by the javascript engine. Certain tests may be substituted
 #   with *.cobalt.html versions to accommodate this limitation.
 
 # Failure is not specific to fetch.
-api/basic/block-mime-as-script.html,DISABLE
+api/basic/block-mime-as-script.html,PASS
 # Caching responses is not supported.
 api/basic/conditional-get.html,DISABLE
 api/basic/error-after-response.html,PASS
diff --git a/cobalt/layout_tests/testdata/web-platform-tests/workers/web_platform_tests.txt b/cobalt/layout_tests/testdata/web-platform-tests/workers/web_platform_tests.txt
new file mode 100644
index 0000000..8058d56
--- /dev/null
+++ b/cobalt/layout_tests/testdata/web-platform-tests/workers/web_platform_tests.txt
@@ -0,0 +1,129 @@
+# Worker API tests
+#
+# Cobalt currently supports a limited subset of Dedicated
+# Worker functionality, the subset here reflects the
+# features that are expected to currently work.
+
+Worker_basic.htm, PASS
+Worker_dispatchEvent_ErrorEvent.htm, PASS
+
+# b/225037465
+Worker_cross_origin_security_err.htm, DISABLE
+
+# b/226640425
+Worker_ErrorEvent_bubbles_cancelable.htm, DISABLE
+Worker_ErrorEvent_filename.htm, DISABLE
+Worker_ErrorEvent_lineno.htm, DISABLE
+Worker_ErrorEvent_message.htm, DISABLE
+Worker_ErrorEvent_type.htm, DISABLE
+
+# b/228993953
+Worker_script_mimetype.htm, DISABLE
+
+# b/229128880
+Worker_terminate_event_queue.htm, DISABLE
+
+# b/229129931
+WorkerGlobalScope_close.htm, DISABLE
+
+WorkerGlobalScope_ErrorEvent_colno.htm, DISABLE
+WorkerGlobalScope_ErrorEvent_filename.htm, DISABLE
+WorkerGlobalScope_ErrorEvent_lineno.htm, DISABLE
+WorkerGlobalScope_ErrorEvent_message.htm, DISABLE
+
+# b/228900516
+WorkerGlobalScope_importScripts_NetworkErr.htm, DISABLE
+WorkerGlobalScope_importScripts.htm, DISABLE
+
+# b/219103808
+WorkerGlobalScope_setInterval.htm, DISABLE
+WorkerGlobalScope_setTimeout.htm, DISABLE
+
+# b/229150520
+WorkerLocation_hash_encoding.htm, DISABLE
+WorkerLocation_hash_nonexist.htm, DISABLE
+WorkerLocation_hash.htm, DISABLE
+WorkerLocation_host.htm, DISABLE
+WorkerLocation_hostname.htm, DISABLE
+WorkerLocation_href.htm, DISABLE
+WorkerLocation_pathname.htm, DISABLE
+WorkerLocation_port.htm, DISABLE
+WorkerLocation_protocol.htm, DISABLE
+WorkerLocation_search_empty.htm, DISABLE
+WorkerLocation_search_fragment.htm, DISABLE
+WorkerLocation_search_nonexist.htm, DISABLE
+WorkerLocation_search.htm, DISABLE
+WorkerLocation.htm, DISABLE
+
+# b/229150526
+WorkerNavigator_appName.htm, DISABLE
+WorkerNavigator_appVersion.htm, DISABLE
+WorkerNavigator_onLine.htm, DISABLE
+WorkerNavigator_platform.htm, DISABLE
+WorkerNavigator_userAgent.htm, DISABLE
+
+# b/226640425, b/227665847, b/226641490
+postMessage_clone_port_error.htm, DISABLE
+postMessage_clone_port.htm, DISABLE
+postMessage_DataConeErr.htm, DISABLE
+postMessage_event_properties.htm, DISABLE
+postMessage_ports_readonly_array.htm, DISABLE
+postMessage_target_source.htm, DISABLE
+
+constructors/Worker/AbstractWorker.onerror.html, DISABLE
+constructors/Worker/Blob-url.html, DISABLE
+constructors/Worker/ctor-1.html, PASS
+constructors/Worker/ctor-null.html, PASS
+constructors/Worker/ctor-undefined.html, PASS
+constructors/Worker/DedicatedWorkerGlobalScope-members.html, DISABLE
+constructors/Worker/no-arguments-ctor.html, PASS
+constructors/Worker/resolve-empty-string.html, PASS
+constructors/Worker/same-origin.html, DISABLE
+constructors/Worker/terminate.html, PASS
+constructors/Worker/unexpected-self-properties.html, DISABLE
+constructors/Worker/unresolvable-url.html, DISABLE
+
+interfaces/DedicatedWorkerGlobalScope/event-ports-dedicated.html, DISABLE
+interfaces/DedicatedWorkerGlobalScope/message-event.html, DISABLE
+interfaces/DedicatedWorkerGlobalScope/second-argument-null-in-array.html, DISABLE
+interfaces/DedicatedWorkerGlobalScope/second-argument-null.html, DISABLE
+interfaces/DedicatedWorkerGlobalScope/second-argument-undefined.html, DISABLE
+interfaces/DedicatedWorkerGlobalScope/setting-postMessage.html, DISABLE
+interfaces/DedicatedWorkerGlobalScope/structured-clone-message.html, DISABLE
+
+interfaces/WorkerGlobalScope/close/incoming-message.html, PASS
+interfaces/WorkerGlobalScope/close/sending-messages.html, DISABLE
+interfaces/WorkerGlobalScope/close/setInterval.html, PASS
+interfaces/WorkerGlobalScope/close/setTimeout.html, PASS
+
+interfaces/WorkerGlobalScope/location/members.html, DISABLE
+interfaces/WorkerGlobalScope/location/redirect.html, DISABLE
+interfaces/WorkerGlobalScope/location/returns-same-object.html, DISABLE
+interfaces/WorkerGlobalScope/location/setting-members.html, DISABLE
+interfaces/WorkerGlobalScope/location/worker-separate-file.html, DISABLE
+
+interfaces/WorkerGlobalScope/onerror/exception-in-onerror.html, DISABLE
+interfaces/WorkerGlobalScope/onerror/handled.html, DISABLE
+interfaces/WorkerGlobalScope/onerror/not-handled.html, DISABLE
+interfaces/WorkerGlobalScope/onerror/propagate-to-window-onerror.html, DISABLE
+
+interfaces/WorkerGlobalScope/self.html, DISABLE
+
+non-automated/application-cache-dedicated.html, DISABLE
+
+semantics/encodings/001.html,PASS
+semantics/encodings/003.html, DISABLE
+
+semantics/multiple-workers/002.html, PASS
+
+semantics/navigation/001-1.html, DISABLE
+semantics/navigation/001.html, DISABLE
+semantics/navigation/002.html, DISABLE
+
+semantics/run-a-worker/001.html, DISABLE
+
+semantics/structured-clone/dedicated.html, DISABLE
+
+semantics/xhr/001.html, DISABLE
+semantics/xhr/002.html, DISABLE
+semantics/xhr/005.html, DISABLE
diff --git a/cobalt/layout_tests/web_platform_tests.cc b/cobalt/layout_tests/web_platform_tests.cc
index be7348d..3b2f9c1 100644
--- a/cobalt/layout_tests/web_platform_tests.cc
+++ b/cobalt/layout_tests/web_platform_tests.cc
@@ -209,12 +209,14 @@
       dom::kCspEnforcementEnable, CspDelegatePermissive::Create);
   // Use test runner mode to allow the content itself to dictate when it is
   // ready for layout should be performed.  See cobalt/dom/test_runner.h.
-  browser::WebModule::Options web_module_options;
+  browser::WebModule::Options web_module_options("RunWebPlatformTest");
   web_module_options.layout_trigger = layout::LayoutManager::kTestRunnerMode;
   // We assume that we won't suspend/resume while running the tests, and so
   // we take advantage of the convenience of inline script tags.
   web_module_options.enable_inline_script_warnings = false;
 
+  web_module_options.web_options.network_module = &network_module;
+
   // Prepare a slot for our results to be placed when ready.
   base::Optional<browser::WebModule::LayoutResults> results;
   base::RunLoop run_loop;
@@ -227,14 +229,16 @@
                  base::MessageLoop::current()),
       base::Bind(&WindowCloseCallback, &run_loop, base::MessageLoop::current()),
       base::Closure() /* window_minimize_callback */,
-      can_play_type_handler.get(), media_module.get(), &network_module,
-      kDefaultViewportSize, &resource_provider, 60.0f, web_module_options);
+      can_play_type_handler.get(), media_module.get(), kDefaultViewportSize,
+      &resource_provider, 60.0f, NULL /* service_worker_jobs */,
+      web_module_options);
   run_loop.Run();
   const std::string extract_results =
       "document.getElementById(\"__testharness__results__\").textContent;";
-  std::string output = web_module.ExecuteJavascript(
-      extract_results, base::SourceLocation(__FILE__, __LINE__, 1),
-      got_results);
+  std::string output;
+  web_module.ExecuteJavascript(extract_results,
+                               base::SourceLocation(__FILE__, __LINE__, 1),
+                               &output, got_results);
   return output;
 }
 
@@ -463,6 +467,10 @@
     GetTestName());
 
 INSTANTIATE_TEST_CASE_P(
+    workers, WebPlatformTest,
+    ::testing::ValuesIn(EnumerateWebPlatformTests("workers")), GetTestName());
+
+INSTANTIATE_TEST_CASE_P(
     encoding, WebPlatformTest,
     ::testing::ValuesIn(EnumerateWebPlatformTests("encoding")), GetTestName());
 
diff --git a/cobalt/loader/BUILD.gn b/cobalt/loader/BUILD.gn
index 2892cc9..23e6f8a 100644
--- a/cobalt/loader/BUILD.gn
+++ b/cobalt/loader/BUILD.gn
@@ -91,6 +91,8 @@
     "net_fetcher.h",
     "resource_cache.cc",
     "resource_cache.h",
+    "script_loader_factory.cc",
+    "script_loader_factory.h",
     "switches.cc",
     "switches.h",
     "sync_loader.cc",
@@ -190,7 +192,6 @@
   configs += [ "//starboard/build/config:speed" ]
 
   deps = [
-    ":copy_loader_test_data",
     ":loader",
     "//cobalt/base:base",
     "//cobalt/dom",
@@ -203,10 +204,14 @@
     "//third_party/ots:ots",
   ]
 
-  deps += cobalt_platform_dependencies
+  data_deps = [ ":copy_loader_test_data" ]
+
+  content_deps = [ ":copy_loader_test_data" ]
 }
 
 copy("copy_loader_test_data") {
+  install_content = true
+
   sources = [
     "testdata/baseline_jpeg.jpg",
     "testdata/empty.txt",
diff --git a/cobalt/loader/fetcher.h b/cobalt/loader/fetcher.h
index 02a8422..3702679 100644
--- a/cobalt/loader/fetcher.h
+++ b/cobalt/loader/fetcher.h
@@ -21,8 +21,8 @@
 #include "base/callback.h"
 #include "cobalt/dom/url_utils.h"
 #include "cobalt/loader/loader_types.h"
-#include "net/http/http_response_headers.h"
 #include "net/base/load_timing_info.h"
+#include "net/http/http_response_headers.h"
 #include "url/gurl.h"
 
 namespace cobalt {
@@ -64,8 +64,7 @@
       OnReceived(fetcher, data->data(), data->length());
     }
 
-    virtual void SetLoadTimingInfo(
-        const net::LoadTimingInfo& timing_info) {
+    virtual void SetLoadTimingInfo(const net::LoadTimingInfo& timing_info) {
       if (!load_timing_info_callback_.is_null()) {
         load_timing_info_callback_.Run(timing_info);
       }
@@ -79,8 +78,7 @@
    protected:
     Handler() {}
     virtual ~Handler() {}
-    base::Callback<void(const net::LoadTimingInfo&)>
-        load_timing_info_callback_;
+    base::Callback<void(const net::LoadTimingInfo&)> load_timing_info_callback_;
 
    private:
     DISALLOW_COPY_AND_ASSIGN(Handler);
diff --git a/cobalt/loader/fetcher_factory.cc b/cobalt/loader/fetcher_factory.cc
index 83531c6..bded32c 100644
--- a/cobalt/loader/fetcher_factory.cc
+++ b/cobalt/loader/fetcher_factory.cc
@@ -94,14 +94,16 @@
 }
 
 std::unique_ptr<Fetcher> FetcherFactory::CreateFetcher(
-    const GURL& url, Fetcher::Handler* handler) {
+    const GURL& url, const disk_cache::ResourceType type,
+    Fetcher::Handler* handler) {
   return CreateSecureFetcher(url, csp::SecurityCallback(), kNoCORSMode,
-                             Origin(), handler);
+                             Origin(), type, handler);
 }
 
 std::unique_ptr<Fetcher> FetcherFactory::CreateSecureFetcher(
     const GURL& url, const csp::SecurityCallback& url_security_callback,
-    RequestMode request_mode, const Origin& origin, Fetcher::Handler* handler) {
+    RequestMode request_mode, const Origin& origin,
+    const disk_cache::ResourceType type, Fetcher::Handler* handler) {
   LOG(INFO) << "Fetching: " << ClipUrl(url, 200);
 
   if (!url.is_valid()) {
@@ -114,6 +116,7 @@
   if ((url.SchemeIs("https") || url.SchemeIs("http") || url.SchemeIs("data")) &&
       network_module_) {
     NetFetcher::Options options;
+    options.resource_type = type;
     return std::unique_ptr<Fetcher>(
         new NetFetcher(url, url_security_callback, handler, network_module_,
                        options, request_mode, origin));
diff --git a/cobalt/loader/fetcher_factory.h b/cobalt/loader/fetcher_factory.h
index 62fc640..2630031 100644
--- a/cobalt/loader/fetcher_factory.h
+++ b/cobalt/loader/fetcher_factory.h
@@ -24,6 +24,7 @@
 #include "cobalt/csp/content_security_policy.h"
 #include "cobalt/loader/blob_fetcher.h"
 #include "cobalt/loader/fetcher.h"
+#include "net/disk_cache/cobalt/resource_type.h"
 #include "url/gurl.h"
 
 namespace cobalt {
@@ -48,12 +49,13 @@
 
   // Creates a fetcher. Returns NULL if the creation fails.
   std::unique_ptr<Fetcher> CreateFetcher(const GURL& url,
+                                         const disk_cache::ResourceType type,
                                          Fetcher::Handler* handler);
 
   std::unique_ptr<Fetcher> CreateSecureFetcher(
       const GURL& url, const csp::SecurityCallback& url_security_callback,
       RequestMode request_mode, const Origin& origin,
-      Fetcher::Handler* handler);
+      const disk_cache::ResourceType type, Fetcher::Handler* handler);
 
   network::NetworkModule* network_module() const { return network_module_; }
 
diff --git a/cobalt/loader/fetcher_factory_test.cc b/cobalt/loader/fetcher_factory_test.cc
index aff39f5..ac16d44 100644
--- a/cobalt/loader/fetcher_factory_test.cc
+++ b/cobalt/loader/fetcher_factory_test.cc
@@ -85,8 +85,8 @@
   base::RunLoop run_loop;
   StubFetcherHandler stub_fetcher_handler(&run_loop);
 
-  fetcher_ = fetcher_factory_.CreateFetcher(GURL("invalid-url"),
-                                            &stub_fetcher_handler);
+  fetcher_ = fetcher_factory_.CreateFetcher(
+      GURL("invalid-url"), disk_cache::kOther, &stub_fetcher_handler);
   EXPECT_TRUE(fetcher_);
 
   run_loop.Run();
@@ -98,8 +98,8 @@
   base::RunLoop run_loop;
   StubFetcherHandler stub_fetcher_handler(&run_loop);
 
-  fetcher_ =
-      fetcher_factory_.CreateFetcher(GURL("file:///"), &stub_fetcher_handler);
+  fetcher_ = fetcher_factory_.CreateFetcher(
+      GURL("file:///"), disk_cache::kOther, &stub_fetcher_handler);
   EXPECT_TRUE(fetcher_);
 
   run_loop.Run();
@@ -111,8 +111,8 @@
   base::RunLoop run_loop;
   StubFetcherHandler stub_fetcher_handler(&run_loop);
 
-  fetcher_ = fetcher_factory_.CreateFetcher(GURL("file://file.txt"),
-                                            &stub_fetcher_handler);
+  fetcher_ = fetcher_factory_.CreateFetcher(
+      GURL("file://file.txt"), disk_cache::kOther, &stub_fetcher_handler);
   EXPECT_TRUE(fetcher_);
 
   run_loop.Run();
@@ -127,12 +127,14 @@
   base::RunLoop run_loop;
   StubFetcherHandler stub_fetcher_handler(&run_loop);
 
-  fetcher_ = fetcher_factory_.CreateFetcher(GURL("file:///nonempty-url-1"),
-                                            &stub_fetcher_handler);
+  fetcher_ =
+      fetcher_factory_.CreateFetcher(GURL("file:///nonempty-url-1"),
+                                     disk_cache::kOther, &stub_fetcher_handler);
   EXPECT_TRUE(fetcher_);
 
-  fetcher_ = fetcher_factory_.CreateFetcher(GURL("file:///nonempty-url-2"),
-                                            &stub_fetcher_handler);
+  fetcher_ =
+      fetcher_factory_.CreateFetcher(GURL("file:///nonempty-url-2"),
+                                     disk_cache::kOther, &stub_fetcher_handler);
   EXPECT_TRUE(fetcher_);
   run_loop.Run();
   EXPECT_EQ(fetcher_.get(), stub_fetcher_handler.fetcher());
diff --git a/cobalt/loader/image/image_decoder.cc b/cobalt/loader/image/image_decoder.cc
index 6f1b6ec..07d9cbc 100644
--- a/cobalt/loader/image/image_decoder.cc
+++ b/cobalt/loader/image/image_decoder.cc
@@ -426,7 +426,6 @@
 
 // static
 bool ImageDecoder::AllowDecodingToMultiPlane() {
-#if SB_API_VERSION >= 12
   // Many image formats can produce native output in multi plane images in YUV
   // 420. Allowing these images to be decoded into multi plane image not only
   // reduces the space to store the decoded image to 37.5%, but also improves
@@ -441,11 +440,6 @@
   bool allow_image_decoding_to_multi_plane =
       std::string(configuration::Configuration::GetInstance()
                       ->CobaltRasterizerType()) == "direct-gles";
-#elif SB_HAS(GLES2) && defined(COBALT_FORCE_DIRECT_GLES_RASTERIZER)
-  bool allow_image_decoding_to_multi_plane = true;
-#else   // SB_HAS(GLES2) && defined(COBALT_FORCE_DIRECT_GLES_RASTERIZER)
-  bool allow_image_decoding_to_multi_plane = false;
-#endif  // SB_HAS(GLES2) && defined(COBALT_FORCE_DIRECT_GLES_RASTERIZER)
 
 #if !defined(COBALT_BUILD_TYPE_GOLD)
   auto command_line = base::CommandLine::ForCurrentProcess();
diff --git a/cobalt/loader/image/sandbox/sandbox.gyp b/cobalt/loader/image/sandbox/sandbox.gyp
deleted file mode 100644
index 515d645..0000000
--- a/cobalt/loader/image/sandbox/sandbox.gyp
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This is a sample sandbox application for experimenting with the Cobalt
-# ImageDecoder.
-
-{
-  'targets': [
-    # This target will build a sandbox application that allows for easy
-    # experimentation with the ImageDecoder on any platform.
-    {
-      'target_name': 'image_decoder_sandbox',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'image_decoder_sandbox.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader_copy_test_data',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/cobalt/renderer/renderer.gyp:renderer',
-        '<(DEPTH)/cobalt/system_window/system_window.gyp:system_window',
-        '<(DEPTH)/cobalt/trace_event/trace_event.gyp:trace_event',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-    },
-
-    {
-      'target_name': 'image_decoder_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'image_decoder_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'image_decoder_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/loader/loader.gyp b/cobalt/loader/loader.gyp
deleted file mode 100644
index 295c773..0000000
--- a/cobalt/loader/loader.gyp
+++ /dev/null
@@ -1,234 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'loader',
-      'type': 'static_library',
-      'sources': [
-        'blob_fetcher.cc',
-        'blob_fetcher.h',
-        'cache_fetcher.cc',
-        'cache_fetcher.h',
-        'cors_preflight.cc',
-        'cors_preflight.h',
-        'cors_preflight_cache.cc',
-        'cors_preflight_cache.h',
-        'decoder.h',
-        'embedded_fetcher.cc',
-        'embedded_fetcher.h',
-        'error_fetcher.cc',
-        'error_fetcher.h',
-        'fetcher_factory.cc',
-        'fetcher_factory.h',
-        'fetcher.cc',
-        'fetcher.h',
-        'fetcher_cache.cc',
-        'fetcher_cache.h',
-        'file_fetcher.cc',
-        'file_fetcher.h',
-        'font/remote_typeface_cache.h',
-        'font/typeface_decoder.cc',
-        'font/typeface_decoder.h',
-        'image/animated_image_tracker.cc',
-        'image/animated_image_tracker.h',
-        'image/animated_webp_image.cc',
-        'image/animated_webp_image.h',
-        'image/dummy_gif_image_decoder.cc',
-        'image/dummy_gif_image_decoder.h',
-        'image/failure_image_decoder.h',
-        'image/image_cache.h',
-        'image/image_data_decoder.cc',
-        'image/image_data_decoder.h',
-        'image/image_decoder_starboard.cc',
-        'image/image_decoder_starboard.h',
-        'image/image_decoder.cc',
-        'image/image_decoder.h',
-        'image/image_encoder.cc',
-        'image/image_encoder.h',
-        'image/image.h',
-        'image/jpeg_image_decoder.cc',
-        'image/jpeg_image_decoder.h',
-        'image/lottie_animation.h',
-        'image/lottie_animation.cc',
-        'image/lottie_animation_decoder.cc',
-        'image/lottie_animation_decoder.h',
-        'image/png_image_decoder.cc',
-        'image/png_image_decoder.h',
-        'image/stub_image_decoder.h',
-        'image/threaded_image_decoder_proxy.cc',
-        'image/threaded_image_decoder_proxy.h',
-        'image/webp_image_decoder.cc',
-        'image/webp_image_decoder.h',
-        'loader_factory.cc',
-        'loader_factory.h',
-        'loader_types.h',
-        'loader.cc',
-        'loader.h',
-        'mesh/mesh_cache.h',
-        'mesh/mesh_decoder.cc',
-        'mesh/mesh_decoder.h',
-        'mesh/mesh_projection.h',
-        'mesh/projection_codec/constants.h',
-        'mesh/projection_codec/indexed_vert.cc',
-        'mesh/projection_codec/indexed_vert.h',
-        'mesh/projection_codec/projection_decoder.cc',
-        'mesh/projection_codec/projection_decoder.h',
-        'net_fetcher.cc',
-        'net_fetcher.h',
-        'resource_cache.cc',
-        'resource_cache.h',
-        'switches.cc',
-        'switches.h',
-        'sync_loader.cc',
-        'sync_loader.h',
-        'text_decoder.h',
-        'url_fetcher_string_writer.cc',
-        'url_fetcher_string_writer.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/configuration/configuration.gyp:configuration',
-        '<(DEPTH)/cobalt/csp/csp.gyp:csp',
-        '<(DEPTH)/cobalt/loader/origin.gyp:origin',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/cobalt/render_tree/render_tree.gyp:render_tree',
-        '<(DEPTH)/cobalt/renderer/test/png_utils/png_utils.gyp:png_utils',
-        '<(DEPTH)/url/url.gyp:url',
-        '<(DEPTH)/third_party/libjpeg-turbo/libjpeg.gyp:libjpeg',
-        '<(DEPTH)/third_party/libpng/libpng.gyp:libpng',
-        '<(DEPTH)/third_party/libwebp/libwebp.gyp:libwebp',
-        'embed_resources_as_header_files_loader',
-      ],
-      'conditions': [
-        ['cobalt_config != "gold"', {
-          'dependencies': [
-            '<(DEPTH)/cobalt/renderer/test/jpeg_utils/jpeg_utils.gyp:jpeg_utils',
-          ],
-        }],
-        ['enable_about_scheme == 1', {
-          'defines': [ 'ENABLE_ABOUT_SCHEME' ],
-          'sources': [
-            'about_fetcher.cc',
-            'about_fetcher.h',
-          ]
-        }],
-      ],
-    },
-
-    {
-      'target_name': 'loader_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'blob_fetcher_test.cc',
-        'fetcher_factory_test.cc',
-        'fetcher_test.h',
-        'file_fetcher_test.cc',
-        'font/typeface_decoder_test.cc',
-        'image/image_decoder_test.cc',
-        'image/image_decoder_unit_test.cc',
-        'mesh/mesh_decoder_test.cc',
-        'loader_test.cc',
-        'text_decoder_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/third_party/ots/ots.gyp:ots',
-        'loader',
-        'loader_copy_test_data',
-        '<@(cobalt_platform_dependencies)',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'loader_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'loader_test',
-      ],
-      'variables': {
-        'executable_name': 'loader_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-    {
-      'target_name': 'loader_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<(DEPTH)/cobalt/loader/testdata/',
-        ],
-        'content_test_output_subdir': 'cobalt/loader/testdata/',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/copy_test_data.gypi' ],
-    },
-
-    {
-      # This target takes all files in the embedded_resources directory (e.g.
-      # the splash screen) and embeds them as header files for
-      # inclusion into the binary.
-      'target_name': 'embed_resources_as_header_files_loader',
-      'type': 'none',
-      # Because we generate a header, we must set the hard_dependency flag.
-      'hard_dependency': 1,
-      'variables': {
-        'script_path': '<(DEPTH)/cobalt/build/generate_data_header.py',
-        'output_path': '<(SHARED_INTERMEDIATE_DIR)/cobalt/loader/embedded_resources.h',
-        'input_directory': 'embedded_resources',
-      },
-      'sources': [
-        '<(input_directory)/black_splash_screen.html',
-        '<(input_directory)/cobalt_splash_screen.css',
-        '<(input_directory)/cobalt_splash_screen.html',
-        '<(input_directory)/cobalt_word_logo_356.png',
-        '<(input_directory)/dialog.css',
-        '<(input_directory)/dialog.js',
-        '<(input_directory)/equirectangular_40_40.msh',
-        '<(input_directory)/splash_screen.js',
-        '<(input_directory)/unable_message.html.template',
-        '<(input_directory)/update_message.html.template',
-        '<!@pymod_do_main(starboard.build.gyp_functions file_glob <(DEPTH)/cobalt/loader/embedded_resources *.html)',
-      ],
-      'actions': [
-        {
-          'action_name': 'embed_resources_as_header_files_loader',
-          'inputs': [
-            '<(script_path)',
-            '<@(_sources)',
-          ],
-          'outputs': [
-            '<(output_path)',
-          ],
-          'action': ['python2', '<(script_path)', 'LoaderEmbeddedResources', '<(output_path)', '<(input_directory)'],
-          'message': 'Embedding layout resources in "<(input_directory)" into header file, "<(output_path)".',
-        },
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(SHARED_INTERMEDIATE_DIR)',
-        ],
-      },
-    },
-  ],
-}
diff --git a/cobalt/loader/loader_factory.cc b/cobalt/loader/loader_factory.cc
index 6c542e0..ba571ba 100644
--- a/cobalt/loader/loader_factory.cc
+++ b/cobalt/loader/loader_factory.cc
@@ -22,32 +22,17 @@
 namespace cobalt {
 namespace loader {
 
-namespace {
-
-// The ResourceLoader thread uses the default stack size, which is requested
-// by passing in 0 for its stack size.
-const size_t kLoadThreadStackSize = 0;
-
-}  // namespace
-
 LoaderFactory::LoaderFactory(const char* name, FetcherFactory* fetcher_factory,
                              render_tree::ResourceProvider* resource_provider,
                              const base::DebuggerHooks& debugger_hooks,
                              size_t encoded_image_cache_capacity,
                              base::ThreadPriority loader_thread_priority)
-    : fetcher_factory_(fetcher_factory),
-      resource_provider_(resource_provider),
+    : ScriptLoaderFactory(name, fetcher_factory, loader_thread_priority),
       debugger_hooks_(debugger_hooks),
-      load_thread_("ResourceLoader"),
-      is_suspended_(false) {
+      resource_provider_(resource_provider) {
   if (encoded_image_cache_capacity > 0) {
     fetcher_cache_.reset(new FetcherCache(name, encoded_image_cache_capacity));
   }
-
-  base::Thread::Options options(base::MessageLoop::TYPE_DEFAULT,
-                                kLoadThreadStackSize);
-  options.priority = loader_thread_priority;
-  load_thread_.StartWithOptions(options);
 }
 
 std::unique_ptr<Loader> LoaderFactory::CreateImageLoader(
@@ -57,8 +42,8 @@
     const Loader::OnCompleteFunction& load_complete_callback) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  Loader::FetcherCreator fetcher_creator =
-      MakeCachedFetcherCreator(url, url_security_callback, kNoCORSMode, origin);
+  Loader::FetcherCreator fetcher_creator = MakeCachedFetcherCreator(
+      url, url_security_callback, kNoCORSMode, origin, disk_cache::kImage);
 
   std::unique_ptr<Loader> loader(new Loader(
       fetcher_creator,
@@ -76,13 +61,13 @@
 std::unique_ptr<Loader> LoaderFactory::CreateLinkLoader(
     const GURL& url, const Origin& origin,
     const csp::SecurityCallback& url_security_callback,
-    const loader::RequestMode cors_mode,
+    const loader::RequestMode cors_mode, const disk_cache::ResourceType type,
     const TextDecoder::TextAvailableCallback& link_available_callback,
     const Loader::OnCompleteFunction& load_complete_callback) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   Loader::FetcherCreator fetcher_creator =
-      MakeFetcherCreator(url, url_security_callback, cors_mode, origin);
+      MakeFetcherCreator(url, url_security_callback, cors_mode, origin, type);
 
   std::unique_ptr<Loader> loader(new Loader(
       fetcher_creator,
@@ -118,27 +103,6 @@
   return loader;
 }
 
-std::unique_ptr<Loader> LoaderFactory::CreateScriptLoader(
-    const GURL& url, const Origin& origin,
-    const csp::SecurityCallback& url_security_callback,
-    const TextDecoder::TextAvailableCallback& script_available_callback,
-    const Loader::OnCompleteFunction& load_complete_callback) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  Loader::FetcherCreator fetcher_creator =
-      MakeFetcherCreator(url, url_security_callback, kNoCORSMode, origin);
-
-  std::unique_ptr<Loader> loader(new Loader(
-      fetcher_creator,
-      base::Bind(&loader::TextDecoder::Create, script_available_callback),
-      load_complete_callback,
-      base::Bind(&LoaderFactory::OnLoaderDestroyed, base::Unretained(this)),
-      is_suspended_));
-
-  OnLoaderCreated(loader.get());
-  return loader;
-}
-
 std::unique_ptr<Loader> LoaderFactory::CreateTypefaceLoader(
     const GURL& url, const Origin& origin,
     const csp::SecurityCallback& url_security_callback,
@@ -148,7 +112,8 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   Loader::FetcherCreator fetcher_creator = MakeFetcherCreator(
-      url, url_security_callback, kCORSModeSameOriginCredentials, origin);
+      url, url_security_callback, kCORSModeSameOriginCredentials, origin,
+      disk_cache::kFont);
 
   std::unique_ptr<Loader> loader(new Loader(
       fetcher_creator,
@@ -162,29 +127,14 @@
   return loader;
 }
 
-void LoaderFactory::NotifyResourceRequested(const std::string& url) {
-  if (fetcher_cache_) {
-    fetcher_cache_->NotifyResourceRequested(url);
-  }
-}
-
-Loader::FetcherCreator LoaderFactory::MakeFetcherCreator(
-    const GURL& url, const csp::SecurityCallback& url_security_callback,
-    RequestMode request_mode, const Origin& origin) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  return base::Bind(&FetcherFactory::CreateSecureFetcher,
-                    base::Unretained(fetcher_factory_), url,
-                    url_security_callback, request_mode, origin);
-}
-
 Loader::FetcherCreator LoaderFactory::MakeCachedFetcherCreator(
     const GURL& url, const csp::SecurityCallback& url_security_callback,
-    RequestMode request_mode, const Origin& origin) {
+    RequestMode request_mode, const Origin& origin,
+    const disk_cache::ResourceType type) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  auto fetcher_creator =
-      MakeFetcherCreator(url, url_security_callback, request_mode, origin);
+  auto fetcher_creator = MakeFetcherCreator(url, url_security_callback,
+                                            request_mode, origin, type);
 
   if (fetcher_cache_) {
     return fetcher_cache_->GetFetcherCreator(url, fetcher_creator);
@@ -192,6 +142,12 @@
   return fetcher_creator;
 }
 
+void LoaderFactory::NotifyResourceRequested(const std::string& url) {
+  if (fetcher_cache_) {
+    fetcher_cache_->NotifyResourceRequested(url);
+  }
+}
+
 void LoaderFactory::Suspend() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(resource_provider_);
@@ -241,17 +197,5 @@
   load_thread_.message_loop()->task_runner()->WaitForFence();
 }
 
-void LoaderFactory::OnLoaderCreated(Loader* loader) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(active_loaders_.find(loader) == active_loaders_.end());
-  active_loaders_.insert(loader);
-}
-
-void LoaderFactory::OnLoaderDestroyed(Loader* loader) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(active_loaders_.find(loader) != active_loaders_.end());
-  active_loaders_.erase(loader);
-}
-
 }  // namespace loader
 }  // namespace cobalt
diff --git a/cobalt/loader/loader_factory.h b/cobalt/loader/loader_factory.h
index d511ab5..e3f80ff 100644
--- a/cobalt/loader/loader_factory.h
+++ b/cobalt/loader/loader_factory.h
@@ -29,6 +29,7 @@
 #include "cobalt/loader/image/image_decoder.h"
 #include "cobalt/loader/loader.h"
 #include "cobalt/loader/mesh/mesh_decoder.h"
+#include "cobalt/loader/script_loader_factory.h"
 #include "cobalt/loader/text_decoder.h"
 #include "cobalt/render_tree/resource_provider.h"
 #include "url/gurl.h"
@@ -39,7 +40,7 @@
 // The LoaderFactory provides a central loader creator object from which clients
 // can request the creation of loaders of various types.  The LoaderFactory
 // maintains all context necessary to create the various resource types.
-class LoaderFactory {
+class LoaderFactory : public ScriptLoaderFactory {
  public:
   LoaderFactory(const char* name, FetcherFactory* fetcher_factory,
                 render_tree::ResourceProvider* resource_provider,
@@ -59,7 +60,7 @@
   std::unique_ptr<Loader> CreateLinkLoader(
       const GURL& url, const Origin& origin,
       const csp::SecurityCallback& url_security_callback,
-      const loader::RequestMode cors_mode,
+      const loader::RequestMode cors_mode, const disk_cache::ResourceType type,
       const TextDecoder::TextAvailableCallback& link_available_callback,
       const Loader::OnCompleteFunction& load_complete_callback);
 
@@ -70,13 +71,6 @@
       const mesh::MeshDecoder::MeshAvailableCallback& mesh_available_callback,
       const Loader::OnCompleteFunction& load_complete_callback);
 
-  // Creates a loader that fetches and decodes a Javascript resource.
-  std::unique_ptr<Loader> CreateScriptLoader(
-      const GURL& url, const Origin& origin,
-      const csp::SecurityCallback& url_security_callback,
-      const TextDecoder::TextAvailableCallback& script_available_callback,
-      const Loader::OnCompleteFunction& load_complete_callback);
-
   // Creates a loader that fetches and decodes a render_tree::Typeface.
   std::unique_ptr<Loader> CreateTypefaceLoader(
       const GURL& url, const Origin& origin,
@@ -85,9 +79,10 @@
           typeface_available_callback,
       const Loader::OnCompleteFunction& load_complete_callback);
 
-  // Notify the LoaderFactory that the resource identified by "url" is being
-  // requested again.
-  void NotifyResourceRequested(const std::string& url);
+  Loader::FetcherCreator MakeCachedFetcherCreator(
+      const GURL& url, const csp::SecurityCallback& url_security_callback,
+      RequestMode request_mode, const Origin& origin,
+      const disk_cache::ResourceType type);
 
   // Clears out the loader factory's resource provider, aborting any in-progress
   // loads.
@@ -102,49 +97,24 @@
   // called.
   void UpdateResourceProvider(render_tree::ResourceProvider* resource_provider);
 
+  // Notify the LoaderFactory that the resource identified by "url" is being
+  // requested again.
+  void NotifyResourceRequested(const std::string& url);
+
  private:
-  void OnLoaderCreated(Loader* loader);
-  void OnLoaderDestroyed(Loader* loader);
   void SuspendActiveLoaders();
   void ResumeActiveLoaders(render_tree::ResourceProvider* resource_provider);
 
-  Loader::FetcherCreator MakeFetcherCreator(
-      const GURL& url, const csp::SecurityCallback& url_security_callback,
-      RequestMode request_mode, const Origin& origin);
-  Loader::FetcherCreator MakeCachedFetcherCreator(
-      const GURL& url, const csp::SecurityCallback& url_security_callback,
-      RequestMode request_mode, const Origin& origin);
-
-  // Ensures that the LoaderFactory methods are only called from the same
-  // thread.
-  THREAD_CHECKER(thread_checker_);
-
-  // Used to create the Fetcher component of the loaders.
-  FetcherFactory* fetcher_factory_;
-
   // Used to cache the fetched raw data.  Note that currently the cache is only
   // used to cache Image data.  We may introduce more caches once we want to
   // cache fetched data for other resource types.
   std::unique_ptr<FetcherCache> fetcher_cache_;
 
-  // Used to create render_tree resources.
-  render_tree::ResourceProvider* resource_provider_;
-
   // Used with CLOG to report errors with the image source.
   const base::DebuggerHooks& debugger_hooks_;
 
-  // Keeps track of all active loaders so that if a suspend event occurs they
-  // can be aborted.
-  typedef std::set<Loader*> LoaderSet;
-  LoaderSet active_loaders_;
-
-  // Thread to run asynchronous fetchers and decoders on.  At the moment,
-  // image decoding is the only thing done on this thread.
-  base::Thread load_thread_;
-
-  // Whether or not the LoaderFactory is currently suspended. While it is, all
-  // loaders created by it begin in a suspended state.
-  bool is_suspended_;
+  // Used to create render_tree resources.
+  render_tree::ResourceProvider* resource_provider_;
 };
 
 }  // namespace loader
diff --git a/cobalt/loader/net_fetcher.cc b/cobalt/loader/net_fetcher.cc
index c4adfef..d29c906 100644
--- a/cobalt/loader/net_fetcher.cc
+++ b/cobalt/loader/net_fetcher.cc
@@ -16,12 +16,14 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/strings/stringprintf.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/loader/cors_preflight.h"
 #include "cobalt/loader/url_fetcher_string_writer.h"
 #include "cobalt/network/network_module.h"
+#include "net/base/mime_util.h"
 #include "net/url_request/url_fetcher.h"
 #if defined(STARBOARD)
 #include "starboard/configuration.h"
@@ -71,6 +73,19 @@
   // meaningful, like "data:"
   return response_code == -1 || response_code / 100 == 2;
 }
+
+// Returns true if |mime_type| is allowed for script-like destinations.
+// See:
+// https://fetch.spec.whatwg.org/#request-destination-script-like
+// https://fetch.spec.whatwg.org/#should-response-to-request-be-blocked-due-to-mime-type?
+bool AllowMimeTypeAsScript(const std::string& mime_type) {
+  if (net::MatchesMimeType("audio/*", mime_type)) return false;
+  if (net::MatchesMimeType("image/*", mime_type)) return false;
+  if (net::MatchesMimeType("video/*", mime_type)) return false;
+  if (net::MatchesMimeType("text/csv", mime_type)) return false;
+  return true;
+}
+
 }  // namespace
 
 NetFetcher::NetFetcher(const GURL& url,
@@ -84,7 +99,8 @@
       ALLOW_THIS_IN_INITIALIZER_LIST(start_callback_(
           base::Bind(&NetFetcher::Start, base::Unretained(this)))),
       request_cross_origin_(false),
-      origin_(origin) {
+      origin_(origin),
+      request_script_(options.resource_type == disk_cache::kUncompiledScript) {
   url_fetcher_ = net::URLFetcher::Create(url, options.request_method, this);
   url_fetcher_->SetRequestContext(
       network_module->url_request_context_getter().get());
@@ -96,6 +112,10 @@
     request_cross_origin_ = true;
     url_fetcher_->AddExtraRequestHeader("Origin:" + origin.SerializedOrigin());
   }
+  std::string content_type =
+      std::string(net::HttpRequestHeaders::kResourceType) + ":" +
+      std::to_string(options.resource_type);
+  url_fetcher_->AddExtraRequestHeader(content_type);
   if ((request_cross_origin_ &&
        (request_mode == kCORSModeSameOriginCredentials)) ||
       request_mode == kCORSModeOmitCredentials) {
@@ -128,7 +148,7 @@
 void NetFetcher::OnURLFetchResponseStarted(const net::URLFetcher* source) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   if (source->GetURL() != source->GetOriginalURL()) {
-    // A redirect occured. Re-check the security policy.
+    // A redirect occurred. Re-check the security policy.
     if (!security_callback_.is_null() &&
         !security_callback_.Run(source->GetURL(), true /* did redirect */)) {
       std::string msg(base::StringPrintf(
@@ -161,6 +181,18 @@
     return HandleError(msg).InvalidateThis();
   }
 
+  if (request_script_ && source->GetResponseHeaders()) {
+    std::string mime_type;
+    if (source->GetResponseHeaders()->GetMimeType(&mime_type) &&
+        !AllowMimeTypeAsScript(mime_type)) {
+      std::string msg(base::StringPrintf(
+          "Refused to execute script from '%s' because its MIME type ('%s')"
+          " is not executable.",
+          source->GetURL().spec().c_str(), mime_type.c_str()));
+      return HandleError(msg).InvalidateThis();
+    }
+  }
+
   last_url_origin_ = Origin(source->GetURL());
 }
 
@@ -224,8 +256,7 @@
   }
 }
 
-void NetFetcher::ReportLoadTimingInfo(
-    const net::LoadTimingInfo& timing_info) {
+void NetFetcher::ReportLoadTimingInfo(const net::LoadTimingInfo& timing_info) {
   handler()->SetLoadTimingInfo(timing_info);
 }
 
diff --git a/cobalt/loader/net_fetcher.h b/cobalt/loader/net_fetcher.h
index 9093173..4fd1e80 100644
--- a/cobalt/loader/net_fetcher.h
+++ b/cobalt/loader/net_fetcher.h
@@ -26,6 +26,7 @@
 #include "cobalt/csp/content_security_policy.h"
 #include "cobalt/loader/fetcher.h"
 #include "cobalt/network/network_module.h"
+#include "net/disk_cache/cobalt/resource_type.h"
 #include "net/url_request/url_fetcher.h"
 #include "net/url_request/url_fetcher_delegate.h"
 #include "url/gurl.h"
@@ -38,8 +39,11 @@
  public:
   struct Options {
    public:
-    Options() : request_method(net::URLFetcher::GET) {}
+    Options()
+        : request_method(net::URLFetcher::GET),
+          resource_type(disk_cache::kOther) {}
     net::URLFetcher::RequestType request_method;
+    disk_cache::ResourceType resource_type;
   };
 
   NetFetcher(const GURL& url, const csp::SecurityCallback& security_callback,
@@ -107,6 +111,9 @@
   // transient, indicating that the same fetch may later succeed.
   bool did_fail_from_transient_error_ = false;
 
+  // True when the requested resource type is script.
+  bool request_script_;
+
   DISALLOW_COPY_AND_ASSIGN(NetFetcher);
 };
 
diff --git a/cobalt/loader/origin.gyp b/cobalt/loader/origin.gyp
deleted file mode 100644
index 4203e15..0000000
--- a/cobalt/loader/origin.gyp
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'origin',
-      'type': 'static_library',
-      'sources': [
-        'origin.cc',
-        'origin.h',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/loader/script_loader_factory.cc b/cobalt/loader/script_loader_factory.cc
new file mode 100644
index 0000000..8fb5cac
--- /dev/null
+++ b/cobalt/loader/script_loader_factory.cc
@@ -0,0 +1,92 @@
+// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/loader/script_loader_factory.h"
+
+#include <memory>
+
+#include "base/threading/platform_thread.h"
+#include "cobalt/loader/image/threaded_image_decoder_proxy.h"
+
+namespace cobalt {
+namespace loader {
+
+namespace {
+
+// The ResourceLoader thread uses the default stack size, which is requested
+// by passing in 0 for its stack size.
+const size_t kLoadThreadStackSize = 0;
+
+}  // namespace
+
+ScriptLoaderFactory::ScriptLoaderFactory(
+    const char* name, FetcherFactory* fetcher_factory,
+    base::ThreadPriority loader_thread_priority)
+    : fetcher_factory_(fetcher_factory),
+      load_thread_("ResourceLoader"),
+      is_suspended_(false) {
+  base::Thread::Options options(base::MessageLoop::TYPE_DEFAULT,
+                                kLoadThreadStackSize);
+  options.priority = loader_thread_priority;
+  load_thread_.StartWithOptions(options);
+}
+
+std::unique_ptr<Loader> ScriptLoaderFactory::CreateScriptLoader(
+    const GURL& url, const Origin& origin,
+    const csp::SecurityCallback& url_security_callback,
+    const TextDecoder::TextAvailableCallback& script_available_callback,
+    const Loader::OnCompleteFunction& load_complete_callback) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  Loader::FetcherCreator fetcher_creator =
+      MakeFetcherCreator(url, url_security_callback, kNoCORSMode, origin,
+                         disk_cache::kUncompiledScript);
+
+  std::unique_ptr<Loader> loader(new Loader(
+      fetcher_creator,
+      base::Bind(&loader::TextDecoder::Create, script_available_callback),
+      load_complete_callback,
+      base::Bind(&ScriptLoaderFactory::OnLoaderDestroyed,
+                 base::Unretained(this)),
+      is_suspended_));
+
+  OnLoaderCreated(loader.get());
+  return loader;
+}
+
+Loader::FetcherCreator ScriptLoaderFactory::MakeFetcherCreator(
+    const GURL& url, const csp::SecurityCallback& url_security_callback,
+    RequestMode request_mode, const Origin& origin,
+    disk_cache::ResourceType type) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  return base::Bind(&FetcherFactory::CreateSecureFetcher,
+                    base::Unretained(fetcher_factory_), url,
+                    url_security_callback, request_mode, origin, type);
+}
+
+void ScriptLoaderFactory::OnLoaderCreated(Loader* loader) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(active_loaders_.find(loader) == active_loaders_.end());
+  active_loaders_.insert(loader);
+}
+
+void ScriptLoaderFactory::OnLoaderDestroyed(Loader* loader) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(active_loaders_.find(loader) != active_loaders_.end());
+  active_loaders_.erase(loader);
+}
+
+}  // namespace loader
+}  // namespace cobalt
diff --git a/cobalt/loader/script_loader_factory.h b/cobalt/loader/script_loader_factory.h
new file mode 100644
index 0000000..0097f1e
--- /dev/null
+++ b/cobalt/loader/script_loader_factory.h
@@ -0,0 +1,83 @@
+// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_LOADER_SCRIPT_LOADER_FACTORY_H_
+#define COBALT_LOADER_SCRIPT_LOADER_FACTORY_H_
+
+#include <memory>
+#include <set>
+#include <string>
+
+#include "base/threading/thread.h"
+#include "cobalt/base/debugger_hooks.h"
+#include "cobalt/csp/content_security_policy.h"
+#include "cobalt/loader/fetcher.h"
+#include "cobalt/loader/fetcher_cache.h"
+#include "cobalt/loader/fetcher_factory.h"
+#include "cobalt/loader/loader.h"
+#include "cobalt/loader/text_decoder.h"
+#include "url/gurl.h"
+
+namespace cobalt {
+namespace loader {
+
+// The LoaderFactory provides a central loader creator object from which clients
+// can request the creation of loaders of various types.  The LoaderFactory
+// maintains all context necessary to create the various resource types.
+class ScriptLoaderFactory {
+ public:
+  ScriptLoaderFactory(const char* name, FetcherFactory* fetcher_factory,
+                      base::ThreadPriority loader_thread_priority);
+
+  // Creates a loader that fetches and decodes a Javascript resource.
+  std::unique_ptr<Loader> CreateScriptLoader(
+      const GURL& url, const Origin& origin,
+      const csp::SecurityCallback& url_security_callback,
+      const TextDecoder::TextAvailableCallback& script_available_callback,
+      const Loader::OnCompleteFunction& load_complete_callback);
+
+ protected:
+  void OnLoaderCreated(Loader* loader);
+  void OnLoaderDestroyed(Loader* loader);
+
+  Loader::FetcherCreator MakeFetcherCreator(
+      const GURL& url, const csp::SecurityCallback& url_security_callback,
+      RequestMode request_mode, const Origin& origin,
+      disk_cache::ResourceType type = disk_cache::kOther);
+
+  // Ensures that the LoaderFactory methods are only called from the same
+  // thread.
+  THREAD_CHECKER(thread_checker_);
+
+  // Used to create the Fetcher component of the loaders.
+  FetcherFactory* fetcher_factory_;
+
+  // Keeps track of all active loaders so that if a suspend event occurs they
+  // can be aborted.
+  typedef std::set<Loader*> LoaderSet;
+  LoaderSet active_loaders_;
+
+  // Thread to run asynchronous fetchers and decoders on.  At the moment,
+  // image decoding is the only thing done on this thread.
+  base::Thread load_thread_;
+
+  // Whether or not the LoaderFactory is currently suspended. While it is, all
+  // loaders created by it begin in a suspended state.
+  bool is_suspended_;
+};
+
+}  // namespace loader
+}  // namespace cobalt
+
+#endif  // COBALT_LOADER_SCRIPT_LOADER_FACTORY_H_
diff --git a/cobalt/math/BUILD.gn b/cobalt/math/BUILD.gn
index 48c2943..59c4494 100644
--- a/cobalt/math/BUILD.gn
+++ b/cobalt/math/BUILD.gn
@@ -100,5 +100,4 @@
     "//cobalt/test:run_all_unittests",
     "//testing/gtest",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/cobalt/math/math.gyp b/cobalt/math/math.gyp
deleted file mode 100644
index 344ec57..0000000
--- a/cobalt/math/math.gyp
+++ /dev/null
@@ -1,110 +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.
-
-{
-  'targets': [
-    # Compiles and tests math libraries
-    {
-      'target_name': 'math',
-      'type': 'static_library',
-      'sources': [
-        'box_f.cc',
-        'box_f.h',
-        'clamp.h',
-        'cubic_bezier.cc',
-        'cubic_bezier.h',
-        'insets.cc',
-        'insets.h',
-        'insets_base.h',
-        'insets_f.cc',
-        'insets_f.h',
-        'linear_interpolator.h',
-        'matrix3_f.cc',
-        'matrix3_f.h',
-        'matrix_interpolation.cc',
-        'matrix_interpolation.h',
-        'point.cc',
-        'point.h',
-        'point3_f.cc',
-        'point3_f.h',
-        'point_base.h',
-        'point_conversions.cc',
-        'point_conversions.h',
-        'point_f.cc',
-        'point_f.h',
-        'quad_f.cc',
-        'quad_f.h',
-        'rational.h',
-        'rect.cc',
-        'rect.h',
-        'rect_base.h',
-        'rect_base_impl.h',
-        'rect_conversions.cc',
-        'rect_conversions.h',
-        'rect_f.cc',
-        'rect_f.h',
-        'safe_integer_conversions.h',
-        'size.cc',
-        'size.h',
-        'size_base.h',
-        'size_conversions.cc',
-        'size_conversions.h',
-        'size_f.cc',
-        'size_f.h',
-        'transform_2d.cc',
-        'transform_2d.h',
-        'vector2d.cc',
-        'vector2d.h',
-        'vector2d_conversions.cc',
-        'vector2d_conversions.h',
-        'vector2d_f.cc',
-        'vector2d_f.h',
-        'vector3d_f.cc',
-        'vector3d_f.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-    },
-    {
-      'target_name': 'math_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'box_unittest.cc',
-        'cubic_bezier_unittest.cc',
-        'insets_unittest.cc',
-        'linear_interpolator_unittest.cc',
-        'matrix3_unittest.cc',
-        'matrix_interpolation_unittest.cc',
-        'point3_unittest.cc',
-        'point_unittest.cc',
-        'quad_unittest.cc',
-        'rect_unittest.cc',
-        'safe_integer_conversions_unittest.cc',
-        'size_unittest.cc',
-        'transform_2d_test.cc',
-        'vector2d_unittest.cc',
-        'vector3d_unittest.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'math',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'math_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'math_test',
-      ],
-      'variables': {
-        'executable_name': 'math_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/math/size.h b/cobalt/math/size.h
index ae97763..1f89f2d 100644
--- a/cobalt/math/size.h
+++ b/cobalt/math/size.h
@@ -8,6 +8,7 @@
 #include <iosfwd>
 #include <string>
 
+#include "base/numerics/checked_math.h"
 #include "cobalt/math/size_base.h"
 #include "cobalt/math/size_f.h"
 
@@ -27,6 +28,12 @@
 
   int GetArea() const { return width() * height(); }
 
+  base::CheckedNumeric<int> GetCheckedArea() const {
+    base::CheckedNumeric<int> checked_area = width();
+    checked_area *= height();
+    return checked_area;
+  }
+
   std::string ToString() const;
 };
 
diff --git a/cobalt/media/BUILD.gn b/cobalt/media/BUILD.gn
index 5428451..bb2d46c 100644
--- a/cobalt/media/BUILD.gn
+++ b/cobalt/media/BUILD.gn
@@ -28,64 +28,18 @@
   sources = [
     "base/audio_bus.cc",
     "base/audio_bus.h",
-    "base/audio_codecs.cc",
-    "base/audio_codecs.h",
-    "base/audio_decoder_config.cc",
-    "base/audio_decoder_config.h",
-    "base/audio_timestamp_helper.cc",
-    "base/audio_timestamp_helper.h",
-    "base/bit_reader.cc",
-    "base/bit_reader.h",
-    "base/bit_reader_core.cc",
-    "base/bit_reader_core.h",
-    "base/byte_queue.cc",
-    "base/byte_queue.h",
-    "base/channel_layout.cc",
-    "base/channel_layout.h",
-    "base/color_space.cc",
-    "base/color_space.h",
     "base/data_source.cc",
     "base/data_source.h",
-    "base/decoder_buffer.cc",
-    "base/decoder_buffer.h",
     "base/decoder_buffer_cache.cc",
     "base/decoder_buffer_cache.h",
-    "base/decrypt_config.cc",
-    "base/decrypt_config.h",
-    "base/demuxer.cc",
-    "base/demuxer.h",
-    "base/demuxer_stream.cc",
-    "base/demuxer_stream.h",
-    "base/demuxer_stream_provider.cc",
-    "base/demuxer_stream_provider.h",
     "base/drm_system.cc",
     "base/drm_system.h",
-    "base/encryption_pattern.cc",
-    "base/encryption_pattern.h",
-    "base/encryption_scheme.cc",
-    "base/encryption_scheme.h",
-    "base/hdr_metadata.cc",
-    "base/hdr_metadata.h",
+    "base/format_support_query_metrics.cc",
+    "base/format_support_query_metrics.h",
     "base/interleaved_sinc_resampler.cc",
     "base/interleaved_sinc_resampler.h",
-    "base/media_log.cc",
-    "base/media_log.h",
-    "base/media_track.cc",
-    "base/media_track.h",
-    "base/media_tracks.cc",
-    "base/media_tracks.h",
-    "base/media_util.cc",
-    "base/media_util.h",
-    "base/mime_util.cc",
-    "base/mime_util.h",
-    "base/mime_util_internal.cc",
-    "base/mime_util_internal.h",
     "base/playback_statistics.cc",
     "base/playback_statistics.h",
-    "base/ranges.cc",
-    "base/ranges.h",
-    "base/sample_format.cc",
-    "base/sample_format.h",
     "base/sbplayer_pipeline.cc",
     "base/sbplayer_set_bounds_helper.cc",
     "base/sbplayer_set_bounds_helper.h",
@@ -93,110 +47,12 @@
     "base/starboard_player.h",
     "base/starboard_utils.cc",
     "base/starboard_utils.h",
-    "base/stream_parser.cc",
-    "base/stream_parser.h",
-    "base/stream_parser_buffer.cc",
-    "base/stream_parser_buffer.h",
-    "base/text_track_config.cc",
-    "base/text_track_config.h",
-    "base/video_codecs.cc",
-    "base/video_codecs.h",
-    "base/video_decoder_config.cc",
-    "base/video_decoder_config.h",
     "base/video_frame_provider.h",
-    "base/video_util.cc",
-    "base/video_util.h",
     "decoder_buffer_allocator.cc",
     "decoder_buffer_allocator.h",
     "decoder_buffer_memory_info.h",
     "fetcher_buffered_data_source.cc",
     "fetcher_buffered_data_source.h",
-    "filters/chunk_demuxer.cc",
-    "filters/chunk_demuxer.h",
-    "filters/frame_processor.cc",
-    "filters/frame_processor.h",
-    "filters/h264_bit_reader.cc",
-    "filters/h264_bit_reader.h",
-    "filters/h264_bitstream_buffer.cc",
-    "filters/h264_bitstream_buffer.h",
-    "filters/h264_parser.cc",
-    "filters/h264_parser.h",
-    "filters/h264_to_annex_b_bitstream_converter.cc",
-    "filters/h264_to_annex_b_bitstream_converter.h",
-    "filters/h265_parser.cc",
-    "filters/h265_parser.h",
-    "filters/source_buffer_range.cc",
-    "filters/source_buffer_range.h",
-    "filters/source_buffer_state.cc",
-    "filters/source_buffer_state.h",
-    "filters/source_buffer_stream.cc",
-    "filters/source_buffer_stream.h",
-    "filters/stream_parser_factory.cc",
-    "filters/stream_parser_factory.h",
-    "formats/common/offset_byte_queue.cc",
-    "formats/common/offset_byte_queue.h",
-    "formats/mp4/aac.cc",
-    "formats/mp4/aac.h",
-    "formats/mp4/avc.cc",
-    "formats/mp4/avc.h",
-    "formats/mp4/bitstream_converter.cc",
-    "formats/mp4/bitstream_converter.h",
-    "formats/mp4/box_definitions.cc",
-    "formats/mp4/box_definitions.h",
-    "formats/mp4/box_reader.cc",
-    "formats/mp4/box_reader.h",
-    "formats/mp4/es_descriptor.cc",
-    "formats/mp4/es_descriptor.h",
-    "formats/mp4/fourccs.h",
-    "formats/mp4/hevc.cc",
-    "formats/mp4/hevc.h",
-    "formats/mp4/mp4_stream_parser.cc",
-    "formats/mp4/mp4_stream_parser.h",
-    "formats/mp4/rcheck.h",
-    "formats/mp4/sample_to_group_iterator.cc",
-    "formats/mp4/sample_to_group_iterator.h",
-    "formats/mp4/track_run_iterator.cc",
-    "formats/mp4/track_run_iterator.h",
-    "formats/mpeg/adts_constants.cc",
-    "formats/mpeg/adts_constants.h",
-    "formats/mpeg/adts_stream_parser.cc",
-    "formats/mpeg/adts_stream_parser.h",
-    "formats/mpeg/mpeg1_audio_stream_parser.cc",
-    "formats/mpeg/mpeg1_audio_stream_parser.h",
-    "formats/mpeg/mpeg_audio_stream_parser_base.cc",
-    "formats/mpeg/mpeg_audio_stream_parser_base.h",
-    "formats/webm/cluster_builder.cc",
-    "formats/webm/cluster_builder.h",
-    "formats/webm/opus_packet_builder.cc",
-    "formats/webm/opus_packet_builder.h",
-    "formats/webm/tracks_builder.cc",
-    "formats/webm/tracks_builder.h",
-    "formats/webm/webm_audio_client.cc",
-    "formats/webm/webm_audio_client.h",
-    "formats/webm/webm_cluster_parser.cc",
-    "formats/webm/webm_cluster_parser.h",
-    "formats/webm/webm_colour_parser.cc",
-    "formats/webm/webm_colour_parser.h",
-    "formats/webm/webm_constants.cc",
-    "formats/webm/webm_constants.h",
-    "formats/webm/webm_content_encodings.cc",
-    "formats/webm/webm_content_encodings.h",
-    "formats/webm/webm_content_encodings_client.cc",
-    "formats/webm/webm_content_encodings_client.h",
-    "formats/webm/webm_crypto_helpers.cc",
-    "formats/webm/webm_crypto_helpers.h",
-    "formats/webm/webm_info_parser.cc",
-    "formats/webm/webm_info_parser.h",
-    "formats/webm/webm_parser.cc",
-    "formats/webm/webm_parser.h",
-    "formats/webm/webm_stream_parser.cc",
-    "formats/webm/webm_stream_parser.h",
-    "formats/webm/webm_tracks_parser.cc",
-    "formats/webm/webm_tracks_parser.h",
-    "formats/webm/webm_video_client.cc",
-    "formats/webm/webm_video_client.h",
-    "formats/webm/webm_webvtt_parser.cc",
-    "formats/webm/webm_webvtt_parser.h",
     "media_module.cc",
     "media_module.h",
     "player/buffered_data_source.h",
@@ -242,6 +98,7 @@
     "//nb",
     "//net",
     "//starboard",
+    "//third_party/chromium/media",
     "//third_party/protobuf:protobuf_lite",
     "//url",
   ]
diff --git a/cobalt/media/OWNERS b/cobalt/media/OWNERS
deleted file mode 100644
index 8a329a4..0000000
--- a/cobalt/media/OWNERS
+++ /dev/null
@@ -1,24 +0,0 @@
-# NOTE: Do not use these owners when you're in a subdirectory that has
-# OWNERS file. For example:
-# - cast
-# - midi
-# - ozone
-# - capture/{content,video}
-# Instead prefer the OWNERS in the subdirectory as they will be more familiar,
-# and to load balance. Only use OWNERS in this file for these subdirectories
-# when doing refactorings and general cleanups.
-
-chcunningham@chromium.org
-dalecurtis@chromium.org
-ddorwin@chromium.org
-hubbe@chromium.org
-jrummell@chromium.org
-liberato@chromium.org
-sandersd@chromium.org
-watk@chromium.org
-wolenetz@chromium.org
-xhwang@chromium.org
-
-per-file *.isolate=maruel@chromium.org
-per-file *.isolate=tandrii@chromium.org
-per-file *.isolate=vadimsh@chromium.org
diff --git a/cobalt/media/base/audio_codecs.cc b/cobalt/media/base/audio_codecs.cc
deleted file mode 100644
index d364253..0000000
--- a/cobalt/media/base/audio_codecs.cc
+++ /dev/null
@@ -1,68 +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 "cobalt/media/base/audio_codecs.h"
-
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-
-namespace cobalt {
-namespace media {
-
-// These names come from src/third_party/ffmpeg/libavcodec/codec_desc.c
-std::string GetCodecName(AudioCodec codec) {
-  switch (codec) {
-    case kUnknownAudioCodec:
-      return "unknown";
-    case kCodecAAC:
-      return "aac";
-    case kCodecMP3:
-      return "mp3";
-    case kCodecPCM:
-    case kCodecPCM_S16BE:
-    case kCodecPCM_S24BE:
-      return "pcm";
-    case kCodecVorbis:
-      return "vorbis";
-    case kCodecFLAC:
-      return "flac";
-    case kCodecAMR_NB:
-      return "amr_nb";
-    case kCodecAMR_WB:
-      return "amr_wb";
-    case kCodecPCM_MULAW:
-      return "pcm_mulaw";
-    case kCodecGSM_MS:
-      return "gsm_ms";
-    case kCodecOpus:
-      return "opus";
-    case kCodecPCM_ALAW:
-      return "pcm_alaw";
-    case kCodecEAC3:
-      return "eac3";
-    case kCodecALAC:
-      return "alac";
-    case kCodecAC3:
-      return "ac3";
-  }
-  NOTREACHED();
-  return "";
-}
-
-AudioCodec StringToAudioCodec(const std::string& codec_id) {
-  if (codec_id == "aac") return kCodecAAC;
-  if (codec_id == "ac-3" || codec_id == "mp4a.A5") return kCodecAC3;
-  if (codec_id == "ec-3" || codec_id == "mp4a.A6") return kCodecEAC3;
-  if (codec_id == "mp3") return kCodecMP3;
-  if (codec_id == "alac") return kCodecALAC;
-  if (codec_id == "flac") return kCodecFLAC;
-  if (codec_id == "opus") return kCodecOpus;
-  if (codec_id == "vorbis") return kCodecVorbis;
-  if (StartsWith(codec_id, "mp4a.40.", base::CompareCase::SENSITIVE))
-    return kCodecAAC;
-  return kUnknownAudioCodec;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_codecs.h b/cobalt/media/base/audio_codecs.h
deleted file mode 100644
index 08d6678..0000000
--- a/cobalt/media/base/audio_codecs.h
+++ /dev/null
@@ -1,53 +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 COBALT_MEDIA_BASE_AUDIO_CODECS_H_
-#define COBALT_MEDIA_BASE_AUDIO_CODECS_H_
-
-#include <string>
-
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-enum AudioCodec {
-  // These values are histogrammed over time; do not change their ordinal
-  // values.  When deleting a codec replace it with a dummy value; when adding a
-  // codec, do so at the bottom before kAudioCodecMax, and update the value of
-  // kAudioCodecMax to equal the new codec.
-  kUnknownAudioCodec = 0,
-  kCodecAAC = 1,
-  kCodecMP3 = 2,
-  kCodecPCM = 3,
-  kCodecVorbis = 4,
-  kCodecFLAC = 5,
-  kCodecAMR_NB = 6,
-  kCodecAMR_WB = 7,
-  kCodecPCM_MULAW = 8,
-  kCodecGSM_MS = 9,
-  kCodecPCM_S16BE = 10,
-  kCodecPCM_S24BE = 11,
-  kCodecOpus = 12,
-  kCodecEAC3 = 13,
-  kCodecPCM_ALAW = 14,
-  kCodecALAC = 15,
-  kCodecAC3 = 16,
-  // DO NOT ADD RANDOM AUDIO CODECS!
-  //
-  // The only acceptable time to add a new codec is if there is production code
-  // that uses said codec in the same CL.
-
-  // Must always be equal to the largest entry ever logged.
-  kAudioCodecMax = kCodecAC3,
-};
-
-std::string MEDIA_EXPORT GetCodecName(AudioCodec codec);
-
-MEDIA_EXPORT AudioCodec StringToAudioCodec(const std::string& codec_id);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_AUDIO_CODECS_H_
diff --git a/cobalt/media/base/audio_decoder.h b/cobalt/media/base/audio_decoder.h
deleted file mode 100644
index 7293e8d..0000000
--- a/cobalt/media/base/audio_decoder.h
+++ /dev/null
@@ -1,90 +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 COBALT_MEDIA_BASE_AUDIO_DECODER_H_
-#define COBALT_MEDIA_BASE_AUDIO_DECODER_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/decode_status.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/pipeline_status.h"
-
-namespace cobalt {
-namespace media {
-
-class AudioBuffer;
-class CdmContext;
-class DemuxerStream;
-
-class MEDIA_EXPORT AudioDecoder {
- public:
-  // Callback for VideoDecoder initialization.
-  typedef base::Callback<void(bool success)> InitCB;
-
-  // Callback for AudioDecoder to return a decoded frame whenever it becomes
-  // available. Only non-EOS frames should be returned via this callback.
-  typedef base::Callback<void(const scoped_refptr<AudioBuffer>&)> OutputCB;
-
-  // Callback for Decode(). Called after the decoder has accepted corresponding
-  // DecoderBuffer, indicating that the pipeline can send next buffer to decode.
-  typedef base::Callback<void(DecodeStatus)> DecodeCB;
-
-  AudioDecoder();
-
-  // Fires any pending callbacks, stops and destroys the decoder.
-  // Note: Since this is a destructor, |this| will be destroyed after this call.
-  // Make sure the callbacks fired from this call doesn't post any task that
-  // depends on |this|.
-  virtual ~AudioDecoder();
-
-  // Returns the name of the decoder for logging purpose.
-  virtual std::string GetDisplayName() const = 0;
-
-  // Initializes an AudioDecoder with |config|, executing the |init_cb| upon
-  // completion.
-  //
-  // |cdm_context| can be used to handle encrypted buffers. May be null if the
-  // stream is not encrypted.
-  // |init_cb| is used to return initialization status.
-  // |output_cb| is called for decoded audio buffers (see Decode()).
-  virtual void Initialize(const AudioDecoderConfig& config,
-                          CdmContext* cdm_context, const InitCB& init_cb,
-                          const OutputCB& output_cb) = 0;
-
-  // Requests samples to be decoded. Only one decode may be in flight at any
-  // given time. Once the buffer is decoded the decoder calls |decode_cb|.
-  // |output_cb| specified in Initialize() is called for each decoded buffer,
-  // before or after |decode_cb|.
-  //
-  // Implementations guarantee that the callbacks will not be called from within
-  // this method.
-  //
-  // If |buffer| is an EOS buffer then the decoder must be flushed, i.e.
-  // |output_cb| must be called for each frame pending in the queue and
-  // |decode_cb| must be called after that.
-  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
-                      const DecodeCB& decode_cb) = 0;
-
-  // Resets decoder state. All pending Decode() requests will be finished or
-  // aborted before |closure| is called.
-  virtual void Reset(const base::Closure& closure) = 0;
-
-  // Returns true if the decoder needs bitstream conversion before decoding.
-  virtual bool NeedsBitstreamConversion() const;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AudioDecoder);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_AUDIO_DECODER_H_
diff --git a/cobalt/media/base/audio_decoder_config.cc b/cobalt/media/base/audio_decoder_config.cc
deleted file mode 100644
index 4900bcc..0000000
--- a/cobalt/media/base/audio_decoder_config.cc
+++ /dev/null
@@ -1,90 +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 "cobalt/media/base/audio_decoder_config.h"
-
-#include "base/logging.h"
-#include "cobalt/media/base/limits.h"
-
-namespace cobalt {
-namespace media {
-
-AudioDecoderConfig::AudioDecoderConfig()
-    : codec_(kUnknownAudioCodec),
-      sample_format_(kUnknownSampleFormat),
-      bytes_per_channel_(0),
-      channel_layout_(CHANNEL_LAYOUT_UNSUPPORTED),
-      samples_per_second_(0),
-      bytes_per_frame_(0),
-      codec_delay_(0) {}
-
-AudioDecoderConfig::AudioDecoderConfig(
-    AudioCodec codec, SampleFormat sample_format, ChannelLayout channel_layout,
-    int samples_per_second, const std::vector<uint8_t>& extra_data,
-    const EncryptionScheme& encryption_scheme) {
-  Initialize(codec, sample_format, channel_layout, samples_per_second,
-             extra_data, encryption_scheme, base::TimeDelta(), 0);
-}
-
-void AudioDecoderConfig::Initialize(
-    AudioCodec codec, SampleFormat sample_format, ChannelLayout channel_layout,
-    int samples_per_second, const std::vector<uint8_t>& extra_data,
-    const EncryptionScheme& encryption_scheme, base::TimeDelta seek_preroll,
-    int codec_delay) {
-  codec_ = codec;
-  channel_layout_ = channel_layout;
-  samples_per_second_ = samples_per_second;
-  sample_format_ = sample_format;
-  bytes_per_channel_ = SampleFormatToBytesPerChannel(sample_format);
-  extra_data_ = extra_data;
-  encryption_scheme_ = encryption_scheme;
-  seek_preroll_ = seek_preroll;
-  codec_delay_ = codec_delay;
-
-  int channels = ChannelLayoutToChannelCount(channel_layout_);
-  bytes_per_frame_ = channels * bytes_per_channel_;
-}
-
-AudioDecoderConfig::~AudioDecoderConfig() {}
-
-bool AudioDecoderConfig::IsValidConfig() const {
-  return codec_ != kUnknownAudioCodec &&
-         channel_layout_ != CHANNEL_LAYOUT_UNSUPPORTED &&
-         bytes_per_channel_ > 0 &&
-         bytes_per_channel_ <= limits::kMaxBytesPerSample &&
-         samples_per_second_ > 0 &&
-         samples_per_second_ <= limits::kMaxSampleRate &&
-         sample_format_ != kUnknownSampleFormat &&
-         seek_preroll_ >= base::TimeDelta() && codec_delay_ >= 0;
-}
-
-bool AudioDecoderConfig::Matches(const AudioDecoderConfig& config) const {
-  return ((codec() == config.codec()) &&
-          (bytes_per_channel() == config.bytes_per_channel()) &&
-          (channel_layout() == config.channel_layout()) &&
-          (samples_per_second() == config.samples_per_second()) &&
-          (extra_data() == config.extra_data()) &&
-          (encryption_scheme().Matches(config.encryption_scheme())) &&
-          (sample_format() == config.sample_format()) &&
-          (seek_preroll() == config.seek_preroll()) &&
-          (codec_delay() == config.codec_delay()));
-}
-
-std::string AudioDecoderConfig::AsHumanReadableString() const {
-  std::ostringstream s;
-  s << "codec: " << GetCodecName(codec())
-    << " bytes_per_channel: " << bytes_per_channel()
-    << " channel_layout: " << channel_layout()
-    << " samples_per_second: " << samples_per_second()
-    << " sample_format: " << sample_format()
-    << " bytes_per_frame: " << bytes_per_frame()
-    << " seek_preroll: " << seek_preroll().InMilliseconds() << "ms"
-    << " codec_delay: " << codec_delay() << " has extra data? "
-    << (extra_data().empty() ? "false" : "true") << " encrypted? "
-    << (is_encrypted() ? "true" : "false");
-  return s.str();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_decoder_config.h b/cobalt/media/base/audio_decoder_config.h
deleted file mode 100644
index 5c15879..0000000
--- a/cobalt/media/base/audio_decoder_config.h
+++ /dev/null
@@ -1,120 +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 COBALT_MEDIA_BASE_AUDIO_DECODER_CONFIG_H_
-#define COBALT_MEDIA_BASE_AUDIO_DECODER_CONFIG_H_
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/audio_codecs.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/encryption_scheme.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/sample_format.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// TODO(dalecurtis): FFmpeg API uses |bytes_per_channel| instead of
-// |bits_per_channel|, we should switch over since bits are generally confusing
-// to work with.
-class MEDIA_EXPORT AudioDecoderConfig {
- public:
-  // Constructs an uninitialized object. Clients should call Initialize() with
-  // appropriate values before using.
-  AudioDecoderConfig();
-
-  // Constructs an initialized object.
-  AudioDecoderConfig(AudioCodec codec, SampleFormat sample_format,
-                     ChannelLayout channel_layout, int samples_per_second,
-                     const std::vector<uint8_t>& extra_data,
-                     const EncryptionScheme& encryption_scheme);
-
-  ~AudioDecoderConfig();
-
-  // Resets the internal state of this object. |codec_delay| is in frames.
-  void Initialize(AudioCodec codec, SampleFormat sample_format,
-                  ChannelLayout channel_layout, int samples_per_second,
-                  const std::vector<uint8_t>& extra_data,
-                  const EncryptionScheme& encryption_scheme,
-                  base::TimeDelta seek_preroll, int codec_delay);
-
-  // Returns true if this object has appropriate configuration values, false
-  // otherwise.
-  bool IsValidConfig() const;
-
-  // Returns true if all fields in |config| match this config.
-  // Note: The contents of |extra_data_| are compared not the raw pointers.
-  bool Matches(const AudioDecoderConfig& config) const;
-
-  // Returns a human-readable string describing |*this|.  For debugging & test
-  // output only.
-  std::string AsHumanReadableString() const;
-
-  AudioCodec codec() const { return codec_; }
-  int bits_per_channel() const { return bytes_per_channel_ * 8; }
-  int bytes_per_channel() const { return bytes_per_channel_; }
-  ChannelLayout channel_layout() const { return channel_layout_; }
-  int samples_per_second() const { return samples_per_second_; }
-  SampleFormat sample_format() const { return sample_format_; }
-  int bytes_per_frame() const { return bytes_per_frame_; }
-  base::TimeDelta seek_preroll() const { return seek_preroll_; }
-  int codec_delay() const { return codec_delay_; }
-
-  // Optional byte data required to initialize audio decoders such as Vorbis
-  // codebooks.
-  const std::vector<uint8_t>& extra_data() const { return extra_data_; }
-
-  // Whether the audio stream is potentially encrypted.
-  // Note that in a potentially encrypted audio stream, individual buffers
-  // can be encrypted or not encrypted.
-  bool is_encrypted() const { return encryption_scheme_.is_encrypted(); }
-
-  // Encryption scheme used for encrypted buffers.
-  const EncryptionScheme& encryption_scheme() const {
-    return encryption_scheme_;
-  }
-
-  void set_mime(const std::string& mime) { mime_ = mime; }
-  const std::string& mime() const { return mime_; }
-
- private:
-  AudioCodec codec_;
-  SampleFormat sample_format_;
-  int bytes_per_channel_;
-  ChannelLayout channel_layout_;
-  int samples_per_second_;
-  int bytes_per_frame_;
-  std::vector<uint8_t> extra_data_;
-  EncryptionScheme encryption_scheme_;
-
-  // |seek_preroll_| is the duration of the data that the decoder must decode
-  // before the decoded data is valid.
-  base::TimeDelta seek_preroll_;
-
-  // |codec_delay_| is the number of frames the decoder should discard before
-  // returning decoded data.  This value can include both decoder delay as well
-  // as padding added during encoding.
-  int codec_delay_;
-
-  // |mime_| contains the mime type string specified when creating the stream.
-  // For example, when the stream is created via MediaSource, it is the mime
-  // string passed to addSourceBuffer().  It can be an empty string when the
-  // appropriate mime string is unknown.  It is provided as an extra information
-  // and can be inconsistent with the other member variables.
-  std::string mime_;
-
-  // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
-  // generated copy constructor and assignment operator. Since the extra data is
-  // typically small, the performance impact is minimal.
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_AUDIO_DECODER_CONFIG_H_
diff --git a/cobalt/media/base/audio_discard_helper.cc b/cobalt/media/base/audio_discard_helper.cc
deleted file mode 100644
index 2f2d431..0000000
--- a/cobalt/media/base/audio_discard_helper.cc
+++ /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.
-
-#include "cobalt/media/base/audio_discard_helper.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "cobalt/media/base/audio_buffer.h"
-
-namespace cobalt {
-namespace media {
-
-static void WarnOnNonMonotonicTimestamps(base::TimeDelta last_timestamp,
-                                         base::TimeDelta current_timestamp) {
-  if (last_timestamp == kNoTimestamp || last_timestamp < current_timestamp)
-    return;
-
-  const base::TimeDelta diff = current_timestamp - last_timestamp;
-  DLOG(WARNING) << "Input timestamps are not monotonically increasing! "
-                << " ts " << current_timestamp.InMicroseconds() << " us"
-                << " diff " << diff.InMicroseconds() << " us";
-}
-
-AudioDiscardHelper::AudioDiscardHelper(int sample_rate, size_t decoder_delay)
-    : sample_rate_(sample_rate),
-      decoder_delay_(decoder_delay),
-      timestamp_helper_(sample_rate_),
-      discard_frames_(0),
-      last_input_timestamp_(kNoTimestamp),
-      delayed_discard_(false),
-      delayed_end_discard_(0) {
-  DCHECK_GT(sample_rate_, 0);
-}
-
-AudioDiscardHelper::~AudioDiscardHelper() {}
-
-size_t AudioDiscardHelper::TimeDeltaToFrames(base::TimeDelta duration) const {
-  DCHECK(duration >= base::TimeDelta());
-  return duration.InSecondsF() * sample_rate_ + 0.5;
-}
-
-void AudioDiscardHelper::Reset(size_t initial_discard) {
-  discard_frames_ = initial_discard;
-  last_input_timestamp_ = kNoTimestamp;
-  timestamp_helper_.SetBaseTimestamp(kNoTimestamp);
-  delayed_discard_ = false;
-  delayed_discard_padding_ = DecoderBuffer::DiscardPadding();
-}
-
-bool AudioDiscardHelper::ProcessBuffers(
-    const scoped_refptr<DecoderBuffer>& encoded_buffer,
-    const scoped_refptr<AudioBuffer>& decoded_buffer) {
-  DCHECK(!encoded_buffer->end_of_stream());
-  DCHECK(encoded_buffer->timestamp() != kNoTimestamp);
-
-  // Issue a debug warning when we see non-monotonic timestamps.  Only a warning
-  // to allow chained OGG playback.
-  WarnOnNonMonotonicTimestamps(last_input_timestamp_,
-                               encoded_buffer->timestamp());
-  last_input_timestamp_ = encoded_buffer->timestamp();
-
-  // If this is the first buffer seen, setup the timestamp helper.
-  const bool first_buffer = !initialized();
-  if (first_buffer) {
-    // Clamp the base timestamp to zero.
-    timestamp_helper_.SetBaseTimestamp(
-        std::max(base::TimeDelta(), encoded_buffer->timestamp()));
-  }
-  DCHECK(initialized());
-
-  if (!decoded_buffer.get()) {
-    // If there's a one buffer delay for decoding, we need to save it so it can
-    // be processed with the next decoder buffer.
-    if (first_buffer) {
-      delayed_discard_ = true;
-      delayed_discard_padding_ = encoded_buffer->discard_padding();
-    }
-    return false;
-  }
-
-  const size_t original_frame_count = decoded_buffer->frame_count();
-
-  // If there's a one buffer delay for decoding, pick up the last encoded
-  // buffer's discard padding for processing with the current decoded buffer.
-  DecoderBuffer::DiscardPadding current_discard_padding =
-      encoded_buffer->discard_padding();
-  if (delayed_discard_) {
-    // For simplicity disallow cases where decoder delay is present with delayed
-    // discard (no codecs at present).  Doing so allows us to avoid complexity
-    // around endpoint tracking when handling complete buffer discards.
-    DCHECK_EQ(decoder_delay_, 0u);
-    std::swap(current_discard_padding, delayed_discard_padding_);
-  }
-
-  if (discard_frames_ > 0) {
-    const size_t decoded_frames = decoded_buffer->frame_count();
-    const size_t frames_to_discard = std::min(discard_frames_, decoded_frames);
-    discard_frames_ -= frames_to_discard;
-
-    DVLOG(1) << "Initial discard of " << frames_to_discard << " out of "
-             << decoded_frames << " frames.";
-
-    // If everything would be discarded, indicate a new buffer is required.
-    if (frames_to_discard == decoded_frames) {
-      // For simplicity, we just drop any discard padding if |discard_frames_|
-      // consumes the entire buffer.
-      return false;
-    }
-
-    decoded_buffer->TrimStart(frames_to_discard);
-  }
-
-  // Process any delayed end discard from the previous buffer.
-  if (delayed_end_discard_ > 0) {
-    DCHECK_GT(decoder_delay_, 0u);
-
-    const size_t discard_index = decoder_delay_ - delayed_end_discard_;
-    DCHECK_LT(discard_index, decoder_delay_);
-
-    const size_t decoded_frames = decoded_buffer->frame_count();
-    DCHECK_LT(delayed_end_discard_, decoded_frames);
-
-    DVLOG(1) << "Delayed end discard of " << delayed_end_discard_ << " out of "
-             << decoded_frames << " frames starting at " << discard_index;
-
-    decoded_buffer->TrimRange(discard_index,
-                              discard_index + delayed_end_discard_);
-    delayed_end_discard_ = 0;
-  }
-
-  // Handle front discard padding.
-  if (current_discard_padding.first > base::TimeDelta()) {
-    const size_t decoded_frames = decoded_buffer->frame_count();
-
-    // If a complete buffer discard is requested and there's no decoder delay,
-    // just discard all remaining frames from this buffer.  With decoder delay
-    // we have to estimate the correct number of frames to discard based on the
-    // duration of the encoded buffer.
-    const size_t start_frames_to_discard =
-        current_discard_padding.first == kInfiniteDuration
-            ? (decoder_delay_ > 0
-                   ? TimeDeltaToFrames(encoded_buffer->duration())
-                   : decoded_frames)
-            : TimeDeltaToFrames(current_discard_padding.first);
-
-    // Regardless of the timestamp on the encoded buffer, the corresponding
-    // decoded output will appear |decoder_delay_| frames later.
-    size_t discard_start = decoder_delay_;
-    if (decoder_delay_ > 0) {
-      // If we have a |decoder_delay_| and have already discarded frames from
-      // this buffer, the |discard_start| must be adjusted by the number of
-      // frames already discarded.
-      const size_t frames_discarded_so_far =
-          original_frame_count - decoded_buffer->frame_count();
-      CHECK_LE(frames_discarded_so_far, decoder_delay_);
-      discard_start -= frames_discarded_so_far;
-    }
-
-    // For simplicity require the start of the discard to be within the current
-    // buffer.  Doing so allows us avoid complexity around tracking discards
-    // across buffers.
-    CHECK_LT(discard_start, decoded_frames);
-
-    const size_t frames_to_discard =
-        std::min(start_frames_to_discard, decoded_frames - discard_start);
-
-    // Carry over any frames which need to be discarded from the front of the
-    // next buffer.
-    DCHECK(!discard_frames_);
-    discard_frames_ = start_frames_to_discard - frames_to_discard;
-
-    DVLOG(1) << "Front discard of " << frames_to_discard << " out of "
-             << decoded_frames << " frames starting at " << discard_start;
-
-    // If everything would be discarded, indicate a new buffer is required.
-    if (frames_to_discard == decoded_frames) {
-      // The buffer should not have been marked with end discard if the front
-      // discard removes everything.
-      DCHECK(current_discard_padding.second.is_zero());
-      return false;
-    }
-
-    decoded_buffer->TrimRange(discard_start, discard_start + frames_to_discard);
-  } else {
-    DCHECK(current_discard_padding.first.is_zero());
-  }
-
-  // Handle end discard padding.
-  if (current_discard_padding.second > base::TimeDelta()) {
-    const size_t decoded_frames = decoded_buffer->frame_count();
-    size_t end_frames_to_discard =
-        TimeDeltaToFrames(current_discard_padding.second);
-
-    if (decoder_delay_) {
-      // Delayed end discard only works if the decoder delay is less than a
-      // single buffer.
-      DCHECK_LT(decoder_delay_, original_frame_count);
-
-      // If the discard is >= the decoder delay, trim everything we can off the
-      // end of this buffer and the rest from the start of the next.
-      if (end_frames_to_discard >= decoder_delay_) {
-        DCHECK(!discard_frames_);
-        discard_frames_ = decoder_delay_;
-        end_frames_to_discard -= decoder_delay_;
-      } else {
-        DCHECK(!delayed_end_discard_);
-        std::swap(delayed_end_discard_, end_frames_to_discard);
-      }
-    }
-
-    if (end_frames_to_discard > decoded_frames) {
-      DLOG(ERROR) << "Encountered invalid discard padding value.";
-      return false;
-    }
-
-    if (end_frames_to_discard > 0) {
-      DVLOG(1) << "End discard of " << end_frames_to_discard << " out of "
-               << decoded_frames;
-
-      // If everything would be discarded, indicate a new buffer is required.
-      if (end_frames_to_discard == decoded_frames) return false;
-
-      decoded_buffer->TrimEnd(end_frames_to_discard);
-    }
-  } else {
-    DCHECK(current_discard_padding.second.is_zero());
-  }
-
-  DVLOG(3) << __func__ << " ts: " << timestamp_helper_.GetTimestamp()
-           << " frames: " << decoded_buffer->frame_count();
-
-  // Assign timestamp to the buffer.
-  decoded_buffer->set_timestamp(timestamp_helper_.GetTimestamp());
-  timestamp_helper_.AddFrames(decoded_buffer->frame_count());
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_discard_helper.h b/cobalt/media/base/audio_discard_helper.h
deleted file mode 100644
index 63d9ccd..0000000
--- a/cobalt/media/base/audio_discard_helper.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_AUDIO_DISCARD_HELPER_H_
-#define COBALT_MEDIA_BASE_AUDIO_DISCARD_HELPER_H_
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/audio_timestamp_helper.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class AudioBuffer;
-
-// Helper class for managing timestamps and discard events around decoding.
-class MEDIA_EXPORT AudioDiscardHelper {
- public:
-  // |sample_rate| is the sample rate of decoded data which will be handed into
-  // the ProcessBuffers() call.
-  //
-  // |decoder_delay| is the number of frames a decoder will output before data
-  // corresponding to the first encoded buffer is output.  Callers only need to
-  // specify this if the decoder inserts frames which have no corresponding
-  // encoded buffer.
-  //
-  // For example, most MP3 decoders will output 529 junk frames before the data
-  // corresponding to the first encoded buffer is output.  These frames are not
-  // represented in the encoded data stream and instead are an artifact of how
-  // most MP3 decoders work.  See http://lame.sourceforge.net/tech-FAQ.txt
-  AudioDiscardHelper(int sample_rate, size_t decoder_delay);
-  ~AudioDiscardHelper();
-
-  // Converts a TimeDelta to a frame count based on the constructed sample rate.
-  // |duration| must be positive.
-  size_t TimeDeltaToFrames(base::TimeDelta duration) const;
-
-  // Resets internal state and indicates that |initial_discard| of upcoming
-  // frames should be discarded.
-  void Reset(size_t initial_discard);
-
-  // Applies discard padding from the encoded buffer along with any initial
-  // discards.  |decoded_buffer| may be NULL, if not the timestamp and duration
-  // will be set after discards are applied.  Returns true if |decoded_buffer|
-  // exists after processing discard events.  Returns false if |decoded_buffer|
-  // was NULL, is completely discarded, or a processing error occurs.
-  //
-  // If AudioDiscardHelper is not initialized() the timestamp of the first
-  // |encoded_buffer| will be used as the basis for all future timestamps set on
-  // |decoded_buffer|s.  If the first buffer has a negative timestamp it will be
-  // clamped to zero.
-  bool ProcessBuffers(const scoped_refptr<DecoderBuffer>& encoded_buffer,
-                      const scoped_refptr<AudioBuffer>& decoded_buffer);
-
-  // Whether any buffers have been processed.
-  bool initialized() const {
-    return timestamp_helper_.base_timestamp() != kNoTimestamp;
-  }
-
- private:
-  // The sample rate of the decoded audio samples.  Used by TimeDeltaToFrames()
-  // and the timestamp helper.
-  const int sample_rate_;
-
-  // Some codecs output extra samples during the first decode.  In order to trim
-  // DiscardPadding correctly the helper must know the offset into the decoded
-  // buffers at which real samples start.
-  const size_t decoder_delay_;
-
-  // Used to regenerate sample accurate timestamps for decoded buffers.  The
-  // timestamp of the first encoded buffer seen by ProcessBuffers() is used as
-  // the base timestamp.
-  AudioTimestampHelper timestamp_helper_;
-
-  // The number of frames to discard from the front of the next buffer.  Can be
-  // set by Reset() and added to by a front DiscardPadding larger than its
-  // associated buffer.
-  size_t discard_frames_;
-
-  // The last encoded buffer timestamp seen by ProcessBuffers() or kNoTimestamp
-  // if no buffers have been seen thus far.  Used to issue warnings for buffer
-  // sequences with non-monotonic timestamps.
-  base::TimeDelta last_input_timestamp_;
-
-  // Certain codecs require two encoded buffers before they'll output the first
-  // decoded buffer.  In this case DiscardPadding must be carried over from the
-  // previous encoded buffer.  Enabled automatically if an encoded buffer is
-  // given to ProcessBuffers() with a NULL decoded buffer.
-  bool delayed_discard_;
-  DecoderBuffer::DiscardPadding delayed_discard_padding_;
-
-  // When |decoder_delay_| > 0, the number of frames which should be discarded
-  // from the next buffer.  The index at which to start discarding is calculated
-  // by subtracting |delayed_end_discard_| from |decoder_delay_|.
-  size_t delayed_end_discard_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(AudioDiscardHelper);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_AUDIO_DISCARD_HELPER_H_
diff --git a/cobalt/media/base/audio_discard_helper_unittest.cc b/cobalt/media/base/audio_discard_helper_unittest.cc
deleted file mode 100644
index bd7f744..0000000
--- a/cobalt/media/base/audio_discard_helper_unittest.cc
+++ /dev/null
@@ -1,549 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/base/audio_discard_helper.h"
-
-#include <memory>
-
-#include "cobalt/media/base/audio_buffer.h"
-#include "cobalt/media/base/audio_bus.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-static const float kDataStep = 0.01f;
-static const size_t kSampleRate = 48000;
-
-static scoped_refptr<DecoderBuffer> CreateEncodedBuffer(
-    base::TimeDelta timestamp, base::TimeDelta duration) {
-  scoped_refptr<DecoderBuffer> result(new DecoderBuffer(1));
-  result->set_timestamp(timestamp);
-  result->set_duration(duration);
-  return result;
-}
-
-static scoped_refptr<AudioBuffer> CreateDecodedBuffer(int frames) {
-  return MakeAudioBuffer(kSampleFormatPlanarF32, CHANNEL_LAYOUT_MONO, 1,
-                         kSampleRate, 0.0f, kDataStep, frames, kNoTimestamp);
-}
-
-static float ExtractDecodedData(const scoped_refptr<AudioBuffer>& buffer,
-                                int index) {
-  // This is really inefficient, but we can't access the raw AudioBuffer if any
-  // start trimming has been applied.
-  std::unique_ptr<AudioBus> temp_bus =
-      AudioBus::Create(buffer->channel_count(), 1);
-  buffer->ReadFrames(1, index, 0, temp_bus.get());
-  return temp_bus->channel(0)[0];
-}
-
-TEST(AudioDiscardHelperTest, TimeDeltaToFrames) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-
-  EXPECT_EQ(0u, discard_helper.TimeDeltaToFrames(base::TimeDelta()));
-  EXPECT_EQ(kSampleRate / 100, discard_helper.TimeDeltaToFrames(
-                                   base::TimeDelta::FromMilliseconds(10)));
-
-  // Ensure partial frames are rounded down correctly.  The equation below
-  // calculates a frame count with a fractional part < 0.5.
-  const int small_remainder =
-      base::Time::kMicrosecondsPerSecond * (kSampleRate - 0.9) / kSampleRate;
-  EXPECT_EQ(kSampleRate - 1,
-            discard_helper.TimeDeltaToFrames(
-                base::TimeDelta::FromMicroseconds(small_remainder)));
-
-  // Ditto, but rounded up using a fractional part > 0.5.
-  const int large_remainder =
-      base::Time::kMicrosecondsPerSecond * (kSampleRate - 0.4) / kSampleRate;
-  EXPECT_EQ(kSampleRate,
-            discard_helper.TimeDeltaToFrames(
-                base::TimeDelta::FromMicroseconds(large_remainder)));
-}
-
-TEST(AudioDiscardHelperTest, BasicProcessBuffers) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-
-  // Use an estimated duration which doesn't match the number of decoded frames
-  // to ensure the helper is correctly setting durations based on output frames.
-  const base::TimeDelta kEstimatedDuration =
-      base::TimeDelta::FromMilliseconds(9);
-  const base::TimeDelta kActualDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kActualDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kEstimatedDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Verify the basic case where nothing is discarded.
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kActualDuration, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames, decoded_buffer->frame_count());
-
-  // Verify a Reset() takes us back to an uninitialized state.
-  discard_helper.Reset(0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  // Verify a NULL output buffer returns false.
-  ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, NULL));
-}
-
-TEST(AudioDiscardHelperTest, NegativeTimestampClampsToZero) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = -base::TimeDelta::FromSeconds(1);
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Verify the basic case where nothing is discarded.
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-  EXPECT_EQ(base::TimeDelta(), decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames, decoded_buffer->frame_count());
-}
-
-TEST(AudioDiscardHelperTest, ProcessBuffersWithInitialDiscard) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  // Tell the helper we want to discard half of the initial frames.
-  const int kDiscardFrames = kTestFrames / 2;
-  discard_helper.Reset(kDiscardFrames);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Verify half the frames end up discarded.
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
-  EXPECT_EQ(kDiscardFrames, decoded_buffer->frame_count());
-  ASSERT_FLOAT_EQ(kDiscardFrames * kDataStep,
-                  ExtractDecodedData(decoded_buffer, 0));
-}
-
-TEST(AudioDiscardHelperTest, ProcessBuffersWithLargeInitialDiscard) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  // Tell the helper we want to discard 1.5 buffers worth of frames.
-  discard_helper.Reset(kTestFrames * 1.5);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // The first call should fail since no output buffer remains.
-  ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-
-  // Generate another set of buffers and expect half the output frames.
-  encoded_buffer = CreateEncodedBuffer(kTimestamp + kDuration, kDuration);
-  decoded_buffer = CreateDecodedBuffer(kTestFrames);
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-
-  // The timestamp should match that of the initial buffer.
-  const int kDiscardFrames = kTestFrames / 2;
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
-  EXPECT_EQ(kDiscardFrames, decoded_buffer->frame_count());
-  ASSERT_FLOAT_EQ(kDiscardFrames * kDataStep,
-                  ExtractDecodedData(decoded_buffer, 0));
-}
-
-TEST(AudioDiscardHelperTest, AllowNonMonotonicTimestamps) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames, decoded_buffer->frame_count());
-
-  // Process the same input buffer again to ensure input timestamps which go
-  // backwards in time are not errors.
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  EXPECT_EQ(kTimestamp + kDuration, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames, decoded_buffer->frame_count());
-}
-
-TEST(AudioDiscardHelperTest, DiscardEndPadding) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Set a discard padding equivalent to half the buffer.
-  encoded_buffer->set_discard_padding(
-      std::make_pair(base::TimeDelta(), kDuration / 2));
-
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count());
-}
-
-TEST(AudioDiscardHelperTest, BadDiscardEndPadding) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Set a discard padding equivalent to double the buffer size.
-  encoded_buffer->set_discard_padding(
-      std::make_pair(base::TimeDelta(), kDuration * 2));
-
-  // Verify the end discard padding is rejected.
-  ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-}
-
-TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardEndPadding) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Set a discard padding equivalent to a quarter of the buffer.
-  encoded_buffer->set_discard_padding(
-      std::make_pair(base::TimeDelta(), kDuration / 4));
-
-  // Set an initial discard of a quarter of the buffer.
-  const int kDiscardFrames = kTestFrames / 4;
-  discard_helper.Reset(kDiscardFrames);
-
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count());
-  ASSERT_FLOAT_EQ(kDiscardFrames * kDataStep,
-                  ExtractDecodedData(decoded_buffer, 0));
-}
-
-TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPadding) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Set all the discard values to be different to ensure each is properly used.
-  const int kDiscardFrames = kTestFrames / 4;
-  encoded_buffer->set_discard_padding(
-      std::make_pair(kDuration / 8, kDuration / 16));
-  discard_helper.Reset(kDiscardFrames);
-
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16,
-            decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16,
-            decoded_buffer->frame_count());
-}
-
-TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPaddingAndDecoderDelay) {
-  // Use a decoder delay of 5ms.
-  const int kDecoderDelay = kSampleRate / 100 / 2;
-  AudioDiscardHelper discard_helper(kSampleRate, kDecoderDelay);
-  ASSERT_FALSE(discard_helper.initialized());
-  discard_helper.Reset(kDecoderDelay);
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Set a discard padding equivalent to half of the buffer.
-  encoded_buffer->set_discard_padding(
-      std::make_pair(kDuration / 2, base::TimeDelta()));
-
-  // All of the first buffer should be discarded, half from the initial delay
-  // and another half from the front discard padding.
-  //
-  //    Encoded                   Discard Delay
-  //   |--------|     |---------|     |----|
-  //   |AAAAAAAA| --> |....|AAAA| --> |AAAA| -------> NULL
-  //   |--------|     |---------|     |----|
-  //                    Decoded               Discard Front Padding
-  //
-  ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-
-  // Processing another buffer that has front discard set to half the buffer's
-  // duration should discard the back half of the buffer since kDecoderDelay is
-  // half a buffer.  The end padding should not be discarded until another
-  // buffer is processed.  kDuration / 4 is chosen for the end discard since it
-  // will force the end discard to start after position zero within the next
-  // decoded buffer.
-  //
-  //    Encoded                    Discard Front Padding (from B)
-  //   |--------|     |---------|             |----|
-  //   |BBBBBBBB| --> |AAAA|BBBB| ----------> |AAAA|
-  //   |--------|     |---------|             |----|
-  //                    Decoded
-  //           (includes carryover from A)
-  //
-  encoded_buffer->set_timestamp(encoded_buffer->timestamp() + kDuration);
-  encoded_buffer->set_discard_padding(
-      std::make_pair(kDuration / 2, kDuration / 4));
-  decoded_buffer = CreateDecodedBuffer(kTestFrames);
-  ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
-  ASSERT_NEAR(kDecoderDelay * kDataStep,
-              ExtractDecodedData(decoded_buffer, kDecoderDelay),
-              kDataStep / 1000);
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count());
-
-  // Verify it was actually the latter half of the buffer that was removed.
-  ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
-
-  // Verify the end discard padding is carried over to the next buffer.  Use
-  // kDuration / 2 for the end discard padding so that the next buffer has its
-  // start entirely discarded.
-  //
-  //    Encoded                      Discard End Padding (from B)
-  //   |--------|     |---------|             |-------|
-  //   |CCCCCCCC| --> |BBBB|CCCC| ----------> |BB|CCCC|
-  //   |--------|     |---------|             |-------|
-  //                    Decoded
-  //           (includes carryover from B)
-  //
-  encoded_buffer->set_timestamp(encoded_buffer->timestamp() + kDuration);
-  encoded_buffer->set_discard_padding(
-      std::make_pair(base::TimeDelta(), kDuration / 2));
-  decoded_buffer = CreateDecodedBuffer(kTestFrames);
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  EXPECT_EQ(kTimestamp + kDuration / 2, decoded_buffer->timestamp());
-  EXPECT_EQ(3 * kDuration / 4, decoded_buffer->duration());
-  EXPECT_EQ(3 * kTestFrames / 4, decoded_buffer->frame_count());
-
-  // Verify it was actually the second quarter of the buffer that was removed.
-  const int kDiscardFrames = kTestFrames / 4;
-  ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
-  ASSERT_FLOAT_EQ(
-      kDiscardFrames * 2 * kDataStep,
-      ExtractDecodedData(decoded_buffer, kDecoderDelay - kDiscardFrames));
-
-  // One last test to ensure carryover discard from the start works.
-  //
-  //    Encoded                      Discard End Padding (from C)
-  //   |--------|     |---------|             |----|
-  //   |DDDDDDDD| --> |CCCC|DDDD| ----------> |DDDD|
-  //   |--------|     |---------|             |----|
-  //                    Decoded
-  //           (includes carryover from C)
-  //
-  encoded_buffer->set_timestamp(encoded_buffer->timestamp() + kDuration);
-  encoded_buffer->set_discard_padding(DecoderBuffer::DiscardPadding());
-  decoded_buffer = CreateDecodedBuffer(kTestFrames);
-  ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  EXPECT_EQ(kTimestamp + kDuration / 2 + 3 * kDuration / 4,
-            decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count());
-  ASSERT_FLOAT_EQ(kTestFrames / 2 * kDataStep,
-                  ExtractDecodedData(decoded_buffer, 0));
-}
-
-TEST(AudioDiscardHelperTest, DelayedDiscardInitialDiscardAndDiscardPadding) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-
-  // Set all the discard values to be different to ensure each is properly used.
-  const int kDiscardFrames = kTestFrames / 4;
-  encoded_buffer->set_discard_padding(
-      std::make_pair(kDuration / 8, kDuration / 16));
-  discard_helper.Reset(kDiscardFrames);
-
-  // Verify nothing is output for the first buffer, yet initialized is true.
-  ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, NULL));
-  ASSERT_TRUE(discard_helper.initialized());
-
-  // Create an encoded buffer with no discard padding.
-  encoded_buffer = CreateEncodedBuffer(kTimestamp + kDuration, kDuration);
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Verify that when the decoded buffer is consumed, the discards from the
-  // previous encoded buffer are applied.
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration - kDuration / 4 - kDuration / 8 - kDuration / 16,
-            decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames - kTestFrames / 4 - kTestFrames / 8 - kTestFrames / 16,
-            decoded_buffer->frame_count());
-}
-
-TEST(AudioDiscardHelperTest, CompleteDiscard) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-  discard_helper.Reset(0);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  encoded_buffer->set_discard_padding(
-      std::make_pair(kInfiniteDuration, base::TimeDelta()));
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Verify all of the first buffer is discarded.
-  ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-  encoded_buffer->set_timestamp(kTimestamp + kDuration);
-  encoded_buffer->set_discard_padding(DecoderBuffer::DiscardPadding());
-
-  // Verify a second buffer goes through untouched.
-  decoded_buffer = CreateDecodedBuffer(kTestFrames / 2);
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count());
-  ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
-}
-
-TEST(AudioDiscardHelperTest, CompleteDiscardWithDelayedDiscard) {
-  AudioDiscardHelper discard_helper(kSampleRate, 0);
-  ASSERT_FALSE(discard_helper.initialized());
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-  discard_helper.Reset(0);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  encoded_buffer->set_discard_padding(
-      std::make_pair(kInfiniteDuration, base::TimeDelta()));
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Setup a delayed discard.
-  ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, NULL));
-  ASSERT_TRUE(discard_helper.initialized());
-
-  // Verify the first output buffer is dropped.
-  encoded_buffer->set_timestamp(kTimestamp + kDuration);
-  encoded_buffer->set_discard_padding(DecoderBuffer::DiscardPadding());
-  ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-
-  // Verify the second buffer goes through untouched.
-  encoded_buffer->set_timestamp(kTimestamp + 2 * kDuration);
-  decoded_buffer = CreateDecodedBuffer(kTestFrames / 2);
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration / 2, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames / 2, decoded_buffer->frame_count());
-  ASSERT_FLOAT_EQ(0.0f, ExtractDecodedData(decoded_buffer, 0));
-}
-
-TEST(AudioDiscardHelperTest, CompleteDiscardWithInitialDiscardDecoderDelay) {
-  // Use a decoder delay of 5ms.
-  const int kDecoderDelay = kSampleRate / 100 / 2;
-  AudioDiscardHelper discard_helper(kSampleRate, kDecoderDelay);
-  ASSERT_FALSE(discard_helper.initialized());
-  discard_helper.Reset(kDecoderDelay);
-
-  const base::TimeDelta kTimestamp = base::TimeDelta();
-  const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10);
-  const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration);
-
-  scoped_refptr<DecoderBuffer> encoded_buffer =
-      CreateEncodedBuffer(kTimestamp, kDuration);
-  encoded_buffer->set_discard_padding(
-      std::make_pair(kInfiniteDuration, base::TimeDelta()));
-  scoped_refptr<AudioBuffer> decoded_buffer = CreateDecodedBuffer(kTestFrames);
-
-  // Verify all of the first buffer is discarded.
-  ASSERT_FALSE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  ASSERT_TRUE(discard_helper.initialized());
-  encoded_buffer->set_timestamp(kTimestamp + kDuration);
-  encoded_buffer->set_discard_padding(DecoderBuffer::DiscardPadding());
-
-  // Verify 5ms off the front of the second buffer is discarded.
-  decoded_buffer = CreateDecodedBuffer(kTestFrames * 2);
-  ASSERT_TRUE(discard_helper.ProcessBuffers(encoded_buffer, decoded_buffer));
-  EXPECT_EQ(kTimestamp, decoded_buffer->timestamp());
-  EXPECT_EQ(kDuration * 2 - kDuration / 2, decoded_buffer->duration());
-  EXPECT_EQ(kTestFrames * 2 - kDecoderDelay, decoded_buffer->frame_count());
-  ASSERT_FLOAT_EQ(kDecoderDelay * kDataStep,
-                  ExtractDecodedData(decoded_buffer, 0));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_parameters.cc b/cobalt/media/base/audio_parameters.cc
deleted file mode 100644
index f80828d..0000000
--- a/cobalt/media/base/audio_parameters.cc
+++ /dev/null
@@ -1,106 +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 "cobalt/media/base/audio_parameters.h"
-
-#include "base/logging.h"
-#include "cobalt/media/base/limits.h"
-
-namespace cobalt {
-namespace media {
-
-AudioParameters::AudioParameters()
-    : AudioParameters(AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_NONE, 0, 0, 0) {}
-
-AudioParameters::AudioParameters(Format format, ChannelLayout channel_layout,
-                                 int sample_rate, int bits_per_sample,
-                                 int frames_per_buffer)
-    : latency_tag_(AudioLatency::LATENCY_COUNT) {
-  Reset(format, channel_layout, sample_rate, bits_per_sample,
-        frames_per_buffer);
-}
-
-AudioParameters::~AudioParameters() {}
-
-AudioParameters::AudioParameters(const AudioParameters&) = default;
-AudioParameters& AudioParameters::operator=(const AudioParameters&) = default;
-
-void AudioParameters::Reset(Format format, ChannelLayout channel_layout,
-                            int sample_rate, int bits_per_sample,
-                            int frames_per_buffer) {
-  format_ = format;
-  channel_layout_ = channel_layout;
-  channels_ = ChannelLayoutToChannelCount(channel_layout);
-  sample_rate_ = sample_rate;
-  bits_per_sample_ = bits_per_sample;
-  frames_per_buffer_ = frames_per_buffer;
-  effects_ = NO_EFFECTS;
-  mic_positions_.clear();
-}
-
-bool AudioParameters::IsValid() const {
-  return (channels_ > 0) && (channels_ <= media::limits::kMaxChannels) &&
-         (channel_layout_ > CHANNEL_LAYOUT_UNSUPPORTED) &&
-         (sample_rate_ >= media::limits::kMinSampleRate) &&
-         (sample_rate_ <= media::limits::kMaxSampleRate) &&
-         (bits_per_sample_ > 0) &&
-         (bits_per_sample_ <= media::limits::kMaxBitsPerSample) &&
-         (frames_per_buffer_ > 0) &&
-         (frames_per_buffer_ <= media::limits::kMaxSamplesPerPacket) &&
-         (channel_layout_ == CHANNEL_LAYOUT_DISCRETE ||
-          channels_ == ChannelLayoutToChannelCount(channel_layout_));
-}
-
-std::string AudioParameters::AsHumanReadableString() const {
-  std::ostringstream s;
-  s << "format: " << format() << " channel_layout: " << channel_layout()
-    << " channels: " << channels() << " sample_rate: " << sample_rate()
-    << " bits_per_sample: " << bits_per_sample()
-    << " frames_per_buffer: " << frames_per_buffer()
-    << " effects: " << effects()
-    << " mic_positions: " << PointsToString(mic_positions_);
-  return s.str();
-}
-
-int AudioParameters::GetBytesPerBuffer() const {
-  return frames_per_buffer_ * GetBytesPerFrame();
-}
-
-int AudioParameters::GetBytesPerSecond() const {
-  return sample_rate_ * GetBytesPerFrame();
-}
-
-int AudioParameters::GetBytesPerFrame() const {
-  return channels_ * bits_per_sample_ / 8;
-}
-
-double AudioParameters::GetMicrosecondsPerFrame() const {
-  return static_cast<double>(base::Time::kMicrosecondsPerSecond) / sample_rate_;
-}
-
-base::TimeDelta AudioParameters::GetBufferDuration() const {
-  return base::TimeDelta::FromMicroseconds(static_cast<int64_t>(
-      frames_per_buffer_ * base::Time::kMicrosecondsPerSecond /
-      static_cast<float>(sample_rate_)));
-}
-
-bool AudioParameters::Equals(const AudioParameters& other) const {
-  return format_ == other.format() && sample_rate_ == other.sample_rate() &&
-         channel_layout_ == other.channel_layout() &&
-         channels_ == other.channels() &&
-         bits_per_sample_ == other.bits_per_sample() &&
-         frames_per_buffer_ == other.frames_per_buffer() &&
-         effects_ == other.effects() && mic_positions_ == other.mic_positions_;
-}
-
-// static
-AudioParameters AudioParameters::UnavailableDeviceParams() {
-  return media::AudioParameters(
-      media::AudioParameters::AUDIO_FAKE, media::CHANNEL_LAYOUT_STEREO,
-      media::AudioParameters::kAudioCDSampleRate, 16,
-      media::AudioParameters::kAudioCDSampleRate / 10);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_parameters.h b/cobalt/media/base/audio_parameters.h
deleted file mode 100644
index 2e20da8..0000000
--- a/cobalt/media/base/audio_parameters.h
+++ /dev/null
@@ -1,227 +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 COBALT_MEDIA_BASE_AUDIO_PARAMETERS_H_
-#define COBALT_MEDIA_BASE_AUDIO_PARAMETERS_H_
-
-#include <string>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/audio_bus.h"
-#include "cobalt/media/base/audio_latency.h"
-#include "cobalt/media/base/audio_point.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Use a struct-in-struct approach to ensure that we can calculate the required
-// size as sizeof(Audio{Input,Output}BufferParameters) + #(bytes in audio
-// buffer) without using packing. Also align Audio{Input,Output}BufferParameters
-// instead of in Audio{Input,Output}Buffer to be able to calculate size like so.
-// Use a macro for the alignment value that's the same as
-// AudioBus::kChannelAlignment, since MSVC doesn't accept the latter to be used.
-#if defined(OS_WIN)
-#pragma warning(push)
-#pragma warning(disable : 4324)  // Disable warning for added padding.
-#endif
-#define PARAMETERS_ALIGNMENT 16
-static_assert(AudioBus::kChannelAlignment == PARAMETERS_ALIGNMENT,
-              "Audio buffer parameters struct alignment not same as AudioBus");
-struct MEDIA_EXPORT ALIGNAS(PARAMETERS_ALIGNMENT) AudioInputBufferParameters {
-  double volume;
-  uint32_t size;
-  uint32_t hardware_delay_bytes;
-  uint32_t id;
-  bool key_pressed;
-};
-struct MEDIA_EXPORT ALIGNAS(PARAMETERS_ALIGNMENT) AudioOutputBufferParameters {
-  uint32_t frames_skipped;
-};
-#undef PARAMETERS_ALIGNMENT
-#if defined(OS_WIN)
-#pragma warning(pop)
-#endif
-
-static_assert(sizeof(AudioInputBufferParameters) %
-                      AudioBus::kChannelAlignment ==
-                  0,
-              "AudioInputBufferParameters not aligned");
-static_assert(sizeof(AudioOutputBufferParameters) %
-                      AudioBus::kChannelAlignment ==
-                  0,
-              "AudioOutputBufferParameters not aligned");
-
-struct MEDIA_EXPORT AudioInputBuffer {
-  AudioInputBufferParameters params;
-  int8_t audio[1];
-};
-struct MEDIA_EXPORT AudioOutputBuffer {
-  AudioOutputBufferParameters params;
-  int8_t audio[1];
-};
-
-class MEDIA_EXPORT AudioParameters {
- public:
-  // TODO(miu): Rename this enum to something that correctly reflects its
-  // semantics, such as "TransportScheme."
-  enum Format {
-    AUDIO_PCM_LINEAR = 0,            // PCM is 'raw' amplitude samples.
-    AUDIO_PCM_LOW_LATENCY,           // Linear PCM, low latency requested.
-    AUDIO_FAKE,                      // Creates a fake AudioOutputStream object.
-    AUDIO_FORMAT_LAST = AUDIO_FAKE,  // Only used for validation of format.
-  };
-
-  enum {
-    // Telephone quality sample rate, mostly for speech-only audio.
-    kTelephoneSampleRate = 8000,
-    // CD sampling rate is 44.1 KHz or conveniently 2x2x3x3x5x5x7x7.
-    kAudioCDSampleRate = 44100,
-  };
-
-  // Bitmasks to determine whether certain platform (typically hardware) audio
-  // effects should be enabled.
-  enum PlatformEffectsMask {
-    NO_EFFECTS = 0x0,
-    ECHO_CANCELLER = 0x1,
-    DUCKING = 0x2,  // Enables ducking if the OS supports it.
-    KEYBOARD_MIC = 0x4,
-    HOTWORD = 0x8,
-  };
-
-  AudioParameters();
-  AudioParameters(Format format, ChannelLayout channel_layout, int sample_rate,
-                  int bits_per_sample, int frames_per_buffer);
-
-  ~AudioParameters();
-
-  // Re-initializes all members.
-  void Reset(Format format, ChannelLayout channel_layout, int sample_rate,
-             int bits_per_sample, int frames_per_buffer);
-
-  // Checks that all values are in the expected range. All limits are specified
-  // in media::Limits.
-  bool IsValid() const;
-
-  // Returns a human-readable string describing |*this|.  For debugging & test
-  // output only.
-  std::string AsHumanReadableString() const;
-
-  // Returns size of audio buffer in bytes.
-  int GetBytesPerBuffer() const;
-
-  // Returns the number of bytes representing one second of audio.
-  int GetBytesPerSecond() const;
-
-  // Returns the number of bytes representing a frame of audio.
-  int GetBytesPerFrame() const;
-
-  // Returns the number of microseconds per frame of audio. Intentionally
-  // reported as a double to surface of partial microseconds per frame, which
-  // is common for many sample rates. Failing to account for these nanoseconds
-  // can lead to audio/video sync drift.
-  double GetMicrosecondsPerFrame() const;
-
-  // Returns the duration of this buffer as calculated from frames_per_buffer()
-  // and sample_rate().
-  base::TimeDelta GetBufferDuration() const;
-
-  // Comparison with other AudioParams.
-  bool Equals(const AudioParameters& other) const;
-
-  void set_format(Format format) { format_ = format; }
-  Format format() const { return format_; }
-
-  // A setter for channel_layout_ is intentionally excluded.
-  ChannelLayout channel_layout() const { return channel_layout_; }
-
-  // The number of channels is usually computed from channel_layout_. Setting
-  // this explicitly is only required with CHANNEL_LAYOUT_DISCRETE.
-  void set_channels_for_discrete(int channels) {
-    DCHECK(channel_layout_ == CHANNEL_LAYOUT_DISCRETE ||
-           channels == ChannelLayoutToChannelCount(channel_layout_));
-    channels_ = channels;
-  }
-  int channels() const { return channels_; }
-
-  void set_sample_rate(int sample_rate) { sample_rate_ = sample_rate; }
-  int sample_rate() const { return sample_rate_; }
-
-  void set_bits_per_sample(int bits_per_sample) {
-    bits_per_sample_ = bits_per_sample;
-  }
-  int bits_per_sample() const { return bits_per_sample_; }
-
-  void set_frames_per_buffer(int frames_per_buffer) {
-    frames_per_buffer_ = frames_per_buffer;
-  }
-  int frames_per_buffer() const { return frames_per_buffer_; }
-
-  void set_effects(int effects) { effects_ = effects; }
-  int effects() const { return effects_; }
-
-  void set_mic_positions(const std::vector<Point>& mic_positions) {
-    mic_positions_ = mic_positions;
-  }
-  const std::vector<Point>& mic_positions() const { return mic_positions_; }
-
-  void set_latency_tag(AudioLatency::LatencyType latency_tag) {
-    latency_tag_ = latency_tag;
-  }
-  AudioLatency::LatencyType latency_tag() const { return latency_tag_; }
-
-  AudioParameters(const AudioParameters&);
-  AudioParameters& operator=(const AudioParameters&);
-
-  // Creates reasonable dummy parameters in case no device is available.
-  static AudioParameters UnavailableDeviceParams();
-
- private:
-  Format format_;                 // Format of the stream.
-  ChannelLayout channel_layout_;  // Order of surround sound channels.
-  int channels_;                  // Number of channels. Value set based on
-                                  // |channel_layout|.
-  int sample_rate_;               // Sampling frequency/rate.
-  int bits_per_sample_;           // Number of bits per sample.
-  int frames_per_buffer_;         // Number of frames in a buffer.
-  int effects_;                   // Bitmask using PlatformEffectsMask.
-
-  // Microphone positions using Cartesian coordinates:
-  // x: the horizontal dimension, with positive to the right from the camera's
-  //    perspective.
-  // y: the depth dimension, with positive forward from the camera's
-  //    perspective.
-  // z: the vertical dimension, with positive upwards.
-  //
-  // Usually, the center of the microphone array will be treated as the origin
-  // (often the position of the camera).
-  //
-  // An empty vector indicates unknown positions.
-  std::vector<Point> mic_positions_;
-
-  // Optional tag to pass latency info from renderer to browser. Set to
-  // AudioLatency::LATENCY_COUNT by default, which means "not specified".
-  AudioLatency::LatencyType latency_tag_;
-};
-
-// Comparison is useful when AudioParameters is used with std structures.
-inline bool operator<(const AudioParameters& a, const AudioParameters& b) {
-  if (a.format() != b.format()) return a.format() < b.format();
-  if (a.channels() != b.channels()) return a.channels() < b.channels();
-  if (a.sample_rate() != b.sample_rate())
-    return a.sample_rate() < b.sample_rate();
-  if (a.bits_per_sample() != b.bits_per_sample())
-    return a.bits_per_sample() < b.bits_per_sample();
-  return a.frames_per_buffer() < b.frames_per_buffer();
-}
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_AUDIO_PARAMETERS_H_
diff --git a/cobalt/media/base/audio_parameters_unittest.cc b/cobalt/media/base/audio_parameters_unittest.cc
deleted file mode 100644
index fd0bc37..0000000
--- a/cobalt/media/base/audio_parameters_unittest.cc
+++ /dev/null
@@ -1,227 +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 "cobalt/media/base/audio_parameters.h"
-#include "base/basictypes.h"
-#include "base/strings/string_number_conversions.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(AudioParameters, Constructor_Default) {
-  AudioParameters::Format expected_format = AudioParameters::AUDIO_PCM_LINEAR;
-  int expected_bits = 0;
-  int expected_channels = 0;
-  ChannelLayout expected_channel_layout = CHANNEL_LAYOUT_NONE;
-  int expected_rate = 0;
-  int expected_samples = 0;
-  AudioParameters::PlatformEffectsMask expected_effects =
-      AudioParameters::NO_EFFECTS;
-  std::vector<Point> expected_mic_positions;
-
-  AudioParameters params;
-
-  EXPECT_EQ(expected_format, params.format());
-  EXPECT_EQ(expected_bits, params.bits_per_sample());
-  EXPECT_EQ(expected_channels, params.channels());
-  EXPECT_EQ(expected_channel_layout, params.channel_layout());
-  EXPECT_EQ(expected_rate, params.sample_rate());
-  EXPECT_EQ(expected_samples, params.frames_per_buffer());
-  EXPECT_EQ(expected_effects, params.effects());
-  EXPECT_EQ(expected_mic_positions, params.mic_positions());
-}
-
-TEST(AudioParameters, Constructor_ParameterValues) {
-  AudioParameters::Format expected_format =
-      AudioParameters::AUDIO_PCM_LOW_LATENCY;
-  int expected_bits = 16;
-  int expected_channels = 6;
-  ChannelLayout expected_channel_layout = CHANNEL_LAYOUT_5_1;
-  int expected_rate = 44100;
-  int expected_samples = 880;
-
-  AudioParameters params(expected_format, expected_channel_layout,
-                         expected_rate, expected_bits, expected_samples);
-
-  EXPECT_EQ(expected_format, params.format());
-  EXPECT_EQ(expected_bits, params.bits_per_sample());
-  EXPECT_EQ(expected_channels, params.channels());
-  EXPECT_EQ(expected_channel_layout, params.channel_layout());
-  EXPECT_EQ(expected_rate, params.sample_rate());
-  EXPECT_EQ(expected_samples, params.frames_per_buffer());
-}
-
-TEST(AudioParameters, GetBytesPerBuffer) {
-  EXPECT_EQ(100, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                                 CHANNEL_LAYOUT_MONO, 1000, 8, 100)
-                     .GetBytesPerBuffer());
-  EXPECT_EQ(200, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                                 CHANNEL_LAYOUT_MONO, 1000, 16, 100)
-                     .GetBytesPerBuffer());
-  EXPECT_EQ(200, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                                 CHANNEL_LAYOUT_STEREO, 1000, 8, 100)
-                     .GetBytesPerBuffer());
-  EXPECT_EQ(200, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                                 CHANNEL_LAYOUT_MONO, 1000, 8, 200)
-                     .GetBytesPerBuffer());
-  EXPECT_EQ(800, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                                 CHANNEL_LAYOUT_STEREO, 1000, 16, 200)
-                     .GetBytesPerBuffer());
-  EXPECT_EQ(
-      300, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                           CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 1000, 8, 100)
-               .GetBytesPerBuffer());
-}
-
-TEST(AudioParameters, GetBytesPerSecond) {
-  EXPECT_EQ(0, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                               CHANNEL_LAYOUT_NONE, 0, 0, 0)
-                   .GetBytesPerSecond());
-  EXPECT_EQ(0, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                               CHANNEL_LAYOUT_STEREO, 0, 0, 0)
-                   .GetBytesPerSecond());
-  EXPECT_EQ(0, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                               CHANNEL_LAYOUT_NONE, 100, 0, 0)
-                   .GetBytesPerSecond());
-  EXPECT_EQ(0, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                               CHANNEL_LAYOUT_NONE, 0, 8, 0)
-                   .GetBytesPerSecond());
-  EXPECT_EQ(200, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                                 CHANNEL_LAYOUT_STEREO, 100, 8, 0)
-                     .GetBytesPerSecond());
-}
-
-TEST(AudioParameters, Compare) {
-  AudioParameters values[] = {
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
-                      1000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
-                      1000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
-                      1000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
-                      1000, 16, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
-                      2000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
-                      2000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
-                      2000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
-                      2000, 16, 200),
-
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
-                      1000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
-                      1000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
-                      1000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
-                      1000, 16, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
-                      2000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
-                      2000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
-                      2000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
-                      2000, 16, 200),
-
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 1000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 1000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 1000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 1000, 16, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 2000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 2000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 2000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 2000, 16, 200),
-
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_MONO, 1000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_MONO, 1000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_MONO, 1000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_MONO, 1000, 16, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_MONO, 2000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_MONO, 2000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_MONO, 2000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_MONO, 2000, 16, 200),
-
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO, 1000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO, 1000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO, 1000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO, 1000, 16, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO, 2000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO, 2000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO, 2000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO, 2000, 16, 200),
-
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 1000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 1000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 1000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 1000, 16, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 2000, 8, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 2000, 8, 200),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 2000, 16, 100),
-      AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                      CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, 2000, 16, 200),
-  };
-
-  for (size_t i = 0; i < arraysize(values); ++i) {
-    for (size_t j = 0; j < arraysize(values); ++j) {
-      SCOPED_TRACE("i=" + base::SizeTToString(i) +
-                   " j=" + base::SizeTToString(j));
-      EXPECT_EQ(i < j, values[i] < values[j]);
-    }
-
-    // Verify that a value is never less than itself.
-    EXPECT_FALSE(values[i] < values[i]);
-  }
-}
-
-TEST(AudioParameters, Constructor_ValidChannelCounts) {
-  int expected_channels = 8;
-  ChannelLayout expected_layout = CHANNEL_LAYOUT_DISCRETE;
-
-  AudioParameters params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                         expected_layout, 44100, 16, 880);
-  params.set_channels_for_discrete(expected_channels);
-  EXPECT_EQ(expected_channels, params.channels());
-  EXPECT_EQ(expected_layout, params.channel_layout());
-  EXPECT_TRUE(params.IsValid());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_sample_types.h b/cobalt/media/base/audio_sample_types.h
deleted file mode 100644
index 9c60fbd..0000000
--- a/cobalt/media/base/audio_sample_types.h
+++ /dev/null
@@ -1,211 +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 COBALT_MEDIA_BASE_AUDIO_SAMPLE_TYPES_H_
-#define COBALT_MEDIA_BASE_AUDIO_SAMPLE_TYPES_H_
-
-#include <cstdint>
-#include <limits>
-#include <type_traits>
-
-// To specify different sample formats, we provide a class for each sample
-// format that knows certain things about it, such as the C++ data type used
-// to store sample values, min and max values, as well as how to convert to
-// and from floating point formats. Each class must satisfy a concept we call
-// "SampleTypeTraits", which requires that the following publics are provided:
-//   * A type |ValueType| specifying the C++ type for storing sample values
-//   * A static constant kMinValue which specifies the minimum sample value
-//   * A static constant kMaxValue which specifies the maximum sample value
-//   * A static constant kZeroPointValue which specifies the sample value
-//     representing an amplitude of zero
-//   * A static method ConvertFromFloat() that takes a float sample value and
-//     converts it to the corresponding ValueType
-//   * A static method ConvertFromDouble() that takes a double sample value and
-//     converts it to the corresponding ValueType
-//   * A static method ConvertToFloat() that takes a ValueType sample value and
-//     converts it to the corresponding float value
-//   * A static method ConvertToDouble() that takes a ValueType sample value and
-//     converts it to the corresponding double value
-
-namespace cobalt {
-namespace media {
-
-// For float or double.
-// See also the aliases for commonly used types at the bottom of this file.
-template <typename SampleType>
-class FloatSampleTypeTraits {
-  static_assert(std::is_floating_point<SampleType>::value,
-                "Template is only valid for float types.");
-
- public:
-  using ValueType = SampleType;
-
-  static constexpr SampleType kMinValue = -1.0f;
-  static constexpr SampleType kMaxValue = +1.0f;
-  static constexpr SampleType kZeroPointValue = 0.0f;
-
-  static SampleType FromFloat(float source_value) {
-    return From<float>(source_value);
-  }
-  static float ToFloat(SampleType source_value) {
-    return To<float>(source_value);
-  }
-  static SampleType FromDouble(double source_value) {
-    return From<double>(source_value);
-  }
-  static double ToDouble(SampleType source_value) {
-    return To<double>(source_value);
-  }
-
- private:
-  template <typename FloatType>
-  static SampleType From(FloatType source_value) {
-    return static_cast<SampleType>(source_value);
-  }
-
-  template <typename FloatType>
-  static FloatType To(SampleType source_value) {
-    return static_cast<FloatType>(source_value);
-  }
-};
-
-// For uint8_t, int16_t, int32_t...
-// See also the aliases for commonly used types at the bottom of this file.
-template <typename SampleType>
-class FixedSampleTypeTraits {
-  static_assert(std::numeric_limits<SampleType>::is_integer,
-                "Template is only valid for integer types.");
-
- public:
-  using ValueType = SampleType;
-
-  static constexpr SampleType kMinValue =
-      std::numeric_limits<SampleType>::min();
-  static constexpr SampleType kMaxValue =
-      std::numeric_limits<SampleType>::max();
-  static constexpr SampleType kZeroPointValue =
-      (kMinValue == 0) ? (kMaxValue / 2 + 1) : 0;
-
-  static SampleType FromFloat(float source_value) {
-    return From<float>(source_value);
-  }
-  static float ToFloat(SampleType source_value) {
-    return To<float>(source_value);
-  }
-  static SampleType FromDouble(double source_value) {
-    return From<double>(source_value);
-  }
-  static double ToDouble(SampleType source_value) {
-    return To<double>(source_value);
-  }
-
- private:
-  // We pre-compute the scaling factors for conversion at compile-time in order
-  // to save computation time during runtime.
-  template <typename FloatType>
-  struct ScalingFactors {
-    // Since zero_point_value() is not the exact center between
-    // min_value() and max_value(), we apply a different scaling for positive
-    // and negative values.
-    // Note that due to the limited precision, the FloatType values may not
-    // always be able to represent the max and min values of the integer
-    // SampleType exactly. This is a concern when using these scale factors for
-    // scaling input sample values for conversion. However, since the min value
-    // of SampleType is usually of the form -2^N and the max value is usually of
-    // the form (+2^N)-1, and due to the fact that the float types store a
-    // significand value plus a binary exponent it just so happens that
-    // FloatType can usually represent the min value exactly and its
-    // representation of the max value is only off by 1, i.e. it quantizes to
-    // (+2^N) instead of (+2^N-1).
-
-    static constexpr FloatType kForPositiveInput =
-        static_cast<FloatType>(kMaxValue) -
-        static_cast<FloatType>(kZeroPointValue);
-
-    // Note: In the below expression, it is important that we cast kMinValue to
-    // FloatType _before_ taking the negative of it. For example, for SampleType
-    // int32_t, the expression (- kMinValue) would evaluate to
-    // -numeric_limits<int32_t>::min(), which falls outside the numeric
-    // range, wraps around, and ends up being the same as
-    // +numeric_limits<int32_t>::min().
-    static constexpr FloatType kForNegativeInput =
-        static_cast<FloatType>(kZeroPointValue) -
-        static_cast<FloatType>(kMinValue);
-
-    static constexpr FloatType kInverseForPositiveInput =
-        1.0f / kForPositiveInput;
-
-    static constexpr FloatType kInverseForNegativeInput =
-        1.0f / kForNegativeInput;
-  };
-
-  template <typename FloatType>
-  static SampleType From(FloatType source_value) {
-    // Note, that the for the case of |source_value| == 1.0, the imprecision of
-    // |kScalingFactorForPositive| can lead to a product that is larger than the
-    // maximum possible value of SampleType. To ensure this does not happen, we
-    // handle the case of |source_value| == 1.0 as part of the clipping check.
-    // For all FloatType values smaller than 1.0, the imprecision of
-    // |kScalingFactorForPositive| is small enough to not push the scaled
-    // |source_value| outside the numeric range of SampleType.
-
-    // The nested if/else structure appears to compile to a
-    // better-performing release binary compared to handling the clipping for
-    // both positive and negative values first.
-    //
-    // Inlining the computation formula for multiplication with the scaling
-    // factor and addition of |kZeroPointValue| results in better performance
-    // for the int16_t case on Arm when compared to storing the scaling factor
-    // in a temporary variable and applying it outside of the if-else block.
-    //
-    // It is important to have the cast to SampleType take place _after_
-    // adding |kZeroPointValue|, because the scaled source value may be negative
-    // and SampleType may be an unsigned integer type. The result of casting a
-    // negative float to an unsigned integer is undefined.
-    if (source_value < 0) {
-      // Apply clipping (aka. clamping).
-      if (source_value <= FloatSampleTypeTraits<float>::kMinValue)
-        return kMinValue;
-
-      return static_cast<SampleType>(
-          (source_value * ScalingFactors<FloatType>::kForNegativeInput) +
-          static_cast<FloatType>(kZeroPointValue));
-    } else {
-      // Apply clipping (aka. clamping).
-      // As mentioned above, here we must include the case |source_value| == 1.
-      if (source_value >= FloatSampleTypeTraits<float>::kMaxValue)
-        return kMaxValue;
-      return static_cast<SampleType>(
-          (source_value * ScalingFactors<FloatType>::kForPositiveInput) +
-          static_cast<FloatType>(kZeroPointValue));
-    }
-  }
-
-  template <typename FloatType>
-  static FloatType To(SampleType source_value) {
-    FloatType offset_value =
-        static_cast<FloatType>(source_value - kZeroPointValue);
-
-    // We multiply with the inverse scaling factor instead of dividing by the
-    // scaling factor, because multiplication performs faster than division
-    // on many platforms.
-    return (offset_value < 0.0f)
-               ? (offset_value *
-                  ScalingFactors<FloatType>::kInverseForNegativeInput)
-               : (offset_value *
-                  ScalingFactors<FloatType>::kInverseForPositiveInput);
-  }
-};
-
-// Aliases for commonly used sample formats.
-using Float32SampleTypeTraits = FloatSampleTypeTraits<float>;
-using Float64SampleTypeTraits = FloatSampleTypeTraits<double>;
-using UnsignedInt8SampleTypeTraits = FixedSampleTypeTraits<uint8_t>;
-using SignedInt16SampleTypeTraits = FixedSampleTypeTraits<int16_t>;
-using SignedInt32SampleTypeTraits = FixedSampleTypeTraits<int32_t>;
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_AUDIO_SAMPLE_TYPES_H_
diff --git a/cobalt/media/base/audio_sample_types_unittest.cc b/cobalt/media/base/audio_sample_types_unittest.cc
deleted file mode 100644
index c8bb0f7..0000000
--- a/cobalt/media/base/audio_sample_types_unittest.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright (c) 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 "cobalt/media/base/audio_sample_types.h"
-#include "base/basictypes.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-template <typename TestConfig>
-class SampleTypeTraitsTest : public testing::Test {};
-
-TYPED_TEST_CASE_P(SampleTypeTraitsTest);
-
-struct UnsignedInt8ToFloat32TestConfig {
-  using SourceTraits = UnsignedInt8SampleTypeTraits;
-  using TargetTraits = Float32SampleTypeTraits;
-  static const char* config_name() { return "UnsignedInt8ToFloat32TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return SourceTraits::ToFloat(source_value);
-  }
-};
-
-struct SignedInt16ToFloat32TestConfig {
-  using SourceTraits = SignedInt16SampleTypeTraits;
-  using TargetTraits = Float32SampleTypeTraits;
-  static const char* config_name() { return "SignedInt16ToFloat32TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return SourceTraits::ToFloat(source_value);
-  }
-};
-
-struct SignedInt32ToFloat32TestConfig {
-  using SourceTraits = SignedInt32SampleTypeTraits;
-  using TargetTraits = Float32SampleTypeTraits;
-  static const char* config_name() { return "SignedInt32ToFloat32TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return SourceTraits::ToFloat(source_value);
-  }
-};
-
-struct Float32ToUnsignedInt8TestConfig {
-  using SourceTraits = Float32SampleTypeTraits;
-  using TargetTraits = UnsignedInt8SampleTypeTraits;
-  static const char* config_name() { return "Float32ToUnsignedInt8TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return TargetTraits::FromFloat(source_value);
-  }
-};
-
-struct Float32ToSignedInt16TestConfig {
-  using SourceTraits = Float32SampleTypeTraits;
-  using TargetTraits = SignedInt16SampleTypeTraits;
-  static const char* config_name() { return "Float32ToSignedInt16TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return TargetTraits::FromFloat(source_value);
-  }
-};
-
-struct Float32ToSignedInt32TestConfig {
-  using SourceTraits = Float32SampleTypeTraits;
-  using TargetTraits = SignedInt32SampleTypeTraits;
-  static const char* config_name() { return "Float32ToSignedInt32TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return TargetTraits::FromFloat(source_value);
-  }
-};
-
-struct UnsignedInt8ToFloat64TestConfig {
-  using SourceTraits = UnsignedInt8SampleTypeTraits;
-  using TargetTraits = Float64SampleTypeTraits;
-  static const char* config_name() { return "UnsignedInt8ToFloat64TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return SourceTraits::ToDouble(source_value);
-  }
-};
-
-struct SignedInt16ToFloat64TestConfig {
-  using SourceTraits = SignedInt16SampleTypeTraits;
-  using TargetTraits = Float64SampleTypeTraits;
-  static const char* config_name() { return "SignedInt16ToFloat64TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return SourceTraits::ToDouble(source_value);
-  }
-};
-
-struct SignedInt32ToFloat64TestConfig {
-  using SourceTraits = SignedInt32SampleTypeTraits;
-  using TargetTraits = Float64SampleTypeTraits;
-  static const char* config_name() { return "SignedInt32ToFloat64TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return SourceTraits::ToDouble(source_value);
-  }
-};
-
-struct Float64ToUnsignedInt8TestConfig {
-  using SourceTraits = Float64SampleTypeTraits;
-  using TargetTraits = UnsignedInt8SampleTypeTraits;
-  static const char* config_name() { return "Float64ToUnsignedInt8TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return TargetTraits::FromDouble(source_value);
-  }
-};
-
-struct Float64ToSignedInt16TestConfig {
-  using SourceTraits = Float64SampleTypeTraits;
-  using TargetTraits = SignedInt16SampleTypeTraits;
-  static const char* config_name() { return "Float64ToSignedInt16TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return TargetTraits::FromDouble(source_value);
-  }
-};
-
-struct Float64ToSignedInt32TestConfig {
-  using SourceTraits = Float64SampleTypeTraits;
-  using TargetTraits = SignedInt32SampleTypeTraits;
-  static const char* config_name() { return "Float64ToSignedInt32TestConfig"; }
-  static TargetTraits::ValueType PerformConversion(
-      SourceTraits::ValueType source_value) {
-    return TargetTraits::FromDouble(source_value);
-  }
-};
-
-TYPED_TEST_P(SampleTypeTraitsTest, ConvertExampleValues) {
-  using Config = TypeParam;
-  using SourceTraits = typename Config::SourceTraits;
-  using TargetTraits = typename Config::TargetTraits;
-  using SourceType = typename SourceTraits::ValueType;
-  using TargetType = typename TargetTraits::ValueType;
-  SourceType source_max = SourceTraits::kMaxValue;
-  SourceType source_min = SourceTraits::kMinValue;
-  SourceType source_zero_point = SourceTraits::kZeroPointValue;
-  SourceType source_two = static_cast<SourceType>(2);
-  TargetType target_max = TargetTraits::kMaxValue;
-  TargetType target_min = TargetTraits::kMinValue;
-  TargetType target_zero_point = TargetTraits::kZeroPointValue;
-  TargetType target_two = static_cast<TargetType>(2);
-
-  SCOPED_TRACE(Config::config_name());
-
-  {
-    SCOPED_TRACE("Convert zero-point value");
-    ASSERT_EQ(target_zero_point,
-              Config::PerformConversion(SourceTraits::kZeroPointValue));
-  }
-  {
-    SCOPED_TRACE("Convert max value");
-    ASSERT_EQ(target_max, Config::PerformConversion(source_max));
-  }
-  {
-    SCOPED_TRACE("Convert min value");
-    ASSERT_EQ(target_min, Config::PerformConversion(source_min));
-  }
-
-  {
-    SCOPED_TRACE("Convert value half way between min and zero point");
-    // Note: This somewhat unconventional way of calculating the source and
-    // target value is necessary to avoid any intermediate result falling
-    // outside the corresponding numeric range.
-    auto source_value = source_min + ((source_zero_point / source_two) -
-                                      (source_min / source_two));
-    auto expected_target_value =
-        target_min +
-        ((target_zero_point / target_two) - (target_min / target_two));
-    ASSERT_EQ(expected_target_value, Config::PerformConversion(source_value));
-  }
-
-  {
-    SCOPED_TRACE("Convert value half way between zero point and max");
-
-    auto source_value =
-        source_zero_point + ((source_max - source_zero_point) / source_two);
-    auto expected_target_value =
-        target_zero_point + ((target_max - target_zero_point) / target_two);
-
-    if (std::numeric_limits<SourceType>::is_integer &&
-        std::is_floating_point<TargetType>::value) {
-      // The source value half-way between zero point and max falls in the
-      // middle between two integers, so we expect it to be off by 0.5.
-      TargetType kTolerance =
-          static_cast<TargetType>(0.5) * (source_max - source_zero_point);
-      ASSERT_NEAR(expected_target_value,
-                  Config::PerformConversion(source_value), kTolerance);
-    } else if (std::is_floating_point<SourceType>::value &&
-               std::numeric_limits<TargetType>::is_integer) {
-      // The quantization error of the scaling factor due to the limited
-      // precision of the floating point type can cause the result to be off
-      // by 1.
-      auto kTolerance = static_cast<TargetType>(1);
-      ASSERT_NEAR(expected_target_value,
-                  Config::PerformConversion(source_value), kTolerance);
-    } else {
-      ASSERT_EQ(expected_target_value, Config::PerformConversion(source_value));
-    }
-  }
-}
-
-REGISTER_TYPED_TEST_CASE_P(SampleTypeTraitsTest, ConvertExampleValues);
-
-typedef ::testing::Types<
-    UnsignedInt8ToFloat32TestConfig, SignedInt16ToFloat32TestConfig,
-    SignedInt32ToFloat32TestConfig, Float32ToUnsignedInt8TestConfig,
-    Float32ToSignedInt16TestConfig, Float32ToSignedInt32TestConfig,
-    UnsignedInt8ToFloat64TestConfig, SignedInt16ToFloat64TestConfig,
-    SignedInt32ToFloat64TestConfig, Float64ToUnsignedInt8TestConfig,
-    Float64ToSignedInt16TestConfig, Float64ToSignedInt32TestConfig>
-    TestConfigs;
-INSTANTIATE_TYPED_TEST_CASE_P(CommonTypes, SampleTypeTraitsTest, TestConfigs);
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_timestamp_helper.cc b/cobalt/media/base/audio_timestamp_helper.cc
deleted file mode 100644
index fa7b7ce..0000000
--- a/cobalt/media/base/audio_timestamp_helper.cc
+++ /dev/null
@@ -1,89 +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 "cobalt/media/base/audio_timestamp_helper.h"
-
-#include "base/logging.h"
-#include "cobalt/media/base/timestamp_constants.h"
-
-namespace cobalt {
-namespace media {
-
-// static
-base::TimeDelta AudioTimestampHelper::FramesToTime(int64_t frames,
-                                                   int samples_per_second) {
-  DCHECK_GE(samples_per_second, 0);
-  return base::TimeDelta::FromMicroseconds(
-      frames * base::Time::kMicrosecondsPerSecond / samples_per_second);
-}
-
-// static
-int64_t AudioTimestampHelper::TimeToFrames(base::TimeDelta time,
-                                           int samples_per_second) {
-  return time.InSecondsF() * samples_per_second;
-}
-
-AudioTimestampHelper::AudioTimestampHelper(int samples_per_second)
-    : base_timestamp_(kNoTimestamp), frame_count_(0) {
-  DCHECK_GT(samples_per_second, 0);
-  double fps = samples_per_second;
-  microseconds_per_frame_ = base::Time::kMicrosecondsPerSecond / fps;
-}
-
-void AudioTimestampHelper::SetBaseTimestamp(base::TimeDelta base_timestamp) {
-  base_timestamp_ = base_timestamp;
-  frame_count_ = 0;
-}
-
-base::TimeDelta AudioTimestampHelper::base_timestamp() const {
-  return base_timestamp_;
-}
-
-void AudioTimestampHelper::AddFrames(int frame_count) {
-  DCHECK_GE(frame_count, 0);
-  DCHECK(base_timestamp_ != kNoTimestamp);
-  frame_count_ += frame_count;
-}
-
-base::TimeDelta AudioTimestampHelper::GetTimestamp() const {
-  return ComputeTimestamp(frame_count_);
-}
-
-base::TimeDelta AudioTimestampHelper::GetFrameDuration(int frame_count) const {
-  DCHECK_GE(frame_count, 0);
-  base::TimeDelta end_timestamp = ComputeTimestamp(frame_count_ + frame_count);
-  return end_timestamp - GetTimestamp();
-}
-
-int64_t AudioTimestampHelper::GetFramesToTarget(base::TimeDelta target) const {
-  DCHECK(base_timestamp_ != kNoTimestamp);
-  DCHECK(target >= base_timestamp_);
-
-  int64_t delta_in_us = (target - GetTimestamp()).InMicroseconds();
-  if (delta_in_us == 0) return 0;
-
-  // Compute a timestamp relative to |base_timestamp_| since timestamps
-  // created from |frame_count_| are computed relative to this base.
-  // This ensures that the time to frame computation here is the proper inverse
-  // of the frame to time computation in ComputeTimestamp().
-  base::TimeDelta delta_from_base = target - base_timestamp_;
-
-  // Compute frame count for the time delta. This computation rounds to
-  // the nearest whole number of frames.
-  double threshold = microseconds_per_frame_ / 2;
-  int64_t target_frame_count =
-      (delta_from_base.InMicroseconds() + threshold) / microseconds_per_frame_;
-  return target_frame_count - frame_count_;
-}
-
-base::TimeDelta AudioTimestampHelper::ComputeTimestamp(
-    int64_t frame_count) const {
-  DCHECK_GE(frame_count, 0);
-  DCHECK(base_timestamp_ != kNoTimestamp);
-  double frames_us = microseconds_per_frame_ * frame_count;
-  return base_timestamp_ + base::TimeDelta::FromMicroseconds(frames_us);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_timestamp_helper.h b/cobalt/media/base/audio_timestamp_helper.h
deleted file mode 100644
index 77be042..0000000
--- a/cobalt/media/base/audio_timestamp_helper.h
+++ /dev/null
@@ -1,84 +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 COBALT_MEDIA_BASE_AUDIO_TIMESTAMP_HELPER_H_
-#define COBALT_MEDIA_BASE_AUDIO_TIMESTAMP_HELPER_H_
-
-#include "base/basictypes.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Generates timestamps for a sequence of audio sample frames. This class should
-// be used any place timestamps need to be calculated for a sequence of audio
-// samples. It helps avoid timestamps inaccuracies caused by rounding/truncation
-// in repeated sample count to timestamp conversions.
-//
-// The class is constructed with samples_per_second information so that it can
-// convert audio sample frame counts into timestamps. After the object is
-// constructed, SetBaseTimestamp() must be called to specify the starting
-// timestamp of the audio sequence. As audio samples are received, their frame
-// counts are added using AddFrames(). These frame counts are accumulated by
-// this class so GetTimestamp() can be used to determine the timestamp for the
-// samples that have been added. GetDuration() calculates the proper duration
-// values for samples added to the current timestamp. GetFramesToTarget()
-// determines the number of frames that need to be added/removed from the
-// accumulated frames to reach a target timestamp.
-class MEDIA_EXPORT AudioTimestampHelper {
- public:
-  // Returns the time duration of the given number of frames of audio with the
-  // given sample rate (in samples per second).
-  static base::TimeDelta FramesToTime(int64_t frames, int samples_per_second);
-
-  // Returns the number of frames in the given duration of audio with the given
-  // sample rate (in samples per second).
-  static int64_t TimeToFrames(base::TimeDelta time, int samples_per_second);
-
-  explicit AudioTimestampHelper(int samples_per_second);
-
-  // Sets the base timestamp to |base_timestamp| and the sets count to 0.
-  void SetBaseTimestamp(base::TimeDelta base_timestamp);
-
-  base::TimeDelta base_timestamp() const;
-  int64_t frame_count() const { return frame_count_; }
-
-  // Adds |frame_count| to the frame counter.
-  // Note: SetBaseTimestamp() must be called with a value other than
-  // kNoTimestamp before this method can be called.
-  void AddFrames(int frame_count);
-
-  // Get the current timestamp. This value is computed from the base_timestamp()
-  // and the number of sample frames that have been added so far.
-  base::TimeDelta GetTimestamp() const;
-
-  // Gets the duration if |frame_count| frames were added to the current
-  // timestamp reported by GetTimestamp(). This method ensures that
-  // (GetTimestamp() + GetFrameDuration(n)) will equal the timestamp that
-  // GetTimestamp() will return if AddFrames(n) is called.
-  base::TimeDelta GetFrameDuration(int frame_count) const;
-
-  // Returns the number of frames needed to reach the target timestamp.
-  // Note: |target| must be >= |base_timestamp_|.
-  int64_t GetFramesToTarget(base::TimeDelta target) const;
-
- private:
-  base::TimeDelta ComputeTimestamp(int64_t frame_count) const;
-
-  double microseconds_per_frame_;
-
-  base::TimeDelta base_timestamp_;
-
-  // Number of frames accumulated by AddFrames() calls.
-  int64_t frame_count_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(AudioTimestampHelper);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_AUDIO_TIMESTAMP_HELPER_H_
diff --git a/cobalt/media/base/audio_timestamp_helper_unittest.cc b/cobalt/media/base/audio_timestamp_helper_unittest.cc
deleted file mode 100644
index 7160382..0000000
--- a/cobalt/media/base/audio_timestamp_helper_unittest.cc
+++ /dev/null
@@ -1,177 +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 "cobalt/media/base/audio_timestamp_helper.h"
-#include "base/basictypes.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-const int k48kHz = 48000;
-
-}  // namespace
-
-static const int kDefaultSampleRate = 44100;
-
-class AudioTimestampHelperTest : public ::testing::Test {
- public:
-  AudioTimestampHelperTest() : helper_(kDefaultSampleRate) {
-    helper_.SetBaseTimestamp(base::TimeDelta());
-  }
-
-  // Adds frames to the helper and returns the current timestamp in
-  // microseconds.
-  int64_t AddFrames(int frames) {
-    helper_.AddFrames(frames);
-    return helper_.GetTimestamp().InMicroseconds();
-  }
-
-  int64_t FramesToTarget(int target_in_microseconds) {
-    return helper_.GetFramesToTarget(
-        base::TimeDelta::FromMicroseconds(target_in_microseconds));
-  }
-
-  void TestGetFramesToTargetRange(int frame_count, int start, int end) {
-    for (int i = start; i <= end; ++i) {
-      EXPECT_EQ(frame_count, FramesToTarget(i))
-          << " Failure for timestamp " << i << " us.";
-    }
-  }
-
- protected:
-  AudioTimestampHelper helper_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AudioTimestampHelperTest);
-};
-
-TEST_F(AudioTimestampHelperTest, FramesToTime) {
-  // Negative value.
-  EXPECT_EQ(base::TimeDelta::FromSeconds(-1),
-            AudioTimestampHelper::FramesToTime(-48000, k48kHz));
-  // Zero.
-  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0),
-            AudioTimestampHelper::FramesToTime(0, k48kHz));
-  // One frame.
-  EXPECT_EQ(base::TimeDelta::FromMicroseconds(20),
-            AudioTimestampHelper::FramesToTime(1, k48kHz));
-  // Exact value with maximum precision of TimeDelta.
-  EXPECT_EQ(base::TimeDelta::FromMicroseconds(15625),
-            AudioTimestampHelper::FramesToTime(750, k48kHz));
-  // One second.
-  EXPECT_EQ(base::TimeDelta::FromSeconds(1),
-            AudioTimestampHelper::FramesToTime(48000, k48kHz));
-  // Argument and return value exceeding 32 bits.
-  EXPECT_EQ(base::TimeDelta::FromSeconds(1000000),
-            AudioTimestampHelper::FramesToTime(48000000000, k48kHz));
-}
-
-TEST_F(AudioTimestampHelperTest, TimeToFrames) {
-  // Negative value.
-  EXPECT_EQ(-48000, AudioTimestampHelper::TimeToFrames(
-                        base::TimeDelta::FromSeconds(-1), k48kHz));
-  // Zero.
-  EXPECT_EQ(0, AudioTimestampHelper::TimeToFrames(
-                   base::TimeDelta::FromMicroseconds(0), k48kHz));
-  // Any duration less than 21 microseconds will return zero frames at 48 kHz
-  // because each frame is 20.833 microseconds.
-  EXPECT_EQ(0, AudioTimestampHelper::TimeToFrames(
-                   base::TimeDelta::FromMicroseconds(20), k48kHz));
-  EXPECT_EQ(1, AudioTimestampHelper::TimeToFrames(
-                   base::TimeDelta::FromMicroseconds(21), k48kHz));
-  // Exact value with maximum precision of TimeDelta.
-  EXPECT_EQ(750, AudioTimestampHelper::TimeToFrames(
-                     base::TimeDelta::FromMicroseconds(15625), k48kHz));
-  // One second.
-  EXPECT_EQ(48000, AudioTimestampHelper::TimeToFrames(
-                       base::TimeDelta::FromSeconds(1), k48kHz));
-  // Argument and return value exceeding 32 bits.
-  EXPECT_EQ(48000000000, AudioTimestampHelper::TimeToFrames(
-                             base::TimeDelta::FromSeconds(1000000), k48kHz));
-}
-
-TEST_F(AudioTimestampHelperTest, Basic) {
-  EXPECT_EQ(0, helper_.GetTimestamp().InMicroseconds());
-
-  // Verify that the output timestamp is always rounded down to the
-  // nearest microsecond. 1 frame @ 44100 is ~22.67573 microseconds,
-  // which is why the timestamp sometimes increments by 23 microseconds
-  // and other times it increments by 22 microseconds.
-  EXPECT_EQ(0, AddFrames(0));
-  EXPECT_EQ(22, AddFrames(1));
-  EXPECT_EQ(45, AddFrames(1));
-  EXPECT_EQ(68, AddFrames(1));
-  EXPECT_EQ(90, AddFrames(1));
-  EXPECT_EQ(113, AddFrames(1));
-
-  // Verify that adding frames one frame at a time matches the timestamp
-  // returned if the same number of frames are added all at once.
-  base::TimeDelta timestamp_1 = helper_.GetTimestamp();
-  helper_.SetBaseTimestamp(kNoTimestamp);
-  EXPECT_TRUE(kNoTimestamp == helper_.base_timestamp());
-  helper_.SetBaseTimestamp(base::TimeDelta());
-  EXPECT_EQ(0, helper_.GetTimestamp().InMicroseconds());
-
-  helper_.AddFrames(5);
-  EXPECT_EQ(113, helper_.GetTimestamp().InMicroseconds());
-  EXPECT_TRUE(timestamp_1 == helper_.GetTimestamp());
-}
-
-TEST_F(AudioTimestampHelperTest, GetDuration) {
-  helper_.SetBaseTimestamp(base::TimeDelta::FromMicroseconds(100));
-
-  int frame_count = 5;
-  int64_t expected_durations[] = {113, 113, 114, 113, 113, 114};
-  for (size_t i = 0; i < arraysize(expected_durations); ++i) {
-    base::TimeDelta duration = helper_.GetFrameDuration(frame_count);
-    EXPECT_EQ(expected_durations[i], duration.InMicroseconds());
-
-    base::TimeDelta timestamp_1 = helper_.GetTimestamp() + duration;
-    helper_.AddFrames(frame_count);
-    base::TimeDelta timestamp_2 = helper_.GetTimestamp();
-    EXPECT_TRUE(timestamp_1 == timestamp_2);
-  }
-}
-
-TEST_F(AudioTimestampHelperTest, GetFramesToTarget) {
-  // Verify GetFramesToTarget() rounding behavior.
-  // 1 frame @ 44100 is ~22.67573 microseconds,
-
-  // Test values less than half of the frame duration.
-  TestGetFramesToTargetRange(0, 0, 11);
-
-  // Test values between half the frame duration & the
-  // full frame duration.
-  TestGetFramesToTargetRange(1, 12, 22);
-
-  // Verify that the same number of frames is returned up
-  // to the next half a frame.
-  TestGetFramesToTargetRange(1, 23, 34);
-
-  // Verify the next 3 ranges.
-  TestGetFramesToTargetRange(2, 35, 56);
-  TestGetFramesToTargetRange(3, 57, 79);
-  TestGetFramesToTargetRange(4, 80, 102);
-  TestGetFramesToTargetRange(5, 103, 124);
-
-  // Add frames to the helper so negative frame counts can be tested.
-  helper_.AddFrames(5);
-
-  // Note: The timestamp ranges must match the positive values
-  // tested above to verify that the code is rounding properly.
-  TestGetFramesToTargetRange(0, 103, 124);
-  TestGetFramesToTargetRange(-1, 80, 102);
-  TestGetFramesToTargetRange(-2, 57, 79);
-  TestGetFramesToTargetRange(-3, 35, 56);
-  TestGetFramesToTargetRange(-4, 12, 34);
-  TestGetFramesToTargetRange(-5, 0, 11);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_video_metadata_extractor.cc b/cobalt/media/base/audio_video_metadata_extractor.cc
deleted file mode 100644
index cdaeb4c..0000000
--- a/cobalt/media/base/audio_video_metadata_extractor.cc
+++ /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.
-
-#include "cobalt/media/base/audio_video_metadata_extractor.h"
-
-#include "base/bind.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/time/time.h"
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#include "cobalt/media/filters/blocking_url_protocol.h"
-#include "cobalt/media/filters/ffmpeg_glue.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-void OnError(bool* succeeded) { *succeeded = false; }
-
-// Returns true if the |tag| matches |expected_key|.
-bool ExtractString(AVDictionaryEntry* tag, const char* expected_key,
-                   std::string* destination) {
-  if (!base::LowerCaseEqualsASCII(std::string(tag->key), expected_key))
-    return false;
-
-  if (destination->empty()) *destination = tag->value;
-
-  return true;
-}
-
-// Returns true if the |tag| matches |expected_key|.
-bool ExtractInt(AVDictionaryEntry* tag, const char* expected_key,
-                int* destination) {
-  if (!base::LowerCaseEqualsASCII(std::string(tag->key), expected_key))
-    return false;
-
-  int temporary = -1;
-  if (*destination < 0 && base::StringToInt(tag->value, &temporary) &&
-      temporary >= 0) {
-    *destination = temporary;
-  }
-
-  return true;
-}
-
-// Set attached image size limit to 4MB. Chosen arbitrarily.
-const int kAttachedImageSizeLimit = 4 * 1024 * 1024;
-
-}  // namespace
-
-AudioVideoMetadataExtractor::StreamInfo::StreamInfo() {}
-
-AudioVideoMetadataExtractor::StreamInfo::StreamInfo(const StreamInfo& other) =
-    default;
-
-AudioVideoMetadataExtractor::StreamInfo::~StreamInfo() {}
-
-AudioVideoMetadataExtractor::AudioVideoMetadataExtractor()
-    : extracted_(false),
-      duration_(-1),
-      width_(-1),
-      height_(-1),
-      disc_(-1),
-      rotation_(-1),
-      track_(-1) {}
-
-AudioVideoMetadataExtractor::~AudioVideoMetadataExtractor() {}
-
-bool AudioVideoMetadataExtractor::Extract(DataSource* source,
-                                          bool extract_attached_images) {
-  DCHECK(!extracted_);
-
-  bool read_ok = true;
-  media::BlockingUrlProtocol protocol(source, base::Bind(&OnError, &read_ok));
-  media::FFmpegGlue glue(&protocol);
-  AVFormatContext* format_context = glue.format_context();
-
-  if (!glue.OpenContext()) return false;
-
-  if (!read_ok) return false;
-
-  if (!format_context->iformat) return false;
-
-  if (avformat_find_stream_info(format_context, NULL) < 0) return false;
-
-  if (format_context->duration != AV_NOPTS_VALUE)
-    duration_ = static_cast<double>(format_context->duration) / AV_TIME_BASE;
-
-  stream_infos_.push_back(StreamInfo());
-  StreamInfo& container_info = stream_infos_.back();
-  container_info.type = format_context->iformat->name;
-  ExtractDictionary(format_context->metadata, &container_info.tags);
-
-  for (unsigned int i = 0; i < format_context->nb_streams; ++i) {
-    stream_infos_.push_back(StreamInfo());
-    StreamInfo& info = stream_infos_.back();
-
-    AVStream* stream = format_context->streams[i];
-    if (!stream) continue;
-
-    // Extract dictionary from streams also. Needed for containers that attach
-    // metadata to contained streams instead the container itself, like OGG.
-    ExtractDictionary(stream->metadata, &info.tags);
-
-    if (!stream->codec) continue;
-
-    info.type = avcodec_get_name(stream->codec->codec_id);
-
-    // Extract dimensions of largest stream that's not an attached image.
-    if (stream->codec->width > 0 && stream->codec->width > width_ &&
-        stream->codec->height > 0 && stream->codec->height > height_) {
-      width_ = stream->codec->width;
-      height_ = stream->codec->height;
-    }
-
-    // Extract attached image if requested.
-    if (extract_attached_images &&
-        stream->disposition == AV_DISPOSITION_ATTACHED_PIC &&
-        stream->attached_pic.size > 0 &&
-        stream->attached_pic.size <= kAttachedImageSizeLimit &&
-        stream->attached_pic.data != NULL) {
-      attached_images_bytes_.push_back(std::string());
-      attached_images_bytes_.back().assign(
-          reinterpret_cast<const char*>(stream->attached_pic.data),
-          stream->attached_pic.size);
-    }
-  }
-
-  extracted_ = true;
-  return true;
-}
-
-double AudioVideoMetadataExtractor::duration() const {
-  DCHECK(extracted_);
-  return duration_;
-}
-
-int AudioVideoMetadataExtractor::width() const {
-  DCHECK(extracted_);
-  return width_;
-}
-
-int AudioVideoMetadataExtractor::height() const {
-  DCHECK(extracted_);
-  return height_;
-}
-
-int AudioVideoMetadataExtractor::rotation() const {
-  DCHECK(extracted_);
-  return rotation_;
-}
-
-const std::string& AudioVideoMetadataExtractor::album() const {
-  DCHECK(extracted_);
-  return album_;
-}
-
-const std::string& AudioVideoMetadataExtractor::artist() const {
-  DCHECK(extracted_);
-  return artist_;
-}
-
-const std::string& AudioVideoMetadataExtractor::comment() const {
-  DCHECK(extracted_);
-  return comment_;
-}
-
-const std::string& AudioVideoMetadataExtractor::copyright() const {
-  DCHECK(extracted_);
-  return copyright_;
-}
-
-const std::string& AudioVideoMetadataExtractor::date() const {
-  DCHECK(extracted_);
-  return date_;
-}
-
-int AudioVideoMetadataExtractor::disc() const {
-  DCHECK(extracted_);
-  return disc_;
-}
-
-const std::string& AudioVideoMetadataExtractor::encoder() const {
-  DCHECK(extracted_);
-  return encoder_;
-}
-
-const std::string& AudioVideoMetadataExtractor::encoded_by() const {
-  DCHECK(extracted_);
-  return encoded_by_;
-}
-
-const std::string& AudioVideoMetadataExtractor::genre() const {
-  DCHECK(extracted_);
-  return genre_;
-}
-
-const std::string& AudioVideoMetadataExtractor::language() const {
-  DCHECK(extracted_);
-  return language_;
-}
-
-const std::string& AudioVideoMetadataExtractor::title() const {
-  DCHECK(extracted_);
-  return title_;
-}
-
-int AudioVideoMetadataExtractor::track() const {
-  DCHECK(extracted_);
-  return track_;
-}
-
-const std::vector<AudioVideoMetadataExtractor::StreamInfo>&
-AudioVideoMetadataExtractor::stream_infos() const {
-  DCHECK(extracted_);
-  return stream_infos_;
-}
-
-const std::vector<std::string>&
-AudioVideoMetadataExtractor::attached_images_bytes() const {
-  DCHECK(extracted_);
-  return attached_images_bytes_;
-}
-
-void AudioVideoMetadataExtractor::ExtractDictionary(AVDictionary* metadata,
-                                                    TagDictionary* raw_tags) {
-  if (!metadata) return;
-
-  for (AVDictionaryEntry* tag =
-           av_dict_get(metadata, "", NULL, AV_DICT_IGNORE_SUFFIX);
-       tag; tag = av_dict_get(metadata, "", tag, AV_DICT_IGNORE_SUFFIX)) {
-    if (raw_tags->find(tag->key) == raw_tags->end())
-      (*raw_tags)[tag->key] = tag->value;
-
-    if (ExtractInt(tag, "rotate", &rotation_)) continue;
-    if (ExtractString(tag, "album", &album_)) continue;
-    if (ExtractString(tag, "artist", &artist_)) continue;
-    if (ExtractString(tag, "comment", &comment_)) continue;
-    if (ExtractString(tag, "copyright", &copyright_)) continue;
-    if (ExtractString(tag, "date", &date_)) continue;
-    if (ExtractInt(tag, "disc", &disc_)) continue;
-    if (ExtractString(tag, "encoder", &encoder_)) continue;
-    if (ExtractString(tag, "encoded_by", &encoded_by_)) continue;
-    if (ExtractString(tag, "genre", &genre_)) continue;
-    if (ExtractString(tag, "language", &language_)) continue;
-    if (ExtractString(tag, "title", &title_)) continue;
-    if (ExtractInt(tag, "track", &track_)) continue;
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/audio_video_metadata_extractor.h b/cobalt/media/base/audio_video_metadata_extractor.h
deleted file mode 100644
index 0272107..0000000
--- a/cobalt/media/base/audio_video_metadata_extractor.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_AUDIO_VIDEO_METADATA_EXTRACTOR_H_
-#define COBALT_MEDIA_BASE_AUDIO_VIDEO_METADATA_EXTRACTOR_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-
-struct AVDictionary;
-
-namespace cobalt {
-namespace media {
-
-class DataSource;
-
-// This class extracts a string dictionary of metadata tags for audio and video
-// files. It also provides the format name.
-class MEDIA_EXPORT AudioVideoMetadataExtractor {
- public:
-  typedef std::map<std::string, std::string> TagDictionary;
-
-  struct StreamInfo {
-    StreamInfo();
-    StreamInfo(const StreamInfo& other);
-    ~StreamInfo();
-    std::string type;
-    TagDictionary tags;
-  };
-
-  typedef std::vector<StreamInfo> StreamInfoVector;
-
-  AudioVideoMetadataExtractor();
-  ~AudioVideoMetadataExtractor();
-
-  // Returns whether or not the fields were successfully extracted. Should only
-  // be called once.
-  bool Extract(DataSource* source, bool extract_attached_pics);
-
-  // Returns -1 if we cannot extract the duration. In seconds.
-  double duration() const;
-
-  // Returns -1 for containers without video.
-  int width() const;
-  int height() const;
-
-  // Returns -1 if undefined.
-  int rotation() const;
-
-  // Returns -1 or an empty string if the value is undefined.
-  const std::string& album() const;
-  const std::string& artist() const;
-  const std::string& comment() const;
-  const std::string& copyright() const;
-  const std::string& date() const;
-  int disc() const;
-  const std::string& encoder() const;
-  const std::string& encoded_by() const;
-  const std::string& genre() const;
-  const std::string& language() const;
-  const std::string& title() const;
-  int track() const;
-
-  // First element is the container. Subsequent elements are the child streams.
-  const StreamInfoVector& stream_infos() const;
-
-  // Empty if Extract call did not request attached images, or if no attached
-  // images were found.
-  const std::vector<std::string>& attached_images_bytes() const;
-
- private:
-  void ExtractDictionary(AVDictionary* metadata, TagDictionary* raw_tags);
-
-  bool extracted_;
-
-  int duration_;
-  int width_;
-  int height_;
-
-  std::string album_;
-  std::string artist_;
-  std::string comment_;
-  std::string copyright_;
-  std::string date_;
-  int disc_;
-  std::string encoder_;
-  std::string encoded_by_;
-  std::string genre_;
-  std::string language_;
-  int rotation_;
-  std::string title_;
-  int track_;
-
-  StreamInfoVector stream_infos_;
-
-  std::vector<std::string> attached_images_bytes_;
-
-  DISALLOW_COPY_AND_ASSIGN(AudioVideoMetadataExtractor);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_AUDIO_VIDEO_METADATA_EXTRACTOR_H_
diff --git a/cobalt/media/base/audio_video_metadata_extractor_unittest.cc b/cobalt/media/base/audio_video_metadata_extractor_unittest.cc
deleted file mode 100644
index 4a27592..0000000
--- a/cobalt/media/base/audio_video_metadata_extractor_unittest.cc
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/base/audio_video_metadata_extractor.h"
-
-#include <memory>
-
-#include "base/logging.h"
-#include "base/sha1.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/filters/file_data_source.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-std::unique_ptr<AudioVideoMetadataExtractor> GetExtractor(
-    const std::string& filename, bool extract_attached_images,
-    bool expected_result, double expected_duration, int expected_width,
-    int expected_height) {
-  FileDataSource source;
-  EXPECT_TRUE(source.Initialize(GetTestDataFilePath(filename)));
-
-  std::unique_ptr<AudioVideoMetadataExtractor> extractor(
-      new AudioVideoMetadataExtractor);
-  bool extracted = extractor->Extract(&source, extract_attached_images);
-  EXPECT_EQ(expected_result, extracted);
-
-  if (!extracted) return extractor;
-
-  EXPECT_EQ(expected_duration, extractor->duration());
-
-  EXPECT_EQ(expected_width, extractor->width());
-  EXPECT_EQ(expected_height, extractor->height());
-
-  return extractor;
-}
-
-const std::string GetTagValue(
-    const media::AudioVideoMetadataExtractor::TagDictionary& tags,
-    const char* tag_name) {
-  auto tag_data = tags.find(tag_name);
-  return tag_data == tags.end() ? "" : tag_data->second;
-}
-
-TEST(AudioVideoMetadataExtractorTest, InvalidFile) {
-  GetExtractor("ten_byte_file", true, false, 0, -1, -1);
-}
-
-TEST(AudioVideoMetadataExtractorTest, AudioOGG) {
-  std::unique_ptr<AudioVideoMetadataExtractor> extractor =
-      GetExtractor("9ch.ogg", true, true, 0, -1, -1);
-  EXPECT_EQ("Processed by SoX", extractor->comment());
-
-  EXPECT_EQ("ogg", extractor->stream_infos()[0].type);
-  EXPECT_EQ(2u, extractor->stream_infos().size());
-
-  EXPECT_EQ(0u, extractor->stream_infos()[0].tags.size());
-
-  EXPECT_EQ(1u, extractor->stream_infos()[1].tags.size());
-  EXPECT_EQ("vorbis", extractor->stream_infos()[1].type);
-  EXPECT_EQ("Processed by SoX",
-            GetTagValue(extractor->stream_infos()[1].tags, "COMMENT"));
-
-  EXPECT_EQ(0u, extractor->attached_images_bytes().size());
-}
-
-TEST(AudioVideoMetadataExtractorTest, AudioWAV) {
-  std::unique_ptr<AudioVideoMetadataExtractor> extractor =
-      GetExtractor("sfx_u8.wav", true, true, 0, -1, -1);
-  EXPECT_EQ("Lavf54.37.100", extractor->encoder());
-  EXPECT_EQ("Amadeus Pro", extractor->encoded_by());
-
-  EXPECT_EQ("wav", extractor->stream_infos()[0].type);
-  EXPECT_EQ(2u, extractor->stream_infos().size());
-
-  EXPECT_EQ(2u, extractor->stream_infos()[0].tags.size());
-  EXPECT_EQ("Lavf54.37.100",
-            GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
-  EXPECT_EQ("Amadeus Pro",
-            GetTagValue(extractor->stream_infos()[0].tags, "encoded_by"));
-
-  EXPECT_EQ("pcm_u8", extractor->stream_infos()[1].type);
-  EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
-
-  EXPECT_EQ(0u, extractor->attached_images_bytes().size());
-}
-
-TEST(AudioVideoMetadataExtractorTest, VideoWebM) {
-  std::unique_ptr<AudioVideoMetadataExtractor> extractor =
-      GetExtractor("bear-320x240-multitrack.webm", true, true, 2, 320, 240);
-  EXPECT_EQ("Lavf53.9.0", extractor->encoder());
-
-  EXPECT_EQ(6u, extractor->stream_infos().size());
-
-  EXPECT_EQ("matroska,webm", extractor->stream_infos()[0].type);
-  EXPECT_EQ(1u, extractor->stream_infos()[0].tags.size());
-  EXPECT_EQ("Lavf53.9.0",
-            GetTagValue(extractor->stream_infos()[0].tags, "ENCODER"));
-
-  EXPECT_EQ("vp8", extractor->stream_infos()[1].type);
-  EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
-
-  EXPECT_EQ("vorbis", extractor->stream_infos()[2].type);
-  EXPECT_EQ(0u, extractor->stream_infos()[2].tags.size());
-
-  EXPECT_EQ("subrip", extractor->stream_infos()[3].type);
-  EXPECT_EQ(0u, extractor->stream_infos()[3].tags.size());
-
-  EXPECT_EQ("theora", extractor->stream_infos()[4].type);
-  EXPECT_EQ(0u, extractor->stream_infos()[4].tags.size());
-
-  EXPECT_EQ("pcm_s16le", extractor->stream_infos()[5].type);
-  EXPECT_EQ(1u, extractor->stream_infos()[5].tags.size());
-  EXPECT_EQ("Lavc52.32.0",
-            GetTagValue(extractor->stream_infos()[5].tags, "ENCODER"));
-
-  EXPECT_EQ(0u, extractor->attached_images_bytes().size());
-}
-
-#if defined(USE_PROPRIETARY_CODECS)
-TEST(AudioVideoMetadataExtractorTest, AndroidRotatedMP4Video) {
-  std::unique_ptr<AudioVideoMetadataExtractor> extractor =
-      GetExtractor("90rotation.mp4", true, true, 0, 1920, 1080);
-
-  EXPECT_EQ(90, extractor->rotation());
-
-  EXPECT_EQ(3u, extractor->stream_infos().size());
-
-  EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type);
-  EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size());
-  EXPECT_EQ("isom3gp4", GetTagValue(extractor->stream_infos()[0].tags,
-                                    "compatible_brands"));
-  EXPECT_EQ("2014-02-11 00:39:25",
-            GetTagValue(extractor->stream_infos()[0].tags, "creation_time"));
-  EXPECT_EQ("isom",
-            GetTagValue(extractor->stream_infos()[0].tags, "major_brand"));
-  EXPECT_EQ("0",
-            GetTagValue(extractor->stream_infos()[0].tags, "minor_version"));
-
-  EXPECT_EQ("h264", extractor->stream_infos()[1].type);
-  EXPECT_EQ(5u, extractor->stream_infos()[1].tags.size());
-  EXPECT_EQ("2014-02-11 00:39:25",
-            GetTagValue(extractor->stream_infos()[1].tags, "creation_time"));
-  EXPECT_EQ("VideoHandle",
-            GetTagValue(extractor->stream_infos()[1].tags, "handler_name"));
-  EXPECT_EQ("eng", GetTagValue(extractor->stream_infos()[1].tags, "language"));
-  EXPECT_EQ("90", GetTagValue(extractor->stream_infos()[1].tags, "rotate"));
-
-  EXPECT_EQ("aac", extractor->stream_infos()[2].type);
-  EXPECT_EQ(3u, extractor->stream_infos()[2].tags.size());
-  EXPECT_EQ("2014-02-11 00:39:25",
-            GetTagValue(extractor->stream_infos()[2].tags, "creation_time"));
-  EXPECT_EQ("SoundHandle",
-            GetTagValue(extractor->stream_infos()[2].tags, "handler_name"));
-  EXPECT_EQ("eng", GetTagValue(extractor->stream_infos()[2].tags, "language"));
-
-  EXPECT_EQ(0u, extractor->attached_images_bytes().size());
-}
-
-TEST(AudioVideoMetadataExtractorTest, AudioMP3) {
-  std::unique_ptr<AudioVideoMetadataExtractor> extractor =
-      GetExtractor("id3_png_test.mp3", true, true, 1, -1, -1);
-
-  EXPECT_EQ("Airbag", extractor->title());
-  EXPECT_EQ("Radiohead", extractor->artist());
-  EXPECT_EQ("OK Computer", extractor->album());
-  EXPECT_EQ(1, extractor->track());
-  EXPECT_EQ("Alternative", extractor->genre());
-  EXPECT_EQ("1997", extractor->date());
-  EXPECT_EQ("Lavf54.4.100", extractor->encoder());
-
-  EXPECT_EQ(3u, extractor->stream_infos().size());
-
-  EXPECT_EQ("mp3", extractor->stream_infos()[0].type);
-  EXPECT_EQ(7u, extractor->stream_infos()[0].tags.size());
-  EXPECT_EQ("OK Computer",
-            GetTagValue(extractor->stream_infos()[0].tags, "album"));
-  EXPECT_EQ("Radiohead",
-            GetTagValue(extractor->stream_infos()[0].tags, "artist"));
-  EXPECT_EQ("1997", GetTagValue(extractor->stream_infos()[0].tags, "date"));
-  EXPECT_EQ("Lavf54.4.100",
-            GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
-  EXPECT_EQ("Alternative",
-            GetTagValue(extractor->stream_infos()[0].tags, "genre"));
-  EXPECT_EQ("Airbag", GetTagValue(extractor->stream_infos()[0].tags, "title"));
-  EXPECT_EQ("1", GetTagValue(extractor->stream_infos()[0].tags, "track"));
-
-  EXPECT_EQ("mp3", extractor->stream_infos()[1].type);
-  EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
-
-  EXPECT_EQ("png", extractor->stream_infos()[2].type);
-  EXPECT_EQ(1u, extractor->stream_infos()[2].tags.size());
-  EXPECT_EQ("Other", GetTagValue(extractor->stream_infos()[2].tags, "comment"));
-
-  EXPECT_EQ(1u, extractor->attached_images_bytes().size());
-  EXPECT_EQ(155752u, extractor->attached_images_bytes()[0].size());
-
-  EXPECT_EQ("\x89PNG\r\n\x1a\n",
-            extractor->attached_images_bytes()[0].substr(0, 8));
-  EXPECT_EQ("IEND\xae\x42\x60\x82",
-            extractor->attached_images_bytes()[0].substr(
-                extractor->attached_images_bytes()[0].size() - 8, 8));
-  EXPECT_EQ("\xF3\xED\x8F\xC7\xC7\x98\xB9V|p\xC0u!\xB5\x82\xCF\x95\xF0\xCD\xCE",
-            base::SHA1HashString(extractor->attached_images_bytes()[0]));
-}
-#endif
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/bind_to_current_loop.h b/cobalt/media/base/bind_to_current_loop.h
deleted file mode 100644
index acde0d6..0000000
--- a/cobalt/media/base/bind_to_current_loop.h
+++ /dev/null
@@ -1,162 +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 COBALT_MEDIA_BASE_BIND_TO_CURRENT_LOOP_H_
-#define COBALT_MEDIA_BASE_BIND_TO_CURRENT_LOOP_H_
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-
-// This is a helper utility for base::Bind()ing callbacks to the current
-// base::MessageLoop. The typical use is when |a| (of class |A|) wants to hand a
-// callback such as base::Bind(&A::AMethod, a) to |b|, but needs to ensure that
-// when |b| executes the callback, it does so on |a|'s current
-// base::MessageLoop.
-//
-// Typical usage: request to be called back on the current thread:
-// other->StartAsyncProcessAndCallMeBack(
-//    media::BindToCurrentLoop(base::Bind(&MyClass::MyMethod, this)));
-//
-// Note that like base::Bind(), BindToCurrentLoop() can't bind non-constant
-// references, and that *unlike* base::Bind(), BindToCurrentLoop() makes copies
-// of its arguments, and thus can't be used with arrays.
-
-namespace cobalt {
-namespace media {
-
-// Mimic base::internal::CallbackForward, replacing std::move(p) with
-// base::Passed(&p) to account for the extra layer of indirection.
-namespace internal {
-template <typename T>
-T& TrampolineForward(T& t) {
-  return t;
-}
-
-template <typename T, typename R>
-base::internal::PassedWrapper<std::unique_ptr<T>> TrampolineForward(
-    std::unique_ptr<T>& p) {
-  return base::Passed(&p);
-}
-
-template <typename T>
-base::internal::PassedWrapper<std::vector<std::unique_ptr<T>>>
-TrampolineForward(std::vector<std::unique_ptr<T>>& p) {
-  return base::Passed(&p);
-}
-
-// First, tell the compiler TrampolineHelper is a struct template with one
-// type parameter.  Then define specializations where the type is a function
-// returning void and taking zero or more arguments.
-template <typename Sig>
-struct TrampolineHelper;
-
-template <>
-struct TrampolineHelper<void()> {
-  static void Run(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-      const base::Closure& cb) {
-    task_runner->PostTask(FROM_HERE, cb);
-  }
-};
-
-template <typename A1>
-struct TrampolineHelper<void(A1)> {
-  static void Run(const scoped_refptr<base::SingleThreadTaskRunner>& loop,
-                  const base::Callback<void(A1)>& cb, A1 a1) {
-    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1)));
-  }
-};
-
-template <typename A1, typename A2>
-struct TrampolineHelper<void(A1, A2)> {
-  static void Run(const scoped_refptr<base::SingleThreadTaskRunner>& loop,
-                  const base::Callback<void(A1, A2)>& cb, A1 a1, A2 a2) {
-    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
-                                         internal::TrampolineForward(a2)));
-  }
-};
-
-template <typename A1, typename A2, typename A3>
-struct TrampolineHelper<void(A1, A2, A3)> {
-  static void Run(const scoped_refptr<base::SingleThreadTaskRunner>& loop,
-                  const base::Callback<void(A1, A2, A3)>& cb, A1 a1, A2 a2,
-                  A3 a3) {
-    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
-                                         internal::TrampolineForward(a2),
-                                         internal::TrampolineForward(a3)));
-  }
-};
-
-template <typename A1, typename A2, typename A3, typename A4>
-struct TrampolineHelper<void(A1, A2, A3, A4)> {
-  static void Run(const scoped_refptr<base::SingleThreadTaskRunner>& loop,
-                  const base::Callback<void(A1, A2, A3, A4)>& cb, A1 a1, A2 a2,
-                  A3 a3, A4 a4) {
-    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
-                                         internal::TrampolineForward(a2),
-                                         internal::TrampolineForward(a3),
-                                         internal::TrampolineForward(a4)));
-  }
-};
-
-template <typename A1, typename A2, typename A3, typename A4, typename A5>
-struct TrampolineHelper<void(A1, A2, A3, A4, A5)> {
-  static void Run(const scoped_refptr<base::SingleThreadTaskRunner>& loop,
-                  const base::Callback<void(A1, A2, A3, A4, A5)>& cb, A1 a1,
-                  A2 a2, A3 a3, A4 a4, A5 a5) {
-    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
-                                         internal::TrampolineForward(a2),
-                                         internal::TrampolineForward(a3),
-                                         internal::TrampolineForward(a4),
-                                         internal::TrampolineForward(a5)));
-  }
-};
-
-template <typename A1, typename A2, typename A3, typename A4, typename A5,
-          typename A6>
-struct TrampolineHelper<void(A1, A2, A3, A4, A5, A6)> {
-  static void Run(const scoped_refptr<base::SingleThreadTaskRunner>& loop,
-                  const base::Callback<void(A1, A2, A3, A4, A5, A6)>& cb, A1 a1,
-                  A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
-    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
-                                         internal::TrampolineForward(a2),
-                                         internal::TrampolineForward(a3),
-                                         internal::TrampolineForward(a4),
-                                         internal::TrampolineForward(a5),
-                                         internal::TrampolineForward(a6)));
-  }
-};
-
-template <typename A1, typename A2, typename A3, typename A4, typename A5,
-          typename A6, typename A7>
-struct TrampolineHelper<void(A1, A2, A3, A4, A5, A6, A7)> {
-  static void Run(const scoped_refptr<base::SingleThreadTaskRunner>& loop,
-                  const base::Callback<void(A1, A2, A3, A4, A5, A6, A7)>& cb,
-                  A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
-    loop->PostTask(FROM_HERE, base::Bind(cb, internal::TrampolineForward(a1),
-                                         internal::TrampolineForward(a2),
-                                         internal::TrampolineForward(a3),
-                                         internal::TrampolineForward(a4),
-                                         internal::TrampolineForward(a5),
-                                         internal::TrampolineForward(a6),
-                                         internal::TrampolineForward(a7)));
-  }
-};
-
-}  // namespace internal
-
-template <typename T>
-static base::Callback<T> BindToCurrentLoop(const base::Callback<T>& cb) {
-  return base::Bind(&internal::TrampolineHelper<T>::Run,
-                    base::ThreadTaskRunnerHandle::Get(), cb);
-}
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_BIND_TO_CURRENT_LOOP_H_
diff --git a/cobalt/media/base/bind_to_current_loop_unittest.cc b/cobalt/media/base/bind_to_current_loop_unittest.cc
deleted file mode 100644
index d3f9ff6..0000000
--- a/cobalt/media/base/bind_to_current_loop_unittest.cc
+++ /dev/null
@@ -1,172 +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 "cobalt/media/base/bind_to_current_loop.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/memory/free_deleter.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "starboard/memory.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-void BoundBoolSet(bool* var, bool val) { *var = val; }
-
-void BoundBoolSetFromScopedPtr(bool* var, std::unique_ptr<bool> val) {
-  *var = *val;
-}
-
-void BoundBoolSetFromScopedPtrFreeDeleter(
-    bool* var, std::unique_ptr<bool, base::FreeDeleter> val) {
-  *var = *val;
-}
-
-void BoundBoolSetFromScopedArray(bool* var, std::unique_ptr<bool[]> val) {
-  *var = val[0];
-}
-
-void BoundBoolSetFromConstRef(bool* var, const bool& val) { *var = val; }
-
-void BoundIntegersSet(int* a_var, int* b_var, int a_val, int b_val) {
-  *a_var = a_val;
-  *b_var = b_val;
-}
-
-// Various tests that check that the bound function is only actually executed
-// on the message loop, not during the original Run.
-class BindToCurrentLoopTest : public ::testing::Test {
- protected:
-  base::MessageLoop loop_;
-};
-
-TEST_F(BindToCurrentLoopTest, Closure) {
-  // Test the closure is run inside the loop, not outside it.
-  base::WaitableEvent waiter(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                             base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::Closure cb = BindToCurrentLoop(
-      base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter)));
-  cb.Run();
-  EXPECT_FALSE(waiter.IsSignaled());
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(waiter.IsSignaled());
-}
-
-TEST_F(BindToCurrentLoopTest, Bool) {
-  bool bool_var = false;
-  base::Callback<void(bool)> cb =
-      BindToCurrentLoop(base::Bind(&BoundBoolSet, &bool_var));
-  cb.Run(true);
-  EXPECT_FALSE(bool_var);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(bool_var);
-}
-
-TEST_F(BindToCurrentLoopTest, BoundScopedPtrBool) {
-  bool bool_val = false;
-  std::unique_ptr<bool> scoped_ptr_bool(new bool(true));
-  base::Closure cb = BindToCurrentLoop(base::Bind(
-      &BoundBoolSetFromScopedPtr, &bool_val, base::Passed(&scoped_ptr_bool)));
-  cb.Run();
-  EXPECT_FALSE(bool_val);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(bool_val);
-}
-
-TEST_F(BindToCurrentLoopTest, PassedScopedPtrBool) {
-  bool bool_val = false;
-  std::unique_ptr<bool> scoped_ptr_bool(new bool(true));
-  base::Callback<void(std::unique_ptr<bool>)> cb =
-      BindToCurrentLoop(base::Bind(&BoundBoolSetFromScopedPtr, &bool_val));
-  cb.Run(std::move(scoped_ptr_bool));
-  EXPECT_FALSE(bool_val);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(bool_val);
-}
-
-TEST_F(BindToCurrentLoopTest, BoundScopedArrayBool) {
-  bool bool_val = false;
-  std::unique_ptr<bool[]> scoped_array_bool(new bool[1]);
-  scoped_array_bool[0] = true;
-  base::Closure cb =
-      BindToCurrentLoop(base::Bind(&BoundBoolSetFromScopedArray, &bool_val,
-                                   base::Passed(&scoped_array_bool)));
-  cb.Run();
-  EXPECT_FALSE(bool_val);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(bool_val);
-}
-
-TEST_F(BindToCurrentLoopTest, PassedScopedArrayBool) {
-  bool bool_val = false;
-  std::unique_ptr<bool[]> scoped_array_bool(new bool[1]);
-  scoped_array_bool[0] = true;
-  base::Callback<void(std::unique_ptr<bool[]>)> cb =
-      BindToCurrentLoop(base::Bind(&BoundBoolSetFromScopedArray, &bool_val));
-  cb.Run(std::move(scoped_array_bool));
-  EXPECT_FALSE(bool_val);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(bool_val);
-}
-
-TEST_F(BindToCurrentLoopTest, BoundScopedPtrFreeDeleterBool) {
-  bool bool_val = false;
-  std::unique_ptr<bool, base::FreeDeleter> scoped_ptr_free_deleter_bool(
-      static_cast<bool*>(SbMemoryAllocate(sizeof(bool))));
-  *scoped_ptr_free_deleter_bool = true;
-  base::Closure cb = BindToCurrentLoop(
-      base::Bind(&BoundBoolSetFromScopedPtrFreeDeleter, &bool_val,
-                 base::Passed(&scoped_ptr_free_deleter_bool)));
-  cb.Run();
-  EXPECT_FALSE(bool_val);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(bool_val);
-}
-
-TEST_F(BindToCurrentLoopTest, PassedScopedPtrFreeDeleterBool) {
-  bool bool_val = false;
-  std::unique_ptr<bool, base::FreeDeleter> scoped_ptr_free_deleter_bool(
-      static_cast<bool*>(SbMemoryAllocate(sizeof(bool))));
-  *scoped_ptr_free_deleter_bool = true;
-  base::Callback<void(std::unique_ptr<bool, base::FreeDeleter>)> cb =
-      BindToCurrentLoop(
-          base::Bind(&BoundBoolSetFromScopedPtrFreeDeleter, &bool_val));
-  cb.Run(std::move(scoped_ptr_free_deleter_bool));
-  EXPECT_FALSE(bool_val);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(bool_val);
-}
-
-TEST_F(BindToCurrentLoopTest, BoolConstRef) {
-  bool bool_var = false;
-  bool true_var = true;
-  const bool& true_ref = true_var;
-  base::Closure cb = BindToCurrentLoop(
-      base::Bind(&BoundBoolSetFromConstRef, &bool_var, true_ref));
-  cb.Run();
-  EXPECT_FALSE(bool_var);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(bool_var);
-}
-
-TEST_F(BindToCurrentLoopTest, Integers) {
-  int a = 0;
-  int b = 0;
-  base::Callback<void(int, int)> cb =
-      BindToCurrentLoop(base::Bind(&BoundIntegersSet, &a, &b));
-  cb.Run(1, -1);
-  EXPECT_EQ(a, 0);
-  EXPECT_EQ(b, 0);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(a, 1);
-  EXPECT_EQ(b, -1);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/bit_reader.cc b/cobalt/media/base/bit_reader.cc
deleted file mode 100644
index 831e308..0000000
--- a/cobalt/media/base/bit_reader.cc
+++ /dev/null
@@ -1,35 +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 "cobalt/media/base/bit_reader.h"
-
-namespace cobalt {
-namespace media {
-
-BitReader::BitReader(const uint8_t* data, int size)
-    : initial_size_(size),
-      data_(data),
-      bytes_left_(size),
-      bit_reader_core_(this) {
-  DCHECK(data != NULL);
-  DCHECK_GE(size, 0);
-}
-
-BitReader::~BitReader() {}
-
-int BitReader::GetBytes(int max_nbytes, const uint8_t** out) {
-  DCHECK_GE(max_nbytes, 0);
-  DCHECK(out);
-
-  int nbytes = max_nbytes;
-  if (nbytes > bytes_left_) nbytes = bytes_left_;
-
-  *out = data_;
-  data_ += nbytes;
-  bytes_left_ -= nbytes;
-  return nbytes;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/bit_reader.h b/cobalt/media/base/bit_reader.h
deleted file mode 100644
index db38b06..0000000
--- a/cobalt/media/base/bit_reader.h
+++ /dev/null
@@ -1,59 +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 COBALT_MEDIA_BASE_BIT_READER_H_
-#define COBALT_MEDIA_BASE_BIT_READER_H_
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "cobalt/media/base/bit_reader_core.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT BitReader
-    : MSVC_SUPPRESS_WARNING(4275) private BitReaderCore::ByteStreamProvider {
- public:
-  // Initialize the reader to start reading at |data|, |size| being size
-  // of |data| in bytes.
-  BitReader(const uint8_t* data, int size);
-  ~BitReader() override;
-
-  template <typename T>
-  bool ReadBits(int num_bits, T* out) {
-    return bit_reader_core_.ReadBits(num_bits, out);
-  }
-
-  bool ReadFlag(bool* flag) { return bit_reader_core_.ReadFlag(flag); }
-
-  bool SkipBits(int num_bits) { return bit_reader_core_.SkipBits(num_bits); }
-
-  int bits_available() const { return initial_size_ * 8 - bits_read(); }
-
-  int bits_read() const { return bit_reader_core_.bits_read(); }
-
- private:
-  // BitReaderCore::ByteStreamProvider implementation.
-  int GetBytes(int max_n, const uint8_t** out) override;
-
-  // Total number of bytes that was initially passed to BitReader.
-  const int initial_size_;
-
-  // Pointer to the next unread byte in the stream.
-  const uint8_t* data_;
-
-  // Bytes left in the stream.
-  int bytes_left_;
-
-  BitReaderCore bit_reader_core_;
-
-  DISALLOW_COPY_AND_ASSIGN(BitReader);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_BIT_READER_H_
diff --git a/cobalt/media/base/bit_reader_core.cc b/cobalt/media/base/bit_reader_core.cc
deleted file mode 100644
index 13e5bbc..0000000
--- a/cobalt/media/base/bit_reader_core.cc
+++ /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.
-
-#include "cobalt/media/base/bit_reader_core.h"
-
-#include "base/sys_byteorder.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-namespace {
-const int kRegWidthInBits = sizeof(uint64_t) * 8;
-}
-
-namespace cobalt {
-namespace media {
-
-BitReaderCore::ByteStreamProvider::ByteStreamProvider() {}
-
-BitReaderCore::ByteStreamProvider::~ByteStreamProvider() {}
-
-BitReaderCore::BitReaderCore(ByteStreamProvider* byte_stream_provider)
-    : byte_stream_provider_(byte_stream_provider),
-      bits_read_(0),
-      nbits_(0),
-      reg_(0),
-      nbits_next_(0),
-      reg_next_(0) {}
-
-BitReaderCore::~BitReaderCore() {}
-
-bool BitReaderCore::ReadFlag(bool* flag) {
-  if (nbits_ == 0 && !Refill(1)) return false;
-
-  *flag = (reg_ & (UINT64_C(1) << (kRegWidthInBits - 1))) != 0;
-  reg_ <<= 1;
-  nbits_--;
-  bits_read_++;
-  return true;
-}
-
-int BitReaderCore::PeekBitsMsbAligned(int num_bits, uint64_t* out) {
-  // Try to have at least |num_bits| in the bit register.
-  if (nbits_ < num_bits) Refill(num_bits);
-
-  *out = reg_;
-  return nbits_;
-}
-
-bool BitReaderCore::SkipBitsSmall(int num_bits) {
-  DCHECK_GE(num_bits, 0);
-  uint64_t dummy;
-  while (num_bits >= kRegWidthInBits) {
-    if (!ReadBitsInternal(kRegWidthInBits, &dummy)) return false;
-    num_bits -= kRegWidthInBits;
-  }
-  return ReadBitsInternal(num_bits, &dummy);
-}
-
-bool BitReaderCore::SkipBits(int num_bits) {
-  DCHECK_GE(num_bits, 0);
-
-  const int remaining_bits = nbits_ + nbits_next_;
-  if (remaining_bits >= num_bits) return SkipBitsSmall(num_bits);
-
-  // Skip first the remaining available bits.
-  num_bits -= remaining_bits;
-  bits_read_ += remaining_bits;
-  nbits_ = 0;
-  reg_ = 0;
-  nbits_next_ = 0;
-  reg_next_ = 0;
-
-  // Next, skip an integer number of bytes.
-  const int nbytes = num_bits / 8;
-  if (nbytes > 0) {
-    const uint8_t* byte_stream_window;
-    const int window_size =
-        byte_stream_provider_->GetBytes(nbytes, &byte_stream_window);
-    DCHECK_GE(window_size, 0);
-    DCHECK_LE(window_size, nbytes);
-    if (window_size < nbytes) {
-      // Note that some bytes were consumed.
-      bits_read_ += 8 * window_size;
-      return false;
-    }
-    num_bits -= 8 * nbytes;
-    bits_read_ += 8 * nbytes;
-  }
-
-  // Skip the remaining bits.
-  return SkipBitsSmall(num_bits);
-}
-
-int BitReaderCore::bits_read() const { return bits_read_; }
-
-bool BitReaderCore::ReadBitsInternal(int num_bits, uint64_t* out) {
-  DCHECK_GE(num_bits, 0);
-
-  if (num_bits == 0) {
-    *out = 0;
-    return true;
-  }
-
-  if (num_bits > nbits_ && !Refill(num_bits)) {
-    // Any subsequent ReadBits should fail:
-    // empty the current bit register for that purpose.
-    nbits_ = 0;
-    reg_ = 0;
-    return false;
-  }
-
-  bits_read_ += num_bits;
-
-  if (num_bits == kRegWidthInBits) {
-    // Special case needed since for example for a 64 bit integer "a"
-    // "a << 64" is not defined by the C/C++ standard.
-    *out = reg_;
-    reg_ = 0;
-    nbits_ = 0;
-    return true;
-  }
-
-  *out = reg_ >> (kRegWidthInBits - num_bits);
-  reg_ <<= num_bits;
-  nbits_ -= num_bits;
-  return true;
-}
-
-bool BitReaderCore::Refill(int min_nbits) {
-  DCHECK_LE(min_nbits, kRegWidthInBits);
-
-  // Transfer from the next to the current register.
-  RefillCurrentRegister();
-  if (min_nbits <= nbits_) return true;
-  DCHECK_EQ(nbits_next_, 0);
-  DCHECK_EQ(reg_next_, 0u);
-
-  // Max number of bytes to refill.
-  int max_nbytes = sizeof(reg_next_);
-
-  // Refill.
-  const uint8_t* byte_stream_window;
-  int window_size =
-      byte_stream_provider_->GetBytes(max_nbytes, &byte_stream_window);
-  DCHECK_GE(window_size, 0);
-  DCHECK_LE(window_size, max_nbytes);
-  if (window_size == 0) return false;
-
-  reg_next_ = 0;
-  memcpy(&reg_next_, byte_stream_window, window_size);
-  reg_next_ = base::NetToHost64(reg_next_);
-  nbits_next_ = window_size * 8;
-
-  // Transfer from the next to the current register.
-  RefillCurrentRegister();
-
-  return (nbits_ >= min_nbits);
-}
-
-void BitReaderCore::RefillCurrentRegister() {
-  // No refill possible if the destination register is full
-  // or the source register is empty.
-  if (nbits_ == kRegWidthInBits || nbits_next_ == 0) return;
-
-  reg_ |= (reg_next_ >> nbits_);
-
-  int free_nbits = kRegWidthInBits - nbits_;
-  if (free_nbits >= nbits_next_) {
-    nbits_ += nbits_next_;
-    reg_next_ = 0;
-    nbits_next_ = 0;
-    return;
-  }
-
-  nbits_ += free_nbits;
-  reg_next_ <<= free_nbits;
-  nbits_next_ -= free_nbits;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/bit_reader_core.h b/cobalt/media/base/bit_reader_core.h
deleted file mode 100644
index 9e7fda1..0000000
--- a/cobalt/media/base/bit_reader_core.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 COBALT_MEDIA_BASE_BIT_READER_CORE_H_
-#define COBALT_MEDIA_BASE_BIT_READER_CORE_H_
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT BitReaderCore {
- public:
-  class ByteStreamProvider {
-   public:
-    ByteStreamProvider();
-    virtual ~ByteStreamProvider();
-
-    // Consume at most the following |max_n| bytes of the stream
-    // and return the number n of bytes actually consumed.
-    // Set |*array| to point to a memory buffer containing those n bytes.
-    // Note: |*array| must be valid until the next call to GetBytes
-    // but there is no guarantee it is valid after.
-    virtual int GetBytes(int max_n, const uint8_t** array) = 0;
-  };
-
-  // Lifetime of |byte_stream_provider| must be longer than BitReaderCore.
-  explicit BitReaderCore(ByteStreamProvider* byte_stream_provider);
-  ~BitReaderCore();
-
-  // Read one bit from the stream and return it as a boolean in |*out|.
-  // Remark: we do not use the template version for reading a bool
-  // since it generates some optimization warnings during compilation
-  // on Windows platforms.
-  bool ReadBits(int num_bits, bool* out) {
-    DCHECK_EQ(num_bits, 1);
-    return ReadFlag(out);
-  }
-
-  // Read |num_bits| next bits from stream and return in |*out|, first bit
-  // from the stream starting at |num_bits| position in |*out|,
-  // bits of |*out| whose position is strictly greater than |num_bits|
-  // are all set to zero.
-  // Notes:
-  // - |num_bits| cannot be larger than the bits the type can hold.
-  // - From the above description, passing a signed type in |T| does not
-  //   mean the first bit read from the stream gives the sign of the value.
-  // Return false if the given number of bits cannot be read (not enough
-  // bits in the stream), true otherwise. When return false, the stream will
-  // enter a state where further ReadBits/SkipBits operations will always
-  // return false unless |num_bits| is 0. The type |T| has to be a primitive
-  // integer type.
-  template <typename T>
-  bool ReadBits(int num_bits, T* out) {
-    DCHECK_LE(num_bits, static_cast<int>(sizeof(T) * 8));
-    uint64_t temp;
-    bool ret = ReadBitsInternal(num_bits, &temp);
-    *out = static_cast<T>(temp);
-    return ret;
-  }
-
-  // Read one bit from the stream and return it as a boolean in |*flag|.
-  bool ReadFlag(bool* flag);
-
-  // Retrieve some bits without actually consuming them.
-  // Bits returned in |*out| are shifted so the most significant bit contains
-  // the next bit that can be read from the stream.
-  // Return the number of bits actually written in |out|.
-  // Note: |num_bits| is just a suggestion of how many bits the caller
-  // wish to get in |*out| and must be less than 64:
-  // - The number of bits returned can be more than |num_bits|.
-  // - However, it will be strictly less than |num_bits|
-  //   if and only if there are not enough bits left in the stream.
-  int PeekBitsMsbAligned(int num_bits, uint64_t* out);
-
-  // Skip |num_bits| next bits from stream. Return false if the given number of
-  // bits cannot be skipped (not enough bits in the stream), true otherwise.
-  // When return false, the stream will enter a state where further
-  // ReadBits/ReadFlag/SkipBits operations
-  // will always return false unless |num_bits| is 0.
-  bool SkipBits(int num_bits);
-
-  // Returns the number of bits read so far.
-  int bits_read() const;
-
- private:
-  // This function can skip any number of bits but is more efficient
-  // for small numbers. Return false if the given number of bits cannot be
-  // skipped (not enough bits in the stream), true otherwise.
-  bool SkipBitsSmall(int num_bits);
-
-  // Help function used by ReadBits to avoid inlining the bit reading logic.
-  bool ReadBitsInternal(int num_bits, uint64_t* out);
-
-  // Refill bit registers to have at least |min_nbits| bits available.
-  // Return true if the minimum bit count condition is met after the refill.
-  bool Refill(int min_nbits);
-
-  // Refill the current bit register from the next bit register.
-  void RefillCurrentRegister();
-
-  ByteStreamProvider* const byte_stream_provider_;
-
-  // Number of bits read so far.
-  int bits_read_;
-
-  // Number of bits in |reg_| that have not been consumed yet.
-  // Note: bits are consumed from MSB to LSB.
-  int nbits_;
-  uint64_t reg_;
-
-  // Number of bits in |reg_next_| that have not been consumed yet.
-  // Note: bits are consumed from MSB to LSB.
-  int nbits_next_;
-  uint64_t reg_next_;
-
-  DISALLOW_COPY_AND_ASSIGN(BitReaderCore);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_BIT_READER_CORE_H_
diff --git a/cobalt/media/base/bit_reader_fuzzertest.cc b/cobalt/media/base/bit_reader_fuzzertest.cc
deleted file mode 100644
index d17f4d3..0000000
--- a/cobalt/media/base/bit_reader_fuzzertest.cc
+++ /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.
-
-#include "base/hash.h"
-#include "base/numerics/safe_conversions.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/base/test_random.h"
-#include "starboard/types.h"
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  media::BitReader reader(data, base::checked_cast<int>(size));
-
-  // Need a simple random number generator to generate the number of bits to
-  // read/skip in a reproducible way (given the same |data|). Using Hash() to
-  // ensure the seed varies significantly over minor changes in |data|.
-  media::TestRandom rnd(base::Hash(reinterpret_cast<const char*>(data), size));
-
-  // Read and skip through the data in |reader|.
-  while (reader.bits_available() > 0) {
-    if (rnd.Rand() & 1) {
-      // Read up to 64 bits. This may fail if there is not enough bits
-      // remaining, but it doesn't matter (testing for failures is also good).
-      uint64_t value;
-      if (!reader.ReadBits(rnd.Rand() % 64 + 1, &value)) break;
-    } else {
-      // Skip up to 128 bits. As above, this may fail.
-      if (!reader.SkipBits(rnd.Rand() % 128 + 1)) break;
-    }
-  }
-  return 0;
-}
diff --git a/cobalt/media/base/bit_reader_unittest.cc b/cobalt/media/base/bit_reader_unittest.cc
deleted file mode 100644
index 4e661f4..0000000
--- a/cobalt/media/base/bit_reader_unittest.cc
+++ /dev/null
@@ -1,139 +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 "cobalt/media/base/bit_reader.h"
-
-#include "base/basictypes.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-static void SetBit(uint8_t* buf, size_t size, size_t bit_pos) {
-  size_t byte_pos = bit_pos / 8;
-  bit_pos -= byte_pos * 8;
-  DCHECK_LT(byte_pos, size);
-  buf[byte_pos] |= (1 << (7 - bit_pos));
-}
-
-TEST(BitReaderTest, NormalOperationTest) {
-  uint8_t value8;
-  uint64_t value64;
-  // 0101 0101 1001 1001 repeats 4 times
-  uint8_t buffer[] = {0x55, 0x99, 0x55, 0x99, 0x55, 0x99, 0x55, 0x99};
-  BitReader reader1(buffer, 6);  // Initialize with 6 bytes only
-
-  EXPECT_TRUE(reader1.ReadBits(1, &value8));
-  EXPECT_EQ(value8, 0);
-  EXPECT_TRUE(reader1.ReadBits(8, &value8));
-  EXPECT_EQ(value8, 0xab);  // 1010 1011
-  EXPECT_TRUE(reader1.ReadBits(7, &value64));
-  EXPECT_TRUE(reader1.ReadBits(32, &value64));
-  EXPECT_EQ(value64, 0x55995599u);
-  EXPECT_FALSE(reader1.ReadBits(1, &value8));
-  value8 = 0xff;
-  EXPECT_TRUE(reader1.ReadBits(0, &value8));
-  EXPECT_EQ(value8, 0);
-
-  BitReader reader2(buffer, 8);
-  EXPECT_TRUE(reader2.ReadBits(64, &value64));
-  EXPECT_EQ(value64, 0x5599559955995599ull);
-  EXPECT_FALSE(reader2.ReadBits(1, &value8));
-  EXPECT_TRUE(reader2.ReadBits(0, &value8));
-}
-
-TEST(BitReaderTest, ReadBeyondEndTest) {
-  uint8_t value8;
-  uint8_t buffer[] = {0x12};
-  BitReader reader1(buffer, sizeof(buffer));
-
-  EXPECT_TRUE(reader1.ReadBits(4, &value8));
-  EXPECT_FALSE(reader1.ReadBits(5, &value8));
-  EXPECT_FALSE(reader1.ReadBits(1, &value8));
-  EXPECT_TRUE(reader1.ReadBits(0, &value8));
-}
-
-TEST(BitReaderTest, SkipBitsTest) {
-  uint8_t value8;
-  uint8_t buffer[] = {0x0a, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-  BitReader reader1(buffer, sizeof(buffer));
-
-  EXPECT_TRUE(reader1.SkipBits(2));
-  EXPECT_TRUE(reader1.ReadBits(3, &value8));
-  EXPECT_EQ(value8, 1);
-  EXPECT_TRUE(reader1.SkipBits(11));
-  EXPECT_TRUE(reader1.ReadBits(8, &value8));
-  EXPECT_EQ(value8, 3);
-  EXPECT_TRUE(reader1.SkipBits(76));
-  EXPECT_TRUE(reader1.ReadBits(4, &value8));
-  EXPECT_EQ(value8, 13);
-  EXPECT_FALSE(reader1.SkipBits(100));
-  EXPECT_TRUE(reader1.SkipBits(0));
-  EXPECT_FALSE(reader1.SkipBits(1));
-}
-
-TEST(BitReaderTest, VariableSkipBitsTest) {
-  uint8_t buffer[256] = {0};
-
-  // The test alternates between ReadBits and SkipBits.
-  // The first number is the number of bits to read, the second one is the
-  // number of bits to skip. The number of bits to read was arbitrarily chosen
-  // while the number of bits to skip was chosen so as to cover from small skips
-  // to large skips.
-  const size_t pattern_read_skip[][2] = {
-      {5, 17},  {4, 34},  {0, 44},  {3, 4},  // Note: aligned read.
-      {7, 7},  // Note: both read&skip cross byte boundary.
-      {17, 68}, {7, 102}, {9, 204}, {3, 408}};
-
-  // Set bits to one only for the first and last bit of each read
-  // in the pattern.
-  size_t pos = 0;
-  for (size_t k = 0; k < arraysize(pattern_read_skip); ++k) {
-    const size_t read_bit_count = pattern_read_skip[k][0];
-    if (read_bit_count > 0) {
-      SetBit(buffer, sizeof(buffer), pos);
-      SetBit(buffer, sizeof(buffer), pos + read_bit_count - 1);
-      pos += read_bit_count;
-    }
-    pos += pattern_read_skip[k][1];
-  }
-
-  // Run the test.
-  BitReader bit_reader(buffer, sizeof(buffer));
-  EXPECT_EQ(bit_reader.bits_available(), static_cast<int>(sizeof(buffer) * 8));
-  for (size_t k = 0; k < arraysize(pattern_read_skip); ++k) {
-    const size_t read_bit_count = pattern_read_skip[k][0];
-    if (read_bit_count > 0) {
-      int value;
-      EXPECT_TRUE(bit_reader.ReadBits(read_bit_count, &value));
-      EXPECT_EQ(value, 1 | (1 << (read_bit_count - 1)));
-    }
-    EXPECT_TRUE(bit_reader.SkipBits(pattern_read_skip[k][1]));
-  }
-}
-
-TEST(BitReaderTest, BitsReadTest) {
-  int value;
-  bool flag;
-  uint8_t buffer[] = {0x0a, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-  BitReader reader1(buffer, sizeof(buffer));
-  EXPECT_EQ(reader1.bits_available(), 120);
-
-  EXPECT_TRUE(reader1.SkipBits(2));
-  EXPECT_EQ(reader1.bits_read(), 2);
-  EXPECT_EQ(reader1.bits_available(), 118);
-  EXPECT_TRUE(reader1.ReadBits(3, &value));
-  EXPECT_EQ(reader1.bits_read(), 5);
-  EXPECT_EQ(reader1.bits_available(), 115);
-  EXPECT_TRUE(reader1.ReadFlag(&flag));
-  EXPECT_EQ(reader1.bits_read(), 6);
-  EXPECT_EQ(reader1.bits_available(), 114);
-  EXPECT_TRUE(reader1.SkipBits(76));
-  EXPECT_EQ(reader1.bits_read(), 82);
-  EXPECT_EQ(reader1.bits_available(), 38);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/bitstream_buffer.cc b/cobalt/media/base/bitstream_buffer.cc
deleted file mode 100644
index 57e32ce..0000000
--- a/cobalt/media/base/bitstream_buffer.cc
+++ /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.
-
-#include "cobalt/media/base/bitstream_buffer.h"
-
-namespace cobalt {
-namespace media {
-
-BitstreamBuffer::BitstreamBuffer()
-    : BitstreamBuffer(-1, base::SharedMemoryHandle(), 0) {}
-
-BitstreamBuffer::BitstreamBuffer(int32_t id, base::SharedMemoryHandle handle,
-                                 size_t size, off_t offset,
-                                 base::TimeDelta presentation_timestamp)
-    : id_(id),
-      handle_(handle),
-      size_(size),
-      offset_(offset),
-      presentation_timestamp_(presentation_timestamp) {}
-
-BitstreamBuffer::BitstreamBuffer(const BitstreamBuffer& other) = default;
-
-BitstreamBuffer::~BitstreamBuffer() {}
-
-void BitstreamBuffer::SetDecryptConfig(const DecryptConfig& decrypt_config) {
-  key_id_ = decrypt_config.key_id();
-  iv_ = decrypt_config.iv();
-  subsamples_ = decrypt_config.subsamples();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/bitstream_buffer.h b/cobalt/media/base/bitstream_buffer.h
deleted file mode 100644
index 34ccbd4..0000000
--- a/cobalt/media/base/bitstream_buffer.h
+++ /dev/null
@@ -1,100 +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 COBALT_MEDIA_BASE_BITSTREAM_BUFFER_H_
-#define COBALT_MEDIA_BASE_BITSTREAM_BUFFER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/memory/shared_memory.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/types.h"
-
-namespace IPC {
-template <class P>
-struct ParamTraits;
-}
-
-namespace cobalt {
-namespace media {
-
-// Class for passing bitstream buffers around.  Does not take ownership of the
-// data.  This is the media-namespace equivalent of PP_VideoBitstreamBuffer_Dev.
-class MEDIA_EXPORT BitstreamBuffer {
- public:
-  BitstreamBuffer();
-
-  // Constructs a new BitstreamBuffer. The content of the bitstream is located
-  // at |offset| bytes away from the start of the shared memory and the payload
-  // is |size| bytes. When not provided, the default value for |offset| is 0.
-  // |presentation_timestamp| is when the decoded frame should be displayed.
-  // When not provided, |presentation_timestamp| will be
-  // |media::kNoTimestamp|.
-  BitstreamBuffer(int32_t id, base::SharedMemoryHandle handle, size_t size,
-                  off_t offset = 0,
-                  base::TimeDelta presentation_timestamp = kNoTimestamp);
-
-  BitstreamBuffer(const BitstreamBuffer& other);
-
-  ~BitstreamBuffer();
-
-  void SetDecryptConfig(const DecryptConfig& decrypt_config);
-
-  int32_t id() const { return id_; }
-  base::SharedMemoryHandle handle() const { return handle_; }
-
-  // The number of bytes of the actual bitstream data. It is the size of the
-  // content instead of the whole shared memory.
-  size_t size() const { return size_; }
-
-  // The offset to the start of actual bitstream data in the shared memory.
-  off_t offset() const { return offset_; }
-
-  // The timestamp is only valid if it's not equal to |media::kNoTimestamp|.
-  base::TimeDelta presentation_timestamp() const {
-    return presentation_timestamp_;
-  }
-
-  void set_handle(const base::SharedMemoryHandle& handle) { handle_ = handle; }
-
-  // The following methods come from DecryptConfig.
-
-  const std::string& key_id() const { return key_id_; }
-  const std::string& iv() const { return iv_; }
-  const std::vector<SubsampleEntry>& subsamples() const { return subsamples_; }
-
- private:
-  int32_t id_;
-  base::SharedMemoryHandle handle_;
-  size_t size_;
-  off_t offset_;
-
-  // This is only set when necessary. For example, AndroidVideoDecodeAccelerator
-  // needs the timestamp because the underlying decoder may require it to
-  // determine the output order.
-  base::TimeDelta presentation_timestamp_;
-
-  // The following fields come from DecryptConfig.
-  // TODO(timav): Try to DISALLOW_COPY_AND_ASSIGN and include these params as
-  // std::unique_ptr<DecryptConfig> or explain why copy & assign is needed.
-
-  std::string key_id_;                      // key ID.
-  std::string iv_;                          // initialization vector
-  std::vector<SubsampleEntry> subsamples_;  // clear/cypher sizes
-
-  friend struct IPC::ParamTraits<media::BitstreamBuffer>;
-
-  // Allow compiler-generated copy & assign constructors.
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_BITSTREAM_BUFFER_H_
diff --git a/cobalt/media/base/buffering_state.h b/cobalt/media/base/buffering_state.h
deleted file mode 100644
index 232b660..0000000
--- a/cobalt/media/base/buffering_state.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_BUFFERING_STATE_H_
-#define COBALT_MEDIA_BASE_BUFFERING_STATE_H_
-
-#include "base/callback_forward.h"
-
-namespace cobalt {
-namespace media {
-
-enum BufferingState {
-  // Indicates that there is no data buffered.
-  //
-  // Typical reason is data underflow and hence playback should be paused.
-  BUFFERING_HAVE_NOTHING,
-
-  // Indicates that enough data has been buffered.
-  //
-  // Typical reason is enough data has been prerolled to start playback.
-  BUFFERING_HAVE_ENOUGH,
-};
-
-// Used to indicate changes in buffering state;
-typedef base::Callback<void(BufferingState)> BufferingStateCB;
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_BUFFERING_STATE_H_
diff --git a/cobalt/media/base/byte_queue.cc b/cobalt/media/base/byte_queue.cc
deleted file mode 100644
index 49ad85c..0000000
--- a/cobalt/media/base/byte_queue.cc
+++ /dev/null
@@ -1,86 +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 <memory>
-
-#include "cobalt/media/base/byte_queue.h"
-
-#include "base/logging.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-// Default starting size for the queue.
-enum { kDefaultQueueSize = 1024 };
-
-ByteQueue::ByteQueue()
-    : buffer_(new uint8_t[kDefaultQueueSize]),
-      size_(kDefaultQueueSize),
-      offset_(0),
-      used_(0) {}
-
-ByteQueue::~ByteQueue() {}
-
-void ByteQueue::Reset() {
-  offset_ = 0;
-  used_ = 0;
-}
-
-void ByteQueue::Push(const uint8_t* data, int size) {
-  DCHECK(data);
-  DCHECK_GT(size, 0);
-
-  size_t size_needed = used_ + size;
-
-  // Check to see if we need a bigger buffer.
-  if (size_needed > size_) {
-    size_t new_size = 2 * size_;
-    while (size_needed > new_size && new_size > size_) new_size *= 2;
-
-    // Sanity check to make sure we didn't overflow.
-    CHECK_GT(new_size, size_);
-
-    std::unique_ptr<uint8_t[]> new_buffer(new uint8_t[new_size]);
-
-    // Copy the data from the old buffer to the start of the new one.
-    if (used_ > 0) memcpy(new_buffer.get(), front(), used_);
-
-    buffer_ = std::move(new_buffer);
-    size_ = new_size;
-    offset_ = 0;
-  } else if ((offset_ + used_ + size) > size_) {
-    // The buffer is big enough, but we need to move the data in the queue.
-    memmove(buffer_.get(), front(), used_);
-    offset_ = 0;
-  }
-
-  memcpy(front() + used_, data, size);
-  used_ += size;
-}
-
-void ByteQueue::Peek(const uint8_t** data, int* size) const {
-  DCHECK(data);
-  DCHECK(size);
-  *data = front();
-  *size = used_;
-}
-
-void ByteQueue::Pop(int count) {
-  DCHECK_LE(count, used_);
-
-  offset_ += count;
-  used_ -= count;
-
-  // Move the offset back to 0 if we have reached the end of the buffer.
-  if (offset_ == size_) {
-    DCHECK_EQ(used_, 0);
-    offset_ = 0;
-  }
-}
-
-uint8_t* ByteQueue::front() const { return buffer_.get() + offset_; }
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/byte_queue.h b/cobalt/media/base/byte_queue.h
deleted file mode 100644
index 3cb6993..0000000
--- a/cobalt/media/base/byte_queue.h
+++ /dev/null
@@ -1,62 +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 COBALT_MEDIA_BASE_BYTE_QUEUE_H_
-#define COBALT_MEDIA_BASE_BYTE_QUEUE_H_
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Represents a queue of bytes.
-// Data is added to the end of the queue via an Push() call and removed via
-// Pop(). The contents of the queue can be observed via the Peek() method.
-// This class manages the underlying storage of the queue and tries to minimize
-// the number of buffer copies when data is appended and removed.
-class MEDIA_EXPORT ByteQueue {
- public:
-  ByteQueue();
-  ~ByteQueue();
-
-  // Reset the queue to the empty state.
-  void Reset();
-
-  // Appends new bytes onto the end of the queue.
-  void Push(const uint8_t* data, int size);
-
-  // Get a pointer to the front of the queue and the queue size.
-  // These values are only valid until the next Push() or
-  // Pop() call.
-  void Peek(const uint8_t** data, int* size) const;
-
-  // Remove |count| bytes from the front of the queue.
-  void Pop(int count);
-
- private:
-  // Returns a pointer to the front of the queue.
-  uint8_t* front() const;
-
-  std::unique_ptr<uint8_t[]> buffer_;
-
-  // Size of |buffer_|.
-  size_t size_;
-
-  // Offset from the start of |buffer_| that marks the front of the queue.
-  size_t offset_;
-
-  // Number of bytes stored in the queue.
-  int used_;
-
-  DISALLOW_COPY_AND_ASSIGN(ByteQueue);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_BYTE_QUEUE_H_
diff --git a/cobalt/media/base/callback_holder.h b/cobalt/media/base/callback_holder.h
deleted file mode 100644
index 07d5855..0000000
--- a/cobalt/media/base/callback_holder.h
+++ /dev/null
@@ -1,91 +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 COBALT_MEDIA_BASE_CALLBACK_HOLDER_H_
-#define COBALT_MEDIA_BASE_CALLBACK_HOLDER_H_
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-
-namespace cobalt {
-namespace media {
-
-// A helper class that can hold a callback from being fired.
-template <typename CB>
-class CallbackHolder {
- public:
-  CallbackHolder() : hold_(false) {}
-
-  ~CallbackHolder() {
-    // Make sure all callbacks are satisfied!
-    DCHECK(!hold_);
-    DCHECK(original_cb_.is_null());
-    DCHECK(held_cb_.is_null());
-  }
-
-  // Sets the callback to be potentially held.
-  void SetCallback(const CB& cb) {
-    DCHECK(original_cb_.is_null());
-    DCHECK(held_cb_.is_null());
-    original_cb_ = cb;
-  }
-
-  bool IsNull() const { return original_cb_.is_null() && held_cb_.is_null(); }
-
-  // Holds the callback when Run() is called.
-  void HoldCallback() { hold_ = true; }
-
-  // Runs or holds the callback as specified by |hold_|.
-  // This method has overloaded versions to support different types of CB.
-  void RunOrHold() {
-    DCHECK(held_cb_.is_null());
-    if (hold_)
-      held_cb_ = base::ResetAndReturn(&original_cb_);
-    else
-      base::ResetAndReturn(&original_cb_).Run();
-  }
-
-  template <typename A1>
-  void RunOrHold(A1 a1) {
-    DCHECK(held_cb_.is_null());
-    if (hold_) {
-      held_cb_ = base::Bind(base::ResetAndReturn(&original_cb_),
-                            internal::TrampolineForward(a1));
-    } else {
-      base::ResetAndReturn(&original_cb_).Run(a1);
-    }
-  }
-
-  template <typename A1, typename A2>
-  void RunOrHold(A1 a1, A2 a2) {
-    DCHECK(held_cb_.is_null());
-    if (hold_) {
-      held_cb_ = base::Bind(base::ResetAndReturn(&original_cb_),
-                            internal::TrampolineForward(a1),
-                            internal::TrampolineForward(a2));
-    } else {
-      base::ResetAndReturn(&original_cb_).Run(a1, a2);
-    }
-  }
-
-  // Releases and runs the held callback.
-  void RunHeldCallback() {
-    DCHECK(hold_);
-    DCHECK(!held_cb_.is_null());
-    hold_ = false;
-    base::ResetAndReturn(&held_cb_).Run();
-  }
-
- private:
-  bool hold_;
-  CB original_cb_;
-  base::Closure held_cb_;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_CALLBACK_HOLDER_H_
diff --git a/cobalt/media/base/callback_holder_unittest.cc b/cobalt/media/base/callback_holder_unittest.cc
deleted file mode 100644
index f075a8c..0000000
--- a/cobalt/media/base/callback_holder_unittest.cc
+++ /dev/null
@@ -1,127 +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 "cobalt/media/base/callback_holder.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-static void SetBool(bool* var) {
-  DCHECK(!*var);
-  *var = true;
-}
-
-static void CopyVar(int var1, int* var2) {
-  DCHECK_NE(var1, *var2);
-  *var2 = var1;
-}
-
-TEST(CallbackHolderTest, SetAfterHold_Closure) {
-  CallbackHolder<base::Closure> cb;
-  EXPECT_TRUE(cb.IsNull());
-
-  cb.HoldCallback();
-
-  bool closure_called = false;
-  cb.SetCallback(base::Bind(&SetBool, &closure_called));
-  EXPECT_FALSE(cb.IsNull());
-
-  cb.RunOrHold();
-  EXPECT_FALSE(closure_called);
-
-  EXPECT_FALSE(cb.IsNull());
-  cb.RunHeldCallback();
-  EXPECT_TRUE(cb.IsNull());
-  EXPECT_TRUE(closure_called);
-}
-
-TEST(CallbackHolderTest, HoldAfterSet_Closure) {
-  CallbackHolder<base::Closure> cb;
-  EXPECT_TRUE(cb.IsNull());
-
-  bool closure_called = false;
-  cb.SetCallback(base::Bind(&SetBool, &closure_called));
-  EXPECT_FALSE(cb.IsNull());
-
-  cb.HoldCallback();
-
-  cb.RunOrHold();
-  EXPECT_FALSE(closure_called);
-  EXPECT_FALSE(cb.IsNull());
-  cb.RunHeldCallback();
-  EXPECT_TRUE(cb.IsNull());
-  EXPECT_TRUE(closure_called);
-}
-
-TEST(CallbackHolderTest, NotHold_Closure) {
-  CallbackHolder<base::Closure> cb;
-  EXPECT_TRUE(cb.IsNull());
-
-  bool closure_called = false;
-  cb.SetCallback(base::Bind(&SetBool, &closure_called));
-  EXPECT_FALSE(cb.IsNull());
-
-  cb.RunOrHold();
-  EXPECT_TRUE(cb.IsNull());
-  EXPECT_TRUE(closure_called);
-}
-
-TEST(CallbackHolderTest, SetAfterHold_Callback) {
-  CallbackHolder<base::Callback<void(int, int*)> > cb;
-  EXPECT_TRUE(cb.IsNull());
-
-  cb.HoldCallback();
-
-  cb.SetCallback(base::Bind(&CopyVar));
-  EXPECT_FALSE(cb.IsNull());
-
-  int var1 = 100;
-  int var2 = 0;
-  cb.RunOrHold(var1, &var2);
-  EXPECT_FALSE(cb.IsNull());
-  EXPECT_NE(var1, var2);
-
-  cb.RunHeldCallback();
-  EXPECT_TRUE(cb.IsNull());
-  EXPECT_EQ(var1, var2);
-}
-
-TEST(CallbackHolderTest, HoldAfterSet_Callback) {
-  CallbackHolder<base::Callback<void(int, int*)> > cb;
-  EXPECT_TRUE(cb.IsNull());
-
-  cb.SetCallback(base::Bind(&CopyVar));
-  EXPECT_FALSE(cb.IsNull());
-
-  cb.HoldCallback();
-
-  int var1 = 100;
-  int var2 = 0;
-  cb.RunOrHold(var1, &var2);
-  EXPECT_FALSE(cb.IsNull());
-  EXPECT_NE(var1, var2);
-
-  cb.RunHeldCallback();
-  EXPECT_TRUE(cb.IsNull());
-  EXPECT_EQ(var1, var2);
-}
-
-TEST(CallbackHolderTest, NotHold_Callback) {
-  CallbackHolder<base::Callback<void(int, int*)> > cb;
-  EXPECT_TRUE(cb.IsNull());
-
-  cb.SetCallback(base::Bind(&CopyVar));
-  EXPECT_FALSE(cb.IsNull());
-
-  int var1 = 100;
-  int var2 = 0;
-  cb.RunOrHold(var1, &var2);
-  EXPECT_TRUE(cb.IsNull());
-  EXPECT_EQ(var1, var2);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/channel_layout.cc b/cobalt/media/base/channel_layout.cc
deleted file mode 100644
index f24410d..0000000
--- a/cobalt/media/base/channel_layout.cc
+++ /dev/null
@@ -1,269 +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 "cobalt/media/base/channel_layout.h"
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-static const int kLayoutToChannels[] = {
-    0,  // CHANNEL_LAYOUT_NONE
-    0,  // CHANNEL_LAYOUT_UNSUPPORTED
-    1,  // CHANNEL_LAYOUT_MONO
-    2,  // CHANNEL_LAYOUT_STEREO
-    3,  // CHANNEL_LAYOUT_2_1
-    3,  // CHANNEL_LAYOUT_SURROUND
-    4,  // CHANNEL_LAYOUT_4_0
-    4,  // CHANNEL_LAYOUT_2_2
-    4,  // CHANNEL_LAYOUT_QUAD
-    5,  // CHANNEL_LAYOUT_5_0
-    6,  // CHANNEL_LAYOUT_5_1
-    5,  // CHANNEL_LAYOUT_5_0_BACK
-    6,  // CHANNEL_LAYOUT_5_1_BACK
-    7,  // CHANNEL_LAYOUT_7_0
-    8,  // CHANNEL_LAYOUT_7_1
-    8,  // CHANNEL_LAYOUT_7_1_WIDE
-    2,  // CHANNEL_LAYOUT_STEREO_DOWNMIX
-    3,  // CHANNEL_LAYOUT_2POINT1
-    4,  // CHANNEL_LAYOUT_3_1
-    5,  // CHANNEL_LAYOUT_4_1
-    6,  // CHANNEL_LAYOUT_6_0
-    6,  // CHANNEL_LAYOUT_6_0_FRONT
-    6,  // CHANNEL_LAYOUT_HEXAGONAL
-    7,  // CHANNEL_LAYOUT_6_1
-    7,  // CHANNEL_LAYOUT_6_1_BACK
-    7,  // CHANNEL_LAYOUT_6_1_FRONT
-    7,  // CHANNEL_LAYOUT_7_0_FRONT
-    8,  // CHANNEL_LAYOUT_7_1_WIDE_BACK
-    8,  // CHANNEL_LAYOUT_OCTAGONAL
-    0,  // CHANNEL_LAYOUT_DISCRETE
-    3,  // CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC
-    5,  // CHANNEL_LAYOUT_4_1_QUAD_SIDE
-};
-
-// The channel orderings for each layout as specified by FFmpeg. Each value
-// represents the index of each channel in each layout.  Values of -1 mean the
-// channel at that index is not used for that layout. For example, the left side
-// surround sound channel in FFmpeg's 5.1 layout is in the 5th position (because
-// the order is L, R, C, LFE, LS, RS), so
-// kChannelOrderings[CHANNEL_LAYOUT_5_1][SIDE_LEFT] = 4;
-static const int kChannelOrderings[CHANNEL_LAYOUT_MAX + 1][CHANNELS_MAX + 1] = {
-    // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR
-
-    // CHANNEL_LAYOUT_NONE
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_UNSUPPORTED
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_MONO
-    {-1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_STEREO
-    {0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_2_1
-    {0, 1, -1, -1, -1, -1, -1, -1, 2, -1, -1},
-
-    // CHANNEL_LAYOUT_SURROUND
-    {0, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_4_0
-    {0, 1, 2, -1, -1, -1, -1, -1, 3, -1, -1},
-
-    // CHANNEL_LAYOUT_2_2
-    {0, 1, -1, -1, -1, -1, -1, -1, -1, 2, 3},
-
-    // CHANNEL_LAYOUT_QUAD
-    {0, 1, -1, -1, 2, 3, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_5_0
-    {0, 1, 2, -1, -1, -1, -1, -1, -1, 3, 4},
-
-    // CHANNEL_LAYOUT_5_1
-    {0, 1, 2, 3, -1, -1, -1, -1, -1, 4, 5},
-
-    // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR
-
-    // CHANNEL_LAYOUT_5_0_BACK
-    {0, 1, 2, -1, 3, 4, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_5_1_BACK
-    {0, 1, 2, 3, 4, 5, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_7_0
-    {0, 1, 2, -1, 5, 6, -1, -1, -1, 3, 4},
-
-    // CHANNEL_LAYOUT_7_1
-    {0, 1, 2, 3, 6, 7, -1, -1, -1, 4, 5},
-
-    // CHANNEL_LAYOUT_7_1_WIDE
-    {0, 1, 2, 3, -1, -1, 6, 7, -1, 4, 5},
-
-    // CHANNEL_LAYOUT_STEREO_DOWNMIX
-    {0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_2POINT1
-    {0, 1, -1, 2, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_3_1
-    {0, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_4_1
-    {0, 1, 2, 4, -1, -1, -1, -1, 3, -1, -1},
-
-    // CHANNEL_LAYOUT_6_0
-    {0, 1, 2, -1, -1, -1, -1, -1, 5, 3, 4},
-
-    // CHANNEL_LAYOUT_6_0_FRONT
-    {0, 1, -1, -1, -1, -1, 4, 5, -1, 2, 3},
-
-    // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR
-
-    // CHANNEL_LAYOUT_HEXAGONAL
-    {0, 1, 2, -1, 3, 4, -1, -1, 5, -1, -1},
-
-    // CHANNEL_LAYOUT_6_1
-    {0, 1, 2, 3, -1, -1, -1, -1, 6, 4, 5},
-
-    // CHANNEL_LAYOUT_6_1_BACK
-    {0, 1, 2, 3, 4, 5, -1, -1, 6, -1, -1},
-
-    // CHANNEL_LAYOUT_6_1_FRONT
-    {0, 1, -1, 6, -1, -1, 4, 5, -1, 2, 3},
-
-    // CHANNEL_LAYOUT_7_0_FRONT
-    {0, 1, 2, -1, -1, -1, 5, 6, -1, 3, 4},
-
-    // CHANNEL_LAYOUT_7_1_WIDE_BACK
-    {0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_OCTAGONAL
-    {0, 1, 2, -1, 5, 6, -1, -1, 7, 3, 4},
-
-    // CHANNEL_LAYOUT_DISCRETE
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC
-    {0, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1},
-
-    // CHANNEL_LAYOUT_4_1_QUAD_SIDE
-    {0, 1, -1, 4, -1, -1, -1, -1, -1, 2, 3},
-
-    // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR
-};
-
-int ChannelLayoutToChannelCount(ChannelLayout layout) {
-  DCHECK_LT(static_cast<size_t>(layout), arraysize(kLayoutToChannels));
-  return kLayoutToChannels[layout];
-}
-
-// Converts a channel count into a channel layout.
-ChannelLayout GuessChannelLayout(int channels) {
-  switch (channels) {
-    case 1:
-      return CHANNEL_LAYOUT_MONO;
-    case 2:
-      return CHANNEL_LAYOUT_STEREO;
-    case 3:
-      return CHANNEL_LAYOUT_SURROUND;
-    case 4:
-      return CHANNEL_LAYOUT_QUAD;
-    case 5:
-      return CHANNEL_LAYOUT_5_0;
-    case 6:
-      return CHANNEL_LAYOUT_5_1;
-    case 7:
-      return CHANNEL_LAYOUT_6_1;
-    case 8:
-      return CHANNEL_LAYOUT_7_1;
-    default:
-      DVLOG(1) << "Unsupported channel count: " << channels;
-  }
-  return CHANNEL_LAYOUT_UNSUPPORTED;
-}
-
-int ChannelOrder(ChannelLayout layout, Channels channel) {
-  DCHECK_LT(static_cast<size_t>(layout), arraysize(kChannelOrderings));
-  DCHECK_LT(static_cast<size_t>(channel), arraysize(kChannelOrderings[0]));
-  return kChannelOrderings[layout][channel];
-}
-
-const char* ChannelLayoutToString(ChannelLayout layout) {
-  switch (layout) {
-    case CHANNEL_LAYOUT_NONE:
-      return "NONE";
-    case CHANNEL_LAYOUT_UNSUPPORTED:
-      return "UNSUPPORTED";
-    case CHANNEL_LAYOUT_MONO:
-      return "MONO";
-    case CHANNEL_LAYOUT_STEREO:
-      return "STEREO";
-    case CHANNEL_LAYOUT_2_1:
-      return "2.1";
-    case CHANNEL_LAYOUT_SURROUND:
-      return "SURROUND";
-    case CHANNEL_LAYOUT_4_0:
-      return "4.0";
-    case CHANNEL_LAYOUT_2_2:
-      return "QUAD_SIDE";
-    case CHANNEL_LAYOUT_QUAD:
-      return "QUAD";
-    case CHANNEL_LAYOUT_5_0:
-      return "5.0";
-    case CHANNEL_LAYOUT_5_1:
-      return "5.1";
-    case CHANNEL_LAYOUT_5_0_BACK:
-      return "5.0_BACK";
-    case CHANNEL_LAYOUT_5_1_BACK:
-      return "5.1_BACK";
-    case CHANNEL_LAYOUT_7_0:
-      return "7.0";
-    case CHANNEL_LAYOUT_7_1:
-      return "7.1";
-    case CHANNEL_LAYOUT_7_1_WIDE:
-      return "7.1_WIDE";
-    case CHANNEL_LAYOUT_STEREO_DOWNMIX:
-      return "STEREO_DOWNMIX";
-    case CHANNEL_LAYOUT_2POINT1:
-      return "2POINT1";
-    case CHANNEL_LAYOUT_3_1:
-      return "3.1";
-    case CHANNEL_LAYOUT_4_1:
-      return "4.1";
-    case CHANNEL_LAYOUT_6_0:
-      return "6.0";
-    case CHANNEL_LAYOUT_6_0_FRONT:
-      return "6.0_FRONT";
-    case CHANNEL_LAYOUT_HEXAGONAL:
-      return "HEXAGONAL";
-    case CHANNEL_LAYOUT_6_1:
-      return "6.1";
-    case CHANNEL_LAYOUT_6_1_BACK:
-      return "6.1_BACK";
-    case CHANNEL_LAYOUT_6_1_FRONT:
-      return "6.1_FRONT";
-    case CHANNEL_LAYOUT_7_0_FRONT:
-      return "7.0_FRONT";
-    case CHANNEL_LAYOUT_7_1_WIDE_BACK:
-      return "7.1_WIDE_BACK";
-    case CHANNEL_LAYOUT_OCTAGONAL:
-      return "OCTAGONAL";
-    case CHANNEL_LAYOUT_DISCRETE:
-      return "DISCRETE";
-    case CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC:
-      return "STEREO_AND_KEYBOARD_MIC";
-    case CHANNEL_LAYOUT_4_1_QUAD_SIDE:
-      return "4.1_QUAD_SIDE";
-  }
-  NOTREACHED() << "Invalid channel layout provided: " << layout;
-  return "";
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/channel_layout.h b/cobalt/media/base/channel_layout.h
deleted file mode 100644
index 8d370b6..0000000
--- a/cobalt/media/base/channel_layout.h
+++ /dev/null
@@ -1,150 +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 COBALT_MEDIA_BASE_CHANNEL_LAYOUT_H_
-#define COBALT_MEDIA_BASE_CHANNEL_LAYOUT_H_
-
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// Enumerates the various representations of the ordering of audio channels.
-// Logged to UMA, so never reuse a value, always add new/greater ones!
-enum ChannelLayout {
-  CHANNEL_LAYOUT_NONE = 0,
-  CHANNEL_LAYOUT_UNSUPPORTED = 1,
-
-  // Front C
-  CHANNEL_LAYOUT_MONO = 2,
-
-  // Front L, Front R
-  CHANNEL_LAYOUT_STEREO = 3,
-
-  // Front L, Front R, Back C
-  CHANNEL_LAYOUT_2_1 = 4,
-
-  // Front L, Front R, Front C
-  CHANNEL_LAYOUT_SURROUND = 5,
-
-  // Front L, Front R, Front C, Back C
-  CHANNEL_LAYOUT_4_0 = 6,
-
-  // Front L, Front R, Side L, Side R
-  CHANNEL_LAYOUT_2_2 = 7,
-
-  // Front L, Front R, Back L, Back R
-  CHANNEL_LAYOUT_QUAD = 8,
-
-  // Front L, Front R, Front C, Side L, Side R
-  CHANNEL_LAYOUT_5_0 = 9,
-
-  // Front L, Front R, Front C, LFE, Side L, Side R
-  CHANNEL_LAYOUT_5_1 = 10,
-
-  // Front L, Front R, Front C, Back L, Back R
-  CHANNEL_LAYOUT_5_0_BACK = 11,
-
-  // Front L, Front R, Front C, LFE, Back L, Back R
-  CHANNEL_LAYOUT_5_1_BACK = 12,
-
-  // Front L, Front R, Front C, Side L, Side R, Back L, Back R
-  CHANNEL_LAYOUT_7_0 = 13,
-
-  // Front L, Front R, Front C, LFE, Side L, Side R, Back L, Back R
-  CHANNEL_LAYOUT_7_1 = 14,
-
-  // Front L, Front R, Front C, LFE, Side L, Side R, Front LofC, Front RofC
-  CHANNEL_LAYOUT_7_1_WIDE = 15,
-
-  // Stereo L, Stereo R
-  CHANNEL_LAYOUT_STEREO_DOWNMIX = 16,
-
-  // Stereo L, Stereo R, LFE
-  CHANNEL_LAYOUT_2POINT1 = 17,
-
-  // Stereo L, Stereo R, Front C, LFE
-  CHANNEL_LAYOUT_3_1 = 18,
-
-  // Stereo L, Stereo R, Front C, Rear C, LFE
-  CHANNEL_LAYOUT_4_1 = 19,
-
-  // Stereo L, Stereo R, Front C, Side L, Side R, Back C
-  CHANNEL_LAYOUT_6_0 = 20,
-
-  // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC
-  CHANNEL_LAYOUT_6_0_FRONT = 21,
-
-  // Stereo L, Stereo R, Front C, Rear L, Rear R, Rear C
-  CHANNEL_LAYOUT_HEXAGONAL = 22,
-
-  // Stereo L, Stereo R, Front C, LFE, Side L, Side R, Rear Center
-  CHANNEL_LAYOUT_6_1 = 23,
-
-  // Stereo L, Stereo R, Front C, LFE, Back L, Back R, Rear Center
-  CHANNEL_LAYOUT_6_1_BACK = 24,
-
-  // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC, LFE
-  CHANNEL_LAYOUT_6_1_FRONT = 25,
-
-  // Front L, Front R, Front C, Side L, Side R, Front LofC, Front RofC
-  CHANNEL_LAYOUT_7_0_FRONT = 26,
-
-  // Front L, Front R, Front C, LFE, Back L, Back R, Front LofC, Front RofC
-  CHANNEL_LAYOUT_7_1_WIDE_BACK = 27,
-
-  // Front L, Front R, Front C, Side L, Side R, Rear L, Back R, Back C.
-  CHANNEL_LAYOUT_OCTAGONAL = 28,
-
-  // Channels are not explicitly mapped to speakers.
-  CHANNEL_LAYOUT_DISCRETE = 29,
-
-  // Front L, Front R, Front C. Front C contains the keyboard mic audio. This
-  // layout is only intended for input for WebRTC. The Front C channel
-  // is stripped away in the WebRTC audio input pipeline and never seen outside
-  // of that.
-  CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC = 30,
-
-  // Front L, Front R, Side L, Side R, LFE
-  CHANNEL_LAYOUT_4_1_QUAD_SIDE = 31,
-
-  // Max value, must always equal the largest entry ever logged.
-  CHANNEL_LAYOUT_MAX = CHANNEL_LAYOUT_4_1_QUAD_SIDE
-};
-
-enum Channels {
-  LEFT = 0,
-  RIGHT,
-  CENTER,
-  LFE,
-  BACK_LEFT,
-  BACK_RIGHT,
-  LEFT_OF_CENTER,
-  RIGHT_OF_CENTER,
-  BACK_CENTER,
-  SIDE_LEFT,
-  SIDE_RIGHT,
-  CHANNELS_MAX =
-      SIDE_RIGHT,  // Must always equal the largest value ever logged.
-};
-
-// Returns the expected channel position in an interleaved stream.  Values of -1
-// mean the channel at that index is not used for that layout.  Values range
-// from 0 to ChannelLayoutToChannelCount(layout) - 1.
-MEDIA_EXPORT int ChannelOrder(ChannelLayout layout, Channels channel);
-
-// Returns the number of channels in a given ChannelLayout.
-MEDIA_EXPORT int ChannelLayoutToChannelCount(ChannelLayout layout);
-
-// Given the number of channels, return the best layout,
-// or return CHANNEL_LAYOUT_UNSUPPORTED if there is no good match.
-MEDIA_EXPORT ChannelLayout GuessChannelLayout(int channels);
-
-// Returns a string representation of the channel layout.
-MEDIA_EXPORT const char* ChannelLayoutToString(ChannelLayout layout);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_CHANNEL_LAYOUT_H_
diff --git a/cobalt/media/base/color_space.cc b/cobalt/media/base/color_space.cc
deleted file mode 100644
index 7daabb1..0000000
--- a/cobalt/media/base/color_space.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/media/base/color_space.h"
-
-#include "starboard/memory.h"
-
-namespace gfx {
-
-ColorSpace::PrimaryID ColorSpace::PrimaryIDFromInt(int primary_id) {
-  if (primary_id < 0 || primary_id > static_cast<int>(kPrimaryIdLast))
-    return kPrimaryIdUnknown;
-  if (primary_id > static_cast<int>(kPrimaryIdLastStandardValue) &&
-      primary_id < 1000)
-    return kPrimaryIdUnknown;
-  return static_cast<PrimaryID>(primary_id);
-}
-
-ColorSpace::TransferID ColorSpace::TransferIDFromInt(int transfer_id) {
-  if (transfer_id < 0 || transfer_id > static_cast<int>(kTransferIdLast))
-    return kTransferIdUnknown;
-  if (transfer_id > static_cast<int>(kTransferIdLastStandardValue) &&
-      transfer_id < 1000)
-    return kTransferIdUnknown;
-  return static_cast<TransferID>(transfer_id);
-}
-
-ColorSpace::MatrixID ColorSpace::MatrixIDFromInt(int matrix_id) {
-  if (matrix_id < 0 || matrix_id > static_cast<int>(kMatrixIdLast))
-    return kMatrixIdUnknown;
-  if (matrix_id > static_cast<int>(kMatrixIdLastStandardValue) &&
-      matrix_id < 1000)
-    return kMatrixIdUnknown;
-  return static_cast<MatrixID>(matrix_id);
-}
-
-ColorSpace::ColorSpace()
-    : primaries_(kPrimaryIdUnspecified),
-      transfer_(kTransferIdUnspecified),
-      matrix_(kMatrixIdUnspecified),
-      range_(kRangeIdLimited) {
-  memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_));
-}
-
-ColorSpace::ColorSpace(PrimaryID primaries, TransferID transfer,
-                       MatrixID matrix, RangeID range)
-    : primaries_(primaries),
-      transfer_(transfer),
-      matrix_(matrix),
-      range_(range) {
-  memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_));
-}
-
-ColorSpace::ColorSpace(int primaries, int transfer, int matrix, RangeID range)
-    : primaries_(PrimaryIDFromInt(primaries)),
-      transfer_(TransferIDFromInt(transfer)),
-      matrix_(MatrixIDFromInt(matrix)),
-      range_(range) {
-  memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_));
-}
-
-ColorSpace::ColorSpace(const ColorSpace& other)
-    : primaries_(other.primaries_),
-      transfer_(other.transfer_),
-      matrix_(other.matrix_),
-      range_(other.range_) {
-  memcpy(custom_primary_matrix_, other.custom_primary_matrix_,
-               sizeof(custom_primary_matrix_));
-}
-
-ColorSpace::~ColorSpace() {}
-
-// Static
-ColorSpace ColorSpace::CreateXYZD50() {
-  return ColorSpace(kPrimaryIdXyzD50, kTransferIdLinear, kMatrixIdRgb,
-                    kRangeIdFull);
-}
-
-// static
-ColorSpace ColorSpace::CreateJpeg() {
-  return ColorSpace(kPrimaryIdBt709, kTransferIdIec6196621, kMatrixIdBt709,
-                    kRangeIdFull);
-}
-
-// static
-ColorSpace ColorSpace::CreateREC601() {
-  return ColorSpace(kPrimaryIdSmpte170M, kTransferIdSmpte170M,
-                    kMatrixIdSmpte170M, kRangeIdLimited);
-}
-
-// static
-ColorSpace ColorSpace::CreateREC709() {
-  return ColorSpace(kPrimaryIdBt709, kTransferIdBt709, kMatrixIdBt709,
-                    kRangeIdLimited);
-}
-
-bool ColorSpace::operator==(const ColorSpace& other) const {
-  if (primaries_ != other.primaries_ || transfer_ != other.transfer_ ||
-      matrix_ != other.matrix_ || range_ != other.range_)
-    return false;
-  if (primaries_ == kPrimaryIdCustom &&
-      memcmp(custom_primary_matrix_, other.custom_primary_matrix_,
-             sizeof(custom_primary_matrix_)))
-    return false;
-  return true;
-}
-
-bool ColorSpace::operator!=(const ColorSpace& other) const {
-  return !(*this == other);
-}
-
-bool ColorSpace::operator<(const ColorSpace& other) const {
-  if (primaries_ < other.primaries_) return true;
-  if (primaries_ > other.primaries_) return false;
-  if (transfer_ < other.transfer_) return true;
-  if (transfer_ > other.transfer_) return false;
-  if (matrix_ < other.matrix_) return true;
-  if (matrix_ > other.matrix_) return false;
-  if (range_ < other.range_) return true;
-  if (range_ > other.range_) return false;
-  if (primaries_ == kPrimaryIdCustom) {
-    int primary_result =
-        memcmp(custom_primary_matrix_, other.custom_primary_matrix_,
-                        sizeof(custom_primary_matrix_));
-    if (primary_result < 0) return true;
-    if (primary_result > 0) return false;
-  }
-  return false;
-}
-
-}  // namespace gfx
diff --git a/cobalt/media/base/color_space.h b/cobalt/media/base/color_space.h
deleted file mode 100644
index 281e7eb..0000000
--- a/cobalt/media/base/color_space.h
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_MEDIA_BASE_COLOR_SPACE_H_
-#define COBALT_MEDIA_BASE_COLOR_SPACE_H_
-
-#include "base/logging.h"
-
-// This is a modified version of gfx::ColorSpace with Skia dependency removed.
-// It is tentatively put inside media to avoid introducing new code into
-// ui/gfx.  It will be further simplified and merged into media in follow up
-// refactors.
-namespace gfx {
-
-// Used to represent a color space for the purpose of color conversion.
-// This is designed to be safe and compact enough to send over IPC
-// between any processes.
-class ColorSpace {
- public:
-  typedef float CustomPrimaryMatrix[12];
-
-  enum PrimaryID {
-    // The first 0-255 values should match the H264 specification (see Table E-3
-    // Colour Primaries in https://www.itu.int/rec/T-REC-H.264/en).
-    kPrimaryIdReserved0 = 0,
-    kPrimaryIdBt709 = 1,
-    kPrimaryIdUnspecified = 2,
-    kPrimaryIdReserved = 3,
-    kPrimaryIdBt470M = 4,
-    kPrimaryIdBt470Bg = 5,
-    kPrimaryIdSmpte170M = 6,
-    kPrimaryIdSmpte240M = 7,
-    kPrimaryIdFilm = 8,
-    kPrimaryIdBt2020 = 9,
-    kPrimaryIdSmpteSt4281 = 10,
-    kPrimaryIdSmpteSt4312 = 11,
-    kPrimaryIdSmpteSt4321 = 12,
-
-    kPrimaryIdLastStandardValue = kPrimaryIdSmpteSt4321,
-
-    // Chrome-specific values start at 1000.
-    kPrimaryIdUnknown = 1000,
-    kPrimaryIdXyzD50,
-    kPrimaryIdCustom,
-    kPrimaryIdLast = kPrimaryIdCustom
-  };
-
-  enum TransferID {
-    // The first 0-255 values should match the H264 specification (see Table E-4
-    // Transfer Characteristics in https://www.itu.int/rec/T-REC-H.264/en).
-    kTransferIdReserved0 = 0,
-    kTransferIdBt709 = 1,
-    kTransferIdUnspecified = 2,
-    kTransferIdReserved = 3,
-    kTransferIdGamma22 = 4,
-    kTransferIdGamma28 = 5,
-    kTransferIdSmpte170M = 6,
-    kTransferIdSmpte240M = 7,
-    kTransferIdLinear = 8,
-    kTransferIdLog = 9,
-    kTransferIdLogSqrt = 10,
-    kTransferIdIec6196624 = 11,
-    kTransferIdBt1361Ecg = 12,
-    kTransferIdIec6196621 = 13,
-    kTransferId10BitBt2020 = 14,
-    kTransferId12BitBt2020 = 15,
-    kTransferIdSmpteSt2084 = 16,
-    kTransferIdSmpteSt4281 = 17,
-    kTransferIdAribStdB67 = 18,  // AKA hybrid-log gamma, HLG.
-
-    kTransferIdLastStandardValue = kTransferIdSmpteSt4281,
-
-    // Chrome-specific values start at 1000.
-    kTransferIdUnknown = 1000,
-    kTransferIdGamma24,
-
-    // This is an ad-hoc transfer function that decodes SMPTE 2084 content
-    // into a 0-1 range more or less suitable for viewing on a non-hdr
-    // display.
-    kTransferIdSmpteSt2084NonHdr,
-
-    // TODO(hubbe): Need to store an approximation of the gamma function(s).
-    kTransferIdCustom,
-    kTransferIdLast = kTransferIdCustom,
-  };
-
-  enum MatrixID {
-    // The first 0-255 values should match the H264 specification (see Table E-5
-    // Matrix Coefficients in https://www.itu.int/rec/T-REC-H.264/en).
-    kMatrixIdRgb = 0,
-    kMatrixIdBt709 = 1,
-    kMatrixIdUnspecified = 2,
-    kMatrixIdReserved = 3,
-    kMatrixIdFcc = 4,
-    kMatrixIdBt470Bg = 5,
-    kMatrixIdSmpte170M = 6,
-    kMatrixIdSmpte240M = 7,
-    kMatrixIdYCgCo = 8,
-    kMatrixIdBt2020NonconstantLuminance = 9,
-    kMatrixIdBt2020ConstantLuminance = 10,
-    kMatrixIdYDzDx = 11,
-
-    kMatrixIdLastStandardValue = kMatrixIdYDzDx,
-
-    // Chrome-specific values start at 1000
-    kMatrixIdUnknown = 1000,
-    kMatrixIdLast = kMatrixIdUnknown,
-  };
-
-  // This corresponds to the WebM Range enum which is part of WebM color data
-  // (see http://www.webmproject.org/docs/container/#Range).
-  // H.264 only uses a bool, which corresponds to the LIMITED/FULL values.
-  // Chrome-specific values start at 1000.
-  enum RangeID {
-    // Range is not explicitly specified / unknown.
-    kRangeIdUnspecified = 0,
-
-    // Limited Rec. 709 color range with RGB values ranging from 16 to 235.
-    kRangeIdLimited = 1,
-
-    // Full RGB color range with RGB values from 0 to 255.
-    kRangeIdFull = 2,
-
-    // Range is defined by TransferID/MatrixID.
-    kRangeIdDerived = 3,
-
-    kRangeIdLast = kRangeIdDerived
-  };
-
-  ColorSpace();
-  ColorSpace(PrimaryID primaries, TransferID transfer, MatrixID matrix,
-             RangeID full_range);
-  ColorSpace(const ColorSpace& other);
-  ColorSpace(int primaries, int transfer, int matrix, RangeID full_range);
-  ~ColorSpace();
-
-  static PrimaryID PrimaryIDFromInt(int primary_id);
-  static TransferID TransferIDFromInt(int transfer_id);
-  static MatrixID MatrixIDFromInt(int matrix_id);
-
-  static ColorSpace CreateXYZD50();
-
-  // TODO: Remove these, and replace with more generic constructors.
-  static ColorSpace CreateJpeg();
-  static ColorSpace CreateREC601();
-  static ColorSpace CreateREC709();
-
-  bool operator==(const ColorSpace& other) const;
-  bool operator!=(const ColorSpace& other) const;
-  bool operator<(const ColorSpace& other) const;
-
-  PrimaryID primaries() const { return primaries_; }
-  TransferID transfer() const { return transfer_; }
-  MatrixID matrix() const { return matrix_; }
-  RangeID range() const { return range_; }
-
-  const CustomPrimaryMatrix& custom_primary_matrix() const {
-    DCHECK_EQ(primaries_, kPrimaryIdCustom);
-    return custom_primary_matrix_;
-  }
-
- private:
-  PrimaryID primaries_;
-  TransferID transfer_;
-  MatrixID matrix_;
-  RangeID range_;
-
-  // Only used if primaries_ == kPrimaryIdCustom
-  float custom_primary_matrix_[12];
-};
-
-}  // namespace gfx
-
-#endif  // COBALT_MEDIA_BASE_COLOR_SPACE_H_
diff --git a/cobalt/media/base/container_names.cc b/cobalt/media/base/container_names.cc
deleted file mode 100644
index 3ba334b..0000000
--- a/cobalt/media/base/container_names.cc
+++ /dev/null
@@ -1,1605 +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.
-
-#include "cobalt/media/base/container_names.h"
-
-#include <cctype>
-#include <limits>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/numerics/safe_conversions.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "starboard/common/string.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-namespace container_names {
-
-#define TAG(a, b, c, d)                                     \
-  ((static_cast<uint32_t>(static_cast<uint8_t>(a)) << 24) | \
-   (static_cast<uint32_t>(static_cast<uint8_t>(b)) << 16) | \
-   (static_cast<uint32_t>(static_cast<uint8_t>(c)) << 8) |  \
-   (static_cast<uint32_t>(static_cast<uint8_t>(d))))
-
-#define RCHECK(x)           \
-  do {                      \
-    if (!(x)) return false; \
-  } while (0)
-
-#define UTF8_BYTE_ORDER_MARK "\xef\xbb\xbf"
-
-// Helper function to read 2 bytes (16 bits, big endian) from a buffer.
-static int Read16(const uint8_t* p) { return p[0] << 8 | p[1]; }
-
-// Helper function to read 3 bytes (24 bits, big endian) from a buffer.
-static uint32_t Read24(const uint8_t* p) {
-  return p[0] << 16 | p[1] << 8 | p[2];
-}
-
-// Helper function to read 4 bytes (32 bits, big endian) from a buffer.
-static uint32_t Read32(const uint8_t* p) {
-  return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
-}
-
-// Helper function to read 4 bytes (32 bits, little endian) from a buffer.
-static uint32_t Read32LE(const uint8_t* p) {
-  return p[3] << 24 | p[2] << 16 | p[1] << 8 | p[0];
-}
-
-// Helper function to do buffer comparisons with a string without going off the
-// end of the buffer.
-static bool StartsWith(const uint8_t* buffer, size_t buffer_size,
-                       const char* prefix) {
-  size_t prefix_size = strlen(prefix);
-  return (prefix_size <= buffer_size &&
-          memcmp(buffer, prefix, prefix_size) == 0);
-}
-
-// Helper function to do buffer comparisons with another buffer (to allow for
-// embedded \0 in the comparison) without going off the end of the buffer.
-static bool StartsWith(const uint8_t* buffer, size_t buffer_size,
-                       const uint8_t* prefix, size_t prefix_size) {
-  return (prefix_size <= buffer_size &&
-          memcmp(buffer, prefix, prefix_size) == 0);
-}
-
-// Helper function to read up to 64 bits from a bit stream.
-static uint64_t ReadBits(BitReader* reader, int num_bits) {
-  DCHECK_GE(reader->bits_available(), num_bits);
-  DCHECK((num_bits > 0) && (num_bits <= 64));
-  uint64_t value;
-  reader->ReadBits(num_bits, &value);
-  return value;
-}
-
-const int kAc3FrameSizeTable[38][3] = {
-    {128, 138, 192},    {128, 140, 192},    {160, 174, 240},
-    {160, 176, 240},    {192, 208, 288},    {192, 210, 288},
-    {224, 242, 336},    {224, 244, 336},    {256, 278, 384},
-    {256, 280, 384},    {320, 348, 480},    {320, 350, 480},
-    {384, 416, 576},    {384, 418, 576},    {448, 486, 672},
-    {448, 488, 672},    {512, 556, 768},    {512, 558, 768},
-    {640, 696, 960},    {640, 698, 960},    {768, 834, 1152},
-    {768, 836, 1152},   {896, 974, 1344},   {896, 976, 1344},
-    {1024, 1114, 1536}, {1024, 1116, 1536}, {1280, 1392, 1920},
-    {1280, 1394, 1920}, {1536, 1670, 2304}, {1536, 1672, 2304},
-    {1792, 1950, 2688}, {1792, 1952, 2688}, {2048, 2228, 3072},
-    {2048, 2230, 3072}, {2304, 2506, 3456}, {2304, 2508, 3456},
-    {2560, 2768, 3840}, {2560, 2770, 3840}};
-
-// Checks for an ADTS AAC container.
-static bool CheckAac(const uint8_t* buffer, int buffer_size) {
-  // Audio Data Transport Stream (ADTS) header is 7 or 9 bytes
-  // (from http://wiki.multimedia.cx/index.php?title=ADTS)
-  RCHECK(buffer_size > 6);
-
-  int offset = 0;
-  while (offset + 6 < buffer_size) {
-    BitReader reader(buffer + offset, 6);
-
-    // Syncword must be 0xfff.
-    RCHECK(ReadBits(&reader, 12) == 0xfff);
-
-    // Skip MPEG version.
-    reader.SkipBits(1);
-
-    // Layer is always 0.
-    RCHECK(ReadBits(&reader, 2) == 0);
-
-    // Skip protection + profile.
-    reader.SkipBits(1 + 2);
-
-    // Check sampling frequency index.
-    RCHECK(ReadBits(&reader, 4) != 15);  // Forbidden.
-
-    // Skip private stream, channel configuration, originality, home,
-    // copyrighted stream, and copyright_start.
-    reader.SkipBits(1 + 3 + 1 + 1 + 1 + 1);
-
-    // Get frame length (includes header).
-    int size = ReadBits(&reader, 13);
-    RCHECK(size > 0);
-    offset += size;
-  }
-  return true;
-}
-
-const uint16_t kAc3SyncWord = 0x0b77;
-
-// Checks for an AC3 container.
-static bool CheckAc3(const uint8_t* buffer, int buffer_size) {
-  // Reference: ATSC Standard: Digital Audio Compression (AC-3, E-AC-3)
-  //            Doc. A/52:2012
-  // (http://www.atsc.org/cms/standards/A52-2012(12-17).pdf)
-
-  // AC3 container looks like syncinfo | bsi | audblk * 6 | aux | check.
-  RCHECK(buffer_size > 6);
-
-  int offset = 0;
-  while (offset + 6 < buffer_size) {
-    BitReader reader(buffer + offset, 6);
-
-    // Check syncinfo.
-    RCHECK(ReadBits(&reader, 16) == kAc3SyncWord);
-
-    // Skip crc1.
-    reader.SkipBits(16);
-
-    // Verify fscod.
-    int sample_rate_code = ReadBits(&reader, 2);
-    RCHECK(sample_rate_code != 3);  // Reserved.
-
-    // Verify frmsizecod.
-    int frame_size_code = ReadBits(&reader, 6);
-    RCHECK(frame_size_code < 38);  // Undefined.
-
-    // Verify bsid.
-    RCHECK(ReadBits(&reader, 5) < 10);  // Normally 8 or 6, 16 used by EAC3.
-
-    offset += kAc3FrameSizeTable[frame_size_code][sample_rate_code];
-  }
-  return true;
-}
-
-// Checks for an EAC3 container (very similar to AC3)
-static bool CheckEac3(const uint8_t* buffer, int buffer_size) {
-  // Reference: ATSC Standard: Digital Audio Compression (AC-3, E-AC-3)
-  //            Doc. A/52:2012
-  // (http://www.atsc.org/cms/standards/A52-2012(12-17).pdf)
-
-  // EAC3 container looks like syncinfo | bsi | audfrm | audblk* | aux | check.
-  RCHECK(buffer_size > 6);
-
-  int offset = 0;
-  while (offset + 6 < buffer_size) {
-    BitReader reader(buffer + offset, 6);
-
-    // Check syncinfo.
-    RCHECK(ReadBits(&reader, 16) == kAc3SyncWord);
-
-    // Verify strmtyp.
-    RCHECK(ReadBits(&reader, 2) != 3);
-
-    // Skip substreamid.
-    reader.SkipBits(3);
-
-    // Get frmsize. Include syncinfo size and convert to bytes.
-    int frame_size = (ReadBits(&reader, 11) + 1) * 2;
-    RCHECK(frame_size >= 7);
-
-    // Skip fscod, fscod2, acmod, and lfeon.
-    reader.SkipBits(2 + 2 + 3 + 1);
-
-    // Verify bsid.
-    int bit_stream_id = ReadBits(&reader, 5);
-    RCHECK(bit_stream_id >= 11 && bit_stream_id <= 16);
-
-    offset += frame_size;
-  }
-  return true;
-}
-
-// Additional checks for a BINK container.
-static bool CheckBink(const uint8_t* buffer, int buffer_size) {
-  // Reference: http://wiki.multimedia.cx/index.php?title=Bink_Container
-  RCHECK(buffer_size >= 44);
-
-  // Verify number of frames specified.
-  RCHECK(Read32LE(buffer + 8) > 0);
-
-  // Verify width in range.
-  int width = Read32LE(buffer + 20);
-  RCHECK(width > 0 && width <= 32767);
-
-  // Verify height in range.
-  int height = Read32LE(buffer + 24);
-  RCHECK(height > 0 && height <= 32767);
-
-  // Verify frames per second specified.
-  RCHECK(Read32LE(buffer + 28) > 0);
-
-  // Verify video frames per second specified.
-  RCHECK(Read32LE(buffer + 32) > 0);
-
-  // Number of audio tracks must be 256 or less.
-  return (Read32LE(buffer + 40) <= 256);
-}
-
-// Additional checks for a CAF container.
-static bool CheckCaf(const uint8_t* buffer, int buffer_size) {
-  // Reference: Apple Core Audio Format Specification 1.0
-  // (https://developer.apple.com/library/mac/#documentation/MusicAudio/Reference/CAFSpec/CAF_spec/CAF_spec.html)
-  RCHECK(buffer_size >= 52);
-  BitReader reader(buffer, buffer_size);
-
-  // mFileType should be "caff".
-  RCHECK(ReadBits(&reader, 32) == TAG('c', 'a', 'f', 'f'));
-
-  // mFileVersion should be 1.
-  RCHECK(ReadBits(&reader, 16) == 1);
-
-  // Skip mFileFlags.
-  reader.SkipBits(16);
-
-  // First chunk should be Audio Description chunk, size 32l.
-  RCHECK(ReadBits(&reader, 32) == TAG('d', 'e', 's', 'c'));
-  RCHECK(ReadBits(&reader, 64) == 32);
-
-  // CAFAudioFormat.mSampleRate(float64) not 0
-  RCHECK(ReadBits(&reader, 64) != 0);
-
-  // CAFAudioFormat.mFormatID not 0
-  RCHECK(ReadBits(&reader, 32) != 0);
-
-  // Skip CAFAudioFormat.mBytesPerPacket and mFramesPerPacket.
-  reader.SkipBits(32 + 32);
-
-  // CAFAudioFormat.mChannelsPerFrame not 0
-  RCHECK(ReadBits(&reader, 32) != 0);
-  return true;
-}
-
-static bool kSamplingFrequencyValid[16] = {
-    false, true,  true,  true, false, false, true,  true,
-    true,  false, false, true, true,  true,  false, false};
-static bool kExtAudioIdValid[8] = {true,  false, true, false,
-                                   false, false, true, false};
-
-// Additional checks for a DTS container.
-static bool CheckDts(const uint8_t* buffer, int buffer_size) {
-  // Reference: ETSI TS 102 114 V1.3.1 (2011-08)
-  // (http://www.etsi.org/deliver/etsi_ts/102100_102199/102114/01.03.01_60/ts_102114v010301p.pdf)
-  RCHECK(buffer_size > 11);
-
-  int offset = 0;
-  while (offset + 11 < buffer_size) {
-    BitReader reader(buffer + offset, 11);
-
-    // Verify sync word.
-    RCHECK(ReadBits(&reader, 32) == 0x7ffe8001);
-
-    // Skip frame type and deficit sample count.
-    reader.SkipBits(1 + 5);
-
-    // Verify CRC present flag.
-    RCHECK(ReadBits(&reader, 1) == 0);  // CPF must be 0.
-
-    // Verify number of PCM sample blocks.
-    RCHECK(ReadBits(&reader, 7) >= 5);
-
-    // Verify primary frame byte size.
-    int frame_size = ReadBits(&reader, 14);
-    RCHECK(frame_size >= 95);
-
-    // Skip audio channel arrangement.
-    reader.SkipBits(6);
-
-    // Verify core audio sampling frequency is an allowed value.
-    RCHECK(kSamplingFrequencyValid[ReadBits(&reader, 4)]);
-
-    // Verify transmission bit rate is valid.
-    RCHECK(ReadBits(&reader, 5) <= 25);
-
-    // Verify reserved field is 0.
-    RCHECK(ReadBits(&reader, 1) == 0);
-
-    // Skip dynamic range flag, time stamp flag, auxiliary data flag, and HDCD.
-    reader.SkipBits(1 + 1 + 1 + 1);
-
-    // Verify extension audio descriptor flag is an allowed value.
-    RCHECK(kExtAudioIdValid[ReadBits(&reader, 3)]);
-
-    // Skip extended coding flag and audio sync word insertion flag.
-    reader.SkipBits(1 + 1);
-
-    // Verify low frequency effects flag is an allowed value.
-    RCHECK(ReadBits(&reader, 2) != 3);
-
-    offset += frame_size + 1;
-  }
-  return true;
-}
-
-// Checks for a DV container.
-static bool CheckDV(const uint8_t* buffer, int buffer_size) {
-  // Reference: SMPTE 314M (Annex A has differences with IEC 61834).
-  // (http://standards.smpte.org/content/978-1-61482-454-1/st-314-2005/SEC1.body.pdf)
-  RCHECK(buffer_size > 11);
-
-  int offset = 0;
-  int current_sequence_number = -1;
-  int last_block_number[6] = {0};
-  while (offset + 11 < buffer_size) {
-    BitReader reader(buffer + offset, 11);
-
-    // Decode ID data. Sections 5, 6, and 7 are reserved.
-    int section = ReadBits(&reader, 3);
-    RCHECK(section < 5);
-
-    // Next bit must be 1.
-    RCHECK(ReadBits(&reader, 1) == 1);
-
-    // Skip arbitrary bits.
-    reader.SkipBits(4);
-
-    int sequence_number = ReadBits(&reader, 4);
-
-    // Skip FSC.
-    reader.SkipBits(1);
-
-    // Next 3 bits must be 1.
-    RCHECK(ReadBits(&reader, 3) == 7);
-
-    int block_number = ReadBits(&reader, 8);
-
-    if (section == 0) {  // Header.
-      // Validate the reserved bits in the next 8 bytes.
-      reader.SkipBits(1);
-      RCHECK(ReadBits(&reader, 1) == 0);
-      RCHECK(ReadBits(&reader, 11) == 0x7ff);
-      reader.SkipBits(4);
-      RCHECK(ReadBits(&reader, 4) == 0xf);
-      reader.SkipBits(4);
-      RCHECK(ReadBits(&reader, 4) == 0xf);
-      reader.SkipBits(4);
-      RCHECK(ReadBits(&reader, 4) == 0xf);
-      reader.SkipBits(3);
-      RCHECK(ReadBits(&reader, 24) == 0xffffff);
-      current_sequence_number = sequence_number;
-      for (size_t i = 0; i < arraysize(last_block_number); ++i)
-        last_block_number[i] = -1;
-    } else {
-      // Sequence number must match (this will also fail if no header seen).
-      RCHECK(sequence_number == current_sequence_number);
-      // Block number should be increasing.
-      RCHECK(block_number > last_block_number[section]);
-      last_block_number[section] = block_number;
-    }
-
-    // Move to next block.
-    offset += 80;
-  }
-  return true;
-}
-
-// Checks for a GSM container.
-static bool CheckGsm(const uint8_t* buffer, int buffer_size) {
-  // Reference: ETSI EN 300 961 V8.1.1
-  // (http://www.etsi.org/deliver/etsi_en/300900_300999/300961/08.01.01_60/en_300961v080101p.pdf)
-  // also http://tools.ietf.org/html/rfc3551#page-24
-  // GSM files have a 33 byte block, only first 4 bits are fixed.
-  RCHECK(buffer_size >= 1024);  // Need enough data to do a decent check.
-
-  int offset = 0;
-  while (offset < buffer_size) {
-    // First 4 bits of each block are xD.
-    RCHECK((buffer[offset] & 0xf0) == 0xd0);
-    offset += 33;
-  }
-  return true;
-}
-
-// Advance to the first set of |num_bits| bits that match |start_code|. |offset|
-// is the current location in the buffer, and is updated. |bytes_needed| is the
-// number of bytes that must remain in the buffer when |start_code| is found.
-// Returns true if start_code found (and enough space in the buffer after it),
-// false otherwise.
-static bool AdvanceToStartCode(const uint8_t* buffer, int buffer_size,
-                               int* offset, int bytes_needed, int num_bits,
-                               uint32_t start_code) {
-  DCHECK_GE(bytes_needed, 3);
-  DCHECK_LE(num_bits, 24);  // Only supports up to 24 bits.
-
-  // Create a mask to isolate |num_bits| bits, once shifted over.
-  uint32_t bits_to_shift = 24 - num_bits;
-  uint32_t mask = (1 << num_bits) - 1;
-  while (*offset + bytes_needed < buffer_size) {
-    uint32_t next = Read24(buffer + *offset);
-    if (((next >> bits_to_shift) & mask) == start_code) return true;
-    ++(*offset);
-  }
-  return false;
-}
-
-// Checks for an H.261 container.
-static bool CheckH261(const uint8_t* buffer, int buffer_size) {
-  // Reference: ITU-T Recommendation H.261 (03/1993)
-  // (http://www.itu.int/rec/T-REC-H.261-199303-I/en)
-  RCHECK(buffer_size > 16);
-
-  int offset = 0;
-  bool seen_start_code = false;
-  while (true) {
-    // Advance to picture_start_code, if there is one.
-    if (!AdvanceToStartCode(buffer, buffer_size, &offset, 4, 20, 0x10)) {
-      // No start code found (or off end of buffer), so success if
-      // there was at least one valid header.
-      return seen_start_code;
-    }
-
-    // Now verify the block. AdvanceToStartCode() made sure that there are
-    // at least 4 bytes remaining in the buffer.
-    BitReader reader(buffer + offset, buffer_size - offset);
-    RCHECK(ReadBits(&reader, 20) == 0x10);
-
-    // Skip the temporal reference and PTYPE.
-    reader.SkipBits(5 + 6);
-
-    // Skip any extra insertion information. Since this is open-ended, if we run
-    // out of bits assume that the buffer is correctly formatted.
-    int extra = ReadBits(&reader, 1);
-    while (extra == 1) {
-      if (!reader.SkipBits(8)) return seen_start_code;
-      if (!reader.ReadBits(1, &extra)) return seen_start_code;
-    }
-
-    // Next should be a Group of Blocks start code. Again, if we run out of
-    // bits, then assume that the buffer up to here is correct, and the buffer
-    // just happened to end in the middle of a header.
-    int next;
-    if (!reader.ReadBits(16, &next)) return seen_start_code;
-    RCHECK(next == 1);
-
-    // Move to the next block.
-    seen_start_code = true;
-    offset += 4;
-  }
-}
-
-// Checks for an H.263 container.
-static bool CheckH263(const uint8_t* buffer, int buffer_size) {
-  // Reference: ITU-T Recommendation H.263 (01/2005)
-  // (http://www.itu.int/rec/T-REC-H.263-200501-I/en)
-  // header is PSC(22b) + TR(8b) + PTYPE(8+b).
-  RCHECK(buffer_size > 16);
-
-  int offset = 0;
-  bool seen_start_code = false;
-  while (true) {
-    // Advance to picture_start_code, if there is one.
-    if (!AdvanceToStartCode(buffer, buffer_size, &offset, 9, 22, 0x20)) {
-      // No start code found (or off end of buffer), so success if
-      // there was at least one valid header.
-      return seen_start_code;
-    }
-
-    // Now verify the block. AdvanceToStartCode() made sure that there are
-    // at least 9 bytes remaining in the buffer.
-    BitReader reader(buffer + offset, 9);
-    RCHECK(ReadBits(&reader, 22) == 0x20);
-
-    // Skip the temporal reference.
-    reader.SkipBits(8);
-
-    // Verify that the first 2 bits of PTYPE are 10b.
-    RCHECK(ReadBits(&reader, 2) == 2);
-
-    // Skip the split screen indicator, document camera indicator, and full
-    // picture freeze release.
-    reader.SkipBits(1 + 1 + 1);
-
-    // Verify Source Format.
-    int format = ReadBits(&reader, 3);
-    RCHECK(format != 0 && format != 6);  // Forbidden or reserved.
-
-    if (format == 7) {
-      // Verify full extended PTYPE.
-      int ufep = ReadBits(&reader, 3);
-      if (ufep == 1) {
-        // Verify the optional part of PLUSPTYPE.
-        format = ReadBits(&reader, 3);
-        RCHECK(format != 0 && format != 7);  // Reserved.
-        reader.SkipBits(11);
-        // Next 4 bits should be b1000.
-        RCHECK(ReadBits(&reader, 4) == 8);  // Not allowed.
-      } else {
-        RCHECK(ufep == 0);  // Only 0 and 1 allowed.
-      }
-
-      // Verify picture type code is not a reserved value.
-      int picture_type_code = ReadBits(&reader, 3);
-      RCHECK(picture_type_code != 6 && picture_type_code != 7);  // Reserved.
-
-      // Skip picture resampling mode, reduced resolution mode,
-      // and rounding type.
-      reader.SkipBits(1 + 1 + 1);
-
-      // Next 3 bits should be b001.
-      RCHECK(ReadBits(&reader, 3) == 1);  // Not allowed.
-    }
-
-    // Move to the next block.
-    seen_start_code = true;
-    offset += 9;
-  }
-}
-
-// Checks for an H.264 container.
-static bool CheckH264(const uint8_t* buffer, int buffer_size) {
-  // Reference: ITU-T Recommendation H.264 (01/2012)
-  // (http://www.itu.int/rec/T-REC-H.264)
-  // Section B.1: Byte stream NAL unit syntax and semantics.
-  RCHECK(buffer_size > 4);
-
-  int offset = 0;
-  int parameter_count = 0;
-  while (true) {
-    // Advance to picture_start_code, if there is one.
-    if (!AdvanceToStartCode(buffer, buffer_size, &offset, 4, 24, 1)) {
-      // No start code found (or off end of buffer), so success if
-      // there was at least one valid header.
-      return parameter_count > 0;
-    }
-
-    // Now verify the block. AdvanceToStartCode() made sure that there are
-    // at least 4 bytes remaining in the buffer.
-    BitReader reader(buffer + offset, 4);
-    RCHECK(ReadBits(&reader, 24) == 1);
-
-    // Verify forbidden_zero_bit.
-    RCHECK(ReadBits(&reader, 1) == 0);
-
-    // Extract nal_ref_idc and nal_unit_type.
-    int nal_ref_idc = ReadBits(&reader, 2);
-    int nal_unit_type = ReadBits(&reader, 5);
-
-    switch (nal_unit_type) {
-      case 5:  // Coded slice of an IDR picture.
-        RCHECK(nal_ref_idc != 0);
-        break;
-      case 6:   // Supplemental enhancement information (SEI).
-      case 9:   // Access unit delimiter.
-      case 10:  // End of sequence.
-      case 11:  // End of stream.
-      case 12:  // Filler data.
-        RCHECK(nal_ref_idc == 0);
-        break;
-      case 7:  // Sequence parameter set.
-      case 8:  // Picture parameter set.
-        ++parameter_count;
-        break;
-    }
-
-    // Skip the current start_code_prefix and move to the next.
-    offset += 4;
-  }
-}
-
-static const char kHlsSignature[] = "#EXTM3U";
-static const char kHls1[] = "#EXT-X-STREAM-INF:";
-static const char kHls2[] = "#EXT-X-TARGETDURATION:";
-static const char kHls3[] = "#EXT-X-MEDIA-SEQUENCE:";
-
-// Additional checks for a HLS container.
-static bool CheckHls(const uint8_t* buffer, int buffer_size) {
-  // HLS is simply a play list used for Apple HTTP Live Streaming.
-  // Reference: Apple HTTP Live Streaming Overview
-  // (http://goo.gl/MIwxj)
-
-  if (StartsWith(buffer, buffer_size, kHlsSignature)) {
-    // Need to find "#EXT-X-STREAM-INF:", "#EXT-X-TARGETDURATION:", or
-    // "#EXT-X-MEDIA-SEQUENCE:" somewhere in the buffer. Other playlists (like
-    // WinAmp) only have additional lines with #EXTINF
-    // (http://en.wikipedia.org/wiki/M3U).
-    int offset = strlen(kHlsSignature);
-    while (offset < buffer_size) {
-      if (buffer[offset] == '#') {
-        if (StartsWith(buffer + offset, buffer_size - offset, kHls1) ||
-            StartsWith(buffer + offset, buffer_size - offset, kHls2) ||
-            StartsWith(buffer + offset, buffer_size - offset, kHls3)) {
-          return true;
-        }
-      }
-      ++offset;
-    }
-  }
-  return false;
-}
-
-// Checks for a MJPEG stream.
-static bool CheckMJpeg(const uint8_t* buffer, int buffer_size) {
-  // Reference: ISO/IEC 10918-1 : 1993(E), Annex B
-  // (http://www.w3.org/Graphics/JPEG/itu-t81.pdf)
-  RCHECK(buffer_size >= 16);
-
-  int offset = 0;
-  int last_restart = -1;
-  int num_codes = 0;
-  while (offset + 5 < buffer_size) {
-    // Marker codes are always a two byte code with the first byte xFF.
-    RCHECK(buffer[offset] == 0xff);
-    uint8_t code = buffer[offset + 1];
-    RCHECK(code >= 0xc0 || code == 1);
-
-    // Skip sequences of xFF.
-    if (code == 0xff) {
-      ++offset;
-      continue;
-    }
-
-    // Success if the next marker code is EOI (end of image)
-    if (code == 0xd9) return true;
-
-    // Check remaining codes.
-    if (code == 0xd8 || code == 1) {
-      // SOI (start of image) / TEM (private use). No other data with header.
-      offset += 2;
-    } else if (code >= 0xd0 && code <= 0xd7) {
-      // RST (restart) codes must be in sequence. No other data with header.
-      int restart = code & 0x07;
-      if (last_restart >= 0) RCHECK(restart == (last_restart + 1) % 8);
-      last_restart = restart;
-      offset += 2;
-    } else {
-      // All remaining marker codes are followed by a length of the header.
-      int length = Read16(buffer + offset + 2) + 2;
-
-      // Special handling of SOS (start of scan) marker since the entropy
-      // coded data follows the SOS. Any xFF byte in the data block must be
-      // followed by x00 in the data.
-      if (code == 0xda) {
-        int number_components = buffer[offset + 4];
-        RCHECK(length == 8 + 2 * number_components);
-
-        // Advance to the next marker.
-        offset += length;
-        while (offset + 2 < buffer_size) {
-          if (buffer[offset] == 0xff && buffer[offset + 1] != 0) break;
-          ++offset;
-        }
-      } else {
-        // Skip over the marker data for the other marker codes.
-        offset += length;
-      }
-    }
-    ++num_codes;
-  }
-  return (num_codes > 1);
-}
-
-enum Mpeg2StartCodes { PROGRAM_END_CODE = 0xb9, PACK_START_CODE = 0xba };
-
-// Checks for a MPEG2 Program Stream.
-static bool CheckMpeg2ProgramStream(const uint8_t* buffer, int buffer_size) {
-  // Reference: ISO/IEC 13818-1 : 2000 (E) / ITU-T Rec. H.222.0 (2000 E).
-  RCHECK(buffer_size > 14);
-
-  int offset = 0;
-  while (offset + 14 < buffer_size) {
-    BitReader reader(buffer + offset, 14);
-
-    // Must start with pack_start_code.
-    RCHECK(ReadBits(&reader, 24) == 1);
-    RCHECK(ReadBits(&reader, 8) == PACK_START_CODE);
-
-    // Determine MPEG version (MPEG1 has b0010, while MPEG2 has b01).
-    int mpeg_version = ReadBits(&reader, 2);
-    if (mpeg_version == 0) {
-      // MPEG1, 10 byte header
-      // Validate rest of version code
-      RCHECK(ReadBits(&reader, 2) == 2);
-    } else {
-      RCHECK(mpeg_version == 1);
-    }
-
-    // Skip system_clock_reference_base [32..30].
-    reader.SkipBits(3);
-
-    // Verify marker bit.
-    RCHECK(ReadBits(&reader, 1) == 1);
-
-    // Skip system_clock_reference_base [29..15].
-    reader.SkipBits(15);
-
-    // Verify next marker bit.
-    RCHECK(ReadBits(&reader, 1) == 1);
-
-    // Skip system_clock_reference_base [14..0].
-    reader.SkipBits(15);
-
-    // Verify next marker bit.
-    RCHECK(ReadBits(&reader, 1) == 1);
-
-    if (mpeg_version == 0) {
-      // Verify second marker bit.
-      RCHECK(ReadBits(&reader, 1) == 1);
-
-      // Skip mux_rate.
-      reader.SkipBits(22);
-
-      // Verify next marker bit.
-      RCHECK(ReadBits(&reader, 1) == 1);
-
-      // Update offset to be after this header.
-      offset += 12;
-    } else {
-      // Must be MPEG2.
-      // Skip program_mux_rate.
-      reader.SkipBits(22);
-
-      // Verify pair of marker bits.
-      RCHECK(ReadBits(&reader, 2) == 3);
-
-      // Skip reserved.
-      reader.SkipBits(5);
-
-      // Update offset to be after this header.
-      int pack_stuffing_length = ReadBits(&reader, 3);
-      offset += 14 + pack_stuffing_length;
-    }
-
-    // Check for system headers and PES_packets.
-    while (offset + 6 < buffer_size && Read24(buffer + offset) == 1) {
-      // Next 8 bits determine stream type.
-      int stream_id = buffer[offset + 3];
-
-      // Some stream types are reserved and shouldn't occur.
-      if (mpeg_version == 0)
-        RCHECK(stream_id != 0xbc && stream_id < 0xf0);
-      else
-        RCHECK(stream_id != 0xfc && stream_id != 0xfd && stream_id != 0xfe);
-
-      // Some stream types are used for pack headers.
-      if (stream_id == PACK_START_CODE)  // back to outer loop.
-        break;
-      if (stream_id == PROGRAM_END_CODE)  // end of stream.
-        return true;
-
-      int pes_length = Read16(buffer + offset + 4);
-      RCHECK(pes_length > 0);
-      offset = offset + 6 + pes_length;
-    }
-  }
-  // Success as we are off the end of the buffer and liked everything
-  // in the buffer.
-  return true;
-}
-
-const uint8_t kMpeg2SyncWord = 0x47;
-
-// Checks for a MPEG2 Transport Stream.
-static bool CheckMpeg2TransportStream(const uint8_t* buffer, int buffer_size) {
-  // Spec: ISO/IEC 13818-1 : 2000 (E) / ITU-T Rec. H.222.0 (2000 E).
-  // Normal packet size is 188 bytes. However, some systems add various error
-  // correction data at the end, resulting in packet of length 192/204/208
-  // (https://en.wikipedia.org/wiki/MPEG_transport_stream). Determine the
-  // length with the first packet.
-  RCHECK(buffer_size >= 250);  // Want more than 1 packet to check.
-
-  int offset = 0;
-  int packet_length = -1;
-  while (buffer[offset] != kMpeg2SyncWord && offset < 20) {
-    // Skip over any header in the first 20 bytes.
-    ++offset;
-  }
-
-  while (offset + 6 < buffer_size) {
-    BitReader reader(buffer + offset, 6);
-
-    // Must start with sync byte.
-    RCHECK(ReadBits(&reader, 8) == kMpeg2SyncWord);
-
-    // Skip transport_error_indicator, payload_unit_start_indicator, and
-    // transport_priority.
-    reader.SkipBits(1 + 1 + 1);
-
-    // Verify the pid is not a reserved value.
-    int pid = ReadBits(&reader, 13);
-    RCHECK(pid < 3 || pid > 15);
-
-    // Skip transport_scrambling_control.
-    reader.SkipBits(2);
-
-    // Adaptation_field_control can not be 0.
-    int adaptation_field_control = ReadBits(&reader, 2);
-    RCHECK(adaptation_field_control != 0);
-
-    // If there is an adaptation_field, verify it.
-    if (adaptation_field_control >= 2) {
-      // Skip continuity_counter.
-      reader.SkipBits(4);
-
-      // Get adaptation_field_length and verify it.
-      int adaptation_field_length = ReadBits(&reader, 8);
-      if (adaptation_field_control == 2)
-        RCHECK(adaptation_field_length == 183);
-      else
-        RCHECK(adaptation_field_length <= 182);
-    }
-
-    // Attempt to determine the packet length on the first packet.
-    if (packet_length < 0) {
-      if (buffer[offset + 188] == kMpeg2SyncWord)
-        packet_length = 188;
-      else if (buffer[offset + 192] == kMpeg2SyncWord)
-        packet_length = 192;
-      else if (buffer[offset + 204] == kMpeg2SyncWord)
-        packet_length = 204;
-      else
-        packet_length = 208;
-    }
-    offset += packet_length;
-  }
-  return true;
-}
-
-enum Mpeg4StartCodes {
-  VISUAL_OBJECT_SEQUENCE_START_CODE = 0xb0,
-  VISUAL_OBJECT_SEQUENCE_END_CODE = 0xb1,
-  VISUAL_OBJECT_START_CODE = 0xb5,
-  VOP_START_CODE = 0xb6
-};
-
-// Checks for a raw MPEG4 bitstream container.
-static bool CheckMpeg4BitStream(const uint8_t* buffer, int buffer_size) {
-  // Defined in ISO/IEC 14496-2:2001.
-  // However, no length ... simply scan for start code values.
-  // Note tags are very similar to H.264.
-  RCHECK(buffer_size > 4);
-
-  int offset = 0;
-  int sequence_start_count = 0;
-  int sequence_end_count = 0;
-  int visual_object_count = 0;
-  int vop_count = 0;
-  while (true) {
-    // Advance to start_code, if there is one.
-    if (!AdvanceToStartCode(buffer, buffer_size, &offset, 6, 24, 1)) {
-      // Not a complete sequence in memory, so return true if we've seen a
-      // visual_object_sequence_start_code and a visual_object_start_code.
-      return (sequence_start_count > 0 && visual_object_count > 0);
-    }
-
-    // Now verify the block. AdvanceToStartCode() made sure that there are
-    // at least 6 bytes remaining in the buffer.
-    BitReader reader(buffer + offset, 6);
-    RCHECK(ReadBits(&reader, 24) == 1);
-
-    int start_code = ReadBits(&reader, 8);
-    RCHECK(start_code < 0x30 || start_code > 0xaf);  // 30..AF and
-    RCHECK(start_code < 0xb7 || start_code > 0xb9);  // B7..B9 reserved
-
-    switch (start_code) {
-      case VISUAL_OBJECT_SEQUENCE_START_CODE: {
-        ++sequence_start_count;
-        // Verify profile in not one of many reserved values.
-        int profile = ReadBits(&reader, 8);
-        RCHECK(profile > 0);
-        RCHECK(profile < 0x04 || profile > 0x10);
-        RCHECK(profile < 0x13 || profile > 0x20);
-        RCHECK(profile < 0x23 || profile > 0x31);
-        RCHECK(profile < 0x35 || profile > 0x41);
-        RCHECK(profile < 0x43 || profile > 0x60);
-        RCHECK(profile < 0x65 || profile > 0x70);
-        RCHECK(profile < 0x73 || profile > 0x80);
-        RCHECK(profile < 0x83 || profile > 0x90);
-        RCHECK(profile < 0x95 || profile > 0xa0);
-        RCHECK(profile < 0xa4 || profile > 0xb0);
-        RCHECK(profile < 0xb5 || profile > 0xc0);
-        RCHECK(profile < 0xc3 || profile > 0xd0);
-        RCHECK(profile < 0xe4);
-        break;
-      }
-
-      case VISUAL_OBJECT_SEQUENCE_END_CODE:
-        RCHECK(++sequence_end_count == sequence_start_count);
-        break;
-
-      case VISUAL_OBJECT_START_CODE: {
-        ++visual_object_count;
-        if (ReadBits(&reader, 1) == 1) {
-          int visual_object_verid = ReadBits(&reader, 4);
-          RCHECK(visual_object_verid > 0 && visual_object_verid < 3);
-          RCHECK(ReadBits(&reader, 3) != 0);
-        }
-        int visual_object_type = ReadBits(&reader, 4);
-        RCHECK(visual_object_type > 0 && visual_object_type < 6);
-        break;
-      }
-
-      case VOP_START_CODE:
-        RCHECK(++vop_count <= visual_object_count);
-        break;
-    }
-    // Skip this block.
-    offset += 6;
-  }
-}
-
-// Additional checks for a MOV/QuickTime/MPEG4 container.
-static bool CheckMov(const uint8_t* buffer, int buffer_size) {
-  // Reference: ISO/IEC 14496-12:2005(E).
-  // (http://standards.iso.org/ittf/PubliclyAvailableStandards/c061988_ISO_IEC_14496-12_2012.zip)
-  RCHECK(buffer_size > 8);
-
-  int offset = 0;
-  while (offset + 8 < buffer_size) {
-    uint32_t atomsize = Read32(buffer + offset);
-    uint32_t atomtype = Read32(buffer + offset + 4);
-    // Only need to check for ones that are valid at the top level.
-    switch (atomtype) {
-      case TAG('f', 't', 'y', 'p'):
-      case TAG('p', 'd', 'i', 'n'):
-      case TAG('m', 'o', 'o', 'v'):
-      case TAG('m', 'o', 'o', 'f'):
-      case TAG('m', 'f', 'r', 'a'):
-      case TAG('m', 'd', 'a', 't'):
-      case TAG('f', 'r', 'e', 'e'):
-      case TAG('s', 'k', 'i', 'p'):
-      case TAG('m', 'e', 't', 'a'):
-      case TAG('m', 'e', 'c', 'o'):
-      case TAG('s', 't', 'y', 'p'):
-      case TAG('s', 'i', 'd', 'x'):
-      case TAG('s', 's', 'i', 'x'):
-      case TAG('p', 'r', 'f', 't'):
-      case TAG('b', 'l', 'o', 'c'):
-        break;
-      default:
-        return false;
-    }
-    if (atomsize == 1) {
-      // Indicates that the length is the next 64bits.
-      if (offset + 16 > buffer_size) break;
-      if (Read32(buffer + offset + 8) != 0)
-        break;  // Offset is way past buffer size.
-      atomsize = Read32(buffer + offset + 12);
-    }
-    if (atomsize == 0 || atomsize > static_cast<size_t>(buffer_size))
-      break;  // Indicates the last atom or length too big.
-    offset += atomsize;
-  }
-  return true;
-}
-
-enum MPEGVersion { VERSION_25 = 0, VERSION_RESERVED, VERSION_2, VERSION_1 };
-enum MPEGLayer { L_RESERVED = 0, LAYER_3, LAYER_2, LAYER_1 };
-
-static int kSampleRateTable[4][4] = {
-    {11025, 12000, 8000, 0},   // v2.5
-    {0, 0, 0, 0},              // not used
-    {22050, 24000, 16000, 0},  // v2
-    {44100, 48000, 32000, 0}   // v1
-};
-
-static int kBitRateTableV1L1[16] = {0,   32,  64,  96,  128, 160, 192, 224,
-                                    256, 288, 320, 352, 384, 416, 448, 0};
-static int kBitRateTableV1L2[16] = {0,   32,  48,  56,  64,  80,  96,  112,
-                                    128, 160, 192, 224, 256, 320, 384, 0};
-static int kBitRateTableV1L3[16] = {0,   32,  40,  48,  56,  64,  80,  96,
-                                    112, 128, 160, 192, 224, 256, 320, 0};
-static int kBitRateTableV2L1[16] = {0,   32,  48,  56,  64,  80,  96,  112,
-                                    128, 144, 160, 176, 192, 224, 256, 0};
-static int kBitRateTableV2L23[16] = {0,  8,  16, 24,  32,  40,  48,  56,
-                                     64, 80, 96, 112, 128, 144, 160, 0};
-
-static bool ValidMpegAudioFrameHeader(const uint8_t* header, int header_size,
-                                      int* framesize) {
-  // Reference: http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm.
-  DCHECK_GE(header_size, 4);
-  *framesize = 0;
-  BitReader reader(header, 4);  // Header can only be 4 bytes long.
-
-  // Verify frame sync (11 bits) are all set.
-  RCHECK(ReadBits(&reader, 11) == 0x7ff);
-
-  // Verify MPEG audio version id.
-  int version = ReadBits(&reader, 2);
-  RCHECK(version != 1);  // Reserved.
-
-  // Verify layer.
-  int layer = ReadBits(&reader, 2);
-  RCHECK(layer != 0);
-
-  // Skip protection bit.
-  reader.SkipBits(1);
-
-  // Verify bitrate index.
-  int bitrate_index = ReadBits(&reader, 4);
-  RCHECK(bitrate_index != 0xf);
-
-  // Verify sampling rate frequency index.
-  int sampling_index = ReadBits(&reader, 2);
-  RCHECK(sampling_index != 3);
-
-  // Get padding bit.
-  int padding = ReadBits(&reader, 1);
-
-  // Frame size:
-  // For Layer I files = (12 * BitRate / SampleRate + Padding) * 4
-  // For others = 144 * BitRate / SampleRate + Padding
-  // Unfortunately, BitRate and SampleRate are coded.
-  int sampling_rate = kSampleRateTable[version][sampling_index];
-  int bitrate;
-  if (version == VERSION_1) {
-    if (layer == LAYER_1)
-      bitrate = kBitRateTableV1L1[bitrate_index];
-    else if (layer == LAYER_2)
-      bitrate = kBitRateTableV1L2[bitrate_index];
-    else
-      bitrate = kBitRateTableV1L3[bitrate_index];
-  } else {
-    if (layer == LAYER_1)
-      bitrate = kBitRateTableV2L1[bitrate_index];
-    else
-      bitrate = kBitRateTableV2L23[bitrate_index];
-  }
-  if (layer == LAYER_1)
-    *framesize = ((12000 * bitrate) / sampling_rate + padding) * 4;
-  else
-    *framesize = (144000 * bitrate) / sampling_rate + padding;
-  return (bitrate > 0 && sampling_rate > 0);
-}
-
-// Extract a size encoded the MP3 way.
-static int GetMp3HeaderSize(const uint8_t* buffer, int buffer_size) {
-  DCHECK_GE(buffer_size, 9);
-  int size = ((buffer[6] & 0x7f) << 21) + ((buffer[7] & 0x7f) << 14) +
-             ((buffer[8] & 0x7f) << 7) + (buffer[9] & 0x7f) + 10;
-  if (buffer[5] & 0x10)  // Footer added?
-    size += 10;
-  return size;
-}
-
-// Additional checks for a MP3 container.
-static bool CheckMp3(const uint8_t* buffer, int buffer_size, bool seenHeader) {
-  RCHECK(buffer_size >= 10);  // Must be enough to read the initial header.
-
-  int framesize;
-  int numSeen = 0;
-  int offset = 0;
-  if (seenHeader) {
-    offset = GetMp3HeaderSize(buffer, buffer_size);
-  } else {
-    // Skip over leading 0's.
-    while (offset < buffer_size && buffer[offset] == 0) ++offset;
-  }
-
-  while (offset + 3 < buffer_size) {
-    RCHECK(ValidMpegAudioFrameHeader(buffer + offset, buffer_size - offset,
-                                     &framesize));
-
-    // Have we seen enough valid headers?
-    if (++numSeen > 10) return true;
-    offset += framesize;
-  }
-  // Off the end of the buffer, return success if a few valid headers seen.
-  return numSeen > 2;
-}
-
-// Check that the next characters in |buffer| represent a number. The format
-// accepted is optional whitespace followed by 1 or more digits. |max_digits|
-// specifies the maximum number of digits to process. Returns true if a valid
-// number is found, false otherwise.
-static bool VerifyNumber(const uint8_t* buffer, int buffer_size, int* offset,
-                         int max_digits) {
-  RCHECK(*offset < buffer_size);
-
-  // Skip over any leading space.
-  while (isspace(buffer[*offset])) {
-    ++(*offset);
-    RCHECK(*offset < buffer_size);
-  }
-
-  // Need to process up to max_digits digits.
-  int numSeen = 0;
-  while (--max_digits >= 0 && isdigit(buffer[*offset])) {
-    ++numSeen;
-    ++(*offset);
-    if (*offset >= buffer_size) return true;  // Out of space but seen a digit.
-  }
-
-  // Success if at least one digit seen.
-  return (numSeen > 0);
-}
-
-// Check that the next character in |buffer| is one of |c1| or |c2|. |c2| is
-// optional. Returns true if there is a match, false if no match or out of
-// space.
-static inline bool VerifyCharacters(const uint8_t* buffer, int buffer_size,
-                                    int* offset, char c1, char c2) {
-  RCHECK(*offset < buffer_size);
-  char c = static_cast<char>(buffer[(*offset)++]);
-  return (c == c1 || (c == c2 && c2 != 0));
-}
-
-// Checks for a SRT container.
-static bool CheckSrt(const uint8_t* buffer, int buffer_size) {
-  // Reference: http://en.wikipedia.org/wiki/SubRip
-  RCHECK(buffer_size > 20);
-
-  // First line should just be the subtitle sequence number.
-  int offset = StartsWith(buffer, buffer_size, UTF8_BYTE_ORDER_MARK) ? 3 : 0;
-  RCHECK(VerifyNumber(buffer, buffer_size, &offset, 100));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, '\n', '\r'));
-
-  // Skip any additional \n\r.
-  while (VerifyCharacters(buffer, buffer_size, &offset, '\n', '\r')) {
-  }
-  --offset;  // Since VerifyCharacters() gobbled up the next non-CR/LF.
-
-  // Second line should look like the following:
-  //   00:00:10,500 --> 00:00:13,000
-  // Units separator can be , or .
-  RCHECK(VerifyNumber(buffer, buffer_size, &offset, 100));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, ':', 0));
-  RCHECK(VerifyNumber(buffer, buffer_size, &offset, 2));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, ':', 0));
-  RCHECK(VerifyNumber(buffer, buffer_size, &offset, 2));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, ',', '.'));
-  RCHECK(VerifyNumber(buffer, buffer_size, &offset, 3));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, ' ', 0));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, '-', 0));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, '-', 0));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, '>', 0));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, ' ', 0));
-  RCHECK(VerifyNumber(buffer, buffer_size, &offset, 100));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, ':', 0));
-  RCHECK(VerifyNumber(buffer, buffer_size, &offset, 2));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, ':', 0));
-  RCHECK(VerifyNumber(buffer, buffer_size, &offset, 2));
-  RCHECK(VerifyCharacters(buffer, buffer_size, &offset, ',', '.'));
-  RCHECK(VerifyNumber(buffer, buffer_size, &offset, 3));
-  return true;
-}
-
-// Read a Matroska Element Id.
-static int GetElementId(BitReader* reader) {
-  // Element ID is coded with the leading zero bits (max 3) determining size.
-  // If it is an invalid encoding or the end of the buffer is reached,
-  // return -1 as a tag that won't be expected.
-  if (reader->bits_available() >= 8) {
-    int num_bits_to_read = 0;
-    static int prefix[] = {0x80, 0x4000, 0x200000, 0x10000000};
-    for (int i = 0; i < 4; ++i) {
-      num_bits_to_read += 7;
-      if (ReadBits(reader, 1) == 1) {
-        if (reader->bits_available() < num_bits_to_read) break;
-        // prefix[] adds back the bits read individually.
-        return ReadBits(reader, num_bits_to_read) | prefix[i];
-      }
-    }
-  }
-  // Invalid encoding, return something not expected.
-  return -1;
-}
-
-// Read a Matroska Unsigned Integer (VINT).
-static uint64_t GetVint(BitReader* reader) {
-  // Values are coded with the leading zero bits (max 7) determining size.
-  // If it is an invalid coding or the end of the buffer is reached,
-  // return something that will go off the end of the buffer.
-  if (reader->bits_available() >= 8) {
-    int num_bits_to_read = 0;
-    for (int i = 0; i < 8; ++i) {
-      num_bits_to_read += 7;
-      if (ReadBits(reader, 1) == 1) {
-        if (reader->bits_available() < num_bits_to_read) break;
-        return ReadBits(reader, num_bits_to_read);
-      }
-    }
-  }
-  // Incorrect format (more than 7 leading 0's) or off the end of the buffer.
-  // Since the return value is used as a byte size, return a value that will
-  // cause a failure when used.
-  return (reader->bits_available() / 8) + 2;
-}
-
-// Additional checks for a WEBM container.
-static bool CheckWebm(const uint8_t* buffer, int buffer_size) {
-  // Reference: http://www.matroska.org/technical/specs/index.html
-  RCHECK(buffer_size > 12);
-
-  BitReader reader(buffer, buffer_size);
-
-  // Verify starting Element Id.
-  RCHECK(GetElementId(&reader) == 0x1a45dfa3);
-
-  // Get the header size, and ensure there are enough bits to check.
-  // Using saturated_cast<> in case the size read is really large
-  // (in which case the bits_available() check will fail).
-  int header_size = base::saturated_cast<int>(GetVint(&reader));
-  RCHECK(reader.bits_available() / 8 >= header_size);
-
-  // Loop through the header.
-  while (reader.bits_available() > 0) {
-    int tag = GetElementId(&reader);
-    int tagsize = base::saturated_cast<int>(GetVint(&reader));
-    switch (tag) {
-      case 0x4286:  // EBMLVersion
-      case 0x42f7:  // EBMLReadVersion
-      case 0x42f2:  // EBMLMaxIdLength
-      case 0x42f3:  // EBMLMaxSizeLength
-      case 0x4287:  // DocTypeVersion
-      case 0x4285:  // DocTypeReadVersion
-      case 0xec:    // void
-      case 0xbf:    // CRC32
-        RCHECK(reader.bits_available() / 8 >= tagsize);
-        RCHECK(reader.SkipBits(tagsize * 8));
-        break;
-
-      case 0x4282:  // EBMLDocType
-        // Need to see "webm" or "matroska" next.
-        RCHECK(reader.bits_available() >= 32);
-        switch (ReadBits(&reader, 32)) {
-          case TAG('w', 'e', 'b', 'm'):
-            return true;
-          case TAG('m', 'a', 't', 'r'):
-            RCHECK(reader.bits_available() >= 32);
-            return (ReadBits(&reader, 32) == TAG('o', 's', 'k', 'a'));
-        }
-        return false;
-
-      default:  // Unrecognized tag
-        return false;
-    }
-  }
-  return false;
-}
-
-enum VC1StartCodes {
-  VC1_FRAME_START_CODE = 0x0d,
-  VC1_ENTRY_POINT_START_CODE = 0x0e,
-  VC1_SEQUENCE_START_CODE = 0x0f
-};
-
-// Checks for a VC1 bitstream container.
-static bool CheckVC1(const uint8_t* buffer, int buffer_size) {
-  // Reference: SMPTE 421M
-  // (http://standards.smpte.org/content/978-1-61482-555-5/st-421-2006/SEC1.body.pdf)
-  // However, no length ... simply scan for start code values.
-  // Expect to see SEQ | [ [ ENTRY ] PIC* ]*
-  // Note tags are very similar to H.264.
-
-  RCHECK(buffer_size >= 24);
-
-  // First check for Bitstream Metadata Serialization (Annex L)
-  if (buffer[0] == 0xc5 && Read32(buffer + 4) == 0x04 &&
-      Read32(buffer + 20) == 0x0c) {
-    // Verify settings in STRUCT_C and STRUCT_A
-    BitReader reader(buffer + 8, 12);
-
-    int profile = ReadBits(&reader, 4);
-    if (profile == 0 || profile == 4) {  // simple or main
-      // Skip FRMRTQ_POSTPROC, BITRTQ_POSTPROC, and LOOPFILTER.
-      reader.SkipBits(3 + 5 + 1);
-
-      // Next bit must be 0.
-      RCHECK(ReadBits(&reader, 1) == 0);
-
-      // Skip MULTIRES.
-      reader.SkipBits(1);
-
-      // Next bit must be 1.
-      RCHECK(ReadBits(&reader, 1) == 1);
-
-      // Skip FASTUVMC, EXTENDED_MV, DQUANT, and VSTRANSFORM.
-      reader.SkipBits(1 + 1 + 2 + 1);
-
-      // Next bit must be 0.
-      RCHECK(ReadBits(&reader, 1) == 0);
-
-      // Skip OVERLAP, SYNCMARKER, RANGERED, MAXBFRAMES, QUANTIZER, and
-      // FINTERPFLAG.
-      reader.SkipBits(1 + 1 + 1 + 3 + 2 + 1);
-
-      // Next bit must be 1.
-      RCHECK(ReadBits(&reader, 1) == 1);
-
-    } else {
-      RCHECK(profile == 12);  // Other profile values not allowed.
-      RCHECK(ReadBits(&reader, 28) == 0);
-    }
-
-    // Now check HORIZ_SIZE and VERT_SIZE, which must be 8192 or less.
-    RCHECK(ReadBits(&reader, 32) <= 8192);
-    RCHECK(ReadBits(&reader, 32) <= 8192);
-    return true;
-  }
-
-  // Buffer isn't Bitstream Metadata, so scan for start codes.
-  int offset = 0;
-  int sequence_start_code = 0;
-  int frame_start_code = 0;
-  while (true) {
-    // Advance to start_code, if there is one.
-    if (!AdvanceToStartCode(buffer, buffer_size, &offset, 5, 24, 1)) {
-      // Not a complete sequence in memory, so return true if we've seen a
-      // sequence start and a frame start (not checking entry points since
-      // they only occur in advanced profiles).
-      return (sequence_start_code > 0 && frame_start_code > 0);
-    }
-
-    // Now verify the block. AdvanceToStartCode() made sure that there are
-    // at least 5 bytes remaining in the buffer.
-    BitReader reader(buffer + offset, 5);
-    RCHECK(ReadBits(&reader, 24) == 1);
-
-    // Keep track of the number of certain types received.
-    switch (ReadBits(&reader, 8)) {
-      case VC1_SEQUENCE_START_CODE: {
-        ++sequence_start_code;
-        switch (ReadBits(&reader, 2)) {
-          case 0:  // simple
-          case 1:  // main
-            RCHECK(ReadBits(&reader, 2) == 0);
-            break;
-          case 2:  // complex
-            return false;
-          case 3:                               // advanced
-            RCHECK(ReadBits(&reader, 3) <= 4);  // Verify level = 0..4
-            RCHECK(ReadBits(&reader, 2) == 1);  // Verify colordiff_format = 1
-            break;
-        }
-        break;
-      }
-
-      case VC1_ENTRY_POINT_START_CODE:
-        // No fields in entry data to check. However, it must occur after
-        // sequence header.
-        RCHECK(sequence_start_code > 0);
-        break;
-
-      case VC1_FRAME_START_CODE:
-        ++frame_start_code;
-        break;
-    }
-    offset += 5;
-  }
-}
-
-// For some formats the signature is a bunch of characters. They are defined
-// below. Note that the first 4 characters of the string may be used as a TAG
-// in LookupContainerByFirst4. For signatures that contain embedded \0, use
-// uint8_t[].
-static const char kAmrSignature[] = "#!AMR";
-static const uint8_t kAsfSignature[] = {0x30, 0x26, 0xb2, 0x75, 0x8e, 0x66,
-                                        0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa,
-                                        0x00, 0x62, 0xce, 0x6c};
-static const char kAssSignature[] = "[Script Info]";
-static const char kAssBomSignature[] = UTF8_BYTE_ORDER_MARK "[Script Info]";
-static const uint8_t kWtvSignature[] = {0xb7, 0xd8, 0x00, 0x20, 0x37, 0x49,
-                                        0xda, 0x11, 0xa6, 0x4e, 0x00, 0x07,
-                                        0xe9, 0x5e, 0xad, 0x8d};
-
-// Attempt to determine the container type from the buffer provided. This is
-// a simple pass, that uses the first 4 bytes of the buffer as an index to get
-// a rough idea of the container format.
-static MediaContainerName LookupContainerByFirst4(const uint8_t* buffer,
-                                                  int buffer_size) {
-  // Minimum size that the code expects to exist without checking size.
-  if (buffer_size < 12) return CONTAINER_UNKNOWN;
-
-  uint32_t first4 = Read32(buffer);
-  switch (first4) {
-    case 0x1a45dfa3:
-      if (CheckWebm(buffer, buffer_size)) return CONTAINER_WEBM;
-      break;
-
-    case 0x3026b275:
-      if (StartsWith(buffer, buffer_size, kAsfSignature,
-                     sizeof(kAsfSignature))) {
-        return CONTAINER_ASF;
-      }
-      break;
-
-    case TAG('#', '!', 'A', 'M'):
-      if (StartsWith(buffer, buffer_size, kAmrSignature)) return CONTAINER_AMR;
-      break;
-
-    case TAG('#', 'E', 'X', 'T'):
-      if (CheckHls(buffer, buffer_size)) return CONTAINER_HLS;
-      break;
-
-    case TAG('.', 'R', 'M', 'F'):
-      if (buffer[4] == 0 && buffer[5] == 0) return CONTAINER_RM;
-      break;
-
-    case TAG('.', 'r', 'a', '\xfd'):
-      return CONTAINER_RM;
-
-    case TAG('B', 'I', 'K', 'b'):
-    case TAG('B', 'I', 'K', 'd'):
-    case TAG('B', 'I', 'K', 'f'):
-    case TAG('B', 'I', 'K', 'g'):
-    case TAG('B', 'I', 'K', 'h'):
-    case TAG('B', 'I', 'K', 'i'):
-      if (CheckBink(buffer, buffer_size)) return CONTAINER_BINK;
-      break;
-
-    case TAG('c', 'a', 'f', 'f'):
-      if (CheckCaf(buffer, buffer_size)) return CONTAINER_CAF;
-      break;
-
-    case TAG('D', 'E', 'X', 'A'):
-      if (buffer_size > 15 && Read16(buffer + 11) <= 2048 &&
-          Read16(buffer + 13) <= 2048) {
-        return CONTAINER_DXA;
-      }
-      break;
-
-    case TAG('D', 'T', 'S', 'H'):
-      if (Read32(buffer + 4) == TAG('D', 'H', 'D', 'R')) return CONTAINER_DTSHD;
-      break;
-
-    case 0x64a30100:
-    case 0x64a30200:
-    case 0x64a30300:
-    case 0x64a30400:
-    case 0x0001a364:
-    case 0x0002a364:
-    case 0x0003a364:
-      if (Read32(buffer + 4) != 0 && Read32(buffer + 8) != 0)
-        return CONTAINER_IRCAM;
-      break;
-
-    case TAG('f', 'L', 'a', 'C'):
-      return CONTAINER_FLAC;
-
-    case TAG('F', 'L', 'V', 0):
-    case TAG('F', 'L', 'V', 1):
-    case TAG('F', 'L', 'V', 2):
-    case TAG('F', 'L', 'V', 3):
-    case TAG('F', 'L', 'V', 4):
-      if (buffer[5] == 0 && Read32(buffer + 5) > 8) return CONTAINER_FLV;
-      break;
-
-    case TAG('F', 'O', 'R', 'M'):
-      switch (Read32(buffer + 8)) {
-        case TAG('A', 'I', 'F', 'F'):
-        case TAG('A', 'I', 'F', 'C'):
-          return CONTAINER_AIFF;
-      }
-      break;
-
-    case TAG('M', 'A', 'C', ' '):
-      return CONTAINER_APE;
-
-    case TAG('O', 'N', '2', ' '):
-      if (Read32(buffer + 8) == TAG('O', 'N', '2', 'f')) return CONTAINER_AVI;
-      break;
-
-    case TAG('O', 'g', 'g', 'S'):
-      if (buffer[5] <= 7) return CONTAINER_OGG;
-      break;
-
-    case TAG('R', 'F', '6', '4'):
-      if (buffer_size > 16 && Read32(buffer + 12) == TAG('d', 's', '6', '4'))
-        return CONTAINER_WAV;
-      break;
-
-    case TAG('R', 'I', 'F', 'F'):
-      switch (Read32(buffer + 8)) {
-        case TAG('A', 'V', 'I', ' '):
-        case TAG('A', 'V', 'I', 'X'):
-        case TAG('A', 'V', 'I', '\x19'):
-        case TAG('A', 'M', 'V', ' '):
-          return CONTAINER_AVI;
-        case TAG('W', 'A', 'V', 'E'):
-          return CONTAINER_WAV;
-      }
-      break;
-
-    case TAG('[', 'S', 'c', 'r'):
-      if (StartsWith(buffer, buffer_size, kAssSignature)) return CONTAINER_ASS;
-      break;
-
-    case TAG('\xef', '\xbb', '\xbf', '['):
-      if (StartsWith(buffer, buffer_size, kAssBomSignature))
-        return CONTAINER_ASS;
-      break;
-
-    case 0x7ffe8001:
-    case 0xfe7f0180:
-    case 0x1fffe800:
-    case 0xff1f00e8:
-      if (CheckDts(buffer, buffer_size)) return CONTAINER_DTS;
-      break;
-
-    case 0xb7d80020:
-      if (StartsWith(buffer, buffer_size, kWtvSignature,
-                     sizeof(kWtvSignature))) {
-        return CONTAINER_WTV;
-      }
-      break;
-  }
-
-  // Now try a few different ones that look at something other
-  // than the first 4 bytes.
-  uint32_t first3 = first4 & 0xffffff00;
-  switch (first3) {
-    case TAG('C', 'W', 'S', 0):
-    case TAG('F', 'W', 'S', 0):
-      return CONTAINER_SWF;
-
-    case TAG('I', 'D', '3', 0):
-      if (CheckMp3(buffer, buffer_size, true)) return CONTAINER_MP3;
-      break;
-  }
-
-  // Maybe the first 2 characters are something we can use.
-  uint32_t first2 = Read16(buffer);
-  switch (first2) {
-    case kAc3SyncWord:
-      if (CheckAc3(buffer, buffer_size)) return CONTAINER_AC3;
-      if (CheckEac3(buffer, buffer_size)) return CONTAINER_EAC3;
-      break;
-
-    case 0xfff0:
-    case 0xfff1:
-    case 0xfff8:
-    case 0xfff9:
-      if (CheckAac(buffer, buffer_size)) return CONTAINER_AAC;
-      break;
-  }
-
-  // Check if the file is in MP3 format without the header.
-  if (CheckMp3(buffer, buffer_size, false)) return CONTAINER_MP3;
-
-  return CONTAINER_UNKNOWN;
-}
-
-// Attempt to determine the container name from the buffer provided.
-MediaContainerName DetermineContainer(const uint8_t* buffer, int buffer_size) {
-  DCHECK(buffer);
-
-  // Since MOV/QuickTime/MPEG4 streams are common, check for them first.
-  if (CheckMov(buffer, buffer_size)) return CONTAINER_MOV;
-
-  // Next attempt the simple checks, that typically look at just the
-  // first few bytes of the file.
-  MediaContainerName result = LookupContainerByFirst4(buffer, buffer_size);
-  if (result != CONTAINER_UNKNOWN) return result;
-
-  // Additional checks that may scan a portion of the buffer.
-  if (CheckMpeg2ProgramStream(buffer, buffer_size)) return CONTAINER_MPEG2PS;
-  if (CheckMpeg2TransportStream(buffer, buffer_size)) return CONTAINER_MPEG2TS;
-  if (CheckMJpeg(buffer, buffer_size)) return CONTAINER_MJPEG;
-  if (CheckDV(buffer, buffer_size)) return CONTAINER_DV;
-  if (CheckH261(buffer, buffer_size)) return CONTAINER_H261;
-  if (CheckH263(buffer, buffer_size)) return CONTAINER_H263;
-  if (CheckH264(buffer, buffer_size)) return CONTAINER_H264;
-  if (CheckMpeg4BitStream(buffer, buffer_size)) return CONTAINER_MPEG4BS;
-  if (CheckVC1(buffer, buffer_size)) return CONTAINER_VC1;
-  if (CheckSrt(buffer, buffer_size)) return CONTAINER_SRT;
-  if (CheckGsm(buffer, buffer_size)) return CONTAINER_GSM;
-
-  // AC3/EAC3 might not start at the beginning of the stream,
-  // so scan for a start code.
-  int offset = 1;  // No need to start at byte 0 due to First4 check.
-  if (AdvanceToStartCode(buffer, buffer_size, &offset, 4, 16, kAc3SyncWord)) {
-    if (CheckAc3(buffer + offset, buffer_size - offset)) return CONTAINER_AC3;
-    if (CheckEac3(buffer + offset, buffer_size - offset)) return CONTAINER_EAC3;
-  }
-
-  return CONTAINER_UNKNOWN;
-}
-
-}  // namespace container_names
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/container_names.h b/cobalt/media/base/container_names.h
deleted file mode 100644
index 583f6f3..0000000
--- a/cobalt/media/base/container_names.h
+++ /dev/null
@@ -1,74 +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 COBALT_MEDIA_BASE_CONTAINER_NAMES_H_
-#define COBALT_MEDIA_BASE_CONTAINER_NAMES_H_
-
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-namespace container_names {
-
-// This is the set of input container formats detected for logging purposes. Not
-// all of these are enabled (and it varies by product). Any additions need to be
-// done at the end of the list (before CONTAINER_MAX). This list must be kept in
-// sync with the enum definition "MediaContainers" in
-// tools/metrics/histograms/histograms.xml.
-enum MediaContainerName {
-  CONTAINER_UNKNOWN,       // Unknown
-  CONTAINER_AAC,           // AAC (Advanced Audio Coding)
-  CONTAINER_AC3,           // AC-3
-  CONTAINER_AIFF,          // AIFF (Audio Interchange File Format)
-  CONTAINER_AMR,           // AMR (Adaptive Multi-Rate Audio)
-  CONTAINER_APE,           // APE (Monkey's Audio)
-  CONTAINER_ASF,           // ASF (Advanced / Active Streaming Format)
-  CONTAINER_ASS,           // SSA (SubStation Alpha) subtitle
-  CONTAINER_AVI,           // AVI (Audio Video Interleaved)
-  CONTAINER_BINK,          // Bink
-  CONTAINER_CAF,           // CAF (Apple Core Audio Format)
-  CONTAINER_DTS,           // DTS
-  CONTAINER_DTSHD,         // DTS-HD
-  CONTAINER_DV,            // DV (Digital Video)
-  CONTAINER_DXA,           // DXA
-  CONTAINER_EAC3,          // Enhanced AC-3
-  CONTAINER_FLAC,          // FLAC (Free Lossless Audio Codec)
-  CONTAINER_FLV,           // FLV (Flash Video)
-  CONTAINER_GSM,           // GSM (Global System for Mobile Audio)
-  CONTAINER_H261,          // H.261
-  CONTAINER_H263,          // H.263
-  CONTAINER_H264,          // H.264
-  CONTAINER_HLS,           // HLS (Apple HTTP Live Streaming PlayList)
-  CONTAINER_IRCAM,         // Berkeley/IRCAM/CARL Sound Format
-  CONTAINER_MJPEG,         // MJPEG video
-  CONTAINER_MOV,           // QuickTime / MOV / MPEG4
-  CONTAINER_MP3,           // MP3 (MPEG audio layer 2/3)
-  CONTAINER_MPEG2PS,       // MPEG-2 Program Stream
-  CONTAINER_MPEG2TS,       // MPEG-2 Transport Stream
-  CONTAINER_MPEG4BS,       // MPEG-4 Bitstream
-  CONTAINER_OGG,           // Ogg
-  CONTAINER_RM,            // RM (RealMedia)
-  CONTAINER_SRT,           // SRT (SubRip subtitle)
-  CONTAINER_SWF,           // SWF (ShockWave Flash)
-  CONTAINER_VC1,           // VC-1
-  CONTAINER_WAV,           // WAV / WAVE (Waveform Audio)
-  CONTAINER_WEBM,          // Matroska / WebM
-  CONTAINER_WTV,           // WTV (Windows Television)
-  CONTAINER_DASH,          // DASH (MPEG-DASH)
-  CONTAINER_SMOOTHSTREAM,  // SmoothStreaming
-  CONTAINER_MAX            // Must be last
-};
-
-// Determine the container type.
-MEDIA_EXPORT MediaContainerName DetermineContainer(const uint8_t* buffer,
-                                                   int buffer_size);
-
-}  // namespace container_names
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_CONTAINER_NAMES_H_
diff --git a/cobalt/media/base/container_names_fuzzertest.cc b/cobalt/media/base/container_names_fuzzertest.cc
deleted file mode 100644
index 09822c4..0000000
--- a/cobalt/media/base/container_names_fuzzertest.cc
+++ /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.
-
-#include "base/numerics/safe_conversions.h"
-#include "cobalt/media/base/container_names.h"
-#include "starboard/types.h"
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  media::container_names::DetermineContainer(data,
-                                             base::checked_cast<int>(size));
-  return 0;
-}
diff --git a/cobalt/media/base/container_names_unittest.cc b/cobalt/media/base/container_names_unittest.cc
deleted file mode 100644
index 1783260..0000000
--- a/cobalt/media/base/container_names_unittest.cc
+++ /dev/null
@@ -1,253 +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.
-
-#include "cobalt/media/base/container_names.h"
-
-#include "base/files/file_util.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-namespace container_names {
-
-// Using a macros to simplify tests. Since EXPECT_EQ outputs the second argument
-// as a string when it fails, this lets the output identify what item actually
-// failed.
-#define VERIFY(buffer, name)                                                   \
-  EXPECT_EQ(name, DetermineContainer(reinterpret_cast<const uint8_t*>(buffer), \
-                                     sizeof(buffer)))
-
-// Test that small buffers are handled correctly.
-TEST(ContainerNamesTest, CheckSmallBuffer) {
-  // Empty buffer.
-  char buffer[1];  // ([0] not allowed on win)
-  VERIFY(buffer, CONTAINER_UNKNOWN);
-
-  // Try a simple SRT file.
-  char buffer1[] =
-      "1\n"
-      "00:03:23,550 --> 00:03:24,375\n"
-      "You always had a hard time finding your place in this world.\n"
-      "\n"
-      "2\n"
-      "00:03:24,476 --> 00:03:25,175\n"
-      "What are you talking about?\n";
-  VERIFY(buffer1, CONTAINER_SRT);
-
-  // HLS has it's own loop.
-  char buffer2[] =
-      "#EXTM3U"
-      "some other random stuff"
-      "#EXT-X-MEDIA-SEQUENCE:";
-  VERIFY(buffer2, CONTAINER_HLS);
-
-  // Try a large buffer all zeros.
-  char buffer3[4096];
-  memset(buffer3, 0, sizeof(buffer3));
-  VERIFY(buffer3, CONTAINER_UNKNOWN);
-
-  // Reuse buffer, but all \n this time.
-  memset(buffer3, '\n', sizeof(buffer3));
-  VERIFY(buffer3, CONTAINER_UNKNOWN);
-}
-
-#define BYTE_ORDER_MARK "\xef\xbb\xbf"
-
-// Note that the comparisons need at least 12 bytes, so make sure the buffer is
-// at least that size.
-const char kAmrBuffer[12] = "#!AMR";
-uint8_t kAsfBuffer[] = {0x30, 0x26, 0xb2, 0x75, 0x8e, 0x66, 0xcf, 0x11,
-                        0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c};
-const char kAss1Buffer[] = "[Script Info]";
-const char kAss2Buffer[] = BYTE_ORDER_MARK "[Script Info]";
-uint8_t kCafBuffer[] = {
-    'c', 'a', 'f', 'f', 0,   1, 0, 0, 'd', 'e', 's', 'c', 0,   0, 0, 0, 0, 0, 0,
-    32,  64,  229, 136, 128, 0, 0, 0, 0,   'a', 'a', 'c', ' ', 0, 0, 0, 2, 0, 0,
-    0,   0,   0,   0,   4,   0, 0, 0, 0,   2,   0,   0,   0,   0};
-const char kDtshdBuffer[12] = "DTSHDHDR";
-const char kDxaBuffer[16] = "DEXA";
-const char kFlacBuffer[12] = "fLaC";
-uint8_t kFlvBuffer[12] = {'F', 'L', 'V', 0, 0, 0, 0, 1, 0, 0, 0, 0};
-uint8_t kIrcamBuffer[] = {0x64, 0xa3, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1};
-const char kRm1Buffer[12] = ".RMF\0\0";
-const char kRm2Buffer[12] = ".ra\xfd";
-uint8_t kWtvBuffer[] = {0xb7, 0xd8, 0x00, 0x20, 0x37, 0x49, 0xda, 0x11,
-                        0xa6, 0x4e, 0x00, 0x07, 0xe9, 0x5e, 0xad, 0x8d};
-uint8_t kBug263073Buffer[] = {
-    0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70, 0x6d, 0x70, 0x34,
-    0x32, 0x00, 0x00, 0x00, 0x00, 0x69, 0x73, 0x6f, 0x6d, 0x6d, 0x70,
-    0x34, 0x32, 0x00, 0x00, 0x00, 0x01, 0x6d, 0x64, 0x61, 0x74, 0x00,
-    0x00, 0x00, 0x00, 0xaa, 0x2e, 0x22, 0xcf, 0x00, 0x00, 0x00, 0x37,
-    0x67, 0x64, 0x00, 0x28, 0xac, 0x2c, 0xa4, 0x01, 0xe0, 0x08, 0x9f,
-    0x97, 0x01, 0x52, 0x02, 0x02, 0x02, 0x80, 0x00, 0x01};
-uint8_t kBug584401Buffer[] = {
-    0x1a, 0x45, 0xdf, 0xa3, 0x01, 0x00, 0x3b, 0x00, 0xb1, 0x00, 0x00, 0x1f,
-    0x42, 0x86, 0x81, 0x01, 0x42, 0xf7, 0x81, 0x01, 0x42, 0xf2, 0x0b, 0x77,
-    0x01, 0xb2, 0x74, 0x87, 0xc0, 0x00, 0x20, 0x84, 0x21, 0x08, 0x23, 0x00,
-    0xae, 0x06, 0x06, 0x01, 0x81, 0x87, 0xbb, 0x8e, 0x0f, 0x9f, 0x3e, 0x7c,
-    0xfa, 0x61, 0xeb, 0x8e, 0x97, 0x74, 0x37, 0xd0, 0x5f, 0x5c, 0x75, 0x1e,
-    0x71, 0x30, 0xfe, 0x7c, 0xe0, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c,
-    0xf8, 0x00, 0xc7, 0x32, 0xe2, 0x31, 0xb9, 0x58, 0x1a, 0xe7, 0xf9, 0x98,
-    0x0c, 0xdd, 0x6f, 0xd4, 0x20, 0xb7, 0xe4, 0xb4, 0x7e, 0xaa, 0xdf, 0x29,
-    0xd6, 0x9d, 0x2b, 0x37, 0x2f, 0x7a, 0xc2, 0x5f, 0x52, 0x44, 0x01, 0xdc,
-    0x32, 0x96, 0xbb, 0xcb, 0x25, 0x52, 0x52, 0xac, 0x6f, 0xb1, 0xbd, 0x85,
-    0x02, 0x83, 0x7f, 0x5e, 0x43, 0x98, 0xa6, 0x81, 0x04, 0x42, 0xf3, 0x9b,
-    0x81, 0x30, 0x26, 0xb2, 0x75, 0x8e, 0x66, 0xcf, 0x11, 0xa6, 0xd9, 0x00,
-    0xaa, 0x00, 0x62, 0xce, 0x6c, 0x6d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa1, 0xdc, 0xab, 0x8c, 0x47,
-    0xa9, 0xcf, 0x11, 0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65, 0x68,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0x82, 0x84, 0x77, 0x2a,
-    0x65, 0x62, 0x6d, 0x42, 0xbe, 0x4c, 0xda, 0xc9, 0x4c, 0xa5, 0x0f, 0x15,
-    0xe8, 0xfd, 0x5b, 0x09, 0x8c, 0x38, 0xd7, 0x18, 0x0a, 0x68, 0x41, 0x46,
-    0x63, 0x18, 0xf9, 0xf4, 0xcb, 0xc7, 0x57, 0x95, 0xd8, 0x0b, 0x2c, 0x91,
-    0x70, 0x1b, 0x81, 0xd3, 0xda, 0xa0, 0x62, 0x87, 0x2d, 0x03, 0x50, 0x6d,
-    0x26, 0xb1, 0xcc, 0xb8, 0x8c, 0x81, 0x6e, 0x56};
-uint8_t kBug585243Buffer[] = {0x1a, 0x45, 0xdf, 0xa3, 0x01, 0x00,
-                              0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
-                              0x42, 0x82, 0x42, 0x82, 0x00, 0x00};
-
-// Test that containers that start with fixed strings are handled correctly.
-// This is to verify that the TAG matches the first 4 characters of the string.
-TEST(ContainerNamesTest, CheckFixedStrings) {
-  VERIFY(kAmrBuffer, CONTAINER_AMR);
-  VERIFY(kAsfBuffer, CONTAINER_ASF);
-  VERIFY(kAss1Buffer, CONTAINER_ASS);
-  VERIFY(kAss2Buffer, CONTAINER_ASS);
-  VERIFY(kCafBuffer, CONTAINER_CAF);
-  VERIFY(kDtshdBuffer, CONTAINER_DTSHD);
-  VERIFY(kDxaBuffer, CONTAINER_DXA);
-  VERIFY(kFlacBuffer, CONTAINER_FLAC);
-  VERIFY(kFlvBuffer, CONTAINER_FLV);
-  VERIFY(kIrcamBuffer, CONTAINER_IRCAM);
-  VERIFY(kRm1Buffer, CONTAINER_RM);
-  VERIFY(kRm2Buffer, CONTAINER_RM);
-  VERIFY(kWtvBuffer, CONTAINER_WTV);
-  VERIFY(kBug263073Buffer, CONTAINER_MOV);
-  VERIFY(kBug584401Buffer, CONTAINER_EAC3);
-  VERIFY(kBug585243Buffer, CONTAINER_UNKNOWN);
-}
-
-// Determine the container type of a specified file.
-void TestFile(MediaContainerName expected, const base::FilePath& filename) {
-  char buffer[8192];
-
-  // Windows implementation of ReadFile fails if file smaller than desired size,
-  // so use file length if file less than 8192 bytes (http://crbug.com/243885).
-  int read_size = sizeof(buffer);
-  int64_t actual_size;
-  if (base::GetFileSize(filename, &actual_size) && actual_size < read_size)
-    read_size = actual_size;
-  int read = base::ReadFile(filename, buffer, read_size);
-
-  // Now verify the type.
-  EXPECT_EQ(expected,
-            DetermineContainer(reinterpret_cast<const uint8_t*>(buffer), read))
-      << "Failure with file " << filename.value();
-}
-
-TEST(ContainerNamesTest, FileCheckOGG) {
-  TestFile(CONTAINER_OGG, GetTestDataFilePath("bear.ogv"));
-  TestFile(CONTAINER_OGG, GetTestDataFilePath("9ch.ogg"));
-}
-
-TEST(ContainerNamesTest, FileCheckWAV) {
-  TestFile(CONTAINER_WAV, GetTestDataFilePath("4ch.wav"));
-  TestFile(CONTAINER_WAV, GetTestDataFilePath("sfx_f32le.wav"));
-  TestFile(CONTAINER_WAV, GetTestDataFilePath("sfx_s16le.wav"));
-}
-
-TEST(ContainerNamesTest, FileCheckMOV) {
-  TestFile(CONTAINER_MOV, GetTestDataFilePath("bear-1280x720.mp4"));
-  TestFile(CONTAINER_MOV, GetTestDataFilePath("sfx.m4a"));
-}
-
-TEST(ContainerNamesTest, FileCheckWEBM) {
-  TestFile(CONTAINER_WEBM, GetTestDataFilePath("bear-320x240.webm"));
-  TestFile(CONTAINER_WEBM, GetTestDataFilePath("no_streams.webm"));
-  TestFile(CONTAINER_WEBM, GetTestDataFilePath("webm_ebml_element"));
-}
-
-TEST(ContainerNamesTest, FileCheckMP3) {
-  TestFile(CONTAINER_MP3, GetTestDataFilePath("id3_test.mp3"));
-  TestFile(CONTAINER_MP3, GetTestDataFilePath("sfx.mp3"));
-}
-
-TEST(ContainerNamesTest, FileCheckAC3) {
-  TestFile(CONTAINER_AC3, GetTestDataFilePath("bear.ac3"));
-}
-
-TEST(ContainerNamesTest, FileCheckAAC) {
-  TestFile(CONTAINER_AAC, GetTestDataFilePath("bear.adts"));
-}
-
-TEST(ContainerNamesTest, FileCheckAIFF) {
-  TestFile(CONTAINER_AIFF, GetTestDataFilePath("bear.aiff"));
-}
-
-TEST(ContainerNamesTest, FileCheckASF) {
-  TestFile(CONTAINER_ASF, GetTestDataFilePath("bear.asf"));
-}
-
-TEST(ContainerNamesTest, FileCheckAVI) {
-  TestFile(CONTAINER_AVI, GetTestDataFilePath("bear.avi"));
-}
-
-TEST(ContainerNamesTest, FileCheckEAC3) {
-  TestFile(CONTAINER_EAC3, GetTestDataFilePath("bear.eac3"));
-}
-
-TEST(ContainerNamesTest, FileCheckFLAC) {
-  TestFile(CONTAINER_FLAC, GetTestDataFilePath("bear.flac"));
-}
-
-TEST(ContainerNamesTest, FileCheckFLV) {
-  TestFile(CONTAINER_FLV, GetTestDataFilePath("bear.flv"));
-}
-
-TEST(ContainerNamesTest, FileCheckH261) {
-  TestFile(CONTAINER_H261, GetTestDataFilePath("bear.h261"));
-}
-
-TEST(ContainerNamesTest, FileCheckH263) {
-  TestFile(CONTAINER_H263, GetTestDataFilePath("bear.h263"));
-}
-
-TEST(ContainerNamesTest, FileCheckMJPEG) {
-  TestFile(CONTAINER_MJPEG, GetTestDataFilePath("bear.mjpeg"));
-}
-
-TEST(ContainerNamesTest, FileCheckMPEG2PS) {
-  TestFile(CONTAINER_MPEG2PS, GetTestDataFilePath("bear.mpeg"));
-}
-
-TEST(ContainerNamesTest, FileCheckMPEG2TS) {
-  TestFile(CONTAINER_MPEG2TS, GetTestDataFilePath("bear.m2ts"));
-}
-
-TEST(ContainerNamesTest, FileCheckRM) {
-  TestFile(CONTAINER_RM, GetTestDataFilePath("bear.rm"));
-}
-
-TEST(ContainerNamesTest, FileCheckSWF) {
-  TestFile(CONTAINER_SWF, GetTestDataFilePath("bear.swf"));
-}
-
-// Try a few non containers.
-TEST(ContainerNamesTest, FileCheckUNKNOWN) {
-  TestFile(CONTAINER_UNKNOWN, GetTestDataFilePath("ten_byte_file"));
-  TestFile(CONTAINER_UNKNOWN, GetTestDataFilePath("README"));
-  TestFile(CONTAINER_UNKNOWN, GetTestDataFilePath("bali_640x360_P422.yuv"));
-  TestFile(CONTAINER_UNKNOWN, GetTestDataFilePath("bali_640x360_RGB24.rgb"));
-  TestFile(CONTAINER_UNKNOWN, GetTestDataFilePath("webm_vp8_track_entry"));
-}
-
-}  // namespace container_names
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/data_buffer.cc b/cobalt/media/base/data_buffer.cc
deleted file mode 100644
index 9f5f11b..0000000
--- a/cobalt/media/base/data_buffer.cc
+++ /dev/null
@@ -1,55 +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 "cobalt/media/base/data_buffer.h"
-
-#include <memory>
-#include <utility>
-
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-DataBuffer::DataBuffer(int buffer_size)
-    : buffer_size_(buffer_size), data_size_(0) {
-  CHECK_GE(buffer_size, 0);
-  data_.reset(new uint8_t[buffer_size_]);
-}
-
-DataBuffer::DataBuffer(std::unique_ptr<uint8_t[]> buffer, int buffer_size)
-    : data_(std::move(buffer)),
-      buffer_size_(buffer_size),
-      data_size_(buffer_size) {
-  CHECK(data_.get());
-  CHECK_GE(buffer_size, 0);
-}
-
-DataBuffer::DataBuffer(const uint8_t* data, int data_size)
-    : buffer_size_(data_size), data_size_(data_size) {
-  if (!data) {
-    CHECK_EQ(data_size, 0);
-    return;
-  }
-
-  CHECK_GE(data_size, 0);
-  data_.reset(new uint8_t[buffer_size_]);
-  memcpy(data_.get(), data, data_size_);
-}
-
-DataBuffer::~DataBuffer() {}
-
-// static
-scoped_refptr<DataBuffer> DataBuffer::CopyFrom(const uint8_t* data, int size) {
-  // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
-  CHECK(data);
-  return base::WrapRefCounted(new DataBuffer(data, size));
-}
-
-// static
-scoped_refptr<DataBuffer> DataBuffer::CreateEOSBuffer() {
-  return base::WrapRefCounted(new DataBuffer(NULL, 0));
-}
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/data_buffer.h b/cobalt/media/base/data_buffer.h
deleted file mode 100644
index 9dab5ac..0000000
--- a/cobalt/media/base/data_buffer.h
+++ /dev/null
@@ -1,118 +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 COBALT_MEDIA_BASE_DATA_BUFFER_H_
-#define COBALT_MEDIA_BASE_DATA_BUFFER_H_
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// A simple buffer that takes ownership of the given data pointer or allocates
-// as necessary.
-//
-// Unlike DecoderBuffer, allocations are assumed to be allocated with the
-// default memory allocator (i.e., new uint8_t[]).
-//
-// NOTE: It is illegal to call any method when end_of_stream() is true.
-class MEDIA_EXPORT DataBuffer : public base::RefCountedThreadSafe<DataBuffer> {
- public:
-  // Allocates buffer of size |buffer_size| >= 0.
-  explicit DataBuffer(int buffer_size);
-
-  // Assumes valid data of size |buffer_size|.
-  DataBuffer(std::unique_ptr<uint8_t[]> buffer, int buffer_size);
-
-  // Create a DataBuffer whose |data_| is copied from |data|.
-  //
-  // |data| must not be null and |size| must be >= 0.
-  static scoped_refptr<DataBuffer> CopyFrom(const uint8_t* data, int size);
-
-  // Create a DataBuffer indicating we've reached end of stream.
-  //
-  // Calling any method other than end_of_stream() on the resulting buffer
-  // is disallowed.
-  static scoped_refptr<DataBuffer> CreateEOSBuffer();
-
-  base::TimeDelta timestamp() const {
-    DCHECK(!end_of_stream());
-    return timestamp_;
-  }
-
-  void set_timestamp(const base::TimeDelta& timestamp) {
-    DCHECK(!end_of_stream());
-    timestamp_ = timestamp;
-  }
-
-  base::TimeDelta duration() const {
-    DCHECK(!end_of_stream());
-    return duration_;
-  }
-
-  void set_duration(const base::TimeDelta& duration) {
-    DCHECK(!end_of_stream());
-    duration_ = duration;
-  }
-
-  const uint8_t* data() const {
-    DCHECK(!end_of_stream());
-    return data_.get();
-  }
-
-  uint8_t* writable_data() {
-    DCHECK(!end_of_stream());
-    return data_.get();
-  }
-
-  // The size of valid data in bytes.
-  //
-  // Setting this value beyond the buffer size is disallowed.
-  int data_size() const {
-    DCHECK(!end_of_stream());
-    return data_size_;
-  }
-
-  void set_data_size(int data_size) {
-    DCHECK(!end_of_stream());
-    CHECK_LE(data_size, buffer_size_);
-    data_size_ = data_size;
-  }
-
-  // If there's no data in this buffer, it represents end of stream.
-  bool end_of_stream() const { return data_ == NULL; }
-
- protected:
-  friend class base::RefCountedThreadSafe<DataBuffer>;
-
-  // Allocates buffer of size |data_size|, copies [data,data+data_size) to
-  // the allocated buffer and sets data size to |data_size|.
-  //
-  // If |data| is null an end of stream buffer is created.
-  DataBuffer(const uint8_t* data, int data_size);
-
-  virtual ~DataBuffer();
-
- private:
-  base::TimeDelta timestamp_;
-  base::TimeDelta duration_;
-
-  std::unique_ptr<uint8_t[]> data_;
-  int buffer_size_;
-  int data_size_;
-
-  DISALLOW_COPY_AND_ASSIGN(DataBuffer);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_DATA_BUFFER_H_
diff --git a/cobalt/media/base/data_buffer_unittest.cc b/cobalt/media/base/data_buffer_unittest.cc
deleted file mode 100644
index 9eafcfa..0000000
--- a/cobalt/media/base/data_buffer_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 "cobalt/media/base/data_buffer.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/basictypes.h"
-#include "base/strings/string_util.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(DataBufferTest, Constructor_ZeroSize) {
-  // Zero-sized buffers are valid. In practice they aren't used very much but it
-  // eliminates clients from worrying about null data pointers.
-  scoped_refptr<DataBuffer> buffer = new DataBuffer(0);
-  EXPECT_TRUE(buffer->data());
-  EXPECT_TRUE(buffer->writable_data());
-  EXPECT_EQ(0, buffer->data_size());
-  EXPECT_FALSE(buffer->end_of_stream());
-}
-
-TEST(DataBufferTest, Constructor_NonZeroSize) {
-  // Buffer size should be set.
-  scoped_refptr<DataBuffer> buffer = new DataBuffer(10);
-  EXPECT_TRUE(buffer->data());
-  EXPECT_TRUE(buffer->writable_data());
-  EXPECT_EQ(0, buffer->data_size());
-  EXPECT_FALSE(buffer->end_of_stream());
-}
-
-TEST(DataBufferTest, Constructor_ScopedArray) {
-  // Data should be passed and both data and buffer size should be set.
-  const int kSize = 8;
-  std::unique_ptr<uint8_t[]> data(new uint8_t[kSize]);
-  const uint8_t* kData = data.get();
-
-  scoped_refptr<DataBuffer> buffer = new DataBuffer(std::move(data), kSize);
-  EXPECT_TRUE(buffer->data());
-  EXPECT_TRUE(buffer->writable_data());
-  EXPECT_EQ(kData, buffer->data());
-  EXPECT_EQ(kSize, buffer->data_size());
-  EXPECT_FALSE(buffer->end_of_stream());
-}
-
-TEST(DataBufferTest, CopyFrom) {
-  const uint8_t kTestData[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
-  const int kTestDataSize = arraysize(kTestData);
-
-  scoped_refptr<DataBuffer> buffer =
-      DataBuffer::CopyFrom(kTestData, kTestDataSize);
-  EXPECT_EQ(kTestDataSize, buffer->data_size());
-  EXPECT_FALSE(buffer->end_of_stream());
-
-  // Ensure we are copying the data, not just pointing to the original data.
-  EXPECT_EQ(0, memcmp(buffer->data(), kTestData, kTestDataSize));
-  buffer->writable_data()[0] = 0xFF;
-  EXPECT_NE(0, memcmp(buffer->data(), kTestData, kTestDataSize));
-}
-
-TEST(DataBufferTest, CreateEOSBuffer) {
-  scoped_refptr<DataBuffer> buffer = DataBuffer::CreateEOSBuffer();
-  EXPECT_TRUE(buffer->end_of_stream());
-}
-
-TEST(DataBufferTest, Timestamp) {
-  const base::TimeDelta kZero;
-  const base::TimeDelta kTimestampA = base::TimeDelta::FromMicroseconds(1337);
-  const base::TimeDelta kTimestampB = base::TimeDelta::FromMicroseconds(1234);
-
-  scoped_refptr<DataBuffer> buffer = new DataBuffer(0);
-  EXPECT_TRUE(buffer->timestamp() == kZero);
-
-  buffer->set_timestamp(kTimestampA);
-  EXPECT_TRUE(buffer->timestamp() == kTimestampA);
-
-  buffer->set_timestamp(kTimestampB);
-  EXPECT_TRUE(buffer->timestamp() == kTimestampB);
-}
-
-TEST(DataBufferTest, Duration) {
-  const base::TimeDelta kZero;
-  const base::TimeDelta kDurationA = base::TimeDelta::FromMicroseconds(1337);
-  const base::TimeDelta kDurationB = base::TimeDelta::FromMicroseconds(1234);
-
-  scoped_refptr<DataBuffer> buffer = new DataBuffer(0);
-  EXPECT_TRUE(buffer->duration() == kZero);
-
-  buffer->set_duration(kDurationA);
-  EXPECT_TRUE(buffer->duration() == kDurationA);
-
-  buffer->set_duration(kDurationB);
-  EXPECT_TRUE(buffer->duration() == kDurationB);
-}
-
-TEST(DataBufferTest, ReadingWriting) {
-  const char kData[] = "hello";
-  const int kDataSize = arraysize(kData);
-  const char kNewData[] = "chromium";
-  const int kNewDataSize = arraysize(kNewData);
-
-  // Create a DataBuffer.
-  scoped_refptr<DataBuffer> buffer(new DataBuffer(kDataSize));
-  ASSERT_TRUE(buffer.get());
-
-  uint8_t* data = buffer->writable_data();
-  ASSERT_TRUE(data);
-  memcpy(data, kData, kDataSize);
-  buffer->set_data_size(kDataSize);
-  const uint8_t* read_only_data = buffer->data();
-  ASSERT_EQ(data, read_only_data);
-  ASSERT_EQ(0, memcmp(read_only_data, kData, kDataSize));
-  EXPECT_FALSE(buffer->end_of_stream());
-
-  scoped_refptr<DataBuffer> buffer2(new DataBuffer(kNewDataSize + 10));
-  data = buffer2->writable_data();
-  ASSERT_TRUE(data);
-  memcpy(data, kNewData, kNewDataSize);
-  buffer2->set_data_size(kNewDataSize);
-  read_only_data = buffer2->data();
-  EXPECT_EQ(kNewDataSize, buffer2->data_size());
-  ASSERT_EQ(data, read_only_data);
-  EXPECT_EQ(0, memcmp(read_only_data, kNewData, kNewDataSize));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/decoder_buffer.cc b/cobalt/media/base/decoder_buffer.cc
deleted file mode 100644
index bbdddb0..0000000
--- a/cobalt/media/base/decoder_buffer.cc
+++ /dev/null
@@ -1,204 +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 "cobalt/media/base/decoder_buffer.h"
-
-#include <vector>
-
-#include "starboard/media.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-namespace {
-SbMediaType DemuxerStreamTypeToSbMediaType(DemuxerStream::Type type) {
-  switch (type) {
-    case DemuxerStream::AUDIO:
-      return kSbMediaTypeAudio;
-    case DemuxerStream::VIDEO:
-      return kSbMediaTypeVideo;
-    case DemuxerStream::UNKNOWN:
-    case DemuxerStream::TEXT:
-    case DemuxerStream::NUM_TYPES:
-      break;
-  }
-  NOTREACHED();
-  return kSbMediaTypeAudio;
-}
-}  // namespace
-
-DecoderBuffer::ScopedAllocatorPtr::ScopedAllocatorPtr(Allocator* allocator,
-                                                      Type type, size_t size)
-    : allocator_(allocator), type_(type) {
-  if (size > 0) {
-    DCHECK(allocator_);
-    int padding = SbMediaGetBufferPadding(DemuxerStreamTypeToSbMediaType(type));
-    int alignment =
-        SbMediaGetBufferAlignment(DemuxerStreamTypeToSbMediaType(type));
-    allocations_ = allocator_->Allocate(size + padding, alignment,
-                                        static_cast<intptr_t>(type));
-    static bool logged_warning = false;
-    if (padding > 0) {
-      if (allocations_.number_of_buffers() > 0) {
-        const int kMaxPadding = 1024;
-        if (padding > kMaxPadding) {
-          if (!logged_warning) {
-            LOG(WARNING) << "Media buffer padding is larger than "
-                         << kMaxPadding
-                         << ", this will cause extra allocations.";
-            logged_warning = true;
-          }
-          std::vector<char> zeros(padding + 1, 0);
-          allocations_.Write(size, zeros.data(), padding);
-        } else {
-          char zeros[kMaxPadding + 1] = {0};
-          allocations_.Write(size, zeros, padding);
-        }
-        allocations_.ShrinkTo(size);
-      }
-    }
-  }
-}
-
-DecoderBuffer::ScopedAllocatorPtr::~ScopedAllocatorPtr() {
-  // |allocator_| can be NULL for EOS buffer.
-  if (allocator_) {
-    allocator_->Free(allocations_);
-  }
-}
-
-DecoderBuffer::DecoderBuffer() : data_(NULL, DemuxerStream::UNKNOWN, 0) {}
-
-DecoderBuffer::DecoderBuffer(Allocator* allocator, Type type, size_t size)
-    : data_(allocator, type, size) {}
-
-DecoderBuffer::DecoderBuffer(Allocator* allocator, Type type,
-                             const uint8_t* data, size_t size,
-                             const uint8_t* side_data, size_t side_data_size)
-    : data_(allocator, type, size), side_data_size_(side_data_size) {
-  if (!data) {
-    CHECK_EQ(size, 0u);
-    return;
-  }
-  if (allocations().number_of_buffers()) {
-    allocations().Write(0, data, size);
-  }
-  if (side_data_size_ > 0) {
-    DCHECK(side_data);
-    side_data_.reset(new uint8_t[side_data_size_]);
-    memcpy(side_data_.get(), side_data, side_data_size_);
-  }
-}
-
-DecoderBuffer::DecoderBuffer(Allocator* allocator, Type type,
-                             Allocator::Allocations allocations,
-                             const uint8_t* side_data, size_t side_data_size)
-    : data_(allocator, type, allocations.size()),
-      side_data_size_(side_data_size) {
-  int offset = 0;
-  for (int i = 0; i < allocations.number_of_buffers(); ++i) {
-    this->allocations().Write(offset, allocations.buffers()[i],
-                              allocations.buffer_sizes()[i]);
-    offset += allocations.buffer_sizes()[i];
-  }
-  if (side_data_size_ > 0) {
-    side_data_.reset(new uint8_t[side_data_size_]);
-    memcpy(side_data_.get(), side_data, side_data_size_);
-  }
-}
-
-DecoderBuffer::~DecoderBuffer() {}
-
-// static
-scoped_refptr<DecoderBuffer> DecoderBuffer::Create(Allocator* allocator,
-                                                   Type type, size_t size) {
-  DCHECK_GT(size, 0);
-  scoped_refptr<DecoderBuffer> decoder_buffer =
-      new DecoderBuffer(allocator, type, size);
-  if (decoder_buffer->has_data()) {
-    return decoder_buffer;
-  }
-  return NULL;
-}
-
-// static
-scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(Allocator* allocator,
-                                                     Type type,
-                                                     const uint8_t* data,
-                                                     size_t data_size) {
-  // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
-  CHECK(data);
-  scoped_refptr<DecoderBuffer> decoder_buffer =
-      new DecoderBuffer(allocator, type, data, data_size, NULL, 0);
-  if (decoder_buffer->has_data()) {
-    return decoder_buffer;
-  }
-  return NULL;
-}
-
-// static
-scoped_refptr<DecoderBuffer> DecoderBuffer::CopyFrom(
-    Allocator* allocator, Type type, const uint8_t* data, size_t data_size,
-    const uint8_t* side_data, size_t side_data_size) {
-  // If you hit this CHECK you likely have a bug in a demuxer. Go fix it.
-  CHECK(data);
-  CHECK(side_data);
-  scoped_refptr<DecoderBuffer> decoder_buffer = new DecoderBuffer(
-      allocator, type, data, data_size, side_data, side_data_size);
-  if (decoder_buffer->has_data() && decoder_buffer->has_side_data()) {
-    return decoder_buffer;
-  }
-  return NULL;
-}
-
-// static
-scoped_refptr<DecoderBuffer> DecoderBuffer::CreateEOSBuffer() {
-  return base::WrapRefCounted(new DecoderBuffer);
-}
-
-const char* DecoderBuffer::GetTypeName() const {
-  switch (type()) {
-    case DemuxerStream::AUDIO:
-      return "audio";
-    case DemuxerStream::VIDEO:
-      return "video";
-    case DemuxerStream::TEXT:
-      return "text";
-    case DemuxerStream::UNKNOWN:
-      return "unknown";
-    case DemuxerStream::NUM_TYPES:
-      // Fall-through to NOTREACHED().
-      break;
-  }
-  NOTREACHED();
-  return "";
-}
-
-std::string DecoderBuffer::AsHumanReadableString() {
-  if (end_of_stream()) {
-    return "end of stream";
-  }
-
-  std::ostringstream s;
-  s << "type: " << GetTypeName()
-    << " timestamp: " << timestamp_.InMicroseconds()
-    << " duration: " << duration_.InMicroseconds() << " size: " << data_size()
-    << " side_data_size: " << side_data_size_
-    << " is_key_frame: " << is_key_frame_
-    << " encrypted: " << (decrypt_config_ != NULL) << " discard_padding (ms): ("
-    << discard_padding_.first.InMilliseconds() << ", "
-    << discard_padding_.second.InMilliseconds() << ")";
-
-  if (decrypt_config_) s << " decrypt:" << (*decrypt_config_);
-
-  return s.str();
-}
-
-void DecoderBuffer::set_timestamp(base::TimeDelta timestamp) {
-  DCHECK(!end_of_stream());
-  timestamp_ = timestamp;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/decoder_buffer.h b/cobalt/media/base/decoder_buffer.h
deleted file mode 100644
index 13faf16..0000000
--- a/cobalt/media/base/decoder_buffer.h
+++ /dev/null
@@ -1,258 +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 COBALT_MEDIA_BASE_DECODER_BUFFER_H_
-#define COBALT_MEDIA_BASE_DECODER_BUFFER_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/memory/aligned_memory.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "nb/multipart_allocator.h"
-#include "starboard/media.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// A specialized buffer for interfacing with audio / video decoders.
-//
-// Specifically ensures that data is aligned and padded as necessary by the
-// underlying decoding framework.  On desktop platforms this means memory is
-// allocated using FFmpeg with particular alignment and padding requirements.
-//
-// Also includes decoder specific functionality for decryption.
-//
-// NOTE: It is illegal to call any method when end_of_stream() is true.
-class MEDIA_EXPORT DecoderBuffer
-    : public base::RefCountedThreadSafe<DecoderBuffer> {
- public:
-  typedef DemuxerStream::Type Type;
-  class Allocator : public nb::MultipartAllocator {
-   public:
-    // Update the video config so that constraints are appropriate for the
-    // current resolution.
-    virtual void UpdateVideoConfig(const VideoDecoderConfig& config) = 0;
-  };
-
-  // Create a DecoderBuffer whose |data_| points to a memory with at least
-  // |size| bytes.  Buffer will be padded and aligned as necessary.
-  // The buffer's |is_key_frame_| will default to false.
-  static scoped_refptr<DecoderBuffer> Create(Allocator* allocator, Type type,
-                                             size_t size);
-
-  // Create a DecoderBuffer whose |data_| is copied from |data|.  Buffer will be
-  // padded and aligned as necessary.  |data| must not be NULL and |size| >= 0.
-  // The buffer's |is_key_frame_| will default to false.
-  static scoped_refptr<DecoderBuffer> CopyFrom(Allocator* allocator, Type type,
-                                               const uint8_t* data,
-                                               size_t size);
-
-  // Create a DecoderBuffer whose |data_| is copied from |data| and |side_data_|
-  // is copied from |side_data|. Buffers will be padded and aligned as necessary
-  // Data pointers must not be NULL and sizes must be >= 0. The buffer's
-  // |is_key_frame_| will default to false.
-  static scoped_refptr<DecoderBuffer> CopyFrom(Allocator* allocator, Type type,
-                                               const uint8_t* data,
-                                               size_t data_size,
-                                               const uint8_t* side_data,
-                                               size_t side_data_size);
-
-  // Create a DecoderBuffer indicating we've reached end of stream.
-  //
-  // Calling any method other than end_of_stream() on the resulting buffer
-  // is disallowed.
-  static scoped_refptr<DecoderBuffer> CreateEOSBuffer();
-
-  // Returns the allocator.  This is usually used when creating a copy of the
-  // buffer.
-  Allocator* allocator() const { return data_.allocator(); }
-
-  // Gets the parser's media type associated with this buffer. Value is
-  // meaningless for EOS buffers.
-  Type type() const { return data_.type(); }
-  const char* GetTypeName() const;
-
-  base::TimeDelta timestamp() const {
-    DCHECK(!end_of_stream());
-    return timestamp_;
-  }
-
-  // TODO(dalecurtis): This should be renamed at some point, but to avoid a yak
-  // shave keep as a virtual with hacker_style() for now.
-  virtual void set_timestamp(base::TimeDelta timestamp);
-
-  base::TimeDelta duration() const {
-    DCHECK(!end_of_stream());
-    return duration_;
-  }
-
-  void set_duration(base::TimeDelta duration) {
-    DCHECK(!end_of_stream());
-    DCHECK(duration == kNoTimestamp ||
-           (duration >= base::TimeDelta() && duration != kInfiniteDuration))
-        << duration.InSecondsF();
-    duration_ = duration;
-  }
-
-  bool has_data() const { return allocations().number_of_buffers() > 0; }
-
-  const Allocator::Allocations& allocations() const {
-    return data_.allocations();
-  }
-  Allocator::Allocations& allocations() { return data_.allocations(); }
-
-  size_t data_size() const {
-    DCHECK(!end_of_stream());
-    return data_.allocations().size();
-  }
-
-  void shrink_to(size_t size) {
-    DCHECK_GE(static_cast<int>(size), 0);
-    allocations().ShrinkTo(static_cast<int>(size));
-  }
-
-  bool has_side_data() const { return side_data_.get() != NULL; }
-
-  const uint8_t* side_data() const {
-    DCHECK(!end_of_stream());
-    return side_data_.get();
-  }
-
-  size_t side_data_size() const {
-    DCHECK(!end_of_stream());
-    return side_data_size_;
-  }
-
-  // A discard window indicates the amount of data which should be discard from
-  // this buffer after decoding.  The first value is the amount of the front and
-  // the second the amount off the back.  A value of kInfiniteDuration for the
-  // first value indicates the entire buffer should be discarded; the second
-  // value must be base::TimeDelta() in this case.
-  typedef std::pair<base::TimeDelta, base::TimeDelta> DiscardPadding;
-  const DiscardPadding& discard_padding() const {
-    DCHECK(!end_of_stream());
-    return discard_padding_;
-  }
-
-  void set_discard_padding(const DiscardPadding& discard_padding) {
-    DCHECK(!end_of_stream());
-    discard_padding_ = discard_padding;
-  }
-
-  const DecryptConfig* decrypt_config() const {
-    DCHECK(!end_of_stream());
-    return decrypt_config_.get();
-  }
-
-  void set_decrypt_config(std::unique_ptr<DecryptConfig> decrypt_config) {
-    DCHECK(!end_of_stream());
-    decrypt_config_ = std::move(decrypt_config);
-  }
-
-  // If there's no data in this buffer, it represents end of stream.
-  bool end_of_stream() const { return !has_data(); }
-
-  // Indicates this buffer is part of a splice around |splice_timestamp_|.
-  // Returns kNoTimestamp if the buffer is not part of a splice.
-  base::TimeDelta splice_timestamp() const {
-    DCHECK(!end_of_stream());
-    return splice_timestamp_;
-  }
-
-  // When set to anything but kNoTimestamp indicates this buffer is part of a
-  // splice around |splice_timestamp|.
-  void set_splice_timestamp(base::TimeDelta splice_timestamp) {
-    DCHECK(!end_of_stream());
-    splice_timestamp_ = splice_timestamp;
-  }
-
-  bool is_key_frame() const {
-    DCHECK(!end_of_stream());
-    return is_key_frame_;
-  }
-
-  void set_is_key_frame(bool is_key_frame) {
-    DCHECK(!end_of_stream());
-    is_key_frame_ = is_key_frame;
-  }
-
-  // Returns a human-readable string describing |*this|.
-  std::string AsHumanReadableString();
-
- protected:
-  friend class base::RefCountedThreadSafe<DecoderBuffer>;
-
-  // The default ctor creates an EOS buffer without specific stream type.
-  DecoderBuffer();
-
-  // Allocates buffer with |size| >= 0.  Buffer will be padded and aligned
-  // as necessary, and |is_key_frame_| will default to false.
-  DecoderBuffer(Allocator* allocator, Type type, size_t size);
-
-  // Allocates a buffer of size |size| >= 0 and copies |data| into it.  Buffer
-  // will be padded and aligned as necessary.  If |data| is NULL then |data_| is
-  // set to NULL and |buffer_size_| to 0.  |is_key_frame_| will default to
-  // false.
-  DecoderBuffer(Allocator* allocator, Type type, const uint8_t* data,
-                size_t size, const uint8_t* side_data, size_t side_data_size);
-
-  // Allocates a buffer to copy the data in |allocations|.  Buffer will be
-  // padded and aligned as necessary.  |is_key_frame_| will default to false.
-  DecoderBuffer(Allocator* allocator, Type type,
-                Allocator::Allocations allocations, const uint8_t* side_data,
-                size_t side_data_size);
-
-  virtual ~DecoderBuffer();
-
- private:
-  class ScopedAllocatorPtr {
-   public:
-    ScopedAllocatorPtr(Allocator* allocator, Type type, size_t size);
-    ~ScopedAllocatorPtr();
-
-    const Allocator::Allocations& allocations() const { return allocations_; }
-    Allocator::Allocations& allocations() { return allocations_; }
-
-    Allocator* allocator() const { return allocator_; }
-    Type type() const { return type_; }
-
-   private:
-    Allocator* allocator_;
-    Type type_;
-    Allocator::Allocations allocations_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedAllocatorPtr);
-  };
-
-  base::TimeDelta timestamp_;
-  base::TimeDelta duration_;
-
-  ScopedAllocatorPtr data_;
-  std::unique_ptr<DecryptConfig> decrypt_config_;
-  DiscardPadding discard_padding_;
-  base::TimeDelta splice_timestamp_ = kNoTimestamp;
-  bool is_key_frame_ = false;
-
-  size_t side_data_size_ = 0;
-  std::unique_ptr<uint8_t[]> side_data_;
-
-  DISALLOW_COPY_AND_ASSIGN(DecoderBuffer);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_DECODER_BUFFER_H_
diff --git a/cobalt/media/base/decoder_buffer_cache.cc b/cobalt/media/base/decoder_buffer_cache.cc
index 865216f..440053d 100644
--- a/cobalt/media/base/decoder_buffer_cache.cc
+++ b/cobalt/media/base/decoder_buffer_cache.cc
@@ -66,7 +66,7 @@
   video_buffer_index_ = 0;
 }
 
-scoped_refptr<DecoderBuffer> DecoderBufferCache::GetBuffer(
+scoped_refptr<::media::DecoderBuffer> DecoderBufferCache::GetBuffer(
     DemuxerStream::Type type) const {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
diff --git a/cobalt/media/base/decoder_buffer_cache.h b/cobalt/media/base/decoder_buffer_cache.h
index 4e5190b..67c95b5 100644
--- a/cobalt/media/base/decoder_buffer_cache.h
+++ b/cobalt/media/base/decoder_buffer_cache.h
@@ -20,8 +20,8 @@
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer_stream.h"
+#include "third_party/chromium//media/base/decoder_buffer.h"
+#include "third_party/chromium//media/base/demuxer_stream.h"
 
 namespace cobalt {
 namespace media {
@@ -33,6 +33,9 @@
 // be useful to implement suspend/resume.
 class DecoderBufferCache {
  public:
+  typedef ::media::DecoderBuffer DecoderBuffer;
+  typedef ::media::DemuxerStream DemuxerStream;
+
   DecoderBufferCache();
 
   void AddBuffer(DemuxerStream::Type type,
@@ -46,7 +49,7 @@
   void AdvanceToNextBuffer(DemuxerStream::Type type);
 
  private:
-  typedef std::deque<scoped_refptr<DecoderBuffer> > Buffers;
+  typedef std::deque<scoped_refptr<DecoderBuffer>> Buffers;
   typedef std::deque<base::TimeDelta> KeyFrameTimestamps;
 
   static size_t ClearSegmentsBeforeMediaTime(
diff --git a/cobalt/media/base/decoder_buffer_queue.cc b/cobalt/media/base/decoder_buffer_queue.cc
deleted file mode 100644
index ae06b3d..0000000
--- a/cobalt/media/base/decoder_buffer_queue.cc
+++ /dev/null
@@ -1,82 +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 "cobalt/media/base/decoder_buffer_queue.h"
-
-#include "base/logging.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-
-namespace cobalt {
-namespace media {
-
-DecoderBufferQueue::DecoderBufferQueue()
-    : earliest_valid_timestamp_(kNoTimestamp), data_size_(0) {}
-
-DecoderBufferQueue::~DecoderBufferQueue() {}
-
-void DecoderBufferQueue::Push(const scoped_refptr<DecoderBuffer>& buffer) {
-  CHECK(!buffer->end_of_stream());
-
-  queue_.push_back(buffer);
-
-  data_size_ += buffer->data_size();
-
-  // TODO(scherkus): FFmpeg returns some packets with no timestamp after
-  // seeking. Fix and turn this into CHECK(). See http://crbug.com/162192
-  if (buffer->timestamp() == kNoTimestamp) {
-    DVLOG(1) << "Buffer has no timestamp";
-    return;
-  }
-
-  if (earliest_valid_timestamp_ == kNoTimestamp) {
-    earliest_valid_timestamp_ = buffer->timestamp();
-  }
-
-  if (buffer->timestamp() < earliest_valid_timestamp_) {
-    DVLOG(2) << "Out of order timestamps: "
-             << buffer->timestamp().InMicroseconds() << " vs. "
-             << earliest_valid_timestamp_.InMicroseconds();
-    return;
-  }
-
-  earliest_valid_timestamp_ = buffer->timestamp();
-  in_order_queue_.push_back(buffer);
-}
-
-scoped_refptr<DecoderBuffer> DecoderBufferQueue::Pop() {
-  scoped_refptr<DecoderBuffer> buffer = queue_.front();
-  queue_.pop_front();
-
-  size_t buffer_data_size = buffer->data_size();
-  DCHECK_LE(buffer_data_size, data_size_);
-  data_size_ -= buffer_data_size;
-
-  if (!in_order_queue_.empty() &&
-      in_order_queue_.front().get() == buffer.get()) {
-    in_order_queue_.pop_front();
-  }
-
-  return buffer;
-}
-
-void DecoderBufferQueue::Clear() {
-  queue_.clear();
-  data_size_ = 0;
-  in_order_queue_.clear();
-  earliest_valid_timestamp_ = kNoTimestamp;
-}
-
-bool DecoderBufferQueue::IsEmpty() { return queue_.empty(); }
-
-base::TimeDelta DecoderBufferQueue::Duration() {
-  if (in_order_queue_.size() < 2) return base::TimeDelta();
-
-  base::TimeDelta start = in_order_queue_.front()->timestamp();
-  base::TimeDelta end = in_order_queue_.back()->timestamp();
-  return end - start;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/decoder_buffer_queue.h b/cobalt/media/base/decoder_buffer_queue.h
deleted file mode 100644
index b4ee7e7..0000000
--- a/cobalt/media/base/decoder_buffer_queue.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_DECODER_BUFFER_QUEUE_H_
-#define COBALT_MEDIA_BASE_DECODER_BUFFER_QUEUE_H_
-
-#include <deque>
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class DecoderBuffer;
-
-// Maintains a queue of DecoderBuffers in increasing timestamp order.
-//
-// Individual buffer durations are ignored when calculating the duration of the
-// queue i.e., the queue must have at least 2 in-order buffers to calculate
-// duration.
-//
-// Not thread safe: access must be externally synchronized.
-class MEDIA_EXPORT DecoderBufferQueue {
- public:
-  DecoderBufferQueue();
-  ~DecoderBufferQueue();
-
-  // Push |buffer| to the end of the queue. If |buffer| is queued out of order
-  // it will be excluded from duration calculations.
-  //
-  // It is invalid to push an end-of-stream |buffer|.
-  void Push(const scoped_refptr<DecoderBuffer>& buffer);
-
-  // Pops a DecoderBuffer from the front of the queue.
-  //
-  // It is invalid to call Pop() on an empty queue.
-  scoped_refptr<DecoderBuffer> Pop();
-
-  // Removes all queued buffers.
-  void Clear();
-
-  // Returns true if this queue is empty.
-  bool IsEmpty();
-
-  // Returns the duration of encoded data stored in this queue as measured by
-  // the timestamps of the earliest and latest buffers, ignoring out of order
-  // buffers.
-  //
-  // Returns zero if the queue is empty.
-  base::TimeDelta Duration();
-
-  // Returns the total size of buffers inside the queue.
-  size_t data_size() const { return data_size_; }
-
- private:
-  typedef std::deque<scoped_refptr<DecoderBuffer> > Queue;
-  Queue queue_;
-
-  // A subset of |queue_| that contains buffers that are in strictly
-  // increasing timestamp order. Used to calculate Duration() while ignoring
-  // out-of-order buffers.
-  Queue in_order_queue_;
-
-  base::TimeDelta earliest_valid_timestamp_;
-
-  // Total size in bytes of buffers in the queue.
-  size_t data_size_;
-
-  DISALLOW_COPY_AND_ASSIGN(DecoderBufferQueue);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_DECODER_BUFFER_QUEUE_H_
diff --git a/cobalt/media/base/decoder_buffer_queue_unittest.cc b/cobalt/media/base/decoder_buffer_queue_unittest.cc
deleted file mode 100644
index 5a655ff..0000000
--- a/cobalt/media/base/decoder_buffer_queue_unittest.cc
+++ /dev/null
@@ -1,170 +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 "cobalt/media/base/decoder_buffer_queue.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-static base::TimeDelta ToTimeDelta(int seconds) {
-  if (seconds < 0) return kNoTimestamp;
-  return base::TimeDelta::FromSeconds(seconds);
-}
-
-// Helper to create buffers with specified timestamp in seconds.
-//
-// Negative numbers will be converted to kNoTimestamp;
-static scoped_refptr<DecoderBuffer> CreateBuffer(int timestamp) {
-  scoped_refptr<DecoderBuffer> buffer = new DecoderBuffer(0);
-  buffer->set_timestamp(ToTimeDelta(timestamp));
-  buffer->set_duration(ToTimeDelta(0));
-  return buffer;
-}
-
-static scoped_refptr<DecoderBuffer> CreateBuffer(int timestamp, int size) {
-  scoped_refptr<DecoderBuffer> buffer = new DecoderBuffer(size);
-  buffer->set_timestamp(ToTimeDelta(timestamp));
-  buffer->set_duration(ToTimeDelta(0));
-  return buffer;
-}
-
-TEST(DecoderBufferQueueTest, IsEmpty) {
-  DecoderBufferQueue queue;
-  EXPECT_TRUE(queue.IsEmpty());
-
-  queue.Push(CreateBuffer(0));
-  EXPECT_FALSE(queue.IsEmpty());
-}
-
-TEST(DecoderBufferQueueTest, Clear) {
-  DecoderBufferQueue queue;
-  queue.Push(CreateBuffer(0));
-  queue.Push(CreateBuffer(1));
-  EXPECT_FALSE(queue.IsEmpty());
-  EXPECT_EQ(1, queue.Duration().InSeconds());
-
-  queue.Clear();
-  EXPECT_TRUE(queue.IsEmpty());
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-}
-
-TEST(DecoderBufferQueueTest, Duration) {
-  DecoderBufferQueue queue;
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-
-  queue.Push(CreateBuffer(0));
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-
-  queue.Push(CreateBuffer(1));
-  EXPECT_EQ(1, queue.Duration().InSeconds());
-
-  queue.Push(CreateBuffer(2));
-  EXPECT_EQ(2, queue.Duration().InSeconds());
-
-  queue.Push(CreateBuffer(4));
-  EXPECT_EQ(4, queue.Duration().InSeconds());
-
-  queue.Pop();
-  EXPECT_EQ(3, queue.Duration().InSeconds());
-
-  queue.Pop();
-  EXPECT_EQ(2, queue.Duration().InSeconds());
-
-  queue.Pop();
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-
-  queue.Pop();
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-}
-
-TEST(DecoderBufferQueueTest, Duration_OutOfOrder) {
-  DecoderBufferQueue queue;
-  queue.Push(CreateBuffer(10));
-  queue.Push(CreateBuffer(12));
-  EXPECT_EQ(2, queue.Duration().InSeconds());
-
-  // Out of order: duration shouldn't change.
-  queue.Push(CreateBuffer(8));
-  EXPECT_EQ(2, queue.Duration().InSeconds());
-
-  // Removing first buffer should leave the second buffer as the only buffer
-  // included in the duration calculation.
-  queue.Pop();
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-
-  // Removing second buffer leaves the out-of-order buffer. It shouldn't be
-  // included in duration calculations.
-  queue.Pop();
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-
-  // Push a still-too-early buffer. It shouldn't be included in duration
-  // calculations.
-  queue.Push(CreateBuffer(11));
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-
-  // Push a buffer that's after the earliest valid time. It's a singular valid
-  // buffer so duration is still zero.
-  queue.Push(CreateBuffer(14));
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-
-  // Push a second valid buffer. We should now have a duration.
-  queue.Push(CreateBuffer(17));
-  EXPECT_EQ(3, queue.Duration().InSeconds());
-}
-
-TEST(DecoderBufferQueueTest, Duration_NoTimestamp) {
-  // Buffers with no timestamp don't affect duration.
-  DecoderBufferQueue queue;
-  queue.Push(CreateBuffer(0));
-  queue.Push(CreateBuffer(4));
-  EXPECT_EQ(4, queue.Duration().InSeconds());
-
-  queue.Push(CreateBuffer(-1));
-  EXPECT_EQ(4, queue.Duration().InSeconds());
-
-  queue.Push(CreateBuffer(6));
-  EXPECT_EQ(6, queue.Duration().InSeconds());
-
-  queue.Pop();
-  EXPECT_EQ(2, queue.Duration().InSeconds());
-
-  queue.Pop();
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-
-  queue.Pop();
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-
-  queue.Pop();
-  EXPECT_EQ(0, queue.Duration().InSeconds());
-}
-
-TEST(DecoderBufferQueueTest, DataSize) {
-  DecoderBufferQueue queue;
-  EXPECT_EQ(queue.data_size(), 0u);
-
-  queue.Push(CreateBuffer(0, 1200u));
-  EXPECT_EQ(queue.data_size(), 1200u);
-
-  queue.Push(CreateBuffer(1, 1000u));
-  EXPECT_EQ(queue.data_size(), 2200u);
-
-  queue.Pop();
-  EXPECT_EQ(queue.data_size(), 1000u);
-
-  queue.Push(CreateBuffer(2, 999u));
-  queue.Push(CreateBuffer(3, 999u));
-  EXPECT_EQ(queue.data_size(), 2998u);
-
-  queue.Clear();
-  EXPECT_EQ(queue.data_size(), 0u);
-
-  queue.Push(CreateBuffer(4, 1400u));
-  EXPECT_EQ(queue.data_size(), 1400u);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/decoder_buffer_unittest.cc b/cobalt/media/base/decoder_buffer_unittest.cc
deleted file mode 100644
index f539c78..0000000
--- a/cobalt/media/base/decoder_buffer_unittest.cc
+++ /dev/null
@@ -1,141 +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 "cobalt/media/base/decoder_buffer.h"
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_util.h"
-#include "build/build_config.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(DecoderBufferTest, Constructors) {
-  scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(0));
-  EXPECT_TRUE(buffer->data());
-  EXPECT_EQ(0u, buffer->data_size());
-  EXPECT_FALSE(buffer->end_of_stream());
-  EXPECT_FALSE(buffer->is_key_frame());
-
-  const size_t kTestSize = 10;
-  scoped_refptr<DecoderBuffer> buffer3(new DecoderBuffer(kTestSize));
-  ASSERT_TRUE(buffer3.get());
-  EXPECT_EQ(kTestSize, buffer3->data_size());
-}
-
-TEST(DecoderBufferTest, CreateEOSBuffer) {
-  scoped_refptr<DecoderBuffer> buffer(DecoderBuffer::CreateEOSBuffer());
-  EXPECT_TRUE(buffer->end_of_stream());
-}
-
-TEST(DecoderBufferTest, CopyFrom) {
-  const uint8_t kData[] = "hello";
-  const size_t kDataSize = arraysize(kData);
-
-  scoped_refptr<DecoderBuffer> buffer2(DecoderBuffer::CopyFrom(
-      reinterpret_cast<const uint8_t*>(&kData), kDataSize));
-  ASSERT_TRUE(buffer2.get());
-  EXPECT_NE(kData, buffer2->data());
-  EXPECT_EQ(buffer2->data_size(), kDataSize);
-  EXPECT_EQ(0, memcmp(buffer2->data(), kData, kDataSize));
-  EXPECT_FALSE(buffer2->end_of_stream());
-  EXPECT_FALSE(buffer2->is_key_frame());
-
-  scoped_refptr<DecoderBuffer> buffer3(DecoderBuffer::CopyFrom(
-      reinterpret_cast<const uint8_t*>(&kData), kDataSize,
-      reinterpret_cast<const uint8_t*>(&kData), kDataSize));
-  ASSERT_TRUE(buffer3.get());
-  EXPECT_NE(kData, buffer3->data());
-  EXPECT_EQ(buffer3->data_size(), kDataSize);
-  EXPECT_EQ(0, memcmp(buffer3->data(), kData, kDataSize));
-  EXPECT_NE(kData, buffer3->side_data());
-  EXPECT_EQ(buffer3->side_data_size(), kDataSize);
-  EXPECT_EQ(0, memcmp(buffer3->side_data(), kData, kDataSize));
-  EXPECT_FALSE(buffer3->end_of_stream());
-  EXPECT_FALSE(buffer3->is_key_frame());
-}
-
-#if !defined(OS_ANDROID)
-TEST(DecoderBufferTest, PaddingAlignment) {
-  const uint8_t kData[] = "hello";
-  const size_t kDataSize = arraysize(kData);
-  scoped_refptr<DecoderBuffer> buffer2(DecoderBuffer::CopyFrom(
-      reinterpret_cast<const uint8_t*>(&kData), kDataSize));
-  ASSERT_TRUE(buffer2.get());
-
-  // Padding data should always be zeroed.
-  for (int i = 0; i < DecoderBuffer::kPaddingSize; i++)
-    EXPECT_EQ((buffer2->data() + kDataSize)[i], 0);
-
-  // If the data is padded correctly we should be able to read and write past
-  // the end of the data by DecoderBuffer::kPaddingSize bytes without crashing
-  // or Valgrind/ASAN throwing errors.
-  const uint8_t kFillChar = 0xFF;
-  memset(buffer2->writable_data() + kDataSize, kFillChar,
-              DecoderBuffer::kPaddingSize);
-  for (int i = 0; i < DecoderBuffer::kPaddingSize; i++)
-    EXPECT_EQ((buffer2->data() + kDataSize)[i], kFillChar);
-
-  EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(buffer2->data()) &
-                    (DecoderBuffer::kAlignmentSize - 1));
-
-  EXPECT_FALSE(buffer2->is_key_frame());
-}
-#endif
-
-TEST(DecoderBufferTest, ReadingWriting) {
-  const char kData[] = "hello";
-  const size_t kDataSize = arraysize(kData);
-
-  scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(kDataSize));
-  ASSERT_TRUE(buffer.get());
-
-  uint8_t* data = buffer->writable_data();
-  ASSERT_TRUE(data);
-  ASSERT_EQ(kDataSize, buffer->data_size());
-  memcpy(data, kData, kDataSize);
-  const uint8_t* read_only_data = buffer->data();
-  ASSERT_EQ(data, read_only_data);
-  ASSERT_EQ(0, memcmp(read_only_data, kData, kDataSize));
-  EXPECT_FALSE(buffer->end_of_stream());
-}
-
-TEST(DecoderBufferTest, DecryptConfig) {
-  scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(0));
-  EXPECT_FALSE(buffer->decrypt_config());
-
-  const char kKeyId[] = "key id";
-  const char kIv[] = "0123456789abcdef";
-  std::vector<SubsampleEntry> subsamples;
-  subsamples.push_back(SubsampleEntry(10, 5));
-  subsamples.push_back(SubsampleEntry(15, 7));
-
-  DecryptConfig decrypt_config(kKeyId, kIv, subsamples);
-
-  buffer->set_decrypt_config(
-      base::MakeUnique<DecryptConfig>(kKeyId, kIv, subsamples));
-
-  EXPECT_TRUE(buffer->decrypt_config());
-  EXPECT_TRUE(buffer->decrypt_config()->Matches(decrypt_config));
-}
-
-TEST(DecoderBufferTest, IsKeyFrame) {
-  scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(0));
-  EXPECT_FALSE(buffer->is_key_frame());
-
-  buffer->set_is_key_frame(false);
-  EXPECT_FALSE(buffer->is_key_frame());
-
-  buffer->set_is_key_frame(true);
-  EXPECT_TRUE(buffer->is_key_frame());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/decrypt_config.cc b/cobalt/media/base/decrypt_config.cc
deleted file mode 100644
index e5f438b..0000000
--- a/cobalt/media/base/decrypt_config.cc
+++ /dev/null
@@ -1,116 +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 "cobalt/media/base/decrypt_config.h"
-
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-const char* EncryptionModeAsString(EncryptionMode mode) {
-  switch (mode) {
-    case EncryptionMode::kUnencrypted:
-      return "Unencrypted";
-    case EncryptionMode::kCenc:
-      return "CENC";
-    case EncryptionMode::kCbcs:
-      return "CBCS";
-    default:
-      return "Unknown";
-  }
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<DecryptConfig> DecryptConfig::CreateCencConfig(
-    const std::string& key_id,
-    const std::string& iv,
-    const std::vector<SubsampleEntry>& subsamples) {
-  return std::make_unique<DecryptConfig>(EncryptionMode::kCenc, key_id, iv,
-                                         subsamples, base::nullopt);
-}
-
-// static
-std::unique_ptr<DecryptConfig> DecryptConfig::CreateCbcsConfig(
-    const std::string& key_id,
-    const std::string& iv,
-    const std::vector<SubsampleEntry>& subsamples,
-    base::Optional<EncryptionPattern> encryption_pattern) {
-  return std::make_unique<DecryptConfig>(EncryptionMode::kCbcs, key_id, iv,
-                                         subsamples,
-                                         std::move(encryption_pattern));
-}
-
-DecryptConfig::DecryptConfig(
-    const EncryptionMode& encryption_mode,
-    const std::string& key_id,
-    const std::string& iv,
-    const std::vector<SubsampleEntry>& subsamples,
-    base::Optional<EncryptionPattern> encryption_pattern)
-    : encryption_mode_(encryption_mode),
-      key_id_(key_id),
-      iv_(iv),
-      subsamples_(subsamples),
-      encryption_pattern_(std::move(encryption_pattern)) {
-  // Unencrypted blocks should not have a DecryptConfig.
-  DCHECK_NE(encryption_mode_, EncryptionMode::kUnencrypted);
-  CHECK_GT(key_id_.size(), 0u);
-  CHECK_EQ(iv_.size(), static_cast<size_t>(DecryptConfig::kDecryptionKeySize));
-
-  // Pattern not allowed for non-'cbcs' modes.
-  DCHECK(encryption_mode_ == EncryptionMode::kCbcs || !encryption_pattern_);
-}
-
-DecryptConfig::~DecryptConfig() {}
-
-bool DecryptConfig::HasPattern() const {
-  return encryption_pattern_.has_value();
-}
-
-bool DecryptConfig::Matches(const DecryptConfig& config) const {
-  if (key_id() != config.key_id() || iv() != config.iv() ||
-      subsamples().size() != config.subsamples().size() ||
-      encryption_mode_ != config.encryption_mode_ ||
-      encryption_pattern_ != config.encryption_pattern_) {
-    return false;
-  }
-
-  for (size_t i = 0; i < subsamples().size(); ++i) {
-    if ((subsamples()[i].clear_bytes != config.subsamples()[i].clear_bytes) ||
-        (subsamples()[i].cypher_bytes != config.subsamples()[i].cypher_bytes)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-std::ostream& DecryptConfig::Print(std::ostream& os) const {
-  os << "key_id:'" << base::HexEncode(key_id_.data(), key_id_.size()) << "'"
-     << " iv:'" << base::HexEncode(iv_.data(), iv_.size()) << "'"
-     << " mode:" << EncryptionModeAsString(encryption_mode_);
-
-  if (encryption_pattern_) {
-    os << " pattern:" << encryption_pattern_->crypt_byte_block() << ":"
-       << encryption_pattern_->skip_byte_block();
-  }
-
-  os << " subsamples:[";
-  for (size_t i = 0; i < subsamples_.size(); ++i) {
-    os << "(clear:" << subsamples_[i].clear_bytes
-       << ", cypher:" << subsamples_[i].cypher_bytes << ")";
-  }
-  os << "]";
-  return os;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/decrypt_config.h b/cobalt/media/base/decrypt_config.h
deleted file mode 100644
index b8e3b44..0000000
--- a/cobalt/media/base/decrypt_config.h
+++ /dev/null
@@ -1,109 +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 COBALT_MEDIA_BASE_DECRYPT_CONFIG_H_
-#define COBALT_MEDIA_BASE_DECRYPT_CONFIG_H_
-
-#include <iosfwd>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/optional.h"
-#include "cobalt/media/base/encryption_pattern.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/subsample_entry.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// The encryption mode. The definitions are from ISO/IEC 23001-7:2016.
-// TODO(crbug.com/825041): Merge this with existing media::EncryptionScheme.
-enum class EncryptionMode {
-  kUnencrypted = 0,
-  kCenc,  // 'cenc' subsample encryption using AES-CTR mode.
-  kCbcs,  // 'cbcs' pattern encryption using AES-CBC mode.
-  kMaxValue = kCbcs
-};
-
-// Contains all information that a decryptor needs to decrypt a media sample.
-class MEDIA_EXPORT DecryptConfig {
- public:
-  // Keys are always 128 bits.
-  static const int kDecryptionKeySize = 16;
-
-  // |key_id| is the ID that references the decryption key for this sample.
-  // |iv| is the initialization vector defined by the encrypted format.
-  //   Currently |iv| must be 16 bytes as defined by WebM and ISO. It must
-  //   be provided.
-  // |subsamples| defines the clear and encrypted portions of the sample as
-  //   described above. A decrypted buffer will be equal in size to the sum
-  //   of the subsample sizes.
-  // |encryption_pattern| is the pattern used ('cbcs' only). It is optional
-  //   as Common encryption of MPEG-2 transport streams v1 (23009-1:2014)
-  //   does not specify patterns for cbcs encryption mode. The pattern is
-  //   assumed to be 1:9 for video and 1:0 for audio.
-  static std::unique_ptr<DecryptConfig> CreateCencConfig(
-      const std::string& key_id, const std::string& iv,
-      const std::vector<SubsampleEntry>& subsamples);
-  static std::unique_ptr<DecryptConfig> CreateCbcsConfig(
-      const std::string& key_id, const std::string& iv,
-      const std::vector<SubsampleEntry>& subsamples,
-      base::Optional<EncryptionPattern> encryption_pattern);
-
-  DecryptConfig(const EncryptionMode& encryption_mode,
-                const std::string& key_id, const std::string& iv,
-                const std::vector<SubsampleEntry>& subsamples,
-                base::Optional<EncryptionPattern> encryption_pattern);
-  ~DecryptConfig();
-
-  const std::string& key_id() const { return key_id_; }
-  const std::string& iv() const { return iv_; }
-  const std::vector<SubsampleEntry>& subsamples() const { return subsamples_; }
-  const EncryptionMode& encryption_mode() const { return encryption_mode_; }
-  const base::Optional<EncryptionPattern>& encryption_pattern() const {
-    return encryption_pattern_;
-  }
-
-  // Returns whether this config has EncryptionPattern set or not.
-  bool HasPattern() const;
-
-  // Returns true if the corresponding decoder buffer requires decryption and
-  // false if that buffer is clear despite the presence of DecryptConfig.
-  bool is_encrypted() const { return !key_id_.empty() && !iv_.empty(); }
-
-  // Returns true if all fields in |config| match this config.
-  bool Matches(const DecryptConfig& config) const;
-
-  // Prints to std::ostream.
-  std::ostream& Print(std::ostream& os) const;
-
- private:
-  const EncryptionMode encryption_mode_;
-  const std::string key_id_;
-
-  // Initialization vector.
-  const std::string iv_;
-
-  // Subsample information. May be empty for some formats, meaning entire frame
-  // (less data ignored by data_offset_) is encrypted.
-  const std::vector<SubsampleEntry> subsamples_;
-
-  // Only specified if |encryption_mode_| requires a pattern.
-  base::Optional<EncryptionPattern> encryption_pattern_;
-
-  DISALLOW_COPY_AND_ASSIGN(DecryptConfig);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-inline std::ostream& operator<<(std::ostream& os,
-                                const cobalt::media::DecryptConfig& obj) {
-  return obj.Print(os);
-}
-
-#endif  // COBALT_MEDIA_BASE_DECRYPT_CONFIG_H_
diff --git a/cobalt/media/base/demuxer.cc b/cobalt/media/base/demuxer.cc
deleted file mode 100644
index b6738a9..0000000
--- a/cobalt/media/base/demuxer.cc
+++ /dev/null
@@ -1,17 +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 "cobalt/media/base/demuxer.h"
-
-namespace cobalt {
-namespace media {
-
-DemuxerHost::~DemuxerHost() {}
-
-Demuxer::Demuxer() {}
-
-Demuxer::~Demuxer() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/demuxer.h b/cobalt/media/base/demuxer.h
deleted file mode 100644
index 65a5573..0000000
--- a/cobalt/media/base/demuxer.h
+++ /dev/null
@@ -1,159 +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 COBALT_MEDIA_BASE_DEMUXER_H_
-#define COBALT_MEDIA_BASE_DEMUXER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/data_source.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/demuxer_stream_provider.h"
-#include "cobalt/media/base/eme_constants.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_track.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "cobalt/media/base/ranges.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class TextTrackConfig;
-class MediaTracks;
-
-class MEDIA_EXPORT DemuxerHost {
- public:
-  // Notify the host that buffered time ranges have changed. Note that buffered
-  // time ranges can grow (when new media data is appended), but they can also
-  // shrink (when buffering reaches limit capacity and some buffered data
-  // becomes evicted, e.g. due to MSE GC algorithm, or by explicit removal of
-  // ranges directed by MSE web app).
-  virtual void OnBufferedTimeRangesChanged(
-      const Ranges<base::TimeDelta>& ranges) = 0;
-
-  // Sets the duration of the media in microseconds.
-  // Duration may be kInfiniteDuration if the duration is not known.
-  virtual void SetDuration(base::TimeDelta duration) = 0;
-
-  // Stops execution of the pipeline due to a fatal error. Do not call this
-  // method with PIPELINE_OK. Stopping is not immediate so demuxers must be
-  // prepared to soft fail on subsequent calls. E.g., if Demuxer::Seek() is
-  // called after an unrecoverable error the provided PipelineStatusCB must be
-  // called with an error.
-  virtual void OnDemuxerError(PipelineStatus error) = 0;
-
-  // Add |text_stream| to the collection managed by the text renderer.
-  virtual void AddTextStream(DemuxerStream* text_stream,
-                             const TextTrackConfig& config) = 0;
-
-  // Remove |text_stream| from the presentation.
-  virtual void RemoveTextStream(DemuxerStream* text_stream) = 0;
-
- protected:
-  virtual ~DemuxerHost();
-};
-
-class MEDIA_EXPORT Demuxer : public DemuxerStreamProvider {
- public:
-  // A new potentially encrypted stream has been parsed.
-  // First parameter - The type of initialization data.
-  // Second parameter - The initialization data associated with the stream.
-  typedef base::Callback<void(EmeInitDataType type,
-                              const std::vector<uint8_t>& init_data)>
-      EncryptedMediaInitDataCB;
-
-  // Notifies demuxer clients that media track configuration has been updated
-  // (e.g. the initial stream metadata has been parsed successfully, or a new
-  // init segment has been parsed successfully in MSE case).
-  typedef base::Callback<void(std::unique_ptr<MediaTracks>)>
-      MediaTracksUpdatedCB;
-
-  Demuxer();
-  ~Demuxer() override;
-
-  // Returns the name of the demuxer for logging purpose.
-  virtual std::string GetDisplayName() const = 0;
-
-  // Completes initialization of the demuxer.
-  //
-  // The demuxer does not own |host| as it is guaranteed to outlive the
-  // lifetime of the demuxer. Don't delete it!  |status_cb| must only be run
-  // after this method has returned.
-  virtual void Initialize(DemuxerHost* host, const PipelineStatusCB& status_cb,
-                          bool enable_text_tracks) = 0;
-
-  // Aborts any pending read operations that the demuxer is involved with; any
-  // read aborted will be aborted with a status of kAborted.
-  virtual void AbortPendingReads() = 0;
-
-  // Indicates that a new Seek() call is on its way. Implementations may abort
-  // pending reads and future Read() calls may return kAborted until Seek() is
-  // executed. |seek_time| is the presentation timestamp of the new Seek() call.
-  //
-  // In actual use, this call occurs on the main thread while Seek() is called
-  // on the media thread. StartWaitingForSeek() can be used to synchronize the
-  // two.
-  //
-  // StartWaitingForSeek() MUST be called before Seek().
-  virtual void StartWaitingForSeek(base::TimeDelta seek_time) = 0;
-
-  // Indicates that the current Seek() operation is obsoleted by a new one.
-  // Implementations can expect that StartWaitingForSeek() will be called
-  // when the current seek operation completes.
-  //
-  // Like StartWaitingForSeek(), CancelPendingSeek() is called on the main
-  // thread. Ordering with respect to the to-be-canceled Seek() is not
-  // guaranteed. Regardless of ordering, implementations may abort pending reads
-  // and may return kAborted from future Read() calls, until after
-  // StartWaitingForSeek() and the following Seek() call occurs.
-  //
-  // |seek_time| should match that passed to the next StartWaitingForSeek(), but
-  // may not if the seek target changes again before the current seek operation
-  // completes or is aborted.
-  virtual void CancelPendingSeek(base::TimeDelta seek_time) = 0;
-
-  // Carry out any actions required to seek to the given time, executing the
-  // callback upon completion.
-  virtual void Seek(base::TimeDelta time,
-                    const PipelineStatusCB& status_cb) = 0;
-
-  // Stops this demuxer.
-  //
-  // After this call the demuxer may be destroyed. It is illegal to call any
-  // method (including Stop()) after a demuxer has stopped.
-  virtual void Stop() = 0;
-
-  // Returns the starting time for the media file; it's always positive.
-  virtual base::TimeDelta GetStartTime() const = 0;
-
-  // Returns Time represented by presentation timestamp 0.
-  // If the timstamps are not associated with a Time, then
-  // a null Time is returned.
-  virtual base::Time GetTimelineOffset() const = 0;
-
-  // Returns the memory usage in bytes for the demuxer.
-  virtual int64_t GetMemoryUsage() const = 0;
-
-  virtual void OnEnabledAudioTracksChanged(
-      const std::vector<MediaTrack::Id>& track_ids,
-      base::TimeDelta currTime) = 0;
-
-  // |track_ids| is either empty or contains a single video track id.
-  virtual void OnSelectedVideoTrackChanged(
-      const std::vector<MediaTrack::Id>& track_ids,
-      base::TimeDelta currTime) = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Demuxer);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_DEMUXER_H_
diff --git a/cobalt/media/base/demuxer_perftest.cc b/cobalt/media/base/demuxer_perftest.cc
deleted file mode 100644
index 73f94df..0000000
--- a/cobalt/media/base/demuxer_perftest.cc
+++ /dev/null
@@ -1,238 +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 <memory>
-
-#include "base/at_exit.h"
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/media.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/filters/ffmpeg_demuxer.h"
-#include "cobalt/media/filters/file_data_source.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
-
-namespace cobalt {
-namespace media {
-
-static const int kBenchmarkIterations = 100;
-
-class DemuxerHostImpl : public media::DemuxerHost {
- public:
-  DemuxerHostImpl() {}
-  ~DemuxerHostImpl() override {}
-
-  // DemuxerHost implementation.
-  void OnBufferedTimeRangesChanged(
-      const Ranges<base::TimeDelta>& ranges) override {}
-  void SetDuration(base::TimeDelta duration) override {}
-  void OnDemuxerError(media::PipelineStatus error) override {}
-  void AddTextStream(media::DemuxerStream* text_stream,
-                     const media::TextTrackConfig& config) override {}
-  void RemoveTextStream(media::DemuxerStream* text_stream) override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DemuxerHostImpl);
-};
-
-static void QuitLoopWithStatus(base::MessageLoop* message_loop,
-                               media::PipelineStatus status) {
-  CHECK_EQ(status, media::PIPELINE_OK);
-  message_loop->task_runner()->PostTask(
-      FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
-}
-
-static void OnEncryptedMediaInitData(EmeInitDataType init_data_type,
-                                     const std::vector<uint8_t>& init_data) {
-  VLOG(0) << "File is encrypted.";
-}
-
-static void OnMediaTracksUpdated(std::unique_ptr<MediaTracks> tracks) {
-  VLOG(0) << "Got media tracks info, tracks = " << tracks->tracks().size();
-}
-
-typedef std::vector<media::DemuxerStream*> Streams;
-
-// Simulates playback reading requirements by reading from each stream
-// present in |demuxer| in as-close-to-monotonically-increasing timestamp order.
-class StreamReader {
- public:
-  StreamReader(media::Demuxer* demuxer, bool enable_bitstream_converter);
-  ~StreamReader();
-
-  // Performs a single step read.
-  void Read();
-
-  // Returns true when all streams have reached end of stream.
-  bool IsDone();
-
-  int number_of_streams() { return static_cast<int>(streams_.size()); }
-  const Streams& streams() { return streams_; }
-  const std::vector<int>& counts() { return counts_; }
-
- private:
-  void OnReadDone(base::MessageLoop* message_loop, bool* end_of_stream,
-                  base::TimeDelta* timestamp,
-                  media::DemuxerStream::Status status,
-                  const scoped_refptr<media::DecoderBuffer>& buffer);
-  int GetNextStreamIndexToRead();
-
-  Streams streams_;
-  std::vector<bool> end_of_stream_;
-  std::vector<base::TimeDelta> last_read_timestamp_;
-  std::vector<int> counts_;
-
-  DISALLOW_COPY_AND_ASSIGN(StreamReader);
-};
-
-StreamReader::StreamReader(media::Demuxer* demuxer,
-                           bool enable_bitstream_converter) {
-  media::DemuxerStream* stream =
-      demuxer->GetStream(media::DemuxerStream::AUDIO);
-  if (stream) {
-    streams_.push_back(stream);
-    end_of_stream_.push_back(false);
-    last_read_timestamp_.push_back(media::kNoTimestamp);
-    counts_.push_back(0);
-  }
-
-  stream = demuxer->GetStream(media::DemuxerStream::VIDEO);
-  if (stream) {
-    streams_.push_back(stream);
-    end_of_stream_.push_back(false);
-    last_read_timestamp_.push_back(media::kNoTimestamp);
-    counts_.push_back(0);
-
-    if (enable_bitstream_converter) stream->EnableBitstreamConverter();
-  }
-}
-
-StreamReader::~StreamReader() {}
-
-void StreamReader::Read() {
-  int index = GetNextStreamIndexToRead();
-  bool end_of_stream = false;
-  base::TimeDelta timestamp;
-
-  streams_[index]->Read(
-      base::Bind(&StreamReader::OnReadDone, base::Unretained(this),
-                 base::MessageLoop::current(), &end_of_stream, &timestamp));
-  base::RunLoop().Run();
-
-  CHECK(end_of_stream || timestamp != media::kNoTimestamp);
-  end_of_stream_[index] = end_of_stream;
-  last_read_timestamp_[index] = timestamp;
-  counts_[index]++;
-}
-
-bool StreamReader::IsDone() {
-  for (size_t i = 0; i < end_of_stream_.size(); ++i) {
-    if (!end_of_stream_[i]) return false;
-  }
-  return true;
-}
-
-void StreamReader::OnReadDone(
-    base::MessageLoop* message_loop, bool* end_of_stream,
-    base::TimeDelta* timestamp, media::DemuxerStream::Status status,
-    const scoped_refptr<media::DecoderBuffer>& buffer) {
-  CHECK_EQ(status, media::DemuxerStream::kOk);
-  CHECK(buffer.get());
-  *end_of_stream = buffer->end_of_stream();
-  *timestamp = *end_of_stream ? media::kNoTimestamp : buffer->timestamp();
-  message_loop->task_runner()->PostTask(
-      FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
-}
-
-int StreamReader::GetNextStreamIndexToRead() {
-  int index = -1;
-  for (int i = 0; i < number_of_streams(); ++i) {
-    // Ignore streams at EOS.
-    if (end_of_stream_[i]) continue;
-
-    // Use a stream if it hasn't been read from yet.
-    if (last_read_timestamp_[i] == media::kNoTimestamp) return i;
-
-    if (index < 0 || last_read_timestamp_[i] < last_read_timestamp_[index]) {
-      index = i;
-    }
-  }
-  CHECK_GE(index, 0) << "Couldn't find a stream to read";
-  return index;
-}
-
-static void RunDemuxerBenchmark(const std::string& filename) {
-  base::FilePath file_path(GetTestDataFilePath(filename));
-  double total_time = 0.0;
-  for (int i = 0; i < kBenchmarkIterations; ++i) {
-    // Setup.
-    base::MessageLoop message_loop;
-    DemuxerHostImpl demuxer_host;
-    FileDataSource data_source;
-    ASSERT_TRUE(data_source.Initialize(file_path));
-
-    Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb =
-        base::Bind(&OnEncryptedMediaInitData);
-    Demuxer::MediaTracksUpdatedCB tracks_updated_cb =
-        base::Bind(&OnMediaTracksUpdated);
-    FFmpegDemuxer demuxer(message_loop.task_runner(), &data_source,
-                          encrypted_media_init_data_cb, tracks_updated_cb,
-                          new MediaLog());
-
-    demuxer.Initialize(&demuxer_host,
-                       base::Bind(&QuitLoopWithStatus, &message_loop), false);
-    base::RunLoop().Run();
-    StreamReader stream_reader(&demuxer, false);
-
-    // Benchmark.
-    base::TimeTicks start = base::TimeTicks::Now();
-    while (!stream_reader.IsDone()) {
-      stream_reader.Read();
-    }
-    base::TimeTicks end = base::TimeTicks::Now();
-    total_time += (end - start).InSecondsF();
-    demuxer.Stop();
-    QuitLoopWithStatus(&message_loop, PIPELINE_OK);
-    base::RunLoop().Run();
-  }
-
-  perf_test::PrintResult("demuxer_bench", "", filename,
-                         kBenchmarkIterations / total_time, "runs/s", true);
-}
-
-#if defined(OS_WIN)
-// http://crbug.com/399002
-#define MAYBE_Demuxer DISABLED_Demuxer
-#else
-#define MAYBE_Demuxer Demuxer
-#endif
-TEST(DemuxerPerfTest, MAYBE_Demuxer) {
-  RunDemuxerBenchmark("bear.ogv");
-  RunDemuxerBenchmark("bear-640x360.webm");
-  RunDemuxerBenchmark("sfx_s16le.wav");
-#if defined(USE_PROPRIETARY_CODECS)
-  RunDemuxerBenchmark("bear-1280x720.mp4");
-  RunDemuxerBenchmark("sfx.mp3");
-#endif
-#if defined(OS_CHROMEOS)
-  RunDemuxerBenchmark("bear.flac");
-#endif
-#if defined(USE_PROPRIETARY_CODECS) && defined(OS_CHROMEOS)
-  RunDemuxerBenchmark("bear.avi");
-#endif
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/demuxer_stream.cc b/cobalt/media/base/demuxer_stream.cc
deleted file mode 100644
index a85ebde..0000000
--- a/cobalt/media/base/demuxer_stream.cc
+++ /dev/null
@@ -1,23 +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 "cobalt/media/base/demuxer_stream.h"
-
-namespace cobalt {
-namespace media {
-
-DemuxerStream::~DemuxerStream() {}
-
-// Most DemuxerStream implementations don't specify liveness. Returns unknown
-// liveness by default.
-DemuxerStream::Liveness DemuxerStream::liveness() const {
-  return DemuxerStream::LIVENESS_UNKNOWN;
-}
-
-// Most DemuxerStream implementations don't need to convert bit stream.
-// Do nothing by default.
-void DemuxerStream::EnableBitstreamConverter() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/demuxer_stream.h b/cobalt/media/base/demuxer_stream.h
deleted file mode 100644
index 1650c7c..0000000
--- a/cobalt/media/base/demuxer_stream.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_DEMUXER_STREAM_H_
-#define COBALT_MEDIA_BASE_DEMUXER_STREAM_H_
-
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/video_rotation.h"
-
-namespace cobalt {
-namespace media {
-
-class AudioDecoderConfig;
-class DecoderBuffer;
-class VideoDecoderConfig;
-
-class MEDIA_EXPORT DemuxerStream {
- public:
-  enum Type {
-    UNKNOWN,
-    AUDIO,
-    VIDEO,
-    TEXT,
-    NUM_TYPES,  // Always keep this entry as the last one!
-  };
-
-  enum Liveness {
-    LIVENESS_UNKNOWN,
-    LIVENESS_RECORDED,
-    LIVENESS_LIVE,
-  };
-
-  // Status returned in the Read() callback.
-  //  kOk : Indicates the second parameter is Non-NULL and contains media data
-  //        or the end of the stream.
-  //  kAborted : Indicates an aborted Read(). This can happen if the
-  //             DemuxerStream gets flushed and doesn't have any more data to
-  //             return. The second parameter MUST be NULL when this status is
-  //             returned.
-  //  kConfigChange : Indicates that the AudioDecoderConfig or
-  //                  VideoDecoderConfig for the stream has changed.
-  //                  The DemuxerStream expects an audio_decoder_config() or
-  //                  video_decoder_config() call before Read() will start
-  //                  returning DecoderBuffers again. The decoder will need this
-  //                  new configuration to properly decode the buffers read
-  //                  from this point forward. The second parameter MUST be NULL
-  //                  when this status is returned.
-  //                  This will only be returned if SupportsConfigChanges()
-  //                  returns 'true' for this DemuxerStream.
-  enum Status {
-    kOk,
-    kAborted,
-    kConfigChanged,
-  };
-
-  // Request a buffer to returned via the provided callback.
-  //
-  // The first parameter indicates the status of the read.
-  // The second parameter is non-NULL and contains media data
-  // or the end of the stream if the first parameter is kOk. NULL otherwise.
-  typedef base::Callback<void(Status, const scoped_refptr<DecoderBuffer>&)>
-      ReadCB;
-  virtual void Read(const ReadCB& read_cb) = 0;
-
-  // Returns the audio/video decoder configuration. It is an error to call the
-  // audio method on a video stream and vice versa. After |kConfigChanged| is
-  // returned in a Read(), the caller should call this method again to retrieve
-  // the new config.
-  virtual AudioDecoderConfig audio_decoder_config() = 0;
-  virtual VideoDecoderConfig video_decoder_config() = 0;
-
-  // Returns the type of stream.
-  virtual Type type() const = 0;
-
-  // Returns liveness of the streams provided, i.e. whether recorded or live.
-  virtual Liveness liveness() const;
-
-  virtual void EnableBitstreamConverter();
-
-  // Whether or not this DemuxerStream allows midstream configuration changes.
-  //
-  // A DemuxerStream that returns 'true' to this may return the 'kConfigChange'
-  // status from a Read() call. In this case the client is expected to be
-  // capable of taking appropriate action to handle config changes. Otherwise
-  // audio_decoder_config() and video_decoder_config()'s return values are
-  // guaranteed to remain constant, and the client may make optimizations based
-  // on this.
-  virtual bool SupportsConfigChanges() = 0;
-
-  virtual VideoRotation video_rotation() = 0;
-
-  // Indicates whether a DemuxerStream is currently enabled (i.e. should be
-  // decoded and rendered) or not.
-  virtual bool enabled() const = 0;
-
-  // Disables and re-enables the stream. Reading from a disabled stream will
-  // return an end-of-stream (EOS) buffer. When a stream is re-enabled, it needs
-  // to know the current playback position |timestamp| in order to resume
-  // reading data from a key frame preceeding the |timestamp|.
-  virtual void set_enabled(bool enabled, base::TimeDelta timestamp) = 0;
-
-  // The StreamStatusChangeCB allows DemuxerStream clients to receive
-  // notifications about the stream being disabled or enabled.
-  // The first parameter indicates whether the stream is enabled or disabled.
-  // The second parameter is the playback position when the change occured.
-  typedef base::Callback<void(bool, base::TimeDelta)> StreamStatusChangeCB;
-  virtual void SetStreamStatusChangeCB(const StreamStatusChangeCB& cb) = 0;
-
- protected:
-  // Only allow concrete implementations to get deleted.
-  virtual ~DemuxerStream();
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_DEMUXER_STREAM_H_
diff --git a/cobalt/media/base/demuxer_stream_provider.cc b/cobalt/media/base/demuxer_stream_provider.cc
deleted file mode 100644
index c4bf394..0000000
--- a/cobalt/media/base/demuxer_stream_provider.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 "cobalt/media/base/demuxer_stream_provider.h"
-
-namespace cobalt {
-namespace media {
-
-DemuxerStreamProvider::DemuxerStreamProvider() {}
-
-DemuxerStreamProvider::~DemuxerStreamProvider() {}
-
-GURL DemuxerStreamProvider::GetUrl() const {
-  NOTREACHED();
-  return GURL();
-}
-
-DemuxerStreamProvider::Type DemuxerStreamProvider::GetType() const {
-  return STREAM;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/demuxer_stream_provider.h b/cobalt/media/base/demuxer_stream_provider.h
deleted file mode 100644
index 26b922a..0000000
--- a/cobalt/media/base/demuxer_stream_provider.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 COBALT_MEDIA_BASE_DEMUXER_STREAM_PROVIDER_H_
-#define COBALT_MEDIA_BASE_DEMUXER_STREAM_PROVIDER_H_
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_export.h"
-#include "url/gurl.h"
-
-namespace cobalt {
-namespace media {
-
-// Abstract class that defines how to retrieve "media sources" in DemuxerStream
-// form (for most cases) or URL form (for the MediaPlayerRenderer case).
-//
-// The sub-classes do not strictly provide demuxer streams, but because all
-// sub-classes are for the moment Demuxers, this class has not been renamed to
-// "MediaProvider". This class would be a good candidate for renaming, if
-// ever Pipeline were to support this class directly, instead of the Demuxer
-// interface.
-//
-// The derived classes must return a non-null value for the getter method
-// associated with their type, and return a null/empty value for other getters.
-class MEDIA_EXPORT DemuxerStreamProvider {
- public:
-  enum Type {
-    STREAM,  // Indicates GetStream() should be used
-    URL,     // Indicates GetUrl() should be used
-  };
-
-  DemuxerStreamProvider();
-  virtual ~DemuxerStreamProvider();
-
-  // For Type::STREAM:
-  //   Returns the first stream of the given stream type (which is not allowed
-  //   to be DemuxerStream::TEXT), or NULL if that type of stream is not
-  //   present.
-  // Other types:
-  //   Should not be called.
-  virtual DemuxerStream* GetStream(DemuxerStream::Type type) = 0;
-
-  // For Type::URL:
-  //   Returns the URL of the media to play. This might be an empty URL, and
-  //   should be handled appropriately by the caller.
-  // Other types:
-  //   Should not be called.
-  virtual GURL GetUrl() const;
-
-  virtual DemuxerStreamProvider::Type GetType() const;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DemuxerStreamProvider);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_DEMUXER_STREAM_PROVIDER_H_
diff --git a/cobalt/media/base/djb2.cc b/cobalt/media/base/djb2.cc
deleted file mode 100644
index 696f08c..0000000
--- a/cobalt/media/base/djb2.cc
+++ /dev/null
@@ -1,14 +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 "cobalt/media/base/djb2.h"
-
-uint32_t DJB2Hash(const void* buf, size_t len, uint32_t seed) {
-  const uint8_t* src = reinterpret_cast<const uint8_t*>(buf);
-  uint32_t hash = seed;
-  for (size_t i = 0; i < len; ++i) {
-    hash = hash * 33 + src[i];
-  }
-  return hash;
-}
diff --git a/cobalt/media/base/djb2.h b/cobalt/media/base/djb2.h
deleted file mode 100644
index c44d332..0000000
--- a/cobalt/media/base/djb2.h
+++ /dev/null
@@ -1,40 +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 COBALT_MEDIA_BASE_DJB2_H_
-#define COBALT_MEDIA_BASE_DJB2_H_
-
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-// DJB2 is a hash algorithm with excellent distribution and speed
-// on many different sets.
-// It has marginally more collisions than FNV1, but makes up for it in
-// performance.
-// The return value is suitable for table lookups.
-// For small fixed sizes (ie a pixel), it has low overhead and inlines well.
-// For large data sets, it optimizes into assembly/simd and is appropriate
-// for realtime applications.
-// See Also:
-//   http://www.cse.yorku.ca/~oz/hash.html
-
-static const uint32_t kDJB2HashSeed = 5381u;
-
-// These functions perform DJB2 hash. The simplest call is DJB2Hash() to
-// generate the DJB2 hash of the given data:
-//   uint32_t hash = DJB2Hash(data1, length1, kDJB2HashSeed);
-//
-// You can also compute the DJB2 hash of data incrementally by making multiple
-// calls to DJB2Hash():
-//   uint32_t hash_value = kDJB2HashSeed;  // Initial seed for DJB2.
-//   for (size_t i = 0; i < copy_lines; ++i) {
-//     hash_value = DJB2Hash(source, bytes_per_line, hash_value);
-//     source += source_stride;
-//   }
-
-// For the given buffer of data, compute the DJB2 hash of
-// the data. You can call this any number of times during the computation.
-MEDIA_EXPORT uint32_t DJB2Hash(const void* buf, size_t len, uint32_t seed);
-
-#endif  // COBALT_MEDIA_BASE_DJB2_H_
diff --git a/cobalt/media/base/djb2_unittest.cc b/cobalt/media/base/djb2_unittest.cc
deleted file mode 100644
index 1975a45..0000000
--- a/cobalt/media/base/djb2_unittest.cc
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/base/djb2.h"
-
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-uint8_t kTestData[] = {1, 2, 3};
-
-TEST(DJB2HashTest, HashTest) {
-  EXPECT_EQ(DJB2Hash(NULL, 0, 0u), 0u);
-  EXPECT_EQ(DJB2Hash(kTestData, sizeof(kTestData), 5381u),
-            ((5381u * 33u + 1u) * 33u + 2u) * 33u + 3u);
-}
diff --git a/cobalt/media/base/drm_system.cc b/cobalt/media/base/drm_system.cc
index 11bbbd1..d44e583 100644
--- a/cobalt/media/base/drm_system.cc
+++ b/cobalt/media/base/drm_system.cc
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <memory>
-
 #include "cobalt/media/base/drm_system.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/bind.h"
 #include "base/compiler_specific.h"
 #include "base/logging.h"
@@ -143,13 +144,6 @@
 bool DrmSystem::GetMetrics(std::vector<uint8_t>* metrics) {
   DCHECK(message_loop_->BelongsToCurrentThread());
   DCHECK(metrics);
-
-#if SB_API_VERSION < 12
-
-  return false;
-
-#else  // SB_API_VERSION < 12
-
   int size = 0;
   const uint8_t* raw_metrics =
       static_cast<const uint8_t*>(SbDrmGetMetrics(wrapped_drm_system_, &size));
@@ -162,8 +156,6 @@
   }
   metrics->assign(raw_metrics, raw_metrics + size);
   return true;
-
-#endif  // SB_API_VERSION < 12
 }
 
 void DrmSystem::GenerateSessionUpdateRequest(
diff --git a/cobalt/media/base/eme_constants.h b/cobalt/media/base/eme_constants.h
deleted file mode 100644
index 8e3af74..0000000
--- a/cobalt/media/base/eme_constants.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_BASE_EME_CONSTANTS_H_
-#define COBALT_MEDIA_BASE_EME_CONSTANTS_H_
-
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Defines values that specify registered Initialization Data Types used
-// in Encrypted Media Extensions (EME).
-// http://w3c.github.io/encrypted-media/initdata-format-registry.html#registry
-enum EmeInitDataType {
-  kEmeInitDataTypeUnknown,
-  kEmeInitDataTypeCenc,
-  kEmeInitDataTypeFairplay,
-  kEmeInitDataTypeKeyIds,
-  kEmeInitDataTypeWebM,
-};
-
-// Defines bitmask values that specify codecs used in Encrypted Media Extension
-// (EME). Each value represents a codec within a specific container.
-// The mask values are stored in a SupportedCodecs.
-enum EmeCodec {
-  // *_ALL values should only be used for masking, do not use them to specify
-  // codec support because they may be extended to include more codecs.
-  EME_CODEC_NONE = 0,
-  EME_CODEC_WEBM_OPUS = 1 << 0,
-  EME_CODEC_WEBM_VORBIS = 1 << 1,
-  EME_CODEC_WEBM_AUDIO_ALL = EME_CODEC_WEBM_OPUS | EME_CODEC_WEBM_VORBIS,
-  EME_CODEC_WEBM_VP8 = 1 << 2,
-  EME_CODEC_WEBM_VP9 = 1 << 3,
-  EME_CODEC_WEBM_VIDEO_ALL = (EME_CODEC_WEBM_VP8 | EME_CODEC_WEBM_VP9),
-  EME_CODEC_WEBM_ALL = (EME_CODEC_WEBM_AUDIO_ALL | EME_CODEC_WEBM_VIDEO_ALL),
-  EME_CODEC_MP4_AAC = 1 << 4,
-  EME_CODEC_MP4_AUDIO_ALL = EME_CODEC_MP4_AAC,
-  EME_CODEC_MP4_AVC1 = 1 << 5,
-  EME_CODEC_MP4_VP9 = 1 << 6,
-  EME_CODEC_MP4_HEVC = 1 << 7,
-  EME_CODEC_MP4_VIDEO_ALL =
-      (EME_CODEC_MP4_AVC1 | EME_CODEC_MP4_VP9 | EME_CODEC_MP4_HEVC),
-  EME_CODEC_MP4_ALL = (EME_CODEC_MP4_AUDIO_ALL | EME_CODEC_MP4_VIDEO_ALL),
-  EME_CODEC_AUDIO_ALL = (EME_CODEC_WEBM_AUDIO_ALL | EME_CODEC_MP4_AUDIO_ALL),
-  EME_CODEC_VIDEO_ALL = (EME_CODEC_WEBM_VIDEO_ALL | EME_CODEC_MP4_VIDEO_ALL),
-  EME_CODEC_ALL = (EME_CODEC_WEBM_ALL | EME_CODEC_MP4_ALL),
-};
-
-typedef uint32_t SupportedCodecs;
-
-enum EmeSessionTypeSupport {
-  // Invalid default value.
-  kEmeSessionTypeSupportInvalid,
-  // The session type is not supported.
-  kEmeSessionTypeSupportNotSupported,
-  // The session type is supported if a distinctive identifier is available.
-  kEmeSessionTypeSupportSupportedWithIdentifier,
-  // The session type is always supported.
-  kEmeSessionTypeSupportSupported,
-};
-
-// Used to declare support for distinctive identifier and persistent state.
-// These are purposefully limited to not allow one to require the other, so that
-// transitive requirements are not possible. Non-trivial refactoring would be
-// required to support transitive requirements.
-enum EmeFeatureSupport {
-  // Invalid default value.
-  kEmeFeatureSupportInvalid,
-  // Access to the feature is not supported at all.
-  kEmeFeatureSupportNotSupported,
-  // Access to the feature may be requested.
-  kEmeFeatureSupportRequestable,
-  // Access to the feature cannot be blocked.
-  kEmeFeatureSupportAlwaysEnable,
-};
-
-enum EmeMediaType {
-  kEmeMediaTypeAudio,
-  kEmeMediaTypeVideo,
-};
-
-// Configuration rules indicate the configuration state required to support a
-// configuration option (note: a configuration option may be disallowing a
-// feature). Configuration rules are used to answer queries about distinctive
-// identifier, persistent state, and robustness requirements, as well as to
-// describe support for different session types.
-//
-// If in the future there are reasons to request user permission other than
-// access to a distinctive identifier, then additional rules should be added.
-// Rules are implemented in ConfigState and are otherwise opaque.
-enum EmeConfigRule {
-  // The configuration option is not supported.
-  kEmeConfigRuleNotSupported,
-  // The configuration option prevents use of a distinctive identifier.
-  kEmeConfigRuleIdentifierNotAllowed,
-  // The configuration option is supported if a distinctive identifier is
-  // available.
-  kEmeConfigRuleIdentifiedRequired,
-  // The configuration option is supported, but the user experience may be
-  // improved if a distinctive identifier is available.
-  kEmeConfigRuleIdentifierRecommended,
-  // The configuration option prevents use of persistent state.
-  kEmeConfigRulePersistNotAllowed,
-  // The configuration option is supported if persistent state is available.
-  kEmeConfigRulePersistRequired,
-  // The configuration option is supported if both a distinctive identifier and
-  // persistent state are available.
-  kEmeConfigRuleIdentifierAndPersistenceRequired,
-  // The configuration option prevents use of hardware-secure codecs.
-  // This rule only has meaning on platforms that distinguish hardware-secure
-  // codecs (ie. Android).
-  kEmeConfigRuleHwSecureCodecsNotAllowed,
-  // The configuration option is supported if hardware-secure codecs are used.
-  // This rule only has meaning on platforms that distinguish hardware-secure
-  // codecs (ie. Android).
-  kEmeConfigRuleHwSecureCodecsRequired,
-  // The configuration option is supported without conditions.
-  kEmeConfigRuleSupported,
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_EME_CONSTANTS_H_
diff --git a/cobalt/media/base/encryption_pattern.cc b/cobalt/media/base/encryption_pattern.cc
deleted file mode 100644
index 4349bc0..0000000
--- a/cobalt/media/base/encryption_pattern.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/base/encryption_pattern.h"
-
-namespace cobalt {
-namespace media {
-
-EncryptionPattern::EncryptionPattern() = default;
-
-EncryptionPattern::EncryptionPattern(uint32_t crypt_byte_block,
-                                     uint32_t skip_byte_block)
-    : crypt_byte_block_(crypt_byte_block), skip_byte_block_(skip_byte_block) {}
-
-EncryptionPattern::EncryptionPattern(const EncryptionPattern& rhs) = default;
-
-EncryptionPattern& EncryptionPattern::operator=(const EncryptionPattern& rhs) =
-    default;
-
-EncryptionPattern::~EncryptionPattern() = default;
-
-bool EncryptionPattern::Matches(const EncryptionPattern& other) const {
-  return crypt_byte_block_ == other.crypt_byte_block() &&
-         skip_byte_block_ == other.skip_byte_block();
-}
-
-bool EncryptionPattern::IsInEffect() const {
-  // ISO/IEC 23001-7(2016), section 10.3, discussing 'cens' pattern encryption
-  // scheme, states "Tracks other than video are protected using whole-block
-  // full-sample encryption as specified in 9.7 and hence skip_byte_block
-  // SHALL be 0." So pattern is in effect as long as |crypt_byte_block_| is set.
-  return crypt_byte_block_ != 0;
-}
-
-bool EncryptionPattern::operator==(const EncryptionPattern& other) const {
-  return crypt_byte_block_ == other.crypt_byte_block_ &&
-         skip_byte_block_ == other.skip_byte_block_;
-}
-
-bool EncryptionPattern::operator!=(const EncryptionPattern& other) const {
-  return !operator==(other);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/encryption_pattern.h b/cobalt/media/base/encryption_pattern.h
deleted file mode 100644
index ee830a3..0000000
--- a/cobalt/media/base/encryption_pattern.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_BASE_ENCRYPTION_PATTERN_H_
-#define COBALT_MEDIA_BASE_ENCRYPTION_PATTERN_H_
-
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// CENC 3rd Edition adds pattern encryption, through two new protection
-// schemes: 'cens' (with AES-CTR) and 'cbcs' (with AES-CBC).
-// The pattern applies independently to each 'encrypted' part of the frame (as
-// defined by the relevant subsample entries), and reduces further the
-// actual encryption applied through a repeating pattern of (encrypt:skip)
-// 16 byte blocks. For example, in a (1:9) pattern, the first block is
-// encrypted, and the next nine are skipped. This pattern is applied
-// repeatedly until the end of the last 16-byte block in the subsample.
-// Any remaining bytes are left clear.
-// If crypt_byte_block is 0, pattern encryption is disabled.
-// TODO(jrummell): Use base::Optional<EncryptionPattern> everywhere, and remove
-// IsInEffect().
-class MEDIA_EXPORT EncryptionPattern {
- public:
-  EncryptionPattern();
-  EncryptionPattern(uint32_t crypt_byte_block, uint32_t skip_byte_block);
-  EncryptionPattern(const EncryptionPattern& rhs);
-  EncryptionPattern& operator=(const EncryptionPattern& rhs);
-  ~EncryptionPattern();
-
-  bool Matches(const EncryptionPattern& other) const;
-
-  uint32_t crypt_byte_block() const { return crypt_byte_block_; }
-  uint32_t skip_byte_block() const { return skip_byte_block_; }
-
-  bool IsInEffect() const;
-
-  bool operator==(const EncryptionPattern& other) const;
-  bool operator!=(const EncryptionPattern& other) const;
-
- private:
-  uint32_t crypt_byte_block_ = 0;  // Count of the encrypted blocks.
-  uint32_t skip_byte_block_ = 0;   // Count of the unencrypted blocks.
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_ENCRYPTION_PATTERN_H_
diff --git a/cobalt/media/base/encryption_scheme.cc b/cobalt/media/base/encryption_scheme.cc
deleted file mode 100644
index e29bb6d..0000000
--- a/cobalt/media/base/encryption_scheme.cc
+++ /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.
-
-#include "cobalt/media/base/encryption_scheme.h"
-
-namespace cobalt {
-namespace media {
-
-EncryptionScheme::EncryptionScheme() : mode_(CIPHER_MODE_UNENCRYPTED) {}
-
-EncryptionScheme::EncryptionScheme(CipherMode mode,
-                                   const EncryptionPattern& pattern)
-    : mode_(mode), pattern_(pattern) {}
-
-EncryptionScheme::~EncryptionScheme() {}
-
-bool EncryptionScheme::Matches(const EncryptionScheme& other) const {
-  return mode_ == other.mode_ && pattern_ == other.pattern_;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/encryption_scheme.h b/cobalt/media/base/encryption_scheme.h
deleted file mode 100644
index 200d8d5..0000000
--- a/cobalt/media/base/encryption_scheme.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_ENCRYPTION_SCHEME_H_
-#define COBALT_MEDIA_BASE_ENCRYPTION_SCHEME_H_
-
-#include "cobalt/media/base/encryption_pattern.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Specification of whether and how the stream is encrypted (in whole or part).
-class MEDIA_EXPORT EncryptionScheme {
- public:
-  // Algorithm and mode used for encryption. CIPHER_MODE_UNENCRYPTED indicates
-  // no encryption.
-  enum CipherMode {
-    CIPHER_MODE_UNENCRYPTED,
-    CIPHER_MODE_AES_CTR,
-    CIPHER_MODE_AES_CBC,
-    CIPHER_MODE_MAX = CIPHER_MODE_AES_CBC
-  };
-
-  // The default constructor makes an instance that indicates no encryption.
-  EncryptionScheme();
-
-  // This constructor allows specification of the cipher mode and the pattern.
-  EncryptionScheme(CipherMode mode, const EncryptionPattern& pattern);
-  ~EncryptionScheme();
-
-  bool Matches(const EncryptionScheme& other) const;
-
-  bool is_encrypted() const { return mode_ != CIPHER_MODE_UNENCRYPTED; }
-  CipherMode mode() const { return mode_; }
-  const EncryptionPattern& pattern() const { return pattern_; }
-
- private:
-  CipherMode mode_;
-  EncryptionPattern pattern_;
-
-  // Allow copy and assignment.
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_ENCRYPTION_SCHEME_H_
diff --git a/cobalt/media/base/endian_util.h b/cobalt/media/base/endian_util.h
index cafb4a0..de979cc 100644
--- a/cobalt/media/base/endian_util.h
+++ b/cobalt/media/base/endian_util.h
@@ -18,6 +18,8 @@
 #include "base/sys_byteorder.h"
 #include "starboard/memory.h"
 
+// TODO: Consider Starboardize functions in this file.
+
 namespace cobalt {
 namespace media {
 namespace endian_util {
diff --git a/cobalt/media/base/fake_demuxer_stream.cc b/cobalt/media/base/fake_demuxer_stream.cc
deleted file mode 100644
index e9eaf41..0000000
--- a/cobalt/media/base/fake_demuxer_stream.cc
+++ /dev/null
@@ -1,227 +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.
-
-#include "cobalt/media/base/fake_demuxer_stream.h"
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/base/video_frame.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-const int kStartTimestampMs = 0;
-const int kDurationMs = 30;
-const int kStartWidth = 320;
-const int kStartHeight = 240;
-const int kWidthDelta = 4;
-const int kHeightDelta = 3;
-const uint8_t kKeyId[] = {0x00, 0x01, 0x02, 0x03};
-const uint8_t kIv[] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-FakeDemuxerStream::FakeDemuxerStream(int num_configs,
-                                     int num_buffers_in_one_config,
-                                     bool is_encrypted)
-    : task_runner_(base::ThreadTaskRunnerHandle::Get()),
-      num_configs_(num_configs),
-      num_buffers_in_one_config_(num_buffers_in_one_config),
-      config_changes_(num_configs > 1),
-      is_encrypted_(is_encrypted),
-      read_to_hold_(-1) {
-  DCHECK_GT(num_configs, 0);
-  DCHECK_GT(num_buffers_in_one_config, 0);
-  Initialize();
-  UpdateVideoDecoderConfig();
-}
-
-FakeDemuxerStream::~FakeDemuxerStream() {}
-
-void FakeDemuxerStream::Initialize() {
-  DCHECK_EQ(-1, read_to_hold_);
-  num_configs_left_ = num_configs_;
-  num_buffers_left_in_current_config_ = num_buffers_in_one_config_;
-  num_buffers_returned_ = 0;
-  current_timestamp_ = base::TimeDelta::FromMilliseconds(kStartTimestampMs);
-  duration_ = base::TimeDelta::FromMilliseconds(kDurationMs);
-  splice_timestamp_ = kNoTimestamp;
-  next_coded_size_ = math::Size(kStartWidth, kStartHeight);
-  next_read_num_ = 0;
-}
-
-void FakeDemuxerStream::Read(const ReadCB& read_cb) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(read_cb_.is_null());
-
-  read_cb_ = BindToCurrentLoop(read_cb);
-
-  if (read_to_hold_ == next_read_num_) return;
-
-  DCHECK(read_to_hold_ == -1 || read_to_hold_ > next_read_num_);
-  DoRead();
-}
-
-AudioDecoderConfig FakeDemuxerStream::audio_decoder_config() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  NOTREACHED();
-  return AudioDecoderConfig();
-}
-
-VideoDecoderConfig FakeDemuxerStream::video_decoder_config() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  return video_decoder_config_;
-}
-
-// TODO(xhwang): Support audio if needed.
-DemuxerStream::Type FakeDemuxerStream::type() const {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  return VIDEO;
-}
-
-bool FakeDemuxerStream::SupportsConfigChanges() { return config_changes_; }
-
-VideoRotation FakeDemuxerStream::video_rotation() { return VIDEO_ROTATION_0; }
-
-bool FakeDemuxerStream::enabled() const { return true; }
-
-void FakeDemuxerStream::set_enabled(bool enabled, base::TimeDelta timestamp) {
-  NOTIMPLEMENTED();
-}
-
-void FakeDemuxerStream::SetStreamStatusChangeCB(
-    const StreamStatusChangeCB& cb) {
-  NOTIMPLEMENTED();
-}
-
-void FakeDemuxerStream::HoldNextRead() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  read_to_hold_ = next_read_num_;
-}
-
-void FakeDemuxerStream::HoldNextConfigChangeRead() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  // Set |read_to_hold_| to be the next config change read.
-  read_to_hold_ = next_read_num_ + num_buffers_in_one_config_ -
-                  next_read_num_ % (num_buffers_in_one_config_ + 1);
-}
-
-void FakeDemuxerStream::SatisfyRead() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(read_to_hold_, next_read_num_);
-  DCHECK(!read_cb_.is_null());
-
-  read_to_hold_ = -1;
-  DoRead();
-}
-
-void FakeDemuxerStream::SatisfyReadAndHoldNext() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(read_to_hold_, next_read_num_);
-  DCHECK(!read_cb_.is_null());
-
-  ++read_to_hold_;
-  DoRead();
-}
-
-void FakeDemuxerStream::Reset() {
-  read_to_hold_ = -1;
-
-  if (!read_cb_.is_null()) base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
-}
-
-void FakeDemuxerStream::SeekToStart() {
-  Reset();
-  Initialize();
-}
-
-void FakeDemuxerStream::SeekToEndOfStream() {
-  num_configs_left_ = 0;
-  num_buffers_left_in_current_config_ = 0;
-}
-
-void FakeDemuxerStream::UpdateVideoDecoderConfig() {
-  const math::Rect kVisibleRect(kStartWidth, kStartHeight);
-  video_decoder_config_.Initialize(
-      kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, PIXEL_FORMAT_YV12,
-      COLOR_SPACE_UNSPECIFIED, next_coded_size_, kVisibleRect, next_coded_size_,
-      EmptyExtraData(),
-      is_encrypted_ ? AesCtrEncryptionScheme() : Unencrypted());
-  next_coded_size_.Enlarge(kWidthDelta, kHeightDelta);
-}
-
-void FakeDemuxerStream::DoRead() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(!read_cb_.is_null());
-
-  next_read_num_++;
-
-  if (num_buffers_left_in_current_config_ == 0) {
-    // End of stream.
-    if (num_configs_left_ == 0) {
-      base::ResetAndReturn(&read_cb_).Run(kOk,
-                                          DecoderBuffer::CreateEOSBuffer());
-      return;
-    }
-
-    // Config change.
-    num_buffers_left_in_current_config_ = num_buffers_in_one_config_;
-    UpdateVideoDecoderConfig();
-    base::ResetAndReturn(&read_cb_).Run(kConfigChanged, NULL);
-    return;
-  }
-
-  scoped_refptr<DecoderBuffer> buffer = CreateFakeVideoBufferForTest(
-      video_decoder_config_, current_timestamp_, duration_);
-
-  // TODO(xhwang): Output out-of-order buffers if needed.
-  if (is_encrypted_) {
-    buffer->set_decrypt_config(DecryptConfig::CreateCencConfig(
-        std::string(kKeyId, kKeyId + arraysize(kKeyId)),
-        std::string(kIv, kIv + arraysize(kIv)), std::vector<SubsampleEntry>()));
-  }
-  buffer->set_timestamp(current_timestamp_);
-  buffer->set_duration(duration_);
-  buffer->set_splice_timestamp(splice_timestamp_);
-  current_timestamp_ += duration_;
-
-  num_buffers_left_in_current_config_--;
-  if (num_buffers_left_in_current_config_ == 0) num_configs_left_--;
-
-  num_buffers_returned_++;
-  base::ResetAndReturn(&read_cb_).Run(kOk, buffer);
-}
-
-FakeDemuxerStreamProvider::FakeDemuxerStreamProvider(
-    int num_video_configs, int num_video_buffers_in_one_config,
-    bool is_video_encrypted)
-    : fake_video_stream_(num_video_configs, num_video_buffers_in_one_config,
-                         is_video_encrypted) {}
-
-FakeDemuxerStreamProvider::~FakeDemuxerStreamProvider() {}
-
-DemuxerStream* FakeDemuxerStreamProvider::GetStream(DemuxerStream::Type type) {
-  if (type == DemuxerStream::Type::AUDIO) return NULL;
-  return &fake_video_stream_;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/fake_demuxer_stream.h b/cobalt/media/base/fake_demuxer_stream.h
deleted file mode 100644
index 3827a94..0000000
--- a/cobalt/media/base/fake_demuxer_stream.h
+++ /dev/null
@@ -1,132 +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 COBALT_MEDIA_BASE_FAKE_DEMUXER_STREAM_H_
-#define COBALT_MEDIA_BASE_FAKE_DEMUXER_STREAM_H_
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/demuxer_stream_provider.h"
-#include "cobalt/media/base/video_decoder_config.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}  // namespace base
-
-namespace cobalt {
-namespace media {
-
-class FakeDemuxerStream : public DemuxerStream {
- public:
-  // Constructs an object that outputs |num_configs| different configs in
-  // sequence with |num_frames_in_one_config| buffers for each config. The
-  // output buffers are encrypted if |is_encrypted| is true.
-  FakeDemuxerStream(int num_configs, int num_buffers_in_one_config,
-                    bool is_encrypted);
-  ~FakeDemuxerStream() override;
-
-  // DemuxerStream implementation.
-  void Read(const ReadCB& read_cb) override;
-  AudioDecoderConfig audio_decoder_config() override;
-  VideoDecoderConfig video_decoder_config() override;
-  Type type() const override;
-  bool SupportsConfigChanges() override;
-  VideoRotation video_rotation() override;
-  bool enabled() const override;
-  void set_enabled(bool enabled, base::TimeDelta timestamp) override;
-  void SetStreamStatusChangeCB(const StreamStatusChangeCB& cb) override;
-
-  void Initialize();
-
-  int num_buffers_returned() const { return num_buffers_returned_; }
-
-  // Upon the next read, holds the read callback until SatisfyRead() or Reset()
-  // is called.
-  void HoldNextRead();
-
-  // Upon the next config change read, holds the read callback until
-  // SatisfyRead() or Reset() is called. If there is no config change any more,
-  // no read will be held.
-  void HoldNextConfigChangeRead();
-
-  // Satisfies the pending read with the next scheduled status and buffer.
-  void SatisfyRead();
-
-  // Satisfies pending read request and then holds the following read.
-  void SatisfyReadAndHoldNext();
-
-  // Satisfies the pending read (if any) with kAborted and NULL. This call
-  // always clears |hold_next_read_|.
-  void Reset();
-
-  // Reset() this demuxer stream and set the reading position to the start of
-  // the stream.
-  void SeekToStart();
-
-  // Sets further read requests to return EOS buffers.
-  void SeekToEndOfStream();
-
-  // Sets the splice timestamp for all future buffers returned via Read().
-  void set_splice_timestamp(base::TimeDelta splice_timestamp) {
-    splice_timestamp_ = splice_timestamp;
-  }
-
- private:
-  void UpdateVideoDecoderConfig();
-  void DoRead();
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  const int num_configs_;
-  const int num_buffers_in_one_config_;
-  const bool config_changes_;
-  const bool is_encrypted_;
-
-  int num_configs_left_;
-
-  // Number of frames left with the current decoder config.
-  int num_buffers_left_in_current_config_;
-
-  int num_buffers_returned_;
-
-  base::TimeDelta current_timestamp_;
-  base::TimeDelta duration_;
-  base::TimeDelta splice_timestamp_;
-
-  math::Size next_coded_size_;
-  VideoDecoderConfig video_decoder_config_;
-
-  ReadCB read_cb_;
-
-  int next_read_num_;
-  // Zero-based number indicating which read operation should be held. -1 means
-  // no read shall be held.
-  int read_to_hold_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeDemuxerStream);
-};
-
-class FakeDemuxerStreamProvider : public DemuxerStreamProvider {
- public:
-  // Note: FakeDemuxerStream currently only supports a fake video DemuxerStream.
-  FakeDemuxerStreamProvider(int num_video_configs,
-                            int num_video_buffers_in_one_config,
-                            bool is_video_encrypted);
-  ~FakeDemuxerStreamProvider() override;
-
-  // DemuxerStreamProvider implementation.
-  DemuxerStream* GetStream(DemuxerStream::Type type) override;
-
- private:
-  FakeDemuxerStream fake_video_stream_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeDemuxerStreamProvider);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_FAKE_DEMUXER_STREAM_H_
diff --git a/cobalt/media/base/fake_demuxer_stream_unittest.cc b/cobalt/media/base/fake_demuxer_stream_unittest.cc
deleted file mode 100644
index dc58ce5..0000000
--- a/cobalt/media/base/fake_demuxer_stream_unittest.cc
+++ /dev/null
@@ -1,272 +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 "cobalt/media/base/fake_demuxer_stream.h"
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-const int kNumBuffersInOneConfig = 9;
-const int kNumBuffersToReadFirst = 5;
-const int kNumConfigs = 3;
-static_assert(kNumBuffersToReadFirst < kNumBuffersInOneConfig,
-              "do not read too many buffers");
-static_assert(kNumConfigs > 0,
-              "need multiple configs to trigger config change");
-
-class FakeDemuxerStreamTest : public testing::Test {
- public:
-  FakeDemuxerStreamTest()
-      : status_(DemuxerStream::kAborted),
-        read_pending_(false),
-        num_buffers_received_(0) {}
-  ~FakeDemuxerStreamTest() override {}
-
-  void BufferReady(DemuxerStream::Status status,
-                   const scoped_refptr<DecoderBuffer>& buffer) {
-    DCHECK(read_pending_);
-    read_pending_ = false;
-    status_ = status;
-    buffer_ = buffer;
-    if (status == DemuxerStream::kOk && !buffer->end_of_stream())
-      num_buffers_received_++;
-  }
-
-  enum ReadResult { OK, ABORTED, CONFIG_CHANGED, EOS, PENDING };
-
-  void EnterNormalReadState() {
-    stream_.reset(
-        new FakeDemuxerStream(kNumConfigs, kNumBuffersInOneConfig, false));
-    for (int i = 0; i < kNumBuffersToReadFirst; ++i) ReadAndExpect(OK);
-    DCHECK_EQ(kNumBuffersToReadFirst, num_buffers_received_);
-  }
-
-  void EnterBeforeEOSState() {
-    stream_.reset(new FakeDemuxerStream(1, kNumBuffersInOneConfig, false));
-    for (int i = 0; i < kNumBuffersInOneConfig; ++i) ReadAndExpect(OK);
-    DCHECK_EQ(kNumBuffersInOneConfig, num_buffers_received_);
-  }
-
-  void ExpectReadResult(ReadResult result) {
-    switch (result) {
-      case OK:
-        EXPECT_FALSE(read_pending_);
-        EXPECT_EQ(DemuxerStream::kOk, status_);
-        ASSERT_TRUE(buffer_.get());
-        EXPECT_FALSE(buffer_->end_of_stream());
-        break;
-
-      case ABORTED:
-        EXPECT_FALSE(read_pending_);
-        EXPECT_EQ(DemuxerStream::kAborted, status_);
-        EXPECT_FALSE(buffer_.get());
-        break;
-
-      case CONFIG_CHANGED:
-        EXPECT_TRUE(stream_->SupportsConfigChanges());
-        EXPECT_FALSE(read_pending_);
-        EXPECT_EQ(DemuxerStream::kConfigChanged, status_);
-        EXPECT_FALSE(buffer_.get());
-        break;
-
-      case EOS:
-        EXPECT_FALSE(read_pending_);
-        EXPECT_EQ(DemuxerStream::kOk, status_);
-        ASSERT_TRUE(buffer_.get());
-        EXPECT_TRUE(buffer_->end_of_stream());
-        break;
-
-      case PENDING:
-        EXPECT_TRUE(read_pending_);
-        break;
-    }
-  }
-
-  void ReadAndExpect(ReadResult result) {
-    EXPECT_FALSE(read_pending_);
-    read_pending_ = true;
-    stream_->Read(base::Bind(&FakeDemuxerStreamTest::BufferReady,
-                             base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-    ExpectReadResult(result);
-  }
-
-  void ReadUntilPending() {
-    while (1) {
-      read_pending_ = true;
-      stream_->Read(base::Bind(&FakeDemuxerStreamTest::BufferReady,
-                               base::Unretained(this)));
-      base::RunLoop().RunUntilIdle();
-      if (read_pending_) break;
-    }
-  }
-
-  void SatisfyReadAndExpect(ReadResult result) {
-    EXPECT_TRUE(read_pending_);
-    stream_->SatisfyRead();
-    base::RunLoop().RunUntilIdle();
-    ExpectReadResult(result);
-  }
-
-  void Reset() {
-    bool had_read_pending = read_pending_;
-    stream_->Reset();
-    base::RunLoop().RunUntilIdle();
-
-    EXPECT_FALSE(read_pending_);
-    if (had_read_pending) ExpectReadResult(ABORTED);
-  }
-
-  void ReadAllBuffers(int num_configs, int num_buffers_in_one_config) {
-    DCHECK_EQ(0, num_buffers_received_);
-    for (int i = 0; i < num_configs; ++i) {
-      for (int j = 0; j < num_buffers_in_one_config; ++j) {
-        ReadAndExpect(OK);
-        EXPECT_EQ(num_buffers_received_, stream_->num_buffers_returned());
-      }
-
-      if (i == num_configs - 1)
-        ReadAndExpect(EOS);
-      else
-        ReadAndExpect(CONFIG_CHANGED);
-    }
-
-    // Will always get EOS after we hit EOS.
-    ReadAndExpect(EOS);
-
-    EXPECT_EQ(num_configs * num_buffers_in_one_config, num_buffers_received_);
-  }
-
-  void TestRead(int num_configs, int num_buffers_in_one_config,
-                bool is_encrypted) {
-    stream_.reset(new FakeDemuxerStream(num_configs, num_buffers_in_one_config,
-                                        is_encrypted));
-
-    const VideoDecoderConfig& config = stream_->video_decoder_config();
-    EXPECT_TRUE(config.IsValidConfig());
-    EXPECT_EQ(is_encrypted, config.is_encrypted());
-
-    ReadAllBuffers(num_configs, num_buffers_in_one_config);
-  }
-
-  base::MessageLoop message_loop_;
-  std::unique_ptr<FakeDemuxerStream> stream_;
-
-  DemuxerStream::Status status_;
-  scoped_refptr<DecoderBuffer> buffer_;
-  bool read_pending_;
-  int num_buffers_received_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FakeDemuxerStreamTest);
-};
-
-TEST_F(FakeDemuxerStreamTest, Read_OneConfig) { TestRead(1, 5, false); }
-
-TEST_F(FakeDemuxerStreamTest, Read_MultipleConfigs) { TestRead(3, 5, false); }
-
-TEST_F(FakeDemuxerStreamTest, Read_OneBufferPerConfig) {
-  TestRead(3, 1, false);
-}
-
-TEST_F(FakeDemuxerStreamTest, Read_Encrypted) { TestRead(6, 3, true); }
-
-TEST_F(FakeDemuxerStreamTest, HoldRead_Normal) {
-  EnterNormalReadState();
-  stream_->HoldNextRead();
-  ReadAndExpect(PENDING);
-  SatisfyReadAndExpect(OK);
-}
-
-TEST_F(FakeDemuxerStreamTest, HoldRead_BeforeConfigChanged) {
-  EnterNormalReadState();
-  stream_->HoldNextConfigChangeRead();
-  ReadUntilPending();
-  SatisfyReadAndExpect(CONFIG_CHANGED);
-}
-
-TEST_F(FakeDemuxerStreamTest, HoldRead_BeforeEOS) {
-  EnterBeforeEOSState();
-  stream_->HoldNextRead();
-  ReadAndExpect(PENDING);
-  SatisfyReadAndExpect(EOS);
-}
-
-TEST_F(FakeDemuxerStreamTest, Reset_Normal) {
-  EnterNormalReadState();
-  Reset();
-  ReadAndExpect(OK);
-}
-
-TEST_F(FakeDemuxerStreamTest, Reset_AfterHoldRead) {
-  EnterNormalReadState();
-  stream_->HoldNextRead();
-  Reset();
-  ReadAndExpect(OK);
-}
-
-TEST_F(FakeDemuxerStreamTest, Reset_DuringPendingRead) {
-  EnterNormalReadState();
-  stream_->HoldNextRead();
-  ReadAndExpect(PENDING);
-  Reset();
-  ReadAndExpect(OK);
-}
-
-TEST_F(FakeDemuxerStreamTest, Reset_BeforeConfigChanged) {
-  EnterNormalReadState();
-  stream_->HoldNextConfigChangeRead();
-  ReadUntilPending();
-  Reset();
-  ReadAndExpect(CONFIG_CHANGED);
-}
-
-TEST_F(FakeDemuxerStreamTest, Reset_BeforeEOS) {
-  EnterBeforeEOSState();
-  stream_->HoldNextRead();
-  ReadAndExpect(PENDING);
-  Reset();
-  ReadAndExpect(EOS);
-}
-
-TEST_F(FakeDemuxerStreamTest, NoConfigChanges) {
-  stream_.reset(new FakeDemuxerStream(1, kNumBuffersInOneConfig, false));
-  EXPECT_FALSE(stream_->SupportsConfigChanges());
-  for (int i = 0; i < kNumBuffersInOneConfig; ++i) ReadAndExpect(OK);
-  ReadAndExpect(EOS);
-}
-
-TEST_F(FakeDemuxerStreamTest, SeekToStart_Normal) {
-  EnterNormalReadState();
-  stream_->SeekToStart();
-  num_buffers_received_ = 0;
-  ReadAllBuffers(kNumConfigs, kNumBuffersInOneConfig);
-}
-
-TEST_F(FakeDemuxerStreamTest, SeekToStart_BeforeEOS) {
-  EnterBeforeEOSState();
-  stream_->SeekToStart();
-  num_buffers_received_ = 0;
-  ReadAllBuffers(1, kNumBuffersInOneConfig);
-}
-
-TEST_F(FakeDemuxerStreamTest, SeekToStart_AfterEOS) {
-  TestRead(3, 5, false);
-  stream_->SeekToStart();
-  num_buffers_received_ = 0;
-  ReadAllBuffers(3, 5);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/fake_single_thread_task_runner.cc b/cobalt/media/base/fake_single_thread_task_runner.cc
deleted file mode 100644
index 241eaed..0000000
--- a/cobalt/media/base/fake_single_thread_task_runner.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/base/fake_single_thread_task_runner.h"
-
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/time/tick_clock.h"
-
-namespace cobalt {
-namespace media {
-
-FakeSingleThreadTaskRunner::FakeSingleThreadTaskRunner(
-    base::SimpleTestTickClock* clock)
-    : clock_(clock), fail_on_next_task_(false) {}
-
-FakeSingleThreadTaskRunner::~FakeSingleThreadTaskRunner() {}
-
-bool FakeSingleThreadTaskRunner::PostDelayedTask(
-    const base::Location& from_here, const base::Closure& task,
-    base::TimeDelta delay) {
-  if (fail_on_next_task_) {
-    LOG(FATAL) << "Infinite task posting loop detected.  Possibly caused by "
-               << from_here.ToString() << " posting a task with delay "
-               << delay.InMicroseconds() << " usec.";
-  }
-
-  CHECK_LE(base::TimeDelta(), delay);
-  const base::TimeTicks run_time = clock_->NowTicks() + delay;
-
-  // If there are one or more tasks with the exact same run time, schedule this
-  // task to occur after them.  This mimics the FIFO ordering behavior when
-  // scheduling delayed tasks to be run via base::MessageLoop in a
-  // multi-threaded application.
-  if (!tasks_.empty()) {
-    const auto after_it = tasks_.lower_bound(
-        TaskKey(run_time + base::TimeDelta::FromMicroseconds(1), 0));
-    if (after_it != tasks_.begin()) {
-      auto it = after_it;
-      --it;
-      if (it->first.first == run_time) {
-        tasks_.insert(
-            after_it /* hint */,
-            std::make_pair(TaskKey(run_time, it->first.second + 1), task));
-        return true;
-      }
-    }
-  }
-
-  // No tasks have the exact same run time, so just do a simple insert.
-  tasks_.insert(std::make_pair(TaskKey(run_time, 0), task));
-  return true;
-}
-
-bool FakeSingleThreadTaskRunner::RunsTasksOnCurrentThread() const {
-  return true;
-}
-
-void FakeSingleThreadTaskRunner::RunTasks() {
-  while (true) {
-    // Run all tasks equal or older than current time.
-    const auto it = tasks_.begin();
-    if (it == tasks_.end()) return;  // No more tasks.
-
-    if (clock_->NowTicks() < it->first.first) return;
-
-    const base::Closure task = it->second;
-    tasks_.erase(it);
-    task.Run();
-  }
-}
-
-void FakeSingleThreadTaskRunner::Sleep(base::TimeDelta t) {
-  CHECK_LE(base::TimeDelta(), t);
-  const base::TimeTicks run_until = clock_->NowTicks() + t;
-
-  while (1) {
-    // Run up to 100000 tasks that were scheduled to run during the sleep
-    // period. 100000 should be enough for everybody (see comments below).
-    for (int i = 0; i < 100000; i++) {
-      const auto it = tasks_.begin();
-      if (it == tasks_.end() || run_until < it->first.first) {
-        clock_->Advance(run_until - clock_->NowTicks());
-        return;
-      }
-
-      clock_->Advance(it->first.first - clock_->NowTicks());
-      const base::Closure task = it->second;
-      tasks_.erase(it);
-      task.Run();
-    }
-
-    // If this point is reached, there's likely some sort of case where a new
-    // non-delayed task is being posted every time a task is popped and invoked
-    // from the queue. If that happens, set fail_on_next_task_ to true and throw
-    // an error when the next task is posted, where we might be able to identify
-    // the caller causing the problem via logging.
-    fail_on_next_task_ = true;
-  }
-}
-
-bool FakeSingleThreadTaskRunner::PostNonNestableDelayedTask(
-    const base::Location& from_here, const base::Closure& task,
-    base::TimeDelta delay) {
-  NOTIMPLEMENTED();
-  return false;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/fake_single_thread_task_runner.h b/cobalt/media/base/fake_single_thread_task_runner.h
deleted file mode 100644
index 9c62415..0000000
--- a/cobalt/media/base/fake_single_thread_task_runner.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 COBALT_MEDIA_BASE_FAKE_SINGLE_THREAD_TASK_RUNNER_H_
-#define COBALT_MEDIA_BASE_FAKE_SINGLE_THREAD_TASK_RUNNER_H_
-
-#include <map>
-#include <utility>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/single_thread_task_runner.h"
-#include "base/test/simple_test_tick_clock.h"
-
-namespace cobalt {
-namespace media {
-
-class FakeSingleThreadTaskRunner : public base::SingleThreadTaskRunner {
- public:
-  explicit FakeSingleThreadTaskRunner(base::SimpleTestTickClock* clock);
-
-  void RunTasks();
-
-  // Note: Advances |clock_|.
-  void Sleep(base::TimeDelta t);
-
-  // base::SingleThreadTaskRunner implementation.
-  bool PostDelayedTask(const base::Location& from_here,
-                       const base::Closure& task, base::TimeDelta delay) final;
-
-  bool RunsTasksOnCurrentThread() const final;
-
-  // This function is currently not used, and will return false.
-  bool PostNonNestableDelayedTask(const base::Location& from_here,
-                                  const base::Closure& task,
-                                  base::TimeDelta delay) final;
-
- protected:
-  ~FakeSingleThreadTaskRunner() final;
-
- private:
-  base::SimpleTestTickClock* const clock_;
-
-  // A compound key is used to ensure FIFO execution of delayed tasks scheduled
-  // for the same point-in-time.  The second part of the key is simply a FIFO
-  // sequence number.
-  using TaskKey = std::pair<base::TimeTicks, unsigned int>;
-
-  // Note: The std::map data structure was chosen because the entire
-  // cast_unittests suite performed 20% faster than when using
-  // std::priority_queue.  http://crbug.com/530842
-  std::map<TaskKey, base::Closure> tasks_;
-
-  bool fail_on_next_task_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeSingleThreadTaskRunner);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_FAKE_SINGLE_THREAD_TASK_RUNNER_H_
diff --git a/cobalt/media/base/feedback_signal_accumulator.h b/cobalt/media/base/feedback_signal_accumulator.h
deleted file mode 100644
index 5cec685..0000000
--- a/cobalt/media/base/feedback_signal_accumulator.h
+++ /dev/null
@@ -1,111 +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 COBALT_MEDIA_BASE_FEEDBACK_SIGNAL_ACCUMULATOR_H_
-#define COBALT_MEDIA_BASE_FEEDBACK_SIGNAL_ACCUMULATOR_H_
-
-#include <algorithm>
-
-#include "base/time/time.h"
-
-namespace cobalt {
-namespace media {
-
-// Utility class for maintaining an exponentially-decaying average of feedback
-// signal values whose updates occur at undetermined, possibly irregular time
-// intervals.
-//
-// Feedback signals can be made by multiple sources.  Meaning, there can be
-// several values provided for the same timestamp.  In this case, the greatest
-// value is retained and used to re-compute the average.  Therefore, the values
-// provided to this class' methods should be appropriately translated with this
-// in mind.  For example, an "fraction available" metric should be translated
-// into a "fraction utilized" one.
-//
-// Usage note: Reset() must be called at least once before the first call to
-// Update().
-//
-// This template class supports data points that are timestamped using either
-// |base::TimeDelta| or |base::TimeTicks|.
-template <typename TimeType>
-class FeedbackSignalAccumulator {
- public:
-  // |half_life| is the amount of time that must pass between two data points to
-  // move the accumulated average value halfway in-between.  Example: If
-  // |half_life| is one second, then calling Reset(0.0, t=0s) and then
-  // Update(1.0, t=1s) will result in an accumulated average value of 0.5.
-  explicit FeedbackSignalAccumulator(base::TimeDelta half_life)
-      : half_life_(half_life), average_(NAN) {
-    DCHECK(half_life_ > base::TimeDelta());
-  }
-
-  // Erase all memory of historical values, re-starting with the given
-  // |starting_value|.
-  void Reset(double starting_value, TimeType timestamp) {
-    average_ = update_value_ = prior_average_ = starting_value;
-    reset_time_ = update_time_ = prior_update_time_ = timestamp;
-  }
-
-  TimeType reset_time() const { return reset_time_; }
-
-  // Apply the given |value|, which was observed at the given |timestamp|, to
-  // the accumulated average.  If the timestamp is in chronological order, the
-  // update succeeds and this method returns true.  Otherwise the update has no
-  // effect and false is returned.  If there are two or more updates at the same
-  // |timestamp|, only the one with the greatest value will be accounted for
-  // (see class comments for elaboration).
-  bool Update(double value, TimeType timestamp) {
-    DCHECK(!std::isnan(average_)) << "Reset() must be called once.";
-
-    if (timestamp < update_time_) {
-      return false;  // Not in chronological order.
-    } else if (timestamp == update_time_) {
-      if (timestamp == reset_time_) {
-        // Edge case: Multiple updates at reset timestamp.
-        average_ = update_value_ = prior_average_ =
-            std::max(value, update_value_);
-        return true;
-      }
-      if (value <= update_value_) return true;
-      update_value_ = value;
-    } else {
-      prior_average_ = average_;
-      prior_update_time_ = update_time_;
-      update_value_ = value;
-      update_time_ = timestamp;
-    }
-
-    const double elapsed_us = static_cast<double>(
-        (update_time_ - prior_update_time_).InMicroseconds());
-    const double weight =
-        elapsed_us / (elapsed_us + half_life_.InMicroseconds());
-    average_ = weight * update_value_ + (1.0 - weight) * prior_average_;
-    DCHECK(std::isfinite(average_));
-
-    return true;
-  }
-
-  TimeType update_time() const { return update_time_; }
-
-  // Returns the current accumulated average value.
-  double current() const { return average_; }
-
- private:
-  // In conjunction with the |update_time_| and |prior_update_time_|, this is
-  // used to compute the weight of the current update value versus the prior
-  // accumulated average.
-  const base::TimeDelta half_life_;
-
-  TimeType reset_time_;   // |timestamp| passed in last call to Reset().
-  double average_;        // Current accumulated average.
-  double update_value_;   // Latest |value| accepted by Update().
-  TimeType update_time_;  // Latest |timestamp| accepted by Update().
-  double prior_average_;  // Accumulated average before last call to Update().
-  TimeType prior_update_time_;  // |timestamp| in prior call to Update().
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_FEEDBACK_SIGNAL_ACCUMULATOR_H_
diff --git a/cobalt/media/base/feedback_signal_accumulator_unittest.cc b/cobalt/media/base/feedback_signal_accumulator_unittest.cc
deleted file mode 100644
index 85ff4dd..0000000
--- a/cobalt/media/base/feedback_signal_accumulator_unittest.cc
+++ /dev/null
@@ -1,204 +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 "cobalt/media/base/feedback_signal_accumulator.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class FeedbackSignalAccumulatorTest : public ::testing::Test {
- public:
-  FeedbackSignalAccumulatorTest()
-      : half_life_(base::TimeDelta::FromSeconds(1)),
-        acc_(half_life_),
-        t_(base::TimeTicks() + base::TimeDelta::FromSeconds(120)) {
-    acc_.Reset(0.0, t_);
-  }
-
- protected:
-  const base::TimeDelta half_life_;
-  FeedbackSignalAccumulator<base::TimeTicks> acc_;
-  base::TimeTicks t_;
-};
-
-TEST_F(FeedbackSignalAccumulatorTest, HasCorrectStartingValueAfterReset) {
-  ASSERT_EQ(0.0, acc_.current());
-  ASSERT_EQ(t_, acc_.reset_time());
-  ASSERT_EQ(t_, acc_.update_time());
-
-  acc_.Reset(1.0, t_);
-  ASSERT_EQ(1.0, acc_.current());
-  ASSERT_EQ(t_, acc_.reset_time());
-  ASSERT_EQ(t_, acc_.update_time());
-
-  t_ += half_life_;
-  acc_.Reset(2.0, t_);
-  ASSERT_EQ(2.0, acc_.current());
-  ASSERT_EQ(t_, acc_.reset_time());
-  ASSERT_EQ(t_, acc_.update_time());
-}
-
-TEST_F(FeedbackSignalAccumulatorTest, DoesNotUpdateIfBeforeResetTime) {
-  acc_.Reset(0.0, t_);
-  ASSERT_EQ(0.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-
-  const base::TimeTicks one_usec_before =
-      t_ - base::TimeDelta::FromMicroseconds(1);
-  ASSERT_FALSE(acc_.Update(1.0, one_usec_before));
-  ASSERT_EQ(0.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-
-  const base::TimeTicks one_usec_after =
-      t_ + base::TimeDelta::FromMicroseconds(1);
-  ASSERT_TRUE(acc_.Update(1.0, one_usec_after));
-  ASSERT_LT(0.0, acc_.current());
-  ASSERT_EQ(one_usec_after, acc_.update_time());
-}
-
-TEST_F(FeedbackSignalAccumulatorTest, TakesMaxOfUpdatesAtResetTime) {
-  acc_.Reset(0.0, t_);
-  ASSERT_EQ(0.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(1.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-
-  ASSERT_TRUE(acc_.Update(2.0, t_));
-  ASSERT_EQ(2.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(2.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-}
-
-TEST_F(FeedbackSignalAccumulatorTest, AppliesMaxOfUpdatesWithSameTimestamp) {
-  acc_.Reset(0.0, t_);
-  ASSERT_EQ(0.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 1 * half_life_;
-
-  // Update with an identical value at the same timestamp.
-  for (int i = 0; i < 3; ++i) {
-    ASSERT_TRUE(acc_.Update(1.0, t_));
-    ASSERT_EQ(0.5, acc_.current());
-    ASSERT_EQ(t_, acc_.update_time());
-  }
-
-  // Now continue updating with different values at the same timestamp.
-  ASSERT_TRUE(acc_.Update(2.0, t_));
-  ASSERT_EQ(1.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  ASSERT_TRUE(acc_.Update(3.0, t_));
-  ASSERT_EQ(1.5, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(1.5, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-}
-
-TEST_F(FeedbackSignalAccumulatorTest, ProvidesExpectedHoldResponse) {
-  // Step one half-life interval per update.
-  acc_.Reset(0.0, t_);
-  ASSERT_EQ(0.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 1 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(0.5, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 1 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(0.75, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 1 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(0.875, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 1 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(0.9375, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-
-  // Step two half-life intervals per update.
-  acc_.Reset(0.0, t_);
-  ASSERT_EQ(0.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 2 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_NEAR(0.666666667, acc_.current(), 0.000000001);
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 2 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_NEAR(0.888888889, acc_.current(), 0.000000001);
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 2 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_NEAR(0.962962963, acc_.current(), 0.000000001);
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 2 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_NEAR(0.987654321, acc_.current(), 0.000000001);
-  ASSERT_EQ(t_, acc_.update_time());
-
-  // Step three half-life intervals per update.
-  acc_.Reset(0.0, t_);
-  ASSERT_EQ(0.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 3 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(0.75, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 3 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(0.9375, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 3 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(0.984375, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 3 * half_life_;
-  ASSERT_TRUE(acc_.Update(1.0, t_));
-  ASSERT_EQ(0.99609375, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-}
-
-TEST_F(FeedbackSignalAccumulatorTest, IgnoresUpdatesThatAreOutOfOrder) {
-  // First, go forward several steps, in order.
-  acc_.Reset(0.0, t_);
-  ASSERT_EQ(0.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 1 * half_life_;
-  ASSERT_TRUE(acc_.Update(2.0, t_));
-  ASSERT_EQ(1.0, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 1 * half_life_;
-  ASSERT_TRUE(acc_.Update(2.0, t_));
-  ASSERT_EQ(1.5, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 1 * half_life_;
-  ASSERT_TRUE(acc_.Update(2.0, t_));
-  ASSERT_EQ(1.75, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-  t_ += 1 * half_life_;
-  ASSERT_TRUE(acc_.Update(2.0, t_));
-  ASSERT_EQ(1.875, acc_.current());
-  ASSERT_EQ(t_, acc_.update_time());
-
-  // Go back 1 steps, then 1.5, then 2, then 2.5, etc. and expect the update to
-  // fail each time.
-  base::TimeTicks earlier = t_ - 1 * half_life_;
-  for (int i = 0; i < 5; ++i) {
-    ASSERT_FALSE(acc_.Update(999.0, earlier));
-    ASSERT_EQ(1.875, acc_.current());
-    ASSERT_EQ(t_, acc_.update_time());
-    earlier -= half_life_ / 2;
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/format_support_query_metrics.cc b/cobalt/media/base/format_support_query_metrics.cc
new file mode 100644
index 0000000..5d43621
--- /dev/null
+++ b/cobalt/media/base/format_support_query_metrics.cc
@@ -0,0 +1,113 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/media/base/format_support_query_metrics.h"
+
+#include <algorithm>
+
+#include "base/logging.h"
+#include "base/strings/string_util.h"
+#include "starboard/common/string.h"
+
+namespace cobalt {
+namespace media {
+
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+
+// static
+SbTimeMonotonic FormatSupportQueryMetrics::cached_query_durations_[] = {0};
+char FormatSupportQueryMetrics::max_query_description_[] = {};
+SbTimeMonotonic FormatSupportQueryMetrics::max_query_duration_ = 0;
+SbTimeMonotonic FormatSupportQueryMetrics::total_query_duration_ = 0;
+int FormatSupportQueryMetrics::total_num_queries_ = 0;
+
+FormatSupportQueryMetrics::FormatSupportQueryMetrics() {
+  query_start_time_ = SbTimeGetMonotonicNow();
+}
+
+
+void FormatSupportQueryMetrics::RecordQuery(const char* query_name,
+                                            const std::string& mime_type,
+                                            const std::string& key_system,
+                                            SbMediaSupportType support_type) {
+  auto get_support_type_str = [](SbMediaSupportType support_type) {
+    switch (support_type) {
+      case kSbMediaSupportTypeNotSupported:
+        return " -> not supported/false";
+      case kSbMediaSupportTypeMaybe:
+        return " -> maybe/true";
+      case kSbMediaSupportTypeProbably:
+        return " -> probably/true";
+      default:
+        NOTREACHED();
+        return "";
+    }
+  };
+
+  SbTimeMonotonic duration = SbTimeGetMonotonicNow() - query_start_time_;
+  total_query_duration_ += duration;
+
+  std::string query_description = starboard::FormatString(
+      "%s(%s%s%s, %" PRId64 " μs", query_name, mime_type.c_str(),
+      (key_system.empty() ? ")" : ", " + key_system + ")").c_str(),
+      get_support_type_str(support_type), duration);
+  LOG(INFO) << query_description;
+
+  if (total_num_queries_ < SB_ARRAY_SIZE_INT(cached_query_durations_)) {
+    cached_query_durations_[total_num_queries_] = duration;
+  }
+  ++total_num_queries_;
+  if (duration > max_query_duration_) {
+    max_query_duration_ = duration;
+    base::strlcpy(max_query_description_, query_description.c_str(),
+                  SB_ARRAY_SIZE_INT(max_query_description_));
+  }
+}
+
+// static
+void FormatSupportQueryMetrics::PrintAndResetFormatSupportQueryMetrics() {
+  if (total_num_queries_ == 0) {
+    LOG(INFO) << "Format support query metrics:\n\tNumber of queries: 0";
+    return;
+  }
+
+  auto get_median = []() {
+    int num_elements = std::min(total_num_queries_,
+                                SB_ARRAY_SIZE_INT(cached_query_durations_));
+    int middle_index = num_elements / 2;
+    std::nth_element(cached_query_durations_,
+                     cached_query_durations_ + middle_index,
+                     cached_query_durations_ + num_elements);
+    auto middle_element = cached_query_durations_[middle_index];
+    return middle_element;
+  };
+
+  LOG(INFO) << "Format support query metrics:\n\tNumber of queries: "
+            << total_num_queries_
+            << "\n\tTotal query time: " << total_query_duration_
+            << " μs\n\tAverage query time: "
+            << total_query_duration_ / total_num_queries_
+            << " μs\n\tMedian query time: ~" << get_median()
+            << " μs\n\tLongest query: " << max_query_description_;
+
+  max_query_description_[0] = 0;
+  max_query_duration_ = 0;
+  total_query_duration_ = 0;
+  total_num_queries_ = 0;
+}
+
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
+
+}  // namespace media
+}  // namespace cobalt
diff --git a/cobalt/media/base/format_support_query_metrics.h b/cobalt/media/base/format_support_query_metrics.h
new file mode 100644
index 0000000..4678d6e
--- /dev/null
+++ b/cobalt/media/base/format_support_query_metrics.h
@@ -0,0 +1,69 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_MEDIA_BASE_FORMAT_SUPPORT_QUERY_METRICS_H_
+#define COBALT_MEDIA_BASE_FORMAT_SUPPORT_QUERY_METRICS_H_
+
+#include <string>
+
+#include "starboard/media.h"
+#include "starboard/time.h"
+
+namespace cobalt {
+namespace media {
+
+#if defined(COBALT_BUILD_TYPE_GOLD)
+
+class FormatSupportQueryMetrics {
+ public:
+  FormatSupportQueryMetrics() = default;
+  ~FormatSupportQueryMetrics() = default;
+  void RecordQuery(const char* query_name, const std::string& mime_type,
+                   const std::string& key_system,
+                   SbMediaSupportType support_type) {}
+  static void PrintAndResetFormatSupportQueryMetrics() {}
+};
+
+#else  // defined(COBALT_BUILD_TYPE_GOLD)
+
+class FormatSupportQueryMetrics {
+ public:
+  FormatSupportQueryMetrics();
+  ~FormatSupportQueryMetrics() {}
+
+  void RecordQuery(const char* query_name, const std::string& mime_type,
+                   const std::string& key_system,
+                   SbMediaSupportType support_type);
+
+  static void PrintAndResetFormatSupportQueryMetrics();
+
+ private:
+  static constexpr int kMaxCachedQueryDurations = 150;
+  static constexpr int kMaxQueryDescriptionLength = 350;
+
+  static SbTimeMonotonic cached_query_durations_[kMaxCachedQueryDurations];
+  static char max_query_description_[kMaxQueryDescriptionLength];
+  static SbTimeMonotonic max_query_duration_;
+  static SbTimeMonotonic total_query_duration_;
+  static int total_num_queries_;
+
+  SbTimeMonotonic query_start_time_ = 0;
+};
+
+#endif  // defined(COBALT_BUILD_TYPE_GOLD)
+
+}  // namespace media
+}  // namespace cobalt
+
+#endif  // COBALT_MEDIA_BASE_FORMAT_SUPPORT_QUERY_METRICS_H_
diff --git a/cobalt/media/base/gmock_callback_support.h b/cobalt/media/base/gmock_callback_support.h
deleted file mode 100644
index ca2ab5c..0000000
--- a/cobalt/media/base/gmock_callback_support.h
+++ /dev/null
@@ -1,98 +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 COBALT_MEDIA_BASE_GMOCK_CALLBACK_SUPPORT_H_
-#define COBALT_MEDIA_BASE_GMOCK_CALLBACK_SUPPORT_H_
-
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace cobalt {
-namespace media {
-
-// Matchers for base::Callback and base::Closure.
-
-MATCHER(IsNullCallback, "a null callback") { return (arg.is_null()); }
-
-MATCHER(IsNotNullCallback, "a non-null callback") { return (!arg.is_null()); }
-
-// The RunClosure<N>() action invokes Run() method on the N-th (0-based)
-// argument of the mock function.
-
-ACTION_TEMPLATE(RunClosure, HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_0_VALUE_PARAMS()) {
-  ::std::tr1::get<k>(args).Run();
-}
-
-ACTION_P(RunClosure, closure) { closure.Run(); }
-
-// Various overloads for RunCallback<N>().
-//
-// The RunCallback<N>(p1, p2, ..., p_k) action invokes Run() method on the N-th
-// (0-based) argument of the mock function, with arguments p1, p2, ..., p_k.
-//
-// Notes:
-//
-//   1. The arguments are passed by value by default.  If you need to
-//   pass an argument by reference, wrap it inside ByRef().  For example,
-//
-//     RunCallback<1>(5, string("Hello"), ByRef(foo))
-//
-//   passes 5 and string("Hello") by value, and passes foo by reference.
-//
-//   2. If the callback takes an argument by reference but ByRef() is
-//   not used, it will receive the reference to a copy of the value,
-//   instead of the original value.  For example, when the 0-th
-//   argument of the callback takes a const string&, the action
-//
-//     RunCallback<0>(string("Hello"))
-//
-//   makes a copy of the temporary string("Hello") object and passes a
-//   reference of the copy, instead of the original temporary object,
-//   to the callback.  This makes it easy for a user to define an
-//   RunCallback action from temporary values and have it performed later.
-
-ACTION_TEMPLATE(RunCallback, HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_0_VALUE_PARAMS()) {
-  return ::std::tr1::get<k>(args).Run();
-}
-
-ACTION_TEMPLATE(RunCallback, HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_1_VALUE_PARAMS(p0)) {
-  return ::std::tr1::get<k>(args).Run(p0);
-}
-
-ACTION_TEMPLATE(RunCallback, HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_2_VALUE_PARAMS(p0, p1)) {
-  return ::std::tr1::get<k>(args).Run(p0, p1);
-}
-
-ACTION_TEMPLATE(RunCallback, HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_3_VALUE_PARAMS(p0, p1, p2)) {
-  return ::std::tr1::get<k>(args).Run(p0, p1, p2);
-}
-
-ACTION_TEMPLATE(RunCallback, HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
-  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3);
-}
-
-ACTION_TEMPLATE(RunCallback, HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
-  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3, p4);
-}
-
-ACTION_TEMPLATE(RunCallback, HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
-  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3, p4, p5);
-}
-
-ACTION_TEMPLATE(RunCallback, HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
-  return ::std::tr1::get<k>(args).Run(p0, p1, p2, p3, p4, p5, p6);
-}
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_GMOCK_CALLBACK_SUPPORT_H_
diff --git a/cobalt/media/base/gmock_callback_support_unittest.cc b/cobalt/media/base/gmock_callback_support_unittest.cc
deleted file mode 100644
index c0f206a..0000000
--- a/cobalt/media/base/gmock_callback_support_unittest.cc
+++ /dev/null
@@ -1,83 +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 "cobalt/media/base/gmock_callback_support.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::ByRef;
-using testing::MockFunction;
-
-namespace cobalt {
-namespace media {
-
-typedef base::Callback<void(const bool& src, bool* dst)> TestCallback;
-
-void SetBool(const bool& src, bool* dst) { *dst = src; }
-
-TEST(GmockCallbackSupportTest, IsNullCallback) {
-  MockFunction<void(const TestCallback&)> check;
-  EXPECT_CALL(check, Call(IsNullCallback()));
-  check.Call(TestCallback());
-}
-
-TEST(GmockCallbackSupportTest, IsNotNullCallback) {
-  MockFunction<void(const TestCallback&)> check;
-  EXPECT_CALL(check, Call(IsNotNullCallback()));
-  check.Call(base::Bind(&SetBool));
-}
-
-TEST(GmockCallbackSupportTest, RunClosure) {
-  MockFunction<void(const base::Closure&)> check;
-  bool dst = false;
-  EXPECT_CALL(check, Call(IsNotNullCallback())).WillOnce(RunClosure<0>());
-  check.Call(base::Bind(&SetBool, true, &dst));
-  EXPECT_TRUE(dst);
-}
-
-TEST(GmockCallbackSupportTest, RunCallback0) {
-  MockFunction<void(const TestCallback&)> check;
-  bool dst = false;
-  EXPECT_CALL(check, Call(IsNotNullCallback()))
-      .WillOnce(RunCallback<0>(true, &dst));
-  check.Call(base::Bind(&SetBool));
-  EXPECT_TRUE(dst);
-}
-
-TEST(GmockCallbackSupportTest, RunCallback1) {
-  MockFunction<void(int, const TestCallback&)> check;
-  bool dst = false;
-  EXPECT_CALL(check, Call(0, IsNotNullCallback()))
-      .WillOnce(RunCallback<1>(true, &dst));
-  check.Call(0, base::Bind(&SetBool));
-  EXPECT_TRUE(dst);
-}
-
-TEST(GmockCallbackSupportTest, RunCallbackPassByRef) {
-  MockFunction<void(const TestCallback&)> check;
-  bool dst = false;
-  bool src = false;
-  EXPECT_CALL(check, Call(IsNotNullCallback()))
-      .WillOnce(RunCallback<0>(ByRef(src), &dst));
-  src = true;
-  check.Call(base::Bind(&SetBool));
-  EXPECT_TRUE(dst);
-}
-
-TEST(GmockCallbackSupportTest, RunCallbackPassByValue) {
-  MockFunction<void(const TestCallback&)> check;
-  bool dst = false;
-  bool src = true;
-  EXPECT_CALL(check, Call(IsNotNullCallback()))
-      .WillOnce(RunCallback<0>(src, &dst));
-  src = false;
-  check.Call(base::Bind(&SetBool));
-  EXPECT_TRUE(dst);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/hdr_metadata.cc b/cobalt/media/base/hdr_metadata.cc
deleted file mode 100644
index 928fc11..0000000
--- a/cobalt/media/base/hdr_metadata.cc
+++ /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.
-
-#include "cobalt/media/base/hdr_metadata.h"
-
-namespace cobalt {
-namespace media {
-
-MasteringMetadata::MasteringMetadata()
-    : primary_r_chromaticity_x(0),
-      primary_r_chromaticity_y(0),
-      primary_g_chromaticity_x(0),
-      primary_g_chromaticity_y(0),
-      primary_b_chromaticity_x(0),
-      primary_b_chromaticity_y(0),
-      white_point_chromaticity_x(0),
-      white_point_chromaticity_y(0),
-      luminance_max(0),
-      luminance_min(0) {}
-
-MasteringMetadata::MasteringMetadata(const MasteringMetadata& rhs) {
-  *this = rhs;
-}
-
-HDRMetadata::HDRMetadata() : max_cll(0), max_fall(0) {}
-
-HDRMetadata::HDRMetadata(const HDRMetadata& rhs) { *this = rhs; }
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/hdr_metadata.h b/cobalt/media/base/hdr_metadata.h
deleted file mode 100644
index 9058a0d..0000000
--- a/cobalt/media/base/hdr_metadata.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_HDR_METADATA_H_
-#define COBALT_MEDIA_BASE_HDR_METADATA_H_
-
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// SMPTE ST 2086 mastering metadata.
-struct MEDIA_EXPORT MasteringMetadata {
-  float primary_r_chromaticity_x;
-  float primary_r_chromaticity_y;
-  float primary_g_chromaticity_x;
-  float primary_g_chromaticity_y;
-  float primary_b_chromaticity_x;
-  float primary_b_chromaticity_y;
-  float white_point_chromaticity_x;
-  float white_point_chromaticity_y;
-  float luminance_max;
-  float luminance_min;
-
-  MasteringMetadata();
-  MasteringMetadata(const MasteringMetadata& rhs);
-
-  bool operator==(const MasteringMetadata& rhs) const {
-    return ((primary_r_chromaticity_x == rhs.primary_r_chromaticity_x) &&
-            (primary_r_chromaticity_y == rhs.primary_r_chromaticity_y) &&
-            (primary_g_chromaticity_x == rhs.primary_g_chromaticity_x) &&
-            (primary_g_chromaticity_y == rhs.primary_g_chromaticity_y) &&
-            (primary_b_chromaticity_x == rhs.primary_b_chromaticity_x) &&
-            (primary_b_chromaticity_y == rhs.primary_b_chromaticity_y) &&
-            (white_point_chromaticity_x == rhs.white_point_chromaticity_x) &&
-            (white_point_chromaticity_y == rhs.white_point_chromaticity_y) &&
-            (luminance_max == rhs.luminance_max) &&
-            (luminance_min == rhs.luminance_min));
-  }
-};
-
-// HDR metadata common for HDR10 and WebM/VP9-based HDR formats.
-struct MEDIA_EXPORT HDRMetadata {
-  MasteringMetadata mastering_metadata;
-  unsigned max_cll;
-  unsigned max_fall;
-
-  HDRMetadata();
-  HDRMetadata(const HDRMetadata& rhs);
-
-  bool operator==(const HDRMetadata& rhs) const {
-    return ((max_cll == rhs.max_cll) && (max_fall == rhs.max_fall) &&
-            (mastering_metadata == rhs.mastering_metadata));
-  }
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_HDR_METADATA_H_
diff --git a/cobalt/media/base/key_system_names.cc b/cobalt/media/base/key_system_names.cc
deleted file mode 100644
index 6047e02..0000000
--- a/cobalt/media/base/key_system_names.cc
+++ /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.
-
-#include "cobalt/media/base/key_system_names.h"
-
-namespace cobalt {
-namespace media {
-
-const char kClearKey[] = "org.w3.clearkey";
-const char kExternalClearKey[] = "org.chromium.externalclearkey";
-
-bool IsClearKey(const std::string& key_system) {
-  return key_system == kClearKey;
-}
-
-bool IsChildKeySystemOf(const std::string& key_system,
-                        const std::string& base) {
-  std::string prefix = base + '.';
-  return key_system.substr(0, prefix.size()) == prefix;
-}
-
-bool IsExternalClearKey(const std::string& key_system) {
-  return key_system == kExternalClearKey ||
-         IsChildKeySystemOf(key_system, kExternalClearKey);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/key_system_names.h b/cobalt/media/base/key_system_names.h
deleted file mode 100644
index 95d4770..0000000
--- a/cobalt/media/base/key_system_names.h
+++ /dev/null
@@ -1,31 +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 COBALT_MEDIA_BASE_KEY_SYSTEM_NAMES_H_
-#define COBALT_MEDIA_BASE_KEY_SYSTEM_NAMES_H_
-
-#include <string>
-
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// TODO(jrummell): This file should be folded into key_systems.cc as that is
-// the primary user of these functions. http://crbug.com/606579.
-
-// Returns true if |key_system| is Clear Key, false otherwise.
-MEDIA_EXPORT bool IsClearKey(const std::string& key_system);
-
-// Returns true if |key_system| is (reverse) sub-domain of |base|.
-MEDIA_EXPORT bool IsChildKeySystemOf(const std::string& key_system,
-                                     const std::string& base);
-
-// Returns true if |key_system| is External Clear Key, false otherwise.
-MEDIA_EXPORT bool IsExternalClearKey(const std::string& key_system);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_KEY_SYSTEM_NAMES_H_
diff --git a/cobalt/media/base/key_system_properties.cc b/cobalt/media/base/key_system_properties.cc
deleted file mode 100644
index 3168543..0000000
--- a/cobalt/media/base/key_system_properties.cc
+++ /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.
-
-#include "cobalt/media/base/key_system_properties.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-SupportedCodecs KeySystemProperties::GetSupportedSecureCodecs() const {
-#if !defined(OS_ANDROID)
-  NOTREACHED();
-#endif
-  return EME_CODEC_NONE;
-}
-
-bool KeySystemProperties::UseAesDecryptor() const { return false; }
-
-std::string KeySystemProperties::GetPepperType() const {
-#if !defined(ENABLE_PEPPER_CDMS)
-  NOTREACHED();
-#endif
-  return "";
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/key_system_properties.h b/cobalt/media/base/key_system_properties.h
deleted file mode 100644
index 61b4a45..0000000
--- a/cobalt/media/base/key_system_properties.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_KEY_SYSTEM_PROPERTIES_H_
-#define COBALT_MEDIA_BASE_KEY_SYSTEM_PROPERTIES_H_
-
-#include <string>
-
-#include "cobalt/media/base/eme_constants.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// Provides an interface for querying the properties of a registered key system.
-class MEDIA_EXPORT KeySystemProperties {
- public:
-  virtual ~KeySystemProperties() {}
-
-  // Gets the name of this key system.
-  virtual std::string GetKeySystemName() const = 0;
-
-  // Returns whether |init_data_type| is supported by this key system.
-  virtual bool IsSupportedInitDataType(
-      EmeInitDataType init_data_type) const = 0;
-
-  // Returns the codecs supported by this key system.
-  virtual SupportedCodecs GetSupportedCodecs() const = 0;
-
-  // Returns the codecs with hardware-secure support in this key system.
-  virtual SupportedCodecs GetSupportedSecureCodecs() const;
-
-  // Returns the configuration rule for supporting a robustness requirement.
-  virtual EmeConfigRule GetRobustnessConfigRule(
-      EmeMediaType media_type,
-      const std::string& requested_robustness) const = 0;
-
-  // Returns the support this key system provides for persistent-license
-  // sessions.
-  virtual EmeSessionTypeSupport GetPersistentLicenseSessionSupport() const = 0;
-
-  // Returns the support this key system provides for persistent-release-message
-  // sessions.
-  virtual EmeSessionTypeSupport GetPersistentReleaseMessageSessionSupport()
-      const = 0;
-
-  // Returns the support this key system provides for persistent state.
-  virtual EmeFeatureSupport GetPersistentStateSupport() const = 0;
-
-  // Returns the support this key system provides for distinctive identifiers.
-  virtual EmeFeatureSupport GetDistinctiveIdentifierSupport() const = 0;
-
-  // Returns whether AesDecryptor can be used for this key system.
-  virtual bool UseAesDecryptor() const;
-
-  virtual std::string GetPepperType() const;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_KEY_SYSTEM_PROPERTIES_H_
diff --git a/cobalt/media/base/key_systems.cc b/cobalt/media/base/key_systems.cc
deleted file mode 100644
index 4f6e697..0000000
--- a/cobalt/media/base/key_systems.cc
+++ /dev/null
@@ -1,709 +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 "cobalt/media/base/key_systems.h"
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/containers/hash_tables.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "base/threading/thread_checker.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/key_system_names.h"
-#include "cobalt/media/base/key_system_properties.h"
-#include "cobalt/media/base/media.h"
-#include "cobalt/media/base/media_client.h"
-#include "starboard/types.h"
-#include "third_party/widevine/cdm/widevine_cdm_common.h"
-
-namespace cobalt {
-namespace media {
-
-const char kClearKeyKeySystem[] = "org.w3.clearkey";
-
-// These names are used by UMA. Do not change them!
-const char kClearKeyKeySystemNameForUMA[] = "ClearKey";
-const char kUnknownKeySystemNameForUMA[] = "Unknown";
-
-struct NamedCodec {
-  const char* name;
-  EmeCodec type;
-};
-
-// Mapping between containers and their codecs.
-// Only audio codecs can belong to a "audio/*" mime_type, and only video codecs
-// can belong to a "video/*" mime_type.
-static const NamedCodec kMimeTypeToCodecMasks[] = {
-    {"audio/webm", EME_CODEC_WEBM_AUDIO_ALL},
-    {"video/webm", EME_CODEC_WEBM_VIDEO_ALL},
-#if defined(USE_PROPRIETARY_CODECS)
-    {"audio/mp4", EME_CODEC_MP4_AUDIO_ALL},
-    {"video/mp4", EME_CODEC_MP4_VIDEO_ALL}
-#endif  // defined(USE_PROPRIETARY_CODECS)
-};
-
-// Mapping between codec names and enum values.
-static const NamedCodec kCodecStrings[] = {
-    {"opus", EME_CODEC_WEBM_OPUS},      // Opus.
-    {"vorbis", EME_CODEC_WEBM_VORBIS},  // Vorbis.
-    {"vp8", EME_CODEC_WEBM_VP8},        // VP8.
-    {"vp8.0", EME_CODEC_WEBM_VP8},      // VP8.
-    {"vp9", EME_CODEC_WEBM_VP9},        // VP9.
-    {"vp9.0", EME_CODEC_WEBM_VP9},      // VP9.
-#if defined(USE_PROPRIETARY_CODECS)
-    {"vp09", EME_CODEC_MP4_VP9},   // VP9 in MP4.
-    {"mp4a", EME_CODEC_MP4_AAC},   // AAC.
-    {"avc1", EME_CODEC_MP4_AVC1},  // AVC1.
-    {"avc3", EME_CODEC_MP4_AVC1},  // AVC3.
-#if BUILDFLAG(ENABLE_HEVC_DEMUXING)
-    {"hev1", EME_CODEC_MP4_HEVC},  // HEV1.
-    {"hvc1", EME_CODEC_MP4_HEVC},  // HVC1.
-#endif
-#endif  // defined(USE_PROPRIETARY_CODECS)
-};
-
-class ClearKeyProperties : public KeySystemProperties {
- public:
-  std::string GetKeySystemName() const override { return kClearKeyKeySystem; }
-
-  bool IsSupportedInitDataType(EmeInitDataType init_data_type) const override {
-#if defined(USE_PROPRIETARY_CODECS)
-    if (init_data_type == EmeInitDataType::CENC) return true;
-#endif
-    return init_data_type == EmeInitDataType::WEBM ||
-           init_data_type == EmeInitDataType::KEYIDS;
-  }
-
-  SupportedCodecs GetSupportedCodecs() const override {
-    // On Android, Vorbis, VP8, AAC and AVC1 are supported in MediaCodec:
-    // http://developer.android.com/guide/appendix/media-formats.html
-    // VP9 support is device dependent.
-    SupportedCodecs codecs = EME_CODEC_WEBM_ALL;
-
-#if defined(USE_PROPRIETARY_CODECS)
-    codecs |= EME_CODEC_MP4_ALL;
-#endif  // defined(USE_PROPRIETARY_CODECS)
-
-    return codecs;
-  }
-
-  EmeConfigRule GetRobustnessConfigRule(
-      EmeMediaType media_type,
-      const std::string& requested_robustness) const override {
-    return requested_robustness.empty() ? EmeConfigRule::SUPPORTED
-                                        : EmeConfigRule::NOT_SUPPORTED;
-  }
-  EmeSessionTypeSupport GetPersistentLicenseSessionSupport() const override {
-    return EmeSessionTypeSupport::NOT_SUPPORTED;
-  }
-  EmeSessionTypeSupport GetPersistentReleaseMessageSessionSupport()
-      const override {
-    return EmeSessionTypeSupport::NOT_SUPPORTED;
-  }
-  EmeFeatureSupport GetPersistentStateSupport() const override {
-    return EmeFeatureSupport::NOT_SUPPORTED;
-  }
-  EmeFeatureSupport GetDistinctiveIdentifierSupport() const override {
-    return EmeFeatureSupport::NOT_SUPPORTED;
-  }
-  bool UseAesDecryptor() const override { return true; }
-};
-
-// Returns whether the |key_system| is known to Chromium and is thus likely to
-// be implemented in an interoperable way.
-// True is always returned for a |key_system| that begins with "x-".
-//
-// As with other web platform features, advertising support for a key system
-// implies that it adheres to a defined and interoperable specification.
-//
-// To ensure interoperability, implementations of a specific |key_system| string
-// must conform to a specification for that identifier that defines
-// key system-specific behaviors not fully defined by the EME specification.
-// That specification should be provided by the owner of the domain that is the
-// reverse of the |key_system| string.
-// This involves more than calling a library, SDK, or platform API.
-// KeySystemsImpl must be populated appropriately, and there will likely be glue
-// code to adapt to the API of the library, SDK, or platform API.
-//
-// Chromium mainline contains this data and glue code for specific key systems,
-// which should help ensure interoperability with other implementations using
-// these key systems.
-//
-// If you need to add support for other key systems, ensure that you have
-// obtained the specification for how to integrate it with EME, implemented the
-// appropriate glue/adapter code, and added all the appropriate data to
-// KeySystemsImpl. Only then should you change this function.
-static bool IsPotentiallySupportedKeySystem(const std::string& key_system) {
-  // Known and supported key systems.
-  if (key_system == kWidevineKeySystem) return true;
-  if (key_system == kClearKeyKeySystem) return true;
-
-  // External Clear Key is known and supports suffixes for testing.
-  if (IsExternalClearKey(key_system)) return true;
-
-  // Chromecast defines behaviors for Cast clients within its reverse domain.
-  const char kChromecastRoot[] = "com.chromecast";
-  if (IsChildKeySystemOf(key_system, kChromecastRoot)) return true;
-
-  // Implementations that do not have a specification or appropriate glue code
-  // can use the "x-" prefix to avoid conflicting with and advertising support
-  // for real key system names. Use is discouraged.
-  const char kExcludedPrefix[] = "x-";
-  return base::StartsWith(key_system, kExcludedPrefix,
-                          base::CompareCase::SENSITIVE);
-}
-
-class KeySystemsImpl : public KeySystems {
- public:
-  static KeySystemsImpl* GetInstance();
-
-  void UpdateIfNeeded();
-
-  std::string GetKeySystemNameForUMA(const std::string& key_system) const;
-
-  bool UseAesDecryptor(const std::string& key_system) const;
-
-#if defined(ENABLE_PEPPER_CDMS)
-  std::string GetPepperType(const std::string& key_system) const;
-#endif
-
-  // These two functions are for testing purpose only.
-  void AddCodecMask(EmeMediaType media_type, const std::string& codec,
-                    uint32_t mask);
-  void AddMimeTypeCodecMask(const std::string& mime_type, uint32_t mask);
-
-  // Implementation of KeySystems interface.
-  bool IsSupportedKeySystem(const std::string& key_system) const override;
-
-  bool IsSupportedInitDataType(const std::string& key_system,
-                               EmeInitDataType init_data_type) const override;
-
-  EmeConfigRule GetContentTypeConfigRule(
-      const std::string& key_system, EmeMediaType media_type,
-      const std::string& container_mime_type,
-      const std::vector<std::string>& codecs) const override;
-
-  EmeConfigRule GetRobustnessConfigRule(
-      const std::string& key_system, EmeMediaType media_type,
-      const std::string& requested_robustness) const override;
-
-  EmeSessionTypeSupport GetPersistentLicenseSessionSupport(
-      const std::string& key_system) const override;
-
-  EmeSessionTypeSupport GetPersistentReleaseMessageSessionSupport(
-      const std::string& key_system) const override;
-
-  EmeFeatureSupport GetPersistentStateSupport(
-      const std::string& key_system) const override;
-
-  EmeFeatureSupport GetDistinctiveIdentifierSupport(
-      const std::string& key_system) const override;
-
- private:
-  KeySystemsImpl();
-  ~KeySystemsImpl() override;
-
-  void InitializeUMAInfo();
-
-  void UpdateSupportedKeySystems();
-
-  void AddSupportedKeySystems(
-      std::vector<std::unique_ptr<KeySystemProperties>>* key_systems);
-
-  void RegisterMimeType(const std::string& mime_type, EmeCodec codecs_mask);
-  bool IsValidMimeTypeCodecsCombination(const std::string& mime_type,
-                                        SupportedCodecs codecs_mask) const;
-
-  friend struct base::DefaultLazyInstanceTraits<KeySystemsImpl>;
-
-  typedef base::hash_map<std::string, std::unique_ptr<KeySystemProperties>>
-      KeySystemPropertiesMap;
-  typedef base::hash_map<std::string, SupportedCodecs> MimeTypeCodecsMap;
-  typedef base::hash_map<std::string, EmeCodec> CodecsMap;
-  typedef base::hash_map<std::string, EmeInitDataType> InitDataTypesMap;
-  typedef base::hash_map<std::string, std::string> KeySystemNameForUMAMap;
-
-  // TODO(sandersd): Separate container enum from codec mask value.
-  // http://crbug.com/417440
-  // Potentially pass EmeMediaType and a container enum.
-  SupportedCodecs GetCodecMaskForMimeType(
-      const std::string& container_mime_type) const;
-  EmeCodec GetCodecForString(const std::string& codec) const;
-
-  // Map from key system string to KeySystemProperties instance.
-  KeySystemPropertiesMap key_system_properties_map_;
-
-  // This member should only be modified by RegisterMimeType().
-  MimeTypeCodecsMap mime_type_to_codec_mask_map_;
-  CodecsMap codec_string_map_;
-  KeySystemNameForUMAMap key_system_name_for_uma_map_;
-
-  SupportedCodecs audio_codec_mask_;
-  SupportedCodecs video_codec_mask_;
-
-  // Makes sure all methods are called from the same thread.
-  THREAD_CHECKER(thread_checker_);
-
-  DISALLOW_COPY_AND_ASSIGN(KeySystemsImpl);
-};
-
-static base::LazyInstance<KeySystemsImpl>::DestructorAtExit g_key_systems =
-    LAZY_INSTANCE_INITIALIZER;
-
-KeySystemsImpl* KeySystemsImpl::GetInstance() {
-  KeySystemsImpl* key_systems = g_key_systems.Pointer();
-  key_systems->UpdateIfNeeded();
-  return key_systems;
-}
-
-// Because we use a LazyInstance, the key systems info must be populated when
-// the instance is lazily initiated.
-KeySystemsImpl::KeySystemsImpl()
-    : audio_codec_mask_(EME_CODEC_AUDIO_ALL),
-      video_codec_mask_(EME_CODEC_VIDEO_ALL) {
-  for (size_t i = 0; i < arraysize(kCodecStrings); ++i) {
-    const std::string& name = kCodecStrings[i].name;
-    DCHECK(!codec_string_map_.count(name));
-    codec_string_map_[name] = kCodecStrings[i].type;
-  }
-  for (size_t i = 0; i < arraysize(kMimeTypeToCodecMasks); ++i) {
-    RegisterMimeType(kMimeTypeToCodecMasks[i].name,
-                     kMimeTypeToCodecMasks[i].type);
-  }
-
-  InitializeUMAInfo();
-
-  // Always update supported key systems during construction.
-  UpdateSupportedKeySystems();
-}
-
-KeySystemsImpl::~KeySystemsImpl() {}
-
-SupportedCodecs KeySystemsImpl::GetCodecMaskForMimeType(
-    const std::string& container_mime_type) const {
-  MimeTypeCodecsMap::const_iterator iter =
-      mime_type_to_codec_mask_map_.find(container_mime_type);
-  if (iter == mime_type_to_codec_mask_map_.end()) return EME_CODEC_NONE;
-
-  DCHECK(IsValidMimeTypeCodecsCombination(container_mime_type, iter->second));
-  return iter->second;
-}
-
-EmeCodec KeySystemsImpl::GetCodecForString(const std::string& codec) const {
-  CodecsMap::const_iterator iter = codec_string_map_.find(codec);
-  if (iter != codec_string_map_.end()) return iter->second;
-  return EME_CODEC_NONE;
-}
-
-void KeySystemsImpl::InitializeUMAInfo() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(key_system_name_for_uma_map_.empty());
-
-  std::vector<KeySystemInfoForUMA> key_systems_info_for_uma;
-  if (GetMediaClient())
-    GetMediaClient()->AddKeySystemsInfoForUMA(&key_systems_info_for_uma);
-
-  for (const KeySystemInfoForUMA& info : key_systems_info_for_uma) {
-    key_system_name_for_uma_map_[info.key_system] =
-        info.key_system_name_for_uma;
-  }
-
-  // Clear Key is always supported.
-  key_system_name_for_uma_map_[kClearKeyKeySystem] =
-      kClearKeyKeySystemNameForUMA;
-}
-
-void KeySystemsImpl::UpdateIfNeeded() {
-  if (GetMediaClient() && GetMediaClient()->IsKeySystemsUpdateNeeded())
-    UpdateSupportedKeySystems();
-}
-
-void KeySystemsImpl::UpdateSupportedKeySystems() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  key_system_properties_map_.clear();
-
-  std::vector<std::unique_ptr<KeySystemProperties>> key_systems_properties;
-
-  // Add key systems supported by the MediaClient implementation.
-  if (GetMediaClient())
-    GetMediaClient()->AddSupportedKeySystems(&key_systems_properties);
-
-  // Clear Key is always supported.
-  key_systems_properties.emplace_back(new ClearKeyProperties());
-
-  AddSupportedKeySystems(&key_systems_properties);
-}
-
-void KeySystemsImpl::AddSupportedKeySystems(
-    std::vector<std::unique_ptr<KeySystemProperties>>* key_systems) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(key_system_properties_map_.empty());
-
-  for (auto& properties : *key_systems) {
-    DCHECK(!properties->GetKeySystemName().empty());
-    DCHECK(properties->GetPersistentLicenseSessionSupport() !=
-           EmeSessionTypeSupport::INVALID);
-    DCHECK(properties->GetPersistentReleaseMessageSessionSupport() !=
-           EmeSessionTypeSupport::INVALID);
-    DCHECK(properties->GetPersistentStateSupport() !=
-           EmeFeatureSupport::INVALID);
-    DCHECK(properties->GetDistinctiveIdentifierSupport() !=
-           EmeFeatureSupport::INVALID);
-
-    if (!IsPotentiallySupportedKeySystem(properties->GetKeySystemName())) {
-      // If you encounter this path, see the comments for the function above.
-      DLOG(ERROR) << "Unsupported name '" << properties->GetKeySystemName()
-                  << "'. See code comments.";
-      continue;
-    }
-
-    // Supporting persistent state is a prerequisite for supporting persistent
-    // sessions.
-    if (properties->GetPersistentStateSupport() ==
-        EmeFeatureSupport::NOT_SUPPORTED) {
-      DCHECK(properties->GetPersistentLicenseSessionSupport() ==
-             EmeSessionTypeSupport::NOT_SUPPORTED);
-      DCHECK(properties->GetPersistentReleaseMessageSessionSupport() ==
-             EmeSessionTypeSupport::NOT_SUPPORTED);
-    }
-
-    // persistent-release-message sessions are not currently supported.
-    // http://crbug.com/448888
-    DCHECK(properties->GetPersistentReleaseMessageSessionSupport() ==
-           EmeSessionTypeSupport::NOT_SUPPORTED);
-
-    // If distinctive identifiers are not supported, then no other features can
-    // require them.
-    if (properties->GetDistinctiveIdentifierSupport() ==
-        EmeFeatureSupport::NOT_SUPPORTED) {
-      DCHECK(properties->GetPersistentLicenseSessionSupport() !=
-             EmeSessionTypeSupport::SUPPORTED_WITH_IDENTIFIER);
-      DCHECK(properties->GetPersistentReleaseMessageSessionSupport() !=
-             EmeSessionTypeSupport::SUPPORTED_WITH_IDENTIFIER);
-    }
-
-    // Distinctive identifiers and persistent state can only be reliably blocked
-    // (and therefore be safely configurable) for Pepper-hosted key systems. For
-    // other platforms assume the CDM can and will do anything, except for the
-    // following two cases:
-    // 1) AES decryptor, and
-    // 2) External Clear Key key system on Android, only enabled for testing.
-    bool can_block = properties->UseAesDecryptor();
-#if defined(ENABLE_PEPPER_CDMS)
-    DCHECK_EQ(properties->UseAesDecryptor(),
-              properties->GetPepperType().empty());
-    if (!properties->GetPepperType().empty()) can_block = true;
-#elif defined(OS_ANDROID)
-    if (IsExternalClearKey(properties->GetKeySystemName())) can_block = true;
-#endif
-    if (!can_block) {
-      DCHECK(properties->GetDistinctiveIdentifierSupport() ==
-             EmeFeatureSupport::ALWAYS_ENABLED);
-      DCHECK(properties->GetPersistentStateSupport() ==
-             EmeFeatureSupport::ALWAYS_ENABLED);
-    }
-
-    DCHECK_EQ(key_system_properties_map_.count(properties->GetKeySystemName()),
-              0u)
-        << "Key system '" << properties->GetKeySystemName()
-        << "' already registered";
-
-#if defined(OS_ANDROID)
-    // Ensure that the renderer can access the decoders necessary to use the
-    // key system.
-    if (!properties->UseAesDecryptor() && !ArePlatformDecodersAvailable()) {
-      DLOG(WARNING) << properties->GetKeySystemName() << " not registered";
-      continue;
-    }
-#endif  // defined(OS_ANDROID)
-
-    key_system_properties_map_[properties->GetKeySystemName()] =
-        std::move(properties);
-  }
-}
-
-// Adds the MIME type with the codec mask after verifying the validity.
-// Only this function should modify |mime_type_to_codec_mask_map_|.
-void KeySystemsImpl::RegisterMimeType(const std::string& mime_type,
-                                      EmeCodec codecs_mask) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(!mime_type_to_codec_mask_map_.count(mime_type));
-  DCHECK(IsValidMimeTypeCodecsCombination(mime_type, codecs_mask));
-
-  mime_type_to_codec_mask_map_[mime_type] = static_cast<EmeCodec>(codecs_mask);
-}
-
-// Returns whether |mime_type| follows a valid format and the specified codecs
-// are of the correct type based on |*_codec_mask_|.
-// Only audio/ or video/ MIME types with their respective codecs are allowed.
-bool KeySystemsImpl::IsValidMimeTypeCodecsCombination(
-    const std::string& mime_type, SupportedCodecs codecs_mask) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  if (!codecs_mask) return false;
-  if (base::StartsWith(mime_type, "audio/", base::CompareCase::SENSITIVE))
-    return !(codecs_mask & ~audio_codec_mask_);
-  if (base::StartsWith(mime_type, "video/", base::CompareCase::SENSITIVE))
-    return !(codecs_mask & ~video_codec_mask_);
-
-  return false;
-}
-
-bool KeySystemsImpl::IsSupportedInitDataType(
-    const std::string& key_system, EmeInitDataType init_data_type) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  KeySystemPropertiesMap::const_iterator key_system_iter =
-      key_system_properties_map_.find(key_system);
-  if (key_system_iter == key_system_properties_map_.end()) {
-    NOTREACHED();
-    return false;
-  }
-  return key_system_iter->second->IsSupportedInitDataType(init_data_type);
-}
-
-std::string KeySystemsImpl::GetKeySystemNameForUMA(
-    const std::string& key_system) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  KeySystemNameForUMAMap::const_iterator iter =
-      key_system_name_for_uma_map_.find(key_system);
-  if (iter == key_system_name_for_uma_map_.end())
-    return kUnknownKeySystemNameForUMA;
-
-  return iter->second;
-}
-
-bool KeySystemsImpl::UseAesDecryptor(const std::string& key_system) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  KeySystemPropertiesMap::const_iterator key_system_iter =
-      key_system_properties_map_.find(key_system);
-  if (key_system_iter == key_system_properties_map_.end()) {
-    DLOG(ERROR) << key_system << " is not a known system";
-    return false;
-  }
-  return key_system_iter->second->UseAesDecryptor();
-}
-
-#if defined(ENABLE_PEPPER_CDMS)
-std::string KeySystemsImpl::GetPepperType(const std::string& key_system) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  KeySystemPropertiesMap::const_iterator key_system_iter =
-      key_system_properties_map_.find(key_system);
-  if (key_system_iter == key_system_properties_map_.end()) {
-    DLOG(FATAL) << key_system << " is not a known system";
-    return std::string();
-  }
-  const std::string& type = key_system_iter->second->GetPepperType();
-  DLOG_IF(FATAL, type.empty())
-      << key_system_iter->second->GetKeySystemName() << " is not Pepper-based";
-  return type;
-}
-
-#endif
-
-void KeySystemsImpl::AddCodecMask(EmeMediaType media_type,
-                                  const std::string& codec, uint32_t mask) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(!codec_string_map_.count(codec));
-  codec_string_map_[codec] = static_cast<EmeCodec>(mask);
-  if (media_type == EmeMediaType::AUDIO) {
-    audio_codec_mask_ |= mask;
-  } else {
-    video_codec_mask_ |= mask;
-  }
-}
-
-void KeySystemsImpl::AddMimeTypeCodecMask(const std::string& mime_type,
-                                          uint32_t codecs_mask) {
-  RegisterMimeType(mime_type, static_cast<EmeCodec>(codecs_mask));
-}
-
-bool KeySystemsImpl::IsSupportedKeySystem(const std::string& key_system) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  if (!key_system_properties_map_.count(key_system)) return false;
-
-  return true;
-}
-
-EmeConfigRule KeySystemsImpl::GetContentTypeConfigRule(
-    const std::string& key_system, EmeMediaType media_type,
-    const std::string& container_mime_type,
-    const std::vector<std::string>& codecs) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  // Make sure the container MIME type matches |media_type|.
-  switch (media_type) {
-    case EmeMediaType::AUDIO:
-      if (!base::StartsWith(container_mime_type, "audio/",
-                            base::CompareCase::SENSITIVE))
-        return EmeConfigRule::NOT_SUPPORTED;
-      break;
-    case EmeMediaType::VIDEO:
-      if (!base::StartsWith(container_mime_type, "video/",
-                            base::CompareCase::SENSITIVE))
-        return EmeConfigRule::NOT_SUPPORTED;
-      break;
-  }
-
-  // Look up the key system's supported codecs.
-  KeySystemPropertiesMap::const_iterator key_system_iter =
-      key_system_properties_map_.find(key_system);
-  if (key_system_iter == key_system_properties_map_.end()) {
-    NOTREACHED();
-    return EmeConfigRule::NOT_SUPPORTED;
-  }
-
-  SupportedCodecs key_system_codec_mask =
-      key_system_iter->second->GetSupportedCodecs();
-#if defined(OS_ANDROID)
-  SupportedCodecs key_system_secure_codec_mask =
-      key_system_iter->second->GetSupportedSecureCodecs();
-#endif  // defined(OS_ANDROID)
-
-  // Check that the container is supported by the key system. (This check is
-  // necessary because |codecs| may be empty.)
-  SupportedCodecs mime_type_codec_mask =
-      GetCodecMaskForMimeType(container_mime_type);
-  if ((key_system_codec_mask & mime_type_codec_mask) == 0)
-    return EmeConfigRule::NOT_SUPPORTED;
-
-  // Check that the codecs are supported by the key system and container.
-  EmeConfigRule support = EmeConfigRule::SUPPORTED;
-  for (size_t i = 0; i < codecs.size(); i++) {
-    SupportedCodecs codec = GetCodecForString(codecs[i]);
-    if ((codec & key_system_codec_mask & mime_type_codec_mask) == 0)
-      return EmeConfigRule::NOT_SUPPORTED;
-#if defined(OS_ANDROID)
-    // Check whether the codec supports a hardware-secure mode. The goal is to
-    // prevent mixing of non-hardware-secure codecs with hardware-secure codecs,
-    // since the mode is fixed at CDM creation.
-    //
-    // Because the check for regular codec support is early-exit, we don't have
-    // to consider codecs that are only supported in hardware-secure mode. We
-    // could do so, and make use of HW_SECURE_CODECS_REQUIRED, if it turns out
-    // that hardware-secure-only codecs actually exist and are useful.
-    if ((codec & key_system_secure_codec_mask) == 0)
-      support = EmeConfigRule::HW_SECURE_CODECS_NOT_ALLOWED;
-#endif  // defined(OS_ANDROID)
-  }
-
-  return support;
-}
-
-EmeConfigRule KeySystemsImpl::GetRobustnessConfigRule(
-    const std::string& key_system, EmeMediaType media_type,
-    const std::string& requested_robustness) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  KeySystemPropertiesMap::const_iterator key_system_iter =
-      key_system_properties_map_.find(key_system);
-  if (key_system_iter == key_system_properties_map_.end()) {
-    NOTREACHED();
-    return EmeConfigRule::NOT_SUPPORTED;
-  }
-  return key_system_iter->second->GetRobustnessConfigRule(media_type,
-                                                          requested_robustness);
-}
-
-EmeSessionTypeSupport KeySystemsImpl::GetPersistentLicenseSessionSupport(
-    const std::string& key_system) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  KeySystemPropertiesMap::const_iterator key_system_iter =
-      key_system_properties_map_.find(key_system);
-  if (key_system_iter == key_system_properties_map_.end()) {
-    NOTREACHED();
-    return EmeSessionTypeSupport::INVALID;
-  }
-  return key_system_iter->second->GetPersistentLicenseSessionSupport();
-}
-
-EmeSessionTypeSupport KeySystemsImpl::GetPersistentReleaseMessageSessionSupport(
-    const std::string& key_system) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  KeySystemPropertiesMap::const_iterator key_system_iter =
-      key_system_properties_map_.find(key_system);
-  if (key_system_iter == key_system_properties_map_.end()) {
-    NOTREACHED();
-    return EmeSessionTypeSupport::INVALID;
-  }
-  return key_system_iter->second->GetPersistentReleaseMessageSessionSupport();
-}
-
-EmeFeatureSupport KeySystemsImpl::GetPersistentStateSupport(
-    const std::string& key_system) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  KeySystemPropertiesMap::const_iterator key_system_iter =
-      key_system_properties_map_.find(key_system);
-  if (key_system_iter == key_system_properties_map_.end()) {
-    NOTREACHED();
-    return EmeFeatureSupport::INVALID;
-  }
-  return key_system_iter->second->GetPersistentStateSupport();
-}
-
-EmeFeatureSupport KeySystemsImpl::GetDistinctiveIdentifierSupport(
-    const std::string& key_system) const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  KeySystemPropertiesMap::const_iterator key_system_iter =
-      key_system_properties_map_.find(key_system);
-  if (key_system_iter == key_system_properties_map_.end()) {
-    NOTREACHED();
-    return EmeFeatureSupport::INVALID;
-  }
-  return key_system_iter->second->GetDistinctiveIdentifierSupport();
-}
-
-KeySystems* KeySystems::GetInstance() { return KeySystemsImpl::GetInstance(); }
-
-//------------------------------------------------------------------------------
-
-bool IsSupportedKeySystemWithInitDataType(const std::string& key_system,
-                                          EmeInitDataType init_data_type) {
-  return KeySystemsImpl::GetInstance()->IsSupportedInitDataType(key_system,
-                                                                init_data_type);
-}
-
-std::string GetKeySystemNameForUMA(const std::string& key_system) {
-  return KeySystemsImpl::GetInstance()->GetKeySystemNameForUMA(key_system);
-}
-
-bool CanUseAesDecryptor(const std::string& key_system) {
-  return KeySystemsImpl::GetInstance()->UseAesDecryptor(key_system);
-}
-
-#if defined(ENABLE_PEPPER_CDMS)
-std::string GetPepperType(const std::string& key_system) {
-  return KeySystemsImpl::GetInstance()->GetPepperType(key_system);
-}
-#endif
-
-// These two functions are for testing purpose only. The declaration in the
-// header file is guarded by "#if defined(UNIT_TEST)" so that they can be used
-// by tests but not non-test code. However, this .cc file is compiled as part of
-// "media" where "UNIT_TEST" is not defined. So we need to specify
-// "MEDIA_EXPORT" here again so that they are visible to tests.
-
-MEDIA_EXPORT void AddCodecMask(EmeMediaType media_type,
-                               const std::string& codec, uint32_t mask) {
-  KeySystemsImpl::GetInstance()->AddCodecMask(media_type, codec, mask);
-}
-
-MEDIA_EXPORT void AddMimeTypeCodecMask(const std::string& mime_type,
-                                       uint32_t mask) {
-  KeySystemsImpl::GetInstance()->AddMimeTypeCodecMask(mime_type, mask);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/key_systems.h b/cobalt/media/base/key_systems.h
deleted file mode 100644
index 05cfcfd..0000000
--- a/cobalt/media/base/key_systems.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_KEY_SYSTEMS_H_
-#define COBALT_MEDIA_BASE_KEY_SYSTEMS_H_
-
-#include <string>
-#include <vector>
-
-#include "cobalt/media/base/eme_constants.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Provides an interface for querying registered key systems.
-//
-// Many of the original static methods are still available, they should be
-// migrated into this interface over time (or removed).
-//
-// TODO(sandersd): Provide GetKeySystem() so that it is not necessary to pass
-// |key_system| to every method. http://crbug.com/457438
-class MEDIA_EXPORT KeySystems {
- public:
-  static KeySystems* GetInstance();
-
-  // Returns whether |key_system| is a supported key system.
-  virtual bool IsSupportedKeySystem(const std::string& key_system) const = 0;
-
-  // Returns whether |init_data_type| is supported by |key_system|.
-  virtual bool IsSupportedInitDataType(
-      const std::string& key_system, EmeInitDataType init_data_type) const = 0;
-
-  // Returns the configuration rule for supporting a container and list of
-  // codecs.
-  virtual EmeConfigRule GetContentTypeConfigRule(
-      const std::string& key_system, EmeMediaType media_type,
-      const std::string& container_mime_type,
-      const std::vector<std::string>& codecs) const = 0;
-
-  // Returns the configuration rule for supporting a robustness requirement.
-  virtual EmeConfigRule GetRobustnessConfigRule(
-      const std::string& key_system, EmeMediaType media_type,
-      const std::string& requested_robustness) const = 0;
-
-  // Returns the support |key_system| provides for persistent-license sessions.
-  virtual EmeSessionTypeSupport GetPersistentLicenseSessionSupport(
-      const std::string& key_system) const = 0;
-
-  // Returns the support |key_system| provides for persistent-release-message
-  // sessions.
-  virtual EmeSessionTypeSupport GetPersistentReleaseMessageSessionSupport(
-      const std::string& key_system) const = 0;
-
-  // Returns the support |key_system| provides for persistent state.
-  virtual EmeFeatureSupport GetPersistentStateSupport(
-      const std::string& key_system) const = 0;
-
-  // Returns the support |key_system| provides for distinctive identifiers.
-  virtual EmeFeatureSupport GetDistinctiveIdentifierSupport(
-      const std::string& key_system) const = 0;
-
- protected:
-  virtual ~KeySystems() {}
-};
-
-// TODO(ddorwin): WebContentDecryptionModuleSessionImpl::initializeNewSession()
-// is violating this rule! https://crbug.com/249976.
-// Use for prefixed EME only!
-MEDIA_EXPORT bool IsSupportedKeySystemWithInitDataType(
-    const std::string& key_system, EmeInitDataType init_data_type);
-
-// Returns a name for |key_system| suitable to UMA logging.
-MEDIA_EXPORT std::string GetKeySystemNameForUMA(const std::string& key_system);
-
-// Returns whether AesDecryptor can be used for the given |key_system|.
-MEDIA_EXPORT bool CanUseAesDecryptor(const std::string& key_system);
-
-#if defined(ENABLE_PEPPER_CDMS)
-// Returns the Pepper MIME type for |key_system|.
-// Returns empty string if |key_system| is unknown or not Pepper-based.
-MEDIA_EXPORT std::string GetPepperType(const std::string& key_system);
-#endif
-
-#if defined(UNIT_TEST)
-// Helper functions to add container/codec types for testing purposes.
-// Call AddCodecMask() first to ensure the mask values passed to
-// AddMimeTypeCodecMask() already exist.
-MEDIA_EXPORT void AddCodecMask(EmeMediaType media_type,
-                               const std::string& codec, uint32_t mask);
-MEDIA_EXPORT void AddMimeTypeCodecMask(const std::string& mime_type,
-                                       uint32_t mask);
-#endif  // defined(UNIT_TEST)
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_KEY_SYSTEMS_H_
diff --git a/cobalt/media/base/key_systems_unittest.cc b/cobalt/media/base/key_systems_unittest.cc
deleted file mode 100644
index 485aba3..0000000
--- a/cobalt/media/base/key_systems_unittest.cc
+++ /dev/null
@@ -1,769 +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.
-
-// TODO(sandersd): Refactor to remove recomputed codec arrays, and generally
-// shorten and improve coverage.
-//   - http://crbug.com/417444
-//   - http://crbug.com/457438
-// TODO(sandersd): Add tests to cover codec vectors with empty items.
-// http://crbug.com/417461
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/logging.h"
-#include "cobalt/media/base/eme_constants.h"
-#include "cobalt/media/base/key_systems.h"
-#include "cobalt/media/base/media.h"
-#include "cobalt/media/base/media_client.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-// These are the (fake) key systems that are registered for these tests.
-// kUsesAes uses the AesDecryptor like Clear Key.
-// kExternal uses an external CDM, such as Pepper-based or Android platform CDM.
-const char kUsesAes[] = "x-org.example.clear";
-const char kUseAesNameForUMA[] = "UseAes";
-const char kExternal[] = "x-com.example.test";
-const char kExternalNameForUMA[] = "External";
-
-const char kClearKey[] = "org.w3.clearkey";
-const char kExternalClearKey[] = "org.chromium.externalclearkey";
-
-const char kAudioWebM[] = "audio/webm";
-const char kVideoWebM[] = "video/webm";
-const char kAudioFoo[] = "audio/foo";
-const char kVideoFoo[] = "video/foo";
-
-// Pick some arbitrary bit fields as long as they are not in conflict with the
-// real ones.
-enum TestCodec {
-  TEST_CODEC_FOO_AUDIO = 1 << 10,  // An audio codec for foo container.
-  TEST_CODEC_FOO_AUDIO_ALL = TEST_CODEC_FOO_AUDIO,
-  TEST_CODEC_FOO_VIDEO = 1 << 11,  // A video codec for foo container.
-  TEST_CODEC_FOO_VIDEO_ALL = TEST_CODEC_FOO_VIDEO,
-  TEST_CODEC_FOO_ALL = TEST_CODEC_FOO_AUDIO_ALL | TEST_CODEC_FOO_VIDEO_ALL
-};
-
-static_assert((TEST_CODEC_FOO_ALL & EME_CODEC_ALL) == EME_CODEC_NONE,
-              "test codec masks should only use invalid codec masks");
-
-class TestKeySystemProperties : public KeySystemProperties {
- public:
-  bool IsSupportedInitDataType(EmeInitDataType init_data_type) const override {
-    return init_data_type == EmeInitDataType::WEBM;
-  }
-  SupportedCodecs GetSupportedCodecs() const override {
-    return EME_CODEC_WEBM_ALL | TEST_CODEC_FOO_ALL;
-  }
-  EmeConfigRule GetRobustnessConfigRule(
-      EmeMediaType media_type,
-      const std::string& requested_robustness) const override {
-    return requested_robustness.empty() ? EmeConfigRule::SUPPORTED
-                                        : EmeConfigRule::NOT_SUPPORTED;
-  }
-  EmeSessionTypeSupport GetPersistentReleaseMessageSessionSupport()
-      const override {
-    return EmeSessionTypeSupport::NOT_SUPPORTED;
-  }
-};
-
-class AesKeySystemProperties : public TestKeySystemProperties {
- public:
-  explicit AesKeySystemProperties(const std::string& name) : name_(name) {}
-
-  std::string GetKeySystemName() const override { return name_; }
-  EmeSessionTypeSupport GetPersistentLicenseSessionSupport() const override {
-    return EmeSessionTypeSupport::NOT_SUPPORTED;
-  }
-  EmeFeatureSupport GetPersistentStateSupport() const override {
-    return EmeFeatureSupport::NOT_SUPPORTED;
-  }
-  EmeFeatureSupport GetDistinctiveIdentifierSupport() const override {
-    return EmeFeatureSupport::NOT_SUPPORTED;
-  }
-  bool UseAesDecryptor() const override { return true; }
-
- private:
-  std::string name_;
-};
-
-class ExternalKeySystemProperties : public TestKeySystemProperties {
- public:
-  std::string GetKeySystemName() const override { return kExternal; }
-  EmeSessionTypeSupport GetPersistentLicenseSessionSupport() const override {
-    return EmeSessionTypeSupport::SUPPORTED;
-  }
-  EmeFeatureSupport GetPersistentStateSupport() const override {
-    return EmeFeatureSupport::ALWAYS_ENABLED;
-  }
-  EmeFeatureSupport GetDistinctiveIdentifierSupport() const override {
-    return EmeFeatureSupport::ALWAYS_ENABLED;
-  }
-  std::string GetPepperType() const override {
-    return "application/x-ppapi-external-cdm";
-  }
-};
-
-// Adapt IsSupportedKeySystemWithMediaMimeType() to the new API,
-// IsSupportedCodecCombination().
-static bool IsSupportedKeySystemWithMediaMimeType(
-    const std::string& mime_type, const std::vector<std::string>& codecs,
-    const std::string& key_system) {
-  return (KeySystems::GetInstance()->GetContentTypeConfigRule(
-              key_system, EmeMediaType::VIDEO, mime_type, codecs) !=
-          EmeConfigRule::NOT_SUPPORTED);
-}
-
-static bool IsSupportedKeySystemWithAudioMimeType(
-    const std::string& mime_type, const std::vector<std::string>& codecs,
-    const std::string& key_system) {
-  return (KeySystems::GetInstance()->GetContentTypeConfigRule(
-              key_system, EmeMediaType::AUDIO, mime_type, codecs) !=
-          EmeConfigRule::NOT_SUPPORTED);
-}
-
-static bool IsSupportedKeySystem(const std::string& key_system) {
-  return KeySystems::GetInstance()->IsSupportedKeySystem(key_system);
-}
-
-// Adds test container and codec masks.
-// This function must be called after SetMediaClient() if a MediaClient will be
-// provided.
-// More details: AddXxxMask() will create KeySystems if it hasn't been created.
-// During KeySystems's construction GetMediaClient() will be used to add key
-// systems. In test code, the MediaClient is set by SetMediaClient().
-// Therefore, SetMediaClient() must be called before this function to make sure
-// MediaClient in effect when constructing KeySystems.
-static void AddContainerAndCodecMasksForTest() {
-  // Since KeySystems is a singleton. Make sure we only add test container and
-  // codec masks once per process.
-  static bool is_test_masks_added = false;
-
-  if (is_test_masks_added) return;
-
-  AddCodecMask(EmeMediaType::AUDIO, "fooaudio", TEST_CODEC_FOO_AUDIO);
-  AddCodecMask(EmeMediaType::VIDEO, "foovideo", TEST_CODEC_FOO_VIDEO);
-  AddMimeTypeCodecMask("audio/foo", TEST_CODEC_FOO_AUDIO_ALL);
-  AddMimeTypeCodecMask("video/foo", TEST_CODEC_FOO_VIDEO_ALL);
-
-  is_test_masks_added = true;
-}
-
-static bool CanRunExternalKeySystemTests() {
-#if defined(OS_ANDROID)
-  if (HasPlatformDecoderSupport()) return true;
-
-  EXPECT_FALSE(IsSupportedKeySystem(kExternal));
-  return false;
-#else
-  return true;
-#endif
-}
-
-class TestMediaClient : public MediaClient {
- public:
-  TestMediaClient();
-  ~TestMediaClient() override;
-
-  // MediaClient implementation.
-  void AddKeySystemsInfoForUMA(
-      std::vector<KeySystemInfoForUMA>* key_systems_info_for_uma) final;
-  bool IsKeySystemsUpdateNeeded() final;
-  void AddSupportedKeySystems(std::vector<std::unique_ptr<KeySystemProperties>>*
-                                  key_systems_properties) override;
-  void RecordRapporURL(const std::string& metric, const GURL& url) final;
-  bool IsSupportedVideoConfig(media::VideoCodec codec,
-                              media::VideoCodecProfile profile,
-                              int level) final;
-
-  // Helper function to test the case where IsKeySystemsUpdateNeeded() is true
-  // after AddSupportedKeySystems() is called.
-  void SetKeySystemsUpdateNeeded();
-
-  // Helper function to disable "kExternal" key system support so that we can
-  // test the key system update case.
-  void DisableExternalKeySystemSupport();
-
- private:
-  bool is_update_needed_;
-  bool supports_external_key_system_;
-};
-
-TestMediaClient::TestMediaClient()
-    : is_update_needed_(true), supports_external_key_system_(true) {}
-
-TestMediaClient::~TestMediaClient() {}
-
-void TestMediaClient::AddKeySystemsInfoForUMA(
-    std::vector<KeySystemInfoForUMA>* key_systems_info_for_uma) {
-  key_systems_info_for_uma->push_back(
-      media::KeySystemInfoForUMA(kUsesAes, kUseAesNameForUMA));
-  key_systems_info_for_uma->push_back(
-      media::KeySystemInfoForUMA(kExternal, kExternalNameForUMA));
-}
-
-bool TestMediaClient::IsKeySystemsUpdateNeeded() { return is_update_needed_; }
-
-void TestMediaClient::AddSupportedKeySystems(
-    std::vector<std::unique_ptr<KeySystemProperties>>* key_systems) {
-  DCHECK(is_update_needed_);
-
-  key_systems->emplace_back(new AesKeySystemProperties(kUsesAes));
-
-  if (supports_external_key_system_)
-    key_systems->emplace_back(new ExternalKeySystemProperties());
-
-  is_update_needed_ = false;
-}
-
-void TestMediaClient::RecordRapporURL(const std::string& metric,
-                                      const GURL& url) {
-  NOTIMPLEMENTED();
-}
-
-bool TestMediaClient::IsSupportedVideoConfig(media::VideoCodec codec,
-                                             media::VideoCodecProfile profile,
-                                             int level) {
-  return true;
-}
-
-void TestMediaClient::SetKeySystemsUpdateNeeded() { is_update_needed_ = true; }
-
-void TestMediaClient::DisableExternalKeySystemSupport() {
-  supports_external_key_system_ = false;
-}
-
-class PotentiallySupportedNamesTestMediaClient : public TestMediaClient {
-  void AddSupportedKeySystems(std::vector<std::unique_ptr<KeySystemProperties>>*
-                                  key_systems_properties) final;
-};
-
-void PotentiallySupportedNamesTestMediaClient::AddSupportedKeySystems(
-    std::vector<std::unique_ptr<KeySystemProperties>>* key_systems) {
-  // org.w3.clearkey is automatically registered.
-  key_systems->emplace_back(new AesKeySystemProperties("com.widevine.alpha"));
-  key_systems->emplace_back(
-      new AesKeySystemProperties("org.chromium.externalclearkey"));
-  key_systems->emplace_back(
-      new AesKeySystemProperties("org.chromium.externalclearkey.something"));
-  key_systems->emplace_back(
-      new AesKeySystemProperties("com.chromecast.something"));
-  key_systems->emplace_back(new AesKeySystemProperties("x-something"));
-}
-
-class KeySystemsPotentiallySupportedNamesTest : public testing::Test {
- protected:
-  KeySystemsPotentiallySupportedNamesTest() {
-    SetMediaClient(&test_media_client_);
-  }
-
-  ~KeySystemsPotentiallySupportedNamesTest() override {
-    // Clear the use of |test_media_client_|, which was set in SetUp().
-    SetMediaClient(NULL);
-  }
-
- private:
-  PotentiallySupportedNamesTestMediaClient test_media_client_;
-};
-
-class KeySystemsTest : public testing::Test {
- protected:
-  KeySystemsTest() {
-    vp8_codec_.push_back("vp8");
-
-    vp80_codec_.push_back("vp8.0");
-
-    vp9_codec_.push_back("vp9");
-
-    vp90_codec_.push_back("vp9.0");
-
-    vorbis_codec_.push_back("vorbis");
-
-    vp8_and_vorbis_codecs_.push_back("vp8");
-    vp8_and_vorbis_codecs_.push_back("vorbis");
-
-    vp9_and_vorbis_codecs_.push_back("vp9");
-    vp9_and_vorbis_codecs_.push_back("vorbis");
-
-    foovideo_codec_.push_back("foovideo");
-
-    foovideo_extended_codec_.push_back("foovideo.4D400C");
-
-    foovideo_dot_codec_.push_back("foovideo.");
-
-    fooaudio_codec_.push_back("fooaudio");
-
-    foovideo_and_fooaudio_codecs_.push_back("foovideo");
-    foovideo_and_fooaudio_codecs_.push_back("fooaudio");
-
-    unknown_codec_.push_back("unknown");
-
-    mixed_codecs_.push_back("vorbis");
-    mixed_codecs_.push_back("foovideo");
-
-    SetMediaClient(&test_media_client_);
-  }
-
-  void SetUp() override { AddContainerAndCodecMasksForTest(); }
-
-  ~KeySystemsTest() override {
-    // Clear the use of |test_media_client_|, which was set in SetUp().
-    SetMediaClient(NULL);
-  }
-
-  void UpdateClientKeySystems() {
-    test_media_client_.SetKeySystemsUpdateNeeded();
-    test_media_client_.DisableExternalKeySystemSupport();
-  }
-
-  typedef std::vector<std::string> CodecVector;
-
-  const CodecVector& no_codecs() const { return no_codecs_; }
-
-  const CodecVector& vp8_codec() const { return vp8_codec_; }
-  const CodecVector& vp80_codec() const { return vp80_codec_; }
-  const CodecVector& vp9_codec() const { return vp9_codec_; }
-  const CodecVector& vp90_codec() const { return vp90_codec_; }
-
-  const CodecVector& vorbis_codec() const { return vorbis_codec_; }
-
-  const CodecVector& vp8_and_vorbis_codecs() const {
-    return vp8_and_vorbis_codecs_;
-  }
-  const CodecVector& vp9_and_vorbis_codecs() const {
-    return vp9_and_vorbis_codecs_;
-  }
-
-  const CodecVector& foovideo_codec() const { return foovideo_codec_; }
-  const CodecVector& foovideo_extended_codec() const {
-    return foovideo_extended_codec_;
-  }
-  const CodecVector& foovideo_dot_codec() const { return foovideo_dot_codec_; }
-  const CodecVector& fooaudio_codec() const { return fooaudio_codec_; }
-  const CodecVector& foovideo_and_fooaudio_codecs() const {
-    return foovideo_and_fooaudio_codecs_;
-  }
-
-  const CodecVector& unknown_codec() const { return unknown_codec_; }
-
-  const CodecVector& mixed_codecs() const { return mixed_codecs_; }
-
- private:
-  const CodecVector no_codecs_;
-  CodecVector vp8_codec_;
-  CodecVector vp80_codec_;
-  CodecVector vp9_codec_;
-  CodecVector vp90_codec_;
-  CodecVector vorbis_codec_;
-  CodecVector vp8_and_vorbis_codecs_;
-  CodecVector vp9_and_vorbis_codecs_;
-
-  CodecVector foovideo_codec_;
-  CodecVector foovideo_extended_codec_;
-  CodecVector foovideo_dot_codec_;
-  CodecVector fooaudio_codec_;
-  CodecVector foovideo_and_fooaudio_codecs_;
-
-  CodecVector unknown_codec_;
-
-  CodecVector mixed_codecs_;
-
-  TestMediaClient test_media_client_;
-};
-
-// TODO(ddorwin): Consider moving GetPepperType() calls out to their own test.
-
-TEST_F(KeySystemsTest, EmptyKeySystem) {
-  EXPECT_FALSE(IsSupportedKeySystem(std::string()));
-  EXPECT_EQ("Unknown", GetKeySystemNameForUMA(std::string()));
-}
-
-// Clear Key is the only key system registered in content.
-TEST_F(KeySystemsTest, ClearKey) {
-  EXPECT_TRUE(IsSupportedKeySystem(kClearKey));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, no_codecs(),
-                                                    kClearKey));
-
-  EXPECT_EQ("ClearKey", GetKeySystemNameForUMA(kClearKey));
-}
-
-TEST_F(KeySystemsTest, ClearKeyWithInitDataType) {
-  EXPECT_TRUE(IsSupportedKeySystem(kClearKey));
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithInitDataType(kClearKey, EmeInitDataType::WEBM));
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithInitDataType(kClearKey, EmeInitDataType::KEYIDS));
-
-  // All other InitDataTypes are not supported.
-  EXPECT_FALSE(IsSupportedKeySystemWithInitDataType(kClearKey,
-                                                    EmeInitDataType::UNKNOWN));
-}
-
-// The key system is not registered and therefore is unrecognized.
-TEST_F(KeySystemsTest, Basic_UnrecognizedKeySystem) {
-  static const char* const kUnrecognized = "x-org.example.unrecognized";
-
-  EXPECT_FALSE(IsSupportedKeySystem(kUnrecognized));
-
-  EXPECT_EQ("Unknown", GetKeySystemNameForUMA(kUnrecognized));
-  EXPECT_FALSE(CanUseAesDecryptor(kUnrecognized));
-
-#if defined(ENABLE_PEPPER_CDMS)
-  std::string type;
-#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-  EXPECT_DEATH(type = GetPepperType(kUnrecognized),
-               "x-org.example.unrecognized is not a known system");
-#endif
-  EXPECT_TRUE(type.empty());
-#endif
-}
-
-TEST_F(KeySystemsTest, Basic_UsesAesDecryptor) {
-  EXPECT_TRUE(IsSupportedKeySystem(kUsesAes));
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithMediaMimeType(kVideoWebM, no_codecs(), kUsesAes));
-
-  // No UMA value for this test key system.
-  EXPECT_EQ("UseAes", GetKeySystemNameForUMA(kUsesAes));
-
-  EXPECT_TRUE(CanUseAesDecryptor(kUsesAes));
-#if defined(ENABLE_PEPPER_CDMS)
-  std::string type;
-#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-  EXPECT_DEATH(type = GetPepperType(kUsesAes),
-               "x-org.example.clear is not Pepper-based");
-#endif
-  EXPECT_TRUE(type.empty());
-#endif
-}
-
-TEST_F(KeySystemsTest,
-       IsSupportedKeySystemWithMediaMimeType_UsesAesDecryptor_TypesContainer1) {
-  // Valid video types.
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vp8_codec(), kUsesAes));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vp80_codec(),
-                                                    kUsesAes));
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vp9_codec(), kUsesAes));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vp90_codec(),
-                                                    kUsesAes));
-
-  // Audio in a video container.
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoWebM, vp8_and_vorbis_codecs(), kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoWebM, vp9_and_vorbis_codecs(), kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vorbis_codec(),
-                                                     kUsesAes));
-
-  // Non-Webm codecs.
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoWebM, foovideo_codec(), kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoWebM, unknown_codec(), kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, mixed_codecs(),
-                                                     kUsesAes));
-
-  // Valid audio types.
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithAudioMimeType(kAudioWebM, no_codecs(), kUsesAes));
-  EXPECT_TRUE(IsSupportedKeySystemWithAudioMimeType(kAudioWebM, vorbis_codec(),
-                                                    kUsesAes));
-
-  // Non-audio codecs.
-  EXPECT_FALSE(
-      IsSupportedKeySystemWithMediaMimeType(kAudioWebM, vp8_codec(), kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kAudioWebM, vp8_and_vorbis_codecs(), kUsesAes));
-  EXPECT_FALSE(
-      IsSupportedKeySystemWithMediaMimeType(kAudioWebM, vp9_codec(), kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kAudioWebM, vp9_and_vorbis_codecs(), kUsesAes));
-
-  // Non-Webm codec.
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(
-      kAudioWebM, fooaudio_codec(), kUsesAes));
-}
-
-TEST_F(KeySystemsTest, IsSupportedKeySystem_InvalidVariants) {
-  // Case sensitive.
-  EXPECT_FALSE(IsSupportedKeySystem("x-org.example.ClEaR"));
-
-  // TLDs are not allowed.
-  EXPECT_FALSE(IsSupportedKeySystem("org."));
-  EXPECT_FALSE(IsSupportedKeySystem("com"));
-
-  // Extra period.
-  EXPECT_FALSE(IsSupportedKeySystem("x-org.example.clear."));
-
-  // Prefix.
-  EXPECT_FALSE(IsSupportedKeySystem("x-org.example."));
-  EXPECT_FALSE(IsSupportedKeySystem("x-org.example"));
-
-  // Incomplete.
-  EXPECT_FALSE(IsSupportedKeySystem("x-org.example.clea"));
-
-  // Extra character.
-  EXPECT_FALSE(IsSupportedKeySystem("x-org.example.clearz"));
-
-  // There are no child key systems for UsesAes.
-  EXPECT_FALSE(IsSupportedKeySystem("x-org.example.clear.foo"));
-}
-
-TEST_F(KeySystemsTest, IsSupportedKeySystemWithMediaMimeType_NoType) {
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(std::string(), no_codecs(),
-                                                     kUsesAes));
-
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(std::string(), no_codecs(),
-                                                     "x-org.example.foo"));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      std::string(), no_codecs(), "x-org.example.clear.foo"));
-}
-
-// Tests the second registered container type.
-// TODO(ddorwin): Combined with TypesContainer1 in a future CL.
-TEST_F(KeySystemsTest,
-       IsSupportedKeySystemWithMediaMimeType_UsesAesDecryptor_TypesContainer2) {
-  // Valid video types.
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithMediaMimeType(kVideoFoo, no_codecs(), kUsesAes));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoFoo, foovideo_codec(),
-                                                    kUsesAes));
-
-  // Audio in a video container.
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoFoo, foovideo_and_fooaudio_codecs(), kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoFoo, fooaudio_codec(), kUsesAes));
-
-  // Extended codecs fail because this is handled by SimpleWebMimeRegistryImpl.
-  // They should really pass canPlayType().
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoFoo, foovideo_extended_codec(), kUsesAes));
-
-  // Invalid codec format.
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoFoo, foovideo_dot_codec(), kUsesAes));
-
-  // Non-container2 codec.
-  EXPECT_FALSE(
-      IsSupportedKeySystemWithMediaMimeType(kVideoFoo, vp8_codec(), kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(kVideoFoo, unknown_codec(),
-                                                     kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(kVideoFoo, mixed_codecs(),
-                                                     kUsesAes));
-
-  // Valid audio types.
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithAudioMimeType(kAudioFoo, no_codecs(), kUsesAes));
-  EXPECT_TRUE(IsSupportedKeySystemWithAudioMimeType(kAudioFoo, fooaudio_codec(),
-                                                    kUsesAes));
-
-  // Non-audio codecs.
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(
-      kAudioFoo, foovideo_codec(), kUsesAes));
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(
-      kAudioFoo, foovideo_and_fooaudio_codecs(), kUsesAes));
-
-  // Non-container2 codec.
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(kAudioFoo, vorbis_codec(),
-                                                     kUsesAes));
-}
-
-//
-// Non-AesDecryptor-based key system.
-//
-
-TEST_F(KeySystemsTest, Basic_ExternalDecryptor) {
-  if (!CanRunExternalKeySystemTests()) return;
-
-  EXPECT_TRUE(IsSupportedKeySystem(kExternal));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, no_codecs(),
-                                                    kExternal));
-
-  EXPECT_FALSE(CanUseAesDecryptor(kExternal));
-#if defined(ENABLE_PEPPER_CDMS)
-  EXPECT_EQ("application/x-ppapi-external-cdm", GetPepperType(kExternal));
-#endif  // defined(ENABLE_PEPPER_CDMS)
-}
-
-TEST_F(
-    KeySystemsTest,
-    IsSupportedKeySystemWithMediaMimeType_ExternalDecryptor_TypesContainer1) {
-  if (!CanRunExternalKeySystemTests()) return;
-
-  // Valid video types.
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, no_codecs(),
-                                                    kExternal));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vp8_codec(),
-                                                    kExternal));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vp80_codec(),
-                                                    kExternal));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vp9_codec(),
-                                                    kExternal));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vp90_codec(),
-                                                    kExternal));
-
-  // Audio in a video container.
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoWebM, vp8_and_vorbis_codecs(), kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoWebM, vp9_and_vorbis_codecs(), kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, vorbis_codec(),
-                                                     kExternal));
-
-  // Non-Webm codecs.
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoWebM, foovideo_codec(), kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoWebM, unknown_codec(), kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, mixed_codecs(),
-                                                     kExternal));
-
-  // Valid audio types.
-  EXPECT_TRUE(IsSupportedKeySystemWithAudioMimeType(kAudioWebM, no_codecs(),
-                                                    kExternal));
-  EXPECT_TRUE(IsSupportedKeySystemWithAudioMimeType(kAudioWebM, vorbis_codec(),
-                                                    kExternal));
-
-  // Non-audio codecs.
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(kAudioWebM, vp8_codec(),
-                                                     kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(
-      kAudioWebM, vp8_and_vorbis_codecs(), kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(kAudioWebM, vp9_codec(),
-                                                     kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(
-      kAudioWebM, vp9_and_vorbis_codecs(), kExternal));
-
-  // Non-Webm codec.
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(
-      kAudioWebM, fooaudio_codec(), kExternal));
-}
-
-TEST_F(
-    KeySystemsTest,
-    IsSupportedKeySystemWithMediaMimeType_ExternalDecryptor_TypesContainer2) {
-  if (!CanRunExternalKeySystemTests()) return;
-
-  // Valid video types.
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithMediaMimeType(kVideoFoo, no_codecs(), kExternal));
-  EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoFoo, foovideo_codec(),
-                                                    kExternal));
-
-  // Audio in a video container.
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoFoo, foovideo_and_fooaudio_codecs(), kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoFoo, fooaudio_codec(), kExternal));
-
-  // Extended codecs fail because this is handled by SimpleWebMimeRegistryImpl.
-  // They should really pass canPlayType().
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoFoo, foovideo_extended_codec(), kExternal));
-
-  // Invalid codec format.
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(
-      kVideoFoo, foovideo_dot_codec(), kExternal));
-
-  // Non-container2 codecs.
-  EXPECT_FALSE(
-      IsSupportedKeySystemWithMediaMimeType(kVideoFoo, vp8_codec(), kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(kVideoFoo, unknown_codec(),
-                                                     kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType(kVideoFoo, mixed_codecs(),
-                                                     kExternal));
-
-  // Valid audio types.
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithAudioMimeType(kAudioFoo, no_codecs(), kExternal));
-  EXPECT_TRUE(IsSupportedKeySystemWithAudioMimeType(kAudioFoo, fooaudio_codec(),
-                                                    kExternal));
-
-  // Non-audio codecs.
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(
-      kAudioFoo, foovideo_codec(), kExternal));
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(
-      kAudioFoo, foovideo_and_fooaudio_codecs(), kExternal));
-
-  // Non-container2 codec.
-  EXPECT_FALSE(IsSupportedKeySystemWithAudioMimeType(kAudioFoo, vorbis_codec(),
-                                                     kExternal));
-}
-
-TEST_F(KeySystemsTest, KeySystemNameForUMA) {
-  EXPECT_EQ("ClearKey", GetKeySystemNameForUMA(kClearKey));
-
-  // External Clear Key never has a UMA name.
-  if (CanRunExternalKeySystemTests())
-    EXPECT_EQ("Unknown", GetKeySystemNameForUMA(kExternalClearKey));
-}
-
-TEST_F(KeySystemsTest, KeySystemsUpdate) {
-  EXPECT_TRUE(IsSupportedKeySystem(kUsesAes));
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithMediaMimeType(kVideoWebM, no_codecs(), kUsesAes));
-
-  if (CanRunExternalKeySystemTests()) {
-    EXPECT_TRUE(IsSupportedKeySystem(kExternal));
-    EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType(kVideoWebM, no_codecs(),
-                                                      kExternal));
-  }
-
-  UpdateClientKeySystems();
-
-  EXPECT_TRUE(IsSupportedKeySystem(kUsesAes));
-  EXPECT_TRUE(
-      IsSupportedKeySystemWithMediaMimeType(kVideoWebM, no_codecs(), kUsesAes));
-  if (CanRunExternalKeySystemTests())
-    EXPECT_FALSE(IsSupportedKeySystem(kExternal));
-}
-
-TEST_F(KeySystemsPotentiallySupportedNamesTest, PotentiallySupportedNames) {
-  EXPECT_FALSE(IsSupportedKeySystem("org.w3"));
-  EXPECT_FALSE(IsSupportedKeySystem("org.w3."));
-  EXPECT_FALSE(IsSupportedKeySystem("org.w3.clearke"));
-  EXPECT_TRUE(IsSupportedKeySystem("org.w3.clearkey"));
-  EXPECT_FALSE(IsSupportedKeySystem("org.w3.clearkeys"));
-
-  EXPECT_FALSE(IsSupportedKeySystem("com.widevine"));
-  EXPECT_FALSE(IsSupportedKeySystem("com.widevine."));
-  EXPECT_FALSE(IsSupportedKeySystem("com.widevine.alph"));
-  EXPECT_TRUE(IsSupportedKeySystem("com.widevine.alpha"));
-  EXPECT_FALSE(IsSupportedKeySystem("com.widevine.beta"));
-  EXPECT_FALSE(IsSupportedKeySystem("com.widevine.alphabeta"));
-  EXPECT_FALSE(IsSupportedKeySystem("com.widevine.alpha.beta"));
-
-  EXPECT_FALSE(IsSupportedKeySystem("org.chromium"));
-  EXPECT_FALSE(IsSupportedKeySystem("org.chromium."));
-  EXPECT_FALSE(IsSupportedKeySystem("org.chromium.externalclearke"));
-  EXPECT_TRUE(IsSupportedKeySystem("org.chromium.externalclearkey"));
-  EXPECT_FALSE(IsSupportedKeySystem("org.chromium.externalclearkeys"));
-  EXPECT_FALSE(IsSupportedKeySystem("org.chromium.externalclearkey."));
-  EXPECT_TRUE(IsSupportedKeySystem("org.chromium.externalclearkey.something"));
-  EXPECT_FALSE(
-      IsSupportedKeySystem("org.chromium.externalclearkey.something.else"));
-  EXPECT_FALSE(IsSupportedKeySystem("org.chromium.externalclearkey.other"));
-  EXPECT_FALSE(IsSupportedKeySystem("org.chromium.other"));
-
-  EXPECT_FALSE(IsSupportedKeySystem("com.chromecast"));
-  EXPECT_FALSE(IsSupportedKeySystem("com.chromecast."));
-  EXPECT_TRUE(IsSupportedKeySystem("com.chromecast.something"));
-  EXPECT_FALSE(IsSupportedKeySystem("com.chromecast.something.else"));
-  EXPECT_FALSE(IsSupportedKeySystem("com.chromecast.other"));
-
-  EXPECT_FALSE(IsSupportedKeySystem("x-"));
-  EXPECT_TRUE(IsSupportedKeySystem("x-something"));
-  EXPECT_FALSE(IsSupportedKeySystem("x-something.else"));
-  EXPECT_FALSE(IsSupportedKeySystem("x-other"));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/keyboard_event_counter.cc b/cobalt/media/base/keyboard_event_counter.cc
deleted file mode 100644
index 2452d69..0000000
--- a/cobalt/media/base/keyboard_event_counter.cc
+++ /dev/null
@@ -1,43 +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 "cobalt/media/base/keyboard_event_counter.h"
-
-#include "base/atomicops.h"
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-KeyboardEventCounter::KeyboardEventCounter() : total_key_presses_(0) {}
-
-KeyboardEventCounter::~KeyboardEventCounter() {}
-
-void KeyboardEventCounter::Reset() {
-  pressed_keys_.clear();
-  base::subtle::NoBarrier_Store(
-      reinterpret_cast<base::subtle::AtomicWord*>(&total_key_presses_), 0);
-}
-
-void KeyboardEventCounter::OnKeyboardEvent(ui::EventType event,
-                                           ui::KeyboardCode key_code) {
-  // Updates the pressed keys and the total count of key presses.
-  if (event == ui::ET_KEY_PRESSED) {
-    if (pressed_keys_.find(key_code) != pressed_keys_.end()) return;
-    pressed_keys_.insert(key_code);
-    base::subtle::NoBarrier_AtomicIncrement(
-        reinterpret_cast<base::subtle::AtomicWord*>(&total_key_presses_), 1);
-  } else {
-    DCHECK_EQ(ui::ET_KEY_RELEASED, event);
-    pressed_keys_.erase(key_code);
-  }
-}
-
-size_t KeyboardEventCounter::GetKeyPressCount() const {
-  return base::subtle::NoBarrier_Load(
-      reinterpret_cast<const base::subtle::AtomicWord*>(&total_key_presses_));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/keyboard_event_counter.h b/cobalt/media/base/keyboard_event_counter.h
deleted file mode 100644
index 44e7b6e..0000000
--- a/cobalt/media/base/keyboard_event_counter.h
+++ /dev/null
@@ -1,53 +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 COBALT_MEDIA_BASE_KEYBOARD_EVENT_COUNTER_H_
-#define COBALT_MEDIA_BASE_KEYBOARD_EVENT_COUNTER_H_
-
-#include <set>
-
-#include "base/basictypes.h"
-#include "base/synchronization/lock.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-#include "ui/events/event_constants.h"
-#include "ui/events/keycodes/keyboard_codes.h"
-
-namespace cobalt {
-namespace media {
-
-// This class tracks the total number of keypresses based on the OnKeyboardEvent
-// calls it receives from the client.
-// Multiple key down events for the same key are counted as one keypress until
-// the same key is released.
-class MEDIA_EXPORT KeyboardEventCounter {
- public:
-  KeyboardEventCounter();
-  ~KeyboardEventCounter();
-
-  // Resets the count to 0. Must be called on the same thread as
-  // OnKeyboardEvent.
-  void Reset();
-
-  // Returns the total number of keypresses since its creation or last Reset()
-  // call. Can be called on any thread.
-  size_t GetKeyPressCount() const;
-
-  // The client should call this method on key down or key up events.
-  // Must be called on a single thread.
-  void OnKeyboardEvent(ui::EventType event, ui::KeyboardCode key_code);
-
- private:
-  // The set of keys currently held down.
-  std::set<ui::KeyboardCode> pressed_keys_;
-
-  size_t total_key_presses_;
-
-  DISALLOW_COPY_AND_ASSIGN(KeyboardEventCounter);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_KEYBOARD_EVENT_COUNTER_H_
diff --git a/cobalt/media/base/limits.h b/cobalt/media/base/limits.h
deleted file mode 100644
index 8c7c7a7..0000000
--- a/cobalt/media/base/limits.h
+++ /dev/null
@@ -1,65 +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.
-
-// Contains limit definition constants for the media subsystem.
-
-#ifndef COBALT_MEDIA_BASE_LIMITS_H_
-#define COBALT_MEDIA_BASE_LIMITS_H_
-
-namespace cobalt {
-namespace media {
-
-namespace limits {
-
-enum {
-  // Maximum possible dimension (width or height) for any video.
-  kMaxDimension = (1 << 15) - 1,  // 32767
-
-  // Maximum possible canvas size (width multiplied by height) for any video.
-  kMaxCanvas = (1 << (14 * 2)),  // 16384 x 16384
-
-  // Total number of video frames which are populating in the pipeline.
-  kMaxVideoFrames = 4,
-
-  // The following limits are used by AudioParameters::IsValid().
-  //
-  // A few notes on sample rates of common formats:
-  //   - AAC files are limited to 96 kHz.
-  //   - MP3 files are limited to 48 kHz.
-  //   - Vorbis used to be limited to 96 kHz, but no longer has that
-  //     restriction.
-  //   - Most PC audio hardware is limited to 192 kHz, some specialized DAC
-  //     devices will use 384 kHz though.
-  kMaxSampleRate = 384000,
-  kMinSampleRate = 3000,
-  kMaxChannels = 32,
-  kMaxBytesPerSample = 4,
-  kMaxBitsPerSample = kMaxBytesPerSample * 8,
-  kMaxSamplesPerPacket = kMaxSampleRate,
-  kMaxPacketSizeInBytes =
-      kMaxBytesPerSample * kMaxChannels * kMaxSamplesPerPacket,
-
-  // This limit is used by ParamTraits<VideoCaptureParams>.
-  kMaxFramesPerSecond = 1000,
-
-  // Maximum lengths for various EME API parameters. These are checks to
-  // prevent unnecessarily large parameters from being passed around, and the
-  // lengths are somewhat arbitrary as the EME spec doesn't specify any limits.
-  kMinCertificateLength = 128,
-  kMaxCertificateLength = 16 * 1024,
-  kMaxSessionIdLength = 512,
-  kMinKeyIdLength = 1,
-  kMaxKeyIdLength = 512,
-  kMaxKeyIds = 128,
-  kMaxInitDataLength = 64 * 1024,         // 64 KB
-  kMaxSessionResponseLength = 64 * 1024,  // 64 KB
-  kMaxKeySystemLength = 256,
-};
-
-}  // namespace limits
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_LIMITS_H_
diff --git a/cobalt/media/base/media.cc b/cobalt/media/base/media.cc
deleted file mode 100644
index 84eb07f..0000000
--- a/cobalt/media/base/media.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 "cobalt/media/base/media.h"
-
-#include "base/basictypes.h"
-#include "base/command_line.h"
-#include "base/lazy_instance.h"
-#include "base/metrics/field_trial.h"
-#include "base/trace_event/trace_event.h"
-#include "cobalt/media/base/media_switches.h"
-#include "cobalt/media/base/yuv_convert.h"
-
-#if defined(OS_ANDROID)
-#include "base/android/build_info.h"
-#include "cobalt/media/base/android/media_codec_util.h"
-#endif
-
-#if !defined(MEDIA_DISABLE_FFMPEG)
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#endif
-
-namespace cobalt {
-namespace media {
-
-// Media must only be initialized once, so use a LazyInstance to ensure this.
-class MediaInitializer {
- public:
-  void enable_platform_decoder_support() {
-    has_platform_decoder_support_ = true;
-  }
-
-  bool has_platform_decoder_support() { return has_platform_decoder_support_; }
-
- private:
-  friend struct base::DefaultLazyInstanceTraits<MediaInitializer>;
-
-  MediaInitializer() {
-    TRACE_EVENT_WARMUP_CATEGORY("audio");
-    TRACE_EVENT_WARMUP_CATEGORY("media");
-
-    // Perform initialization of libraries which require runtime CPU detection.
-    InitializeCPUSpecificYUVConversions();
-
-#if !defined(MEDIA_DISABLE_FFMPEG)
-    // Initialize CPU flags outside of the sandbox as this may query /proc for
-    // details on the current CPU for NEON, VFP, etc optimizations.
-    av_get_cpu_flags();
-
-    // Disable logging as it interferes with layout tests.
-    av_log_set_level(AV_LOG_QUIET);
-
-#if defined(ALLOCATOR_SHIM)
-    // Remove allocation limit from ffmpeg, so calls go down to shim layer.
-    av_max_alloc(0);
-#endif  // defined(ALLOCATOR_SHIM)
-
-#endif  // !defined(MEDIA_DISABLE_FFMPEG)
-  }
-
-  ~MediaInitializer() { NOTREACHED() << "MediaInitializer should be leaky!"; }
-
-  bool has_platform_decoder_support_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(MediaInitializer);
-};
-
-static base::LazyInstance<MediaInitializer>::DestructorAtExit g_media_library =
-    LAZY_INSTANCE_INITIALIZER;
-
-void InitializeMediaLibrary() { g_media_library.Get(); }
-
-#if defined(OS_ANDROID)
-void EnablePlatformDecoderSupport() {
-  g_media_library.Pointer()->enable_platform_decoder_support();
-}
-
-bool HasPlatformDecoderSupport() {
-  return g_media_library.Pointer()->has_platform_decoder_support();
-}
-
-bool PlatformHasOpusSupport() {
-  return base::android::BuildInfo::GetInstance()->sdk_int() >= 21;
-}
-
-bool IsUnifiedMediaPipelineEnabled() {
-  return !base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kDisableUnifiedMediaPipeline);
-}
-
-bool ArePlatformDecodersAvailable() {
-  return IsUnifiedMediaPipelineEnabled()
-             ? HasPlatformDecoderSupport()
-             : MediaCodecUtil::IsMediaCodecAvailable();
-}
-#endif
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media.h b/cobalt/media/base/media.h
deleted file mode 100644
index be172b1..0000000
--- a/cobalt/media/base/media.h
+++ /dev/null
@@ -1,54 +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.
-
-// Contains code that should be used for initializing, or querying the state
-// of the media library as a whole.
-
-#ifndef COBALT_MEDIA_BASE_MEDIA_H_
-#define COBALT_MEDIA_BASE_MEDIA_H_
-
-#include "build/build_config.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace base {
-class FilePath;
-}
-
-namespace cobalt {
-namespace media {
-
-// Initializes media libraries (e.g. ffmpeg) as well as CPU specific media
-// features.
-MEDIA_EXPORT void InitializeMediaLibrary();
-
-#if defined(OS_ANDROID)
-// Tells the media library it has support for OS level decoders. Should only be
-// used for actual decoders (e.g. MediaCodec) and not full-featured players
-// (e.g. MediaPlayer).
-MEDIA_EXPORT void EnablePlatformDecoderSupport();
-MEDIA_EXPORT bool HasPlatformDecoderSupport();
-
-// Indicates if the platform supports Opus. Determined *ONLY* by the platform
-// version, so does not guarantee that either can actually be played.
-MEDIA_EXPORT bool PlatformHasOpusSupport();
-
-// Returns true if the unified media pipeline is enabled; the pipeline may still
-// not work for all codecs if HasPlatformDecoderSupport() is false. Please see
-// MimeUtil for an exhaustive listing of supported codecs.
-//
-// TODO(dalecurtis): These methods are temporary and should be removed once the
-// unified media pipeline is supported everywhere.  http://crbug.com/580626.
-MEDIA_EXPORT bool IsUnifiedMediaPipelineEnabled();
-
-// Returns whether the platform decoders are available for use.
-// This includes decoders being available on the platform and accessible, such
-// as via the GPU process. Should only be used for actual decoders
-// (e.g. MediaCodec) and not full-featured players (e.g. MediaPlayer).
-MEDIA_EXPORT bool ArePlatformDecodersAvailable();
-#endif
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_H_
diff --git a/cobalt/media/base/media_client.cc b/cobalt/media/base/media_client.cc
deleted file mode 100644
index a442302..0000000
--- a/cobalt/media/base/media_client.cc
+++ /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.
-
-#include "cobalt/media/base/media_client.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-static MediaClient* g_media_client = NULL;
-
-void SetMediaClient(MediaClient* media_client) {
-  g_media_client = media_client;
-}
-
-MediaClient* GetMediaClient() { return g_media_client; }
-
-KeySystemInfoForUMA::KeySystemInfoForUMA(
-    const std::string& key_system, const std::string& key_system_name_for_uma)
-    : key_system(key_system),
-      key_system_name_for_uma(key_system_name_for_uma) {}
-
-KeySystemInfoForUMA::~KeySystemInfoForUMA() {}
-
-MediaClient::MediaClient() {}
-
-MediaClient::~MediaClient() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_client.h b/cobalt/media/base/media_client.h
deleted file mode 100644
index 20ae320..0000000
--- a/cobalt/media/base/media_client.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_MEDIA_CLIENT_H_
-#define COBALT_MEDIA_BASE_MEDIA_CLIENT_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "cobalt/media/base/key_system_properties.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/video_codecs.h"
-#include "url/gurl.h"
-
-namespace cobalt {
-namespace media {
-
-class MediaClient;
-
-// Setter for the client. If a customized client is needed, it should be set
-// early, before the client could possibly be used.
-MEDIA_EXPORT void SetMediaClient(MediaClient* media_client);
-
-// Media's embedder API should only be used by media.
-#if defined(MEDIA_IMPLEMENTATION) || defined(MEDIA_BLINK_IMPLEMENTATION)
-// Getter for the client. Returns NULL if no customized client is needed.
-MEDIA_EXPORT MediaClient* GetMediaClient();
-#endif
-
-struct MEDIA_EXPORT KeySystemInfoForUMA {
-  KeySystemInfoForUMA(const std::string& key_system,
-                      const std::string& key_system_name_for_uma);
-  ~KeySystemInfoForUMA();
-
-  // Concrete key system name;
-  std::string key_system;
-
-  // Display name for UMA reporting. For example, the display name for
-  // "org.w3.clearkey" is "ClearKey". When providing this value, make sure to
-  // update tools/metrics/histograms/histograms.xml.
-  std::string key_system_name_for_uma;
-};
-
-// A client interface for embedders (e.g. content/renderer) to provide
-// customized service.
-class MEDIA_EXPORT MediaClient {
- public:
-  MediaClient();
-  virtual ~MediaClient();
-
-  // Provides UMA info for key systems that SHOULD be reported to UMA, no matter
-  // whether a key system is actually supported by this client or not. Only
-  // called once per instance.
-  virtual void AddKeySystemsInfoForUMA(
-      std::vector<KeySystemInfoForUMA>* key_systems_info_for_uma) = 0;
-
-  // Returns whether client key systems properties should be updated.
-  virtual bool IsKeySystemsUpdateNeeded() = 0;
-
-  // Adds properties for supported key systems.
-  virtual void AddSupportedKeySystems(
-      std::vector<std::unique_ptr<KeySystemProperties>>*
-          key_systems_properties) = 0;
-
-  // Records a domain and registry of a url to a Rappor privacy-preserving
-  // metric. See: https://www.chromium.org/developers/design-documents/rappor
-  virtual void RecordRapporURL(const std::string& metric, const GURL& url) = 0;
-
-  // Returns true if the given combination of video codec, profile and level is
-  // supported. The |level| value is codec-specific.
-  virtual bool IsSupportedVideoConfig(VideoCodec codec,
-                                      VideoCodecProfile profile, int level) = 0;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_CLIENT_H_
diff --git a/cobalt/media/base/media_content_type.cc b/cobalt/media/base/media_content_type.cc
deleted file mode 100644
index 79298d6..0000000
--- a/cobalt/media/base/media_content_type.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 "cobalt/media/base/media_content_type.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-const int kMinimumContentDurationSecs = 5;
-}  // anonymous namespace
-
-MediaContentType DurationToMediaContentType(base::TimeDelta duration) {
-  // A zero duration indicates that the duration is unknown. "Persistent" type
-  // should be used in this case.
-  return (duration.is_zero() ||
-          duration > base::TimeDelta::FromSeconds(kMinimumContentDurationSecs))
-             ? MediaContentType::Persistent
-             : MediaContentType::Transient;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_content_type.h b/cobalt/media/base/media_content_type.h
deleted file mode 100644
index 566fc88..0000000
--- a/cobalt/media/base/media_content_type.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 COBALT_MEDIA_BASE_MEDIA_CONTENT_TYPE_H_
-#define COBALT_MEDIA_BASE_MEDIA_CONTENT_TYPE_H_
-
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// The content type of a media player, which will be used by MediaSession to
-// control its players.
-enum class MediaContentType {
-  // Type indicating that a player is persistent, which needs to take audio
-  // focus to play.
-  Persistent,
-  // Type indicating that a player only plays a transient sound.
-  Transient,
-  // Type indicating that a player is a Pepper instance. MediaSession may duck
-  // the player instead of pausing it.
-  Pepper,
-  // Type indicating that a player cannot be controlled. MediaSession wil ignore
-  // this player.
-  Uncontrollable
-};
-
-// Utility function for deciding the MediaContentType of a player based on its
-// duration.
-MEDIA_EXPORT MediaContentType
-DurationToMediaContentType(base::TimeDelta duration);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_CONTENT_TYPE_H_
diff --git a/cobalt/media/base/media_file_checker.cc b/cobalt/media/base/media_file_checker.cc
deleted file mode 100644
index 5499795..0000000
--- a/cobalt/media/base/media_file_checker.cc
+++ /dev/null
@@ -1,101 +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 "cobalt/media/base/media_file_checker.h"
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/time/time.h"
-#include "cobalt/media/ffmpeg/ffmpeg_common.h"
-#include "cobalt/media/filters/blocking_url_protocol.h"
-#include "cobalt/media/filters/ffmpeg_glue.h"
-#include "cobalt/media/filters/file_data_source.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-static const int64_t kMaxCheckTimeInSeconds = 5;
-
-static void OnError(bool* called) { *called = false; }
-
-MediaFileChecker::MediaFileChecker(base::File file) : file_(std::move(file)) {}
-
-MediaFileChecker::~MediaFileChecker() {}
-
-bool MediaFileChecker::Start(base::TimeDelta check_time) {
-  media::FileDataSource source(std::move(file_));
-  bool read_ok = true;
-  media::BlockingUrlProtocol protocol(&source, base::Bind(&OnError, &read_ok));
-  media::FFmpegGlue glue(&protocol);
-  AVFormatContext* format_context = glue.format_context();
-
-  if (!glue.OpenContext()) return false;
-
-  if (avformat_find_stream_info(format_context, NULL) < 0) return false;
-
-  // Remember the codec context for any decodable audio or video streams.
-  std::map<int, AVCodecContext*> stream_contexts;
-  for (size_t i = 0; i < format_context->nb_streams; ++i) {
-    AVCodecContext* c = format_context->streams[i]->codec;
-    if (c->codec_type == AVMEDIA_TYPE_AUDIO ||
-        c->codec_type == AVMEDIA_TYPE_VIDEO) {
-      AVCodec* codec = avcodec_find_decoder(c->codec_id);
-      if (codec && avcodec_open2(c, codec, NULL) >= 0) stream_contexts[i] = c;
-    }
-  }
-
-  if (stream_contexts.size() == 0) return false;
-
-  AVPacket packet;
-  std::unique_ptr<AVFrame, media::ScopedPtrAVFreeFrame> frame(av_frame_alloc());
-  int result = 0;
-
-  const base::TimeTicks deadline =
-      base::TimeTicks::Now() +
-      std::min(check_time,
-               base::TimeDelta::FromSeconds(kMaxCheckTimeInSeconds));
-  do {
-    result = av_read_frame(glue.format_context(), &packet);
-    if (result < 0) break;
-
-    std::map<int, AVCodecContext*>::const_iterator it =
-        stream_contexts.find(packet.stream_index);
-    if (it == stream_contexts.end()) {
-      av_packet_unref(&packet);
-      continue;
-    }
-    AVCodecContext* av_context = it->second;
-
-    int frame_decoded = 0;
-    if (av_context->codec_type == AVMEDIA_TYPE_AUDIO) {
-      // A shallow copy of packet so we can slide packet.data as frames are
-      // decoded; otherwise av_packet_unref() will corrupt memory.
-      AVPacket temp_packet = packet;
-      do {
-        result = avcodec_decode_audio4(av_context, frame.get(), &frame_decoded,
-                                       &temp_packet);
-        if (result < 0) break;
-        av_frame_unref(frame.get());
-        temp_packet.size -= result;
-        temp_packet.data += result;
-        frame_decoded = 0;
-      } while (temp_packet.size > 0);
-    } else if (av_context->codec_type == AVMEDIA_TYPE_VIDEO) {
-      result = avcodec_decode_video2(av_context, frame.get(), &frame_decoded,
-                                     &packet);
-      if (result >= 0 && frame_decoded) av_frame_unref(frame.get());
-    }
-    av_packet_unref(&packet);
-  } while (base::TimeTicks::Now() < deadline && read_ok && result >= 0);
-
-  return read_ok && (result == AVERROR_EOF || result >= 0);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_file_checker.h b/cobalt/media/base/media_file_checker.h
deleted file mode 100644
index 8451a43..0000000
--- a/cobalt/media/base/media_file_checker.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_MEDIA_FILE_CHECKER_H_
-#define COBALT_MEDIA_BASE_MEDIA_FILE_CHECKER_H_
-
-#include "base/basictypes.h"
-#include "base/files/file.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace base {
-class TimeDelta;
-}
-
-namespace cobalt {
-namespace media {
-
-// This class tries to determine if a file is a valid media file. The entire
-// file is not decoded so a positive result from this class does not make the
-// file safe to use in the browser process.
-class MEDIA_EXPORT MediaFileChecker {
- public:
-  explicit MediaFileChecker(base::File file);
-  ~MediaFileChecker();
-
-  // After opening |file|, up to |check_time| amount of wall-clock time is spent
-  // decoding the file. The amount of audio/video data decoded will depend on
-  // the bitrate of the file and the speed of the CPU.
-  bool Start(base::TimeDelta check_time);
-
- private:
-  base::File file_;
-
-  DISALLOW_COPY_AND_ASSIGN(MediaFileChecker);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_FILE_CHECKER_H_
diff --git a/cobalt/media/base/media_file_checker_unittest.cc b/cobalt/media/base/media_file_checker_unittest.cc
deleted file mode 100644
index 5f16617..0000000
--- a/cobalt/media/base/media_file_checker_unittest.cc
+++ /dev/null
@@ -1,43 +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 "cobalt/media/base/media_file_checker.h"
-
-#include <string>
-#include <utility>
-
-#include "base/files/file.h"
-#include "base/logging.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-static void RunMediaFileChecker(const std::string& filename, bool expectation) {
-  base::File file(GetTestDataFilePath(filename),
-                  base::File::FLAG_OPEN | base::File::FLAG_READ);
-  ASSERT_TRUE(file.IsValid());
-
-  MediaFileChecker checker(std::move(file));
-  const base::TimeDelta check_time = base::TimeDelta::FromMilliseconds(100);
-  bool result = checker.Start(check_time);
-  EXPECT_EQ(expectation, result);
-}
-
-TEST(MediaFileCheckerTest, InvalidFile) {
-  RunMediaFileChecker("ten_byte_file", false);
-}
-
-TEST(MediaFileCheckerTest, Video) { RunMediaFileChecker("bear.ogv", true); }
-
-TEST(MediaFileCheckerTest, Audio) { RunMediaFileChecker("sfx.ogg", true); }
-
-#if defined(USE_PROPRIETARY_CODECS)
-TEST(MediaFileCheckerTest, MP3) { RunMediaFileChecker("sfx.mp3", true); }
-#endif
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_log.cc b/cobalt/media/base/media_log.cc
deleted file mode 100644
index 483b581..0000000
--- a/cobalt/media/base/media_log.cc
+++ /dev/null
@@ -1,296 +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 "cobalt/media/base/media_log.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/atomic_sequence_num.h"
-#include "base/json/json_writer.h"
-#include "base/values.h"
-
-namespace cobalt {
-namespace media {
-
-// A count of all MediaLogs created in the current process. Used to generate
-// unique IDs.
-static base::AtomicSequenceNumber g_media_log_count;
-
-const char MediaLog::kWatchTimeAudioVideoAll[] =
-    "Media.WatchTime.AudioVideo.All";
-const char MediaLog::kWatchTimeAudioVideoMse[] =
-    "Media.WatchTime.AudioVideo.MSE";
-const char MediaLog::kWatchTimeAudioVideoEme[] =
-    "Media.WatchTime.AudioVideo.EME";
-const char MediaLog::kWatchTimeAudioVideoSrc[] =
-    "Media.WatchTime.AudioVideo.SRC";
-const char MediaLog::kWatchTimeAudioVideoBattery[] =
-    "Media.WatchTime.AudioVideo.Battery";
-const char MediaLog::kWatchTimeAudioVideoAc[] = "Media.WatchTime.AudioVideo.AC";
-
-const char MediaLog::kWatchTimeFinalize[] = "FinalizeWatchTime";
-const char MediaLog::kWatchTimeFinalizePower[] = "FinalizePowerWatchTime";
-
-std::string MediaLog::MediaLogLevelToString(MediaLogLevel level) {
-  switch (level) {
-    case MEDIALOG_ERROR:
-      return "error";
-    case MEDIALOG_INFO:
-      return "info";
-    case MEDIALOG_DEBUG:
-      return "debug";
-  }
-  NOTREACHED();
-  return NULL;
-}
-
-MediaLogEvent::Type MediaLog::MediaLogLevelToEventType(MediaLogLevel level) {
-  switch (level) {
-    case MEDIALOG_ERROR:
-      return MediaLogEvent::MEDIA_ERROR_LOG_ENTRY;
-    case MEDIALOG_INFO:
-      return MediaLogEvent::MEDIA_INFO_LOG_ENTRY;
-    case MEDIALOG_DEBUG:
-      return MediaLogEvent::MEDIA_DEBUG_LOG_ENTRY;
-  }
-  NOTREACHED();
-  return MediaLogEvent::MEDIA_ERROR_LOG_ENTRY;
-}
-
-std::string MediaLog::EventTypeToString(MediaLogEvent::Type type) {
-  switch (type) {
-    case MediaLogEvent::WEBMEDIAPLAYER_CREATED:
-      return "WEBMEDIAPLAYER_CREATED";
-    case MediaLogEvent::WEBMEDIAPLAYER_DESTROYED:
-      return "WEBMEDIAPLAYER_DESTROYED";
-    case MediaLogEvent::LOAD:
-      return "LOAD";
-    case MediaLogEvent::SEEK:
-      return "SEEK";
-    case MediaLogEvent::PLAY:
-      return "PLAY";
-    case MediaLogEvent::PAUSE:
-      return "PAUSE";
-    case MediaLogEvent::PIPELINE_STATE_CHANGED:
-      return "PIPELINE_STATE_CHANGED";
-    case MediaLogEvent::PIPELINE_ERROR:
-      return "PIPELINE_ERROR";
-    case MediaLogEvent::VIDEO_SIZE_SET:
-      return "VIDEO_SIZE_SET";
-    case MediaLogEvent::DURATION_SET:
-      return "DURATION_SET";
-    case MediaLogEvent::TOTAL_BYTES_SET:
-      return "TOTAL_BYTES_SET";
-    case MediaLogEvent::NETWORK_ACTIVITY_SET:
-      return "NETWORK_ACTIVITY_SET";
-    case MediaLogEvent::ENDED:
-      return "ENDED";
-    case MediaLogEvent::TEXT_ENDED:
-      return "TEXT_ENDED";
-    case MediaLogEvent::BUFFERED_EXTENTS_CHANGED:
-      return "BUFFERED_EXTENTS_CHANGED";
-    case MediaLogEvent::MEDIA_ERROR_LOG_ENTRY:
-      return "MEDIA_ERROR_LOG_ENTRY";
-    case MediaLogEvent::MEDIA_INFO_LOG_ENTRY:
-      return "MEDIA_INFO_LOG_ENTRY";
-    case MediaLogEvent::MEDIA_DEBUG_LOG_ENTRY:
-      return "MEDIA_DEBUG_LOG_ENTRY";
-    case MediaLogEvent::PROPERTY_CHANGE:
-      return "PROPERTY_CHANGE";
-    case MediaLogEvent::WATCH_TIME_UPDATE:
-      return "WATCH_TIME_UPDATE";
-  }
-  NOTREACHED();
-  return NULL;
-}
-
-std::string MediaLog::PipelineStatusToString(PipelineStatus status) {
-  switch (status) {
-    case PIPELINE_OK:
-      return "pipeline: ok";
-    case PIPELINE_ERROR_NETWORK:
-      return "pipeline: network error";
-    case PIPELINE_ERROR_DECODE:
-      return "pipeline: decode error";
-    case PIPELINE_ERROR_ABORT:
-      return "pipeline: abort";
-    case PIPELINE_ERROR_INITIALIZATION_FAILED:
-      return "pipeline: initialization failed";
-    case PIPELINE_ERROR_COULD_NOT_RENDER:
-      return "pipeline: could not render";
-    case PIPELINE_ERROR_EXTERNAL_RENDERER_FAILED:
-      return "pipeline: external renderer failed";
-    case PIPELINE_ERROR_READ:
-      return "pipeline: read error";
-    case PIPELINE_ERROR_INVALID_STATE:
-      return "pipeline: invalid state";
-    case DEMUXER_ERROR_COULD_NOT_OPEN:
-      return "demuxer: could not open";
-    case DEMUXER_ERROR_COULD_NOT_PARSE:
-      return "demuxer: could not parse";
-    case DEMUXER_ERROR_NO_SUPPORTED_STREAMS:
-      return "demuxer: no supported streams";
-    case DECODER_ERROR_NOT_SUPPORTED:
-      return "decoder: not supported";
-    case CHUNK_DEMUXER_ERROR_APPEND_FAILED:
-      return "chunk demuxer: append failed";
-    case CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR:
-      return "chunk demuxer: application requested decode error on eos";
-    case CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR:
-      return "chunk demuxer: application requested network error on eos";
-    case AUDIO_RENDERER_ERROR:
-      return "audio renderer: output device reported an error";
-    case AUDIO_RENDERER_ERROR_SPLICE_FAILED:
-      return "audio renderer: post-decode audio splicing failed";
-    case PLAYBACK_CAPABILITY_CHANGED:
-      return "pipeline: playback capability changed";
-  }
-  NOTREACHED();
-  return NULL;
-}
-
-std::string MediaLog::MediaEventToLogString(const MediaLogEvent& event) {
-  // Special case for PIPELINE_ERROR, since that's by far the most useful
-  // event for figuring out media pipeline failures, and just reporting
-  // pipeline status as numeric code is not very helpful/user-friendly.
-  int error_code = 0;
-  if (event.type == MediaLogEvent::PIPELINE_ERROR &&
-      event.params.GetInteger("pipeline_error", &error_code)) {
-    PipelineStatus status = static_cast<PipelineStatus>(error_code);
-    return EventTypeToString(event.type) + " " +
-           media::MediaLog::PipelineStatusToString(status);
-  }
-  std::string params_json;
-  base::JSONWriter::Write(event.params, &params_json);
-  return EventTypeToString(event.type) + " " + params_json;
-}
-
-MediaLog::MediaLog() : id_(g_media_log_count.GetNext()) {}
-
-MediaLog::~MediaLog() {}
-
-void MediaLog::AddEvent(std::unique_ptr<MediaLogEvent> event) {}
-
-std::string MediaLog::GetLastErrorMessage() { return ""; }
-
-void MediaLog::RecordRapporWithSecurityOrigin(const std::string& metric) {
-  DVLOG(1) << "Default MediaLog doesn't support rappor reporting.";
-}
-
-std::unique_ptr<MediaLogEvent> MediaLog::CreateEvent(MediaLogEvent::Type type) {
-  std::unique_ptr<MediaLogEvent> event(new MediaLogEvent);
-  event->id = id_;
-  event->type = type;
-  event->time = base::TimeTicks::Now();
-  return std::move(event);
-}
-
-std::unique_ptr<MediaLogEvent> MediaLog::CreateBooleanEvent(
-    MediaLogEvent::Type type, const std::string& property, bool value) {
-  std::unique_ptr<MediaLogEvent> event(CreateEvent(type));
-  event->params.SetBoolean(property, value);
-  return std::move(event);
-}
-
-std::unique_ptr<MediaLogEvent> MediaLog::CreateStringEvent(
-    MediaLogEvent::Type type, const std::string& property,
-    const std::string& value) {
-  std::unique_ptr<MediaLogEvent> event(CreateEvent(type));
-  event->params.SetString(property, value);
-  return std::move(event);
-}
-
-std::unique_ptr<MediaLogEvent> MediaLog::CreateTimeEvent(
-    MediaLogEvent::Type type, const std::string& property,
-    base::TimeDelta value) {
-  std::unique_ptr<MediaLogEvent> event(CreateEvent(type));
-  if (value.is_max())
-    event->params.SetString(property, "unknown");
-  else
-    event->params.SetDouble(property, value.InSecondsF());
-  return std::move(event);
-}
-
-std::unique_ptr<MediaLogEvent> MediaLog::CreateLoadEvent(
-    const std::string& url) {
-  std::unique_ptr<MediaLogEvent> event(CreateEvent(MediaLogEvent::LOAD));
-  event->params.SetString("url", url);
-  return std::move(event);
-}
-
-std::unique_ptr<MediaLogEvent> MediaLog::CreateSeekEvent(float seconds) {
-  std::unique_ptr<MediaLogEvent> event(CreateEvent(MediaLogEvent::SEEK));
-  event->params.SetDouble("seek_target", seconds);
-  return std::move(event);
-}
-
-std::unique_ptr<MediaLogEvent> MediaLog::CreatePipelineErrorEvent(
-    PipelineStatus error) {
-  std::unique_ptr<MediaLogEvent> event(
-      CreateEvent(MediaLogEvent::PIPELINE_ERROR));
-  event->params.SetInteger("pipeline_error", error);
-  return std::move(event);
-}
-
-std::unique_ptr<MediaLogEvent> MediaLog::CreateVideoSizeSetEvent(
-    size_t width, size_t height) {
-  std::unique_ptr<MediaLogEvent> event(
-      CreateEvent(MediaLogEvent::VIDEO_SIZE_SET));
-  event->params.SetInteger("width", width);
-  event->params.SetInteger("height", height);
-  return std::move(event);
-}
-
-std::unique_ptr<MediaLogEvent> MediaLog::CreateBufferedExtentsChangedEvent(
-    int64_t start, int64_t current, int64_t end) {
-  std::unique_ptr<MediaLogEvent> event(
-      CreateEvent(MediaLogEvent::BUFFERED_EXTENTS_CHANGED));
-  // These values are headed to JS where there is no int64_t so we use a double
-  // and accept loss of precision above 2^53 bytes (8 Exabytes).
-  event->params.SetDouble("buffer_start", start);
-  event->params.SetDouble("buffer_current", current);
-  event->params.SetDouble("buffer_end", end);
-  return std::move(event);
-}
-
-void MediaLog::AddLogEvent(MediaLogLevel level, const std::string& message) {
-  std::unique_ptr<MediaLogEvent> event(
-      CreateEvent(MediaLogLevelToEventType(level)));
-  event->params.SetString(MediaLogLevelToString(level), message);
-  AddEvent(std::move(event));
-}
-
-void MediaLog::SetStringProperty(const std::string& key,
-                                 const std::string& value) {
-  std::unique_ptr<MediaLogEvent> event(
-      CreateEvent(MediaLogEvent::PROPERTY_CHANGE));
-  event->params.SetString(key, value);
-  AddEvent(std::move(event));
-}
-
-void MediaLog::SetDoubleProperty(const std::string& key, double value) {
-  std::unique_ptr<MediaLogEvent> event(
-      CreateEvent(MediaLogEvent::PROPERTY_CHANGE));
-  event->params.SetDouble(key, value);
-  AddEvent(std::move(event));
-}
-
-void MediaLog::SetBooleanProperty(const std::string& key, bool value) {
-  std::unique_ptr<MediaLogEvent> event(
-      CreateEvent(MediaLogEvent::PROPERTY_CHANGE));
-  event->params.SetBoolean(key, value);
-  AddEvent(std::move(event));
-}
-
-LogHelper::LogHelper(MediaLog::MediaLogLevel level,
-                     const scoped_refptr<MediaLog>& media_log)
-    : level_(level), media_log_(media_log) {
-  DCHECK(media_log_.get());
-}
-
-LogHelper::~LogHelper() { media_log_->AddLogEvent(level_, stream_.str()); }
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_log.h b/cobalt/media/base/media_log.h
deleted file mode 100644
index aafaa98..0000000
--- a/cobalt/media/base/media_log.h
+++ /dev/null
@@ -1,146 +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 COBALT_MEDIA_BASE_MEDIA_LOG_H_
-#define COBALT_MEDIA_BASE_MEDIA_LOG_H_
-
-#include <memory>
-#include <sstream>
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log_event.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT MediaLog : public base::RefCountedThreadSafe<MediaLog> {
- public:
-  enum MediaLogLevel {
-    MEDIALOG_ERROR,
-    MEDIALOG_INFO,
-    MEDIALOG_DEBUG,
-  };
-
-  // Convert various enums to strings.
-  static std::string MediaLogLevelToString(MediaLogLevel level);
-  static MediaLogEvent::Type MediaLogLevelToEventType(MediaLogLevel level);
-  static std::string EventTypeToString(MediaLogEvent::Type type);
-  static std::string PipelineStatusToString(PipelineStatus status);
-
-  static std::string MediaEventToLogString(const MediaLogEvent& event);
-
-  MediaLog();
-
-  // Add an event to this log. Overriden by inheritors to actually do something
-  // with it.
-  virtual void AddEvent(std::unique_ptr<MediaLogEvent> event);
-
-  // Retrieve an error message, if any.
-  virtual std::string GetLastErrorMessage();
-
-  // Records the domain and registry of the current frame security origin to a
-  // Rappor privacy-preserving metric. See:
-  //   https://www.chromium.org/developers/design-documents/rappor
-  virtual void RecordRapporWithSecurityOrigin(const std::string& metric);
-
-  // Helper methods to create events and their parameters.
-  std::unique_ptr<MediaLogEvent> CreateEvent(MediaLogEvent::Type type);
-  std::unique_ptr<MediaLogEvent> CreateBooleanEvent(MediaLogEvent::Type type,
-                                                    const std::string& property,
-                                                    bool value);
-  std::unique_ptr<MediaLogEvent> CreateStringEvent(MediaLogEvent::Type type,
-                                                   const std::string& property,
-                                                   const std::string& value);
-  std::unique_ptr<MediaLogEvent> CreateTimeEvent(MediaLogEvent::Type type,
-                                                 const std::string& property,
-                                                 base::TimeDelta value);
-  std::unique_ptr<MediaLogEvent> CreateLoadEvent(const std::string& url);
-  std::unique_ptr<MediaLogEvent> CreateSeekEvent(float seconds);
-  std::unique_ptr<MediaLogEvent> CreatePipelineErrorEvent(PipelineStatus error);
-  std::unique_ptr<MediaLogEvent> CreateVideoSizeSetEvent(size_t width,
-                                                         size_t height);
-  std::unique_ptr<MediaLogEvent> CreateBufferedExtentsChangedEvent(
-      int64_t start, int64_t current, int64_t end);
-
-  // Report a log message at the specified log level.
-  void AddLogEvent(MediaLogLevel level, const std::string& message);
-
-  // Report a property change without an accompanying event.
-  void SetStringProperty(const std::string& key, const std::string& value);
-  void SetDoubleProperty(const std::string& key, double value);
-  void SetBooleanProperty(const std::string& key, bool value);
-
-  // Histogram names used for reporting; also double as MediaLog key names.
-  static const char kWatchTimeAudioVideoAll[];
-  static const char kWatchTimeAudioVideoMse[];
-  static const char kWatchTimeAudioVideoEme[];
-  static const char kWatchTimeAudioVideoSrc[];
-  static const char kWatchTimeAudioVideoBattery[];
-  static const char kWatchTimeAudioVideoAc[];
-
-  // Markers which signify the watch time should be finalized immediately.
-  static const char kWatchTimeFinalize[];
-  static const char kWatchTimeFinalizePower[];
-
- protected:
-  friend class base::RefCountedThreadSafe<MediaLog>;
-  virtual ~MediaLog();
-
- private:
-  // A unique (to this process) id for this MediaLog.
-  int32_t id_;
-
-  DISALLOW_COPY_AND_ASSIGN(MediaLog);
-};
-
-// Helper class to make it easier to use MediaLog like DVLOG().
-class MEDIA_EXPORT LogHelper {
- public:
-  LogHelper(MediaLog::MediaLogLevel level,
-            const scoped_refptr<MediaLog>& media_log);
-  ~LogHelper();
-
-  std::ostream& stream() { return stream_; }
-
- private:
-  MediaLog::MediaLogLevel level_;
-  const scoped_refptr<MediaLog> media_log_;
-  std::stringstream stream_;
-};
-
-// Provides a stringstream to collect a log entry to pass to the provided
-// MediaLog at the requested level.
-#define MEDIA_LOG(level, media_log) \
-  LogHelper((MediaLog::MEDIALOG_##level), (media_log)).stream()
-
-// Logs only while |count| < |max|, increments |count| for each log, and warns
-// in the log if |count| has just reached |max|.
-// Multiple short-circuit evaluations are involved in this macro:
-// 1) LAZY_STREAM avoids wasteful MEDIA_LOG and evaluation of subsequent stream
-//    arguments if |count| is >= |max|, and
-// 2) the |condition| given to LAZY_STREAM itself short-circuits to prevent
-//    incrementing |count| beyond |max|.
-// Note that LAZY_STREAM guarantees exactly one evaluation of |condition|, so
-// |count| will be incremented at most once each time this macro runs.
-// The "|| true" portion of |condition| lets logging occur correctly when
-// |count| < |max| and |count|++ is 0.
-// TODO(wolenetz,chcunningham): Consider using a helper class instead of a macro
-// to improve readability.
-#define LIMITED_MEDIA_LOG(level, media_log, count, max)                       \
-  LAZY_STREAM(MEDIA_LOG(level, media_log),                                    \
-              (count) < (max) && ((count)++ || true))                         \
-      << (((count) == (max)) ? "(Log limit reached. Further similar entries " \
-                               "may be suppressed): "                         \
-                             : "")
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_LOG_H_
diff --git a/cobalt/media/base/media_log_event.h b/cobalt/media/base/media_log_event.h
deleted file mode 100644
index cc94bbe..0000000
--- a/cobalt/media/base/media_log_event.h
+++ /dev/null
@@ -1,112 +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 COBALT_MEDIA_BASE_MEDIA_LOG_EVENT_H_
-#define COBALT_MEDIA_BASE_MEDIA_LOG_EVENT_H_
-
-#include <memory>
-
-#include "base/time/time.h"
-#include "base/values.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-struct MediaLogEvent {
-  MediaLogEvent() {}
-
-  MediaLogEvent(const MediaLogEvent& event) { *this = event; }
-
-  MediaLogEvent& operator=(const MediaLogEvent& event) {
-    id = event.id;
-    type = event.type;
-    std::unique_ptr<base::DictionaryValue> event_copy(event.params.DeepCopy());
-    params.Swap(event_copy.get());
-    time = event.time;
-    return *this;
-  }
-
-  enum Type {
-    // A WebMediaPlayer is being created or destroyed.
-    // params: none.
-    WEBMEDIAPLAYER_CREATED,
-    WEBMEDIAPLAYER_DESTROYED,
-
-    // A media player is loading a resource.
-    // params: "url": <URL of the resource>.
-    LOAD,
-
-    // A media player has started seeking.
-    // params: "seek_target": <number of seconds to which to seek>.
-    SEEK,
-
-    // A media player has been told to play or pause.
-    // params: none.
-    PLAY,
-    PAUSE,
-
-    // The state of Pipeline has changed.
-    // params: "pipeline_state": <string name of the state>.
-    PIPELINE_STATE_CHANGED,
-
-    // An error has occurred in the pipeline.
-    // params: "pipeline_error": <string name of the error>.
-    PIPELINE_ERROR,
-
-    // The size of the video has been determined.
-    // params: "width": <integral width of the video>.
-    //         "height": <integral height of the video>.
-    VIDEO_SIZE_SET,
-
-    // A property of the pipeline has been set by a filter.
-    // These take a single parameter based upon the name of the event and of
-    // the appropriate type. e.g. DURATION_SET: "duration" of type TimeDelta.
-    DURATION_SET,
-    TOTAL_BYTES_SET,
-    NETWORK_ACTIVITY_SET,
-
-    // Audio/Video stream playback has ended.
-    ENDED,
-
-    // Text stream playback has ended.
-    TEXT_ENDED,
-
-    // The extents of the sliding buffer have changed.
-    // params: "buffer_start": <first buffered byte>.
-    //         "buffer_current": <current offset>.
-    //         "buffer_end": <last buffered byte>.
-    BUFFERED_EXTENTS_CHANGED,
-
-    // Error log reported by media code such as reasons of playback error.
-    MEDIA_ERROR_LOG_ENTRY,
-    // params: "error": Error string describing the error detected.
-
-    // Informative log reported by media code.
-    MEDIA_INFO_LOG_ENTRY,
-    // params: "info": String with details of an informative log entry.
-
-    // Debug log reported by media code.
-    MEDIA_DEBUG_LOG_ENTRY,
-    // params: "debug": String with details of a debug log entry.
-
-    // A property has changed without any special event occurring.
-    PROPERTY_CHANGE,
-
-    // Indicates that updated watch time statistics are available.
-    WATCH_TIME_UPDATE,
-
-    TYPE_LAST = WATCH_TIME_UPDATE
-  };
-
-  int32_t id;
-  Type type;
-  base::DictionaryValue params;
-  base::TimeTicks time;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_LOG_EVENT_H_
diff --git a/cobalt/media/base/media_permission.cc b/cobalt/media/base/media_permission.cc
deleted file mode 100644
index d0e84cf..0000000
--- a/cobalt/media/base/media_permission.cc
+++ /dev/null
@@ -1,15 +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 "cobalt/media/base/media_permission.h"
-
-namespace cobalt {
-namespace media {
-
-MediaPermission::MediaPermission() {}
-
-MediaPermission::~MediaPermission() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_permission.h b/cobalt/media/base/media_permission.h
deleted file mode 100644
index 299164a..0000000
--- a/cobalt/media/base/media_permission.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 COBALT_MEDIA_BASE_MEDIA_PERMISSION_H_
-#define COBALT_MEDIA_BASE_MEDIA_PERMISSION_H_
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "cobalt/media/base/media_export.h"
-
-class GURL;
-
-namespace cobalt {
-namespace media {
-
-// Interface to handle media related permission checks and requests.
-class MEDIA_EXPORT MediaPermission {
- public:
-  typedef base::Callback<void(bool)> PermissionStatusCB;
-
-  enum Type {
-    PROTECTED_MEDIA_IDENTIFIER,
-    AUDIO_CAPTURE,
-    VIDEO_CAPTURE,
-  };
-
-  MediaPermission();
-  virtual ~MediaPermission();
-
-  // Checks whether |type| is permitted for |security_origin| without
-  // triggering user interaction (e.g. permission prompt). The status will be
-  // |false| if the permission has never been set.
-  virtual void HasPermission(
-      Type type, const GURL& security_origin,
-      const PermissionStatusCB& permission_status_cb) = 0;
-
-  // Requests |type| permission for |security_origin|. This may trigger user
-  // interaction (e.g. permission prompt) if the permission has never been set.
-  virtual void RequestPermission(
-      Type type, const GURL& security_origin,
-      const PermissionStatusCB& permission_status_cb) = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MediaPermission);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_PERMISSION_H_
diff --git a/cobalt/media/base/media_resources.cc b/cobalt/media/base/media_resources.cc
deleted file mode 100644
index 6852e57..0000000
--- a/cobalt/media/base/media_resources.cc
+++ /dev/null
@@ -1,32 +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 "cobalt/media/base/media_resources.h"
-
-#include "base/logging.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-
-namespace cobalt {
-namespace media {
-
-static LocalizedStringProvider g_localized_string_provider = NULL;
-
-void SetLocalizedStringProvider(LocalizedStringProvider func) {
-  g_localized_string_provider = func;
-}
-
-#if !defined(OS_IOS)
-std::string GetLocalizedStringUTF8(MessageId message_id) {
-  return base::UTF16ToUTF8(GetLocalizedStringUTF16(message_id));
-}
-
-base::string16 GetLocalizedStringUTF16(MessageId message_id) {
-  return g_localized_string_provider ? g_localized_string_provider(message_id)
-                                     : base::string16();
-}
-#endif
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_resources.h b/cobalt/media/base/media_resources.h
deleted file mode 100644
index f6317b8..0000000
--- a/cobalt/media/base/media_resources.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 COBALT_MEDIA_BASE_MEDIA_RESOURCES_H_
-#define COBALT_MEDIA_BASE_MEDIA_RESOURCES_H_
-
-#include <string>
-
-#include "base/strings/string16.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// The media layer can't access Chrome's resource bundle directly. This facility
-// allows clients to provide indirect access.
-
-// IDs that will get mapped to corresponding entries with IDS_ prefixes in
-// chrome/app/generated_resources.grd.
-enum MessageId {
-  DEFAULT_AUDIO_DEVICE_NAME,
-#if defined(OS_WIN)
-  COMMUNICATIONS_AUDIO_DEVICE_NAME,
-#endif
-#if defined(OS_CHROMEOS)
-  BEAMFORMING_ON_DEFAULT_AUDIO_INPUT_DEVICE_NAME,
-  BEAMFORMING_OFF_DEFAULT_AUDIO_INPUT_DEVICE_NAME,
-#endif
-};
-
-// Implementations are expected to convert MessageIds to generated_resources.grd
-// IDs and extract the matching string from Chrome's resource bundle (e.g.
-// through l10n_util::GetStringUTF16).
-using LocalizedStringProvider = base::string16 (*)(MessageId message_id);
-
-// Initializes the global LocalizedStringProvider function.
-MEDIA_EXPORT void SetLocalizedStringProvider(LocalizedStringProvider func);
-
-#if !defined(OS_IOS)
-// The LocalizedStringProvider has probably not been initialized on iOS. This
-// will give an early compile warning for clients attempting to use it.
-
-// Returns a resource string corresponding to |message_id|. See l10n_util.h.
-// Returns an empty string if the LocalizedStringProvider has not been
-// initialized or if the ID is unrecognized.
-std::string GetLocalizedStringUTF8(MessageId message_id);
-base::string16 GetLocalizedStringUTF16(MessageId message_id);
-#endif
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_RESOURCES_H_
diff --git a/cobalt/media/base/media_track.cc b/cobalt/media/base/media_track.cc
deleted file mode 100644
index 6c6e8e9..0000000
--- a/cobalt/media/base/media_track.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 "cobalt/media/base/media_track.h"
-
-namespace cobalt {
-namespace media {
-
-MediaTrack::MediaTrack(Type type, StreamParser::TrackId bytestream_track_id,
-                       const std::string& kind, const std::string& label,
-                       const std::string& lang)
-    : type_(type),
-      bytestream_track_id_(bytestream_track_id),
-      kind_(kind),
-      label_(label),
-      language_(lang) {}
-
-MediaTrack::~MediaTrack() {}
-
-const char* TrackTypeToStr(MediaTrack::Type type) {
-  switch (type) {
-    case MediaTrack::Audio:
-      return "audio";
-    case MediaTrack::Text:
-      return "text";
-    case MediaTrack::Video:
-      return "video";
-  }
-  NOTREACHED();
-  return "INVALID";
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_track.h b/cobalt/media/base/media_track.h
deleted file mode 100644
index 9b8b13a..0000000
--- a/cobalt/media/base/media_track.h
+++ /dev/null
@@ -1,68 +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 COBALT_MEDIA_BASE_MEDIA_TRACK_H_
-#define COBALT_MEDIA_BASE_MEDIA_TRACK_H_
-
-#include <string>
-
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/stream_parser.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT MediaTrack {
- public:
-  enum Type { Text, Audio, Video };
-  typedef std::string Id;
-  MediaTrack(Type type, StreamParser::TrackId bytestream_track_id,
-             const std::string& kind, const std::string& label,
-             const std::string& lang);
-  ~MediaTrack();
-
-  Type type() const { return type_; }
-
-  StreamParser::TrackId bytestream_track_id() const {
-    return bytestream_track_id_;
-  }
-  const std::string& kind() const { return kind_; }
-  const std::string& label() const { return label_; }
-  const std::string& language() const { return language_; }
-
-  Id id() const { return id_; }
-  void set_id(Id id) {
-    DCHECK(id_.empty());
-    DCHECK(!id.empty());
-    id_ = id;
-  }
-
- private:
-  Type type_;
-
-  // |bytestream_track_id_| is read from the bytestream and is guaranteed to be
-  // unique only within the scope of single bytestream's initialization segment.
-  // But we might have multiple bytestreams (MediaSource might have multiple
-  // SourceBuffers attached to it, which translates into ChunkDemuxer having
-  // multiple SourceBufferStates and multiple bytestreams) or subsequent init
-  // segments may redefine the bytestream ids. Thus bytestream track ids are not
-  // guaranteed to be unique at the Demuxer and HTMLMediaElement level. So we
-  // generate truly unique media track |id_| on the Demuxer level.
-  StreamParser::TrackId bytestream_track_id_;
-  Id id_;
-
-  // These properties are read from input streams by stream parsers as specified
-  // in https://dev.w3.org/html5/html-sourcing-inband-tracks/.
-  std::string kind_;
-  std::string label_;
-  std::string language_;
-};
-
-// Helper for logging.
-MEDIA_EXPORT const char* TrackTypeToStr(MediaTrack::Type type);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_TRACK_H_
diff --git a/cobalt/media/base/media_tracks.cc b/cobalt/media/base/media_tracks.cc
deleted file mode 100644
index ac741c8..0000000
--- a/cobalt/media/base/media_tracks.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-
-#include "cobalt/media/base/media_tracks.h"
-
-#include "base/bind.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/video_decoder_config.h"
-
-namespace cobalt {
-namespace media {
-
-MediaTracks::MediaTracks() {}
-
-MediaTracks::~MediaTracks() {}
-
-MediaTrack* MediaTracks::AddAudioTrack(
-    const AudioDecoderConfig& config, StreamParser::TrackId bytestream_track_id,
-    const std::string& kind, const std::string& label,
-    const std::string& language) {
-  DCHECK(config.IsValidConfig());
-  CHECK(audio_configs_.find(bytestream_track_id) == audio_configs_.end());
-  std::unique_ptr<MediaTrack> track(new MediaTrack(
-      MediaTrack::Audio, bytestream_track_id, kind, label, language));
-  MediaTrack* track_ptr = track.get();
-  tracks_.push_back(std::move(track));
-  audio_configs_[bytestream_track_id] = config;
-  return track_ptr;
-}
-
-MediaTrack* MediaTracks::AddVideoTrack(
-    const VideoDecoderConfig& config, StreamParser::TrackId bytestream_track_id,
-    const std::string& kind, const std::string& label,
-    const std::string& language) {
-  DCHECK(config.IsValidConfig());
-  CHECK(video_configs_.find(bytestream_track_id) == video_configs_.end());
-  std::unique_ptr<MediaTrack> track(new MediaTrack(
-      MediaTrack::Video, bytestream_track_id, kind, label, language));
-  MediaTrack* track_ptr = track.get();
-  tracks_.push_back(std::move(track));
-  video_configs_[bytestream_track_id] = config;
-  return track_ptr;
-}
-
-const AudioDecoderConfig& MediaTracks::getAudioConfig(
-    StreamParser::TrackId bytestream_track_id) const {
-  std::map<StreamParser::TrackId, AudioDecoderConfig>::const_iterator it =
-      audio_configs_.find(bytestream_track_id);
-  if (it != audio_configs_.end()) return it->second;
-  static AudioDecoderConfig invalidConfig;
-  return invalidConfig;
-}
-
-const VideoDecoderConfig& MediaTracks::getVideoConfig(
-    StreamParser::TrackId bytestream_track_id) const {
-  std::map<StreamParser::TrackId, VideoDecoderConfig>::const_iterator it =
-      video_configs_.find(bytestream_track_id);
-  if (it != video_configs_.end()) return it->second;
-  static VideoDecoderConfig invalidConfig;
-  return invalidConfig;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_tracks.h b/cobalt/media/base/media_tracks.h
deleted file mode 100644
index 231b888..0000000
--- a/cobalt/media/base/media_tracks.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 COBALT_MEDIA_BASE_MEDIA_TRACKS_H_
-#define COBALT_MEDIA_BASE_MEDIA_TRACKS_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_track.h"
-
-namespace cobalt {
-namespace media {
-
-class AudioDecoderConfig;
-class VideoDecoderConfig;
-
-class MEDIA_EXPORT MediaTracks {
- public:
-  typedef std::vector<std::unique_ptr<MediaTrack>> MediaTracksCollection;
-
-  MediaTracks();
-  ~MediaTracks();
-
-  // Adds a new audio track. The |bytestreamTrackId| must uniquely identify the
-  // track within the bytestream.
-  MediaTrack* AddAudioTrack(const AudioDecoderConfig& config,
-                            StreamParser::TrackId bytestream_track_id,
-                            const std::string& kind, const std::string& label,
-                            const std::string& language);
-  // Adds a new video track. The |bytestreamTrackId| must uniquely identify the
-  // track within the bytestream.
-  MediaTrack* AddVideoTrack(const VideoDecoderConfig& config,
-                            StreamParser::TrackId bytestream_track_id,
-                            const std::string& kind, const std::string& label,
-                            const std::string& language);
-
-  const MediaTracksCollection& tracks() const { return tracks_; }
-  MediaTracksCollection& tracks() { return tracks_; }
-
-  const AudioDecoderConfig& getAudioConfig(
-      StreamParser::TrackId bytestream_track_id) const;
-  const VideoDecoderConfig& getVideoConfig(
-      StreamParser::TrackId bytestream_track_id) const;
-
- private:
-  MediaTracksCollection tracks_;
-  std::map<StreamParser::TrackId, AudioDecoderConfig> audio_configs_;
-  std::map<StreamParser::TrackId, VideoDecoderConfig> video_configs_;
-
-  DISALLOW_COPY_AND_ASSIGN(MediaTracks);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_TRACKS_H_
diff --git a/cobalt/media/base/media_url_demuxer.cc b/cobalt/media/base/media_url_demuxer.cc
deleted file mode 100644
index 261f4e4..0000000
--- a/cobalt/media/base/media_url_demuxer.cc
+++ /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.
-
-#include "cobalt/media/base/media_url_demuxer.h"
-
-#include "base/bind.h"
-
-namespace cobalt {
-namespace media {
-
-MediaUrlDemuxer::MediaUrlDemuxer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-    const GURL& url)
-    : url_(url), task_runner_(task_runner) {}
-
-MediaUrlDemuxer::~MediaUrlDemuxer() {}
-
-// Should never be called since DemuxerStreamProvider::Type is URL.
-DemuxerStream* MediaUrlDemuxer::GetStream(DemuxerStream::Type type) {
-  NOTREACHED();
-  return NULL;
-}
-
-GURL MediaUrlDemuxer::GetUrl() const { return url_; }
-
-DemuxerStreamProvider::Type MediaUrlDemuxer::GetType() const {
-  return DemuxerStreamProvider::Type::URL;
-}
-
-std::string MediaUrlDemuxer::GetDisplayName() const {
-  return "MediaUrlDemuxer";
-}
-
-void MediaUrlDemuxer::Initialize(DemuxerHost* host,
-                                 const PipelineStatusCB& status_cb,
-                                 bool enable_text_tracks) {
-  DVLOG(1) << __FUNCTION__;
-  task_runner_->PostTask(FROM_HERE, base::Bind(status_cb, PIPELINE_OK));
-}
-
-void MediaUrlDemuxer::StartWaitingForSeek(base::TimeDelta seek_time) {}
-
-void MediaUrlDemuxer::CancelPendingSeek(base::TimeDelta seek_time) {}
-
-void MediaUrlDemuxer::Seek(base::TimeDelta time,
-                           const PipelineStatusCB& status_cb) {
-  task_runner_->PostTask(FROM_HERE, base::Bind(status_cb, PIPELINE_OK));
-}
-
-void MediaUrlDemuxer::Stop() {}
-
-void MediaUrlDemuxer::AbortPendingReads() {}
-
-base::TimeDelta MediaUrlDemuxer::GetStartTime() const {
-  // TODO(tguilbert): Investigate if we need to fetch information from the
-  // MediaPlayerRender in order to return a sensible value here.
-  return base::TimeDelta();
-}
-base::Time MediaUrlDemuxer::GetTimelineOffset() const { return base::Time(); }
-
-int64_t MediaUrlDemuxer::GetMemoryUsage() const { return 0; }
-
-void MediaUrlDemuxer::OnEnabledAudioTracksChanged(
-    const std::vector<MediaTrack::Id>& track_ids, base::TimeDelta currTime) {
-  NOTIMPLEMENTED();
-}
-void MediaUrlDemuxer::OnSelectedVideoTrackChanged(
-    const std::vector<MediaTrack::Id>& track_ids, base::TimeDelta currTime) {
-  NOTIMPLEMENTED();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_url_demuxer.h b/cobalt/media/base/media_url_demuxer.h
deleted file mode 100644
index adffadf..0000000
--- a/cobalt/media/base/media_url_demuxer.h
+++ /dev/null
@@ -1,72 +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 COBALT_MEDIA_BASE_MEDIA_URL_DEMUXER_H_
-#define COBALT_MEDIA_BASE_MEDIA_URL_DEMUXER_H_
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/weak_ptr.h"
-#include "cobalt/media/base/demuxer.h"
-#include "starboard/types.h"
-#include "url/gurl.h"
-
-namespace cobalt {
-namespace media {
-
-// Class that saves a URL for later retrieval. To be used in conjunction with
-// the MediaPlayerRenderer.
-//
-// Its primary purpose is to act as a dummy Demuxer, when there is no need
-// for DemuxerStreams (e.g. in the MediaPlayerRenderer case). For the most part,
-// its implementation of the Demuxer are NOPs that return the default values and
-// fire any provided callbacks immediately.
-//
-// If Pipeline where to be refactored to use a DemuxerStreamProvider instead of
-// a Demuxer, MediaUrlDemuxer should be refactored to inherit directly from
-// DemuxerStreamProvider.
-class MEDIA_EXPORT MediaUrlDemuxer : public Demuxer {
- public:
-  MediaUrlDemuxer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-      const GURL& url);
-  ~MediaUrlDemuxer() override;
-
-  // DemuxerStreamProvider interface.
-  DemuxerStream* GetStream(DemuxerStream::Type type) override;
-  GURL GetUrl() const override;
-  DemuxerStreamProvider::Type GetType() const override;
-
-  // Demuxer interface.
-  std::string GetDisplayName() const override;
-  void Initialize(DemuxerHost* host, const PipelineStatusCB& status_cb,
-                  bool enable_text_tracks) override;
-  void StartWaitingForSeek(base::TimeDelta seek_time) override;
-  void CancelPendingSeek(base::TimeDelta seek_time) override;
-  void Seek(base::TimeDelta time, const PipelineStatusCB& status_cb) override;
-  void Stop() override;
-  void AbortPendingReads() override;
-  base::TimeDelta GetStartTime() const override;
-  base::Time GetTimelineOffset() const override;
-  int64_t GetMemoryUsage() const override;
-  void OnEnabledAudioTracksChanged(const std::vector<MediaTrack::Id>& track_ids,
-                                   base::TimeDelta currTime) override;
-  void OnSelectedVideoTrackChanged(const std::vector<MediaTrack::Id>& track_ids,
-                                   base::TimeDelta currTime) override;
-
- private:
-  GURL url_;
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(MediaUrlDemuxer);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_URL_DEMUXER_H_
diff --git a/cobalt/media/base/media_url_demuxer_unittest.cc b/cobalt/media/base/media_url_demuxer_unittest.cc
deleted file mode 100644
index 45d5e3e..0000000
--- a/cobalt/media/base/media_url_demuxer_unittest.cc
+++ /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.
-
-#include "cobalt/media/base/media_url_demuxer.h"
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class MediaUrlDemuxerTest : public testing::Test {
- public:
-  MediaUrlDemuxerTest() : default_url_("http://example.com/") {}
-
-  void InitializeTest(const GURL& gurl) {
-    demuxer_.reset(
-        new MediaUrlDemuxer(base::ThreadTaskRunnerHandle::Get(), gurl));
-  }
-
-  void InitializeTest() { InitializeTest(default_url_); }
-
-  void VerifyCallbackOk(PipelineStatus status) {
-    EXPECT_EQ(PIPELINE_OK, status);
-  }
-
-  GURL default_url_;
-  std::unique_ptr<Demuxer> demuxer_;
-
-  // Necessary, or else base::ThreadTaskRunnerHandle::Get() fails.
-  base::MessageLoop message_loop_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MediaUrlDemuxerTest);
-};
-
-TEST_F(MediaUrlDemuxerTest, BaseCase) {
-  InitializeTest();
-
-  EXPECT_EQ(DemuxerStreamProvider::Type::URL, demuxer_->GetType());
-  EXPECT_EQ(default_url_, demuxer_->GetUrl());
-}
-
-TEST_F(MediaUrlDemuxerTest, AcceptsEmptyStrings) {
-  InitializeTest(GURL());
-
-  EXPECT_EQ(GURL::EmptyGURL(), demuxer_->GetUrl());
-}
-
-TEST_F(MediaUrlDemuxerTest, InitializeReturnsPipelineOk) {
-  InitializeTest();
-  demuxer_->Initialize(NULL,
-                       base::Bind(&MediaUrlDemuxerTest::VerifyCallbackOk,
-                                  base::Unretained(this)),
-                       false);
-
-  base::RunLoop().RunUntilIdle();
-}
-
-TEST_F(MediaUrlDemuxerTest, SeekReturnsPipelineOk) {
-  InitializeTest();
-  demuxer_->Seek(base::TimeDelta(),
-                 base::Bind(&MediaUrlDemuxerTest::VerifyCallbackOk,
-                            base::Unretained(this)));
-
-  base::RunLoop().RunUntilIdle();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_util.cc b/cobalt/media/base/media_util.cc
deleted file mode 100644
index 95375c7..0000000
--- a/cobalt/media/base/media_util.cc
+++ /dev/null
@@ -1,22 +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 "cobalt/media/base/media_util.h"
-
-#include "cobalt/media/base/encryption_pattern.h"
-
-namespace cobalt {
-namespace media {
-
-std::vector<uint8_t> EmptyExtraData() { return std::vector<uint8_t>(); }
-
-EncryptionScheme Unencrypted() { return EncryptionScheme(); }
-
-EncryptionScheme AesCtrEncryptionScheme() {
-  return EncryptionScheme(EncryptionScheme::CIPHER_MODE_AES_CTR,
-                          EncryptionPattern());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/media_util.h b/cobalt/media/base/media_util.h
deleted file mode 100644
index 8a33950..0000000
--- a/cobalt/media/base/media_util.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 COBALT_MEDIA_BASE_MEDIA_UTIL_H_
-#define COBALT_MEDIA_BASE_MEDIA_UTIL_H_
-
-#include <vector>
-
-#include "cobalt/media/base/encryption_scheme.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Simply returns an empty vector. {Audio|Video}DecoderConfig are often
-// constructed with empty extra data.
-MEDIA_EXPORT std::vector<uint8_t> EmptyExtraData();
-
-// The following helper functions return new instances of EncryptionScheme that
-// indicate widely used settings.
-MEDIA_EXPORT EncryptionScheme Unencrypted();
-MEDIA_EXPORT EncryptionScheme AesCtrEncryptionScheme();
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MEDIA_UTIL_H_
diff --git a/cobalt/media/base/mime_util.cc b/cobalt/media/base/mime_util.cc
deleted file mode 100644
index 298cb76..0000000
--- a/cobalt/media/base/mime_util.cc
+++ /dev/null
@@ -1,43 +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.
-
-#include "cobalt/media/base/mime_util.h"
-
-#include "base/lazy_instance.h"
-#include "cobalt/media/base/mime_util_internal.h"
-
-namespace cobalt {
-namespace media {
-
-// This variable is Leaky because it is accessed from WorkerPool threads.
-static base::LazyInstance<internal::MimeUtil>::DestructorAtExit
-    g_media_mime_util = LAZY_INSTANCE_INITIALIZER;
-
-bool IsSupportedMediaMimeType(const std::string& mime_type) {
-  return g_media_mime_util.Pointer()->IsSupportedMediaMimeType(mime_type);
-}
-
-SupportsType IsSupportedMediaFormat(const std::string& mime_type,
-                                    const std::vector<std::string>& codecs) {
-  return g_media_mime_util.Pointer()->IsSupportedMediaFormat(mime_type, codecs,
-                                                             false);
-}
-
-SupportsType IsSupportedEncryptedMediaFormat(
-    const std::string& mime_type, const std::vector<std::string>& codecs) {
-  return g_media_mime_util.Pointer()->IsSupportedMediaFormat(mime_type, codecs,
-                                                             true);
-}
-
-void ParseCodecString(const std::string& codecs,
-                      std::vector<std::string>* codecs_out, bool strip) {
-  g_media_mime_util.Pointer()->ParseCodecString(codecs, codecs_out, strip);
-}
-
-void RemoveProprietaryMediaTypesAndCodecsForTests() {
-  g_media_mime_util.Pointer()->RemoveProprietaryMediaTypesAndCodecs();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/mime_util.h b/cobalt/media/base/mime_util.h
deleted file mode 100644
index 8479329..0000000
--- a/cobalt/media/base/mime_util.h
+++ /dev/null
@@ -1,69 +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 COBALT_MEDIA_BASE_MIME_UTIL_H_
-#define COBALT_MEDIA_BASE_MIME_UTIL_H_
-
-#include <string>
-#include <vector>
-
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// Check to see if a particular MIME type is in the list of
-// supported/recognized MIME types.
-MEDIA_EXPORT bool IsSupportedMediaMimeType(const std::string& mime_type);
-
-// Parses a codec string, populating |codecs_out| with the prefix of each codec
-// in the string |codecs_in|. For example, passed "aaa.b.c,dd.eee", if
-// |strip| == true |codecs_out| will contain {"aaa", "dd"}, if |strip| == false
-// |codecs_out| will contain {"aaa.b.c", "dd.eee"}.
-// See http://www.ietf.org/rfc/rfc4281.txt.
-MEDIA_EXPORT void ParseCodecString(const std::string& codecs,
-                                   std::vector<std::string>* codecs_out,
-                                   bool strip);
-
-// Indicates that the MIME type and (possible codec string) are supported.
-enum SupportsType {
-  // The given MIME type and codec combination is not supported.
-  IsNotSupported,
-
-  // The given MIME type and codec combination is supported.
-  IsSupported,
-
-  // There's not enough information to determine if the given MIME type and
-  // codec combination can be rendered or not before actually trying to play it.
-  MayBeSupported
-};
-
-// Checks the |mime_type| and |codecs| against the MIME types known to support
-// only a particular subset of codecs.
-// * Returns IsSupported if the |mime_type| is supported and all the codecs
-//   within the |codecs| are supported for the |mime_type|.
-// * Returns MayBeSupported if the |mime_type| is supported and is known to
-//   support only a subset of codecs, but |codecs| was empty. Also returned if
-//   all the codecs in |codecs| are supported, but additional codec parameters
-//   were supplied (such as profile) for which the support cannot be decided.
-// * Returns IsNotSupported if either the |mime_type| is not supported or the
-//   |mime_type| is supported but at least one of the codecs within |codecs| is
-//   not supported for the |mime_type|.
-MEDIA_EXPORT SupportsType IsSupportedMediaFormat(
-    const std::string& mime_type, const std::vector<std::string>& codecs);
-
-// Similar to the above, but for encrypted formats.
-MEDIA_EXPORT SupportsType IsSupportedEncryptedMediaFormat(
-    const std::string& mime_type, const std::vector<std::string>& codecs);
-
-// Test only method that removes proprietary media types and codecs from the
-// list of supported MIME types and codecs. These types and codecs must be
-// removed to ensure consistent layout test results across all Chromium
-// variations.
-MEDIA_EXPORT void RemoveProprietaryMediaTypesAndCodecsForTests();
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MIME_UTIL_H_
diff --git a/cobalt/media/base/mime_util_internal.cc b/cobalt/media/base/mime_util_internal.cc
deleted file mode 100644
index b873eb9..0000000
--- a/cobalt/media/base/mime_util_internal.cc
+++ /dev/null
@@ -1,682 +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.
-
-#include "cobalt/media/base/mime_util_internal.h"
-
-#include "base/command_line.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/media.h"
-#include "cobalt/media/base/video_codecs.h"
-
-#if defined(OS_ANDROID)
-#include "base/android/build_info.h"
-#include "cobalt/media/base/android/media_codec_util.h"
-#endif
-
-namespace cobalt {
-namespace media {
-namespace internal {
-
-struct CodecIDMappings {
-  const char* const codec_id;
-  MimeUtil::Codec codec;
-};
-
-// List of codec IDs that provide enough information to determine the
-// codec and profile being requested.
-//
-// The "mp4a" strings come from RFC 6381.
-static const CodecIDMappings kUnambiguousCodecStringMap[] = {
-    {"1", MimeUtil::PCM},  // We only allow this for WAV so it isn't ambiguous.
-    // avc1/avc3.XXXXXX may be unambiguous; handled by ParseAVCCodecId().
-    // hev1/hvc1.XXXXXX may be unambiguous; handled by ParseHEVCCodecID().
-    // vp9, vp9.0, vp09.xx.xx.xx.xx.xx.xx.xx may be unambiguous; handled by
-    // ParseVp9CodecID().
-    {"mp3", MimeUtil::MP3},
-    // Following is the list of RFC 6381 compliant audio codec strings:
-    //   mp4a.66     - MPEG-2 AAC MAIN
-    //   mp4a.67     - MPEG-2 AAC LC
-    //   mp4a.68     - MPEG-2 AAC SSR
-    //   mp4a.69     - MPEG-2 extension to MPEG-1 (MP3)
-    //   mp4a.6B     - MPEG-1 audio (MP3)
-    //   mp4a.40.2   - MPEG-4 AAC LC
-    //   mp4a.40.02  - MPEG-4 AAC LC (leading 0 in aud-oti for compatibility)
-    //   mp4a.40.5   - MPEG-4 HE-AAC v1 (AAC LC + SBR)
-    //   mp4a.40.05  - MPEG-4 HE-AAC v1 (AAC LC + SBR) (leading 0 in aud-oti for
-    //                 compatibility)
-    //   mp4a.40.29  - MPEG-4 HE-AAC v2 (AAC LC + SBR + PS)
-    {"mp4a.66", MimeUtil::MPEG2_AAC},
-    {"mp4a.67", MimeUtil::MPEG2_AAC},
-    {"mp4a.68", MimeUtil::MPEG2_AAC},
-    {"mp4a.69", MimeUtil::MP3},
-    {"mp4a.6B", MimeUtil::MP3},
-    {"mp4a.40.2", MimeUtil::MPEG4_AAC},
-    {"mp4a.40.02", MimeUtil::MPEG4_AAC},
-    {"mp4a.40.5", MimeUtil::MPEG4_AAC},
-    {"mp4a.40.05", MimeUtil::MPEG4_AAC},
-    {"mp4a.40.29", MimeUtil::MPEG4_AAC},
-    // TODO(servolk): Strictly speaking only mp4a.A5 and mp4a.A6 codec ids are
-    // valid according to RFC 6381 section 3.3, 3.4. Lower-case oti (mp4a.a5 and
-    // mp4a.a6) should be rejected. But we used to allow those in older versions
-    // of Chromecast firmware and some apps (notably MPL) depend on those codec
-    // types being supported, so they should be allowed for now
-    // (crbug.com/564960).
-    {"ac-3", MimeUtil::AC3},
-    {"mp4a.a5", MimeUtil::AC3},
-    {"mp4a.A5", MimeUtil::AC3},
-    {"ec-3", MimeUtil::EAC3},
-    {"mp4a.a6", MimeUtil::EAC3},
-    {"mp4a.A6", MimeUtil::EAC3},
-    {"vorbis", MimeUtil::VORBIS},
-    {"opus", MimeUtil::OPUS},
-    {"vp8", MimeUtil::VP8},
-    {"vp8.0", MimeUtil::VP8},
-    {"theora", MimeUtil::THEORA}};
-
-// List of codec IDs that are ambiguous and don't provide
-// enough information to determine the codec and profile.
-// The codec in these entries indicate the codec and profile
-// we assume the user is trying to indicate.
-static const CodecIDMappings kAmbiguousCodecStringMap[] = {
-    {"mp4a.40", MimeUtil::MPEG4_AAC},
-    {"avc1", MimeUtil::H264},
-    {"avc3", MimeUtil::H264},
-    // avc1/avc3.XXXXXX may be ambiguous; handled by ParseAVCCodecId().
-};
-
-static const char kHexString[] = "0123456789ABCDEF";
-static char IntToHex(int i) {
-  DCHECK_GE(i, 0) << i << " not a hex value";
-  DCHECK_LE(i, 15) << i << " not a hex value";
-  return kHexString[i];
-}
-
-static std::string TranslateLegacyAvc1CodecIds(const std::string& codec_id) {
-  // Special handling for old, pre-RFC 6381 format avc1 strings, which are still
-  // being used by some HLS apps to preserve backward compatibility with older
-  // iOS devices. The old format was avc1.<profile>.<level>
-  // Where <profile> is H.264 profile_idc encoded as a decimal number, i.e.
-  // 66 is baseline profile (0x42)
-  // 77 is main profile (0x4d)
-  // 100 is high profile (0x64)
-  // And <level> is H.264 level multiplied by 10, also encoded as decimal number
-  // E.g. <level> 31 corresponds to H.264 level 3.1
-  // See, for example, http://qtdevseed.apple.com/qadrift/testcases/tc-0133.php
-  uint32_t level_start = 0;
-  std::string result;
-  if (StartsWith(codec_id, "avc1.66.", base::CompareCase::SENSITIVE)) {
-    level_start = 8;
-    result = "avc1.4200";
-  } else if (StartsWith(codec_id, "avc1.77.", base::CompareCase::SENSITIVE)) {
-    level_start = 8;
-    result = "avc1.4D00";
-  } else if (StartsWith(codec_id, "avc1.100.", base::CompareCase::SENSITIVE)) {
-    level_start = 9;
-    result = "avc1.6400";
-  }
-
-  uint32_t level = 0;
-  if (level_start > 0 &&
-      base::StringToUint(codec_id.substr(level_start), &level) && level < 256) {
-    // This is a valid legacy avc1 codec id - return the codec id translated
-    // into RFC 6381 format.
-    result.push_back(IntToHex(level >> 4));
-    result.push_back(IntToHex(level & 0xf));
-    return result;
-  }
-
-  // This is not a valid legacy avc1 codec id - return the original codec id.
-  return codec_id;
-}
-
-static bool ParseVp9CodecID(const std::string& mime_type_lower_case,
-                            const std::string& codec_id,
-                            VideoCodecProfile* out_profile,
-                            uint8_t* out_level) {
-  if (mime_type_lower_case == "video/mp4") {
-    return ParseNewStyleVp9CodecID(codec_id, out_profile, out_level);
-  } else if (mime_type_lower_case == "video/webm") {
-    // Only legacy codec strings are supported in WebM.
-    // TODO(kqyang): Should we support new codec string in WebM?
-    return ParseLegacyVp9CodecID(codec_id, out_profile, out_level);
-  }
-  return false;
-}
-
-static bool IsValidH264Level(uint8_t level_idc) {
-  // Valid levels taken from Table A-1 in ISO/IEC 14496-10.
-  // Level_idc represents the standard level represented as decimal number
-  // multiplied by ten, e.g. level_idc==32 corresponds to level==3.2
-  return ((level_idc >= 10 && level_idc <= 13) ||
-          (level_idc >= 20 && level_idc <= 22) ||
-          (level_idc >= 30 && level_idc <= 32) ||
-          (level_idc >= 40 && level_idc <= 42) ||
-          (level_idc >= 50 && level_idc <= 51));
-}
-
-MimeUtil::MimeUtil() : allow_proprietary_codecs_(false) {
-#if defined(OS_ANDROID)
-  platform_info_.is_unified_media_pipeline_enabled =
-      IsUnifiedMediaPipelineEnabled();
-  // When the unified media pipeline is enabled, we need support for both GPU
-  // video decoders and MediaCodec; indicated by HasPlatformDecoderSupport().
-  // When the Android pipeline is used, we only need access to MediaCodec.
-  platform_info_.has_platform_decoders = ArePlatformDecodersAvailable();
-  platform_info_.has_platform_vp8_decoder =
-      MediaCodecUtil::IsVp8DecoderAvailable();
-  platform_info_.has_platform_vp9_decoder =
-      MediaCodecUtil::IsVp9DecoderAvailable();
-  platform_info_.supports_opus = PlatformHasOpusSupport();
-#endif
-
-  InitializeMimeTypeMaps();
-}
-
-MimeUtil::~MimeUtil() {}
-
-VideoCodec MimeUtilToVideoCodec(MimeUtil::Codec codec) {
-  switch (codec) {
-    case MimeUtil::H264:
-      return kCodecH264;
-    case MimeUtil::HEVC:
-      return kCodecHEVC;
-    case MimeUtil::VP8:
-      return kCodecVP8;
-    case MimeUtil::VP9:
-      return kCodecVP9;
-    case MimeUtil::THEORA:
-      return kCodecTheora;
-    case MimeUtil::INVALID_CODEC:
-    case MimeUtil::PCM:
-    case MimeUtil::MP3:
-    case MimeUtil::AC3:
-    case MimeUtil::EAC3:
-    case MimeUtil::MPEG2_AAC:
-    case MimeUtil::MPEG4_AAC:
-    case MimeUtil::VORBIS:
-    case MimeUtil::OPUS:
-      break;
-  }
-  return kUnknownVideoCodec;
-}
-
-SupportsType MimeUtil::AreSupportedCodecs(
-    const CodecSet& supported_codecs, const std::vector<std::string>& codecs,
-    const std::string& mime_type_lower_case, bool is_encrypted) const {
-  DCHECK(!supported_codecs.empty());
-  DCHECK(!codecs.empty());
-
-  SupportsType result = IsSupported;
-  for (size_t i = 0; i < codecs.size(); ++i) {
-    bool is_ambiguous = true;
-    Codec codec = INVALID_CODEC;
-    VideoCodecProfile video_profile = VIDEO_CODEC_PROFILE_UNKNOWN;
-    uint8_t video_level = 0;
-    if (!StringToCodec(mime_type_lower_case, codecs[i], &codec, &is_ambiguous,
-                       &video_profile, &video_level, is_encrypted)) {
-      return IsNotSupported;
-    }
-
-    VideoCodec video_codec = MimeUtilToVideoCodec(codec);
-
-    if (!IsCodecSupported(codec, mime_type_lower_case, is_encrypted) ||
-        supported_codecs.find(codec) == supported_codecs.end()) {
-      return IsNotSupported;
-    }
-
-    if (is_ambiguous) result = MayBeSupported;
-  }
-
-  return result;
-}
-
-void MimeUtil::InitializeMimeTypeMaps() {
-#if defined(USE_PROPRIETARY_CODECS)
-  allow_proprietary_codecs_ = true;
-#endif
-
-  for (size_t i = 0; i < arraysize(kUnambiguousCodecStringMap); ++i) {
-    string_to_codec_map_[kUnambiguousCodecStringMap[i].codec_id] =
-        CodecEntry(kUnambiguousCodecStringMap[i].codec, false);
-  }
-
-  for (size_t i = 0; i < arraysize(kAmbiguousCodecStringMap); ++i) {
-    string_to_codec_map_[kAmbiguousCodecStringMap[i].codec_id] =
-        CodecEntry(kAmbiguousCodecStringMap[i].codec, true);
-  }
-
-  AddSupportedMediaFormats();
-}
-
-// Each call to AddContainerWithCodecs() contains a media type
-// (https://en.wikipedia.org/wiki/Media_type) and corresponding media codec(s)
-// supported by these types/containers.
-// TODO(ddorwin): Replace insert() calls with initializer_list when allowed.
-void MimeUtil::AddSupportedMediaFormats() {
-  CodecSet implicit_codec;
-  CodecSet wav_codecs;
-  wav_codecs.insert(PCM);
-
-  CodecSet ogg_audio_codecs;
-  ogg_audio_codecs.insert(OPUS);
-  ogg_audio_codecs.insert(VORBIS);
-  CodecSet ogg_video_codecs;
-#if !defined(OS_ANDROID)
-  ogg_video_codecs.insert(THEORA);
-#endif  // !defined(OS_ANDROID)
-  CodecSet ogg_codecs(ogg_audio_codecs);
-  ogg_codecs.insert(ogg_video_codecs.begin(), ogg_video_codecs.end());
-
-  CodecSet webm_audio_codecs;
-  webm_audio_codecs.insert(OPUS);
-  webm_audio_codecs.insert(VORBIS);
-  CodecSet webm_video_codecs;
-  webm_video_codecs.insert(VP8);
-  webm_video_codecs.insert(VP9);
-  CodecSet webm_codecs(webm_audio_codecs);
-  webm_codecs.insert(webm_video_codecs.begin(), webm_video_codecs.end());
-
-  CodecSet mp3_codecs;
-  mp3_codecs.insert(MP3);
-
-  CodecSet aac;
-  aac.insert(MPEG2_AAC);
-  aac.insert(MPEG4_AAC);
-
-  CodecSet avc_and_aac(aac);
-  avc_and_aac.insert(H264);
-
-  CodecSet mp4_audio_codecs(aac);
-  mp4_audio_codecs.insert(MP3);
-  mp4_audio_codecs.insert(AC3);
-  mp4_audio_codecs.insert(EAC3);
-
-  CodecSet mp4_video_codecs;
-  mp4_video_codecs.insert(H264);
-  mp4_video_codecs.insert(HEVC);
-  // Only VP9 with valid codec string vp09.xx.xx.xx.xx.xx.xx.xx is supported.
-  // See ParseVp9CodecID for details.
-  mp4_video_codecs.insert(VP9);
-  CodecSet mp4_codecs(mp4_audio_codecs);
-  mp4_codecs.insert(mp4_video_codecs.begin(), mp4_video_codecs.end());
-
-  AddContainerWithCodecs("audio/wav", wav_codecs, false);
-  AddContainerWithCodecs("audio/x-wav", wav_codecs, false);
-  AddContainerWithCodecs("audio/webm", webm_audio_codecs, false);
-  DCHECK(!webm_video_codecs.empty());
-  AddContainerWithCodecs("video/webm", webm_codecs, false);
-  AddContainerWithCodecs("audio/ogg", ogg_audio_codecs, false);
-  // video/ogg is only supported if an appropriate video codec is supported.
-  // Note: This assumes such codecs cannot be later excluded.
-  if (!ogg_video_codecs.empty())
-    AddContainerWithCodecs("video/ogg", ogg_codecs, false);
-  // TODO(ddorwin): Should the application type support Opus?
-  AddContainerWithCodecs("application/ogg", ogg_codecs, false);
-
-  AddContainerWithCodecs("audio/mpeg", mp3_codecs, true);  // Allow "mp3".
-  AddContainerWithCodecs("audio/mp3", implicit_codec, true);
-  AddContainerWithCodecs("audio/x-mp3", implicit_codec, true);
-  AddContainerWithCodecs("audio/aac", implicit_codec, true);  // AAC / ADTS.
-  AddContainerWithCodecs("audio/mp4", mp4_audio_codecs, true);
-  DCHECK(!mp4_video_codecs.empty());
-  AddContainerWithCodecs("video/mp4", mp4_codecs, true);
-  // These strings are supported for backwards compatibility only and thus only
-  // support the codecs needed for compatibility.
-  AddContainerWithCodecs("audio/x-m4a", aac, true);
-  AddContainerWithCodecs("video/x-m4v", avc_and_aac, true);
-
-  // TODO(ddorwin): Exactly which codecs should be supported?
-  DCHECK(!mp4_video_codecs.empty());
-  AddContainerWithCodecs("video/mp2t", mp4_codecs, true);
-#if defined(OS_ANDROID)
-  // HTTP Live Streaming (HLS).
-  // TODO(ddorwin): Is any MP3 codec string variant included in real queries?
-  CodecSet hls_codecs(avc_and_aac);
-  hls_codecs.insert(MP3);
-  AddContainerWithCodecs("application/x-mpegurl", hls_codecs, true);
-  AddContainerWithCodecs("application/vnd.apple.mpegurl", hls_codecs, true);
-#endif  // defined(OS_ANDROID)
-}
-
-void MimeUtil::AddContainerWithCodecs(const std::string& mime_type,
-                                      const CodecSet& codecs,
-                                      bool is_proprietary_mime_type) {
-  media_format_map_[mime_type] = codecs;
-
-  if (is_proprietary_mime_type)
-    proprietary_media_containers_.push_back(mime_type);
-}
-
-bool MimeUtil::IsSupportedMediaMimeType(const std::string& mime_type) const {
-  return media_format_map_.find(base::ToLowerASCII(mime_type)) !=
-         media_format_map_.end();
-}
-
-void MimeUtil::ParseCodecString(const std::string& codecs,
-                                std::vector<std::string>* codecs_out,
-                                bool strip) {
-  std::string trimmed_codecs;
-  base::TrimString(codecs, "\"", &trimmed_codecs);
-  *codecs_out = base::SplitString(trimmed_codecs, std::string(","),
-                                  base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-
-  // Convert empty or all-whitespace input to 0 results.
-  if (codecs_out->size() == 1 && (*codecs_out)[0].empty()) codecs_out->clear();
-
-  if (!strip) return;
-
-  // Strip everything past the first '.'
-  for (std::vector<std::string>::iterator it = codecs_out->begin();
-       it != codecs_out->end(); ++it) {
-    size_t found = it->find_first_of('.');
-    if (found != std::string::npos) it->resize(found);
-  }
-}
-
-SupportsType MimeUtil::IsSupportedMediaFormat(
-    const std::string& mime_type, const std::vector<std::string>& codecs,
-    bool is_encrypted) const {
-  const std::string mime_type_lower_case = base::ToLowerASCII(mime_type);
-  MediaFormatMappings::const_iterator it_media_format_map =
-      media_format_map_.find(mime_type_lower_case);
-  if (it_media_format_map == media_format_map_.end()) return IsNotSupported;
-
-  if (it_media_format_map->second.empty()) {
-    // We get here if the mimetype does not expect a codecs parameter.
-    return (codecs.empty() && IsDefaultCodecSupportedLowerCase(
-                                  mime_type_lower_case, is_encrypted))
-               ? IsSupported
-               : IsNotSupported;
-  }
-
-  if (codecs.empty()) {
-    // We get here if the mimetype expects to get a codecs parameter,
-    // but didn't get one. If |mime_type_lower_case| does not have a default
-    // codec the best we can do is say "maybe" because we don't have enough
-    // information.
-    Codec default_codec = INVALID_CODEC;
-    if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec))
-      return MayBeSupported;
-
-    return IsCodecSupported(default_codec, mime_type_lower_case, is_encrypted)
-               ? IsSupported
-               : IsNotSupported;
-  }
-
-  if (mime_type_lower_case == "video/mp2t") {
-    std::vector<std::string> codecs_to_check;
-    for (size_t i = 0; i < codecs.size(); ++i) {
-      codecs_to_check.push_back(TranslateLegacyAvc1CodecIds(codecs[i]));
-    }
-    return AreSupportedCodecs(it_media_format_map->second, codecs_to_check,
-                              mime_type_lower_case, is_encrypted);
-  }
-
-  return AreSupportedCodecs(it_media_format_map->second, codecs,
-                            mime_type_lower_case, is_encrypted);
-}
-
-void MimeUtil::RemoveProprietaryMediaTypesAndCodecs() {
-  for (size_t i = 0; i < proprietary_media_containers_.size(); ++i)
-    media_format_map_.erase(proprietary_media_containers_[i]);
-  allow_proprietary_codecs_ = false;
-}
-
-// static
-bool MimeUtil::IsCodecSupportedOnPlatform(
-    Codec codec, const std::string& mime_type_lower_case, bool is_encrypted,
-    const PlatformInfo& platform_info) {
-  DCHECK_NE(mime_type_lower_case, "");
-
-  // Encrypted block support is never available without platform decoders.
-  if (is_encrypted && !platform_info.has_platform_decoders) return false;
-
-  // NOTE: We do not account for Media Source Extensions (MSE) within these
-  // checks since it has its own isTypeSupported() which will handle platform
-  // specific codec rejections.  See http://crbug.com/587303.
-
-  switch (codec) {
-    // ----------------------------------------------------------------------
-    // The following codecs are never supported.
-    // ----------------------------------------------------------------------
-    case INVALID_CODEC:
-    case AC3:
-    case EAC3:
-    case THEORA:
-      return false;
-
-    // ----------------------------------------------------------------------
-    // The remaining codecs may be supported depending on platform abilities.
-    // ----------------------------------------------------------------------
-
-    case PCM:
-    case MP3:
-    case MPEG4_AAC:
-    case VORBIS:
-      // These codecs are always supported; via a platform decoder (when used
-      // with MSE/EME), a software decoder (the unified pipeline), or with
-      // MediaPlayer.
-      DCHECK(!is_encrypted || platform_info.has_platform_decoders);
-      return true;
-
-    case MPEG2_AAC:
-      // MPEG-2 variants of AAC are not supported on Android unless the unified
-      // media pipeline can be used and the container is not HLS. These codecs
-      // will be decoded in software. See https:crbug.com/544268 for details.
-      if (mime_type_lower_case == "application/x-mpegurl" ||
-          mime_type_lower_case == "application/vnd.apple.mpegurl") {
-        return false;
-      }
-      return !is_encrypted && platform_info.is_unified_media_pipeline_enabled;
-
-    case OPUS:
-      // If clear, the unified pipeline can always decode Opus in software.
-      if (!is_encrypted && platform_info.is_unified_media_pipeline_enabled)
-        return true;
-
-      // Otherwise, platform support is required.
-      if (!platform_info.supports_opus) return false;
-
-      // MediaPlayer does not support Opus in ogg containers.
-      if (base::EndsWith(mime_type_lower_case, "ogg",
-                         base::CompareCase::SENSITIVE)) {
-        return false;
-      }
-
-      DCHECK(!is_encrypted || platform_info.has_platform_decoders);
-      return true;
-
-    case H264:
-      // When content is not encrypted we fall back to MediaPlayer, thus we
-      // always support H264. For EME we need MediaCodec.
-      return !is_encrypted || platform_info.has_platform_decoders;
-
-    case HEVC:
-      if (platform_info.is_unified_media_pipeline_enabled &&
-          !platform_info.has_platform_decoders) {
-        return false;
-      }
-
-#if defined(OS_ANDROID)
-      // HEVC/H.265 is supported in Lollipop+ (API Level 21), according to
-      // http://developer.android.com/reference/android/media/MediaFormat.html
-      return base::android::BuildInfo::GetInstance()->sdk_int() >= 21;
-#else
-      return true;
-#endif  // defined(OS_ANDROID)
-
-    case VP8:
-      // If clear, the unified pipeline can always decode VP8 in software.
-      if (!is_encrypted && platform_info.is_unified_media_pipeline_enabled)
-        return true;
-
-      if (is_encrypted) return platform_info.has_platform_vp8_decoder;
-
-      // MediaPlayer can always play VP8. Note: This is incorrect for MSE, but
-      // MSE does not use this code. http://crbug.com/587303.
-      return true;
-
-    case VP9: {
-      // If clear, the unified pipeline can always decode VP9 in software.
-      if (!is_encrypted && platform_info.is_unified_media_pipeline_enabled)
-        return true;
-
-      if (!platform_info.has_platform_vp9_decoder) return false;
-
-      // Encrypted content is demuxed so the container is irrelevant.
-      if (is_encrypted) return true;
-
-      // MediaPlayer only supports VP9 in WebM.
-      return mime_type_lower_case == "video/webm";
-    }
-  }
-
-  return false;
-}
-
-bool MimeUtil::StringToCodec(const std::string& mime_type_lower_case,
-                             const std::string& codec_id, Codec* codec,
-                             bool* is_ambiguous, VideoCodecProfile* out_profile,
-                             uint8_t* out_level, bool is_encrypted) const {
-  DCHECK(out_profile);
-  DCHECK(out_level);
-  *out_profile = VIDEO_CODEC_PROFILE_UNKNOWN;
-  *out_level = 0;
-
-  StringToCodecMappings::const_iterator itr =
-      string_to_codec_map_.find(codec_id);
-  if (itr != string_to_codec_map_.end()) {
-    *codec = itr->second.codec;
-    *is_ambiguous = itr->second.is_ambiguous;
-    return true;
-  }
-
-  // If |codec_id| is not in |string_to_codec_map_|, then we assume that it is
-  // either VP9, H.264 or HEVC/H.265 codec ID because currently those are the
-  // only ones that are not added to the |string_to_codec_map_| and require
-  // parsing.
-  if (ParseVp9CodecID(mime_type_lower_case, codec_id, out_profile, out_level)) {
-    *codec = MimeUtil::VP9;
-    switch (*out_profile) {
-      case VP9PROFILE_PROFILE0:
-        // Profile 0 should always be supported if VP9 is supported.
-        *is_ambiguous = false;
-        break;
-      default:
-        // We don't know if the underlying platform supports these profiles.
-        // Need to add platform level querying to get supported profiles
-        // (crbug/604566).
-        *is_ambiguous = true;
-        break;
-    }
-    return true;
-  }
-
-  if (ParseAVCCodecId(codec_id, out_profile, out_level)) {
-    *codec = MimeUtil::H264;
-    switch (*out_profile) {
-// HIGH10PROFILE is supported through fallback to the ffmpeg decoder
-// which is not available on Android, or if FFMPEG is not used.
-#if !defined(MEDIA_DISABLE_FFMPEG) && !defined(OS_ANDROID)
-      case H264PROFILE_HIGH10PROFILE:
-        if (is_encrypted) {
-          // FFmpeg is not generally used for encrypted videos, so we do not
-          // know whether 10-bit is supported.
-          *is_ambiguous = true;
-          break;
-        }
-// Fall through.
-#endif
-
-      case H264PROFILE_BASELINE:
-      case H264PROFILE_MAIN:
-      case H264PROFILE_HIGH:
-        *is_ambiguous = !IsValidH264Level(*out_level);
-        break;
-      default:
-        *is_ambiguous = true;
-    }
-    return true;
-  }
-
-  if (ParseHEVCCodecId(codec_id, out_profile, out_level)) {
-    *codec = MimeUtil::HEVC;
-    *is_ambiguous = false;
-    return true;
-  }
-
-  DVLOG(4) << __func__ << ": Unrecognized codec id " << codec_id;
-  return false;
-}
-
-bool MimeUtil::IsCodecSupported(Codec codec,
-                                const std::string& mime_type_lower_case,
-                                bool is_encrypted) const {
-  DCHECK_NE(codec, INVALID_CODEC);
-
-#if defined(OS_ANDROID)
-  if (!IsCodecSupportedOnPlatform(codec, mime_type_lower_case, is_encrypted,
-                                  platform_info_)) {
-    return false;
-  }
-#endif
-
-  return allow_proprietary_codecs_ || !IsCodecProprietary(codec);
-}
-
-bool MimeUtil::IsCodecProprietary(Codec codec) const {
-  switch (codec) {
-    case INVALID_CODEC:
-    case AC3:
-    case EAC3:
-    case MP3:
-    case MPEG2_AAC:
-    case MPEG4_AAC:
-    case H264:
-    case HEVC:
-      return true;
-
-    case PCM:
-    case VORBIS:
-    case OPUS:
-    case VP8:
-    case VP9:
-    case THEORA:
-      return false;
-  }
-
-  return true;
-}
-
-bool MimeUtil::GetDefaultCodecLowerCase(const std::string& mime_type_lower_case,
-                                        Codec* default_codec) const {
-  if (mime_type_lower_case == "audio/mpeg" ||
-      mime_type_lower_case == "audio/mp3" ||
-      mime_type_lower_case == "audio/x-mp3") {
-    *default_codec = MimeUtil::MP3;
-    return true;
-  }
-
-  if (mime_type_lower_case == "audio/aac") {
-    *default_codec = MimeUtil::MPEG4_AAC;
-    return true;
-  }
-
-  return false;
-}
-
-bool MimeUtil::IsDefaultCodecSupportedLowerCase(
-    const std::string& mime_type_lower_case, bool is_encrypted) const {
-  Codec default_codec = INVALID_CODEC;
-  if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec))
-    return false;
-  return IsCodecSupported(default_codec, mime_type_lower_case, is_encrypted);
-}
-
-}  // namespace internal
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/mime_util_internal.h b/cobalt/media/base/mime_util_internal.h
deleted file mode 100644
index efd8d20..0000000
--- a/cobalt/media/base/mime_util_internal.h
+++ /dev/null
@@ -1,180 +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 COBALT_MEDIA_BASE_MIME_UTIL_INTERNAL_H_
-#define COBALT_MEDIA_BASE_MIME_UTIL_INTERNAL_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/containers/hash_tables.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/mime_util.h"
-#include "cobalt/media/base/video_codecs.h"
-
-namespace cobalt {
-namespace media {
-namespace internal {
-
-// Internal utility class for handling mime types.  Should only be invoked by
-// tests and the functions within mime_util.cc -- NOT for direct use by others.
-class MEDIA_EXPORT MimeUtil {
- public:
-  MimeUtil();
-  ~MimeUtil();
-
-  enum Codec {
-    INVALID_CODEC,
-    PCM,
-    MP3,
-    AC3,
-    EAC3,
-    MPEG2_AAC,
-    MPEG4_AAC,
-    VORBIS,
-    OPUS,
-    H264,
-    HEVC,
-    VP8,
-    VP9,
-    THEORA,
-    LAST_CODEC = THEORA
-  };
-
-  // Platform configuration structure.  Controls which codecs are supported at
-  // runtime.  Also used by tests to simulate platform differences.
-  struct PlatformInfo {
-    bool has_platform_decoders;
-
-    bool has_platform_vp8_decoder;
-    bool has_platform_vp9_decoder;
-    bool supports_opus;
-
-    bool is_unified_media_pipeline_enabled;
-
-    PlatformInfo()
-        : has_platform_decoders(false),
-          has_platform_vp8_decoder(false),
-          has_platform_vp9_decoder(false),
-          supports_opus(false),
-          is_unified_media_pipeline_enabled(false) {}
-  };
-
-  // See mime_util.h for more information on these methods.
-  bool IsSupportedMediaMimeType(const std::string& mime_type) const;
-  void ParseCodecString(const std::string& codecs,
-                        std::vector<std::string>* codecs_out, bool strip);
-  SupportsType IsSupportedMediaFormat(const std::string& mime_type,
-                                      const std::vector<std::string>& codecs,
-                                      bool is_encrypted) const;
-
-  void RemoveProprietaryMediaTypesAndCodecs();
-
-  // Checks special platform specific codec restrictions. Returns true if
-  // |codec| is supported when contained in |mime_type_lower_case|.
-  // |is_encrypted| means the codec will be used with encrypted blocks.
-  // |platform_info| describes the availability of various platform features;
-  // see PlatformInfo for more details.
-  static bool IsCodecSupportedOnPlatform(
-      Codec codec, const std::string& mime_type_lower_case, bool is_encrypted,
-      const PlatformInfo& platform_info);
-
- private:
-  typedef base::hash_set<int> CodecSet;
-  typedef std::map<std::string, CodecSet> MediaFormatMappings;
-  struct CodecEntry {
-    CodecEntry() : codec(INVALID_CODEC), is_ambiguous(true) {}
-    CodecEntry(Codec c, bool ambiguous) : codec(c), is_ambiguous(ambiguous) {}
-    Codec codec;
-    bool is_ambiguous;
-  };
-  typedef std::map<std::string, CodecEntry> StringToCodecMappings;
-
-  // Initializes the supported media types into hash sets for faster lookup.
-  void InitializeMimeTypeMaps();
-
-  // Initializes the supported media formats (|media_format_map_|).
-  void AddSupportedMediaFormats();
-
-  // Adds |mime_type| with the specified codecs to |media_format_map_|.
-  void AddContainerWithCodecs(const std::string& mime_type,
-                              const CodecSet& codecs_list,
-                              bool is_proprietary_mime_type);
-
-  // Returns IsSupported if all codec IDs in |codecs| are unambiguous and are
-  // supported in |mime_type_lower_case|. MayBeSupported is returned if at least
-  // one codec ID in |codecs| is ambiguous but all the codecs are supported.
-  // IsNotSupported is returned if |mime_type_lower_case| is not supported or at
-  // least one is not supported in |mime_type_lower_case|. |is_encrypted| means
-  // the codec will be used with encrypted blocks.
-  SupportsType AreSupportedCodecs(const CodecSet& supported_codecs,
-                                  const std::vector<std::string>& codecs,
-                                  const std::string& mime_type_lower_case,
-                                  bool is_encrypted) const;
-
-  // Converts a codec ID into an Codec enum value and indicates
-  // whether the conversion was ambiguous.
-  // Returns true if this method was able to map |codec_id| with
-  // |mime_type_lower_case| to a specific Codec enum value. |codec| and
-  // |is_ambiguous| are only valid if true is returned. Otherwise their value is
-  // undefined after the call.
-  // |is_ambiguous| is true if |codec_id| did not have enough information to
-  // unambiguously determine the proper Codec enum value. If |is_ambiguous|
-  // is true |codec| contains the best guess for the intended Codec enum value.
-  // |profile| and |level| indicate video codec profile and level (unused for
-  // audio codecs).
-  // |is_encrypted| means the codec will be used with encrypted blocks.
-  bool StringToCodec(const std::string& mime_type_lower_case,
-                     const std::string& codec_id, Codec* codec,
-                     bool* is_ambiguous, VideoCodecProfile* out_profile,
-                     uint8_t* out_level, bool is_encrypted) const;
-
-  // Returns true if |codec| is supported when contained in
-  // |mime_type_lower_case|. Note: This method will always return false for
-  // proprietary codecs if |allow_proprietary_codecs_| is set to false.
-  // |is_encrypted| means the codec will be used with encrypted blocks.
-  bool IsCodecSupported(Codec codec, const std::string& mime_type_lower_case,
-                        bool is_encrypted) const;
-
-  // Returns true if |codec| refers to a proprietary codec.
-  bool IsCodecProprietary(Codec codec) const;
-
-  // Returns true and sets |*default_codec| if |mime_type| has a  default codec
-  // associated with it. Returns false otherwise and the value of
-  // |*default_codec| is undefined.
-  bool GetDefaultCodecLowerCase(const std::string& mime_type_lower_case,
-                                Codec* default_codec) const;
-
-  // Returns true if |mime_type_lower_case| has a default codec associated with
-  // it and IsCodecSupported() returns true for that particular codec.
-  // |is_encrypted| means the codec will be used with encrypted blocks.
-  bool IsDefaultCodecSupportedLowerCase(const std::string& mime_type_lower_case,
-                                        bool is_encrypted) const;
-
-#if defined(OS_ANDROID)
-  // Indicates the support of various codecs within the platform.
-  PlatformInfo platform_info_;
-#endif
-
-  // A map of mime_types and hash map of the supported codecs for the mime_type.
-  MediaFormatMappings media_format_map_;
-
-  // List of proprietary containers in |media_format_map_|.
-  std::vector<std::string> proprietary_media_containers_;
-  // Whether proprietary codec support should be advertised to callers.
-  bool allow_proprietary_codecs_;
-
-  // Lookup table for string compare based string -> Codec mappings.
-  StringToCodecMappings string_to_codec_map_;
-
-  DISALLOW_COPY_AND_ASSIGN(MimeUtil);
-};
-
-}  // namespace internal
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MIME_UTIL_INTERNAL_H_
diff --git a/cobalt/media/base/mime_util_unittest.cc b/cobalt/media/base/mime_util_unittest.cc
deleted file mode 100644
index 4a9c8b9..0000000
--- a/cobalt/media/base/mime_util_unittest.cc
+++ /dev/null
@@ -1,432 +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 "cobalt/media/base/mime_util.h"
-
-#include "base/basictypes.h"
-#include "base/strings/string_split.h"
-#include "base/strings/stringprintf.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/mime_util_internal.h"
-#include "cobalt/media/media_features.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_ANDROID)
-#include "base/android/build_info.h"
-#endif
-
-namespace cobalt {
-namespace media {
-namespace internal {
-
-// MIME type for use with IsCodecSupportedOnPlatform() test; type is ignored in
-// all cases except for when paired with the Opus codec.
-const char kTestMimeType[] = "foo/foo";
-
-// Helper method for creating a multi-value vector of |kTestStates| if
-// |test_all_values| is true or if false, a single value vector containing
-// |single_value|.
-static std::vector<bool> CreateTestVector(bool test_all_values,
-                                          bool single_value) {
-  const bool kTestStates[] = {true, false};
-  if (test_all_values)
-    return std::vector<bool>(kTestStates, kTestStates + arraysize(kTestStates));
-  return std::vector<bool>(1, single_value);
-}
-
-// Helper method for running IsCodecSupportedOnPlatform() tests that will
-// iterate over all possible field values for a MimeUtil::PlatformInfo struct.
-//
-// To request a field be varied, set its value to true in the |states_to_vary|
-// struct.  If false, the only value tested will be the field value from
-// |test_states|.
-//
-// |test_func| should have the signature <void(const MimeUtil::PlatformInfo&,
-// MimeUtil::Codec)>.
-template <typename TestCallback>
-static void RunCodecSupportTest(const MimeUtil::PlatformInfo& states_to_vary,
-                                const MimeUtil::PlatformInfo& test_states,
-                                TestCallback test_func) {
-#define MAKE_TEST_VECTOR(name)      \
-  std::vector<bool> name##_states = \
-      CreateTestVector(states_to_vary.name, test_states.name)
-
-  // Stuff states to test into vectors for easy for_each() iteration.
-  MAKE_TEST_VECTOR(has_platform_decoders);
-  MAKE_TEST_VECTOR(has_platform_vp8_decoder);
-  MAKE_TEST_VECTOR(has_platform_vp9_decoder);
-  MAKE_TEST_VECTOR(supports_opus);
-  MAKE_TEST_VECTOR(is_unified_media_pipeline_enabled);
-#undef MAKE_TEST_VECTOR
-
-  MimeUtil::PlatformInfo info;
-
-#define RUN_TEST_VECTOR(name)                   \
-  size_t name##_index = 0;                      \
-  for (info.name = name##_states[name##_index]; \
-       name##_index < name##_states.size(); ++name##_index)
-
-  RUN_TEST_VECTOR(has_platform_decoders) {
-    RUN_TEST_VECTOR(has_platform_vp8_decoder) {
-      RUN_TEST_VECTOR(has_platform_vp9_decoder) {
-        RUN_TEST_VECTOR(supports_opus) {
-          RUN_TEST_VECTOR(is_unified_media_pipeline_enabled) {
-            for (int codec = MimeUtil::INVALID_CODEC;
-                 codec <= MimeUtil::LAST_CODEC; ++codec) {
-              SCOPED_TRACE(base::StringPrintf(
-                  "has_platform_decoders=%d, has_platform_vp8_decoder=%d, "
-                  "supports_opus=%d, "
-                  "has_platform_vp9_decoder=%d, "
-                  "is_unified_media_pipeline_enabled=%d, "
-                  "codec=%d",
-                  info.has_platform_decoders, info.has_platform_vp8_decoder,
-                  info.supports_opus, info.has_platform_vp9_decoder,
-                  info.is_unified_media_pipeline_enabled, codec));
-              test_func(info, static_cast<MimeUtil::Codec>(codec));
-            }
-          }
-        }
-      }
-    }
-  }
-#undef RUN_TEST_VECTOR
-}
-
-// Helper method for generating the |states_to_vary| value used by
-// RunPlatformCodecTest(). Marks all fields to be varied.
-static MimeUtil::PlatformInfo VaryAllFields() {
-  MimeUtil::PlatformInfo states_to_vary;
-  states_to_vary.has_platform_vp8_decoder = true;
-  states_to_vary.has_platform_vp9_decoder = true;
-  states_to_vary.supports_opus = true;
-  states_to_vary.is_unified_media_pipeline_enabled = true;
-  states_to_vary.has_platform_decoders = true;
-  return states_to_vary;
-}
-
-static bool HasHevcSupport() {
-#if BUILDFLAG(ENABLE_HEVC_DEMUXING)
-#if defined(OS_ANDROID)
-  return base::android::BuildInfo::GetInstance()->sdk_int() >= 21;
-#else
-  return true;
-#endif  // defined(OS_ANDROID)
-#else
-  return false;
-#endif  // BUILDFLAG(ENABLE_HEVC_DEMUXING)
-}
-
-TEST(MimeUtilTest, CommonMediaMimeType) {
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/webm"));
-  EXPECT_TRUE(IsSupportedMediaMimeType("video/webm"));
-
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/wav"));
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/x-wav"));
-
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/ogg"));
-  EXPECT_TRUE(IsSupportedMediaMimeType("application/ogg"));
-#if defined(OS_ANDROID)
-  EXPECT_FALSE(IsSupportedMediaMimeType("video/ogg"));
-#else
-  EXPECT_TRUE(IsSupportedMediaMimeType("video/ogg"));
-#endif  // OS_ANDROID
-
-#if defined(OS_ANDROID) && defined(USE_PROPRIETARY_CODECS)
-  // HLS is supported on Android API level 14 and higher and Chrome supports
-  // API levels 15 and higher, so these are expected to be supported.
-  bool kHlsSupported = true;
-#else
-  bool kHlsSupported = false;
-#endif
-
-  EXPECT_EQ(kHlsSupported, IsSupportedMediaMimeType("application/x-mpegurl"));
-  EXPECT_EQ(kHlsSupported, IsSupportedMediaMimeType("Application/X-MPEGURL"));
-  EXPECT_EQ(kHlsSupported,
-            IsSupportedMediaMimeType("application/vnd.apple.mpegurl"));
-
-#if defined(USE_PROPRIETARY_CODECS)
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/mp4"));
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/x-m4a"));
-  EXPECT_TRUE(IsSupportedMediaMimeType("video/mp4"));
-  EXPECT_TRUE(IsSupportedMediaMimeType("video/x-m4v"));
-
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/mp3"));
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/x-mp3"));
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/mpeg"));
-  EXPECT_TRUE(IsSupportedMediaMimeType("audio/aac"));
-
-#if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
-  EXPECT_TRUE(IsSupportedMediaMimeType("video/mp2t"));
-#else
-  EXPECT_FALSE(IsSupportedMediaMimeType("video/mp2t"));
-#endif
-#else
-  EXPECT_FALSE(IsSupportedMediaMimeType("audio/mp4"));
-  EXPECT_FALSE(IsSupportedMediaMimeType("audio/x-m4a"));
-  EXPECT_FALSE(IsSupportedMediaMimeType("video/mp4"));
-  EXPECT_FALSE(IsSupportedMediaMimeType("video/x-m4v"));
-
-  EXPECT_FALSE(IsSupportedMediaMimeType("audio/mp3"));
-  EXPECT_FALSE(IsSupportedMediaMimeType("audio/x-mp3"));
-  EXPECT_FALSE(IsSupportedMediaMimeType("audio/mpeg"));
-  EXPECT_FALSE(IsSupportedMediaMimeType("audio/aac"));
-#endif  // USE_PROPRIETARY_CODECS
-  EXPECT_FALSE(IsSupportedMediaMimeType("video/mp3"));
-
-  EXPECT_FALSE(IsSupportedMediaMimeType("video/unknown"));
-  EXPECT_FALSE(IsSupportedMediaMimeType("audio/unknown"));
-  EXPECT_FALSE(IsSupportedMediaMimeType("unknown/unknown"));
-}
-
-// Note: codecs should only be a list of 2 or fewer; hence the restriction of
-// results' length to 2.
-TEST(MimeUtilTest, ParseCodecString) {
-  const struct {
-    const char* const original;
-    size_t expected_size;
-    const char* const results[2];
-  } tests[] = {
-      {"\"bogus\"", 1, {"bogus"}},
-      {"0", 1, {"0"}},
-      {"avc1.42E01E, mp4a.40.2", 2, {"avc1", "mp4a"}},
-      {"\"mp4v.20.240, mp4a.40.2\"", 2, {"mp4v", "mp4a"}},
-      {"mp4v.20.8, samr", 2, {"mp4v", "samr"}},
-      {"\"theora, vorbis\"", 2, {"theora", "vorbis"}},
-      {"", 0, {}},
-      {"\"\"", 0, {}},
-      {"\"   \"", 0, {}},
-      {",", 2, {"", ""}},
-  };
-
-  for (size_t i = 0; i < arraysize(tests); ++i) {
-    std::vector<std::string> codecs_out;
-    ParseCodecString(tests[i].original, &codecs_out, true);
-    ASSERT_EQ(tests[i].expected_size, codecs_out.size());
-    for (size_t j = 0; j < tests[i].expected_size; ++j)
-      EXPECT_EQ(tests[i].results[j], codecs_out[j]);
-  }
-
-  // Test without stripping the codec type.
-  std::vector<std::string> codecs_out;
-  ParseCodecString("avc1.42E01E, mp4a.40.2", &codecs_out, false);
-  ASSERT_EQ(2u, codecs_out.size());
-  EXPECT_EQ("avc1.42E01E", codecs_out[0]);
-  EXPECT_EQ("mp4a.40.2", codecs_out[1]);
-}
-
-TEST(IsCodecSupportedOnPlatformTest,
-     EncryptedCodecsFailWithoutPlatformSupport) {
-  // Vary all parameters except |has_platform_decoders|.
-  MimeUtil::PlatformInfo states_to_vary = VaryAllFields();
-  states_to_vary.has_platform_decoders = false;
-
-  // Disable platform decoders.
-  MimeUtil::PlatformInfo test_states;
-  test_states.has_platform_decoders = false;
-
-  // Every codec should fail since platform support is missing and we've
-  // requested encrypted codecs.
-  RunCodecSupportTest(
-      states_to_vary, test_states,
-      [](const MimeUtil::PlatformInfo& info, MimeUtil::Codec codec) {
-        EXPECT_FALSE(MimeUtil::IsCodecSupportedOnPlatform(codec, kTestMimeType,
-                                                          true, info));
-      });
-}
-
-TEST(IsCodecSupportedOnPlatformTest, EncryptedCodecBehavior) {
-  // Vary all parameters except |has_platform_decoders|.
-  MimeUtil::PlatformInfo states_to_vary = VaryAllFields();
-  states_to_vary.has_platform_decoders = false;
-
-  // Enable platform decoders.
-  MimeUtil::PlatformInfo test_states;
-  test_states.has_platform_decoders = true;
-
-  RunCodecSupportTest(
-      states_to_vary, test_states,
-      [](const MimeUtil::PlatformInfo& info, MimeUtil::Codec codec) {
-        const bool result = MimeUtil::IsCodecSupportedOnPlatform(
-            codec, kTestMimeType, true, info);
-        switch (codec) {
-          // These codecs are never supported by the Android platform.
-          case MimeUtil::INVALID_CODEC:
-          case MimeUtil::AC3:
-          case MimeUtil::EAC3:
-          case MimeUtil::MPEG2_AAC:
-          case MimeUtil::THEORA:
-            EXPECT_FALSE(result);
-            break;
-
-          // These codecs are always available with platform decoder support.
-          case MimeUtil::PCM:
-          case MimeUtil::MP3:
-          case MimeUtil::MPEG4_AAC:
-          case MimeUtil::VORBIS:
-          case MimeUtil::H264:
-            EXPECT_TRUE(result);
-            break;
-
-          // The remaining codecs are not available on all platforms even when
-          // a platform decoder is available.
-          case MimeUtil::OPUS:
-            EXPECT_EQ(info.supports_opus, result);
-            break;
-
-          case MimeUtil::VP8:
-            EXPECT_EQ(info.has_platform_vp8_decoder, result);
-            break;
-
-          case MimeUtil::VP9:
-            EXPECT_EQ(info.has_platform_vp9_decoder, result);
-            break;
-
-          case MimeUtil::HEVC:
-            EXPECT_EQ(HasHevcSupport(), result);
-            break;
-        }
-      });
-}
-
-TEST(IsCodecSupportedOnPlatformTest, ClearCodecBehaviorWithAndroidPipeline) {
-  // Vary all parameters except |is_unified_media_pipeline_enabled|.
-  MimeUtil::PlatformInfo states_to_vary = VaryAllFields();
-  states_to_vary.is_unified_media_pipeline_enabled = false;
-
-  // Disable the unified pipeline.
-  MimeUtil::PlatformInfo test_states;
-  test_states.is_unified_media_pipeline_enabled = false;
-
-  RunCodecSupportTest(
-      states_to_vary, test_states,
-      [](const MimeUtil::PlatformInfo& info, MimeUtil::Codec codec) {
-        const bool result = MimeUtil::IsCodecSupportedOnPlatform(
-            codec, kTestMimeType, false, info);
-        switch (codec) {
-          // These codecs are never supported by the Android platform.
-          case MimeUtil::INVALID_CODEC:
-          case MimeUtil::AC3:
-          case MimeUtil::EAC3:
-          case MimeUtil::MPEG2_AAC:
-          case MimeUtil::THEORA:
-            EXPECT_FALSE(result);
-            break;
-
-          // These codecs are always available via MediaPlayer.
-          case MimeUtil::PCM:
-          case MimeUtil::MP3:
-          case MimeUtil::MPEG4_AAC:
-          case MimeUtil::VORBIS:
-          case MimeUtil::H264:
-          case MimeUtil::VP8:
-            EXPECT_TRUE(result);
-            break;
-
-          // The remaining codecs depend on the platform version.
-          case MimeUtil::OPUS:
-            EXPECT_EQ(info.supports_opus, result);
-            break;
-
-          case MimeUtil::VP9:
-            // MediaPlayer only supports VP9 in WebM.
-            EXPECT_FALSE(result);
-            break;
-
-          case MimeUtil::HEVC:
-            EXPECT_EQ(HasHevcSupport(), result);
-            break;
-        }
-      });
-
-  // Verify vp9 support in WebM.
-  RunCodecSupportTest(
-      states_to_vary, test_states,
-      [](const MimeUtil::PlatformInfo& info, MimeUtil::Codec codec) {
-        const bool result = MimeUtil::IsCodecSupportedOnPlatform(
-            codec, "video/webm", true, info);
-        if (codec == MimeUtil::VP9)
-          EXPECT_EQ(info.has_platform_vp9_decoder, result);
-      });
-}
-
-TEST(IsCodecSupportedOnPlatformTest, ClearCodecBehaviorWithUnifiedPipeline) {
-  // Vary all parameters except |is_unified_media_pipeline_enabled|.
-  MimeUtil::PlatformInfo states_to_vary = VaryAllFields();
-  states_to_vary.is_unified_media_pipeline_enabled = false;
-
-  // Enable the unified pipeline.
-  MimeUtil::PlatformInfo test_states;
-  test_states.is_unified_media_pipeline_enabled = true;
-
-  RunCodecSupportTest(
-      states_to_vary, test_states,
-      [](const MimeUtil::PlatformInfo& info, MimeUtil::Codec codec) {
-        const bool result = MimeUtil::IsCodecSupportedOnPlatform(
-            codec, kTestMimeType, false, info);
-        switch (codec) {
-          // These codecs are never supported by the Android platform.
-          case MimeUtil::INVALID_CODEC:
-          case MimeUtil::AC3:
-          case MimeUtil::EAC3:
-          case MimeUtil::THEORA:
-            EXPECT_FALSE(result);
-            break;
-
-          // These codecs are always supported with the unified pipeline.
-          case MimeUtil::PCM:
-          case MimeUtil::MPEG2_AAC:
-          case MimeUtil::MP3:
-          case MimeUtil::MPEG4_AAC:
-          case MimeUtil::OPUS:
-          case MimeUtil::VORBIS:
-          case MimeUtil::VP8:
-          case MimeUtil::VP9:
-            EXPECT_TRUE(result);
-            break;
-
-          // These codecs are only supported if platform decoders are supported.
-          case MimeUtil::H264:
-            EXPECT_EQ(info.has_platform_decoders, result);
-            break;
-
-          case MimeUtil::HEVC:
-            EXPECT_EQ(HasHevcSupport() && info.has_platform_decoders, result);
-            break;
-        }
-      });
-}
-
-TEST(IsCodecSupportedOnPlatformTest, OpusOggSupport) {
-  // Vary all parameters; thus use default initial state.
-  MimeUtil::PlatformInfo states_to_vary = VaryAllFields();
-  MimeUtil::PlatformInfo test_states;
-
-  RunCodecSupportTest(
-      states_to_vary, test_states,
-      [](const MimeUtil::PlatformInfo& info, MimeUtil::Codec codec) {
-        EXPECT_EQ(info.is_unified_media_pipeline_enabled,
-                  MimeUtil::IsCodecSupportedOnPlatform(
-                      MimeUtil::OPUS, "audio/ogg", false, info));
-      });
-}
-
-TEST(IsCodecSupportedOnPlatformTest, HLSDoesNotSupportMPEG2AAC) {
-  // Vary all parameters; thus use default initial state.
-  MimeUtil::PlatformInfo states_to_vary = VaryAllFields();
-  MimeUtil::PlatformInfo test_states;
-
-  RunCodecSupportTest(
-      states_to_vary, test_states,
-      [](const MimeUtil::PlatformInfo& info, MimeUtil::Codec codec) {
-        EXPECT_FALSE(MimeUtil::IsCodecSupportedOnPlatform(
-            MimeUtil::MPEG2_AAC, "application/x-mpegurl", false, info));
-        EXPECT_FALSE(MimeUtil::IsCodecSupportedOnPlatform(
-            MimeUtil::MPEG2_AAC, "application/vnd.apple.mpegurl", false, info));
-      });
-}
-
-}  // namespace internal
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/mock_demuxer_host.cc b/cobalt/media/base/mock_demuxer_host.cc
deleted file mode 100644
index c306e66..0000000
--- a/cobalt/media/base/mock_demuxer_host.cc
+++ /dev/null
@@ -1,15 +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 "cobalt/media/base/mock_demuxer_host.h"
-
-namespace cobalt {
-namespace media {
-
-MockDemuxerHost::MockDemuxerHost() {}
-
-MockDemuxerHost::~MockDemuxerHost() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/mock_demuxer_host.h b/cobalt/media/base/mock_demuxer_host.h
deleted file mode 100644
index d115d71..0000000
--- a/cobalt/media/base/mock_demuxer_host.h
+++ /dev/null
@@ -1,35 +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 COBALT_MEDIA_BASE_MOCK_DEMUXER_HOST_H_
-#define COBALT_MEDIA_BASE_MOCK_DEMUXER_HOST_H_
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/demuxer.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace cobalt {
-namespace media {
-
-class MockDemuxerHost : public DemuxerHost {
- public:
-  MockDemuxerHost();
-  virtual ~MockDemuxerHost();
-
-  MOCK_METHOD1(OnBufferedTimeRangesChanged,
-               void(const Ranges<base::TimeDelta>&));
-  MOCK_METHOD1(SetDuration, void(base::TimeDelta duration));
-  MOCK_METHOD1(OnDemuxerError, void(PipelineStatus error));
-  MOCK_METHOD2(AddTextStream, void(DemuxerStream*, const TextTrackConfig&));
-  MOCK_METHOD1(RemoveTextStream, void(DemuxerStream*));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockDemuxerHost);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MOCK_DEMUXER_HOST_H_
diff --git a/cobalt/media/base/mock_filters.cc b/cobalt/media/base/mock_filters.cc
deleted file mode 100644
index 598fa41..0000000
--- a/cobalt/media/base/mock_filters.cc
+++ /dev/null
@@ -1,140 +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 "cobalt/media/base/mock_filters.h"
-
-#include <memory>
-
-#include "base/logging.h"
-
-using ::testing::_;
-using ::testing::Invoke;
-using ::testing::NotNull;
-using ::testing::Return;
-
-namespace cobalt {
-namespace media {
-
-MockPipelineClient::MockPipelineClient() {}
-MockPipelineClient::~MockPipelineClient() {}
-
-MockPipeline::MockPipeline() {}
-MockPipeline::~MockPipeline() {}
-
-void MockPipeline::Start(Demuxer* demuxer, std::unique_ptr<Renderer> renderer,
-                         Client* client, const PipelineStatusCB& seek_cb) {
-  Start(demuxer, &renderer, client, seek_cb);
-}
-
-void MockPipeline::Resume(std::unique_ptr<Renderer> renderer,
-                          base::TimeDelta timestamp,
-                          const PipelineStatusCB& seek_cb) {
-  Resume(&renderer, timestamp, seek_cb);
-}
-
-MockDemuxer::MockDemuxer() {}
-
-MockDemuxer::~MockDemuxer() {}
-
-std::string MockDemuxer::GetDisplayName() const { return "MockDemuxer"; }
-
-MockDemuxerStream::MockDemuxerStream(DemuxerStream::Type type)
-    : type_(type), liveness_(LIVENESS_UNKNOWN) {}
-
-MockDemuxerStream::~MockDemuxerStream() {}
-
-DemuxerStream::Type MockDemuxerStream::type() const { return type_; }
-
-DemuxerStream::Liveness MockDemuxerStream::liveness() const {
-  return liveness_;
-}
-
-AudioDecoderConfig MockDemuxerStream::audio_decoder_config() {
-  DCHECK_EQ(type_, DemuxerStream::AUDIO);
-  return audio_decoder_config_;
-}
-
-VideoDecoderConfig MockDemuxerStream::video_decoder_config() {
-  DCHECK_EQ(type_, DemuxerStream::VIDEO);
-  return video_decoder_config_;
-}
-
-void MockDemuxerStream::set_audio_decoder_config(
-    const AudioDecoderConfig& config) {
-  DCHECK_EQ(type_, DemuxerStream::AUDIO);
-  audio_decoder_config_ = config;
-}
-
-void MockDemuxerStream::set_video_decoder_config(
-    const VideoDecoderConfig& config) {
-  DCHECK_EQ(type_, DemuxerStream::VIDEO);
-  video_decoder_config_ = config;
-}
-
-void MockDemuxerStream::set_liveness(DemuxerStream::Liveness liveness) {
-  liveness_ = liveness;
-}
-
-VideoRotation MockDemuxerStream::video_rotation() { return VIDEO_ROTATION_0; }
-
-std::string MockVideoDecoder::GetDisplayName() const {
-  return "MockVideoDecoder";
-}
-
-MockVideoDecoder::MockVideoDecoder() {
-  ON_CALL(*this, CanReadWithoutStalling()).WillByDefault(Return(true));
-}
-
-std::string MockAudioDecoder::GetDisplayName() const {
-  return "MockAudioDecoder";
-}
-
-MockVideoDecoder::~MockVideoDecoder() {}
-
-MockAudioDecoder::MockAudioDecoder() {}
-
-MockAudioDecoder::~MockAudioDecoder() {}
-
-MockRendererClient::MockRendererClient() {}
-
-MockRendererClient::~MockRendererClient() {}
-
-MockVideoRenderer::MockVideoRenderer() {}
-
-MockVideoRenderer::~MockVideoRenderer() {}
-
-MockAudioRenderer::MockAudioRenderer() {}
-
-MockAudioRenderer::~MockAudioRenderer() {}
-
-MockRenderer::MockRenderer() {}
-
-MockRenderer::~MockRenderer() {}
-
-MockTimeSource::MockTimeSource() {}
-
-MockTimeSource::~MockTimeSource() {}
-
-MockTextTrack::MockTextTrack() {}
-
-MockTextTrack::~MockTextTrack() {}
-
-MockDecryptor::MockDecryptor() {}
-
-MockDecryptor::~MockDecryptor() {}
-
-MockCdmContext::MockCdmContext() {}
-
-MockCdmContext::~MockCdmContext() {}
-
-int MockCdmContext::GetCdmId() const { return cdm_id_; }
-
-void MockCdmContext::set_cdm_id(int cdm_id) { cdm_id_ = cdm_id; }
-
-MockStreamParser::MockStreamParser() {}
-
-MockStreamParser::~MockStreamParser() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/mock_filters.h b/cobalt/media/base/mock_filters.h
deleted file mode 100644
index 067dbd3..0000000
--- a/cobalt/media/base/mock_filters.h
+++ /dev/null
@@ -1,382 +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 COBALT_MEDIA_BASE_MOCK_FILTERS_H_
-#define COBALT_MEDIA_BASE_MOCK_FILTERS_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "cobalt/media/base/audio_decoder.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/audio_renderer.h"
-#include "cobalt/media/base/cdm_context.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/decryptor.h"
-#include "cobalt/media/base/demuxer.h"
-#include "cobalt/media/base/media_track.h"
-#include "cobalt/media/base/pipeline.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "cobalt/media/base/renderer.h"
-#include "cobalt/media/base/renderer_client.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/text_track.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/time_source.h"
-#include "cobalt/media/base/video_decoder.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/base/video_frame.h"
-#include "cobalt/media/base/video_renderer.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace cobalt {
-namespace media {
-
-class MockPipelineClient : public Pipeline::Client {
- public:
-  MockPipelineClient();
-  ~MockPipelineClient();
-
-  MOCK_METHOD1(OnError, void(PipelineStatus));
-  MOCK_METHOD0(OnEnded, void());
-  MOCK_METHOD1(OnMetadata, void(PipelineMetadata));
-  MOCK_METHOD1(OnBufferingStateChange, void(BufferingState));
-  MOCK_METHOD0(OnDurationChange, void());
-  MOCK_METHOD2(OnAddTextTrack,
-               void(const TextTrackConfig&, const AddTextTrackDoneCB&));
-  MOCK_METHOD0(OnWaitingForDecryptionKey, void());
-  MOCK_METHOD1(OnVideoNaturalSizeChange, void(const math::Size&));
-  MOCK_METHOD1(OnVideoOpacityChange, void(bool));
-};
-
-class MockPipeline : public Pipeline {
- public:
-  MockPipeline();
-  virtual ~MockPipeline();
-
-  // Note: Start() and Resume() declarations are not actually overrides; they
-  // take unique_ptr* instead of unique_ptr so that they can be mock methods.
-  // Private stubs for Start() and Resume() implement the actual Pipeline
-  // interface by forwarding to these mock methods.
-  MOCK_METHOD4(Start, void(Demuxer*, std::unique_ptr<Renderer>*, Client*,
-                           const PipelineStatusCB&));
-  MOCK_METHOD0(Stop, void());
-  MOCK_METHOD2(Seek, void(base::TimeDelta, const PipelineStatusCB&));
-  MOCK_METHOD1(Suspend, void(const PipelineStatusCB&));
-  MOCK_METHOD3(Resume, void(std::unique_ptr<Renderer>*, base::TimeDelta,
-                            const PipelineStatusCB&));
-
-  MOCK_METHOD1(OnEnabledAudioTracksChanged,
-               void(const std::vector<MediaTrack::Id>&));
-  MOCK_METHOD1(OnSelectedVideoTrackChanged,
-               void(const std::vector<MediaTrack::Id>&));
-
-  // TODO(sandersd): This should automatically return true between Start() and
-  // Stop(). (Or better, remove it from the interface entirely.)
-  MOCK_CONST_METHOD0(IsRunning, bool());
-
-  // TODO(sandersd): These should be regular getters/setters.
-  MOCK_CONST_METHOD0(GetPlaybackRate, double());
-  MOCK_METHOD1(SetPlaybackRate, void(double));
-  MOCK_CONST_METHOD0(GetVolume, float());
-  MOCK_METHOD1(SetVolume, void(float));
-
-  // TODO(sandersd): These should probably have setters too.
-  MOCK_CONST_METHOD0(GetMediaTime, base::TimeDelta());
-  MOCK_CONST_METHOD0(GetBufferedTimeRanges, Ranges<base::TimeDelta>());
-  MOCK_CONST_METHOD0(GetMediaDuration, base::TimeDelta());
-  MOCK_METHOD0(DidLoadingProgress, bool());
-  MOCK_CONST_METHOD0(GetStatistics, PipelineStatistics());
-
-  MOCK_METHOD2(SetCdm, void(CdmContext*, const CdmAttachedCB&));
-
- private:
-  // Forwarding stubs (see comment above).
-  void Start(Demuxer* demuxer, std::unique_ptr<Renderer> renderer,
-             Client* client, const PipelineStatusCB& seek_cb) override;
-  void Resume(std::unique_ptr<Renderer> renderer, base::TimeDelta timestamp,
-              const PipelineStatusCB& seek_cb) override;
-
-  DISALLOW_COPY_AND_ASSIGN(MockPipeline);
-};
-
-class MockDemuxer : public Demuxer {
- public:
-  MockDemuxer();
-  virtual ~MockDemuxer();
-
-  // Demuxer implementation.
-  virtual std::string GetDisplayName() const;
-  MOCK_METHOD3(Initialize,
-               void(DemuxerHost* host, const PipelineStatusCB& cb, bool));
-  MOCK_METHOD1(StartWaitingForSeek, void(base::TimeDelta));
-  MOCK_METHOD1(CancelPendingSeek, void(base::TimeDelta));
-  MOCK_METHOD2(Seek, void(base::TimeDelta time, const PipelineStatusCB& cb));
-  MOCK_METHOD0(Stop, void());
-  MOCK_METHOD0(AbortPendingReads, void());
-  MOCK_METHOD1(GetStream, DemuxerStream*(DemuxerStream::Type));
-  MOCK_CONST_METHOD0(GetStartTime, base::TimeDelta());
-  MOCK_CONST_METHOD0(GetTimelineOffset, base::Time());
-  MOCK_CONST_METHOD0(GetMemoryUsage, int64_t());
-  MOCK_METHOD2(OnEnabledAudioTracksChanged,
-               void(const std::vector<MediaTrack::Id>&, base::TimeDelta));
-  MOCK_METHOD2(OnSelectedVideoTrackChanged,
-               void(const std::vector<MediaTrack::Id>&, base::TimeDelta));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockDemuxer);
-};
-
-class MockDemuxerStream : public DemuxerStream {
- public:
-  explicit MockDemuxerStream(DemuxerStream::Type type);
-  virtual ~MockDemuxerStream();
-
-  // DemuxerStream implementation.
-  Type type() const override;
-  Liveness liveness() const override;
-  MOCK_METHOD1(Read, void(const ReadCB& read_cb));
-  AudioDecoderConfig audio_decoder_config() override;
-  VideoDecoderConfig video_decoder_config() override;
-  MOCK_METHOD0(EnableBitstreamConverter, void());
-  MOCK_METHOD0(SupportsConfigChanges, bool());
-
-  void set_audio_decoder_config(const AudioDecoderConfig& config);
-  void set_video_decoder_config(const VideoDecoderConfig& config);
-  void set_liveness(Liveness liveness);
-
-  VideoRotation video_rotation() override;
-  MOCK_CONST_METHOD0(enabled, bool());
-  MOCK_METHOD2(set_enabled, void(bool, base::TimeDelta));
-  MOCK_METHOD1(SetStreamStatusChangeCB, void(const StreamStatusChangeCB&));
-
- private:
-  Type type_;
-  Liveness liveness_;
-  AudioDecoderConfig audio_decoder_config_;
-  VideoDecoderConfig video_decoder_config_;
-
-  DISALLOW_COPY_AND_ASSIGN(MockDemuxerStream);
-};
-
-class MockVideoDecoder : public VideoDecoder {
- public:
-  MockVideoDecoder();
-  virtual ~MockVideoDecoder();
-
-  // VideoDecoder implementation.
-  virtual std::string GetDisplayName() const;
-  MOCK_METHOD5(Initialize,
-               void(const VideoDecoderConfig& config, bool low_delay,
-                    CdmContext* cdm_context, const InitCB& init_cb,
-                    const OutputCB& output_cb));
-  MOCK_METHOD2(Decode, void(const scoped_refptr<DecoderBuffer>& buffer,
-                            const DecodeCB&));
-  MOCK_METHOD1(Reset, void(const base::Closure&));
-  MOCK_CONST_METHOD0(HasAlpha, bool());
-  MOCK_CONST_METHOD0(CanReadWithoutStalling, bool());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockVideoDecoder);
-};
-
-class MockAudioDecoder : public AudioDecoder {
- public:
-  MockAudioDecoder();
-  virtual ~MockAudioDecoder();
-
-  // AudioDecoder implementation.
-  virtual std::string GetDisplayName() const;
-  MOCK_METHOD4(Initialize,
-               void(const AudioDecoderConfig& config, CdmContext* cdm_context,
-                    const InitCB& init_cb, const OutputCB& output_cb));
-  MOCK_METHOD2(Decode, void(const scoped_refptr<DecoderBuffer>& buffer,
-                            const DecodeCB&));
-  MOCK_METHOD1(Reset, void(const base::Closure&));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockAudioDecoder);
-};
-
-class MockRendererClient : public RendererClient {
- public:
-  MockRendererClient();
-  ~MockRendererClient();
-
-  // RendererClient implementation.
-  MOCK_METHOD1(OnError, void(PipelineStatus));
-  MOCK_METHOD0(OnEnded, void());
-  MOCK_METHOD1(OnStatisticsUpdate, void(const PipelineStatistics&));
-  MOCK_METHOD1(OnBufferingStateChange, void(BufferingState));
-  MOCK_METHOD0(OnWaitingForDecryptionKey, void());
-  MOCK_METHOD1(OnVideoNaturalSizeChange, void(const math::Size&));
-  MOCK_METHOD1(OnVideoOpacityChange, void(bool));
-  MOCK_METHOD1(OnDurationChange, void(base::TimeDelta));
-};
-
-class MockVideoRenderer : public VideoRenderer {
- public:
-  MockVideoRenderer();
-  virtual ~MockVideoRenderer();
-
-  // VideoRenderer implementation.
-  MOCK_METHOD5(Initialize,
-               void(DemuxerStream* stream, CdmContext* cdm_context,
-                    RendererClient* client,
-                    const TimeSource::WallClockTimeCB& wall_clock_time_cb,
-                    const PipelineStatusCB& init_cb));
-  MOCK_METHOD1(Flush, void(const base::Closure& callback));
-  MOCK_METHOD1(StartPlayingFrom, void(base::TimeDelta));
-  MOCK_METHOD0(OnTimeProgressing, void());
-  MOCK_METHOD0(OnTimeStopped, void());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockVideoRenderer);
-};
-
-class MockAudioRenderer : public AudioRenderer {
- public:
-  MockAudioRenderer();
-  virtual ~MockAudioRenderer();
-
-  // AudioRenderer implementation.
-  MOCK_METHOD4(Initialize,
-               void(DemuxerStream* stream, CdmContext* cdm_context,
-                    RendererClient* client, const PipelineStatusCB& init_cb));
-  MOCK_METHOD0(GetTimeSource, TimeSource*());
-  MOCK_METHOD1(Flush, void(const base::Closure& callback));
-  MOCK_METHOD0(StartPlaying, void());
-  MOCK_METHOD1(SetVolume, void(float volume));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockAudioRenderer);
-};
-
-class MockRenderer : public Renderer {
- public:
-  MockRenderer();
-  virtual ~MockRenderer();
-
-  // Renderer implementation.
-  MOCK_METHOD3(Initialize,
-               void(DemuxerStreamProvider* demuxer_stream_provider,
-                    RendererClient* client, const PipelineStatusCB& init_cb));
-  MOCK_METHOD1(Flush, void(const base::Closure& flush_cb));
-  MOCK_METHOD1(StartPlayingFrom, void(base::TimeDelta timestamp));
-  MOCK_METHOD1(SetPlaybackRate, void(double playback_rate));
-  MOCK_METHOD1(SetVolume, void(float volume));
-  MOCK_METHOD0(GetMediaTime, base::TimeDelta());
-  MOCK_METHOD0(HasAudio, bool());
-  MOCK_METHOD0(HasVideo, bool());
-  MOCK_METHOD2(SetCdm, void(CdmContext* cdm_context,
-                            const CdmAttachedCB& cdm_attached_cb));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockRenderer);
-};
-
-class MockTimeSource : public TimeSource {
- public:
-  MockTimeSource();
-  virtual ~MockTimeSource();
-
-  // TimeSource implementation.
-  MOCK_METHOD0(StartTicking, void());
-  MOCK_METHOD0(StopTicking, void());
-  MOCK_METHOD1(SetPlaybackRate, void(double));
-  MOCK_METHOD1(SetMediaTime, void(base::TimeDelta));
-  MOCK_METHOD0(CurrentMediaTime, base::TimeDelta());
-  MOCK_METHOD2(GetWallClockTimes, bool(const std::vector<base::TimeDelta>&,
-                                       std::vector<base::TimeTicks>*));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockTimeSource);
-};
-
-class MockTextTrack : public TextTrack {
- public:
-  MockTextTrack();
-  virtual ~MockTextTrack();
-
-  MOCK_METHOD5(addWebVTTCue,
-               void(const base::TimeDelta& start, const base::TimeDelta& end,
-                    const std::string& id, const std::string& content,
-                    const std::string& settings));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockTextTrack);
-};
-
-class MockDecryptor : public Decryptor {
- public:
-  MockDecryptor();
-  virtual ~MockDecryptor();
-
-  MOCK_METHOD2(RegisterNewKeyCB,
-               void(StreamType stream_type, const NewKeyCB& new_key_cb));
-  MOCK_METHOD3(Decrypt, void(StreamType stream_type,
-                             const scoped_refptr<DecoderBuffer>& encrypted,
-                             const DecryptCB& decrypt_cb));
-  MOCK_METHOD1(CancelDecrypt, void(StreamType stream_type));
-  MOCK_METHOD2(InitializeAudioDecoder, void(const AudioDecoderConfig& config,
-                                            const DecoderInitCB& init_cb));
-  MOCK_METHOD2(InitializeVideoDecoder, void(const VideoDecoderConfig& config,
-                                            const DecoderInitCB& init_cb));
-  MOCK_METHOD2(DecryptAndDecodeAudio,
-               void(const scoped_refptr<media::DecoderBuffer>& encrypted,
-                    const AudioDecodeCB& audio_decode_cb));
-  MOCK_METHOD2(DecryptAndDecodeVideo,
-               void(const scoped_refptr<media::DecoderBuffer>& encrypted,
-                    const VideoDecodeCB& video_decode_cb));
-  MOCK_METHOD1(ResetDecoder, void(StreamType stream_type));
-  MOCK_METHOD1(DeinitializeDecoder, void(StreamType stream_type));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockDecryptor);
-};
-
-class MockCdmContext : public CdmContext {
- public:
-  MockCdmContext();
-  ~MockCdmContext() override;
-
-  MOCK_METHOD0(GetDecryptor, Decryptor*());
-  int GetCdmId() const override;
-
-  void set_cdm_id(int cdm_id);
-
- private:
-  int cdm_id_ = CdmContext::kInvalidCdmId;
-
-  DISALLOW_COPY_AND_ASSIGN(MockCdmContext);
-};
-
-class MockStreamParser : public StreamParser {
- public:
-  MockStreamParser();
-  ~MockStreamParser() override;
-
-  // StreamParser interface
-  MOCK_METHOD8(
-      Init, void(const InitCB& init_cb, const NewConfigCB& config_cb,
-                 const NewBuffersCB& new_buffers_cb, bool ignore_text_track,
-                 const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-                 const NewMediaSegmentCB& new_segment_cb,
-                 const EndMediaSegmentCB& end_of_segment_cb,
-                 const scoped_refptr<MediaLog>& media_log));
-  MOCK_METHOD0(Flush, void());
-  MOCK_METHOD2(Parse, bool(const uint8_t*, int));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockStreamParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MOCK_FILTERS_H_
diff --git a/cobalt/media/base/mock_media_log.cc b/cobalt/media/base/mock_media_log.cc
deleted file mode 100644
index ac70308..0000000
--- a/cobalt/media/base/mock_media_log.cc
+++ /dev/null
@@ -1,15 +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 "cobalt/media/base/mock_media_log.h"
-
-namespace cobalt {
-namespace media {
-
-MockMediaLog::MockMediaLog() {}
-
-MockMediaLog::~MockMediaLog() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/mock_media_log.h b/cobalt/media/base/mock_media_log.h
deleted file mode 100644
index 2205e15..0000000
--- a/cobalt/media/base/mock_media_log.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 COBALT_MEDIA_BASE_MOCK_MEDIA_LOG_H_
-#define COBALT_MEDIA_BASE_MOCK_MEDIA_LOG_H_
-
-#include <memory>
-#include <string>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_log.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-// Helper macros to reduce boilerplate when verifying media log entries.
-// |outer| is the std::string searched for substring |sub|.
-#define CONTAINS_STRING(outer, sub) (std::string::npos != (outer).find(sub))
-
-// "media_log_" is expected to be a scoped_refptr<MockMediaLog>, optionally a
-// StrictMock, in scope of the usage of this macro.
-#define EXPECT_MEDIA_LOG(x) EXPECT_CALL(*media_log_, DoAddEventLogString((x)))
-
-namespace cobalt {
-namespace media {
-
-class MockMediaLog : public MediaLog {
- public:
-  MockMediaLog();
-
-  MOCK_METHOD1(DoAddEventLogString, void(const std::string& event));
-
-  // Trampoline method to workaround GMOCK problems with std::unique_ptr<>.
-  // Also simplifies tests to be able to string match on the log string
-  // representation on the added event.
-  void AddEvent(std::unique_ptr<MediaLogEvent> event) override {
-    DoAddEventLogString(MediaEventToLogString(*event));
-  }
-
- protected:
-  virtual ~MockMediaLog();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockMediaLog);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MOCK_MEDIA_LOG_H_
diff --git a/cobalt/media/base/moving_average.cc b/cobalt/media/base/moving_average.cc
deleted file mode 100644
index e496ed5..0000000
--- a/cobalt/media/base/moving_average.cc
+++ /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.
-
-#include "cobalt/media/base/moving_average.h"
-
-#include <algorithm>
-
-namespace cobalt {
-namespace media {
-
-MovingAverage::MovingAverage(size_t depth)
-    : depth_(depth), count_(0), samples_(depth_), square_sum_us_(0) {}
-
-MovingAverage::~MovingAverage() {}
-
-void MovingAverage::AddSample(base::TimeDelta sample) {
-  // |samples_| is zero-initialized, so |oldest| is also zero before |count_|
-  // exceeds |depth_|.
-  base::TimeDelta& oldest = samples_[count_++ % depth_];
-  total_ += sample - oldest;
-  square_sum_us_ += sample.InMicroseconds() * sample.InMicroseconds() -
-                    oldest.InMicroseconds() * oldest.InMicroseconds();
-  oldest = sample;
-}
-
-base::TimeDelta MovingAverage::Average() const {
-  DCHECK_GT(count_, 0u);
-
-  // TODO(dalecurtis): Consider limiting |depth| to powers of two so that we can
-  // replace the integer divide with a bit shift operation.
-
-  return total_ / std::min(static_cast<uint64_t>(depth_), count_);
-}
-
-base::TimeDelta MovingAverage::Deviation() const {
-  DCHECK_GT(count_, 0u);
-
-  const double size = std::min(static_cast<uint64_t>(depth_), count_);
-  const double average_us = total_.InMicroseconds() / size;
-  double sqr_deviation_us = square_sum_us_ / size - average_us * average_us;
-  if (sqr_deviation_us < 0) sqr_deviation_us = 0;
-
-  return base::TimeDelta::FromMicroseconds(sqrt(sqr_deviation_us));
-}
-
-void MovingAverage::Reset() {
-  count_ = 0;
-  total_ = base::TimeDelta();
-  square_sum_us_ = 0;
-  std::fill(samples_.begin(), samples_.end(), base::TimeDelta());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/moving_average.h b/cobalt/media/base/moving_average.h
deleted file mode 100644
index 98d5279..0000000
--- a/cobalt/media/base/moving_average.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_MOVING_AVERAGE_H_
-#define COBALT_MEDIA_BASE_MOVING_AVERAGE_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Simple class for calculating a moving average of fixed size.
-class MEDIA_EXPORT MovingAverage {
- public:
-  // Creates a MovingAverage instance with space for |depth| samples.
-  explicit MovingAverage(size_t depth);
-  ~MovingAverage();
-
-  // Adds a new sample to the average; replaces the oldest sample if |depth_|
-  // has been exceeded.  Updates |total_| to the new sum of values.
-  void AddSample(base::TimeDelta sample);
-
-  // Returns the current average of all held samples.
-  base::TimeDelta Average() const;
-
-  // Returns the standard deviation of all held samples.
-  base::TimeDelta Deviation() const;
-
-  // Resets the state of the class to its initial post-construction state.
-  void Reset();
-
-  size_t count() const { return count_; }
-
- private:
-  // Maximum number of elements allowed in the average.
-  const size_t depth_;
-
-  // Number of elements seen thus far.
-  uint64_t count_;
-
-  std::vector<base::TimeDelta> samples_;
-  base::TimeDelta total_;
-  uint64_t square_sum_us_;
-
-  DISALLOW_COPY_AND_ASSIGN(MovingAverage);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_MOVING_AVERAGE_H_
diff --git a/cobalt/media/base/moving_average_unittest.cc b/cobalt/media/base/moving_average_unittest.cc
deleted file mode 100644
index b6ff655..0000000
--- a/cobalt/media/base/moving_average_unittest.cc
+++ /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.
-
-#include "cobalt/media/base/moving_average.h"
-
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(MovingAverageTest, AverageAndDeviation) {
-  const int kSamples = 5;
-  MovingAverage moving_average(kSamples);
-  moving_average.AddSample(base::TimeDelta::FromSeconds(1));
-  EXPECT_EQ(base::TimeDelta::FromSeconds(1), moving_average.Average());
-  EXPECT_EQ(base::TimeDelta(), moving_average.Deviation());
-
-  for (int i = 0; i < kSamples - 1; ++i)
-    moving_average.AddSample(base::TimeDelta::FromSeconds(1));
-  EXPECT_EQ(base::TimeDelta::FromSeconds(1), moving_average.Average());
-  EXPECT_EQ(base::TimeDelta(), moving_average.Deviation());
-
-  base::TimeDelta expect_deviation[] = {
-      base::TimeDelta::FromMicroseconds(200000),
-      base::TimeDelta::FromMicroseconds(244948),
-      base::TimeDelta::FromMicroseconds(244948),
-      base::TimeDelta::FromMicroseconds(200000),
-      base::TimeDelta::FromMilliseconds(0),
-  };
-  for (int i = 0; i < kSamples; ++i) {
-    moving_average.AddSample(base::TimeDelta::FromMilliseconds(500));
-    EXPECT_EQ(base::TimeDelta::FromMilliseconds(1000 - (i + 1) * 100),
-              moving_average.Average());
-    EXPECT_EQ(expect_deviation[i], moving_average.Deviation());
-  }
-}
-
-TEST(MovingAverageTest, Reset) {
-  MovingAverage moving_average(2);
-  moving_average.AddSample(base::TimeDelta::FromSeconds(1));
-  EXPECT_EQ(base::TimeDelta::FromSeconds(1), moving_average.Average());
-  moving_average.Reset();
-  moving_average.AddSample(base::TimeDelta());
-  EXPECT_EQ(base::TimeDelta(), moving_average.Average());
-  EXPECT_EQ(base::TimeDelta(), moving_average.Deviation());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/pipeline.h b/cobalt/media/base/pipeline.h
index 13ae02f..9228cd3 100644
--- a/cobalt/media/base/pipeline.h
+++ b/cobalt/media/base/pipeline.h
@@ -21,15 +21,15 @@
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/message_loop/message_loop.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/demuxer.h"
 #include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "cobalt/media/base/ranges.h"
 #include "cobalt/media/base/video_frame_provider.h"
 #include "starboard/drm.h"
 #include "starboard/window.h"
+#include "third_party/chromium/media/base/demuxer.h"
+#include "third_party/chromium/media/base/media_log.h"
+#include "third_party/chromium/media/base/pipeline_status.h"
+#include "third_party/chromium/media/base/ranges.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/size.h"
 
 namespace cobalt {
 namespace media {
@@ -44,20 +44,27 @@
 // Callback to set an DrmSystemReadyCB.
 typedef base::Callback<void(const DrmSystemReadyCB&)> SetDrmSystemReadyCB;
 
-typedef base::Callback<void(PipelineStatus, const std::string&)> ErrorCB;
+typedef base::Callback<void(::media::PipelineStatus, const std::string&)>
+    ErrorCB;
 
 // Pipeline contains the common interface for media pipelines.  It provides
 // functions to perform asynchronous initialization, pausing, seeking and
 // playing.
 class MEDIA_EXPORT Pipeline : public base::RefCountedThreadSafe<Pipeline> {
  public:
+  typedef ::media::Demuxer Demuxer;
+  typedef ::media::MediaLog MediaLog;
+  typedef ::media::PipelineStatistics PipelineStatistics;
+  typedef ::media::PipelineStatus PipelineStatus;
+  typedef ::media::PipelineStatusCallback PipelineStatusCallback;
+
   typedef base::Callback<void(PipelineStatus status, bool is_initial_preroll,
                               const std::string& error_message)>
       SeekCB;
 
   // Return true if the punch through box should be rendered.  Return false if
   // no punch through box should be rendered.
-  typedef base::Callback<bool(const math::Rect&)> SetBoundsCB;
+  typedef base::Callback<bool(int x, int y, int width, int height)> SetBoundsCB;
 
   // Call to get the SbDecodeTargetGraphicsContextProvider for SbPlayerCreate().
   typedef base::Callback<SbDecodeTargetGraphicsContextProvider*()>
@@ -78,7 +85,8 @@
 
   typedef base::Callback<void(BufferingState)> BufferingStateCB;
 #if SB_HAS(PLAYER_WITH_URL)
-  typedef base::Callback<void(EmeInitDataType, const std::vector<uint8_t>&)>
+  typedef base::Callback<void(const char* init_data_type,
+                              const std::vector<uint8_t>&)>
       OnEncryptedMediaInitDataEncounteredCB;
 #endif  // SB_HAS(PLAYER_WITH_URL)
 
@@ -118,7 +126,7 @@
   // It is an error to call this method after the pipeline has already started.
   virtual void Start(Demuxer* demuxer,
                      const SetDrmSystemReadyCB& set_drm_system_ready_cb,
-                     const PipelineStatusCB& ended_cb, const ErrorCB& error_cb,
+                     PipelineStatusCallback ended_cb, const ErrorCB& error_cb,
                      const SeekCB& seek_cb,
                      const BufferingStateCB& buffering_state_cb,
                      const base::Closure& duration_change_cb,
@@ -132,7 +140,7 @@
                      const OnEncryptedMediaInitDataEncounteredCB&
                          encrypted_media_init_data_encountered_cb,
                      const std::string& source_url,
-                     const PipelineStatusCB& ended_cb, const ErrorCB& error_cb,
+                     PipelineStatusCallback ended_cb, const ErrorCB& error_cb,
                      const SeekCB& seek_cb,
                      const BufferingStateCB& buffering_state_cb,
                      const base::Closure& duration_change_cb,
@@ -188,7 +196,7 @@
   virtual base::TimeDelta GetMediaTime() = 0;
 
   // Get approximate time ranges of buffered media.
-  virtual Ranges<base::TimeDelta> GetBufferedTimeRanges() = 0;
+  virtual ::media::Ranges<base::TimeDelta> GetBufferedTimeRanges() = 0;
 
   // Get the duration of the media in microseconds.  If the duration has not
   // been determined yet, then return 0.
@@ -205,7 +213,7 @@
   // Gets the natural size of the video output in pixel units.  If there is no
   // video or the video has not been rendered yet, the width and height will
   // be 0.
-  virtual void GetNaturalVideoSize(math::Size* out_size) const = 0;
+  virtual void GetNaturalVideoSize(gfx::Size* out_size) const = 0;
 
   // Return true if loading progress has been made since the last time this
   // method was called.
diff --git a/cobalt/media/base/pipeline_metadata.h b/cobalt/media/base/pipeline_metadata.h
deleted file mode 100644
index 87f4791..0000000
--- a/cobalt/media/base/pipeline_metadata.h
+++ /dev/null
@@ -1,30 +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 COBALT_MEDIA_BASE_PIPELINE_METADATA_H_
-#define COBALT_MEDIA_BASE_PIPELINE_METADATA_H_
-
-#include "base/time/time.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/video_rotation.h"
-
-namespace cobalt {
-namespace media {
-
-// Metadata describing a pipeline once it has been initialized.
-struct PipelineMetadata {
-  PipelineMetadata()
-      : has_audio(false), has_video(false), video_rotation(VIDEO_ROTATION_0) {}
-
-  bool has_audio;
-  bool has_video;
-  math::Size natural_size;
-  VideoRotation video_rotation;
-  base::Time timeline_offset;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_PIPELINE_METADATA_H_
diff --git a/cobalt/media/base/pipeline_status.h b/cobalt/media/base/pipeline_status.h
deleted file mode 100644
index 79a5d50..0000000
--- a/cobalt/media/base/pipeline_status.h
+++ /dev/null
@@ -1,82 +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 COBALT_MEDIA_BASE_PIPELINE_STATUS_H_
-#define COBALT_MEDIA_BASE_PIPELINE_STATUS_H_
-
-#include <string>
-
-#include "base/callback.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Status states for pipeline.  All codes except PIPELINE_OK indicate errors.
-// Logged to UMA, so never reuse a value, always add new/greater ones!
-enum PipelineStatus {
-  PIPELINE_OK = 0,
-  // Deprecated: PIPELINE_ERROR_URL_NOT_FOUND = 1,
-  PIPELINE_ERROR_NETWORK = 2,
-  PIPELINE_ERROR_DECODE = 3,
-  // Deprecated: PIPELINE_ERROR_DECRYPT = 4,
-  PIPELINE_ERROR_ABORT = 5,
-  PIPELINE_ERROR_INITIALIZATION_FAILED = 6,
-  PIPELINE_ERROR_COULD_NOT_RENDER = 8,
-  PIPELINE_ERROR_READ = 9,
-  // Deprecated: PIPELINE_ERROR_OPERATION_PENDING = 10,
-  PIPELINE_ERROR_INVALID_STATE = 11,
-  PIPELINE_ERROR_EXTERNAL_RENDERER_FAILED = 21,
-
-  // Demuxer related errors.
-  DEMUXER_ERROR_COULD_NOT_OPEN = 12,
-  DEMUXER_ERROR_COULD_NOT_PARSE = 13,
-  DEMUXER_ERROR_NO_SUPPORTED_STREAMS = 14,
-
-  // Decoder related errors.
-  DECODER_ERROR_NOT_SUPPORTED = 15,
-
-  // ChunkDemuxer related errors.
-  CHUNK_DEMUXER_ERROR_APPEND_FAILED = 16,
-  CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR = 17,
-  CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR = 18,
-
-  // Audio rendering errors.
-  AUDIO_RENDERER_ERROR = 19,
-  AUDIO_RENDERER_ERROR_SPLICE_FAILED = 20,
-
-  // Transient errors.
-  PLAYBACK_CAPABILITY_CHANGED = 22,
-
-  // Must be equal to the largest value ever logged.
-  PIPELINE_STATUS_MAX = PLAYBACK_CAPABILITY_CHANGED,
-};
-
-typedef base::Callback<void(PipelineStatus)> PipelineStatusCB;
-
-struct PipelineStatistics {
-  uint64_t audio_bytes_decoded;
-  uint64_t video_bytes_decoded;
-  uint32_t video_frames_decoded;
-  uint32_t video_frames_dropped;
-  int64_t audio_memory_usage;
-  int64_t video_memory_usage;
-
-  PipelineStatistics()
-      : audio_bytes_decoded(0),
-        video_bytes_decoded(0),
-        video_frames_decoded(0),
-        video_frames_dropped(0),
-        audio_memory_usage(0),
-        video_memory_usage(0) {}
-};
-
-// Used for updating pipeline statistics; the passed value should be a delta
-// of all attributes since the last update.
-typedef base::Callback<void(const PipelineStatistics&)> StatisticsCB;
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_PIPELINE_STATUS_H_
diff --git a/cobalt/media/base/playback_statistics.cc b/cobalt/media/base/playback_statistics.cc
index ff49d71..ffb51f8 100644
--- a/cobalt/media/base/playback_statistics.cc
+++ b/cobalt/media/base/playback_statistics.cc
@@ -25,6 +25,9 @@
 namespace media {
 namespace {
 
+using ::media::GetCodecName;
+using ::media::VideoCodec;
+
 volatile SbAtomic32 s_max_active_instances = 0;
 volatile SbAtomic32 s_active_instances = 0;
 volatile SbAtomic32 s_av1_played = 0;
@@ -35,7 +38,8 @@
 volatile SbAtomic32 s_min_video_height = 999999;
 volatile SbAtomic32 s_max_video_width = 0;
 volatile SbAtomic32 s_max_video_height = 0;
-volatile SbAtomic32 s_last_working_codec = kUnknownVideoCodec;
+volatile SbAtomic32 s_last_working_codec =
+    static_cast<SbAtomic32>(VideoCodec::kUnknown);
 
 int64_t RoundValue(int64_t value) {
   if (value < 10) {
@@ -121,7 +125,8 @@
           false, "Indicator of if the video eos is written."),
       pipeline_status_(base::StringPrintf("Media.Pipeline.%s.PipelineStatus",
                                           pipeline_identifier.c_str()),
-                       PIPELINE_OK, "The status of the media pipeline."),
+                       ::media::PIPELINE_OK,
+                       "The status of the media pipeline."),
       error_message_(base::StringPrintf("Media.Pipeline.%s.ErrorMessage",
                                         pipeline_identifier.c_str()),
                      "", "The error message of the media pipeline error.") {}
@@ -142,13 +147,13 @@
 
     UpdateMaxValue(s_active_instances, &s_max_active_instances);
 
-    if (video_config.codec() == kCodecAV1) {
+    if (video_config.codec() == VideoCodec::kAV1) {
       SbAtomicBarrier_Increment(&s_av1_played, 1);
-    } else if (video_config.codec() == kCodecH264) {
+    } else if (video_config.codec() == VideoCodec::kH264) {
       SbAtomicBarrier_Increment(&s_h264_played, 1);
-    } else if (video_config.codec() == kCodecHEVC) {
+    } else if (video_config.codec() == VideoCodec::kHEVC) {
       SbAtomicBarrier_Increment(&s_hevc_played, 1);
-    } else if (video_config.codec() == kCodecVP9) {
+    } else if (video_config.codec() == VideoCodec::kVP9) {
       SbAtomicBarrier_Increment(&s_vp9_played, 1);
     } else {
       SB_NOTREACHED();
@@ -172,7 +177,8 @@
 
 
 void PlaybackStatistics::OnPresenting(const VideoDecoderConfig& video_config) {
-  SbAtomicNoBarrier_Store(&s_last_working_codec, video_config.codec());
+  SbAtomicNoBarrier_Store(&s_last_working_codec,
+                          static_cast<SbAtomic32>(video_config.codec()));
 }
 
 void PlaybackStatistics::OnSeek(const base::TimeDelta& seek_time) {
diff --git a/cobalt/media/base/playback_statistics.h b/cobalt/media/base/playback_statistics.h
index 7507b31..220d472 100644
--- a/cobalt/media/base/playback_statistics.h
+++ b/cobalt/media/base/playback_statistics.h
@@ -20,15 +20,19 @@
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "cobalt/base/c_val.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "cobalt/media/base/video_decoder_config.h"
+#include "third_party/chromium/media/base/decoder_buffer.h"
+#include "third_party/chromium/media/base/pipeline_status.h"
+#include "third_party/chromium/media/base/video_decoder_config.h"
 
 namespace cobalt {
 namespace media {
 
 class PlaybackStatistics {
  public:
+  typedef ::media::DecoderBuffer DecoderBuffer;
+  typedef ::media::PipelineStatus PipelineStatus;
+  typedef ::media::VideoDecoderConfig VideoDecoderConfig;
+
   explicit PlaybackStatistics(const std::string& pipeline_identifier);
   ~PlaybackStatistics();
 
diff --git a/cobalt/media/base/ranges.cc b/cobalt/media/base/ranges.cc
deleted file mode 100644
index 6e003ec..0000000
--- a/cobalt/media/base/ranges.cc
+++ /dev/null
@@ -1,17 +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 "cobalt/media/base/ranges.h"
-
-namespace cobalt {
-namespace media {
-
-template <>
-void Ranges<base::TimeDelta>::DCheckLT(const base::TimeDelta& lhs,
-                                       const base::TimeDelta& rhs) const {
-  DCHECK(lhs < rhs) << lhs.ToInternalValue() << " < " << rhs.ToInternalValue();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/ranges.h b/cobalt/media/base/ranges.h
deleted file mode 100644
index 50f29a4..0000000
--- a/cobalt/media/base/ranges.h
+++ /dev/null
@@ -1,175 +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 COBALT_MEDIA_BASE_RANGES_H_
-#define COBALT_MEDIA_BASE_RANGES_H_
-
-#include <algorithm>
-#include <ostream>
-#include <utility>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Ranges allows holding an ordered list of ranges of [start,end) intervals.
-// The canonical example use-case is holding the list of ranges of buffered
-// bytes or times in a <video> tag.
-template <class T>  // Endpoint type; typically a base::TimeDelta or an int64_t.
-class Ranges {
- public:
-  // Allow copy & assign.
-
-  // Add (start,end) to this object, coallescing overlaps as appropriate.
-  // Returns the number of stored ranges, post coallescing.
-  size_t Add(T start, T end);
-
-  // Return the number of disjoint ranges.
-  size_t size() const;
-
-  // Return the "i"'th range's start & end (0-based).
-  T start(size_t i) const;
-  T end(size_t i) const;
-
-  // Clear all ranges.
-  void clear();
-
-  // Computes the intersection between this range and |other|.
-  Ranges<T> IntersectionWith(const Ranges<T>& other) const;
-
- private:
-  // Wrapper around DCHECK_LT allowing comparisons of operator<<'able T's.
-  void DCheckLT(const T& lhs, const T& rhs) const;
-
-  // Disjoint, in increasing order of start.
-  std::vector<std::pair<T, T> > ranges_;
-};
-
-//////////////////////////////////////////////////////////////////////
-// EVERYTHING BELOW HERE IS IMPLEMENTATION DETAIL!!
-//////////////////////////////////////////////////////////////////////
-
-template <class T>
-size_t Ranges<T>::Add(T start, T end) {
-  if (start == end)  // Nothing to be done with empty ranges.
-    return ranges_.size();
-
-  DCheckLT(start, end);
-  size_t i;
-  // Walk along the array of ranges until |start| is no longer larger than the
-  // current interval's end.
-  for (i = 0; i < ranges_.size() && ranges_[i].second < start; ++i) {
-    // Empty body
-  }
-
-  // Now we know |start| belongs in the i'th slot.
-  // If i is the end of the range, append new range and done.
-  if (i == ranges_.size()) {
-    ranges_.push_back(std::make_pair(start, end));
-    return ranges_.size();
-  }
-
-  // If |end| is less than i->first, then [start,end) is a new (non-overlapping)
-  // i'th entry pushing everyone else back, and done.
-  if (end < ranges_[i].first) {
-    ranges_.insert(ranges_.begin() + i, std::make_pair(start, end));
-    return ranges_.size();
-  }
-
-  // Easy cases done.  Getting here means there is overlap between [start,end)
-  // and the existing ranges.
-
-  // Now: start <= i->second && i->first <= end
-  if (start < ranges_[i].first) ranges_[i].first = start;
-  if (ranges_[i].second < end) ranges_[i].second = end;
-
-  // Now: [start,end) is contained in the i'th range, and we'd be done, except
-  // for the fact that the newly-extended i'th range might now overlap
-  // subsequent ranges.  Merge until discontinuities appear.  Note that there's
-  // no need to test/merge previous ranges, since needing that would mean the
-  // original loop went too far.
-  while ((i + 1) < ranges_.size() &&
-         ranges_[i + 1].first <= ranges_[i].second) {
-    ranges_[i].second = std::max(ranges_[i].second, ranges_[i + 1].second);
-    ranges_.erase(ranges_.begin() + i + 1);
-  }
-
-  return ranges_.size();
-}
-
-template <>
-MEDIA_EXPORT void Ranges<base::TimeDelta>::DCheckLT(
-    const base::TimeDelta& lhs, const base::TimeDelta& rhs) const;
-
-template <class T>
-void Ranges<T>::DCheckLT(const T& lhs, const T& rhs) const {
-  DCHECK_LT(lhs, rhs);
-}
-
-template <class T>
-size_t Ranges<T>::size() const {
-  return ranges_.size();
-}
-
-template <class T>
-T Ranges<T>::start(size_t i) const {
-  return ranges_[i].first;
-}
-
-template <class T>
-T Ranges<T>::end(size_t i) const {
-  return ranges_[i].second;
-}
-
-template <class T>
-void Ranges<T>::clear() {
-  ranges_.clear();
-}
-
-template <class T>
-Ranges<T> Ranges<T>::IntersectionWith(const Ranges<T>& other) const {
-  Ranges<T> result;
-
-  size_t i = 0;
-  size_t j = 0;
-
-  while (i < size() && j < other.size()) {
-    T max_start = std::max(start(i), other.start(j));
-    T min_end = std::min(end(i), other.end(j));
-
-    // Add an intersection range to the result if the ranges overlap.
-    if (max_start < min_end) result.Add(max_start, min_end);
-
-    if (end(i) < other.end(j))
-      ++i;
-    else
-      ++j;
-  }
-
-  return result;
-}
-
-// For logging use only.
-template <class T>
-BASE_EXPORT std::ostream& operator<<(std::ostream& os,
-                                     const Ranges<T>& ranges) {
-  os << ranges.size() << " (";
-  for (size_t i = 0; i < ranges.size(); ++i) {
-    os << '[' << ranges.start(i) << ", " << ranges.end(i) << ']';
-    if (i != ranges.size() - 1) {
-      os << ", ";
-    }
-  }
-  return os << ')';
-}
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_RANGES_H_
diff --git a/cobalt/media/base/ranges_unittest.cc b/cobalt/media/base/ranges_unittest.cc
deleted file mode 100644
index 02d0af8..0000000
--- a/cobalt/media/base/ranges_unittest.cc
+++ /dev/null
@@ -1,154 +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 "cobalt/media/base/ranges.h"
-
-#include <sstream>
-
-#include "base/strings/string_piece.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-// Human-readable output operator, for debugging/testability.
-template <class T>
-std::ostream& operator<<(std::ostream& os, const Ranges<T>& r) {
-  os << "{ ";
-  for (size_t i = 0; i < r.size(); ++i)
-    os << "[" << r.start(i) << "," << r.end(i) << ") ";
-  os << "}";
-  return os;
-}
-
-// Helper method for asserting stringified form of |r| matches expectation.
-template <class T>
-static void ExpectRanges(const Ranges<T>& r,
-                         const base::StringPiece& expected_string) {
-  std::stringstream ss;
-  ss << r;
-  ASSERT_EQ(ss.str(), expected_string);
-}
-
-#define ASSERT_RANGES(ranges, expectation) \
-  ASSERT_NO_FATAL_FAILURE(ExpectRanges(ranges, expectation));
-
-TEST(RangesTest, SimpleTests) {
-  Ranges<int> r;
-  ASSERT_EQ(r.size(), 0u) << r;
-  ASSERT_EQ(r.Add(0, 1), 1u) << r;
-  ASSERT_EQ(r.size(), 1u) << r;
-  ASSERT_RANGES(r, "{ [0,1) }");
-  ASSERT_EQ(r.Add(2, 3), 2u) << r;
-  ASSERT_RANGES(r, "{ [0,1) [2,3) }");
-  ASSERT_EQ(r.Add(1, 2), 1u) << r;
-  ASSERT_RANGES(r, "{ [0,3) }");
-  ASSERT_EQ(r.Add(1, 4), 1u) << r;
-  ASSERT_RANGES(r, "{ [0,4) }");
-  ASSERT_EQ(r.Add(7, 9), 2u) << r;
-  ASSERT_EQ(r.Add(5, 6), 3u) << r;
-  ASSERT_RANGES(r, "{ [0,4) [5,6) [7,9) }");
-  ASSERT_EQ(r.Add(6, 7), 2u) << r;
-  ASSERT_RANGES(r, "{ [0,4) [5,9) }");
-}
-
-TEST(RangesTest, ExtendRange) {
-  Ranges<double> r;
-  ASSERT_EQ(r.Add(0, 1), 1u) << r;
-  ASSERT_EQ(r.Add(0.5, 1.5), 1u) << r;
-  ASSERT_RANGES(r, "{ [0,1.5) }");
-
-  r.clear();
-  ASSERT_EQ(r.Add(0, 1), 1u) << r;
-  ASSERT_EQ(r.Add(-0.5, 0.5), 1u) << r;
-  ASSERT_RANGES(r, "{ [-0.5,1) }");
-
-  r.clear();
-  ASSERT_EQ(r.Add(0, 1), 1u) << r;
-  ASSERT_EQ(r.Add(2, 3), 2u) << r;
-  ASSERT_EQ(r.Add(4, 5), 3u) << r;
-  ASSERT_EQ(r.Add(0.5, 1.5), 3u) << r;
-  ASSERT_RANGES(r, "{ [0,1.5) [2,3) [4,5) }");
-
-  r.clear();
-  ASSERT_EQ(r.Add(0, 1), 1u) << r;
-  ASSERT_EQ(r.Add(2, 3), 2u) << r;
-  ASSERT_EQ(r.Add(4, 5), 3u) << r;
-  ASSERT_EQ(r.Add(1.5, 2.5), 3u) << r;
-  ASSERT_RANGES(r, "{ [0,1) [1.5,3) [4,5) }");
-}
-
-TEST(RangesTest, CoalesceRanges) {
-  Ranges<double> r;
-  ASSERT_EQ(r.Add(0, 1), 1u) << r;
-  ASSERT_EQ(r.Add(2, 3), 2u) << r;
-  ASSERT_EQ(r.Add(4, 5), 3u) << r;
-  ASSERT_EQ(r.Add(0.5, 2.5), 2u) << r;
-  ASSERT_RANGES(r, "{ [0,3) [4,5) }");
-
-  r.clear();
-  ASSERT_EQ(r.Add(0, 1), 1u) << r;
-  ASSERT_EQ(r.Add(2, 3), 2u) << r;
-  ASSERT_EQ(r.Add(4, 5), 3u) << r;
-  ASSERT_EQ(r.Add(0.5, 4.5), 1u) << r;
-  ASSERT_RANGES(r, "{ [0,5) }");
-
-  r.clear();
-  ASSERT_EQ(r.Add(0, 1), 1u) << r;
-  ASSERT_EQ(r.Add(1, 2), 1u) << r;
-  ASSERT_RANGES(r, "{ [0,2) }");
-}
-
-TEST(RangesTest, IntersectionWith) {
-  Ranges<int> a;
-  Ranges<int> b;
-
-  ASSERT_EQ(a.Add(0, 1), 1u) << a;
-  ASSERT_EQ(a.Add(4, 7), 2u) << a;
-  ASSERT_EQ(a.Add(10, 12), 3u) << a;
-
-  // Test intersections with an empty range.
-  ASSERT_RANGES(a, "{ [0,1) [4,7) [10,12) }");
-  ASSERT_RANGES(b, "{ }");
-  ASSERT_RANGES(a.IntersectionWith(b), "{ }");
-  ASSERT_RANGES(b.IntersectionWith(a), "{ }");
-
-  // Test intersections with a completely overlapping range.
-  ASSERT_EQ(b.Add(-1, 13), 1u) << b;
-  ASSERT_RANGES(a, "{ [0,1) [4,7) [10,12) }");
-  ASSERT_RANGES(b, "{ [-1,13) }");
-  ASSERT_RANGES(a.IntersectionWith(b), "{ [0,1) [4,7) [10,12) }");
-  ASSERT_RANGES(b.IntersectionWith(a), "{ [0,1) [4,7) [10,12) }");
-
-  // Test intersections with a disjoint ranges.
-  b.clear();
-  ASSERT_EQ(b.Add(1, 4), 1u) << b;
-  ASSERT_EQ(b.Add(8, 9), 2u) << b;
-  ASSERT_RANGES(a, "{ [0,1) [4,7) [10,12) }");
-  ASSERT_RANGES(b, "{ [1,4) [8,9) }");
-  ASSERT_RANGES(a.IntersectionWith(b), "{ }");
-  ASSERT_RANGES(b.IntersectionWith(a), "{ }");
-
-  // Test intersections with partially overlapping ranges.
-  b.clear();
-  ASSERT_EQ(b.Add(0, 3), 1u) << b;
-  ASSERT_EQ(b.Add(5, 11), 2u) << b;
-  ASSERT_RANGES(a, "{ [0,1) [4,7) [10,12) }");
-  ASSERT_RANGES(b, "{ [0,3) [5,11) }");
-  ASSERT_RANGES(a.IntersectionWith(b), "{ [0,1) [5,7) [10,11) }");
-  ASSERT_RANGES(b.IntersectionWith(a), "{ [0,1) [5,7) [10,11) }");
-
-  // Test intersection with a range that starts at the beginning of the
-  // first range and ends at the end of the last range.
-  b.clear();
-  ASSERT_EQ(b.Add(0, 12), 1u) << b;
-  ASSERT_RANGES(a, "{ [0,1) [4,7) [10,12) }");
-  ASSERT_RANGES(b, "{ [0,12) }");
-  ASSERT_RANGES(a.IntersectionWith(b), "{ [0,1) [4,7) [10,12) }");
-  ASSERT_RANGES(b.IntersectionWith(a), "{ [0,1) [4,7) [10,12) }");
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/renderer.cc b/cobalt/media/base/renderer.cc
deleted file mode 100644
index 9d5c26e..0000000
--- a/cobalt/media/base/renderer.cc
+++ /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.
-
-#include "cobalt/media/base/renderer.h"
-
-namespace cobalt {
-namespace media {
-
-Renderer::Renderer() {}
-
-Renderer::~Renderer() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/renderer.h b/cobalt/media/base/renderer.h
deleted file mode 100644
index 9d3b3eb..0000000
--- a/cobalt/media/base/renderer.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 COBALT_MEDIA_BASE_RENDERER_H_
-#define COBALT_MEDIA_BASE_RENDERER_H_
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/buffering_state.h"
-#include "cobalt/media/base/cdm_context.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/pipeline_status.h"
-
-namespace cobalt {
-namespace media {
-
-class DemuxerStreamProvider;
-class RendererClient;
-class VideoFrame;
-
-class MEDIA_EXPORT Renderer {
- public:
-  Renderer();
-
-  // Stops rendering and fires any pending callbacks.
-  virtual ~Renderer();
-
-  // Initializes the Renderer with |demuxer_stream_provider|, executing
-  // |init_cb| upon completion. |demuxer_stream_provider| must be valid for
-  // the lifetime of the Renderer object.  |init_cb| must only be run after this
-  // method has returned.  Firing |init_cb| may result in the immediate
-  // destruction of the caller, so it must be run only prior to returning.
-  virtual void Initialize(DemuxerStreamProvider* demuxer_stream_provider,
-                          RendererClient* client,
-                          const PipelineStatusCB& init_cb) = 0;
-
-  // Associates the |cdm_context| with this Renderer for decryption (and
-  // decoding) of media data, then fires |cdm_attached_cb| with the result.
-  virtual void SetCdm(CdmContext* cdm_context,
-                      const CdmAttachedCB& cdm_attached_cb) = 0;
-
-  // The following functions must be called after Initialize().
-
-  // Discards any buffered data, executing |flush_cb| when completed.
-  virtual void Flush(const base::Closure& flush_cb) = 0;
-
-  // Starts rendering from |time|.
-  virtual void StartPlayingFrom(base::TimeDelta time) = 0;
-
-  // Updates the current playback rate. The default playback rate should be 0.
-  virtual void SetPlaybackRate(double playback_rate) = 0;
-
-  // Sets the output volume. The default volume should be 1.
-  virtual void SetVolume(float volume) = 0;
-
-  // Returns the current media time.
-  virtual base::TimeDelta GetMediaTime() = 0;
-
-  // Returns whether |this| renders audio.
-  virtual bool HasAudio() = 0;
-
-  // Returns whether |this| renders video.
-  virtual bool HasVideo() = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Renderer);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_RENDERER_H_
diff --git a/cobalt/media/base/renderer_client.h b/cobalt/media/base/renderer_client.h
deleted file mode 100644
index 4fe4919..0000000
--- a/cobalt/media/base/renderer_client.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_RENDERER_CLIENT_H_
-#define COBALT_MEDIA_BASE_RENDERER_CLIENT_H_
-
-#include "base/time/time.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/pipeline_status.h"
-
-namespace cobalt {
-namespace media {
-
-// Interface used by Renderer, AudioRenderer, VideoRenderer and
-// MediaPlayerRenderer implementations to notify their clients.
-class RendererClient {
- public:
-  // Executed if any error was encountered after Renderer initialization.
-  virtual void OnError(PipelineStatus status) = 0;
-
-  // Executed when rendering has reached the end of stream.
-  virtual void OnEnded() = 0;
-
-  // Executed periodically with rendering statistics.
-  virtual void OnStatisticsUpdate(const PipelineStatistics& stats) = 0;
-
-  // Executed when buffering state is changed.
-  virtual void OnBufferingStateChange(BufferingState state) = 0;
-
-  // Executed whenever the key needed to decrypt the stream is not available.
-  virtual void OnWaitingForDecryptionKey() = 0;
-
-  // Executed for the first video frame and whenever natural size changes.
-  // Only used if media stream contains video track.
-  virtual void OnVideoNaturalSizeChange(const math::Size& size) = 0;
-
-  // Executed for the first video frame and whenever opacity changes.
-  // Only used if media stream contains video track.
-  virtual void OnVideoOpacityChange(bool opaque) = 0;
-
-  // Executed when video metadata is first read, and whenever it changes.
-  // Only used when we are using a URL demuxer (e.g. for MediaPlayerRenderer).
-  virtual void OnDurationChange(base::TimeDelta duration) = 0;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_RENDERER_CLIENT_H_
diff --git a/cobalt/media/base/run_all_perftests.cc b/cobalt/media/base/run_all_perftests.cc
deleted file mode 100644
index 3c8b9af..0000000
--- a/cobalt/media/base/run_all_perftests.cc
+++ /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.
-
-#include "base/bind.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/test_suite.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/media.h"
-
-class TestSuiteNoAtExit : public base::TestSuite {
- public:
-  TestSuiteNoAtExit(int argc, char** argv) : TestSuite(argc, argv) {}
-  ~TestSuiteNoAtExit() override {}
-
- protected:
-  void Initialize() override;
-};
-
-void TestSuiteNoAtExit::Initialize() {
-  // Run TestSuite::Initialize first so that logging is initialized.
-  base::AtExitManager exit_manager;
-  base::TestSuite::Initialize();
-
-  // Run this here instead of main() to ensure an AtExitManager is already
-  // present.
-  media::InitializeMediaLibrary();
-}
-
-int main(int argc, char** argv) {
-  TestSuiteNoAtExit test_suite(argc, argv);
-
-  // Always run the perf tests serially, to avoid distorting
-  // perf measurements with randomness resulting from running
-  // in parallel.
-  return base::LaunchUnitTestsSerially(
-      argc, argv,
-      base::Bind(&TestSuiteNoAtExit::Run, base::Unretained(&test_suite)));
-}
diff --git a/cobalt/media/base/run_all_unittests.cc b/cobalt/media/base/run_all_unittests.cc
deleted file mode 100644
index ef1a8ef..0000000
--- a/cobalt/media/base/run_all_unittests.cc
+++ /dev/null
@@ -1,67 +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/bind.h"
-#include "base/command_line.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/test_discardable_memory_allocator.h"
-#include "base/test/test_suite.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/fake_media_resources.h"
-#include "cobalt/media/base/media.h"
-#include "cobalt/media/base/media_switches.h"
-
-#if defined(OS_ANDROID)
-#include "base/android/jni_android.h"
-#include "cobalt/media/base/android/media_codec_util.h"
-#include "cobalt/media/base/android/media_jni_registrar.h"
-#include "ui/gl/android/gl_jni_registrar.h"
-#endif
-
-class TestSuiteNoAtExit : public base::TestSuite {
- public:
-  TestSuiteNoAtExit(int argc, char** argv) : TestSuite(argc, argv) {}
-  ~TestSuiteNoAtExit() override {}
-
- protected:
-  void Initialize() override;
-
- private:
-  base::TestDiscardableMemoryAllocator discardable_memory_allocator_;
-};
-
-void TestSuiteNoAtExit::Initialize() {
-  // Run TestSuite::Initialize first so that logging is initialized.
-  base::AtExitManager exit_manager;
-  base::TestSuite::Initialize();
-
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  command_line->AppendSwitch(switches::kEnableInbandTextTracks);
-
-#if defined(OS_ANDROID)
-  // Register JNI bindings for android.
-  JNIEnv* env = base::android::AttachCurrentThread();
-  // Needed for surface texture support.
-  ui::gl::android::RegisterJni(env);
-  media::RegisterJni(env);
-
-  if (media::MediaCodecUtil::IsMediaCodecAvailable())
-    media::EnablePlatformDecoderSupport();
-#endif
-
-  // Run this here instead of main() to ensure an AtExitManager is already
-  // present.
-  media::InitializeMediaLibrary();
-  media::SetUpFakeMediaResources();
-
-  base::DiscardableMemoryAllocator::SetInstance(&discardable_memory_allocator_);
-}
-
-int main(int argc, char** argv) {
-  TestSuiteNoAtExit test_suite(argc, argv);
-
-  return base::LaunchUnitTests(
-      argc, argv,
-      base::Bind(&TestSuiteNoAtExit::Run, base::Unretained(&test_suite)));
-}
diff --git a/cobalt/media/base/sample_format.cc b/cobalt/media/base/sample_format.cc
deleted file mode 100644
index 8245b24..0000000
--- a/cobalt/media/base/sample_format.cc
+++ /dev/null
@@ -1,97 +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 "cobalt/media/base/sample_format.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-int SampleFormatToBytesPerChannel(SampleFormat sample_format) {
-  switch (sample_format) {
-    case kUnknownSampleFormat:
-      return 0;
-    case kSampleFormatU8:
-      return 1;
-    case kSampleFormatS16:
-    case kSampleFormatPlanarS16:
-      return 2;
-    case kSampleFormatS24:
-    case kSampleFormatS32:
-    case kSampleFormatF32:
-    case kSampleFormatPlanarF32:
-    case kSampleFormatPlanarS32:
-      return 4;
-  }
-
-  NOTREACHED() << "Invalid sample format provided: " << sample_format;
-  return 0;
-}
-
-const char* SampleFormatToString(SampleFormat sample_format) {
-  switch (sample_format) {
-    case kUnknownSampleFormat:
-      return "Unknown sample format";
-    case kSampleFormatU8:
-      return "Unsigned 8-bit with bias of 128";
-    case kSampleFormatS16:
-      return "Signed 16-bit";
-    case kSampleFormatS24:
-      return "Signed 24-bit";
-    case kSampleFormatS32:
-      return "Signed 32-bit";
-    case kSampleFormatF32:
-      return "Float 32-bit";
-    case kSampleFormatPlanarS16:
-      return "Signed 16-bit planar";
-    case kSampleFormatPlanarF32:
-      return "Float 32-bit planar";
-    case kSampleFormatPlanarS32:
-      return "Signed 32-bit planar";
-  }
-  NOTREACHED() << "Invalid sample format provided: " << sample_format;
-  return "";
-}
-
-bool IsPlanar(SampleFormat sample_format) {
-  switch (sample_format) {
-    case kSampleFormatPlanarS16:
-    case kSampleFormatPlanarF32:
-    case kSampleFormatPlanarS32:
-      return true;
-    case kUnknownSampleFormat:
-    case kSampleFormatU8:
-    case kSampleFormatS16:
-    case kSampleFormatS24:
-    case kSampleFormatS32:
-    case kSampleFormatF32:
-      return false;
-  }
-
-  NOTREACHED() << "Invalid sample format provided: " << sample_format;
-  return false;
-}
-
-bool IsInterleaved(SampleFormat sample_format) {
-  switch (sample_format) {
-    case kSampleFormatU8:
-    case kSampleFormatS16:
-    case kSampleFormatS24:
-    case kSampleFormatS32:
-    case kSampleFormatF32:
-      return true;
-    case kUnknownSampleFormat:
-    case kSampleFormatPlanarS16:
-    case kSampleFormatPlanarF32:
-    case kSampleFormatPlanarS32:
-      return false;
-  }
-
-  NOTREACHED() << "Invalid sample format provided: " << sample_format;
-  return false;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/sample_format.h b/cobalt/media/base/sample_format.h
deleted file mode 100644
index 017f84b..0000000
--- a/cobalt/media/base/sample_format.h
+++ /dev/null
@@ -1,48 +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 COBALT_MEDIA_BASE_SAMPLE_FORMAT_H_
-#define COBALT_MEDIA_BASE_SAMPLE_FORMAT_H_
-
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-enum SampleFormat {
-  // These values are histogrammed over time; do not change their ordinal
-  // values.  When deleting a sample format replace it with a dummy value; when
-  // adding a sample format, do so at the bottom before kSampleFormatMax, and
-  // update the value of kSampleFormatMax.
-  kUnknownSampleFormat = 0,
-  kSampleFormatU8,         // Unsigned 8-bit w/ bias of 128.
-  kSampleFormatS16,        // Signed 16-bit.
-  kSampleFormatS32,        // Signed 32-bit.
-  kSampleFormatF32,        // Float 32-bit.
-  kSampleFormatPlanarS16,  // Signed 16-bit planar.
-  kSampleFormatPlanarF32,  // Float 32-bit planar.
-  kSampleFormatPlanarS32,  // Signed 32-bit planar.
-  kSampleFormatS24,        // Signed 24-bit.
-
-  // Must always be equal to largest value ever logged.
-  kSampleFormatMax = kSampleFormatS24,
-};
-
-// Returns the number of bytes used per channel for the specified
-// |sample_format|.
-MEDIA_EXPORT int SampleFormatToBytesPerChannel(SampleFormat sample_format);
-
-// Returns the name of the sample format as a string
-MEDIA_EXPORT const char* SampleFormatToString(SampleFormat sample_format);
-
-// Returns true if |sample_format| is planar, false otherwise.
-MEDIA_EXPORT bool IsPlanar(SampleFormat sample_format);
-
-// Returns true if |sample_format| is interleaved, false otherwise.
-MEDIA_EXPORT bool IsInterleaved(SampleFormat sample_format);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_SAMPLE_FORMAT_H_
diff --git a/cobalt/media/base/sbplayer_pipeline.cc b/cobalt/media/base/sbplayer_pipeline.cc
index 52e44a4..2c245c7 100644
--- a/cobalt/media/base/sbplayer_pipeline.cc
+++ b/cobalt/media/base/sbplayer_pipeline.cc
@@ -14,6 +14,7 @@
 
 #include <algorithm>
 #include <memory>
+#include <string>
 #include <vector>
 
 #include "base/basictypes.h"  // For COMPILE_ASSERT
@@ -28,32 +29,43 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/c_val.h"
+#include "cobalt/base/startup_timer.h"
 #include "cobalt/math/size.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer.h"
-#include "cobalt/media/base/demuxer_stream.h"
 #include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
 #include "cobalt/media/base/pipeline.h"
-#include "cobalt/media/base/pipeline_status.h"
 #include "cobalt/media/base/playback_statistics.h"
-#include "cobalt/media/base/ranges.h"
 #include "cobalt/media/base/sbplayer_set_bounds_helper.h"
 #include "cobalt/media/base/starboard_player.h"
-#include "cobalt/media/base/video_decoder_config.h"
 #include "starboard/common/string.h"
 #include "starboard/configuration_constants.h"
+#include "starboard/time.h"
+#include "third_party/chromium/media/base/audio_decoder_config.h"
+#include "third_party/chromium/media/base/bind_to_current_loop.h"
+#include "third_party/chromium/media/base/channel_layout.h"
+#include "third_party/chromium/media/base/decoder_buffer.h"
+#include "third_party/chromium/media/base/demuxer.h"
+#include "third_party/chromium/media/base/demuxer_stream.h"
+#include "third_party/chromium/media/base/media_log.h"
+#include "third_party/chromium/media/base/pipeline_status.h"
+#include "third_party/chromium/media/base/ranges.h"
+#include "third_party/chromium/media/base/video_decoder_config.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/rect.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/size.h"
 
 namespace cobalt {
 namespace media {
+namespace {
 
 using base::Time;
 using base::TimeDelta;
-
-namespace {
+using ::media::AudioDecoderConfig;
+using ::media::DecoderBuffer;
+using ::media::Demuxer;
+using ::media::DemuxerHost;
+using ::media::DemuxerStream;
+using ::media::VideoDecoderConfig;
+using ::media::PipelineStatistics;
+using ::media::PipelineStatusCallback;
 
 static const int kRetryDelayAtSuspendInMilliseconds = 100;
 
@@ -64,7 +76,7 @@
 struct StartTaskParameters {
   Demuxer* demuxer;
   SetDrmSystemReadyCB set_drm_system_ready_cb;
-  PipelineStatusCB ended_cb;
+  PipelineStatusCallback ended_cb;
   ErrorCB error_cb;
   Pipeline::SeekCB seek_cb;
   Pipeline::BufferingStateCB buffering_state_cb;
@@ -101,7 +113,7 @@
 
   void Start(Demuxer* demuxer,
              const SetDrmSystemReadyCB& set_drm_system_ready_cb,
-             const PipelineStatusCB& ended_cb, const ErrorCB& error_cb,
+             PipelineStatusCallback ended_cb, const ErrorCB& error_cb,
              const SeekCB& seek_cb, const BufferingStateCB& buffering_state_cb,
              const base::Closure& duration_change_cb,
              const base::Closure& output_mode_change_cb,
@@ -111,7 +123,7 @@
   void Start(const SetDrmSystemReadyCB& set_drm_system_ready_cb,
              const OnEncryptedMediaInitDataEncounteredCB&
                  encrypted_media_init_data_encountered_cb,
-             const std::string& source_url, const PipelineStatusCB& ended_cb,
+             const std::string& source_url, PipelineStatusCallback ended_cb,
              const ErrorCB& error_cb, const SeekCB& seek_cb,
              const BufferingStateCB& buffering_state_cb,
              const base::Closure& duration_change_cb,
@@ -130,12 +142,12 @@
   void SetVolume(float volume) override;
 
   TimeDelta GetMediaTime() override;
-  Ranges<TimeDelta> GetBufferedTimeRanges() override;
+  ::media::Ranges<TimeDelta> GetBufferedTimeRanges() override;
   TimeDelta GetMediaDuration() const override;
 #if SB_HAS(PLAYER_WITH_URL)
   TimeDelta GetMediaStartDate() const override;
 #endif  // SB_HAS(PLAYER_WITH_URL)
-  void GetNaturalVideoSize(math::Size* out_size) const override;
+  void GetNaturalVideoSize(gfx::Size* out_size) const override;
 
   bool DidLoadingProgress() const override;
   PipelineStatistics GetStatistics() const override;
@@ -143,19 +155,16 @@
   void SetDecodeToTextureOutputMode(bool enabled) override;
 
  private:
-  void StartTask(const StartTaskParameters& parameters);
+  void StartTask(StartTaskParameters parameters);
   void SetVolumeTask(float volume);
   void SetPlaybackRateTask(float volume);
   void SetDurationTask(TimeDelta duration);
 
   // DemuxerHost implementation.
   void OnBufferedTimeRangesChanged(
-      const Ranges<base::TimeDelta>& ranges) override;
+      const ::media::Ranges<base::TimeDelta>& ranges) override;
   void SetDuration(TimeDelta duration) override;
   void OnDemuxerError(PipelineStatus error) override;
-  void AddTextStream(DemuxerStream* text_stream,
-                     const TextTrackConfig& config) override;
-  void RemoveTextStream(DemuxerStream* text_stream) override;
 
 #if SB_HAS(PLAYER_WITH_URL)
   void CreateUrlPlayer(const std::string& source_url);
@@ -168,7 +177,7 @@
   void OnDemuxerStopped();
   void OnDemuxerStreamRead(DemuxerStream::Type type,
                            DemuxerStream::Status status,
-                           const scoped_refptr<DecoderBuffer>& buffer);
+                           scoped_refptr<DecoderBuffer> buffer);
   // StarboardPlayer::Host implementation.
   void OnNeedData(DemuxerStream::Type type) override;
   void OnPlayerStatus(SbPlayerState state) override;
@@ -193,6 +202,12 @@
   // Retrieve the statistics as a string and append to message.
   std::string AppendStatisticsString(const std::string& message) const;
 
+  // Get information on the time since app start and the time since the last
+  // playback resume.
+  std::string GetTimeInformation() const;
+
+  void RunSetDrmSystemReadyCB();
+
   // An identifier string for the pipeline, used in CVal to identify multiple
   // pipelines.
   const std::string pipeline_identifier_;
@@ -215,14 +230,14 @@
   mutable base::Lock lock_;
 
   // Amount of available buffered data.  Set by filters.
-  Ranges<TimeDelta> buffered_time_ranges_;
+  ::media::Ranges<TimeDelta> buffered_time_ranges_;
 
   // True when AddBufferedByteRange() has been called more recently than
   // DidLoadingProgress().
   mutable bool did_loading_progress_;
 
   // Video's natural width and height.  Set by filters.
-  math::Size natural_size_;
+  gfx::Size natural_size_;
 
   // Current volume level (from 0.0f to 1.0f).  This value is set immediately
   // via SetVolume() and a task is dispatched on the message loop to notify the
@@ -250,7 +265,7 @@
 
   // Permanent callbacks passed in via Start().
   SetDrmSystemReadyCB set_drm_system_ready_cb_;
-  PipelineStatusCB ended_cb_;
+  PipelineStatusCallback ended_cb_;
   ErrorCB error_cb_;
   BufferingStateCB buffering_state_cb_;
   base::Closure duration_change_cb_;
@@ -317,6 +332,10 @@
 
   PlaybackStatistics playback_statistics_;
 
+  SbTimeMonotonic last_resume_time_ = -1;
+
+  SbTimeMonotonic set_drm_system_ready_cb_time_ = -1;
+
   DISALLOW_COPY_AND_ASSIGN(SbPlayerPipeline);
 };
 
@@ -408,29 +427,21 @@
         on_encrypted_media_init_data_encountered,
     const char* init_data_type, const unsigned char* init_data,
     unsigned int init_data_length) {
-  media::EmeInitDataType init_data_type_enum;
-  if (!strcmp(init_data_type, "cenc")) {
-    init_data_type_enum = media::kEmeInitDataTypeCenc;
-  } else if (!strcmp(init_data_type, "fairplay")) {
-    init_data_type_enum = media::kEmeInitDataTypeFairplay;
-  } else if (!strcmp(init_data_type, "keyids")) {
-    init_data_type_enum = media::kEmeInitDataTypeKeyIds;
-  } else if (!strcmp(init_data_type, "webm")) {
-    init_data_type_enum = media::kEmeInitDataTypeWebM;
-  } else {
-    LOG(WARNING) << "Unknown EME initialization data type.";
-    return;
-  }
+  LOG_IF(WARNING, strcmp(init_data_type, "cenc") != 0 &&
+                      strcmp(init_data_type, "fairplay") != 0 &&
+                      strcmp(init_data_type, "keyids") != 0 &&
+                      strcmp(init_data_type, "webm") != 0)
+      << "Unknown EME initialization data type: " << init_data_type;
+
   std::vector<uint8_t> init_data_vec(init_data, init_data + init_data_length);
   DCHECK(!on_encrypted_media_init_data_encountered.is_null());
-  on_encrypted_media_init_data_encountered.Run(init_data_type_enum,
-                                               init_data_vec);
+  on_encrypted_media_init_data_encountered.Run(init_data_type, init_data_vec);
 }
 #endif  // SB_HAS(PLAYER_WITH_URL)
 
 void SbPlayerPipeline::Start(Demuxer* demuxer,
                              const SetDrmSystemReadyCB& set_drm_system_ready_cb,
-                             const PipelineStatusCB& ended_cb,
+                             PipelineStatusCallback ended_cb,
                              const ErrorCB& error_cb, const SeekCB& seek_cb,
                              const BufferingStateCB& buffering_state_cb,
                              const base::Closure& duration_change_cb,
@@ -451,7 +462,7 @@
   StartTaskParameters parameters;
   parameters.demuxer = demuxer;
   parameters.set_drm_system_ready_cb = set_drm_system_ready_cb;
-  parameters.ended_cb = ended_cb;
+  parameters.ended_cb = std::move(ended_cb);
   parameters.error_cb = error_cb;
   parameters.seek_cb = seek_cb;
   parameters.buffering_state_cb = buffering_state_cb;
@@ -463,8 +474,9 @@
   parameters.is_url_based = false;
 #endif  // SB_HAS(PLAYER_WITH_URL)
 
-  task_runner_->PostTask(
-      FROM_HERE, base::Bind(&SbPlayerPipeline::StartTask, this, parameters));
+  task_runner_->PostTask(FROM_HERE,
+                         base::Bind(&SbPlayerPipeline::StartTask, this,
+                                    base::Passed(&parameters)));
 }
 
 #if SB_HAS(PLAYER_WITH_URL)
@@ -472,7 +484,7 @@
                              const OnEncryptedMediaInitDataEncounteredCB&
                                  on_encrypted_media_init_data_encountered_cb,
                              const std::string& source_url,
-                             const PipelineStatusCB& ended_cb,
+                             PipelineStatusCallback ended_cb,
                              const ErrorCB& error_cb, const SeekCB& seek_cb,
                              const BufferingStateCB& buffering_state_cb,
                              const base::Closure& duration_change_cb,
@@ -492,7 +504,7 @@
   StartTaskParameters parameters;
   parameters.demuxer = NULL;
   parameters.set_drm_system_ready_cb = set_drm_system_ready_cb;
-  parameters.ended_cb = ended_cb;
+  parameters.ended_cb = std::move(ended_cb);
   parameters.error_cb = error_cb;
   parameters.seek_cb = seek_cb;
   parameters.buffering_state_cb = buffering_state_cb;
@@ -506,11 +518,11 @@
                  on_encrypted_media_init_data_encountered_cb);
   set_drm_system_ready_cb_ = parameters.set_drm_system_ready_cb;
   DCHECK(!set_drm_system_ready_cb_.is_null());
-  set_drm_system_ready_cb_.Run(
-      base::Bind(&SbPlayerPipeline::SetDrmSystem, this));
+  RunSetDrmSystemReadyCB();
 
-  task_runner_->PostTask(
-      FROM_HERE, base::Bind(&SbPlayerPipeline::StartTask, this, parameters));
+  task_runner_->PostTask(FROM_HERE,
+                         base::Bind(&SbPlayerPipeline::StartTask, this,
+                                    base::Passed(&parameters)));
 }
 #endif  // SB_HAS(PLAYER_WITH_URL)
 
@@ -561,7 +573,7 @@
   playback_statistics_.OnSeek(time);
 
   if (!player_) {
-    seek_cb.Run(PIPELINE_ERROR_INVALID_STATE, false,
+    seek_cb.Run(::media::PIPELINE_ERROR_INVALID_STATE, false,
                 AppendStatisticsString("SbPlayerPipeline::Seek failed: "
                                        "player_ is nullptr."));
     return;
@@ -668,7 +680,7 @@
     player_->GetVideoResolution(&frame_width, &frame_height);
     if (frame_width != natural_size_.width() ||
         frame_height != natural_size_.height()) {
-      natural_size_ = math::Size(frame_width, frame_height);
+      natural_size_ = gfx::Size(frame_width, frame_height);
       content_size_change_cb_.Run();
     }
   }
@@ -687,11 +699,11 @@
   return media_time;
 }
 
-Ranges<TimeDelta> SbPlayerPipeline::GetBufferedTimeRanges() {
+::media::Ranges<TimeDelta> SbPlayerPipeline::GetBufferedTimeRanges() {
   base::AutoLock auto_lock(lock_);
 
 #if SB_HAS(PLAYER_WITH_URL)
-  Ranges<TimeDelta> time_ranges;
+  ::media::Ranges<TimeDelta> time_ranges;
 
   if (!player_) {
     return time_ranges;
@@ -748,7 +760,7 @@
 }
 #endif  // SB_HAS(PLAYER_WITH_URL)
 
-void SbPlayerPipeline::GetNaturalVideoSize(math::Size* out_size) const {
+void SbPlayerPipeline::GetNaturalVideoSize(gfx::Size* out_size) const {
   CHECK(out_size);
   base::AutoLock auto_lock(lock_);
   *out_size = natural_size_;
@@ -789,7 +801,7 @@
   decode_to_texture_output_mode_ = enabled;
 }
 
-void SbPlayerPipeline::StartTask(const StartTaskParameters& parameters) {
+void SbPlayerPipeline::StartTask(StartTaskParameters parameters) {
   TRACE_EVENT0("cobalt::media", "SbPlayerPipeline::StartTask");
 
   DCHECK(task_runner_->BelongsToCurrentThread());
@@ -798,7 +810,7 @@
 
   demuxer_ = parameters.demuxer;
   set_drm_system_ready_cb_ = parameters.set_drm_system_ready_cb;
-  ended_cb_ = parameters.ended_cb;
+  ended_cb_ = std::move(parameters.ended_cb);
   error_cb_ = parameters.error_cb;
   {
     base::AutoLock auto_lock(lock_);
@@ -816,11 +828,9 @@
     return;
   }
 #endif  // SB_HAS(PLAYER_WITH_URL)
-  const bool kEnableTextTracks = false;
-  demuxer_->Initialize(this,
-                       BindToCurrentLoop(base::Bind(
-                           &SbPlayerPipeline::OnDemuxerInitialized, this)),
-                       kEnableTextTracks);
+  demuxer_->Initialize(
+      this, BindToCurrentLoop(
+                base::Bind(&SbPlayerPipeline::OnDemuxerInitialized, this)));
 
   started_ = true;
 }
@@ -849,7 +859,7 @@
 }
 
 void SbPlayerPipeline::OnBufferedTimeRangesChanged(
-    const Ranges<base::TimeDelta>& ranges) {
+    const ::media::Ranges<base::TimeDelta>& ranges) {
   base::AutoLock auto_lock(lock_);
   did_loading_progress_ = true;
   buffered_time_ranges_ = ranges;
@@ -870,20 +880,11 @@
     return;
   }
 
-  if (error != PIPELINE_OK) {
+  if (error != ::media::PIPELINE_OK) {
     CallErrorCB(error, "Demuxer error.");
   }
 }
 
-void SbPlayerPipeline::AddTextStream(DemuxerStream* text_stream,
-                                     const TextTrackConfig& config) {
-  NOTREACHED();
-}
-
-void SbPlayerPipeline::RemoveTextStream(DemuxerStream* text_stream) {
-  NOTREACHED();
-}
-
 #if SB_HAS(PLAYER_WITH_URL)
 void SbPlayerPipeline::CreateUrlPlayer(const std::string& source_url) {
   TRACE_EVENT0("cobalt::media", "SbPlayerPipeline::CreateUrlPlayer");
@@ -933,10 +934,15 @@
     return;
   }
 
-  CallSeekCB(DECODER_ERROR_NOT_SUPPORTED,
+  std::string time_information = GetTimeInformation();
+  LOG(INFO) << "SbPlayerPipeline::CreateUrlPlayer failed to create a valid "
+               "StarboardPlayer - "
+            << time_information << " \'" << error_message << "\'";
+
+  CallSeekCB(::media::DECODER_ERROR_NOT_SUPPORTED,
              "SbPlayerPipeline::CreateUrlPlayer failed to create a valid "
-             "StarboardPlayer: \'" +
-                 error_message + "\'");
+             "StarboardPlayer - " +
+                 time_information + " \'" + error_message + "\'");
 }
 
 void SbPlayerPipeline::SetDrmSystem(SbDrmSystem drm_system) {
@@ -949,6 +955,7 @@
   }
 
   if (player_->IsValid()) {
+    player_->RecordSetDrmSystemReadyTime(set_drm_system_ready_cb_time_);
     player_->SetDrmSystem(drm_system);
   }
 }
@@ -987,9 +994,12 @@
       video_stream_ ? video_stream_->video_decoder_config()
                     : invalid_video_config;
 
+  std::string audio_mime_type = audio_stream_ ? audio_stream_->mime_type() : "";
+  std::string video_mime_type;
   if (video_stream_) {
     playback_statistics_.UpdateVideoConfig(
         video_stream_->video_decoder_config());
+    video_mime_type = video_stream_->mime_type();
   }
 
   std::string error_message;
@@ -1003,8 +1013,8 @@
     LOG(INFO) << "Creating StarboardPlayer.";
     player_.reset(new StarboardPlayer(
         task_runner_, get_decode_target_graphics_context_provider_func_,
-        audio_config, video_config, window_, drm_system, this,
-        set_bounds_helper_.get(), allow_resume_after_suspend_,
+        audio_config, audio_mime_type, video_config, video_mime_type, window_,
+        drm_system, this, set_bounds_helper_.get(), allow_resume_after_suspend_,
         *decode_to_texture_output_mode_, video_frame_provider_,
         max_video_capabilities_));
     if (player_->IsValid()) {
@@ -1018,6 +1028,7 @@
   }
 
   if (player_ && player_->IsValid()) {
+    player_->RecordSetDrmSystemReadyTime(set_drm_system_ready_cb_time_);
     base::Closure output_mode_change_cb;
     {
       base::AutoLock auto_lock(lock_);
@@ -1035,10 +1046,15 @@
     return;
   }
 
-  CallSeekCB(DECODER_ERROR_NOT_SUPPORTED,
+  std::string time_information = GetTimeInformation();
+  LOG(INFO) << "SbPlayerPipeline::CreatePlayer failed to create a valid "
+               "StarboardPlayer - "
+            << time_information << " \'" << error_message << "\'";
+
+  CallSeekCB(::media::DECODER_ERROR_NOT_SUPPORTED,
              "SbPlayerPipeline::CreatePlayer failed to create a valid "
-             "StarboardPlayer: \'" +
-                 error_message + "\'");
+             "StarboardPlayer - " +
+                 time_information + " \'" + error_message + "\'");
 }
 
 void SbPlayerPipeline::OnDemuxerInitialized(PipelineStatus status) {
@@ -1053,7 +1069,7 @@
     return;
   }
 
-  if (status != PIPELINE_OK) {
+  if (status != ::media::PIPELINE_OK) {
     CallErrorCB(status, "Demuxer initialization error.");
     return;
   }
@@ -1066,12 +1082,28 @@
     return;
   }
 
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
+  auto streams = demuxer_->GetAllStreams();
+  DemuxerStream* audio_stream = nullptr;
+  DemuxerStream* video_stream = nullptr;
+  for (auto&& stream : streams) {
+    if (stream->type() == DemuxerStream::AUDIO) {
+      if (audio_stream == nullptr) {
+        audio_stream = stream;
+      } else {
+        LOG(WARNING) << "Encountered more than one audio streams.";
+      }
+    } else if (stream->type() == DemuxerStream::VIDEO) {
+      if (video_stream == nullptr) {
+        video_stream = stream;
+      } else {
+        LOG(WARNING) << "Encountered more than one video streams.";
+      }
+    }
+  }
 
   if (audio_stream == NULL && video_stream == NULL) {
     LOG(INFO) << "The video has to contain an audio track or a video track.";
-    CallErrorCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS,
+    CallErrorCB(::media::DEMUXER_ERROR_NO_SUPPORTED_STREAMS,
                 "The video has to contain an audio track or a video track.");
     return;
   }
@@ -1098,8 +1130,7 @@
       content_size_change_cb_.Run();
     }
     if (is_encrypted) {
-      set_drm_system_ready_cb_.Run(
-          BindToCurrentLoop(base::Bind(&SbPlayerPipeline::CreatePlayer, this)));
+      RunSetDrmSystemReadyCB();
       return;
     }
   }
@@ -1110,7 +1141,7 @@
 void SbPlayerPipeline::OnDemuxerSeeked(PipelineStatus status) {
   DCHECK(task_runner_->BelongsToCurrentThread());
 
-  if (status == PIPELINE_OK && player_) {
+  if (status == ::media::PIPELINE_OK && player_) {
     player_->Seek(seek_time_);
   }
 }
@@ -1129,7 +1160,7 @@
 
 void SbPlayerPipeline::OnDemuxerStreamRead(
     DemuxerStream::Type type, DemuxerStream::Status status,
-    const scoped_refptr<DecoderBuffer>& buffer) {
+    scoped_refptr<DecoderBuffer> buffer) {
 #if SB_HAS(PLAYER_WITH_URL)
   DCHECK(!is_url_based_);
 #endif  // SB_HAS(PLAYER_WITH_URL)
@@ -1138,8 +1169,8 @@
 
   if (!task_runner_->BelongsToCurrentThread()) {
     task_runner_->PostTask(
-        FROM_HERE, base::Bind(&SbPlayerPipeline::OnDemuxerStreamRead, this,
-                              type, status, buffer));
+        FROM_HERE, base::BindOnce(&SbPlayerPipeline::OnDemuxerStreamRead, this,
+                                  type, status, buffer));
     return;
   }
 
@@ -1161,7 +1192,7 @@
       video_read_in_progress_ = false;
     }
     if (!seek_cb_.is_null()) {
-      CallSeekCB(PIPELINE_OK, "");
+      CallSeekCB(::media::PIPELINE_OK, "");
     }
     return;
   }
@@ -1169,7 +1200,7 @@
   if (status == DemuxerStream::kConfigChanged) {
     UpdateDecoderConfig(stream);
     stream->Read(
-        base::Bind(&SbPlayerPipeline::OnDemuxerStreamRead, this, type));
+        base::BindOnce(&SbPlayerPipeline::OnDemuxerStreamRead, this, type));
     return;
   }
 
@@ -1246,7 +1277,8 @@
   DemuxerStream* stream =
       type == DemuxerStream::AUDIO ? audio_stream_ : video_stream_;
   DCHECK(stream);
-  stream->Read(base::Bind(&SbPlayerPipeline::OnDemuxerStreamRead, this, type));
+  stream->Read(
+      base::BindOnce(&SbPlayerPipeline::OnDemuxerStreamRead, this, type));
 }
 
 void SbPlayerPipeline::OnPlayerStatus(SbPlayerState state) {
@@ -1280,7 +1312,7 @@
         player_->GetVideoResolution(&frame_width, &frame_height);
         bool natural_size_changed = (frame_width != natural_size_.width() ||
                                      frame_height != natural_size_.height());
-        natural_size_ = math::Size(frame_width, frame_height);
+        natural_size_ = gfx::Size(frame_width, frame_height);
         if (natural_size_changed) {
           content_size_change_cb_.Run();
         }
@@ -1288,7 +1320,7 @@
 #endif  // SB_HAS(PLAYER_WITH_URL)
       buffering_state_cb_.Run(kPrerollCompleted);
       if (!seek_cb_.is_null()) {
-        CallSeekCB(PIPELINE_OK, "");
+        CallSeekCB(::media::PIPELINE_OK, "");
       }
       if (video_stream_) {
         playback_statistics_.OnPresenting(
@@ -1297,7 +1329,7 @@
       break;
     }
     case kSbPlayerStateEndOfStream:
-      ended_cb_.Run(PIPELINE_OK);
+      std::move(ended_cb_).Run(::media::PIPELINE_OK);
       ended_ = true;
       break;
     case kSbPlayerStateDestroyed:
@@ -1319,10 +1351,10 @@
     DCHECK(is_url_based_);
     switch (static_cast<SbUrlPlayerError>(error)) {
       case kSbUrlPlayerErrorNetwork:
-        CallErrorCB(PIPELINE_ERROR_NETWORK, message);
+        CallErrorCB(::media::PIPELINE_ERROR_NETWORK, message);
         break;
       case kSbUrlPlayerErrorSrcNotSupported:
-        CallErrorCB(DEMUXER_ERROR_COULD_NOT_OPEN, message);
+        CallErrorCB(::media::DEMUXER_ERROR_COULD_NOT_OPEN, message);
 
         break;
     }
@@ -1331,10 +1363,10 @@
 #endif  // SB_HAS(PLAYER_WITH_URL)
   switch (error) {
     case kSbPlayerErrorDecode:
-      CallErrorCB(PIPELINE_ERROR_DECODE, message);
+      CallErrorCB(::media::PIPELINE_ERROR_DECODE, message);
       break;
     case kSbPlayerErrorCapabilityChanged:
-      CallErrorCB(PLAYBACK_CAPABILITY_CHANGED, message);
+      CallErrorCB(::media::PLAYBACK_CAPABILITY_CHANGED, message);
       break;
     case kSbPlayerErrorMax:
       NOTREACHED();
@@ -1354,7 +1386,7 @@
 
   if (stream->type() == DemuxerStream::AUDIO) {
     const AudioDecoderConfig& decoder_config = stream->audio_decoder_config();
-    player_->UpdateAudioConfig(decoder_config);
+    player_->UpdateAudioConfig(decoder_config, stream->mime_type());
   } else {
     DCHECK_EQ(stream->type(), DemuxerStream::VIDEO);
     const VideoDecoderConfig& decoder_config = stream->video_decoder_config();
@@ -1363,7 +1395,7 @@
         (decoder_config.natural_size().width() != natural_size_.width() ||
          decoder_config.natural_size().height() != natural_size_.height());
     natural_size_ = decoder_config.natural_size();
-    player_->UpdateVideoConfig(decoder_config);
+    player_->UpdateVideoConfig(decoder_config, stream->mime_type());
     if (natural_size_changed) {
       content_size_change_cb_.Run();
     }
@@ -1374,7 +1406,7 @@
 
 void SbPlayerPipeline::CallSeekCB(PipelineStatus status,
                                   const std::string& error_message) {
-  if (status == PIPELINE_OK) {
+  if (status == ::media::PIPELINE_OK) {
     DCHECK(error_message.empty());
   }
 
@@ -1393,7 +1425,7 @@
 
 void SbPlayerPipeline::CallErrorCB(PipelineStatus status,
                                    const std::string& error_message) {
-  DCHECK_NE(status, PIPELINE_OK);
+  DCHECK_NE(status, ::media::PIPELINE_OK);
   // Only to record the first error.
   if (error_cb_.is_null()) {
     return;
@@ -1432,6 +1464,7 @@
   DCHECK(suspended_);
 
   if (!suspended_) {
+    last_resume_time_ = SbTimeGetMonotonicNow();
     done_event->Signal();
     return;
   }
@@ -1447,17 +1480,22 @@
         error_message = player_->GetPlayerCreationErrorMessage();
         player_.reset();
       }
+      std::string time_information = GetTimeInformation();
+      LOG(INFO) << "SbPlayerPipeline::ResumeTask failed to create a valid "
+                   "StarboardPlayer - "
+                << time_information << " \'" << error_message << "\'";
       // TODO: Determine if CallSeekCB() may be used here, as |seek_cb_| may be
       // available if the app is suspended before a seek is completed.
-      CallErrorCB(DECODER_ERROR_NOT_SUPPORTED,
-                  "SbPlayerPipeline::ResumeTask failed to create a valid "
-                  "StarboardPlayer: \'" +
-                      error_message + "\'");
+      CallSeekCB(::media::DECODER_ERROR_NOT_SUPPORTED,
+                 "SbPlayerPipeline::ResumeTask failed to create a valid "
+                 "StarboardPlayer - " +
+                     time_information + " \'" + error_message + "\'");
       return;
     }
   }
 
   suspended_ = false;
+  last_resume_time_ = SbTimeGetMonotonicNow();
 
   done_event->Signal();
 }
@@ -1474,6 +1512,46 @@
   }
 }
 
+std::string SbPlayerPipeline::GetTimeInformation() const {
+  auto round_time_in_seconds = [](const SbTime time) {
+    const int64_t seconds = time / kSbTimeSecond;
+    if (seconds < 15) {
+      return seconds / 5 * 5;
+    }
+    if (seconds < 60) {
+      return seconds / 15 * 15;
+    }
+    if (seconds < 3600) {
+      return std::max(static_cast<SbTime>(60), seconds / 600 * 600);
+    }
+    return std::max(static_cast<SbTime>(3600), seconds / 18000 * 18000);
+  };
+  std::string time_since_start =
+      std::to_string(
+          round_time_in_seconds(base::StartupTimer::TimeElapsed().ToSbTime())) +
+      "s";
+  std::string time_since_resume =
+      last_resume_time_ != -1
+          ? std::to_string(round_time_in_seconds(SbTimeGetMonotonicNow() -
+                                                 last_resume_time_)) +
+                "s"
+          : "null";
+  return "time since app start: " + time_since_start +
+         ", time since last resume: " + time_since_resume;
+}
+
+void SbPlayerPipeline::RunSetDrmSystemReadyCB() {
+  TRACE_EVENT0("cobalt::media", "SbPlayerPipeline::RunSetDrmSystemReadyCB");
+  set_drm_system_ready_cb_time_ = SbTimeGetMonotonicNow();
+#if SB_HAS(PLAYER_WITH_URL)
+  set_drm_system_ready_cb_.Run(
+      base::Bind(&SbPlayerPipeline::SetDrmSystem, this));
+#else   // SB_HAS(PLAYER_WITH_URL)
+  set_drm_system_ready_cb_.Run(::media::BindToCurrentLoop(
+      base::Bind(&SbPlayerPipeline::CreatePlayer, this)));
+#endif  // SB_HAS(PLAYER_WITH_URL)
+}
+
 }  // namespace
 
 // static
diff --git a/cobalt/media/base/sbplayer_set_bounds_helper.cc b/cobalt/media/base/sbplayer_set_bounds_helper.cc
index e561b13..d29e042 100644
--- a/cobalt/media/base/sbplayer_set_bounds_helper.cc
+++ b/cobalt/media/base/sbplayer_set_bounds_helper.cc
@@ -36,9 +36,9 @@
   }
 }
 
-bool SbPlayerSetBoundsHelper::SetBounds(const math::Rect& rect) {
+bool SbPlayerSetBoundsHelper::SetBounds(int x, int y, int width, int height) {
   base::AutoLock auto_lock(lock_);
-  rect_ = rect;
+  rect_ = gfx::Rect(x, y, width, height);
   if (player_) {
     player_->SetBounds(s_z_index.GetNext(), rect_.value());
   }
diff --git a/cobalt/media/base/sbplayer_set_bounds_helper.h b/cobalt/media/base/sbplayer_set_bounds_helper.h
index caee2bc..4c09e3c 100644
--- a/cobalt/media/base/sbplayer_set_bounds_helper.h
+++ b/cobalt/media/base/sbplayer_set_bounds_helper.h
@@ -18,7 +18,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
 #include "base/synchronization/lock.h"
-#include "cobalt/math/rect.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/rect.h"
 
 namespace cobalt {
 namespace media {
@@ -31,12 +31,12 @@
   SbPlayerSetBoundsHelper() {}
 
   void SetPlayer(StarboardPlayer* player);
-  bool SetBounds(const math::Rect& rect);
+  bool SetBounds(int x, int y, int width, int height);
 
  private:
   base::Lock lock_;
   StarboardPlayer* player_ = nullptr;
-  base::Optional<math::Rect> rect_;
+  base::Optional<gfx::Rect> rect_;
 
   DISALLOW_COPY_AND_ASSIGN(SbPlayerSetBoundsHelper);
 };
diff --git a/cobalt/media/base/seekable_buffer.cc b/cobalt/media/base/seekable_buffer.cc
deleted file mode 100644
index a0a649b..0000000
--- a/cobalt/media/base/seekable_buffer.cc
+++ /dev/null
@@ -1,270 +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 "cobalt/media/base/seekable_buffer.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "cobalt/media/base/data_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-SeekableBuffer::SeekableBuffer(int backward_capacity, int forward_capacity)
-    : current_buffer_offset_(0),
-      backward_capacity_(backward_capacity),
-      backward_bytes_(0),
-      forward_capacity_(forward_capacity),
-      forward_bytes_(0),
-      current_time_(kNoTimestamp) {
-  current_buffer_ = buffers_.begin();
-}
-
-SeekableBuffer::~SeekableBuffer() {}
-
-void SeekableBuffer::Clear() {
-  buffers_.clear();
-  current_buffer_ = buffers_.begin();
-  current_buffer_offset_ = 0;
-  backward_bytes_ = 0;
-  forward_bytes_ = 0;
-  current_time_ = kNoTimestamp;
-}
-
-int SeekableBuffer::Read(uint8_t* data, int size) {
-  DCHECK(data);
-  return InternalRead(data, size, true, 0);
-}
-
-int SeekableBuffer::Peek(uint8_t* data, int size, int forward_offset) {
-  DCHECK(data);
-  return InternalRead(data, size, false, forward_offset);
-}
-
-bool SeekableBuffer::GetCurrentChunk(const uint8_t** data, int* size) const {
-  BufferQueue::iterator current_buffer = current_buffer_;
-  int current_buffer_offset = current_buffer_offset_;
-  // Advance position if we are in the end of the current buffer.
-  while (current_buffer != buffers_.end() &&
-         current_buffer_offset >= (*current_buffer)->data_size()) {
-    ++current_buffer;
-    current_buffer_offset = 0;
-  }
-  if (current_buffer == buffers_.end()) return false;
-  *data = (*current_buffer)->data() + current_buffer_offset;
-  *size = (*current_buffer)->data_size() - current_buffer_offset;
-  return true;
-}
-
-bool SeekableBuffer::Append(const scoped_refptr<DataBuffer>& buffer_in) {
-  if (buffers_.empty() && buffer_in->timestamp() != kNoTimestamp) {
-    current_time_ = buffer_in->timestamp();
-  }
-
-  // Since the forward capacity is only used to check the criteria for buffer
-  // full, we always append data to the buffer.
-  buffers_.push_back(buffer_in);
-
-  // After we have written the first buffer, update |current_buffer_| to point
-  // to it.
-  if (current_buffer_ == buffers_.end()) {
-    DCHECK_EQ(0, forward_bytes_);
-    current_buffer_ = buffers_.begin();
-  }
-
-  // Update the |forward_bytes_| counter since we have more bytes.
-  forward_bytes_ += buffer_in->data_size();
-
-  // Advise the user to stop append if the amount of forward bytes exceeds
-  // the forward capacity. A false return value means the user should stop
-  // appending more data to this buffer.
-  if (forward_bytes_ >= forward_capacity_) return false;
-  return true;
-}
-
-bool SeekableBuffer::Append(const uint8_t* data, int size) {
-  if (size > 0) {
-    scoped_refptr<DataBuffer> data_buffer = DataBuffer::CopyFrom(data, size);
-    return Append(data_buffer);
-  } else {
-    // Return true if we have forward capacity.
-    return forward_bytes_ < forward_capacity_;
-  }
-}
-
-bool SeekableBuffer::Seek(int32_t offset) {
-  if (offset > 0)
-    return SeekForward(offset);
-  else if (offset < 0)
-    return SeekBackward(-offset);
-  return true;
-}
-
-bool SeekableBuffer::SeekForward(int size) {
-  // Perform seeking forward only if we have enough bytes in the queue.
-  if (size > forward_bytes_) return false;
-
-  // Do a read of |size| bytes.
-  int taken = InternalRead(NULL, size, true, 0);
-  DCHECK_EQ(taken, size);
-  return true;
-}
-
-bool SeekableBuffer::SeekBackward(int size) {
-  if (size > backward_bytes_) return false;
-  // Record the number of bytes taken.
-  int taken = 0;
-  // Loop until we taken enough bytes and rewind by the desired |size|.
-  while (taken < size) {
-    // |current_buffer_| can never be invalid when we are in this loop. It can
-    // only be invalid before any data is appended. The invalid case should be
-    // handled by checks before we enter this loop.
-    DCHECK(current_buffer_ != buffers_.end());
-
-    // We try to consume at most |size| bytes in the backward direction. We also
-    // have to account for the offset we are in the current buffer, so take the
-    // minimum between the two to determine the amount of bytes to take from the
-    // current buffer.
-    int consumed = std::min(size - taken, current_buffer_offset_);
-
-    // Decreases the offset in the current buffer since we are rewinding.
-    current_buffer_offset_ -= consumed;
-
-    // Increase the amount of bytes taken in the backward direction. This
-    // determines when to stop the loop.
-    taken += consumed;
-
-    // Forward bytes increases and backward bytes decreases by the amount
-    // consumed in the current buffer.
-    forward_bytes_ += consumed;
-    backward_bytes_ -= consumed;
-    DCHECK_GE(backward_bytes_, 0);
-
-    // The current buffer pointed by current iterator has been consumed. Move
-    // the iterator backward so it points to the previous buffer.
-    if (current_buffer_offset_ == 0) {
-      if (current_buffer_ == buffers_.begin()) break;
-      // Move the iterator backward.
-      --current_buffer_;
-      // Set the offset into the current buffer to be the buffer size as we
-      // are preparing for rewind for next iteration.
-      current_buffer_offset_ = (*current_buffer_)->data_size();
-    }
-  }
-
-  UpdateCurrentTime(current_buffer_, current_buffer_offset_);
-
-  DCHECK_EQ(taken, size);
-  return true;
-}
-
-void SeekableBuffer::EvictBackwardBuffers() {
-  // Advances the iterator until we hit the current pointer.
-  while (backward_bytes_ > backward_capacity_) {
-    BufferQueue::iterator i = buffers_.begin();
-    if (i == current_buffer_) break;
-    scoped_refptr<DataBuffer> buffer = *i;
-    backward_bytes_ -= buffer->data_size();
-    DCHECK_GE(backward_bytes_, 0);
-
-    buffers_.erase(i);
-  }
-}
-
-int SeekableBuffer::InternalRead(uint8_t* data, int size, bool advance_position,
-                                 int forward_offset) {
-  // Counts how many bytes are actually read from the buffer queue.
-  int taken = 0;
-
-  BufferQueue::iterator current_buffer = current_buffer_;
-  int current_buffer_offset = current_buffer_offset_;
-
-  int bytes_to_skip = forward_offset;
-  while (taken < size) {
-    // |current_buffer| is valid since the first time this buffer is appended
-    // with data.
-    if (current_buffer == buffers_.end()) break;
-
-    scoped_refptr<DataBuffer> buffer = *current_buffer;
-
-    int remaining_bytes_in_buffer = buffer->data_size() - current_buffer_offset;
-
-    if (bytes_to_skip == 0) {
-      // Find the right amount to copy from the current buffer referenced by
-      // |buffer|. We shall copy no more than |size| bytes in total and each
-      // single step copied no more than the current buffer size.
-      int copied = std::min(size - taken, remaining_bytes_in_buffer);
-
-      // |data| is NULL if we are seeking forward, so there's no need to copy.
-      if (data)
-        memcpy(data + taken, buffer->data() + current_buffer_offset,
-                     copied);
-
-      // Increase total number of bytes copied, which regulates when to end this
-      // loop.
-      taken += copied;
-
-      // We have read |copied| bytes from the current buffer. Advances the
-      // offset.
-      current_buffer_offset += copied;
-    } else {
-      int skipped = std::min(remaining_bytes_in_buffer, bytes_to_skip);
-      current_buffer_offset += skipped;
-      bytes_to_skip -= skipped;
-    }
-
-    // The buffer has been consumed.
-    if (current_buffer_offset == buffer->data_size()) {
-      if (advance_position) {
-        // Next buffer may not have timestamp, so we need to update current
-        // timestamp before switching to the next buffer.
-        UpdateCurrentTime(current_buffer, current_buffer_offset);
-      }
-
-      BufferQueue::iterator next = current_buffer;
-      ++next;
-      // If we are at the last buffer, don't advance.
-      if (next == buffers_.end()) break;
-
-      // Advances the iterator.
-      current_buffer = next;
-      current_buffer_offset = 0;
-    }
-  }
-
-  if (advance_position) {
-    // We have less forward bytes and more backward bytes. Updates these
-    // counters by |taken|.
-    forward_bytes_ -= taken;
-    backward_bytes_ += taken;
-    DCHECK_GE(forward_bytes_, 0);
-    DCHECK(current_buffer_ != buffers_.end() || forward_bytes_ == 0);
-
-    current_buffer_ = current_buffer;
-    current_buffer_offset_ = current_buffer_offset;
-
-    UpdateCurrentTime(current_buffer_, current_buffer_offset_);
-    EvictBackwardBuffers();
-  }
-
-  return taken;
-}
-
-void SeekableBuffer::UpdateCurrentTime(BufferQueue::iterator buffer,
-                                       int offset) {
-  // Garbage values are unavoidable, so this check will remain.
-  if (buffer != buffers_.end() && (*buffer)->timestamp() != kNoTimestamp) {
-    int64_t time_offset = ((*buffer)->duration().InMicroseconds() * offset) /
-                          (*buffer)->data_size();
-
-    current_time_ =
-        (*buffer)->timestamp() + base::TimeDelta::FromMicroseconds(time_offset);
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/seekable_buffer.h b/cobalt/media/base/seekable_buffer.h
deleted file mode 100644
index 0b49a9f..0000000
--- a/cobalt/media/base/seekable_buffer.h
+++ /dev/null
@@ -1,188 +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.
-
-// SeekableBuffer to support backward and forward seeking in a buffer for
-// reading a media data source.
-//
-// In order to support backward and forward seeking, this class buffers data in
-// both backward and forward directions, the current read position can be reset
-// to anywhere in the buffered data.
-//
-// The amount of data buffered is regulated by two variables at construction,
-// |backward_capacity| and |forward_capacity|.
-//
-// In the case of reading and seeking forward, the current read position
-// advances and there will be more data in the backward direction. If backward
-// bytes exceeds |backward_capacity|, the exceeding bytes are evicted and thus
-// backward_bytes() will always be less than or equal to |backward_capacity|.
-// The eviction will be caused by Read() and Seek() in the forward direction and
-// is done internally when the mentioned criteria is fulfilled.
-//
-// In the case of appending data to the buffer, there is an advisory limit of
-// how many bytes can be kept in the forward direction, regulated by
-// |forward_capacity|. The append operation (by calling Append()) that caused
-// forward bytes to exceed |forward_capacity| will have a return value that
-// advises a halt of append operation, further append operations are allowed but
-// are not advised. Since this class is used as a backend buffer for caching
-// media files downloaded from network we cannot afford losing data, we can
-// only advise a halt of further writing to this buffer.
-// This class is not inherently thread-safe. Concurrent access must be
-// externally serialized.
-
-#ifndef COBALT_MEDIA_BASE_SEEKABLE_BUFFER_H_
-#define COBALT_MEDIA_BASE_SEEKABLE_BUFFER_H_
-
-#include <list>
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class DataBuffer;
-
-class MEDIA_EXPORT SeekableBuffer {
- public:
-  // Constructs an instance with |forward_capacity| and |backward_capacity|.
-  // The values are in bytes.
-  SeekableBuffer(int backward_capacity, int forward_capacity);
-
-  ~SeekableBuffer();
-
-  // Clears the buffer queue.
-  void Clear();
-
-  // Reads a maximum of |size| bytes into |data| from the current read
-  // position. Returns the number of bytes read.
-  // The current read position will advance by the amount of bytes read. If
-  // reading caused backward_bytes() to exceed backward_capacity(), an eviction
-  // of the backward buffer will be done internally.
-  int Read(uint8_t* data, int size);
-
-  // Copies up to |size| bytes from current position to |data|. Returns
-  // number of bytes copied. Doesn't advance current position. Optionally
-  // starts at a |forward_offset| from current position.
-  int Peek(uint8_t* data, int size) { return Peek(data, size, 0); }
-  int Peek(uint8_t* data, int size, int forward_offset);
-
-  // Returns pointer to the current chunk of data that is being consumed.
-  // If there is no data left in the buffer false is returned, otherwise
-  // true is returned and |data| and |size| are updated. The returned
-  // |data| value becomes invalid when Read(), Append() or Seek()
-  // are called.
-  bool GetCurrentChunk(const uint8_t** data, int* size) const;
-
-  // Appends |buffer_in| to this buffer. Returns false if forward_bytes() is
-  // greater than or equals to forward_capacity(), true otherwise. The data
-  // is added to the buffer in any case.
-  bool Append(const scoped_refptr<DataBuffer>& buffer_in);
-
-  // Appends |size| bytes of |data| to the buffer. Result is the same
-  // as for Append(Buffer*).
-  bool Append(const uint8_t* data, int size);
-
-  // Moves the read position by |offset| bytes. If |offset| is positive, the
-  // current read position is moved forward. If negative, the current read
-  // position is moved backward. A zero |offset| value will keep the current
-  // read position stationary.
-  // If |offset| exceeds bytes buffered in either direction, reported by
-  // forward_bytes() when seeking forward and backward_bytes() when seeking
-  // backward, the seek operation will fail and return value will be false.
-  // If the seek operation fails, the current read position will not be updated.
-  // If a forward seeking caused backward_bytes() to exceed backward_capacity(),
-  // this method call will cause an eviction of the backward buffer.
-  bool Seek(int32_t offset);
-
-  // Returns the number of bytes buffered beyond the current read position.
-  int forward_bytes() const { return forward_bytes_; }
-
-  // Returns the number of bytes buffered that precedes the current read
-  // position.
-  int backward_bytes() const { return backward_bytes_; }
-
-  // Sets the forward_capacity to |new_forward_capacity| bytes.
-  void set_forward_capacity(int new_forward_capacity) {
-    forward_capacity_ = new_forward_capacity;
-  }
-
-  // Sets the backward_capacity to |new_backward_capacity| bytes.
-  void set_backward_capacity(int new_backward_capacity) {
-    backward_capacity_ = new_backward_capacity;
-  }
-
-  // Returns the maximum number of bytes that should be kept in the forward
-  // direction.
-  int forward_capacity() const { return forward_capacity_; }
-
-  // Returns the maximum number of bytes that should be kept in the backward
-  // direction.
-  int backward_capacity() const { return backward_capacity_; }
-
-  // Returns the current timestamp, taking into account current offset. The
-  // value calculated based on the timestamp of the current buffer. If
-  // timestamp for the current buffer is set to 0 or the data was added with
-  // Append(const uint*, int), then returns value that corresponds to the
-  // last position in a buffer that had timestamp set.
-  // kNoTimestamp is returned if no buffers we read from had timestamp set.
-  base::TimeDelta current_time() const { return current_time_; }
-
- private:
-  // Definition of the buffer queue.
-  typedef std::list<scoped_refptr<DataBuffer> > BufferQueue;
-
-  // A helper method to evict buffers in the backward direction until backward
-  // bytes is within the backward capacity.
-  void EvictBackwardBuffers();
-
-  // An internal method shared by Read() and SeekForward() that actually does
-  // reading. It reads a maximum of |size| bytes into |data|. Returns the number
-  // of bytes read. The current read position will be moved forward by the
-  // number of bytes read. If |data| is NULL, only the current read position
-  // will advance but no data will be copied.
-  int InternalRead(uint8_t* data, int size, bool advance_position,
-                   int forward_offset);
-
-  // A helper method that moves the current read position forward by |size|
-  // bytes.
-  // If the return value is true, the operation completed successfully.
-  // If the return value is false, |size| is greater than forward_bytes() and
-  // the seek operation failed. The current read position is not updated.
-  bool SeekForward(int size);
-
-  // A helper method that moves the current read position backward by |size|
-  // bytes.
-  // If the return value is true, the operation completed successfully.
-  // If the return value is false, |size| is greater than backward_bytes() and
-  // the seek operation failed. The current read position is not updated.
-  bool SeekBackward(int size);
-
-  // Updates |current_time_| with the time that corresponds to the
-  // specified position in the buffer.
-  void UpdateCurrentTime(BufferQueue::iterator buffer, int offset);
-
-  BufferQueue::iterator current_buffer_;
-  BufferQueue buffers_;
-  int current_buffer_offset_;
-
-  int backward_capacity_;
-  int backward_bytes_;
-
-  int forward_capacity_;
-  int forward_bytes_;
-
-  // Keeps track of the most recent time we've seen in case the |buffers_| is
-  // empty when our owner asks what time it is.
-  base::TimeDelta current_time_;
-
-  DISALLOW_COPY_AND_ASSIGN(SeekableBuffer);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_SEEKABLE_BUFFER_H_
diff --git a/cobalt/media/base/seekable_buffer_unittest.cc b/cobalt/media/base/seekable_buffer_unittest.cc
deleted file mode 100644
index fde513c..0000000
--- a/cobalt/media/base/seekable_buffer_unittest.cc
+++ /dev/null
@@ -1,370 +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 "cobalt/media/base/seekable_buffer.h"
-
-#include <algorithm>
-#include <cstdlib>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/data_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class SeekableBufferTest : public testing::Test {
- public:
-  SeekableBufferTest() : buffer_(kBufferSize, kBufferSize) {}
-
- protected:
-  static const int kDataSize = 409600;
-  static const int kBufferSize = 4096;
-  static const int kWriteSize = 512;
-
-  void SetUp() override {
-    // Note: We use srand() and rand() rather than base::RandXXX() to improve
-    // unit test performance.  We don't need good random numbers, just
-    // something that generates "mixed data."
-    const unsigned int kKnownSeed = 0x98765432;
-    srand(kKnownSeed);
-
-    // Create random test data samples.
-    for (int i = 0; i < kDataSize; i++) data_[i] = static_cast<char>(rand());
-  }
-
-  int GetRandomInt(int maximum) { return rand() % (maximum + 1); }
-
-  SeekableBuffer buffer_;
-  uint8_t data_[kDataSize];
-  uint8_t write_buffer_[kDataSize];
-};
-
-TEST_F(SeekableBufferTest, RandomReadWrite) {
-  int write_position = 0;
-  int read_position = 0;
-  while (read_position < kDataSize) {
-    // Write a random amount of data.
-    int write_size = GetRandomInt(kBufferSize);
-    write_size = std::min(write_size, kDataSize - write_position);
-    bool should_append = buffer_.Append(data_ + write_position, write_size);
-    write_position += write_size;
-    EXPECT_GE(write_position, read_position);
-    EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
-    EXPECT_EQ(should_append, buffer_.forward_bytes() < kBufferSize)
-        << "Incorrect buffer full reported";
-
-    // Peek a random amount of data.
-    int copy_size = GetRandomInt(kBufferSize);
-    int bytes_copied = buffer_.Peek(write_buffer_, copy_size);
-    EXPECT_GE(copy_size, bytes_copied);
-    EXPECT_EQ(
-        0, memcmp(write_buffer_, data_ + read_position, bytes_copied));
-
-    // Read a random amount of data.
-    int read_size = GetRandomInt(kBufferSize);
-    int bytes_read = buffer_.Read(write_buffer_, read_size);
-    EXPECT_GE(read_size, bytes_read);
-    EXPECT_EQ(
-        0, memcmp(write_buffer_, data_ + read_position, bytes_read));
-    read_position += bytes_read;
-    EXPECT_GE(write_position, read_position);
-    EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
-  }
-}
-
-TEST_F(SeekableBufferTest, ReadWriteSeek) {
-  const int kReadSize = kWriteSize / 4;
-
-  for (int i = 0; i < 10; ++i) {
-    // Write until buffer is full.
-    for (int j = 0; j < kBufferSize; j += kWriteSize) {
-      bool should_append = buffer_.Append(data_ + j, kWriteSize);
-      EXPECT_EQ(j < kBufferSize - kWriteSize, should_append)
-          << "Incorrect buffer full reported";
-      EXPECT_EQ(j + kWriteSize, buffer_.forward_bytes());
-    }
-
-    // Simulate a read and seek pattern. Each loop reads 4 times, each time
-    // reading a quarter of |kWriteSize|.
-    int read_position = 0;
-    int forward_bytes = kBufferSize;
-    for (int j = 0; j < kBufferSize; j += kWriteSize) {
-      // Read.
-      EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
-      forward_bytes -= kReadSize;
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-      EXPECT_EQ(
-          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
-      read_position += kReadSize;
-
-      // Seek forward.
-      EXPECT_TRUE(buffer_.Seek(2 * kReadSize));
-      forward_bytes -= 2 * kReadSize;
-      read_position += 2 * kReadSize;
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-
-      // Copy.
-      EXPECT_EQ(kReadSize, buffer_.Peek(write_buffer_, kReadSize));
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-      EXPECT_EQ(
-          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
-
-      // Read.
-      EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
-      forward_bytes -= kReadSize;
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-      EXPECT_EQ(
-          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
-      read_position += kReadSize;
-
-      // Seek backward.
-      EXPECT_TRUE(buffer_.Seek(-3 * static_cast<int32_t>(kReadSize)));
-      forward_bytes += 3 * kReadSize;
-      read_position -= 3 * kReadSize;
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-
-      // Copy.
-      EXPECT_EQ(kReadSize, buffer_.Peek(write_buffer_, kReadSize));
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-      EXPECT_EQ(
-          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
-
-      // Read.
-      EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
-      forward_bytes -= kReadSize;
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-      EXPECT_EQ(
-          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
-      read_position += kReadSize;
-
-      // Copy.
-      EXPECT_EQ(kReadSize, buffer_.Peek(write_buffer_, kReadSize));
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-      EXPECT_EQ(
-          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
-
-      // Read.
-      EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
-      forward_bytes -= kReadSize;
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-      EXPECT_EQ(
-          0, memcmp(write_buffer_, data_ + read_position, kReadSize));
-      read_position += kReadSize;
-
-      // Seek forward.
-      EXPECT_TRUE(buffer_.Seek(kReadSize));
-      forward_bytes -= kReadSize;
-      read_position += kReadSize;
-      EXPECT_EQ(forward_bytes, buffer_.forward_bytes());
-    }
-  }
-}
-
-TEST_F(SeekableBufferTest, BufferFull) {
-  const int kMaxWriteSize = 2 * kBufferSize;
-
-  // Write and expect the buffer to be not full.
-  for (int i = 0; i < kBufferSize - kWriteSize; i += kWriteSize) {
-    EXPECT_TRUE(buffer_.Append(data_ + i, kWriteSize));
-    EXPECT_EQ(i + kWriteSize, buffer_.forward_bytes());
-  }
-
-  // Write until we have kMaxWriteSize bytes in the buffer. Buffer is full in
-  // these writes.
-  for (int i = buffer_.forward_bytes(); i < kMaxWriteSize; i += kWriteSize) {
-    EXPECT_FALSE(buffer_.Append(data_ + i, kWriteSize));
-    EXPECT_EQ(i + kWriteSize, buffer_.forward_bytes());
-  }
-
-  // Read until the buffer is empty.
-  int read_position = 0;
-  while (buffer_.forward_bytes()) {
-    // Read a random amount of data.
-    int read_size = GetRandomInt(kBufferSize);
-    int forward_bytes = buffer_.forward_bytes();
-    int bytes_read = buffer_.Read(write_buffer_, read_size);
-    EXPECT_EQ(
-        0, memcmp(write_buffer_, data_ + read_position, bytes_read));
-    if (read_size > forward_bytes)
-      EXPECT_EQ(forward_bytes, bytes_read);
-    else
-      EXPECT_EQ(read_size, bytes_read);
-    read_position += bytes_read;
-    EXPECT_GE(kMaxWriteSize, read_position);
-    EXPECT_EQ(kMaxWriteSize - read_position, buffer_.forward_bytes());
-  }
-
-  // Expects we have no bytes left.
-  EXPECT_EQ(0, buffer_.forward_bytes());
-  EXPECT_EQ(0, buffer_.Read(write_buffer_, 1));
-}
-
-TEST_F(SeekableBufferTest, SeekBackward) {
-  EXPECT_EQ(0, buffer_.forward_bytes());
-  EXPECT_EQ(0, buffer_.backward_bytes());
-  EXPECT_FALSE(buffer_.Seek(1));
-  EXPECT_FALSE(buffer_.Seek(-1));
-
-  const int kReadSize = 256;
-
-  // Write into buffer until it's full.
-  for (int i = 0; i < kBufferSize; i += kWriteSize) {
-    // Write a random amount of data.
-    buffer_.Append(data_ + i, kWriteSize);
-  }
-
-  // Read until buffer is empty.
-  for (int i = 0; i < kBufferSize; i += kReadSize) {
-    EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
-    EXPECT_EQ(0, memcmp(write_buffer_, data_ + i, kReadSize));
-  }
-
-  // Seek backward.
-  EXPECT_TRUE(buffer_.Seek(-static_cast<int32_t>(kBufferSize)));
-  EXPECT_FALSE(buffer_.Seek(-1));
-
-  // Read again.
-  for (int i = 0; i < kBufferSize; i += kReadSize) {
-    EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize));
-    EXPECT_EQ(0, memcmp(write_buffer_, data_ + i, kReadSize));
-  }
-}
-
-TEST_F(SeekableBufferTest, GetCurrentChunk) {
-  const int kSeekSize = kWriteSize / 3;
-
-  scoped_refptr<DataBuffer> buffer = DataBuffer::CopyFrom(data_, kWriteSize);
-  DCHECK(buffer);
-
-  const uint8_t* data;
-  int size;
-  EXPECT_FALSE(buffer_.GetCurrentChunk(&data, &size));
-
-  buffer_.Append(buffer.get());
-  EXPECT_TRUE(buffer_.GetCurrentChunk(&data, &size));
-  EXPECT_EQ(data, buffer->data());
-  EXPECT_EQ(size, buffer->data_size());
-
-  buffer_.Seek(kSeekSize);
-  EXPECT_TRUE(buffer_.GetCurrentChunk(&data, &size));
-  EXPECT_EQ(data, buffer->data() + kSeekSize);
-  EXPECT_EQ(size, buffer->data_size() - kSeekSize);
-}
-
-TEST_F(SeekableBufferTest, SeekForward) {
-  int write_position = 0;
-  int read_position = 0;
-  while (read_position < kDataSize) {
-    for (int i = 0; i < 10 && write_position < kDataSize; ++i) {
-      // Write a random amount of data.
-      int write_size = GetRandomInt(kBufferSize);
-      write_size = std::min(write_size, kDataSize - write_position);
-
-      bool should_append = buffer_.Append(data_ + write_position, write_size);
-      write_position += write_size;
-      EXPECT_GE(write_position, read_position);
-      EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
-      EXPECT_EQ(should_append, buffer_.forward_bytes() < kBufferSize)
-          << "Incorrect buffer full status reported";
-    }
-
-    // Read a random amount of data.
-    int seek_size = GetRandomInt(kBufferSize);
-    if (buffer_.Seek(seek_size)) read_position += seek_size;
-    EXPECT_GE(write_position, read_position);
-    EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
-
-    // Read a random amount of data.
-    int read_size = GetRandomInt(kBufferSize);
-    int bytes_read = buffer_.Read(write_buffer_, read_size);
-    EXPECT_GE(read_size, bytes_read);
-    EXPECT_EQ(
-        0, memcmp(write_buffer_, data_ + read_position, bytes_read));
-    read_position += bytes_read;
-    EXPECT_GE(write_position, read_position);
-    EXPECT_EQ(write_position - read_position, buffer_.forward_bytes());
-  }
-}
-
-TEST_F(SeekableBufferTest, AllMethods) {
-  EXPECT_EQ(0, buffer_.Read(write_buffer_, 0));
-  EXPECT_EQ(0, buffer_.Read(write_buffer_, 1));
-  EXPECT_TRUE(buffer_.Seek(0));
-  EXPECT_FALSE(buffer_.Seek(-1));
-  EXPECT_FALSE(buffer_.Seek(1));
-  EXPECT_EQ(0, buffer_.forward_bytes());
-  EXPECT_EQ(0, buffer_.backward_bytes());
-}
-
-TEST_F(SeekableBufferTest, GetTime) {
-  const int64_t kNoTS = kNoTimestamp.ToInternalValue();
-  const struct {
-    int64_t first_time_useconds;
-    int64_t duration_useconds;
-    int consume_bytes;
-    int64_t expected_time;
-  } tests[] = {
-      {kNoTS, 1000000, 0, kNoTS},
-      {kNoTS, 4000000, 0, kNoTS},
-      {kNoTS, 8000000, 0, kNoTS},
-      {kNoTS, 1000000, kWriteSize / 2, kNoTS},
-      {kNoTS, 4000000, kWriteSize / 2, kNoTS},
-      {kNoTS, 8000000, kWriteSize / 2, kNoTS},
-      {kNoTS, 1000000, kWriteSize, kNoTS},
-      {kNoTS, 4000000, kWriteSize, kNoTS},
-      {kNoTS, 8000000, kWriteSize, kNoTS},
-      {0, 1000000, 0, 0},
-      {0, 4000000, 0, 0},
-      {0, 8000000, 0, 0},
-      {0, 1000000, kWriteSize / 2, 500000},
-      {0, 4000000, kWriteSize / 2, 2000000},
-      {0, 8000000, kWriteSize / 2, 4000000},
-      {0, 1000000, kWriteSize, 1000000},
-      {0, 4000000, kWriteSize, 4000000},
-      {0, 8000000, kWriteSize, 8000000},
-      {5, 1000000, 0, 5},
-      {5, 4000000, 0, 5},
-      {5, 8000000, 0, 5},
-      {5, 1000000, kWriteSize / 2, 500005},
-      {5, 4000000, kWriteSize / 2, 2000005},
-      {5, 8000000, kWriteSize / 2, 4000005},
-      {5, 1000000, kWriteSize, 1000005},
-      {5, 4000000, kWriteSize, 4000005},
-      {5, 8000000, kWriteSize, 8000005},
-  };
-
-  // current_time() must initially return kNoTimestamp.
-  EXPECT_EQ(kNoTimestamp.ToInternalValue(),
-            buffer_.current_time().ToInternalValue());
-
-  scoped_refptr<DataBuffer> buffer = DataBuffer::CopyFrom(data_, kWriteSize);
-  DCHECK(buffer);
-
-  for (size_t i = 0; i < arraysize(tests); ++i) {
-    buffer->set_timestamp(
-        base::TimeDelta::FromMicroseconds(tests[i].first_time_useconds));
-    buffer->set_duration(
-        base::TimeDelta::FromMicroseconds(tests[i].duration_useconds));
-    buffer_.Append(buffer.get());
-    EXPECT_TRUE(buffer_.Seek(tests[i].consume_bytes));
-
-    int64_t actual = buffer_.current_time().ToInternalValue();
-
-    EXPECT_EQ(tests[i].expected_time, actual)
-        << "With test = { start:" << tests[i].first_time_useconds
-        << ", duration:" << tests[i].duration_useconds
-        << ", consumed:" << tests[i].consume_bytes << " }\n";
-
-    buffer_.Clear();
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/simd/convert_rgb_to_yuv.h b/cobalt/media/base/simd/convert_rgb_to_yuv.h
deleted file mode 100644
index 7eaa2b1..0000000
--- a/cobalt/media/base/simd/convert_rgb_to_yuv.h
+++ /dev/null
@@ -1,52 +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 COBALT_MEDIA_BASE_SIMD_CONVERT_RGB_TO_YUV_H_
-#define COBALT_MEDIA_BASE_SIMD_CONVERT_RGB_TO_YUV_H_
-
-#include "cobalt/media/base/yuv_convert.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// These methods are exported for testing purposes only.  Library users should
-// only call the methods listed in yuv_convert.h.
-
-MEDIA_EXPORT void ConvertRGB32ToYUV_SSSE3(const uint8_t* rgbframe,
-                                          uint8_t* yplane, uint8_t* uplane,
-                                          uint8_t* vplane, int width,
-                                          int height, int rgbstride,
-                                          int ystride, int uvstride);
-
-MEDIA_EXPORT void ConvertRGB24ToYUV_SSSE3(const uint8_t* rgbframe,
-                                          uint8_t* yplane, uint8_t* uplane,
-                                          uint8_t* vplane, int width,
-                                          int height, int rgbstride,
-                                          int ystride, int uvstride);
-
-MEDIA_EXPORT void ConvertRGB32ToYUV_SSE2(const uint8_t* rgbframe,
-                                         uint8_t* yplane, uint8_t* uplane,
-                                         uint8_t* vplane, int width, int height,
-                                         int rgbstride, int ystride,
-                                         int uvstride);
-
-MEDIA_EXPORT void ConvertRGB32ToYUV_SSE2_Reference(
-    const uint8_t* rgbframe, uint8_t* yplane, uint8_t* uplane, uint8_t* vplane,
-    int width, int height, int rgbstride, int ystride, int uvstride);
-
-MEDIA_EXPORT void ConvertRGB32ToYUV_C(const uint8_t* rgbframe, uint8_t* yplane,
-                                      uint8_t* uplane, uint8_t* vplane,
-                                      int width, int height, int rgbstride,
-                                      int ystride, int uvstride);
-
-MEDIA_EXPORT void ConvertRGB24ToYUV_C(const uint8_t* rgbframe, uint8_t* yplane,
-                                      uint8_t* uplane, uint8_t* vplane,
-                                      int width, int height, int rgbstride,
-                                      int ystride, int uvstride);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_SIMD_CONVERT_RGB_TO_YUV_H_
diff --git a/cobalt/media/base/simd/convert_rgb_to_yuv_c.cc b/cobalt/media/base/simd/convert_rgb_to_yuv_c.cc
deleted file mode 100644
index 752e57b..0000000
--- a/cobalt/media/base/simd/convert_rgb_to_yuv_c.cc
+++ /dev/null
@@ -1,87 +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 "build/build_config.h"
-#include "cobalt/media/base/simd/convert_rgb_to_yuv.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-static int clip_byte(int x) {
-  if (x > 255)
-    return 255;
-  else if (x < 0)
-    return 0;
-  else
-    return x;
-}
-
-void ConvertRGB32ToYUV_C(const uint8_t* rgbframe, uint8_t* yplane,
-                         uint8_t* uplane, uint8_t* vplane, int width,
-                         int height, int rgbstride, int ystride, int uvstride) {
-#if defined(OS_ANDROID)
-  const int r = 0;
-  const int g = 1;
-  const int b = 2;
-#else
-  const int r = 2;
-  const int g = 1;
-  const int b = 0;
-#endif
-
-  for (int i = 0; i < height; ++i) {
-    for (int j = 0; j < width; ++j) {
-      // Since the input pixel format is RGB32, there are 4 bytes per pixel.
-      const uint8_t* pixel = rgbframe + 4 * j;
-      yplane[j] = clip_byte(
-          ((pixel[r] * 66 + pixel[g] * 129 + pixel[b] * 25 + 128) >> 8) + 16);
-      if (i % 2 == 0 && j % 2 == 0) {
-        uplane[j / 2] = clip_byte(
-            ((pixel[r] * -38 + pixel[g] * -74 + pixel[b] * 112 + 128) >> 8) +
-            128);
-        vplane[j / 2] = clip_byte(
-            ((pixel[r] * 112 + pixel[g] * -94 + pixel[b] * -18 + 128) >> 8) +
-            128);
-      }
-    }
-    rgbframe += rgbstride;
-    yplane += ystride;
-    if (i % 2 == 0) {
-      uplane += uvstride;
-      vplane += uvstride;
-    }
-  }
-}
-
-void ConvertRGB24ToYUV_C(const uint8_t* rgbframe, uint8_t* yplane,
-                         uint8_t* uplane, uint8_t* vplane, int width,
-                         int height, int rgbstride, int ystride, int uvstride) {
-  for (int i = 0; i < height; ++i) {
-    for (int j = 0; j < width; ++j) {
-      // Since the input pixel format is RGB24, there are 3 bytes per pixel.
-      const uint8_t* pixel = rgbframe + 3 * j;
-      yplane[j] = clip_byte(
-          ((pixel[2] * 66 + pixel[1] * 129 + pixel[0] * 25 + 128) >> 8) + 16);
-      if (i % 2 == 0 && j % 2 == 0) {
-        uplane[j / 2] = clip_byte(
-            ((pixel[2] * -38 + pixel[1] * -74 + pixel[0] * 112 + 128) >> 8) +
-            128);
-        vplane[j / 2] = clip_byte(
-            ((pixel[2] * 112 + pixel[1] * -94 + pixel[0] * -18 + 128) >> 8) +
-            128);
-      }
-    }
-
-    rgbframe += rgbstride;
-    yplane += ystride;
-    if (i % 2 == 0) {
-      uplane += uvstride;
-      vplane += uvstride;
-    }
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/simd/convert_rgb_to_yuv_sse2.cc b/cobalt/media/base/simd/convert_rgb_to_yuv_sse2.cc
deleted file mode 100644
index 43f0365..0000000
--- a/cobalt/media/base/simd/convert_rgb_to_yuv_sse2.cc
+++ /dev/null
@@ -1,371 +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 "build/build_config.h"
-#include "cobalt/media/base/simd/convert_rgb_to_yuv.h"
-
-#if defined(COMPILER_MSVC)
-#include <intrin.h>
-#else
-// clang-format off
-#include <mmintrin.h>
-#include <emmintrin.h>
-// clang-format on
-
-#include "starboard/types.h"
-#endif
-
-#if defined(COMPILER_MSVC)
-#define SIMD_ALIGNED(var) __declspec(align(16)) var
-#else
-#define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
-#endif
-
-namespace cobalt {
-namespace media {
-
-#define FIX_SHIFT 12
-#define FIX(x) ((x) * (1 << FIX_SHIFT))
-
-// Define a convenient macro to do static cast.
-#define INT16_FIX(x) static_cast<int16_t>(FIX(x))
-
-// Android's pixel layout is RGBA, while other platforms
-// are BGRA.
-#if defined(OS_ANDROID)
-SIMD_ALIGNED(const int16_t ConvertRGBAToYUV_kTable[8 * 3]) = {
-    INT16_FIX(0.257),  INT16_FIX(0.504),  INT16_FIX(0.098),  0,
-    INT16_FIX(0.257),  INT16_FIX(0.504),  INT16_FIX(0.098),  0,
-    -INT16_FIX(0.148), -INT16_FIX(0.291), INT16_FIX(0.439),  0,
-    -INT16_FIX(0.148), -INT16_FIX(0.291), INT16_FIX(0.439),  0,
-    INT16_FIX(0.439),  -INT16_FIX(0.368), -INT16_FIX(0.071), 0,
-    INT16_FIX(0.439),  -INT16_FIX(0.368), -INT16_FIX(0.071), 0,
-};
-#else
-SIMD_ALIGNED(const int16_t ConvertRGBAToYUV_kTable[8 * 3]) = {
-    INT16_FIX(0.098),  INT16_FIX(0.504),  INT16_FIX(0.257),  0,
-    INT16_FIX(0.098),  INT16_FIX(0.504),  INT16_FIX(0.257),  0,
-    INT16_FIX(0.439),  -INT16_FIX(0.291), -INT16_FIX(0.148), 0,
-    INT16_FIX(0.439),  -INT16_FIX(0.291), -INT16_FIX(0.148), 0,
-    -INT16_FIX(0.071), -INT16_FIX(0.368), INT16_FIX(0.439),  0,
-    -INT16_FIX(0.071), -INT16_FIX(0.368), INT16_FIX(0.439),  0,
-};
-#endif
-
-#undef INT16_FIX
-
-// This is the final offset for the conversion from signed yuv values to
-// unsigned values. It is arranged so that offset of 16 is applied to Y
-// components and 128 is added to UV components for 2 pixels.
-SIMD_ALIGNED(const int32_t kYOffset[4]) = {16, 16, 16, 16};
-
-static inline uint8_t Clamp(int value) {
-  if (value < 0) return 0;
-  if (value > 255) return 255;
-  return static_cast<uint8_t>(value);
-}
-
-static inline uint8_t RGBToY(int r, int g, int b) {
-  int y = ConvertRGBAToYUV_kTable[0] * b + ConvertRGBAToYUV_kTable[1] * g +
-          ConvertRGBAToYUV_kTable[2] * r;
-  y >>= FIX_SHIFT;
-  return Clamp(y + 16);
-}
-
-static inline uint8_t RGBToU(int r, int g, int b, int shift) {
-  int u = ConvertRGBAToYUV_kTable[8] * b + ConvertRGBAToYUV_kTable[9] * g +
-          ConvertRGBAToYUV_kTable[10] * r;
-  u >>= FIX_SHIFT + shift;
-  return Clamp(u + 128);
-}
-
-static inline uint8_t RGBToV(int r, int g, int b, int shift) {
-  int v = ConvertRGBAToYUV_kTable[16] * b + ConvertRGBAToYUV_kTable[17] * g +
-          ConvertRGBAToYUV_kTable[18] * r;
-  v >>= FIX_SHIFT + shift;
-  return Clamp(v + 128);
-}
-
-#define CONVERT_Y(rgb_buf, y_buf) \
-  b = *rgb_buf++;                 \
-  g = *rgb_buf++;                 \
-  r = *rgb_buf++;                 \
-  ++rgb_buf;                      \
-  sum_b += b;                     \
-  sum_g += g;                     \
-  sum_r += r;                     \
-  *y_buf++ = RGBToY(r, g, b);
-
-static inline void ConvertRGBToYUV_V2H2(const uint8_t* rgb_buf_1,
-                                        const uint8_t* rgb_buf_2,
-                                        uint8_t* y_buf_1, uint8_t* y_buf_2,
-                                        uint8_t* u_buf, uint8_t* v_buf) {
-  int sum_b = 0;
-  int sum_g = 0;
-  int sum_r = 0;
-  int r, g, b;
-
-  CONVERT_Y(rgb_buf_1, y_buf_1);
-  CONVERT_Y(rgb_buf_1, y_buf_1);
-  CONVERT_Y(rgb_buf_2, y_buf_2);
-  CONVERT_Y(rgb_buf_2, y_buf_2);
-  *u_buf++ = RGBToU(sum_r, sum_g, sum_b, 2);
-  *v_buf++ = RGBToV(sum_r, sum_g, sum_b, 2);
-}
-
-static inline void ConvertRGBToYUV_V2H1(const uint8_t* rgb_buf_1,
-                                        const uint8_t* rgb_buf_2,
-                                        uint8_t* y_buf_1, uint8_t* y_buf_2,
-                                        uint8_t* u_buf, uint8_t* v_buf) {
-  int sum_b = 0;
-  int sum_g = 0;
-  int sum_r = 0;
-  int r, g, b;
-
-  CONVERT_Y(rgb_buf_1, y_buf_1);
-  CONVERT_Y(rgb_buf_2, y_buf_2);
-  *u_buf++ = RGBToU(sum_r, sum_g, sum_b, 1);
-  *v_buf++ = RGBToV(sum_r, sum_g, sum_b, 1);
-}
-
-static inline void ConvertRGBToYUV_V1H2(const uint8_t* rgb_buf, uint8_t* y_buf,
-                                        uint8_t* u_buf, uint8_t* v_buf) {
-  int sum_b = 0;
-  int sum_g = 0;
-  int sum_r = 0;
-  int r, g, b;
-
-  CONVERT_Y(rgb_buf, y_buf);
-  CONVERT_Y(rgb_buf, y_buf);
-  *u_buf++ = RGBToU(sum_r, sum_g, sum_b, 1);
-  *v_buf++ = RGBToV(sum_r, sum_g, sum_b, 1);
-}
-
-static inline void ConvertRGBToYUV_V1H1(const uint8_t* rgb_buf, uint8_t* y_buf,
-                                        uint8_t* u_buf, uint8_t* v_buf) {
-  int sum_b = 0;
-  int sum_g = 0;
-  int sum_r = 0;
-  int r, g, b;
-
-  CONVERT_Y(rgb_buf, y_buf);
-  *u_buf++ = RGBToU(r, g, b, 0);
-  *v_buf++ = RGBToV(r, g, b, 0);
-}
-
-static void ConvertRGB32ToYUVRow_SSE2(const uint8_t* rgb_buf_1,
-                                      const uint8_t* rgb_buf_2,
-                                      uint8_t* y_buf_1, uint8_t* y_buf_2,
-                                      uint8_t* u_buf, uint8_t* v_buf,
-                                      int width) {
-  while (width >= 4) {
-    // Name for the Y pixels:
-    // Row 1: a b c d
-    // Row 2: e f g h
-    //
-    // First row 4 pixels.
-    __m128i rgb_row_1 =
-        _mm_loadu_si128(reinterpret_cast<const __m128i*>(rgb_buf_1));
-    __m128i zero_1 = _mm_xor_si128(rgb_row_1, rgb_row_1);
-
-    __m128i y_table = _mm_load_si128(
-        reinterpret_cast<const __m128i*>(ConvertRGBAToYUV_kTable));
-
-    __m128i rgb_a_b = _mm_unpackhi_epi8(rgb_row_1, zero_1);
-    rgb_a_b = _mm_madd_epi16(rgb_a_b, y_table);
-
-    __m128i rgb_c_d = _mm_unpacklo_epi8(rgb_row_1, zero_1);
-    rgb_c_d = _mm_madd_epi16(rgb_c_d, y_table);
-
-    // Do a crazh shuffle so that we get:
-    //  v------------ Multiply Add
-    // BG: a b c d
-    // A0: a b c d
-    __m128i bg_abcd = _mm_castps_si128(
-        _mm_shuffle_ps(_mm_castsi128_ps(rgb_c_d), _mm_castsi128_ps(rgb_a_b),
-                       (3 << 6) | (1 << 4) | (3 << 2) | 1));
-    __m128i r_abcd = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(rgb_c_d),
-                                                     _mm_castsi128_ps(rgb_a_b),
-                                                     (2 << 6) | (2 << 2)));
-    __m128i y_abcd = _mm_add_epi32(bg_abcd, r_abcd);
-
-    // Down shift back to 8bits range.
-    __m128i y_offset =
-        _mm_load_si128(reinterpret_cast<const __m128i*>(kYOffset));
-    y_abcd = _mm_srai_epi32(y_abcd, FIX_SHIFT);
-    y_abcd = _mm_add_epi32(y_abcd, y_offset);
-    y_abcd = _mm_packs_epi32(y_abcd, y_abcd);
-    y_abcd = _mm_packus_epi16(y_abcd, y_abcd);
-    *reinterpret_cast<uint32_t*>(y_buf_1) = _mm_cvtsi128_si32(y_abcd);
-    y_buf_1 += 4;
-
-    // Second row 4 pixels.
-    __m128i rgb_row_2 =
-        _mm_loadu_si128(reinterpret_cast<const __m128i*>(rgb_buf_2));
-    __m128i zero_2 = _mm_xor_si128(rgb_row_2, rgb_row_2);
-    __m128i rgb_e_f = _mm_unpackhi_epi8(rgb_row_2, zero_2);
-    __m128i rgb_g_h = _mm_unpacklo_epi8(rgb_row_2, zero_2);
-
-    // Add two rows together.
-    __m128i rgb_ae_bf =
-        _mm_add_epi16(_mm_unpackhi_epi8(rgb_row_1, zero_2), rgb_e_f);
-    __m128i rgb_cg_dh =
-        _mm_add_epi16(_mm_unpacklo_epi8(rgb_row_1, zero_2), rgb_g_h);
-
-    // Multiply add like the previous row.
-    rgb_e_f = _mm_madd_epi16(rgb_e_f, y_table);
-    rgb_g_h = _mm_madd_epi16(rgb_g_h, y_table);
-
-    __m128i bg_efgh = _mm_castps_si128(
-        _mm_shuffle_ps(_mm_castsi128_ps(rgb_g_h), _mm_castsi128_ps(rgb_e_f),
-                       (3 << 6) | (1 << 4) | (3 << 2) | 1));
-    __m128i r_efgh = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(rgb_g_h),
-                                                     _mm_castsi128_ps(rgb_e_f),
-                                                     (2 << 6) | (2 << 2)));
-    __m128i y_efgh = _mm_add_epi32(bg_efgh, r_efgh);
-    y_efgh = _mm_srai_epi32(y_efgh, FIX_SHIFT);
-    y_efgh = _mm_add_epi32(y_efgh, y_offset);
-    y_efgh = _mm_packs_epi32(y_efgh, y_efgh);
-    y_efgh = _mm_packus_epi16(y_efgh, y_efgh);
-    *reinterpret_cast<uint32_t*>(y_buf_2) = _mm_cvtsi128_si32(y_efgh);
-    y_buf_2 += 4;
-
-    __m128i rgb_ae_cg = _mm_castps_si128(
-        _mm_shuffle_ps(_mm_castsi128_ps(rgb_cg_dh), _mm_castsi128_ps(rgb_ae_bf),
-                       (3 << 6) | (2 << 4) | (3 << 2) | 2));
-    __m128i rgb_bf_dh = _mm_castps_si128(
-        _mm_shuffle_ps(_mm_castsi128_ps(rgb_cg_dh), _mm_castsi128_ps(rgb_ae_bf),
-                       (1 << 6) | (1 << 2)));
-
-    // This is a 2x2 subsampling for 2 pixels.
-    __m128i rgb_abef_cdgh = _mm_add_epi16(rgb_ae_cg, rgb_bf_dh);
-
-    // Do a multiply add with U table.
-    __m128i u_a_b = _mm_madd_epi16(
-        rgb_abef_cdgh, _mm_load_si128(reinterpret_cast<const __m128i*>(
-                           ConvertRGBAToYUV_kTable + 8)));
-    u_a_b = _mm_add_epi32(_mm_shuffle_epi32(u_a_b, ((3 << 2) | 1)),
-                          _mm_shuffle_epi32(u_a_b, (2 << 2)));
-    // Right shift 14 because of 12 from fixed point and 2 from subsampling.
-    u_a_b = _mm_srai_epi32(u_a_b, FIX_SHIFT + 2);
-    __m128i uv_offset = _mm_slli_epi32(y_offset, 3);
-    u_a_b = _mm_add_epi32(u_a_b, uv_offset);
-    u_a_b = _mm_packs_epi32(u_a_b, u_a_b);
-    u_a_b = _mm_packus_epi16(u_a_b, u_a_b);
-    *reinterpret_cast<uint16_t*>(u_buf) =
-        static_cast<uint16_t>(_mm_extract_epi16(u_a_b, 0));
-    u_buf += 2;
-
-    __m128i v_a_b = _mm_madd_epi16(
-        rgb_abef_cdgh, _mm_load_si128(reinterpret_cast<const __m128i*>(
-                           ConvertRGBAToYUV_kTable + 16)));
-    v_a_b = _mm_add_epi32(_mm_shuffle_epi32(v_a_b, ((3 << 2) | 1)),
-                          _mm_shuffle_epi32(v_a_b, (2 << 2)));
-    v_a_b = _mm_srai_epi32(v_a_b, FIX_SHIFT + 2);
-    v_a_b = _mm_add_epi32(v_a_b, uv_offset);
-    v_a_b = _mm_packs_epi32(v_a_b, v_a_b);
-    v_a_b = _mm_packus_epi16(v_a_b, v_a_b);
-    *reinterpret_cast<uint16_t*>(v_buf) =
-        static_cast<uint16_t>(_mm_extract_epi16(v_a_b, 0));
-    v_buf += 2;
-
-    rgb_buf_1 += 16;
-    rgb_buf_2 += 16;
-
-    // Move forward by 4 pixels.
-    width -= 4;
-  }
-
-  // Just use C code to convert the remaining pixels.
-  if (width >= 2) {
-    ConvertRGBToYUV_V2H2(rgb_buf_1, rgb_buf_2, y_buf_1, y_buf_2, u_buf, v_buf);
-    rgb_buf_1 += 8;
-    rgb_buf_2 += 8;
-    y_buf_1 += 2;
-    y_buf_2 += 2;
-    ++u_buf;
-    ++v_buf;
-    width -= 2;
-  }
-
-  if (width)
-    ConvertRGBToYUV_V2H1(rgb_buf_1, rgb_buf_2, y_buf_1, y_buf_2, u_buf, v_buf);
-}
-
-extern void ConvertRGB32ToYUV_SSE2(const uint8_t* rgbframe, uint8_t* yplane,
-                                   uint8_t* uplane, uint8_t* vplane, int width,
-                                   int height, int rgbstride, int ystride,
-                                   int uvstride) {
-  while (height >= 2) {
-    ConvertRGB32ToYUVRow_SSE2(rgbframe, rgbframe + rgbstride, yplane,
-                              yplane + ystride, uplane, vplane, width);
-    rgbframe += 2 * rgbstride;
-    yplane += 2 * ystride;
-    uplane += uvstride;
-    vplane += uvstride;
-    height -= 2;
-  }
-
-  if (!height) return;
-
-  // Handle the last row.
-  while (width >= 2) {
-    ConvertRGBToYUV_V1H2(rgbframe, yplane, uplane, vplane);
-    rgbframe += 8;
-    yplane += 2;
-    ++uplane;
-    ++vplane;
-    width -= 2;
-  }
-
-  if (width) ConvertRGBToYUV_V1H1(rgbframe, yplane, uplane, vplane);
-}
-
-void ConvertRGB32ToYUV_SSE2_Reference(const uint8_t* rgbframe, uint8_t* yplane,
-                                      uint8_t* uplane, uint8_t* vplane,
-                                      int width, int height, int rgbstride,
-                                      int ystride, int uvstride) {
-  while (height >= 2) {
-    int i = 0;
-
-    // Convert a 2x2 block.
-    while (i + 2 <= width) {
-      ConvertRGBToYUV_V2H2(rgbframe + i * 4, rgbframe + rgbstride + i * 4,
-                           yplane + i, yplane + ystride + i, uplane + i / 2,
-                           vplane + i / 2);
-      i += 2;
-    }
-
-    // Convert the last pixel of two rows.
-    if (i < width) {
-      ConvertRGBToYUV_V2H1(rgbframe + i * 4, rgbframe + rgbstride + i * 4,
-                           yplane + i, yplane + ystride + i, uplane + i / 2,
-                           vplane + i / 2);
-    }
-
-    rgbframe += 2 * rgbstride;
-    yplane += 2 * ystride;
-    uplane += uvstride;
-    vplane += uvstride;
-    height -= 2;
-  }
-
-  if (!height) return;
-
-  // Handle the last row.
-  while (width >= 2) {
-    ConvertRGBToYUV_V1H2(rgbframe, yplane, uplane, vplane);
-    rgbframe += 8;
-    yplane += 2;
-    ++uplane;
-    ++vplane;
-    width -= 2;
-  }
-
-  // Handle the last pixel in the last row.
-  if (width) ConvertRGBToYUV_V1H1(rgbframe, yplane, uplane, vplane);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.asm b/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.asm
deleted file mode 100644
index 6b86ff2..0000000
--- a/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.asm
+++ /dev/null
@@ -1,318 +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 "media/base/simd/media_export.asm"
-%include "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses SSE, SSE2, SSE3, and SSSE3, which are supported by all ATOM
-; processors.
-;
-  SECTION_TEXT
-  CPU       SSE, SSE3, SSE3, SSSE3
-
-;
-; XMM registers representing constants. We must not use these registers as
-; destination operands.
-; for (int i = 0; i < 16; i += 4) {
-;   xmm7.b[i] = 25;  xmm7.b[i+1] = 2;   xmm7.b[i+2] = 66;  xmm7.b[i+3] = 0;
-;   xmm6.b[i] = 0;   xmm6.b[i+1] = 127; xmm6.b[i+2] = 0;   xmm6.b[i+3] = 0;
-;   xmm5.b[i] = 112; xmm5.b[i+1] = -74; xmm5.b[i+2] = -38; xmm5.b[i+3] = 0;
-;   xmm4.b[i] = -18; xmm4.b[i+1] = -94; xmm4.b[i+2] = 112; xmm4.b[i+3] = 0;
-; }
-;
-%define XMM_CONST_Y0    xmm7
-%define XMM_CONST_Y1    xmm6
-%define XMM_CONST_U     xmm5
-%define XMM_CONST_V     xmm4
-%define XMM_CONST_128   xmm3
-
-;
-; LOAD_XMM %1 (xmm), %2 (imm32)
-; Loads an immediate value to an XMM register.
-;   %1.d[0] = %1.d[1] =  %1.d[2] =  %1.d[3] = %2;
-;
-%macro LOAD_XMM 2
-  mov       TEMPd, %2
-  movd      %1, TEMPd
-  pshufd    %1, %1, 00000000B
-%endmacro
-
-;
-; UNPACKRGB %1 (xmm), %2 (imm8)
-; Unpacks one RGB pixel in the specified XMM register.
-;   for (int i = 15; i > %2; --i) %1.b[i] = %1.b[i - 1];
-;   %1.b[%2] = 0;
-;   for (int i = %2 - 1; i >= 0; --i) %1.b[i] = %1.b[i];
-;
-%macro UNPACKRGB 2
-  movdqa    xmm1, %1
-  psrldq    xmm1, %2
-  pslldq    xmm1, %2
-  pxor      %1, xmm1
-  pslldq    xmm1, 1
-  por       %1, xmm1
-%endmacro
-
-;
-; READ_ARGB %1 (xmm), %2 (imm)
-; Read the specified number of ARGB (or RGB) pixels from the source and store
-; them to the destination xmm register. If the input format is RGB, we read RGB
-; pixels and convert them to ARGB pixels. (For this case, the alpha values of
-; the output pixels become 0.)
-;
-%macro READ_ARGB 2
-
-%if PIXELSIZE == 4
-
-  ; Read ARGB pixels from the source. (This macro assumes the input buffer may
-  ; not be aligned to a 16-byte boundary.)
-%if %2 == 1
-  movd      %1, DWORD [ARGBq + WIDTHq * 4 * 2]
-%elif %2 == 2
-  movq      %1, QWORD [ARGBq + WIDTHq * 4 * 2]
-%elif %2 == 4
-  movdqu    %1, DQWORD [ARGBq + WIDTHq * 4 * 2]
-%else
-%error unsupported number of pixels.
-%endif
-
-%elif PIXELSIZE == 3
-
-  ; Read RGB pixels from the source and convert them to ARGB pixels.
-%if %2 == 1
-  ; Read one RGB pixel and convert it to one ARGB pixel.
-  ; Save the WIDTH register to xmm1. (This macro needs to break it.)
-  MOVq      xmm1, WIDTHq
-
-  ; Once read three bytes from the source to TEMPd, and copy it to the
-  ; destination xmm register.
-  lea       WIDTHq, [WIDTHq + WIDTHq * 2]
-  movzx     TEMPd, BYTE [ARGBq + WIDTHq * 2 + 2]
-  shl       TEMPd, 16
-  mov       TEMPw, WORD [ARGBq + WIDTHq * 2]
-  movd      %1, TEMPd
-
-  ; Restore the WIDTH register.
-  MOVq      WIDTHq, xmm1
-%elif %2 == 2
-  ; Read two RGB pixels and convert them to two ARGB pixels.
-  ; Read six bytes from the source to the destination xmm register.
-  mov       TEMPq, WIDTHq
-  lea       TEMPq, [TEMPq + TEMPq * 2]
-  movd      %1, DWORD [ARGBq + TEMPq * 2]
-  pinsrw    %1, WORD [ARGBq + TEMPq * 2 + 4], 3
-
-  ; Fill the alpha values of these RGB pixels with 0 and convert them to two
-  ; ARGB pixels.
-  UNPACKRGB %1, 3
-%elif %2 == 4
-  ; Read four RGB pixels and convert them to four ARGB pixels.
-  ; Read twelve bytes from the source to the destination xmm register.
-  mov       TEMPq, WIDTHq
-  lea       TEMPq, [TEMPq + TEMPq * 2]
-  movq      %1, QWORD [ARGBq + TEMPq * 2]
-  movd      xmm1, DWORD [ARGBq + TEMPq * 2 + 8]
-  shufps    %1, xmm1, 01000100B
-
-  ; Fill the alpha values of these RGB pixels with 0 and convert them to four
-  ; ARGB pixels.
-  UNPACKRGB %1, 3
-  UNPACKRGB %1, 4 + 3
-  UNPACKRGB %1, 4 + 4 + 3
-%else
-%error unsupported number of pixels.
-%endif
-
-%else
-%error unsupported PIXELSIZE value.
-%endif
-
-%endmacro
-
-;
-; CALC_Y %1 (xmm), %2 (xmm)
-; Calculates four Y values from four ARGB pixels stored in %2.
-;   %1.b[0] = ToByte((25 * B(0) + 129 * G(0) + 66 * R(0) + 128) / 256 + 16);
-;   %1.b[1] = ToByte((25 * B(1) + 129 * G(1) + 66 * R(1) + 128) / 256 + 16);
-;   %1.b[2] = ToByte((25 * B(2) + 129 * G(2) + 66 * R(2) + 128) / 256 + 16);
-;   %1.b[3] = ToByte((25 * B(3) + 129 * G(3) + 66 * R(3) + 128) / 256 + 16);
-;
-%macro CALC_Y 2
-  ; To avoid signed saturation, we divide this conversion formula into two
-  ; formulae and store their results into two XMM registers %1 and xmm2.
-  ; %1.w[0]   = 25  * %2.b[0]  + 2   * %2.b[1]  + 66  * %2.b[2]  + 0 * %2.b[3];
-  ; %1.w[1]   = 25  * %2.b[4]  + 2   * %2.b[5]  + 66  * %2.b[6]  + 0 * %2.b[7];
-  ; %1.w[2]   = 25  * %2.b[8]  + 2   * %2.b[9]  + 66  * %2.b[10] + 0 * %2.b[11];
-  ; %1.w[3]   = 25  * %2.b[12] + 2   * %2.b[13] + 66  * %2.b[14] + 0 * %2.b[15];
-  ; xmm2.w[0] = 0   * %2.b[0]  + 127 * %2.b[1]  + 0   * %2.b[2]  + 0 * %2.b[3];
-  ; xmm2.w[1] = 0   * %2.b[4]  + 127 * %2.b[5]  + 0   * %2.b[6]  + 0 * %2.b[7];
-  ; xmm2.w[2] = 0   * %2.b[8]  + 127 * %2.b[9]  + 0   * %2.b[10] + 0 * %2.b[11];
-  ; xmm2.w[3] = 0   * %2.b[12] + 127 * %2.b[13] + 0   * %2.b[14] + 0 * %2.b[15];
-  movdqa    %1, %2
-  pmaddubsw %1, XMM_CONST_Y0
-  phaddsw   %1, %1
-  movdqa    xmm2, %2
-  pmaddubsw xmm2, XMM_CONST_Y1
-  phaddsw   xmm2, xmm2
-
-  ; %1.b[0] = ToByte((%1.w[0] + xmm2.w[0] + 128) / 256 + 16);
-  ; %1.b[1] = ToByte((%1.w[1] + xmm2.w[1] + 128) / 256 + 16);
-  ; %1.b[2] = ToByte((%1.w[2] + xmm2.w[2] + 128) / 256 + 16);
-  ; %1.b[3] = ToByte((%1.w[3] + xmm2.w[3] + 128) / 256 + 16);
-  paddw     %1, xmm2
-  movdqa    xmm2, XMM_CONST_128
-  paddw     %1, xmm2
-  psrlw     %1, 8
-  psrlw     xmm2, 3
-  paddw     %1, xmm2
-  packuswb  %1, %1
-%endmacro
-
-;
-; INIT_UV %1 (r32), %2 (reg) %3 (imm)
-;
-%macro INIT_UV 3
-
-%if SUBSAMPLING == 1 && LINE == 1
-%if %3 == 1 || %3 == 2
-  movzx     %1, BYTE [%2 + WIDTHq]
-%elif %3 == 4
-  movzx     %1, WORD [%2 + WIDTHq]
-%else
-%error unsupported number of pixels.
-%endif
-%endif
-
-%endmacro
-
-;
-; CALC_UV %1 (xmm), %2 (xmm), %3 (xmm), %4 (r32)
-; Calculates two U (or V) values from four ARGB pixels stored in %2.
-; if %3 == XMM_CONST_U
-; if (SUBSAMPLING) {
-;   %1.b[0] = ToByte((112 * B(0) - 74 * G(0) - 38 * R(0) + 128) / 256 + 128);
-;   %1.b[0] = ToByte((112 * B(0) - 74 * G(0) - 38 * R(0) + 128) / 256 + 128);
-;   %1.b[1] = ToByte((112 * B(2) - 74 * G(2) - 38 * R(2) + 128) / 256 + 128);
-;   %1.b[1] = ToByte((112 * B(2) - 74 * G(2) - 38 * R(2) + 128) / 256 + 128);
-; } else {
-;   %1.b[0] = ToByte((112 * B(0) - 74 * G(0) - 38 * R(0) + 128) / 256 + 128);
-;   %1.b[1] = ToByte((112 * B(2) - 74 * G(2) - 38 * R(2) + 128) / 256 + 128);
-; }
-; if %3 == XMM_CONST_V
-;   %1.b[0] = ToByte((-18 * B(0) - 94 * G(0) + 112 * R(0) + 128) / 256 + 128);
-;   %1.b[1] = ToByte((-18 * B(2) - 94 * G(2) + 112 * R(2) + 128) / 256 + 128);
-;
-%macro CALC_UV 4
-  ; for (int i = 0; i < 4; ++i) {
-  ;   %1.w[i] = 0;
-  ;   for (int j = 0; j < 4; ++j)
-  ;     %1.w[i] += %3.b[i * 4 + j] + %2.b[i * 4 + j];
-  ; }
-  movdqa    %1, %2
-  pmaddubsw %1, %3
-  phaddsw   %1, %1
-
-%if SUBSAMPLING == 1
-  ; %1.w[0] = (%1.w[0] + %1.w[1] + 1) / 2;
-  ; %1.w[1] = (%1.w[1] + %1.w[0] + 1) / 2;
-  ; %1.w[2] = (%1.w[2] + %1.w[3] + 1) / 2;
-  ; %1.w[3] = (%1.w[3] + %1.w[2] + 1) / 2;
-  pshuflw   xmm2, %1, 10110001B
-  pavgw     %1, xmm2
-%endif
-
-  ; %1.b[0] = ToByte((%1.w[0] + 128) / 256 + 128);
-  ; %1.b[1] = ToByte((%1.w[2] + 128) / 256 + 128);
-  pshuflw   %1, %1, 10001000B
-  paddw     %1, XMM_CONST_128
-  psraw     %1, 8
-  paddw     %1, XMM_CONST_128
-  packuswb  %1, %1
-
-%if SUBSAMPLING == 1 && LINE == 1
-  ; %1.b[0] = (%1.b[0] + %3.b[0] + 1) / 2;
-  ; %1.b[1] = (%1.b[1] + %3.b[1] + 1) / 2;
-  movd      xmm2, %4
-  pavgb     %1, xmm2
-%endif
-%endmacro
-
-;
-; extern "C" void ConvertARGBToYUVRow_SSSE3(const uint8_t* argb,
-;                                           uint8_t* y,
-;                                           uint8_t* u,
-;                                           uint8_t* v,
-;                                           ptrdiff_t width);
-;
-%define SYMBOL          ConvertARGBToYUVRow_SSSE3
-%define PIXELSIZE       4
-%define SUBSAMPLING     0
-%define LINE            0
-%include "convert_rgb_to_yuv_ssse3.inc"
-
-;
-; extern "C" void ConvertRGBToYUVRow_SSSE3(const uint8_t* rgb,
-;                                          uint8_t* y,
-;                                          uint8_t* u,
-;                                          uint8_t* v,
-;                                          ptrdiff_t width);
-;
-%define SYMBOL          ConvertRGBToYUVRow_SSSE3
-%define PIXELSIZE       3
-%define SUBSAMPLING     0
-%define LINE            0
-%include "convert_rgb_to_yuv_ssse3.inc"
-
-;
-; extern "C" void ConvertARGBToYUVEven_SSSE3(const uint8_t* argb,
-;                                            uint8_t* y,
-;                                            uint8_t* u,
-;                                            uint8_t* v,
-;                                            ptrdiff_t width);
-;
-%define SYMBOL          ConvertARGBToYUVEven_SSSE3
-%define PIXELSIZE       4
-%define SUBSAMPLING     1
-%define LINE            0
-%include "convert_rgb_to_yuv_ssse3.inc"
-
-;
-; extern "C" void ConvertARGBToYUVOdd_SSSE3(const uint8_t* argb,
-;                                           uint8_t* y,
-;                                           uint8_t* u,
-;                                           uint8_t* v,
-;                                           ptrdiff_t width);
-;
-%define SYMBOL          ConvertARGBToYUVOdd_SSSE3
-%define PIXELSIZE       4
-%define SUBSAMPLING     1
-%define LINE            1
-%include "convert_rgb_to_yuv_ssse3.inc"
-
-;
-; extern "C" void ConvertRGBToYUVEven_SSSE3(const uint8_t* rgb,
-;                                           uint8_t* y,
-;                                           uint8_t* u,
-;                                           uint8_t* v,
-;                                           ptrdiff_t width);
-;
-%define SYMBOL          ConvertRGBToYUVEven_SSSE3
-%define PIXELSIZE       3
-%define SUBSAMPLING     1
-%define LINE            0
-%include "convert_rgb_to_yuv_ssse3.inc"
-
-;
-; extern "C" void ConvertRGBToYUVOdd_SSSE3(const uint8_t* rgb,
-;                                          uint8_t* y,
-;                                          uint8_t* u,
-;                                          uint8_t* v,
-;                                          ptrdiff_t width);
-;
-%define SYMBOL          ConvertRGBToYUVOdd_SSSE3
-%define PIXELSIZE       3
-%define SUBSAMPLING     1
-%define LINE            1
-%include "convert_rgb_to_yuv_ssse3.inc"
diff --git a/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.cc b/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.cc
deleted file mode 100644
index 0e025a5..0000000
--- a/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.cc
+++ /dev/null
@@ -1,55 +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 "cobalt/media/base/simd/convert_rgb_to_yuv.h"
-
-#include "build/build_config.h"
-#include "cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.h"
-
-namespace cobalt {
-namespace media {
-
-void ConvertRGB32ToYUV_SSSE3(const uint8_t* rgbframe, uint8_t* yplane,
-                             uint8_t* uplane, uint8_t* vplane, int width,
-                             int height, int rgbstride, int ystride,
-                             int uvstride) {
-  for (; height >= 2; height -= 2) {
-    ConvertARGBToYUVRow_SSSE3(rgbframe, yplane, uplane, vplane, width);
-    rgbframe += rgbstride;
-    yplane += ystride;
-
-    ConvertARGBToYUVRow_SSSE3(rgbframe, yplane, NULL, NULL, width);
-    rgbframe += rgbstride;
-    yplane += ystride;
-
-    uplane += uvstride;
-    vplane += uvstride;
-  }
-
-  if (height)
-    ConvertARGBToYUVRow_SSSE3(rgbframe, yplane, uplane, vplane, width);
-}
-
-void ConvertRGB24ToYUV_SSSE3(const uint8_t* rgbframe, uint8_t* yplane,
-                             uint8_t* uplane, uint8_t* vplane, int width,
-                             int height, int rgbstride, int ystride,
-                             int uvstride) {
-  for (; height >= 2; height -= 2) {
-    ConvertRGBToYUVRow_SSSE3(rgbframe, yplane, uplane, vplane, width);
-    rgbframe += rgbstride;
-    yplane += ystride;
-
-    ConvertRGBToYUVRow_SSSE3(rgbframe, yplane, NULL, NULL, width);
-    rgbframe += rgbstride;
-    yplane += ystride;
-
-    uplane += uvstride;
-    vplane += uvstride;
-  }
-
-  if (height) ConvertRGBToYUVRow_SSSE3(rgbframe, yplane, uplane, vplane, width);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.h b/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.h
deleted file mode 100644
index 0059861..0000000
--- a/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.h
+++ /dev/null
@@ -1,36 +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 COBALT_MEDIA_BASE_SIMD_CONVERT_RGB_TO_YUV_SSSE3_H_
-#define COBALT_MEDIA_BASE_SIMD_CONVERT_RGB_TO_YUV_SSSE3_H_
-
-#include "starboard/types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// The header file for ASM functions that convert a row of RGB pixels with SSSE3
-// instructions so we can call them from C++ code. These functions are
-// implemented in "convert_rgb_to_yuv_ssse3.asm".
-
-// We use ptrdiff_t instead of int for yasm routine parameters to portably
-// sign-extend int. On Win64, MSVC does not sign-extend the value in the stack
-// home of int function parameters, and yasm routines are unaware of this lack
-// of extension and fault.  ptrdiff_t is portably sign-extended and fixes this
-// issue on at least Win64.
-
-// Convert a row of 24-bit RGB pixels to YV12 pixels.
-void ConvertRGBToYUVRow_SSSE3(const uint8_t* rgb, uint8_t* y, uint8_t* u,
-                              uint8_t* v, ptrdiff_t width);
-
-// Convert a row of 32-bit RGB pixels to YV12 pixels.
-void ConvertARGBToYUVRow_SSSE3(const uint8_t* argb, uint8_t* y, uint8_t* u,
-                               uint8_t* v, ptrdiff_t width);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // COBALT_MEDIA_BASE_SIMD_CONVERT_RGB_TO_YUV_SSSE3_H_
diff --git a/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.inc b/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.inc
deleted file mode 100644
index 5217c69..0000000
--- a/cobalt/media/base/simd/convert_rgb_to_yuv_ssse3.inc
+++ /dev/null
@@ -1,200 +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.
-
-;
-; void SYMBOL(const uint8_t* argb, uint8_t* y, uint8_t* u, uint8_t* v, int width);
-;
-; The main code that converts RGB pixels to YUV pixels. This function roughly
-; consists of three parts: converting one ARGB pixel to YUV pixels, converting
-; two ARGB pixels to YUV pixels, and converting four ARGB pixels to YUV pixels.
-; To write the structure of this function in C, it becomes the snippet listed
-; below.
-;
-;   if (width & 1) {
-;     --width;
-;     // Convert one ARGB pixel to one Y pixel, one U pixel, and one V pixel.
-;   }
-;
-;   if (width & 2) {
-;     width -= 2;
-;     // Convert two ARGB pixels to two Y pixels, one U pixel, and one V pixel.
-;   }
-;
-;   while (width) {
-;     width -= 4;
-;     // Convert four ARGB pixels to four Y pixels, two U pixels, and two V
-;     // pixels.
-;   }
-;
-  EXPORT    SYMBOL
-  align     function_align
-
-mangle(SYMBOL):
-  %assign stack_offset 0
-  PROLOGUE 5, 6, 8, ARGB, Y, U, V, WIDTH, TEMP
-
-  ; Initialize constants used in this function. (We use immediates to avoid
-  ; dependency onto GOT.)
-  LOAD_XMM  XMM_CONST_Y0, 0x00420219
-  LOAD_XMM  XMM_CONST_Y1, 0x00007F00
-  LOAD_XMM  XMM_CONST_U, 0x00DAB670
-  LOAD_XMM  XMM_CONST_V, 0x0070A2EE
-  LOAD_XMM  XMM_CONST_128, 0x00800080
-
-.convert_one_pixel:
-  ; Divide the input width by two so it represents the offsets for u[] and v[].
-  ; When the width is odd, We read the rightmost ARGB pixel and convert its
-  ; colorspace to YUV. This code stores one Y pixel, one U pixel, and one V
-  ; pixel.
-  sar       WIDTHq, 1
-  jnc       .convert_two_pixels
-
-  ; Read one ARGB (or RGB) pixel.
-  READ_ARGB xmm0, 1
-
-  ; Calculate y[0] from one RGB pixel read above.
-  CALC_Y    xmm1, xmm0
-  movd      TEMPd, xmm1
-  mov       BYTE [Yq + WIDTHq * 2], TEMPb
-
-  ; Calculate u[0] from one RGB pixel read above. If this is an odd line, the
-  ; output pixel contains the U value calculated in the previous call. We also
-  ; read this pixel and calculate their average.
-  INIT_UV   TEMPd, Uq, 4
-  CALC_UV   xmm1, xmm0, XMM_CONST_U, TEMPd
-  movd      TEMPd, xmm1
-  mov       BYTE [Uq + WIDTHq], TEMPb
-
-  ; Calculate v[0] from one RGB pixel. Same as u[0], we read the result of the
-  ; previous call and get their average.
-  INIT_UV   TEMPd, Uq, 4
-  CALC_UV   xmm1, xmm0, XMM_CONST_V, TEMPd
-  movd      TEMPd, xmm1
-  mov       BYTE [Vq + WIDTHq], TEMPb
-
-.convert_two_pixels:
-  ; If the input width is not a multiple of four, read the rightmost two ARGB
-  ; pixels and convert their colorspace to YUV. This code stores two Y pixels,
-  ; one U pixel, and one V pixel.
-  test      WIDTHb, 2 / 2
-  jz        .convert_four_pixels
-  sub       WIDTHb, 2 / 2
-
-  ; Read two ARGB (or RGB) pixels.
-  READ_ARGB xmm0, 2
-
-  ; Calculate r[0] and r[1] from two RGB pixels read above.
-  CALC_Y    xmm1, xmm0
-  movd      TEMPd, xmm1
-  mov       WORD [Yq + WIDTHq * 2], TEMPw
-
-  ; Skip calculating u and v if the output buffer is NULL.
-  test      Uq, Uq
-  jz        .convert_four_pixels
-
-  ; Calculate u[0] from two RGB pixels read above. (For details, read the above
-  ; comment in .convert_one_pixel).
-  INIT_UV   TEMPd, Uq, 2
-  CALC_UV   xmm1, xmm0, XMM_CONST_U, TEMPd
-  movd      TEMPd, xmm1
-  mov       BYTE [Uq + WIDTHq], TEMPb
-
-  ; Calculate v[0] from two RGB pixels read above.
-  INIT_UV   TEMPd, Vq, 2
-  CALC_UV   xmm1, xmm0, XMM_CONST_V, TEMPd
-  movd      TEMPd, xmm1
-  mov       BYTE [Vq + WIDTHq], TEMPb
-
-.convert_four_pixels:
-  ; Read four ARGB pixels and convert their colorspace to YUV. This code stores
-  ; four Y pixels, two U pixels, and two V pixels.
-  test      WIDTHq, WIDTHq
-  jz        .convert_finish
-
-%if PIXELSIZE == 4
-  ; Check if the input buffer is aligned to a 16-byte boundary and use movdqa
-  ; for reading the ARGB pixels.
-  test      ARGBw, 15
-  jnz       .convert_four_pixels_unaligned
-
-.convert_four_pixels_aligned:
-  sub       WIDTHq, 4 / 2
-
-  ; Read four ARGB pixels. (We can use movdqa here since we have checked if the
-  ; source address is aligned.)
-  movdqa    xmm0, DQWORD [ARGBq + WIDTHq * 4 * 2]
-
-  ; Calculate y[0], y[1], y[2],and, y[3] from the input ARGB pixels.
-  CALC_Y    xmm1, xmm0
-  movd      DWORD [Yq + WIDTHq * 2], xmm1
-
-%if SUBSAMPLING == 0
-  ; Skip calculating u and v if the output buffer is NULL, which means we are
-  ; converting an odd line. (When we enable subsampling, these buffers must
-  ; contain the u and v values for the previous call, i.e. these variables must
-  ; not be NULL.)
-  test      Uq, Uq
-  jz        .convert_four_pixels_aligned_next
-%endif
-
-  ; Calculate u[0] and u[1] from four ARGB pixels read above.
-  INIT_UV   TEMPd, Uq, 4
-  CALC_UV   xmm1, xmm0, XMM_CONST_U, TEMPd
-  movd      TEMPd, xmm1
-  mov       WORD [Uq + WIDTHq], TEMPw
-
-  ; Calculate v[0] and v[1] from four ARGB pixels read above.
-  INIT_UV   TEMPd, Vq, 4
-  CALC_UV   xmm1, xmm0, XMM_CONST_V, TEMPd
-  movd      TEMPd, xmm1
-  mov       WORD [Vq + WIDTHq], TEMPw
-
-%if SUBSAMPLING == 0
-.convert_four_pixels_aligned_next:
-%endif
-
-  test      WIDTHq, WIDTHq
-  jnz       .convert_four_pixels_aligned
-
-  jmp       .convert_finish
-%endif
-
-.convert_four_pixels_unaligned:
-  sub       WIDTHq, 4 / 2
-
-  ; Read four ARGB (or RGB) pixels.
-  READ_ARGB xmm0, 4
-
-  ; Calculate y[0], y[1], y[2],and, y[3] from the input ARGB pixels.
-  CALC_Y    xmm1, xmm0
-  movd      DWORD [Yq + WIDTHq * 2], xmm1
-
-%if SUBSAMPLING == 0
-  ; Skip calculating u and v if the output buffer is NULL.
-  test      Uq, Uq
-  jz        .convert_four_pixels_unaligned_next
-%endif
-
-  ; Calculate u[0] and u[1] from the input ARGB pixels.
-  INIT_UV   TEMPd, Uq, 4
-  CALC_UV   xmm1, xmm0, XMM_CONST_U, TEMPd
-  movd      TEMPd, xmm1
-  mov       WORD [Uq + WIDTHq], TEMPw
-
-  ; Calculate v[0] and v[1] from the input ARGB pixels.
-  INIT_UV   TEMPd, Vq, 4
-  CALC_UV   xmm1, xmm0, XMM_CONST_V, TEMPd
-  movd      TEMPd, xmm1
-  mov       WORD [Vq + WIDTHq], TEMPw
-
-%if SUBSAMPLING == 0
-.convert_four_pixels_unaligned_next:
-%endif
-
-  test      WIDTHq, WIDTHq
-  jnz       .convert_four_pixels_unaligned
-
-.convert_finish:
-  ; Just exit this function since this is a void function.
-  RET
diff --git a/cobalt/media/base/simd/convert_rgb_to_yuv_unittest.cc b/cobalt/media/base/simd/convert_rgb_to_yuv_unittest.cc
deleted file mode 100644
index b218f00..0000000
--- a/cobalt/media/base/simd/convert_rgb_to_yuv_unittest.cc
+++ /dev/null
@@ -1,115 +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 "cobalt/media/base/simd/convert_rgb_to_yuv.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "base/cpu.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-// Reference code that converts RGB pixels to YUV pixels.
-int ConvertRGBToY(const uint8_t* rgb) {
-  int y = 25 * rgb[0] + 129 * rgb[1] + 66 * rgb[2];
-  y = ((y + 128) >> 8) + 16;
-  return std::max(0, std::min(255, y));
-}
-
-int ConvertRGBToU(const uint8_t* rgb, int size) {
-  int u = 112 * rgb[0] - 74 * rgb[1] - 38 * rgb[2];
-  u = ((u + 128) >> 8) + 128;
-  return std::max(0, std::min(255, u));
-}
-
-int ConvertRGBToV(const uint8_t* rgb, int size) {
-  int v = -18 * rgb[0] - 94 * rgb[1] + 112 * rgb[2];
-  v = ((v + 128) >> 8) + 128;
-  return std::max(0, std::min(255, v));
-}
-
-}  // namespace
-
-// Assembly code confuses MemorySanitizer. Do not run it in MSan builds.
-#if defined(MEMORY_SANITIZER)
-#define MAYBE_SideBySideRGB DISABLED_SideBySideRGB
-#else
-#define MAYBE_SideBySideRGB SideBySideRGB
-#endif
-
-// A side-by-side test that verifies our ASM functions that convert RGB pixels
-// to YUV pixels can output the expected results. This test converts RGB pixels
-// to YUV pixels with our ASM functions (which use SSE, SSE2, SSE3, and SSSE3)
-// and compare the output YUV pixels with the ones calculated with out reference
-// functions implemented in C++.
-TEST(YUVConvertTest, MAYBE_SideBySideRGB) {
-  // We skip this test on PCs which does not support SSE3 because this test
-  // needs it.
-  base::CPU cpu;
-  if (!cpu.has_ssse3()) return;
-
-  // This test checks a subset of all RGB values so this test does not take so
-  // long time.
-  const int kStep = 8;
-  const int kWidth = 256 / kStep;
-
-  for (int size = 3; size <= 4; ++size) {
-    // Create the output buffers.
-    std::unique_ptr<uint8_t[]> rgb(new uint8_t[kWidth * size]);
-    std::unique_ptr<uint8_t[]> y(new uint8_t[kWidth]);
-    std::unique_ptr<uint8_t[]> u(new uint8_t[kWidth / 2]);
-    std::unique_ptr<uint8_t[]> v(new uint8_t[kWidth / 2]);
-
-    // Choose the function that converts from RGB pixels to YUV ones.
-    void (*convert)(const uint8_t*, uint8_t*, uint8_t*, uint8_t*, int, int, int,
-                    int, int) = NULL;
-    if (size == 3)
-      convert = media::ConvertRGB24ToYUV_SSSE3;
-    else
-      convert = media::ConvertRGB32ToYUV_SSSE3;
-
-    int total_error = 0;
-    for (int r = 0; r < kWidth; ++r) {
-      for (int g = 0; g < kWidth; ++g) {
-        // Fill the input pixels.
-        for (int b = 0; b < kWidth; ++b) {
-          rgb[b * size + 0] = b * kStep;
-          rgb[b * size + 1] = g * kStep;
-          rgb[b * size + 2] = r * kStep;
-          if (size == 4) rgb[b * size + 3] = 255;
-        }
-
-        // Convert the input RGB pixels to YUV ones.
-        convert(rgb.get(), y.get(), u.get(), v.get(), kWidth, 1, kWidth * size,
-                kWidth, kWidth / 2);
-
-        // Check the output Y pixels.
-        for (int i = 0; i < kWidth; ++i) {
-          const uint8_t* p = &rgb[i * size];
-          int error = ConvertRGBToY(p) - y[i];
-          total_error += error > 0 ? error : -error;
-        }
-
-        // Check the output U pixels.
-        for (int i = 0; i < kWidth / 2; ++i) {
-          const uint8_t* p = &rgb[i * 2 * size];
-          int error = ConvertRGBToU(p, size) - u[i];
-          total_error += error > 0 ? error : -error;
-        }
-
-        // Check the output V pixels.
-        for (int i = 0; i < kWidth / 2; ++i) {
-          const uint8_t* p = &rgb[i * 2 * size];
-          int error = ConvertRGBToV(p, size) - v[i];
-          total_error += error > 0 ? error : -error;
-        }
-      }
-    }
-
-    EXPECT_EQ(0, total_error);
-  }
-}
diff --git a/cobalt/media/base/simd/convert_yuv_to_rgb.h b/cobalt/media/base/simd/convert_yuv_to_rgb.h
deleted file mode 100644
index 08fcd58..0000000
--- a/cobalt/media/base/simd/convert_yuv_to_rgb.h
+++ /dev/null
@@ -1,123 +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 COBALT_MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_
-#define COBALT_MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_
-
-#include "cobalt/media/base/yuv_convert.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// These methods are exported for testing purposes only.  Library users should
-// only call the methods listed in yuv_convert.h.
-
-MEDIA_EXPORT void ConvertYUVToRGB32_C(const uint8_t* yplane,
-                                      const uint8_t* uplane,
-                                      const uint8_t* vplane, uint8_t* rgbframe,
-                                      int width, int height, int ystride,
-                                      int uvstride, int rgbstride,
-                                      YUVType yuv_type);
-
-MEDIA_EXPORT void ConvertYUVToRGB32Row_C(const uint8_t* yplane,
-                                         const uint8_t* uplane,
-                                         const uint8_t* vplane,
-                                         uint8_t* rgbframe, ptrdiff_t width,
-                                         const int16_t* convert_table);
-
-MEDIA_EXPORT void ConvertYUVAToARGB_C(
-    const uint8_t* yplane, const uint8_t* uplane, const uint8_t* vplane,
-    const uint8_t* aplane, uint8_t* rgbframe, int width, int height,
-    int ystride, int uvstride, int avstride, int rgbstride, YUVType yuv_type);
-
-MEDIA_EXPORT void ConvertYUVAToARGBRow_C(const uint8_t* yplane,
-                                         const uint8_t* uplane,
-                                         const uint8_t* vplane,
-                                         const uint8_t* aplane,
-                                         uint8_t* rgbframe, ptrdiff_t width,
-                                         const int16_t* convert_table);
-
-MEDIA_EXPORT void ConvertYUVToRGB32_SSE(const uint8_t* yplane,
-                                        const uint8_t* uplane,
-                                        const uint8_t* vplane,
-                                        uint8_t* rgbframe, int width,
-                                        int height, int ystride, int uvstride,
-                                        int rgbstride, YUVType yuv_type);
-
-MEDIA_EXPORT void ConvertYUVAToARGB_MMX(
-    const uint8_t* yplane, const uint8_t* uplane, const uint8_t* vplane,
-    const uint8_t* aplane, uint8_t* rgbframe, int width, int height,
-    int ystride, int uvstride, int avstride, int rgbstride, YUVType yuv_type);
-
-MEDIA_EXPORT void ScaleYUVToRGB32Row_C(const uint8_t* y_buf,
-                                       const uint8_t* u_buf,
-                                       const uint8_t* v_buf, uint8_t* rgb_buf,
-                                       ptrdiff_t width, ptrdiff_t source_dx,
-                                       const int16_t* convert_table);
-
-MEDIA_EXPORT void LinearScaleYUVToRGB32Row_C(const uint8_t* y_buf,
-                                             const uint8_t* u_buf,
-                                             const uint8_t* v_buf,
-                                             uint8_t* rgb_buf, ptrdiff_t width,
-                                             ptrdiff_t source_dx,
-                                             const int16_t* convert_table);
-
-MEDIA_EXPORT void LinearScaleYUVToRGB32RowWithRange_C(
-    const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf,
-    uint8_t* rgb_buf, int dest_width, int source_x, int source_dx,
-    const int16_t* convert_table);
-
-}  // namespace media
-}  // namespace cobalt
-
-// Assembly functions are declared without namespace.
-extern "C" {
-
-// We use ptrdiff_t instead of int for yasm routine parameters to portably
-// sign-extend int. On Win64, MSVC does not sign-extend the value in the stack
-// home of int function parameters, and yasm routines are unaware of this lack
-// of extension and fault.  ptrdiff_t is portably sign-extended and fixes this
-// issue on at least Win64.  The C-equivalent RowProc versions' prototypes
-// include the same change to ptrdiff_t to reuse the typedefs.
-
-MEDIA_EXPORT void ConvertYUVAToARGBRow_MMX(const uint8_t* yplane,
-                                           const uint8_t* uplane,
-                                           const uint8_t* vplane,
-                                           const uint8_t* aplane,
-                                           uint8_t* rgbframe, ptrdiff_t width,
-                                           const int16_t* convert_table);
-
-MEDIA_EXPORT void ConvertYUVToRGB32Row_SSE(const uint8_t* yplane,
-                                           const uint8_t* uplane,
-                                           const uint8_t* vplane,
-                                           uint8_t* rgbframe, ptrdiff_t width,
-                                           const int16_t* convert_table);
-
-MEDIA_EXPORT void ScaleYUVToRGB32Row_SSE(const uint8_t* y_buf,
-                                         const uint8_t* u_buf,
-                                         const uint8_t* v_buf, uint8_t* rgb_buf,
-                                         ptrdiff_t width, ptrdiff_t source_dx,
-                                         const int16_t* convert_table);
-
-MEDIA_EXPORT void ScaleYUVToRGB32Row_SSE2_X64(const uint8_t* y_buf,
-                                              const uint8_t* u_buf,
-                                              const uint8_t* v_buf,
-                                              uint8_t* rgb_buf, ptrdiff_t width,
-                                              ptrdiff_t source_dx,
-                                              const int16_t* convert_table);
-
-MEDIA_EXPORT void LinearScaleYUVToRGB32Row_SSE(
-    const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf,
-    uint8_t* rgb_buf, ptrdiff_t width, ptrdiff_t source_dx,
-    const int16_t* convert_table);
-
-MEDIA_EXPORT void LinearScaleYUVToRGB32Row_MMX_X64(
-    const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf,
-    uint8_t* rgb_buf, ptrdiff_t width, ptrdiff_t source_dx,
-    const int16_t* convert_table);
-
-}  // extern "C"
-
-#endif  // COBALT_MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_
diff --git a/cobalt/media/base/simd/convert_yuv_to_rgb_c.cc b/cobalt/media/base/simd/convert_yuv_to_rgb_c.cc
deleted file mode 100644
index bac0ba3..0000000
--- a/cobalt/media/base/simd/convert_yuv_to_rgb_c.cc
+++ /dev/null
@@ -1,233 +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 "build/build_config.h"
-#include "cobalt/media/base/simd/convert_yuv_to_rgb.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-#define packuswb(x) ((x) < 0 ? 0 : ((x) > 255 ? 255 : (x)))
-#define paddsw(x, y) \
-  (((x) + (y)) < -32768 ? -32768 : (((x) + (y)) > 32767 ? 32767 : ((x) + (y))))
-
-// On Android, pixel layout is RGBA (see skia/include/core/SkColorPriv.h);
-// however, other Chrome platforms use BGRA (see skia/config/SkUserConfig.h).
-// Ideally, android should not use the functions here due to performance issue
-// (http://crbug.com/249980).
-#if defined(OS_ANDROID)
-#define SK_R32_SHIFT 0
-#define SK_G32_SHIFT 8
-#define SK_B32_SHIFT 16
-#define SK_A32_SHIFT 24
-#define R_INDEX 0
-#define G_INDEX 1
-#define B_INDEX 2
-#define A_INDEX 3
-#else
-#define SK_B32_SHIFT 0
-#define SK_G32_SHIFT 8
-#define SK_R32_SHIFT 16
-#define SK_A32_SHIFT 24
-#define B_INDEX 0
-#define G_INDEX 1
-#define R_INDEX 2
-#define A_INDEX 3
-#endif
-
-static inline void ConvertYUVToRGB32_C(uint8_t y, uint8_t u, uint8_t v,
-                                       uint8_t* rgb_buf,
-                                       const int16_t* convert_table) {
-  int b = convert_table[4 * (256 + u) + B_INDEX];
-  int g = convert_table[4 * (256 + u) + G_INDEX];
-  int r = convert_table[4 * (256 + u) + R_INDEX];
-  int a = convert_table[4 * (256 + u) + A_INDEX];
-
-  b = paddsw(b, convert_table[4 * (512 + v) + B_INDEX]);
-  g = paddsw(g, convert_table[4 * (512 + v) + G_INDEX]);
-  r = paddsw(r, convert_table[4 * (512 + v) + R_INDEX]);
-  a = paddsw(a, convert_table[4 * (512 + v) + A_INDEX]);
-
-  b = paddsw(b, convert_table[4 * y + B_INDEX]);
-  g = paddsw(g, convert_table[4 * y + G_INDEX]);
-  r = paddsw(r, convert_table[4 * y + R_INDEX]);
-  a = paddsw(a, convert_table[4 * y + A_INDEX]);
-
-  b >>= 6;
-  g >>= 6;
-  r >>= 6;
-  a >>= 6;
-
-  *reinterpret_cast<uint32_t*>(rgb_buf) =
-      (packuswb(b) << SK_B32_SHIFT) | (packuswb(g) << SK_G32_SHIFT) |
-      (packuswb(r) << SK_R32_SHIFT) | (packuswb(a) << SK_A32_SHIFT);
-}
-
-static inline void ConvertYUVAToARGB_C(uint8_t y, uint8_t u, uint8_t v,
-                                       uint8_t a, uint8_t* rgb_buf,
-                                       const int16_t* convert_table) {
-  int b = convert_table[4 * (256 + u) + 0];
-  int g = convert_table[4 * (256 + u) + 1];
-  int r = convert_table[4 * (256 + u) + 2];
-
-  b = paddsw(b, convert_table[4 * (512 + v) + 0]);
-  g = paddsw(g, convert_table[4 * (512 + v) + 1]);
-  r = paddsw(r, convert_table[4 * (512 + v) + 2]);
-
-  b = paddsw(b, convert_table[4 * y + 0]);
-  g = paddsw(g, convert_table[4 * y + 1]);
-  r = paddsw(r, convert_table[4 * y + 2]);
-
-  b >>= 6;
-  g >>= 6;
-  r >>= 6;
-
-  b = packuswb(b) * a >> 8;
-  g = packuswb(g) * a >> 8;
-  r = packuswb(r) * a >> 8;
-
-  *reinterpret_cast<uint32_t*>(rgb_buf) =
-      (b << SK_B32_SHIFT) | (g << SK_G32_SHIFT) | (r << SK_R32_SHIFT) |
-      (a << SK_A32_SHIFT);
-}
-
-void ConvertYUVToRGB32Row_C(const uint8_t* y_buf, const uint8_t* u_buf,
-                            const uint8_t* v_buf, uint8_t* rgb_buf,
-                            ptrdiff_t width, const int16_t* convert_table) {
-  for (int x = 0; x < width; x += 2) {
-    uint8_t u = u_buf[x >> 1];
-    uint8_t v = v_buf[x >> 1];
-    uint8_t y0 = y_buf[x];
-    ConvertYUVToRGB32_C(y0, u, v, rgb_buf, convert_table);
-    if ((x + 1) < width) {
-      uint8_t y1 = y_buf[x + 1];
-      ConvertYUVToRGB32_C(y1, u, v, rgb_buf + 4, convert_table);
-    }
-    rgb_buf += 8;  // Advance 2 pixels.
-  }
-}
-
-void ConvertYUVAToARGBRow_C(const uint8_t* y_buf, const uint8_t* u_buf,
-                            const uint8_t* v_buf, const uint8_t* a_buf,
-                            uint8_t* rgba_buf, ptrdiff_t width,
-                            const int16_t* convert_table) {
-  for (int x = 0; x < width; x += 2) {
-    uint8_t u = u_buf[x >> 1];
-    uint8_t v = v_buf[x >> 1];
-    uint8_t y0 = y_buf[x];
-    uint8_t a0 = a_buf[x];
-    ConvertYUVAToARGB_C(y0, u, v, a0, rgba_buf, convert_table);
-    if ((x + 1) < width) {
-      uint8_t y1 = y_buf[x + 1];
-      uint8_t a1 = a_buf[x + 1];
-      ConvertYUVAToARGB_C(y1, u, v, a1, rgba_buf + 4, convert_table);
-    }
-    rgba_buf += 8;  // Advance 2 pixels.
-  }
-}
-
-// 16.16 fixed point is used.  A shift by 16 isolates the integer.
-// A shift by 17 is used to further subsample the chrominence channels.
-// & 0xffff isolates the fixed point fraction.  >> 2 to get the upper 2 bits,
-// for 1/65536 pixel accurate interpolation.
-void ScaleYUVToRGB32Row_C(const uint8_t* y_buf, const uint8_t* u_buf,
-                          const uint8_t* v_buf, uint8_t* rgb_buf,
-                          ptrdiff_t width, ptrdiff_t source_dx,
-                          const int16_t* convert_table) {
-  int x = 0;
-  for (int i = 0; i < width; i += 2) {
-    int y = y_buf[x >> 16];
-    int u = u_buf[(x >> 17)];
-    int v = v_buf[(x >> 17)];
-    ConvertYUVToRGB32_C(y, u, v, rgb_buf, convert_table);
-    x += source_dx;
-    if ((i + 1) < width) {
-      y = y_buf[x >> 16];
-      ConvertYUVToRGB32_C(y, u, v, rgb_buf + 4, convert_table);
-      x += source_dx;
-    }
-    rgb_buf += 8;
-  }
-}
-
-void LinearScaleYUVToRGB32Row_C(const uint8_t* y_buf, const uint8_t* u_buf,
-                                const uint8_t* v_buf, uint8_t* rgb_buf,
-                                ptrdiff_t width, ptrdiff_t source_dx,
-                                const int16_t* convert_table) {
-  // Avoid point-sampling for down-scaling by > 2:1.
-  int source_x = 0;
-  if (source_dx >= 0x20000) source_x += 0x8000;
-  LinearScaleYUVToRGB32RowWithRange_C(y_buf, u_buf, v_buf, rgb_buf, width,
-                                      source_x, source_dx, convert_table);
-}
-
-void LinearScaleYUVToRGB32RowWithRange_C(const uint8_t* y_buf,
-                                         const uint8_t* u_buf,
-                                         const uint8_t* v_buf, uint8_t* rgb_buf,
-                                         int dest_width, int x, int source_dx,
-                                         const int16_t* convert_table) {
-  for (int i = 0; i < dest_width; i += 2) {
-    int y0 = y_buf[x >> 16];
-    int y1 = y_buf[(x >> 16) + 1];
-    int u0 = u_buf[(x >> 17)];
-    int u1 = u_buf[(x >> 17) + 1];
-    int v0 = v_buf[(x >> 17)];
-    int v1 = v_buf[(x >> 17) + 1];
-    int y_frac = (x & 65535);
-    int uv_frac = ((x >> 1) & 65535);
-    int y = (y_frac * y1 + (y_frac ^ 65535) * y0) >> 16;
-    int u = (uv_frac * u1 + (uv_frac ^ 65535) * u0) >> 16;
-    int v = (uv_frac * v1 + (uv_frac ^ 65535) * v0) >> 16;
-    ConvertYUVToRGB32_C(y, u, v, rgb_buf, convert_table);
-    x += source_dx;
-    if ((i + 1) < dest_width) {
-      y0 = y_buf[x >> 16];
-      y1 = y_buf[(x >> 16) + 1];
-      y_frac = (x & 65535);
-      y = (y_frac * y1 + (y_frac ^ 65535) * y0) >> 16;
-      ConvertYUVToRGB32_C(y, u, v, rgb_buf + 4, convert_table);
-      x += source_dx;
-    }
-    rgb_buf += 8;
-  }
-}
-
-void ConvertYUVToRGB32_C(const uint8_t* yplane, const uint8_t* uplane,
-                         const uint8_t* vplane, uint8_t* rgbframe, int width,
-                         int height, int ystride, int uvstride, int rgbstride,
-                         YUVType yuv_type) {
-  unsigned int y_shift = GetVerticalShift(yuv_type);
-  const int16_t* lookup_table = GetLookupTable(yuv_type);
-  for (int y = 0; y < height; ++y) {
-    uint8_t* rgb_row = rgbframe + y * rgbstride;
-    const uint8_t* y_ptr = yplane + y * ystride;
-    const uint8_t* u_ptr = uplane + (y >> y_shift) * uvstride;
-    const uint8_t* v_ptr = vplane + (y >> y_shift) * uvstride;
-
-    ConvertYUVToRGB32Row_C(y_ptr, u_ptr, v_ptr, rgb_row, width, lookup_table);
-  }
-}
-
-void ConvertYUVAToARGB_C(const uint8_t* yplane, const uint8_t* uplane,
-                         const uint8_t* vplane, const uint8_t* aplane,
-                         uint8_t* rgbaframe, int width, int height, int ystride,
-                         int uvstride, int astride, int rgbastride,
-                         YUVType yuv_type) {
-  unsigned int y_shift = GetVerticalShift(yuv_type);
-  const int16_t* lookup_table = GetLookupTable(yuv_type);
-  for (int y = 0; y < height; y++) {
-    uint8_t* rgba_row = rgbaframe + y * rgbastride;
-    const uint8_t* y_ptr = yplane + y * ystride;
-    const uint8_t* u_ptr = uplane + (y >> y_shift) * uvstride;
-    const uint8_t* v_ptr = vplane + (y >> y_shift) * uvstride;
-    const uint8_t* a_ptr = aplane + y * astride;
-
-    ConvertYUVAToARGBRow_C(y_ptr, u_ptr, v_ptr, a_ptr, rgba_row, width,
-                           lookup_table);
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/simd/convert_yuv_to_rgb_mmx.inc b/cobalt/media/base/simd/convert_yuv_to_rgb_mmx.inc
deleted file mode 100644
index 4b69d1b..0000000
--- a/cobalt/media/base/simd/convert_yuv_to_rgb_mmx.inc
+++ /dev/null
@@ -1,63 +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 "media/base/simd/media_export.asm"
-
-  EXPORT    SYMBOL
-  align     function_align
-
-mangle(SYMBOL):
-  %assign   stack_offset 0
-  PROLOGUE  6, 7, 3, Y, U, V, ARGB, WIDTH, TABLE, TEMP
-
-  jmp       .convertend
-
-.convertloop:
-  movzx     TEMPd, BYTE [Uq]
-  movq      mm0, [TABLEq + 2048 + 8 * TEMPq]
-  add       Uq, 1
-
-  movzx     TEMPd, BYTE [Vq]
-  paddsw    mm0, [TABLEq + 4096 + 8 * TEMPq]
-  add       Vq, 1
-
-  movzx     TEMPd, BYTE [Yq]
-  movq      mm1, [TABLEq + 8 * TEMPq]
-
-  movzx     TEMPd, BYTE [Yq + 1]
-  movq      mm2, [TABLEq + 8 * TEMPq]
-  add       Yq, 2
-
-  ; Add UV components to Y component.
-  paddsw    mm1, mm0
-  paddsw    mm2, mm0
-
-  ; Down shift and then pack.
-  psraw     mm1, 6
-  psraw     mm2, 6
-  packuswb  mm1, mm2
-  MOVQ      [ARGBq], mm1
-  add       ARGBq, 8
-
-.convertend:
-  sub       WIDTHq, 2
-  jns       .convertloop
-
-  ; If number of pixels is odd then compute it.
-  and       WIDTHq, 1
-  jz        .convertdone
-
-  movzx     TEMPd, BYTE [Uq]
-  movq      mm0, [TABLEq + 2048 + 8 * TEMPq]
-  movzx     TEMPd, BYTE [Vq]
-  paddsw    mm0, [TABLEq + 4096 + 8 * TEMPq]
-  movzx     TEMPd, BYTE [Yq]
-  movq      mm1, [TABLEq + 8 * TEMPq]
-  paddsw    mm1, mm0
-  psraw     mm1, 6
-  packuswb  mm1, mm1
-  movd      [ARGBq], mm1
-
-.convertdone:
-  RET
diff --git a/cobalt/media/base/simd/convert_yuv_to_rgb_sse.asm b/cobalt/media/base/simd/convert_yuv_to_rgb_sse.asm
deleted file mode 100644
index f666243..0000000
--- a/cobalt/media/base/simd/convert_yuv_to_rgb_sse.asm
+++ /dev/null
@@ -1,24 +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 "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses MMX and SSE instructions.
-;
-  SECTION_TEXT
-  CPU       MMX, SSE
-
-; Use SSE instruction movntq can write faster.
-%define MOVQ movntq
-
-;
-; extern "C" void ConvertYUVToRGB32Row_SSE(const uint8_t* y_buf,
-;                                          const uint8_t* u_buf,
-;                                          const uint8_t* v_buf,
-;                                          uint8_t* rgb_buf,
-;                                          ptrdiff_t width);
-;                                          const int16_t* convert_table);
-%define SYMBOL ConvertYUVToRGB32Row_SSE
-%include "convert_yuv_to_rgb_mmx.inc"
diff --git a/cobalt/media/base/simd/convert_yuv_to_rgb_x86.cc b/cobalt/media/base/simd/convert_yuv_to_rgb_x86.cc
deleted file mode 100644
index ffa75b7..0000000
--- a/cobalt/media/base/simd/convert_yuv_to_rgb_x86.cc
+++ /dev/null
@@ -1,57 +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.
-
-#if defined(_MSC_VER)
-#include <intrin.h>
-#else
-#include <mmintrin.h>
-#endif
-
-#include "cobalt/media/base/simd/convert_yuv_to_rgb.h"
-#include "cobalt/media/base/yuv_convert.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-void ConvertYUVAToARGB_MMX(const uint8_t* yplane, const uint8_t* uplane,
-                           const uint8_t* vplane, const uint8_t* aplane,
-                           uint8_t* rgbframe, int width, int height,
-                           int ystride, int uvstride, int astride,
-                           int rgbstride, YUVType yuv_type) {
-  unsigned int y_shift = GetVerticalShift(yuv_type);
-  for (int y = 0; y < height; ++y) {
-    uint8_t* rgb_row = rgbframe + y * rgbstride;
-    const uint8_t* y_ptr = yplane + y * ystride;
-    const uint8_t* u_ptr = uplane + (y >> y_shift) * uvstride;
-    const uint8_t* v_ptr = vplane + (y >> y_shift) * uvstride;
-    const uint8_t* a_ptr = aplane + y * astride;
-
-    ConvertYUVAToARGBRow_MMX(y_ptr, u_ptr, v_ptr, a_ptr, rgb_row, width,
-                             GetLookupTable(yuv_type));
-  }
-
-  EmptyRegisterState();
-}
-
-void ConvertYUVToRGB32_SSE(const uint8_t* yplane, const uint8_t* uplane,
-                           const uint8_t* vplane, uint8_t* rgbframe, int width,
-                           int height, int ystride, int uvstride, int rgbstride,
-                           YUVType yuv_type) {
-  unsigned int y_shift = GetVerticalShift(yuv_type);
-  for (int y = 0; y < height; ++y) {
-    uint8_t* rgb_row = rgbframe + y * rgbstride;
-    const uint8_t* y_ptr = yplane + y * ystride;
-    const uint8_t* u_ptr = uplane + (y >> y_shift) * uvstride;
-    const uint8_t* v_ptr = vplane + (y >> y_shift) * uvstride;
-
-    ConvertYUVToRGB32Row_SSE(y_ptr, u_ptr, v_ptr, rgb_row, width,
-                             GetLookupTable(yuv_type));
-  }
-
-  EmptyRegisterState();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/simd/convert_yuva_to_argb_mmx.asm b/cobalt/media/base/simd/convert_yuva_to_argb_mmx.asm
deleted file mode 100644
index 28a147e..0000000
--- a/cobalt/media/base/simd/convert_yuva_to_argb_mmx.asm
+++ /dev/null
@@ -1,24 +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 "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses MMX instructions.
-;
-  SECTION_TEXT
-  CPU       MMX
-
-; Use movq to save the output.
-%define MOVQ movq
-
-; extern "C" void ConvertYUVAToARGBRow_MMX(const uint8_t* y_buf,
-;                                          const uint8_t* u_buf,
-;                                          const uint8_t* v_buf,
-;                                          const uint8_t* a_buf,
-;                                          uint8_t* rgb_buf,
-;                                          ptrdiff_t width);
-;                                          const int16_t* convert_table);
-%define SYMBOL ConvertYUVAToARGBRow_MMX
-%include "convert_yuva_to_argb_mmx.inc"
diff --git a/cobalt/media/base/simd/convert_yuva_to_argb_mmx.inc b/cobalt/media/base/simd/convert_yuva_to_argb_mmx.inc
deleted file mode 100644
index d493383..0000000
--- a/cobalt/media/base/simd/convert_yuva_to_argb_mmx.inc
+++ /dev/null
@@ -1,114 +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 "media/base/simd/media_export.asm"
-
-  EXPORT    SYMBOL
-  align     function_align
-
-mangle(SYMBOL):
-  %assign   stack_offset 0
-  PROLOGUE  7, 7, 3, Y, U, V, A, ARGB, WIDTH, TABLE
-  PUSH      WIDTHq
-  DEFINE_ARGS Y, U, V, A, ARGB, TABLE, TEMP
-  mov       TABLEq, TEMPq
-  jmp       .convertend
-
-.convertloop:
-  movzx     TEMPd, BYTE [Uq]
-  movq      mm0, [TABLEq + 2048 + 8 * TEMPq]
-  add       Uq, 1
-
-  movzx     TEMPd, BYTE [Vq]
-  paddsw    mm0, [TABLEq + 4096 + 8 * TEMPq]
-  add       Vq, 1
-
-  movzx     TEMPd, BYTE [Yq]
-  movq      mm1, [TABLEq + 8 * TEMPq]
-
-  movzx     TEMPd, BYTE [Yq + 1]
-  movq      mm2, [TABLEq + 8 * TEMPq]
-  add       Yq, 2
-
-  ; Add UV components to Y component.
-  paddsw    mm1, mm0
-  paddsw    mm2, mm0
-
-  ; Down shift and then pack.
-  psraw     mm1, 6
-  psraw     mm2, 6
-  packuswb  mm1, mm2
-
-  ; Unpack
-  movq      mm0, mm1
-  pxor      mm2, mm2
-  punpcklbw mm0, mm2
-  punpckhbw mm1, mm2
-
-  ; Add one to our alpha values, this is a somewhat unfortunate hack; while
-  ; the pack/unpack above handle saturating any negative numbers to 0, they also
-  ; truncate the alpha value to 255. The math ahead wants to produce the same
-  ; ARGB alpha value as the source pixel in YUVA, but this depends on the alpha
-  ; value in |mm0| and |mm1| being 256, (let A be the source image alpha,
-  ; 256 * A >> 8 == A, whereas 255 * A >> 8 is off by one except at 0).
-  mov       TEMPq, 0x00010000
-  movd      mm2, TEMPd
-  psllq     mm2, 32
-  paddsw    mm0, mm2
-  paddsw    mm1, mm2
-
-  ; Multiply by alpha value, then repack high bytes of words.
-  movzx     TEMPd, BYTE [Aq]
-  movq      mm2, [TABLEq + 6144 + 8 * TEMPq]
-  pmullw    mm0, mm2
-  psrlw     mm0, 8
-  movzx     TEMPd, BYTE [Aq + 1]
-  movq      mm2, [TABLEq + 6144 + 8 * TEMPq]
-  add       Aq, 2
-  pmullw    mm1, mm2
-  psrlw     mm1, 8
-  packuswb  mm0, mm1
-
-  MOVQ      [ARGBq], mm0
-  add       ARGBq, 8
-
-.convertend:
-  sub       dword [rsp], 2
-  jns       .convertloop
-
-  ; If number of pixels is odd then compute it.
-  and       dword [rsp], 1
-  jz        .convertdone
-
-  movzx     TEMPd, BYTE [Uq]
-  movq      mm0, [TABLEq + 2048 + 8 * TEMPq]
-  movzx     TEMPd, BYTE [Vq]
-  paddsw    mm0, [TABLEq + 4096 + 8 * TEMPq]
-  movzx     TEMPd, BYTE [Yq]
-  movq      mm1, [TABLEq + 8 * TEMPq]
-  paddsw    mm1, mm0
-  psraw     mm1, 6
-  packuswb  mm1, mm1
-
-  ; Multiply ARGB by alpha value.
-  pxor      mm0, mm0
-  punpcklbw mm1, mm0
-
-  ; See above note about this hack.
-  mov       TEMPq, 0x00010000
-  movd      mm0, TEMPd
-  psllq     mm0, 32
-  paddsw    mm1, mm0
-
-  movzx     TEMPd, BYTE [Aq]
-  movq      mm0, [TABLEq + 6144 + 8 * TEMPq]
-  pmullw    mm1, mm0
-  psrlw     mm1, 8
-  packuswb  mm1, mm1
-
-  movd      [ARGBq], mm1
-
-.convertdone:
-  POP       TABLEq
-  RET
diff --git a/cobalt/media/base/simd/empty_register_state_mmx.asm b/cobalt/media/base/simd/empty_register_state_mmx.asm
deleted file mode 100644
index d0028b5..0000000
--- a/cobalt/media/base/simd/empty_register_state_mmx.asm
+++ /dev/null
@@ -1,24 +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.
-
-%include "media/base/simd/media_export.asm"
-%include "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses MMX instructions as an alternative to _mm_empty() which
-; is not supported in Visual Studio 2010 on x64.
-; TODO(wolenetz): Use MMX intrinsics when compiling win64 with Visual
-; Studio 2012? http://crbug.com/173450
-;
-  SECTION_TEXT
-  CPU       MMX
-
-%define SYMBOL EmptyRegisterState_MMX
-  EXPORT    SYMBOL
-  align     function_align
-
-mangle(SYMBOL):
-  emms
-  ret
-
diff --git a/cobalt/media/base/simd/filter_yuv.h b/cobalt/media/base/simd/filter_yuv.h
deleted file mode 100644
index 7dc3104..0000000
--- a/cobalt/media/base/simd/filter_yuv.h
+++ /dev/null
@@ -1,28 +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 COBALT_MEDIA_BASE_SIMD_FILTER_YUV_H_
-#define COBALT_MEDIA_BASE_SIMD_FILTER_YUV_H_
-
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// These methods are exported for testing purposes only.  Library users should
-// only call the methods listed in yuv_convert.h.
-
-MEDIA_EXPORT void FilterYUVRows_C(uint8_t* ybuf, const uint8_t* y0_ptr,
-                                  const uint8_t* y1_ptr, int source_width,
-                                  uint8_t source_y_fraction);
-
-MEDIA_EXPORT void FilterYUVRows_SSE2(uint8_t* ybuf, const uint8_t* y0_ptr,
-                                     const uint8_t* y1_ptr, int source_width,
-                                     uint8_t source_y_fraction);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_SIMD_FILTER_YUV_H_
diff --git a/cobalt/media/base/simd/filter_yuv_c.cc b/cobalt/media/base/simd/filter_yuv_c.cc
deleted file mode 100644
index e83ec00..0000000
--- a/cobalt/media/base/simd/filter_yuv_c.cc
+++ /dev/null
@@ -1,42 +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 "cobalt/media/base/simd/filter_yuv.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-void FilterYUVRows_C(uint8_t* ybuf, const uint8_t* y0_ptr,
-                     const uint8_t* y1_ptr, int source_width,
-                     uint8_t source_y_fraction) {
-  uint8_t y1_fraction = source_y_fraction;
-  uint16_t y0_fraction = 256 - y1_fraction;
-  uint8_t* end = ybuf + source_width;
-  uint8_t* rounded_end = ybuf + (source_width & ~7);
-
-  while (ybuf < rounded_end) {
-    ybuf[0] = (y0_ptr[0] * y0_fraction + y1_ptr[0] * y1_fraction) >> 8;
-    ybuf[1] = (y0_ptr[1] * y0_fraction + y1_ptr[1] * y1_fraction) >> 8;
-    ybuf[2] = (y0_ptr[2] * y0_fraction + y1_ptr[2] * y1_fraction) >> 8;
-    ybuf[3] = (y0_ptr[3] * y0_fraction + y1_ptr[3] * y1_fraction) >> 8;
-    ybuf[4] = (y0_ptr[4] * y0_fraction + y1_ptr[4] * y1_fraction) >> 8;
-    ybuf[5] = (y0_ptr[5] * y0_fraction + y1_ptr[5] * y1_fraction) >> 8;
-    ybuf[6] = (y0_ptr[6] * y0_fraction + y1_ptr[6] * y1_fraction) >> 8;
-    ybuf[7] = (y0_ptr[7] * y0_fraction + y1_ptr[7] * y1_fraction) >> 8;
-    y0_ptr += 8;
-    y1_ptr += 8;
-    ybuf += 8;
-  }
-
-  while (ybuf < end) {
-    ybuf[0] = (y0_ptr[0] * y0_fraction + y1_ptr[0] * y1_fraction) >> 8;
-    ++ybuf;
-    ++y0_ptr;
-    ++y1_ptr;
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/simd/filter_yuv_sse2.cc b/cobalt/media/base/simd/filter_yuv_sse2.cc
deleted file mode 100644
index e11a9e0..0000000
--- a/cobalt/media/base/simd/filter_yuv_sse2.cc
+++ /dev/null
@@ -1,69 +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.
-
-#if defined(_MSC_VER)
-#include <intrin.h>
-#else
-#include <emmintrin.h>
-#include <mmintrin.h>
-#endif
-
-#include "cobalt/media/base/simd/filter_yuv.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-void FilterYUVRows_SSE2(uint8_t* dest, const uint8_t* src0, const uint8_t* src1,
-                        int width, uint8_t fraction) {
-  int pixel = 0;
-
-  // Process the unaligned bytes first.
-  int unaligned_width = (16 - (reinterpret_cast<uintptr_t>(dest) & 15)) & 15;
-  while (pixel < width && pixel < unaligned_width) {
-    dest[pixel] =
-        (src0[pixel] * (256 - fraction) + src1[pixel] * fraction) >> 8;
-    ++pixel;
-  }
-
-  __m128i zero = _mm_setzero_si128();
-  __m128i src1_fraction = _mm_set1_epi16(fraction);
-  __m128i src0_fraction = _mm_set1_epi16(256 - fraction);
-  const __m128i* src0_128 = reinterpret_cast<const __m128i*>(src0 + pixel);
-  const __m128i* src1_128 = reinterpret_cast<const __m128i*>(src1 + pixel);
-  __m128i* dest128 = reinterpret_cast<__m128i*>(dest + pixel);
-  __m128i* end128 = reinterpret_cast<__m128i*>(
-      reinterpret_cast<uintptr_t>(dest + width) & ~15);
-
-  while (dest128 < end128) {
-    __m128i src0 = _mm_loadu_si128(src0_128);
-    __m128i src1 = _mm_loadu_si128(src1_128);
-    __m128i src2 = _mm_unpackhi_epi8(src0, zero);
-    __m128i src3 = _mm_unpackhi_epi8(src1, zero);
-    src0 = _mm_unpacklo_epi8(src0, zero);
-    src1 = _mm_unpacklo_epi8(src1, zero);
-    src0 = _mm_mullo_epi16(src0, src0_fraction);
-    src1 = _mm_mullo_epi16(src1, src1_fraction);
-    src2 = _mm_mullo_epi16(src2, src0_fraction);
-    src3 = _mm_mullo_epi16(src3, src1_fraction);
-    src0 = _mm_add_epi16(src0, src1);
-    src2 = _mm_add_epi16(src2, src3);
-    src0 = _mm_srli_epi16(src0, 8);
-    src2 = _mm_srli_epi16(src2, 8);
-    src0 = _mm_packus_epi16(src0, src2);
-    *dest128++ = src0;
-    ++src0_128;
-    ++src1_128;
-    pixel += 16;
-  }
-
-  while (pixel < width) {
-    dest[pixel] =
-        (src0[pixel] * (256 - fraction) + src1[pixel] * fraction) >> 8;
-    ++pixel;
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/simd/linear_scale_yuv_to_rgb_mmx.asm b/cobalt/media/base/simd/linear_scale_yuv_to_rgb_mmx.asm
deleted file mode 100644
index f2e4f95..0000000
--- a/cobalt/media/base/simd/linear_scale_yuv_to_rgb_mmx.asm
+++ /dev/null
@@ -1,24 +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 "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses MMX instructions.
-;
-  SECTION_TEXT
-  CPU       MMX
-
-; Use movq to save the output.
-%define MOVQ movq
-
-; void LinearScaleYUVToRGB32Row_MMX(const uint8_t* y_buf,
-;                                   const uint8_t* u_buf,
-;                                   const uint8_t* v_buf,
-;                                   uint8_t* rgb_buf,
-;                                   ptrdiff_t width,
-;                                   ptrdiff_t source_dx);
-;                                   const int16_t* convert_table);
-%define SYMBOL LinearScaleYUVToRGB32Row_MMX
-%include "linear_scale_yuv_to_rgb_mmx.inc"
diff --git a/cobalt/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc b/cobalt/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc
deleted file mode 100644
index 48f62ac..0000000
--- a/cobalt/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc
+++ /dev/null
@@ -1,135 +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 "media/base/simd/media_export.asm"
-
-  EXPORT    SYMBOL
-  align     function_align
-
-mangle(SYMBOL):
-  %assign   stack_offset 0
-
-; Parameters are in the following order:
-; 1. Y plane
-; 2. U plane
-; 3. V plane
-; 4. ARGB frame
-; 5. Width
-; 6. Source dx
-; 7. Conversion lookup table
-
-PROLOGUE  7, 7, 3, Y, R0, R1, ARGB, R2, TEMP, R3
-
-%if gprsize == 8
-%define     WORD_SIZE   QWORD
-%else
-%define     WORD_SIZE   DWORD
-%endif
-
-; Define register aliases.
-%define     Xq                  R1q     ; Current X position
-%define     COMPLq              R2q     ; Component A value
-%define     COMPLd              R2d     ; Component A value
-%define     U_ARG_REGq          R0q     ; U plane address argument
-%define     V_ARG_REGq          R1q     ; V plane address argument
-%define     SOURCE_DX_ARG_REGq  TEMPq   ; Source dx argument
-%define     WIDTH_ARG_REGq      R2q     ; Width argument
-
-%define     COMPRq              R0q     ; Component B value
-%define     COMPRd              R0d     ; Component B value
-%define     Uq                  R0q     ; U plane address
-%define     Vq                  R0q     ; V plane address
-%define     U_PLANE             WORD_SIZE [rsp + 3 * gprsize]
-%define     TABLE               R3q     ; Address of the table
-
-; Defines for stack variables.
-%define     V_PLANE             WORD_SIZE [rsp + 2 * gprsize]
-%define     SOURCE_DX           WORD_SIZE [rsp + gprsize]
-%define     SOURCE_WIDTH        WORD_SIZE [rsp]
-
-; Define stack usage.
-  PUSH      U_ARG_REGq
-  PUSH      V_ARG_REGq
-  PUSH      SOURCE_DX_ARG_REGq
-  imul      WIDTH_ARG_REGq, SOURCE_DX_ARG_REGq  ; source_width = width * source_dx
-  PUSH      WIDTH_ARG_REGq
-
-%macro EPILOGUE 0
-  ADD       rsp, 4 * gprsize
-%endmacro
-
-  xor       Xq, Xq                       ; x = 0
-  cmp       SOURCE_DX_ARG_REGq, 0x20000
-  jl        .lscaleend
-  mov       Xq, 0x8000                   ; x = 0.5 for 1/2 or less
-  jmp       .lscaleend
-
-.lscaleloop:
-  mov       Uq, U_PLANE
-
-; Define macros for scaling YUV components since they are reused.
-%macro SCALEUV 1
-  mov       TEMPq, Xq
-  sar       TEMPq, 0x11
-  movzx     COMPLd, BYTE [%1 + TEMPq]
-  movzx     COMPRd, BYTE [%1 + TEMPq + 1]
-  mov       TEMPq, Xq
-  and       TEMPq, 0x1fffe
-  imul      COMPRq, TEMPq
-  xor       TEMPq, 0x1fffe
-  imul      COMPLq, TEMPq
-  add       COMPLq, COMPRq
-  shr       COMPLq, 17
-%endmacro
-  SCALEUV   Uq                           ; Use the above macro to scale U
-  movq      mm0, [TABLE + 2048 + 8 * COMPLq]
-
-  mov       Vq, V_PLANE                  ; Read V address from stack
-  SCALEUV   Vq                           ; Use the above macro to scale V
-  paddsw    mm0, [TABLE + 4096 + 8 * COMPLq]
-
-%macro SCALEY 0
-  mov       TEMPq, Xq
-  sar       TEMPq, 0x10
-  movzx     COMPLd, BYTE [Yq + TEMPq]
-  movzx     COMPRd, BYTE [Yq + TEMPq + 1]
-  mov       TEMPq, Xq
-  add       Xq, SOURCE_DX                 ; Add source_dx from stack
-  and       TEMPq, 0xffff
-  imul      COMPRq, TEMPq
-  xor       TEMPq, 0xffff
-  imul      COMPLq, TEMPq
-  add       COMPLq, COMPRq
-  shr       COMPLq, 16
-%endmacro
-  SCALEY                                  ; Use the above macro to scale Y1
-  movq      mm1, [TABLE + 8 * COMPLq]
-
-  cmp       Xq, SOURCE_WIDTH              ; Compare source_width from stack
-  jge       .lscalelastpixel
-
-  SCALEY                                  ; Use the above macro to sacle Y2
-  movq      mm2, [TABLE + 8 * COMPLq]
-
-  paddsw    mm1, mm0
-  paddsw    mm2, mm0
-  psraw     mm1, 0x6
-  psraw     mm2, 0x6
-  packuswb  mm1, mm2
-  MOVQ      [ARGBq], mm1
-  add       ARGBq, 0x8
-
-.lscaleend:
-  cmp       Xq, SOURCE_WIDTH     ; Compare source_width from stack
-  jl        .lscaleloop
-  EPILOGUE
-  RET
-
-.lscalelastpixel:
-  paddsw    mm1, mm0
-  psraw     mm1, 6
-  packuswb  mm1, mm1
-  movd      [ARGBq], mm1
-  EPILOGUE
-  RET
diff --git a/cobalt/media/base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm b/cobalt/media/base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm
deleted file mode 100644
index 969a1fd..0000000
--- a/cobalt/media/base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm
+++ /dev/null
@@ -1,152 +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 "media/base/simd/media_export.asm"
-%include "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses MMX instructions.
-;
-  SECTION_TEXT
-  CPU       MMX
-
-;void LinearScaleYUVToRGB32Row_MMX_X64(const uint8_t* y_buf,
-;                                      const uint8_t* u_buf,
-;                                      const uint8_t* v_buf,
-;                                      uint8_t* rgb_buf,
-;                                      ptrdiff_t width,
-;                                      ptrdiff_t source_dx);
-%define SYMBOL LinearScaleYUVToRGB32Row_MMX_X64
-  EXPORT    SYMBOL
-  align     function_align
-
-mangle(SYMBOL):
-  %assign   stack_offset 0
-
-; Parameters are in the following order:
-; 1. Y plane
-; 2. U plane
-; 3. V plane
-; 4. ARGB frame
-; 5. Width
-; 6. Source dx
-; 7. Conversion lookup table
-
-PROLOGUE  7, 7, 3, Y, U, V, ARGB, WIDTH, SOURCE_DX, R1
-
-%define     TABLEq     r10
-%define     Xq         r11
-%define     INDEXq     r12
-%define     COMPRd     r13d
-%define     COMPRq     r13
-%define     FRACTIONq  r14
-%define     COMPL      R1
-%define     COMPLq     R1q
-%define     COMPLd     R1d
-
-  PUSH      TABLEq
-  PUSH      Xq
-  PUSH      INDEXq
-  PUSH      COMPRq
-  PUSH      FRACTIONq
-
-%macro EPILOGUE 0
-  POP       FRACTIONq
-  POP       COMPRq
-  POP       INDEXq
-  POP       Xq
-  POP       TABLEq
-%endmacro
-
-  mov       TABLEq, R1q
-
-  imul      WIDTHq, SOURCE_DXq           ; source_width = width * source_dx
-  xor       Xq, Xq                       ; x = 0
-  cmp       SOURCE_DXq, 0x20000
-  jl        .lscaleend
-  mov       Xq, 0x8000                   ; x = 0.5 for 1/2 or less
-  jmp       .lscaleend
-
-.lscaleloop:
-  ; Interpolate U
-  mov       INDEXq, Xq
-  sar       INDEXq, 0x11
-  movzx     COMPLd, BYTE [Uq + INDEXq]
-  movzx     COMPRd, BYTE [Uq + INDEXq + 1]
-  mov       FRACTIONq, Xq
-  and       FRACTIONq, 0x1fffe
-  imul      COMPRq, FRACTIONq
-  xor       FRACTIONq, 0x1fffe
-  imul      COMPLq, FRACTIONq
-  add       COMPLq, COMPRq
-  shr       COMPLq, 17
-  movq      mm0, [TABLEq + 2048 + 8 * COMPLq]
-
-  ; Interpolate V
-  movzx     COMPLd, BYTE [Vq + INDEXq]
-  movzx     COMPRd, BYTE [Vq + INDEXq + 1]
-  ; Trick here to imul COMPL first then COMPR.
-  ; Saves two instruction. :)
-  imul      COMPLq, FRACTIONq
-  xor       FRACTIONq, 0x1fffe
-  imul      COMPRq, FRACTIONq
-  add       COMPLq, COMPRq
-  shr       COMPLq, 17
-  paddsw    mm0, [TABLEq + 4096 + 8 * COMPLq]
-
-  ; Interpolate first Y1.
-  lea       INDEXq, [Xq + SOURCE_DXq]   ; INDEXq now points to next pixel.
-                                        ; Xq points to current pixel.
-  mov       FRACTIONq, Xq
-  sar       Xq, 0x10
-  movzx     COMPLd, BYTE [Yq + Xq]
-  movzx     COMPRd, BYTE [Yq + Xq + 1]
-  and       FRACTIONq, 0xffff
-  imul      COMPRq, FRACTIONq
-  xor       FRACTIONq, 0xffff
-  imul      COMPLq, FRACTIONq
-  add       COMPLq, COMPRq
-  shr       COMPLq, 16
-  movq      mm1, [TABLEq + 8 * COMPLq]
-
-  ; Interpolate Y2 if available.
-  cmp       INDEXq, WIDTHq
-  jge       .lscalelastpixel
-
-  lea       Xq, [INDEXq + SOURCE_DXq]    ; Xq points to next pixel.
-                                         ; INDEXq points to current pixel.
-  mov       FRACTIONq, INDEXq
-  sar       INDEXq, 0x10
-  movzx     COMPLd, BYTE [Yq + INDEXq]
-  movzx     COMPRd, BYTE [Yq + INDEXq + 1]
-  and       FRACTIONq, 0xffff
-  imul      COMPRq, FRACTIONq
-  xor       FRACTIONq, 0xffff
-  imul      COMPLq, FRACTIONq
-  add       COMPLq, COMPRq
-  shr       COMPLq, 16
-  movq      mm2, [TABLEq + 8 * COMPLq]
-
-  paddsw    mm1, mm0
-  paddsw    mm2, mm0
-  psraw     mm1, 0x6
-  psraw     mm2, 0x6
-  packuswb  mm1, mm2
-  movntq    [ARGBq], mm1
-  add       ARGBq, 0x8
-
-.lscaleend:
-  cmp       Xq, WIDTHq
-  jl        .lscaleloop
-  jmp       .epilogue
-
-.lscalelastpixel:
-  paddsw    mm1, mm0
-  psraw     mm1, 6
-  packuswb  mm1, mm1
-  movd      [ARGBq], mm1
-
-.epilogue
-  EPILOGUE
-  RET
diff --git a/cobalt/media/base/simd/linear_scale_yuv_to_rgb_sse.asm b/cobalt/media/base/simd/linear_scale_yuv_to_rgb_sse.asm
deleted file mode 100644
index 62ee9ac..0000000
--- a/cobalt/media/base/simd/linear_scale_yuv_to_rgb_sse.asm
+++ /dev/null
@@ -1,23 +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 "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses MMX and SSE instructions.
-;
-  SECTION_TEXT
-  CPU       MMX, SSE
-
-; Use movq to save the output.
-%define MOVQ movntq
-
-; void LinearScaleYUVToRGB32Row_SSE(const uint8_t* y_buf,
-;                                   const uint8_t* u_buf,
-;                                   const uint8_t* v_buf,
-;                                   uint8_t* rgb_buf,
-;                                   ptrdiff_t width,
-;                                   ptrdiff_t source_dx);
-%define SYMBOL LinearScaleYUVToRGB32Row_SSE
-%include "linear_scale_yuv_to_rgb_mmx.inc"
diff --git a/cobalt/media/base/simd/media_export.asm b/cobalt/media/base/simd/media_export.asm
deleted file mode 100644
index e82be8d..0000000
--- a/cobalt/media/base/simd/media_export.asm
+++ /dev/null
@@ -1,48 +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 set of helper macros for controlling symbol visibility.
-;
-
-%ifndef MEDIA_BASE_SIMD_MEDIA_EXPORT_ASM_
-%define MEDIA_BASE_SIMD_MEDIA_EXPORT_ASM_
-
-; Necessary for the mangle() macro.
-%include "third_party/x86inc/x86inc.asm"
-
-;
-; PRIVATE
-; A flag representing the specified symbol is a private symbol. This define adds
-; a hidden flag on Linux and a private_extern flag on Mac. (We can use this
-; private_extern flag only on the latest yasm.)
-;
-%ifdef MACHO
-%define PRIVATE :private_extern
-%elifdef ELF
-%define PRIVATE :hidden
-%else
-%define PRIVATE
-%endif
-
-;
-; EXPORT %1
-; Designates a symbol as PRIVATE if EXPORT_SYMBOLS is not set.
-;
-%macro EXPORT 1
-%ifdef EXPORT_SYMBOLS
-global mangle(%1)
-
-; Windows needs an additional export declaration.
-%ifidn __OUTPUT_FORMAT__,win32
-export mangle(%1)
-%elifidn __OUTPUT_FORMAT__,win64
-export mangle(%1)
-%endif
-
-%else
-global mangle(%1) PRIVATE
-%endif
-%endmacro
-
-%endif  ; MEDIA_BASE_SIMD_MEDIA_EXPORT_ASM_
diff --git a/cobalt/media/base/simd/scale_yuv_to_rgb_mmx.asm b/cobalt/media/base/simd/scale_yuv_to_rgb_mmx.asm
deleted file mode 100644
index b21c12c..0000000
--- a/cobalt/media/base/simd/scale_yuv_to_rgb_mmx.asm
+++ /dev/null
@@ -1,24 +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 "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses MMX instructions.
-;
-  SECTION_TEXT
-  CPU       MMX
-
-; Use movq to save the output.
-%define MOVQ movq
-
-; void ScaleYUVToRGB32Row_MMX(const uint8_t* y_buf,
-;                             const uint8_t* u_buf,
-;                             const uint8_t* v_buf,
-;                             uint8_t* rgb_buf,
-;                             ptrdiff_t width,
-;                             ptrdiff_t source_dx);
-;                             const int16_t* convert_table);
-%define SYMBOL ScaleYUVToRGB32Row_MMX
-%include "scale_yuv_to_rgb_mmx.inc"
diff --git a/cobalt/media/base/simd/scale_yuv_to_rgb_mmx.inc b/cobalt/media/base/simd/scale_yuv_to_rgb_mmx.inc
deleted file mode 100644
index 42782cb..0000000
--- a/cobalt/media/base/simd/scale_yuv_to_rgb_mmx.inc
+++ /dev/null
@@ -1,98 +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 "media/base/simd/media_export.asm"
-
-  EXPORT    SYMBOL
-  align     function_align
-
-mangle(SYMBOL):
-  %assign   stack_offset 0
-
-; Parameters are in the following order:
-; 1. Y plane
-; 2. U plane
-; 3. V plane
-; 4. ARGB frame
-; 5. Width
-; 6. Source dx
-; 7. Lookup table address
-
-PROLOGUE  7, 7, 3, Y, U, V, ARGB, R1, R2, TEMP
-
-%ifdef ARCH_X86_64
-%define     WORD_SIZE   QWORD
-%else
-%define     WORD_SIZE   DWORD
-%endif
-
-  PUSH      R1q  ; Width
-  PUSH      R2q  ; Source dx
-
-%define     SOURCE_DX   WORD_SIZE [rsp]
-
-  mov       R1q, TEMPq
-
-%define     WIDTH       WORD_SIZE [rsp + gprsize]
-%define     TABLE       R1q
-%define     Xq          R2q
-
-  ; Set Xq index to 0.
-  xor       Xq, Xq
-  jmp       .scaleend
-
-.scaleloop:
-  mov       TEMPq, Xq
-  sar       TEMPq, 17
-  movzx     TEMPd, BYTE [Uq + TEMPq]
-  movq      mm0, [TABLE + 2048 + 8 * TEMPq]
-  mov       TEMPq, Xq
-  sar       TEMPq, 17
-  movzx     TEMPd, BYTE [Vq + TEMPq]
-  paddsw    mm0, [TABLE + 4096 + 8 * TEMPq]
-  mov       TEMPq, Xq
-  add       Xq, SOURCE_DX
-  sar       TEMPq, 16
-  movzx     TEMPd, BYTE [Yq + TEMPq]
-  movq      mm1, [TABLE + 8 * TEMPq]
-  mov       TEMPq, Xq
-  add       Xq, SOURCE_DX
-  sar       TEMPq, 16
-  movzx     TEMPd, BYTE [Yq + TEMPq]
-  movq      mm2, [TABLE + 8 * TEMPq]
-  paddsw    mm1, mm0
-  paddsw    mm2, mm0
-  psraw     mm1, 6
-  psraw     mm2, 6
-  packuswb  mm1, mm2
-  MOVQ      QWORD [ARGBq], mm1
-  add       ARGBq, 8
-
-.scaleend:
-  sub       WIDTH, 2
-  jns       .scaleloop
-
-  and       WIDTH, 1             ; odd number of pixels?
-  jz        .scaledone
-
-  mov       TEMPq, Xq
-  sar       TEMPq, 17
-  movzx     TEMPd, BYTE [Uq + TEMPq]
-  movq      mm0, [TABLE + 2048 + 8 * TEMPq]
-  mov       TEMPq, Xq
-  sar       TEMPq, 17
-  movzx     TEMPd, BYTE [Vq + TEMPq]
-  paddsw    mm0, [TABLE + 4096 + 8 * TEMPq]
-  mov       TEMPq, Xq
-  sar       TEMPq, 16
-  movzx     TEMPd, BYTE [Yq + TEMPq]
-  movq      mm1, [TABLE + 8 * TEMPq]
-  paddsw    mm1, mm0
-  psraw     mm1, 6
-  packuswb  mm1, mm1
-  movd      DWORD [ARGBq], mm1
-
-.scaledone:
-  ADD       rsp, 2 * gprsize
-  RET
diff --git a/cobalt/media/base/simd/scale_yuv_to_rgb_sse.asm b/cobalt/media/base/simd/scale_yuv_to_rgb_sse.asm
deleted file mode 100644
index 34e0112..0000000
--- a/cobalt/media/base/simd/scale_yuv_to_rgb_sse.asm
+++ /dev/null
@@ -1,24 +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 "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses MMX and SSE instructions.
-;
-  SECTION_TEXT
-  CPU       MMX, SSE
-
-; Use movq to save the output.
-%define MOVQ movntq
-
-; void ScaleYUVToRGB32Row_SSE(const uint8_t* y_buf,
-;                             const uint8_t* u_buf,
-;                             const uint8_t* v_buf,
-;                             uint8_t* rgb_buf,
-;                             ptrdiff_t width,
-;                             ptrdiff_t source_dx);
-;                             const int16_t* convert_table);
-%define SYMBOL ScaleYUVToRGB32Row_SSE
-%include "scale_yuv_to_rgb_mmx.inc"
diff --git a/cobalt/media/base/simd/scale_yuv_to_rgb_sse2_x64.asm b/cobalt/media/base/simd/scale_yuv_to_rgb_sse2_x64.asm
deleted file mode 100644
index 9c52b8d..0000000
--- a/cobalt/media/base/simd/scale_yuv_to_rgb_sse2_x64.asm
+++ /dev/null
@@ -1,113 +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 "media/base/simd/media_export.asm"
-%include "third_party/x86inc/x86inc.asm"
-
-;
-; This file uses MMX, SSE2 and instructions.
-;
-  SECTION_TEXT
-  CPU       SSE2
-
-; void ScaleYUVToRGB32Row_SSE2_X64(const uint8_t* y_buf,
-;                                  const uint8_t* u_buf,
-;                                  const uint8_t* v_buf,
-;                                  uint8_t* rgb_buf,
-;                                  ptrdiff_t width,
-;                                  ptrdiff_t source_dx);
-%define SYMBOL ScaleYUVToRGB32Row_SSE2_X64
-  EXPORT    SYMBOL
-  align     function_align
-
-mangle(SYMBOL):
-  %assign   stack_offset 0
-
-; Parameters are in the following order:
-; 1. Y plane
-; 2. U plane
-; 3. V plane
-; 4. ARGB frame
-; 5. Width
-; 6. Source dx
-; 7. Convert table
-
-PROLOGUE  7, 7, 3, Y, U, V, ARGB, WIDTH, SOURCE_DX, R1
-
-%define     TABLEq   r10
-%define     Xq       r11
-%define     INDEXq   r12
-%define     COMPq    R1q
-%define     COMPd    R1d
-
-  PUSH      r10
-  PUSH      r11
-  PUSH      r12
-
-  mov TABLEq, R1q
-
-  ; Set Xq index to 0.
-  xor       Xq, Xq
-  jmp       .scaleend
-
-.scaleloop:
-  ; Read UV pixels.
-  mov       INDEXq, Xq
-  sar       INDEXq, 17
-  movzx     COMPd, BYTE [Uq + INDEXq]
-  movq      xmm0, [TABLEq + 2048 + 8 * COMPq]
-  movzx     COMPd, BYTE [Vq + INDEXq]
-  movq      xmm1, [TABLEq + 4096 + 8 * COMPq]
-
-  ; Read first Y pixel.
-  lea       INDEXq, [Xq + SOURCE_DXq] ; INDEXq nows points to next pixel.
-  sar       Xq, 16
-  movzx     COMPd, BYTE [Yq + Xq]
-  paddsw    xmm0, xmm1		      ; Hide a ADD after memory load.
-  movq      xmm1, [TABLEq + 8 * COMPq]
-
-  ;  Read next Y pixel.
-  lea       Xq, [INDEXq + SOURCE_DXq] ; Xq now points to next pixel.
-  sar       INDEXq, 16
-  movzx     COMPd, BYTE [Yq + INDEXq]
-  movq      xmm2, [TABLEq + 8 * COMPq]
-  paddsw    xmm1, xmm0
-  paddsw    xmm2, xmm0
-  shufps    xmm1, xmm2, 0x44          ; Join two pixels into one XMM register
-  psraw     xmm1, 6
-  packuswb  xmm1, xmm1
-  movq      QWORD [ARGBq], xmm1
-  add       ARGBq, 8
-
-.scaleend:
-  sub       WIDTHq, 2
-  jns       .scaleloop
-
-  and       WIDTHq, 1                 ; odd number of pixels?
-  jz        .scaledone
-
-  ; Read U V components.
-  mov       INDEXq, Xq
-  sar       INDEXq, 17
-  movzx     COMPd, BYTE [Uq + INDEXq]
-  movq      xmm0, [TABLEq + 2048 + 8 * COMPq]
-  movzx     COMPd, BYTE [Vq + INDEXq]
-  movq      xmm1, [TABLEq + 4096 + 8 * COMPq]
-  paddsw    xmm0, xmm1
-
-  ; Read one Y component.
-  mov       INDEXq, Xq
-  sar       INDEXq, 16
-  movzx     COMPd, BYTE [Yq + INDEXq]
-  movq      xmm1, [TABLEq + 8 * COMPq]
-  paddsw    xmm1, xmm0
-  psraw     xmm1, 6
-  packuswb  xmm1, xmm1
-  movd      DWORD [ARGBq], xmm1
-
-.scaledone:
-  POP       r12
-  POP       r11
-  POP       r10
-  RET
diff --git a/cobalt/media/base/simd/xcode_hack.c b/cobalt/media/base/simd/xcode_hack.c
deleted file mode 100644
index ee0b615..0000000
--- a/cobalt/media/base/simd/xcode_hack.c
+++ /dev/null
@@ -1,10 +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.
-
-// XCode doesn't want to link a pure assembly target and will fail
-// to link when it creates an empty file list.  So add a dummy file
-// keep the linker happy.  See http://crbug.com/157073
-int xcode_sucks() {
-  return 0;
-}
diff --git a/cobalt/media/base/starboard_player.cc b/cobalt/media/base/starboard_player.cc
index 47ad52b..1037e3f 100644
--- a/cobalt/media/base/starboard_player.cc
+++ b/cobalt/media/base/starboard_player.cc
@@ -14,6 +14,8 @@
 
 #include "cobalt/media/base/starboard_player.h"
 
+#include <algorithm>
+#include <iomanip>
 #include <string>
 #include <vector>
 
@@ -22,8 +24,10 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
+#include "cobalt/media/base/format_support_query_metrics.h"
 #include "cobalt/media/base/starboard_utils.h"
 #include "starboard/common/media.h"
+#include "starboard/common/string.h"
 #include "starboard/configuration.h"
 #include "starboard/memory.h"
 
@@ -117,9 +121,9 @@
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
     const GetDecodeTargetGraphicsContextProviderFunc&
         get_decode_target_graphics_context_provider_func,
-    const AudioDecoderConfig& audio_config,
-    const VideoDecoderConfig& video_config, SbWindow window,
-    SbDrmSystem drm_system, Host* host,
+    const AudioDecoderConfig& audio_config, const std::string& audio_mime_type,
+    const VideoDecoderConfig& video_config, const std::string& video_mime_type,
+    SbWindow window, SbDrmSystem drm_system, Host* host,
     SbPlayerSetBoundsHelper* set_bounds_helper, bool allow_resume_after_suspend,
     bool prefer_decode_to_texture,
     VideoFrameProvider* const video_frame_provider,
@@ -153,10 +157,10 @@
   video_sample_info_.codec = kSbMediaVideoCodecNone;
 
   if (audio_config.IsValidConfig()) {
-    UpdateAudioConfig(audio_config);
+    UpdateAudioConfig(audio_config, audio_mime_type);
   }
   if (video_config.IsValidConfig()) {
-    UpdateVideoConfig(video_config);
+    UpdateVideoConfig(video_config, video_mime_type);
   }
 
   output_mode_ = ComputeSbPlayerOutputMode(prefer_decode_to_texture);
@@ -185,8 +189,8 @@
   }
 }
 
-void StarboardPlayer::UpdateAudioConfig(
-    const AudioDecoderConfig& audio_config) {
+void StarboardPlayer::UpdateAudioConfig(const AudioDecoderConfig& audio_config,
+                                        const std::string& mime_type) {
   DCHECK(task_runner_->BelongsToCurrentThread());
   DCHECK(audio_config.IsValidConfig());
 
@@ -194,12 +198,14 @@
             << audio_config.AsHumanReadableString();
 
   audio_config_ = audio_config;
-  audio_sample_info_ = MediaAudioConfigToSbMediaAudioSampleInfo(audio_config_);
+  audio_mime_type_ = mime_type;
+  audio_sample_info_ = MediaAudioConfigToSbMediaAudioSampleInfo(
+      audio_config_, audio_mime_type_.c_str());
   LOG(INFO) << "Converted to SbMediaAudioSampleInfo -- " << audio_sample_info_;
 }
 
-void StarboardPlayer::UpdateVideoConfig(
-    const VideoDecoderConfig& video_config) {
+void StarboardPlayer::UpdateVideoConfig(const VideoDecoderConfig& video_config,
+                                        const std::string& mime_type) {
   DCHECK(task_runner_->BelongsToCurrentThread());
   DCHECK(video_config.IsValidConfig());
 
@@ -213,12 +219,11 @@
       static_cast<int>(video_config_.natural_size().height());
   video_sample_info_.codec =
       MediaVideoCodecToSbMediaVideoCodec(video_config_.codec());
-  video_sample_info_.color_metadata =
-      MediaToSbMediaColorMetadata(video_config_.webm_color_metadata());
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-  video_sample_info_.mime = video_config_.mime().c_str();
+  video_sample_info_.color_metadata = MediaToSbMediaColorMetadata(
+      video_config_.color_space_info(), video_config_.hdr_metadata());
+  video_mime_type_ = mime_type;
+  video_sample_info_.mime = video_mime_type_.c_str();
   video_sample_info_.max_video_capabilities = max_video_capabilities_.c_str();
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   LOG(INFO) << "Converted to SbMediaVideoSampleInfo -- " << video_sample_info_;
 }
 
@@ -242,7 +247,7 @@
   WriteBufferInternal(type, buffer);
 }
 
-void StarboardPlayer::SetBounds(int z_index, const math::Rect& rect) {
+void StarboardPlayer::SetBounds(int z_index, const gfx::Rect& rect) {
   base::AutoLock auto_lock(lock_);
 
   set_bounds_z_index_ = z_index;
@@ -518,6 +523,13 @@
 
   DCHECK(!on_encrypted_media_init_data_encountered_cb_.is_null());
   LOG(INFO) << "CreateUrlPlayer passed url " << url;
+
+  if (max_video_capabilities_.empty()) {
+    FormatSupportQueryMetrics::PrintAndResetFormatSupportQueryMetrics();
+  }
+
+  player_creation_time_ = SbTimeGetMonotonicNow();
+
   player_ =
       SbUrlPlayerCreate(url.c_str(), window_, &StarboardPlayer::PlayerStatusCB,
                         &StarboardPlayer::EncryptedMediaInitDataEncounteredCB,
@@ -556,7 +568,11 @@
 
   is_creating_player_ = true;
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+  if (max_video_capabilities_.empty()) {
+    FormatSupportQueryMetrics::PrintAndResetFormatSupportQueryMetrics();
+  }
+
+  player_creation_time_ = SbTimeGetMonotonicNow();
 
   SbPlayerCreationParam creation_param = {};
   creation_param.drm_system = drm_system_;
@@ -575,25 +591,6 @@
       &StarboardPlayer::PlayerErrorCB, this,
       get_decode_target_graphics_context_provider_func_.Run());
 
-#else  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-  DCHECK(SbPlayerOutputModeSupported(output_mode_, video_codec, drm_system_));
-  // TODO: This is temporary for supporting background media playback.
-  //       Need to be removed with media refactor.
-  if (!is_visible) {
-    DCHECK(audio_codec != kSbMediaAudioCodecNone);
-  }
-  player_ = SbPlayerCreate(
-      window_, video_codec, audio_codec, drm_system_,
-      has_audio ? &audio_sample_info_ : NULL,
-      max_video_capabilities_.length() > 0 ? max_video_capabilities_.c_str()
-                                           : NULL,
-      &StarboardPlayer::DeallocateSampleCB, &StarboardPlayer::DecoderStatusCB,
-      &StarboardPlayer::PlayerStatusCB, &StarboardPlayer::PlayerErrorCB, this,
-      output_mode_, get_decode_target_graphics_context_provider_func_.Run());
-
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
   is_creating_player_ = false;
 
   if (!SbPlayerIsValid(player_)) {
@@ -641,18 +638,22 @@
     return;
   }
 
-  const auto& allocations = buffer->allocations();
-  DCHECK_EQ(allocations.number_of_buffers(), 1);
-
-  DecodingBuffers::iterator iter =
-      decoding_buffers_.find(allocations.buffers()[0]);
+  DecodingBuffers::iterator iter = decoding_buffers_.find(buffer->data());
   if (iter == decoding_buffers_.end()) {
-    decoding_buffers_[allocations.buffers()[0]] = std::make_pair(buffer, 1);
+    decoding_buffers_[buffer->data()] = std::make_pair(buffer, 1);
   } else {
     ++iter->second.second;
   }
 
   auto sample_type = DemuxerStreamTypeToSbMediaType(type);
+
+  if (sample_type == kSbMediaTypeAudio && first_audio_sample_time_ == 0) {
+    first_audio_sample_time_ = SbTimeGetMonotonicNow();
+  } else if (sample_type == kSbMediaTypeVideo &&
+             first_video_sample_time_ == 0) {
+    first_video_sample_time_ = SbTimeGetMonotonicNow();
+  }
+
   SbDrmSampleInfo drm_info;
   SbDrmSubSampleMapping subsample_mapping;
   drm_info.subsample_count = 0;
@@ -665,8 +666,8 @@
   SbPlayerSampleSideData side_data = {};
   SbPlayerSampleInfo sample_info = {};
   sample_info.type = sample_type;
-  sample_info.buffer = allocations.buffers()[0];
-  sample_info.buffer_size = allocations.buffer_sizes()[0];
+  sample_info.buffer = buffer->data();
+  sample_info.buffer_size = buffer->data_size();
   sample_info.timestamp = buffer->timestamp().InMicroseconds();
 
   if (buffer->side_data_size() > 0) {
@@ -780,14 +781,6 @@
   switch (state) {
     case kSbPlayerDecoderStateNeedsData:
       break;
-#if SB_API_VERSION < 12
-    case kSbPlayerDecoderStateBufferFull:
-      LOG(WARNING) << "kSbPlayerDecoderStateBufferFull has been deprecated.";
-      return;
-    case kSbPlayerDecoderStateDestroyed:
-      LOG(WARNING) << "kSbPlayerDecoderStateDestroyed has been deprecated.";
-      return;
-#endif  // SB_API_VERSION < 12
   }
 
   if (state_ == kResuming) {
@@ -807,6 +800,8 @@
 
 void StarboardPlayer::OnPlayerStatus(SbPlayer player, SbPlayerState state,
                                      int ticket) {
+  TRACE_EVENT1("cobalt::media", "StarboardPlayer::OnPlayerStatus", "state",
+               state);
   DCHECK(task_runner_->BelongsToCurrentThread());
 
   if (player_ != player) {
@@ -823,11 +818,24 @@
     if (ticket_ == SB_PLAYER_INITIAL_TICKET) {
       ++ticket_;
     }
+    if (sb_player_state_initialized_time_ == 0) {
+      sb_player_state_initialized_time_ = SbTimeGetMonotonicNow();
+    }
     SbPlayerSeek2(player_, preroll_timestamp_.InMicroseconds(), ticket_);
     SetVolume(volume_);
     SbPlayerSetPlaybackRate(player_, playback_rate_);
     return;
   }
+  if (state == kSbPlayerStatePrerolling &&
+      sb_player_state_prerolling_time_ == 0) {
+    sb_player_state_prerolling_time_ = SbTimeGetMonotonicNow();
+  } else if (state == kSbPlayerStatePresenting &&
+             sb_player_state_presenting_time_ == 0) {
+    sb_player_state_presenting_time_ = SbTimeGetMonotonicNow();
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+    LogStartupLatency();
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
+  }
   host_->OnPlayerStatus(state);
 }
 
@@ -944,7 +952,6 @@
 // static
 SbPlayerOutputMode StarboardPlayer::ComputeSbPlayerOutputMode(
     bool prefer_decode_to_texture) const {
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   SbPlayerCreationParam creation_param = {};
   creation_param.drm_system = drm_system_;
   creation_param.audio_sample_info = audio_sample_info_;
@@ -960,28 +967,49 @@
   auto output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
   CHECK_NE(kSbPlayerOutputModeInvalid, output_mode);
   return output_mode;
-#else   // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-  SbMediaVideoCodec video_codec = kSbMediaVideoCodecNone;
+}
 
-  video_codec = video_sample_info_.codec;
+void StarboardPlayer::LogStartupLatency() const {
+  std::string first_events_str;
+  if (set_drm_system_ready_cb_time_ == -1) {
+    first_events_str =
+        starboard::FormatString("%-50s0 us", "SbPlayerCreate() called");
 
-  // Try to choose |kSbPlayerOutputModeDecodeToTexture| when
-  // |prefer_decode_to_texture| is true.
-  if (prefer_decode_to_texture) {
-    if (SbPlayerOutputModeSupported(kSbPlayerOutputModeDecodeToTexture,
-                                    video_codec, drm_system_)) {
-      return kSbPlayerOutputModeDecodeToTexture;
-    }
+  } else if (set_drm_system_ready_cb_time_ < player_creation_time_) {
+    first_events_str = starboard::FormatString(
+        "%-50s0 us\n%-50s%" PRId64 " us", "set_drm_system_ready_cb called",
+        "SbPlayerCreate() called",
+        player_creation_time_ - set_drm_system_ready_cb_time_);
+  } else {
+    first_events_str = starboard::FormatString(
+        "%-50s0 us\n%-50s%" PRId64 " us", "SbPlayerCreate() called",
+        "set_drm_system_ready_cb called",
+        set_drm_system_ready_cb_time_ - player_creation_time_);
   }
 
-  if (SbPlayerOutputModeSupported(kSbPlayerOutputModePunchOut, video_codec,
-                                  drm_system_)) {
-    return kSbPlayerOutputModePunchOut;
-  }
-  CHECK(SbPlayerOutputModeSupported(kSbPlayerOutputModeDecodeToTexture,
-                                    video_codec, drm_system_));
-  return kSbPlayerOutputModeDecodeToTexture;
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+  SbTime player_initialization_time_delta =
+      sb_player_state_initialized_time_ -
+      std::max(player_creation_time_, set_drm_system_ready_cb_time_);
+  SbTime player_preroll_time_delta =
+      sb_player_state_prerolling_time_ - sb_player_state_initialized_time_;
+  SbTime first_audio_sample_time_delta = std::max(
+      first_audio_sample_time_ - sb_player_state_prerolling_time_, SbTime(0));
+  SbTime first_video_sample_time_delta = std::max(
+      first_video_sample_time_ - sb_player_state_prerolling_time_, SbTime(0));
+  SbTime player_presenting_time_delta =
+      sb_player_state_presenting_time_ -
+      std::max(first_audio_sample_time_, first_video_sample_time_);
+
+  LOG(INFO) << starboard::FormatString(
+      "SbPlayer startup latencies\n%-50s%s\n%s\n%-50s%" PRId64
+      " us\n%-50s%" PRId64 " us\n%-50s%" PRId64 "/%" PRId64 " us\n%-50s%" PRId64
+      " us",
+      "Event name", "time since last event", first_events_str.c_str(),
+      "kSbPlayerStateInitialized received", player_initialization_time_delta,
+      "kSbPlayerStatePrerolling received", player_preroll_time_delta,
+      "First media sample(s) written [audio/video]",
+      first_audio_sample_time_delta, first_video_sample_time_delta,
+      "kSbPlayerStatePresenting received", player_presenting_time_delta);
 }
 
 }  // namespace media
diff --git a/cobalt/media/base/starboard_player.h b/cobalt/media/base/starboard_player.h
index 6e40ac4..a71ec3b 100644
--- a/cobalt/media/base/starboard_player.h
+++ b/cobalt/media/base/starboard_player.h
@@ -23,15 +23,16 @@
 #include "base/message_loop/message_loop.h"
 #include "base/synchronization/lock.h"
 #include "base/time/time.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/decoder_buffer.h"
 #include "cobalt/media/base/decoder_buffer_cache.h"
-#include "cobalt/media/base/demuxer_stream.h"
 #include "cobalt/media/base/sbplayer_set_bounds_helper.h"
-#include "cobalt/media/base/video_decoder_config.h"
 #include "cobalt/media/base/video_frame_provider.h"
 #include "starboard/media.h"
 #include "starboard/player.h"
+#include "third_party/chromium/media/base/audio_decoder_config.h"
+#include "third_party/chromium/media/base/decoder_buffer.h"
+#include "third_party/chromium/media/base/demuxer_stream.h"
+#include "third_party/chromium/media/base/video_decoder_config.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/rect.h"
 
 #if SB_HAS(PLAYER_WITH_URL)
 #include SB_URL_PLAYER_INCLUDE_PATH
@@ -42,6 +43,11 @@
 
 // TODO: Add switch to disable caching
 class StarboardPlayer {
+  typedef ::media::AudioDecoderConfig AudioDecoderConfig;
+  typedef ::media::DecoderBuffer DecoderBuffer;
+  typedef ::media::DemuxerStream DemuxerStream;
+  typedef ::media::VideoDecoderConfig VideoDecoderConfig;
+
  public:
   class Host {
    public:
@@ -77,7 +83,9 @@
       const GetDecodeTargetGraphicsContextProviderFunc&
           get_decode_target_graphics_context_provider_func,
       const AudioDecoderConfig& audio_config,
-      const VideoDecoderConfig& video_config, SbWindow window,
+      const std::string& audio_mime_type,
+      const VideoDecoderConfig& video_config,
+      const std::string& video_mime_type, SbWindow window,
       SbDrmSystem drm_system, Host* host,
       SbPlayerSetBoundsHelper* set_bounds_helper,
       bool allow_resume_after_suspend, bool prefer_decode_to_texture,
@@ -88,13 +96,15 @@
 
   bool IsValid() const { return SbPlayerIsValid(player_); }
 
-  void UpdateAudioConfig(const AudioDecoderConfig& audio_config);
-  void UpdateVideoConfig(const VideoDecoderConfig& video_config);
+  void UpdateAudioConfig(const AudioDecoderConfig& audio_config,
+                         const std::string& mime_type);
+  void UpdateVideoConfig(const VideoDecoderConfig& video_config,
+                         const std::string& mime_type);
 
   void WriteBuffer(DemuxerStream::Type type,
                    const scoped_refptr<DecoderBuffer>& buffer);
 
-  void SetBounds(int z_index, const math::Rect& rect);
+  void SetBounds(int z_index, const gfx::Rect& rect);
 
   void PrepareForSeek();
   void Seek(base::TimeDelta time);
@@ -130,6 +140,10 @@
   SbDecodeTarget GetCurrentSbDecodeTarget();
   SbPlayerOutputMode GetSbPlayerOutputMode();
 
+  void RecordSetDrmSystemReadyTime(SbTimeMonotonic timestamp) {
+    set_drm_system_ready_cb_time_ = timestamp;
+  }
+
  private:
   enum State {
     kPlaying,
@@ -165,7 +179,7 @@
   // DecoderBuffer and a reference count.  The reference count indicates how
   // many instances of the DecoderBuffer is currently being decoded in the
   // pipeline.
-  typedef std::map<const void*, std::pair<scoped_refptr<DecoderBuffer>, int> >
+  typedef std::map<const void*, std::pair<scoped_refptr<DecoderBuffer>, int>>
       DecodingBuffers;
 
 #if SB_HAS(PLAYER_WITH_URL)
@@ -216,6 +230,8 @@
   SbPlayerOutputMode ComputeSbPlayerOutputMode(
       bool prefer_decode_to_texture) const;
 
+  void LogStartupLatency() const;
+
 // The following variables are initialized in the ctor and never changed.
 #if SB_HAS(PLAYER_WITH_URL)
   std::string url_;
@@ -250,7 +266,7 @@
 
   // Stores the |z_index| and |rect| parameters of the latest SetBounds() call.
   base::Optional<int> set_bounds_z_index_;
-  base::Optional<math::Rect> set_bounds_rect_;
+  base::Optional<gfx::Rect> set_bounds_rect_;
   State state_ = kPlaying;
   SbPlayer player_;
   uint32 cached_video_frames_decoded_;
@@ -262,6 +278,10 @@
 
   VideoFrameProvider* const video_frame_provider_;
 
+  // Keep copies of the mime type strings instead of using the ones in the
+  // DemuxerStreams to ensure that the strings are always valid.
+  std::string audio_mime_type_;
+  std::string video_mime_type_;
   // A string of video maximum capabilities.
   std::string max_video_capabilities_;
 
@@ -269,6 +289,15 @@
   bool is_creating_player_ = false;
   std::string player_creation_error_message_;
 
+  // Variables related to tracking player startup latencies.
+  SbTimeMonotonic set_drm_system_ready_cb_time_ = -1;
+  SbTimeMonotonic player_creation_time_ = 0;
+  SbTimeMonotonic sb_player_state_initialized_time_ = 0;
+  SbTimeMonotonic sb_player_state_prerolling_time_ = 0;
+  SbTimeMonotonic first_audio_sample_time_ = 0;
+  SbTimeMonotonic first_video_sample_time_ = 0;
+  SbTimeMonotonic sb_player_state_presenting_time_ = 0;
+
 #if SB_HAS(PLAYER_WITH_URL)
   const bool is_url_based_;
 #endif  // SB_HAS(PLAYER_WITH_URL)
diff --git a/cobalt/media/base/starboard_utils.cc b/cobalt/media/base/starboard_utils.cc
index d875717..fe7e27d 100644
--- a/cobalt/media/base/starboard_utils.cc
+++ b/cobalt/media/base/starboard_utils.cc
@@ -17,45 +17,48 @@
 #include <algorithm>
 
 #include "base/logging.h"
-#include "cobalt/media/base/decrypt_config.h"
 #include "starboard/configuration.h"
 #include "starboard/memory.h"
+#include "third_party/chromium/media/base/decrypt_config.h"
 
 using base::Time;
 using base::TimeDelta;
 
 namespace cobalt {
 namespace media {
+namespace {
+
+using ::media::AudioCodec;
+using ::media::VideoCodec;
+using ::media::VideoColorSpace;
+
+}  // namespace
 
 SbMediaAudioCodec MediaAudioCodecToSbMediaAudioCodec(AudioCodec codec) {
   switch (codec) {
-    case kCodecAAC:
+    case AudioCodec::kAAC:
       return kSbMediaAudioCodecAac;
-#if SB_API_VERSION >= 12 || SB_HAS(AC3_AUDIO)
-    case kCodecAC3:
+    case AudioCodec::kAC3:
       if (!kSbHasAc3Audio) {
         DLOG(ERROR) << "Audio codec AC3 not enabled on this platform. To "
                     << "enable it, set kSbHasAc3Audio to |true|.";
         return kSbMediaAudioCodecNone;
       }
       return kSbMediaAudioCodecAc3;
-    case kCodecEAC3:
+    case AudioCodec::kEAC3:
       if (!kSbHasAc3Audio) {
         DLOG(ERROR) << "Audio codec AC3 not enabled on this platform. To "
                     << "enable it, set kSbHasAc3Audio to |true|.";
         return kSbMediaAudioCodecNone;
       }
       return kSbMediaAudioCodecEac3;
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(AC3_AUDIO)
-    case kCodecVorbis:
+    case AudioCodec::kVorbis:
       return kSbMediaAudioCodecVorbis;
-    case kCodecOpus:
+    case AudioCodec::kOpus:
       return kSbMediaAudioCodecOpus;
     default:
       // Cobalt only supports a subset of audio codecs defined by Chromium.
-      DLOG(ERROR) << "Unsupported audio codec "
-                  << cobalt::media::GetCodecName(codec);
+      DLOG(ERROR) << "Unsupported audio codec " << ::media::GetCodecName(codec);
       return kSbMediaAudioCodecNone;
   }
   NOTREACHED();
@@ -64,26 +67,25 @@
 
 SbMediaVideoCodec MediaVideoCodecToSbMediaVideoCodec(VideoCodec codec) {
   switch (codec) {
-    case kCodecH264:
+    case VideoCodec::kH264:
       return kSbMediaVideoCodecH264;
-    case kCodecVC1:
+    case VideoCodec::kVC1:
       return kSbMediaVideoCodecVc1;
-    case kCodecMPEG2:
+    case VideoCodec::kMPEG2:
       return kSbMediaVideoCodecMpeg2;
-    case kCodecTheora:
+    case VideoCodec::kTheora:
       return kSbMediaVideoCodecTheora;
-    case kCodecVP8:
+    case VideoCodec::kVP8:
       return kSbMediaVideoCodecVp8;
-    case kCodecVP9:
+    case VideoCodec::kVP9:
       return kSbMediaVideoCodecVp9;
-    case kCodecHEVC:
+    case VideoCodec::kHEVC:
       return kSbMediaVideoCodecH265;
-    case kCodecAV1:
+    case VideoCodec::kAV1:
       return kSbMediaVideoCodecAv1;
     default:
       // Cobalt only supports a subset of video codecs defined by Chromium.
-      DLOG(ERROR) << "Unsupported video codec "
-                  << cobalt::media::GetCodecName(codec);
+      DLOG(ERROR) << "Unsupported video codec " << ::media::GetCodecName(codec);
       return kSbMediaVideoCodecNone;
   }
   NOTREACHED();
@@ -91,18 +93,15 @@
 }
 
 SbMediaAudioSampleInfo MediaAudioConfigToSbMediaAudioSampleInfo(
-    const AudioDecoderConfig& audio_decoder_config) {
+    const ::media::AudioDecoderConfig& audio_decoder_config,
+    const char* mime_type) {
   DCHECK(audio_decoder_config.IsValidConfig());
 
   SbMediaAudioSampleInfo audio_sample_info;
 
   audio_sample_info.codec =
       MediaAudioCodecToSbMediaAudioCodec(audio_decoder_config.codec());
-
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-  audio_sample_info.mime = audio_decoder_config.mime().c_str();
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
+  audio_sample_info.mime = mime_type;
   // TODO: Make this work with non AAC audio.
   audio_sample_info.format_tag = 0x00ff;
   audio_sample_info.number_of_channels =
@@ -113,58 +112,54 @@
   audio_sample_info.block_alignment = 4;
   audio_sample_info.bits_per_sample = audio_decoder_config.bits_per_channel();
 
+  const auto& extra_data = audio_sample_info.codec == kSbMediaAudioCodecAac
+                               ? audio_decoder_config.aac_extra_data()
+                               : audio_decoder_config.extra_data();
   audio_sample_info.audio_specific_config_size =
-      static_cast<uint16_t>(audio_decoder_config.extra_data().size());
+      static_cast<uint16_t>(extra_data.size());
   if (audio_sample_info.audio_specific_config_size == 0) {
     audio_sample_info.audio_specific_config = NULL;
   } else {
-    audio_sample_info.audio_specific_config =
-        &audio_decoder_config.extra_data()[0];
+    audio_sample_info.audio_specific_config = extra_data.data();
   }
 
   return audio_sample_info;
 }
 
-DemuxerStream::Type SbMediaTypeToDemuxerStreamType(SbMediaType type) {
+::media::DemuxerStream::Type SbMediaTypeToDemuxerStreamType(SbMediaType type) {
   if (type == kSbMediaTypeAudio) {
-    return DemuxerStream::AUDIO;
+    return ::media::DemuxerStream::AUDIO;
   }
   DCHECK_EQ(type, kSbMediaTypeVideo);
-  return DemuxerStream::VIDEO;
+  return ::media::DemuxerStream::VIDEO;
 }
 
-SbMediaType DemuxerStreamTypeToSbMediaType(DemuxerStream::Type type) {
-  if (type == DemuxerStream::AUDIO) {
+SbMediaType DemuxerStreamTypeToSbMediaType(::media::DemuxerStream::Type type) {
+  if (type == ::media::DemuxerStream::AUDIO) {
     return kSbMediaTypeAudio;
   }
-  DCHECK_EQ(type, DemuxerStream::VIDEO);
+  DCHECK_EQ(type, ::media::DemuxerStream::VIDEO);
   return kSbMediaTypeVideo;
 }
 
-void FillDrmSampleInfo(const scoped_refptr<DecoderBuffer>& buffer,
+void FillDrmSampleInfo(const scoped_refptr<::media::DecoderBuffer>& buffer,
                        SbDrmSampleInfo* drm_info,
                        SbDrmSubSampleMapping* subsample_mapping) {
   DCHECK(drm_info);
   DCHECK(subsample_mapping);
 
-  const DecryptConfig* config = buffer->decrypt_config();
+  const ::media::DecryptConfig* config = buffer->decrypt_config();
 
-#if SB_API_VERSION >= 12
-  if (config->encryption_mode() == EncryptionMode::kCenc) {
+  if (config->encryption_scheme() == ::media::EncryptionScheme::kCenc) {
     drm_info->encryption_scheme = kSbDrmEncryptionSchemeAesCtr;
   } else {
-    DCHECK_EQ(config->encryption_mode(), EncryptionMode::kCbcs);
+    DCHECK_EQ(config->encryption_scheme(), ::media::EncryptionScheme::kCbcs);
     drm_info->encryption_scheme = kSbDrmEncryptionSchemeAesCbc;
   }
-#else   // SB_API_VERSION >= 12
-  DCHECK_EQ(config->encryption_mode(), EncryptionMode::kCenc);
-#endif  // SB_API_VERSION >= 12
 
-// Set content of |drm_info| to default or invalid values.
-#if SB_API_VERSION >= 12
+  // Set content of |drm_info| to default or invalid values.
   drm_info->encryption_pattern.crypt_byte_block = 0;
   drm_info->encryption_pattern.skip_byte_block = 0;
-#endif  // SB_API_VERSION >= 12
   drm_info->initialization_vector_size = 0;
   drm_info->identifier_size = 0;
   drm_info->subsample_count = 0;
@@ -183,16 +178,16 @@
   }
 
   memcpy(drm_info->initialization_vector, &config->iv()[0],
-               config->iv().size());
+         config->iv().size());
   drm_info->initialization_vector_size = config->iv().size();
-  memcpy(drm_info->identifier, &config->key_id()[0],
-               config->key_id().size());
+  memcpy(drm_info->identifier, &config->key_id()[0], config->key_id().size());
   drm_info->identifier_size = config->key_id().size();
   drm_info->subsample_count = config->subsamples().size();
 
   if (drm_info->subsample_count > 0) {
-    COMPILE_ASSERT(sizeof(SbDrmSubSampleMapping) == sizeof(SubsampleEntry),
-                   SubSampleEntrySizesMatch);
+    COMPILE_ASSERT(
+        sizeof(SbDrmSubSampleMapping) == sizeof(::media::SubsampleEntry),
+        SubSampleEntrySizesMatch);
     drm_info->subsample_mapping =
         reinterpret_cast<const SbDrmSubSampleMapping*>(
             &config->subsamples()[0]);
@@ -203,169 +198,165 @@
     subsample_mapping->encrypted_byte_count = buffer->data_size();
   }
 
-#if SB_API_VERSION >= 12
   if (buffer->decrypt_config()->HasPattern()) {
     drm_info->encryption_pattern.crypt_byte_block =
         config->encryption_pattern()->crypt_byte_block();
     drm_info->encryption_pattern.skip_byte_block =
         config->encryption_pattern()->skip_byte_block();
   }
-#else   // SB_API_VERSION >= 12
-  if (buffer->decrypt_config()->HasPattern()) {
-    DCHECK_EQ(config->encryption_pattern()->crypt_byte_block(), 0);
-    DCHECK_EQ(config->encryption_pattern()->skip_byte_block(), 0);
-  }
-#endif  // SB_API_VERSION >= 12
 }
 
-// Ensure that the enums in starboard/media.h match enums in gfx::ColorSpace.
+// Ensure that the enums in starboard/media.h match enums in
+// ::media::VideoColorSpace and gfx::ColorSpace.
 #define ENUM_EQ(a, b) \
   COMPILE_ASSERT(static_cast<int>(a) == static_cast<int>(b), mismatching_enums)
 
 // Ensure PrimaryId enums convert correctly.
-ENUM_EQ(kSbMediaPrimaryIdReserved0, gfx::ColorSpace::kPrimaryIdReserved0);
-ENUM_EQ(kSbMediaPrimaryIdBt709, gfx::ColorSpace::kPrimaryIdBt709);
-ENUM_EQ(kSbMediaPrimaryIdUnspecified, gfx::ColorSpace::kPrimaryIdUnspecified);
-ENUM_EQ(kSbMediaPrimaryIdReserved, gfx::ColorSpace::kPrimaryIdReserved);
-ENUM_EQ(kSbMediaPrimaryIdBt470M, gfx::ColorSpace::kPrimaryIdBt470M);
-ENUM_EQ(kSbMediaPrimaryIdBt470Bg, gfx::ColorSpace::kPrimaryIdBt470Bg);
-ENUM_EQ(kSbMediaPrimaryIdSmpte170M, gfx::ColorSpace::kPrimaryIdSmpte170M);
-ENUM_EQ(kSbMediaPrimaryIdSmpte240M, gfx::ColorSpace::kPrimaryIdSmpte240M);
-ENUM_EQ(kSbMediaPrimaryIdFilm, gfx::ColorSpace::kPrimaryIdFilm);
-ENUM_EQ(kSbMediaPrimaryIdBt2020, gfx::ColorSpace::kPrimaryIdBt2020);
-ENUM_EQ(kSbMediaPrimaryIdSmpteSt4281, gfx::ColorSpace::kPrimaryIdSmpteSt4281);
-ENUM_EQ(kSbMediaPrimaryIdSmpteSt4312, gfx::ColorSpace::kPrimaryIdSmpteSt4312);
-ENUM_EQ(kSbMediaPrimaryIdSmpteSt4321, gfx::ColorSpace::kPrimaryIdSmpteSt4321);
-ENUM_EQ(kSbMediaPrimaryIdLastStandardValue,
-        gfx::ColorSpace::kPrimaryIdLastStandardValue);
-ENUM_EQ(kSbMediaPrimaryIdUnknown, gfx::ColorSpace::kPrimaryIdUnknown);
-ENUM_EQ(kSbMediaPrimaryIdXyzD50, gfx::ColorSpace::kPrimaryIdXyzD50);
-ENUM_EQ(kSbMediaPrimaryIdCustom, gfx::ColorSpace::kPrimaryIdCustom);
-ENUM_EQ(kSbMediaPrimaryIdLast, gfx::ColorSpace::kPrimaryIdLast);
+ENUM_EQ(kSbMediaPrimaryIdReserved0, VideoColorSpace::PrimaryID::INVALID);
+ENUM_EQ(kSbMediaPrimaryIdBt709, VideoColorSpace::PrimaryID::BT709);
+ENUM_EQ(kSbMediaPrimaryIdUnspecified, VideoColorSpace::PrimaryID::UNSPECIFIED);
+ENUM_EQ(kSbMediaPrimaryIdBt470M, VideoColorSpace::PrimaryID::BT470M);
+ENUM_EQ(kSbMediaPrimaryIdBt470Bg, VideoColorSpace::PrimaryID::BT470BG);
+ENUM_EQ(kSbMediaPrimaryIdSmpte170M, VideoColorSpace::PrimaryID::SMPTE170M);
+ENUM_EQ(kSbMediaPrimaryIdSmpte240M, VideoColorSpace::PrimaryID::SMPTE240M);
+ENUM_EQ(kSbMediaPrimaryIdFilm, VideoColorSpace::PrimaryID::FILM);
+ENUM_EQ(kSbMediaPrimaryIdBt2020, VideoColorSpace::PrimaryID::BT2020);
+ENUM_EQ(kSbMediaPrimaryIdSmpteSt4281, VideoColorSpace::PrimaryID::SMPTEST428_1);
+ENUM_EQ(kSbMediaPrimaryIdSmpteSt4312, VideoColorSpace::PrimaryID::SMPTEST431_2);
+ENUM_EQ(kSbMediaPrimaryIdSmpteSt4321, VideoColorSpace::PrimaryID::SMPTEST432_1);
 
 // Ensure TransferId enums convert correctly.
-ENUM_EQ(kSbMediaTransferIdReserved0, gfx::ColorSpace::kTransferIdReserved0);
-ENUM_EQ(kSbMediaTransferIdBt709, gfx::ColorSpace::kTransferIdBt709);
-ENUM_EQ(kSbMediaTransferIdUnspecified, gfx::ColorSpace::kTransferIdUnspecified);
-ENUM_EQ(kSbMediaTransferIdReserved, gfx::ColorSpace::kTransferIdReserved);
-ENUM_EQ(kSbMediaTransferIdGamma22, gfx::ColorSpace::kTransferIdGamma22);
-ENUM_EQ(kSbMediaTransferIdGamma28, gfx::ColorSpace::kTransferIdGamma28);
-ENUM_EQ(kSbMediaTransferIdSmpte170M, gfx::ColorSpace::kTransferIdSmpte170M);
-ENUM_EQ(kSbMediaTransferIdSmpte240M, gfx::ColorSpace::kTransferIdSmpte240M);
-ENUM_EQ(kSbMediaTransferIdLinear, gfx::ColorSpace::kTransferIdLinear);
-ENUM_EQ(kSbMediaTransferIdLog, gfx::ColorSpace::kTransferIdLog);
-ENUM_EQ(kSbMediaTransferIdLogSqrt, gfx::ColorSpace::kTransferIdLogSqrt);
-ENUM_EQ(kSbMediaTransferIdIec6196624, gfx::ColorSpace::kTransferIdIec6196624);
-ENUM_EQ(kSbMediaTransferIdBt1361Ecg, gfx::ColorSpace::kTransferIdBt1361Ecg);
-ENUM_EQ(kSbMediaTransferIdIec6196621, gfx::ColorSpace::kTransferIdIec6196621);
-ENUM_EQ(kSbMediaTransferId10BitBt2020, gfx::ColorSpace::kTransferId10BitBt2020);
-ENUM_EQ(kSbMediaTransferId12BitBt2020, gfx::ColorSpace::kTransferId12BitBt2020);
-ENUM_EQ(kSbMediaTransferIdSmpteSt2084, gfx::ColorSpace::kTransferIdSmpteSt2084);
-ENUM_EQ(kSbMediaTransferIdSmpteSt4281, gfx::ColorSpace::kTransferIdSmpteSt4281);
-ENUM_EQ(kSbMediaTransferIdAribStdB67, gfx::ColorSpace::kTransferIdAribStdB67);
-ENUM_EQ(kSbMediaTransferIdLastStandardValue,
-        gfx::ColorSpace::kTransferIdLastStandardValue);
-ENUM_EQ(kSbMediaTransferIdUnknown, gfx::ColorSpace::kTransferIdUnknown);
-ENUM_EQ(kSbMediaTransferIdGamma24, gfx::ColorSpace::kTransferIdGamma24);
-ENUM_EQ(kSbMediaTransferIdSmpteSt2084NonHdr,
-        gfx::ColorSpace::kTransferIdSmpteSt2084NonHdr);
-ENUM_EQ(kSbMediaTransferIdCustom, gfx::ColorSpace::kTransferIdCustom);
-ENUM_EQ(kSbMediaTransferIdLast, gfx::ColorSpace::kTransferIdLast);
+ENUM_EQ(kSbMediaTransferIdReserved0, VideoColorSpace::TransferID::INVALID);
+ENUM_EQ(kSbMediaTransferIdBt709, VideoColorSpace::TransferID::BT709);
+ENUM_EQ(kSbMediaTransferIdUnspecified,
+        VideoColorSpace::TransferID::UNSPECIFIED);
+ENUM_EQ(kSbMediaTransferIdGamma22, VideoColorSpace::TransferID::GAMMA22);
+ENUM_EQ(kSbMediaTransferIdGamma28, VideoColorSpace::TransferID::GAMMA28);
+ENUM_EQ(kSbMediaTransferIdSmpte170M, VideoColorSpace::TransferID::SMPTE170M);
+ENUM_EQ(kSbMediaTransferIdSmpte240M, VideoColorSpace::TransferID::SMPTE240M);
+ENUM_EQ(kSbMediaTransferIdLinear, VideoColorSpace::TransferID::LINEAR);
+ENUM_EQ(kSbMediaTransferIdLog, VideoColorSpace::TransferID::LOG);
+ENUM_EQ(kSbMediaTransferIdLogSqrt, VideoColorSpace::TransferID::LOG_SQRT);
+ENUM_EQ(kSbMediaTransferIdIec6196624,
+        VideoColorSpace::TransferID::IEC61966_2_4);
+ENUM_EQ(kSbMediaTransferIdBt1361Ecg, VideoColorSpace::TransferID::BT1361_ECG);
+ENUM_EQ(kSbMediaTransferIdIec6196621,
+        VideoColorSpace::TransferID::IEC61966_2_1);
+ENUM_EQ(kSbMediaTransferId10BitBt2020, VideoColorSpace::TransferID::BT2020_10);
+ENUM_EQ(kSbMediaTransferId12BitBt2020, VideoColorSpace::TransferID::BT2020_12);
+ENUM_EQ(kSbMediaTransferIdSmpteSt2084,
+        VideoColorSpace::TransferID::SMPTEST2084);
+ENUM_EQ(kSbMediaTransferIdSmpteSt4281,
+        VideoColorSpace::TransferID::SMPTEST428_1);
+ENUM_EQ(kSbMediaTransferIdAribStdB67,
+        VideoColorSpace::TransferID::ARIB_STD_B67);
 
 // Ensure MatrixId enums convert correctly.
-ENUM_EQ(kSbMediaMatrixIdRgb, gfx::ColorSpace::kMatrixIdRgb);
-ENUM_EQ(kSbMediaMatrixIdBt709, gfx::ColorSpace::kMatrixIdBt709);
-ENUM_EQ(kSbMediaMatrixIdUnspecified, gfx::ColorSpace::kMatrixIdUnspecified);
-ENUM_EQ(kSbMediaMatrixIdReserved, gfx::ColorSpace::kMatrixIdReserved);
-ENUM_EQ(kSbMediaMatrixIdFcc, gfx::ColorSpace::kMatrixIdFcc);
-ENUM_EQ(kSbMediaMatrixIdBt470Bg, gfx::ColorSpace::kMatrixIdBt470Bg);
-ENUM_EQ(kSbMediaMatrixIdSmpte170M, gfx::ColorSpace::kMatrixIdSmpte170M);
-ENUM_EQ(kSbMediaMatrixIdSmpte240M, gfx::ColorSpace::kMatrixIdSmpte240M);
-ENUM_EQ(kSbMediaMatrixIdYCgCo, gfx::ColorSpace::kMatrixIdYCgCo);
+ENUM_EQ(kSbMediaMatrixIdRgb, VideoColorSpace::MatrixID::RGB);
+ENUM_EQ(kSbMediaMatrixIdBt709, VideoColorSpace::MatrixID::BT709);
+ENUM_EQ(kSbMediaMatrixIdUnspecified, VideoColorSpace::MatrixID::UNSPECIFIED);
+ENUM_EQ(kSbMediaMatrixIdFcc, VideoColorSpace::MatrixID::FCC);
+ENUM_EQ(kSbMediaMatrixIdBt470Bg, VideoColorSpace::MatrixID::BT470BG);
+ENUM_EQ(kSbMediaMatrixIdSmpte170M, VideoColorSpace::MatrixID::SMPTE170M);
+ENUM_EQ(kSbMediaMatrixIdSmpte240M, VideoColorSpace::MatrixID::SMPTE240M);
+ENUM_EQ(kSbMediaMatrixIdYCgCo, VideoColorSpace::MatrixID::YCOCG);
 ENUM_EQ(kSbMediaMatrixIdBt2020NonconstantLuminance,
-        gfx::ColorSpace::kMatrixIdBt2020NonconstantLuminance);
+        VideoColorSpace::MatrixID::BT2020_NCL);
 ENUM_EQ(kSbMediaMatrixIdBt2020ConstantLuminance,
-        gfx::ColorSpace::kMatrixIdBt2020ConstantLuminance);
-ENUM_EQ(kSbMediaMatrixIdYDzDx, gfx::ColorSpace::kMatrixIdYDzDx);
-ENUM_EQ(kSbMediaMatrixIdLastStandardValue,
-        gfx::ColorSpace::kMatrixIdLastStandardValue);
-ENUM_EQ(kSbMediaMatrixIdUnknown, gfx::ColorSpace::kMatrixIdUnknown);
-ENUM_EQ(kSbMediaMatrixIdLast, gfx::ColorSpace::kMatrixIdLast);
+        VideoColorSpace::MatrixID::BT2020_CL);
+ENUM_EQ(kSbMediaMatrixIdYDzDx, VideoColorSpace::MatrixID::YDZDX);
+// TODO(b/230891177): Add `kSbMediaMatrixIdInvalid` to SbMediaMatrixId and set
+// it to 255 and uncomment and refine the section for `kSbMediaMatrixIdInvalid`
+// in MediaToSbMediaColorMetadata().
+// #if SB_API_VERSION >= SB_MEDIA_MATRIX_ID_INVALID_API_VERSION
+//   ENUM_EQ(kSbMediaMatrixIdInvalid,
+//           VideoColorSpace::MatrixID::INVALID);
+// #endif  // SB_API_VERSION >=  SB_MEDIA_MATRIX_ID_INVALID_API_VERSION
 
 // Ensure RangeId enums convert correctly.
-ENUM_EQ(kSbMediaRangeIdUnspecified, gfx::ColorSpace::kRangeIdUnspecified);
-ENUM_EQ(kSbMediaRangeIdLimited, gfx::ColorSpace::kRangeIdLimited);
-ENUM_EQ(kSbMediaRangeIdFull, gfx::ColorSpace::kRangeIdFull);
-ENUM_EQ(kSbMediaRangeIdDerived, gfx::ColorSpace::kRangeIdDerived);
-ENUM_EQ(kSbMediaRangeIdLast, gfx::ColorSpace::kRangeIdLast);
+ENUM_EQ(kSbMediaRangeIdUnspecified, gfx::ColorSpace::RangeID::INVALID);
+ENUM_EQ(kSbMediaRangeIdLimited, gfx::ColorSpace::RangeID::LIMITED);
+ENUM_EQ(kSbMediaRangeIdFull, gfx::ColorSpace::RangeID::FULL);
+ENUM_EQ(kSbMediaRangeIdDerived, gfx::ColorSpace::RangeID::DERIVED);
 
 SbMediaColorMetadata MediaToSbMediaColorMetadata(
-    const WebMColorMetadata& webm_color_metadata) {
-  SbMediaColorMetadata sb_media_color_metadata;
+    const VideoColorSpace& color_space,
+    const absl::optional<gfx::HDRMetadata>& hdr_metadata) {
+  SbMediaColorMetadata sb_media_color_metadata = {};
 
   // Copy the other color metadata below.
-  sb_media_color_metadata.bits_per_channel = webm_color_metadata.BitsPerChannel;
-  sb_media_color_metadata.chroma_subsampling_horizontal =
-      webm_color_metadata.ChromaSubsamplingHorz;
-  sb_media_color_metadata.chroma_subsampling_vertical =
-      webm_color_metadata.ChromaSubsamplingVert;
-  sb_media_color_metadata.cb_subsampling_horizontal =
-      webm_color_metadata.CbSubsamplingHorz;
-  sb_media_color_metadata.cb_subsampling_vertical =
-      webm_color_metadata.CbSubsamplingVert;
-  sb_media_color_metadata.chroma_siting_horizontal =
-      webm_color_metadata.ChromaSitingHorz;
-  sb_media_color_metadata.chroma_siting_vertical =
-      webm_color_metadata.ChromaSitingVert;
+  // TODO(b/230915942): Revisit to ensure that the metadata is valid and
+  // consider deprecate them from `SbMediaColorMetadata`.
+  sb_media_color_metadata.bits_per_channel = 0;
+  sb_media_color_metadata.chroma_subsampling_horizontal = 0;
+  sb_media_color_metadata.chroma_subsampling_vertical = 0;
+  sb_media_color_metadata.cb_subsampling_horizontal = 0;
+  sb_media_color_metadata.cb_subsampling_vertical = 0;
+  sb_media_color_metadata.chroma_siting_horizontal = 0;
+  sb_media_color_metadata.chroma_siting_vertical = 0;
 
   // Copy the HDR Metadata below.
-  SbMediaMasteringMetadata sb_media_mastering_metadata;
-  HDRMetadata hdr_metadata = webm_color_metadata.hdr_metadata;
-  MasteringMetadata mastering_metadata = hdr_metadata.mastering_metadata;
+  SbMediaMasteringMetadata sb_media_mastering_metadata = {};
 
-  sb_media_mastering_metadata.primary_r_chromaticity_x =
-      mastering_metadata.primary_r_chromaticity_x;
-  sb_media_mastering_metadata.primary_r_chromaticity_y =
-      mastering_metadata.primary_r_chromaticity_y;
+  if (hdr_metadata) {
+    const auto& color_volume_metadata = hdr_metadata->color_volume_metadata;
 
-  sb_media_mastering_metadata.primary_g_chromaticity_x =
-      mastering_metadata.primary_g_chromaticity_x;
-  sb_media_mastering_metadata.primary_g_chromaticity_y =
-      mastering_metadata.primary_g_chromaticity_y;
+    sb_media_mastering_metadata.primary_r_chromaticity_x =
+        color_volume_metadata.primary_r.x();
+    sb_media_mastering_metadata.primary_r_chromaticity_y =
+        color_volume_metadata.primary_r.y();
 
-  sb_media_mastering_metadata.primary_b_chromaticity_x =
-      mastering_metadata.primary_b_chromaticity_x;
-  sb_media_mastering_metadata.primary_b_chromaticity_y =
-      mastering_metadata.primary_b_chromaticity_y;
+    sb_media_mastering_metadata.primary_g_chromaticity_x =
+        color_volume_metadata.primary_g.x();
+    sb_media_mastering_metadata.primary_g_chromaticity_y =
+        color_volume_metadata.primary_g.y();
 
-  sb_media_mastering_metadata.white_point_chromaticity_x =
-      mastering_metadata.white_point_chromaticity_x;
-  sb_media_mastering_metadata.white_point_chromaticity_y =
-      mastering_metadata.white_point_chromaticity_y;
+    sb_media_mastering_metadata.primary_b_chromaticity_x =
+        color_volume_metadata.primary_b.x();
+    sb_media_mastering_metadata.primary_b_chromaticity_y =
+        color_volume_metadata.primary_b.y();
 
-  sb_media_mastering_metadata.luminance_max = mastering_metadata.luminance_max;
-  sb_media_mastering_metadata.luminance_min = mastering_metadata.luminance_min;
+    sb_media_mastering_metadata.white_point_chromaticity_x =
+        color_volume_metadata.white_point.x();
+    sb_media_mastering_metadata.white_point_chromaticity_y =
+        color_volume_metadata.white_point.y();
 
-  sb_media_color_metadata.mastering_metadata = sb_media_mastering_metadata;
-  sb_media_color_metadata.max_cll = hdr_metadata.max_cll;
-  sb_media_color_metadata.max_fall = hdr_metadata.max_fall;
+    sb_media_mastering_metadata.luminance_max =
+        color_volume_metadata.luminance_max;
+    sb_media_mastering_metadata.luminance_min =
+        color_volume_metadata.luminance_min;
+
+    sb_media_color_metadata.mastering_metadata = sb_media_mastering_metadata;
+    sb_media_color_metadata.max_cll = hdr_metadata->max_content_light_level;
+    sb_media_color_metadata.max_fall =
+        hdr_metadata->max_frame_average_light_level;
+  }
 
   // Copy the color space below.
-  gfx::ColorSpace color_space = webm_color_metadata.color_space;
   sb_media_color_metadata.primaries =
-      static_cast<SbMediaPrimaryId>(color_space.primaries());
+      static_cast<SbMediaPrimaryId>(color_space.primaries);
   sb_media_color_metadata.transfer =
-      static_cast<SbMediaTransferId>(color_space.transfer());
+      static_cast<SbMediaTransferId>(color_space.transfer);
   sb_media_color_metadata.matrix =
-      static_cast<SbMediaMatrixId>(color_space.matrix());
+      static_cast<SbMediaMatrixId>(color_space.matrix);
+
+  // #if SB_API_VERSION < SB_MEDIA_MATRIX_ID_INVALID_API_VERSION
+  //   // Use `kSbMediaMatrixIdUnknown` when `kSbMediaMatrixIdInvalid` isn't
+  //   // available.
+  //   if (color_space.matrix == VideoColorSpace::MatrixID::INVALID) {
+  //     sb_media_color_metadata.matrix = kSbMediaMatrixIdUnknown;
+  //   }
+  // #endif  // SB_API_VERSION < SB_MEDIA_MATRIX_ID_INVALID_API_VERSION
+
   sb_media_color_metadata.range =
-      static_cast<SbMediaRangeId>(color_space.range());
-  if (sb_media_color_metadata.primaries == kSbMediaPrimaryIdCustom) {
-    const float* custom_primary_matrix = color_space.custom_primary_matrix();
-    memcpy(sb_media_color_metadata.custom_primary_matrix,
-           custom_primary_matrix,
-           sizeof(sb_media_color_metadata.custom_primary_matrix));
-  }
+      static_cast<SbMediaRangeId>(color_space.range);
+  // TODO(b/230915942): Revisit to see if we have to support custom primary id.
+  // if (sb_media_color_metadata.primaries == kSbMediaPrimaryIdCustom) {
+  //   const float* custom_primary_matrix = color_space.custom_primary_matrix();
+  //   memcpy(sb_media_color_metadata.custom_primary_matrix,
+  //          custom_primary_matrix,
+  //          sizeof(sb_media_color_metadata.custom_primary_matrix));
+  // }
 
   return sb_media_color_metadata;
 }
diff --git a/cobalt/media/base/starboard_utils.h b/cobalt/media/base/starboard_utils.h
index 188b7a1..d7ec2a2 100644
--- a/cobalt/media/base/starboard_utils.h
+++ b/cobalt/media/base/starboard_utils.h
@@ -15,32 +15,37 @@
 #ifndef COBALT_MEDIA_BASE_STARBOARD_UTILS_H_
 #define COBALT_MEDIA_BASE_STARBOARD_UTILS_H_
 
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/formats/webm/webm_colour_parser.h"
 #include "starboard/drm.h"
 #include "starboard/media.h"
+#include "third_party/chromium/media/base/audio_codecs.h"
+#include "third_party/chromium/media/base/audio_decoder_config.h"
+#include "third_party/chromium/media/base/decoder_buffer.h"
+#include "third_party/chromium/media/base/demuxer_stream.h"
+#include "third_party/chromium/media/base/video_codecs.h"
+#include "third_party/chromium/media/base/video_decoder_config.h"
+#include "third_party/chromium/media/cobalt/third_party/abseil-cpp/absl/types/optional.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/hdr_metadata.h"
 
 namespace cobalt {
 namespace media {
 
-SbMediaAudioCodec MediaAudioCodecToSbMediaAudioCodec(AudioCodec codec);
-SbMediaVideoCodec MediaVideoCodecToSbMediaVideoCodec(VideoCodec codec);
+SbMediaAudioCodec MediaAudioCodecToSbMediaAudioCodec(::media::AudioCodec codec);
+SbMediaVideoCodec MediaVideoCodecToSbMediaVideoCodec(::media::VideoCodec codec);
 
 SbMediaAudioSampleInfo MediaAudioConfigToSbMediaAudioSampleInfo(
-    const AudioDecoderConfig& audio_decoder_config);
+    const ::media::AudioDecoderConfig& audio_decoder_config,
+    const char* mime_type);
 
-DemuxerStream::Type SbMediaTypeToDemuxerStreamType(SbMediaType type);
-SbMediaType DemuxerStreamTypeToSbMediaType(DemuxerStream::Type type);
+::media::DemuxerStream::Type SbMediaTypeToDemuxerStreamType(SbMediaType type);
+SbMediaType DemuxerStreamTypeToSbMediaType(::media::DemuxerStream::Type type);
 
-void FillDrmSampleInfo(const scoped_refptr<DecoderBuffer>& buffer,
+void FillDrmSampleInfo(const scoped_refptr<::media::DecoderBuffer>& buffer,
                        SbDrmSampleInfo* drm_info,
                        SbDrmSubSampleMapping* subsample_mapping);
 
 SbMediaColorMetadata MediaToSbMediaColorMetadata(
-    const WebMColorMetadata& webm_color_metadata);
+    const ::media::VideoColorSpace& color_space,
+    const absl::optional<gfx::HDRMetadata>& hdr_metadata);
 
 }  // namespace media
 }  // namespace cobalt
diff --git a/cobalt/media/base/stream_parser.cc b/cobalt/media/base/stream_parser.cc
deleted file mode 100644
index 15c474f..0000000
--- a/cobalt/media/base/stream_parser.cc
+++ /dev/null
@@ -1,138 +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 "cobalt/media/base/stream_parser.h"
-
-#include "cobalt/media/base/stream_parser_buffer.h"
-
-namespace cobalt {
-namespace media {
-
-StreamParser::InitParameters::InitParameters(base::TimeDelta duration)
-    : duration(duration),
-      auto_update_timestamp_offset(false),
-      liveness(DemuxerStream::LIVENESS_UNKNOWN),
-      detected_audio_track_count(0),
-      detected_video_track_count(0),
-      detected_text_track_count(0) {}
-
-StreamParser::StreamParser() {}
-
-StreamParser::~StreamParser() {}
-
-static bool MergeBufferQueuesInternal(
-    const std::vector<const StreamParser::BufferQueue*>& buffer_queues,
-    StreamParser::BufferQueue* merged_buffers) {
-  // Instead of std::merge usage, this method implements a custom merge because:
-  // 1) |buffer_queues| may contain N queues,
-  // 2) we must detect and return false if any of the queues in |buffer_queues|
-  // is unsorted, and
-  // 3) we must detect and return false if any of the buffers in |buffer_queues|
-  // has a decode timestamp prior to the last, if any, buffer in
-  // |merged_buffers|.
-  // TODO(wolenetz/acolwell): Refactor stream parsers to eliminate need for
-  // this large grain merge. See http://crbug.com/338484.
-
-  // Done if no inputs to merge.
-  if (buffer_queues.empty()) return true;
-
-  // Build a vector of iterators, one for each input, to traverse inputs.
-  // The union of these iterators points to the set of candidate buffers
-  // for being appended to |merged_buffers|.
-  size_t num_itrs = buffer_queues.size();
-  std::vector<StreamParser::BufferQueue::const_iterator> itrs(num_itrs);
-  for (size_t i = 0; i < num_itrs; ++i) itrs[i] = buffer_queues[i]->begin();
-
-  // |last_decode_timestamp| tracks the lower bound, if any, that all candidate
-  // buffers must not be less than. If |merged_buffers| already has buffers,
-  // initialize |last_decode_timestamp| to the decode timestamp of the last
-  // buffer in it.
-  DecodeTimestamp last_decode_timestamp = kNoDecodeTimestamp();
-  if (!merged_buffers->empty())
-    last_decode_timestamp = merged_buffers->back()->GetDecodeTimestamp();
-
-  // Repeatedly select and append the next buffer from the candidate buffers
-  // until either:
-  // 1) returning false, to indicate detection of decreasing DTS in some queue,
-  //    when a candidate buffer has decode timestamp below
-  //    |last_decode_timestamp|, which means either an input buffer wasn't
-  //    sorted correctly or had a buffer with decode timestamp below the last
-  //    buffer, if any, in |merged_buffers|, or
-  // 2) returning true when all buffers have been merged successfully;
-  //    equivalently, when all of the iterators in |itrs| have reached the end
-  //    of their respective queue from |buffer_queues|.
-  // TODO(wolenetz/acolwell): Ideally, we would use a heap to store the head of
-  // all queues and pop the head with lowest decode timestamp in log(N) time.
-  // However, N will typically be small and usage of this implementation is
-  // meant to be short-term. See http://crbug.com/338484.
-  while (true) {
-    // Tracks which queue's iterator is pointing to the candidate buffer to
-    // append next, or -1 if no candidate buffers found. This indexes |itrs|.
-    int index_of_queue_with_next_decode_timestamp = -1;
-    DecodeTimestamp next_decode_timestamp = kNoDecodeTimestamp();
-
-    // Scan each of the iterators for |buffer_queues| to find the candidate
-    // buffer, if any, that has the lowest decode timestamp.
-    for (size_t i = 0; i < num_itrs; ++i) {
-      if (itrs[i] == buffer_queues[i]->end()) continue;
-
-      // Extract the candidate buffer's decode timestamp.
-      DecodeTimestamp ts = (*itrs[i])->GetDecodeTimestamp();
-
-      if (last_decode_timestamp != kNoDecodeTimestamp() &&
-          ts < last_decode_timestamp)
-        return false;
-
-      if (ts < next_decode_timestamp ||
-          next_decode_timestamp == kNoDecodeTimestamp()) {
-        // Remember the decode timestamp and queue iterator index for this
-        // potentially winning candidate buffer.
-        next_decode_timestamp = ts;
-        index_of_queue_with_next_decode_timestamp = i;
-      }
-    }
-
-    // All done if no further candidate buffers exist.
-    if (index_of_queue_with_next_decode_timestamp == -1) return true;
-
-    // Otherwise, append the winning candidate buffer to |merged_buffers|,
-    // remember its decode timestamp as |last_decode_timestamp| now that it is
-    // the last buffer in |merged_buffers|, advance the corresponding
-    // input BufferQueue iterator, and continue.
-    scoped_refptr<StreamParserBuffer> buffer =
-        *itrs[index_of_queue_with_next_decode_timestamp];
-    last_decode_timestamp = buffer->GetDecodeTimestamp();
-    merged_buffers->push_back(buffer);
-    ++itrs[index_of_queue_with_next_decode_timestamp];
-  }
-}
-
-bool MergeBufferQueues(const StreamParser::BufferQueueMap& buffer_queue_map,
-                       StreamParser::BufferQueue* merged_buffers) {
-  DCHECK(merged_buffers);
-
-  // Prepare vector containing pointers to any provided non-empty buffer queues.
-
-  // Append audio buffer queues first, before all other types, since
-  // FrameProcessorTest.AudioVideo_Discontinuity currently depends on audio
-  // buffers being processed first.
-  std::vector<const StreamParser::BufferQueue*> buffer_queues;
-  StreamParser::BufferQueueMap::const_iterator it;
-  for (it = buffer_queue_map.begin(); it != buffer_queue_map.end(); ++it) {
-    DCHECK(!it->second.empty());
-    if (it->second[0]->type() == DemuxerStream::AUDIO)
-      buffer_queues.push_back(&it->second);
-  }
-  for (it = buffer_queue_map.begin(); it != buffer_queue_map.end(); ++it) {
-    DCHECK(!it->second.empty());
-    if (it->second[0]->type() != DemuxerStream::AUDIO)
-      buffer_queues.push_back(&it->second);
-  }
-
-  // Do the merge.
-  return MergeBufferQueuesInternal(buffer_queues, merged_buffers);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/stream_parser.h b/cobalt/media/base/stream_parser.h
deleted file mode 100644
index dbad668..0000000
--- a/cobalt/media/base/stream_parser.h
+++ /dev/null
@@ -1,162 +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 COBALT_MEDIA_BASE_STREAM_PARSER_H_
-#define COBALT_MEDIA_BASE_STREAM_PARSER_H_
-
-#include <deque>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/callback_forward.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/eme_constants.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class MediaLog;
-class MediaTracks;
-class StreamParserBuffer;
-class TextTrackConfig;
-
-// Abstract interface for parsing media byte streams.
-class MEDIA_EXPORT StreamParser {
- public:
-  typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue;
-
-  // Range of |TrackId| is dependent upon stream parsers. It is currently
-  // the key for the buffer's text track config in the applicable
-  // TextTrackConfigMap (which is passed in StreamParser::NewConfigCB), or
-  // 0 for other media types that currently allow at most one track.
-  // WebMTracksParser uses -1 as an invalid text track number.
-  // It is also the key for BufferQueueMap structure returned by stream parsers.
-  // TODO(servolk/wolenetz): Change to size_type or unsigned after fixing track
-  // id handling in FrameProcessor.
-  typedef int TrackId;
-
-  // Map of text track ID to the track configuration.
-  typedef std::map<TrackId, TextTrackConfig> TextTrackConfigMap;
-
-  // Map of track ID to decode-timestamp-ordered buffers for the track.
-  typedef std::map<TrackId, BufferQueue> BufferQueueMap;
-
-  // Stream parameters passed in InitCB.
-  struct MEDIA_EXPORT InitParameters {
-    explicit InitParameters(base::TimeDelta duration);
-
-    // Stream duration.
-    base::TimeDelta duration;
-
-    // Indicates the source time associated with presentation timestamp 0. A
-    // null Time is returned if no mapping to Time exists.
-    base::Time timeline_offset;
-
-    // Indicates that timestampOffset should be updated based on the earliest
-    // end timestamp (audio or video) provided during each NewBuffersCB.
-    bool auto_update_timestamp_offset;
-
-    // Indicates live stream.
-    DemuxerStream::Liveness liveness;
-
-    // Counts of tracks detected by type within this stream. Not all of these
-    // tracks may be selected for use by the parser.
-    int detected_audio_track_count;
-    int detected_video_track_count;
-    int detected_text_track_count;
-  };
-
-  // Indicates completion of parser initialization.
-  //   params - Stream parameters.
-  typedef base::Callback<void(const InitParameters& params)> InitCB;
-
-  // Indicates when new stream configurations have been parsed.
-  // First parameter - An object containing information about media tracks as
-  //                   well as audio/video decoder configs associated with each
-  //                   track the parser will use from the stream.
-  // Second parameter - The new text tracks configuration.  If the map is empty,
-  //                    then no text tracks were parsed for use from the stream.
-  // Return value - True if the new configurations are accepted.
-  //                False if the new configurations are not supported
-  //                and indicates that a parsing error should be signalled.
-  typedef base::Callback<bool(std::unique_ptr<MediaTracks>,
-                              const TextTrackConfigMap&)>
-      NewConfigCB;
-
-  // New stream buffers have been parsed.
-  // First parameter - A map of track ids to queues of newly parsed buffers.
-  // Return value - True indicates that the buffers are accepted.
-  //                False if something was wrong with the buffers and a parsing
-  //                error should be signalled.
-  typedef base::Callback<bool(const BufferQueueMap&)> NewBuffersCB;
-
-  // Signals the beginning of a new media segment.
-  typedef base::Callback<void()> NewMediaSegmentCB;
-
-  // Signals the end of a media segment.
-  typedef base::Callback<void()> EndMediaSegmentCB;
-
-  // A new potentially encrypted stream has been parsed.
-  // First parameter - The type of the initialization data associated with the
-  //                   stream.
-  // Second parameter - The initialization data associated with the stream.
-  typedef base::Callback<void(EmeInitDataType, const std::vector<uint8_t>&)>
-      EncryptedMediaInitDataCB;
-
-  StreamParser();
-  virtual ~StreamParser();
-
-  // Initializes the parser with necessary callbacks. Must be called before any
-  // data is passed to Parse(). |init_cb| will be called once enough data has
-  // been parsed to determine the initial stream configurations, presentation
-  // start time, and duration. If |ignore_text_track| is true, then no text
-  // buffers should be passed later by the parser to |new_buffers_cb|.
-  virtual void Init(
-      const InitCB& init_cb, const NewConfigCB& config_cb,
-      const NewBuffersCB& new_buffers_cb, bool ignore_text_track,
-      const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-      const NewMediaSegmentCB& new_segment_cb,
-      const EndMediaSegmentCB& end_of_segment_cb,
-      const scoped_refptr<MediaLog>& media_log) = 0;
-
-  // Called during the reset parser state algorithm.  This flushes the current
-  // parser and puts the parser in a state where it can receive data.  This
-  // method does not need to invoke the EndMediaSegmentCB since the parser reset
-  // algorithm already resets the segment parsing state.
-  virtual void Flush() = 0;
-
-  // Called when there is new data to parse.
-  //
-  // Returns true if the parse succeeds.
-  virtual bool Parse(const uint8_t* buf, int size) = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(StreamParser);
-};
-
-// Appends to |merged_buffers| the provided buffers in decode-timestamp order.
-// Any previous contents of |merged_buffers| is assumed to have lower
-// decode timestamps versus the provided buffers. All provided buffer queues
-// are assumed to already be in decode-timestamp order.
-// Returns false if any of the provided audio/video/text buffers are found
-// to not be in decode timestamp order, or have a decode timestamp less than
-// the last buffer, if any, in |merged_buffers|. Partial results may exist
-// in |merged_buffers| in this case. Returns true on success.
-// No validation of media type within the various buffer queues is done here.
-// TODO(wolenetz/acolwell): Merge incrementally in parsers to eliminate
-// subtle issues with tie-breaking. See http://crbug.com/338484.
-MEDIA_EXPORT bool MergeBufferQueues(const StreamParser::BufferQueueMap& buffers,
-                                    StreamParser::BufferQueue* merged_buffers);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_STREAM_PARSER_H_
diff --git a/cobalt/media/base/stream_parser_buffer.cc b/cobalt/media/base/stream_parser_buffer.cc
deleted file mode 100644
index 47e2300..0000000
--- a/cobalt/media/base/stream_parser_buffer.cc
+++ /dev/null
@@ -1,241 +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 "cobalt/media/base/stream_parser_buffer.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "base/logging.h"
-#include "cobalt/media/base/timestamp_constants.h"
-
-namespace cobalt {
-namespace media {
-
-scoped_refptr<StreamParserBuffer> StreamParserBuffer::CreateEOSBuffer() {
-  return base::WrapRefCounted(new StreamParserBuffer);
-}
-
-scoped_refptr<StreamParserBuffer> StreamParserBuffer::CopyFrom(
-    Allocator* allocator, const uint8_t* data, int data_size, bool is_key_frame,
-    Type type, TrackId track_id) {
-  scoped_refptr<StreamParserBuffer> stream_parser_buffer =
-      base::WrapRefCounted(new StreamParserBuffer(
-          allocator, data, data_size, NULL, 0, is_key_frame, type, track_id));
-  if (!stream_parser_buffer->has_data()) {
-    return NULL;
-  }
-  return stream_parser_buffer;
-}
-
-scoped_refptr<StreamParserBuffer> StreamParserBuffer::CopyFrom(
-    Allocator* allocator, const uint8_t* data, int data_size,
-    const uint8_t* side_data, int side_data_size, bool is_key_frame, Type type,
-    TrackId track_id) {
-  return base::WrapRefCounted(
-      new StreamParserBuffer(allocator, data, data_size, side_data,
-                             side_data_size, is_key_frame, type, track_id));
-}
-
-DecodeTimestamp StreamParserBuffer::GetDecodeTimestamp() const {
-  if (decode_timestamp_ == kNoDecodeTimestamp())
-    return DecodeTimestamp::FromPresentationTime(timestamp());
-  return decode_timestamp_;
-}
-
-void StreamParserBuffer::SetDecodeTimestamp(DecodeTimestamp timestamp) {
-  decode_timestamp_ = timestamp;
-  if (preroll_buffer_.get()) preroll_buffer_->SetDecodeTimestamp(timestamp);
-}
-
-StreamParserBuffer::StreamParserBuffer()
-    : decode_timestamp_(kNoDecodeTimestamp()),
-      config_id_(kInvalidConfigId),
-      track_id_(0),
-      is_duration_estimated_(false) {}
-
-StreamParserBuffer::StreamParserBuffer(Allocator* allocator,
-                                       const uint8_t* data, int data_size,
-                                       const uint8_t* side_data,
-                                       int side_data_size, bool is_key_frame,
-                                       Type type, TrackId track_id)
-    : DecoderBuffer(allocator, type, data, data_size, side_data,
-                    side_data_size),
-      decode_timestamp_(kNoDecodeTimestamp()),
-      config_id_(kInvalidConfigId),
-      track_id_(track_id),
-      is_duration_estimated_(false) {
-  if (allocations().number_of_buffers() == 0) {
-    return;
-  }
-  // TODO(scherkus): Should DataBuffer constructor accept a timestamp and
-  // duration to force clients to set them? Today they end up being zero which
-  // is both a common and valid value and could lead to bugs.
-  if (data) {
-    set_duration(kNoTimestamp);
-  }
-
-  if (is_key_frame) set_is_key_frame(true);
-}
-
-StreamParserBuffer::StreamParserBuffer(Allocator* allocator,
-                                       Allocator::Allocations allocations,
-                                       const uint8_t* side_data,
-                                       int side_data_size, bool is_key_frame,
-                                       Type type, TrackId track_id)
-    : DecoderBuffer(allocator, type, allocations, side_data, side_data_size),
-      decode_timestamp_(kNoDecodeTimestamp()),
-      config_id_(kInvalidConfigId),
-      track_id_(track_id),
-      is_duration_estimated_(false) {
-  // TODO(scherkus): Should DataBuffer constructor accept a timestamp and
-  // duration to force clients to set them? Today they end up being zero which
-  // is both a common and valid value and could lead to bugs.
-  set_duration(kNoTimestamp);
-
-  if (is_key_frame) set_is_key_frame(true);
-}
-
-StreamParserBuffer::~StreamParserBuffer() {}
-
-int StreamParserBuffer::GetConfigId() const { return config_id_; }
-
-void StreamParserBuffer::SetConfigId(int config_id) {
-  config_id_ = config_id;
-  if (preroll_buffer_.get()) preroll_buffer_->SetConfigId(config_id);
-}
-
-int StreamParserBuffer::GetSpliceBufferConfigId(size_t index) const {
-  if (!splice_buffers_ || index >= splice_buffers().size()) {
-    return GetConfigId();
-  }
-  return (*splice_buffers_)[index]->GetConfigId();
-}
-
-void StreamParserBuffer::ConvertToSpliceBuffer(
-    const BufferQueue& pre_splice_buffers) {
-  DCHECK(!splice_buffers_);
-  DCHECK(duration() > base::TimeDelta())
-      << "Only buffers with a valid duration can convert to a splice buffer."
-      << " pts " << timestamp().InSecondsF() << " dts "
-      << GetDecodeTimestamp().InSecondsF() << " dur "
-      << duration().InSecondsF();
-  DCHECK(!end_of_stream());
-
-  // Splicing requires non-estimated sample accurate durations to be confident
-  // things will sound smooth. Also, we cannot be certain whether estimated
-  // overlap is really a splice scenario, or just over estimation.
-  DCHECK(!is_duration_estimated_);
-
-  // Make a copy of this first, before making any changes.
-  scoped_refptr<StreamParserBuffer> overlapping_buffer = Clone();
-  overlapping_buffer->set_splice_timestamp(kNoTimestamp);
-
-  const scoped_refptr<StreamParserBuffer>& first_splice_buffer =
-      pre_splice_buffers.front();
-
-  // Ensure the given buffers are actually before the splice point.
-  DCHECK(first_splice_buffer->timestamp() <= overlapping_buffer->timestamp());
-
-  // TODO(dalecurtis): We should also clear |data|, but since that implies EOS
-  // care must be taken to ensure there are no clients relying on that behavior.
-
-  // Move over any preroll from this buffer.
-  if (preroll_buffer_.get()) {
-    DCHECK(!overlapping_buffer->preroll_buffer_.get());
-    overlapping_buffer->preroll_buffer_.swap(preroll_buffer_);
-  }
-
-  // Rewrite |this| buffer as a splice buffer.
-  SetDecodeTimestamp(first_splice_buffer->GetDecodeTimestamp());
-  SetConfigId(first_splice_buffer->GetConfigId());
-  set_timestamp(first_splice_buffer->timestamp());
-  set_is_key_frame(first_splice_buffer->is_key_frame());
-  DCHECK_EQ(type(), first_splice_buffer->type());
-  track_id_ = first_splice_buffer->track_id();
-  set_splice_timestamp(overlapping_buffer->timestamp());
-
-  // The splice duration is the duration of all buffers before the splice plus
-  // the highest ending timestamp after the splice point.
-  DCHECK(overlapping_buffer->duration() > base::TimeDelta());
-  DCHECK(pre_splice_buffers.back()->duration() > base::TimeDelta());
-  set_duration(
-      std::max(overlapping_buffer->timestamp() + overlapping_buffer->duration(),
-               pre_splice_buffers.back()->timestamp() +
-                   pre_splice_buffers.back()->duration()) -
-      first_splice_buffer->timestamp());
-
-  splice_buffers_.reset(new BufferQueue);
-  // Copy all pre splice buffers into our wrapper buffer.
-  for (BufferQueue::const_iterator it = pre_splice_buffers.begin();
-       it != pre_splice_buffers.end(); ++it) {
-    const scoped_refptr<StreamParserBuffer>& buffer = *it;
-    DCHECK(!buffer->end_of_stream());
-    DCHECK(!buffer->preroll_buffer().get());
-    DCHECK(buffer->splice_buffers().empty());
-    DCHECK(!buffer->is_duration_estimated());
-    splice_buffers_->push_back(buffer->Clone());
-    splice_buffers_->back()->set_splice_timestamp(splice_timestamp());
-  }
-
-  splice_buffers_->push_back(overlapping_buffer);
-}
-
-void StreamParserBuffer::SetPrerollBuffer(
-    const scoped_refptr<StreamParserBuffer>& preroll_buffer) {
-  DCHECK(!preroll_buffer_.get());
-  DCHECK(!end_of_stream());
-  DCHECK(!preroll_buffer->end_of_stream());
-  DCHECK(!preroll_buffer->preroll_buffer_.get());
-  DCHECK(preroll_buffer->splice_timestamp() == kNoTimestamp);
-  DCHECK(preroll_buffer->splice_buffers().empty());
-  DCHECK(preroll_buffer->timestamp() <= timestamp());
-  DCHECK(preroll_buffer->discard_padding() == DecoderBuffer::DiscardPadding());
-  DCHECK_EQ(preroll_buffer->type(), type());
-  DCHECK_EQ(preroll_buffer->track_id(), track_id());
-
-  preroll_buffer_ = preroll_buffer;
-  preroll_buffer_->set_timestamp(timestamp());
-  preroll_buffer_->SetDecodeTimestamp(GetDecodeTimestamp());
-
-  // Mark the entire buffer for discard.
-  preroll_buffer_->set_discard_padding(
-      std::make_pair(kInfiniteDuration, base::TimeDelta()));
-}
-
-void StreamParserBuffer::set_timestamp(base::TimeDelta timestamp) {
-  DecoderBuffer::set_timestamp(timestamp);
-  if (preroll_buffer_.get()) preroll_buffer_->set_timestamp(timestamp);
-}
-
-scoped_refptr<StreamParserBuffer> StreamParserBuffer::Clone() const {
-  if (end_of_stream()) {
-    return StreamParserBuffer::CreateEOSBuffer();
-  }
-
-  scoped_refptr<StreamParserBuffer> clone = new StreamParserBuffer(
-      allocator(), allocations(), side_data(), side_data_size(), is_key_frame(),
-      type(), track_id());
-  clone->SetDecodeTimestamp(GetDecodeTimestamp());
-  clone->SetConfigId(GetConfigId());
-  clone->set_timestamp(timestamp());
-  clone->set_duration(duration());
-  clone->set_is_duration_estimated(is_duration_estimated());
-  clone->set_discard_padding(discard_padding());
-  clone->set_splice_timestamp(splice_timestamp());
-  const DecryptConfig* decrypt_config = this->decrypt_config();
-  if (decrypt_config) {
-    clone->set_decrypt_config(
-        std::make_unique<DecryptConfig>(
-          decrypt_config->encryption_mode(),
-                          decrypt_config->key_id(), decrypt_config->iv(),
-                          decrypt_config->subsamples(),
-                          decrypt_config->encryption_pattern()));
-  }
-
-  return clone;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/stream_parser_buffer.h b/cobalt/media/base/stream_parser_buffer.h
deleted file mode 100644
index 4d7da43..0000000
--- a/cobalt/media/base/stream_parser_buffer.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_STREAM_PARSER_BUFFER_H_
-#define COBALT_MEDIA_BASE_STREAM_PARSER_BUFFER_H_
-
-#include <deque>
-#include <memory>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Simple wrapper around base::TimeDelta that represents a decode timestamp.
-// Making DecodeTimestamp a different type makes it easier to determine whether
-// code is operating on presentation or decode timestamps and makes conversions
-// between the two types explicit and easy to spot.
-class DecodeTimestamp {
- public:
-  DecodeTimestamp() {}
-  DecodeTimestamp(const DecodeTimestamp& rhs) : ts_(rhs.ts_) {}
-  DecodeTimestamp& operator=(const DecodeTimestamp& rhs) {
-    if (&rhs != this) ts_ = rhs.ts_;
-    return *this;
-  }
-
-  // Only operators that are actually used by the code have been defined.
-  // Reviewers should pay close attention to the addition of new operators.
-  bool operator<(const DecodeTimestamp& rhs) const { return ts_ < rhs.ts_; }
-  bool operator>(const DecodeTimestamp& rhs) const { return ts_ > rhs.ts_; }
-  bool operator==(const DecodeTimestamp& rhs) const { return ts_ == rhs.ts_; }
-  bool operator!=(const DecodeTimestamp& rhs) const { return ts_ != rhs.ts_; }
-  bool operator>=(const DecodeTimestamp& rhs) const { return ts_ >= rhs.ts_; }
-  bool operator<=(const DecodeTimestamp& rhs) const { return ts_ <= rhs.ts_; }
-
-  base::TimeDelta operator-(const DecodeTimestamp& rhs) const {
-    return ts_ - rhs.ts_;
-  }
-
-  DecodeTimestamp& operator+=(const base::TimeDelta& rhs) {
-    ts_ += rhs;
-    return *this;
-  }
-
-  DecodeTimestamp& operator-=(const base::TimeDelta& rhs) {
-    ts_ -= rhs;
-    return *this;
-  }
-
-  DecodeTimestamp operator+(const base::TimeDelta& rhs) const {
-    return DecodeTimestamp(ts_ + rhs);
-  }
-
-  DecodeTimestamp operator-(const base::TimeDelta& rhs) const {
-    return DecodeTimestamp(ts_ - rhs);
-  }
-
-  int64_t operator/(const base::TimeDelta& rhs) const { return ts_ / rhs; }
-
-  static DecodeTimestamp FromSecondsD(double seconds) {
-    return DecodeTimestamp(base::TimeDelta::FromSecondsD(seconds));
-  }
-
-  static DecodeTimestamp FromMilliseconds(int64_t milliseconds) {
-    return DecodeTimestamp(base::TimeDelta::FromMilliseconds(milliseconds));
-  }
-
-  static DecodeTimestamp FromMicroseconds(int64_t microseconds) {
-    return DecodeTimestamp(base::TimeDelta::FromMicroseconds(microseconds));
-  }
-
-  // This method is used to explicitly call out when presentation timestamps
-  // are being converted to a decode timestamp.
-  static DecodeTimestamp FromPresentationTime(base::TimeDelta timestamp) {
-    return DecodeTimestamp(timestamp);
-  }
-
-  double InSecondsF() const { return ts_.InSecondsF(); }
-  int64_t InMilliseconds() const { return ts_.InMilliseconds(); }
-  int64_t InMicroseconds() const { return ts_.InMicroseconds(); }
-
-  // TODO(acolwell): Remove once all the hacks are gone. This method is called
-  // by hacks where a decode time is being used as a presentation time.
-  base::TimeDelta ToPresentationTime() const { return ts_; }
-
- private:
-  explicit DecodeTimestamp(base::TimeDelta timestamp) : ts_(timestamp) {}
-
-  base::TimeDelta ts_;
-};
-
-MEDIA_EXPORT extern inline DecodeTimestamp kNoDecodeTimestamp() {
-  return DecodeTimestamp::FromPresentationTime(kNoTimestamp);
-}
-
-class MEDIA_EXPORT StreamParserBuffer : public DecoderBuffer {
- public:
-  // Value used to signal an invalid decoder config ID.
-  enum { kInvalidConfigId = -1 };
-
-  typedef StreamParser::TrackId TrackId;
-
-  static scoped_refptr<StreamParserBuffer> CreateEOSBuffer();
-
-  static scoped_refptr<StreamParserBuffer> CopyFrom(
-      Allocator* allocator, const uint8_t* data, int data_size,
-      bool is_key_frame, Type type, TrackId track_id);
-  static scoped_refptr<StreamParserBuffer> CopyFrom(
-      Allocator* allocator, const uint8_t* data, int data_size,
-      const uint8_t* side_data, int side_data_size, bool is_key_frame,
-      Type type, TrackId track_id);
-
-  // Decode timestamp. If not explicitly set, or set to kNoTimestamp, the
-  // value will be taken from the normal timestamp.
-  DecodeTimestamp GetDecodeTimestamp() const;
-  void SetDecodeTimestamp(DecodeTimestamp timestamp);
-
-  // Gets/sets the ID of the decoder config associated with this buffer.
-  int GetConfigId() const;
-  void SetConfigId(int config_id);
-
-  // Returns the config ID of this buffer if it has no splice buffers or
-  // |index| is out of range.  Otherwise returns the config ID for the
-  // buffer in |splice_buffers_| at position |index|.
-  int GetSpliceBufferConfigId(size_t index) const;
-
-  // Gets the parser's track ID associated with this buffer. Value is
-  // meaningless for EOS buffers.
-  TrackId track_id() const { return track_id_; }
-
-  // Converts this buffer to a splice buffer.  |pre_splice_buffers| must not
-  // have any EOS buffers, must not have any splice buffers, nor must have any
-  // buffer with preroll.
-  //
-  // |pre_splice_buffers| will be deep copied and each copy's splice_timestamp()
-  // will be set to this buffer's splice_timestamp().  A copy of |this|, with a
-  // splice_timestamp() of kNoTimestamp, will be added to the end of
-  // |splice_buffers_|.
-  //
-  // See the Audio Splice Frame Algorithm in the MSE specification for details.
-  typedef StreamParser::BufferQueue BufferQueue;
-  void ConvertToSpliceBuffer(const BufferQueue& pre_splice_buffers);
-  const BufferQueue& splice_buffers() const {
-    static BufferQueue empty;
-    return splice_buffers_ ? *splice_buffers_ : empty;
-  }
-
-  // Specifies a buffer which must be decoded prior to this one to ensure this
-  // buffer can be accurately decoded.  The given buffer must be of the same
-  // type, must not be a splice buffer, must not have any discard padding, and
-  // must not be an end of stream buffer.  |preroll| is not copied.
-  //
-  // It's expected that this preroll buffer will be discarded entirely post
-  // decoding.  As such it's discard_padding() will be set to kInfiniteDuration.
-  //
-  // All future timestamp, decode timestamp, config id, or track id changes to
-  // this buffer will be applied to the preroll buffer as well.
-  void SetPrerollBuffer(const scoped_refptr<StreamParserBuffer>& preroll);
-  const scoped_refptr<StreamParserBuffer>& preroll_buffer() {
-    return preroll_buffer_;
-  }
-
-  void set_timestamp(base::TimeDelta timestamp) override;
-
-  bool is_duration_estimated() const { return is_duration_estimated_; }
-
-  void set_is_duration_estimated(bool is_estimated) {
-    is_duration_estimated_ = is_estimated;
-  }
-
- private:
-  // The default ctor creates an EOS buffer without specific stream type.
-  StreamParserBuffer();
-  StreamParserBuffer(Allocator* allocator, const uint8_t* data, int data_size,
-                     const uint8_t* side_data, int side_data_size,
-                     bool is_key_frame, Type type, TrackId track_id);
-  StreamParserBuffer(Allocator* allocator, Allocator::Allocations allocations,
-                     const uint8_t* side_data, int side_data_size,
-                     bool is_key_frame, Type type, TrackId track_id);
-  ~StreamParserBuffer() override;
-
-  scoped_refptr<StreamParserBuffer> Clone() const;
-
-  DecodeTimestamp decode_timestamp_;
-  int config_id_;
-  TrackId track_id_;
-  std::unique_ptr<BufferQueue> splice_buffers_;
-  scoped_refptr<StreamParserBuffer> preroll_buffer_;
-  bool is_duration_estimated_;
-
-  DISALLOW_COPY_AND_ASSIGN(StreamParserBuffer);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_STREAM_PARSER_BUFFER_H_
diff --git a/cobalt/media/base/stream_parser_unittest.cc b/cobalt/media/base/stream_parser_unittest.cc
deleted file mode 100644
index d4e4c5d..0000000
--- a/cobalt/media/base/stream_parser_unittest.cc
+++ /dev/null
@@ -1,374 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <algorithm>
-#include <map>
-#include <sstream>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-typedef StreamParser::TrackId TrackId;
-typedef StreamParser::BufferQueue BufferQueue;
-
-const int kEnd = -1;
-const uint8_t kFakeData[] = {0xFF};
-const TrackId kAudioTrackId = 0;
-const TrackId kVideoTrackId = 1;
-const TrackId kTextTrackIdA = 2;
-const TrackId kTextTrackIdB = 3;
-
-static bool IsAudio(scoped_refptr<StreamParserBuffer> buffer) {
-  return buffer->type() == DemuxerStream::AUDIO;
-}
-
-static bool IsVideo(scoped_refptr<StreamParserBuffer> buffer) {
-  return buffer->type() == DemuxerStream::VIDEO;
-}
-
-static bool IsText(scoped_refptr<StreamParserBuffer> buffer) {
-  return buffer->type() == DemuxerStream::TEXT;
-}
-
-// Creates and appends a sequence of StreamParserBuffers to the provided
-// |queue|. |decode_timestamps| determines the number of appended buffers and
-// their sequence of decode timestamps; a |kEnd| timestamp indicates the
-// end of the sequence and no buffer is appended for it. Each new buffer's
-// type will be |type| with track ID set to |track_id|.
-static void GenerateBuffers(const int* decode_timestamps,
-                            StreamParserBuffer::Type type, TrackId track_id,
-                            BufferQueue* queue) {
-  DCHECK(decode_timestamps);
-  DCHECK(queue);
-  DCHECK_NE(type, DemuxerStream::UNKNOWN);
-  DCHECK_LT(type, DemuxerStream::NUM_TYPES);
-  for (int i = 0; decode_timestamps[i] != kEnd; ++i) {
-    scoped_refptr<StreamParserBuffer> buffer = StreamParserBuffer::CopyFrom(
-        kFakeData, sizeof(kFakeData), true, type, track_id);
-    DCHECK(buffer);
-    buffer->SetDecodeTimestamp(
-        DecodeTimestamp::FromMicroseconds(decode_timestamps[i]));
-    queue->push_back(buffer);
-  }
-}
-
-class StreamParserTest : public testing::Test {
- protected:
-  StreamParserTest() {}
-
-  // Returns the number of buffers in |merged_buffers_| for which |predicate|
-  // returns true.
-  size_t CountMatchingMergedBuffers(
-      bool (*predicate)(scoped_refptr<StreamParserBuffer> buffer)) {
-    return static_cast<size_t>(
-        count_if(merged_buffers_.begin(), merged_buffers_.end(), predicate));
-  }
-
-  // Appends test audio buffers in the sequence described by |decode_timestamps|
-  // to |audio_buffers_|. See GenerateBuffers() for |decode_timestamps| format.
-  void GenerateAudioBuffers(const int* decode_timestamps) {
-    GenerateBuffers(decode_timestamps, DemuxerStream::AUDIO, kAudioTrackId,
-                    &buffer_queue_map_[kAudioTrackId]);
-  }
-
-  // Appends test video buffers in the sequence described by |decode_timestamps|
-  // to |video_buffers_|. See GenerateBuffers() for |decode_timestamps| format.
-  void GenerateVideoBuffers(const int* decode_timestamps) {
-    GenerateBuffers(decode_timestamps, DemuxerStream::VIDEO, kVideoTrackId,
-                    &buffer_queue_map_[kVideoTrackId]);
-  }
-
-  // Current tests only need up to two distinct text BufferQueues. This helper
-  // conditionally appends buffers to the underlying |buffer_queue_map_| keyed
-  // by the respective track ID. If |decode_timestamps_{a,b}|
-  // is NULL, then the corresponding BufferQueue is not changed at all.
-  // Note that key collision on map insertion does not replace the previous
-  // value.
-  void GenerateTextBuffers(const int* decode_timestamps_a,
-                           const int* decode_timestamps_b) {
-    if (decode_timestamps_a) {
-      GenerateBuffers(decode_timestamps_a, DemuxerStream::TEXT, kTextTrackIdA,
-                      &buffer_queue_map_[kTextTrackIdA]);
-    }
-
-    if (decode_timestamps_b) {
-      GenerateBuffers(decode_timestamps_b, DemuxerStream::TEXT, kTextTrackIdB,
-                      &buffer_queue_map_[kTextTrackIdB]);
-    }
-  }
-
-  // Returns a string that describes the sequence of buffers in
-  // |merged_buffers_|. The string is a concatenation of space-delimited buffer
-  // descriptors in the same sequence as |merged_buffers_|. Each descriptor is
-  // the concatenation of
-  // 1) a single character that describes the buffer's type(), e.g. A, V, or T
-  //    for audio, video, or text, respectively
-  // 2) the buffer's track_id()
-  // 3) ":"
-  // 4) the buffer's decode timestamp.
-  // If |include_type_and_text_track| is false, then items 1, 2, and 3 are
-  // not included in descriptors. This is useful when buffers with different
-  // media types but the same decode timestamp are expected, and the exact
-  // sequence of media types for the tying timestamps is not subject to
-  // verification.
-  std::string MergedBufferQueueString(bool include_type_and_text_track) {
-    std::stringstream results_stream;
-    for (BufferQueue::const_iterator itr = merged_buffers_.begin();
-         itr != merged_buffers_.end(); ++itr) {
-      if (itr != merged_buffers_.begin()) results_stream << " ";
-      const StreamParserBuffer& buffer = *(itr->get());
-      if (include_type_and_text_track) {
-        switch (buffer.type()) {
-          case DemuxerStream::AUDIO:
-            results_stream << "A";
-            break;
-          case DemuxerStream::VIDEO:
-            results_stream << "V";
-            break;
-          case DemuxerStream::TEXT:
-            results_stream << "T";
-
-            break;
-          default:
-            NOTREACHED();
-        }
-        results_stream << buffer.track_id() << ":";
-      }
-      results_stream << buffer.GetDecodeTimestamp().InMicroseconds();
-    }
-
-    return results_stream.str();
-  }
-
-  // Verifies that MergeBufferQueues() of the current |audio_buffers_|,
-  // |video_buffers_|, |text_map_|, and |merged_buffers_| returns true and
-  // results in an updated |merged_buffers_| that matches expectation. The
-  // expectation, specified in |expected|, is compared to the string resulting
-  // from MergedBufferQueueString() (see comments for that method) with
-  // |verify_type_and_text_track_sequence| passed. |merged_buffers_| is appended
-  // to by the merge, and may be setup by the caller to have some pre-existing
-  // buffers; it is both an input and output of this method.
-  // Regardless of |verify_type_and_text_track_sequence|, the marginal number
-  // of buffers of each type (audio, video, text) resulting from the merge is
-  // also verified to match the number of buffers in |audio_buffers_|,
-  // |video_buffers_|, and |text_map_|, respectively.
-  void VerifyMergeSuccess(const std::string& expected,
-                          bool verify_type_and_text_track_sequence) {
-    // |merged_buffers| may already have some buffers. Count them by type for
-    // later inclusion in verification.
-    size_t original_audio_in_merged = CountMatchingMergedBuffers(IsAudio);
-    size_t original_video_in_merged = CountMatchingMergedBuffers(IsVideo);
-    size_t original_text_in_merged = CountMatchingMergedBuffers(IsText);
-
-    EXPECT_TRUE(MergeBufferQueues(buffer_queue_map_, &merged_buffers_));
-
-    // Verify resulting contents of |merged_buffers| matches |expected|.
-    EXPECT_EQ(expected,
-              MergedBufferQueueString(verify_type_and_text_track_sequence));
-
-    // Verify that the correct number of each type of buffer is in the merge
-    // result.
-    size_t audio_in_merged = CountMatchingMergedBuffers(IsAudio);
-    size_t video_in_merged = CountMatchingMergedBuffers(IsVideo);
-    size_t text_in_merged = CountMatchingMergedBuffers(IsText);
-
-    EXPECT_GE(audio_in_merged, original_audio_in_merged);
-    EXPECT_GE(video_in_merged, original_video_in_merged);
-    EXPECT_GE(text_in_merged, original_text_in_merged);
-
-    EXPECT_EQ(buffer_queue_map_[kAudioTrackId].size(),
-              audio_in_merged - original_audio_in_merged);
-    if (buffer_queue_map_[kAudioTrackId].empty())
-      buffer_queue_map_.erase(kAudioTrackId);
-    EXPECT_EQ(buffer_queue_map_[kVideoTrackId].size(),
-              video_in_merged - original_video_in_merged);
-    if (buffer_queue_map_[kVideoTrackId].empty())
-      buffer_queue_map_.erase(kVideoTrackId);
-
-    size_t expected_text_buffer_count = 0;
-    expected_text_buffer_count += buffer_queue_map_[kTextTrackIdA].size();
-    if (buffer_queue_map_[kTextTrackIdA].empty())
-      buffer_queue_map_.erase(kTextTrackIdA);
-    expected_text_buffer_count += buffer_queue_map_[kTextTrackIdB].size();
-    if (buffer_queue_map_[kTextTrackIdB].empty())
-      buffer_queue_map_.erase(kTextTrackIdB);
-    EXPECT_EQ(expected_text_buffer_count,
-              text_in_merged - original_text_in_merged);
-  }
-
-  // Verifies that MergeBufferQueues() of the current |buffer_queue_map_| and
-  // |merged_buffers_| returns false.
-  void VerifyMergeFailure() {
-    EXPECT_FALSE(MergeBufferQueues(buffer_queue_map_, &merged_buffers_));
-  }
-
-  // Helper to allow tests to clear all the input BufferQueues (except
-  // |merged_buffers_|) and the BufferQueueMap that are used in
-  // VerifyMerge{Success/Failure}().
-  void ClearBufferQueuesButKeepAnyMergedBuffers() { buffer_queue_map_.clear(); }
-
- private:
-  StreamParser::BufferQueueMap buffer_queue_map_;
-  BufferQueue merged_buffers_;
-
-  DISALLOW_COPY_AND_ASSIGN(StreamParserTest);
-};
-
-TEST_F(StreamParserTest, MergeBufferQueues_AllEmpty) {
-  std::string expected = "";
-  VerifyMergeSuccess(expected, true);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_SingleAudioBuffer) {
-  std::string expected = "A0:100";
-  int audio_timestamps[] = {100, kEnd};
-  GenerateAudioBuffers(audio_timestamps);
-  VerifyMergeSuccess(expected, true);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_SingleVideoBuffer) {
-  std::string expected = "V1:100";
-  int video_timestamps[] = {100, kEnd};
-  GenerateVideoBuffers(video_timestamps);
-  VerifyMergeSuccess(expected, true);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_SingleTextBuffer) {
-  std::string expected = "T2:100";
-  int text_timestamps[] = {100, kEnd};
-  GenerateTextBuffers(text_timestamps, NULL);
-  VerifyMergeSuccess(expected, true);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_OverlappingAudioVideo) {
-  std::string expected = "A0:100 V1:101 V1:102 A0:103 A0:104 V1:105";
-  int audio_timestamps[] = {100, 103, 104, kEnd};
-  GenerateAudioBuffers(audio_timestamps);
-  int video_timestamps[] = {101, 102, 105, kEnd};
-  GenerateVideoBuffers(video_timestamps);
-  VerifyMergeSuccess(expected, true);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_OverlappingMultipleText) {
-  std::string expected = "T2:100 T2:101 T3:103 T2:104 T3:105 T3:106";
-  int text_timestamps_a[] = {100, 101, 104, kEnd};
-  int text_timestamps_b[] = {103, 105, 106, kEnd};
-  GenerateTextBuffers(text_timestamps_a, text_timestamps_b);
-  VerifyMergeSuccess(expected, true);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_OverlappingAudioVideoText) {
-  std::string expected =
-      "A0:100 V1:101 T2:102 V1:103 T3:104 A0:105 V1:106 "
-      "T2:107";
-  int audio_timestamps[] = {100, 105, kEnd};
-  GenerateAudioBuffers(audio_timestamps);
-  int video_timestamps[] = {101, 103, 106, kEnd};
-  GenerateVideoBuffers(video_timestamps);
-  int text_timestamps_a[] = {102, 107, kEnd};
-  int text_timestamps_b[] = {104, kEnd};
-  GenerateTextBuffers(text_timestamps_a, text_timestamps_b);
-  VerifyMergeSuccess(expected, true);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_NonDecreasingNoCrossMediaDuplicate) {
-  std::string expected =
-      "A0:100 A0:100 A0:100 V1:101 V1:101 V1:101 A0:102 "
-      "V1:103 V1:103";
-  int audio_timestamps[] = {100, 100, 100, 102, kEnd};
-  GenerateAudioBuffers(audio_timestamps);
-  int video_timestamps[] = {101, 101, 101, 103, 103, kEnd};
-  GenerateVideoBuffers(video_timestamps);
-  VerifyMergeSuccess(expected, true);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_CrossStreamDuplicates) {
-  // Interface keeps the choice undefined of which stream's buffer wins the
-  // selection when timestamps are tied. Verify at least the right number of
-  // each kind of buffer results, and that buffers are in nondecreasing order.
-  std::string expected = "100 100 100 100 100 100 102 102 102 102 102 102 102";
-  int audio_timestamps[] = {100, 100, 100, 102, kEnd};
-  GenerateAudioBuffers(audio_timestamps);
-  int video_timestamps[] = {100, 100, 102, 102, 102, kEnd};
-  GenerateVideoBuffers(video_timestamps);
-  int text_timestamps[] = {100, 102, 102, 102, kEnd};
-  GenerateTextBuffers(text_timestamps, NULL);
-  VerifyMergeSuccess(expected, false);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_InvalidDecreasingSingleStream) {
-  int audio_timestamps[] = {101, 102, 100, 103, kEnd};
-  GenerateAudioBuffers(audio_timestamps);
-  VerifyMergeFailure();
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_InvalidDecreasingMultipleStreams) {
-  int audio_timestamps[] = {101, 102, 100, 103, kEnd};
-  GenerateAudioBuffers(audio_timestamps);
-  int video_timestamps[] = {104, 100, kEnd};
-  GenerateVideoBuffers(video_timestamps);
-  VerifyMergeFailure();
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_ValidAppendToExistingMerge) {
-  std::string expected =
-      "A0:100 V1:101 T2:102 V1:103 T3:104 A0:105 V1:106 "
-      "T2:107";
-  int audio_timestamps[] = {100, 105, kEnd};
-  GenerateAudioBuffers(audio_timestamps);
-  int video_timestamps[] = {101, 103, 106, kEnd};
-  GenerateVideoBuffers(video_timestamps);
-  int text_timestamps_a[] = {102, 107, kEnd};
-  int text_timestamps_b[] = {104, kEnd};
-  GenerateTextBuffers(text_timestamps_a, text_timestamps_b);
-  VerifyMergeSuccess(expected, true);
-
-  ClearBufferQueuesButKeepAnyMergedBuffers();
-
-  expected =
-      "A0:100 V1:101 T2:102 V1:103 T3:104 A0:105 V1:106 T2:107 "
-      "A0:107 V1:111 T2:112 V1:113 T3:114 A0:115 V1:116 T2:117";
-  int more_audio_timestamps[] = {107, 115, kEnd};
-  GenerateAudioBuffers(more_audio_timestamps);
-  int more_video_timestamps[] = {111, 113, 116, kEnd};
-  GenerateVideoBuffers(more_video_timestamps);
-  int more_text_timestamps_a[] = {112, 117, kEnd};
-  int more_text_timestamps_b[] = {114, kEnd};
-  GenerateTextBuffers(more_text_timestamps_a, more_text_timestamps_b);
-  VerifyMergeSuccess(expected, true);
-}
-
-TEST_F(StreamParserTest, MergeBufferQueues_InvalidAppendToExistingMerge) {
-  std::string expected =
-      "A0:100 V1:101 T2:102 V1:103 T3:104 A0:105 V1:106 "
-      "T2:107";
-  int audio_timestamps[] = {100, 105, kEnd};
-  GenerateAudioBuffers(audio_timestamps);
-  int video_timestamps[] = {101, 103, 106, kEnd};
-  GenerateVideoBuffers(video_timestamps);
-  int text_timestamps_a[] = {102, 107, kEnd};
-  int text_timestamps_b[] = {104, kEnd};
-  GenerateTextBuffers(text_timestamps_a, text_timestamps_b);
-  VerifyMergeSuccess(expected, true);
-
-  // Appending empty buffers to pre-existing merge result should succeed and not
-  // change the existing result.
-  ClearBufferQueuesButKeepAnyMergedBuffers();
-  VerifyMergeSuccess(expected, true);
-
-  // But appending something with a lower timestamp than the last timestamp
-  // in the pre-existing merge result should fail.
-  int more_audio_timestamps[] = {106, kEnd};
-  GenerateAudioBuffers(more_audio_timestamps);
-  VerifyMergeFailure();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/subsample_entry.h b/cobalt/media/base/subsample_entry.h
deleted file mode 100644
index dd6d81d..0000000
--- a/cobalt/media/base/subsample_entry.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 COBALT_MEDIA_BASE_SUBSAMPLE_ENTRY_H_
-#define COBALT_MEDIA_BASE_SUBSAMPLE_ENTRY_H_
-
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// The Common Encryption spec provides for subsample encryption, where portions
-// of a sample are set in cleartext. A SubsampleEntry specifies the number of
-// clear and encrypted bytes in each subsample. For decryption, all of the
-// encrypted bytes in a sample should be considered a single logical stream,
-// regardless of how they are divided into subsamples, and the clear bytes
-// should not be considered as part of decryption. This is logically equivalent
-// to concatenating all 'cypher_bytes' portions of subsamples, decrypting that
-// result, and then copying each byte from the decrypted block over the
-// position of the corresponding encrypted byte.
-struct SubsampleEntry {
-  SubsampleEntry() : clear_bytes(0), cypher_bytes(0) {}
-  SubsampleEntry(uint32_t clear_bytes, uint32_t cypher_bytes)
-      : clear_bytes(clear_bytes), cypher_bytes(cypher_bytes) {}
-  uint32_t clear_bytes;
-  uint32_t cypher_bytes;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_SUBSAMPLE_ENTRY_H_
diff --git a/cobalt/media/base/surface_manager.h b/cobalt/media/base/surface_manager.h
deleted file mode 100644
index bfb1592..0000000
--- a/cobalt/media/base/surface_manager.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 COBALT_MEDIA_BASE_SURFACE_MANAGER_H_
-#define COBALT_MEDIA_BASE_SURFACE_MANAGER_H_
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-using SurfaceCreatedCB = base::Callback<void(int)>;
-using RequestSurfaceCB = base::Callback<void(const SurfaceCreatedCB&)>;
-
-class MEDIA_EXPORT SurfaceManager {
- public:
-  enum { kNoSurfaceID = -1 };
-
-  SurfaceManager() {}
-  virtual ~SurfaceManager() {}
-
-  // Create a fullscreen surface. The id will be returned with
-  // |surface_created_cb|. If this is called more than once before the first
-  // |surface_created_cb| is called, the surface will be delivered to the last
-  // caller. If this is called after the fullscreen surface is created, the
-  // existing surface will be returned. The client should ensure that the
-  // previous consumer is no longer using the surface.
-  virtual void CreateFullscreenSurface(
-      const math::Size& video_natural_size,
-      const SurfaceCreatedCB& surface_created_cb) = 0;
-
-  // Call this when the natural size of the fullscreen video changes. The
-  // surface will be resized to match the aspect ratio.
-  virtual void NaturalSizeChanged(const math::Size& size) = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SurfaceManager);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_SURFACE_MANAGER_H_
diff --git a/cobalt/media/base/test_data_util.cc b/cobalt/media/base/test_data_util.cc
deleted file mode 100644
index 8df1317..0000000
--- a/cobalt/media/base/test_data_util.cc
+++ /dev/null
@@ -1,58 +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 "cobalt/media/base/test_data_util.h"
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/path_service.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-const base::FilePath::CharType kTestDataPath[] =
-    FILE_PATH_LITERAL("media/test/data");
-
-base::FilePath GetTestDataFilePath(const std::string& name) {
-  base::FilePath file_path;
-  CHECK(base::PathService::Get(base::DIR_TEST_DATA, &file_path));
-  return file_path.Append(GetTestDataPath()).AppendASCII(name);
-}
-
-base::FilePath GetTestDataPath() { return base::FilePath(kTestDataPath); }
-
-std::string GetURLQueryString(const base::StringPairs& query_params) {
-  std::string query = "";
-  base::StringPairs::const_iterator itr = query_params.begin();
-  for (; itr != query_params.end(); ++itr) {
-    if (itr != query_params.begin()) query.append("&");
-    query.append(itr->first + "=" + itr->second);
-  }
-  return query;
-}
-
-scoped_refptr<DecoderBuffer> ReadTestDataFile(const std::string& name) {
-  base::FilePath file_path = GetTestDataFilePath(name);
-
-  int64_t tmp = 0;
-  CHECK(base::GetFileSize(file_path, &tmp))
-      << "Failed to get file size for '" << name << "'";
-
-  int file_size = base::checked_cast<int>(tmp);
-
-  scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(file_size));
-  CHECK_EQ(file_size,
-           base::ReadFile(file_path,
-                          reinterpret_cast<char*>(buffer->writable_data()),
-                          file_size))
-      << "Failed to read '" << name << "'";
-
-  return buffer;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/test_data_util.h b/cobalt/media/base/test_data_util.h
deleted file mode 100644
index ef19a2a..0000000
--- a/cobalt/media/base/test_data_util.h
+++ /dev/null
@@ -1,42 +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 COBALT_MEDIA_BASE_TEST_DATA_UTIL_H_
-#define COBALT_MEDIA_BASE_TEST_DATA_UTIL_H_
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/string_split.h"
-
-namespace cobalt {
-namespace media {
-
-class DecoderBuffer;
-
-// Returns a file path for a file in the media/test/data directory.
-base::FilePath GetTestDataFilePath(const std::string& name);
-
-// Returns relative path for test data folder: media/test/data.
-base::FilePath GetTestDataPath();
-
-// Returns a string containing key value query params in the form of:
-// "key_1=value_1&key_2=value2"
-std::string GetURLQueryString(const base::StringPairs& query_params);
-
-// Reads a test file from media/test/data directory and stores it in
-// a DecoderBuffer.  Use DecoderBuffer vs DataBuffer to ensure no matter
-// what a test does, it's safe to use FFmpeg methods.
-//
-//  |name| - The name of the file.
-//  |buffer| - The contents of the file.
-scoped_refptr<DecoderBuffer> ReadTestDataFile(const std::string& name);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TEST_DATA_UTIL_H_
diff --git a/cobalt/media/base/test_helpers.cc b/cobalt/media/base/test_helpers.cc
deleted file mode 100644
index b0a3dc0..0000000
--- a/cobalt/media/base/test_helpers.cc
+++ /dev/null
@@ -1,268 +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 "cobalt/media/base/test_helpers.h"
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/pickle.h"
-#include "base/run_loop.h"
-#include "base/test/test_timeouts.h"
-#include "base/time/time.h"
-#include "base/timer/timer.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/media/base/audio_buffer.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_util.h"
-#include "starboard/types.h"
-
-using ::testing::_;
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-// Utility mock for testing methods expecting Closures and PipelineStatusCBs.
-class MockCallback : public base::RefCountedThreadSafe<MockCallback> {
- public:
-  MockCallback();
-  MOCK_METHOD0(Run, void());
-  MOCK_METHOD1(RunWithBool, void(bool));
-  MOCK_METHOD1(RunWithStatus, void(PipelineStatus));
-
- protected:
-  friend class base::RefCountedThreadSafe<MockCallback>;
-  virtual ~MockCallback();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-MockCallback::MockCallback() {}
-MockCallback::~MockCallback() {}
-
-base::Closure NewExpectedClosure() {
-  StrictMock<MockCallback>* callback = new StrictMock<MockCallback>();
-  EXPECT_CALL(*callback, Run());
-  return base::Bind(&MockCallback::Run, callback);
-}
-
-base::Callback<void(bool)> NewExpectedBoolCB(bool success) {
-  StrictMock<MockCallback>* callback = new StrictMock<MockCallback>();
-  EXPECT_CALL(*callback, RunWithBool(success));
-  return base::Bind(&MockCallback::RunWithBool, callback);
-}
-
-PipelineStatusCB NewExpectedStatusCB(PipelineStatus status) {
-  StrictMock<MockCallback>* callback = new StrictMock<MockCallback>();
-  EXPECT_CALL(*callback, RunWithStatus(status));
-  return base::Bind(&MockCallback::RunWithStatus, callback);
-}
-
-Waitablebase::MessageLoopEvent::Waitablebase::MessageLoopEvent()
-    : Waitablebase::MessageLoopEvent(TestTimeouts::action_timeout()) {}
-
-Waitablebase::MessageLoopEvent::Waitablebase::MessageLoopEvent(
-    base::TimeDelta timeout)
-    : signaled_(false), status_(PIPELINE_OK), timeout_(timeout) {}
-
-Waitablebase::MessageLoopEvent::~Waitablebase::MessageLoopEvent() {
-  DCHECK(CalledOnValidThread());
-}
-
-base::Closure Waitablebase::MessageLoopEvent::GetClosure() {
-  DCHECK(CalledOnValidThread());
-  return BindToCurrentLoop(
-      base::Bind(&Waitablebase::MessageLoopEvent::OnCallback,
-                 base::Unretained(this), PIPELINE_OK));
-}
-
-PipelineStatusCB Waitablebase::MessageLoopEvent::GetPipelineStatusCB() {
-  DCHECK(CalledOnValidThread());
-  return BindToCurrentLoop(base::Bind(
-      &Waitablebase::MessageLoopEvent::OnCallback, base::Unretained(this)));
-}
-
-void Waitablebase::MessageLoopEvent::RunAndWait() {
-  DCHECK(CalledOnValidThread());
-  RunAndWaitForStatus(PIPELINE_OK);
-}
-
-void Waitablebase::MessageLoopEvent::RunAndWaitForStatus(
-    PipelineStatus expected) {
-  DCHECK(CalledOnValidThread());
-  if (signaled_) {
-    EXPECT_EQ(expected, status_);
-    return;
-  }
-
-  run_loop_.reset(new base::RunLoop());
-  base::OneShotTimer timer;
-  timer.Start(FROM_HERE, timeout_,
-              base::Bind(&Waitablebase::MessageLoopEvent::OnTimeout,
-                         base::Unretained(this)));
-
-  run_loop_->Run();
-  EXPECT_TRUE(signaled_);
-  EXPECT_EQ(expected, status_);
-  run_loop_.reset();
-}
-
-void Waitablebase::MessageLoopEvent::OnCallback(PipelineStatus status) {
-  DCHECK(CalledOnValidThread());
-  signaled_ = true;
-  status_ = status;
-
-  // |run_loop_| may be null if the callback fires before RunAndWaitForStatus().
-  if (run_loop_) run_loop_->Quit();
-}
-
-void Waitablebase::MessageLoopEvent::OnTimeout() {
-  DCHECK(CalledOnValidThread());
-  ADD_FAILURE() << "Timed out waiting for message loop to quit";
-  run_loop_->Quit();
-}
-
-static VideoDecoderConfig GetTestConfig(VideoCodec codec, math::Size coded_size,
-                                        bool is_encrypted) {
-  math::Rect visible_rect(coded_size.width(), coded_size.height());
-  math::Size natural_size = coded_size;
-
-  return VideoDecoderConfig(
-      codec, VIDEO_CODEC_PROFILE_UNKNOWN, PIXEL_FORMAT_YV12,
-      COLOR_SPACE_UNSPECIFIED, coded_size, visible_rect, natural_size,
-      EmptyExtraData(),
-      is_encrypted ? AesCtrEncryptionScheme() : Unencrypted());
-}
-
-static const math::Size kNormalSize(320, 240);
-static const math::Size kLargeSize(640, 480);
-
-// static
-VideoDecoderConfig TestVideoConfig::Invalid() {
-  return GetTestConfig(kUnknownVideoCodec, kNormalSize, false);
-}
-
-// static
-VideoDecoderConfig TestVideoConfig::Normal() {
-  return GetTestConfig(kCodecVP8, kNormalSize, false);
-}
-
-// static
-VideoDecoderConfig TestVideoConfig::NormalEncrypted() {
-  return GetTestConfig(kCodecVP8, kNormalSize, true);
-}
-
-// static
-VideoDecoderConfig TestVideoConfig::Large() {
-  return GetTestConfig(kCodecVP8, kLargeSize, false);
-}
-
-// static
-VideoDecoderConfig TestVideoConfig::LargeEncrypted() {
-  return GetTestConfig(kCodecVP8, kLargeSize, true);
-}
-
-// static
-math::Size TestVideoConfig::NormalCodedSize() { return kNormalSize; }
-
-// static
-math::Size TestVideoConfig::LargeCodedSize() { return kLargeSize; }
-
-// static
-AudioParameters TestAudioParameters::Normal() {
-  return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                         CHANNEL_LAYOUT_STEREO, 48000, 16, 2048);
-}
-
-template <class T>
-scoped_refptr<AudioBuffer> MakeAudioBuffer(SampleFormat format,
-                                           ChannelLayout channel_layout,
-                                           size_t channel_count,
-                                           int sample_rate, T start,
-                                           T increment, size_t frames,
-                                           base::TimeDelta timestamp) {
-  const size_t channels = ChannelLayoutToChannelCount(channel_layout);
-  scoped_refptr<AudioBuffer> output = AudioBuffer::CreateBuffer(
-      format, channel_layout, static_cast<int>(channel_count), sample_rate,
-      static_cast<int>(frames));
-  output->set_timestamp(timestamp);
-
-  const bool is_planar =
-      format == kSampleFormatPlanarS16 || format == kSampleFormatPlanarF32;
-
-  // Values in channel 0 will be:
-  //   start
-  //   start + increment
-  //   start + 2 * increment, ...
-  // While, values in channel 1 will be:
-  //   start + frames * increment
-  //   start + (frames + 1) * increment
-  //   start + (frames + 2) * increment, ...
-  for (size_t ch = 0; ch < channels; ++ch) {
-    T* buffer =
-        reinterpret_cast<T*>(output->channel_data()[is_planar ? ch : 0]);
-    const T v = static_cast<T>(start + ch * frames * increment);
-    for (size_t i = 0; i < frames; ++i) {
-      buffer[is_planar ? i : ch + i * channels] =
-          static_cast<T>(v + i * increment);
-    }
-  }
-  return output;
-}
-
-// Instantiate all the types of MakeAudioBuffer() and
-// MakeAudioBuffer() needed.
-#define DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(type)                                \
-  template scoped_refptr<AudioBuffer> MakeAudioBuffer<type>(                   \
-      SampleFormat format, ChannelLayout channel_layout, size_t channel_count, \
-      int sample_rate, type start, type increment, size_t frames,              \
-      base::TimeDelta start_time)
-DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(uint8_t);
-DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(int16_t);
-DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(int32_t);
-DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(float);
-
-static const char kFakeVideoBufferHeader[] = "FakeVideoBufferForTest";
-
-scoped_refptr<DecoderBuffer> CreateFakeVideoBufferForTest(
-    const VideoDecoderConfig& config, base::TimeDelta timestamp,
-    base::TimeDelta duration) {
-  base::Pickle pickle;
-  pickle.WriteString(kFakeVideoBufferHeader);
-  pickle.WriteInt(config.coded_size().width());
-  pickle.WriteInt(config.coded_size().height());
-  pickle.WriteInt64(timestamp.InMilliseconds());
-
-  scoped_refptr<DecoderBuffer> buffer =
-      DecoderBuffer::CopyFrom(static_cast<const uint8_t*>(pickle.data()),
-                              static_cast<int>(pickle.size()));
-  DCHECK(buffer);
-  buffer->set_timestamp(timestamp);
-  buffer->set_duration(duration);
-  buffer->set_is_key_frame(true);
-
-  return buffer;
-}
-
-bool VerifyFakeVideoBufferForTest(const scoped_refptr<DecoderBuffer>& buffer,
-                                  const VideoDecoderConfig& config) {
-  // Check if the input |buffer| matches the |config|.
-  base::PickleIterator pickle(
-      base::Pickle(reinterpret_cast<const char*>(buffer->data()),
-                   static_cast<int>(buffer->data_size())));
-  std::string header;
-  int width = 0;
-  int height = 0;
-  bool success = pickle.ReadString(&header) && pickle.ReadInt(&width) &&
-                 pickle.ReadInt(&height);
-  return (success && header == kFakeVideoBufferHeader &&
-          width == config.coded_size().width() &&
-          height == config.coded_size().height());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/test_helpers.h b/cobalt/media/base/test_helpers.h
deleted file mode 100644
index f152d29..0000000
--- a/cobalt/media/base/test_helpers.h
+++ /dev/null
@@ -1,243 +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 COBALT_MEDIA_BASE_TEST_HELPERS_H_
-#define COBALT_MEDIA_BASE_TEST_HELPERS_H_
-
-#include <memory>
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/threading/non_thread_safe.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/audio_parameters.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "cobalt/media/base/sample_format.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace base {
-class RunLoop;
-class TimeDelta;
-}  // namespace base
-
-namespace cobalt {
-namespace media {
-
-class AudioBuffer;
-class DecoderBuffer;
-
-// Return a callback that expects to be run once.
-base::Closure NewExpectedClosure();
-base::Callback<void(bool)> NewExpectedBoolCB(bool success);
-PipelineStatusCB NewExpectedStatusCB(PipelineStatus status);
-
-// Helper class for running a message loop until a callback has run. Useful for
-// testing classes that run on more than a single thread.
-//
-// Events are intended for single use and cannot be reset.
-class Waitablebase::MessageLoopEvent : public base::NonThreadSafe {
- public:
-  Waitablebase::MessageLoopEvent();
-  explicit Waitablebase::MessageLoopEvent(base::TimeDelta timeout);
-  ~Waitablebase::MessageLoopEvent();
-
-  // Returns a thread-safe closure that will signal |this| when executed.
-  base::Closure GetClosure();
-  PipelineStatusCB GetPipelineStatusCB();
-
-  // Runs the current message loop until |this| has been signaled.
-  //
-  // Fails the test if the timeout is reached.
-  void RunAndWait();
-
-  // Runs the current message loop until |this| has been signaled and asserts
-  // that the |expected| status was received.
-  //
-  // Fails the test if the timeout is reached.
-  void RunAndWaitForStatus(PipelineStatus expected);
-
-  bool is_signaled() const { return signaled_; }
-
- private:
-  void OnCallback(PipelineStatus status);
-  void OnTimeout();
-
-  bool signaled_;
-  PipelineStatus status_;
-  std::unique_ptr<base::RunLoop> run_loop_;
-  const base::TimeDelta timeout_;
-
-  DISALLOW_COPY_AND_ASSIGN(Waitablebase::MessageLoopEvent);
-};
-
-// Provides pre-canned VideoDecoderConfig. These types are used for tests that
-// don't care about detailed parameters of the config.
-class TestVideoConfig {
- public:
-  // Returns a configuration that is invalid.
-  static VideoDecoderConfig Invalid();
-
-  static VideoDecoderConfig Normal();
-  static VideoDecoderConfig NormalEncrypted();
-
-  // Returns a configuration that is larger in dimensions than Normal().
-  static VideoDecoderConfig Large();
-  static VideoDecoderConfig LargeEncrypted();
-
-  // Returns coded size for Normal and Large config.
-  static math::Size NormalCodedSize();
-  static math::Size LargeCodedSize();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestVideoConfig);
-};
-
-// Provides pre-canned AudioParameters objects.
-class TestAudioParameters {
- public:
-  static AudioParameters Normal();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestAudioParameters);
-};
-
-// Create an AudioBuffer containing |frames| frames of data, where each sample
-// is of type T.  |start| and |increment| are used to specify the values for the
-// samples, which are created in channel order.  The value for frame and channel
-// is determined by:
-//
-//   |start| + |channel| * |frames| * |increment| + index * |increment|
-//
-// E.g., for a stereo buffer the values in channel 0 will be:
-//   start
-//   start + increment
-//   start + 2 * increment, ...
-//
-// While, values in channel 1 will be:
-//   start + frames * increment
-//   start + (frames + 1) * increment
-//   start + (frames + 2) * increment, ...
-//
-// |start_time| will be used as the start time for the samples.
-template <class T>
-scoped_refptr<AudioBuffer> MakeAudioBuffer(SampleFormat format,
-                                           ChannelLayout channel_layout,
-                                           size_t channel_count,
-                                           int sample_rate, T start,
-                                           T increment, size_t frames,
-                                           base::TimeDelta timestamp);
-
-// Create a fake video DecoderBuffer for testing purpose. The buffer contains
-// part of video decoder config info embedded so that the testing code can do
-// some sanity check.
-scoped_refptr<DecoderBuffer> CreateFakeVideoBufferForTest(
-    const VideoDecoderConfig& config, base::TimeDelta timestamp,
-    base::TimeDelta duration);
-
-// Verify if a fake video DecoderBuffer is valid.
-bool VerifyFakeVideoBufferForTest(const scoped_refptr<DecoderBuffer>& buffer,
-                                  const VideoDecoderConfig& config);
-
-MATCHER_P(HasTimestamp, timestamp_in_ms, "") {
-  return arg.get() && !arg->end_of_stream() &&
-         arg->timestamp().InMilliseconds() == timestamp_in_ms;
-}
-
-MATCHER(IsEndOfStream, "") { return arg.get() && arg->end_of_stream(); }
-
-MATCHER_P(SegmentMissingFrames, track_id, "") {
-  return CONTAINS_STRING(
-      arg, "Media segment did not contain any coded frames for track " +
-               std::string(track_id));
-}
-
-MATCHER(StreamParsingFailed, "") {
-  return CONTAINS_STRING(arg, "Append: stream parsing failed.");
-}
-
-MATCHER_P(FoundStream, stream_type_string, "") {
-  return CONTAINS_STRING(
-             arg, "found_" + std::string(stream_type_string) + "_stream") &&
-         CONTAINS_STRING(arg, "true");
-}
-
-MATCHER_P2(CodecName, stream_type_string, codec_string, "") {
-  return CONTAINS_STRING(arg,
-                         std::string(stream_type_string) + "_codec_name") &&
-         CONTAINS_STRING(arg, std::string(codec_string));
-}
-
-MATCHER_P2(InitSegmentMismatchesMimeType, stream_type, codec_name, "") {
-  return CONTAINS_STRING(arg, std::string(stream_type) + " stream codec " +
-                                  std::string(codec_name) +
-                                  " doesn't match SourceBuffer codecs.");
-}
-
-MATCHER_P(InitSegmentMissesExpectedTrack, missing_codec, "") {
-  return CONTAINS_STRING(arg, "Initialization segment misses expected " +
-                                  std::string(missing_codec) + " track.");
-}
-
-MATCHER_P2(UnexpectedTrack, track_type, id, "") {
-  return CONTAINS_STRING(arg, std::string("Got unexpected ") + track_type +
-                                  " track track_id=" + id);
-}
-
-MATCHER_P2(GeneratedSplice, duration_microseconds, time_microseconds, "") {
-  return CONTAINS_STRING(arg, "Generated splice of overlap duration " +
-                                  base::IntToString(duration_microseconds) +
-                                  "us into new buffer at " +
-                                  base::IntToString(time_microseconds) + "us.");
-}
-
-MATCHER_P2(SkippingSpliceAtOrBefore, new_microseconds, existing_microseconds,
-           "") {
-  return CONTAINS_STRING(
-      arg, "Skipping splice frame generation: first new buffer at " +
-               base::IntToString(new_microseconds) +
-               "us begins at or before existing buffer at " +
-               base::IntToString(existing_microseconds) + "us.");
-}
-
-MATCHER_P(SkippingSpliceAlreadySpliced, time_microseconds, "") {
-  return CONTAINS_STRING(
-      arg, "Skipping splice frame generation: overlapped buffers at " +
-               base::IntToString(time_microseconds) +
-               "us are in a previously buffered splice.");
-}
-
-MATCHER_P(WebMSimpleBlockDurationEstimated, estimated_duration_ms, "") {
-  return CONTAINS_STRING(arg, "Estimating WebM block duration to be " +
-                                  base::IntToString(estimated_duration_ms) +
-                                  "ms for the last (Simple)Block in the "
-                                  "Cluster for this Track. Use BlockGroups "
-                                  "with BlockDurations at the end of each "
-                                  "Track in a Cluster to avoid estimation.");
-}
-
-MATCHER_P(WebMNegativeTimecodeOffset, timecode_string, "") {
-  return CONTAINS_STRING(arg, "Got a block with negative timecode offset " +
-                                  std::string(timecode_string));
-}
-
-MATCHER(WebMOutOfOrderTimecode, "") {
-  return CONTAINS_STRING(
-      arg, "Got a block with a timecode before the previous block.");
-}
-
-MATCHER(WebMClusterBeforeFirstInfo, "") {
-  return CONTAINS_STRING(arg, "Found Cluster element before Info.");
-}
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TEST_HELPERS_H_
diff --git a/cobalt/media/base/test_random.h b/cobalt/media/base/test_random.h
deleted file mode 100644
index 78ab406..0000000
--- a/cobalt/media/base/test_random.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_TEST_RANDOM_H_
-#define COBALT_MEDIA_BASE_TEST_RANDOM_H_
-
-#include "base/logging.h"
-#include "starboard/types.h"
-
-// Vastly simplified ACM random class meant to only be used for testing.
-// This class is meant to generate predictable sequences of pseudorandom
-// numbers, unlike the classes in base/rand_util.h which are meant to generate
-// unpredictable sequences.
-// See
-// https://code.google.com/p/szl/source/browse/trunk/src/utilities/acmrandom.h
-// for more information.
-
-namespace cobalt {
-namespace media {
-
-class TestRandom {
- public:
-  explicit TestRandom(uint32_t seed) {
-    seed_ = seed & 0x7fffffff;  // make this a non-negative number
-    if (seed_ == 0 || seed_ == M) {
-      seed_ = 1;
-    }
-  }
-
-  int32_t Rand() {
-    static const uint64_t A = 16807;  // bits 14, 8, 7, 5, 2, 1, 0
-    seed_ = static_cast<int32_t>((seed_ * A) % M);
-    CHECK_GT(seed_, 0);
-    return seed_;
-  }
-
- private:
-  static const uint64_t M = 2147483647L;  // 2^32-1
-  int32_t seed_;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TEST_RANDOM_H_
diff --git a/cobalt/media/base/text_cue.cc b/cobalt/media/base/text_cue.cc
deleted file mode 100644
index 9fa16be..0000000
--- a/cobalt/media/base/text_cue.cc
+++ /dev/null
@@ -1,22 +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 "cobalt/media/base/text_cue.h"
-
-namespace cobalt {
-namespace media {
-
-TextCue::TextCue(const base::TimeDelta& timestamp,
-                 const base::TimeDelta& duration, const std::string& id,
-                 const std::string& settings, const std::string& text)
-    : timestamp_(timestamp),
-      duration_(duration),
-      id_(id),
-      settings_(settings),
-      text_(text) {}
-
-TextCue::~TextCue() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/text_cue.h b/cobalt/media/base/text_cue.h
deleted file mode 100644
index dfe4ee4..0000000
--- a/cobalt/media/base/text_cue.h
+++ /dev/null
@@ -1,48 +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 COBALT_MEDIA_BASE_TEXT_CUE_H_
-#define COBALT_MEDIA_BASE_TEXT_CUE_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// A text buffer to carry the components of a text track cue.
-class MEDIA_EXPORT TextCue : public base::RefCountedThreadSafe<TextCue> {
- public:
-  TextCue(const base::TimeDelta& timestamp, const base::TimeDelta& duration,
-          const std::string& id, const std::string& settings,
-          const std::string& text);
-
-  // Access to constructor parameters.
-  base::TimeDelta timestamp() const { return timestamp_; }
-  base::TimeDelta duration() const { return duration_; }
-  const std::string& id() const { return id_; }
-  const std::string& settings() const { return settings_; }
-  const std::string& text() const { return text_; }
-
- private:
-  friend class base::RefCountedThreadSafe<TextCue>;
-  ~TextCue();
-
-  base::TimeDelta timestamp_;
-  base::TimeDelta duration_;
-  std::string id_;
-  std::string settings_;
-  std::string text_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(TextCue);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TEXT_CUE_H_
diff --git a/cobalt/media/base/text_ranges.cc b/cobalt/media/base/text_ranges.cc
deleted file mode 100644
index 58c1742..0000000
--- a/cobalt/media/base/text_ranges.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/base/text_ranges.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-TextRanges::TextRanges() { Reset(); }
-
-TextRanges::~TextRanges() {}
-
-void TextRanges::Reset() { curr_range_itr_ = range_map_.end(); }
-
-bool TextRanges::AddCue(base::TimeDelta start_time) {
-  typedef RangeMap::iterator Itr;
-
-  if (curr_range_itr_ == range_map_.end()) {
-    // There is no active time range, so this is the first AddCue()
-    // attempt that follows a Reset().
-
-    if (range_map_.empty()) {
-      NewRange(start_time);
-      return true;
-    }
-
-    if (start_time < range_map_.begin()->first) {
-      NewRange(start_time);
-      return true;
-    }
-
-    const Itr itr = --Itr(range_map_.upper_bound(start_time));
-    DCHECK(start_time >= itr->first);
-
-    Range& range = itr->second;
-
-    if (start_time > range.last_time()) {
-      NewRange(start_time);
-      return true;
-    }
-
-    range.ResetCount(start_time);
-    curr_range_itr_ = itr;
-    return false;
-  }
-
-  DCHECK(start_time >= curr_range_itr_->first);
-
-  Range& curr_range = curr_range_itr_->second;
-
-  if (start_time <= curr_range.last_time())
-    return curr_range.AddCue(start_time);
-
-  const Itr next_range_itr = ++Itr(curr_range_itr_);
-
-  if (next_range_itr != range_map_.end()) {
-    DCHECK(next_range_itr->first > curr_range.last_time());
-    DCHECK(start_time <= next_range_itr->first);
-
-    if (start_time == next_range_itr->first) {
-      // We have walked off the current range, and onto the next one.
-      // There is now no ambiguity about where the current time range
-      // ends, and so we coalesce the current and next ranges.
-
-      Merge(next_range_itr, &curr_range);
-      return false;
-    }
-  }
-
-  // Either |curr_range| is the last range in the map, or there is a
-  // next range beyond |curr_range|, but its start time is ahead of
-  // this cue's start time.  In either case, this cue becomes the new
-  // last_time for |curr_range|.  Eventually we will see a cue whose
-  // time matches the start time of the next range, in which case we
-  // coalesce the current and next ranges.
-
-  curr_range.SetLastTime(start_time);
-  return true;
-}
-
-size_t TextRanges::RangeCountForTesting() const { return range_map_.size(); }
-
-void TextRanges::NewRange(base::TimeDelta start_time) {
-  Range range;
-  range.SetLastTime(start_time);
-
-  std::pair<RangeMap::iterator, bool> result =
-      range_map_.insert(std::make_pair(start_time, range));
-  DCHECK(result.second);
-
-  curr_range_itr_ = result.first;
-}
-
-void TextRanges::Merge(const RangeMap::iterator& next_range_itr,
-                       Range* curr_range) {
-  DCHECK(curr_range);
-  *curr_range = next_range_itr->second;
-  curr_range->ResetCount(next_range_itr->first);
-  range_map_.erase(next_range_itr);
-}
-
-void TextRanges::Range::ResetCount(base::TimeDelta start_time) {
-  count_ = (start_time < last_time_) ? 0 : 1;
-}
-
-void TextRanges::Range::SetLastTime(base::TimeDelta last_time) {
-  last_time_ = last_time;
-  count_ = 1;
-  max_count_ = 1;
-}
-
-bool TextRanges::Range::AddCue(base::TimeDelta start_time) {
-  if (start_time < last_time_) {
-    DCHECK_EQ(count_, 0);
-    return false;
-  }
-
-  DCHECK(start_time == last_time_);
-
-  ++count_;
-  if (count_ <= max_count_) return false;
-
-  ++max_count_;
-  return true;
-}
-
-base::TimeDelta TextRanges::Range::last_time() const { return last_time_; }
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/text_ranges.h b/cobalt/media/base/text_ranges.h
deleted file mode 100644
index 8799547..0000000
--- a/cobalt/media/base/text_ranges.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_TEXT_RANGES_H_
-#define COBALT_MEDIA_BASE_TEXT_RANGES_H_
-
-#include <map>
-
-#include "base/basictypes.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Helper class used by the TextRenderer to filter out text cues that
-// have already been passed downstream.
-class MEDIA_EXPORT TextRanges {
- public:
-  TextRanges();
-  ~TextRanges();
-
-  // Reset the current range pointer, such that we bind to a new range
-  // (either one that exists already, or one that is freshly-created)
-  // during the next AddCue().
-  void Reset();
-
-  // Given a cue with starting timestamp |start_time|, add its start
-  // time to the time ranges. (Note that following a Reset(), cue
-  // times are assumed to be monotonically increasing.) If this time
-  // has already been added to the time ranges, then AddCue() returns
-  // false and clients should not push the cue downstream. Otherwise,
-  // the time is added to the time ranges and AddCue() returns true,
-  // meaning that the cue should be pushed downstream.
-  bool AddCue(base::TimeDelta start_time);
-
-  // Returns a count of the number of time ranges, intended for use by
-  // the unit test module to vet proper time range merge behavior.
-  size_t RangeCountForTesting() const;
-
- private:
-  // Describes a range of times for cues that have already been
-  // pushed downstream.
-  class Range {
-   public:
-    // Initialize last_time count.
-    void ResetCount(base::TimeDelta start_time);
-
-    // Set last_time and associated counts.
-    void SetLastTime(base::TimeDelta last_time);
-
-    // Adjust time range state to mark the cue as having been seen,
-    // returning true if we have not seen |start_time| already and
-    // false otherwise.
-    bool AddCue(base::TimeDelta start_time);
-
-    // Returns the value of the last time in the range.
-    base::TimeDelta last_time() const;
-
-   private:
-    // The last timestamp of this range.
-    base::TimeDelta last_time_;
-
-    // The number of cues we have detected so far, for this range,
-    // whose timestamp matches last_time.
-    int max_count_;
-
-    // The number of cues we have seen since the most recent Reset(),
-    // whose timestamp matches last_time.
-    int count_;
-  };
-
-  typedef std::map<base::TimeDelta, Range> RangeMap;
-
-  // NewRange() is used to create a new time range when AddCue() is
-  // called immediately following a Reset(), and no existing time
-  // range contains the indicated |start_time| of the cue.
-  void NewRange(base::TimeDelta start_time);
-
-  // Coalesce curr_range with the range that immediately follows.
-  void Merge(const RangeMap::iterator& next_range_itr, Range* curr_range);
-
-  // The collection of time ranges, each of which is bounded
-  // (inclusive) by the key and Range::last_time.
-  RangeMap range_map_;
-
-  // The time range to which we bind following a Reset().
-  RangeMap::iterator curr_range_itr_;
-
-  DISALLOW_COPY_AND_ASSIGN(TextRanges);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TEXT_RANGES_H_
diff --git a/cobalt/media/base/text_ranges_unittest.cc b/cobalt/media/base/text_ranges_unittest.cc
deleted file mode 100644
index 5ecd040..0000000
--- a/cobalt/media/base/text_ranges_unittest.cc
+++ /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.
-
-#include "cobalt/media/base/text_ranges.h"
-
-#include "base/time/time.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class TextRangesTest : public ::testing::Test {
- protected:
-  bool AddCue(int seconds) {
-    return ranges_.AddCue(base::TimeDelta::FromSeconds(seconds));
-  }
-
-  void Reset() { ranges_.Reset(); }
-
-  size_t RangeCount() { return ranges_.RangeCountForTesting(); }
-
-  TextRanges ranges_;
-};
-
-TEST_F(TextRangesTest, TestEmptyRanges) {
-  // Create a new active range, with t=5.
-  EXPECT_TRUE(AddCue(5));
-
-  // Create a new active range, with t=2.
-  Reset();
-  EXPECT_TRUE(AddCue(2));
-
-  // Create a new active range, with t=8.
-  Reset();
-  EXPECT_TRUE(AddCue(8));
-
-  Reset();
-
-  // Make range [2, 2] active.
-  EXPECT_FALSE(AddCue(2));
-  EXPECT_EQ(RangeCount(), 3U);
-
-  // Coalesce first two ranges: [2, 5].
-  EXPECT_FALSE(AddCue(5));
-  EXPECT_EQ(RangeCount(), 2U);
-
-  // Coalesce first two ranges: [2, 8].
-  EXPECT_FALSE(AddCue(8));
-  EXPECT_EQ(RangeCount(), 1U);
-
-  // Add new cue to end of (only) range.
-  EXPECT_TRUE(AddCue(9));
-  EXPECT_EQ(RangeCount(), 1U);
-}
-
-TEST_F(TextRangesTest, TestOneRange) {
-  // Create a new active range, with t=0.
-  EXPECT_TRUE(AddCue(0));
-
-  // Add cues to end of existing range.
-  EXPECT_TRUE(AddCue(1));
-  EXPECT_TRUE(AddCue(4));
-
-  Reset();
-  EXPECT_FALSE(AddCue(2));
-  EXPECT_FALSE(AddCue(3));
-  EXPECT_FALSE(AddCue(4));
-}
-
-TEST_F(TextRangesTest, TestDuplicateLast) {
-  // Create a new active range, with t=0.
-  EXPECT_TRUE(AddCue(0));
-  EXPECT_TRUE(AddCue(1));
-
-  Reset();
-  EXPECT_FALSE(AddCue(1));
-  EXPECT_TRUE(AddCue(1));
-}
-
-TEST_F(TextRangesTest, TestTwoRanges) {
-  // Create a new active range, with t=0.
-  EXPECT_TRUE(AddCue(0));
-
-  // Add cue to end of existing range.
-  EXPECT_TRUE(AddCue(2));
-
-  Reset();
-
-  // Create a new active range, with t=4.
-  EXPECT_TRUE(AddCue(4));
-
-  // Add a new cue to end of last (active) range.
-  EXPECT_TRUE(AddCue(5));
-
-  Reset();
-
-  // Make first range active.
-  EXPECT_FALSE(AddCue(0));
-  EXPECT_FALSE(AddCue(2));
-
-  // Expand first range.
-  EXPECT_TRUE(AddCue(3));
-
-  // Coalesce first and second ranges.
-  EXPECT_FALSE(AddCue(4));
-  EXPECT_EQ(RangeCount(), 1U);
-}
-
-TEST_F(TextRangesTest, TestThreeRanges) {
-  // Create a new active range, with t=0.
-  EXPECT_TRUE(AddCue(0));
-
-  // Add cue to end of existing range.
-  EXPECT_TRUE(AddCue(2));
-
-  Reset();
-
-  // Create a new active range, with t=4.
-  EXPECT_TRUE(AddCue(4));
-
-  // Add a new cue to end of last (active) range.
-  EXPECT_TRUE(AddCue(5));
-
-  Reset();
-
-  // Create a new active range, in between the other two.
-  EXPECT_TRUE(AddCue(3));
-
-  // Coalesce middle and last ranges.
-  EXPECT_FALSE(AddCue(4));
-
-  Reset();
-
-  // Make first range active.
-  EXPECT_FALSE(AddCue(0));
-  EXPECT_FALSE(AddCue(2));
-
-  // Coalesce first and last ranges.
-  EXPECT_FALSE(AddCue(3));
-  EXPECT_EQ(RangeCount(), 1U);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/text_renderer.cc b/cobalt/media/base/text_renderer.cc
deleted file mode 100644
index 74a4869..0000000
--- a/cobalt/media/base/text_renderer.cc
+++ /dev/null
@@ -1,314 +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 "cobalt/media/base/text_renderer.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/logging.h"
-#include "base/single_thread_task_runner.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer.h"
-#include "cobalt/media/base/text_cue.h"
-#include "starboard/common/string.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-TextRenderer::TextRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-    const AddTextTrackCB& add_text_track_cb)
-    : task_runner_(task_runner),
-      add_text_track_cb_(add_text_track_cb),
-      state_(kUninitialized),
-      pending_read_count_(0),
-      weak_factory_(this) {}
-
-TextRenderer::~TextRenderer() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  text_track_state_map_.clear();
-  if (!pause_cb_.is_null()) base::ResetAndReturn(&pause_cb_).Run();
-}
-
-void TextRenderer::Initialize(const base::Closure& ended_cb) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(!ended_cb.is_null());
-  DCHECK_EQ(kUninitialized, state_) << "state_ " << state_;
-  DCHECK(text_track_state_map_.empty());
-  DCHECK_EQ(pending_read_count_, 0);
-  DCHECK(pending_eos_set_.empty());
-  DCHECK(ended_cb_.is_null());
-
-  ended_cb_ = ended_cb;
-  state_ = kPaused;
-}
-
-void TextRenderer::StartPlaying() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, kPaused) << "state_ " << state_;
-
-  for (auto itr = text_track_state_map_.begin();
-       itr != text_track_state_map_.end(); ++itr) {
-    TextTrackState* state = itr->second.get();
-    if (state->read_state == TextTrackState::kReadPending) {
-      DCHECK_GT(pending_read_count_, 0);
-      continue;
-    }
-
-    Read(state, itr->first);
-  }
-
-  state_ = kPlaying;
-}
-
-void TextRenderer::Pause(const base::Closure& callback) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(state_ == kPlaying || state_ == kEnded) << "state_ " << state_;
-  DCHECK_GE(pending_read_count_, 0);
-
-  if (pending_read_count_ == 0) {
-    state_ = kPaused;
-    task_runner_->PostTask(FROM_HERE, callback);
-    return;
-  }
-
-  pause_cb_ = callback;
-  state_ = kPausePending;
-}
-
-void TextRenderer::Flush(const base::Closure& callback) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(pending_read_count_, 0);
-  DCHECK(state_ == kPaused) << "state_ " << state_;
-
-  for (auto itr = text_track_state_map_.begin();
-       itr != text_track_state_map_.end(); ++itr) {
-    pending_eos_set_.insert(itr->first);
-    itr->second->text_ranges_.Reset();
-  }
-  DCHECK_EQ(pending_eos_set_.size(), text_track_state_map_.size());
-  task_runner_->PostTask(FROM_HERE, callback);
-}
-
-void TextRenderer::AddTextStream(DemuxerStream* text_stream,
-                                 const TextTrackConfig& config) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(state_ != kUninitialized) << "state_ " << state_;
-  DCHECK(text_track_state_map_.find(text_stream) ==
-         text_track_state_map_.end());
-  DCHECK(pending_eos_set_.find(text_stream) == pending_eos_set_.end());
-
-  AddTextTrackDoneCB done_cb =
-      BindToCurrentLoop(base::Bind(&TextRenderer::OnAddTextTrackDone,
-                                   weak_factory_.GetWeakPtr(), text_stream));
-
-  add_text_track_cb_.Run(config, done_cb);
-}
-
-void TextRenderer::RemoveTextStream(DemuxerStream* text_stream) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  auto itr = text_track_state_map_.find(text_stream);
-  DCHECK(itr != text_track_state_map_.end());
-
-  TextTrackState* state = itr->second.get();
-  DCHECK_EQ(state->read_state, TextTrackState::kReadIdle);
-  text_track_state_map_.erase(itr);
-
-  pending_eos_set_.erase(text_stream);
-}
-
-bool TextRenderer::HasTracks() const {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  return !text_track_state_map_.empty();
-}
-
-void TextRenderer::BufferReady(DemuxerStream* stream,
-                               DemuxerStream::Status status,
-                               const scoped_refptr<DecoderBuffer>& input) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_NE(status, DemuxerStream::kConfigChanged);
-
-  if (status == DemuxerStream::kAborted) {
-    DCHECK(!input.get());
-    DCHECK_GT(pending_read_count_, 0);
-    DCHECK(pending_eos_set_.find(stream) != pending_eos_set_.end());
-
-    auto itr = text_track_state_map_.find(stream);
-    DCHECK(itr != text_track_state_map_.end());
-
-    TextTrackState* state = itr->second.get();
-    DCHECK_EQ(state->read_state, TextTrackState::kReadPending);
-
-    --pending_read_count_;
-    state->read_state = TextTrackState::kReadIdle;
-
-    switch (state_) {
-      case kPlaying:
-        return;
-
-      case kPausePending:
-        if (pending_read_count_ == 0) {
-          state_ = kPaused;
-          base::ResetAndReturn(&pause_cb_).Run();
-        }
-
-        return;
-
-      case kPaused:
-      case kUninitialized:
-      case kEnded:
-        NOTREACHED();
-        return;
-    }
-
-    NOTREACHED();
-    return;
-  }
-
-  if (input->end_of_stream()) {
-    CueReady(stream, NULL);
-    return;
-  }
-
-  DCHECK_EQ(status, DemuxerStream::kOk);
-  DCHECK_GE(input->side_data_size(), 2u);
-
-  // The side data contains both the cue id and cue settings,
-  // each terminated with a NUL.
-  const char* id_ptr = reinterpret_cast<const char*>(input->side_data());
-  size_t id_len = strlen(id_ptr);
-  std::string id(id_ptr, id_len);
-
-  const char* settings_ptr = id_ptr + id_len + 1;
-  size_t settings_len = strlen(settings_ptr);
-  std::string settings(settings_ptr, settings_len);
-
-  // The cue payload is stored in the data-part of the input buffer.
-  std::string text(input->data(), input->data() + input->data_size());
-
-  scoped_refptr<TextCue> text_cue(
-      new TextCue(input->timestamp(), input->duration(), id, settings, text));
-
-  CueReady(stream, text_cue);
-}
-
-void TextRenderer::CueReady(DemuxerStream* text_stream,
-                            const scoped_refptr<TextCue>& text_cue) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_NE(state_, kUninitialized);
-  DCHECK_GT(pending_read_count_, 0);
-  DCHECK(pending_eos_set_.find(text_stream) != pending_eos_set_.end());
-
-  auto itr = text_track_state_map_.find(text_stream);
-  DCHECK(itr != text_track_state_map_.end());
-
-  TextTrackState* state = itr->second.get();
-  DCHECK_EQ(state->read_state, TextTrackState::kReadPending);
-  DCHECK(state->text_track);
-
-  --pending_read_count_;
-  state->read_state = TextTrackState::kReadIdle;
-
-  switch (state_) {
-    case kPlaying: {
-      if (text_cue.get()) break;
-
-      const size_t count = pending_eos_set_.erase(text_stream);
-      DCHECK_EQ(count, 1U);
-
-      if (pending_eos_set_.empty()) {
-        DCHECK_EQ(pending_read_count_, 0);
-        state_ = kEnded;
-        task_runner_->PostTask(FROM_HERE, ended_cb_);
-        return;
-      }
-
-      DCHECK_GT(pending_read_count_, 0);
-      return;
-    }
-    case kPausePending: {
-      if (text_cue.get()) break;
-
-      const size_t count = pending_eos_set_.erase(text_stream);
-      DCHECK_EQ(count, 1U);
-
-      if (pending_read_count_ > 0) {
-        DCHECK(!pending_eos_set_.empty());
-        return;
-      }
-
-      state_ = kPaused;
-      base::ResetAndReturn(&pause_cb_).Run();
-
-      return;
-    }
-
-    case kPaused:
-    case kUninitialized:
-    case kEnded:
-      NOTREACHED();
-      return;
-  }
-
-  base::TimeDelta start = text_cue->timestamp();
-
-  if (state->text_ranges_.AddCue(start)) {
-    base::TimeDelta end = start + text_cue->duration();
-
-    state->text_track->addWebVTTCue(start, end, text_cue->id(),
-                                    text_cue->text(), text_cue->settings());
-  }
-
-  if (state_ == kPlaying) {
-    Read(state, text_stream);
-    return;
-  }
-
-  if (pending_read_count_ == 0) {
-    DCHECK_EQ(state_, kPausePending) << "state_ " << state_;
-    state_ = kPaused;
-    base::ResetAndReturn(&pause_cb_).Run();
-  }
-}
-
-void TextRenderer::OnAddTextTrackDone(DemuxerStream* text_stream,
-                                      std::unique_ptr<TextTrack> text_track) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK_NE(state_, kUninitialized);
-  DCHECK(text_stream);
-  DCHECK(text_track);
-
-  std::unique_ptr<TextTrackState> state(
-      new TextTrackState(std::move(text_track)));
-  text_track_state_map_[text_stream] = std::move(state);
-  pending_eos_set_.insert(text_stream);
-
-  if (state_ == kPlaying)
-    Read(text_track_state_map_[text_stream].get(), text_stream);
-}
-
-void TextRenderer::Read(TextTrackState* state, DemuxerStream* text_stream) {
-  DCHECK_NE(state->read_state, TextTrackState::kReadPending);
-
-  state->read_state = TextTrackState::kReadPending;
-  ++pending_read_count_;
-
-  text_stream->Read(base::Bind(&TextRenderer::BufferReady,
-                               weak_factory_.GetWeakPtr(), text_stream));
-}
-
-TextRenderer::TextTrackState::TextTrackState(std::unique_ptr<TextTrack> tt)
-    : read_state(kReadIdle), text_track(std::move(tt)) {}
-
-TextRenderer::TextTrackState::~TextTrackState() {}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/text_renderer.h b/cobalt/media/base/text_renderer.h
deleted file mode 100644
index 195aced..0000000
--- a/cobalt/media/base/text_renderer.h
+++ /dev/null
@@ -1,132 +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 COBALT_MEDIA_BASE_TEXT_RENDERER_H_
-#define COBALT_MEDIA_BASE_TEXT_RENDERER_H_
-
-#include <map>
-#include <memory>
-#include <set>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/weak_ptr.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/pipeline_status.h"
-#include "cobalt/media/base/text_ranges.h"
-#include "cobalt/media/base/text_track.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace cobalt {
-namespace media {
-
-class TextCue;
-class TextTrackConfig;
-
-// Receives decoder buffers from the upstream demuxer, decodes them to text
-// cues, and then passes them onto the TextTrack object associated with each
-// demuxer text stream.
-class MEDIA_EXPORT TextRenderer {
- public:
-  // |task_runner| is the thread on which TextRenderer will execute.
-  //
-  // |add_text_track_cb] is called when the demuxer requests (via its host)
-  // that a new text track be created.
-  TextRenderer(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-               const AddTextTrackCB& add_text_track_cb);
-
-  // Stops all operations and fires all pending callbacks.
-  ~TextRenderer();
-
-  // |ended_cb| is executed when all of the text tracks have reached
-  // end of stream, following a play request.
-  void Initialize(const base::Closure& ended_cb);
-
-  // Starts text track cue decoding and rendering.
-  void StartPlaying();
-
-  // Temporarily suspends decoding and rendering, executing |callback| when
-  // playback has been suspended.
-  void Pause(const base::Closure& callback);
-
-  // Discards any text data, executing |callback| when completed.
-  void Flush(const base::Closure& callback);
-
-  // Adds new |text_stream|, having the indicated |config|, to the text stream
-  // collection managed by this text renderer.
-  void AddTextStream(DemuxerStream* text_stream, const TextTrackConfig& config);
-
-  // Removes |text_stream| from the text stream collection.
-  void RemoveTextStream(DemuxerStream* text_stream);
-
-  // Returns true if there are extant text tracks.
-  bool HasTracks() const;
-
- private:
-  struct TextTrackState {
-    // To determine read progress.
-    enum ReadState { kReadIdle, kReadPending };
-
-    explicit TextTrackState(std::unique_ptr<TextTrack> text_track);
-    ~TextTrackState();
-
-    ReadState read_state;
-    std::unique_ptr<TextTrack> text_track;
-    TextRanges text_ranges_;
-  };
-
-  // Callback delivered by the demuxer |text_stream| when
-  // a read from the stream completes.
-  void BufferReady(DemuxerStream* text_stream, DemuxerStream::Status status,
-                   const scoped_refptr<DecoderBuffer>& input);
-
-  // Dispatches the decoded cue delivered on the demuxer's |text_stream|.
-  void CueReady(DemuxerStream* text_stream,
-                const scoped_refptr<TextCue>& text_cue);
-
-  // Dispatched when the AddTextTrackCB completes, after having created
-  // the TextTrack object associated with |text_stream|.
-  void OnAddTextTrackDone(DemuxerStream* text_stream,
-                          std::unique_ptr<TextTrack> text_track);
-
-  // Utility function to post a read request on |text_stream|.
-  void Read(TextTrackState* state, DemuxerStream* text_stream);
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  const AddTextTrackCB add_text_track_cb_;
-
-  // Callbacks provided during Initialize().
-  base::Closure ended_cb_;
-
-  // Callback provided to Pause().
-  base::Closure pause_cb_;
-
-  // Simple state tracking variable.
-  enum State { kUninitialized, kPausePending, kPaused, kPlaying, kEnded };
-  State state_;
-
-  std::map<DemuxerStream*, std::unique_ptr<TextTrackState>>
-      text_track_state_map_;
-
-  // Indicates how many read requests are in flight.
-  int pending_read_count_;
-
-  // Indicates which text streams have not delivered end-of-stream yet.
-  typedef std::set<DemuxerStream*> PendingEosSet;
-  PendingEosSet pending_eos_set_;
-
-  // NOTE: Weak pointers must be invalidated before all other member variables.
-  base::WeakPtrFactory<TextRenderer> weak_factory_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(TextRenderer);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TEXT_RENDERER_H_
diff --git a/cobalt/media/base/text_renderer_unittest.cc b/cobalt/media/base/text_renderer_unittest.cc
deleted file mode 100644
index 5263168..0000000
--- a/cobalt/media/base/text_renderer_unittest.cc
+++ /dev/null
@@ -1,1194 +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 "cobalt/media/base/text_renderer.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/fake_text_track_stream.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/filters/webvtt_util.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-// Local implementation of the TextTrack interface.
-class FakeTextTrack : public TextTrack {
- public:
-  FakeTextTrack(const base::Closure& destroy_cb, const TextTrackConfig& config)
-      : destroy_cb_(destroy_cb), config_(config) {}
-  virtual ~FakeTextTrack() { destroy_cb_.Run(); }
-
-  MOCK_METHOD5(addWebVTTCue,
-               void(const base::TimeDelta& start, const base::TimeDelta& end,
-                    const std::string& id, const std::string& content,
-                    const std::string& settings));
-
-  const base::Closure destroy_cb_;
-  const TextTrackConfig config_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FakeTextTrack);
-};
-
-class TextRendererTest : public testing::Test {
- public:
-  TextRendererTest() {}
-
-  void CreateTextRenderer() {
-    DCHECK(!text_renderer_);
-
-    text_renderer_.reset(new TextRenderer(
-        message_loop_.task_runner(),
-        base::Bind(&TextRendererTest::OnAddTextTrack, base::Unretained(this))));
-    text_renderer_->Initialize(
-        base::Bind(&TextRendererTest::OnEnd, base::Unretained(this)));
-  }
-
-  void Destroy() {
-    text_renderer_.reset();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void AddTextTrack(TextKind kind, const std::string& name,
-                    const std::string& language, bool expect_read) {
-    const size_t idx = text_track_streams_.size();
-    text_track_streams_.push_back(new FakeTextTrackStream);
-
-    if (expect_read) ExpectRead(idx);
-
-    const TextTrackConfig config(kind, name, language, std::string());
-    text_renderer_->AddTextStream(text_track_streams_.back(), config);
-    base::RunLoop().RunUntilIdle();
-
-    EXPECT_EQ(text_tracks_.size(), text_track_streams_.size());
-    FakeTextTrack* const text_track = text_tracks_.back();
-    EXPECT_TRUE(text_track);
-    EXPECT_TRUE(text_track->config_.Matches(config));
-  }
-
-  void OnAddTextTrack(const TextTrackConfig& config,
-                      const AddTextTrackDoneCB& done_cb) {
-    base::Closure destroy_cb =
-        base::Bind(&TextRendererTest::OnDestroyTextTrack,
-                   base::Unretained(this), text_tracks_.size());
-    // Text track objects are owned by the text renderer, but we cache them
-    // here so we can inspect them.  They get removed from our cache when the
-    // text renderer deallocates them.
-    text_tracks_.push_back(new FakeTextTrack(destroy_cb, config));
-    std::unique_ptr<TextTrack> text_track(text_tracks_.back());
-    done_cb.Run(std::move(text_track));
-  }
-
-  void RemoveTextTrack(unsigned idx) {
-    FakeTextTrackStream* const stream = text_track_streams_[idx];
-    text_renderer_->RemoveTextStream(stream);
-    EXPECT_FALSE(text_tracks_[idx]);
-  }
-
-  void SatisfyPendingReads(const base::TimeDelta& start,
-                           const base::TimeDelta& duration,
-                           const std::string& id, const std::string& content,
-                           const std::string& settings) {
-    for (TextTrackStreams::iterator itr = text_track_streams_.begin();
-         itr != text_track_streams_.end(); ++itr) {
-      (*itr)->SatisfyPendingRead(start, duration, id, content, settings);
-    }
-  }
-
-  void AbortPendingRead(unsigned idx) {
-    FakeTextTrackStream* const stream = text_track_streams_[idx];
-    stream->AbortPendingRead();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void AbortPendingReads() {
-    for (size_t idx = 0; idx < text_track_streams_.size(); ++idx) {
-      AbortPendingRead(idx);
-    }
-  }
-
-  void SendEosNotification(unsigned idx) {
-    FakeTextTrackStream* const stream = text_track_streams_[idx];
-    stream->SendEosNotification();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void SendEosNotifications() {
-    for (size_t idx = 0; idx < text_track_streams_.size(); ++idx) {
-      SendEosNotification(idx);
-    }
-  }
-
-  void SendCue(unsigned idx, bool expect_cue) {
-    FakeTextTrackStream* const text_stream = text_track_streams_[idx];
-
-    const base::TimeDelta start;
-    const base::TimeDelta duration = base::TimeDelta::FromSeconds(42);
-    const std::string id = "id";
-    const std::string content = "subtitle";
-    const std::string settings;
-
-    if (expect_cue) {
-      FakeTextTrack* const text_track = text_tracks_[idx];
-      EXPECT_CALL(*text_track,
-                  addWebVTTCue(start, start + duration, id, content, settings));
-    }
-
-    text_stream->SatisfyPendingRead(start, duration, id, content, settings);
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void SendCues(bool expect_cue) {
-    for (size_t idx = 0; idx < text_track_streams_.size(); ++idx) {
-      SendCue(idx, expect_cue);
-    }
-  }
-
-  void OnDestroyTextTrack(unsigned idx) { text_tracks_[idx] = NULL; }
-
-  void Play() { text_renderer_->StartPlaying(); }
-
-  void Pause() {
-    text_renderer_->Pause(
-        base::Bind(&TextRendererTest::OnPause, base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void Flush() {
-    EXPECT_CALL(*this, OnFlush());
-    text_renderer_->Flush(
-        base::Bind(&TextRendererTest::OnFlush, base::Unretained(this)));
-  }
-
-  void ExpectRead(size_t idx) {
-    FakeTextTrackStream* const stream = text_track_streams_[idx];
-    EXPECT_CALL(*stream, OnRead());
-  }
-
-  MOCK_METHOD0(OnEnd, void());
-  MOCK_METHOD0(OnPause, void());
-  MOCK_METHOD0(OnFlush, void());
-
-  base::MessageLoop message_loop_;
-
-  typedef std::vector<std::unique_ptr<FakeTextTrackStream>> TextTrackStreams;
-  TextTrackStreams text_track_streams_;
-
-  typedef std::vector<FakeTextTrack*> TextTracks;
-  TextTracks text_tracks_;
-
-  std::unique_ptr<TextRenderer> text_renderer_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TextRendererTest);
-};
-
-TEST_F(TextRendererTest, CreateTextRendererNoInit) {
-  text_renderer_.reset(new TextRenderer(
-      message_loop_.task_runner(),
-      base::Bind(&TextRendererTest::OnAddTextTrack, base::Unretained(this))));
-  text_renderer_.reset();
-}
-
-TEST_F(TextRendererTest, Create) { CreateTextRenderer(); }
-
-TEST_F(TextRendererTest, AddTextTrackOnly_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", false);
-}
-
-TEST_F(TextRendererTest, AddTextTrackOnly_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "track 1", "", false);
-  AddTextTrack(kTextSubtitles, "track 2", "", false);
-}
-
-TEST_F(TextRendererTest, PlayOnly) {
-  CreateTextRenderer();
-  Play();
-}
-
-TEST_F(TextRendererTest, AddTrackBeforePlay_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  AbortPendingReads();
-}
-
-TEST_F(TextRendererTest, AddTrackBeforePlay_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingReads();
-}
-
-TEST_F(TextRendererTest, AddTrackAfterPlay_OneTrackAfter) {
-  CreateTextRenderer();
-  Play();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  AbortPendingReads();
-}
-
-TEST_F(TextRendererTest, AddTrackAfterPlay_TwoTracksAfter) {
-  CreateTextRenderer();
-  Play();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  AbortPendingReads();
-}
-
-TEST_F(TextRendererTest, AddTrackAfterPlay_OneTrackBeforeOneTrackAfter) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  Play();
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  AbortPendingReads();
-}
-
-TEST_F(TextRendererTest, PlayAddCue_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  ExpectRead(0);
-  SendCues(true);
-  AbortPendingReads();
-}
-
-TEST_F(TextRendererTest, PlayAddCue_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  ExpectRead(0);
-  ExpectRead(1);
-  SendCues(true);
-  AbortPendingReads();
-}
-
-TEST_F(TextRendererTest, PlayEosOnly_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, PlayEosOnly_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, PlayCueEos_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  ExpectRead(0);
-  SendCues(true);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, PlayCueEos_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  ExpectRead(0);
-  ExpectRead(1);
-  SendCues(true);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, DestroyPending_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  Destroy();
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, DestroyPending_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Destroy();
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, PlayPause_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  AbortPendingReads();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayPause_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingReads();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayEosPausePending_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, PlayEosPausePending_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, PlayCuePausePending_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  SendCues(true);
-}
-
-TEST_F(TextRendererTest, PlayCuePausePending_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  SendCues(true);
-}
-
-TEST_F(TextRendererTest, PlayEosPause_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayEosPause_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayEosPause_SplitEos) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  SendEosNotification(0);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayEosFlush_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  Flush();
-  ExpectRead(0);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, PlayEosFlush_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  Flush();
-  ExpectRead(0);
-  ExpectRead(1);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-}
-
-TEST_F(TextRendererTest, AddTextTrackOnlyRemove_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", false);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, AddTextTrackOnlyRemove_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "track 1", "", false);
-  AddTextTrack(kTextSubtitles, "track 2", "", false);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, AddTrackBeforePlayRemove_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  AbortPendingReads();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, AddTrackBeforePlayRemove_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingReads();
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, AddTrackBeforePlayRemove_SeparateCancel) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingRead(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  AbortPendingRead(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, AddTrackBeforePlayRemove_RemoveOneThenPlay) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", false);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  Play();
-  AbortPendingRead(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, AddTrackBeforePlayRemove_RemoveTwoThenPlay) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", false);
-  AddTextTrack(kTextSubtitles, "2", "", false);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-  Play();
-}
-
-TEST_F(TextRendererTest, AddTrackAfterPlayRemove_OneTrack) {
-  CreateTextRenderer();
-  Play();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  AbortPendingReads();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, AddTrackAfterPlayRemove_TwoTracks) {
-  CreateTextRenderer();
-  Play();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  AbortPendingReads();
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, AddTrackAfterPlayRemove_SplitCancel) {
-  CreateTextRenderer();
-  Play();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  AbortPendingRead(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  AbortPendingRead(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, AddTrackAfterPlayRemove_SplitAdd) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  Play();
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  AbortPendingRead(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  AbortPendingRead(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayAddCueRemove_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  ExpectRead(0);
-  SendCues(true);
-  AbortPendingReads();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayAddCueRemove_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  ExpectRead(0);
-  ExpectRead(1);
-  SendCues(true);
-  AbortPendingRead(0);
-  AbortPendingRead(1);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosOnlyRemove_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosOnlyRemove_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayCueEosRemove_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  ExpectRead(0);
-  SendCues(true);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayCueEosRemove_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  ExpectRead(0);
-  ExpectRead(1);
-  SendCues(true);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayPauseRemove_PauseThenRemove) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  AbortPendingReads();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayPauseRemove_RemoveThanPause) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  AbortPendingReads();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayPause_PauseThenRemoveTwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingReads();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayPauseRemove_RemoveThenPauseTwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingReads();
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayPauseRemove_SplitCancel) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingRead(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  AbortPendingRead(1);
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayPauseRemove_PauseLast) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingRead(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  AbortPendingRead(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayEosPausePendingRemove_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  SendEosNotifications();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPausePendingRemove_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  SendEosNotification(0);
-  EXPECT_CALL(*this, OnPause());
-  SendEosNotification(1);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPausePendingRemove_SplitEos) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  SendEosNotification(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  SendEosNotification(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayCuePausePendingRemove_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  SendCues(true);
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayCuePausePendingRemove_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  SendCue(0, true);
-  EXPECT_CALL(*this, OnPause());
-  SendCue(1, true);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayCuePausePendingRemove_SplitSendCue) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  SendCue(0, true);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  SendCue(1, true);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPauseRemove_PauseThenRemove) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPauseRemove_RemoveThenPause) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayEosPause_PauseThenRemoveTwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  SendEosNotification(0);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPause_RemovePauseRemove) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  SendEosNotification(0);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPause_EosThenPause) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  SendEosNotification(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPause_PauseLast) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  SendEosNotification(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayEosPause_EosPauseRemove) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  SendEosNotification(0);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPause_EosRemovePause) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  SendEosNotification(0);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPause_EosRemoveEosPause) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  SendEosNotification(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosPause_EosRemoveEosRemovePause) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  SendEosNotification(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-}
-
-TEST_F(TextRendererTest, PlayEosFlushRemove_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  Flush();
-  ExpectRead(0);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  RemoveTextTrack(0);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosFlushRemove_TwoTracks) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  Flush();
-  ExpectRead(0);
-  ExpectRead(1);
-  Play();
-  SendEosNotification(0);
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayEosFlushRemove_EosRemove) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotifications();
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  Flush();
-  ExpectRead(0);
-  ExpectRead(1);
-  Play();
-  SendEosNotification(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayShort_SendCueThenEos) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  SendCue(0, true);
-  EXPECT_CALL(*this, OnPause());
-  SendEosNotification(1);
-}
-
-TEST_F(TextRendererTest, PlayShort_EosThenSendCue) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  SendEosNotification(0);
-  EXPECT_CALL(*this, OnPause());
-  SendCue(1, true);
-}
-
-TEST_F(TextRendererTest, PlayShortRemove_SendEosRemove) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  SendCue(0, true);
-  EXPECT_CALL(*this, OnPause());
-  SendEosNotification(1);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayShortRemove_SendRemoveEos) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  SendCue(0, true);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnPause());
-  SendEosNotification(1);
-  RemoveTextTrack(1);
-  EXPECT_FALSE(text_renderer_->HasTracks());
-}
-
-TEST_F(TextRendererTest, PlayCuePausePendingCancel_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  AbortPendingRead(0);
-}
-
-TEST_F(TextRendererTest, PlayCuePausePendingCancel_SendThenCancel) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  SendCue(0, true);
-  EXPECT_CALL(*this, OnPause());
-  AbortPendingRead(1);
-}
-
-TEST_F(TextRendererTest, PlayCuePausePendingCancel_CancelThenSend) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  AbortPendingRead(0);
-  EXPECT_CALL(*this, OnPause());
-  SendCue(1, true);
-}
-
-TEST_F(TextRendererTest, PlayCueDestroyPendingCancel_OneTrack) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  Destroy();
-  AbortPendingRead(0);
-}
-
-TEST_F(TextRendererTest, PlayCueDestroyPendingCancel_SendThenCancel) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  Destroy();
-  SendCue(0, false);
-  AbortPendingRead(1);
-}
-
-TEST_F(TextRendererTest, PlayCueDestroyPendingCancel_CancelThenSend) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  Destroy();
-  AbortPendingRead(0);
-  SendCue(1, false);
-}
-
-TEST_F(TextRendererTest, AddRemoveAdd) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  AbortPendingRead(0);
-  RemoveTextTrack(0);
-  EXPECT_CALL(*this, OnPause());
-  Pause();
-  AddTextTrack(kTextSubtitles, "", "", true);
-  Play();
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-}
-
-TEST_F(TextRendererTest, AddRemoveEos) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingRead(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  EXPECT_CALL(*this, OnEnd());
-  SendEosNotification(1);
-}
-
-TEST_F(TextRendererTest, AddRemovePause) {
-  CreateTextRenderer();
-  AddTextTrack(kTextSubtitles, "1", "", true);
-  AddTextTrack(kTextSubtitles, "2", "", true);
-  Play();
-  AbortPendingRead(0);
-  RemoveTextTrack(0);
-  EXPECT_TRUE(text_renderer_->HasTracks());
-  Pause();
-  EXPECT_CALL(*this, OnPause());
-  SendEosNotification(1);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/text_track.h b/cobalt/media/base/text_track.h
deleted file mode 100644
index ce15f18..0000000
--- a/cobalt/media/base/text_track.h
+++ /dev/null
@@ -1,37 +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 COBALT_MEDIA_BASE_TEXT_TRACK_H_
-#define COBALT_MEDIA_BASE_TEXT_TRACK_H_
-
-#include <memory>
-#include <string>
-
-#include "base/callback.h"
-#include "base/time/time.h"
-
-namespace cobalt {
-namespace media {
-
-class TextTrackConfig;
-
-class TextTrack {
- public:
-  virtual ~TextTrack() {}
-  virtual void addWebVTTCue(const base::TimeDelta& start,
-                            const base::TimeDelta& end, const std::string& id,
-                            const std::string& content,
-                            const std::string& settings) = 0;
-};
-
-typedef base::Callback<void(std::unique_ptr<TextTrack>)> AddTextTrackDoneCB;
-
-typedef base::Callback<void(const TextTrackConfig& config,
-                            const AddTextTrackDoneCB& done_cb)>
-    AddTextTrackCB;
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TEXT_TRACK_H_
diff --git a/cobalt/media/base/text_track_config.cc b/cobalt/media/base/text_track_config.cc
deleted file mode 100644
index cfd50ce..0000000
--- a/cobalt/media/base/text_track_config.cc
+++ /dev/null
@@ -1,23 +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 "cobalt/media/base/text_track_config.h"
-
-namespace cobalt {
-namespace media {
-
-TextTrackConfig::TextTrackConfig() : kind_(kTextNone) {}
-
-TextTrackConfig::TextTrackConfig(TextKind kind, const std::string& label,
-                                 const std::string& language,
-                                 const std::string& id)
-    : kind_(kind), label_(label), language_(language), id_(id) {}
-
-bool TextTrackConfig::Matches(const TextTrackConfig& config) const {
-  return config.kind() == kind_ && config.label() == label_ &&
-         config.language() == language_ && config.id() == id_;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/text_track_config.h b/cobalt/media/base/text_track_config.h
deleted file mode 100644
index 0bee231..0000000
--- a/cobalt/media/base/text_track_config.h
+++ /dev/null
@@ -1,48 +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 COBALT_MEDIA_BASE_TEXT_TRACK_CONFIG_H_
-#define COBALT_MEDIA_BASE_TEXT_TRACK_CONFIG_H_
-
-#include <string>
-
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// Specifies the varieties of text tracks.
-enum TextKind {
-  kTextSubtitles,
-  kTextCaptions,
-  kTextDescriptions,
-  kTextMetadata,
-  kTextNone
-};
-
-class MEDIA_EXPORT TextTrackConfig {
- public:
-  TextTrackConfig();
-  TextTrackConfig(TextKind kind, const std::string& label,
-                  const std::string& language, const std::string& id);
-
-  // Returns true if all fields in |config| match this config.
-  bool Matches(const TextTrackConfig& config) const;
-
-  TextKind kind() const { return kind_; }
-  const std::string& label() const { return label_; }
-  const std::string& language() const { return language_; }
-  const std::string& id() const { return id_; }
-
- private:
-  TextKind kind_;
-  std::string label_;
-  std::string language_;
-  std::string id_;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TEXT_TRACK_CONFIG_H_
diff --git a/cobalt/media/base/time_delta_interpolator.cc b/cobalt/media/base/time_delta_interpolator.cc
deleted file mode 100644
index eb8065a..0000000
--- a/cobalt/media/base/time_delta_interpolator.cc
+++ /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.
-
-#include "cobalt/media/base/time_delta_interpolator.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/time/tick_clock.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-TimeDeltaInterpolator::TimeDeltaInterpolator(base::TickClock* tick_clock)
-    : tick_clock_(tick_clock),
-      interpolating_(false),
-      upper_bound_(kNoTimestamp),
-      playback_rate_(0) {
-  DCHECK(tick_clock_);
-}
-
-TimeDeltaInterpolator::~TimeDeltaInterpolator() {}
-
-base::TimeDelta TimeDeltaInterpolator::StartInterpolating() {
-  DCHECK(!interpolating_);
-  reference_ = tick_clock_->NowTicks();
-  interpolating_ = true;
-  return lower_bound_;
-}
-
-base::TimeDelta TimeDeltaInterpolator::StopInterpolating() {
-  DCHECK(interpolating_);
-  lower_bound_ = GetInterpolatedTime();
-  interpolating_ = false;
-  return lower_bound_;
-}
-
-void TimeDeltaInterpolator::SetPlaybackRate(double playback_rate) {
-  lower_bound_ = GetInterpolatedTime();
-  reference_ = tick_clock_->NowTicks();
-  playback_rate_ = playback_rate;
-}
-
-void TimeDeltaInterpolator::SetBounds(base::TimeDelta lower_bound,
-                                      base::TimeDelta upper_bound,
-                                      base::TimeTicks capture_time) {
-  DCHECK(lower_bound <= upper_bound);
-  DCHECK(lower_bound != kNoTimestamp);
-
-  lower_bound_ = std::max(base::TimeDelta(), lower_bound);
-  upper_bound_ = std::max(base::TimeDelta(), upper_bound);
-  reference_ = capture_time;
-}
-
-void TimeDeltaInterpolator::SetUpperBound(base::TimeDelta upper_bound) {
-  DCHECK(upper_bound != kNoTimestamp);
-
-  lower_bound_ = GetInterpolatedTime();
-  reference_ = tick_clock_->NowTicks();
-  upper_bound_ = upper_bound;
-}
-
-base::TimeDelta TimeDeltaInterpolator::GetInterpolatedTime() {
-  if (!interpolating_) return lower_bound_;
-
-  int64_t now_us = (tick_clock_->NowTicks() - reference_).InMicroseconds();
-  now_us = static_cast<int64_t>(now_us * playback_rate_);
-  base::TimeDelta interpolated_time =
-      lower_bound_ + base::TimeDelta::FromMicroseconds(now_us);
-
-  if (upper_bound_ == kNoTimestamp) return interpolated_time;
-
-  return std::min(interpolated_time, upper_bound_);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/time_delta_interpolator.h b/cobalt/media/base/time_delta_interpolator.h
deleted file mode 100644
index b86fb12..0000000
--- a/cobalt/media/base/time_delta_interpolator.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_BASE_TIME_DELTA_INTERPOLATOR_H_
-#define COBALT_MEDIA_BASE_TIME_DELTA_INTERPOLATOR_H_
-
-#include "base/basictypes.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace base {
-class TickClock;
-}  // namespace base
-
-namespace cobalt {
-namespace media {
-
-// Interpolates between two TimeDeltas based on the passage of wall clock time
-// and the current playback rate.
-//
-// TimeDeltaInterpolator is not thread-safe and must be externally locked.
-class MEDIA_EXPORT TimeDeltaInterpolator {
- public:
-  // Constructs an interpolator initialized to zero with a rate of 1.0.
-  //
-  // |tick_clock| is used for sampling wall clock time for interpolating.
-  explicit TimeDeltaInterpolator(base::TickClock* tick_clock);
-  ~TimeDeltaInterpolator();
-
-  bool interpolating() { return interpolating_; }
-
-  // Starts returning interpolated TimeDelta values.
-  //
-  // |tick_clock| will be queried for a new reference time value.
-  base::TimeDelta StartInterpolating();
-
-  // Stops returning interpolated TimeDelta values.
-  //
-  // |tick_clock| will be queried for a new reference time value.
-  base::TimeDelta StopInterpolating();
-
-  // Sets a new rate at which to interpolate.
-  // The default rate is 0.
-  //
-  // |tick_clock| will be queried for a new reference time value.
-  void SetPlaybackRate(double playback_rate);
-
-  // Sets the two timestamps to interpolate between at |playback_rate_|.
-  // |upper_bound| must be greater or equal to |lower_bound|.
-  //
-  // |upper_bound| is typically the media timestamp of the last audio frame
-  // buffered by the audio hardware.
-  void SetBounds(base::TimeDelta lower_bound, base::TimeDelta upper_bound,
-                 base::TimeTicks capture_time);
-
-  // Sets the upper bound used for interpolation. Note that if |upper_bound| is
-  // less than what was previously set via SetTime(), then all future calls
-  // to GetInterpolatedTime() will return |upper_bound|.
-  void SetUpperBound(base::TimeDelta upper_bound);
-
-  // Computes an interpolated time based on SetTime().
-  base::TimeDelta GetInterpolatedTime();
-
- private:
-  base::TickClock* const tick_clock_;
-
-  bool interpolating_;
-
-  // The range of time to interpolate between.
-  base::TimeDelta lower_bound_;
-  base::TimeDelta upper_bound_;
-
-  // The monotonic system clock time used for interpolating between
-  // |lower_bound_| and |upper_bound_|.
-  base::TimeTicks reference_;
-
-  double playback_rate_;
-
-  DISALLOW_COPY_AND_ASSIGN(TimeDeltaInterpolator);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TIME_DELTA_INTERPOLATOR_H_
diff --git a/cobalt/media/base/time_delta_interpolator_unittest.cc b/cobalt/media/base/time_delta_interpolator_unittest.cc
deleted file mode 100644
index f44bf9d..0000000
--- a/cobalt/media/base/time_delta_interpolator_unittest.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/base/time_delta_interpolator.h"
-
-#include "base/logging.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class TimeDeltaInterpolatorTest : public ::testing::Test {
- public:
-  TimeDeltaInterpolatorTest() : interpolator_(&test_tick_clock_) {
-    interpolator_.SetPlaybackRate(1.0);
-  }
-
- protected:
-  void AdvanceSystemTime(base::TimeDelta delta) {
-    test_tick_clock_.Advance(delta);
-  }
-
-  base::SimpleTestTickClock test_tick_clock_;
-  TimeDeltaInterpolator interpolator_;
-};
-
-TEST_F(TimeDeltaInterpolatorTest, Created) {
-  const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0);
-  EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_NormalSpeed) {
-  const base::TimeDelta kZero;
-  const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(2);
-
-  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
-  AdvanceSystemTime(kTimeToAdvance);
-  EXPECT_EQ(kTimeToAdvance, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_DoubleSpeed) {
-  const base::TimeDelta kZero;
-  const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(5);
-
-  interpolator_.SetPlaybackRate(2.0);
-  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
-  AdvanceSystemTime(kTimeToAdvance);
-  EXPECT_EQ(2 * kTimeToAdvance, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_HalfSpeed) {
-  const base::TimeDelta kZero;
-  const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(4);
-
-  interpolator_.SetPlaybackRate(0.5);
-  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
-  AdvanceSystemTime(kTimeToAdvance);
-  EXPECT_EQ(kTimeToAdvance / 2, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_ZeroSpeed) {
-  // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8
-  // seconds at normal speed.
-  const base::TimeDelta kZero;
-  const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2);
-  const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4);
-  const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8);
-  const base::TimeDelta kExpected = kPlayDuration1 + kPlayDuration3;
-
-  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
-
-  AdvanceSystemTime(kPlayDuration1);
-  interpolator_.SetPlaybackRate(0.0);
-  AdvanceSystemTime(kPlayDuration2);
-  interpolator_.SetPlaybackRate(1.0);
-  AdvanceSystemTime(kPlayDuration3);
-
-  EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_MultiSpeed) {
-  // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8
-  // seconds at double speed.
-  const base::TimeDelta kZero;
-  const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2);
-  const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4);
-  const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8);
-  const base::TimeDelta kExpected =
-      kPlayDuration1 / 2 + kPlayDuration2 + 2 * kPlayDuration3;
-
-  interpolator_.SetPlaybackRate(0.5);
-  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
-  AdvanceSystemTime(kPlayDuration1);
-
-  interpolator_.SetPlaybackRate(1.0);
-  AdvanceSystemTime(kPlayDuration2);
-
-  interpolator_.SetPlaybackRate(2.0);
-  AdvanceSystemTime(kPlayDuration3);
-  EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, StopInterpolating) {
-  const base::TimeDelta kZero;
-  const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4);
-  const base::TimeDelta kPauseDuration = base::TimeDelta::FromSeconds(20);
-  const base::TimeDelta kExpectedFirstPause = kPlayDuration;
-  const base::TimeDelta kExpectedSecondPause = 2 * kPlayDuration;
-
-  // Play for 4 seconds.
-  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
-  AdvanceSystemTime(kPlayDuration);
-
-  // Pause for 20 seconds.
-  EXPECT_EQ(kExpectedFirstPause, interpolator_.StopInterpolating());
-  EXPECT_EQ(kExpectedFirstPause, interpolator_.GetInterpolatedTime());
-  AdvanceSystemTime(kPauseDuration);
-  EXPECT_EQ(kExpectedFirstPause, interpolator_.GetInterpolatedTime());
-
-  // Play again for 4 more seconds.
-  EXPECT_EQ(kExpectedFirstPause, interpolator_.StartInterpolating());
-  AdvanceSystemTime(kPlayDuration);
-  EXPECT_EQ(kExpectedSecondPause, interpolator_.StopInterpolating());
-  EXPECT_EQ(kExpectedSecondPause, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, SetBounds_Stopped) {
-  const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4);
-  const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16);
-  const base::TimeDelta kArbitraryMaxTime = base::TimeDelta::FromSeconds(100);
-
-  interpolator_.SetBounds(kFirstTime, kArbitraryMaxTime,
-                          test_tick_clock_.NowTicks());
-  EXPECT_EQ(kFirstTime, interpolator_.GetInterpolatedTime());
-  interpolator_.SetBounds(kSecondTime, kArbitraryMaxTime,
-                          test_tick_clock_.NowTicks());
-  EXPECT_EQ(kSecondTime, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, SetBounds_Started) {
-  // We'll play for 4 seconds, then set the time to 12, then play for 4 more
-  // seconds.
-  const base::TimeDelta kZero;
-  const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4);
-  const base::TimeDelta kUpdatedTime = base::TimeDelta::FromSeconds(12);
-  const base::TimeDelta kArbitraryMaxTime = base::TimeDelta::FromSeconds(100);
-  const base::TimeDelta kExpected = kUpdatedTime + kPlayDuration;
-
-  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
-  AdvanceSystemTime(kPlayDuration);
-
-  interpolator_.SetBounds(kUpdatedTime, kArbitraryMaxTime,
-                          test_tick_clock_.NowTicks());
-  AdvanceSystemTime(kPlayDuration);
-  EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, SetUpperBound) {
-  const base::TimeDelta kZero;
-  const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4);
-  const base::TimeDelta kMaxTime = base::TimeDelta::FromSeconds(6);
-
-  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
-  interpolator_.SetUpperBound(kMaxTime);
-  AdvanceSystemTime(kTimeInterval);
-  EXPECT_EQ(kTimeInterval, interpolator_.GetInterpolatedTime());
-
-  AdvanceSystemTime(kTimeInterval);
-  EXPECT_EQ(kMaxTime, interpolator_.GetInterpolatedTime());
-
-  AdvanceSystemTime(kTimeInterval);
-  EXPECT_EQ(kMaxTime, interpolator_.GetInterpolatedTime());
-}
-
-TEST_F(TimeDeltaInterpolatorTest, SetUpperBound_MultipleTimes) {
-  const base::TimeDelta kZero;
-  const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4);
-  const base::TimeDelta kMaxTime0 = base::TimeDelta::FromSeconds(120);
-  const base::TimeDelta kMaxTime1 = base::TimeDelta::FromSeconds(6);
-  const base::TimeDelta kMaxTime2 = base::TimeDelta::FromSeconds(12);
-
-  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
-  interpolator_.SetUpperBound(kMaxTime0);
-  AdvanceSystemTime(kTimeInterval);
-  EXPECT_EQ(kTimeInterval, interpolator_.GetInterpolatedTime());
-
-  interpolator_.SetUpperBound(kMaxTime1);
-  AdvanceSystemTime(kTimeInterval);
-  EXPECT_EQ(kMaxTime1, interpolator_.GetInterpolatedTime());
-
-  AdvanceSystemTime(kTimeInterval);
-  EXPECT_EQ(kMaxTime1, interpolator_.GetInterpolatedTime());
-
-  interpolator_.SetUpperBound(kMaxTime2);
-  EXPECT_EQ(kMaxTime1, interpolator_.GetInterpolatedTime());
-
-  AdvanceSystemTime(kTimeInterval);
-  EXPECT_EQ(kMaxTime1 + kTimeInterval, interpolator_.GetInterpolatedTime());
-
-  AdvanceSystemTime(kTimeInterval);
-  EXPECT_EQ(kMaxTime2, interpolator_.GetInterpolatedTime());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/time_source.h b/cobalt/media/base/time_source.h
deleted file mode 100644
index e5c2051..0000000
--- a/cobalt/media/base/time_source.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 COBALT_MEDIA_BASE_TIME_SOURCE_H_
-#define COBALT_MEDIA_BASE_TIME_SOURCE_H_
-
-#include <vector>
-
-#include "base/callback.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// A TimeSource is capable of providing the current media time.
-class MEDIA_EXPORT TimeSource {
- public:
-  // Helper alias for converting media timestamps into a wall clock timestamps.
-  using WallClockTimeCB = base::Callback<bool(
-      const std::vector<base::TimeDelta>&, std::vector<base::TimeTicks>*)>;
-
-  TimeSource() {}
-  virtual ~TimeSource() {}
-
-  // Signal the time source to start ticking. It is expected that values from
-  // CurrentMediaTime() will start increasing.
-  virtual void StartTicking() = 0;
-
-  // Signal the time source to stop ticking. It is expected that values from
-  // CurrentMediaTime() will remain constant.
-  virtual void StopTicking() = 0;
-
-  // Updates the current playback rate. It is expected that values from
-  // CurrentMediaTime() will eventually reflect the new playback rate (e.g., the
-  // media time will advance at half speed if the rate was set to 0.5).
-  virtual void SetPlaybackRate(double playback_rate) = 0;
-
-  // Sets the media time to start ticking from. Only valid to call while the
-  // time source is not ticking.
-  virtual void SetMediaTime(base::TimeDelta time) = 0;
-
-  // Returns the current media timestamp relative to the timestamp set by
-  // SetMediaTime().
-  //
-  // Values returned are intended for informational purposes, such as displaying
-  // UI with the current minute and second count. While it is guaranteed values
-  // will never go backwards, the frequency at which they update may be low.
-  virtual base::TimeDelta CurrentMediaTime() = 0;
-
-  // Converts a vector of media timestamps into a vector of wall clock times; if
-  // the media time is stopped, returns false, otherwise returns true. Even if
-  // time is stopped, timestamps will be converted.
-  //
-  // Passing an empty |media_timestamps| vector will return the last known media
-  // time as a wall clock time. After SetMediaTime() and prior to StartTicking()
-  // the returned wall clock time must be zero.
-  //
-  // Within a single call to GetWallClockTimes() the returned wall clock times
-  // are a strictly increasing function of the given media times. There is no
-  // such guarantee between calls though; e.g., playback rate or audio delay may
-  // change on other threads within the pipeline.
-  //
-  // Each timestamp converted from |media_timestamps| will be pushed into
-  // |wall_clock_times| such that after all timestamps are converted, the two
-  // vectors are parallel (media_timestamps[i] -> wall_clock_times[i]).
-  //
-  // |media_timestamps| values too far ahead of the current media time will
-  // be converted to an estimated value; as such, these values may go backwards
-  // in time slightly between calls to GetWallClockTimes().
-  //
-  // |media_timestamps| values behind the current media time may be
-  // significantly incorrect if the playback rate has changed recently. The only
-  // guarantee is that the returned time will be less than the current wall
-  // clock time.
-  virtual bool GetWallClockTimes(
-      const std::vector<base::TimeDelta>& media_timestamps,
-      std::vector<base::TimeTicks>* wall_clock_times) = 0;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TIME_SOURCE_H_
diff --git a/cobalt/media/base/timestamp_constants.h b/cobalt/media/base/timestamp_constants.h
deleted file mode 100644
index 240d2cb..0000000
--- a/cobalt/media/base/timestamp_constants.h
+++ /dev/null
@@ -1,27 +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 COBALT_MEDIA_BASE_TIMESTAMP_CONSTANTS_H_
-#define COBALT_MEDIA_BASE_TIMESTAMP_CONSTANTS_H_
-
-#include <limits>
-
-#include "base/time/time.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Indicates an invalid or missing timestamp.
-const base::TimeDelta kNoTimestamp =
-    base::TimeDelta::FromMicroseconds(std::numeric_limits<int64_t>::min());
-
-// Represents an infinite stream duration.
-const base::TimeDelta kInfiniteDuration =
-    base::TimeDelta::FromMicroseconds(std::numeric_limits<int64_t>::max());
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_TIMESTAMP_CONSTANTS_H_
diff --git a/cobalt/media/base/vector_math.cc b/cobalt/media/base/vector_math.cc
deleted file mode 100644
index 4ea1f1c..0000000
--- a/cobalt/media/base/vector_math.cc
+++ /dev/null
@@ -1,291 +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 "cobalt/media/base/vector_math.h"
-#include "cobalt/media/base/vector_math_testing.h"
-
-#include <algorithm>
-
-#include "starboard/types.h"
-
-#include "base/logging.h"
-#include "build/build_config.h"
-
-// NaCl does not allow intrinsics.
-#if defined(ARCH_CPU_X86_FAMILY) && !defined(OS_NACL)
-#include <xmmintrin.h>
-// Don't use custom SSE versions where the auto-vectorized C version performs
-// better, which is anywhere clang is used.
-#if !defined(__clang__)
-#define FMAC_FUNC FMAC_SSE
-#define FMUL_FUNC FMUL_SSE
-#else
-#define FMAC_FUNC FMAC_C
-#define FMUL_FUNC FMUL_C
-#endif
-#define EWMAAndMaxPower_FUNC EWMAAndMaxPower_SSE
-#elif defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
-#include <arm_neon.h>
-#define FMAC_FUNC FMAC_NEON
-#define FMUL_FUNC FMUL_NEON
-#define EWMAAndMaxPower_FUNC EWMAAndMaxPower_NEON
-#else
-#define FMAC_FUNC FMAC_C
-#define FMUL_FUNC FMUL_C
-#define EWMAAndMaxPower_FUNC EWMAAndMaxPower_C
-#endif
-
-namespace cobalt {
-namespace media {
-namespace vector_math {
-
-void FMAC(const float src[], float scale, int len, float dest[]) {
-  // Ensure |src| and |dest| are 16-byte aligned.
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & (kRequiredAlignment - 1));
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(dest) & (kRequiredAlignment - 1));
-  return FMAC_FUNC(src, scale, len, dest);
-}
-
-void FMAC_C(const float src[], float scale, int len, float dest[]) {
-  for (int i = 0; i < len; ++i) dest[i] += src[i] * scale;
-}
-
-void FMUL(const float src[], float scale, int len, float dest[]) {
-  // Ensure |src| and |dest| are 16-byte aligned.
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & (kRequiredAlignment - 1));
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(dest) & (kRequiredAlignment - 1));
-  return FMUL_FUNC(src, scale, len, dest);
-}
-
-void FMUL_C(const float src[], float scale, int len, float dest[]) {
-  for (int i = 0; i < len; ++i) dest[i] = src[i] * scale;
-}
-
-void Crossfade(const float src[], int len, float dest[]) {
-  float cf_ratio = 0;
-  const float cf_increment = 1.0f / len;
-  for (int i = 0; i < len; ++i, cf_ratio += cf_increment)
-    dest[i] = (1.0f - cf_ratio) * src[i] + cf_ratio * dest[i];
-}
-
-std::pair<float, float> EWMAAndMaxPower(float initial_value, const float src[],
-                                        int len, float smoothing_factor) {
-  // Ensure |src| is 16-byte aligned.
-  DCHECK_EQ(0u, reinterpret_cast<uintptr_t>(src) & (kRequiredAlignment - 1));
-  return EWMAAndMaxPower_FUNC(initial_value, src, len, smoothing_factor);
-}
-
-std::pair<float, float> EWMAAndMaxPower_C(float initial_value,
-                                          const float src[], int len,
-                                          float smoothing_factor) {
-  std::pair<float, float> result(initial_value, 0.0f);
-  const float weight_prev = 1.0f - smoothing_factor;
-  for (int i = 0; i < len; ++i) {
-    result.first *= weight_prev;
-    const float sample = src[i];
-    const float sample_squared = sample * sample;
-    result.first += sample_squared * smoothing_factor;
-    result.second = std::max(result.second, sample_squared);
-  }
-  return result;
-}
-
-#if defined(ARCH_CPU_X86_FAMILY) && !defined(OS_NACL)
-void FMUL_SSE(const float src[], float scale, int len, float dest[]) {
-  const int rem = len % 4;
-  const int last_index = len - rem;
-  __m128 m_scale = _mm_set_ps1(scale);
-  for (int i = 0; i < last_index; i += 4)
-    _mm_store_ps(dest + i, _mm_mul_ps(_mm_load_ps(src + i), m_scale));
-
-  // Handle any remaining values that wouldn't fit in an SSE pass.
-  for (int i = last_index; i < len; ++i) dest[i] = src[i] * scale;
-}
-
-void FMAC_SSE(const float src[], float scale, int len, float dest[]) {
-  const int rem = len % 4;
-  const int last_index = len - rem;
-  __m128 m_scale = _mm_set_ps1(scale);
-  for (int i = 0; i < last_index; i += 4) {
-    _mm_store_ps(dest + i,
-                 _mm_add_ps(_mm_load_ps(dest + i),
-                            _mm_mul_ps(_mm_load_ps(src + i), m_scale)));
-  }
-
-  // Handle any remaining values that wouldn't fit in an SSE pass.
-  for (int i = last_index; i < len; ++i) dest[i] += src[i] * scale;
-}
-
-// Convenience macro to extract float 0 through 3 from the vector |a|.  This is
-// needed because compilers other than clang don't support access via
-// operator[]().
-#define EXTRACT_FLOAT(a, i) \
-  (i == 0 ? _mm_cvtss_f32(a) : _mm_cvtss_f32(_mm_shuffle_ps(a, a, i)))
-
-std::pair<float, float> EWMAAndMaxPower_SSE(float initial_value,
-                                            const float src[], int len,
-                                            float smoothing_factor) {
-  // When the recurrence is unrolled, we see that we can split it into 4
-  // separate lanes of evaluation:
-  //
-  // y[n] = a(S[n]^2) + (1-a)(y[n-1])
-  //      = a(S[n]^2) + (1-a)^1(aS[n-1]^2) + (1-a)^2(aS[n-2]^2) + ...
-  //      = z[n] + (1-a)^1(z[n-1]) + (1-a)^2(z[n-2]) + (1-a)^3(z[n-3])
-  //
-  // where z[n] = a(S[n]^2) + (1-a)^4(z[n-4]) + (1-a)^8(z[n-8]) + ...
-  //
-  // Thus, the strategy here is to compute z[n], z[n-1], z[n-2], and z[n-3] in
-  // each of the 4 lanes, and then combine them to give y[n].
-
-  const int rem = len % 4;
-  const int last_index = len - rem;
-
-  const __m128 smoothing_factor_x4 = _mm_set_ps1(smoothing_factor);
-  const float weight_prev = 1.0f - smoothing_factor;
-  const __m128 weight_prev_x4 = _mm_set_ps1(weight_prev);
-  const __m128 weight_prev_squared_x4 =
-      _mm_mul_ps(weight_prev_x4, weight_prev_x4);
-  const __m128 weight_prev_4th_x4 =
-      _mm_mul_ps(weight_prev_squared_x4, weight_prev_squared_x4);
-
-  // Compute z[n], z[n-1], z[n-2], and z[n-3] in parallel in lanes 3, 2, 1 and
-  // 0, respectively.
-  __m128 max_x4 = _mm_setzero_ps();
-  __m128 ewma_x4 = _mm_setr_ps(0.0f, 0.0f, 0.0f, initial_value);
-  int i;
-  for (i = 0; i < last_index; i += 4) {
-    ewma_x4 = _mm_mul_ps(ewma_x4, weight_prev_4th_x4);
-    const __m128 sample_x4 = _mm_load_ps(src + i);
-    const __m128 sample_squared_x4 = _mm_mul_ps(sample_x4, sample_x4);
-    max_x4 = _mm_max_ps(max_x4, sample_squared_x4);
-    // Note: The compiler optimizes this to a single multiply-and-accumulate
-    // instruction:
-    ewma_x4 =
-        _mm_add_ps(ewma_x4, _mm_mul_ps(sample_squared_x4, smoothing_factor_x4));
-  }
-
-  // y[n] = z[n] + (1-a)^1(z[n-1]) + (1-a)^2(z[n-2]) + (1-a)^3(z[n-3])
-  float ewma = EXTRACT_FLOAT(ewma_x4, 3);
-  ewma_x4 = _mm_mul_ps(ewma_x4, weight_prev_x4);
-  ewma += EXTRACT_FLOAT(ewma_x4, 2);
-  ewma_x4 = _mm_mul_ps(ewma_x4, weight_prev_x4);
-  ewma += EXTRACT_FLOAT(ewma_x4, 1);
-  ewma_x4 = _mm_mul_ss(ewma_x4, weight_prev_x4);
-  ewma += EXTRACT_FLOAT(ewma_x4, 0);
-
-  // Fold the maximums together to get the overall maximum.
-  max_x4 = _mm_max_ps(max_x4,
-                      _mm_shuffle_ps(max_x4, max_x4, _MM_SHUFFLE(3, 3, 1, 1)));
-  max_x4 = _mm_max_ss(max_x4, _mm_shuffle_ps(max_x4, max_x4, 2));
-
-  std::pair<float, float> result(ewma, EXTRACT_FLOAT(max_x4, 0));
-
-  // Handle remaining values at the end of |src|.
-  for (; i < len; ++i) {
-    result.first *= weight_prev;
-    const float sample = src[i];
-    const float sample_squared = sample * sample;
-    result.first += sample_squared * smoothing_factor;
-    result.second = std::max(result.second, sample_squared);
-  }
-
-  return result;
-}
-#endif
-
-#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
-void FMAC_NEON(const float src[], float scale, int len, float dest[]) {
-  const int rem = len % 4;
-  const int last_index = len - rem;
-  float32x4_t m_scale = vmovq_n_f32(scale);
-  for (int i = 0; i < last_index; i += 4) {
-    vst1q_f32(dest + i,
-              vmlaq_f32(vld1q_f32(dest + i), vld1q_f32(src + i), m_scale));
-  }
-
-  // Handle any remaining values that wouldn't fit in an NEON pass.
-  for (int i = last_index; i < len; ++i) dest[i] += src[i] * scale;
-}
-
-void FMUL_NEON(const float src[], float scale, int len, float dest[]) {
-  const int rem = len % 4;
-  const int last_index = len - rem;
-  float32x4_t m_scale = vmovq_n_f32(scale);
-  for (int i = 0; i < last_index; i += 4)
-    vst1q_f32(dest + i, vmulq_f32(vld1q_f32(src + i), m_scale));
-
-  // Handle any remaining values that wouldn't fit in an NEON pass.
-  for (int i = last_index; i < len; ++i) dest[i] = src[i] * scale;
-}
-
-std::pair<float, float> EWMAAndMaxPower_NEON(float initial_value,
-                                             const float src[], int len,
-                                             float smoothing_factor) {
-  // When the recurrence is unrolled, we see that we can split it into 4
-  // separate lanes of evaluation:
-  //
-  // y[n] = a(S[n]^2) + (1-a)(y[n-1])
-  //      = a(S[n]^2) + (1-a)^1(aS[n-1]^2) + (1-a)^2(aS[n-2]^2) + ...
-  //      = z[n] + (1-a)^1(z[n-1]) + (1-a)^2(z[n-2]) + (1-a)^3(z[n-3])
-  //
-  // where z[n] = a(S[n]^2) + (1-a)^4(z[n-4]) + (1-a)^8(z[n-8]) + ...
-  //
-  // Thus, the strategy here is to compute z[n], z[n-1], z[n-2], and z[n-3] in
-  // each of the 4 lanes, and then combine them to give y[n].
-
-  const int rem = len % 4;
-  const int last_index = len - rem;
-
-  const float32x4_t smoothing_factor_x4 = vdupq_n_f32(smoothing_factor);
-  const float weight_prev = 1.0f - smoothing_factor;
-  const float32x4_t weight_prev_x4 = vdupq_n_f32(weight_prev);
-  const float32x4_t weight_prev_squared_x4 =
-      vmulq_f32(weight_prev_x4, weight_prev_x4);
-  const float32x4_t weight_prev_4th_x4 =
-      vmulq_f32(weight_prev_squared_x4, weight_prev_squared_x4);
-
-  // Compute z[n], z[n-1], z[n-2], and z[n-3] in parallel in lanes 3, 2, 1 and
-  // 0, respectively.
-  float32x4_t max_x4 = vdupq_n_f32(0.0f);
-  float32x4_t ewma_x4 = vsetq_lane_f32(initial_value, vdupq_n_f32(0.0f), 3);
-  int i;
-  for (i = 0; i < last_index; i += 4) {
-    ewma_x4 = vmulq_f32(ewma_x4, weight_prev_4th_x4);
-    const float32x4_t sample_x4 = vld1q_f32(src + i);
-    const float32x4_t sample_squared_x4 = vmulq_f32(sample_x4, sample_x4);
-    max_x4 = vmaxq_f32(max_x4, sample_squared_x4);
-    ewma_x4 = vmlaq_f32(ewma_x4, sample_squared_x4, smoothing_factor_x4);
-  }
-
-  // y[n] = z[n] + (1-a)^1(z[n-1]) + (1-a)^2(z[n-2]) + (1-a)^3(z[n-3])
-  float ewma = vgetq_lane_f32(ewma_x4, 3);
-  ewma_x4 = vmulq_f32(ewma_x4, weight_prev_x4);
-  ewma += vgetq_lane_f32(ewma_x4, 2);
-  ewma_x4 = vmulq_f32(ewma_x4, weight_prev_x4);
-  ewma += vgetq_lane_f32(ewma_x4, 1);
-  ewma_x4 = vmulq_f32(ewma_x4, weight_prev_x4);
-  ewma += vgetq_lane_f32(ewma_x4, 0);
-
-  // Fold the maximums together to get the overall maximum.
-  float32x2_t max_x2 = vpmax_f32(vget_low_f32(max_x4), vget_high_f32(max_x4));
-  max_x2 = vpmax_f32(max_x2, max_x2);
-
-  std::pair<float, float> result(ewma, vget_lane_f32(max_x2, 0));
-
-  // Handle remaining values at the end of |src|.
-  for (; i < len; ++i) {
-    result.first *= weight_prev;
-    const float sample = src[i];
-    const float sample_squared = sample * sample;
-    result.first += sample_squared * smoothing_factor;
-    result.second = std::max(result.second, sample_squared);
-  }
-
-  return result;
-}
-#endif
-
-}  // namespace vector_math
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/vector_math.h b/cobalt/media/base/vector_math.h
deleted file mode 100644
index 07e7d9b..0000000
--- a/cobalt/media/base/vector_math.h
+++ /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.
-
-#ifndef COBALT_MEDIA_BASE_VECTOR_MATH_H_
-#define COBALT_MEDIA_BASE_VECTOR_MATH_H_
-
-#include <utility>
-
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-namespace vector_math {
-
-// Required alignment for inputs and outputs to all vector math functions
-enum { kRequiredAlignment = 16 };
-
-// Multiply each element of |src| (up to |len|) by |scale| and add to |dest|.
-// |src| and |dest| must be aligned by kRequiredAlignment.
-MEDIA_EXPORT void FMAC(const float src[], float scale, int len, float dest[]);
-
-// Multiply each element of |src| by |scale| and store in |dest|.  |src| and
-// |dest| must be aligned by kRequiredAlignment.
-MEDIA_EXPORT void FMUL(const float src[], float scale, int len, float dest[]);
-
-// Computes the exponentially-weighted moving average power of a signal by
-// iterating the recurrence:
-//
-//   y[-1] = initial_value
-//   y[n] = smoothing_factor * src[n]^2 + (1-smoothing_factor) * y[n-1]
-//
-// Returns the final average power and the maximum squared element value.
-MEDIA_EXPORT std::pair<float, float> EWMAAndMaxPower(float initial_value,
-                                                     const float src[], int len,
-                                                     float smoothing_factor);
-
-MEDIA_EXPORT void Crossfade(const float src[], int len, float dest[]);
-
-}  // namespace vector_math
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VECTOR_MATH_H_
diff --git a/cobalt/media/base/vector_math_perftest.cc b/cobalt/media/base/vector_math_perftest.cc
deleted file mode 100644
index a69a4f6..0000000
--- a/cobalt/media/base/vector_math_perftest.cc
+++ /dev/null
@@ -1,147 +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 <memory>
-
-#include "base/basictypes.h"
-#include "base/memory/aligned_memory.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/vector_math.h"
-#include "cobalt/media/base/vector_math_testing.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
-
-using base::TimeTicks;
-using std::fill;
-
-namespace cobalt {
-namespace media {
-
-static const int kBenchmarkIterations = 200000;
-static const int kEWMABenchmarkIterations = 50000;
-static const float kScale = 0.5;
-static const int kVectorSize = 8192;
-
-class VectorMathPerfTest : public testing::Test {
- public:
-  VectorMathPerfTest() {
-    // Initialize input and output vectors.
-    input_vector_.reset(static_cast<float*>(base::AlignedAlloc(
-        sizeof(float) * kVectorSize, vector_math::kRequiredAlignment)));
-    output_vector_.reset(static_cast<float*>(base::AlignedAlloc(
-        sizeof(float) * kVectorSize, vector_math::kRequiredAlignment)));
-    fill(input_vector_.get(), input_vector_.get() + kVectorSize, 1.0f);
-    fill(output_vector_.get(), output_vector_.get() + kVectorSize, 0.0f);
-  }
-
-  void RunBenchmark(void (*fn)(const float[], float, int, float[]),
-                    bool aligned, const std::string& test_name,
-                    const std::string& trace_name) {
-    TimeTicks start = TimeTicks::Now();
-    for (int i = 0; i < kBenchmarkIterations; ++i) {
-      fn(input_vector_.get(), kScale, kVectorSize - (aligned ? 0 : 1),
-         output_vector_.get());
-    }
-    double total_time_milliseconds =
-        (TimeTicks::Now() - start).InMillisecondsF();
-    perf_test::PrintResult(test_name, "", trace_name,
-                           kBenchmarkIterations / total_time_milliseconds,
-                           "runs/ms", true);
-  }
-
-  void RunBenchmark(std::pair<float, float> (*fn)(float, const float[], int,
-                                                  float),
-                    int len, const std::string& test_name,
-                    const std::string& trace_name) {
-    TimeTicks start = TimeTicks::Now();
-    for (int i = 0; i < kEWMABenchmarkIterations; ++i) {
-      fn(0.5f, input_vector_.get(), len, 0.1f);
-    }
-    double total_time_milliseconds =
-        (TimeTicks::Now() - start).InMillisecondsF();
-    perf_test::PrintResult(test_name, "", trace_name,
-                           kEWMABenchmarkIterations / total_time_milliseconds,
-                           "runs/ms", true);
-  }
-
- protected:
-  std::unique_ptr<float, base::AlignedFreeDeleter> input_vector_;
-  std::unique_ptr<float, base::AlignedFreeDeleter> output_vector_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(VectorMathPerfTest);
-};
-
-// Define platform dependent function names for SIMD optimized methods.
-#if defined(ARCH_CPU_X86_FAMILY)
-#define FMAC_FUNC FMAC_SSE
-#define FMUL_FUNC FMUL_SSE
-#define EWMAAndMaxPower_FUNC EWMAAndMaxPower_SSE
-#elif defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
-#define FMAC_FUNC FMAC_NEON
-#define FMUL_FUNC FMUL_NEON
-#define EWMAAndMaxPower_FUNC EWMAAndMaxPower_NEON
-#endif
-
-// Benchmark for each optimized vector_math::FMAC() method.
-TEST_F(VectorMathPerfTest, FMAC) {
-  // Benchmark FMAC_C().
-  RunBenchmark(vector_math::FMAC_C, true, "vector_math_fmac", "unoptimized");
-#if defined(FMAC_FUNC)
-  // Benchmark FMAC_FUNC() with unaligned size.
-  ASSERT_NE(
-      (kVectorSize - 1) % (vector_math::kRequiredAlignment / sizeof(float)),
-      0U);
-  RunBenchmark(vector_math::FMAC_FUNC, false, "vector_math_fmac",
-               "optimized_unaligned");
-  // Benchmark FMAC_FUNC() with aligned size.
-  ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)),
-            0U);
-  RunBenchmark(vector_math::FMAC_FUNC, true, "vector_math_fmac",
-               "optimized_aligned");
-#endif
-}
-
-// Benchmark for each optimized vector_math::FMUL() method.
-TEST_F(VectorMathPerfTest, FMUL) {
-  // Benchmark FMUL_C().
-  RunBenchmark(vector_math::FMUL_C, true, "vector_math_fmul", "unoptimized");
-#if defined(FMUL_FUNC)
-  // Benchmark FMUL_FUNC() with unaligned size.
-  ASSERT_NE(
-      (kVectorSize - 1) % (vector_math::kRequiredAlignment / sizeof(float)),
-      0U);
-  RunBenchmark(vector_math::FMUL_FUNC, false, "vector_math_fmul",
-               "optimized_unaligned");
-  // Benchmark FMUL_FUNC() with aligned size.
-  ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)),
-            0U);
-  RunBenchmark(vector_math::FMUL_FUNC, true, "vector_math_fmul",
-               "optimized_aligned");
-#endif
-}
-
-// Benchmark for each optimized vector_math::EWMAAndMaxPower() method.
-TEST_F(VectorMathPerfTest, EWMAAndMaxPower) {
-  // Benchmark EWMAAndMaxPower_C().
-  RunBenchmark(vector_math::EWMAAndMaxPower_C, kVectorSize,
-               "vector_math_ewma_and_max_power", "unoptimized");
-#if defined(EWMAAndMaxPower_FUNC)
-  // Benchmark EWMAAndMaxPower_FUNC() with unaligned size.
-  ASSERT_NE(
-      (kVectorSize - 1) % (vector_math::kRequiredAlignment / sizeof(float)),
-      0U);
-  RunBenchmark(vector_math::EWMAAndMaxPower_FUNC, kVectorSize - 1,
-               "vector_math_ewma_and_max_power", "optimized_unaligned");
-  // Benchmark EWMAAndMaxPower_FUNC() with aligned size.
-  ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)),
-            0U);
-  RunBenchmark(vector_math::EWMAAndMaxPower_FUNC, kVectorSize,
-               "vector_math_ewma_and_max_power", "optimized_aligned");
-#endif
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/vector_math_testing.h b/cobalt/media/base/vector_math_testing.h
deleted file mode 100644
index 12dcec9..0000000
--- a/cobalt/media/base/vector_math_testing.h
+++ /dev/null
@@ -1,47 +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 COBALT_MEDIA_BASE_VECTOR_MATH_TESTING_H_
-#define COBALT_MEDIA_BASE_VECTOR_MATH_TESTING_H_
-
-#include <utility>
-
-#include "build/build_config.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-namespace vector_math {
-
-// Optimized versions exposed for testing.  See vector_math.h for details.
-MEDIA_EXPORT void FMAC_C(const float src[], float scale, int len, float dest[]);
-MEDIA_EXPORT void FMUL_C(const float src[], float scale, int len, float dest[]);
-MEDIA_EXPORT std::pair<float, float> EWMAAndMaxPower_C(float initial_value,
-                                                       const float src[],
-                                                       int len,
-                                                       float smoothing_factor);
-
-#if defined(ARCH_CPU_X86_FAMILY) && !defined(OS_NACL)
-MEDIA_EXPORT void FMAC_SSE(const float src[], float scale, int len,
-                           float dest[]);
-MEDIA_EXPORT void FMUL_SSE(const float src[], float scale, int len,
-                           float dest[]);
-MEDIA_EXPORT std::pair<float, float> EWMAAndMaxPower_SSE(
-    float initial_value, const float src[], int len, float smoothing_factor);
-#endif
-
-#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
-MEDIA_EXPORT void FMAC_NEON(const float src[], float scale, int len,
-                            float dest[]);
-MEDIA_EXPORT void FMUL_NEON(const float src[], float scale, int len,
-                            float dest[]);
-MEDIA_EXPORT std::pair<float, float> EWMAAndMaxPower_NEON(
-    float initial_value, const float src[], int len, float smoothing_factor);
-#endif
-
-}  // namespace vector_math
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VECTOR_MATH_TESTING_H_
diff --git a/cobalt/media/base/vector_math_unittest.cc b/cobalt/media/base/vector_math_unittest.cc
deleted file mode 100644
index 405a7e3..0000000
--- a/cobalt/media/base/vector_math_unittest.cc
+++ /dev/null
@@ -1,383 +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.
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-#include <cmath>
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/memory/aligned_memory.h"
-#include "base/stringize_macros.h"
-#include "base/strings/string_number_conversions.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/vector_math.h"
-#include "cobalt/media/base/vector_math_testing.h"
-#include "starboard/memory.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using std::fill;
-
-namespace cobalt {
-namespace media {
-
-// Default test values.
-static const float kScale = 0.5;
-static const float kInputFillValue = 1.0;
-static const float kOutputFillValue = 3.0;
-static const int kVectorSize = 8192;
-
-class VectorMathTest : public testing::Test {
- public:
-  VectorMathTest() {
-    // Initialize input and output vectors.
-    input_vector_.reset(static_cast<float*>(base::AlignedAlloc(
-        sizeof(float) * kVectorSize, vector_math::kRequiredAlignment)));
-    output_vector_.reset(static_cast<float*>(base::AlignedAlloc(
-        sizeof(float) * kVectorSize, vector_math::kRequiredAlignment)));
-  }
-
-  void FillTestVectors(float input, float output) {
-    // Setup input and output vectors.
-    fill(input_vector_.get(), input_vector_.get() + kVectorSize, input);
-    fill(output_vector_.get(), output_vector_.get() + kVectorSize, output);
-  }
-
-  void VerifyOutput(float value) {
-    for (int i = 0; i < kVectorSize; ++i)
-      ASSERT_FLOAT_EQ(output_vector_[i], value);
-  }
-
- protected:
-  std::unique_ptr<float[], base::AlignedFreeDeleter> input_vector_;
-  std::unique_ptr<float[], base::AlignedFreeDeleter> output_vector_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(VectorMathTest);
-};
-
-// Ensure each optimized vector_math::FMAC() method returns the same value.
-TEST_F(VectorMathTest, FMAC) {
-  static const float kResult = kInputFillValue * kScale + kOutputFillValue;
-
-  {
-    SCOPED_TRACE("FMAC");
-    FillTestVectors(kInputFillValue, kOutputFillValue);
-    vector_math::FMAC(input_vector_.get(), kScale, kVectorSize,
-                      output_vector_.get());
-    VerifyOutput(kResult);
-  }
-
-  {
-    SCOPED_TRACE("FMAC_C");
-    FillTestVectors(kInputFillValue, kOutputFillValue);
-    vector_math::FMAC_C(input_vector_.get(), kScale, kVectorSize,
-                        output_vector_.get());
-    VerifyOutput(kResult);
-  }
-
-#if defined(ARCH_CPU_X86_FAMILY)
-  {
-    SCOPED_TRACE("FMAC_SSE");
-    FillTestVectors(kInputFillValue, kOutputFillValue);
-    vector_math::FMAC_SSE(input_vector_.get(), kScale, kVectorSize,
-                          output_vector_.get());
-    VerifyOutput(kResult);
-  }
-#endif
-
-#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
-  {
-    SCOPED_TRACE("FMAC_NEON");
-    FillTestVectors(kInputFillValue, kOutputFillValue);
-    vector_math::FMAC_NEON(input_vector_.get(), kScale, kVectorSize,
-                           output_vector_.get());
-    VerifyOutput(kResult);
-  }
-#endif
-}
-
-// Ensure each optimized vector_math::FMUL() method returns the same value.
-TEST_F(VectorMathTest, FMUL) {
-  static const float kResult = kInputFillValue * kScale;
-
-  {
-    SCOPED_TRACE("FMUL");
-    FillTestVectors(kInputFillValue, kOutputFillValue);
-    vector_math::FMUL(input_vector_.get(), kScale, kVectorSize,
-                      output_vector_.get());
-    VerifyOutput(kResult);
-  }
-
-  {
-    SCOPED_TRACE("FMUL_C");
-    FillTestVectors(kInputFillValue, kOutputFillValue);
-    vector_math::FMUL_C(input_vector_.get(), kScale, kVectorSize,
-                        output_vector_.get());
-    VerifyOutput(kResult);
-  }
-
-#if defined(ARCH_CPU_X86_FAMILY)
-  {
-    SCOPED_TRACE("FMUL_SSE");
-    FillTestVectors(kInputFillValue, kOutputFillValue);
-    vector_math::FMUL_SSE(input_vector_.get(), kScale, kVectorSize,
-                          output_vector_.get());
-    VerifyOutput(kResult);
-  }
-#endif
-
-#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
-  {
-    SCOPED_TRACE("FMUL_NEON");
-    FillTestVectors(kInputFillValue, kOutputFillValue);
-    vector_math::FMUL_NEON(input_vector_.get(), kScale, kVectorSize,
-                           output_vector_.get());
-    VerifyOutput(kResult);
-  }
-#endif
-}
-
-TEST_F(VectorMathTest, Crossfade) {
-  FillTestVectors(0, 1);
-  vector_math::Crossfade(input_vector_.get(), kVectorSize,
-                         output_vector_.get());
-  for (int i = 0; i < kVectorSize; ++i) {
-    ASSERT_FLOAT_EQ(i / static_cast<float>(kVectorSize), output_vector_[i])
-        << "i=" << i;
-  }
-}
-
-class EWMATestScenario {
- public:
-  EWMATestScenario(float initial_value, const float src[], int len,
-                   float smoothing_factor)
-      : initial_value_(initial_value),
-        data_(static_cast<float*>(
-            len == 0 ? NULL
-                     : base::AlignedAlloc(len * sizeof(float),
-                                          vector_math::kRequiredAlignment))),
-        data_len_(len),
-        smoothing_factor_(smoothing_factor),
-        expected_final_avg_(initial_value),
-        expected_max_(0.0f) {
-    if (data_len_ > 0) memcpy(data_.get(), src, len * sizeof(float));
-  }
-
-  // Copy constructor and assignment operator for ::testing::Values(...).
-  EWMATestScenario(const EWMATestScenario& other) { *this = other; }
-  EWMATestScenario& operator=(const EWMATestScenario& other) {
-    this->initial_value_ = other.initial_value_;
-    this->smoothing_factor_ = other.smoothing_factor_;
-    if (other.data_len_ == 0) {
-      this->data_.reset();
-    } else {
-      this->data_.reset(static_cast<float*>(base::AlignedAlloc(
-          other.data_len_ * sizeof(float), vector_math::kRequiredAlignment)));
-      memcpy(this->data_.get(), other.data_.get(),
-                   other.data_len_ * sizeof(float));
-    }
-    this->data_len_ = other.data_len_;
-    this->expected_final_avg_ = other.expected_final_avg_;
-    this->expected_max_ = other.expected_max_;
-    return *this;
-  }
-
-  EWMATestScenario ScaledBy(float scale) const {
-    EWMATestScenario result(*this);
-    float* p = result.data_.get();
-    float* const p_end = p + result.data_len_;
-    for (; p < p_end; ++p) *p *= scale;
-    return result;
-  }
-
-  EWMATestScenario WithImpulse(float value, int offset) const {
-    EWMATestScenario result(*this);
-    result.data_.get()[offset] = value;
-    return result;
-  }
-
-  EWMATestScenario HasExpectedResult(float final_avg_value,
-                                     float max_value) const {
-    EWMATestScenario result(*this);
-    result.expected_final_avg_ = final_avg_value;
-    result.expected_max_ = max_value;
-    return result;
-  }
-
-  void RunTest() const {
-    {
-      SCOPED_TRACE("EWMAAndMaxPower");
-      const std::pair<float, float>& result = vector_math::EWMAAndMaxPower(
-          initial_value_, data_.get(), data_len_, smoothing_factor_);
-      EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f);
-      EXPECT_NEAR(expected_max_, result.second, 0.0000001f);
-    }
-
-    {
-      SCOPED_TRACE("EWMAAndMaxPower_C");
-      const std::pair<float, float>& result = vector_math::EWMAAndMaxPower_C(
-          initial_value_, data_.get(), data_len_, smoothing_factor_);
-      EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f);
-      EXPECT_NEAR(expected_max_, result.second, 0.0000001f);
-    }
-
-#if defined(ARCH_CPU_X86_FAMILY)
-    {
-      SCOPED_TRACE("EWMAAndMaxPower_SSE");
-      const std::pair<float, float>& result = vector_math::EWMAAndMaxPower_SSE(
-          initial_value_, data_.get(), data_len_, smoothing_factor_);
-      EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f);
-      EXPECT_NEAR(expected_max_, result.second, 0.0000001f);
-    }
-#endif
-
-#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
-    {
-      SCOPED_TRACE("EWMAAndMaxPower_NEON");
-      const std::pair<float, float>& result = vector_math::EWMAAndMaxPower_NEON(
-          initial_value_, data_.get(), data_len_, smoothing_factor_);
-      EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f);
-      EXPECT_NEAR(expected_max_, result.second, 0.0000001f);
-    }
-#endif
-  }
-
- private:
-  float initial_value_;
-  std::unique_ptr<float, base::AlignedFreeDeleter> data_;
-  int data_len_;
-  float smoothing_factor_;
-  float expected_final_avg_;
-  float expected_max_;
-};
-
-typedef testing::TestWithParam<EWMATestScenario> VectorMathEWMAAndMaxPowerTest;
-
-TEST_P(VectorMathEWMAAndMaxPowerTest, Correctness) { GetParam().RunTest(); }
-
-static const float kZeros[] = {  // 32 zeros
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
-static const float kOnes[] = {  // 32 ones
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
-
-static const float kCheckerboard[] = {  // 32 alternating 0, 1
-    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
-    0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1};
-
-static const float kInverseCheckerboard[] = {  // 32 alternating 1, 0
-    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
-    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
-
-INSTANTIATE_TEST_CASE_P(
-    Scenarios, VectorMathEWMAAndMaxPowerTest,
-    ::testing::Values(
-        // Zero-length input: Result should equal initial value.
-        EWMATestScenario(0.0f, NULL, 0, 0.0f).HasExpectedResult(0.0f, 0.0f),
-        EWMATestScenario(1.0f, NULL, 0, 0.0f).HasExpectedResult(1.0f, 0.0f),
-
-        // Smoothing factor of zero: Samples have no effect on result.
-        EWMATestScenario(0.0f, kOnes, 32, 0.0f).HasExpectedResult(0.0f, 1.0f),
-        EWMATestScenario(1.0f, kZeros, 32, 0.0f).HasExpectedResult(1.0f, 0.0f),
-
-        // Smoothing factor of one: Result = last sample squared.
-        EWMATestScenario(0.0f, kCheckerboard, 32, 1.0f)
-            .ScaledBy(2.0f)
-            .HasExpectedResult(4.0f, 4.0f),
-        EWMATestScenario(1.0f, kInverseCheckerboard, 32, 1.0f)
-            .ScaledBy(2.0f)
-            .HasExpectedResult(0.0f, 4.0f),
-
-        // Smoothing factor of 1/4, muted signal.
-        EWMATestScenario(1.0f, kZeros, 1, 0.25f)
-            .HasExpectedResult(powf(0.75, 1.0f), 0.0f),
-        EWMATestScenario(1.0f, kZeros, 2, 0.25f)
-            .HasExpectedResult(powf(0.75, 2.0f), 0.0f),
-        EWMATestScenario(1.0f, kZeros, 3, 0.25f)
-            .HasExpectedResult(powf(0.75, 3.0f), 0.0f),
-        EWMATestScenario(1.0f, kZeros, 12, 0.25f)
-            .HasExpectedResult(powf(0.75, 12.0f), 0.0f),
-        EWMATestScenario(1.0f, kZeros, 13, 0.25f)
-            .HasExpectedResult(powf(0.75, 13.0f), 0.0f),
-        EWMATestScenario(1.0f, kZeros, 14, 0.25f)
-            .HasExpectedResult(powf(0.75, 14.0f), 0.0f),
-        EWMATestScenario(1.0f, kZeros, 15, 0.25f)
-            .HasExpectedResult(powf(0.75, 15.0f), 0.0f),
-
-        // Smoothing factor of 1/4, constant full-amplitude signal.
-        EWMATestScenario(0.0f, kOnes, 1, 0.25f).HasExpectedResult(0.25f, 1.0f),
-        EWMATestScenario(0.0f, kOnes, 2, 0.25f)
-            .HasExpectedResult(0.4375f, 1.0f),
-        EWMATestScenario(0.0f, kOnes, 3, 0.25f)
-            .HasExpectedResult(0.578125f, 1.0f),
-        EWMATestScenario(0.0f, kOnes, 12, 0.25f)
-            .HasExpectedResult(0.96832365f, 1.0f),
-        EWMATestScenario(0.0f, kOnes, 13, 0.25f)
-            .HasExpectedResult(0.97624274f, 1.0f),
-        EWMATestScenario(0.0f, kOnes, 14, 0.25f)
-            .HasExpectedResult(0.98218205f, 1.0f),
-        EWMATestScenario(0.0f, kOnes, 15, 0.25f)
-            .HasExpectedResult(0.98663654f, 1.0f),
-
-        // Smoothing factor of 1/4, checkerboard signal.
-        EWMATestScenario(0.0f, kCheckerboard, 1, 0.25f)
-            .HasExpectedResult(0.0f, 0.0f),
-        EWMATestScenario(0.0f, kCheckerboard, 2, 0.25f)
-            .HasExpectedResult(0.25f, 1.0f),
-        EWMATestScenario(0.0f, kCheckerboard, 3, 0.25f)
-            .HasExpectedResult(0.1875f, 1.0f),
-        EWMATestScenario(0.0f, kCheckerboard, 12, 0.25f)
-            .HasExpectedResult(0.55332780f, 1.0f),
-        EWMATestScenario(0.0f, kCheckerboard, 13, 0.25f)
-            .HasExpectedResult(0.41499585f, 1.0f),
-        EWMATestScenario(0.0f, kCheckerboard, 14, 0.25f)
-            .HasExpectedResult(0.56124689f, 1.0f),
-        EWMATestScenario(0.0f, kCheckerboard, 15, 0.25f)
-            .HasExpectedResult(0.42093517f, 1.0f),
-
-        // Smoothing factor of 1/4, inverse checkerboard signal.
-        EWMATestScenario(0.0f, kInverseCheckerboard, 1, 0.25f)
-            .HasExpectedResult(0.25f, 1.0f),
-        EWMATestScenario(0.0f, kInverseCheckerboard, 2, 0.25f)
-            .HasExpectedResult(0.1875f, 1.0f),
-        EWMATestScenario(0.0f, kInverseCheckerboard, 3, 0.25f)
-            .HasExpectedResult(0.390625f, 1.0f),
-        EWMATestScenario(0.0f, kInverseCheckerboard, 12, 0.25f)
-            .HasExpectedResult(0.41499585f, 1.0f),
-        EWMATestScenario(0.0f, kInverseCheckerboard, 13, 0.25f)
-            .HasExpectedResult(0.56124689f, 1.0f),
-        EWMATestScenario(0.0f, kInverseCheckerboard, 14, 0.25f)
-            .HasExpectedResult(0.42093517f, 1.0f),
-        EWMATestScenario(0.0f, kInverseCheckerboard, 15, 0.25f)
-            .HasExpectedResult(0.56570137f, 1.0f),
-
-        // Smoothing factor of 1/4, impulse signal.
-        EWMATestScenario(0.0f, kZeros, 3, 0.25f)
-            .WithImpulse(2.0f, 0)
-            .HasExpectedResult(0.562500f, 4.0f),
-        EWMATestScenario(0.0f, kZeros, 3, 0.25f)
-            .WithImpulse(2.0f, 1)
-            .HasExpectedResult(0.75f, 4.0f),
-        EWMATestScenario(0.0f, kZeros, 3, 0.25f)
-            .WithImpulse(2.0f, 2)
-            .HasExpectedResult(1.0f, 4.0f),
-        EWMATestScenario(0.0f, kZeros, 32, 0.25f)
-            .WithImpulse(2.0f, 0)
-            .HasExpectedResult(0.00013394f, 4.0f),
-        EWMATestScenario(0.0f, kZeros, 32, 0.25f)
-            .WithImpulse(2.0f, 1)
-            .HasExpectedResult(0.00017858f, 4.0f),
-        EWMATestScenario(0.0f, kZeros, 32, 0.25f)
-            .WithImpulse(2.0f, 2)
-            .HasExpectedResult(0.00023811f, 4.0f),
-        EWMATestScenario(0.0f, kZeros, 32, 0.25f)
-            .WithImpulse(2.0f, 3)
-            .HasExpectedResult(0.00031748f, 4.0f)));
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/video_codecs.cc b/cobalt/media/base/video_codecs.cc
deleted file mode 100644
index 07d88c8..0000000
--- a/cobalt/media/base/video_codecs.cc
+++ /dev/null
@@ -1,621 +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 "cobalt/media/base/video_codecs.h"
-
-#include <vector>
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "starboard/common/string.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-// The names come from src/third_party/ffmpeg/libavcodec/codec_desc.c
-std::string GetCodecName(VideoCodec codec) {
-  switch (codec) {
-    case kUnknownVideoCodec:
-      return "unknown";
-    case kCodecH264:
-      return "h264";
-    case kCodecHEVC:
-      return "hevc";
-    case kCodecDolbyVision:
-      return "dolbyvision";
-    case kCodecVC1:
-      return "vc1";
-    case kCodecMPEG2:
-      return "mpeg2video";
-    case kCodecMPEG4:
-      return "mpeg4";
-    case kCodecTheora:
-      return "theora";
-    case kCodecVP8:
-      return "vp8";
-    case kCodecVP9:
-      return "vp9";
-    case kCodecAV1:
-      return "av1";
-  }
-  NOTREACHED();
-  return "";
-}
-
-std::string GetProfileName(VideoCodecProfile profile) {
-  switch (profile) {
-    case VIDEO_CODEC_PROFILE_UNKNOWN:
-      return "unknown";
-    case H264PROFILE_BASELINE:
-      return "h264 baseline";
-    case H264PROFILE_MAIN:
-      return "h264 main";
-    case H264PROFILE_EXTENDED:
-      return "h264 extended";
-    case H264PROFILE_HIGH:
-      return "h264 high";
-    case H264PROFILE_HIGH10PROFILE:
-      return "h264 high 10";
-    case H264PROFILE_HIGH422PROFILE:
-      return "h264 high 4:2:2";
-    case H264PROFILE_HIGH444PREDICTIVEPROFILE:
-      return "h264 high 4:4:4 predictive";
-    case H264PROFILE_SCALABLEBASELINE:
-      return "h264 scalable baseline";
-    case H264PROFILE_SCALABLEHIGH:
-      return "h264 scalable high";
-    case H264PROFILE_STEREOHIGH:
-      return "h264 stereo high";
-    case H264PROFILE_MULTIVIEWHIGH:
-      return "h264 multiview high";
-    case HEVCPROFILE_MAIN:
-      return "hevc main";
-    case HEVCPROFILE_MAIN10:
-      return "hevc main 10";
-    case HEVCPROFILE_MAIN_STILL_PICTURE:
-      return "hevc main still-picture";
-    case VP8PROFILE_ANY:
-      return "vp8";
-    case VP9PROFILE_PROFILE0:
-      return "vp9 profile0";
-    case VP9PROFILE_PROFILE1:
-      return "vp9 profile1";
-    case VP9PROFILE_PROFILE2:
-      return "vp9 profile2";
-    case VP9PROFILE_PROFILE3:
-      return "vp9 profile3";
-    case DOLBYVISION_PROFILE0:
-      return "dolby vision profile 0";
-    case DOLBYVISION_PROFILE4:
-      return "dolby vision profile 4";
-    case DOLBYVISION_PROFILE5:
-      return "dolby vision profile 5";
-    case DOLBYVISION_PROFILE7:
-      return "dolby vision profile 7";
-    case THEORAPROFILE_ANY:
-      return "theora";
-    case AV1PROFILE_PROFILE_MAIN:
-      return "av1 profile main";
-    case AV1PROFILE_PROFILE_HIGH:
-      return "av1 profile high";
-    case AV1PROFILE_PROFILE_PRO:
-      return "av1 profile pro";
-  }
-  NOTREACHED();
-  return "";
-}
-
-bool ParseNewStyleVp9CodecID(const std::string& codec_id,
-                             VideoCodecProfile* profile,
-                             uint8_t* level_idc) {
-  std::vector<std::string> fields = base::SplitString(
-      codec_id, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-
-  // TODO(kqyang): The spec specifies 8 fields. We do not allow missing or extra
-  // fields. See crbug.com/667834.
-  if (fields.size() != 8)
-    return false;
-
-  if (fields[0] != "vp09")
-    return false;
-
-  std::vector<int> values;
-  for (size_t i = 1; i < fields.size(); ++i) {
-    // Missing value is not allowed.
-    if (fields[i] == "")
-      return false;
-    int value;
-    if (!base::StringToInt(fields[i], &value))
-      return false;
-    if (value < 0)
-      return false;
-    values.push_back(value);
-  }
-
-  const int profile_idc = values[0];
-  switch (profile_idc) {
-    case 0:
-      *profile = VP9PROFILE_PROFILE0;
-      break;
-    case 1:
-      *profile = VP9PROFILE_PROFILE1;
-      break;
-    case 2:
-      *profile = VP9PROFILE_PROFILE2;
-      break;
-    case 3:
-      *profile = VP9PROFILE_PROFILE3;
-      break;
-    default:
-      return false;
-  }
-
-  *level_idc = values[1];
-  // TODO(kqyang): Check if |level_idc| is valid. See crbug.com/667834.
-
-  const int bit_depth = values[2];
-  if (bit_depth != 8 && bit_depth != 10 && bit_depth != 12)
-    return false;
-
-  const int color_space = values[3];
-  if (color_space > 7)
-    return false;
-
-  const int chroma_subsampling = values[4];
-  if (chroma_subsampling > 3)
-    return false;
-
-  const int transfer_function = values[5];
-  if (transfer_function > 1)
-    return false;
-
-  const int video_full_range_flag = values[6];
-  if (video_full_range_flag > 1)
-    return false;
-
-  return true;
-}
-
-bool ParseLegacyVp9CodecID(const std::string& codec_id,
-                           VideoCodecProfile* profile,
-                           uint8_t* level_idc) {
-  if (codec_id == "vp9" || codec_id == "vp9.0") {
-    // Profile is not included in the codec string. Assuming profile 0 to be
-    // backward compatible.
-    *profile = VP9PROFILE_PROFILE0;
-    // Use 0 to indicate unknown level.
-    *level_idc = 0;
-    return true;
-  }
-  return false;
-}
-
-bool ParseAv1CodecId(const std::string& codec_id, VideoCodecProfile* profile,
-                     uint8_t* level_idc, gfx::ColorSpace* color_space) {
-  // The codecs parameter string for the AOM AV1 codec is as follows:
-  // See https://aomediacodec.github.io/av1-isobmff/#codecsparam.
-  //
-  // <sample entry4CC>.<profile>.<level><tier>.<bitDepth>.<monochrome>.
-  // <chromaSubsampling>.<colorPrimaries>.<transferCharacteristics>.
-  // <matrixCoefficients>.<videoFullRangeFlag>
-
-  // TODO: Replace the following code using
-  //         std::vector<std::string> fields = base::SplitString(
-  //             codec_id, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-  //       once Chromium base rebase is finished.
-  if (strchr(codec_id.c_str(), ' ') != nullptr) {
-    return false;
-  }
-  if (strstr(codec_id.c_str(), "..") != nullptr) {
-    return false;
-  }
-  std::vector<std::string> fields = base::SplitString(
-      codec_id, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-
-  // The parameters sample entry 4CC, profile, level, tier, and bitDepth are all
-  // mandatory fields. If any of these fields are empty, or not within their
-  // allowed range, the processing device SHOULD treat it as an error.
-  if (fields.size() < 4 || fields.size() > 10) {
-    DVLOG(3) << __func__ << " Invalid number of fields (" << fields.size()
-             << ")";
-    return false;
-  }
-
-  // All the other fields (including their leading '.') are optional, mutually
-  // inclusive (all or none) fields. If not specified then the values listed in
-  // the table below are assumed.
-  //
-  // mono_chrome              0
-  // chromaSubsampling        112 (4:2:0 colocated with luma (0,0))
-  // colorPrimaries           1 (ITU-R BT.709)
-  // transferCharacteristics  1 (ITU-R BT.709)
-  // matrixCoefficients       1 (ITU-R BT.709)
-  // videoFullRangeFlag       0 (studio swing representation)
-  *color_space = gfx::ColorSpace::CreateREC709();
-
-  if (fields[0] != "av01") {
-    DVLOG(3) << __func__ << " Invalid AV1 4CC (" << fields[0] << ")";
-    return false;
-  }
-
-  // The level parameter value SHALL equal the first level value indicated by
-  // seq_level_idx in the Sequence Header. The tier parameter value SHALL be
-  // equal to M when the first seq_tier value in the Sequence Header is equal to
-  // 0, and H when it is equal to 1.
-  if (fields[2].size() != 3 || (fields[2][2] != 'M' && fields[2][2] != 'H')) {
-    DVLOG(3) << __func__ << " Invalid level+tier (" << fields[2] << ")";
-    return false;
-  }
-
-  // Since tier has been validated, strip the trailing tier indicator to allow
-  // int conversion below.
-  fields[2].resize(2);
-
-  // Fill with dummy values to ensure parallel indices with fields.
-  std::vector<int> values(fields.size(), 0);
-  for (size_t i = 1; i < fields.size(); ++i) {
-    if (fields[i].empty()) {
-      DVLOG(3) << __func__ << " Invalid empty field (position:" << i << ")";
-      return false;
-    }
-
-    if (!base::StringToInt(fields[i], &values[i]) || values[i] < 0) {
-      DVLOG(3) << __func__ << " Invalid field value (" << values[i] << ")";
-      return false;
-    }
-  }
-
-  // The profile parameter value, represented by a single digit decimal, SHALL
-  // equal the value of seq_profile in the Sequence Header.
-  const int profile_idc = fields[1].size() == 1 ? values[1] : -1;
-  switch (profile_idc) {
-    case 0:
-      *profile = AV1PROFILE_PROFILE_MAIN;
-      break;
-    case 1:
-      *profile = AV1PROFILE_PROFILE_HIGH;
-      break;
-    case 2:
-      *profile = AV1PROFILE_PROFILE_PRO;
-      break;
-    default:
-      DVLOG(3) << __func__ << " Invalid profile (" << fields[1] << ")";
-      return false;
-  }
-
-  // The level parameter value SHALL equal the first level value indicated by
-  // seq_level_idx in the Sequence Header. Note: We validate that this field has
-  // the required leading zeros above.
-  *level_idc = values[2];
-  if (*level_idc > 31) {
-    DVLOG(3) << __func__ << " Invalid level (" << *level_idc << ")";
-    return false;
-  }
-
-  // The bitDepth parameter value SHALL equal the value of BitDepth variable as
-  // defined in [AV1] derived from the Sequence Header. Leading zeros required.
-  const int bit_depth = values[3];
-  if (fields[3].size() != 2 ||
-      (bit_depth != 8 && bit_depth != 10 && bit_depth != 12)) {
-    DVLOG(3) << __func__ << " Invalid bit-depth (" << fields[3] << ")";
-    return false;
-  }
-
-  if (values.size() <= 4) return true;
-
-  // The monochrome parameter value, represented by a single digit decimal,
-  // SHALL equal the value of mono_chrome in the Sequence Header.
-  const int monochrome = values[4];
-  if (fields[4].size() != 1 || monochrome > 1) {
-    DVLOG(3) << __func__ << " Invalid monochrome (" << fields[4] << ")";
-    return false;
-  }
-
-  if (values.size() <= 5) return true;
-
-  // The chromaSubsampling parameter value, represented by a three-digit
-  // decimal, SHALL have its first digit equal to subsampling_x and its second
-  // digit equal to subsampling_y. If both subsampling_x and subsampling_y are
-  // set to 1, then the third digit SHALL be equal to chroma_sample_position,
-  // otherwise it SHALL be set to 0.
-  if (fields[5].size() != 3) {
-    DVLOG(3) << __func__ << " Invalid chroma subsampling (" << fields[5] << ")";
-    return false;
-  }
-
-  const char subsampling_x = fields[5][0];
-  const char subsampling_y = fields[5][1];
-  const char chroma_sample_position = fields[5][2];
-  if ((subsampling_x < '0' || subsampling_x > '1') ||
-      (subsampling_y < '0' || subsampling_y > '1') ||
-      (chroma_sample_position < '0' || chroma_sample_position > '3')) {
-    DVLOG(3) << __func__ << " Invalid chroma subsampling (" << fields[5] << ")";
-    return false;
-  }
-
-  if (((subsampling_x == '0' || subsampling_y == '0') &&
-       chroma_sample_position != '0')) {
-    DVLOG(3) << __func__ << " Invalid chroma subsampling (" << fields[5] << ")";
-    return false;
-  }
-
-  if (values.size() <= 6) return true;
-
-  // The colorPrimaries, transferCharacteristics, matrixCoefficients and
-  // videoFullRangeFlag parameter values SHALL equal the value of matching
-  // fields in the Sequence Header, if color_description_present_flag is set to
-  // 1, otherwise they SHOULD not be set, defaulting to the values below. The
-  // videoFullRangeFlag is represented by a single digit.
-  auto primaries = gfx::ColorSpace::PrimaryIDFromInt(values[6]);
-  if (fields[6].size() != 2 ||
-      primaries == gfx::ColorSpace::kPrimaryIdReserved0) {
-    DVLOG(3) << __func__ << " Invalid color primaries (" << fields[6] << ")";
-    return false;
-  }
-
-  if (values.size() <= 7) return true;
-
-  auto transfer = gfx::ColorSpace::TransferIDFromInt(values[7]);
-  if (fields[7].size() != 2 ||
-      transfer == gfx::ColorSpace::kTransferIdReserved0) {
-    DVLOG(3) << __func__ << " Invalid transfer function (" << fields[7] << ")";
-    return false;
-  }
-
-  if (values.size() <= 8) return true;
-
-  auto matrix = gfx::ColorSpace::MatrixIDFromInt(values[8]);
-  if (fields[8].size() != 2 || matrix == gfx::ColorSpace::kMatrixIdUnknown) {
-    // TODO: AV1 allows a few matrices we don't support yet.
-    //       https://crbug.com/854290
-    if (values[8] == 12 || values[8] == 13 || values[8] == 14) {
-      DVLOG(3) << __func__ << " Unsupported matrix coefficients (" << fields[8]
-               << ")";
-    } else {
-      DVLOG(3) << __func__ << " Invalid matrix coefficients (" << fields[8]
-               << ")";
-    }
-    return false;
-  }
-
-  if (values.size() <= 9) return true;
-
-  const int video_full_range_flag = values[9];
-  if (fields[9].size() != 1 || video_full_range_flag > 1) {
-    DVLOG(3) << __func__ << " Invalid full range flag (" << fields[9] << ")";
-    return false;
-  }
-  auto range = video_full_range_flag == 1 ? gfx::ColorSpace::kRangeIdFull
-                                          : gfx::ColorSpace::kRangeIdLimited;
-  *color_space = gfx::ColorSpace(primaries, transfer, matrix, range);
-  return true;
-}
-
-bool ParseAVCCodecId(const std::string& codec_id, VideoCodecProfile* profile,
-                     uint8_t* level_idc) {
-  // Make sure we have avc1.xxxxxx or avc3.xxxxxx , where xxxxxx are hex digits
-  if (!StartsWith(codec_id, "avc1.", base::CompareCase::SENSITIVE) &&
-      !StartsWith(codec_id, "avc3.", base::CompareCase::SENSITIVE)) {
-    return false;
-  }
-  uint32_t elem = 0;
-  if (codec_id.size() != 11 ||
-      !base::HexStringToUInt(base::StringPiece(codec_id).substr(5), &elem)) {
-    DVLOG(4) << __func__ << ": invalid avc codec id (" << codec_id << ")";
-    return false;
-  }
-
-  uint8_t level_byte = elem & 0xFF;
-  uint8_t constraints_byte = (elem >> 8) & 0xFF;
-  uint8_t profile_idc = (elem >> 16) & 0xFF;
-
-  // Check that the lower two bits of |constraints_byte| are zero (those are
-  // reserved and must be zero according to ISO IEC 14496-10).
-  if (constraints_byte & 3) {
-    DVLOG(4) << __func__ << ": non-zero reserved bits in codec id " << codec_id;
-    return false;
-  }
-
-  VideoCodecProfile out_profile = VIDEO_CODEC_PROFILE_UNKNOWN;
-  // profile_idc values for each profile are taken from ISO IEC 14496-10 and
-  // https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Profiles
-  switch (profile_idc) {
-    case 66:
-      out_profile = H264PROFILE_BASELINE;
-      break;
-    case 77:
-      out_profile = H264PROFILE_MAIN;
-      break;
-    case 83:
-      out_profile = H264PROFILE_SCALABLEBASELINE;
-      break;
-    case 86:
-      out_profile = H264PROFILE_SCALABLEHIGH;
-      break;
-    case 88:
-      out_profile = H264PROFILE_EXTENDED;
-      break;
-    case 100:
-      out_profile = H264PROFILE_HIGH;
-      break;
-    case 110:
-      out_profile = H264PROFILE_HIGH10PROFILE;
-      break;
-    case 118:
-      out_profile = H264PROFILE_MULTIVIEWHIGH;
-      break;
-    case 122:
-      out_profile = H264PROFILE_HIGH422PROFILE;
-      break;
-    case 128:
-      out_profile = H264PROFILE_STEREOHIGH;
-      break;
-    case 244:
-      out_profile = H264PROFILE_HIGH444PREDICTIVEPROFILE;
-      break;
-    default:
-      DVLOG(1) << "Warning: unrecognized AVC/H.264 profile " << profile_idc;
-      return false;
-  }
-
-  // TODO(servolk): Take into account also constraint set flags 3 through 5.
-  uint8_t constraint_set0_flag = (constraints_byte >> 7) & 1;
-  uint8_t constraint_set1_flag = (constraints_byte >> 6) & 1;
-  uint8_t constraint_set2_flag = (constraints_byte >> 5) & 1;
-  if (constraint_set2_flag && out_profile > H264PROFILE_EXTENDED) {
-    out_profile = H264PROFILE_EXTENDED;
-  }
-  if (constraint_set1_flag && out_profile > H264PROFILE_MAIN) {
-    out_profile = H264PROFILE_MAIN;
-  }
-  if (constraint_set0_flag && out_profile > H264PROFILE_BASELINE) {
-    out_profile = H264PROFILE_BASELINE;
-  }
-
-  if (level_idc) *level_idc = level_byte;
-
-  if (profile) *profile = out_profile;
-
-  return true;
-}
-
-// The specification for HEVC codec id strings can be found in ISO IEC 14496-15
-// dated 2012 or newer in the Annex E.3
-bool ParseHEVCCodecId(const std::string& codec_id, VideoCodecProfile* profile,
-                      uint8_t* level_idc) {
-  if (!StartsWith(codec_id, "hev1.", base::CompareCase::SENSITIVE) &&
-      !StartsWith(codec_id, "hvc1.", base::CompareCase::SENSITIVE)) {
-    return false;
-  }
-
-  // HEVC codec id consists of:
-  const int kMaxHevcCodecIdLength =
-      5 +  // 'hev1.' or 'hvc1.' prefix (5 chars)
-      4 +  // profile, e.g. '.A12' (max 4 chars)
-      9 +  // profile_compatibility, dot + 32-bit hex number (max 9 chars)
-      5 +  // tier and level, e.g. '.H120' (max 5 chars)
-      18;  // up to 6 constraint bytes, bytes are dot-separated and hex-encoded.
-
-  if (codec_id.size() > kMaxHevcCodecIdLength) {
-    DVLOG(4) << __func__ << ": Codec id is too long (" << codec_id << ")";
-    return false;
-  }
-
-  std::vector<std::string> elem = base::SplitString(
-      codec_id, std::string("."), base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  DCHECK(elem[0] == "hev1" || elem[0] == "hvc1");
-
-  if (elem.size() < 4) {
-    DVLOG(4) << __func__ << ": invalid HEVC codec id " << codec_id;
-    return false;
-  }
-
-  uint8_t general_profile_space = 0;
-  if (elem[1].size() > 0 &&
-      (elem[1][0] == 'A' || elem[1][0] == 'B' || elem[1][0] == 'C')) {
-    general_profile_space = 1 + (elem[1][0] - 'A');
-    elem[1].erase(0, 1);
-  }
-  DCHECK(general_profile_space >= 0 && general_profile_space <= 3);
-
-  unsigned general_profile_idc = 0;
-  if (!base::StringToUint(elem[1], &general_profile_idc) ||
-      general_profile_idc > 0x1f) {
-    DVLOG(4) << __func__ << ": invalid general_profile_idc=" << elem[1];
-    return false;
-  }
-
-  uint32_t general_profile_compatibility_flags = 0;
-  if (!base::HexStringToUInt(elem[2], &general_profile_compatibility_flags)) {
-    DVLOG(4) << __func__
-             << ": invalid general_profile_compatibility_flags=" << elem[2];
-    return false;
-  }
-
-  if (profile) {
-    // TODO(servolk): Handle format range extension profiles as explained in
-    // HEVC standard (ISO/IEC ISO/IEC 23008-2) section A.3.5
-    if (general_profile_idc == 3 || (general_profile_compatibility_flags & 4)) {
-      *profile = HEVCPROFILE_MAIN_STILL_PICTURE;
-    }
-    if (general_profile_idc == 2 || (general_profile_compatibility_flags & 2)) {
-      *profile = HEVCPROFILE_MAIN10;
-    }
-    if (general_profile_idc == 1 || (general_profile_compatibility_flags & 1)) {
-      *profile = HEVCPROFILE_MAIN;
-    }
-  }
-
-  uint8_t general_tier_flag;
-  if (elem[3].size() > 0 && (elem[3][0] == 'L' || elem[3][0] == 'H')) {
-    general_tier_flag = (elem[3][0] == 'L') ? 0 : 1;
-    elem[3].erase(0, 1);
-  } else {
-    DVLOG(4) << __func__ << ": invalid general_tier_flag=" << elem[3];
-    return false;
-  }
-  DCHECK(general_tier_flag == 0 || general_tier_flag == 1);
-
-  unsigned general_level_idc = 0;
-  if (!base::StringToUint(elem[3], &general_level_idc) ||
-      general_level_idc > 0xff) {
-    DVLOG(4) << __func__ << ": invalid general_level_idc=" << elem[3];
-    return false;
-  }
-
-  if (level_idc) *level_idc = static_cast<uint8_t>(general_level_idc);
-
-  uint8_t constraint_flags[6];
-  memset(constraint_flags, 0, sizeof(constraint_flags));
-
-  if (elem.size() > 10) {
-    DVLOG(4) << __func__ << ": unexpected number of trailing bytes in HEVC "
-             << "codec id " << codec_id;
-    return false;
-  }
-  for (size_t i = 4; i < elem.size(); ++i) {
-    unsigned constr_byte = 0;
-    if (!base::HexStringToUInt(elem[i], &constr_byte) || constr_byte > 0xFF) {
-      DVLOG(4) << __func__ << ": invalid constraint byte=" << elem[i];
-      return false;
-    }
-    constraint_flags[i - 4] = constr_byte;
-  }
-
-  return true;
-}
-
-VideoCodec StringToVideoCodec(const std::string& codec_id) {
-  std::vector<std::string> elem = base::SplitString(
-      codec_id, std::string("."), base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  if (elem.empty()) return kUnknownVideoCodec;
-  VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN;
-  uint8_t level = 0;
-  if (codec_id == "vp8" || codec_id == "vp8.0")
-    return kCodecVP8;
-  if (ParseNewStyleVp9CodecID(codec_id, &profile, &level) ||
-      ParseLegacyVp9CodecID(codec_id, &profile, &level)) {
-    return kCodecVP9;
-  }
-  if (codec_id == "theora")
-    return kCodecTheora;
-  if (ParseAVCCodecId(codec_id, &profile, &level)) return kCodecH264;
-  // We don't parse the full codec string as it must have been checked by
-  // isTypeSupported() before passing into this function.
-  if (codec_id.substr(0, 5) == "vp09.") {
-    return kCodecVP9;
-  }
-  gfx::ColorSpace color_space;
-  if (ParseAv1CodecId(codec_id, &profile, &level, &color_space))
-    return kCodecAV1;
-  if (ParseHEVCCodecId(codec_id, &profile, &level)) return kCodecHEVC;
-
-  return kUnknownVideoCodec;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/video_codecs.h b/cobalt/media/base/video_codecs.h
deleted file mode 100644
index 5294245..0000000
--- a/cobalt/media/base/video_codecs.h
+++ /dev/null
@@ -1,131 +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 COBALT_MEDIA_BASE_VIDEO_CODECS_H_
-#define COBALT_MEDIA_BASE_VIDEO_CODECS_H_
-
-#include <string>
-
-#include "cobalt/media/base/color_space.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-enum VideoCodec {
-  // These values are histogrammed over time; do not change their ordinal
-  // values.  When deleting a codec replace it with a dummy value; when adding a
-  // codec, do so at the bottom (and update kVideoCodecMax).
-  kUnknownVideoCodec = 0,
-  kCodecH264,
-  kCodecVC1,
-  kCodecMPEG2,
-  kCodecMPEG4,
-  kCodecTheora,
-  kCodecVP8,
-  kCodecVP9,
-  kCodecHEVC,
-  kCodecDolbyVision,
-  kCodecAV1,
-  // DO NOT ADD RANDOM VIDEO CODECS!
-  //
-  // The only acceptable time to add a new codec is if there is production code
-  // that uses said codec in the same CL.
-
-  kVideoCodecMax = kCodecAV1  // Must equal the last "real" codec above.
-};
-
-// Video codec profiles. Keep in sync with mojo::VideoCodecProfile (see
-// media/mojo/interfaces/media_types.mojom) and gpu::VideoCodecProfile (see
-// gpu/config/gpu_info.h), as well as PP_VideoDecoder_Profile (translation is
-// performed in content/renderer/pepper/ppb_video_decoder_impl.cc).
-// NOTE: These values are histogrammed over time in UMA so the values must
-// never ever change (add new values to tools/metrics/histograms/histograms.xml)
-enum VideoCodecProfile {
-  // Keep the values in this enum unique, as they imply format (h.264 vs. VP8,
-  // for example), and keep the values for a particular format grouped
-  // together for clarity.
-  VIDEO_CODEC_PROFILE_UNKNOWN = -1,
-  VIDEO_CODEC_PROFILE_MIN = VIDEO_CODEC_PROFILE_UNKNOWN,
-  H264PROFILE_MIN = 0,
-  H264PROFILE_BASELINE = H264PROFILE_MIN,
-  H264PROFILE_MAIN = 1,
-  H264PROFILE_EXTENDED = 2,
-  H264PROFILE_HIGH = 3,
-  H264PROFILE_HIGH10PROFILE = 4,
-  H264PROFILE_HIGH422PROFILE = 5,
-  H264PROFILE_HIGH444PREDICTIVEPROFILE = 6,
-  H264PROFILE_SCALABLEBASELINE = 7,
-  H264PROFILE_SCALABLEHIGH = 8,
-  H264PROFILE_STEREOHIGH = 9,
-  H264PROFILE_MULTIVIEWHIGH = 10,
-  H264PROFILE_MAX = H264PROFILE_MULTIVIEWHIGH,
-  VP8PROFILE_MIN = 11,
-  VP8PROFILE_ANY = VP8PROFILE_MIN,
-  VP8PROFILE_MAX = VP8PROFILE_ANY,
-  VP9PROFILE_MIN = 12,
-  VP9PROFILE_PROFILE0 = VP9PROFILE_MIN,
-  VP9PROFILE_PROFILE1 = 13,
-  VP9PROFILE_PROFILE2 = 14,
-  VP9PROFILE_PROFILE3 = 15,
-  VP9PROFILE_MAX = VP9PROFILE_PROFILE3,
-  HEVCPROFILE_MIN = 16,
-  HEVCPROFILE_MAIN = HEVCPROFILE_MIN,
-  HEVCPROFILE_MAIN10 = 17,
-  HEVCPROFILE_MAIN_STILL_PICTURE = 18,
-  HEVCPROFILE_MAX = HEVCPROFILE_MAIN_STILL_PICTURE,
-  DOLBYVISION_MIN = 19,
-  DOLBYVISION_PROFILE0 = DOLBYVISION_MIN,
-  DOLBYVISION_PROFILE4 = 20,
-  DOLBYVISION_PROFILE5 = 21,
-  DOLBYVISION_PROFILE7 = 22,
-  DOLBYVISION_MAX = DOLBYVISION_PROFILE7,
-  THEORAPROFILE_MIN = 23,
-  THEORAPROFILE_ANY = THEORAPROFILE_MIN,
-  THEORAPROFILE_MAX = THEORAPROFILE_ANY,
-  AV1PROFILE_MIN = 24,
-  AV1PROFILE_PROFILE_MAIN = AV1PROFILE_MIN,
-  AV1PROFILE_PROFILE_HIGH = 25,
-  AV1PROFILE_PROFILE_PRO = 26,
-  AV1PROFILE_MAX = AV1PROFILE_PROFILE_PRO,
-  VIDEO_CODEC_PROFILE_MAX = AV1PROFILE_PROFILE_PRO,
-};
-
-std::string MEDIA_EXPORT GetCodecName(VideoCodec codec);
-std::string MEDIA_EXPORT GetProfileName(VideoCodecProfile profile);
-
-// ParseNewStyleVp9CodecID handles parsing of new style vp9 codec IDs per
-// proposed VP Codec ISO Media File Format Binding specification:
-// https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp-codec-iso-media-file-format-binding-20160516-draft.pdf
-// ParseLegacyVp9CodecID handles parsing of legacy VP9 codec strings defined
-// for WebM.
-// TODO(kqyang): Consolidate the two functions once we address crbug.com/667834
-MEDIA_EXPORT bool ParseNewStyleVp9CodecID(const std::string& codec_id,
-                                          VideoCodecProfile* profile,
-                                          uint8_t* level_idc);
-MEDIA_EXPORT bool ParseLegacyVp9CodecID(const std::string& codec_id,
-                                        VideoCodecProfile* profile,
-                                        uint8_t* level_idc);
-
-MEDIA_EXPORT bool ParseAv1CodecId(const std::string& codec_id,
-                                  VideoCodecProfile* profile,
-                                  uint8_t* level_idc,
-                                  gfx::ColorSpace* color_space);
-
-// Handle parsing AVC/H.264 codec ids as outlined in RFC 6381 and ISO-14496-10.
-MEDIA_EXPORT bool ParseAVCCodecId(const std::string& codec_id,
-                                  VideoCodecProfile* profile,
-                                  uint8_t* level_idc);
-
-MEDIA_EXPORT bool ParseHEVCCodecId(const std::string& codec_id,
-                                   VideoCodecProfile* profile,
-                                   uint8_t* level_idc);
-
-MEDIA_EXPORT VideoCodec StringToVideoCodec(const std::string& codec_id);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VIDEO_CODECS_H_
diff --git a/cobalt/media/base/video_codecs_unittest.cc b/cobalt/media/base/video_codecs_unittest.cc
deleted file mode 100644
index 894e049..0000000
--- a/cobalt/media/base/video_codecs_unittest.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 "cobalt/media/base/video_codecs.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-#if BUILDFLAG(ENABLE_HEVC_DEMUXING)
-TEST(ParseHEVCCodecIdTest, InvalidHEVCCodecIds) {
-  VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN;
-  uint8_t level_idc = 0;
-
-  // Both hev1 and hvc1 should be supported
-  EXPECT_TRUE(ParseHEVCCodecId("hev1.1.6.L93.B0", &profile, &level_idc));
-  EXPECT_EQ(profile, HEVCPROFILE_MAIN);
-  EXPECT_EQ(level_idc, 93);
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L93.B0", &profile, &level_idc));
-  EXPECT_EQ(profile, HEVCPROFILE_MAIN);
-  EXPECT_EQ(level_idc, 93);
-
-  // Check that codec id string with insufficient number of dot-separated
-  // elements are rejected. There must be at least 4 elements: hev1/hvc1 prefix,
-  // profile, profile_compatibility, tier+level.
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L93", &profile, &level_idc));
-  EXPECT_EQ(profile, HEVCPROFILE_MAIN);
-  EXPECT_EQ(level_idc, 93);
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hev1", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1..", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1...", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1....", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1..", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1...", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6..", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6...", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1..L93", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1..L93.", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1..L93..", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1..6", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1..6.", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1..6..", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1..6...", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1..6.L93", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1..6.L93.", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1..6.L93..", &profile, &level_idc));
-
-  // Check that codec ids with empty constraint bytes are rejected.
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93.", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93..", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93...", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93....", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93.....", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93......", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93.......", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93.......0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93.0.", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93.0..", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L93.0..0", &profile, &level_idc));
-  EXPECT_FALSE(
-      ParseHEVCCodecId("hvc1.1.6.L93.0..0.0.0.0.0", &profile, &level_idc));
-  EXPECT_FALSE(
-      ParseHEVCCodecId("hvc1.1.6.L93.0.0.0.0.0.0.", &profile, &level_idc));
-
-  // Different variations of general_profile_space (empty, 'A', 'B', 'C')
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L93.B0", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.A1.6.L93.B0", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.B1.6.L93.B0", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.C1.6.L93.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.D1.6.L93.B0", &profile, &level_idc));
-
-  // general_profile_idc (the number after the first dot) must be a 5-bit
-  // decimal-encoded number (between 0 and 31)
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.6.L93.B0", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.31.6.L93.B0", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L93.B0", &profile, &level_idc));
-  EXPECT_EQ(profile, HEVCPROFILE_MAIN);
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.2.2.L93.B0", &profile, &level_idc));
-  EXPECT_EQ(profile, HEVCPROFILE_MAIN10);
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.3.4.L93.B0", &profile, &level_idc));
-  EXPECT_EQ(profile, HEVCPROFILE_MAIN_STILL_PICTURE);
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.-1.6.L93.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.32.6.L93.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.999.6.L93.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.A.6.L93.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1F.6.L93.B0", &profile, &level_idc));
-
-  // general_profile_compatibility_flags is a 32-bit hex number
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.0.L93.B0", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.FF.L93.B0", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.FFFF.L93.B0", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.FFFFFFFF.L93.B0", &profile, &level_idc));
-  EXPECT_FALSE(
-      ParseHEVCCodecId("hvc1.1.100000000.L93.B0", &profile, &level_idc));
-  EXPECT_FALSE(
-      ParseHEVCCodecId("hvc1.1.FFFFFFFFF.L93.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.-1.L93.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.0G.L93.B0", &profile, &level_idc));
-
-  // general_tier_flag is encoded as either character 'L' (general_tier_flag==0)
-  // or character 'H' (general_tier_flag==1) in the fourth element of the string
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L93.B0", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.0.H93.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.0.93.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.0.A93.B0", &profile, &level_idc));
-
-  // general_level_idc is 8-bit decimal-encoded number after general_tier_flag.
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L0.B0", &profile, &level_idc));
-  EXPECT_EQ(level_idc, 0);
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L1.B0", &profile, &level_idc));
-  EXPECT_EQ(level_idc, 1);
-  // Level 3.1 (93 == 3.1 * 30)
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L93.B0", &profile, &level_idc));
-  EXPECT_EQ(level_idc, 93);
-  // Level 5 (150 == 5 * 30)
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L150.B0", &profile, &level_idc));
-  EXPECT_EQ(level_idc, 150);
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L255.B0", &profile, &level_idc));
-  EXPECT_EQ(level_idc, 255);
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L256.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L999.B0", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L-1.B0", &profile, &level_idc));
-
-  // The elements after the fourth dot are hex-encoded bytes containing
-  // constraint flags (up to 6 bytes), trailing zero bytes may be omitted
-  EXPECT_TRUE(
-      ParseHEVCCodecId("hvc1.1.6.L0.0.0.0.0.0.0", &profile, &level_idc));
-  EXPECT_TRUE(
-      ParseHEVCCodecId("hvc1.1.6.L0.00.00.00.00.00.00", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L0.12", &profile, &level_idc));
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L0.12.34.56", &profile, &level_idc));
-  EXPECT_TRUE(
-      ParseHEVCCodecId("hvc1.1.6.L0.12.34.56.78.9A.BC", &profile, &level_idc));
-  EXPECT_TRUE(
-      ParseHEVCCodecId("hvc1.1.6.L0.FF.FF.FF.FF.FF.FF", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L0.FF.FF.FF.FF.FF.FF.0", &profile,
-                                &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L0.100", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L0.1FF", &profile, &level_idc));
-  EXPECT_FALSE(ParseHEVCCodecId("hvc1.1.6.L0.-1", &profile, &level_idc));
-}
-#endif
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/video_decoder.cc b/cobalt/media/base/video_decoder.cc
deleted file mode 100644
index 96c445e..0000000
--- a/cobalt/media/base/video_decoder.cc
+++ /dev/null
@@ -1,23 +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 "cobalt/media/base/video_decoder.h"
-
-#include "cobalt/media/base/video_frame.h"
-
-namespace cobalt {
-namespace media {
-
-VideoDecoder::VideoDecoder() {}
-
-VideoDecoder::~VideoDecoder() {}
-
-bool VideoDecoder::NeedsBitstreamConversion() const { return false; }
-
-bool VideoDecoder::CanReadWithoutStalling() const { return true; }
-
-int VideoDecoder::GetMaxDecodeRequests() const { return 1; }
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/video_decoder.h b/cobalt/media/base/video_decoder.h
deleted file mode 100644
index 2b98f55..0000000
--- a/cobalt/media/base/video_decoder.h
+++ /dev/null
@@ -1,123 +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 COBALT_MEDIA_BASE_VIDEO_DECODER_H_
-#define COBALT_MEDIA_BASE_VIDEO_DECODER_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/decode_status.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/pipeline_status.h"
-
-namespace cobalt {
-namespace media {
-
-class CdmContext;
-class DecoderBuffer;
-class VideoDecoderConfig;
-class VideoFrame;
-
-class MEDIA_EXPORT VideoDecoder {
- public:
-  // Callback for VideoDecoder initialization.
-  typedef base::Callback<void(bool success)> InitCB;
-
-  // Callback for VideoDecoder to return a decoded frame whenever it becomes
-  // available. Only non-EOS frames should be returned via this callback.
-  typedef base::Callback<void(const scoped_refptr<VideoFrame>&)> OutputCB;
-
-  // Callback type for Decode(). Called after the decoder has completed decoding
-  // corresponding DecoderBuffer, indicating that it's ready to accept another
-  // buffer to decode.
-  typedef base::Callback<void(DecodeStatus)> DecodeCB;
-
-  VideoDecoder();
-
-  // Fires any pending callbacks, stops and destroys the decoder.
-  // Note: Since this is a destructor, |this| will be destroyed after this call.
-  // Make sure the callbacks fired from this call doesn't post any task that
-  // depends on |this|.
-  virtual ~VideoDecoder();
-
-  // Returns the name of the decoder for logging purpose.
-  virtual std::string GetDisplayName() const = 0;
-
-  // Initializes a VideoDecoder with the given |config|, executing the
-  // |init_cb| upon completion. |output_cb| is called for each output frame
-  // decoded by Decode().
-  //
-  // If |low_delay| is true then the decoder is not allowed to queue frames,
-  // except for out-of-order frames, i.e. if the next frame can be returned it
-  // must be returned without waiting for Decode() to be called again.
-  // Initialization should fail if |low_delay| is true and the decoder cannot
-  // satisfy the requirements above.
-  //
-  // |cdm_context| can be used to handle encrypted buffers. May be null if the
-  // stream is not encrypted.
-  //
-  // Note:
-  // 1) The VideoDecoder will be reinitialized if it was initialized before.
-  //    Upon reinitialization, all internal buffered frames will be dropped.
-  // 2) This method should not be called during pending decode or reset.
-  // 3) No VideoDecoder calls should be made before |init_cb| is executed.
-  // 4) VideoDecoders should take care to run |output_cb| as soon as the frame
-  // is ready (i.e. w/o thread trampolining) since it can strongly affect frame
-  // delivery times with high-frame-rate material.  See Decode() for additional
-  // notes.
-  virtual void Initialize(const VideoDecoderConfig& config, bool low_delay,
-                          CdmContext* cdm_context, const InitCB& init_cb,
-                          const OutputCB& output_cb) = 0;
-
-  // Requests a |buffer| to be decoded. The status of the decoder and decoded
-  // frame are returned via the provided callback. Some decoders may allow
-  // decoding multiple buffers in parallel. Callers should call
-  // GetMaxDecodeRequests() to get number of buffers that may be decoded in
-  // parallel. Decoder must call |decode_cb| in the same order in which Decode()
-  // is called.
-  //
-  // Implementations guarantee that the |decode_cb| will not be called from
-  // within this method, and that it will be called even if Decode() is never
-  // called again.
-  //
-  // After decoding is finished the decoder calls |output_cb| specified in
-  // Initialize() for each decoded frame. |output_cb| may be called before or
-  // after |decode_cb|, including before Decode() returns.
-  //
-  // If |buffer| is an EOS buffer then the decoder must be flushed, i.e.
-  // |output_cb| must be called for each frame pending in the queue and
-  // |decode_cb| must be called after that. Callers will not call Decode()
-  // again until after the flush completes.
-  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
-                      const DecodeCB& decode_cb) = 0;
-
-  // Resets decoder state. All pending Decode() requests will be finished or
-  // aborted before |closure| is called.
-  // Note: No VideoDecoder calls should be made before |closure| is executed.
-  virtual void Reset(const base::Closure& closure) = 0;
-
-  // Returns true if the decoder needs bitstream conversion before decoding.
-  virtual bool NeedsBitstreamConversion() const;
-
-  // Returns true if the decoder currently has the ability to decode and return
-  // a VideoFrame. Most implementations can allocate a new VideoFrame and hence
-  // this will always return true. Override and return false for decoders that
-  // use a fixed set of VideoFrames for decoding.
-  virtual bool CanReadWithoutStalling() const;
-
-  // Returns maximum number of parallel decode requests.
-  virtual int GetMaxDecodeRequests() const;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(VideoDecoder);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VIDEO_DECODER_H_
diff --git a/cobalt/media/base/video_decoder_config.cc b/cobalt/media/base/video_decoder_config.cc
deleted file mode 100644
index dcdd75d..0000000
--- a/cobalt/media/base/video_decoder_config.cc
+++ /dev/null
@@ -1,140 +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 "cobalt/media/base/video_decoder_config.h"
-
-#include <vector>
-
-#include "base/logging.h"
-#include "cobalt/media/base/video_types.h"
-
-namespace cobalt {
-namespace media {
-
-VideoCodec VideoCodecProfileToVideoCodec(VideoCodecProfile profile) {
-  switch (profile) {
-    case VIDEO_CODEC_PROFILE_UNKNOWN:
-      return kUnknownVideoCodec;
-    case H264PROFILE_BASELINE:
-    case H264PROFILE_MAIN:
-    case H264PROFILE_EXTENDED:
-    case H264PROFILE_HIGH:
-    case H264PROFILE_HIGH10PROFILE:
-    case H264PROFILE_HIGH422PROFILE:
-    case H264PROFILE_HIGH444PREDICTIVEPROFILE:
-    case H264PROFILE_SCALABLEBASELINE:
-    case H264PROFILE_SCALABLEHIGH:
-    case H264PROFILE_STEREOHIGH:
-    case H264PROFILE_MULTIVIEWHIGH:
-      return kCodecH264;
-    case HEVCPROFILE_MAIN:
-    case HEVCPROFILE_MAIN10:
-    case HEVCPROFILE_MAIN_STILL_PICTURE:
-      return kCodecHEVC;
-    case VP8PROFILE_ANY:
-      return kCodecVP8;
-    case VP9PROFILE_PROFILE0:
-    case VP9PROFILE_PROFILE1:
-    case VP9PROFILE_PROFILE2:
-    case VP9PROFILE_PROFILE3:
-      return kCodecVP9;
-    case DOLBYVISION_PROFILE0:
-    case DOLBYVISION_PROFILE4:
-    case DOLBYVISION_PROFILE5:
-    case DOLBYVISION_PROFILE7:
-      return kCodecDolbyVision;
-    case THEORAPROFILE_ANY:
-      return kCodecTheora;
-    case AV1PROFILE_PROFILE_MAIN:
-    case AV1PROFILE_PROFILE_HIGH:
-    case AV1PROFILE_PROFILE_PRO:
-      return kCodecAV1;
-  }
-  NOTREACHED();
-  return kUnknownVideoCodec;
-}
-
-VideoDecoderConfig::VideoDecoderConfig()
-    : codec_(kUnknownVideoCodec),
-      profile_(VIDEO_CODEC_PROFILE_UNKNOWN),
-      format_(PIXEL_FORMAT_UNKNOWN) {}
-
-VideoDecoderConfig::VideoDecoderConfig(
-    VideoCodec codec, VideoCodecProfile profile, VideoPixelFormat format,
-    ColorSpace color_space, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    const std::vector<uint8_t>& extra_data,
-    const EncryptionScheme& encryption_scheme) {
-  Initialize(codec, profile, format, color_space, coded_size, visible_rect,
-             natural_size, extra_data, encryption_scheme);
-}
-
-VideoDecoderConfig::~VideoDecoderConfig() {}
-
-void VideoDecoderConfig::Initialize(VideoCodec codec, VideoCodecProfile profile,
-                                    VideoPixelFormat format,
-                                    ColorSpace color_space,
-                                    const math::Size& coded_size,
-                                    const math::Rect& visible_rect,
-                                    const math::Size& natural_size,
-                                    const std::vector<uint8_t>& extra_data,
-                                    const EncryptionScheme& encryption_scheme) {
-  codec_ = codec;
-  profile_ = profile;
-  format_ = format;
-  color_space_ = color_space;
-  coded_size_ = coded_size;
-  visible_rect_ = visible_rect;
-  natural_size_ = natural_size;
-  extra_data_ = extra_data;
-  encryption_scheme_ = encryption_scheme;
-
-  switch (color_space) {
-    case COLOR_SPACE_JPEG:
-      webm_color_metadata_.color_space = gfx::ColorSpace::CreateJpeg();
-      break;
-    case COLOR_SPACE_HD_REC709:
-      webm_color_metadata_.color_space = gfx::ColorSpace::CreateREC709();
-      break;
-    case COLOR_SPACE_SD_REC601:
-      webm_color_metadata_.color_space = gfx::ColorSpace::CreateREC601();
-      break;
-    case COLOR_SPACE_UNSPECIFIED:
-    default:
-      break;
-  }
-}
-
-bool VideoDecoderConfig::IsValidConfig() const {
-  return codec_ != kUnknownVideoCodec && natural_size_.width() > 0 &&
-         natural_size_.height() > 0;
-}
-
-bool VideoDecoderConfig::Matches(const VideoDecoderConfig& config) const {
-  return ((codec() == config.codec()) && (format() == config.format()) &&
-          (profile() == config.profile()) &&
-          (coded_size() == config.coded_size()) &&
-          (visible_rect() == config.visible_rect()) &&
-          (natural_size() == config.natural_size()) &&
-          (extra_data() == config.extra_data()) &&
-          (encryption_scheme().Matches(config.encryption_scheme())) &&
-          webm_color_metadata_ == config.webm_color_metadata());
-}
-
-std::string VideoDecoderConfig::AsHumanReadableString() const {
-  std::ostringstream s;
-  s << "codec: " << GetCodecName(codec()) << " format: " << format()
-    << " profile: " << GetProfileName(profile()) << " coded size: ["
-    << coded_size().width() << "," << coded_size().height() << "]"
-    << " visible rect: [" << visible_rect().x() << "," << visible_rect().y()
-    << "," << visible_rect().width() << "," << visible_rect().height() << "]"
-    << " natural size: [" << natural_size().width() << ","
-    << natural_size().height() << "]"
-    << " has extra data? " << (extra_data().empty() ? "false" : "true")
-    << " encrypted? " << (is_encrypted() ? "true" : "false");
-  return s.str();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/video_decoder_config.h b/cobalt/media/base/video_decoder_config.h
deleted file mode 100644
index f78920c..0000000
--- a/cobalt/media/base/video_decoder_config.h
+++ /dev/null
@@ -1,153 +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 COBALT_MEDIA_BASE_VIDEO_DECODER_CONFIG_H_
-#define COBALT_MEDIA_BASE_VIDEO_DECODER_CONFIG_H_
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/optional.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/color_space.h"
-#include "cobalt/media/base/encryption_scheme.h"
-#include "cobalt/media/base/hdr_metadata.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/video_codecs.h"
-#include "cobalt/media/base/video_types.h"
-#include "cobalt/media/formats/webm/webm_colour_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-MEDIA_EXPORT VideoCodec
-VideoCodecProfileToVideoCodec(VideoCodecProfile profile);
-
-class MEDIA_EXPORT VideoDecoderConfig {
- public:
-  // Constructs an uninitialized object. Clients should call Initialize() with
-  // appropriate values before using.
-  VideoDecoderConfig();
-
-  // Constructs an initialized object. It is acceptable to pass in NULL for
-  // |extra_data|, otherwise the memory is copied.
-  VideoDecoderConfig(VideoCodec codec, VideoCodecProfile profile,
-                     VideoPixelFormat format, ColorSpace color_space,
-                     const math::Size& coded_size,
-                     const math::Rect& visible_rect,
-                     const math::Size& natural_size,
-                     const std::vector<uint8_t>& extra_data,
-                     const EncryptionScheme& encryption_scheme);
-
-  ~VideoDecoderConfig();
-
-  // Resets the internal state of this object.
-  void Initialize(VideoCodec codec, VideoCodecProfile profile,
-                  VideoPixelFormat format, ColorSpace color_space,
-                  const math::Size& coded_size, const math::Rect& visible_rect,
-                  const math::Size& natural_size,
-                  const std::vector<uint8_t>& extra_data,
-                  const EncryptionScheme& encryption_scheme);
-
-  // Returns true if this object has appropriate configuration values, false
-  // otherwise.
-  bool IsValidConfig() const;
-
-  // Returns true if all fields in |config| match this config.
-  // Note: The contents of |extra_data_| are compared not the raw pointers.
-  bool Matches(const VideoDecoderConfig& config) const;
-
-  // Returns a human-readable string describing |*this|.  For debugging & test
-  // output only.
-  std::string AsHumanReadableString() const;
-
-  std::string GetHumanReadableCodecName() const;
-
-  static std::string GetHumanReadableProfile(VideoCodecProfile profile);
-
-  VideoCodec codec() const { return codec_; }
-  VideoCodecProfile profile() const { return profile_; }
-
-  // Video format used to determine YUV buffer sizes.
-  VideoPixelFormat format() const { return format_; }
-
-  // The default color space of the decoded frames. Decoders should output
-  // frames tagged with this color space unless they find a different value in
-  // the bitstream.
-  ColorSpace color_space() const { return color_space_; }
-
-  // Width and height of video frame immediately post-decode. Not all pixels
-  // in this region are valid.
-  math::Size coded_size() const { return coded_size_; }
-
-  // Region of |coded_size_| that is visible.
-  math::Rect visible_rect() const { return visible_rect_; }
-
-  // Final visible width and height of a video frame with aspect ratio taken
-  // into account.
-  math::Size natural_size() const { return natural_size_; }
-
-  // Optional byte data required to initialize video decoders, such as H.264
-  // AVCC data.
-  const std::vector<uint8_t>& extra_data() const { return extra_data_; }
-
-  // Whether the video stream is potentially encrypted.
-  // Note that in a potentially encrypted video stream, individual buffers
-  // can be encrypted or not encrypted.
-  bool is_encrypted() const { return encryption_scheme_.is_encrypted(); }
-
-  // Encryption scheme used for encrypted buffers.
-  const EncryptionScheme& encryption_scheme() const {
-    return encryption_scheme_;
-  }
-
-  void set_webm_color_metadata(const WebMColorMetadata& webm_color_metadata) {
-    webm_color_metadata_ = webm_color_metadata;
-  }
-
-  const WebMColorMetadata& webm_color_metadata() const {
-    return webm_color_metadata_;
-  }
-
-  void set_mime(const std::string& mime) { mime_ = mime; }
-  const std::string& mime() const { return mime_; }
-
- private:
-  VideoCodec codec_;
-  VideoCodecProfile profile_;
-
-  VideoPixelFormat format_;
-
-  // TODO(servolk): Deprecated, use color_space_info_ instead.
-  ColorSpace color_space_;
-
-  math::Size coded_size_;
-  math::Rect visible_rect_;
-  math::Size natural_size_;
-
-  std::vector<uint8_t> extra_data_;
-
-  EncryptionScheme encryption_scheme_;
-
-  WebMColorMetadata webm_color_metadata_;
-
-  // |mime_| contains the mime type string specified when creating the stream.
-  // For example, when the stream is created via MediaSource, it is the mime
-  // string passed to addSourceBuffer().  It can be an empty string when the
-  // appropriate mime string is unknown.  It is provided as an extra information
-  // and can be inconsistent with the other member variables.
-  std::string mime_;
-
-  // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
-  // generated copy constructor and assignment operator. Since the extra data is
-  // typically small, the performance impact is minimal.
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VIDEO_DECODER_CONFIG_H_
diff --git a/cobalt/media/base/video_decoder_config_unittest.cc b/cobalt/media/base/video_decoder_config_unittest.cc
deleted file mode 100644
index 5bbc146..0000000
--- a/cobalt/media/base/video_decoder_config_unittest.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 "cobalt/media/base/video_decoder_config.h"
-
-#include "cobalt/media/base/limits.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/video_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-static const VideoPixelFormat kVideoFormat = PIXEL_FORMAT_YV12;
-static const math::Size kCodedSize(320, 240);
-static const math::Rect kVisibleRect(320, 240);
-static const math::Size kNaturalSize(320, 240);
-
-TEST(VideoDecoderConfigTest, Invalid_UnsupportedPixelFormat) {
-  VideoDecoderConfig config(kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN,
-                            PIXEL_FORMAT_UNKNOWN, COLOR_SPACE_UNSPECIFIED,
-                            kCodedSize, kVisibleRect, kNaturalSize,
-                            EmptyExtraData(), Unencrypted());
-  EXPECT_FALSE(config.IsValidConfig());
-}
-
-TEST(VideoDecoderConfigTest, Invalid_AspectRatioNumeratorZero) {
-  math::Size natural_size = GetNaturalSize(kVisibleRect.size(), 0, 1);
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, kVideoFormat,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            natural_size, EmptyExtraData(), Unencrypted());
-  EXPECT_FALSE(config.IsValidConfig());
-}
-
-TEST(VideoDecoderConfigTest, Invalid_AspectRatioDenominatorZero) {
-  math::Size natural_size = GetNaturalSize(kVisibleRect.size(), 1, 0);
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, kVideoFormat,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            natural_size, EmptyExtraData(), Unencrypted());
-  EXPECT_FALSE(config.IsValidConfig());
-}
-
-TEST(VideoDecoderConfigTest, Invalid_AspectRatioNumeratorNegative) {
-  math::Size natural_size = GetNaturalSize(kVisibleRect.size(), -1, 1);
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, kVideoFormat,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            natural_size, EmptyExtraData(), Unencrypted());
-  EXPECT_FALSE(config.IsValidConfig());
-}
-
-TEST(VideoDecoderConfigTest, Invalid_AspectRatioDenominatorNegative) {
-  math::Size natural_size = GetNaturalSize(kVisibleRect.size(), 1, -1);
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, kVideoFormat,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            natural_size, EmptyExtraData(), Unencrypted());
-  EXPECT_FALSE(config.IsValidConfig());
-}
-
-TEST(VideoDecoderConfigTest, Invalid_AspectRatioNumeratorTooLarge) {
-  int width = kVisibleRect.size().width();
-  int num = ceil(static_cast<double>(limits::kMaxDimension + 1) / width);
-  math::Size natural_size = GetNaturalSize(kVisibleRect.size(), num, 1);
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, kVideoFormat,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            natural_size, EmptyExtraData(), Unencrypted());
-  EXPECT_FALSE(config.IsValidConfig());
-}
-
-TEST(VideoDecoderConfigTest, Invalid_AspectRatioDenominatorTooLarge) {
-  // Denominator is large enough that the natural size height will be zero.
-  int den = 2 * kVisibleRect.size().width() + 1;
-  math::Size natural_size = GetNaturalSize(kVisibleRect.size(), 1, den);
-  EXPECT_EQ(0, natural_size.width());
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, kVideoFormat,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            natural_size, EmptyExtraData(), Unencrypted());
-  EXPECT_FALSE(config.IsValidConfig());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/video_frame.cc b/cobalt/media/base/video_frame.cc
deleted file mode 100644
index 212622f..0000000
--- a/cobalt/media/base/video_frame.cc
+++ /dev/null
@@ -1,1083 +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 "cobalt/media/base/video_frame.h"
-
-#include <algorithm>
-#include <climits>
-
-#include "base/atomic_sequence_num.h"
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/logging.h"
-#include "base/memory/aligned_memory.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/stringprintf.h"
-#include "build/build_config.h"
-#include "cobalt/math/geometry/point.h"
-#include "cobalt/media/base/limits.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/base/video_util.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-// Static POD class for generating unique identifiers for each VideoFrame.
-static base::AtomicSequenceNumber g_unique_id_generator;
-
-static bool IsPowerOfTwo(size_t x) { return x != 0 && (x & (x - 1)) == 0; }
-
-static inline size_t RoundUp(size_t value, size_t alignment) {
-  DCHECK(IsPowerOfTwo(alignment));
-  return ((value + (alignment - 1)) & ~(alignment - 1));
-}
-
-static inline size_t RoundDown(size_t value, size_t alignment) {
-  DCHECK(IsPowerOfTwo(alignment));
-  return value & ~(alignment - 1);
-}
-
-static std::string StorageTypeToString(
-    const VideoFrame::StorageType storage_type) {
-  switch (storage_type) {
-    case VideoFrame::STORAGE_UNKNOWN:
-      return "UNKNOWN";
-    case VideoFrame::STORAGE_OPAQUE:
-      return "OPAQUE";
-    case VideoFrame::STORAGE_UNOWNED_MEMORY:
-      return "UNOWNED_MEMORY";
-    case VideoFrame::STORAGE_OWNED_MEMORY:
-      return "OWNED_MEMORY";
-    case VideoFrame::STORAGE_SHMEM:
-      return "SHMEM";
-#if defined(OS_LINUX)
-    case VideoFrame::STORAGE_DMABUFS:
-      return "DMABUFS";
-#endif
-    case VideoFrame::STORAGE_GPU_MEMORY_BUFFERS:
-      return "GPU_MEMORY_BUFFERS";
-    case VideoFrame::STORAGE_MOJO_SHARED_BUFFER:
-      return "MOJO_SHARED_BUFFER";
-  }
-
-  NOTREACHED() << "Invalid StorageType provided: " << storage_type;
-  return "INVALID";
-}
-
-// Returns true if |frame| is accessible mapped in the VideoFrame memory space.
-// static
-static bool IsStorageTypeMappable(VideoFrame::StorageType storage_type) {
-  return
-#if defined(OS_LINUX)
-      // This is not strictly needed but makes explicit that, at VideoFrame
-      // level, DmaBufs are not mappable from userspace.
-      storage_type != VideoFrame::STORAGE_DMABUFS &&
-#endif
-      (storage_type == VideoFrame::STORAGE_UNOWNED_MEMORY ||
-       storage_type == VideoFrame::STORAGE_OWNED_MEMORY ||
-       storage_type == VideoFrame::STORAGE_SHMEM ||
-       storage_type == VideoFrame::STORAGE_GPU_MEMORY_BUFFERS ||
-       storage_type == VideoFrame::STORAGE_MOJO_SHARED_BUFFER);
-}
-
-// Checks if |source_format| can be wrapped into a |target_format| frame.
-static bool AreValidPixelFormatsForWrap(VideoPixelFormat source_format,
-                                        VideoPixelFormat target_format) {
-  if (source_format == target_format) return true;
-
-  // It is possible to add other planar to planar format conversions here if the
-  // use case is there.
-  return source_format == PIXEL_FORMAT_YV12A &&
-         target_format == PIXEL_FORMAT_I420;
-}
-
-// static
-bool VideoFrame::IsValidConfig(VideoPixelFormat format,
-                               StorageType storage_type,
-                               const math::Size& coded_size,
-                               const math::Rect& visible_rect,
-                               const math::Size& natural_size) {
-  // Check maximum limits for all formats.
-  int coded_size_area = coded_size.GetCheckedArea().ValueOrDefault(INT_MAX);
-  int natural_size_area = natural_size.GetCheckedArea().ValueOrDefault(INT_MAX);
-  static_assert(limits::kMaxCanvas < INT_MAX, "");
-  if (coded_size_area > limits::kMaxCanvas ||
-      coded_size.width() > limits::kMaxDimension ||
-      coded_size.height() > limits::kMaxDimension || visible_rect.x() < 0 ||
-      visible_rect.y() < 0 || visible_rect.right() > coded_size.width() ||
-      visible_rect.bottom() > coded_size.height() ||
-      natural_size_area > limits::kMaxCanvas ||
-      natural_size.width() > limits::kMaxDimension ||
-      natural_size.height() > limits::kMaxDimension)
-    return false;
-
-  // TODO(mcasas): Remove parameter |storage_type| when the opaque storage types
-  // comply with the checks below. Right now we skip them.
-  if (!IsStorageTypeMappable(storage_type)) return true;
-
-  // Make sure new formats are properly accounted for in the method.
-  static_assert(PIXEL_FORMAT_MAX == 26,
-                "Added pixel format, please review IsValidConfig()");
-
-  if (format == PIXEL_FORMAT_UNKNOWN) {
-    return coded_size.IsEmpty() && visible_rect.IsEmpty() &&
-           natural_size.IsEmpty();
-  }
-
-  // Check that software-allocated buffer formats are not empty.
-  return !coded_size.IsEmpty() && !visible_rect.IsEmpty() &&
-         !natural_size.IsEmpty();
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::CreateFrame(
-    VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    base::TimeDelta timestamp) {
-  return CreateFrameInternal(format, coded_size, visible_rect, natural_size,
-                             timestamp, false);
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::CreateZeroInitializedFrame(
-    VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    base::TimeDelta timestamp) {
-  return CreateFrameInternal(format, coded_size, visible_rect, natural_size,
-                             timestamp, true);
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapNativeTextures(
-    VideoPixelFormat format,
-    const gpu::MailboxHolder (&mailbox_holders)[kMaxPlanes],
-    const ReleaseMailboxCB& mailbox_holder_release_cb,
-    const math::Size& coded_size, const math::Rect& visible_rect,
-    const math::Size& natural_size, base::TimeDelta timestamp) {
-  if (format != PIXEL_FORMAT_ARGB && format != PIXEL_FORMAT_XRGB &&
-      format != PIXEL_FORMAT_UYVY && format != PIXEL_FORMAT_NV12 &&
-      format != PIXEL_FORMAT_I420) {
-    LOG(DFATAL) << "Unsupported pixel format supported, got "
-                << VideoPixelFormatToString(format);
-    return NULL;
-  }
-  const StorageType storage = STORAGE_OPAQUE;
-  if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) {
-    LOG(DFATAL) << __func__ << " Invalid config."
-                << ConfigToString(format, storage, coded_size, visible_rect,
-                                  natural_size);
-    return NULL;
-  }
-
-  return new VideoFrame(format, storage, coded_size, visible_rect, natural_size,
-                        mailbox_holders, mailbox_holder_release_cb, timestamp);
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapExternalData(
-    VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    uint8_t* data, size_t data_size, base::TimeDelta timestamp) {
-  return WrapExternalStorage(format, STORAGE_UNOWNED_MEMORY, coded_size,
-                             visible_rect, natural_size, data, data_size,
-                             timestamp, base::SharedMemory::NULLHandle(), 0);
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapExternalSharedMemory(
-    VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    uint8_t* data, size_t data_size, base::SharedMemoryHandle handle,
-    size_t data_offset, base::TimeDelta timestamp) {
-  return WrapExternalStorage(format, STORAGE_SHMEM, coded_size, visible_rect,
-                             natural_size, data, data_size, timestamp, handle,
-                             data_offset);
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuvData(
-    VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    int32_t y_stride, int32_t u_stride, int32_t v_stride, uint8_t* y_data,
-    uint8_t* u_data, uint8_t* v_data, base::TimeDelta timestamp) {
-  const StorageType storage = STORAGE_UNOWNED_MEMORY;
-  if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) {
-    LOG(DFATAL) << __func__ << " Invalid config."
-                << ConfigToString(format, storage, coded_size, visible_rect,
-                                  natural_size);
-    return NULL;
-  }
-
-  scoped_refptr<VideoFrame> frame(new VideoFrame(
-      format, storage, coded_size, visible_rect, natural_size, timestamp));
-  frame->strides_[kYPlane] = y_stride;
-  frame->strides_[kUPlane] = u_stride;
-  frame->strides_[kVPlane] = v_stride;
-  frame->data_[kYPlane] = y_data;
-  frame->data_[kUPlane] = u_data;
-  frame->data_[kVPlane] = v_data;
-  return frame;
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuvGpuMemoryBuffers(
-    VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    int32_t y_stride, int32_t u_stride, int32_t v_stride, uint8_t* y_data,
-    uint8_t* u_data, uint8_t* v_data,
-    const gfx::GpuMemoryBufferHandle& y_handle,
-    const gfx::GpuMemoryBufferHandle& u_handle,
-    const gfx::GpuMemoryBufferHandle& v_handle, base::TimeDelta timestamp) {
-  const StorageType storage = STORAGE_GPU_MEMORY_BUFFERS;
-  if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) {
-    LOG(DFATAL) << __func__ << " Invalid config."
-                << ConfigToString(format, storage, coded_size, visible_rect,
-                                  natural_size);
-    return NULL;
-  }
-
-  scoped_refptr<VideoFrame> frame(new VideoFrame(
-      format, storage, coded_size, visible_rect, natural_size, timestamp));
-  frame->strides_[kYPlane] = y_stride;
-  frame->strides_[kUPlane] = u_stride;
-  frame->strides_[kVPlane] = v_stride;
-  frame->data_[kYPlane] = y_data;
-  frame->data_[kUPlane] = u_data;
-  frame->data_[kVPlane] = v_data;
-  frame->gpu_memory_buffer_handles_.push_back(y_handle);
-  frame->gpu_memory_buffer_handles_.push_back(u_handle);
-  frame->gpu_memory_buffer_handles_.push_back(v_handle);
-  return frame;
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuvaData(
-    VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    int32_t y_stride, int32_t u_stride, int32_t v_stride, int32_t a_stride,
-    uint8_t* y_data, uint8_t* u_data, uint8_t* v_data, uint8_t* a_data,
-    base::TimeDelta timestamp) {
-  const StorageType storage = STORAGE_UNOWNED_MEMORY;
-  if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) {
-    LOG(DFATAL) << __func__ << " Invalid config."
-                << ConfigToString(format, storage, coded_size, visible_rect,
-                                  natural_size);
-    return NULL;
-  }
-
-  if (NumPlanes(format) != 4) {
-    LOG(DFATAL) << "Expecting Y, U, V and A planes to be present for the video"
-                << " format.";
-    return NULL;
-  }
-
-  scoped_refptr<VideoFrame> frame(new VideoFrame(
-      format, storage, coded_size, visible_rect, natural_size, timestamp));
-  frame->strides_[kYPlane] = y_stride;
-  frame->strides_[kUPlane] = u_stride;
-  frame->strides_[kVPlane] = v_stride;
-  frame->strides_[kAPlane] = a_stride;
-  frame->data_[kYPlane] = y_data;
-  frame->data_[kUPlane] = u_data;
-  frame->data_[kVPlane] = v_data;
-  frame->data_[kAPlane] = a_data;
-  return frame;
-}
-
-#if defined(OS_LINUX)
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs(
-    VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    const std::vector<int>& dmabuf_fds, base::TimeDelta timestamp) {
-  const StorageType storage = STORAGE_DMABUFS;
-  if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) {
-    LOG(DFATAL) << __func__ << " Invalid config."
-                << ConfigToString(format, storage, coded_size, visible_rect,
-                                  natural_size);
-    return NULL;
-  }
-
-  gpu::MailboxHolder mailbox_holders[kMaxPlanes];
-  scoped_refptr<VideoFrame> frame =
-      new VideoFrame(format, storage, coded_size, visible_rect, natural_size,
-                     mailbox_holders, ReleaseMailboxCB(), timestamp);
-  if (!frame || !frame->DuplicateFileDescriptors(dmabuf_fds)) {
-    LOG(DFATAL) << __func__ << " Couldn't duplicate fds.";
-    return NULL;
-  }
-  return frame;
-}
-#endif
-
-#if defined(OS_MACOSX)
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapCVPixelBuffer(
-    CVPixelBufferRef cv_pixel_buffer, base::TimeDelta timestamp) {
-  DCHECK(cv_pixel_buffer);
-  DCHECK(CFGetTypeID(cv_pixel_buffer) == CVPixelBufferGetTypeID());
-
-  const OSType cv_format = CVPixelBufferGetPixelFormatType(cv_pixel_buffer);
-  VideoPixelFormat format;
-  // There are very few compatible CV pixel formats, so just check each.
-  if (cv_format == kCVPixelFormatType_420YpCbCr8Planar) {
-    format = PIXEL_FORMAT_I420;
-  } else if (cv_format == kCVPixelFormatType_444YpCbCr8) {
-    format = PIXEL_FORMAT_YV24;
-  } else if (cv_format == '420v') {
-    // TODO(jfroy): Use kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange when the
-    // minimum OS X and iOS SDKs permits it.
-    format = PIXEL_FORMAT_NV12;
-  } else {
-    LOG(DFATAL) << "CVPixelBuffer format not supported: " << cv_format;
-    return NULL;
-  }
-
-  const math::Size coded_size(CVImageBufferGetEncodedSize(cv_pixel_buffer));
-  const math::Rect visible_rect(CVImageBufferGetCleanRect(cv_pixel_buffer));
-  const math::Size natural_size(CVImageBufferGetDisplaySize(cv_pixel_buffer));
-  const StorageType storage = STORAGE_UNOWNED_MEMORY;
-
-  if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) {
-    LOG(DFATAL) << __func__ << " Invalid config."
-                << ConfigToString(format, storage, coded_size, visible_rect,
-                                  natural_size);
-    return NULL;
-  }
-
-  scoped_refptr<VideoFrame> frame(new VideoFrame(
-      format, storage, coded_size, visible_rect, natural_size, timestamp));
-
-  frame->cv_pixel_buffer_.reset(cv_pixel_buffer, base::scoped_policy::RETAIN);
-  return frame;
-}
-#endif
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame(
-    const scoped_refptr<VideoFrame>& frame, VideoPixelFormat format,
-    const math::Rect& visible_rect, const math::Size& natural_size) {
-  // Frames with textures need mailbox info propagated, and there's no support
-  // for that here yet, see http://crbug/362521.
-  CHECK(!frame->HasTextures());
-  DCHECK(frame->visible_rect().Contains(visible_rect));
-
-  if (!AreValidPixelFormatsForWrap(frame->format(), format)) {
-    LOG(DFATAL) << __func__ << " Invalid format conversion."
-                << VideoPixelFormatToString(frame->format()) << " to "
-                << VideoPixelFormatToString(format);
-    return NULL;
-  }
-
-  if (!IsValidConfig(format, frame->storage_type(), frame->coded_size(),
-                     visible_rect, natural_size)) {
-    LOG(DFATAL) << __func__ << " Invalid config."
-                << ConfigToString(format, frame->storage_type(),
-                                  frame->coded_size(), visible_rect,
-                                  natural_size);
-    return NULL;
-  }
-
-  scoped_refptr<VideoFrame> wrapping_frame(
-      new VideoFrame(format, frame->storage_type(), frame->coded_size(),
-                     visible_rect, natural_size, frame->timestamp()));
-
-  // Copy all metadata to the wrapped frame.
-  wrapping_frame->metadata()->MergeMetadataFrom(frame->metadata());
-
-  for (size_t i = 0; i < NumPlanes(format); ++i) {
-    wrapping_frame->strides_[i] = frame->stride(i);
-    wrapping_frame->data_[i] = frame->data(i);
-  }
-
-#if defined(OS_LINUX)
-  // If there are any |dmabuf_fds_| plugged in, we should duplicate them.
-  if (frame->storage_type() == STORAGE_DMABUFS) {
-    std::vector<int> original_fds;
-    for (size_t i = 0; i < kMaxPlanes; ++i)
-      original_fds.push_back(frame->dmabuf_fd(i));
-    if (!wrapping_frame->DuplicateFileDescriptors(original_fds)) {
-      LOG(DFATAL) << __func__ << " Couldn't duplicate fds.";
-      return NULL;
-    }
-  }
-#endif
-
-  if (frame->storage_type() == STORAGE_SHMEM)
-    wrapping_frame->AddSharedMemoryHandle(frame->shared_memory_handle_);
-
-  return wrapping_frame;
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::CreateEOSFrame() {
-  scoped_refptr<VideoFrame> frame =
-      new VideoFrame(PIXEL_FORMAT_UNKNOWN, STORAGE_UNKNOWN, math::Size(),
-                     math::Rect(), math::Size(), kNoTimestamp);
-  frame->metadata()->SetBoolean(VideoFrameMetadata::END_OF_STREAM, true);
-  return frame;
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::CreateColorFrame(
-    const math::Size& size, uint8_t y, uint8_t u, uint8_t v,
-    base::TimeDelta timestamp) {
-  scoped_refptr<VideoFrame> frame =
-      CreateFrame(PIXEL_FORMAT_YV12, size, math::Rect(size), size, timestamp);
-  FillYUV(frame.get(), y, u, v);
-  return frame;
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::CreateBlackFrame(const math::Size& size) {
-  const uint8_t kBlackY = 0x00;
-  const uint8_t kBlackUV = 0x80;
-  const base::TimeDelta kZero;
-  return CreateColorFrame(size, kBlackY, kBlackUV, kBlackUV, kZero);
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::CreateTransparentFrame(
-    const math::Size& size) {
-  const uint8_t kBlackY = 0x00;
-  const uint8_t kBlackUV = 0x00;
-  const uint8_t kTransparentA = 0x00;
-  const base::TimeDelta kZero;
-  scoped_refptr<VideoFrame> frame =
-      CreateFrame(PIXEL_FORMAT_YV12A, size, math::Rect(size), size, kZero);
-  FillYUVA(frame.get(), kBlackY, kBlackUV, kBlackUV, kTransparentA);
-  return frame;
-}
-
-// static
-size_t VideoFrame::NumPlanes(VideoPixelFormat format) {
-  switch (format) {
-    case PIXEL_FORMAT_UYVY:
-    case PIXEL_FORMAT_YUY2:
-    case PIXEL_FORMAT_ARGB:
-    case PIXEL_FORMAT_XRGB:
-    case PIXEL_FORMAT_RGB24:
-    case PIXEL_FORMAT_RGB32:
-    case PIXEL_FORMAT_MJPEG:
-    case PIXEL_FORMAT_Y8:
-    case PIXEL_FORMAT_Y16:
-      return 1;
-    case PIXEL_FORMAT_NV12:
-    case PIXEL_FORMAT_NV21:
-    case PIXEL_FORMAT_MT21:
-      return 2;
-    case PIXEL_FORMAT_I420:
-    case PIXEL_FORMAT_YV12:
-    case PIXEL_FORMAT_YV16:
-    case PIXEL_FORMAT_YV24:
-    case PIXEL_FORMAT_YUV420P9:
-    case PIXEL_FORMAT_YUV422P9:
-    case PIXEL_FORMAT_YUV444P9:
-    case PIXEL_FORMAT_YUV420P10:
-    case PIXEL_FORMAT_YUV422P10:
-    case PIXEL_FORMAT_YUV444P10:
-    case PIXEL_FORMAT_YUV420P12:
-    case PIXEL_FORMAT_YUV422P12:
-    case PIXEL_FORMAT_YUV444P12:
-      return 3;
-    case PIXEL_FORMAT_YV12A:
-      return 4;
-    case PIXEL_FORMAT_UNKNOWN:
-      break;
-  }
-  NOTREACHED() << "Unsupported video frame format: " << format;
-  return 0;
-}
-
-// static
-size_t VideoFrame::AllocationSize(VideoPixelFormat format,
-                                  const math::Size& coded_size) {
-  size_t total = 0;
-  for (size_t i = 0; i < NumPlanes(format); ++i)
-    total += PlaneSize(format, i, coded_size).GetArea();
-  return total;
-}
-
-// static
-math::Size VideoFrame::PlaneSize(VideoPixelFormat format, size_t plane,
-                                 const math::Size& coded_size) {
-  DCHECK(IsValidPlane(plane, format));
-
-  int width = coded_size.width();
-  int height = coded_size.height();
-  if (format != PIXEL_FORMAT_ARGB) {
-    // Align to multiple-of-two size overall. This ensures that non-subsampled
-    // planes can be addressed by pixel with the same scaling as the subsampled
-    // planes.
-    width = RoundUp(width, 2);
-    height = RoundUp(height, 2);
-  }
-
-  const math::Size subsample = SampleSize(format, plane);
-  DCHECK_EQ(width % subsample.width(), 0);
-  DCHECK_EQ(height % subsample.height(), 0);
-  return math::Size(BytesPerElement(format, plane) * width / subsample.width(),
-                    height / subsample.height());
-}
-
-// static
-int VideoFrame::PlaneHorizontalBitsPerPixel(VideoPixelFormat format,
-                                            size_t plane) {
-  DCHECK(IsValidPlane(plane, format));
-  const int bits_per_element = 8 * BytesPerElement(format, plane);
-  const int horiz_pixels_per_element = SampleSize(format, plane).width();
-  DCHECK_EQ(bits_per_element % horiz_pixels_per_element, 0);
-  return bits_per_element / horiz_pixels_per_element;
-}
-
-// static
-int VideoFrame::PlaneBitsPerPixel(VideoPixelFormat format, size_t plane) {
-  DCHECK(IsValidPlane(plane, format));
-  return PlaneHorizontalBitsPerPixel(format, plane) /
-         SampleSize(format, plane).height();
-}
-
-// static
-size_t VideoFrame::RowBytes(size_t plane, VideoPixelFormat format, int width) {
-  DCHECK(IsValidPlane(plane, format));
-  return BytesPerElement(format, plane) * Columns(plane, format, width);
-}
-
-// static
-size_t VideoFrame::Rows(size_t plane, VideoPixelFormat format, int height) {
-  DCHECK(IsValidPlane(plane, format));
-  const int sample_height = SampleSize(format, plane).height();
-  return RoundUp(height, sample_height) / sample_height;
-}
-
-// static
-size_t VideoFrame::Columns(size_t plane, VideoPixelFormat format, int width) {
-  DCHECK(IsValidPlane(plane, format));
-  const int sample_width = SampleSize(format, plane).width();
-  return RoundUp(width, sample_width) / sample_width;
-}
-
-// static
-void VideoFrame::HashFrameForTesting(base::MD5Context* context,
-                                     const scoped_refptr<VideoFrame>& frame) {
-  DCHECK(context);
-  for (size_t plane = 0; plane < NumPlanes(frame->format()); ++plane) {
-    for (int row = 0; row < frame->rows(plane); ++row) {
-      base::MD5Update(
-          context,
-          base::StringPiece(reinterpret_cast<char*>(frame->data(plane) +
-                                                    frame->stride(plane) * row),
-                            frame->row_bytes(plane)));
-    }
-  }
-}
-
-bool VideoFrame::IsMappable() const {
-  return IsStorageTypeMappable(storage_type_);
-}
-
-bool VideoFrame::HasTextures() const {
-  return !mailbox_holders_[0].mailbox.IsZero();
-}
-
-gfx::ColorSpace VideoFrame::ColorSpace() const {
-  if (color_space_ == gfx::ColorSpace()) {
-    int videoframe_color_space;
-    if (metadata()->GetInteger(media::VideoFrameMetadata::COLOR_SPACE,
-                               &videoframe_color_space)) {
-      switch (videoframe_color_space) {
-        case media::COLOR_SPACE_JPEG:
-          return gfx::ColorSpace::CreateJpeg();
-        case media::COLOR_SPACE_HD_REC709:
-          return gfx::ColorSpace::CreateREC709();
-        case media::COLOR_SPACE_SD_REC601:
-          return gfx::ColorSpace::CreateREC601();
-        default:
-          break;
-      }
-    }
-  }
-  return color_space_;
-}
-
-void VideoFrame::set_color_space(const gfx::ColorSpace& color_space) {
-  color_space_ = color_space;
-}
-
-int VideoFrame::stride(size_t plane) const {
-  DCHECK(IsValidPlane(plane, format_));
-  return strides_[plane];
-}
-
-int VideoFrame::row_bytes(size_t plane) const {
-  return RowBytes(plane, format_, coded_size_.width());
-}
-
-int VideoFrame::rows(size_t plane) const {
-  return Rows(plane, format_, coded_size_.height());
-}
-
-const uint8_t* VideoFrame::data(size_t plane) const {
-  DCHECK(IsValidPlane(plane, format_));
-  DCHECK(IsMappable());
-  return data_[plane];
-}
-
-uint8_t* VideoFrame::data(size_t plane) {
-  DCHECK(IsValidPlane(plane, format_));
-  DCHECK(IsMappable());
-  return data_[plane];
-}
-
-const uint8_t* VideoFrame::visible_data(size_t plane) const {
-  DCHECK(IsValidPlane(plane, format_));
-  DCHECK(IsMappable());
-
-  // Calculate an offset that is properly aligned for all planes.
-  const math::Size alignment = CommonAlignment(format_);
-  const gfx::Point offset(RoundDown(visible_rect_.x(), alignment.width()),
-                          RoundDown(visible_rect_.y(), alignment.height()));
-
-  const math::Size subsample = SampleSize(format_, plane);
-  DCHECK_EQ(offset.x() % subsample.width(), 0);
-  DCHECK_EQ(offset.y() % subsample.height(), 0);
-  return data(plane) +
-         stride(plane) * (offset.y() / subsample.height()) +  // Row offset.
-         BytesPerElement(format_, plane) *                    // Column offset.
-             (offset.x() / subsample.width());
-}
-
-uint8_t* VideoFrame::visible_data(size_t plane) {
-  return const_cast<uint8_t*>(
-      static_cast<const VideoFrame*>(this)->visible_data(plane));
-}
-
-const gpu::MailboxHolder& VideoFrame::mailbox_holder(
-    size_t texture_index) const {
-  DCHECK(HasTextures());
-  DCHECK(IsValidPlane(texture_index, format_));
-  return mailbox_holders_[texture_index];
-}
-
-base::SharedMemoryHandle VideoFrame::shared_memory_handle() const {
-  DCHECK_EQ(storage_type_, STORAGE_SHMEM);
-  DCHECK(shared_memory_handle_ != base::SharedMemory::NULLHandle());
-  return shared_memory_handle_;
-}
-
-size_t VideoFrame::shared_memory_offset() const {
-  DCHECK_EQ(storage_type_, STORAGE_SHMEM);
-  DCHECK(shared_memory_handle_ != base::SharedMemory::NULLHandle());
-  return shared_memory_offset_;
-}
-
-const std::vector<gfx::GpuMemoryBufferHandle>&
-VideoFrame::gpu_memory_buffer_handles() const {
-  DCHECK_EQ(storage_type_, STORAGE_GPU_MEMORY_BUFFERS);
-  DCHECK(!gpu_memory_buffer_handles_.empty());
-  return gpu_memory_buffer_handles_;
-}
-
-#if defined(OS_LINUX)
-int VideoFrame::dmabuf_fd(size_t plane) const {
-  DCHECK_EQ(storage_type_, STORAGE_DMABUFS);
-  DCHECK(IsValidPlane(plane, format_));
-  return dmabuf_fds_[plane].get();
-}
-
-bool VideoFrame::DuplicateFileDescriptors(const std::vector<int>& in_fds) {
-  // TODO(mcasas): Support offsets for e.g. multiplanar inside a single |in_fd|.
-
-  storage_type_ = STORAGE_DMABUFS;
-  // TODO(posciak): This is not exactly correct, it's possible for one
-  // buffer to contain more than one plane.
-  if (in_fds.size() != NumPlanes(format_)) {
-    LOG(FATAL) << "Not enough dmabuf fds provided, got: " << in_fds.size()
-               << ", expected: " << NumPlanes(format_);
-    return false;
-  }
-
-  // Make sure that all fds are closed if any dup() fails,
-  base::ScopedFD temp_dmabuf_fds[kMaxPlanes];
-  for (size_t i = 0; i < in_fds.size(); ++i) {
-    temp_dmabuf_fds[i] = base::ScopedFD(HANDLE_EINTR(dup(in_fds[i])));
-    if (!temp_dmabuf_fds[i].is_valid()) {
-      DPLOG(ERROR) << "Failed duplicating a dmabuf fd";
-      return false;
-    }
-  }
-  for (size_t i = 0; i < kMaxPlanes; ++i)
-    dmabuf_fds_[i] = std::move(temp_dmabuf_fds[i]);
-
-  return true;
-}
-#endif
-
-void VideoFrame::AddSharedMemoryHandle(base::SharedMemoryHandle handle) {
-  storage_type_ = STORAGE_SHMEM;
-  shared_memory_handle_ = handle;
-}
-
-#if defined(OS_MACOSX)
-CVPixelBufferRef VideoFrame::cv_pixel_buffer() const {
-  return cv_pixel_buffer_.get();
-}
-#endif
-
-void VideoFrame::AddDestructionObserver(const base::Closure& callback) {
-  DCHECK(!callback.is_null());
-  done_callbacks_.push_back(callback);
-}
-
-void VideoFrame::UpdateReleaseSyncToken(SyncTokenClient* client) {
-  DCHECK(HasTextures());
-  base::AutoLock locker(release_sync_token_lock_);
-  // Must wait on the previous sync point before inserting a new sync point so
-  // that |mailbox_holders_release_cb_| guarantees the previous sync point
-  // occurred when it waits on |release_sync_token_|.
-  if (release_sync_token_.HasData()) client->WaitSyncToken(release_sync_token_);
-  client->GenerateSyncToken(&release_sync_token_);
-}
-
-std::string VideoFrame::AsHumanReadableString() {
-  if (metadata()->IsTrue(media::VideoFrameMetadata::END_OF_STREAM))
-    return "end of stream";
-
-  std::ostringstream s;
-  s << ConfigToString(format_, storage_type_, coded_size_, visible_rect_,
-                      natural_size_)
-    << " timestamp:" << timestamp_.InMicroseconds();
-  return s.str();
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::WrapExternalStorage(
-    VideoPixelFormat format, StorageType storage_type,
-    const math::Size& coded_size, const math::Rect& visible_rect,
-    const math::Size& natural_size, uint8_t* data, size_t data_size,
-    base::TimeDelta timestamp, base::SharedMemoryHandle handle,
-    size_t data_offset) {
-  DCHECK(IsStorageTypeMappable(storage_type));
-
-  // TODO(miu): This function should support any pixel format.
-  // http://crbug.com/555909
-  if (format != PIXEL_FORMAT_I420) {
-    LOG(DFATAL) << "Only PIXEL_FORMAT_I420 format supported: "
-                << VideoPixelFormatToString(format);
-    return NULL;
-  }
-
-  if (!IsValidConfig(format, storage_type, coded_size, visible_rect,
-                     natural_size)) {
-    LOG(DFATAL) << __func__ << " Invalid config."
-                << ConfigToString(format, storage_type, coded_size,
-                                  visible_rect, natural_size);
-    return NULL;
-  }
-
-  scoped_refptr<VideoFrame> frame;
-  if (storage_type == STORAGE_SHMEM) {
-    frame = new VideoFrame(format, storage_type, coded_size, visible_rect,
-                           natural_size, timestamp, handle, data_offset);
-  } else {
-    frame = new VideoFrame(format, storage_type, coded_size, visible_rect,
-                           natural_size, timestamp);
-  }
-  frame->strides_[kYPlane] = coded_size.width();
-  // TODO(miu): This always rounds widths down, whereas VideoFrame::RowBytes()
-  // always rounds up.  This inconsistency must be resolved.  Perhaps a
-  // CommonAlignment() check should be made in IsValidConfig()?
-  // http://crbug.com/555909
-  frame->strides_[kUPlane] = coded_size.width() / 2;
-  frame->strides_[kVPlane] = coded_size.width() / 2;
-  frame->data_[kYPlane] = data;
-  frame->data_[kUPlane] = data + coded_size.GetArea();
-  frame->data_[kVPlane] = data + (coded_size.GetArea() * 5 / 4);
-  return frame;
-}
-
-VideoFrame::VideoFrame(VideoPixelFormat format, StorageType storage_type,
-                       const math::Size& coded_size,
-                       const math::Rect& visible_rect,
-                       const math::Size& natural_size,
-                       base::TimeDelta timestamp)
-    : format_(format),
-      storage_type_(storage_type),
-      coded_size_(coded_size),
-      visible_rect_(visible_rect),
-      natural_size_(natural_size),
-      shared_memory_handle_(base::SharedMemory::NULLHandle()),
-      shared_memory_offset_(0),
-      timestamp_(timestamp),
-      unique_id_(g_unique_id_generator.GetNext()) {
-  DCHECK(IsValidConfig(format_, storage_type, coded_size_, visible_rect_,
-                       natural_size_));
-  memset(&mailbox_holders_, 0, sizeof(mailbox_holders_));
-  memset(&strides_, 0, sizeof(strides_));
-  memset(&data_, 0, sizeof(data_));
-}
-
-VideoFrame::~VideoFrame() {
-  if (!mailbox_holders_release_cb_.is_null()) {
-    gpu::SyncToken release_sync_token;
-    {
-      // To ensure that changes to |release_sync_token_| are visible on this
-      // thread (imply a memory barrier).
-      base::AutoLock locker(release_sync_token_lock_);
-      release_sync_token = release_sync_token_;
-    }
-    base::ResetAndReturn(&mailbox_holders_release_cb_).Run(release_sync_token);
-  }
-
-  for (auto& callback : done_callbacks_) base::ResetAndReturn(&callback).Run();
-}
-
-// static
-std::string VideoFrame::ConfigToString(const VideoPixelFormat format,
-                                       const StorageType storage_type,
-                                       const math::Size& coded_size,
-                                       const math::Rect& visible_rect,
-                                       const math::Size& natural_size) {
-  return base::StringPrintf(
-      "format:%s storage_type:%s coded_size:%s visible_rect:%s natural_size:%s",
-      VideoPixelFormatToString(format).c_str(),
-      StorageTypeToString(storage_type).c_str(), coded_size.ToString().c_str(),
-      visible_rect.ToString().c_str(), natural_size.ToString().c_str());
-}
-
-// static
-bool VideoFrame::IsValidPlane(size_t plane, VideoPixelFormat format) {
-  DCHECK_LE(NumPlanes(format), static_cast<size_t>(kMaxPlanes));
-  return (plane < NumPlanes(format));
-}
-
-// static
-math::Size VideoFrame::DetermineAlignedSize(VideoPixelFormat format,
-                                            const math::Size& dimensions) {
-  const math::Size alignment = CommonAlignment(format);
-  const math::Size adjusted =
-      math::Size(RoundUp(dimensions.width(), alignment.width()),
-                 RoundUp(dimensions.height(), alignment.height()));
-  DCHECK((adjusted.width() % alignment.width() == 0) &&
-         (adjusted.height() % alignment.height() == 0));
-  return adjusted;
-}
-
-void VideoFrame::set_data(size_t plane, uint8_t* ptr) {
-  DCHECK(IsValidPlane(plane, format_));
-  DCHECK(ptr);
-  data_[plane] = ptr;
-}
-
-void VideoFrame::set_stride(size_t plane, int stride) {
-  DCHECK(IsValidPlane(plane, format_));
-  DCHECK_GT(stride, 0);
-  strides_[plane] = stride;
-}
-
-VideoFrame::VideoFrame(VideoPixelFormat format, StorageType storage_type,
-                       const math::Size& coded_size,
-                       const math::Rect& visible_rect,
-                       const math::Size& natural_size,
-                       base::TimeDelta timestamp,
-                       base::SharedMemoryHandle handle,
-                       size_t shared_memory_offset)
-    : VideoFrame(format, storage_type, coded_size, visible_rect, natural_size,
-                 timestamp) {
-  DCHECK_EQ(storage_type, STORAGE_SHMEM);
-  AddSharedMemoryHandle(handle);
-  shared_memory_offset_ = shared_memory_offset;
-}
-
-VideoFrame::VideoFrame(VideoPixelFormat format, StorageType storage_type,
-                       const math::Size& coded_size,
-                       const math::Rect& visible_rect,
-                       const math::Size& natural_size,
-                       const gpu::MailboxHolder (&mailbox_holders)[kMaxPlanes],
-                       const ReleaseMailboxCB& mailbox_holder_release_cb,
-                       base::TimeDelta timestamp)
-    : VideoFrame(format, storage_type, coded_size, visible_rect, natural_size,
-                 timestamp) {
-  memcpy(&mailbox_holders_, mailbox_holders, sizeof(mailbox_holders_));
-  mailbox_holders_release_cb_ = mailbox_holder_release_cb;
-}
-
-// static
-scoped_refptr<VideoFrame> VideoFrame::CreateFrameInternal(
-    VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    base::TimeDelta timestamp, bool zero_initialize_memory) {
-  if (!IsYuvPlanar(format)) {
-    NOTIMPLEMENTED();
-    return NULL;
-  }
-
-  // Since we're creating a new YUV frame (and allocating memory for it
-  // ourselves), we can pad the requested |coded_size| if necessary if the
-  // request does not line up on sample boundaries. See discussion at
-  // http://crrev.com/1240833003
-  const math::Size new_coded_size = DetermineAlignedSize(format, coded_size);
-  const StorageType storage = STORAGE_OWNED_MEMORY;
-  if (!IsValidConfig(format, storage, new_coded_size, visible_rect,
-                     natural_size)) {
-    LOG(DFATAL) << __func__ << " Invalid config."
-                << ConfigToString(format, storage, coded_size, visible_rect,
-                                  natural_size);
-    return NULL;
-  }
-
-  scoped_refptr<VideoFrame> frame(new VideoFrame(
-      format, storage, new_coded_size, visible_rect, natural_size, timestamp));
-  frame->AllocateYUV(zero_initialize_memory);
-  return frame;
-}
-
-// static
-math::Size VideoFrame::SampleSize(VideoPixelFormat format, size_t plane) {
-  DCHECK(IsValidPlane(plane, format));
-
-  switch (plane) {
-    case kYPlane:  // and kARGBPlane:
-    case kAPlane:
-      return math::Size(1, 1);
-
-    case kUPlane:  // and kUVPlane:
-    case kVPlane:
-      switch (format) {
-        case PIXEL_FORMAT_YV24:
-        case PIXEL_FORMAT_YUV444P9:
-        case PIXEL_FORMAT_YUV444P10:
-        case PIXEL_FORMAT_YUV444P12:
-          return math::Size(1, 1);
-
-        case PIXEL_FORMAT_YV16:
-        case PIXEL_FORMAT_YUV422P9:
-        case PIXEL_FORMAT_YUV422P10:
-        case PIXEL_FORMAT_YUV422P12:
-          return math::Size(2, 1);
-
-        case PIXEL_FORMAT_YV12:
-        case PIXEL_FORMAT_I420:
-        case PIXEL_FORMAT_YV12A:
-        case PIXEL_FORMAT_NV12:
-        case PIXEL_FORMAT_NV21:
-        case PIXEL_FORMAT_MT21:
-        case PIXEL_FORMAT_YUV420P9:
-        case PIXEL_FORMAT_YUV420P10:
-        case PIXEL_FORMAT_YUV420P12:
-          return math::Size(2, 2);
-
-        case PIXEL_FORMAT_UNKNOWN:
-        case PIXEL_FORMAT_UYVY:
-        case PIXEL_FORMAT_YUY2:
-        case PIXEL_FORMAT_ARGB:
-        case PIXEL_FORMAT_XRGB:
-        case PIXEL_FORMAT_RGB24:
-        case PIXEL_FORMAT_RGB32:
-        case PIXEL_FORMAT_MJPEG:
-        case PIXEL_FORMAT_Y8:
-        case PIXEL_FORMAT_Y16:
-          break;
-      }
-  }
-  NOTREACHED();
-  return math::Size();
-}
-
-// static
-int VideoFrame::BytesPerElement(VideoPixelFormat format, size_t plane) {
-  DCHECK(IsValidPlane(plane, format));
-  switch (format) {
-    case PIXEL_FORMAT_ARGB:
-    case PIXEL_FORMAT_XRGB:
-    case PIXEL_FORMAT_RGB32:
-      return 4;
-    case PIXEL_FORMAT_RGB24:
-      return 3;
-    case PIXEL_FORMAT_Y16:
-    case PIXEL_FORMAT_UYVY:
-    case PIXEL_FORMAT_YUY2:
-    case PIXEL_FORMAT_YUV420P9:
-    case PIXEL_FORMAT_YUV422P9:
-    case PIXEL_FORMAT_YUV444P9:
-    case PIXEL_FORMAT_YUV420P10:
-    case PIXEL_FORMAT_YUV422P10:
-    case PIXEL_FORMAT_YUV444P10:
-    case PIXEL_FORMAT_YUV420P12:
-    case PIXEL_FORMAT_YUV422P12:
-    case PIXEL_FORMAT_YUV444P12:
-      return 2;
-    case PIXEL_FORMAT_NV12:
-    case PIXEL_FORMAT_NV21:
-    case PIXEL_FORMAT_MT21: {
-      static const int bytes_per_element[] = {1, 2};
-      DCHECK_LT(plane, arraysize(bytes_per_element));
-      return bytes_per_element[plane];
-    }
-    case PIXEL_FORMAT_YV12:
-    case PIXEL_FORMAT_I420:
-    case PIXEL_FORMAT_YV16:
-    case PIXEL_FORMAT_YV12A:
-    case PIXEL_FORMAT_YV24:
-    case PIXEL_FORMAT_Y8:
-      return 1;
-    case PIXEL_FORMAT_MJPEG:
-      return 0;
-    case PIXEL_FORMAT_UNKNOWN:
-      break;
-  }
-  NOTREACHED();
-  return 0;
-}
-
-// static
-math::Size VideoFrame::CommonAlignment(VideoPixelFormat format) {
-  int max_sample_width = 0;
-  int max_sample_height = 0;
-  for (size_t plane = 0; plane < NumPlanes(format); ++plane) {
-    const math::Size sample_size = SampleSize(format, plane);
-    max_sample_width = std::max(max_sample_width, sample_size.width());
-    max_sample_height = std::max(max_sample_height, sample_size.height());
-  }
-  return math::Size(max_sample_width, max_sample_height);
-}
-
-void VideoFrame::AllocateYUV(bool zero_initialize_memory) {
-  DCHECK_EQ(storage_type_, STORAGE_OWNED_MEMORY);
-  static_assert(0 == kYPlane, "y plane data must be index 0");
-
-  size_t data_size = 0;
-  size_t offset[kMaxPlanes];
-  for (size_t plane = 0; plane < NumPlanes(format_); ++plane) {
-    // The *2 in alignment for height is because some formats (e.g. h264) allow
-    // interlaced coding, and then the size needs to be a multiple of two
-    // macroblocks (vertically). See
-    // libavcodec/utils.c:avcodec_align_dimensions2().
-    const size_t height = RoundUp(rows(plane), kFrameSizeAlignment * 2);
-    strides_[plane] = RoundUp(row_bytes(plane), kFrameSizeAlignment);
-    offset[plane] = data_size;
-    data_size += height * strides_[plane];
-  }
-
-  // The extra line of UV being allocated is because h264 chroma MC
-  // overreads by one line in some cases, see libavcodec/utils.c:
-  // avcodec_align_dimensions2() and libavcodec/x86/h264_chromamc.asm:
-  // put_h264_chroma_mc4_ssse3().
-  DCHECK(IsValidPlane(kUPlane, format_));
-  data_size += strides_[kUPlane] + kFrameSizePadding;
-
-  uint8_t* data = reinterpret_cast<uint8_t*>(
-      base::AlignedAlloc(data_size, kFrameAddressAlignment));
-  if (zero_initialize_memory) memset(data, 0, data_size);
-
-  for (size_t plane = 0; plane < NumPlanes(format_); ++plane)
-    data_[plane] = data + offset[plane];
-
-  AddDestructionObserver(base::Bind(&base::AlignedFree, data));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/video_frame.h b/cobalt/media/base/video_frame.h
deleted file mode 100644
index 3130185..0000000
--- a/cobalt/media/base/video_frame.h
+++ /dev/null
@@ -1,516 +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 COBALT_MEDIA_BASE_VIDEO_FRAME_H_
-#define COBALT_MEDIA_BASE_VIDEO_FRAME_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/md5.h"
-#include "base/memory/shared_memory.h"
-#include "base/synchronization/lock.h"
-#include "build/build_config.h"
-#include "cobalt/math/gpu_memory_buffer.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/color_space.h"
-#include "cobalt/media/base/video_frame_metadata.h"
-#include "cobalt/media/base/video_types.h"
-#include "gpu/command_buffer/common/mailbox_holder.h"
-#include "starboard/types.h"
-
-#if defined(OS_MACOSX)
-#include <CoreVideo/CVPixelBuffer.h>
-#include "base/mac/scoped_cftyperef.h"
-#endif
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> {
- public:
-  enum {
-    kFrameSizeAlignment = 16,
-    kFrameSizePadding = 16,
-    kFrameAddressAlignment = 32
-  };
-
-  enum {
-    kMaxPlanes = 4,
-
-    kYPlane = 0,
-    kARGBPlane = kYPlane,
-    kUPlane = 1,
-    kUVPlane = kUPlane,
-    kVPlane = 2,
-    kAPlane = 3,
-  };
-
-  // Defines the pixel storage type. Differentiates between directly accessible
-  // |data_| and pixels that are only indirectly accessible and not via mappable
-  // memory.
-  // Note that VideoFrames of any StorageType can also have Texture backing,
-  // with "classical" GPU Driver-only textures identified as STORAGE_OPAQUE.
-  enum StorageType {
-    STORAGE_UNKNOWN = 0,
-    STORAGE_OPAQUE = 1,  // We don't know how VideoFrame's pixels are stored.
-    STORAGE_UNOWNED_MEMORY = 2,  // External, non owned data pointers.
-    STORAGE_OWNED_MEMORY = 3,  // VideoFrame has allocated its own data buffer.
-    STORAGE_SHMEM = 4,         // Pixels are backed by Shared Memory.
-#if defined(OS_LINUX)
-    // TODO(mcasas): Consider turning this type into STORAGE_NATIVE or another
-    // meaningful name and handle it appropriately in all cases.
-    STORAGE_DMABUFS = 5,  // Each plane is stored into a DmaBuf.
-#endif
-    STORAGE_GPU_MEMORY_BUFFERS = 6,
-    STORAGE_MOJO_SHARED_BUFFER = 7,
-    STORAGE_LAST = STORAGE_MOJO_SHARED_BUFFER,
-  };
-
-  // CB to be called on the mailbox backing this frame when the frame is
-  // destroyed.
-  typedef base::Callback<void(const gpu::SyncToken&)> ReleaseMailboxCB;
-
-  // Interface representing client operations on a SyncToken, i.e. insert one in
-  // the GPU Command Buffer and wait for it.
-  class SyncTokenClient {
-   public:
-    SyncTokenClient() {}
-    virtual void GenerateSyncToken(gpu::SyncToken* sync_token) = 0;
-    virtual void WaitSyncToken(const gpu::SyncToken& sync_token) = 0;
-
-   protected:
-    virtual ~SyncTokenClient() {}
-
-   private:
-    DISALLOW_COPY_AND_ASSIGN(SyncTokenClient);
-  };
-
-  // Call prior to CreateFrame to ensure validity of frame configuration. Called
-  // automatically by VideoDecoderConfig::IsValidConfig().
-  static bool IsValidConfig(VideoPixelFormat format, StorageType storage_type,
-                            const math::Size& coded_size,
-                            const math::Rect& visible_rect,
-                            const math::Size& natural_size);
-
-  // Creates a new YUV frame in system memory with given parameters (|format|
-  // must be YUV). Buffers for the frame are allocated but not initialized. The
-  // caller most not make assumptions about the actual underlying size(s), but
-  // check the returned VideoFrame instead.
-  // TODO(mcasas): implement the RGB version of this factory method.
-  static scoped_refptr<VideoFrame> CreateFrame(VideoPixelFormat format,
-                                               const math::Size& coded_size,
-                                               const math::Rect& visible_rect,
-                                               const math::Size& natural_size,
-                                               base::TimeDelta timestamp);
-
-  // Offers the same functionality as CreateFrame, and additionally zeroes out
-  // the initial allocated buffers.
-  static scoped_refptr<VideoFrame> CreateZeroInitializedFrame(
-      VideoPixelFormat format, const math::Size& coded_size,
-      const math::Rect& visible_rect, const math::Size& natural_size,
-      base::TimeDelta timestamp);
-
-  // Wraps a set of native textures with a VideoFrame.
-  // |mailbox_holders_release_cb| will be called with a sync token as the
-  // argument when the VideoFrame is to be destroyed.
-  static scoped_refptr<VideoFrame> WrapNativeTextures(
-      VideoPixelFormat format,
-      const gpu::MailboxHolder (&mailbox_holder)[kMaxPlanes],
-      const ReleaseMailboxCB& mailbox_holders_release_cb,
-      const math::Size& coded_size, const math::Rect& visible_rect,
-      const math::Size& natural_size, base::TimeDelta timestamp);
-
-  // Wraps packed image data residing in a memory buffer with a VideoFrame.
-  // The image data resides in |data| and is assumed to be packed tightly in a
-  // buffer of logical dimensions |coded_size| with the appropriate bit depth
-  // and plane count as given by |format|. Returns NULL on failure.
-  static scoped_refptr<VideoFrame> WrapExternalData(
-      VideoPixelFormat format, const math::Size& coded_size,
-      const math::Rect& visible_rect, const math::Size& natural_size,
-      uint8_t* data, size_t data_size, base::TimeDelta timestamp);
-
-  // Same as WrapExternalData() with SharedMemoryHandle and its offset.
-  static scoped_refptr<VideoFrame> WrapExternalSharedMemory(
-      VideoPixelFormat format, const math::Size& coded_size,
-      const math::Rect& visible_rect, const math::Size& natural_size,
-      uint8_t* data, size_t data_size, base::SharedMemoryHandle handle,
-      size_t shared_memory_offset, base::TimeDelta timestamp);
-
-  // Wraps external YUV data of the given parameters with a VideoFrame.
-  // The returned VideoFrame does not own the data passed in.
-  static scoped_refptr<VideoFrame> WrapExternalYuvData(
-      VideoPixelFormat format, const math::Size& coded_size,
-      const math::Rect& visible_rect, const math::Size& natural_size,
-      int32_t y_stride, int32_t u_stride, int32_t v_stride, uint8_t* y_data,
-      uint8_t* u_data, uint8_t* v_data, base::TimeDelta timestamp);
-
-  // Wraps external YUV data with the given parameters with a VideoFrame.
-  // The returned VideoFrame does not own the GpuMemoryBuffers passed in.
-  static scoped_refptr<VideoFrame> WrapExternalYuvGpuMemoryBuffers(
-      VideoPixelFormat format, const math::Size& coded_size,
-      const math::Rect& visible_rect, const math::Size& natural_size,
-      int32_t y_stride, int32_t u_stride, int32_t v_stride, uint8_t* y_data,
-      uint8_t* u_data, uint8_t* v_data,
-      const gfx::GpuMemoryBufferHandle& y_handle,
-      const gfx::GpuMemoryBufferHandle& u_handle,
-      const gfx::GpuMemoryBufferHandle& v_handle, base::TimeDelta timestamp);
-
-  // Wraps external YUVA data of the given parameters with a VideoFrame.
-  // The returned VideoFrame does not own the data passed in.
-  static scoped_refptr<VideoFrame> WrapExternalYuvaData(
-      VideoPixelFormat format, const math::Size& coded_size,
-      const math::Rect& visible_rect, const math::Size& natural_size,
-      int32_t y_stride, int32_t u_stride, int32_t v_stride, int32_t a_stride,
-      uint8_t* y_data, uint8_t* u_data, uint8_t* v_data, uint8_t* a_data,
-      base::TimeDelta timestamp);
-
-#if defined(OS_LINUX)
-  // Wraps provided dmabufs
-  // (https://www.kernel.org/doc/Documentation/dma-buf-sharing.txt) with a
-  // VideoFrame. The dmabuf fds are dup()ed on creation, so that the VideoFrame
-  // retains a reference to them, and are automatically close()d on destruction,
-  // dropping the reference. The caller may safely close() its reference after
-  // calling WrapExternalDmabufs().
-  // The image data is only accessible via dmabuf fds, which are usually passed
-  // directly to a hardware device and/or to another process, or can also be
-  // mapped via mmap() for CPU access.
-  // Returns NULL on failure.
-  static scoped_refptr<VideoFrame> WrapExternalDmabufs(
-      VideoPixelFormat format, const math::Size& coded_size,
-      const math::Rect& visible_rect, const math::Size& natural_size,
-      const std::vector<int>& dmabuf_fds, base::TimeDelta timestamp);
-#endif
-
-#if defined(OS_MACOSX)
-  // Wraps a provided CVPixelBuffer with a VideoFrame. The pixel buffer is
-  // retained for the lifetime of the VideoFrame and released upon destruction.
-  // The image data is only accessible via the pixel buffer, which could be
-  // backed by an IOSurface from another process. All the attributes of the
-  // VideoFrame are derived from the pixel buffer, with the exception of the
-  // timestamp. If information is missing or is incompatible (for example, a
-  // pixel format that has no VideoFrame match), NULL is returned.
-  // http://crbug.com/401308
-  static scoped_refptr<VideoFrame> WrapCVPixelBuffer(
-      CVPixelBufferRef cv_pixel_buffer, base::TimeDelta timestamp);
-#endif
-
-  // Wraps |frame|. |visible_rect| must be a sub rect within
-  // frame->visible_rect().
-  static scoped_refptr<VideoFrame> WrapVideoFrame(
-      const scoped_refptr<VideoFrame>& frame, VideoPixelFormat format,
-      const math::Rect& visible_rect, const math::Size& natural_size);
-
-  // Creates a frame which indicates end-of-stream.
-  static scoped_refptr<VideoFrame> CreateEOSFrame();
-
-  // Allocates YV12 frame based on |size|, and sets its data to the YUV(y,u,v).
-  static scoped_refptr<VideoFrame> CreateColorFrame(const math::Size& size,
-                                                    uint8_t y, uint8_t u,
-                                                    uint8_t v,
-                                                    base::TimeDelta timestamp);
-
-  // Allocates YV12 frame based on |size|, and sets its data to the YUV
-  // equivalent of RGB(0,0,0).
-  static scoped_refptr<VideoFrame> CreateBlackFrame(const math::Size& size);
-
-  // Allocates YV12A frame based on |size|, and sets its data to the YUVA
-  // equivalent of RGBA(0,0,0,0).
-  static scoped_refptr<VideoFrame> CreateTransparentFrame(
-      const math::Size& size);
-
-  static size_t NumPlanes(VideoPixelFormat format);
-
-  // Returns the required allocation size for a (tightly packed) frame of the
-  // given coded size and format.
-  static size_t AllocationSize(VideoPixelFormat format,
-                               const math::Size& coded_size);
-
-  // Returns the plane math::Size (in bytes) for a plane of the given coded size
-  // and format.
-  static math::Size PlaneSize(VideoPixelFormat format, size_t plane,
-                              const math::Size& coded_size);
-
-  // Returns horizontal bits per pixel for given |plane| and |format|.
-  static int PlaneHorizontalBitsPerPixel(VideoPixelFormat format, size_t plane);
-
-  // Returns bits per pixel for given |plane| and |format|.
-  static int PlaneBitsPerPixel(VideoPixelFormat format, size_t plane);
-
-  // Returns the number of bytes per row for the given plane, format, and width.
-  // The width may be aligned to format requirements.
-  static size_t RowBytes(size_t plane, VideoPixelFormat format, int width);
-
-  // Returns the number of rows for the given plane, format, and height.
-  // The height may be aligned to format requirements.
-  static size_t Rows(size_t plane, VideoPixelFormat format, int height);
-
-  // Returns the number of columns for the given plane, format, and width.
-  // The width may be aligned to format requirements.
-  static size_t Columns(size_t plane, VideoPixelFormat format, int width);
-
-  // Used to keep a running hash of seen frames.  Expects an initialized MD5
-  // context.  Calls MD5Update with the context and the contents of the frame.
-  static void HashFrameForTesting(base::MD5Context* context,
-                                  const scoped_refptr<VideoFrame>& frame);
-
-  // Returns true if |frame| is accessible and mapped in the VideoFrame memory
-  // space. If false, clients should refrain from accessing data(),
-  // visible_data() etc.
-  bool IsMappable() const;
-
-  // Returns true if |frame| has textures with any StorageType and should not be
-  // accessed via data(), visible_data() etc.
-  bool HasTextures() const;
-
-  // Returns the color space of this frame's content.
-  gfx::ColorSpace ColorSpace() const;
-  void set_color_space(const gfx::ColorSpace& color_space);
-
-  VideoPixelFormat format() const { return format_; }
-  StorageType storage_type() const { return storage_type_; }
-
-  const math::Size& coded_size() const { return coded_size_; }
-  const math::Rect& visible_rect() const { return visible_rect_; }
-  const math::Size& natural_size() const { return natural_size_; }
-
-  int stride(size_t plane) const;
-
-  // Returns the number of bytes per row and number of rows for a given plane.
-  //
-  // As opposed to stride(), row_bytes() refers to the bytes representing
-  // frame data scanlines (coded_size.width() pixels, without stride padding).
-  int row_bytes(size_t plane) const;
-  int rows(size_t plane) const;
-
-  // Returns pointer to the buffer for a given plane, if this is an
-  // IsMappable() frame type. The memory is owned by VideoFrame object and must
-  // not be freed by the caller.
-  const uint8_t* data(size_t plane) const;
-  uint8_t* data(size_t plane);
-
-  // Returns pointer to the data in the visible region of the frame, for
-  // IsMappable() storage types. The returned pointer is offsetted into the
-  // plane buffer specified by visible_rect().origin(). Memory is owned by
-  // VideoFrame object and must not be freed by the caller.
-  const uint8_t* visible_data(size_t plane) const;
-  uint8_t* visible_data(size_t plane);
-
-  // Returns a mailbox holder for a given texture.
-  // Only valid to call if this is a NATIVE_TEXTURE frame. Before using the
-  // mailbox, the caller must wait for the included sync point.
-  const gpu::MailboxHolder& mailbox_holder(size_t texture_index) const;
-
-  // Returns the shared-memory handle, if present
-  base::SharedMemoryHandle shared_memory_handle() const;
-
-  // Returns the offset into the shared memory where the frame data begins.
-  size_t shared_memory_offset() const;
-
-  // Returns the vector of GpuMemoryBuffer handles, if present.
-  const std::vector<gfx::GpuMemoryBufferHandle>& gpu_memory_buffer_handles()
-      const;
-
-#if defined(OS_LINUX)
-  // Returns backing DmaBuf file descriptor for given |plane|, if present, or
-  // -1 if not.
-  // TODO(mcasas): Rename to DmabufFd() to comply with Style Guide.
-  int dmabuf_fd(size_t plane) const;
-
-  // Duplicates internally the |fds_in|, overwriting the current ones. Returns
-  // false if something goes wrong, and leaves all internal fds closed.
-  bool DuplicateFileDescriptors(const std::vector<int>& fds_in);
-#endif
-
-  void AddSharedMemoryHandle(base::SharedMemoryHandle handle);
-
-#if defined(OS_MACOSX)
-  // Returns the backing CVPixelBuffer, if present.
-  // TODO(mcasas): Rename to CvPixelBuffer() to comply with Style Guide.
-  CVPixelBufferRef cv_pixel_buffer() const;
-#endif
-
-  // Adds a callback to be run when the VideoFrame is about to be destroyed.
-  // The callback may be run from ANY THREAD, and so it is up to the client to
-  // ensure thread safety.  Although read-only access to the members of this
-  // VideoFrame is permitted while the callback executes (including
-  // VideoFrameMetadata), clients should not assume the data pointers are
-  // valid.
-  void AddDestructionObserver(const base::Closure& callback);
-
-  // Returns a dictionary of optional metadata.  This contains information
-  // associated with the frame that downstream clients might use for frame-level
-  // logging, quality/performance optimizations, signaling, etc.
-  //
-  // TODO(miu): Move some of the "extra" members of VideoFrame (below) into
-  // here as a later clean-up step.
-  const VideoFrameMetadata* metadata() const { return &metadata_; }
-  VideoFrameMetadata* metadata() { return &metadata_; }
-
-  // The time span between the current frame and the first frame of the stream.
-  // This is the media timestamp, and not the reference time.
-  // See VideoFrameMetadata::REFERENCE_TIME for details.
-  base::TimeDelta timestamp() const { return timestamp_; }
-  void set_timestamp(base::TimeDelta timestamp) { timestamp_ = timestamp; }
-
-  // It uses |client| to insert a new sync point and potentially waits on a
-  // older sync point. The final sync point will be used to release this
-  // VideoFrame.
-  // This method is thread safe. Both blink and compositor threads can call it.
-  void UpdateReleaseSyncToken(SyncTokenClient* client);
-
-  // Returns a human-readable string describing |*this|.
-  std::string AsHumanReadableString();
-
-  // Unique identifier for this video frame; generated at construction time and
-  // guaranteed to be unique within a single process.
-  int unique_id() const { return unique_id_; }
-
- protected:
-  friend class base::RefCountedThreadSafe<VideoFrame>;
-
-  // Clients must use the static factory/wrapping methods to create a new frame.
-  // Derived classes should create their own factory/wrapping methods, and use
-  // this constructor to do basic initialization.
-  VideoFrame(VideoPixelFormat format, StorageType storage_type,
-             const math::Size& coded_size, const math::Rect& visible_rect,
-             const math::Size& natural_size, base::TimeDelta timestamp);
-
-  virtual ~VideoFrame();
-
-  // Creates a summary of the configuration settings provided as parameters.
-  static std::string ConfigToString(const VideoPixelFormat format,
-                                    const VideoFrame::StorageType storage_type,
-                                    const math::Size& coded_size,
-                                    const math::Rect& visible_rect,
-                                    const math::Size& natural_size);
-
-  // Returns true if |plane| is a valid plane index for the given |format|.
-  static bool IsValidPlane(size_t plane, VideoPixelFormat format);
-
-  // Returns |dimensions| adjusted to appropriate boundaries based on |format|.
-  static math::Size DetermineAlignedSize(VideoPixelFormat format,
-                                         const math::Size& dimensions);
-
-  void set_data(size_t plane, uint8_t* ptr);
-  void set_stride(size_t plane, int stride);
-
- private:
-  // Clients must use the static factory/wrapping methods to create a new frame.
-  VideoFrame(VideoPixelFormat format, StorageType storage_type,
-             const math::Size& coded_size, const math::Rect& visible_rect,
-             const math::Size& natural_size, base::TimeDelta timestamp,
-             base::SharedMemoryHandle handle, size_t shared_memory_offset);
-  VideoFrame(VideoPixelFormat format, StorageType storage_type,
-             const math::Size& coded_size, const math::Rect& visible_rect,
-             const math::Size& natural_size,
-             const gpu::MailboxHolder (&mailbox_holders)[kMaxPlanes],
-             const ReleaseMailboxCB& mailbox_holder_release_cb,
-             base::TimeDelta timestamp);
-
-  static scoped_refptr<VideoFrame> WrapExternalStorage(
-      VideoPixelFormat format, StorageType storage_type,
-      const math::Size& coded_size, const math::Rect& visible_rect,
-      const math::Size& natural_size, uint8_t* data, size_t data_size,
-      base::TimeDelta timestamp, base::SharedMemoryHandle handle,
-      size_t data_offset);
-
-  static scoped_refptr<VideoFrame> CreateFrameInternal(
-      VideoPixelFormat format, const math::Size& coded_size,
-      const math::Rect& visible_rect, const math::Size& natural_size,
-      base::TimeDelta timestamp, bool zero_initialize_memory);
-
-  // Returns the pixel size of each subsample for a given |plane| and |format|.
-  // E.g. 2x2 for the U-plane in PIXEL_FORMAT_I420.
-  static math::Size SampleSize(VideoPixelFormat format, size_t plane);
-
-  // Returns the number of bytes per element for given |plane| and |format|.
-  static int BytesPerElement(VideoPixelFormat format, size_t plane);
-
-  // Return the alignment for the whole frame, calculated as the max of the
-  // alignment for each individual plane.
-  static math::Size CommonAlignment(VideoPixelFormat format);
-
-  void AllocateYUV(bool zero_initialize_memory);
-
-  // Frame format.
-  const VideoPixelFormat format_;
-
-  // Storage type for the different planes.
-  StorageType storage_type_;  // TODO(mcasas): make const
-
-  // Width and height of the video frame, in pixels. This must include pixel
-  // data for the whole image; i.e. for YUV formats with subsampled chroma
-  // planes, in the case that the visible portion of the image does not line up
-  // on a sample boundary, |coded_size_| must be rounded up appropriately and
-  // the pixel data provided for the odd pixels.
-  const math::Size coded_size_;
-
-  // Width, height, and offsets of the visible portion of the video frame. Must
-  // be a subrect of |coded_size_|. Can be odd with respect to the sample
-  // boundaries, e.g. for formats with subsampled chroma.
-  const math::Rect visible_rect_;
-
-  // Width and height of the visible portion of the video frame
-  // (|visible_rect_.size()|) with aspect ratio taken into account.
-  const math::Size natural_size_;
-
-  // Array of strides for each plane, typically greater or equal to the width
-  // of the surface divided by the horizontal sampling period.  Note that
-  // strides can be negative.
-  int32_t strides_[kMaxPlanes];
-
-  // Array of data pointers to each plane.
-  // TODO(mcasas): we don't know on ctor if we own |data_| or not. Change
-  // to std::unique_ptr<uint8_t, AlignedFreeDeleter> after refactoring
-  // VideoFrame.
-  uint8_t* data_[kMaxPlanes];
-
-  // Native texture mailboxes, if this is a IsTexture() frame.
-  gpu::MailboxHolder mailbox_holders_[kMaxPlanes];
-  ReleaseMailboxCB mailbox_holders_release_cb_;
-
-  // Shared memory handle and associated offset inside it, if this frame is
-  // a STORAGE_SHMEM one.
-  base::SharedMemoryHandle shared_memory_handle_;
-  size_t shared_memory_offset_;
-
-  // GpuMemoryBuffer handles attached to the video_frame.
-  std::vector<gfx::GpuMemoryBufferHandle> gpu_memory_buffer_handles_;
-
-#if defined(OS_LINUX)
-  // Dmabufs for each plane. If set, this frame has DmaBuf backing in some way.
-  base::ScopedFD dmabuf_fds_[kMaxPlanes];
-#endif
-
-#if defined(OS_MACOSX)
-  // CVPixelBuffer, if this frame is wrapping one.
-  base::ScopedCFTypeRef<CVPixelBufferRef> cv_pixel_buffer_;
-#endif
-
-  std::vector<base::Closure> done_callbacks_;
-
-  base::TimeDelta timestamp_;
-
-  base::Lock release_sync_token_lock_;
-  gpu::SyncToken release_sync_token_;
-
-  VideoFrameMetadata metadata_;
-
-  // Generated at construction time.
-  const int unique_id_;
-
-  gfx::ColorSpace color_space_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(VideoFrame);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VIDEO_FRAME_H_
diff --git a/cobalt/media/base/video_frame_metadata.cc b/cobalt/media/base/video_frame_metadata.cc
deleted file mode 100644
index f277666..0000000
--- a/cobalt/media/base/video_frame_metadata.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/base/video_frame_metadata.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-// Map enum key to internal std::string key used by base::DictionaryValue.
-inline std::string ToInternalKey(VideoFrameMetadata::Key key) {
-  DCHECK_LT(key, VideoFrameMetadata::NUM_KEYS);
-  return base::IntToString(static_cast<int>(key));
-}
-
-}  // namespace
-
-VideoFrameMetadata::VideoFrameMetadata() {}
-
-VideoFrameMetadata::~VideoFrameMetadata() {}
-
-bool VideoFrameMetadata::HasKey(Key key) const {
-  return dictionary_.HasKey(ToInternalKey(key));
-}
-
-void VideoFrameMetadata::SetBoolean(Key key, bool value) {
-  dictionary_.SetBooleanWithoutPathExpansion(ToInternalKey(key), value);
-}
-
-void VideoFrameMetadata::SetInteger(Key key, int value) {
-  dictionary_.SetIntegerWithoutPathExpansion(ToInternalKey(key), value);
-}
-
-void VideoFrameMetadata::SetDouble(Key key, double value) {
-  dictionary_.SetDoubleWithoutPathExpansion(ToInternalKey(key), value);
-}
-
-void VideoFrameMetadata::SetRotation(Key key, VideoRotation value) {
-  DCHECK_EQ(ROTATION, key);
-  dictionary_.SetIntegerWithoutPathExpansion(ToInternalKey(key), value);
-}
-
-void VideoFrameMetadata::SetString(Key key, const std::string& value) {
-  dictionary_.SetWithoutPathExpansion(
-      ToInternalKey(key),
-      // Using BinaryValue since we don't want the |value| interpreted as having
-      // any particular character encoding (e.g., UTF-8) by
-      // base::DictionaryValue.
-      base::BinaryValue::CreateWithCopiedBuffer(value.data(), value.size()));
-}
-
-namespace {
-template <class TimeType>
-void SetTimeValue(VideoFrameMetadata::Key key, const TimeType& value,
-                  base::DictionaryValue* dictionary) {
-  const int64_t internal_value = value.ToInternalValue();
-  dictionary->SetWithoutPathExpansion(
-      ToInternalKey(key), base::BinaryValue::CreateWithCopiedBuffer(
-                              reinterpret_cast<const char*>(&internal_value),
-                              sizeof(internal_value)));
-}
-}  // namespace
-
-void VideoFrameMetadata::SetTimeDelta(Key key, const base::TimeDelta& value) {
-  SetTimeValue(key, value, &dictionary_);
-}
-
-void VideoFrameMetadata::SetTimeTicks(Key key, const base::TimeTicks& value) {
-  SetTimeValue(key, value, &dictionary_);
-}
-
-void VideoFrameMetadata::SetValue(Key key, std::unique_ptr<base::Value> value) {
-  dictionary_.SetWithoutPathExpansion(ToInternalKey(key), std::move(value));
-}
-
-bool VideoFrameMetadata::GetBoolean(Key key, bool* value) const {
-  DCHECK(value);
-  return dictionary_.GetBooleanWithoutPathExpansion(ToInternalKey(key), value);
-}
-
-bool VideoFrameMetadata::GetInteger(Key key, int* value) const {
-  DCHECK(value);
-  return dictionary_.GetIntegerWithoutPathExpansion(ToInternalKey(key), value);
-}
-
-bool VideoFrameMetadata::GetDouble(Key key, double* value) const {
-  DCHECK(value);
-  return dictionary_.GetDoubleWithoutPathExpansion(ToInternalKey(key), value);
-}
-
-bool VideoFrameMetadata::GetRotation(Key key, VideoRotation* value) const {
-  DCHECK_EQ(ROTATION, key);
-  DCHECK(value);
-  int int_value;
-  const bool rv = dictionary_.GetIntegerWithoutPathExpansion(ToInternalKey(key),
-                                                             &int_value);
-  if (rv) *value = static_cast<VideoRotation>(int_value);
-  return rv;
-}
-
-bool VideoFrameMetadata::GetString(Key key, std::string* value) const {
-  DCHECK(value);
-  const base::BinaryValue* const binary_value = GetBinaryValue(key);
-  if (binary_value)
-    value->assign(binary_value->GetBuffer(), binary_value->GetSize());
-  return !!binary_value;
-}
-
-namespace {
-template <class TimeType>
-bool ToTimeValue(const base::BinaryValue& binary_value, TimeType* value) {
-  DCHECK(value);
-  int64_t internal_value;
-  if (binary_value.GetSize() != sizeof(internal_value)) return false;
-  memcpy(&internal_value, binary_value.GetBuffer(),
-               sizeof(internal_value));
-  *value = TimeType::FromInternalValue(internal_value);
-  return true;
-}
-}  // namespace
-
-bool VideoFrameMetadata::GetTimeDelta(Key key, base::TimeDelta* value) const {
-  const base::BinaryValue* const binary_value = GetBinaryValue(key);
-  return binary_value && ToTimeValue(*binary_value, value);
-}
-
-bool VideoFrameMetadata::GetTimeTicks(Key key, base::TimeTicks* value) const {
-  const base::BinaryValue* const binary_value = GetBinaryValue(key);
-  return binary_value && ToTimeValue(*binary_value, value);
-}
-
-const base::Value* VideoFrameMetadata::GetValue(Key key) const {
-  const base::Value* result = NULL;
-  if (!dictionary_.GetWithoutPathExpansion(ToInternalKey(key), &result))
-    return NULL;
-  return result;
-}
-
-bool VideoFrameMetadata::IsTrue(Key key) const {
-  bool value = false;
-  return GetBoolean(key, &value) && value;
-}
-
-void VideoFrameMetadata::MergeInternalValuesInto(
-    base::DictionaryValue* out) const {
-  out->MergeDictionary(&dictionary_);
-}
-
-void VideoFrameMetadata::MergeInternalValuesFrom(
-    const base::DictionaryValue& in) {
-  dictionary_.MergeDictionary(&in);
-}
-
-void VideoFrameMetadata::MergeMetadataFrom(
-    const VideoFrameMetadata* metadata_source) {
-  dictionary_.MergeDictionary(&metadata_source->dictionary_);
-}
-
-const base::BinaryValue* VideoFrameMetadata::GetBinaryValue(Key key) const {
-  const base::Value* internal_value = NULL;
-  if (dictionary_.GetWithoutPathExpansion(ToInternalKey(key),
-                                          &internal_value) &&
-      internal_value->GetType() == base::Value::TYPE_BINARY) {
-    return static_cast<const base::BinaryValue*>(internal_value);
-  }
-  return NULL;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/video_frame_metadata.h b/cobalt/media/base/video_frame_metadata.h
deleted file mode 100644
index 3870a32..0000000
--- a/cobalt/media/base/video_frame_metadata.h
+++ /dev/null
@@ -1,167 +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 COBALT_MEDIA_BASE_VIDEO_FRAME_METADATA_H_
-#define COBALT_MEDIA_BASE_VIDEO_FRAME_METADATA_H_
-
-#include <memory>
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "base/time/time.h"
-#include "base/values.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/video_rotation.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT VideoFrameMetadata {
- public:
-  enum Key {
-    // Sources of VideoFrames use this marker to indicate that the associated
-    // VideoFrame can be overlayed, case in which its contents do not need to be
-    // further composited but displayed directly. Use Get/SetBoolean() for
-    // this Key.
-    ALLOW_OVERLAY,
-
-    // Video capture begin/end timestamps.  Consumers can use these values for
-    // dynamic optimizations, logging stats, etc.  Use Get/SetTimeTicks() for
-    // these keys.
-    CAPTURE_BEGIN_TIME,
-    CAPTURE_END_TIME,
-
-    // Some VideoFrames have an indication of the color space used.  Use
-    // GetInteger()/SetInteger() and ColorSpace enumeration.
-    COLOR_SPACE,
-
-    // Indicates that this frame must be copied to a new texture before use,
-    // rather than being used directly. Specifically this is required for
-    // WebView because of limitations about sharing surface textures between GL
-    // contexts.
-    COPY_REQUIRED,
-
-    // Indicates that the frame is owned by the decoder and that destroying the
-    // decoder will make the frame unrenderable. TODO(sandersd): Remove once OSX
-    // and Windows hardware decoders support frames which outlive the decoder.
-    // http://crbug.com/595716 and http://crbug.com/602708.
-    DECODER_OWNS_FRAME,
-
-    // Indicates if the current frame is the End of its current Stream. Use
-    // Get/SetBoolean() for this Key.
-    END_OF_STREAM,
-
-    // The estimated duration of this frame (i.e., the amount of time between
-    // the media timestamp of this frame and the next).  Note that this is not
-    // the same information provided by FRAME_RATE as the FRAME_DURATION can
-    // vary unpredictably for every frame.  Consumers can use this to optimize
-    // playback scheduling, make encoding quality decisions, and/or compute
-    // frame-level resource utilization stats.  Use Get/SetTimeDelta() for this
-    // key.
-    FRAME_DURATION,
-
-    // Represents either the fixed frame rate, or the maximum frame rate to
-    // expect from a variable-rate source.  This value generally remains the
-    // same for all frames in the same session.  Use Get/SetDouble() for this
-    // key.
-    FRAME_RATE,
-
-    // This is a boolean that signals that the video capture engine detects
-    // interactive content. One possible optimization that this signal can help
-    // with is remote content: adjusting end-to-end latency down to help the
-    // user better coordinate their actions.
-    //
-    // Use Get/SetBoolean for this key.
-    INTERACTIVE_CONTENT,
-
-    // This field represents the local time at which either: 1) the frame was
-    // generated, if it was done so locally; or 2) the targeted play-out time
-    // of the frame, if it was generated from a remote source. This value is NOT
-    // a high-resolution timestamp, and so it should not be used as a
-    // presentation time; but, instead, it should be used for buffering playback
-    // and for A/V synchronization purposes.
-    // Use Get/SetTimeTicks() for this key.
-    REFERENCE_TIME,
-
-    // A feedback signal that indicates the fraction of the tolerable maximum
-    // amount of resources that were utilized to process this frame.  A producer
-    // can check this value after-the-fact, usually via a VideoFrame destruction
-    // observer, to determine whether the consumer can handle more or less data
-    // volume, and achieve the right quality versus performance trade-off.
-    //
-    // Use Get/SetDouble() for this key.  Values are interpreted as follows:
-    // Less than 0.0 is meaningless and should be ignored.  1.0 indicates a
-    // maximum sustainable utilization.  Greater than 1.0 indicates the consumer
-    // is likely to stall or drop frames if the data volume is not reduced.
-    //
-    // Example: In a system that encodes and transmits video frames over the
-    // network, this value can be used to indicate whether sufficient CPU
-    // is available for encoding and/or sufficient bandwidth is available for
-    // transmission over the network.  The maximum of the two utilization
-    // measurements would be used as feedback.
-    RESOURCE_UTILIZATION,
-
-    // Sources of VideoFrames use this marker to indicate that an instance of
-    // VideoFrameExternalResources produced from the associated video frame
-    // should use read lock fences.
-    READ_LOCK_FENCES_ENABLED,
-
-    // Indicates that the frame is rotated.
-    ROTATION,
-
-    NUM_KEYS
-  };
-
-  VideoFrameMetadata();
-  ~VideoFrameMetadata();
-
-  bool HasKey(Key key) const;
-
-  void Clear() { dictionary_.Clear(); }
-
-  // Setters.  Overwrites existing value, if present.
-  void SetBoolean(Key key, bool value);
-  void SetInteger(Key key, int value);
-  void SetDouble(Key key, double value);
-  void SetRotation(Key key, VideoRotation value);
-  void SetString(Key key, const std::string& value);
-  void SetTimeDelta(Key key, const base::TimeDelta& value);
-  void SetTimeTicks(Key key, const base::TimeTicks& value);
-  void SetValue(Key key, std::unique_ptr<base::Value> value);
-
-  // Getters.  Returns true if |key| is present, and its value has been set.
-  bool GetBoolean(Key key, bool* value) const WARN_UNUSED_RESULT;
-  bool GetInteger(Key key, int* value) const WARN_UNUSED_RESULT;
-  bool GetDouble(Key key, double* value) const WARN_UNUSED_RESULT;
-  bool GetRotation(Key key, VideoRotation* value) const WARN_UNUSED_RESULT;
-  bool GetString(Key key, std::string* value) const WARN_UNUSED_RESULT;
-  bool GetTimeDelta(Key key, base::TimeDelta* value) const WARN_UNUSED_RESULT;
-  bool GetTimeTicks(Key key, base::TimeTicks* value) const WARN_UNUSED_RESULT;
-
-  // Returns null if |key| was not present.
-  const base::Value* GetValue(Key key) const WARN_UNUSED_RESULT;
-
-  // Convenience method that returns true if |key| exists and is set to true.
-  bool IsTrue(Key key) const WARN_UNUSED_RESULT;
-
-  // For serialization.
-  void MergeInternalValuesInto(base::DictionaryValue* out) const;
-  void MergeInternalValuesFrom(const base::DictionaryValue& in);
-
-  // Merges internal values from |metadata_source|.
-  void MergeMetadataFrom(const VideoFrameMetadata* metadata_source);
-
- private:
-  const base::BinaryValue* GetBinaryValue(Key key) const;
-
-  base::DictionaryValue dictionary_;
-
-  DISALLOW_COPY_AND_ASSIGN(VideoFrameMetadata);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VIDEO_FRAME_METADATA_H_
diff --git a/cobalt/media/base/video_resolution.h b/cobalt/media/base/video_resolution.h
deleted file mode 100644
index 9e3c899..0000000
--- a/cobalt/media/base/video_resolution.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2016 The Cobalt Authors. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef COBALT_MEDIA_BASE_VIDEO_RESOLUTION_H_
-#define COBALT_MEDIA_BASE_VIDEO_RESOLUTION_H_
-
-#include "cobalt/math/size.h"
-#include "starboard/media.h"
-
-namespace cobalt {
-namespace media {
-
-// Enumerates the various representations of the resolution of videos.  Note
-// that except |kVideoResolutionInvalid|, all other values are guaranteed to be
-// in the same order as its (width, height) pair.
-enum VideoResolution {
-  kVideoResolution1080p,  // 1920 x 1080
-  kVideoResolution2k,     // 2560 x 1440
-  kVideoResolution4k,     // 3840 x 2160
-  kVideoResolutionInvalid,
-};
-
-inline VideoResolution GetVideoResolution(int width, int height) {
-  if (width <= 1920 && height <= 1080) {
-    return kVideoResolution1080p;
-  }
-  if (width <= 2560 && height <= 1440) {
-    return kVideoResolution2k;
-  }
-  if (width <= 3840 && height <= 2160) {
-    return kVideoResolution4k;
-  }
-  return kVideoResolutionInvalid;
-}
-
-inline VideoResolution GetVideoResolution(const math::Size& size) {
-  return GetVideoResolution(size.width(), size.height());
-}
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VIDEO_RESOLUTION_H_
diff --git a/cobalt/media/base/video_rotation.h b/cobalt/media/base/video_rotation.h
deleted file mode 100644
index 0257a9e..0000000
--- a/cobalt/media/base/video_rotation.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 COBALT_MEDIA_BASE_VIDEO_ROTATION_H_
-#define COBALT_MEDIA_BASE_VIDEO_ROTATION_H_
-
-namespace cobalt {
-namespace media {
-
-// Enumeration to represent 90 degree video rotation for MP4 videos
-// where it can be rotated by 90 degree intervals.
-enum VideoRotation {
-  VIDEO_ROTATION_0 = 0,
-  VIDEO_ROTATION_90,
-  VIDEO_ROTATION_180,
-  VIDEO_ROTATION_270,
-  VIDEO_ROTATION_MAX = VIDEO_ROTATION_270
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VIDEO_ROTATION_H_
diff --git a/cobalt/media/base/video_types.h b/cobalt/media/base/video_types.h
deleted file mode 100644
index e08afc1..0000000
--- a/cobalt/media/base/video_types.h
+++ /dev/null
@@ -1,94 +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 COBALT_MEDIA_BASE_VIDEO_TYPES_H_
-#define COBALT_MEDIA_BASE_VIDEO_TYPES_H_
-
-#include <string>
-
-#include "build/build_config.h"
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-// Pixel formats roughly based on FOURCC labels, see:
-// http://www.fourcc.org/rgb.php and http://www.fourcc.org/yuv.php
-// Logged to UMA, so never reuse values. Leave gaps if necessary.
-// Ordered as planar, semi-planar, YUV-packed, and RGB formats.
-enum VideoPixelFormat {
-  PIXEL_FORMAT_UNKNOWN = 0,  // Unknown or unspecified format value.
-  PIXEL_FORMAT_I420 =
-      1,  // 12bpp YUV planar 1x1 Y, 2x2 UV samples, a.k.a. YU12.
-  PIXEL_FORMAT_YV12 = 2,   // 12bpp YVU planar 1x1 Y, 2x2 VU samples.
-  PIXEL_FORMAT_YV16 = 3,   // 16bpp YVU planar 1x1 Y, 2x1 VU samples.
-  PIXEL_FORMAT_YV12A = 4,  // 20bpp YUVA planar 1x1 Y, 2x2 VU, 1x1 A samples.
-  PIXEL_FORMAT_YV24 = 5,   // 24bpp YUV planar, no subsampling.
-  PIXEL_FORMAT_NV12 =
-      6,  // 12bpp with Y plane followed by a 2x2 interleaved UV plane.
-  PIXEL_FORMAT_NV21 =
-      7,  // 12bpp with Y plane followed by a 2x2 interleaved VU plane.
-  PIXEL_FORMAT_UYVY =
-      8,  // 16bpp interleaved 2x1 U, 1x1 Y, 2x1 V, 1x1 Y samples.
-  PIXEL_FORMAT_YUY2 =
-      9,  // 16bpp interleaved 1x1 Y, 2x1 U, 1x1 Y, 2x1 V samples.
-  PIXEL_FORMAT_ARGB = 10,   // 32bpp ARGB, 1 plane.
-  PIXEL_FORMAT_XRGB = 11,   // 24bpp XRGB, 1 plane.
-  PIXEL_FORMAT_RGB24 = 12,  // 24bpp BGR, 1 plane.
-  PIXEL_FORMAT_RGB32 = 13,  // 32bpp BGRA, 1 plane.
-  PIXEL_FORMAT_MJPEG = 14,  // MJPEG compressed.
-  // MediaTek proprietary format. MT21 is similar to NV21 except the memory
-  // layout and pixel layout (swizzles). 12bpp with Y plane followed by a 2x2
-  // interleaved VU plane. Each image contains two buffers -- Y plane and VU
-  // plane. Two planes can be non-contiguous in memory. The starting addresses
-  // of Y plane and VU plane are 4KB alignment.
-  // Suppose image dimension is (width, height). For both Y plane and VU plane:
-  // Row pitch = ((width+15)/16) * 16.
-  // Plane size = Row pitch * (((height+31)/32)*32)
-  PIXEL_FORMAT_MT21 = 15,
-
-  PIXEL_FORMAT_YUV420P9 = 16,
-  PIXEL_FORMAT_YUV420P10 = 17,
-  PIXEL_FORMAT_YUV422P9 = 18,
-  PIXEL_FORMAT_YUV422P10 = 19,
-  PIXEL_FORMAT_YUV444P9 = 20,
-  PIXEL_FORMAT_YUV444P10 = 21,
-
-  PIXEL_FORMAT_YUV420P12 = 22,
-  PIXEL_FORMAT_YUV422P12 = 23,
-  PIXEL_FORMAT_YUV444P12 = 24,
-
-  PIXEL_FORMAT_Y8 = 25,   // single 8bpp plane.
-  PIXEL_FORMAT_Y16 = 26,  // single 16bpp plane.
-
-  // Please update UMA histogram enumeration when adding new formats here.
-  PIXEL_FORMAT_MAX =
-      PIXEL_FORMAT_Y16,  // Must always be equal to largest entry logged.
-};
-
-// Color space or color range used for the pixels.
-// Logged to UMA, so never reuse values. Leave gaps if necessary.
-enum ColorSpace {
-  COLOR_SPACE_UNSPECIFIED = 0,  // In general this is Rec601.
-  // The JPEG color space is the combination of Rec.601 and full range colors
-  // (aka pc range colors).
-  COLOR_SPACE_JPEG = 1,
-  COLOR_SPACE_HD_REC709 = 2,  // Rec709 "HD" color space.
-  COLOR_SPACE_SD_REC601 = 3,  // Rec601 "SD" color space.
-  COLOR_SPACE_MAX = COLOR_SPACE_SD_REC601,
-};
-
-// Returns the name of a Format as a string.
-MEDIA_EXPORT std::string VideoPixelFormatToString(VideoPixelFormat format);
-
-// Returns true if |format| is a YUV format with multiple planes.
-MEDIA_EXPORT bool IsYuvPlanar(VideoPixelFormat format);
-
-// Returns true if |format| has no Alpha channel (hence is always opaque).
-MEDIA_EXPORT bool IsOpaque(VideoPixelFormat format);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VIDEO_TYPES_H_
diff --git a/cobalt/media/base/video_util.cc b/cobalt/media/base/video_util.cc
deleted file mode 100644
index ef11801..0000000
--- a/cobalt/media/base/video_util.cc
+++ /dev/null
@@ -1,129 +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 "cobalt/media/base/video_util.h"
-
-#include <cmath>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "cobalt/media/base/yuv_convert.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-math::Size GetNaturalSize(const math::Size& visible_size,
-                          int aspect_ratio_numerator,
-                          int aspect_ratio_denominator) {
-  if (aspect_ratio_denominator == 0 || aspect_ratio_numerator < 0 ||
-      aspect_ratio_denominator < 0)
-    return math::Size();
-
-  double aspect_ratio =
-      aspect_ratio_numerator / static_cast<double>(aspect_ratio_denominator);
-
-  return math::Size(round(visible_size.width() * aspect_ratio),
-                    visible_size.height());
-}
-
-void RotatePlaneByPixels(const uint8_t* src, uint8_t* dest, int width,
-                         int height,
-                         int rotation,  // Clockwise.
-                         bool flip_vert, bool flip_horiz) {
-  DCHECK((width > 0) && (height > 0) && ((width & 1) == 0) &&
-         ((height & 1) == 0) && (rotation >= 0) && (rotation < 360) &&
-         (rotation % 90 == 0));
-
-  // Consolidate cases. Only 0 and 90 are left.
-  if (rotation == 180 || rotation == 270) {
-    rotation -= 180;
-    flip_vert = !flip_vert;
-    flip_horiz = !flip_horiz;
-  }
-
-  int num_rows = height;
-  int num_cols = width;
-  int src_stride = width;
-  // During pixel copying, the corresponding incremental of dest pointer
-  // when src pointer moves to next row.
-  int dest_row_step = width;
-  // During pixel copying, the corresponding incremental of dest pointer
-  // when src pointer moves to next column.
-  int dest_col_step = 1;
-
-  if (rotation == 0) {
-    if (flip_horiz) {
-      // Use pixel copying.
-      dest_col_step = -1;
-      if (flip_vert) {
-        // Rotation 180.
-        dest_row_step = -width;
-        dest += height * width - 1;
-      } else {
-        dest += width - 1;
-      }
-    } else {
-      if (flip_vert) {
-        // Fast copy by rows.
-        dest += width * (height - 1);
-        for (int row = 0; row < height; ++row) {
-          memcpy(dest, src, width);
-          src += width;
-          dest -= width;
-        }
-      } else {
-        memcpy(dest, src, width * height);
-      }
-      return;
-    }
-  } else if (rotation == 90) {
-    int offset;
-    if (width > height) {
-      offset = (width - height) / 2;
-      src += offset;
-      num_rows = num_cols = height;
-    } else {
-      offset = (height - width) / 2;
-      src += width * offset;
-      num_rows = num_cols = width;
-    }
-
-    dest_col_step = (flip_vert ? -width : width);
-    dest_row_step = (flip_horiz ? 1 : -1);
-    if (flip_horiz) {
-      if (flip_vert) {
-        dest += (width > height ? width * (height - 1) + offset
-                                : width * (height - offset - 1));
-      } else {
-        dest += (width > height ? offset : width * offset);
-      }
-    } else {
-      if (flip_vert) {
-        dest += (width > height ? width * height - offset - 1
-                                : width * (height - offset) - 1);
-      } else {
-        dest +=
-            (width > height ? width - offset - 1 : width * (offset + 1) - 1);
-      }
-    }
-  } else {
-    NOTREACHED();
-  }
-
-  // Copy pixels.
-  for (int row = 0; row < num_rows; ++row) {
-    const uint8_t* src_ptr = src;
-    uint8_t* dest_ptr = dest;
-    for (int col = 0; col < num_cols; ++col) {
-      *dest_ptr = *src_ptr++;
-      dest_ptr += dest_col_step;
-    }
-    src += src_stride;
-    dest += dest_row_step;
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/video_util.h b/cobalt/media/base/video_util.h
deleted file mode 100644
index dc2ad9f..0000000
--- a/cobalt/media/base/video_util.h
+++ /dev/null
@@ -1,114 +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 COBALT_MEDIA_BASE_VIDEO_UTIL_H_
-#define COBALT_MEDIA_BASE_VIDEO_UTIL_H_
-
-#include "base/memory/ref_counted.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class VideoFrame;
-
-// Computes the size of |visible_size| for a given aspect ratio.
-MEDIA_EXPORT math::Size GetNaturalSize(const math::Size& visible_size,
-                                       int aspect_ratio_numerator,
-                                       int aspect_ratio_denominator);
-
-// Fills |frame| containing YUV data to the given color values.
-MEDIA_EXPORT void FillYUV(VideoFrame* frame, uint8_t y, uint8_t u, uint8_t v);
-
-// Fills |frame| containing YUVA data with the given color values.
-MEDIA_EXPORT void FillYUVA(VideoFrame* frame, uint8_t y, uint8_t u, uint8_t v,
-                           uint8_t a);
-
-// Creates a border in |frame| such that all pixels outside of
-// |view_area| are black. The size and position of |view_area|
-// must be even to align correctly with the color planes.
-// Only YV12 format video frames are currently supported.
-MEDIA_EXPORT void LetterboxYUV(VideoFrame* frame, const math::Rect& view_area);
-
-// Rotates |src| plane by |rotation| degree with possible flipping vertically
-// and horizontally.
-// |rotation| is limited to {0, 90, 180, 270}.
-// |width| and |height| are expected to be even numbers.
-// Both |src| and |dest| planes are packed and have same |width| and |height|.
-// When |width| != |height| and rotated by 90/270, only the maximum square
-// portion located in the center is rotated. For example, for width=640 and
-// height=480, the rotated area is 480x480 located from row 0 through 479 and
-// from column 80 through 559. The leftmost and rightmost 80 columns are
-// ignored for both |src| and |dest|.
-// The caller is responsible for blanking out the margin area.
-MEDIA_EXPORT void RotatePlaneByPixels(const uint8_t* src, uint8_t* dest,
-                                      int width, int height,
-                                      int rotation,  // Clockwise.
-                                      bool flip_vert, bool flip_horiz);
-
-// Return the largest centered rectangle with the same aspect ratio of |content|
-// that fits entirely inside of |bounds|.  If |content| is empty, its aspect
-// ratio would be undefined; and in this case an empty Rect would be returned.
-MEDIA_EXPORT math::Rect ComputeLetterboxRegion(const math::Rect& bounds,
-                                               const math::Size& content);
-
-// Return a scaled |size| whose area is less than or equal to |target|, where
-// one of its dimensions is equal to |target|'s.  The aspect ratio of |size| is
-// preserved as closely as possible.  If |size| is empty, the result will be
-// empty.
-MEDIA_EXPORT math::Size ScaleSizeToFitWithinTarget(const math::Size& size,
-                                                   const math::Size& target);
-
-// Return a scaled |size| whose area is greater than or equal to |target|, where
-// one of its dimensions is equal to |target|'s.  The aspect ratio of |size| is
-// preserved as closely as possible.  If |size| is empty, the result will be
-// empty.
-MEDIA_EXPORT math::Size ScaleSizeToEncompassTarget(const math::Size& size,
-                                                   const math::Size& target);
-
-// Returns |size| with only one of its dimensions increased such that the result
-// matches the aspect ratio of |target|.  This is different from
-// ScaleSizeToEncompassTarget() in two ways: 1) The goal is to match the aspect
-// ratio of |target| rather than that of |size|.  2) Only one of the dimensions
-// of |size| may change, and it may only be increased (padded).  If either
-// |size| or |target| is empty, the result will be empty.
-MEDIA_EXPORT math::Size PadToMatchAspectRatio(const math::Size& size,
-                                              const math::Size& target);
-
-// Copy an RGB bitmap into the specified |region_in_frame| of a YUV video frame.
-// Fills the regions outside |region_in_frame| with black.
-MEDIA_EXPORT void CopyRGBToVideoFrame(const uint8_t* source, int stride,
-                                      const math::Rect& region_in_frame,
-                                      VideoFrame* frame);
-
-// Converts a frame with YV12A format into I420 by dropping alpha channel.
-MEDIA_EXPORT scoped_refptr<VideoFrame> WrapAsI420VideoFrame(
-    const scoped_refptr<VideoFrame>& frame);
-
-// Copy I420 video frame to match the required coded size and pad the region
-// outside the visible rect repeatedly with the last column / row up to the
-// coded size of |dst_frame|. Return false when |dst_frame| is empty or visible
-// rect is empty.
-// One application is content mirroring using HW encoder. As the required coded
-// size for encoder is unknown before capturing, memory copy is needed when the
-// coded size does not match the requirement. Padding can improve the encoding
-// efficiency in this case, as the encoder will encode the whole coded region.
-// Performance-wise, this function could be expensive as it does memory copy of
-// the whole visible rect.
-// Note:
-// 1. |src_frame| and |dst_frame| should have same size of visible rect.
-// 2. The visible rect's origin of |dst_frame| should be (0,0).
-// 3. |dst_frame|'s coded size (both width and height) should be larger than or
-// equal to the visible size, since the visible region in both frames should be
-// identical.
-MEDIA_EXPORT bool I420CopyWithPadding(const VideoFrame& src_frame,
-                                      VideoFrame* dst_frame) WARN_UNUSED_RESULT;
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_VIDEO_UTIL_H_
diff --git a/cobalt/media/base/video_util_unittest.cc b/cobalt/media/base/video_util_unittest.cc
deleted file mode 100644
index 1ba349d..0000000
--- a/cobalt/media/base/video_util_unittest.cc
+++ /dev/null
@@ -1,514 +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 "cobalt/media/base/video_util.h"
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/video_frame.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-// Initialize a plane's visible rect with value circularly from 0 to 255.
-void FillPlaneWithPattern(uint8_t* data, int stride,
-                          const math::Size& visible_size) {
-  DCHECK(data && visible_size.width() <= stride);
-
-  uint32_t val = 0;
-  uint8_t* src = data;
-  for (int i = 0; i < visible_size.height(); ++i, src += stride) {
-    for (int j = 0; j < visible_size.width(); ++j, ++val) src[j] = val & 0xff;
-  }
-}
-
-// Create a VideoFrame and initialize the visible rect using
-// |FillPlaneWithPattern()|. For testing purpose, the VideoFrame should be
-// filled with varying values, which is different from
-// |VideoFrame::CreateColorFrame()| where the entire VideoFrame is filled
-// with a given color.
-scoped_refptr<media::VideoFrame> CreateFrameWithPatternFilled(
-    media::VideoPixelFormat format, const math::Size& coded_size,
-    const math::Rect& visible_rect, const math::Size& natural_size,
-    base::TimeDelta timestamp) {
-  scoped_refptr<media::VideoFrame> frame(media::VideoFrame::CreateFrame(
-      format, coded_size, visible_rect, natural_size, timestamp));
-
-  FillPlaneWithPattern(frame->data(media::VideoFrame::kYPlane),
-                       frame->stride(media::VideoFrame::kYPlane),
-                       frame->visible_rect().size());
-  FillPlaneWithPattern(
-      frame->data(media::VideoFrame::kUPlane),
-      frame->stride(media::VideoFrame::kUPlane),
-      media::VideoFrame::PlaneSize(format, media::VideoFrame::kUPlane,
-                                   frame->visible_rect().size()));
-  FillPlaneWithPattern(
-      frame->data(media::VideoFrame::kVPlane),
-      frame->stride(media::VideoFrame::kVPlane),
-      media::VideoFrame::PlaneSize(format, media::VideoFrame::kVPlane,
-                                   frame->visible_rect().size()));
-  return frame;
-}
-
-// Helper function used to verify the data in the coded region after copying the
-// visible region and padding the remaining area.
-bool VerifyPlanCopyWithPadding(const uint8_t* src, size_t src_stride,
-                               // Size of visible region.
-                               const math::Size& src_size, const uint8_t* dst,
-                               size_t dst_stride,
-                               // Coded size of |dst|.
-                               const math::Size& dst_size) {
-  if (!src || !dst) return false;
-
-  const size_t src_width = src_size.width();
-  const size_t src_height = src_size.height();
-  const size_t dst_width = dst_size.width();
-  const size_t dst_height = dst_size.height();
-  if (src_width > dst_width || src_width > src_stride ||
-      src_height > dst_height || src_size.IsEmpty() || dst_size.IsEmpty())
-    return false;
-
-  const uint8_t *src_ptr = src, *dst_ptr = dst;
-  for (size_t i = 0; i < src_height;
-       ++i, src_ptr += src_stride, dst_ptr += dst_stride) {
-    if (memcmp(src_ptr, dst_ptr, src_width)) return false;
-    for (size_t j = src_width; j < dst_width; ++j) {
-      if (src_ptr[src_width - 1] != dst_ptr[j]) return false;
-    }
-  }
-  if (src_height < dst_height) {
-    src_ptr = dst + (src_height - 1) * dst_stride;
-    if (memcmp(src_ptr, dst_ptr, dst_width)) return false;
-  }
-  return true;
-}
-
-bool VerifyCopyWithPadding(const media::VideoFrame& src_frame,
-                           const media::VideoFrame& dst_frame) {
-  if (!src_frame.IsMappable() || !dst_frame.IsMappable() ||
-      src_frame.visible_rect().size() != dst_frame.visible_rect().size())
-    return false;
-
-  if (!VerifyPlanCopyWithPadding(
-          src_frame.visible_data(media::VideoFrame::kYPlane),
-          src_frame.stride(media::VideoFrame::kYPlane),
-          src_frame.visible_rect().size(),
-          dst_frame.data(media::VideoFrame::kYPlane),
-          dst_frame.stride(media::VideoFrame::kYPlane), dst_frame.coded_size()))
-    return false;
-  if (!VerifyPlanCopyWithPadding(
-          src_frame.visible_data(media::VideoFrame::kUPlane),
-          src_frame.stride(media::VideoFrame::kUPlane),
-          media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
-                                       media::VideoFrame::kUPlane,
-                                       src_frame.visible_rect().size()),
-          dst_frame.data(media::VideoFrame::kUPlane),
-          dst_frame.stride(media::VideoFrame::kUPlane),
-          media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
-                                       media::VideoFrame::kUPlane,
-                                       dst_frame.coded_size())))
-    return false;
-  if (!VerifyPlanCopyWithPadding(
-          src_frame.visible_data(media::VideoFrame::kVPlane),
-          src_frame.stride(media::VideoFrame::kVPlane),
-          media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
-                                       media::VideoFrame::kVPlane,
-                                       src_frame.visible_rect().size()),
-          dst_frame.data(media::VideoFrame::kVPlane),
-          dst_frame.stride(media::VideoFrame::kVPlane),
-          media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
-                                       media::VideoFrame::kVPlane,
-                                       dst_frame.coded_size())))
-    return false;
-
-  return true;
-}
-
-}  // namespace
-
-namespace cobalt {
-namespace media {
-
-class VideoUtilTest : public testing::Test {
- public:
-  VideoUtilTest() : height_(0), y_stride_(0), u_stride_(0), v_stride_(0) {}
-
-  ~VideoUtilTest() override {}
-
-  void CreateSourceFrame(int width, int height, int y_stride, int u_stride,
-                         int v_stride) {
-    EXPECT_GE(y_stride, width);
-    EXPECT_GE(u_stride, width / 2);
-    EXPECT_GE(v_stride, width / 2);
-
-    height_ = height;
-    y_stride_ = y_stride;
-    u_stride_ = u_stride;
-    v_stride_ = v_stride;
-
-    y_plane_.reset(new uint8_t[y_stride * height]);
-    u_plane_.reset(new uint8_t[u_stride * height / 2]);
-    v_plane_.reset(new uint8_t[v_stride * height / 2]);
-  }
-
-  void CreateDestinationFrame(int width, int height) {
-    math::Size size(width, height);
-    destination_frame_ = VideoFrame::CreateFrame(
-        PIXEL_FORMAT_YV12, size, math::Rect(size), size, base::TimeDelta());
-  }
-
- private:
-  std::unique_ptr<uint8_t[]> y_plane_;
-  std::unique_ptr<uint8_t[]> u_plane_;
-  std::unique_ptr<uint8_t[]> v_plane_;
-
-  int height_;
-  int y_stride_;
-  int u_stride_;
-  int v_stride_;
-
-  scoped_refptr<VideoFrame> destination_frame_;
-
-  DISALLOW_COPY_AND_ASSIGN(VideoUtilTest);
-};
-
-TEST_F(VideoUtilTest, GetNaturalSize) {
-  math::Size visible_size(320, 240);
-
-  // Test 0 sizes.
-  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(math::Size(0, 0), 1, 1));
-  EXPECT_EQ(math::Size(0, 1), GetNaturalSize(math::Size(0, 1), 1, 1));
-  EXPECT_EQ(math::Size(1, 0), GetNaturalSize(math::Size(1, 0), 1, 1));
-
-  // Test abnormal ratios.
-  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(visible_size, 0, 0));
-  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(visible_size, 1, 0));
-  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(visible_size, 1, -1));
-  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(visible_size, -1, 1));
-
-  // Test normal sizes and ratios.
-  EXPECT_EQ(math::Size(0, 240), GetNaturalSize(visible_size, 0, 1));
-  EXPECT_EQ(math::Size(320, 240), GetNaturalSize(visible_size, 1, 1));
-  EXPECT_EQ(math::Size(640, 240), GetNaturalSize(visible_size, 2, 1));
-  EXPECT_EQ(math::Size(160, 240), GetNaturalSize(visible_size, 1, 2));
-  EXPECT_EQ(math::Size(427, 240), GetNaturalSize(visible_size, 4, 3));
-  EXPECT_EQ(math::Size(240, 240), GetNaturalSize(visible_size, 3, 4));
-  EXPECT_EQ(math::Size(569, 240), GetNaturalSize(visible_size, 16, 9));
-  EXPECT_EQ(math::Size(180, 240), GetNaturalSize(visible_size, 9, 16));
-
-  // Test some random ratios.
-  EXPECT_EQ(math::Size(495, 240), GetNaturalSize(visible_size, 17, 11));
-  EXPECT_EQ(math::Size(207, 240), GetNaturalSize(visible_size, 11, 17));
-}
-
-namespace {
-
-uint8_t src6x4[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11,
-                    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23};
-
-// Target images, name pattern target_rotation_flipV_flipH.
-uint8_t* target6x4_0_n_n = src6x4;
-
-uint8_t target6x4_0_n_y[] = {5,  4,  3,  2,  1,  0,  11, 10, 9,  8,  7,  6,
-                             17, 16, 15, 14, 13, 12, 23, 22, 21, 20, 19, 18};
-
-uint8_t target6x4_0_y_n[] = {18, 19, 20, 21, 22, 23, 12, 13, 14, 15, 16, 17,
-                             6,  7,  8,  9,  10, 11, 0,  1,  2,  3,  4,  5};
-
-uint8_t target6x4_0_y_y[] = {23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12,
-                             11, 10, 9,  8,  7,  6,  5,  4,  3,  2,  1,  0};
-
-uint8_t target6x4_90_n_n[] = {255, 19, 13, 7, 1, 255, 255, 20, 14, 8,  2, 255,
-                              255, 21, 15, 9, 3, 255, 255, 22, 16, 10, 4, 255};
-
-uint8_t target6x4_90_n_y[] = {255, 1, 7, 13, 19, 255, 255, 2, 8,  14, 20, 255,
-                              255, 3, 9, 15, 21, 255, 255, 4, 10, 16, 22, 255};
-
-uint8_t target6x4_90_y_n[] = {255, 22, 16, 10, 4, 255, 255, 21, 15, 9, 3, 255,
-                              255, 20, 14, 8,  2, 255, 255, 19, 13, 7, 1, 255};
-
-uint8_t target6x4_90_y_y[] = {255, 4, 10, 16, 22, 255, 255, 3, 9, 15, 21, 255,
-                              255, 2, 8,  14, 20, 255, 255, 1, 7, 13, 19, 255};
-
-uint8_t* target6x4_180_n_n = target6x4_0_y_y;
-uint8_t* target6x4_180_n_y = target6x4_0_y_n;
-uint8_t* target6x4_180_y_n = target6x4_0_n_y;
-uint8_t* target6x4_180_y_y = target6x4_0_n_n;
-
-uint8_t* target6x4_270_n_n = target6x4_90_y_y;
-uint8_t* target6x4_270_n_y = target6x4_90_y_n;
-uint8_t* target6x4_270_y_n = target6x4_90_n_y;
-uint8_t* target6x4_270_y_y = target6x4_90_n_n;
-
-uint8_t src4x6[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11,
-                    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23};
-
-uint8_t* target4x6_0_n_n = src4x6;
-
-uint8_t target4x6_0_n_y[] = {3,  2,  1,  0,  7,  6,  5,  4,  11, 10, 9,  8,
-                             15, 14, 13, 12, 19, 18, 17, 16, 23, 22, 21, 20};
-
-uint8_t target4x6_0_y_n[] = {20, 21, 22, 23, 16, 17, 18, 19, 12, 13, 14, 15,
-                             8,  9,  10, 11, 4,  5,  6,  7,  0,  1,  2,  3};
-
-uint8_t target4x6_0_y_y[] = {23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12,
-                             11, 10, 9,  8,  7,  6,  5,  4,  3,  2,  1,  0};
-
-uint8_t target4x6_90_n_n[] = {255, 255, 255, 255, 16,  12,  8,   4,
-                              17,  13,  9,   5,   18,  14,  10,  6,
-                              19,  15,  11,  7,   255, 255, 255, 255};
-
-uint8_t target4x6_90_n_y[] = {255, 255, 255, 255, 4,   8,   12,  16,
-                              5,   9,   13,  17,  6,   10,  14,  18,
-                              7,   11,  15,  19,  255, 255, 255, 255};
-
-uint8_t target4x6_90_y_n[] = {255, 255, 255, 255, 19,  15,  11,  7,
-                              18,  14,  10,  6,   17,  13,  9,   5,
-                              16,  12,  8,   4,   255, 255, 255, 255};
-
-uint8_t target4x6_90_y_y[] = {255, 255, 255, 255, 7,   11,  15,  19,
-                              6,   10,  14,  18,  5,   9,   13,  17,
-                              4,   8,   12,  16,  255, 255, 255, 255};
-
-uint8_t* target4x6_180_n_n = target4x6_0_y_y;
-uint8_t* target4x6_180_n_y = target4x6_0_y_n;
-uint8_t* target4x6_180_y_n = target4x6_0_n_y;
-uint8_t* target4x6_180_y_y = target4x6_0_n_n;
-
-uint8_t* target4x6_270_n_n = target4x6_90_y_y;
-uint8_t* target4x6_270_n_y = target4x6_90_y_n;
-uint8_t* target4x6_270_y_n = target4x6_90_n_y;
-uint8_t* target4x6_270_y_y = target4x6_90_n_n;
-
-struct VideoRotationTestData {
-  uint8_t* src;
-  uint8_t* target;
-  int width;
-  int height;
-  int rotation;
-  bool flip_vert;
-  bool flip_horiz;
-};
-
-const VideoRotationTestData kVideoRotationTestData[] = {
-    {src6x4, target6x4_0_n_n, 6, 4, 0, false, false},
-    {src6x4, target6x4_0_n_y, 6, 4, 0, false, true},
-    {src6x4, target6x4_0_y_n, 6, 4, 0, true, false},
-    {src6x4, target6x4_0_y_y, 6, 4, 0, true, true},
-
-    {src6x4, target6x4_90_n_n, 6, 4, 90, false, false},
-    {src6x4, target6x4_90_n_y, 6, 4, 90, false, true},
-    {src6x4, target6x4_90_y_n, 6, 4, 90, true, false},
-    {src6x4, target6x4_90_y_y, 6, 4, 90, true, true},
-
-    {src6x4, target6x4_180_n_n, 6, 4, 180, false, false},
-    {src6x4, target6x4_180_n_y, 6, 4, 180, false, true},
-    {src6x4, target6x4_180_y_n, 6, 4, 180, true, false},
-    {src6x4, target6x4_180_y_y, 6, 4, 180, true, true},
-
-    {src6x4, target6x4_270_n_n, 6, 4, 270, false, false},
-    {src6x4, target6x4_270_n_y, 6, 4, 270, false, true},
-    {src6x4, target6x4_270_y_n, 6, 4, 270, true, false},
-    {src6x4, target6x4_270_y_y, 6, 4, 270, true, true},
-
-    {src4x6, target4x6_0_n_n, 4, 6, 0, false, false},
-    {src4x6, target4x6_0_n_y, 4, 6, 0, false, true},
-    {src4x6, target4x6_0_y_n, 4, 6, 0, true, false},
-    {src4x6, target4x6_0_y_y, 4, 6, 0, true, true},
-
-    {src4x6, target4x6_90_n_n, 4, 6, 90, false, false},
-    {src4x6, target4x6_90_n_y, 4, 6, 90, false, true},
-    {src4x6, target4x6_90_y_n, 4, 6, 90, true, false},
-    {src4x6, target4x6_90_y_y, 4, 6, 90, true, true},
-
-    {src4x6, target4x6_180_n_n, 4, 6, 180, false, false},
-    {src4x6, target4x6_180_n_y, 4, 6, 180, false, true},
-    {src4x6, target4x6_180_y_n, 4, 6, 180, true, false},
-    {src4x6, target4x6_180_y_y, 4, 6, 180, true, true},
-
-    {src4x6, target4x6_270_n_n, 4, 6, 270, false, false},
-    {src4x6, target4x6_270_n_y, 4, 6, 270, false, true},
-    {src4x6, target4x6_270_y_n, 4, 6, 270, true, false},
-    {src4x6, target4x6_270_y_y, 4, 6, 270, true, true}};
-
-}  // namespace
-
-class VideoUtilRotationTest
-    : public testing::TestWithParam<VideoRotationTestData> {
- public:
-  VideoUtilRotationTest() {
-    dest_.reset(new uint8_t[GetParam().width * GetParam().height]);
-  }
-
-  virtual ~VideoUtilRotationTest() {}
-
-  uint8_t* dest_plane() { return dest_.get(); }
-
- private:
-  std::unique_ptr<uint8_t[]> dest_;
-
-  DISALLOW_COPY_AND_ASSIGN(VideoUtilRotationTest);
-};
-
-TEST_P(VideoUtilRotationTest, Rotate) {
-  int rotation = GetParam().rotation;
-  EXPECT_TRUE((rotation >= 0) && (rotation < 360) && (rotation % 90 == 0));
-
-  int size = GetParam().width * GetParam().height;
-  uint8_t* dest = dest_plane();
-  memset(dest, 255, size);
-
-  RotatePlaneByPixels(GetParam().src, dest, GetParam().width, GetParam().height,
-                      rotation, GetParam().flip_vert, GetParam().flip_horiz);
-
-  EXPECT_EQ(memcmp(dest, GetParam().target, size), 0);
-}
-
-INSTANTIATE_TEST_CASE_P(, VideoUtilRotationTest,
-                        testing::ValuesIn(kVideoRotationTestData));
-
-// Tests the ComputeLetterboxRegion function.  Also, because of shared code
-// internally, this also tests ScaleSizeToFitWithinTarget().
-TEST_F(VideoUtilTest, ComputeLetterboxRegion) {
-  EXPECT_EQ(math::Rect(166, 0, 667, 500),
-            ComputeLetterboxRegion(math::Rect(0, 0, 1000, 500),
-                                   math::Size(640, 480)));
-  EXPECT_EQ(math::Rect(0, 312, 500, 375),
-            ComputeLetterboxRegion(math::Rect(0, 0, 500, 1000),
-                                   math::Size(640, 480)));
-  EXPECT_EQ(math::Rect(55, 0, 889, 500),
-            ComputeLetterboxRegion(math::Rect(0, 0, 1000, 500),
-                                   math::Size(1920, 1080)));
-  EXPECT_EQ(
-      math::Rect(0, 12, 100, 75),
-      ComputeLetterboxRegion(math::Rect(0, 0, 100, 100), math::Size(400, 300)));
-  EXPECT_EQ(math::Rect(0, 250000000, 2000000000, 1500000000),
-            ComputeLetterboxRegion(math::Rect(0, 0, 2000000000, 2000000000),
-                                   math::Size(40000, 30000)));
-  EXPECT_TRUE(ComputeLetterboxRegion(math::Rect(0, 0, 2000000000, 2000000000),
-                                     math::Size(0, 0))
-                  .IsEmpty());
-}
-
-TEST_F(VideoUtilTest, ScaleSizeToEncompassTarget) {
-  EXPECT_EQ(
-      math::Size(1000, 750),
-      ScaleSizeToEncompassTarget(math::Size(640, 480), math::Size(1000, 500)));
-  EXPECT_EQ(
-      math::Size(1333, 1000),
-      ScaleSizeToEncompassTarget(math::Size(640, 480), math::Size(500, 1000)));
-  EXPECT_EQ(math::Size(1000, 563),
-            ScaleSizeToEncompassTarget(math::Size(1920, 1080),
-                                       math::Size(1000, 500)));
-  EXPECT_EQ(
-      math::Size(133, 100),
-      ScaleSizeToEncompassTarget(math::Size(400, 300), math::Size(100, 100)));
-  EXPECT_EQ(math::Size(266666667, 200000000),
-            ScaleSizeToEncompassTarget(math::Size(40000, 30000),
-                                       math::Size(200000000, 200000000)));
-  EXPECT_TRUE(ScaleSizeToEncompassTarget(math::Size(0, 0),
-                                         math::Size(2000000000, 2000000000))
-                  .IsEmpty());
-}
-
-TEST_F(VideoUtilTest, PadToMatchAspectRatio) {
-  EXPECT_EQ(math::Size(640, 480),
-            PadToMatchAspectRatio(math::Size(640, 480), math::Size(640, 480)));
-  EXPECT_EQ(math::Size(640, 480),
-            PadToMatchAspectRatio(math::Size(640, 480), math::Size(4, 3)));
-  EXPECT_EQ(math::Size(960, 480),
-            PadToMatchAspectRatio(math::Size(640, 480), math::Size(1000, 500)));
-  EXPECT_EQ(math::Size(640, 1280),
-            PadToMatchAspectRatio(math::Size(640, 480), math::Size(500, 1000)));
-  EXPECT_EQ(
-      math::Size(2160, 1080),
-      PadToMatchAspectRatio(math::Size(1920, 1080), math::Size(1000, 500)));
-  EXPECT_EQ(math::Size(400, 400),
-            PadToMatchAspectRatio(math::Size(400, 300), math::Size(100, 100)));
-  EXPECT_EQ(math::Size(400, 400),
-            PadToMatchAspectRatio(math::Size(300, 400), math::Size(100, 100)));
-  EXPECT_EQ(math::Size(40000, 40000),
-            PadToMatchAspectRatio(math::Size(40000, 30000),
-                                  math::Size(2000000000, 2000000000)));
-  EXPECT_TRUE(PadToMatchAspectRatio(math::Size(40000, 30000), math::Size(0, 0))
-                  .IsEmpty());
-}
-
-TEST_F(VideoUtilTest, LetterboxYUV) {
-  int width = 40;
-  int height = 30;
-  math::Size size(width, height);
-  scoped_refptr<VideoFrame> frame(VideoFrame::CreateFrame(
-      PIXEL_FORMAT_YV12, size, math::Rect(size), size, base::TimeDelta()));
-
-  for (int left_margin = 0; left_margin <= 10; left_margin += 10) {
-    for (int right_margin = 0; right_margin <= 10; right_margin += 10) {
-      for (int top_margin = 0; top_margin <= 10; top_margin += 10) {
-        for (int bottom_margin = 0; bottom_margin <= 10; bottom_margin += 10) {
-          math::Rect view_area(left_margin, top_margin,
-                               width - left_margin - right_margin,
-                               height - top_margin - bottom_margin);
-          FillYUV(frame.get(), 0x1, 0x2, 0x3);
-          LetterboxYUV(frame.get(), view_area);
-          for (int x = 0; x < width; x++) {
-            for (int y = 0; y < height; y++) {
-              bool inside =
-                  x >= view_area.x() && x < view_area.x() + view_area.width() &&
-                  y >= view_area.y() && y < view_area.y() + view_area.height();
-              EXPECT_EQ(frame->data(VideoFrame::kYPlane)
-                            [y * frame->stride(VideoFrame::kYPlane) + x],
-                        inside ? 0x01 : 0x00);
-              EXPECT_EQ(
-                  frame->data(VideoFrame::kUPlane)
-                      [(y / 2) * frame->stride(VideoFrame::kUPlane) + (x / 2)],
-                  inside ? 0x02 : 0x80);
-              EXPECT_EQ(
-                  frame->data(VideoFrame::kVPlane)
-                      [(y / 2) * frame->stride(VideoFrame::kVPlane) + (x / 2)],
-                  inside ? 0x03 : 0x80);
-            }
-          }
-        }
-      }
-    }
-  }
-}
-
-TEST_F(VideoUtilTest, I420CopyWithPadding) {
-  math::Size visible_size(40, 30);
-  scoped_refptr<VideoFrame> src_frame = CreateFrameWithPatternFilled(
-      PIXEL_FORMAT_I420, visible_size, math::Rect(visible_size), visible_size,
-      base::TimeDelta());
-  // Expect to return false when copying to an empty buffer.
-  EXPECT_FALSE(I420CopyWithPadding(*src_frame, NULL));
-
-  scoped_refptr<VideoFrame> dst_frame = CreateFrameWithPatternFilled(
-      PIXEL_FORMAT_I420, visible_size, math::Rect(visible_size), visible_size,
-      base::TimeDelta());
-  EXPECT_TRUE(I420CopyWithPadding(*src_frame, dst_frame.get()));
-  EXPECT_TRUE(VerifyCopyWithPadding(*src_frame, *dst_frame));
-
-  math::Size coded_size(60, 40);
-  dst_frame = CreateFrameWithPatternFilled(PIXEL_FORMAT_I420, coded_size,
-                                           math::Rect(visible_size), coded_size,
-                                           base::TimeDelta());
-  EXPECT_TRUE(I420CopyWithPadding(*src_frame, dst_frame.get()));
-  EXPECT_TRUE(VerifyCopyWithPadding(*src_frame, *dst_frame));
-
-  math::Size odd_size(39, 31);
-  src_frame = CreateFrameWithPatternFilled(PIXEL_FORMAT_I420, odd_size,
-                                           math::Rect(odd_size), odd_size,
-                                           base::TimeDelta());
-  dst_frame = CreateFrameWithPatternFilled(PIXEL_FORMAT_I420, coded_size,
-                                           math::Rect(odd_size), coded_size,
-                                           base::TimeDelta());
-  EXPECT_TRUE(I420CopyWithPadding(*src_frame, dst_frame.get()));
-  EXPECT_TRUE(VerifyCopyWithPadding(*src_frame, *dst_frame));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/wall_clock_time_source.cc b/cobalt/media/base/wall_clock_time_source.cc
deleted file mode 100644
index 2f4031e..0000000
--- a/cobalt/media/base/wall_clock_time_source.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 "cobalt/media/base/wall_clock_time_source.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-WallClockTimeSource::WallClockTimeSource()
-    : tick_clock_(&default_tick_clock_), ticking_(false), playback_rate_(1.0) {}
-
-WallClockTimeSource::~WallClockTimeSource() {}
-
-void WallClockTimeSource::StartTicking() {
-  DVLOG(1) << __func__;
-  base::AutoLock auto_lock(lock_);
-  DCHECK(!ticking_);
-  ticking_ = true;
-  reference_time_ = tick_clock_->NowTicks();
-}
-
-void WallClockTimeSource::StopTicking() {
-  DVLOG(1) << __func__;
-  base::AutoLock auto_lock(lock_);
-  DCHECK(ticking_);
-  base_timestamp_ = CurrentMediaTime_Locked();
-  ticking_ = false;
-  reference_time_ = tick_clock_->NowTicks();
-}
-
-void WallClockTimeSource::SetPlaybackRate(double playback_rate) {
-  DVLOG(1) << __func__ << "(" << playback_rate << ")";
-  base::AutoLock auto_lock(lock_);
-  // Estimate current media time using old rate to use as a new base time for
-  // the new rate.
-  if (ticking_) {
-    base_timestamp_ = CurrentMediaTime_Locked();
-    reference_time_ = tick_clock_->NowTicks();
-  }
-
-  playback_rate_ = playback_rate;
-}
-
-void WallClockTimeSource::SetMediaTime(base::TimeDelta time) {
-  DVLOG(1) << __func__ << "(" << time.InMicroseconds() << ")";
-  base::AutoLock auto_lock(lock_);
-  CHECK(!ticking_);
-  base_timestamp_ = time;
-  reference_time_ = base::TimeTicks();
-}
-
-base::TimeDelta WallClockTimeSource::CurrentMediaTime() {
-  base::AutoLock auto_lock(lock_);
-  return CurrentMediaTime_Locked();
-}
-
-bool WallClockTimeSource::GetWallClockTimes(
-    const std::vector<base::TimeDelta>& media_timestamps,
-    std::vector<base::TimeTicks>* wall_clock_times) {
-  base::AutoLock auto_lock(lock_);
-  DCHECK(wall_clock_times->empty());
-
-  if (media_timestamps.empty()) {
-    wall_clock_times->push_back(reference_time_);
-  } else {
-    // When playback is paused (rate is zero), assume a rate of 1.0.
-    const double playback_rate = playback_rate_ ? playback_rate_ : 1.0;
-
-    wall_clock_times->reserve(media_timestamps.size());
-    for (const auto& media_timestamp : media_timestamps) {
-      wall_clock_times->push_back(reference_time_ +
-                                  (media_timestamp - base_timestamp_) /
-                                      playback_rate);
-    }
-  }
-
-  return playback_rate_ && ticking_;
-}
-
-base::TimeDelta WallClockTimeSource::CurrentMediaTime_Locked() {
-  lock_.AssertAcquired();
-  if (!ticking_ || !playback_rate_) return base_timestamp_;
-
-  base::TimeTicks now = tick_clock_->NowTicks();
-  return base_timestamp_ +
-         base::TimeDelta::FromMicroseconds(
-             (now - reference_time_).InMicroseconds() * playback_rate_);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/wall_clock_time_source.h b/cobalt/media/base/wall_clock_time_source.h
deleted file mode 100644
index 79dcfcc..0000000
--- a/cobalt/media/base/wall_clock_time_source.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 COBALT_MEDIA_BASE_WALL_CLOCK_TIME_SOURCE_H_
-#define COBALT_MEDIA_BASE_WALL_CLOCK_TIME_SOURCE_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/default_tick_clock.h"
-#include "base/synchronization/lock.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/time_source.h"
-
-namespace cobalt {
-namespace media {
-
-// A time source that uses interpolation based on the system clock.
-class MEDIA_EXPORT WallClockTimeSource : public TimeSource {
- public:
-  WallClockTimeSource();
-  ~WallClockTimeSource() override;
-
-  // TimeSource implementation.
-  void StartTicking() override;
-  void StopTicking() override;
-  void SetPlaybackRate(double playback_rate) override;
-  void SetMediaTime(base::TimeDelta time) override;
-  base::TimeDelta CurrentMediaTime() override;
-  bool GetWallClockTimes(
-      const std::vector<base::TimeDelta>& media_timestamps,
-      std::vector<base::TimeTicks>* wall_clock_times) override;
-
-  void set_tick_clock_for_testing(base::TickClock* tick_clock) {
-    tick_clock_ = tick_clock;
-  }
-
- private:
-  base::TimeDelta CurrentMediaTime_Locked();
-
-  // Allow for an injectable tick clock for testing.
-  base::DefaultTickClock default_tick_clock_;
-
-  // If specified, used instead of |default_tick_clock_|.
-  base::TickClock* tick_clock_;
-
-  bool ticking_;
-
-  // While ticking we can interpolate the current media time by measuring the
-  // delta between our reference ticks and the current system ticks and scaling
-  // that time by the playback rate.
-  double playback_rate_;
-  base::TimeDelta base_timestamp_;
-  base::TimeTicks reference_time_;
-
-  // TODO(scherkus): Remove internal locking from this class after access to
-  // Renderer::CurrentMediaTime() is single threaded http://crbug.com/370634
-  base::Lock lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(WallClockTimeSource);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_WALL_CLOCK_TIME_SOURCE_H_
diff --git a/cobalt/media/base/wall_clock_time_source_unittest.cc b/cobalt/media/base/wall_clock_time_source_unittest.cc
deleted file mode 100644
index b3cb016..0000000
--- a/cobalt/media/base/wall_clock_time_source_unittest.cc
+++ /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.
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "cobalt/media/base/wall_clock_time_source.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class WallClockTimeSourceTest : public testing::Test {
- public:
-  WallClockTimeSourceTest() : tick_clock_(new base::SimpleTestTickClock()) {
-    time_source_.set_tick_clock_for_testing(tick_clock_.get());
-    AdvanceTimeInSeconds(1);
-  }
-  ~WallClockTimeSourceTest() override {}
-
-  void AdvanceTimeInSeconds(int seconds) {
-    tick_clock_->Advance(base::TimeDelta::FromSeconds(seconds));
-  }
-
-  int CurrentMediaTimeInSeconds() {
-    return time_source_.CurrentMediaTime().InSeconds();
-  }
-
-  void SetMediaTimeInSeconds(int seconds) {
-    return time_source_.SetMediaTime(base::TimeDelta::FromSeconds(seconds));
-  }
-
-  base::TimeTicks ConvertMediaTime(base::TimeDelta timestamp,
-                                   bool* is_time_moving) {
-    std::vector<base::TimeTicks> wall_clock_times;
-    *is_time_moving = time_source_.GetWallClockTimes(
-        std::vector<base::TimeDelta>(1, timestamp), &wall_clock_times);
-    return wall_clock_times[0];
-  }
-
-  bool IsWallClockNowForMediaTimeInSeconds(int seconds) {
-    bool is_time_moving = false;
-    return tick_clock_->NowTicks() ==
-           ConvertMediaTime(base::TimeDelta::FromSeconds(seconds),
-                            &is_time_moving);
-  }
-
-  bool IsTimeStopped() {
-    bool is_time_moving = false;
-    // Convert any random value, it shouldn't matter for this call.
-    ConvertMediaTime(base::TimeDelta::FromSeconds(1), &is_time_moving);
-    return !is_time_moving;
-  }
-
- protected:
-  WallClockTimeSource time_source_;
-  std::unique_ptr<base::SimpleTestTickClock> tick_clock_;
-
-  DISALLOW_COPY_AND_ASSIGN(WallClockTimeSourceTest);
-};
-
-TEST_F(WallClockTimeSourceTest, InitialTimeIsZero) {
-  EXPECT_EQ(0, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsTimeStopped());
-}
-
-TEST_F(WallClockTimeSourceTest, InitialTimeIsNotTicking) {
-  EXPECT_EQ(0, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsTimeStopped());
-  AdvanceTimeInSeconds(100);
-  EXPECT_EQ(0, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsTimeStopped());
-}
-
-TEST_F(WallClockTimeSourceTest, InitialPlaybackRateIsOne) {
-  time_source_.StartTicking();
-
-  EXPECT_EQ(0, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(0));
-  AdvanceTimeInSeconds(100);
-  EXPECT_EQ(100, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(100));
-}
-
-TEST_F(WallClockTimeSourceTest, SetMediaTime) {
-  EXPECT_EQ(0, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsTimeStopped());
-  SetMediaTimeInSeconds(10);
-  EXPECT_EQ(10, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsTimeStopped());
-  std::vector<base::TimeTicks> wall_clock_times;
-  time_source_.GetWallClockTimes(std::vector<base::TimeDelta>(),
-                                 &wall_clock_times);
-  EXPECT_EQ(base::TimeTicks(), wall_clock_times[0]);
-}
-
-TEST_F(WallClockTimeSourceTest, SetPlaybackRate) {
-  time_source_.StartTicking();
-
-  time_source_.SetPlaybackRate(0.5);
-  EXPECT_EQ(0, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(0));
-  AdvanceTimeInSeconds(10);
-  EXPECT_EQ(5, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(5));
-
-  time_source_.SetPlaybackRate(2);
-  EXPECT_EQ(5, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(5));
-  AdvanceTimeInSeconds(10);
-  EXPECT_EQ(25, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(25));
-}
-
-TEST_F(WallClockTimeSourceTest, StopTicking) {
-  time_source_.StartTicking();
-
-  EXPECT_EQ(0, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(0));
-  AdvanceTimeInSeconds(10);
-  EXPECT_EQ(10, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsWallClockNowForMediaTimeInSeconds(10));
-
-  time_source_.StopTicking();
-
-  AdvanceTimeInSeconds(10);
-  EXPECT_EQ(10, CurrentMediaTimeInSeconds());
-  EXPECT_TRUE(IsTimeStopped());
-}
-
-TEST_F(WallClockTimeSourceTest, ConvertsTimestampsWhenStopped) {
-  const base::TimeDelta kOneSecond = base::TimeDelta::FromSeconds(1);
-  bool is_time_moving = false;
-  EXPECT_EQ(base::TimeTicks(),
-            ConvertMediaTime(base::TimeDelta(), &is_time_moving));
-  EXPECT_FALSE(is_time_moving);
-  EXPECT_NE(base::TimeTicks(), ConvertMediaTime(kOneSecond, &is_time_moving));
-  EXPECT_FALSE(is_time_moving);
-  time_source_.StartTicking();
-  time_source_.StopTicking();
-  EXPECT_EQ(tick_clock_->NowTicks(),
-            ConvertMediaTime(base::TimeDelta(), &is_time_moving));
-  EXPECT_FALSE(is_time_moving);
-  EXPECT_EQ(tick_clock_->NowTicks() + kOneSecond,
-            ConvertMediaTime(kOneSecond, &is_time_moving));
-  EXPECT_FALSE(is_time_moving);
-}
-
-TEST_F(WallClockTimeSourceTest, EmptyMediaTimestampsReturnMediaWallClockTime) {
-  std::vector<base::TimeTicks> wall_clock_times;
-  bool is_time_moving = time_source_.GetWallClockTimes(
-      std::vector<base::TimeDelta>(), &wall_clock_times);
-  EXPECT_FALSE(is_time_moving);
-  EXPECT_EQ(base::TimeTicks(), wall_clock_times[0]);
-
-  wall_clock_times.clear();
-  time_source_.StartTicking();
-  is_time_moving = time_source_.GetWallClockTimes(
-      std::vector<base::TimeDelta>(), &wall_clock_times);
-  EXPECT_TRUE(is_time_moving);
-  EXPECT_EQ(tick_clock_->NowTicks(), wall_clock_times[0]);
-
-  wall_clock_times.clear();
-  time_source_.StopTicking();
-  is_time_moving = time_source_.GetWallClockTimes(
-      std::vector<base::TimeDelta>(), &wall_clock_times);
-  EXPECT_FALSE(is_time_moving);
-  EXPECT_EQ(tick_clock_->NowTicks(), wall_clock_times[0]);
-
-  // Setting media time should clear reference time.
-  SetMediaTimeInSeconds(5);
-  wall_clock_times.clear();
-  is_time_moving = time_source_.GetWallClockTimes(
-      std::vector<base::TimeDelta>(), &wall_clock_times);
-  EXPECT_FALSE(is_time_moving);
-  EXPECT_EQ(base::TimeTicks(), wall_clock_times[0]);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/yuv_convert.cc b/cobalt/media/base/yuv_convert.cc
deleted file mode 100644
index 19cf9f4..0000000
--- a/cobalt/media/base/yuv_convert.cc
+++ /dev/null
@@ -1,637 +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 webpage shows layout of YV12 and other YUV formats
-// http://www.fourcc.org/yuv.php
-// The actual conversion is best described here
-// http://en.wikipedia.org/wiki/YUV
-// An article on optimizing YUV conversion using tables instead of multiplies
-// http://lestourtereaux.free.fr/papers/data/yuvrgb.pdf
-//
-// YV12 is a full plane of Y and a half height, half width chroma planes
-// YV16 is a full plane of Y and a full height, half width chroma planes
-//
-// ARGB pixel format is output, which on little endian is stored as BGRA.
-// The alpha is set to 255, allowing the application to use RGBA or RGB32.
-
-#include "cobalt/media/base/yuv_convert.h"
-
-#include <algorithm>
-
-#include "base/basictypes.h"
-#include "base/cpu.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/memory/aligned_memory.h"
-#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/simd/convert_rgb_to_yuv.h"
-#include "cobalt/media/base/simd/convert_yuv_to_rgb.h"
-#include "cobalt/media/base/simd/filter_yuv.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-#if defined(ARCH_CPU_X86_FAMILY)
-#if defined(COMPILER_MSVC)
-#include <intrin.h>
-#else
-#include <mmintrin.h>
-#endif
-#endif
-
-// Assembly functions are declared without namespace.
-extern "C" {
-void EmptyRegisterState_MMX();
-}  // extern "C"
-
-namespace cobalt {
-namespace media {
-
-typedef void (*FilterYUVRowsProc)(uint8_t*, const uint8_t*, const uint8_t*, int,
-                                  uint8_t);
-
-typedef void (*ConvertRGBToYUVProc)(const uint8_t*, uint8_t*, uint8_t*,
-                                    uint8_t*, int, int, int, int, int);
-
-typedef void (*ConvertYUVToRGB32Proc)(const uint8_t*, const uint8_t*,
-                                      const uint8_t*, uint8_t*, int, int, int,
-                                      int, int, YUVType);
-
-typedef void (*ConvertYUVAToARGBProc)(const uint8_t*, const uint8_t*,
-                                      const uint8_t*, const uint8_t*, uint8_t*,
-                                      int, int, int, int, int, int, YUVType);
-
-typedef void (*ConvertYUVToRGB32RowProc)(const uint8_t*, const uint8_t*,
-                                         const uint8_t*, uint8_t*, ptrdiff_t,
-                                         const int16_t*);
-
-typedef void (*ConvertYUVAToARGBRowProc)(const uint8_t*, const uint8_t*,
-                                         const uint8_t*, const uint8_t*,
-                                         uint8_t*, ptrdiff_t, const int16_t*);
-
-typedef void (*ScaleYUVToRGB32RowProc)(const uint8_t*, const uint8_t*,
-                                       const uint8_t*, uint8_t*, ptrdiff_t,
-                                       ptrdiff_t, const int16_t*);
-
-static FilterYUVRowsProc g_filter_yuv_rows_proc_ = NULL;
-static ConvertYUVToRGB32RowProc g_convert_yuv_to_rgb32_row_proc_ = NULL;
-static ScaleYUVToRGB32RowProc g_scale_yuv_to_rgb32_row_proc_ = NULL;
-static ScaleYUVToRGB32RowProc g_linear_scale_yuv_to_rgb32_row_proc_ = NULL;
-static ConvertRGBToYUVProc g_convert_rgb32_to_yuv_proc_ = NULL;
-static ConvertRGBToYUVProc g_convert_rgb24_to_yuv_proc_ = NULL;
-static ConvertYUVToRGB32Proc g_convert_yuv_to_rgb32_proc_ = NULL;
-static ConvertYUVAToARGBProc g_convert_yuva_to_argb_proc_ = NULL;
-
-static const int kYUVToRGBTableSize = 256 * 4 * 4 * sizeof(int16_t);
-
-// base::AlignedMemory has a private operator new(), so wrap it in a struct so
-// that we can put it in a LazyInstance::DestructorAtExit.
-struct YUVToRGBTableWrapper {
-  base::AlignedMemory<kYUVToRGBTableSize, 16> table;
-};
-
-typedef base::LazyInstance<YUVToRGBTableWrapper>::DestructorAtExit
-    YUVToRGBTable;
-static YUVToRGBTable g_table_rec601 = LAZY_INSTANCE_INITIALIZER;
-static YUVToRGBTable g_table_jpeg = LAZY_INSTANCE_INITIALIZER;
-static YUVToRGBTable g_table_rec709 = LAZY_INSTANCE_INITIALIZER;
-static const int16_t* g_table_rec601_ptr = NULL;
-static const int16_t* g_table_jpeg_ptr = NULL;
-static const int16_t* g_table_rec709_ptr = NULL;
-
-// Empty SIMD registers state after using them.
-void EmptyRegisterStateStub() {}
-#if defined(MEDIA_MMX_INTRINSICS_AVAILABLE)
-void EmptyRegisterStateIntrinsic() { _mm_empty(); }
-#endif
-typedef void (*EmptyRegisterStateProc)();
-static EmptyRegisterStateProc g_empty_register_state_proc_ = NULL;
-
-// Get the appropriate value to bitshift by for vertical indices.
-int GetVerticalShift(YUVType type) {
-  switch (type) {
-    case YV16:
-      return 0;
-    case YV12:
-    case YV12J:
-    case YV12HD:
-      return 1;
-  }
-  NOTREACHED();
-  return 0;
-}
-
-const int16_t* GetLookupTable(YUVType type) {
-  switch (type) {
-    case YV12:
-    case YV16:
-      return g_table_rec601_ptr;
-    case YV12J:
-      return g_table_jpeg_ptr;
-    case YV12HD:
-      return g_table_rec709_ptr;
-  }
-  NOTREACHED();
-  return NULL;
-}
-
-// Populates a pre-allocated lookup table from a YUV->RGB matrix.
-const int16_t* PopulateYUVToRGBTable(const double matrix[3][3], bool full_range,
-                                     int16_t* table) {
-  // We'll have 4 sub-tables that lie contiguous in memory, one for each of Y,
-  // U, V and A.
-  const int kNumTables = 4;
-  // Each table has 256 rows (for all possible 8-bit values).
-  const int kNumRows = 256;
-  // Each row has 4 columns, for contributions to each of R, G, B and A.
-  const int kNumColumns = 4;
-  // Each element is a fixed-point (10.6) 16-bit signed value.
-  const int kElementSize = sizeof(int16_t);
-
-  // Sanity check that our constants here match the size of the statically
-  // allocated tables.
-  static_assert(
-      kNumTables * kNumRows * kNumColumns * kElementSize == kYUVToRGBTableSize,
-      "YUV lookup table size doesn't match expectation.");
-
-  // Y needs an offset of -16 for color ranges that ignore the lower 16 values,
-  // U and V get -128 to put them in [-128, 127] from [0, 255].
-  int offsets[3] = {(full_range ? 0 : -16), -128, -128};
-
-  for (int i = 0; i < kNumRows; ++i) {
-    // Y, U, and V contributions to each of R, G, B and A.
-    for (int j = 0; j < 3; ++j) {
-#if defined(OS_ANDROID)
-      // Android is RGBA.
-      table[(j * kNumRows + i) * kNumColumns + 0] =
-          matrix[j][0] * 64 * (i + offsets[j]) + 0.5;
-      table[(j * kNumRows + i) * kNumColumns + 1] =
-          matrix[j][1] * 64 * (i + offsets[j]) + 0.5;
-      table[(j * kNumRows + i) * kNumColumns + 2] =
-          matrix[j][2] * 64 * (i + offsets[j]) + 0.5;
-#else
-      // Other platforms are BGRA.
-      table[(j * kNumRows + i) * kNumColumns + 0] =
-          matrix[j][2] * 64 * (i + offsets[j]) + 0.5;
-      table[(j * kNumRows + i) * kNumColumns + 1] =
-          matrix[j][1] * 64 * (i + offsets[j]) + 0.5;
-      table[(j * kNumRows + i) * kNumColumns + 2] =
-          matrix[j][0] * 64 * (i + offsets[j]) + 0.5;
-#endif
-      // Alpha contributions from Y and V are always 0. U is set such that
-      // all values result in a full '255' alpha value.
-      table[(j * kNumRows + i) * kNumColumns + 3] = (j == 1) ? 256 * 64 - 1 : 0;
-    }
-    // And YUVA alpha is passed through as-is.
-    for (int k = 0; k < kNumTables; ++k)
-      table[((kNumTables - 1) * kNumRows + i) * kNumColumns + k] = i;
-  }
-
-  return table;
-}
-
-void InitializeCPUSpecificYUVConversions() {
-  CHECK(!g_filter_yuv_rows_proc_);
-  CHECK(!g_convert_yuv_to_rgb32_row_proc_);
-  CHECK(!g_scale_yuv_to_rgb32_row_proc_);
-  CHECK(!g_linear_scale_yuv_to_rgb32_row_proc_);
-  CHECK(!g_convert_rgb32_to_yuv_proc_);
-  CHECK(!g_convert_rgb24_to_yuv_proc_);
-  CHECK(!g_convert_yuv_to_rgb32_proc_);
-  CHECK(!g_convert_yuva_to_argb_proc_);
-  CHECK(!g_empty_register_state_proc_);
-
-  g_filter_yuv_rows_proc_ = FilterYUVRows_C;
-  g_convert_yuv_to_rgb32_row_proc_ = ConvertYUVToRGB32Row_C;
-  g_scale_yuv_to_rgb32_row_proc_ = ScaleYUVToRGB32Row_C;
-  g_linear_scale_yuv_to_rgb32_row_proc_ = LinearScaleYUVToRGB32Row_C;
-  g_convert_rgb32_to_yuv_proc_ = ConvertRGB32ToYUV_C;
-  g_convert_rgb24_to_yuv_proc_ = ConvertRGB24ToYUV_C;
-  g_convert_yuv_to_rgb32_proc_ = ConvertYUVToRGB32_C;
-  g_convert_yuva_to_argb_proc_ = ConvertYUVAToARGB_C;
-  g_empty_register_state_proc_ = EmptyRegisterStateStub;
-
-// Assembly code confuses MemorySanitizer. Also not available in iOS builds.
-#if defined(ARCH_CPU_X86_FAMILY) && !defined(MEMORY_SANITIZER) && \
-    !defined(OS_IOS)
-  g_convert_yuva_to_argb_proc_ = ConvertYUVAToARGB_MMX;
-
-#if defined(MEDIA_MMX_INTRINSICS_AVAILABLE)
-  g_empty_register_state_proc_ = EmptyRegisterStateIntrinsic;
-#else
-  g_empty_register_state_proc_ = EmptyRegisterState_MMX;
-#endif
-
-  g_convert_yuv_to_rgb32_row_proc_ = ConvertYUVToRGB32Row_SSE;
-  g_convert_yuv_to_rgb32_proc_ = ConvertYUVToRGB32_SSE;
-
-  g_filter_yuv_rows_proc_ = FilterYUVRows_SSE2;
-  g_convert_rgb32_to_yuv_proc_ = ConvertRGB32ToYUV_SSE2;
-
-#if defined(ARCH_CPU_X86_64)
-  g_scale_yuv_to_rgb32_row_proc_ = ScaleYUVToRGB32Row_SSE2_X64;
-
-  // Technically this should be in the MMX section, but MSVC will optimize out
-  // the export of LinearScaleYUVToRGB32Row_MMX, which is required by the unit
-  // tests, if that decision can be made at compile time.  Since all X64 CPUs
-  // have SSE2, we can hack around this by making the selection here.
-  g_linear_scale_yuv_to_rgb32_row_proc_ = LinearScaleYUVToRGB32Row_MMX_X64;
-#else
-  g_scale_yuv_to_rgb32_row_proc_ = ScaleYUVToRGB32Row_SSE;
-  g_linear_scale_yuv_to_rgb32_row_proc_ = LinearScaleYUVToRGB32Row_SSE;
-#endif
-
-  base::CPU cpu;
-  if (cpu.has_ssse3()) {
-    g_convert_rgb24_to_yuv_proc_ = &ConvertRGB24ToYUV_SSSE3;
-
-    // TODO(hclam): Add ConvertRGB32ToYUV_SSSE3 when the cyan problem is solved.
-    // See: crbug.com/100462
-  }
-#endif
-
-  // Initialize YUV conversion lookup tables.
-
-  // SD Rec601 YUV->RGB matrix, see http://www.fourcc.org/fccyvrgb.php
-  const double kRec601ConvertMatrix[3][3] = {
-      {1.164, 1.164, 1.164}, {0.0, -0.391, 2.018}, {1.596, -0.813, 0.0},
-  };
-
-  // JPEG table, values from above link.
-  const double kJPEGConvertMatrix[3][3] = {
-      {1.0, 1.0, 1.0}, {0.0, -0.34414, 1.772}, {1.402, -0.71414, 0.0},
-  };
-
-  // Rec709 "HD" color space, values from:
-  // http://www.equasys.de/colorconversion.html
-  const double kRec709ConvertMatrix[3][3] = {
-      {1.164, 1.164, 1.164}, {0.0, -0.213, 2.112}, {1.793, -0.533, 0.0},
-  };
-
-  PopulateYUVToRGBTable(kRec601ConvertMatrix, false,
-                        g_table_rec601.Get().table.data_as<int16_t>());
-  PopulateYUVToRGBTable(kJPEGConvertMatrix, true,
-                        g_table_jpeg.Get().table.data_as<int16_t>());
-  PopulateYUVToRGBTable(kRec709ConvertMatrix, false,
-                        g_table_rec709.Get().table.data_as<int16_t>());
-  g_table_rec601_ptr = g_table_rec601.Get().table.data_as<int16_t>();
-  g_table_rec709_ptr = g_table_rec709.Get().table.data_as<int16_t>();
-  g_table_jpeg_ptr = g_table_jpeg.Get().table.data_as<int16_t>();
-}
-
-// Empty SIMD registers state after using them.
-void EmptyRegisterState() { g_empty_register_state_proc_(); }
-
-// 16.16 fixed point arithmetic
-const int kFractionBits = 16;
-const int kFractionMax = 1 << kFractionBits;
-const int kFractionMask = ((1 << kFractionBits) - 1);
-
-// Scale a frame of YUV to 32 bit ARGB.
-void ScaleYUVToRGB32(const uint8_t* y_buf, const uint8_t* u_buf,
-                     const uint8_t* v_buf, uint8_t* rgb_buf, int source_width,
-                     int source_height, int width, int height, int y_pitch,
-                     int uv_pitch, int rgb_pitch, YUVType yuv_type,
-                     Rotate view_rotate, ScaleFilter filter) {
-  // Handle zero sized sources and destinations.
-  if ((yuv_type == YV12 && (source_width < 2 || source_height < 2)) ||
-      (yuv_type == YV16 && (source_width < 2 || source_height < 1)) ||
-      width == 0 || height == 0)
-    return;
-
-  const int16_t* lookup_table = GetLookupTable(yuv_type);
-
-  // 4096 allows 3 buffers to fit in 12k.
-  // Helps performance on CPU with 16K L1 cache.
-  // Large enough for 3830x2160 and 30" displays which are 2560x1600.
-  const int kFilterBufferSize = 4096;
-  // Disable filtering if the screen is too big (to avoid buffer overflows).
-  // This should never happen to regular users: they don't have monitors
-  // wider than 4096 pixels.
-  // TODO(fbarchard): Allow rotated videos to filter.
-  if (source_width > kFilterBufferSize || view_rotate) filter = FILTER_NONE;
-
-  unsigned int y_shift = GetVerticalShift(yuv_type);
-  // Diagram showing origin and direction of source sampling.
-  // ->0   4<-
-  // 7       3
-  //
-  // 6       5
-  // ->1   2<-
-  // Rotations that start at right side of image.
-  if ((view_rotate == ROTATE_180) || (view_rotate == ROTATE_270) ||
-      (view_rotate == MIRROR_ROTATE_0) || (view_rotate == MIRROR_ROTATE_90)) {
-    y_buf += source_width - 1;
-    u_buf += source_width / 2 - 1;
-    v_buf += source_width / 2 - 1;
-    source_width = -source_width;
-  }
-  // Rotations that start at bottom of image.
-  if ((view_rotate == ROTATE_90) || (view_rotate == ROTATE_180) ||
-      (view_rotate == MIRROR_ROTATE_90) || (view_rotate == MIRROR_ROTATE_180)) {
-    y_buf += (source_height - 1) * y_pitch;
-    u_buf += ((source_height >> y_shift) - 1) * uv_pitch;
-    v_buf += ((source_height >> y_shift) - 1) * uv_pitch;
-    source_height = -source_height;
-  }
-
-  int source_dx = source_width * kFractionMax / width;
-
-  if ((view_rotate == ROTATE_90) || (view_rotate == ROTATE_270)) {
-    int tmp = height;
-    height = width;
-    width = tmp;
-    tmp = source_height;
-    source_height = source_width;
-    source_width = tmp;
-    int source_dy = source_height * kFractionMax / height;
-    source_dx = ((source_dy >> kFractionBits) * y_pitch) << kFractionBits;
-    if (view_rotate == ROTATE_90) {
-      y_pitch = -1;
-      uv_pitch = -1;
-      source_height = -source_height;
-    } else {
-      y_pitch = 1;
-      uv_pitch = 1;
-    }
-  }
-
-  // Need padding because FilterRows() will write 1 to 16 extra pixels
-  // after the end for SSE2 version.
-  uint8_t yuvbuf[16 + kFilterBufferSize * 3 + 16];
-  uint8_t* ybuf = reinterpret_cast<uint8_t*>(
-      reinterpret_cast<uintptr_t>(yuvbuf + 15) & ~15);
-  uint8_t* ubuf = ybuf + kFilterBufferSize;
-  uint8_t* vbuf = ubuf + kFilterBufferSize;
-
-  // TODO(fbarchard): Fixed point math is off by 1 on negatives.
-
-  // We take a y-coordinate in [0,1] space in the source image space, and
-  // transform to a y-coordinate in [0,1] space in the destination image space.
-  // Note that the coordinate endpoints lie on pixel boundaries, not on pixel
-  // centers: e.g. a two-pixel-high image will have pixel centers at 0.25 and
-  // 0.75.  The formula is as follows (in fixed-point arithmetic):
-  //   y_dst = dst_height * ((y_src + 0.5) / src_height)
-  //   dst_pixel = clamp([0, dst_height - 1], floor(y_dst - 0.5))
-  // Implement this here as an accumulator + delta, to avoid expensive math
-  // in the loop.
-  int source_y_subpixel_accum =
-      ((kFractionMax / 2) * source_height) / height - (kFractionMax / 2);
-  int source_y_subpixel_delta = ((1 << kFractionBits) * source_height) / height;
-
-  // TODO(fbarchard): Split this into separate function for better efficiency.
-  for (int y = 0; y < height; ++y) {
-    uint8_t* dest_pixel = rgb_buf + y * rgb_pitch;
-    int source_y_subpixel = source_y_subpixel_accum;
-    source_y_subpixel_accum += source_y_subpixel_delta;
-    if (source_y_subpixel < 0)
-      source_y_subpixel = 0;
-    else if (source_y_subpixel > ((source_height - 1) << kFractionBits))
-      source_y_subpixel = (source_height - 1) << kFractionBits;
-
-    const uint8_t* y_ptr = NULL;
-    const uint8_t* u_ptr = NULL;
-    const uint8_t* v_ptr = NULL;
-    // Apply vertical filtering if necessary.
-    // TODO(fbarchard): Remove memcpy when not necessary.
-    if (filter & media::FILTER_BILINEAR_V) {
-      int source_y = source_y_subpixel >> kFractionBits;
-      y_ptr = y_buf + source_y * y_pitch;
-      u_ptr = u_buf + (source_y >> y_shift) * uv_pitch;
-      v_ptr = v_buf + (source_y >> y_shift) * uv_pitch;
-
-      // Vertical scaler uses 16.8 fixed point.
-      uint8_t source_y_fraction = (source_y_subpixel & kFractionMask) >> 8;
-      if (source_y_fraction != 0) {
-        g_filter_yuv_rows_proc_(ybuf, y_ptr, y_ptr + y_pitch, source_width,
-                                source_y_fraction);
-      } else {
-        memcpy(ybuf, y_ptr, source_width);
-      }
-      y_ptr = ybuf;
-      ybuf[source_width] = ybuf[source_width - 1];
-
-      int uv_source_width = (source_width + 1) / 2;
-      uint8_t source_uv_fraction;
-
-      // For formats with half-height UV planes, each even-numbered pixel row
-      // should not interpolate, since the next row to interpolate from should
-      // be a duplicate of the current row.
-      if (y_shift && (source_y & 0x1) == 0)
-        source_uv_fraction = 0;
-      else
-        source_uv_fraction = source_y_fraction;
-
-      if (source_uv_fraction != 0) {
-        g_filter_yuv_rows_proc_(ubuf, u_ptr, u_ptr + uv_pitch, uv_source_width,
-                                source_uv_fraction);
-        g_filter_yuv_rows_proc_(vbuf, v_ptr, v_ptr + uv_pitch, uv_source_width,
-                                source_uv_fraction);
-      } else {
-        memcpy(ubuf, u_ptr, uv_source_width);
-        memcpy(vbuf, v_ptr, uv_source_width);
-      }
-      u_ptr = ubuf;
-      v_ptr = vbuf;
-      ubuf[uv_source_width] = ubuf[uv_source_width - 1];
-      vbuf[uv_source_width] = vbuf[uv_source_width - 1];
-    } else {
-      // Offset by 1/2 pixel for center sampling.
-      int source_y = (source_y_subpixel + (kFractionMax / 2)) >> kFractionBits;
-      y_ptr = y_buf + source_y * y_pitch;
-      u_ptr = u_buf + (source_y >> y_shift) * uv_pitch;
-      v_ptr = v_buf + (source_y >> y_shift) * uv_pitch;
-    }
-    if (source_dx == kFractionMax) {  // Not scaled
-      g_convert_yuv_to_rgb32_row_proc_(y_ptr, u_ptr, v_ptr, dest_pixel, width,
-                                       lookup_table);
-    } else {
-      if (filter & FILTER_BILINEAR_H) {
-        g_linear_scale_yuv_to_rgb32_row_proc_(y_ptr, u_ptr, v_ptr, dest_pixel,
-                                              width, source_dx, lookup_table);
-      } else {
-        g_scale_yuv_to_rgb32_row_proc_(y_ptr, u_ptr, v_ptr, dest_pixel, width,
-                                       source_dx, lookup_table);
-      }
-    }
-  }
-
-  g_empty_register_state_proc_();
-}
-
-// Scale a frame of YV12 to 32 bit ARGB for a specific rectangle.
-void ScaleYUVToRGB32WithRect(const uint8_t* y_buf, const uint8_t* u_buf,
-                             const uint8_t* v_buf, uint8_t* rgb_buf,
-                             int source_width, int source_height,
-                             int dest_width, int dest_height,
-                             int dest_rect_left, int dest_rect_top,
-                             int dest_rect_right, int dest_rect_bottom,
-                             int y_pitch, int uv_pitch, int rgb_pitch) {
-  // This routine doesn't currently support up-scaling.
-  CHECK_LE(dest_width, source_width);
-  CHECK_LE(dest_height, source_height);
-
-  // Sanity-check the destination rectangle.
-  DCHECK(dest_rect_left >= 0 && dest_rect_right <= dest_width);
-  DCHECK(dest_rect_top >= 0 && dest_rect_bottom <= dest_height);
-  DCHECK(dest_rect_right > dest_rect_left);
-  DCHECK(dest_rect_bottom > dest_rect_top);
-
-  const int16_t* lookup_table = GetLookupTable(YV12);
-
-  // Fixed-point value of vertical and horizontal scale down factor.
-  // Values are in the format 16.16.
-  int y_step = kFractionMax * source_height / dest_height;
-  int x_step = kFractionMax * source_width / dest_width;
-
-  // Determine the coordinates of the rectangle in 16.16 coords.
-  // NB: Our origin is the *center* of the top/left pixel, NOT its top/left.
-  // If we're down-scaling by more than a factor of two, we start with a 50%
-  // fraction to avoid degenerating to point-sampling - we should really just
-  // fix the fraction at 50% for all pixels in that case.
-  int source_left = dest_rect_left * x_step;
-  int source_right = (dest_rect_right - 1) * x_step;
-  if (x_step < kFractionMax * 2) {
-    source_left += ((x_step - kFractionMax) / 2);
-    source_right += ((x_step - kFractionMax) / 2);
-  } else {
-    source_left += kFractionMax / 2;
-    source_right += kFractionMax / 2;
-  }
-  int source_top = dest_rect_top * y_step;
-  if (y_step < kFractionMax * 2) {
-    source_top += ((y_step - kFractionMax) / 2);
-  } else {
-    source_top += kFractionMax / 2;
-  }
-
-  // Determine the parts of the Y, U and V buffers to interpolate.
-  int source_y_left = source_left >> kFractionBits;
-  int source_y_right =
-      std::min((source_right >> kFractionBits) + 2, source_width + 1);
-
-  int source_uv_left = source_y_left / 2;
-  int source_uv_right = std::min((source_right >> (kFractionBits + 1)) + 2,
-                                 (source_width + 1) / 2);
-
-  int source_y_width = source_y_right - source_y_left;
-  int source_uv_width = source_uv_right - source_uv_left;
-
-  // Determine number of pixels in each output row.
-  int dest_rect_width = dest_rect_right - dest_rect_left;
-
-  // Intermediate buffer for vertical interpolation.
-  // 4096 bytes allows 3 buffers to fit in 12k, which fits in a 16K L1 cache,
-  // and is bigger than most users will generally need.
-  // The buffer is 16-byte aligned and padded with 16 extra bytes; some of the
-  // FilterYUVRowsProcs have alignment requirements, and the SSE version can
-  // write up to 16 bytes past the end of the buffer.
-  const int kFilterBufferSize = 4096;
-  const bool kAvoidUsingOptimizedFilter = source_width > kFilterBufferSize;
-  uint8_t yuv_temp[16 + kFilterBufferSize * 3 + 16];
-  // memset() yuv_temp to 0 to avoid bogus warnings when running on Valgrind.
-  if (RunningOnValgrind()) memset(yuv_temp, 0, sizeof(yuv_temp));
-  uint8_t* y_temp = reinterpret_cast<uint8_t*>(
-      reinterpret_cast<uintptr_t>(yuv_temp + 15) & ~15);
-  uint8_t* u_temp = y_temp + kFilterBufferSize;
-  uint8_t* v_temp = u_temp + kFilterBufferSize;
-
-  // Move to the top-left pixel of output.
-  rgb_buf += dest_rect_top * rgb_pitch;
-  rgb_buf += dest_rect_left * 4;
-
-  // For each destination row perform interpolation and color space
-  // conversion to produce the output.
-  for (int row = dest_rect_top; row < dest_rect_bottom; ++row) {
-    // Round the fixed-point y position to get the current row.
-    int source_row = source_top >> kFractionBits;
-    int source_uv_row = source_row / 2;
-    DCHECK(source_row < source_height);
-
-    // Locate the first row for each plane for interpolation.
-    const uint8_t* y0_ptr = y_buf + y_pitch * source_row + source_y_left;
-    const uint8_t* u0_ptr = u_buf + uv_pitch * source_uv_row + source_uv_left;
-    const uint8_t* v0_ptr = v_buf + uv_pitch * source_uv_row + source_uv_left;
-    const uint8_t* y1_ptr = NULL;
-    const uint8_t* u1_ptr = NULL;
-    const uint8_t* v1_ptr = NULL;
-
-    // Locate the second row for interpolation, being careful not to overrun.
-    if (source_row + 1 >= source_height) {
-      y1_ptr = y0_ptr;
-    } else {
-      y1_ptr = y0_ptr + y_pitch;
-    }
-    if (source_uv_row + 1 >= (source_height + 1) / 2) {
-      u1_ptr = u0_ptr;
-      v1_ptr = v0_ptr;
-    } else {
-      u1_ptr = u0_ptr + uv_pitch;
-      v1_ptr = v0_ptr + uv_pitch;
-    }
-
-    if (!kAvoidUsingOptimizedFilter) {
-      // Vertical scaler uses 16.8 fixed point.
-      uint8_t fraction = (source_top & kFractionMask) >> 8;
-      g_filter_yuv_rows_proc_(y_temp + source_y_left, y0_ptr, y1_ptr,
-                              source_y_width, fraction);
-      g_filter_yuv_rows_proc_(u_temp + source_uv_left, u0_ptr, u1_ptr,
-                              source_uv_width, fraction);
-      g_filter_yuv_rows_proc_(v_temp + source_uv_left, v0_ptr, v1_ptr,
-                              source_uv_width, fraction);
-
-      // Perform horizontal interpolation and color space conversion.
-      // TODO(hclam): Use the MMX version after more testing.
-      LinearScaleYUVToRGB32RowWithRange_C(y_temp, u_temp, v_temp, rgb_buf,
-                                          dest_rect_width, source_left, x_step,
-                                          lookup_table);
-    } else {
-      // If the frame is too large then we linear scale a single row.
-      LinearScaleYUVToRGB32RowWithRange_C(y0_ptr, u0_ptr, v0_ptr, rgb_buf,
-                                          dest_rect_width, source_left, x_step,
-                                          lookup_table);
-    }
-
-    // Advance vertically in the source and destination image.
-    source_top += y_step;
-    rgb_buf += rgb_pitch;
-  }
-
-  g_empty_register_state_proc_();
-}
-
-void ConvertRGB32ToYUV(const uint8_t* rgbframe, uint8_t* yplane,
-                       uint8_t* uplane, uint8_t* vplane, int width, int height,
-                       int rgbstride, int ystride, int uvstride) {
-  g_convert_rgb32_to_yuv_proc_(rgbframe, yplane, uplane, vplane, width, height,
-                               rgbstride, ystride, uvstride);
-}
-
-void ConvertRGB24ToYUV(const uint8_t* rgbframe, uint8_t* yplane,
-                       uint8_t* uplane, uint8_t* vplane, int width, int height,
-                       int rgbstride, int ystride, int uvstride) {
-  g_convert_rgb24_to_yuv_proc_(rgbframe, yplane, uplane, vplane, width, height,
-                               rgbstride, ystride, uvstride);
-}
-
-void ConvertYUVToRGB32(const uint8_t* yplane, const uint8_t* uplane,
-                       const uint8_t* vplane, uint8_t* rgbframe, int width,
-                       int height, int ystride, int uvstride, int rgbstride,
-                       YUVType yuv_type) {
-  g_convert_yuv_to_rgb32_proc_(yplane, uplane, vplane, rgbframe, width, height,
-                               ystride, uvstride, rgbstride, yuv_type);
-}
-
-void ConvertYUVAToARGB(const uint8_t* yplane, const uint8_t* uplane,
-                       const uint8_t* vplane, const uint8_t* aplane,
-                       uint8_t* rgbframe, int width, int height, int ystride,
-                       int uvstride, int astride, int rgbstride,
-                       YUVType yuv_type) {
-  g_convert_yuva_to_argb_proc_(yplane, uplane, vplane, aplane, rgbframe, width,
-                               height, ystride, uvstride, astride, rgbstride,
-                               yuv_type);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/yuv_convert.h b/cobalt/media/base/yuv_convert.h
deleted file mode 100644
index 9e94632..0000000
--- a/cobalt/media/base/yuv_convert.h
+++ /dev/null
@@ -1,113 +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 COBALT_MEDIA_BASE_YUV_CONVERT_H_
-#define COBALT_MEDIA_BASE_YUV_CONVERT_H_
-
-#include "build/build_config.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-// Visual Studio 2010 does not support MMX intrinsics on x64.
-// Some win64 yuv_convert code paths use SSE+MMX yasm, so without rewriting
-// them, we use yasm EmptyRegisterState_MMX in place of _mm_empty() or
-// hide the versions implemented with heavy use of MMX intrinsics.
-// TODO(wolenetz): Use MMX intrinsics when compiling win64 with Visual
-// Studio 2012? http://crbug.com/173450
-#if defined(ARCH_CPU_X86_FAMILY) && \
-    !(defined(ARCH_CPU_X86_64) && defined(COMPILER_MSVC))
-#define MEDIA_MMX_INTRINSICS_AVAILABLE
-#endif
-
-namespace cobalt {
-namespace media {
-
-// Type of YUV surface.
-enum YUVType {
-  YV16 = 0,    // YV16 is half width and full height chroma channels.
-  YV12 = 1,    // YV12 is half width and half height chroma channels.
-  YV12J = 2,   // YV12J is the same as YV12, but in JPEG color range.
-  YV12HD = 3,  // YV12HD is the same as YV12, but in 'HD' Rec709 color space.
-};
-
-// Get the appropriate value to bitshift by for vertical indices.
-MEDIA_EXPORT int GetVerticalShift(YUVType type);
-
-// Get the appropriate lookup table for a given YUV format.
-MEDIA_EXPORT const int16_t* GetLookupTable(YUVType type);
-
-// Mirror means flip the image horizontally, as in looking in a mirror.
-// Rotate happens after mirroring.
-enum Rotate {
-  ROTATE_0,           // Rotation off.
-  ROTATE_90,          // Rotate clockwise.
-  ROTATE_180,         // Rotate upside down.
-  ROTATE_270,         // Rotate counter clockwise.
-  MIRROR_ROTATE_0,    // Mirror horizontally.
-  MIRROR_ROTATE_90,   // Mirror then Rotate clockwise.
-  MIRROR_ROTATE_180,  // Mirror vertically.
-  MIRROR_ROTATE_270,  // Transpose.
-};
-
-// Filter affects how scaling looks.
-enum ScaleFilter {
-  FILTER_NONE = 0,        // No filter (point sampled).
-  FILTER_BILINEAR_H = 1,  // Bilinear horizontal filter.
-  FILTER_BILINEAR_V = 2,  // Bilinear vertical filter.
-  FILTER_BILINEAR = 3,    // Bilinear filter.
-};
-
-MEDIA_EXPORT void InitializeCPUSpecificYUVConversions();
-
-// Convert a frame of YUV to 32 bit ARGB.
-// Pass in YV16/YV12 depending on source format
-MEDIA_EXPORT void ConvertYUVToRGB32(const uint8_t* yplane,
-                                    const uint8_t* uplane,
-                                    const uint8_t* vplane, uint8_t* rgbframe,
-                                    int width, int height, int ystride,
-                                    int uvstride, int rgbstride,
-                                    YUVType yuv_type);
-
-// Convert a frame of YUVA to 32 bit ARGB.
-// Pass in YV12A
-MEDIA_EXPORT void ConvertYUVAToARGB(
-    const uint8_t* yplane, const uint8_t* uplane, const uint8_t* vplane,
-    const uint8_t* aplane, uint8_t* rgbframe, int width, int height,
-    int ystride, int uvstride, int astride, int rgbstride, YUVType yuv_type);
-
-// Scale a frame of YUV to 32 bit ARGB.
-// Supports rotation and mirroring.
-MEDIA_EXPORT void ScaleYUVToRGB32(const uint8_t* yplane, const uint8_t* uplane,
-                                  const uint8_t* vplane, uint8_t* rgbframe,
-                                  int source_width, int source_height,
-                                  int width, int height, int ystride,
-                                  int uvstride, int rgbstride, YUVType yuv_type,
-                                  Rotate view_rotate, ScaleFilter filter);
-
-// Bilinear Scale a frame of YV12 to 32 bits ARGB on a specified rectangle.
-// |yplane|, etc and |rgbframe| should point to the top-left pixels of the
-// source and destination buffers.
-MEDIA_EXPORT void ScaleYUVToRGB32WithRect(
-    const uint8_t* yplane, const uint8_t* uplane, const uint8_t* vplane,
-    uint8_t* rgbframe, int source_width, int source_height, int dest_width,
-    int dest_height, int dest_rect_left, int dest_rect_top, int dest_rect_right,
-    int dest_rect_bottom, int ystride, int uvstride, int rgbstride);
-
-MEDIA_EXPORT void ConvertRGB32ToYUV(const uint8_t* rgbframe, uint8_t* yplane,
-                                    uint8_t* uplane, uint8_t* vplane, int width,
-                                    int height, int rgbstride, int ystride,
-                                    int uvstride);
-
-MEDIA_EXPORT void ConvertRGB24ToYUV(const uint8_t* rgbframe, uint8_t* yplane,
-                                    uint8_t* uplane, uint8_t* vplane, int width,
-                                    int height, int rgbstride, int ystride,
-                                    int uvstride);
-
-// Empty SIMD register state after calling optimized scaler functions.
-MEDIA_EXPORT void EmptyRegisterState();
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_BASE_YUV_CONVERT_H_
diff --git a/cobalt/media/base/yuv_convert_perftest.cc b/cobalt/media/base/yuv_convert_perftest.cc
deleted file mode 100644
index 162f972..0000000
--- a/cobalt/media/base/yuv_convert_perftest.cc
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2014 The Chromium Authors. 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 "base/base_paths.h"
-#include "base/basictypes.h"
-#include "base/cpu.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/simd/convert_yuv_to_rgb.h"
-#include "cobalt/media/base/yuv_convert.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
-#include "third_party/libyuv/include/libyuv/row.h"
-
-namespace cobalt {
-namespace media {
-#if !defined(ARCH_CPU_ARM_FAMILY) && !defined(ARCH_CPU_MIPS_FAMILY)
-// Size of raw image.
-static const int kSourceWidth = 640;
-static const int kSourceHeight = 360;
-static const int kSourceYSize = kSourceWidth * kSourceHeight;
-static const int kSourceUOffset = kSourceYSize;
-static const int kSourceVOffset = kSourceYSize * 5 / 4;
-static const int kBpp = 4;
-
-// Width of the row to convert. Odd so that we exercise the ending
-// one-pixel-leftover case.
-static const int kWidth = 639;
-
-// Surface sizes for various test files.
-static const int kYUV12Size = kSourceYSize * 12 / 8;
-static const int kRGBSize = kSourceYSize * kBpp;
-
-static const int kPerfTestIterations = 2000;
-
-class YUVConvertPerfTest : public testing::Test {
- public:
-  YUVConvertPerfTest()
-      : yuv_bytes_(new uint8_t[kYUV12Size]),
-        rgb_bytes_converted_(new uint8_t[kRGBSize]) {
-    base::FilePath path;
-    CHECK(base::PathService::Get(base::DIR_TEST_DATA, &path));
-    path = path.Append(FILE_PATH_LITERAL("media"))
-               .Append(FILE_PATH_LITERAL("test"))
-               .Append(FILE_PATH_LITERAL("data"))
-               .Append(FILE_PATH_LITERAL("bali_640x360_P420.yuv"));
-
-    // Verify file size is correct.
-    int64_t actual_size = 0;
-    base::GetFileSize(path, &actual_size);
-    CHECK_EQ(actual_size, kYUV12Size);
-
-    // Verify bytes read are correct.
-    int bytes_read = base::ReadFile(
-        path, reinterpret_cast<char*>(yuv_bytes_.get()), kYUV12Size);
-
-    CHECK_EQ(bytes_read, kYUV12Size);
-  }
-
-  std::unique_ptr<uint8_t[]> yuv_bytes_;
-  std::unique_ptr<uint8_t[]> rgb_bytes_converted_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(YUVConvertPerfTest);
-};
-
-TEST_F(YUVConvertPerfTest, ConvertYUVToRGB32Row_SSE) {
-  ASSERT_TRUE(base::CPU().has_sse());
-
-  base::TimeTicks start = base::TimeTicks::Now();
-  for (int i = 0; i < kPerfTestIterations; ++i) {
-    for (int row = 0; row < kSourceHeight; ++row) {
-      int chroma_row = row / 2;
-      ConvertYUVToRGB32Row_SSE(
-          yuv_bytes_.get() + row * kSourceWidth,
-          yuv_bytes_.get() + kSourceUOffset + (chroma_row * kSourceWidth / 2),
-          yuv_bytes_.get() + kSourceVOffset + (chroma_row * kSourceWidth / 2),
-          rgb_bytes_converted_.get(), kWidth, GetLookupTable(YV12));
-    }
-  }
-  media::EmptyRegisterState();
-  double total_time_seconds = (base::TimeTicks::Now() - start).InSecondsF();
-  perf_test::PrintResult("yuv_convert_perftest", "", "ConvertYUVToRGB32Row_SSE",
-                         kPerfTestIterations / total_time_seconds, "runs/s",
-                         true);
-}
-
-#ifdef HAS_I422TOARGBROW_SSSE3
-TEST_F(YUVConvertPerfTest, I422ToARGBRow_SSSE3) {
-  ASSERT_TRUE(base::CPU().has_ssse3());
-
-  base::TimeTicks start = base::TimeTicks::Now();
-  for (int i = 0; i < kPerfTestIterations; ++i) {
-    for (int row = 0; row < kSourceHeight; ++row) {
-      int chroma_row = row / 2;
-      libyuv::I422ToARGBRow_SSSE3(
-          yuv_bytes_.get() + row * kSourceWidth,
-          yuv_bytes_.get() + kSourceUOffset + (chroma_row * kSourceWidth / 2),
-          yuv_bytes_.get() + kSourceVOffset + (chroma_row * kSourceWidth / 2),
-          rgb_bytes_converted_.get(), &libyuv::kYuvI601Constants, kWidth);
-    }
-  }
-  double total_time_seconds = (base::TimeTicks::Now() - start).InSecondsF();
-  perf_test::PrintResult("yuv_convert_perftest", "", "I422ToARGBRow_SSSE3",
-                         kPerfTestIterations / total_time_seconds, "runs/s",
-                         true);
-}
-#endif
-
-TEST_F(YUVConvertPerfTest, ConvertYUVAToARGBRow_MMX) {
-  ASSERT_TRUE(base::CPU().has_sse());
-
-  base::TimeTicks start = base::TimeTicks::Now();
-  for (int i = 0; i < kPerfTestIterations; ++i) {
-    for (int row = 0; row < kSourceHeight; ++row) {
-      int chroma_row = row / 2;
-      ConvertYUVAToARGBRow_MMX(
-          yuv_bytes_.get() + row * kSourceWidth,
-          yuv_bytes_.get() + kSourceUOffset + (chroma_row * kSourceWidth / 2),
-          yuv_bytes_.get() + kSourceVOffset + (chroma_row * kSourceWidth / 2),
-          yuv_bytes_.get() + row * kSourceWidth,  // hack: use luma for alpha
-          rgb_bytes_converted_.get(), kWidth, GetLookupTable(YV12));
-    }
-  }
-  media::EmptyRegisterState();
-  double total_time_seconds = (base::TimeTicks::Now() - start).InSecondsF();
-  perf_test::PrintResult("yuv_convert_perftest", "", "ConvertYUVAToARGBRow_MMX",
-                         kPerfTestIterations / total_time_seconds, "runs/s",
-                         true);
-}
-
-#ifdef HAS_I422ALPHATOARGBROW_SSSE3
-TEST_F(YUVConvertPerfTest, I422AlphaToARGBRow_SSSE3) {
-  ASSERT_TRUE(base::CPU().has_ssse3());
-
-  base::TimeTicks start = base::TimeTicks::Now();
-  for (int i = 0; i < kPerfTestIterations; ++i) {
-    for (int row = 0; row < kSourceHeight; ++row) {
-      int chroma_row = row / 2;
-      libyuv::I422AlphaToARGBRow_SSSE3(
-          yuv_bytes_.get() + row * kSourceWidth,
-          yuv_bytes_.get() + kSourceUOffset + (chroma_row * kSourceWidth / 2),
-          yuv_bytes_.get() + kSourceVOffset + (chroma_row * kSourceWidth / 2),
-          yuv_bytes_.get() + row * kSourceWidth,  // hack: use luma for alpha
-          rgb_bytes_converted_.get(), &libyuv::kYuvI601Constants, kWidth);
-    }
-  }
-  double total_time_seconds = (base::TimeTicks::Now() - start).InSecondsF();
-  perf_test::PrintResult("yuv_convert_perftest", "", "I422AlphaToARGBRow_SSSE3",
-                         kPerfTestIterations / total_time_seconds, "runs/s",
-                         true);
-}
-#endif
-
-// 64-bit release + component builds on Windows are too smart and optimizes
-// away the function being tested.
-#if defined(OS_WIN) && (defined(ARCH_CPU_X86) || !defined(COMPONENT_BUILD))
-TEST_F(YUVConvertPerfTest, ScaleYUVToRGB32Row_SSE) {
-  ASSERT_TRUE(base::CPU().has_sse());
-
-  const int kSourceDx = 80000;  // This value means a scale down.
-
-  base::TimeTicks start = base::TimeTicks::Now();
-  for (int i = 0; i < kPerfTestIterations; ++i) {
-    for (int row = 0; row < kSourceHeight; ++row) {
-      int chroma_row = row / 2;
-      ScaleYUVToRGB32Row_SSE(
-          yuv_bytes_.get() + row * kSourceWidth,
-          yuv_bytes_.get() + kSourceUOffset + (chroma_row * kSourceWidth / 2),
-          yuv_bytes_.get() + kSourceVOffset + (chroma_row * kSourceWidth / 2),
-          rgb_bytes_converted_.get(), kWidth, kSourceDx, GetLookupTable(YV12));
-    }
-  }
-  media::EmptyRegisterState();
-  double total_time_seconds = (base::TimeTicks::Now() - start).InSecondsF();
-  perf_test::PrintResult("yuv_convert_perftest", "", "ScaleYUVToRGB32Row_SSE",
-                         kPerfTestIterations / total_time_seconds, "runs/s",
-                         true);
-}
-
-TEST_F(YUVConvertPerfTest, LinearScaleYUVToRGB32Row_SSE) {
-  ASSERT_TRUE(base::CPU().has_sse());
-
-  const int kSourceDx = 80000;  // This value means a scale down.
-
-  base::TimeTicks start = base::TimeTicks::Now();
-  for (int i = 0; i < kPerfTestIterations; ++i) {
-    for (int row = 0; row < kSourceHeight; ++row) {
-      int chroma_row = row / 2;
-      LinearScaleYUVToRGB32Row_SSE(
-          yuv_bytes_.get() + row * kSourceWidth,
-          yuv_bytes_.get() + kSourceUOffset + (chroma_row * kSourceWidth / 2),
-          yuv_bytes_.get() + kSourceVOffset + (chroma_row * kSourceWidth / 2),
-          rgb_bytes_converted_.get(), kWidth, kSourceDx, GetLookupTable(YV12));
-    }
-  }
-  media::EmptyRegisterState();
-  double total_time_seconds = (base::TimeTicks::Now() - start).InSecondsF();
-  perf_test::PrintResult(
-      "yuv_convert_perftest", "", "LinearScaleYUVToRGB32Row_SSE",
-      kPerfTestIterations / total_time_seconds, "runs/s", true);
-}
-#endif  // defined(OS_WIN) && (ARCH_CPU_X86 || COMPONENT_BUILD)
-
-#endif  // !defined(ARCH_CPU_ARM_FAMILY) && !defined(ARCH_CPU_MIPS_FAMILY)
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/base/yuv_convert_unittest.cc b/cobalt/media/base/yuv_convert_unittest.cc
deleted file mode 100644
index daf2af3..0000000
--- a/cobalt/media/base/yuv_convert_unittest.cc
+++ /dev/null
@@ -1,803 +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 "cobalt/media/base/yuv_convert.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "base/base_paths.h"
-#include "base/cpu.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "build/build_config.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/media/base/djb2.h"
-#include "cobalt/media/base/simd/convert_rgb_to_yuv.h"
-#include "cobalt/media/base/simd/convert_yuv_to_rgb.h"
-#include "cobalt/media/base/simd/filter_yuv.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// Size of raw image.
-static const int kSourceWidth = 640;
-static const int kSourceHeight = 360;
-static const int kSourceYSize = kSourceWidth * kSourceHeight;
-static const int kSourceUOffset = kSourceYSize;
-static const int kSourceVOffset = kSourceYSize * 5 / 4;
-static const int kScaledWidth = 1024;
-static const int kScaledHeight = 768;
-static const int kDownScaledWidth = 512;
-static const int kDownScaledHeight = 320;
-static const int kBpp = 4;
-
-// Surface sizes for various test files.
-static const int kYUV12Size = kSourceYSize * 12 / 8;
-static const int kYUV16Size = kSourceYSize * 16 / 8;
-static const int kRGBSize = kSourceYSize * kBpp;
-static const int kRGBSizeScaled = kScaledWidth * kScaledHeight * kBpp;
-static const int kRGB24Size = kSourceYSize * 3;
-static const int kRGBSizeConverted = kSourceYSize * kBpp;
-
-#if !defined(ARCH_CPU_ARM_FAMILY) && !defined(ARCH_CPU_MIPS_FAMILY) && \
-    !defined(OS_ANDROID)
-static const int kSourceAOffset = kSourceYSize * 12 / 8;
-static const int kYUVA12Size = kSourceYSize * 20 / 8;
-#endif
-
-// Helper for reading test data into a std::unique_ptr<uint8_t[]>.
-static void ReadData(const base::FilePath::CharType* filename,
-                     int expected_size, std::unique_ptr<uint8_t[]>* data) {
-  data->reset(new uint8_t[expected_size]);
-
-  base::FilePath path;
-  CHECK(base::PathService::Get(base::DIR_TEST_DATA, &path));
-  path = path.Append(FILE_PATH_LITERAL("media"))
-             .Append(FILE_PATH_LITERAL("test"))
-             .Append(FILE_PATH_LITERAL("data"))
-             .Append(filename);
-
-  // Verify file size is correct.
-  int64_t actual_size = 0;
-  base::GetFileSize(path, &actual_size);
-  CHECK_EQ(actual_size, expected_size);
-
-  // Verify bytes read are correct.
-  int bytes_read =
-      base::ReadFile(path, reinterpret_cast<char*>(data->get()), expected_size);
-  CHECK_EQ(bytes_read, expected_size);
-}
-
-static void ReadYV12Data(std::unique_ptr<uint8_t[]>* data) {
-  ReadData(FILE_PATH_LITERAL("bali_640x360_P420.yuv"), kYUV12Size, data);
-}
-
-static void ReadYV16Data(std::unique_ptr<uint8_t[]>* data) {
-  ReadData(FILE_PATH_LITERAL("bali_640x360_P422.yuv"), kYUV16Size, data);
-}
-
-#if !defined(ARCH_CPU_ARM_FAMILY) && !defined(ARCH_CPU_MIPS_FAMILY) && \
-    !defined(OS_ANDROID)
-static void ReadYV12AData(std::unique_ptr<uint8_t[]>* data) {
-  ReadData(FILE_PATH_LITERAL("bali_640x360_P420_alpha.yuv"), kYUVA12Size, data);
-}
-#endif
-
-static void ReadRGB24Data(std::unique_ptr<uint8_t[]>* data) {
-  ReadData(FILE_PATH_LITERAL("bali_640x360_RGB24.rgb"), kRGB24Size, data);
-}
-
-#if defined(OS_ANDROID)
-// Helper for swapping red and blue channels of RGBA or BGRA.
-static void SwapRedAndBlueChannels(unsigned char* pixels, size_t buffer_size) {
-  for (size_t i = 0; i < buffer_size; i += 4) {
-    std::swap(pixels[i], pixels[i + 2]);
-  }
-}
-#endif
-
-namespace cobalt {
-namespace media {
-
-TEST(YUVConvertTest, YV12) {
-  // Allocate all surfaces.
-  std::unique_ptr<uint8_t[]> yuv_bytes;
-  std::unique_ptr<uint8_t[]> rgb_bytes(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> rgb_converted_bytes(
-      new uint8_t[kRGBSizeConverted]);
-
-  // Read YUV reference data from file.
-  ReadYV12Data(&yuv_bytes);
-
-  // Convert a frame of YUV to 32 bit ARGB.
-  media::ConvertYUVToRGB32(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                           yuv_bytes.get() + kSourceVOffset,
-                           rgb_converted_bytes.get(),    // RGB output
-                           kSourceWidth, kSourceHeight,  // Dimensions
-                           kSourceWidth,                 // YStride
-                           kSourceWidth / 2,             // UVStride
-                           kSourceWidth * kBpp,          // RGBStride
-                           media::YV12);
-
-#if defined(OS_ANDROID)
-  SwapRedAndBlueChannels(rgb_converted_bytes.get(), kRGBSizeConverted);
-#endif
-
-  uint32_t rgb_hash =
-      DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, kDJB2HashSeed);
-  EXPECT_EQ(2413171226u, rgb_hash);
-}
-
-TEST(YUVConvertTest, YV16) {
-  // Allocate all surfaces.
-  std::unique_ptr<uint8_t[]> yuv_bytes;
-  std::unique_ptr<uint8_t[]> rgb_bytes(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> rgb_converted_bytes(
-      new uint8_t[kRGBSizeConverted]);
-
-  // Read YUV reference data from file.
-  ReadYV16Data(&yuv_bytes);
-
-  // Convert a frame of YUV to 32 bit ARGB.
-  media::ConvertYUVToRGB32(yuv_bytes.get(),                         // Y
-                           yuv_bytes.get() + kSourceUOffset,        // U
-                           yuv_bytes.get() + kSourceYSize * 3 / 2,  // V
-                           rgb_converted_bytes.get(),    // RGB output
-                           kSourceWidth, kSourceHeight,  // Dimensions
-                           kSourceWidth,                 // YStride
-                           kSourceWidth / 2,             // UVStride
-                           kSourceWidth * kBpp,          // RGBStride
-                           media::YV16);
-
-#if defined(OS_ANDROID)
-  SwapRedAndBlueChannels(rgb_converted_bytes.get(), kRGBSizeConverted);
-#endif
-
-  uint32_t rgb_hash =
-      DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, kDJB2HashSeed);
-  EXPECT_EQ(4222342047u, rgb_hash);
-}
-
-struct YUVScaleTestData {
-  YUVScaleTestData(media::YUVType y, media::ScaleFilter s, uint32_t r)
-      : yuv_type(y), scale_filter(s), rgb_hash(r) {}
-
-  media::YUVType yuv_type;
-  media::ScaleFilter scale_filter;
-  uint32_t rgb_hash;
-};
-
-class YUVScaleTest : public ::testing::TestWithParam<YUVScaleTestData> {
- public:
-  YUVScaleTest() {
-    switch (GetParam().yuv_type) {
-      case media::YV12:
-      case media::YV12J:
-      case media::YV12HD:
-        ReadYV12Data(&yuv_bytes_);
-        break;
-      case media::YV16:
-        ReadYV16Data(&yuv_bytes_);
-        break;
-    }
-
-    rgb_bytes_.reset(new uint8_t[kRGBSizeScaled]);
-  }
-
-  // Helpers for getting the proper Y, U and V plane offsets.
-  uint8_t* y_plane() { return yuv_bytes_.get(); }
-  uint8_t* u_plane() { return yuv_bytes_.get() + kSourceYSize; }
-  uint8_t* v_plane() {
-    switch (GetParam().yuv_type) {
-      case media::YV12:
-      case media::YV12J:
-      case media::YV12HD:
-        return yuv_bytes_.get() + kSourceVOffset;
-      case media::YV16:
-        return yuv_bytes_.get() + kSourceYSize * 3 / 2;
-    }
-    return NULL;
-  }
-
-  std::unique_ptr<uint8_t[]> yuv_bytes_;
-  std::unique_ptr<uint8_t[]> rgb_bytes_;
-};
-
-TEST_P(YUVScaleTest, NoScale) {
-  media::ScaleYUVToRGB32(y_plane(),                    // Y
-                         u_plane(),                    // U
-                         v_plane(),                    // V
-                         rgb_bytes_.get(),             // RGB output
-                         kSourceWidth, kSourceHeight,  // Dimensions
-                         kSourceWidth, kSourceHeight,  // Dimensions
-                         kSourceWidth,                 // YStride
-                         kSourceWidth / 2,             // UvStride
-                         kSourceWidth * kBpp,          // RgbStride
-                         GetParam().yuv_type, media::ROTATE_0,
-                         GetParam().scale_filter);
-
-  uint32_t yuv_hash = DJB2Hash(rgb_bytes_.get(), kRGBSize, kDJB2HashSeed);
-
-  media::ConvertYUVToRGB32(y_plane(),                    // Y
-                           u_plane(),                    // U
-                           v_plane(),                    // V
-                           rgb_bytes_.get(),             // RGB output
-                           kSourceWidth, kSourceHeight,  // Dimensions
-                           kSourceWidth,                 // YStride
-                           kSourceWidth / 2,             // UVStride
-                           kSourceWidth * kBpp,          // RGBStride
-                           GetParam().yuv_type);
-
-  uint32_t rgb_hash = DJB2Hash(rgb_bytes_.get(), kRGBSize, kDJB2HashSeed);
-
-  EXPECT_EQ(yuv_hash, rgb_hash);
-}
-
-TEST_P(YUVScaleTest, Normal) {
-  media::ScaleYUVToRGB32(y_plane(),                    // Y
-                         u_plane(),                    // U
-                         v_plane(),                    // V
-                         rgb_bytes_.get(),             // RGB output
-                         kSourceWidth, kSourceHeight,  // Dimensions
-                         kScaledWidth, kScaledHeight,  // Dimensions
-                         kSourceWidth,                 // YStride
-                         kSourceWidth / 2,             // UvStride
-                         kScaledWidth * kBpp,          // RgbStride
-                         GetParam().yuv_type, media::ROTATE_0,
-                         GetParam().scale_filter);
-
-#if defined(OS_ANDROID)
-  SwapRedAndBlueChannels(rgb_bytes_.get(), kRGBSizeScaled);
-#endif
-
-  uint32_t rgb_hash = DJB2Hash(rgb_bytes_.get(), kRGBSizeScaled, kDJB2HashSeed);
-  EXPECT_EQ(GetParam().rgb_hash, rgb_hash);
-}
-
-TEST_P(YUVScaleTest, ZeroSourceSize) {
-  media::ScaleYUVToRGB32(y_plane(),                    // Y
-                         u_plane(),                    // U
-                         v_plane(),                    // V
-                         rgb_bytes_.get(),             // RGB output
-                         0, 0,                         // Dimensions
-                         kScaledWidth, kScaledHeight,  // Dimensions
-                         kSourceWidth,                 // YStride
-                         kSourceWidth / 2,             // UvStride
-                         kScaledWidth * kBpp,          // RgbStride
-                         GetParam().yuv_type, media::ROTATE_0,
-                         GetParam().scale_filter);
-
-  // Testing for out-of-bound read/writes with AddressSanitizer.
-}
-
-TEST_P(YUVScaleTest, ZeroDestinationSize) {
-  media::ScaleYUVToRGB32(y_plane(),                    // Y
-                         u_plane(),                    // U
-                         v_plane(),                    // V
-                         rgb_bytes_.get(),             // RGB output
-                         kSourceWidth, kSourceHeight,  // Dimensions
-                         0, 0,                         // Dimensions
-                         kSourceWidth,                 // YStride
-                         kSourceWidth / 2,             // UvStride
-                         kScaledWidth * kBpp,          // RgbStride
-                         GetParam().yuv_type, media::ROTATE_0,
-                         GetParam().scale_filter);
-
-  // Testing for out-of-bound read/writes with AddressSanitizer.
-}
-
-TEST_P(YUVScaleTest, OddWidthAndHeightNotCrash) {
-  media::ScaleYUVToRGB32(y_plane(),                    // Y
-                         u_plane(),                    // U
-                         v_plane(),                    // V
-                         rgb_bytes_.get(),             // RGB output
-                         kSourceWidth, kSourceHeight,  // Dimensions
-                         3, 3,                         // Dimensions
-                         kSourceWidth,                 // YStride
-                         kSourceWidth / 2,             // UvStride
-                         kScaledWidth * kBpp,          // RgbStride
-                         GetParam().yuv_type, media::ROTATE_0,
-                         GetParam().scale_filter);
-}
-
-INSTANTIATE_TEST_CASE_P(
-    YUVScaleFormats, YUVScaleTest,
-    ::testing::Values(
-        YUVScaleTestData(media::YV12, media::FILTER_NONE, 4136904952u),
-        YUVScaleTestData(media::YV16, media::FILTER_NONE, 1501777547u),
-        YUVScaleTestData(media::YV12, media::FILTER_BILINEAR, 3164274689u),
-        YUVScaleTestData(media::YV16, media::FILTER_BILINEAR, 3095878046u)));
-
-// This tests a known worst case YUV value, and for overflow.
-TEST(YUVConvertTest, Clamp) {
-  // Allocate all surfaces.
-  std::unique_ptr<uint8_t[]> yuv_bytes(new uint8_t[1]);
-  std::unique_ptr<uint8_t[]> rgb_bytes(new uint8_t[1]);
-  std::unique_ptr<uint8_t[]> rgb_converted_bytes(new uint8_t[1]);
-
-  // Values that failed previously in bug report.
-  unsigned char y = 255u;
-  unsigned char u = 255u;
-  unsigned char v = 19u;
-
-  // Prefill extra large destination buffer to test for overflow.
-  unsigned char rgb[8] = {0, 1, 2, 3, 4, 5, 6, 7};
-  unsigned char expected[8] = {255, 255, 104, 255, 4, 5, 6, 7};
-  // Convert a frame of YUV to 32 bit ARGB.
-  media::ConvertYUVToRGB32(&y,       // Y
-                           &u,       // U
-                           &v,       // V
-                           &rgb[0],  // RGB output
-                           1, 1,     // Dimensions
-                           0,        // YStride
-                           0,        // UVStride
-                           0,        // RGBStride
-                           media::YV12);
-
-#if defined(OS_ANDROID)
-  SwapRedAndBlueChannels(rgb, kBpp);
-#endif
-
-  int expected_test = memcmp(rgb, expected, sizeof(expected));
-  EXPECT_EQ(0, expected_test);
-}
-
-TEST(YUVConvertTest, RGB24ToYUV) {
-  // Allocate all surfaces.
-  std::unique_ptr<uint8_t[]> rgb_bytes;
-  std::unique_ptr<uint8_t[]> yuv_converted_bytes(new uint8_t[kYUV12Size]);
-
-  // Read RGB24 reference data from file.
-  ReadRGB24Data(&rgb_bytes);
-
-  // Convert to I420.
-  media::ConvertRGB24ToYUV(rgb_bytes.get(), yuv_converted_bytes.get(),
-                           yuv_converted_bytes.get() + kSourceUOffset,
-                           yuv_converted_bytes.get() + kSourceVOffset,
-                           kSourceWidth, kSourceHeight,  // Dimensions
-                           kSourceWidth * 3,             // RGBStride
-                           kSourceWidth,                 // YStride
-                           kSourceWidth / 2);            // UVStride
-
-  uint32_t rgb_hash =
-      DJB2Hash(yuv_converted_bytes.get(), kYUV12Size, kDJB2HashSeed);
-  EXPECT_EQ(320824432u, rgb_hash);
-}
-
-TEST(YUVConvertTest, RGB32ToYUV) {
-  // Allocate all surfaces.
-  std::unique_ptr<uint8_t[]> yuv_bytes(new uint8_t[kYUV12Size]);
-  std::unique_ptr<uint8_t[]> rgb_bytes(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> yuv_converted_bytes(new uint8_t[kYUV12Size]);
-  std::unique_ptr<uint8_t[]> rgb_converted_bytes(new uint8_t[kRGBSize]);
-
-  // Read YUV reference data from file.
-  base::FilePath yuv_url;
-  EXPECT_TRUE(base::PathService::Get(base::DIR_TEST_DATA, &yuv_url));
-  yuv_url = yuv_url.Append(FILE_PATH_LITERAL("media"))
-                .Append(FILE_PATH_LITERAL("test"))
-                .Append(FILE_PATH_LITERAL("data"))
-                .Append(FILE_PATH_LITERAL("bali_640x360_P420.yuv"));
-  EXPECT_EQ(static_cast<int>(kYUV12Size),
-            base::ReadFile(yuv_url, reinterpret_cast<char*>(yuv_bytes.get()),
-                           static_cast<int>(kYUV12Size)));
-
-  // Convert a frame of YUV to 32 bit ARGB.
-  media::ConvertYUVToRGB32(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                           yuv_bytes.get() + kSourceVOffset,
-                           rgb_bytes.get(),              // RGB output
-                           kSourceWidth, kSourceHeight,  // Dimensions
-                           kSourceWidth,                 // YStride
-                           kSourceWidth / 2,             // UVStride
-                           kSourceWidth * kBpp,          // RGBStride
-                           media::YV12);
-
-  // Convert RGB32 to YV12.
-  media::ConvertRGB32ToYUV(rgb_bytes.get(), yuv_converted_bytes.get(),
-                           yuv_converted_bytes.get() + kSourceUOffset,
-                           yuv_converted_bytes.get() + kSourceVOffset,
-                           kSourceWidth, kSourceHeight,  // Dimensions
-                           kSourceWidth * 4,             // RGBStride
-                           kSourceWidth,                 // YStride
-                           kSourceWidth / 2);            // UVStride
-
-  // Convert YV12 back to RGB32.
-  media::ConvertYUVToRGB32(yuv_converted_bytes.get(),
-                           yuv_converted_bytes.get() + kSourceUOffset,
-                           yuv_converted_bytes.get() + kSourceVOffset,
-                           rgb_converted_bytes.get(),    // RGB output
-                           kSourceWidth, kSourceHeight,  // Dimensions
-                           kSourceWidth,                 // YStride
-                           kSourceWidth / 2,             // UVStride
-                           kSourceWidth * kBpp,          // RGBStride
-                           media::YV12);
-
-  int error = 0;
-  for (int i = 0; i < kRGBSize; ++i) {
-    int diff = rgb_converted_bytes[i] - rgb_bytes[i];
-    if (diff < 0) diff = -diff;
-    error += diff;
-  }
-
-  // Make sure error is within bound.
-  DVLOG(1) << "Average error per channel: " << error / kRGBSize;
-  EXPECT_GT(5, error / kRGBSize);
-}
-
-TEST(YUVConvertTest, DownScaleYUVToRGB32WithRect) {
-  // Read YUV reference data from file.
-  base::FilePath yuv_url;
-  EXPECT_TRUE(base::PathService::Get(base::DIR_TEST_DATA, &yuv_url));
-  yuv_url = yuv_url.Append(FILE_PATH_LITERAL("media"))
-                .Append(FILE_PATH_LITERAL("test"))
-                .Append(FILE_PATH_LITERAL("data"))
-                .Append(FILE_PATH_LITERAL("bali_640x360_P420.yuv"));
-  const size_t size_of_yuv = kSourceYSize * 12 / 8;  // 12 bpp.
-  std::unique_ptr<uint8_t[]> yuv_bytes(new uint8_t[size_of_yuv]);
-  EXPECT_EQ(static_cast<int>(size_of_yuv),
-            base::ReadFile(yuv_url, reinterpret_cast<char*>(yuv_bytes.get()),
-                           static_cast<int>(size_of_yuv)));
-
-  // Scale the full frame of YUV to 32 bit ARGB.
-  // The API currently only supports down-scaling, so we don't test up-scaling.
-  const size_t size_of_rgb_scaled = kDownScaledWidth * kDownScaledHeight * kBpp;
-  std::unique_ptr<uint8_t[]> rgb_scaled_bytes(new uint8_t[size_of_rgb_scaled]);
-  math::Rect sub_rect(0, 0, kDownScaledWidth, kDownScaledHeight);
-
-  // We can't compare with the full-frame scaler because it uses slightly
-  // different sampling coordinates.
-  media::ScaleYUVToRGB32WithRect(
-      yuv_bytes.get(),                      // Y
-      yuv_bytes.get() + kSourceUOffset,     // U
-      yuv_bytes.get() + kSourceVOffset,     // V
-      rgb_scaled_bytes.get(),               // Rgb output
-      kSourceWidth, kSourceHeight,          // Dimensions
-      kDownScaledWidth, kDownScaledHeight,  // Dimensions
-      sub_rect.x(), sub_rect.y(),           // Dest rect
-      sub_rect.right(), sub_rect.bottom(),  // Dest rect
-      kSourceWidth,                         // YStride
-      kSourceWidth / 2,                     // UvStride
-      kDownScaledWidth * kBpp);             // RgbStride
-
-  uint32_t rgb_hash_full_rect =
-      DJB2Hash(rgb_scaled_bytes.get(), size_of_rgb_scaled, kDJB2HashSeed);
-
-  // Re-scale sub-rectangles and verify the results are the same.
-  int next_sub_rect = 0;
-  while (!sub_rect.IsEmpty()) {
-    // Scale a partial rectangle.
-    media::ScaleYUVToRGB32WithRect(
-        yuv_bytes.get(),                      // Y
-        yuv_bytes.get() + kSourceUOffset,     // U
-        yuv_bytes.get() + kSourceVOffset,     // V
-        rgb_scaled_bytes.get(),               // Rgb output
-        kSourceWidth, kSourceHeight,          // Dimensions
-        kDownScaledWidth, kDownScaledHeight,  // Dimensions
-        sub_rect.x(), sub_rect.y(),           // Dest rect
-        sub_rect.right(), sub_rect.bottom(),  // Dest rect
-        kSourceWidth,                         // YStride
-        kSourceWidth / 2,                     // UvStride
-        kDownScaledWidth * kBpp);             // RgbStride
-    uint32_t rgb_hash_sub_rect =
-        DJB2Hash(rgb_scaled_bytes.get(), size_of_rgb_scaled, kDJB2HashSeed);
-
-    EXPECT_EQ(rgb_hash_full_rect, rgb_hash_sub_rect);
-
-    // Now pick choose a quarter rect of this sub-rect.
-    if (next_sub_rect & 1) sub_rect.set_x(sub_rect.x() + sub_rect.width() / 2);
-    if (next_sub_rect & 2) sub_rect.set_y(sub_rect.y() + sub_rect.height() / 2);
-    sub_rect.set_width(sub_rect.width() / 2);
-    sub_rect.set_height(sub_rect.height() / 2);
-    next_sub_rect++;
-  }
-}
-
-#if !defined(ARCH_CPU_ARM_FAMILY) && !defined(ARCH_CPU_MIPS_FAMILY)
-#if !defined(OS_ANDROID)
-TEST(YUVConvertTest, YUVAtoARGB_MMX_MatchReference) {
-  // Allocate all surfaces.
-  std::unique_ptr<uint8_t[]> yuv_bytes;
-  std::unique_ptr<uint8_t[]> rgb_bytes(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> rgb_converted_bytes(
-      new uint8_t[kRGBSizeConverted]);
-  std::unique_ptr<uint8_t[]> rgb_converted_bytes_ref(
-      new uint8_t[kRGBSizeConverted]);
-
-  // Read YUV reference data from file.
-  ReadYV12AData(&yuv_bytes);
-
-  // Convert a frame of YUV to 32 bit ARGB using both C and MMX versions.
-  media::ConvertYUVAToARGB_C(
-      yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-      yuv_bytes.get() + kSourceVOffset, yuv_bytes.get() + kSourceAOffset,
-      rgb_converted_bytes_ref.get(), kSourceWidth, kSourceHeight, kSourceWidth,
-      kSourceWidth / 2, kSourceWidth, kSourceWidth * kBpp, media::YV12);
-  media::ConvertYUVAToARGB_MMX(
-      yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-      yuv_bytes.get() + kSourceVOffset, yuv_bytes.get() + kSourceAOffset,
-      rgb_converted_bytes.get(), kSourceWidth, kSourceHeight, kSourceWidth,
-      kSourceWidth / 2, kSourceWidth, kSourceWidth * kBpp, media::YV12);
-
-  EXPECT_EQ(0,
-            memcmp(rgb_converted_bytes.get(),
-                            rgb_converted_bytes_ref.get(), kRGBSizeConverted));
-}
-#endif  // !defined(OS_ANDROID)
-
-TEST(YUVConvertTest, RGB32ToYUV_SSE2_MatchReference) {
-  base::CPU cpu;
-  if (!cpu.has_sse2()) {
-    LOG(WARNING) << "System doesn't support SSE2, test not executed.";
-    return;
-  }
-
-  // Allocate all surfaces.
-  std::unique_ptr<uint8_t[]> yuv_bytes(new uint8_t[kYUV12Size]);
-  std::unique_ptr<uint8_t[]> rgb_bytes(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> yuv_converted_bytes(new uint8_t[kYUV12Size]);
-  std::unique_ptr<uint8_t[]> yuv_reference_bytes(new uint8_t[kYUV12Size]);
-
-  ReadYV12Data(&yuv_bytes);
-
-  // Convert a frame of YUV to 32 bit ARGB.
-  media::ConvertYUVToRGB32(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                           yuv_bytes.get() + kSourceVOffset,
-                           rgb_bytes.get(),              // RGB output
-                           kSourceWidth, kSourceHeight,  // Dimensions
-                           kSourceWidth,                 // YStride
-                           kSourceWidth / 2,             // UVStride
-                           kSourceWidth * kBpp,          // RGBStride
-                           media::YV12);
-
-  // Convert RGB32 to YV12 with SSE2 version.
-  media::ConvertRGB32ToYUV_SSE2(rgb_bytes.get(), yuv_converted_bytes.get(),
-                                yuv_converted_bytes.get() + kSourceUOffset,
-                                yuv_converted_bytes.get() + kSourceVOffset,
-                                kSourceWidth, kSourceHeight,  // Dimensions
-                                kSourceWidth * 4,             // RGBStride
-                                kSourceWidth,                 // YStride
-                                kSourceWidth / 2);            // UVStride
-
-  // Convert RGB32 to YV12 with reference version.
-  media::ConvertRGB32ToYUV_SSE2_Reference(
-      rgb_bytes.get(), yuv_reference_bytes.get(),
-      yuv_reference_bytes.get() + kSourceUOffset,
-      yuv_reference_bytes.get() + kSourceVOffset, kSourceWidth,
-      kSourceHeight,      // Dimensions
-      kSourceWidth * 4,   // RGBStride
-      kSourceWidth,       // YStride
-      kSourceWidth / 2);  // UVStride
-
-  // Now convert a odd width and height, this overrides part of the buffer
-  // generated above but that is fine because the point of this test is to
-  // match the result with the reference code.
-
-  // Convert RGB32 to YV12 with SSE2 version.
-  media::ConvertRGB32ToYUV_SSE2(rgb_bytes.get(), yuv_converted_bytes.get(),
-                                yuv_converted_bytes.get() + kSourceUOffset,
-                                yuv_converted_bytes.get() + kSourceVOffset, 7,
-                                7,                  // Dimensions
-                                kSourceWidth * 4,   // RGBStride
-                                kSourceWidth,       // YStride
-                                kSourceWidth / 2);  // UVStride
-
-  // Convert RGB32 to YV12 with reference version.
-  media::ConvertRGB32ToYUV_SSE2_Reference(
-      rgb_bytes.get(), yuv_reference_bytes.get(),
-      yuv_reference_bytes.get() + kSourceUOffset,
-      yuv_reference_bytes.get() + kSourceVOffset, 7, 7,  // Dimensions
-      kSourceWidth * 4,                                  // RGBStride
-      kSourceWidth,                                      // YStride
-      kSourceWidth / 2);                                 // UVStride
-
-  int error = 0;
-  for (int i = 0; i < kYUV12Size; ++i) {
-    int diff = yuv_reference_bytes[i] - yuv_converted_bytes[i];
-    if (diff < 0) diff = -diff;
-    error += diff;
-  }
-
-  // Make sure there's no difference from the reference.
-  EXPECT_EQ(0, error);
-}
-
-TEST(YUVConvertTest, ConvertYUVToRGB32Row_SSE) {
-  base::CPU cpu;
-  if (!cpu.has_sse()) {
-    LOG(WARNING) << "System not supported. Test skipped.";
-    return;
-  }
-
-  std::unique_ptr<uint8_t[]> yuv_bytes(new uint8_t[kYUV12Size]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_reference(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_converted(new uint8_t[kRGBSize]);
-  ReadYV12Data(&yuv_bytes);
-
-  const int kWidth = 167;
-  ConvertYUVToRGB32Row_C(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                         yuv_bytes.get() + kSourceVOffset,
-                         rgb_bytes_reference.get(), kWidth,
-                         GetLookupTable(YV12));
-  ConvertYUVToRGB32Row_SSE(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                           yuv_bytes.get() + kSourceVOffset,
-                           rgb_bytes_converted.get(), kWidth,
-                           GetLookupTable(YV12));
-  media::EmptyRegisterState();
-  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
-                               rgb_bytes_converted.get(), kWidth * kBpp));
-}
-
-// 64-bit release + component builds on Windows are too smart and optimizes
-// away the function being tested.
-#if defined(OS_WIN) && (defined(ARCH_CPU_X86) || !defined(COMPONENT_BUILD))
-TEST(YUVConvertTest, ScaleYUVToRGB32Row_SSE) {
-  base::CPU cpu;
-  if (!cpu.has_sse()) {
-    LOG(WARNING) << "System not supported. Test skipped.";
-    return;
-  }
-
-  std::unique_ptr<uint8_t[]> yuv_bytes(new uint8_t[kYUV12Size]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_reference(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_converted(new uint8_t[kRGBSize]);
-  ReadYV12Data(&yuv_bytes);
-
-  const int kWidth = 167;
-  const int kSourceDx = 80000;  // This value means a scale down.
-  ScaleYUVToRGB32Row_C(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                       yuv_bytes.get() + kSourceVOffset,
-                       rgb_bytes_reference.get(), kWidth, kSourceDx,
-                       GetLookupTable(YV12));
-  ScaleYUVToRGB32Row_SSE(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                         yuv_bytes.get() + kSourceVOffset,
-                         rgb_bytes_converted.get(), kWidth, kSourceDx,
-                         GetLookupTable(YV12));
-  media::EmptyRegisterState();
-  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
-                               rgb_bytes_converted.get(), kWidth * kBpp));
-}
-
-TEST(YUVConvertTest, LinearScaleYUVToRGB32Row_SSE) {
-  base::CPU cpu;
-  if (!cpu.has_sse()) {
-    LOG(WARNING) << "System not supported. Test skipped.";
-    return;
-  }
-
-  std::unique_ptr<uint8_t[]> yuv_bytes(new uint8_t[kYUV12Size]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_reference(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_converted(new uint8_t[kRGBSize]);
-  ReadYV12Data(&yuv_bytes);
-
-  const int kWidth = 167;
-  const int kSourceDx = 80000;  // This value means a scale down.
-  LinearScaleYUVToRGB32Row_C(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                             yuv_bytes.get() + kSourceVOffset,
-                             rgb_bytes_reference.get(), kWidth, kSourceDx,
-                             GetLookupTable(YV12));
-  LinearScaleYUVToRGB32Row_SSE(
-      yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-      yuv_bytes.get() + kSourceVOffset, rgb_bytes_converted.get(), kWidth,
-      kSourceDx, GetLookupTable(YV12));
-  media::EmptyRegisterState();
-  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
-                               rgb_bytes_converted.get(), kWidth * kBpp));
-}
-#endif  // defined(OS_WIN) && (ARCH_CPU_X86 || COMPONENT_BUILD)
-
-TEST(YUVConvertTest, FilterYUVRows_C_OutOfBounds) {
-  std::unique_ptr<uint8_t[]> src(new uint8_t[16]);
-  std::unique_ptr<uint8_t[]> dst(new uint8_t[16]);
-
-  memset(src.get(), 0xff, 16);
-  memset(dst.get(), 0, 16);
-
-  media::FilterYUVRows_C(dst.get(), src.get(), src.get(), 1, 255);
-
-  EXPECT_EQ(255u, dst[0]);
-  for (int i = 1; i < 16; ++i) {
-    EXPECT_EQ(0u, dst[i]) << " not equal at " << i;
-  }
-}
-
-TEST(YUVConvertTest, FilterYUVRows_SSE2_OutOfBounds) {
-  base::CPU cpu;
-  if (!cpu.has_sse2()) {
-    LOG(WARNING) << "System not supported. Test skipped.";
-    return;
-  }
-
-  std::unique_ptr<uint8_t[]> src(new uint8_t[16]);
-  std::unique_ptr<uint8_t[]> dst(new uint8_t[16]);
-
-  memset(src.get(), 0xff, 16);
-  memset(dst.get(), 0, 16);
-
-  media::FilterYUVRows_SSE2(dst.get(), src.get(), src.get(), 1, 255);
-
-  EXPECT_EQ(255u, dst[0]);
-  for (int i = 1; i < 16; ++i) {
-    EXPECT_EQ(0u, dst[i]);
-  }
-}
-
-TEST(YUVConvertTest, FilterYUVRows_SSE2_UnalignedDestination) {
-  base::CPU cpu;
-  if (!cpu.has_sse2()) {
-    LOG(WARNING) << "System not supported. Test skipped.";
-    return;
-  }
-
-  const int kSize = 64;
-  std::unique_ptr<uint8_t[]> src(new uint8_t[kSize]);
-  std::unique_ptr<uint8_t[]> dst_sample(new uint8_t[kSize]);
-  std::unique_ptr<uint8_t[]> dst(new uint8_t[kSize]);
-
-  memset(dst_sample.get(), 0, kSize);
-  memset(dst.get(), 0, kSize);
-  for (int i = 0; i < kSize; ++i) src[i] = 100 + i;
-
-  media::FilterYUVRows_C(dst_sample.get(), src.get(), src.get(), 37, 128);
-
-  // Generate an unaligned output address.
-  uint8_t* dst_ptr = reinterpret_cast<uint8_t*>(
-      (reinterpret_cast<uintptr_t>(dst.get() + 16) & ~15) + 1);
-  media::FilterYUVRows_SSE2(dst_ptr, src.get(), src.get(), 37, 128);
-  media::EmptyRegisterState();
-
-  EXPECT_EQ(0, memcmp(dst_sample.get(), dst_ptr, 37));
-}
-
-#if defined(ARCH_CPU_X86_64)
-
-TEST(YUVConvertTest, ScaleYUVToRGB32Row_SSE2_X64) {
-  std::unique_ptr<uint8_t[]> yuv_bytes(new uint8_t[kYUV12Size]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_reference(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_converted(new uint8_t[kRGBSize]);
-  ReadYV12Data(&yuv_bytes);
-
-  const int kWidth = 167;
-  const int kSourceDx = 80000;  // This value means a scale down.
-  ScaleYUVToRGB32Row_C(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                       yuv_bytes.get() + kSourceVOffset,
-                       rgb_bytes_reference.get(), kWidth, kSourceDx,
-                       GetLookupTable(YV12));
-  ScaleYUVToRGB32Row_SSE2_X64(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                              yuv_bytes.get() + kSourceVOffset,
-                              rgb_bytes_converted.get(), kWidth, kSourceDx,
-                              GetLookupTable(YV12));
-  media::EmptyRegisterState();
-  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
-                               rgb_bytes_converted.get(), kWidth * kBpp));
-}
-
-TEST(YUVConvertTest, LinearScaleYUVToRGB32Row_MMX_X64) {
-  std::unique_ptr<uint8_t[]> yuv_bytes(new uint8_t[kYUV12Size]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_reference(new uint8_t[kRGBSize]);
-  std::unique_ptr<uint8_t[]> rgb_bytes_converted(new uint8_t[kRGBSize]);
-  ReadYV12Data(&yuv_bytes);
-
-  const int kWidth = 167;
-  const int kSourceDx = 80000;  // This value means a scale down.
-  LinearScaleYUVToRGB32Row_C(yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-                             yuv_bytes.get() + kSourceVOffset,
-                             rgb_bytes_reference.get(), kWidth, kSourceDx,
-                             GetLookupTable(YV12));
-  LinearScaleYUVToRGB32Row_MMX_X64(
-      yuv_bytes.get(), yuv_bytes.get() + kSourceUOffset,
-      yuv_bytes.get() + kSourceVOffset, rgb_bytes_converted.get(), kWidth,
-      kSourceDx, GetLookupTable(YV12));
-  media::EmptyRegisterState();
-  EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(),
-                               rgb_bytes_converted.get(), kWidth * kBpp));
-}
-
-#endif  // defined(ARCH_CPU_X86_64)
-
-#endif  // defined(ARCH_CPU_X86_FAMILY)
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/decoder_buffer_allocator.cc b/cobalt/media/decoder_buffer_allocator.cc
index 76ba23c..be9b8e6 100644
--- a/cobalt/media/decoder_buffer_allocator.cc
+++ b/cobalt/media/decoder_buffer_allocator.cc
@@ -18,7 +18,6 @@
 
 #include "cobalt/math/size.h"
 #include "cobalt/media/base/starboard_utils.h"
-#include "cobalt/media/base/video_resolution.h"
 #include "nb/allocator.h"
 #include "nb/memory_scope.h"
 #include "starboard/configuration.h"
@@ -47,11 +46,13 @@
       allocation_unit_(SbMediaGetBufferAllocationUnit()) {
   if (!using_memory_pool_) {
     DLOG(INFO) << "Allocated media buffer memory using SbMemory* functions.";
+    Allocator::Set(this);
     return;
   }
 
   if (is_memory_pool_allocated_on_demand_) {
     DLOG(INFO) << "Allocated media buffer pool on demand.";
+    Allocator::Set(this);
     return;
   }
 
@@ -62,9 +63,12 @@
   // UpdateVideoConfig().
   starboard::ScopedLock scoped_lock(mutex_);
   CreateReuseAllocator(0);
+  Allocator::Set(this);
 }
 
 DecoderBufferAllocator::~DecoderBufferAllocator() {
+  Allocator::Set(nullptr);
+
   if (!using_memory_pool_) {
     return;
   }
@@ -109,13 +113,12 @@
   }
 }
 
-DecoderBuffer::Allocator::Allocations DecoderBufferAllocator::Allocate(
-    size_t size, size_t alignment, intptr_t context) {
+void* DecoderBufferAllocator::Allocate(size_t size, size_t alignment) {
   TRACK_MEMORY_SCOPE("Media");
 
   if (!using_memory_pool_) {
     sbmemory_bytes_used_.fetch_add(size);
-    return Allocations(SbMemoryAllocateAligned(alignment, size), size);
+    return SbMemoryAllocateAligned(alignment, size);
   }
 
   starboard::ScopedLock scoped_lock(mutex_);
@@ -136,28 +139,25 @@
 
   void* p = reuse_allocator_->Allocate(size, alignment);
   if (!p) {
-    return Allocations();
+    return p;
   }
   LOG_IF(INFO, kEnableAllocationLog)
-      << "Media Allocation Log " << p << " " << size << " " << alignment << " "
-      << context;
-  if (!UpdateAllocationRecord()) {
-    // UpdateAllocationRecord may fail with non-NULL p when capacity is
-    // exceeded.
-    reuse_allocator_->Free(p);
-    return Allocations();
-  }
-  return Allocations(p, size);
+      << "Media Allocation Log " << p << " " << size << " " << alignment << " ";
+  UpdateAllocationRecord();
+  return p;
 }
 
-void DecoderBufferAllocator::Free(Allocations allocations) {
+void DecoderBufferAllocator::Free(void* p, size_t size) {
   TRACK_MEMORY_SCOPE("Media");
 
+  if (p == nullptr) {
+    DCHECK_EQ(size, 0);
+    return;
+  }
+
   if (!using_memory_pool_) {
-    for (int i = 0; i < allocations.number_of_buffers(); ++i) {
-      sbmemory_bytes_used_.fetch_sub(allocations.buffer_sizes()[i]);
-      SbMemoryDeallocateAligned(allocations.buffers()[i]);
-    }
+    sbmemory_bytes_used_.fetch_sub(size);
+    SbMemoryDeallocateAligned(p);
     return;
   }
 
@@ -165,15 +165,9 @@
 
   DCHECK(reuse_allocator_);
 
-  if (kEnableAllocationLog) {
-    DCHECK_EQ(allocations.number_of_buffers(), 1);
-    LOG(INFO) << "Media Allocation Log " << allocations.buffers()[0];
-  }
+  LOG_IF(INFO, kEnableAllocationLog) << "Media Allocation Log " << p;
 
-  for (int i = 0; i < allocations.number_of_buffers(); ++i) {
-    reuse_allocator_->Free(allocations.buffers()[i]);
-  }
-
+  reuse_allocator_->Free(p);
   if (is_memory_pool_allocated_on_demand_) {
     if (reuse_allocator_->GetAllocated() == 0) {
       DLOG(INFO) << "Freed " << reuse_allocator_->GetCapacity()
@@ -184,22 +178,24 @@
 }
 
 void DecoderBufferAllocator::UpdateVideoConfig(
-    const VideoDecoderConfig& config) {
+    const ::media::VideoDecoderConfig& config) {
   if (!using_memory_pool_) {
     return;
   }
 
   starboard::ScopedLock scoped_lock(mutex_);
 
-  video_codec_ = MediaVideoCodecToSbMediaVideoCodec(config.codec());
-  resolution_width_ = config.visible_rect().size().width();
-  resolution_height_ = config.visible_rect().size().height();
-  bits_per_pixel_ = config.webm_color_metadata().BitsPerChannel;
-
   if (!reuse_allocator_) {
     return;
   }
 
+  video_codec_ = MediaVideoCodecToSbMediaVideoCodec(config.codec());
+  resolution_width_ = config.visible_rect().size().width();
+  resolution_height_ = config.visible_rect().size().height();
+  // TODO(b/230799815): Consider infer |bits_per_pixel_| from the video codec,
+  // or deprecate it completely.
+  bits_per_pixel_ = 0;
+
   reuse_allocator_->IncreaseMaxCapacityIfNecessary(SbMediaGetMaxBufferCapacity(
       video_codec_, resolution_width_, resolution_height_, bits_per_pixel_));
   DLOG(INFO) << "Max capacity of decoder buffer allocator after increasing is "
diff --git a/cobalt/media/decoder_buffer_allocator.h b/cobalt/media/decoder_buffer_allocator.h
index 67e5352..274561d 100644
--- a/cobalt/media/decoder_buffer_allocator.h
+++ b/cobalt/media/decoder_buffer_allocator.h
@@ -18,20 +18,19 @@
 #include <memory>
 
 #include "base/compiler_specific.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/base/video_resolution.h"
 #include "cobalt/media/decoder_buffer_memory_info.h"
 #include "nb/bidirectional_fit_reuse_allocator.h"
 #include "nb/starboard_memory_allocator.h"
 #include "starboard/atomic.h"
 #include "starboard/common/mutex.h"
 #include "starboard/media.h"
+#include "third_party/chromium/media/base/decoder_buffer.h"
+#include "third_party/chromium/media/base/video_decoder_config.h"
 
 namespace cobalt {
 namespace media {
 
-class DecoderBufferAllocator : public DecoderBuffer::Allocator,
+class DecoderBufferAllocator : public ::media::DecoderBuffer::Allocator,
                                public DecoderBufferMemoryInfo {
  public:
   DecoderBufferAllocator();
@@ -40,14 +39,17 @@
   void Suspend();
   void Resume();
 
-  Allocations Allocate(size_t size, size_t alignment,
-                       intptr_t context) override;
-  void Free(Allocations allocations) override;
-  void UpdateVideoConfig(const VideoDecoderConfig& video_config) override;
+  // DecoderBuffer::Allocator methods.
+  void* Allocate(size_t size, size_t alignment) override;
+  void Free(void* p, size_t size) override;
+
+  // DecoderBufferMemoryInfo methods.
   size_t GetAllocatedMemory() const override;
   size_t GetCurrentMemoryCapacity() const override;
   size_t GetMaximumMemoryCapacity() const override;
 
+  void UpdateVideoConfig(const ::media::VideoDecoderConfig& video_config);
+
  private:
   void CreateReuseAllocator(int max_capacity);
 
diff --git a/cobalt/media/fetcher_buffered_data_source.cc b/cobalt/media/fetcher_buffered_data_source.cc
index 9eb25be..c8a9595 100644
--- a/cobalt/media/fetcher_buffered_data_source.cc
+++ b/cobalt/media/fetcher_buffered_data_source.cc
@@ -17,6 +17,7 @@
 #include <algorithm>
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
@@ -226,9 +227,14 @@
 
   size = static_cast<size_t>(std::min<uint64>(size, last_request_size_));
 
-  if (size == 0) {
+  if (size == 0 || size > buffer_.GetMaxCapacity()) {
     // The server side doesn't support range request.  Delete the fetcher to
     // stop the current request.
+    LOG(ERROR)
+        << "FetcherBufferedDataSource::OnURLFetchDownloadProgress: server "
+        << "doesn't support range requests (e.g. Python SimpleHTTPServer). "
+        << "Please use a server that supports range requests (e.g. Flask).";
+    error_occured_ = true;
     fetcher_.reset();
     ProcessPendingRead_Locked();
     UpdateDownloadingStatus(/* is_downloading = */ false);
diff --git a/cobalt/media/filters/chunk_demuxer.cc b/cobalt/media/filters/chunk_demuxer.cc
deleted file mode 100644
index cf5a4bd..0000000
--- a/cobalt/media/filters/chunk_demuxer.cc
+++ /dev/null
@@ -1,1439 +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 "cobalt/media/filters/chunk_demuxer.h"
-
-#include <algorithm>
-#include <limits>
-#include <memory>
-#include <utility>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/location.h"
-#include "base/metrics/histogram.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/trace_event/trace_event.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/mime_util.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/base/video_codecs.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/filters/frame_processor.h"
-#include "cobalt/media/filters/stream_parser_factory.h"
-#include "starboard/configuration.h"
-
-using base::TimeDelta;
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-// Parse type and codecs from mime type. It will return "video/mp4" and
-// "avc1.42E01E, mp4a.40.2" for "video/mp4; codecs="avc1.42E01E, mp4a.40.2".
-// Note that this function does minimum validation as the media stack will check
-// the type and codecs strictly.
-bool ParseMimeType(const std::string& mime_type, std::string* type,
-                   std::string* codecs) {
-  DCHECK(type);
-  DCHECK(codecs);
-  static const char kCodecs[] = "codecs=";
-
-  // SplitString will also trim the results.
-  std::vector<std::string> tokens = ::base::SplitString(
-      mime_type, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  // The first one has to be mime type with delimiter '/' like 'video/mp4'.
-  if (tokens.size() < 2 || tokens[0].find('/') == tokens[0].npos) {
-    return false;
-  }
-  *type = tokens[0];
-  for (size_t i = 1; i < tokens.size(); ++i) {
-    if (base::strncasecmp(tokens[i].c_str(), kCodecs, strlen(kCodecs))) {
-      continue;
-    }
-    *codecs = tokens[i].substr(strlen("codecs="));
-    base::TrimString(*codecs, " \"", codecs);
-    break;
-  }
-  return !codecs->empty();
-}
-
-}  // namespace
-
-ChunkDemuxerStream::ChunkDemuxerStream(Type type, const std::string& mime,
-                                       bool splice_frames_enabled,
-                                       MediaTrack::Id media_track_id)
-    : type_(type),
-      mime_(mime),
-      liveness_(DemuxerStream::LIVENESS_UNKNOWN),
-      media_track_id_(media_track_id),
-      state_(UNINITIALIZED),
-      splice_frames_enabled_(splice_frames_enabled),
-      partial_append_window_trimming_enabled_(false),
-      is_enabled_(true) {}
-
-void ChunkDemuxerStream::StartReturningData() {
-  DVLOG(1) << "ChunkDemuxerStream::StartReturningData()";
-  base::AutoLock auto_lock(lock_);
-  DCHECK(read_cb_.is_null());
-  ChangeState_Locked(RETURNING_DATA_FOR_READS);
-}
-
-void ChunkDemuxerStream::AbortReads() {
-  DVLOG(1) << "ChunkDemuxerStream::AbortReads()";
-  base::AutoLock auto_lock(lock_);
-  ChangeState_Locked(RETURNING_ABORT_FOR_READS);
-  if (!read_cb_.is_null()) base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
-}
-
-void ChunkDemuxerStream::CompletePendingReadIfPossible() {
-  base::AutoLock auto_lock(lock_);
-  if (read_cb_.is_null()) return;
-
-  CompletePendingReadIfPossible_Locked();
-}
-
-void ChunkDemuxerStream::Shutdown() {
-  DVLOG(1) << "ChunkDemuxerStream::Shutdown()";
-  base::AutoLock auto_lock(lock_);
-  ChangeState_Locked(SHUTDOWN);
-
-  // Pass an end of stream buffer to the pending callback to signal that no more
-  // data will be sent.
-  if (!read_cb_.is_null()) {
-    base::ResetAndReturn(&read_cb_).Run(DemuxerStream::kOk,
-                                        StreamParserBuffer::CreateEOSBuffer());
-  }
-}
-
-bool ChunkDemuxerStream::IsSeekWaitingForData() const {
-  base::AutoLock auto_lock(lock_);
-
-  // This method should not be called for text tracks. See the note in
-  // SourceBufferState::IsSeekWaitingForData().
-  DCHECK_NE(type_, DemuxerStream::TEXT);
-
-  return stream_->IsSeekPending();
-}
-
-base::TimeDelta ChunkDemuxerStream::GetSeekKeyframeTimestamp() const {
-  base::AutoLock auto_lock(lock_);
-  return stream_->GetSeekKeyframeTimestamp();
-}
-
-void ChunkDemuxerStream::Seek(TimeDelta time) {
-  DVLOG(1) << "ChunkDemuxerStream::Seek(" << time.InSecondsF() << ")";
-  base::AutoLock auto_lock(lock_);
-  DCHECK(read_cb_.is_null());
-  DCHECK(state_ == UNINITIALIZED || state_ == RETURNING_ABORT_FOR_READS)
-      << state_;
-
-  stream_->Seek(time);
-}
-
-bool ChunkDemuxerStream::Append(const StreamParser::BufferQueue& buffers) {
-  if (buffers.empty()) return false;
-
-  base::AutoLock auto_lock(lock_);
-  DCHECK_NE(state_, SHUTDOWN);
-  if (!stream_->Append(buffers)) {
-    DVLOG(1) << "ChunkDemuxerStream::Append() : stream append failed";
-    return false;
-  }
-
-  if (!read_cb_.is_null()) CompletePendingReadIfPossible_Locked();
-
-  return true;
-}
-
-void ChunkDemuxerStream::Remove(TimeDelta start, TimeDelta end,
-                                TimeDelta duration) {
-  base::AutoLock auto_lock(lock_);
-  stream_->Remove(start, end, duration);
-}
-
-bool ChunkDemuxerStream::EvictCodedFrames(DecodeTimestamp media_time,
-                                          size_t newDataSize) {
-  base::AutoLock auto_lock(lock_);
-  return stream_->GarbageCollectIfNeeded(media_time, newDataSize);
-}
-
-void ChunkDemuxerStream::OnSetDuration(TimeDelta duration) {
-  base::AutoLock auto_lock(lock_);
-  stream_->OnSetDuration(duration);
-}
-
-Ranges<TimeDelta> ChunkDemuxerStream::GetBufferedRanges(
-    TimeDelta duration) const {
-  base::AutoLock auto_lock(lock_);
-
-  if (type_ == TEXT) {
-    // Since text tracks are discontinuous and the lack of cues should not block
-    // playback, report the buffered range for text tracks as [0, |duration|) so
-    // that intersections with audio & video tracks are computed correctly when
-    // no cues are present.
-    Ranges<TimeDelta> text_range;
-    text_range.Add(TimeDelta(), duration);
-    return text_range;
-  }
-
-  Ranges<TimeDelta> range = stream_->GetBufferedTime();
-
-  if (range.size() == 0u) return range;
-
-  // Clamp the end of the stream's buffered ranges to fit within the duration.
-  // This can be done by intersecting the stream's range with the valid time
-  // range.
-  Ranges<TimeDelta> valid_time_range;
-  valid_time_range.Add(range.start(0), duration);
-  return range.IntersectionWith(valid_time_range);
-}
-
-TimeDelta ChunkDemuxerStream::GetHighestPresentationTimestamp() const {
-  return stream_->GetHighestPresentationTimestamp();
-}
-
-TimeDelta ChunkDemuxerStream::GetBufferedDuration() const {
-  return stream_->GetBufferedDuration();
-}
-
-size_t ChunkDemuxerStream::GetBufferedSize() const {
-  return stream_->GetBufferedSize();
-}
-
-void ChunkDemuxerStream::OnStartOfCodedFrameGroup(
-    DecodeTimestamp start_timestamp) {
-  DVLOG(2) << "ChunkDemuxerStream::OnStartOfCodedFrameGroup("
-           << start_timestamp.InSecondsF() << ")";
-  base::AutoLock auto_lock(lock_);
-  stream_->OnStartOfCodedFrameGroup(start_timestamp);
-}
-
-bool ChunkDemuxerStream::UpdateAudioConfig(
-    const AudioDecoderConfig& config,
-    const scoped_refptr<MediaLog>& media_log) {
-  DCHECK(config.IsValidConfig());
-  DCHECK_EQ(type_, AUDIO);
-  base::AutoLock auto_lock(lock_);
-  if (!stream_) {
-    DCHECK_EQ(state_, UNINITIALIZED);
-
-    // On platforms which support splice frames, enable splice frames and
-    // partial append window support for most codecs (notably: not opus).
-    const bool codec_supported = config.codec() == kCodecMP3 ||
-                                 config.codec() == kCodecAAC ||
-                                 config.codec() == kCodecVorbis;
-    splice_frames_enabled_ = splice_frames_enabled_ && codec_supported;
-    partial_append_window_trimming_enabled_ =
-        splice_frames_enabled_ && codec_supported;
-
-    stream_.reset(
-        new SourceBufferStream(config, media_log, splice_frames_enabled_));
-    return true;
-  }
-
-  return stream_->UpdateAudioConfig(config);
-}
-
-bool ChunkDemuxerStream::UpdateVideoConfig(
-    const VideoDecoderConfig& config,
-    const scoped_refptr<MediaLog>& media_log) {
-  DCHECK(config.IsValidConfig());
-  DCHECK_EQ(type_, VIDEO);
-  base::AutoLock auto_lock(lock_);
-
-  if (!stream_) {
-    DCHECK_EQ(state_, UNINITIALIZED);
-    stream_.reset(
-        new SourceBufferStream(config, media_log, splice_frames_enabled_));
-    return true;
-  }
-
-  return stream_->UpdateVideoConfig(config);
-}
-
-void ChunkDemuxerStream::UpdateTextConfig(
-    const TextTrackConfig& config, const scoped_refptr<MediaLog>& media_log) {
-  DCHECK_EQ(type_, TEXT);
-  base::AutoLock auto_lock(lock_);
-  DCHECK(!stream_);
-  DCHECK_EQ(state_, UNINITIALIZED);
-  stream_.reset(
-      new SourceBufferStream(config, media_log, splice_frames_enabled_));
-}
-
-void ChunkDemuxerStream::MarkEndOfStream() {
-  base::AutoLock auto_lock(lock_);
-  stream_->MarkEndOfStream();
-}
-
-void ChunkDemuxerStream::UnmarkEndOfStream() {
-  base::AutoLock auto_lock(lock_);
-  stream_->UnmarkEndOfStream();
-}
-
-// DemuxerStream methods.
-void ChunkDemuxerStream::Read(const ReadCB& read_cb) {
-  base::AutoLock auto_lock(lock_);
-  DCHECK_NE(state_, UNINITIALIZED);
-  DCHECK(read_cb_.is_null());
-
-  read_cb_ = BindToCurrentLoop(read_cb);
-
-  if (!is_enabled_) {
-    DVLOG(1) << "Read from disabled stream, returning EOS";
-    base::ResetAndReturn(&read_cb_).Run(kOk,
-                                        StreamParserBuffer::CreateEOSBuffer());
-    return;
-  }
-
-  CompletePendingReadIfPossible_Locked();
-}
-
-DemuxerStream::Type ChunkDemuxerStream::type() const { return type_; }
-
-DemuxerStream::Liveness ChunkDemuxerStream::liveness() const {
-  base::AutoLock auto_lock(lock_);
-  return liveness_;
-}
-
-AudioDecoderConfig ChunkDemuxerStream::audio_decoder_config() {
-  CHECK_EQ(type_, AUDIO);
-  base::AutoLock auto_lock(lock_);
-  auto config = stream_->GetCurrentAudioDecoderConfig();
-  config.set_mime(mime_);
-  return config;
-}
-
-VideoDecoderConfig ChunkDemuxerStream::video_decoder_config() {
-  CHECK_EQ(type_, VIDEO);
-  base::AutoLock auto_lock(lock_);
-  auto config = stream_->GetCurrentVideoDecoderConfig();
-  config.set_mime(mime_);
-  return config;
-}
-
-bool ChunkDemuxerStream::SupportsConfigChanges() { return true; }
-
-VideoRotation ChunkDemuxerStream::video_rotation() { return VIDEO_ROTATION_0; }
-
-bool ChunkDemuxerStream::enabled() const {
-  base::AutoLock auto_lock(lock_);
-  return is_enabled_;
-}
-
-void ChunkDemuxerStream::set_enabled(bool enabled, base::TimeDelta timestamp) {
-  base::AutoLock auto_lock(lock_);
-
-  if (enabled == is_enabled_) return;
-
-  is_enabled_ = enabled;
-  if (enabled) {
-    DCHECK(stream_);
-    stream_->Seek(timestamp);
-  } else if (!read_cb_.is_null()) {
-    DVLOG(1) << "Read from disabled stream, returning EOS";
-    base::ResetAndReturn(&read_cb_).Run(kOk,
-                                        StreamParserBuffer::CreateEOSBuffer());
-  }
-  if (!stream_status_change_cb_.is_null())
-    stream_status_change_cb_.Run(is_enabled_, timestamp);
-}
-
-void ChunkDemuxerStream::SetStreamStatusChangeCB(
-    const StreamStatusChangeCB& cb) {
-  DCHECK(!cb.is_null());
-  stream_status_change_cb_ = BindToCurrentLoop(cb);
-}
-
-TextTrackConfig ChunkDemuxerStream::text_track_config() {
-  CHECK_EQ(type_, TEXT);
-  base::AutoLock auto_lock(lock_);
-  return stream_->GetCurrentTextTrackConfig();
-}
-
-void ChunkDemuxerStream::SetStreamMemoryLimit(size_t memory_limit) {
-  stream_->set_memory_limit(memory_limit);
-}
-
-void ChunkDemuxerStream::SetLiveness(Liveness liveness) {
-  base::AutoLock auto_lock(lock_);
-  liveness_ = liveness;
-}
-
-void ChunkDemuxerStream::ChangeState_Locked(State state) {
-  lock_.AssertAcquired();
-  DVLOG(1) << "ChunkDemuxerStream::ChangeState_Locked() : "
-           << "type " << type_ << " - " << state_ << " -> " << state;
-  state_ = state;
-}
-
-ChunkDemuxerStream::~ChunkDemuxerStream() {}
-
-void ChunkDemuxerStream::CompletePendingReadIfPossible_Locked() {
-  lock_.AssertAcquired();
-  DCHECK(!read_cb_.is_null());
-
-  DemuxerStream::Status status = DemuxerStream::kAborted;
-  scoped_refptr<StreamParserBuffer> buffer;
-
-  switch (state_) {
-    case UNINITIALIZED:
-      NOTREACHED();
-      return;
-    case RETURNING_DATA_FOR_READS:
-      switch (stream_->GetNextBuffer(&buffer)) {
-        case SourceBufferStream::kSuccess:
-          status = DemuxerStream::kOk;
-          DVLOG(2) << __func__ << ": returning kOk, type " << type_ << ", dts "
-                   << buffer->GetDecodeTimestamp().InSecondsF() << ", pts "
-                   << buffer->timestamp().InSecondsF() << ", dur "
-                   << buffer->duration().InSecondsF() << ", key "
-                   << buffer->is_key_frame();
-          break;
-        case SourceBufferStream::kNeedBuffer:
-          // Return early without calling |read_cb_| since we don't have
-          // any data to return yet.
-          DVLOG(2) << __func__ << ": returning kNeedBuffer, type " << type_;
-          return;
-        case SourceBufferStream::kEndOfStream:
-          status = DemuxerStream::kOk;
-          buffer = StreamParserBuffer::CreateEOSBuffer();
-          DVLOG(2) << __func__ << ": returning kOk with EOS buffer, type "
-                   << type_;
-          break;
-        case SourceBufferStream::kConfigChange:
-          status = kConfigChanged;
-          buffer = NULL;
-          DVLOG(2) << __func__ << ": returning kConfigChange, type " << type_;
-          break;
-      }
-      break;
-    case RETURNING_ABORT_FOR_READS:
-      // Null buffers should be returned in this state since we are waiting
-      // for a seek. Any buffers in the SourceBuffer should NOT be returned
-      // because they are associated with the seek.
-      status = DemuxerStream::kAborted;
-      buffer = NULL;
-      DVLOG(2) << __func__ << ": returning kAborted, type " << type_;
-      break;
-    case SHUTDOWN:
-      status = DemuxerStream::kOk;
-      buffer = StreamParserBuffer::CreateEOSBuffer();
-      DVLOG(2) << __func__ << ": returning kOk with EOS buffer, type " << type_;
-      break;
-  }
-
-  base::ResetAndReturn(&read_cb_).Run(status, buffer);
-}
-
-ChunkDemuxer::ChunkDemuxer(
-    DecoderBuffer::Allocator* buffer_allocator, const base::Closure& open_cb,
-    const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-    const scoped_refptr<MediaLog>& media_log, bool splice_frames_enabled)
-    : buffer_allocator_(buffer_allocator),
-      state_(WAITING_FOR_INIT),
-      cancel_next_seek_(false),
-      host_(NULL),
-      open_cb_(open_cb),
-      encrypted_media_init_data_cb_(encrypted_media_init_data_cb),
-      enable_text_(false),
-      media_log_(media_log),
-      duration_(kNoTimestamp),
-      user_specified_duration_(-1),
-      liveness_(DemuxerStream::LIVENESS_UNKNOWN),
-      splice_frames_enabled_(splice_frames_enabled),
-      detected_audio_track_count_(0),
-      detected_video_track_count_(0),
-      detected_text_track_count_(0) {
-  DCHECK(buffer_allocator_);
-  DCHECK(!open_cb_.is_null());
-  DCHECK(!encrypted_media_init_data_cb_.is_null());
-}
-
-std::string ChunkDemuxer::GetDisplayName() const { return "ChunkDemuxer"; }
-
-void ChunkDemuxer::Initialize(DemuxerHost* host,
-                              const PipelineStatusCB& init_cb,
-                              bool enable_text_tracks) {
-  TRACE_EVENT0("cobalt::media", "ChunkDemuxer::Initialize");
-  DLOG(INFO) << "This is an ASYNC MEDIA SOURCE playback.";
-  DVLOG(1) << "Init()";
-
-  base::AutoLock auto_lock(lock_);
-  if (state_ == SHUTDOWN) {
-    // Init cb must only be run after this method returns, so post.
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(init_cb, DEMUXER_ERROR_COULD_NOT_OPEN));
-    return;
-  }
-
-  DCHECK_EQ(state_, WAITING_FOR_INIT);
-  host_ = host;
-  // Do not post init_cb once this function returns because if there is an
-  // error after initialization, the error might be reported before init_cb
-  // has a chance to run. This is because ChunkDemuxer::ReportError_Locked
-  // directly calls DemuxerHost::OnDemuxerError: crbug.com/633016.
-  init_cb_ = init_cb;
-  enable_text_ = enable_text_tracks;
-
-  ChangeState_Locked(INITIALIZING);
-
-  base::ResetAndReturn(&open_cb_).Run();
-}
-
-void ChunkDemuxer::Stop() {
-  DVLOG(1) << "Stop()";
-  Shutdown();
-}
-
-void ChunkDemuxer::Seek(TimeDelta time, const PipelineStatusCB& cb) {
-  DVLOG(1) << "Seek(" << time.InSecondsF() << ")";
-  DCHECK(time >= TimeDelta());
-
-  base::AutoLock auto_lock(lock_);
-  DCHECK(seek_cb_.is_null());
-
-  seek_cb_ = BindToCurrentLoop(cb);
-  if (state_ != INITIALIZED && state_ != ENDED) {
-    base::ResetAndReturn(&seek_cb_).Run(PIPELINE_ERROR_INVALID_STATE);
-    return;
-  }
-
-  if (cancel_next_seek_) {
-    cancel_next_seek_ = false;
-    base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
-    return;
-  }
-
-  SeekAllSources(time);
-
-#if SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
-  const bool kReturningDataUntilSeekFinished = true;
-#else   // SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
-  const bool kReturningDataUntilSeekFinished = false;
-#endif  // SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
-
-  // Usually all encoded audio frames are key frames while not all encoded video
-  // frames are key frames.
-  //
-  // After a seek to |time|, the audio ChunkDemuxerStream will return encoded
-  // audio frames right before |time|.  The audio decoder can decode them
-  // without knowledge of prior encoded audio frames.  However, the video
-  // ChunkDemuxerStream has to return encoded video frames from the key frame
-  // whose timestamp is at or before |time|.  Depending on the structure of the
-  // video stream, the gap between the timestamp of the key frame and |time| can
-  // be several seconds or more.  So there is a difference between the
-  // timestamps of the first audio frame and the first video frame returned
-  // after a seek.  Most modern platforms can play the audio data as is and
-  // quickly decode the video frames whose timestamp is earlier than the first
-  // audio frame without displaying them.  This allows the video playback to
-  // "catch up" with the audio playback.
-  //
-  // SB_HAS_QUIRK(SEEK_TO_KEYFRAME) is enabled on platforms that don't support
-  // such "catch up" behaviour, where the audio ChunkDemuxerStream should start
-  // to return audio frame whose timestamp is earlier than the video key frame,
-  // instead of |time|.  So StartReturningData() should be delayed until all
-  // ChunkDemuxerStreams are seeked.
-  if (!kReturningDataUntilSeekFinished) {
-    StartReturningData();
-  }
-
-  if (IsSeekWaitingForData_Locked()) {
-    DVLOG(1) << "Seek() : waiting for more data to arrive.";
-    return;
-  }
-
-  if (kReturningDataUntilSeekFinished) {
-    AdjustSeekOnAudioSource();
-    StartReturningData();
-  }
-
-  base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
-}
-
-// Demuxer implementation.
-base::Time ChunkDemuxer::GetTimelineOffset() const { return timeline_offset_; }
-
-DemuxerStream* ChunkDemuxer::GetStream(DemuxerStream::Type type) {
-  DCHECK_NE(type, DemuxerStream::TEXT);
-  base::AutoLock auto_lock(lock_);
-
-  // TODO: For now return only the first enabled audio/video stream, since this
-  // GetStream method is part of the implementation of the DemuxerStreamProvider
-  // interface that is used in many places and can't be changed easily. It will
-  // be fixed later, when we add support for multiple streams/tracks in
-  // DemuxerStreamProvider, tracked by crbug.com/646669
-  if (type == DemuxerStream::AUDIO) {
-    for (size_t i = 0; i < audio_streams_.size(); ++i) {
-      if (audio_streams_[i]->enabled()) return audio_streams_[i].get();
-    }
-  }
-
-  if (type == DemuxerStream::VIDEO) {
-    for (size_t i = 0; i < video_streams_.size(); ++i) {
-      if (video_streams_[i]->enabled()) return video_streams_[i].get();
-    }
-  }
-
-  return NULL;
-}
-
-TimeDelta ChunkDemuxer::GetStartTime() const { return TimeDelta(); }
-
-int64_t ChunkDemuxer::GetMemoryUsage() const {
-  base::AutoLock auto_lock(lock_);
-  int64_t mem = 0;
-  for (size_t i = 0; i < audio_streams_.size(); ++i)
-    mem += audio_streams_[i]->GetBufferedSize();
-  for (size_t i = 0; i < video_streams_.size(); ++i)
-    mem += video_streams_[i]->GetBufferedSize();
-  return mem;
-}
-
-void ChunkDemuxer::AbortPendingReads() {
-  base::AutoLock auto_lock(lock_);
-  DCHECK(state_ == INITIALIZED || state_ == ENDED || state_ == SHUTDOWN ||
-         state_ == PARSE_ERROR)
-      << state_;
-
-  if (state_ == SHUTDOWN || state_ == PARSE_ERROR) return;
-
-  AbortPendingReads_Locked();
-}
-
-void ChunkDemuxer::StartWaitingForSeek(TimeDelta seek_time) {
-  DVLOG(1) << "StartWaitingForSeek()";
-  base::AutoLock auto_lock(lock_);
-  DCHECK(state_ == INITIALIZED || state_ == ENDED || state_ == SHUTDOWN ||
-         state_ == PARSE_ERROR)
-      << state_;
-  DCHECK(seek_cb_.is_null());
-
-  if (state_ == SHUTDOWN || state_ == PARSE_ERROR) return;
-
-  AbortPendingReads_Locked();
-  SeekAllSources(seek_time);
-
-  // Cancel state set in CancelPendingSeek() since we want to
-  // accept the next Seek().
-  cancel_next_seek_ = false;
-}
-
-void ChunkDemuxer::CancelPendingSeek(TimeDelta seek_time) {
-  base::AutoLock auto_lock(lock_);
-  DCHECK_NE(state_, INITIALIZING);
-  DCHECK(seek_cb_.is_null() || IsSeekWaitingForData_Locked());
-
-  if (cancel_next_seek_) return;
-
-  AbortPendingReads_Locked();
-  SeekAllSources(seek_time);
-
-  if (seek_cb_.is_null()) {
-    cancel_next_seek_ = true;
-    return;
-  }
-
-  base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
-}
-
-ChunkDemuxer::Status ChunkDemuxer::AddId(const std::string& id,
-                                         const std::string& mime) {
-  DVLOG(1) << __func__ << " id=" << id << " mime_type=" << mime;
-
-  std::string type;
-  std::string codecs;
-
-  if (!ParseMimeType(mime, &type, &codecs)) {
-    return kNotSupported;
-  }
-
-  base::AutoLock auto_lock(lock_);
-
-  if ((state_ != WAITING_FOR_INIT && state_ != INITIALIZING) || IsValidId(id))
-    return kReachedIdLimit;
-
-  std::vector<std::string> parsed_codec_ids;
-  media::ParseCodecString(codecs, &parsed_codec_ids, false);
-
-  std::unique_ptr<media::StreamParser> stream_parser(
-      StreamParserFactory::Create(buffer_allocator_, type, parsed_codec_ids,
-                                  media_log_));
-
-  if (!stream_parser) return ChunkDemuxer::kNotSupported;
-
-  std::unique_ptr<FrameProcessor> frame_processor(
-      new FrameProcessor(base::Bind(&ChunkDemuxer::IncreaseDurationIfNecessary,
-                                    base::Unretained(this)),
-                         media_log_));
-
-  std::unique_ptr<SourceBufferState> source_state(new SourceBufferState(
-      std::move(stream_parser), std::move(frame_processor),
-      base::Bind(&ChunkDemuxer::CreateDemuxerStream, base::Unretained(this), id,
-                 mime),
-      media_log_, buffer_allocator_));
-
-  SourceBufferState::NewTextTrackCB new_text_track_cb;
-
-  if (enable_text_) {
-    new_text_track_cb =
-        base::Bind(&ChunkDemuxer::OnNewTextTrack, base::Unretained(this));
-  }
-
-  pending_source_init_ids_.insert(id);
-
-  std::string expected_sbs_codecs = codecs;
-  if (codecs == "" && type == "audio/aac") expected_sbs_codecs = "aac";
-  if (codecs == "" && (type == "audio/mpeg" || type == "audio/mp3"))
-    expected_sbs_codecs = "mp3";
-
-  source_state->Init(
-      base::Bind(&ChunkDemuxer::OnSourceInitDone, base::Unretained(this), id),
-      expected_sbs_codecs, encrypted_media_init_data_cb_, new_text_track_cb);
-
-  source_state_map_[id] = source_state.release();
-  return kOk;
-}
-
-void ChunkDemuxer::SetTracksWatcher(
-    const std::string& id, const MediaTracksUpdatedCB& tracks_updated_cb) {
-  base::AutoLock auto_lock(lock_);
-  CHECK(IsValidId(id));
-  source_state_map_[id]->SetTracksWatcher(tracks_updated_cb);
-}
-
-void ChunkDemuxer::RemoveId(const std::string& id) {
-  DVLOG(1) << __func__ << " id=" << id;
-  base::AutoLock auto_lock(lock_);
-  CHECK(IsValidId(id));
-
-  delete source_state_map_[id];
-  source_state_map_.erase(id);
-  pending_source_init_ids_.erase(id);
-  // Remove demuxer streams created for this id.
-  std::vector<ChunkDemuxerStream*>& streams = id_to_streams_map_[id];
-  for (std::vector<ChunkDemuxerStream*>::const_iterator iter = streams.begin();
-       iter != streams.end(); ++iter) {
-    bool stream_found = false;
-    for (size_t i = 0; i < audio_streams_.size(); ++i) {
-      if (audio_streams_[i].get() == *iter) {
-        stream_found = true;
-        removed_streams_.push_back(std::move(audio_streams_[i]));
-        audio_streams_.erase(audio_streams_.begin() + i);
-        break;
-      }
-    }
-    if (stream_found) continue;
-    for (size_t i = 0; i < video_streams_.size(); ++i) {
-      if (video_streams_[i].get() == *iter) {
-        stream_found = true;
-        removed_streams_.push_back(std::move(video_streams_[i]));
-        video_streams_.erase(video_streams_.begin() + i);
-        break;
-      }
-    }
-    CHECK(stream_found);
-  }
-  id_to_streams_map_.erase(id);
-}
-
-Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges(const std::string& id) const {
-  base::AutoLock auto_lock(lock_);
-  DCHECK(!id.empty());
-
-  SourceBufferStateMap::const_iterator itr = source_state_map_.find(id);
-
-  DCHECK(itr != source_state_map_.end());
-  return itr->second->GetBufferedRanges(duration_, state_ == ENDED);
-}
-
-base::TimeDelta ChunkDemuxer::GetHighestPresentationTimestamp(
-    const std::string& id) const {
-  base::AutoLock auto_lock(lock_);
-  DCHECK(!id.empty());
-
-  SourceBufferStateMap::const_iterator itr = source_state_map_.find(id);
-
-  DCHECK(itr != source_state_map_.end());
-  return itr->second->GetHighestPresentationTimestamp();
-}
-
-void ChunkDemuxer::OnEnabledAudioTracksChanged(
-    const std::vector<MediaTrack::Id>& track_ids, base::TimeDelta currTime) {
-  base::AutoLock auto_lock(lock_);
-  std::set<DemuxerStream*> enabled_streams;
-  for (size_t i = 0; i < track_ids.size(); ++i) {
-    DemuxerStream* stream = track_id_to_demux_stream_map_[track_ids[i]];
-    DCHECK(stream);
-    DCHECK_EQ(DemuxerStream::AUDIO, stream->type());
-    enabled_streams.insert(stream);
-  }
-
-  // First disable all streams that need to be disabled and then enable streams
-  // that are enabled.
-  for (size_t i = 0; i < audio_streams_.size(); ++i) {
-    if (enabled_streams.find(audio_streams_[i].get()) ==
-        enabled_streams.end()) {
-      DVLOG(1) << __func__ << ": disabling stream " << audio_streams_[i].get();
-      audio_streams_[i]->set_enabled(false, currTime);
-    }
-  }
-  for (std::set<DemuxerStream*>::iterator iter = enabled_streams.begin();
-       iter != enabled_streams.end(); ++iter) {
-    DVLOG(1) << __func__ << ": enabling stream " << *iter;
-    (*iter)->set_enabled(true, currTime);
-  }
-}
-
-void ChunkDemuxer::OnSelectedVideoTrackChanged(
-    const std::vector<MediaTrack::Id>& track_ids, base::TimeDelta currTime) {
-  DCHECK_LE(track_ids.size(), 1u);
-
-  base::AutoLock auto_lock(lock_);
-  DemuxerStream* selected_stream = NULL;
-  if (!track_ids.empty()) {
-    selected_stream = track_id_to_demux_stream_map_[track_ids[0]];
-    DCHECK(selected_stream);
-    DCHECK_EQ(DemuxerStream::VIDEO, selected_stream->type());
-  }
-
-  // First disable all streams that need to be disabled and then enable the
-  // stream that needs to be enabled (if any).
-  for (size_t i = 0; i < video_streams_.size(); ++i) {
-    if (video_streams_[i].get() != selected_stream) {
-      DVLOG(1) << __func__ << ": disabling stream " << video_streams_[i].get();
-      DCHECK_EQ(DemuxerStream::VIDEO, video_streams_[i]->type());
-      video_streams_[i]->set_enabled(false, currTime);
-    }
-  }
-  if (selected_stream) {
-    DVLOG(1) << __func__ << ": enabling stream " << selected_stream;
-    selected_stream->set_enabled(true, currTime);
-  }
-}
-
-bool ChunkDemuxer::EvictCodedFrames(const std::string& id,
-                                    base::TimeDelta currentMediaTime,
-                                    size_t newDataSize) {
-  DVLOG(1) << __func__ << "(" << id << ")"
-           << " media_time=" << currentMediaTime.InSecondsF()
-           << " newDataSize=" << newDataSize;
-  base::AutoLock auto_lock(lock_);
-
-  // Note: The direct conversion from PTS to DTS is safe here, since we don't
-  // need to know currentTime precisely for GC. GC only needs to know which GOP
-  // currentTime points to.
-  DecodeTimestamp media_time_dts =
-      DecodeTimestamp::FromPresentationTime(currentMediaTime);
-
-  DCHECK(!id.empty());
-  SourceBufferStateMap::iterator itr = source_state_map_.find(id);
-  if (itr == source_state_map_.end()) {
-    LOG(WARNING) << __func__ << " stream " << id << " not found";
-    return false;
-  }
-  return itr->second->EvictCodedFrames(media_time_dts, newDataSize);
-}
-
-bool ChunkDemuxer::AppendData(const std::string& id, const uint8_t* data,
-                              size_t length, TimeDelta append_window_start,
-                              TimeDelta append_window_end,
-                              TimeDelta* timestamp_offset) {
-  DVLOG(1) << "AppendData(" << id << ", " << length << ")";
-
-  DCHECK(!id.empty());
-  DCHECK(timestamp_offset);
-
-  Ranges<TimeDelta> ranges;
-
-  {
-    base::AutoLock auto_lock(lock_);
-    DCHECK_NE(state_, ENDED);
-
-    // Capture if any of the SourceBuffers are waiting for data before we start
-    // parsing.
-    bool old_waiting_for_data = IsSeekWaitingForData_Locked();
-
-    if (length == 0u) return true;
-
-    DCHECK(data);
-
-    switch (state_) {
-      case INITIALIZING:
-      case INITIALIZED:
-        DCHECK(IsValidId(id));
-        if (!source_state_map_[id]->Append(data, length, append_window_start,
-                                           append_window_end,
-                                           timestamp_offset)) {
-          ReportError_Locked(CHUNK_DEMUXER_ERROR_APPEND_FAILED);
-          return false;
-        }
-        break;
-
-      case PARSE_ERROR:
-      case WAITING_FOR_INIT:
-      case ENDED:
-      case SHUTDOWN:
-        DVLOG(1) << "AppendData(): called in unexpected state " << state_;
-        return false;
-    }
-
-    // Check to see if data was appended at the pending seek point. This
-    // indicates we have parsed enough data to complete the seek.
-    if (old_waiting_for_data && !IsSeekWaitingForData_Locked() &&
-        !seek_cb_.is_null()) {
-#if SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
-      AdjustSeekOnAudioSource();
-      StartReturningData();
-#endif  // SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
-      base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
-    }
-
-    ranges = GetBufferedRanges_Locked();
-  }
-
-  host_->OnBufferedTimeRangesChanged(ranges);
-  return true;
-}
-
-void ChunkDemuxer::ResetParserState(const std::string& id,
-                                    TimeDelta append_window_start,
-                                    TimeDelta append_window_end,
-                                    TimeDelta* timestamp_offset) {
-  DVLOG(1) << "ResetParserState(" << id << ")";
-  base::AutoLock auto_lock(lock_);
-  DCHECK(!id.empty());
-  CHECK(IsValidId(id));
-  bool old_waiting_for_data = IsSeekWaitingForData_Locked();
-  source_state_map_[id]->ResetParserState(append_window_start,
-                                          append_window_end, timestamp_offset);
-  // ResetParserState can possibly emit some buffers.
-  // Need to check whether seeking can be completed.
-  if (old_waiting_for_data && !IsSeekWaitingForData_Locked() &&
-      !seek_cb_.is_null()) {
-    base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
-  }
-}
-
-void ChunkDemuxer::Remove(const std::string& id, TimeDelta start,
-                          TimeDelta end) {
-  DVLOG(1) << "Remove(" << id << ", " << start.InSecondsF() << ", "
-           << end.InSecondsF() << ")";
-  base::AutoLock auto_lock(lock_);
-
-  DCHECK(!id.empty());
-  CHECK(IsValidId(id));
-  DCHECK(start >= base::TimeDelta()) << start.InSecondsF();
-  DCHECK(start < end) << "start " << start.InSecondsF() << " end "
-                      << end.InSecondsF();
-  DCHECK(duration_ != kNoTimestamp);
-  DCHECK(start <= duration_) << "start " << start.InSecondsF() << " duration "
-                             << duration_.InSecondsF();
-
-  if (start == duration_) return;
-
-  source_state_map_[id]->Remove(start, end, duration_);
-  host_->OnBufferedTimeRangesChanged(GetBufferedRanges_Locked());
-}
-
-double ChunkDemuxer::GetDuration() {
-  base::AutoLock auto_lock(lock_);
-  return GetDuration_Locked();
-}
-
-double ChunkDemuxer::GetDuration_Locked() {
-  lock_.AssertAcquired();
-  if (duration_ == kNoTimestamp)
-    return std::numeric_limits<double>::quiet_NaN();
-
-  // Return positive infinity if the resource is unbounded.
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#dom-media-duration
-  if (duration_ == kInfiniteDuration)
-    return std::numeric_limits<double>::infinity();
-
-  if (user_specified_duration_ >= 0) return user_specified_duration_;
-
-  return duration_.InSecondsF();
-}
-
-void ChunkDemuxer::SetDuration(double duration) {
-  base::AutoLock auto_lock(lock_);
-  DVLOG(1) << "SetDuration(" << duration << ")";
-  DCHECK_GE(duration, 0);
-
-  if (duration == GetDuration_Locked()) return;
-
-  // Compute & bounds check the TimeDelta representation of duration.
-  // This can be different if the value of |duration| doesn't fit the range or
-  // precision of TimeDelta.
-  TimeDelta min_duration = TimeDelta::FromInternalValue(1);
-  // Don't use TimeDelta::Max() here, as we want the largest finite time delta.
-  TimeDelta max_duration =
-      TimeDelta::FromInternalValue(std::numeric_limits<int64_t>::max() - 1);
-  double min_duration_in_seconds = min_duration.InSecondsF();
-  double max_duration_in_seconds = max_duration.InSecondsF();
-
-  TimeDelta duration_td;
-  if (duration == std::numeric_limits<double>::infinity()) {
-    duration_td = media::kInfiniteDuration;
-  } else if (duration < min_duration_in_seconds) {
-    duration_td = min_duration;
-  } else if (duration > max_duration_in_seconds) {
-    duration_td = max_duration;
-  } else {
-    duration_td = TimeDelta::FromMicroseconds(
-        duration * base::Time::kMicrosecondsPerSecond);
-  }
-
-  DCHECK(duration_td > TimeDelta());
-
-  user_specified_duration_ = duration;
-  duration_ = duration_td;
-  host_->SetDuration(duration_);
-
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    itr->second->OnSetDuration(duration_);
-  }
-}
-
-bool ChunkDemuxer::IsParsingMediaSegment(const std::string& id) {
-  base::AutoLock auto_lock(lock_);
-  DVLOG(1) << "IsParsingMediaSegment(" << id << ")";
-  CHECK(IsValidId(id));
-
-  return source_state_map_[id]->parsing_media_segment();
-}
-
-void ChunkDemuxer::SetSequenceMode(const std::string& id, bool sequence_mode) {
-  base::AutoLock auto_lock(lock_);
-  DVLOG(1) << "SetSequenceMode(" << id << ", " << sequence_mode << ")";
-  CHECK(IsValidId(id));
-  DCHECK_NE(state_, ENDED);
-
-  source_state_map_[id]->SetSequenceMode(sequence_mode);
-}
-
-void ChunkDemuxer::SetGroupStartTimestampIfInSequenceMode(
-    const std::string& id, base::TimeDelta timestamp_offset) {
-  base::AutoLock auto_lock(lock_);
-  DVLOG(1) << "SetGroupStartTimestampIfInSequenceMode(" << id << ", "
-           << timestamp_offset.InSecondsF() << ")";
-  CHECK(IsValidId(id));
-  DCHECK_NE(state_, ENDED);
-
-  source_state_map_[id]->SetGroupStartTimestampIfInSequenceMode(
-      timestamp_offset);
-}
-
-void ChunkDemuxer::MarkEndOfStream(PipelineStatus status) {
-  DVLOG(1) << "MarkEndOfStream(" << status << ")";
-  base::AutoLock auto_lock(lock_);
-  DCHECK_NE(state_, WAITING_FOR_INIT);
-  DCHECK_NE(state_, ENDED);
-
-  if (state_ == SHUTDOWN || state_ == PARSE_ERROR) return;
-
-  if (state_ == INITIALIZING) {
-    ReportError_Locked(DEMUXER_ERROR_COULD_NOT_OPEN);
-    return;
-  }
-
-  bool old_waiting_for_data = IsSeekWaitingForData_Locked();
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    itr->second->MarkEndOfStream();
-  }
-
-  CompletePendingReadsIfPossible();
-
-  // Give a chance to resume the pending seek process.
-  if (status != PIPELINE_OK) {
-    DCHECK(status == CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR ||
-           status == CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR);
-    ReportError_Locked(status);
-    return;
-  }
-
-  ChangeState_Locked(ENDED);
-  DecreaseDurationIfNecessary();
-
-  if (old_waiting_for_data && !IsSeekWaitingForData_Locked() &&
-      !seek_cb_.is_null()) {
-    base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
-  }
-}
-
-void ChunkDemuxer::UnmarkEndOfStream() {
-  DVLOG(1) << "UnmarkEndOfStream()";
-  base::AutoLock auto_lock(lock_);
-  // When we exceed the max buffer capacity we have |state_| PARSE_ERROR.
-  // Returning early causes a playback error.
-  if (state_ == PARSE_ERROR) {
-    return;
-  }
-  DCHECK_EQ(state_, ENDED);
-
-  ChangeState_Locked(INITIALIZED);
-
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    itr->second->UnmarkEndOfStream();
-  }
-}
-
-void ChunkDemuxer::Shutdown() {
-  DVLOG(1) << "Shutdown()";
-  base::AutoLock auto_lock(lock_);
-
-  if (state_ == SHUTDOWN) return;
-
-  ShutdownAllStreams();
-
-  ChangeState_Locked(SHUTDOWN);
-
-  if (!seek_cb_.is_null())
-    base::ResetAndReturn(&seek_cb_).Run(PIPELINE_ERROR_ABORT);
-}
-
-void ChunkDemuxer::SetMemoryLimitsForTest(DemuxerStream::Type type,
-                                          size_t memory_limit) {
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    itr->second->SetMemoryLimits(type, memory_limit);
-  }
-}
-
-void ChunkDemuxer::ChangeState_Locked(State new_state) {
-  lock_.AssertAcquired();
-  DVLOG(1) << "ChunkDemuxer::ChangeState_Locked() : " << state_ << " -> "
-           << new_state;
-  state_ = new_state;
-}
-
-ChunkDemuxer::~ChunkDemuxer() {
-  DCHECK_NE(state_, INITIALIZED);
-
-  while (!source_state_map_.empty()) {
-    delete source_state_map_.begin()->second;
-    source_state_map_.erase(source_state_map_.begin());
-  }
-}
-
-void ChunkDemuxer::ReportError_Locked(PipelineStatus error) {
-  DVLOG(1) << "ReportError_Locked(" << error << ")";
-  lock_.AssertAcquired();
-  DCHECK_NE(error, PIPELINE_OK);
-
-  ChangeState_Locked(PARSE_ERROR);
-
-  PipelineStatusCB cb;
-
-  if (!init_cb_.is_null()) {
-    std::swap(cb, init_cb_);
-  } else {
-    if (!seek_cb_.is_null()) std::swap(cb, seek_cb_);
-
-    ShutdownAllStreams();
-  }
-
-  if (!cb.is_null()) {
-    cb.Run(error);
-    return;
-  }
-
-  base::AutoUnlock auto_unlock(lock_);
-  host_->OnDemuxerError(error);
-}
-
-bool ChunkDemuxer::IsSeekWaitingForData_Locked() const {
-  lock_.AssertAcquired();
-  for (SourceBufferStateMap::const_iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    if (itr->second->IsSeekWaitingForData()) return true;
-  }
-
-  return false;
-}
-
-void ChunkDemuxer::OnSourceInitDone(
-    const std::string& source_id, const StreamParser::InitParameters& params) {
-  TRACE_EVENT0("cobalt::media", "ChunkDemuxer::OnSourceInitDone");
-  DVLOG(1) << "OnSourceInitDone source_id=" << source_id
-           << " duration=" << params.duration.InSecondsF();
-  lock_.AssertAcquired();
-  DCHECK_EQ(state_, INITIALIZING);
-  DCHECK(pending_source_init_ids_.find(source_id) !=
-         pending_source_init_ids_.end());
-  if (audio_streams_.empty() && video_streams_.empty()) {
-    ReportError_Locked(DEMUXER_ERROR_COULD_NOT_OPEN);
-    return;
-  }
-
-  if (!params.duration.is_zero() && duration_ == kNoTimestamp)
-    UpdateDuration(params.duration);
-
-  if (!params.timeline_offset.is_null()) {
-    if (!timeline_offset_.is_null() &&
-        params.timeline_offset != timeline_offset_) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Timeline offset is not the same across all SourceBuffers.";
-      ReportError_Locked(DEMUXER_ERROR_COULD_NOT_OPEN);
-      return;
-    }
-
-    timeline_offset_ = params.timeline_offset;
-  }
-
-  if (params.liveness != DemuxerStream::LIVENESS_UNKNOWN) {
-    for (size_t i = 0; i < audio_streams_.size(); ++i)
-      audio_streams_[i]->SetLiveness(params.liveness);
-    for (size_t i = 0; i < video_streams_.size(); ++i)
-      video_streams_[i]->SetLiveness(params.liveness);
-  }
-
-  detected_audio_track_count_ += params.detected_audio_track_count;
-  detected_video_track_count_ += params.detected_video_track_count;
-  detected_text_track_count_ += params.detected_text_track_count;
-
-  // Wait until all streams have initialized.
-  pending_source_init_ids_.erase(source_id);
-  if (!pending_source_init_ids_.empty()) return;
-
-  // Record detected track counts by type corresponding to an MSE playback.
-  // Counts are split into 50 buckets, capped into [0,100] range.
-  UMA_HISTOGRAM_COUNTS_100("Media.MSE.DetectedTrackCount.Audio",
-                           detected_audio_track_count_);
-  UMA_HISTOGRAM_COUNTS_100("Media.MSE.DetectedTrackCount.Video",
-                           detected_video_track_count_);
-  UMA_HISTOGRAM_COUNTS_100("Media.MSE.DetectedTrackCount.Text",
-                           detected_text_track_count_);
-
-  for (size_t i = 0; i < video_streams_.size(); ++i) {
-    media_log_->RecordRapporWithSecurityOrigin(
-        "Media.OriginUrl.MSE.VideoCodec." +
-        GetCodecName(video_streams_[i]->video_decoder_config().codec()));
-  }
-
-  SeekAllSources(GetStartTime());
-  StartReturningData();
-
-  if (duration_ == kNoTimestamp) duration_ = kInfiniteDuration;
-
-  // The demuxer is now initialized after the |start_timestamp_| was set.
-  ChangeState_Locked(INITIALIZED);
-  base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK);
-}
-
-// static
-MediaTrack::Id ChunkDemuxer::GenerateMediaTrackId() {
-  static unsigned g_track_count = 0;
-  return base::UintToString(++g_track_count);
-}
-
-ChunkDemuxerStream* ChunkDemuxer::CreateDemuxerStream(
-    const std::string& source_id, const std::string& mime,
-    DemuxerStream::Type type) {
-  // New ChunkDemuxerStreams can be created only during initialization segment
-  // processing, which happens when a new chunk of data is appended and the
-  // lock_ must be held by ChunkDemuxer::AppendData.
-  lock_.AssertAcquired();
-
-  MediaTrack::Id media_track_id = GenerateMediaTrackId();
-
-  OwnedChunkDemuxerStreamVector* owning_vector = NULL;
-  switch (type) {
-    case DemuxerStream::AUDIO:
-      owning_vector = &audio_streams_;
-      break;
-
-    case DemuxerStream::VIDEO:
-      owning_vector = &video_streams_;
-      break;
-
-    case DemuxerStream::TEXT:
-      owning_vector = &text_streams_;
-      break;
-
-    case DemuxerStream::UNKNOWN:
-    case DemuxerStream::NUM_TYPES:
-      NOTREACHED();
-      return NULL;
-  }
-
-  std::unique_ptr<ChunkDemuxerStream> stream(new ChunkDemuxerStream(
-      type, mime, splice_frames_enabled_, media_track_id));
-  DCHECK(track_id_to_demux_stream_map_.find(media_track_id) ==
-         track_id_to_demux_stream_map_.end());
-  track_id_to_demux_stream_map_[media_track_id] = stream.get();
-  id_to_streams_map_[source_id].push_back(stream.get());
-  owning_vector->push_back(
-      std::unique_ptr<ChunkDemuxerStream>(stream.release()));
-  return owning_vector->back().get();
-}
-
-void ChunkDemuxer::OnNewTextTrack(ChunkDemuxerStream* text_stream,
-                                  const TextTrackConfig& config) {
-  lock_.AssertAcquired();
-  DCHECK_NE(state_, SHUTDOWN);
-  host_->AddTextStream(text_stream, config);
-}
-
-bool ChunkDemuxer::IsValidId(const std::string& source_id) const {
-  lock_.AssertAcquired();
-  return source_state_map_.count(source_id) > 0u;
-}
-
-void ChunkDemuxer::UpdateDuration(TimeDelta new_duration) {
-  DCHECK(duration_ != new_duration);
-  user_specified_duration_ = -1;
-  duration_ = new_duration;
-  host_->SetDuration(new_duration);
-}
-
-void ChunkDemuxer::IncreaseDurationIfNecessary(TimeDelta new_duration) {
-  DCHECK(new_duration != kNoTimestamp);
-  DCHECK(new_duration != kInfiniteDuration);
-
-  // Per April 1, 2014 MSE spec editor's draft:
-  // https://dvcs.w3.org/hg/html-media/raw-file/d471a4412040/media-source/
-  //     media-source.html#sourcebuffer-coded-frame-processing
-  // 5. If the media segment contains data beyond the current duration, then run
-  //    the duration change algorithm with new duration set to the maximum of
-  //    the current duration and the group end timestamp.
-
-  if (new_duration <= duration_) return;
-
-  DVLOG(2) << __func__ << ": Increasing duration: " << duration_.InSecondsF()
-           << " -> " << new_duration.InSecondsF();
-
-  UpdateDuration(new_duration);
-}
-
-void ChunkDemuxer::DecreaseDurationIfNecessary() {
-  lock_.AssertAcquired();
-
-  TimeDelta max_duration;
-
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    max_duration =
-        std::max(max_duration, itr->second->GetMaxBufferedDuration());
-  }
-
-  if (max_duration.is_zero()) return;
-
-  if (max_duration < duration_) UpdateDuration(max_duration);
-}
-
-Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges() const {
-  base::AutoLock auto_lock(lock_);
-  return GetBufferedRanges_Locked();
-}
-
-Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges_Locked() const {
-  lock_.AssertAcquired();
-
-  bool ended = state_ == ENDED;
-  // TODO(acolwell): When we start allowing SourceBuffers that are not active,
-  // we'll need to update this loop to only add ranges from active sources.
-  SourceBufferState::RangesList ranges_list;
-  for (SourceBufferStateMap::const_iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    ranges_list.push_back(itr->second->GetBufferedRanges(duration_, ended));
-  }
-
-  return SourceBufferState::ComputeRangesIntersection(ranges_list, ended);
-}
-
-void ChunkDemuxer::StartReturningData() {
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    itr->second->StartReturningData();
-  }
-}
-
-void ChunkDemuxer::AbortPendingReads_Locked() {
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    itr->second->AbortReads();
-  }
-}
-
-void ChunkDemuxer::SeekAllSources(TimeDelta seek_time) {
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    itr->second->Seek(seek_time);
-  }
-}
-
-void ChunkDemuxer::AdjustSeekOnAudioSource() {
-  // This function assumes that there is only one audio and one video stream in
-  // the video.  As we won't be able to align seek to more than one video
-  // streams unless their keyframes are aligned.
-
-  // Find the timestamp of the video keyframe just before the seek timestamp of
-  // the first video stream.
-  TimeDelta adjusted_seek_time = kNoTimestamp;
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    TimeDelta seek_keyframe_timestamp =
-        itr->second->GetVideoSeekKeyframeTimestamp();
-    if (seek_keyframe_timestamp == kNoTimestamp) {
-      continue;
-    }
-    adjusted_seek_time = seek_keyframe_timestamp;
-    break;
-  }
-
-  if (adjusted_seek_time == kNoTimestamp) {
-    return;
-  }
-
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    Ranges<TimeDelta> ranges_list =
-        itr->second->GetAudioBufferedRanges(duration_, state_ == ENDED);
-    if (ranges_list.size() == 0) {
-      continue;
-    }
-    // Note that in rare situations the seek may fail as the append after seek
-    // may eject some audio buffer and no longer be able to fulfill the seek.
-    // Avoid calling Seek() in this case so the demuxer won't hang.  The video
-    // can continue to play, just with some leading silence.
-    for (size_t i = 0; i < ranges_list.size(); ++i) {
-      if (adjusted_seek_time >= ranges_list.start(i) &&
-          adjusted_seek_time <= ranges_list.end(i)) {
-        itr->second->Seek(adjusted_seek_time);
-      }
-    }
-    return;
-  }
-}
-
-void ChunkDemuxer::CompletePendingReadsIfPossible() {
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    itr->second->CompletePendingReadIfPossible();
-  }
-}
-
-void ChunkDemuxer::ShutdownAllStreams() {
-  for (SourceBufferStateMap::iterator itr = source_state_map_.begin();
-       itr != source_state_map_.end(); ++itr) {
-    itr->second->Shutdown();
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/chunk_demuxer.h b/cobalt/media/filters/chunk_demuxer.h
deleted file mode 100644
index f0d2428..0000000
--- a/cobalt/media/filters/chunk_demuxer.h
+++ /dev/null
@@ -1,470 +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 COBALT_MEDIA_FILTERS_CHUNK_DEMUXER_H_
-#define COBALT_MEDIA_FILTERS_CHUNK_DEMUXER_H_
-
-#include <deque>
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/synchronization/lock.h"
-#include "cobalt/media/base/byte_queue.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/ranges.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/filters/source_buffer_state.h"
-#include "cobalt/media/filters/source_buffer_stream.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class FFmpegURLProtocol;
-
-class MEDIA_EXPORT ChunkDemuxerStream : public DemuxerStream {
- public:
-  typedef std::deque<scoped_refptr<StreamParserBuffer>> BufferQueue;
-
-  ChunkDemuxerStream(Type type, const std::string& mime,
-                     bool splice_frames_enabled, MediaTrack::Id media_track_id);
-  ~ChunkDemuxerStream() override;
-
-  // ChunkDemuxerStream control methods.
-  void StartReturningData();
-  void AbortReads();
-  void CompletePendingReadIfPossible();
-  void Shutdown();
-
-  // SourceBufferStream manipulation methods.
-  void Seek(base::TimeDelta time);
-  bool IsSeekWaitingForData() const;
-  base::TimeDelta GetSeekKeyframeTimestamp() const;
-
-  // Add buffers to this stream.  Buffers are stored in SourceBufferStreams,
-  // which handle ordering and overlap resolution.
-  // Returns true if buffers were successfully added.
-  bool Append(const StreamParser::BufferQueue& buffers);
-
-  // Removes buffers between |start| and |end| according to the steps
-  // in the "Coded Frame Removal Algorithm" in the Media Source
-  // Extensions Spec.
-  // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#sourcebuffer-coded-frame-removal
-  //
-  // |duration| is the current duration of the presentation. It is
-  // required by the computation outlined in the spec.
-  void Remove(base::TimeDelta start, base::TimeDelta end,
-              base::TimeDelta duration);
-
-  // If the buffer is full, attempts to try to free up space, as specified in
-  // the "Coded Frame Eviction Algorithm" in the Media Source Extensions Spec.
-  // Returns false iff buffer is still full after running eviction.
-  // https://w3c.github.io/media-source/#sourcebuffer-coded-frame-eviction
-  bool EvictCodedFrames(DecodeTimestamp media_time, size_t newDataSize);
-
-  // Signal to the stream that duration has changed to |duration|.
-  void OnSetDuration(base::TimeDelta duration);
-
-  // Returns the range of buffered data in this stream, capped at |duration|.
-  Ranges<base::TimeDelta> GetBufferedRanges(base::TimeDelta duration) const;
-
-  // Returns the highest PTS of the buffered data.
-  // Returns base::TimeDelta() if the stream has no buffered data.
-  base::TimeDelta GetHighestPresentationTimestamp() const;
-
-  // Returns the duration of the buffered data.
-  // Returns base::TimeDelta() if the stream has no buffered data.
-  base::TimeDelta GetBufferedDuration() const;
-
-  // Returns the size of the buffered data in bytes.
-  size_t GetBufferedSize() const;
-
-  // Signal to the stream that buffers handed in through subsequent calls to
-  // Append() belong to a coded frame group that starts at |start_timestamp|.
-  void OnStartOfCodedFrameGroup(DecodeTimestamp start_timestamp);
-
-  // Called when midstream config updates occur.
-  // Returns true if the new config is accepted.
-  // Returns false if the new config should trigger an error.
-  bool UpdateAudioConfig(const AudioDecoderConfig& config,
-                         const scoped_refptr<MediaLog>& media_log);
-  bool UpdateVideoConfig(const VideoDecoderConfig& config,
-                         const scoped_refptr<MediaLog>& media_log);
-  void UpdateTextConfig(const TextTrackConfig& config,
-                        const scoped_refptr<MediaLog>& media_log);
-
-  void MarkEndOfStream();
-  void UnmarkEndOfStream();
-
-  // DemuxerStream methods.
-  void Read(const ReadCB& read_cb) override;
-  Type type() const override;
-  Liveness liveness() const override;
-  AudioDecoderConfig audio_decoder_config() override;
-  VideoDecoderConfig video_decoder_config() override;
-  bool SupportsConfigChanges() override;
-  VideoRotation video_rotation() override;
-  bool enabled() const override;
-  void set_enabled(bool enabled, base::TimeDelta timestamp) override;
-  void SetStreamStatusChangeCB(const StreamStatusChangeCB& cb) override;
-
-  // Returns the text track configuration.  It is an error to call this method
-  // if type() != TEXT.
-  TextTrackConfig text_track_config();
-
-  // Sets the memory limit, in bytes, on the SourceBufferStream.
-  void SetStreamMemoryLimit(size_t memory_limit);
-
-  bool supports_partial_append_window_trimming() const {
-    return partial_append_window_trimming_enabled_;
-  }
-
-  void SetLiveness(Liveness liveness);
-
-  MediaTrack::Id media_track_id() const { return media_track_id_; }
-
- private:
-  enum State {
-    UNINITIALIZED,
-    RETURNING_DATA_FOR_READS,
-    RETURNING_ABORT_FOR_READS,
-    SHUTDOWN,
-  };
-
-  // Assigns |state_| to |state|
-  void ChangeState_Locked(State state);
-
-  void CompletePendingReadIfPossible_Locked();
-
-  // Specifies the type of the stream.
-  Type type_;
-
-  const std::string mime_;
-
-  Liveness liveness_;
-
-  std::unique_ptr<SourceBufferStream> stream_;
-
-  const MediaTrack::Id media_track_id_;
-
-  mutable base::Lock lock_;
-  State state_;
-  ReadCB read_cb_;
-  bool splice_frames_enabled_;
-  bool partial_append_window_trimming_enabled_;
-  bool is_enabled_;
-  StreamStatusChangeCB stream_status_change_cb_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(ChunkDemuxerStream);
-};
-
-// Demuxer implementation that allows chunks of media data to be passed
-// from JavaScript to the media stack.
-class MEDIA_EXPORT ChunkDemuxer : public Demuxer {
- public:
-  enum Status {
-    kOk,              // ID added w/o error.
-    kNotSupported,    // Type specified is not supported.
-    kReachedIdLimit,  // Reached ID limit. We can't handle any more IDs.
-  };
-
-  // |open_cb| Run when Initialize() is called to signal that the demuxer
-  //   is ready to receive media data via AppenData().
-  // |encrypted_media_init_data_cb| Run when the demuxer determines that an
-  //   encryption key is needed to decrypt the content.
-  // |media_log| Used to report content and engine debug messages.
-  // |splice_frames_enabled| Indicates that it's okay to generate splice frames
-  //   per the MSE specification.  Renderers must understand DecoderBuffer's
-  //   splice_timestamp() field.
-  ChunkDemuxer(DecoderBuffer::Allocator* buffer_allocator,
-               const base::Closure& open_cb,
-               const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-               const scoped_refptr<MediaLog>& media_log,
-               bool splice_frames_enabled);
-  ~ChunkDemuxer() override;
-
-  // Demuxer implementation.
-  std::string GetDisplayName() const override;
-
-  // |enable_text| Process inband text tracks in the normal way when true,
-  //   otherwise ignore them.
-  void Initialize(DemuxerHost* host, const PipelineStatusCB& init_cb,
-                  bool enable_text_tracks) override;
-  void Stop() override;
-  void Seek(base::TimeDelta time, const PipelineStatusCB& cb) override;
-  base::Time GetTimelineOffset() const override;
-  DemuxerStream* GetStream(DemuxerStream::Type type) override;
-  base::TimeDelta GetStartTime() const override;
-  int64_t GetMemoryUsage() const override;
-  void AbortPendingReads() override;
-
-  // ChunkDemuxer reads are abortable. StartWaitingForSeek() and
-  // CancelPendingSeek() always abort pending and future reads until the
-  // expected seek occurs, so that ChunkDemuxer can stay synchronized with the
-  // associated JS method calls.
-  void StartWaitingForSeek(base::TimeDelta seek_time) override;
-  void CancelPendingSeek(base::TimeDelta seek_time) override;
-
-  // Registers a new |id| to use for AppendData() calls. |mime| indicates
-  // the MIME type for the data that we intend to append for this ID.
-  // kOk is returned if the demuxer has enough resources to support another ID
-  //    and supports the format indicated by |type|.
-  // kNotSupported is returned if |type| is not a supported format.
-  // kReachedIdLimit is returned if the demuxer cannot handle another ID right
-  //    now.
-  Status AddId(const std::string& id, const std::string& mime);
-
-  // Notifies a caller via |tracks_updated_cb| that the set of media tracks
-  // for a given |id| has changed.
-  void SetTracksWatcher(const std::string& id,
-                        const MediaTracksUpdatedCB& tracks_updated_cb);
-
-  // Removed an ID & associated resources that were previously added with
-  // AddId().
-  void RemoveId(const std::string& id);
-
-  // Gets the currently buffered ranges for the specified ID.
-  Ranges<base::TimeDelta> GetBufferedRanges(const std::string& id) const;
-
-  // Gets the highest buffered PTS for the specified |id|. If there is nothing
-  // buffered, returns base::TimeDelta().
-  base::TimeDelta GetHighestPresentationTimestamp(const std::string& id) const;
-
-  void OnEnabledAudioTracksChanged(const std::vector<MediaTrack::Id>& track_ids,
-                                   base::TimeDelta currTime) override;
-  // |track_ids| is either empty or contains a single video track id.
-  void OnSelectedVideoTrackChanged(const std::vector<MediaTrack::Id>& track_ids,
-                                   base::TimeDelta currTime) override;
-
-  // Appends media data to the source buffer associated with |id|, applying
-  // and possibly updating |*timestamp_offset| during coded frame processing.
-  // |append_window_start| and |append_window_end| correspond to the MSE spec's
-  // similarly named source buffer attributes that are used in coded frame
-  // processing. Returns true on success, false if the caller needs to run the
-  // append error algorithm with decode error parameter set to true.
-  bool AppendData(const std::string& id, const uint8_t* data, size_t length,
-                  base::TimeDelta append_window_start,
-                  base::TimeDelta append_window_end,
-                  base::TimeDelta* timestamp_offset);
-
-  // Aborts parsing the current segment and reset the parser to a state where
-  // it can accept a new segment.
-  // Some pending frames can be emitted during that process. These frames are
-  // applied |timestamp_offset|.
-  void ResetParserState(const std::string& id,
-                        base::TimeDelta append_window_start,
-                        base::TimeDelta append_window_end,
-                        base::TimeDelta* timestamp_offset);
-
-  // Remove buffers between |start| and |end| for the source buffer
-  // associated with |id|.
-  void Remove(const std::string& id, base::TimeDelta start,
-              base::TimeDelta end);
-
-  // If the buffer is full, attempts to try to free up space, as specified in
-  // the "Coded Frame Eviction Algorithm" in the Media Source Extensions Spec.
-  // Returns false iff buffer is still full after running eviction.
-  // https://w3c.github.io/media-source/#sourcebuffer-coded-frame-eviction
-  bool EvictCodedFrames(const std::string& id, base::TimeDelta currentMediaTime,
-                        size_t newDataSize);
-
-  // Returns the current presentation duration.
-  double GetDuration();
-  double GetDuration_Locked();
-
-  // Notifies the demuxer that the duration of the media has changed to
-  // |duration|.
-  void SetDuration(double duration);
-
-  // Returns true if the source buffer associated with |id| is currently parsing
-  // a media segment, or false otherwise.
-  bool IsParsingMediaSegment(const std::string& id);
-
-  // Set the append mode to be applied to subsequent buffers appended to the
-  // source buffer associated with |id|. If |sequence_mode| is true, caller
-  // is requesting "sequence" mode. Otherwise, caller is requesting "segments"
-  // mode.
-  void SetSequenceMode(const std::string& id, bool sequence_mode);
-
-  // Signals the coded frame processor for the source buffer associated with
-  // |id| to update its group start timestamp to be |timestamp_offset| if it is
-  // in sequence append mode.
-  void SetGroupStartTimestampIfInSequenceMode(const std::string& id,
-                                              base::TimeDelta timestamp_offset);
-
-  // Called to signal changes in the "end of stream"
-  // state. UnmarkEndOfStream() must not be called if a matching
-  // MarkEndOfStream() has not come before it.
-  void MarkEndOfStream(PipelineStatus status);
-  void UnmarkEndOfStream();
-
-  void Shutdown();
-
-  // Sets the memory limit on each stream of a specific type.
-  // |memory_limit| is the maximum number of bytes each stream of type |type|
-  // is allowed to hold in its buffer.
-  void SetMemoryLimitsForTest(DemuxerStream::Type type, size_t memory_limit);
-
-  // Returns the ranges representing the buffered data in the demuxer.
-  // TODO(wolenetz): Remove this method once MediaSourceDelegate no longer
-  // requires it for doing hack browser seeks to I-frame on Android. See
-  // http://crbug.com/304234.
-  Ranges<base::TimeDelta> GetBufferedRanges() const;
-
- private:
-  enum State {
-    WAITING_FOR_INIT,
-    INITIALIZING,
-    INITIALIZED,
-    ENDED,
-    PARSE_ERROR,
-    SHUTDOWN,
-  };
-
-  void ChangeState_Locked(State new_state);
-
-  // Reports an error and puts the demuxer in a state where it won't accept more
-  // data.
-  void ReportError_Locked(PipelineStatus error);
-
-  // Returns true if any stream has seeked to a time without buffered data.
-  bool IsSeekWaitingForData_Locked() const;
-
-  // Returns true if all streams can successfully call EndOfStream,
-  // false if any can not.
-  bool CanEndOfStream_Locked() const;
-
-  // SourceBufferState callbacks.
-  void OnSourceInitDone(const std::string& source_id,
-                        const StreamParser::InitParameters& params);
-
-  // Creates a DemuxerStream of the specified |type| for the SourceBufferState
-  // with the given |source_id|.
-  // Returns a pointer to a new ChunkDemuxerStream instance, which is owned by
-  // ChunkDemuxer.
-  ChunkDemuxerStream* CreateDemuxerStream(const std::string& source_id,
-                                          const std::string& mime,
-                                          DemuxerStream::Type type);
-
-  void OnNewTextTrack(ChunkDemuxerStream* text_stream,
-                      const TextTrackConfig& config);
-
-  // Returns true if |source_id| is valid, false otherwise.
-  bool IsValidId(const std::string& source_id) const;
-
-  // Increases |duration_| to |new_duration|, if |new_duration| is higher.
-  void IncreaseDurationIfNecessary(base::TimeDelta new_duration);
-
-  // Decreases |duration_| if the buffered region is less than |duration_| when
-  // EndOfStream() is called.
-  void DecreaseDurationIfNecessary();
-
-  // Sets |duration_| to |new_duration|, sets |user_specified_duration_| to -1
-  // and notifies |host_|.
-  void UpdateDuration(base::TimeDelta new_duration);
-
-  // Returns the ranges representing the buffered data in the demuxer.
-  Ranges<base::TimeDelta> GetBufferedRanges_Locked() const;
-
-  // Start returning data on all DemuxerStreams.
-  void StartReturningData();
-
-  void AbortPendingReads_Locked();
-
-  // Completes any pending reads if it is possible to do so.
-  void CompletePendingReadsIfPossible();
-
-  // Seeks all SourceBufferStreams to |seek_time|.
-  void SeekAllSources(base::TimeDelta seek_time);
-
-  // Adjust the previous seek on audio SourceBufferStream to make it more
-  // conform to the time of the first keyframe of the video stream before the
-  // seek time.  This function assumes that there is only one audio and one
-  // video stream in the video.
-  void AdjustSeekOnAudioSource();
-
-  // Generates and returns a unique media track id.
-  static MediaTrack::Id GenerateMediaTrackId();
-
-  // Shuts down all DemuxerStreams by calling Shutdown() on
-  // all objects in |source_state_map_|.
-  void ShutdownAllStreams();
-
-  DecoderBuffer::Allocator* buffer_allocator_;
-  mutable base::Lock lock_;
-  State state_;
-  bool cancel_next_seek_;
-
-  DemuxerHost* host_;
-  base::Closure open_cb_;
-  EncryptedMediaInitDataCB encrypted_media_init_data_cb_;
-  bool enable_text_;
-
-  // MediaLog for reporting messages and properties to debug content and engine.
-  scoped_refptr<MediaLog> media_log_;
-
-  PipelineStatusCB init_cb_;
-  // Callback to execute upon seek completion.
-  // TODO(wolenetz/acolwell): Protect against possible double-locking by first
-  // releasing |lock_| before executing this callback. See
-  // http://crbug.com/308226
-  PipelineStatusCB seek_cb_;
-
-  typedef std::vector<std::unique_ptr<ChunkDemuxerStream>>
-      OwnedChunkDemuxerStreamVector;
-  OwnedChunkDemuxerStreamVector audio_streams_;
-  OwnedChunkDemuxerStreamVector video_streams_;
-  OwnedChunkDemuxerStreamVector text_streams_;
-
-  // Keep track of which ids still remain uninitialized so that we transition
-  // into the INITIALIZED only after all ids/SourceBuffers got init segment.
-  std::set<std::string> pending_source_init_ids_;
-
-  base::TimeDelta duration_;
-
-  // The duration passed to the last SetDuration(). If
-  // SetDuration() is never called or an AppendData() call or
-  // a EndOfStream() call changes |duration_|, then this
-  // variable is set to < 0 to indicate that the |duration_| represents
-  // the actual duration instead of a user specified value.
-  double user_specified_duration_;
-
-  base::Time timeline_offset_;
-  DemuxerStream::Liveness liveness_;
-
-  typedef std::map<std::string, SourceBufferState*> SourceBufferStateMap;
-  SourceBufferStateMap source_state_map_;
-
-  std::map<std::string, std::vector<ChunkDemuxerStream*>> id_to_streams_map_;
-  // Used to hold alive the demuxer streams that were created for removed /
-  // released SourceBufferState objects. Demuxer clients might still have
-  // references to these streams, so we need to keep them alive. But they'll be
-  // in a shut down state, so reading from them will return EOS.
-  OwnedChunkDemuxerStreamVector removed_streams_;
-
-  // Indicates that splice frame generation is enabled.
-  const bool splice_frames_enabled_;
-
-  // Accumulate, by type, detected track counts across the SourceBuffers.
-  int detected_audio_track_count_;
-  int detected_video_track_count_;
-  int detected_text_track_count_;
-
-  std::map<MediaTrack::Id, DemuxerStream*> track_id_to_demux_stream_map_;
-
-  DISALLOW_COPY_AND_ASSIGN(ChunkDemuxer);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_CHUNK_DEMUXER_H_
diff --git a/cobalt/media/filters/chunk_demuxer_unittest.cc b/cobalt/media/filters/chunk_demuxer_unittest.cc
deleted file mode 100644
index 3fc5b67..0000000
--- a/cobalt/media/filters/chunk_demuxer_unittest.cc
+++ /dev/null
@@ -1,4603 +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 "cobalt/media/filters/chunk_demuxer.h"
-
-#include <algorithm>
-#include <memory>
-#include <queue>
-#include <utility>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/media.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/mock_demuxer_host.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/webm/cluster_builder.h"
-#include "cobalt/media/formats/webm/webm_cluster_parser.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "cobalt/media/media_features.h"
-#include "starboard/common/string.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::AnyNumber;
-using ::testing::Exactly;
-using ::testing::InSequence;
-using ::testing::NotNull;
-using ::testing::Return;
-using ::testing::SaveArg;
-using ::testing::SetArgumentPointee;
-using ::testing::StrictMock;
-using ::testing::_;
-
-namespace cobalt {
-namespace media {
-
-const uint8_t kTracksHeader[] = {
-    0x16, 0x54, 0xAE, 0x6B,                          // Tracks ID
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // tracks(size = 0)
-};
-
-// WebM Block bytes that represent a VP8 key frame.
-const uint8_t kVP8Keyframe[] = {0x010, 0x00, 0x00, 0x9d, 0x01, 0x2a,
-                                0x00,  0x10, 0x00, 0x10, 0x00};
-
-// WebM Block bytes that represent a VP8 interframe.
-const uint8_t kVP8Interframe[] = {0x11, 0x00, 0x00};
-
-const uint8_t kCuesHeader[] = {
-    0x1C, 0x53, 0xBB, 0x6B,                          // Cues ID
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // cues(size = 0)
-};
-
-const uint8_t kEncryptedMediaInitData[] = {
-    0x68, 0xFE, 0xF9, 0xA1, 0xB3, 0x0D, 0x6B, 0x4D,
-    0xF2, 0x22, 0xB5, 0x0B, 0x4D, 0xE9, 0xE9, 0x95,
-};
-
-const int kTracksHeaderSize = sizeof(kTracksHeader);
-const int kTracksSizeOffset = 4;
-
-// The size of TrackEntry element in test file "webm_vorbis_track_entry" starts
-// at index 1 and spans 8 bytes.
-const int kAudioTrackSizeOffset = 1;
-const int kAudioTrackSizeWidth = 8;
-const int kAudioTrackEntryHeaderSize =
-    kAudioTrackSizeOffset + kAudioTrackSizeWidth;
-
-// The size of TrackEntry element in test file "webm_vp8_track_entry" starts at
-// index 1 and spans 8 bytes.
-const int kVideoTrackSizeOffset = 1;
-const int kVideoTrackSizeWidth = 8;
-const int kVideoTrackEntryHeaderSize =
-    kVideoTrackSizeOffset + kVideoTrackSizeWidth;
-
-const int kVideoTrackNum = 1;
-const int kAudioTrackNum = 2;
-const int kTextTrackNum = 3;
-const int kAlternateVideoTrackNum = 4;
-const int kAlternateAudioTrackNum = 5;
-const int kAlternateTextTrackNum = 6;
-
-const int kAudioBlockDuration = 23;
-const int kVideoBlockDuration = 33;
-const int kTextBlockDuration = 100;
-const int kBlockSize = 10;
-
-const char kSourceId[] = "SourceId";
-const char kDefaultFirstClusterRange[] = "{ [0,46) }";
-const int kDefaultFirstClusterEndTimestamp = 66;
-const int kDefaultSecondClusterEndTimestamp = 132;
-
-base::TimeDelta kDefaultDuration() {
-  return base::TimeDelta::FromMilliseconds(201224);
-}
-
-// Write an integer into buffer in the form of vint that spans 8 bytes.
-// The data pointed by |buffer| should be at least 8 bytes long.
-// |number| should be in the range 0 <= number < 0x00FFFFFFFFFFFFFF.
-static void WriteInt64(uint8_t* buffer, int64_t number) {
-  DCHECK(number >= 0 && number < 0x00FFFFFFFFFFFFFFLL);
-  buffer[0] = 0x01;
-  int64_t tmp = number;
-  for (int i = 7; i > 0; i--) {
-    buffer[i] = tmp & 0xff;
-    tmp >>= 8;
-  }
-}
-
-static void OnReadDone(const base::TimeDelta& expected_time, bool* called,
-                       DemuxerStream::Status status,
-                       const scoped_refptr<DecoderBuffer>& buffer) {
-  EXPECT_EQ(status, DemuxerStream::kOk);
-  EXPECT_EQ(expected_time, buffer->timestamp());
-  *called = true;
-}
-
-static void OnReadDone_AbortExpected(
-    bool* called, DemuxerStream::Status status,
-    const scoped_refptr<DecoderBuffer>& buffer) {
-  EXPECT_EQ(status, DemuxerStream::kAborted);
-  EXPECT_EQ(NULL, buffer.get());
-  *called = true;
-}
-
-static void OnReadDone_EOSExpected(bool* called, DemuxerStream::Status status,
-                                   const scoped_refptr<DecoderBuffer>& buffer) {
-  EXPECT_EQ(status, DemuxerStream::kOk);
-  EXPECT_TRUE(buffer->end_of_stream());
-  *called = true;
-}
-
-static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) {
-  EXPECT_EQ(status, PIPELINE_OK);
-  *called = true;
-}
-
-class ChunkDemuxerTest : public ::testing::Test {
- public:
-  // Public method because test cases use it directly.
-  MOCK_METHOD1(DemuxerInitialized, void(PipelineStatus));
-
- protected:
-  enum CodecsIndex { AUDIO, VIDEO, MAX_CODECS_INDEX };
-
-  // Default cluster to append first for simple tests.
-  std::unique_ptr<Cluster> kDefaultFirstCluster() {
-    return GenerateCluster(0, 4);
-  }
-
-  // Default cluster to append after kDefaultFirstCluster()
-  // has been appended. This cluster starts with blocks that
-  // have timestamps consistent with the end times of the blocks
-  // in kDefaultFirstCluster() so that these two clusters represent
-  // a continuous region.
-  std::unique_ptr<Cluster> kDefaultSecondCluster() {
-    return GenerateCluster(46, 66, 5);
-  }
-
-  ChunkDemuxerTest()
-      : media_log_(new StrictMock<MockMediaLog>()),
-        append_window_end_for_next_append_(kInfiniteDuration) {
-    init_segment_received_cb_ = base::Bind(
-        &ChunkDemuxerTest::InitSegmentReceived, base::Unretained(this));
-    CreateNewDemuxer();
-  }
-
-  void CreateNewDemuxer() {
-    base::Closure open_cb =
-        base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this));
-    Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = base::Bind(
-        &ChunkDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this));
-    demuxer_.reset(new ChunkDemuxer(open_cb, encrypted_media_init_data_cb,
-                                    media_log_, true));
-  }
-
-  virtual ~ChunkDemuxerTest() { ShutdownDemuxer(); }
-
-  void CreateInitSegment(int stream_flags, bool is_audio_encrypted,
-                         bool is_video_encrypted,
-                         std::unique_ptr<uint8_t[]>* buffer, int* size) {
-    bool has_audio = (stream_flags & HAS_AUDIO) != 0;
-    bool has_video = (stream_flags & HAS_VIDEO) != 0;
-    bool has_text = (stream_flags & HAS_TEXT) != 0;
-    scoped_refptr<DecoderBuffer> ebml_header;
-    scoped_refptr<DecoderBuffer> info;
-    scoped_refptr<DecoderBuffer> audio_track_entry;
-    scoped_refptr<DecoderBuffer> video_track_entry;
-    scoped_refptr<DecoderBuffer> audio_content_encodings;
-    scoped_refptr<DecoderBuffer> video_content_encodings;
-    scoped_refptr<DecoderBuffer> text_track_entry;
-
-    ebml_header = ReadTestDataFile("webm_ebml_element");
-
-    info = ReadTestDataFile("webm_info_element");
-
-    int tracks_element_size = 0;
-
-    if (has_audio) {
-      audio_track_entry = ReadTestDataFile("webm_vorbis_track_entry");
-      tracks_element_size += audio_track_entry->data_size();
-      // Verify that we have TrackNum (0xD7) EBML element at expected offset.
-      DCHECK_EQ(audio_track_entry->data()[9], kWebMIdTrackNumber);
-      // Verify that the size of TrackNum element is 1. The actual value is 0x81
-      // due to how element sizes are encoded in EBML.
-      DCHECK_EQ(audio_track_entry->data()[10], 0x81);
-      // Ensure the track id in TrackNum EBML element matches kAudioTrackNum.
-      DCHECK_EQ(audio_track_entry->data()[11], kAudioTrackNum);
-      if (stream_flags & USE_ALTERNATE_AUDIO_TRACK_ID)
-        audio_track_entry->writable_data()[11] = kAlternateAudioTrackNum;
-      if (is_audio_encrypted) {
-        audio_content_encodings = ReadTestDataFile("webm_content_encodings");
-        tracks_element_size += audio_content_encodings->data_size();
-      }
-    }
-
-    if (has_video) {
-      video_track_entry = ReadTestDataFile("webm_vp8_track_entry");
-      tracks_element_size += video_track_entry->data_size();
-      // Verify that we have TrackNum (0xD7) EBML element at expected offset.
-      DCHECK_EQ(video_track_entry->data()[9], kWebMIdTrackNumber);
-      // Verify that the size of TrackNum element is 1. The actual value is 0x81
-      // due to how element sizes are encoded in EBML.
-      DCHECK_EQ(video_track_entry->data()[10], 0x81);
-      // Ensure the track id in TrackNum EBML element matches kVideoTrackNum.
-      DCHECK_EQ(video_track_entry->data()[11], kVideoTrackNum);
-      if (stream_flags & USE_ALTERNATE_VIDEO_TRACK_ID)
-        video_track_entry->writable_data()[11] = kAlternateVideoTrackNum;
-      if (is_video_encrypted) {
-        video_content_encodings = ReadTestDataFile("webm_content_encodings");
-        tracks_element_size += video_content_encodings->data_size();
-      }
-    }
-
-    if (has_text) {
-      // TODO(matthewjheaney): create an abstraction to do
-      // this (http://crbug/321454).
-      // We need it to also handle the creation of multiple text tracks.
-      //
-      // This is the track entry for a text track,
-      // TrackEntry [AE], size=30
-      //   TrackNum [D7], size=1, val=3 (or 4 if USE_ALTERNATE_TEXT_TRACK_ID)
-      //   TrackUID [73] [C5], size=1, value=3 (must remain constant for same
-      //     track, even if TrackNum changes)
-      //   TrackType [83], size=1, val=0x11
-      //   CodecId [86], size=18, val="D_WEBVTT/SUBTITLES"
-      char str[] =
-          "\xAE\x9E\xD7\x81\x03\x73\xC5\x81\x03"
-          "\x83\x81\x11\x86\x92"
-          "D_WEBVTT/SUBTITLES";
-      DCHECK_EQ(str[4], kTextTrackNum);
-      if (stream_flags & USE_ALTERNATE_TEXT_TRACK_ID)
-        str[4] = kAlternateTextTrackNum;
-
-      const int len = strlen(str);
-      DCHECK_EQ(len, 32);
-      const uint8_t* const buf = reinterpret_cast<const uint8_t*>(str);
-      text_track_entry = DecoderBuffer::CopyFrom(buf, len);
-      ASSERT_TRUE(text_track_entry);
-      tracks_element_size += text_track_entry->data_size();
-    }
-
-    *size = ebml_header->data_size() + info->data_size() + kTracksHeaderSize +
-            tracks_element_size;
-
-    buffer->reset(new uint8_t[*size]);
-
-    uint8_t* buf = buffer->get();
-    memcpy(buf, ebml_header->data(), ebml_header->data_size());
-    buf += ebml_header->data_size();
-
-    memcpy(buf, info->data(), info->data_size());
-    buf += info->data_size();
-
-    memcpy(buf, kTracksHeader, kTracksHeaderSize);
-    WriteInt64(buf + kTracksSizeOffset, tracks_element_size);
-    buf += kTracksHeaderSize;
-
-    // TODO(xhwang): Simplify this! Probably have test data files that contain
-    // ContentEncodings directly instead of trying to create one at run-time.
-    if (has_video) {
-      memcpy(buf, video_track_entry->data(),
-                   video_track_entry->data_size());
-      if (is_video_encrypted) {
-        memcpy(buf + video_track_entry->data_size(),
-                     video_content_encodings->data(),
-                     video_content_encodings->data_size());
-        WriteInt64(buf + kVideoTrackSizeOffset,
-                   video_track_entry->data_size() +
-                       video_content_encodings->data_size() -
-                       kVideoTrackEntryHeaderSize);
-        buf += video_content_encodings->data_size();
-      }
-      buf += video_track_entry->data_size();
-    }
-
-    if (has_audio) {
-      memcpy(buf, audio_track_entry->data(),
-                   audio_track_entry->data_size());
-      if (is_audio_encrypted) {
-        memcpy(buf + audio_track_entry->data_size(),
-                     audio_content_encodings->data(),
-                     audio_content_encodings->data_size());
-        WriteInt64(buf + kAudioTrackSizeOffset,
-                   audio_track_entry->data_size() +
-                       audio_content_encodings->data_size() -
-                       kAudioTrackEntryHeaderSize);
-        buf += audio_content_encodings->data_size();
-      }
-      buf += audio_track_entry->data_size();
-    }
-
-    if (has_text) {
-      memcpy(buf, text_track_entry->data(),
-                   text_track_entry->data_size());
-      buf += text_track_entry->data_size();
-    }
-  }
-
-  ChunkDemuxer::Status AddId() {
-    return AddId(kSourceId, HAS_AUDIO | HAS_VIDEO);
-  }
-
-  ChunkDemuxer::Status AddId(const std::string& source_id, int stream_flags) {
-    bool has_audio = (stream_flags & HAS_AUDIO) != 0;
-    bool has_video = (stream_flags & HAS_VIDEO) != 0;
-    std::string codecs;
-    std::string type;
-
-    if (has_audio) {
-      codecs += "vorbis";
-      type = "audio/webm";
-    }
-
-    if (has_video) {
-      if (codecs == "")
-        codecs = "vp8";
-      else
-        codecs += ",vp8";
-      type = "video/webm";
-    }
-
-    if (!has_audio && !has_video) {
-      return AddId(kSourceId, HAS_AUDIO | HAS_VIDEO);
-    }
-
-    return AddId(source_id, type, codecs);
-  }
-
-  ChunkDemuxer::Status AddId(const std::string& source_id,
-                             const std::string& mime_type,
-                             const std::string& codecs) {
-    ChunkDemuxer::Status status = demuxer_->AddId(source_id, mime_type, codecs);
-    if (status == ChunkDemuxer::kOk)
-      demuxer_->SetTracksWatcher(
-          source_id, base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
-                                base::Unretained(this)));
-    return status;
-  }
-
-  bool AppendData(const uint8_t* data, size_t length) {
-    return AppendData(kSourceId, data, length);
-  }
-
-  bool AppendCluster(const std::string& source_id,
-                     std::unique_ptr<Cluster> cluster) {
-    return AppendData(source_id, cluster->data(), cluster->size());
-  }
-
-  bool AppendCluster(std::unique_ptr<Cluster> cluster) {
-    return AppendCluster(kSourceId, std::move(cluster));
-  }
-
-  bool AppendCluster(int timecode, int block_count) {
-    return AppendCluster(GenerateCluster(timecode, block_count));
-  }
-
-  void AppendSingleStreamCluster(const std::string& source_id, int track_number,
-                                 int timecode, int block_count) {
-    int block_duration = 0;
-    switch (track_number) {
-      case kVideoTrackNum:
-      case kAlternateVideoTrackNum:
-        block_duration = kVideoBlockDuration;
-        break;
-      case kAudioTrackNum:
-      case kAlternateAudioTrackNum:
-        block_duration = kAudioBlockDuration;
-        break;
-      case kTextTrackNum:  // Fall-through.
-      case kAlternateTextTrackNum:
-        block_duration = kTextBlockDuration;
-        break;
-    }
-    ASSERT_NE(block_duration, 0);
-    int end_timecode = timecode + block_count * block_duration;
-    ASSERT_TRUE(AppendCluster(
-        source_id, GenerateSingleStreamCluster(timecode, end_timecode,
-                                               track_number, block_duration)));
-  }
-
-  struct BlockInfo {
-    BlockInfo() : track_number(0), timestamp_in_ms(0), flags(0), duration(0) {}
-
-    BlockInfo(int tn, int ts, int f, int d)
-        : track_number(tn), timestamp_in_ms(ts), flags(f), duration(d) {}
-
-    int track_number;
-    int timestamp_in_ms;
-    int flags;
-    int duration;
-
-    bool operator<(const BlockInfo& rhs) const {
-      return timestamp_in_ms < rhs.timestamp_in_ms;
-    }
-  };
-
-  // |track_number| - The track number to place in
-  // |block_descriptions| - A space delimited string of block info that
-  //  is used to populate |blocks|. Each block info has a timestamp in
-  //  milliseconds and optionally followed by a 'K' to indicate that a block
-  //  should be marked as a key frame. For example "0K 30 60" should populate
-  //  |blocks| with 3 BlockInfo objects: a key frame with timestamp 0 and 2
-  //  non-key-frames at 30ms and 60ms.
-  //  Every block will be a SimpleBlock, with the exception that the last block
-  //  may have an optional duration delimited with a 'D' and appended to the
-  //  block info timestamp, prior to the optional keyframe 'K'. For example "0K
-  //  30 60D10K" indicates that the last block will be a keyframe BlockGroup
-  //  with duration 10ms.
-  void ParseBlockDescriptions(int track_number,
-                              const std::string block_descriptions,
-                              std::vector<BlockInfo>* blocks) {
-    std::vector<std::string> timestamps = base::SplitString(
-        block_descriptions, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-
-    for (size_t i = 0; i < timestamps.size(); ++i) {
-      std::string timestamp_str = timestamps[i];
-      BlockInfo block_info;
-      block_info.track_number = track_number;
-      block_info.flags = 0;
-      block_info.duration = 0;
-
-      if (base::EndsWith(timestamp_str, "K", base::CompareCase::SENSITIVE)) {
-        block_info.flags = kWebMFlagKeyframe;
-        // Remove the "K" off of the token.
-        timestamp_str = timestamp_str.substr(0, timestamps[i].length() - 1);
-      }
-
-      size_t duration_pos = timestamp_str.find('D');
-      const bool explicit_duration = duration_pos != std::string::npos;
-      const bool is_last_block = i == timestamps.size() - 1;
-      CHECK(!explicit_duration || is_last_block);
-      if (explicit_duration) {
-        CHECK(base::StringToInt(timestamp_str.substr(duration_pos + 1),
-                                &block_info.duration));
-        timestamp_str = timestamp_str.substr(0, duration_pos);
-      }
-
-      CHECK(base::StringToInt(timestamp_str, &block_info.timestamp_in_ms));
-
-      if (track_number == kTextTrackNum ||
-          track_number == kAlternateTextTrackNum) {
-        block_info.duration = kTextBlockDuration;
-        ASSERT_EQ(kWebMFlagKeyframe, block_info.flags)
-            << "Text block with timestamp " << block_info.timestamp_in_ms
-            << " was not marked as a key frame."
-            << " All text blocks must be key frames";
-      }
-
-      if (track_number == kAudioTrackNum ||
-          track_number == kAlternateAudioTrackNum)
-        ASSERT_TRUE(block_info.flags & kWebMFlagKeyframe);
-
-      blocks->push_back(block_info);
-    }
-  }
-
-  std::unique_ptr<Cluster> GenerateCluster(const std::vector<BlockInfo>& blocks,
-                                           bool unknown_size) {
-    DCHECK_GT(blocks.size(), 0u);
-    ClusterBuilder cb;
-
-    std::vector<uint8_t> data(10);
-    for (size_t i = 0; i < blocks.size(); ++i) {
-      if (i == 0) cb.SetClusterTimecode(blocks[i].timestamp_in_ms);
-
-      if (blocks[i].duration) {
-        if (blocks[i].track_number == kVideoTrackNum ||
-            blocks[i].track_number == kAlternateVideoTrackNum) {
-          AddVideoBlockGroup(&cb, blocks[i].track_number,
-                             blocks[i].timestamp_in_ms, blocks[i].duration,
-                             blocks[i].flags);
-        } else {
-          cb.AddBlockGroup(blocks[i].track_number, blocks[i].timestamp_in_ms,
-                           blocks[i].duration, blocks[i].flags,
-                           blocks[i].flags & kWebMFlagKeyframe, &data[0],
-                           data.size());
-        }
-      } else {
-        cb.AddSimpleBlock(blocks[i].track_number, blocks[i].timestamp_in_ms,
-                          blocks[i].flags, &data[0], data.size());
-      }
-    }
-
-    return unknown_size ? cb.FinishWithUnknownSize() : cb.Finish();
-  }
-
-  std::unique_ptr<Cluster> GenerateCluster(
-      std::priority_queue<BlockInfo> block_queue, bool unknown_size) {
-    std::vector<BlockInfo> blocks(block_queue.size());
-    for (size_t i = block_queue.size() - 1; !block_queue.empty(); --i) {
-      blocks[i] = block_queue.top();
-      block_queue.pop();
-    }
-
-    return GenerateCluster(blocks, unknown_size);
-  }
-
-  // |block_descriptions| - The block descriptions used to construct the
-  // cluster. See the documentation for ParseBlockDescriptions() for details on
-  // the string format.
-  void AppendSingleStreamCluster(const std::string& source_id, int track_number,
-                                 const std::string& block_descriptions) {
-    std::vector<BlockInfo> blocks;
-    ParseBlockDescriptions(track_number, block_descriptions, &blocks);
-    ASSERT_TRUE(AppendCluster(source_id, GenerateCluster(blocks, false)));
-  }
-
-  struct MuxedStreamInfo {
-    MuxedStreamInfo()
-        : track_number(0),
-          block_descriptions(""),
-          last_blocks_estimated_duration(-1) {}
-
-    MuxedStreamInfo(int track_num, const char* block_desc)
-        : track_number(track_num),
-          block_descriptions(block_desc),
-          last_blocks_estimated_duration(-1) {}
-
-    MuxedStreamInfo(int track_num, const char* block_desc,
-                    int last_block_duration_estimate)
-        : track_number(track_num),
-          block_descriptions(block_desc),
-          last_blocks_estimated_duration(last_block_duration_estimate) {}
-
-    int track_number;
-    // The block description passed to ParseBlockDescriptions().
-    // See the documentation for that method for details on the string format.
-    const char* block_descriptions;
-
-    // If -1, no WebMSimpleBlockDurationEstimated MediaLog expectation is added
-    // when appending the resulting cluster. Otherwise, an expectation (in ms)
-    // is added.
-    int last_blocks_estimated_duration;
-  };
-
-  void AppendMuxedCluster(const MuxedStreamInfo& msi_1,
-                          const MuxedStreamInfo& msi_2) {
-    std::vector<MuxedStreamInfo> msi(2);
-    msi[0] = msi_1;
-    msi[1] = msi_2;
-    AppendMuxedCluster(msi);
-  }
-
-  void AppendMuxedCluster(const MuxedStreamInfo& msi_1,
-                          const MuxedStreamInfo& msi_2,
-                          const MuxedStreamInfo& msi_3) {
-    std::vector<MuxedStreamInfo> msi(3);
-    msi[0] = msi_1;
-    msi[1] = msi_2;
-    msi[2] = msi_3;
-    AppendMuxedCluster(msi);
-  }
-
-  std::unique_ptr<Cluster> GenerateMuxedCluster(
-      const std::vector<MuxedStreamInfo> msi) {
-    std::priority_queue<BlockInfo> block_queue;
-    for (size_t i = 0; i < msi.size(); ++i) {
-      std::vector<BlockInfo> track_blocks;
-      ParseBlockDescriptions(msi[i].track_number, msi[i].block_descriptions,
-                             &track_blocks);
-
-      for (size_t j = 0; j < track_blocks.size(); ++j) {
-        block_queue.push(track_blocks[j]);
-      }
-
-      if (msi[i].last_blocks_estimated_duration != -1) {
-        EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
-            msi[i].last_blocks_estimated_duration));
-      }
-    }
-    return GenerateCluster(block_queue, false);
-  }
-
-  void AppendMuxedCluster(const std::vector<MuxedStreamInfo> msi) {
-    ASSERT_TRUE(AppendCluster(kSourceId, GenerateMuxedCluster(msi)));
-  }
-
-  bool AppendData(const std::string& source_id, const uint8_t* data,
-                  size_t length) {
-    EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber());
-
-    return demuxer_->AppendData(
-        source_id, data, length, append_window_start_for_next_append_,
-        append_window_end_for_next_append_, &timestamp_offset_map_[source_id]);
-  }
-
-  bool AppendDataInPieces(const uint8_t* data, size_t length) {
-    return AppendDataInPieces(data, length, 7);
-  }
-
-  bool AppendDataInPieces(const uint8_t* data, size_t length,
-                          size_t piece_size) {
-    const uint8_t* start = data;
-    const uint8_t* end = data + length;
-    while (start < end) {
-      size_t append_size =
-          std::min(piece_size, static_cast<size_t>(end - start));
-      if (!AppendData(start, append_size)) return false;
-      start += append_size;
-    }
-    return true;
-  }
-
-  bool AppendInitSegment(int stream_flags) {
-    return AppendInitSegmentWithSourceId(kSourceId, stream_flags);
-  }
-
-  bool AppendInitSegmentWithSourceId(const std::string& source_id,
-                                     int stream_flags) {
-    return AppendInitSegmentWithEncryptedInfo(source_id, stream_flags, false,
-                                              false);
-  }
-
-  bool AppendInitSegmentWithEncryptedInfo(const std::string& source_id,
-                                          int stream_flags,
-                                          bool is_audio_encrypted,
-                                          bool is_video_encrypted) {
-    std::unique_ptr<uint8_t[]> info_tracks;
-    int info_tracks_size = 0;
-    CreateInitSegment(stream_flags, is_audio_encrypted, is_video_encrypted,
-                      &info_tracks, &info_tracks_size);
-    return AppendData(source_id, info_tracks.get(), info_tracks_size);
-  }
-
-  void AppendGarbage() {
-    // Fill up an array with gibberish.
-    int garbage_cluster_size = 10;
-    std::unique_ptr<uint8_t[]> garbage_cluster(
-        new uint8_t[garbage_cluster_size]);
-    for (int i = 0; i < garbage_cluster_size; ++i) garbage_cluster[i] = i;
-    ASSERT_FALSE(AppendData(garbage_cluster.get(), garbage_cluster_size));
-  }
-
-  PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration,
-                                    PipelineStatus expected_status) {
-    if (expected_duration != kNoTimestamp)
-      EXPECT_CALL(host_, SetDuration(expected_duration));
-    return CreateInitDoneCB(expected_status);
-  }
-
-  PipelineStatusCB CreateInitDoneCB(PipelineStatus expected_status) {
-    EXPECT_CALL(*this, DemuxerInitialized(expected_status));
-    return base::Bind(&ChunkDemuxerTest::DemuxerInitialized,
-                      base::Unretained(this));
-  }
-
-  enum StreamFlags {
-    HAS_AUDIO = 1 << 0,
-    HAS_VIDEO = 1 << 1,
-    HAS_TEXT = 1 << 2,
-    USE_ALTERNATE_AUDIO_TRACK_ID = 1 << 3,
-    USE_ALTERNATE_VIDEO_TRACK_ID = 1 << 4,
-    USE_ALTERNATE_TEXT_TRACK_ID = 1 << 5,
-  };
-
-  bool InitDemuxer(int stream_flags) {
-    return InitDemuxerWithEncryptionInfo(stream_flags, false, false);
-  }
-
-  void ExpectInitMediaLogs(int stream_flags) {
-    if (stream_flags & HAS_VIDEO) {
-      EXPECT_MEDIA_LOG(FoundStream("video"));
-      EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
-    }
-    if (stream_flags & HAS_AUDIO) {
-      EXPECT_MEDIA_LOG(FoundStream("audio"));
-      EXPECT_MEDIA_LOG(CodecName("audio", "vorbis"));
-    }
-  }
-
-  bool InitDemuxerWithEncryptionInfo(int stream_flags, bool is_audio_encrypted,
-                                     bool is_video_encrypted) {
-    PipelineStatus expected_status =
-        (stream_flags != 0) ? PIPELINE_OK : CHUNK_DEMUXER_ERROR_APPEND_FAILED;
-
-    base::TimeDelta expected_duration = kNoTimestamp;
-    if (expected_status == PIPELINE_OK) expected_duration = kDefaultDuration();
-
-    EXPECT_CALL(*this, DemuxerOpened());
-
-    if (is_audio_encrypted || is_video_encrypted) {
-      DCHECK(!is_audio_encrypted || stream_flags & HAS_AUDIO);
-      DCHECK(!is_video_encrypted || stream_flags & HAS_VIDEO);
-
-      int need_key_count =
-          (is_audio_encrypted ? 1 : 0) + (is_video_encrypted ? 1 : 0);
-      EXPECT_CALL(*this, OnEncryptedMediaInitData(
-                             EmeInitDataType::WEBM,
-                             std::vector<uint8_t>(
-                                 kEncryptedMediaInitData,
-                                 kEncryptedMediaInitData +
-                                     arraysize(kEncryptedMediaInitData))))
-          .Times(Exactly(need_key_count));
-    }
-
-    // Adding expectations prior to CreateInitDoneCB() here because InSequence
-    // tests require init segment received before duration set. Also, only
-    // expect an init segment received callback if there is actually a track in
-    // it.
-    if (stream_flags != 0) {
-      ExpectInitMediaLogs(stream_flags);
-      EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-    } else {
-      // OnNewConfigs() requires at least one audio, video, or text track.
-      EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("vorbis"));
-      EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("vp8"));
-      EXPECT_MEDIA_LOG(StreamParsingFailed());
-    }
-
-    demuxer_->Initialize(
-        &host_, CreateInitDoneCB(expected_duration, expected_status), true);
-
-    if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk) return false;
-
-    return AppendInitSegmentWithEncryptedInfo(
-        kSourceId, stream_flags, is_audio_encrypted, is_video_encrypted);
-  }
-
-  bool InitDemuxerAudioAndVideoSourcesText(const std::string& audio_id,
-                                           const std::string& video_id,
-                                           bool has_text) {
-    EXPECT_CALL(*this, DemuxerOpened());
-    demuxer_->Initialize(
-        &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
-
-    if (AddId(audio_id, HAS_AUDIO) != ChunkDemuxer::kOk) return false;
-    if (AddId(video_id, HAS_VIDEO) != ChunkDemuxer::kOk) return false;
-
-    int audio_flags = HAS_AUDIO;
-    int video_flags = HAS_VIDEO;
-
-    if (has_text) {
-      audio_flags |= HAS_TEXT;
-      video_flags |= HAS_TEXT;
-    }
-
-    // Note: Unlike InitDemuxerWithEncryptionInfo, this method is currently
-    // incompatible with InSequence tests. Refactoring of the duration
-    // set expectation to not be added during CreateInitDoneCB() could fix this.
-    ExpectInitMediaLogs(audio_flags);
-    EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-    EXPECT_TRUE(AppendInitSegmentWithSourceId(audio_id, audio_flags));
-
-    ExpectInitMediaLogs(video_flags);
-    EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-    EXPECT_TRUE(AppendInitSegmentWithSourceId(video_id, video_flags));
-    return true;
-  }
-
-  bool InitDemuxerAudioAndVideoSources(const std::string& audio_id,
-                                       const std::string& video_id) {
-    return InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, false);
-  }
-
-  // Initializes the demuxer with data from 2 files with different
-  // decoder configurations. This is used to test the decoder config change
-  // logic.
-  //
-  // bear-320x240.webm VideoDecoderConfig returns 320x240 for its natural_size()
-  // bear-640x360.webm VideoDecoderConfig returns 640x360 for its natural_size()
-  // The resulting video stream returns data from each file for the following
-  // time ranges.
-  // bear-320x240.webm : [0-501)       [801-2736)
-  // bear-640x360.webm :       [527-760)
-  //
-  // bear-320x240.webm AudioDecoderConfig returns 3863 for its extra_data size.
-  // bear-640x360.webm AudioDecoderConfig returns 3935 for its extra_data size.
-  // The resulting audio stream returns data from each file for the following
-  // time ranges.
-  // bear-320x240.webm : [0-524)       [779-2736)
-  // bear-640x360.webm :       [527-759)
-  bool InitDemuxerWithConfigChangeData() {
-    scoped_refptr<DecoderBuffer> bear1 = ReadTestDataFile("bear-320x240.webm");
-    scoped_refptr<DecoderBuffer> bear2 = ReadTestDataFile("bear-640x360.webm");
-
-    EXPECT_CALL(*this, DemuxerOpened());
-
-    // Adding expectation prior to CreateInitDoneCB() here because InSequence
-    // tests require init segment received before duration set.
-    ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
-    EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-    demuxer_->Initialize(
-        &host_,
-        CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK),
-        true);
-
-    if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk)
-      return false;
-
-    // Append the whole bear1 file.
-    EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7);
-    // Expect duration adjustment since actual duration differs slightly from
-    // duration in the init segment.
-    EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
-    EXPECT_TRUE(AppendData(bear1->data(), bear1->data_size()));
-    // Last audio frame has timestamp 2721 and duration 24 (estimated from max
-    // seen so far for audio track).
-    // Last video frame has timestamp 2703 and duration 33 (from TrackEntry
-    // DefaultDuration for video track).
-    CheckExpectedRanges("{ [0,2736) }");
-
-    // Append initialization segment for bear2.
-    // Note: Offsets here and below are derived from
-    // media/test/data/bear-640x360-manifest.js and
-    // media/test/data/bear-320x240-manifest.js which were
-    // generated from media/test/data/bear-640x360.webm and
-    // media/test/data/bear-320x240.webm respectively.
-    EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-    EXPECT_TRUE(AppendData(bear2->data(), 4340));
-
-    // Append a media segment that goes from [0.527000, 1.014000).
-    EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
-    EXPECT_MEDIA_LOG(GeneratedSplice(20000, 527000));
-    EXPECT_TRUE(AppendData(bear2->data() + 55290, 18785));
-    CheckExpectedRanges("{ [0,1027) [1201,2736) }");
-
-    // Append initialization segment for bear1 & fill gap with [779-1197)
-    // segment.
-    EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-    EXPECT_TRUE(AppendData(bear1->data(), 4370));
-    EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23));
-    EXPECT_MEDIA_LOG(GeneratedSplice(26000, 779000));
-    EXPECT_TRUE(AppendData(bear1->data() + 72737, 28183));
-    CheckExpectedRanges("{ [0,2736) }");
-
-    MarkEndOfStream(PIPELINE_OK);
-    return true;
-  }
-
-  void ShutdownDemuxer() {
-    if (demuxer_) {
-      demuxer_->Shutdown();
-      base::RunLoop().RunUntilIdle();
-    }
-  }
-
-  void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64_t timecode) {
-    uint8_t data[] = {0x00};
-    cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data));
-  }
-
-  std::unique_ptr<Cluster> GenerateCluster(int timecode, int block_count) {
-    return GenerateCluster(timecode, timecode, block_count);
-  }
-
-  void AddVideoBlockGroup(ClusterBuilder* cb, int track_num, int64_t timecode,
-                          int duration, int flags) {
-    const uint8_t* data =
-        (flags & kWebMFlagKeyframe) != 0 ? kVP8Keyframe : kVP8Interframe;
-    int size = (flags & kWebMFlagKeyframe) != 0 ? sizeof(kVP8Keyframe)
-                                                : sizeof(kVP8Interframe);
-    cb->AddBlockGroup(track_num, timecode, duration, flags,
-                      flags & kWebMFlagKeyframe, data, size);
-  }
-
-  std::unique_ptr<Cluster> GenerateCluster(int first_audio_timecode,
-                                           int first_video_timecode,
-                                           int block_count) {
-    return GenerateCluster(first_audio_timecode, first_video_timecode,
-                           block_count, false);
-  }
-  std::unique_ptr<Cluster> GenerateCluster(int first_audio_timecode,
-                                           int first_video_timecode,
-                                           int block_count, bool unknown_size) {
-    CHECK_GT(block_count, 0);
-
-    std::priority_queue<BlockInfo> block_queue;
-
-    if (block_count == 1) {
-      block_queue.push(BlockInfo(kAudioTrackNum, first_audio_timecode,
-                                 kWebMFlagKeyframe, kAudioBlockDuration));
-      return GenerateCluster(block_queue, unknown_size);
-    }
-
-    int audio_timecode = first_audio_timecode;
-    int video_timecode = first_video_timecode;
-
-    // Create simple blocks for everything except the last 2 blocks.
-    // The first video frame must be a key frame.
-    uint8_t video_flag = kWebMFlagKeyframe;
-    for (int i = 0; i < block_count - 2; i++) {
-      if (audio_timecode <= video_timecode) {
-        block_queue.push(
-            BlockInfo(kAudioTrackNum, audio_timecode, kWebMFlagKeyframe, 0));
-        audio_timecode += kAudioBlockDuration;
-        continue;
-      }
-
-      block_queue.push(
-          BlockInfo(kVideoTrackNum, video_timecode, video_flag, 0));
-      video_timecode += kVideoBlockDuration;
-      video_flag = 0;
-    }
-
-    // Make the last 2 blocks BlockGroups so that they don't get delayed by the
-    // block duration calculation logic.
-    block_queue.push(BlockInfo(kAudioTrackNum, audio_timecode,
-                               kWebMFlagKeyframe, kAudioBlockDuration));
-    block_queue.push(BlockInfo(kVideoTrackNum, video_timecode, video_flag,
-                               kVideoBlockDuration));
-
-    return GenerateCluster(block_queue, unknown_size);
-  }
-
-  std::unique_ptr<Cluster> GenerateSingleStreamCluster(int timecode,
-                                                       int end_timecode,
-                                                       int track_number,
-                                                       int block_duration) {
-    CHECK_GT(end_timecode, timecode);
-
-    std::vector<uint8_t> data(kBlockSize);
-
-    ClusterBuilder cb;
-    cb.SetClusterTimecode(timecode);
-
-    // Create simple blocks for everything except the last block.
-    while (timecode < (end_timecode - block_duration)) {
-      cb.AddSimpleBlock(track_number, timecode, kWebMFlagKeyframe, &data[0],
-                        data.size());
-      timecode += block_duration;
-    }
-
-    if (track_number == kVideoTrackNum) {
-      AddVideoBlockGroup(&cb, track_number, timecode, block_duration,
-                         kWebMFlagKeyframe);
-    } else {
-      cb.AddBlockGroup(track_number, timecode, block_duration,
-                       kWebMFlagKeyframe, static_cast<bool>(kWebMFlagKeyframe),
-                       &data[0], data.size());
-    }
-
-    return cb.Finish();
-  }
-
-  void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) {
-    demuxer_->GetStream(type)->Read(read_cb);
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void ReadAudio(const DemuxerStream::ReadCB& read_cb) {
-    Read(DemuxerStream::AUDIO, read_cb);
-  }
-
-  void ReadVideo(const DemuxerStream::ReadCB& read_cb) {
-    Read(DemuxerStream::VIDEO, read_cb);
-  }
-
-  void GenerateExpectedReads(int timecode, int block_count) {
-    GenerateExpectedReads(timecode, timecode, block_count);
-  }
-
-  void GenerateExpectedReads(int start_audio_timecode, int start_video_timecode,
-                             int block_count) {
-    CHECK_GT(block_count, 0);
-
-    if (block_count == 1) {
-      ExpectRead(DemuxerStream::AUDIO, start_audio_timecode);
-      return;
-    }
-
-    int audio_timecode = start_audio_timecode;
-    int video_timecode = start_video_timecode;
-
-    for (int i = 0; i < block_count; i++) {
-      if (audio_timecode <= video_timecode) {
-        ExpectRead(DemuxerStream::AUDIO, audio_timecode);
-        audio_timecode += kAudioBlockDuration;
-        continue;
-      }
-
-      ExpectRead(DemuxerStream::VIDEO, video_timecode);
-      video_timecode += kVideoBlockDuration;
-    }
-  }
-
-  void GenerateSingleStreamExpectedReads(int timecode, int block_count,
-                                         DemuxerStream::Type type,
-                                         int block_duration) {
-    CHECK_GT(block_count, 0);
-    int stream_timecode = timecode;
-
-    for (int i = 0; i < block_count; i++) {
-      ExpectRead(type, stream_timecode);
-      stream_timecode += block_duration;
-    }
-  }
-
-  void GenerateAudioStreamExpectedReads(int timecode, int block_count) {
-    GenerateSingleStreamExpectedReads(
-        timecode, block_count, DemuxerStream::AUDIO, kAudioBlockDuration);
-  }
-
-  void GenerateVideoStreamExpectedReads(int timecode, int block_count) {
-    GenerateSingleStreamExpectedReads(
-        timecode, block_count, DemuxerStream::VIDEO, kVideoBlockDuration);
-  }
-
-  std::unique_ptr<Cluster> GenerateEmptyCluster(int timecode) {
-    ClusterBuilder cb;
-    cb.SetClusterTimecode(timecode);
-    return cb.Finish();
-  }
-
-  void CheckExpectedRangesForMediaSource(const std::string& expected) {
-    CheckExpectedRanges(demuxer_->GetBufferedRanges(), expected);
-  }
-
-  void CheckExpectedRanges(const std::string& expected) {
-    CheckExpectedRanges(kSourceId, expected);
-    CheckExpectedRangesForMediaSource(expected);
-  }
-
-  void CheckExpectedRanges(const std::string& id, const std::string& expected) {
-    CheckExpectedRanges(demuxer_->GetBufferedRanges(id), expected);
-  }
-
-  void CheckExpectedRanges(DemuxerStream::Type type,
-                           const std::string& expected) {
-    ChunkDemuxerStream* stream =
-        static_cast<ChunkDemuxerStream*>(demuxer_->GetStream(type));
-    CheckExpectedRanges(stream->GetBufferedRanges(kDefaultDuration()),
-                        expected);
-  }
-
-  void CheckExpectedRanges(const Ranges<base::TimeDelta>& r,
-                           const std::string& expected) {
-    std::stringstream ss;
-    ss << "{ ";
-    for (size_t i = 0; i < r.size(); ++i) {
-      ss << "[" << r.start(i).InMilliseconds() << ","
-         << r.end(i).InMilliseconds() << ") ";
-    }
-    ss << "}";
-    EXPECT_EQ(expected, ss.str());
-  }
-
-  MOCK_METHOD2(ReadDone, void(DemuxerStream::Status status,
-                              const scoped_refptr<DecoderBuffer>&));
-
-  void StoreStatusAndBuffer(DemuxerStream::Status* status_out,
-                            scoped_refptr<DecoderBuffer>* buffer_out,
-                            DemuxerStream::Status status,
-                            const scoped_refptr<DecoderBuffer>& buffer) {
-    *status_out = status;
-    *buffer_out = buffer;
-  }
-
-  void ReadUntilNotOkOrEndOfStream(DemuxerStream::Type type,
-                                   DemuxerStream::Status* status,
-                                   base::TimeDelta* last_timestamp) {
-    DemuxerStream* stream = demuxer_->GetStream(type);
-    scoped_refptr<DecoderBuffer> buffer;
-
-    *last_timestamp = kNoTimestamp;
-    do {
-      stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer,
-                              base::Unretained(this), status, &buffer));
-      base::RunLoop().RunUntilIdle();
-      if (*status == DemuxerStream::kOk && !buffer->end_of_stream())
-        *last_timestamp = buffer->timestamp();
-    } while (*status == DemuxerStream::kOk && !buffer->end_of_stream());
-  }
-
-  void ExpectEndOfStream(DemuxerStream::Type type) {
-    EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream()));
-    demuxer_->GetStream(type)->Read(
-        base::Bind(&ChunkDemuxerTest::ReadDone, base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void ExpectRead(DemuxerStream::Type type, int64_t timestamp_in_ms) {
-    EXPECT_CALL(*this,
-                ReadDone(DemuxerStream::kOk, HasTimestamp(timestamp_in_ms)));
-    demuxer_->GetStream(type)->Read(
-        base::Bind(&ChunkDemuxerTest::ReadDone, base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void ExpectConfigChanged(DemuxerStream::Type type) {
-    EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _));
-    demuxer_->GetStream(type)->Read(
-        base::Bind(&ChunkDemuxerTest::ReadDone, base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void CheckExpectedBuffers(DemuxerStream* stream,
-                            const std::string& expected) {
-    std::vector<std::string> timestamps = base::SplitString(
-        expected, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-    std::stringstream ss;
-    for (size_t i = 0; i < timestamps.size(); ++i) {
-      // Initialize status to kAborted since it's possible for Read() to return
-      // without calling StoreStatusAndBuffer() if it doesn't have any buffers
-      // left to return.
-      DemuxerStream::Status status = DemuxerStream::kAborted;
-      scoped_refptr<DecoderBuffer> buffer;
-      stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer,
-                              base::Unretained(this), &status, &buffer));
-      base::RunLoop().RunUntilIdle();
-      if (status != DemuxerStream::kOk || buffer->end_of_stream()) break;
-
-      if (i > 0) ss << " ";
-      ss << buffer->timestamp().InMilliseconds();
-
-      if (buffer->is_key_frame()) ss << "K";
-
-      // Handle preroll buffers.
-      if (base::EndsWith(timestamps[i], "P", base::CompareCase::SENSITIVE)) {
-        ASSERT_EQ(kInfiniteDuration, buffer->discard_padding().first);
-        ASSERT_EQ(base::TimeDelta(), buffer->discard_padding().second);
-        ss << "P";
-      }
-    }
-    EXPECT_EQ(expected, ss.str());
-  }
-
-  MOCK_METHOD1(Checkpoint, void(int id));
-
-  struct BufferTimestamps {
-    int video_time_ms;
-    int audio_time_ms;
-  };
-  static const int kSkip = -1;
-
-  // Test parsing a WebM file.
-  // |filename| - The name of the file in media/test/data to parse.
-  // |timestamps| - The expected timestamps on the parsed buffers.
-  //    a timestamp of kSkip indicates that a Read() call for that stream
-  //    shouldn't be made on that iteration of the loop. If both streams have
-  //    a kSkip then the loop will terminate.
-  bool ParseWebMFile(const std::string& filename,
-                     const BufferTimestamps* timestamps,
-                     const base::TimeDelta& duration) {
-    return ParseWebMFile(filename, timestamps, duration, HAS_AUDIO | HAS_VIDEO);
-  }
-
-  bool ParseWebMFile(const std::string& filename,
-                     const BufferTimestamps* timestamps,
-                     const base::TimeDelta& duration, int stream_flags) {
-    EXPECT_CALL(*this, DemuxerOpened());
-    demuxer_->Initialize(&host_, CreateInitDoneCB(duration, PIPELINE_OK), true);
-
-    if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk) return false;
-
-    // Read a WebM file into memory and send the data to the demuxer.
-    scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename);
-    EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-    EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-
-    // Verify that the timestamps on the first few packets match what we
-    // expect.
-    for (size_t i = 0; (timestamps[i].audio_time_ms != kSkip ||
-                        timestamps[i].video_time_ms != kSkip);
-         i++) {
-      bool audio_read_done = false;
-      bool video_read_done = false;
-
-      if (timestamps[i].audio_time_ms != kSkip) {
-        ReadAudio(base::Bind(
-            &OnReadDone,
-            base::TimeDelta::FromMilliseconds(timestamps[i].audio_time_ms),
-            &audio_read_done));
-        EXPECT_TRUE(audio_read_done);
-      }
-
-      if (timestamps[i].video_time_ms != kSkip) {
-        ReadVideo(base::Bind(
-            &OnReadDone,
-            base::TimeDelta::FromMilliseconds(timestamps[i].video_time_ms),
-            &video_read_done));
-        EXPECT_TRUE(video_read_done);
-      }
-    }
-
-    return true;
-  }
-
-  MOCK_METHOD0(DemuxerOpened, void());
-  MOCK_METHOD2(OnEncryptedMediaInitData,
-               void(EmeInitDataType init_data_type,
-                    const std::vector<uint8_t>& init_data));
-
-  MOCK_METHOD1(InitSegmentReceivedMock, void(std::unique_ptr<MediaTracks>&));
-
-  void Seek(base::TimeDelta seek_time) {
-    demuxer_->StartWaitingForSeek(seek_time);
-    demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void MarkEndOfStream(PipelineStatus status) {
-    demuxer_->MarkEndOfStream(status);
-    base::RunLoop().RunUntilIdle();
-  }
-
-  bool SetTimestampOffset(const std::string& id,
-                          base::TimeDelta timestamp_offset) {
-    if (demuxer_->IsParsingMediaSegment(id)) return false;
-
-    timestamp_offset_map_[id] = timestamp_offset;
-    return true;
-  }
-
-  base::MessageLoop message_loop_;
-  MockDemuxerHost host_;
-
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-
-  std::unique_ptr<ChunkDemuxer> demuxer_;
-  Demuxer::MediaTracksUpdatedCB init_segment_received_cb_;
-
-  base::TimeDelta append_window_start_for_next_append_;
-  base::TimeDelta append_window_end_for_next_append_;
-
-  // Map of source id to timestamp offset to use for the next AppendData()
-  // operation for that source id.
-  std::map<std::string, base::TimeDelta> timestamp_offset_map_;
-
- public:
-  void InitSegmentReceived(std::unique_ptr<MediaTracks> tracks) {
-    DCHECK(tracks.get());
-    DCHECK_GT(tracks->tracks().size(), 0u);
-
-    // Verify that track ids are unique.
-    std::set<MediaTrack::Id> track_ids;
-    for (const auto& track : tracks->tracks()) {
-      EXPECT_EQ(track_ids.end(), track_ids.find(track->id()));
-      track_ids.insert(track->id());
-    }
-
-    InitSegmentReceivedMock(tracks);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
-};
-
-TEST_F(ChunkDemuxerTest, Init) {
-  InSequence s;
-
-  // Test no streams, audio-only, video-only, and audio & video scenarios.
-  // Audio and video streams can be encrypted or not encrypted.
-  for (int i = 0; i < 16; i++) {
-    bool has_audio = (i & 0x1) != 0;
-    bool has_video = (i & 0x2) != 0;
-    bool is_audio_encrypted = (i & 0x4) != 0;
-    bool is_video_encrypted = (i & 0x8) != 0;
-
-    // No test on invalid combination.
-    if ((!has_audio && is_audio_encrypted) ||
-        (!has_video && is_video_encrypted)) {
-      continue;
-    }
-
-    CreateNewDemuxer();
-
-    int stream_flags = 0;
-    if (has_audio) stream_flags |= HAS_AUDIO;
-
-    if (has_video) stream_flags |= HAS_VIDEO;
-
-    if (has_audio || has_video) {
-      ASSERT_TRUE(InitDemuxerWithEncryptionInfo(
-          stream_flags, is_audio_encrypted, is_video_encrypted));
-    } else {
-      ASSERT_FALSE(InitDemuxerWithEncryptionInfo(
-          stream_flags, is_audio_encrypted, is_video_encrypted));
-    }
-
-    DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-    if (has_audio) {
-      ASSERT_TRUE(audio_stream);
-
-      const AudioDecoderConfig& config = audio_stream->audio_decoder_config();
-      EXPECT_EQ(kCodecVorbis, config.codec());
-      EXPECT_EQ(32, config.bits_per_channel());
-      EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout());
-      EXPECT_EQ(44100, config.samples_per_second());
-      EXPECT_GT(config.extra_data().size(), 0u);
-      EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format());
-      EXPECT_EQ(is_audio_encrypted,
-                audio_stream->audio_decoder_config().is_encrypted());
-      EXPECT_TRUE(static_cast<ChunkDemuxerStream*>(audio_stream)
-                      ->supports_partial_append_window_trimming());
-    } else {
-      EXPECT_FALSE(audio_stream);
-    }
-
-    DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-    if (has_video) {
-      EXPECT_TRUE(video_stream);
-      EXPECT_EQ(is_video_encrypted,
-                video_stream->video_decoder_config().is_encrypted());
-      EXPECT_FALSE(static_cast<ChunkDemuxerStream*>(video_stream)
-                       ->supports_partial_append_window_trimming());
-    } else {
-      EXPECT_FALSE(video_stream);
-    }
-
-    ShutdownDemuxer();
-    demuxer_.reset();
-  }
-}
-
-// TODO(acolwell): Fold this test into Init tests since the tests are
-// almost identical.
-TEST_F(ChunkDemuxerTest, InitText) {
-  // Test with 1 video stream and 1 text streams, and 0 or 1 audio streams.
-  // No encryption cases handled here.
-  bool has_video = true;
-  bool is_audio_encrypted = false;
-  bool is_video_encrypted = false;
-  for (int i = 0; i < 2; i++) {
-    bool has_audio = (i & 0x1) != 0;
-
-    CreateNewDemuxer();
-
-    DemuxerStream* text_stream = NULL;
-    TextTrackConfig text_config;
-    EXPECT_CALL(host_, AddTextStream(_, _))
-        .WillOnce(DoAll(SaveArg<0>(&text_stream), SaveArg<1>(&text_config)));
-
-    int stream_flags = HAS_TEXT;
-    if (has_audio) stream_flags |= HAS_AUDIO;
-
-    if (has_video) stream_flags |= HAS_VIDEO;
-
-    ASSERT_TRUE(InitDemuxerWithEncryptionInfo(stream_flags, is_audio_encrypted,
-                                              is_video_encrypted));
-    ASSERT_TRUE(text_stream);
-    EXPECT_EQ(DemuxerStream::TEXT, text_stream->type());
-    EXPECT_EQ(kTextSubtitles, text_config.kind());
-    EXPECT_FALSE(static_cast<ChunkDemuxerStream*>(text_stream)
-                     ->supports_partial_append_window_trimming());
-
-    DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-    if (has_audio) {
-      ASSERT_TRUE(audio_stream);
-
-      const AudioDecoderConfig& config = audio_stream->audio_decoder_config();
-      EXPECT_EQ(kCodecVorbis, config.codec());
-      EXPECT_EQ(32, config.bits_per_channel());
-      EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout());
-      EXPECT_EQ(44100, config.samples_per_second());
-      EXPECT_GT(config.extra_data().size(), 0u);
-      EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format());
-      EXPECT_EQ(is_audio_encrypted,
-                audio_stream->audio_decoder_config().is_encrypted());
-      EXPECT_TRUE(static_cast<ChunkDemuxerStream*>(audio_stream)
-                      ->supports_partial_append_window_trimming());
-    } else {
-      EXPECT_FALSE(audio_stream);
-    }
-
-    DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-    if (has_video) {
-      EXPECT_TRUE(video_stream);
-      EXPECT_EQ(is_video_encrypted,
-                video_stream->video_decoder_config().is_encrypted());
-      EXPECT_FALSE(static_cast<ChunkDemuxerStream*>(video_stream)
-                       ->supports_partial_append_window_trimming());
-    } else {
-      EXPECT_FALSE(video_stream);
-    }
-
-    ShutdownDemuxer();
-    demuxer_.reset();
-  }
-}
-
-TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) {
-  // Test with 1 video stream, 1 audio, and 1 text stream. Send a second init
-  // segment in which the text track ID changes. Verify appended buffers before
-  // and after the second init segment map to the same underlying track buffers.
-  CreateNewDemuxer();
-  DemuxerStream* text_stream = NULL;
-  TextTrackConfig text_config;
-  EXPECT_CALL(host_, AddTextStream(_, _))
-      .WillOnce(DoAll(SaveArg<0>(&text_stream), SaveArg<1>(&text_config)));
-  ASSERT_TRUE(InitDemuxerWithEncryptionInfo(HAS_TEXT | HAS_AUDIO | HAS_VIDEO,
-                                            false, false));
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-  ASSERT_TRUE(audio_stream);
-  ASSERT_TRUE(video_stream);
-  ASSERT_TRUE(text_stream);
-
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
-                     MuxedStreamInfo(kVideoTrackNum, "0K 30", 30),
-                     MuxedStreamInfo(kTextTrackNum, "10K"));
-  CheckExpectedRanges("{ [0,46) }");
-
-  std::unique_ptr<uint8_t[]> info_tracks;
-  int info_tracks_size = 0;
-  CreateInitSegment(
-      HAS_TEXT | HAS_AUDIO | HAS_VIDEO | USE_ALTERNATE_TEXT_TRACK_ID, false,
-      false, &info_tracks, &info_tracks_size);
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(demuxer_->AppendData(
-      kSourceId, info_tracks.get(), info_tracks_size,
-      append_window_start_for_next_append_, append_window_end_for_next_append_,
-      &timestamp_offset_map_[kSourceId]));
-
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
-      MuxedStreamInfo(kVideoTrackNum, "60K",
-                      WebMClusterParser::kDefaultVideoBufferDurationInMs),
-      MuxedStreamInfo(kAlternateTextTrackNum, "45K"));
-
-  CheckExpectedRanges("{ [0,92) }");
-  CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K");
-  CheckExpectedBuffers(video_stream, "0K 30 60K");
-  CheckExpectedBuffers(text_stream, "10K 45K");
-
-  ShutdownDemuxer();
-}
-
-TEST_F(ChunkDemuxerTest, AudioVideoTrackIdsChange) {
-  // Test with 1 audio and 1 video stream. Send a second init segment in which
-  // the audio and video track IDs change. Verify that appended buffers before
-  // and after the second init segment map to the same underlying track buffers.
-  CreateNewDemuxer();
-  ASSERT_TRUE(
-      InitDemuxerWithEncryptionInfo(HAS_AUDIO | HAS_VIDEO, false, false));
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-  ASSERT_TRUE(audio_stream);
-  ASSERT_TRUE(video_stream);
-
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
-                     MuxedStreamInfo(kVideoTrackNum, "0K 30", 30));
-  CheckExpectedRanges("{ [0,46) }");
-
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO |
-                                USE_ALTERNATE_AUDIO_TRACK_ID |
-                                USE_ALTERNATE_VIDEO_TRACK_ID));
-  AppendMuxedCluster(MuxedStreamInfo(kAlternateAudioTrackNum, "46K 69K", 63),
-                     MuxedStreamInfo(kAlternateVideoTrackNum, "60K", 23));
-  CheckExpectedRanges("{ [0,92) }");
-  CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K");
-  CheckExpectedBuffers(video_stream, "0K 30 60K");
-
-  ShutdownDemuxer();
-}
-
-TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) {
-  // Tests that non-key-frames following an init segment are allowed
-  // and dropped, as expected if the initialization segment received
-  // algorithm correctly sets the needs random access point flag to true for all
-  // track buffers. Note that the first initialization segment is insufficient
-  // to fully test this since needs random access point flag initializes to
-  // true.
-  CreateNewDemuxer();
-  DemuxerStream* text_stream = NULL;
-  EXPECT_CALL(host_, AddTextStream(_, _)).WillOnce(SaveArg<0>(&text_stream));
-  ASSERT_TRUE(InitDemuxerWithEncryptionInfo(HAS_TEXT | HAS_AUDIO | HAS_VIDEO,
-                                            false, false));
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-  ASSERT_TRUE(audio_stream && video_stream && text_stream);
-
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum, "23K",
-                      WebMClusterParser::kDefaultAudioBufferDurationInMs),
-      MuxedStreamInfo(kVideoTrackNum, "0 30K", 30),
-      MuxedStreamInfo(kTextTrackNum, "25K 40K"));
-  CheckExpectedRanges("{ [23,46) }");
-
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO));
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
-                     MuxedStreamInfo(kVideoTrackNum, "60 90K", 30),
-                     MuxedStreamInfo(kTextTrackNum, "80K 90K"));
-  CheckExpectedRanges("{ [23,92) }");
-
-  CheckExpectedBuffers(audio_stream, "23K 46K 69K");
-  CheckExpectedBuffers(video_stream, "30K 90K");
-  CheckExpectedBuffers(text_stream, "25K 40K 80K 90K");
-}
-
-TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_,
-      base::Bind(&ChunkDemuxerTest::DemuxerInitialized, base::Unretained(this)),
-      true);
-
-  EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
-  EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk);
-
-  ExpectInitMediaLogs(HAS_AUDIO);
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(AppendInitSegmentWithSourceId("audio", HAS_AUDIO));
-
-  ShutdownDemuxer();
-}
-
-TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_,
-      base::Bind(&ChunkDemuxerTest::DemuxerInitialized, base::Unretained(this)),
-      true);
-
-  EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
-  EXPECT_EQ(AddId("video_and_text", HAS_VIDEO), ChunkDemuxer::kOk);
-
-  EXPECT_CALL(host_, AddTextStream(_, _)).Times(Exactly(1));
-
-  ExpectInitMediaLogs(HAS_VIDEO);
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(
-      AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT));
-
-  ShutdownDemuxer();
-}
-
-// Verifies that all streams waiting for data receive an end of stream
-// buffer when Shutdown() is called.
-TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) {
-  DemuxerStream* text_stream = NULL;
-  EXPECT_CALL(host_, AddTextStream(_, _)).WillOnce(SaveArg<0>(&text_stream));
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
-
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  bool audio_read_done = false;
-  bool video_read_done = false;
-  bool text_read_done = false;
-  audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
-  video_stream->Read(base::Bind(&OnReadDone_EOSExpected, &video_read_done));
-  text_stream->Read(base::Bind(&OnReadDone_EOSExpected, &text_read_done));
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(audio_read_done);
-  EXPECT_FALSE(video_read_done);
-  EXPECT_FALSE(text_read_done);
-
-  ShutdownDemuxer();
-
-  EXPECT_TRUE(audio_read_done);
-  EXPECT_TRUE(video_read_done);
-  EXPECT_TRUE(text_read_done);
-}
-
-// Test that Seek() completes successfully when the first cluster
-// arrives.
-TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-
-  InSequence s;
-
-  EXPECT_CALL(*this, Checkpoint(1));
-
-  Seek(base::TimeDelta::FromMilliseconds(46));
-
-  EXPECT_CALL(*this, Checkpoint(2));
-
-  Checkpoint(1);
-
-  ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
-
-  base::RunLoop().RunUntilIdle();
-
-  Checkpoint(2);
-}
-
-// Test that parsing errors are handled for clusters appended after init.
-TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) {
-  InSequence s;
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
-  AppendGarbage();
-}
-
-// Test the case where a Seek() is requested while the parser
-// is in the middle of cluster. This is to verify that the parser
-// does not reset itself on a seek.
-TEST_F(ChunkDemuxerTest, SeekWhileParsingCluster) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  InSequence s;
-
-  std::unique_ptr<Cluster> cluster_a(GenerateCluster(0, 6));
-
-  // Split the cluster into two appends at an arbitrary point near the end.
-  int first_append_size = cluster_a->size() - 11;
-  int second_append_size = cluster_a->size() - first_append_size;
-
-  // Append the first part of the cluster.
-  ASSERT_TRUE(AppendData(cluster_a->data(), first_append_size));
-
-  ExpectRead(DemuxerStream::AUDIO, 0);
-  ExpectRead(DemuxerStream::VIDEO, 0);
-  ExpectRead(DemuxerStream::AUDIO, kAudioBlockDuration);
-
-  Seek(base::TimeDelta::FromSeconds(5));
-
-  // Append the rest of the cluster.
-  ASSERT_TRUE(
-      AppendData(cluster_a->data() + first_append_size, second_append_size));
-
-  // Append the new cluster and verify that only the blocks
-  // in the new cluster are returned.
-  ASSERT_TRUE(AppendCluster(GenerateCluster(5000, 6)));
-  GenerateExpectedReads(5000, 6);
-}
-
-// Test the case where AppendData() is called before Init().
-TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) {
-  std::unique_ptr<uint8_t[]> info_tracks;
-  int info_tracks_size = 0;
-  CreateInitSegment(HAS_AUDIO | HAS_VIDEO, false, false, &info_tracks,
-                    &info_tracks_size);
-  ASSERT_FALSE(demuxer_->AppendData(
-      kSourceId, info_tracks.get(), info_tracks_size,
-      append_window_start_for_next_append_, append_window_end_for_next_append_,
-      &timestamp_offset_map_[kSourceId]));
-}
-
-// Make sure Read() callbacks are dispatched with the proper data.
-TEST_F(ChunkDemuxerTest, Read) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-
-  bool audio_read_done = false;
-  bool video_read_done = false;
-  ReadAudio(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &audio_read_done));
-  ReadVideo(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &video_read_done));
-
-  EXPECT_TRUE(audio_read_done);
-  EXPECT_TRUE(video_read_done);
-}
-
-TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-  EXPECT_MEDIA_LOG(GeneratedSplice(13000, 10000));
-  ASSERT_TRUE(AppendCluster(GenerateCluster(10, 4)));
-
-  // Make sure that AppendCluster() does not fail with a cluster that has
-  // overlaps with the previously appended cluster.
-  EXPECT_MEDIA_LOG(SkippingSpliceAlreadySpliced(0));
-  ASSERT_TRUE(AppendCluster(GenerateCluster(5, 4)));
-
-  // Verify that AppendData() can still accept more data.
-  std::unique_ptr<Cluster> cluster_c(GenerateCluster(45, 2));
-  EXPECT_MEDIA_LOG(GeneratedSplice(6000, 45000));
-  ASSERT_TRUE(demuxer_->AppendData(
-      kSourceId, cluster_c->data(), cluster_c->size(),
-      append_window_start_for_next_append_, append_window_end_for_next_append_,
-      &timestamp_offset_map_[kSourceId]));
-}
-
-TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-
-  ClusterBuilder cb;
-
-  // Test the case where block timecodes are not monotonically
-  // increasing but stay above the cluster timecode.
-  cb.SetClusterTimecode(5);
-  AddSimpleBlock(&cb, kAudioTrackNum, 5);
-  AddSimpleBlock(&cb, kVideoTrackNum, 10);
-  AddSimpleBlock(&cb, kAudioTrackNum, 7);
-  AddSimpleBlock(&cb, kVideoTrackNum, 15);
-
-  EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode());
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
-  ASSERT_FALSE(AppendCluster(cb.Finish()));
-
-  // Verify that AppendData() ignores data after the error.
-  std::unique_ptr<Cluster> cluster_b(GenerateCluster(20, 2));
-  ASSERT_FALSE(demuxer_->AppendData(
-      kSourceId, cluster_b->data(), cluster_b->size(),
-      append_window_start_for_next_append_, append_window_end_for_next_append_,
-      &timestamp_offset_map_[kSourceId]));
-}
-
-TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-
-  ClusterBuilder cb;
-
-  // Test timecodes going backwards and including values less than the cluster
-  // timecode.
-  cb.SetClusterTimecode(5);
-  AddSimpleBlock(&cb, kAudioTrackNum, 5);
-  AddSimpleBlock(&cb, kVideoTrackNum, 5);
-  AddSimpleBlock(&cb, kAudioTrackNum, 3);
-  AddSimpleBlock(&cb, kVideoTrackNum, 3);
-
-  EXPECT_MEDIA_LOG(WebMNegativeTimecodeOffset("-2"));
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
-  ASSERT_FALSE(AppendCluster(cb.Finish()));
-
-  // Verify that AppendData() ignores data after the error.
-  std::unique_ptr<Cluster> cluster_b(GenerateCluster(6, 2));
-  ASSERT_FALSE(demuxer_->AppendData(
-      kSourceId, cluster_b->data(), cluster_b->size(),
-      append_window_start_for_next_append_, append_window_end_for_next_append_,
-      &timestamp_offset_map_[kSourceId]));
-}
-
-TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-
-  ClusterBuilder cb;
-
-  // Test monotonic increasing timestamps on a per stream
-  // basis.
-  cb.SetClusterTimecode(4);
-  AddSimpleBlock(&cb, kAudioTrackNum, 5);
-  AddSimpleBlock(&cb, kVideoTrackNum, 5);
-  AddSimpleBlock(&cb, kAudioTrackNum, 4);
-  AddSimpleBlock(&cb, kVideoTrackNum, 7);
-
-  EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode());
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
-  ASSERT_FALSE(AppendCluster(cb.Finish()));
-}
-
-// Test the case where a cluster is passed to AppendCluster() before
-// INFO & TRACKS data.
-TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_, NewExpectedStatusCB(CHUNK_DEMUXER_ERROR_APPEND_FAILED), true);
-
-  ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
-
-  EXPECT_MEDIA_LOG(WebMClusterBeforeFirstInfo());
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  ASSERT_FALSE(AppendCluster(GenerateCluster(0, 1)));
-}
-
-// Test cases where we get an MarkEndOfStream() call during initialization.
-TEST_F(ChunkDemuxerTest, EOSDuringInit) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(&host_,
-                       NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
-  MarkEndOfStream(PIPELINE_OK);
-}
-
-TEST_F(ChunkDemuxerTest, EndOfStreamWithNoAppend) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(&host_,
-                       NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
-
-  ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
-
-  CheckExpectedRanges("{ }");
-  MarkEndOfStream(PIPELINE_OK);
-  ShutdownDemuxer();
-  CheckExpectedRanges("{ }");
-  demuxer_->RemoveId(kSourceId);
-  demuxer_.reset();
-}
-
-TEST_F(ChunkDemuxerTest, EndOfStreamWithNoMediaAppend) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  CheckExpectedRanges("{ }");
-  MarkEndOfStream(PIPELINE_OK);
-  CheckExpectedRanges("{ }");
-}
-
-TEST_F(ChunkDemuxerTest, DecodeErrorEndOfStream) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-  CheckExpectedRanges(kDefaultFirstClusterRange);
-
-  EXPECT_CALL(host_,
-              OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR));
-  MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR);
-  CheckExpectedRanges(kDefaultFirstClusterRange);
-}
-
-TEST_F(ChunkDemuxerTest, NetworkErrorEndOfStream) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-  CheckExpectedRanges(kDefaultFirstClusterRange);
-
-  EXPECT_CALL(host_,
-              OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR));
-  MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR);
-}
-
-// Helper class to reduce duplicate code when testing end of stream
-// Read() behavior.
-class EndOfStreamHelper {
- public:
-  explicit EndOfStreamHelper(Demuxer* demuxer)
-      : demuxer_(demuxer), audio_read_done_(false), video_read_done_(false) {}
-
-  // Request a read on the audio and video streams.
-  void RequestReads() {
-    EXPECT_FALSE(audio_read_done_);
-    EXPECT_FALSE(video_read_done_);
-
-    DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
-    DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-    audio->Read(base::Bind(&OnEndOfStreamReadDone, &audio_read_done_));
-    video->Read(base::Bind(&OnEndOfStreamReadDone, &video_read_done_));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Check to see if |audio_read_done_| and |video_read_done_| variables
-  // match |expected|.
-  void CheckIfReadDonesWereCalled(bool expected) {
-    base::RunLoop().RunUntilIdle();
-    EXPECT_EQ(expected, audio_read_done_);
-    EXPECT_EQ(expected, video_read_done_);
-  }
-
- private:
-  static void OnEndOfStreamReadDone(
-      bool* called, DemuxerStream::Status status,
-      const scoped_refptr<DecoderBuffer>& buffer) {
-    EXPECT_EQ(status, DemuxerStream::kOk);
-    EXPECT_TRUE(buffer->end_of_stream());
-    *called = true;
-  }
-
-  Demuxer* demuxer_;
-  bool audio_read_done_;
-  bool video_read_done_;
-
-  DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper);
-};
-
-// Make sure that all pending reads that we don't have media data for get an
-// "end of stream" buffer when MarkEndOfStream() is called.
-TEST_F(ChunkDemuxerTest, EndOfStreamWithPendingReads) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(GenerateCluster(0, 2)));
-
-  bool audio_read_done_1 = false;
-  bool video_read_done_1 = false;
-  EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
-  EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
-
-  ReadAudio(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &audio_read_done_1));
-  ReadVideo(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &video_read_done_1));
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_TRUE(audio_read_done_1);
-  EXPECT_TRUE(video_read_done_1);
-
-  end_of_stream_helper_1.RequestReads();
-
-  EXPECT_CALL(
-      host_,
-      SetDuration(base::TimeDelta::FromMilliseconds(kVideoBlockDuration)));
-  MarkEndOfStream(PIPELINE_OK);
-
-  end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
-
-  end_of_stream_helper_2.RequestReads();
-  end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
-}
-
-// Make sure that all Read() calls after we get an MarkEndOfStream()
-// call return an "end of stream" buffer.
-TEST_F(ChunkDemuxerTest, ReadsAfterEndOfStream) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(GenerateCluster(0, 2)));
-
-  bool audio_read_done_1 = false;
-  bool video_read_done_1 = false;
-  EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
-  EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
-  EndOfStreamHelper end_of_stream_helper_3(demuxer_.get());
-
-  ReadAudio(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &audio_read_done_1));
-  ReadVideo(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &video_read_done_1));
-
-  end_of_stream_helper_1.RequestReads();
-
-  EXPECT_TRUE(audio_read_done_1);
-  EXPECT_TRUE(video_read_done_1);
-  end_of_stream_helper_1.CheckIfReadDonesWereCalled(false);
-
-  EXPECT_CALL(
-      host_,
-      SetDuration(base::TimeDelta::FromMilliseconds(kVideoBlockDuration)));
-  MarkEndOfStream(PIPELINE_OK);
-
-  end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
-
-  // Request a few more reads and make sure we immediately get
-  // end of stream buffers.
-  end_of_stream_helper_2.RequestReads();
-  end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
-
-  end_of_stream_helper_3.RequestReads();
-  end_of_stream_helper_3.CheckIfReadDonesWereCalled(true);
-}
-
-TEST_F(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(0, 10));
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138)));
-  MarkEndOfStream(PIPELINE_OK);
-
-  // Start the first seek.
-  Seek(base::TimeDelta::FromMilliseconds(20));
-
-  // Simulate another seek being requested before the first
-  // seek has finished prerolling.
-  base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(30);
-  demuxer_->CancelPendingSeek(seek_time2);
-
-  // Finish second seek.
-  Seek(seek_time2);
-
-  DemuxerStream::Status status;
-  base::TimeDelta last_timestamp;
-
-  // Make sure audio can reach end of stream.
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
-  ASSERT_EQ(status, DemuxerStream::kOk);
-
-  // Make sure video can reach end of stream.
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
-  ASSERT_EQ(status, DemuxerStream::kOk);
-}
-
-// Verify buffered range change behavior for audio/video/text tracks.
-TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) {
-  DemuxerStream* text_stream = NULL;
-
-  EXPECT_CALL(host_, AddTextStream(_, _)).WillOnce(SaveArg<0>(&text_stream));
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
-
-  AppendMuxedCluster(MuxedStreamInfo(kVideoTrackNum, "0K 33", 33),
-                     MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23));
-
-  // Check expected ranges and verify that an empty text track does not
-  // affect the expected ranges.
-  CheckExpectedRanges("{ [0,46) }");
-
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(66)));
-  MarkEndOfStream(PIPELINE_OK);
-
-  // Check expected ranges and verify that an empty text track does not
-  // affect the expected ranges.
-  CheckExpectedRanges("{ [0,66) }");
-
-  // Unmark end of stream state and verify that the ranges return to
-  // their pre-"end of stream" values.
-  demuxer_->UnmarkEndOfStream();
-  CheckExpectedRanges("{ [0,46) }");
-
-  // Add text track data and verify that the buffered ranges don't change
-  // since the intersection of all the tracks doesn't change.
-  EXPECT_MEDIA_LOG(SkippingSpliceAtOrBefore(0, 0));
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(200)));
-  AppendMuxedCluster(MuxedStreamInfo(kVideoTrackNum, "0K 33", 33),
-                     MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
-                     MuxedStreamInfo(kTextTrackNum, "0K 100K"));
-  CheckExpectedRanges("{ [0,46) }");
-
-  // Mark end of stream and verify that text track data is reflected in
-  // the new range.
-  MarkEndOfStream(PIPELINE_OK);
-  CheckExpectedRanges("{ [0,200) }");
-}
-
-// Make sure AppendData() will accept elements that span multiple calls.
-TEST_F(ChunkDemuxerTest, AppendingInPieces) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(&host_,
-                       CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
-
-  ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
-
-  std::unique_ptr<uint8_t[]> info_tracks;
-  int info_tracks_size = 0;
-  CreateInitSegment(HAS_AUDIO | HAS_VIDEO, false, false, &info_tracks,
-                    &info_tracks_size);
-
-  std::unique_ptr<Cluster> cluster_a(kDefaultFirstCluster());
-  std::unique_ptr<Cluster> cluster_b(kDefaultSecondCluster());
-
-  size_t buffer_size = info_tracks_size + cluster_a->size() + cluster_b->size();
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
-  uint8_t* dst = buffer.get();
-  memcpy(dst, info_tracks.get(), info_tracks_size);
-  dst += info_tracks_size;
-
-  memcpy(dst, cluster_a->data(), cluster_a->size());
-  dst += cluster_a->size();
-
-  memcpy(dst, cluster_b->data(), cluster_b->size());
-  dst += cluster_b->size();
-
-  ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(AppendDataInPieces(buffer.get(), buffer_size));
-
-  GenerateExpectedReads(0, 9);
-}
-
-TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) {
-  struct BufferTimestamps buffer_timestamps[] = {
-      {0, 0}, {33, 3}, {67, 6}, {100, 9}, {133, 12}, {kSkip, kSkip},
-  };
-
-  ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7);
-
-  // Expect duration adjustment since actual duration differs slightly from
-  // duration in the init segment.
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
-
-  ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps,
-                            base::TimeDelta::FromMilliseconds(2744)));
-  EXPECT_EQ(212949, demuxer_->GetMemoryUsage());
-}
-
-TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) {
-  struct BufferTimestamps buffer_timestamps[] = {
-      {0, 0}, {33, 3}, {67, 6}, {100, 9}, {133, 12}, {kSkip, kSkip},
-  };
-
-  ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7);
-  ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps,
-                            kInfiniteDuration));
-
-  DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
-  EXPECT_EQ(DemuxerStream::LIVENESS_LIVE, audio->liveness());
-  DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
-  EXPECT_EQ(DemuxerStream::LIVENESS_LIVE, video->liveness());
-  EXPECT_EQ(212949, demuxer_->GetMemoryUsage());
-}
-
-TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) {
-  struct BufferTimestamps buffer_timestamps[] = {
-      {kSkip, 0}, {kSkip, 3},  {kSkip, 6},
-      {kSkip, 9}, {kSkip, 12}, {kSkip, kSkip},
-  };
-
-  ExpectInitMediaLogs(HAS_AUDIO);
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
-
-  // Expect duration adjustment since actual duration differs slightly from
-  // duration in the init segment.
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
-
-  ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps,
-                            base::TimeDelta::FromMilliseconds(2744),
-                            HAS_AUDIO));
-  EXPECT_EQ(18624, demuxer_->GetMemoryUsage());
-}
-
-TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) {
-  struct BufferTimestamps buffer_timestamps[] = {
-      {0, kSkip},   {33, kSkip},  {67, kSkip},
-      {100, kSkip}, {133, kSkip}, {kSkip, kSkip},
-  };
-
-  ExpectInitMediaLogs(HAS_VIDEO);
-
-  // Expect duration adjustment since actual duration differs slightly from
-  // duration in the init segment.
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2736)));
-
-  ASSERT_TRUE(ParseWebMFile("bear-320x240-video-only.webm", buffer_timestamps,
-                            base::TimeDelta::FromMilliseconds(2703),
-                            HAS_VIDEO));
-  EXPECT_EQ(194325, demuxer_->GetMemoryUsage());
-}
-
-TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) {
-  struct BufferTimestamps buffer_timestamps[] = {
-      {0, 0}, {33, 3}, {33, 6}, {67, 9}, {100, 12}, {kSkip, kSkip},
-  };
-
-  ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
-  ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps,
-                            base::TimeDelta::FromMilliseconds(2767)));
-}
-
-// Verify that we output buffers before the entire cluster has been parsed.
-TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  std::unique_ptr<Cluster> cluster(GenerateCluster(0, 6));
-
-  bool audio_read_done = false;
-  bool video_read_done = false;
-  ReadAudio(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &audio_read_done));
-  ReadVideo(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &video_read_done));
-
-  // Make sure the reads haven't completed yet.
-  EXPECT_FALSE(audio_read_done);
-  EXPECT_FALSE(video_read_done);
-
-  // Append data one byte at a time until one or both reads complete.
-  int i = 0;
-  for (; i < cluster->size() && !(audio_read_done || video_read_done); ++i) {
-    ASSERT_TRUE(AppendData(cluster->data() + i, 1));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  EXPECT_TRUE(audio_read_done || video_read_done);
-  EXPECT_GT(i, 0);
-  EXPECT_LT(i, cluster->size());
-
-  audio_read_done = false;
-  video_read_done = false;
-  ReadAudio(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(23),
-                       &audio_read_done));
-  ReadVideo(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(33),
-                       &video_read_done));
-
-  // Make sure the reads haven't completed yet.
-  EXPECT_FALSE(audio_read_done);
-  EXPECT_FALSE(video_read_done);
-
-  // Append the remaining data.
-  ASSERT_LT(i, cluster->size());
-  ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i));
-
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_TRUE(audio_read_done);
-  EXPECT_TRUE(video_read_done);
-}
-
-TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_, CreateInitDoneCB(kNoTimestamp, CHUNK_DEMUXER_ERROR_APPEND_FAILED),
-      true);
-
-  ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
-
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  uint8_t tmp = 0;
-  ASSERT_FALSE(demuxer_->AppendData(
-      kSourceId, &tmp, 1, append_window_start_for_next_append_,
-      append_window_end_for_next_append_, &timestamp_offset_map_[kSourceId]));
-}
-
-TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_, CreateInitDoneCB(kNoTimestamp, CHUNK_DEMUXER_ERROR_APPEND_FAILED),
-      true);
-
-  ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", "vorbis"),
-            ChunkDemuxer::kOk);
-  demuxer_->SetTracksWatcher(kSourceId,
-                             base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
-                                        base::Unretained(this)));
-
-  // Video track is unexpected per mimetype.
-  EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("Video", "vp8"));
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  ASSERT_FALSE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO));
-}
-
-TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_, CreateInitDoneCB(kNoTimestamp, CHUNK_DEMUXER_ERROR_APPEND_FAILED),
-      true);
-
-  ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", "vp8"), ChunkDemuxer::kOk);
-  demuxer_->SetTracksWatcher(kSourceId,
-                             base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
-                                        base::Unretained(this)));
-
-  // Audio track is unexpected per mimetype.
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
-  EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("Audio", "vorbis"));
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  ASSERT_FALSE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO));
-}
-
-TEST_F(ChunkDemuxerTest, AudioOnlyHeaderWithAVType) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_, CreateInitDoneCB(kNoTimestamp, CHUNK_DEMUXER_ERROR_APPEND_FAILED),
-      true);
-
-  ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", "vorbis,vp8"),
-            ChunkDemuxer::kOk);
-  demuxer_->SetTracksWatcher(kSourceId,
-                             base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
-                                        base::Unretained(this)));
-
-  // Video track is also expected per mimetype.
-  EXPECT_MEDIA_LOG(FoundStream("audio"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "vorbis"));
-  EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("vp8"));
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  ASSERT_FALSE(AppendInitSegment(HAS_AUDIO));
-}
-
-TEST_F(ChunkDemuxerTest, VideoOnlyHeaderWithAVType) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_, CreateInitDoneCB(kNoTimestamp, CHUNK_DEMUXER_ERROR_APPEND_FAILED),
-      true);
-
-  ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", "vorbis,vp8"),
-            ChunkDemuxer::kOk);
-  demuxer_->SetTracksWatcher(kSourceId,
-                             base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
-                                        base::Unretained(this)));
-
-  // Audio track is also expected per mimetype.
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
-  EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("vorbis"));
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  ASSERT_FALSE(AppendInitSegment(HAS_VIDEO));
-}
-
-TEST_F(ChunkDemuxerTest, MultipleHeaders) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-
-  // Append another identical initialization segment.
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
-
-  GenerateExpectedReads(0, 9);
-}
-
-TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) {
-  std::string audio_id = "audio1";
-  std::string video_id = "video1";
-  ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
-
-  // Append audio and video data into separate source ids.
-  ASSERT_TRUE(AppendCluster(
-      audio_id,
-      GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
-  GenerateAudioStreamExpectedReads(0, 4);
-  ASSERT_TRUE(AppendCluster(video_id,
-                            GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
-                                                        kVideoBlockDuration)));
-  GenerateVideoStreamExpectedReads(0, 4);
-}
-
-TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) {
-  // TODO(matthewjheaney): Here and elsewhere, we need more tests
-  // for inband text tracks (http://crbug/321455).
-
-  std::string audio_id = "audio1";
-  std::string video_id = "video1";
-
-  EXPECT_CALL(host_, AddTextStream(_, _)).Times(Exactly(2));
-  ASSERT_TRUE(InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, true));
-
-  // Append audio and video data into separate source ids.
-  ASSERT_TRUE(AppendCluster(
-      audio_id,
-      GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
-  GenerateAudioStreamExpectedReads(0, 4);
-  ASSERT_TRUE(AppendCluster(video_id,
-                            GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
-                                                        kVideoBlockDuration)));
-  GenerateVideoStreamExpectedReads(0, 4);
-}
-
-TEST_F(ChunkDemuxerTest, AddIdFailures) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(&host_,
-                       CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
-
-  std::string audio_id = "audio1";
-  std::string video_id = "video1";
-
-  ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk);
-
-  ExpectInitMediaLogs(HAS_AUDIO);
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO));
-
-  // Adding an id after append should fail.
-  ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit);
-}
-
-// Test that Read() calls after a RemoveId() return "end of stream" buffers.
-TEST_F(ChunkDemuxerTest, RemoveId) {
-  std::string audio_id = "audio1";
-  std::string video_id = "video1";
-  ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
-
-  // Append audio and video data into separate source ids.
-  ASSERT_TRUE(AppendCluster(
-      audio_id,
-      GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
-  ASSERT_TRUE(AppendCluster(video_id,
-                            GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
-                                                        kVideoBlockDuration)));
-
-  // Read() from audio should return normal buffers.
-  GenerateAudioStreamExpectedReads(0, 4);
-
-  // Audio stream will become inaccessible after |audio_id| is removed, so save
-  // it here to read from it after RemoveId.
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-
-  // Remove the audio id.
-  demuxer_->RemoveId(audio_id);
-
-  // Read() from audio should return "end of stream" buffers.
-  bool audio_read_done = false;
-  audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(audio_read_done);
-
-  // Read() from video should still return normal buffers.
-  GenerateVideoStreamExpectedReads(0, 4);
-}
-
-// Test that removing an ID immediately after adding it does not interfere with
-// quota for new IDs in the future.
-TEST_F(ChunkDemuxerTest, RemoveAndAddId) {
-  std::string audio_id_1 = "audio1";
-  ASSERT_TRUE(AddId(audio_id_1, HAS_AUDIO) == ChunkDemuxer::kOk);
-  demuxer_->RemoveId(audio_id_1);
-
-  std::string audio_id_2 = "audio2";
-  ASSERT_TRUE(AddId(audio_id_2, HAS_AUDIO) == ChunkDemuxer::kOk);
-}
-
-TEST_F(ChunkDemuxerTest, SeekCanceled) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  // Append cluster at the beginning of the stream.
-  ASSERT_TRUE(AppendCluster(GenerateCluster(0, 4)));
-
-  // Seek to an unbuffered region.
-  Seek(base::TimeDelta::FromSeconds(50));
-
-  // Attempt to read in unbuffered area; should not fulfill the read.
-  bool audio_read_done = false;
-  bool video_read_done = false;
-  ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
-  ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
-  EXPECT_FALSE(audio_read_done);
-  EXPECT_FALSE(video_read_done);
-
-  // Now cancel the pending seek, which should flush the reads with empty
-  // buffers.
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
-  demuxer_->CancelPendingSeek(seek_time);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(audio_read_done);
-  EXPECT_TRUE(video_read_done);
-
-  // A seek back to the buffered region should succeed.
-  Seek(seek_time);
-  GenerateExpectedReads(0, 4);
-}
-
-TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  // Append cluster at the beginning of the stream.
-  ASSERT_TRUE(AppendCluster(GenerateCluster(0, 4)));
-
-  // Start waiting for a seek.
-  base::TimeDelta seek_time1 = base::TimeDelta::FromSeconds(50);
-  base::TimeDelta seek_time2 = base::TimeDelta::FromSeconds(0);
-  demuxer_->StartWaitingForSeek(seek_time1);
-
-  // Now cancel the upcoming seek to an unbuffered region.
-  demuxer_->CancelPendingSeek(seek_time2);
-  demuxer_->Seek(seek_time1, NewExpectedStatusCB(PIPELINE_OK));
-
-  // Read requests should be fulfilled with empty buffers.
-  bool audio_read_done = false;
-  bool video_read_done = false;
-  ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
-  ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
-  EXPECT_TRUE(audio_read_done);
-  EXPECT_TRUE(video_read_done);
-
-  // A seek back to the buffered region should succeed.
-  Seek(seek_time2);
-  GenerateExpectedReads(0, 4);
-}
-
-// Test that Seek() successfully seeks to all source IDs.
-TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) {
-  std::string audio_id = "audio1";
-  std::string video_id = "video1";
-  ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
-
-  ASSERT_TRUE(AppendCluster(
-      audio_id,
-      GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
-  ASSERT_TRUE(AppendCluster(video_id,
-                            GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
-                                                        kVideoBlockDuration)));
-
-  // Read() should return buffers at 0.
-  bool audio_read_done = false;
-  bool video_read_done = false;
-  ReadAudio(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &audio_read_done));
-  ReadVideo(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(0),
-                       &video_read_done));
-  EXPECT_TRUE(audio_read_done);
-  EXPECT_TRUE(video_read_done);
-
-  // Seek to 3 (an unbuffered region).
-  Seek(base::TimeDelta::FromSeconds(3));
-
-  audio_read_done = false;
-  video_read_done = false;
-  ReadAudio(base::Bind(&OnReadDone, base::TimeDelta::FromSeconds(3),
-                       &audio_read_done));
-  ReadVideo(base::Bind(&OnReadDone, base::TimeDelta::FromSeconds(3),
-                       &video_read_done));
-  // Read()s should not return until after data is appended at the Seek point.
-  EXPECT_FALSE(audio_read_done);
-  EXPECT_FALSE(video_read_done);
-
-  ASSERT_TRUE(AppendCluster(
-      audio_id, GenerateSingleStreamCluster(3000, 3092, kAudioTrackNum,
-                                            kAudioBlockDuration)));
-  ASSERT_TRUE(AppendCluster(
-      video_id, GenerateSingleStreamCluster(3000, 3132, kVideoTrackNum,
-                                            kVideoBlockDuration)));
-
-  base::RunLoop().RunUntilIdle();
-
-  // Read() should return buffers at 3.
-  EXPECT_TRUE(audio_read_done);
-  EXPECT_TRUE(video_read_done);
-}
-
-// Test that Seek() completes successfully when EndOfStream
-// is called before data is available for that seek point.
-// This scenario might be useful if seeking past the end of stream
-// of either audio or video (or both).
-TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum,
-                      "0K 10K 20K 30K 40K 50K 60K 70K 80K 90K 100K 110K", 10),
-      MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K", 20));
-  CheckExpectedRanges("{ [0,100) }");
-
-  // Seeking past the end of video.
-  // Note: audio data is available for that seek point.
-  bool seek_cb_was_called = false;
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(110);
-  demuxer_->StartWaitingForSeek(seek_time);
-  demuxer_->Seek(seek_time,
-                 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called));
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(seek_cb_was_called);
-
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(120)));
-  MarkEndOfStream(PIPELINE_OK);
-  CheckExpectedRanges("{ [0,120) }");
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_TRUE(seek_cb_was_called);
-
-  ShutdownDemuxer();
-}
-
-// Test that EndOfStream is ignored if coming during a pending seek
-// whose seek time is before some existing ranges.
-TEST_F(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum,
-                      "0K 10K 20K 30K 40K 50K 60K 70K 80K 90K 100K 110K", 10),
-      MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K", 20));
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum,
-                      "200K 210K 220K 230K 240K 250K 260K 270K 280K 290K", 10),
-      MuxedStreamInfo(kVideoTrackNum, "200K 220K 240K 260K 280K", 20));
-
-  bool seek_cb_was_called = false;
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160);
-  demuxer_->StartWaitingForSeek(seek_time);
-  demuxer_->Seek(seek_time,
-                 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called));
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(seek_cb_was_called);
-
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(300)));
-  MarkEndOfStream(PIPELINE_OK);
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(seek_cb_was_called);
-
-  demuxer_->UnmarkEndOfStream();
-
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum, "140K 150K 160K 170K", 10),
-      MuxedStreamInfo(kVideoTrackNum, "140K 145K 150K 155K 160K 165K 170K 175K",
-                      20));
-
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_TRUE(seek_cb_was_called);
-
-  ShutdownDemuxer();
-}
-
-// Test ranges in an audio-only stream.
-TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-
-  // Test a simple cluster.
-  ASSERT_TRUE(AppendCluster(
-      GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
-
-  CheckExpectedRanges("{ [0,92) }");
-
-  // Append a disjoint cluster to check for two separate ranges.
-  ASSERT_TRUE(AppendCluster(GenerateSingleStreamCluster(
-      150, 219, kAudioTrackNum, kAudioBlockDuration)));
-
-  CheckExpectedRanges("{ [0,92) [150,219) }");
-}
-
-// Test ranges in a video-only stream.
-TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
-  ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
-
-  // Test a simple cluster.
-  ASSERT_TRUE(AppendCluster(GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
-                                                        kVideoBlockDuration)));
-
-  CheckExpectedRanges("{ [0,132) }");
-
-  // Append a disjoint cluster to check for two separate ranges.
-  ASSERT_TRUE(AppendCluster(GenerateSingleStreamCluster(
-      200, 299, kVideoTrackNum, kVideoBlockDuration)));
-
-  CheckExpectedRanges("{ [0,132) [200,299) }");
-}
-
-TEST_F(ChunkDemuxerTest, GetBufferedRanges_SeparateStreams) {
-  std::string audio_id = "audio1";
-  std::string video_id = "video1";
-  ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
-
-  // Append audio and video data into separate source ids.
-
-  // Audio block: 0 -> 23
-  // Video block: 0 -> 33
-  // Buffered Range: 0 -> 23
-  // Audio block duration is smaller than video block duration,
-  // so the buffered ranges should correspond to the audio blocks.
-  ASSERT_TRUE(AppendCluster(
-      audio_id, GenerateSingleStreamCluster(0, 23, kAudioTrackNum, 23)));
-  ASSERT_TRUE(AppendCluster(
-      video_id, GenerateSingleStreamCluster(0, 33, kVideoTrackNum, 33)));
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }");
-  CheckExpectedRangesForMediaSource("{ [0,23) }");
-
-  // Audio blocks: 300 -> 400
-  // Video blocks: 320 -> 420
-  // Buffered Range: 320 -> 400  (jagged start and end across SourceBuffers)
-  ASSERT_TRUE(AppendCluster(
-      audio_id, GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50)));
-  ASSERT_TRUE(AppendCluster(
-      video_id, GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50)));
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) }");
-  CheckExpectedRangesForMediaSource("{ [0,23) [320,400) }");
-
-  // Audio block: 520 -> 590
-  // Video block: 500 -> 570
-  // Buffered Range: 520 -> 570  (jagged start and end across SourceBuffers)
-  ASSERT_TRUE(AppendCluster(
-      audio_id, GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70)));
-  ASSERT_TRUE(AppendCluster(
-      video_id, GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70)));
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [520,590) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) [500,570) }");
-  CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) }");
-
-  // Audio block: 720 -> 750
-  // Video block: 700 -> 770
-  // Buffered Range: 720 -> 750  (complete overlap of audio)
-  ASSERT_TRUE(AppendCluster(
-      audio_id, GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30)));
-  ASSERT_TRUE(AppendCluster(
-      video_id, GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70)));
-  CheckExpectedRanges(DemuxerStream::AUDIO,
-                      "{ [0,23) [300,400) [520,590) [720,750) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO,
-                      "{ [0,33) [320,420) [500,570) [700,770) }");
-  CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) [720,750) }");
-
-  // Audio block: 900 -> 970
-  // Video block: 920 -> 950
-  // Buffered Range: 920 -> 950  (complete overlap of video)
-  ASSERT_TRUE(AppendCluster(
-      audio_id, GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70)));
-  ASSERT_TRUE(AppendCluster(
-      video_id, GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30)));
-  CheckExpectedRanges(DemuxerStream::AUDIO,
-                      "{ [0,23) [300,400) [520,590) [720,750) [900,970) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO,
-                      "{ [0,33) [320,420) [500,570) [700,770) [920,950) }");
-  CheckExpectedRangesForMediaSource(
-      "{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
-
-  // Appending within buffered range should not affect buffered ranges.
-  EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000));
-  ASSERT_TRUE(AppendCluster(
-      audio_id, GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20)));
-  ASSERT_TRUE(AppendCluster(
-      video_id, GenerateSingleStreamCluster(930, 950, kVideoTrackNum, 20)));
-  CheckExpectedRanges(DemuxerStream::AUDIO,
-                      "{ [0,23) [300,400) [520,590) [720,750) [900,970) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO,
-                      "{ [0,33) [320,420) [500,570) [700,770) [920,950) }");
-  CheckExpectedRangesForMediaSource(
-      "{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
-}
-
-TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  // Audio block: 0 -> 23
-  // Video block: 0 -> 33
-  // Buffered Range: 0 -> 23
-  // Audio block duration is smaller than video block duration,
-  // so the buffered ranges should correspond to the audio blocks.
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0D23K"),
-                     MuxedStreamInfo(kVideoTrackNum, "0D33K"));
-
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }");
-  CheckExpectedRanges("{ [0,23) }");
-
-  // Audio blocks: 300 -> 400
-  // Video blocks: 320 -> 420
-  // Naive Buffered Range: 320 -> 400  (end overlap) **
-  // **Except these are in the same cluster, with same segment start time of
-  // 300, so the added buffered range is 300 -> 400  (still with end overlap)
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "300K 350D50K"),
-                     MuxedStreamInfo(kVideoTrackNum, "320K 370D50K"));
-
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [300,420) }");
-  CheckExpectedRanges("{ [0,23) [300,400) }");
-
-  // Audio block: 520 -> 590
-  // Video block: 500 -> 570
-  // Naive Buffered Range: 520 -> 570  (front overlap) **
-  // **Except these are in the same cluster, with same segment start time of
-  // 500, so the added buffered range is 500 -> 570
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "520D70K"),
-                     MuxedStreamInfo(kVideoTrackNum, "500D70K"));
-
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [500,590) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [300,420) [500,570) }");
-  CheckExpectedRanges("{ [0,23) [300,400) [500,570) }");
-
-  // Audio block: 720 -> 750
-  // Video block: 700 -> 770
-  // Naive Buffered Range: 720 -> 750  (complete overlap, audio) **
-  // **Except these are in the same cluster, with same segment start time of
-  // 700, so the added buffered range is 700 -> 750
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "720D30K"),
-                     MuxedStreamInfo(kVideoTrackNum, "700D70K"));
-
-  CheckExpectedRanges(DemuxerStream::AUDIO,
-                      "{ [0,23) [300,400) [500,590) [700,750) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO,
-                      "{ [0,33) [300,420) [500,570) [700,770) }");
-  CheckExpectedRanges("{ [0,23) [300,400) [500,570) [700,750) }");
-
-  // Audio block: 900 -> 970
-  // Video block: 920 -> 950
-  // Naive Buffered Range: 920 -> 950  (complete overlap, video) **
-  // **Except these are in the same cluster, with same segment start time of
-  // 900, so the added buffered range is 900 -> 950
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "900D70K"),
-                     MuxedStreamInfo(kVideoTrackNum, "920D30K"));
-
-  CheckExpectedRanges(DemuxerStream::AUDIO,
-                      "{ [0,23) [300,400) [500,590) [700,750) [900,970) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO,
-                      "{ [0,33) [300,420) [500,570) [700,770) [900,950) }");
-  CheckExpectedRanges("{ [0,23) [300,400) [500,570) [700,750) [900,950) }");
-
-  // Appending within buffered range should not affect buffered ranges.
-  EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000));
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "930D20K"),
-                     MuxedStreamInfo(kVideoTrackNum, "930D20K"));
-  CheckExpectedRanges(DemuxerStream::AUDIO,
-                      "{ [0,23) [300,400) [500,590) [700,750) [900,970) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO,
-                      "{ [0,33) [300,420) [500,570) [700,770) [900,950) }");
-  CheckExpectedRanges("{ [0,23) [300,400) [500,570) [700,750) [900,950) }");
-}
-
-TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) {
-  EXPECT_CALL(host_, AddTextStream(_, _));
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
-
-  // Append audio & video data
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
-                     MuxedStreamInfo(kVideoTrackNum, "0K 33", 33));
-
-  // Verify that a text track with no cues does not result in an empty buffered
-  // range.
-  CheckExpectedRanges("{ [0,46) }");
-
-  // Add some text cues.
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "100K 123K", 23),
-                     MuxedStreamInfo(kVideoTrackNum, "100K 133", 33),
-                     MuxedStreamInfo(kTextTrackNum, "100K 200K"));
-
-  // Verify that the text cues are not reflected in the buffered ranges.
-  CheckExpectedRanges("{ [0,46) [100,146) }");
-
-  // Remove the buffered ranges.
-  demuxer_->Remove(kSourceId, base::TimeDelta(),
-                   base::TimeDelta::FromMilliseconds(250));
-  CheckExpectedRanges("{ }");
-}
-
-// Once MarkEndOfStream() is called, GetBufferedRanges should not cut off any
-// over-hanging tails at the end of the ranges as this is likely due to block
-// duration differences.
-TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
-                     MuxedStreamInfo(kVideoTrackNum, "0K 33", 33));
-
-  CheckExpectedRanges("{ [0,46) }");
-
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(66)));
-  MarkEndOfStream(PIPELINE_OK);
-
-  // Verify that the range extends to the end of the video data.
-  CheckExpectedRanges("{ [0,66) }");
-
-  // Verify that the range reverts to the intersection when end of stream
-  // has been cancelled.
-  demuxer_->UnmarkEndOfStream();
-  CheckExpectedRanges("{ [0,46) }");
-
-  // Append and remove data so that the 2 streams' end ranges do not overlap.
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(398)));
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum, "200K 223K", 23),
-      MuxedStreamInfo(kVideoTrackNum, "200K 233 266 299 332K 365", 33));
-
-  // At this point, the per-stream ranges are as follows:
-  // Audio: [0,46) [200,246)
-  // Video: [0,66) [200,398)
-  CheckExpectedRanges("{ [0,46) [200,246) }");
-
-  demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(200),
-                   base::TimeDelta::FromMilliseconds(300));
-
-  // At this point, the per-stream ranges are as follows:
-  // Audio: [0,46)
-  // Video: [0,66) [332,398)
-  CheckExpectedRanges("{ [0,46) }");
-
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "200K 223K", 23),
-                     MuxedStreamInfo(kVideoTrackNum, "200K 233", 33));
-
-  // At this point, the per-stream ranges are as follows:
-  // Audio: [0,46) [200,246)
-  // Video: [0,66) [200,266) [332,398)
-  // NOTE: The last range on each stream do not overlap in time.
-  CheckExpectedRanges("{ [0,46) [200,246) }");
-
-  MarkEndOfStream(PIPELINE_OK);
-
-  // NOTE: The last range on each stream gets extended to the highest
-  // end timestamp according to the spec. The last audio range gets extended
-  // from [200,246) to [200,398) which is why the intersection results in the
-  // middle range getting larger AND the new range appearing.
-  CheckExpectedRanges("{ [0,46) [200,266) [332,398) }");
-}
-
-TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  // Create a cluster where the video timecode begins 25ms after the audio.
-  ASSERT_TRUE(AppendCluster(GenerateCluster(0, 25, 8)));
-
-  Seek(base::TimeDelta::FromSeconds(0));
-  GenerateExpectedReads(0, 25, 8);
-
-  // Seek to 5 seconds.
-  Seek(base::TimeDelta::FromSeconds(5));
-
-  // Generate a cluster to fulfill this seek, where audio timecode begins 25ms
-  // after the video.
-  ASSERT_TRUE(AppendCluster(GenerateCluster(5025, 5000, 8)));
-  GenerateExpectedReads(5025, 5000, 8);
-}
-
-TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) {
-  std::string audio_id = "audio1";
-  std::string video_id = "video1";
-  ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
-
-  // Generate two streams where the video stream starts 5ms after the audio
-  // stream and append them.
-  ASSERT_TRUE(AppendCluster(
-      audio_id,
-      GenerateSingleStreamCluster(25, 4 * kAudioBlockDuration + 25,
-                                  kAudioTrackNum, kAudioBlockDuration)));
-  ASSERT_TRUE(AppendCluster(
-      video_id,
-      GenerateSingleStreamCluster(30, 4 * kVideoBlockDuration + 30,
-                                  kVideoTrackNum, kVideoBlockDuration)));
-
-  // Both streams should be able to fulfill a seek to 25.
-  Seek(base::TimeDelta::FromMilliseconds(25));
-  GenerateAudioStreamExpectedReads(25, 4);
-  GenerateVideoStreamExpectedReads(30, 4);
-}
-
-TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) {
-  std::string audio_id = "audio1";
-  std::string video_id = "video1";
-  ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
-
-  // Generate two streams where the video stream starts 10s after the audio
-  // stream and append them.
-  ASSERT_TRUE(AppendCluster(
-      audio_id,
-      GenerateSingleStreamCluster(0, 4 * kAudioBlockDuration + 0,
-                                  kAudioTrackNum, kAudioBlockDuration)));
-  ASSERT_TRUE(AppendCluster(
-      video_id,
-      GenerateSingleStreamCluster(10000, 4 * kVideoBlockDuration + 10000,
-                                  kVideoTrackNum, kVideoBlockDuration)));
-
-  // Should not be able to fulfill a seek to 0.
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(0);
-  demuxer_->StartWaitingForSeek(seek_time);
-  demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_ERROR_ABORT));
-  ExpectRead(DemuxerStream::AUDIO, 0);
-  ExpectEndOfStream(DemuxerStream::VIDEO);
-}
-
-TEST_F(ChunkDemuxerTest, CodecPrefixMatching) {
-  ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported;
-
-#if defined(USE_PROPRIETARY_CODECS)
-#if defined(OS_ANDROID)
-  if (HasPlatformDecoderSupport()) expected = ChunkDemuxer::kOk;
-#else
-  expected = ChunkDemuxer::kOk;
-#endif
-#endif
-
-  EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", "avc1.4D4041"), expected);
-}
-
-// Test codec ID's that are not compliant with RFC6381, but have been
-// seen in the wild.
-TEST_F(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) {
-  ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported;
-
-#if defined(USE_PROPRIETARY_CODECS)
-  expected = ChunkDemuxer::kOk;
-#endif
-  const char* codec_ids[] = {
-      // GPAC places leading zeros on the audio object type.
-      "mp4a.40.02", "mp4a.40.05"};
-
-  for (size_t i = 0; i < arraysize(codec_ids); ++i) {
-    ChunkDemuxer::Status result =
-        demuxer_->AddId("source_id", "audio/mp4", codec_ids[i]);
-
-    EXPECT_EQ(result, expected)
-        << "Fail to add codec_id '" << codec_ids[i] << "'";
-
-    if (result == ChunkDemuxer::kOk) demuxer_->RemoveId("source_id");
-  }
-}
-
-TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
-
-  base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92);
-  base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99);
-
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-  ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
-  MarkEndOfStream(PIPELINE_OK);
-
-  DemuxerStream::Status status;
-  base::TimeDelta last_timestamp;
-
-  // Verify that we can read audio & video to the end w/o problems.
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
-  EXPECT_EQ(DemuxerStream::kOk, status);
-  EXPECT_EQ(kLastAudioTimestamp, last_timestamp);
-
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
-  EXPECT_EQ(DemuxerStream::kOk, status);
-  EXPECT_EQ(kLastVideoTimestamp, last_timestamp);
-
-  // Seek back to 0 and verify that we can read to the end again..
-  Seek(base::TimeDelta::FromMilliseconds(0));
-
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
-  EXPECT_EQ(DemuxerStream::kOk, status);
-  EXPECT_EQ(kLastAudioTimestamp, last_timestamp);
-
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
-  EXPECT_EQ(DemuxerStream::kOk, status);
-  EXPECT_EQ(kLastVideoTimestamp, last_timestamp);
-}
-
-TEST_F(ChunkDemuxerTest, GetBufferedRangesBeforeInitSegment) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_,
-      base::Bind(&ChunkDemuxerTest::DemuxerInitialized, base::Unretained(this)),
-      true);
-  ASSERT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
-  ASSERT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk);
-
-  CheckExpectedRanges("audio", "{ }");
-  CheckExpectedRanges("video", "{ }");
-}
-
-// Test that Seek() completes successfully when the first cluster
-// arrives.
-TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) {
-  InSequence s;
-
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
-  demuxer_->StartWaitingForSeek(seek_time);
-
-  ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(
-                         kDefaultSecondClusterEndTimestamp)));
-  MarkEndOfStream(PIPELINE_OK);
-
-  demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK));
-
-  GenerateExpectedReads(0, 4);
-  GenerateExpectedReads(46, 66, 5);
-
-  EndOfStreamHelper end_of_stream_helper(demuxer_.get());
-  end_of_stream_helper.RequestReads();
-  end_of_stream_helper.CheckIfReadDonesWereCalled(true);
-}
-
-TEST_F(ChunkDemuxerTest, ConfigChange_Video) {
-  InSequence s;
-
-  ASSERT_TRUE(InitDemuxerWithConfigChangeData());
-
-  DemuxerStream::Status status;
-  base::TimeDelta last_timestamp;
-
-  DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  // Fetch initial video config and verify it matches what we expect.
-  const VideoDecoderConfig& video_config_1 = video->video_decoder_config();
-  ASSERT_TRUE(video_config_1.IsValidConfig());
-  EXPECT_EQ(video_config_1.natural_size().width(), 320);
-  EXPECT_EQ(video_config_1.natural_size().height(), 240);
-
-  ExpectRead(DemuxerStream::VIDEO, 0);
-
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
-
-  ASSERT_EQ(status, DemuxerStream::kConfigChanged);
-  EXPECT_EQ(last_timestamp.InMilliseconds(), 501);
-
-  // Fetch the new decoder config.
-  const VideoDecoderConfig& video_config_2 = video->video_decoder_config();
-  ASSERT_TRUE(video_config_2.IsValidConfig());
-  EXPECT_EQ(video_config_2.natural_size().width(), 640);
-  EXPECT_EQ(video_config_2.natural_size().height(), 360);
-
-  ExpectRead(DemuxerStream::VIDEO, 527);
-
-  // Read until the next config change.
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
-  ASSERT_EQ(status, DemuxerStream::kConfigChanged);
-  EXPECT_EQ(last_timestamp.InMilliseconds(), 760);
-
-  // Get the new config and verify that it matches the first one.
-  ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
-
-  ExpectRead(DemuxerStream::VIDEO, 801);
-
-  // Read until the end of the stream just to make sure there aren't any other
-  // config changes.
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
-  ASSERT_EQ(status, DemuxerStream::kOk);
-}
-
-TEST_F(ChunkDemuxerTest, ConfigChange_Audio) {
-  InSequence s;
-
-  ASSERT_TRUE(InitDemuxerWithConfigChangeData());
-
-  DemuxerStream::Status status;
-  base::TimeDelta last_timestamp;
-
-  DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
-
-  // Fetch initial audio config and verify it matches what we expect.
-  const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config();
-  ASSERT_TRUE(audio_config_1.IsValidConfig());
-  EXPECT_EQ(audio_config_1.samples_per_second(), 44100);
-  EXPECT_EQ(audio_config_1.extra_data().size(), 3863u);
-
-  ExpectRead(DemuxerStream::AUDIO, 0);
-
-  // The first config change seen is from a splice frame representing an overlap
-  // of buffer from config 1 by buffers from config 2.
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
-  ASSERT_EQ(status, DemuxerStream::kConfigChanged);
-  EXPECT_EQ(last_timestamp.InMilliseconds(), 524);
-
-  // Fetch the new decoder config.
-  const AudioDecoderConfig& audio_config_2 = audio->audio_decoder_config();
-  ASSERT_TRUE(audio_config_2.IsValidConfig());
-  EXPECT_EQ(audio_config_2.samples_per_second(), 44100);
-  EXPECT_EQ(audio_config_2.extra_data().size(), 3935u);
-
-  // The next config change is from a splice frame representing an overlap of
-  // buffers from config 2 by buffers from config 1.
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
-  ASSERT_EQ(status, DemuxerStream::kConfigChanged);
-  EXPECT_EQ(last_timestamp.InMilliseconds(), 782);
-  ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config()));
-
-  // Read until the end of the stream just to make sure there aren't any other
-  // config changes.
-  ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
-  ASSERT_EQ(status, DemuxerStream::kOk);
-  EXPECT_EQ(last_timestamp.InMilliseconds(), 2744);
-}
-
-TEST_F(ChunkDemuxerTest, ConfigChange_Seek) {
-  InSequence s;
-
-  ASSERT_TRUE(InitDemuxerWithConfigChangeData());
-
-  DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  // Fetch initial video config and verify it matches what we expect.
-  const VideoDecoderConfig& video_config_1 = video->video_decoder_config();
-  ASSERT_TRUE(video_config_1.IsValidConfig());
-  EXPECT_EQ(video_config_1.natural_size().width(), 320);
-  EXPECT_EQ(video_config_1.natural_size().height(), 240);
-
-  ExpectRead(DemuxerStream::VIDEO, 0);
-
-  // Seek to a location with a different config.
-  Seek(base::TimeDelta::FromMilliseconds(527));
-
-  // Verify that the config change is signalled.
-  ExpectConfigChanged(DemuxerStream::VIDEO);
-
-  // Fetch the new decoder config and verify it is what we expect.
-  const VideoDecoderConfig& video_config_2 = video->video_decoder_config();
-  ASSERT_TRUE(video_config_2.IsValidConfig());
-  EXPECT_EQ(video_config_2.natural_size().width(), 640);
-  EXPECT_EQ(video_config_2.natural_size().height(), 360);
-
-  // Verify that Read() will return a buffer now.
-  ExpectRead(DemuxerStream::VIDEO, 527);
-
-  // Seek back to the beginning and verify we get another config change.
-  Seek(base::TimeDelta::FromMilliseconds(0));
-  ExpectConfigChanged(DemuxerStream::VIDEO);
-  ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
-  ExpectRead(DemuxerStream::VIDEO, 0);
-
-  // Seek to a location that requires a config change and then
-  // seek to a new location that has the same configuration as
-  // the start of the file without a Read() in the middle.
-  Seek(base::TimeDelta::FromMilliseconds(527));
-  Seek(base::TimeDelta::FromMilliseconds(801));
-
-  // Verify that no config change is signalled.
-  ExpectRead(DemuxerStream::VIDEO, 801);
-  ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
-}
-
-TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30)));
-  ASSERT_TRUE(AppendCluster(GenerateCluster(0, 2)));
-
-  Seek(base::TimeDelta::FromMilliseconds(30000));
-
-  GenerateExpectedReads(30000, 2);
-}
-
-TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1)));
-  ASSERT_TRUE(AppendCluster(GenerateCluster(1000, 2)));
-
-  GenerateExpectedReads(0, 2);
-}
-
-TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) {
-  std::string audio_id = "audio1";
-  std::string video_id = "video1";
-  ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
-
-  ASSERT_TRUE(
-      SetTimestampOffset(audio_id, base::TimeDelta::FromMilliseconds(-2500)));
-  ASSERT_TRUE(
-      SetTimestampOffset(video_id, base::TimeDelta::FromMilliseconds(-2500)));
-  ASSERT_TRUE(AppendCluster(
-      audio_id,
-      GenerateSingleStreamCluster(2500, 2500 + kAudioBlockDuration * 4,
-                                  kAudioTrackNum, kAudioBlockDuration)));
-  ASSERT_TRUE(AppendCluster(
-      video_id,
-      GenerateSingleStreamCluster(2500, 2500 + kVideoBlockDuration * 4,
-                                  kVideoTrackNum, kVideoBlockDuration)));
-  GenerateAudioStreamExpectedReads(0, 4);
-  GenerateVideoStreamExpectedReads(0, 4);
-
-  Seek(base::TimeDelta::FromMilliseconds(27300));
-
-  ASSERT_TRUE(
-      SetTimestampOffset(audio_id, base::TimeDelta::FromMilliseconds(27300)));
-  ASSERT_TRUE(
-      SetTimestampOffset(video_id, base::TimeDelta::FromMilliseconds(27300)));
-  ASSERT_TRUE(AppendCluster(
-      audio_id,
-      GenerateSingleStreamCluster(0, kAudioBlockDuration * 4, kAudioTrackNum,
-                                  kAudioBlockDuration)));
-  ASSERT_TRUE(AppendCluster(
-      video_id,
-      GenerateSingleStreamCluster(0, kVideoBlockDuration * 4, kVideoTrackNum,
-                                  kVideoBlockDuration)));
-  GenerateVideoStreamExpectedReads(27300, 4);
-  GenerateAudioStreamExpectedReads(27300, 4);
-}
-
-TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  std::unique_ptr<Cluster> cluster = GenerateCluster(0, 2);
-  // Append only part of the cluster data.
-  ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13));
-
-  // Confirm we're in the middle of parsing a media segment.
-  ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
-
-  demuxer_->ResetParserState(kSourceId, append_window_start_for_next_append_,
-                             append_window_end_for_next_append_,
-                             &timestamp_offset_map_[kSourceId]);
-
-  // After ResetParserState(), parsing should no longer be in the middle of a
-  // media segment.
-  ASSERT_FALSE(demuxer_->IsParsingMediaSegment(kSourceId));
-}
-
-#if defined(USE_PROPRIETARY_CODECS)
-#if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
-namespace {
-const char* kMp2tMimeType = "video/mp2t";
-const char* kMp2tCodecs = "mp4a.40.2,avc1.640028";
-}  // namespace
-
-TEST_F(ChunkDemuxerTest, EmitBuffersDuringAbort) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  EXPECT_MEDIA_LOG(FoundStream("audio"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "aac"));
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "h264"));
-  demuxer_->Initialize(&host_, CreateInitDoneCB(kInfiniteDuration, PIPELINE_OK),
-                       true);
-  EXPECT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, kMp2tMimeType, kMp2tCodecs));
-
-  // For info:
-  // DTS/PTS derived using dvbsnoop -s ts -if bear-1280x720.ts -tssubdecode
-  // Video: first PES:
-  //        PTS: 126912 (0x0001efc0)  [= 90 kHz-Timestamp: 0:00:01.4101]
-  //        DTS: 123909 (0x0001e405)  [= 90 kHz-Timestamp: 0:00:01.3767]
-  // Audio: first PES:
-  //        PTS: 126000 (0x0001ec30)  [= 90 kHz-Timestamp: 0:00:01.4000]
-  //        DTS: 123910 (0x0001e406)  [= 90 kHz-Timestamp: 0:00:01.3767]
-  // Video: last PES:
-  //        PTS: 370155 (0x0005a5eb)  [= 90 kHz-Timestamp: 0:00:04.1128]
-  //        DTS: 367152 (0x00059a30)  [= 90 kHz-Timestamp: 0:00:04.0794]
-  // Audio: last PES:
-  //        PTS: 353788 (0x000565fc)  [= 90 kHz-Timestamp: 0:00:03.9309]
-
-  scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(AppendData(kSourceId, buffer->data(), buffer->data_size()));
-
-  // Confirm we're in the middle of parsing a media segment.
-  ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
-
-  // ResetParserState on the Mpeg2 TS parser triggers the emission of the last
-  // video buffer which is pending in the stream parser.
-  Ranges<base::TimeDelta> range_before_abort =
-      demuxer_->GetBufferedRanges(kSourceId);
-  demuxer_->ResetParserState(kSourceId, append_window_start_for_next_append_,
-                             append_window_end_for_next_append_,
-                             &timestamp_offset_map_[kSourceId]);
-  Ranges<base::TimeDelta> range_after_abort =
-      demuxer_->GetBufferedRanges(kSourceId);
-
-  ASSERT_EQ(range_before_abort.size(), 1u);
-  ASSERT_EQ(range_after_abort.size(), 1u);
-  EXPECT_EQ(range_after_abort.start(0), range_before_abort.start(0));
-  EXPECT_GT(range_after_abort.end(0), range_before_abort.end(0));
-}
-
-TEST_F(ChunkDemuxerTest, SeekCompleteDuringAbort) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  EXPECT_MEDIA_LOG(FoundStream("audio"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "aac"));
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "h264"));
-  demuxer_->Initialize(&host_, CreateInitDoneCB(kInfiniteDuration, PIPELINE_OK),
-                       true);
-  EXPECT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, kMp2tMimeType, kMp2tCodecs));
-
-  // For info:
-  // DTS/PTS derived using dvbsnoop -s ts -if bear-1280x720.ts -tssubdecode
-  // Video: first PES:
-  //        PTS: 126912 (0x0001efc0)  [= 90 kHz-Timestamp: 0:00:01.4101]
-  //        DTS: 123909 (0x0001e405)  [= 90 kHz-Timestamp: 0:00:01.3767]
-  // Audio: first PES:
-  //        PTS: 126000 (0x0001ec30)  [= 90 kHz-Timestamp: 0:00:01.4000]
-  //        DTS: 123910 (0x0001e406)  [= 90 kHz-Timestamp: 0:00:01.3767]
-  // Video: last PES:
-  //        PTS: 370155 (0x0005a5eb)  [= 90 kHz-Timestamp: 0:00:04.1128]
-  //        DTS: 367152 (0x00059a30)  [= 90 kHz-Timestamp: 0:00:04.0794]
-  // Audio: last PES:
-  //        PTS: 353788 (0x000565fc)  [= 90 kHz-Timestamp: 0:00:03.9309]
-
-  scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  ASSERT_TRUE(AppendData(kSourceId, buffer->data(), buffer->data_size()));
-
-  // Confirm we're in the middle of parsing a media segment.
-  ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
-
-  // Seek to a time corresponding to buffers that will be emitted during the
-  // abort.
-  Seek(base::TimeDelta::FromMilliseconds(4110));
-
-  // ResetParserState on the Mpeg2 TS parser triggers the emission of the last
-  // video buffer which is pending in the stream parser.
-  demuxer_->ResetParserState(kSourceId, append_window_start_for_next_append_,
-                             append_window_end_for_next_append_,
-                             &timestamp_offset_map_[kSourceId]);
-}
-
-#endif
-#endif
-
-TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) {
-  const uint8_t kBuffer[] = {
-      // CLUSTER (size = 10)
-      0x1F, 0x43, 0xB6, 0x75, 0x8A,
-
-      // Cluster TIMECODE (value = 1)
-      0xE7, 0x81, 0x01,
-
-      // SIMPLEBLOCK (size = 5)
-      0xA3, 0x85,
-
-      // Audio Track Number
-      0x80 | (kAudioTrackNum & 0x7F),
-
-      // Timecode (relative to cluster) (value = 0)
-      0x00, 0x00,
-
-      // Keyframe flag
-      0x80,
-
-      // Fake block data
-      0x00,
-
-      // CLUSTER (size = unknown; really 10)
-      0x1F, 0x43, 0xB6, 0x75, 0xFF,
-
-      // Cluster TIMECODE (value = 2)
-      0xE7, 0x81, 0x02,
-
-      // SIMPLEBLOCK (size = 5)
-      0xA3, 0x85,
-
-      // Audio Track Number
-      0x80 | (kAudioTrackNum & 0x7F),
-
-      // Timecode (relative to cluster) (value = 0)
-      0x00, 0x00,
-
-      // Keyframe flag
-      0x80,
-
-      // Fake block data
-      0x00,
-
-      // EBMLHEADER (size = 10, not fully appended)
-      0x1A, 0x45, 0xDF, 0xA3, 0x8A,
-  };
-
-  // This array indicates expected return value of IsParsingMediaSegment()
-  // following each incrementally appended byte in |kBuffer|.
-  const bool kExpectedReturnValues[] = {
-      // First Cluster, explicit size
-      false, false, false, false, true, true, true, true, true, true, true,
-      true, true, true, false,
-
-      // Second Cluster, unknown size
-      false, false, false, false, true, true, true, true, true, true, true,
-      true, true, true, true,
-
-      // EBMLHEADER
-      true, true, true, true, false,
-  };
-
-  static_assert(arraysize(kBuffer) == arraysize(kExpectedReturnValues),
-                "test arrays out of sync");
-  static_assert(arraysize(kBuffer) == sizeof(kBuffer),
-                "there should be one byte per index");
-
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)).Times(2);
-  EXPECT_MEDIA_LOG(GeneratedSplice(22000, 2000));
-  for (size_t i = 0; i < sizeof(kBuffer); i++) {
-    DVLOG(3) << "Appending and testing index " << i;
-    ASSERT_TRUE(AppendData(kBuffer + i, 1));
-    bool expected_return_value = kExpectedReturnValues[i];
-    EXPECT_EQ(expected_return_value,
-              demuxer_->IsParsingMediaSegment(kSourceId));
-  }
-}
-
-TEST_F(ChunkDemuxerTest, DurationChange) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  const int kStreamDuration = kDefaultDuration().InMilliseconds();
-
-  // Add data leading up to the currently set duration.
-  ASSERT_TRUE(
-      AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration,
-                                    kStreamDuration - kVideoBlockDuration, 2)));
-
-  CheckExpectedRanges("{ [201191,201224) }");
-
-  // Add data beginning at the currently set duration and expect a new duration
-  // to be signaled. Note that the last video block will have a higher end
-  // timestamp than the last audio block.
-  const int kNewStreamDurationVideo = kStreamDuration + kVideoBlockDuration;
-  EXPECT_CALL(
-      host_,
-      SetDuration(base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo)));
-  ASSERT_TRUE(
-      AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2)));
-
-  CheckExpectedRanges("{ [201191,201247) }");
-
-  // Add more data to the end of each media type. Note that the last audio block
-  // will have a higher end timestamp than the last video block.
-  const int kFinalStreamDuration = kStreamDuration + kAudioBlockDuration * 3;
-  EXPECT_CALL(
-      host_,
-      SetDuration(base::TimeDelta::FromMilliseconds(kFinalStreamDuration)));
-  ASSERT_TRUE(
-      AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration,
-                                    kStreamDuration + kVideoBlockDuration, 3)));
-
-  // See that the range has increased appropriately (but not to the full
-  // duration of 201293, since there is not enough video appended for that).
-  CheckExpectedRanges("{ [201191,201290) }");
-}
-
-TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration()));
-  EXPECT_CALL(
-      host_, SetDuration(kDefaultDuration() + base::TimeDelta::FromMilliseconds(
-                                                  kVideoBlockDuration * 2)));
-  ASSERT_TRUE(AppendCluster(GenerateCluster(0, 4)));
-}
-
-TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(
-                         kDefaultFirstClusterEndTimestamp)));
-  MarkEndOfStream(PIPELINE_OK);
-}
-
-TEST_F(ChunkDemuxerTest, ZeroLengthAppend) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  ASSERT_TRUE(AppendData(NULL, 0));
-}
-
-TEST_F(ChunkDemuxerTest, AppendAfterEndOfStream) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
-
-  ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
-  MarkEndOfStream(PIPELINE_OK);
-
-  demuxer_->UnmarkEndOfStream();
-
-  ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
-  MarkEndOfStream(PIPELINE_OK);
-}
-
-// Test receiving a Shutdown() call before we get an Initialize()
-// call. This can happen if video element gets destroyed before
-// the pipeline has a chance to initialize the demuxer.
-TEST_F(ChunkDemuxerTest, Shutdown_BeforeInitialize) {
-  demuxer_->Shutdown();
-  demuxer_->Initialize(&host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN),
-                       true);
-  base::RunLoop().RunUntilIdle();
-}
-
-// Verifies that signaling end of stream while stalled at a gap
-// boundary does not trigger end of stream buffers to be returned.
-TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(0, 10));
-  ASSERT_TRUE(AppendCluster(300, 10));
-  CheckExpectedRanges("{ [0,132) [300,432) }");
-
-  GenerateExpectedReads(0, 10);
-
-  bool audio_read_done = false;
-  bool video_read_done = false;
-  ReadAudio(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(138),
-                       &audio_read_done));
-  ReadVideo(base::Bind(&OnReadDone, base::TimeDelta::FromMilliseconds(138),
-                       &video_read_done));
-
-  // Verify that the reads didn't complete
-  EXPECT_FALSE(audio_read_done);
-  EXPECT_FALSE(video_read_done);
-
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(438)));
-  MarkEndOfStream(PIPELINE_OK);
-
-  // Verify that the reads still haven't completed.
-  EXPECT_FALSE(audio_read_done);
-  EXPECT_FALSE(video_read_done);
-
-  demuxer_->UnmarkEndOfStream();
-
-  ASSERT_TRUE(AppendCluster(138, 22));
-
-  base::RunLoop().RunUntilIdle();
-
-  CheckExpectedRanges("{ [0,435) }");
-
-  // Verify that the reads have completed.
-  EXPECT_TRUE(audio_read_done);
-  EXPECT_TRUE(video_read_done);
-
-  // Read the rest of the buffers.
-  GenerateExpectedReads(161, 171, 20);
-
-  // Verify that reads block because the append cleared the end of stream state.
-  audio_read_done = false;
-  video_read_done = false;
-  ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
-  ReadVideo(base::Bind(&OnReadDone_EOSExpected, &video_read_done));
-
-  // Verify that the reads don't complete.
-  EXPECT_FALSE(audio_read_done);
-  EXPECT_FALSE(video_read_done);
-
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(437)));
-  MarkEndOfStream(PIPELINE_OK);
-
-  EXPECT_TRUE(audio_read_done);
-  EXPECT_TRUE(video_read_done);
-}
-
-TEST_F(ChunkDemuxerTest, CanceledSeekDuringInitialPreroll) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  // Cancel preroll.
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200);
-  demuxer_->CancelPendingSeek(seek_time);
-
-  // Initiate the seek to the new location.
-  Seek(seek_time);
-
-  // Append data to satisfy the seek.
-  ASSERT_TRUE(AppendCluster(seek_time.InMilliseconds(), 10));
-}
-
-TEST_F(ChunkDemuxerTest, SetMemoryLimitType) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  // Set different memory limits for audio and video.
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize);
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::VIDEO, 5 * kBlockSize + 1);
-
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(1000);
-
-  // Append data at the start that can be garbage collected:
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum,
-                      "0K 23K 46K 69K 92K 115K 138K 161K 184K 207K", 23),
-      MuxedStreamInfo(kVideoTrackNum, "0K 33K 66K 99K 132K", 33));
-
-  // We should be right at buffer limit, should pass
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(
-      kSourceId, base::TimeDelta::FromMilliseconds(0), 0));
-
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,230) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,165) }");
-
-  // Seek so we can garbage collect the data appended above.
-  Seek(seek_time);
-
-  // Append data at seek_time.
-  AppendMuxedCluster(
-      MuxedStreamInfo(
-          kAudioTrackNum,
-          "1000K 1023K 1046K 1069K 1092K 1115K 1138K 1161K 1184K 1207K", 23),
-      MuxedStreamInfo(kVideoTrackNum, "1000K 1033K 1066K 1099K 1132K", 33));
-
-  // We should delete first append, and be exactly at buffer limit
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 0));
-
-  // Verify that the old data, and nothing more, has been garbage collected.
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [1000,1230) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [1000,1165) }");
-}
-
-TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekForward) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize);
-  // Append some data at position 1000ms
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 10);
-  CheckExpectedRanges("{ [1000,1230) }");
-
-  // GC should be able to evict frames in the currently buffered range, since
-  // those frames are earlier than the seek target position.
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(2000);
-  Seek(seek_time);
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 5 * kBlockSize));
-
-  // Append data to complete seek operation
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
-  CheckExpectedRanges("{ [1115,1230) [2000,2115) }");
-}
-
-TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekBack) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize);
-  // Append some data at position 1000ms
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 10);
-  CheckExpectedRanges("{ [1000,1230) }");
-
-  // GC should be able to evict frames in the currently buffered range, since
-  // seek target position has no data and so we should allow some frames to be
-  // evicted to make space for the upcoming append at seek target position.
-  base::TimeDelta seek_time = base::TimeDelta();
-  Seek(seek_time);
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 5 * kBlockSize));
-
-  // Append data to complete seek operation
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 5);
-  CheckExpectedRanges("{ [0,115) [1115,1230) }");
-}
-
-TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekForward) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize);
-  // Append some data at position 1000ms then at 2000ms
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5);
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
-  CheckExpectedRanges("{ [1000,1115) [2000,2115) }");
-
-  // GC should be able to evict frames in the currently buffered ranges, since
-  // those frames are earlier than the seek target position.
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(3000);
-  Seek(seek_time);
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 8 * kBlockSize));
-
-  // Append data to complete seek operation
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 3000, 5);
-  CheckExpectedRanges("{ [2069,2115) [3000,3115) }");
-}
-
-TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween1) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize);
-  // Append some data at position 1000ms then at 2000ms
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5);
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
-  CheckExpectedRanges("{ [1000,1115) [2000,2115) }");
-
-  // GC should be able to evict all frames from the first buffered range, since
-  // those frames are earlier than the seek target position. But there's only 5
-  // blocks worth of data in the first range and seek target position has no
-  // data, so GC proceeds with trying to delete some frames from the back of
-  // buffered ranges, that doesn't yield anything, since that's the most
-  // recently appended data, so then GC starts removing data from the front of
-  // the remaining buffered range (2000ms) to ensure we free up enough space for
-  // the upcoming append and allow seek to proceed.
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(1500);
-  Seek(seek_time);
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 8 * kBlockSize));
-
-  // Append data to complete seek operation
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1500, 5);
-  CheckExpectedRanges("{ [1500,1615) [2069,2115) }");
-}
-
-TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween2) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize);
-
-  // Append some data at position 2000ms first, then at 1000ms, so that the last
-  // appended data position is in the first buffered range (that matters to the
-  // GC algorithm since it tries to preserve more recently appended data).
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5);
-  CheckExpectedRanges("{ [1000,1115) [2000,2115) }");
-
-  // Now try performing garbage collection without announcing seek first, i.e.
-  // without calling Seek(), the GC algorithm should try to preserve data in the
-  // first range, since that is most recently appended data.
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(2030);
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 5 * kBlockSize));
-
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1500, 5);
-  CheckExpectedRanges("{ [1000,1115) [1500,1615) }");
-}
-
-TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekBack) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize);
-  // Append some data at position 1000ms then at 2000ms
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5);
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
-  CheckExpectedRanges("{ [1000,1115) [2000,2115) }");
-
-  // GC should be able to evict frames in the currently buffered ranges, since
-  // those frames are earlier than the seek target position.
-  base::TimeDelta seek_time = base::TimeDelta();
-  Seek(seek_time);
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 8 * kBlockSize));
-
-  // Append data to complete seek operation
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 5);
-  CheckExpectedRanges("{ [0,115) [2069,2115) }");
-}
-
-TEST_F(ChunkDemuxerTest, GCDuringSeek) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 5 * kBlockSize);
-
-  base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(1000);
-  base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(500);
-
-  // Initiate a seek to |seek_time1|.
-  Seek(seek_time1);
-
-  // Append data to satisfy the first seek request.
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
-                            seek_time1.InMilliseconds(), 5);
-  CheckExpectedRanges("{ [1000,1115) }");
-
-  // We are under memory limit, so Evict should be a no-op.
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time1, 0));
-  CheckExpectedRanges("{ [1000,1115) }");
-
-  // Signal that the second seek is starting.
-  demuxer_->StartWaitingForSeek(seek_time2);
-
-  // Append data to satisfy the second seek.
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
-                            seek_time2.InMilliseconds(), 5);
-  CheckExpectedRanges("{ [500,615) [1000,1115) }");
-
-  // We are now over our memory usage limit. We have just seeked to |seek_time2|
-  // so data around 500ms position should be preserved, while the previous
-  // append at 1000ms should be removed.
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time2, 0));
-  CheckExpectedRanges("{ [500,615) }");
-
-  // Complete the seek.
-  demuxer_->Seek(seek_time2, NewExpectedStatusCB(PIPELINE_OK));
-
-  // Append more data and make sure that we preserve both the buffered range
-  // around |seek_time2|, because that's the current playback position,
-  // and the newly appended range, since this is the most recent append.
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5);
-  EXPECT_FALSE(demuxer_->EvictCodedFrames(kSourceId, seek_time2, 0));
-  CheckExpectedRanges("{ [500,615) [700,815) }");
-}
-
-TEST_F(ChunkDemuxerTest, GCKeepPlayhead) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 5 * kBlockSize);
-
-  // Append data at the start that can be garbage collected:
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
-  CheckExpectedRanges("{ [0,230) }");
-
-  // We expect garbage collection to fail, as we don't want to spontaneously
-  // create gaps in source buffer stream. Gaps could break playback for many
-  // clients, who don't bother to check ranges after append.
-  EXPECT_FALSE(demuxer_->EvictCodedFrames(
-      kSourceId, base::TimeDelta::FromMilliseconds(0), 0));
-  CheckExpectedRanges("{ [0,230) }");
-
-  // Increase media_time a bit, this will allow some data to be collected, but
-  // we are still over memory usage limit.
-  base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(23 * 2);
-  Seek(seek_time1);
-  EXPECT_FALSE(demuxer_->EvictCodedFrames(kSourceId, seek_time1, 0));
-  CheckExpectedRanges("{ [46,230) }");
-
-  base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(23 * 4);
-  Seek(seek_time2);
-  EXPECT_FALSE(demuxer_->EvictCodedFrames(kSourceId, seek_time2, 0));
-  CheckExpectedRanges("{ [92,230) }");
-
-  // media_time has progressed to a point where we can collect enough data to
-  // be under memory limit, so Evict should return true.
-  base::TimeDelta seek_time3 = base::TimeDelta::FromMilliseconds(23 * 6);
-  Seek(seek_time3);
-  EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time3, 0));
-  // Strictly speaking the current playback time is 23*6==138ms, so we could
-  // release data up to 138ms, but we only release as much data as necessary
-  // to bring memory usage under the limit, so we release only up to 115ms.
-  CheckExpectedRanges("{ [115,230) }");
-}
-
-TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
-  ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
-  DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  // Set the append window to [50,280).
-  append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50);
-  append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
-
-  // Append a cluster that starts before and ends after the append window.
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
-                            "0K 30 60 90 120K 150 180 210 240K 270 300 330K");
-
-  // Verify that GOPs that start outside the window are not included
-  // in the buffer. Also verify that buffers that start inside the
-  // window and extend beyond the end of the window are not included.
-  CheckExpectedRanges("{ [120,270) }");
-  CheckExpectedBuffers(stream, "120K 150 180 210 240K");
-
-  // Extend the append window to [50,650).
-  append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
-
-  // Append more data and verify that adding buffers start at the next
-  // key frame.
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
-                            "360 390 420K 450 480 510 540K 570 600 630K");
-  CheckExpectedRanges("{ [120,270) [420,630) }");
-}
-
-TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-
-  // Set the append window to [50,280).
-  append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50);
-  append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
-
-  // Append a cluster that starts before and ends after the append window.
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
-  AppendSingleStreamCluster(
-      kSourceId, kAudioTrackNum,
-      "0K 30K 60K 90K 120K 150K 180K 210K 240K 270K 300K 330K");
-
-  // Verify that frames that end outside the window are not included
-  // in the buffer. Also verify that buffers that start inside the
-  // window and extend beyond the end of the window are not included.
-  //
-  // The first 50ms of the range should be truncated since it overlaps
-  // the start of the append window.
-  CheckExpectedRanges("{ [50,280) }");
-
-  // The "50P" buffer is the "0" buffer marked for complete discard.  The next
-  // "50" buffer is the "30" buffer marked with 20ms of start discard.
-  CheckExpectedBuffers(stream, "50KP 50K 60K 90K 120K 150K 180K 210K 240K");
-
-  // Extend the append window to [50,650).
-  append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
-
-  // Append more data and verify that a new range is created.
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
-  AppendSingleStreamCluster(
-      kSourceId, kAudioTrackNum,
-      "360K 390K 420K 450K 480K 510K 540K 570K 600K 630K");
-  CheckExpectedRanges("{ [50,280) [360,650) }");
-}
-
-TEST_F(ChunkDemuxerTest, AppendWindow_AudioOverlapStartAndEnd) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-
-  // Set the append window to [10,20).
-  append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(10);
-  append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
-
-  // Append a cluster that starts before and ends after the append window.
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
-      WebMClusterParser::kDefaultAudioBufferDurationInMs));
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K");
-
-  // Verify the append is clipped to the append window.
-  CheckExpectedRanges("{ [10,20) }");
-}
-
-TEST_F(ChunkDemuxerTest, AppendWindow_WebMFile_AudioOnly) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_,
-      CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK),
-      true);
-  ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO));
-
-  // Set the append window to [50,150).
-  append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50);
-  append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(150);
-
-  // Read a WebM file into memory and send the data to the demuxer.  The chunk
-  // size has been chosen carefully to ensure the preroll buffer used by the
-  // partial append window trim must come from a previous Append() call.
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-320x240-audio-only.webm");
-  ExpectInitMediaLogs(HAS_AUDIO);
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
-  ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 128));
-
-  DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  CheckExpectedBuffers(stream, "50KP 50K 62K 86K 109K 122K 125K 128K");
-}
-
-TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(
-      &host_,
-      CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK),
-      true);
-  ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO));
-
-  // Set the append window such that the first file is completely before the
-  // append window.
-  // Expect duration adjustment since actual duration differs slightly from
-  // duration in the init segment.
-  const base::TimeDelta duration_1 = base::TimeDelta::FromMilliseconds(2746);
-  append_window_start_for_next_append_ = duration_1;
-
-  // Read a WebM file into memory and append the data.
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-320x240-audio-only.webm");
-  ExpectInitMediaLogs(HAS_AUDIO);
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
-  ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-  CheckExpectedRanges("{ }");
-
-  DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  AudioDecoderConfig config_1 = stream->audio_decoder_config();
-
-  // Read a second WebM with a different config in and append the data.
-  scoped_refptr<DecoderBuffer> buffer2 =
-      ReadTestDataFile("bear-320x240-audio-only-48khz.webm");
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(21));
-  EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
-  ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1));
-  ASSERT_TRUE(AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512));
-  CheckExpectedRanges("{ [2746,5519) }");
-
-  Seek(duration_1);
-  ExpectConfigChanged(DemuxerStream::AUDIO);
-  ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config()));
-  CheckExpectedBuffers(stream, "2746K 2767K 2789K 2810K");
-}
-
-TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
-  DemuxerStream* text_stream = NULL;
-  EXPECT_CALL(host_, AddTextStream(_, _)).WillOnce(SaveArg<0>(&text_stream));
-  ASSERT_TRUE(InitDemuxer(HAS_VIDEO | HAS_TEXT));
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  // Set the append window to [20,280).
-  append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
-  append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
-
-  // Append a cluster that starts before and ends after the append
-  // window.
-  AppendMuxedCluster(
-      MuxedStreamInfo(kVideoTrackNum,
-                      "0K 30 60 90 120K 150 180 210 240K 270 300 330K", 30),
-      MuxedStreamInfo(kTextTrackNum, "0K 100K 200K 300K"));
-
-  // Verify that text cues that start outside the window are not included
-  // in the buffer. Also verify that cues that extend beyond the
-  // window are not included.
-  CheckExpectedRanges("{ [100,270) }");
-  CheckExpectedBuffers(video_stream, "120K 150 180 210 240K");
-  CheckExpectedBuffers(text_stream, "100K");
-
-  // Extend the append window to [20,650).
-  append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
-
-  // Append more data and verify that a new range is created.
-  AppendMuxedCluster(
-      MuxedStreamInfo(kVideoTrackNum,
-                      "360 390 420K 450 480 510 540K 570 600 630K", 30),
-      MuxedStreamInfo(kTextTrackNum, "400K 500K 600K 700K"));
-  CheckExpectedRanges("{ [100,270) [400,630) }");
-
-  // Seek to the new range and verify that the expected buffers are returned.
-  Seek(base::TimeDelta::FromMilliseconds(420));
-  CheckExpectedBuffers(video_stream, "420K 450 480 510 540K 570 600");
-  CheckExpectedBuffers(text_stream, "400K 500K");
-}
-
-TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  EXPECT_MEDIA_LOG(StreamParsingFailed());
-  EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
-  AppendGarbage();
-  base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50);
-  demuxer_->StartWaitingForSeek(seek_time);
-}
-
-TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) {
-  DemuxerStream* text_stream = NULL;
-  EXPECT_CALL(host_, AddTextStream(_, _)).WillOnce(SaveArg<0>(&text_stream));
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
-
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum, "0K 20K 40K 60K 80K 100K 120K 140K", 20),
-      MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180", 30),
-      MuxedStreamInfo(kTextTrackNum, "0K 100K 200K"));
-
-  CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K");
-  CheckExpectedBuffers(video_stream, "0K 30 60 90 120K 150 180");
-  CheckExpectedBuffers(text_stream, "0K 100K 200K");
-
-  // Remove the buffers that were added.
-  demuxer_->Remove(kSourceId, base::TimeDelta(),
-                   base::TimeDelta::FromMilliseconds(300));
-
-  // Verify that all the appended data has been removed.
-  CheckExpectedRanges("{ }");
-
-  // Append new buffers that are clearly different than the original
-  // ones and verify that only the new buffers are returned.
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum, "1K 21K 41K 61K 81K 101K 121K 141K", 20),
-      MuxedStreamInfo(kVideoTrackNum, "1K 31 61 91 121K 151 181", 30),
-      MuxedStreamInfo(kTextTrackNum, "1K 101K 201K"));
-
-  Seek(base::TimeDelta());
-  CheckExpectedBuffers(audio_stream, "1K 21K 41K 61K 81K 101K 121K 141K");
-  CheckExpectedBuffers(video_stream, "1K 31 61 91 121K 151 181");
-  CheckExpectedBuffers(text_stream, "1K 101K 201K");
-}
-
-TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-
-  // Set the duration to something small so that the append that
-  // follows updates the duration to reflect the end of the appended data.
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(1)));
-  demuxer_->SetDuration(0.001);
-
-  EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(160)));
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
-                            "0K 20K 40K 60K 80K 100K 120K 140D20K");
-
-  CheckExpectedRanges("{ [0,160) }");
-  CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K");
-
-  demuxer_->Remove(kSourceId,
-                   base::TimeDelta::FromSecondsD(demuxer_->GetDuration()),
-                   kInfiniteDuration);
-
-  Seek(base::TimeDelta());
-  CheckExpectedRanges("{ [0,160) }");
-  CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K");
-}
-
-// Verifies that a Seek() will complete without text cues for
-// the seek point and will return cues after the seek position
-// when they are eventually appended.
-TEST_F(ChunkDemuxerTest, SeekCompletesWithoutTextCues) {
-  DemuxerStream* text_stream = NULL;
-  EXPECT_CALL(host_, AddTextStream(_, _)).WillOnce(SaveArg<0>(&text_stream));
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
-
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(120);
-  bool seek_cb_was_called = false;
-  demuxer_->StartWaitingForSeek(seek_time);
-  demuxer_->Seek(seek_time,
-                 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called));
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(seek_cb_was_called);
-
-  bool text_read_done = false;
-  text_stream->Read(base::Bind(
-      &OnReadDone, base::TimeDelta::FromMilliseconds(225), &text_read_done));
-
-  // Append audio & video data so the seek completes.
-  AppendMuxedCluster(
-      MuxedStreamInfo(kAudioTrackNum,
-                      "0K 20K 40K 60K 80K 100K 120K 140K 160K 180K 200K", 20),
-      MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180 210", 30));
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(seek_cb_was_called);
-  EXPECT_FALSE(text_read_done);
-
-  // Read some audio & video buffers to further verify seek completion.
-  CheckExpectedBuffers(audio_stream, "120K 140K");
-  CheckExpectedBuffers(video_stream, "120K 150");
-
-  EXPECT_FALSE(text_read_done);
-
-  // Append text cues that start after the seek point and verify that
-  // they are returned by Read() calls.
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "220K 240K 260K 280K", 20),
-                     MuxedStreamInfo(kVideoTrackNum, "240K 270 300 330", 30),
-                     MuxedStreamInfo(kTextTrackNum, "225K 275K 325K"));
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(text_read_done);
-
-  // NOTE: we start at 275 here because the buffer at 225 was returned
-  // to the pending read initiated above.
-  CheckExpectedBuffers(text_stream, "275K 325K");
-
-  // Verify that audio & video streams continue to return expected values.
-  CheckExpectedBuffers(audio_stream, "160K 180K");
-  CheckExpectedBuffers(video_stream, "180 210");
-}
-
-TEST_F(ChunkDemuxerTest, ClusterWithUnknownSize) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(GenerateCluster(0, 0, 4, true)));
-  CheckExpectedRanges("{ [0,46) }");
-
-  // A new cluster indicates end of the previous cluster with unknown size.
-  ASSERT_TRUE(AppendCluster(GenerateCluster(46, 66, 5, true)));
-  CheckExpectedRanges("{ [0,115) }");
-}
-
-TEST_F(ChunkDemuxerTest, CuesBetweenClustersWithUnknownSize) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  // Add two clusters separated by Cues in a single Append() call.
-  std::unique_ptr<Cluster> cluster = GenerateCluster(0, 0, 4, true);
-  std::vector<uint8_t> data(cluster->data(), cluster->data() + cluster->size());
-  data.insert(data.end(), kCuesHeader, kCuesHeader + sizeof(kCuesHeader));
-  cluster = GenerateCluster(46, 66, 5, true);
-  data.insert(data.end(), cluster->data(), cluster->data() + cluster->size());
-  ASSERT_TRUE(AppendData(&*data.begin(), data.size()));
-
-  CheckExpectedRanges("{ [0,115) }");
-}
-
-TEST_F(ChunkDemuxerTest, CuesBetweenClusters) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
-  ASSERT_TRUE(AppendCluster(GenerateCluster(0, 0, 4)));
-  ASSERT_TRUE(AppendData(kCuesHeader, sizeof(kCuesHeader)));
-  ASSERT_TRUE(AppendCluster(GenerateCluster(46, 66, 5)));
-  CheckExpectedRanges("{ [0,115) }");
-}
-
-TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize);
-  demuxer_->SetMemoryLimitsForTest(DemuxerStream::VIDEO, 15 * kBlockSize);
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  const char* kAudioStreamInfo = "0K 40K 80K 120K 160K 200K 240K 280K";
-  const char* kVideoStreamInfo =
-      "0K 10 20K 30 40K 50 60K 70 80K 90 100K "
-      "110 120K 130 140K";
-  // Append 8 blocks (80 bytes) of data to audio stream and 15 blocks (150
-  // bytes) to video stream.
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, kAudioStreamInfo, 40),
-                     MuxedStreamInfo(kVideoTrackNum, kVideoStreamInfo, 10));
-  CheckExpectedBuffers(audio_stream, kAudioStreamInfo);
-  CheckExpectedBuffers(video_stream, kVideoStreamInfo);
-
-  // If we want to append 80 more blocks of muxed a+v data and the current
-  // position is 0, that will fail, because EvictCodedFrames won't remove the
-  // data after the current playback position.
-  ASSERT_FALSE(demuxer_->EvictCodedFrames(
-      kSourceId, base::TimeDelta::FromMilliseconds(0), 80));
-  // EvictCodedFrames has failed, so data should be unchanged.
-  Seek(base::TimeDelta::FromMilliseconds(0));
-  CheckExpectedBuffers(audio_stream, kAudioStreamInfo);
-  CheckExpectedBuffers(video_stream, kVideoStreamInfo);
-
-  // But if we pretend that playback position has moved to 120ms, that allows
-  // EvictCodedFrames to garbage-collect enough data to succeed.
-  ASSERT_TRUE(demuxer_->EvictCodedFrames(
-      kSourceId, base::TimeDelta::FromMilliseconds(120), 80));
-
-  Seek(base::TimeDelta::FromMilliseconds(0));
-  // Audio stream had 8 buffers, video stream had 15. We told EvictCodedFrames
-  // that the new data size is 8 blocks muxed, i.e. 80 bytes. Given the current
-  // ratio of video to the total data size (15 : (8+15) ~= 0.65) the estimated
-  // sizes of video and audio data in the new 80 byte chunk are 52 bytes for
-  // video (80*0.65 = 52) and 28 bytes for audio (80 - 52).
-  // Given these numbers MSE GC will remove just one audio block (since current
-  // audio size is 80 bytes, new data is 28 bytes, we need to remove just one 10
-  // byte block to stay under 100 bytes memory limit after append
-  // 80 - 10 + 28 = 98).
-  // For video stream 150 + 52 = 202. Video limit is 150 bytes. We need to
-  // remove at least 6 blocks to stay under limit.
-  CheckExpectedBuffers(audio_stream, "40K 80K 120K 160K 200K 240K 280K");
-  CheckExpectedBuffers(video_stream, "60K 70 80K 90 100K 110 120K 130 140K");
-}
-
-TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioOnly) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
-  EXPECT_MEDIA_LOG(SegmentMissingFrames("2"));
-  ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
-}
-
-TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_VideoOnly) {
-  ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
-  EXPECT_MEDIA_LOG(SegmentMissingFrames("1"));
-  ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
-}
-
-TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioVideo) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  EXPECT_MEDIA_LOG(SegmentMissingFrames("2"));
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 10);
-}
-
-TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_AudioVideo) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  EXPECT_MEDIA_LOG(SegmentMissingFrames("1"));
-  AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
-}
-
-TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  EXPECT_MEDIA_LOG(SegmentMissingFrames("1"));
-  EXPECT_MEDIA_LOG(SegmentMissingFrames("2"));
-  ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
-}
-
-TEST_F(ChunkDemuxerTest, RelaxedKeyframe_FirstSegmentMissingKeyframe) {
-  // Append V:[n n n][n n K]
-  // Expect V:           [K]
-  ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2);
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0 10 20");
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50K");
-  CheckExpectedRanges("{ [50,60) }");
-  CheckExpectedBuffers(video_stream, "50K");
-}
-
-TEST_F(ChunkDemuxerTest, RelaxedKeyframe_SecondSegmentMissingKeyframe) {
-  // Append V:[K n n][n n n]
-  // Expect V:[K n n][n n n]
-  ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2);
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
-  CheckExpectedRanges("{ [0,60) }");
-  CheckExpectedBuffers(video_stream, "0K 10 20 30 40 50");
-}
-
-TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_1) {
-  // Append V:[K n n]
-  // Remove    *****
-  // Append V:       [n n n][n K n]
-  // Expect:                  [K n]
-  ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3);
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
-  demuxer_->Remove(kSourceId, base::TimeDelta(),
-                   base::TimeDelta::FromMilliseconds(30));
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80");
-  CheckExpectedRanges("{ [70,90) }");
-  CheckExpectedBuffers(video_stream, "70K 80");
-}
-
-TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_2) {
-  // Append V:[K n n][n n n][n K n]
-  // Remove    *
-  // Expect:                  [K n]
-  ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3);
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80");
-  demuxer_->Remove(kSourceId, base::TimeDelta(),
-                   base::TimeDelta::FromMilliseconds(10));
-  CheckExpectedRanges("{ [70,90) }");
-  CheckExpectedBuffers(video_stream, "70K 80");
-}
-
-TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_3) {
-  // Append V:[K n n][n n n][n K n]
-  // Remove               *
-  // Expect:  [K n n..n n]    [K n]
-  ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3);
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
-  AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80");
-  demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(50),
-                   base::TimeDelta::FromMilliseconds(60));
-  CheckExpectedRanges("{ [0,50) [70,90) }");
-  CheckExpectedBuffers(video_stream, "0K 10 20 30 40");
-  Seek(base::TimeDelta::FromMilliseconds(70));
-  CheckExpectedBuffers(video_stream, "70K 80");
-}
-
-TEST_F(ChunkDemuxerTest,
-       RelaxedKeyframe_RemoveInterruptsMuxedCodedFrameGroup_1) {
-  // Append muxed:
-  //        A:[K K K]
-  //        V:[K n n]
-  // Remove    *****
-  // Append muxed:
-  //        A:       [K K K][K K K]
-  //        V:       [n n n][n K n]
-  // Expect:
-  //        A:       [K K K][K K K]
-  //        V                 [K n]
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 10K 20D10K"),
-                     MuxedStreamInfo(kVideoTrackNum, "0K 10 20", 10));
-  demuxer_->Remove(kSourceId, base::TimeDelta(),
-                   base::TimeDelta::FromMilliseconds(30));
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "30K 40K 50D10K"),
-                     MuxedStreamInfo(kVideoTrackNum, "30 40 50", 10));
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "60K 70K 80D10K"),
-                     MuxedStreamInfo(kVideoTrackNum, "60 70K 80", 10));
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [70,90) }");
-  CheckExpectedRanges("{ [70,90) }");
-  CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K");
-  CheckExpectedBuffers(video_stream, "70K 80");
-}
-
-TEST_F(ChunkDemuxerTest,
-       RelaxedKeyframe_RemoveInterruptsMuxedCodedFrameGroup_2) {
-  // Append muxed:
-  //        A:[K K K]
-  //        V:(Nothing, simulating jagged cluster start or a long previous
-  //          video frame)
-  // Remove    *****
-  // Append muxed:
-  //        A:       [K K K][K K K]
-  //        V:       [n n n][n K n]
-  // Expect:
-  //        A:       [K K K][K K K]
-  //        V [................K n] (As would occur if there really were a
-  //        jagged cluster start and not badly muxed clusters as used to
-  //        simulate a jagged start in this test.)
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  EXPECT_MEDIA_LOG(SegmentMissingFrames("1"));
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 10K 20D10K"),
-                     MuxedStreamInfo(kVideoTrackNum, ""));
-  demuxer_->Remove(kSourceId, base::TimeDelta(),
-                   base::TimeDelta::FromMilliseconds(30));
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "30K 40K 50D10K"),
-                     MuxedStreamInfo(kVideoTrackNum, "30 40 50", 10));
-  AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "60K 70K 80D10K"),
-                     MuxedStreamInfo(kVideoTrackNum, "60 70K 80", 10));
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,90) }");
-  CheckExpectedRanges("{ [30,90) }");
-  CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K");
-  CheckExpectedBuffers(video_stream, "70K 80");
-}
-
-TEST_F(ChunkDemuxerTest,
-       RelaxedKeyframe_RemoveInterruptsMuxedCodedFrameGroup_3) {
-  // Append muxed:
-  //        A:[K K K
-  //        V:(Nothing yet. This is a jagged start, not simulated.)
-  // Remove    *****
-  // Append muxed:
-  //        A:       K K K K K K]
-  //        V:       n n n n K n]
-  // Expect:
-  //        A:      [K K K K K K]
-  //        V [..............K n]
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-
-  std::vector<MuxedStreamInfo> msi(2);
-  msi[0] =
-      MuxedStreamInfo(kAudioTrackNum, "0K 10K 20K 30K 40K 50K 60K 70K 80D10K");
-  msi[1] = MuxedStreamInfo(kVideoTrackNum, "31 41 51 61 71K 81", 10);
-  std::unique_ptr<Cluster> cluster = GenerateMuxedCluster(msi);
-
-  // Append the first part of the cluster, up to the beginning of the first
-  // video simpleblock. The result should be just 4 audio blocks and no video
-  // blocks are appended. Since the stream parser does not yet have a duration
-  // for the 4th audio block in this partial cluster append, it is not yet
-  // emitted from the parser, and only the first 3 audio blocks are expected to
-  // be buffered by and available from the demuxer.
-  ASSERT_EQ(kVideoTrackNum, 1);
-  int video_start = 0;
-  bool found = false;
-  while (video_start < cluster->size() - 10) {
-    if (cluster->data()[video_start] == 0xA3 &&
-        cluster->data()[video_start + 9] == 0x81) {
-      found = true;
-      break;
-    }
-    video_start++;
-  }
-
-  ASSERT_TRUE(found);
-  ASSERT_GT(video_start, 0);
-  ASSERT_LT(video_start, cluster->size() - 3);
-
-  ASSERT_TRUE(AppendData(kSourceId, cluster->data(), video_start));
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,30) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ }");
-
-  demuxer_->Remove(kSourceId, base::TimeDelta(),
-                   base::TimeDelta::FromMilliseconds(30));
-
-  // Append the remainder of the cluster
-  ASSERT_TRUE(AppendData(kSourceId, cluster->data() + video_start,
-                         cluster->size() - video_start));
-
-  CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }");
-  CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,91) }");
-  CheckExpectedRanges("{ [30,90) }");
-  CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K");
-  CheckExpectedBuffers(video_stream, "71K 81");
-}
-
-void OnStreamStatusChanged(base::WaitableEvent* event, DemuxerStream* stream,
-                           bool enabled, base::TimeDelta) {
-  EXPECT_EQ(enabled, stream->enabled());
-  event->Signal();
-}
-
-void CheckStreamStatusNotifications(DemuxerStream* stream) {
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  ASSERT_TRUE(stream->enabled());
-  stream->SetStreamStatusChangeCB(base::Bind(&OnStreamStatusChanged,
-                                             base::Unretained(&event),
-                                             base::Unretained(stream)));
-
-  stream->set_enabled(false, base::TimeDelta());
-  base::RunLoop().RunUntilIdle();
-  ASSERT_TRUE(event.IsSignaled());
-
-  event.Reset();
-  stream->set_enabled(true, base::TimeDelta());
-  base::RunLoop().RunUntilIdle();
-  ASSERT_TRUE(event.IsSignaled());
-}
-
-TEST_F(ChunkDemuxerTest, StreamStatusNotifications) {
-  ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-  DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
-  EXPECT_NE(NULL, audio_stream);
-  CheckStreamStatusNotifications(audio_stream);
-  DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
-  EXPECT_NE(NULL, video_stream);
-  CheckStreamStatusNotifications(video_stream);
-}
-
-TEST_F(ChunkDemuxerTest, MultipleIds) {
-  CreateNewDemuxer();
-  EXPECT_CALL(*this, DemuxerOpened());
-  EXPECT_CALL(host_, SetDuration(_)).Times(2);
-  demuxer_->Initialize(&host_, CreateInitDoneCB(kNoTimestamp, PIPELINE_OK),
-                       true);
-
-  const char* kId1 = "id1";
-  const char* kId2 = "id2";
-  EXPECT_EQ(AddId(kId1, "video/webm", "opus,vp9"), ChunkDemuxer::kOk);
-  EXPECT_EQ(AddId(kId2, "video/webm", "opus,vp9"), ChunkDemuxer::kOk);
-  scoped_refptr<DecoderBuffer> data1 = ReadTestDataFile("green-a300hz.webm");
-  scoped_refptr<DecoderBuffer> data2 = ReadTestDataFile("red-a500hz.webm");
-
-  EXPECT_MEDIA_LOG(FoundStream("audio")).Times(2);
-  EXPECT_MEDIA_LOG(FoundStream("video")).Times(2);
-  EXPECT_MEDIA_LOG(CodecName("audio", "opus")).Times(2);
-  EXPECT_MEDIA_LOG(CodecName("video", "vp9")).Times(2);
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_)).Times(2);
-  EXPECT_MEDIA_LOG(SegmentMissingFrames("1")).Times(1);
-
-  EXPECT_TRUE(AppendData(kId1, data1->data(), data1->data_size()));
-  EXPECT_TRUE(AppendData(kId2, data2->data(), data2->data_size()));
-  CheckExpectedRanges(kId1, "{ [0,12007) }");
-  CheckExpectedRanges(kId2, "{ [0,10007) }");
-}
-
-TEST_F(ChunkDemuxerTest, CompleteInitAfterIdRemoved) {
-  CreateNewDemuxer();
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(&host_,
-                       CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
-
-  // Add two ids, then remove one of the ids and verify that adding init segment
-  // only for the remaining id still triggers the InitDoneCB.
-  const char* kId1 = "id1";
-  const char* kId2 = "id2";
-  EXPECT_EQ(AddId(kId1, "video/webm", "vp8"), ChunkDemuxer::kOk);
-  EXPECT_EQ(AddId(kId2, "video/webm", "vp9"), ChunkDemuxer::kOk);
-  demuxer_->RemoveId(kId2);
-
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
-
-  ASSERT_TRUE(AppendInitSegmentWithSourceId(kId1, HAS_VIDEO));
-  AppendSingleStreamCluster(kId1, kVideoTrackNum, "0K 30 60 90");
-}
-
-TEST_F(ChunkDemuxerTest, RemovingIdMustRemoveStreams) {
-  CreateNewDemuxer();
-  EXPECT_CALL(*this, DemuxerOpened());
-  demuxer_->Initialize(&host_,
-                       CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
-
-  const char* kId1 = "id1";
-  EXPECT_EQ(AddId(kId1, "video/webm", "vorbis,vp8"), ChunkDemuxer::kOk);
-
-  EXPECT_CALL(*this, InitSegmentReceivedMock(_));
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
-  EXPECT_MEDIA_LOG(FoundStream("audio"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "vorbis"));
-
-  // Append init segment to ensure demuxer streams get created.
-  ASSERT_TRUE(AppendInitSegmentWithSourceId(kId1, HAS_AUDIO | HAS_VIDEO));
-  EXPECT_NE(NULL, demuxer_->GetStream(DemuxerStream::AUDIO));
-  EXPECT_NE(NULL, demuxer_->GetStream(DemuxerStream::VIDEO));
-
-  // Removing the id should remove also the DemuxerStreams.
-  demuxer_->RemoveId(kId1);
-  EXPECT_EQ(NULL, demuxer_->GetStream(DemuxerStream::AUDIO));
-  EXPECT_EQ(NULL, demuxer_->GetStream(DemuxerStream::VIDEO));
-}
-
-// TODO(servolk): Add a unit test with multiple audio/video tracks using the
-// same codec type in a single SourceBufferState, when WebM parser supports
-// multiple tracks. crbug.com/646900
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/frame_processor.cc b/cobalt/media/filters/frame_processor.cc
deleted file mode 100644
index c515490..0000000
--- a/cobalt/media/filters/frame_processor.cc
+++ /dev/null
@@ -1,753 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/frame_processor.h"
-
-#include <algorithm>
-#include <cstdlib>
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-const int kMaxDroppedPrerollWarnings = 10;
-const int kMaxDtsBeyondPtsWarnings = 10;
-
-// Helper class to capture per-track details needed by a frame processor. Some
-// of this information may be duplicated in the short-term in the associated
-// ChunkDemuxerStream and SourceBufferStream for a track.
-// This parallels the MSE spec each of a SourceBuffer's Track Buffers at
-// http://www.w3.org/TR/media-source/#track-buffers.
-class MseTrackBuffer : public base::RefCountedThreadSafe<MseTrackBuffer> {
- public:
-  explicit MseTrackBuffer(ChunkDemuxerStream* stream);
-  ~MseTrackBuffer();
-
-  // Get/set |last_decode_timestamp_|.
-  DecodeTimestamp last_decode_timestamp() const {
-    return last_decode_timestamp_;
-  }
-  void set_last_decode_timestamp(DecodeTimestamp timestamp) {
-    last_decode_timestamp_ = timestamp;
-  }
-
-  // Get/set |last_frame_duration_|.
-  base::TimeDelta last_frame_duration() const { return last_frame_duration_; }
-  void set_last_frame_duration(base::TimeDelta duration) {
-    last_frame_duration_ = duration;
-  }
-
-  // Gets |highest_presentation_timestamp_|.
-  base::TimeDelta highest_presentation_timestamp() const {
-    return highest_presentation_timestamp_;
-  }
-
-  // Get/set |needs_random_access_point_|.
-  bool needs_random_access_point() const { return needs_random_access_point_; }
-  void set_needs_random_access_point(bool needs_random_access_point) {
-    needs_random_access_point_ = needs_random_access_point;
-  }
-
-  // Gets a pointer to this track's ChunkDemuxerStream.
-  ChunkDemuxerStream* stream() const { return stream_; }
-
-  // Unsets |last_decode_timestamp_|, unsets |last_frame_duration_|,
-  // unsets |highest_presentation_timestamp_|, and sets
-  // |needs_random_access_point_| to true.
-  void Reset();
-
-  // If |highest_presentation_timestamp_| is unset or |timestamp| is greater
-  // than |highest_presentation_timestamp_|, sets
-  // |highest_presentation_timestamp_| to |timestamp|. Note that bidirectional
-  // prediction between coded frames can cause |timestamp| to not be
-  // monotonically increasing even though the decode timestamps are
-  // monotonically increasing.
-  void SetHighestPresentationTimestampIfIncreased(base::TimeDelta timestamp);
-
-  // Adds |frame| to the end of |processed_frames_|.
-  void EnqueueProcessedFrame(const scoped_refptr<StreamParserBuffer>& frame);
-
-  // Appends |processed_frames_|, if not empty, to |stream_| and clears
-  // |processed_frames_|. Returns false if append failed, true otherwise.
-  // |processed_frames_| is cleared in both cases.
-  bool FlushProcessedFrames();
-
- private:
-  // The decode timestamp of the last coded frame appended in the current coded
-  // frame group. Initially kNoTimestamp, meaning "unset".
-  DecodeTimestamp last_decode_timestamp_;
-
-  // The coded frame duration of the last coded frame appended in the current
-  // coded frame group. Initially kNoTimestamp, meaning "unset".
-  base::TimeDelta last_frame_duration_;
-
-  // The highest presentation timestamp encountered in a coded frame appended
-  // in the current coded frame group. Initially kNoTimestamp, meaning
-  // "unset".
-  base::TimeDelta highest_presentation_timestamp_;
-
-  // Keeps track of whether the track buffer is waiting for a random access
-  // point coded frame. Initially set to true to indicate that a random access
-  // point coded frame is needed before anything can be added to the track
-  // buffer.
-  bool needs_random_access_point_;
-
-  // Pointer to the stream associated with this track. The stream is not owned
-  // by |this|.
-  ChunkDemuxerStream* const stream_;
-
-  // Queue of processed frames that have not yet been appended to |stream_|.
-  // EnqueueProcessedFrame() adds to this queue, and FlushProcessedFrames()
-  // clears it.
-  StreamParser::BufferQueue processed_frames_;
-
-  DISALLOW_COPY_AND_ASSIGN(MseTrackBuffer);
-};
-
-MseTrackBuffer::MseTrackBuffer(ChunkDemuxerStream* stream)
-    : last_decode_timestamp_(kNoDecodeTimestamp()),
-      last_frame_duration_(kNoTimestamp),
-      highest_presentation_timestamp_(kNoTimestamp),
-      needs_random_access_point_(true),
-      stream_(stream) {
-  DCHECK(stream_);
-}
-
-MseTrackBuffer::~MseTrackBuffer() { DVLOG(2) << __func__ << "()"; }
-
-void MseTrackBuffer::Reset() {
-  DVLOG(2) << __func__ << "()";
-
-  last_decode_timestamp_ = kNoDecodeTimestamp();
-  last_frame_duration_ = kNoTimestamp;
-  highest_presentation_timestamp_ = kNoTimestamp;
-  needs_random_access_point_ = true;
-}
-
-void MseTrackBuffer::SetHighestPresentationTimestampIfIncreased(
-    base::TimeDelta timestamp) {
-  if (highest_presentation_timestamp_ == kNoTimestamp ||
-      timestamp > highest_presentation_timestamp_) {
-    highest_presentation_timestamp_ = timestamp;
-  }
-}
-
-void MseTrackBuffer::EnqueueProcessedFrame(
-    const scoped_refptr<StreamParserBuffer>& frame) {
-  processed_frames_.push_back(frame);
-}
-
-bool MseTrackBuffer::FlushProcessedFrames() {
-  if (processed_frames_.empty()) return true;
-
-  bool result = stream_->Append(processed_frames_);
-  processed_frames_.clear();
-
-  DVLOG_IF(3, !result) << __func__
-                       << "(): Failure appending processed frames to stream";
-
-  return result;
-}
-
-FrameProcessor::FrameProcessor(const UpdateDurationCB& update_duration_cb,
-                               const scoped_refptr<MediaLog>& media_log)
-    : sequence_mode_(false),
-      coded_frame_group_last_dts_(kNoDecodeTimestamp()),
-      group_start_timestamp_(kNoTimestamp),
-      update_duration_cb_(update_duration_cb),
-      media_log_(media_log),
-      num_dropped_preroll_warnings_(0),
-      num_dts_beyond_pts_warnings_(0) {
-  DVLOG(2) << __func__ << "()";
-  DCHECK(!update_duration_cb.is_null());
-}
-
-FrameProcessor::~FrameProcessor() { DVLOG(2) << __func__ << "()"; }
-
-void FrameProcessor::SetSequenceMode(bool sequence_mode) {
-  DVLOG(2) << __func__ << "(" << sequence_mode << ")";
-  // Per June 9, 2016 MSE spec editor's draft:
-  // https://rawgit.com/w3c/media-source/d8f901f22/
-  //     index.html#widl-SourceBuffer-mode
-  // Step 7: If the new mode equals "sequence", then set the group start
-  // timestamp to the group end timestamp.
-  if (sequence_mode) {
-    DCHECK(kNoTimestamp != group_end_timestamp_);
-    group_start_timestamp_ = group_end_timestamp_;
-  } else if (sequence_mode_) {
-    // We're switching from 'sequence' to 'segments' mode. Be safe and signal a
-    // new coded frame group on the next frame emitted.
-    coded_frame_group_last_dts_ = kNoDecodeTimestamp();
-  }
-
-  // Step 8: Update the attribute to new mode.
-  sequence_mode_ = sequence_mode;
-}
-
-bool FrameProcessor::ProcessFrames(
-    const StreamParser::BufferQueueMap& buffer_queue_map,
-    base::TimeDelta append_window_start, base::TimeDelta append_window_end,
-    base::TimeDelta* timestamp_offset) {
-  StreamParser::BufferQueue frames;
-  if (!MergeBufferQueues(buffer_queue_map, &frames)) {
-    MEDIA_LOG(ERROR, media_log_) << "Parsed buffers not in DTS sequence";
-    return false;
-  }
-
-  DCHECK(!frames.empty());
-
-  // Implements the coded frame processing algorithm's outer loop for step 1.
-  // Note that ProcessFrame() implements an inner loop for a single frame that
-  // handles "jump to the Loop Top step to restart processing of the current
-  // coded frame" per June 9, 2016 MSE spec editor's draft:
-  // https://rawgit.com/w3c/media-source/d8f901f22/
-  //     index.html#sourcebuffer-coded-frame-processing
-  // 1. For each coded frame in the media segment run the following steps:
-  for (StreamParser::BufferQueue::const_iterator frames_itr = frames.begin();
-       frames_itr != frames.end(); ++frames_itr) {
-    if (!ProcessFrame(*frames_itr, append_window_start, append_window_end,
-                      timestamp_offset)) {
-      FlushProcessedFrames();
-      return false;
-    }
-  }
-
-  if (!FlushProcessedFrames()) return false;
-
-  // 2. - 4. Are handled by the WebMediaPlayer / Pipeline / Media Element.
-
-  // 5. If the media segment contains data beyond the current duration, then run
-  //    the duration change algorithm with new duration set to the maximum of
-  //    the current duration and the group end timestamp.
-  update_duration_cb_.Run(group_end_timestamp_);
-
-  return true;
-}
-
-void FrameProcessor::SetGroupStartTimestampIfInSequenceMode(
-    base::TimeDelta timestamp_offset) {
-  DVLOG(2) << __func__ << "(" << timestamp_offset.InSecondsF() << ")";
-  DCHECK(kNoTimestamp != timestamp_offset);
-  if (sequence_mode_) group_start_timestamp_ = timestamp_offset;
-
-  // Changes to timestampOffset should invalidate the preroll buffer.
-  audio_preroll_buffer_ = NULL;
-}
-
-bool FrameProcessor::AddTrack(StreamParser::TrackId id,
-                              ChunkDemuxerStream* stream) {
-  DVLOG(2) << __func__ << "(): id=" << id;
-
-  MseTrackBuffer* existing_track = FindTrack(id);
-  DCHECK(!existing_track);
-  if (existing_track) {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Failure adding track with duplicate ID " << id;
-    return false;
-  }
-
-  track_buffers_[id] = new MseTrackBuffer(stream);
-  return true;
-}
-
-bool FrameProcessor::UpdateTrackIds(const TrackIdChanges& track_id_changes) {
-  TrackBuffersMap& old_track_buffers = track_buffers_;
-  TrackBuffersMap new_track_buffers;
-
-  for (TrackIdChanges::const_iterator iter = track_id_changes.begin();
-       iter != track_id_changes.end(); ++iter) {
-    if (old_track_buffers.find(iter->first) == old_track_buffers.end() ||
-        new_track_buffers.find(iter->second) != new_track_buffers.end()) {
-      MEDIA_LOG(ERROR, media_log_) << "Failure updating track id from "
-                                   << iter->first << " to " << iter->second;
-      return false;
-    }
-    new_track_buffers[iter->second] = old_track_buffers[iter->first];
-    CHECK_EQ(1u, old_track_buffers.erase(iter->first));
-  }
-
-  // Process remaining track buffers with unchanged ids.
-  for (TrackBuffersMap::iterator iter = old_track_buffers.begin();
-       iter != old_track_buffers.end(); ++iter) {
-    if (new_track_buffers.find(iter->first) != new_track_buffers.end()) {
-      MEDIA_LOG(ERROR, media_log_) << "Track id " << iter->first << " conflict";
-      return false;
-    }
-    new_track_buffers[iter->first] = old_track_buffers[iter->first];
-  }
-
-  std::swap(track_buffers_, new_track_buffers);
-  return true;
-}
-
-void FrameProcessor::SetAllTrackBuffersNeedRandomAccessPoint() {
-  for (TrackBuffersMap::iterator itr = track_buffers_.begin();
-       itr != track_buffers_.end(); ++itr) {
-    itr->second->set_needs_random_access_point(true);
-  }
-}
-
-void FrameProcessor::Reset() {
-  DVLOG(2) << __func__ << "()";
-  for (TrackBuffersMap::iterator itr = track_buffers_.begin();
-       itr != track_buffers_.end(); ++itr) {
-    itr->second->Reset();
-  }
-
-  // Maintain current |coded_frame_group_last_dts_| state for Reset() during
-  // sequence mode. Reset it here only if in segments mode. In sequence mode,
-  // the current coded frame group may be continued across Reset() operations to
-  // allow the stream to coalesce what might otherwise be gaps in the buffered
-  // ranges. See also the declaration for |coded_frame_group_last_dts_|.
-  if (!sequence_mode_) {
-    coded_frame_group_last_dts_ = kNoDecodeTimestamp();
-    return;
-  }
-
-  // Sequence mode
-  DCHECK(kNoTimestamp != group_end_timestamp_);
-  group_start_timestamp_ = group_end_timestamp_;
-}
-
-void FrameProcessor::OnPossibleAudioConfigUpdate(
-    const AudioDecoderConfig& config) {
-  DCHECK(config.IsValidConfig());
-
-  // Always clear the preroll buffer when a config update is received.
-  audio_preroll_buffer_ = NULL;
-
-  if (config.Matches(current_audio_config_)) return;
-
-  current_audio_config_ = config;
-  sample_duration_ = base::TimeDelta::FromSecondsD(
-      1.0 / current_audio_config_.samples_per_second());
-}
-
-MseTrackBuffer* FrameProcessor::FindTrack(StreamParser::TrackId id) {
-  TrackBuffersMap::iterator itr = track_buffers_.find(id);
-  if (itr == track_buffers_.end()) return NULL;
-
-  return itr->second.get();
-}
-
-void FrameProcessor::NotifyStartOfCodedFrameGroup(
-    DecodeTimestamp start_timestamp) {
-  DVLOG(2) << __func__ << "(" << start_timestamp.InSecondsF() << ")";
-
-  for (TrackBuffersMap::iterator itr = track_buffers_.begin();
-       itr != track_buffers_.end(); ++itr) {
-    itr->second->stream()->OnStartOfCodedFrameGroup(start_timestamp);
-  }
-}
-
-bool FrameProcessor::FlushProcessedFrames() {
-  DVLOG(2) << __func__ << "()";
-
-  bool result = true;
-  for (TrackBuffersMap::iterator itr = track_buffers_.begin();
-       itr != track_buffers_.end(); ++itr) {
-    if (!itr->second->FlushProcessedFrames()) result = false;
-  }
-
-  return result;
-}
-
-bool FrameProcessor::HandlePartialAppendWindowTrimming(
-    base::TimeDelta append_window_start, base::TimeDelta append_window_end,
-    const scoped_refptr<StreamParserBuffer>& buffer) {
-  DCHECK(buffer->duration() >= base::TimeDelta());
-  DCHECK_EQ(DemuxerStream::AUDIO, buffer->type());
-  DCHECK(buffer->is_key_frame());
-
-  const base::TimeDelta frame_end_timestamp =
-      buffer->timestamp() + buffer->duration();
-
-  // If the buffer is entirely before |append_window_start|, save it as preroll
-  // for the first buffer which overlaps |append_window_start|.
-  if (buffer->timestamp() < append_window_start &&
-      frame_end_timestamp <= append_window_start) {
-    audio_preroll_buffer_ = buffer;
-    return false;
-  }
-
-  // If the buffer is entirely after |append_window_end| there's nothing to do.
-  if (buffer->timestamp() >= append_window_end) return false;
-
-  DCHECK(buffer->timestamp() >= append_window_start ||
-         frame_end_timestamp > append_window_start);
-
-  bool processed_buffer = false;
-
-  // If we have a preroll buffer see if we can attach it to the first buffer
-  // overlapping or after |append_window_start|.
-  if (audio_preroll_buffer_.get()) {
-    // We only want to use the preroll buffer if it directly precedes (less
-    // than one sample apart) the current buffer.
-    const int64_t delta =
-        (audio_preroll_buffer_->timestamp() +
-         audio_preroll_buffer_->duration() - buffer->timestamp())
-            .InMicroseconds();
-    if (std::abs(delta) < sample_duration_.InMicroseconds()) {
-      DVLOG(1) << "Attaching audio preroll buffer ["
-               << audio_preroll_buffer_->timestamp().InSecondsF() << ", "
-               << (audio_preroll_buffer_->timestamp() +
-                   audio_preroll_buffer_->duration())
-                      .InSecondsF()
-               << ") to " << buffer->timestamp().InSecondsF();
-      buffer->SetPrerollBuffer(audio_preroll_buffer_);
-      processed_buffer = true;
-    } else {
-      LIMITED_MEDIA_LOG(DEBUG, media_log_, num_dropped_preroll_warnings_,
-                        kMaxDroppedPrerollWarnings)
-          << "Partial append window trimming dropping unused audio preroll "
-             "buffer with PTS "
-          << audio_preroll_buffer_->timestamp().InMicroseconds()
-          << "us that ends too far (" << delta
-          << "us) from next buffer with PTS "
-          << buffer->timestamp().InMicroseconds() << "us";
-    }
-    audio_preroll_buffer_ = NULL;
-  }
-
-  // See if a partial discard can be done around |append_window_start|.
-  if (buffer->timestamp() < append_window_start) {
-    DVLOG(1) << "Truncating buffer which overlaps append window start."
-             << " presentation_timestamp " << buffer->timestamp().InSecondsF()
-             << " frame_end_timestamp " << frame_end_timestamp.InSecondsF()
-             << " append_window_start " << append_window_start.InSecondsF();
-
-    // Mark the overlapping portion of the buffer for discard.
-    buffer->set_discard_padding(std::make_pair(
-        append_window_start - buffer->timestamp(), base::TimeDelta()));
-
-    // Adjust the timestamp of this buffer forward to |append_window_start| and
-    // decrease the duration to compensate. Adjust DTS by the same delta as PTS
-    // to help prevent spurious discontinuities when DTS > PTS.
-    base::TimeDelta pts_delta = append_window_start - buffer->timestamp();
-    buffer->set_timestamp(append_window_start);
-    buffer->SetDecodeTimestamp(buffer->GetDecodeTimestamp() + pts_delta);
-    buffer->set_duration(frame_end_timestamp - append_window_start);
-    processed_buffer = true;
-  }
-
-  // See if a partial discard can be done around |append_window_end|.
-  if (frame_end_timestamp > append_window_end) {
-    DVLOG(1) << "Truncating buffer which overlaps append window end."
-             << " presentation_timestamp " << buffer->timestamp().InSecondsF()
-             << " frame_end_timestamp " << frame_end_timestamp.InSecondsF()
-             << " append_window_end " << append_window_end.InSecondsF();
-
-    // Mark the overlapping portion of the buffer for discard.
-    buffer->set_discard_padding(
-        std::make_pair(buffer->discard_padding().first,
-                       frame_end_timestamp - append_window_end));
-
-    // Decrease the duration of the buffer to remove the discarded portion.
-    buffer->set_duration(append_window_end - buffer->timestamp());
-    processed_buffer = true;
-  }
-
-  return processed_buffer;
-}
-
-bool FrameProcessor::ProcessFrame(
-    const scoped_refptr<StreamParserBuffer>& frame,
-    base::TimeDelta append_window_start, base::TimeDelta append_window_end,
-    base::TimeDelta* timestamp_offset) {
-  // Implements the loop within step 1 of the coded frame processing algorithm
-  // for a single input frame per June 9, 2016 MSE spec editor's draft:
-  // https://rawgit.com/w3c/media-source/d8f901f22/
-  //     index.html#sourcebuffer-coded-frame-processing
-  while (true) {
-    // 1. Loop Top:
-    // Otherwise case: (See SourceBufferState's |auto_update_timestamp_offset_|,
-    // too).
-    // 1.1. Let presentation timestamp be a double precision floating point
-    //      representation of the coded frame's presentation timestamp in
-    //      seconds.
-    // 1.2. Let decode timestamp be a double precision floating point
-    //      representation of the coded frame's decode timestamp in seconds.
-    // 2. Let frame duration be a double precision floating point representation
-    //    of the coded frame's duration in seconds.
-    // We use base::TimeDelta and DecodeTimestamp instead of double.
-    base::TimeDelta presentation_timestamp = frame->timestamp();
-    DecodeTimestamp decode_timestamp = frame->GetDecodeTimestamp();
-    base::TimeDelta frame_duration = frame->duration();
-
-    DVLOG(3) << __func__ << ": Processing frame Type=" << frame->type()
-             << ", TrackID=" << frame->track_id()
-             << ", PTS=" << presentation_timestamp.InSecondsF()
-             << ", DTS=" << decode_timestamp.InSecondsF()
-             << ", DUR=" << frame_duration.InSecondsF()
-             << ", RAP=" << frame->is_key_frame();
-
-    // Sanity check the timestamps.
-    if (presentation_timestamp == kNoTimestamp) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unknown PTS for " << frame->GetTypeName() << " frame";
-      return false;
-    }
-    if (decode_timestamp == kNoDecodeTimestamp()) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unknown DTS for " << frame->GetTypeName() << " frame";
-      return false;
-    }
-    if (decode_timestamp.ToPresentationTime() > presentation_timestamp) {
-      // TODO(wolenetz): Determine whether DTS>PTS should really be allowed. See
-      // http://crbug.com/354518.
-      LIMITED_MEDIA_LOG(DEBUG, media_log_, num_dts_beyond_pts_warnings_,
-                        kMaxDtsBeyondPtsWarnings)
-          << "Parsed " << frame->GetTypeName() << " frame has DTS "
-          << decode_timestamp.InMicroseconds()
-          << "us, which is after the frame's PTS "
-          << presentation_timestamp.InMicroseconds() << "us";
-      DVLOG(2) << __func__ << ": WARNING: Frame DTS("
-               << decode_timestamp.InSecondsF() << ") > PTS("
-               << presentation_timestamp.InSecondsF()
-               << "), frame type=" << frame->GetTypeName();
-    }
-
-    // All stream parsers must emit valid (non-negative) frame durations.
-    // Note that duration of 0 can occur for at least WebM alt-ref frames.
-    if (frame_duration == kNoTimestamp) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unknown duration for " << frame->GetTypeName() << " frame at PTS "
-          << presentation_timestamp.InMicroseconds() << "us";
-      return false;
-    }
-    if (frame_duration < base::TimeDelta()) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Negative duration " << frame_duration.InMicroseconds()
-          << "us for " << frame->GetTypeName() << " frame at PTS "
-          << presentation_timestamp.InMicroseconds() << "us";
-      return false;
-    }
-
-    // 3. If mode equals "sequence" and group start timestamp is set, then run
-    //    the following steps:
-    if (sequence_mode_ && group_start_timestamp_ != kNoTimestamp) {
-      // 3.1. Set timestampOffset equal to group start timestamp -
-      //      presentation timestamp.
-      *timestamp_offset = group_start_timestamp_ - presentation_timestamp;
-
-      DVLOG(3) << __func__ << ": updated timestampOffset is now "
-               << timestamp_offset->InSecondsF();
-
-      // 3.2. Set group end timestamp equal to group start timestamp.
-      group_end_timestamp_ = group_start_timestamp_;
-
-      // 3.3. Set the need random access point flag on all track buffers to
-      //      true.
-      SetAllTrackBuffersNeedRandomAccessPoint();
-
-      // 3.4. Unset group start timestamp.
-      group_start_timestamp_ = kNoTimestamp;
-    }
-
-    // 4. If timestampOffset is not 0, then run the following steps:
-    if (!timestamp_offset->is_zero()) {
-      // 4.1. Add timestampOffset to the presentation timestamp.
-      // Note: |frame| PTS is only updated if it survives discontinuity
-      // processing.
-      presentation_timestamp += *timestamp_offset;
-
-      // 4.2. Add timestampOffset to the decode timestamp.
-      // Frame DTS is only updated if it survives discontinuity processing.
-      decode_timestamp += *timestamp_offset;
-    }
-
-    // 5. Let track buffer equal the track buffer that the coded frame will be
-    //    added to.
-    StreamParser::TrackId track_id = frame->track_id();
-    MseTrackBuffer* track_buffer = FindTrack(track_id);
-    if (!track_buffer) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unknown track with type " << frame->GetTypeName()
-          << ", frame processor track id " << track_id
-          << ", and parser track id " << frame->track_id();
-      return false;
-    }
-    if (frame->type() != track_buffer->stream()->type()) {
-      MEDIA_LOG(ERROR, media_log_) << "Frame type " << frame->GetTypeName()
-                                   << " doesn't match track buffer type "
-                                   << track_buffer->stream()->type();
-      return false;
-    }
-
-    // 6. If last decode timestamp for track buffer is set and decode timestamp
-    //    is less than last decode timestamp
-    //    OR
-    //    If last decode timestamp for track buffer is set and the difference
-    //    between decode timestamp and last decode timestamp is greater than 2
-    //    times last frame duration:
-    DecodeTimestamp track_last_decode_timestamp =
-        track_buffer->last_decode_timestamp();
-    if (track_last_decode_timestamp != kNoDecodeTimestamp()) {
-      base::TimeDelta track_dts_delta =
-          decode_timestamp - track_last_decode_timestamp;
-      if (track_dts_delta < base::TimeDelta() ||
-          track_dts_delta > 2 * track_buffer->last_frame_duration()) {
-        DCHECK(coded_frame_group_last_dts_ != kNoDecodeTimestamp());
-        // 6.1. If mode equals "segments": Set group end timestamp to
-        //      presentation timestamp.
-        //      If mode equals "sequence": Set group start timestamp equal to
-        //      the group end timestamp.
-        if (!sequence_mode_) {
-          group_end_timestamp_ = presentation_timestamp;
-          // This triggers a discontinuity so we need to treat the next frames
-          // appended within the append window as if they were the beginning of
-          // a new coded frame group. |coded_frame_group_last_dts_| is reset in
-          // Reset(), below, for "segments" mode.
-        } else {
-          DVLOG(3) << __func__ << " : Sequence mode discontinuity, GETS: "
-                   << group_end_timestamp_.InSecondsF();
-          // Reset(), below, performs the "Set group start timestamp equal to
-          // the group end timestamp" operation for "sequence" mode.
-        }
-
-        // 6.2. - 6.5.:
-        Reset();
-
-        // 6.6. Jump to the Loop Top step above to restart processing of the
-        //      current coded frame.
-        DVLOG(3) << __func__ << ": Discontinuity: reprocessing frame";
-        continue;
-      }
-    }
-
-    // 7. Let frame end timestamp equal the sum of presentation timestamp and
-    //    frame duration.
-    base::TimeDelta frame_end_timestamp =
-        presentation_timestamp + frame_duration;
-
-    // 8.  If presentation timestamp is less than appendWindowStart, then set
-    //     the need random access point flag to true, drop the coded frame, and
-    //     jump to the top of the loop to start processing the next coded
-    //     frame.
-    // Note: We keep the result of partial discard of a buffer that overlaps
-    //       |append_window_start| and does not end after |append_window_end|,
-    //       for streams which support partial trimming.
-    // 9. If frame end timestamp is greater than appendWindowEnd, then set the
-    //    need random access point flag to true, drop the coded frame, and jump
-    //    to the top of the loop to start processing the next coded frame.
-    // Note: We keep the result of partial discard of a buffer that overlaps
-    //       |append_window_end|, for streams which support partial trimming.
-    frame->set_timestamp(presentation_timestamp);
-    frame->SetDecodeTimestamp(decode_timestamp);
-    if (track_buffer->stream()->supports_partial_append_window_trimming() &&
-        HandlePartialAppendWindowTrimming(append_window_start,
-                                          append_window_end, frame)) {
-      // |frame| has been partially trimmed or had preroll added.  Though
-      // |frame|'s duration may have changed, do not update |frame_duration|
-      // here, so |track_buffer|'s last frame duration update uses original
-      // frame duration and reduces spurious discontinuity detection.
-      decode_timestamp = frame->GetDecodeTimestamp();
-      presentation_timestamp = frame->timestamp();
-      frame_end_timestamp = frame->timestamp() + frame->duration();
-    }
-
-    if (presentation_timestamp < append_window_start ||
-        frame_end_timestamp > append_window_end) {
-      track_buffer->set_needs_random_access_point(true);
-      DVLOG(3) << "Dropping frame that is outside append window.";
-      return true;
-    }
-
-    DCHECK(presentation_timestamp >= base::TimeDelta());
-    if (decode_timestamp < DecodeTimestamp()) {
-      // B-frames may still result in negative DTS here after being shifted by
-      // |timestamp_offset_|.
-      // TODO(wolenetz): This is no longer a step in the CFP, since negative DTS
-      // are allowed. Remove this parse failure and error log as part of fixing
-      // PTS/DTS conflation in SourceBufferStream. See https://crbug.com/398141
-      MEDIA_LOG(ERROR, media_log_)
-          << frame->GetTypeName() << " frame with PTS "
-          << presentation_timestamp.InMicroseconds() << "us has negative DTS "
-          << decode_timestamp.InMicroseconds()
-          << "us after applying timestampOffset, handling any discontinuity, "
-             "and filtering against append window";
-      return false;
-    }
-
-    // 10. If the need random access point flag on track buffer equals true,
-    //     then run the following steps:
-    if (track_buffer->needs_random_access_point()) {
-      // 10.1. If the coded frame is not a random access point, then drop the
-      //       coded frame and jump to the top of the loop to start processing
-      //       the next coded frame.
-      if (!frame->is_key_frame()) {
-        DVLOG(3) << __func__
-                 << ": Dropping frame that is not a random access point";
-        return true;
-      }
-
-      // 10.2. Set the need random access point flag on track buffer to false.
-      track_buffer->set_needs_random_access_point(false);
-    }
-
-    // We now have a processed buffer to append to the track buffer's stream.
-    // If it is the first in a new coded frame group (such as following a
-    // discontinuity), notify all the track buffers' streams that a coded frame
-    // group is starting.
-    // If in 'sequence' appendMode, also check to make sure we don't need to
-    // signal the start of a new coded frame group in the case where
-    // timestampOffset adjustments by the app may cause this coded frame to be
-    // in the timeline prior to the last frame processed.
-    if (coded_frame_group_last_dts_ == kNoDecodeTimestamp() ||
-        (sequence_mode_ && coded_frame_group_last_dts_ > decode_timestamp)) {
-      // First, complete the append to track buffer streams of the previous
-      // coded frame group's frames, if any.
-      if (!FlushProcessedFrames()) return false;
-
-      // TODO(wolenetz): This should be changed to a presentation timestamp. See
-      // http://crbug.com/402502
-      NotifyStartOfCodedFrameGroup(decode_timestamp);
-    }
-
-    coded_frame_group_last_dts_ = decode_timestamp;
-
-    DVLOG(3) << __func__ << ": Sending processed frame to stream, "
-             << "PTS=" << presentation_timestamp.InSecondsF()
-             << ", DTS=" << decode_timestamp.InSecondsF();
-
-    // Steps 11-16: Note, we optimize by appending groups of contiguous
-    // processed frames for each track buffer at end of ProcessFrames() or prior
-    // to NotifyStartOfCodedFrameGroup().
-    track_buffer->EnqueueProcessedFrame(frame);
-
-    // 17. Set last decode timestamp for track buffer to decode timestamp.
-    track_buffer->set_last_decode_timestamp(decode_timestamp);
-
-    // 18. Set last frame duration for track buffer to frame duration.
-    track_buffer->set_last_frame_duration(frame_duration);
-
-    // 19. If highest presentation timestamp for track buffer is unset or frame
-    //     end timestamp is greater than highest presentation timestamp, then
-    //     set highest presentation timestamp for track buffer to frame end
-    //     timestamp.
-    track_buffer->SetHighestPresentationTimestampIfIncreased(
-        frame_end_timestamp);
-
-    // 20. If frame end timestamp is greater than group end timestamp, then set
-    //     group end timestamp equal to frame end timestamp.
-    if (frame_end_timestamp > group_end_timestamp_)
-      group_end_timestamp_ = frame_end_timestamp;
-    DCHECK(group_end_timestamp_ >= base::TimeDelta());
-
-    // Step 21 is currently handled differently. See SourceBufferState's
-    // |auto_update_timestamp_offset_|.
-    return true;
-  }
-
-  NOTREACHED();
-  return false;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/frame_processor.h b/cobalt/media/filters/frame_processor.h
deleted file mode 100644
index 8d9887a..0000000
--- a/cobalt/media/filters/frame_processor.h
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FILTERS_FRAME_PROCESSOR_H_
-#define COBALT_MEDIA_FILTERS_FRAME_PROCESSOR_H_
-
-#include <map>
-
-#include "base/basictypes.h"
-#include "base/callback_forward.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/filters/chunk_demuxer.h"
-
-namespace cobalt {
-namespace media {
-
-class MseTrackBuffer;
-
-// Helper class that implements Media Source Extension's coded frame processing
-// algorithm.
-class MEDIA_EXPORT FrameProcessor {
- public:
-  typedef base::Callback<void(base::TimeDelta)> UpdateDurationCB;
-
-  FrameProcessor(const UpdateDurationCB& update_duration_cb,
-                 const scoped_refptr<MediaLog>& media_log);
-  ~FrameProcessor();
-
-  // Get/set the current append mode, which if true means "sequence" and if
-  // false means "segments".
-  // See http://www.w3.org/TR/media-source/#widl-SourceBuffer-mode.
-  bool sequence_mode() { return sequence_mode_; }
-  void SetSequenceMode(bool sequence_mode);
-
-  // Processes buffers in |buffer_queue_map|.
-  // Returns true on success or false on failure which indicates decode error.
-  // |append_window_start| and |append_window_end| correspond to the MSE spec's
-  // similarly named source buffer attributes that are used in coded frame
-  // processing.
-  // Uses |*timestamp_offset| according to the coded frame processing algorithm,
-  // including updating it as required in 'sequence' mode frame processing.
-  bool ProcessFrames(const StreamParser::BufferQueueMap& buffer_queue_map,
-                     base::TimeDelta append_window_start,
-                     base::TimeDelta append_window_end,
-                     base::TimeDelta* timestamp_offset);
-
-  // Signals the frame processor to update its group start timestamp to be
-  // |timestamp_offset| if it is in sequence append mode.
-  void SetGroupStartTimestampIfInSequenceMode(base::TimeDelta timestamp_offset);
-
-  // Adds a new track with unique track ID |id|.
-  // If |id| has previously been added, returns false to indicate error.
-  // Otherwise, returns true, indicating future ProcessFrames() will emit
-  // frames for the track |id| to |stream|.
-  bool AddTrack(StreamParser::TrackId id, ChunkDemuxerStream* stream);
-
-  // A map that describes how track ids changed between init segment. Maps the
-  // old track id for a new track id for the same track.
-  typedef std::map<StreamParser::TrackId, StreamParser::TrackId> TrackIdChanges;
-
-  // Updates the internal mapping of TrackIds to track buffers. The input
-  // parameter |track_id_changes| maps old track ids to new ones. The track ids
-  // not present in the map must be assumed unchanged. Returns false if
-  // remapping failed.
-  bool UpdateTrackIds(const TrackIdChanges& track_id_changes);
-
-  // Sets the need random access point flag on all track buffers to true.
-  void SetAllTrackBuffersNeedRandomAccessPoint();
-
-  // Resets state for the coded frame processing algorithm as described in steps
-  // 2-5 of the MSE Reset Parser State algorithm described at
-  // http://www.w3.org/TR/media-source/#sourcebuffer-reset-parser-state
-  void Reset();
-
-  // Must be called when the audio config is updated.  Used to manage when
-  // the preroll buffer is cleared and the allowed "fudge" factor between
-  // preroll buffers.
-  void OnPossibleAudioConfigUpdate(const AudioDecoderConfig& config);
-
- private:
-  friend class FrameProcessorTest;
-
-  // If |track_buffers_| contains |id|, returns a pointer to the associated
-  // MseTrackBuffer. Otherwise, returns NULL.
-  MseTrackBuffer* FindTrack(StreamParser::TrackId id);
-
-  // Signals all track buffers' streams that a coded frame group is starting
-  // with decode timestamp |start_timestamp|.
-  void NotifyStartOfCodedFrameGroup(DecodeTimestamp start_timestamp);
-
-  // Helper that signals each track buffer to append any processed, but not yet
-  // appended, frames to its stream. Returns true on success, or false if one or
-  // more of the appends failed.
-  bool FlushProcessedFrames();
-
-  // Handles partial append window trimming of |buffer|.  Returns true if the
-  // given |buffer| can be partially trimmed or have preroll added; otherwise,
-  // returns false.
-  //
-  // If |buffer| overlaps |append_window_start|, the portion of |buffer| before
-  // |append_window_start| will be marked for post-decode discard.  Further, if
-  // |audio_preroll_buffer_| exists and abuts |buffer|, it will be set as
-  // preroll on |buffer| and |audio_preroll_buffer_| will be cleared.  If the
-  // preroll buffer does not abut |buffer|, it will be discarded unused.
-  //
-  // Likewise, if |buffer| overlaps |append_window_end|, the portion of |buffer|
-  // after |append_window_end| will be marked for post-decode discard.
-  //
-  // If |buffer| lies entirely before |append_window_start|, and thus would
-  // normally be discarded, |audio_preroll_buffer_| will be set to |buffer| and
-  // the method will return false.
-  bool HandlePartialAppendWindowTrimming(
-      base::TimeDelta append_window_start, base::TimeDelta append_window_end,
-      const scoped_refptr<StreamParserBuffer>& buffer);
-
-  // Helper that processes one frame with the coded frame processing algorithm.
-  // Returns false on error or true on success.
-  bool ProcessFrame(const scoped_refptr<StreamParserBuffer>& frame,
-                    base::TimeDelta append_window_start,
-                    base::TimeDelta append_window_end,
-                    base::TimeDelta* timestamp_offset);
-
-  // TrackId-indexed map of each track's stream.
-  typedef std::map<StreamParser::TrackId, scoped_refptr<MseTrackBuffer> >
-      TrackBuffersMap;
-  TrackBuffersMap track_buffers_;
-
-  // The last audio buffer seen by the frame processor that was removed because
-  // it was entirely before the start of the append window.
-  scoped_refptr<StreamParserBuffer> audio_preroll_buffer_;
-
-  // The AudioDecoderConfig associated with buffers handed to ProcessFrames().
-  AudioDecoderConfig current_audio_config_;
-  base::TimeDelta sample_duration_;
-
-  // The AppendMode of the associated SourceBuffer.
-  // See SetSequenceMode() for interpretation of |sequence_mode_|.
-  // Per http://www.w3.org/TR/media-source/#widl-SourceBuffer-mode:
-  // Controls how a sequence of media segments are handled. This is initially
-  // set to false ("segments").
-  bool sequence_mode_;
-
-  // Tracks whether or not the next processed frame is a continuation of a coded
-  // frame group (see https://w3c.github.io/media-source/#coded-frame-group).
-  // Resets to kNoDecodeTimestamp() upon detection of 'segments' mode
-  // discontinuity, parser reset during 'segments' mode, or switching from
-  // 'sequence' to 'segments' mode.
-  // Once a processed coded frame is emitted for the current coded frame group,
-  // tracks the decode timestamp of the last frame emitted.
-  // Explicit setting of timestampOffset will trigger subsequent notification of
-  // a new coded frame start to the tracks' streams, even in 'sequence' mode, if
-  // the resulting frame has a DTS less than this.
-  DecodeTimestamp coded_frame_group_last_dts_;
-
-  // Tracks the MSE coded frame processing variable of same name.
-  // Initially kNoTimestamp, meaning "unset".
-  base::TimeDelta group_start_timestamp_;
-
-  // Tracks the MSE coded frame processing variable of same name. It stores the
-  // highest coded frame end timestamp across all coded frames in the current
-  // coded frame group. It is set to 0 when the SourceBuffer object is created
-  // and gets updated by ProcessFrames().
-  base::TimeDelta group_end_timestamp_;
-
-  UpdateDurationCB update_duration_cb_;
-
-  // MediaLog for reporting messages and properties to debug content and engine.
-  scoped_refptr<MediaLog> media_log_;
-
-  // Counters that limit spam to |media_log_| for frame processor warnings.
-  int num_dropped_preroll_warnings_;
-  int num_dts_beyond_pts_warnings_;
-
-  DISALLOW_COPY_AND_ASSIGN(FrameProcessor);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_FRAME_PROCESSOR_H_
diff --git a/cobalt/media/filters/frame_processor_unittest.cc b/cobalt/media/filters/frame_processor_unittest.cc
deleted file mode 100644
index 60ad6b9..0000000
--- a/cobalt/media/filters/frame_processor_unittest.cc
+++ /dev/null
@@ -1,893 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/filters/chunk_demuxer.h"
-#include "cobalt/media/filters/frame_processor.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::InSequence;
-using ::testing::StrictMock;
-using ::testing::Values;
-
-namespace cobalt {
-namespace media {
-
-typedef StreamParser::BufferQueue BufferQueue;
-typedef StreamParser::TrackId TrackId;
-
-// Used for setting expectations on callbacks. Using a StrictMock also lets us
-// test for missing or extra callbacks.
-class FrameProcessorTestCallbackHelper {
- public:
-  FrameProcessorTestCallbackHelper() {}
-  virtual ~FrameProcessorTestCallbackHelper() {}
-
-  MOCK_METHOD1(PossibleDurationIncrease, void(base::TimeDelta new_duration));
-
-  // Helper that calls the mock method as well as does basic sanity checks on
-  // |new_duration|.
-  void OnPossibleDurationIncrease(base::TimeDelta new_duration) {
-    PossibleDurationIncrease(new_duration);
-    ASSERT_NE(kNoTimestamp, new_duration);
-    ASSERT_NE(kInfiniteDuration, new_duration);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FrameProcessorTestCallbackHelper);
-};
-
-// Test parameter determines indicates if the TEST_P instance is targeted for
-// sequence mode (if true), or segments mode (if false).
-class FrameProcessorTest : public testing::TestWithParam<bool> {
- protected:
-  FrameProcessorTest()
-      : frame_processor_(new FrameProcessor(
-            base::Bind(
-                &FrameProcessorTestCallbackHelper::OnPossibleDurationIncrease,
-                base::Unretained(&callbacks_)),
-            new MediaLog())),
-        append_window_end_(kInfiniteDuration),
-        frame_duration_(base::TimeDelta::FromMilliseconds(10)),
-        audio_id_(1),
-        video_id_(2) {}
-
-  enum StreamFlags { HAS_AUDIO = 1 << 0, HAS_VIDEO = 1 << 1 };
-
-  void AddTestTracks(int stream_flags) {
-    const bool has_audio = (stream_flags & HAS_AUDIO) != 0;
-    const bool has_video = (stream_flags & HAS_VIDEO) != 0;
-    ASSERT_TRUE(has_audio || has_video);
-
-    if (has_audio) {
-      CreateAndConfigureStream(DemuxerStream::AUDIO);
-      ASSERT_TRUE(audio_);
-      EXPECT_TRUE(frame_processor_->AddTrack(audio_id_, audio_.get()));
-      seek(audio_.get(), base::TimeDelta());
-    }
-    if (has_video) {
-      CreateAndConfigureStream(DemuxerStream::VIDEO);
-      ASSERT_TRUE(video_);
-      EXPECT_TRUE(frame_processor_->AddTrack(video_id_, video_.get()));
-      seek(video_.get(), base::TimeDelta());
-    }
-  }
-
-  void SetTimestampOffset(base::TimeDelta new_offset) {
-    timestamp_offset_ = new_offset;
-    frame_processor_->SetGroupStartTimestampIfInSequenceMode(timestamp_offset_);
-  }
-
-  BufferQueue StringToBufferQueue(const std::string& buffers_to_append,
-                                  const TrackId track_id,
-                                  const DemuxerStream::Type type) {
-    std::vector<std::string> timestamps = base::SplitString(
-        buffers_to_append, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-
-    BufferQueue buffers;
-    for (size_t i = 0; i < timestamps.size(); i++) {
-      bool is_keyframe = false;
-      if (base::EndsWith(timestamps[i], "K", base::CompareCase::SENSITIVE)) {
-        is_keyframe = true;
-        // Remove the "K" off of the token.
-        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
-      }
-
-      // Use custom decode timestamp if included.
-      std::vector<std::string> buffer_timestamps = base::SplitString(
-          timestamps[i], "|", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-      if (buffer_timestamps.size() == 1)
-        buffer_timestamps.push_back(buffer_timestamps[0]);
-      CHECK_EQ(2u, buffer_timestamps.size());
-
-      double time_in_ms, decode_time_in_ms;
-      CHECK(base::StringToDouble(buffer_timestamps[0], &time_in_ms));
-      CHECK(base::StringToDouble(buffer_timestamps[1], &decode_time_in_ms));
-
-      // Create buffer. Encode the original time_in_ms as the buffer's data to
-      // enable later verification of possible buffer relocation in presentation
-      // timeline due to coded frame processing.
-      const uint8_t* timestamp_as_data =
-          reinterpret_cast<uint8_t*>(&time_in_ms);
-      scoped_refptr<StreamParserBuffer> buffer = StreamParserBuffer::CopyFrom(
-          timestamp_as_data, sizeof(time_in_ms), is_keyframe, type, track_id);
-      ASSERT_TRUE(buffer);
-      base::TimeDelta timestamp = base::TimeDelta::FromSecondsD(
-          time_in_ms / base::Time::kMillisecondsPerSecond);
-      buffer->set_timestamp(timestamp);
-      if (time_in_ms != decode_time_in_ms) {
-        DecodeTimestamp decode_timestamp = DecodeTimestamp::FromSecondsD(
-            decode_time_in_ms / base::Time::kMillisecondsPerSecond);
-        buffer->SetDecodeTimestamp(decode_timestamp);
-      }
-
-      buffer->set_duration(frame_duration_);
-      buffers.push_back(buffer);
-    }
-    return buffers;
-  }
-
-  void ProcessFrames(const std::string& audio_timestamps,
-                     const std::string& video_timestamps) {
-    StreamParser::BufferQueueMap buffer_queue_map;
-    const auto& audio_buffers =
-        StringToBufferQueue(audio_timestamps, audio_id_, DemuxerStream::AUDIO);
-    if (!audio_buffers.empty())
-      buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers));
-    const auto& video_buffers =
-        StringToBufferQueue(video_timestamps, video_id_, DemuxerStream::VIDEO);
-    if (!video_buffers.empty())
-      buffer_queue_map.insert(std::make_pair(video_id_, video_buffers));
-    ASSERT_TRUE(frame_processor_->ProcessFrames(
-        buffer_queue_map, append_window_start_, append_window_end_,
-        &timestamp_offset_));
-  }
-
-  void CheckExpectedRangesByTimestamp(ChunkDemuxerStream* stream,
-                                      const std::string& expected) {
-    // Note, DemuxerStream::TEXT streams return [0,duration (==infinity here))
-    Ranges<base::TimeDelta> r = stream->GetBufferedRanges(kInfiniteDuration);
-
-    std::stringstream ss;
-    ss << "{ ";
-    for (size_t i = 0; i < r.size(); ++i) {
-      int64_t start = r.start(i).InMilliseconds();
-      int64_t end = r.end(i).InMilliseconds();
-      ss << "[" << start << "," << end << ") ";
-    }
-    ss << "}";
-    EXPECT_EQ(expected, ss.str());
-  }
-
-  void CheckReadStalls(ChunkDemuxerStream* stream) {
-    int loop_count = 0;
-
-    do {
-      read_callback_called_ = false;
-      stream->Read(base::Bind(&FrameProcessorTest::StoreStatusAndBuffer,
-                              base::Unretained(this)));
-      base::RunLoop().RunUntilIdle();
-    } while (++loop_count < 2 && read_callback_called_ &&
-             last_read_status_ == DemuxerStream::kAborted);
-
-    ASSERT_FALSE(read_callback_called_ &&
-                 last_read_status_ == DemuxerStream::kAborted)
-        << "2 kAborted reads in a row. Giving up.";
-    EXPECT_FALSE(read_callback_called_);
-  }
-
-  // Format of |expected| is a space-delimited sequence of
-  // timestamp_in_ms:original_timestamp_in_ms
-  // original_timestamp_in_ms (and the colon) must be omitted if it is the same
-  // as timestamp_in_ms.
-  void CheckReadsThenReadStalls(ChunkDemuxerStream* stream,
-                                const std::string& expected) {
-    std::vector<std::string> timestamps = base::SplitString(
-        expected, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-    std::stringstream ss;
-    for (size_t i = 0; i < timestamps.size(); ++i) {
-      int loop_count = 0;
-
-      do {
-        read_callback_called_ = false;
-        stream->Read(base::Bind(&FrameProcessorTest::StoreStatusAndBuffer,
-                                base::Unretained(this)));
-        base::RunLoop().RunUntilIdle();
-        EXPECT_TRUE(read_callback_called_);
-      } while (++loop_count < 2 &&
-               last_read_status_ == DemuxerStream::kAborted);
-
-      ASSERT_FALSE(last_read_status_ == DemuxerStream::kAborted)
-          << "2 kAborted reads in a row. Giving up.";
-      EXPECT_EQ(DemuxerStream::kOk, last_read_status_);
-      EXPECT_FALSE(last_read_buffer_->end_of_stream());
-
-      if (i > 0) ss << " ";
-
-      int time_in_ms = last_read_buffer_->timestamp().InMilliseconds();
-      ss << time_in_ms;
-
-      // Decode the original_time_in_ms from the buffer's data.
-      double original_time_in_ms;
-      ASSERT_EQ(sizeof(original_time_in_ms), last_read_buffer_->data_size());
-      original_time_in_ms =
-          *(reinterpret_cast<const double*>(last_read_buffer_->data()));
-      if (original_time_in_ms != time_in_ms) ss << ":" << original_time_in_ms;
-
-      // Detect full-discard preroll buffer.
-      if (last_read_buffer_->discard_padding().first == kInfiniteDuration &&
-          last_read_buffer_->discard_padding().second.is_zero()) {
-        ss << "P";
-      }
-    }
-
-    EXPECT_EQ(expected, ss.str());
-    CheckReadStalls(stream);
-  }
-
-  // TODO(wolenetz): Refactor to instead verify the expected signalling or lack
-  // thereof of new coded frame group by the FrameProcessor. See
-  // https://crbug.com/580613.
-  bool in_coded_frame_group() {
-    return frame_processor_->coded_frame_group_last_dts_ !=
-           kNoDecodeTimestamp();
-  }
-
-  void seek(ChunkDemuxerStream* stream, base::TimeDelta seek_time) {
-    stream->AbortReads();
-    stream->Seek(seek_time);
-    stream->StartReturningData();
-  }
-
-  base::MessageLoop message_loop_;
-  StrictMock<FrameProcessorTestCallbackHelper> callbacks_;
-
-  std::unique_ptr<FrameProcessor> frame_processor_;
-  base::TimeDelta append_window_start_;
-  base::TimeDelta append_window_end_;
-  base::TimeDelta timestamp_offset_;
-  base::TimeDelta frame_duration_;
-  std::unique_ptr<ChunkDemuxerStream> audio_;
-  std::unique_ptr<ChunkDemuxerStream> video_;
-  const TrackId audio_id_;
-  const TrackId video_id_;
-  const BufferQueue empty_queue_;
-
-  // StoreStatusAndBuffer's most recent result.
-  DemuxerStream::Status last_read_status_;
-  scoped_refptr<DecoderBuffer> last_read_buffer_;
-  bool read_callback_called_;
-
- private:
-  void StoreStatusAndBuffer(DemuxerStream::Status status,
-                            const scoped_refptr<DecoderBuffer>& buffer) {
-    if (status == DemuxerStream::kOk && buffer.get()) {
-      DVLOG(3) << __FUNCTION__ << "status: " << status
-               << " ts: " << buffer->timestamp().InSecondsF();
-    } else {
-      DVLOG(3) << __FUNCTION__ << "status: " << status << " ts: n/a";
-    }
-
-    read_callback_called_ = true;
-    last_read_status_ = status;
-    last_read_buffer_ = buffer;
-  }
-
-  void CreateAndConfigureStream(DemuxerStream::Type type) {
-    // TODO(wolenetz/dalecurtis): Also test with splicing disabled?
-    switch (type) {
-      case DemuxerStream::AUDIO: {
-        ASSERT_FALSE(audio_);
-        audio_.reset(new ChunkDemuxerStream(DemuxerStream::AUDIO, true, "1"));
-        AudioDecoderConfig decoder_config(kCodecVorbis, kSampleFormatPlanarF32,
-                                          CHANNEL_LAYOUT_STEREO, 1000,
-                                          EmptyExtraData(), Unencrypted());
-        frame_processor_->OnPossibleAudioConfigUpdate(decoder_config);
-        ASSERT_TRUE(audio_->UpdateAudioConfig(decoder_config, new MediaLog()));
-        break;
-      }
-      case DemuxerStream::VIDEO: {
-        ASSERT_FALSE(video_);
-        video_.reset(new ChunkDemuxerStream(DemuxerStream::VIDEO, true, "2"));
-        ASSERT_TRUE(video_->UpdateVideoConfig(TestVideoConfig::Normal(),
-                                              new MediaLog()));
-        break;
-      }
-      // TODO(wolenetz): Test text coded frame processing.
-      case DemuxerStream::TEXT:
-      case DemuxerStream::UNKNOWN:
-      case DemuxerStream::NUM_TYPES: {
-        ASSERT_FALSE(true);
-      }
-    }
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(FrameProcessorTest);
-};
-
-TEST_F(FrameProcessorTest, WrongTypeInAppendedBuffer) {
-  AddTestTracks(HAS_AUDIO);
-  EXPECT_FALSE(in_coded_frame_group());
-
-  StreamParser::BufferQueueMap buffer_queue_map;
-  const auto& audio_buffers =
-      StringToBufferQueue("0K", audio_id_, DemuxerStream::VIDEO);
-  buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers));
-  ASSERT_FALSE(
-      frame_processor_->ProcessFrames(buffer_queue_map, append_window_start_,
-                                      append_window_end_, &timestamp_offset_));
-  EXPECT_FALSE(in_coded_frame_group());
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ }");
-  CheckReadStalls(audio_.get());
-}
-
-TEST_F(FrameProcessorTest, NonMonotonicallyIncreasingTimestampInOneCall) {
-  AddTestTracks(HAS_AUDIO);
-
-  StreamParser::BufferQueueMap buffer_queue_map;
-  const auto& audio_buffers =
-      StringToBufferQueue("10K 0K", audio_id_, DemuxerStream::AUDIO);
-  buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers));
-  ASSERT_FALSE(
-      frame_processor_->ProcessFrames(buffer_queue_map, append_window_start_,
-                                      append_window_end_, &timestamp_offset_));
-  EXPECT_FALSE(in_coded_frame_group());
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ }");
-  CheckReadStalls(audio_.get());
-}
-
-TEST_P(FrameProcessorTest, AudioOnly_SingleFrame) {
-  // Tests A: P(A) -> (a)
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
-  ProcessFrames("0K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,10) }");
-  CheckReadsThenReadStalls(audio_.get(), "0");
-}
-
-TEST_P(FrameProcessorTest, VideoOnly_SingleFrame) {
-  // Tests V: P(V) -> (v)
-  InSequence s;
-  AddTestTracks(HAS_VIDEO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
-  ProcessFrames("", "0K");
-  EXPECT_TRUE(in_coded_frame_group());
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(video_.get(), "{ [0,10) }");
-  CheckReadsThenReadStalls(video_.get(), "0");
-}
-
-TEST_P(FrameProcessorTest, AudioOnly_TwoFrames) {
-  // Tests A: P(A0, A10) -> (a0, a10)
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 2));
-  ProcessFrames("0K 10K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,20) }");
-  CheckReadsThenReadStalls(audio_.get(), "0 10");
-}
-
-TEST_P(FrameProcessorTest, AudioOnly_SetOffsetThenSingleFrame) {
-  // Tests A: STSO(50)+P(A0) -> TSO==50,(a0@50)
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-
-  const base::TimeDelta fifty_ms = base::TimeDelta::FromMilliseconds(50);
-  SetTimestampOffset(fifty_ms);
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ + fifty_ms));
-  ProcessFrames("0K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-  EXPECT_EQ(fifty_ms, timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [50,60) }");
-
-  // We do not stall on reading without seeking to 50ms due to
-  // SourceBufferStream::kSeekToStartFudgeRoom().
-  CheckReadsThenReadStalls(audio_.get(), "50:0");
-}
-
-TEST_P(FrameProcessorTest, AudioOnly_SetOffsetThenFrameTimestampBelowOffset) {
-  // Tests A: STSO(50)+P(A20) ->
-  //   if sequence mode: TSO==30,(a20@50)
-  //   if segments mode: TSO==50,(a20@70)
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  bool using_sequence_mode = GetParam();
-  if (using_sequence_mode) frame_processor_->SetSequenceMode(true);
-
-  const base::TimeDelta fifty_ms = base::TimeDelta::FromMilliseconds(50);
-  const base::TimeDelta twenty_ms = base::TimeDelta::FromMilliseconds(20);
-  SetTimestampOffset(fifty_ms);
-
-  if (using_sequence_mode) {
-    EXPECT_CALL(callbacks_,
-                PossibleDurationIncrease(fifty_ms + frame_duration_));
-  } else {
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(fifty_ms + twenty_ms +
-                                                     frame_duration_));
-  }
-
-  ProcessFrames("20K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-
-  // We do not stall on reading without seeking to 50ms / 70ms due to
-  // SourceBufferStream::kSeekToStartFudgeRoom().
-  if (using_sequence_mode) {
-    EXPECT_EQ(fifty_ms - twenty_ms, timestamp_offset_);
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [50,60) }");
-    CheckReadsThenReadStalls(audio_.get(), "50:20");
-  } else {
-    EXPECT_EQ(fifty_ms, timestamp_offset_);
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [70,80) }");
-    CheckReadsThenReadStalls(audio_.get(), "70:20");
-  }
-}
-
-TEST_P(FrameProcessorTest, AudioOnly_SequentialProcessFrames) {
-  // Tests A: P(A0,A10)+P(A20,A30) -> (a0,a10,a20,a30)
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 2));
-  ProcessFrames("0K 10K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,20) }");
-
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 4));
-  ProcessFrames("20K 30K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,40) }");
-
-  CheckReadsThenReadStalls(audio_.get(), "0 10 20 30");
-}
-
-TEST_P(FrameProcessorTest, AudioOnly_NonSequentialProcessFrames) {
-  // Tests A: P(A20,A30)+P(A0,A10) ->
-  //   if sequence mode: TSO==-20 after first P(), 20 after second P(), and
-  //                     a(20@0,a30@10,a0@20,a10@30)
-  //   if segments mode: TSO==0,(a0,a10,a20,a30)
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  bool using_sequence_mode = GetParam();
-  if (using_sequence_mode) {
-    frame_processor_->SetSequenceMode(true);
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 2));
-  } else {
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 4));
-  }
-
-  ProcessFrames("20K 30K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-
-  if (using_sequence_mode) {
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,20) }");
-    EXPECT_EQ(frame_duration_ * -2, timestamp_offset_);
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 4));
-  } else {
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [20,40) }");
-    EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 2));
-  }
-
-  ProcessFrames("0K 10K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-
-  if (using_sequence_mode) {
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,40) }");
-    EXPECT_EQ(frame_duration_ * 2, timestamp_offset_);
-    CheckReadsThenReadStalls(audio_.get(), "0:20 10:30 20:0 30:10");
-  } else {
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,40) }");
-    EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-    // Re-seek to 0ms now that we've appended data earlier than what has already
-    // satisfied our initial seek to start, above.
-    seek(audio_.get(), base::TimeDelta());
-    CheckReadsThenReadStalls(audio_.get(), "0 10 20 30");
-  }
-}
-
-TEST_P(FrameProcessorTest, AudioVideo_SequentialProcessFrames) {
-  // Tests AV: P(A0,A10;V0k,V10,V20)+P(A20,A30,A40,V30) ->
-  //   (a0,a10,a20,a30,a40);(v0,v10,v20,v30)
-  InSequence s;
-  AddTestTracks(HAS_AUDIO | HAS_VIDEO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 3));
-  ProcessFrames("0K 10K", "0K 10 20");
-  EXPECT_TRUE(in_coded_frame_group());
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,20) }");
-  CheckExpectedRangesByTimestamp(video_.get(), "{ [0,30) }");
-
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 5));
-  ProcessFrames("20K 30K 40K", "30");
-  EXPECT_TRUE(in_coded_frame_group());
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,50) }");
-  CheckExpectedRangesByTimestamp(video_.get(), "{ [0,40) }");
-
-  CheckReadsThenReadStalls(audio_.get(), "0 10 20 30 40");
-  CheckReadsThenReadStalls(video_.get(), "0 10 20 30");
-}
-
-TEST_P(FrameProcessorTest, AudioVideo_Discontinuity) {
-  // Tests AV: P(A0,A10,A30,A40,A50;V0k,V10,V40,V50key) ->
-  //   if sequence mode: TSO==10,(a0,a10,a30,a40,a50@60);(v0,v10,v50@60)
-  //   if segments mode: TSO==0,(a0,a10,a30,a40,a50);(v0,v10,v50)
-  // This assumes A40K is processed before V40, which depends currently on
-  // MergeBufferQueues() behavior.
-  InSequence s;
-  AddTestTracks(HAS_AUDIO | HAS_VIDEO);
-  bool using_sequence_mode = GetParam();
-  if (using_sequence_mode) {
-    frame_processor_->SetSequenceMode(true);
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 7));
-  } else {
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 6));
-  }
-
-  ProcessFrames("0K 10K 30K 40K 50K", "0K 10 40 50K");
-  EXPECT_TRUE(in_coded_frame_group());
-
-  if (using_sequence_mode) {
-    EXPECT_EQ(frame_duration_, timestamp_offset_);
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,70) }");
-    CheckExpectedRangesByTimestamp(video_.get(), "{ [0,70) }");
-    CheckReadsThenReadStalls(audio_.get(), "0 10 30 40 60:50");
-    CheckReadsThenReadStalls(video_.get(), "0 10 60:50");
-  } else {
-    EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,60) }");
-    CheckExpectedRangesByTimestamp(video_.get(), "{ [0,20) [50,60) }");
-    CheckReadsThenReadStalls(audio_.get(), "0 10 30 40 50");
-    CheckReadsThenReadStalls(video_.get(), "0 10");
-    seek(video_.get(), frame_duration_ * 5);
-    CheckReadsThenReadStalls(video_.get(), "50");
-  }
-}
-
-TEST_P(FrameProcessorTest, AudioVideo_Discontinuity_TimestampOffset) {
-  // If in 'sequence' mode, a new coded frame group is *only* started if the
-  // processed frame sequence outputs something that goes backwards in DTS
-  // order. This helps retain the intent of 'sequence' mode: it both collapses
-  // gaps as well as allows app to override the timeline placement and so needs
-  // to handle overlap-appends, too.
-  InSequence s;
-  AddTestTracks(HAS_AUDIO | HAS_VIDEO);
-  bool using_sequence_mode = GetParam();
-  frame_processor_->SetSequenceMode(using_sequence_mode);
-
-  // Start a coded frame group at time 100ms. Note the jagged start still uses
-  // the coded frame group's start time as the range start for both streams.
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 14));
-  SetTimestampOffset(frame_duration_ * 10);
-  ProcessFrames("0K 10K 20K", "10K 20K 30K");
-  EXPECT_EQ(frame_duration_ * 10, timestamp_offset_);
-  EXPECT_TRUE(in_coded_frame_group());
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [100,130) }");
-  CheckExpectedRangesByTimestamp(video_.get(), "{ [100,140) }");
-
-  // Test the differentiation between 'sequence' and 'segments' mode results if
-  // the coded frame sequence jumps forward beyond the normal discontinuity
-  // threshold.
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 24));
-  SetTimestampOffset(frame_duration_ * 20);
-  ProcessFrames("0K 10K 20K", "10K 20K 30K");
-  EXPECT_EQ(frame_duration_ * 20, timestamp_offset_);
-  EXPECT_TRUE(in_coded_frame_group());
-  if (using_sequence_mode) {
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [100,230) }");
-    CheckExpectedRangesByTimestamp(video_.get(), "{ [100,240) }");
-  } else {
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [100,130) [200,230) }");
-    CheckExpectedRangesByTimestamp(video_.get(), "{ [100,140) [200,240) }");
-  }
-
-  // Test the behavior when timestampOffset adjustment causes next frames to be
-  // in the past relative to the previously processed frame and triggers a new
-  // coded frame group, even in 'sequence' mode.
-  base::TimeDelta fifty_five_ms = base::TimeDelta::FromMilliseconds(55);
-  EXPECT_CALL(callbacks_,
-              PossibleDurationIncrease(fifty_five_ms + frame_duration_ * 4));
-  SetTimestampOffset(fifty_five_ms);
-  ProcessFrames("0K 10K 20K", "10K 20K 30K");
-  EXPECT_EQ(fifty_five_ms, timestamp_offset_);
-  EXPECT_TRUE(in_coded_frame_group());
-  // The new audio range is not within SourceBufferStream's coalescing threshold
-  // relative to the next range, but the new video range is within the
-  // threshold.
-  if (using_sequence_mode) {
-    // TODO(wolenetz/chcunningham): The large explicit-timestampOffset-induced
-    // jump forward (from timestamp 130 to 200) while in a sequence mode coded
-    // frame group makes our adjacency threshold in SourceBuffer, based on
-    // max-interbuffer-distance-within-coded-frame-group, very lenient.
-    // This causes [55,85) to merge with [100,230) here for audio, and similar
-    // for video. See also https://crbug.com/620523.
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [55,230) }");
-    CheckExpectedRangesByTimestamp(video_.get(), "{ [55,240) }");
-  } else {
-    CheckExpectedRangesByTimestamp(audio_.get(),
-                                   "{ [55,85) [100,130) [200,230) }");
-    // Note that the range adjacency logic used in this case is doesn't consider
-    // DTS 85 to be close enough to [100,140), since the first DTS in video
-    // range [100,140) is actually 110. The muxed data started a coded frame
-    // group at time 100, but actual DTS is used for adjacency checks while
-    // appending.
-    CheckExpectedRangesByTimestamp(video_.get(),
-                                   "{ [55,95) [100,140) [200,240) }");
-  }
-
-  // Verify the buffers.
-  // Re-seek now that we've appended data earlier than what already satisfied
-  // our initial seek to start.
-  seek(audio_.get(), fifty_five_ms);
-  seek(video_.get(), fifty_five_ms);
-  if (using_sequence_mode) {
-    CheckReadsThenReadStalls(
-        audio_.get(),
-        "55:0 65:10 75:20 100:0 110:10 120:20 200:0 210:10 220:20");
-    CheckReadsThenReadStalls(
-        video_.get(),
-        "65:10 75:20 85:30 110:10 120:20 130:30 210:10 220:20 230:30");
-  } else {
-    CheckReadsThenReadStalls(audio_.get(), "55:0 65:10 75:20");
-    CheckReadsThenReadStalls(video_.get(), "65:10 75:20 85:30");
-    seek(audio_.get(), frame_duration_ * 10);
-    seek(video_.get(), frame_duration_ * 10);
-    CheckReadsThenReadStalls(audio_.get(), "100:0 110:10 120:20");
-    CheckReadsThenReadStalls(video_.get(), "110:10 120:20 130:30");
-    seek(audio_.get(), frame_duration_ * 20);
-    seek(video_.get(), frame_duration_ * 20);
-    CheckReadsThenReadStalls(audio_.get(), "200:0 210:10 220:20");
-    CheckReadsThenReadStalls(video_.get(), "210:10 220:20 230:30");
-  }
-}
-
-TEST_P(FrameProcessorTest,
-       AppendWindowFilterOfNegativeBufferTimestampsWithPrerollDiscard) {
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-
-  SetTimestampOffset(frame_duration_ * -2);
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
-  ProcessFrames("0K 10K 20K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-  EXPECT_EQ(frame_duration_ * -2, timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,10) }");
-  CheckReadsThenReadStalls(audio_.get(), "0:10P 0:20");
-}
-
-TEST_P(FrameProcessorTest, AppendWindowFilterWithInexactPreroll) {
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-  SetTimestampOffset(-frame_duration_);
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 2));
-  ProcessFrames("0K 9.75K 20K", "");
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,20) }");
-  CheckReadsThenReadStalls(audio_.get(), "0P 0:9.75 10:20");
-}
-
-TEST_P(FrameProcessorTest, AppendWindowFilterWithInexactPreroll_2) {
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-  SetTimestampOffset(-frame_duration_);
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 2));
-  ProcessFrames("0K 10.25K 20K", "");
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,20) }");
-  CheckReadsThenReadStalls(audio_.get(), "0P 0:10.25 10:20");
-}
-
-TEST_P(FrameProcessorTest, AllowNegativeFramePTSAndDTSBeforeOffsetAdjustment) {
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  bool using_sequence_mode = GetParam();
-  if (using_sequence_mode) {
-    frame_processor_->SetSequenceMode(true);
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 3));
-  } else {
-    EXPECT_CALL(callbacks_,
-                PossibleDurationIncrease((frame_duration_ * 5) / 2));
-  }
-
-  ProcessFrames("-5K 5K 15K", "");
-
-  if (using_sequence_mode) {
-    EXPECT_EQ(frame_duration_ / 2, timestamp_offset_);
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,30) }");
-    CheckReadsThenReadStalls(audio_.get(), "0:-5 10:5 20:15");
-  } else {
-    EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,25) }");
-    CheckReadsThenReadStalls(audio_.get(), "0:-5 5 15");
-  }
-}
-
-TEST_P(FrameProcessorTest, PartialAppendWindowFilterNoDiscontinuity) {
-  // Tests that spurious discontinuity is not introduced by a partially
-  // trimmed frame.
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  if (GetParam()) frame_processor_->SetSequenceMode(true);
-  EXPECT_CALL(callbacks_,
-              PossibleDurationIncrease(base::TimeDelta::FromMilliseconds(29)));
-
-  append_window_start_ = base::TimeDelta::FromMilliseconds(7);
-  ProcessFrames("0K 19K", "");
-
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [7,29) }");
-  CheckReadsThenReadStalls(audio_.get(), "7:0 19");
-}
-
-TEST_P(FrameProcessorTest,
-       PartialAppendWindowFilterNoDiscontinuity_DtsAfterPts) {
-  // Tests that spurious discontinuity is not introduced by a partially trimmed
-  // frame that originally had DTS > PTS.
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  bool using_sequence_mode = GetParam();
-  if (using_sequence_mode) {
-    frame_processor_->SetSequenceMode(true);
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(
-                                base::TimeDelta::FromMilliseconds(20)));
-  } else {
-    EXPECT_CALL(callbacks_, PossibleDurationIncrease(
-                                base::TimeDelta::FromMilliseconds(13)));
-  }
-
-  ProcessFrames("-7|10K 3|20K", "");
-
-  if (using_sequence_mode) {
-    EXPECT_EQ(base::TimeDelta::FromMilliseconds(7), timestamp_offset_);
-
-    // TODO(wolenetz): Adjust the following expectation to use PTS instead of
-    // DTS once https://crbug.com/398130 is fixed.
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [17,37) }");
-
-    CheckReadsThenReadStalls(audio_.get(), "0:-7 10:3");
-  } else {
-    EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-
-    // TODO(wolenetz): Adjust the following expectation to use PTS instead of
-    // DTS once https://crbug.com/398130 is fixed.
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [17,30) }");
-
-    CheckReadsThenReadStalls(audio_.get(), "0:-7 3");
-  }
-}
-
-TEST_P(FrameProcessorTest, PartialAppendWindowFilterNoNewMediaSegment) {
-  // Tests that a new media segment is not forcibly signalled for audio frame
-  // partial front trim, to prevent incorrect introduction of a discontinuity
-  // and potentially a non-keyframe video frame to be processed next after the
-  // discontinuity.
-  InSequence s;
-  AddTestTracks(HAS_AUDIO | HAS_VIDEO);
-  frame_processor_->SetSequenceMode(GetParam());
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
-  ProcessFrames("", "0K");
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
-  ProcessFrames("-5K", "");
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 2));
-  ProcessFrames("", "10");
-
-  EXPECT_EQ(base::TimeDelta(), timestamp_offset_);
-  EXPECT_TRUE(in_coded_frame_group());
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,5) }");
-  CheckExpectedRangesByTimestamp(video_.get(), "{ [0,20) }");
-  CheckReadsThenReadStalls(audio_.get(), "0:-5");
-  CheckReadsThenReadStalls(video_.get(), "0 10");
-}
-
-TEST_F(FrameProcessorTest, AudioOnly_SequenceModeContinuityAcrossReset) {
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  frame_processor_->SetSequenceMode(true);
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
-  ProcessFrames("0K", "");
-  frame_processor_->Reset();
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 2));
-  ProcessFrames("100K", "");
-
-  EXPECT_EQ(frame_duration_ * -9, timestamp_offset_);
-  EXPECT_TRUE(in_coded_frame_group());
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ [0,20) }");
-  CheckReadsThenReadStalls(audio_.get(), "0 10:100");
-}
-
-TEST_P(FrameProcessorTest, PartialAppendWindowZeroDurationPreroll) {
-  InSequence s;
-  AddTestTracks(HAS_AUDIO);
-  bool is_sequence_mode = GetParam();
-  frame_processor_->SetSequenceMode(is_sequence_mode);
-
-  append_window_start_ = base::TimeDelta::FromMilliseconds(5);
-
-  // Append a 0 duration frame that falls just before the append window.
-  frame_duration_ = base::TimeDelta::FromMilliseconds(0);
-  EXPECT_FALSE(in_coded_frame_group());
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
-  ProcessFrames("4K", "");
-  // Verify buffer is not part of ranges. It should be silently saved for
-  // preroll for future append.
-  CheckExpectedRangesByTimestamp(audio_.get(), "{ }");
-  CheckReadsThenReadStalls(audio_.get(), "");
-  EXPECT_FALSE(in_coded_frame_group());
-
-  // Abort the reads from last stall. We don't want those reads to "complete"
-  // when we append below. We will initiate new reads to confirm the buffer
-  // looks as we expect.
-  seek(audio_.get(), base::TimeDelta());
-
-  // Append a frame with 10ms duration, with 9ms falling after the window start.
-  base::TimeDelta expected_duration =
-      base::TimeDelta::FromMilliseconds(is_sequence_mode ? 10 : 14);
-  EXPECT_CALL(callbacks_, PossibleDurationIncrease(expected_duration));
-  frame_duration_ = base::TimeDelta::FromMilliseconds(10);
-  ProcessFrames("4K", "");
-  EXPECT_TRUE(in_coded_frame_group());
-
-  // Verify range updated to reflect last append was processed and trimmed, and
-  // also that zero duration buffer was saved and attached as preroll.
-  if (is_sequence_mode) {
-    // For sequence mode, append window trimming is applied after the append
-    // is adjusted for timestampOffset. Basically, everything gets rebased to 0
-    // and trimming then removes 5 seconds from the front.
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [5,10) }");
-    CheckReadsThenReadStalls(audio_.get(), "5:4P 5:4");
-  } else {  // segments mode
-    CheckExpectedRangesByTimestamp(audio_.get(), "{ [5,14) }");
-    CheckReadsThenReadStalls(audio_.get(), "5:4P 5:4");
-  }
-
-  // Verify the preroll buffer still has zero duration.
-  StreamParserBuffer* last_read_parser_buffer =
-      static_cast<StreamParserBuffer*>(last_read_buffer_.get());
-  ASSERT_EQ(base::TimeDelta::FromMilliseconds(0),
-            last_read_parser_buffer->preroll_buffer()->duration());
-}
-
-INSTANTIATE_TEST_CASE_P(SequenceMode, FrameProcessorTest, Values(true));
-INSTANTIATE_TEST_CASE_P(SegmentsMode, FrameProcessorTest, Values(false));
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h264_bit_reader.cc b/cobalt/media/filters/h264_bit_reader.cc
deleted file mode 100644
index c6199d7..0000000
--- a/cobalt/media/filters/h264_bit_reader.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/h264_bit_reader.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-H264BitReader::H264BitReader()
-    : data_(NULL),
-      bytes_left_(0),
-      curr_byte_(0),
-      num_remaining_bits_in_curr_byte_(0),
-      prev_two_bytes_(0),
-      emulation_prevention_bytes_(0) {}
-
-H264BitReader::~H264BitReader() {}
-
-bool H264BitReader::Initialize(const uint8_t* data, off_t size) {
-  DCHECK(data);
-
-  if (size < 1) return false;
-
-  data_ = data;
-  bytes_left_ = size;
-  num_remaining_bits_in_curr_byte_ = 0;
-  // Initially set to 0xffff to accept all initial two-byte sequences.
-  prev_two_bytes_ = 0xffff;
-  emulation_prevention_bytes_ = 0;
-
-  return true;
-}
-
-bool H264BitReader::UpdateCurrByte() {
-  if (bytes_left_ < 1) return false;
-
-  // Emulation prevention three-byte detection.
-  // If a sequence of 0x000003 is found, skip (ignore) the last byte (0x03).
-  if (*data_ == 0x03 && (prev_two_bytes_ & 0xffff) == 0) {
-    // Detected 0x000003, skip last byte.
-    ++data_;
-    --bytes_left_;
-    ++emulation_prevention_bytes_;
-    // Need another full three bytes before we can detect the sequence again.
-    prev_two_bytes_ = 0xffff;
-
-    if (bytes_left_ < 1) return false;
-  }
-
-  // Load a new byte and advance pointers.
-  curr_byte_ = *data_++ & 0xff;
-  --bytes_left_;
-  num_remaining_bits_in_curr_byte_ = 8;
-
-  prev_two_bytes_ = ((prev_two_bytes_ & 0xff) << 8) | curr_byte_;
-
-  return true;
-}
-
-// Read |num_bits| (1 to 31 inclusive) from the stream and return them
-// in |out|, with first bit in the stream as MSB in |out| at position
-// (|num_bits| - 1).
-bool H264BitReader::ReadBits(int num_bits, int* out) {
-  int bits_left = num_bits;
-  *out = 0;
-  DCHECK_GE(31, num_bits);
-
-  while (num_remaining_bits_in_curr_byte_ < bits_left) {
-    // Take all that's left in current byte, shift to make space for the rest.
-    *out |= (curr_byte_ << (bits_left - num_remaining_bits_in_curr_byte_));
-    bits_left -= num_remaining_bits_in_curr_byte_;
-
-    if (!UpdateCurrByte()) return false;
-  }
-
-  *out |= (curr_byte_ >> (num_remaining_bits_in_curr_byte_ - bits_left));
-  *out &= ((1u << num_bits) - 1u);
-  num_remaining_bits_in_curr_byte_ -= bits_left;
-
-  return true;
-}
-
-off_t H264BitReader::NumBitsLeft() {
-  return (num_remaining_bits_in_curr_byte_ + bytes_left_ * 8);
-}
-
-bool H264BitReader::HasMoreRBSPData() {
-  // Make sure we have more bits, if we are at 0 bits in current byte and
-  // updating current byte fails, we don't have more data anyway.
-  if (num_remaining_bits_in_curr_byte_ == 0 && !UpdateCurrByte()) return false;
-
-  // If there is no more RBSP data, then |curr_byte_| contains the stop bit and
-  // zero padding. Check to see if there is other data instead.
-  // (We don't actually check for the stop bit itself, instead treating the
-  // invalid case of all trailing zeros identically).
-  if ((curr_byte_ & ((1 << (num_remaining_bits_in_curr_byte_ - 1)) - 1)) != 0)
-    return true;
-
-  // While the spec disallows it (7.4.1: "The last byte of the NAL unit shall
-  // not be equal to 0x00"), some streams have trailing null bytes anyway. We
-  // don't handle emulation prevention sequences because HasMoreRBSPData() is
-  // not used when parsing slices (where cabac_zero_word elements are legal).
-  for (off_t i = 0; i < bytes_left_; i++) {
-    if (data_[i] != 0) return true;
-  }
-
-  bytes_left_ = 0;
-  return false;
-}
-
-size_t H264BitReader::NumEmulationPreventionBytesRead() {
-  return emulation_prevention_bytes_;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h264_bit_reader.h b/cobalt/media/filters/h264_bit_reader.h
deleted file mode 100644
index a6513a5..0000000
--- a/cobalt/media/filters/h264_bit_reader.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 contains an implementation of an H264 Annex-B video stream parser.
-
-#ifndef COBALT_MEDIA_FILTERS_H264_BIT_READER_H_
-#define COBALT_MEDIA_FILTERS_H264_BIT_READER_H_
-
-#include <sys/types.h>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// A class to provide bit-granularity reading of H.264 streams.
-// This is not a generic bit reader class, as it takes into account
-// H.264 stream-specific constraints, such as skipping emulation-prevention
-// bytes and stop bits. See spec for more details.
-class MEDIA_EXPORT H264BitReader {
- public:
-  H264BitReader();
-  ~H264BitReader();
-
-  // Initialize the reader to start reading at |data|, |size| being size
-  // of |data| in bytes.
-  // Return false on insufficient size of stream..
-  // TODO(posciak,fischman): consider replacing Initialize() with
-  // heap-allocating and creating bit readers on demand instead.
-  bool Initialize(const uint8_t* data, off_t size);
-
-  // Read |num_bits| next bits from stream and return in |*out|, first bit
-  // from the stream starting at |num_bits| position in |*out|.
-  // |num_bits| may be 1-32, inclusive.
-  // Return false if the given number of bits cannot be read (not enough
-  // bits in the stream), true otherwise.
-  bool ReadBits(int num_bits, int* out);
-
-  // Return the number of bits left in the stream.
-  off_t NumBitsLeft();
-
-  // See the definition of more_rbsp_data() in spec.
-  bool HasMoreRBSPData();
-
-  // Return the number of emulation prevention bytes already read.
-  size_t NumEmulationPreventionBytesRead();
-
- private:
-  // Advance to the next byte, loading it into curr_byte_.
-  // Return false on end of stream.
-  bool UpdateCurrByte();
-
-  // Pointer to the next unread (not in curr_byte_) byte in the stream.
-  const uint8_t* data_;
-
-  // Bytes left in the stream (without the curr_byte_).
-  off_t bytes_left_;
-
-  // Contents of the current byte; first unread bit starting at position
-  // 8 - num_remaining_bits_in_curr_byte_ from MSB.
-  int curr_byte_;
-
-  // Number of bits remaining in curr_byte_
-  int num_remaining_bits_in_curr_byte_;
-
-  // Used in emulation prevention three byte detection (see spec).
-  // Initially set to 0xffff to accept all initial two-byte sequences.
-  int prev_two_bytes_;
-
-  // Number of emulation preventation bytes (0x000003) we met.
-  size_t emulation_prevention_bytes_;
-
-  DISALLOW_COPY_AND_ASSIGN(H264BitReader);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_H264_BIT_READER_H_
diff --git a/cobalt/media/filters/h264_bit_reader_unittest.cc b/cobalt/media/filters/h264_bit_reader_unittest.cc
deleted file mode 100644
index 0d4e0fa..0000000
--- a/cobalt/media/filters/h264_bit_reader_unittest.cc
+++ /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.
-
-#include "cobalt/media/filters/h264_bit_reader.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(H264BitReaderTest, ReadStreamWithoutEscapeAndTrailingZeroBytes) {
-  H264BitReader reader;
-  const unsigned char rbsp[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xa0};
-  int dummy = 0;
-
-  EXPECT_TRUE(reader.Initialize(rbsp, sizeof(rbsp)));
-
-  EXPECT_TRUE(reader.ReadBits(1, &dummy));
-  EXPECT_EQ(dummy, 0x00);
-  EXPECT_EQ(reader.NumBitsLeft(), 47);
-  EXPECT_TRUE(reader.HasMoreRBSPData());
-
-  EXPECT_TRUE(reader.ReadBits(8, &dummy));
-  EXPECT_EQ(dummy, 0x02);
-  EXPECT_EQ(reader.NumBitsLeft(), 39);
-  EXPECT_TRUE(reader.HasMoreRBSPData());
-
-  EXPECT_TRUE(reader.ReadBits(31, &dummy));
-  EXPECT_EQ(dummy, 0x23456789);
-  EXPECT_EQ(reader.NumBitsLeft(), 8);
-  EXPECT_TRUE(reader.HasMoreRBSPData());
-
-  EXPECT_TRUE(reader.ReadBits(1, &dummy));
-  EXPECT_EQ(dummy, 1);
-  EXPECT_EQ(reader.NumBitsLeft(), 7);
-  EXPECT_TRUE(reader.HasMoreRBSPData());
-
-  EXPECT_TRUE(reader.ReadBits(1, &dummy));
-  EXPECT_EQ(dummy, 0);
-  EXPECT_EQ(reader.NumBitsLeft(), 6);
-  EXPECT_FALSE(reader.HasMoreRBSPData());
-}
-
-TEST(H264BitReaderTest, SingleByteStream) {
-  H264BitReader reader;
-  const unsigned char rbsp[] = {0x18};
-  int dummy = 0;
-
-  EXPECT_TRUE(reader.Initialize(rbsp, sizeof(rbsp)));
-  EXPECT_EQ(reader.NumBitsLeft(), 8);
-  EXPECT_TRUE(reader.HasMoreRBSPData());
-
-  EXPECT_TRUE(reader.ReadBits(4, &dummy));
-  EXPECT_EQ(dummy, 0x01);
-  EXPECT_EQ(reader.NumBitsLeft(), 4);
-  EXPECT_FALSE(reader.HasMoreRBSPData());
-}
-
-TEST(H264BitReaderTest, StopBitOccupyFullByte) {
-  H264BitReader reader;
-  const unsigned char rbsp[] = {0xab, 0x80};
-  int dummy = 0;
-
-  EXPECT_TRUE(reader.Initialize(rbsp, sizeof(rbsp)));
-  EXPECT_EQ(reader.NumBitsLeft(), 16);
-  EXPECT_TRUE(reader.HasMoreRBSPData());
-
-  EXPECT_TRUE(reader.ReadBits(8, &dummy));
-  EXPECT_EQ(dummy, 0xab);
-  EXPECT_EQ(reader.NumBitsLeft(), 8);
-  EXPECT_FALSE(reader.HasMoreRBSPData());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h264_bitstream_buffer.cc b/cobalt/media/filters/h264_bitstream_buffer.cc
deleted file mode 100644
index 083d668..0000000
--- a/cobalt/media/filters/h264_bitstream_buffer.cc
+++ /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.
-
-#include "cobalt/media/filters/h264_bitstream_buffer.h"
-
-#include "base/sys_byteorder.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-H264BitstreamBuffer::H264BitstreamBuffer() : data_(NULL) { Reset(); }
-
-H264BitstreamBuffer::~H264BitstreamBuffer() {
-  SbMemoryDeallocate(data_);
-  data_ = NULL;
-}
-
-void H264BitstreamBuffer::Reset() {
-  SbMemoryDeallocate(data_);
-  data_ = NULL;
-
-  capacity_ = 0;
-  pos_ = 0;
-  reg_ = 0;
-
-  Grow();
-
-  bits_left_in_reg_ = kRegBitSize;
-}
-
-void H264BitstreamBuffer::Grow() {
-  data_ =
-      static_cast<uint8_t*>(SbMemoryReallocate(data_, capacity_ + kGrowBytes));
-  CHECK(data_) << "Failed growing the buffer";
-  capacity_ += kGrowBytes;
-}
-
-void H264BitstreamBuffer::FlushReg() {
-  // Flush all bytes that have at least one bit cached, but not more
-  // (on Flush(), reg_ may not be full).
-  size_t bits_in_reg = kRegBitSize - bits_left_in_reg_;
-  if (bits_in_reg == 0) return;
-
-  size_t bytes_in_reg = (bits_in_reg + 7) / 8;
-  reg_ <<= (kRegBitSize - bits_in_reg);
-
-  // Convert to MSB and append as such to the stream.
-  reg_ = base::HostToNet64(reg_);
-
-  // Make sure we have enough space. Grow() will CHECK() on allocation failure.
-  if (pos_ + bytes_in_reg < capacity_) Grow();
-
-  memcpy(data_ + pos_, &reg_, bytes_in_reg);
-  pos_ += bytes_in_reg;
-
-  reg_ = 0;
-  bits_left_in_reg_ = kRegBitSize;
-}
-
-void H264BitstreamBuffer::AppendU64(size_t num_bits, uint64_t val) {
-  CHECK_LE(num_bits, kRegBitSize);
-
-  while (num_bits > 0) {
-    if (bits_left_in_reg_ == 0) FlushReg();
-
-    uint64_t bits_to_write =
-        num_bits > bits_left_in_reg_ ? bits_left_in_reg_ : num_bits;
-    uint64_t val_to_write = (val >> (num_bits - bits_to_write));
-    if (bits_to_write < 64) val_to_write &= ((1ull << bits_to_write) - 1);
-    reg_ <<= bits_to_write;
-    reg_ |= val_to_write;
-    num_bits -= bits_to_write;
-    bits_left_in_reg_ -= bits_to_write;
-  }
-}
-
-void H264BitstreamBuffer::AppendBool(bool val) {
-  if (bits_left_in_reg_ == 0) FlushReg();
-
-  reg_ <<= 1;
-  reg_ |= (static_cast<uint64_t>(val) & 1);
-  --bits_left_in_reg_;
-}
-
-void H264BitstreamBuffer::AppendSE(int val) {
-  if (val > 0)
-    AppendUE(val * 2 - 1);
-  else
-    AppendUE(-val * 2);
-}
-
-void H264BitstreamBuffer::AppendUE(unsigned int val) {
-  size_t num_zeros = 0;
-  unsigned int v = val + 1;
-
-  while (v > 1) {
-    v >>= 1;
-    ++num_zeros;
-  }
-
-  AppendBits(num_zeros, 0);
-  AppendBits(num_zeros + 1, val + 1);
-}
-
-#define DCHECK_FINISHED()                                                      \
-  DCHECK_EQ(bits_left_in_reg_, kRegBitSize) << "Pending bits not yet written " \
-                                               "to the buffer, call "          \
-                                               "FinishNALU() first."
-
-void H264BitstreamBuffer::BeginNALU(H264NALU::Type nalu_type, int nal_ref_idc) {
-  DCHECK_FINISHED();
-
-  DCHECK_LE(nalu_type, H264NALU::kEOStream);
-  DCHECK_GE(nal_ref_idc, 0);
-  DCHECK_LE(nal_ref_idc, 3);
-
-  AppendBits(32, 0x00000001);
-  AppendBits(1, 0);  // forbidden_zero_bit
-  AppendBits(2, nal_ref_idc);
-  AppendBits(5, nalu_type);
-}
-
-void H264BitstreamBuffer::FinishNALU() {
-  // RBSP stop one bit.
-  AppendBits(1, 1);
-
-  // Byte-alignment zero bits.
-  AppendBits(bits_left_in_reg_ % 8, 0);
-
-  if (bits_left_in_reg_ != kRegBitSize) FlushReg();
-}
-
-size_t H264BitstreamBuffer::BytesInBuffer() {
-  DCHECK_FINISHED();
-  return pos_;
-}
-
-uint8_t* H264BitstreamBuffer::data() {
-  DCHECK(data_);
-  DCHECK_FINISHED();
-
-  return data_;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h264_bitstream_buffer.h b/cobalt/media/filters/h264_bitstream_buffer.h
deleted file mode 100644
index 023eada..0000000
--- a/cobalt/media/filters/h264_bitstream_buffer.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.
-//
-// This file contains an implementation of a H264BitstreamBuffer class for
-// constructing raw bitstream buffers containing NAL units in
-// H.264 Annex-B stream format.
-// See H.264 spec Annex B and chapter 7for more details.
-
-#ifndef COBALT_MEDIA_FILTERS_H264_BITSTREAM_BUFFER_H_
-#define COBALT_MEDIA_FILTERS_H264_BITSTREAM_BUFFER_H_
-
-#include "base/gtest_prod_util.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Holds one or more NALUs as a raw bitstream buffer in H.264 Annex-B format.
-// Note that this class currently does NOT insert emulation prevention
-// three-byte sequences (spec 7.3.1).
-class MEDIA_EXPORT H264BitstreamBuffer {
- public:
-  H264BitstreamBuffer();
-  ~H264BitstreamBuffer();
-
-  // Discard all data and reset the buffer for reuse.
-  void Reset();
-
-  // Append |num_bits| bits to the stream from |val|.
-  // |val| is interpreted in the host endianness.
-  template <typename T>
-  void AppendBits(size_t num_bits, T val) {
-    AppendU64(num_bits, static_cast<uint64_t>(val));
-  }
-
-  void AppendBits(size_t num_bits, bool val) {
-    DCHECK_EQ(num_bits, 1ul);
-    AppendBool(val);
-  }
-
-  // Append a one-bit bool/flag value |val| to the stream.
-  void AppendBool(bool val);
-
-  // Append a signed value in |val| in Exp-Golomb code.
-  void AppendSE(int val);
-
-  // Append an unsigned value in |val| in Exp-Golomb code.
-  void AppendUE(unsigned int val);
-
-  // Start a new NALU of type |nalu_type| and with given |nal_ref_idc|
-  // (see spec). Note, that until FinishNALU() is called, some of the bits
-  // may not be flushed into the buffer and the data will not be correctly
-  // aligned with trailing bits.
-  void BeginNALU(H264NALU::Type nalu_type, int nal_ref_idc);
-
-  // Finish current NALU. This will flush any cached bits and correctly align
-  // the buffer with RBSP trailing bits. This MUST be called for the stream
-  // returned by data() to be correct.
-  void FinishNALU();
-
-  // Return number of full bytes in the stream. Note that FinishNALU() has to
-  // be called to flush cached bits, or the return value will not include them.
-  size_t BytesInBuffer();
-
-  // Return a pointer to the stream. FinishNALU() must be called before
-  // accessing the stream, otherwise some bits may still be cached and not
-  // in the buffer.
-  uint8_t* data();
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(H264BitstreamBufferAppendBitsTest,
-                           AppendAndVerifyBits);
-
-  // Allocate additional memory (kGrowBytes bytes) for the buffer.
-  void Grow();
-
-  // Append |num_bits| bits from U64 value |val| (in host endianness).
-  void AppendU64(size_t num_bits, uint64_t val);
-
-  // Flush any cached bits in the reg with byte granularity, i.e. enough
-  // bytes to flush all pending bits, but not more.
-  void FlushReg();
-
-  typedef uint64_t RegType;
-  enum {
-    // Sizes of reg_.
-    kRegByteSize = sizeof(RegType),
-    kRegBitSize = kRegByteSize * 8,
-    // Amount of bytes to grow the buffer by when we run out of
-    // previously-allocated memory for it.
-    kGrowBytes = 4096,
-  };
-
-  COMPILE_ASSERT(kGrowBytes >= kRegByteSize,
-                 kGrowBytes_must_be_larger_than_kRegByteSize);
-
-  // Unused bits left in reg_.
-  size_t bits_left_in_reg_;
-
-  // Cache for appended bits. Bits are flushed to data_ with kRegByteSize
-  // granularity, i.e. when reg_ becomes full, or when an explicit FlushReg()
-  // is called.
-  RegType reg_;
-
-  // Current capacity of data_, in bytes.
-  size_t capacity_;
-
-  // Current byte offset in data_ (points to the start of unwritten bits).
-  size_t pos_;
-
-  // Buffer for stream data.
-  uint8_t* data_;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_H264_BITSTREAM_BUFFER_H_
diff --git a/cobalt/media/filters/h264_bitstream_buffer_unittest.cc b/cobalt/media/filters/h264_bitstream_buffer_unittest.cc
deleted file mode 100644
index e398ef0..0000000
--- a/cobalt/media/filters/h264_bitstream_buffer_unittest.cc
+++ /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.
-
-#include "cobalt/media/filters/h264_bitstream_buffer.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-const uint64_t kTestPattern = 0xfedcba0987654321;
-}
-
-class H264BitstreamBufferAppendBitsTest
-    : public ::testing::TestWithParam<uint64_t> {};
-
-// TODO(posciak): More tests!
-
-TEST_P(H264BitstreamBufferAppendBitsTest, AppendAndVerifyBits) {
-  H264BitstreamBuffer b;
-  uint64_t num_bits = GetParam();
-  // TODO(posciak): Tests for >64 bits.
-  ASSERT_LE(num_bits, 64u);
-  uint64_t num_bytes = (num_bits + 7) / 8;
-
-  b.AppendBits(num_bits, kTestPattern);
-  b.FlushReg();
-
-  EXPECT_EQ(b.BytesInBuffer(), num_bytes);
-
-  uint8_t* ptr = b.data();
-  uint64_t got = 0;
-  uint64_t expected = kTestPattern;
-
-  if (num_bits < 64) expected &= ((1ull << num_bits) - 1);
-
-  while (num_bits > 8) {
-    got |= (*ptr & 0xff);
-    num_bits -= 8;
-    got <<= (num_bits > 8 ? 8 : num_bits);
-    ptr++;
-  }
-  if (num_bits > 0) {
-    uint64_t temp = (*ptr & 0xff);
-    temp >>= (8 - num_bits);
-    got |= temp;
-  }
-  EXPECT_EQ(got, expected) << std::hex << "0x" << got << " vs 0x" << expected;
-}
-
-INSTANTIATE_TEST_CASE_P(AppendNumBits, H264BitstreamBufferAppendBitsTest,
-                        ::testing::Range(static_cast<uint64_t>(1),
-                                         static_cast<uint64_t>(65)));
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h264_parser.cc b/cobalt/media/filters/h264_parser.cc
deleted file mode 100644
index 6ce658c..0000000
--- a/cobalt/media/filters/h264_parser.cc
+++ /dev/null
@@ -1,1397 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/h264_parser.h"
-
-#include <algorithm>
-#include <limits>
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-bool H264SliceHeader::IsPSlice() const { return (slice_type % 5 == kPSlice); }
-
-bool H264SliceHeader::IsBSlice() const { return (slice_type % 5 == kBSlice); }
-
-bool H264SliceHeader::IsISlice() const { return (slice_type % 5 == kISlice); }
-
-bool H264SliceHeader::IsSPSlice() const { return (slice_type % 5 == kSPSlice); }
-
-bool H264SliceHeader::IsSISlice() const { return (slice_type % 5 == kSISlice); }
-
-H264NALU::H264NALU() { memset(this, 0, sizeof(*this)); }
-
-H264SPS::H264SPS() { memset(this, 0, sizeof(*this)); }
-
-// Based on T-REC-H.264 7.4.2.1.1, "Sequence parameter set data semantics",
-// available from http://www.itu.int/rec/T-REC-H.264.
-base::Optional<math::Size> H264SPS::GetCodedSize() const {
-  // Interlaced frames are twice the height of each field.
-  const int mb_unit = 16;
-  int map_unit = frame_mbs_only_flag ? 16 : 32;
-
-  // Verify that the values are not too large before multiplying them.
-  // TODO: These limits could be much smaller. The currently-largest specified
-  // limit (excluding SVC, multiview, etc., which I didn't bother to read) is
-  // 543 macroblocks (section A.3.1).
-  int max_mb_minus1 = std::numeric_limits<int>::max() / mb_unit - 1;
-  int max_map_units_minus1 = std::numeric_limits<int>::max() / map_unit - 1;
-  if (pic_width_in_mbs_minus1 > max_mb_minus1 ||
-      pic_height_in_map_units_minus1 > max_map_units_minus1) {
-    DVLOG(1) << "Coded size is too large.";
-    return base::nullopt;
-  }
-
-  return math::Size(mb_unit * (pic_width_in_mbs_minus1 + 1),
-                    map_unit * (pic_height_in_map_units_minus1 + 1));
-}
-
-// Also based on section 7.4.2.1.1.
-base::Optional<math::Rect> H264SPS::GetVisibleRect() const {
-  base::Optional<math::Size> coded_size = GetCodedSize();
-  if (!coded_size) return base::nullopt;
-
-  if (!frame_cropping_flag) return math::Rect(coded_size.value());
-
-  int crop_unit_x;
-  int crop_unit_y;
-  if (chroma_array_type == 0) {
-    crop_unit_x = 1;
-    crop_unit_y = frame_mbs_only_flag ? 1 : 2;
-  } else {
-    // Section 6.2.
-    // |chroma_format_idc| may be:
-    //   1 => 4:2:0
-    //   2 => 4:2:2
-    //   3 => 4:4:4
-    // Everything else has |chroma_array_type| == 0.
-    int sub_width_c = chroma_format_idc > 2 ? 1 : 2;
-    int sub_height_c = chroma_format_idc > 1 ? 1 : 2;
-    crop_unit_x = sub_width_c;
-    crop_unit_y = sub_height_c * (frame_mbs_only_flag ? 1 : 2);
-  }
-
-  // Verify that the values are not too large before multiplying.
-  if (coded_size->width() / crop_unit_x < frame_crop_left_offset ||
-      coded_size->width() / crop_unit_x < frame_crop_right_offset ||
-      coded_size->height() / crop_unit_y < frame_crop_top_offset ||
-      coded_size->height() / crop_unit_y < frame_crop_bottom_offset) {
-    DVLOG(1) << "Frame cropping exceeds coded size.";
-    return base::nullopt;
-  }
-  int crop_left = crop_unit_x * frame_crop_left_offset;
-  int crop_right = crop_unit_x * frame_crop_right_offset;
-  int crop_top = crop_unit_y * frame_crop_top_offset;
-  int crop_bottom = crop_unit_y * frame_crop_bottom_offset;
-
-  // Verify that the values are sane. Note that some decoders also require that
-  // crops are smaller than a macroblock and/or that crops must be adjacent to
-  // at least one corner of the coded frame.
-  if (coded_size->width() - crop_left <= crop_right ||
-      coded_size->height() - crop_top <= crop_bottom) {
-    DVLOG(1) << "Frame cropping excludes entire frame.";
-    return base::nullopt;
-  }
-
-  return math::Rect(crop_left, crop_top,
-                    coded_size->width() - crop_left - crop_right,
-                    coded_size->height() - crop_top - crop_bottom);
-}
-
-H264PPS::H264PPS() { memset(this, 0, sizeof(*this)); }
-
-H264SliceHeader::H264SliceHeader() { memset(this, 0, sizeof(*this)); }
-
-H264SEIMessage::H264SEIMessage() { memset(this, 0, sizeof(*this)); }
-
-#define READ_BITS_OR_RETURN(num_bits, out)                                 \
-  do {                                                                     \
-    int _out;                                                              \
-    if (!br_.ReadBits(num_bits, &_out)) {                                  \
-      DVLOG(1)                                                             \
-          << "Error in stream: unexpected EOS while trying to read " #out; \
-      return kInvalidStream;                                               \
-    }                                                                      \
-    *out = _out;                                                           \
-  } while (0)
-
-#define READ_BOOL_OR_RETURN(out)                                           \
-  do {                                                                     \
-    int _out;                                                              \
-    if (!br_.ReadBits(1, &_out)) {                                         \
-      DVLOG(1)                                                             \
-          << "Error in stream: unexpected EOS while trying to read " #out; \
-      return kInvalidStream;                                               \
-    }                                                                      \
-    *out = _out != 0;                                                      \
-  } while (0)
-
-#define READ_UE_OR_RETURN(out)                                                 \
-  do {                                                                         \
-    if (ReadUE(out) != kOk) {                                                  \
-      DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \
-      return kInvalidStream;                                                   \
-    }                                                                          \
-  } while (0)
-
-#define READ_SE_OR_RETURN(out)                                                 \
-  do {                                                                         \
-    if (ReadSE(out) != kOk) {                                                  \
-      DVLOG(1) << "Error in stream: invalid value while trying to read " #out; \
-      return kInvalidStream;                                                   \
-    }                                                                          \
-  } while (0)
-
-#define IN_RANGE_OR_RETURN(val, min, max)                                   \
-  do {                                                                      \
-    if ((val) < (min) || (val) > (max)) {                                   \
-      DVLOG(1) << "Error in stream: invalid value, expected " #val " to be" \
-               << " in range [" << (min) << ":" << (max) << "]"             \
-               << " found " << (val) << " instead";                         \
-      return kInvalidStream;                                                \
-    }                                                                       \
-  } while (0)
-
-#define TRUE_OR_RETURN(a)                                            \
-  do {                                                               \
-    if (!(a)) {                                                      \
-      DVLOG(1) << "Error in stream: invalid value, expected " << #a; \
-      return kInvalidStream;                                         \
-    }                                                                \
-  } while (0)
-
-// ISO 14496 part 10
-// VUI parameters: Table E-1 "Meaning of sample aspect ratio indicator"
-static const int kTableSarWidth[] = {0,  1,  12, 10, 16,  40, 24, 20, 32,
-                                     80, 18, 15, 64, 160, 4,  3,  2};
-static const int kTableSarHeight[] = {0,  1,  11, 11, 11, 33, 11, 11, 11,
-                                      33, 11, 11, 33, 99, 3,  2,  1};
-COMPILE_ASSERT(arraysize(kTableSarWidth) == arraysize(kTableSarHeight),
-               sar_tables_must_have_the_same_size);
-
-H264Parser::H264Parser() { Reset(); }
-
-H264Parser::~H264Parser() {}
-
-void H264Parser::Reset() {
-  stream_ = NULL;
-  bytes_left_ = 0;
-  encrypted_ranges_.clear();
-}
-
-void H264Parser::SetStream(const uint8_t* stream, off_t stream_size) {
-  std::vector<SubsampleEntry> subsamples;
-  SetEncryptedStream(stream, stream_size, subsamples);
-}
-
-void H264Parser::SetEncryptedStream(
-    const uint8_t* stream, off_t stream_size,
-    const std::vector<SubsampleEntry>& subsamples) {
-  DCHECK(stream);
-  DCHECK_GT(stream_size, 0);
-
-  stream_ = stream;
-  bytes_left_ = stream_size;
-
-  encrypted_ranges_.clear();
-  const uint8_t* start = stream;
-  const uint8_t* stream_end = stream_ + bytes_left_;
-  for (size_t i = 0; i < subsamples.size() && start < stream_end; ++i) {
-    start += subsamples[i].clear_bytes;
-
-    const uint8_t* end =
-        std::min(start + subsamples[i].cypher_bytes, stream_end);
-    encrypted_ranges_.Add(start, end);
-    start = end;
-  }
-}
-
-const H264PPS* H264Parser::GetPPS(int pps_id) const {
-  std::map<int, H264PPS>::const_iterator it = active_PPSes_.find(pps_id);
-  if (it == active_PPSes_.end()) {
-    DVLOG(1) << "Requested a nonexistent PPS id " << pps_id;
-    return NULL;
-  }
-
-  return &it->second;
-}
-
-const H264SPS* H264Parser::GetSPS(int sps_id) const {
-  std::map<int, H264SPS>::const_iterator it = active_SPSes_.find(sps_id);
-  if (it == active_SPSes_.end()) {
-    DVLOG(1) << "Requested a nonexistent SPS id " << sps_id;
-    return NULL;
-  }
-
-  return &it->second;
-}
-
-static inline bool IsStartCode(const uint8_t* data) {
-  return data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x01;
-}
-
-// static
-bool H264Parser::FindStartCode(const uint8_t* data, off_t data_size,
-                               off_t* offset, off_t* start_code_size) {
-  DCHECK_GE(data_size, 0);
-  off_t bytes_left = data_size;
-
-  while (bytes_left >= 3) {
-    if (IsStartCode(data)) {
-      // Found three-byte start code, set pointer at its beginning.
-      *offset = data_size - bytes_left;
-      *start_code_size = 3;
-
-      // If there is a zero byte before this start code,
-      // then it's actually a four-byte start code, so backtrack one byte.
-      if (*offset > 0 && *(data - 1) == 0x00) {
-        --(*offset);
-        ++(*start_code_size);
-      }
-
-      return true;
-    }
-
-    ++data;
-    --bytes_left;
-  }
-
-  // End of data: offset is pointing to the first byte that was not considered
-  // as a possible start of a start code.
-  // Note: there is no security issue when receiving a negative |data_size|
-  // since in this case, |bytes_left| is equal to |data_size| and thus
-  // |*offset| is equal to 0 (valid offset).
-  *offset = data_size - bytes_left;
-  *start_code_size = 0;
-  return false;
-}
-
-bool H264Parser::LocateNALU(off_t* nalu_size, off_t* start_code_size) {
-  // Find the start code of next NALU.
-  off_t nalu_start_off = 0;
-  off_t annexb_start_code_size = 0;
-
-  if (!FindStartCodeInClearRanges(stream_, bytes_left_, encrypted_ranges_,
-                                  &nalu_start_off, &annexb_start_code_size)) {
-    DVLOG(4) << "Could not find start code, end of stream?";
-    return false;
-  }
-
-  // Move the stream to the beginning of the NALU (pointing at the start code).
-  stream_ += nalu_start_off;
-  bytes_left_ -= nalu_start_off;
-
-  const uint8_t* nalu_data = stream_ + annexb_start_code_size;
-  off_t max_nalu_data_size = bytes_left_ - annexb_start_code_size;
-  if (max_nalu_data_size <= 0) {
-    DVLOG(3) << "End of stream";
-    return false;
-  }
-
-  // Find the start code of next NALU;
-  // if successful, |nalu_size_without_start_code| is the number of bytes from
-  // after previous start code to before this one;
-  // if next start code is not found, it is still a valid NALU since there
-  // are some bytes left after the first start code: all the remaining bytes
-  // belong to the current NALU.
-  off_t next_start_code_size = 0;
-  off_t nalu_size_without_start_code = 0;
-  if (!FindStartCodeInClearRanges(
-          nalu_data, max_nalu_data_size, encrypted_ranges_,
-          &nalu_size_without_start_code, &next_start_code_size)) {
-    nalu_size_without_start_code = max_nalu_data_size;
-  }
-  *nalu_size = nalu_size_without_start_code + annexb_start_code_size;
-  *start_code_size = annexb_start_code_size;
-  return true;
-}
-
-bool H264Parser::FindStartCodeInClearRanges(
-    const uint8_t* data, off_t data_size,
-    const Ranges<const uint8_t*>& encrypted_ranges, off_t* offset,
-    off_t* start_code_size) {
-  if (encrypted_ranges.size() == 0)
-    return FindStartCode(data, data_size, offset, start_code_size);
-
-  DCHECK_GE(data_size, 0);
-  const uint8_t* start = data;
-  do {
-    off_t bytes_left = data_size - (start - data);
-
-    if (!FindStartCode(start, bytes_left, offset, start_code_size))
-      return false;
-
-    // Construct a Ranges object that represents the region occupied
-    // by the start code and the 1 byte needed to read the NAL unit type.
-    const uint8_t* start_code = start + *offset;
-    const uint8_t* start_code_end = start_code + *start_code_size;
-    Ranges<const uint8_t*> start_code_range;
-    start_code_range.Add(start_code, start_code_end + 1);
-
-    if (encrypted_ranges.IntersectionWith(start_code_range).size() > 0) {
-      // The start code is inside an encrypted section so we need to scan
-      // for another start code.
-      *start_code_size = 0;
-      start += std::min(*offset + 1, bytes_left);
-    }
-  } while (*start_code_size == 0);
-
-  // Update |*offset| to include the data we skipped over.
-  *offset += start - data;
-  return true;
-}
-
-VideoCodecProfile H264Parser::ProfileIDCToVideoCodecProfile(int profile_idc) {
-  switch (profile_idc) {
-    case H264SPS::kProfileIDCBaseline:
-      return H264PROFILE_BASELINE;
-    case H264SPS::kProfileIDCMain:
-      return H264PROFILE_MAIN;
-    case H264SPS::kProfileIDCHigh:
-      return H264PROFILE_HIGH;
-    case H264SPS::kProfileIDHigh10:
-      return H264PROFILE_HIGH10PROFILE;
-    case H264SPS::kProfileIDHigh422:
-      return H264PROFILE_HIGH422PROFILE;
-    case H264SPS::kProfileIDHigh444Predictive:
-      return H264PROFILE_HIGH444PREDICTIVEPROFILE;
-    case H264SPS::kProfileIDScalableBaseline:
-      return H264PROFILE_SCALABLEBASELINE;
-    case H264SPS::kProfileIDScalableHigh:
-      return H264PROFILE_SCALABLEHIGH;
-    case H264SPS::kProfileIDStereoHigh:
-      return H264PROFILE_STEREOHIGH;
-    case H264SPS::kProfileIDSMultiviewHigh:
-      return H264PROFILE_MULTIVIEWHIGH;
-  }
-  NOTREACHED() << "unknown video profile: " << profile_idc;
-  return VIDEO_CODEC_PROFILE_UNKNOWN;
-}
-
-H264Parser::Result H264Parser::ReadUE(int* val) {
-  int num_bits = -1;
-  int bit;
-  int rest;
-
-  // Count the number of contiguous zero bits.
-  do {
-    READ_BITS_OR_RETURN(1, &bit);
-    num_bits++;
-  } while (bit == 0);
-
-  if (num_bits > 31) return kInvalidStream;
-
-  // Calculate exp-Golomb code value of size num_bits.
-  // Special case for |num_bits| == 31 to avoid integer overflow. The only
-  // valid representation as an int is 2^31 - 1, so the remaining bits must
-  // be 0 or else the number is too large.
-  *val = (1u << num_bits) - 1u;
-
-  if (num_bits == 31) {
-    READ_BITS_OR_RETURN(num_bits, &rest);
-    return (rest == 0) ? kOk : kInvalidStream;
-  }
-
-  if (num_bits > 0) {
-    READ_BITS_OR_RETURN(num_bits, &rest);
-    *val += rest;
-  }
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ReadSE(int* val) {
-  int ue;
-  Result res;
-
-  // See Chapter 9 in the spec.
-  res = ReadUE(&ue);
-  if (res != kOk) return res;
-
-  if (ue % 2 == 0)
-    *val = -(ue / 2);
-  else
-    *val = ue / 2 + 1;
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::AdvanceToNextNALU(H264NALU* nalu) {
-  off_t start_code_size;
-  off_t nalu_size_with_start_code;
-  if (!LocateNALU(&nalu_size_with_start_code, &start_code_size)) {
-    DVLOG(4) << "Could not find next NALU, bytes left in stream: "
-             << bytes_left_;
-    return kEOStream;
-  }
-
-  nalu->data = stream_ + start_code_size;
-  nalu->size = nalu_size_with_start_code - start_code_size;
-  DVLOG(4) << "NALU found: size=" << nalu_size_with_start_code;
-
-  // Initialize bit reader at the start of found NALU.
-  if (!br_.Initialize(nalu->data, nalu->size)) return kEOStream;
-
-  // Move parser state to after this NALU, so next time AdvanceToNextNALU
-  // is called, we will effectively be skipping it;
-  // other parsing functions will use the position saved
-  // in bit reader for parsing, so we don't have to remember it here.
-  stream_ += nalu_size_with_start_code;
-  bytes_left_ -= nalu_size_with_start_code;
-
-  // Read NALU header, skip the forbidden_zero_bit, but check for it.
-  int data;
-  READ_BITS_OR_RETURN(1, &data);
-  TRUE_OR_RETURN(data == 0);
-
-  READ_BITS_OR_RETURN(2, &nalu->nal_ref_idc);
-  READ_BITS_OR_RETURN(5, &nalu->nal_unit_type);
-
-  DVLOG(4) << "NALU type: " << static_cast<int>(nalu->nal_unit_type)
-           << " at: " << reinterpret_cast<const void*>(nalu->data)
-           << " size: " << nalu->size
-           << " ref: " << static_cast<int>(nalu->nal_ref_idc);
-
-  return kOk;
-}
-
-// Default scaling lists (per spec).
-static const int kDefault4x4Intra[kH264ScalingList4x4Length] = {
-    6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32, 32, 32, 37, 37, 42,
-};
-
-static const int kDefault4x4Inter[kH264ScalingList4x4Length] = {
-    10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27, 27, 27, 30, 30, 34,
-};
-
-static const int kDefault8x8Intra[kH264ScalingList8x8Length] = {
-    6,  10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, 18, 18, 18, 23,
-    23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27,
-    27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31,
-    31, 33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42,
-};
-
-static const int kDefault8x8Inter[kH264ScalingList8x8Length] = {
-    9,  13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, 19, 19, 19, 21,
-    21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24,
-    24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27,
-    27, 28, 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35,
-};
-
-static inline void DefaultScalingList4x4(
-    int i, int scaling_list4x4[][kH264ScalingList4x4Length]) {
-  DCHECK_LT(i, 6);
-
-  if (i < 3)
-    memcpy(scaling_list4x4[i], kDefault4x4Intra,
-                 sizeof(kDefault4x4Intra));
-  else if (i < 6)
-    memcpy(scaling_list4x4[i], kDefault4x4Inter,
-                 sizeof(kDefault4x4Inter));
-}
-
-static inline void DefaultScalingList8x8(
-    int i, int scaling_list8x8[][kH264ScalingList8x8Length]) {
-  DCHECK_LT(i, 6);
-
-  if (i % 2 == 0)
-    memcpy(scaling_list8x8[i], kDefault8x8Intra,
-                 sizeof(kDefault8x8Intra));
-  else
-    memcpy(scaling_list8x8[i], kDefault8x8Inter,
-                 sizeof(kDefault8x8Inter));
-}
-
-static void FallbackScalingList4x4(
-    int i, const int default_scaling_list_intra[],
-    const int default_scaling_list_inter[],
-    int scaling_list4x4[][kH264ScalingList4x4Length]) {
-  static const int kScalingList4x4ByteSize =
-      sizeof(scaling_list4x4[0][0]) * kH264ScalingList4x4Length;
-
-  switch (i) {
-    case 0:
-      memcpy(scaling_list4x4[i], default_scaling_list_intra,
-                   kScalingList4x4ByteSize);
-      break;
-
-    case 1:
-      memcpy(scaling_list4x4[i], scaling_list4x4[0],
-                   kScalingList4x4ByteSize);
-      break;
-
-    case 2:
-      memcpy(scaling_list4x4[i], scaling_list4x4[1],
-                   kScalingList4x4ByteSize);
-      break;
-
-    case 3:
-      memcpy(scaling_list4x4[i], default_scaling_list_inter,
-                   kScalingList4x4ByteSize);
-      break;
-
-    case 4:
-      memcpy(scaling_list4x4[i], scaling_list4x4[3],
-                   kScalingList4x4ByteSize);
-      break;
-
-    case 5:
-      memcpy(scaling_list4x4[i], scaling_list4x4[4],
-                   kScalingList4x4ByteSize);
-      break;
-
-    default:
-      NOTREACHED();
-      break;
-  }
-}
-
-static void FallbackScalingList8x8(
-    int i, const int default_scaling_list_intra[],
-    const int default_scaling_list_inter[],
-    int scaling_list8x8[][kH264ScalingList8x8Length]) {
-  static const int kScalingList8x8ByteSize =
-      sizeof(scaling_list8x8[0][0]) * kH264ScalingList8x8Length;
-
-  switch (i) {
-    case 0:
-      memcpy(scaling_list8x8[i], default_scaling_list_intra,
-                   kScalingList8x8ByteSize);
-      break;
-
-    case 1:
-      memcpy(scaling_list8x8[i], default_scaling_list_inter,
-                   kScalingList8x8ByteSize);
-      break;
-
-    case 2:
-      memcpy(scaling_list8x8[i], scaling_list8x8[0],
-                   kScalingList8x8ByteSize);
-      break;
-
-    case 3:
-      memcpy(scaling_list8x8[i], scaling_list8x8[1],
-                   kScalingList8x8ByteSize);
-      break;
-
-    case 4:
-      memcpy(scaling_list8x8[i], scaling_list8x8[2],
-                   kScalingList8x8ByteSize);
-      break;
-
-    case 5:
-      memcpy(scaling_list8x8[i], scaling_list8x8[3],
-                   kScalingList8x8ByteSize);
-      break;
-
-    default:
-      NOTREACHED();
-      break;
-  }
-}
-
-H264Parser::Result H264Parser::ParseScalingList(int size, int* scaling_list,
-                                                bool* use_default) {
-  // See chapter 7.3.2.1.1.1.
-  int last_scale = 8;
-  int next_scale = 8;
-  int delta_scale;
-
-  *use_default = false;
-
-  for (int j = 0; j < size; ++j) {
-    if (next_scale != 0) {
-      READ_SE_OR_RETURN(&delta_scale);
-      IN_RANGE_OR_RETURN(delta_scale, -128, 127);
-      next_scale = (last_scale + delta_scale + 256) & 0xff;
-
-      if (j == 0 && next_scale == 0) {
-        *use_default = true;
-        return kOk;
-      }
-    }
-
-    scaling_list[j] = (next_scale == 0) ? last_scale : next_scale;
-    last_scale = scaling_list[j];
-  }
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParseSPSScalingLists(H264SPS* sps) {
-  // See 7.4.2.1.1.
-  bool seq_scaling_list_present_flag;
-  bool use_default;
-  Result res;
-
-  // Parse scaling_list4x4.
-  for (int i = 0; i < 6; ++i) {
-    READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag);
-
-    if (seq_scaling_list_present_flag) {
-      res = ParseScalingList(arraysize(sps->scaling_list4x4[i]),
-                             sps->scaling_list4x4[i], &use_default);
-      if (res != kOk) return res;
-
-      if (use_default) DefaultScalingList4x4(i, sps->scaling_list4x4);
-
-    } else {
-      FallbackScalingList4x4(i, kDefault4x4Intra, kDefault4x4Inter,
-                             sps->scaling_list4x4);
-    }
-  }
-
-  // Parse scaling_list8x8.
-  for (int i = 0; i < ((sps->chroma_format_idc != 3) ? 2 : 6); ++i) {
-    READ_BOOL_OR_RETURN(&seq_scaling_list_present_flag);
-
-    if (seq_scaling_list_present_flag) {
-      res = ParseScalingList(arraysize(sps->scaling_list8x8[i]),
-                             sps->scaling_list8x8[i], &use_default);
-      if (res != kOk) return res;
-
-      if (use_default) DefaultScalingList8x8(i, sps->scaling_list8x8);
-
-    } else {
-      FallbackScalingList8x8(i, kDefault8x8Intra, kDefault8x8Inter,
-                             sps->scaling_list8x8);
-    }
-  }
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParsePPSScalingLists(const H264SPS& sps,
-                                                    H264PPS* pps) {
-  // See 7.4.2.2.
-  bool pic_scaling_list_present_flag;
-  bool use_default;
-  Result res;
-
-  for (int i = 0; i < 6; ++i) {
-    READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag);
-
-    if (pic_scaling_list_present_flag) {
-      res = ParseScalingList(arraysize(pps->scaling_list4x4[i]),
-                             pps->scaling_list4x4[i], &use_default);
-      if (res != kOk) return res;
-
-      if (use_default) DefaultScalingList4x4(i, pps->scaling_list4x4);
-
-    } else {
-      if (sps.seq_scaling_matrix_present_flag) {
-        // Table 7-2 fallback rule A in spec.
-        FallbackScalingList4x4(i, kDefault4x4Intra, kDefault4x4Inter,
-                               pps->scaling_list4x4);
-      } else {
-        // Table 7-2 fallback rule B in spec.
-        FallbackScalingList4x4(i, sps.scaling_list4x4[0],
-                               sps.scaling_list4x4[3], pps->scaling_list4x4);
-      }
-    }
-  }
-
-  if (pps->transform_8x8_mode_flag) {
-    for (int i = 0; i < ((sps.chroma_format_idc != 3) ? 2 : 6); ++i) {
-      READ_BOOL_OR_RETURN(&pic_scaling_list_present_flag);
-
-      if (pic_scaling_list_present_flag) {
-        res = ParseScalingList(arraysize(pps->scaling_list8x8[i]),
-                               pps->scaling_list8x8[i], &use_default);
-        if (res != kOk) return res;
-
-        if (use_default) DefaultScalingList8x8(i, pps->scaling_list8x8);
-
-      } else {
-        if (sps.seq_scaling_matrix_present_flag) {
-          // Table 7-2 fallback rule A in spec.
-          FallbackScalingList8x8(i, kDefault8x8Intra, kDefault8x8Inter,
-                                 pps->scaling_list8x8);
-        } else {
-          // Table 7-2 fallback rule B in spec.
-          FallbackScalingList8x8(i, sps.scaling_list8x8[0],
-                                 sps.scaling_list8x8[1], pps->scaling_list8x8);
-        }
-      }
-    }
-  }
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParseAndIgnoreHRDParameters(
-    bool* hrd_parameters_present) {
-  int data;
-  READ_BOOL_OR_RETURN(&data);  // {nal,vcl}_hrd_parameters_present_flag
-  if (!data) return kOk;
-
-  *hrd_parameters_present = true;
-
-  int cpb_cnt_minus1;
-  READ_UE_OR_RETURN(&cpb_cnt_minus1);
-  IN_RANGE_OR_RETURN(cpb_cnt_minus1, 0, 31);
-  READ_BITS_OR_RETURN(8, &data);  // bit_rate_scale, cpb_size_scale
-  for (int i = 0; i <= cpb_cnt_minus1; ++i) {
-    READ_UE_OR_RETURN(&data);    // bit_rate_value_minus1[i]
-    READ_UE_OR_RETURN(&data);    // cpb_size_value_minus1[i]
-    READ_BOOL_OR_RETURN(&data);  // cbr_flag
-  }
-  READ_BITS_OR_RETURN(20, &data);  // cpb/dpb delays, etc.
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParseVUIParameters(H264SPS* sps) {
-  bool aspect_ratio_info_present_flag;
-  READ_BOOL_OR_RETURN(&aspect_ratio_info_present_flag);
-  if (aspect_ratio_info_present_flag) {
-    int aspect_ratio_idc;
-    READ_BITS_OR_RETURN(8, &aspect_ratio_idc);
-    if (aspect_ratio_idc == H264SPS::kExtendedSar) {
-      READ_BITS_OR_RETURN(16, &sps->sar_width);
-      READ_BITS_OR_RETURN(16, &sps->sar_height);
-    } else {
-      const int max_aspect_ratio_idc = arraysize(kTableSarWidth) - 1;
-      IN_RANGE_OR_RETURN(aspect_ratio_idc, 0, max_aspect_ratio_idc);
-      sps->sar_width = kTableSarWidth[aspect_ratio_idc];
-      sps->sar_height = kTableSarHeight[aspect_ratio_idc];
-    }
-  }
-
-  int data;
-  // Read and ignore overscan and video signal type info.
-  READ_BOOL_OR_RETURN(&data);            // overscan_info_present_flag
-  if (data) READ_BOOL_OR_RETURN(&data);  // overscan_appropriate_flag
-
-  READ_BOOL_OR_RETURN(&data);  // video_signal_type_present_flag
-  if (data) {
-    READ_BITS_OR_RETURN(3, &data);  // video_format
-    READ_BOOL_OR_RETURN(&data);     // video_full_range_flag
-    READ_BOOL_OR_RETURN(&data);     // colour_description_present_flag
-    if (data)
-      READ_BITS_OR_RETURN(24, &data);  // color description syntax elements
-  }
-
-  READ_BOOL_OR_RETURN(&data);  // chroma_loc_info_present_flag
-  if (data) {
-    READ_UE_OR_RETURN(&data);  // chroma_sample_loc_type_top_field
-    READ_UE_OR_RETURN(&data);  // chroma_sample_loc_type_bottom_field
-  }
-
-  // Read and ignore timing info.
-  READ_BOOL_OR_RETURN(&data);  // timing_info_present_flag
-  if (data) {
-    READ_BITS_OR_RETURN(16, &data);  // num_units_in_tick
-    READ_BITS_OR_RETURN(16, &data);  // num_units_in_tick
-    READ_BITS_OR_RETURN(16, &data);  // time_scale
-    READ_BITS_OR_RETURN(16, &data);  // time_scale
-    READ_BOOL_OR_RETURN(&data);      // fixed_frame_rate_flag
-  }
-
-  // Read and ignore NAL HRD parameters, if present.
-  bool hrd_parameters_present = false;
-  Result res = ParseAndIgnoreHRDParameters(&hrd_parameters_present);
-  if (res != kOk) return res;
-
-  // Read and ignore VCL HRD parameters, if present.
-  res = ParseAndIgnoreHRDParameters(&hrd_parameters_present);
-  if (res != kOk) return res;
-
-  if (hrd_parameters_present)    // One of NAL or VCL params present is enough.
-    READ_BOOL_OR_RETURN(&data);  // low_delay_hrd_flag
-
-  READ_BOOL_OR_RETURN(&data);  // pic_struct_present_flag
-  READ_BOOL_OR_RETURN(&sps->bitstream_restriction_flag);
-  if (sps->bitstream_restriction_flag) {
-    READ_BOOL_OR_RETURN(&data);  // motion_vectors_over_pic_boundaries_flag
-    READ_UE_OR_RETURN(&data);    // max_bytes_per_pic_denom
-    READ_UE_OR_RETURN(&data);    // max_bits_per_mb_denom
-    READ_UE_OR_RETURN(&data);    // log2_max_mv_length_horizontal
-    READ_UE_OR_RETURN(&data);    // log2_max_mv_length_vertical
-    READ_UE_OR_RETURN(&sps->max_num_reorder_frames);
-    READ_UE_OR_RETURN(&sps->max_dec_frame_buffering);
-    TRUE_OR_RETURN(sps->max_dec_frame_buffering >= sps->max_num_ref_frames);
-    IN_RANGE_OR_RETURN(sps->max_num_reorder_frames, 0,
-                       sps->max_dec_frame_buffering);
-  }
-
-  return kOk;
-}
-
-static void FillDefaultSeqScalingLists(H264SPS* sps) {
-  for (int i = 0; i < 6; ++i)
-    for (int j = 0; j < kH264ScalingList4x4Length; ++j)
-      sps->scaling_list4x4[i][j] = 16;
-
-  for (int i = 0; i < 6; ++i)
-    for (int j = 0; j < kH264ScalingList8x8Length; ++j)
-      sps->scaling_list8x8[i][j] = 16;
-}
-
-H264Parser::Result H264Parser::ParseSPS(int* sps_id) {
-  // See 7.4.2.1.
-  int data;
-  Result res;
-
-  *sps_id = -1;
-
-  std::unique_ptr<H264SPS> sps(new H264SPS());
-
-  READ_BITS_OR_RETURN(8, &sps->profile_idc);
-  READ_BOOL_OR_RETURN(&sps->constraint_set0_flag);
-  READ_BOOL_OR_RETURN(&sps->constraint_set1_flag);
-  READ_BOOL_OR_RETURN(&sps->constraint_set2_flag);
-  READ_BOOL_OR_RETURN(&sps->constraint_set3_flag);
-  READ_BOOL_OR_RETURN(&sps->constraint_set4_flag);
-  READ_BOOL_OR_RETURN(&sps->constraint_set5_flag);
-  READ_BITS_OR_RETURN(2, &data);  // reserved_zero_2bits
-  READ_BITS_OR_RETURN(8, &sps->level_idc);
-  READ_UE_OR_RETURN(&sps->seq_parameter_set_id);
-  TRUE_OR_RETURN(sps->seq_parameter_set_id < 32);
-
-  if (sps->profile_idc == 100 || sps->profile_idc == 110 ||
-      sps->profile_idc == 122 || sps->profile_idc == 244 ||
-      sps->profile_idc == 44 || sps->profile_idc == 83 ||
-      sps->profile_idc == 86 || sps->profile_idc == 118 ||
-      sps->profile_idc == 128) {
-    READ_UE_OR_RETURN(&sps->chroma_format_idc);
-    TRUE_OR_RETURN(sps->chroma_format_idc < 4);
-
-    if (sps->chroma_format_idc == 3)
-      READ_BOOL_OR_RETURN(&sps->separate_colour_plane_flag);
-
-    READ_UE_OR_RETURN(&sps->bit_depth_luma_minus8);
-    TRUE_OR_RETURN(sps->bit_depth_luma_minus8 < 7);
-
-    READ_UE_OR_RETURN(&sps->bit_depth_chroma_minus8);
-    TRUE_OR_RETURN(sps->bit_depth_chroma_minus8 < 7);
-
-    READ_BOOL_OR_RETURN(&sps->qpprime_y_zero_transform_bypass_flag);
-    READ_BOOL_OR_RETURN(&sps->seq_scaling_matrix_present_flag);
-
-    if (sps->seq_scaling_matrix_present_flag) {
-      DVLOG(4) << "Scaling matrix present";
-      res = ParseSPSScalingLists(sps.get());
-      if (res != kOk) return res;
-    } else {
-      FillDefaultSeqScalingLists(sps.get());
-    }
-  } else {
-    sps->chroma_format_idc = 1;
-    FillDefaultSeqScalingLists(sps.get());
-  }
-
-  if (sps->separate_colour_plane_flag)
-    sps->chroma_array_type = 0;
-  else
-    sps->chroma_array_type = sps->chroma_format_idc;
-
-  READ_UE_OR_RETURN(&sps->log2_max_frame_num_minus4);
-  TRUE_OR_RETURN(sps->log2_max_frame_num_minus4 < 13);
-
-  READ_UE_OR_RETURN(&sps->pic_order_cnt_type);
-  TRUE_OR_RETURN(sps->pic_order_cnt_type < 3);
-
-  if (sps->pic_order_cnt_type == 0) {
-    READ_UE_OR_RETURN(&sps->log2_max_pic_order_cnt_lsb_minus4);
-    TRUE_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 < 13);
-    sps->expected_delta_per_pic_order_cnt_cycle = 0;
-  } else if (sps->pic_order_cnt_type == 1) {
-    READ_BOOL_OR_RETURN(&sps->delta_pic_order_always_zero_flag);
-    READ_SE_OR_RETURN(&sps->offset_for_non_ref_pic);
-    READ_SE_OR_RETURN(&sps->offset_for_top_to_bottom_field);
-    READ_UE_OR_RETURN(&sps->num_ref_frames_in_pic_order_cnt_cycle);
-    TRUE_OR_RETURN(sps->num_ref_frames_in_pic_order_cnt_cycle < 255);
-
-    int offset_acc = 0;
-    for (int i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i) {
-      READ_SE_OR_RETURN(&sps->offset_for_ref_frame[i]);
-      if (offset_acc + sps->offset_for_ref_frame[i] < 0) {
-        return kInvalidStream;
-      }
-      offset_acc += sps->offset_for_ref_frame[i];
-    }
-    sps->expected_delta_per_pic_order_cnt_cycle = offset_acc;
-  }
-
-  READ_UE_OR_RETURN(&sps->max_num_ref_frames);
-  READ_BOOL_OR_RETURN(&sps->gaps_in_frame_num_value_allowed_flag);
-
-  READ_UE_OR_RETURN(&sps->pic_width_in_mbs_minus1);
-  READ_UE_OR_RETURN(&sps->pic_height_in_map_units_minus1);
-
-  READ_BOOL_OR_RETURN(&sps->frame_mbs_only_flag);
-  if (!sps->frame_mbs_only_flag)
-    READ_BOOL_OR_RETURN(&sps->mb_adaptive_frame_field_flag);
-
-  READ_BOOL_OR_RETURN(&sps->direct_8x8_inference_flag);
-
-  READ_BOOL_OR_RETURN(&sps->frame_cropping_flag);
-  if (sps->frame_cropping_flag) {
-    READ_UE_OR_RETURN(&sps->frame_crop_left_offset);
-    READ_UE_OR_RETURN(&sps->frame_crop_right_offset);
-    READ_UE_OR_RETURN(&sps->frame_crop_top_offset);
-    READ_UE_OR_RETURN(&sps->frame_crop_bottom_offset);
-  }
-
-  READ_BOOL_OR_RETURN(&sps->vui_parameters_present_flag);
-  if (sps->vui_parameters_present_flag) {
-    DVLOG(4) << "VUI parameters present";
-    res = ParseVUIParameters(sps.get());
-    if (res != kOk) return res;
-  }
-
-  // If an SPS with the same id already exists, replace it.
-  *sps_id = sps->seq_parameter_set_id;
-  active_SPSes_[*sps_id] = *sps;
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParsePPS(int* pps_id) {
-  // See 7.4.2.2.
-  const H264SPS* sps;
-  Result res;
-
-  *pps_id = -1;
-
-  std::unique_ptr<H264PPS> pps(new H264PPS());
-
-  READ_UE_OR_RETURN(&pps->pic_parameter_set_id);
-  READ_UE_OR_RETURN(&pps->seq_parameter_set_id);
-  TRUE_OR_RETURN(pps->seq_parameter_set_id < 32);
-
-  if (active_SPSes_.find(pps->seq_parameter_set_id) == active_SPSes_.end()) {
-    DVLOG(1) << "Invalid stream, no SPS id: " << pps->seq_parameter_set_id;
-    return kInvalidStream;
-  }
-
-  sps = GetSPS(pps->seq_parameter_set_id);
-  TRUE_OR_RETURN(sps);
-
-  READ_BOOL_OR_RETURN(&pps->entropy_coding_mode_flag);
-  READ_BOOL_OR_RETURN(&pps->bottom_field_pic_order_in_frame_present_flag);
-
-  READ_UE_OR_RETURN(&pps->num_slice_groups_minus1);
-  if (pps->num_slice_groups_minus1 > 1) {
-    DVLOG(1) << "Slice groups not supported";
-    return kUnsupportedStream;
-  }
-
-  READ_UE_OR_RETURN(&pps->num_ref_idx_l0_default_active_minus1);
-  TRUE_OR_RETURN(pps->num_ref_idx_l0_default_active_minus1 < 32);
-
-  READ_UE_OR_RETURN(&pps->num_ref_idx_l1_default_active_minus1);
-  TRUE_OR_RETURN(pps->num_ref_idx_l1_default_active_minus1 < 32);
-
-  READ_BOOL_OR_RETURN(&pps->weighted_pred_flag);
-  READ_BITS_OR_RETURN(2, &pps->weighted_bipred_idc);
-  TRUE_OR_RETURN(pps->weighted_bipred_idc < 3);
-
-  READ_SE_OR_RETURN(&pps->pic_init_qp_minus26);
-  IN_RANGE_OR_RETURN(pps->pic_init_qp_minus26, -26, 25);
-
-  READ_SE_OR_RETURN(&pps->pic_init_qs_minus26);
-  IN_RANGE_OR_RETURN(pps->pic_init_qs_minus26, -26, 25);
-
-  READ_SE_OR_RETURN(&pps->chroma_qp_index_offset);
-  IN_RANGE_OR_RETURN(pps->chroma_qp_index_offset, -12, 12);
-  pps->second_chroma_qp_index_offset = pps->chroma_qp_index_offset;
-
-  READ_BOOL_OR_RETURN(&pps->deblocking_filter_control_present_flag);
-  READ_BOOL_OR_RETURN(&pps->constrained_intra_pred_flag);
-  READ_BOOL_OR_RETURN(&pps->redundant_pic_cnt_present_flag);
-
-  if (br_.HasMoreRBSPData()) {
-    READ_BOOL_OR_RETURN(&pps->transform_8x8_mode_flag);
-    READ_BOOL_OR_RETURN(&pps->pic_scaling_matrix_present_flag);
-
-    if (pps->pic_scaling_matrix_present_flag) {
-      DVLOG(4) << "Picture scaling matrix present";
-      res = ParsePPSScalingLists(*sps, pps.get());
-      if (res != kOk) return res;
-    }
-
-    READ_SE_OR_RETURN(&pps->second_chroma_qp_index_offset);
-  }
-
-  // If a PPS with the same id already exists, replace it.
-  *pps_id = pps->pic_parameter_set_id;
-  active_PPSes_[*pps_id] = *pps;
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParseRefPicListModification(
-    int num_ref_idx_active_minus1, H264ModificationOfPicNum* ref_list_mods) {
-  H264ModificationOfPicNum* pic_num_mod;
-
-  if (num_ref_idx_active_minus1 >= 32) return kInvalidStream;
-
-  for (int i = 0; i < 32; ++i) {
-    pic_num_mod = &ref_list_mods[i];
-    READ_UE_OR_RETURN(&pic_num_mod->modification_of_pic_nums_idc);
-    TRUE_OR_RETURN(pic_num_mod->modification_of_pic_nums_idc < 4);
-
-    switch (pic_num_mod->modification_of_pic_nums_idc) {
-      case 0:
-      case 1:
-        READ_UE_OR_RETURN(&pic_num_mod->abs_diff_pic_num_minus1);
-        break;
-
-      case 2:
-        READ_UE_OR_RETURN(&pic_num_mod->long_term_pic_num);
-        break;
-
-      case 3:
-        // Per spec, list cannot be empty.
-        if (i == 0) return kInvalidStream;
-        return kOk;
-
-      default:
-        return kInvalidStream;
-    }
-  }
-
-  // If we got here, we didn't get loop end marker prematurely,
-  // so make sure it is there for our client.
-  int modification_of_pic_nums_idc;
-  READ_UE_OR_RETURN(&modification_of_pic_nums_idc);
-  TRUE_OR_RETURN(modification_of_pic_nums_idc == 3);
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParseRefPicListModifications(
-    H264SliceHeader* shdr) {
-  Result res;
-
-  if (!shdr->IsISlice() && !shdr->IsSISlice()) {
-    READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l0);
-    if (shdr->ref_pic_list_modification_flag_l0) {
-      res = ParseRefPicListModification(shdr->num_ref_idx_l0_active_minus1,
-                                        shdr->ref_list_l0_modifications);
-      if (res != kOk) return res;
-    }
-  }
-
-  if (shdr->IsBSlice()) {
-    READ_BOOL_OR_RETURN(&shdr->ref_pic_list_modification_flag_l1);
-    if (shdr->ref_pic_list_modification_flag_l1) {
-      res = ParseRefPicListModification(shdr->num_ref_idx_l1_active_minus1,
-                                        shdr->ref_list_l1_modifications);
-      if (res != kOk) return res;
-    }
-  }
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParseWeightingFactors(
-    int num_ref_idx_active_minus1, int chroma_array_type,
-    int luma_log2_weight_denom, int chroma_log2_weight_denom,
-    H264WeightingFactors* w_facts) {
-  int def_luma_weight = 1 << luma_log2_weight_denom;
-  int def_chroma_weight = 1 << chroma_log2_weight_denom;
-
-  for (int i = 0; i < num_ref_idx_active_minus1 + 1; ++i) {
-    READ_BOOL_OR_RETURN(&w_facts->luma_weight_flag);
-    if (w_facts->luma_weight_flag) {
-      READ_SE_OR_RETURN(&w_facts->luma_weight[i]);
-      IN_RANGE_OR_RETURN(w_facts->luma_weight[i], -128, 127);
-
-      READ_SE_OR_RETURN(&w_facts->luma_offset[i]);
-      IN_RANGE_OR_RETURN(w_facts->luma_offset[i], -128, 127);
-    } else {
-      w_facts->luma_weight[i] = def_luma_weight;
-      w_facts->luma_offset[i] = 0;
-    }
-
-    if (chroma_array_type != 0) {
-      READ_BOOL_OR_RETURN(&w_facts->chroma_weight_flag);
-      if (w_facts->chroma_weight_flag) {
-        for (int j = 0; j < 2; ++j) {
-          READ_SE_OR_RETURN(&w_facts->chroma_weight[i][j]);
-          IN_RANGE_OR_RETURN(w_facts->chroma_weight[i][j], -128, 127);
-
-          READ_SE_OR_RETURN(&w_facts->chroma_offset[i][j]);
-          IN_RANGE_OR_RETURN(w_facts->chroma_offset[i][j], -128, 127);
-        }
-      } else {
-        for (int j = 0; j < 2; ++j) {
-          w_facts->chroma_weight[i][j] = def_chroma_weight;
-          w_facts->chroma_offset[i][j] = 0;
-        }
-      }
-    }
-  }
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParsePredWeightTable(const H264SPS& sps,
-                                                    H264SliceHeader* shdr) {
-  READ_UE_OR_RETURN(&shdr->luma_log2_weight_denom);
-  TRUE_OR_RETURN(shdr->luma_log2_weight_denom < 8);
-
-  if (sps.chroma_array_type != 0)
-    READ_UE_OR_RETURN(&shdr->chroma_log2_weight_denom);
-  TRUE_OR_RETURN(shdr->chroma_log2_weight_denom < 8);
-
-  Result res = ParseWeightingFactors(
-      shdr->num_ref_idx_l0_active_minus1, sps.chroma_array_type,
-      shdr->luma_log2_weight_denom, shdr->chroma_log2_weight_denom,
-      &shdr->pred_weight_table_l0);
-  if (res != kOk) return res;
-
-  if (shdr->IsBSlice()) {
-    res = ParseWeightingFactors(
-        shdr->num_ref_idx_l1_active_minus1, sps.chroma_array_type,
-        shdr->luma_log2_weight_denom, shdr->chroma_log2_weight_denom,
-        &shdr->pred_weight_table_l1);
-    if (res != kOk) return res;
-  }
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParseDecRefPicMarking(H264SliceHeader* shdr) {
-  size_t bits_left_at_start = br_.NumBitsLeft();
-
-  if (shdr->idr_pic_flag) {
-    READ_BOOL_OR_RETURN(&shdr->no_output_of_prior_pics_flag);
-    READ_BOOL_OR_RETURN(&shdr->long_term_reference_flag);
-  } else {
-    READ_BOOL_OR_RETURN(&shdr->adaptive_ref_pic_marking_mode_flag);
-
-    H264DecRefPicMarking* marking;
-    if (shdr->adaptive_ref_pic_marking_mode_flag) {
-      size_t i;
-      for (i = 0; i < arraysize(shdr->ref_pic_marking); ++i) {
-        marking = &shdr->ref_pic_marking[i];
-
-        READ_UE_OR_RETURN(&marking->memory_mgmnt_control_operation);
-        if (marking->memory_mgmnt_control_operation == 0) break;
-
-        if (marking->memory_mgmnt_control_operation == 1 ||
-            marking->memory_mgmnt_control_operation == 3)
-          READ_UE_OR_RETURN(&marking->difference_of_pic_nums_minus1);
-
-        if (marking->memory_mgmnt_control_operation == 2)
-          READ_UE_OR_RETURN(&marking->long_term_pic_num);
-
-        if (marking->memory_mgmnt_control_operation == 3 ||
-            marking->memory_mgmnt_control_operation == 6)
-          READ_UE_OR_RETURN(&marking->long_term_frame_idx);
-
-        if (marking->memory_mgmnt_control_operation == 4)
-          READ_UE_OR_RETURN(&marking->max_long_term_frame_idx_plus1);
-
-        if (marking->memory_mgmnt_control_operation > 6) return kInvalidStream;
-      }
-
-      if (i == arraysize(shdr->ref_pic_marking)) {
-        DVLOG(1) << "Ran out of dec ref pic marking fields";
-        return kUnsupportedStream;
-      }
-    }
-  }
-
-  shdr->dec_ref_pic_marking_bit_size = bits_left_at_start - br_.NumBitsLeft();
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParseSliceHeader(const H264NALU& nalu,
-                                                H264SliceHeader* shdr) {
-  // See 7.4.3.
-  const H264SPS* sps;
-  const H264PPS* pps;
-  Result res;
-
-  memset(shdr, 0, sizeof(*shdr));
-
-  shdr->idr_pic_flag = (nalu.nal_unit_type == 5);
-  shdr->nal_ref_idc = nalu.nal_ref_idc;
-  shdr->nalu_data = nalu.data;
-  shdr->nalu_size = nalu.size;
-
-  READ_UE_OR_RETURN(&shdr->first_mb_in_slice);
-  READ_UE_OR_RETURN(&shdr->slice_type);
-  TRUE_OR_RETURN(shdr->slice_type < 10);
-
-  READ_UE_OR_RETURN(&shdr->pic_parameter_set_id);
-
-  pps = GetPPS(shdr->pic_parameter_set_id);
-  TRUE_OR_RETURN(pps);
-
-  sps = GetSPS(pps->seq_parameter_set_id);
-  TRUE_OR_RETURN(sps);
-
-  if (sps->separate_colour_plane_flag) {
-    DVLOG(1) << "Interlaced streams not supported";
-    return kUnsupportedStream;
-  }
-
-  READ_BITS_OR_RETURN(sps->log2_max_frame_num_minus4 + 4, &shdr->frame_num);
-  if (!sps->frame_mbs_only_flag) {
-    READ_BOOL_OR_RETURN(&shdr->field_pic_flag);
-    if (shdr->field_pic_flag) {
-      DVLOG(1) << "Interlaced streams not supported";
-      return kUnsupportedStream;
-    }
-  }
-
-  if (shdr->idr_pic_flag) READ_UE_OR_RETURN(&shdr->idr_pic_id);
-
-  size_t bits_left_at_pic_order_cnt_start = br_.NumBitsLeft();
-  if (sps->pic_order_cnt_type == 0) {
-    READ_BITS_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 + 4,
-                        &shdr->pic_order_cnt_lsb);
-    if (pps->bottom_field_pic_order_in_frame_present_flag &&
-        !shdr->field_pic_flag)
-      READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt_bottom);
-  }
-
-  if (sps->pic_order_cnt_type == 1 && !sps->delta_pic_order_always_zero_flag) {
-    READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt0);
-    if (pps->bottom_field_pic_order_in_frame_present_flag &&
-        !shdr->field_pic_flag)
-      READ_SE_OR_RETURN(&shdr->delta_pic_order_cnt1);
-  }
-
-  shdr->pic_order_cnt_bit_size =
-      bits_left_at_pic_order_cnt_start - br_.NumBitsLeft();
-
-  if (pps->redundant_pic_cnt_present_flag) {
-    READ_UE_OR_RETURN(&shdr->redundant_pic_cnt);
-    TRUE_OR_RETURN(shdr->redundant_pic_cnt < 128);
-  }
-
-  if (shdr->IsBSlice()) READ_BOOL_OR_RETURN(&shdr->direct_spatial_mv_pred_flag);
-
-  if (shdr->IsPSlice() || shdr->IsSPSlice() || shdr->IsBSlice()) {
-    READ_BOOL_OR_RETURN(&shdr->num_ref_idx_active_override_flag);
-    if (shdr->num_ref_idx_active_override_flag) {
-      READ_UE_OR_RETURN(&shdr->num_ref_idx_l0_active_minus1);
-      if (shdr->IsBSlice())
-        READ_UE_OR_RETURN(&shdr->num_ref_idx_l1_active_minus1);
-    } else {
-      shdr->num_ref_idx_l0_active_minus1 =
-          pps->num_ref_idx_l0_default_active_minus1;
-      if (shdr->IsBSlice()) {
-        shdr->num_ref_idx_l1_active_minus1 =
-            pps->num_ref_idx_l1_default_active_minus1;
-      }
-    }
-  }
-  if (shdr->field_pic_flag) {
-    TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 32);
-    TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 32);
-  } else {
-    TRUE_OR_RETURN(shdr->num_ref_idx_l0_active_minus1 < 16);
-    TRUE_OR_RETURN(shdr->num_ref_idx_l1_active_minus1 < 16);
-  }
-
-  if (nalu.nal_unit_type == H264NALU::kCodedSliceExtension) {
-    return kUnsupportedStream;
-  } else {
-    res = ParseRefPicListModifications(shdr);
-    if (res != kOk) return res;
-  }
-
-  if ((pps->weighted_pred_flag && (shdr->IsPSlice() || shdr->IsSPSlice())) ||
-      (pps->weighted_bipred_idc == 1 && shdr->IsBSlice())) {
-    res = ParsePredWeightTable(*sps, shdr);
-    if (res != kOk) return res;
-  }
-
-  if (nalu.nal_ref_idc != 0) {
-    res = ParseDecRefPicMarking(shdr);
-    if (res != kOk) return res;
-  }
-
-  if (pps->entropy_coding_mode_flag && !shdr->IsISlice() &&
-      !shdr->IsSISlice()) {
-    READ_UE_OR_RETURN(&shdr->cabac_init_idc);
-    TRUE_OR_RETURN(shdr->cabac_init_idc < 3);
-  }
-
-  READ_SE_OR_RETURN(&shdr->slice_qp_delta);
-
-  if (shdr->IsSPSlice() || shdr->IsSISlice()) {
-    if (shdr->IsSPSlice()) READ_BOOL_OR_RETURN(&shdr->sp_for_switch_flag);
-    READ_SE_OR_RETURN(&shdr->slice_qs_delta);
-  }
-
-  if (pps->deblocking_filter_control_present_flag) {
-    READ_UE_OR_RETURN(&shdr->disable_deblocking_filter_idc);
-    TRUE_OR_RETURN(shdr->disable_deblocking_filter_idc < 3);
-
-    if (shdr->disable_deblocking_filter_idc != 1) {
-      READ_SE_OR_RETURN(&shdr->slice_alpha_c0_offset_div2);
-      IN_RANGE_OR_RETURN(shdr->slice_alpha_c0_offset_div2, -6, 6);
-
-      READ_SE_OR_RETURN(&shdr->slice_beta_offset_div2);
-      IN_RANGE_OR_RETURN(shdr->slice_beta_offset_div2, -6, 6);
-    }
-  }
-
-  if (pps->num_slice_groups_minus1 > 0) {
-    DVLOG(1) << "Slice groups not supported";
-    return kUnsupportedStream;
-  }
-
-  size_t epb = br_.NumEmulationPreventionBytesRead();
-  shdr->header_bit_size = (shdr->nalu_size - epb) * 8 - br_.NumBitsLeft();
-
-  return kOk;
-}
-
-H264Parser::Result H264Parser::ParseSEI(H264SEIMessage* sei_msg) {
-  int byte;
-
-  memset(sei_msg, 0, sizeof(*sei_msg));
-
-  READ_BITS_OR_RETURN(8, &byte);
-  while (byte == 0xff) {
-    sei_msg->type += 255;
-    READ_BITS_OR_RETURN(8, &byte);
-  }
-  sei_msg->type += byte;
-
-  READ_BITS_OR_RETURN(8, &byte);
-  while (byte == 0xff) {
-    sei_msg->payload_size += 255;
-    READ_BITS_OR_RETURN(8, &byte);
-  }
-  sei_msg->payload_size += byte;
-
-  DVLOG(4) << "Found SEI message type: " << sei_msg->type
-           << " payload size: " << sei_msg->payload_size;
-
-  switch (sei_msg->type) {
-    case H264SEIMessage::kSEIRecoveryPoint:
-      READ_UE_OR_RETURN(&sei_msg->recovery_point.recovery_frame_cnt);
-      READ_BOOL_OR_RETURN(&sei_msg->recovery_point.exact_match_flag);
-      READ_BOOL_OR_RETURN(&sei_msg->recovery_point.broken_link_flag);
-      READ_BITS_OR_RETURN(2, &sei_msg->recovery_point.changing_slice_group_idc);
-      break;
-
-    default:
-      DVLOG(4) << "Unsupported SEI message";
-      break;
-  }
-
-  return kOk;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h264_parser.h b/cobalt/media/filters/h264_parser.h
deleted file mode 100644
index 5358b3e..0000000
--- a/cobalt/media/filters/h264_parser.h
+++ /dev/null
@@ -1,492 +0,0 @@
-// Copyright 2014 The Chromium 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 an implementation of an H264 Annex-B video stream parser.
-
-#ifndef COBALT_MEDIA_FILTERS_H264_PARSER_H_
-#define COBALT_MEDIA_FILTERS_H264_PARSER_H_
-
-#include <sys/types.h>
-
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/optional.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/ranges.h"
-#include "cobalt/media/base/video_codecs.h"
-#include "cobalt/media/filters/h264_bit_reader.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-struct SubsampleEntry;
-
-// For explanations of each struct and its members, see H.264 specification
-// at http://www.itu.int/rec/T-REC-H.264.
-struct MEDIA_EXPORT H264NALU {
-  H264NALU();
-
-  enum Type {
-    kUnspecified = 0,
-    kNonIDRSlice = 1,
-    kSliceDataA = 2,
-    kSliceDataB = 3,
-    kSliceDataC = 4,
-    kIDRSlice = 5,
-    kSEIMessage = 6,
-    kSPS = 7,
-    kPPS = 8,
-    kAUD = 9,
-    kEOSeq = 10,
-    kEOStream = 11,
-    kFiller = 12,
-    kSPSExt = 13,
-    kReserved14 = 14,
-    kReserved15 = 15,
-    kReserved16 = 16,
-    kReserved17 = 17,
-    kReserved18 = 18,
-    kCodedSliceAux = 19,
-    kCodedSliceExtension = 20,
-  };
-
-  // After (without) start code; we don't own the underlying memory
-  // and a shallow copy should be made when copying this struct.
-  const uint8_t* data;
-  off_t size;  // From after start code to start code of next NALU (or EOS).
-
-  int nal_ref_idc;
-  int nal_unit_type;
-};
-
-enum {
-  kH264ScalingList4x4Length = 16,
-  kH264ScalingList8x8Length = 64,
-};
-
-struct MEDIA_EXPORT H264SPS {
-  H264SPS();
-
-  enum H264ProfileIDC {
-    kProfileIDCBaseline = 66,
-    kProfileIDCConstrainedBaseline = kProfileIDCBaseline,
-    kProfileIDCMain = 77,
-    kProfileIDScalableBaseline = 83,
-    kProfileIDScalableHigh = 86,
-    kProfileIDCHigh = 100,
-    kProfileIDHigh10 = 110,
-    kProfileIDSMultiviewHigh = 118,
-    kProfileIDHigh422 = 122,
-    kProfileIDStereoHigh = 128,
-    kProfileIDHigh444Predictive = 244,
-  };
-
-  enum AspectRatioIdc {
-    kExtendedSar = 255,
-  };
-
-  enum {
-    // Constants for HRD parameters (spec ch. E.2.2).
-    kBitRateScaleConstantTerm = 6,  // Equation E-37.
-    kCPBSizeScaleConstantTerm = 4,  // Equation E-38.
-    kDefaultInitialCPBRemovalDelayLength = 24,
-    kDefaultDPBOutputDelayLength = 24,
-    kDefaultTimeOffsetLength = 24,
-  };
-
-  int profile_idc;
-  bool constraint_set0_flag;
-  bool constraint_set1_flag;
-  bool constraint_set2_flag;
-  bool constraint_set3_flag;
-  bool constraint_set4_flag;
-  bool constraint_set5_flag;
-  int level_idc;
-  int seq_parameter_set_id;
-
-  int chroma_format_idc;
-  bool separate_colour_plane_flag;
-  int bit_depth_luma_minus8;
-  int bit_depth_chroma_minus8;
-  bool qpprime_y_zero_transform_bypass_flag;
-
-  bool seq_scaling_matrix_present_flag;
-  int scaling_list4x4[6][kH264ScalingList4x4Length];
-  int scaling_list8x8[6][kH264ScalingList8x8Length];
-
-  int log2_max_frame_num_minus4;
-  int pic_order_cnt_type;
-  int log2_max_pic_order_cnt_lsb_minus4;
-  bool delta_pic_order_always_zero_flag;
-  int offset_for_non_ref_pic;
-  int offset_for_top_to_bottom_field;
-  int num_ref_frames_in_pic_order_cnt_cycle;
-  int expected_delta_per_pic_order_cnt_cycle;  // calculated
-  int offset_for_ref_frame[255];
-  int max_num_ref_frames;
-  bool gaps_in_frame_num_value_allowed_flag;
-  int pic_width_in_mbs_minus1;
-  int pic_height_in_map_units_minus1;
-  bool frame_mbs_only_flag;
-  bool mb_adaptive_frame_field_flag;
-  bool direct_8x8_inference_flag;
-  bool frame_cropping_flag;
-  int frame_crop_left_offset;
-  int frame_crop_right_offset;
-  int frame_crop_top_offset;
-  int frame_crop_bottom_offset;
-
-  bool vui_parameters_present_flag;
-  int sar_width;   // Set to 0 when not specified.
-  int sar_height;  // Set to 0 when not specified.
-  bool bitstream_restriction_flag;
-  int max_num_reorder_frames;
-  int max_dec_frame_buffering;
-  bool timing_info_present_flag;
-  int num_units_in_tick;
-  int time_scale;
-  bool fixed_frame_rate_flag;
-
-  // TODO(posciak): actually parse these instead of ParseAndIgnoreHRDParameters.
-  bool nal_hrd_parameters_present_flag;
-  int cpb_cnt_minus1;
-  int bit_rate_scale;
-  int cpb_size_scale;
-  int bit_rate_value_minus1[32];
-  int cpb_size_value_minus1[32];
-  bool cbr_flag[32];
-  int initial_cpb_removal_delay_length_minus_1;
-  int cpb_removal_delay_length_minus1;
-  int dpb_output_delay_length_minus1;
-  int time_offset_length;
-
-  bool low_delay_hrd_flag;
-
-  int chroma_array_type;
-
-  // Helpers to compute frequently-used values. These methods return
-  // base::nullopt if they encounter integer overflow. They do not verify that
-  // the results are in-spec for the given profile or level.
-  base::Optional<math::Size> GetCodedSize() const;
-  base::Optional<math::Rect> GetVisibleRect() const;
-};
-
-struct MEDIA_EXPORT H264PPS {
-  H264PPS();
-
-  int pic_parameter_set_id;
-  int seq_parameter_set_id;
-  bool entropy_coding_mode_flag;
-  bool bottom_field_pic_order_in_frame_present_flag;
-  int num_slice_groups_minus1;
-  // TODO(posciak): Slice groups not implemented, could be added at some point.
-  int num_ref_idx_l0_default_active_minus1;
-  int num_ref_idx_l1_default_active_minus1;
-  bool weighted_pred_flag;
-  int weighted_bipred_idc;
-  int pic_init_qp_minus26;
-  int pic_init_qs_minus26;
-  int chroma_qp_index_offset;
-  bool deblocking_filter_control_present_flag;
-  bool constrained_intra_pred_flag;
-  bool redundant_pic_cnt_present_flag;
-  bool transform_8x8_mode_flag;
-
-  bool pic_scaling_matrix_present_flag;
-  int scaling_list4x4[6][kH264ScalingList4x4Length];
-  int scaling_list8x8[6][kH264ScalingList8x8Length];
-
-  int second_chroma_qp_index_offset;
-};
-
-struct MEDIA_EXPORT H264ModificationOfPicNum {
-  int modification_of_pic_nums_idc;
-  union {
-    int abs_diff_pic_num_minus1;
-    int long_term_pic_num;
-  };
-};
-
-struct MEDIA_EXPORT H264WeightingFactors {
-  bool luma_weight_flag;
-  bool chroma_weight_flag;
-  int luma_weight[32];
-  int luma_offset[32];
-  int chroma_weight[32][2];
-  int chroma_offset[32][2];
-};
-
-struct MEDIA_EXPORT H264DecRefPicMarking {
-  int memory_mgmnt_control_operation;
-  int difference_of_pic_nums_minus1;
-  int long_term_pic_num;
-  int long_term_frame_idx;
-  int max_long_term_frame_idx_plus1;
-};
-
-struct MEDIA_EXPORT H264SliceHeader {
-  H264SliceHeader();
-
-  enum { kRefListSize = 32, kRefListModSize = kRefListSize };
-
-  enum Type {
-    kPSlice = 0,
-    kBSlice = 1,
-    kISlice = 2,
-    kSPSlice = 3,
-    kSISlice = 4,
-  };
-
-  bool IsPSlice() const;
-  bool IsBSlice() const;
-  bool IsISlice() const;
-  bool IsSPSlice() const;
-  bool IsSISlice() const;
-
-  bool idr_pic_flag;         // from NAL header
-  int nal_ref_idc;           // from NAL header
-  const uint8_t* nalu_data;  // from NAL header
-  off_t nalu_size;           // from NAL header
-  off_t header_bit_size;     // calculated
-
-  int first_mb_in_slice;
-  int slice_type;
-  int pic_parameter_set_id;
-  int colour_plane_id;  // TODO(posciak): use this!  http://crbug.com/139878
-  int frame_num;
-  bool field_pic_flag;
-  bool bottom_field_flag;
-  int idr_pic_id;
-  int pic_order_cnt_lsb;
-  int delta_pic_order_cnt_bottom;
-  int delta_pic_order_cnt0;
-  int delta_pic_order_cnt1;
-  int redundant_pic_cnt;
-  bool direct_spatial_mv_pred_flag;
-
-  bool num_ref_idx_active_override_flag;
-  int num_ref_idx_l0_active_minus1;
-  int num_ref_idx_l1_active_minus1;
-  bool ref_pic_list_modification_flag_l0;
-  bool ref_pic_list_modification_flag_l1;
-  H264ModificationOfPicNum ref_list_l0_modifications[kRefListModSize];
-  H264ModificationOfPicNum ref_list_l1_modifications[kRefListModSize];
-
-  int luma_log2_weight_denom;
-  int chroma_log2_weight_denom;
-
-  bool luma_weight_l0_flag;
-  bool chroma_weight_l0_flag;
-  H264WeightingFactors pred_weight_table_l0;
-
-  bool luma_weight_l1_flag;
-  bool chroma_weight_l1_flag;
-  H264WeightingFactors pred_weight_table_l1;
-
-  bool no_output_of_prior_pics_flag;
-  bool long_term_reference_flag;
-
-  bool adaptive_ref_pic_marking_mode_flag;
-  H264DecRefPicMarking ref_pic_marking[kRefListSize];
-
-  int cabac_init_idc;
-  int slice_qp_delta;
-  bool sp_for_switch_flag;
-  int slice_qs_delta;
-  int disable_deblocking_filter_idc;
-  int slice_alpha_c0_offset_div2;
-  int slice_beta_offset_div2;
-
-  // Calculated.
-  // Size in bits of dec_ref_pic_marking() syntax element.
-  size_t dec_ref_pic_marking_bit_size;
-  size_t pic_order_cnt_bit_size;
-};
-
-struct H264SEIRecoveryPoint {
-  int recovery_frame_cnt;
-  bool exact_match_flag;
-  bool broken_link_flag;
-  int changing_slice_group_idc;
-};
-
-struct MEDIA_EXPORT H264SEIMessage {
-  H264SEIMessage();
-
-  enum Type {
-    kSEIRecoveryPoint = 6,
-  };
-
-  int type;
-  int payload_size;
-  union {
-    // Placeholder; in future more supported types will contribute to more
-    // union members here.
-    H264SEIRecoveryPoint recovery_point;
-  };
-};
-
-// Class to parse an Annex-B H.264 stream,
-// as specified in chapters 7 and Annex B of the H.264 spec.
-class MEDIA_EXPORT H264Parser {
- public:
-  enum Result {
-    kOk,
-    kInvalidStream,      // error in stream
-    kUnsupportedStream,  // stream not supported by the parser
-    kEOStream,           // end of stream
-  };
-
-  // Find offset from start of data to next NALU start code
-  // and size of found start code (3 or 4 bytes).
-  // If no start code is found, offset is pointing to the first unprocessed byte
-  // (i.e. the first byte that was not considered as a possible start of a start
-  // code) and |*start_code_size| is set to 0.
-  // Preconditions:
-  // - |data_size| >= 0
-  // Postconditions:
-  // - |*offset| is between 0 and |data_size| included.
-  //   It is strictly less than |data_size| if |data_size| > 0.
-  // - |*start_code_size| is either 0, 3 or 4.
-  static bool FindStartCode(const uint8_t* data, off_t data_size, off_t* offset,
-                            off_t* start_code_size);
-
-  // Wrapper for FindStartCode() that skips over start codes that
-  // may appear inside of |encrypted_ranges_|.
-  // Returns true if a start code was found. Otherwise returns false.
-  static bool FindStartCodeInClearRanges(const uint8_t* data, off_t data_size,
-                                         const Ranges<const uint8_t*>& ranges,
-                                         off_t* offset, off_t* start_code_size);
-
-  static VideoCodecProfile ProfileIDCToVideoCodecProfile(int profile_idc);
-
-  H264Parser();
-  ~H264Parser();
-
-  void Reset();
-  // Set current stream pointer to |stream| of |stream_size| in bytes,
-  // |stream| owned by caller.
-  // |subsamples| contains information about what parts of |stream| are
-  // encrypted.
-  void SetStream(const uint8_t* stream, off_t stream_size);
-  void SetEncryptedStream(const uint8_t* stream, off_t stream_size,
-                          const std::vector<SubsampleEntry>& subsamples);
-
-  // Read the stream to find the next NALU, identify it and return
-  // that information in |*nalu|. This advances the stream to the beginning
-  // of this NALU, but not past it, so subsequent calls to NALU-specific
-  // parsing functions (ParseSPS, etc.)  will parse this NALU.
-  // If the caller wishes to skip the current NALU, it can call this function
-  // again, instead of any NALU-type specific parse functions below.
-  Result AdvanceToNextNALU(H264NALU* nalu);
-
-  // NALU-specific parsing functions.
-  // These should be called after AdvanceToNextNALU().
-
-  // SPSes and PPSes are owned by the parser class and the memory for their
-  // structures is managed here, not by the caller, as they are reused
-  // across NALUs.
-  //
-  // Parse an SPS/PPS NALU and save their data in the parser, returning id
-  // of the parsed structure in |*pps_id|/|*sps_id|.
-  // To get a pointer to a given SPS/PPS structure, use GetSPS()/GetPPS(),
-  // passing the returned |*sps_id|/|*pps_id| as parameter.
-  // TODO(posciak,fischman): consider replacing returning Result from Parse*()
-  // methods with a std::unique_ptr and adding an AtEOS() function to check for
-  // EOS if Parse*() return NULL.
-  Result ParseSPS(int* sps_id);
-  Result ParsePPS(int* pps_id);
-
-  // Return a pointer to SPS/PPS with given |sps_id|/|pps_id| or NULL if not
-  // present.
-  const H264SPS* GetSPS(int sps_id) const;
-  const H264PPS* GetPPS(int pps_id) const;
-
-  // Slice headers and SEI messages are not used across NALUs by the parser
-  // and can be discarded after current NALU, so the parser does not store
-  // them, nor does it manage their memory.
-  // The caller has to provide and manage it instead.
-
-  // Parse a slice header, returning it in |*shdr|. |*nalu| must be set to
-  // the NALU returned from AdvanceToNextNALU() and corresponding to |*shdr|.
-  Result ParseSliceHeader(const H264NALU& nalu, H264SliceHeader* shdr);
-
-  // Parse a SEI message, returning it in |*sei_msg|, provided and managed
-  // by the caller.
-  Result ParseSEI(H264SEIMessage* sei_msg);
-
- private:
-  // Move the stream pointer to the beginning of the next NALU,
-  // i.e. pointing at the next start code.
-  // Return true if a NALU has been found.
-  // If a NALU is found:
-  // - its size in bytes is returned in |*nalu_size| and includes
-  //   the start code as well as the trailing zero bits.
-  // - the size in bytes of the start code is returned in |*start_code_size|.
-  bool LocateNALU(off_t* nalu_size, off_t* start_code_size);
-
-  // Exp-Golomb code parsing as specified in chapter 9.1 of the spec.
-  // Read one unsigned exp-Golomb code from the stream and return in |*val|.
-  Result ReadUE(int* val);
-
-  // Read one signed exp-Golomb code from the stream and return in |*val|.
-  Result ReadSE(int* val);
-
-  // Parse scaling lists (see spec).
-  Result ParseScalingList(int size, int* scaling_list, bool* use_default);
-  Result ParseSPSScalingLists(H264SPS* sps);
-  Result ParsePPSScalingLists(const H264SPS& sps, H264PPS* pps);
-
-  // Parse optional VUI parameters in SPS (see spec).
-  Result ParseVUIParameters(H264SPS* sps);
-  // Set |hrd_parameters_present| to true only if they are present.
-  Result ParseAndIgnoreHRDParameters(bool* hrd_parameters_present);
-
-  // Parse reference picture lists' modifications (see spec).
-  Result ParseRefPicListModifications(H264SliceHeader* shdr);
-  Result ParseRefPicListModification(int num_ref_idx_active_minus1,
-                                     H264ModificationOfPicNum* ref_list_mods);
-
-  // Parse prediction weight table (see spec).
-  Result ParsePredWeightTable(const H264SPS& sps, H264SliceHeader* shdr);
-
-  // Parse weighting factors (see spec).
-  Result ParseWeightingFactors(int num_ref_idx_active_minus1,
-                               int chroma_array_type,
-                               int luma_log2_weight_denom,
-                               int chroma_log2_weight_denom,
-                               H264WeightingFactors* w_facts);
-
-  // Parse decoded reference picture marking information (see spec).
-  Result ParseDecRefPicMarking(H264SliceHeader* shdr);
-
-  // Pointer to the current NALU in the stream.
-  const uint8_t* stream_;
-
-  // Bytes left in the stream after the current NALU.
-  off_t bytes_left_;
-
-  H264BitReader br_;
-
-  // PPSes and SPSes stored for future reference.
-  std::map<int, H264SPS> active_SPSes_;
-  std::map<int, H264PPS> active_PPSes_;
-
-  // Ranges of encrypted bytes in the buffer passed to
-  // SetEncryptedStream().
-  Ranges<const uint8_t*> encrypted_ranges_;
-
-  DISALLOW_COPY_AND_ASSIGN(H264Parser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_H264_PARSER_H_
diff --git a/cobalt/media/filters/h264_parser_fuzzertest.cc b/cobalt/media/filters/h264_parser_fuzzertest.cc
deleted file mode 100644
index 832ef24..0000000
--- a/cobalt/media/filters/h264_parser_fuzzertest.cc
+++ /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.
-
-#include "base/numerics/safe_conversions.h"
-#include "base/optional.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "starboard/types.h"
-
-static volatile size_t volatile_sink;
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  if (!size) return 0;
-
-  media::H264Parser parser;
-  parser.SetStream(data, base::checked_cast<off_t>(size));
-
-  // Parse until the end of stream/unsupported stream/error in stream is
-  // found.
-  while (true) {
-    media::H264NALU nalu;
-    media::H264Parser::Result res = parser.AdvanceToNextNALU(&nalu);
-    if (res != media::H264Parser::kOk) break;
-
-    switch (nalu.nal_unit_type) {
-      case media::H264NALU::kIDRSlice:
-      case media::H264NALU::kNonIDRSlice: {
-        media::H264SliceHeader shdr;
-        res = parser.ParseSliceHeader(nalu, &shdr);
-        break;
-      }
-
-      case media::H264NALU::kSPS: {
-        int id;
-        res = parser.ParseSPS(&id);
-        if (res != media::H264Parser::kOk) break;
-        const media::H264SPS* sps = parser.GetSPS(id);
-        if (!sps) break;
-        // Also test the SPS helper methods. We make sure that the results are
-        // used so that the calls are not optimized away.
-        base::Optional<math::Size> coded_size = sps->GetCodedSize();
-        volatile_sink = coded_size.value_or(math::Size()).ToString().length();
-        base::Optional<math::Rect> visible_rect = sps->GetVisibleRect();
-        volatile_sink = visible_rect.value_or(math::Rect()).ToString().length();
-        break;
-      }
-
-      case media::H264NALU::kPPS: {
-        int id;
-        res = parser.ParsePPS(&id);
-        break;
-      }
-
-      case media::H264NALU::kSEIMessage: {
-        media::H264SEIMessage sei_msg;
-        res = parser.ParseSEI(&sei_msg);
-        break;
-      }
-
-      default:
-        // Skip any other NALU.
-        break;
-    }
-    if (res != media::H264Parser::kOk) break;
-  }
-
-  return 0;
-}
diff --git a/cobalt/media/filters/h264_parser_unittest.cc b/cobalt/media/filters/h264_parser_unittest.cc
deleted file mode 100644
index 20ae2c5..0000000
--- a/cobalt/media/filters/h264_parser_unittest.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 <limits>
-#include <memory>
-
-#include "base/command_line.h"
-#include "base/files/memory_mapped_file.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/optional.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class H264SPSTest : public ::testing::Test {
- public:
-  // An exact clone of an SPS from Big Buck Bunny 480p.
-  std::unique_ptr<H264SPS> MakeSPS_BBB480p() {
-    std::unique_ptr<H264SPS> sps = base::MakeUnique<H264SPS>();
-    sps->profile_idc = 100;
-    sps->level_idc = 30;
-    sps->chroma_format_idc = 1;
-    sps->log2_max_pic_order_cnt_lsb_minus4 = 2;
-    sps->max_num_ref_frames = 5;
-    sps->pic_width_in_mbs_minus1 = 52;
-    sps->pic_height_in_map_units_minus1 = 29;
-    sps->frame_mbs_only_flag = true;
-    sps->direct_8x8_inference_flag = true;
-    sps->vui_parameters_present_flag = true;
-    sps->timing_info_present_flag = true;
-    sps->num_units_in_tick = 1;
-    sps->time_scale = 48;
-    sps->fixed_frame_rate_flag = true;
-    sps->bitstream_restriction_flag = true;
-    // These next three fields are not part of our SPS struct yet.
-    // sps->motion_vectors_over_pic_boundaries_flag = true;
-    // sps->log2_max_mv_length_horizontal = 10;
-    // sps->log2_max_mv_length_vertical = 10;
-    sps->max_num_reorder_frames = 2;
-    sps->max_dec_frame_buffering = 5;
-
-    // Computed field, matches |chroma_format_idc| in this case.
-    // TODO(sandersd): Extract that computation from the parsing step.
-    sps->chroma_array_type = 1;
-
-    return sps;
-  }
-};
-
-TEST_F(H264SPSTest, GetCodedSize) {
-  std::unique_ptr<H264SPS> sps = MakeSPS_BBB480p();
-  EXPECT_EQ(math::Size(848, 480), sps->GetCodedSize());
-
-  // Overflow.
-  sps->pic_width_in_mbs_minus1 = std::numeric_limits<int>::max();
-  EXPECT_EQ(base::nullopt, sps->GetCodedSize());
-}
-
-TEST_F(H264SPSTest, GetVisibleRect) {
-  std::unique_ptr<H264SPS> sps = MakeSPS_BBB480p();
-  EXPECT_EQ(math::Rect(0, 0, 848, 480), sps->GetVisibleRect());
-
-  // Add some cropping.
-  sps->frame_cropping_flag = true;
-  sps->frame_crop_left_offset = 1;
-  sps->frame_crop_right_offset = 2;
-  sps->frame_crop_top_offset = 3;
-  sps->frame_crop_bottom_offset = 4;
-  EXPECT_EQ(math::Rect(2, 6, 848 - 6, 480 - 14), sps->GetVisibleRect());
-
-  // Not quite invalid.
-  sps->frame_crop_left_offset = 422;
-  sps->frame_crop_right_offset = 1;
-  sps->frame_crop_top_offset = 0;
-  sps->frame_crop_bottom_offset = 0;
-  EXPECT_EQ(math::Rect(844, 0, 2, 480), sps->GetVisibleRect());
-
-  // Invalid crop.
-  sps->frame_crop_left_offset = 423;
-  sps->frame_crop_right_offset = 1;
-  sps->frame_crop_top_offset = 0;
-  sps->frame_crop_bottom_offset = 0;
-  EXPECT_EQ(base::nullopt, sps->GetVisibleRect());
-
-  // Overflow.
-  sps->frame_crop_left_offset = std::numeric_limits<int>::max() / 2 + 1;
-  sps->frame_crop_right_offset = 0;
-  sps->frame_crop_top_offset = 0;
-  sps->frame_crop_bottom_offset = 0;
-  EXPECT_EQ(base::nullopt, sps->GetVisibleRect());
-}
-
-TEST(H264ParserTest, StreamFileParsing) {
-  base::FilePath file_path = GetTestDataFilePath("test-25fps.h264");
-  // Number of NALUs in the test stream to be parsed.
-  int num_nalus = 759;
-
-  base::MemoryMappedFile stream;
-  ASSERT_TRUE(stream.Initialize(file_path))
-      << "Couldn't open stream file: " << file_path.MaybeAsASCII();
-
-  H264Parser parser;
-  parser.SetStream(stream.data(), stream.length());
-
-  // Parse until the end of stream/unsupported stream/error in stream is found.
-  int num_parsed_nalus = 0;
-  while (true) {
-    media::H264SliceHeader shdr;
-    media::H264SEIMessage sei_msg;
-    H264NALU nalu;
-    H264Parser::Result res = parser.AdvanceToNextNALU(&nalu);
-    if (res == H264Parser::kEOStream) {
-      DVLOG(1) << "Number of successfully parsed NALUs before EOS: "
-               << num_parsed_nalus;
-      ASSERT_EQ(num_nalus, num_parsed_nalus);
-      return;
-    }
-    ASSERT_EQ(res, H264Parser::kOk);
-
-    ++num_parsed_nalus;
-
-    int id;
-    switch (nalu.nal_unit_type) {
-      case H264NALU::kIDRSlice:
-      case H264NALU::kNonIDRSlice:
-        ASSERT_EQ(parser.ParseSliceHeader(nalu, &shdr), H264Parser::kOk);
-        break;
-
-      case H264NALU::kSPS:
-        ASSERT_EQ(parser.ParseSPS(&id), H264Parser::kOk);
-        break;
-
-      case H264NALU::kPPS:
-        ASSERT_EQ(parser.ParsePPS(&id), H264Parser::kOk);
-        break;
-
-      case H264NALU::kSEIMessage:
-        ASSERT_EQ(parser.ParseSEI(&sei_msg), H264Parser::kOk);
-        break;
-
-      default:
-        // Skip unsupported NALU.
-        DVLOG(4) << "Skipping unsupported NALU";
-        break;
-    }
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h264_to_annex_b_bitstream_converter.cc b/cobalt/media/filters/h264_to_annex_b_bitstream_converter.cc
deleted file mode 100644
index 0d98421..0000000
--- a/cobalt/media/filters/h264_to_annex_b_bitstream_converter.cc
+++ /dev/null
@@ -1,282 +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 "cobalt/media/filters/h264_to_annex_b_bitstream_converter.h"
-
-#include "base/logging.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-static const uint8_t kStartCodePrefix[3] = {0, 0, 1};
-static const uint32_t kParamSetStartCodeSize = 1 + sizeof(kStartCodePrefix);
-
-// Helper function which determines whether NAL unit of given type marks
-// access unit boundary.
-static bool IsAccessUnitBoundaryNal(int nal_unit_type) {
-  // Check if this packet marks access unit boundary by checking the
-  // packet type.
-  if (nal_unit_type == 6 ||  // Supplemental enhancement information
-      nal_unit_type == 7 ||  // Picture parameter set
-      nal_unit_type == 8 ||  // Sequence parameter set
-      nal_unit_type == 9 ||  // Access unit delimiter
-      (nal_unit_type >= 14 && nal_unit_type <= 18)) {  // Reserved types
-    return true;
-  }
-  return false;
-}
-
-H264ToAnnexBBitstreamConverter::H264ToAnnexBBitstreamConverter()
-    : configuration_processed_(false),
-      first_nal_unit_in_access_unit_(true),
-      nal_unit_length_field_width_(0) {}
-
-H264ToAnnexBBitstreamConverter::~H264ToAnnexBBitstreamConverter() {}
-
-bool H264ToAnnexBBitstreamConverter::ParseConfiguration(
-    const uint8_t* configuration_record, int configuration_record_size,
-    mp4::AVCDecoderConfigurationRecord* avc_config) {
-  DCHECK(configuration_record);
-  DCHECK_GT(configuration_record_size, 0);
-  DCHECK(avc_config);
-
-  if (!avc_config->Parse(configuration_record, configuration_record_size))
-    return false;  // Error: invalid input
-
-  // We're done processing the AVCDecoderConfigurationRecord,
-  // store the needed information for parsing actual payload
-  nal_unit_length_field_width_ = avc_config->length_size;
-  configuration_processed_ = true;
-  return true;
-}
-
-uint32_t H264ToAnnexBBitstreamConverter::GetConfigSize(
-    const mp4::AVCDecoderConfigurationRecord& avc_config) const {
-  uint32_t config_size = 0;
-
-  for (size_t i = 0; i < avc_config.sps_list.size(); ++i)
-    config_size += kParamSetStartCodeSize + avc_config.sps_list[i].size();
-
-  for (size_t i = 0; i < avc_config.pps_list.size(); ++i)
-    config_size += kParamSetStartCodeSize + avc_config.pps_list[i].size();
-
-  return config_size;
-}
-
-uint32_t H264ToAnnexBBitstreamConverter::CalculateNeededOutputBufferSize(
-    const uint8_t* input, uint32_t input_size,
-    const mp4::AVCDecoderConfigurationRecord* avc_config) const {
-  uint32_t output_size = 0;
-  uint32_t data_left = input_size;
-  bool first_nal_in_this_access_unit = first_nal_unit_in_access_unit_;
-
-  if (input_size == 0) return 0;  // Error: invalid input data
-
-  if (!configuration_processed_) {
-    return 0;  // Error: configuration not handled, we don't know nal unit width
-  }
-
-  if (avc_config) output_size += GetConfigSize(*avc_config);
-
-  CHECK(nal_unit_length_field_width_ == 1 ||
-        nal_unit_length_field_width_ == 2 || nal_unit_length_field_width_ == 4);
-
-  // Then add the needed size for the actual packet
-  while (data_left > 0) {
-    if (data_left < nal_unit_length_field_width_) {
-      return 0;  // Error: not enough data for correct conversion.
-    }
-
-    // Read the next NAL unit length from the input buffer
-    uint8_t size_of_len_field;
-    uint32_t nal_unit_length;
-    for (nal_unit_length = 0, size_of_len_field = nal_unit_length_field_width_;
-         size_of_len_field > 0; input++, size_of_len_field--, data_left--) {
-      nal_unit_length <<= 8;
-      nal_unit_length |= *input;
-    }
-
-    if (nal_unit_length == 0) {
-      break;  // Signifies that no more data left in the buffer
-    } else if (nal_unit_length > data_left) {
-      return 0;  // Error: Not enough data for correct conversion
-    }
-    data_left -= nal_unit_length;
-
-    // five least significant bits of first NAL unit byte signify nal_unit_type
-    int nal_unit_type = *input & 0x1F;
-    if (first_nal_in_this_access_unit ||
-        IsAccessUnitBoundaryNal(nal_unit_type)) {
-      output_size += 1;  // Extra zero_byte for these nal units
-      first_nal_in_this_access_unit = false;
-    }
-    // Start code prefix
-    output_size += sizeof(kStartCodePrefix);
-    // Actual NAL unit size
-    output_size += nal_unit_length;
-    input += nal_unit_length;
-    // No need for trailing zero bits
-  }
-  return output_size;
-}
-
-bool H264ToAnnexBBitstreamConverter::ConvertAVCDecoderConfigToByteStream(
-    const mp4::AVCDecoderConfigurationRecord& avc_config, uint8_t* output,
-    uint32_t* output_size) {
-  uint8_t* out = output;
-  uint32_t out_size = *output_size;
-  *output_size = 0;
-  for (size_t i = 0; i < avc_config.sps_list.size(); ++i) {
-    if (!WriteParamSet(avc_config.sps_list[i], &out, &out_size)) return false;
-  }
-
-  for (size_t i = 0; i < avc_config.pps_list.size(); ++i) {
-    if (!WriteParamSet(avc_config.pps_list[i], &out, &out_size)) return false;
-  }
-
-  nal_unit_length_field_width_ = avc_config.length_size;
-  configuration_processed_ = true;
-  *output_size = out - output;
-  return true;
-}
-
-bool H264ToAnnexBBitstreamConverter::ConvertNalUnitStreamToByteStream(
-    const uint8_t* input, uint32_t input_size,
-    const mp4::AVCDecoderConfigurationRecord* avc_config, uint8_t* output,
-    uint32_t* output_size) {
-  const uint8_t* inscan = input;  // We read the input from here progressively
-  uint8_t* outscan = output;      // We write the output to here progressively
-  uint32_t data_left = input_size;
-
-  if (input_size == 0 || *output_size == 0) {
-    *output_size = 0;
-    return false;  // Error: invalid input
-  }
-
-  // NAL unit width should be known at this point
-  CHECK(nal_unit_length_field_width_ == 1 ||
-        nal_unit_length_field_width_ == 2 || nal_unit_length_field_width_ == 4);
-
-  // Do the actual conversion for the actual input packet
-  int nal_unit_count = 0;
-  while (data_left > 0) {
-    uint8_t i;
-    uint32_t nal_unit_length;
-
-    // Read the next NAL unit length from the input buffer by scanning
-    // the input stream with the specific length field width
-    for (nal_unit_length = 0, i = nal_unit_length_field_width_;
-         i > 0 && data_left > 0; inscan++, i--, data_left--) {
-      nal_unit_length <<= 8;
-      nal_unit_length |= *inscan;
-    }
-
-    if (nal_unit_length == 0) {
-      break;  // Successful conversion, end of buffer
-    } else if (nal_unit_length > data_left) {
-      *output_size = 0;
-      return false;  // Error: not enough data for correct conversion
-    }
-
-    // Five least significant bits of first NAL unit byte signify
-    // nal_unit_type.
-    int nal_unit_type = *inscan & 0x1F;
-    nal_unit_count++;
-
-    // Insert the config after the AUD if an AUD is the first NAL unit or
-    // before all NAL units if the first one isn't an AUD.
-    if (avc_config && (nal_unit_type != H264NALU::kAUD || nal_unit_count > 1)) {
-      uint32_t output_bytes_used = outscan - output;
-
-      DCHECK_GE(*output_size, output_bytes_used);
-
-      uint32_t config_size = *output_size - output_bytes_used;
-      if (!ConvertAVCDecoderConfigToByteStream(*avc_config, outscan,
-                                               &config_size)) {
-        DVLOG(1) << "Failed to insert parameter sets.";
-        *output_size = 0;
-        return false;  // Failed to convert the buffer.
-      }
-      outscan += config_size;
-      avc_config = NULL;
-    }
-    uint32_t start_code_len;
-    first_nal_unit_in_access_unit_
-        ? start_code_len = sizeof(kStartCodePrefix) + 1
-        : start_code_len = sizeof(kStartCodePrefix);
-    if (static_cast<uint32_t>(outscan - output) + start_code_len +
-            nal_unit_length >
-        *output_size) {
-      *output_size = 0;
-      return false;  // Error: too small output buffer
-    }
-
-    // Check if this packet marks access unit boundary by checking the
-    // packet type.
-    if (IsAccessUnitBoundaryNal(nal_unit_type)) {
-      first_nal_unit_in_access_unit_ = true;
-    }
-
-    // Write extra zero-byte before start code prefix if this packet
-    // signals next access unit.
-    if (first_nal_unit_in_access_unit_) {
-      *outscan = 0;
-      outscan++;
-      first_nal_unit_in_access_unit_ = false;
-    }
-
-    // No need to write leading zero bits.
-    // Write start-code prefix.
-    memcpy(outscan, kStartCodePrefix, sizeof(kStartCodePrefix));
-    outscan += sizeof(kStartCodePrefix);
-    // Then write the actual NAL unit from the input buffer.
-    memcpy(outscan, inscan, nal_unit_length);
-    inscan += nal_unit_length;
-    data_left -= nal_unit_length;
-    outscan += nal_unit_length;
-    // No need for trailing zero bits.
-  }
-  // Successful conversion, output the freshly allocated bitstream buffer.
-  *output_size = static_cast<uint32_t>(outscan - output);
-  return true;
-}
-
-bool H264ToAnnexBBitstreamConverter::WriteParamSet(
-    const std::vector<uint8_t>& param_set, uint8_t** out,
-    uint32_t* out_size) const {
-  // Strip trailing null bytes.
-  size_t size = param_set.size();
-  while (size && param_set[size - 1] == 0) size--;
-  if (!size) return false;
-
-  // Verify space.
-  uint32_t bytes_left = *out_size;
-  if (bytes_left < kParamSetStartCodeSize ||
-      bytes_left - kParamSetStartCodeSize < size) {
-    return false;
-  }
-
-  uint8_t* start = *out;
-  uint8_t* buf = start;
-
-  // Write the 4 byte Annex B start code.
-  *buf++ = 0;  // zero byte
-  memcpy(buf, kStartCodePrefix, sizeof(kStartCodePrefix));
-  buf += sizeof(kStartCodePrefix);
-
-  // Copy the data.
-  memcpy(buf, &param_set[0], size);
-  buf += size;
-
-  *out = buf;
-  *out_size -= buf - start;
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h264_to_annex_b_bitstream_converter.h b/cobalt/media/filters/h264_to_annex_b_bitstream_converter.h
deleted file mode 100644
index de803cf..0000000
--- a/cobalt/media/filters/h264_to_annex_b_bitstream_converter.h
+++ /dev/null
@@ -1,151 +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 COBALT_MEDIA_FILTERS_H264_TO_ANNEX_B_BITSTREAM_CONVERTER_H_
-#define COBALT_MEDIA_FILTERS_H264_TO_ANNEX_B_BITSTREAM_CONVERTER_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-namespace mp4 {
-struct AVCDecoderConfigurationRecord;
-}
-
-// H264ToAnnexBBitstreamConverter is a class to convert H.264 bitstream from
-// MP4 format (as specified in ISO/IEC 14496-15) into H.264 bytestream
-// (as specified in ISO/IEC 14496-10 Annex B).
-class MEDIA_EXPORT H264ToAnnexBBitstreamConverter {
- public:
-  H264ToAnnexBBitstreamConverter();
-  ~H264ToAnnexBBitstreamConverter();
-
-  // Parses the global AVCDecoderConfigurationRecord from the file format's
-  // headers. Converter will remember the field length from the configuration
-  // headers after this.
-  //
-  // Parameters
-  //   configuration_record
-  //     Pointer to buffer containing AVCDecoderConfigurationRecord.
-  //   configuration_record_size
-  //     Size of the buffer in bytes.
-  //   avc_config
-  //     Pointer to place the parsed AVCDecoderConfigurationRecord data into.
-  //
-  // Returns
-  //   Returns true if |configuration_record| was successfully parsed. False
-  //   is returned if a parsing error occurred.
-  //   |avc_config| only contains valid data when true is returned.
-  bool ParseConfiguration(const uint8_t* configuration_record,
-                          int configuration_record_size,
-                          mp4::AVCDecoderConfigurationRecord* avc_config);
-
-  // Returns the buffer size needed to store the parameter sets in |avc_config|
-  // in Annex B form.
-  uint32_t GetConfigSize(
-      const mp4::AVCDecoderConfigurationRecord& avc_config) const;
-
-  // Calculates needed buffer size for the bitstream converted into bytestream.
-  // Lightweight implementation that does not do the actual conversion.
-  //
-  // Parameters
-  //   input
-  //     Pointer to buffer containing NAL units in MP4 format.
-  //   input_size
-  //     Size of the buffer in bytes.
-  //   avc_config
-  //     The AVCDecoderConfigurationRecord that contains the parameter sets that
-  //     will be inserted into the output. NULL if no parameter sets need to be
-  //     inserted.
-  //
-  // Returns
-  //   Required buffer size for the output NAL unit buffer when converted
-  //   to bytestream format, or 0 if could not determine the size of
-  //   the output buffer from the data in |input| and |avc_config|.
-  uint32_t CalculateNeededOutputBufferSize(
-      const uint8_t* input, uint32_t input_size,
-      const mp4::AVCDecoderConfigurationRecord* avc_config) const;
-
-  // ConvertAVCDecoderConfigToByteStream converts the
-  // AVCDecoderConfigurationRecord from the MP4 headers to bytestream format.
-  // Client is responsible for making sure the output buffer is large enough
-  // to hold the output data. Client can precalculate the needed output buffer
-  // size by using GetConfigSize().
-  //
-  // Parameters
-  //   avc_config
-  //     The AVCDecoderConfigurationRecord that contains the parameter sets that
-  //     will be written to |output|.
-  //   output
-  //     Pointer to buffer where the output should be written to.
-  //   output_size (i/o)
-  //     Pointer to the size of the output buffer. Will contain the number of
-  //     bytes written to output after successful call.
-  //
-  // Returns
-  //    true  if successful conversion|
-  //    false if conversion not successful (|output_size| will hold the amount
-  //          of converted data)
-  bool ConvertAVCDecoderConfigToByteStream(
-      const mp4::AVCDecoderConfigurationRecord& avc_config, uint8_t* output,
-      uint32_t* output_size);
-
-  // ConvertNalUnitStreamToByteStream converts the NAL unit from MP4 format
-  // to bytestream format. Client is responsible for making sure the output
-  // buffer is large enough to hold the output data. Client can precalculate the
-  // needed output buffer size by using CalculateNeededOutputBufferSize.
-  //
-  // Parameters
-  //   input
-  //     Pointer to buffer containing NAL units in MP4 format.
-  //   input_size
-  //     Size of the buffer in bytes.
-  //   avc_config
-  //     The AVCDecoderConfigurationRecord that contains the parameter sets to
-  //     insert into the output. NULL if no parameter sets need to be inserted.
-  //   output
-  //     Pointer to buffer where the output should be written to.
-  //   output_size (i/o)
-  //     Pointer to the size of the output buffer. Will contain the number of
-  //     bytes written to output after successful call.
-  //
-  // Returns
-  //    true  if successful conversion
-  //    false if conversion not successful (output_size will hold the amount
-  //          of converted data)
-  bool ConvertNalUnitStreamToByteStream(
-      const uint8_t* input, uint32_t input_size,
-      const mp4::AVCDecoderConfigurationRecord* avc_config, uint8_t* output,
-      uint32_t* output_size);
-
- private:
-  // Writes Annex B start code and |param_set| to |*out|.
-  //  |*out| - Is the memory location to write the parameter set.
-  //  |*out_size| - Number of bytes available for the parameter set.
-  // Returns true if the start code and param set were successfully
-  // written. On a successful write, |*out| is updated to point to the first
-  // byte after the data that was written. |*out_size| is updated to reflect
-  // the new number of bytes left in |*out|.
-  bool WriteParamSet(const std::vector<uint8_t>& param_set, uint8_t** out,
-                     uint32_t* out_size) const;
-
-  // Flag for indicating whether global parameter sets have been processed.
-  bool configuration_processed_;
-  // Flag for indicating whether next NAL unit starts new access unit.
-  bool first_nal_unit_in_access_unit_;
-  // Variable to hold interleaving field's length in bytes.
-  uint8_t nal_unit_length_field_width_;
-
-  DISALLOW_COPY_AND_ASSIGN(H264ToAnnexBBitstreamConverter);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_H264_TO_ANNEX_B_BITSTREAM_CONVERTER_H_
diff --git a/cobalt/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc b/cobalt/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc
deleted file mode 100644
index f678d74..0000000
--- a/cobalt/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc
+++ /dev/null
@@ -1,475 +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 "cobalt/media/filters/h264_to_annex_b_bitstream_converter.h"
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class H264ToAnnexBBitstreamConverterTest : public testing::Test {
- protected:
-  H264ToAnnexBBitstreamConverterTest() {}
-
-  ~H264ToAnnexBBitstreamConverterTest() override {}
-
- protected:
-  mp4::AVCDecoderConfigurationRecord avc_config_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(H264ToAnnexBBitstreamConverterTest);
-};
-
-static const uint8_t kHeaderDataOkWithFieldLen4[] = {
-    0x01, 0x42, 0x00, 0x28, 0xFF, 0xE1, 0x00, 0x08, 0x67, 0x42, 0x00, 0x28,
-    0xE9, 0x05, 0x89, 0xC8, 0x01, 0x00, 0x04, 0x68, 0xCE, 0x06, 0xF2, 0x00};
-
-static const uint8_t kPacketDataOkWithFieldLen4[] = {
-    0x00, 0x00, 0x0B, 0xF7, 0x65, 0xB8, 0x40, 0x57, 0x0B, 0xF0, 0xDF, 0xF8,
-    0x00, 0x1F, 0x78, 0x98, 0x54, 0xAC, 0xF2, 0x00, 0x04, 0x9D, 0x26, 0xE0,
-    0x3B, 0x5C, 0x00, 0x0A, 0x00, 0x8F, 0x9E, 0x86, 0x63, 0x1B, 0x46, 0xE7,
-    0xD6, 0x45, 0x88, 0x88, 0xEA, 0x10, 0x89, 0x79, 0x01, 0x34, 0x30, 0x01,
-    0x8E, 0x7D, 0x1A, 0x39, 0x45, 0x4E, 0x69, 0x86, 0x12, 0xF2, 0xE7, 0xCF,
-    0x50, 0xF8, 0x26, 0x54, 0x17, 0xBE, 0x3F, 0xC4, 0x80, 0x32, 0xD8, 0x02,
-    0x32, 0xE4, 0xAE, 0xDD, 0x39, 0x11, 0x8E, 0x54, 0x42, 0xAE, 0xBD, 0x12,
-    0xA4, 0xCE, 0xE2, 0x98, 0x91, 0x05, 0xC4, 0xA8, 0x20, 0xC7, 0xB3, 0xD9,
-    0x47, 0x73, 0x09, 0xD5, 0xCF, 0x62, 0x57, 0x3F, 0xFF, 0xFD, 0xB9, 0x94,
-    0x2B, 0x3D, 0x12, 0x1A, 0x84, 0x0B, 0x28, 0xAD, 0x5C, 0x9E, 0x5C, 0xC3,
-    0xBB, 0xBD, 0x7F, 0xFE, 0x09, 0x87, 0x74, 0x39, 0x1C, 0xA5, 0x0E, 0x44,
-    0xD8, 0x5D, 0x41, 0xDB, 0xAA, 0xBC, 0x05, 0x16, 0xA3, 0x98, 0xEE, 0xEE,
-    0x9C, 0xA0, 0xF1, 0x23, 0x90, 0xF0, 0x5E, 0x9F, 0xF4, 0xFA, 0x7F, 0x4B,
-    0x69, 0x66, 0x49, 0x52, 0xDD, 0xD6, 0xC0, 0x0F, 0x8C, 0x6E, 0x80, 0xDD,
-    0x7A, 0xDF, 0x10, 0xCD, 0x4B, 0x54, 0x6F, 0xFC, 0x7D, 0x34, 0xBA, 0x8B,
-    0xD4, 0xD9, 0x30, 0x18, 0x9F, 0x39, 0x04, 0x9F, 0xCB, 0xDB, 0x1B, 0xA7,
-    0x70, 0x96, 0xAF, 0xFF, 0x6F, 0xB5, 0xBF, 0x58, 0x01, 0x98, 0xCD, 0xF2,
-    0x66, 0x28, 0x1A, 0xC4, 0x9E, 0x58, 0x40, 0x39, 0xAE, 0x07, 0x11, 0x3F,
-    0xF2, 0x9B, 0x06, 0x9C, 0xB8, 0xC9, 0x16, 0x12, 0x09, 0x8E, 0xD2, 0xD4,
-    0xF5, 0xC6, 0x77, 0x40, 0x0F, 0xFD, 0x12, 0x19, 0x55, 0x1A, 0x8E, 0x9C,
-    0x18, 0x8B, 0x0D, 0x18, 0xFA, 0xBA, 0x7F, 0xBB, 0x83, 0xBB, 0x85, 0xA0,
-    0xCC, 0xAF, 0xF6, 0xEA, 0x81, 0x10, 0x18, 0x8E, 0x10, 0x00, 0xCB, 0x7F,
-    0x27, 0x08, 0x06, 0xDE, 0x3C, 0x20, 0xE5, 0xFE, 0xCC, 0x4F, 0xB3, 0x41,
-    0xE0, 0xCC, 0x4C, 0x26, 0xC1, 0xC0, 0x2C, 0x16, 0x12, 0xAA, 0x04, 0x83,
-    0x51, 0x4E, 0xCA, 0x00, 0xCF, 0x42, 0x9C, 0x06, 0x2D, 0x06, 0xDD, 0x1D,
-    0x08, 0x75, 0xE0, 0x89, 0xC7, 0x62, 0x68, 0x2E, 0xBF, 0x4D, 0x2D, 0x0A,
-    0xC4, 0x86, 0xF6, 0x2F, 0xA1, 0x49, 0xA7, 0x0F, 0xDB, 0x1F, 0x82, 0xEC,
-    0xC1, 0x62, 0xFB, 0x7F, 0xF1, 0xAE, 0xA6, 0x1A, 0xD5, 0x6B, 0x06, 0x5E,
-    0xB6, 0x02, 0x50, 0xAE, 0x2D, 0xF9, 0xD9, 0x95, 0xAD, 0x01, 0x8C, 0x53,
-    0x01, 0xAF, 0xCE, 0xE5, 0xA5, 0xBB, 0x95, 0x8A, 0x85, 0x70, 0x77, 0xE3,
-    0x9A, 0x68, 0x1B, 0xDF, 0x47, 0xF9, 0xF4, 0xBD, 0x80, 0x7D, 0x76, 0x9A,
-    0x69, 0xFC, 0xBE, 0x14, 0x0D, 0x87, 0x09, 0x12, 0x98, 0x20, 0x05, 0x46,
-    0xB7, 0xAE, 0x10, 0xB7, 0x01, 0xB7, 0xDE, 0x3B, 0xDD, 0x7A, 0x8A, 0x55,
-    0x73, 0xAD, 0xDF, 0x69, 0xDE, 0xD0, 0x51, 0x97, 0xA0, 0xE6, 0x5E, 0xBA,
-    0xBA, 0x80, 0x0F, 0x4E, 0x9A, 0x68, 0x36, 0xE6, 0x9F, 0x5B, 0x39, 0xC0,
-    0x90, 0xA1, 0xC0, 0xC3, 0x82, 0xE4, 0x50, 0xEA, 0x60, 0x7A, 0xDD, 0x5F,
-    0x8B, 0x5F, 0xAF, 0xFC, 0x74, 0xAF, 0xDC, 0x56, 0xF7, 0x2E, 0x3E, 0x97,
-    0x6E, 0x2B, 0xF3, 0xAF, 0xFE, 0x7D, 0x32, 0xDC, 0x56, 0xF8, 0xAF, 0xB5,
-    0xA3, 0xBB, 0x00, 0x5B, 0x84, 0x3D, 0x9F, 0x0B, 0x40, 0x88, 0x61, 0x5F,
-    0x4F, 0x4F, 0xB0, 0xB3, 0x07, 0x81, 0x3E, 0xF2, 0xFB, 0x50, 0xCA, 0x77,
-    0x40, 0x12, 0xA8, 0xE6, 0x11, 0x8E, 0xD6, 0x8A, 0xC6, 0xD6, 0x8C, 0x1D,
-    0x63, 0x55, 0x3D, 0x34, 0xEA, 0xC3, 0xC6, 0x6A, 0xD2, 0x8C, 0xB0, 0x1D,
-    0x5E, 0x4A, 0x7A, 0x8B, 0xD5, 0x99, 0x80, 0x84, 0x32, 0xFB, 0xB7, 0x02,
-    0x6E, 0x61, 0xFE, 0xAC, 0x1B, 0x5D, 0x10, 0x23, 0x24, 0xC3, 0x8C, 0x7B,
-    0x58, 0x2C, 0x4D, 0x04, 0x74, 0x84, 0x25, 0x10, 0x4E, 0x94, 0x29, 0x4D,
-    0x88, 0xAE, 0x65, 0x53, 0xB9, 0x95, 0x4E, 0xE7, 0xDD, 0xEE, 0xF2, 0x70,
-    0x1F, 0x26, 0x4F, 0xA8, 0xBC, 0x3D, 0x35, 0x02, 0x3B, 0xC0, 0x98, 0x70,
-    0x38, 0x18, 0xE5, 0x1E, 0x05, 0xAC, 0x28, 0xAA, 0x46, 0x1A, 0xB0, 0x19,
-    0x99, 0x18, 0x35, 0x78, 0x1E, 0x41, 0x60, 0x0D, 0x4F, 0x7E, 0xEC, 0x37,
-    0xC3, 0x30, 0x73, 0x2A, 0x69, 0xFE, 0xEF, 0x27, 0xEE, 0x13, 0xCC, 0xD0,
-    0xDB, 0xE6, 0x45, 0xEC, 0x5C, 0xB5, 0x71, 0x54, 0x2E, 0xB1, 0xE9, 0x88,
-    0xB4, 0x3F, 0x6F, 0xFD, 0xF7, 0xFF, 0x9D, 0x2D, 0x52, 0x2E, 0xAE, 0xC9,
-    0x95, 0xDE, 0xBF, 0xDF, 0xFF, 0xBF, 0x21, 0xB3, 0x2B, 0xF5, 0xF7, 0xF7,
-    0xD1, 0xA0, 0xF0, 0x76, 0x68, 0x37, 0xDB, 0x8F, 0x85, 0x4D, 0xA8, 0x1A,
-    0xF9, 0x7F, 0x75, 0xA7, 0x93, 0xF5, 0x03, 0xC1, 0xF2, 0x60, 0x8A, 0x92,
-    0x53, 0xF5, 0xD1, 0xC1, 0x56, 0x4B, 0x68, 0x05, 0x16, 0x88, 0x61, 0xE7,
-    0x14, 0xC8, 0x0D, 0xF0, 0xDF, 0xEF, 0x46, 0x4A, 0xED, 0x0B, 0xD1, 0xD1,
-    0xD1, 0xA4, 0x85, 0xA3, 0x2C, 0x1D, 0xDE, 0x45, 0x14, 0xA1, 0x8E, 0xA8,
-    0xD9, 0x8C, 0xAB, 0x47, 0x31, 0xF1, 0x00, 0x15, 0xAD, 0x80, 0x20, 0xAA,
-    0xE4, 0x57, 0xF8, 0x05, 0x14, 0x58, 0x0B, 0xD3, 0x63, 0x00, 0x8F, 0x44,
-    0x15, 0x7F, 0x19, 0xC7, 0x0A, 0xE0, 0x49, 0x32, 0xFE, 0x36, 0x0E, 0xF3,
-    0x66, 0x10, 0x2B, 0x11, 0x73, 0x3D, 0x19, 0x92, 0x22, 0x20, 0x75, 0x1F,
-    0xF1, 0xDB, 0x96, 0x73, 0xCF, 0x1B, 0x53, 0xFF, 0xD2, 0x23, 0xF2, 0xB6,
-    0xAA, 0xB6, 0x44, 0xA3, 0x73, 0x7E, 0x00, 0x2D, 0x4D, 0x4D, 0x87, 0xE0,
-    0x84, 0x55, 0xD6, 0x03, 0xB8, 0xD8, 0x90, 0xEF, 0xC0, 0x76, 0x5D, 0x69,
-    0x02, 0x00, 0x0E, 0x17, 0xD0, 0x02, 0x96, 0x50, 0xEA, 0xAB, 0xBF, 0x0D,
-    0xAF, 0xCB, 0xD3, 0xFF, 0xAA, 0x9D, 0x7F, 0xD6, 0xBD, 0x2C, 0x14, 0xB4,
-    0xCD, 0x20, 0x73, 0xB4, 0xF4, 0x38, 0x96, 0xDE, 0xB0, 0x6B, 0xE5, 0x1B,
-    0xFD, 0x0E, 0x0B, 0xA4, 0x81, 0xBF, 0xC8, 0xA0, 0x21, 0x76, 0x7B, 0x25,
-    0x3F, 0xE6, 0x84, 0x40, 0x1A, 0xDA, 0x25, 0x5A, 0xFF, 0x73, 0x6B, 0x14,
-    0x1B, 0xF7, 0x08, 0xFA, 0x26, 0x73, 0x7A, 0x58, 0x02, 0x1A, 0xE6, 0x63,
-    0xB6, 0x45, 0x7B, 0xE3, 0xE0, 0x80, 0x14, 0x42, 0xA8, 0x7D, 0xF3, 0x80,
-    0x9B, 0x01, 0x43, 0x82, 0x82, 0x8C, 0xBE, 0x0D, 0xFD, 0xAE, 0x88, 0xA8,
-    0xB9, 0xC3, 0xEE, 0xFF, 0x46, 0x00, 0x84, 0xE6, 0xB4, 0x0C, 0xA9, 0x66,
-    0xC6, 0x74, 0x72, 0xAA, 0xA4, 0x3A, 0xB0, 0x1B, 0x06, 0xB4, 0xDB, 0xE8,
-    0xC2, 0x17, 0xA2, 0xBC, 0xBE, 0x5C, 0x0F, 0x2A, 0x76, 0xD5, 0xEE, 0x39,
-    0x36, 0x7C, 0x25, 0x94, 0x15, 0x3C, 0xC9, 0xB9, 0x93, 0x07, 0x19, 0xAF,
-    0xE6, 0x70, 0xC3, 0xF5, 0xD4, 0x17, 0x87, 0x57, 0x77, 0x7D, 0xCF, 0x0D,
-    0xDD, 0xDE, 0xB7, 0xFF, 0xB4, 0xDA, 0x20, 0x45, 0x1A, 0x45, 0xF4, 0x58,
-    0x01, 0xBC, 0xEB, 0x3F, 0x16, 0x7F, 0x4C, 0x15, 0x84, 0x8C, 0xE5, 0xF6,
-    0x96, 0xA6, 0xA1, 0xB9, 0xB2, 0x7F, 0x6B, 0xFF, 0x31, 0xF2, 0xF5, 0xC9,
-    0xFF, 0x61, 0xEE, 0xB5, 0x84, 0xAE, 0x68, 0x41, 0xEA, 0xD0, 0xF0, 0xA5,
-    0xCE, 0x0C, 0xE6, 0x4C, 0x6D, 0x6D, 0x94, 0x08, 0xC9, 0xA9, 0x4A, 0x60,
-    0x6D, 0x01, 0x3B, 0xEF, 0x4D, 0x99, 0x8D, 0x42, 0x2A, 0x6B, 0x8A, 0xC7,
-    0xFA, 0xA9, 0x90, 0x40, 0x00, 0x90, 0xF3, 0xA0, 0x75, 0x8E, 0xD5, 0xFE,
-    0xE7, 0xBD, 0x02, 0x87, 0x0C, 0x7D, 0xF0, 0xAF, 0x1E, 0x5F, 0x8D, 0xC8,
-    0xE1, 0xD4, 0x56, 0x08, 0xBF, 0x76, 0x80, 0xD4, 0x18, 0x89, 0x2D, 0x57,
-    0xDF, 0x66, 0xD0, 0x46, 0x68, 0x77, 0x55, 0x47, 0xF5, 0x7C, 0xF7, 0xA6,
-    0x66, 0xD6, 0x5A, 0x64, 0x55, 0xD4, 0x80, 0xC4, 0x55, 0xE9, 0x36, 0x3F,
-    0x5E, 0xE2, 0x5C, 0x7F, 0x5F, 0xCE, 0x7F, 0xE1, 0x0C, 0x82, 0x3D, 0x6B,
-    0x6E, 0xA2, 0xEA, 0x3B, 0x1F, 0xE8, 0x9E, 0xC7, 0x4E, 0x24, 0x3D, 0xDD,
-    0xFA, 0xEB, 0x71, 0xDF, 0xFE, 0x15, 0xFE, 0x41, 0x9B, 0xB4, 0x4E, 0xAB,
-    0x51, 0xE5, 0x1F, 0x7D, 0x2D, 0xAC, 0xD0, 0x66, 0xD9, 0xA1, 0x59, 0x78,
-    0xC6, 0xEF, 0xC4, 0x43, 0x08, 0x65, 0x18, 0x73, 0xDE, 0x2A, 0xAD, 0x72,
-    0xE7, 0x5A, 0x7E, 0x33, 0x04, 0x72, 0x38, 0x57, 0x47, 0x73, 0x10, 0x1D,
-    0x88, 0x57, 0x4C, 0xDF, 0xA7, 0x78, 0x16, 0xFB, 0x01, 0x21, 0x28, 0x2D,
-    0xB6, 0x7E, 0x05, 0x18, 0x32, 0x52, 0xC3, 0x49, 0x0B, 0x32, 0x18, 0x12,
-    0x93, 0x54, 0x15, 0x3B, 0xC8, 0x6D, 0x4A, 0x77, 0xEF, 0x0A, 0x46, 0x83,
-    0x89, 0x5C, 0x8B, 0xCB, 0x18, 0xA6, 0xDC, 0x97, 0x6F, 0xEE, 0xEE, 0x00,
-    0x6A, 0xF1, 0x10, 0xFE, 0x07, 0x0C, 0xE0, 0x53, 0xD2, 0xB8, 0x45, 0xF4,
-    0x6E, 0x16, 0x4B, 0xC9, 0x9C, 0xC7, 0x93, 0x83, 0x23, 0x1D, 0x4D, 0x00,
-    0xB9, 0x4F, 0x86, 0x51, 0xF0, 0x29, 0x69, 0x41, 0x21, 0xC5, 0x4A, 0xC6,
-    0x6D, 0xD1, 0x81, 0x38, 0xDB, 0x7C, 0x06, 0xA8, 0x26, 0x8E, 0x71, 0x00,
-    0x4C, 0x44, 0x14, 0x05, 0xF2, 0x1C, 0x00, 0x49, 0xFC, 0x29, 0x6A, 0xF9,
-    0x9E, 0xD1, 0x35, 0x4B, 0xB7, 0xE5, 0xDB, 0xFC, 0x01, 0x04, 0x3F, 0x70,
-    0x33, 0x56, 0x87, 0x69, 0x01, 0xB4, 0xCE, 0x1C, 0x4D, 0x2E, 0x83, 0x51,
-    0x51, 0xD0, 0x37, 0x3B, 0xB4, 0xBA, 0x47, 0xF5, 0xFF, 0xBF, 0xFA, 0xD5,
-    0x03, 0x65, 0xD3, 0x28, 0x9F, 0x38, 0x57, 0xFE, 0x71, 0xD8, 0x9C, 0x16,
-    0xEE, 0x72, 0x19, 0x03, 0x17, 0x6E, 0xC0, 0xEC, 0x49, 0x3D, 0x96, 0xE2,
-    0x30, 0x97, 0x97, 0x84, 0x38, 0x6B, 0xE8, 0x2E, 0xAB, 0x0E, 0x2E, 0x03,
-    0x52, 0xBA, 0x68, 0x55, 0xBA, 0x1D, 0x2C, 0x47, 0xAA, 0x72, 0xAE, 0x02,
-    0x31, 0x6E, 0xA1, 0xDC, 0xAD, 0x0F, 0x4A, 0x46, 0xC9, 0xF2, 0xA9, 0xAB,
-    0xFD, 0x87, 0x89, 0x5C, 0xB3, 0x75, 0x7E, 0xE3, 0xDE, 0x9F, 0xC4, 0x02,
-    0x1E, 0xA2, 0xF8, 0x8B, 0xD3, 0x00, 0x83, 0x96, 0xC4, 0xD0, 0xB9, 0x62,
-    0xB9, 0x69, 0xEC, 0x56, 0xDF, 0x7D, 0x91, 0x4B, 0x68, 0x27, 0xA8, 0x61,
-    0x78, 0xA7, 0x95, 0x66, 0x51, 0x41, 0xF6, 0xCE, 0x78, 0xD3, 0x9A, 0x91,
-    0xA0, 0x31, 0x09, 0x47, 0xB8, 0x47, 0xB8, 0x44, 0xE1, 0x13, 0x86, 0x7E,
-    0x92, 0x80, 0xC6, 0x1A, 0xF7, 0x79, 0x7E, 0xF1, 0x5D, 0x9F, 0x17, 0x2D,
-    0x80, 0x00, 0x79, 0x34, 0x7D, 0xE3, 0xAD, 0x60, 0x00, 0x20, 0x07, 0x80,
-    0x00, 0x40, 0x01, 0xF8, 0xA1, 0x86, 0xB1, 0xEE, 0x21, 0x63, 0x85, 0x60,
-    0x51, 0x84, 0x90, 0x7E, 0x92, 0x09, 0x39, 0x1C, 0x16, 0x87, 0x5C, 0xA6,
-    0x09, 0x90, 0x06, 0x34, 0x6E, 0xB8, 0x8D, 0x5D, 0xAC, 0x77, 0x97, 0xB5,
-    0x4D, 0x30, 0xFD, 0x39, 0xD0, 0x50, 0x00, 0xC9, 0x98, 0x04, 0x86, 0x00,
-    0x0D, 0xD8, 0x3E, 0x34, 0xC2, 0xA6, 0x25, 0xF8, 0x20, 0xCC, 0x6D, 0x9E,
-    0x63, 0x05, 0x30, 0xC4, 0xC6, 0xCC, 0x54, 0x31, 0x9F, 0x3C, 0xF5, 0x86,
-    0xB9, 0x08, 0x18, 0xC3, 0x1E, 0xB9, 0xA0, 0x0C, 0x45, 0x2C, 0x54, 0x32,
-    0x8B, 0x85, 0x86, 0x59, 0xC3, 0xB3, 0x50, 0x5A, 0xFE, 0xBA, 0xF7, 0x4D,
-    0xC9, 0x9C, 0x9E, 0x01, 0xDF, 0xD7, 0x6E, 0xB5, 0x15, 0x53, 0x08, 0x57,
-    0xA4, 0x71, 0x36, 0x80, 0x46, 0x05, 0x21, 0x48, 0x7B, 0x91, 0xC8, 0xAA,
-    0xFF, 0x07, 0x9F, 0x78, 0x68, 0xCF, 0x3C, 0xEF, 0xFF, 0xBC, 0xB6, 0xA2,
-    0x36, 0xB7, 0x9F, 0x54, 0xF6, 0x6F, 0x5D, 0xDD, 0x75, 0xD4, 0x3C, 0x75,
-    0xE8, 0xCF, 0x15, 0x02, 0x5B, 0x94, 0xC3, 0xA2, 0x41, 0x63, 0xA1, 0x14,
-    0xF6, 0xC0, 0x57, 0x15, 0x9F, 0x0C, 0x3F, 0x80, 0xF2, 0x98, 0xEE, 0x41,
-    0x85, 0xEE, 0xBC, 0xAA, 0xE9, 0x59, 0xAA, 0xA0, 0x92, 0xCA, 0x00, 0xF3,
-    0x50, 0xCC, 0xFF, 0xAD, 0x97, 0x69, 0xA7, 0xF2, 0x0B, 0x8F, 0xD7, 0xD7,
-    0x82, 0x3A, 0xBB, 0x98, 0x1D, 0xCB, 0x89, 0x0B, 0x9B, 0x05, 0xF7, 0xD0,
-    0x1A, 0x60, 0xF3, 0x29, 0x16, 0x12, 0xF8, 0xF4, 0xF1, 0x4A, 0x05, 0x9B,
-    0x57, 0x12, 0x7E, 0x3A, 0x4A, 0x8D, 0xA6, 0xDF, 0xB6, 0xDD, 0xDF, 0xC3,
-    0xF0, 0xD2, 0xD4, 0xD7, 0x41, 0xA6, 0x00, 0x76, 0x8C, 0x75, 0x08, 0xF0,
-    0x19, 0xD8, 0x14, 0x63, 0x55, 0x52, 0x18, 0x30, 0x98, 0xD0, 0x3F, 0x65,
-    0x52, 0xB3, 0x88, 0x6D, 0x17, 0x39, 0x93, 0xCA, 0x3B, 0xB4, 0x1D, 0x8D,
-    0xDF, 0xDF, 0xAD, 0x72, 0xDA, 0x74, 0xAF, 0xBD, 0x31, 0xF9, 0x12, 0x61,
-    0x45, 0x29, 0x4C, 0x2B, 0x61, 0xA1, 0x12, 0x90, 0x53, 0xE7, 0x5A, 0x9D,
-    0x44, 0xC8, 0x3A, 0x83, 0xDC, 0x34, 0x4C, 0x07, 0xAF, 0xDB, 0x90, 0xCD,
-    0x03, 0xA4, 0x64, 0x78, 0xBD, 0x55, 0xB2, 0x56, 0x59, 0x32, 0xAB, 0x13,
-    0x2C, 0xC9, 0x77, 0xF8, 0x3B, 0xDF, 0xFF, 0xAC, 0x07, 0xB9, 0x08, 0x7B,
-    0xE9, 0x82, 0xB9, 0x59, 0xC7, 0xFF, 0x86, 0x2C, 0x12, 0x7C, 0xC6, 0x65,
-    0x3C, 0x71, 0xB8, 0x98, 0x9F, 0xA2, 0x45, 0x03, 0xA5, 0xD9, 0xC3, 0xCF,
-    0xFA, 0xEB, 0x89, 0xAD, 0x03, 0xEE, 0xDD, 0x76, 0xD3, 0x4F, 0x10, 0x6F,
-    0xF0, 0xC1, 0x60, 0x0C, 0x00, 0xD4, 0x76, 0x12, 0x0A, 0x8D, 0xDC, 0xFD,
-    0x5E, 0x0B, 0x26, 0x2F, 0x01, 0x1D, 0xB9, 0xE7, 0x73, 0xD4, 0xF2, 0xCB,
-    0xD8, 0x78, 0x21, 0x52, 0x4B, 0x83, 0x3C, 0x44, 0x72, 0x0E, 0xB1, 0x4E,
-    0x37, 0xBC, 0xC7, 0x50, 0xFA, 0x07, 0x80, 0x71, 0x10, 0x0B, 0x24, 0xD1,
-    0x7E, 0xDA, 0x7F, 0xA7, 0x2F, 0x40, 0xAA, 0xD3, 0xF5, 0x44, 0x10, 0x56,
-    0x4E, 0x3B, 0xF1, 0x6E, 0x9A, 0xA0, 0xEA, 0x85, 0x66, 0x16, 0xFB, 0x5C,
-    0x0B, 0x2B, 0x74, 0x18, 0xAF, 0x3D, 0x04, 0x3E, 0xCE, 0x88, 0x9B, 0x3E,
-    0xF4, 0xB9, 0x00, 0x60, 0x0E, 0xE1, 0xE2, 0xCB, 0x12, 0xB9, 0x6D, 0x5A,
-    0xC7, 0x55, 0x1D, 0xB9, 0x79, 0xAC, 0x43, 0x43, 0xE6, 0x3B, 0xDD, 0x7E,
-    0x9F, 0x78, 0xD3, 0xEA, 0xA3, 0x11, 0xFF, 0xDB, 0xBB, 0xB8, 0x97, 0x37,
-    0x15, 0xDB, 0xF1, 0x97, 0x96, 0xC7, 0xFC, 0xE5, 0xBF, 0xF2, 0x86, 0xC0,
-    0xFA, 0x9B, 0x4C, 0x00, 0x04, 0x03, 0xA5, 0xB6, 0xB7, 0x9C, 0xD9, 0xAB,
-    0x09, 0x77, 0x51, 0x18, 0x3B, 0xAD, 0x61, 0x6C, 0xFC, 0x51, 0x96, 0xFB,
-    0x19, 0xC8, 0x52, 0x35, 0x07, 0x00, 0x63, 0x87, 0x14, 0x04, 0xFA, 0x7A,
-    0x48, 0x3E, 0x00, 0x47, 0x29, 0x07, 0x74, 0x97, 0x74, 0x84, 0xEB, 0xB2,
-    0x16, 0xB2, 0x31, 0x81, 0xCE, 0x2A, 0x31, 0xA7, 0xB1, 0xEB, 0x83, 0x34,
-    0x7A, 0x73, 0xD7, 0x2F, 0xFF, 0xBC, 0xFF, 0xE5, 0xAA, 0xF2, 0xB5, 0x6E,
-    0x9E, 0xA5, 0x70, 0x8A, 0x8C, 0xDF, 0x6A, 0x06, 0x16, 0xC1, 0xAB, 0x59,
-    0x70, 0xD9, 0x3D, 0x47, 0x7C, 0xDD, 0xEF, 0xDF, 0x2F, 0xFF, 0x42, 0x6B,
-    0xBA, 0x4B, 0xBF, 0xF8, 0x7F, 0xF2, 0x03, 0x0D, 0x79, 0xBC, 0x03, 0x76,
-    0x64, 0x1C, 0x0D, 0x7B, 0xD7, 0xBD, 0xB0, 0x6C, 0xD8, 0x61, 0x17, 0x17,
-    0x8C, 0xED, 0x4E, 0x20, 0xEB, 0x55, 0x33, 0x39, 0xE9, 0x7E, 0xBE, 0x8E,
-    0x05, 0x4B, 0x78, 0x96, 0x85, 0xCC, 0x68, 0xC9, 0x78, 0xAF, 0xAE, 0x44,
-    0x36, 0x61, 0xD3, 0x53, 0xEB, 0xB3, 0x3E, 0x4F, 0x97, 0xE2, 0x8D, 0xAE,
-    0x90, 0xED, 0xB5, 0x4F, 0x8E, 0xE4, 0x7A, 0x44, 0xCF, 0x9D, 0xC5, 0x77,
-    0x4D, 0xAB, 0x4F, 0xE5, 0xC5, 0x73, 0xA0, 0xC8, 0xA5, 0xBB, 0x4B, 0x7D,
-    0xD5, 0xFB, 0xFB, 0xFF, 0x61, 0xFD, 0xAA, 0x1A, 0x62, 0x7E, 0x3C, 0x66,
-    0x34, 0x15, 0x64, 0x25, 0xEC, 0x7C, 0x9D, 0x6A, 0x64, 0x4D, 0x80, 0xD5,
-    0x4F, 0xFE, 0x8E, 0xEE, 0x18, 0x53, 0xC1, 0x09, 0x51, 0xF7, 0xC0, 0xA6,
-    0xB2, 0x9B, 0x19, 0x2B, 0x14, 0x66, 0x66, 0x4B, 0x39, 0x62, 0x1D, 0x84,
-    0xB9, 0x02, 0x84, 0xAC, 0xC1, 0xDA, 0x6C, 0x80, 0xCD, 0x40, 0x20, 0x20,
-    0x19, 0x51, 0xDC, 0x2B, 0x7D, 0x5D, 0x7F, 0xE3, 0x86, 0x8E, 0xC3, 0x35,
-    0xFE, 0x5C, 0xF6, 0x1C, 0xFF, 0x05, 0x9E, 0xB5, 0xB6, 0xBB, 0xBE, 0xF7,
-    0x2F, 0xB7, 0xE1, 0xF5, 0x33, 0x86, 0xA0, 0x47, 0xDE, 0xF7, 0xE9, 0x3B,
-    0xBE, 0x7E, 0x9B, 0x17, 0xFC, 0xFD, 0x2E, 0x40, 0x86, 0x41, 0x75, 0xF1,
-    0xB2, 0x18, 0xA9, 0xDE, 0x2D, 0xD6, 0x04, 0x20, 0xA4, 0xBA, 0x81, 0xBC,
-    0x1D, 0x5A, 0xD6, 0xF7, 0xF6, 0xB8, 0x42, 0xF7, 0xF5, 0x3D, 0x97, 0xAC,
-    0xCD, 0x6F, 0xAD, 0xDB, 0x4F, 0x5A, 0x2E, 0x64, 0xB9, 0x5D, 0xDD, 0x8B,
-    0x4A, 0x35, 0x44, 0xFE, 0x3D, 0xC6, 0x77, 0x7A, 0xBF, 0xDA, 0xAC, 0x9E,
-    0xB0, 0xA2, 0xB9, 0x6C, 0xAF, 0x02, 0xDD, 0xF2, 0x71, 0x2B, 0xEF, 0xD3,
-    0x51, 0x0E, 0x07, 0x11, 0xBD, 0xED, 0x39, 0x7F, 0xD9, 0xB8, 0xBD, 0xEE,
-    0x35, 0xE9, 0x5C, 0x67, 0x42, 0xDA, 0x05, 0x6E, 0x39, 0xCE, 0x55, 0xFB,
-    0x26, 0xB7, 0x90, 0x4B, 0xDA, 0x91, 0x48, 0xFD, 0xDE, 0xB2, 0xEC, 0x88,
-    0x9A, 0x46, 0x1A, 0x4C, 0xD4, 0x05, 0x12, 0x85, 0x57, 0x37, 0x22, 0xD3,
-    0x0E, 0x4F, 0x79, 0xE3, 0x81, 0xA9, 0x2B, 0x5F, 0xD7, 0x6D, 0xBD, 0x21,
-    0x98, 0x6F, 0x7D, 0xF5, 0x32, 0x7A, 0x6E, 0xF8, 0x20, 0x01, 0x50, 0x90,
-    0x7A, 0x88, 0x3E, 0x0D, 0x57, 0xB1, 0x58, 0x65, 0xE6, 0x82, 0xCE, 0x08,
-    0x69, 0x8B, 0x87, 0x62, 0x36, 0xB1, 0x7B, 0xDE, 0x74, 0xBD, 0xFE, 0x10,
-    0xBE, 0x26, 0xAB, 0x7E, 0xB7, 0x8D, 0xF7, 0x83, 0x2E, 0x0F, 0xAF, 0x7E,
-    0xBC, 0x17, 0x31, 0xFF, 0xB0, 0x4F, 0x7F, 0x4B, 0x13, 0x83, 0xDF, 0xEE,
-    0x23, 0xD3, 0xE7, 0xC8, 0xAF, 0x75, 0xAB, 0xEA, 0xBD, 0x7D, 0xD2, 0x9D,
-    0xE9, 0xC1, 0x18, 0x8B, 0x7C, 0x9F, 0x51, 0xDC, 0x37, 0xA3, 0xDB, 0xFC,
-    0xD4, 0x6A, 0x91, 0x44, 0x7F, 0x72, 0xC5, 0xD9, 0xC8, 0x37, 0x38, 0x63,
-    0x0D, 0x59, 0x8B, 0x7F, 0x7D, 0x96, 0xC1, 0x5F, 0x4C, 0x7C, 0x88, 0xCB,
-    0x65, 0x07, 0x2B, 0x0E, 0x1D, 0x24, 0xAA, 0x20, 0x2E, 0x6C, 0x33, 0xAB,
-    0xEF, 0x23, 0xE5, 0xE3, 0x6C, 0xA3, 0xA5, 0x2D, 0x01, 0xDF, 0x26, 0x92,
-    0x52, 0xF5, 0xE6, 0x3E, 0xE3, 0xDD, 0xC6, 0xED, 0x42, 0x0F, 0x71, 0x7B,
-    0xD1, 0xF4, 0x06, 0xF6, 0x82, 0xD5, 0x13, 0xB3, 0x60, 0x31, 0x09, 0x89,
-    0x63, 0x15, 0xD2, 0xCB, 0xAA, 0x77, 0xFD, 0xF4, 0xEB, 0xF4, 0xED, 0x2E,
-    0xE2, 0xBA, 0x27, 0x2E, 0x74, 0xD2, 0x91, 0x7F, 0x0F, 0xDE, 0x25, 0xFE,
-    0x78, 0x20, 0x05, 0x0A, 0x6A, 0xFE, 0x89, 0x14, 0x23, 0xF3, 0xF5, 0x3A,
-    0x1E, 0xF3, 0x22, 0xCE, 0x12, 0x82, 0x24, 0x11, 0x05, 0x04, 0x71, 0x99,
-    0xE5, 0xF0, 0xA6, 0xDB, 0x7B, 0xF5, 0x8F, 0xF9, 0x3C, 0x02, 0x0C, 0x46,
-    0xFD, 0xB6, 0xEA, 0x06, 0x11, 0xF4, 0x1E, 0x7A, 0x20, 0x6A, 0x54, 0xBB,
-    0x4A, 0x60, 0xB0, 0x30, 0x28, 0x9A, 0xF3, 0x3B, 0xE9, 0xBD, 0xD6, 0x04,
-    0xCA, 0x3A, 0x33, 0x37, 0x5F, 0xB7, 0xAD, 0xE7, 0x9C, 0xE2, 0x95, 0x21,
-    0xF7, 0xB5, 0xC4, 0xF0, 0xD1, 0x51, 0x09, 0x44, 0x3F, 0x07, 0xFC, 0x5F,
-    0x37, 0xFD, 0x7D, 0x7E, 0xD5, 0xF7, 0xEB, 0x69, 0xB9, 0x54, 0x98, 0x5A,
-    0x2A, 0x56, 0xE3, 0xC0, 0x21, 0x57, 0xD1, 0xEB, 0x75, 0x15, 0xED, 0xAC,
-    0xAF, 0x5D, 0xFF, 0xC2, 0xFE, 0x4E, 0xFB, 0xBA, 0x13, 0xB8, 0x87, 0xFA,
-    0x4E, 0x5E, 0x5C, 0x24, 0x15, 0x5B, 0x2B, 0x2C, 0x32, 0x68, 0x1F, 0x30,
-    0x5F, 0xC1, 0xF7, 0xE7, 0xE1, 0x9C, 0x00, 0xC1, 0x9C, 0xB1, 0xAB, 0xFA,
-    0xFF, 0xC1, 0x1E, 0x72, 0xA1, 0x46, 0x9E, 0x2E, 0xCD, 0x76, 0x96, 0x4F,
-    0x14, 0xDC, 0x68, 0xC1, 0x10, 0x9F, 0xDF, 0xEB, 0x5A, 0xBA, 0x8D, 0x91,
-    0x4E, 0x76, 0xE9, 0x3A, 0x43, 0x2D, 0x88, 0xD2, 0x81, 0x0C, 0xEC, 0x6F,
-    0xB7, 0xA4, 0x8B, 0x97, 0x4F, 0xC4, 0x1E, 0xF3, 0x0F, 0xF5, 0x66, 0x66,
-    0xBF, 0x6C, 0x3F, 0xFB, 0x6E, 0x2B, 0x48, 0x6C, 0x7B, 0xD1, 0x2E, 0x64,
-    0xD1, 0x0B, 0x6E, 0x5B, 0x05, 0x16, 0xDD, 0xCB, 0x1B, 0xDE, 0xA2, 0xB9,
-    0xA8, 0x94, 0xD6, 0x5A, 0x5B, 0xE2, 0xC9, 0xBC, 0xD5, 0xAB, 0x64, 0x5B,
-    0x0F, 0x9A, 0xFD, 0xC7, 0x2E, 0xB7, 0xEF, 0xAE, 0xE9, 0x1F, 0x32, 0xD2,
-    0xCA, 0xA0, 0x37, 0x63, 0x86, 0x72, 0x41, 0x07, 0xBC, 0xAB, 0x6F, 0xFF,
-    0xB7, 0x16, 0xAA, 0xA9, 0x58, 0x9E, 0x43, 0x9C, 0x22, 0x8D, 0x48, 0xCE,
-    0xE5, 0xEF, 0xE0, 0x7D, 0x47, 0x87, 0x5A, 0xA8, 0x5B, 0x06, 0xA9, 0x47,
-    0xF0, 0x26, 0xB4, 0x99, 0xD8, 0xA3, 0x64, 0xED, 0x73, 0xB3, 0x96, 0xB4,
-    0x21, 0x19, 0xA5, 0xC1, 0xDC, 0x88, 0x2E, 0xEE, 0xF2, 0x77, 0x91, 0xEC,
-    0xFB, 0xD5, 0xF9, 0xF8, 0x90, 0x47, 0xAD, 0xF5, 0xEB, 0x96, 0x6D, 0xF1,
-    0x1C, 0xE0, 0xDC, 0x74, 0x1C, 0xE6, 0x2E, 0xE1, 0x76, 0x9D, 0xEE, 0xF4,
-    0xEF, 0xA5, 0x31, 0x03, 0x87, 0x0E, 0x2C, 0x84, 0xA5, 0xF1, 0x22, 0xBE,
-    0x48, 0xA9, 0xCD, 0x09, 0x07, 0xC1, 0xF0, 0xD4, 0xE7, 0x03, 0x82, 0x39,
-    0xE2, 0xA0, 0x0B, 0xDE, 0xAC, 0x37, 0xAC, 0x62, 0x97, 0x8E, 0x79, 0xCE,
-    0x52, 0x24, 0x78, 0xF9, 0x17, 0xD2, 0xF1, 0x5D, 0x2D, 0xA1, 0xDF, 0x12,
-    0x2C, 0x83, 0xE5, 0x1A, 0x28, 0x9A, 0x2D, 0xED, 0x8A, 0xBF, 0xFC, 0x41,
-    0xC3, 0xEB, 0x0E, 0x91, 0xDB, 0xF2, 0xA1, 0xC8, 0xA8, 0x01, 0x8B, 0xF2,
-    0xF3, 0x59, 0xB7, 0xA7, 0x6F, 0x80, 0xFF, 0x0B, 0x46, 0xE1, 0x63, 0xA7,
-    0x5F, 0x6B, 0xBE, 0x33, 0x71, 0xBE, 0x3A, 0xAF, 0xA9, 0x53, 0x5D, 0x3B,
-    0xB2, 0xF6, 0xEB, 0x42, 0x1C, 0x3E, 0x3F, 0x1D, 0x6A, 0x34, 0xAE, 0xB1,
-    0x05, 0xA1, 0x32, 0x6C, 0xB5, 0xE4, 0xD3, 0xBB, 0xE8, 0x10, 0x14, 0x9E,
-    0x68, 0x6A, 0x24, 0x51, 0xA5, 0x66, 0x64, 0xCC, 0xC4, 0x2D, 0x96, 0xA2,
-    0xC7, 0x2D, 0x1F, 0x0A, 0x0F, 0x6B, 0xD9, 0xAD, 0xA3, 0x11, 0x8F, 0x00,
-    0xAA, 0x06, 0xC2, 0x1E, 0xF3, 0xE8, 0x5A, 0x37, 0x4C, 0xD6, 0x4B, 0x6B,
-    0x01, 0xC9, 0xB0, 0xB6, 0xB9, 0x92, 0xED, 0x1D, 0x08, 0xB0, 0x80, 0x06,
-    0x20, 0xEA, 0xEE, 0xF9, 0x1D, 0xA4, 0x57, 0x73, 0x2E, 0x1B, 0xA5, 0xAF,
-    0xF6, 0xAF, 0xAE, 0x04, 0x7C, 0x4C, 0x7E, 0xC8, 0xDB, 0xC0, 0xFB, 0x37,
-    0xC8, 0x7E, 0xFE, 0x47, 0x0A, 0x3C, 0xFA, 0x61, 0xE7, 0xEB, 0x1B, 0xF3,
-    0x7C, 0x32, 0xE3, 0x7C, 0x37, 0x66, 0x7C, 0x53, 0x07, 0xC2, 0x37, 0xA3,
-    0xBD, 0xF7, 0xFA, 0xE3, 0x8A, 0x76, 0xCB, 0x6C, 0xC8, 0x13, 0xC4, 0x53,
-    0x53, 0xDB, 0xAD, 0x37, 0x1A, 0xEB, 0xE0};
-
-TEST_F(H264ToAnnexBBitstreamConverterTest, Success) {
-  // Initialize converter.
-  std::unique_ptr<uint8_t[]> output;
-  H264ToAnnexBBitstreamConverter converter;
-
-  // Parse the headers.
-  EXPECT_TRUE(converter.ParseConfiguration(kHeaderDataOkWithFieldLen4,
-                                           sizeof(kHeaderDataOkWithFieldLen4),
-                                           &avc_config_));
-  uint32_t config_size = converter.GetConfigSize(avc_config_);
-  EXPECT_GT(config_size, 0U);
-
-  // Go on with converting the headers.
-  output.reset(new uint8_t[config_size]);
-  EXPECT_TRUE(output.get() != NULL);
-  EXPECT_TRUE(converter.ConvertAVCDecoderConfigToByteStream(
-      avc_config_, output.get(), &config_size));
-
-  // Calculate buffer size for actual NAL unit.
-  uint32_t output_size = converter.CalculateNeededOutputBufferSize(
-      kPacketDataOkWithFieldLen4, sizeof(kPacketDataOkWithFieldLen4),
-      &avc_config_);
-  EXPECT_GT(output_size, 0U);
-  output.reset(new uint8_t[output_size]);
-  EXPECT_TRUE(output.get() != NULL);
-
-  uint32_t output_size_left_for_nal_unit = output_size;
-  // Do the conversion for actual NAL unit.
-  EXPECT_TRUE(converter.ConvertNalUnitStreamToByteStream(
-      kPacketDataOkWithFieldLen4, sizeof(kPacketDataOkWithFieldLen4),
-      &avc_config_, output.get(), &output_size_left_for_nal_unit));
-}
-
-TEST_F(H264ToAnnexBBitstreamConverterTest, FailureHeaderBufferOverflow) {
-  // Initialize converter
-  H264ToAnnexBBitstreamConverter converter;
-
-  // Simulate 10 sps AVCDecoderConfigurationRecord,
-  // which would extend beyond the buffer.
-  uint8_t corrupted_header[sizeof(kHeaderDataOkWithFieldLen4)];
-  memcpy(corrupted_header, kHeaderDataOkWithFieldLen4,
-               sizeof(kHeaderDataOkWithFieldLen4));
-  // 6th byte, 5 LSBs contain the number of sps's.
-  corrupted_header[5] = corrupted_header[5] | 0xA;
-
-  // Parse the headers
-  EXPECT_FALSE(converter.ParseConfiguration(
-      corrupted_header, sizeof(corrupted_header), &avc_config_));
-}
-
-TEST_F(H264ToAnnexBBitstreamConverterTest, FailureNalUnitBreakage) {
-  // Initialize converter.
-  std::unique_ptr<uint8_t[]> output;
-  H264ToAnnexBBitstreamConverter converter;
-
-  // Parse the headers.
-  EXPECT_TRUE(converter.ParseConfiguration(kHeaderDataOkWithFieldLen4,
-                                           sizeof(kHeaderDataOkWithFieldLen4),
-                                           &avc_config_));
-  uint32_t config_size = converter.GetConfigSize(avc_config_);
-  EXPECT_GT(config_size, 0U);
-
-  // Go on with converting the headers.
-  output.reset(new uint8_t[config_size]);
-  EXPECT_TRUE(output.get() != NULL);
-  EXPECT_TRUE(converter.ConvertAVCDecoderConfigToByteStream(
-      avc_config_, output.get(), &config_size));
-
-  // Simulate NAL unit broken in middle by writing only some of the data.
-  uint8_t corrupted_nal_unit[sizeof(kPacketDataOkWithFieldLen4) - 100];
-  memcpy(corrupted_nal_unit, kPacketDataOkWithFieldLen4,
-               sizeof(kPacketDataOkWithFieldLen4) - 100);
-
-  // Calculate buffer size for actual NAL unit, should return 0 because of
-  // incomplete input buffer.
-  uint32_t output_size = converter.CalculateNeededOutputBufferSize(
-      corrupted_nal_unit, sizeof(corrupted_nal_unit), &avc_config_);
-  EXPECT_EQ(output_size, 0U);
-
-  // Ignore the error and try to go on with conversion simulating wrong usage.
-  output_size = sizeof(kPacketDataOkWithFieldLen4);
-  output.reset(new uint8_t[output_size]);
-  EXPECT_TRUE(output.get() != NULL);
-
-  uint32_t output_size_left_for_nal_unit = output_size;
-  // Do the conversion for actual NAL unit, expecting failure.
-  EXPECT_FALSE(converter.ConvertNalUnitStreamToByteStream(
-      corrupted_nal_unit, sizeof(corrupted_nal_unit), &avc_config_,
-      output.get(), &output_size_left_for_nal_unit));
-  EXPECT_EQ(output_size_left_for_nal_unit, 0U);
-}
-
-TEST_F(H264ToAnnexBBitstreamConverterTest, FailureTooSmallOutputBuffer) {
-  // Initialize converter.
-  std::unique_ptr<uint8_t[]> output;
-  H264ToAnnexBBitstreamConverter converter;
-
-  // Parse the headers.
-  EXPECT_TRUE(converter.ParseConfiguration(kHeaderDataOkWithFieldLen4,
-                                           sizeof(kHeaderDataOkWithFieldLen4),
-                                           &avc_config_));
-  uint32_t config_size = converter.GetConfigSize(avc_config_);
-  EXPECT_GT(config_size, 0U);
-  uint32_t real_config_size = config_size;
-
-  // Go on with converting the headers with too small buffer.
-  config_size -= 10;
-  output.reset(new uint8_t[config_size]);
-  EXPECT_TRUE(output.get() != NULL);
-  EXPECT_FALSE(converter.ConvertAVCDecoderConfigToByteStream(
-      avc_config_, output.get(), &config_size));
-  EXPECT_EQ(config_size, 0U);
-
-  // Still too small (but only 1 byte short).
-  config_size = real_config_size - 1;
-  output.reset(new uint8_t[config_size]);
-  EXPECT_TRUE(output.get() != NULL);
-  EXPECT_FALSE(converter.ConvertAVCDecoderConfigToByteStream(
-      avc_config_, output.get(), &config_size));
-  EXPECT_EQ(config_size, 0U);
-
-  // Finally, retry with valid buffer.
-  config_size = real_config_size;
-  output.reset(new uint8_t[config_size]);
-  EXPECT_TRUE(output.get() != NULL);
-  EXPECT_TRUE(converter.ConvertAVCDecoderConfigToByteStream(
-      avc_config_, output.get(), &config_size));
-
-  // Calculate buffer size for actual NAL unit.
-  uint32_t output_size = converter.CalculateNeededOutputBufferSize(
-      kPacketDataOkWithFieldLen4, sizeof(kPacketDataOkWithFieldLen4),
-      &avc_config_);
-  EXPECT_GT(output_size, 0U);
-  // Simulate too small output buffer.
-  output_size -= 1;
-  output.reset(new uint8_t[output_size]);
-  EXPECT_TRUE(output.get() != NULL);
-
-  uint32_t output_size_left_for_nal_unit = output_size;
-  // Do the conversion for actual NAL unit (expect failure).
-  EXPECT_FALSE(converter.ConvertNalUnitStreamToByteStream(
-      kPacketDataOkWithFieldLen4, sizeof(kPacketDataOkWithFieldLen4),
-      &avc_config_, output.get(), &output_size_left_for_nal_unit));
-  EXPECT_EQ(output_size_left_for_nal_unit, 0U);
-}
-
-// Generated from crash dump in http://crbug.com/234449 using xxd -i [file].
-static const uint8_t kCorruptedPacketConfiguration[] = {
-    0x01, 0x64, 0x00, 0x15, 0xff, 0xe1, 0x00, 0x17, 0x67, 0x64,
-    0x00, 0x15, 0xac, 0xc8, 0xc1, 0x41, 0xfb, 0x0e, 0x10, 0x00,
-    0x00, 0x3e, 0x90, 0x00, 0x0e, 0xa6, 0x00, 0xf1, 0x62, 0xd3,
-    0x80, 0x01, 0x00, 0x06, 0x68, 0xea, 0xc0, 0xbc, 0xb2, 0x2c};
-
-static const uint8_t kCorruptedPacketData[] = {
-    0x00, 0x00, 0x00, 0x15, 0x01, 0x9f, 0x6e, 0xbc, 0x85, 0x3f,
-    0x0f, 0x87, 0x47, 0xa8, 0xd7, 0x5b, 0xfc, 0xb8, 0xfd, 0x3f,
-    0x57, 0x0e, 0xac, 0xf5, 0x4c, 0x01, 0x2e, 0x57};
-
-TEST_F(H264ToAnnexBBitstreamConverterTest, CorruptedPacket) {
-  // Initialize converter.
-  std::unique_ptr<uint8_t[]> output;
-  H264ToAnnexBBitstreamConverter converter;
-
-  // Parse the headers.
-  EXPECT_TRUE(converter.ParseConfiguration(
-      kCorruptedPacketConfiguration, sizeof(kCorruptedPacketConfiguration),
-      &avc_config_));
-  uint32_t config_size = converter.GetConfigSize(avc_config_);
-  EXPECT_GT(config_size, 0U);
-
-  // Go on with converting the headers.
-  output.reset(new uint8_t[config_size]);
-  EXPECT_TRUE(converter.ConvertAVCDecoderConfigToByteStream(
-      avc_config_, output.get(), &config_size));
-
-  // Expect an error here.
-  uint32_t output_size = converter.CalculateNeededOutputBufferSize(
-      kCorruptedPacketData, sizeof(kCorruptedPacketData), &avc_config_);
-  EXPECT_EQ(output_size, 0U);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h265_parser.cc b/cobalt/media/filters/h265_parser.cc
deleted file mode 100644
index 18b5e5f..0000000
--- a/cobalt/media/filters/h265_parser.cc
+++ /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.
-
-#include "cobalt/media/filters/h265_parser.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-#define READ_BITS_OR_RETURN(num_bits, out)                                 \
-  do {                                                                     \
-    int _out;                                                              \
-    if (!br_.ReadBits(num_bits, &_out)) {                                  \
-      DVLOG(1)                                                             \
-          << "Error in stream: unexpected EOS while trying to read " #out; \
-      return kInvalidStream;                                               \
-    }                                                                      \
-    *out = _out;                                                           \
-  } while (0)
-
-#define TRUE_OR_RETURN(a)                                            \
-  do {                                                               \
-    if (!(a)) {                                                      \
-      DVLOG(1) << "Error in stream: invalid value, expected " << #a; \
-      return kInvalidStream;                                         \
-    }                                                                \
-  } while (0)
-
-H265NALU::H265NALU() { memset(this, 0, sizeof(*this)); }
-
-H265Parser::H265Parser() { Reset(); }
-
-H265Parser::~H265Parser() {}
-
-void H265Parser::Reset() {
-  stream_ = NULL;
-  bytes_left_ = 0;
-  encrypted_ranges_.clear();
-}
-
-void H265Parser::SetStream(const uint8_t* stream, off_t stream_size) {
-  std::vector<SubsampleEntry> subsamples;
-  SetEncryptedStream(stream, stream_size, subsamples);
-}
-
-void H265Parser::SetEncryptedStream(
-    const uint8_t* stream, off_t stream_size,
-    const std::vector<SubsampleEntry>& subsamples) {
-  DCHECK(stream);
-  DCHECK_GT(stream_size, 0);
-
-  stream_ = stream;
-  bytes_left_ = stream_size;
-
-  encrypted_ranges_.clear();
-  const uint8_t* start = stream;
-  const uint8_t* stream_end = stream_ + bytes_left_;
-  for (size_t i = 0; i < subsamples.size() && start < stream_end; ++i) {
-    start += subsamples[i].clear_bytes;
-
-    const uint8_t* end =
-        std::min(start + subsamples[i].cypher_bytes, stream_end);
-    encrypted_ranges_.Add(start, end);
-    start = end;
-  }
-}
-
-bool H265Parser::LocateNALU(off_t* nalu_size, off_t* start_code_size) {
-  // Find the start code of next NALU.
-  off_t nalu_start_off = 0;
-  off_t annexb_start_code_size = 0;
-
-  if (!H264Parser::FindStartCodeInClearRanges(
-          stream_, bytes_left_, encrypted_ranges_, &nalu_start_off,
-          &annexb_start_code_size)) {
-    DVLOG(4) << "Could not find start code, end of stream?";
-    return false;
-  }
-
-  // Move the stream to the beginning of the NALU (pointing at the start code).
-  stream_ += nalu_start_off;
-  bytes_left_ -= nalu_start_off;
-
-  const uint8_t* nalu_data = stream_ + annexb_start_code_size;
-  off_t max_nalu_data_size = bytes_left_ - annexb_start_code_size;
-  if (max_nalu_data_size <= 0) {
-    DVLOG(3) << "End of stream";
-    return false;
-  }
-
-  // Find the start code of next NALU;
-  // if successful, |nalu_size_without_start_code| is the number of bytes from
-  // after previous start code to before this one;
-  // if next start code is not found, it is still a valid NALU since there
-  // are some bytes left after the first start code: all the remaining bytes
-  // belong to the current NALU.
-  off_t next_start_code_size = 0;
-  off_t nalu_size_without_start_code = 0;
-  if (!H264Parser::FindStartCodeInClearRanges(
-          nalu_data, max_nalu_data_size, encrypted_ranges_,
-          &nalu_size_without_start_code, &next_start_code_size)) {
-    nalu_size_without_start_code = max_nalu_data_size;
-  }
-  *nalu_size = nalu_size_without_start_code + annexb_start_code_size;
-  *start_code_size = annexb_start_code_size;
-  return true;
-}
-
-H265Parser::Result H265Parser::AdvanceToNextNALU(H265NALU* nalu) {
-  off_t start_code_size;
-  off_t nalu_size_with_start_code;
-  if (!LocateNALU(&nalu_size_with_start_code, &start_code_size)) {
-    DVLOG(4) << "Could not find next NALU, bytes left in stream: "
-             << bytes_left_;
-    return kEOStream;
-  }
-
-  nalu->data = stream_ + start_code_size;
-  nalu->size = nalu_size_with_start_code - start_code_size;
-  DVLOG(4) << "NALU found: size=" << nalu_size_with_start_code;
-
-  // Initialize bit reader at the start of found NALU.
-  if (!br_.Initialize(nalu->data, nalu->size)) return kEOStream;
-
-  // Move parser state to after this NALU, so next time AdvanceToNextNALU
-  // is called, we will effectively be skipping it;
-  // other parsing functions will use the position saved
-  // in bit reader for parsing, so we don't have to remember it here.
-  stream_ += nalu_size_with_start_code;
-  bytes_left_ -= nalu_size_with_start_code;
-
-  // Read NALU header, skip the forbidden_zero_bit, but check for it.
-  int data;
-  READ_BITS_OR_RETURN(1, &data);
-  TRUE_OR_RETURN(data == 0);
-
-  READ_BITS_OR_RETURN(6, &nalu->nal_unit_type);
-  READ_BITS_OR_RETURN(6, &nalu->nuh_layer_id);
-  READ_BITS_OR_RETURN(3, &nalu->nuh_temporal_id_plus1);
-
-  DVLOG(4) << "NALU type: " << static_cast<int>(nalu->nal_unit_type)
-           << " at: " << reinterpret_cast<const void*>(nalu->data)
-           << " size: " << nalu->size;
-
-  return kOk;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/h265_parser.h b/cobalt/media/filters/h265_parser.h
deleted file mode 100644
index 57981c9..0000000
--- a/cobalt/media/filters/h265_parser.h
+++ /dev/null
@@ -1,153 +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 file contains an implementation of an H265 Annex-B video stream parser.
-
-#ifndef COBALT_MEDIA_FILTERS_H265_PARSER_H_
-#define COBALT_MEDIA_FILTERS_H265_PARSER_H_
-
-#include <sys/types.h>
-
-#include <map>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/ranges.h"
-#include "cobalt/media/filters/h264_bit_reader.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-struct SubsampleEntry;
-
-// For explanations of each struct and its members, see H.265 specification
-// at http://www.itu.int/rec/T-REC-H.265.
-struct MEDIA_EXPORT H265NALU {
-  H265NALU();
-
-  // NAL Unit types are taken from Table 7-1 of HEVC/H265 standard
-  // http://www.itu.int/rec/T-REC-H.265-201410-I/en
-  enum Type {
-    TRAIL_N = 0,
-    TRAIL_R = 1,
-    TSA_N = 2,
-    TSA_R = 3,
-    STSA_N = 4,
-    STSA_R = 5,
-    RADL_N = 6,
-    RADL_R = 7,
-    RASL_N = 8,
-    RASL_R = 9,
-    RSV_VCL_N10 = 10,
-    RSV_VCL_R11 = 11,
-    RSV_VCL_N12 = 12,
-    RSV_VCL_R13 = 13,
-    RSV_VCL_N14 = 14,
-    RSV_VCL_R15 = 15,
-    BLA_W_LP = 16,
-    BLA_W_RADL = 17,
-    BLA_N_LP = 18,
-    IDR_W_RADL = 19,
-    IDR_N_LP = 20,
-    CRA_NUT = 21,
-    RSV_IRAP_VCL22 = 22,
-    RSV_IRAP_VCL23 = 23,
-    RSV_VCL24 = 24,
-    RSV_VCL25 = 25,
-    RSV_VCL26 = 26,
-    RSV_VCL27 = 27,
-    RSV_VCL28 = 28,
-    RSV_VCL29 = 29,
-    RSV_VCL30 = 30,
-    RSV_VCL31 = 31,
-    VPS_NUT = 32,
-    SPS_NUT = 33,
-    PPS_NUT = 34,
-    AUD_NUT = 35,
-    EOS_NUT = 36,
-    EOB_NUT = 37,
-    FD_NUT = 38,
-    PREFIX_SEI_NUT = 39,
-    SUFFIX_SEI_NUT = 40,
-    RSV_NVCL41 = 41,
-    RSV_NVCL42 = 42,
-    RSV_NVCL43 = 43,
-    RSV_NVCL44 = 44,
-    RSV_NVCL45 = 45,
-    RSV_NVCL46 = 46,
-    RSV_NVCL47 = 47,
-  };
-
-  // After (without) start code; we don't own the underlying memory
-  // and a shallow copy should be made when copying this struct.
-  const uint8_t* data;
-  off_t size;  // From after start code to start code of next NALU (or EOS).
-
-  int nal_unit_type;
-  int nuh_layer_id;
-  int nuh_temporal_id_plus1;
-};
-
-// Class to parse an Annex-B H.265 stream.
-class MEDIA_EXPORT H265Parser {
- public:
-  enum Result {
-    kOk,
-    kInvalidStream,      // error in stream
-    kUnsupportedStream,  // stream not supported by the parser
-    kEOStream,           // end of stream
-  };
-
-  H265Parser();
-  ~H265Parser();
-
-  void Reset();
-  // Set current stream pointer to |stream| of |stream_size| in bytes,
-  // |stream| owned by caller.
-  // |subsamples| contains information about what parts of |stream| are
-  // encrypted.
-  void SetStream(const uint8_t* stream, off_t stream_size);
-  void SetEncryptedStream(const uint8_t* stream, off_t stream_size,
-                          const std::vector<SubsampleEntry>& subsamples);
-
-  // Read the stream to find the next NALU, identify it and return
-  // that information in |*nalu|. This advances the stream to the beginning
-  // of this NALU, but not past it, so subsequent calls to NALU-specific
-  // parsing functions (ParseSPS, etc.)  will parse this NALU.
-  // If the caller wishes to skip the current NALU, it can call this function
-  // again, instead of any NALU-type specific parse functions below.
-  Result AdvanceToNextNALU(H265NALU* nalu);
-
- private:
-  // Move the stream pointer to the beginning of the next NALU,
-  // i.e. pointing at the next start code.
-  // Return true if a NALU has been found.
-  // If a NALU is found:
-  // - its size in bytes is returned in |*nalu_size| and includes
-  //   the start code as well as the trailing zero bits.
-  // - the size in bytes of the start code is returned in |*start_code_size|.
-  bool LocateNALU(off_t* nalu_size, off_t* start_code_size);
-
-  // Pointer to the current NALU in the stream.
-  const uint8_t* stream_;
-
-  // Bytes left in the stream after the current NALU.
-  off_t bytes_left_;
-
-  H264BitReader br_;
-
-  // Ranges of encrypted bytes in the buffer passed to
-  // SetEncryptedStream().
-  Ranges<const uint8_t*> encrypted_ranges_;
-
-  DISALLOW_COPY_AND_ASSIGN(H265Parser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_H265_PARSER_H_
diff --git a/cobalt/media/filters/h265_parser_unittest.cc b/cobalt/media/filters/h265_parser_unittest.cc
deleted file mode 100644
index bfa8445..0000000
--- a/cobalt/media/filters/h265_parser_unittest.cc
+++ /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.
-
-#include "cobalt/media/filters/h265_parser.h"
-
-#include "base/files/memory_mapped_file.h"
-#include "base/logging.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(H265ParserTest, RawHevcStreamFileParsing) {
-  base::FilePath file_path = GetTestDataFilePath("bear.hevc");
-  // Number of NALUs in the test stream to be parsed.
-  const int num_nalus = 35;
-
-  base::MemoryMappedFile stream;
-  ASSERT_TRUE(stream.Initialize(file_path))
-      << "Couldn't open stream file: " << file_path.MaybeAsASCII();
-
-  H265Parser parser;
-  parser.SetStream(stream.data(), stream.length());
-
-  // Parse until the end of stream/unsupported stream/error in stream is found.
-  int num_parsed_nalus = 0;
-  while (true) {
-    H265NALU nalu;
-    H265Parser::Result res = parser.AdvanceToNextNALU(&nalu);
-    if (res == H265Parser::kEOStream) {
-      DVLOG(1) << "Number of successfully parsed NALUs before EOS: "
-               << num_parsed_nalus;
-      ASSERT_EQ(num_nalus, num_parsed_nalus);
-      return;
-    }
-    ASSERT_EQ(res, H265Parser::kOk);
-
-    ++num_parsed_nalus;
-    DVLOG(4) << "Found NALU " << nalu.nal_unit_type;
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/ivf_parser.cc b/cobalt/media/filters/ivf_parser.cc
deleted file mode 100644
index 6744688..0000000
--- a/cobalt/media/filters/ivf_parser.cc
+++ /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.
-
-#include "cobalt/media/filters/ivf_parser.h"
-
-#include "base/logging.h"
-#include "base/sys_byteorder.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-void IvfFileHeader::ByteSwap() {
-  version = base::ByteSwapToLE16(version);
-  header_size = base::ByteSwapToLE16(header_size);
-  fourcc = base::ByteSwapToLE32(fourcc);
-  width = base::ByteSwapToLE16(width);
-  height = base::ByteSwapToLE16(height);
-  timebase_denum = base::ByteSwapToLE32(timebase_denum);
-  timebase_num = base::ByteSwapToLE32(timebase_num);
-  num_frames = base::ByteSwapToLE32(num_frames);
-  unused = base::ByteSwapToLE32(unused);
-}
-
-void IvfFrameHeader::ByteSwap() {
-  frame_size = base::ByteSwapToLE32(frame_size);
-  timestamp = base::ByteSwapToLE64(timestamp);
-}
-
-IvfParser::IvfParser() : ptr_(NULL), end_(NULL) {}
-
-bool IvfParser::Initialize(const uint8_t* stream, size_t size,
-                           IvfFileHeader* file_header) {
-  DCHECK(stream);
-  DCHECK(file_header);
-  ptr_ = stream;
-  end_ = stream + size;
-
-  if (size < sizeof(IvfFileHeader)) {
-    DLOG(ERROR) << "EOF before file header";
-    return false;
-  }
-
-  memcpy(file_header, ptr_, sizeof(IvfFileHeader));
-  file_header->ByteSwap();
-
-  if (memcmp(file_header->signature, kIvfHeaderSignature,
-             sizeof(file_header->signature)) != 0) {
-    DLOG(ERROR) << "IVF signature mismatch";
-    return false;
-  }
-  DLOG_IF(WARNING, file_header->version != 0)
-      << "IVF version unknown: " << file_header->version
-      << ", the parser may not be able to parse correctly";
-  if (file_header->header_size != sizeof(IvfFileHeader)) {
-    DLOG(ERROR) << "IVF file header size mismatch";
-    return false;
-  }
-
-  ptr_ += sizeof(IvfFileHeader);
-
-  return true;
-}
-
-bool IvfParser::ParseNextFrame(IvfFrameHeader* frame_header,
-                               const uint8_t** payload) {
-  DCHECK(ptr_);
-  DCHECK(payload);
-
-  if (end_ < ptr_ + sizeof(IvfFrameHeader)) {
-    DLOG_IF(ERROR, ptr_ != end_) << "Incomplete frame header";
-    return false;
-  }
-
-  memcpy(frame_header, ptr_, sizeof(IvfFrameHeader));
-  frame_header->ByteSwap();
-  ptr_ += sizeof(IvfFrameHeader);
-
-  if (end_ < ptr_ + frame_header->frame_size) {
-    DLOG(ERROR) << "Not enough frame data";
-    return false;
-  }
-
-  *payload = ptr_;
-  ptr_ += frame_header->frame_size;
-
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/ivf_parser.h b/cobalt/media/filters/ivf_parser.h
deleted file mode 100644
index 50054c7..0000000
--- a/cobalt/media/filters/ivf_parser.h
+++ /dev/null
@@ -1,85 +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 COBALT_MEDIA_FILTERS_IVF_PARSER_H_
-#define COBALT_MEDIA_FILTERS_IVF_PARSER_H_
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-const char kIvfHeaderSignature[] = "DKIF";
-
-#pragma pack(push, 1)
-struct MEDIA_EXPORT IvfFileHeader {
-  // Byte swap integer fields between native and (on disk) little endian.
-  void ByteSwap();
-
-  char signature[4];        // signature: 'DKIF'
-  uint16_t version;         // version (should be 0)
-  uint16_t header_size;     // size of header in bytes
-  uint32_t fourcc;          // codec FourCC (e.g., 'VP80')
-  uint16_t width;           // width in pixels
-  uint16_t height;          // height in pixels
-  uint32_t timebase_denum;  // timebase denumerator
-  uint32_t timebase_num;    // timebase numerator. For example, if
-                            // timebase_denum is 30 and timebase_num is 2, the
-                            // unit of IvfFrameHeader.timestamp is 2/30
-                            // seconds.
-  uint32_t num_frames;      // number of frames in file
-  uint32_t unused;          // unused
-};
-static_assert(
-    sizeof(IvfFileHeader) == 32,
-    "sizeof(IvfFileHeader) must be fixed since it will be used with file IO");
-
-struct MEDIA_EXPORT IvfFrameHeader {
-  // Byte swap integer fields between native and (on disk) little endian.
-  void ByteSwap();
-
-  uint32_t frame_size;  // Size of frame in bytes (not including the header)
-  uint64_t timestamp;   // 64-bit presentation timestamp in unit timebase,
-                        // which is defined in IvfFileHeader.
-};
-static_assert(
-    sizeof(IvfFrameHeader) == 12,
-    "sizeof(IvfFrameHeader) must be fixed since it will be used with file IO");
-#pragma pack(pop)
-
-// IVF is a simple container format for video frame. It is used by libvpx to
-// transport VP8 and VP9 bitstream.
-class MEDIA_EXPORT IvfParser {
- public:
-  IvfParser();
-
-  // Initializes the parser for IVF |stream| with size |size| and parses the
-  // file header. Returns true on success.
-  bool Initialize(const uint8_t* stream, size_t size,
-                  IvfFileHeader* file_header);
-
-  // Parses the next frame. Returns true if the next frame is parsed without
-  // error. |frame_header| will be filled with the frame header and |payload|
-  // will point to frame payload (inside the |stream| buffer given to
-  // Initialize.)
-  bool ParseNextFrame(IvfFrameHeader* frame_header, const uint8_t** payload);
-
- private:
-  bool ParseFileHeader(IvfFileHeader* file_header);
-
-  // Current reading position of input stream.
-  const uint8_t* ptr_;
-
-  // The end position of input stream.
-  const uint8_t* end_;
-
-  DISALLOW_COPY_AND_ASSIGN(IvfParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_IVF_PARSER_H_
diff --git a/cobalt/media/filters/ivf_parser_unittest.cc b/cobalt/media/filters/ivf_parser_unittest.cc
deleted file mode 100644
index 0dab9bb..0000000
--- a/cobalt/media/filters/ivf_parser_unittest.cc
+++ /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.
-
-#include "cobalt/media/filters/ivf_parser.h"
-
-#include "base/files/memory_mapped_file.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(IvfParserTest, StreamFileParsing) {
-  base::FilePath file_path = GetTestDataFilePath("test-25fps.vp8");
-
-  base::MemoryMappedFile stream;
-  ASSERT_TRUE(stream.Initialize(file_path))
-      << "Couldn't open stream file: " << file_path.MaybeAsASCII();
-
-  IvfParser parser;
-  IvfFileHeader file_header = {};
-
-  EXPECT_TRUE(parser.Initialize(stream.data(), stream.length(), &file_header));
-
-  // Check file header fields.
-  EXPECT_EQ(0, memcmp(file_header.signature, kIvfHeaderSignature,
-                      sizeof(file_header.signature)));
-  EXPECT_EQ(0, file_header.version);
-  EXPECT_EQ(sizeof(IvfFileHeader), file_header.header_size);
-  EXPECT_EQ(0x30385056u, file_header.fourcc);  // VP80
-  EXPECT_EQ(320u, file_header.width);
-  EXPECT_EQ(240u, file_header.height);
-  EXPECT_EQ(50u, file_header.timebase_denum);
-  EXPECT_EQ(2u, file_header.timebase_num);
-  EXPECT_EQ(250u, file_header.num_frames);
-
-  IvfFrameHeader frame_header;
-  size_t num_parsed_frames = 0;
-  const uint8_t* payload = NULL;
-  while (parser.ParseNextFrame(&frame_header, &payload)) {
-    ++num_parsed_frames;
-    EXPECT_TRUE(payload != NULL);
-
-    // Only check the first frame.
-    if (num_parsed_frames == 1u) {
-      EXPECT_EQ(14788u, frame_header.frame_size);
-      EXPECT_EQ(0u, frame_header.timestamp);
-      EXPECT_EQ(
-          static_cast<ptrdiff_t>(sizeof(file_header) + sizeof(frame_header)),
-          payload - stream.data());
-    }
-  }
-
-  EXPECT_EQ(file_header.num_frames, num_parsed_frames);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/source_buffer_range.cc b/cobalt/media/filters/source_buffer_range.cc
deleted file mode 100644
index e9eb915..0000000
--- a/cobalt/media/filters/source_buffer_range.cc
+++ /dev/null
@@ -1,624 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/filters/source_buffer_range.h"
-
-#include <algorithm>
-
-#include "cobalt/media/base/timestamp_constants.h"
-
-namespace cobalt {
-namespace media {
-
-// Comparison operators for std::upper_bound() and std::lower_bound().
-static bool CompareTimeDeltaToStreamParserBuffer(
-    const DecodeTimestamp& decode_timestamp,
-    const scoped_refptr<StreamParserBuffer>& buffer) {
-  return decode_timestamp < buffer->GetDecodeTimestamp();
-}
-static bool CompareStreamParserBufferToTimeDelta(
-    const scoped_refptr<StreamParserBuffer>& buffer,
-    const DecodeTimestamp& decode_timestamp) {
-  return buffer->GetDecodeTimestamp() < decode_timestamp;
-}
-
-bool SourceBufferRange::IsUncommonSameTimestampSequence(
-    bool prev_is_keyframe, bool current_is_keyframe) {
-  return current_is_keyframe && !prev_is_keyframe;
-}
-
-SourceBufferRange::SourceBufferRange(
-    GapPolicy gap_policy, const BufferQueue& new_buffers,
-    DecodeTimestamp range_start_time,
-    const InterbufferDistanceCB& interbuffer_distance_cb)
-    : gap_policy_(gap_policy),
-      keyframe_map_index_base_(0),
-      next_buffer_index_(-1),
-      range_start_time_(range_start_time),
-      interbuffer_distance_cb_(interbuffer_distance_cb),
-      size_in_bytes_(0) {
-  CHECK(!new_buffers.empty());
-  DCHECK(new_buffers.front()->is_key_frame());
-  DCHECK(!interbuffer_distance_cb.is_null());
-  AppendBuffersToEnd(new_buffers, range_start_time_);
-}
-
-SourceBufferRange::~SourceBufferRange() {}
-
-void SourceBufferRange::AppendBuffersToEnd(
-    const BufferQueue& new_buffers,
-    DecodeTimestamp new_buffers_group_start_timestamp) {
-  CHECK(buffers_.empty() ||
-        CanAppendBuffersToEnd(new_buffers, new_buffers_group_start_timestamp));
-  DCHECK(range_start_time_ == kNoDecodeTimestamp() ||
-         range_start_time_ <= new_buffers.front()->GetDecodeTimestamp());
-
-  AdjustEstimatedDurationForNewAppend(new_buffers);
-
-  for (BufferQueue::const_iterator itr = new_buffers.begin();
-       itr != new_buffers.end(); ++itr) {
-    DCHECK((*itr)->GetDecodeTimestamp() != kNoDecodeTimestamp());
-    buffers_.push_back(*itr);
-    size_in_bytes_ += (*itr)->data_size();
-
-    DCHECK_LE(buffers_.size(), kint32max);
-    if ((*itr)->is_key_frame()) {
-      int offset =
-          static_cast<int>(buffers_.size()) - 1 + keyframe_map_index_base_;
-      DCHECK_GE(offset, 0);
-      keyframe_map_.insert(
-          std::make_pair((*itr)->GetDecodeTimestamp(), offset));
-    }
-  }
-}
-
-void SourceBufferRange::AdjustEstimatedDurationForNewAppend(
-    const BufferQueue& new_buffers) {
-  if (buffers_.empty() || new_buffers.empty()) {
-    return;
-  }
-
-  // If the last of the previously appended buffers contains estimated duration,
-  // we now refine that estimate by taking the PTS delta from the first new
-  // buffer being appended.
-  scoped_refptr<StreamParserBuffer> last_appended_buffer = buffers_.back();
-  if (last_appended_buffer->is_duration_estimated()) {
-    base::TimeDelta timestamp_delta =
-        new_buffers.front()->timestamp() - last_appended_buffer->timestamp();
-    DCHECK(timestamp_delta > base::TimeDelta());
-    if (last_appended_buffer->duration() != timestamp_delta) {
-      DVLOG(1) << "Replacing estimated duration ("
-               << last_appended_buffer->duration()
-               << ") from previous range-end with derived duration ("
-               << timestamp_delta << ").";
-      last_appended_buffer->set_duration(timestamp_delta);
-    }
-  }
-}
-
-void SourceBufferRange::Seek(DecodeTimestamp timestamp) {
-  DCHECK(!keyframe_map_.empty());
-
-  KeyframeMap::iterator result = GetFirstKeyframeAtOrBefore(timestamp);
-  next_buffer_index_ = result->second - keyframe_map_index_base_;
-  CHECK_LT(next_buffer_index_, static_cast<int>(buffers_.size()))
-      << next_buffer_index_ << ", size = " << buffers_.size();
-}
-
-void SourceBufferRange::SeekAheadTo(DecodeTimestamp timestamp) {
-  SeekAhead(timestamp, false);
-}
-
-void SourceBufferRange::SeekAheadPast(DecodeTimestamp timestamp) {
-  SeekAhead(timestamp, true);
-}
-
-void SourceBufferRange::SeekAhead(DecodeTimestamp timestamp,
-                                  bool skip_given_timestamp) {
-  DCHECK(!keyframe_map_.empty());
-
-  KeyframeMap::iterator result =
-      GetFirstKeyframeAt(timestamp, skip_given_timestamp);
-
-  // If there isn't a keyframe after |timestamp|, then seek to end and return
-  // kNoTimestamp to signal such.
-  if (result == keyframe_map_.end()) {
-    next_buffer_index_ = -1;
-    return;
-  }
-  next_buffer_index_ = result->second - keyframe_map_index_base_;
-  DCHECK_LT(next_buffer_index_, static_cast<int>(buffers_.size()));
-}
-
-void SourceBufferRange::SeekToStart() {
-  CHECK(!buffers_.empty());
-  next_buffer_index_ = 0;
-}
-
-SourceBufferRange* SourceBufferRange::SplitRange(DecodeTimestamp timestamp) {
-  CHECK(!buffers_.empty());
-
-  // Find the first keyframe at or after |timestamp|.
-  KeyframeMap::iterator new_beginning_keyframe =
-      GetFirstKeyframeAt(timestamp, false);
-
-  // If there is no keyframe after |timestamp|, we can't split the range.
-  if (new_beginning_keyframe == keyframe_map_.end()) return NULL;
-
-  // Remove the data beginning at |keyframe_index| from |buffers_| and save it
-  // into |removed_buffers|.
-  int keyframe_index =
-      new_beginning_keyframe->second - keyframe_map_index_base_;
-  DCHECK_LT(keyframe_index, static_cast<int>(buffers_.size()));
-  BufferQueue::iterator starting_point = buffers_.begin() + keyframe_index;
-  BufferQueue removed_buffers(starting_point, buffers_.end());
-
-  DecodeTimestamp new_range_start_timestamp = kNoDecodeTimestamp();
-  if (GetStartTimestamp() < buffers_.front()->GetDecodeTimestamp() &&
-      timestamp < removed_buffers.front()->GetDecodeTimestamp()) {
-    // The split is in the gap between |range_start_time_| and the first buffer
-    // of the new range so we should set the start time of the new range to
-    // |timestamp| so we preserve part of the gap in the new range.
-    new_range_start_timestamp = timestamp;
-  }
-
-  keyframe_map_.erase(new_beginning_keyframe, keyframe_map_.end());
-  FreeBufferRange(starting_point, buffers_.end());
-
-  // Create a new range with |removed_buffers|.
-  SourceBufferRange* split_range = new SourceBufferRange(
-      gap_policy_, removed_buffers, new_range_start_timestamp,
-      interbuffer_distance_cb_);
-
-  // If the next buffer position is now in |split_range|, update the state of
-  // this range and |split_range| accordingly.
-  if (next_buffer_index_ >= static_cast<int>(buffers_.size())) {
-    split_range->next_buffer_index_ = next_buffer_index_ - keyframe_index;
-
-    int split_range_next_buffer_index = split_range->next_buffer_index_;
-    CHECK_GE(split_range_next_buffer_index, 0);
-    // Note that a SourceBufferRange's |next_buffer_index_| can be the index
-    // of a buffer one beyond what is currently in |buffers_|.
-    CHECK_LE(split_range_next_buffer_index,
-             static_cast<int>(split_range->buffers_.size()));
-
-    ResetNextBufferPosition();
-  }
-
-  return split_range;
-}
-
-SourceBufferRange::BufferQueue::iterator SourceBufferRange::GetBufferItrAt(
-    DecodeTimestamp timestamp, bool skip_given_timestamp) {
-  return skip_given_timestamp
-             ? std::upper_bound(buffers_.begin(), buffers_.end(), timestamp,
-                                CompareTimeDeltaToStreamParserBuffer)
-             : std::lower_bound(buffers_.begin(), buffers_.end(), timestamp,
-                                CompareStreamParserBufferToTimeDelta);
-}
-
-SourceBufferRange::KeyframeMap::iterator SourceBufferRange::GetFirstKeyframeAt(
-    DecodeTimestamp timestamp, bool skip_given_timestamp) {
-  return skip_given_timestamp ? keyframe_map_.upper_bound(timestamp)
-                              : keyframe_map_.lower_bound(timestamp);
-}
-
-SourceBufferRange::KeyframeMap::iterator
-SourceBufferRange::GetFirstKeyframeAtOrBefore(DecodeTimestamp timestamp) {
-  KeyframeMap::iterator result = keyframe_map_.lower_bound(timestamp);
-  // lower_bound() returns the first element >= |timestamp|, so we want the
-  // previous element if it did not return the element exactly equal to
-  // |timestamp|.
-  if (result != keyframe_map_.begin() &&
-      (result == keyframe_map_.end() || result->first != timestamp)) {
-    --result;
-  }
-  return result;
-}
-
-void SourceBufferRange::DeleteAll(BufferQueue* removed_buffers) {
-  TruncateAt(buffers_.begin(), removed_buffers);
-}
-
-bool SourceBufferRange::TruncateAt(DecodeTimestamp timestamp,
-                                   BufferQueue* removed_buffers,
-                                   bool is_exclusive) {
-  // Find the place in |buffers_| where we will begin deleting data.
-  BufferQueue::iterator starting_point =
-      GetBufferItrAt(timestamp, is_exclusive);
-  return TruncateAt(starting_point, removed_buffers);
-}
-
-size_t SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) {
-  DCHECK(!buffers_.empty());
-  DCHECK(!FirstGOPContainsNextBufferPosition());
-  DCHECK(deleted_buffers);
-
-  int buffers_deleted = 0;
-  size_t total_bytes_deleted = 0;
-
-  KeyframeMap::iterator front = keyframe_map_.begin();
-  DCHECK(front != keyframe_map_.end());
-
-  // Delete the keyframe at the start of |keyframe_map_|.
-  keyframe_map_.erase(front);
-
-  // Now we need to delete all the buffers that depend on the keyframe we've
-  // just deleted.
-  int end_index = keyframe_map_.size() > 0
-                      ? keyframe_map_.begin()->second - keyframe_map_index_base_
-                      : buffers_.size();
-
-  // Delete buffers from the beginning of the buffered range up until (but not
-  // including) the next keyframe.
-  for (int i = 0; i < end_index; i++) {
-    size_t bytes_deleted = buffers_.front()->data_size();
-    DCHECK_GE(size_in_bytes_, bytes_deleted);
-    size_in_bytes_ -= bytes_deleted;
-    total_bytes_deleted += bytes_deleted;
-    deleted_buffers->push_back(buffers_.front());
-    buffers_.pop_front();
-    ++buffers_deleted;
-  }
-
-  // Update |keyframe_map_index_base_| to account for the deleted buffers.
-  keyframe_map_index_base_ += buffers_deleted;
-
-  if (next_buffer_index_ > -1) {
-    next_buffer_index_ -= buffers_deleted;
-    CHECK_GE(next_buffer_index_, 0)
-        << next_buffer_index_ << ", deleted " << buffers_deleted;
-  }
-
-  // Invalidate range start time if we've deleted the first buffer of the range.
-  if (buffers_deleted > 0) range_start_time_ = kNoDecodeTimestamp();
-
-  return total_bytes_deleted;
-}
-
-size_t SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) {
-  DCHECK(!buffers_.empty());
-  DCHECK(!LastGOPContainsNextBufferPosition());
-  DCHECK(deleted_buffers);
-
-  // Remove the last GOP's keyframe from the |keyframe_map_|.
-  KeyframeMap::iterator back = keyframe_map_.end();
-  DCHECK_GT(keyframe_map_.size(), 0u);
-  --back;
-
-  // The index of the first buffer in the last GOP is equal to the new size of
-  // |buffers_| after that GOP is deleted.
-  size_t goal_size = back->second - keyframe_map_index_base_;
-  keyframe_map_.erase(back);
-
-  size_t total_bytes_deleted = 0;
-  while (buffers_.size() != goal_size) {
-    size_t bytes_deleted = buffers_.back()->data_size();
-    DCHECK_GE(size_in_bytes_, bytes_deleted);
-    size_in_bytes_ -= bytes_deleted;
-    total_bytes_deleted += bytes_deleted;
-    // We're removing buffers from the back, so push each removed buffer to the
-    // front of |deleted_buffers| so that |deleted_buffers| are in nondecreasing
-    // order.
-    deleted_buffers->push_front(buffers_.back());
-    buffers_.pop_back();
-  }
-
-  return total_bytes_deleted;
-}
-
-size_t SourceBufferRange::GetRemovalGOP(
-    DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp,
-    size_t total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) {
-  size_t bytes_removed = 0;
-
-  KeyframeMap::iterator gop_itr = GetFirstKeyframeAt(start_timestamp, false);
-  if (gop_itr == keyframe_map_.end()) return 0;
-  int keyframe_index = gop_itr->second - keyframe_map_index_base_;
-  BufferQueue::iterator buffer_itr = buffers_.begin() + keyframe_index;
-  KeyframeMap::iterator gop_end = keyframe_map_.end();
-  if (end_timestamp < GetBufferedEndTimestamp())
-    gop_end = GetFirstKeyframeAtOrBefore(end_timestamp);
-
-  // Check if the removal range is within a GOP and skip the loop if so.
-  // [keyframe]...[start_timestamp]...[end_timestamp]...[keyframe]
-  KeyframeMap::iterator gop_itr_prev = gop_itr;
-  if (gop_itr_prev != keyframe_map_.begin() && --gop_itr_prev == gop_end)
-    gop_end = gop_itr;
-
-  while (gop_itr != gop_end && bytes_removed < total_bytes_to_free) {
-    ++gop_itr;
-
-    size_t gop_size = 0;
-    int next_gop_index = gop_itr == keyframe_map_.end()
-                             ? buffers_.size()
-                             : gop_itr->second - keyframe_map_index_base_;
-    BufferQueue::iterator next_gop_start = buffers_.begin() + next_gop_index;
-    for (; buffer_itr != next_gop_start; ++buffer_itr) {
-      gop_size += (*buffer_itr)->data_size();
-    }
-
-    bytes_removed += gop_size;
-  }
-  if (bytes_removed > 0) {
-    *removal_end_timestamp = gop_itr == keyframe_map_.end()
-                                 ? GetBufferedEndTimestamp()
-                                 : gop_itr->first;
-  }
-  return bytes_removed;
-}
-
-bool SourceBufferRange::FirstGOPEarlierThanMediaTime(
-    DecodeTimestamp media_time) const {
-  if (keyframe_map_.size() == 1u)
-    return (GetBufferedEndTimestamp() <= media_time);
-
-  KeyframeMap::const_iterator second_gop = keyframe_map_.begin();
-  ++second_gop;
-  return second_gop->first <= media_time;
-}
-
-bool SourceBufferRange::FirstGOPContainsNextBufferPosition() const {
-  if (!HasNextBufferPosition()) return false;
-
-  // If there is only one GOP, it must contain the next buffer position.
-  if (keyframe_map_.size() == 1u) return true;
-
-  KeyframeMap::const_iterator second_gop = keyframe_map_.begin();
-  ++second_gop;
-  return next_buffer_index_ < second_gop->second - keyframe_map_index_base_;
-}
-
-bool SourceBufferRange::LastGOPContainsNextBufferPosition() const {
-  if (!HasNextBufferPosition()) return false;
-
-  // If there is only one GOP, it must contain the next buffer position.
-  if (keyframe_map_.size() == 1u) return true;
-
-  KeyframeMap::const_iterator last_gop = keyframe_map_.end();
-  --last_gop;
-  return last_gop->second - keyframe_map_index_base_ <= next_buffer_index_;
-}
-
-void SourceBufferRange::FreeBufferRange(
-    const BufferQueue::iterator& starting_point,
-    const BufferQueue::iterator& ending_point) {
-  for (BufferQueue::iterator itr = starting_point; itr != ending_point; ++itr) {
-    size_t itr_data_size = static_cast<size_t>((*itr)->data_size());
-    DCHECK_GE(size_in_bytes_, itr_data_size);
-    size_in_bytes_ -= itr_data_size;
-  }
-  buffers_.erase(starting_point, ending_point);
-}
-
-bool SourceBufferRange::TruncateAt(const BufferQueue::iterator& starting_point,
-                                   BufferQueue* removed_buffers) {
-  DCHECK(!removed_buffers || removed_buffers->empty());
-
-  // Return if we're not deleting anything.
-  if (starting_point == buffers_.end()) return buffers_.empty();
-
-  // Reset the next buffer index if we will be deleting the buffer that's next
-  // in sequence.
-  if (HasNextBufferPosition()) {
-    DecodeTimestamp next_buffer_timestamp = GetNextTimestamp();
-    if (next_buffer_timestamp == kNoDecodeTimestamp() ||
-        next_buffer_timestamp >= (*starting_point)->GetDecodeTimestamp()) {
-      if (HasNextBuffer() && removed_buffers) {
-        int starting_offset = starting_point - buffers_.begin();
-        int next_buffer_offset = next_buffer_index_ - starting_offset;
-        DCHECK_GE(next_buffer_offset, 0);
-        BufferQueue saved(starting_point + next_buffer_offset, buffers_.end());
-        removed_buffers->swap(saved);
-      }
-      ResetNextBufferPosition();
-    }
-  }
-
-  // Remove keyframes from |starting_point| onward.
-  KeyframeMap::iterator starting_point_keyframe =
-      keyframe_map_.lower_bound((*starting_point)->GetDecodeTimestamp());
-  keyframe_map_.erase(starting_point_keyframe, keyframe_map_.end());
-
-  // Remove everything from |starting_point| onward.
-  FreeBufferRange(starting_point, buffers_.end());
-  return buffers_.empty();
-}
-
-bool SourceBufferRange::GetNextBuffer(
-    scoped_refptr<StreamParserBuffer>* out_buffer) {
-  if (!HasNextBuffer()) return false;
-
-  *out_buffer = buffers_[next_buffer_index_];
-  next_buffer_index_++;
-  return true;
-}
-
-bool SourceBufferRange::HasNextBuffer() const {
-  return next_buffer_index_ >= 0 &&
-         next_buffer_index_ < static_cast<int>(buffers_.size());
-}
-
-int SourceBufferRange::GetNextConfigId() const {
-  CHECK(HasNextBuffer()) << next_buffer_index_;
-  // If the next buffer is an audio splice frame, the next effective config id
-  // comes from the first fade out preroll buffer.
-  return buffers_[next_buffer_index_]->GetSpliceBufferConfigId(0);
-}
-
-DecodeTimestamp SourceBufferRange::GetNextTimestamp() const {
-  CHECK(!buffers_.empty()) << next_buffer_index_;
-  CHECK(HasNextBufferPosition())
-      << next_buffer_index_ << ", size=" << buffers_.size();
-
-  if (next_buffer_index_ >= static_cast<int>(buffers_.size())) {
-    return kNoDecodeTimestamp();
-  }
-
-  return buffers_[next_buffer_index_]->GetDecodeTimestamp();
-}
-
-bool SourceBufferRange::HasNextBufferPosition() const {
-  return next_buffer_index_ >= 0;
-}
-
-void SourceBufferRange::ResetNextBufferPosition() { next_buffer_index_ = -1; }
-
-void SourceBufferRange::AppendRangeToEnd(const SourceBufferRange& range,
-                                         bool transfer_current_position) {
-  DCHECK(CanAppendRangeToEnd(range));
-  DCHECK(!buffers_.empty());
-
-  if (transfer_current_position && range.next_buffer_index_ >= 0)
-    next_buffer_index_ = range.next_buffer_index_ + buffers_.size();
-
-  AppendBuffersToEnd(range.buffers_, kNoDecodeTimestamp());
-}
-
-bool SourceBufferRange::CanAppendRangeToEnd(
-    const SourceBufferRange& range) const {
-  return CanAppendBuffersToEnd(range.buffers_, kNoDecodeTimestamp());
-}
-
-bool SourceBufferRange::CanAppendBuffersToEnd(
-    const BufferQueue& buffers,
-    DecodeTimestamp new_buffers_group_start_timestamp) const {
-  DCHECK(!buffers_.empty());
-  if (new_buffers_group_start_timestamp == kNoDecodeTimestamp()) {
-    return IsNextInSequence(buffers.front()->GetDecodeTimestamp());
-  }
-  DCHECK(new_buffers_group_start_timestamp >= GetEndTimestamp());
-  DCHECK(buffers.front()->GetDecodeTimestamp() >=
-         new_buffers_group_start_timestamp);
-  return IsNextInSequence(new_buffers_group_start_timestamp);
-}
-
-bool SourceBufferRange::BelongsToRange(DecodeTimestamp timestamp) const {
-  DCHECK(!buffers_.empty());
-
-  return (IsNextInSequence(timestamp) ||
-          (GetStartTimestamp() <= timestamp && timestamp <= GetEndTimestamp()));
-}
-
-bool SourceBufferRange::CanSeekTo(DecodeTimestamp timestamp) const {
-  DecodeTimestamp start_timestamp =
-      std::max(DecodeTimestamp(), GetStartTimestamp() - GetFudgeRoom());
-  return !keyframe_map_.empty() && start_timestamp <= timestamp &&
-         timestamp < GetBufferedEndTimestamp();
-}
-
-bool SourceBufferRange::CompletelyOverlaps(
-    const SourceBufferRange& range) const {
-  return GetStartTimestamp() <= range.GetStartTimestamp() &&
-         GetEndTimestamp() >= range.GetEndTimestamp();
-}
-
-bool SourceBufferRange::EndOverlaps(const SourceBufferRange& range) const {
-  return range.GetStartTimestamp() <= GetEndTimestamp() &&
-         GetEndTimestamp() < range.GetEndTimestamp();
-}
-
-DecodeTimestamp SourceBufferRange::GetStartTimestamp() const {
-  DCHECK(!buffers_.empty());
-  DecodeTimestamp start_timestamp = range_start_time_;
-  if (start_timestamp == kNoDecodeTimestamp())
-    start_timestamp = buffers_.front()->GetDecodeTimestamp();
-  return start_timestamp;
-}
-
-DecodeTimestamp SourceBufferRange::GetEndTimestamp() const {
-  DCHECK(!buffers_.empty());
-  return buffers_.back()->GetDecodeTimestamp();
-}
-
-DecodeTimestamp SourceBufferRange::GetBufferedEndTimestamp() const {
-  DCHECK(!buffers_.empty());
-  base::TimeDelta duration = buffers_.back()->duration();
-  if (duration == kNoTimestamp || duration.is_zero())
-    duration = GetApproximateDuration();
-  return GetEndTimestamp() + duration;
-}
-
-DecodeTimestamp SourceBufferRange::NextKeyframeTimestamp(
-    DecodeTimestamp timestamp) {
-  DCHECK(!keyframe_map_.empty());
-
-  if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp())
-    return kNoDecodeTimestamp();
-
-  KeyframeMap::iterator itr = GetFirstKeyframeAt(timestamp, false);
-  if (itr == keyframe_map_.end()) return kNoDecodeTimestamp();
-
-  // If the timestamp is inside the gap between the start of the coded frame
-  // group and the first buffer, then just pretend there is a keyframe at the
-  // specified timestamp.
-  if (itr == keyframe_map_.begin() && timestamp > range_start_time_ &&
-      timestamp < itr->first) {
-    return timestamp;
-  }
-
-  return itr->first;
-}
-
-DecodeTimestamp SourceBufferRange::KeyframeBeforeTimestamp(
-    DecodeTimestamp timestamp) {
-  DCHECK(!keyframe_map_.empty());
-
-  if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp())
-    return kNoDecodeTimestamp();
-
-  return GetFirstKeyframeAtOrBefore(timestamp)->first;
-}
-
-bool SourceBufferRange::IsNextInSequence(DecodeTimestamp timestamp) const {
-  DecodeTimestamp end = buffers_.back()->GetDecodeTimestamp();
-  return (end == timestamp ||
-          (end < timestamp &&
-           (gap_policy_ == ALLOW_GAPS || timestamp <= end + GetFudgeRoom())));
-}
-
-base::TimeDelta SourceBufferRange::GetFudgeRoom() const {
-  // Because we do not know exactly when is the next timestamp, any buffer
-  // that starts within 2x the approximate duration of a buffer is considered
-  // within this range.
-  return 2 * GetApproximateDuration();
-}
-
-base::TimeDelta SourceBufferRange::GetApproximateDuration() const {
-  base::TimeDelta max_interbuffer_distance = interbuffer_distance_cb_.Run();
-  DCHECK(max_interbuffer_distance != kNoTimestamp);
-  return max_interbuffer_distance;
-}
-
-bool SourceBufferRange::GetBuffersInRange(DecodeTimestamp start,
-                                          DecodeTimestamp end,
-                                          BufferQueue* buffers) {
-  // Find the nearest buffer with a decode timestamp <= start.
-  const DecodeTimestamp first_timestamp = KeyframeBeforeTimestamp(start);
-  if (first_timestamp == kNoDecodeTimestamp()) return false;
-
-  // Find all buffers involved in the range.
-  const size_t previous_size = buffers->size();
-  for (BufferQueue::iterator it = GetBufferItrAt(first_timestamp, false);
-       it != buffers_.end(); ++it) {
-    const scoped_refptr<StreamParserBuffer>& buffer = *it;
-    // Buffers without duration are not supported, so bail if we encounter any.
-    if (buffer->duration() == kNoTimestamp ||
-        buffer->duration() <= base::TimeDelta()) {
-      return false;
-    }
-    if (buffer->end_of_stream() ||
-        buffer->timestamp() >= end.ToPresentationTime()) {
-      break;
-    }
-
-    if (buffer->timestamp() + buffer->duration() <= start.ToPresentationTime())
-      continue;
-    buffers->push_back(buffer);
-  }
-  return previous_size < buffers->size();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/source_buffer_range.h b/cobalt/media/filters/source_buffer_range.h
deleted file mode 100644
index cd23779..0000000
--- a/cobalt/media/filters/source_buffer_range.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_
-#define COBALT_MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_
-
-#include <map>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Helper class representing a range of buffered data. All buffers in a
-// SourceBufferRange are ordered sequentially in decode timestamp order with no
-// gaps.
-class SourceBufferRange {
- public:
-  // Returns the maximum distance in time between any buffer seen in this
-  // stream. Used to estimate the duration of a buffer if its duration is not
-  // known.
-  typedef base::Callback<base::TimeDelta()> InterbufferDistanceCB;
-
-  typedef StreamParser::BufferQueue BufferQueue;
-
-  // Policy for handling large gaps between buffers. Continuous media like
-  // audio & video should use NO_GAPS_ALLOWED. Discontinuous media like
-  // timed text should use ALLOW_GAPS because large differences in timestamps
-  // are common and acceptable.
-  enum GapPolicy { NO_GAPS_ALLOWED, ALLOW_GAPS };
-
-  // Sequential buffers with the same decode timestamp make sense under certain
-  // conditions, typically when the first buffer is a keyframe. Due to some
-  // atypical media append behaviors where a new keyframe might have the same
-  // timestamp as a previous non-keyframe, the playback of the sequence might
-  // involve some throwaway decode work. This method supports detecting this
-  // situation so that callers can log warnings (it returns true in this case
-  // only).
-  // For all other cases, including more typical same-DTS sequences, this method
-  // returns false. Examples of typical situations where DTS of two consecutive
-  // frames can be equal:
-  // - Video: VP8 Alt-Ref frames.
-  // - Video: IPBPBP...: DTS for I frame and for P frame can be equal.
-  // - Text track cues that start at same time.
-  // Returns true if |prev_is_keyframe| and |current_is_keyframe| indicate a
-  // same timestamp situation that is atypical. False is returned otherwise.
-  static bool IsUncommonSameTimestampSequence(bool prev_is_keyframe,
-                                              bool current_is_keyframe);
-
-  // Creates a source buffer range with |new_buffers|. |new_buffers| cannot be
-  // empty and the front of |new_buffers| must be a keyframe.
-  // |range_start_time| refers to the starting timestamp for the coded frame
-  // group to which these buffers belong.
-  SourceBufferRange(GapPolicy gap_policy, const BufferQueue& new_buffers,
-                    DecodeTimestamp range_start_time,
-                    const InterbufferDistanceCB& interbuffer_distance_cb);
-
-  ~SourceBufferRange();
-
-  // Appends |buffers| to the end of the range and updates |keyframe_map_| as
-  // it encounters new keyframes.
-  // If |new_buffers_group_start_timestamp| is kNoDecodeTimestamp(), then the
-  // first buffer in |buffers| must come directly after the last buffer in this
-  // range (within the fudge room).
-  // If |new_buffers_group_start_timestamp| is set otherwise, then that time
-  // must come directly after the last buffer in this range (within the fudge
-  // room). The latter scenario is required when a muxed coded frame group has
-  // such a large jagged start across tracks that its first buffer is not within
-  // the fudge room, yet its group start was.
-  void AppendBuffersToEnd(const BufferQueue& buffers,
-                          DecodeTimestamp new_buffers_group_start_timestamp);
-  bool CanAppendBuffersToEnd(
-      const BufferQueue& buffers,
-      DecodeTimestamp new_buffers_group_start_timestamp) const;
-
-  // Appends the buffers from |range| into this range.
-  // The first buffer in |range| must come directly after the last buffer
-  // in this range.
-  // If |transfer_current_position| is true, |range|'s |next_buffer_index_|
-  // is transferred to this SourceBufferRange.
-  // Note: Use these only to merge existing ranges. |range|'s first buffer
-  // timestamp must be adjacent to this range. No group start timestamp
-  // adjacency is involved in these methods.
-  void AppendRangeToEnd(const SourceBufferRange& range,
-                        bool transfer_current_position);
-  bool CanAppendRangeToEnd(const SourceBufferRange& range) const;
-
-  // Updates |next_buffer_index_| to point to the Buffer containing |timestamp|.
-  // Assumes |timestamp| is valid and in this range.
-  void Seek(DecodeTimestamp timestamp);
-
-  // Updates |next_buffer_index_| to point to next keyframe after or equal to
-  // |timestamp|.
-  void SeekAheadTo(DecodeTimestamp timestamp);
-
-  // Updates |next_buffer_index_| to point to next keyframe strictly after
-  // |timestamp|.
-  void SeekAheadPast(DecodeTimestamp timestamp);
-
-  // Seeks to the beginning of the range.
-  void SeekToStart();
-
-  // Finds the next keyframe from |buffers_| starting at or after |timestamp|
-  // and creates and returns a new SourceBufferRange with the buffers from that
-  // keyframe onward. The buffers in the new SourceBufferRange are moved out of
-  // this range. If there is no keyframe at or after |timestamp|, SplitRange()
-  // returns null and this range is unmodified. This range can become empty if
-  // |timestamp| <= the DTS of the first buffer in this range.
-  SourceBufferRange* SplitRange(DecodeTimestamp timestamp);
-
-  // Deletes the buffers from this range starting at |timestamp|, exclusive if
-  // |is_exclusive| is true, inclusive otherwise.
-  // Resets |next_buffer_index_| if the buffer at |next_buffer_index_| was
-  // deleted, and deletes the |keyframe_map_| entries for the buffers that
-  // were removed.
-  // |deleted_buffers| contains the buffers that were deleted from this range,
-  // starting at the buffer that had been at |next_buffer_index_|.
-  // Returns true if everything in the range was deleted. Otherwise
-  // returns false.
-  bool TruncateAt(DecodeTimestamp timestamp, BufferQueue* deleted_buffers,
-                  bool is_exclusive);
-  // Deletes all buffers in range.
-  void DeleteAll(BufferQueue* deleted_buffers);
-
-  // Deletes a GOP from the front or back of the range and moves these
-  // buffers into |deleted_buffers|. Returns the number of bytes deleted from
-  // the range (i.e. the size in bytes of |deleted_buffers|).
-  // This range must NOT be empty when these methods are called.
-  // The GOP being deleted must NOT contain the next buffer position.
-  size_t DeleteGOPFromFront(BufferQueue* deleted_buffers);
-  size_t DeleteGOPFromBack(BufferQueue* deleted_buffers);
-
-  // Gets the range of GOP to secure at least |bytes_to_free| from
-  // [|start_timestamp|, |end_timestamp|).
-  // Returns the size of the buffers to secure if the buffers of
-  // [|start_timestamp|, |end_removal_timestamp|) is removed.
-  // Will not update |end_removal_timestamp| if the returned size is 0.
-  size_t GetRemovalGOP(DecodeTimestamp start_timestamp,
-                       DecodeTimestamp end_timestamp, size_t bytes_to_free,
-                       DecodeTimestamp* end_removal_timestamp);
-
-  // Returns true iff the buffered end time of the first GOP in this range is
-  // at or before |media_time|.
-  bool FirstGOPEarlierThanMediaTime(DecodeTimestamp media_time) const;
-
-  // Indicates whether the GOP at the beginning or end of the range contains the
-  // next buffer position.
-  bool FirstGOPContainsNextBufferPosition() const;
-  bool LastGOPContainsNextBufferPosition() const;
-
-  // Updates |out_buffer| with the next buffer in presentation order. Seek()
-  // must be called before calls to GetNextBuffer(), and buffers are returned
-  // in order from the last call to Seek(). Returns true if |out_buffer| is
-  // filled with a valid buffer, false if there is not enough data to fulfill
-  // the request.
-  bool GetNextBuffer(scoped_refptr<StreamParserBuffer>* out_buffer);
-  bool HasNextBuffer() const;
-
-  // Returns the config ID for the buffer that will be returned by
-  // GetNextBuffer().
-  int GetNextConfigId() const;
-
-  // Returns true if the range knows the position of the next buffer it should
-  // return, i.e. it has been Seek()ed. This does not necessarily mean that it
-  // has the next buffer yet.
-  bool HasNextBufferPosition() const;
-
-  // Resets this range to an "unseeked" state.
-  void ResetNextBufferPosition();
-
-  // Returns the timestamp of the next buffer that will be returned from
-  // GetNextBuffer(), or kNoTimestamp if the timestamp is unknown.
-  DecodeTimestamp GetNextTimestamp() const;
-
-  // Returns the start timestamp of the range.
-  DecodeTimestamp GetStartTimestamp() const;
-
-  // Returns the timestamp of the last buffer in the range.
-  DecodeTimestamp GetEndTimestamp() const;
-
-  // Returns the timestamp for the end of the buffered region in this range.
-  // This is an approximation if the duration for the last buffer in the range
-  // is unset.
-  DecodeTimestamp GetBufferedEndTimestamp() const;
-
-  // Gets the timestamp for the keyframe that is after |timestamp|. If
-  // there isn't a keyframe in the range after |timestamp| then kNoTimestamp
-  // is returned. If |timestamp| is in the "gap" between the value  returned by
-  // GetStartTimestamp() and the timestamp on the first buffer in |buffers_|,
-  // then |timestamp| is returned.
-  DecodeTimestamp NextKeyframeTimestamp(DecodeTimestamp timestamp);
-
-  // Gets the timestamp for the closest keyframe that is <= |timestamp|. If
-  // there isn't a keyframe before |timestamp| or |timestamp| is outside
-  // this range, then kNoTimestamp is returned.
-  DecodeTimestamp KeyframeBeforeTimestamp(DecodeTimestamp timestamp);
-
-  // Returns whether a buffer with a starting timestamp of |timestamp| would
-  // belong in this range. This includes a buffer that would be appended to
-  // the end of the range.
-  bool BelongsToRange(DecodeTimestamp timestamp) const;
-
-  // Returns true if the range has enough data to seek to the specified
-  // |timestamp|, false otherwise.
-  bool CanSeekTo(DecodeTimestamp timestamp) const;
-
-  // Returns true if this range's buffered timespan completely overlaps the
-  // buffered timespan of |range|.
-  bool CompletelyOverlaps(const SourceBufferRange& range) const;
-
-  // Returns true if the end of this range contains buffers that overlaps with
-  // the beginning of |range|.
-  bool EndOverlaps(const SourceBufferRange& range) const;
-
-  // Returns true if |timestamp| is the timestamp of the next buffer in
-  // sequence after |buffers_.back()|, false otherwise.
-  bool IsNextInSequence(DecodeTimestamp timestamp) const;
-
-  // Adds all buffers which overlap [start, end) to the end of |buffers|.  If
-  // no buffers exist in the range returns false, true otherwise.
-  bool GetBuffersInRange(DecodeTimestamp start, DecodeTimestamp end,
-                         BufferQueue* buffers);
-
-  size_t size_in_bytes() const { return size_in_bytes_; }
-
- private:
-  typedef std::map<DecodeTimestamp, int> KeyframeMap;
-
-  // Called during AppendBuffersToEnd to adjust estimated duration at the
-  // end of the last append to match the delta in timestamps between
-  // the last append and the upcoming append. This is a workaround for
-  // WebM media where a duration is not always specified.
-  void AdjustEstimatedDurationForNewAppend(const BufferQueue& new_buffers);
-
-  // Seeks the range to the next keyframe after |timestamp|. If
-  // |skip_given_timestamp| is true, the seek will go to a keyframe with a
-  // timestamp strictly greater than |timestamp|.
-  void SeekAhead(DecodeTimestamp timestamp, bool skip_given_timestamp);
-
-  // Returns an iterator in |buffers_| pointing to the buffer at |timestamp|.
-  // If |skip_given_timestamp| is true, this returns the first buffer with
-  // timestamp greater than |timestamp|.
-  BufferQueue::iterator GetBufferItrAt(DecodeTimestamp timestamp,
-                                       bool skip_given_timestamp);
-
-  // Returns an iterator in |keyframe_map_| pointing to the next keyframe after
-  // |timestamp|. If |skip_given_timestamp| is true, this returns the first
-  // keyframe with a timestamp strictly greater than |timestamp|.
-  KeyframeMap::iterator GetFirstKeyframeAt(DecodeTimestamp timestamp,
-                                           bool skip_given_timestamp);
-
-  // Returns an iterator in |keyframe_map_| pointing to the first keyframe
-  // before or at |timestamp|.
-  KeyframeMap::iterator GetFirstKeyframeAtOrBefore(DecodeTimestamp timestamp);
-
-  // Helper method to delete buffers in |buffers_| starting at
-  // |starting_point|, an iterator in |buffers_|.
-  // Returns true if everything in the range was removed. Returns
-  // false if the range still contains buffers.
-  bool TruncateAt(const BufferQueue::iterator& starting_point,
-                  BufferQueue* deleted_buffers);
-
-  // Frees the buffers in |buffers_| from [|start_point|,|ending_point|) and
-  // updates the |size_in_bytes_| accordingly. Does not update |keyframe_map_|.
-  void FreeBufferRange(const BufferQueue::iterator& starting_point,
-                       const BufferQueue::iterator& ending_point);
-
-  // Returns the distance in time estimating how far from the beginning or end
-  // of this range a buffer can be to considered in the range.
-  base::TimeDelta GetFudgeRoom() const;
-
-  // Returns the approximate duration of a buffer in this range.
-  base::TimeDelta GetApproximateDuration() const;
-
-  // Keeps track of whether gaps are allowed.
-  const GapPolicy gap_policy_;
-
-  // An ordered list of buffers in this range.
-  BufferQueue buffers_;
-
-  // Maps keyframe timestamps to its index position in |buffers_|.
-  KeyframeMap keyframe_map_;
-
-  // Index base of all positions in |keyframe_map_|. In other words, the
-  // real position of entry |k| of |keyframe_map_| in the range is:
-  //   keyframe_map_[k] - keyframe_map_index_base_
-  int keyframe_map_index_base_;
-
-  // Index into |buffers_| for the next buffer to be returned by
-  // GetNextBuffer(), set to -1 before Seek().
-  int next_buffer_index_;
-
-  // If the first buffer in this range is the beginning of a coded frame group,
-  // |range_start_time_| is the time when the coded frame group begins. This is
-  // especially important in muxed media where the first coded frames for each
-  // track do not necessarily begin at the same time.
-  // |range_start_time_| may be <= the timestamp of the first buffer in
-  // |buffers_|. |range_start_time_| is kNoDecodeTimestamp() if this range does
-  // not start at the beginning of a coded frame group, which can happen by
-  // range removal or split when we don't have a way of knowing, across
-  // potentially multiple muxed streams, the coded frame group start timestamp
-  // for the new range.
-  DecodeTimestamp range_start_time_;
-
-  // Called to get the largest interbuffer distance seen so far in the stream.
-  InterbufferDistanceCB interbuffer_distance_cb_;
-
-  // Stores the amount of memory taken up by the data in |buffers_|.
-  size_t size_in_bytes_;
-
-  DISALLOW_COPY_AND_ASSIGN(SourceBufferRange);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_
diff --git a/cobalt/media/filters/source_buffer_state.cc b/cobalt/media/filters/source_buffer_state.cc
deleted file mode 100644
index c7a4485..0000000
--- a/cobalt/media/filters/source_buffer_state.cc
+++ /dev/null
@@ -1,957 +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 "cobalt/media/filters/source_buffer_state.h"
-
-#include <algorithm>
-#include <memory>
-#include <set>
-
-#include "base/callback_helpers.h"
-#include "base/command_line.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/media/base/media_track.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/mime_util.h"
-#include "cobalt/media/filters/chunk_demuxer.h"
-#include "cobalt/media/filters/frame_processor.h"
-#include "cobalt/media/filters/source_buffer_stream.h"
-
-namespace cobalt {
-namespace media {
-
-enum {
-  // Limits the number of MEDIA_LOG() calls warning the user that a muxed stream
-  // media segment is missing a block from at least one of the audio or video
-  // tracks.
-  kMaxMissingTrackInSegmentLogs = 10,
-};
-
-namespace {
-
-TimeDelta EndTimestamp(const StreamParser::BufferQueue& queue) {
-  return queue.back()->timestamp() + queue.back()->duration();
-}
-
-// Check the input |text_configs| and |bytestream_ids| and return false if
-// duplicate track ids are detected.
-bool CheckBytestreamTrackIds(
-    const MediaTracks& tracks,
-    const StreamParser::TextTrackConfigMap& text_configs) {
-  std::set<StreamParser::TrackId> bytestream_ids;
-  for (size_t i = 0; i < tracks.tracks().size(); ++i) {
-    const StreamParser::TrackId& track_id =
-        tracks.tracks()[i]->bytestream_track_id();
-    if (bytestream_ids.find(track_id) != bytestream_ids.end()) {
-      return false;
-    }
-    bytestream_ids.insert(track_id);
-  }
-  for (StreamParser::TextTrackConfigMap::const_iterator iter =
-           text_configs.begin();
-       iter != text_configs.end(); ++iter) {
-    const StreamParser::TrackId& track_id = iter->first;
-    if (bytestream_ids.find(track_id) != bytestream_ids.end()) {
-      return false;
-    }
-    bytestream_ids.insert(track_id);
-  }
-  return true;
-}
-
-}  // namespace
-
-// List of time ranges for each SourceBuffer.
-// static
-Ranges<TimeDelta> SourceBufferState::ComputeRangesIntersection(
-    const RangesList& active_ranges, bool ended) {
-  // TODO(servolk): Perhaps this can be removed in favor of blink implementation
-  // (MediaSource::buffered)? Currently this is only used on Android and for
-  // updating DemuxerHost's buffered ranges during AppendData() as well as
-  // SourceBuffer.buffered property implementation.
-  // Implementation of HTMLMediaElement.buffered algorithm in MSE spec.
-  // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#dom-htmlmediaelement.buffered
-
-  // Step 1: If activeSourceBuffers.length equals 0 then return an empty
-  //  TimeRanges object and abort these steps.
-  if (active_ranges.empty()) return Ranges<TimeDelta>();
-
-  // Step 2: Let active ranges be the ranges returned by buffered for each
-  //  SourceBuffer object in activeSourceBuffers.
-  // Step 3: Let highest end time be the largest range end time in the active
-  //  ranges.
-  TimeDelta highest_end_time;
-  for (size_t i = 0; i < active_ranges.size(); ++i) {
-    if (!active_ranges[i].size()) continue;
-
-    highest_end_time = std::max(
-        highest_end_time, active_ranges[i].end(active_ranges[i].size() - 1));
-  }
-
-  // Step 4: Let intersection ranges equal a TimeRange object containing a
-  //  single range from 0 to highest end time.
-  Ranges<TimeDelta> intersection_ranges;
-  intersection_ranges.Add(TimeDelta(), highest_end_time);
-
-  // Step 5: For each SourceBuffer object in activeSourceBuffers run the
-  //  following steps:
-  for (size_t i = 0; i < active_ranges.size(); ++i) {
-    // Step 5.1: Let source ranges equal the ranges returned by the buffered
-    //  attribute on the current SourceBuffer.
-    Ranges<TimeDelta> source_ranges = active_ranges[i];
-
-    // Step 5.2: If readyState is "ended", then set the end time on the last
-    //  range in source ranges to highest end time.
-    if (ended && source_ranges.size()) {
-      source_ranges.Add(source_ranges.start(source_ranges.size() - 1),
-                        highest_end_time);
-    }
-
-    // Step 5.3: Let new intersection ranges equal the intersection between
-    // the intersection ranges and the source ranges.
-    // Step 5.4: Replace the ranges in intersection ranges with the new
-    // intersection ranges.
-    intersection_ranges = intersection_ranges.IntersectionWith(source_ranges);
-  }
-
-  return intersection_ranges;
-}
-
-SourceBufferState::SourceBufferState(
-    std::unique_ptr<StreamParser> stream_parser,
-    std::unique_ptr<FrameProcessor> frame_processor,
-    const CreateDemuxerStreamCB& create_demuxer_stream_cb,
-    const scoped_refptr<MediaLog>& media_log,
-    DecoderBuffer::Allocator* buffer_allocator)
-    : num_missing_track_logs_(0),
-      create_demuxer_stream_cb_(create_demuxer_stream_cb),
-      timestamp_offset_during_append_(NULL),
-      parsing_media_segment_(false),
-      stream_parser_(stream_parser.release()),
-      frame_processor_(frame_processor.release()),
-      media_log_(media_log),
-      state_(UNINITIALIZED),
-      append_in_progress_(false),
-      first_init_segment_received_(false),
-      auto_update_timestamp_offset_(false),
-      buffer_allocator_(buffer_allocator) {
-  DCHECK(!create_demuxer_stream_cb_.is_null());
-  DCHECK(frame_processor_);
-}
-
-SourceBufferState::~SourceBufferState() { Shutdown(); }
-
-void SourceBufferState::Init(
-    const StreamParser::InitCB& init_cb, const std::string& expected_codecs,
-    const StreamParser::EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-    const NewTextTrackCB& new_text_track_cb) {
-  DCHECK_EQ(state_, UNINITIALIZED);
-  new_text_track_cb_ = new_text_track_cb;
-  init_cb_ = init_cb;
-
-  std::vector<std::string> expected_codecs_parsed;
-  ParseCodecString(expected_codecs, &expected_codecs_parsed, false);
-
-  std::vector<AudioCodec> expected_acodecs;
-  std::vector<VideoCodec> expected_vcodecs;
-  for (size_t i = 0; i < expected_codecs_parsed.size(); ++i) {
-    AudioCodec acodec = StringToAudioCodec(expected_codecs_parsed[i]);
-    if (acodec != kUnknownAudioCodec) {
-      expected_audio_codecs_.push_back(acodec);
-      continue;
-    }
-    VideoCodec vcodec = StringToVideoCodec(expected_codecs_parsed[i]);
-    if (vcodec != kUnknownVideoCodec) {
-      expected_video_codecs_.push_back(vcodec);
-      continue;
-    }
-    MEDIA_LOG(INFO, media_log_)
-        << "Unrecognized media codec: " << expected_codecs_parsed[i];
-  }
-
-  state_ = PENDING_PARSER_CONFIG;
-  stream_parser_->Init(
-      base::Bind(&SourceBufferState::OnSourceInitDone, base::Unretained(this)),
-      base::Bind(&SourceBufferState::OnNewConfigs, base::Unretained(this),
-                 expected_codecs),
-      base::Bind(&SourceBufferState::OnNewBuffers, base::Unretained(this)),
-      new_text_track_cb_.is_null(), encrypted_media_init_data_cb,
-      base::Bind(&SourceBufferState::OnNewMediaSegment, base::Unretained(this)),
-      base::Bind(&SourceBufferState::OnEndOfMediaSegment,
-                 base::Unretained(this)),
-      media_log_);
-}
-
-void SourceBufferState::SetSequenceMode(bool sequence_mode) {
-  DCHECK(!parsing_media_segment_);
-
-  frame_processor_->SetSequenceMode(sequence_mode);
-}
-
-void SourceBufferState::SetGroupStartTimestampIfInSequenceMode(
-    base::TimeDelta timestamp_offset) {
-  DCHECK(!parsing_media_segment_);
-
-  frame_processor_->SetGroupStartTimestampIfInSequenceMode(timestamp_offset);
-}
-
-void SourceBufferState::SetTracksWatcher(
-    const Demuxer::MediaTracksUpdatedCB& tracks_updated_cb) {
-  DCHECK(init_segment_received_cb_.is_null());
-  DCHECK(!tracks_updated_cb.is_null());
-  init_segment_received_cb_ = tracks_updated_cb;
-}
-
-bool SourceBufferState::Append(const uint8_t* data, size_t length,
-                               TimeDelta append_window_start,
-                               TimeDelta append_window_end,
-                               TimeDelta* timestamp_offset) {
-  append_in_progress_ = true;
-  DCHECK(timestamp_offset);
-  DCHECK(!timestamp_offset_during_append_);
-  append_window_start_during_append_ = append_window_start;
-  append_window_end_during_append_ = append_window_end;
-  timestamp_offset_during_append_ = timestamp_offset;
-
-  // TODO(wolenetz/acolwell): Curry and pass a NewBuffersCB here bound with
-  // append window and timestamp offset pointer. See http://crbug.com/351454.
-  bool result = stream_parser_->Parse(data, length);
-  if (!result) {
-    MEDIA_LOG(ERROR, media_log_)
-        << __func__ << ": stream parsing failed. Data size=" << length
-        << " append_window_start=" << append_window_start.InSecondsF()
-        << " append_window_end=" << append_window_end.InSecondsF();
-  }
-  timestamp_offset_during_append_ = NULL;
-  append_in_progress_ = false;
-  return result;
-}
-
-void SourceBufferState::ResetParserState(TimeDelta append_window_start,
-                                         TimeDelta append_window_end,
-                                         base::TimeDelta* timestamp_offset) {
-  DCHECK(timestamp_offset);
-  DCHECK(!timestamp_offset_during_append_);
-  timestamp_offset_during_append_ = timestamp_offset;
-  append_window_start_during_append_ = append_window_start;
-  append_window_end_during_append_ = append_window_end;
-
-  stream_parser_->Flush();
-  timestamp_offset_during_append_ = NULL;
-
-  frame_processor_->Reset();
-  parsing_media_segment_ = false;
-  media_segment_has_data_for_track_.clear();
-}
-
-void SourceBufferState::Remove(TimeDelta start, TimeDelta end,
-                               TimeDelta duration) {
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    it->second->Remove(start, end, duration);
-  }
-
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    it->second->Remove(start, end, duration);
-  }
-
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    it->second->Remove(start, end, duration);
-  }
-}
-
-bool SourceBufferState::EvictCodedFrames(DecodeTimestamp media_time,
-                                         size_t newDataSize) {
-  size_t total_buffered_size = 0;
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    total_buffered_size += it->second->GetBufferedSize();
-  }
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    total_buffered_size += it->second->GetBufferedSize();
-  }
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    total_buffered_size += it->second->GetBufferedSize();
-  }
-
-  DVLOG(3) << __func__ << " media_time=" << media_time.InSecondsF()
-           << " newDataSize=" << newDataSize
-           << " total_buffered_size=" << total_buffered_size;
-
-  if (total_buffered_size == 0) return true;
-
-  bool success = true;
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    uint64_t curr_size = it->second->GetBufferedSize();
-    if (curr_size == 0) continue;
-    uint64_t estimated_new_size = newDataSize * curr_size / total_buffered_size;
-    DCHECK_LE(estimated_new_size, SIZE_MAX);
-    success &= it->second->EvictCodedFrames(
-        media_time, static_cast<size_t>(estimated_new_size));
-  }
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    uint64_t curr_size = it->second->GetBufferedSize();
-    if (curr_size == 0) continue;
-    uint64_t estimated_new_size = newDataSize * curr_size / total_buffered_size;
-    DCHECK_LE(estimated_new_size, SIZE_MAX);
-    success &= it->second->EvictCodedFrames(
-        media_time, static_cast<size_t>(estimated_new_size));
-  }
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    uint64_t curr_size = it->second->GetBufferedSize();
-    if (curr_size == 0) continue;
-    uint64_t estimated_new_size = newDataSize * curr_size / total_buffered_size;
-    DCHECK_LE(estimated_new_size, SIZE_MAX);
-    success &= it->second->EvictCodedFrames(
-        media_time, static_cast<size_t>(estimated_new_size));
-  }
-
-  DVLOG(3) << __func__ << " success=" << success;
-  return success;
-}
-
-Ranges<TimeDelta> SourceBufferState::GetBufferedRanges(TimeDelta duration,
-                                                       bool ended) const {
-  RangesList ranges_list;
-  for (DemuxerStreamMap::const_iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    ranges_list.push_back(it->second->GetBufferedRanges(duration));
-  }
-
-  for (DemuxerStreamMap::const_iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    ranges_list.push_back(it->second->GetBufferedRanges(duration));
-  }
-
-  for (DemuxerStreamMap::const_iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    ranges_list.push_back(it->second->GetBufferedRanges(duration));
-  }
-
-  return ComputeRangesIntersection(ranges_list, ended);
-}
-
-Ranges<TimeDelta> SourceBufferState::GetAudioBufferedRanges(TimeDelta duration,
-                                                            bool ended) const {
-  RangesList ranges_list;
-  for (DemuxerStreamMap::const_iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    ranges_list.push_back(it->second->GetBufferedRanges(duration));
-  }
-
-  return ComputeRangesIntersection(ranges_list, ended);
-}
-
-TimeDelta SourceBufferState::GetVideoSeekKeyframeTimestamp() const {
-  if (video_streams_.empty()) {
-    return kNoTimestamp;
-  }
-  DCHECK_EQ(video_streams_.size(), 1);
-  return video_streams_.begin()->second->GetSeekKeyframeTimestamp();
-}
-
-TimeDelta SourceBufferState::GetHighestPresentationTimestamp() const {
-  TimeDelta max_pts;
-
-  for (DemuxerStreamMap::const_iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    max_pts = std::max(max_pts, it->second->GetHighestPresentationTimestamp());
-  }
-
-  for (DemuxerStreamMap::const_iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    max_pts = std::max(max_pts, it->second->GetHighestPresentationTimestamp());
-  }
-
-  for (DemuxerStreamMap::const_iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    max_pts = std::max(max_pts, it->second->GetHighestPresentationTimestamp());
-  }
-
-  return max_pts;
-}
-
-TimeDelta SourceBufferState::GetMaxBufferedDuration() const {
-  TimeDelta max_duration;
-
-  for (DemuxerStreamMap::const_iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    max_duration = std::max(max_duration, it->second->GetBufferedDuration());
-  }
-
-  for (DemuxerStreamMap::const_iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    max_duration = std::max(max_duration, it->second->GetBufferedDuration());
-  }
-
-  for (DemuxerStreamMap::const_iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    max_duration = std::max(max_duration, it->second->GetBufferedDuration());
-  }
-
-  return max_duration;
-}
-
-void SourceBufferState::StartReturningData() {
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    it->second->StartReturningData();
-  }
-
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    it->second->StartReturningData();
-  }
-
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    it->second->StartReturningData();
-  }
-}
-
-void SourceBufferState::AbortReads() {
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    it->second->AbortReads();
-  }
-
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    it->second->AbortReads();
-  }
-
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    it->second->AbortReads();
-  }
-}
-
-void SourceBufferState::Seek(TimeDelta seek_time) {
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    it->second->Seek(seek_time);
-  }
-
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    it->second->Seek(seek_time);
-  }
-
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    it->second->Seek(seek_time);
-  }
-}
-
-void SourceBufferState::CompletePendingReadIfPossible() {
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    it->second->CompletePendingReadIfPossible();
-  }
-
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    it->second->CompletePendingReadIfPossible();
-  }
-
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    it->second->CompletePendingReadIfPossible();
-  }
-}
-
-void SourceBufferState::OnSetDuration(TimeDelta duration) {
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    it->second->OnSetDuration(duration);
-  }
-
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    it->second->OnSetDuration(duration);
-  }
-
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    it->second->OnSetDuration(duration);
-  }
-}
-
-void SourceBufferState::MarkEndOfStream() {
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    it->second->MarkEndOfStream();
-  }
-
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    it->second->MarkEndOfStream();
-  }
-
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    it->second->MarkEndOfStream();
-  }
-}
-
-void SourceBufferState::UnmarkEndOfStream() {
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    it->second->UnmarkEndOfStream();
-  }
-
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    it->second->UnmarkEndOfStream();
-  }
-
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    it->second->UnmarkEndOfStream();
-  }
-}
-
-void SourceBufferState::Shutdown() {
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    it->second->Shutdown();
-  }
-
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    it->second->Shutdown();
-  }
-
-  for (DemuxerStreamMap::iterator it = text_streams_.begin();
-       it != text_streams_.end(); ++it) {
-    it->second->Shutdown();
-  }
-}
-
-void SourceBufferState::SetMemoryLimits(DemuxerStream::Type type,
-                                        size_t memory_limit) {
-  switch (type) {
-    case DemuxerStream::AUDIO:
-      for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-           it != audio_streams_.end(); ++it) {
-        it->second->SetStreamMemoryLimit(memory_limit);
-      }
-      break;
-    case DemuxerStream::VIDEO:
-      for (DemuxerStreamMap::iterator it = video_streams_.begin();
-           it != video_streams_.end(); ++it) {
-        it->second->SetStreamMemoryLimit(memory_limit);
-      }
-      break;
-    case DemuxerStream::TEXT:
-      for (DemuxerStreamMap::iterator it = text_streams_.begin();
-           it != text_streams_.end(); ++it) {
-        it->second->SetStreamMemoryLimit(memory_limit);
-      }
-      break;
-    case DemuxerStream::UNKNOWN:
-    case DemuxerStream::NUM_TYPES:
-      NOTREACHED();
-      break;
-  }
-}
-
-bool SourceBufferState::IsSeekWaitingForData() const {
-  for (DemuxerStreamMap::const_iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    if (it->second->IsSeekWaitingForData()) return true;
-  }
-
-  for (DemuxerStreamMap::const_iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    if (it->second->IsSeekWaitingForData()) return true;
-  }
-
-  // NOTE: We are intentionally not checking the text tracks
-  // because text tracks are discontinuous and may not have data
-  // for the seek position. This is ok and playback should not be
-  // stalled because we don't have cues. If cues, with timestamps after
-  // the seek time, eventually arrive they will be delivered properly
-  // in response to ChunkDemuxerStream::Read() calls.
-
-  return false;
-}
-
-bool SourceBufferState::OnNewConfigs(
-    std::string expected_codecs, std::unique_ptr<MediaTracks> tracks,
-    const StreamParser::TextTrackConfigMap& text_configs) {
-  DCHECK(tracks.get());
-  DVLOG(1) << __func__ << " expected_codecs=" << expected_codecs
-           << " tracks=" << tracks->tracks().size();
-  DCHECK_GE(state_, PENDING_PARSER_CONFIG);
-
-  // Check that there is no clashing bytestream track ids.
-  if (!CheckBytestreamTrackIds(*tracks, text_configs)) {
-    MEDIA_LOG(ERROR, media_log_) << "Duplicate bytestream track ids detected";
-    for (size_t i = 0; i < tracks->tracks().size(); ++i) {
-      const StreamParser::TrackId& track_id =
-          tracks->tracks()[i]->bytestream_track_id();
-      MEDIA_LOG(DEBUG, media_log_)
-          << TrackTypeToStr(tracks->tracks()[i]->type()) << " track "
-          << " bytestream track id=" << track_id;
-    }
-    return false;
-  }
-
-  // MSE spec allows new configs to be emitted only during Append, but not
-  // during Flush or parser reset operations.
-  CHECK(append_in_progress_);
-
-  bool success = true;
-
-  // TODO(wolenetz): Update codec string strictness, if necessary, once spec
-  // issue https://github.com/w3c/media-source/issues/161 is resolved.
-  std::vector<AudioCodec> expected_acodecs = expected_audio_codecs_;
-  std::vector<VideoCodec> expected_vcodecs = expected_video_codecs_;
-
-  FrameProcessor::TrackIdChanges track_id_changes;
-  for (size_t i = 0; i < tracks->tracks().size(); ++i) {
-    StreamParser::TrackId track_id = tracks->tracks()[i]->bytestream_track_id();
-
-    if (tracks->tracks()[i]->type() == MediaTrack::Audio) {
-      AudioDecoderConfig audio_config = tracks->getAudioConfig(track_id);
-      DVLOG(1) << "Audio track_id=" << track_id
-               << " config: " << audio_config.AsHumanReadableString();
-      DCHECK(audio_config.IsValidConfig());
-
-      std::vector<AudioCodec>::iterator it =
-          std::find(expected_acodecs.begin(), expected_acodecs.end(),
-                    audio_config.codec());
-      if (it == expected_acodecs.end()) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Audio stream codec " << GetCodecName(audio_config.codec())
-            << " doesn't match SourceBuffer codecs.";
-        return false;
-      }
-      expected_acodecs.erase(it);
-
-      ChunkDemuxerStream* stream = NULL;
-      if (!first_init_segment_received_) {
-        DCHECK(audio_streams_.find(track_id) == audio_streams_.end());
-        stream = create_demuxer_stream_cb_.Run(DemuxerStream::AUDIO);
-        if (!stream || !frame_processor_->AddTrack(track_id, stream)) {
-          MEDIA_LOG(ERROR, media_log_) << "Failed to create audio stream.";
-          return false;
-        }
-        audio_streams_[track_id] = stream;
-        media_log_->SetBooleanProperty("found_audio_stream", true);
-        media_log_->SetStringProperty("audio_codec_name",
-                                      GetCodecName(audio_config.codec()));
-      } else {
-        if (audio_streams_.size() > 1) {
-          DemuxerStreamMap::iterator it = audio_streams_.find(track_id);
-          if (it != audio_streams_.end()) stream = it->second;
-        } else {
-          // If there is only one audio track then bytestream id might change in
-          // a new init segment. So update our state and notify frame processor.
-          DemuxerStreamMap::iterator it = audio_streams_.begin();
-          if (it != audio_streams_.end()) {
-            stream = it->second;
-            if (it->first != track_id) {
-              track_id_changes[it->first] = track_id;
-              audio_streams_[track_id] = stream;
-              audio_streams_.erase(it->first);
-            }
-          }
-        }
-        if (!stream) {
-          MEDIA_LOG(ERROR, media_log_) << "Got unexpected audio track"
-                                       << " track_id=" << track_id;
-          return false;
-        }
-      }
-
-      tracks->tracks()[i]->set_id(stream->media_track_id());
-      frame_processor_->OnPossibleAudioConfigUpdate(audio_config);
-      success &= stream->UpdateAudioConfig(audio_config, media_log_);
-    } else if (tracks->tracks()[i]->type() == MediaTrack::Video) {
-      VideoDecoderConfig video_config = tracks->getVideoConfig(track_id);
-      DVLOG(1) << "Video track_id=" << track_id
-               << " config: " << video_config.AsHumanReadableString();
-      DCHECK(video_config.IsValidConfig());
-
-      std::vector<VideoCodec>::iterator it =
-          std::find(expected_vcodecs.begin(), expected_vcodecs.end(),
-                    video_config.codec());
-      if (it == expected_vcodecs.end()) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Video stream codec " << GetCodecName(video_config.codec())
-            << " doesn't match SourceBuffer codecs.";
-        return false;
-      }
-      expected_vcodecs.erase(it);
-
-      ChunkDemuxerStream* stream = NULL;
-      if (!first_init_segment_received_) {
-        DCHECK(video_streams_.find(track_id) == video_streams_.end());
-        stream = create_demuxer_stream_cb_.Run(DemuxerStream::VIDEO);
-        if (!stream || !frame_processor_->AddTrack(track_id, stream)) {
-          MEDIA_LOG(ERROR, media_log_) << "Failed to create video stream.";
-          return false;
-        }
-        video_streams_[track_id] = stream;
-        media_log_->SetBooleanProperty("found_video_stream", true);
-        media_log_->SetStringProperty("video_codec_name",
-                                      GetCodecName(video_config.codec()));
-      } else {
-        if (video_streams_.size() > 1) {
-          DemuxerStreamMap::iterator it = video_streams_.find(track_id);
-          if (it != video_streams_.end()) stream = it->second;
-        } else {
-          // If there is only one video track then bytestream id might change in
-          // a new init segment. So update our state and notify frame processor.
-          DemuxerStreamMap::iterator it = video_streams_.begin();
-          if (it != video_streams_.end()) {
-            stream = it->second;
-            if (it->first != track_id) {
-              track_id_changes[it->first] = track_id;
-              video_streams_[track_id] = stream;
-              video_streams_.erase(it->first);
-            }
-          }
-        }
-        if (!stream) {
-          MEDIA_LOG(ERROR, media_log_) << "Got unexpected video track"
-                                       << " track_id=" << track_id;
-          return false;
-        }
-      }
-
-      tracks->tracks()[i]->set_id(stream->media_track_id());
-      buffer_allocator_->UpdateVideoConfig(video_config);
-      success &= stream->UpdateVideoConfig(video_config, media_log_);
-    } else {
-      MEDIA_LOG(ERROR, media_log_) << "Error: unsupported media track type "
-                                   << tracks->tracks()[i]->type();
-      return false;
-    }
-  }
-
-  if (!expected_acodecs.empty() || !expected_vcodecs.empty()) {
-    for (size_t i = 0; i < expected_acodecs.size(); ++i) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Initialization segment misses expected "
-          << GetCodecName(expected_acodecs[i]) << " track.";
-    }
-    for (size_t i = 0; i < expected_vcodecs.size(); ++i) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Initialization segment misses expected "
-          << GetCodecName(expected_vcodecs[i]) << " track.";
-    }
-    return false;
-  }
-
-  if (text_streams_.empty()) {
-    for (StreamParser::TextTrackConfigMap::const_iterator itr =
-             text_configs.begin();
-         itr != text_configs.end(); ++itr) {
-      ChunkDemuxerStream* const text_stream =
-          create_demuxer_stream_cb_.Run(DemuxerStream::TEXT);
-      if (!frame_processor_->AddTrack(itr->first, text_stream)) {
-        success &= false;
-        MEDIA_LOG(ERROR, media_log_) << "Failed to add text track ID "
-                                     << itr->first << " to frame processor.";
-        break;
-      }
-      text_stream->UpdateTextConfig(itr->second, media_log_);
-      text_streams_[itr->first] = text_stream;
-      new_text_track_cb_.Run(text_stream, itr->second);
-    }
-  } else {
-    const size_t text_count = text_streams_.size();
-    if (text_configs.size() != text_count) {
-      success &= false;
-      MEDIA_LOG(ERROR, media_log_)
-          << "The number of text track configs changed.";
-    } else if (text_count == 1) {
-      StreamParser::TextTrackConfigMap::const_iterator config_itr =
-          text_configs.begin();
-      DemuxerStreamMap::iterator stream_itr = text_streams_.begin();
-      ChunkDemuxerStream* text_stream = stream_itr->second;
-      TextTrackConfig old_config = text_stream->text_track_config();
-      TextTrackConfig new_config(
-          config_itr->second.kind(), config_itr->second.label(),
-          config_itr->second.language(), old_config.id());
-      if (!new_config.Matches(old_config)) {
-        success &= false;
-        MEDIA_LOG(ERROR, media_log_)
-            << "New text track config does not match old one.";
-      } else {
-        StreamParser::TrackId old_id = stream_itr->first;
-        StreamParser::TrackId new_id = config_itr->first;
-        if (new_id != old_id) {
-          track_id_changes[old_id] = new_id;
-          text_streams_.erase(old_id);
-          text_streams_[new_id] = text_stream;
-        }
-      }
-    } else {
-      for (StreamParser::TextTrackConfigMap::const_iterator config_itr =
-               text_configs.begin();
-           config_itr != text_configs.end(); ++config_itr) {
-        DemuxerStreamMap::iterator stream_itr =
-            text_streams_.find(config_itr->first);
-        if (stream_itr == text_streams_.end()) {
-          success &= false;
-          MEDIA_LOG(ERROR, media_log_)
-              << "Unexpected text track configuration for track ID "
-              << config_itr->first;
-          break;
-        }
-
-        const TextTrackConfig& new_config = config_itr->second;
-        ChunkDemuxerStream* stream = stream_itr->second;
-        TextTrackConfig old_config = stream->text_track_config();
-        if (!new_config.Matches(old_config)) {
-          success &= false;
-          MEDIA_LOG(ERROR, media_log_)
-              << "New text track config for track ID " << config_itr->first
-              << " does not match old one.";
-          break;
-        }
-      }
-    }
-  }
-
-  if (audio_streams_.empty() && video_streams_.empty()) {
-    DVLOG(1) << __func__ << ": couldn't find a valid audio or video stream";
-    return false;
-  }
-
-  if (!frame_processor_->UpdateTrackIds(track_id_changes)) {
-    DVLOG(1) << __func__ << ": failed to remap track ids in frame processor";
-    return false;
-  }
-
-  frame_processor_->SetAllTrackBuffersNeedRandomAccessPoint();
-
-  if (!first_init_segment_received_) {
-    first_init_segment_received_ = true;
-    SetStreamMemoryLimits();
-  }
-
-  DVLOG(1) << "OnNewConfigs() : " << (success ? "success" : "failed");
-  if (success) {
-    if (state_ == PENDING_PARSER_CONFIG) state_ = PENDING_PARSER_INIT;
-    DCHECK(!init_segment_received_cb_.is_null());
-    init_segment_received_cb_.Run(std::move(tracks));
-  }
-
-  return success;
-}
-
-void SourceBufferState::SetStreamMemoryLimits() {}
-
-void SourceBufferState::OnNewMediaSegment() {
-  DVLOG(2) << "OnNewMediaSegment()";
-  DCHECK_EQ(state_, PARSER_INITIALIZED);
-  parsing_media_segment_ = true;
-  media_segment_has_data_for_track_.clear();
-}
-
-void SourceBufferState::OnEndOfMediaSegment() {
-  DVLOG(2) << "OnEndOfMediaSegment()";
-  DCHECK_EQ(state_, PARSER_INITIALIZED);
-  parsing_media_segment_ = false;
-
-  for (DemuxerStreamMap::iterator it = audio_streams_.begin();
-       it != audio_streams_.end(); ++it) {
-    if (!media_segment_has_data_for_track_[it->first]) {
-      LIMITED_MEDIA_LOG(DEBUG, media_log_, num_missing_track_logs_,
-                        kMaxMissingTrackInSegmentLogs)
-          << "Media segment did not contain any coded frames for track "
-          << it->first
-          << ", mismatching initialization segment. Therefore, MSE"
-             " coded frame processing may not interoperably detect"
-             " discontinuities in appended media.";
-    }
-  }
-  for (DemuxerStreamMap::iterator it = video_streams_.begin();
-       it != video_streams_.end(); ++it) {
-    if (!media_segment_has_data_for_track_[it->first]) {
-      LIMITED_MEDIA_LOG(DEBUG, media_log_, num_missing_track_logs_,
-                        kMaxMissingTrackInSegmentLogs)
-          << "Media segment did not contain any coded frames for track "
-          << it->first
-          << ", mismatching initialization segment. Therefore, MSE"
-             " coded frame processing may not interoperably detect"
-             " discontinuities in appended media.";
-    }
-  }
-}
-
-bool SourceBufferState::OnNewBuffers(
-    const StreamParser::BufferQueueMap& buffer_queue_map) {
-  DVLOG(2) << __func__ << " buffer_queues=" << buffer_queue_map.size();
-  DCHECK_EQ(state_, PARSER_INITIALIZED);
-  DCHECK(timestamp_offset_during_append_);
-  DCHECK(parsing_media_segment_);
-
-  for (StreamParser::BufferQueueMap::const_iterator it =
-           buffer_queue_map.begin();
-       it != buffer_queue_map.end(); ++it) {
-    const StreamParser::BufferQueue& bufq = it->second;
-    DCHECK(!bufq.empty());
-    media_segment_has_data_for_track_[it->first] = true;
-  }
-
-  const TimeDelta timestamp_offset_before_processing =
-      *timestamp_offset_during_append_;
-
-  // Calculate the new timestamp offset for audio/video tracks if the stream
-  // parser has requested automatic updates.
-  TimeDelta new_timestamp_offset = timestamp_offset_before_processing;
-  if (auto_update_timestamp_offset_) {
-    TimeDelta min_end_timestamp = kNoTimestamp;
-    for (StreamParser::BufferQueueMap::const_iterator it =
-             buffer_queue_map.begin();
-         it != buffer_queue_map.end(); ++it) {
-      const StreamParser::BufferQueue& bufq = it->second;
-      DCHECK(!bufq.empty());
-      if (min_end_timestamp == kNoTimestamp ||
-          EndTimestamp(bufq) < min_end_timestamp) {
-        min_end_timestamp = EndTimestamp(bufq);
-        DCHECK_NE(kNoTimestamp, min_end_timestamp);
-      }
-    }
-    if (min_end_timestamp != kNoTimestamp)
-      new_timestamp_offset += min_end_timestamp;
-  }
-
-  if (!frame_processor_->ProcessFrames(
-          buffer_queue_map, append_window_start_during_append_,
-          append_window_end_during_append_, timestamp_offset_during_append_)) {
-    return false;
-  }
-
-  // Only update the timestamp offset if the frame processor hasn't already.
-  if (auto_update_timestamp_offset_ &&
-      timestamp_offset_before_processing == *timestamp_offset_during_append_) {
-    *timestamp_offset_during_append_ = new_timestamp_offset;
-  }
-
-  return true;
-}
-void SourceBufferState::OnSourceInitDone(
-    const StreamParser::InitParameters& params) {
-  DCHECK_EQ(state_, PENDING_PARSER_INIT);
-  state_ = PARSER_INITIALIZED;
-  auto_update_timestamp_offset_ = params.auto_update_timestamp_offset;
-  base::ResetAndReturn(&init_cb_).Run(params);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/source_buffer_state.h b/cobalt/media/filters/source_buffer_state.h
deleted file mode 100644
index 9a126fd..0000000
--- a/cobalt/media/filters/source_buffer_state.h
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright (c) 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 COBALT_MEDIA_FILTERS_SOURCE_BUFFER_STATE_H_
-#define COBALT_MEDIA_FILTERS_SOURCE_BUFFER_STATE_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "cobalt/media/base/audio_codecs.h"
-#include "cobalt/media/base/demuxer.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/video_codecs.h"
-
-namespace cobalt {
-namespace media {
-
-using base::TimeDelta;
-
-class ChunkDemuxerStream;
-class FrameProcessor;
-
-// Contains state belonging to a source id.
-class MEDIA_EXPORT SourceBufferState {
- public:
-  // Callback signature used to create ChunkDemuxerStreams.
-  typedef base::Callback<ChunkDemuxerStream*(DemuxerStream::Type)>
-      CreateDemuxerStreamCB;
-
-  typedef base::Callback<void(ChunkDemuxerStream*, const TextTrackConfig&)>
-      NewTextTrackCB;
-
-  SourceBufferState(std::unique_ptr<StreamParser> stream_parser,
-                    std::unique_ptr<FrameProcessor> frame_processor,
-                    const CreateDemuxerStreamCB& create_demuxer_stream_cb,
-                    const scoped_refptr<MediaLog>& media_log,
-                    DecoderBuffer::Allocator* buffer_allocator);
-
-  ~SourceBufferState();
-
-  void Init(const StreamParser::InitCB& init_cb,
-            const std::string& expected_codecs,
-            const StreamParser::EncryptedMediaInitDataCB&
-                encrypted_media_init_data_cb,
-            const NewTextTrackCB& new_text_track_cb);
-
-  // Appends new data to the StreamParser.
-  // Returns true if the data was successfully appended. Returns false if an
-  // error occurred. |*timestamp_offset| is used and possibly updated by the
-  // append. |append_window_start| and |append_window_end| correspond to the MSE
-  // spec's similarly named source buffer attributes that are used in coded
-  // frame processing.
-  bool Append(const uint8_t* data, size_t length, TimeDelta append_window_start,
-              TimeDelta append_window_end, TimeDelta* timestamp_offset);
-
-  // Aborts the current append sequence and resets the parser.
-  void ResetParserState(TimeDelta append_window_start,
-                        TimeDelta append_window_end,
-                        TimeDelta* timestamp_offset);
-
-  // Calls Remove(|start|, |end|, |duration|) on all
-  // ChunkDemuxerStreams managed by this object.
-  void Remove(TimeDelta start, TimeDelta end, TimeDelta duration);
-
-  // If the buffer is full, attempts to try to free up space, as specified in
-  // the "Coded Frame Eviction Algorithm" in the Media Source Extensions Spec.
-  // Returns false iff buffer is still full after running eviction.
-  // https://w3c.github.io/media-source/#sourcebuffer-coded-frame-eviction
-  bool EvictCodedFrames(DecodeTimestamp media_time, size_t newDataSize);
-
-  // Returns true if currently parsing a media segment, or false otherwise.
-  bool parsing_media_segment() const { return parsing_media_segment_; }
-
-  // Sets |frame_processor_|'s sequence mode to |sequence_mode|.
-  void SetSequenceMode(bool sequence_mode);
-
-  // Signals the coded frame processor to update its group start timestamp to be
-  // |timestamp_offset| if it is in sequence append mode.
-  void SetGroupStartTimestampIfInSequenceMode(base::TimeDelta timestamp_offset);
-
-  // Returns the range of buffered data in this source, capped at |duration|.
-  // |ended| - Set to true if end of stream has been signaled and the special
-  // end of stream range logic needs to be executed.
-  Ranges<TimeDelta> GetBufferedRanges(TimeDelta duration, bool ended) const;
-
-  // Returns the range of buffered audio data in this source, capped at
-  // |duration|. |ended| - Set to true if end of stream has been signaled and
-  // the special end of stream range logic needs to be executed.
-  Ranges<TimeDelta> GetAudioBufferedRanges(TimeDelta duration,
-                                           bool ended) const;
-
-  // Returns the timestamp of the video keyframe that is at or before the last
-  // seek timestamp.  This function assumes that there is only one video stream.
-  TimeDelta GetVideoSeekKeyframeTimestamp() const;
-
-  // Returns the highest PTS of currently buffered frames in this source, or
-  // base::TimeDelta() if none of the streams contain buffered data.
-  TimeDelta GetHighestPresentationTimestamp() const;
-
-  // Returns the highest buffered duration across all streams managed
-  // by this object.
-  // Returns TimeDelta() if none of the streams contain buffered data.
-  TimeDelta GetMaxBufferedDuration() const;
-
-  // Helper methods that call methods with similar names on all the
-  // ChunkDemuxerStreams managed by this object.
-  void StartReturningData();
-  void AbortReads();
-  void Seek(TimeDelta seek_time);
-  void CompletePendingReadIfPossible();
-  void OnSetDuration(TimeDelta duration);
-  void MarkEndOfStream();
-  void UnmarkEndOfStream();
-  void Shutdown();
-  // Sets the memory limit on each stream of a specific type.
-  // |memory_limit| is the maximum number of bytes each stream of type |type|
-  // is allowed to hold in its buffer.
-  void SetMemoryLimits(DemuxerStream::Type type, size_t memory_limit);
-  bool IsSeekWaitingForData() const;
-
-  typedef std::vector<Ranges<TimeDelta> > RangesList;
-  static Ranges<TimeDelta> ComputeRangesIntersection(
-      const RangesList& active_ranges, bool ended);
-
-  void SetTracksWatcher(const Demuxer::MediaTracksUpdatedCB& tracks_updated_cb);
-
- private:
-  // State advances through this list. The intent is to ensure at least one
-  // config is received prior to parser calling initialization callback, and
-  // that such initialization callback occurs at most once per parser.
-  enum State {
-    UNINITIALIZED = 0,
-    PENDING_PARSER_CONFIG,
-    PENDING_PARSER_INIT,
-    PARSER_INITIALIZED
-  };
-
-  // Called by the |stream_parser_| when a new initialization segment is
-  // encountered.
-  // Returns true on a successful call. Returns false if an error occurred while
-  // processing decoder configurations.
-  bool OnNewConfigs(std::string expected_codecs,
-                    std::unique_ptr<MediaTracks> tracks,
-                    const StreamParser::TextTrackConfigMap& text_configs);
-
-  // Called by the |stream_parser_| at the beginning of a new media segment.
-  void OnNewMediaSegment();
-
-  // Called by the |stream_parser_| at the end of a media segment.
-  void OnEndOfMediaSegment();
-
-  // Called by the |stream_parser_| when new buffers have been parsed.
-  // It processes the new buffers using |frame_processor_|, which includes
-  // appending the processed frames to associated demuxer streams for each
-  // frame's track.
-  // Returns true on a successful call. Returns false if an error occurred while
-  // processing the buffers.
-  bool OnNewBuffers(const StreamParser::BufferQueueMap& buffer_queue_map);
-
-  void OnSourceInitDone(const StreamParser::InitParameters& params);
-
-  // Sets memory limits for all demuxer streams.
-  void SetStreamMemoryLimits();
-
-  // Tracks the number of MEDIA_LOGs emitted for segments missing expected audio
-  // or video blocks. Useful to prevent log spam.
-  int num_missing_track_logs_;
-
-  CreateDemuxerStreamCB create_demuxer_stream_cb_;
-  NewTextTrackCB new_text_track_cb_;
-
-  // During Append(), if OnNewBuffers() coded frame processing updates the
-  // timestamp offset then |*timestamp_offset_during_append_| is also updated
-  // so Append()'s caller can know the new offset. This pointer is only non-NULL
-  // during the lifetime of an Append() call.
-  TimeDelta* timestamp_offset_during_append_;
-
-  // During Append(), coded frame processing triggered by OnNewBuffers()
-  // requires these two attributes. These are only valid during the lifetime of
-  // an Append() call.
-  TimeDelta append_window_start_during_append_;
-  TimeDelta append_window_end_during_append_;
-
-  // Keeps track of whether a media segment is being parsed.
-  bool parsing_media_segment_;
-
-  // Valid only while |parsing_media_segment_| is true. These flags enable
-  // warning when the parsed media segment doesn't have frames for some track.
-  std::map<StreamParser::TrackId, bool> media_segment_has_data_for_track_;
-
-  // The object used to parse appended data.
-  std::unique_ptr<StreamParser> stream_parser_;
-
-  // Note that ChunkDemuxerStreams are created and owned by the parent
-  // ChunkDemuxer. They are not owned by |this|.
-  typedef std::map<StreamParser::TrackId, ChunkDemuxerStream*> DemuxerStreamMap;
-  DemuxerStreamMap audio_streams_;
-  DemuxerStreamMap video_streams_;
-  DemuxerStreamMap text_streams_;
-
-  std::unique_ptr<FrameProcessor> frame_processor_;
-  scoped_refptr<MediaLog> media_log_;
-  StreamParser::InitCB init_cb_;
-
-  State state_;
-
-  // During Append(), OnNewConfigs() will trigger the initialization segment
-  // received algorithm. Note, the MSE spec explicitly disallows this algorithm
-  // during an Abort(), since Abort() is allowed only to emit coded frames, and
-  // only if the parser is PARSING_MEDIA_SEGMENT (not an INIT segment). So we
-  // also have a flag here that indicates if Append is in progress and we can
-  // invoke this callback.
-  Demuxer::MediaTracksUpdatedCB init_segment_received_cb_;
-  bool append_in_progress_;
-  bool first_init_segment_received_;
-
-  std::vector<AudioCodec> expected_audio_codecs_;
-  std::vector<VideoCodec> expected_video_codecs_;
-
-  // Indicates that timestampOffset should be updated automatically during
-  // OnNewBuffers() based on the earliest end timestamp of the buffers provided.
-  // TODO(wolenetz): Refactor this function while integrating April 29, 2014
-  // changes to MSE spec. See http://crbug.com/371499.
-  bool auto_update_timestamp_offset_;
-
-  DecoderBuffer::Allocator* buffer_allocator_;
-
-  DISALLOW_COPY_AND_ASSIGN(SourceBufferState);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_SOURCE_BUFFER_STATE_H_
diff --git a/cobalt/media/filters/source_buffer_state_unittest.cc b/cobalt/media/filters/source_buffer_state_unittest.cc
deleted file mode 100644
index 1093ee3..0000000
--- a/cobalt/media/filters/source_buffer_state_unittest.cc
+++ /dev/null
@@ -1,337 +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 "cobalt/media/filters/source_buffer_state.h"
-
-#include <memory>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/media/base/gmock_callback_support.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/filters/frame_processor.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-using testing::_;
-using testing::SaveArg;
-
-namespace {
-
-AudioDecoderConfig CreateAudioConfig(AudioCodec codec) {
-  return AudioDecoderConfig(codec, kSampleFormatPlanarF32,
-                            CHANNEL_LAYOUT_STEREO, 1000, EmptyExtraData(),
-                            Unencrypted());
-}
-
-VideoDecoderConfig CreateVideoConfig(VideoCodec codec, int w, int h) {
-  math::Size size(w, h);
-  math::Rect visible_rect(size);
-  return VideoDecoderConfig(codec, VIDEO_CODEC_PROFILE_UNKNOWN,
-                            PIXEL_FORMAT_YV12, COLOR_SPACE_HD_REC709, size,
-                            visible_rect, size, EmptyExtraData(),
-                            Unencrypted());
-}
-
-void AddAudioTrack(std::unique_ptr<MediaTracks>& t, AudioCodec codec, int id) {
-  t->AddAudioTrack(CreateAudioConfig(codec), id, "", "", "");
-}
-
-void AddVideoTrack(std::unique_ptr<MediaTracks>& t, VideoCodec codec, int id) {
-  t->AddVideoTrack(CreateVideoConfig(codec, 16, 16), id, "", "", "");
-}
-
-void InvokeCbAndSaveResult(const base::Callback<bool()>& cb, bool* result) {
-  DCHECK(result);
-  *result = cb.Run();
-}
-}  // namespace
-
-class SourceBufferStateTest : public ::testing::Test {
- public:
-  SourceBufferStateTest()
-      : media_log_(new testing::StrictMock<MockMediaLog>()),
-        mock_stream_parser_(NULL) {}
-
-  std::unique_ptr<SourceBufferState> CreateSourceBufferState() {
-    std::unique_ptr<FrameProcessor> frame_processor = base::WrapUnique(
-        new FrameProcessor(base::Bind(&SourceBufferStateTest::OnUpdateDuration,
-                                      base::Unretained(this)),
-                           media_log_));
-    mock_stream_parser_ = new testing::StrictMock<MockStreamParser>();
-    return base::WrapUnique(new SourceBufferState(
-        base::WrapUnique(mock_stream_parser_), std::move(frame_processor),
-        base::Bind(&SourceBufferStateTest::CreateDemuxerStream,
-                   base::Unretained(this)),
-        media_log_));
-  }
-
-  std::unique_ptr<SourceBufferState> CreateAndInitSourceBufferState(
-      const std::string& expected_codecs) {
-    std::unique_ptr<SourceBufferState> sbs = CreateSourceBufferState();
-    EXPECT_CALL(*mock_stream_parser_, Init(_, _, _, _, _, _, _, _))
-        .WillOnce(SaveArg<1>(&new_config_cb_));
-    sbs->Init(base::Bind(&SourceBufferStateTest::SourceInitDone,
-                         base::Unretained(this)),
-              expected_codecs,
-              base::Bind(&SourceBufferStateTest::StreamParserEncryptedInitData,
-                         base::Unretained(this)),
-              base::Bind(&SourceBufferStateTest::StreamParserNewTextTrack,
-                         base::Unretained(this)));
-
-    sbs->SetTracksWatcher(base::Bind(
-        &SourceBufferStateTest::OnMediaTracksUpdated, base::Unretained(this)));
-    return sbs;
-  }
-
-  // Emulates appending some data to the SourceBufferState, since OnNewConfigs
-  // can only be invoked when append is in progress.
-  bool AppendDataAndReportTracks(const std::unique_ptr<SourceBufferState>& sbs,
-                                 std::unique_ptr<MediaTracks> tracks) {
-    const uint8_t stream_data[] = "stream_data";
-    const int data_size = sizeof(stream_data);
-    base::TimeDelta t;
-    StreamParser::TextTrackConfigMap text_track_config_map;
-
-    bool new_configs_result = false;
-    base::Closure new_configs_closure =
-        base::Bind(InvokeCbAndSaveResult,
-                   base::Bind(new_config_cb_, base::Passed(std::move(tracks)),
-                              text_track_config_map),
-                   &new_configs_result);
-    EXPECT_CALL(*mock_stream_parser_, Parse(stream_data, data_size))
-        .WillOnce(testing::DoAll(RunClosure(new_configs_closure),
-                                 testing::Return(true)));
-    sbs->Append(stream_data, data_size, t, t, &t);
-    return new_configs_result;
-  }
-
-  MOCK_METHOD1(OnUpdateDuration, void(base::TimeDelta));
-
-  MOCK_METHOD1(SourceInitDone, void(const StreamParser::InitParameters&));
-  MOCK_METHOD2(StreamParserEncryptedInitData,
-               void(EmeInitDataType, const std::vector<uint8_t>&));
-  MOCK_METHOD2(StreamParserNewTextTrack,
-               void(ChunkDemuxerStream*, const TextTrackConfig&));
-
-  MOCK_METHOD1(MediaTracksUpdatedMock, void(std::unique_ptr<MediaTracks>&));
-  void OnMediaTracksUpdated(std::unique_ptr<MediaTracks> tracks) {
-    MediaTracksUpdatedMock(tracks);
-  }
-
-  ChunkDemuxerStream* CreateDemuxerStream(DemuxerStream::Type type) {
-    static unsigned track_id = 0;
-    demuxer_streams_.push_back(base::WrapUnique(
-        new ChunkDemuxerStream(type, false, base::UintToString(++track_id))));
-    return demuxer_streams_.back().get();
-  }
-
-  scoped_refptr<testing::StrictMock<MockMediaLog>> media_log_;
-  std::vector<std::unique_ptr<ChunkDemuxerStream>> demuxer_streams_;
-  MockStreamParser* mock_stream_parser_;
-  StreamParser::NewConfigCB new_config_cb_;
-};
-
-TEST_F(SourceBufferStateTest, InitSingleAudioTrack) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("vorbis");
-
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddAudioTrack(tracks, kCodecVorbis, 1);
-
-  EXPECT_MEDIA_LOG(FoundStream("audio"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "vorbis"));
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  EXPECT_TRUE(AppendDataAndReportTracks(sbs, std::move(tracks)));
-}
-
-TEST_F(SourceBufferStateTest, InitSingleVideoTrack) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("vp8");
-
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddVideoTrack(tracks, kCodecVP8, 1);
-
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  EXPECT_TRUE(AppendDataAndReportTracks(sbs, std::move(tracks)));
-}
-
-TEST_F(SourceBufferStateTest, InitMultipleTracks) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("vorbis,vp8,opus,vp9");
-
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddAudioTrack(tracks, kCodecVorbis, 1);
-  AddAudioTrack(tracks, kCodecOpus, 2);
-  AddVideoTrack(tracks, kCodecVP8, 3);
-  AddVideoTrack(tracks, kCodecVP9, 4);
-
-  EXPECT_MEDIA_LOG(FoundStream("audio")).Times(2);
-  EXPECT_MEDIA_LOG(CodecName("audio", "vorbis"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "opus"));
-  EXPECT_MEDIA_LOG(FoundStream("video")).Times(2);
-  EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp9"));
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  EXPECT_TRUE(AppendDataAndReportTracks(sbs, std::move(tracks)));
-}
-
-TEST_F(SourceBufferStateTest, AudioStreamMismatchesExpectedCodecs) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("opus");
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddAudioTrack(tracks, kCodecVorbis, 1);
-  EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("Audio", "vorbis"));
-  EXPECT_FALSE(AppendDataAndReportTracks(sbs, std::move(tracks)));
-}
-
-TEST_F(SourceBufferStateTest, VideoStreamMismatchesExpectedCodecs) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("vp9");
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddVideoTrack(tracks, kCodecVP8, 1);
-  EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("Video", "vp8"));
-  EXPECT_FALSE(AppendDataAndReportTracks(sbs, std::move(tracks)));
-}
-
-TEST_F(SourceBufferStateTest, MissingExpectedAudioStream) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("opus,vp9");
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddVideoTrack(tracks, kCodecVP9, 1);
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp9"));
-  EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("opus"));
-  EXPECT_FALSE(AppendDataAndReportTracks(sbs, std::move(tracks)));
-}
-
-TEST_F(SourceBufferStateTest, MissingExpectedVideoStream) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("opus,vp9");
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  tracks->AddAudioTrack(CreateAudioConfig(kCodecOpus), 1, "", "", "");
-  EXPECT_MEDIA_LOG(FoundStream("audio"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "opus"));
-  EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("vp9"));
-  EXPECT_FALSE(AppendDataAndReportTracks(sbs, std::move(tracks)));
-}
-
-TEST_F(SourceBufferStateTest, TrackIdsChangeInSecondInitSegment) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("opus,vp9");
-
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddAudioTrack(tracks, kCodecOpus, 1);
-  AddVideoTrack(tracks, kCodecVP9, 2);
-  EXPECT_MEDIA_LOG(FoundStream("audio"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "opus"));
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp9"));
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  AppendDataAndReportTracks(sbs, std::move(tracks));
-
-  // This second set of tracks have bytestream track ids that differ from the
-  // first init segment above (audio track id 1 -> 3, video track id 2 -> 4).
-  // Bytestream track ids are allowed to change when there is only a single
-  // track of each type.
-  std::unique_ptr<MediaTracks> tracks2(new MediaTracks());
-  AddAudioTrack(tracks2, kCodecOpus, 3);
-  AddVideoTrack(tracks2, kCodecVP9, 4);
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  AppendDataAndReportTracks(sbs, std::move(tracks2));
-}
-
-TEST_F(SourceBufferStateTest, TrackIdChangeWithTwoAudioTracks) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("vorbis,opus");
-
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddAudioTrack(tracks, kCodecVorbis, 1);
-  AddAudioTrack(tracks, kCodecOpus, 2);
-  EXPECT_MEDIA_LOG(FoundStream("audio")).Times(2);
-  EXPECT_MEDIA_LOG(CodecName("audio", "vorbis"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "opus"));
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  EXPECT_TRUE(AppendDataAndReportTracks(sbs, std::move(tracks)));
-
-  // Since we have two audio tracks, bytestream track ids must match the first
-  // init segment.
-  std::unique_ptr<MediaTracks> tracks2(new MediaTracks());
-  AddAudioTrack(tracks2, kCodecVorbis, 1);
-  AddAudioTrack(tracks2, kCodecOpus, 2);
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  EXPECT_TRUE(AppendDataAndReportTracks(sbs, std::move(tracks2)));
-
-  // Emulate the situation where bytestream track ids have changed in the third
-  // init segment. This must cause failure in the OnNewConfigs.
-  std::unique_ptr<MediaTracks> tracks3(new MediaTracks());
-  AddAudioTrack(tracks3, kCodecVorbis, 1);
-  AddAudioTrack(tracks3, kCodecOpus, 3);
-  EXPECT_MEDIA_LOG(UnexpectedTrack("audio", "3"));
-  EXPECT_FALSE(AppendDataAndReportTracks(sbs, std::move(tracks3)));
-}
-
-TEST_F(SourceBufferStateTest, TrackIdChangeWithTwoVideoTracks) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("vp8,vp9");
-
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddVideoTrack(tracks, kCodecVP8, 1);
-  AddVideoTrack(tracks, kCodecVP9, 2);
-  EXPECT_MEDIA_LOG(FoundStream("video")).Times(2);
-  EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp9"));
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  EXPECT_TRUE(AppendDataAndReportTracks(sbs, std::move(tracks)));
-
-  // Since we have two video tracks, bytestream track ids must match the first
-  // init segment.
-  std::unique_ptr<MediaTracks> tracks2(new MediaTracks());
-  AddVideoTrack(tracks2, kCodecVP8, 1);
-  AddVideoTrack(tracks2, kCodecVP9, 2);
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  EXPECT_TRUE(AppendDataAndReportTracks(sbs, std::move(tracks2)));
-
-  // Emulate the situation where bytestream track ids have changed in the third
-  // init segment. This must cause failure in the OnNewConfigs.
-  std::unique_ptr<MediaTracks> tracks3(new MediaTracks());
-  AddVideoTrack(tracks3, kCodecVP8, 1);
-  AddVideoTrack(tracks3, kCodecVP9, 3);
-  EXPECT_MEDIA_LOG(UnexpectedTrack("video", "3"));
-  EXPECT_FALSE(AppendDataAndReportTracks(sbs, std::move(tracks3)));
-}
-
-TEST_F(SourceBufferStateTest, TrackIdsSwappedInSecondInitSegment) {
-  std::unique_ptr<SourceBufferState> sbs =
-      CreateAndInitSourceBufferState("opus,vp9");
-
-  std::unique_ptr<MediaTracks> tracks(new MediaTracks());
-  AddAudioTrack(tracks, kCodecOpus, 1);
-  AddVideoTrack(tracks, kCodecVP9, 2);
-  EXPECT_MEDIA_LOG(FoundStream("audio"));
-  EXPECT_MEDIA_LOG(CodecName("audio", "opus"));
-  EXPECT_MEDIA_LOG(FoundStream("video"));
-  EXPECT_MEDIA_LOG(CodecName("video", "vp9"));
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  AppendDataAndReportTracks(sbs, std::move(tracks));
-
-  // Track ids are swapped in the second init segment.
-  std::unique_ptr<MediaTracks> tracks2(new MediaTracks());
-  AddAudioTrack(tracks2, kCodecOpus, 2);
-  AddVideoTrack(tracks2, kCodecVP9, 1);
-  EXPECT_CALL(*this, MediaTracksUpdatedMock(_));
-  AppendDataAndReportTracks(sbs, std::move(tracks2));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/source_buffer_stream.cc b/cobalt/media/filters/source_buffer_stream.cc
deleted file mode 100644
index 0d30352..0000000
--- a/cobalt/media/filters/source_buffer_stream.cc
+++ /dev/null
@@ -1,1866 +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 "cobalt/media/filters/source_buffer_stream.h"
-
-#include <algorithm>
-#include <map>
-#include <sstream>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/trace_event/trace_event.h"
-#include "cobalt/media/base/starboard_utils.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/base/video_resolution.h"
-#include "cobalt/media/filters/source_buffer_range.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-// The number of ms to crossfade before trimming when buffers overlap.
-// Note that this was defined inside AudioSplicer.  Re-define it here to avoid
-// dependency on AudioSplicer.
-const int kCrossfadeDurationInMilliseconds = 5;
-
-// An arbitrarily-chosen number to estimate the duration of a buffer if none is
-// set and there's not enough information to get a better estimate.
-const int kDefaultBufferDurationInMs = 125;
-
-// Limit the number of MEDIA_LOG() logs for splice buffer generation warnings
-// and successes. Though these values are high enough to possibly exhaust the
-// media internals event cache (along with other events), these logs are
-// important for debugging splice generation.
-const int kMaxSpliceGenerationWarningLogs = 50;
-const int kMaxSpliceGenerationSuccessLogs = 20;
-
-// Limit the number of MEDIA_LOG() logs for track buffer time gaps.
-const int kMaxTrackBufferGapWarningLogs = 20;
-
-// Limit the number of MEDIA_LOG() logs for MSE GC algorithm warnings.
-const int kMaxGarbageCollectAlgorithmWarningLogs = 20;
-
-// Limit the number of MEDIA_LOG() logs for same DTS for non-keyframe followed
-// by keyframe. Prior to relaxing the "media segments must begin with a
-// keyframe" requirement, we issued decode error for this situation. That was
-// likely too strict, and now that the keyframe requirement is relaxed, we have
-// no knowledge of media segment boundaries here. Now, we log but don't trigger
-// decode error, since we allow these sequences which may cause extra decoder
-// work or other side-effects.
-const int kMaxStrangeSameTimestampsLogs = 20;
-
-// Helper method that returns true if |ranges| is sorted in increasing order,
-// false otherwise.
-bool IsRangeListSorted(const std::list<media::SourceBufferRange*>& ranges) {
-  DecodeTimestamp prev = kNoDecodeTimestamp();
-  for (std::list<SourceBufferRange*>::const_iterator itr = ranges.begin();
-       itr != ranges.end(); ++itr) {
-    if (prev != kNoDecodeTimestamp() && prev >= (*itr)->GetStartTimestamp())
-      return false;
-    prev = (*itr)->GetEndTimestamp();
-  }
-  return true;
-}
-
-// Returns an estimate of how far from the beginning or end of a range a buffer
-// can be to still be considered in the range, given the |approximate_duration|
-// of a buffer in the stream.
-// TODO: Once all stream parsers emit accurate frame durations, use logic like
-// FrameProcessor (2*last_frame_duration + last_decode_timestamp) instead of an
-// overall maximum interbuffer delta for range discontinuity detection, and
-// adjust similarly for splice frame discontinuity detection.
-// See http://crbug.com/351489 and http://crbug.com/351166.
-base::TimeDelta ComputeFudgeRoom(base::TimeDelta approximate_duration) {
-  // Because we do not know exactly when is the next timestamp, any buffer
-  // that starts within 2x the approximate duration of a buffer is considered
-  // within this range.
-  return 2 * approximate_duration;
-}
-
-// The amount of time the beginning of the buffered data can differ from the
-// start time in order to still be considered the start of stream.
-base::TimeDelta kSeekToStartFudgeRoom() {
-  return base::TimeDelta::FromMilliseconds(1000);
-}
-
-// Helper method for logging, converts a range into a readable string.
-std::string RangeToString(const SourceBufferRange& range) {
-  if (range.size_in_bytes() == 0) {
-    return "[]";
-  }
-  std::stringstream ss;
-  ss << "[" << range.GetStartTimestamp().InSecondsF() << ";"
-     << range.GetEndTimestamp().InSecondsF() << "("
-     << range.GetBufferedEndTimestamp().InSecondsF() << ")]";
-  return ss.str();
-}
-
-// Helper method for logging, converts a set of ranges into a readable string.
-std::string RangesToString(const SourceBufferStream::RangeList& ranges) {
-  if (ranges.empty()) return "<EMPTY>";
-
-  std::stringstream ss;
-  for (SourceBufferStream::RangeList::const_iterator iter = ranges.begin();
-       iter != ranges.end(); ++iter) {
-    if (iter != ranges.begin()) ss << " ";
-    ss << RangeToString(**iter);
-  }
-  return ss.str();
-}
-
-std::string BufferQueueToLogString(
-    const SourceBufferStream::BufferQueue& buffers) {
-  std::stringstream result;
-  if (buffers.front()->GetDecodeTimestamp().InMicroseconds() ==
-          buffers.front()->timestamp().InMicroseconds() &&
-      buffers.back()->GetDecodeTimestamp().InMicroseconds() ==
-          buffers.back()->timestamp().InMicroseconds()) {
-    result << "dts/pts=[" << buffers.front()->timestamp().InSecondsF() << ";"
-           << buffers.back()->timestamp().InSecondsF()
-           << "(last frame dur=" << buffers.back()->duration().InSecondsF()
-           << ")]";
-  } else {
-    result << "dts=[" << buffers.front()->GetDecodeTimestamp().InSecondsF()
-           << ";" << buffers.back()->GetDecodeTimestamp().InSecondsF()
-           << "] pts=[" << buffers.front()->timestamp().InSecondsF() << ";"
-           << buffers.back()->timestamp().InSecondsF()
-           << "(last frame dur=" << buffers.back()->duration().InSecondsF()
-           << ")]";
-  }
-  return result.str();
-}
-
-SourceBufferRange::GapPolicy TypeToGapPolicy(SourceBufferStream::Type type) {
-  switch (type) {
-    case SourceBufferStream::kAudio:
-    case SourceBufferStream::kVideo:
-      return SourceBufferRange::NO_GAPS_ALLOWED;
-    case SourceBufferStream::kText:
-      return SourceBufferRange::ALLOW_GAPS;
-  }
-
-  NOTREACHED();
-  return SourceBufferRange::NO_GAPS_ALLOWED;
-}
-
-}  // namespace
-
-SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config,
-                                       const scoped_refptr<MediaLog>& media_log,
-                                       bool splice_frames_enabled)
-    : SourceBufferStreamState(splice_frames_enabled),
-      media_log_(media_log),
-      seek_buffer_timestamp_(kNoTimestamp),
-      coded_frame_group_start_time_(kNoDecodeTimestamp()),
-      range_for_next_append_(ranges_.end()),
-      last_output_buffer_timestamp_(kNoDecodeTimestamp()),
-      max_interbuffer_distance_(kNoTimestamp),
-      memory_limit_(SbMediaGetAudioBufferBudget()) {
-
-  DCHECK(audio_config.IsValidConfig());
-  audio_configs_.push_back(audio_config);
-}
-
-SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config,
-                                       const scoped_refptr<MediaLog>& media_log,
-                                       bool splice_frames_enabled)
-    : SourceBufferStreamState(splice_frames_enabled),
-      media_log_(media_log),
-      seek_buffer_timestamp_(kNoTimestamp),
-      coded_frame_group_start_time_(kNoDecodeTimestamp()),
-      range_for_next_append_(ranges_.end()),
-      last_output_buffer_timestamp_(kNoDecodeTimestamp()),
-      max_interbuffer_distance_(kNoTimestamp) {
-  DCHECK(video_config.IsValidConfig());
-  video_configs_.push_back(video_config);
-  // This gets updated via taking a max in UpdateMediaBufferMembers.
-  memory_limit_ = 0;
-  UpdateMediaBufferMembers(video_config);
-}
-
-SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config,
-                                       const scoped_refptr<MediaLog>& media_log,
-                                       bool splice_frames_enabled)
-    : SourceBufferStreamState(splice_frames_enabled),
-      media_log_(media_log),
-      text_track_config_(text_config),
-      seek_buffer_timestamp_(kNoTimestamp),
-      coded_frame_group_start_time_(kNoDecodeTimestamp()),
-      range_for_next_append_(ranges_.end()),
-      last_output_buffer_timestamp_(kNoDecodeTimestamp()),
-      max_interbuffer_distance_(kNoTimestamp),
-      memory_limit_(SbMediaGetAudioBufferBudget()) {
-}
-
-SourceBufferStream::~SourceBufferStream() {
-  while (!ranges_.empty()) {
-    delete ranges_.front();
-    ranges_.pop_front();
-  }
-}
-
-void SourceBufferStream::OnStartOfCodedFrameGroup(
-    DecodeTimestamp coded_frame_group_start_time) {
-  DVLOG(1) << __func__ << " " << GetStreamTypeName() << " ("
-           << coded_frame_group_start_time.InSecondsF() << ")";
-  DCHECK(!end_of_stream_);
-  coded_frame_group_start_time_ = coded_frame_group_start_time;
-  new_coded_frame_group_ = true;
-
-  RangeList::iterator last_range = range_for_next_append_;
-  range_for_next_append_ = FindExistingRangeFor(coded_frame_group_start_time);
-
-  // Only reset |last_appended_buffer_timestamp_| if this new coded frame group
-  // is not adjacent to the previous coded frame group appended to the stream.
-  if (range_for_next_append_ == ranges_.end() ||
-      !AreAdjacentInSequence(last_appended_buffer_timestamp_,
-                             coded_frame_group_start_time)) {
-    ResetLastAppendedState();
-    DVLOG(3) << __func__ << " next appended buffers will "
-             << (range_for_next_append_ == ranges_.end()
-                     ? "be in a new range"
-                     : "overlap an existing range");
-  } else if (last_range != ranges_.end()) {
-    DCHECK(last_range == range_for_next_append_);
-    DVLOG(3) << __func__ << " next appended buffers will continue range unless "
-             << "intervening remove makes discontinuity";
-  }
-}
-
-bool SourceBufferStream::Append(const BufferQueue& buffers) {
-  TRACE_EVENT2("media", "SourceBufferStream::Append", "stream type",
-               GetStreamTypeName(), "buffers to append", buffers.size());
-
-  DCHECK(!buffers.empty());
-  DCHECK(coded_frame_group_start_time_ != kNoDecodeTimestamp());
-  DCHECK(coded_frame_group_start_time_ <=
-         buffers.front()->GetDecodeTimestamp());
-  DCHECK(!end_of_stream_);
-
-  DVLOG(1) << __func__ << " " << GetStreamTypeName() << ": buffers "
-           << BufferQueueToLogString(buffers);
-
-  // New coded frame groups emitted by the coded frame processor must begin with
-  // a keyframe. TODO(wolenetz): Change this to [DCHECK + MEDIA_LOG(ERROR...) +
-  // return false] once the CHECK has baked in a stable release. See
-  // https://crbug.com/580621.
-  CHECK(!new_coded_frame_group_ || buffers.front()->is_key_frame());
-
-  // Buffers within a coded frame group should be monotonically increasing.
-  if (!IsMonotonicallyIncreasing(buffers)) {
-    return false;
-  }
-
-  if (coded_frame_group_start_time_ < DecodeTimestamp() ||
-      buffers.front()->GetDecodeTimestamp() < DecodeTimestamp()) {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Cannot append a coded frame group with negative timestamps.";
-    return false;
-  }
-
-  UpdateMaxInterbufferDistance(buffers);
-  SetConfigIds(buffers);
-
-  // Save a snapshot of stream state before range modifications are made.
-  DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp();
-  BufferQueue deleted_buffers;
-
-  PrepareRangesForNextAppend(buffers, &deleted_buffers);
-
-  // If there's a range for |buffers|, insert |buffers| accordingly. Otherwise,
-  // create a new range with |buffers|.
-  if (range_for_next_append_ != ranges_.end()) {
-    if (new_coded_frame_group_ && (!splice_frames_enabled_ ||
-                                   buffers.front()->splice_buffers().empty())) {
-      // If the first append to this stream in a new coded frame group continues
-      // a previous range, use the new group's start time instead of the first
-      // new buffer's timestamp as the proof of adjacency to the existing range.
-      // A large gap (larger than our normal buffer adjacency test) can occur in
-      // a muxed set of streams (which share a common coded frame group start
-      // time) with a significantly jagged start across the streams.
-      // Don't do this logic if there was a splice frame generated for the first
-      // new buffer, since splices are guaranteed to be in the same range and
-      // adjacent, and since the splice frame's timestamp can be less than
-      // |coded_frame_group_start_time_| due to the splicing.
-      (*range_for_next_append_)
-          ->AppendBuffersToEnd(buffers, coded_frame_group_start_time_);
-    } else {
-      // Otherwise, use the first new buffer's timestamp as the proof of
-      // adjacency.
-      (*range_for_next_append_)
-          ->AppendBuffersToEnd(buffers, kNoDecodeTimestamp());
-    }
-
-    last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp();
-    last_appended_buffer_duration_ = buffers.back()->duration();
-    last_appended_buffer_is_keyframe_ = buffers.back()->is_key_frame();
-  } else {
-    DecodeTimestamp new_range_start_time = std::min(
-        coded_frame_group_start_time_, buffers.front()->GetDecodeTimestamp());
-    const BufferQueue* buffers_for_new_range = &buffers;
-    BufferQueue trimmed_buffers;
-
-    // If the new range is not being created because of a new coded frame group,
-    // then we must make sure that we start with a key frame.  This can happen
-    // if the GOP in the previous append gets destroyed by a Remove() call.
-    if (!new_coded_frame_group_) {
-      BufferQueue::const_iterator itr = buffers.begin();
-
-      // Scan past all the non-key-frames.
-      while (itr != buffers.end() && !(*itr)->is_key_frame()) {
-        ++itr;
-      }
-
-      // If we didn't find a key frame, then update the last appended
-      // buffer state and return.
-      if (itr == buffers.end()) {
-        last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp();
-        last_appended_buffer_duration_ = buffers.back()->duration();
-        last_appended_buffer_is_keyframe_ = buffers.back()->is_key_frame();
-        DVLOG(1) << __func__ << " " << GetStreamTypeName()
-                 << ": new buffers in the middle of coded frame group depend on"
-                    "keyframe that has been removed, and contain no keyframes."
-                    "Skipping further processing.";
-        DVLOG(1) << __func__ << " " << GetStreamTypeName()
-                 << ": done. ranges_=" << RangesToString(ranges_);
-        return true;
-      } else if (itr != buffers.begin()) {
-        // Copy the first key frame and everything after it into
-        // |trimmed_buffers|.
-        trimmed_buffers.assign(itr, buffers.end());
-        buffers_for_new_range = &trimmed_buffers;
-      }
-
-      new_range_start_time =
-          buffers_for_new_range->front()->GetDecodeTimestamp();
-    }
-
-    range_for_next_append_ = AddToRanges(new SourceBufferRange(
-        TypeToGapPolicy(GetType()), *buffers_for_new_range,
-        new_range_start_time,
-        base::Bind(&SourceBufferStream::GetMaxInterbufferDistance,
-                   base::Unretained(this))));
-    last_appended_buffer_timestamp_ =
-        buffers_for_new_range->back()->GetDecodeTimestamp();
-    last_appended_buffer_duration_ = buffers_for_new_range->back()->duration();
-    last_appended_buffer_is_keyframe_ =
-        buffers_for_new_range->back()->is_key_frame();
-  }
-
-  new_coded_frame_group_ = false;
-
-  MergeWithAdjacentRangeIfNecessary(range_for_next_append_);
-
-  // Seek to try to fulfill a previous call to Seek().
-  if (seek_pending_) {
-    DCHECK(!selected_range_);
-    DCHECK(deleted_buffers.empty());
-    Seek(seek_buffer_timestamp_);
-  }
-
-  if (!deleted_buffers.empty()) {
-    DecodeTimestamp start_of_deleted =
-        deleted_buffers.front()->GetDecodeTimestamp();
-
-    DCHECK(track_buffer_.empty() ||
-           track_buffer_.back()->GetDecodeTimestamp() < start_of_deleted)
-        << "decode timestamp "
-        << track_buffer_.back()->GetDecodeTimestamp().InSecondsF() << " sec"
-        << ", start_of_deleted " << start_of_deleted.InSecondsF() << " sec";
-
-    track_buffer_.insert(track_buffer_.end(), deleted_buffers.begin(),
-                         deleted_buffers.end());
-    DVLOG(3) << __func__ << " " << GetStreamTypeName() << " Added "
-             << deleted_buffers.size()
-             << " buffers to track buffer. TB size is now "
-             << track_buffer_.size();
-  } else {
-    DVLOG(3) << __func__ << " " << GetStreamTypeName()
-             << " No deleted buffers for track buffer";
-  }
-
-  // Prune any extra buffers in |track_buffer_| if new keyframes
-  // are appended to the range covered by |track_buffer_|.
-  if (!track_buffer_.empty()) {
-    DecodeTimestamp keyframe_timestamp =
-        FindKeyframeAfterTimestamp(track_buffer_.front()->GetDecodeTimestamp());
-    if (keyframe_timestamp != kNoDecodeTimestamp())
-      PruneTrackBuffer(keyframe_timestamp);
-  }
-
-  SetSelectedRangeIfNeeded(next_buffer_timestamp);
-
-  DVLOG(1) << __func__ << " " << GetStreamTypeName()
-           << ": done. ranges_=" << RangesToString(ranges_);
-  // TODO: Investigate if the following DCHECK should be restored.
-  // DCHECK(IsRangeListSorted(ranges_));
-  DCHECK(OnlySelectedRangeIsSeeked());
-  return true;
-}
-
-void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end,
-                                base::TimeDelta duration) {
-  DVLOG(1) << __func__ << " " << GetStreamTypeName() << " ("
-           << start.InSecondsF() << ", " << end.InSecondsF() << ", "
-           << duration.InSecondsF() << ")";
-  DCHECK(start >= base::TimeDelta()) << start.InSecondsF();
-  DCHECK(start < end) << "start " << start.InSecondsF() << " end "
-                      << end.InSecondsF();
-  DCHECK(duration != kNoTimestamp);
-
-  DecodeTimestamp start_dts = DecodeTimestamp::FromPresentationTime(start);
-  DecodeTimestamp end_dts = DecodeTimestamp::FromPresentationTime(end);
-  DecodeTimestamp remove_end_timestamp =
-      DecodeTimestamp::FromPresentationTime(duration);
-  DecodeTimestamp keyframe_timestamp = FindKeyframeAfterTimestamp(end_dts);
-  if (keyframe_timestamp != kNoDecodeTimestamp()) {
-    remove_end_timestamp = keyframe_timestamp;
-  } else if (end_dts < remove_end_timestamp) {
-    remove_end_timestamp = end_dts;
-  }
-
-  BufferQueue deleted_buffers;
-  RemoveInternal(start_dts, remove_end_timestamp, false, &deleted_buffers);
-
-  if (!deleted_buffers.empty()) {
-    // Buffers for the current position have been removed.
-    SetSelectedRangeIfNeeded(deleted_buffers.front()->GetDecodeTimestamp());
-    if (last_output_buffer_timestamp_ == kNoDecodeTimestamp()) {
-      // We just removed buffers for the current playback position for this
-      // stream, yet we also had output no buffer since the last Seek.
-      // Re-seek to prevent stall.
-      DVLOG(1) << __func__ << " " << GetStreamTypeName() << ": re-seeking to "
-               << seek_buffer_timestamp_
-               << " to prevent stall if this time becomes buffered again";
-      Seek(seek_buffer_timestamp_);
-    }
-  }
-}
-
-DecodeTimestamp SourceBufferStream::PotentialNextAppendTimestamp() const {
-  // The next potential append will either be just at or after
-  // |last_appended_buffer_timestamp_| (if known), or if unknown and we are
-  // still at the beginning of a new coded frame group, then will be into the
-  // range (if any) to which |coded_frame_group_start_time_| belongs.
-  if (last_appended_buffer_timestamp_ != kNoDecodeTimestamp()) {
-    // TODO(wolenetz): Determine if this +1us is still necessary. See
-    // https://crbug.com/589295.
-    return last_appended_buffer_timestamp_ +
-           base::TimeDelta::FromInternalValue(1);
-  }
-
-  if (new_coded_frame_group_) return coded_frame_group_start_time_;
-
-  // If we still don't know a potential next append timestamp, then we have
-  // removed the ranged to which it previously belonged and have not completed a
-  // subsequent append or received a subsequent OnStartOfCodedFrameGroup()
-  // signal.
-  return kNoDecodeTimestamp();
-}
-
-void SourceBufferStream::UpdateLastAppendStateForRemove(
-    DecodeTimestamp remove_start, DecodeTimestamp remove_end,
-    bool exclude_start) {
-  // TODO(chcunningham): change exclude_start to include_start in this class and
-  // SourceBufferRange. Negatives are hard to reason about.
-  bool include_start = !exclude_start;
-
-  // No need to check previous append's GOP if starting a new CFG. New CFG is
-  // already required to begin with a key frame.
-  if (new_coded_frame_group_) return;
-
-  if (range_for_next_append_ != ranges_.end()) {
-    if (last_appended_buffer_timestamp_ != kNoDecodeTimestamp()) {
-      DCHECK((*range_for_next_append_)
-                 ->BelongsToRange(last_appended_buffer_timestamp_));
-
-      // Note start and end of last appended GOP.
-      DecodeTimestamp gop_end = last_appended_buffer_timestamp_;
-      DecodeTimestamp gop_start =
-          (*range_for_next_append_)->KeyframeBeforeTimestamp(gop_end);
-
-      // If last append is about to be disrupted, reset associated state so we
-      // know to create a new range for future appends and require an initial
-      // key frame.
-      if (((include_start && remove_start == gop_end) ||
-           remove_start < gop_end) &&
-          remove_end > gop_start) {
-        DVLOG(2) << __func__ << " " << GetStreamTypeName()
-                 << " Resetting next append state for remove ("
-                 << remove_start.InSecondsF() << ", " << remove_end.InSecondsF()
-                 << ", " << exclude_start << ")";
-        range_for_next_append_ = ranges_.end();
-        ResetLastAppendedState();
-      }
-    } else {
-      NOTREACHED() << __func__ << " " << GetStreamTypeName()
-                   << " range_for_next_append_ set, but not tracking last"
-                   << " append nor new coded frame group.";
-    }
-  }
-}
-
-void SourceBufferStream::RemoveInternal(DecodeTimestamp start,
-                                        DecodeTimestamp end, bool exclude_start,
-                                        BufferQueue* deleted_buffers) {
-  DVLOG(2) << __func__ << " " << GetStreamTypeName() << " ("
-           << start.InSecondsF() << ", " << end.InSecondsF() << ", "
-           << exclude_start << ")";
-  DVLOG(3) << __func__ << " " << GetStreamTypeName()
-           << ": before remove ranges_=" << RangesToString(ranges_);
-
-  DCHECK(start >= DecodeTimestamp());
-  DCHECK(start < end) << "start " << start.InSecondsF() << " end "
-                      << end.InSecondsF();
-  DCHECK(deleted_buffers);
-
-  // Doing this upfront simplifies decisions about range_for_next_append_ below.
-  UpdateLastAppendStateForRemove(start, end, exclude_start);
-
-  RangeList::iterator itr = ranges_.begin();
-  while (itr != ranges_.end()) {
-    SourceBufferRange* range = *itr;
-    if (range->GetStartTimestamp() >= end) break;
-
-    // Split off any remaining GOPs starting at or after |end| and add it to
-    // |ranges_|.
-    SourceBufferRange* new_range = range->SplitRange(end);
-    if (new_range) {
-      itr = ranges_.insert(++itr, new_range);
-
-      // Update |range_for_next_append_| if it was previously |range| and should
-      // be |new_range| now.
-      if (range_for_next_append_ != ranges_.end() &&
-          *range_for_next_append_ == range) {
-        DecodeTimestamp potential_next_append_timestamp =
-            PotentialNextAppendTimestamp();
-        if (potential_next_append_timestamp != kNoDecodeTimestamp() &&
-            new_range->BelongsToRange(potential_next_append_timestamp)) {
-          range_for_next_append_ = itr;
-        }
-      }
-
-      --itr;
-
-      // Update the selected range if the next buffer position was transferred
-      // to |new_range|.
-      if (new_range->HasNextBufferPosition()) SetSelectedRange(new_range);
-    }
-
-    // Truncate the current range so that it only contains data before
-    // the removal range.
-    BufferQueue saved_buffers;
-    bool delete_range = range->TruncateAt(start, &saved_buffers, exclude_start);
-
-    // Check to see if the current playback position was removed and
-    // update the selected range appropriately.
-    if (!saved_buffers.empty()) {
-      DCHECK(!range->HasNextBufferPosition());
-      DCHECK(deleted_buffers->empty());
-
-      *deleted_buffers = saved_buffers;
-    }
-
-    if (range == selected_range_ && !range->HasNextBufferPosition())
-      SetSelectedRange(NULL);
-
-    // If the current range now is completely covered by the removal
-    // range then delete it and move on.
-    if (delete_range) {
-      DeleteAndRemoveRange(&itr);
-      continue;
-    }
-
-    // Clear |range_for_next_append_| if we determine that the removal
-    // operation makes it impossible for the next append to be added
-    // to the current range.
-    if (range_for_next_append_ != ranges_.end() &&
-        *range_for_next_append_ == range) {
-      DecodeTimestamp potential_next_append_timestamp =
-          PotentialNextAppendTimestamp();
-
-      if (!range->BelongsToRange(potential_next_append_timestamp)) {
-        DVLOG(1) << "Resetting range_for_next_append_ since the next append"
-                 << " can't add to the current range.";
-        range_for_next_append_ =
-            FindExistingRangeFor(potential_next_append_timestamp);
-      }
-    }
-
-    // Move on to the next range.
-    ++itr;
-  }
-
-  DVLOG(3) << __func__ << " " << GetStreamTypeName()
-           << ": after remove ranges_=" << RangesToString(ranges_);
-
-  DCHECK(IsRangeListSorted(ranges_));
-  DCHECK(OnlySelectedRangeIsSeeked());
-}
-
-void SourceBufferStream::ResetSeekState() {
-  SetSelectedRange(NULL);
-  track_buffer_.clear();
-  config_change_pending_ = false;
-  last_output_buffer_timestamp_ = kNoDecodeTimestamp();
-  just_exhausted_track_buffer_ = false;
-  splice_buffers_index_ = 0;
-  pending_buffer_ = NULL;
-  pending_buffers_complete_ = false;
-}
-
-void SourceBufferStream::ResetLastAppendedState() {
-  last_appended_buffer_timestamp_ = kNoDecodeTimestamp();
-  last_appended_buffer_duration_ = kNoTimestamp;
-  last_appended_buffer_is_keyframe_ = false;
-}
-
-bool SourceBufferStream::ShouldSeekToStartOfBuffered(
-    base::TimeDelta seek_timestamp) const {
-  if (ranges_.empty()) return false;
-  base::TimeDelta beginning_of_buffered =
-      ranges_.front()->GetStartTimestamp().ToPresentationTime();
-  return (seek_timestamp <= beginning_of_buffered &&
-          beginning_of_buffered < kSeekToStartFudgeRoom());
-}
-
-bool SourceBufferStream::IsMonotonicallyIncreasing(const BufferQueue& buffers) {
-  DCHECK(!buffers.empty());
-  DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_;
-  bool prev_is_keyframe = last_appended_buffer_is_keyframe_;
-  for (BufferQueue::const_iterator itr = buffers.begin(); itr != buffers.end();
-       ++itr) {
-    DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp();
-    bool current_is_keyframe = (*itr)->is_key_frame();
-    DCHECK(current_timestamp != kNoDecodeTimestamp());
-    DCHECK((*itr)->duration() >= base::TimeDelta())
-        << "Packet with invalid duration."
-        << " pts " << (*itr)->timestamp().InSecondsF() << " dts "
-        << (*itr)->GetDecodeTimestamp().InSecondsF() << " dur "
-        << (*itr)->duration().InSecondsF();
-
-    if (prev_timestamp != kNoDecodeTimestamp()) {
-      if (current_timestamp < prev_timestamp) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Buffers did not monotonically increase.";
-        return false;
-      }
-
-      if (current_timestamp == prev_timestamp &&
-          SourceBufferRange::IsUncommonSameTimestampSequence(
-              prev_is_keyframe, current_is_keyframe)) {
-        LIMITED_MEDIA_LOG(DEBUG, media_log_, num_strange_same_timestamps_logs_,
-                          kMaxStrangeSameTimestampsLogs)
-            << "Detected an append sequence with keyframe following a "
-               "non-keyframe, both with the same decode timestamp of "
-            << current_timestamp.InSecondsF();
-      }
-    }
-
-    prev_timestamp = current_timestamp;
-    prev_is_keyframe = current_is_keyframe;
-  }
-  return true;
-}
-
-bool SourceBufferStream::OnlySelectedRangeIsSeeked() const {
-  for (RangeList::const_iterator itr = ranges_.begin(); itr != ranges_.end();
-       ++itr) {
-    if ((*itr)->HasNextBufferPosition() && (*itr) != selected_range_)
-      return false;
-  }
-  return !selected_range_ || selected_range_->HasNextBufferPosition();
-}
-
-void SourceBufferStream::UpdateMaxInterbufferDistance(
-    const BufferQueue& buffers) {
-  DCHECK(!buffers.empty());
-  DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_;
-  for (BufferQueue::const_iterator itr = buffers.begin(); itr != buffers.end();
-       ++itr) {
-    DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp();
-    DCHECK(current_timestamp != kNoDecodeTimestamp());
-
-    base::TimeDelta interbuffer_distance = (*itr)->duration();
-    DCHECK(interbuffer_distance >= base::TimeDelta());
-
-    if (prev_timestamp != kNoDecodeTimestamp()) {
-      interbuffer_distance =
-          std::max(current_timestamp - prev_timestamp, interbuffer_distance);
-    }
-
-    if (interbuffer_distance > base::TimeDelta()) {
-      if (max_interbuffer_distance_ == kNoTimestamp) {
-        max_interbuffer_distance_ = interbuffer_distance;
-      } else {
-        max_interbuffer_distance_ =
-            std::max(max_interbuffer_distance_, interbuffer_distance);
-      }
-    }
-    prev_timestamp = current_timestamp;
-  }
-}
-
-void SourceBufferStream::SetConfigIds(const BufferQueue& buffers) {
-  for (BufferQueue::const_iterator itr = buffers.begin(); itr != buffers.end();
-       ++itr) {
-    (*itr)->SetConfigId(append_config_index_);
-  }
-}
-
-bool SourceBufferStream::GarbageCollectIfNeeded(DecodeTimestamp media_time,
-                                                size_t newDataSize) {
-  DCHECK(media_time != kNoDecodeTimestamp());
-  // Garbage collection should only happen before/during appending new data,
-  // which should not happen in end-of-stream state.
-  DCHECK(!end_of_stream_);
-  // Compute size of |ranges_|.
-  size_t ranges_size = GetBufferedSize();
-
-  // Sanity and overflow checks
-  if ((newDataSize > memory_limit_) ||
-      (ranges_size + newDataSize < ranges_size)) {
-    LIMITED_MEDIA_LOG(DEBUG, media_log_, num_garbage_collect_algorithm_logs_,
-                      kMaxGarbageCollectAlgorithmWarningLogs)
-        << GetStreamTypeName() << " stream: "
-        << "new append of newDataSize=" << newDataSize
-        << " bytes exceeds memory_limit_=" << memory_limit_
-        << ", currently buffered ranges_size=" << ranges_size;
-    return false;
-  }
-
-  base::TimeDelta duration = GetBufferedDurationForGarbageCollection();
-
-  size_t bytes_to_free = 0;
-
-  int64_t garbage_collection_duration_threshold_in_seconds =
-      SbMediaGetBufferGarbageCollectionDurationThreshold() / kSbTimeSecond;
-  // Check if we're under or at the memory/duration limit.
-  const auto kGcDurationThresholdInMilliseconds =
-      garbage_collection_duration_threshold_in_seconds * 1000;
-
-  if (ranges_size + newDataSize > memory_limit_) {
-    bytes_to_free = ranges_size + newDataSize - memory_limit_;
-  } else if (duration.InMilliseconds() > kGcDurationThresholdInMilliseconds) {
-    // Estimate the size to free.
-    auto duration_to_free =
-        duration.InMilliseconds() - kGcDurationThresholdInMilliseconds;
-    bytes_to_free = ranges_size * duration_to_free / duration.InMilliseconds();
-  }
-
-  if (bytes_to_free == 0) {
-    return true;
-  }
-
-  DCHECK_GT(bytes_to_free, 0);
-
-  DVLOG(2) << __func__ << " " << GetStreamTypeName()
-           << ": Before GC media_time=" << media_time.InSecondsF()
-           << " ranges_=" << RangesToString(ranges_)
-           << " seek_pending_=" << seek_pending_
-           << " ranges_size=" << ranges_size << " newDataSize=" << newDataSize
-           << " memory_limit_=" << memory_limit_
-           << " last_appended_buffer_timestamp_="
-           << last_appended_buffer_timestamp_.InSecondsF();
-
-  if (selected_range_ && !seek_pending_ &&
-      media_time > selected_range_->GetBufferedEndTimestamp()) {
-    // Strictly speaking |media_time| (taken from HTMLMediaElement::currentTime)
-    // should always be in the buffered ranges, but media::Pipeline uses audio
-    // stream as the main time source, when audio is present.
-    // In cases when audio and video streams have different buffered ranges, the
-    // |media_time| value might be slightly outside of the video stream buffered
-    // range. In those cases we need to clamp |media_time| value to the current
-    // stream buffered ranges, to ensure the MSE garbage collection algorithm
-    // works correctly (see crbug.com/563292 for details).
-    DecodeTimestamp selected_buffered_end =
-        selected_range_->GetBufferedEndTimestamp();
-
-    DVLOG(2) << __func__ << " media_time " << media_time.InSecondsF()
-             << " is outside of selected_range_=["
-             << selected_range_->GetStartTimestamp().InSecondsF() << ";"
-             << selected_buffered_end.InSecondsF()
-             << "] clamping media_time to be "
-             << selected_buffered_end.InSecondsF();
-    media_time = selected_buffered_end;
-  }
-
-  size_t bytes_freed = 0;
-
-  // If last appended buffer position was earlier than the current playback time
-  // then try deleting data between last append and current media_time.
-  if (last_appended_buffer_timestamp_ != kNoDecodeTimestamp() &&
-      last_appended_buffer_duration_ != kNoTimestamp &&
-      media_time >
-          last_appended_buffer_timestamp_ + last_appended_buffer_duration_) {
-    size_t between = FreeBuffersAfterLastAppended(bytes_to_free, media_time);
-    DVLOG(3) << __func__ << " FreeBuffersAfterLastAppended "
-             << " released " << between << " bytes"
-             << " ranges_=" << RangesToString(ranges_);
-    bytes_freed += between;
-
-    // Some players start appending data at the new seek target position before
-    // actually initiating the seek operation (i.e. they try to improve seek
-    // performance by prebuffering some data at the seek target position and
-    // initiating seek once enough data is pre-buffered. In those cases we'll
-    // see that data is being appended at some new position, but there is no
-    // pending seek reported yet. In this situation we need to try preserving
-    // the most recently appended data, i.e. data belonging to the same buffered
-    // range as the most recent append.
-    if (range_for_next_append_ != ranges_.end()) {
-      DCHECK((*range_for_next_append_)->GetStartTimestamp() <= media_time);
-      media_time = (*range_for_next_append_)->GetStartTimestamp();
-      DVLOG(3) << __func__ << " media_time adjusted to "
-               << media_time.InSecondsF();
-    }
-  }
-
-  // If there is an unsatisfied pending seek, we can safely remove all data that
-  // is earlier than seek target, then remove from the back until we reach the
-  // most recently appended GOP and then remove from the front if we still don't
-  // have enough space for the upcoming append.
-  if (bytes_freed < bytes_to_free && seek_pending_) {
-    DCHECK(!ranges_.empty());
-    // All data earlier than the seek target |media_time| can be removed safely
-    size_t front = FreeBuffers(bytes_to_free - bytes_freed, media_time, false);
-    DVLOG(3) << __func__ << " Removed " << front
-             << " bytes from the front. ranges_=" << RangesToString(ranges_);
-    bytes_freed += front;
-
-    // If removing data earlier than |media_time| didn't free up enough space,
-    // then try deleting from the back until we reach most recently appended GOP
-    if (bytes_freed < bytes_to_free) {
-      size_t back = FreeBuffers(bytes_to_free - bytes_freed, media_time, true);
-      DVLOG(3) << __func__ << " Removed " << back
-               << " bytes from the back. ranges_=" << RangesToString(ranges_);
-      bytes_freed += back;
-    }
-
-    // If even that wasn't enough, then try greedily deleting from the front,
-    // that should allow us to remove as much data as necessary to succeed.
-    if (bytes_freed < bytes_to_free) {
-      size_t front2 = FreeBuffers(bytes_to_free - bytes_freed,
-                                  ranges_.back()->GetEndTimestamp(), false);
-      DVLOG(3) << __func__ << " Removed " << front2
-               << " bytes from the front. ranges_=" << RangesToString(ranges_);
-      bytes_freed += front2;
-    }
-    DCHECK(bytes_freed >= bytes_to_free);
-  }
-
-  // Try removing data from the front of the SourceBuffer up to |media_time|
-  // position.
-  if (bytes_freed < bytes_to_free) {
-    size_t front = FreeBuffers(bytes_to_free - bytes_freed, media_time, false);
-    DVLOG(3) << __func__ << " Removed " << front
-             << " bytes from the front. ranges_=" << RangesToString(ranges_);
-    bytes_freed += front;
-  }
-
-  // Try removing data from the back of the SourceBuffer, until we reach the
-  // most recent append position.
-  if (bytes_freed < bytes_to_free) {
-    size_t back = FreeBuffers(bytes_to_free - bytes_freed, media_time, true);
-    DVLOG(3) << __func__ << " Removed " << back
-             << " bytes from the back. ranges_=" << RangesToString(ranges_);
-    bytes_freed += back;
-  }
-
-  DVLOG(2) << __func__ << " " << GetStreamTypeName()
-           << ": After GC bytes_to_free=" << bytes_to_free
-           << " bytes_freed=" << bytes_freed
-           << " ranges_=" << RangesToString(ranges_);
-
-  return bytes_freed >= bytes_to_free;
-}
-
-size_t SourceBufferStream::FreeBuffersAfterLastAppended(
-    size_t total_bytes_to_free, DecodeTimestamp media_time) {
-  DVLOG(4) << __func__ << " last_appended_buffer_timestamp_="
-           << last_appended_buffer_timestamp_.InSecondsF()
-           << " media_time=" << media_time.InSecondsF();
-
-  DecodeTimestamp remove_range_start = last_appended_buffer_timestamp_;
-  if (last_appended_buffer_is_keyframe_)
-    remove_range_start += GetMaxInterbufferDistance();
-
-  DecodeTimestamp remove_range_start_keyframe =
-      FindKeyframeAfterTimestamp(remove_range_start);
-  if (remove_range_start_keyframe != kNoDecodeTimestamp())
-    remove_range_start = remove_range_start_keyframe;
-  if (remove_range_start >= media_time) return 0;
-
-  DecodeTimestamp remove_range_end;
-  size_t bytes_freed = GetRemovalRange(remove_range_start, media_time,
-                                       total_bytes_to_free, &remove_range_end);
-  if (bytes_freed > 0) {
-    DVLOG(4) << __func__ << " removing ["
-             << remove_range_start.ToPresentationTime().InSecondsF() << ";"
-             << remove_range_end.ToPresentationTime().InSecondsF() << "]";
-    Remove(remove_range_start.ToPresentationTime(),
-           remove_range_end.ToPresentationTime(),
-           media_time.ToPresentationTime());
-  }
-
-  return bytes_freed;
-}
-
-size_t SourceBufferStream::GetRemovalRange(
-    DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp,
-    size_t total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) {
-  DCHECK(start_timestamp >= DecodeTimestamp()) << start_timestamp.InSecondsF();
-  DCHECK(start_timestamp < end_timestamp)
-      << "start " << start_timestamp.InSecondsF() << ", end "
-      << end_timestamp.InSecondsF();
-
-  size_t bytes_freed = 0;
-
-  for (RangeList::iterator itr = ranges_.begin();
-       itr != ranges_.end() && bytes_freed < total_bytes_to_free; ++itr) {
-    SourceBufferRange* range = *itr;
-    if (range->GetStartTimestamp() >= end_timestamp) break;
-    if (range->GetEndTimestamp() < start_timestamp) continue;
-
-    size_t bytes_to_free = total_bytes_to_free - bytes_freed;
-    size_t bytes_removed = range->GetRemovalGOP(
-        start_timestamp, end_timestamp, bytes_to_free, removal_end_timestamp);
-    bytes_freed += bytes_removed;
-  }
-  return bytes_freed;
-}
-
-size_t SourceBufferStream::FreeBuffers(size_t total_bytes_to_free,
-                                       DecodeTimestamp media_time,
-                                       bool reverse_direction) {
-  TRACE_EVENT2("media", "SourceBufferStream::FreeBuffers",
-               "total bytes to free", total_bytes_to_free, "reverse direction",
-               reverse_direction);
-
-  DCHECK_GT(total_bytes_to_free, 0u);
-  size_t bytes_freed = 0;
-
-  // This range will save the last GOP appended to |range_for_next_append_|
-  // if the buffers surrounding it get deleted during garbage collection.
-  SourceBufferRange* new_range_for_append = NULL;
-
-  while (!ranges_.empty() && bytes_freed < total_bytes_to_free) {
-    SourceBufferRange* current_range = NULL;
-    BufferQueue buffers;
-    size_t bytes_deleted = 0;
-
-    if (reverse_direction) {
-      current_range = ranges_.back();
-      DVLOG(5) << "current_range=" << RangeToString(*current_range);
-      if (current_range->LastGOPContainsNextBufferPosition()) {
-        DCHECK_EQ(current_range, selected_range_);
-        DVLOG(5) << "current_range contains next read position, stopping GC";
-        break;
-      }
-      DVLOG(5) << "Deleting GOP from back: " << RangeToString(*current_range);
-      bytes_deleted = current_range->DeleteGOPFromBack(&buffers);
-    } else {
-      current_range = ranges_.front();
-      DVLOG(5) << "current_range=" << RangeToString(*current_range);
-
-      // FirstGOPEarlierThanMediaTime() is useful here especially if
-      // |seek_pending_| (such that no range contains next buffer
-      // position).
-      // FirstGOPContainsNextBufferPosition() is useful here especially if
-      // |!seek_pending_| to protect against DeleteGOPFromFront() if
-      // FirstGOPEarlierThanMediaTime() was insufficient alone.
-      if (!current_range->FirstGOPEarlierThanMediaTime(media_time) ||
-          current_range->FirstGOPContainsNextBufferPosition()) {
-        // We have removed all data up to the GOP that contains current playback
-        // position, we can't delete any further.
-        DVLOG(5) << "current_range contains playback position, stopping GC";
-        break;
-      }
-      DVLOG(4) << "Deleting GOP from front: " << RangeToString(*current_range)
-               << ", media_time: " << media_time.InMicroseconds()
-               << ", current_range->HasNextBufferPosition(): "
-               << current_range->HasNextBufferPosition();
-      bytes_deleted = current_range->DeleteGOPFromFront(&buffers);
-    }
-
-    // Check to see if we've just deleted the GOP that was last appended.
-    DecodeTimestamp end_timestamp = buffers.back()->GetDecodeTimestamp();
-    if (end_timestamp == last_appended_buffer_timestamp_) {
-      DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp());
-      DCHECK(!new_range_for_append);
-
-      // Create a new range containing these buffers.
-      new_range_for_append = new SourceBufferRange(
-          TypeToGapPolicy(GetType()), buffers, kNoDecodeTimestamp(),
-          base::Bind(&SourceBufferStream::GetMaxInterbufferDistance,
-                     base::Unretained(this)));
-      range_for_next_append_ = ranges_.end();
-    } else {
-      bytes_freed += bytes_deleted;
-    }
-
-    if (current_range->size_in_bytes() == 0) {
-      DCHECK_NE(current_range, selected_range_);
-      DCHECK(range_for_next_append_ == ranges_.end() ||
-             *range_for_next_append_ != current_range);
-      delete current_range;
-      reverse_direction ? ranges_.pop_back() : ranges_.pop_front();
-    }
-
-    if (reverse_direction && new_range_for_append) {
-      // We don't want to delete any further, or we'll be creating gaps
-      break;
-    }
-  }
-
-  // Insert |new_range_for_append| into |ranges_|, if applicable.
-  if (new_range_for_append) {
-    range_for_next_append_ = AddToRanges(new_range_for_append);
-    DCHECK(range_for_next_append_ != ranges_.end());
-
-    // Check to see if we need to merge |new_range_for_append| with the range
-    // before or after it. |new_range_for_append| is created whenever the last
-    // GOP appended is encountered, regardless of whether any buffers after it
-    // are ultimately deleted. Merging is necessary if there were no buffers
-    // (or very few buffers) deleted after creating |new_range_for_append|.
-    if (range_for_next_append_ != ranges_.begin()) {
-      RangeList::iterator range_before_next = range_for_next_append_;
-      --range_before_next;
-      MergeWithAdjacentRangeIfNecessary(range_before_next);
-    }
-    MergeWithAdjacentRangeIfNecessary(range_for_next_append_);
-  }
-  return bytes_freed;
-}
-
-void SourceBufferStream::PrepareRangesForNextAppend(
-    const BufferQueue& new_buffers, BufferQueue* deleted_buffers) {
-  DCHECK(deleted_buffers);
-
-  // Handle splices between the existing buffers and the new buffers.  If a
-  // splice is generated the timestamp and duration of the first buffer in
-  // |new_buffers| will be modified.
-  if (splice_frames_enabled_) GenerateSpliceFrame(new_buffers);
-
-  DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_;
-  DecodeTimestamp next_timestamp = new_buffers.front()->GetDecodeTimestamp();
-
-  if (prev_timestamp != kNoDecodeTimestamp() &&
-      prev_timestamp != next_timestamp) {
-    // Clean up the old buffers between the last appended buffer and the
-    // beginning of |new_buffers|.
-    RemoveInternal(prev_timestamp, next_timestamp, true, deleted_buffers);
-  }
-
-  // Always make the start of the delete range exclusive for same timestamp
-  // across the last buffer in the previous append and the first buffer in the
-  // current append. Never be exclusive if a splice frame was generated because
-  // we don't generate splice frames for same timestamp situations.
-  DCHECK(new_buffers.front()->splice_timestamp() !=
-         new_buffers.front()->timestamp());
-  const bool exclude_start = new_buffers.front()->splice_buffers().empty() &&
-                             prev_timestamp == next_timestamp;
-
-  // Delete the buffers that |new_buffers| overlaps.
-  DecodeTimestamp start = new_buffers.front()->GetDecodeTimestamp();
-  if (new_coded_frame_group_) {
-    // Extend the deletion range earlier to the coded frame group start time if
-    // this is the first append in a new coded frame group. Note that |start|
-    // could already be less than |coded_frame_group_start_time_| if a splice
-    // was generated.
-    DCHECK(coded_frame_group_start_time_ != kNoDecodeTimestamp());
-    start = std::min(coded_frame_group_start_time_, start);
-  }
-  DecodeTimestamp end = new_buffers.back()->GetDecodeTimestamp();
-  base::TimeDelta duration = new_buffers.back()->duration();
-
-  // Set end time for remove to include the duration of last buffer. If the
-  // duration is estimated, use 1 microsecond instead to ensure frames are not
-  // accidentally removed due to over-estimation.
-  if (duration != kNoTimestamp && duration > base::TimeDelta() &&
-      !new_buffers.back()->is_duration_estimated()) {
-    end += duration;
-  } else {
-    // TODO(chcunningham): Emit warning when 0ms durations are not expected.
-    // http://crbug.com/312836
-    end += base::TimeDelta::FromInternalValue(1);
-  }
-
-  RemoveInternal(start, end, exclude_start, deleted_buffers);
-}
-
-bool SourceBufferStream::AreAdjacentInSequence(
-    DecodeTimestamp first_timestamp, DecodeTimestamp second_timestamp) const {
-  return first_timestamp < second_timestamp &&
-         second_timestamp <=
-             first_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
-}
-
-void SourceBufferStream::PruneTrackBuffer(const DecodeTimestamp timestamp) {
-  // If we don't have the next timestamp, we don't have anything to delete.
-  if (timestamp == kNoDecodeTimestamp()) return;
-
-  while (!track_buffer_.empty() &&
-         track_buffer_.back()->GetDecodeTimestamp() >= timestamp) {
-    track_buffer_.pop_back();
-  }
-  DVLOG(3) << __func__ << " " << GetStreamTypeName()
-           << " Removed all buffers with DTS >= " << timestamp.InSecondsF()
-           << ". New track buffer size:" << track_buffer_.size();
-}
-
-void SourceBufferStream::MergeWithAdjacentRangeIfNecessary(
-    const RangeList::iterator& range_with_new_buffers_itr) {
-  DCHECK(range_with_new_buffers_itr != ranges_.end());
-
-  SourceBufferRange* range_with_new_buffers = *range_with_new_buffers_itr;
-  RangeList::iterator next_range_itr = range_with_new_buffers_itr;
-  ++next_range_itr;
-
-  if (next_range_itr == ranges_.end() ||
-      !range_with_new_buffers->CanAppendRangeToEnd(**next_range_itr)) {
-    return;
-  }
-
-  bool transfer_current_position = selected_range_ == *next_range_itr;
-  DVLOG(3) << __func__ << " " << GetStreamTypeName() << " merging "
-           << RangeToString(*range_with_new_buffers) << " into "
-           << RangeToString(**next_range_itr);
-  range_with_new_buffers->AppendRangeToEnd(**next_range_itr,
-                                           transfer_current_position);
-  // Update |selected_range_| pointer if |range| has become selected after
-  // merges.
-  if (transfer_current_position) SetSelectedRange(range_with_new_buffers);
-
-  if (next_range_itr == range_for_next_append_)
-    range_for_next_append_ = range_with_new_buffers_itr;
-
-  DeleteAndRemoveRange(&next_range_itr);
-}
-
-void SourceBufferStream::Seek(base::TimeDelta timestamp) {
-  DCHECK(timestamp >= base::TimeDelta());
-  DVLOG(1) << __func__ << " " << GetStreamTypeName() << " ("
-           << timestamp.InSecondsF() << ")";
-  ResetSeekState();
-
-  seek_buffer_timestamp_ = timestamp;
-  seek_pending_ = true;
-
-  if (ShouldSeekToStartOfBuffered(timestamp)) {
-    ranges_.front()->SeekToStart();
-    SetSelectedRange(ranges_.front());
-    seek_pending_ = false;
-    seek_buffer_timestamp_ = GetNextBufferTimestamp().ToPresentationTime();
-    return;
-  }
-
-  DecodeTimestamp seek_dts = DecodeTimestamp::FromPresentationTime(timestamp);
-
-  RangeList::iterator itr = ranges_.end();
-  for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
-    if ((*itr)->CanSeekTo(seek_dts)) break;
-  }
-
-  if (itr == ranges_.end()) return;
-
-  SeekAndSetSelectedRange(*itr, seek_dts);
-  seek_pending_ = false;
-  seek_buffer_timestamp_ = GetNextBufferTimestamp().ToPresentationTime();
-}
-
-bool SourceBufferStream::IsSeekPending() const {
-  return seek_pending_ && !IsEndOfStreamReached();
-}
-
-base::TimeDelta SourceBufferStream::GetSeekKeyframeTimestamp() const {
-  DCHECK(!IsSeekPending());
-  return seek_buffer_timestamp_;
-}
-
-void SourceBufferStream::OnSetDuration(base::TimeDelta duration) {
-  DVLOG(1) << __func__ << " " << GetStreamTypeName() << " ("
-           << duration.InSecondsF() << ")";
-  DCHECK(!end_of_stream_);
-
-  if (ranges_.empty()) return;
-
-  DecodeTimestamp start = DecodeTimestamp::FromPresentationTime(duration);
-  DecodeTimestamp end = ranges_.back()->GetBufferedEndTimestamp();
-
-  // Trim the end if it exceeds the new duration.
-  if (start < end) {
-    BufferQueue deleted_buffers;
-    RemoveInternal(start, end, false, &deleted_buffers);
-
-    if (!deleted_buffers.empty()) {
-      // Truncation removed current position. Clear selected range.
-      SetSelectedRange(NULL);
-    }
-  }
-}
-
-SourceBufferStream::Status SourceBufferStream::GetNextBuffer(
-    scoped_refptr<StreamParserBuffer>* out_buffer) {
-  DVLOG(2) << __func__ << " " << GetStreamTypeName();
-  if (!pending_buffer_.get()) {
-    const SourceBufferStream::Status status = GetNextBufferInternal(out_buffer);
-    if (status != SourceBufferStream::kSuccess ||
-        !SetPendingBuffer(out_buffer)) {
-      DVLOG(2) << __func__ << " " << GetStreamTypeName()
-               << ": no pending buffer, returning status " << status;
-      return status;
-    }
-  }
-
-  if (!pending_buffer_->splice_buffers().empty()) {
-    const SourceBufferStream::Status status =
-        HandleNextBufferWithSplice(out_buffer);
-    DVLOG(2) << __func__ << " " << GetStreamTypeName()
-             << ": handled next buffer with splice, returning status "
-             << status;
-    return status;
-  }
-
-  DCHECK(pending_buffer_->preroll_buffer().get());
-
-  const SourceBufferStream::Status status =
-      HandleNextBufferWithPreroll(out_buffer);
-  DVLOG(2) << __func__ << " " << GetStreamTypeName()
-           << ": handled next buffer with preroll, returning status " << status;
-  return status;
-}
-
-SourceBufferStream::Status SourceBufferStream::HandleNextBufferWithSplice(
-    scoped_refptr<StreamParserBuffer>* out_buffer) {
-  const BufferQueue& splice_buffers = pending_buffer_->splice_buffers();
-  const size_t last_splice_buffer_index = splice_buffers.size() - 1;
-
-  // Are there any splice buffers left to hand out?  The last buffer should be
-  // handed out separately since it represents the first post-splice buffer.
-  if (splice_buffers_index_ < last_splice_buffer_index) {
-    // Account for config changes which occur between fade out buffers.
-    if (current_config_index_ !=
-        splice_buffers[splice_buffers_index_]->GetConfigId()) {
-      config_change_pending_ = true;
-      DVLOG(1) << "Config change (splice buffer config ID does not match).";
-      return SourceBufferStream::kConfigChange;
-    }
-
-    // Every pre splice buffer must have the same splice_timestamp().
-    DCHECK(pending_buffer_->splice_timestamp() ==
-           splice_buffers[splice_buffers_index_]->splice_timestamp());
-
-    // No pre splice buffers should have preroll.
-    DCHECK(!splice_buffers[splice_buffers_index_]->preroll_buffer().get());
-
-    *out_buffer = splice_buffers[splice_buffers_index_++];
-    return SourceBufferStream::kSuccess;
-  }
-
-  // Did we hand out the last pre-splice buffer on the previous call?
-  if (!pending_buffers_complete_) {
-    DCHECK_EQ(splice_buffers_index_, last_splice_buffer_index);
-    pending_buffers_complete_ = true;
-    config_change_pending_ = true;
-    DVLOG(1) << "Config change (forced for fade in of splice frame).";
-    return SourceBufferStream::kConfigChange;
-  }
-
-  // All pre-splice buffers have been handed out and a config change completed,
-  // so hand out the final buffer for fade in.  Because a config change is
-  // always issued prior to handing out this buffer, any changes in config id
-  // have been inherently handled.
-  DCHECK(pending_buffers_complete_);
-  DCHECK_EQ(splice_buffers_index_, splice_buffers.size() - 1);
-  DCHECK(splice_buffers.back()->splice_timestamp() == kNoTimestamp);
-  *out_buffer = splice_buffers.back();
-  pending_buffer_ = NULL;
-
-  // If the last splice buffer has preroll, hand off to the preroll handler.
-  return SetPendingBuffer(out_buffer) ? HandleNextBufferWithPreroll(out_buffer)
-                                      : SourceBufferStream::kSuccess;
-}
-
-SourceBufferStream::Status SourceBufferStream::HandleNextBufferWithPreroll(
-    scoped_refptr<StreamParserBuffer>* out_buffer) {
-  // Any config change should have already been handled.
-  DCHECK_EQ(current_config_index_, pending_buffer_->GetConfigId());
-
-  // Check if the preroll buffer has already been handed out.
-  if (!pending_buffers_complete_) {
-    pending_buffers_complete_ = true;
-    *out_buffer = pending_buffer_->preroll_buffer();
-    return SourceBufferStream::kSuccess;
-  }
-
-  // Preroll complete, hand out the final buffer.
-  *out_buffer = pending_buffer_;
-  pending_buffer_ = NULL;
-  return SourceBufferStream::kSuccess;
-}
-
-SourceBufferStream::Status SourceBufferStream::GetNextBufferInternal(
-    scoped_refptr<StreamParserBuffer>* out_buffer) {
-  CHECK(!config_change_pending_);
-
-  if (!track_buffer_.empty()) {
-    DCHECK(!selected_range_);
-    scoped_refptr<StreamParserBuffer>& next_buffer = track_buffer_.front();
-
-    // If the next buffer is an audio splice frame, the next effective config id
-    // comes from the first splice buffer.
-    if (next_buffer->GetSpliceBufferConfigId(0) != current_config_index_) {
-      config_change_pending_ = true;
-      DVLOG(1) << "Config change (track buffer config ID does not match).";
-      return kConfigChange;
-    }
-
-    DVLOG(3) << __func__ << " Next buffer coming from track_buffer_";
-    *out_buffer = next_buffer;
-    track_buffer_.pop_front();
-    WarnIfTrackBufferExhaustionSkipsForward(*out_buffer);
-    last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp();
-
-    // If the track buffer becomes empty, then try to set the selected range
-    // based on the timestamp of this buffer being returned.
-    if (track_buffer_.empty()) {
-      just_exhausted_track_buffer_ = true;
-      SetSelectedRangeIfNeeded(last_output_buffer_timestamp_);
-    }
-
-    return kSuccess;
-  }
-
-  DCHECK(track_buffer_.empty());
-  if (!selected_range_ || !selected_range_->HasNextBuffer()) {
-    if (IsEndOfStreamReached()) {
-      return kEndOfStream;
-    }
-    DVLOG(3) << __func__ << " " << GetStreamTypeName()
-             << ": returning kNeedBuffer "
-             << (selected_range_ ? "(selected range has no next buffer)"
-                                 : "(no selected range)");
-    return kNeedBuffer;
-  }
-
-  if (selected_range_->GetNextConfigId() != current_config_index_) {
-    config_change_pending_ = true;
-    DVLOG(1) << "Config change (selected range config ID does not match).";
-    return kConfigChange;
-  }
-
-  CHECK(selected_range_->GetNextBuffer(out_buffer));
-  WarnIfTrackBufferExhaustionSkipsForward(*out_buffer);
-  last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp();
-  return kSuccess;
-}
-
-void SourceBufferStream::WarnIfTrackBufferExhaustionSkipsForward(
-    const scoped_refptr<StreamParserBuffer>& next_buffer) {
-  if (!just_exhausted_track_buffer_) return;
-
-  just_exhausted_track_buffer_ = false;
-  DCHECK(next_buffer->is_key_frame());
-  DecodeTimestamp next_output_buffer_timestamp =
-      next_buffer->GetDecodeTimestamp();
-  base::TimeDelta delta =
-      next_output_buffer_timestamp - last_output_buffer_timestamp_;
-  DCHECK_GE(delta, base::TimeDelta());
-  if (delta > GetMaxInterbufferDistance()) {
-    LIMITED_MEDIA_LOG(DEBUG, media_log_, num_track_buffer_gap_warning_logs_,
-                      kMaxTrackBufferGapWarningLogs)
-        << "Media append that overlapped current playback position caused time "
-           "gap in playing "
-        << GetStreamTypeName() << " stream because the next keyframe is "
-        << delta.InMilliseconds()
-        << "ms beyond last overlapped frame. Media "
-           "may appear temporarily frozen.";
-  }
-}
-
-DecodeTimestamp SourceBufferStream::GetNextBufferTimestamp() {
-  if (!track_buffer_.empty())
-    return track_buffer_.front()->GetDecodeTimestamp();
-
-  if (!selected_range_) return kNoDecodeTimestamp();
-
-  DCHECK(selected_range_->HasNextBufferPosition());
-  return selected_range_->GetNextTimestamp();
-}
-
-SourceBufferStream::RangeList::iterator
-SourceBufferStream::FindExistingRangeFor(DecodeTimestamp start_timestamp) {
-  for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
-    if ((*itr)->BelongsToRange(start_timestamp)) return itr;
-  }
-  return ranges_.end();
-}
-
-SourceBufferStream::RangeList::iterator SourceBufferStream::AddToRanges(
-    SourceBufferRange* new_range) {
-  DecodeTimestamp start_timestamp = new_range->GetStartTimestamp();
-  RangeList::iterator itr = ranges_.end();
-  for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
-    if ((*itr)->GetStartTimestamp() > start_timestamp) break;
-  }
-  return ranges_.insert(itr, new_range);
-}
-
-SourceBufferStream::RangeList::iterator
-SourceBufferStream::GetSelectedRangeItr() {
-  DCHECK(selected_range_);
-  RangeList::iterator itr = ranges_.end();
-  for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
-    if (*itr == selected_range_) break;
-  }
-  DCHECK(itr != ranges_.end());
-  return itr;
-}
-
-void SourceBufferStream::SeekAndSetSelectedRange(
-    SourceBufferRange* range, DecodeTimestamp seek_timestamp) {
-  if (range) range->Seek(seek_timestamp);
-  SetSelectedRange(range);
-}
-
-void SourceBufferStream::SetSelectedRange(SourceBufferRange* range) {
-  DVLOG(1) << __func__ << " " << GetStreamTypeName() << ": " << selected_range_
-           << " " << (selected_range_ ? RangeToString(*selected_range_) : "")
-           << " -> " << range << " " << (range ? RangeToString(*range) : "");
-  if (selected_range_) selected_range_->ResetNextBufferPosition();
-  DCHECK(!range || range->HasNextBufferPosition());
-  selected_range_ = range;
-}
-
-Ranges<base::TimeDelta> SourceBufferStream::GetBufferedTime() const {
-  Ranges<base::TimeDelta> ranges;
-  for (RangeList::const_iterator itr = ranges_.begin(); itr != ranges_.end();
-       ++itr) {
-    ranges.Add((*itr)->GetStartTimestamp().ToPresentationTime(),
-               (*itr)->GetBufferedEndTimestamp().ToPresentationTime());
-  }
-  return ranges;
-}
-
-base::TimeDelta SourceBufferStream::GetHighestPresentationTimestamp() const {
-  if (ranges_.empty()) return base::TimeDelta();
-
-  // TODO(wolenetz): Report actual highest PTS here, not DTS cast to PTS. See
-  // https://crbug.com/398130.
-  return ranges_.back()->GetEndTimestamp().ToPresentationTime();
-}
-
-base::TimeDelta SourceBufferStream::GetBufferedDuration() const {
-  if (ranges_.empty()) return base::TimeDelta();
-
-  return ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime();
-}
-
-size_t SourceBufferStream::GetBufferedSize() const {
-  size_t ranges_size = 0;
-  for (RangeList::const_iterator iter = ranges_.begin(); iter != ranges_.end();
-       ++iter)
-    ranges_size += (*iter)->size_in_bytes();
-  return ranges_size;
-}
-
-void SourceBufferStream::MarkEndOfStream() {
-  DCHECK(!end_of_stream_);
-  end_of_stream_ = true;
-}
-
-void SourceBufferStream::UnmarkEndOfStream() {
-  DCHECK(end_of_stream_);
-  end_of_stream_ = false;
-}
-
-bool SourceBufferStream::IsEndOfStreamReached() const {
-  if (!end_of_stream_ || !track_buffer_.empty()) return false;
-
-  if (ranges_.empty()) return true;
-
-  if (seek_pending_) {
-    base::TimeDelta last_range_end_time =
-        ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime();
-    return seek_buffer_timestamp_ >= last_range_end_time;
-  }
-
-  if (!selected_range_) return true;
-
-  return selected_range_ == ranges_.back();
-}
-
-const AudioDecoderConfig& SourceBufferStream::GetCurrentAudioDecoderConfig() {
-  if (config_change_pending_) CompleteConfigChange();
-  return audio_configs_[current_config_index_];
-}
-
-const VideoDecoderConfig& SourceBufferStream::GetCurrentVideoDecoderConfig() {
-  if (config_change_pending_) CompleteConfigChange();
-  return video_configs_[current_config_index_];
-}
-
-const TextTrackConfig& SourceBufferStream::GetCurrentTextTrackConfig() {
-  return text_track_config_;
-}
-
-base::TimeDelta SourceBufferStream::GetMaxInterbufferDistance() const {
-  if (max_interbuffer_distance_ == kNoTimestamp)
-    return base::TimeDelta::FromMilliseconds(kDefaultBufferDurationInMs);
-  return max_interbuffer_distance_;
-}
-
-bool SourceBufferStream::UpdateAudioConfig(const AudioDecoderConfig& config) {
-  DCHECK(!audio_configs_.empty());
-  DCHECK(video_configs_.empty());
-  DVLOG(3) << "UpdateAudioConfig.";
-
-  if (audio_configs_[0].codec() != config.codec()) {
-    MEDIA_LOG(ERROR, media_log_) << "Audio codec changes not allowed.";
-    return false;
-  }
-
-  // Check to see if the new config matches an existing one.
-  for (size_t i = 0; i < audio_configs_.size(); ++i) {
-    if (config.Matches(audio_configs_[i])) {
-      append_config_index_ = i;
-      return true;
-    }
-  }
-
-  // No matches found so let's add this one to the list.
-  append_config_index_ = audio_configs_.size();
-  DVLOG(2) << "New audio config - index: " << append_config_index_;
-  audio_configs_.resize(audio_configs_.size() + 1);
-  audio_configs_[append_config_index_] = config;
-  return true;
-}
-
-void SourceBufferStream::UpdateMediaBufferMembers(
-    const VideoDecoderConfig& config) {
-  DVLOG(3) << "UpdateMediaBufferMembers.";
-  resolution_width_ = config.visible_rect().size().width();
-  resolution_height_ = config.visible_rect().size().height();
-  bits_per_pixel_ = config.webm_color_metadata().BitsPerChannel;
-  codec_ = MediaVideoCodecToSbMediaVideoCodec(config.codec());
-  // TODO: Reduce the memory limit when there is no more 4k samples cached.
-  memory_limit_ = std::max(
-      memory_limit_,
-      static_cast<size_t>(SbMediaGetVideoBufferBudget(
-          codec_, resolution_width_, resolution_height_, bits_per_pixel_)));
-}
-
-bool SourceBufferStream::UpdateVideoConfig(const VideoDecoderConfig& config) {
-  DCHECK(!video_configs_.empty());
-  DCHECK(audio_configs_.empty());
-  DVLOG(3) << "UpdateVideoConfig.";
-
-  if (video_configs_[0].codec() != config.codec()) {
-    MEDIA_LOG(ERROR, media_log_) << "Video codec changes not allowed.";
-    return false;
-  }
-
-  // Check to see if the new config matches an existing one.
-  for (size_t i = 0; i < video_configs_.size(); ++i) {
-    if (config.Matches(video_configs_[i])) {
-      append_config_index_ = i;
-      return true;
-    }
-  }
-
-  // No matches found so let's add this one to the list.
-  append_config_index_ = video_configs_.size();
-  DVLOG(2) << "New video config - index: " << append_config_index_;
-  video_configs_.resize(video_configs_.size() + 1);
-  video_configs_[append_config_index_] = config;
-
-  UpdateMediaBufferMembers(config);
-
-  return true;
-}
-
-void SourceBufferStream::CompleteConfigChange() {
-  config_change_pending_ = false;
-
-  if (pending_buffer_.get()) {
-    current_config_index_ =
-        pending_buffer_->GetSpliceBufferConfigId(splice_buffers_index_);
-    return;
-  }
-
-  if (!track_buffer_.empty()) {
-    current_config_index_ = track_buffer_.front()->GetSpliceBufferConfigId(0);
-    return;
-  }
-
-  if (selected_range_ && selected_range_->HasNextBuffer())
-    current_config_index_ = selected_range_->GetNextConfigId();
-}
-
-void SourceBufferStream::SetSelectedRangeIfNeeded(
-    const DecodeTimestamp timestamp) {
-  DVLOG(2) << __func__ << " " << GetStreamTypeName() << "("
-           << timestamp.InSecondsF() << ")";
-
-  if (selected_range_) {
-    DCHECK(track_buffer_.empty());
-    return;
-  }
-
-  if (!track_buffer_.empty()) {
-    DCHECK(!selected_range_);
-    return;
-  }
-
-  DecodeTimestamp start_timestamp = timestamp;
-
-  // If the next buffer timestamp is not known then use a timestamp just after
-  // the timestamp on the last buffer returned by GetNextBuffer().
-  if (start_timestamp == kNoDecodeTimestamp()) {
-    if (last_output_buffer_timestamp_ == kNoDecodeTimestamp()) {
-      DVLOG(2) << __func__ << " " << GetStreamTypeName()
-               << " no previous output timestamp";
-      return;
-    }
-
-    start_timestamp =
-        last_output_buffer_timestamp_ + base::TimeDelta::FromInternalValue(1);
-  }
-
-  DecodeTimestamp seek_timestamp =
-      FindNewSelectedRangeSeekTimestamp(start_timestamp);
-
-  // If we don't have buffered data to seek to, then return.
-  if (seek_timestamp == kNoDecodeTimestamp()) {
-    DVLOG(2) << __func__ << " " << GetStreamTypeName()
-             << " couldn't find new selected range seek timestamp";
-    return;
-  }
-
-  DCHECK(track_buffer_.empty());
-  SeekAndSetSelectedRange(*FindExistingRangeFor(seek_timestamp),
-                          seek_timestamp);
-}
-
-DecodeTimestamp SourceBufferStream::FindNewSelectedRangeSeekTimestamp(
-    const DecodeTimestamp start_timestamp) {
-  DCHECK(start_timestamp != kNoDecodeTimestamp());
-  DCHECK(start_timestamp >= DecodeTimestamp());
-
-  RangeList::iterator itr = ranges_.begin();
-
-  // When checking a range to see if it has or begins soon enough after
-  // |start_timestamp|, use the fudge room to determine "soon enough".
-  DecodeTimestamp start_timestamp_plus_fudge =
-      start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
-
-  // Multiple ranges could be within the fudge room, because the fudge room is
-  // dynamic based on max inter-buffer distance seen so far. Optimistically
-  // check the earliest ones first.
-  for (; itr != ranges_.end(); ++itr) {
-    DecodeTimestamp range_start = (*itr)->GetStartTimestamp();
-    if (range_start >= start_timestamp_plus_fudge) break;
-    if ((*itr)->GetEndTimestamp() < start_timestamp) continue;
-    DecodeTimestamp search_timestamp = start_timestamp;
-    if (start_timestamp < range_start &&
-        start_timestamp_plus_fudge >= range_start) {
-      search_timestamp = range_start;
-    }
-    DecodeTimestamp keyframe_timestamp =
-        (*itr)->NextKeyframeTimestamp(search_timestamp);
-    if (keyframe_timestamp != kNoDecodeTimestamp()) return keyframe_timestamp;
-  }
-
-  DVLOG(2) << __func__ << " " << GetStreamTypeName()
-           << " no buffered data for dts=" << start_timestamp.InSecondsF();
-  return kNoDecodeTimestamp();
-}
-
-DecodeTimestamp SourceBufferStream::FindKeyframeAfterTimestamp(
-    const DecodeTimestamp timestamp) {
-  DCHECK(timestamp != kNoDecodeTimestamp());
-
-  RangeList::iterator itr = FindExistingRangeFor(timestamp);
-
-  if (itr == ranges_.end()) return kNoDecodeTimestamp();
-
-  // First check for a keyframe timestamp >= |timestamp|
-  // in the current range.
-  return (*itr)->NextKeyframeTimestamp(timestamp);
-}
-
-std::string SourceBufferStream::GetStreamTypeName() const {
-  switch (GetType()) {
-    case kAudio:
-      return "AUDIO";
-    case kVideo:
-      return "VIDEO";
-    case kText:
-      return "TEXT";
-  }
-  NOTREACHED();
-  return "";
-}
-
-SourceBufferStream::Type SourceBufferStream::GetType() const {
-  if (!audio_configs_.empty()) return kAudio;
-  if (!video_configs_.empty()) return kVideo;
-  DCHECK_NE(text_track_config_.kind(), kTextNone);
-  return kText;
-}
-
-void SourceBufferStream::DeleteAndRemoveRange(RangeList::iterator* itr) {
-  DVLOG(1) << __func__;
-
-  DCHECK(*itr != ranges_.end());
-  if (**itr == selected_range_) {
-    DVLOG(1) << __func__ << " deleting selected range.";
-    SetSelectedRange(NULL);
-  }
-
-  if (*itr == range_for_next_append_) {
-    DVLOG(1) << __func__ << " deleting range_for_next_append_.";
-    range_for_next_append_ = ranges_.end();
-    ResetLastAppendedState();
-  }
-
-  delete **itr;
-  *itr = ranges_.erase(*itr);
-}
-
-void SourceBufferStream::GenerateSpliceFrame(const BufferQueue& new_buffers) {
-  DCHECK(!new_buffers.empty());
-
-  // Splice frames are only supported for audio.
-  if (GetType() != kAudio) return;
-
-  // Find the overlapped range (if any).
-  const base::TimeDelta splice_timestamp = new_buffers.front()->timestamp();
-  const DecodeTimestamp splice_dts =
-      DecodeTimestamp::FromPresentationTime(splice_timestamp);
-  RangeList::iterator range_itr = FindExistingRangeFor(splice_dts);
-  if (range_itr == ranges_.end()) return;
-
-  const DecodeTimestamp max_splice_end_dts =
-      splice_dts +
-      base::TimeDelta::FromMilliseconds(kCrossfadeDurationInMilliseconds);
-
-  // Find all buffers involved before the splice point.
-  BufferQueue pre_splice_buffers;
-  if (!(*range_itr)
-           ->GetBuffersInRange(splice_dts, max_splice_end_dts,
-                               &pre_splice_buffers)) {
-    return;
-  }
-
-  // If there are gaps in the timeline, it's possible that we only find buffers
-  // after the splice point but within the splice range.  For simplicity, we do
-  // not generate splice frames in this case.
-  //
-  // We also do not want to generate splices if the first new buffer replaces an
-  // existing buffer exactly.
-  if (pre_splice_buffers.front()->timestamp() >= splice_timestamp) {
-    LIMITED_MEDIA_LOG(DEBUG, media_log_, num_splice_generation_warning_logs_,
-                      kMaxSpliceGenerationWarningLogs)
-        << "Skipping splice frame generation: first new buffer at "
-        << splice_timestamp.InMicroseconds()
-        << "us begins at or before existing buffer at "
-        << pre_splice_buffers.front()->timestamp().InMicroseconds() << "us.";
-    DVLOG(1) << "Skipping splice: overlapped buffers begin at or after the "
-                "first new buffer.";
-    return;
-  }
-
-  // If any |pre_splice_buffers| are already splices or preroll, do not generate
-  // a splice.
-  for (size_t i = 0; i < pre_splice_buffers.size(); ++i) {
-    const BufferQueue& original_splice_buffers =
-        pre_splice_buffers[i]->splice_buffers();
-    if (!original_splice_buffers.empty()) {
-      LIMITED_MEDIA_LOG(DEBUG, media_log_, num_splice_generation_warning_logs_,
-                        kMaxSpliceGenerationWarningLogs)
-          << "Skipping splice frame generation: overlapped buffers at "
-          << pre_splice_buffers[i]->timestamp().InMicroseconds()
-          << "us are in a previously buffered splice.";
-      DVLOG(1) << "Can't generate splice: overlapped buffers contain a "
-                  "pre-existing splice.";
-      return;
-    }
-
-    if (pre_splice_buffers[i]->preroll_buffer().get()) {
-      LIMITED_MEDIA_LOG(DEBUG, media_log_, num_splice_generation_warning_logs_,
-                        kMaxSpliceGenerationWarningLogs)
-          << "Skipping splice frame generation: overlapped buffers at "
-          << pre_splice_buffers[i]->timestamp().InMicroseconds()
-          << "us contain preroll.";
-      DVLOG(1) << "Can't generate splice: overlapped buffers contain preroll.";
-      return;
-    }
-  }
-
-  // Don't generate splice frames which represent less than a millisecond (which
-  // is frequently the extent of timestamp resolution for poorly encoded media)
-  // or less than two samples (need at least two to crossfade).
-  const base::TimeDelta splice_duration =
-      pre_splice_buffers.back()->timestamp() +
-      pre_splice_buffers.back()->duration() - splice_timestamp;
-  const base::TimeDelta minimum_splice_duration = std::max(
-      base::TimeDelta::FromMilliseconds(1),
-      base::TimeDelta::FromSecondsD(
-          2.0 / audio_configs_[append_config_index_].samples_per_second()));
-  if (splice_duration < minimum_splice_duration) {
-    LIMITED_MEDIA_LOG(DEBUG, media_log_, num_splice_generation_warning_logs_,
-                      kMaxSpliceGenerationWarningLogs)
-        << "Skipping splice frame generation: not enough samples for splicing "
-           "new buffer at "
-        << splice_timestamp.InMicroseconds() << "us. Have "
-        << splice_duration.InMicroseconds() << "us, but need "
-        << minimum_splice_duration.InMicroseconds() << "us.";
-    DVLOG(1) << "Can't generate splice: not enough samples for crossfade; have "
-             << splice_duration.InMicroseconds() << "us, but need "
-             << minimum_splice_duration.InMicroseconds() << "us.";
-    return;
-  }
-
-  DVLOG(1) << "Generating splice frame @ " << new_buffers.front()->timestamp()
-           << ", splice duration: " << splice_duration.InMicroseconds()
-           << " us";
-  LIMITED_MEDIA_LOG(DEBUG, media_log_, num_splice_generation_success_logs_,
-                    kMaxSpliceGenerationSuccessLogs)
-      << "Generated splice of overlap duration "
-      << splice_duration.InMicroseconds() << "us into new buffer at "
-      << splice_timestamp.InMicroseconds() << "us.";
-  new_buffers.front()->ConvertToSpliceBuffer(pre_splice_buffers);
-}
-
-bool SourceBufferStream::SetPendingBuffer(
-    scoped_refptr<StreamParserBuffer>* out_buffer) {
-  DCHECK(out_buffer->get());
-  DCHECK(!pending_buffer_.get());
-
-  const bool have_splice_buffers = !(*out_buffer)->splice_buffers().empty();
-  const bool have_preroll_buffer = !!(*out_buffer)->preroll_buffer().get();
-
-  if (!have_splice_buffers && !have_preroll_buffer) return false;
-
-  DCHECK_NE(have_splice_buffers, have_preroll_buffer);
-  splice_buffers_index_ = 0;
-  pending_buffer_.swap(*out_buffer);
-  pending_buffers_complete_ = false;
-  return true;
-}
-
-base::TimeDelta SourceBufferStream::GetBufferedDurationForGarbageCollection()
-    const {
-  base::TimeDelta duration;
-  for (auto range : ranges_) {
-    duration += range->GetEndTimestamp() - range->GetStartTimestamp();
-  }
-  return duration;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/source_buffer_stream.h b/cobalt/media/filters/source_buffer_stream.h
deleted file mode 100644
index 85ea203..0000000
--- a/cobalt/media/filters/source_buffer_stream.h
+++ /dev/null
@@ -1,521 +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.
-
-// SourceBufferStream is a data structure that stores media Buffers in ranges.
-// Buffers can be appended out of presentation order. Buffers are retrieved by
-// seeking to the desired start point and calling GetNextBuffer(). Buffers are
-// returned in sequential presentation order.
-
-#ifndef COBALT_MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_
-#define COBALT_MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_
-
-#include <deque>
-#include <list>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/ranges.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class SourceBufferRange;
-
-// This class is introduced to hold and initialize the member variables for
-// SourceBufferStream.  SourceBufferStream inherits from this class to gain
-// access to these member variables.
-// In the upstream version these member variables belong to SourceBufferStream
-// and are initialized inside the class declaration, which is a C++0x feature.
-// To move these member variables into a separate class can ensure the
-// initialization semantics are the same as the original code.
-class SourceBufferStreamState {
- protected:
-  typedef StreamParser::BufferQueue BufferQueue;
-  typedef std::list<SourceBufferRange*> RangeList;
-
-  explicit SourceBufferStreamState(bool splice_frames_enabled)
-      : splice_frames_enabled_(splice_frames_enabled) {
-    current_config_index_ = 0;
-    append_config_index_ = 0;
-    seek_pending_ = false;
-    end_of_stream_ = false;
-    selected_range_ = NULL;
-    just_exhausted_track_buffer_ = false;
-    new_coded_frame_group_ = false;
-    last_appended_buffer_timestamp_ = kNoDecodeTimestamp();
-    last_appended_buffer_duration_ = kNoTimestamp;
-    last_appended_buffer_is_keyframe_ = false;
-    config_change_pending_ = false;
-    splice_buffers_index_ = 0;
-    pending_buffers_complete_ = false;
-    num_splice_generation_warning_logs_ = 0;
-    num_splice_generation_success_logs_ = 0;
-    num_track_buffer_gap_warning_logs_ = 0;
-    num_garbage_collect_algorithm_logs_ = 0;
-    num_strange_same_timestamps_logs_ = 0;
-  }
-
-  // List of disjoint buffered ranges, ordered by start time.
-  RangeList ranges_;
-
-  // Indicates which decoder config is being used by the decoder.
-  // GetNextBuffer() is only allows to return buffers that have a
-  // config ID that matches this index. If there is a mismatch then
-  // it must signal that a config change is needed.
-  int current_config_index_;
-
-  // Indicates which decoder config to associate with new buffers
-  // being appended. Each new buffer appended has its config ID set
-  // to the value of this field.
-  int append_config_index_;
-
-  // Holds the audio/video configs for this stream. |current_config_index_|
-  // and |append_config_index_| represent indexes into one of these vectors.
-  std::vector<AudioDecoderConfig> audio_configs_;
-  std::vector<VideoDecoderConfig> video_configs_;
-
-  // True if more data needs to be appended before the Seek() can complete,
-  // false if no Seek() has been requested or the Seek() is completed.
-  bool seek_pending_;
-
-  // The timestamp of the keyframe right before the seek timestamp.
-  base::TimeDelta seek_keyframe_timestamp_;
-
-  // True if the end of the stream has been signalled.
-  bool end_of_stream_;
-
-  // Pointer to the seeked-to Range. This is the range from which
-  // GetNextBuffer() calls are fulfilled after the |track_buffer_| has been
-  // emptied.
-  SourceBufferRange* selected_range_;
-
-  // Queue of the next buffers to be returned from calls to GetNextBuffer(). If
-  // |track_buffer_| is empty, return buffers from |selected_range_|.
-  BufferQueue track_buffer_;
-
-  // If there has been no intervening Seek, this will be true if the last
-  // emitted buffer emptied |track_buffer_|.
-  bool just_exhausted_track_buffer_;
-
-  // True when the next call to Append() begins a new coded frame group.
-  // TODO(wolenetz): Simplify by passing this flag into Append().
-  bool new_coded_frame_group_;
-
-  // The timestamp of the last buffer appended to the coded frame group, set to
-  // kNoDecodeTimestamp() if the beginning of the group.
-  DecodeTimestamp last_appended_buffer_timestamp_;
-  base::TimeDelta last_appended_buffer_duration_;
-  bool last_appended_buffer_is_keyframe_;
-
-  // Indicates that a kConfigChanged status has been reported by GetNextBuffer()
-  // and GetCurrentXXXDecoderConfig() must be called to update the current
-  // config. GetNextBuffer() must not be called again until
-  // GetCurrentXXXDecoderConfig() has been called.
-  bool config_change_pending_;
-
-  // Used by HandleNextBufferWithSplice() or HandleNextBufferWithPreroll() when
-  // a splice frame buffer or buffer with preroll is returned from
-  // GetNextBufferInternal().
-  scoped_refptr<StreamParserBuffer> pending_buffer_;
-
-  // Indicates which of the splice buffers in |splice_buffer_| should be
-  // handled out next.
-  size_t splice_buffers_index_;
-
-  // Indicates that all buffers before |pending_buffer_| have been handed out.
-  bool pending_buffers_complete_;
-
-  // Indicates that splice frame generation is enabled.
-  const bool splice_frames_enabled_;
-
-  // To prevent log spam, count the number of warnings and successes logged.
-  int num_splice_generation_warning_logs_;
-  int num_splice_generation_success_logs_;
-  int num_track_buffer_gap_warning_logs_;
-  int num_garbage_collect_algorithm_logs_;
-  int num_strange_same_timestamps_logs_;
-};
-
-// See file-level comment for complete description.
-class MEDIA_EXPORT SourceBufferStream : private SourceBufferStreamState {
- public:
-  using SourceBufferStreamState::BufferQueue;
-  typedef SourceBufferStreamState::RangeList RangeList;
-
-  // Status returned by GetNextBuffer().
-  // kSuccess: Indicates that the next buffer was returned.
-  // kNeedBuffer: Indicates that we need more data before a buffer can be
-  //              returned.
-  // kConfigChange: Indicates that the next buffer requires a config change.
-  enum Status { kSuccess, kNeedBuffer, kConfigChange, kEndOfStream };
-
-  enum Type { kAudio, kVideo, kText };
-
-  SourceBufferStream(const AudioDecoderConfig& audio_config,
-                     const scoped_refptr<MediaLog>& media_log,
-                     bool splice_frames_enabled);
-  SourceBufferStream(const VideoDecoderConfig& video_config,
-                     const scoped_refptr<MediaLog>& media_log,
-                     bool splice_frames_enabled);
-  SourceBufferStream(const TextTrackConfig& text_config,
-                     const scoped_refptr<MediaLog>& media_log,
-                     bool splice_frames_enabled);
-
-  ~SourceBufferStream();
-
-  // Signals that the next buffers appended are part of a new coded frame group
-  // starting at |coded_frame_group_start_time|.
-  // TODO(acolwell/wolenetz): This should be changed to a presentation
-  // timestamp. See http://crbug.com/402502
-  void OnStartOfCodedFrameGroup(DecodeTimestamp coded_frame_group_start_time);
-
-  // Add the |buffers| to the SourceBufferStream. Buffers within the queue are
-  // expected to be in order, but multiple calls to Append() may add buffers out
-  // of order or overlapping. Assumes all buffers within |buffers| are in
-  // presentation order and are non-overlapping.
-  // Returns true if Append() was successful, false if |buffers| are not added.
-  bool Append(const BufferQueue& buffers);
-
-  // Removes buffers between |start| and |end| according to the steps
-  // in the "Coded Frame Removal Algorithm" in the Media Source
-  // Extensions Spec.
-  // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#sourcebuffer-coded-frame-removal
-  //
-  // |duration| is the current duration of the presentation. It is
-  // required by the computation outlined in the spec.
-  void Remove(base::TimeDelta start, base::TimeDelta end,
-              base::TimeDelta duration);
-
-  // Frees up space if the SourceBufferStream is taking up too much memory.
-  // |media_time| is current playback position.
-  bool GarbageCollectIfNeeded(DecodeTimestamp media_time, size_t newDataSize);
-
-  // Changes the SourceBufferStream's state so that it will start returning
-  // buffers starting from the closest keyframe before |timestamp|.
-  void Seek(base::TimeDelta timestamp);
-
-  // Returns true if the SourceBufferStream has seeked to a time without
-  // buffered data and is waiting for more data to be appended.
-  bool IsSeekPending() const;
-
-  // Returns the timestamp of the keyframe before the seek timestamp.  Note that
-  // this value is only valid (thus this function should only be called) when
-  // IsSeekPending() returns false.
-  base::TimeDelta GetSeekKeyframeTimestamp() const;
-
-  // Notifies the SourceBufferStream that the media duration has been changed to
-  // |duration| so it should drop any data past that point.
-  void OnSetDuration(base::TimeDelta duration);
-
-  // Fills |out_buffer| with a new buffer. Buffers are presented in order from
-  // the last call to Seek(), or starting with the first buffer appended if
-  // Seek() has not been called yet.
-  // |out_buffer|'s timestamp may be earlier than the |timestamp| passed to
-  // the last Seek() call.
-  // Returns kSuccess if |out_buffer| is filled with a valid buffer, kNeedBuffer
-  // if there is not enough data buffered to fulfill the request, and
-  // kConfigChange if the next buffer requires a config change.
-  Status GetNextBuffer(scoped_refptr<StreamParserBuffer>* out_buffer);
-
-  // Returns a list of the buffered time ranges.
-  Ranges<base::TimeDelta> GetBufferedTime() const;
-
-  // Returns the highest buffered PTS or base::TimeDelta() if nothing is
-  // buffered.
-  base::TimeDelta GetHighestPresentationTimestamp() const;
-
-  // Returns the duration of the buffered ranges, which is equivalent
-  // to the end timestamp of the last buffered range. If no data is buffered
-  // then base::TimeDelta() is returned.
-  base::TimeDelta GetBufferedDuration() const;
-
-  // Returns the size of the buffered data in bytes.
-  size_t GetBufferedSize() const;
-
-  // Notifies this object that end of stream has been signalled.
-  void MarkEndOfStream();
-
-  // Clear the end of stream state set by MarkEndOfStream().
-  void UnmarkEndOfStream();
-
-  const AudioDecoderConfig& GetCurrentAudioDecoderConfig();
-  const VideoDecoderConfig& GetCurrentVideoDecoderConfig();
-  const TextTrackConfig& GetCurrentTextTrackConfig();
-
-  // Notifies this object that the audio config has changed and buffers in
-  // future Append() calls should be associated with this new config.
-  bool UpdateAudioConfig(const AudioDecoderConfig& config);
-
-  // Notifies this object that the video config has changed and buffers in
-  // future Append() calls should be associated with this new config.
-  bool UpdateVideoConfig(const VideoDecoderConfig& config);
-
-  // Returns the largest distance between two adjacent buffers in this stream,
-  // or an estimate if no two adjacent buffers have been appended to the stream
-  // yet.
-  base::TimeDelta GetMaxInterbufferDistance() const;
-
-  void set_memory_limit(size_t memory_limit) { memory_limit_ = memory_limit; }
-
- private:
-  friend class SourceBufferStreamTest;
-
-  // Attempts to delete approximately |total_bytes_to_free| amount of data
-  // |ranges_|, starting at the front of |ranges_| and moving linearly forward
-  // through the buffers. Deletes starting from the back if |reverse_direction|
-  // is true. |media_time| is current playback position.
-  // Returns the number of bytes freed.
-  size_t FreeBuffers(size_t total_bytes_to_free, DecodeTimestamp media_time,
-                     bool reverse_direction);
-
-  // Attempts to delete approximately |total_bytes_to_free| amount of data from
-  // |ranges_|, starting after the last appended buffer before the current
-  // playback position |media_time|.
-  size_t FreeBuffersAfterLastAppended(size_t total_bytes_to_free,
-                                      DecodeTimestamp media_time);
-
-  // Gets the removal range to secure |byte_to_free| from
-  // [|start_timestamp|, |end_timestamp|).
-  // Returns the size of buffers to secure if future
-  // Remove(|start_timestamp|, |removal_end_timestamp|, duration) is called.
-  // Will not update |removal_end_timestamp| if the returned size is 0.
-  size_t GetRemovalRange(DecodeTimestamp start_timestamp,
-                         DecodeTimestamp end_timestamp, size_t byte_to_free,
-                         DecodeTimestamp* removal_end_timestamp);
-
-  // Prepares |range_for_next_append_| so |new_buffers| can be appended.
-  // This involves removing buffers between the end of the previous append
-  // and any buffers covered by the time range in |new_buffers|.
-  // |deleted_buffers| is an output parameter containing candidates for
-  // |track_buffer_| if this method ends up removing the current playback
-  // position from the range.
-  void PrepareRangesForNextAppend(const BufferQueue& new_buffers,
-                                  BufferQueue* deleted_buffers);
-
-  // Removes buffers, from the |track_buffer_|, that come after |timestamp|.
-  void PruneTrackBuffer(const DecodeTimestamp timestamp);
-
-  // Checks to see if |range_with_new_buffers_itr| can be merged with the range
-  // next to it, and merges them if so.
-  void MergeWithAdjacentRangeIfNecessary(
-      const RangeList::iterator& range_with_new_buffers_itr);
-
-  // Returns true if |second_timestamp| is the timestamp of the next buffer in
-  // sequence after |first_timestamp|, false otherwise.
-  bool AreAdjacentInSequence(DecodeTimestamp first_timestamp,
-                             DecodeTimestamp second_timestamp) const;
-
-  // Helper method that returns the timestamp for the next buffer that
-  // |selected_range_| will return from GetNextBuffer() call, or kNoTimestamp
-  // if in between seeking (i.e. |selected_range_| is null).
-  DecodeTimestamp GetNextBufferTimestamp();
-
-  // Finds the range that should contain a coded frame group that begins with
-  // |start_timestamp| and returns the iterator pointing to it. Returns
-  // |ranges_.end()| if there's no such existing range.
-  RangeList::iterator FindExistingRangeFor(DecodeTimestamp start_timestamp);
-
-  // Inserts |new_range| into |ranges_| preserving sorted order. Returns an
-  // iterator in |ranges_| that points to |new_range|.
-  RangeList::iterator AddToRanges(SourceBufferRange* new_range);
-
-  // Returns an iterator that points to the place in |ranges_| where
-  // |selected_range_| lives.
-  RangeList::iterator GetSelectedRangeItr();
-
-  // Sets the |selected_range_| to |range| and resets the next buffer position
-  // for the previous |selected_range_|.
-  void SetSelectedRange(SourceBufferRange* range);
-
-  // Seeks |range| to |seek_timestamp| and then calls SetSelectedRange() with
-  // |range|.
-  void SeekAndSetSelectedRange(SourceBufferRange* range,
-                               DecodeTimestamp seek_timestamp);
-
-  // Resets this stream back to an unseeked state.
-  void ResetSeekState();
-
-  // Reset state tracking various metadata about the last appended buffer.
-  void ResetLastAppendedState();
-
-  // Returns true if |seek_timestamp| refers to the beginning of the first range
-  // in |ranges_|, false otherwise or if |ranges_| is empty.
-  bool ShouldSeekToStartOfBuffered(base::TimeDelta seek_timestamp) const;
-
-  // Returns true if the timestamps of |buffers| are monotonically increasing
-  // since the previous append to the coded frame group, false otherwise.
-  bool IsMonotonicallyIncreasing(const BufferQueue& buffers);
-
-  // Returns true if |selected_range_| is the only range in |ranges_| that
-  // HasNextBufferPosition().
-  bool OnlySelectedRangeIsSeeked() const;
-
-  // Measures the distances between buffer timestamps and tracks the max.
-  void UpdateMaxInterbufferDistance(const BufferQueue& buffers);
-
-  // Sets the config ID for each buffer to |append_config_index_|.
-  void SetConfigIds(const BufferQueue& buffers);
-
-  // Called to complete a config change. Updates |current_config_index_| to
-  // match the index of the next buffer. Calling this method causes
-  // GetNextBuffer() to stop returning kConfigChange and start returning
-  // kSuccess.
-  void CompleteConfigChange();
-
-  // Sets |selected_range_| and seeks to the nearest keyframe after
-  // |timestamp| if necessary and possible. This method only attempts to
-  // set |selected_range_| if |selected_range_| is null and |track_buffer_|
-  // is empty.
-  void SetSelectedRangeIfNeeded(const DecodeTimestamp timestamp);
-
-  // Find a keyframe timestamp that is >= |start_timestamp| and can be used to
-  // find a new selected range.
-  // Returns kNoTimestamp if an appropriate keyframe timestamp could not be
-  // found.
-  DecodeTimestamp FindNewSelectedRangeSeekTimestamp(
-      const DecodeTimestamp start_timestamp);
-
-  // Searches |ranges_| for the first keyframe timestamp that is >= |timestamp|.
-  // If |ranges_| doesn't contain a GOP that covers |timestamp| or doesn't
-  // have a keyframe after |timestamp| then kNoTimestamp is returned.
-  DecodeTimestamp FindKeyframeAfterTimestamp(const DecodeTimestamp timestamp);
-
-  // Returns "VIDEO" for a video SourceBufferStream, "AUDIO" for an audio
-  // stream, and "TEXT" for a text stream.
-  std::string GetStreamTypeName() const;
-
-  // Returns true if end of stream has been reached, i.e. the
-  // following conditions are met:
-  // 1. end of stream is marked and there is nothing in the track_buffer.
-  // 2. We don't have any ranges, or the last or no range is selected,
-  //    or there is a pending seek beyond any existing ranges.
-  bool IsEndOfStreamReached() const;
-
-  // Deletes the range pointed to by |*itr| and removes it from |ranges_|.
-  // If |*itr| points to |selected_range_|, then |selected_range_| is set to
-  // NULL. After the range is removed, |*itr| is to the range after the one that
-  // was removed or to |ranges_.end()| if the last range was removed.
-  void DeleteAndRemoveRange(RangeList::iterator* itr);
-
-  // Helper function used when updating |range_for_next_append_|.
-  // Returns a guess of what the next append timestamp will be based on
-  // |last_appended_buffer_timestamp_|, |new_coded_frame_group_| and
-  // |coded_frame_group_start_time_|. Returns kNoDecodeTimestamp() if unable to
-  // guess, which can occur prior to first OnStartOfCodedFrameGroup(), or
-  // when the most recent GOP appended to since the last
-  // OnStartOfCodedFrameGroup() is removed.
-  DecodeTimestamp PotentialNextAppendTimestamp() const;
-
-  // Helper function used by Remove() and PrepareRangesForNextAppend() to
-  // remove buffers and ranges between |start| and |end|.
-  // |exclude_start| - If set to true, buffers with timestamps that
-  // match |start| are not removed. If set to false, buffers with
-  // timestamps that match |start| will be removed.
-  // |*deleted_buffers| - Filled with buffers for the current playback position
-  // if the removal range included the current playback position. These buffers
-  // can be used as candidates for placing in the |track_buffer_|.
-  void RemoveInternal(DecodeTimestamp start, DecodeTimestamp end,
-                      bool exclude_start, BufferQueue* deleted_buffers);
-
-  // Helper function used by RemoveInternal() to evaluate whether remove will
-  // disrupt the last appended GOP. If disruption is expected, reset state
-  // tracking the last append. This will trigger frame filtering in Append()
-  // until a new key frame is provided.
-  void UpdateLastAppendStateForRemove(DecodeTimestamp remove_start,
-                                      DecodeTimestamp remove_end,
-                                      bool exclude_start);
-
-  Type GetType() const;
-
-  // See GetNextBuffer() for additional details.  This method handles splice
-  // frame processing.
-  Status HandleNextBufferWithSplice(
-      scoped_refptr<StreamParserBuffer>* out_buffer);
-
-  // See GetNextBuffer() for additional details.  This method handles preroll
-  // frame processing.
-  Status HandleNextBufferWithPreroll(
-      scoped_refptr<StreamParserBuffer>* out_buffer);
-
-  // See GetNextBuffer() for additional details.  The internal method hands out
-  // single buffers from the |track_buffer_| and |selected_range_| without
-  // additional processing for splice frame or preroll buffers.
-  Status GetNextBufferInternal(scoped_refptr<StreamParserBuffer>* out_buffer);
-
-  // If the next buffer's timestamp is significantly beyond the last output
-  // buffer, and if we just exhausted |track_buffer_| on the previous read, this
-  // method logs a warning to |media_log_| that there could be perceivable
-  // delay. Apps can avoid this behavior by not overlap-appending buffers near
-  // current playback position.
-  void WarnIfTrackBufferExhaustionSkipsForward(
-      const scoped_refptr<StreamParserBuffer>& next_buffer);
-
-  // Called by PrepareRangesForNextAppend() before pruning overlapped buffers to
-  // generate a splice frame with a small portion of the overlapped buffers.  If
-  // a splice frame is generated, the first buffer in |new_buffers| will have
-  // its timestamps, duration, and fade out preroll updated.
-  void GenerateSpliceFrame(const BufferQueue& new_buffers);
-
-  // If |out_buffer| has splice buffers or preroll, sets |pending_buffer_|
-  // appropriately and returns true.  Otherwise returns false.
-  bool SetPendingBuffer(scoped_refptr<StreamParserBuffer>* out_buffer);
-
-  // Returns the accumulated duration of all ranges.  This is solely used by
-  // garbage collection.
-  base::TimeDelta GetBufferedDurationForGarbageCollection() const;
-
-  // Updates Media Buffer related member variables based on the video config.
-  void UpdateMediaBufferMembers(const VideoDecoderConfig& config);
-
-  // Used to report log messages that can help the web developer figure out what
-  // is wrong with the content.
-  scoped_refptr<MediaLog> media_log_;
-
-  // Holds the text config for this stream.
-  TextTrackConfig text_track_config_;
-
-  // Timestamp of the last request to Seek().
-  base::TimeDelta seek_buffer_timestamp_;
-
-  // The start time of the current coded frame group being appended.
-  DecodeTimestamp coded_frame_group_start_time_;
-
-  // Points to the range containing the current coded frame group being
-  // appended.
-  RangeList::iterator range_for_next_append_;
-
-  // The decode timestamp on the last buffer returned by the most recent
-  // GetNextBuffer() call. Set to kNoDecodeTimestamp() if GetNextBuffer() hasn't
-  // been called yet or a seek has happened since the last GetNextBuffer() call.
-  DecodeTimestamp last_output_buffer_timestamp_;
-
-  // Stores the largest distance between two adjacent buffers in this stream.
-  base::TimeDelta max_interbuffer_distance_;
-
-  bool using_memory_pool_;
-  int resolution_width_ = kSbMediaVideoResolutionDimensionInvalid;
-  int resolution_height_ = kSbMediaVideoResolutionDimensionInvalid;
-  int bits_per_pixel_ = kSbMediaBitsPerPixelInvalid;
-  SbMediaVideoCodec codec_ = kSbMediaVideoCodecNone;
-
-  // The maximum amount of data in bytes the stream will keep in memory.
-  size_t memory_limit_;
-
-  DISALLOW_COPY_AND_ASSIGN(SourceBufferStream);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_
diff --git a/cobalt/media/filters/source_buffer_stream_unittest.cc b/cobalt/media/filters/source_buffer_stream_unittest.cc
deleted file mode 100644
index 631dac1..0000000
--- a/cobalt/media/filters/source_buffer_stream_unittest.cc
+++ /dev/null
@@ -1,4854 +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 "cobalt/media/filters/source_buffer_stream.h"
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "cobalt/media/base/data_buffer.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/filters/webvtt_util.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::HasSubstr;
-using ::testing::InSequence;
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-typedef StreamParser::BufferQueue BufferQueue;
-
-static const int kDefaultFramesPerSecond = 30;
-static const int kDefaultKeyframesPerSecond = 6;
-static const uint8_t kDataA = 0x11;
-static const uint8_t kDataB = 0x33;
-static const int kDataSize = 1;
-
-// Matchers for verifying common media log entry strings.
-MATCHER(ContainsSameTimestampAt30MillisecondsLog, "") {
-  return CONTAINS_STRING(arg,
-                         "Detected an append sequence with keyframe following "
-                         "a non-keyframe, both with the same decode timestamp "
-                         "of 0.03");
-}
-
-MATCHER_P(ContainsTrackBufferExhaustionSkipLog, skip_milliseconds, "") {
-  return CONTAINS_STRING(arg,
-                         "Media append that overlapped current playback "
-                         "position caused time gap in playing VIDEO stream "
-                         "because the next keyframe is " +
-                             base::IntToString(skip_milliseconds) +
-                             "ms beyond last overlapped frame. Media may "
-                             "appear temporarily frozen.");
-}
-
-MATCHER_P2(ContainsGeneratedSpliceLog, duration_microseconds, time_microseconds,
-           "") {
-  return CONTAINS_STRING(arg, "Generated splice of overlap duration " +
-                                  base::IntToString(duration_microseconds) +
-                                  "us into new buffer at " +
-                                  base::IntToString(time_microseconds) + "us.");
-}
-
-class SourceBufferStreamTest : public testing::Test {
- protected:
-  SourceBufferStreamTest() : media_log_(new StrictMock<MockMediaLog>()) {
-    video_config_ = TestVideoConfig::Normal();
-    SetStreamInfo(kDefaultFramesPerSecond, kDefaultKeyframesPerSecond);
-    stream_.reset(new SourceBufferStream(video_config_, media_log_, true));
-  }
-
-  void SetMemoryLimit(size_t buffers_of_data) {
-    stream_->set_memory_limit(buffers_of_data * kDataSize);
-  }
-
-  void SetStreamInfo(int frames_per_second, int keyframes_per_second) {
-    frames_per_second_ = frames_per_second;
-    keyframes_per_second_ = keyframes_per_second;
-    frame_duration_ = ConvertToFrameDuration(frames_per_second);
-  }
-
-  void SetTextStream() {
-    video_config_ = TestVideoConfig::Invalid();
-    TextTrackConfig config(kTextSubtitles, "", "", "");
-    stream_.reset(new SourceBufferStream(config, media_log_, true));
-    SetStreamInfo(2, 2);
-  }
-
-  void SetAudioStream() {
-    video_config_ = TestVideoConfig::Invalid();
-    audio_config_.Initialize(kCodecVorbis, kSampleFormatPlanarF32,
-                             CHANNEL_LAYOUT_STEREO, 1000, EmptyExtraData(),
-                             Unencrypted(), base::TimeDelta(), 0);
-    stream_.reset(new SourceBufferStream(audio_config_, media_log_, true));
-
-    // Equivalent to 2ms per frame.
-    SetStreamInfo(500, 500);
-  }
-
-  void NewCodedFrameGroupAppend(int starting_position, int number_of_buffers) {
-    AppendBuffers(starting_position, number_of_buffers, true, base::TimeDelta(),
-                  true, &kDataA, kDataSize);
-  }
-
-  void NewCodedFrameGroupAppend(int starting_position, int number_of_buffers,
-                                const uint8_t* data) {
-    AppendBuffers(starting_position, number_of_buffers, true, base::TimeDelta(),
-                  true, data, kDataSize);
-  }
-
-  void NewCodedFrameGroupAppend_OffsetFirstBuffer(
-      int starting_position, int number_of_buffers,
-      base::TimeDelta first_buffer_offset) {
-    AppendBuffers(starting_position, number_of_buffers, true,
-                  first_buffer_offset, true, &kDataA, kDataSize);
-  }
-
-  void NewCodedFrameGroupAppend_ExpectFailure(int starting_position,
-                                              int number_of_buffers) {
-    AppendBuffers(starting_position, number_of_buffers, true, base::TimeDelta(),
-                  false, &kDataA, kDataSize);
-  }
-
-  void AppendBuffers(int starting_position, int number_of_buffers) {
-    AppendBuffers(starting_position, number_of_buffers, false,
-                  base::TimeDelta(), true, &kDataA, kDataSize);
-  }
-
-  void AppendBuffers(int starting_position, int number_of_buffers,
-                     const uint8_t* data) {
-    AppendBuffers(starting_position, number_of_buffers, false,
-                  base::TimeDelta(), true, data, kDataSize);
-  }
-
-  void NewCodedFrameGroupAppend(const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, true, kNoTimestamp, false, true);
-  }
-
-  void NewCodedFrameGroupAppend(base::TimeDelta start_timestamp,
-                                const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, true, start_timestamp, false, true);
-  }
-
-  void AppendBuffers(const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, false, kNoTimestamp, false, true);
-  }
-
-  void NewCodedFrameGroupAppendOneByOne(const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, true, kNoTimestamp, true, true);
-  }
-
-  void AppendBuffersOneByOne(const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, false, kNoTimestamp, true, true);
-  }
-
-  void NewCodedFrameGroupAppend_ExpectFailure(
-      const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, true, kNoTimestamp, false, false);
-  }
-
-  void AppendBuffers_ExpectFailure(const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, false, kNoTimestamp, false, false);
-  }
-
-  void Seek(int position) { stream_->Seek(position * frame_duration_); }
-
-  void SeekToTimestampMs(int64_t timestamp_ms) {
-    stream_->Seek(base::TimeDelta::FromMilliseconds(timestamp_ms));
-  }
-
-  bool GarbageCollectWithPlaybackAtBuffer(int position, int newDataBuffers) {
-    return stream_->GarbageCollectIfNeeded(
-        DecodeTimestamp::FromPresentationTime(position * frame_duration_),
-        newDataBuffers * kDataSize);
-  }
-
-  void RemoveInMs(int start, int end, int duration) {
-    Remove(base::TimeDelta::FromMilliseconds(start),
-           base::TimeDelta::FromMilliseconds(end),
-           base::TimeDelta::FromMilliseconds(duration));
-  }
-
-  void Remove(base::TimeDelta start, base::TimeDelta end,
-              base::TimeDelta duration) {
-    stream_->Remove(start, end, duration);
-  }
-
-  void SignalStartOfCodedFrameGroup(base::TimeDelta start_timestamp) {
-    stream_->OnStartOfCodedFrameGroup(
-        DecodeTimestamp::FromPresentationTime(start_timestamp));
-  }
-
-  int GetRemovalRangeInMs(int start, int end, int bytes_to_free,
-                          int* removal_end) {
-    DecodeTimestamp removal_end_timestamp =
-        DecodeTimestamp::FromMilliseconds(*removal_end);
-    int bytes_removed =
-        stream_->GetRemovalRange(DecodeTimestamp::FromMilliseconds(start),
-                                 DecodeTimestamp::FromMilliseconds(end),
-                                 bytes_to_free, &removal_end_timestamp);
-    *removal_end = removal_end_timestamp.InMilliseconds();
-    return bytes_removed;
-  }
-
-  void CheckExpectedRanges(const std::string& expected) {
-    Ranges<base::TimeDelta> r = stream_->GetBufferedTime();
-
-    std::stringstream ss;
-    ss << "{ ";
-    for (size_t i = 0; i < r.size(); ++i) {
-      int64_t start = (r.start(i) / frame_duration_);
-      int64_t end = (r.end(i) / frame_duration_) - 1;
-      ss << "[" << start << "," << end << ") ";
-    }
-    ss << "}";
-    EXPECT_EQ(expected, ss.str());
-  }
-
-  void CheckExpectedRangesByTimestamp(const std::string& expected) {
-    Ranges<base::TimeDelta> r = stream_->GetBufferedTime();
-
-    std::stringstream ss;
-    ss << "{ ";
-    for (size_t i = 0; i < r.size(); ++i) {
-      int64_t start = r.start(i).InMilliseconds();
-      int64_t end = r.end(i).InMilliseconds();
-      ss << "[" << start << "," << end << ") ";
-    }
-    ss << "}";
-    EXPECT_EQ(expected, ss.str());
-  }
-
-  void CheckExpectedBuffers(int starting_position, int ending_position) {
-    CheckExpectedBuffers(starting_position, ending_position, false, NULL, 0);
-  }
-
-  void CheckExpectedBuffers(int starting_position, int ending_position,
-                            bool expect_keyframe) {
-    CheckExpectedBuffers(starting_position, ending_position, expect_keyframe,
-                         NULL, 0);
-  }
-
-  void CheckExpectedBuffers(int starting_position, int ending_position,
-                            const uint8_t* data) {
-    CheckExpectedBuffers(starting_position, ending_position, false, data,
-                         kDataSize);
-  }
-
-  void CheckExpectedBuffers(int starting_position, int ending_position,
-                            const uint8_t* data, bool expect_keyframe) {
-    CheckExpectedBuffers(starting_position, ending_position, expect_keyframe,
-                         data, kDataSize);
-  }
-
-  void CheckExpectedBuffers(int starting_position, int ending_position,
-                            bool expect_keyframe, const uint8_t* expected_data,
-                            int expected_size) {
-    int current_position = starting_position;
-    for (; current_position <= ending_position; current_position++) {
-      scoped_refptr<StreamParserBuffer> buffer;
-      SourceBufferStream::Status status = stream_->GetNextBuffer(&buffer);
-
-      EXPECT_NE(status, SourceBufferStream::kConfigChange);
-      if (status != SourceBufferStream::kSuccess) break;
-
-      if (expect_keyframe && current_position == starting_position)
-        EXPECT_TRUE(buffer->is_key_frame());
-
-      if (expected_data) {
-        const uint8_t* actual_data = buffer->data();
-        const int actual_size = buffer->data_size();
-        EXPECT_EQ(expected_size, actual_size);
-        for (int i = 0; i < std::min(actual_size, expected_size); i++) {
-          EXPECT_EQ(expected_data[i], actual_data[i]);
-        }
-      }
-
-      EXPECT_EQ(buffer->GetDecodeTimestamp() / frame_duration_,
-                current_position);
-    }
-
-    EXPECT_EQ(ending_position + 1, current_position);
-  }
-
-  void CheckExpectedBuffers(const std::string& expected) {
-    std::vector<std::string> timestamps = base::SplitString(
-        expected, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-    std::stringstream ss;
-    const SourceBufferStream::Type type = stream_->GetType();
-    base::TimeDelta active_splice_timestamp = kNoTimestamp;
-    for (size_t i = 0; i < timestamps.size(); i++) {
-      scoped_refptr<StreamParserBuffer> buffer;
-      SourceBufferStream::Status status = stream_->GetNextBuffer(&buffer);
-
-      if (i > 0) ss << " ";
-
-      if (status == SourceBufferStream::kConfigChange) {
-        switch (type) {
-          case SourceBufferStream::kVideo:
-            stream_->GetCurrentVideoDecoderConfig();
-            break;
-          case SourceBufferStream::kAudio:
-            stream_->GetCurrentAudioDecoderConfig();
-            break;
-          case SourceBufferStream::kText:
-            stream_->GetCurrentTextTrackConfig();
-            break;
-        }
-
-        EXPECT_EQ("C", timestamps[i]);
-
-        ss << "C";
-        continue;
-      }
-
-      EXPECT_EQ(SourceBufferStream::kSuccess, status);
-      if (status != SourceBufferStream::kSuccess) break;
-
-      ss << buffer->timestamp().InMilliseconds();
-
-      if (buffer->GetDecodeTimestamp() !=
-          DecodeTimestamp::FromPresentationTime(buffer->timestamp())) {
-        ss << "|" << buffer->GetDecodeTimestamp().InMilliseconds();
-      }
-
-      // Check duration if expected timestamp contains it.
-      if (timestamps[i].find('D') != std::string::npos) {
-        ss << "D" << buffer->duration().InMilliseconds();
-      }
-
-      // Check duration estimation if expected timestamp contains it.
-      if (timestamps[i].find('E') != std::string::npos &&
-          buffer->is_duration_estimated()) {
-        ss << "E";
-      }
-
-      // Handle preroll buffers.
-      if (base::EndsWith(timestamps[i], "P", base::CompareCase::SENSITIVE)) {
-        ASSERT_TRUE(buffer->is_key_frame());
-        scoped_refptr<StreamParserBuffer> preroll_buffer;
-        preroll_buffer.swap(buffer);
-
-        // When a preroll buffer is encountered we should be able to request one
-        // more buffer.  The first buffer should match the timestamp and config
-        // of the second buffer, except that its discard_padding() should be its
-        // duration.
-        ASSERT_EQ(SourceBufferStream::kSuccess,
-                  stream_->GetNextBuffer(&buffer));
-        ASSERT_EQ(buffer->GetConfigId(), preroll_buffer->GetConfigId());
-        ASSERT_EQ(buffer->track_id(), preroll_buffer->track_id());
-        ASSERT_EQ(buffer->timestamp(), preroll_buffer->timestamp());
-        ASSERT_EQ(buffer->GetDecodeTimestamp(),
-                  preroll_buffer->GetDecodeTimestamp());
-        ASSERT_EQ(kInfiniteDuration, preroll_buffer->discard_padding().first);
-        ASSERT_EQ(base::TimeDelta(), preroll_buffer->discard_padding().second);
-        ASSERT_TRUE(buffer->is_key_frame());
-
-        ss << "P";
-      } else if (buffer->is_key_frame()) {
-        ss << "K";
-      }
-
-      // Until the last splice frame is seen, indicated by a matching timestamp,
-      // all buffers must have the same splice_timestamp().
-      if (buffer->timestamp() == active_splice_timestamp) {
-        ASSERT_EQ(buffer->splice_timestamp(), kNoTimestamp);
-      } else {
-        ASSERT_TRUE(active_splice_timestamp == kNoTimestamp ||
-                    active_splice_timestamp == buffer->splice_timestamp());
-      }
-
-      active_splice_timestamp = buffer->splice_timestamp();
-    }
-    EXPECT_EQ(expected, ss.str());
-  }
-
-  void CheckNoNextBuffer() {
-    scoped_refptr<StreamParserBuffer> buffer;
-    EXPECT_EQ(SourceBufferStream::kNeedBuffer, stream_->GetNextBuffer(&buffer));
-  }
-
-  void CheckEOSReached() {
-    scoped_refptr<StreamParserBuffer> buffer;
-    EXPECT_EQ(SourceBufferStream::kEndOfStream,
-              stream_->GetNextBuffer(&buffer));
-  }
-
-  void CheckVideoConfig(const VideoDecoderConfig& config) {
-    const VideoDecoderConfig& actual = stream_->GetCurrentVideoDecoderConfig();
-    EXPECT_TRUE(actual.Matches(config))
-        << "Expected: " << config.AsHumanReadableString()
-        << "\nActual: " << actual.AsHumanReadableString();
-  }
-
-  void CheckAudioConfig(const AudioDecoderConfig& config) {
-    const AudioDecoderConfig& actual = stream_->GetCurrentAudioDecoderConfig();
-    EXPECT_TRUE(actual.Matches(config))
-        << "Expected: " << config.AsHumanReadableString()
-        << "\nActual: " << actual.AsHumanReadableString();
-  }
-
-  base::TimeDelta frame_duration() const { return frame_duration_; }
-
-  std::unique_ptr<SourceBufferStream> stream_;
-  VideoDecoderConfig video_config_;
-  AudioDecoderConfig audio_config_;
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-
- private:
-  base::TimeDelta ConvertToFrameDuration(int frames_per_second) {
-    return base::TimeDelta::FromMicroseconds(
-        base::Time::kMicrosecondsPerSecond / frames_per_second);
-  }
-
-  void AppendBuffers(int starting_position, int number_of_buffers,
-                     bool begin_coded_frame_group,
-                     base::TimeDelta first_buffer_offset, bool expect_success,
-                     const uint8_t* data, int size) {
-    if (begin_coded_frame_group)
-      stream_->OnStartOfCodedFrameGroup(DecodeTimestamp::FromPresentationTime(
-          starting_position * frame_duration_));
-
-    int keyframe_interval = frames_per_second_ / keyframes_per_second_;
-
-    BufferQueue queue;
-    for (int i = 0; i < number_of_buffers; i++) {
-      int position = starting_position + i;
-      bool is_keyframe = position % keyframe_interval == 0;
-      // Buffer type and track ID are meaningless to these tests.
-      scoped_refptr<StreamParserBuffer> buffer = StreamParserBuffer::CopyFrom(
-          data, size, is_keyframe, DemuxerStream::AUDIO, 0);
-      ASSERT_TRUE(buffer);
-      base::TimeDelta timestamp = frame_duration_ * position;
-
-      if (i == 0) timestamp += first_buffer_offset;
-      buffer->SetDecodeTimestamp(
-          DecodeTimestamp::FromPresentationTime(timestamp));
-
-      // Simulate an IBB...BBP pattern in which all B-frames reference both
-      // the I- and P-frames. For a GOP with playback order 12345, this would
-      // result in a decode timestamp order of 15234.
-      base::TimeDelta presentation_timestamp;
-      if (is_keyframe) {
-        presentation_timestamp = timestamp;
-      } else if ((position - 1) % keyframe_interval == 0) {
-        // This is the P-frame (first frame following the I-frame)
-        presentation_timestamp =
-            (timestamp + frame_duration_ * (keyframe_interval - 2));
-      } else {
-        presentation_timestamp = timestamp - frame_duration_;
-      }
-      buffer->set_timestamp(presentation_timestamp);
-      buffer->set_duration(frame_duration_);
-
-      queue.push_back(buffer);
-    }
-    if (!queue.empty()) EXPECT_EQ(expect_success, stream_->Append(queue));
-  }
-
-  void UpdateLastBufferDuration(DecodeTimestamp current_dts,
-                                BufferQueue* buffers) {
-    if (buffers->empty() || buffers->back()->duration() > base::TimeDelta())
-      return;
-
-    DecodeTimestamp last_dts = buffers->back()->GetDecodeTimestamp();
-    DCHECK(current_dts >= last_dts);
-    buffers->back()->set_duration(current_dts - last_dts);
-  }
-
-  // StringToBufferQueue() allows for the generation of StreamParserBuffers from
-  // coded strings of timestamps separated by spaces.
-  //
-  // Supported syntax (options must be in this order):
-  // pp[|dd][Dzz][E][P][K]
-  //
-  // pp:
-  // Generates a StreamParserBuffer with decode and presentation timestamp xx.
-  // E.g., "0 1 2 3".
-  //
-  // pp|dd:
-  // Generates a StreamParserBuffer with presentation timestamp pp and decode
-  // timestamp dd. E.g., "0|0 3|1 1|2 2|3".
-  //
-  // Dzz
-  // Explicitly describe the duration of the buffer. zz specifies the duration
-  // in milliseconds. If the duration isn't specified with this syntax, the
-  // duration is derived using the timestamp delta between this buffer and the
-  // next buffer. If not specified, the final buffer will simply copy the
-  // duration of the previous buffer. If the queue only contains 1 buffer then
-  // the duration must be explicitly specified with this format.
-  // E.g. "0D10 10D20"
-  //
-  // E:
-  // Indicates that the buffer should be marked as containing an *estimated*
-  // duration. E.g., "0D20E 20 25E 30"
-  //
-  // P:
-  // Indicates the buffer with will also have a preroll buffer
-  // associated with it. The preroll buffer will just be dummy data.
-  // E.g. "0P 5 10"
-  //
-  // K:
-  // Indicates the buffer is a keyframe. E.g., "0K 1|2K 2|4D2K 6 8".
-  //
-  // S(a# ... y# z#)
-  // Indicates a splice frame buffer should be created with timestamp z#.  The
-  // preceding timestamps a# ... y# will be treated as the fade out preroll for
-  // the splice frame.  If a timestamp within the preroll ends with C the config
-  // id to use for that and subsequent preroll appends is incremented by one.
-  // The config id for non-splice frame appends will not be affected.
-  BufferQueue StringToBufferQueue(const std::string& buffers_to_append) {
-    std::vector<std::string> timestamps = base::SplitString(
-        buffers_to_append, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-
-    CHECK_GT(timestamps.size(), 0u);
-
-    bool splice_frame = false;
-    size_t splice_config_id = stream_->append_config_index_;
-    BufferQueue pre_splice_buffers;
-    BufferQueue buffers;
-    for (size_t i = 0; i < timestamps.size(); i++) {
-      bool is_keyframe = false;
-      bool has_preroll = false;
-      bool last_splice_frame = false;
-      bool is_duration_estimated = false;
-
-      // Handle splice frame starts.
-      if (base::StartsWith(timestamps[i], "S(", base::CompareCase::SENSITIVE)) {
-        CHECK(!splice_frame);
-        splice_frame = true;
-        // Remove the "S(" off of the token.
-        timestamps[i] = timestamps[i].substr(2, timestamps[i].length());
-      }
-      if (splice_frame &&
-          base::EndsWith(timestamps[i], ")", base::CompareCase::SENSITIVE)) {
-        splice_frame = false;
-        last_splice_frame = true;
-        // Remove the ")" off of the token.
-        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
-      }
-      // Handle config changes within the splice frame.
-      if (splice_frame &&
-          base::EndsWith(timestamps[i], "C", base::CompareCase::SENSITIVE)) {
-        splice_config_id++;
-        CHECK(splice_config_id < stream_->audio_configs_.size() ||
-              splice_config_id < stream_->video_configs_.size());
-        // Remove the "C" off of the token.
-        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
-      }
-      if (base::EndsWith(timestamps[i], "K", base::CompareCase::SENSITIVE)) {
-        is_keyframe = true;
-        // Remove the "K" off of the token.
-        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
-      }
-      // Handle preroll buffers.
-      if (base::EndsWith(timestamps[i], "P", base::CompareCase::SENSITIVE)) {
-        is_keyframe = true;
-        has_preroll = true;
-        // Remove the "P" off of the token.
-        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
-      }
-
-      if (base::EndsWith(timestamps[i], "E", base::CompareCase::SENSITIVE)) {
-        is_duration_estimated = true;
-        // Remove the "E" off of the token.
-        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
-      }
-
-      int duration_in_ms = 0;
-      size_t duration_pos = timestamps[i].find('D');
-      if (duration_pos != std::string::npos) {
-        CHECK(base::StringToInt(timestamps[i].substr(duration_pos + 1),
-                                &duration_in_ms));
-        timestamps[i] = timestamps[i].substr(0, duration_pos);
-      }
-
-      std::vector<std::string> buffer_timestamps = base::SplitString(
-          timestamps[i], "|", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-
-      if (buffer_timestamps.size() == 1)
-        buffer_timestamps.push_back(buffer_timestamps[0]);
-
-      CHECK_EQ(2u, buffer_timestamps.size());
-
-      int pts_in_ms = 0;
-      int dts_in_ms = 0;
-      CHECK(base::StringToInt(buffer_timestamps[0], &pts_in_ms));
-      CHECK(base::StringToInt(buffer_timestamps[1], &dts_in_ms));
-
-      // Create buffer. Buffer type and track ID are meaningless to these tests.
-      scoped_refptr<StreamParserBuffer> buffer = StreamParserBuffer::CopyFrom(
-          &kDataA, kDataSize, is_keyframe, DemuxerStream::AUDIO, 0);
-      ASSERT_TRUE(buffer);
-      buffer->set_timestamp(base::TimeDelta::FromMilliseconds(pts_in_ms));
-      buffer->set_is_duration_estimated(is_duration_estimated);
-
-      if (dts_in_ms != pts_in_ms) {
-        buffer->SetDecodeTimestamp(
-            DecodeTimestamp::FromMilliseconds(dts_in_ms));
-      }
-
-      if (duration_in_ms)
-        buffer->set_duration(base::TimeDelta::FromMilliseconds(duration_in_ms));
-
-      // Simulate preroll buffers by just generating another buffer and sticking
-      // it as the preroll.
-      if (has_preroll) {
-        scoped_refptr<StreamParserBuffer> preroll_buffer =
-            StreamParserBuffer::CopyFrom(&kDataA, kDataSize, is_keyframe,
-                                         DemuxerStream::AUDIO, 0);
-        ASSERT_TRUE(preroll_buffer);
-        preroll_buffer->set_duration(frame_duration_);
-        buffer->SetPrerollBuffer(preroll_buffer);
-      }
-
-      if (splice_frame) {
-        // Make sure that splice frames aren't used with content where decode
-        // and presentation timestamps can differ. (i.e., B-frames)
-        CHECK_EQ(buffer->GetDecodeTimestamp().InMicroseconds(),
-                 buffer->timestamp().InMicroseconds());
-        if (!pre_splice_buffers.empty()) {
-          // Enforce strictly monotonically increasing timestamps.
-          CHECK_GT(buffer->timestamp().InMicroseconds(),
-                   pre_splice_buffers.back()->timestamp().InMicroseconds());
-          CHECK_GT(
-              buffer->GetDecodeTimestamp().InMicroseconds(),
-              pre_splice_buffers.back()->GetDecodeTimestamp().InMicroseconds());
-        }
-        buffer->SetConfigId(splice_config_id);
-        UpdateLastBufferDuration(buffer->GetDecodeTimestamp(),
-                                 &pre_splice_buffers);
-        pre_splice_buffers.push_back(buffer);
-        continue;
-      }
-
-      if (last_splice_frame) {
-        // Require at least one additional buffer for a splice.
-        CHECK(!pre_splice_buffers.empty());
-        buffer->SetConfigId(splice_config_id);
-        buffer->ConvertToSpliceBuffer(pre_splice_buffers);
-        pre_splice_buffers.clear();
-      }
-
-      UpdateLastBufferDuration(buffer->GetDecodeTimestamp(), &buffers);
-      buffers.push_back(buffer);
-    }
-
-    // If the last buffer doesn't have a duration, assume it is the
-    // same as the second to last buffer.
-    if (buffers.size() >= 2 &&
-        buffers.back()->duration() <= base::TimeDelta()) {
-      buffers.back()->set_duration(buffers[buffers.size() - 2]->duration());
-    }
-
-    return buffers;
-  }
-
-  void AppendBuffers(const std::string& buffers_to_append,
-                     bool start_new_coded_frame_group,
-                     base::TimeDelta coded_frame_group_start_timestamp,
-                     bool one_by_one, bool expect_success) {
-    BufferQueue buffers = StringToBufferQueue(buffers_to_append);
-
-    if (start_new_coded_frame_group) {
-      base::TimeDelta start_timestamp = coded_frame_group_start_timestamp;
-      if (start_timestamp == kNoTimestamp)
-        start_timestamp = buffers[0]->timestamp();
-
-      ASSERT_TRUE(start_timestamp <= buffers[0]->timestamp());
-
-      stream_->OnStartOfCodedFrameGroup(
-          DecodeTimestamp::FromPresentationTime(start_timestamp));
-    }
-
-    if (!one_by_one) {
-      EXPECT_EQ(expect_success, stream_->Append(buffers));
-      return;
-    }
-
-    // Append each buffer one by one.
-    for (size_t i = 0; i < buffers.size(); i++) {
-      BufferQueue wrapper;
-      wrapper.push_back(buffers[i]);
-      EXPECT_TRUE(stream_->Append(wrapper));
-    }
-  }
-
-  int frames_per_second_;
-  int keyframes_per_second_;
-  base::TimeDelta frame_duration_;
-  DISALLOW_COPY_AND_ASSIGN(SourceBufferStreamTest);
-};
-
-TEST_F(SourceBufferStreamTest, Append_SingleRange) {
-  // Append 15 buffers at positions 0 through 14.
-  NewCodedFrameGroupAppend(0, 15);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,14) }");
-  // Check buffers in range.
-  Seek(0);
-  CheckExpectedBuffers(0, 14);
-}
-
-TEST_F(SourceBufferStreamTest, Append_SingleRange_OneBufferAtATime) {
-  // Append 15 buffers starting at position 0, one buffer at a time.
-  NewCodedFrameGroupAppend(0, 1);
-  for (int i = 1; i < 15; i++) AppendBuffers(i, 1);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,14) }");
-  // Check buffers in range.
-  Seek(0);
-  CheckExpectedBuffers(0, 14);
-}
-
-TEST_F(SourceBufferStreamTest, Append_DisjointRanges) {
-  // Append 5 buffers at positions 0 through 4.
-  NewCodedFrameGroupAppend(0, 5);
-
-  // Append 10 buffers at positions 15 through 24.
-  NewCodedFrameGroupAppend(15, 10);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,4) [15,24) }");
-  // Check buffers in ranges.
-  Seek(0);
-  CheckExpectedBuffers(0, 4);
-  Seek(15);
-  CheckExpectedBuffers(15, 24);
-}
-
-TEST_F(SourceBufferStreamTest, Append_AdjacentRanges) {
-  // Append 10 buffers at positions 0 through 9.
-  NewCodedFrameGroupAppend(0, 10);
-
-  // Append 11 buffers at positions 15 through 25.
-  NewCodedFrameGroupAppend(15, 11);
-
-  // Append 5 buffers at positions 10 through 14 to bridge the gap.
-  NewCodedFrameGroupAppend(10, 5);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,25) }");
-  // Check buffers in range.
-  Seek(0);
-  CheckExpectedBuffers(0, 25);
-}
-
-TEST_F(SourceBufferStreamTest, Complete_Overlap) {
-  // Append 5 buffers at positions 5 through 9.
-  NewCodedFrameGroupAppend(5, 5);
-
-  // Append 15 buffers at positions 0 through 14.
-  NewCodedFrameGroupAppend(0, 15);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,14) }");
-  // Check buffers in range.
-  Seek(0);
-  CheckExpectedBuffers(0, 14);
-}
-
-TEST_F(SourceBufferStreamTest,
-       Complete_Overlap_AfterGroupTimestampAndBeforeFirstBufferTimestamp) {
-  // Append a coded frame group with a start timestamp of 0, but the first
-  // buffer starts at 30ms. This can happen in muxed content where the
-  // audio starts before the first frame.
-  NewCodedFrameGroupAppend(base::TimeDelta::FromMilliseconds(0),
-                           "30K 60K 90K 120K");
-
-  CheckExpectedRangesByTimestamp("{ [0,150) }");
-
-  // Completely overlap the old buffers, with a coded frame group that starts
-  // after the old coded frame group start timestamp, but before the timestamp
-  // of the first buffer in the coded frame group.
-  NewCodedFrameGroupAppend("20K 50K 80K 110D10K");
-
-  // Verify that the buffered ranges are updated properly and we don't crash.
-  CheckExpectedRangesByTimestamp("{ [20,150) }");
-
-  SeekToTimestampMs(20);
-  CheckExpectedBuffers("20K 50K 80K 110K 120K");
-}
-
-TEST_F(SourceBufferStreamTest, Complete_Overlap_EdgeCase) {
-  // Make each frame a keyframe so that it's okay to overlap frames at any point
-  // (instead of needing to respect keyframe boundaries).
-  SetStreamInfo(30, 30);
-
-  // Append 6 buffers at positions 6 through 11.
-  NewCodedFrameGroupAppend(6, 6);
-
-  // Append 8 buffers at positions 5 through 12.
-  NewCodedFrameGroupAppend(5, 8);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [5,12) }");
-  // Check buffers in range.
-  Seek(5);
-  CheckExpectedBuffers(5, 12);
-}
-
-TEST_F(SourceBufferStreamTest, Start_Overlap) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 5);
-
-  // Append 6 buffers at positions 10 through 15.
-  NewCodedFrameGroupAppend(10, 6);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [5,15) }");
-  // Check buffers in range.
-  Seek(5);
-  CheckExpectedBuffers(5, 15);
-}
-
-TEST_F(SourceBufferStreamTest, End_Overlap) {
-  // Append 10 buffers at positions 10 through 19.
-  NewCodedFrameGroupAppend(10, 10);
-
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [5,19) }");
-  // Check buffers in range.
-  Seek(5);
-  CheckExpectedBuffers(5, 19);
-}
-
-TEST_F(SourceBufferStreamTest, End_Overlap_Several) {
-  // Append 10 buffers at positions 10 through 19.
-  NewCodedFrameGroupAppend(10, 10);
-
-  // Append 8 buffers at positions 5 through 12.
-  NewCodedFrameGroupAppend(5, 8);
-
-  // Check expected ranges: stream should not have kept buffers 13 and 14
-  // because the keyframe on which they depended was overwritten.
-  CheckExpectedRanges("{ [5,12) [15,19) }");
-
-  // Check buffers in range.
-  Seek(5);
-  CheckExpectedBuffers(5, 12);
-  CheckNoNextBuffer();
-
-  Seek(19);
-  CheckExpectedBuffers(15, 19);
-}
-
-// Test an end overlap edge case where a single buffer overlaps the
-// beginning of a range.
-// old  : *0K*   30   60   90   120K  150
-// new  : *0K*
-// after: *0K*                 *120K* 150K
-// track:
-TEST_F(SourceBufferStreamTest, End_Overlap_SingleBuffer) {
-  // Seek to start of stream.
-  SeekToTimestampMs(0);
-
-  NewCodedFrameGroupAppend("0K 30 60 90 120K 150");
-  CheckExpectedRangesByTimestamp("{ [0,180) }");
-
-  NewCodedFrameGroupAppend("0D30K");
-  CheckExpectedRangesByTimestamp("{ [0,30) [120,180) }");
-
-  CheckExpectedBuffers("0K");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Complete_Overlap_Several) {
-  // Append 2 buffers at positions 5 through 6.
-  NewCodedFrameGroupAppend(5, 2);
-
-  // Append 2 buffers at positions 10 through 11.
-  NewCodedFrameGroupAppend(10, 2);
-
-  // Append 2 buffers at positions 15 through 16.
-  NewCodedFrameGroupAppend(15, 2);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [5,6) [10,11) [15,16) }");
-
-  // Append buffers at positions 0 through 19.
-  NewCodedFrameGroupAppend(0, 20);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,19) }");
-  // Check buffers in range.
-  Seek(0);
-  CheckExpectedBuffers(0, 19);
-}
-
-TEST_F(SourceBufferStreamTest, Complete_Overlap_Several_Then_Merge) {
-  // Append 2 buffers at positions 5 through 6.
-  NewCodedFrameGroupAppend(5, 2);
-
-  // Append 2 buffers at positions 10 through 11.
-  NewCodedFrameGroupAppend(10, 2);
-
-  // Append 2 buffers at positions 15 through 16.
-  NewCodedFrameGroupAppend(15, 2);
-
-  // Append 2 buffers at positions 20 through 21.
-  NewCodedFrameGroupAppend(20, 2);
-
-  // Append buffers at positions 0 through 19.
-  NewCodedFrameGroupAppend(0, 20);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,21) }");
-  // Check buffers in range.
-  Seek(0);
-  CheckExpectedBuffers(0, 21);
-}
-
-TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to buffer at position 5.
-  Seek(5);
-
-  // Replace old data with new data.
-  NewCodedFrameGroupAppend(5, 10, &kDataB);
-
-  // Check ranges are correct.
-  CheckExpectedRanges("{ [5,14) }");
-
-  // Check that data has been replaced with new data.
-  CheckExpectedBuffers(5, 14, &kDataB);
-}
-
-// This test is testing that a client can append data to SourceBufferStream that
-// overlaps the range from which the client is currently grabbing buffers. We
-// would expect that the SourceBufferStream would return old data until it hits
-// the keyframe of the new data, after which it will return the new data.
-TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_TrackBuffer) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to buffer at position 5 and get next buffer.
-  Seek(5);
-  CheckExpectedBuffers(5, 5, &kDataA);
-
-  // Do a complete overlap by appending 20 buffers at positions 0 through 19.
-  NewCodedFrameGroupAppend(0, 20, &kDataB);
-
-  // Check range is correct.
-  CheckExpectedRanges("{ [0,19) }");
-
-  // Expect old data up until next keyframe in new data.
-  CheckExpectedBuffers(6, 9, &kDataA);
-  CheckExpectedBuffers(10, 10, &kDataB, true);
-
-  // Expect rest of data to be new.
-  CheckExpectedBuffers(11, 19, &kDataB);
-
-  // Seek back to beginning; all data should be new.
-  Seek(0);
-  CheckExpectedBuffers(0, 19, &kDataB);
-
-  // Check range continues to be correct.
-  CheckExpectedRanges("{ [0,19) }");
-}
-
-TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_EdgeCase) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to buffer at position 5 and get next buffer.
-  Seek(5);
-  CheckExpectedBuffers(5, 5, &kDataA);
-
-  // Replace existing data with new data.
-  NewCodedFrameGroupAppend(5, 10, &kDataB);
-
-  // Check ranges are correct.
-  CheckExpectedRanges("{ [5,14) }");
-
-  // Expect old data up until next keyframe in new data.
-  CheckExpectedBuffers(6, 9, &kDataA);
-  CheckExpectedBuffers(10, 10, &kDataB, true);
-
-  // Expect rest of data to be new.
-  CheckExpectedBuffers(11, 14, &kDataB);
-
-  // Seek back to beginning; all data should be new.
-  Seek(5);
-  CheckExpectedBuffers(5, 14, &kDataB);
-
-  // Check range continues to be correct.
-  CheckExpectedRanges("{ [5,14) }");
-}
-
-TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_Multiple) {
-  static const uint8_t kDataC = 0x55;
-  static const uint8_t kDataD = 0x77;
-
-  // Append 5 buffers at positions 5 through 9.
-  NewCodedFrameGroupAppend(5, 5, &kDataA);
-
-  // Seek to buffer at position 5 and get next buffer.
-  Seek(5);
-  CheckExpectedBuffers(5, 5, &kDataA);
-
-  // Replace existing data with new data.
-  NewCodedFrameGroupAppend(5, 5, &kDataB);
-
-  // Then replace it again with different data.
-  NewCodedFrameGroupAppend(5, 5, &kDataC);
-
-  // Now append 5 new buffers at positions 10 through 14.
-  NewCodedFrameGroupAppend(10, 5, &kDataC);
-
-  // Now replace all the data entirely.
-  NewCodedFrameGroupAppend(5, 10, &kDataD);
-
-  // Expect buffers 6 through 9 to be DataA, and the remaining
-  // buffers to be kDataD.
-  CheckExpectedBuffers(6, 9, &kDataA);
-  CheckExpectedBuffers(10, 14, &kDataD);
-
-  // At this point we cannot fulfill request.
-  CheckNoNextBuffer();
-
-  // Seek back to beginning; all data should be new.
-  Seek(5);
-  CheckExpectedBuffers(5, 14, &kDataD);
-}
-
-TEST_F(SourceBufferStreamTest, Start_Overlap_Selected) {
-  // Append 10 buffers at positions 0 through 9.
-  NewCodedFrameGroupAppend(0, 10, &kDataA);
-
-  // Seek to position 5, then add buffers to overlap data at that position.
-  Seek(5);
-  NewCodedFrameGroupAppend(5, 10, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,14) }");
-
-  // Because we seeked to a keyframe, the next buffers should all be new data.
-  CheckExpectedBuffers(5, 14, &kDataB);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 4, &kDataA);
-  CheckExpectedBuffers(5, 14, &kDataB);
-}
-
-TEST_F(SourceBufferStreamTest, Start_Overlap_Selected_TrackBuffer) {
-  // Append 15 buffers at positions 0 through 14.
-  NewCodedFrameGroupAppend(0, 15, &kDataA);
-
-  // Seek to 10 and get buffer.
-  Seek(10);
-  CheckExpectedBuffers(10, 10, &kDataA);
-
-  // Now append 10 buffers of new data at positions 10 through 19.
-  NewCodedFrameGroupAppend(10, 10, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,19) }");
-
-  // The next 4 buffers should be a from the old buffer, followed by a keyframe
-  // from the new data.
-  CheckExpectedBuffers(11, 14, &kDataA);
-  CheckExpectedBuffers(15, 15, &kDataB, true);
-
-  // The rest of the buffers should be new data.
-  CheckExpectedBuffers(16, 19, &kDataB);
-
-  // Now seek to the beginning; positions 0 through 9 should be the original
-  // data, positions 10 through 19 should be the new data.
-  Seek(0);
-  CheckExpectedBuffers(0, 9, &kDataA);
-  CheckExpectedBuffers(10, 19, &kDataB);
-
-  // Make sure range is still correct.
-  CheckExpectedRanges("{ [0,19) }");
-}
-
-TEST_F(SourceBufferStreamTest, Start_Overlap_Selected_EdgeCase) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  Seek(10);
-  CheckExpectedBuffers(10, 10, &kDataA);
-
-  // Now replace the last 5 buffers with new data.
-  NewCodedFrameGroupAppend(10, 5, &kDataB);
-
-  // The next 4 buffers should be the original data, held in the track buffer.
-  CheckExpectedBuffers(11, 14, &kDataA);
-
-  // The next buffer is at position 15, so we should fail to fulfill the
-  // request.
-  CheckNoNextBuffer();
-
-  // Now append data at 15 through 19 and check to make sure it's correct.
-  NewCodedFrameGroupAppend(15, 5, &kDataB);
-  CheckExpectedBuffers(15, 19, &kDataB);
-
-  // Seek to beginning of buffered range and check buffers.
-  Seek(5);
-  CheckExpectedBuffers(5, 9, &kDataA);
-  CheckExpectedBuffers(10, 19, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [5,19) }");
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and the next buffer is a keyframe that's being overlapped by new
-// buffers.
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :           *A*a a a a A a a a a
-// new  :  B b b b b B b b b b
-// after:  B b b b b*B*b b b b A a a a a
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to position 5.
-  Seek(5);
-
-  // Now append 10 buffers at positions 0 through 9.
-  NewCodedFrameGroupAppend(0, 10, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,14) }");
-
-  // Because we seeked to a keyframe, the next buffers should be new.
-  CheckExpectedBuffers(5, 9, &kDataB);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 9, &kDataB);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and the next buffer in the range is after the newly appended buffers.
-// In this particular case, the end overlap does not require a split.
-//
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :           |A a a a a A a a*a*a|
-// new  :  B b b b b B b b b b
-// after: |B b b b b B b b b b A a a*a*a|
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_1) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to position 10, then move to position 13.
-  Seek(10);
-  CheckExpectedBuffers(10, 12, &kDataA);
-
-  // Now append 10 buffers at positions 0 through 9.
-  NewCodedFrameGroupAppend(0, 10, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,14) }");
-
-  // Make sure rest of data is as expected.
-  CheckExpectedBuffers(13, 14, &kDataA);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 9, &kDataB);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and the next buffer in the range is after the newly appended buffers.
-// In this particular case, the end overlap requires a split, and the next
-// buffer is in the split range.
-//
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :           |A a a a a A a a*a*a|
-// new  :  B b b b b B b b
-// after: |B b b b b B b b|   |A a a*a*a|
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_2) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to position 10, then move to position 13.
-  Seek(10);
-  CheckExpectedBuffers(10, 12, &kDataA);
-
-  // Now append 8 buffers at positions 0 through 7.
-  NewCodedFrameGroupAppend(0, 8, &kDataB);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,7) [10,14) }");
-
-  // Make sure rest of data is as expected.
-  CheckExpectedBuffers(13, 14, &kDataA);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 7, &kDataB);
-  CheckNoNextBuffer();
-
-  Seek(10);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and the next buffer in the range is after the newly appended buffers.
-// In this particular case, the end overlap requires a split, and the next
-// buffer was in between the end of the new data and the split range.
-//
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :           |A a a*a*a A a a a a|
-// new  :  B b b b b B b b
-// after: |B b b b b B b b|   |A a a a a|
-// track:                 |a a|
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_3) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to position 5, then move to position 8.
-  Seek(5);
-  CheckExpectedBuffers(5, 7, &kDataA);
-
-  // Now append 8 buffers at positions 0 through 7.
-  NewCodedFrameGroupAppend(0, 8, &kDataB);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,7) [10,14) }");
-
-  // Check for data in the track buffer.
-  CheckExpectedBuffers(8, 9, &kDataA);
-  // The buffer immediately after the track buffer should be a keyframe.
-  CheckExpectedBuffers(10, 10, &kDataA, true);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 7, &kDataB);
-  Seek(10);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and the next buffer in the range is overlapped by the new buffers.
-// In this particular case, the end overlap does not require a split.
-//
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :           |A a a*a*a A a a a a|
-// new  :  B b b b b B b b b b
-// after: |B b b b b B b b b b A a a a a|
-// track:                 |a a|
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_1) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to position 5, then move to position 8.
-  Seek(5);
-  CheckExpectedBuffers(5, 7, &kDataA);
-
-  // Now append 10 buffers at positions 0 through 9.
-  NewCodedFrameGroupAppend(0, 10, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,14) }");
-
-  // Check for data in the track buffer.
-  CheckExpectedBuffers(8, 9, &kDataA);
-  // The buffer immediately after the track buffer should be a keyframe.
-  CheckExpectedBuffers(10, 10, &kDataA, true);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 9, &kDataB);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and the next buffer in the range is overlapped by the new buffers.
-// In this particular case, the end overlap requires a split, and the next
-// keyframe after the track buffer is in the split range.
-//
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :           |A*a*a a a A a a a a|
-// new  :  B b b b b B b
-// after: |B b b b b B b|     |A a a a a|
-// track:             |a a a a|
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_2) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to position 5, then move to position 6.
-  Seek(5);
-  CheckExpectedBuffers(5, 5, &kDataA);
-
-  // Now append 7 buffers at positions 0 through 6.
-  NewCodedFrameGroupAppend(0, 7, &kDataB);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,6) [10,14) }");
-
-  // Check for data in the track buffer.
-  CheckExpectedBuffers(6, 9, &kDataA);
-  // The buffer immediately after the track buffer should be a keyframe.
-  CheckExpectedBuffers(10, 10, &kDataA, true);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 6, &kDataB);
-  CheckNoNextBuffer();
-
-  Seek(10);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and the next buffer in the range is overlapped by the new buffers.
-// In this particular case, the end overlap requires a split, and the next
-// keyframe after the track buffer is in the range with the new buffers.
-//
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :           |A*a*a a a A a a a a A a a a a|
-// new  :  B b b b b B b b b b B b b
-// after: |B b b b b B b b b b B b b|   |A a a a a|
-// track:             |a a a a|
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_3) {
-  // Append 15 buffers at positions 5 through 19.
-  NewCodedFrameGroupAppend(5, 15, &kDataA);
-
-  // Seek to position 5, then move to position 6.
-  Seek(5);
-  CheckExpectedBuffers(5, 5, &kDataA);
-
-  // Now append 13 buffers at positions 0 through 12.
-  NewCodedFrameGroupAppend(0, 13, &kDataB);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,12) [15,19) }");
-
-  // Check for data in the track buffer.
-  CheckExpectedBuffers(6, 9, &kDataA);
-  // The buffer immediately after the track buffer should be a keyframe
-  // from the new data.
-  CheckExpectedBuffers(10, 10, &kDataB, true);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 12, &kDataB);
-  CheckNoNextBuffer();
-
-  Seek(15);
-  CheckExpectedBuffers(15, 19, &kDataA);
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and there is no keyframe after the end of the new buffers.
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :           |A*a*a a a|
-// new  :  B b b b b B
-// after: |B b b b b B|
-// track:             |a a a a|
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew) {
-  // Append 5 buffers at positions 5 through 9.
-  NewCodedFrameGroupAppend(5, 5, &kDataA);
-
-  // Seek to position 5, then move to position 6.
-  Seek(5);
-  CheckExpectedBuffers(5, 5, &kDataA);
-
-  // Now append 6 buffers at positions 0 through 5.
-  NewCodedFrameGroupAppend(0, 6, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,5) }");
-
-  // Check for data in the track buffer.
-  CheckExpectedBuffers(6, 9, &kDataA);
-
-  // Now there's no data to fulfill the request.
-  CheckNoNextBuffer();
-
-  // Let's fill in the gap, buffers 6 through 10.
-  AppendBuffers(6, 5, &kDataB);
-
-  // We should be able to get the next buffer.
-  CheckExpectedBuffers(10, 10, &kDataB);
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and there is no keyframe after the end of the new buffers, then the
-// range gets split.
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :                     |A a a a a A*a*|
-// new  :            B b b b b B b b b b B
-// after:           |B b b b b B b b b b B|
-// new  :  A a a a a A
-// after: |A a a a a A|       |B b b b b B|
-// track:                                 |a|
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew2) {
-  EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(133));
-
-  // Append 7 buffers at positions 10 through 16.
-  NewCodedFrameGroupAppend(10, 7, &kDataA);
-
-  // Seek to position 15, then move to position 16.
-  Seek(15);
-  CheckExpectedBuffers(15, 15, &kDataA);
-
-  // Now append 11 buffers at positions 5 through 15.
-  NewCodedFrameGroupAppend(5, 11, &kDataB);
-  CheckExpectedRanges("{ [5,15) }");
-
-  // Now do another end-overlap to split the range into two parts, where the
-  // 2nd range should have the next buffer position.
-  NewCodedFrameGroupAppend(0, 6, &kDataA);
-  CheckExpectedRanges("{ [0,5) [10,15) }");
-
-  // Check for data in the track buffer.
-  CheckExpectedBuffers(16, 16, &kDataA);
-
-  // Now there's no data to fulfill the request.
-  CheckNoNextBuffer();
-
-  // Add data to the 2nd range, should not be able to fulfill the next read
-  // until we've added a keyframe.
-  NewCodedFrameGroupAppend(15, 1, &kDataB);
-  CheckNoNextBuffer();
-  for (int i = 16; i <= 19; i++) {
-    AppendBuffers(i, 1, &kDataB);
-    CheckNoNextBuffer();
-  }
-
-  // Now append a keyframe.
-  AppendBuffers(20, 1, &kDataB);
-
-  // We should be able to get the next buffer.
-  CheckExpectedBuffers(20, 20, &kDataB, true);
-}
-
-// This test covers the case where new buffers end-overlap an existing, selected
-// range, and the next keyframe in a separate range.
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :           |A*a*a a a|          |A a a a a|
-// new  :  B b b b b B
-// after: |B b b b b B|                  |A a a a a|
-// track:             |a a a a|
-TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew3) {
-  // Append 5 buffers at positions 5 through 9.
-  NewCodedFrameGroupAppend(5, 5, &kDataA);
-
-  // Append 5 buffers at positions 15 through 19.
-  NewCodedFrameGroupAppend(15, 5, &kDataA);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [5,9) [15,19) }");
-
-  // Seek to position 5, then move to position 6.
-  Seek(5);
-  CheckExpectedBuffers(5, 5, &kDataA);
-
-  // Now append 6 buffers at positions 0 through 5.
-  NewCodedFrameGroupAppend(0, 6, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,5) [15,19) }");
-
-  // Check for data in the track buffer.
-  CheckExpectedBuffers(6, 9, &kDataA);
-
-  // Now there's no data to fulfill the request.
-  CheckNoNextBuffer();
-
-  // Let's fill in the gap, buffers 6 through 14.
-  AppendBuffers(6, 9, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,19) }");
-
-  // We should be able to get the next buffer.
-  CheckExpectedBuffers(10, 14, &kDataB);
-
-  // We should be able to get the next buffer.
-  CheckExpectedBuffers(15, 19, &kDataA);
-}
-
-// This test covers the case when new buffers overlap the middle of a selected
-// range. This tests the case when there is no split and the next buffer is a
-// keyframe.
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :  A a a a a*A*a a a a A a a a a
-// new  :            B b b b b
-// after:  A a a a a*B*b b b b A a a a a
-TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_1) {
-  // Append 15 buffers at positions 0 through 14.
-  NewCodedFrameGroupAppend(0, 15, &kDataA);
-
-  // Seek to position 5.
-  Seek(5);
-
-  // Now append 5 buffers at positions 5 through 9.
-  NewCodedFrameGroupAppend(5, 5, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,14) }");
-
-  // Check for next data; should be new data.
-  CheckExpectedBuffers(5, 9, &kDataB);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 4, &kDataA);
-  CheckExpectedBuffers(5, 9, &kDataB);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-// This test covers the case when new buffers overlap the middle of a selected
-// range. This tests the case when there is no split and the next buffer is
-// after the new buffers.
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :  A a a a a A a a a a A*a*a a a
-// new  :            B b b b b
-// after:  A a a a a B b b b b A*a*a a a
-TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_2) {
-  // Append 15 buffers at positions 0 through 14.
-  NewCodedFrameGroupAppend(0, 15, &kDataA);
-
-  // Seek to 10 then move to position 11.
-  Seek(10);
-  CheckExpectedBuffers(10, 10, &kDataA);
-
-  // Now append 5 buffers at positions 5 through 9.
-  NewCodedFrameGroupAppend(5, 5, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,14) }");
-
-  // Make sure data is correct.
-  CheckExpectedBuffers(11, 14, &kDataA);
-  Seek(0);
-  CheckExpectedBuffers(0, 4, &kDataA);
-  CheckExpectedBuffers(5, 9, &kDataB);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-// This test covers the case when new buffers overlap the middle of a selected
-// range. This tests the case when there is a split and the next buffer is
-// before the new buffers.
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :  A a*a*a a A a a a a A a a a a
-// new  :            B b b
-// after:  A a*a*a a B b b|   |A a a a a
-TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_3) {
-  // Append 15 buffers at positions 0 through 14.
-  NewCodedFrameGroupAppend(0, 15, &kDataA);
-
-  // Seek to beginning then move to position 2.
-  Seek(0);
-  CheckExpectedBuffers(0, 1, &kDataA);
-
-  // Now append 3 buffers at positions 5 through 7.
-  NewCodedFrameGroupAppend(5, 3, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,7) [10,14) }");
-
-  // Make sure data is correct.
-  CheckExpectedBuffers(2, 4, &kDataA);
-  CheckExpectedBuffers(5, 7, &kDataB);
-  Seek(10);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-// This test covers the case when new buffers overlap the middle of a selected
-// range. This tests the case when there is a split and the next buffer is after
-// the new buffers but before the split range.
-// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
-// old  :  A a a a a A a a*a*a A a a a a
-// new  :            B b b
-// after: |A a a a a B b b|   |A a a a a|
-// track:                 |a a|
-TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_4) {
-  // Append 15 buffers at positions 0 through 14.
-  NewCodedFrameGroupAppend(0, 15, &kDataA);
-
-  // Seek to 5 then move to position 8.
-  Seek(5);
-  CheckExpectedBuffers(5, 7, &kDataA);
-
-  // Now append 3 buffers at positions 5 through 7.
-  NewCodedFrameGroupAppend(5, 3, &kDataB);
-
-  // Check expected range.
-  CheckExpectedRanges("{ [0,7) [10,14) }");
-
-  // Buffers 8 and 9 should be in the track buffer.
-  CheckExpectedBuffers(8, 9, &kDataA);
-  // The buffer immediately after the track buffer should be a keyframe.
-  CheckExpectedBuffers(10, 10, &kDataA, true);
-
-  // Make sure all data is correct.
-  Seek(0);
-  CheckExpectedBuffers(0, 4, &kDataA);
-  CheckExpectedBuffers(5, 7, &kDataB);
-  Seek(10);
-  CheckExpectedBuffers(10, 14, &kDataA);
-}
-
-TEST_F(SourceBufferStreamTest, Overlap_OneByOne) {
-  // Append 5 buffers starting at 10ms, 30ms apart.
-  NewCodedFrameGroupAppendOneByOne("10K 40 70 100 130");
-
-  // The range ends at 160, accounting for the last buffer's duration.
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-
-  // Overlap with 10 buffers starting at the beginning, appended one at a
-  // time.
-  NewCodedFrameGroupAppend(0, 1, &kDataB);
-  for (int i = 1; i < 10; i++) AppendBuffers(i, 1, &kDataB);
-
-  // All data should be replaced.
-  Seek(0);
-  CheckExpectedRanges("{ [0,9) }");
-  CheckExpectedBuffers(0, 9, &kDataB);
-}
-
-TEST_F(SourceBufferStreamTest, Overlap_OneByOne_DeleteGroup) {
-  NewCodedFrameGroupAppendOneByOne("10K 40 70 100 130K");
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-
-  // Seek to 130ms.
-  SeekToTimestampMs(130);
-
-  // Overlap with a new coded frame group from 0 to 130ms.
-  NewCodedFrameGroupAppendOneByOne("0K 120D10");
-
-  // Next buffer should still be 130ms.
-  CheckExpectedBuffers("130K");
-
-  // Check the final buffers is correct.
-  SeekToTimestampMs(0);
-  CheckExpectedBuffers("0K 120 130K");
-}
-
-TEST_F(SourceBufferStreamTest, Overlap_OneByOne_BetweenCodedFrameGroups) {
-  // Append 5 buffers starting at 110ms, 30ms apart.
-  NewCodedFrameGroupAppendOneByOne("110K 140 170 200 230");
-  CheckExpectedRangesByTimestamp("{ [110,260) }");
-
-  // Now append 2 coded frame groups from 0ms to 210ms, 30ms apart. Note that
-  // the
-  // old keyframe 110ms falls in between these two groups.
-  NewCodedFrameGroupAppendOneByOne("0K 30 60 90");
-  NewCodedFrameGroupAppendOneByOne("120K 150 180 210");
-  CheckExpectedRangesByTimestamp("{ [0,240) }");
-
-  // Check the final buffers is correct; the keyframe at 110ms should be
-  // deleted.
-  SeekToTimestampMs(0);
-  CheckExpectedBuffers("0K 30 60 90 120K 150 180 210");
-}
-
-// old  :   10K  40  *70*  100K  125  130K
-// new  : 0K   30   60   90   120K
-// after: 0K   30   60   90  *120K*   130K
-TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer) {
-  EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(50));
-
-  NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K");
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-
-  // Seek to 70ms.
-  SeekToTimestampMs(70);
-  CheckExpectedBuffers("10K 40");
-
-  // Overlap with a new coded frame group from 0 to 130ms.
-  NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K");
-  CheckExpectedRangesByTimestamp("{ [0,160) }");
-
-  // Should return frame 70ms from the track buffer, then switch
-  // to the new data at 120K, then switch back to the old data at 130K. The
-  // frame at 125ms that depended on keyframe 100ms should have been deleted.
-  CheckExpectedBuffers("70 120K 130K");
-
-  // Check the final result: should not include data from the track buffer.
-  SeekToTimestampMs(0);
-  CheckExpectedBuffers("0K 30 60 90 120K 130K");
-}
-
-// Overlap the next keyframe after the end of the track buffer with a new
-// keyframe.
-// old  :   10K  40  *70*  100K  125  130K
-// new  : 0K   30   60   90   120K
-// after: 0K   30   60   90  *120K*   130K
-// track:             70
-// new  :                     110K    130
-// after: 0K   30   60   90  *110K*   130
-TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer2) {
-  EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(40));
-
-  NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K");
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-
-  // Seek to 70ms.
-  SeekToTimestampMs(70);
-  CheckExpectedBuffers("10K 40");
-
-  // Overlap with a new coded frame group from 0 to 120ms; 70ms and 100ms go in
-  // track
-  // buffer.
-  NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K");
-  CheckExpectedRangesByTimestamp("{ [0,160) }");
-
-  // Now overlap the keyframe at 120ms.
-  NewCodedFrameGroupAppendOneByOne("110K 130");
-
-  // Should return frame 70ms from the track buffer. Then it should
-  // return the keyframe after the track buffer, which is at 110ms.
-  CheckExpectedBuffers("70 110K 130");
-}
-
-// Overlap the next keyframe after the end of the track buffer without a
-// new keyframe.
-// old  :   10K  40  *70*  100K  125  130K
-// new  : 0K   30   60   90   120K
-// after: 0K   30   60   90  *120K*   130K
-// track:             70
-// new  :        50K   80   110          140
-// after: 0K   30   50K   80   110   140 * (waiting for keyframe)
-// track:             70
-TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer3) {
-  EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(80));
-
-  NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K");
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-
-  // Seek to 70ms.
-  SeekToTimestampMs(70);
-  CheckExpectedBuffers("10K 40");
-
-  // Overlap with a new coded frame group from 0 to 120ms; 70ms goes in track
-  // buffer.
-  NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K");
-  CheckExpectedRangesByTimestamp("{ [0,160) }");
-
-  // Now overlap the keyframe at 120ms and 130ms.
-  NewCodedFrameGroupAppendOneByOne("50K 80 110 140");
-  CheckExpectedRangesByTimestamp("{ [0,170) }");
-
-  // Should have all the buffers from the track buffer, then stall.
-  CheckExpectedBuffers("70");
-  CheckNoNextBuffer();
-
-  // Appending a keyframe should fulfill the read.
-  AppendBuffersOneByOne("150D30K");
-  CheckExpectedBuffers("150K");
-  CheckNoNextBuffer();
-}
-
-// Overlap the next keyframe after the end of the track buffer with a keyframe
-// that comes before the end of the track buffer.
-// old  :   10K  40  *70*  100K  125  130K
-// new  : 0K   30   60   90   120K
-// after: 0K   30   60   90  *120K*   130K
-// track:             70
-// new  :              80K  110          140
-// after: 0K   30   60   *80K*  110   140
-// track:               70
-TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer4) {
-  NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K");
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-
-  // Seek to 70ms.
-  SeekToTimestampMs(70);
-  CheckExpectedBuffers("10K 40");
-
-  // Overlap with a new coded frame group from 0 to 120ms; 70ms and 100ms go in
-  // track
-  // buffer.
-  NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K");
-  CheckExpectedRangesByTimestamp("{ [0,160) }");
-
-  // Now append a keyframe at 80ms.
-  NewCodedFrameGroupAppendOneByOne("80K 110 140");
-
-  CheckExpectedBuffers("70 80K 110 140");
-  CheckNoNextBuffer();
-}
-
-// Overlap the next keyframe after the end of the track buffer with a keyframe
-// that comes before the end of the track buffer, when the selected stream was
-// waiting for the next keyframe.
-// old  :   10K  40  *70*  100K
-// new  : 0K   30   60   90   120
-// after: 0K   30   60   90   120 * (waiting for keyframe)
-// track:             70
-// new  :              80K  110          140
-// after: 0K   30   60   *80K*  110   140
-// track:               70
-TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer5) {
-  NewCodedFrameGroupAppendOneByOne("10K 40 70 100K");
-  CheckExpectedRangesByTimestamp("{ [10,130) }");
-
-  // Seek to 70ms.
-  SeekToTimestampMs(70);
-  CheckExpectedBuffers("10K 40");
-
-  // Overlap with a new coded frame group from 0 to 120ms; 70ms goes in track
-  // buffer.
-  NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120");
-  CheckExpectedRangesByTimestamp("{ [0,150) }");
-
-  // Now append a keyframe at 80ms.
-  NewCodedFrameGroupAppendOneByOne("80K 110 140");
-
-  CheckExpectedBuffers("70 80K 110 140");
-  CheckNoNextBuffer();
-}
-
-// Test that appending to a different range while there is data in
-// the track buffer doesn't affect the selected range or track buffer state.
-// old  :   10K  40  *70*  100K  125  130K ... 200K 230
-// new  : 0K   30   60   90   120K
-// after: 0K   30   60   90  *120K*   130K ... 200K 230
-// track:             70
-// old  : 0K   30   60   90  *120K*   130K ... 200K 230
-// new  :                                               260K 290
-// after: 0K   30   60   90  *120K*   130K ... 200K 230 260K 290
-// track:             70
-TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer6) {
-  EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(50));
-
-  NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K");
-  NewCodedFrameGroupAppendOneByOne("200K 230");
-  CheckExpectedRangesByTimestamp("{ [10,160) [200,260) }");
-
-  // Seek to 70ms.
-  SeekToTimestampMs(70);
-  CheckExpectedBuffers("10K 40");
-
-  // Overlap with a new coded frame group from 0 to 120ms.
-  NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K");
-  CheckExpectedRangesByTimestamp("{ [0,160) [200,260) }");
-
-  // Verify that 70 gets read out of the track buffer.
-  CheckExpectedBuffers("70");
-
-  // Append more data to the unselected range.
-  NewCodedFrameGroupAppendOneByOne("260K 290");
-  CheckExpectedRangesByTimestamp("{ [0,160) [200,320) }");
-
-  CheckExpectedBuffers("120K 130K");
-  CheckNoNextBuffer();
-
-  // Check the final result: should not include data from the track buffer.
-  SeekToTimestampMs(0);
-  CheckExpectedBuffers("0K 30 60 90 120K 130K");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Seek_Keyframe) {
-  // Append 6 buffers at positions 0 through 5.
-  NewCodedFrameGroupAppend(0, 6);
-
-  // Seek to beginning.
-  Seek(0);
-  CheckExpectedBuffers(0, 5, true);
-}
-
-TEST_F(SourceBufferStreamTest, Seek_NonKeyframe) {
-  // Append 15 buffers at positions 0 through 14.
-  NewCodedFrameGroupAppend(0, 15);
-
-  // Seek to buffer at position 13.
-  Seek(13);
-
-  // Expect seeking back to the nearest keyframe.
-  CheckExpectedBuffers(10, 14, true);
-
-  // Seek to buffer at position 3.
-  Seek(3);
-
-  // Expect seeking back to the nearest keyframe.
-  CheckExpectedBuffers(0, 3, true);
-}
-
-TEST_F(SourceBufferStreamTest, Seek_NotBuffered) {
-  // Seek to beginning.
-  Seek(0);
-
-  // Try to get buffer; nothing's appended.
-  CheckNoNextBuffer();
-
-  // Append 2 buffers at positions 0.
-  NewCodedFrameGroupAppend(0, 2);
-  Seek(0);
-  CheckExpectedBuffers(0, 1);
-
-  // Try to get buffer out of range.
-  Seek(2);
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Seek_InBetweenTimestamps) {
-  // Append 10 buffers at positions 0 through 9.
-  NewCodedFrameGroupAppend(0, 10);
-
-  base::TimeDelta bump = frame_duration() / 4;
-  CHECK(bump > base::TimeDelta());
-
-  // Seek to buffer a little after position 5.
-  stream_->Seek(5 * frame_duration() + bump);
-  CheckExpectedBuffers(5, 5, true);
-
-  // Seek to buffer a little before position 5.
-  stream_->Seek(5 * frame_duration() - bump);
-  CheckExpectedBuffers(0, 0, true);
-}
-
-// This test will do a complete overlap of an existing range in order to add
-// buffers to the track buffers. Then the test does a seek to another part of
-// the stream. The SourceBufferStream should clear its internal track buffer in
-// response to the Seek().
-TEST_F(SourceBufferStreamTest, Seek_After_TrackBuffer_Filled) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10, &kDataA);
-
-  // Seek to buffer at position 5 and get next buffer.
-  Seek(5);
-  CheckExpectedBuffers(5, 5, &kDataA);
-
-  // Do a complete overlap by appending 20 buffers at positions 0 through 19.
-  NewCodedFrameGroupAppend(0, 20, &kDataB);
-
-  // Check range is correct.
-  CheckExpectedRanges("{ [0,19) }");
-
-  // Seek to beginning; all data should be new.
-  Seek(0);
-  CheckExpectedBuffers(0, 19, &kDataB);
-
-  // Check range continues to be correct.
-  CheckExpectedRanges("{ [0,19) }");
-}
-
-TEST_F(SourceBufferStreamTest, Seek_StartOfGroup) {
-  base::TimeDelta bump = frame_duration() / 4;
-  CHECK(bump > base::TimeDelta());
-
-  // Append 5 buffers at position (5 + |bump|) through 9, where the coded frame
-  // group begins at position 5.
-  Seek(5);
-  NewCodedFrameGroupAppend_OffsetFirstBuffer(5, 5, bump);
-  scoped_refptr<StreamParserBuffer> buffer;
-
-  // GetNextBuffer() should return the next buffer at position (5 + |bump|).
-  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
-  EXPECT_EQ(buffer->GetDecodeTimestamp(),
-            DecodeTimestamp::FromPresentationTime(5 * frame_duration() + bump));
-
-  // Check rest of buffers.
-  CheckExpectedBuffers(6, 9);
-
-  // Seek to position 15.
-  Seek(15);
-
-  // Append 5 buffers at positions (15 + |bump|) through 19, where the coded
-  // frame group begins at 15.
-  NewCodedFrameGroupAppend_OffsetFirstBuffer(15, 5, bump);
-
-  // GetNextBuffer() should return the next buffer at position (15 + |bump|).
-  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
-  EXPECT_EQ(buffer->GetDecodeTimestamp(), DecodeTimestamp::FromPresentationTime(
-                                              15 * frame_duration() + bump));
-
-  // Check rest of buffers.
-  CheckExpectedBuffers(16, 19);
-}
-
-TEST_F(SourceBufferStreamTest, Seek_BeforeStartOfGroup) {
-  // Append 10 buffers at positions 5 through 14.
-  NewCodedFrameGroupAppend(5, 10);
-
-  // Seek to a time before the first buffer in the range.
-  Seek(0);
-
-  // Should return buffers from the beginning of the range.
-  CheckExpectedBuffers(5, 14);
-}
-
-TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap) {
-  // Append 5 buffers at positions 0 through 4.
-  NewCodedFrameGroupAppend(0, 4);
-
-  // Append 5 buffers at positions 10 through 14, and seek to the beginning of
-  // this range.
-  NewCodedFrameGroupAppend(10, 5);
-  Seek(10);
-
-  // Now seek to the beginning of the first range.
-  Seek(0);
-
-  // Completely overlap the old seek point.
-  NewCodedFrameGroupAppend(5, 15);
-
-  // The GetNextBuffer() call should respect the 2nd seek point.
-  CheckExpectedBuffers(0, 0);
-}
-
-TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap_Pending) {
-  // Append 2 buffers at positions 0 through 1.
-  NewCodedFrameGroupAppend(0, 2);
-
-  // Append 5 buffers at positions 15 through 19 and seek to beginning of the
-  // range.
-  NewCodedFrameGroupAppend(15, 5);
-  Seek(15);
-
-  // Now seek position 5.
-  Seek(5);
-
-  // Completely overlap the old seek point.
-  NewCodedFrameGroupAppend(10, 15);
-
-  // The seek at position 5 should still be pending.
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap) {
-  // Append 2 buffers at positions 0 through 1.
-  NewCodedFrameGroupAppend(0, 2);
-
-  // Append 15 buffers at positions 5 through 19 and seek to position 15.
-  NewCodedFrameGroupAppend(5, 15);
-  Seek(15);
-
-  // Now seek to the beginning of the stream.
-  Seek(0);
-
-  // Overlap the middle of the range such that there are now three ranges.
-  NewCodedFrameGroupAppend(10, 3);
-  CheckExpectedRanges("{ [0,1) [5,12) [15,19) }");
-
-  // The GetNextBuffer() call should respect the 2nd seek point.
-  CheckExpectedBuffers(0, 0);
-}
-
-TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap_Pending) {
-  // Append 2 buffers at positions 0 through 1.
-  NewCodedFrameGroupAppend(0, 2);
-
-  // Append 15 buffers at positions 10 through 24 and seek to position 20.
-  NewCodedFrameGroupAppend(10, 15);
-  Seek(20);
-
-  // Now seek to position 5.
-  Seek(5);
-
-  // Overlap the middle of the range such that it is now split into two ranges.
-  NewCodedFrameGroupAppend(15, 3);
-  CheckExpectedRanges("{ [0,1) [10,17) [20,24) }");
-
-  // The seek at position 5 should still be pending.
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap) {
-  // Append 2 buffers at positions 0 through 1.
-  NewCodedFrameGroupAppend(0, 2);
-
-  // Append 15 buffers at positions 5 through 19 and seek to position 15.
-  NewCodedFrameGroupAppend(5, 15);
-  Seek(15);
-
-  // Now seek to the beginning of the stream.
-  Seek(0);
-
-  // Start overlap the old seek point.
-  NewCodedFrameGroupAppend(10, 10);
-
-  // The GetNextBuffer() call should respect the 2nd seek point.
-  CheckExpectedBuffers(0, 0);
-}
-
-TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap_Pending) {
-  // Append 2 buffers at positions 0 through 1.
-  NewCodedFrameGroupAppend(0, 2);
-
-  // Append 15 buffers at positions 10 through 24 and seek to position 20.
-  NewCodedFrameGroupAppend(10, 15);
-  Seek(20);
-
-  // Now seek to position 5.
-  Seek(5);
-
-  // Start overlap the old seek point.
-  NewCodedFrameGroupAppend(15, 10);
-
-  // The seek at time 0 should still be pending.
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap) {
-  // Append 5 buffers at positions 0 through 4.
-  NewCodedFrameGroupAppend(0, 4);
-
-  // Append 15 buffers at positions 10 through 24 and seek to start of range.
-  NewCodedFrameGroupAppend(10, 15);
-  Seek(10);
-
-  // Now seek to the beginning of the stream.
-  Seek(0);
-
-  // End overlap the old seek point.
-  NewCodedFrameGroupAppend(5, 10);
-
-  // The GetNextBuffer() call should respect the 2nd seek point.
-  CheckExpectedBuffers(0, 0);
-}
-
-TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap_Pending) {
-  // Append 2 buffers at positions 0 through 1.
-  NewCodedFrameGroupAppend(0, 2);
-
-  // Append 15 buffers at positions 15 through 29 and seek to start of range.
-  NewCodedFrameGroupAppend(15, 15);
-  Seek(15);
-
-  // Now seek to position 5
-  Seek(5);
-
-  // End overlap the old seek point.
-  NewCodedFrameGroupAppend(10, 10);
-
-  // The seek at time 0 should still be pending.
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, GetNextBuffer_AfterMerges) {
-  // Append 5 buffers at positions 10 through 14.
-  NewCodedFrameGroupAppend(10, 5);
-
-  // Seek to buffer at position 12.
-  Seek(12);
-
-  // Append 5 buffers at positions 5 through 9.
-  NewCodedFrameGroupAppend(5, 5);
-
-  // Make sure ranges are merged.
-  CheckExpectedRanges("{ [5,14) }");
-
-  // Make sure the next buffer is correct.
-  CheckExpectedBuffers(10, 10);
-
-  // Append 5 buffers at positions 15 through 19.
-  NewCodedFrameGroupAppend(15, 5);
-  CheckExpectedRanges("{ [5,19) }");
-
-  // Make sure the remaining next buffers are correct.
-  CheckExpectedBuffers(11, 14);
-}
-
-TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenAppend) {
-  // Append 4 buffers at positions 0 through 3.
-  NewCodedFrameGroupAppend(0, 4);
-
-  // Seek to buffer at position 0 and get all buffers.
-  Seek(0);
-  CheckExpectedBuffers(0, 3);
-
-  // Next buffer is at position 4, so should not be able to fulfill request.
-  CheckNoNextBuffer();
-
-  // Append 2 buffers at positions 4 through 5.
-  AppendBuffers(4, 2);
-  CheckExpectedBuffers(4, 5);
-}
-
-// This test covers the case where new buffers start-overlap a range whose next
-// buffer is not buffered.
-TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenStartOverlap) {
-  // Append 10 buffers at positions 0 through 9 and exhaust the buffers.
-  NewCodedFrameGroupAppend(0, 10, &kDataA);
-  Seek(0);
-  CheckExpectedBuffers(0, 9, &kDataA);
-
-  // Next buffer is at position 10, so should not be able to fulfill request.
-  CheckNoNextBuffer();
-
-  // Append 6 buffers at positions 5 through 10. This is to test that doing a
-  // start-overlap successfully fulfills the read at position 10, even though
-  // position 10 was unbuffered.
-  NewCodedFrameGroupAppend(5, 6, &kDataB);
-  CheckExpectedBuffers(10, 10, &kDataB);
-
-  // Then add 5 buffers from positions 11 though 15.
-  AppendBuffers(11, 5, &kDataB);
-
-  // Check the next 4 buffers are correct, which also effectively seeks to
-  // position 15.
-  CheckExpectedBuffers(11, 14, &kDataB);
-
-  // Replace the next buffer at position 15 with another start overlap.
-  NewCodedFrameGroupAppend(15, 2, &kDataA);
-  CheckExpectedBuffers(15, 16, &kDataA);
-}
-
-// Tests a start overlap that occurs right at the timestamp of the last output
-// buffer that was returned by GetNextBuffer(). This test verifies that
-// GetNextBuffer() skips to second GOP in the newly appended data instead
-// of returning two buffers with the same timestamp.
-TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenStartOverlap2) {
-  NewCodedFrameGroupAppend("0K 30 60 90 120");
-
-  Seek(0);
-  CheckExpectedBuffers("0K 30 60 90 120");
-  CheckNoNextBuffer();
-
-  // Append a keyframe with the same timestamp as the last buffer output.
-  NewCodedFrameGroupAppend("120D30K");
-  CheckNoNextBuffer();
-
-  // Append the rest of the coded frame group and make sure that buffers are
-  // returned from the first GOP after 120.
-  AppendBuffers("150 180 210K 240");
-  CheckExpectedBuffers("210K 240");
-
-  // Seek to the beginning and verify the contents of the source buffer.
-  Seek(0);
-  CheckExpectedBuffers("0K 30 60 90 120K 150 180 210K 240");
-  CheckNoNextBuffer();
-}
-
-// This test covers the case where new buffers completely overlap a range
-// whose next buffer is not buffered.
-TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenCompleteOverlap) {
-  // Append 5 buffers at positions 10 through 14 and exhaust the buffers.
-  NewCodedFrameGroupAppend(10, 5, &kDataA);
-  Seek(10);
-  CheckExpectedBuffers(10, 14, &kDataA);
-
-  // Next buffer is at position 15, so should not be able to fulfill request.
-  CheckNoNextBuffer();
-
-  // Do a complete overlap and test that this successfully fulfills the read
-  // at position 15.
-  NewCodedFrameGroupAppend(5, 11, &kDataB);
-  CheckExpectedBuffers(15, 15, &kDataB);
-
-  // Then add 5 buffers from positions 16 though 20.
-  AppendBuffers(16, 5, &kDataB);
-
-  // Check the next 4 buffers are correct, which also effectively seeks to
-  // position 20.
-  CheckExpectedBuffers(16, 19, &kDataB);
-
-  // Do a complete overlap and replace the buffer at position 20.
-  NewCodedFrameGroupAppend(0, 21, &kDataA);
-  CheckExpectedBuffers(20, 20, &kDataA);
-}
-
-// This test covers the case where a range is stalled waiting for its next
-// buffer, then an end-overlap causes the end of the range to be deleted.
-TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenEndOverlap) {
-  // Append 5 buffers at positions 10 through 14 and exhaust the buffers.
-  NewCodedFrameGroupAppend(10, 5, &kDataA);
-  Seek(10);
-  CheckExpectedBuffers(10, 14, &kDataA);
-  CheckExpectedRanges("{ [10,14) }");
-
-  // Next buffer is at position 15, so should not be able to fulfill request.
-  CheckNoNextBuffer();
-
-  // Do an end overlap that causes the latter half of the range to be deleted.
-  NewCodedFrameGroupAppend(5, 6, &kDataB);
-  CheckNoNextBuffer();
-  CheckExpectedRanges("{ [5,10) }");
-
-  // Fill in the gap. Getting the next buffer should still stall at position 15.
-  for (int i = 11; i <= 14; i++) {
-    AppendBuffers(i, 1, &kDataB);
-    CheckNoNextBuffer();
-  }
-
-  // Append the buffer at position 15 and check to make sure all is correct.
-  AppendBuffers(15, 1);
-  CheckExpectedBuffers(15, 15);
-  CheckExpectedRanges("{ [5,15) }");
-}
-
-// This test is testing the "next buffer" logic after a complete overlap. In
-// this scenario, when the track buffer is exhausted, there is no buffered data
-// to fulfill the request. The SourceBufferStream should be able to fulfill the
-// request when the data is later appended, and should not lose track of the
-// "next buffer" position.
-TEST_F(SourceBufferStreamTest, GetNextBuffer_Overlap_Selected_Complete) {
-  // Append 5 buffers at positions 5 through 9.
-  NewCodedFrameGroupAppend(5, 5, &kDataA);
-
-  // Seek to buffer at position 5 and get next buffer.
-  Seek(5);
-  CheckExpectedBuffers(5, 5, &kDataA);
-
-  // Replace existing data with new data.
-  NewCodedFrameGroupAppend(5, 5, &kDataB);
-
-  // Expect old data up until next keyframe in new data.
-  CheckExpectedBuffers(6, 9, &kDataA);
-
-  // Next buffer is at position 10, so should not be able to fulfill the
-  // request.
-  CheckNoNextBuffer();
-
-  // Now add 5 new buffers at positions 10 through 14.
-  AppendBuffers(10, 5, &kDataB);
-  CheckExpectedBuffers(10, 14, &kDataB);
-}
-
-TEST_F(SourceBufferStreamTest, PresentationTimestampIndependence) {
-  // Append 20 buffers at position 0.
-  NewCodedFrameGroupAppend(0, 20);
-  Seek(0);
-
-  int last_keyframe_idx = -1;
-  base::TimeDelta last_keyframe_presentation_timestamp;
-  base::TimeDelta last_p_frame_presentation_timestamp;
-
-  // Check for IBB...BBP pattern.
-  for (int i = 0; i < 20; i++) {
-    scoped_refptr<StreamParserBuffer> buffer;
-    ASSERT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
-
-    if (buffer->is_key_frame()) {
-      EXPECT_EQ(DecodeTimestamp::FromPresentationTime(buffer->timestamp()),
-                buffer->GetDecodeTimestamp());
-      last_keyframe_idx = i;
-      last_keyframe_presentation_timestamp = buffer->timestamp();
-    } else if (i == last_keyframe_idx + 1) {
-      ASSERT_NE(last_keyframe_idx, -1);
-      last_p_frame_presentation_timestamp = buffer->timestamp();
-      EXPECT_LT(last_keyframe_presentation_timestamp,
-                last_p_frame_presentation_timestamp);
-    } else {
-      EXPECT_GT(buffer->timestamp(), last_keyframe_presentation_timestamp);
-      EXPECT_LT(buffer->timestamp(), last_p_frame_presentation_timestamp);
-      EXPECT_LT(DecodeTimestamp::FromPresentationTime(buffer->timestamp()),
-                buffer->GetDecodeTimestamp());
-    }
-  }
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFront) {
-  // Set memory limit to 20 buffers.
-  SetMemoryLimit(20);
-
-  // Append 20 buffers at positions 0 through 19.
-  NewCodedFrameGroupAppend(0, 1, &kDataA);
-  for (int i = 1; i < 20; i++) AppendBuffers(i, 1, &kDataA);
-
-  // GC should be a no-op, since we are just under memory limit.
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0));
-  CheckExpectedRanges("{ [0,19) }");
-  Seek(0);
-  CheckExpectedBuffers(0, 19, &kDataA);
-
-  // Seek to the middle of the stream.
-  Seek(10);
-
-  // We are about to append 5 new buffers and current playback position is 10,
-  // so the GC algorithm should be able to delete some old data from the front.
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(10, 5));
-  CheckExpectedRanges("{ [5,19) }");
-
-  // Append 5 buffers to the end of the stream.
-  AppendBuffers(20, 5, &kDataA);
-  CheckExpectedRanges("{ [5,24) }");
-
-  CheckExpectedBuffers(10, 24, &kDataA);
-  Seek(5);
-  CheckExpectedBuffers(5, 9, &kDataA);
-}
-
-TEST_F(SourceBufferStreamTest,
-       GarbageCollection_DeleteFront_PreserveSeekedGOP) {
-  // Set memory limit to 15 buffers.
-  SetMemoryLimit(15);
-
-  NewCodedFrameGroupAppend("0K 10 20 30 40 50K 60 70 80 90");
-  NewCodedFrameGroupAppend("1000K 1010 1020 1030 1040");
-
-  // GC should be a no-op, since we are just under memory limit.
-  EXPECT_TRUE(stream_->GarbageCollectIfNeeded(DecodeTimestamp(), 0));
-  CheckExpectedRangesByTimestamp("{ [0,100) [1000,1050) }");
-
-  // Seek to the near the end of the first range
-  SeekToTimestampMs(95);
-
-  // We are about to append 7 new buffers and current playback position is at
-  // the end of the last GOP in the first range, so the GC algorithm should be
-  // able to delete some old data from the front, but must not collect the last
-  // GOP in that first range. Neither can it collect the last appended GOP
-  // (which is the entire second range), so GC should return false since it
-  // couldn't collect enough.
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(95), 7));
-  CheckExpectedRangesByTimestamp("{ [50,100) [1000,1050) }");
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFrontGOPsAtATime) {
-  // Set memory limit to 20 buffers.
-  SetMemoryLimit(20);
-
-  // Append 20 buffers at positions 0 through 19.
-  NewCodedFrameGroupAppend(0, 20, &kDataA);
-
-  // Seek to position 10.
-  Seek(10);
-  CheckExpectedRanges("{ [0,19) }");
-
-  // Add one buffer to put the memory over the cap.
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(10, 1));
-  AppendBuffers(20, 1, &kDataA);
-
-  // GC should have deleted the first 5 buffers so that the range still begins
-  // with a keyframe.
-  CheckExpectedRanges("{ [5,20) }");
-  CheckExpectedBuffers(10, 20, &kDataA);
-  Seek(5);
-  CheckExpectedBuffers(5, 9, &kDataA);
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteBack) {
-  // Set memory limit to 5 buffers.
-  SetMemoryLimit(5);
-
-  // Append 5 buffers at positions 15 through 19.
-  NewCodedFrameGroupAppend(15, 5, &kDataA);
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0));
-
-  // Append 5 buffers at positions 0 through 4.
-  NewCodedFrameGroupAppend(0, 5, &kDataA);
-  CheckExpectedRanges("{ [0,4) [15,19) }");
-
-  // Seek to position 0.
-  Seek(0);
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0));
-  // Should leave the first 5 buffers from 0 to 4.
-  CheckExpectedRanges("{ [0,4) }");
-  CheckExpectedBuffers(0, 4, &kDataA);
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFrontAndBack) {
-  // Set memory limit to 3 buffers.
-  SetMemoryLimit(3);
-
-  // Seek to position 15.
-  Seek(15);
-
-  // Append 40 buffers at positions 0 through 39.
-  NewCodedFrameGroupAppend(0, 40, &kDataA);
-  // GC will try to keep data between current playback position and last append
-  // position. This will ensure that the last append position is 19 and will
-  // allow GC algorithm to collect data outside of the range [15,19)
-  NewCodedFrameGroupAppend(15, 5, &kDataA);
-  CheckExpectedRanges("{ [0,39) }");
-
-  // Should leave the GOP containing the current playback position 15 and the
-  // last append position 19. GC returns false, since we are still above limit.
-  EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(15, 0));
-  CheckExpectedRanges("{ [15,19) }");
-  CheckExpectedBuffers(15, 19, &kDataA);
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteSeveralRanges) {
-  // Append 5 buffers at positions 0 through 4.
-  NewCodedFrameGroupAppend(0, 5);
-
-  // Append 5 buffers at positions 10 through 14.
-  NewCodedFrameGroupAppend(10, 5);
-
-  // Append 5 buffers at positions 20 through 24.
-  NewCodedFrameGroupAppend(20, 5);
-
-  // Append 5 buffers at positions 40 through 44.
-  NewCodedFrameGroupAppend(40, 5);
-
-  CheckExpectedRanges("{ [0,4) [10,14) [20,24) [40,44) }");
-
-  // Seek to position 20.
-  Seek(20);
-  CheckExpectedBuffers(20, 20);
-
-  // Set memory limit to 1 buffer.
-  SetMemoryLimit(1);
-
-  // Append 5 buffers at positions 30 through 34.
-  NewCodedFrameGroupAppend(30, 5);
-
-  // We will have more than 1 buffer left, GC will fail
-  EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(20, 0));
-
-  // Should have deleted all buffer ranges before the current buffer and after
-  // last GOP
-  CheckExpectedRanges("{ [20,24) [30,34) }");
-  CheckExpectedBuffers(21, 24);
-  CheckNoNextBuffer();
-
-  // Continue appending into the last range to make sure it didn't break.
-  AppendBuffers(35, 10);
-  EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(20, 0));
-  // Should save everything between read head and last appended
-  CheckExpectedRanges("{ [20,24) [30,44) }");
-
-  // Make sure appending before and after the ranges didn't somehow break.
-  SetMemoryLimit(100);
-  NewCodedFrameGroupAppend(0, 10);
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(20, 0));
-  CheckExpectedRanges("{ [0,9) [20,24) [30,44) }");
-  Seek(0);
-  CheckExpectedBuffers(0, 9);
-
-  NewCodedFrameGroupAppend(90, 10);
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0));
-  CheckExpectedRanges("{ [0,9) [20,24) [30,44) [90,99) }");
-  Seek(30);
-  CheckExpectedBuffers(30, 44);
-  CheckNoNextBuffer();
-  Seek(90);
-  CheckExpectedBuffers(90, 99);
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteAfterLastAppend) {
-  // Set memory limit to 10 buffers.
-  SetMemoryLimit(10);
-
-  // Append 1 GOP starting at 310ms, 30ms apart.
-  NewCodedFrameGroupAppend("310K 340 370");
-
-  // Append 2 GOPs starting at 490ms, 30ms apart.
-  NewCodedFrameGroupAppend("490K 520 550 580K 610 640");
-
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0));
-
-  CheckExpectedRangesByTimestamp("{ [310,400) [490,670) }");
-
-  // Seek to the GOP at 580ms.
-  SeekToTimestampMs(580);
-
-  // Append 2 GOPs before the existing ranges.
-  // So the ranges before GC are "{ [100,280) [310,400) [490,670) }".
-  NewCodedFrameGroupAppend("100K 130 160 190K 220 250K");
-
-  EXPECT_TRUE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(580), 0));
-
-  // Should save the newly appended GOPs.
-  CheckExpectedRangesByTimestamp("{ [100,280) [580,670) }");
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteAfterLastAppendMerged) {
-  // Set memory limit to 10 buffers.
-  SetMemoryLimit(10);
-
-  // Append 3 GOPs starting at 400ms, 30ms apart.
-  NewCodedFrameGroupAppend("400K 430 460 490K 520 550 580K 610 640");
-
-  // Seek to the GOP at 580ms.
-  SeekToTimestampMs(580);
-
-  // Append 2 GOPs starting at 220ms, and they will be merged with the existing
-  // range.  So the range before GC is "{ [220,670) }".
-  NewCodedFrameGroupAppend("220K 250 280 310K 340 370");
-
-  EXPECT_TRUE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(580), 0));
-
-  // Should save the newly appended GOPs.
-  CheckExpectedRangesByTimestamp("{ [220,400) [580,670) }");
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_NoSeek) {
-  // Set memory limit to 20 buffers.
-  SetMemoryLimit(20);
-
-  // Append 25 buffers at positions 0 through 24.
-  NewCodedFrameGroupAppend(0, 25, &kDataA);
-
-  // If playback is still in the first GOP (starting at 0), GC should fail.
-  EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(2, 0));
-  CheckExpectedRanges("{ [0,24) }");
-
-  // As soon as playback position moves past the first GOP, it should be removed
-  // and after removing the first GOP we are under memory limit.
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(5, 0));
-  CheckExpectedRanges("{ [5,24) }");
-  CheckNoNextBuffer();
-  Seek(5);
-  CheckExpectedBuffers(5, 24, &kDataA);
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_PendingSeek) {
-  // Append 10 buffers at positions 0 through 9.
-  NewCodedFrameGroupAppend(0, 10, &kDataA);
-
-  // Append 5 buffers at positions 25 through 29.
-  NewCodedFrameGroupAppend(25, 5, &kDataA);
-
-  // Seek to position 15.
-  Seek(15);
-  CheckNoNextBuffer();
-  CheckExpectedRanges("{ [0,9) [25,29) }");
-
-  // Set memory limit to 5 buffers.
-  SetMemoryLimit(5);
-
-  // Append 5 buffers as positions 30 to 34 to trigger GC.
-  AppendBuffers(30, 5, &kDataA);
-
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(30, 0));
-
-  // The current algorithm will delete from the beginning until the memory is
-  // under cap.
-  CheckExpectedRanges("{ [30,34) }");
-
-  // Expand memory limit again so that GC won't be triggered.
-  SetMemoryLimit(100);
-
-  // Append data to fulfill seek.
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(30, 5));
-  NewCodedFrameGroupAppend(15, 5, &kDataA);
-
-  // Check to make sure all is well.
-  CheckExpectedRanges("{ [15,19) [30,34) }");
-  CheckExpectedBuffers(15, 19, &kDataA);
-  Seek(30);
-  CheckExpectedBuffers(30, 34, &kDataA);
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_NeedsMoreData) {
-  // Set memory limit to 15 buffers.
-  SetMemoryLimit(15);
-
-  // Append 10 buffers at positions 0 through 9.
-  NewCodedFrameGroupAppend(0, 10, &kDataA);
-
-  // Advance next buffer position to 10.
-  Seek(0);
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0));
-  CheckExpectedBuffers(0, 9, &kDataA);
-  CheckNoNextBuffer();
-
-  // Append 20 buffers at positions 15 through 34.
-  NewCodedFrameGroupAppend(15, 20, &kDataA);
-  CheckExpectedRanges("{ [0,9) [15,34) }");
-
-  // GC should save the keyframe before the next buffer position and the data
-  // closest to the next buffer position. It will also save all buffers from
-  // next buffer to the last GOP appended, which overflows limit and leads to
-  // failure.
-  EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(5, 0));
-  CheckExpectedRanges("{ [5,9) [15,34) }");
-
-  // Now fulfill the seek at position 10. This will make GC delete the data
-  // before position 10 to keep it within cap.
-  NewCodedFrameGroupAppend(10, 5, &kDataA);
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(10, 0));
-  CheckExpectedRanges("{ [10,24) }");
-  CheckExpectedBuffers(10, 24, &kDataA);
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_TrackBuffer) {
-  EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(99));
-
-  // Set memory limit to 3 buffers.
-  SetMemoryLimit(3);
-
-  // Seek to position 15.
-  Seek(15);
-
-  // Append 18 buffers at positions 0 through 17.
-  NewCodedFrameGroupAppend(0, 18, &kDataA);
-
-  EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(15, 0));
-
-  // Should leave GOP containing seek position.
-  CheckExpectedRanges("{ [15,17) }");
-
-  // Move next buffer position to 16.
-  CheckExpectedBuffers(15, 15, &kDataA);
-
-  // Completely overlap the existing buffers.
-  NewCodedFrameGroupAppend(0, 20, &kDataB);
-
-  // Final GOP [15,19) contains 5 buffers, which is more than memory limit of
-  // 3 buffers set at the beginning of the test, so GC will fail.
-  EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(15, 0));
-
-  // Because buffers 16 and 17 are not keyframes, they are moved to the track
-  // buffer upon overlap. The source buffer (i.e. not the track buffer) is now
-  // waiting for the next keyframe.
-  CheckExpectedRanges("{ [15,19) }");
-  CheckExpectedBuffers(16, 17, &kDataA);
-  CheckNoNextBuffer();
-
-  // Now add a keyframe at position 20.
-  AppendBuffers(20, 5, &kDataB);
-
-  // 5 buffers in final GOP, GC will fail
-  EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(20, 0));
-
-  // Should garbage collect such that there are 5 frames remaining, starting at
-  // the keyframe.
-  CheckExpectedRanges("{ [20,24) }");
-  CheckExpectedBuffers(20, 24, &kDataB);
-  CheckNoNextBuffer();
-}
-
-// Test GC preserves data starting at first GOP containing playback position.
-TEST_F(SourceBufferStreamTest, GarbageCollection_SaveDataAtPlaybackPosition) {
-  // Set memory limit to 30 buffers = 1 second of data.
-  SetMemoryLimit(30);
-  // And append 300 buffers = 10 seconds of data.
-  NewCodedFrameGroupAppend(0, 300, &kDataA);
-  CheckExpectedRanges("{ [0,299) }");
-
-  // Playback position at 0, all data must be preserved.
-  EXPECT_FALSE(
-      stream_->GarbageCollectIfNeeded(DecodeTimestamp::FromMilliseconds(0), 0));
-  CheckExpectedRanges("{ [0,299) }");
-
-  // Playback position at 1 sec, the first second of data [0,29) should be
-  // collected, since we are way over memory limit.
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(1000), 0));
-  CheckExpectedRanges("{ [30,299) }");
-
-  // Playback position at 1.1 sec, no new data can be collected, since the
-  // playback position is still in the first GOP of buffered data.
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(1100), 0));
-  CheckExpectedRanges("{ [30,299) }");
-
-  // Playback position at 5.166 sec, just at the very end of GOP corresponding
-  // to buffer range 150-155, which should be preserved.
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(5166), 0));
-  CheckExpectedRanges("{ [150,299) }");
-
-  // Playback position at 5.167 sec, just past the end of GOP corresponding to
-  // buffer range 150-155, it should be garbage collected now.
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(5167), 0));
-  CheckExpectedRanges("{ [155,299) }");
-
-  // Playback at 9.0 sec, we can now successfully collect all data except the
-  // last second and we are back under memory limit of 30 buffers, so GCIfNeeded
-  // should return true.
-  EXPECT_TRUE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(9000), 0));
-  CheckExpectedRanges("{ [270,299) }");
-
-  // Playback at 9.999 sec, GC succeeds, since we are under memory limit even
-  // without removing any data.
-  EXPECT_TRUE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(9999), 0));
-  CheckExpectedRanges("{ [270,299) }");
-
-  // Playback at 15 sec, this should never happen during regular playback in
-  // browser, since this position has no data buffered, but it should still
-  // cause no problems to GC algorithm, so test it just in case.
-  EXPECT_TRUE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(15000), 0));
-  CheckExpectedRanges("{ [270,299) }");
-}
-
-// Test saving the last GOP appended when this GOP is the only GOP in its range.
-TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP) {
-  // Set memory limit to 3 and make sure the 4-byte GOP is not garbage
-  // collected.
-  SetMemoryLimit(3);
-  NewCodedFrameGroupAppend("0K 30 60 90");
-  EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(0, 0));
-  CheckExpectedRangesByTimestamp("{ [0,120) }");
-
-  // Make sure you can continue appending data to this GOP; again, GC should not
-  // wipe out anything.
-  AppendBuffers("120D30");
-  EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(0, 0));
-  CheckExpectedRangesByTimestamp("{ [0,150) }");
-
-  // Append a 2nd range after this without triggering GC.
-  NewCodedFrameGroupAppend("200K 230 260 290K 320 350");
-  CheckExpectedRangesByTimestamp("{ [0,150) [200,380) }");
-
-  // Seek to 290ms.
-  SeekToTimestampMs(290);
-
-  // Now append a GOP in a separate range after the selected range and trigger
-  // GC. Because it is after 290ms, this tests that the GOP is saved when
-  // deleting from the back.
-  NewCodedFrameGroupAppend("500K 530 560 590");
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(290), 0));
-
-  // Should save GOPs between 290ms and the last GOP appended.
-  CheckExpectedRangesByTimestamp("{ [290,380) [500,620) }");
-
-  // Continue appending to this GOP after GC.
-  AppendBuffers("620D30");
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(290), 0));
-  CheckExpectedRangesByTimestamp("{ [290,380) [500,650) }");
-}
-
-// Test saving the last GOP appended when this GOP is in the middle of a
-// non-selected range.
-TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Middle) {
-  // Append 3 GOPs starting at 0ms, 30ms apart.
-  NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240");
-  CheckExpectedRangesByTimestamp("{ [0,270) }");
-
-  // Now set the memory limit to 1 and overlap the middle of the range with a
-  // new GOP.
-  SetMemoryLimit(1);
-  NewCodedFrameGroupAppend("80K 110 140");
-
-  // This whole GOP should be saved after GC, which will fail due to GOP being
-  // larger than 1 buffer
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(80), 0));
-  CheckExpectedRangesByTimestamp("{ [80,170) }");
-  // We should still be able to continue appending data to GOP
-  AppendBuffers("170D30");
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(80), 0));
-  CheckExpectedRangesByTimestamp("{ [80,200) }");
-
-  // Append a 2nd range after this range, without triggering GC.
-  NewCodedFrameGroupAppend("400K 430 460 490K 520 550 580K 610 640");
-  CheckExpectedRangesByTimestamp("{ [80,200) [400,670) }");
-
-  // Seek to 80ms to make the first range the selected range.
-  SeekToTimestampMs(80);
-
-  // Now append a GOP in the middle of the second range and trigger GC. Because
-  // it is after the selected range, this tests that the GOP is saved when
-  // deleting from the back.
-  NewCodedFrameGroupAppend("500K 530 560 590");
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(80), 0));
-
-  // Should save the GOPs between the seek point and GOP that was last appended
-  CheckExpectedRangesByTimestamp("{ [80,200) [400,620) }");
-
-  // Continue appending to this GOP after GC.
-  AppendBuffers("620D30");
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(80), 0));
-  CheckExpectedRangesByTimestamp("{ [80,200) [400,650) }");
-}
-
-// Test saving the last GOP appended when the GOP containing the next buffer is
-// adjacent to the last GOP appended.
-TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected1) {
-  // Append 3 GOPs at 0ms, 90ms, and 180ms.
-  NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240");
-  CheckExpectedRangesByTimestamp("{ [0,270) }");
-
-  // Seek to the GOP at 90ms.
-  SeekToTimestampMs(90);
-
-  // Set the memory limit to 1, then overlap the GOP at 0.
-  SetMemoryLimit(1);
-  NewCodedFrameGroupAppend("0K 30 60");
-
-  // GC should save the GOP at 0ms and 90ms, and will fail since GOP larger
-  // than 1 buffer
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(90), 0));
-  CheckExpectedRangesByTimestamp("{ [0,180) }");
-
-  // Seek to 0 and check all buffers.
-  SeekToTimestampMs(0);
-  CheckExpectedBuffers("0K 30 60 90K 120 150");
-  CheckNoNextBuffer();
-
-  // Now seek back to 90ms and append a GOP at 180ms.
-  SeekToTimestampMs(90);
-  NewCodedFrameGroupAppend("180K 210 240");
-
-  // Should save the GOP at 90ms and the GOP at 180ms.
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(90), 0));
-  CheckExpectedRangesByTimestamp("{ [90,270) }");
-  CheckExpectedBuffers("90K 120 150 180K 210 240");
-  CheckNoNextBuffer();
-}
-
-// Test saving the last GOP appended when it is at the beginning or end of the
-// selected range. This tests when the last GOP appended is before or after the
-// GOP containing the next buffer, but not directly adjacent to this GOP.
-TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected2) {
-  // Append 4 GOPs starting at positions 0ms, 90ms, 180ms, 270ms.
-  NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330");
-  CheckExpectedRangesByTimestamp("{ [0,360) }");
-
-  // Seek to the last GOP at 270ms.
-  SeekToTimestampMs(270);
-
-  // Set the memory limit to 1, then overlap the GOP at 90ms.
-  SetMemoryLimit(1);
-  NewCodedFrameGroupAppend("90K 120 150");
-
-  // GC will save data in the range where the most recent append has happened
-  // [0; 180) and the range where the next read position is [270;360)
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(270), 0));
-  CheckExpectedRangesByTimestamp("{ [0,180) [270,360) }");
-
-  // Add 3 GOPs to the end of the selected range at 360ms, 450ms, and 540ms.
-  NewCodedFrameGroupAppend("360K 390 420 450K 480 510 540K 570 600");
-  CheckExpectedRangesByTimestamp("{ [0,180) [270,630) }");
-
-  // Overlap the GOP at 450ms and garbage collect to test deleting from the
-  // back.
-  NewCodedFrameGroupAppend("450K 480 510");
-  EXPECT_FALSE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(270), 0));
-
-  // Should save GOPs from GOP at 270ms to GOP at 450ms.
-  CheckExpectedRangesByTimestamp("{ [270,540) }");
-}
-
-// Test saving the last GOP appended when it is the same as the GOP containing
-// the next buffer.
-TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected3) {
-  // Seek to start of stream.
-  SeekToTimestampMs(0);
-
-  // Append 3 GOPs starting at 0ms, 90ms, 180ms.
-  NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240");
-  CheckExpectedRangesByTimestamp("{ [0,270) }");
-
-  // Set the memory limit to 1 then begin appending the start of a GOP starting
-  // at 0ms.
-  SetMemoryLimit(1);
-  NewCodedFrameGroupAppend("0K 30");
-
-  // GC should save the newly appended GOP, which is also the next GOP that
-  // will be returned from the seek request.
-  EXPECT_FALSE(
-      stream_->GarbageCollectIfNeeded(DecodeTimestamp::FromMilliseconds(0), 0));
-  CheckExpectedRangesByTimestamp("{ [0,60) }");
-
-  // Check the buffers in the range.
-  CheckExpectedBuffers("0K 30");
-  CheckNoNextBuffer();
-
-  // Continue appending to this buffer.
-  AppendBuffers("60 90");
-
-  // GC should still save the rest of this GOP and should be able to fulfill
-  // the read.
-  EXPECT_FALSE(
-      stream_->GarbageCollectIfNeeded(DecodeTimestamp::FromMilliseconds(0), 0));
-  CheckExpectedRangesByTimestamp("{ [0,120) }");
-  CheckExpectedBuffers("60 90");
-  CheckNoNextBuffer();
-}
-
-// Test the performance of garbage collection.
-TEST_F(SourceBufferStreamTest, GarbageCollection_Performance) {
-  // Force |keyframes_per_second_| to be equal to kDefaultFramesPerSecond.
-  SetStreamInfo(kDefaultFramesPerSecond, kDefaultFramesPerSecond);
-
-  const int kBuffersToKeep = 1000;
-  SetMemoryLimit(kBuffersToKeep);
-
-  int buffers_appended = 0;
-
-  NewCodedFrameGroupAppend(0, kBuffersToKeep);
-  buffers_appended += kBuffersToKeep;
-
-  const int kBuffersToAppend = 1000;
-  const int kGarbageCollections = 3;
-  for (int i = 0; i < kGarbageCollections; ++i) {
-    AppendBuffers(buffers_appended, kBuffersToAppend);
-    buffers_appended += kBuffersToAppend;
-  }
-}
-
-TEST_F(SourceBufferStreamTest, GarbageCollection_MediaTimeAfterLastAppendTime) {
-  // Set memory limit to 10 buffers.
-  SetMemoryLimit(10);
-
-  // Append 12 buffers. The duration of the last buffer is 30
-  NewCodedFrameGroupAppend("0K 30 60 90 120K 150 180 210K 240 270 300K 330D30");
-  CheckExpectedRangesByTimestamp("{ [0,360) }");
-
-  // Do a garbage collection with the media time higher than the timestamp of
-  // the last appended buffer (330), but still within buffered ranges, taking
-  // into account the duration of the last frame (timestamp of the last frame is
-  // 330, duration is 30, so the latest valid buffered position is 330+30=360).
-  EXPECT_TRUE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(360), 0));
-
-  // GC should collect one GOP from the front to bring us back under memory
-  // limit of 10 buffers.
-  CheckExpectedRangesByTimestamp("{ [120,360) }");
-}
-
-TEST_F(SourceBufferStreamTest,
-       GarbageCollection_MediaTimeOutsideOfStreamBufferedRange) {
-  // Set memory limit to 10 buffers.
-  SetMemoryLimit(10);
-
-  // Append 12 buffers.
-  NewCodedFrameGroupAppend("0K 30 60 90 120K 150 180 210K 240 270 300K 330");
-  CheckExpectedRangesByTimestamp("{ [0,360) }");
-
-  // Seek in order to set the stream read position to 330 an ensure that the
-  // stream selects the buffered range.
-  SeekToTimestampMs(330);
-
-  // Do a garbage collection with the media time outside the buffered ranges
-  // (this might happen when there's both audio and video streams, audio stream
-  // buffered range is longer than the video stream buffered range, since
-  // media::Pipeline uses audio stream as a time source in that case, it might
-  // return a media_time that is slightly outside of video buffered range). In
-  // those cases the GC algorithm should clamp the media_time value to the
-  // buffered ranges to work correctly (see crbug.com/563292).
-  EXPECT_TRUE(stream_->GarbageCollectIfNeeded(
-      DecodeTimestamp::FromMilliseconds(361), 0));
-
-  // GC should collect one GOP from the front to bring us back under memory
-  // limit of 10 buffers.
-  CheckExpectedRangesByTimestamp("{ [120,360) }");
-}
-
-TEST_F(SourceBufferStreamTest, GetRemovalRange_BytesToFree) {
-  // Append 2 GOPs starting at 300ms, 30ms apart.
-  NewCodedFrameGroupAppend("300K 330 360 390K 420 450");
-
-  // Append 2 GOPs starting at 600ms, 30ms apart.
-  NewCodedFrameGroupAppend("600K 630 660 690K 720 750");
-
-  // Append 2 GOPs starting at 900ms, 30ms apart.
-  NewCodedFrameGroupAppend("900K 930 960 990K 1020 1050");
-
-  CheckExpectedRangesByTimestamp("{ [300,480) [600,780) [900,1080) }");
-
-  int remove_range_end = -1;
-  int bytes_removed = -1;
-
-  // Size 0.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 0, &remove_range_end);
-  EXPECT_EQ(-1, remove_range_end);
-  EXPECT_EQ(0, bytes_removed);
-
-  // Smaller than the size of GOP.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 1, &remove_range_end);
-  EXPECT_EQ(390, remove_range_end);
-  // Remove as the size of GOP.
-  EXPECT_EQ(3, bytes_removed);
-
-  // The same size with a GOP.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 3, &remove_range_end);
-  EXPECT_EQ(390, remove_range_end);
-  EXPECT_EQ(3, bytes_removed);
-
-  // The same size with a range.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 6, &remove_range_end);
-  EXPECT_EQ(480, remove_range_end);
-  EXPECT_EQ(6, bytes_removed);
-
-  // A frame larger than a range.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 7, &remove_range_end);
-  EXPECT_EQ(690, remove_range_end);
-  EXPECT_EQ(9, bytes_removed);
-
-  // The same size with two ranges.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 12, &remove_range_end);
-  EXPECT_EQ(780, remove_range_end);
-  EXPECT_EQ(12, bytes_removed);
-
-  // Larger than two ranges.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 14, &remove_range_end);
-  EXPECT_EQ(990, remove_range_end);
-  EXPECT_EQ(15, bytes_removed);
-
-  // The same size with the whole ranges.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 18, &remove_range_end);
-  EXPECT_EQ(1080, remove_range_end);
-  EXPECT_EQ(18, bytes_removed);
-
-  // Larger than the whole ranges.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 20, &remove_range_end);
-  EXPECT_EQ(1080, remove_range_end);
-  EXPECT_EQ(18, bytes_removed);
-}
-
-TEST_F(SourceBufferStreamTest, GetRemovalRange_Range) {
-  // Append 2 GOPs starting at 300ms, 30ms apart.
-  NewCodedFrameGroupAppend("300K 330 360 390K 420 450");
-
-  // Append 2 GOPs starting at 600ms, 30ms apart.
-  NewCodedFrameGroupAppend("600K 630 660 690K 720 750");
-
-  // Append 2 GOPs starting at 900ms, 30ms apart.
-  NewCodedFrameGroupAppend("900K 930 960 990K 1020 1050");
-
-  CheckExpectedRangesByTimestamp("{ [300,480) [600,780) [900,1080) }");
-
-  int remove_range_end = -1;
-  int bytes_removed = -1;
-
-  // Within a GOP and no keyframe.
-  bytes_removed = GetRemovalRangeInMs(630, 660, 20, &remove_range_end);
-  EXPECT_EQ(-1, remove_range_end);
-  EXPECT_EQ(0, bytes_removed);
-
-  // Across a GOP and no keyframe.
-  bytes_removed = GetRemovalRangeInMs(630, 750, 20, &remove_range_end);
-  EXPECT_EQ(-1, remove_range_end);
-  EXPECT_EQ(0, bytes_removed);
-
-  // The same size with a range.
-  bytes_removed = GetRemovalRangeInMs(600, 780, 20, &remove_range_end);
-  EXPECT_EQ(780, remove_range_end);
-  EXPECT_EQ(6, bytes_removed);
-
-  // One frame larger than a range.
-  bytes_removed = GetRemovalRangeInMs(570, 810, 20, &remove_range_end);
-  EXPECT_EQ(780, remove_range_end);
-  EXPECT_EQ(6, bytes_removed);
-
-  // Facing the other ranges.
-  bytes_removed = GetRemovalRangeInMs(480, 900, 20, &remove_range_end);
-  EXPECT_EQ(780, remove_range_end);
-  EXPECT_EQ(6, bytes_removed);
-
-  // In the midle of the other ranges, but not including any GOP.
-  bytes_removed = GetRemovalRangeInMs(420, 960, 20, &remove_range_end);
-  EXPECT_EQ(780, remove_range_end);
-  EXPECT_EQ(6, bytes_removed);
-
-  // In the middle of the other ranges.
-  bytes_removed = GetRemovalRangeInMs(390, 990, 20, &remove_range_end);
-  EXPECT_EQ(990, remove_range_end);
-  EXPECT_EQ(12, bytes_removed);
-
-  // A frame smaller than the whole ranges.
-  bytes_removed = GetRemovalRangeInMs(330, 1050, 20, &remove_range_end);
-  EXPECT_EQ(990, remove_range_end);
-  EXPECT_EQ(12, bytes_removed);
-
-  // The same with the whole ranges.
-  bytes_removed = GetRemovalRangeInMs(300, 1080, 20, &remove_range_end);
-  EXPECT_EQ(1080, remove_range_end);
-  EXPECT_EQ(18, bytes_removed);
-
-  // Larger than the whole ranges.
-  bytes_removed = GetRemovalRangeInMs(270, 1110, 20, &remove_range_end);
-  EXPECT_EQ(1080, remove_range_end);
-  EXPECT_EQ(18, bytes_removed);
-}
-
-TEST_F(SourceBufferStreamTest, ConfigChange_Basic) {
-  VideoDecoderConfig new_config = TestVideoConfig::Large();
-  ASSERT_FALSE(new_config.Matches(video_config_));
-
-  Seek(0);
-  CheckVideoConfig(video_config_);
-
-  // Append 5 buffers at positions 0 through 4
-  NewCodedFrameGroupAppend(0, 5, &kDataA);
-
-  CheckVideoConfig(video_config_);
-
-  // Signal a config change.
-  stream_->UpdateVideoConfig(new_config);
-
-  // Make sure updating the config doesn't change anything since new_config
-  // should not be associated with the buffer GetNextBuffer() will return.
-  CheckVideoConfig(video_config_);
-
-  // Append 5 buffers at positions 5 through 9.
-  NewCodedFrameGroupAppend(5, 5, &kDataB);
-
-  // Consume the buffers associated with the initial config.
-  scoped_refptr<StreamParserBuffer> buffer;
-  for (int i = 0; i < 5; i++) {
-    EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
-    CheckVideoConfig(video_config_);
-  }
-
-  // Verify the next attempt to get a buffer will signal that a config change
-  // has happened.
-  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
-
-  // Verify that the new config is now returned.
-  CheckVideoConfig(new_config);
-
-  // Consume the remaining buffers associated with the new config.
-  for (int i = 0; i < 5; i++) {
-    CheckVideoConfig(new_config);
-    EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
-  }
-}
-
-TEST_F(SourceBufferStreamTest, ConfigChange_Seek) {
-  scoped_refptr<StreamParserBuffer> buffer;
-  VideoDecoderConfig new_config = TestVideoConfig::Large();
-
-  Seek(0);
-  NewCodedFrameGroupAppend(0, 5, &kDataA);
-  stream_->UpdateVideoConfig(new_config);
-  NewCodedFrameGroupAppend(5, 5, &kDataB);
-
-  // Seek to the start of the buffers with the new config and make sure a
-  // config change is signalled.
-  CheckVideoConfig(video_config_);
-  Seek(5);
-  CheckVideoConfig(video_config_);
-  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
-  CheckVideoConfig(new_config);
-  CheckExpectedBuffers(5, 9, &kDataB);
-
-  // Seek to the start which has a different config. Don't fetch any buffers and
-  // seek back to buffers with the current config. Make sure a config change
-  // isn't signalled in this case.
-  CheckVideoConfig(new_config);
-  Seek(0);
-  Seek(7);
-  CheckExpectedBuffers(5, 9, &kDataB);
-
-  // Seek to the start and make sure a config change is signalled.
-  CheckVideoConfig(new_config);
-  Seek(0);
-  CheckVideoConfig(new_config);
-  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
-  CheckVideoConfig(video_config_);
-  CheckExpectedBuffers(0, 4, &kDataA);
-}
-
-TEST_F(SourceBufferStreamTest, SetExplicitDuration) {
-  // Append 2 buffers at positions 5 through 6.
-  NewCodedFrameGroupAppend(5, 2);
-
-  // Append 2 buffers at positions 10 through 11.
-  NewCodedFrameGroupAppend(10, 2);
-
-  // Append 2 buffers at positions 15 through 16.
-  NewCodedFrameGroupAppend(15, 2);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [5,6) [10,11) [15,16) }");
-
-  // Set duration to be between buffers 6 and 10.
-  stream_->OnSetDuration(frame_duration() * 8);
-
-  // Should truncate the data after 6.
-  CheckExpectedRanges("{ [5,6) }");
-
-  // Adding data past the previous duration should still work.
-  NewCodedFrameGroupAppend(0, 20);
-  CheckExpectedRanges("{ [0,19) }");
-}
-
-TEST_F(SourceBufferStreamTest, SetExplicitDuration_EdgeCase) {
-  // Append 10 buffers at positions 10 through 19.
-  NewCodedFrameGroupAppend(10, 10);
-
-  // Append 5 buffers at positions 25 through 29.
-  NewCodedFrameGroupAppend(25, 5);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [10,19) [25,29) }");
-
-  // Set duration to be right before buffer 25.
-  stream_->OnSetDuration(frame_duration() * 25);
-
-  // Should truncate the last range.
-  CheckExpectedRanges("{ [10,19) }");
-}
-
-TEST_F(SourceBufferStreamTest, SetExplicitDuration_EdgeCase2) {
-  // This test requires specific relative proportions for fudge room, append
-  // size, and duration truncation amounts. See details at:
-  // https://codereview.chromium.org/2385423002
-
-  // Append buffers with first buffer establishing max_inter_buffer_distance
-  // of 5 ms. This translates to a fudge room (2 x max_interbuffer_distance) of
-  // 10 ms.
-  NewCodedFrameGroupAppend("0K 5K 9D4K");
-  CheckExpectedRangesByTimestamp("{ [0,13) }");
-
-  // Trim off last 2 buffers, totaling 8 ms. Notably less than the current fudge
-  // room of 10 ms.
-  stream_->OnSetDuration(base::TimeDelta::FromMilliseconds(5));
-
-  // Verify truncation.
-  CheckExpectedRangesByTimestamp("{ [0,5) }");
-
-  // Append new buffers just beyond the fudge-room allowance of 10ms.
-  AppendBuffers("11K 15K");
-
-  // Verify new append creates a gap.
-  CheckExpectedRangesByTimestamp("{ [0,5) [11,19) }");
-}
-
-TEST_F(SourceBufferStreamTest, RemoveWithinFudgeRoom) {
-  // This test requires specific relative proportions for fudge room, append
-  // size, and removal amounts. See details at:
-  // https://codereview.chromium.org/2385423002
-
-  // Append buffers with first buffer establishing max_inter_buffer_distance
-  // of 5 ms. This translates to a fudge room (2 x max_interbuffer_distance) of
-  // 10 ms.
-  NewCodedFrameGroupAppend("0K 5K 9D4K");
-  CheckExpectedRangesByTimestamp("{ [0,13) }");
-
-  // Trim off last 2 buffers, totaling 8 ms. Notably less than the current fudge
-  // room of 10 ms.
-  RemoveInMs(5, 13, 13);
-
-  // Verify removal.
-  CheckExpectedRangesByTimestamp("{ [0,5) }");
-
-  // Append new buffers just beyond the fudge-room allowance of 10ms.
-  AppendBuffers("11K 15K");
-
-  // Verify new append creates a gap.
-  CheckExpectedRangesByTimestamp("{ [0,5) [11,19) }");
-}
-
-TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeletePartialRange) {
-  // Append 5 buffers at positions 0 through 4.
-  NewCodedFrameGroupAppend(0, 5);
-
-  // Append 10 buffers at positions 10 through 19.
-  NewCodedFrameGroupAppend(10, 10);
-
-  // Append 5 buffers at positions 25 through 29.
-  NewCodedFrameGroupAppend(25, 5);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,4) [10,19) [25,29) }");
-
-  // Set duration to be between buffers 13 and 14.
-  stream_->OnSetDuration(frame_duration() * 14);
-
-  // Should truncate the data after 13.
-  CheckExpectedRanges("{ [0,4) [10,13) }");
-}
-
-TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeleteSelectedRange) {
-  // Append 2 buffers at positions 5 through 6.
-  NewCodedFrameGroupAppend(5, 2);
-
-  // Append 2 buffers at positions 10 through 11.
-  NewCodedFrameGroupAppend(10, 2);
-
-  // Append 2 buffers at positions 15 through 16.
-  NewCodedFrameGroupAppend(15, 2);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [5,6) [10,11) [15,16) }");
-
-  // Seek to 10.
-  Seek(10);
-
-  // Set duration to be after position 3.
-  stream_->OnSetDuration(frame_duration() * 4);
-
-  // Expect everything to be deleted, and should not have next buffer anymore.
-  CheckNoNextBuffer();
-  CheckExpectedRanges("{ }");
-
-  // Appending data at position 10 should not fulfill the seek.
-  // (If the duration is set to be something smaller than the current seek
-  // point, then the seek point is reset and the SourceBufferStream waits
-  // for a new seek request. Therefore even if the data is re-appended, it
-  // should not fulfill the old seek.)
-  NewCodedFrameGroupAppend(0, 15);
-  CheckNoNextBuffer();
-  CheckExpectedRanges("{ [0,14) }");
-}
-
-TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeletePartialSelectedRange) {
-  // Append 5 buffers at positions 0 through 4.
-  NewCodedFrameGroupAppend(0, 5);
-
-  // Append 20 buffers at positions 10 through 29.
-  NewCodedFrameGroupAppend(10, 20);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,4) [10,29) }");
-
-  // Seek to position 10.
-  Seek(10);
-
-  // Set duration to be between buffers 24 and 25.
-  stream_->OnSetDuration(frame_duration() * 25);
-
-  // Should truncate the data after 24.
-  CheckExpectedRanges("{ [0,4) [10,24) }");
-
-  // The seek position should not be lost.
-  CheckExpectedBuffers(10, 10);
-
-  // Now set the duration immediately after buffer 10.
-  stream_->OnSetDuration(frame_duration() * 11);
-
-  // Seek position should be reset.
-  CheckNoNextBuffer();
-  CheckExpectedRanges("{ [0,4) [10,10) }");
-}
-
-// Test the case where duration is set while the stream parser buffers
-// already start passing the data to decoding pipeline. Selected range,
-// when invalidated by getting truncated, should be updated to NULL
-// accordingly so that successive append operations keep working.
-TEST_F(SourceBufferStreamTest, SetExplicitDuration_UpdateSelectedRange) {
-  // Seek to start of stream.
-  SeekToTimestampMs(0);
-
-  NewCodedFrameGroupAppend("0K 30 60 90");
-
-  // Read out the first few buffers.
-  CheckExpectedBuffers("0K 30");
-
-  // Set duration to be right before buffer 1.
-  stream_->OnSetDuration(base::TimeDelta::FromMilliseconds(60));
-
-  // Verify that there is no next buffer.
-  CheckNoNextBuffer();
-
-  // We should be able to append new buffers at this point.
-  NewCodedFrameGroupAppend("120K 150");
-
-  CheckExpectedRangesByTimestamp("{ [0,60) [120,180) }");
-}
-
-TEST_F(SourceBufferStreamTest,
-       SetExplicitDuration_AfterGroupTimestampAndBeforeFirstBufferTimestamp) {
-  NewCodedFrameGroupAppend("0K 30K 60K");
-
-  // Append a coded frame group with a start timestamp of 200, but the first
-  // buffer starts at 230ms. This can happen in muxed content where the
-  // audio starts before the first frame.
-  NewCodedFrameGroupAppend(base::TimeDelta::FromMilliseconds(200),
-                           "230K 260K 290K 320K");
-
-  NewCodedFrameGroupAppend("400K 430K 460K");
-
-  CheckExpectedRangesByTimestamp("{ [0,90) [200,350) [400,490) }");
-
-  stream_->OnSetDuration(base::TimeDelta::FromMilliseconds(120));
-
-  // Verify that the buffered ranges are updated properly and we don't crash.
-  CheckExpectedRangesByTimestamp("{ [0,90) }");
-}
-
-TEST_F(SourceBufferStreamTest, SetExplicitDuration_MarkEOS) {
-  // Append 1 buffer at positions 0 through 8.
-  NewCodedFrameGroupAppend(0, 9);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,8) }");
-
-  // Seek to 5.
-  Seek(5);
-
-  // Set duration to be before the seeked to position.
-  // This will result in truncation of the selected range and a reset
-  // of NextBufferPosition.
-  stream_->OnSetDuration(frame_duration() * 4);
-
-  // Check the expected ranges.
-  CheckExpectedRanges("{ [0,3) }");
-
-  // Mark EOS reached.
-  stream_->MarkEndOfStream();
-
-  // Expect EOS to be reached.
-  CheckEOSReached();
-}
-
-TEST_F(SourceBufferStreamTest, SetExplicitDuration_MarkEOS_IsSeekPending) {
-  // Append 1 buffer at positions 0 through 8.
-  NewCodedFrameGroupAppend(0, 9);
-
-  // Check expected ranges.
-  CheckExpectedRanges("{ [0,8) }");
-
-  // Seek to 9 which will result in a pending seek.
-  Seek(9);
-
-  // Set duration to be before the seeked to position.
-  // This will result in truncation of the selected range and a reset
-  // of NextBufferPosition.
-  stream_->OnSetDuration(frame_duration() * 4);
-
-  // Check the expected ranges.
-  CheckExpectedRanges("{ [0,3) }");
-
-  EXPECT_TRUE(stream_->IsSeekPending());
-  // Mark EOS reached.
-  stream_->MarkEndOfStream();
-  EXPECT_FALSE(stream_->IsSeekPending());
-}
-
-// Test the case were the current playback position is at the end of the
-// buffered data and several overlaps occur that causes the selected
-// range to get split and then merged back into a single range.
-TEST_F(SourceBufferStreamTest, OverlapSplitAndMergeWhileWaitingForMoreData) {
-  // Seek to start of stream.
-  SeekToTimestampMs(0);
-
-  NewCodedFrameGroupAppend("0K 30 60 90 120K 150");
-  CheckExpectedRangesByTimestamp("{ [0,180) }");
-
-  // Read all the buffered data.
-  CheckExpectedBuffers("0K 30 60 90 120K 150");
-  CheckNoNextBuffer();
-
-  // Append data over the current GOP so that a keyframe is needed before
-  // playback can continue from the current position.
-  NewCodedFrameGroupAppend("120K 150");
-  CheckExpectedRangesByTimestamp("{ [0,180) }");
-
-  // Append buffers that cause the range to get split.
-  NewCodedFrameGroupAppend("0K 30");
-  CheckExpectedRangesByTimestamp("{ [0,60) [120,180) }");
-
-  // Append buffers that cause the ranges to get merged.
-  AppendBuffers("60 90");
-
-  CheckExpectedRangesByTimestamp("{ [0,180) }");
-
-  // Verify that we still don't have a next buffer.
-  CheckNoNextBuffer();
-
-  // Add more data to the end and verify that this new data is read correctly.
-  NewCodedFrameGroupAppend("180K 210");
-  CheckExpectedRangesByTimestamp("{ [0,240) }");
-  CheckExpectedBuffers("180K 210");
-}
-
-// Verify that a single coded frame at the current read position unblocks the
-// read even if the frame is buffered after the previously read position is
-// removed.
-TEST_F(SourceBufferStreamTest, AfterRemove_SingleFrameRange_Unblocks_Read) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 90D30");
-  CheckExpectedRangesByTimestamp("{ [0,120) }");
-  CheckExpectedBuffers("0K 30 60 90");
-  CheckNoNextBuffer();
-
-  RemoveInMs(0, 120, 120);
-  CheckExpectedRangesByTimestamp("{ }");
-  NewCodedFrameGroupAppend("120D30K");
-  CheckExpectedRangesByTimestamp("{ [120,150) }");
-  CheckExpectedBuffers("120K");
-  CheckNoNextBuffer();
-}
-
-// Verify that multiple short (relative to max-inter-buffer-distance * 2) coded
-// frames at the current read position unblock the read even if the frames are
-// buffered after the previously read position is removed.
-TEST_F(SourceBufferStreamTest, AfterRemove_TinyFrames_Unblock_Read_1) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 90D30");
-  CheckExpectedRangesByTimestamp("{ [0,120) }");
-  CheckExpectedBuffers("0K 30 60 90");
-  CheckNoNextBuffer();
-
-  RemoveInMs(0, 120, 120);
-  CheckExpectedRangesByTimestamp("{ }");
-  NewCodedFrameGroupAppend("120D1K 121D1");
-  CheckExpectedRangesByTimestamp("{ [120,122) }");
-  CheckExpectedBuffers("120K 121");
-  CheckNoNextBuffer();
-}
-
-// Verify that multiple short (relative to max-inter-buffer-distance * 2) coded
-// frames starting at the fudge room boundary unblock the read even if the
-// frames are buffered after the previously read position is removed.
-TEST_F(SourceBufferStreamTest, AfterRemove_TinyFrames_Unblock_Read_2) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 90D30");
-  CheckExpectedRangesByTimestamp("{ [0,120) }");
-  CheckExpectedBuffers("0K 30 60 90");
-  CheckNoNextBuffer();
-
-  RemoveInMs(0, 120, 120);
-  CheckExpectedRangesByTimestamp("{ }");
-  NewCodedFrameGroupAppend("150D1K 151D1");
-  CheckExpectedRangesByTimestamp("{ [150,152) }");
-  CheckExpectedBuffers("150K 151");
-  CheckNoNextBuffer();
-}
-
-// Verify that coded frames starting after the fudge room boundary do not
-// unblock the read when buffered after the previously read position is removed.
-TEST_F(SourceBufferStreamTest, AfterRemove_BeyondFudge_Stalled) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 90D30");
-  CheckExpectedRangesByTimestamp("{ [0,120) }");
-  CheckExpectedBuffers("0K 30 60 90");
-  CheckNoNextBuffer();
-
-  RemoveInMs(0, 120, 120);
-  CheckExpectedRangesByTimestamp("{ }");
-  NewCodedFrameGroupAppend("151D1K 152D1");
-  CheckExpectedRangesByTimestamp("{ [151,153) }");
-  CheckNoNextBuffer();
-}
-
-// Verify that non-keyframes with the same timestamp in the same
-// append are handled correctly.
-TEST_F(SourceBufferStreamTest, SameTimestamp_Video_SingleAppend) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 30 60 90 120K 150");
-  CheckExpectedBuffers("0K 30 30 60 90 120K 150");
-}
-
-// Verify that non-keyframes with the same timestamp can occur
-// in different appends.
-TEST_F(SourceBufferStreamTest, SameTimestamp_Video_TwoAppends) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30");
-  AppendBuffers("30 60 90 120K 150");
-  CheckExpectedBuffers("0K 30 30 60 90 120K 150");
-}
-
-// Verify that a non-keyframe followed by a keyframe with the same timestamp
-// is allowed, but also results in a MediaLog.
-TEST_F(SourceBufferStreamTest, SameTimestamp_Video_SingleAppend_Warning) {
-  EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog());
-
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 30K 60");
-  CheckExpectedBuffers("0K 30 30K 60");
-}
-
-TEST_F(SourceBufferStreamTest, SameTimestamp_Video_TwoAppends_Warning) {
-  EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog());
-
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30");
-  AppendBuffers("30K 60");
-  CheckExpectedBuffers("0K 30 30K 60");
-}
-
-// Verify that a keyframe followed by a non-keyframe with the same timestamp
-// is allowed.
-TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_TwoAppends) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30K");
-  AppendBuffers("30 60");
-  CheckExpectedBuffers("0K 30K 30 60");
-}
-
-TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_SingleAppend) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30K 30 60");
-  CheckExpectedBuffers("0K 30K 30 60");
-}
-
-TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_1) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 60 90 120K 150");
-
-  NewCodedFrameGroupAppend("60K 91 121K 151");
-  CheckExpectedBuffers("0K 30 60K 91 121K 151");
-}
-
-TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_2) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 60 90 120K 150");
-  NewCodedFrameGroupAppend("0K 30 61");
-  CheckExpectedBuffers("0K 30 61 120K 150");
-}
-
-TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_3) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 20 40 60 80 100K 101 102 103K");
-  NewCodedFrameGroupAppend("0K 20 40 60 80 90");
-  CheckExpectedBuffers("0K 20 40 60 80 90 100K 101 102 103K");
-  AppendBuffers("90 110K 150");
-  Seek(0);
-  CheckExpectedBuffers("0K 20 40 60 80 90 90 110K 150");
-  CheckNoNextBuffer();
-  CheckExpectedRangesByTimestamp("{ [0,190) }");
-}
-
-// Test all the valid same timestamp cases for audio.
-TEST_F(SourceBufferStreamTest, SameTimestamp_Audio) {
-  AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO,
-                            44100, EmptyExtraData(), Unencrypted());
-  stream_.reset(new SourceBufferStream(config, media_log_, true));
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 0K 30K 30 60 60");
-  CheckExpectedBuffers("0K 0K 30K 30 60 60");
-}
-
-TEST_F(SourceBufferStreamTest, SameTimestamp_Audio_SingleAppend_Warning) {
-  EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog());
-
-  AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO,
-                            44100, EmptyExtraData(), Unencrypted());
-  stream_.reset(new SourceBufferStream(config, media_log_, true));
-  Seek(0);
-
-  // Note, in reality, a non-keyframe audio frame is rare or perhaps not
-  // possible.
-  NewCodedFrameGroupAppend("0K 30 30K 60");
-  CheckExpectedBuffers("0K 30 30K 60");
-}
-
-// If seeking past any existing range and the seek is pending
-// because no data has been provided for that position,
-// the stream position can be considered as the end of stream.
-TEST_F(SourceBufferStreamTest, EndSelected_During_PendingSeek) {
-  // Append 15 buffers at positions 0 through 14.
-  NewCodedFrameGroupAppend(0, 15);
-
-  Seek(20);
-  EXPECT_TRUE(stream_->IsSeekPending());
-  stream_->MarkEndOfStream();
-  EXPECT_FALSE(stream_->IsSeekPending());
-}
-
-// If there is a pending seek between 2 existing ranges,
-// the end of the stream has not been reached.
-TEST_F(SourceBufferStreamTest, EndNotSelected_During_PendingSeek) {
-  // Append:
-  // - 10 buffers at positions 0 through 9.
-  // - 10 buffers at positions 30 through 39
-  NewCodedFrameGroupAppend(0, 10);
-  NewCodedFrameGroupAppend(30, 10);
-
-  Seek(20);
-  EXPECT_TRUE(stream_->IsSeekPending());
-  stream_->MarkEndOfStream();
-  EXPECT_TRUE(stream_->IsSeekPending());
-}
-
-// Removing exact start & end of a range.
-TEST_F(SourceBufferStreamTest, Remove_WholeRange1) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-  RemoveInMs(10, 160, 160);
-  CheckExpectedRangesByTimestamp("{ }");
-}
-
-// Removal range starts before range and ends exactly at end.
-TEST_F(SourceBufferStreamTest, Remove_WholeRange2) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-  RemoveInMs(0, 160, 160);
-  CheckExpectedRangesByTimestamp("{ }");
-}
-
-// Removal range starts at the start of a range and ends beyond the
-// range end.
-TEST_F(SourceBufferStreamTest, Remove_WholeRange3) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-  RemoveInMs(10, 200, 200);
-  CheckExpectedRangesByTimestamp("{ }");
-}
-
-// Removal range starts before range start and ends after the range end.
-TEST_F(SourceBufferStreamTest, Remove_WholeRange4) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  CheckExpectedRangesByTimestamp("{ [10,160) }");
-  RemoveInMs(0, 200, 200);
-  CheckExpectedRangesByTimestamp("{ }");
-}
-
-// Removes multiple ranges.
-TEST_F(SourceBufferStreamTest, Remove_WholeRange5) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K");
-  NewCodedFrameGroupAppend("2000K 2030 2060K 2090 2120K");
-  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }");
-  RemoveInMs(10, 3000, 3000);
-  CheckExpectedRangesByTimestamp("{ }");
-}
-
-// Verifies a [0-infinity) range removes everything.
-TEST_F(SourceBufferStreamTest, Remove_ZeroToInfinity) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K");
-  NewCodedFrameGroupAppend("2000K 2030 2060K 2090 2120K");
-  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }");
-  Remove(base::TimeDelta(), kInfiniteDuration, kInfiniteDuration);
-  CheckExpectedRangesByTimestamp("{ }");
-}
-
-// Removal range starts at the beginning of the range and ends in the
-// middle of the range. This test verifies that full GOPs are removed.
-TEST_F(SourceBufferStreamTest, Remove_Partial1) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K");
-  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }");
-  RemoveInMs(0, 80, 2200);
-  CheckExpectedRangesByTimestamp("{ [130,160) [1000,1150) }");
-}
-
-// Removal range starts in the middle of a range and ends at the exact
-// end of the range.
-TEST_F(SourceBufferStreamTest, Remove_Partial2) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K");
-  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }");
-  RemoveInMs(40, 160, 2200);
-  CheckExpectedRangesByTimestamp("{ [10,40) [1000,1150) }");
-}
-
-// Removal range starts and ends within a range.
-TEST_F(SourceBufferStreamTest, Remove_Partial3) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K");
-  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }");
-  RemoveInMs(40, 120, 2200);
-  CheckExpectedRangesByTimestamp("{ [10,40) [130,160) [1000,1150) }");
-}
-
-// Removal range starts in the middle of one range and ends in the
-// middle of another range.
-TEST_F(SourceBufferStreamTest, Remove_Partial4) {
-  Seek(0);
-  NewCodedFrameGroupAppend("10K 40 70K 100 130K");
-  NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K");
-  NewCodedFrameGroupAppend("2000K 2030 2060K 2090 2120K");
-  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }");
-  RemoveInMs(40, 2030, 2200);
-  CheckExpectedRangesByTimestamp("{ [10,40) [2060,2150) }");
-}
-
-// Test behavior when the current position is removed and new buffers
-// are appended over the removal range.
-TEST_F(SourceBufferStreamTest, Remove_CurrentPosition) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330");
-  CheckExpectedRangesByTimestamp("{ [0,360) }");
-  CheckExpectedBuffers("0K 30 60 90K 120");
-
-  // Remove a range that includes the next buffer (i.e., 150).
-  RemoveInMs(150, 210, 360);
-  CheckExpectedRangesByTimestamp("{ [0,150) [270,360) }");
-
-  // Verify that no next buffer is returned.
-  CheckNoNextBuffer();
-
-  // Append some buffers to fill the gap that was created.
-  NewCodedFrameGroupAppend("120K 150 180 210K 240");
-  CheckExpectedRangesByTimestamp("{ [0,360) }");
-
-  // Verify that buffers resume at the next keyframe after the
-  // current position.
-  CheckExpectedBuffers("210K 240 270K 300 330");
-}
-
-// Test behavior when buffers in the selected range before the current position
-// are removed.
-TEST_F(SourceBufferStreamTest, Remove_BeforeCurrentPosition) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330");
-  CheckExpectedRangesByTimestamp("{ [0,360) }");
-  CheckExpectedBuffers("0K 30 60 90K 120");
-
-  // Remove a range that is before the current playback position.
-  RemoveInMs(0, 90, 360);
-  CheckExpectedRangesByTimestamp("{ [90,360) }");
-
-  CheckExpectedBuffers("150 180K 210 240 270K 300 330");
-}
-
-// Test removing the entire range for the current coded frame group
-// being appended.
-TEST_F(SourceBufferStreamTest, Remove_MidGroup) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 90 120K 150 180 210");
-  CheckExpectedRangesByTimestamp("{ [0,240) }");
-
-  NewCodedFrameGroupAppend("0K 30");
-
-  CheckExpectedBuffers("0K");
-
-  CheckExpectedRangesByTimestamp("{ [0,60) [120,240) }");
-
-  // Remove the entire range that is being appended to.
-  RemoveInMs(0, 60, 240);
-
-  // Verify that there is no next buffer since it was removed.
-  CheckNoNextBuffer();
-
-  CheckExpectedRangesByTimestamp("{ [120,240) }");
-
-  // Continue appending frames for the current GOP.
-  AppendBuffers("60 90");
-
-  // Verify that the non-keyframes are not added.
-  CheckExpectedRangesByTimestamp("{ [120,240) }");
-
-  // Finish the previous GOP and start the next one.
-  AppendBuffers("120 150K 180");
-
-  // Verify that new GOP replaces the existing range.
-  CheckExpectedRangesByTimestamp("{ [150,210) }");
-
-  SeekToTimestampMs(150);
-  CheckExpectedBuffers("150K 180");
-  CheckNoNextBuffer();
-}
-
-// Test removing the current GOP being appended, while not removing
-// the entire range the GOP belongs to.
-TEST_F(SourceBufferStreamTest, Remove_GOPBeingAppended) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 30 60 90 120K 150 180");
-  CheckExpectedRangesByTimestamp("{ [0,210) }");
-
-  // Remove the current GOP being appended.
-  RemoveInMs(120, 150, 240);
-  CheckExpectedRangesByTimestamp("{ [0,120) }");
-
-  // Continue appending the current GOP and the next one.
-  AppendBuffers("210 240K 270 300");
-
-  // Verify that the non-keyframe in the previous GOP does
-  // not effect any existing ranges and a new range is started at the
-  // beginning of the next GOP.
-  CheckExpectedRangesByTimestamp("{ [0,120) [240,330) }");
-
-  // Verify the buffers in the ranges.
-  CheckExpectedBuffers("0K 30 60 90");
-  CheckNoNextBuffer();
-  SeekToTimestampMs(240);
-  CheckExpectedBuffers("240K 270 300");
-}
-
-TEST_F(SourceBufferStreamTest, Remove_WholeGOPBeingAppended) {
-  SeekToTimestampMs(1000);
-  NewCodedFrameGroupAppend("1000K 1030 1060 1090");
-  CheckExpectedRangesByTimestamp("{ [1000,1120) }");
-
-  // Remove the keyframe of the current GOP being appended.
-  RemoveInMs(1000, 1030, 1120);
-  CheckExpectedRangesByTimestamp("{ }");
-
-  // Continue appending the current GOP.
-  AppendBuffers("1210 1240");
-
-  CheckExpectedRangesByTimestamp("{ }");
-
-  // Append the beginning of the next GOP.
-  AppendBuffers("1270K 1300");
-
-  // Verify that the new range is started at the
-  // beginning of the next GOP.
-  CheckExpectedRangesByTimestamp("{ [1270,1330) }");
-
-  // Verify the buffers in the ranges.
-  CheckNoNextBuffer();
-  SeekToTimestampMs(1270);
-  CheckExpectedBuffers("1270K 1300");
-}
-
-TEST_F(SourceBufferStreamTest,
-       Remove_PreviousAppendDestroyedAndOverwriteExistingRange) {
-  SeekToTimestampMs(90);
-
-  NewCodedFrameGroupAppend("90K 120 150");
-  CheckExpectedRangesByTimestamp("{ [90,180) }");
-
-  // Append a coded frame group before the previously appended data.
-  NewCodedFrameGroupAppend("0K 30 60");
-
-  // Verify that the ranges get merged.
-  CheckExpectedRangesByTimestamp("{ [0,180) }");
-
-  // Remove the data from the last append.
-  RemoveInMs(0, 90, 360);
-  CheckExpectedRangesByTimestamp("{ [90,180) }");
-
-  // Append a new coded frame group that follows the removed group and
-  // starts at the beginning of the range left over from the
-  // remove.
-  NewCodedFrameGroupAppend("90K 121 151");
-  CheckExpectedBuffers("90K 121 151");
-}
-
-TEST_F(SourceBufferStreamTest, Remove_GapAtBeginningOfGroup) {
-  Seek(0);
-
-  // Append a coded frame group that has a gap at the beginning of it.
-  NewCodedFrameGroupAppend(base::TimeDelta::FromMilliseconds(0),
-                           "30K 60 90 120K 150");
-  CheckExpectedRangesByTimestamp("{ [0,180) }");
-
-  // Remove the gap that doesn't contain any buffers.
-  RemoveInMs(0, 10, 180);
-  CheckExpectedRangesByTimestamp("{ [10,180) }");
-
-  // Verify we still get the first buffer still since only part of
-  // the gap was removed.
-  // TODO(acolwell/wolenetz): Consider not returning a buffer at this
-  // point since the current seek position has been explicitly
-  // removed but didn't happen to remove any buffers.
-  // http://crbug.com/384016
-  CheckExpectedBuffers("30K");
-
-  // Remove a range that includes the first GOP.
-  RemoveInMs(0, 60, 180);
-
-  // Verify that no buffer is returned because the current buffer
-  // position has been removed.
-  CheckNoNextBuffer();
-
-  CheckExpectedRangesByTimestamp("{ [120,180) }");
-}
-
-TEST_F(SourceBufferStreamTest, Text_Append_SingleRange) {
-  SetTextStream();
-  NewCodedFrameGroupAppend("0K 500K 1000K");
-  CheckExpectedRangesByTimestamp("{ [0,1500) }");
-
-  Seek(0);
-  CheckExpectedBuffers("0K 500K 1000K");
-}
-
-TEST_F(SourceBufferStreamTest, Text_Append_DisjointAfter) {
-  SetTextStream();
-  NewCodedFrameGroupAppend("0K 500K 1000K");
-  CheckExpectedRangesByTimestamp("{ [0,1500) }");
-  NewCodedFrameGroupAppend("3000K 3500K 4000K");
-  CheckExpectedRangesByTimestamp("{ [0,4500) }");
-
-  Seek(0);
-  CheckExpectedBuffers("0K 500K 1000K 3000K 3500K 4000K");
-}
-
-TEST_F(SourceBufferStreamTest, Text_Append_DisjointBefore) {
-  SetTextStream();
-  NewCodedFrameGroupAppend("3000K 3500K 4000K");
-  CheckExpectedRangesByTimestamp("{ [3000,4500) }");
-  NewCodedFrameGroupAppend("0K 500K 1000K");
-  CheckExpectedRangesByTimestamp("{ [0,4500) }");
-
-  Seek(0);
-  CheckExpectedBuffers("0K 500K 1000K 3000K 3500K 4000K");
-}
-
-TEST_F(SourceBufferStreamTest, Text_CompleteOverlap) {
-  SetTextStream();
-  NewCodedFrameGroupAppend("3000K 3500K 4000K");
-  CheckExpectedRangesByTimestamp("{ [3000,4500) }");
-  NewCodedFrameGroupAppend(
-      "0K 501K 1001K 1501K 2001K 2501K "
-      "3001K 3501K 4001K 4501K 5001K");
-  CheckExpectedRangesByTimestamp("{ [0,5501) }");
-
-  Seek(0);
-  CheckExpectedBuffers(
-      "0K 501K 1001K 1501K 2001K 2501K "
-      "3001K 3501K 4001K 4501K 5001K");
-}
-
-TEST_F(SourceBufferStreamTest, Text_OverlapAfter) {
-  SetTextStream();
-  NewCodedFrameGroupAppend("0K 500K 1000K 1500K 2000K");
-  CheckExpectedRangesByTimestamp("{ [0,2500) }");
-  NewCodedFrameGroupAppend("1499K 2001K 2501K 3001K");
-  CheckExpectedRangesByTimestamp("{ [0,3501) }");
-
-  Seek(0);
-  CheckExpectedBuffers("0K 500K 1000K 1499K 2001K 2501K 3001K");
-}
-
-TEST_F(SourceBufferStreamTest, Text_OverlapBefore) {
-  SetTextStream();
-  NewCodedFrameGroupAppend("1500K 2000K 2500K 3000K 3500K");
-  CheckExpectedRangesByTimestamp("{ [1500,4000) }");
-  NewCodedFrameGroupAppend("0K 501K 1001K 1501K 2001K");
-  CheckExpectedRangesByTimestamp("{ [0,4000) }");
-
-  Seek(0);
-  CheckExpectedBuffers("0K 501K 1001K 1501K 2001K 3000K 3500K");
-}
-
-TEST_F(SourceBufferStreamTest, SpliceFrame_Basic) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K S(3K 6 9D3 10D5) 15 20 S(25K 30D5 35D5) 40");
-  CheckExpectedBuffers("0K 3K 6 9 C 10 15 20 25K 30 C 35 40");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, SpliceFrame_SeekClearsSplice) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K S(3K 6 9D3 10D5) 15K 20");
-  CheckExpectedBuffers("0K 3K 6");
-
-  SeekToTimestampMs(15);
-  CheckExpectedBuffers("15K 20");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, SpliceFrame_SeekClearsSpliceFromTrackBuffer) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 2K S(3K 6 9D3 10D5) 15K 20");
-  CheckExpectedBuffers("0K 2K");
-
-  // Overlap the existing coded frame group.
-  NewCodedFrameGroupAppend("5K 15K 20");
-  CheckExpectedBuffers("3K 6");
-
-  SeekToTimestampMs(15);
-  CheckExpectedBuffers("15K 20");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, SpliceFrame_ConfigChangeWithinSplice) {
-  VideoDecoderConfig new_config = TestVideoConfig::Large();
-  ASSERT_FALSE(new_config.Matches(video_config_));
-
-  // Add a new video config, then reset the config index back to the original.
-  stream_->UpdateVideoConfig(new_config);
-  stream_->UpdateVideoConfig(video_config_);
-
-  Seek(0);
-  CheckVideoConfig(video_config_);
-  NewCodedFrameGroupAppend("0K S(3K 6C 9D3 10D5) 15");
-
-  CheckExpectedBuffers("0K 3K C");
-  CheckVideoConfig(new_config);
-  CheckExpectedBuffers("6 9 C");
-  CheckExpectedBuffers("10 C");
-  CheckVideoConfig(video_config_);
-  CheckExpectedBuffers("15");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, SpliceFrame_BasicFromTrackBuffer) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 5K S(8K 9D1 10D10) 20");
-  CheckExpectedBuffers("0K 5K");
-
-  // Overlap the existing coded frame group.
-  NewCodedFrameGroupAppend("5K 20");
-  CheckExpectedBuffers("8K 9 C 10 20");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       SpliceFrame_ConfigChangeWithinSpliceFromTrackBuffer) {
-  VideoDecoderConfig new_config = TestVideoConfig::Large();
-  ASSERT_FALSE(new_config.Matches(video_config_));
-
-  // Add a new video config, then reset the config index back to the original.
-  stream_->UpdateVideoConfig(new_config);
-  stream_->UpdateVideoConfig(video_config_);
-
-  Seek(0);
-  CheckVideoConfig(video_config_);
-  NewCodedFrameGroupAppend("0K 5K S(7K 8C 9D1 10D10) 20");
-  CheckExpectedBuffers("0K 5K");
-
-  // Overlap the existing coded frame group.
-  NewCodedFrameGroupAppend("5K 20");
-  CheckExpectedBuffers("7K C");
-  CheckVideoConfig(new_config);
-  CheckExpectedBuffers("8 9 C");
-  CheckExpectedBuffers("10 C");
-  CheckVideoConfig(video_config_);
-  CheckExpectedBuffers("20");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Basic) {
-  EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000));
-
-  SetAudioStream();
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K 12K");
-  NewCodedFrameGroupAppend("11K 13K 15K 17K");
-  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoExactSplices) {
-  EXPECT_MEDIA_LOG(
-      HasSubstr("Skipping splice frame generation: first new buffer at 10000us "
-                "begins at or before existing buffer at 10000us."));
-
-  SetAudioStream();
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K 12K");
-  NewCodedFrameGroupAppend("10K 14K");
-  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 14K");
-  CheckNoNextBuffer();
-}
-
-// Do not allow splices on top of splices.
-TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoDoubleSplice) {
-  InSequence s;
-  EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000));
-  EXPECT_MEDIA_LOG(
-      HasSubstr("Skipping splice frame generation: overlapped buffers at "
-                "10000us are in a previously buffered splice."));
-
-  SetAudioStream();
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K 12K");
-  NewCodedFrameGroupAppend("11K 13K 15K 17K");
-
-  // Verify the splice was created.
-  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K");
-  CheckNoNextBuffer();
-  Seek(0);
-
-  // Create a splice before the first splice which would include it.
-  NewCodedFrameGroupAppend("9D2K");
-
-  // A splice on top of a splice should result in a discard of the original
-  // splice and no new splice frame being generated.
-  CheckExpectedBuffers("0K 2K 4K 6K 8K 9K 13K 15K 17K");
-  CheckNoNextBuffer();
-}
-
-// Test that a splice is not created if an end timestamp and start timestamp
-// overlap.
-TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoSplice) {
-  SetAudioStream();
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K");
-  NewCodedFrameGroupAppend("12K 14K 16K 18K");
-  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K 14K 16K 18K");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_CorrectGroupStartTime) {
-  EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(5000, 1000));
-
-  SetAudioStream();
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 2K 4K");
-  CheckExpectedRangesByTimestamp("{ [0,6) }");
-  NewCodedFrameGroupAppend("6K 8K 10K");
-  CheckExpectedRangesByTimestamp("{ [0,12) }");
-  NewCodedFrameGroupAppend("1K 4D2K");
-  CheckExpectedRangesByTimestamp("{ [0,12) }");
-  CheckExpectedBuffers("0K 2K 4K C 1K 4K 6K 8K 10K");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_ConfigChange) {
-  EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 5000));
-
-  SetAudioStream();
-
-  AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarF32,
-                                CHANNEL_LAYOUT_MONO, 1000, EmptyExtraData(),
-                                Unencrypted());
-  ASSERT_NE(new_config.channel_layout(), audio_config_.channel_layout());
-
-  Seek(0);
-  CheckAudioConfig(audio_config_);
-  NewCodedFrameGroupAppend("0K 2K 4K 6K");
-  stream_->UpdateAudioConfig(new_config);
-  NewCodedFrameGroupAppend("5K 8K 12K");
-  CheckExpectedBuffers("0K 2K 4K 6K C 5K 8K 12K");
-  CheckAudioConfig(new_config);
-  CheckNoNextBuffer();
-}
-
-// Ensure splices are not created if there are not enough frames to crossfade.
-TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoTinySplices) {
-  EXPECT_MEDIA_LOG(HasSubstr(
-      "Skipping splice frame generation: not enough samples for splicing new "
-      "buffer at 1000us. Have 1000us, but need 2000us."));
-
-  SetAudioStream();
-  Seek(0);
-
-  // Overlap the range [0, 2) with [1, 3).  Since each frame has a duration of
-  // 2ms this results in an overlap of 1ms between the ranges.  A splice frame
-  // should not be generated since it requires at least 2 frames, or 2ms in this
-  // case, of data to crossfade.
-  NewCodedFrameGroupAppend("0D2K");
-  CheckExpectedRangesByTimestamp("{ [0,2) }");
-  NewCodedFrameGroupAppend("1D2K");
-  CheckExpectedRangesByTimestamp("{ [0,3) }");
-  CheckExpectedBuffers("0K 1K");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoMillisecondSplices) {
-  EXPECT_MEDIA_LOG(
-      HasSubstr("Skipping splice frame generation: not enough samples for "
-                "splicing new buffer at 1250us. Have 750us, but need 1000us."));
-
-  video_config_ = TestVideoConfig::Invalid();
-  audio_config_.Initialize(kCodecVorbis, kSampleFormatPlanarF32,
-                           CHANNEL_LAYOUT_STEREO, 4000, EmptyExtraData(),
-                           Unencrypted(), base::TimeDelta(), 0);
-  stream_.reset(new SourceBufferStream(audio_config_, media_log_, true));
-  // Equivalent to 0.5ms per frame.
-  SetStreamInfo(2000, 2000);
-  Seek(0);
-
-  // Append four buffers with a 0.5ms duration each.
-  NewCodedFrameGroupAppend(0, 4);
-  CheckExpectedRangesByTimestamp("{ [0,2) }");
-
-  // Overlap the range [0, 2) with [1.25, 2); this results in an overlap of
-  // 0.75ms between the ranges.
-  NewCodedFrameGroupAppend_OffsetFirstBuffer(
-      2, 2, base::TimeDelta::FromMillisecondsD(0.25));
-  CheckExpectedRangesByTimestamp("{ [0,2) }");
-
-  // A splice frame should not be generated (indicated by the lack of a config
-  // change in the expected buffer string) since it requires at least 1ms of
-  // data to crossfade.
-  CheckExpectedBuffers("0K 0K 1K 1K");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Preroll) {
-  EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000));
-
-  SetAudioStream();
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K 12K");
-  NewCodedFrameGroupAppend("11P 13K 15K 17K");
-  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11P 13K 15K 17K");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, Audio_PrerollFrame) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 3P 6K");
-  CheckExpectedBuffers("0K 3P 6K");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, BFrames) {
-  Seek(0);
-  NewCodedFrameGroupAppend("0K 120|30 30|60 60|90 90|120");
-  CheckExpectedRangesByTimestamp("{ [0,150) }");
-
-  CheckExpectedBuffers("0K 120|30 30|60 60|90 90|120");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, RemoveShouldAlwaysExcludeEnd) {
-  NewCodedFrameGroupAppend("10D2K 12D2 14D2");
-  CheckExpectedRangesByTimestamp("{ [10,16) }");
-
-  // Start new coded frame group, appending KF to abut the start of previous
-  // group.
-  NewCodedFrameGroupAppend("0D10K");
-  Seek(0);
-  CheckExpectedRangesByTimestamp("{ [0,16) }");
-  CheckExpectedBuffers("0K 10K 12 14");
-  CheckNoNextBuffer();
-
-  // Append another buffer with the same timestamp as the last KF. This triggers
-  // special logic that allows two buffers to have the same timestamp. When
-  // preparing for this new append, there is no reason to remove the later GOP
-  // starting at timestamp 10. This verifies the fix for http://crbug.com/469325
-  // where the decision *not* to remove the start of the overlapped range was
-  // erroneously triggering buffers with a timestamp matching the end
-  // of the append (and any later dependent frames) to be removed.
-  AppendBuffers("0D10");
-  Seek(0);
-  CheckExpectedRangesByTimestamp("{ [0,16) }");
-  CheckExpectedBuffers("0K 0 10K 12 14");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, RefinedDurationEstimates_BackOverlap) {
-  // Append a few buffers, the last one having estimated duration.
-  NewCodedFrameGroupAppend("0K 5 10 20D10E");
-  CheckExpectedRangesByTimestamp("{ [0,30) }");
-  Seek(0);
-  CheckExpectedBuffers("0K 5 10 20D10E");
-  CheckNoNextBuffer();
-
-  // Append a buffer to the end that overlaps the *back* of the existing range.
-  // This should trigger the estimated duration to be recomputed as a timestamp
-  // delta.
-  AppendBuffers("25D10");
-  CheckExpectedRangesByTimestamp("{ [0,35) }");
-  Seek(0);
-  // The duration of the buffer at time 20 has changed from 10ms to 5ms.
-  CheckExpectedBuffers("0K 5 10 20D5E 25");
-  CheckNoNextBuffer();
-
-  // If the last buffer is removed, the adjusted duration should remain at 5ms.
-  RemoveInMs(25, 35, 35);
-  CheckExpectedRangesByTimestamp("{ [0,25) }");
-  Seek(0);
-  CheckExpectedBuffers("0K 5 10 20D5E");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, RefinedDurationEstimates_FrontOverlap) {
-  // Append a few buffers.
-  NewCodedFrameGroupAppend("10K 15 20D5");
-  CheckExpectedRangesByTimestamp("{ [10,25) }");
-  SeekToTimestampMs(10);
-  CheckExpectedBuffers("10K 15 20");
-  CheckNoNextBuffer();
-
-  // Append new buffers, where the last has estimated duration that overlaps the
-  // *front* of the existing range. The overlap should trigger refinement of the
-  // estimated duration from 7ms to 5ms.
-  NewCodedFrameGroupAppend("0K 5D7E");
-  CheckExpectedRangesByTimestamp("{ [0,25) }");
-  Seek(0);
-  CheckExpectedBuffers("0K 5D5E 10K 15 20");
-  CheckNoNextBuffer();
-
-  // If the overlapped buffer at timestamp 10 is removed, the adjusted duration
-  // should remain adjusted.
-  RemoveInMs(10, 20, 25);
-  CheckExpectedRangesByTimestamp("{ [0,10) }");
-  Seek(0);
-  CheckExpectedBuffers("0K 5D5E");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, SeekToStartSatisfiedUpToThreshold) {
-  NewCodedFrameGroupAppend("999K 1010 1020D10");
-  CheckExpectedRangesByTimestamp("{ [999,1030) }");
-
-  SeekToTimestampMs(0);
-  CheckExpectedBuffers("999K 1010 1020D10");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, SeekToStartUnsatisfiedBeyondThreshold) {
-  NewCodedFrameGroupAppend("1000K 1010 1020D10");
-  CheckExpectedRangesByTimestamp("{ [1000,1030) }");
-
-  SeekToTimestampMs(0);
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       ReSeekToStartSatisfiedUpToThreshold_SameTimestamps) {
-  // Append a few buffers.
-  NewCodedFrameGroupAppend("999K 1010 1020D10");
-  CheckExpectedRangesByTimestamp("{ [999,1030) }");
-
-  // Don't read any buffers between Seek and Remove.
-  SeekToTimestampMs(0);
-  RemoveInMs(999, 1030, 1030);
-  CheckExpectedRangesByTimestamp("{ }");
-  CheckNoNextBuffer();
-
-  // Append buffers at the original timestamps and verify no stall.
-  NewCodedFrameGroupAppend("999K 1010 1020D10");
-  CheckExpectedRangesByTimestamp("{ [999,1030) }");
-  CheckExpectedBuffers("999K 1010 1020D10");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       ReSeekToStartSatisfiedUpToThreshold_EarlierTimestamps) {
-  // Append a few buffers.
-  NewCodedFrameGroupAppend("999K 1010 1020D10");
-  CheckExpectedRangesByTimestamp("{ [999,1030) }");
-
-  // Don't read any buffers between Seek and Remove.
-  SeekToTimestampMs(0);
-  RemoveInMs(999, 1030, 1030);
-  CheckExpectedRangesByTimestamp("{ }");
-  CheckNoNextBuffer();
-
-  // Append buffers before the original timestamps and verify no stall (the
-  // re-seek to time 0 should still be satisfied with the new buffers).
-  NewCodedFrameGroupAppend("500K 510 520D10");
-  CheckExpectedRangesByTimestamp("{ [500,530) }");
-  CheckExpectedBuffers("500K 510 520D10");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       ReSeekToStartSatisfiedUpToThreshold_LaterTimestamps) {
-  // Append a few buffers.
-  NewCodedFrameGroupAppend("500K 510 520D10");
-  CheckExpectedRangesByTimestamp("{ [500,530) }");
-
-  // Don't read any buffers between Seek and Remove.
-  SeekToTimestampMs(0);
-  RemoveInMs(500, 530, 530);
-  CheckExpectedRangesByTimestamp("{ }");
-  CheckNoNextBuffer();
-
-  // Append buffers beginning after original timestamps, but still below the
-  // start threshold, and verify no stall (the re-seek to time 0 should still be
-  // satisfied with the new buffers).
-  NewCodedFrameGroupAppend("999K 1010 1020D10");
-  CheckExpectedRangesByTimestamp("{ [999,1030) }");
-  CheckExpectedBuffers("999K 1010 1020D10");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, ReSeekBeyondStartThreshold_SameTimestamps) {
-  // Append a few buffers.
-  NewCodedFrameGroupAppend("1000K 1010 1020D10");
-  CheckExpectedRangesByTimestamp("{ [1000,1030) }");
-
-  // Don't read any buffers between Seek and Remove.
-  SeekToTimestampMs(1000);
-  RemoveInMs(1000, 1030, 1030);
-  CheckExpectedRangesByTimestamp("{ }");
-  CheckNoNextBuffer();
-
-  // Append buffers at the original timestamps and verify no stall.
-  NewCodedFrameGroupAppend("1000K 1010 1020D10");
-  CheckExpectedRangesByTimestamp("{ [1000,1030) }");
-  CheckExpectedBuffers("1000K 1010 1020D10");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, ReSeekBeyondThreshold_EarlierTimestamps) {
-  // Append a few buffers.
-  NewCodedFrameGroupAppend("2000K 2010 2020D10");
-  CheckExpectedRangesByTimestamp("{ [2000,2030) }");
-
-  // Don't read any buffers between Seek and Remove.
-  SeekToTimestampMs(2000);
-  RemoveInMs(2000, 2030, 2030);
-  CheckExpectedRangesByTimestamp("{ }");
-  CheckNoNextBuffer();
-
-  // Append buffers before the original timestamps and verify no stall (the
-  // re-seek to time 2 seconds should still be satisfied with the new buffers
-  // and should emit preroll from last keyframe).
-  NewCodedFrameGroupAppend("1080K 1090 2000D10");
-  CheckExpectedRangesByTimestamp("{ [1080,2010) }");
-  CheckExpectedBuffers("1080K 1090 2000D10");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, ConfigChange_ReSeek) {
-  // Append a few buffers, with a config change in the middle.
-  VideoDecoderConfig new_config = TestVideoConfig::Large();
-  NewCodedFrameGroupAppend("2000K 2010 2020D10");
-  stream_->UpdateVideoConfig(new_config);
-  NewCodedFrameGroupAppend("2030K 2040 2050D10");
-  CheckExpectedRangesByTimestamp("{ [2000,2060) }");
-
-  // Read the config change, but don't read any non-config-change buffer between
-  // Seek and Remove.
-  scoped_refptr<StreamParserBuffer> buffer;
-  CheckVideoConfig(video_config_);
-  SeekToTimestampMs(2030);
-  CheckVideoConfig(video_config_);
-  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
-  CheckVideoConfig(new_config);
-
-  // Trigger the re-seek.
-  RemoveInMs(2030, 2060, 2060);
-  CheckExpectedRangesByTimestamp("{ [2000,2030) }");
-  CheckNoNextBuffer();
-
-  // Append buffers at the original timestamps and verify no stall or redundant
-  // signalling of config change.
-  NewCodedFrameGroupAppend("2030K 2040 2050D10");
-  CheckVideoConfig(new_config);
-  CheckExpectedRangesByTimestamp("{ [2000,2060) }");
-  CheckExpectedBuffers("2030K 2040 2050D10");
-  CheckNoNextBuffer();
-  CheckVideoConfig(new_config);
-
-  // Seek to the start of buffered and verify config changes and buffers.
-  SeekToTimestampMs(2000);
-  CheckVideoConfig(new_config);
-  ASSERT_FALSE(new_config.Matches(video_config_));
-  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
-  CheckVideoConfig(video_config_);
-  CheckExpectedBuffers("2000K 2010 2020D10");
-  CheckVideoConfig(video_config_);
-  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
-  CheckVideoConfig(new_config);
-  CheckExpectedBuffers("2030K 2040 2050D10");
-  CheckNoNextBuffer();
-  CheckVideoConfig(new_config);
-}
-
-TEST_F(SourceBufferStreamTest, TrackBuffer_ExhaustionWithSkipForward) {
-  NewCodedFrameGroupAppend("0K 10 20 30 40");
-
-  // Read the first 4 buffers, so next buffer is at time 40.
-  Seek(0);
-  CheckExpectedRangesByTimestamp("{ [0,50) }");
-  CheckExpectedBuffers("0K 10 20 30");
-
-  // Overlap-append, populating track buffer with timestamp 40 from original
-  // append. Confirm there could be a large jump in time until the next key
-  // frame after exhausting the track buffer.
-  NewCodedFrameGroupAppend(
-      "31K 41 51 61 71 81 91 101 111 121 "
-      "131K 141");
-  CheckExpectedRangesByTimestamp("{ [0,151) }");
-
-  // Confirm the large jump occurs and warning log is generated.
-  // If this test is changed, update
-  // TrackBufferExhaustion_ImmediateNewTrackBuffer accordingly.
-  EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(91));
-
-  CheckExpectedBuffers("40 131K 141");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       TrackBuffer_ExhaustionAndImmediateNewTrackBuffer) {
-  NewCodedFrameGroupAppend("0K 10 20 30 40");
-
-  // Read the first 4 buffers, so next buffer is at time 40.
-  Seek(0);
-  CheckExpectedRangesByTimestamp("{ [0,50) }");
-  CheckExpectedBuffers("0K 10 20 30");
-
-  // Overlap-append
-  NewCodedFrameGroupAppend(
-      "31K 41 51 61 71 81 91 101 111 121 "
-      "131K 141");
-  CheckExpectedRangesByTimestamp("{ [0,151) }");
-
-  // Exhaust the track buffer, but don't read any of the overlapping append yet.
-  CheckExpectedBuffers("40");
-
-  // Selected range's next buffer is now the 131K buffer from the overlapping
-  // append. (See TrackBuffer_ExhaustionWithSkipForward for that verification.)
-  // Do another overlap-append to immediately create another track buffer and
-  // verify both track buffer exhaustions skip forward and emit log warnings.
-  NewCodedFrameGroupAppend(
-      "22K 32 42 52 62 72 82 92 102 112 122K 132 142 152K 162");
-  CheckExpectedRangesByTimestamp("{ [0,172) }");
-
-  InSequence s;
-  EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(91));
-  EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(11));
-
-  CheckExpectedBuffers("131K 141 152K 162");
-  CheckNoNextBuffer();
-}
-
-TEST_F(
-    SourceBufferStreamTest,
-    AdjacentCodedFrameGroupContinuation_NoGapCreatedByTinyGapInGroupContinuation) {
-  NewCodedFrameGroupAppend("0K 10 20K 30 40K 50D10");
-  CheckExpectedRangesByTimestamp("{ [0,60) }");
-
-  // Continue appending to the previously started coded frame group, albeit with
-  // a tiny (1ms) gap. This gap should *NOT* produce a buffered range gap.
-  AppendBuffers("61K 71D10");
-  CheckExpectedRangesByTimestamp("{ [0,81) }");
-}
-
-TEST_F(SourceBufferStreamTest,
-       AdjacentCodedFrameGroupContinuation_NoGapCreatedPrefixRemoved) {
-  NewCodedFrameGroupAppend("0K 10 20K 30 40K 50D10");
-  CheckExpectedRangesByTimestamp("{ [0,60) }");
-
-  RemoveInMs(0, 35, 60);
-  CheckExpectedRangesByTimestamp("{ [40,60) }");
-
-  // Continue appending to the previously started coded frame group, albeit with
-  // a tiny (1ms) gap. This gap should *NOT* produce a buffered range gap.
-  AppendBuffers("61K 71D10");
-  CheckExpectedRangesByTimestamp("{ [40,81) }");
-}
-
-TEST_F(SourceBufferStreamTest,
-       AdjacentNewCodedFrameGroupContinuation_NoGapCreatedPrefixRemoved) {
-  NewCodedFrameGroupAppend("0K 10 20K 30 40K 50D10");
-  CheckExpectedRangesByTimestamp("{ [0,60) }");
-
-  RemoveInMs(0, 35, 60);
-  CheckExpectedRangesByTimestamp("{ [40,60) }");
-
-  // Continue appending, with a new coded frame group, albeit with
-  // a tiny (1ms) gap. This gap should *NOT* produce a buffered range gap.
-  // This test demonstrates the "pre-relaxation" behavior, where a new "media
-  // segment" (now a new "coded frame group") was signaled at every media
-  // segment boundary.
-  NewCodedFrameGroupAppend("61K 71D10");
-  CheckExpectedRangesByTimestamp("{ [40,81) }");
-}
-
-TEST_F(SourceBufferStreamTest,
-       StartCodedFrameGroup_RemoveThenAppendMoreMuchLater) {
-  NewCodedFrameGroupAppend("1000K 1010 1020 1030K 1040 1050 1060K 1070 1080");
-  NewCodedFrameGroupAppend("0K 10 20");
-  CheckExpectedRangesByTimestamp("{ [0,30) [1000,1090) }");
-
-  SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(1070));
-  CheckExpectedRangesByTimestamp("{ [0,30) [1000,1090) }");
-
-  RemoveInMs(1030, 1050, 1090);
-  CheckExpectedRangesByTimestamp("{ [0,30) [1000,1030) [1060,1090) }");
-
-  // We've signalled that we're about to do some appends to a coded frame group
-  // which starts at time 1070ms. Note that the first frame, if any ever,
-  // appended to this SourceBufferStream for that coded frame group must have a
-  // decode timestamp >= 1070ms (it can be significantly in the future).
-  // Regardless, that appended frame must be buffered into the same existing
-  // range as current [1060,1090), since the new coded frame group's start of
-  // 1070ms is within that range.
-  AppendBuffers("2000K 2010");
-  CheckExpectedRangesByTimestamp("{ [0,30) [1000,1030) [1060,2020) }");
-  SeekToTimestampMs(1060);
-  CheckExpectedBuffers("1060K 2000K 2010");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       StartCodedFrameGroup_InExisting_AppendMuchLater) {
-  NewCodedFrameGroupAppend("0K 10 20 30K 40 50");
-  SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(45));
-  CheckExpectedRangesByTimestamp("{ [0,60) }");
-
-  AppendBuffers("2000K 2010");
-  CheckExpectedRangesByTimestamp("{ [0,2020) }");
-  Seek(0);
-  CheckExpectedBuffers("0K 10 20 30K 40 2000K 2010");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       StartCodedFrameGroup_InExisting_RemoveGOP_ThenAppend_1) {
-  NewCodedFrameGroupAppend("0K 10 20 30K 40 50");
-  SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(30));
-  RemoveInMs(30, 60, 60);
-  CheckExpectedRangesByTimestamp("{ [0,30) }");
-
-  AppendBuffers("2000K 2010");
-  CheckExpectedRangesByTimestamp("{ [0,2020) }");
-  Seek(0);
-  CheckExpectedBuffers("0K 10 20 2000K 2010");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       StartCodedFrameGroup_InExisting_RemoveGOP_ThenAppend_2) {
-  NewCodedFrameGroupAppend("0K 10 20 30K 40 50");
-  SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(45));
-  RemoveInMs(30, 60, 60);
-  CheckExpectedRangesByTimestamp("{ [0,30) }");
-
-  AppendBuffers("2000K 2010");
-  CheckExpectedRangesByTimestamp("{ [0,30) [45,2020) }");
-  Seek(0);
-  CheckExpectedBuffers("0K 10 20");
-  CheckNoNextBuffer();
-  SeekToTimestampMs(45);
-  CheckExpectedBuffers("2000K 2010");
-  CheckNoNextBuffer();
-  SeekToTimestampMs(1000);
-  CheckExpectedBuffers("2000K 2010");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       StartCodedFrameGroup_InExisting_RemoveMostRecentAppend_ThenAppend_1) {
-  NewCodedFrameGroupAppend("0K 10 20 30K 40 50");
-  SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(45));
-  RemoveInMs(50, 60, 60);
-  CheckExpectedRangesByTimestamp("{ [0,50) }");
-
-  AppendBuffers("2000K 2010");
-  CheckExpectedRangesByTimestamp("{ [0,2020) }");
-  Seek(0);
-  CheckExpectedBuffers("0K 10 20 30K 40 2000K 2010");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest,
-       StartCodedFrameGroup_InExisting_RemoveMostRecentAppend_ThenAppend_2) {
-  NewCodedFrameGroupAppend("0K 10 20 30K 40 50");
-  SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(50));
-  RemoveInMs(50, 60, 60);
-  CheckExpectedRangesByTimestamp("{ [0,50) }");
-
-  AppendBuffers("2000K 2010");
-  CheckExpectedRangesByTimestamp("{ [0,2020) }");
-  Seek(0);
-  CheckExpectedBuffers("0K 10 20 30K 40 2000K 2010");
-  CheckNoNextBuffer();
-}
-
-TEST_F(SourceBufferStreamTest, GetHighestPresentationTimestamp) {
-  // TODO(wolenetz): Add coverage for when DTS != PTS once
-  // https://crbug.com/398130 is fixed.
-
-  EXPECT_EQ(base::TimeDelta(), stream_->GetHighestPresentationTimestamp());
-
-  NewCodedFrameGroupAppend("0K 10K");
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(10),
-            stream_->GetHighestPresentationTimestamp());
-
-  RemoveInMs(0, 10, 20);
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(10),
-            stream_->GetHighestPresentationTimestamp());
-
-  RemoveInMs(10, 20, 20);
-  EXPECT_EQ(base::TimeDelta(), stream_->GetHighestPresentationTimestamp());
-
-  NewCodedFrameGroupAppend("0K 10K");
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(10),
-            stream_->GetHighestPresentationTimestamp());
-
-  RemoveInMs(10, 20, 20);
-  EXPECT_EQ(base::TimeDelta(), stream_->GetHighestPresentationTimestamp());
-}
-
-// TODO(vrk): Add unit tests where keyframes are unaligned between streams.
-// (crbug.com/133557)
-
-// TODO(vrk): Add unit tests with end of stream being called at interesting
-// times.
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/stream_parser_factory.cc b/cobalt/media/filters/stream_parser_factory.cc
deleted file mode 100644
index 64bece2..0000000
--- a/cobalt/media/filters/stream_parser_factory.cc
+++ /dev/null
@@ -1,405 +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.
-
-#include "cobalt/media/filters/stream_parser_factory.h"
-
-#include <memory>
-#include <set>
-
-#include "base/basictypes.h"
-#include "base/command_line.h"
-#include "base/metrics/histogram.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/strings/pattern.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/media.h"
-#include "cobalt/media/formats/mpeg/adts_stream_parser.h"
-#include "cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.h"
-#include "cobalt/media/formats/webm/webm_stream_parser.h"
-
-#if defined(OS_ANDROID)
-#include "cobalt/media/base/android/media_codec_util.h"
-#endif
-
-#include "cobalt/media/formats/mp4/es_descriptor.h"
-#include "cobalt/media/formats/mp4/mp4_stream_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-typedef bool (*CodecIDValidatorFunction)(
-    const std::string& codecs_id, const scoped_refptr<MediaLog>& media_log);
-
-struct CodecInfo {
-  enum Type { UNKNOWN, AUDIO, VIDEO };
-
-  // Update tools/metrics/histograms/histograms.xml if new values are added.
-  enum HistogramTag {
-    HISTOGRAM_UNKNOWN,
-    HISTOGRAM_VP8,
-    HISTOGRAM_VP9,
-    HISTOGRAM_VORBIS,
-    HISTOGRAM_H264,
-    HISTOGRAM_MPEG2AAC,
-    HISTOGRAM_MPEG4AAC,
-    HISTOGRAM_EAC3,
-    HISTOGRAM_MP3,
-    HISTOGRAM_OPUS,
-    HISTOGRAM_HEVC,
-    HISTOGRAM_AC3,
-    HISTOGRAM_AV1,
-    HISTOGRAM_MAX = HISTOGRAM_AV1  // Must be equal to largest logged entry.
-  };
-
-  const char* pattern;
-  Type type;
-  CodecIDValidatorFunction validator;
-  HistogramTag tag;
-};
-
-typedef StreamParser* (*ParserFactoryFunction)(
-    DecoderBuffer::Allocator* buffer_allocator,
-    const std::vector<std::string>& codecs,
-    const scoped_refptr<MediaLog>& media_log);
-
-struct SupportedTypeInfo {
-  const char* type;
-  const ParserFactoryFunction factory_function;
-  const CodecInfo** codecs;
-};
-
-static const CodecInfo kVP09CodecInfo = {"vp09.*", CodecInfo::VIDEO, NULL,
-                                         CodecInfo::HISTOGRAM_VP9};
-static const CodecInfo kVP8CodecInfo = {"vp8", CodecInfo::VIDEO, NULL,
-                                        CodecInfo::HISTOGRAM_VP8};
-static const CodecInfo kVP9CodecInfo = {"vp9*", CodecInfo::VIDEO, NULL,
-                                        CodecInfo::HISTOGRAM_VP9};
-static const CodecInfo kVorbisCodecInfo = {"vorbis", CodecInfo::AUDIO, NULL,
-                                           CodecInfo::HISTOGRAM_VORBIS};
-static const CodecInfo kOpusCodecInfo = {"opus", CodecInfo::AUDIO, NULL,
-                                         CodecInfo::HISTOGRAM_OPUS};
-// Note: Validation of the codec string is handled by the caller.
-static const CodecInfo kAV1CodecInfo = {"av01.*", CodecInfo::VIDEO, nullptr,
-                                        CodecInfo::HISTOGRAM_AV1};
-
-static const CodecInfo* kVideoWebMCodecs[] = {&kVP09CodecInfo,
-                                              &kVP8CodecInfo,
-                                              &kVP9CodecInfo,
-                                              &kVorbisCodecInfo,
-                                              &kOpusCodecInfo,
-                                              &kAV1CodecInfo,
-                                              NULL};
-
-static const CodecInfo* kAudioWebMCodecs[] = {&kVorbisCodecInfo,
-                                              &kOpusCodecInfo, NULL};
-
-static StreamParser* BuildWebMParser(DecoderBuffer::Allocator* buffer_allocator,
-                                     const std::vector<std::string>& codecs,
-                                     const scoped_refptr<MediaLog>& media_log) {
-  return new WebMStreamParser(buffer_allocator);
-}
-
-// AAC Object Type IDs that Chrome supports.
-static const int kAACLCObjectType = 2;
-static const int kAACSBRObjectType = 5;
-static const int kAACPSObjectType = 29;
-
-static int GetMP4AudioObjectType(const std::string& codec_id,
-                                 const scoped_refptr<MediaLog>& media_log) {
-  // From RFC 6381 section 3.3 (ISO Base Media File Format Name Space):
-  // When the first element of a ['codecs' parameter value] is 'mp4a' ...,
-  // the second element is a hexadecimal representation of the MP4 Registration
-  // Authority ObjectTypeIndication (OTI). Note that MP4RA uses a leading "0x"
-  // with these values, which is omitted here and hence implied.
-  std::vector<std::string> tokens = base::SplitString(
-      codec_id, std::string("."), base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  if (tokens.size() == 3 && tokens[0] == "mp4a" && tokens[1] == "40") {
-    // From RFC 6381 section 3.3:
-    // One of the OTI values for 'mp4a' is 40 (identifying MPEG-4 audio). For
-    // this value, the third element identifies the audio ObjectTypeIndication
-    // (OTI) ... expressed as a decimal number.
-    int audio_object_type;
-    if (base::StringToInt(tokens[2], &audio_object_type))
-      return audio_object_type;
-  }
-
-  MEDIA_LOG(DEBUG, media_log)
-      << "Malformed mimetype codec '" << codec_id << "'";
-  return -1;
-}
-
-bool ValidateMP4ACodecID(const std::string& codec_id,
-                         const scoped_refptr<MediaLog>& media_log) {
-  int audio_object_type = GetMP4AudioObjectType(codec_id, media_log);
-  if (audio_object_type == kAACLCObjectType ||
-      audio_object_type == kAACSBRObjectType ||
-      audio_object_type == kAACPSObjectType) {
-    return true;
-  }
-
-  MEDIA_LOG(DEBUG, media_log)
-      << "Unsupported audio object type " << audio_object_type << " in codec '"
-      << codec_id << "'";
-  return false;
-}
-
-static const CodecInfo kH264AVC1CodecInfo = {"avc1.*", CodecInfo::VIDEO, NULL,
-                                             CodecInfo::HISTOGRAM_H264};
-static const CodecInfo kH264AVC3CodecInfo = {"avc3.*", CodecInfo::VIDEO, NULL,
-                                             CodecInfo::HISTOGRAM_H264};
-static const CodecInfo kHEVCHEV1CodecInfo = {"hev1.*", CodecInfo::VIDEO, NULL,
-                                             CodecInfo::HISTOGRAM_HEVC};
-static const CodecInfo kHEVCHVC1CodecInfo = {"hvc1.*", CodecInfo::VIDEO, NULL,
-                                             CodecInfo::HISTOGRAM_HEVC};
-static const CodecInfo kMPEG4VP09CodecInfo = {"vp09.*", CodecInfo::VIDEO, NULL,
-                                              CodecInfo::HISTOGRAM_VP9};
-static const CodecInfo kMPEG4AACCodecInfo = {"mp4a.40.*", CodecInfo::AUDIO,
-                                             &ValidateMP4ACodecID,
-                                             CodecInfo::HISTOGRAM_MPEG4AAC};
-static const CodecInfo kMPEG2AACLCCodecInfo = {
-    "mp4a.67", CodecInfo::AUDIO, NULL, CodecInfo::HISTOGRAM_MPEG2AAC};
-// The 'ac-3' and 'ec-3' are mime codec ids for AC3 and EAC3 according to
-// http://www.mp4ra.org/codecs.html
-// The object types for AC3 and EAC3 in MP4 container are 0xa5 and 0xa6, so
-// according to RFC 6381 this corresponds to codec ids 'mp4a.A5' and 'mp4a.A6'.
-// Codec ids with lower case oti (mp4a.a5 and mp4a.a6) are supported for
-// backward compatibility.
-static const CodecInfo kAC3CodecInfo1 = {"ac-3", CodecInfo::AUDIO, NULL,
-                                         CodecInfo::HISTOGRAM_AC3};
-static const CodecInfo kAC3CodecInfo2 = {"mp4a.a5", CodecInfo::AUDIO, NULL,
-                                         CodecInfo::HISTOGRAM_AC3};
-static const CodecInfo kAC3CodecInfo3 = {"mp4a.A5", CodecInfo::AUDIO, NULL,
-                                         CodecInfo::HISTOGRAM_AC3};
-static const CodecInfo kEAC3CodecInfo1 = {"ec-3", CodecInfo::AUDIO, NULL,
-                                          CodecInfo::HISTOGRAM_EAC3};
-static const CodecInfo kEAC3CodecInfo2 = {"mp4a.a6", CodecInfo::AUDIO, NULL,
-                                          CodecInfo::HISTOGRAM_EAC3};
-static const CodecInfo kEAC3CodecInfo3 = {"mp4a.A6", CodecInfo::AUDIO, NULL,
-                                          CodecInfo::HISTOGRAM_EAC3};
-
-static const CodecInfo* kVideoMP4Codecs[] = {
-    &kH264AVC1CodecInfo,   &kH264AVC3CodecInfo,  &kHEVCHEV1CodecInfo,
-    &kHEVCHVC1CodecInfo,   &kMPEG4VP09CodecInfo, &kMPEG4AACCodecInfo,
-    &kMPEG2AACLCCodecInfo, &kAV1CodecInfo,       NULL};
-
-static const CodecInfo* kAudioMP4Codecs[] = {
-    &kMPEG4AACCodecInfo, &kMPEG2AACLCCodecInfo, &kAC3CodecInfo1,
-    &kAC3CodecInfo2,     &kAC3CodecInfo3,       &kEAC3CodecInfo1,
-    &kEAC3CodecInfo2,    &kEAC3CodecInfo3,      NULL};
-
-static StreamParser* BuildMP4Parser(DecoderBuffer::Allocator* buffer_allocator,
-                                    const std::vector<std::string>& codecs,
-                                    const scoped_refptr<MediaLog>& media_log) {
-  std::set<int> audio_object_types;
-
-  bool has_sbr = false;
-  for (size_t i = 0; i < codecs.size(); ++i) {
-    std::string codec_id = codecs[i];
-    if (base::MatchPattern(codec_id, kMPEG2AACLCCodecInfo.pattern)) {
-      audio_object_types.insert(mp4::kISO_13818_7_AAC_LC);
-    } else if (base::MatchPattern(codec_id, kMPEG4AACCodecInfo.pattern)) {
-      int audio_object_type = GetMP4AudioObjectType(codec_id, media_log);
-      DCHECK_GT(audio_object_type, 0);
-
-      audio_object_types.insert(mp4::kISO_14496_3);
-
-      if (audio_object_type == kAACSBRObjectType ||
-          audio_object_type == kAACPSObjectType) {
-        has_sbr = true;
-        break;
-      }
-    } else if (base::MatchPattern(codec_id, kAC3CodecInfo1.pattern) ||
-               base::MatchPattern(codec_id, kAC3CodecInfo2.pattern) ||
-               base::MatchPattern(codec_id, kAC3CodecInfo3.pattern)) {
-      audio_object_types.insert(mp4::kAC3);
-    } else if (base::MatchPattern(codec_id, kEAC3CodecInfo1.pattern) ||
-               base::MatchPattern(codec_id, kEAC3CodecInfo2.pattern) ||
-               base::MatchPattern(codec_id, kEAC3CodecInfo3.pattern)) {
-      audio_object_types.insert(mp4::kEAC3);
-    }
-  }
-
-  return new mp4::MP4StreamParser(buffer_allocator, audio_object_types,
-                                  has_sbr);
-}
-
-static const CodecInfo kMP3CodecInfo = {NULL, CodecInfo::AUDIO, NULL,
-                                        CodecInfo::HISTOGRAM_MP3};
-
-static const CodecInfo* kAudioMP3Codecs[] = {&kMP3CodecInfo, NULL};
-
-static StreamParser* BuildMP3Parser(DecoderBuffer::Allocator* buffer_allocator,
-                                    const std::vector<std::string>& codecs,
-                                    const scoped_refptr<MediaLog>& media_log) {
-  return new MPEG1AudioStreamParser(buffer_allocator);
-}
-
-static const CodecInfo kADTSCodecInfo = {NULL, CodecInfo::AUDIO, NULL,
-                                         CodecInfo::HISTOGRAM_MPEG4AAC};
-static const CodecInfo* kAudioADTSCodecs[] = {&kADTSCodecInfo, NULL};
-
-static StreamParser* BuildADTSParser(DecoderBuffer::Allocator* buffer_allocator,
-                                     const std::vector<std::string>& codecs,
-                                     const scoped_refptr<MediaLog>& media_log) {
-  return new ADTSStreamParser(buffer_allocator);
-}
-
-static const SupportedTypeInfo kSupportedTypeInfo[] = {
-    {"video/webm", &BuildWebMParser, kVideoWebMCodecs},
-    {"audio/webm", &BuildWebMParser, kAudioWebMCodecs},
-    {"audio/aac", &BuildADTSParser, kAudioADTSCodecs},
-    {"audio/mpeg", &BuildMP3Parser, kAudioMP3Codecs},
-    {"video/mp4", &BuildMP4Parser, kVideoMP4Codecs},
-    {"audio/mp4", &BuildMP4Parser, kAudioMP4Codecs},
-};
-
-// Verify that |codec_info| is supported on this platform.
-//
-// Returns true if |codec_info| is a valid audio/video codec and is allowed.
-// |audio_codecs| has |codec_info|.tag added to its list if |codec_info| is an
-// audio codec. |audio_codecs| may be NULL, in which case it is not updated.
-// |video_codecs| has |codec_info|.tag added to its list if |codec_info| is a
-// video codec. |video_codecs| may be NULL, in which case it is not updated.
-//
-// Returns false otherwise, and |audio_codecs| and |video_codecs| not touched.
-static bool VerifyCodec(const CodecInfo* codec_info,
-                        std::vector<CodecInfo::HistogramTag>* audio_codecs,
-                        std::vector<CodecInfo::HistogramTag>* video_codecs) {
-  switch (codec_info->type) {
-    case CodecInfo::AUDIO:
-      if (audio_codecs) audio_codecs->push_back(codec_info->tag);
-      return true;
-    case CodecInfo::VIDEO:
-#if defined(OS_ANDROID)
-      // TODO(wolenetz, dalecurtis): This should instead use MimeUtil() to avoid
-      // duplication of subtle Android behavior.  http://crbug.com/587303.
-      if (codec_info->tag == CodecInfo::HISTOGRAM_H264 &&
-          !media::HasPlatformDecoderSupport()) {
-        return false;
-      }
-#endif
-      if (video_codecs) video_codecs->push_back(codec_info->tag);
-      return true;
-    case CodecInfo::UNKNOWN:
-      break;
-  }
-  // Not audio or video, so skip it.
-  DVLOG(1) << "CodecInfo type of " << codec_info->type
-           << " should not be specified in a SupportedTypes list";
-  return false;
-}
-
-// Checks to see if the specified |type| and |codecs| list are supported.
-//
-// Returns true if |type| and all codecs listed in |codecs| are supported.
-// |factory_function| contains a function that can build a StreamParser for this
-// type. Value may be NULL, in which case it is not touched.
-// |audio_codecs| is updated with the appropriate HistogramTags for matching
-// audio codecs specified in |codecs|. Value may be NULL, in which case it is
-// not touched.
-// |video_codecs| is updated with the appropriate HistogramTags for matching
-// video codecs specified in |codecs|. Value may be NULL, in which case it is
-// not touched.
-//
-// Returns false otherwise. The values of |factory_function|, |audio_codecs|,
-// and |video_codecs| are undefined.
-static bool CheckTypeAndCodecs(
-    const std::string& type, const std::vector<std::string>& codecs,
-    const scoped_refptr<MediaLog>& media_log,
-    ParserFactoryFunction* factory_function,
-    std::vector<CodecInfo::HistogramTag>* audio_codecs,
-    std::vector<CodecInfo::HistogramTag>* video_codecs) {
-  // Search for the SupportedTypeInfo for |type|.
-  for (size_t i = 0; i < arraysize(kSupportedTypeInfo); ++i) {
-    const SupportedTypeInfo& type_info = kSupportedTypeInfo[i];
-    if (type == type_info.type) {
-      if (codecs.empty()) {
-        const CodecInfo* codec_info = type_info.codecs[0];
-        if (codec_info && !codec_info->pattern &&
-            VerifyCodec(codec_info, audio_codecs, video_codecs)) {
-          if (factory_function) *factory_function = type_info.factory_function;
-          return true;
-        }
-
-        MEDIA_LOG(DEBUG, media_log)
-            << "A codecs parameter must be provided for '" << type << "'";
-        return false;
-      }
-
-      // Make sure all the codecs specified in |codecs| are
-      // in the supported type info.
-      for (size_t j = 0; j < codecs.size(); ++j) {
-        // Search the type info for a match.
-        bool found_codec = false;
-        std::string codec_id = codecs[j];
-        for (int k = 0; type_info.codecs[k]; ++k) {
-          if (base::MatchPattern(codec_id, type_info.codecs[k]->pattern) &&
-              (!type_info.codecs[k]->validator ||
-               type_info.codecs[k]->validator(codec_id, media_log))) {
-            found_codec =
-                VerifyCodec(type_info.codecs[k], audio_codecs, video_codecs);
-            break;  // Since only 1 pattern will match, no need to check others.
-          }
-        }
-
-        if (!found_codec) {
-          MEDIA_LOG(DEBUG, media_log)
-              << "Codec '" << codec_id << "' is not supported for '" << type
-              << "'";
-          return false;
-        }
-      }
-
-      if (factory_function) *factory_function = type_info.factory_function;
-
-      // All codecs were supported by this |type|.
-      return true;
-    }
-  }
-
-  // |type| didn't match any of the supported types.
-  return false;
-}
-
-bool StreamParserFactory::IsTypeSupported(
-    const std::string& type, const std::vector<std::string>& codecs) {
-  return CheckTypeAndCodecs(type, codecs, new MediaLog(), NULL, NULL, NULL);
-}
-
-std::unique_ptr<StreamParser> StreamParserFactory::Create(
-    DecoderBuffer::Allocator* buffer_allocator, const std::string& type,
-    const std::vector<std::string>& codecs,
-    const scoped_refptr<MediaLog>& media_log) {
-  DCHECK(buffer_allocator);
-
-  std::unique_ptr<StreamParser> stream_parser;
-  ParserFactoryFunction factory_function;
-  std::vector<CodecInfo::HistogramTag> audio_codecs;
-  std::vector<CodecInfo::HistogramTag> video_codecs;
-
-  if (CheckTypeAndCodecs(type, codecs, media_log, &factory_function,
-                         &audio_codecs, &video_codecs)) {
-    // Log the number of codecs specified, as well as the details on each one.
-    UMA_HISTOGRAM_COUNTS_100("Media.MSE.NumberOfTracks", codecs.size());
-    for (size_t i = 0; i < audio_codecs.size(); ++i) {
-      UMA_HISTOGRAM_ENUMERATION("Media.MSE.AudioCodec", audio_codecs[i],
-                                CodecInfo::HISTOGRAM_MAX + 1);
-    }
-    for (size_t i = 0; i < video_codecs.size(); ++i) {
-      UMA_HISTOGRAM_ENUMERATION("Media.MSE.VideoCodec", video_codecs[i],
-                                CodecInfo::HISTOGRAM_MAX + 1);
-    }
-
-    stream_parser.reset(factory_function(buffer_allocator, codecs, media_log));
-  }
-
-  return std::move(stream_parser);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/stream_parser_factory.h b/cobalt/media/filters/stream_parser_factory.h
deleted file mode 100644
index a89489f..0000000
--- a/cobalt/media/filters/stream_parser_factory.h
+++ /dev/null
@@ -1,43 +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 COBALT_MEDIA_FILTERS_STREAM_PARSER_FACTORY_H_
-#define COBALT_MEDIA_FILTERS_STREAM_PARSER_FACTORY_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-
-namespace cobalt {
-namespace media {
-
-class StreamParser;
-
-class MEDIA_EXPORT StreamParserFactory {
- public:
-  // Checks to see if the specified |type| and |codecs| list are supported.
-  // Returns true if |type| and all codecs listed in |codecs| are supported.
-  static bool IsTypeSupported(const std::string& type,
-                              const std::vector<std::string>& codecs);
-
-  // Creates a new StreamParser object if the specified |type| and |codecs| list
-  // are supported. |media_log| can be used to report errors if there is
-  // something wrong with |type| or the codec IDs in |codecs|.
-  // Returns a new StreamParser object if |type| and all codecs listed in
-  //   |codecs| are supported.
-  // Returns NULL otherwise.
-  static std::unique_ptr<StreamParser> Create(
-      DecoderBuffer::Allocator* buffer_allocator, const std::string& type,
-      const std::vector<std::string>& codecs,
-      const scoped_refptr<MediaLog>& media_log);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_STREAM_PARSER_FACTORY_H_
diff --git a/cobalt/media/filters/video_cadence_estimator.cc b/cobalt/media/filters/video_cadence_estimator.cc
deleted file mode 100644
index 0e3745f..0000000
--- a/cobalt/media/filters/video_cadence_estimator.cc
+++ /dev/null
@@ -1,258 +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 "cobalt/media/filters/video_cadence_estimator.h"
-
-#include <algorithm>
-#include <cmath>
-#include <iterator>
-#include <limits>
-#include <string>
-
-#include "base/metrics/histogram.h"
-
-namespace cobalt {
-namespace media {
-
-// To prevent oscillation in and out of cadence or between cadence values, we
-// require some time to elapse before a cadence switch is accepted.
-const int kMinimumCadenceDurationMs = 100;
-
-// The numbers are used to decide whether the current video is variable FPS or
-// constant FPS. If ratio of the sample deviation and the render length is
-// above |kVariableFPSFactor|, then it is recognized as a variable FPS, and if
-// the ratio is below |kConstantFPSFactor|, then it is recognized as a constant
-// FPS, and if the ratio is in between the two factors, then we do not change
-// previous recognition.
-const double kVariableFPSFactor = 0.55;
-const double kConstantFPSFactor = 0.45;
-
-// Records the number of cadence changes to UMA.
-static void HistogramCadenceChangeCount(int cadence_changes) {
-  const int kCadenceChangeMax = 10;
-  UMA_HISTOGRAM_CUSTOM_COUNTS("Media.VideoRenderer.CadenceChanges",
-                              cadence_changes, 1, kCadenceChangeMax,
-                              kCadenceChangeMax);
-}
-
-// Construct a Cadence vector, a vector of integers satisfying the following
-// conditions:
-// 1. Size is |n|.
-// 2. Sum of entries is |k|.
-// 3. Each entry is in {|k|/|n|, |k|/|n| + 1}.
-// 4. Distribution of |k|/|n| and |k|/|n| + 1 is as even as possible.
-VideoCadenceEstimator::Cadence ConstructCadence(int k, int n) {
-  const int quotient = k / n;
-  std::vector<int> output(n, 0);
-
-  // Fill the vector entries with |quotient| or |quotient + 1|, and make sure
-  // the two values are distributed as evenly as possible.
-  int target_accumulate = 0;
-  int actual_accumulate = 0;
-  for (int i = 0; i < n; ++i) {
-    // After each loop
-    // target_accumulate = (i + 1) * k
-    // actual_accumulate = \sum_{j = 0}^i {n * V[j]} where V is output vector
-    // We want to make actual_accumulate as close to target_accumulate as
-    // possible.
-    // One exception is that in case k < n, we always want the vector to start
-    // with 1 to make sure the first frame is always rendered.
-    // (To avoid float calculation, we use scaled version of accumulated count)
-    target_accumulate += k;
-    const int target_current = target_accumulate - actual_accumulate;
-    if ((i == 0 && k < n) || target_current * 2 >= n * (quotient * 2 + 1)) {
-      output[i] = quotient + 1;
-    } else {
-      output[i] = quotient;
-    }
-    actual_accumulate += output[i] * n;
-  }
-
-  return output;
-}
-
-VideoCadenceEstimator::VideoCadenceEstimator(
-    base::TimeDelta minimum_time_until_max_drift)
-    : cadence_hysteresis_threshold_(
-          base::TimeDelta::FromMilliseconds(kMinimumCadenceDurationMs)),
-      minimum_time_until_max_drift_(minimum_time_until_max_drift),
-      is_variable_frame_rate_(false) {
-  Reset();
-}
-
-VideoCadenceEstimator::~VideoCadenceEstimator() {}
-
-void VideoCadenceEstimator::Reset() {
-  cadence_.clear();
-  pending_cadence_.clear();
-  cadence_changes_ = render_intervals_cadence_held_ = 0;
-  first_update_call_ = true;
-}
-
-bool VideoCadenceEstimator::UpdateCadenceEstimate(
-    base::TimeDelta render_interval, base::TimeDelta frame_duration,
-    base::TimeDelta frame_duration_deviation,
-    base::TimeDelta max_acceptable_drift) {
-  DCHECK_GT(render_interval, base::TimeDelta());
-  DCHECK_GT(frame_duration, base::TimeDelta());
-
-  if (frame_duration_deviation > kVariableFPSFactor * render_interval) {
-    is_variable_frame_rate_ = true;
-  } else if (frame_duration_deviation < kConstantFPSFactor * render_interval) {
-    is_variable_frame_rate_ = false;
-  }
-
-  // Variable FPS detected, turn off Cadence by force.
-  if (is_variable_frame_rate_) {
-    render_intervals_cadence_held_ = 0;
-    if (!cadence_.empty()) {
-      cadence_.clear();
-      return true;
-    }
-    return false;
-  }
-
-  base::TimeDelta time_until_max_drift;
-
-  // See if we can find a cadence which fits the data.
-  Cadence new_cadence =
-      CalculateCadence(render_interval, frame_duration, max_acceptable_drift,
-                       &time_until_max_drift);
-
-  // If this is the first time UpdateCadenceEstimate() has been called,
-  // initialize the histogram with a zero count for cadence changes; this
-  // allows us to track the number of playbacks which have cadence at all.
-  if (first_update_call_) {
-    DCHECK_EQ(cadence_changes_, 0);
-    first_update_call_ = false;
-    HistogramCadenceChangeCount(0);
-  }
-
-  // If nothing changed, do nothing.
-  if (new_cadence == cadence_) {
-    // Clear cadence hold to pending values from accumulating incorrectly.
-    render_intervals_cadence_held_ = 0;
-    return false;
-  }
-
-  // Wait until enough render intervals have elapsed before accepting the
-  // cadence change.  Prevents oscillation of the cadence selection.
-  bool update_pending_cadence = true;
-  if (new_cadence == pending_cadence_ ||
-      cadence_hysteresis_threshold_ <= render_interval) {
-    if (++render_intervals_cadence_held_ * render_interval >=
-        cadence_hysteresis_threshold_) {
-      DVLOG(1) << "Cadence switch: " << CadenceToString(cadence_) << " -> "
-               << CadenceToString(new_cadence)
-               << " :: Time until drift exceeded: " << time_until_max_drift;
-      cadence_.swap(new_cadence);
-
-      // Note: Because this class is transitively owned by a garbage collected
-      // object, WebMediaPlayer, we log cadence changes as they are encountered.
-      HistogramCadenceChangeCount(++cadence_changes_);
-      return true;
-    }
-
-    update_pending_cadence = false;
-  }
-
-  DVLOG(2) << "Hysteresis prevented cadence switch: "
-           << CadenceToString(cadence_) << " -> "
-           << CadenceToString(new_cadence);
-
-  if (update_pending_cadence) {
-    pending_cadence_.swap(new_cadence);
-    render_intervals_cadence_held_ = 1;
-  }
-
-  return false;
-}
-
-int VideoCadenceEstimator::GetCadenceForFrame(uint64_t frame_number) const {
-  DCHECK(has_cadence());
-  return cadence_[frame_number % cadence_.size()];
-}
-
-VideoCadenceEstimator::Cadence VideoCadenceEstimator::CalculateCadence(
-    base::TimeDelta render_interval, base::TimeDelta frame_duration,
-    base::TimeDelta max_acceptable_drift,
-    base::TimeDelta* time_until_max_drift) const {
-  // The perfect cadence is the number of render intervals per frame.
-  const double perfect_cadence =
-      frame_duration.InSecondsF() / render_interval.InSecondsF();
-
-  // This case is very simple, just return a single frame cadence, because it
-  // is impossible for us to accumulate drift as large as max_acceptable_drift
-  // within minimum_time_until_max_drift.
-  if (max_acceptable_drift >= minimum_time_until_max_drift_) {
-    int cadence_value = round(perfect_cadence);
-    if (cadence_value == 0) cadence_value = 1;
-    Cadence result = ConstructCadence(cadence_value, 1);
-    const double error = std::fabs(1.0 - perfect_cadence / cadence_value);
-    *time_until_max_drift = max_acceptable_drift / error;
-    return result;
-  }
-
-  // We want to construct a cadence pattern to approximate the perfect cadence
-  // while ensuring error doesn't accumulate too quickly.
-  const double drift_ratio = max_acceptable_drift.InSecondsF() /
-                             minimum_time_until_max_drift_.InSecondsF();
-  const double minimum_acceptable_cadence =
-      perfect_cadence / (1.0 + drift_ratio);
-  const double maximum_acceptable_cadence =
-      perfect_cadence / (1.0 - drift_ratio);
-
-  // We've arbitrarily chosen the maximum allowable cadence length as 5. It's
-  // proven sufficient to support most standard frame and render rates, while
-  // being small enough that small frame and render timing errors don't render
-  // it useless.
-  const int kMaxCadenceSize = 5;
-
-  double best_error = 0;
-  int best_n = 0;
-  int best_k = 0;
-  for (int n = 1; n <= kMaxCadenceSize; ++n) {
-    // A cadence pattern only exists if there exists an integer K such that K/N
-    // is between |minimum_acceptable_cadence| and |maximum_acceptable_cadence|.
-    // The best pattern is the one with the smallest error over time relative to
-    // the |perfect_cadence|.
-    if (std::floor(minimum_acceptable_cadence * n) <
-        std::floor(maximum_acceptable_cadence * n)) {
-      const int k = round(perfect_cadence * n);
-
-      const double error = std::fabs(1.0 - perfect_cadence * n / k);
-
-      // Prefer the shorter cadence pattern unless a longer one "significantly"
-      // reduces the error.
-      if (!best_n || error < best_error * 0.99) {
-        best_error = error;
-        best_k = k;
-        best_n = n;
-      }
-    }
-  }
-
-  if (!best_n) return Cadence();
-
-  // If we've found a solution.
-  Cadence best_result = ConstructCadence(best_k, best_n);
-  *time_until_max_drift = max_acceptable_drift / best_error;
-
-  return best_result;
-}
-
-std::string VideoCadenceEstimator::CadenceToString(
-    const Cadence& cadence) const {
-  if (cadence.empty()) return std::string("[]");
-
-  std::ostringstream os;
-  os << "[";
-  std::copy(cadence.begin(), cadence.end() - 1,
-            std::ostream_iterator<int>(os, ":"));
-  os << cadence.back() << "]";
-  return os.str();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/video_cadence_estimator.h b/cobalt/media/filters/video_cadence_estimator.h
deleted file mode 100644
index 01165f3..0000000
--- a/cobalt/media/filters/video_cadence_estimator.h
+++ /dev/null
@@ -1,169 +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 COBALT_MEDIA_FILTERS_VIDEO_CADENCE_ESTIMATOR_H_
-#define COBALT_MEDIA_FILTERS_VIDEO_CADENCE_ESTIMATOR_H_
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Estimates whether a given frame duration and render interval length have a
-// render cadence which would allow for optimal uniformity of displayed frame
-// durations over time.
-//
-// Cadence is the ideal repeating frame pattern for a group of frames; currently
-// VideoCadenceEstimator supports N-frame ([a1:a2:..:aN]) cadences where N <= 5.
-// Details on what this means are below.
-//
-// The perfect cadence of a set of frames is the ratio of the frame duration to
-// render interval length.  I.e. for 30fps in 60Hz the cadence would be (1/30) /
-// (1/60) = 60 / 30 = 2.  It's common that this is not an exact integer, e.g.,
-// 29.974fps in 60Hz which would have a cadence of (1/29.974) / (1/60) =
-// ~2.0029.
-//
-// The perfect cadence is always a real number.  All N-cadences [a1:a2:..:aN]
-// where aK is an integer are an approximation of the perfect cadence; i.e. the
-// average of [a1:..:aN] will approximately equal the perfect cadence.  When N=1
-// we have a 1-frame cadence, when N=2, we have a 2-frame cadence, etc.
-//
-// For single frame cadence we just round the perfect cadence (~2.0029 in the
-// previous example) to the nearest integer value (2 in this case; which is
-// denoted as a cadence of [2]).  If the delta between those values is small we
-// can choose to render frames for the integer number of render intervals;
-// shortening or lengthening the actual rendered frame duration.  Doing so
-// ensures each frame gets an optimal amount of display time.
-//
-// For N-frame cadence, the idea is similar, we just round the perfect cadence
-// to some K/N, where K is an integer, and distribute [floor(K/N), floor(K/N)+1]
-// into the cadence vector as evenly as possible.  For example, 23.97fps in
-// 60Hz, the perfect cadence is 2.50313, we can round it to 2.5 = 5/2, and we
-// can then construct the cadence vector as [2:3].
-//
-// The delta between the perfect cadence and the rounded cadence leads to drift
-// over time of the actual VideoFrame timestamp relative to its rendered time,
-// so we perform some calculations to ensure we only use a cadence when it will
-// take some time to drift an undesirable amount; see CalculateCadence() for
-// details on how this calculation is made.
-//
-// In practice this works out to the following for common setups if we use
-// cadence based selection:
-//
-//    29.5fps in 60Hz,    ~17ms max drift => exhausted in ~1 second.
-//    29.9fps in 60Hz,    ~17ms max drift => exhausted in ~16.4 seconds.
-//    24fps   in 59.9Hz,  ~21ms max drift => exhausted in ~12.6 seconds.
-//    24.9fps in 60Hz,    ~20ms max drift => exhausted in ~4.0 seconds.
-//    59.9fps in 60Hz,    ~8.3ms max drift => exhausted in ~8.2 seconds.
-//    24.9fps in 50Hz,    ~20ms max drift => exhausted in ~20.5 seconds.
-//    120fps  in 59.9Hz,  ~8.3ms max drift => exhausted in ~8.2 seconds.
-//
-class MEDIA_EXPORT VideoCadenceEstimator {
- public:
-  using Cadence = std::vector<int>;
-
-  // As mentioned in the introduction, the determination of whether to clamp to
-  // a given cadence is based on how long it takes before a frame would have to
-  // be dropped or repeated to compensate for reaching the maximum acceptable
-  // drift; this time length is controlled by |minimum_time_until_max_drift|.
-  explicit VideoCadenceEstimator(base::TimeDelta minimum_time_until_max_drift);
-  ~VideoCadenceEstimator();
-
-  // Clears stored cadence information.
-  void Reset();
-
-  // Updates the estimates for |cadence_| based on the given values as described
-  // in the introduction above.
-  //
-  // Clients should call this and then update the cadence for all frames via the
-  // GetCadenceForFrame() method if the cadence changes.
-  //
-  // Cadence changes will not take affect until enough render intervals have
-  // elapsed.  For the purposes of hysteresis, each UpdateCadenceEstimate() call
-  // is assumed to elapse one |render_interval| worth of time.
-  //
-  // Returns true if the cadence has changed since the last call.
-  bool UpdateCadenceEstimate(base::TimeDelta render_interval,
-                             base::TimeDelta frame_duration,
-                             base::TimeDelta frame_duration_deviation,
-                             base::TimeDelta max_acceptable_drift);
-
-  // Returns true if a useful cadence was found.
-  bool has_cadence() const { return !cadence_.empty(); }
-
-  // Given a |frame_number|, where zero is the most recently rendered frame,
-  // returns the ideal cadence for that frame.
-  //
-  // Note: Callers must track the base |frame_number| relative to all frames
-  // rendered or removed after the first frame for which cadence is detected.
-  // The first frame after cadence is detected has a |frame_number| of 0.
-  //
-  // Frames which come in before the last rendered frame should be ignored in
-  // terms of impact to the base |frame_number|.
-  int GetCadenceForFrame(uint64_t frame_number) const;
-
-  void set_cadence_hysteresis_threshold_for_testing(base::TimeDelta threshold) {
-    cadence_hysteresis_threshold_ = threshold;
-  }
-
-  size_t cadence_size_for_testing() const { return cadence_.size(); }
-  std::string GetCadenceForTesting() const { return CadenceToString(cadence_); }
-
- private:
-  // Attempts to find an N-frame cadence.  Returns the cadence vector if cadence
-  // is found and sets |time_until_max_drift| for the computed cadence. If
-  // multiple cadences satisfying the max drift constraint exist, we are going
-  // to return the one with largest |time_until_max_drift|.
-  // For details on the math and algorithm, see https://goo.gl/QK0vbz
-  Cadence CalculateCadence(base::TimeDelta render_interval,
-                           base::TimeDelta frame_duration,
-                           base::TimeDelta max_acceptable_drift,
-                           base::TimeDelta* time_until_max_drift) const;
-
-  // Converts a cadence vector into a human readable string of the form
-  // "[a: b: ...: z]".
-  std::string CadenceToString(const Cadence& cadence) const;
-
-  // The approximate best N-frame cadence for all frames seen thus far; updated
-  // by UpdateCadenceEstimate().  Empty when no cadence has been detected.
-  Cadence cadence_;
-
-  // Used as hysteresis to prevent oscillation between cadence approximations
-  // for spurious blips in the render interval or frame duration.
-  //
-  // Once a new cadence is detected, |render_intervals_cadence_held_| is
-  // incremented for each UpdateCadenceEstimate() call where |cadence_| matches
-  // |pending_cadence_|.  |render_intervals_cadence_held_| is cleared when a
-  // "new" cadence matches |cadence_| or |pending_cadence_|.
-  //
-  // Once |kMinimumCadenceDurationMs| is exceeded in render intervals, the
-  // detected cadence is set in |cadence_|.
-  Cadence pending_cadence_;
-  int render_intervals_cadence_held_;
-  base::TimeDelta cadence_hysteresis_threshold_;
-
-  // Tracks how many times cadence has switched during a given playback, used to
-  // histogram the number of cadence changes in a playback.
-  bool first_update_call_;
-  int cadence_changes_;
-
-  // The minimum amount of time allowed before a glitch occurs before confirming
-  // cadence for a given render interval and frame duration.
-  const base::TimeDelta minimum_time_until_max_drift_;
-
-  bool is_variable_frame_rate_;
-
-  DISALLOW_COPY_AND_ASSIGN(VideoCadenceEstimator);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_VIDEO_CADENCE_ESTIMATOR_H_
diff --git a/cobalt/media/filters/video_cadence_estimator_unittest.cc b/cobalt/media/filters/video_cadence_estimator_unittest.cc
deleted file mode 100644
index f28eaff..0000000
--- a/cobalt/media/filters/video_cadence_estimator_unittest.cc
+++ /dev/null
@@ -1,288 +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 "cobalt/media/filters/video_cadence_estimator.h"
-
-#include <algorithm>
-#include <memory>
-#include <string>
-
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/stringprintf.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-// See VideoCadenceEstimator header for more details.
-const int kMinimumAcceptableTimeBetweenGlitchesSecs = 8;
-
-// Slows down the given |fps| according to NTSC field reduction standards; see
-// http://en.wikipedia.org/wiki/Frame_rate#Digital_video_and_television
-static double NTSC(double fps) { return fps / 1.001; }
-
-static base::TimeDelta Interval(double hertz) {
-  return base::TimeDelta::FromSecondsD(1.0 / hertz);
-}
-
-std::vector<int> CreateCadenceFromString(const std::string& cadence) {
-  CHECK_EQ('[', cadence.front());
-  CHECK_EQ(']', cadence.back());
-
-  std::vector<int> result;
-  for (const std::string& token :
-       base::SplitString(cadence.substr(1, cadence.length() - 2), ":",
-                         base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) {
-    int cadence_value = 0;
-    CHECK(base::StringToInt(token, &cadence_value)) << token;
-    result.push_back(cadence_value);
-  }
-
-  return result;
-}
-
-static void VerifyCadenceVectorWithCustomDeviationAndDrift(
-    VideoCadenceEstimator* estimator, double frame_hertz, double render_hertz,
-    base::TimeDelta deviation, base::TimeDelta acceptable_drift,
-    const std::string& expected_cadence) {
-  SCOPED_TRACE(base::StringPrintf("Checking %.03f fps into %0.03f", frame_hertz,
-                                  render_hertz));
-
-  const std::vector<int> expected_cadence_vector =
-      CreateCadenceFromString(expected_cadence);
-
-  estimator->Reset();
-  const bool cadence_changed = estimator->UpdateCadenceEstimate(
-      Interval(render_hertz), Interval(frame_hertz), deviation,
-      acceptable_drift);
-  EXPECT_EQ(cadence_changed, estimator->has_cadence());
-  EXPECT_EQ(expected_cadence_vector.empty(), !estimator->has_cadence());
-
-  // Nothing further to test.
-  if (expected_cadence_vector.empty() || !estimator->has_cadence()) return;
-
-  EXPECT_EQ(expected_cadence_vector.size(),
-            estimator->cadence_size_for_testing());
-
-  // Spot two cycles of the cadence.
-  for (size_t i = 0; i < expected_cadence_vector.size() * 2; ++i) {
-    ASSERT_EQ(expected_cadence_vector[i % expected_cadence_vector.size()],
-              estimator->GetCadenceForFrame(i));
-  }
-}
-
-static void VerifyCadenceVectorWithCustomDrift(
-    VideoCadenceEstimator* estimator, double frame_hertz, double render_hertz,
-    base::TimeDelta acceptable_drift, const std::string& expected_cadence) {
-  VerifyCadenceVectorWithCustomDeviationAndDrift(
-      estimator, frame_hertz, render_hertz, base::TimeDelta(), acceptable_drift,
-      expected_cadence);
-}
-
-static void VerifyCadenceVectorWithCustomDeviation(
-    VideoCadenceEstimator* estimator, double frame_hertz, double render_hertz,
-    base::TimeDelta deviation, const std::string& expected_cadence) {
-  const base::TimeDelta acceptable_drift =
-      std::max(Interval(frame_hertz) / 2, Interval(render_hertz));
-  VerifyCadenceVectorWithCustomDeviationAndDrift(
-      estimator, frame_hertz, render_hertz, deviation, acceptable_drift,
-      expected_cadence);
-}
-
-static void VerifyCadenceVector(VideoCadenceEstimator* estimator,
-                                double frame_hertz, double render_hertz,
-                                const std::string& expected_cadence) {
-  const base::TimeDelta acceptable_drift =
-      std::max(Interval(frame_hertz) / 2, Interval(render_hertz));
-  VerifyCadenceVectorWithCustomDeviationAndDrift(
-      estimator, frame_hertz, render_hertz, base::TimeDelta(), acceptable_drift,
-      expected_cadence);
-}
-
-// Spot check common display and frame rate pairs for correctness.
-TEST(VideoCadenceEstimatorTest, CadenceCalculations) {
-  VideoCadenceEstimator estimator(
-      base::TimeDelta::FromSeconds(kMinimumAcceptableTimeBetweenGlitchesSecs));
-  estimator.set_cadence_hysteresis_threshold_for_testing(base::TimeDelta());
-
-  const std::string kEmptyCadence = "[]";
-  VerifyCadenceVector(&estimator, 1, NTSC(60), "[60]");
-
-  VerifyCadenceVector(&estimator, 24, 60, "[3:2]");
-  VerifyCadenceVector(&estimator, NTSC(24), 60, "[3:2]");
-  VerifyCadenceVector(&estimator, 24, NTSC(60), "[3:2]");
-
-  VerifyCadenceVector(&estimator, 25, 60, "[2:3:2:3:2]");
-  VerifyCadenceVector(&estimator, NTSC(25), 60, "[2:3:2:3:2]");
-  VerifyCadenceVector(&estimator, 25, NTSC(60), "[2:3:2:3:2]");
-
-  VerifyCadenceVector(&estimator, 30, 60, "[2]");
-  VerifyCadenceVector(&estimator, NTSC(30), 60, "[2]");
-  VerifyCadenceVector(&estimator, 29.5, 60, kEmptyCadence);
-
-  VerifyCadenceVector(&estimator, 50, 60, "[1:1:2:1:1]");
-  VerifyCadenceVector(&estimator, NTSC(50), 60, "[1:1:2:1:1]");
-  VerifyCadenceVector(&estimator, 50, NTSC(60), "[1:1:2:1:1]");
-
-  VerifyCadenceVector(&estimator, NTSC(60), 60, "[1]");
-  VerifyCadenceVector(&estimator, 60, NTSC(60), "[1]");
-
-  VerifyCadenceVector(&estimator, 120, 60, "[1:0]");
-  VerifyCadenceVector(&estimator, NTSC(120), 60, "[1:0]");
-  VerifyCadenceVector(&estimator, 120, NTSC(60), "[1:0]");
-
-  // Test cases for cadence below 1.
-  VerifyCadenceVector(&estimator, 120, 24, "[1:0:0:0:0]");
-  VerifyCadenceVector(&estimator, 120, 48, "[1:0:0:1:0]");
-  VerifyCadenceVector(&estimator, 120, 72, "[1:0:1:0:1]");
-  VerifyCadenceVector(&estimator, 90, 60, "[1:0:1]");
-
-  // 50Hz is common in the EU.
-  VerifyCadenceVector(&estimator, NTSC(24), 50, kEmptyCadence);
-  VerifyCadenceVector(&estimator, 24, 50, kEmptyCadence);
-
-  VerifyCadenceVector(&estimator, NTSC(25), 50, "[2]");
-  VerifyCadenceVector(&estimator, 25, 50, "[2]");
-
-  VerifyCadenceVector(&estimator, NTSC(30), 50, "[2:1:2]");
-  VerifyCadenceVector(&estimator, 30, 50, "[2:1:2]");
-
-  VerifyCadenceVector(&estimator, NTSC(60), 50, kEmptyCadence);
-  VerifyCadenceVector(&estimator, 60, 50, kEmptyCadence);
-}
-
-// Check the extreme case that max_acceptable_drift is larger than
-// minimum_time_until_max_drift.
-TEST(VideoCadenceEstimatorTest, CadenceCalculationWithLargeDrift) {
-  VideoCadenceEstimator estimator(
-      base::TimeDelta::FromSeconds(kMinimumAcceptableTimeBetweenGlitchesSecs));
-  estimator.set_cadence_hysteresis_threshold_for_testing(base::TimeDelta());
-
-  base::TimeDelta drift = base::TimeDelta::FromHours(1);
-  VerifyCadenceVectorWithCustomDrift(&estimator, 1, NTSC(60), drift, "[60]");
-
-  VerifyCadenceVectorWithCustomDrift(&estimator, 30, 60, drift, "[2]");
-  VerifyCadenceVectorWithCustomDrift(&estimator, NTSC(30), 60, drift, "[2]");
-  VerifyCadenceVectorWithCustomDrift(&estimator, 30, NTSC(60), drift, "[2]");
-
-  VerifyCadenceVectorWithCustomDrift(&estimator, 25, 60, drift, "[2]");
-  VerifyCadenceVectorWithCustomDrift(&estimator, NTSC(25), 60, drift, "[2]");
-  VerifyCadenceVectorWithCustomDrift(&estimator, 25, NTSC(60), drift, "[2]");
-
-  // Test cases for cadence below 1.
-  VerifyCadenceVectorWithCustomDrift(&estimator, 120, 24, drift, "[1]");
-  VerifyCadenceVectorWithCustomDrift(&estimator, 120, 48, drift, "[1]");
-  VerifyCadenceVectorWithCustomDrift(&estimator, 120, 72, drift, "[1]");
-  VerifyCadenceVectorWithCustomDrift(&estimator, 90, 60, drift, "[1]");
-}
-
-// Check the case that the estimator excludes variable FPS case from Cadence.
-TEST(VideoCadenceEstimatorTest, CadenceCalculationWithLargeDeviation) {
-  VideoCadenceEstimator estimator(
-      base::TimeDelta::FromSeconds(kMinimumAcceptableTimeBetweenGlitchesSecs));
-  estimator.set_cadence_hysteresis_threshold_for_testing(base::TimeDelta());
-
-  const base::TimeDelta deviation = base::TimeDelta::FromMilliseconds(30);
-  VerifyCadenceVectorWithCustomDeviation(&estimator, 1, 60, deviation, "[]");
-  VerifyCadenceVectorWithCustomDeviation(&estimator, 30, 60, deviation, "[]");
-  VerifyCadenceVectorWithCustomDeviation(&estimator, 25, 60, deviation, "[]");
-
-  // Test cases for cadence with low refresh rate.
-  VerifyCadenceVectorWithCustomDeviation(&estimator, 60, 12, deviation,
-                                         "[1:0:0:0:0]");
-}
-
-TEST(VideoCadenceEstimatorTest, CadenceVariesWithAcceptableDrift) {
-  VideoCadenceEstimator estimator(
-      base::TimeDelta::FromSeconds(kMinimumAcceptableTimeBetweenGlitchesSecs));
-  estimator.set_cadence_hysteresis_threshold_for_testing(base::TimeDelta());
-
-  const base::TimeDelta render_interval = Interval(NTSC(60));
-  const base::TimeDelta frame_interval = Interval(120);
-
-  base::TimeDelta acceptable_drift = frame_interval / 2;
-  EXPECT_FALSE(estimator.UpdateCadenceEstimate(
-      render_interval, frame_interval, base::TimeDelta(), acceptable_drift));
-  EXPECT_FALSE(estimator.has_cadence());
-
-  // Increasing the acceptable drift should be result in more permissive
-  // detection of cadence.
-  acceptable_drift = render_interval;
-  EXPECT_TRUE(estimator.UpdateCadenceEstimate(
-      render_interval, frame_interval, base::TimeDelta(), acceptable_drift));
-  EXPECT_TRUE(estimator.has_cadence());
-  EXPECT_EQ("[1:0]", estimator.GetCadenceForTesting());
-}
-
-TEST(VideoCadenceEstimatorTest, CadenceVariesWithAcceptableGlitchTime) {
-  std::unique_ptr<VideoCadenceEstimator> estimator(new VideoCadenceEstimator(
-      base::TimeDelta::FromSeconds(kMinimumAcceptableTimeBetweenGlitchesSecs)));
-  estimator->set_cadence_hysteresis_threshold_for_testing(base::TimeDelta());
-
-  const base::TimeDelta render_interval = Interval(NTSC(60));
-  const base::TimeDelta frame_interval = Interval(120);
-  const base::TimeDelta acceptable_drift = frame_interval / 2;
-
-  EXPECT_FALSE(estimator->UpdateCadenceEstimate(
-      render_interval, frame_interval, base::TimeDelta(), acceptable_drift));
-  EXPECT_FALSE(estimator->has_cadence());
-
-  // Decreasing the acceptable glitch time should be result in more permissive
-  // detection of cadence.
-  estimator.reset(new VideoCadenceEstimator(base::TimeDelta::FromSeconds(
-      kMinimumAcceptableTimeBetweenGlitchesSecs / 2)));
-  estimator->set_cadence_hysteresis_threshold_for_testing(base::TimeDelta());
-  EXPECT_TRUE(estimator->UpdateCadenceEstimate(
-      render_interval, frame_interval, base::TimeDelta(), acceptable_drift));
-  EXPECT_TRUE(estimator->has_cadence());
-  EXPECT_EQ("[1:0]", estimator->GetCadenceForTesting());
-}
-
-TEST(VideoCadenceEstimatorTest, CadenceHystersisPreventsOscillation) {
-  std::unique_ptr<VideoCadenceEstimator> estimator(new VideoCadenceEstimator(
-      base::TimeDelta::FromSeconds(kMinimumAcceptableTimeBetweenGlitchesSecs)));
-
-  const base::TimeDelta render_interval = Interval(30);
-  const base::TimeDelta frame_interval = Interval(60);
-  const base::TimeDelta acceptable_drift = frame_interval / 2;
-  estimator->set_cadence_hysteresis_threshold_for_testing(render_interval * 2);
-
-  // Cadence hysteresis should prevent the cadence from taking effect yet.
-  EXPECT_FALSE(estimator->UpdateCadenceEstimate(
-      render_interval, frame_interval, base::TimeDelta(), acceptable_drift));
-  EXPECT_FALSE(estimator->has_cadence());
-
-  // A second call should exceed cadence hysteresis and take into effect.
-  EXPECT_TRUE(estimator->UpdateCadenceEstimate(
-      render_interval, frame_interval, base::TimeDelta(), acceptable_drift));
-  EXPECT_TRUE(estimator->has_cadence());
-
-  // One bad interval shouldn't cause cadence to drop
-  EXPECT_FALSE(
-      estimator->UpdateCadenceEstimate(render_interval, frame_interval * 0.75,
-                                       base::TimeDelta(), acceptable_drift));
-  EXPECT_TRUE(estimator->has_cadence());
-
-  // Resumption of cadence should clear bad interval count.
-  EXPECT_FALSE(estimator->UpdateCadenceEstimate(
-      render_interval, frame_interval, base::TimeDelta(), acceptable_drift));
-  EXPECT_TRUE(estimator->has_cadence());
-
-  // So one more bad interval shouldn't cause cadence to drop
-  EXPECT_FALSE(
-      estimator->UpdateCadenceEstimate(render_interval, frame_interval * 0.75,
-                                       base::TimeDelta(), acceptable_drift));
-  EXPECT_TRUE(estimator->has_cadence());
-
-  // Two bad intervals should.
-  EXPECT_TRUE(
-      estimator->UpdateCadenceEstimate(render_interval, frame_interval * 0.75,
-                                       base::TimeDelta(), acceptable_drift));
-  EXPECT_FALSE(estimator->has_cadence());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/video_decoder_selector_unittest.cc b/cobalt/media/filters/video_decoder_selector_unittest.cc
deleted file mode 100644
index 18a1682..0000000
--- a/cobalt/media/filters/video_decoder_selector_unittest.cc
+++ /dev/null
@@ -1,382 +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 <memory>
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/gmock_callback_support.h"
-#include "cobalt/media/base/mock_filters.h"
-#include "cobalt/media/base/test_helpers.h"
-#include "cobalt/media/filters/decoder_selector.h"
-#include "cobalt/media/filters/decrypting_demuxer_stream.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::IsNull;
-using ::testing::NiceMock;
-using ::testing::NotNull;
-using ::testing::Return;
-using ::testing::StrictMock;
-
-// Use anonymous namespace here to prevent the actions to be defined multiple
-// times across multiple test files. Sadly we can't use static for them.
-namespace {
-
-MATCHER(EncryptedConfig, "") { return arg.is_encrypted(); }
-MATCHER(ClearConfig, "") { return !arg.is_encrypted(); }
-
-}  // namespace
-
-namespace cobalt {
-namespace media {
-
-class VideoDecoderSelectorTest : public ::testing::Test {
- public:
-  enum DecryptorCapability {
-    kNoCdm,        // No CDM. Only possible for clear stream.
-    kNoDecryptor,  // CDM is available but Decryptor is not supported.
-    kDecryptOnly,
-    kDecryptAndDecode
-  };
-
-  VideoDecoderSelectorTest()
-      : media_log_(new MediaLog()),
-        traits_(media_log_),
-        demuxer_stream_(
-            new StrictMock<MockDemuxerStream>(DemuxerStream::VIDEO)),
-        decoder_1_(new StrictMock<MockVideoDecoder>()),
-        decoder_2_(new StrictMock<MockVideoDecoder>()) {
-    all_decoders_.push_back(decoder_1_);
-    all_decoders_.push_back(decoder_2_);
-    // |cdm_context_| and |decryptor_| are conditionally created in
-    // InitializeDecoderSelector().
-  }
-
-  ~VideoDecoderSelectorTest() { base::RunLoop().RunUntilIdle(); }
-
-  MOCK_METHOD2(OnDecoderSelected,
-               void(VideoDecoder*, DecryptingDemuxerStream*));
-
-  void MockOnDecoderSelected(std::unique_ptr<VideoDecoder> decoder,
-                             std::unique_ptr<DecryptingDemuxerStream> stream) {
-    OnDecoderSelected(decoder.get(), stream.get());
-    selected_decoder_ = std::move(decoder);
-  }
-
-  void UseClearStream() {
-    demuxer_stream_->set_video_decoder_config(TestVideoConfig::Normal());
-  }
-
-  void UseEncryptedStream() {
-    demuxer_stream_->set_video_decoder_config(
-        TestVideoConfig::NormalEncrypted());
-  }
-
-  void InitializeDecoderSelector(DecryptorCapability decryptor_capability,
-                                 int num_decoders) {
-    if (decryptor_capability != kNoCdm) {
-      cdm_context_.reset(new StrictMock<MockCdmContext>());
-
-      if (decryptor_capability == kNoDecryptor) {
-        EXPECT_CALL(*cdm_context_, GetDecryptor()).WillRepeatedly(Return(NULL));
-      } else {
-        decryptor_.reset(new NiceMock<MockDecryptor>());
-        EXPECT_CALL(*cdm_context_, GetDecryptor())
-            .WillRepeatedly(Return(decryptor_.get()));
-        EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-            .WillRepeatedly(
-                RunCallback<1>(decryptor_capability == kDecryptAndDecode));
-      }
-    }
-
-    DCHECK_GE(all_decoders_.size(), static_cast<size_t>(num_decoders));
-    all_decoders_.erase(all_decoders_.begin() + num_decoders,
-                        all_decoders_.end());
-
-    decoder_selector_.reset(new VideoDecoderSelector(
-        message_loop_.task_runner(), std::move(all_decoders_), media_log_));
-  }
-
-  void SelectDecoder() {
-    decoder_selector_->SelectDecoder(
-        &traits_, demuxer_stream_.get(), cdm_context_.get(),
-        base::Bind(&VideoDecoderSelectorTest::MockOnDecoderSelected,
-                   base::Unretained(this)),
-        base::Bind(&VideoDecoderSelectorTest::FrameReady,
-                   base::Unretained(this)),
-        base::Bind(&VideoDecoderSelectorTest::OnWaitingForDecryptionKey,
-                   base::Unretained(this)));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void SelectDecoderAndDestroy() {
-    SelectDecoder();
-
-    EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
-    decoder_selector_.reset();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void FrameReady(const scoped_refptr<VideoFrame>& frame) { NOTREACHED(); }
-
-  void OnWaitingForDecryptionKey() { NOTREACHED(); }
-
-  scoped_refptr<MediaLog> media_log_;
-
-  // Stream traits specific to video decoding.
-  DecoderStreamTraits<DemuxerStream::VIDEO> traits_;
-
-  // Declare |decoder_selector_| after |demuxer_stream_| and |decryptor_| since
-  // |demuxer_stream_| and |decryptor_| should outlive |decoder_selector_|.
-  std::unique_ptr<StrictMock<MockDemuxerStream>> demuxer_stream_;
-
-  std::unique_ptr<StrictMock<MockCdmContext>> cdm_context_;
-
-  // Use NiceMock since we don't care about most of calls on the decryptor, e.g.
-  // RegisterNewKeyCB().
-  std::unique_ptr<NiceMock<MockDecryptor>> decryptor_;
-
-  std::unique_ptr<VideoDecoderSelector> decoder_selector_;
-
-  StrictMock<MockVideoDecoder>* decoder_1_;
-  StrictMock<MockVideoDecoder>* decoder_2_;
-  std::vector<std::unique_ptr<VideoDecoder>> all_decoders_;
-  std::unique_ptr<VideoDecoder> selected_decoder_;
-
-  base::MessageLoop message_loop_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(VideoDecoderSelectorTest);
-};
-
-// TODO(xhwang): Add kNoCdm tests for clear stream.
-
-// The stream is not encrypted but we have no clear decoder. No decoder can be
-// selected.
-TEST_F(VideoDecoderSelectorTest, ClearStream_NoDecryptor_NoClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 0);
-
-  EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
-
-  SelectDecoder();
-}
-
-// The stream is not encrypted and we have one clear decoder. The decoder
-// will be selected.
-TEST_F(VideoDecoderSelectorTest, ClearStream_NoDecryptor_OneClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(VideoDecoderSelectorTest,
-       Destroy_ClearStream_NoDecryptor_OneClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// The stream is not encrypted and we have multiple clear decoders. The first
-// decoder that can decode the input stream will be selected.
-TEST_F(VideoDecoderSelectorTest, ClearStream_NoDecryptor_MultipleClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(VideoDecoderSelectorTest,
-       Destroy_ClearStream_NoDecryptor_MultipleClearDecoder) {
-  UseClearStream();
-  InitializeDecoderSelector(kNoDecryptor, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// There is a decryptor but the stream is not encrypted. The decoder will be
-// selected.
-TEST_F(VideoDecoderSelectorTest, ClearStream_HasDecryptor) {
-  UseClearStream();
-  InitializeDecoderSelector(kDecryptOnly, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(VideoDecoderSelectorTest, Destroy_ClearStream_HasDecryptor) {
-  UseClearStream();
-  InitializeDecoderSelector(kDecryptOnly, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// The stream is encrypted and there's no decryptor. The decoder only supports
-// clear streams so no decoder can be selected.
-TEST_F(VideoDecoderSelectorTest, EncryptedStream_NoDecryptor_OneClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kNoDecryptor, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(false));
-  EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(VideoDecoderSelectorTest,
-       Destroy_EncryptedStream_NoDecryptor_OneClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kNoDecryptor, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// The stream is encrypted and there's no decryptor. There are multiple decoders
-// and the first one that supports encrypted streams is selected.
-TEST_F(VideoDecoderSelectorTest, EncryptedStream_NoDecryptor_MultipleDecoders) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kNoDecryptor, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(VideoDecoderSelectorTest,
-       Destroy_EncryptedStream_NoDecryptor_MultipleDecoders) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kNoDecryptor, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// Decryptor can only do decryption and there's no decoder available. No decoder
-// can be selected.
-TEST_F(VideoDecoderSelectorTest, EncryptedStream_DecryptOnly_NoDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 0);
-
-  EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
-
-  SelectDecoder();
-}
-
-// Decryptor can do decryption-only and there's a decoder available. The decoder
-// will be selected and a DecryptingDemuxerStream will be created.
-TEST_F(VideoDecoderSelectorTest, EncryptedStream_DecryptOnly_OneClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 1);
-
-  // Since we use DecryptingDemuxerStream, the decoder will be initialized with
-  // a clear config.
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, NotNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(VideoDecoderSelectorTest,
-       Destroy_EncryptedStream_DecryptOnly_OneClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 1);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// Decryptor can only do decryption and there are multiple decoders available.
-// The first decoder that can decode the input stream will be selected and
-// a DecryptingDemuxerStream will be created.
-TEST_F(VideoDecoderSelectorTest,
-       EncryptedStream_DecryptOnly_MultipleClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, NotNull()));
-
-  SelectDecoder();
-}
-
-TEST_F(VideoDecoderSelectorTest,
-       Destroy_EncryptedStream_DecryptOnly_MultipleClearDecoder) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptOnly, 2);
-
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(false));
-  EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _, _));
-
-  SelectDecoderAndDestroy();
-}
-
-// Decryptor can do decryption and decoding.
-TEST_F(VideoDecoderSelectorTest, EncryptedStream_DecryptAndDecode) {
-  UseEncryptedStream();
-  InitializeDecoderSelector(kDecryptAndDecode, 1);
-
-#if !defined(OS_ANDROID)
-  // A DecryptingVideoDecoder will be created and selected. The clear decoder
-  // should not be touched at all. No DecryptingDemuxerStream should be
-  // created.
-  EXPECT_CALL(*this, OnDecoderSelected(NotNull(), IsNull()));
-#else
-  // A DecryptingDemuxerStream will be created. The clear decoder will be
-  // initialized and returned.
-  EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
-      .WillOnce(RunCallback<3>(true));
-  EXPECT_CALL(*this, OnDecoderSelected(NotNull(), NotNull()));
-#endif
-
-  SelectDecoder();
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp8_bool_decoder.cc b/cobalt/media/filters/vp8_bool_decoder.cc
deleted file mode 100644
index fd7029c..0000000
--- a/cobalt/media/filters/vp8_bool_decoder.cc
+++ /dev/null
@@ -1,201 +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.
-//
-
-/*
- * Copyright (c) 2010, The WebM Project 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, nor the WebM Project, 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.
- */
-
-// This file is modified from the dboolhuff.{c,h} from the WebM's libvpx
-// project. (http://www.webmproject.org/code)
-// It is used to decode bits from a vp8 stream.
-
-#include <limits.h>
-
-#include <algorithm>
-
-#include "base/numerics/safe_conversions.h"
-#include "cobalt/media/filters/vp8_bool_decoder.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-#define VP8_BD_VALUE_BIT \
-  static_cast<int>(sizeof(Vp8BoolDecoder::value_) * CHAR_BIT)
-
-static const int kDefaultProbability = 0x80;  // 0x80 / 256 = 0.5
-
-// This is meant to be a large, positive constant that can still be efficiently
-// loaded as an immediate (on platforms like ARM, for example). Even relatively
-// modest values like 100 would work fine.
-#define VP8_LOTS_OF_BITS (0x40000000)
-
-// The number of leading zeros.
-static const unsigned char kVp8Norm[256] = {
-    0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-Vp8BoolDecoder::Vp8BoolDecoder()
-    : user_buffer_(NULL),
-      user_buffer_end_(NULL),
-      value_(0),
-      count_(-8),
-      range_(255) {}
-
-bool Vp8BoolDecoder::Initialize(const uint8_t* data, size_t size) {
-  if (data == NULL || size == 0) return false;
-  user_buffer_start_ = data;
-  user_buffer_ = data;
-  user_buffer_end_ = data + size;
-  value_ = 0;
-  count_ = -8;
-  range_ = 255;
-  return true;
-}
-
-void Vp8BoolDecoder::FillDecoder() {
-  DCHECK(user_buffer_ != NULL);
-  int shift = VP8_BD_VALUE_BIT - CHAR_BIT - (count_ + CHAR_BIT);
-  size_t bytes_left = user_buffer_end_ - user_buffer_;
-  size_t bits_left = bytes_left * CHAR_BIT;
-  int x = static_cast<int>(shift + CHAR_BIT - bits_left);
-  int loop_end = 0;
-
-  if (x >= 0) {
-    count_ += VP8_LOTS_OF_BITS;
-    loop_end = x;
-  }
-
-  if (x < 0 || bits_left) {
-    while (shift >= loop_end) {
-      count_ += CHAR_BIT;
-      value_ |= static_cast<size_t>(*user_buffer_) << shift;
-      ++user_buffer_;
-      shift -= CHAR_BIT;
-    }
-  }
-}
-
-int Vp8BoolDecoder::ReadBit(int probability) {
-  int bit = 0;
-  size_t split = 1 + (((range_ - 1) * probability) >> 8);
-  if (count_ < 0) FillDecoder();
-  size_t bigsplit = static_cast<size_t>(split) << (VP8_BD_VALUE_BIT - 8);
-
-  if (value_ >= bigsplit) {
-    range_ -= split;
-    value_ -= bigsplit;
-    bit = 1;
-  } else {
-    range_ = split;
-  }
-
-  size_t shift = kVp8Norm[range_];
-  range_ <<= shift;
-  value_ <<= shift;
-  count_ -= shift;
-
-  DCHECK_EQ(1U, (range_ >> 7));  // In the range [128, 255].
-
-  return bit;
-}
-
-bool Vp8BoolDecoder::ReadLiteral(size_t num_bits, int* out) {
-  DCHECK_LE(num_bits, sizeof(int) * CHAR_BIT);
-  *out = 0;
-  for (; num_bits > 0; --num_bits)
-    *out = (*out << 1) | ReadBit(kDefaultProbability);
-  return !OutOfBuffer();
-}
-
-bool Vp8BoolDecoder::ReadBool(bool* out, uint8_t probability) {
-  *out = !!ReadBit(probability);
-  return !OutOfBuffer();
-}
-
-bool Vp8BoolDecoder::ReadBool(bool* out) {
-  return ReadBool(out, kDefaultProbability);
-}
-
-bool Vp8BoolDecoder::ReadLiteralWithSign(size_t num_bits, int* out) {
-  ReadLiteral(num_bits, out);
-  // Read sign.
-  if (ReadBit(kDefaultProbability)) *out = -*out;
-  return !OutOfBuffer();
-}
-
-size_t Vp8BoolDecoder::BitOffset() {
-  int bit_count = count_ + 8;
-  if (bit_count > VP8_BD_VALUE_BIT)
-    // Capped at 0 to ignore buffer underrun.
-    bit_count = std::max(0, bit_count - VP8_LOTS_OF_BITS);
-  return (user_buffer_ - user_buffer_start_) * 8 - bit_count;
-}
-
-uint8_t Vp8BoolDecoder::GetRange() {
-  return base::checked_cast<uint8_t>(range_);
-}
-
-uint8_t Vp8BoolDecoder::GetBottom() {
-  if (count_ < 0) FillDecoder();
-  return static_cast<uint8_t>(value_ >> (VP8_BD_VALUE_BIT - 8));
-}
-
-inline bool Vp8BoolDecoder::OutOfBuffer() {
-  // Check if we have reached the end of the buffer.
-  //
-  // Variable |count_| stores the number of bits in the |value_| buffer, minus
-  // 8. The top byte is part of the algorithm and the remainder is buffered to
-  // be shifted into it. So, if |count_| == 8, the top 16 bits of |value_| are
-  // occupied, 8 for the algorithm and 8 in the buffer.
-  //
-  // When reading a byte from the user's buffer, |count_| is filled with 8 and
-  // one byte is filled into the |value_| buffer. When we reach the end of the
-  // data, |count_| is additionally filled with VP8_LOTS_OF_BITS. So when
-  // |count_| == VP8_LOTS_OF_BITS - 1, the user's data has been exhausted.
-  return (count_ > VP8_BD_VALUE_BIT) && (count_ < VP8_LOTS_OF_BITS);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp8_bool_decoder.h b/cobalt/media/filters/vp8_bool_decoder.h
deleted file mode 100644
index c13bce8..0000000
--- a/cobalt/media/filters/vp8_bool_decoder.h
+++ /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.
-//
-
-/*
- * Copyright (c) 2010, The WebM Project 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, nor the WebM Project, 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.
- */
-
-// This file is modified from the dboolhuff.{c,h} from the WebM's libvpx
-// project. (http://www.webmproject.org/code)
-// It is used to decode bits from a vp8 stream.
-
-#ifndef COBALT_MEDIA_FILTERS_VP8_BOOL_DECODER_H_
-#define COBALT_MEDIA_FILTERS_VP8_BOOL_DECODER_H_
-
-#include <sys/types.h>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// A class to decode the VP8's boolean entropy coded stream. It's a variant of
-// arithmetic coding. See RFC 6386 - Chapter 7. Boolean Entropy Decoder.
-class MEDIA_EXPORT Vp8BoolDecoder {
- public:
-  Vp8BoolDecoder();
-
-  // Initializes the decoder to start decoding |data|, |size| being size
-  // of |data| in bytes. Returns false if |data| is NULL or empty.
-  bool Initialize(const uint8_t* data, size_t size);
-
-  // Reads a boolean from the coded stream. Returns false if it has reached the
-  // end of |data| and failed to read the boolean. The probability of |out| to
-  // be true is |probability| / 256, e.g., when |probability| is 0x80, the
-  // chance is 1/2 (i.e., 0x80 / 256).
-  bool ReadBool(bool* out, uint8_t probability);
-
-  // Reads a boolean from the coded stream with the default probability 1/2.
-  // Returns false if it has reached the end of |data| and failed to read the
-  // boolean.
-  bool ReadBool(bool* out);
-
-  // Reads a "literal", that is, a "num_bits"-wide unsigned value whose bits
-  // come high- to low-order, with each bit encoded at probability 1/2.
-  // Returns false if it has reached the end of |data| and failed to read the
-  // literal.
-  bool ReadLiteral(size_t num_bits, int* out);
-
-  // Reads a literal with sign from the coded stream. This is similar to
-  // the ReadLiteral(), it first read a "num_bits"-wide unsigned value, and
-  // then read an extra bit as the sign of the literal. Returns false if it has
-  // reached the end of |data| and failed to read the literal or the sign.
-  // This is different from the "read_signed_literal(d, n)" defined in RFC 6386.
-  bool ReadLiteralWithSign(size_t num_bits, int* out);
-
-  // The following methods are used to get the internal states of the decoder.
-
-  // Returns the bit offset to the current top bit of the coded stream. It is
-  // also the number of bits that have been written in the corresponding
-  // encoding state. More specifically, we have the following constraint:
-  //    w + (bottom * S) <= v < w + (bottom + range) * S,
-  // where "w" is for the bits already written,
-  //       "v" is for the possible values of the coded number.
-  //       "S" is the scale for the current bit position,
-  //           i.e., S = pow(2, -(n + 8)), where "n" is the bit number of "w".
-  // BitOffset() returns the bit count of "w", i.e., "n".
-  size_t BitOffset();
-
-  // Gets the "bottom" of the current coded value. See BitOffset() for
-  // more details.
-  uint8_t GetBottom();
-
-  // Gets the "range" of the current coded value. See BitOffset() for
-  // more details.
-  uint8_t GetRange();
-
- private:
-  // Reads the next bit from the coded stream. The probability of the bit to
-  // be one is |probability| / 256.
-  int ReadBit(int probability);
-
-  // Fills more bits from |user_buffer_| to |value_|. We shall keep at least 8
-  // bits of the current |user_buffer_| in |value_|.
-  void FillDecoder();
-
-  // Returns true iff we have ran out of bits.
-  bool OutOfBuffer();
-
-  const uint8_t* user_buffer_;
-  const uint8_t* user_buffer_start_;
-  const uint8_t* user_buffer_end_;
-  size_t value_;
-  int count_;
-  size_t range_;
-
-  DISALLOW_COPY_AND_ASSIGN(Vp8BoolDecoder);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_VP8_BOOL_DECODER_H_
diff --git a/cobalt/media/filters/vp8_bool_decoder_unittest.cc b/cobalt/media/filters/vp8_bool_decoder_unittest.cc
deleted file mode 100644
index 653ea08..0000000
--- a/cobalt/media/filters/vp8_bool_decoder_unittest.cc
+++ /dev/null
@@ -1,126 +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 "cobalt/media/filters/vp8_bool_decoder.h"
-
-#include <limits>
-
-#include "base/basictypes.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-const size_t NUM_BITS_TO_TEST = 100;
-
-// 100 zeros with probability of 0x80.
-const uint8_t kDataZerosAndEvenProbabilities[] = {0x00, 0x00, 0x00, 0x00, 0x00,
-                                                  0x00, 0x00, 0x00, 0x00, 0x00,
-                                                  0x00, 0x00, 0x00, 0x00};
-
-// 100 ones with probability of 0x80.
-const uint8_t kDataOnesAndEvenProbabilities[] = {0xfe, 0xff, 0xff, 0xff, 0xff,
-                                                 0xff, 0xff, 0xff, 0xff, 0xff,
-                                                 0xff, 0xff, 0xf0, 0x20};
-
-// [0, 1, 0, 1, ..., 1] with probability [0, 1, 2, 3, ..., 99].
-const uint8_t kDataParitiesAndIncreasingProbabilities[] = {
-    0x00, 0x02, 0x08, 0x31, 0x8e, 0xca, 0xab, 0xe2, 0xc8, 0x31, 0x12,
-    0xb3, 0x2c, 0x19, 0x90, 0xc6, 0x6a, 0xeb, 0x17, 0x52, 0x30};
-
-}  // namespace
-
-class Vp8BoolDecoderTest : public ::testing::Test {
- public:
-  Vp8BoolDecoderTest() {}
-
- protected:
-  // Fixture member, the bool decoder to be tested.
-  Vp8BoolDecoder bd_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Vp8BoolDecoderTest);
-};
-
-#define INITIALIZE(data) ASSERT_TRUE(bd_.Initialize(data, sizeof(data)));
-
-TEST_F(Vp8BoolDecoderTest, DecodeBoolsWithZerosAndEvenProbabilities) {
-  INITIALIZE(kDataZerosAndEvenProbabilities);
-  ASSERT_EQ(0u, bd_.BitOffset());
-  for (size_t i = 0; i < NUM_BITS_TO_TEST; ++i) {
-    bool out = true;
-    ASSERT_TRUE(bd_.ReadBool(&out, 0x80));
-    ASSERT_FALSE(out);
-    ASSERT_EQ(i, bd_.BitOffset());
-  }
-}
-
-TEST_F(Vp8BoolDecoderTest, DecodeLiteralsWithZerosAndEvenProbabilities) {
-  INITIALIZE(kDataZerosAndEvenProbabilities);
-
-  int value = 1;
-  ASSERT_TRUE(bd_.ReadLiteral(1, &value));
-  ASSERT_EQ(0, value);
-
-  value = 1;
-  ASSERT_TRUE(bd_.ReadLiteral(32, &value));
-  ASSERT_EQ(0, value);
-
-  value = 1;
-  ASSERT_TRUE(bd_.ReadLiteralWithSign(1, &value));
-  ASSERT_EQ(0, value);
-
-  value = 1;
-  ASSERT_TRUE(bd_.ReadLiteralWithSign(31, &value));
-  ASSERT_EQ(0, value);
-}
-
-TEST_F(Vp8BoolDecoderTest, DecodeBoolsWithOnesAndEvenProbabilities) {
-  INITIALIZE(kDataOnesAndEvenProbabilities);
-
-  ASSERT_EQ(0u, bd_.BitOffset());
-  for (size_t i = 0; i < NUM_BITS_TO_TEST; ++i) {
-    bool out = false;
-    ASSERT_TRUE(bd_.ReadBool(&out, 0x80));
-    ASSERT_TRUE(out);
-    ASSERT_EQ(i + 1, bd_.BitOffset());
-  }
-}
-
-TEST_F(Vp8BoolDecoderTest, DecodeLiteralsWithOnesAndEvenProbabilities) {
-  INITIALIZE(kDataOnesAndEvenProbabilities);
-
-  int value = 0;
-  ASSERT_TRUE(bd_.ReadLiteral(1, &value));
-  EXPECT_EQ(1, value);
-
-  value = 0;
-  ASSERT_TRUE(bd_.ReadLiteral(31, &value));
-  EXPECT_EQ(0x7FFFFFFF, value);
-
-  value = 0;
-  ASSERT_TRUE(bd_.ReadLiteralWithSign(1, &value));
-  EXPECT_EQ(-1, value);
-
-  value = 0;
-  ASSERT_TRUE(bd_.ReadLiteralWithSign(31, &value));
-  EXPECT_EQ(-0x7FFFFFFF, value);
-}
-
-TEST_F(Vp8BoolDecoderTest, DecodeBoolsWithParitiesAndIncreasingProbabilities) {
-  INITIALIZE(kDataParitiesAndIncreasingProbabilities);
-
-  for (size_t i = 0; i < NUM_BITS_TO_TEST; ++i) {
-    bool out = !(i & 1);
-    ASSERT_LE(i, std::numeric_limits<uint8_t>::max());
-    ASSERT_TRUE(bd_.ReadBool(&out, static_cast<uint8_t>(i)));
-    EXPECT_EQ(out, !!(i & 1));
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp8_parser.cc b/cobalt/media/filters/vp8_parser.cc
deleted file mode 100644
index 7477e05..0000000
--- a/cobalt/media/filters/vp8_parser.cc
+++ /dev/null
@@ -1,841 +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 file contains an implementation of a VP8 raw stream parser,
-// as defined in RFC 6386.
-
-#include "cobalt/media/filters/vp8_parser.h"
-
-#include "base/logging.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-#define ERROR_RETURN(what)                           \
-  do {                                               \
-    DVLOG(1) << "Error while trying to read " #what; \
-    return false;                                    \
-  } while (0)
-
-#define BD_READ_BOOL_OR_RETURN(out)            \
-  do {                                         \
-    if (!bd_.ReadBool(out)) ERROR_RETURN(out); \
-  } while (0)
-
-#define BD_READ_BOOL_WITH_PROB_OR_RETURN(out, prob)  \
-  do {                                               \
-    if (!bd_.ReadBool(out, prob)) ERROR_RETURN(out); \
-  } while (0)
-
-#define BD_READ_UNSIGNED_OR_RETURN(num_bits, out)             \
-  do {                                                        \
-    int _out;                                                 \
-    if (!bd_.ReadLiteral(num_bits, &_out)) ERROR_RETURN(out); \
-    *out = _out;                                              \
-  } while (0)
-
-#define BD_READ_SIGNED_OR_RETURN(num_bits, out)                       \
-  do {                                                                \
-    int _out;                                                         \
-    if (!bd_.ReadLiteralWithSign(num_bits, &_out)) ERROR_RETURN(out); \
-    *out = _out;                                                      \
-  } while (0)
-
-Vp8FrameHeader::Vp8FrameHeader() { memset(this, 0, sizeof(*this)); }
-
-Vp8Parser::Vp8Parser() : stream_(NULL), bytes_left_(0) {}
-
-Vp8Parser::~Vp8Parser() {}
-
-bool Vp8Parser::ParseFrame(const uint8_t* ptr, size_t frame_size,
-                           Vp8FrameHeader* fhdr) {
-  stream_ = ptr;
-  bytes_left_ = frame_size;
-
-  memset(fhdr, 0, sizeof(*fhdr));
-  fhdr->data = stream_;
-  fhdr->frame_size = bytes_left_;
-
-  if (!ParseFrameTag(fhdr)) return false;
-
-  fhdr->first_part_offset = stream_ - fhdr->data;
-
-  if (!ParseFrameHeader(fhdr)) return false;
-
-  if (!ParsePartitions(fhdr)) return false;
-
-  DVLOG(4) << "Frame parsed, start: " << static_cast<const void*>(ptr)
-           << ", size: " << frame_size
-           << ", offsets: to first_part=" << fhdr->first_part_offset
-           << ", to macroblock data (in bits)=" << fhdr->macroblock_bit_offset;
-
-  return true;
-}
-
-static inline uint32_t GetBitsAt(uint32_t data, size_t shift, size_t num_bits) {
-  return ((data >> shift) & ((1 << num_bits) - 1));
-}
-
-bool Vp8Parser::ParseFrameTag(Vp8FrameHeader* fhdr) {
-  const size_t kFrameTagSize = 3;
-  if (bytes_left_ < kFrameTagSize) return false;
-
-  uint32_t frame_tag = (stream_[2] << 16) | (stream_[1] << 8) | stream_[0];
-  fhdr->key_frame =
-      static_cast<Vp8FrameHeader::FrameType>(GetBitsAt(frame_tag, 0, 1));
-  fhdr->version = GetBitsAt(frame_tag, 1, 2);
-  fhdr->is_experimental = !!GetBitsAt(frame_tag, 3, 1);
-  fhdr->show_frame = !!GetBitsAt(frame_tag, 4, 1);
-  fhdr->first_part_size = GetBitsAt(frame_tag, 5, 19);
-
-  stream_ += kFrameTagSize;
-  bytes_left_ -= kFrameTagSize;
-
-  if (fhdr->IsKeyframe()) {
-    const size_t kKeyframeTagSize = 7;
-    if (bytes_left_ < kKeyframeTagSize) return false;
-
-    static const uint8_t kVp8StartCode[] = {0x9d, 0x01, 0x2a};
-    if (memcmp(stream_, kVp8StartCode, sizeof(kVp8StartCode)) != 0)
-      return false;
-
-    stream_ += sizeof(kVp8StartCode);
-    bytes_left_ -= sizeof(kVp8StartCode);
-
-    uint16_t data = (stream_[1] << 8) | stream_[0];
-    fhdr->width = data & 0x3fff;
-    fhdr->horizontal_scale = data >> 14;
-
-    data = (stream_[3] << 8) | stream_[2];
-    fhdr->height = data & 0x3fff;
-    fhdr->vertical_scale = data >> 14;
-
-    stream_ += 4;
-    bytes_left_ -= 4;
-  }
-
-  return true;
-}
-
-bool Vp8Parser::ParseFrameHeader(Vp8FrameHeader* fhdr) {
-  if (!bd_.Initialize(stream_, bytes_left_)) return false;
-
-  bool keyframe = fhdr->IsKeyframe();
-  if (keyframe) {
-    unsigned int data;
-    BD_READ_UNSIGNED_OR_RETURN(1, &data);  // color_space
-    BD_READ_UNSIGNED_OR_RETURN(1, &data);  // clamping_type
-  }
-
-  if (!ParseSegmentationHeader(keyframe)) return false;
-
-  fhdr->segmentation_hdr = curr_segmentation_hdr_;
-
-  if (!ParseLoopFilterHeader(keyframe)) return false;
-
-  fhdr->loopfilter_hdr = curr_loopfilter_hdr_;
-
-  int log2_nbr_of_dct_partitions;
-  BD_READ_UNSIGNED_OR_RETURN(2, &log2_nbr_of_dct_partitions);
-  fhdr->num_of_dct_partitions = static_cast<size_t>(1)
-                                << log2_nbr_of_dct_partitions;
-
-  if (!ParseQuantizationHeader(&fhdr->quantization_hdr)) return false;
-
-  if (keyframe) {
-    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_entropy_probs);
-  } else {
-    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_golden_frame);
-    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_alternate_frame);
-
-    int refresh_mode;
-    if (!fhdr->refresh_golden_frame) {
-      BD_READ_UNSIGNED_OR_RETURN(2, &refresh_mode);
-      fhdr->copy_buffer_to_golden =
-          static_cast<Vp8FrameHeader::GoldenRefreshMode>(refresh_mode);
-    }
-
-    if (!fhdr->refresh_alternate_frame) {
-      BD_READ_UNSIGNED_OR_RETURN(2, &refresh_mode);
-      fhdr->copy_buffer_to_alternate =
-          static_cast<Vp8FrameHeader::AltRefreshMode>(refresh_mode);
-    }
-
-    BD_READ_UNSIGNED_OR_RETURN(1, &fhdr->sign_bias_golden);
-    BD_READ_UNSIGNED_OR_RETURN(1, &fhdr->sign_bias_alternate);
-    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_entropy_probs);
-    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_last);
-  }
-
-  if (keyframe) ResetProbs();
-
-  fhdr->entropy_hdr = curr_entropy_hdr_;
-
-  if (!ParseTokenProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs))
-    return false;
-
-  BD_READ_BOOL_OR_RETURN(&fhdr->mb_no_skip_coeff);
-  if (fhdr->mb_no_skip_coeff)
-    BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_skip_false);
-
-  if (!keyframe) {
-    BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_intra);
-    BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_last);
-    BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_gf);
-  }
-
-  if (!ParseIntraProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs,
-                       keyframe))
-    return false;
-
-  if (!keyframe) {
-    if (!ParseMVProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs))
-      return false;
-  }
-
-  fhdr->macroblock_bit_offset = bd_.BitOffset();
-  fhdr->bool_dec_range = bd_.GetRange();
-  fhdr->bool_dec_value = bd_.GetBottom();
-  fhdr->bool_dec_count = 7 - (bd_.BitOffset() + 7) % 8;
-
-  return true;
-}
-
-bool Vp8Parser::ParseSegmentationHeader(bool keyframe) {
-  Vp8SegmentationHeader* shdr = &curr_segmentation_hdr_;
-
-  if (keyframe) memset(shdr, 0, sizeof(*shdr));
-
-  BD_READ_BOOL_OR_RETURN(&shdr->segmentation_enabled);
-  if (!shdr->segmentation_enabled) return true;
-
-  BD_READ_BOOL_OR_RETURN(&shdr->update_mb_segmentation_map);
-  BD_READ_BOOL_OR_RETURN(&shdr->update_segment_feature_data);
-  if (shdr->update_segment_feature_data) {
-    int mode;
-    BD_READ_UNSIGNED_OR_RETURN(1, &mode);
-    shdr->segment_feature_mode =
-        static_cast<Vp8SegmentationHeader::SegmentFeatureMode>(mode);
-
-    for (size_t i = 0; i < kMaxMBSegments; ++i) {
-      bool quantizer_update;
-      BD_READ_BOOL_OR_RETURN(&quantizer_update);
-      if (quantizer_update)
-        BD_READ_SIGNED_OR_RETURN(7, &shdr->quantizer_update_value[i]);
-      else
-        shdr->quantizer_update_value[i] = 0;
-    }
-
-    for (size_t i = 0; i < kMaxMBSegments; ++i) {
-      bool loop_filter_update;
-      BD_READ_BOOL_OR_RETURN(&loop_filter_update);
-      if (loop_filter_update)
-        BD_READ_SIGNED_OR_RETURN(6, &shdr->lf_update_value[i]);
-      else
-        shdr->lf_update_value[i] = 0;
-    }
-  }
-
-  if (shdr->update_mb_segmentation_map) {
-    for (size_t i = 0; i < kNumMBFeatureTreeProbs; ++i) {
-      bool segment_prob_update;
-      BD_READ_BOOL_OR_RETURN(&segment_prob_update);
-      if (segment_prob_update)
-        BD_READ_UNSIGNED_OR_RETURN(8, &shdr->segment_prob[i]);
-      else
-        shdr->segment_prob[i] = Vp8SegmentationHeader::kDefaultSegmentProb;
-    }
-  }
-
-  return true;
-}
-
-bool Vp8Parser::ParseLoopFilterHeader(bool keyframe) {
-  Vp8LoopFilterHeader* lfhdr = &curr_loopfilter_hdr_;
-
-  if (keyframe) memset(lfhdr, 0, sizeof(*lfhdr));
-
-  int type;
-  BD_READ_UNSIGNED_OR_RETURN(1, &type);
-  lfhdr->type = static_cast<Vp8LoopFilterHeader::Type>(type);
-  BD_READ_UNSIGNED_OR_RETURN(6, &lfhdr->level);
-  BD_READ_UNSIGNED_OR_RETURN(3, &lfhdr->sharpness_level);
-  BD_READ_BOOL_OR_RETURN(&lfhdr->loop_filter_adj_enable);
-
-  if (lfhdr->loop_filter_adj_enable) {
-    BD_READ_BOOL_OR_RETURN(&lfhdr->mode_ref_lf_delta_update);
-    if (lfhdr->mode_ref_lf_delta_update) {
-      for (size_t i = 0; i < kNumBlockContexts; ++i) {
-        bool ref_frame_delta_update_flag;
-        BD_READ_BOOL_OR_RETURN(&ref_frame_delta_update_flag);
-        if (ref_frame_delta_update_flag)
-          BD_READ_SIGNED_OR_RETURN(6, &lfhdr->ref_frame_delta[i]);
-      }
-
-      for (size_t i = 0; i < kNumBlockContexts; ++i) {
-        bool mb_mode_delta_update_flag;
-        BD_READ_BOOL_OR_RETURN(&mb_mode_delta_update_flag);
-        if (mb_mode_delta_update_flag)
-          BD_READ_SIGNED_OR_RETURN(6, &lfhdr->mb_mode_delta[i]);
-      }
-    }
-  }
-
-  return true;
-}
-
-bool Vp8Parser::ParseQuantizationHeader(Vp8QuantizationHeader* qhdr) {
-  // If any of the delta values is not present, the delta should be zero.
-  memset(qhdr, 0, sizeof(*qhdr));
-
-  BD_READ_UNSIGNED_OR_RETURN(7, &qhdr->y_ac_qi);
-
-  bool delta_present;
-
-  BD_READ_BOOL_OR_RETURN(&delta_present);
-  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->y_dc_delta);
-
-  BD_READ_BOOL_OR_RETURN(&delta_present);
-  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->y2_dc_delta);
-
-  BD_READ_BOOL_OR_RETURN(&delta_present);
-  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->y2_ac_delta);
-
-  BD_READ_BOOL_OR_RETURN(&delta_present);
-  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->uv_dc_delta);
-
-  BD_READ_BOOL_OR_RETURN(&delta_present);
-  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->uv_ac_delta);
-
-  return true;
-}
-
-// See spec for details on these values.
-const uint8_t kCoeffUpdateProbs
-    [kNumBlockTypes][kNumCoeffBands][kNumPrevCoeffContexts][kNumEntropyNodes] =
-        {
-            {
-                {
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255},
-                    {250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255},
-                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-            },
-            {
-                {
-                    {217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255},
-                    {234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255},
-                },
-                {
-                    {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-            },
-            {
-                {
-                    {186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255},
-                    {251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255},
-                },
-                {
-                    {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-            },
-            {
-                {
-                    {248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255},
-                    {248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-                {
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
-                },
-            },
-};
-
-const uint8_t kKeyframeYModeProbs[kNumYModeProbs] = {145, 156, 163, 128};
-const uint8_t kKeyframeUVModeProbs[kNumUVModeProbs] = {142, 114, 183};
-
-const uint8_t kDefaultYModeProbs[kNumYModeProbs] = {112, 86, 140, 37};
-const uint8_t kDefaultUVModeProbs[kNumUVModeProbs] = {162, 101, 204};
-
-const uint8_t kDefaultCoeffProbs
-    [kNumBlockTypes][kNumCoeffBands][kNumPrevCoeffContexts][kNumEntropyNodes] =
-        {
-            {{
-                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
-                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
-                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
-             },
-             {
-                 {253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128},
-                 {189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128},
-                 {106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128},
-             },
-             {
-                 {1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128},
-                 {181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128},
-                 {78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128},
-             },
-             {
-                 {1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128},
-                 {184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128},
-                 {77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128},
-             },
-             {
-                 {1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128},
-                 {170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128},
-                 {37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128},
-             },
-             {
-                 {1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128},
-                 {207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128},
-                 {102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128},
-             },
-             {
-                 {1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128},
-                 {177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128},
-                 {80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128},
-             },
-             {
-                 {1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-                 {246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-                 {255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
-             }},
-            {{
-                 {198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62},
-                 {131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1},
-                 {68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128},
-             },
-             {
-                 {1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128},
-                 {184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128},
-                 {81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128},
-             },
-             {
-                 {1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128},
-                 {99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128},
-                 {23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128},
-             },
-             {
-                 {1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128},
-                 {109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128},
-                 {44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128},
-             },
-             {
-                 {1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128},
-                 {94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128},
-                 {22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128},
-             },
-             {
-                 {1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128},
-                 {124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128},
-                 {35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128},
-             },
-             {
-                 {1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128},
-                 {121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128},
-                 {45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128},
-             },
-             {
-                 {1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128},
-                 {203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128},
-                 {137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128},
-             }},
-            {{
-                 {253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128},
-                 {175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128},
-                 {73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128},
-             },
-             {
-                 {1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128},
-                 {239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128},
-                 {155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128},
-             },
-             {
-                 {1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128},
-                 {201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128},
-                 {69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128},
-             },
-             {
-                 {1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128},
-                 {223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128},
-                 {141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128},
-             },
-             {
-                 {1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128},
-                 {190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128},
-                 {149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-             },
-             {
-                 {1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-                 {247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-                 {240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-             },
-             {
-                 {1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128},
-                 {213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128},
-                 {55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-             },
-             {
-                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
-                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
-                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
-             }},
-            {
-                {
-                    {202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255},
-                    {126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128},
-                    {61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128},
-                },
-                {
-                    {1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128},
-                    {166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128},
-                    {39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128},
-                },
-                {
-                    {1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128},
-                    {124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128},
-                    {24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128},
-                },
-                {{1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128},
-                 {149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128},
-                 {28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128}},
-                {
-                    {1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128},
-                    {123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128},
-                    {20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128},
-                },
-                {
-                    {1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128},
-                    {168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128},
-                    {47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128},
-                },
-                {
-                    {1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128},
-                    {141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128},
-                    {42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128},
-                },
-                {
-                    {1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-                    {244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-                    {238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
-                },
-            },
-};
-
-const uint8_t kMVUpdateProbs[kNumMVContexts][kNumMVProbs] = {
-    {
-        237, 246, 253, 253, 254, 254, 254, 254, 254, 254,
-        254, 254, 254, 254, 250, 250, 252, 254, 254,
-    },
-    {
-        231, 243, 245, 253, 254, 254, 254, 254, 254, 254,
-        254, 254, 254, 254, 251, 251, 254, 254, 254,
-    },
-};
-
-const uint8_t kDefaultMVProbs[kNumMVContexts][kNumMVProbs] = {
-    {
-        162, 128, 225, 146, 172, 147, 214, 39,  156, 128,
-        129, 132, 75,  145, 178, 206, 239, 254, 254,
-    },
-    {
-        164, 128, 204, 170, 119, 235, 140, 230, 228, 128,
-        130, 130, 74,  148, 180, 203, 236, 254, 254,
-    },
-};
-
-void Vp8Parser::ResetProbs() {
-  static_assert(
-      sizeof(curr_entropy_hdr_.coeff_probs) == sizeof(kDefaultCoeffProbs),
-      "coeff_probs_arrays_must_be_of_correct_size");
-  memcpy(curr_entropy_hdr_.coeff_probs, kDefaultCoeffProbs,
-               sizeof(curr_entropy_hdr_.coeff_probs));
-
-  static_assert(sizeof(curr_entropy_hdr_.mv_probs) == sizeof(kDefaultMVProbs),
-                "mv_probs_arrays_must_be_of_correct_size");
-  memcpy(curr_entropy_hdr_.mv_probs, kDefaultMVProbs,
-               sizeof(curr_entropy_hdr_.mv_probs));
-
-  static_assert(
-      sizeof(curr_entropy_hdr_.y_mode_probs) == sizeof(kDefaultYModeProbs),
-      "y_probs_arrays_must_be_of_correct_size");
-  memcpy(curr_entropy_hdr_.y_mode_probs, kDefaultYModeProbs,
-               sizeof(curr_entropy_hdr_.y_mode_probs));
-
-  static_assert(
-      sizeof(curr_entropy_hdr_.uv_mode_probs) == sizeof(kDefaultUVModeProbs),
-      "uv_probs_arrays_must_be_of_correct_size");
-  memcpy(curr_entropy_hdr_.uv_mode_probs, kDefaultUVModeProbs,
-               sizeof(curr_entropy_hdr_.uv_mode_probs));
-}
-
-bool Vp8Parser::ParseTokenProbs(Vp8EntropyHeader* ehdr,
-                                bool update_curr_probs) {
-  for (size_t i = 0; i < kNumBlockTypes; ++i) {
-    for (size_t j = 0; j < kNumCoeffBands; ++j) {
-      for (size_t k = 0; k < kNumPrevCoeffContexts; ++k) {
-        for (size_t l = 0; l < kNumEntropyNodes; ++l) {
-          bool coeff_prob_update_flag;
-          BD_READ_BOOL_WITH_PROB_OR_RETURN(&coeff_prob_update_flag,
-                                           kCoeffUpdateProbs[i][j][k][l]);
-          if (coeff_prob_update_flag)
-            BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->coeff_probs[i][j][k][l]);
-        }
-      }
-    }
-  }
-
-  if (update_curr_probs) {
-    memcpy(curr_entropy_hdr_.coeff_probs, ehdr->coeff_probs,
-                 sizeof(curr_entropy_hdr_.coeff_probs));
-  }
-
-  return true;
-}
-
-bool Vp8Parser::ParseIntraProbs(Vp8EntropyHeader* ehdr, bool update_curr_probs,
-                                bool keyframe) {
-  if (keyframe) {
-    static_assert(sizeof(ehdr->y_mode_probs) == sizeof(kKeyframeYModeProbs),
-                  "y_probs_arrays_must_be_of_correct_size");
-    memcpy(ehdr->y_mode_probs, kKeyframeYModeProbs,
-                 sizeof(ehdr->y_mode_probs));
-
-    static_assert(sizeof(ehdr->uv_mode_probs) == sizeof(kKeyframeUVModeProbs),
-                  "uv_probs_arrays_must_be_of_correct_size");
-    memcpy(ehdr->uv_mode_probs, kKeyframeUVModeProbs,
-                 sizeof(ehdr->uv_mode_probs));
-  } else {
-    bool intra_16x16_prob_update_flag;
-    BD_READ_BOOL_OR_RETURN(&intra_16x16_prob_update_flag);
-    if (intra_16x16_prob_update_flag) {
-      for (size_t i = 0; i < kNumYModeProbs; ++i)
-        BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->y_mode_probs[i]);
-
-      if (update_curr_probs) {
-        memcpy(curr_entropy_hdr_.y_mode_probs, ehdr->y_mode_probs,
-                     sizeof(curr_entropy_hdr_.y_mode_probs));
-      }
-    }
-
-    bool intra_chroma_prob_update_flag;
-    BD_READ_BOOL_OR_RETURN(&intra_chroma_prob_update_flag);
-    if (intra_chroma_prob_update_flag) {
-      for (size_t i = 0; i < kNumUVModeProbs; ++i)
-        BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->uv_mode_probs[i]);
-
-      if (update_curr_probs) {
-        memcpy(curr_entropy_hdr_.uv_mode_probs, ehdr->uv_mode_probs,
-                     sizeof(curr_entropy_hdr_.uv_mode_probs));
-      }
-    }
-  }
-
-  return true;
-}
-
-bool Vp8Parser::ParseMVProbs(Vp8EntropyHeader* ehdr, bool update_curr_probs) {
-  for (size_t mv_ctx = 0; mv_ctx < kNumMVContexts; ++mv_ctx) {
-    for (size_t p = 0; p < kNumMVProbs; ++p) {
-      bool mv_prob_update_flag;
-      BD_READ_BOOL_WITH_PROB_OR_RETURN(&mv_prob_update_flag,
-                                       kMVUpdateProbs[mv_ctx][p]);
-      if (mv_prob_update_flag) {
-        uint8_t prob;
-        BD_READ_UNSIGNED_OR_RETURN(7, &prob);
-        ehdr->mv_probs[mv_ctx][p] = prob ? (prob << 1) : 1;
-      }
-    }
-  }
-
-  if (update_curr_probs) {
-    memcpy(curr_entropy_hdr_.mv_probs, ehdr->mv_probs,
-                 sizeof(curr_entropy_hdr_.mv_probs));
-  }
-
-  return true;
-}
-
-bool Vp8Parser::ParsePartitions(Vp8FrameHeader* fhdr) {
-  CHECK_GE(fhdr->num_of_dct_partitions, 1u);
-  CHECK_LE(fhdr->num_of_dct_partitions, kMaxDCTPartitions);
-
-  // DCT partitions start after the first partition and partition size values
-  // that follow it. There are num_of_dct_partitions - 1 sizes stored in the
-  // stream after the first partition, each 3 bytes long. The size of last
-  // DCT partition is not stored in the stream, but is instead calculated by
-  // taking the remainder of the frame size after the penultimate DCT partition.
-  size_t first_dct_pos = fhdr->first_part_offset + fhdr->first_part_size +
-                         (fhdr->num_of_dct_partitions - 1) * 3;
-
-  // Make sure we have enough data for the first partition and partition sizes.
-  if (fhdr->frame_size < first_dct_pos) return false;
-
-  // Total size of all DCT partitions.
-  size_t bytes_left = fhdr->frame_size - first_dct_pos;
-
-  // Position ourselves at the beginning of partition size values.
-  const uint8_t* ptr =
-      fhdr->data + fhdr->first_part_offset + fhdr->first_part_size;
-
-  // Read sizes from the stream (if present).
-  for (size_t i = 0; i < fhdr->num_of_dct_partitions - 1; ++i) {
-    fhdr->dct_partition_sizes[i] = (ptr[2] << 16) | (ptr[1] << 8) | ptr[0];
-
-    // Make sure we have enough data in the stream for ith partition and
-    // subtract its size from total.
-    if (bytes_left < fhdr->dct_partition_sizes[i]) return false;
-
-    bytes_left -= fhdr->dct_partition_sizes[i];
-
-    // Move to the position of the next partition size value.
-    ptr += 3;
-  }
-
-  // The remainder of the data belongs to the last DCT partition.
-  fhdr->dct_partition_sizes[fhdr->num_of_dct_partitions - 1] = bytes_left;
-
-  DVLOG(4) << "Control part size: " << fhdr->first_part_size;
-  for (size_t i = 0; i < fhdr->num_of_dct_partitions; ++i)
-    DVLOG(4) << "DCT part " << i << " size: " << fhdr->dct_partition_sizes[i];
-
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp8_parser.h b/cobalt/media/filters/vp8_parser.h
deleted file mode 100644
index c5e2c44..0000000
--- a/cobalt/media/filters/vp8_parser.h
+++ /dev/null
@@ -1,198 +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 file contains an implementation of a VP8 raw stream parser,
-// as defined in RFC 6386.
-
-#ifndef COBALT_MEDIA_FILTERS_VP8_PARSER_H_
-#define COBALT_MEDIA_FILTERS_VP8_PARSER_H_
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/filters/vp8_bool_decoder.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// See spec for definitions of values/fields.
-const size_t kMaxMBSegments = 4;
-const size_t kNumMBFeatureTreeProbs = 3;
-
-// Member of Vp8FrameHeader and will be 0-initialized
-// in Vp8FrameHeader's constructor.
-struct MEDIA_EXPORT Vp8SegmentationHeader {
-  enum SegmentFeatureMode { FEATURE_MODE_DELTA = 0, FEATURE_MODE_ABSOLUTE = 1 };
-
-  bool segmentation_enabled;
-  bool update_mb_segmentation_map;
-  bool update_segment_feature_data;
-  SegmentFeatureMode segment_feature_mode;
-
-  int8_t quantizer_update_value[kMaxMBSegments];
-  int8_t lf_update_value[kMaxMBSegments];
-  static const int kDefaultSegmentProb = 255;
-  uint8_t segment_prob[kNumMBFeatureTreeProbs];
-};
-
-const size_t kNumBlockContexts = 4;
-
-// Member of Vp8FrameHeader and will be 0-initialized
-// in Vp8FrameHeader's constructor.
-struct MEDIA_EXPORT Vp8LoopFilterHeader {
-  enum Type { LOOP_FILTER_TYPE_NORMAL = 0, LOOP_FILTER_TYPE_SIMPLE = 1 };
-  Type type;
-  uint8_t level;
-  uint8_t sharpness_level;
-  bool loop_filter_adj_enable;
-  bool mode_ref_lf_delta_update;
-
-  int8_t ref_frame_delta[kNumBlockContexts];
-  int8_t mb_mode_delta[kNumBlockContexts];
-};
-
-// Member of Vp8FrameHeader and will be 0-initialized
-// in Vp8FrameHeader's constructor.
-struct MEDIA_EXPORT Vp8QuantizationHeader {
-  uint8_t y_ac_qi;
-  int8_t y_dc_delta;
-  int8_t y2_dc_delta;
-  int8_t y2_ac_delta;
-  int8_t uv_dc_delta;
-  int8_t uv_ac_delta;
-};
-
-const size_t kNumBlockTypes = 4;
-const size_t kNumCoeffBands = 8;
-const size_t kNumPrevCoeffContexts = 3;
-const size_t kNumEntropyNodes = 11;
-
-const size_t kNumMVContexts = 2;
-const size_t kNumMVProbs = 19;
-
-const size_t kNumYModeProbs = 4;
-const size_t kNumUVModeProbs = 3;
-
-// Member of Vp8FrameHeader and will be 0-initialized
-// in Vp8FrameHeader's constructor.
-struct Vp8EntropyHeader {
-  uint8_t coeff_probs[kNumBlockTypes][kNumCoeffBands][kNumPrevCoeffContexts]
-                     [kNumEntropyNodes];
-
-  uint8_t y_mode_probs[kNumYModeProbs];
-  uint8_t uv_mode_probs[kNumUVModeProbs];
-
-  uint8_t mv_probs[kNumMVContexts][kNumMVProbs];
-};
-
-const size_t kMaxDCTPartitions = 8;
-
-struct MEDIA_EXPORT Vp8FrameHeader {
-  Vp8FrameHeader();
-
-  enum FrameType { KEYFRAME = 0, INTERFRAME = 1 };
-  bool IsKeyframe() const { return key_frame == KEYFRAME; }
-
-  enum GoldenRefreshMode {
-    COPY_LAST_TO_GOLDEN = 1,
-    COPY_ALT_TO_GOLDEN = 2,
-  };
-
-  enum AltRefreshMode {
-    COPY_LAST_TO_ALT = 1,
-    COPY_GOLDEN_TO_ALT = 2,
-  };
-
-  FrameType key_frame;
-  uint8_t version;
-  bool is_experimental;
-  bool show_frame;
-  size_t first_part_size;
-
-  uint16_t width;
-  uint8_t horizontal_scale;
-  uint16_t height;
-  uint8_t vertical_scale;
-
-  Vp8SegmentationHeader segmentation_hdr;
-  Vp8LoopFilterHeader loopfilter_hdr;
-  Vp8QuantizationHeader quantization_hdr;
-
-  size_t num_of_dct_partitions;
-
-  Vp8EntropyHeader entropy_hdr;
-
-  bool refresh_entropy_probs;
-  bool refresh_golden_frame;
-  bool refresh_alternate_frame;
-  GoldenRefreshMode copy_buffer_to_golden;
-  AltRefreshMode copy_buffer_to_alternate;
-  uint8_t sign_bias_golden;
-  uint8_t sign_bias_alternate;
-  bool refresh_last;
-
-  bool mb_no_skip_coeff;
-  uint8_t prob_skip_false;
-  uint8_t prob_intra;
-  uint8_t prob_last;
-  uint8_t prob_gf;
-
-  const uint8_t* data;
-  size_t frame_size;
-
-  size_t dct_partition_sizes[kMaxDCTPartitions];
-  // Offset in bytes from data.
-  off_t first_part_offset;
-  // Offset in bits from first_part_offset.
-  off_t macroblock_bit_offset;
-
-  // Bool decoder state
-  uint8_t bool_dec_range;
-  uint8_t bool_dec_value;
-  uint8_t bool_dec_count;
-};
-
-// A parser for raw VP8 streams as specified in RFC 6386.
-class MEDIA_EXPORT Vp8Parser {
- public:
-  Vp8Parser();
-  ~Vp8Parser();
-
-  // Try to parse exactly one VP8 frame starting at |ptr| and of size |size|,
-  // filling the parsed data in |fhdr|. Return true on success.
-  // Size has to be exactly the size of the frame and coming from the caller,
-  // who needs to acquire it from elsewhere (normally from a container).
-  bool ParseFrame(const uint8_t* ptr, size_t size, Vp8FrameHeader* fhdr);
-
- private:
-  bool ParseFrameTag(Vp8FrameHeader* fhdr);
-  bool ParseFrameHeader(Vp8FrameHeader* fhdr);
-
-  bool ParseSegmentationHeader(bool keyframe);
-  bool ParseLoopFilterHeader(bool keyframe);
-  bool ParseQuantizationHeader(Vp8QuantizationHeader* qhdr);
-  bool ParseTokenProbs(Vp8EntropyHeader* ehdr, bool update_curr_probs);
-  bool ParseIntraProbs(Vp8EntropyHeader* ehdr, bool update_curr_probs,
-                       bool keyframe);
-  bool ParseMVProbs(Vp8EntropyHeader* ehdr, bool update_curr_probs);
-  bool ParsePartitions(Vp8FrameHeader* fhdr);
-  void ResetProbs();
-
-  // These persist across calls to ParseFrame() and may be used and/or updated
-  // for subsequent frames if the stream instructs us to do so.
-  Vp8SegmentationHeader curr_segmentation_hdr_;
-  Vp8LoopFilterHeader curr_loopfilter_hdr_;
-  Vp8EntropyHeader curr_entropy_hdr_;
-
-  const uint8_t* stream_;
-  size_t bytes_left_;
-  Vp8BoolDecoder bd_;
-
-  DISALLOW_COPY_AND_ASSIGN(Vp8Parser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_VP8_PARSER_H_
diff --git a/cobalt/media/filters/vp8_parser_fuzzertest.cc b/cobalt/media/filters/vp8_parser_fuzzertest.cc
deleted file mode 100644
index b5b82f5..0000000
--- a/cobalt/media/filters/vp8_parser_fuzzertest.cc
+++ /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.
-
-#include "base/numerics/safe_conversions.h"
-#include "cobalt/media/filters/ivf_parser.h"
-#include "cobalt/media/filters/vp8_parser.h"
-#include "starboard/types.h"
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  const uint8_t* ivf_payload = NULL;
-  media::IvfParser ivf_parser;
-  media::IvfFileHeader ivf_file_header;
-  media::IvfFrameHeader ivf_frame_header;
-
-  if (!ivf_parser.Initialize(data, size, &ivf_file_header)) return 0;
-
-  // Parse until the end of stream/unsupported stream/error in stream is found.
-  while (ivf_parser.ParseNextFrame(&ivf_frame_header, &ivf_payload)) {
-    media::Vp8Parser vp8_parser;
-    media::Vp8FrameHeader vp8_frame_header;
-    vp8_parser.ParseFrame(ivf_payload, ivf_frame_header.frame_size,
-                          &vp8_frame_header);
-  }
-
-  return 0;
-}
diff --git a/cobalt/media/filters/vp8_parser_unittest.cc b/cobalt/media/filters/vp8_parser_unittest.cc
deleted file mode 100644
index 84def05..0000000
--- a/cobalt/media/filters/vp8_parser_unittest.cc
+++ /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.
-
-#include "cobalt/media/filters/vp8_parser.h"
-
-#include "base/files/memory_mapped_file.h"
-#include "base/logging.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/filters/ivf_parser.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(Vp8ParserTest, StreamFileParsing) {
-  base::FilePath file_path = GetTestDataFilePath("test-25fps.vp8");
-  base::MemoryMappedFile stream;
-  ASSERT_TRUE(stream.Initialize(file_path))
-      << "Couldn't open stream file: " << file_path.MaybeAsASCII();
-
-  IvfParser ivf_parser;
-  IvfFileHeader ivf_file_header = {};
-  ASSERT_TRUE(
-      ivf_parser.Initialize(stream.data(), stream.length(), &ivf_file_header));
-  ASSERT_EQ(ivf_file_header.fourcc, 0x30385056u);  // VP80
-
-  Vp8Parser vp8_parser;
-  IvfFrameHeader ivf_frame_header = {};
-  size_t num_parsed_frames = 0;
-
-  // Parse until the end of stream/unsupported stream/error in stream is found.
-  const uint8_t* payload = NULL;
-  while (ivf_parser.ParseNextFrame(&ivf_frame_header, &payload)) {
-    Vp8FrameHeader fhdr;
-
-    ASSERT_TRUE(
-        vp8_parser.ParseFrame(payload, ivf_frame_header.frame_size, &fhdr));
-
-    ++num_parsed_frames;
-  }
-
-  DVLOG(1) << "Number of successfully parsed frames before EOS: "
-           << num_parsed_frames;
-
-  EXPECT_EQ(ivf_file_header.num_frames, num_parsed_frames);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp9_bool_decoder.cc b/cobalt/media/filters/vp9_bool_decoder.cc
deleted file mode 100644
index be6df00..0000000
--- a/cobalt/media/filters/vp9_bool_decoder.cc
+++ /dev/null
@@ -1,164 +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 "cobalt/media/filters/vp9_bool_decoder.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "cobalt/media/base/bit_reader.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-// This is an optimization lookup table for the loop in spec 9.2.2.
-//     while BoolRange <= 128:
-//       read 1 bit
-//       BoolRange *= 2
-// This table indicates how many iterations to run for a given BoolRange. So
-// the loop could be reduced to
-//     read (kCountToShiftTo128[BoolRange]) bits
-const int kCountToShiftTo128[256] = {
-    0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-}  // namespace
-
-Vp9BoolDecoder::Vp9BoolDecoder() {}
-
-Vp9BoolDecoder::~Vp9BoolDecoder() {}
-
-// 9.2.1 Initialization process for Boolean decoder
-bool Vp9BoolDecoder::Initialize(const uint8_t* data, size_t size) {
-  DCHECK(data);
-  if (size < 1) {
-    DVLOG(1) << "input size of bool decoder shall be at least 1";
-    valid_ = false;
-    return false;
-  }
-
-  reader_.reset(new BitReader(data, size));
-  valid_ = true;
-
-  bool_value_ = 0;
-  count_to_fill_ = 8;
-  bool_range_ = 255;
-  if (ReadLiteral(1) != 0) {
-    DVLOG(1) << "marker bit should be 0";
-    valid_ = false;
-    return false;
-  }
-  return true;
-}
-
-// Fill at least |count_to_fill_| bits and prefill remain bits of |bool_value_|
-// if data is enough.
-bool Vp9BoolDecoder::Fill() {
-  DCHECK_GE(count_to_fill_, 0);
-
-  int bits_left = reader_->bits_available();
-  if (bits_left < count_to_fill_) {
-    valid_ = false;
-    DVLOG(1) << "Vp9BoolDecoder reads beyond the end of stream";
-    return false;
-  }
-
-  DCHECK_LE(count_to_fill_, kBoolSize);
-  int max_bits_to_read = kBigBoolBitSize - kBoolSize + count_to_fill_;
-  int bits_to_read = std::min(max_bits_to_read, bits_left);
-
-  BigBool data;
-  reader_->ReadBits(bits_to_read, &data);
-  bool_value_ |= data << (max_bits_to_read - bits_to_read);
-  count_to_fill_ -= bits_to_read;
-
-  return true;
-}
-
-// 9.2.2 Boolean decoding process
-bool Vp9BoolDecoder::ReadBool(int prob) {
-  DCHECK(reader_);
-
-  if (count_to_fill_ > 0) {
-    if (!Fill()) return false;
-  }
-
-  unsigned int split = (bool_range_ * prob + (256 - prob)) >> kBoolSize;
-  BigBool big_split = static_cast<BigBool>(split)
-                      << (kBigBoolBitSize - kBoolSize);
-
-  bool bit;
-  if (bool_value_ < big_split) {
-    bool_range_ = split;
-    bit = false;
-  } else {
-    bool_range_ -= split;
-    bool_value_ -= big_split;
-    bit = true;
-  }
-
-  // Need to fill |count| bits next time in order to make |bool_range_| >=
-  // 128.
-  DCHECK_LT(bool_range_, arraysize(kCountToShiftTo128));
-  DCHECK_GT(bool_range_, 0u);
-  int count = kCountToShiftTo128[bool_range_];
-  bool_range_ <<= count;
-  bool_value_ <<= count;
-  count_to_fill_ += count;
-
-  return bit;
-}
-
-// 9.2.4 Parsing process for read_literal
-uint8_t Vp9BoolDecoder::ReadLiteral(int bits) {
-  DCHECK_LT(static_cast<size_t>(bits), sizeof(uint8_t) * 8);
-  DCHECK(reader_);
-
-  uint8_t x = 0;
-  for (int i = 0; i < bits; i++) x = 2 * x + ReadBool(128);
-
-  return x;
-}
-
-bool Vp9BoolDecoder::ConsumePaddingBits() {
-  DCHECK(reader_);
-
-  if (count_to_fill_ > reader_->bits_available()) {
-    // 9.2.2 Boolean decoding process
-    // Although we actually don't used the value, spec says the bitstream
-    // should have enough bits to fill bool range, this should never happen.
-    DVLOG(2) << "not enough bits in bitstream to fill bool range";
-    return false;
-  }
-
-  if (bool_value_ != 0) {
-    DVLOG(1) << "prefilled padding bits are not zero";
-    return false;
-  }
-  while (reader_->bits_available() > 0) {
-    int data;
-    int size_to_read =
-        std::min(reader_->bits_available(), static_cast<int>(sizeof(data) * 8));
-    reader_->ReadBits(size_to_read, &data);
-    if (data != 0) {
-      DVLOG(1) << "padding bits are not zero";
-      return false;
-    }
-  }
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp9_bool_decoder.h b/cobalt/media/filters/vp9_bool_decoder.h
deleted file mode 100644
index b0828af..0000000
--- a/cobalt/media/filters/vp9_bool_decoder.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 COBALT_MEDIA_FILTERS_VP9_BOOL_DECODER_H_
-#define COBALT_MEDIA_FILTERS_VP9_BOOL_DECODER_H_
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class BitReader;
-
-class MEDIA_EXPORT Vp9BoolDecoder {
- public:
-  Vp9BoolDecoder();
-  ~Vp9BoolDecoder();
-
-  // |data| is the input buffer with |size| bytes.
-  // Returns true if read first marker bit successfully.
-  bool Initialize(const uint8_t* data, size_t size);
-
-  // Returns true if none of the reads since the last Initialize() call has
-  // gone beyond the end of available data.
-  bool IsValid() const { return valid_; }
-
-  // Reads one bit. B(p).
-  // If the read goes beyond the end of buffer, the return value is undefined.
-  bool ReadBool(int prob);
-
-  // Reads a literal. L(n).
-  // If the read goes beyond the end of buffer, the return value is undefined.
-  uint8_t ReadLiteral(int bits);
-
-  // Consumes padding bits up to end of data. Returns true if no
-  // padding bits or they are all zero.
-  bool ConsumePaddingBits();
-
- private:
-  // The highest 8 bits of BigBool is actual "bool value". The remain bits
-  // are optimization of prefill buffer.
-  using BigBool = size_t;
-  // The size of "bool value" used for boolean decoding defined in spec.
-  const int kBoolSize = 8;
-  const int kBigBoolBitSize = sizeof(BigBool) * 8;
-
-  bool Fill();
-
-  std::unique_ptr<BitReader> reader_;
-
-  // Indicates if none of the reads since the last Initialize() call has gone
-  // beyond the end of available data.
-  bool valid_ = true;
-
-  BigBool bool_value_ = 0;
-
-  // Need to fill at least |count_to_fill_| bits. Negative value means extra
-  // bits pre-filled.
-  int count_to_fill_ = 0;
-  unsigned int bool_range_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(Vp9BoolDecoder);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_VP9_BOOL_DECODER_H_
diff --git a/cobalt/media/filters/vp9_compressed_header_parser.cc b/cobalt/media/filters/vp9_compressed_header_parser.cc
deleted file mode 100644
index 92963d4..0000000
--- a/cobalt/media/filters/vp9_compressed_header_parser.cc
+++ /dev/null
@@ -1,279 +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 "cobalt/media/filters/vp9_compressed_header_parser.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-// 6.3.6 Inv recenter noneg syntax, inv_recenter_nonneg().
-int InvRecenterNonneg(int v, int m) {
-  DCHECK_LE(m, kVp9MaxProb / 2);
-  if (v > 2 * m) return v;
-
-  if (v & 1) return m - ((v + 1) >> 1);
-  return m + (v >> 1);
-}
-
-// 6.3.5 Inv remap prob syntax, inv_remap_prob().
-Vp9Prob InvRemapProb(uint8_t delta_prob, uint8_t prob) {
-  static uint8_t inv_map_table[kVp9MaxProb] = {
-      7,   20,  33,  46,  59,  72,  85,  98,  111, 124, 137, 150, 163, 176,
-      189, 202, 215, 228, 241, 254, 1,   2,   3,   4,   5,   6,   8,   9,
-      10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  21,  22,  23,  24,
-      25,  26,  27,  28,  29,  30,  31,  32,  34,  35,  36,  37,  38,  39,
-      40,  41,  42,  43,  44,  45,  47,  48,  49,  50,  51,  52,  53,  54,
-      55,  56,  57,  58,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
-      70,  71,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,
-      86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  99,  100,
-      101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115,
-      116, 117, 118, 119, 120, 121, 122, 123, 125, 126, 127, 128, 129, 130,
-      131, 132, 133, 134, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145,
-      146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
-      161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
-      177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191,
-      192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 205, 206,
-      207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221,
-      222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 236,
-      237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
-      252, 253, 253};
-  uint8_t m = prob;
-  uint8_t v = delta_prob;
-  DCHECK_GE(m, 1);
-  DCHECK_LE(m, kVp9MaxProb);
-  DCHECK_LT(v, arraysize(inv_map_table));
-  v = inv_map_table[v];
-  m--;
-  if ((m << 1) <= kVp9MaxProb) {
-    return 1 + InvRecenterNonneg(v, m);
-  } else {
-    return kVp9MaxProb - InvRecenterNonneg(v, kVp9MaxProb - 1 - m);
-  }
-}
-
-}  // namespace
-
-Vp9CompressedHeaderParser::Vp9CompressedHeaderParser() {}
-
-// 6.3.1 Tx mode syntax
-void Vp9CompressedHeaderParser::ReadTxMode(Vp9FrameHeader* fhdr) {
-  int tx_mode;
-  if (fhdr->quant_params.IsLossless()) {
-    tx_mode = Vp9CompressedHeader::ONLY_4X4;
-  } else {
-    tx_mode = reader_.ReadLiteral(2);
-    if (tx_mode == Vp9CompressedHeader::ALLOW_32X32)
-      tx_mode += reader_.ReadLiteral(1);
-  }
-  fhdr->compressed_header.tx_mode =
-      static_cast<Vp9CompressedHeader::Vp9TxMode>(tx_mode);
-}
-
-// 6.3.4 Decode term subexp syntax
-uint8_t Vp9CompressedHeaderParser::DecodeTermSubexp() {
-  if (reader_.ReadLiteral(1) == 0) return reader_.ReadLiteral(4);
-  if (reader_.ReadLiteral(1) == 0) return reader_.ReadLiteral(4) + 16;
-  if (reader_.ReadLiteral(1) == 0) return reader_.ReadLiteral(5) + 32;
-  uint8_t v = reader_.ReadLiteral(7);
-  if (v < 65) return v + 64;
-  return (v << 1) - 1 + reader_.ReadLiteral(1);
-}
-
-// 6.3.3 Diff update prob syntax
-void Vp9CompressedHeaderParser::DiffUpdateProb(Vp9Prob* prob) {
-  const Vp9Prob kUpdateProb = 252;
-  if (reader_.ReadBool(kUpdateProb)) {
-    uint8_t delta_prob = DecodeTermSubexp();
-    *prob = InvRemapProb(delta_prob, *prob);
-  }
-}
-
-// Helper function to DiffUpdateProb an array of probs.
-template <int N>
-void Vp9CompressedHeaderParser::DiffUpdateProbArray(Vp9Prob (&prob_array)[N]) {
-  for (auto& x : prob_array) {
-    DiffUpdateProb(&x);
-  }
-}
-
-// 6.3.2 Tx mode probs syntax
-void Vp9CompressedHeaderParser::ReadTxModeProbs(
-    Vp9FrameContext* frame_context) {
-  for (auto& a : frame_context->tx_probs_8x8) {
-    DiffUpdateProbArray(a);
-  }
-  for (auto& a : frame_context->tx_probs_16x16) {
-    DiffUpdateProbArray(a);
-  }
-  for (auto& a : frame_context->tx_probs_32x32) {
-    DiffUpdateProbArray(a);
-  }
-}
-
-// 6.3.7 Coef probs syntax
-void Vp9CompressedHeaderParser::ReadCoefProbs(Vp9FrameHeader* fhdr) {
-  const int tx_mode_to_biggest_tx_size[Vp9CompressedHeader::TX_MODES] = {
-      0, 1, 2, 3, 3,
-  };
-  const int max_tx_size =
-      tx_mode_to_biggest_tx_size[fhdr->compressed_header.tx_mode];
-  for (int tx_size = 0; tx_size <= max_tx_size; tx_size++) {
-    if (reader_.ReadLiteral(1) == 0) continue;
-
-    for (auto& ai : fhdr->frame_context.coef_probs[tx_size]) {
-      for (auto& aj : ai) {
-        for (auto& ak : aj) {
-          int max_l = (ak == aj[0]) ? 3 : 6;
-          for (int l = 0; l < max_l; l++) {
-            DiffUpdateProbArray(ak[l]);
-          }
-        }
-      }
-    }
-  }
-}
-
-// 6.3.8 Skip probs syntax
-void Vp9CompressedHeaderParser::ReadSkipProb(Vp9FrameContext* frame_context) {
-  DiffUpdateProbArray(frame_context->skip_prob);
-}
-
-// 6.3.9 Inter mode probs syntax
-void Vp9CompressedHeaderParser::ReadInterModeProbs(
-    Vp9FrameContext* frame_context) {
-  for (auto& a : frame_context->inter_mode_probs) DiffUpdateProbArray(a);
-}
-
-// 6.3.10 Interp filter probs syntax
-void Vp9CompressedHeaderParser::ReadInterpFilterProbs(
-    Vp9FrameContext* frame_context) {
-  for (auto& a : frame_context->interp_filter_probs) DiffUpdateProbArray(a);
-}
-
-// 6.3.11 Intra inter probs syntax
-void Vp9CompressedHeaderParser::ReadIsInterProbs(
-    Vp9FrameContext* frame_context) {
-  DiffUpdateProbArray(frame_context->is_inter_prob);
-}
-
-// 6.3.12 Frame reference mode syntax
-void Vp9CompressedHeaderParser::ReadFrameReferenceMode(Vp9FrameHeader* fhdr) {
-  bool compound_reference_allowed = false;
-  for (int i = VP9_FRAME_LAST + 1; i < VP9_FRAME_MAX; i++)
-    if (fhdr->ref_frame_sign_bias[i] != fhdr->ref_frame_sign_bias[1])
-      compound_reference_allowed = true;
-
-  if (compound_reference_allowed && reader_.ReadLiteral(1)) {
-    fhdr->compressed_header.reference_mode =
-        reader_.ReadLiteral(1) ? REFERENCE_MODE_SELECT : COMPOUND_REFERENCE;
-  } else {
-    fhdr->compressed_header.reference_mode = SINGLE_REFERENCE;
-  }
-}
-
-// 6.3.13 Frame reference mode probs syntax
-void Vp9CompressedHeaderParser::ReadFrameReferenceModeProbs(
-    Vp9FrameHeader* fhdr) {
-  Vp9FrameContext* frame_context = &fhdr->frame_context;
-  if (fhdr->compressed_header.reference_mode == REFERENCE_MODE_SELECT)
-    DiffUpdateProbArray(frame_context->comp_mode_prob);
-
-  if (fhdr->compressed_header.reference_mode != COMPOUND_REFERENCE)
-    for (auto& a : frame_context->single_ref_prob) DiffUpdateProbArray(a);
-
-  if (fhdr->compressed_header.reference_mode != SINGLE_REFERENCE)
-    DiffUpdateProbArray(frame_context->comp_ref_prob);
-}
-
-// 6.3.14 Y mode probs syntax
-void Vp9CompressedHeaderParser::ReadYModeProbs(Vp9FrameContext* frame_context) {
-  for (auto& a : frame_context->y_mode_probs) DiffUpdateProbArray(a);
-}
-
-// 6.3.15 Partition probs syntax
-void Vp9CompressedHeaderParser::ReadPartitionProbs(
-    Vp9FrameContext* frame_context) {
-  for (auto& a : frame_context->partition_probs) DiffUpdateProbArray(a);
-}
-
-// 6.3.16 MV probs syntax
-void Vp9CompressedHeaderParser::ReadMvProbs(bool allow_high_precision_mv,
-                                            Vp9FrameContext* frame_context) {
-  UpdateMvProbArray(frame_context->mv_joint_probs);
-
-  for (int i = 0; i < 2; i++) {
-    UpdateMvProb(&frame_context->mv_sign_prob[i]);
-    UpdateMvProbArray(frame_context->mv_class_probs[i]);
-    UpdateMvProb(&frame_context->mv_class0_bit_prob[i]);
-    UpdateMvProbArray(frame_context->mv_bits_prob[i]);
-  }
-
-  for (int i = 0; i < 2; i++) {
-    for (auto& a : frame_context->mv_class0_fr_probs[i]) UpdateMvProbArray(a);
-    UpdateMvProbArray(frame_context->mv_fr_probs[i]);
-  }
-
-  if (allow_high_precision_mv) {
-    for (int i = 0; i < 2; i++) {
-      UpdateMvProb(&frame_context->mv_class0_hp_prob[i]);
-      UpdateMvProb(&frame_context->mv_hp_prob[i]);
-    }
-  }
-}
-
-// 6.3.17 Update mv prob syntax
-void Vp9CompressedHeaderParser::UpdateMvProb(Vp9Prob* prob) {
-  if (reader_.ReadBool(252)) *prob = reader_.ReadLiteral(7) << 1 | 1;
-}
-
-// Helper function to UpdateMvProb an array of probs.
-template <int N>
-void Vp9CompressedHeaderParser::UpdateMvProbArray(Vp9Prob (&prob_array)[N]) {
-  for (auto& x : prob_array) {
-    UpdateMvProb(&x);
-  }
-}
-
-// 6.3 Compressed header syntax
-bool Vp9CompressedHeaderParser::Parse(const uint8_t* stream, off_t frame_size,
-                                      Vp9FrameHeader* fhdr) {
-  DVLOG(2) << "Vp9CompressedHeaderParser::Parse";
-  if (!reader_.Initialize(stream, frame_size)) return false;
-
-  ReadTxMode(fhdr);
-  if (fhdr->compressed_header.tx_mode == Vp9CompressedHeader::TX_MODE_SELECT)
-    ReadTxModeProbs(&fhdr->frame_context);
-
-  ReadCoefProbs(fhdr);
-  ReadSkipProb(&fhdr->frame_context);
-
-  if (!fhdr->IsIntra()) {
-    ReadInterModeProbs(&fhdr->frame_context);
-    if (fhdr->interpolation_filter == SWITCHABLE)
-      ReadInterpFilterProbs(&fhdr->frame_context);
-    ReadIsInterProbs(&fhdr->frame_context);
-    ReadFrameReferenceMode(fhdr);
-    ReadFrameReferenceModeProbs(fhdr);
-    ReadYModeProbs(&fhdr->frame_context);
-    ReadPartitionProbs(&fhdr->frame_context);
-    ReadMvProbs(fhdr->allow_high_precision_mv, &fhdr->frame_context);
-  }
-
-  if (!reader_.IsValid()) {
-    DVLOG(1) << "parser reads beyond the end of buffer";
-    return false;
-  }
-  if (!reader_.ConsumePaddingBits()) {
-    DVLOG(1) << "padding bits are not zero";
-    return false;
-  }
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp9_compressed_header_parser.h b/cobalt/media/filters/vp9_compressed_header_parser.h
deleted file mode 100644
index 3dd1176..0000000
--- a/cobalt/media/filters/vp9_compressed_header_parser.h
+++ /dev/null
@@ -1,53 +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 COBALT_MEDIA_FILTERS_VP9_COMPRESSED_HEADER_PARSER_H_
-#define COBALT_MEDIA_FILTERS_VP9_COMPRESSED_HEADER_PARSER_H_
-
-#include "cobalt/media/filters/vp9_bool_decoder.h"
-#include "cobalt/media/filters/vp9_parser.h"
-
-namespace cobalt {
-namespace media {
-
-class Vp9CompressedHeaderParser {
- public:
-  Vp9CompressedHeaderParser();
-
-  // Parses VP9 compressed header in |stream| with |frame_size| into |fhdr|.
-  // Returns true if no error.
-  bool Parse(const uint8_t* stream, off_t frame_size, Vp9FrameHeader* fhdr);
-
- private:
-  void ReadTxMode(Vp9FrameHeader* fhdr);
-  uint8_t DecodeTermSubexp();
-  void DiffUpdateProb(Vp9Prob* prob);
-  template <int N>
-  void DiffUpdateProbArray(Vp9Prob (&prob_array)[N]);
-  void ReadTxModeProbs(Vp9FrameContext* frame_context);
-  void ReadCoefProbs(Vp9FrameHeader* fhdr);
-  void ReadSkipProb(Vp9FrameContext* frame_context);
-  void ReadInterModeProbs(Vp9FrameContext* frame_context);
-  void ReadInterpFilterProbs(Vp9FrameContext* frame_context);
-  void ReadIsInterProbs(Vp9FrameContext* frame_context);
-  void ReadFrameReferenceMode(Vp9FrameHeader* fhdr);
-  void ReadFrameReferenceModeProbs(Vp9FrameHeader* fhdr);
-  void ReadYModeProbs(Vp9FrameContext* frame_context);
-  void ReadPartitionProbs(Vp9FrameContext* frame_context);
-  void ReadMvProbs(bool allow_high_precision_mv,
-                   Vp9FrameContext* frame_context);
-  void UpdateMvProb(Vp9Prob* prob);
-  template <int N>
-  void UpdateMvProbArray(Vp9Prob (&prob_array)[N]);
-
-  // Bool decoder for compressed frame header.
-  Vp9BoolDecoder reader_;
-
-  DISALLOW_COPY_AND_ASSIGN(Vp9CompressedHeaderParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_VP9_COMPRESSED_HEADER_PARSER_H_
diff --git a/cobalt/media/filters/vp9_parser.cc b/cobalt/media/filters/vp9_parser.cc
deleted file mode 100644
index 42d35d9..0000000
--- a/cobalt/media/filters/vp9_parser.cc
+++ /dev/null
@@ -1,547 +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 file contains an implementation of a VP9 bitstream parser.
-//
-// VERBOSE level:
-//  1 something wrong in bitstream
-//  2 parsing steps
-//  3 parsed values (selected)
-
-#include "cobalt/media/filters/vp9_parser.h"
-
-#include <string.h>
-
-#include <algorithm>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/numerics/safe_conversions.h"
-#include "cobalt/media/filters/vp9_compressed_header_parser.h"
-#include "cobalt/media/filters/vp9_uncompressed_header_parser.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-bool Vp9FrameHeader::IsKeyframe() const {
-  // When show_existing_frame is true, the frame header does not precede an
-  // actual frame to be decoded, so frame_type does not apply (and is not read
-  // from the stream).
-  return !show_existing_frame && frame_type == KEYFRAME;
-}
-
-bool Vp9FrameHeader::IsIntra() const {
-  return !show_existing_frame && (frame_type == KEYFRAME || intra_only);
-}
-
-Vp9Parser::FrameInfo::FrameInfo(const uint8_t* ptr, off_t size)
-    : ptr(ptr), size(size) {}
-
-bool Vp9FrameContext::IsValid() const {
-  // probs should be in [1, 255] range.
-  static_assert(sizeof(Vp9Prob) == 1,
-                "following checks assuming Vp9Prob is single byte");
-  if (memchr(tx_probs_8x8, 0, sizeof(tx_probs_8x8))) return false;
-  if (memchr(tx_probs_16x16, 0, sizeof(tx_probs_16x16))) return false;
-  if (memchr(tx_probs_32x32, 0, sizeof(tx_probs_32x32))) return false;
-
-  for (auto& a : coef_probs) {
-    for (auto& ai : a) {
-      for (auto& aj : ai) {
-        for (auto& ak : aj) {
-          int max_l = (ak == aj[0]) ? 3 : 6;
-          for (int l = 0; l < max_l; l++) {
-            for (auto& x : ak[l]) {
-              if (x == 0) return false;
-            }
-          }
-        }
-      }
-    }
-  }
-  if (memchr(skip_prob, 0, sizeof(skip_prob))) return false;
-  if (memchr(inter_mode_probs, 0, sizeof(inter_mode_probs))) return false;
-  if (memchr(interp_filter_probs, 0, sizeof(interp_filter_probs))) return false;
-  if (memchr(is_inter_prob, 0, sizeof(is_inter_prob))) return false;
-  if (memchr(comp_mode_prob, 0, sizeof(comp_mode_prob))) return false;
-  if (memchr(single_ref_prob, 0, sizeof(single_ref_prob))) return false;
-  if (memchr(comp_ref_prob, 0, sizeof(comp_ref_prob))) return false;
-  if (memchr(y_mode_probs, 0, sizeof(y_mode_probs))) return false;
-  if (memchr(uv_mode_probs, 0, sizeof(uv_mode_probs))) return false;
-  if (memchr(partition_probs, 0, sizeof(partition_probs))) return false;
-  if (memchr(mv_joint_probs, 0, sizeof(mv_joint_probs))) return false;
-  if (memchr(mv_sign_prob, 0, sizeof(mv_sign_prob))) return false;
-  if (memchr(mv_class_probs, 0, sizeof(mv_class_probs))) return false;
-  if (memchr(mv_class0_bit_prob, 0, sizeof(mv_class0_bit_prob))) return false;
-  if (memchr(mv_bits_prob, 0, sizeof(mv_bits_prob))) return false;
-  if (memchr(mv_class0_fr_probs, 0, sizeof(mv_class0_fr_probs))) return false;
-  if (memchr(mv_fr_probs, 0, sizeof(mv_fr_probs))) return false;
-  if (memchr(mv_class0_hp_prob, 0, sizeof(mv_class0_hp_prob))) return false;
-  if (memchr(mv_hp_prob, 0, sizeof(mv_hp_prob))) return false;
-
-  return true;
-}
-
-Vp9Parser::Context::Vp9FrameContextManager::Vp9FrameContextManager()
-    : weak_ptr_factory_(this) {}
-
-Vp9Parser::Context::Vp9FrameContextManager::~Vp9FrameContextManager() {}
-
-const Vp9FrameContext&
-Vp9Parser::Context::Vp9FrameContextManager::frame_context() const {
-  DCHECK(initialized_);
-  DCHECK(!needs_client_update_);
-  return frame_context_;
-}
-
-void Vp9Parser::Context::Vp9FrameContextManager::Reset() {
-  initialized_ = false;
-  needs_client_update_ = false;
-  weak_ptr_factory_.InvalidateWeakPtrs();
-}
-
-void Vp9Parser::Context::Vp9FrameContextManager::SetNeedsClientUpdate() {
-  DCHECK(!needs_client_update_);
-  initialized_ = true;
-  needs_client_update_ = true;
-}
-
-Vp9Parser::ContextRefreshCallback
-Vp9Parser::Context::Vp9FrameContextManager::GetUpdateCb() {
-  if (needs_client_update_)
-    return base::Bind(&Vp9FrameContextManager::UpdateFromClient,
-                      weak_ptr_factory_.GetWeakPtr());
-  else
-    return Vp9Parser::ContextRefreshCallback();
-}
-
-void Vp9Parser::Context::Vp9FrameContextManager::Update(
-    const Vp9FrameContext& frame_context) {
-  // DCHECK because we can trust values from our parser.
-  DCHECK(frame_context.IsValid());
-  initialized_ = true;
-  frame_context_ = frame_context;
-
-  // For frame context we are updating, it may be still awaiting previous
-  // ContextRefreshCallback. Because we overwrite the value of context here and
-  // previous ContextRefreshCallback no longer matters, invalidate the weak ptr
-  // to prevent previous ContextRefreshCallback run.
-  // With this optimization, we may be able to parse more frames while previous
-  // are still decoding.
-  weak_ptr_factory_.InvalidateWeakPtrs();
-  needs_client_update_ = false;
-}
-
-void Vp9Parser::Context::Vp9FrameContextManager::UpdateFromClient(
-    const Vp9FrameContext& frame_context) {
-  DVLOG(2) << "Got external frame_context update";
-  DCHECK(needs_client_update_);
-  if (!frame_context.IsValid()) {
-    DLOG(ERROR) << "Invalid prob value in frame_context";
-    return;
-  }
-  needs_client_update_ = false;
-  initialized_ = true;
-  frame_context_ = frame_context;
-}
-
-void Vp9Parser::Context::Reset() {
-  memset(&segmentation_, 0, sizeof(segmentation_));
-  memset(&loop_filter_, 0, sizeof(loop_filter_));
-  memset(&ref_slots_, 0, sizeof(ref_slots_));
-  for (auto& manager : frame_context_managers_) manager.Reset();
-}
-
-void Vp9Parser::Context::MarkFrameContextForUpdate(size_t frame_context_idx) {
-  DCHECK_LT(frame_context_idx, arraysize(frame_context_managers_));
-  frame_context_managers_[frame_context_idx].SetNeedsClientUpdate();
-}
-
-void Vp9Parser::Context::UpdateFrameContext(
-    size_t frame_context_idx, const Vp9FrameContext& frame_context) {
-  DCHECK_LT(frame_context_idx, arraysize(frame_context_managers_));
-  frame_context_managers_[frame_context_idx].Update(frame_context);
-}
-
-const Vp9Parser::ReferenceSlot& Vp9Parser::Context::GetRefSlot(
-    size_t ref_type) const {
-  DCHECK_LT(ref_type, arraysize(ref_slots_));
-  return ref_slots_[ref_type];
-}
-
-void Vp9Parser::Context::UpdateRefSlot(
-    size_t ref_type, const Vp9Parser::ReferenceSlot& ref_slot) {
-  DCHECK_LT(ref_type, arraysize(ref_slots_));
-  ref_slots_[ref_type] = ref_slot;
-}
-
-Vp9Parser::Vp9Parser(bool parsing_compressed_header)
-    : parsing_compressed_header_(parsing_compressed_header) {
-  Reset();
-}
-
-Vp9Parser::~Vp9Parser() {}
-
-void Vp9Parser::SetStream(const uint8_t* stream, off_t stream_size) {
-  DCHECK(stream);
-  stream_ = stream;
-  bytes_left_ = stream_size;
-  frames_.clear();
-}
-
-void Vp9Parser::Reset() {
-  stream_ = NULL;
-  bytes_left_ = 0;
-  frames_.clear();
-  curr_frame_info_.Reset();
-
-  context_.Reset();
-}
-
-Vp9Parser::Result Vp9Parser::ParseNextFrame(Vp9FrameHeader* fhdr) {
-  DCHECK(fhdr);
-  DVLOG(2) << "ParseNextFrame";
-
-  // If |curr_frame_info_| is valid, uncompressed header was parsed into
-  // |curr_frame_header_| and we are awaiting context update to proceed with
-  // compressed header parsing.
-  if (!curr_frame_info_.IsValid()) {
-    if (frames_.empty()) {
-      // No frames to be decoded, if there is no more stream, request more.
-      if (!stream_) return kEOStream;
-
-      // New stream to be parsed, parse it and fill frames_.
-      frames_ = ParseSuperframe();
-      if (frames_.empty()) {
-        DVLOG(1) << "Failed parsing superframes";
-        return kInvalidStream;
-      }
-    }
-
-    curr_frame_info_ = frames_.front();
-    frames_.pop_front();
-
-    memset(&curr_frame_header_, 0, sizeof(curr_frame_header_));
-
-    Vp9UncompressedHeaderParser uncompressed_parser(&context_);
-    if (!uncompressed_parser.Parse(curr_frame_info_.ptr, curr_frame_info_.size,
-                                   &curr_frame_header_))
-      return kInvalidStream;
-
-    if (curr_frame_header_.header_size_in_bytes == 0) {
-      // Verify padding bits are zero.
-      for (off_t i = curr_frame_header_.uncompressed_header_size;
-           i < curr_frame_info_.size; i++) {
-        if (curr_frame_info_.ptr[i] != 0) {
-          DVLOG(1) << "Padding bits are not zeros.";
-          return kInvalidStream;
-        }
-      }
-      *fhdr = curr_frame_header_;
-      curr_frame_info_.Reset();
-      return kOk;
-    }
-    if (curr_frame_header_.uncompressed_header_size +
-            curr_frame_header_.header_size_in_bytes >
-        base::checked_cast<size_t>(curr_frame_info_.size)) {
-      DVLOG(1) << "header_size_in_bytes="
-               << curr_frame_header_.header_size_in_bytes
-               << " is larger than bytes left in buffer: "
-               << curr_frame_info_.size -
-                      curr_frame_header_.uncompressed_header_size;
-      return kInvalidStream;
-    }
-  }
-
-  if (parsing_compressed_header_) {
-    size_t frame_context_idx = curr_frame_header_.frame_context_idx;
-    const Context::Vp9FrameContextManager& context_to_load =
-        context_.frame_context_managers_[frame_context_idx];
-    if (!context_to_load.initialized()) {
-      // 8.2 Frame order constraints
-      // must load an initialized set of probabilities.
-      DVLOG(1) << "loading uninitialized frame context, index="
-               << frame_context_idx;
-      return kInvalidStream;
-    }
-    if (context_to_load.needs_client_update()) {
-      DVLOG(3) << "waiting frame_context_idx=" << frame_context_idx
-               << " to update";
-      return kAwaitingRefresh;
-    }
-    curr_frame_header_.initial_frame_context =
-        curr_frame_header_.frame_context = context_to_load.frame_context();
-
-    Vp9CompressedHeaderParser compressed_parser;
-    if (!compressed_parser.Parse(
-            curr_frame_info_.ptr + curr_frame_header_.uncompressed_header_size,
-            curr_frame_header_.header_size_in_bytes, &curr_frame_header_)) {
-      return kInvalidStream;
-    }
-
-    if (curr_frame_header_.refresh_frame_context) {
-      // In frame parallel mode, we can refresh the context without decoding
-      // tile data.
-      if (curr_frame_header_.frame_parallel_decoding_mode) {
-        context_.UpdateFrameContext(frame_context_idx,
-                                    curr_frame_header_.frame_context);
-      } else {
-        context_.MarkFrameContextForUpdate(frame_context_idx);
-      }
-    }
-  }
-
-  SetupSegmentationDequant();
-  SetupLoopFilter();
-  UpdateSlots();
-
-  *fhdr = curr_frame_header_;
-  curr_frame_info_.Reset();
-  return kOk;
-}
-
-Vp9Parser::ContextRefreshCallback Vp9Parser::GetContextRefreshCb(
-    size_t frame_context_idx) {
-  DCHECK_LT(frame_context_idx, arraysize(context_.frame_context_managers_));
-  auto& frame_context_manager =
-      context_.frame_context_managers_[frame_context_idx];
-
-  return frame_context_manager.GetUpdateCb();
-}
-
-// Annex B Superframes
-std::deque<Vp9Parser::FrameInfo> Vp9Parser::ParseSuperframe() {
-  const uint8_t* stream = stream_;
-  off_t bytes_left = bytes_left_;
-
-  // Make sure we don't parse stream_ more than once.
-  stream_ = NULL;
-  bytes_left_ = 0;
-
-  if (bytes_left < 1) return std::deque<FrameInfo>();
-
-  // If this is a superframe, the last byte in the stream will contain the
-  // superframe marker. If not, the whole buffer contains a single frame.
-  uint8_t marker = *(stream + bytes_left - 1);
-  if ((marker & 0xe0) != 0xc0) {
-    return {FrameInfo(stream, bytes_left)};
-  }
-
-  DVLOG(1) << "Parsing a superframe";
-
-  // The bytes immediately before the superframe marker constitute superframe
-  // index, which stores information about sizes of each frame in it.
-  // Calculate its size and set index_ptr to the beginning of it.
-  size_t num_frames = (marker & 0x7) + 1;
-  size_t mag = ((marker >> 3) & 0x3) + 1;
-  off_t index_size = 2 + mag * num_frames;
-
-  if (bytes_left < index_size) return std::deque<FrameInfo>();
-
-  const uint8_t* index_ptr = stream + bytes_left - index_size;
-  if (marker != *index_ptr) return std::deque<FrameInfo>();
-
-  ++index_ptr;
-  bytes_left -= index_size;
-
-  // Parse frame information contained in the index and add a pointer to and
-  // size of each frame to frames.
-  std::deque<FrameInfo> frames;
-  for (size_t i = 0; i < num_frames; ++i) {
-    uint32_t size = 0;
-    for (size_t j = 0; j < mag; ++j) {
-      size |= *index_ptr << (j * 8);
-      ++index_ptr;
-    }
-
-    if (base::checked_cast<off_t>(size) > bytes_left) {
-      DVLOG(1) << "Not enough data in the buffer for frame " << i;
-      return std::deque<FrameInfo>();
-    }
-
-    frames.push_back(FrameInfo(stream, size));
-    stream += size;
-    bytes_left -= size;
-
-    DVLOG(1) << "Frame " << i << ", size: " << size;
-  }
-
-  return frames;
-}
-
-// 8.6.1
-const size_t QINDEX_RANGE = 256;
-const int16_t kDcQLookup[QINDEX_RANGE] = {
-    4,   8,    8,    9,    10,   11,   12,   12,   13,   14,  15,  16,  17,
-    18,  19,   19,   20,   21,   22,   23,   24,   25,   26,  26,  27,  28,
-    29,  30,   31,   32,   32,   33,   34,   35,   36,   37,  38,  38,  39,
-    40,  41,   42,   43,   43,   44,   45,   46,   47,   48,  48,  49,  50,
-    51,  52,   53,   53,   54,   55,   56,   57,   57,   58,  59,  60,  61,
-    62,  62,   63,   64,   65,   66,   66,   67,   68,   69,  70,  70,  71,
-    72,  73,   74,   74,   75,   76,   77,   78,   78,   79,  80,  81,  81,
-    82,  83,   84,   85,   85,   87,   88,   90,   92,   93,  95,  96,  98,
-    99,  101,  102,  104,  105,  107,  108,  110,  111,  113, 114, 116, 117,
-    118, 120,  121,  123,  125,  127,  129,  131,  134,  136, 138, 140, 142,
-    144, 146,  148,  150,  152,  154,  156,  158,  161,  164, 166, 169, 172,
-    174, 177,  180,  182,  185,  187,  190,  192,  195,  199, 202, 205, 208,
-    211, 214,  217,  220,  223,  226,  230,  233,  237,  240, 243, 247, 250,
-    253, 257,  261,  265,  269,  272,  276,  280,  284,  288, 292, 296, 300,
-    304, 309,  313,  317,  322,  326,  330,  335,  340,  344, 349, 354, 359,
-    364, 369,  374,  379,  384,  389,  395,  400,  406,  411, 417, 423, 429,
-    435, 441,  447,  454,  461,  467,  475,  482,  489,  497, 505, 513, 522,
-    530, 539,  549,  559,  569,  579,  590,  602,  614,  626, 640, 654, 668,
-    684, 700,  717,  736,  755,  775,  796,  819,  843,  869, 896, 925, 955,
-    988, 1022, 1058, 1098, 1139, 1184, 1232, 1282, 1336,
-};
-
-const int16_t kAcQLookup[QINDEX_RANGE] = {
-    4,    8,    9,    10,   11,   12,   13,   14,   15,   16,   17,   18,
-    19,   20,   21,   22,   23,   24,   25,   26,   27,   28,   29,   30,
-    31,   32,   33,   34,   35,   36,   37,   38,   39,   40,   41,   42,
-    43,   44,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,
-    55,   56,   57,   58,   59,   60,   61,   62,   63,   64,   65,   66,
-    67,   68,   69,   70,   71,   72,   73,   74,   75,   76,   77,   78,
-    79,   80,   81,   82,   83,   84,   85,   86,   87,   88,   89,   90,
-    91,   92,   93,   94,   95,   96,   97,   98,   99,   100,  101,  102,
-    104,  106,  108,  110,  112,  114,  116,  118,  120,  122,  124,  126,
-    128,  130,  132,  134,  136,  138,  140,  142,  144,  146,  148,  150,
-    152,  155,  158,  161,  164,  167,  170,  173,  176,  179,  182,  185,
-    188,  191,  194,  197,  200,  203,  207,  211,  215,  219,  223,  227,
-    231,  235,  239,  243,  247,  251,  255,  260,  265,  270,  275,  280,
-    285,  290,  295,  300,  305,  311,  317,  323,  329,  335,  341,  347,
-    353,  359,  366,  373,  380,  387,  394,  401,  408,  416,  424,  432,
-    440,  448,  456,  465,  474,  483,  492,  501,  510,  520,  530,  540,
-    550,  560,  571,  582,  593,  604,  615,  627,  639,  651,  663,  676,
-    689,  702,  715,  729,  743,  757,  771,  786,  801,  816,  832,  848,
-    864,  881,  898,  915,  933,  951,  969,  988,  1007, 1026, 1046, 1066,
-    1087, 1108, 1129, 1151, 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343,
-    1369, 1396, 1423, 1451, 1479, 1508, 1537, 1567, 1597, 1628, 1660, 1692,
-    1725, 1759, 1793, 1828,
-};
-
-static_assert(arraysize(kDcQLookup) == arraysize(kAcQLookup),
-              "quantizer lookup arrays of incorrect size");
-
-static size_t ClampQ(size_t q) {
-  return std::min(std::max(static_cast<size_t>(0), q),
-                  arraysize(kDcQLookup) - 1);
-}
-
-// 8.6.1 Dequantization functions
-size_t Vp9Parser::GetQIndex(const Vp9QuantizationParams& quant,
-                            size_t segid) const {
-  const Vp9SegmentationParams& segmentation = context_.segmentation();
-
-  if (segmentation.FeatureEnabled(segid,
-                                  Vp9SegmentationParams::SEG_LVL_ALT_Q)) {
-    int16_t feature_data =
-        segmentation.FeatureData(segid, Vp9SegmentationParams::SEG_LVL_ALT_Q);
-    size_t q_index = segmentation.abs_or_delta_update
-                         ? feature_data
-                         : quant.base_q_idx + feature_data;
-    return ClampQ(q_index);
-  }
-
-  return quant.base_q_idx;
-}
-
-// 8.6.1 Dequantization functions
-void Vp9Parser::SetupSegmentationDequant() {
-  const Vp9QuantizationParams& quant = curr_frame_header_.quant_params;
-  Vp9SegmentationParams& segmentation = context_.segmentation_;
-
-  DLOG_IF(ERROR, curr_frame_header_.bit_depth > 8)
-      << "bit_depth > 8 is not supported "
-         "yet, kDcQLookup and kAcQLookup "
-         "need extended";
-  if (segmentation.enabled) {
-    for (size_t i = 0; i < Vp9SegmentationParams::kNumSegments; ++i) {
-      const size_t q_index = GetQIndex(quant, i);
-      segmentation.y_dequant[i][0] =
-          kDcQLookup[ClampQ(q_index + quant.delta_q_y_dc)];
-      segmentation.y_dequant[i][1] = kAcQLookup[ClampQ(q_index)];
-      segmentation.uv_dequant[i][0] =
-          kDcQLookup[ClampQ(q_index + quant.delta_q_uv_dc)];
-      segmentation.uv_dequant[i][1] =
-          kAcQLookup[ClampQ(q_index + quant.delta_q_uv_ac)];
-    }
-  } else {
-    const size_t q_index = quant.base_q_idx;
-    segmentation.y_dequant[0][0] =
-        kDcQLookup[ClampQ(q_index + quant.delta_q_y_dc)];
-    segmentation.y_dequant[0][1] = kAcQLookup[ClampQ(q_index)];
-    segmentation.uv_dequant[0][0] =
-        kDcQLookup[ClampQ(q_index + quant.delta_q_uv_dc)];
-    segmentation.uv_dequant[0][1] =
-        kAcQLookup[ClampQ(q_index + quant.delta_q_uv_ac)];
-  }
-}
-
-static int ClampLf(int lf) {
-  const int kMaxLoopFilterLevel = 63;
-  return std::min(std::max(0, lf), kMaxLoopFilterLevel);
-}
-
-// 8.8.1 Loop filter frame init process
-void Vp9Parser::SetupLoopFilter() {
-  Vp9LoopFilterParams& loop_filter = context_.loop_filter_;
-  if (!loop_filter.level) return;
-
-  int scale = loop_filter.level < 32 ? 1 : 2;
-
-  for (size_t i = 0; i < Vp9SegmentationParams::kNumSegments; ++i) {
-    int level = loop_filter.level;
-    const Vp9SegmentationParams& segmentation = context_.segmentation();
-
-    if (segmentation.FeatureEnabled(i, Vp9SegmentationParams::SEG_LVL_ALT_LF)) {
-      int feature_data =
-          segmentation.FeatureData(i, Vp9SegmentationParams::SEG_LVL_ALT_LF);
-      level = ClampLf(segmentation.abs_or_delta_update ? feature_data
-                                                       : level + feature_data);
-    }
-
-    if (!loop_filter.delta_enabled) {
-      memset(loop_filter.lvl[i], level, sizeof(loop_filter.lvl[i]));
-    } else {
-      loop_filter.lvl[i][Vp9RefType::VP9_FRAME_INTRA][0] = ClampLf(
-          level + loop_filter.ref_deltas[Vp9RefType::VP9_FRAME_INTRA] * scale);
-      loop_filter.lvl[i][Vp9RefType::VP9_FRAME_INTRA][1] = 0;
-
-      for (size_t type = Vp9RefType::VP9_FRAME_LAST;
-           type < Vp9RefType::VP9_FRAME_MAX; ++type) {
-        for (size_t mode = 0; mode < Vp9LoopFilterParams::kNumModeDeltas;
-             ++mode) {
-          loop_filter.lvl[i][type][mode] =
-              ClampLf(level + loop_filter.ref_deltas[type] * scale +
-                      loop_filter.mode_deltas[mode] * scale);
-        }
-      }
-    }
-  }
-}
-
-void Vp9Parser::UpdateSlots() {
-  // 8.10 Reference frame update process
-  for (size_t i = 0; i < kVp9NumRefFrames; i++) {
-    if (curr_frame_header_.RefreshFlag(i)) {
-      ReferenceSlot ref_slot;
-      ref_slot.initialized = true;
-
-      ref_slot.frame_width = curr_frame_header_.frame_width;
-      ref_slot.frame_height = curr_frame_header_.frame_height;
-      ref_slot.subsampling_x = curr_frame_header_.subsampling_x;
-      ref_slot.subsampling_y = curr_frame_header_.subsampling_y;
-      ref_slot.bit_depth = curr_frame_header_.bit_depth;
-
-      ref_slot.profile = curr_frame_header_.profile;
-      ref_slot.color_space = curr_frame_header_.color_space;
-      context_.UpdateRefSlot(i, ref_slot);
-    }
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp9_parser.h b/cobalt/media/filters/vp9_parser.h
deleted file mode 100644
index 424c557..0000000
--- a/cobalt/media/filters/vp9_parser.h
+++ /dev/null
@@ -1,435 +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 file contains an implementation of a VP9 bitstream parser. The main
-// purpose of this parser is to support hardware decode acceleration. Some
-// accelerators, e.g. libva which implements VA-API, require the caller
-// (chrome) to feed them parsed VP9 frame header.
-//
-// See media::VP9Decoder for example usage.
-//
-#ifndef COBALT_MEDIA_FILTERS_VP9_PARSER_H_
-#define COBALT_MEDIA_FILTERS_VP9_PARSER_H_
-
-#include <sys/types.h>
-
-#include <deque>
-#include <memory>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/weak_ptr.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-const int kVp9MaxProfile = 4;
-const int kVp9NumRefFramesLog2 = 3;
-const size_t kVp9NumRefFrames = 1 << kVp9NumRefFramesLog2;
-const uint8_t kVp9MaxProb = 255;
-const size_t kVp9NumRefsPerFrame = 3;
-const size_t kVp9NumFrameContextsLog2 = 2;
-const size_t kVp9NumFrameContexts = 1 << kVp9NumFrameContextsLog2;
-
-using Vp9Prob = uint8_t;
-
-enum class Vp9ColorSpace {
-  UNKNOWN = 0,
-  BT_601 = 1,
-  BT_709 = 2,
-  SMPTE_170 = 3,
-  SMPTE_240 = 4,
-  BT_2020 = 5,
-  RESERVED = 6,
-  SRGB = 7,
-};
-
-enum Vp9InterpolationFilter {
-  EIGHTTAP = 0,
-  EIGHTTAP_SMOOTH = 1,
-  EIGHTTAP_SHARP = 2,
-  BILINEAR = 3,
-  SWITCHABLE = 4,
-};
-
-enum Vp9RefType {
-  VP9_FRAME_INTRA = 0,
-  VP9_FRAME_LAST = 1,
-  VP9_FRAME_GOLDEN = 2,
-  VP9_FRAME_ALTREF = 3,
-  VP9_FRAME_MAX = 4,
-};
-
-enum Vp9ReferenceMode {
-  SINGLE_REFERENCE = 0,
-  COMPOUND_REFERENCE = 1,
-  REFERENCE_MODE_SELECT = 2,
-};
-
-struct MEDIA_EXPORT Vp9SegmentationParams {
-  static const size_t kNumSegments = 8;
-  static const size_t kNumTreeProbs = kNumSegments - 1;
-  static const size_t kNumPredictionProbs = 3;
-  enum SegmentLevelFeature {
-    SEG_LVL_ALT_Q = 0,
-    SEG_LVL_ALT_LF = 1,
-    SEG_LVL_REF_FRAME = 2,
-    SEG_LVL_SKIP = 3,
-    SEG_LVL_MAX
-  };
-
-  bool enabled;
-
-  bool update_map;
-  uint8_t tree_probs[kNumTreeProbs];
-  bool temporal_update;
-  uint8_t pred_probs[kNumPredictionProbs];
-
-  bool update_data;
-  bool abs_or_delta_update;
-  bool feature_enabled[kNumSegments][SEG_LVL_MAX];
-  int16_t feature_data[kNumSegments][SEG_LVL_MAX];
-
-  int16_t y_dequant[kNumSegments][2];
-  int16_t uv_dequant[kNumSegments][2];
-
-  bool FeatureEnabled(size_t seg_id, SegmentLevelFeature feature) const {
-    return feature_enabled[seg_id][feature];
-  }
-
-  int16_t FeatureData(size_t seg_id, SegmentLevelFeature feature) const {
-    return feature_data[seg_id][feature];
-  }
-};
-
-struct MEDIA_EXPORT Vp9LoopFilterParams {
-  static const size_t kNumModeDeltas = 2;
-
-  uint8_t level;
-  uint8_t sharpness;
-
-  bool delta_enabled;
-  bool delta_update;
-  bool update_ref_deltas[VP9_FRAME_MAX];
-  int8_t ref_deltas[VP9_FRAME_MAX];
-  bool update_mode_deltas[kNumModeDeltas];
-  int8_t mode_deltas[kNumModeDeltas];
-
-  // Calculated from above fields.
-  uint8_t lvl[Vp9SegmentationParams::kNumSegments][VP9_FRAME_MAX]
-             [kNumModeDeltas];
-};
-
-// Members of Vp9FrameHeader will be 0-initialized by Vp9Parser::ParseNextFrame.
-struct MEDIA_EXPORT Vp9QuantizationParams {
-  bool IsLossless() const {
-    return base_q_idx == 0 && delta_q_y_dc == 0 && delta_q_uv_dc == 0 &&
-           delta_q_uv_ac == 0;
-  }
-
-  uint8_t base_q_idx;
-  int8_t delta_q_y_dc;
-  int8_t delta_q_uv_dc;
-  int8_t delta_q_uv_ac;
-};
-
-// Entropy context for frame parsing
-struct MEDIA_EXPORT Vp9FrameContext {
-  bool IsValid() const;
-
-  Vp9Prob tx_probs_8x8[2][1];
-  Vp9Prob tx_probs_16x16[2][2];
-  Vp9Prob tx_probs_32x32[2][3];
-
-  Vp9Prob coef_probs[4][2][2][6][6][3];
-  Vp9Prob skip_prob[3];
-  Vp9Prob inter_mode_probs[7][3];
-  Vp9Prob interp_filter_probs[4][2];
-  Vp9Prob is_inter_prob[4];
-
-  Vp9Prob comp_mode_prob[5];
-  Vp9Prob single_ref_prob[5][2];
-  Vp9Prob comp_ref_prob[5];
-
-  Vp9Prob y_mode_probs[4][9];
-  Vp9Prob uv_mode_probs[10][9];
-  Vp9Prob partition_probs[16][3];
-
-  Vp9Prob mv_joint_probs[3];
-  Vp9Prob mv_sign_prob[2];
-  Vp9Prob mv_class_probs[2][10];
-  Vp9Prob mv_class0_bit_prob[2];
-  Vp9Prob mv_bits_prob[2][10];
-  Vp9Prob mv_class0_fr_probs[2][2][3];
-  Vp9Prob mv_fr_probs[2][3];
-  Vp9Prob mv_class0_hp_prob[2];
-  Vp9Prob mv_hp_prob[2];
-};
-
-struct MEDIA_EXPORT Vp9CompressedHeader {
-  enum Vp9TxMode {
-    ONLY_4X4 = 0,
-    ALLOW_8X8 = 1,
-    ALLOW_16X16 = 2,
-    ALLOW_32X32 = 3,
-    TX_MODE_SELECT = 4,
-    TX_MODES = 5,
-  };
-
-  Vp9TxMode tx_mode;
-  Vp9ReferenceMode reference_mode;
-};
-
-// VP9 frame header.
-struct MEDIA_EXPORT Vp9FrameHeader {
-  enum FrameType {
-    KEYFRAME = 0,
-    INTERFRAME = 1,
-  };
-
-  bool IsKeyframe() const;
-  bool IsIntra() const;
-  bool RefreshFlag(size_t i) const {
-    return !!(refresh_frame_flags & (1u << i));
-  }
-
-  uint8_t profile;
-
-  bool show_existing_frame;
-  uint8_t frame_to_show_map_idx;
-
-  FrameType frame_type;
-
-  bool show_frame;
-  bool error_resilient_mode;
-
-  uint8_t bit_depth;
-  Vp9ColorSpace color_space;
-  bool color_range;
-  uint8_t subsampling_x;
-  uint8_t subsampling_y;
-
-  // The range of frame_width and frame_height is 1..2^16.
-  uint32_t frame_width;
-  uint32_t frame_height;
-  uint32_t render_width;
-  uint32_t render_height;
-
-  bool intra_only;
-  uint8_t reset_frame_context;
-  uint8_t refresh_frame_flags;
-  uint8_t ref_frame_idx[kVp9NumRefsPerFrame];
-  bool ref_frame_sign_bias[Vp9RefType::VP9_FRAME_MAX];
-  bool allow_high_precision_mv;
-  Vp9InterpolationFilter interpolation_filter;
-
-  bool refresh_frame_context;
-  bool frame_parallel_decoding_mode;
-  uint8_t frame_context_idx;
-  // |frame_context_idx_to_save_probs| is to be used by save_probs() only, and
-  // |frame_context_idx| otherwise.
-  uint8_t frame_context_idx_to_save_probs;
-
-  Vp9QuantizationParams quant_params;
-
-  uint8_t tile_cols_log2;
-  uint8_t tile_rows_log2;
-
-  // Pointer to the beginning of frame data. It is a responsibility of the
-  // client of the Vp9Parser to maintain validity of this data while it is
-  // being used outside of that class.
-  const uint8_t* data;
-
-  // Size of |data| in bytes.
-  size_t frame_size;
-
-  // Size of compressed header in bytes.
-  size_t header_size_in_bytes;
-
-  // Size of uncompressed header in bytes.
-  size_t uncompressed_header_size;
-
-  Vp9CompressedHeader compressed_header;
-  // Initial frame entropy context after load_probs2(frame_context_idx).
-  Vp9FrameContext initial_frame_context;
-  // Current frame entropy context after header parsing.
-  Vp9FrameContext frame_context;
-};
-
-// A parser for VP9 bitstream.
-class MEDIA_EXPORT Vp9Parser {
- public:
-  // If context update is needed after decoding a frame, the client must
-  // execute this callback, passing the updated context state.
-  using ContextRefreshCallback = base::Callback<void(const Vp9FrameContext&)>;
-
-  // ParseNextFrame() return values. See documentation for ParseNextFrame().
-  enum Result {
-    kOk,
-    kInvalidStream,
-    kEOStream,
-    kAwaitingRefresh,
-  };
-
-  // The parsing context to keep track of references.
-  struct ReferenceSlot {
-    bool initialized;
-    uint32_t frame_width;
-    uint32_t frame_height;
-    uint8_t subsampling_x;
-    uint8_t subsampling_y;
-    uint8_t bit_depth;
-
-    // More fields for consistency checking.
-    uint8_t profile;
-    Vp9ColorSpace color_space;
-  };
-
-  // The parsing context that persists across frames.
-  class Context {
-   public:
-    class Vp9FrameContextManager {
-     public:
-      Vp9FrameContextManager();
-      ~Vp9FrameContextManager();
-      bool initialized() const { return initialized_; }
-      bool needs_client_update() const { return needs_client_update_; }
-      const Vp9FrameContext& frame_context() const;
-
-      // Resets to uninitialized state.
-      void Reset();
-
-      // Marks this context as requiring an update from parser's client.
-      void SetNeedsClientUpdate();
-
-      // Updates frame context.
-      void Update(const Vp9FrameContext& frame_context);
-
-      // Returns a callback to update frame context at a later time with.
-      ContextRefreshCallback GetUpdateCb();
-
-     private:
-      // Updates frame context from parser's client.
-      void UpdateFromClient(const Vp9FrameContext& frame_context);
-
-      bool initialized_ = false;
-      bool needs_client_update_ = false;
-      Vp9FrameContext frame_context_;
-
-      base::WeakPtrFactory<Vp9FrameContextManager> weak_ptr_factory_;
-    };
-
-    void Reset();
-
-    // Mark |frame_context_idx| as requiring update from the client.
-    void MarkFrameContextForUpdate(size_t frame_context_idx);
-
-    // Update frame context at |frame_context_idx| with the contents of
-    // |frame_context|.
-    void UpdateFrameContext(size_t frame_context_idx,
-                            const Vp9FrameContext& frame_context);
-
-    // Return ReferenceSlot for frame at |ref_idx|.
-    const ReferenceSlot& GetRefSlot(size_t ref_idx) const;
-
-    // Update contents of ReferenceSlot at |ref_idx| with the contents of
-    // |ref_slot|.
-    void UpdateRefSlot(size_t ref_idx, const ReferenceSlot& ref_slot);
-
-    const Vp9SegmentationParams& segmentation() const { return segmentation_; }
-
-    const Vp9LoopFilterParams& loop_filter() const { return loop_filter_; }
-
-   private:
-    friend class Vp9UncompressedHeaderParser;
-    friend class Vp9Parser;
-
-    // Segmentation and loop filter state.
-    Vp9SegmentationParams segmentation_;
-    Vp9LoopFilterParams loop_filter_;
-
-    // Frame references.
-    ReferenceSlot ref_slots_[kVp9NumRefFrames];
-
-    Vp9FrameContextManager frame_context_managers_[kVp9NumFrameContexts];
-  };
-
-  // The constructor. See ParseNextFrame() for comments for
-  // |parsing_compressed_header|.
-  explicit Vp9Parser(bool parsing_compressed_header);
-  ~Vp9Parser();
-
-  // Set a new stream buffer to read from, starting at |stream| and of size
-  // |stream_size| in bytes. |stream| must point to the beginning of a single
-  // frame or a single superframe, is owned by caller and must remain valid
-  // until the next call to SetStream().
-  void SetStream(const uint8_t* stream, off_t stream_size);
-
-  // Parse the next frame in the current stream buffer, filling |fhdr| with
-  // the parsed frame header and updating current segmentation and loop filter
-  // state.
-  // Return kOk if a frame has successfully been parsed,
-  //        kEOStream if there is no more data in the current stream buffer,
-  //        kAwaitingRefresh if this frame awaiting frame context update, or
-  //        kInvalidStream on error.
-  Result ParseNextFrame(Vp9FrameHeader* fhdr);
-
-  // Return current parsing context.
-  const Context& context() const { return context_; }
-
-  // Return a ContextRefreshCallback, which, if not null, has to be called with
-  // the new context state after the frame associated with |frame_context_idx|
-  // is decoded.
-  ContextRefreshCallback GetContextRefreshCb(size_t frame_context_idx);
-
-  // Clear parser state and return to an initialized state.
-  void Reset();
-
- private:
-  // Stores start pointer and size of each frame within the current superframe.
-  struct FrameInfo {
-    FrameInfo() = default;
-    FrameInfo(const uint8_t* ptr, off_t size);
-    bool IsValid() const { return ptr != NULL; }
-    void Reset() { ptr = NULL; }
-
-    // Starting address of the frame.
-    const uint8_t* ptr = NULL;
-
-    // Size of the frame in bytes.
-    off_t size = 0;
-  };
-
-  std::deque<FrameInfo> ParseSuperframe();
-
-  size_t GetQIndex(const Vp9QuantizationParams& quant, size_t segid) const;
-  void SetupSegmentationDequant();
-  void SetupLoopFilter();
-  void UpdateSlots();
-
-  // Current address in the bitstream buffer.
-  const uint8_t* stream_;
-
-  // Remaining bytes in stream_.
-  off_t bytes_left_;
-
-  bool parsing_compressed_header_;
-
-  // FrameInfo for the remaining frames in the current superframe to be parsed.
-  std::deque<FrameInfo> frames_;
-
-  Context context_;
-
-  FrameInfo curr_frame_info_;
-  Vp9FrameHeader curr_frame_header_;
-
-  DISALLOW_COPY_AND_ASSIGN(Vp9Parser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_VP9_PARSER_H_
diff --git a/cobalt/media/filters/vp9_parser_fuzzertest.cc b/cobalt/media/filters/vp9_parser_fuzzertest.cc
deleted file mode 100644
index 9daf77d..0000000
--- a/cobalt/media/filters/vp9_parser_fuzzertest.cc
+++ /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.
-
-#include "base/numerics/safe_conversions.h"
-#include "cobalt/media/filters/ivf_parser.h"
-#include "cobalt/media/filters/vp9_parser.h"
-#include "starboard/types.h"
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  const uint8_t* ivf_payload = NULL;
-  media::IvfParser ivf_parser;
-  media::IvfFileHeader ivf_file_header;
-  media::IvfFrameHeader ivf_frame_header;
-
-  if (!ivf_parser.Initialize(data, size, &ivf_file_header)) return 0;
-
-  // Parse until the end of stream/unsupported stream/error in stream is found.
-  while (ivf_parser.ParseNextFrame(&ivf_frame_header, &ivf_payload)) {
-    // TODO(kcwu): fuzzing with parsing_compressed_header=true.
-    media::Vp9Parser vp9_parser(false);
-    media::Vp9FrameHeader vp9_frame_header;
-    vp9_parser.SetStream(ivf_payload, ivf_frame_header.frame_size);
-    while (vp9_parser.ParseNextFrame(&vp9_frame_header) ==
-           media::Vp9Parser::kOk) {
-      // Repeat until all frames processed.
-    }
-  }
-
-  return 0;
-}
diff --git a/cobalt/media/filters/vp9_parser_unittest.cc b/cobalt/media/filters/vp9_parser_unittest.cc
deleted file mode 100644
index 3df5f61..0000000
--- a/cobalt/media/filters/vp9_parser_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.
-
-// For each sample vp9 test video, $filename, there is a file of golden value
-// of frame entropy, named $filename.context. These values are dumped from
-// libvpx.
-//
-// The syntax of these context dump is described as follows.  For every
-// frame, there are corresponding data in context file,
-// 1. [initial] [current] [should_update=0], or
-// 2. [initial] [current] [should_update=1] [update]
-// The first two are expected frame entropy, fhdr->initial_frame_context and
-// fhdr->frame_context.
-// If |should_update| is true, it follows by the frame context to update.
-#include <string.h>
-
-#include <memory>
-#include <string>
-
-#include "base/files/memory_mapped_file.h"
-#include "base/logging.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/filters/ivf_parser.h"
-#include "cobalt/media/filters/vp9_parser.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class Vp9ParserTest : public ::testing::Test {
- protected:
-  void TearDown() override {
-    stream_.reset();
-    vp9_parser_.reset();
-    context_file_.Close();
-  }
-
-  void Initialize(const std::string& filename, bool parsing_compressed_header) {
-    base::FilePath file_path = GetTestDataFilePath(filename);
-
-    stream_.reset(new base::MemoryMappedFile());
-    ASSERT_TRUE(stream_->Initialize(file_path))
-        << "Couldn't open stream file: " << file_path.MaybeAsASCII();
-
-    IvfFileHeader ivf_file_header;
-    ASSERT_TRUE(ivf_parser_.Initialize(stream_->data(), stream_->length(),
-                                       &ivf_file_header));
-    ASSERT_EQ(ivf_file_header.fourcc, 0x30395056u);  // VP90
-
-    vp9_parser_.reset(new Vp9Parser(parsing_compressed_header));
-
-    if (parsing_compressed_header) {
-      base::FilePath context_path = GetTestDataFilePath(filename + ".context");
-      context_file_.Initialize(context_path,
-                               base::File::FLAG_OPEN | base::File::FLAG_READ);
-      ASSERT_TRUE(context_file_.IsValid());
-    }
-  }
-
-  bool ReadShouldContextUpdate() {
-    char should_update;
-    int read_num = context_file_.ReadAtCurrentPos(&should_update, 1);
-    CHECK_EQ(1, read_num);
-    return should_update != 0;
-  }
-
-  void ReadContext(Vp9FrameContext* frame_context) {
-    ASSERT_EQ(
-        static_cast<int>(sizeof(*frame_context)),
-        context_file_.ReadAtCurrentPos(reinterpret_cast<char*>(frame_context),
-                                       sizeof(*frame_context)));
-  }
-
-  Vp9Parser::Result ParseNextFrame(struct Vp9FrameHeader* frame_hdr);
-
-  const Vp9SegmentationParams& GetSegmentation() const {
-    return vp9_parser_->context().segmentation();
-  }
-
-  const Vp9LoopFilterParams& GetLoopFilter() const {
-    return vp9_parser_->context().loop_filter();
-  }
-
-  Vp9Parser::ContextRefreshCallback GetContextRefreshCb(
-      const Vp9FrameHeader& frame_hdr) const {
-    return vp9_parser_->GetContextRefreshCb(frame_hdr.frame_context_idx);
-  }
-
-  IvfParser ivf_parser_;
-  std::unique_ptr<base::MemoryMappedFile> stream_;
-
-  std::unique_ptr<Vp9Parser> vp9_parser_;
-  base::File context_file_;
-};
-
-Vp9Parser::Result Vp9ParserTest::ParseNextFrame(Vp9FrameHeader* fhdr) {
-  while (1) {
-    Vp9Parser::Result res = vp9_parser_->ParseNextFrame(fhdr);
-    if (res == Vp9Parser::kEOStream) {
-      IvfFrameHeader ivf_frame_header;
-      const uint8_t* ivf_payload;
-
-      if (!ivf_parser_.ParseNextFrame(&ivf_frame_header, &ivf_payload))
-        return Vp9Parser::kEOStream;
-
-      vp9_parser_->SetStream(ivf_payload, ivf_frame_header.frame_size);
-      continue;
-    }
-
-    return res;
-  }
-}
-
-TEST_F(Vp9ParserTest, StreamFileParsingWithoutCompressedHeader) {
-  Initialize("test-25fps.vp9", false);
-
-  // Number of frames in the test stream to be parsed.
-  const int num_expected_frames = 269;
-  int num_parsed_frames = 0;
-
-  // Allow to parse twice as many frames in order to detect any extra frames
-  // parsed.
-  while (num_parsed_frames < num_expected_frames * 2) {
-    Vp9FrameHeader fhdr;
-    if (ParseNextFrame(&fhdr) != Vp9Parser::kOk) break;
-
-    ++num_parsed_frames;
-  }
-
-  DVLOG(1) << "Number of successfully parsed frames before EOS: "
-           << num_parsed_frames;
-
-  EXPECT_EQ(num_expected_frames, num_parsed_frames);
-}
-
-TEST_F(Vp9ParserTest, StreamFileParsingWithCompressedHeader) {
-  Initialize("test-25fps.vp9", true);
-
-  // Number of frames in the test stream to be parsed.
-  const int num_expected_frames = 269;
-  int num_parsed_frames = 0;
-
-  // Allow to parse twice as many frames in order to detect any extra frames
-  // parsed.
-  while (num_parsed_frames < num_expected_frames * 2) {
-    Vp9FrameHeader fhdr;
-    if (ParseNextFrame(&fhdr) != Vp9Parser::kOk) break;
-
-    Vp9FrameContext frame_context;
-    ReadContext(&frame_context);
-    EXPECT_TRUE(memcmp(&frame_context, &fhdr.initial_frame_context,
-                                sizeof(frame_context)) == 0);
-    ReadContext(&frame_context);
-    EXPECT_TRUE(memcmp(&frame_context, &fhdr.frame_context,
-                       sizeof(frame_context)) == 0);
-
-    // test-25fps.vp9 doesn't need frame update from driver.
-    auto context_refresh_cb = GetContextRefreshCb(fhdr);
-    EXPECT_TRUE(context_refresh_cb.is_null());
-    ASSERT_FALSE(ReadShouldContextUpdate());
-
-    ++num_parsed_frames;
-  }
-
-  DVLOG(1) << "Number of successfully parsed frames before EOS: "
-           << num_parsed_frames;
-
-  EXPECT_EQ(num_expected_frames, num_parsed_frames);
-}
-
-TEST_F(Vp9ParserTest, StreamFileParsingWithContextUpdate) {
-  Initialize("bear-vp9.ivf", true);
-
-  // Number of frames in the test stream to be parsed.
-  const int num_expected_frames = 82;
-  int num_parsed_frames = 0;
-
-  // Allow to parse twice as many frames in order to detect any extra frames
-  // parsed.
-  while (num_parsed_frames < num_expected_frames * 2) {
-    Vp9FrameHeader fhdr;
-    if (ParseNextFrame(&fhdr) != Vp9Parser::kOk) break;
-
-    Vp9FrameContext frame_context;
-    ReadContext(&frame_context);
-    EXPECT_TRUE(memcmp(&frame_context, &fhdr.initial_frame_context,
-                                sizeof(frame_context)) == 0);
-    ReadContext(&frame_context);
-    EXPECT_TRUE(memcmp(&frame_context, &fhdr.frame_context,
-                       sizeof(frame_context)) == 0);
-
-    bool should_update = ReadShouldContextUpdate();
-    auto context_refresh_cb = GetContextRefreshCb(fhdr);
-    if (context_refresh_cb.is_null()) {
-      EXPECT_FALSE(should_update);
-    } else {
-      EXPECT_TRUE(should_update);
-      ReadContext(&frame_context);
-      context_refresh_cb.Run(frame_context);
-    }
-
-    ++num_parsed_frames;
-  }
-
-  DVLOG(1) << "Number of successfully parsed frames before EOS: "
-           << num_parsed_frames;
-
-  EXPECT_EQ(num_expected_frames, num_parsed_frames);
-}
-
-TEST_F(Vp9ParserTest, AwaitingContextUpdate) {
-  Initialize("bear-vp9.ivf", true);
-
-  Vp9FrameHeader fhdr;
-  ASSERT_EQ(Vp9Parser::kOk, ParseNextFrame(&fhdr));
-
-  Vp9FrameContext frame_context;
-  ReadContext(&frame_context);
-  ReadContext(&frame_context);
-  bool should_update = ReadShouldContextUpdate();
-  ASSERT_TRUE(should_update);
-  ReadContext(&frame_context);
-
-  // Not update yet. Should return kAwaitingRefresh.
-  EXPECT_EQ(Vp9Parser::kAwaitingRefresh, ParseNextFrame(&fhdr));
-  EXPECT_EQ(Vp9Parser::kAwaitingRefresh, ParseNextFrame(&fhdr));
-
-  // After update, parse should be ok.
-  auto context_refresh_cb = GetContextRefreshCb(fhdr);
-  EXPECT_FALSE(context_refresh_cb.is_null());
-  context_refresh_cb.Run(frame_context);
-  EXPECT_EQ(Vp9Parser::kOk, ParseNextFrame(&fhdr));
-
-  // Make sure it parsed the 2nd frame.
-  EXPECT_EQ(9u, fhdr.header_size_in_bytes);
-}
-
-TEST_F(Vp9ParserTest, VerifyFirstFrame) {
-  Initialize("test-25fps.vp9", false);
-  Vp9FrameHeader fhdr;
-
-  ASSERT_EQ(Vp9Parser::kOk, ParseNextFrame(&fhdr));
-
-  EXPECT_EQ(0, fhdr.profile);
-  EXPECT_FALSE(fhdr.show_existing_frame);
-  EXPECT_EQ(Vp9FrameHeader::KEYFRAME, fhdr.frame_type);
-  EXPECT_TRUE(fhdr.show_frame);
-  EXPECT_FALSE(fhdr.error_resilient_mode);
-
-  EXPECT_EQ(8, fhdr.bit_depth);
-  EXPECT_EQ(Vp9ColorSpace::UNKNOWN, fhdr.color_space);
-  EXPECT_FALSE(fhdr.color_range);
-  EXPECT_EQ(1, fhdr.subsampling_x);
-  EXPECT_EQ(1, fhdr.subsampling_y);
-
-  EXPECT_EQ(320u, fhdr.frame_width);
-  EXPECT_EQ(240u, fhdr.frame_height);
-  EXPECT_EQ(320u, fhdr.render_width);
-  EXPECT_EQ(240u, fhdr.render_height);
-
-  EXPECT_TRUE(fhdr.refresh_frame_context);
-  EXPECT_TRUE(fhdr.frame_parallel_decoding_mode);
-  EXPECT_EQ(0, fhdr.frame_context_idx_to_save_probs);
-
-  const Vp9LoopFilterParams& lf = GetLoopFilter();
-  EXPECT_EQ(9, lf.level);
-  EXPECT_EQ(0, lf.sharpness);
-  EXPECT_TRUE(lf.delta_enabled);
-  EXPECT_TRUE(lf.delta_update);
-  EXPECT_TRUE(lf.update_ref_deltas[0]);
-  EXPECT_EQ(1, lf.ref_deltas[0]);
-  EXPECT_EQ(-1, lf.ref_deltas[2]);
-  EXPECT_EQ(-1, lf.ref_deltas[3]);
-
-  const Vp9QuantizationParams& qp = fhdr.quant_params;
-  EXPECT_EQ(65, qp.base_q_idx);
-  EXPECT_FALSE(qp.delta_q_y_dc);
-  EXPECT_FALSE(qp.delta_q_uv_dc);
-  EXPECT_FALSE(qp.delta_q_uv_ac);
-  EXPECT_FALSE(qp.IsLossless());
-
-  const Vp9SegmentationParams& seg = GetSegmentation();
-  EXPECT_FALSE(seg.enabled);
-
-  EXPECT_EQ(0, fhdr.tile_cols_log2);
-  EXPECT_EQ(0, fhdr.tile_rows_log2);
-
-  EXPECT_EQ(120u, fhdr.header_size_in_bytes);
-  EXPECT_EQ(18u, fhdr.uncompressed_header_size);
-}
-
-TEST_F(Vp9ParserTest, VerifyInterFrame) {
-  Initialize("test-25fps.vp9", false);
-  Vp9FrameHeader fhdr;
-
-  // To verify the second frame.
-  for (int i = 0; i < 2; i++) ASSERT_EQ(Vp9Parser::kOk, ParseNextFrame(&fhdr));
-
-  EXPECT_EQ(Vp9FrameHeader::INTERFRAME, fhdr.frame_type);
-  EXPECT_FALSE(fhdr.show_frame);
-  EXPECT_FALSE(fhdr.intra_only);
-  EXPECT_FALSE(fhdr.reset_frame_context);
-  EXPECT_TRUE(fhdr.RefreshFlag(2));
-  EXPECT_EQ(0, fhdr.ref_frame_idx[0]);
-  EXPECT_EQ(1, fhdr.ref_frame_idx[1]);
-  EXPECT_EQ(2, fhdr.ref_frame_idx[2]);
-  EXPECT_TRUE(fhdr.allow_high_precision_mv);
-  EXPECT_EQ(Vp9InterpolationFilter::EIGHTTAP, fhdr.interpolation_filter);
-
-  EXPECT_EQ(48u, fhdr.header_size_in_bytes);
-  EXPECT_EQ(11u, fhdr.uncompressed_header_size);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp9_raw_bits_reader.cc b/cobalt/media/filters/vp9_raw_bits_reader.cc
deleted file mode 100644
index 52d071b..0000000
--- a/cobalt/media/filters/vp9_raw_bits_reader.cc
+++ /dev/null
@@ -1,62 +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 "cobalt/media/filters/vp9_raw_bits_reader.h"
-
-#include <limits.h>
-
-#include "base/logging.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-Vp9RawBitsReader::Vp9RawBitsReader() : valid_(true) {}
-
-Vp9RawBitsReader::~Vp9RawBitsReader() {}
-
-void Vp9RawBitsReader::Initialize(const uint8_t* data, size_t size) {
-  DCHECK(data);
-  reader_.reset(new BitReader(data, size));
-  valid_ = true;
-}
-
-bool Vp9RawBitsReader::ReadBool() {
-  DCHECK(reader_);
-  if (!valid_) return false;
-
-  int value = 0;
-  valid_ = reader_->ReadBits(1, &value);
-  return valid_ ? value == 1 : false;
-}
-
-int Vp9RawBitsReader::ReadLiteral(int bits) {
-  DCHECK(reader_);
-  if (!valid_) return 0;
-
-  int value = 0;
-  DCHECK_LT(static_cast<size_t>(bits), sizeof(value) * 8);
-  valid_ = reader_->ReadBits(bits, &value);
-  return valid_ ? value : 0;
-}
-
-int Vp9RawBitsReader::ReadSignedLiteral(int bits) {
-  int value = ReadLiteral(bits);
-  return ReadBool() ? -value : value;
-}
-
-size_t Vp9RawBitsReader::GetBytesRead() const {
-  DCHECK(reader_);
-  return (reader_->bits_read() + 7) / 8;
-}
-
-bool Vp9RawBitsReader::ConsumeTrailingBits() {
-  DCHECK(reader_);
-  int bits_left = GetBytesRead() * 8 - reader_->bits_read();
-  return ReadLiteral(bits_left) == 0;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp9_raw_bits_reader.h b/cobalt/media/filters/vp9_raw_bits_reader.h
deleted file mode 100644
index 848f83c..0000000
--- a/cobalt/media/filters/vp9_raw_bits_reader.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FILTERS_VP9_RAW_BITS_READER_H_
-#define COBALT_MEDIA_FILTERS_VP9_RAW_BITS_READER_H_
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class BitReader;
-
-// A class to read raw bits stream. See VP9 spec, "RAW-BITS DECODING" section
-// for detail.
-class MEDIA_EXPORT Vp9RawBitsReader {
- public:
-  Vp9RawBitsReader();
-  ~Vp9RawBitsReader();
-
-  // |data| is the input buffer with |size| bytes.
-  void Initialize(const uint8_t* data, size_t size);
-
-  // Returns true if none of the reads since the last Initialize() call has
-  // gone beyond the end of available data.
-  bool IsValid() const { return valid_; }
-
-  // Returns how many bytes were read since the last Initialize() call.
-  // Partial bytes will be counted as one byte. For example, it will return 1
-  // if 3 bits were read.
-  size_t GetBytesRead() const;
-
-  // Reads one bit.
-  // If the read goes beyond the end of buffer, the return value is undefined.
-  bool ReadBool();
-
-  // Reads a literal with |bits| bits.
-  // If the read goes beyond the end of buffer, the return value is undefined.
-  int ReadLiteral(int bits);
-
-  // Reads a signed literal with |bits| bits (not including the sign bit).
-  // If the read goes beyond the end of buffer, the return value is undefined.
-  int ReadSignedLiteral(int bits);
-
-  // Consumes trailing bits up to next byte boundary. Returns true if no
-  // trailing bits or they are all zero.
-  bool ConsumeTrailingBits();
-
- private:
-  std::unique_ptr<BitReader> reader_;
-
-  // Indicates if none of the reads since the last Initialize() call has gone
-  // beyond the end of available data.
-  bool valid_;
-
-  DISALLOW_COPY_AND_ASSIGN(Vp9RawBitsReader);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_VP9_RAW_BITS_READER_H_
diff --git a/cobalt/media/filters/vp9_raw_bits_reader_unittest.cc b/cobalt/media/filters/vp9_raw_bits_reader_unittest.cc
deleted file mode 100644
index de98089..0000000
--- a/cobalt/media/filters/vp9_raw_bits_reader_unittest.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 "cobalt/media/filters/vp9_raw_bits_reader.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-TEST(Vp9RawBitsReaderTest, ReadBool) {
-  uint8_t data[] = {0xf1};
-  Vp9RawBitsReader reader;
-  reader.Initialize(data, 1);
-
-  EXPECT_TRUE(reader.IsValid());
-  EXPECT_EQ(0u, reader.GetBytesRead());
-  EXPECT_TRUE(reader.ReadBool());
-  EXPECT_EQ(1u, reader.GetBytesRead());
-  EXPECT_TRUE(reader.ReadBool());
-  EXPECT_TRUE(reader.ReadBool());
-  EXPECT_TRUE(reader.ReadBool());
-  EXPECT_FALSE(reader.ReadBool());
-  EXPECT_FALSE(reader.ReadBool());
-  EXPECT_FALSE(reader.ReadBool());
-  EXPECT_TRUE(reader.ReadBool());
-  EXPECT_TRUE(reader.IsValid());
-
-  // The return value is undefined.
-  ignore_result(reader.ReadBool());
-  EXPECT_FALSE(reader.IsValid());
-  EXPECT_EQ(1u, reader.GetBytesRead());
-}
-
-TEST(Vp9RawBitsReader, ReadLiteral) {
-  uint8_t data[] = {0x3d, 0x67, 0x9a};
-  Vp9RawBitsReader reader;
-  reader.Initialize(data, 3);
-
-  EXPECT_TRUE(reader.IsValid());
-  EXPECT_EQ(0x03, reader.ReadLiteral(4));
-  EXPECT_EQ(0xd679, reader.ReadLiteral(16));
-  EXPECT_TRUE(reader.IsValid());
-
-  // The return value is undefined.
-  ignore_result(reader.ReadLiteral(8));
-  EXPECT_FALSE(reader.IsValid());
-  EXPECT_EQ(3u, reader.GetBytesRead());
-}
-
-TEST(Vp9RawBitsReader, ReadSignedLiteral) {
-  uint8_t data[] = {0x3d, 0x67, 0x9a};
-  Vp9RawBitsReader reader;
-  reader.Initialize(data, 3);
-
-  EXPECT_TRUE(reader.IsValid());
-  EXPECT_EQ(-0x03, reader.ReadSignedLiteral(4));
-  EXPECT_EQ(-0x5679, reader.ReadSignedLiteral(15));
-  EXPECT_TRUE(reader.IsValid());
-
-  // The return value is undefined.
-  ignore_result(reader.ReadSignedLiteral(7));
-  EXPECT_FALSE(reader.IsValid());
-  EXPECT_EQ(3u, reader.GetBytesRead());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp9_uncompressed_header_parser.cc b/cobalt/media/filters/vp9_uncompressed_header_parser.cc
deleted file mode 100644
index cac65ed..0000000
--- a/cobalt/media/filters/vp9_uncompressed_header_parser.cc
+++ /dev/null
@@ -1,1086 +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 "cobalt/media/filters/vp9_uncompressed_header_parser.h"
-
-#include "base/logging.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-// 10.5 Default probability tables
-Vp9FrameContext kVp9DefaultFrameContext = {
-    // tx_probs_8x8
-    {{100}, {66}},
-    // tx_probs_16x16
-    {{20, 152}, {15, 101}},
-    // tx_probs_32x32
-    {{3, 136, 37}, {5, 52, 13}},
-    // coef_probs
-    {// 4x4
-     {{{{{195, 29, 183}, {84, 49, 136}, {8, 42, 71}},
-        {{31, 107, 169},
-         {35, 99, 159},
-         {17, 82, 140},
-         {8, 66, 114},
-         {2, 44, 76},
-         {1, 19, 32}},
-        {{40, 132, 201},
-         {29, 114, 187},
-         {13, 91, 157},
-         {7, 75, 127},
-         {3, 58, 95},
-         {1, 28, 47}},
-        {{69, 142, 221},
-         {42, 122, 201},
-         {15, 91, 159},
-         {6, 67, 121},
-         {1, 42, 77},
-         {1, 17, 31}},
-        {{102, 148, 228},
-         {67, 117, 204},
-         {17, 82, 154},
-         {6, 59, 114},
-         {2, 39, 75},
-         {1, 15, 29}},
-        {{156, 57, 233},
-         {119, 57, 212},
-         {58, 48, 163},
-         {29, 40, 124},
-         {12, 30, 81},
-         {3, 12, 31}}},
-       {{{191, 107, 226}, {124, 117, 204}, {25, 99, 155}},
-        {{29, 148, 210},
-         {37, 126, 194},
-         {8, 93, 157},
-         {2, 68, 118},
-         {1, 39, 69},
-         {1, 17, 33}},
-        {{41, 151, 213},
-         {27, 123, 193},
-         {3, 82, 144},
-         {1, 58, 105},
-         {1, 32, 60},
-         {1, 13, 26}},
-        {{59, 159, 220},
-         {23, 126, 198},
-         {4, 88, 151},
-         {1, 66, 114},
-         {1, 38, 71},
-         {1, 18, 34}},
-        {{114, 136, 232},
-         {51, 114, 207},
-         {11, 83, 155},
-         {3, 56, 105},
-         {1, 33, 65},
-         {1, 17, 34}},
-        {{149, 65, 234},
-         {121, 57, 215},
-         {61, 49, 166},
-         {28, 36, 114},
-         {12, 25, 76},
-         {3, 16, 42}}}},
-      {{{{214, 49, 220}, {132, 63, 188}, {42, 65, 137}},
-        {{85, 137, 221},
-         {104, 131, 216},
-         {49, 111, 192},
-         {21, 87, 155},
-         {2, 49, 87},
-         {1, 16, 28}},
-        {{89, 163, 230},
-         {90, 137, 220},
-         {29, 100, 183},
-         {10, 70, 135},
-         {2, 42, 81},
-         {1, 17, 33}},
-        {{108, 167, 237},
-         {55, 133, 222},
-         {15, 97, 179},
-         {4, 72, 135},
-         {1, 45, 85},
-         {1, 19, 38}},
-        {{124, 146, 240},
-         {66, 124, 224},
-         {17, 88, 175},
-         {4, 58, 122},
-         {1, 36, 75},
-         {1, 18, 37}},
-        {{141, 79, 241},
-         {126, 70, 227},
-         {66, 58, 182},
-         {30, 44, 136},
-         {12, 34, 96},
-         {2, 20, 47}}},
-       {{{229, 99, 249}, {143, 111, 235}, {46, 109, 192}},
-        {{82, 158, 236},
-         {94, 146, 224},
-         {25, 117, 191},
-         {9, 87, 149},
-         {3, 56, 99},
-         {1, 33, 57}},
-        {{83, 167, 237},
-         {68, 145, 222},
-         {10, 103, 177},
-         {2, 72, 131},
-         {1, 41, 79},
-         {1, 20, 39}},
-        {{99, 167, 239},
-         {47, 141, 224},
-         {10, 104, 178},
-         {2, 73, 133},
-         {1, 44, 85},
-         {1, 22, 47}},
-        {{127, 145, 243},
-         {71, 129, 228},
-         {17, 93, 177},
-         {3, 61, 124},
-         {1, 41, 84},
-         {1, 21, 52}},
-        {{157, 78, 244},
-         {140, 72, 231},
-         {69, 58, 184},
-         {31, 44, 137},
-         {14, 38, 105},
-         {8, 23, 61}}}}},
-     // 8x8
-     {{{{{125, 34, 187}, {52, 41, 133}, {6, 31, 56}},
-        {{37, 109, 153},
-         {51, 102, 147},
-         {23, 87, 128},
-         {8, 67, 101},
-         {1, 41, 63},
-         {1, 19, 29}},
-        {{31, 154, 185},
-         {17, 127, 175},
-         {6, 96, 145},
-         {2, 73, 114},
-         {1, 51, 82},
-         {1, 28, 45}},
-        {{23, 163, 200},
-         {10, 131, 185},
-         {2, 93, 148},
-         {1, 67, 111},
-         {1, 41, 69},
-         {1, 14, 24}},
-        {{29, 176, 217},
-         {12, 145, 201},
-         {3, 101, 156},
-         {1, 69, 111},
-         {1, 39, 63},
-         {1, 14, 23}},
-        {{57, 192, 233},
-         {25, 154, 215},
-         {6, 109, 167},
-         {3, 78, 118},
-         {1, 48, 69},
-         {1, 21, 29}}},
-       {{{202, 105, 245}, {108, 106, 216}, {18, 90, 144}},
-        {{33, 172, 219},
-         {64, 149, 206},
-         {14, 117, 177},
-         {5, 90, 141},
-         {2, 61, 95},
-         {1, 37, 57}},
-        {{33, 179, 220},
-         {11, 140, 198},
-         {1, 89, 148},
-         {1, 60, 104},
-         {1, 33, 57},
-         {1, 12, 21}},
-        {{30, 181, 221},
-         {8, 141, 198},
-         {1, 87, 145},
-         {1, 58, 100},
-         {1, 31, 55},
-         {1, 12, 20}},
-        {{32, 186, 224},
-         {7, 142, 198},
-         {1, 86, 143},
-         {1, 58, 100},
-         {1, 31, 55},
-         {1, 12, 22}},
-        {{57, 192, 227},
-         {20, 143, 204},
-         {3, 96, 154},
-         {1, 68, 112},
-         {1, 42, 69},
-         {1, 19, 32}}}},
-      {{{{212, 35, 215}, {113, 47, 169}, {29, 48, 105}},
-        {{74, 129, 203},
-         {106, 120, 203},
-         {49, 107, 178},
-         {19, 84, 144},
-         {4, 50, 84},
-         {1, 15, 25}},
-        {{71, 172, 217},
-         {44, 141, 209},
-         {15, 102, 173},
-         {6, 76, 133},
-         {2, 51, 89},
-         {1, 24, 42}},
-        {{64, 185, 231},
-         {31, 148, 216},
-         {8, 103, 175},
-         {3, 74, 131},
-         {1, 46, 81},
-         {1, 18, 30}},
-        {{65, 196, 235},
-         {25, 157, 221},
-         {5, 105, 174},
-         {1, 67, 120},
-         {1, 38, 69},
-         {1, 15, 30}},
-        {{65, 204, 238},
-         {30, 156, 224},
-         {7, 107, 177},
-         {2, 70, 124},
-         {1, 42, 73},
-         {1, 18, 34}}},
-       {{{225, 86, 251}, {144, 104, 235}, {42, 99, 181}},
-        {{85, 175, 239},
-         {112, 165, 229},
-         {29, 136, 200},
-         {12, 103, 162},
-         {6, 77, 123},
-         {2, 53, 84}},
-        {{75, 183, 239},
-         {30, 155, 221},
-         {3, 106, 171},
-         {1, 74, 128},
-         {1, 44, 76},
-         {1, 17, 28}},
-        {{73, 185, 240},
-         {27, 159, 222},
-         {2, 107, 172},
-         {1, 75, 127},
-         {1, 42, 73},
-         {1, 17, 29}},
-        {{62, 190, 238},
-         {21, 159, 222},
-         {2, 107, 172},
-         {1, 72, 122},
-         {1, 40, 71},
-         {1, 18, 32}},
-        {{61, 199, 240},
-         {27, 161, 226},
-         {4, 113, 180},
-         {1, 76, 129},
-         {1, 46, 80},
-         {1, 23, 41}}}}},
-     // 16x16
-     {{{{{7, 27, 153}, {5, 30, 95}, {1, 16, 30}},
-        {{50, 75, 127},
-         {57, 75, 124},
-         {27, 67, 108},
-         {10, 54, 86},
-         {1, 33, 52},
-         {1, 12, 18}},
-        {{43, 125, 151},
-         {26, 108, 148},
-         {7, 83, 122},
-         {2, 59, 89},
-         {1, 38, 60},
-         {1, 17, 27}},
-        {{23, 144, 163},
-         {13, 112, 154},
-         {2, 75, 117},
-         {1, 50, 81},
-         {1, 31, 51},
-         {1, 14, 23}},
-        {{18, 162, 185},
-         {6, 123, 171},
-         {1, 78, 125},
-         {1, 51, 86},
-         {1, 31, 54},
-         {1, 14, 23}},
-        {{15, 199, 227},
-         {3, 150, 204},
-         {1, 91, 146},
-         {1, 55, 95},
-         {1, 30, 53},
-         {1, 11, 20}}},
-       {{{19, 55, 240}, {19, 59, 196}, {3, 52, 105}},
-        {{41, 166, 207},
-         {104, 153, 199},
-         {31, 123, 181},
-         {14, 101, 152},
-         {5, 72, 106},
-         {1, 36, 52}},
-        {{35, 176, 211},
-         {12, 131, 190},
-         {2, 88, 144},
-         {1, 60, 101},
-         {1, 36, 60},
-         {1, 16, 28}},
-        {{28, 183, 213},
-         {8, 134, 191},
-         {1, 86, 142},
-         {1, 56, 96},
-         {1, 30, 53},
-         {1, 12, 20}},
-        {{20, 190, 215},
-         {4, 135, 192},
-         {1, 84, 139},
-         {1, 53, 91},
-         {1, 28, 49},
-         {1, 11, 20}},
-        {{13, 196, 216},
-         {2, 137, 192},
-         {1, 86, 143},
-         {1, 57, 99},
-         {1, 32, 56},
-         {1, 13, 24}}}},
-      {{{{211, 29, 217}, {96, 47, 156}, {22, 43, 87}},
-        {{78, 120, 193},
-         {111, 116, 186},
-         {46, 102, 164},
-         {15, 80, 128},
-         {2, 49, 76},
-         {1, 18, 28}},
-        {{71, 161, 203},
-         {42, 132, 192},
-         {10, 98, 150},
-         {3, 69, 109},
-         {1, 44, 70},
-         {1, 18, 29}},
-        {{57, 186, 211},
-         {30, 140, 196},
-         {4, 93, 146},
-         {1, 62, 102},
-         {1, 38, 65},
-         {1, 16, 27}},
-        {{47, 199, 217},
-         {14, 145, 196},
-         {1, 88, 142},
-         {1, 57, 98},
-         {1, 36, 62},
-         {1, 15, 26}},
-        {{26, 219, 229},
-         {5, 155, 207},
-         {1, 94, 151},
-         {1, 60, 104},
-         {1, 36, 62},
-         {1, 16, 28}}},
-       {{{233, 29, 248}, {146, 47, 220}, {43, 52, 140}},
-        {{100, 163, 232},
-         {179, 161, 222},
-         {63, 142, 204},
-         {37, 113, 174},
-         {26, 89, 137},
-         {18, 68, 97}},
-        {{85, 181, 230},
-         {32, 146, 209},
-         {7, 100, 164},
-         {3, 71, 121},
-         {1, 45, 77},
-         {1, 18, 30}},
-        {{65, 187, 230},
-         {20, 148, 207},
-         {2, 97, 159},
-         {1, 68, 116},
-         {1, 40, 70},
-         {1, 14, 29}},
-        {{40, 194, 227},
-         {8, 147, 204},
-         {1, 94, 155},
-         {1, 65, 112},
-         {1, 39, 66},
-         {1, 14, 26}},
-        {{16, 208, 228},
-         {3, 151, 207},
-         {1, 98, 160},
-         {1, 67, 117},
-         {1, 41, 74},
-         {1, 17, 31}}}}},
-     // 32x32
-     {{{{{17, 38, 140}, {7, 34, 80}, {1, 17, 29}},
-        {{37, 75, 128},
-         {41, 76, 128},
-         {26, 66, 116},
-         {12, 52, 94},
-         {2, 32, 55},
-         {1, 10, 16}},
-        {{50, 127, 154},
-         {37, 109, 152},
-         {16, 82, 121},
-         {5, 59, 85},
-         {1, 35, 54},
-         {1, 13, 20}},
-        {{40, 142, 167},
-         {17, 110, 157},
-         {2, 71, 112},
-         {1, 44, 72},
-         {1, 27, 45},
-         {1, 11, 17}},
-        {{30, 175, 188},
-         {9, 124, 169},
-         {1, 74, 116},
-         {1, 48, 78},
-         {1, 30, 49},
-         {1, 11, 18}},
-        {{10, 222, 223},
-         {2, 150, 194},
-         {1, 83, 128},
-         {1, 48, 79},
-         {1, 27, 45},
-         {1, 11, 17}}},
-       {{{36, 41, 235}, {29, 36, 193}, {10, 27, 111}},
-        {{85, 165, 222},
-         {177, 162, 215},
-         {110, 135, 195},
-         {57, 113, 168},
-         {23, 83, 120},
-         {10, 49, 61}},
-        {{85, 190, 223},
-         {36, 139, 200},
-         {5, 90, 146},
-         {1, 60, 103},
-         {1, 38, 65},
-         {1, 18, 30}},
-        {{72, 202, 223},
-         {23, 141, 199},
-         {2, 86, 140},
-         {1, 56, 97},
-         {1, 36, 61},
-         {1, 16, 27}},
-        {{55, 218, 225},
-         {13, 145, 200},
-         {1, 86, 141},
-         {1, 57, 99},
-         {1, 35, 61},
-         {1, 13, 22}},
-        {{15, 235, 212},
-         {1, 132, 184},
-         {1, 84, 139},
-         {1, 57, 97},
-         {1, 34, 56},
-         {1, 14, 23}}}},
-      {{{{181, 21, 201}, {61, 37, 123}, {10, 38, 71}},
-        {{47, 106, 172},
-         {95, 104, 173},
-         {42, 93, 159},
-         {18, 77, 131},
-         {4, 50, 81},
-         {1, 17, 23}},
-        {{62, 147, 199},
-         {44, 130, 189},
-         {28, 102, 154},
-         {18, 75, 115},
-         {2, 44, 65},
-         {1, 12, 19}},
-        {{55, 153, 210},
-         {24, 130, 194},
-         {3, 93, 146},
-         {1, 61, 97},
-         {1, 31, 50},
-         {1, 10, 16}},
-        {{49, 186, 223},
-         {17, 148, 204},
-         {1, 96, 142},
-         {1, 53, 83},
-         {1, 26, 44},
-         {1, 11, 17}},
-        {{13, 217, 212},
-         {2, 136, 180},
-         {1, 78, 124},
-         {1, 50, 83},
-         {1, 29, 49},
-         {1, 14, 23}}},
-       {{{197, 13, 247}, {82, 17, 222}, {25, 17, 162}},
-        {{126, 186, 247},
-         {234, 191, 243},
-         {176, 177, 234},
-         {104, 158, 220},
-         {66, 128, 186},
-         {55, 90, 137}},
-        {{111, 197, 242},
-         {46, 158, 219},
-         {9, 104, 171},
-         {2, 65, 125},
-         {1, 44, 80},
-         {1, 17, 91}},
-        {{104, 208, 245},
-         {39, 168, 224},
-         {3, 109, 162},
-         {1, 79, 124},
-         {1, 50, 102},
-         {1, 43, 102}},
-        {{84, 220, 246},
-         {31, 177, 231},
-         {2, 115, 180},
-         {1, 79, 134},
-         {1, 55, 77},
-         {1, 60, 79}},
-        {{43, 243, 240},
-         {8, 180, 217},
-         {1, 115, 166},
-         {1, 84, 121},
-         {1, 51, 67},
-         {1, 16, 6}}}}}},
-    // skip_prob
-    {192, 128, 64},
-    // inter_mode_probs
-    {{2, 173, 34},
-     {7, 145, 85},
-     {7, 166, 63},
-     {7, 94, 66},
-     {8, 64, 46},
-     {17, 81, 31},
-     {25, 29, 30}},
-    // interp_filter_probs
-    {{235, 162}, {36, 255}, {34, 3}, {149, 144}},
-    // is_inter_prob
-    {9, 102, 187, 225},
-    // comp_mode_prob
-    {239, 183, 119, 96, 41},
-    // single_ref_prob
-    {{33, 16}, {77, 74}, {142, 142}, {172, 170}, {238, 247}},
-    // comp_ref_prob
-    {50, 126, 123, 221, 226},
-    // y_mode_probs
-    {{65, 32, 18, 144, 162, 194, 41, 51, 98},
-     {132, 68, 18, 165, 217, 196, 45, 40, 78},
-     {173, 80, 19, 176, 240, 193, 64, 35, 46},
-     {221, 135, 38, 194, 248, 121, 96, 85, 29}},
-    // uv_mode_probs
-    {{120, 7, 76, 176, 208, 126, 28, 54, 103},
-     {48, 12, 154, 155, 139, 90, 34, 117, 119},
-     {67, 6, 25, 204, 243, 158, 13, 21, 96},
-     {97, 5, 44, 131, 176, 139, 48, 68, 97},
-     {83, 5, 42, 156, 111, 152, 26, 49, 152},
-     {80, 5, 58, 178, 74, 83, 33, 62, 145},
-     {86, 5, 32, 154, 192, 168, 14, 22, 163},
-     {85, 5, 32, 156, 216, 148, 19, 29, 73},
-     {77, 7, 64, 116, 132, 122, 37, 126, 120},
-     {101, 21, 107, 181, 192, 103, 19, 67, 125}},
-    // partition_probs
-    {{199, 122, 141},
-     {147, 63, 159},
-     {148, 133, 118},
-     {121, 104, 114},
-     {174, 73, 87},
-     {92, 41, 83},
-     {82, 99, 50},
-     {53, 39, 39},
-     {177, 58, 59},
-     {68, 26, 63},
-     {52, 79, 25},
-     {17, 14, 12},
-     {222, 34, 30},
-     {72, 16, 44},
-     {58, 32, 12},
-     {10, 7, 6}},
-    // mv_joint_probs
-    {32, 64, 96},
-    // mv_sign_prob
-    {128, 128},
-    // mv_class_probs
-    {{224, 144, 192, 168, 192, 176, 192, 198, 198, 245},
-     {216, 128, 176, 160, 176, 176, 192, 198, 198, 208}},
-    // mv_class0_bit_prob
-    {216, 208},
-    // mv_bits_prob
-    {{136, 140, 148, 160, 176, 192, 224, 234, 234, 240},
-     {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}},
-    // mv_class0_fr_probs
-    {{{128, 128, 64}, {96, 112, 64}}, {{128, 128, 64}, {96, 112, 64}}},
-    // mv_fr_probs
-    {{64, 96, 64}, {64, 96, 64}},
-    // mv_class0_hp_prob
-    {160, 160},
-    // mv_hp_prob
-    {128, 128},
-};
-
-// Helper function for Vp9Parser::ReadTileInfo. Defined as
-// calc_min_log2_tile_cols in spec 6.2.14 Tile size calculation.
-int GetMinLog2TileCols(int sb64_cols) {
-  const int kMaxTileWidthB64 = 64;
-  int min_log2 = 0;
-  while ((kMaxTileWidthB64 << min_log2) < sb64_cols) min_log2++;
-  return min_log2;
-}
-
-// Helper function for Vp9Parser::ReadTileInfo. Defined as
-// calc_max_log2_tile_cols in spec 6.2.14 Tile size calculation.
-int GetMaxLog2TileCols(int sb64_cols) {
-  const int kMinTileWidthB64 = 4;
-  int max_log2 = 1;
-  while ((sb64_cols >> max_log2) >= kMinTileWidthB64) max_log2++;
-  return max_log2 - 1;
-}
-
-}  // namespace
-
-Vp9UncompressedHeaderParser::Vp9UncompressedHeaderParser(
-    Vp9Parser::Context* context)
-    : context_(context) {}
-
-uint8_t Vp9UncompressedHeaderParser::ReadProfile() {
-  uint8_t profile = 0;
-
-  // LSB first.
-  if (reader_.ReadBool()) profile |= 1;
-  if (reader_.ReadBool()) profile |= 2;
-  if (profile > 2 && reader_.ReadBool()) profile += 1;
-  return profile;
-}
-
-// 6.2.1 Frame sync syntax
-bool Vp9UncompressedHeaderParser::VerifySyncCode() {
-  const int kSyncCode = 0x498342;
-  if (reader_.ReadLiteral(8 * 3) != kSyncCode) {
-    DVLOG(1) << "Invalid frame sync code";
-    return false;
-  }
-  return true;
-}
-
-// 6.2.2 Color config syntax
-bool Vp9UncompressedHeaderParser::ReadColorConfig(Vp9FrameHeader* fhdr) {
-  if (fhdr->profile == 2 || fhdr->profile == 3) {
-    fhdr->bit_depth = reader_.ReadBool() ? 12 : 10;
-  } else {
-    fhdr->bit_depth = 8;
-  }
-
-  fhdr->color_space = static_cast<Vp9ColorSpace>(reader_.ReadLiteral(3));
-  if (fhdr->color_space != Vp9ColorSpace::SRGB) {
-    fhdr->color_range = reader_.ReadBool();
-    if (fhdr->profile == 1 || fhdr->profile == 3) {
-      fhdr->subsampling_x = reader_.ReadBool() ? 1 : 0;
-      fhdr->subsampling_y = reader_.ReadBool() ? 1 : 0;
-      if (fhdr->subsampling_x == 1 && fhdr->subsampling_y == 1) {
-        DVLOG(1) << "4:2:0 color not supported in profile 1 or 3";
-        return false;
-      }
-      bool reserved = reader_.ReadBool();
-      if (reserved) {
-        DVLOG(1) << "reserved bit set";
-        return false;
-      }
-    } else {
-      fhdr->subsampling_x = fhdr->subsampling_y = 1;
-    }
-  } else {
-    fhdr->color_range = true;
-    if (fhdr->profile == 1 || fhdr->profile == 3) {
-      fhdr->subsampling_x = fhdr->subsampling_y = 0;
-
-      bool reserved = reader_.ReadBool();
-      if (reserved) {
-        DVLOG(1) << "reserved bit set";
-        return false;
-      }
-    } else {
-      DVLOG(1) << "4:4:4 color not supported in profile 0 or 2";
-      return false;
-    }
-  }
-
-  return true;
-}
-
-// 6.2.3 Frame size syntax
-void Vp9UncompressedHeaderParser::ReadFrameSize(Vp9FrameHeader* fhdr) {
-  fhdr->frame_width = reader_.ReadLiteral(16) + 1;
-  fhdr->frame_height = reader_.ReadLiteral(16) + 1;
-}
-
-// 6.2.4 Render size syntax
-void Vp9UncompressedHeaderParser::ReadRenderSize(Vp9FrameHeader* fhdr) {
-  if (reader_.ReadBool()) {
-    fhdr->render_width = reader_.ReadLiteral(16) + 1;
-    fhdr->render_height = reader_.ReadLiteral(16) + 1;
-  } else {
-    fhdr->render_width = fhdr->frame_width;
-    fhdr->render_height = fhdr->frame_height;
-  }
-}
-
-// 6.2.5 Frame size with refs syntax
-bool Vp9UncompressedHeaderParser::ReadFrameSizeFromRefs(Vp9FrameHeader* fhdr) {
-  bool found_ref = false;
-  for (const auto& idx : fhdr->ref_frame_idx) {
-    found_ref = reader_.ReadBool();
-    if (found_ref) {
-      const Vp9Parser::ReferenceSlot& ref = context_->GetRefSlot(idx);
-      DCHECK(ref.initialized);
-      fhdr->frame_width = ref.frame_width;
-      fhdr->frame_height = ref.frame_height;
-
-      const unsigned kMaxDimension = 1u << 16;
-      DCHECK_LE(fhdr->frame_width, kMaxDimension);
-      DCHECK_LE(fhdr->frame_height, kMaxDimension);
-      break;
-    }
-  }
-
-  if (!found_ref) ReadFrameSize(fhdr);
-
-  // 7.2.5 Frame size with refs semantics
-  bool has_valid_ref_frame = false;
-  for (const auto& idx : fhdr->ref_frame_idx) {
-    const Vp9Parser::ReferenceSlot& ref = context_->GetRefSlot(idx);
-    if (2 * fhdr->frame_width >= ref.frame_width &&
-        2 * fhdr->frame_height >= ref.frame_height &&
-        fhdr->frame_width <= 16 * ref.frame_width &&
-        fhdr->frame_height <= 16 * ref.frame_height) {
-      has_valid_ref_frame = true;
-      break;
-    }
-  }
-  if (!has_valid_ref_frame) {
-    DVLOG(1) << "There should be at least one reference frame meeting "
-             << "size conditions.";
-    return false;
-  }
-
-  ReadRenderSize(fhdr);
-  return true;
-}
-
-// 6.2.7 Interpolation filter syntax
-Vp9InterpolationFilter Vp9UncompressedHeaderParser::ReadInterpolationFilter() {
-  if (reader_.ReadBool()) return Vp9InterpolationFilter::SWITCHABLE;
-
-  // The mapping table for next two bits.
-  const Vp9InterpolationFilter table[] = {
-      Vp9InterpolationFilter::EIGHTTAP_SMOOTH, Vp9InterpolationFilter::EIGHTTAP,
-      Vp9InterpolationFilter::EIGHTTAP_SHARP, Vp9InterpolationFilter::BILINEAR,
-  };
-  return table[reader_.ReadLiteral(2)];
-}
-
-void Vp9UncompressedHeaderParser::SetupPastIndependence(Vp9FrameHeader* fhdr) {
-  memset(&context_->segmentation_, 0, sizeof(context_->segmentation_));
-  ResetLoopfilter();
-  fhdr->frame_context = kVp9DefaultFrameContext;
-  DCHECK(fhdr->frame_context.IsValid());
-}
-
-// 6.2.8 Loop filter params syntax
-void Vp9UncompressedHeaderParser::ReadLoopFilterParams() {
-  Vp9LoopFilterParams& loop_filter = context_->loop_filter_;
-
-  loop_filter.level = reader_.ReadLiteral(6);
-  loop_filter.sharpness = reader_.ReadLiteral(3);
-  loop_filter.delta_update = false;
-
-  loop_filter.delta_enabled = reader_.ReadBool();
-  if (loop_filter.delta_enabled) {
-    loop_filter.delta_update = reader_.ReadBool();
-    if (loop_filter.delta_update) {
-      for (size_t i = 0; i < Vp9RefType::VP9_FRAME_MAX; i++) {
-        loop_filter.update_ref_deltas[i] = reader_.ReadBool();
-        if (loop_filter.update_ref_deltas[i])
-          loop_filter.ref_deltas[i] = reader_.ReadSignedLiteral(6);
-      }
-
-      for (size_t i = 0; i < Vp9LoopFilterParams::kNumModeDeltas; i++) {
-        loop_filter.update_mode_deltas[i] = reader_.ReadBool();
-        if (loop_filter.update_mode_deltas[i])
-          loop_filter.mode_deltas[i] = reader_.ReadLiteral(6);
-      }
-    }
-  }
-}
-
-// 6.2.9 Quantization params syntax
-void Vp9UncompressedHeaderParser::ReadQuantizationParams(
-    Vp9QuantizationParams* quants) {
-  quants->base_q_idx = reader_.ReadLiteral(8);
-
-  quants->delta_q_y_dc = ReadDeltaQ();
-  quants->delta_q_uv_dc = ReadDeltaQ();
-  quants->delta_q_uv_ac = ReadDeltaQ();
-}
-
-// 6.2.10 Delta quantizer syntax
-int8_t Vp9UncompressedHeaderParser::ReadDeltaQ() {
-  if (reader_.ReadBool()) return reader_.ReadSignedLiteral(4);
-  return 0;
-}
-
-// 6.2.11 Segmentation params syntax
-bool Vp9UncompressedHeaderParser::ReadSegmentationParams() {
-  Vp9SegmentationParams& segmentation = context_->segmentation_;
-  segmentation.update_map = false;
-  segmentation.update_data = false;
-
-  segmentation.enabled = reader_.ReadBool();
-  if (!segmentation.enabled) return true;
-
-  segmentation.update_map = reader_.ReadBool();
-  if (segmentation.update_map) {
-    for (auto& tree_prob : segmentation.tree_probs) {
-      tree_prob = ReadProb();
-    }
-
-    segmentation.temporal_update = reader_.ReadBool();
-    for (auto& pred_prob : segmentation.pred_probs) {
-      pred_prob = segmentation.temporal_update ? ReadProb() : kVp9MaxProb;
-    }
-  }
-
-  segmentation.update_data = reader_.ReadBool();
-  if (segmentation.update_data) {
-    segmentation.abs_or_delta_update = reader_.ReadBool();
-
-    const int kFeatureDataBits[] = {8, 6, 2, 0};
-    const bool kFeatureDataSigned[] = {true, true, false, false};
-
-    for (size_t i = 0; i < Vp9SegmentationParams::kNumSegments; i++) {
-      for (size_t j = 0; j < Vp9SegmentationParams::SEG_LVL_MAX; j++) {
-        int16_t data = 0;
-        segmentation.feature_enabled[i][j] = reader_.ReadBool();
-        if (segmentation.feature_enabled[i][j]) {
-          data = reader_.ReadLiteral(kFeatureDataBits[j]);
-          if (kFeatureDataSigned[j]) {
-            if (reader_.ReadBool()) {
-              // 7.2.9
-              if (segmentation.abs_or_delta_update) {
-                DVLOG(1) << "feature_sign should be 0"
-                         << " if abs_or_delta_update is 1";
-                return false;
-              }
-              data = -data;
-            }
-          }
-        }
-        segmentation.feature_data[i][j] = data;
-      }
-    }
-  }
-  return true;
-}
-
-// 6.2.12 Probability syntax
-uint8_t Vp9UncompressedHeaderParser::ReadProb() {
-  return reader_.ReadBool() ? reader_.ReadLiteral(8) : kVp9MaxProb;
-}
-
-// 6.2.13 Tile info syntax
-bool Vp9UncompressedHeaderParser::ReadTileInfo(Vp9FrameHeader* fhdr) {
-  int sb64_cols = (fhdr->frame_width + 63) / 64;
-
-  int min_log2_tile_cols = GetMinLog2TileCols(sb64_cols);
-  int max_log2_tile_cols = GetMaxLog2TileCols(sb64_cols);
-
-  int max_ones = max_log2_tile_cols - min_log2_tile_cols;
-  fhdr->tile_cols_log2 = min_log2_tile_cols;
-  while (max_ones-- && reader_.ReadBool()) fhdr->tile_cols_log2++;
-
-  fhdr->tile_rows_log2 = reader_.ReadBool() ? 1 : 0;
-  if (fhdr->tile_rows_log2 > 0 && reader_.ReadBool()) fhdr->tile_rows_log2++;
-
-  // 7.2.11 Tile info semantics
-  if (fhdr->tile_cols_log2 > 6) {
-    DVLOG(1) << "tile_cols_log2 should be <= 6";
-    return false;
-  }
-
-  return true;
-}
-
-void Vp9UncompressedHeaderParser::ResetLoopfilter() {
-  Vp9LoopFilterParams& loop_filter = context_->loop_filter_;
-
-  loop_filter.delta_enabled = true;
-  loop_filter.delta_update = true;
-
-  loop_filter.ref_deltas[VP9_FRAME_INTRA] = 1;
-  loop_filter.ref_deltas[VP9_FRAME_LAST] = 0;
-  loop_filter.ref_deltas[VP9_FRAME_GOLDEN] = -1;
-  loop_filter.ref_deltas[VP9_FRAME_ALTREF] = -1;
-
-  memset(loop_filter.mode_deltas, 0, sizeof(loop_filter.mode_deltas));
-}
-
-// 6.2 Uncompressed header syntax
-bool Vp9UncompressedHeaderParser::Parse(const uint8_t* stream, off_t frame_size,
-                                        Vp9FrameHeader* fhdr) {
-  DVLOG(2) << "Vp9UncompressedHeaderParser::Parse";
-  reader_.Initialize(stream, frame_size);
-
-  fhdr->data = stream;
-  fhdr->frame_size = frame_size;
-
-  // frame marker
-  if (reader_.ReadLiteral(2) != 0x2) {
-    DVLOG(1) << "frame marker shall be equal to 2";
-    return false;
-  }
-
-  fhdr->profile = ReadProfile();
-  if (fhdr->profile >= kVp9MaxProfile) {
-    DVLOG(1) << "Unsupported bitstream profile";
-    return false;
-  }
-
-  fhdr->show_existing_frame = reader_.ReadBool();
-  if (fhdr->show_existing_frame) {
-    fhdr->frame_to_show_map_idx = reader_.ReadLiteral(3);
-    fhdr->show_frame = true;
-
-    if (!reader_.ConsumeTrailingBits()) {
-      DVLOG(1) << "trailing bits are not zero";
-      return false;
-    }
-    if (!reader_.IsValid()) {
-      DVLOG(1) << "parser reads beyond the end of buffer";
-      return false;
-    }
-    fhdr->uncompressed_header_size = reader_.GetBytesRead();
-    fhdr->header_size_in_bytes = 0;
-    return true;
-  }
-
-  fhdr->frame_type = static_cast<Vp9FrameHeader::FrameType>(reader_.ReadBool());
-  fhdr->show_frame = reader_.ReadBool();
-  fhdr->error_resilient_mode = reader_.ReadBool();
-
-  if (fhdr->IsKeyframe()) {
-    if (!VerifySyncCode()) return false;
-
-    if (!ReadColorConfig(fhdr)) return false;
-
-    ReadFrameSize(fhdr);
-    ReadRenderSize(fhdr);
-    fhdr->refresh_frame_flags = 0xff;
-  } else {
-    if (!fhdr->show_frame) fhdr->intra_only = reader_.ReadBool();
-
-    if (!fhdr->error_resilient_mode)
-      fhdr->reset_frame_context = reader_.ReadLiteral(2);
-
-    if (fhdr->intra_only) {
-      if (!VerifySyncCode()) return false;
-
-      if (fhdr->profile > 0) {
-        if (!ReadColorConfig(fhdr)) return false;
-      } else {
-        fhdr->bit_depth = 8;
-        fhdr->color_space = Vp9ColorSpace::BT_601;
-        fhdr->subsampling_x = fhdr->subsampling_y = 1;
-      }
-
-      fhdr->refresh_frame_flags = reader_.ReadLiteral(8);
-
-      ReadFrameSize(fhdr);
-      ReadRenderSize(fhdr);
-    } else {
-      fhdr->refresh_frame_flags = reader_.ReadLiteral(8);
-
-      static_assert(arraysize(fhdr->ref_frame_sign_bias) >=
-                        Vp9RefType::VP9_FRAME_LAST + kVp9NumRefsPerFrame,
-                    "ref_frame_sign_bias is not big enough");
-      for (size_t i = 0; i < kVp9NumRefsPerFrame; i++) {
-        fhdr->ref_frame_idx[i] = reader_.ReadLiteral(kVp9NumRefFramesLog2);
-        fhdr->ref_frame_sign_bias[Vp9RefType::VP9_FRAME_LAST + i] =
-            reader_.ReadBool();
-
-        // 8.2 Frame order constraints
-        // ref_frame_idx[i] refers to an earlier decoded frame.
-        const Vp9Parser::ReferenceSlot& ref =
-            context_->GetRefSlot(fhdr->ref_frame_idx[i]);
-        if (!ref.initialized) {
-          DVLOG(1) << "ref_frame_idx[" << i
-                   << "]=" << static_cast<int>(fhdr->ref_frame_idx[i])
-                   << " refers to unused frame";
-          return false;
-        }
-
-        // 7.2 Uncompressed header semantics
-        // the selected reference frames match the current frame in bit depth,
-        // profile, chroma subsampling, and color space.
-        if (ref.profile != fhdr->profile) {
-          DVLOG(1) << "profile of referenced frame mismatch";
-          return false;
-        }
-        if (i == 0) {
-          // Below fields are not specified for inter-frame in header, so copy
-          // them from referenced frame.
-          fhdr->bit_depth = ref.bit_depth;
-          fhdr->color_space = ref.color_space;
-          fhdr->subsampling_x = ref.subsampling_x;
-          fhdr->subsampling_y = ref.subsampling_y;
-        } else {
-          if (fhdr->bit_depth != ref.bit_depth) {
-            DVLOG(1) << "bit_depth of referenced frame mismatch";
-            return false;
-          }
-          if (fhdr->color_space != ref.color_space) {
-            DVLOG(1) << "color_space of referenced frame mismatch";
-            return false;
-          }
-          if (fhdr->subsampling_x != ref.subsampling_x ||
-              fhdr->subsampling_y != ref.subsampling_y) {
-            DVLOG(1) << "chroma subsampling of referenced frame mismatch";
-            return false;
-          }
-        }
-      }
-
-      if (!ReadFrameSizeFromRefs(fhdr)) return false;
-
-      fhdr->allow_high_precision_mv = reader_.ReadBool();
-      fhdr->interpolation_filter = ReadInterpolationFilter();
-    }
-  }
-
-  if (fhdr->error_resilient_mode) {
-    fhdr->refresh_frame_context = false;
-    fhdr->frame_parallel_decoding_mode = true;
-  } else {
-    fhdr->refresh_frame_context = reader_.ReadBool();
-    fhdr->frame_parallel_decoding_mode = reader_.ReadBool();
-  }
-
-  fhdr->frame_context_idx_to_save_probs = fhdr->frame_context_idx =
-      reader_.ReadLiteral(kVp9NumFrameContextsLog2);
-
-  if (fhdr->IsIntra()) {
-    SetupPastIndependence(fhdr);
-    if (fhdr->IsKeyframe() || fhdr->error_resilient_mode ||
-        fhdr->reset_frame_context == 3) {
-      for (size_t i = 0; i < kVp9NumFrameContexts; ++i)
-        context_->UpdateFrameContext(i, fhdr->frame_context);
-    } else if (fhdr->reset_frame_context == 2) {
-      context_->UpdateFrameContext(fhdr->frame_context_idx,
-                                   fhdr->frame_context);
-    }
-    fhdr->frame_context_idx = 0;
-  }
-
-  ReadLoopFilterParams();
-  ReadQuantizationParams(&fhdr->quant_params);
-  if (!ReadSegmentationParams()) return false;
-
-  if (!ReadTileInfo(fhdr)) return false;
-
-  fhdr->header_size_in_bytes = reader_.ReadLiteral(16);
-  if (fhdr->header_size_in_bytes == 0) {
-    DVLOG(1) << "invalid header size";
-    return false;
-  }
-
-  if (!reader_.ConsumeTrailingBits()) {
-    DVLOG(1) << "trailing bits are not zero";
-    return false;
-  }
-  if (!reader_.IsValid()) {
-    DVLOG(1) << "parser reads beyond the end of buffer";
-    return false;
-  }
-  fhdr->uncompressed_header_size = reader_.GetBytesRead();
-
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/vp9_uncompressed_header_parser.h b/cobalt/media/filters/vp9_uncompressed_header_parser.h
deleted file mode 100644
index 9a5ea6d..0000000
--- a/cobalt/media/filters/vp9_uncompressed_header_parser.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FILTERS_VP9_UNCOMPRESSED_HEADER_PARSER_H_
-#define COBALT_MEDIA_FILTERS_VP9_UNCOMPRESSED_HEADER_PARSER_H_
-
-#include "cobalt/media/filters/vp9_parser.h"
-#include "cobalt/media/filters/vp9_raw_bits_reader.h"
-
-namespace cobalt {
-namespace media {
-
-class Vp9UncompressedHeaderParser {
- public:
-  explicit Vp9UncompressedHeaderParser(Vp9Parser::Context* context);
-
-  // Parses VP9 uncompressed header in |stream| with |frame_size| into |fhdr|.
-  // Returns true if no error.
-  bool Parse(const uint8_t* stream, off_t frame_size, Vp9FrameHeader* fhdr);
-
- private:
-  uint8_t ReadProfile();
-  bool VerifySyncCode();
-  bool ReadColorConfig(Vp9FrameHeader* fhdr);
-  void ReadFrameSize(Vp9FrameHeader* fhdr);
-  bool ReadFrameSizeFromRefs(Vp9FrameHeader* fhdr);
-  void ReadRenderSize(Vp9FrameHeader* fhdr);
-  Vp9InterpolationFilter ReadInterpolationFilter();
-  void ResetLoopfilter();
-  void SetupPastIndependence(Vp9FrameHeader* fhdr);
-  void ReadLoopFilterParams();
-  void ReadQuantizationParams(Vp9QuantizationParams* quants);
-  int8_t ReadDeltaQ();
-  uint8_t ReadProb();
-  bool ReadSegmentationParams();
-  bool ReadTileInfo(Vp9FrameHeader* fhdr);
-
-  // Raw bits reader for uncompressed frame header.
-  Vp9RawBitsReader reader_;
-
-  Vp9Parser::Context* context_;
-
-  DISALLOW_COPY_AND_ASSIGN(Vp9UncompressedHeaderParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_VP9_UNCOMPRESSED_HEADER_PARSER_H_
diff --git a/cobalt/media/filters/webvtt_util.h b/cobalt/media/filters/webvtt_util.h
deleted file mode 100644
index a82fc87..0000000
--- a/cobalt/media/filters/webvtt_util.h
+++ /dev/null
@@ -1,33 +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 COBALT_MEDIA_FILTERS_WEBVTT_UTIL_H_
-#define COBALT_MEDIA_FILTERS_WEBVTT_UTIL_H_
-
-#include <vector>
-
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Utility function to create side data item for decoder buffer.
-template <typename T>
-void MakeSideData(T id_begin, T id_end, T settings_begin, T settings_end,
-                  std::vector<uint8_t>* side_data) {
-  // The DecoderBuffer only supports a single side data item. In the case of
-  // a WebVTT cue, we can have potentially two side data items. In order to
-  // avoid disrupting DecoderBuffer any more than we need to, we copy both
-  // side data items onto a single one, and terminate each with a NUL marker.
-  side_data->clear();
-  side_data->insert(side_data->end(), id_begin, id_end);
-  side_data->push_back(0);
-  side_data->insert(side_data->end(), settings_begin, settings_end);
-  side_data->push_back(0);
-}
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_WEBVTT_UTIL_H_
diff --git a/cobalt/media/filters/wsola_internals.cc b/cobalt/media/filters/wsola_internals.cc
deleted file mode 100644
index 9e372e7..0000000
--- a/cobalt/media/filters/wsola_internals.cc
+++ /dev/null
@@ -1,260 +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.
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include "cobalt/media/filters/wsola_internals.h"
-
-#include <algorithm>
-#include <cmath>
-#include <limits>
-#include <memory>
-
-#include "base/logging.h"
-#include "cobalt/media/base/audio_bus.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-namespace internal {
-
-bool InInterval(int n, Interval q) { return n >= q.first && n <= q.second; }
-
-float MultiChannelSimilarityMeasure(const float* dot_prod_a_b,
-                                    const float* energy_a,
-                                    const float* energy_b, int channels) {
-  const float kEpsilon = 1e-12f;
-  float similarity_measure = 0.0f;
-  for (int n = 0; n < channels; ++n) {
-    similarity_measure +=
-        dot_prod_a_b[n] / sqrt(energy_a[n] * energy_b[n] + kEpsilon);
-  }
-  return similarity_measure;
-}
-
-void MultiChannelDotProduct(const AudioBus* a, int frame_offset_a,
-                            const AudioBus* b, int frame_offset_b,
-                            int num_frames, float* dot_product) {
-  DCHECK_EQ(a->channels(), b->channels());
-  DCHECK_GE(frame_offset_a, 0);
-  DCHECK_GE(frame_offset_b, 0);
-  DCHECK_LE(frame_offset_a + num_frames, a->frames());
-  DCHECK_LE(frame_offset_b + num_frames, b->frames());
-
-  memset(dot_product, 0, sizeof(*dot_product) * a->channels());
-  for (int k = 0; k < a->channels(); ++k) {
-    const float* ch_a = a->channel(k) + frame_offset_a;
-    const float* ch_b = b->channel(k) + frame_offset_b;
-    for (int n = 0; n < num_frames; ++n) {
-      dot_product[k] += *ch_a++ * *ch_b++;
-    }
-  }
-}
-
-void MultiChannelMovingBlockEnergies(const AudioBus* input,
-                                     int frames_per_block, float* energy) {
-  int num_blocks = input->frames() - (frames_per_block - 1);
-  int channels = input->channels();
-
-  for (int k = 0; k < input->channels(); ++k) {
-    const float* input_channel = input->channel(k);
-
-    energy[k] = 0;
-
-    // First block of channel |k|.
-    for (int m = 0; m < frames_per_block; ++m) {
-      energy[k] += input_channel[m] * input_channel[m];
-    }
-
-    const float* slide_out = input_channel;
-    const float* slide_in = input_channel + frames_per_block;
-    for (int n = 1; n < num_blocks; ++n, ++slide_in, ++slide_out) {
-      energy[k + n * channels] = energy[k + (n - 1) * channels] -
-                                 *slide_out * *slide_out +
-                                 *slide_in * *slide_in;
-    }
-  }
-}
-
-// Fit the curve f(x) = a * x^2 + b * x + c such that
-//   f(-1) = y[0]
-//   f(0) = y[1]
-//   f(1) = y[2]
-// and return the maximum, assuming that y[0] <= y[1] >= y[2].
-void QuadraticInterpolation(const float* y_values, float* extremum,
-                            float* extremum_value) {
-  float a = 0.5f * (y_values[2] + y_values[0]) - y_values[1];
-  float b = 0.5f * (y_values[2] - y_values[0]);
-  float c = y_values[1];
-
-  if (a == 0.f) {
-    // The coordinates are colinear (within floating-point error).
-    *extremum = 0;
-    *extremum_value = y_values[1];
-  } else {
-    *extremum = -b / (2.f * a);
-    *extremum_value = a * (*extremum) * (*extremum) + b * (*extremum) + c;
-  }
-}
-
-int DecimatedSearch(int decimation, Interval exclude_interval,
-                    const AudioBus* target_block,
-                    const AudioBus* search_segment,
-                    const float* energy_target_block,
-                    const float* energy_candidate_blocks) {
-  int channels = search_segment->channels();
-  int block_size = target_block->frames();
-  int num_candidate_blocks = search_segment->frames() - (block_size - 1);
-  std::unique_ptr<float[]> dot_prod(new float[channels]);
-  float similarity[3];  // Three elements for cubic interpolation.
-
-  int n = 0;
-  MultiChannelDotProduct(target_block, 0, search_segment, n, block_size,
-                         dot_prod.get());
-  similarity[0] = MultiChannelSimilarityMeasure(
-      dot_prod.get(), energy_target_block,
-      &energy_candidate_blocks[n * channels], channels);
-
-  // Set the starting point as optimal point.
-  float best_similarity = similarity[0];
-  int optimal_index = 0;
-
-  n += decimation;
-  if (n >= num_candidate_blocks) {
-    return 0;
-  }
-
-  MultiChannelDotProduct(target_block, 0, search_segment, n, block_size,
-                         dot_prod.get());
-  similarity[1] = MultiChannelSimilarityMeasure(
-      dot_prod.get(), energy_target_block,
-      &energy_candidate_blocks[n * channels], channels);
-
-  n += decimation;
-  if (n >= num_candidate_blocks) {
-    // We cannot do any more sampling. Compare these two values and return the
-    // optimal index.
-    return similarity[1] > similarity[0] ? decimation : 0;
-  }
-
-  for (; n < num_candidate_blocks; n += decimation) {
-    MultiChannelDotProduct(target_block, 0, search_segment, n, block_size,
-                           dot_prod.get());
-
-    similarity[2] = MultiChannelSimilarityMeasure(
-        dot_prod.get(), energy_target_block,
-        &energy_candidate_blocks[n * channels], channels);
-
-    if ((similarity[1] > similarity[0] && similarity[1] >= similarity[2]) ||
-        (similarity[1] >= similarity[0] && similarity[1] > similarity[2])) {
-      // A local maximum is found. Do a cubic interpolation for a better
-      // estimate of candidate maximum.
-      float normalized_candidate_index;
-      float candidate_similarity;
-      QuadraticInterpolation(similarity, &normalized_candidate_index,
-                             &candidate_similarity);
-
-      int candidate_index =
-          n - decimation +
-          static_cast<int>(normalized_candidate_index * decimation + 0.5f);
-      if (candidate_similarity > best_similarity &&
-          !InInterval(candidate_index, exclude_interval)) {
-        optimal_index = candidate_index;
-        best_similarity = candidate_similarity;
-      }
-    } else if (n + decimation >= num_candidate_blocks &&
-               similarity[2] > best_similarity &&
-               !InInterval(n, exclude_interval)) {
-      // If this is the end-point and has a better similarity-measure than
-      // optimal, then we accept it as optimal point.
-      optimal_index = n;
-      best_similarity = similarity[2];
-    }
-    memmove(similarity, &similarity[1], 2 * sizeof(*similarity));
-  }
-  return optimal_index;
-}
-
-int FullSearch(int low_limit, int high_limit, Interval exclude_interval,
-               const AudioBus* target_block, const AudioBus* search_block,
-               const float* energy_target_block,
-               const float* energy_candidate_blocks) {
-  int channels = search_block->channels();
-  int block_size = target_block->frames();
-  std::unique_ptr<float[]> dot_prod(new float[channels]);
-
-  float best_similarity = std::numeric_limits<float>::min();
-  int optimal_index = 0;
-
-  for (int n = low_limit; n <= high_limit; ++n) {
-    if (InInterval(n, exclude_interval)) {
-      continue;
-    }
-    MultiChannelDotProduct(target_block, 0, search_block, n, block_size,
-                           dot_prod.get());
-
-    float similarity = MultiChannelSimilarityMeasure(
-        dot_prod.get(), energy_target_block,
-        &energy_candidate_blocks[n * channels], channels);
-
-    if (similarity > best_similarity) {
-      best_similarity = similarity;
-      optimal_index = n;
-    }
-  }
-
-  return optimal_index;
-}
-
-int OptimalIndex(const AudioBus* search_block, const AudioBus* target_block,
-                 Interval exclude_interval) {
-  int channels = search_block->channels();
-  DCHECK_EQ(channels, target_block->channels());
-  int target_size = target_block->frames();
-  int num_candidate_blocks = search_block->frames() - (target_size - 1);
-
-  // This is a compromise between complexity reduction and search accuracy. I
-  // don't have a proof that down sample of order 5 is optimal. One can compute
-  // a decimation factor that minimizes complexity given the size of
-  // |search_block| and |target_block|. However, my experiments show the rate of
-  // missing the optimal index is significant. This value is chosen
-  // heuristically based on experiments.
-  const int kSearchDecimation = 5;
-
-  std::unique_ptr<float[]> energy_target_block(new float[channels]);
-  std::unique_ptr<float[]> energy_candidate_blocks(
-      new float[channels * num_candidate_blocks]);
-
-  // Energy of all candid frames.
-  MultiChannelMovingBlockEnergies(search_block, target_size,
-                                  energy_candidate_blocks.get());
-
-  // Energy of target frame.
-  MultiChannelDotProduct(target_block, 0, target_block, 0, target_size,
-                         energy_target_block.get());
-
-  int optimal_index = DecimatedSearch(
-      kSearchDecimation, exclude_interval, target_block, search_block,
-      energy_target_block.get(), energy_candidate_blocks.get());
-
-  int lim_low = std::max(0, optimal_index - kSearchDecimation);
-  int lim_high =
-      std::min(num_candidate_blocks - 1, optimal_index + kSearchDecimation);
-  return FullSearch(lim_low, lim_high, exclude_interval, target_block,
-                    search_block, energy_target_block.get(),
-                    energy_candidate_blocks.get());
-}
-
-void GetSymmetricHanningWindow(int window_length, float* window) {
-  const float scale = 2.0f * M_PI / window_length;
-  for (int n = 0; n < window_length; ++n)
-    window[n] = 0.5f * (1.0f - cosf(n * scale));
-}
-
-}  // namespace internal
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/filters/wsola_internals.h b/cobalt/media/filters/wsola_internals.h
deleted file mode 100644
index 58ad8dc..0000000
--- a/cobalt/media/filters/wsola_internals.h
+++ /dev/null
@@ -1,83 +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 set of utility functions to perform WSOLA.
-
-#ifndef COBALT_MEDIA_FILTERS_WSOLA_INTERNALS_H_
-#define COBALT_MEDIA_FILTERS_WSOLA_INTERNALS_H_
-
-#include <utility>
-
-#include "cobalt/media/base/media_export.h"
-
-namespace cobalt {
-namespace media {
-
-class AudioBus;
-
-namespace internal {
-
-typedef std::pair<int, int> Interval;
-
-// Dot-product of channels of two AudioBus. For each AudioBus an offset is
-// given. |dot_product[k]| is the dot-product of channel |k|. The caller should
-// allocate sufficient space for |dot_product|.
-MEDIA_EXPORT void MultiChannelDotProduct(const AudioBus* a, int frame_offset_a,
-                                         const AudioBus* b, int frame_offset_b,
-                                         int num_frames, float* dot_product);
-
-// Energies of sliding windows of channels are interleaved.
-// The number windows is |input->frames()| - (|frames_per_window| - 1), hence,
-// the method assumes |energy| must be, at least, of size
-// (|input->frames()| - (|frames_per_window| - 1)) * |input->channels()|.
-MEDIA_EXPORT void MultiChannelMovingBlockEnergies(const AudioBus* input,
-                                                  int frames_per_window,
-                                                  float* energy);
-
-// Fit the curve f(x) = a * x^2 + b * x + c such that
-//   f(-1) = y[0]
-//   f(0) = y[1]
-//   f(1) = y[2]
-// and return the maximum, assuming that y[0] <= y[1] >= y[2].
-MEDIA_EXPORT void QuadraticInterpolation(const float* y_values, float* extremum,
-                                         float* extremum_value);
-
-// Search a subset of all candid blocks. The search is performed every
-// |decimation| frames. This reduces complexity by a factor of about
-// 1 / |decimation|. A cubic interpolation is used to have a better estimate of
-// the best match.
-MEDIA_EXPORT int DecimatedSearch(int decimation, Interval exclude_interval,
-                                 const AudioBus* target_block,
-                                 const AudioBus* search_segment,
-                                 const float* energy_target_block,
-                                 const float* energy_candid_blocks);
-
-// Search [|low_limit|, |high_limit|] of |search_segment| to find a block that
-// is most similar to |target_block|. |energy_target_block| is the energy of the
-// |target_block|. |energy_candidate_blocks| is the energy of all blocks within
-// |search_block|.
-MEDIA_EXPORT int FullSearch(int low_limit, int high_limit,
-                            Interval exclude_interval,
-                            const AudioBus* target_block,
-                            const AudioBus* search_block,
-                            const float* energy_target_block,
-                            const float* energy_candidate_blocks);
-
-// Find the index of the block, within |search_block|, that is most similar
-// to |target_block|. Obviously, the returned index is w.r.t. |search_block|.
-// |exclude_interval| is an interval that is excluded from the search.
-MEDIA_EXPORT int OptimalIndex(const AudioBus* search_block,
-                              const AudioBus* target_block,
-                              Interval exclude_interval);
-
-// Return a "periodic" Hann window. This is the first L samples of an L+1
-// Hann window. It is perfect reconstruction for overlap-and-add.
-MEDIA_EXPORT void GetSymmetricHanningWindow(int window_length, float* window);
-
-}  // namespace internal
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FILTERS_WSOLA_INTERNALS_H_
diff --git a/cobalt/media/formats/common/offset_byte_queue.cc b/cobalt/media/formats/common/offset_byte_queue.cc
deleted file mode 100644
index 80925d6..0000000
--- a/cobalt/media/formats/common/offset_byte_queue.cc
+++ /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.
-
-#include "cobalt/media/formats/common/offset_byte_queue.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-OffsetByteQueue::OffsetByteQueue() : buf_(NULL), size_(0), head_(0) {}
-OffsetByteQueue::~OffsetByteQueue() {}
-
-void OffsetByteQueue::Reset() {
-  queue_.Reset();
-  buf_ = NULL;
-  size_ = 0;
-  head_ = 0;
-}
-
-void OffsetByteQueue::Push(const uint8_t* buf, int size) {
-  queue_.Push(buf, size);
-  Sync();
-  DVLOG(4) << "Buffer pushed. head=" << head() << " tail=" << tail();
-}
-
-void OffsetByteQueue::Peek(const uint8_t** buf, int* size) {
-  *buf = size_ > 0 ? buf_ : NULL;
-  *size = size_;
-}
-
-void OffsetByteQueue::Pop(int count) {
-  queue_.Pop(count);
-  head_ += count;
-  Sync();
-}
-
-void OffsetByteQueue::PeekAt(int64_t offset, const uint8_t** buf, int* size) {
-  DCHECK(offset >= head());
-  if (offset < head() || offset >= tail()) {
-    *buf = NULL;
-    *size = 0;
-    return;
-  }
-  *buf = &buf_[offset - head()];
-  *size = tail() - offset;
-}
-
-bool OffsetByteQueue::Trim(int64_t max_offset) {
-  if (max_offset < head_) return true;
-  if (max_offset > tail()) {
-    Pop(size_);
-    return false;
-  }
-  Pop(max_offset - head_);
-  return true;
-}
-
-void OffsetByteQueue::Sync() { queue_.Peek(&buf_, &size_); }
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/common/offset_byte_queue.h b/cobalt/media/formats/common/offset_byte_queue.h
deleted file mode 100644
index 2c1bf8d..0000000
--- a/cobalt/media/formats/common/offset_byte_queue.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_COMMON_OFFSET_BYTE_QUEUE_H_
-#define COBALT_MEDIA_FORMATS_COMMON_OFFSET_BYTE_QUEUE_H_
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/byte_queue.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// A wrapper around a ByteQueue which maintains a notion of a
-// monotonically-increasing offset. All buffer access is done by passing these
-// offsets into this class, going some way towards preventing the proliferation
-// of many different meanings of "offset", "head", etc.
-class MEDIA_EXPORT OffsetByteQueue {
- public:
-  OffsetByteQueue();
-  ~OffsetByteQueue();
-
-  // These work like their underlying ByteQueue counterparts.
-  void Reset();
-  void Push(const uint8_t* buf, int size);
-  void Peek(const uint8_t** buf, int* size);
-  void Pop(int count);
-
-  // Sets |buf| to point at the first buffered byte corresponding to |offset|,
-  // and |size| to the number of bytes available starting from that offset.
-  //
-  // It is an error if the offset is before the current head. It's not an error
-  // if the current offset is beyond tail(), but you will of course get back
-  // a null |buf| and a |size| of zero.
-  void PeekAt(int64_t offset, const uint8_t** buf, int* size);
-
-  // Marks the bytes up to (but not including) |max_offset| as ready for
-  // deletion. This is relatively inexpensive, but will not necessarily reduce
-  // the resident buffer size right away (or ever).
-  //
-  // Returns true if the full range of bytes were successfully trimmed,
-  // including the case where |max_offset| is less than the current head.
-  // Returns false if |max_offset| > tail() (although all bytes currently
-  // buffered are still cleared).
-  bool Trim(int64_t max_offset);
-
-  // The head and tail positions, in terms of the file's absolute offsets.
-  // tail() is an exclusive bound.
-  int64_t head() { return head_; }
-  int64_t tail() { return head_ + size_; }
-
- private:
-  // Synchronize |buf_| and |size_| with |queue_|.
-  void Sync();
-
-  ByteQueue queue_;
-  const uint8_t* buf_;
-  int size_;
-  int64_t head_;
-
-  DISALLOW_COPY_AND_ASSIGN(OffsetByteQueue);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_COMMON_OFFSET_BYTE_QUEUE_H_
diff --git a/cobalt/media/formats/common/offset_byte_queue_unittest.cc b/cobalt/media/formats/common/offset_byte_queue_unittest.cc
deleted file mode 100644
index 5200ce6..0000000
--- a/cobalt/media/formats/common/offset_byte_queue_unittest.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 "cobalt/media/formats/common/offset_byte_queue.h"
-
-#include <string.h>
-
-#include <memory>
-
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class OffsetByteQueueTest : public testing::Test {
- public:
-  void SetUp() override {
-    uint8_t buf[256];
-    for (int i = 0; i < 256; i++) {
-      buf[i] = i;
-    }
-    queue_.reset(new OffsetByteQueue);
-    queue_->Push(buf, sizeof(buf));
-    queue_->Push(buf, sizeof(buf));
-    queue_->Pop(384);
-
-    // Queue will start with 128 bytes of data and an offset of 384 bytes.
-    // These values are used throughout the test.
-  }
-
- protected:
-  std::unique_ptr<OffsetByteQueue> queue_;
-};
-
-TEST_F(OffsetByteQueueTest, SetUp) {
-  EXPECT_EQ(384, queue_->head());
-  EXPECT_EQ(512, queue_->tail());
-
-  const uint8_t* buf;
-  int size;
-
-  queue_->Peek(&buf, &size);
-  EXPECT_EQ(128, size);
-  EXPECT_EQ(128, buf[0]);
-  EXPECT_EQ(255, buf[size - 1]);
-}
-
-TEST_F(OffsetByteQueueTest, PeekAt) {
-  const uint8_t* buf;
-  int size;
-
-  queue_->PeekAt(400, &buf, &size);
-  EXPECT_EQ(queue_->tail() - 400, size);
-  EXPECT_EQ(400 - 256, buf[0]);
-
-  queue_->PeekAt(512, &buf, &size);
-  EXPECT_EQ(NULL, buf);
-  EXPECT_EQ(0, size);
-}
-
-TEST_F(OffsetByteQueueTest, Trim) {
-  EXPECT_TRUE(queue_->Trim(128));
-  EXPECT_TRUE(queue_->Trim(384));
-  EXPECT_EQ(384, queue_->head());
-  EXPECT_EQ(512, queue_->tail());
-
-  EXPECT_TRUE(queue_->Trim(400));
-  EXPECT_EQ(400, queue_->head());
-  EXPECT_EQ(512, queue_->tail());
-
-  const uint8_t* buf;
-  int size;
-  queue_->PeekAt(400, &buf, &size);
-  EXPECT_EQ(queue_->tail() - 400, size);
-  EXPECT_EQ(400 - 256, buf[0]);
-
-  // Trimming to the exact end of the buffer should return 'true'. This
-  // accommodates EOS cases.
-  EXPECT_TRUE(queue_->Trim(512));
-  EXPECT_EQ(512, queue_->head());
-  queue_->Peek(&buf, &size);
-  EXPECT_EQ(NULL, buf);
-
-  // Trimming past the end of the buffer should return 'false'; we haven't seen
-  // the preceeding bytes.
-  EXPECT_FALSE(queue_->Trim(513));
-
-  // However, doing that shouldn't affect the EOS case. Only adding new data
-  // should alter this behavior.
-  EXPECT_TRUE(queue_->Trim(512));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/common/stream_parser_test_base.cc b/cobalt/media/formats/common/stream_parser_test_base.cc
deleted file mode 100644
index af961d9..0000000
--- a/cobalt/media/formats/common/stream_parser_test_base.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/common/stream_parser_test_base.h"
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/media_track.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-static std::string BufferQueueToString(
-    const StreamParser::BufferQueue& buffers) {
-  std::stringstream ss;
-
-  ss << "{";
-  for (StreamParser::BufferQueue::const_iterator itr = buffers.begin();
-       itr != buffers.end(); ++itr) {
-    ss << " " << (*itr)->timestamp().InMilliseconds();
-    if ((*itr)->is_key_frame()) ss << "K";
-  }
-  ss << " }";
-
-  return ss.str();
-}
-
-StreamParserTestBase::StreamParserTestBase(
-    std::unique_ptr<StreamParser> stream_parser)
-    : parser_(std::move(stream_parser)) {
-  parser_->Init(
-      base::Bind(&StreamParserTestBase::OnInitDone, base::Unretained(this)),
-      base::Bind(&StreamParserTestBase::OnNewConfig, base::Unretained(this)),
-      base::Bind(&StreamParserTestBase::OnNewBuffers, base::Unretained(this)),
-      true,
-      base::Bind(&StreamParserTestBase::OnKeyNeeded, base::Unretained(this)),
-      base::Bind(&StreamParserTestBase::OnNewSegment, base::Unretained(this)),
-      base::Bind(&StreamParserTestBase::OnEndOfSegment, base::Unretained(this)),
-      new MediaLog());
-}
-
-StreamParserTestBase::~StreamParserTestBase() {}
-
-std::string StreamParserTestBase::ParseFile(const std::string& filename,
-                                            int append_bytes) {
-  results_stream_.clear();
-  scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename);
-  EXPECT_TRUE(
-      AppendDataInPieces(buffer->data(), buffer->data_size(), append_bytes));
-  return results_stream_.str();
-}
-
-std::string StreamParserTestBase::ParseData(const uint8_t* data,
-                                            size_t length) {
-  results_stream_.clear();
-  EXPECT_TRUE(AppendDataInPieces(data, length, length));
-  return results_stream_.str();
-}
-
-bool StreamParserTestBase::AppendDataInPieces(const uint8_t* data,
-                                              size_t length,
-                                              size_t piece_size) {
-  const uint8_t* start = data;
-  const uint8_t* end = data + length;
-  while (start < end) {
-    size_t append_size = std::min(piece_size, static_cast<size_t>(end - start));
-    if (!parser_->Parse(start, append_size)) return false;
-    start += append_size;
-  }
-  return true;
-}
-
-void StreamParserTestBase::OnInitDone(
-    const StreamParser::InitParameters& params) {
-  EXPECT_TRUE(params.auto_update_timestamp_offset);
-  DVLOG(1) << __FUNCTION__ << "(" << params.duration.InMilliseconds() << ", "
-           << params.auto_update_timestamp_offset << ")";
-}
-
-bool StreamParserTestBase::OnNewConfig(
-    std::unique_ptr<MediaTracks> tracks,
-    const StreamParser::TextTrackConfigMap& text_config) {
-  DVLOG(1) << __FUNCTION__ << ": got " << tracks->tracks().size() << " tracks";
-  EXPECT_EQ(tracks->tracks().size(), 1u);
-  const auto& track = tracks->tracks()[0];
-  EXPECT_EQ(track->type(), MediaTrack::Audio);
-  audio_track_id_ = track->bytestream_track_id();
-  last_audio_config_ = tracks->getAudioConfig(track->bytestream_track_id());
-  EXPECT_TRUE(last_audio_config_.IsValidConfig());
-  return true;
-}
-
-bool StreamParserTestBase::OnNewBuffers(
-    const StreamParser::BufferQueueMap& buffer_queue_map) {
-  EXPECT_EQ(1u, buffer_queue_map.size());
-  const auto& itr_audio = buffer_queue_map.find(audio_track_id_);
-  EXPECT_NE(buffer_queue_map.end(), itr_audio);
-  const StreamParser::BufferQueue& audio_buffers = itr_audio->second;
-  EXPECT_FALSE(audio_buffers.empty());
-
-  // Ensure that track ids are properly assigned on all emitted buffers.
-  for (const auto& buf : audio_buffers) {
-    EXPECT_EQ(audio_track_id_, buf->track_id());
-  }
-
-  const std::string buffers_str = BufferQueueToString(audio_buffers);
-  DVLOG(1) << __FUNCTION__ << " : " << buffers_str;
-  results_stream_ << buffers_str;
-  return true;
-}
-
-void StreamParserTestBase::OnKeyNeeded(EmeInitDataType type,
-                                       const std::vector<uint8_t>& init_data) {
-  DVLOG(1) << __FUNCTION__ << "(" << static_cast<int>(type) << ", "
-           << init_data.size() << ")";
-}
-
-void StreamParserTestBase::OnNewSegment() {
-  DVLOG(1) << __FUNCTION__;
-  results_stream_ << "NewSegment";
-}
-
-void StreamParserTestBase::OnEndOfSegment() {
-  DVLOG(1) << __FUNCTION__;
-  results_stream_ << "EndOfSegment";
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/common/stream_parser_test_base.h b/cobalt/media/formats/common/stream_parser_test_base.h
deleted file mode 100644
index 80e7e27..0000000
--- a/cobalt/media/formats/common/stream_parser_test_base.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FORMATS_COMMON_STREAM_PARSER_TEST_BASE_H_
-#define COBALT_MEDIA_FORMATS_COMMON_STREAM_PARSER_TEST_BASE_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Test helper for verifying StreamParser behavior.
-class StreamParserTestBase {
- public:
-  explicit StreamParserTestBase(std::unique_ptr<StreamParser> stream_parser);
-  virtual ~StreamParserTestBase();
-
- protected:
-  // Chunks a given parser appropriate file.  Appends |append_bytes| at a time
-  // until the file is exhausted.  Returns a coded string representing the
-  // segments and timestamps of the extracted frames.
-  //
-  // The start of each media segment is designated by "NewSegment", similarly
-  // the end of each segment by "EndOfSegment".  Segments end when one or more
-  // frames are parsed from an append.  If the append contains a partial frame
-  // the segment will continue into the next append.
-  //
-  // Parsed frame(s) are represented as "{ xxK yyK zzK }"  Where xx, yy, and zz
-  // are the timestamps in milliseconds of each parsed frame.  For example:
-  //
-  //     "NewSegment{ 0K 23K 46K }EndOfSegment"
-  //     "NewSegment{ 0K }{ 23K }{ 46K }EndOfSegment"
-  //     "NewSegment{ 0K }{ 23K }EndOfSegmentNewSegment{ 46K }EndOfSegment"
-  //
-  std::string ParseFile(const std::string& filename, int append_bytes);
-
-  // Similar to ParseFile() except parses the given |data| in a single append of
-  // size |length|.
-  std::string ParseData(const uint8_t* data, size_t length);
-
-  // The last AudioDecoderConfig handed to OnNewConfig().
-  const AudioDecoderConfig& last_audio_config() const {
-    return last_audio_config_;
-  }
-
- private:
-  bool AppendDataInPieces(const uint8_t* data, size_t length,
-                          size_t piece_size);
-  void OnInitDone(const StreamParser::InitParameters& params);
-  bool OnNewConfig(std::unique_ptr<MediaTracks> tracks,
-                   const StreamParser::TextTrackConfigMap& text_config);
-  bool OnNewBuffers(const StreamParser::BufferQueueMap& buffer_queue_map);
-  void OnKeyNeeded(EmeInitDataType type, const std::vector<uint8_t>& init_data);
-  void OnNewSegment();
-  void OnEndOfSegment();
-
-  std::unique_ptr<StreamParser> parser_;
-  std::stringstream results_stream_;
-  AudioDecoderConfig last_audio_config_;
-  StreamParser::TrackId audio_track_id_;
-
-  DISALLOW_COPY_AND_ASSIGN(StreamParserTestBase);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_COMMON_STREAM_PARSER_TEST_BASE_H_
diff --git a/cobalt/media/formats/mp2t/es_adapter_video.cc b/cobalt/media/formats/mp2t/es_adapter_video.cc
deleted file mode 100644
index 92a72f3..0000000
--- a/cobalt/media/formats/mp2t/es_adapter_video.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp2t/es_adapter_video.h"
-
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-// Arbitrary decision about the frame duration when there is no previous
-// hint about what could be the frame duration.
-static const int kDefaultFrameDurationMs = 40;
-
-// To calculate the frame duration, we make an assumption
-// that the timestamp of the next frame in presentation order
-// is no further than 5 frames away in decode order.
-// TODO(damienv): the previous assumption should cover most of the practical
-// cases. However, the right way to calculate the frame duration would be
-// to emulate the H264 dpb bumping process.
-static const size_t kHistorySize = 5;
-
-EsAdapterVideo::EsAdapterVideo(const NewVideoConfigCB& new_video_config_cb,
-                               const EmitBufferCB& emit_buffer_cb)
-    : new_video_config_cb_(new_video_config_cb),
-      emit_buffer_cb_(emit_buffer_cb),
-      has_valid_config_(false),
-      has_valid_frame_(false),
-      last_frame_duration_(
-          base::TimeDelta::FromMilliseconds(kDefaultFrameDurationMs)),
-      buffer_index_(0),
-      has_valid_initial_timestamp_(false),
-      discarded_frame_count_(0) {}
-
-EsAdapterVideo::~EsAdapterVideo() {}
-
-void EsAdapterVideo::Flush() { ProcessPendingBuffers(true); }
-
-void EsAdapterVideo::Reset() {
-  has_valid_config_ = false;
-  has_valid_frame_ = false;
-
-  last_frame_duration_ =
-      base::TimeDelta::FromMilliseconds(kDefaultFrameDurationMs);
-
-  config_list_.clear();
-  buffer_index_ = 0;
-  buffer_list_.clear();
-  emitted_pts_.clear();
-
-  has_valid_initial_timestamp_ = false;
-  min_pts_ = base::TimeDelta();
-  min_dts_ = DecodeTimestamp();
-
-  discarded_frame_count_ = 0;
-}
-
-void EsAdapterVideo::OnConfigChanged(
-    const VideoDecoderConfig& video_decoder_config) {
-  config_list_.push_back(
-      ConfigEntry(buffer_index_ + buffer_list_.size(), video_decoder_config));
-  has_valid_config_ = true;
-  ProcessPendingBuffers(false);
-}
-
-bool EsAdapterVideo::OnNewBuffer(
-    const scoped_refptr<StreamParserBuffer>& stream_parser_buffer) {
-  if (stream_parser_buffer->timestamp() == kNoTimestamp) {
-    if (has_valid_frame_) {
-      // There is currently no error concealment for a missing timestamp
-      // in the middle of the stream.
-      DVLOG(1) << "Missing timestamp in the middle of the stream";
-      return false;
-    }
-
-    if (!has_valid_initial_timestamp_) {
-      // MPEG-2 TS requires the first access unit to be given a timestamp.
-      // However, some streams do not comply with this requirement.
-      // So simply drop the frame if it is a leading frame with no timestamp.
-      DVLOG(1)
-          << "Stream not compliant: ignoring leading frame with no timestamp";
-      return true;
-    }
-
-    // In all the other cases, this frame will be replaced by the following
-    // valid key frame, using timestamp interpolation.
-    DCHECK(has_valid_initial_timestamp_);
-    DCHECK_GE(discarded_frame_count_, 1);
-    discarded_frame_count_++;
-    return true;
-  }
-
-  // At this point, timestamps of the incoming frame are valid.
-  if (!has_valid_initial_timestamp_) {
-    min_pts_ = stream_parser_buffer->timestamp();
-    min_dts_ = stream_parser_buffer->GetDecodeTimestamp();
-    has_valid_initial_timestamp_ = true;
-  }
-  if (stream_parser_buffer->timestamp() < min_pts_)
-    min_pts_ = stream_parser_buffer->timestamp();
-
-  // Discard the incoming frame:
-  // - if it is not associated with any config,
-  // - or if no valid key frame has been found so far.
-  if (!has_valid_config_ ||
-      (!has_valid_frame_ && !stream_parser_buffer->is_key_frame())) {
-    discarded_frame_count_++;
-    return true;
-  }
-
-  has_valid_frame_ = true;
-
-  if (discarded_frame_count_ > 0) {
-    if (!ReplaceDiscardedFrames(stream_parser_buffer)) {
-      return false;
-    }
-  }
-
-  buffer_list_.push_back(stream_parser_buffer);
-  ProcessPendingBuffers(false);
-  return true;
-}
-
-void EsAdapterVideo::ProcessPendingBuffers(bool flush) {
-  DCHECK(has_valid_config_);
-
-  while (!buffer_list_.empty() &&
-         (flush || buffer_list_.size() > kHistorySize)) {
-    // Signal a config change, just before emitting the corresponding frame.
-    if (!config_list_.empty() && config_list_.front().first == buffer_index_) {
-      new_video_config_cb_.Run(config_list_.front().second);
-      config_list_.pop_front();
-    }
-
-    scoped_refptr<StreamParserBuffer> buffer = buffer_list_.front();
-    buffer_list_.pop_front();
-    buffer_index_++;
-
-    if (buffer->duration() == kNoTimestamp) {
-      base::TimeDelta next_frame_pts = GetNextFramePts(buffer->timestamp());
-      if (next_frame_pts == kNoTimestamp) {
-        // This can happen when emitting the very last buffer
-        // or if the stream do not meet the assumption behind |kHistorySize|.
-        DVLOG(LOG_LEVEL_ES) << "Using last frame duration: "
-                            << last_frame_duration_.InMilliseconds();
-        buffer->set_duration(last_frame_duration_);
-      } else {
-        base::TimeDelta duration = next_frame_pts - buffer->timestamp();
-        DVLOG(LOG_LEVEL_ES) << "Frame duration: " << duration.InMilliseconds();
-        buffer->set_duration(duration);
-      }
-    }
-
-    emitted_pts_.push_back(buffer->timestamp());
-    if (emitted_pts_.size() > kHistorySize) emitted_pts_.pop_front();
-
-    last_frame_duration_ = buffer->duration();
-    emit_buffer_cb_.Run(buffer);
-  }
-}
-
-base::TimeDelta EsAdapterVideo::GetNextFramePts(base::TimeDelta current_pts) {
-  base::TimeDelta next_pts = kNoTimestamp;
-
-  // Consider the timestamps of future frames (in decode order).
-  // Note: the next frame is not enough when the GOP includes some B frames.
-  for (BufferQueue::const_iterator it = buffer_list_.begin();
-       it != buffer_list_.end(); ++it) {
-    if ((*it)->timestamp() < current_pts) continue;
-    if (next_pts == kNoTimestamp || next_pts > (*it)->timestamp())
-      next_pts = (*it)->timestamp();
-  }
-
-  // Consider the timestamps of previous frames (in decode order).
-  // In a simple GOP structure with B frames, the frame next to the last B
-  // frame (in presentation order) is located before in decode order.
-  for (std::list<base::TimeDelta>::const_iterator it = emitted_pts_.begin();
-       it != emitted_pts_.end(); ++it) {
-    if (*it < current_pts) continue;
-    if (next_pts == kNoTimestamp || next_pts > *it) next_pts = *it;
-  }
-
-  return next_pts;
-}
-
-void EsAdapterVideo::ReplaceDiscardedFrames(
-    const scoped_refptr<StreamParserBuffer>& stream_parser_buffer) {
-  DCHECK_GT(discarded_frame_count_, 0);
-  DCHECK(stream_parser_buffer->is_key_frame());
-
-  // PTS/DTS are interpolated between the min PTS/DTS of discarded frames
-  // and the PTS/DTS of the first valid buffer.
-  // Note: |pts_delta| and |dts_delta| are calculated using integer division.
-  // Interpolation thus accumulates small errors. However, since timestamps
-  // are given in microseconds, only a high number of discarded frames
-  // (in the order of 10000s) could have an impact and create a gap (from MSE
-  // point of view) between the last interpolated frame and
-  // |stream_parser_buffer|.
-  base::TimeDelta pts = min_pts_;
-  base::TimeDelta pts_delta =
-      (stream_parser_buffer->timestamp() - pts) / discarded_frame_count_;
-  DecodeTimestamp dts = min_dts_;
-  base::TimeDelta dts_delta =
-      (stream_parser_buffer->GetDecodeTimestamp() - dts) /
-      discarded_frame_count_;
-
-  for (int i = 0; i < discarded_frame_count_; i++) {
-    scoped_refptr<StreamParserBuffer> frame = StreamParserBuffer::CopyFrom(
-        stream_parser_buffer->data(), stream_parser_buffer->data_size(),
-        stream_parser_buffer->is_key_frame(), stream_parser_buffer->type(),
-        stream_parser_buffer->track_id());
-    if (!frame) {
-      return false;
-    }
-    frame->SetDecodeTimestamp(dts);
-    frame->set_timestamp(pts);
-    frame->set_duration(pts_delta);
-    buffer_list_.push_back(frame);
-    pts += pts_delta;
-    dts += dts_delta;
-  }
-  discarded_frame_count_ = 0;
-  return true;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_adapter_video.h b/cobalt/media/formats/mp2t/es_adapter_video.h
deleted file mode 100644
index e8e5ddd..0000000
--- a/cobalt/media/formats/mp2t/es_adapter_video.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 COBALT_MEDIA_FORMATS_MP2T_ES_ADAPTER_VIDEO_H_
-#define COBALT_MEDIA_FORMATS_MP2T_ES_ADAPTER_VIDEO_H_
-
-#include <deque>
-#include <list>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class VideoDecoderConfig;
-
-namespace mp2t {
-
-// Some constraints of the MSE spec are not necessarily met by video streams
-// inside an Mpeg2 TS stream.
-// The goal of the ES adapter is to modify the incoming buffers to meet these
-// constraints, e.g.
-// - get the frame duration,
-// - replace the leading non-key frames by the first key frame to avoid
-//   creating a hole in the video timeline.
-class MEDIA_EXPORT EsAdapterVideo {
- public:
-  typedef base::Callback<void(const VideoDecoderConfig&)> NewVideoConfigCB;
-  typedef base::Callback<void(scoped_refptr<StreamParserBuffer>)> EmitBufferCB;
-
-  EsAdapterVideo(const NewVideoConfigCB& new_video_config_cb,
-                 const EmitBufferCB& emit_buffer_cb);
-  ~EsAdapterVideo();
-
-  // Force the emission of the pending video buffers.
-  void Flush();
-
-  // Reset the ES adapter to its initial state.
-  void Reset();
-
-  // Provide the configuration that applies to the upcoming video buffers.
-  void OnConfigChanged(const VideoDecoderConfig& video_decoder_config);
-
-  // Provide a new video buffer.
-  // Returns true when successful.
-  bool OnNewBuffer(
-      const scoped_refptr<StreamParserBuffer>& stream_parser_buffer);
-
- private:
-  typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue;
-  typedef std::pair<int64_t, VideoDecoderConfig> ConfigEntry;
-
-  void ProcessPendingBuffers(bool flush);
-
-  // Return the PTS of the frame that comes just after |current_pts| in
-  // presentation order. Return kNoTimestamp if not found.
-  base::TimeDelta GetNextFramePts(base::TimeDelta current_pts);
-
-  // Replace the leading non key frames by |stream_parser_buffer|
-  // (this one must be a key frame).
-  void ReplaceDiscardedFrames(
-      const scoped_refptr<StreamParserBuffer>& stream_parser_buffer);
-
-  NewVideoConfigCB new_video_config_cb_;
-  EmitBufferCB emit_buffer_cb_;
-
-  bool has_valid_config_;
-  bool has_valid_frame_;
-
-  // Duration of the last video frame.
-  base::TimeDelta last_frame_duration_;
-
-  // Association between a video config and a buffer index.
-  std::list<ConfigEntry> config_list_;
-
-  // Global index of the first buffer in |buffer_list_|.
-  int64_t buffer_index_;
-
-  // List of buffer to be emitted and PTS of frames already emitted.
-  BufferQueue buffer_list_;
-  std::list<base::TimeDelta> emitted_pts_;
-
-  // Minimum PTS/DTS since the last Reset.
-  bool has_valid_initial_timestamp_;
-  base::TimeDelta min_pts_;
-  DecodeTimestamp min_dts_;
-
-  // Number of frames to replace with the first valid key frame.
-  int discarded_frame_count_;
-
-  DISALLOW_COPY_AND_ASSIGN(EsAdapterVideo);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_ES_ADAPTER_VIDEO_H_
diff --git a/cobalt/media/formats/mp2t/es_adapter_video_unittest.cc b/cobalt/media/formats/mp2t/es_adapter_video_unittest.cc
deleted file mode 100644
index 65e5882..0000000
--- a/cobalt/media/formats/mp2t/es_adapter_video_unittest.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string_util.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/formats/mp2t/es_adapter_video.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-namespace {
-
-VideoDecoderConfig CreateFakeVideoConfig() {
-  math::Size coded_size(320, 240);
-  math::Rect visible_rect(0, 0, 320, 240);
-  math::Size natural_size(320, 240);
-  return VideoDecoderConfig(kCodecH264, H264PROFILE_MAIN, PIXEL_FORMAT_I420,
-                            COLOR_SPACE_UNSPECIFIED, coded_size, visible_rect,
-                            natural_size, EmptyExtraData(), Unencrypted());
-}
-
-StreamParserBuffer::BufferQueue GenerateFakeBuffers(const int* frame_pts_ms,
-                                                    const bool* is_key_frame,
-                                                    size_t frame_count) {
-  uint8_t dummy_buffer[] = {0, 0, 0, 0};
-
-  StreamParserBuffer::BufferQueue buffers(frame_count);
-  for (size_t k = 0; k < frame_count; k++) {
-    buffers[k] =
-        StreamParserBuffer::CopyFrom(dummy_buffer, arraysize(dummy_buffer),
-                                     is_key_frame[k], DemuxerStream::VIDEO, 0);
-    ASSERT_TRUE(buffers[k]);
-    if (frame_pts_ms[k] < 0) {
-      buffers[k]->set_timestamp(kNoTimestamp);
-    } else {
-      buffers[k]->set_timestamp(
-          base::TimeDelta::FromMilliseconds(frame_pts_ms[k]));
-    }
-  }
-  return buffers;
-}
-
-}  // namespace
-
-class EsAdapterVideoTest : public testing::Test {
- public:
-  EsAdapterVideoTest();
-
- protected:
-  // Feed the ES adapter with the buffers from |buffer_queue|.
-  // Return the durations computed by the ES adapter as well as
-  // whether each frame emitted by the adapter is a key frame.
-  std::string RunAdapterTest(const StreamParser::BufferQueue& buffer_queue);
-
- private:
-  void OnNewConfig(const VideoDecoderConfig& video_config);
-  void OnNewBuffer(scoped_refptr<StreamParserBuffer> buffer);
-
-  EsAdapterVideo es_adapter_;
-
-  std::stringstream buffer_descriptors_;
-
-  DISALLOW_COPY_AND_ASSIGN(EsAdapterVideoTest);
-};
-
-EsAdapterVideoTest::EsAdapterVideoTest()
-    : es_adapter_(
-          base::Bind(&EsAdapterVideoTest::OnNewConfig, base::Unretained(this)),
-          base::Bind(&EsAdapterVideoTest::OnNewBuffer,
-                     base::Unretained(this))) {}
-
-void EsAdapterVideoTest::OnNewConfig(const VideoDecoderConfig& video_config) {}
-
-void EsAdapterVideoTest::OnNewBuffer(scoped_refptr<StreamParserBuffer> buffer) {
-  buffer_descriptors_ << "(" << buffer->duration().InMilliseconds() << ","
-                      << (buffer->is_key_frame() ? "Y" : "N") << ") ";
-}
-
-std::string EsAdapterVideoTest::RunAdapterTest(
-    const StreamParserBuffer::BufferQueue& buffer_queue) {
-  buffer_descriptors_.clear();
-
-  es_adapter_.OnConfigChanged(CreateFakeVideoConfig());
-  for (StreamParserBuffer::BufferQueue::const_iterator it =
-           buffer_queue.begin();
-       it != buffer_queue.end(); ++it) {
-    es_adapter_.OnNewBuffer(*it);
-  }
-  es_adapter_.Flush();
-
-  std::string s = buffer_descriptors_.str();
-  base::TrimWhitespaceASCII(s, base::TRIM_ALL, &s);
-  return s;
-}
-
-TEST_F(EsAdapterVideoTest, FrameDurationSimpleGop) {
-  // PTS for a GOP without B frames - strictly increasing.
-  int pts_ms[] = {30, 31, 33, 36, 40, 45, 51, 58};
-  bool is_key_frame[] = {true, false, false, false, false, false, false, false};
-  StreamParserBuffer::BufferQueue buffer_queue =
-      GenerateFakeBuffers(pts_ms, is_key_frame, arraysize(pts_ms));
-
-  EXPECT_EQ("(1,Y) (2,N) (3,N) (4,N) (5,N) (6,N) (7,N) (7,N)",
-            RunAdapterTest(buffer_queue));
-}
-
-TEST_F(EsAdapterVideoTest, FrameDurationComplexGop) {
-  // PTS for a GOP with B frames.
-  int pts_ms[] = {30, 120, 60, 90, 210, 150, 180, 300, 240, 270};
-  bool is_key_frame[] = {true,  false, false, false, false,
-                         false, false, false, false, false};
-  StreamParserBuffer::BufferQueue buffer_queue =
-      GenerateFakeBuffers(pts_ms, is_key_frame, arraysize(pts_ms));
-
-  EXPECT_EQ(
-      "(30,Y) (30,N) (30,N) (30,N) (30,N) "
-      "(30,N) (30,N) (30,N) (30,N) (30,N)",
-      RunAdapterTest(buffer_queue));
-}
-
-TEST_F(EsAdapterVideoTest, LeadingNonKeyFrames) {
-  int pts_ms[] = {30, 40, 50, 120, 150, 180};
-  bool is_key_frame[] = {false, false, false, true, false, false};
-  StreamParserBuffer::BufferQueue buffer_queue =
-      GenerateFakeBuffers(pts_ms, is_key_frame, arraysize(pts_ms));
-
-  EXPECT_EQ("(30,Y) (30,Y) (30,Y) (30,Y) (30,N) (30,N)",
-            RunAdapterTest(buffer_queue));
-}
-
-TEST_F(EsAdapterVideoTest, LeadingKeyFrameWithNoTimestamp) {
-  int pts_ms[] = {-1, 40, 50, 120, 150, 180};
-  bool is_key_frame[] = {true, false, false, true, false, false};
-  StreamParserBuffer::BufferQueue buffer_queue =
-      GenerateFakeBuffers(pts_ms, is_key_frame, arraysize(pts_ms));
-
-  EXPECT_EQ("(40,Y) (40,Y) (30,Y) (30,N) (30,N)", RunAdapterTest(buffer_queue));
-}
-
-TEST_F(EsAdapterVideoTest, LeadingFramesWithNoTimestamp) {
-  int pts_ms[] = {-1, -1, 50, 120, 150, 180};
-  bool is_key_frame[] = {false, false, false, true, false, false};
-  StreamParserBuffer::BufferQueue buffer_queue =
-      GenerateFakeBuffers(pts_ms, is_key_frame, arraysize(pts_ms));
-
-  EXPECT_EQ("(70,Y) (30,Y) (30,N) (30,N)", RunAdapterTest(buffer_queue));
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_parser.cc b/cobalt/media/formats/mp2t/es_parser.cc
deleted file mode 100644
index d20c634..0000000
--- a/cobalt/media/formats/mp2t/es_parser.cc
+++ /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.
-
-#include "cobalt/media/formats/mp2t/es_parser.h"
-
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/common/offset_byte_queue.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-EsParser::TimingDesc::TimingDesc()
-    : dts(kNoDecodeTimestamp()), pts(kNoTimestamp) {}
-
-EsParser::TimingDesc::TimingDesc(DecodeTimestamp dts_in, base::TimeDelta pts_in)
-    : dts(dts_in), pts(pts_in) {}
-
-EsParser::EsParser() : es_queue_(new media::OffsetByteQueue()) {}
-
-EsParser::~EsParser() {}
-
-bool EsParser::Parse(const uint8_t* buf, int size, base::TimeDelta pts,
-                     DecodeTimestamp dts) {
-  DCHECK(buf);
-  DCHECK_GT(size, 0);
-
-  if (pts != kNoTimestamp) {
-    // Link the end of the byte queue with the incoming timing descriptor.
-    TimingDesc timing_desc(dts, pts);
-    timing_desc_list_.push_back(
-        std::pair<int64_t, TimingDesc>(es_queue_->tail(), timing_desc));
-  }
-
-  // Add the incoming bytes to the ES queue.
-  es_queue_->Push(buf, size);
-  return ParseFromEsQueue();
-}
-
-void EsParser::Reset() {
-  es_queue_.reset(new media::OffsetByteQueue());
-  timing_desc_list_.clear();
-  ResetInternal();
-}
-
-EsParser::TimingDesc EsParser::GetTimingDescriptor(int64_t es_byte_count) {
-  TimingDesc timing_desc;
-  while (!timing_desc_list_.empty() &&
-         timing_desc_list_.front().first <= es_byte_count) {
-    timing_desc = timing_desc_list_.front().second;
-    timing_desc_list_.pop_front();
-  }
-  return timing_desc;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_parser.h b/cobalt/media/formats/mp2t/es_parser.h
deleted file mode 100644
index 6b2a989..0000000
--- a/cobalt/media/formats/mp2t/es_parser.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_H_
-#define COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_H_
-
-#include <list>
-#include <memory>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class OffsetByteQueue;
-class StreamParserBuffer;
-
-namespace mp2t {
-
-class MEDIA_EXPORT EsParser {
- public:
-  typedef base::Callback<void(scoped_refptr<StreamParserBuffer>)> EmitBufferCB;
-
-  EsParser();
-  virtual ~EsParser();
-
-  // ES parsing.
-  // Should use kNoTimestamp when a timestamp is not valid.
-  bool Parse(const uint8_t* buf, int size, base::TimeDelta pts,
-             DecodeTimestamp dts);
-
-  // Flush any pending buffer.
-  virtual void Flush() = 0;
-
-  // Reset the state of the ES parser.
-  void Reset();
-
- protected:
-  struct TimingDesc {
-    TimingDesc();
-    TimingDesc(DecodeTimestamp dts, base::TimeDelta pts);
-
-    DecodeTimestamp dts;
-    base::TimeDelta pts;
-  };
-
-  // Parse ES data from |es_queue_|.
-  // Return true when successful.
-  virtual bool ParseFromEsQueue() = 0;
-
-  // Reset the internal state of the ES parser.
-  virtual void ResetInternal() = 0;
-
-  // Get the timing descriptor with the largest byte count that is less or
-  // equal to |es_byte_count|.
-  // This timing descriptor and all the ones that come before (in stream order)
-  // are removed from list |timing_desc_list_|.
-  // If no timing descriptor is found, then the default TimingDesc is returned.
-  TimingDesc GetTimingDescriptor(int64_t es_byte_count);
-
-  // Bytes of the ES stream that have not been emitted yet.
-  std::unique_ptr<media::OffsetByteQueue> es_queue_;
-
- private:
-  // Anchor some timing information into the ES queue.
-  // Here are two examples how this timing info is applied according to
-  // the MPEG-2 TS spec - ISO/IEC 13818:
-  // - "In the case of audio, if a PTS is present in PES packet header it shall
-  // refer to the first access unit commencing in the PES packet. An audio
-  // access unit commences in a PES packet if the first byte of the audio
-  // access unit is present in the PES packet."
-  // - "For AVC video streams conforming to one or more profiles defined
-  // in Annex A of Rec. ITU-T H.264 | ISO/IEC 14496-10 video, if a PTS is
-  // present in the PES packet header, it shall refer to the first AVC access
-  // unit that commences in this PES packet.
-  std::list<std::pair<int64_t, TimingDesc>> timing_desc_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(EsParser);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_H_
diff --git a/cobalt/media/formats/mp2t/es_parser_adts.cc b/cobalt/media/formats/mp2t/es_parser_adts.cc
deleted file mode 100644
index 6773610..0000000
--- a/cobalt/media/formats/mp2t/es_parser_adts.cc
+++ /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.
-
-#include "cobalt/media/formats/mp2t/es_parser_adts.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/media/base/audio_timestamp_helper.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/common/offset_byte_queue.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-#include "cobalt/media/formats/mpeg/adts_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-static int ExtractAdtsFrameSize(const uint8_t* adts_header) {
-  return ((static_cast<int>(adts_header[5]) >> 5) |
-          (static_cast<int>(adts_header[4]) << 3) |
-          ((static_cast<int>(adts_header[3]) & 0x3) << 11));
-}
-
-// Return true if buf corresponds to an ADTS syncword.
-// |buf| size must be at least 2.
-static bool isAdtsSyncWord(const uint8_t* buf) {
-  // The first 12 bits must be 1.
-  // The layer field (2 bits) must be set to 0.
-  return (buf[0] == 0xff) && ((buf[1] & 0xf6) == 0xf0);
-}
-
-namespace mp2t {
-
-struct EsParserAdts::AdtsFrame {
-  // Pointer to the ES data.
-  const uint8_t* data;
-
-  // Frame size;
-  int size;
-
-  // Frame offset in the ES queue.
-  int64_t queue_offset;
-};
-
-bool EsParserAdts::LookForAdtsFrame(AdtsFrame* adts_frame) {
-  int es_size;
-  const uint8_t* es;
-  es_queue_->Peek(&es, &es_size);
-
-  int max_offset = es_size - kADTSHeaderMinSize;
-  if (max_offset <= 0) return false;
-
-  for (int offset = 0; offset < max_offset; offset++) {
-    const uint8_t* cur_buf = &es[offset];
-    if (!isAdtsSyncWord(cur_buf)) continue;
-
-    int frame_size = ExtractAdtsFrameSize(cur_buf);
-    if (frame_size < kADTSHeaderMinSize) {
-      // Too short to be an ADTS frame.
-      continue;
-    }
-
-    int remaining_size = es_size - offset;
-    if (remaining_size < frame_size) {
-      // Not a full frame: will resume when we have more data.
-      es_queue_->Pop(offset);
-      return false;
-    }
-
-    // Check whether there is another frame
-    // |size| apart from the current one.
-    if (remaining_size >= frame_size + 2 &&
-        !isAdtsSyncWord(&cur_buf[frame_size])) {
-      continue;
-    }
-
-    es_queue_->Pop(offset);
-    es_queue_->Peek(&adts_frame->data, &es_size);
-    adts_frame->queue_offset = es_queue_->head();
-    adts_frame->size = frame_size;
-    DVLOG(LOG_LEVEL_ES) << "ADTS syncword @ pos=" << adts_frame->queue_offset
-                        << " frame_size=" << adts_frame->size;
-    DVLOG(LOG_LEVEL_ES) << "ADTS header: "
-                        << base::HexEncode(adts_frame->data,
-                                           kADTSHeaderMinSize);
-    return true;
-  }
-
-  es_queue_->Pop(max_offset);
-  return false;
-}
-
-void EsParserAdts::SkipAdtsFrame(const AdtsFrame& adts_frame) {
-  DCHECK_EQ(adts_frame.queue_offset, es_queue_->head());
-  es_queue_->Pop(adts_frame.size);
-}
-
-EsParserAdts::EsParserAdts(const NewAudioConfigCB& new_audio_config_cb,
-                           const EmitBufferCB& emit_buffer_cb,
-                           bool sbr_in_mimetype)
-    : new_audio_config_cb_(new_audio_config_cb),
-      emit_buffer_cb_(emit_buffer_cb),
-      sbr_in_mimetype_(sbr_in_mimetype) {}
-
-EsParserAdts::~EsParserAdts() {}
-
-bool EsParserAdts::ParseFromEsQueue() {
-  // Look for every ADTS frame in the ES buffer.
-  AdtsFrame adts_frame;
-  while (LookForAdtsFrame(&adts_frame)) {
-    // Update the audio configuration if needed.
-    DCHECK_GE(adts_frame.size, kADTSHeaderMinSize);
-    if (!UpdateAudioConfiguration(adts_frame.data, adts_frame.size))
-      return false;
-
-    // Get the PTS & the duration of this access unit.
-    TimingDesc current_timing_desc =
-        GetTimingDescriptor(adts_frame.queue_offset);
-    if (current_timing_desc.pts != kNoTimestamp)
-      audio_timestamp_helper_->SetBaseTimestamp(current_timing_desc.pts);
-
-    if (audio_timestamp_helper_->base_timestamp() == kNoTimestamp) {
-      DVLOG(1) << "Skipping audio frame with unknown timestamp";
-      SkipAdtsFrame(adts_frame);
-      continue;
-    }
-    base::TimeDelta current_pts = audio_timestamp_helper_->GetTimestamp();
-    base::TimeDelta frame_duration =
-        audio_timestamp_helper_->GetFrameDuration(kSamplesPerAACFrame);
-
-    // Emit an audio frame.
-    bool is_key_frame = true;
-
-    // TODO(wolenetz/acolwell): Validate and use a common cross-parser TrackId
-    // type and allow multiple audio tracks. See https://crbug.com/341581.
-    scoped_refptr<StreamParserBuffer> stream_parser_buffer =
-        StreamParserBuffer::CopyFrom(adts_frame.data, adts_frame.size,
-                                     is_key_frame, DemuxerStream::AUDIO,
-                                     kMp2tAudioTrackId);
-    if (!stream_parser_buffer) {
-      return false;
-    }
-    stream_parser_buffer->set_timestamp(current_pts);
-    stream_parser_buffer->SetDecodeTimestamp(
-        DecodeTimestamp::FromPresentationTime(current_pts));
-    stream_parser_buffer->set_duration(frame_duration);
-    emit_buffer_cb_.Run(stream_parser_buffer);
-
-    // Update the PTS of the next frame.
-    audio_timestamp_helper_->AddFrames(kSamplesPerAACFrame);
-
-    // Skip the current frame.
-    SkipAdtsFrame(adts_frame);
-  }
-
-  return true;
-}
-
-void EsParserAdts::Flush() {}
-
-void EsParserAdts::ResetInternal() {
-  last_audio_decoder_config_ = AudioDecoderConfig();
-}
-
-bool EsParserAdts::UpdateAudioConfiguration(const uint8_t* adts_header,
-                                            int size) {
-  int orig_sample_rate;
-  ChannelLayout channel_layout;
-  std::vector<uint8_t> extra_data;
-  if (adts_parser_.ParseFrameHeader(adts_header, size, nullptr,
-                                    &orig_sample_rate, &channel_layout, nullptr,
-                                    nullptr, &extra_data) <= 0) {
-    return false;
-  }
-
-  // The following code is written according to ISO 14496 Part 3 Table 1.11 and
-  // Table 1.22. (Table 1.11 refers to the capping to 48000, Table 1.22 refers
-  // to SBR doubling the AAC sample rate.)
-  // TODO(damienv) : Extend sample rate cap to 96kHz for Level 5 content.
-  const int extended_samples_per_second =
-      sbr_in_mimetype_ ? std::min(2 * orig_sample_rate, 48000)
-                       : orig_sample_rate;
-
-  AudioDecoderConfig audio_decoder_config(
-      kCodecAAC, kSampleFormatS16, channel_layout, extended_samples_per_second,
-      extra_data, Unencrypted());
-
-  if (!audio_decoder_config.Matches(last_audio_decoder_config_)) {
-    DVLOG(1) << "Sampling frequency: "
-             << audio_decoder_config.samples_per_second()
-             << " SBR=" << sbr_in_mimetype_;
-    DVLOG(1) << "Channel layout: "
-             << ChannelLayoutToString(audio_decoder_config.channel_layout());
-
-    // For AAC audio with SBR (Spectral Band Replication) the sampling rate is
-    // doubled above, but AudioTimestampHelper should still use the original
-    // sample rate to compute audio timestamps and durations correctly.
-
-    // Reset the timestamp helper to use a new time scale.
-    if (audio_timestamp_helper_ &&
-        audio_timestamp_helper_->base_timestamp() != kNoTimestamp) {
-      base::TimeDelta base_timestamp = audio_timestamp_helper_->GetTimestamp();
-      audio_timestamp_helper_.reset(new AudioTimestampHelper(orig_sample_rate));
-      audio_timestamp_helper_->SetBaseTimestamp(base_timestamp);
-    } else {
-      audio_timestamp_helper_.reset(new AudioTimestampHelper(orig_sample_rate));
-    }
-    // Audio config notification.
-    last_audio_decoder_config_ = audio_decoder_config;
-    new_audio_config_cb_.Run(audio_decoder_config);
-  }
-
-  return true;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_parser_adts.h b/cobalt/media/formats/mp2t/es_parser_adts.h
deleted file mode 100644
index 7630ff7..0000000
--- a/cobalt/media/formats/mp2t/es_parser_adts.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_ADTS_H_
-#define COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_ADTS_H_
-
-#include <list>
-#include <memory>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/formats/mp2t/es_parser.h"
-#include "cobalt/media/formats/mpeg/adts_stream_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-class AudioTimestampHelper;
-class BitReader;
-class OffsetByteQueue;
-class StreamParserBuffer;
-}  // namespace media
-}  // namespace cobalt
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-class MEDIA_EXPORT EsParserAdts : public EsParser {
- public:
-  typedef base::Callback<void(const AudioDecoderConfig&)> NewAudioConfigCB;
-
-  EsParserAdts(const NewAudioConfigCB& new_audio_config_cb,
-               const EmitBufferCB& emit_buffer_cb, bool sbr_in_mimetype);
-  ~EsParserAdts() override;
-
-  // EsParser implementation.
-  void Flush() override;
-
- private:
-  struct AdtsFrame;
-
-  // EsParser implementation.
-  bool ParseFromEsQueue() override;
-  void ResetInternal() override;
-
-  // Synchronize the stream on an ADTS syncword (consuming bytes from
-  // |es_queue_| if needed).
-  // Returns true when a full ADTS frame has been found: in that case
-  // |adts_frame| structure is filled up accordingly.
-  // Returns false otherwise (no ADTS syncword found or partial ADTS frame).
-  bool LookForAdtsFrame(AdtsFrame* adts_frame);
-
-  // Skip an ADTS frame in the ES queue.
-  void SkipAdtsFrame(const AdtsFrame& adts_frame);
-
-  // Signal any audio configuration change (if any).
-  // Return false if the current audio config is not
-  // a supported ADTS audio config.
-  bool UpdateAudioConfiguration(const uint8_t* adts_header, int size);
-
-  // Callbacks:
-  // - to signal a new audio configuration,
-  // - to send ES buffers.
-  NewAudioConfigCB new_audio_config_cb_;
-  EmitBufferCB emit_buffer_cb_;
-
-  // True when AAC SBR extension is signalled in the mimetype
-  // (mp4a.40.5 in the codecs parameter).
-  bool sbr_in_mimetype_;
-
-  // Interpolated PTS for frames that don't have one.
-  std::unique_ptr<AudioTimestampHelper> audio_timestamp_helper_;
-
-  // Last audio config.
-  AudioDecoderConfig last_audio_decoder_config_;
-
-  ADTSStreamParser adts_parser_;
-
-  DISALLOW_COPY_AND_ASSIGN(EsParserAdts);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_ADTS_H_
diff --git a/cobalt/media/formats/mp2t/es_parser_adts_unittest.cc b/cobalt/media/formats/mp2t/es_parser_adts_unittest.cc
deleted file mode 100644
index 92b63fc..0000000
--- a/cobalt/media/formats/mp2t/es_parser_adts_unittest.cc
+++ /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.
-
-#include <vector>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/formats/mp2t/es_parser_adts.h"
-#include "cobalt/media/formats/mp2t/es_parser_test_base.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-class AudioDecoderConfig;
-
-namespace mp2t {
-namespace {
-const char kAac44100PacketTimestamp[] = "(0) (23) (46) (69)";
-}
-
-class EsParserAdtsTest : public EsParserTestBase, public testing::Test {
- public:
-  EsParserAdtsTest();
-
- protected:
-  bool Process(const std::vector<Packet>& pes_packets, bool sbr_in_mimetype);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(EsParserAdtsTest);
-};
-
-EsParserAdtsTest::EsParserAdtsTest() {}
-
-bool EsParserAdtsTest::Process(const std::vector<Packet>& pes_packets,
-                               bool sbr_in_mimetype) {
-  EsParserAdts es_parser(
-      base::Bind(&EsParserAdtsTest::NewAudioConfig, base::Unretained(this)),
-      base::Bind(&EsParserAdtsTest::EmitBuffer, base::Unretained(this)),
-      sbr_in_mimetype);
-  return ProcessPesPackets(&es_parser, pes_packets, false /* force_timing */);
-}
-
-TEST_F(EsParserAdtsTest, NoInitialPts) {
-  LoadStream("bear.adts");
-  std::vector<Packet> pes_packets = GenerateFixedSizePesPacket(512);
-  // Process should succeed even without timing info, we should just skip the
-  // audio frames without timing info, but still should be able to parse and
-  // play the stream after that.
-  EXPECT_TRUE(Process(pes_packets, false /* sbr_in_mimetype */));
-  EXPECT_EQ(1u, config_count_);
-  EXPECT_EQ(0u, buffer_count_);
-}
-
-TEST_F(EsParserAdtsTest, SinglePts) {
-  LoadStream("bear.adts");
-
-  std::vector<Packet> pes_packets = GenerateFixedSizePesPacket(512);
-  pes_packets.front().pts = base::TimeDelta::FromSeconds(10);
-
-  EXPECT_TRUE(Process(pes_packets, false /* sbr_in_mimetype */));
-  EXPECT_EQ(1u, config_count_);
-  EXPECT_EQ(45u, buffer_count_);
-}
-
-TEST_F(EsParserAdtsTest, AacLcAdts) {
-  LoadStream("sfx.adts");
-  std::vector<Packet> pes_packets = GenerateFixedSizePesPacket(512);
-  pes_packets.front().pts = base::TimeDelta::FromSeconds(1);
-  EXPECT_TRUE(Process(pes_packets, false /* sbr_in_mimetype */));
-  EXPECT_EQ(1u, config_count_);
-  EXPECT_EQ(14u, buffer_count_);
-}
-
-TEST_F(EsParserAdtsTest, AacSampleRate) {
-  std::vector<Packet> pes_packets =
-      LoadPacketsFromFiles("aac-44100-packet-%d", 4);
-
-  pes_packets.front().pts = base::TimeDelta::FromSeconds(0);
-  EXPECT_TRUE(Process(pes_packets, true /* sbr_in_mimetype */));
-  EXPECT_EQ(4u, buffer_count_);
-  EXPECT_EQ(kAac44100PacketTimestamp, buffer_timestamps_);
-}
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_parser_h264.cc b/cobalt/media/formats/mp2t/es_parser_h264.cc
deleted file mode 100644
index 35e534a..0000000
--- a/cobalt/media/formats/mp2t/es_parser_h264.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp2t/es_parser_h264.h"
-
-#include <limits>
-
-#include "base/logging.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/optional.h"
-#include "cobalt/math/geometry/rect.h"
-#include "cobalt/math/geometry/size.h"
-#include "cobalt/media/base/encryption_scheme.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/base/video_frame.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "cobalt/media/formats/common/offset_byte_queue.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-// An AUD NALU is at least 4 bytes:
-// 3 bytes for the start code + 1 byte for the NALU type.
-const int kMinAUDSize = 4;
-
-EsParserH264::EsParserH264(const NewVideoConfigCB& new_video_config_cb,
-                           const EmitBufferCB& emit_buffer_cb)
-    : es_adapter_(new_video_config_cb, emit_buffer_cb),
-      h264_parser_(new H264Parser()),
-      current_access_unit_pos_(0),
-      next_access_unit_pos_(0) {}
-
-EsParserH264::~EsParserH264() {}
-
-void EsParserH264::Flush() {
-  DVLOG(1) << __FUNCTION__;
-  if (!FindAUD(&current_access_unit_pos_)) return;
-
-  // Simulate an additional AUD to force emitting the last access unit
-  // which is assumed to be complete at this point.
-  uint8_t aud[] = {0x00, 0x00, 0x01, 0x09};
-  es_queue_->Push(aud, sizeof(aud));
-  ParseFromEsQueue();
-
-  es_adapter_.Flush();
-}
-
-void EsParserH264::ResetInternal() {
-  DVLOG(1) << __FUNCTION__;
-  h264_parser_.reset(new H264Parser());
-  current_access_unit_pos_ = 0;
-  next_access_unit_pos_ = 0;
-  last_video_decoder_config_ = VideoDecoderConfig();
-  es_adapter_.Reset();
-}
-
-bool EsParserH264::FindAUD(int64_t* stream_pos) {
-  while (true) {
-    const uint8_t* es;
-    int size;
-    es_queue_->PeekAt(*stream_pos, &es, &size);
-
-    // Find a start code and move the stream to the start code parser position.
-    off_t start_code_offset;
-    off_t start_code_size;
-    bool start_code_found = H264Parser::FindStartCode(
-        es, size, &start_code_offset, &start_code_size);
-    *stream_pos += start_code_offset;
-
-    // No H264 start code found or NALU type not available yet.
-    if (!start_code_found || start_code_offset + start_code_size >= size)
-      return false;
-
-    // Exit the parser loop when an AUD is found.
-    // Note: NALU header for an AUD:
-    // - nal_ref_idc must be 0
-    // - nal_unit_type must be H264NALU::kAUD
-    if (es[start_code_offset + start_code_size] == H264NALU::kAUD) break;
-
-    // The current NALU is not an AUD, skip the start code
-    // and continue parsing the stream.
-    *stream_pos += start_code_size;
-  }
-
-  return true;
-}
-
-bool EsParserH264::ParseFromEsQueue() {
-  DCHECK_LE(es_queue_->head(), current_access_unit_pos_);
-  DCHECK_LE(current_access_unit_pos_, next_access_unit_pos_);
-  DCHECK_LE(next_access_unit_pos_, es_queue_->tail());
-
-  // Find the next AUD located at or after |current_access_unit_pos_|. This is
-  // needed since initially |current_access_unit_pos_| might not point to
-  // an AUD.
-  // Discard all the data before the updated |current_access_unit_pos_|
-  // since it won't be used again.
-  bool aud_found = FindAUD(&current_access_unit_pos_);
-  es_queue_->Trim(current_access_unit_pos_);
-  if (next_access_unit_pos_ < current_access_unit_pos_)
-    next_access_unit_pos_ = current_access_unit_pos_;
-
-  // Resume parsing later if no AUD was found.
-  if (!aud_found) return true;
-
-  // Find the next AUD to make sure we have a complete access unit.
-  if (next_access_unit_pos_ < current_access_unit_pos_ + kMinAUDSize) {
-    next_access_unit_pos_ = current_access_unit_pos_ + kMinAUDSize;
-    DCHECK_LE(next_access_unit_pos_, es_queue_->tail());
-  }
-  if (!FindAUD(&next_access_unit_pos_)) return true;
-
-  // At this point, we know we have a full access unit.
-  bool is_key_frame = false;
-  int pps_id_for_access_unit = -1;
-
-  const uint8_t* es;
-  int size;
-  es_queue_->PeekAt(current_access_unit_pos_, &es, &size);
-  int access_unit_size = base::checked_cast<int, int64_t>(
-      next_access_unit_pos_ - current_access_unit_pos_);
-  DCHECK_LE(access_unit_size, size);
-  h264_parser_->SetStream(es, access_unit_size);
-
-  while (true) {
-    bool is_eos = false;
-    H264NALU nalu;
-    switch (h264_parser_->AdvanceToNextNALU(&nalu)) {
-      case H264Parser::kOk:
-        break;
-      case H264Parser::kInvalidStream:
-      case H264Parser::kUnsupportedStream:
-        return false;
-      case H264Parser::kEOStream:
-        is_eos = true;
-        break;
-    }
-    if (is_eos) break;
-
-    switch (nalu.nal_unit_type) {
-      case H264NALU::kAUD: {
-        DVLOG(LOG_LEVEL_ES) << "NALU: AUD";
-        break;
-      }
-      case H264NALU::kSPS: {
-        DVLOG(LOG_LEVEL_ES) << "NALU: SPS";
-        int sps_id;
-        if (h264_parser_->ParseSPS(&sps_id) != H264Parser::kOk) return false;
-        break;
-      }
-      case H264NALU::kPPS: {
-        DVLOG(LOG_LEVEL_ES) << "NALU: PPS";
-        int pps_id;
-        if (h264_parser_->ParsePPS(&pps_id) != H264Parser::kOk) return false;
-        break;
-      }
-      case H264NALU::kIDRSlice:
-      case H264NALU::kNonIDRSlice: {
-        is_key_frame = (nalu.nal_unit_type == H264NALU::kIDRSlice);
-        DVLOG(LOG_LEVEL_ES) << "NALU: slice IDR=" << is_key_frame;
-        H264SliceHeader shdr;
-        if (h264_parser_->ParseSliceHeader(nalu, &shdr) != H264Parser::kOk) {
-          // Only accept an invalid SPS/PPS at the beginning when the stream
-          // does not necessarily start with an SPS/PPS/IDR.
-          // TODO(damienv): Should be able to differentiate a missing SPS/PPS
-          // from a slice header parsing error.
-          if (last_video_decoder_config_.IsValidConfig()) return false;
-        } else {
-          pps_id_for_access_unit = shdr.pic_parameter_set_id;
-        }
-        break;
-      }
-      default: { DVLOG(LOG_LEVEL_ES) << "NALU: " << nalu.nal_unit_type; }
-    }
-  }
-
-  // Emit a frame and move the stream to the next AUD position.
-  RCHECK(EmitFrame(current_access_unit_pos_, access_unit_size, is_key_frame,
-                   pps_id_for_access_unit));
-  current_access_unit_pos_ = next_access_unit_pos_;
-  es_queue_->Trim(current_access_unit_pos_);
-
-  return true;
-}
-
-bool EsParserH264::EmitFrame(int64_t access_unit_pos, int access_unit_size,
-                             bool is_key_frame, int pps_id) {
-  // Get the access unit timing info.
-  // Note: |current_timing_desc.pts| might be |kNoTimestamp| at this point
-  // if:
-  // - the stream is not fully MPEG-2 compliant.
-  // - or if the stream relies on H264 VUI parameters to compute the timestamps.
-  //   See H.222 spec: section 2.7.5 "Conditional coding of timestamps".
-  //   This part is not yet implemented in EsParserH264.
-  // |es_adapter_| will take care of the missing timestamps.
-  TimingDesc current_timing_desc = GetTimingDescriptor(access_unit_pos);
-  DVLOG_IF(1, current_timing_desc.pts == kNoTimestamp) << "Missing timestamp";
-
-  // If only the PTS is provided, copy the PTS into the DTS.
-  if (current_timing_desc.dts == kNoDecodeTimestamp()) {
-    current_timing_desc.dts =
-        DecodeTimestamp::FromPresentationTime(current_timing_desc.pts);
-  }
-
-  // Update the video decoder configuration if needed.
-  const H264PPS* pps = h264_parser_->GetPPS(pps_id);
-  if (!pps) {
-    // Only accept an invalid PPS at the beginning when the stream
-    // does not necessarily start with an SPS/PPS/IDR.
-    // In this case, the initial frames are conveyed to the upper layer with
-    // an invalid VideoDecoderConfig and it's up to the upper layer
-    // to process this kind of frame accordingly.
-    if (last_video_decoder_config_.IsValidConfig()) return false;
-  } else {
-    const H264SPS* sps = h264_parser_->GetSPS(pps->seq_parameter_set_id);
-    if (!sps) return false;
-    RCHECK(UpdateVideoDecoderConfig(sps, Unencrypted()));
-  }
-
-  // Emit a frame.
-  DVLOG(LOG_LEVEL_ES) << "Emit frame: stream_pos=" << current_access_unit_pos_
-                      << " size=" << access_unit_size;
-  int es_size;
-  const uint8_t* es;
-  es_queue_->PeekAt(current_access_unit_pos_, &es, &es_size);
-  CHECK_GE(es_size, access_unit_size);
-
-  // TODO(wolenetz/acolwell): Validate and use a common cross-parser TrackId
-  // type and allow multiple video tracks. See https://crbug.com/341581.
-  scoped_refptr<StreamParserBuffer> stream_parser_buffer =
-      StreamParserBuffer::CopyFrom(es, access_unit_size, is_key_frame,
-                                   DemuxerStream::VIDEO, kMp2tVideoTrackId);
-  if (!stream_parser_buffer) {
-    return false;
-  }
-  stream_parser_buffer->SetDecodeTimestamp(current_timing_desc.dts);
-  stream_parser_buffer->set_timestamp(current_timing_desc.pts);
-  return es_adapter_.OnNewBuffer(stream_parser_buffer);
-}
-
-bool EsParserH264::UpdateVideoDecoderConfig(const H264SPS* sps,
-                                            const EncryptionScheme& scheme) {
-  // Set the SAR to 1 when not specified in the H264 stream.
-  int sar_width = (sps->sar_width == 0) ? 1 : sps->sar_width;
-  int sar_height = (sps->sar_height == 0) ? 1 : sps->sar_height;
-
-  base::Optional<math::Size> coded_size = sps->GetCodedSize();
-  if (!coded_size) return false;
-
-  base::Optional<math::Rect> visible_rect = sps->GetVisibleRect();
-  if (!visible_rect) return false;
-
-  if (visible_rect->width() > std::numeric_limits<int>::max() / sar_width) {
-    DVLOG(1) << "Integer overflow detected: visible_rect.width()="
-             << visible_rect->width() << " sar_width=" << sar_width;
-    return false;
-  }
-  math::Size natural_size((visible_rect->width() * sar_width) / sar_height,
-                          visible_rect->height());
-  if (natural_size.width() == 0) return false;
-
-  VideoDecoderConfig video_decoder_config(
-      kCodecH264, H264Parser::ProfileIDCToVideoCodecProfile(sps->profile_idc),
-      PIXEL_FORMAT_YV12, COLOR_SPACE_HD_REC709, coded_size.value(),
-      visible_rect.value(), natural_size, EmptyExtraData(), scheme);
-
-  if (!video_decoder_config.Matches(last_video_decoder_config_)) {
-    DVLOG(1) << "Profile IDC: " << sps->profile_idc;
-    DVLOG(1) << "Level IDC: " << sps->level_idc;
-    DVLOG(1) << "Pic width: " << coded_size->width();
-    DVLOG(1) << "Pic height: " << coded_size->height();
-    DVLOG(1) << "log2_max_frame_num_minus4: " << sps->log2_max_frame_num_minus4;
-    DVLOG(1) << "SAR: width=" << sps->sar_width
-             << " height=" << sps->sar_height;
-    last_video_decoder_config_ = video_decoder_config;
-    es_adapter_.OnConfigChanged(video_decoder_config);
-  }
-
-  return true;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_parser_h264.h b/cobalt/media/formats/mp2t/es_parser_h264.h
deleted file mode 100644
index 84a2262..0000000
--- a/cobalt/media/formats/mp2t/es_parser_h264.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_H264_H_
-#define COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_H264_H_
-
-#include <memory>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/formats/mp2t/es_adapter_video.h"
-#include "cobalt/media/formats/mp2t/es_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-class EncryptionScheme;
-class H264Parser;
-struct H264SPS;
-class OffsetByteQueue;
-}  // namespace media
-}  // namespace cobalt
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-// A few remarks:
-// - In this h264 parser, frame splitting is based on AUD nals.
-// Mpeg2 TS spec: "2.14 Carriage of Rec. ITU-T H.264 | ISO/IEC 14496-10 video"
-// "Each AVC access unit shall contain an access unit delimiter NAL Unit;"
-// - PES packets do not necessarily map to an H264 access unit although the HLS
-// recommendation is to use one PES for each access unit. In this parser,
-// we handle the general case and do not make any assumption about the access
-// unit organization within PES packets.
-//
-class MEDIA_EXPORT EsParserH264 : public EsParser {
- public:
-  typedef base::Callback<void(const VideoDecoderConfig&)> NewVideoConfigCB;
-
-  EsParserH264(const NewVideoConfigCB& new_video_config_cb,
-               const EmitBufferCB& emit_buffer_cb);
-  ~EsParserH264() override;
-
-  // EsParser implementation.
-  void Flush() override;
-
- private:
-  // EsParser implementation.
-  bool ParseFromEsQueue() override;
-  void ResetInternal() override;
-
-  // Find the AUD located at or after |*stream_pos|.
-  // Return true if an AUD is found.
-  // If found, |*stream_pos| corresponds to the position of the AUD start code
-  // in the stream. Otherwise, |*stream_pos| corresponds to the last position
-  // of the start code parser.
-  bool FindAUD(int64_t* stream_pos);
-
-  // Emit a frame whose position in the ES queue starts at |access_unit_pos|.
-  // Returns true if successful, false if no PTS is available for the frame.
-  bool EmitFrame(int64_t access_unit_pos, int access_unit_size,
-                 bool is_key_frame, int pps_id);
-
-  // Update the video decoder config based on an H264 SPS.
-  // Return true if successful.
-  bool UpdateVideoDecoderConfig(const H264SPS* sps,
-                                const EncryptionScheme& scheme);
-
-  EsAdapterVideo es_adapter_;
-
-  // H264 parser state.
-  // - |current_access_unit_pos_| is pointing to an annexB syncword
-  // representing the first NALU of an H264 access unit.
-  std::unique_ptr<H264Parser> h264_parser_;
-  int64_t current_access_unit_pos_;
-  int64_t next_access_unit_pos_;
-
-  // Last video decoder config.
-  VideoDecoderConfig last_video_decoder_config_;
-
-  DISALLOW_COPY_AND_ASSIGN(EsParserH264);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_H264_H_
diff --git a/cobalt/media/formats/mp2t/es_parser_h264_unittest.cc b/cobalt/media/formats/mp2t/es_parser_h264_unittest.cc
deleted file mode 100644
index 5e237f3..0000000
--- a/cobalt/media/formats/mp2t/es_parser_h264_unittest.cc
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <algorithm>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string_util.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "cobalt/media/formats/mp2t/es_parser_h264.h"
-#include "cobalt/media/formats/mp2t/es_parser_test_base.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-class VideoDecoderConfig;
-
-namespace mp2t {
-
-class EsParserH264Test : public EsParserTestBase, public testing::Test {
- public:
-  EsParserH264Test() {}
-
- protected:
-  void LoadH264Stream(const char* filename);
-  void GetPesTimestamps(std::vector<Packet>* pes_packets);
-  bool Process(const std::vector<Packet>& pes_packets, bool force_timing);
-  void CheckAccessUnits();
-
-  // Access units of the stream with AUD NALUs.
-  std::vector<Packet> access_units_;
-
- private:
-  // Get the offset of the start of each access unit of |stream_|.
-  // This function assumes there is only one slice per access unit.
-  // This is a very simplified access unit segmenter that is good
-  // enough for unit tests.
-  void GetAccessUnits();
-
-  // Insert an AUD before each access unit.
-  // Update |stream_| and |access_units_| accordingly.
-  void InsertAUD();
-
-  DISALLOW_COPY_AND_ASSIGN(EsParserH264Test);
-};
-
-void EsParserH264Test::LoadH264Stream(const char* filename) {
-  // Load the input H264 file and segment it into access units.
-  LoadStream(filename);
-  GetAccessUnits();
-  ASSERT_GT(access_units_.size(), 0u);
-
-  // Insert AUDs into the stream.
-  InsertAUD();
-
-  // Generate some timestamps based on a 25fps stream.
-  for (size_t k = 0; k < access_units_.size(); k++)
-    access_units_[k].pts = base::TimeDelta::FromMilliseconds(k * 40u);
-}
-
-void EsParserH264Test::GetAccessUnits() {
-  access_units_.resize(0);
-  bool start_access_unit = true;
-
-  // In a first pass, retrieve the offsets of all access units.
-  size_t offset = 0;
-  while (true) {
-    // Find the next start code.
-    off_t relative_offset = 0;
-    off_t start_code_size = 0;
-    bool success =
-        H264Parser::FindStartCode(&stream_[offset], stream_.size() - offset,
-                                  &relative_offset, &start_code_size);
-    if (!success) break;
-    offset += relative_offset;
-
-    if (start_access_unit) {
-      Packet cur_access_unit;
-      cur_access_unit.offset = offset;
-      access_units_.push_back(cur_access_unit);
-      start_access_unit = false;
-    }
-
-    // Get the NALU type.
-    offset += start_code_size;
-    if (offset >= stream_.size()) break;
-    int nal_unit_type = stream_[offset] & 0x1f;
-
-    // We assume there is only one slice per access unit.
-    if (nal_unit_type == H264NALU::kIDRSlice ||
-        nal_unit_type == H264NALU::kNonIDRSlice) {
-      start_access_unit = true;
-    }
-  }
-
-  ComputePacketSize(&access_units_);
-}
-
-void EsParserH264Test::InsertAUD() {
-  uint8_t aud[] = {0x00, 0x00, 0x01, 0x09};
-
-  std::vector<uint8_t> stream_with_aud(stream_.size() +
-                                       access_units_.size() * sizeof(aud));
-  std::vector<EsParserTestBase::Packet> access_units_with_aud(
-      access_units_.size());
-
-  size_t offset = 0;
-  for (size_t k = 0; k < access_units_.size(); k++) {
-    access_units_with_aud[k].offset = offset;
-    access_units_with_aud[k].size = access_units_[k].size + sizeof(aud);
-
-    memcpy(&stream_with_aud[offset], aud, sizeof(aud));
-    offset += sizeof(aud);
-
-    memcpy(&stream_with_aud[offset], &stream_[access_units_[k].offset],
-           access_units_[k].size);
-    offset += access_units_[k].size;
-  }
-
-  // Update the stream and access units used for the test.
-  stream_ = stream_with_aud;
-  access_units_ = access_units_with_aud;
-}
-
-void EsParserH264Test::GetPesTimestamps(std::vector<Packet>* pes_packets_ptr) {
-  DCHECK(pes_packets_ptr);
-  const std::vector<Packet>& pes_packets = *pes_packets_ptr;
-
-  // Default: set to a negative timestamp to be able to differentiate from
-  // real timestamps.
-  // Note: we don't use kNoTimestamp here since this one has already
-  // a special meaning in EsParserH264. The negative timestamps should be
-  // ultimately discarded by the H264 parser since not relevant.
-  for (size_t k = 0; k < pes_packets.size(); k++) {
-    (*pes_packets_ptr)[k].pts = base::TimeDelta::FromMilliseconds(-1);
-  }
-
-  // Set a valid timestamp for PES packets which include the start
-  // of an H264 access unit.
-  size_t pes_idx = 0;
-  for (size_t k = 0; k < access_units_.size(); k++) {
-    for (; pes_idx < pes_packets.size(); pes_idx++) {
-      size_t pes_start = pes_packets[pes_idx].offset;
-      size_t pes_end = pes_packets[pes_idx].offset + pes_packets[pes_idx].size;
-      if (pes_start <= access_units_[k].offset &&
-          pes_end > access_units_[k].offset) {
-        (*pes_packets_ptr)[pes_idx].pts = access_units_[k].pts;
-        break;
-      }
-    }
-  }
-}
-
-bool EsParserH264Test::Process(const std::vector<Packet>& pes_packets,
-                               bool force_timing) {
-  EsParserH264 es_parser(
-      base::Bind(&EsParserH264Test::NewVideoConfig, base::Unretained(this)),
-      base::Bind(&EsParserH264Test::EmitBuffer, base::Unretained(this)));
-  return ProcessPesPackets(&es_parser, pes_packets, force_timing);
-}
-
-void EsParserH264Test::CheckAccessUnits() {
-  EXPECT_EQ(buffer_count_, access_units_.size());
-
-  std::stringstream buffer_timestamps_stream;
-  for (size_t k = 0; k < access_units_.size(); k++) {
-    buffer_timestamps_stream << "(" << access_units_[k].pts.InMilliseconds()
-                             << ") ";
-  }
-  std::string buffer_timestamps = buffer_timestamps_stream.str();
-  base::TrimWhitespaceASCII(buffer_timestamps, base::TRIM_ALL,
-                            &buffer_timestamps);
-  EXPECT_EQ(buffer_timestamps_, buffer_timestamps);
-}
-
-TEST_F(EsParserH264Test, OneAccessUnitPerPes) {
-  LoadH264Stream("bear.h264");
-
-  // One to one equivalence between PES packets and access units.
-  std::vector<Packet> pes_packets(access_units_);
-  GetPesTimestamps(&pes_packets);
-
-  // Process each PES packet.
-  EXPECT_TRUE(Process(pes_packets, false));
-  CheckAccessUnits();
-}
-
-TEST_F(EsParserH264Test, NonAlignedPesPacket) {
-  LoadH264Stream("bear.h264");
-
-  // Generate the PES packets.
-  std::vector<Packet> pes_packets;
-  Packet cur_pes_packet;
-  cur_pes_packet.offset = 0;
-  for (size_t k = 0; k < access_units_.size(); k++) {
-    pes_packets.push_back(cur_pes_packet);
-
-    // The current PES packet includes the remaining bytes of the previous
-    // access unit and some bytes of the current access unit
-    // (487 bytes in this unit test but no more than the current access unit
-    // size).
-    cur_pes_packet.offset =
-        access_units_[k].offset + std::min<size_t>(487u, access_units_[k].size);
-  }
-  ComputePacketSize(&pes_packets);
-  GetPesTimestamps(&pes_packets);
-
-  // Process each PES packet.
-  EXPECT_TRUE(Process(pes_packets, false));
-  CheckAccessUnits();
-}
-
-TEST_F(EsParserH264Test, SeveralPesPerAccessUnit) {
-  LoadH264Stream("bear.h264");
-
-  // Get the minimum size of an access unit.
-  size_t min_access_unit_size = stream_.size();
-  for (size_t k = 0; k < access_units_.size(); k++) {
-    if (min_access_unit_size >= access_units_[k].size)
-      min_access_unit_size = access_units_[k].size;
-  }
-
-  // Use a small PES packet size or the minimum access unit size
-  // if it is even smaller.
-  size_t pes_size = 512;
-  if (min_access_unit_size < pes_size) pes_size = min_access_unit_size;
-
-  std::vector<Packet> pes_packets;
-  Packet cur_pes_packet;
-  cur_pes_packet.offset = 0;
-  while (cur_pes_packet.offset < stream_.size()) {
-    pes_packets.push_back(cur_pes_packet);
-    cur_pes_packet.offset += pes_size;
-  }
-  ComputePacketSize(&pes_packets);
-  GetPesTimestamps(&pes_packets);
-
-  // Process each PES packet.
-  EXPECT_TRUE(Process(pes_packets, false));
-  CheckAccessUnits();
-
-  // Process PES packets forcing timings for each PES packet.
-  EXPECT_TRUE(Process(pes_packets, true));
-  CheckAccessUnits();
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_parser_mpeg1audio.cc b/cobalt/media/formats/mp2t/es_parser_mpeg1audio.cc
deleted file mode 100644
index 5b47aa9..0000000
--- a/cobalt/media/formats/mp2t/es_parser_mpeg1audio.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp2t/es_parser_mpeg1audio.h"
-
-#include <vector>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/media/base/audio_timestamp_helper.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/common/offset_byte_queue.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-#include "cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-struct EsParserMpeg1Audio::Mpeg1AudioFrame {
-  // Pointer to the ES data.
-  const uint8_t* data;
-
-  // Frame size.
-  int size;
-
-  // Number of samples in the frame.
-  int sample_count;
-
-  // Frame offset in the ES queue.
-  int64_t queue_offset;
-};
-
-EsParserMpeg1Audio::EsParserMpeg1Audio(
-    const NewAudioConfigCB& new_audio_config_cb,
-    const EmitBufferCB& emit_buffer_cb,
-    const scoped_refptr<MediaLog>& media_log)
-    : media_log_(media_log),
-      new_audio_config_cb_(new_audio_config_cb),
-      emit_buffer_cb_(emit_buffer_cb) {}
-
-EsParserMpeg1Audio::~EsParserMpeg1Audio() {}
-
-bool EsParserMpeg1Audio::ParseFromEsQueue() {
-  // Look for every MPEG1 audio frame in the ES buffer.
-  Mpeg1AudioFrame mpeg1audio_frame;
-  while (LookForMpeg1AudioFrame(&mpeg1audio_frame)) {
-    // Update the audio configuration if needed.
-    DCHECK_GE(mpeg1audio_frame.size, MPEG1AudioStreamParser::kHeaderSize);
-    if (!UpdateAudioConfiguration(mpeg1audio_frame.data)) return false;
-
-    // Get the PTS & the duration of this access unit.
-    TimingDesc current_timing_desc =
-        GetTimingDescriptor(mpeg1audio_frame.queue_offset);
-    if (current_timing_desc.pts != kNoTimestamp)
-      audio_timestamp_helper_->SetBaseTimestamp(current_timing_desc.pts);
-
-    if (audio_timestamp_helper_->base_timestamp() == kNoTimestamp) {
-      DVLOG(1) << "Skipping audio frame with unknown timestamp";
-      SkipMpeg1AudioFrame(mpeg1audio_frame);
-      continue;
-    }
-    base::TimeDelta current_pts = audio_timestamp_helper_->GetTimestamp();
-    base::TimeDelta frame_duration = audio_timestamp_helper_->GetFrameDuration(
-        mpeg1audio_frame.sample_count);
-
-    // Emit an audio frame.
-    bool is_key_frame = true;
-
-    // TODO(wolenetz/acolwell): Validate and use a common cross-parser TrackId
-    // type and allow multiple audio tracks. See https://crbug.com/341581.
-    scoped_refptr<StreamParserBuffer> stream_parser_buffer =
-        StreamParserBuffer::CopyFrom(mpeg1audio_frame.data,
-                                     mpeg1audio_frame.size, is_key_frame,
-                                     DemuxerStream::AUDIO, kMp2tAudioTrackId);
-    if (!stream_parser_buffer) {
-      return false;
-    }
-    stream_parser_buffer->set_timestamp(current_pts);
-    stream_parser_buffer->set_duration(frame_duration);
-    emit_buffer_cb_.Run(stream_parser_buffer);
-
-    // Update the PTS of the next frame.
-    audio_timestamp_helper_->AddFrames(mpeg1audio_frame.sample_count);
-
-    // Skip the current frame.
-    SkipMpeg1AudioFrame(mpeg1audio_frame);
-  }
-
-  return true;
-}
-
-void EsParserMpeg1Audio::Flush() {}
-
-void EsParserMpeg1Audio::ResetInternal() {
-  last_audio_decoder_config_ = AudioDecoderConfig();
-}
-
-bool EsParserMpeg1Audio::LookForMpeg1AudioFrame(
-    Mpeg1AudioFrame* mpeg1audio_frame) {
-  int es_size;
-  const uint8_t* es;
-  es_queue_->Peek(&es, &es_size);
-
-  int max_offset = es_size - MPEG1AudioStreamParser::kHeaderSize;
-  if (max_offset <= 0) return false;
-
-  for (int offset = 0; offset < max_offset; offset++) {
-    const uint8_t* cur_buf = &es[offset];
-    if (cur_buf[0] != 0xff) continue;
-
-    int remaining_size = es_size - offset;
-    DCHECK_GE(remaining_size, MPEG1AudioStreamParser::kHeaderSize);
-    MPEG1AudioStreamParser::Header header;
-    if (!MPEG1AudioStreamParser::ParseHeader(media_log_, cur_buf, &header))
-      continue;
-
-    if (remaining_size < header.frame_size) {
-      // Not a full frame: will resume when we have more data.
-      // Remove all the bytes located before the frame header,
-      // these bytes will not be used anymore.
-      es_queue_->Pop(offset);
-      return false;
-    }
-
-    // Check whether there is another frame
-    // |frame_size| apart from the current one.
-    if (remaining_size >= header.frame_size + 1 &&
-        cur_buf[header.frame_size] != 0xff) {
-      continue;
-    }
-
-    es_queue_->Pop(offset);
-    es_queue_->Peek(&mpeg1audio_frame->data, &es_size);
-    mpeg1audio_frame->queue_offset = es_queue_->head();
-    mpeg1audio_frame->size = header.frame_size;
-    mpeg1audio_frame->sample_count = header.sample_count;
-    DVLOG(LOG_LEVEL_ES) << "MPEG1 audio syncword @ pos="
-                        << mpeg1audio_frame->queue_offset
-                        << " frame_size=" << mpeg1audio_frame->size;
-    DVLOG(LOG_LEVEL_ES) << "MPEG1 audio header: "
-                        << base::HexEncode(mpeg1audio_frame->data,
-                                           MPEG1AudioStreamParser::kHeaderSize);
-    return true;
-  }
-
-  es_queue_->Pop(max_offset);
-  return false;
-}
-
-bool EsParserMpeg1Audio::UpdateAudioConfiguration(
-    const uint8_t* mpeg1audio_header) {
-  MPEG1AudioStreamParser::Header header;
-  if (!MPEG1AudioStreamParser::ParseHeader(media_log_, mpeg1audio_header,
-                                           &header)) {
-    return false;
-  }
-
-  // TODO(damienv): Verify whether Android playback requires the extra data
-  // field for Mpeg1 audio. If yes, we should generate this field.
-  AudioDecoderConfig audio_decoder_config(
-      kCodecMP3, kSampleFormatS16, header.channel_layout, header.sample_rate,
-      EmptyExtraData(), Unencrypted());
-
-  if (!audio_decoder_config.Matches(last_audio_decoder_config_)) {
-    DVLOG(1) << "Sampling frequency: " << header.sample_rate;
-    DVLOG(1) << "Channel layout: " << header.channel_layout;
-    // Reset the timestamp helper to use a new time scale.
-    if (audio_timestamp_helper_ &&
-        audio_timestamp_helper_->base_timestamp() != kNoTimestamp) {
-      base::TimeDelta base_timestamp = audio_timestamp_helper_->GetTimestamp();
-      audio_timestamp_helper_.reset(
-          new AudioTimestampHelper(header.sample_rate));
-      audio_timestamp_helper_->SetBaseTimestamp(base_timestamp);
-    } else {
-      audio_timestamp_helper_.reset(
-          new AudioTimestampHelper(header.sample_rate));
-    }
-    // Audio config notification.
-    last_audio_decoder_config_ = audio_decoder_config;
-    new_audio_config_cb_.Run(audio_decoder_config);
-  }
-
-  return true;
-}
-
-void EsParserMpeg1Audio::SkipMpeg1AudioFrame(
-    const Mpeg1AudioFrame& mpeg1audio_frame) {
-  DCHECK_EQ(mpeg1audio_frame.queue_offset, es_queue_->head());
-  es_queue_->Pop(mpeg1audio_frame.size);
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_parser_mpeg1audio.h b/cobalt/media/formats/mp2t/es_parser_mpeg1audio.h
deleted file mode 100644
index 5ac0343..0000000
--- a/cobalt/media/formats/mp2t/es_parser_mpeg1audio.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_MPEG1AUDIO_H_
-#define COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_MPEG1AUDIO_H_
-
-#include <list>
-#include <memory>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/formats/mp2t/es_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-class AudioTimestampHelper;
-class BitReader;
-class OffsetByteQueue;
-class StreamParserBuffer;
-}  // namespace media
-}  // namespace cobalt
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-class MEDIA_EXPORT EsParserMpeg1Audio : public EsParser {
- public:
-  typedef base::Callback<void(const AudioDecoderConfig&)> NewAudioConfigCB;
-
-  EsParserMpeg1Audio(const NewAudioConfigCB& new_audio_config_cb,
-                     const EmitBufferCB& emit_buffer_cb,
-                     const scoped_refptr<MediaLog>& media_log);
-  ~EsParserMpeg1Audio() override;
-
-  // EsParser implementation.
-  void Flush() override;
-
- private:
-  // Used to link a PTS with a byte position in the ES stream.
-  typedef std::pair<int64_t, base::TimeDelta> EsPts;
-  typedef std::list<EsPts> EsPtsList;
-
-  struct Mpeg1AudioFrame;
-
-  // EsParser implementation.
-  bool ParseFromEsQueue() override;
-  void ResetInternal() override;
-
-  // Synchronize the stream on a Mpeg1 audio syncword (consuming bytes from
-  // |es_queue_| if needed).
-  // Returns true when a full Mpeg1 audio frame has been found: in that case
-  // |mpeg1audio_frame| structure is filled up accordingly.
-  // Returns false otherwise (no Mpeg1 audio syncword found or partial Mpeg1
-  // audio frame).
-  bool LookForMpeg1AudioFrame(Mpeg1AudioFrame* mpeg1audio_frame);
-
-  // Signal any audio configuration change (if any).
-  // Return false if the current audio config is not
-  // a supported Mpeg1 audio config.
-  bool UpdateAudioConfiguration(const uint8_t* mpeg1audio_header);
-
-  void SkipMpeg1AudioFrame(const Mpeg1AudioFrame& mpeg1audio_frame);
-
-  scoped_refptr<MediaLog> media_log_;
-
-  // Callbacks:
-  // - to signal a new audio configuration,
-  // - to send ES buffers.
-  NewAudioConfigCB new_audio_config_cb_;
-  EmitBufferCB emit_buffer_cb_;
-
-  // Interpolated PTS for frames that don't have one.
-  std::unique_ptr<AudioTimestampHelper> audio_timestamp_helper_;
-
-  // Last audio config.
-  AudioDecoderConfig last_audio_decoder_config_;
-
-  DISALLOW_COPY_AND_ASSIGN(EsParserMpeg1Audio);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_MPEG1AUDIO_H_
diff --git a/cobalt/media/formats/mp2t/es_parser_mpeg1audio_unittest.cc b/cobalt/media/formats/mp2t/es_parser_mpeg1audio_unittest.cc
deleted file mode 100644
index a92c318..0000000
--- a/cobalt/media/formats/mp2t/es_parser_mpeg1audio_unittest.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/formats/mp2t/es_parser_mpeg1audio.h"
-#include "cobalt/media/formats/mp2t/es_parser_test_base.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-class AudioDecoderConfig;
-
-namespace mp2t {
-
-class EsParserMpeg1AudioTest : public EsParserTestBase, public testing::Test {
- public:
-  EsParserMpeg1AudioTest();
-
- protected:
-  bool Process(const std::vector<Packet>& pes_packets, bool force_timing);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(EsParserMpeg1AudioTest);
-};
-
-EsParserMpeg1AudioTest::EsParserMpeg1AudioTest() {}
-
-bool EsParserMpeg1AudioTest::Process(const std::vector<Packet>& pes_packets,
-                                     bool force_timing) {
-  EsParserMpeg1Audio es_parser(
-      base::Bind(&EsParserMpeg1AudioTest::NewAudioConfig,
-                 base::Unretained(this)),
-      base::Bind(&EsParserMpeg1AudioTest::EmitBuffer, base::Unretained(this)),
-      new MediaLog());
-  return ProcessPesPackets(&es_parser, pes_packets, force_timing);
-}
-
-TEST_F(EsParserMpeg1AudioTest, SinglePts) {
-  LoadStream("sfx.mp3");
-
-  std::vector<Packet> pes_packets = GenerateFixedSizePesPacket(512);
-  pes_packets.front().pts = base::TimeDelta::FromSeconds(10);
-
-  // Note: there is no parsing of metadata as part of Mpeg2 TS,
-  // so the tag starting at 0x80d with 0x54 0x41 0x47 (ascii for "TAG")
-  // is not a valid Mpeg1 audio frame header. This makes the previous frame
-  // invalid since there is no start code following the previous frame.
-  // So instead of the 13 Mpeg1 audio frames, only 12 are considered valid.
-  // Offset of frames in the file:
-  // {0x20,  0x1c1, 0x277, 0x2f9, 0x3fd, 0x47f, 0x501, 0x583,
-  //  0x605, 0x687, 0x73d, 0x7a5, 0x80d}
-  // TODO(damienv): find a file that would be more relevant for Mpeg1 audio
-  // as part of Mpeg2 TS.
-  EXPECT_TRUE(Process(pes_packets, false));
-  EXPECT_EQ(1u, config_count_);
-  EXPECT_EQ(12u, buffer_count_);
-}
-
-TEST_F(EsParserMpeg1AudioTest, NoTimingInfo) {
-  LoadStream("sfx.mp3");
-  std::vector<Packet> pes_packets = GenerateFixedSizePesPacket(512);
-
-  // Process should succeed even without timing info, we should just skip the
-  // audio frames without timing info, but still should be able to parse and
-  // play the stream after that.
-  EXPECT_TRUE(Process(pes_packets, false));
-  EXPECT_EQ(1u, config_count_);
-  EXPECT_EQ(0u, buffer_count_);
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_parser_test_base.cc b/cobalt/media/formats/mp2t/es_parser_test_base.cc
deleted file mode 100644
index fe73bac..0000000
--- a/cobalt/media/formats/mp2t/es_parser_test_base.cc
+++ /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.
-
-#include "cobalt/media/formats/mp2t/es_parser_test_base.h"
-
-#include "base/files/memory_mapped_file.h"
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/mp2t/es_parser.h"
-#include "starboard/memory.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-EsParserTestBase::Packet::Packet() : offset(0u), size(0u), pts(kNoTimestamp) {}
-
-EsParserTestBase::EsParserTestBase() : config_count_(0u), buffer_count_(0u) {}
-
-EsParserTestBase::~EsParserTestBase() {}
-
-void EsParserTestBase::LoadStream(const char* filename) {
-  base::FilePath file_path = GetTestDataFilePath(filename);
-
-  base::MemoryMappedFile stream;
-  ASSERT_TRUE(stream.Initialize(file_path))
-      << "Couldn't open stream file: " << file_path.MaybeAsASCII();
-
-  stream_.resize(stream.length());
-  memcpy(&stream_[0], stream.data(), stream_.size());
-}
-
-std::vector<EsParserTestBase::Packet> EsParserTestBase::LoadPacketsFromFiles(
-    const char* filename_template, size_t file_count) {
-  std::vector<Packet> packets;
-  for (size_t i = 0; i < file_count; ++i) {
-    base::FilePath file_path =
-        GetTestDataFilePath(base::StringPrintf(filename_template, i));
-    base::MemoryMappedFile stream;
-    EXPECT_TRUE(stream.Initialize(file_path))
-        << "Couldn't open stream file: " << file_path.MaybeAsASCII();
-
-    Packet packet;
-    packet.offset = stream_.size();
-    packet.size = stream.length();
-    packet.pts = kNoTimestamp;
-
-    stream_.insert(stream_.end(), stream.data(),
-                   stream.data() + stream.length());
-    packets.push_back(packet);
-  }
-
-  return packets;
-}
-
-void EsParserTestBase::NewAudioConfig(const AudioDecoderConfig& config) {
-  config_count_++;
-}
-
-void EsParserTestBase::NewVideoConfig(const VideoDecoderConfig& config) {
-  config_count_++;
-}
-
-void EsParserTestBase::EmitBuffer(scoped_refptr<StreamParserBuffer> buffer) {
-  buffer_timestamps_stream_ << "(" << buffer->timestamp().InMilliseconds()
-                            << ") ";
-  buffer_count_++;
-}
-
-bool EsParserTestBase::ProcessPesPackets(EsParser* es_parser,
-                                         const std::vector<Packet>& pes_packets,
-                                         bool force_timing) {
-  DCHECK(es_parser);
-
-  buffer_count_ = 0;
-  config_count_ = 0;
-  buffer_timestamps_stream_.str(std::string());
-
-  for (size_t k = 0; k < pes_packets.size(); k++) {
-    size_t cur_pes_offset = pes_packets[k].offset;
-    size_t cur_pes_size = pes_packets[k].size;
-
-    base::TimeDelta pts = kNoTimestamp;
-    DecodeTimestamp dts = kNoDecodeTimestamp();
-    if (pes_packets[k].pts >= base::TimeDelta() || force_timing)
-      pts = pes_packets[k].pts;
-
-    DCHECK_LT(cur_pes_offset, stream_.size());
-    if (!es_parser->Parse(&stream_[cur_pes_offset], cur_pes_size, pts, dts))
-      return false;
-  }
-  es_parser->Flush();
-
-  buffer_timestamps_ = buffer_timestamps_stream_.str();
-  base::TrimWhitespaceASCII(buffer_timestamps_, base::TRIM_ALL,
-                            &buffer_timestamps_);
-  return true;
-}
-
-void EsParserTestBase::ComputePacketSize(std::vector<Packet>* packets) {
-  DCHECK(packets);
-  if (packets->size() == 0u) return;
-
-  Packet* cur = &(*packets)[0];
-  for (size_t k = 0; k < packets->size() - 1; k++) {
-    Packet* next = &(*packets)[k + 1];
-    DCHECK_GE(next->offset, cur->offset);
-    cur->size = next->offset - cur->offset;
-    cur = next;
-  }
-  DCHECK_GE(stream_.size(), cur->offset);
-  cur->size = stream_.size() - cur->offset;
-}
-
-std::vector<EsParserTestBase::Packet>
-EsParserTestBase::GenerateFixedSizePesPacket(size_t pes_size) {
-  DCHECK_GT(stream_.size(), 0u);
-  std::vector<Packet> pes_packets;
-
-  Packet cur_pes_packet;
-  cur_pes_packet.offset = 0;
-  cur_pes_packet.pts = kNoTimestamp;
-  while (cur_pes_packet.offset < stream_.size()) {
-    pes_packets.push_back(cur_pes_packet);
-    cur_pes_packet.offset += pes_size;
-  }
-  ComputePacketSize(&pes_packets);
-
-  return pes_packets;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/es_parser_test_base.h b/cobalt/media/formats/mp2t/es_parser_test_base.h
deleted file mode 100644
index 4eb2b1a..0000000
--- a/cobalt/media/formats/mp2t/es_parser_test_base.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_TEST_BASE_H_
-#define COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_TEST_BASE_H_
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-class AudioDecoderConfig;
-class StreamParserBuffer;
-class VideoDecoderConfig;
-
-namespace mp2t {
-class EsParser;
-
-class EsParserTestBase {
- public:
-  struct Packet {
-    Packet();
-
-    // Offset in the stream.
-    size_t offset;
-
-    // Size of the packet.
-    size_t size;
-
-    // Timestamp of the packet.
-    base::TimeDelta pts;
-  };
-
-  EsParserTestBase();
-  virtual ~EsParserTestBase();
-
- protected:
-  void LoadStream(const char* filename);
-  std::vector<Packet> LoadPacketsFromFiles(const char* file_temp, size_t num);
-
-  // ES parser callbacks.
-  void NewAudioConfig(const AudioDecoderConfig& config);
-  void NewVideoConfig(const VideoDecoderConfig& config);
-  void EmitBuffer(scoped_refptr<StreamParserBuffer> buffer);
-
-  // Process the PES packets using the given ES parser.
-  // When |force_timing| is true, even the invalid negative timestamps will be
-  // given to the ES parser.
-  // Return true if successful, false otherwise.
-  bool ProcessPesPackets(EsParser* es_parser,
-                         const std::vector<Packet>& pes_packets,
-                         bool force_timing);
-
-  // Assume the offsets are known, compute the size of each packet.
-  // The last packet is assumed to cover the end of the stream.
-  // Packets are assumed to be in stream order.
-  void ComputePacketSize(std::vector<Packet>* packets);
-
-  // Generate some fixed size PES packets of |stream_|.
-  std::vector<Packet> GenerateFixedSizePesPacket(size_t pes_size);
-
-  // ES stream.
-  std::vector<uint8_t> stream_;
-
-  // Number of decoder configs received from the ES parser.
-  size_t config_count_;
-
-  // Number of buffers generated while parsing the ES stream.
-  size_t buffer_count_;
-
-  // Timestamps of buffers generated while parsing the ES stream.
-  std::string buffer_timestamps_;
-
- private:
-  // Timestamps of buffers generated while parsing the ES stream.
-  std::stringstream buffer_timestamps_stream_;
-
-  DISALLOW_COPY_AND_ASSIGN(EsParserTestBase);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_ES_PARSER_TEST_BASE_H_
diff --git a/cobalt/media/formats/mp2t/mp2t_common.h b/cobalt/media/formats/mp2t/mp2t_common.h
deleted file mode 100644
index 322d32a..0000000
--- a/cobalt/media/formats/mp2t/mp2t_common.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 COBALT_MEDIA_FORMATS_MP2T_MP2T_COMMON_H_
-#define COBALT_MEDIA_FORMATS_MP2T_MP2T_COMMON_H_
-
-#define LOG_LEVEL_TS 5
-#define LOG_LEVEL_PES 4
-#define LOG_LEVEL_ES 3
-
-#define RCHECK(x)                                               \
-  do {                                                          \
-    if (!(x)) {                                                 \
-      DLOG(WARNING) << "Failure while parsing Mpeg2TS: " << #x; \
-      return false;                                             \
-    }                                                           \
-  } while (0)
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-const int kMp2tAudioTrackId = 1;
-const int kMp2tVideoTrackId = 2;
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_MP2T_COMMON_H_
diff --git a/cobalt/media/formats/mp2t/mp2t_stream_parser.cc b/cobalt/media/formats/mp2t/mp2t_stream_parser.cc
deleted file mode 100644
index f9f0e4f..0000000
--- a/cobalt/media/formats/mp2t/mp2t_stream_parser.cc
+++ /dev/null
@@ -1,635 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp2t/mp2t_stream_parser.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/mp2t/es_parser.h"
-#include "cobalt/media/formats/mp2t/es_parser_adts.h"
-#include "cobalt/media/formats/mp2t/es_parser_h264.h"
-#include "cobalt/media/formats/mp2t/es_parser_mpeg1audio.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-#include "cobalt/media/formats/mp2t/ts_packet.h"
-#include "cobalt/media/formats/mp2t/ts_section.h"
-#include "cobalt/media/formats/mp2t/ts_section_pat.h"
-#include "cobalt/media/formats/mp2t/ts_section_pes.h"
-#include "cobalt/media/formats/mp2t/ts_section_pmt.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-enum StreamType {
-  // ISO-13818.1 / ITU H.222 Table 2.34 "Stream type assignments"
-  kStreamTypeMpeg1Audio = 0x3,
-  kStreamTypeAAC = 0xf,
-  kStreamTypeAVC = 0x1b,
-};
-
-class PidState {
- public:
-  enum PidType {
-    kPidPat,
-    kPidPmt,
-    kPidAudioPes,
-    kPidVideoPes,
-  };
-
-  PidState(int pid, PidType pid_type,
-           std::unique_ptr<TsSection> section_parser);
-
-  // Extract the content of the TS packet and parse it.
-  // Return true if successful.
-  bool PushTsPacket(const TsPacket& ts_packet);
-
-  // Flush the PID state (possibly emitting some pending frames)
-  // and reset its state.
-  void Flush();
-
-  // Enable/disable the PID.
-  // Disabling a PID will reset its state and ignore any further incoming TS
-  // packets.
-  void Enable();
-  void Disable();
-  bool IsEnabled() const;
-
-  PidType pid_type() const { return pid_type_; }
-
- private:
-  void ResetState();
-
-  int pid_;
-  PidType pid_type_;
-  std::unique_ptr<TsSection> section_parser_;
-
-  bool enable_;
-
-  int continuity_counter_;
-};
-
-PidState::PidState(int pid, PidType pid_type,
-                   std::unique_ptr<TsSection> section_parser)
-    : pid_(pid),
-      pid_type_(pid_type),
-      section_parser_(std::move(section_parser)),
-      enable_(false),
-      continuity_counter_(-1) {
-  DCHECK(section_parser_);
-}
-
-bool PidState::PushTsPacket(const TsPacket& ts_packet) {
-  DCHECK_EQ(ts_packet.pid(), pid_);
-
-  // The current PID is not part of the PID filter,
-  // just discard the incoming TS packet.
-  if (!enable_) return true;
-
-  int expected_continuity_counter = (continuity_counter_ + 1) % 16;
-  if (continuity_counter_ >= 0 &&
-      ts_packet.continuity_counter() != expected_continuity_counter) {
-    DVLOG(1) << "TS discontinuity detected for pid: " << pid_;
-    return false;
-  }
-
-  bool status =
-      section_parser_->Parse(ts_packet.payload_unit_start_indicator(),
-                             ts_packet.payload(), ts_packet.payload_size());
-
-  // At the minimum, when parsing failed, auto reset the section parser.
-  // Components that use the StreamParser can take further action if needed.
-  if (!status) {
-    DVLOG(1) << "Parsing failed for pid = " << pid_;
-    ResetState();
-  }
-
-  return status;
-}
-
-void PidState::Flush() {
-  section_parser_->Flush();
-  ResetState();
-}
-
-void PidState::Enable() { enable_ = true; }
-
-void PidState::Disable() {
-  if (!enable_) return;
-
-  ResetState();
-  enable_ = false;
-}
-
-bool PidState::IsEnabled() const { return enable_; }
-
-void PidState::ResetState() {
-  section_parser_->Reset();
-  continuity_counter_ = -1;
-}
-
-Mp2tStreamParser::BufferQueueWithConfig::BufferQueueWithConfig(
-    bool is_cfg_sent, const AudioDecoderConfig& audio_cfg,
-    const VideoDecoderConfig& video_cfg)
-    : is_config_sent(is_cfg_sent),
-      audio_config(audio_cfg),
-      video_config(video_cfg) {}
-
-Mp2tStreamParser::BufferQueueWithConfig::BufferQueueWithConfig(
-    const BufferQueueWithConfig& other) = default;
-
-Mp2tStreamParser::BufferQueueWithConfig::~BufferQueueWithConfig() {}
-
-Mp2tStreamParser::Mp2tStreamParser(bool sbr_in_mimetype)
-    : sbr_in_mimetype_(sbr_in_mimetype),
-      selected_audio_pid_(-1),
-      selected_video_pid_(-1),
-      is_initialized_(false),
-      segment_started_(false) {}
-
-Mp2tStreamParser::~Mp2tStreamParser() {}
-
-void Mp2tStreamParser::Init(
-    const InitCB& init_cb, const NewConfigCB& config_cb,
-    const NewBuffersCB& new_buffers_cb, bool /* ignore_text_tracks */,
-    const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-    const NewMediaSegmentCB& new_segment_cb,
-    const EndMediaSegmentCB& end_of_segment_cb,
-    const scoped_refptr<MediaLog>& media_log) {
-  DCHECK(!is_initialized_);
-  DCHECK(init_cb_.is_null());
-  DCHECK(!init_cb.is_null());
-  DCHECK(!config_cb.is_null());
-  DCHECK(!new_buffers_cb.is_null());
-  DCHECK(!encrypted_media_init_data_cb.is_null());
-  DCHECK(!new_segment_cb.is_null());
-  DCHECK(!end_of_segment_cb.is_null());
-
-  init_cb_ = init_cb;
-  config_cb_ = config_cb;
-  new_buffers_cb_ = new_buffers_cb;
-  encrypted_media_init_data_cb_ = encrypted_media_init_data_cb;
-  new_segment_cb_ = new_segment_cb;
-  end_of_segment_cb_ = end_of_segment_cb;
-  media_log_ = media_log;
-}
-
-void Mp2tStreamParser::Flush() {
-  DVLOG(1) << "Mp2tStreamParser::Flush";
-
-  // Flush the buffers and reset the pids.
-  for (const auto& pid_pair : pids_) {
-    DVLOG(1) << "Flushing PID: " << pid_pair.first;
-    pid_pair.second->Flush();
-  }
-  pids_.clear();
-
-  // Flush is invoked from SourceBuffer.abort/SourceState::ResetParserState, and
-  // MSE spec prohibits emitting new configs in ResetParserState algorithm (see
-  // https://w3c.github.io/media-source/#sourcebuffer-reset-parser-state,
-  // 3.5.2 Reset Parser State states that new frames might be processed only in
-  // PARSING_MEDIA_SEGMENT and therefore doesn't allow emitting new configs,
-  // since that might need to run "init segment received" algorithm).
-  // So before we emit remaining buffers here, we need to trim our buffer queue
-  // so that we leave only buffers with configs that were already sent.
-  for (auto buffer_queue_iter = buffer_queue_chain_.begin();
-       buffer_queue_iter != buffer_queue_chain_.end(); ++buffer_queue_iter) {
-    const BufferQueueWithConfig& queue_with_config = *buffer_queue_iter;
-    if (!queue_with_config.is_config_sent) {
-      DVLOG(LOG_LEVEL_ES) << "Flush: dropping buffers with unsent new configs.";
-      buffer_queue_chain_.erase(buffer_queue_iter, buffer_queue_chain_.end());
-      break;
-    }
-  }
-
-  EmitRemainingBuffers();
-  buffer_queue_chain_.clear();
-
-  // End of the segment.
-  // Note: does not need to invoke |end_of_segment_cb_| since flushing the
-  // stream parser already involves the end of the current segment.
-  segment_started_ = false;
-
-  // Remove any bytes left in the TS buffer.
-  // (i.e. any partial TS packet => less than 188 bytes).
-  ts_byte_queue_.Reset();
-
-  // Reset the selected PIDs.
-  selected_audio_pid_ = -1;
-  selected_video_pid_ = -1;
-
-  // Reset the timestamp unroller.
-  timestamp_unroller_.Reset();
-}
-
-bool Mp2tStreamParser::Parse(const uint8_t* buf, int size) {
-  DVLOG(1) << "Mp2tStreamParser::Parse size=" << size;
-
-  // Add the data to the parser state.
-  ts_byte_queue_.Push(buf, size);
-
-  while (true) {
-    const uint8_t* ts_buffer;
-    int ts_buffer_size;
-    ts_byte_queue_.Peek(&ts_buffer, &ts_buffer_size);
-    if (ts_buffer_size < TsPacket::kPacketSize) break;
-
-    // Synchronization.
-    int skipped_bytes = TsPacket::Sync(ts_buffer, ts_buffer_size);
-    if (skipped_bytes > 0) {
-      DVLOG(1) << "Packet not aligned on a TS syncword:"
-               << " skipped_bytes=" << skipped_bytes;
-      ts_byte_queue_.Pop(skipped_bytes);
-      continue;
-    }
-
-    // Parse the TS header, skipping 1 byte if the header is invalid.
-    std::unique_ptr<TsPacket> ts_packet(
-        TsPacket::Parse(ts_buffer, ts_buffer_size));
-    if (!ts_packet) {
-      DVLOG(1) << "Error: invalid TS packet";
-      ts_byte_queue_.Pop(1);
-      continue;
-    }
-    DVLOG(LOG_LEVEL_TS) << "Processing PID=" << ts_packet->pid()
-                        << " start_unit="
-                        << ts_packet->payload_unit_start_indicator();
-
-    // Parse the section.
-    auto it = pids_.find(ts_packet->pid());
-    if (it == pids_.end() && ts_packet->pid() == TsSection::kPidPat) {
-      // Create the PAT state here if needed.
-      std::unique_ptr<TsSection> pat_section_parser(new TsSectionPat(
-          base::Bind(&Mp2tStreamParser::RegisterPmt, base::Unretained(this))));
-      std::unique_ptr<PidState> pat_pid_state(new PidState(
-          ts_packet->pid(), PidState::kPidPat, std::move(pat_section_parser)));
-      pat_pid_state->Enable();
-      it = pids_
-               .insert(
-                   std::make_pair(ts_packet->pid(), std::move(pat_pid_state)))
-               .first;
-    }
-
-    if (it != pids_.end()) {
-      if (!it->second->PushTsPacket(*ts_packet)) return false;
-    } else {
-      DVLOG(LOG_LEVEL_TS) << "Ignoring TS packet for pid: " << ts_packet->pid();
-    }
-
-    // Go to the next packet.
-    ts_byte_queue_.Pop(TsPacket::kPacketSize);
-  }
-
-  RCHECK(FinishInitializationIfNeeded());
-
-  // Emit the A/V buffers that kept accumulating during TS parsing.
-  return EmitRemainingBuffers();
-}
-
-void Mp2tStreamParser::RegisterPmt(int program_number, int pmt_pid) {
-  DVLOG(1) << "RegisterPmt:"
-           << " program_number=" << program_number << " pmt_pid=" << pmt_pid;
-
-  // Only one TS program is allowed. Ignore the incoming program map table,
-  // if there is already one registered.
-  for (const auto& pid_pair : pids_) {
-    PidState* pid_state = pid_pair.second.get();
-    if (pid_state->pid_type() == PidState::kPidPmt) {
-      DVLOG_IF(1, pmt_pid != pid_pair.first)
-          << "More than one program is defined";
-      return;
-    }
-  }
-
-  // Create the PMT state here if needed.
-  DVLOG(1) << "Create a new PMT parser";
-  std::unique_ptr<TsSection> pmt_section_parser(new TsSectionPmt(base::Bind(
-      &Mp2tStreamParser::RegisterPes, base::Unretained(this), pmt_pid)));
-  std::unique_ptr<PidState> pmt_pid_state(
-      new PidState(pmt_pid, PidState::kPidPmt, std::move(pmt_section_parser)));
-  pmt_pid_state->Enable();
-  pids_.insert(std::make_pair(pmt_pid, std::move(pmt_pid_state)));
-}
-
-void Mp2tStreamParser::RegisterPes(int pmt_pid, int pes_pid, int stream_type) {
-  // TODO(damienv): check there is no mismatch if the entry already exists.
-  DVLOG(1) << "RegisterPes:"
-           << " pes_pid=" << pes_pid << " stream_type=" << std::hex
-           << stream_type << std::dec;
-  auto it = pids_.find(pes_pid);
-  if (it != pids_.end()) return;
-
-  // Create a stream parser corresponding to the stream type.
-  bool is_audio = false;
-  std::unique_ptr<EsParser> es_parser;
-  if (stream_type == kStreamTypeAVC) {
-    es_parser.reset(
-        new EsParserH264(base::Bind(&Mp2tStreamParser::OnVideoConfigChanged,
-                                    base::Unretained(this), pes_pid),
-                         base::Bind(&Mp2tStreamParser::OnEmitVideoBuffer,
-                                    base::Unretained(this), pes_pid)));
-  } else if (stream_type == kStreamTypeAAC) {
-    es_parser.reset(
-        new EsParserAdts(base::Bind(&Mp2tStreamParser::OnAudioConfigChanged,
-                                    base::Unretained(this), pes_pid),
-                         base::Bind(&Mp2tStreamParser::OnEmitAudioBuffer,
-                                    base::Unretained(this), pes_pid),
-                         sbr_in_mimetype_));
-    is_audio = true;
-  } else if (stream_type == kStreamTypeMpeg1Audio) {
-    es_parser.reset(new EsParserMpeg1Audio(
-        base::Bind(&Mp2tStreamParser::OnAudioConfigChanged,
-                   base::Unretained(this), pes_pid),
-        base::Bind(&Mp2tStreamParser::OnEmitAudioBuffer, base::Unretained(this),
-                   pes_pid),
-        media_log_));
-    is_audio = true;
-  } else {
-    return;
-  }
-
-  // Create the PES state here.
-  DVLOG(1) << "Create a new PES state";
-  std::unique_ptr<TsSection> pes_section_parser(
-      new TsSectionPes(std::move(es_parser), &timestamp_unroller_));
-  PidState::PidType pid_type =
-      is_audio ? PidState::kPidAudioPes : PidState::kPidVideoPes;
-  std::unique_ptr<PidState> pes_pid_state(
-      new PidState(pes_pid, pid_type, std::move(pes_section_parser)));
-  pids_.insert(std::make_pair(pes_pid, std::move(pes_pid_state)));
-
-  // A new PES pid has been added, the PID filter might change.
-  UpdatePidFilter();
-}
-
-void Mp2tStreamParser::UpdatePidFilter() {
-  // Applies the HLS rule to select the default audio/video PIDs:
-  // select the audio/video streams with the lowest PID.
-  // TODO(damienv): this can be changed when the StreamParser interface
-  // supports multiple audio/video streams.
-  auto lowest_audio_pid = pids_.end();
-  auto lowest_video_pid = pids_.end();
-  for (auto it = pids_.begin(); it != pids_.end(); ++it) {
-    int pid = it->first;
-    PidState* pid_state = it->second.get();
-    if (pid_state->pid_type() == PidState::kPidAudioPes &&
-        (lowest_audio_pid == pids_.end() || pid < lowest_audio_pid->first))
-      lowest_audio_pid = it;
-    if (pid_state->pid_type() == PidState::kPidVideoPes &&
-        (lowest_video_pid == pids_.end() || pid < lowest_video_pid->first))
-      lowest_video_pid = it;
-  }
-
-  // Enable both the lowest audio and video PIDs.
-  if (lowest_audio_pid != pids_.end()) {
-    DVLOG(1) << "Enable audio pid: " << lowest_audio_pid->first;
-    lowest_audio_pid->second->Enable();
-    selected_audio_pid_ = lowest_audio_pid->first;
-  }
-  if (lowest_video_pid != pids_.end()) {
-    DVLOG(1) << "Enable video pid: " << lowest_video_pid->first;
-    lowest_video_pid->second->Enable();
-    selected_video_pid_ = lowest_video_pid->first;
-  }
-
-  // Disable all the other audio and video PIDs.
-  for (auto it = pids_.begin(); it != pids_.end(); ++it) {
-    PidState* pid_state = it->second.get();
-    if (it != lowest_audio_pid && it != lowest_video_pid &&
-        (pid_state->pid_type() == PidState::kPidAudioPes ||
-         pid_state->pid_type() == PidState::kPidVideoPes))
-      pid_state->Disable();
-  }
-}
-
-void Mp2tStreamParser::OnVideoConfigChanged(
-    int pes_pid, const VideoDecoderConfig& video_decoder_config) {
-  DVLOG(1) << "OnVideoConfigChanged for pid=" << pes_pid;
-  DCHECK_EQ(pes_pid, selected_video_pid_);
-  DCHECK(video_decoder_config.IsValidConfig());
-
-  if (!buffer_queue_chain_.empty() &&
-      !buffer_queue_chain_.back().video_config.IsValidConfig()) {
-    // No video has been received so far, can reuse the existing video queue.
-    DCHECK(buffer_queue_chain_.back().video_queue.empty());
-    buffer_queue_chain_.back().video_config = video_decoder_config;
-  } else {
-    // Create a new entry in |buffer_queue_chain_| with the updated configs.
-    BufferQueueWithConfig buffer_queue_with_config(
-        false,
-        buffer_queue_chain_.empty() ? AudioDecoderConfig()
-                                    : buffer_queue_chain_.back().audio_config,
-        video_decoder_config);
-    buffer_queue_chain_.push_back(buffer_queue_with_config);
-  }
-
-  // Replace any non valid config with the 1st valid entry.
-  // This might happen if there was no available config before.
-  for (std::list<BufferQueueWithConfig>::iterator it =
-           buffer_queue_chain_.begin();
-       it != buffer_queue_chain_.end(); ++it) {
-    if (it->video_config.IsValidConfig()) break;
-    it->video_config = video_decoder_config;
-  }
-}
-
-void Mp2tStreamParser::OnAudioConfigChanged(
-    int pes_pid, const AudioDecoderConfig& audio_decoder_config) {
-  DVLOG(1) << "OnAudioConfigChanged for pid=" << pes_pid;
-  DCHECK_EQ(pes_pid, selected_audio_pid_);
-  DCHECK(audio_decoder_config.IsValidConfig());
-
-  if (!buffer_queue_chain_.empty() &&
-      !buffer_queue_chain_.back().audio_config.IsValidConfig()) {
-    // No audio has been received so far, can reuse the existing audio queue.
-    DCHECK(buffer_queue_chain_.back().audio_queue.empty());
-    buffer_queue_chain_.back().audio_config = audio_decoder_config;
-  } else {
-    // Create a new entry in |buffer_queue_chain_| with the updated configs.
-    BufferQueueWithConfig buffer_queue_with_config(
-        false, audio_decoder_config,
-        buffer_queue_chain_.empty() ? VideoDecoderConfig()
-                                    : buffer_queue_chain_.back().video_config);
-    buffer_queue_chain_.push_back(buffer_queue_with_config);
-  }
-
-  // Replace any non valid config with the 1st valid entry.
-  // This might happen if there was no available config before.
-  for (std::list<BufferQueueWithConfig>::iterator it =
-           buffer_queue_chain_.begin();
-       it != buffer_queue_chain_.end(); ++it) {
-    if (it->audio_config.IsValidConfig()) break;
-    it->audio_config = audio_decoder_config;
-  }
-}
-
-std::unique_ptr<MediaTracks> GenerateMediaTrackInfo(
-    const AudioDecoderConfig& audio_config,
-    const VideoDecoderConfig& video_config) {
-  std::unique_ptr<MediaTracks> media_tracks(new MediaTracks());
-  // TODO(servolk): Implement proper sourcing of media track info as described
-  // in crbug.com/590085
-  if (audio_config.IsValidConfig()) {
-    media_tracks->AddAudioTrack(audio_config, kMp2tAudioTrackId, "main", "",
-                                "");
-  }
-  if (video_config.IsValidConfig()) {
-    media_tracks->AddVideoTrack(video_config, kMp2tVideoTrackId, "main", "",
-                                "");
-  }
-  return media_tracks;
-}
-
-bool Mp2tStreamParser::FinishInitializationIfNeeded() {
-  // Nothing to be done if already initialized.
-  if (is_initialized_) return true;
-
-  // Wait for more data to come to finish initialization.
-  if (buffer_queue_chain_.empty()) return true;
-
-  // Wait for more data to come if one of the config is not available.
-  BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front();
-  if (selected_audio_pid_ > 0 &&
-      !queue_with_config.audio_config.IsValidConfig())
-    return true;
-  if (selected_video_pid_ > 0 &&
-      !queue_with_config.video_config.IsValidConfig())
-    return true;
-
-  // Pass the config before invoking the initialization callback.
-  std::unique_ptr<MediaTracks> media_tracks = GenerateMediaTrackInfo(
-      queue_with_config.audio_config, queue_with_config.video_config);
-  RCHECK(config_cb_.Run(std::move(media_tracks), TextTrackConfigMap()));
-  queue_with_config.is_config_sent = true;
-
-  // For Mpeg2 TS, the duration is not known.
-  DVLOG(1) << "Mpeg2TS stream parser initialization done";
-
-  // TODO(wolenetz): If possible, detect and report track counts by type more
-  // accurately here. Currently, capped at max 1 each for audio and video, with
-  // assumption of 0 text tracks.
-  InitParameters params(kInfiniteDuration);
-  params.detected_audio_track_count =
-      queue_with_config.audio_config.IsValidConfig() ? 1 : 0;
-  params.detected_video_track_count =
-      queue_with_config.video_config.IsValidConfig() ? 1 : 0;
-  base::ResetAndReturn(&init_cb_).Run(params);
-  is_initialized_ = true;
-
-  return true;
-}
-
-void Mp2tStreamParser::OnEmitAudioBuffer(
-    int pes_pid, scoped_refptr<StreamParserBuffer> stream_parser_buffer) {
-  DCHECK_EQ(pes_pid, selected_audio_pid_);
-
-  DVLOG(LOG_LEVEL_ES)
-      << "OnEmitAudioBuffer: "
-      << " size=" << stream_parser_buffer->data_size()
-      << " dts=" << stream_parser_buffer->GetDecodeTimestamp().InMilliseconds()
-      << " pts=" << stream_parser_buffer->timestamp().InMilliseconds()
-      << " dur=" << stream_parser_buffer->duration().InMilliseconds();
-
-  // Ignore the incoming buffer if it is not associated with any config.
-  if (buffer_queue_chain_.empty()) {
-    LOG(ERROR) << "Cannot provide buffers before configs";
-    return;
-  }
-
-  buffer_queue_chain_.back().audio_queue.push_back(stream_parser_buffer);
-}
-
-void Mp2tStreamParser::OnEmitVideoBuffer(
-    int pes_pid, scoped_refptr<StreamParserBuffer> stream_parser_buffer) {
-  DCHECK_EQ(pes_pid, selected_video_pid_);
-
-  DVLOG(LOG_LEVEL_ES)
-      << "OnEmitVideoBuffer"
-      << " size=" << stream_parser_buffer->data_size()
-      << " dts=" << stream_parser_buffer->GetDecodeTimestamp().InMilliseconds()
-      << " pts=" << stream_parser_buffer->timestamp().InMilliseconds()
-      << " dur=" << stream_parser_buffer->duration().InMilliseconds()
-      << " is_key_frame=" << stream_parser_buffer->is_key_frame();
-
-  // Ignore the incoming buffer if it is not associated with any config.
-  if (buffer_queue_chain_.empty()) {
-    NOTREACHED() << "Cannot provide buffers before configs";
-    return;
-  }
-
-  buffer_queue_chain_.back().video_queue.push_back(stream_parser_buffer);
-}
-
-bool Mp2tStreamParser::EmitRemainingBuffers() {
-  DVLOG(LOG_LEVEL_ES) << "Mp2tStreamParser::EmitRemainingBuffers";
-
-  // No buffer should be sent until fully initialized.
-  if (!is_initialized_) return true;
-
-  if (buffer_queue_chain_.empty()) return true;
-
-  // Keep track of the last audio and video config sent.
-  AudioDecoderConfig last_audio_config =
-      buffer_queue_chain_.back().audio_config;
-  VideoDecoderConfig last_video_config =
-      buffer_queue_chain_.back().video_config;
-
-  // Do not have all the configs, need more data.
-  if (selected_audio_pid_ >= 0 && !last_audio_config.IsValidConfig())
-    return true;
-  if (selected_video_pid_ >= 0 && !last_video_config.IsValidConfig())
-    return true;
-
-  // Buffer emission.
-  while (!buffer_queue_chain_.empty()) {
-    // Start a segment if needed.
-    if (!segment_started_) {
-      DVLOG(1) << "Starting a new segment";
-      segment_started_ = true;
-      new_segment_cb_.Run();
-    }
-
-    // Update the audio and video config if needed.
-    BufferQueueWithConfig& queue_with_config = buffer_queue_chain_.front();
-    if (!queue_with_config.is_config_sent) {
-      std::unique_ptr<MediaTracks> media_tracks = GenerateMediaTrackInfo(
-          queue_with_config.audio_config, queue_with_config.video_config);
-      if (!config_cb_.Run(std::move(media_tracks), TextTrackConfigMap()))
-        return false;
-      queue_with_config.is_config_sent = true;
-    }
-
-    // Add buffers.
-    BufferQueueMap buffer_queue_map;
-    if (!queue_with_config.audio_queue.empty())
-      buffer_queue_map.insert(
-          std::make_pair(kMp2tAudioTrackId, queue_with_config.audio_queue));
-    if (!queue_with_config.video_queue.empty())
-      buffer_queue_map.insert(
-          std::make_pair(kMp2tVideoTrackId, queue_with_config.video_queue));
-
-    if (!buffer_queue_map.empty() && !new_buffers_cb_.Run(buffer_queue_map))
-      return false;
-
-    buffer_queue_chain_.pop_front();
-  }
-
-  // Push an empty queue with the last audio/video config
-  // so that buffers with the same config can be added later on.
-  BufferQueueWithConfig queue_with_config(true, last_audio_config,
-                                          last_video_config);
-  buffer_queue_chain_.push_back(queue_with_config);
-
-  return true;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/mp2t_stream_parser.h b/cobalt/media/formats/mp2t/mp2t_stream_parser.h
deleted file mode 100644
index e37a8a3..0000000
--- a/cobalt/media/formats/mp2t/mp2t_stream_parser.h
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FORMATS_MP2T_MP2T_STREAM_PARSER_H_
-#define COBALT_MEDIA_FORMATS_MP2T_MP2T_STREAM_PARSER_H_
-
-#include <list>
-#include <map>
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/byte_queue.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/formats/mp2t/timestamp_unroller.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class StreamParserBuffer;
-
-namespace mp2t {
-
-class PidState;
-
-class MEDIA_EXPORT Mp2tStreamParser : public StreamParser {
- public:
-  explicit Mp2tStreamParser(bool sbr_in_mimetype);
-  ~Mp2tStreamParser() override;
-
-  // StreamParser implementation.
-  void Init(const InitCB& init_cb, const NewConfigCB& config_cb,
-            const NewBuffersCB& new_buffers_cb, bool ignore_text_tracks,
-            const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-            const NewMediaSegmentCB& new_segment_cb,
-            const EndMediaSegmentCB& end_of_segment_cb,
-            const scoped_refptr<MediaLog>& media_log) override;
-  void Flush() override;
-  bool Parse(const uint8_t* buf, int size) override;
-
- private:
-  struct BufferQueueWithConfig {
-    BufferQueueWithConfig(bool is_cfg_sent, const AudioDecoderConfig& audio_cfg,
-                          const VideoDecoderConfig& video_cfg);
-    BufferQueueWithConfig(const BufferQueueWithConfig& other);
-    ~BufferQueueWithConfig();
-
-    bool is_config_sent;
-    AudioDecoderConfig audio_config;
-    StreamParser::BufferQueue audio_queue;
-    VideoDecoderConfig video_config;
-    StreamParser::BufferQueue video_queue;
-  };
-
-  // Callback invoked to register a Program Map Table.
-  // Note: Does nothing if the PID is already registered.
-  void RegisterPmt(int program_number, int pmt_pid);
-
-  // Callback invoked to register a PES pid.
-  // Possible values for |stream_type| are defined in:
-  // ISO-13818.1 / ITU H.222 Table 2.34 "Stream type assignments".
-  // |pes_pid| is part of the Program Map Table referred by |pmt_pid|.
-  void RegisterPes(int pmt_pid, int pes_pid, int stream_type);
-
-  // Since the StreamParser interface allows only one audio & video streams,
-  // an automatic PID filtering should be applied to select the audio & video
-  // streams.
-  void UpdatePidFilter();
-
-  // Callback invoked each time the audio/video decoder configuration is
-  // changed.
-  void OnVideoConfigChanged(int pes_pid,
-                            const VideoDecoderConfig& video_decoder_config);
-  void OnAudioConfigChanged(int pes_pid,
-                            const AudioDecoderConfig& audio_decoder_config);
-
-  // Invoke the initialization callback if needed.
-  bool FinishInitializationIfNeeded();
-
-  // Callback invoked by the ES stream parser
-  // to emit a new audio/video access unit.
-  void OnEmitAudioBuffer(
-      int pes_pid, scoped_refptr<StreamParserBuffer> stream_parser_buffer);
-  void OnEmitVideoBuffer(
-      int pes_pid, scoped_refptr<StreamParserBuffer> stream_parser_buffer);
-  bool EmitRemainingBuffers();
-
-  // List of callbacks.
-  InitCB init_cb_;
-  NewConfigCB config_cb_;
-  NewBuffersCB new_buffers_cb_;
-  EncryptedMediaInitDataCB encrypted_media_init_data_cb_;
-  NewMediaSegmentCB new_segment_cb_;
-  EndMediaSegmentCB end_of_segment_cb_;
-  scoped_refptr<MediaLog> media_log_;
-
-  // True when AAC SBR extension is signalled in the mimetype
-  // (mp4a.40.5 in the codecs parameter).
-  bool sbr_in_mimetype_;
-
-  // Bytes of the TS stream.
-  ByteQueue ts_byte_queue_;
-
-  // List of PIDs and their state.
-  std::map<int, std::unique_ptr<PidState>> pids_;
-
-  // Selected audio and video PIDs.
-  int selected_audio_pid_;
-  int selected_video_pid_;
-
-  // Pending audio & video buffers.
-  std::list<BufferQueueWithConfig> buffer_queue_chain_;
-
-  // Whether |init_cb_| has been invoked.
-  bool is_initialized_;
-
-  // Indicate whether a segment was started.
-  bool segment_started_;
-
-  // Timestamp unroller.
-  // Timestamps in PES packets must be unrolled using the same offset.
-  // So the unroller is global between PES pids.
-  TimestampUnroller timestamp_unroller_;
-
-  DISALLOW_COPY_AND_ASSIGN(Mp2tStreamParser);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_MP2T_STREAM_PARSER_H_
diff --git a/cobalt/media/formats/mp2t/mp2t_stream_parser_unittest.cc b/cobalt/media/formats/mp2t/mp2t_stream_parser_unittest.cc
deleted file mode 100644
index 8bf38a6..0000000
--- a/cobalt/media/formats/mp2t/mp2t_stream_parser_unittest.cc
+++ /dev/null
@@ -1,319 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp2t/mp2t_stream_parser.h"
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/media_track.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-namespace {
-
-bool IsMonotonic(const StreamParser::BufferQueue& buffers) {
-  if (buffers.empty()) return true;
-
-  StreamParser::BufferQueue::const_iterator it1 = buffers.begin();
-  StreamParser::BufferQueue::const_iterator it2 = ++it1;
-  for (; it2 != buffers.end(); ++it1, ++it2) {
-    if ((*it2)->GetDecodeTimestamp() < (*it1)->GetDecodeTimestamp())
-      return false;
-  }
-  return true;
-}
-
-bool IsAlmostEqual(DecodeTimestamp t0, DecodeTimestamp t1) {
-  base::TimeDelta kMaxDeviation = base::TimeDelta::FromMilliseconds(5);
-  base::TimeDelta diff = t1 - t0;
-  return (diff >= -kMaxDeviation && diff <= kMaxDeviation);
-}
-
-}  // namespace
-
-class Mp2tStreamParserTest : public testing::Test {
- public:
-  Mp2tStreamParserTest()
-      : segment_count_(0),
-        config_count_(0),
-        audio_frame_count_(0),
-        video_frame_count_(0),
-        has_video_(true),
-        audio_min_dts_(kNoDecodeTimestamp()),
-        audio_max_dts_(kNoDecodeTimestamp()),
-        video_min_dts_(kNoDecodeTimestamp()),
-        video_max_dts_(kNoDecodeTimestamp()) {
-    bool has_sbr = false;
-    parser_.reset(new Mp2tStreamParser(has_sbr));
-  }
-
- protected:
-  std::unique_ptr<Mp2tStreamParser> parser_;
-  int segment_count_;
-  int config_count_;
-  int audio_frame_count_;
-  int video_frame_count_;
-  bool has_video_;
-  DecodeTimestamp audio_min_dts_;
-  DecodeTimestamp audio_max_dts_;
-  DecodeTimestamp video_min_dts_;
-  DecodeTimestamp video_max_dts_;
-  StreamParser::TrackId audio_track_id_;
-  StreamParser::TrackId video_track_id_;
-
-  void ResetStats() {
-    segment_count_ = 0;
-    config_count_ = 0;
-    audio_frame_count_ = 0;
-    video_frame_count_ = 0;
-    audio_min_dts_ = kNoDecodeTimestamp();
-    audio_max_dts_ = kNoDecodeTimestamp();
-    video_min_dts_ = kNoDecodeTimestamp();
-    video_max_dts_ = kNoDecodeTimestamp();
-  }
-
-  bool AppendData(const uint8_t* data, size_t length) {
-    return parser_->Parse(data, length);
-  }
-
-  bool AppendDataInPieces(const uint8_t* data, size_t length,
-                          size_t piece_size) {
-    const uint8_t* start = data;
-    const uint8_t* end = data + length;
-    while (start < end) {
-      size_t append_size =
-          std::min(piece_size, static_cast<size_t>(end - start));
-      if (!AppendData(start, append_size)) return false;
-      start += append_size;
-    }
-    return true;
-  }
-
-  void OnInit(const StreamParser::InitParameters& params) {
-    DVLOG(1) << "OnInit: dur=" << params.duration.InMilliseconds()
-             << ", autoTimestampOffset=" << params.auto_update_timestamp_offset;
-  }
-
-  bool OnNewConfig(std::unique_ptr<MediaTracks> tracks,
-                   const StreamParser::TextTrackConfigMap& tc) {
-    DVLOG(1) << "OnNewConfig: got " << tracks->tracks().size() << " tracks";
-    bool found_audio_track = false;
-    bool found_video_track = false;
-    for (const auto& track : tracks->tracks()) {
-      const auto& track_id = track->bytestream_track_id();
-      if (track->type() == MediaTrack::Audio) {
-        audio_track_id_ = track_id;
-        found_audio_track = true;
-        EXPECT_TRUE(tracks->getAudioConfig(track_id).IsValidConfig());
-      } else if (track->type() == MediaTrack::Video) {
-        video_track_id_ = track_id;
-        found_video_track = true;
-        EXPECT_TRUE(tracks->getVideoConfig(track_id).IsValidConfig());
-      } else {
-        // Unexpected track type.
-        LOG(ERROR) << "Unexpected track type " << track->type();
-        EXPECT_TRUE(false);
-      }
-    }
-    EXPECT_TRUE(found_audio_track);
-    EXPECT_EQ(has_video_, found_video_track);
-    config_count_++;
-    return true;
-  }
-
-  bool OnNewBuffers(const StreamParser::BufferQueueMap& buffer_queue_map) {
-    EXPECT_GT(config_count_, 0);
-    // Ensure that track ids are properly assigned on all emitted buffers.
-    for (const auto& it : buffer_queue_map) {
-      DVLOG(3) << "Buffers for track_id=" << it.first;
-      for (const auto& buf : it.second) {
-        DVLOG(3) << "  track_id=" << buf->track_id()
-                 << ", size=" << buf->data_size()
-                 << ", pts=" << buf->timestamp().InSecondsF()
-                 << ", dts=" << buf->GetDecodeTimestamp().InSecondsF()
-                 << ", dur=" << buf->duration().InSecondsF();
-        EXPECT_EQ(it.first, buf->track_id());
-      }
-    }
-
-    const StreamParser::BufferQueue empty_buffers;
-    const auto& itr_audio = buffer_queue_map.find(audio_track_id_);
-    const StreamParser::BufferQueue& audio_buffers =
-        (itr_audio == buffer_queue_map.end()) ? empty_buffers
-                                              : itr_audio->second;
-
-    const auto& itr_video = buffer_queue_map.find(video_track_id_);
-    const StreamParser::BufferQueue& video_buffers =
-        (itr_video == buffer_queue_map.end()) ? empty_buffers
-                                              : itr_video->second;
-
-    // Verify monotonicity.
-    if (!IsMonotonic(video_buffers)) return false;
-    if (!IsMonotonic(audio_buffers)) return false;
-
-    if (!video_buffers.empty()) {
-      DecodeTimestamp first_dts = video_buffers.front()->GetDecodeTimestamp();
-      DecodeTimestamp last_dts = video_buffers.back()->GetDecodeTimestamp();
-      if (video_max_dts_ != kNoDecodeTimestamp() && first_dts < video_max_dts_)
-        return false;
-      if (video_min_dts_ == kNoDecodeTimestamp()) video_min_dts_ = first_dts;
-      video_max_dts_ = last_dts;
-    }
-    if (!audio_buffers.empty()) {
-      DecodeTimestamp first_dts = audio_buffers.front()->GetDecodeTimestamp();
-      DecodeTimestamp last_dts = audio_buffers.back()->GetDecodeTimestamp();
-      if (audio_max_dts_ != kNoDecodeTimestamp() && first_dts < audio_max_dts_)
-        return false;
-      if (audio_min_dts_ == kNoDecodeTimestamp()) audio_min_dts_ = first_dts;
-      audio_max_dts_ = last_dts;
-    }
-
-    audio_frame_count_ += audio_buffers.size();
-    video_frame_count_ += video_buffers.size();
-    return true;
-  }
-
-  void OnKeyNeeded(EmeInitDataType type,
-                   const std::vector<uint8_t>& init_data) {
-    LOG(ERROR) << "OnKeyNeeded not expected in the Mpeg2 TS parser";
-    EXPECT_TRUE(false);
-  }
-
-  void OnNewSegment() {
-    DVLOG(1) << "OnNewSegment";
-    segment_count_++;
-  }
-
-  void OnEndOfSegment() {
-    LOG(ERROR) << "OnEndOfSegment not expected in the Mpeg2 TS parser";
-    EXPECT_TRUE(false);
-  }
-
-  void InitializeParser() {
-    parser_->Init(
-        base::Bind(&Mp2tStreamParserTest::OnInit, base::Unretained(this)),
-        base::Bind(&Mp2tStreamParserTest::OnNewConfig, base::Unretained(this)),
-        base::Bind(&Mp2tStreamParserTest::OnNewBuffers, base::Unretained(this)),
-        true,
-        base::Bind(&Mp2tStreamParserTest::OnKeyNeeded, base::Unretained(this)),
-        base::Bind(&Mp2tStreamParserTest::OnNewSegment, base::Unretained(this)),
-        base::Bind(&Mp2tStreamParserTest::OnEndOfSegment,
-                   base::Unretained(this)),
-        new MediaLog());
-  }
-
-  bool ParseMpeg2TsFile(const std::string& filename, int append_bytes) {
-    scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename);
-    EXPECT_TRUE(
-        AppendDataInPieces(buffer->data(), buffer->data_size(), append_bytes));
-    return true;
-  }
-};
-
-TEST_F(Mp2tStreamParserTest, UnalignedAppend17) {
-  // Test small, non-segment-aligned appends.
-  InitializeParser();
-  ParseMpeg2TsFile("bear-1280x720.ts", 17);
-  parser_->Flush();
-  EXPECT_EQ(video_frame_count_, 82);
-  // This stream has no mid-stream configuration change.
-  EXPECT_EQ(config_count_, 1);
-  EXPECT_EQ(segment_count_, 1);
-}
-
-TEST_F(Mp2tStreamParserTest, UnalignedAppend512) {
-  // Test small, non-segment-aligned appends.
-  InitializeParser();
-  ParseMpeg2TsFile("bear-1280x720.ts", 512);
-  parser_->Flush();
-  EXPECT_EQ(video_frame_count_, 82);
-  // This stream has no mid-stream configuration change.
-  EXPECT_EQ(config_count_, 1);
-  EXPECT_EQ(segment_count_, 1);
-}
-
-TEST_F(Mp2tStreamParserTest, AppendAfterFlush512) {
-  InitializeParser();
-  ParseMpeg2TsFile("bear-1280x720.ts", 512);
-  parser_->Flush();
-  EXPECT_EQ(video_frame_count_, 82);
-  EXPECT_EQ(config_count_, 1);
-  EXPECT_EQ(segment_count_, 1);
-
-  ResetStats();
-  ParseMpeg2TsFile("bear-1280x720.ts", 512);
-  parser_->Flush();
-  EXPECT_EQ(video_frame_count_, 82);
-  EXPECT_EQ(config_count_, 1);
-  EXPECT_EQ(segment_count_, 1);
-}
-
-TEST_F(Mp2tStreamParserTest, TimestampWrapAround) {
-  // "bear-1280x720_ptswraparound.ts" has been transcoded
-  // from bear-1280x720.mp4 by applying a time offset of 95442s
-  // (close to 2^33 / 90000) which results in timestamps wrap around
-  // in the Mpeg2 TS stream.
-  InitializeParser();
-  ParseMpeg2TsFile("bear-1280x720_ptswraparound.ts", 512);
-  parser_->Flush();
-  EXPECT_EQ(video_frame_count_, 82);
-
-  EXPECT_TRUE(
-      IsAlmostEqual(video_min_dts_, DecodeTimestamp::FromSecondsD(95443.376)));
-  EXPECT_TRUE(
-      IsAlmostEqual(video_max_dts_, DecodeTimestamp::FromSecondsD(95446.079)));
-
-  // Note: for audio, AdtsStreamParser considers only the PTS (which is then
-  // used as the DTS).
-  // TODO(damienv): most of the time, audio streams just have PTS. Here, only
-  // the first PES packet has a DTS, all the other PES packets have PTS only.
-  // Reconsider the expected value for |audio_min_dts_| if DTS are used as part
-  // of the ADTS stream parser.
-  //
-  // Note: the last pts for audio is 95445.931 but this PES packet includes
-  // 9 ADTS frames with 1 AAC frame in each ADTS frame.
-  // So the PTS of the last AAC frame is:
-  // 95445.931 + 8 * (1024 / 44100) = 95446.117
-  EXPECT_TRUE(
-      IsAlmostEqual(audio_min_dts_, DecodeTimestamp::FromSecondsD(95443.400)));
-  EXPECT_TRUE(
-      IsAlmostEqual(audio_max_dts_, DecodeTimestamp::FromSecondsD(95446.117)));
-}
-
-TEST_F(Mp2tStreamParserTest, AudioInPrivateStream1) {
-  // Test small, non-segment-aligned appends.
-  InitializeParser();
-  has_video_ = false;
-  ParseMpeg2TsFile("bear_adts_in_private_stream_1.ts", 512);
-  parser_->Flush();
-  EXPECT_EQ(audio_frame_count_, 40);
-  EXPECT_EQ(video_frame_count_, 0);
-  // This stream has no mid-stream configuration change.
-  EXPECT_EQ(config_count_, 1);
-  EXPECT_EQ(segment_count_, 1);
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/timestamp_unroller.cc b/cobalt/media/formats/mp2t/timestamp_unroller.cc
deleted file mode 100644
index 3ff20f8..0000000
--- a/cobalt/media/formats/mp2t/timestamp_unroller.cc
+++ /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.
-
-#include "cobalt/media/formats/mp2t/timestamp_unroller.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-TimestampUnroller::TimestampUnroller()
-    : is_previous_timestamp_valid_(false), previous_unrolled_timestamp_(0) {}
-
-TimestampUnroller::~TimestampUnroller() {}
-
-int64_t TimestampUnroller::GetUnrolledTimestamp(int64_t timestamp) {
-  // Mpeg2 TS timestamps have an accuracy of 33 bits.
-  const int nbits = 33;
-
-  // |timestamp| has a precision of |nbits|
-  // so make sure the highest bits are set to 0.
-  DCHECK_EQ((timestamp >> nbits), 0);
-
-  if (!is_previous_timestamp_valid_) {
-    previous_unrolled_timestamp_ = timestamp;
-    is_previous_timestamp_valid_ = true;
-    return timestamp;
-  }
-
-  // |timestamp| is known modulo 2^33, so estimate the highest bits
-  // to minimize the discontinuity with the previous unrolled timestamp.
-  // Three possibilities are considered to estimate the missing high bits
-  // of |timestamp|. If the bits of the previous unrolled timestamp are
-  // {b63, b62, ..., b0} and bits of |timestamp| are {0, ..., 0, a32, ..., a0}
-  // then the 3 possibilities are:
-  // 1) t1 = {b63, ..., b33, a32, ..., a0} (apply the same offset multiple
-  //    of 2^33 as the one used for the previous timestamp)
-  // 2) t0 = t1 - 2^33
-  // 3) t2 = t1 + 2^33
-  //
-  // A few remarks:
-  // - the purpose of the timestamp unroller is only to unroll timestamps
-  // in such a way timestamp continuity is satisfied. It can generate negative
-  // values during that process.
-  // - possible overflows are not considered here since 64 bits on a 90kHz
-  // timescale is way enough to represent several years of playback.
-  int64_t previous_unrolled_time_high = (previous_unrolled_timestamp_ >> nbits);
-  int64_t time0 = ((previous_unrolled_time_high - 1) << nbits) | timestamp;
-  int64_t time1 = ((previous_unrolled_time_high + 0) << nbits) | timestamp;
-  int64_t time2 = ((previous_unrolled_time_high + 1) << nbits) | timestamp;
-
-  // Select the min absolute difference with the current time
-  // so as to ensure time continuity.
-  int64_t diff0 = time0 - previous_unrolled_timestamp_;
-  int64_t diff1 = time1 - previous_unrolled_timestamp_;
-  int64_t diff2 = time2 - previous_unrolled_timestamp_;
-  if (diff0 < 0) diff0 = -diff0;
-  if (diff1 < 0) diff1 = -diff1;
-  if (diff2 < 0) diff2 = -diff2;
-
-  int64_t unrolled_time;
-  int64_t min_diff;
-  if (diff1 < diff0) {
-    unrolled_time = time1;
-    min_diff = diff1;
-  } else {
-    unrolled_time = time0;
-    min_diff = diff0;
-  }
-  if (diff2 < min_diff) unrolled_time = time2;
-
-  // Update the state of the timestamp unroller.
-  previous_unrolled_timestamp_ = unrolled_time;
-
-  return unrolled_time;
-}
-
-void TimestampUnroller::Reset() {
-  is_previous_timestamp_valid_ = false;
-  previous_unrolled_timestamp_ = 0;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/timestamp_unroller.h b/cobalt/media/formats/mp2t/timestamp_unroller.h
deleted file mode 100644
index 28e171b..0000000
--- a/cobalt/media/formats/mp2t/timestamp_unroller.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 COBALT_MEDIA_FORMATS_MP2T_TIMESTAMP_UNROLLER_H_
-#define COBALT_MEDIA_FORMATS_MP2T_TIMESTAMP_UNROLLER_H_
-
-#include "base/macros.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-class MEDIA_EXPORT TimestampUnroller {
- public:
-  TimestampUnroller();
-  ~TimestampUnroller();
-
-  // Given that |timestamp| is coded using 33 bits (accuracy of MPEG-2 TS
-  // timestamps), GetUnrolledTimestamp returns the corresponding unrolled
-  // timestamp.
-  // The unrolled timestamp is defined by:
-  // |timestamp| + k * (2 ^ 33)
-  // where k is estimated so that the unrolled timestamp is as close as
-  // possible to the previous unrolled timestamp returned by this function
-  // (if this function has not been called before, it will return the timestamp
-  // unmodified).
-  int64_t GetUnrolledTimestamp(int64_t timestamp);
-
-  // Reset the TimestampUnroller to its initial state.
-  void Reset();
-
- private:
-  // Indicate whether the value of |previous_unrolled_timestamp_| is valid.
-  bool is_previous_timestamp_valid_;
-
-  // This is the last output of GetUnrolledTimestamp.
-  int64_t previous_unrolled_timestamp_;
-
-  DISALLOW_COPY_AND_ASSIGN(TimestampUnroller);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_TIMESTAMP_UNROLLER_H_
diff --git a/cobalt/media/formats/mp2t/timestamp_unroller_unittest.cc b/cobalt/media/formats/mp2t/timestamp_unroller_unittest.cc
deleted file mode 100644
index 10e68d5..0000000
--- a/cobalt/media/formats/mp2t/timestamp_unroller_unittest.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 <vector>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/test/perf_test_suite.h"
-#include "cobalt/media/formats/mp2t/timestamp_unroller.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-static std::vector<int64_t> TruncateTimestamps(
-    const std::vector<int64_t>& timestamps) {
-  const int nbits = 33;
-  int64_t truncate_mask = (INT64_C(1) << nbits) - 1;
-  std::vector<int64_t> truncated_timestamps(timestamps.size());
-  for (size_t k = 0; k < timestamps.size(); k++)
-    truncated_timestamps[k] = timestamps[k] & truncate_mask;
-  return truncated_timestamps;
-}
-
-static void RunUnrollTest(const std::vector<int64_t>& timestamps) {
-  std::vector<int64_t> truncated_timestamps = TruncateTimestamps(timestamps);
-
-  TimestampUnroller timestamp_unroller;
-  for (size_t k = 0; k < timestamps.size(); k++) {
-    int64_t unrolled_timestamp =
-        timestamp_unroller.GetUnrolledTimestamp(truncated_timestamps[k]);
-    EXPECT_EQ(timestamps[k], unrolled_timestamp);
-  }
-}
-
-TEST(TimestampUnrollerTest, SingleStream) {
-  // Array of 64 bit timestamps.
-  // This is the expected result from unrolling these timestamps
-  // truncated to 33 bits.
-  int64_t timestamps[] = {
-      INT64_C(0x0000000000000000),
-      INT64_C(-190),                // - 190
-      INT64_C(0x00000000aaaaa9ed),  // + 0xaaaaaaab
-      INT64_C(0x0000000155555498),  // + 0xaaaaaaab
-      INT64_C(0x00000001ffffff43),  // + 0xaaaaaaab
-      INT64_C(0x00000002aaaaa9ee),  // + 0xaaaaaaab
-      INT64_C(0x0000000355555499),  // + 0xaaaaaaab
-      INT64_C(0x00000003ffffff44),  // + 0xaaaaaaab
-  };
-
-  std::vector<int64_t> timestamps_vector(timestamps,
-                                         timestamps + arraysize(timestamps));
-  RunUnrollTest(timestamps_vector);
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/ts_packet.cc b/cobalt/media/formats/mp2t/ts_packet.cc
deleted file mode 100644
index 94bf3b3..0000000
--- a/cobalt/media/formats/mp2t/ts_packet.cc
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp2t/ts_packet.h"
-
-#include <memory>
-
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-static const uint8_t kTsHeaderSyncword = 0x47;
-
-// static
-int TsPacket::Sync(const uint8_t* buf, int size) {
-  int k = 0;
-  for (; k < size; k++) {
-    // Verify that we have 4 syncwords in a row when possible,
-    // this should improve synchronization robustness.
-    // TODO: Consider the case where there is garbage between TS packets.
-    bool is_header = true;
-    for (int i = 0; i < 4; i++) {
-      int idx = k + i * kPacketSize;
-      if (idx >= size) break;
-      if (buf[idx] != kTsHeaderSyncword) {
-        DVLOG(LOG_LEVEL_TS) << "ByteSync" << idx << ": " << std::hex
-                            << static_cast<int>(buf[idx]) << std::dec;
-        is_header = false;
-        break;
-      }
-    }
-    if (is_header) break;
-  }
-
-  DVLOG_IF(1, k != 0) << "SYNC: nbytes_skipped=" << k;
-  return k;
-}
-
-// static
-TsPacket* TsPacket::Parse(const uint8_t* buf, int size) {
-  if (size < kPacketSize) {
-    DVLOG(1) << "Buffer does not hold one full TS packet:"
-             << " buffer_size=" << size;
-    return NULL;
-  }
-
-  DCHECK_EQ(buf[0], kTsHeaderSyncword);
-  if (buf[0] != kTsHeaderSyncword) {
-    DVLOG(1) << "Not on a TS syncword:"
-             << " buf[0]=" << std::hex << static_cast<int>(buf[0]) << std::dec;
-    return NULL;
-  }
-
-  std::unique_ptr<TsPacket> ts_packet(new TsPacket());
-  bool status = ts_packet->ParseHeader(buf);
-  if (!status) {
-    DVLOG(1) << "Parsing header failed";
-    return NULL;
-  }
-  return ts_packet.release();
-}
-
-TsPacket::TsPacket() {}
-
-TsPacket::~TsPacket() {}
-
-bool TsPacket::ParseHeader(const uint8_t* buf) {
-  BitReader bit_reader(buf, kPacketSize);
-  payload_ = buf;
-  payload_size_ = kPacketSize;
-
-  // Read the TS header: 4 bytes.
-  int syncword;
-  int transport_error_indicator;
-  int payload_unit_start_indicator;
-  int transport_priority;
-  int transport_scrambling_control;
-  int adaptation_field_control;
-  RCHECK(bit_reader.ReadBits(8, &syncword));
-  RCHECK(bit_reader.ReadBits(1, &transport_error_indicator));
-  RCHECK(bit_reader.ReadBits(1, &payload_unit_start_indicator));
-  RCHECK(bit_reader.ReadBits(1, &transport_priority));
-  RCHECK(bit_reader.ReadBits(13, &pid_));
-  RCHECK(bit_reader.ReadBits(2, &transport_scrambling_control));
-  RCHECK(bit_reader.ReadBits(2, &adaptation_field_control));
-  RCHECK(bit_reader.ReadBits(4, &continuity_counter_));
-  payload_unit_start_indicator_ = (payload_unit_start_indicator != 0);
-  payload_ += 4;
-  payload_size_ -= 4;
-
-  // Default values when no adaptation field.
-  discontinuity_indicator_ = false;
-  random_access_indicator_ = false;
-
-  // Done since no adaptation field.
-  if ((adaptation_field_control & 0x2) == 0) return true;
-
-  // Read the adaptation field if needed.
-  int adaptation_field_length;
-  RCHECK(bit_reader.ReadBits(8, &adaptation_field_length));
-  DVLOG(LOG_LEVEL_TS) << "adaptation_field_length=" << adaptation_field_length;
-  payload_ += 1;
-  payload_size_ -= 1;
-  if ((adaptation_field_control & 0x1) == 0 && adaptation_field_length != 183) {
-    DVLOG(1) << "adaptation_field_length=" << adaptation_field_length;
-    return false;
-  }
-  if ((adaptation_field_control & 0x1) == 1 && adaptation_field_length > 182) {
-    DVLOG(1) << "adaptation_field_length=" << adaptation_field_length;
-    // This is not allowed by the spec.
-    // However, some badly encoded streams are using
-    // adaptation_field_length = 183
-    return false;
-  }
-
-  // adaptation_field_length = '0' is used to insert a single stuffing byte
-  // in the adaptation field of a transport stream packet.
-  if (adaptation_field_length == 0) return true;
-
-  bool status = ParseAdaptationField(&bit_reader, adaptation_field_length);
-  payload_ += adaptation_field_length;
-  payload_size_ -= adaptation_field_length;
-  return status;
-}
-
-bool TsPacket::ParseAdaptationField(BitReader* bit_reader,
-                                    int adaptation_field_length) {
-  DCHECK_GT(adaptation_field_length, 0);
-  int adaptation_field_start_marker = bit_reader->bits_available() / 8;
-
-  int discontinuity_indicator;
-  int random_access_indicator;
-  int elementary_stream_priority_indicator;
-  int pcr_flag;
-  int opcr_flag;
-  int splicing_point_flag;
-  int transport_private_data_flag;
-  int adaptation_field_extension_flag;
-  RCHECK(bit_reader->ReadBits(1, &discontinuity_indicator));
-  RCHECK(bit_reader->ReadBits(1, &random_access_indicator));
-  RCHECK(bit_reader->ReadBits(1, &elementary_stream_priority_indicator));
-  RCHECK(bit_reader->ReadBits(1, &pcr_flag));
-  RCHECK(bit_reader->ReadBits(1, &opcr_flag));
-  RCHECK(bit_reader->ReadBits(1, &splicing_point_flag));
-  RCHECK(bit_reader->ReadBits(1, &transport_private_data_flag));
-  RCHECK(bit_reader->ReadBits(1, &adaptation_field_extension_flag));
-  discontinuity_indicator_ = (discontinuity_indicator != 0);
-  random_access_indicator_ = (random_access_indicator != 0);
-
-  if (pcr_flag) {
-    int64_t program_clock_reference_base;
-    int reserved;
-    int program_clock_reference_extension;
-    RCHECK(bit_reader->ReadBits(33, &program_clock_reference_base));
-    RCHECK(bit_reader->ReadBits(6, &reserved));
-    RCHECK(bit_reader->ReadBits(9, &program_clock_reference_extension));
-  }
-
-  if (opcr_flag) {
-    int64_t original_program_clock_reference_base;
-    int reserved;
-    int original_program_clock_reference_extension;
-    RCHECK(bit_reader->ReadBits(33, &original_program_clock_reference_base));
-    RCHECK(bit_reader->ReadBits(6, &reserved));
-    RCHECK(
-        bit_reader->ReadBits(9, &original_program_clock_reference_extension));
-  }
-
-  if (splicing_point_flag) {
-    int splice_countdown;
-    RCHECK(bit_reader->ReadBits(8, &splice_countdown));
-  }
-
-  if (transport_private_data_flag) {
-    int transport_private_data_length;
-    RCHECK(bit_reader->ReadBits(8, &transport_private_data_length));
-    RCHECK(bit_reader->SkipBits(8 * transport_private_data_length));
-  }
-
-  if (adaptation_field_extension_flag) {
-    int adaptation_field_extension_length;
-    RCHECK(bit_reader->ReadBits(8, &adaptation_field_extension_length));
-    RCHECK(bit_reader->SkipBits(8 * adaptation_field_extension_length));
-  }
-
-  // The rest of the adaptation field should be stuffing bytes.
-  int adaptation_field_remaining_size =
-      adaptation_field_length -
-      (adaptation_field_start_marker - bit_reader->bits_available() / 8);
-  RCHECK(adaptation_field_remaining_size >= 0);
-  for (int k = 0; k < adaptation_field_remaining_size; k++) {
-    int stuffing_byte;
-    RCHECK(bit_reader->ReadBits(8, &stuffing_byte));
-    // Unfortunately, a lot of streams exist in the field that do not fill
-    // the remaining of the adaptation field with the expected stuffing value:
-    // do not fail if that's the case.
-    DVLOG_IF(1, stuffing_byte != 0xff)
-        << "Stream not compliant: invalid stuffing byte " << std::hex
-        << stuffing_byte;
-  }
-
-  DVLOG(LOG_LEVEL_TS) << "random_access_indicator=" << random_access_indicator_;
-  return true;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/ts_packet.h b/cobalt/media/formats/mp2t/ts_packet.h
deleted file mode 100644
index 399f8f7..0000000
--- a/cobalt/media/formats/mp2t/ts_packet.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FORMATS_MP2T_TS_PACKET_H_
-#define COBALT_MEDIA_FORMATS_MP2T_TS_PACKET_H_
-
-#include "base/macros.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class BitReader;
-
-namespace mp2t {
-
-class TsPacket {
- public:
-  static const int kPacketSize = 188;
-
-  // Return the number of bytes to discard
-  // to be synchronized on a TS syncword.
-  static int Sync(const uint8_t* buf, int size);
-
-  // Parse a TS packet.
-  // Return a TsPacket only when parsing was successful.
-  // Return NULL otherwise.
-  static TsPacket* Parse(const uint8_t* buf, int size);
-
-  ~TsPacket();
-
-  // TS header accessors.
-  bool payload_unit_start_indicator() const {
-    return payload_unit_start_indicator_;
-  }
-  int pid() const { return pid_; }
-  int continuity_counter() const { return continuity_counter_; }
-  bool discontinuity_indicator() const { return discontinuity_indicator_; }
-  bool random_access_indicator() const { return random_access_indicator_; }
-
-  // Return the offset and the size of the payload.
-  const uint8_t* payload() const { return payload_; }
-  int payload_size() const { return payload_size_; }
-
- private:
-  TsPacket();
-
-  // Parse an Mpeg2 TS header.
-  // The buffer size should be at least |kPacketSize|
-  bool ParseHeader(const uint8_t* buf);
-  bool ParseAdaptationField(BitReader* bit_reader, int adaptation_field_length);
-
-  // Size of the payload.
-  const uint8_t* payload_;
-  int payload_size_;
-
-  // TS header.
-  bool payload_unit_start_indicator_;
-  int pid_;
-  int continuity_counter_;
-
-  // Params from the adaptation field.
-  bool discontinuity_indicator_;
-  bool random_access_indicator_;
-
-  DISALLOW_COPY_AND_ASSIGN(TsPacket);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_TS_PACKET_H_
diff --git a/cobalt/media/formats/mp2t/ts_section.h b/cobalt/media/formats/mp2t/ts_section.h
deleted file mode 100644
index bd40893..0000000
--- a/cobalt/media/formats/mp2t/ts_section.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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_H_
-#define COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_H_
-
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-class TsSection {
- public:
-  // From ISO/IEC 13818-1 or ITU H.222 spec: Table 2-3 - PID table.
-  enum SpecialPid {
-    kPidPat = 0x0,
-    kPidCat = 0x1,
-    kPidTsdt = 0x2,
-    kPidNullPacket = 0x1fff,
-    kPidMax = 0x1fff,
-  };
-
-  virtual ~TsSection() {}
-
-  // Parse the data bytes of the TS packet.
-  // Return true if parsing is successful.
-  virtual bool Parse(bool payload_unit_start_indicator, const uint8_t* buf,
-                     int size) = 0;
-
-  // Process bytes that have not been processed yet (pending buffers in the
-  // pipe). Flush might thus results in frame emission, as an example.
-  virtual void Flush() = 0;
-
-  // Reset the state of the parser to its initial state.
-  virtual void Reset() = 0;
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_H_
diff --git a/cobalt/media/formats/mp2t/ts_section_pat.cc b/cobalt/media/formats/mp2t/ts_section_pat.cc
deleted file mode 100644
index 1aa3449..0000000
--- a/cobalt/media/formats/mp2t/ts_section_pat.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp2t/ts_section_pat.h"
-
-#include <vector>
-
-#include "base/logging.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-TsSectionPat::TsSectionPat(const RegisterPmtCb& register_pmt_cb)
-    : register_pmt_cb_(register_pmt_cb), version_number_(-1) {}
-
-TsSectionPat::~TsSectionPat() {}
-
-bool TsSectionPat::ParsePsiSection(BitReader* bit_reader) {
-  // Read the fixed section length.
-  int table_id;
-  int section_syntax_indicator;
-  int dummy_zero;
-  int reserved;
-  int section_length;
-  int transport_stream_id;
-  int version_number;
-  int current_next_indicator;
-  int section_number;
-  int last_section_number;
-  RCHECK(bit_reader->ReadBits(8, &table_id));
-  RCHECK(bit_reader->ReadBits(1, &section_syntax_indicator));
-  RCHECK(bit_reader->ReadBits(1, &dummy_zero));
-  RCHECK(bit_reader->ReadBits(2, &reserved));
-  RCHECK(bit_reader->ReadBits(12, &section_length));
-  RCHECK(section_length >= 5);
-  RCHECK(section_length <= 1021);
-  RCHECK(bit_reader->ReadBits(16, &transport_stream_id));
-  RCHECK(bit_reader->ReadBits(2, &reserved));
-  RCHECK(bit_reader->ReadBits(5, &version_number));
-  RCHECK(bit_reader->ReadBits(1, &current_next_indicator));
-  RCHECK(bit_reader->ReadBits(8, &section_number));
-  RCHECK(bit_reader->ReadBits(8, &last_section_number));
-  section_length -= 5;
-
-  // Perform a few verifications:
-  // - Table ID should be 0 for a PAT.
-  // - section_syntax_indicator should be one.
-  // - section length should not exceed 1021
-  RCHECK(table_id == 0x0);
-  RCHECK(section_syntax_indicator);
-  RCHECK(!dummy_zero);
-
-  // Both the program table and the CRC have a size multiple of 4.
-  // Note for pmt_pid_count: minus 4 to account for the CRC.
-  RCHECK((section_length % 4) == 0);
-  int pmt_pid_count = (section_length - 4) / 4;
-
-  // Read the variable length section: program table & crc.
-  std::vector<int> program_number_array(pmt_pid_count);
-  std::vector<int> pmt_pid_array(pmt_pid_count);
-  for (int k = 0; k < pmt_pid_count; k++) {
-    int reserved;
-    RCHECK(bit_reader->ReadBits(16, &program_number_array[k]));
-    RCHECK(bit_reader->ReadBits(3, &reserved));
-    RCHECK(bit_reader->ReadBits(13, &pmt_pid_array[k]));
-  }
-  int crc32;
-  RCHECK(bit_reader->ReadBits(32, &crc32));
-
-  // Just ignore the PAT if not applicable yet.
-  if (!current_next_indicator) {
-    DVLOG(1) << "Not supported: received a PAT not applicable yet";
-    return true;
-  }
-
-  // Ignore the program table if it hasn't changed.
-  if (version_number == version_number_) return true;
-
-  // Both the MSE and the HLS spec specifies that TS streams should convey
-  // exactly one program.
-  if (pmt_pid_count > 1) {
-    DVLOG(1) << "Multiple programs detected in the Mpeg2 TS stream";
-    return false;
-  }
-
-// Can now register the PMT.
-#if !defined(NDEBUG)
-  int expected_version_number = version_number;
-  if (version_number_ >= 0)
-    expected_version_number = (version_number_ + 1) % 32;
-  DVLOG_IF(1, version_number != expected_version_number)
-      << "Unexpected version number: " << version_number << " vs "
-      << version_number_;
-#endif
-  for (int k = 0; k < pmt_pid_count; k++) {
-    if (program_number_array[k] != 0) {
-      // Program numbers different from 0 correspond to PMT.
-      register_pmt_cb_.Run(program_number_array[k], pmt_pid_array[k]);
-      // Even if there are multiple programs, only one can be supported now.
-      // HLS: "Transport Stream segments MUST contain a single MPEG-2 Program."
-      break;
-    }
-  }
-  version_number_ = version_number;
-
-  return true;
-}
-
-void TsSectionPat::ResetPsiSection() { version_number_ = -1; }
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/ts_section_pat.h b/cobalt/media/formats/mp2t/ts_section_pat.h
deleted file mode 100644
index 64cca26..0000000
--- a/cobalt/media/formats/mp2t/ts_section_pat.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 COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PAT_H_
-#define COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PAT_H_
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "cobalt/media/formats/mp2t/ts_section_psi.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-class TsSectionPat : public TsSectionPsi {
- public:
-  // RegisterPmtCb::Run(int program_number, int pmt_pid);
-  typedef base::Callback<void(int, int)> RegisterPmtCb;
-
-  explicit TsSectionPat(const RegisterPmtCb& register_pmt_cb);
-  ~TsSectionPat() override;
-
-  // TsSectionPsi implementation.
-  bool ParsePsiSection(BitReader* bit_reader) override;
-  void ResetPsiSection() override;
-
- private:
-  RegisterPmtCb register_pmt_cb_;
-
-  // Parameters from the PAT.
-  int version_number_;
-
-  DISALLOW_COPY_AND_ASSIGN(TsSectionPat);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PAT_H_
diff --git a/cobalt/media/formats/mp2t/ts_section_pes.cc b/cobalt/media/formats/mp2t/ts_section_pes.cc
deleted file mode 100644
index a381a3b..0000000
--- a/cobalt/media/formats/mp2t/ts_section_pes.cc
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp2t/ts_section_pes.h"
-
-#include <memory>
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/mp2t/es_parser.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-#include "cobalt/media/formats/mp2t/timestamp_unroller.h"
-
-static const int kPesStartCode = 0x000001;
-
-static bool IsTimestampSectionValid(int64_t timestamp_section) {
-  // |pts_section| has 40 bits:
-  // - starting with either '0010' or '0011' or '0001'
-  // - and ending with a marker bit.
-  // See ITU H.222 standard - PES section.
-
-  // Verify that all the marker bits are set to one.
-  return ((timestamp_section & 0x1) != 0) &&
-         ((timestamp_section & 0x10000) != 0) &&
-         ((timestamp_section & 0x100000000) != 0);
-}
-
-static int64_t ConvertTimestampSectionToTimestamp(int64_t timestamp_section) {
-  return (((timestamp_section >> 33) & 0x7) << 30) |
-         (((timestamp_section >> 17) & 0x7fff) << 15) |
-         (((timestamp_section >> 1) & 0x7fff) << 0);
-}
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-TsSectionPes::TsSectionPes(std::unique_ptr<EsParser> es_parser,
-                           TimestampUnroller* timestamp_unroller)
-    : es_parser_(es_parser.release()),
-      wait_for_pusi_(true),
-      timestamp_unroller_(timestamp_unroller) {
-  DCHECK(es_parser_);
-  DCHECK(timestamp_unroller_);
-}
-
-TsSectionPes::~TsSectionPes() {}
-
-bool TsSectionPes::Parse(bool payload_unit_start_indicator, const uint8_t* buf,
-                         int size) {
-  // Ignore partial PES.
-  if (wait_for_pusi_ && !payload_unit_start_indicator) return true;
-
-  bool parse_result = true;
-  if (payload_unit_start_indicator) {
-    // Try emitting a packet since we might have a pending PES packet
-    // with an undefined size.
-    // In this case, a unit is emitted when the next unit is coming.
-    int raw_pes_size;
-    const uint8_t* raw_pes;
-    pes_byte_queue_.Peek(&raw_pes, &raw_pes_size);
-    if (raw_pes_size > 0) parse_result = Emit(true);
-
-    // Reset the state.
-    ResetPesState();
-
-    // Update the state.
-    wait_for_pusi_ = false;
-  }
-
-  // Add the data to the parser state.
-  if (size > 0) pes_byte_queue_.Push(buf, size);
-
-  // Try emitting the current PES packet.
-  return (parse_result && Emit(false));
-}
-
-void TsSectionPes::Flush() {
-  // Try emitting a packet since we might have a pending PES packet
-  // with an undefined size.
-  Emit(true);
-
-  // Flush the underlying ES parser.
-  es_parser_->Flush();
-}
-
-void TsSectionPes::Reset() {
-  ResetPesState();
-  es_parser_->Reset();
-}
-
-bool TsSectionPes::Emit(bool emit_for_unknown_size) {
-  int raw_pes_size;
-  const uint8_t* raw_pes;
-  pes_byte_queue_.Peek(&raw_pes, &raw_pes_size);
-
-  // A PES should be at least 6 bytes.
-  // Wait for more data to come if not enough bytes.
-  if (raw_pes_size < 6) return true;
-
-  // Check whether we have enough data to start parsing.
-  int pes_packet_length =
-      (static_cast<int>(raw_pes[4]) << 8) | (static_cast<int>(raw_pes[5]));
-  if ((pes_packet_length == 0 && !emit_for_unknown_size) ||
-      (pes_packet_length != 0 && raw_pes_size < pes_packet_length + 6)) {
-    // Wait for more data to come either because:
-    // - there are not enough bytes,
-    // - or the PES size is unknown and the "force emit" flag is not set.
-    //   (PES size might be unknown for video PES packet).
-    return true;
-  }
-  DVLOG(LOG_LEVEL_PES) << "pes_packet_length=" << pes_packet_length;
-
-  // Parse the packet.
-  bool parse_result = ParseInternal(raw_pes, raw_pes_size);
-
-  // Reset the state.
-  ResetPesState();
-
-  return parse_result;
-}
-
-bool TsSectionPes::ParseInternal(const uint8_t* raw_pes, int raw_pes_size) {
-  BitReader bit_reader(raw_pes, raw_pes_size);
-
-  // Read up to the pes_packet_length (6 bytes).
-  int packet_start_code_prefix;
-  int stream_id;
-  int pes_packet_length;
-  RCHECK(bit_reader.ReadBits(24, &packet_start_code_prefix));
-  RCHECK(bit_reader.ReadBits(8, &stream_id));
-  RCHECK(bit_reader.ReadBits(16, &pes_packet_length));
-
-  RCHECK(packet_start_code_prefix == kPesStartCode);
-  DVLOG(LOG_LEVEL_PES) << "stream_id=" << std::hex << stream_id << std::dec;
-  if (pes_packet_length == 0)
-    pes_packet_length = bit_reader.bits_available() / 8;
-
-  // Ignore the PES for unknown stream IDs.
-  // See ITU H.222 Table 2-22 "Stream_id assignments"
-  bool is_audio_stream_id = ((stream_id & 0xe0) == 0xc0);
-  bool is_video_stream_id = ((stream_id & 0xf0) == 0xe0);
-  // According to ETSI DVB standard (ETSI TS 101 154) section 4.1.6.1
-  // AC-3 and DTS audio streams may have stream_id 0xbd. These streams
-  // have the same syntax as regular audio streams.
-  bool is_private_stream_1 = (stream_id == 0xbd);
-  if (!is_audio_stream_id && !is_video_stream_id && !is_private_stream_1) {
-    DVLOG(LOG_LEVEL_PES) << "Dropped TsPacket for stream_id=0x" << std::hex
-                         << stream_id << std::dec;
-    return true;
-  }
-
-  // Read up to "pes_header_data_length".
-  int dummy_2;
-  int PES_scrambling_control;
-  int PES_priority;
-  int data_alignment_indicator;
-  int copyright;
-  int original_or_copy;
-  int pts_dts_flags;
-  int escr_flag;
-  int es_rate_flag;
-  int dsm_trick_mode_flag;
-  int additional_copy_info_flag;
-  int pes_crc_flag;
-  int pes_extension_flag;
-  int pes_header_data_length;
-  RCHECK(bit_reader.ReadBits(2, &dummy_2));
-  RCHECK(dummy_2 == 0x2);
-  RCHECK(bit_reader.ReadBits(2, &PES_scrambling_control));
-  RCHECK(bit_reader.ReadBits(1, &PES_priority));
-  RCHECK(bit_reader.ReadBits(1, &data_alignment_indicator));
-  RCHECK(bit_reader.ReadBits(1, &copyright));
-  RCHECK(bit_reader.ReadBits(1, &original_or_copy));
-  RCHECK(bit_reader.ReadBits(2, &pts_dts_flags));
-  RCHECK(bit_reader.ReadBits(1, &escr_flag));
-  RCHECK(bit_reader.ReadBits(1, &es_rate_flag));
-  RCHECK(bit_reader.ReadBits(1, &dsm_trick_mode_flag));
-  RCHECK(bit_reader.ReadBits(1, &additional_copy_info_flag));
-  RCHECK(bit_reader.ReadBits(1, &pes_crc_flag));
-  RCHECK(bit_reader.ReadBits(1, &pes_extension_flag));
-  RCHECK(bit_reader.ReadBits(8, &pes_header_data_length));
-  int pes_header_start_size = bit_reader.bits_available() / 8;
-
-  // Compute the size and the offset of the ES payload.
-  // "6" for the 6 bytes read before and including |pes_packet_length|.
-  // "3" for the 3 bytes read before and including |pes_header_data_length|.
-  int es_size = pes_packet_length - 3 - pes_header_data_length;
-  int es_offset = 6 + 3 + pes_header_data_length;
-  RCHECK(es_size >= 0);
-  RCHECK(es_offset + es_size <= raw_pes_size);
-
-  // Read the timing information section.
-  bool is_pts_valid = false;
-  bool is_dts_valid = false;
-  int64_t pts_section = 0;
-  int64_t dts_section = 0;
-  if (pts_dts_flags == 0x2) {
-    RCHECK(bit_reader.ReadBits(40, &pts_section));
-    RCHECK((((pts_section >> 36) & 0xf) == 0x2) &&
-           IsTimestampSectionValid(pts_section));
-    is_pts_valid = true;
-  }
-  if (pts_dts_flags == 0x3) {
-    RCHECK(bit_reader.ReadBits(40, &pts_section));
-    RCHECK(bit_reader.ReadBits(40, &dts_section));
-    RCHECK((((pts_section >> 36) & 0xf) == 0x3) &&
-           IsTimestampSectionValid(pts_section));
-    RCHECK((((dts_section >> 36) & 0xf) == 0x1) &&
-           IsTimestampSectionValid(dts_section));
-    is_pts_valid = true;
-    is_dts_valid = true;
-  }
-
-  // Convert and unroll the timestamps.
-  base::TimeDelta media_pts(kNoTimestamp);
-  DecodeTimestamp media_dts(kNoDecodeTimestamp());
-  if (is_pts_valid) {
-    int64_t pts = timestamp_unroller_->GetUnrolledTimestamp(
-        ConvertTimestampSectionToTimestamp(pts_section));
-    media_pts = base::TimeDelta::FromMicroseconds((1000 * pts) / 90);
-  }
-  if (is_dts_valid) {
-    int64_t dts = timestamp_unroller_->GetUnrolledTimestamp(
-        ConvertTimestampSectionToTimestamp(dts_section));
-    media_dts = DecodeTimestamp::FromMicroseconds((1000 * dts) / 90);
-  }
-
-  // Discard the rest of the PES packet header.
-  // TODO(damienv): check if some info of the PES packet header are useful.
-  DCHECK_EQ(bit_reader.bits_available() % 8, 0);
-  int pes_header_remaining_size =
-      pes_header_data_length -
-      (pes_header_start_size - bit_reader.bits_available() / 8);
-  RCHECK(pes_header_remaining_size >= 0);
-
-  // Read the PES packet.
-  DVLOG(LOG_LEVEL_PES) << "Emit a reassembled PES:"
-                       << " size=" << es_size
-                       << " pts=" << media_pts.InMilliseconds()
-                       << " dts=" << media_dts.InMilliseconds()
-                       << " data_alignment_indicator="
-                       << data_alignment_indicator;
-  return es_parser_->Parse(&raw_pes[es_offset], es_size, media_pts, media_dts);
-}
-
-void TsSectionPes::ResetPesState() {
-  pes_byte_queue_.Reset();
-  wait_for_pusi_ = true;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/ts_section_pes.h b/cobalt/media/formats/mp2t/ts_section_pes.h
deleted file mode 100644
index 675d774..0000000
--- a/cobalt/media/formats/mp2t/ts_section_pes.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PES_H_
-#define COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PES_H_
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "cobalt/media/base/byte_queue.h"
-#include "cobalt/media/formats/mp2t/ts_section.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-class EsParser;
-class TimestampUnroller;
-
-class TsSectionPes : public TsSection {
- public:
-  TsSectionPes(std::unique_ptr<EsParser> es_parser,
-               TimestampUnroller* timestamp_unroller);
-  ~TsSectionPes() override;
-
-  // TsSection implementation.
-  bool Parse(bool payload_unit_start_indicator, const uint8_t* buf,
-             int size) override;
-  void Flush() override;
-  void Reset() override;
-
- private:
-  // Emit a reassembled PES packet.
-  // Return true if successful.
-  // |emit_for_unknown_size| is used to force emission for PES packets
-  // whose size is unknown.
-  bool Emit(bool emit_for_unknown_size);
-
-  // Parse a PES packet, return true if successful.
-  bool ParseInternal(const uint8_t* raw_pes, int raw_pes_size);
-
-  void ResetPesState();
-
-  // Bytes of the current PES.
-  ByteQueue pes_byte_queue_;
-
-  // ES parser.
-  std::unique_ptr<EsParser> es_parser_;
-
-  // Do not start parsing before getting a unit start indicator.
-  bool wait_for_pusi_;
-
-  // Used to unroll PTS and DTS.
-  TimestampUnroller* const timestamp_unroller_;
-
-  DISALLOW_COPY_AND_ASSIGN(TsSectionPes);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PES_H_
diff --git a/cobalt/media/formats/mp2t/ts_section_pmt.cc b/cobalt/media/formats/mp2t/ts_section_pmt.cc
deleted file mode 100644
index 071b7a6..0000000
--- a/cobalt/media/formats/mp2t/ts_section_pmt.cc
+++ /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.
-
-#include "cobalt/media/formats/mp2t/ts_section_pmt.h"
-
-#include <map>
-#include <utility>
-
-#include "base/logging.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-TsSectionPmt::TsSectionPmt(const RegisterPesCb& register_pes_cb)
-    : register_pes_cb_(register_pes_cb) {}
-
-TsSectionPmt::~TsSectionPmt() {}
-
-bool TsSectionPmt::ParsePsiSection(BitReader* bit_reader) {
-  // Read up to |last_section_number|.
-  int table_id;
-  int section_syntax_indicator;
-  int dummy_zero;
-  int reserved;
-  int section_length;
-  int program_number;
-  int version_number;
-  int current_next_indicator;
-  int section_number;
-  int last_section_number;
-  RCHECK(bit_reader->ReadBits(8, &table_id));
-  RCHECK(bit_reader->ReadBits(1, &section_syntax_indicator));
-  RCHECK(bit_reader->ReadBits(1, &dummy_zero));
-  RCHECK(bit_reader->ReadBits(2, &reserved));
-  RCHECK(bit_reader->ReadBits(12, &section_length));
-  int section_start_marker = bit_reader->bits_available() / 8;
-
-  RCHECK(bit_reader->ReadBits(16, &program_number));
-  RCHECK(bit_reader->ReadBits(2, &reserved));
-  RCHECK(bit_reader->ReadBits(5, &version_number));
-  RCHECK(bit_reader->ReadBits(1, &current_next_indicator));
-  RCHECK(bit_reader->ReadBits(8, &section_number));
-  RCHECK(bit_reader->ReadBits(8, &last_section_number));
-
-  // Perform a few verifications:
-  // - table ID should be 2 for a PMT.
-  // - section_syntax_indicator should be one.
-  // - section length should not exceed 1021.
-  RCHECK(table_id == 0x2);
-  RCHECK(section_syntax_indicator);
-  RCHECK(!dummy_zero);
-  RCHECK(section_length <= 1021);
-  RCHECK(section_number == 0);
-  RCHECK(last_section_number == 0);
-
-  // TODO(damienv):
-  // Verify that there is no mismatch between the program number
-  // and the program number that was provided in a PAT for the current PMT.
-
-  // Read the end of the fixed length section.
-  int pcr_pid;
-  int program_info_length;
-  RCHECK(bit_reader->ReadBits(3, &reserved));
-  RCHECK(bit_reader->ReadBits(13, &pcr_pid));
-  RCHECK(bit_reader->ReadBits(4, &reserved));
-  RCHECK(bit_reader->ReadBits(12, &program_info_length));
-  RCHECK(program_info_length < 1024);
-
-  // Read the program info descriptor.
-  // TODO(damienv): check whether any of the descriptors could be useful.
-  // Defined in section 2.6 of ISO-13818.
-  RCHECK(bit_reader->SkipBits(8 * program_info_length));
-
-  // Read the ES description table.
-  // The end of the PID map if 4 bytes away from the end of the section
-  // (4 bytes = size of the CRC).
-  int pid_map_end_marker = section_start_marker - section_length + 4;
-  std::map<int, int> pid_map;
-  while (bit_reader->bits_available() > 8 * pid_map_end_marker) {
-    int stream_type;
-    int reserved;
-    int pid_es;
-    int es_info_length;
-    RCHECK(bit_reader->ReadBits(8, &stream_type));
-    RCHECK(bit_reader->ReadBits(3, &reserved));
-    RCHECK(bit_reader->ReadBits(13, &pid_es));
-    RCHECK(bit_reader->ReadBits(4, &reserved));
-    RCHECK(bit_reader->ReadBits(12, &es_info_length));
-
-    // Do not register the PID right away.
-    // Wait for the end of the section to be fully parsed
-    // to make sure there is no error.
-    pid_map.insert(std::pair<int, int>(pid_es, stream_type));
-
-    // Read the ES info descriptors.
-    // TODO(damienv): check whether any of the descriptors could be useful.
-    // Defined in section 2.6 of ISO-13818.
-    RCHECK(bit_reader->SkipBits(8 * es_info_length));
-  }
-
-  // Read the CRC.
-  int crc32;
-  RCHECK(bit_reader->ReadBits(32, &crc32));
-
-  // Once the PMT has been proved to be correct, register the PIDs.
-  for (std::map<int, int>::iterator it = pid_map.begin(); it != pid_map.end();
-       ++it)
-    register_pes_cb_.Run(it->first, it->second);
-
-  return true;
-}
-
-void TsSectionPmt::ResetPsiSection() {}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/ts_section_pmt.h b/cobalt/media/formats/mp2t/ts_section_pmt.h
deleted file mode 100644
index 5362da5..0000000
--- a/cobalt/media/formats/mp2t/ts_section_pmt.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 COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PMT_H_
-#define COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PMT_H_
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "cobalt/media/formats/mp2t/ts_section_psi.h"
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-class TsSectionPmt : public TsSectionPsi {
- public:
-  // RegisterPesCb::Run(int pes_pid, int stream_type);
-  // Stream type is defined in
-  // "Table 2-34 – Stream type assignments" in H.222
-  // TODO(damienv): add the program number.
-  typedef base::Callback<void(int, int)> RegisterPesCb;
-
-  explicit TsSectionPmt(const RegisterPesCb& register_pes_cb);
-  ~TsSectionPmt() override;
-
-  // Mpeg2TsPsiParser implementation.
-  bool ParsePsiSection(BitReader* bit_reader) override;
-  void ResetPsiSection() override;
-
- private:
-  RegisterPesCb register_pes_cb_;
-
-  DISALLOW_COPY_AND_ASSIGN(TsSectionPmt);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PMT_H_
diff --git a/cobalt/media/formats/mp2t/ts_section_psi.cc b/cobalt/media/formats/mp2t/ts_section_psi.cc
deleted file mode 100644
index 0f809ae..0000000
--- a/cobalt/media/formats/mp2t/ts_section_psi.cc
+++ /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.
-
-#include "cobalt/media/formats/mp2t/ts_section_psi.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/formats/mp2t/mp2t_common.h"
-
-static bool IsCrcValid(const uint8_t* buf, int size) {
-  uint32_t crc = 0xffffffffu;
-  const uint32_t kCrcPoly = 0x4c11db7;
-
-  for (int k = 0; k < size; k++) {
-    int nbits = 8;
-    uint32_t data_msb_aligned = buf[k];
-    data_msb_aligned <<= (32 - nbits);
-
-    while (nbits > 0) {
-      if ((data_msb_aligned ^ crc) & 0x80000000) {
-        crc <<= 1;
-        crc ^= kCrcPoly;
-      } else {
-        crc <<= 1;
-      }
-
-      data_msb_aligned <<= 1;
-      nbits--;
-    }
-  }
-
-  return (crc == 0);
-}
-
-namespace cobalt {
-namespace media {
-namespace mp2t {
-
-TsSectionPsi::TsSectionPsi()
-    : wait_for_pusi_(true), leading_bytes_to_discard_(0) {}
-
-TsSectionPsi::~TsSectionPsi() {}
-
-bool TsSectionPsi::Parse(bool payload_unit_start_indicator, const uint8_t* buf,
-                         int size) {
-  // Ignore partial PSI.
-  if (wait_for_pusi_ && !payload_unit_start_indicator) return true;
-
-  if (payload_unit_start_indicator) {
-    // Reset the state of the PSI section.
-    ResetPsiState();
-
-    // Update the state.
-    wait_for_pusi_ = false;
-    DCHECK_GE(size, 1);
-    int pointer_field = buf[0];
-    leading_bytes_to_discard_ = pointer_field;
-    buf++;
-    size--;
-  }
-
-  // Discard some leading bytes if needed.
-  if (leading_bytes_to_discard_ > 0) {
-    int nbytes_to_discard = std::min(leading_bytes_to_discard_, size);
-    buf += nbytes_to_discard;
-    size -= nbytes_to_discard;
-    leading_bytes_to_discard_ -= nbytes_to_discard;
-  }
-  if (size == 0) return true;
-
-  // Add the data to the parser state.
-  psi_byte_queue_.Push(buf, size);
-  int raw_psi_size;
-  const uint8_t* raw_psi;
-  psi_byte_queue_.Peek(&raw_psi, &raw_psi_size);
-
-  // Check whether we have enough data to start parsing.
-  if (raw_psi_size < 3) return true;
-  int section_length =
-      ((static_cast<int>(raw_psi[1]) << 8) | (static_cast<int>(raw_psi[2]))) &
-      0xfff;
-  if (section_length >= 1021) return false;
-  int psi_length = section_length + 3;
-  if (raw_psi_size < psi_length) {
-    // Don't throw an error when there is not enough data,
-    // just wait for more data to come.
-    return true;
-  }
-
-  // There should not be any trailing bytes after a PMT.
-  // Instead, the pointer field should be used to stuff bytes.
-  DVLOG_IF(1, raw_psi_size > psi_length)
-      << "Trailing bytes after a PSI section: " << psi_length << " vs "
-      << raw_psi_size;
-
-  // Verify the CRC.
-  RCHECK(IsCrcValid(raw_psi, psi_length));
-
-  // Parse the PSI section.
-  BitReader bit_reader(raw_psi, raw_psi_size);
-  bool status = ParsePsiSection(&bit_reader);
-  if (status) ResetPsiState();
-
-  return status;
-}
-
-void TsSectionPsi::Flush() {}
-
-void TsSectionPsi::Reset() {
-  ResetPsiSection();
-  ResetPsiState();
-}
-
-void TsSectionPsi::ResetPsiState() {
-  wait_for_pusi_ = true;
-  psi_byte_queue_.Reset();
-  leading_bytes_to_discard_ = 0;
-}
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp2t/ts_section_psi.h b/cobalt/media/formats/mp2t/ts_section_psi.h
deleted file mode 100644
index b840dd2..0000000
--- a/cobalt/media/formats/mp2t/ts_section_psi.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 COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PSI_H_
-#define COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PSI_H_
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "cobalt/media/base/byte_queue.h"
-#include "cobalt/media/formats/mp2t/ts_section.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class BitReader;
-
-namespace mp2t {
-
-class TsSectionPsi : public TsSection {
- public:
-  TsSectionPsi();
-  ~TsSectionPsi() override;
-
-  // TsSection implementation.
-  bool Parse(bool payload_unit_start_indicator, const uint8_t* buf,
-             int size) override;
-  void Flush() override;
-  void Reset() override;
-
-  // Parse the content of the PSI section.
-  virtual bool ParsePsiSection(BitReader* bit_reader) = 0;
-
-  // Reset the state of the PSI section.
-  virtual void ResetPsiSection() = 0;
-
- private:
-  void ResetPsiState();
-
-  // Bytes of the current PSI.
-  ByteQueue psi_byte_queue_;
-
-  // Do not start parsing before getting a unit start indicator.
-  bool wait_for_pusi_;
-
-  // Number of leading bytes to discard (pointer field).
-  int leading_bytes_to_discard_;
-
-  DISALLOW_COPY_AND_ASSIGN(TsSectionPsi);
-};
-
-}  // namespace mp2t
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP2T_TS_SECTION_PSI_H_
diff --git a/cobalt/media/formats/mp4/aac.cc b/cobalt/media/formats/mp4/aac.cc
deleted file mode 100644
index 590ddb4..0000000
--- a/cobalt/media/formats/mp4/aac.cc
+++ /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.
-
-#include "cobalt/media/formats/mp4/aac.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/formats/mp4/rcheck.h"
-#include "cobalt/media/formats/mpeg/adts_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-AAC::AAC()
-    : profile_(0),
-      frequency_index_(0),
-      channel_config_(0),
-      frequency_(0),
-      extension_frequency_(0),
-      channel_layout_(CHANNEL_LAYOUT_UNSUPPORTED) {}
-
-AAC::AAC(const AAC& other) { *this = other; }
-
-AAC::~AAC() {}
-
-bool AAC::Parse(const std::vector<uint8_t>& data,
-                const scoped_refptr<MediaLog>& media_log) {
-  codec_specific_data_ = data;
-
-  if (data.empty()) return false;
-
-  BitReader reader(&data[0], data.size());
-  uint8_t extension_type = 0;
-  bool ps_present = false;
-  uint8_t extension_frequency_index = 0xff;
-
-  frequency_ = 0;
-  extension_frequency_ = 0;
-
-  // Parsing below is a partial implementation of ISO 14496-3:2009 that covers
-  // profiles in range of [1, 4] as well as SBR (5) and PS (29) extensions.
-
-  // Read base configuration
-  RCHECK(reader.ReadBits(5, &profile_));
-  RCHECK(reader.ReadBits(4, &frequency_index_));
-  if (frequency_index_ == 0xf) RCHECK(reader.ReadBits(24, &frequency_));
-  RCHECK(reader.ReadBits(4, &channel_config_));
-
-  // Read extension configuration for explicitly signaled HE-AAC profiles
-  // 5 = HEv1 (Spectral Band Replication), 29 = HEv2 (Parametric Stereo).
-  if (profile_ == 5 || profile_ == 29) {
-    ps_present = (profile_ == 29);
-    extension_type = 5;
-    RCHECK(reader.ReadBits(4, &extension_frequency_index));
-    if (extension_frequency_index == 0xf)
-      RCHECK(reader.ReadBits(24, &extension_frequency_));
-    // With HE extensions now known, determine underlying profile.
-    RCHECK(reader.ReadBits(5, &profile_));
-  }
-
-  // Parsing not implemented for profiles outside this range, so error out. Note
-  // that values of 5 (HE-AACv1) and 29 (HE-AACv2) are parsed above and the
-  // value of profile_ must now reflect the the underlying profile being used
-  // with those extensions (these extensions are supported).
-  // 1 = AAC main, 2 = AAC LC, 3 = AAC SSR, 4 = AAC LTP
-  if (profile_ < 1 || profile_ > 4) {
-    MEDIA_LOG(ERROR, media_log)
-        << "Audio codec(mp4a.40." << static_cast<int>(profile_)
-        << ") is not supported.";
-    return false;
-  }
-
-  RCHECK(SkipDecoderGASpecificConfig(&reader));
-
-  // Read extension configuration again
-  // Note: The check for 16 available bits comes from the AAC spec.
-  if (extension_type != 5 && reader.bits_available() >= 16) {
-    uint16_t sync_extension_type;
-    uint8_t sbr_present_flag;
-    uint8_t ps_present_flag;
-
-    if (reader.ReadBits(11, &sync_extension_type) &&
-        sync_extension_type == 0x2b7) {
-      if (reader.ReadBits(5, &extension_type) && extension_type == 5) {
-        RCHECK(reader.ReadBits(1, &sbr_present_flag));
-
-        if (sbr_present_flag) {
-          RCHECK(reader.ReadBits(4, &extension_frequency_index));
-
-          if (extension_frequency_index == 0xf)
-            RCHECK(reader.ReadBits(24, &extension_frequency_));
-
-          // Note: The check for 12 available bits comes from the AAC spec.
-          if (reader.bits_available() >= 12) {
-            RCHECK(reader.ReadBits(11, &sync_extension_type));
-            if (sync_extension_type == 0x548) {
-              RCHECK(reader.ReadBits(1, &ps_present_flag));
-              ps_present = ps_present_flag != 0;
-            }
-          }
-        }
-      }
-    }
-  }
-
-  if (frequency_ == 0) {
-    if (frequency_index_ >= kADTSFrequencyTableSize) {
-      MEDIA_LOG(ERROR, media_log)
-          << "Sampling Frequency Index(0x" << std::hex
-          << static_cast<int>(frequency_index_)
-          << ") is not supported. Please see ISO 14496-3:2009 Table 1.18 "
-          << "for supported Sampling Frequencies.";
-      return false;
-    }
-    frequency_ = kADTSFrequencyTable[frequency_index_];
-  }
-
-  if (extension_frequency_ == 0 && extension_frequency_index != 0xff) {
-    if (extension_frequency_index >= kADTSFrequencyTableSize) {
-      MEDIA_LOG(ERROR, media_log)
-          << "Extension Sampling Frequency Index(0x" << std::hex
-          << static_cast<int>(extension_frequency_index)
-          << ") is not supported. Please see ISO 14496-3:2009 Table 1.18 "
-          << "for supported Sampling Frequencies.";
-      return false;
-    }
-    extension_frequency_ = kADTSFrequencyTable[extension_frequency_index];
-  }
-
-  // When Parametric Stereo is on, mono will be played as stereo.
-  if (ps_present && channel_config_ == 1) {
-    channel_layout_ = CHANNEL_LAYOUT_STEREO;
-  } else {
-    if (channel_config_ >= kADTSChannelLayoutTableSize) {
-      MEDIA_LOG(ERROR, media_log)
-          << "Channel Configuration(" << static_cast<int>(channel_config_)
-          << ") is not supported. Please see ISO 14496-3:2009 Table 1.19 "
-          << "for supported Channel Configurations.";
-      return false;
-    }
-    channel_layout_ = kADTSChannelLayoutTable[channel_config_];
-  }
-  DCHECK(channel_layout_ != CHANNEL_LAYOUT_NONE);
-
-  MEDIA_LOG(INFO, media_log)
-      << "Audio codec: mp4a.40." << static_cast<int>(profile_)
-      << ". Sampling frequency: " << frequency_ << "Hz"
-      << ". Sampling frequency(Extension): " << extension_frequency_ << "Hz"
-      << ". Channel layout: " << channel_layout_ << ".";
-
-  return true;
-}
-
-int AAC::GetOutputSamplesPerSecond(bool sbr_in_mimetype) const {
-  if (extension_frequency_ > 0) return extension_frequency_;
-
-  if (!sbr_in_mimetype) return frequency_;
-
-  // The following code is written according to ISO 14496-3:2009 Table 1.11 and
-  // Table 1.25. (Table 1.11 refers to the capping to 48000, Table 1.25 refers
-  // to SBR doubling the AAC sample rate.)
-  // TODO(acolwell) : Extend sample rate cap to 96kHz for Level 5 content.
-  DCHECK_GT(frequency_, 0);
-  return std::min(2 * frequency_, 48000);
-}
-
-ChannelLayout AAC::GetChannelLayout(bool sbr_in_mimetype) const {
-  // Check for implicit signalling of HE-AAC and indicate stereo output
-  // if the mono channel configuration is signalled.
-  // See ISO 14496-3:2009 Section 1.6.5.3 for details about this special casing.
-  if (sbr_in_mimetype && channel_config_ == 1) return CHANNEL_LAYOUT_STEREO;
-
-  return channel_layout_;
-}
-
-bool AAC::ConvertEsdsToADTS(std::vector<uint8_t>* buffer) const {
-  size_t size = buffer->size() + kADTSHeaderMinSize;
-
-  DCHECK(profile_ >= 1 && profile_ <= 4 && frequency_index_ != 0xf &&
-         channel_config_ <= 7);
-
-  // ADTS header uses 13 bits for packet size.
-  if (size >= (1 << 13)) return false;
-
-  std::vector<uint8_t>& adts = *buffer;
-
-  adts.insert(buffer->begin(), kADTSHeaderMinSize, 0);
-  adts[0] = 0xff;
-  adts[1] = 0xf1;
-  adts[2] =
-      ((profile_ - 1) << 6) + (frequency_index_ << 2) + (channel_config_ >> 2);
-  adts[3] = static_cast<uint8_t>(((channel_config_ & 0x3) << 6) + (size >> 11));
-  adts[4] = static_cast<uint8_t>((size & 0x7ff) >> 3);
-  adts[5] = ((size & 7) << 5) + 0x1f;
-  adts[6] = 0xfc;
-
-  return true;
-}
-
-// Currently this function only support GASpecificConfig defined in
-// ISO 14496-3:2009 Table 4.1 - Syntax of GASpecificConfig()
-bool AAC::SkipDecoderGASpecificConfig(BitReader* bit_reader) const {
-  switch (profile_) {
-    case 1:
-    case 2:
-    case 3:
-    case 4:
-    case 6:
-    case 7:
-    case 17:
-    case 19:
-    case 20:
-    case 21:
-    case 22:
-    case 23:
-      return SkipGASpecificConfig(bit_reader);
-    default:
-      break;
-  }
-
-  return false;
-}
-
-// The following code is written according to ISO 14496-3:2009 Table 4.1 -
-// GASpecificConfig.
-bool AAC::SkipGASpecificConfig(BitReader* bit_reader) const {
-  uint8_t extension_flag = 0;
-  uint8_t depends_on_core_coder;
-  uint16_t dummy;
-
-  RCHECK(bit_reader->ReadBits(1, &dummy));  // frameLengthFlag
-  RCHECK(bit_reader->ReadBits(1, &depends_on_core_coder));
-  if (depends_on_core_coder == 1)
-    RCHECK(bit_reader->ReadBits(14, &dummy));  // coreCoderDelay
-
-  RCHECK(bit_reader->ReadBits(1, &extension_flag));
-  RCHECK(channel_config_ != 0);
-
-  if (profile_ == 6 || profile_ == 20)
-    RCHECK(bit_reader->ReadBits(3, &dummy));  // layerNr
-
-  if (extension_flag) {
-    if (profile_ == 22) {
-      RCHECK(bit_reader->ReadBits(5, &dummy));   // numOfSubFrame
-      RCHECK(bit_reader->ReadBits(11, &dummy));  // layer_length
-    }
-
-    if (profile_ == 17 || profile_ == 19 || profile_ == 20 || profile_ == 23) {
-      RCHECK(bit_reader->ReadBits(3, &dummy));  // resilience flags
-    }
-
-    RCHECK(bit_reader->ReadBits(1, &dummy));  // extensionFlag3
-  }
-
-  return true;
-}
-
-}  // namespace mp4
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/aac.h b/cobalt/media/formats/mp4/aac.h
deleted file mode 100644
index 1cabb43..0000000
--- a/cobalt/media/formats/mp4/aac.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP4_AAC_H_
-#define COBALT_MEDIA_FORMATS_MP4_AAC_H_
-
-#include <vector>
-
-#include "build/build_config.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class BitReader;
-
-namespace mp4 {
-
-// This class parses the AAC information from decoder specific information
-// embedded in the esds box in an ISO BMFF file.
-// Please refer to ISO 14496 Part 3 Table 1.13 - Syntax of AudioSpecificConfig
-// for more details.
-class MEDIA_EXPORT AAC {
- public:
-  AAC();
-  AAC(const AAC& other);
-  ~AAC();
-
-  // Parse the AAC config from the raw binary data embedded in esds box.
-  // The function will parse the data and get the ElementaryStreamDescriptor,
-  // then it will parse the ElementaryStreamDescriptor to get audio stream
-  // configurations.
-  bool Parse(const std::vector<uint8_t>& data,
-             const scoped_refptr<MediaLog>& media_log);
-
-  // Gets the output sample rate for the AAC stream.
-  // |sbr_in_mimetype| should be set to true if the SBR mode is
-  // signalled in the mimetype. (ie mp4a.40.5 in the codecs parameter).
-  // Returns the samples_per_second value that should used in an
-  // AudioDecoderConfig.
-  int GetOutputSamplesPerSecond(bool sbr_in_mimetype) const;
-
-  // Gets the channel layout for the AAC stream.
-  // |sbr_in_mimetype| should be set to true if the SBR mode is
-  // signalled in the mimetype. (ie mp4a.40.5 in the codecs parameter).
-  // Returns the channel_layout value that should used in an
-  // AudioDecoderConfig.
-  ChannelLayout GetChannelLayout(bool sbr_in_mimetype) const;
-
-  // This function converts a raw AAC frame into an AAC frame with an ADTS
-  // header. On success, the function returns true and stores the converted data
-  // in the buffer. The function returns false on failure and leaves the buffer
-  // unchanged.
-  bool ConvertEsdsToADTS(std::vector<uint8_t>* buffer) const;
-
-  // Returns the codec specific data needed by android MediaCodec.
-  std::vector<uint8_t> codec_specific_data() const {
-    return codec_specific_data_;
-  }
-
- private:
-  bool SkipDecoderGASpecificConfig(BitReader* bit_reader) const;
-  bool SkipErrorSpecificConfig() const;
-  bool SkipGASpecificConfig(BitReader* bit_reader) const;
-
-  // The following variables store the AAC specific configuration information
-  // that are used to generate the ADTS header.
-  uint8_t profile_;
-  uint8_t frequency_index_;
-  uint8_t channel_config_;
-
-  // The codec specific data needed by the android MediaCodec.
-  std::vector<uint8_t> codec_specific_data_;
-
-  // The following variables store audio configuration information that
-  // can be used by Chromium. They are based on the AAC specific
-  // configuration but can be overridden by extensions in elementary
-  // stream descriptor.
-  int frequency_;
-  int extension_frequency_;
-  ChannelLayout channel_layout_;
-};
-
-}  // namespace mp4
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_AAC_H_
diff --git a/cobalt/media/formats/mp4/aac_unittest.cc b/cobalt/media/formats/mp4/aac_unittest.cc
deleted file mode 100644
index 86b5a56..0000000
--- a/cobalt/media/formats/mp4/aac_unittest.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2014 The Chromium Authors. 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 "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/formats/mp4/aac.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::AllOf;
-using ::testing::HasSubstr;
-using ::testing::InSequence;
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-namespace mp4 {
-
-MATCHER_P(AudioProfileLog, profile_string, "") {
-  return CONTAINS_STRING(arg,
-                         "Audio codec: " + std::string(profile_string) + ".");
-}
-
-MATCHER_P(AudioSamplingFrequencyLog, frequency_string, "") {
-  return CONTAINS_STRING(
-      arg, "Sampling frequency: " + std::string(frequency_string) + "Hz.");
-}
-
-MATCHER_P(AudioExtensionSamplingFrequencyLog, ex_string, "") {
-  return CONTAINS_STRING(
-      arg, "Sampling frequency(Extension): " + std::string(ex_string) + "Hz.");
-}
-
-MATCHER_P(AudioChannelLayoutLog, layout_string, "") {
-  return CONTAINS_STRING(arg,
-                         "Channel layout: " + std::string(layout_string) + ".");
-}
-
-MATCHER_P(UnsupportedFrequencyIndexLog, frequency_index, "") {
-  return CONTAINS_STRING(arg, "Sampling Frequency Index(0x" +
-                                  std::string(frequency_index) +
-                                  ") is not supported.");
-}
-
-MATCHER_P(UnsupportedExtensionFrequencyIndexLog, frequency_index, "") {
-  return CONTAINS_STRING(arg, "Extension Sampling Frequency Index(0x" +
-                                  std::string(frequency_index) +
-                                  ") is not supported.");
-}
-
-MATCHER_P(UnsupportedChannelConfigLog, channel_index, "") {
-  return CONTAINS_STRING(arg, "Channel Configuration(" +
-                                  std::string(channel_index) +
-                                  ") is not supported");
-}
-
-MATCHER_P(UnsupportedAudioProfileLog, profile_string, "") {
-  return CONTAINS_STRING(
-      arg, "Audio codec(" + std::string(profile_string) + ") is not supported");
-}
-
-class AACTest : public testing::Test {
- public:
-  AACTest() : media_log_(new StrictMock<MockMediaLog>()) {}
-
-  bool Parse(const std::vector<uint8_t>& data) {
-    return aac_.Parse(data, media_log_);
-  }
-
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-  AAC aac_;
-};
-
-TEST_F(AACTest, BasicProfileTest) {
-  uint8_t buffer[] = {0x12, 0x10};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("44100"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("3")));
-  EXPECT_TRUE(Parse(data));
-  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 44100);
-  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_STEREO);
-}
-
-TEST_F(AACTest, ExtensionTest) {
-  uint8_t buffer[] = {0x13, 0x08, 0x56, 0xe5, 0x9d, 0x48, 0x80};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("24000"),
-      AudioExtensionSamplingFrequencyLog("48000"), AudioChannelLayoutLog("3")));
-  EXPECT_TRUE(Parse(data));
-  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 48000);
-  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(true), 48000);
-  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_STEREO);
-}
-
-// Test implicit SBR with mono channel config.
-// Mono channel layout should only be reported if SBR is not
-// specified. Otherwise stereo should be reported.
-// See ISO 14496-3:2005 Section 1.6.5.3 for details about this special casing.
-TEST_F(AACTest, ImplicitSBR_ChannelConfig0) {
-  uint8_t buffer[] = {0x13, 0x08};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("24000"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("2")));
-  EXPECT_TRUE(Parse(data));
-
-  // Test w/o implicit SBR.
-  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 24000);
-  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_MONO);
-
-  // Test implicit SBR.
-  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(true), 48000);
-  EXPECT_EQ(aac_.GetChannelLayout(true), CHANNEL_LAYOUT_STEREO);
-}
-
-// Tests implicit SBR with a stereo channel config.
-TEST_F(AACTest, ImplicitSBR_ChannelConfig1) {
-  uint8_t buffer[] = {0x13, 0x10};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("24000"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("3")));
-  EXPECT_TRUE(Parse(data));
-
-  // Test w/o implicit SBR.
-  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 24000);
-  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_STEREO);
-
-  // Test implicit SBR.
-  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(true), 48000);
-  EXPECT_EQ(aac_.GetChannelLayout(true), CHANNEL_LAYOUT_STEREO);
-}
-
-TEST_F(AACTest, SixChannelTest) {
-  uint8_t buffer[] = {0x11, 0xb0};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("48000"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("12")));
-  EXPECT_TRUE(Parse(data));
-  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 48000);
-  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_5_1_BACK);
-}
-
-TEST_F(AACTest, DataTooShortTest) {
-  std::vector<uint8_t> data;
-
-  EXPECT_FALSE(Parse(data));
-
-  data.push_back(0x12);
-  EXPECT_FALSE(Parse(data));
-}
-
-TEST_F(AACTest, IncorrectProfileTest) {
-  InSequence s;
-  uint8_t buffer[] = {0x0, 0x08};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-  EXPECT_MEDIA_LOG(UnsupportedAudioProfileLog("mp4a.40.0"));
-  EXPECT_FALSE(Parse(data));
-
-  data[0] = 0x08;
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.1"), AudioSamplingFrequencyLog("96000"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("2")));
-  EXPECT_TRUE(Parse(data));
-
-  data[0] = 0x28;
-  // No media log for this profile 5, since not enough bits are in |data| to
-  // first parse profile 5's extension frequency index.
-  EXPECT_FALSE(Parse(data));
-}
-
-TEST_F(AACTest, IncorrectFrequencyTest) {
-  uint8_t buffer[] = {0x0f, 0x88};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-  EXPECT_FALSE(Parse(data));
-
-  data[0] = 0x0e;
-  data[1] = 0x08;
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.1"), AudioSamplingFrequencyLog("7350"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("2")));
-  EXPECT_TRUE(Parse(data));
-}
-
-TEST_F(AACTest, IncorrectChannelTest) {
-  uint8_t buffer[] = {0x0e, 0x00};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-  EXPECT_FALSE(Parse(data));
-
-  data[1] = 0x08;
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.1"), AudioSamplingFrequencyLog("7350"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("2")));
-  EXPECT_TRUE(Parse(data));
-}
-
-TEST_F(AACTest, UnsupportedProfileTest) {
-  InSequence s;
-  uint8_t buffer[] = {0x3a, 0x08};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-  EXPECT_MEDIA_LOG(UnsupportedAudioProfileLog("mp4a.40.7"));
-  EXPECT_FALSE(Parse(data));
-
-  data[0] = 0x12;
-  data[1] = 0x18;
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("44100"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("5")));
-  EXPECT_TRUE(Parse(data));
-}
-
-TEST_F(AACTest, UnsupportedChannelLayoutTest) {
-  InSequence s;
-  uint8_t buffer[] = {0x12, 0x78};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-  EXPECT_MEDIA_LOG(UnsupportedChannelConfigLog("15"));
-  EXPECT_FALSE(Parse(data));
-
-  data[1] = 0x18;
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("44100"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("5")));
-  EXPECT_TRUE(Parse(data));
-}
-
-TEST_F(AACTest, UnsupportedFrequencyIndexTest) {
-  InSequence s;
-  uint8_t buffer[] = {0x17, 0x10};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-  EXPECT_MEDIA_LOG(UnsupportedFrequencyIndexLog("e"));
-  EXPECT_FALSE(Parse(data));
-
-  data[0] = 0x13;
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("24000"),
-      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("3")));
-  EXPECT_TRUE(Parse(data));
-}
-
-TEST_F(AACTest, UnsupportedExFrequencyIndexTest) {
-  InSequence s;
-  uint8_t buffer[] = {0x29, 0x17, 0x08, 0x0};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-  EXPECT_MEDIA_LOG(UnsupportedExtensionFrequencyIndexLog("e"));
-  EXPECT_FALSE(Parse(data));
-
-  data[1] = 0x11;
-  EXPECT_MEDIA_LOG(AllOf(
-      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("64000"),
-      AudioExtensionSamplingFrequencyLog("64000"), AudioChannelLayoutLog("3")));
-  EXPECT_TRUE(Parse(data));
-}
-
-}  // namespace mp4
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/avc.cc b/cobalt/media/formats/mp4/avc.cc
deleted file mode 100644
index c5ad610..0000000
--- a/cobalt/media/formats/mp4/avc.cc
+++ /dev/null
@@ -1,342 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp4/avc.h"
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-
-#include "base/logging.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "cobalt/media/formats/mp4/box_reader.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-static const uint8_t kAnnexBStartCode[] = {0, 0, 0, 1};
-static const int kAnnexBStartCodeSize = 4;
-
-static bool ConvertAVCToAnnexBInPlaceForLengthSize4(std::vector<uint8_t>* buf) {
-  const int kLengthSize = 4;
-  size_t pos = 0;
-  while (pos + kLengthSize < buf->size()) {
-    uint32_t nal_length = (*buf)[pos];
-    nal_length = (nal_length << 8) + (*buf)[pos + 1];
-    nal_length = (nal_length << 8) + (*buf)[pos + 2];
-    nal_length = (nal_length << 8) + (*buf)[pos + 3];
-
-    if (nal_length == 0) {
-      DVLOG(3) << "nal_length is 0";
-      return false;
-    }
-
-    std::copy(kAnnexBStartCode, kAnnexBStartCode + kAnnexBStartCodeSize,
-              buf->begin() + pos);
-    pos += kLengthSize + nal_length;
-  }
-  return pos == buf->size();
-}
-
-// static
-int AVC::FindSubsampleIndex(const std::vector<uint8_t>& buffer,
-                            const std::vector<SubsampleEntry>* subsamples,
-                            const uint8_t* ptr) {
-  DCHECK(ptr >= &buffer[0]);
-  DCHECK(ptr <= &buffer[buffer.size() - 1]);
-  if (!subsamples || subsamples->empty()) return 0;
-
-  const uint8_t* p = &buffer[0];
-  for (size_t i = 0; i < subsamples->size(); ++i) {
-    p += (*subsamples)[i].clear_bytes + (*subsamples)[i].cypher_bytes;
-    if (p > ptr) return i;
-  }
-  NOTREACHED();
-  return 0;
-}
-
-// static
-bool AVC::ConvertFrameToAnnexB(int length_size, std::vector<uint8_t>* buffer,
-                               std::vector<SubsampleEntry>* subsamples) {
-  RCHECK(length_size == 1 || length_size == 2 || length_size == 4);
-  DVLOG(5) << __FUNCTION__ << " length_size=" << length_size
-           << " buffer->size()=" << buffer->size()
-           << " subsamples=" << (subsamples ? subsamples->size() : 0);
-
-  if (length_size == 4) return ConvertAVCToAnnexBInPlaceForLengthSize4(buffer);
-
-  std::vector<uint8_t> temp;
-  temp.swap(*buffer);
-  buffer->reserve(temp.size() + 32);
-
-  size_t pos = 0;
-  while (pos + length_size < temp.size()) {
-    int nal_length = temp[pos];
-    if (length_size == 2) nal_length = (nal_length << 8) + temp[pos + 1];
-    pos += length_size;
-
-    if (nal_length == 0) {
-      DVLOG(3) << "nal_length is 0";
-      return false;
-    }
-
-    RCHECK(pos + nal_length <= temp.size());
-    buffer->insert(buffer->end(), kAnnexBStartCode,
-                   kAnnexBStartCode + kAnnexBStartCodeSize);
-    if (subsamples && !subsamples->empty()) {
-      uint8_t* buffer_pos = &(*(buffer->end() - kAnnexBStartCodeSize));
-      int subsample_index = FindSubsampleIndex(*buffer, subsamples, buffer_pos);
-      // We've replaced NALU size value with an AnnexB start code.
-      int size_adjustment = kAnnexBStartCodeSize - length_size;
-      (*subsamples)[subsample_index].clear_bytes += size_adjustment;
-    }
-    buffer->insert(buffer->end(), temp.begin() + pos,
-                   temp.begin() + pos + nal_length);
-    pos += nal_length;
-  }
-  return pos == temp.size();
-}
-
-// static
-bool AVC::InsertParamSetsAnnexB(const AVCDecoderConfigurationRecord& avc_config,
-                                std::vector<uint8_t>* buffer,
-                                std::vector<SubsampleEntry>* subsamples) {
-  DCHECK(AVC::IsValidAnnexB(*buffer, *subsamples));
-
-  std::unique_ptr<H264Parser> parser(new H264Parser());
-  const uint8_t* start = &(*buffer)[0];
-  parser->SetEncryptedStream(start, buffer->size(), *subsamples);
-
-  H264NALU nalu;
-  if (parser->AdvanceToNextNALU(&nalu) != H264Parser::kOk) return false;
-
-  std::vector<uint8_t>::iterator config_insert_point = buffer->begin();
-
-  if (nalu.nal_unit_type == H264NALU::kAUD) {
-    // Move insert point to just after the AUD.
-    config_insert_point += (nalu.data + nalu.size) - start;
-  }
-
-  // Clear |parser| and |start| since they aren't needed anymore and
-  // will hold stale pointers once the insert happens.
-  parser.reset();
-  start = NULL;
-
-  std::vector<uint8_t> param_sets;
-  RCHECK(AVC::ConvertConfigToAnnexB(avc_config, &param_sets));
-
-  if (subsamples && !subsamples->empty()) {
-    int subsample_index =
-        FindSubsampleIndex(*buffer, subsamples, &(*config_insert_point));
-    // Update the size of the subsample where SPS/PPS is to be inserted.
-    (*subsamples)[subsample_index].clear_bytes += param_sets.size();
-  }
-
-  buffer->insert(config_insert_point, param_sets.begin(), param_sets.end());
-
-  DCHECK(AVC::IsValidAnnexB(*buffer, *subsamples));
-  return true;
-}
-
-// static
-bool AVC::ConvertConfigToAnnexB(const AVCDecoderConfigurationRecord& avc_config,
-                                std::vector<uint8_t>* buffer) {
-  DCHECK(buffer->empty());
-  buffer->clear();
-  int total_size = 0;
-  for (size_t i = 0; i < avc_config.sps_list.size(); i++)
-    total_size += avc_config.sps_list[i].size() + kAnnexBStartCodeSize;
-  for (size_t i = 0; i < avc_config.pps_list.size(); i++)
-    total_size += avc_config.pps_list[i].size() + kAnnexBStartCodeSize;
-  buffer->reserve(total_size);
-
-  for (size_t i = 0; i < avc_config.sps_list.size(); i++) {
-    buffer->insert(buffer->end(), kAnnexBStartCode,
-                   kAnnexBStartCode + kAnnexBStartCodeSize);
-    buffer->insert(buffer->end(), avc_config.sps_list[i].begin(),
-                   avc_config.sps_list[i].end());
-  }
-
-  for (size_t i = 0; i < avc_config.pps_list.size(); i++) {
-    buffer->insert(buffer->end(), kAnnexBStartCode,
-                   kAnnexBStartCode + kAnnexBStartCodeSize);
-    buffer->insert(buffer->end(), avc_config.pps_list[i].begin(),
-                   avc_config.pps_list[i].end());
-  }
-  return true;
-}
-
-// Verifies AnnexB NALU order according to ISO/IEC 14496-10 Section 7.4.1.2.3
-bool AVC::IsValidAnnexB(const std::vector<uint8_t>& buffer,
-                        const std::vector<SubsampleEntry>& subsamples) {
-  return IsValidAnnexB(&buffer[0], buffer.size(), subsamples);
-}
-
-bool AVC::IsValidAnnexB(const uint8_t* buffer, size_t size,
-                        const std::vector<SubsampleEntry>& subsamples) {
-  DVLOG(3) << __FUNCTION__;
-  DCHECK(buffer);
-
-  if (size == 0) return true;
-
-  H264Parser parser;
-  parser.SetEncryptedStream(buffer, size, subsamples);
-
-  typedef enum {
-    kAUDAllowed,
-    kBeforeFirstVCL,  // VCL == nal_unit_types 1-5
-    kAfterFirstVCL,
-    kEOStreamAllowed,
-    kNoMoreDataAllowed,
-  } NALUOrderState;
-
-  H264NALU nalu;
-  NALUOrderState order_state = kAUDAllowed;
-  int last_nalu_type = H264NALU::kUnspecified;
-  bool done = false;
-  while (!done) {
-    switch (parser.AdvanceToNextNALU(&nalu)) {
-      case H264Parser::kOk:
-        DVLOG(3) << "nal_unit_type " << nalu.nal_unit_type;
-
-        switch (nalu.nal_unit_type) {
-          case H264NALU::kAUD:
-            if (order_state > kAUDAllowed) {
-              DVLOG(1) << "Unexpected AUD in order_state " << order_state;
-              return false;
-            }
-            order_state = kBeforeFirstVCL;
-            break;
-
-          case H264NALU::kSEIMessage:
-          case H264NALU::kReserved14:
-          case H264NALU::kReserved15:
-          case H264NALU::kReserved16:
-          case H264NALU::kReserved17:
-          case H264NALU::kReserved18:
-          case H264NALU::kPPS:
-          case H264NALU::kSPS:
-            if (order_state > kBeforeFirstVCL) {
-              DVLOG(1) << "Unexpected NALU type " << nalu.nal_unit_type
-                       << " in order_state " << order_state;
-              return false;
-            }
-            order_state = kBeforeFirstVCL;
-            break;
-
-          case H264NALU::kSPSExt:
-            if (last_nalu_type != H264NALU::kSPS) {
-              DVLOG(1) << "SPS extension does not follow an SPS.";
-              return false;
-            }
-            break;
-
-          case H264NALU::kNonIDRSlice:
-          case H264NALU::kSliceDataA:
-          case H264NALU::kSliceDataB:
-          case H264NALU::kSliceDataC:
-          case H264NALU::kIDRSlice:
-            if (order_state > kAfterFirstVCL) {
-              DVLOG(1) << "Unexpected VCL in order_state " << order_state;
-              return false;
-            }
-            order_state = kAfterFirstVCL;
-            break;
-
-          case H264NALU::kCodedSliceAux:
-            if (order_state != kAfterFirstVCL) {
-              DVLOG(1) << "Unexpected extension in order_state " << order_state;
-              return false;
-            }
-            break;
-
-          case H264NALU::kEOSeq:
-            if (order_state != kAfterFirstVCL) {
-              DVLOG(1) << "Unexpected EOSeq in order_state " << order_state;
-              return false;
-            }
-            order_state = kEOStreamAllowed;
-            break;
-
-          case H264NALU::kEOStream:
-            if (order_state < kAfterFirstVCL) {
-              DVLOG(1) << "Unexpected EOStream in order_state " << order_state;
-              return false;
-            }
-            order_state = kNoMoreDataAllowed;
-            break;
-
-          case H264NALU::kFiller:
-          case H264NALU::kUnspecified:
-            if (!(order_state >= kAfterFirstVCL &&
-                  order_state < kEOStreamAllowed)) {
-              DVLOG(1) << "Unexpected NALU type " << nalu.nal_unit_type
-                       << " in order_state " << order_state;
-              return false;
-            }
-            break;
-
-          default:
-            DCHECK_GE(nalu.nal_unit_type, 20);
-            if (nalu.nal_unit_type >= 20 && nalu.nal_unit_type <= 31 &&
-                order_state != kAfterFirstVCL) {
-              DVLOG(1) << "Unexpected NALU type " << nalu.nal_unit_type
-                       << " in order_state " << order_state;
-              return false;
-            }
-        }
-        last_nalu_type = nalu.nal_unit_type;
-        break;
-
-      case H264Parser::kInvalidStream:
-        return false;
-
-      case H264Parser::kUnsupportedStream:
-        NOTREACHED() << "AdvanceToNextNALU() returned kUnsupportedStream!";
-        return false;
-
-      case H264Parser::kEOStream:
-        done = true;
-    }
-  }
-
-  return order_state >= kAfterFirstVCL;
-}
-
-AVCBitstreamConverter::AVCBitstreamConverter(
-    std::unique_ptr<AVCDecoderConfigurationRecord> avc_config)
-    : avc_config_(std::move(avc_config)) {
-  DCHECK(avc_config_);
-}
-
-AVCBitstreamConverter::~AVCBitstreamConverter() {}
-
-bool AVCBitstreamConverter::ConvertFrame(
-    std::vector<uint8_t>* frame_buf, bool is_keyframe,
-    std::vector<SubsampleEntry>* subsamples) const {
-  // Convert the AVC NALU length fields to Annex B headers, as expected by
-  // decoding libraries. Since this may enlarge the size of the buffer, we also
-  // update the clear byte count for each subsample if encryption is used to
-  // account for the difference in size between the length prefix and Annex B
-  // start code.
-  RCHECK(AVC::ConvertFrameToAnnexB(avc_config_->length_size, frame_buf,
-                                   subsamples));
-
-  if (is_keyframe) {
-    // If this is a keyframe, we (re-)inject SPS and PPS headers at the start of
-    // a frame. If subsample info is present, we also update the clear byte
-    // count for that first subsample.
-    RCHECK(AVC::InsertParamSetsAnnexB(*avc_config_, frame_buf, subsamples));
-  }
-
-  DCHECK(AVC::IsValidAnnexB(*frame_buf, *subsamples));
-  return true;
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/avc.h b/cobalt/media/formats/mp4/avc.h
deleted file mode 100644
index f3212e8..0000000
--- a/cobalt/media/formats/mp4/avc.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP4_AVC_H_
-#define COBALT_MEDIA_FORMATS_MP4_AVC_H_
-
-#include <memory>
-#include <vector>
-
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/formats/mp4/bitstream_converter.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-struct SubsampleEntry;
-
-namespace mp4 {
-
-struct AVCDecoderConfigurationRecord;
-
-class MEDIA_EXPORT AVC {
- public:
-  static bool ConvertFrameToAnnexB(int length_size,
-                                   std::vector<uint8_t>* buffer,
-                                   std::vector<SubsampleEntry>* subsamples);
-
-  // Inserts the SPS & PPS data from |avc_config| into |buffer|.
-  // |buffer| is expected to contain AnnexB conformant data.
-  // |subsamples| contains the SubsampleEntry info if |buffer| contains
-  // encrypted data.
-  // Returns true if the param sets were successfully inserted.
-  static bool InsertParamSetsAnnexB(
-      const AVCDecoderConfigurationRecord& avc_config,
-      std::vector<uint8_t>* buffer, std::vector<SubsampleEntry>* subsamples);
-
-  static bool ConvertConfigToAnnexB(
-      const AVCDecoderConfigurationRecord& avc_config,
-      std::vector<uint8_t>* buffer);
-
-  // Verifies that the contents of |buffer| conform to
-  // Section 7.4.1.2.3 of ISO/IEC 14496-10.
-  // |subsamples| contains the information about what parts of the buffer are
-  // encrypted and which parts are clear.
-  // Returns true if |buffer| contains conformant Annex B data
-  // TODO(acolwell): Remove the std::vector version when we can use,
-  // C++11's std::vector<T>::data() method.
-  static bool IsValidAnnexB(const std::vector<uint8_t>& buffer,
-                            const std::vector<SubsampleEntry>& subsamples);
-  static bool IsValidAnnexB(const uint8_t* buffer, size_t size,
-                            const std::vector<SubsampleEntry>& subsamples);
-
-  // Given a |buffer| and |subsamples| information and |pts| pointer into the
-  // |buffer| finds the index of the subsample |ptr| is pointing into.
-  static int FindSubsampleIndex(const std::vector<uint8_t>& buffer,
-                                const std::vector<SubsampleEntry>* subsamples,
-                                const uint8_t* ptr);
-};
-
-// AVCBitstreamConverter converts AVC/H.264 bitstream from MP4 container format
-// with embedded NALU lengths into AnnexB bitstream format (described in ISO/IEC
-// 14496-10) with 4-byte start codes. It also knows how to handle CENC-encrypted
-// streams and adjusts subsample data for those streams while converting.
-class AVCBitstreamConverter : public BitstreamConverter {
- public:
-  explicit AVCBitstreamConverter(
-      std::unique_ptr<AVCDecoderConfigurationRecord> avc_config);
-
-  // BitstreamConverter interface
-  bool ConvertFrame(std::vector<uint8_t>* frame_buf, bool is_keyframe,
-                    std::vector<SubsampleEntry>* subsamples) const override;
-
- private:
-  ~AVCBitstreamConverter() override;
-  std::unique_ptr<AVCDecoderConfigurationRecord> avc_config_;
-};
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_AVC_H_
diff --git a/cobalt/media/formats/mp4/avc_unittest.cc b/cobalt/media/formats/mp4/avc_unittest.cc
deleted file mode 100644
index 3e37c68..0000000
--- a/cobalt/media/formats/mp4/avc_unittest.cc
+++ /dev/null
@@ -1,447 +0,0 @@
-// Copyright 2014 The Chromium Authors. 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 "base/basictypes.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "cobalt/media/formats/mp4/avc.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-static const uint8_t kNALU1[] = {0x01, 0x02, 0x03};
-static const uint8_t kNALU2[] = {0x04, 0x05, 0x06, 0x07};
-static const uint8_t kExpected[] = {0x00, 0x00, 0x00, 0x01, 0x01,
-                                    0x02, 0x03, 0x00, 0x00, 0x00,
-                                    0x01, 0x04, 0x05, 0x06, 0x07};
-
-static const uint8_t kExpectedParamSets[] = {
-    0x00, 0x00, 0x00, 0x01, 0x67, 0x12, 0x00, 0x00, 0x00, 0x01,
-    0x67, 0x34, 0x00, 0x00, 0x00, 0x01, 0x68, 0x56, 0x78};
-
-static H264NALU::Type StringToNALUType(const std::string& name) {
-  if (name == "P") return H264NALU::kNonIDRSlice;
-
-  if (name == "I") return H264NALU::kIDRSlice;
-
-  if (name == "SEI") return H264NALU::kSEIMessage;
-
-  if (name == "SPS") return H264NALU::kSPS;
-
-  if (name == "SPSExt") return H264NALU::kSPSExt;
-
-  if (name == "PPS") return H264NALU::kPPS;
-
-  if (name == "AUD") return H264NALU::kAUD;
-
-  if (name == "EOSeq") return H264NALU::kEOSeq;
-
-  if (name == "EOStr") return H264NALU::kEOStream;
-
-  if (name == "FILL") return H264NALU::kFiller;
-
-  if (name == "R14") return H264NALU::kReserved14;
-
-  CHECK(false) << "Unexpected name: " << name;
-  return H264NALU::kUnspecified;
-}
-
-static std::string NALUTypeToString(int type) {
-  switch (type) {
-    case H264NALU::kNonIDRSlice:
-      return "P";
-    case H264NALU::kSliceDataA:
-      return "SDA";
-    case H264NALU::kSliceDataB:
-      return "SDB";
-    case H264NALU::kSliceDataC:
-      return "SDC";
-    case H264NALU::kIDRSlice:
-      return "I";
-    case H264NALU::kSEIMessage:
-      return "SEI";
-    case H264NALU::kSPS:
-      return "SPS";
-    case H264NALU::kSPSExt:
-      return "SPSExt";
-    case H264NALU::kPPS:
-      return "PPS";
-    case H264NALU::kAUD:
-      return "AUD";
-    case H264NALU::kEOSeq:
-      return "EOSeq";
-    case H264NALU::kEOStream:
-      return "EOStr";
-    case H264NALU::kFiller:
-      return "FILL";
-    case H264NALU::kReserved14:
-      return "R14";
-
-    case H264NALU::kUnspecified:
-    case H264NALU::kReserved15:
-    case H264NALU::kReserved16:
-    case H264NALU::kReserved17:
-    case H264NALU::kReserved18:
-    case H264NALU::kCodedSliceAux:
-    case H264NALU::kCodedSliceExtension:
-      CHECK(false) << "Unexpected type: " << type;
-      break;
-  };
-
-  return "UnsupportedType";
-}
-
-static void WriteStartCodeAndNALUType(std::vector<uint8_t>* buffer,
-                                      const std::string& nal_unit_type) {
-  buffer->push_back(0x00);
-  buffer->push_back(0x00);
-  buffer->push_back(0x00);
-  buffer->push_back(0x01);
-  buffer->push_back(StringToNALUType(nal_unit_type));
-}
-
-// Input string should be one or more NALU types separated with spaces or
-// commas. NALU grouped together and separated by commas are placed into the
-// same subsample, NALU groups separated by spaces are placed into separate
-// subsamples.
-// For example: input string "SPS PPS I" produces Annex B buffer containing
-// SPS, PPS and I NALUs, each in a separate subsample. While input string
-// "SPS,PPS I" produces Annex B buffer where the first subsample contains SPS
-// and PPS NALUs and the second subsample contains the I-slice NALU.
-// The output buffer will contain a valid-looking Annex B (it's valid-looking in
-// the sense that it has start codes and correct NALU types, but the actual NALU
-// payload is junk).
-void StringToAnnexB(const std::string& str, std::vector<uint8_t>* buffer,
-                    std::vector<SubsampleEntry>* subsamples) {
-  DCHECK(!str.empty());
-
-  std::vector<std::string> subsample_specs = base::SplitString(
-      str, " ", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
-  EXPECT_GT(subsample_specs.size(), 0u);
-
-  buffer->clear();
-  for (size_t i = 0; i < subsample_specs.size(); ++i) {
-    SubsampleEntry entry;
-    size_t start = buffer->size();
-
-    std::vector<std::string> subsample_nalus =
-        base::SplitString(subsample_specs[i], ",", base::KEEP_WHITESPACE,
-                          base::SPLIT_WANT_NONEMPTY);
-    EXPECT_GT(subsample_nalus.size(), 0u);
-    for (size_t j = 0; j < subsample_nalus.size(); ++j) {
-      WriteStartCodeAndNALUType(buffer, subsample_nalus[j]);
-
-      // Write junk for the payload since the current code doesn't
-      // actually look at it.
-      buffer->push_back(0x32);
-      buffer->push_back(0x12);
-      buffer->push_back(0x67);
-    }
-
-    entry.clear_bytes = buffer->size() - start;
-
-    if (subsamples) {
-      // Simulate the encrypted bits containing something that looks
-      // like a SPS NALU.
-      WriteStartCodeAndNALUType(buffer, "SPS");
-    }
-
-    entry.cypher_bytes = buffer->size() - start - entry.clear_bytes;
-
-    if (subsamples) {
-      subsamples->push_back(entry);
-    }
-  }
-}
-
-std::string AnnexBToString(const std::vector<uint8_t>& buffer,
-                           const std::vector<SubsampleEntry>& subsamples) {
-  std::stringstream ss;
-
-  H264Parser parser;
-  parser.SetEncryptedStream(&buffer[0], buffer.size(), subsamples);
-
-  H264NALU nalu;
-  bool first = true;
-  size_t current_subsample_index = 0;
-  while (parser.AdvanceToNextNALU(&nalu) == H264Parser::kOk) {
-    size_t subsample_index =
-        AVC::FindSubsampleIndex(buffer, &subsamples, nalu.data);
-    if (!first) {
-      ss << (subsample_index == current_subsample_index ? "," : " ");
-    } else {
-      DCHECK_EQ(subsample_index, current_subsample_index);
-      first = false;
-    }
-
-    ss << NALUTypeToString(nalu.nal_unit_type);
-    current_subsample_index = subsample_index;
-  }
-  return ss.str();
-}
-
-class AVCConversionTest : public testing::TestWithParam<int> {
- protected:
-  void WriteLength(int length_size, int length, std::vector<uint8_t>* buf) {
-    DCHECK_GE(length, 0);
-    DCHECK_LE(length, 255);
-
-    for (int i = 1; i < length_size; i++) buf->push_back(0);
-    buf->push_back(length);
-  }
-
-  void MakeInputForLength(int length_size, std::vector<uint8_t>* buf) {
-    buf->clear();
-
-    WriteLength(length_size, sizeof(kNALU1), buf);
-    buf->insert(buf->end(), kNALU1, kNALU1 + sizeof(kNALU1));
-
-    WriteLength(length_size, sizeof(kNALU2), buf);
-    buf->insert(buf->end(), kNALU2, kNALU2 + sizeof(kNALU2));
-  }
-};
-
-TEST_P(AVCConversionTest, ParseCorrectly) {
-  std::vector<uint8_t> buf;
-  std::vector<SubsampleEntry> subsamples;
-  MakeInputForLength(GetParam(), &buf);
-  EXPECT_TRUE(AVC::ConvertFrameToAnnexB(GetParam(), &buf, &subsamples));
-  EXPECT_TRUE(AVC::IsValidAnnexB(buf, subsamples));
-  EXPECT_EQ(buf.size(), sizeof(kExpected));
-  EXPECT_EQ(0, memcmp(kExpected, &buf[0], sizeof(kExpected)));
-  EXPECT_EQ("P,SDC", AnnexBToString(buf, subsamples));
-}
-
-// Intentionally write NALU sizes that are larger than the buffer.
-TEST_P(AVCConversionTest, NALUSizeTooLarge) {
-  std::vector<uint8_t> buf;
-  WriteLength(GetParam(), 10 * sizeof(kNALU1), &buf);
-  buf.insert(buf.end(), kNALU1, kNALU1 + sizeof(kNALU1));
-  EXPECT_FALSE(AVC::ConvertFrameToAnnexB(GetParam(), &buf, NULL));
-}
-
-TEST_P(AVCConversionTest, NALUSizeIsZero) {
-  std::vector<uint8_t> buf;
-  WriteLength(GetParam(), 0, &buf);
-
-  WriteLength(GetParam(), sizeof(kNALU1), &buf);
-  buf.insert(buf.end(), kNALU1, kNALU1 + sizeof(kNALU1));
-
-  WriteLength(GetParam(), 0, &buf);
-
-  WriteLength(GetParam(), sizeof(kNALU2), &buf);
-  buf.insert(buf.end(), kNALU2, kNALU2 + sizeof(kNALU2));
-
-  EXPECT_FALSE(AVC::ConvertFrameToAnnexB(GetParam(), &buf, NULL));
-}
-
-TEST_P(AVCConversionTest, SubsampleSizesUpdatedAfterAnnexBConversion) {
-  std::vector<uint8_t> buf;
-  std::vector<SubsampleEntry> subsamples;
-  SubsampleEntry subsample;
-
-  // Write the first subsample, consisting of only one NALU
-  WriteLength(GetParam(), sizeof(kNALU1), &buf);
-  buf.insert(buf.end(), kNALU1, kNALU1 + sizeof(kNALU1));
-
-  subsample.clear_bytes = GetParam() + sizeof(kNALU1);
-  subsample.cypher_bytes = 0;
-  subsamples.push_back(subsample);
-
-  // Write the second subsample, containing two NALUs
-  WriteLength(GetParam(), sizeof(kNALU1), &buf);
-  buf.insert(buf.end(), kNALU1, kNALU1 + sizeof(kNALU1));
-  WriteLength(GetParam(), sizeof(kNALU2), &buf);
-  buf.insert(buf.end(), kNALU2, kNALU2 + sizeof(kNALU2));
-
-  subsample.clear_bytes = 2 * GetParam() + sizeof(kNALU1) + sizeof(kNALU2);
-  subsample.cypher_bytes = 0;
-  subsamples.push_back(subsample);
-
-  // Write the third subsample, containing a single one-byte NALU
-  WriteLength(GetParam(), 1, &buf);
-  buf.push_back(0);
-  subsample.clear_bytes = GetParam() + 1;
-  subsample.cypher_bytes = 0;
-  subsamples.push_back(subsample);
-
-  EXPECT_TRUE(AVC::ConvertFrameToAnnexB(GetParam(), &buf, &subsamples));
-  EXPECT_EQ(subsamples.size(), 3u);
-  EXPECT_EQ(subsamples[0].clear_bytes, 4 + sizeof(kNALU1));
-  EXPECT_EQ(subsamples[0].cypher_bytes, 0u);
-  EXPECT_EQ(subsamples[1].clear_bytes, 8 + sizeof(kNALU1) + sizeof(kNALU2));
-  EXPECT_EQ(subsamples[1].cypher_bytes, 0u);
-  EXPECT_EQ(subsamples[2].clear_bytes, 4 + 1u);
-  EXPECT_EQ(subsamples[2].cypher_bytes, 0u);
-}
-
-TEST_P(AVCConversionTest, ParsePartial) {
-  std::vector<uint8_t> buf;
-  MakeInputForLength(GetParam(), &buf);
-  buf.pop_back();
-  EXPECT_FALSE(AVC::ConvertFrameToAnnexB(GetParam(), &buf, NULL));
-  // This tests a buffer ending in the middle of a NAL length. For length size
-  // of one, this can't happen, so we skip that case.
-  if (GetParam() != 1) {
-    MakeInputForLength(GetParam(), &buf);
-    buf.erase(buf.end() - (sizeof(kNALU2) + 1), buf.end());
-    EXPECT_FALSE(AVC::ConvertFrameToAnnexB(GetParam(), &buf, NULL));
-  }
-}
-
-TEST_P(AVCConversionTest, ParseEmpty) {
-  std::vector<uint8_t> buf;
-  EXPECT_TRUE(AVC::ConvertFrameToAnnexB(GetParam(), &buf, NULL));
-  EXPECT_EQ(0u, buf.size());
-}
-
-INSTANTIATE_TEST_CASE_P(AVCConversionTestValues, AVCConversionTest,
-                        ::testing::Values(1, 2, 4));
-
-TEST_F(AVCConversionTest, ConvertConfigToAnnexB) {
-  AVCDecoderConfigurationRecord avc_config;
-  avc_config.sps_list.resize(2);
-  avc_config.sps_list[0].push_back(0x67);
-  avc_config.sps_list[0].push_back(0x12);
-  avc_config.sps_list[1].push_back(0x67);
-  avc_config.sps_list[1].push_back(0x34);
-  avc_config.pps_list.resize(1);
-  avc_config.pps_list[0].push_back(0x68);
-  avc_config.pps_list[0].push_back(0x56);
-  avc_config.pps_list[0].push_back(0x78);
-
-  std::vector<uint8_t> buf;
-  std::vector<SubsampleEntry> subsamples;
-  EXPECT_TRUE(AVC::ConvertConfigToAnnexB(avc_config, &buf));
-  EXPECT_EQ(0, memcmp(kExpectedParamSets, &buf[0],
-                               sizeof(kExpectedParamSets)));
-  EXPECT_EQ("SPS,SPS,PPS", AnnexBToString(buf, subsamples));
-}
-
-// Verify that we can round trip string -> Annex B -> string.
-TEST_F(AVCConversionTest, StringConversionFunctions) {
-  std::string str = "AUD SPS SPSExt SPS PPS SEI SEI R14 I P FILL EOSeq EOStr";
-  std::vector<uint8_t> buf;
-  std::vector<SubsampleEntry> subsamples;
-  StringToAnnexB(str, &buf, &subsamples);
-  EXPECT_TRUE(AVC::IsValidAnnexB(buf, subsamples));
-
-  EXPECT_EQ(str, AnnexBToString(buf, subsamples));
-}
-
-TEST_F(AVCConversionTest, ValidAnnexBConstructs) {
-  const char* test_cases[] = {"I",
-                              "I I I I",
-                              "AUD I",
-                              "AUD SPS PPS I",
-                              "I EOSeq",
-                              "I EOSeq EOStr",
-                              "I EOStr",
-                              "P",
-                              "P P P P",
-                              "AUD SPS PPS P",
-                              "SEI SEI I",
-                              "SEI SEI R14 I",
-                              "SPS SPSExt SPS PPS I P",
-                              "R14 SEI I",
-                              "AUD,I",
-                              "AUD,SEI I",
-                              "AUD,SEI,SPS,PPS,I"};
-
-  for (size_t i = 0; i < arraysize(test_cases); ++i) {
-    std::vector<uint8_t> buf;
-    std::vector<SubsampleEntry> subsamples;
-    StringToAnnexB(test_cases[i], &buf, NULL);
-    EXPECT_TRUE(AVC::IsValidAnnexB(buf, subsamples))
-        << "'" << test_cases[i] << "' failed";
-  }
-}
-
-TEST_F(AVCConversionTest, InvalidAnnexBConstructs) {
-  static const char* test_cases[] = {
-      "AUD",               // No VCL present.
-      "AUD,SEI",           // No VCL present.
-      "SPS PPS",           // No VCL present.
-      "SPS PPS AUD I",     // Parameter sets must come after AUD.
-      "SPSExt SPS P",      // SPS must come before SPSExt.
-      "SPS PPS SPSExt P",  // SPSExt must follow an SPS.
-      "EOSeq",             // EOSeq must come after a VCL.
-      "EOStr",             // EOStr must come after a VCL.
-      "I EOStr EOSeq",     // EOSeq must come before EOStr.
-      "I R14",             // Reserved14-18 must come before first VCL.
-      "I SEI",             // SEI must come before first VCL.
-      "P SPS P",  // SPS after first VCL would indicate a new access unit.
-  };
-
-  for (size_t i = 0; i < arraysize(test_cases); ++i) {
-    std::vector<uint8_t> buf;
-    std::vector<SubsampleEntry> subsamples;
-    StringToAnnexB(test_cases[i], &buf, NULL);
-    EXPECT_FALSE(AVC::IsValidAnnexB(buf, subsamples))
-        << "'" << test_cases[i] << "' failed";
-  }
-}
-
-typedef struct {
-  const char* input;
-  const char* expected;
-} InsertTestCases;
-
-TEST_F(AVCConversionTest, InsertParamSetsAnnexB) {
-  static const InsertTestCases test_cases[] = {
-      {"I", "SPS,SPS,PPS,I"},
-      {"AUD I", "AUD SPS,SPS,PPS,I"},
-
-      // Cases where param sets in |avc_config| are placed before
-      // the existing ones.
-      {"SPS,PPS,I", "SPS,SPS,PPS,SPS,PPS,I"},
-      {"AUD,SPS,PPS,I", "AUD,SPS,SPS,PPS,SPS,PPS,I"},  // Note: params placed
-                                                       // after AUD.
-
-      // One or more NALUs might follow AUD in the first subsample, we need to
-      // handle this correctly. Params should be inserted right after AUD.
-      {"AUD,SEI I", "AUD,SPS,SPS,PPS,SEI I"},
-  };
-
-  AVCDecoderConfigurationRecord avc_config;
-  avc_config.sps_list.resize(2);
-  avc_config.sps_list[0].push_back(0x67);
-  avc_config.sps_list[0].push_back(0x12);
-  avc_config.sps_list[1].push_back(0x67);
-  avc_config.sps_list[1].push_back(0x34);
-  avc_config.pps_list.resize(1);
-  avc_config.pps_list[0].push_back(0x68);
-  avc_config.pps_list[0].push_back(0x56);
-  avc_config.pps_list[0].push_back(0x78);
-
-  for (size_t i = 0; i < arraysize(test_cases); ++i) {
-    std::vector<uint8_t> buf;
-    std::vector<SubsampleEntry> subsamples;
-
-    StringToAnnexB(test_cases[i].input, &buf, &subsamples);
-
-    EXPECT_TRUE(AVC::InsertParamSetsAnnexB(avc_config, &buf, &subsamples))
-        << "'" << test_cases[i].input << "' insert failed.";
-    EXPECT_TRUE(AVC::IsValidAnnexB(buf, subsamples))
-        << "'" << test_cases[i].input << "' created invalid AnnexB.";
-    EXPECT_EQ(test_cases[i].expected, AnnexBToString(buf, subsamples))
-        << "'" << test_cases[i].input << "' generated unexpected output.";
-  }
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/bitstream_converter.cc b/cobalt/media/formats/mp4/bitstream_converter.cc
deleted file mode 100644
index 78ba24a..0000000
--- a/cobalt/media/formats/mp4/bitstream_converter.cc
+++ /dev/null
@@ -1,15 +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 "cobalt/media/formats/mp4/bitstream_converter.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-BitstreamConverter::~BitstreamConverter() {}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/bitstream_converter.h b/cobalt/media/formats/mp4/bitstream_converter.h
deleted file mode 100644
index 00c9ccc..0000000
--- a/cobalt/media/formats/mp4/bitstream_converter.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 COBALT_MEDIA_FORMATS_MP4_BITSTREAM_CONVERTER_H_
-#define COBALT_MEDIA_FORMATS_MP4_BITSTREAM_CONVERTER_H_
-
-#include <vector>
-
-#include "base/memory/ref_counted.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-struct SubsampleEntry;
-
-namespace mp4 {
-
-// BitstreamConverter provides a unified interface for performing some common
-// bitstream conversions (e.g. H.264 MP4 bitstream to Annex B, and elementary
-// AAC stream to ADTS).
-class BitstreamConverter
-    : public base::RefCountedThreadSafe<BitstreamConverter> {
- public:
-  // Converts a single frame/buffer |frame_buf| into the output format.
-  // Returns true iff the conversion was successful.
-  // |frame_buf| is an input/output parameter, it contains input frame data and
-  // contains converted output data if conversion was successful.
-  // |is_keyframe| indicates whether it's a key frame or not.
-  // |subsamples| is an input/output parameter that contains CENC subsample
-  // information. The conversion code should |subsamples| to determine if parts
-  // of input frame are encrypted and should update |subsamples| if necessary,
-  // to make sure it correctly describes the converted output frame. See
-  // SubsampleEntry definition in media/base/decrypt_config.h for more info.
-  virtual bool ConvertFrame(std::vector<uint8_t>* frame_buf, bool is_keyframe,
-                            std::vector<SubsampleEntry>* subsamples) const = 0;
-
- protected:
-  friend class base::RefCountedThreadSafe<BitstreamConverter>;
-  virtual ~BitstreamConverter();
-};
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_BITSTREAM_CONVERTER_H_
diff --git a/cobalt/media/formats/mp4/box_definitions.cc b/cobalt/media/formats/mp4/box_definitions.cc
deleted file mode 100644
index 631b713..0000000
--- a/cobalt/media/formats/mp4/box_definitions.cc
+++ /dev/null
@@ -1,1370 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp4/box_definitions.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/media/base/video_types.h"
-#include "cobalt/media/base/video_util.h"
-#include "cobalt/media/filters/h264_parser.h"
-#include "cobalt/media/formats/mp4/avc.h"
-#include "cobalt/media/formats/mp4/es_descriptor.h"
-#include "cobalt/media/formats/mp4/hevc.h"
-#include "cobalt/media/formats/mp4/rcheck.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-namespace {
-
-const size_t kKeyIdSize = 16;
-
-// Read color coordinate value as defined in the MasteringDisplayColorVolume
-// ('mdcv') box.  Each coordinate is a float encoded in uint16_t, with upper
-// bound set to 50000.
-bool ReadMdcvColorCoordinate(BoxReader* reader,
-                             float* normalized_value_in_float) {
-  const float kColorCoordinateUpperBound = 50000.;
-
-  uint16_t value_in_uint16;
-  RCHECK(reader->Read2(&value_in_uint16));
-
-  float value_in_float = static_cast<float>(value_in_uint16);
-
-  if (value_in_float >= kColorCoordinateUpperBound) {
-    *normalized_value_in_float = 1.f;
-    return true;
-  }
-
-  *normalized_value_in_float = value_in_float / kColorCoordinateUpperBound;
-  return true;
-}
-
-}  // namespace
-
-FileType::FileType() {}
-FileType::~FileType() {}
-FourCC FileType::BoxType() const { return FOURCC_FTYP; }
-
-bool FileType::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFourCC(&major_brand) && reader->Read4(&minor_version));
-  size_t num_brands = (reader->size() - reader->pos()) / sizeof(FourCC);
-  return reader->SkipBytes(sizeof(FourCC) * num_brands);  // compatible_brands
-}
-
-ProtectionSystemSpecificHeader::ProtectionSystemSpecificHeader() {}
-ProtectionSystemSpecificHeader::~ProtectionSystemSpecificHeader() {}
-FourCC ProtectionSystemSpecificHeader::BoxType() const { return FOURCC_PSSH; }
-
-bool ProtectionSystemSpecificHeader::Parse(BoxReader* reader) {
-  // Don't bother validating the box's contents.
-  // Copy the entire box, including the header, for passing to EME as initData.
-  DCHECK(raw_box.empty());
-  raw_box.assign(reader->data(), reader->data() + reader->size());
-  return true;
-}
-
-FullProtectionSystemSpecificHeader::FullProtectionSystemSpecificHeader() {}
-FullProtectionSystemSpecificHeader::~FullProtectionSystemSpecificHeader() {}
-FourCC FullProtectionSystemSpecificHeader::BoxType() const {
-  return FOURCC_PSSH;
-}
-
-// The format of a 'pssh' box is as follows:
-//   unsigned int(32) size;
-//   unsigned int(32) type = "pssh";
-//   if (size==1) {
-//     unsigned int(64) largesize;
-//   } else if (size==0) {
-//     -- box extends to end of file
-//   }
-//   unsigned int(8) version;
-//   bit(24) flags;
-//   unsigned int(8)[16] SystemID;
-//   if (version > 0)
-//   {
-//     unsigned int(32) KID_count;
-//     {
-//       unsigned int(8)[16] KID;
-//     } [KID_count]
-//   }
-//   unsigned int(32) DataSize;
-//   unsigned int(8)[DataSize] Data;
-
-bool FullProtectionSystemSpecificHeader::Parse(mp4::BoxReader* reader) {
-  RCHECK(reader->type() == BoxType() && reader->ReadFullBoxHeader());
-
-  // Only versions 0 and 1 of the 'pssh' boxes are supported. Any other
-  // versions are ignored.
-  RCHECK(reader->version() == 0 || reader->version() == 1);
-  RCHECK(reader->flags() == 0);
-  RCHECK(reader->ReadVec(&system_id, 16));
-
-  if (reader->version() > 0) {
-    uint32_t kid_count;
-    RCHECK(reader->Read4(&kid_count));
-    for (uint32_t i = 0; i < kid_count; ++i) {
-      std::vector<uint8_t> kid;
-      RCHECK(reader->ReadVec(&kid, 16));
-      key_ids.push_back(kid);
-    }
-  }
-
-  uint32_t data_size;
-  RCHECK(reader->Read4(&data_size));
-  RCHECK(reader->ReadVec(&data, data_size));
-  return true;
-}
-
-SampleAuxiliaryInformationOffset::SampleAuxiliaryInformationOffset() {}
-SampleAuxiliaryInformationOffset::~SampleAuxiliaryInformationOffset() {}
-FourCC SampleAuxiliaryInformationOffset::BoxType() const { return FOURCC_SAIO; }
-
-bool SampleAuxiliaryInformationOffset::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader());
-  if (reader->flags() & 1) RCHECK(reader->SkipBytes(8));
-
-  uint32_t count;
-  RCHECK(reader->Read4(&count) &&
-         reader->HasBytes(count * (reader->version() == 1 ? 8 : 4)));
-  offsets.resize(count);
-
-  for (uint32_t i = 0; i < count; i++) {
-    if (reader->version() == 1) {
-      RCHECK(reader->Read8(&offsets[i]));
-    } else {
-      RCHECK(reader->Read4Into8(&offsets[i]));
-    }
-  }
-  return true;
-}
-
-SampleAuxiliaryInformationSize::SampleAuxiliaryInformationSize()
-    : default_sample_info_size(0), sample_count(0) {}
-SampleAuxiliaryInformationSize::~SampleAuxiliaryInformationSize() {}
-FourCC SampleAuxiliaryInformationSize::BoxType() const { return FOURCC_SAIZ; }
-
-bool SampleAuxiliaryInformationSize::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader());
-  if (reader->flags() & 1) RCHECK(reader->SkipBytes(8));
-
-  RCHECK(reader->Read1(&default_sample_info_size) &&
-         reader->Read4(&sample_count));
-  if (default_sample_info_size == 0)
-    return reader->ReadVec(&sample_info_sizes, sample_count);
-  return true;
-}
-
-SampleEncryptionEntry::SampleEncryptionEntry() {}
-SampleEncryptionEntry::~SampleEncryptionEntry() {}
-
-bool SampleEncryptionEntry::Parse(BufferReader* reader, uint8_t iv_size,
-                                  bool has_subsamples) {
-  // According to ISO/IEC FDIS 23001-7: CENC spec, IV should be either
-  // 64-bit (8-byte) or 128-bit (16-byte). The 3rd Edition allows |iv_size|
-  // to be 0, for the case of a "constant IV". In this case, the existence of
-  // the constant IV must be ensured by the caller.
-  RCHECK(iv_size == 0 || iv_size == 8 || iv_size == 16);
-
-  memset(initialization_vector, 0, sizeof(initialization_vector));
-  for (uint8_t i = 0; i < iv_size; i++)
-    RCHECK(reader->Read1(initialization_vector + i));
-
-  if (!has_subsamples) {
-    subsamples.clear();
-    return true;
-  }
-
-  uint16_t subsample_count;
-  RCHECK(reader->Read2(&subsample_count));
-  RCHECK(subsample_count > 0);
-  subsamples.resize(subsample_count);
-  for (size_t i = 0; i < subsamples.size(); ++i) {
-    uint16_t clear_bytes;
-    uint32_t cypher_bytes;
-    RCHECK(reader->Read2(&clear_bytes) && reader->Read4(&cypher_bytes));
-    subsamples[i].clear_bytes = clear_bytes;
-    subsamples[i].cypher_bytes = cypher_bytes;
-  }
-  return true;
-}
-
-bool SampleEncryptionEntry::GetTotalSizeOfSubsamples(size_t* total_size) const {
-  size_t size = 0;
-  for (size_t i = 0; i < subsamples.size(); ++i) {
-    size += subsamples[i].clear_bytes;
-    RCHECK(size >= subsamples[i].clear_bytes);  // overflow
-    size += subsamples[i].cypher_bytes;
-    RCHECK(size >= subsamples[i].cypher_bytes);  // overflow
-  }
-  *total_size = size;
-  return true;
-}
-
-SampleEncryption::SampleEncryption() : use_subsample_encryption(false) {}
-SampleEncryption::~SampleEncryption() {}
-FourCC SampleEncryption::BoxType() const { return FOURCC_SENC; }
-
-bool SampleEncryption::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader());
-  use_subsample_encryption = (reader->flags() & kUseSubsampleEncryption) != 0;
-  sample_encryption_data.assign(reader->data() + reader->pos(),
-                                reader->data() + reader->size());
-  return true;
-}
-
-OriginalFormat::OriginalFormat() : format(FOURCC_NULL) {}
-OriginalFormat::~OriginalFormat() {}
-FourCC OriginalFormat::BoxType() const { return FOURCC_FRMA; }
-
-bool OriginalFormat::Parse(BoxReader* reader) {
-  return reader->ReadFourCC(&format);
-}
-
-SchemeType::SchemeType() : type(FOURCC_NULL), version(0) {}
-SchemeType::~SchemeType() {}
-FourCC SchemeType::BoxType() const { return FOURCC_SCHM; }
-
-bool SchemeType::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader() && reader->ReadFourCC(&type) &&
-         reader->Read4(&version));
-  return true;
-}
-
-TrackEncryption::TrackEncryption()
-    : is_encrypted(false),
-      default_iv_size(0),
-      default_crypt_byte_block(0),
-      default_skip_byte_block(0),
-      default_constant_iv_size(0) {}
-TrackEncryption::~TrackEncryption() {}
-FourCC TrackEncryption::BoxType() const { return FOURCC_TENC; }
-
-bool TrackEncryption::Parse(BoxReader* reader) {
-  uint8_t flag;
-  uint8_t possible_pattern_info;
-  RCHECK(reader->ReadFullBoxHeader() &&
-         reader->SkipBytes(1) &&  // skip reserved byte
-         reader->Read1(&possible_pattern_info) && reader->Read1(&flag) &&
-         reader->Read1(&default_iv_size) &&
-         reader->ReadVec(&default_kid, kKeyIdSize));
-  is_encrypted = (flag != 0);
-  if (is_encrypted) {
-    if (reader->version() > 0) {
-      default_crypt_byte_block = (possible_pattern_info >> 4) & 0x0f;
-      default_skip_byte_block = possible_pattern_info & 0x0f;
-    }
-    if (default_iv_size == 0) {
-      RCHECK(reader->Read1(&default_constant_iv_size));
-      RCHECK(default_constant_iv_size == 8 || default_constant_iv_size == 16);
-      memset(default_constant_iv, 0, sizeof(default_constant_iv));
-      for (uint8_t i = 0; i < default_constant_iv_size; i++)
-        RCHECK(reader->Read1(default_constant_iv + i));
-    } else {
-      RCHECK(default_iv_size == 8 || default_iv_size == 16);
-    }
-  } else {
-    RCHECK(default_iv_size == 0);
-  }
-  return true;
-}
-
-SchemeInfo::SchemeInfo() {}
-SchemeInfo::~SchemeInfo() {}
-FourCC SchemeInfo::BoxType() const { return FOURCC_SCHI; }
-
-bool SchemeInfo::Parse(BoxReader* reader) {
-  return reader->ScanChildren() && reader->ReadChild(&track_encryption);
-}
-
-ProtectionSchemeInfo::ProtectionSchemeInfo() {}
-ProtectionSchemeInfo::~ProtectionSchemeInfo() {}
-FourCC ProtectionSchemeInfo::BoxType() const { return FOURCC_SINF; }
-
-bool ProtectionSchemeInfo::Parse(BoxReader* reader) {
-  RCHECK(reader->ScanChildren() && reader->ReadChild(&format) &&
-         reader->ReadChild(&type));
-  if (HasSupportedScheme()) RCHECK(reader->ReadChild(&info));
-  // Other protection schemes are silently ignored. Since the protection scheme
-  // type can't be determined until this box is opened, we return 'true' for
-  // unsupported protection schemes. It is the parent box's responsibility to
-  // ensure that this scheme type is a supported one.
-  return true;
-}
-
-bool ProtectionSchemeInfo::HasSupportedScheme() const {
-  FourCC four_cc = type.type;
-  if (four_cc == FOURCC_CENC) return true;
-  if (four_cc == FOURCC_CBCS) return true;
-  return false;
-}
-
-bool ProtectionSchemeInfo::IsCbcsEncryptionScheme() const {
-  FourCC four_cc = type.type;
-  return (four_cc == FOURCC_CBCS);
-}
-
-MovieHeader::MovieHeader()
-    : version(0),
-      creation_time(0),
-      modification_time(0),
-      timescale(0),
-      duration(0),
-      rate(-1),
-      volume(-1),
-      next_track_id(0) {}
-MovieHeader::~MovieHeader() {}
-FourCC MovieHeader::BoxType() const { return FOURCC_MVHD; }
-
-bool MovieHeader::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader());
-  version = reader->version();
-
-  if (version == 1) {
-    RCHECK(reader->Read8(&creation_time) && reader->Read8(&modification_time) &&
-           reader->Read4(&timescale) && reader->Read8(&duration));
-  } else {
-    RCHECK(reader->Read4Into8(&creation_time) &&
-           reader->Read4Into8(&modification_time) &&
-           reader->Read4(&timescale) && reader->Read4Into8(&duration));
-  }
-
-  RCHECK(reader->Read4s(&rate) && reader->Read2s(&volume) &&
-         reader->SkipBytes(10) &&  // reserved
-         reader->SkipBytes(36) &&  // matrix
-         reader->SkipBytes(24) &&  // predefined zero
-         reader->Read4(&next_track_id));
-  return true;
-}
-
-TrackHeader::TrackHeader()
-    : creation_time(0),
-      modification_time(0),
-      track_id(0),
-      duration(0),
-      layer(-1),
-      alternate_group(-1),
-      volume(-1),
-      width(0),
-      height(0) {}
-TrackHeader::~TrackHeader() {}
-FourCC TrackHeader::BoxType() const { return FOURCC_TKHD; }
-
-bool TrackHeader::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader());
-  if (reader->version() == 1) {
-    RCHECK(reader->Read8(&creation_time) && reader->Read8(&modification_time) &&
-           reader->Read4(&track_id) && reader->SkipBytes(4) &&  // reserved
-           reader->Read8(&duration));
-  } else {
-    RCHECK(reader->Read4Into8(&creation_time) &&
-           reader->Read4Into8(&modification_time) && reader->Read4(&track_id) &&
-           reader->SkipBytes(4) &&  // reserved
-           reader->Read4Into8(&duration));
-  }
-
-  RCHECK(reader->SkipBytes(8) &&  // reserved
-         reader->Read2s(&layer) && reader->Read2s(&alternate_group) &&
-         reader->Read2s(&volume) && reader->SkipBytes(2) &&  // reserved
-         reader->SkipBytes(36) &&                            // matrix
-         reader->Read4(&width) && reader->Read4(&height));
-
-  // Round width and height to the nearest number.
-  // Note: width and height are fixed-point 16.16 values. The following code
-  // rounds a.1x to a + 1, and a.0x to a.
-  width >>= 15;
-  width += 1;
-  width >>= 1;
-  height >>= 15;
-  height += 1;
-  height >>= 1;
-
-  return true;
-}
-
-SampleDescription::SampleDescription() : type(kInvalid) {}
-SampleDescription::~SampleDescription() {}
-FourCC SampleDescription::BoxType() const { return FOURCC_STSD; }
-
-bool SampleDescription::Parse(BoxReader* reader) {
-  uint32_t count;
-  RCHECK(reader->SkipBytes(4) && reader->Read4(&count));
-  video_entries.clear();
-  audio_entries.clear();
-
-  // Note: this value is preset before scanning begins. See comments in the
-  // Parse(Media*) function.
-  if (type == kVideo) {
-    RCHECK(reader->ReadAllChildren(&video_entries));
-  } else if (type == kAudio) {
-    RCHECK(reader->ReadAllChildren(&audio_entries));
-  }
-  return true;
-}
-
-SampleTable::SampleTable() {}
-SampleTable::~SampleTable() {}
-FourCC SampleTable::BoxType() const { return FOURCC_STBL; }
-
-bool SampleTable::Parse(BoxReader* reader) {
-  RCHECK(reader->ScanChildren() && reader->ReadChild(&description));
-  // There could be multiple SampleGroupDescription boxes with different
-  // grouping types. For common encryption, the relevant grouping type is
-  // 'seig'. Continue reading until 'seig' is found, or until running out of
-  // child boxes.
-  while (reader->HasChild(&sample_group_description)) {
-    RCHECK(reader->ReadChild(&sample_group_description));
-    if (sample_group_description.grouping_type == FOURCC_SEIG) break;
-    sample_group_description.entries.clear();
-  }
-  return true;
-}
-
-EditList::EditList() {}
-EditList::~EditList() {}
-FourCC EditList::BoxType() const { return FOURCC_ELST; }
-
-bool EditList::Parse(BoxReader* reader) {
-  uint32_t count;
-  RCHECK(reader->ReadFullBoxHeader() && reader->Read4(&count));
-
-  if (reader->version() == 1) {
-    RCHECK(reader->HasBytes(count * 20));
-  } else {
-    RCHECK(reader->HasBytes(count * 12));
-  }
-  edits.resize(count);
-
-  for (std::vector<EditListEntry>::iterator edit = edits.begin();
-       edit != edits.end(); ++edit) {
-    if (reader->version() == 1) {
-      RCHECK(reader->Read8(&edit->segment_duration) &&
-             reader->Read8s(&edit->media_time));
-    } else {
-      RCHECK(reader->Read4Into8(&edit->segment_duration) &&
-             reader->Read4sInto8s(&edit->media_time));
-    }
-    RCHECK(reader->Read2s(&edit->media_rate_integer) &&
-           reader->Read2s(&edit->media_rate_fraction));
-  }
-  return true;
-}
-
-Edit::Edit() {}
-Edit::~Edit() {}
-FourCC Edit::BoxType() const { return FOURCC_EDTS; }
-
-bool Edit::Parse(BoxReader* reader) {
-  return reader->ScanChildren() && reader->ReadChild(&list);
-}
-
-HandlerReference::HandlerReference() : type(kInvalid) {}
-HandlerReference::~HandlerReference() {}
-FourCC HandlerReference::BoxType() const { return FOURCC_HDLR; }
-
-bool HandlerReference::Parse(BoxReader* reader) {
-  FourCC hdlr_type;
-  RCHECK(reader->ReadFullBoxHeader() && reader->SkipBytes(4) &&
-         reader->ReadFourCC(&hdlr_type) && reader->SkipBytes(12));
-
-  // Now we should be at the beginning of the |name| field of HDLR box. The
-  // |name| is a zero-terminated ASCII string in ISO BMFF, but it was a
-  // Pascal-style counted string in older QT/Mov formats. So we'll read the
-  // remaining box bytes first, then if the last one is zero, we strip the last
-  // zero byte, otherwise we'll string the first byte (containing the length of
-  // the Pascal-style string).
-  std::vector<uint8_t> name_bytes;
-  RCHECK(reader->ReadVec(&name_bytes, reader->size() - reader->pos()));
-  if (name_bytes.size() == 0) {
-    name = "";
-  } else if (name_bytes.back() == 0) {
-    // This is a zero-terminated C-style string, exclude the last byte.
-    name = std::string(name_bytes.begin(), name_bytes.end() - 1);
-  } else {
-    // Check that the length of the Pascal-style string is correct.
-    RCHECK(name_bytes[0] == (name_bytes.size() - 1));
-    // Skip the first byte, containing the length of the Pascal-string.
-    name = std::string(name_bytes.begin() + 1, name_bytes.end());
-  }
-
-  if (hdlr_type == FOURCC_VIDE) {
-    type = kVideo;
-  } else if (hdlr_type == FOURCC_SOUN) {
-    type = kAudio;
-  } else if (hdlr_type == FOURCC_META || hdlr_type == FOURCC_SUBT ||
-             hdlr_type == FOURCC_TEXT || hdlr_type == FOURCC_SBTL) {
-    // For purposes of detection, we include 'sbtl' handler here. Note, though
-    // that ISO-14496-12 and its 2012 Amendment 2, and the spec for sourcing
-    // inband tracks all reference only 'text' or 'subt', and 14496-30
-    // references only 'subt'. Yet ffmpeg can encode subtitles as 'sbtl'.
-    type = kText;
-  } else {
-    type = kInvalid;
-  }
-  return true;
-}
-
-AVCDecoderConfigurationRecord::AVCDecoderConfigurationRecord()
-    : version(0),
-      profile_indication(0),
-      profile_compatibility(0),
-      avc_level(0),
-      length_size(0) {}
-AVCDecoderConfigurationRecord::~AVCDecoderConfigurationRecord() {}
-FourCC AVCDecoderConfigurationRecord::BoxType() const { return FOURCC_AVCC; }
-
-bool AVCDecoderConfigurationRecord::Parse(BoxReader* reader) {
-  return ParseInternal(reader, reader->media_log());
-}
-
-bool AVCDecoderConfigurationRecord::Parse(const uint8_t* data, int data_size) {
-  BufferReader reader(data, data_size);
-  return ParseInternal(&reader, new MediaLog());
-}
-
-bool AVCDecoderConfigurationRecord::ParseInternal(
-    BufferReader* reader, const scoped_refptr<MediaLog>& media_log) {
-  RCHECK(reader->Read1(&version) && version == 1 &&
-         reader->Read1(&profile_indication) &&
-         reader->Read1(&profile_compatibility) && reader->Read1(&avc_level));
-
-  uint8_t length_size_minus_one;
-  RCHECK(reader->Read1(&length_size_minus_one));
-  length_size = (length_size_minus_one & 0x3) + 1;
-
-  RCHECK(length_size != 3);  // Only values of 1, 2, and 4 are valid.
-
-  uint8_t num_sps;
-  RCHECK(reader->Read1(&num_sps));
-  num_sps &= 0x1f;
-
-  sps_list.resize(num_sps);
-  for (int i = 0; i < num_sps; i++) {
-    uint16_t sps_length;
-    RCHECK(reader->Read2(&sps_length) &&
-           reader->ReadVec(&sps_list[i], sps_length));
-    RCHECK(sps_list[i].size() > 4);
-
-    if (media_log.get()) {
-      MEDIA_LOG(INFO, media_log)
-          << "Video codec: avc1." << base::HexEncode(sps_list[i].data() + 1, 3);
-    }
-  }
-
-  uint8_t num_pps;
-  RCHECK(reader->Read1(&num_pps));
-
-  pps_list.resize(num_pps);
-  for (int i = 0; i < num_pps; i++) {
-    uint16_t pps_length;
-    RCHECK(reader->Read2(&pps_length) &&
-           reader->ReadVec(&pps_list[i], pps_length));
-  }
-
-  return true;
-}
-
-VPCodecConfigurationRecord::VPCodecConfigurationRecord()
-    : profile(VIDEO_CODEC_PROFILE_UNKNOWN) {}
-
-VPCodecConfigurationRecord::~VPCodecConfigurationRecord() {}
-
-FourCC VPCodecConfigurationRecord::BoxType() const { return FOURCC_VPCC; }
-
-bool VPCodecConfigurationRecord::Parse(BoxReader* reader) {
-  uint8_t profile_indication = 0;
-  RCHECK(reader->ReadFullBoxHeader() && reader->Read1(&profile_indication));
-  // The remaining fields are not parsed as we don't care about them for now.
-
-  switch (profile_indication) {
-    case 0:
-      profile = VP9PROFILE_PROFILE0;
-      break;
-    case 1:
-      profile = VP9PROFILE_PROFILE1;
-      break;
-    case 2:
-      profile = VP9PROFILE_PROFILE2;
-      break;
-    case 3:
-      profile = VP9PROFILE_PROFILE3;
-      break;
-    default:
-      MEDIA_LOG(ERROR, reader->media_log())
-          << "Unsupported VP9 profile: " << profile_indication;
-      return false;
-  }
-  return true;
-}
-
-AV1CodecConfigurationRecord::AV1CodecConfigurationRecord()
-    : profile(VIDEO_CODEC_PROFILE_UNKNOWN) {}
-
-AV1CodecConfigurationRecord::~AV1CodecConfigurationRecord() = default;
-
-FourCC AV1CodecConfigurationRecord::BoxType() const { return FOURCC_AV1C; }
-
-// Parse the AV1CodecConfigurationRecord, which has the following format:
-// unsigned int (1) marker = 1;
-// unsigned int (7) version = 1;
-// unsigned int (3) seq_profile;
-// unsigned int (5) seq_level_idx_0;
-// unsigned int (1) seq_tier_0;
-// unsigned int (1) high_bitdepth;
-// unsigned int (1) twelve_bit;
-// unsigned int (1) monochrome;
-// unsigned int (1) chroma_subsampling_x;
-// unsigned int (1) chroma_subsampling_y;
-// unsigned int (2) chroma_sample_position;
-// unsigned int (3) reserved = 0;
-//
-// unsigned int (1) initial_presentation_delay_present;
-// if (initial_presentation_delay_present) {
-//   unsigned int (4) initial_presentation_delay_minus_one;
-// } else {
-//   unsigned int (4) reserved = 0;
-// }
-//
-// unsigned int (8)[] configOBUs;
-bool AV1CodecConfigurationRecord::Parse(BoxReader* reader) {
-  uint8_t av1c_byte = 0;
-  RCHECK(reader->Read1(&av1c_byte));
-  const uint8_t av1c_marker = av1c_byte >> 7;
-  if (!av1c_marker) {
-    MEDIA_LOG(ERROR, reader->media_log()) << "Unsupported av1C: marker unset.";
-    return false;
-  }
-
-  const uint8_t av1c_version = av1c_byte & 0b01111111;
-  if (av1c_version != 1) {
-    MEDIA_LOG(ERROR, reader->media_log())
-        << "Unsupported av1C: unexpected version number: " << av1c_version;
-    return false;
-  }
-
-  RCHECK(reader->Read1(&av1c_byte));
-  const uint8_t seq_profile = av1c_byte >> 5;
-  switch (seq_profile) {
-    case 0:
-      profile = AV1PROFILE_PROFILE_MAIN;
-      break;
-    case 1:
-      profile = AV1PROFILE_PROFILE_HIGH;
-      break;
-    case 2:
-      profile = AV1PROFILE_PROFILE_PRO;
-      break;
-    default:
-      MEDIA_LOG(ERROR, reader->media_log())
-          << "Unsupported av1C: unknown profile 0x" << std::hex << seq_profile;
-      return false;
-  }
-
-  // The remaining fields are ignored since we don't care about them yet.
-  return true;
-}
-
-PixelAspectRatioBox::PixelAspectRatioBox() : h_spacing(1), v_spacing(1) {}
-PixelAspectRatioBox::~PixelAspectRatioBox() {}
-FourCC PixelAspectRatioBox::BoxType() const { return FOURCC_PASP; }
-
-bool PixelAspectRatioBox::Parse(BoxReader* reader) {
-  RCHECK(reader->Read4(&h_spacing) && reader->Read4(&v_spacing));
-  return true;
-}
-
-ColorParameterInformation::ColorParameterInformation() {}
-ColorParameterInformation::~ColorParameterInformation() {}
-FourCC ColorParameterInformation::BoxType() const { return FOURCC_COLR; }
-
-bool ColorParameterInformation::Parse(BoxReader* reader) {
-  FourCC type;
-  RCHECK(reader->ReadFourCC(&type));
-  // TODO: Support 'nclc', 'rICC', and 'prof'.
-  RCHECK(type == FOURCC_NCLX);
-
-  uint8_t full_range_byte;
-  RCHECK(reader->Read2(&colour_primaries) &&
-         reader->Read2(&transfer_characteristics) &&
-         reader->Read2(&matrix_coefficients) &&
-         reader->Read1(&full_range_byte));
-  full_range = full_range_byte & 0x80;
-
-  return true;
-}
-
-MasteringDisplayColorVolume::MasteringDisplayColorVolume() {}
-MasteringDisplayColorVolume::~MasteringDisplayColorVolume() {}
-FourCC MasteringDisplayColorVolume::BoxType() const { return FOURCC_MDCV; }
-
-bool MasteringDisplayColorVolume::Parse(BoxReader* reader) {
-  // Technically the color coordinates may be in any order.  The spec recommends
-  // GBR and it is assumed that the color coordinates are in such order.
-  RCHECK(ReadMdcvColorCoordinate(reader, &display_primaries_gx) &&
-         ReadMdcvColorCoordinate(reader, &display_primaries_gy) &&
-         ReadMdcvColorCoordinate(reader, &display_primaries_bx) &&
-         ReadMdcvColorCoordinate(reader, &display_primaries_by) &&
-         ReadMdcvColorCoordinate(reader, &display_primaries_rx) &&
-         ReadMdcvColorCoordinate(reader, &display_primaries_ry) &&
-         ReadMdcvColorCoordinate(reader, &white_point_x) &&
-         ReadMdcvColorCoordinate(reader, &white_point_y) &&
-         reader->Read4(&max_display_mastering_luminance) &&
-         reader->Read4(&min_display_mastering_luminance));
-
-  const uint32_t kUnitOfMasteringLuminance = 10000;
-  max_display_mastering_luminance /= kUnitOfMasteringLuminance;
-  min_display_mastering_luminance /= kUnitOfMasteringLuminance;
-
-  return true;
-}
-
-ContentLightLevelInformation::ContentLightLevelInformation() {}
-ContentLightLevelInformation::~ContentLightLevelInformation() {}
-FourCC ContentLightLevelInformation::BoxType() const { return FOURCC_CLLI; }
-
-bool ContentLightLevelInformation::Parse(BoxReader* reader) {
-  return reader->Read2(&max_content_light_level) &&
-         reader->Read2(&max_pic_average_light_level);
-}
-
-VideoSampleEntry::VideoSampleEntry()
-    : format(FOURCC_NULL),
-      data_reference_index(0),
-      width(0),
-      height(0),
-      video_codec(kUnknownVideoCodec),
-      video_codec_profile(VIDEO_CODEC_PROFILE_UNKNOWN) {}
-
-VideoSampleEntry::~VideoSampleEntry() {}
-FourCC VideoSampleEntry::BoxType() const {
-  DCHECK(false) << "VideoSampleEntry should be parsed according to the "
-                << "handler type recovered in its Media ancestor.";
-  return FOURCC_NULL;
-}
-
-bool VideoSampleEntry::Parse(BoxReader* reader) {
-  format = reader->type();
-  RCHECK(reader->SkipBytes(6) && reader->Read2(&data_reference_index) &&
-         reader->SkipBytes(16) && reader->Read2(&width) &&
-         reader->Read2(&height) && reader->SkipBytes(50));
-
-  RCHECK(reader->ScanChildren() && reader->MaybeReadChild(&pixel_aspect));
-
-  if (format == FOURCC_ENCV) {
-    // Continue scanning until a recognized protection scheme is found, or until
-    // we run out of protection schemes.
-    while (!sinf.HasSupportedScheme()) {
-      if (!reader->ReadChild(&sinf)) return false;
-    }
-  }
-
-  const FourCC actual_format =
-      format == FOURCC_ENCV ? sinf.format.format : format;
-  switch (actual_format) {
-    case FOURCC_AVC1:
-    case FOURCC_AVC3: {
-      DVLOG(2) << __FUNCTION__
-               << " reading AVCDecoderConfigurationRecord (avcC)";
-      std::unique_ptr<AVCDecoderConfigurationRecord> avcConfig(
-          new AVCDecoderConfigurationRecord());
-      RCHECK(reader->ReadChild(avcConfig.get()));
-      video_codec = kCodecH264;
-      video_codec_profile = H264Parser::ProfileIDCToVideoCodecProfile(
-          avcConfig->profile_indication);
-      frame_bitstream_converter =
-          base::WrapRefCounted(new AVCBitstreamConverter(std::move(avcConfig)));
-      break;
-    }
-    case FOURCC_HEV1:
-    case FOURCC_HVC1: {
-      DVLOG(2) << __FUNCTION__
-               << " parsing HEVCDecoderConfigurationRecord (hvcC)";
-      std::unique_ptr<HEVCDecoderConfigurationRecord> hevcConfig(
-          new HEVCDecoderConfigurationRecord());
-      RCHECK(reader->ReadChild(hevcConfig.get()));
-      video_codec = kCodecHEVC;
-      video_codec_profile = hevcConfig->GetVideoProfile();
-      frame_bitstream_converter = base::WrapRefCounted(
-          new HEVCBitstreamConverter(std::move(hevcConfig)));
-      break;
-    }
-    case FOURCC_VP09: {
-      DVLOG(2) << __func__ << " parsing VPCodecConfigurationRecord (vpcC)";
-      std::unique_ptr<VPCodecConfigurationRecord> vp_config(
-          new VPCodecConfigurationRecord());
-      RCHECK(reader->ReadChild(vp_config.get()));
-      frame_bitstream_converter = nullptr;
-      video_codec = kCodecVP9;
-      video_codec_profile = vp_config->profile;
-      break;
-    }
-    case FOURCC_AV01: {
-      DVLOG(2) << __func__ << " reading AV1 configuration.";
-      AV1CodecConfigurationRecord av1_config;
-      RCHECK(reader->ReadChild(&av1_config));
-      frame_bitstream_converter = nullptr;
-      video_codec = kCodecAV1;
-      video_codec_profile = av1_config.profile;
-
-      ColorParameterInformation color_parameter_information;
-      if (reader->HasChild(&color_parameter_information)) {
-        RCHECK(reader->ReadChild(&color_parameter_information));
-        this->color_parameter_information = color_parameter_information;
-      }
-
-      MasteringDisplayColorVolume mastering_display_color_volume;
-      if (reader->HasChild(&mastering_display_color_volume)) {
-        RCHECK(reader->ReadChild(&mastering_display_color_volume));
-        this->mastering_display_color_volume = mastering_display_color_volume;
-      }
-
-      ContentLightLevelInformation content_light_level_information;
-      if (reader->HasChild(&content_light_level_information)) {
-        RCHECK(reader->ReadChild(&content_light_level_information));
-        this->content_light_level_information = content_light_level_information;
-      }
-      break;
-    }
-    default:
-      // Unknown/unsupported format
-      MEDIA_LOG(ERROR, reader->media_log())
-          << __FUNCTION__ << " unsupported video format "
-          << FourCCToString(actual_format);
-      return false;
-  }
-
-  return true;
-}
-
-bool VideoSampleEntry::IsFormatValid() const {
-  const FourCC actual_format =
-      format == FOURCC_ENCV ? sinf.format.format : format;
-  switch (actual_format) {
-    case FOURCC_AVC1:
-    case FOURCC_AVC3:
-    case FOURCC_HEV1:
-    case FOURCC_HVC1:
-      return true;
-    case FOURCC_VP09:
-      return true;
-    case FOURCC_AV01:
-      return true;
-    default:
-      return false;
-  }
-}
-
-ElementaryStreamDescriptor::ElementaryStreamDescriptor()
-    : object_type(kForbidden) {}
-
-ElementaryStreamDescriptor::~ElementaryStreamDescriptor() {}
-
-FourCC ElementaryStreamDescriptor::BoxType() const { return FOURCC_ESDS; }
-
-bool ElementaryStreamDescriptor::Parse(BoxReader* reader) {
-  std::vector<uint8_t> data;
-  ESDescriptor es_desc;
-
-  RCHECK(reader->ReadFullBoxHeader());
-  RCHECK(reader->ReadVec(&data, reader->size() - reader->pos()));
-  RCHECK(es_desc.Parse(data));
-
-  object_type = es_desc.object_type();
-
-  if (object_type != 0x40) {
-    MEDIA_LOG(INFO, reader->media_log())
-        << "Audio codec: mp4a." << std::hex << static_cast<int>(object_type);
-  }
-
-  if (es_desc.IsAAC(object_type))
-    RCHECK(aac.Parse(es_desc.decoder_specific_info(), reader->media_log()));
-
-  return true;
-}
-
-AudioSampleEntry::AudioSampleEntry()
-    : format(FOURCC_NULL),
-      data_reference_index(0),
-      channelcount(0),
-      samplesize(0),
-      samplerate(0) {}
-
-AudioSampleEntry::~AudioSampleEntry() {}
-
-FourCC AudioSampleEntry::BoxType() const {
-  DCHECK(false) << "AudioSampleEntry should be parsed according to the "
-                << "handler type recovered in its Media ancestor.";
-  return FOURCC_NULL;
-}
-
-bool AudioSampleEntry::Parse(BoxReader* reader) {
-  format = reader->type();
-  RCHECK(reader->SkipBytes(6) && reader->Read2(&data_reference_index) &&
-         reader->SkipBytes(8) && reader->Read2(&channelcount) &&
-         reader->Read2(&samplesize) && reader->SkipBytes(4) &&
-         reader->Read4(&samplerate));
-  // Convert from 16.16 fixed point to integer
-  samplerate >>= 16;
-
-  RCHECK(reader->ScanChildren());
-  if (format == FOURCC_ENCA) {
-    // Continue scanning until a recognized protection scheme is found, or until
-    // we run out of protection schemes.
-    while (!sinf.HasSupportedScheme()) {
-      if (!reader->ReadChild(&sinf)) return false;
-    }
-  }
-
-  // ESDS is not valid in case of EAC3.
-  RCHECK(reader->MaybeReadChild(&esds));
-  return true;
-}
-
-MediaHeader::MediaHeader()
-    : creation_time(0),
-      modification_time(0),
-      timescale(0),
-      duration(0),
-      language_code(0) {}
-MediaHeader::~MediaHeader() {}
-FourCC MediaHeader::BoxType() const { return FOURCC_MDHD; }
-
-bool MediaHeader::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader());
-
-  if (reader->version() == 1) {
-    RCHECK(reader->Read8(&creation_time) && reader->Read8(&modification_time) &&
-           reader->Read4(&timescale) && reader->Read8(&duration) &&
-           reader->Read2(&language_code));
-  } else {
-    RCHECK(reader->Read4Into8(&creation_time) &&
-           reader->Read4Into8(&modification_time) &&
-           reader->Read4(&timescale) && reader->Read4Into8(&duration) &&
-           reader->Read2(&language_code));
-  }
-  // ISO 639-2/T language code only uses 15 lower bits, so reset the 16th bit.
-  language_code &= 0x7fff;
-  // Skip playback quality information
-  return reader->SkipBytes(2);
-}
-
-std::string MediaHeader::language() const {
-  if (language_code == 0x7fff || language_code < 0x400) {
-    return "und";
-  }
-  char lang_chars[4];
-  lang_chars[3] = 0;
-  lang_chars[2] = 0x60 + (language_code & 0x1f);
-  lang_chars[1] = 0x60 + ((language_code >> 5) & 0x1f);
-  lang_chars[0] = 0x60 + ((language_code >> 10) & 0x1f);
-
-  if (lang_chars[0] < 'a' || lang_chars[0] > 'z' || lang_chars[1] < 'a' ||
-      lang_chars[1] > 'z' || lang_chars[2] < 'a' || lang_chars[2] > 'z') {
-    // Got unexpected characters in ISO 639-2/T language code. Something must be
-    // wrong with the input file, report 'und' language to be safe.
-    DVLOG(2) << "Ignoring MDHD language_code (non ISO 639-2 compliant): "
-             << lang_chars;
-    lang_chars[0] = 'u';
-    lang_chars[1] = 'n';
-    lang_chars[2] = 'd';
-  }
-
-  return lang_chars;
-}
-
-MediaInformation::MediaInformation() {}
-MediaInformation::~MediaInformation() {}
-FourCC MediaInformation::BoxType() const { return FOURCC_MINF; }
-
-bool MediaInformation::Parse(BoxReader* reader) {
-  return reader->ScanChildren() && reader->ReadChild(&sample_table);
-}
-
-Media::Media() {}
-Media::~Media() {}
-FourCC Media::BoxType() const { return FOURCC_MDIA; }
-
-bool Media::Parse(BoxReader* reader) {
-  RCHECK(reader->ScanChildren() && reader->ReadChild(&header) &&
-         reader->ReadChild(&handler));
-
-  // Maddeningly, the HandlerReference box specifies how to parse the
-  // SampleDescription box, making the latter the only box (of those that we
-  // support) which cannot be parsed correctly on its own (or even with
-  // information from its strict ancestor tree). We thus copy the handler type
-  // to the sample description box *before* parsing it to provide this
-  // information while parsing.
-  information.sample_table.description.type = handler.type;
-  RCHECK(reader->ReadChild(&information));
-  return true;
-}
-
-Track::Track() {}
-Track::~Track() {}
-FourCC Track::BoxType() const { return FOURCC_TRAK; }
-
-bool Track::Parse(BoxReader* reader) {
-  RCHECK(reader->ScanChildren() && reader->ReadChild(&header) &&
-         reader->ReadChild(&media) && reader->MaybeReadChild(&edit));
-  return true;
-}
-
-MovieExtendsHeader::MovieExtendsHeader() : fragment_duration(0) {}
-MovieExtendsHeader::~MovieExtendsHeader() {}
-FourCC MovieExtendsHeader::BoxType() const { return FOURCC_MEHD; }
-
-bool MovieExtendsHeader::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader());
-  if (reader->version() == 1) {
-    RCHECK(reader->Read8(&fragment_duration));
-  } else {
-    RCHECK(reader->Read4Into8(&fragment_duration));
-  }
-  return true;
-}
-
-TrackExtends::TrackExtends()
-    : track_id(0),
-      default_sample_description_index(0),
-      default_sample_duration(0),
-      default_sample_size(0),
-      default_sample_flags(0) {}
-TrackExtends::~TrackExtends() {}
-FourCC TrackExtends::BoxType() const { return FOURCC_TREX; }
-
-bool TrackExtends::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader() && reader->Read4(&track_id) &&
-         reader->Read4(&default_sample_description_index) &&
-         reader->Read4(&default_sample_duration) &&
-         reader->Read4(&default_sample_size) &&
-         reader->Read4(&default_sample_flags));
-  return true;
-}
-
-MovieExtends::MovieExtends() {}
-MovieExtends::~MovieExtends() {}
-FourCC MovieExtends::BoxType() const { return FOURCC_MVEX; }
-
-bool MovieExtends::Parse(BoxReader* reader) {
-  header.fragment_duration = 0;
-  return reader->ScanChildren() && reader->MaybeReadChild(&header) &&
-         reader->ReadChildren(&tracks);
-}
-
-Movie::Movie() : fragmented(false) {}
-Movie::~Movie() {}
-FourCC Movie::BoxType() const { return FOURCC_MOOV; }
-
-bool Movie::Parse(BoxReader* reader) {
-  RCHECK(reader->ScanChildren() && reader->ReadChild(&header) &&
-         reader->ReadChildren(&tracks));
-
-  RCHECK_MEDIA_LOGGED(reader->ReadChild(&extends), reader->media_log(),
-                      "Detected unfragmented MP4. Media Source Extensions "
-                      "require ISO BMFF moov to contain mvex to indicate that "
-                      "Movie Fragments are to be expected.");
-
-  return reader->MaybeReadChildren(&pssh);
-}
-
-TrackFragmentDecodeTime::TrackFragmentDecodeTime() : decode_time(0) {}
-TrackFragmentDecodeTime::~TrackFragmentDecodeTime() {}
-FourCC TrackFragmentDecodeTime::BoxType() const { return FOURCC_TFDT; }
-
-bool TrackFragmentDecodeTime::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader());
-  if (reader->version() == 1)
-    return reader->Read8(&decode_time);
-  else
-    return reader->Read4Into8(&decode_time);
-}
-
-MovieFragmentHeader::MovieFragmentHeader() : sequence_number(0) {}
-MovieFragmentHeader::~MovieFragmentHeader() {}
-FourCC MovieFragmentHeader::BoxType() const { return FOURCC_MFHD; }
-
-bool MovieFragmentHeader::Parse(BoxReader* reader) {
-  return reader->SkipBytes(4) && reader->Read4(&sequence_number);
-}
-
-TrackFragmentHeader::TrackFragmentHeader()
-    : track_id(0),
-      sample_description_index(0),
-      default_sample_duration(0),
-      default_sample_size(0),
-      default_sample_flags(0),
-      has_default_sample_flags(false) {}
-
-TrackFragmentHeader::~TrackFragmentHeader() {}
-FourCC TrackFragmentHeader::BoxType() const { return FOURCC_TFHD; }
-
-bool TrackFragmentHeader::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader() && reader->Read4(&track_id));
-
-  // Media Source specific: reject tracks that set 'base-data-offset-present'.
-  // Although the Media Source requires that 'default-base-is-moof' (14496-12
-  // Amendment 2) be set, we omit this check as many otherwise-valid files in
-  // the wild don't set it.
-  //
-  //  RCHECK((flags & 0x020000) && !(flags & 0x1));
-  RCHECK(!(reader->flags() & 0x1));
-
-  if (reader->flags() & 0x2) {
-    RCHECK(reader->Read4(&sample_description_index));
-  } else {
-    sample_description_index = 0;
-  }
-
-  if (reader->flags() & 0x8) {
-    RCHECK(reader->Read4(&default_sample_duration));
-  } else {
-    default_sample_duration = 0;
-  }
-
-  if (reader->flags() & 0x10) {
-    RCHECK(reader->Read4(&default_sample_size));
-  } else {
-    default_sample_size = 0;
-  }
-
-  if (reader->flags() & 0x20) {
-    RCHECK(reader->Read4(&default_sample_flags));
-    has_default_sample_flags = true;
-  } else {
-    has_default_sample_flags = false;
-  }
-
-  return true;
-}
-
-TrackFragmentRun::TrackFragmentRun() : sample_count(0), data_offset(0) {}
-TrackFragmentRun::~TrackFragmentRun() {}
-FourCC TrackFragmentRun::BoxType() const { return FOURCC_TRUN; }
-
-bool TrackFragmentRun::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader() && reader->Read4(&sample_count));
-  const uint32_t flags = reader->flags();
-
-  bool data_offset_present = (flags & 0x1) != 0;
-  bool first_sample_flags_present = (flags & 0x4) != 0;
-  bool sample_duration_present = (flags & 0x100) != 0;
-  bool sample_size_present = (flags & 0x200) != 0;
-  bool sample_flags_present = (flags & 0x400) != 0;
-  bool sample_composition_time_offsets_present = (flags & 0x800) != 0;
-
-  if (data_offset_present) {
-    RCHECK(reader->Read4(&data_offset));
-  } else {
-    data_offset = 0;
-  }
-
-  uint32_t first_sample_flags = 0;
-  if (first_sample_flags_present) RCHECK(reader->Read4(&first_sample_flags));
-
-  int fields = sample_duration_present + sample_size_present +
-               sample_flags_present + sample_composition_time_offsets_present;
-  RCHECK(reader->HasBytes(fields * sample_count));
-
-  if (sample_duration_present) sample_durations.resize(sample_count);
-  if (sample_size_present) sample_sizes.resize(sample_count);
-  if (sample_flags_present) sample_flags.resize(sample_count);
-  if (sample_composition_time_offsets_present)
-    sample_composition_time_offsets.resize(sample_count);
-
-  for (uint32_t i = 0; i < sample_count; ++i) {
-    if (sample_duration_present) RCHECK(reader->Read4(&sample_durations[i]));
-    if (sample_size_present) RCHECK(reader->Read4(&sample_sizes[i]));
-    if (sample_flags_present) RCHECK(reader->Read4(&sample_flags[i]));
-    if (sample_composition_time_offsets_present)
-      RCHECK(reader->Read4s(&sample_composition_time_offsets[i]));
-  }
-
-  if (first_sample_flags_present) {
-    if (sample_flags.size() == 0) {
-      sample_flags.push_back(first_sample_flags);
-    } else {
-      sample_flags[0] = first_sample_flags;
-    }
-  }
-  return true;
-}
-
-SampleToGroup::SampleToGroup() : grouping_type(0), grouping_type_parameter(0) {}
-SampleToGroup::~SampleToGroup() {}
-FourCC SampleToGroup::BoxType() const { return FOURCC_SBGP; }
-
-bool SampleToGroup::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader() && reader->Read4(&grouping_type));
-
-  if (reader->version() == 1) RCHECK(reader->Read4(&grouping_type_parameter));
-
-  if (grouping_type != FOURCC_SEIG) {
-    DLOG(WARNING) << "SampleToGroup box with grouping_type '" << grouping_type
-                  << "' is not supported.";
-    return true;
-  }
-
-  uint32_t count;
-  RCHECK(reader->Read4(&count));
-  entries.resize(count);
-  for (uint32_t i = 0; i < count; ++i) {
-    RCHECK(reader->Read4(&entries[i].sample_count) &&
-           reader->Read4(&entries[i].group_description_index));
-  }
-  return true;
-}
-
-CencSampleEncryptionInfoEntry::CencSampleEncryptionInfoEntry()
-    : is_encrypted(false),
-      iv_size(0),
-      crypt_byte_block(0),
-      skip_byte_block(0),
-      constant_iv_size(0) {}
-CencSampleEncryptionInfoEntry::~CencSampleEncryptionInfoEntry() {}
-
-bool CencSampleEncryptionInfoEntry::Parse(BoxReader* reader) {
-  uint8_t flag;
-  uint8_t possible_pattern_info;
-  RCHECK(reader->SkipBytes(1) &&  // reserved.
-         reader->Read1(&possible_pattern_info) && reader->Read1(&flag) &&
-         reader->Read1(&iv_size) && reader->ReadVec(&key_id, kKeyIdSize));
-
-  is_encrypted = (flag != 0);
-  if (is_encrypted) {
-    crypt_byte_block = (possible_pattern_info >> 4) & 0x0f;
-    skip_byte_block = possible_pattern_info & 0x0f;
-    if (iv_size == 0) {
-      RCHECK(reader->Read1(&constant_iv_size));
-      RCHECK(constant_iv_size == 8 || constant_iv_size == 16);
-      memset(constant_iv, 0, sizeof(constant_iv));
-      for (uint8_t i = 0; i < constant_iv_size; i++)
-        RCHECK(reader->Read1(constant_iv + i));
-    } else {
-      RCHECK(iv_size == 8 || iv_size == 16);
-    }
-  } else {
-    RCHECK(iv_size == 0);
-  }
-  return true;
-}
-
-SampleGroupDescription::SampleGroupDescription() : grouping_type(0) {}
-SampleGroupDescription::~SampleGroupDescription() {}
-FourCC SampleGroupDescription::BoxType() const { return FOURCC_SGPD; }
-
-bool SampleGroupDescription::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader() && reader->Read4(&grouping_type));
-
-  if (grouping_type != FOURCC_SEIG) {
-    DLOG(WARNING) << "SampleGroupDescription box with grouping_type '"
-                  << grouping_type << "' is not supported.";
-    return true;
-  }
-
-  const uint8_t version = reader->version();
-
-  const size_t kEntrySize = sizeof(uint32_t) + kKeyIdSize;
-  uint32_t default_length = 0;
-  if (version == 1) {
-    RCHECK(reader->Read4(&default_length));
-    RCHECK(default_length == 0 || default_length >= kEntrySize);
-  }
-
-  uint32_t count;
-  RCHECK(reader->Read4(&count));
-  entries.resize(count);
-  for (uint32_t i = 0; i < count; ++i) {
-    if (version == 1) {
-      if (default_length == 0) {
-        uint32_t description_length = 0;
-        RCHECK(reader->Read4(&description_length));
-        RCHECK(description_length >= kEntrySize);
-      }
-    }
-    RCHECK(entries[i].Parse(reader));
-  }
-  return true;
-}
-
-TrackFragment::TrackFragment() {}
-TrackFragment::~TrackFragment() {}
-FourCC TrackFragment::BoxType() const { return FOURCC_TRAF; }
-
-bool TrackFragment::Parse(BoxReader* reader) {
-  RCHECK(reader->ScanChildren() && reader->ReadChild(&header) &&
-         // Media Source specific: 'tfdt' required
-         reader->ReadChild(&decode_time) && reader->MaybeReadChildren(&runs) &&
-         reader->MaybeReadChild(&auxiliary_offset) &&
-         reader->MaybeReadChild(&auxiliary_size) &&
-         reader->MaybeReadChild(&sdtp) &&
-         reader->MaybeReadChild(&sample_encryption));
-
-  // There could be multiple SampleGroupDescription and SampleToGroup boxes with
-  // different grouping types. For common encryption, the relevant grouping type
-  // is 'seig'. Continue reading until 'seig' is found, or until running out of
-  // child boxes.
-  while (reader->HasChild(&sample_group_description)) {
-    RCHECK(reader->ReadChild(&sample_group_description));
-    if (sample_group_description.grouping_type == FOURCC_SEIG) break;
-    sample_group_description.entries.clear();
-  }
-  while (reader->HasChild(&sample_to_group)) {
-    RCHECK(reader->ReadChild(&sample_to_group));
-    if (sample_to_group.grouping_type == FOURCC_SEIG) break;
-    sample_to_group.entries.clear();
-  }
-  return true;
-}
-
-MovieFragment::MovieFragment() {}
-MovieFragment::~MovieFragment() {}
-FourCC MovieFragment::BoxType() const { return FOURCC_MOOF; }
-
-bool MovieFragment::Parse(BoxReader* reader) {
-  RCHECK(reader->ScanChildren() && reader->ReadChild(&header) &&
-         reader->ReadChildren(&tracks) && reader->MaybeReadChildren(&pssh));
-  return true;
-}
-
-IndependentAndDisposableSamples::IndependentAndDisposableSamples() {}
-IndependentAndDisposableSamples::~IndependentAndDisposableSamples() {}
-FourCC IndependentAndDisposableSamples::BoxType() const { return FOURCC_SDTP; }
-
-bool IndependentAndDisposableSamples::Parse(BoxReader* reader) {
-  RCHECK(reader->ReadFullBoxHeader());
-  RCHECK(reader->version() == 0);
-  RCHECK(reader->flags() == 0);
-
-  int sample_count = reader->size() - reader->pos();
-  sample_depends_on_.resize(sample_count);
-  for (int i = 0; i < sample_count; ++i) {
-    uint8_t sample_info;
-    RCHECK(reader->Read1(&sample_info));
-
-    sample_depends_on_[i] =
-        static_cast<SampleDependsOn>((sample_info >> 4) & 0x3);
-
-    RCHECK(sample_depends_on_[i] != kSampleDependsOnReserved);
-  }
-
-  return true;
-}
-
-SampleDependsOn IndependentAndDisposableSamples::sample_depends_on(
-    size_t i) const {
-  if (i >= sample_depends_on_.size()) return kSampleDependsOnUnknown;
-
-  return sample_depends_on_[i];
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/box_definitions.h b/cobalt/media/formats/mp4/box_definitions.h
deleted file mode 100644
index c885df2..0000000
--- a/cobalt/media/formats/mp4/box_definitions.h
+++ /dev/null
@@ -1,539 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
-#define COBALT_MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
-
-#include <string>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/optional.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/video_codecs.h"
-#include "cobalt/media/formats/mp4/aac.h"
-#include "cobalt/media/formats/mp4/avc.h"
-#include "cobalt/media/formats/mp4/box_reader.h"
-#include "cobalt/media/formats/mp4/fourccs.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-// Size in bytes needed to store largest IV.
-const int kInitializationVectorSize = 16;
-
-enum TrackType { kInvalid = 0, kVideo, kAudio, kText, kHint };
-
-enum SampleFlags { kSampleIsNonSyncSample = 0x10000 };
-
-#define DECLARE_BOX_METHODS(T)            \
-  T();                                    \
-  ~T() override;                          \
-  bool Parse(BoxReader* reader) override; \
-  FourCC BoxType() const override;
-
-struct MEDIA_EXPORT FileType : Box {
-  DECLARE_BOX_METHODS(FileType);
-
-  FourCC major_brand;
-  uint32_t minor_version;
-};
-
-// If only copying the 'pssh' boxes, use ProtectionSystemSpecificHeader.
-// If access to the individual fields is needed, use
-// FullProtectionSystemSpecificHeader.
-struct MEDIA_EXPORT ProtectionSystemSpecificHeader : Box {
-  DECLARE_BOX_METHODS(ProtectionSystemSpecificHeader);
-
-  std::vector<uint8_t> raw_box;
-};
-
-struct MEDIA_EXPORT FullProtectionSystemSpecificHeader : Box {
-  DECLARE_BOX_METHODS(FullProtectionSystemSpecificHeader);
-
-  std::vector<uint8_t> system_id;
-  std::vector<std::vector<uint8_t> > key_ids;
-  std::vector<uint8_t> data;
-};
-
-struct MEDIA_EXPORT SampleAuxiliaryInformationOffset : Box {
-  DECLARE_BOX_METHODS(SampleAuxiliaryInformationOffset);
-
-  std::vector<uint64_t> offsets;
-};
-
-struct MEDIA_EXPORT SampleAuxiliaryInformationSize : Box {
-  DECLARE_BOX_METHODS(SampleAuxiliaryInformationSize);
-
-  uint8_t default_sample_info_size;
-  uint32_t sample_count;
-  std::vector<uint8_t> sample_info_sizes;
-};
-
-// Represent an entry in SampleEncryption box or CENC auxiliary info.
-struct MEDIA_EXPORT SampleEncryptionEntry {
-  SampleEncryptionEntry();
-  ~SampleEncryptionEntry();
-
-  // Parse SampleEncryptionEntry from |reader|.
-  // |iv_size| specifies the size of initialization vector. |has_subsamples|
-  // indicates whether this sample encryption entry contains subsamples.
-  // Returns false if parsing fails.
-  bool Parse(BufferReader* reader, uint8_t iv_size, bool has_subsamples);
-
-  // Get accumulated size of subsamples. Returns false if there is an overflow
-  // anywhere.
-  bool GetTotalSizeOfSubsamples(size_t* total_size) const;
-
-  uint8_t initialization_vector[kInitializationVectorSize];
-  std::vector<SubsampleEntry> subsamples;
-};
-
-// ISO/IEC 23001-7:2015 8.1.1.
-struct MEDIA_EXPORT SampleEncryption : Box {
-  enum SampleEncryptionFlags {
-    kUseSubsampleEncryption = 2,
-  };
-
-  DECLARE_BOX_METHODS(SampleEncryption);
-
-  bool use_subsample_encryption;
-  // We may not know |iv_size| before reading this box, so we store the box
-  // data for parsing later when |iv_size| is known.
-  std::vector<uint8_t> sample_encryption_data;
-};
-
-struct MEDIA_EXPORT OriginalFormat : Box {
-  DECLARE_BOX_METHODS(OriginalFormat);
-
-  FourCC format;
-};
-
-struct MEDIA_EXPORT SchemeType : Box {
-  DECLARE_BOX_METHODS(SchemeType);
-
-  FourCC type;
-  uint32_t version;
-};
-
-struct MEDIA_EXPORT TrackEncryption : Box {
-  DECLARE_BOX_METHODS(TrackEncryption);
-
-  // Note: this definition is specific to the CENC protection type.
-  bool is_encrypted;
-  uint8_t default_iv_size;
-  std::vector<uint8_t> default_kid;
-  uint8_t default_crypt_byte_block;
-  uint8_t default_skip_byte_block;
-  uint8_t default_constant_iv_size;
-  uint8_t default_constant_iv[kInitializationVectorSize];
-};
-
-struct MEDIA_EXPORT SchemeInfo : Box {
-  DECLARE_BOX_METHODS(SchemeInfo);
-
-  TrackEncryption track_encryption;
-};
-
-struct MEDIA_EXPORT ProtectionSchemeInfo : Box {
-  DECLARE_BOX_METHODS(ProtectionSchemeInfo);
-
-  OriginalFormat format;
-  SchemeType type;
-  SchemeInfo info;
-
-  bool HasSupportedScheme() const;
-  bool IsCbcsEncryptionScheme() const;
-};
-
-struct MEDIA_EXPORT MovieHeader : Box {
-  DECLARE_BOX_METHODS(MovieHeader);
-
-  uint8_t version;
-  uint64_t creation_time;
-  uint64_t modification_time;
-  uint32_t timescale;
-  uint64_t duration;
-  int32_t rate;
-  int16_t volume;
-  uint32_t next_track_id;
-};
-
-struct MEDIA_EXPORT TrackHeader : Box {
-  DECLARE_BOX_METHODS(TrackHeader);
-
-  uint64_t creation_time;
-  uint64_t modification_time;
-  uint32_t track_id;
-  uint64_t duration;
-  int16_t layer;
-  int16_t alternate_group;
-  int16_t volume;
-  uint32_t width;
-  uint32_t height;
-};
-
-struct MEDIA_EXPORT EditListEntry {
-  uint64_t segment_duration;
-  int64_t media_time;
-  int16_t media_rate_integer;
-  int16_t media_rate_fraction;
-};
-
-struct MEDIA_EXPORT EditList : Box {
-  DECLARE_BOX_METHODS(EditList);
-
-  std::vector<EditListEntry> edits;
-};
-
-struct MEDIA_EXPORT Edit : Box {
-  DECLARE_BOX_METHODS(Edit);
-
-  EditList list;
-};
-
-struct MEDIA_EXPORT HandlerReference : Box {
-  DECLARE_BOX_METHODS(HandlerReference);
-
-  TrackType type;
-  std::string name;
-};
-
-struct MEDIA_EXPORT AVCDecoderConfigurationRecord : Box {
-  DECLARE_BOX_METHODS(AVCDecoderConfigurationRecord);
-
-  // Parses AVCDecoderConfigurationRecord data encoded in |data|.
-  // Note: This method is intended to parse data outside the MP4StreamParser
-  //       context and therefore the box header is not expected to be present
-  //       in |data|.
-  // Returns true if |data| was successfully parsed.
-  bool Parse(const uint8_t* data, int data_size);
-
-  uint8_t version;
-  uint8_t profile_indication;
-  uint8_t profile_compatibility;
-  uint8_t avc_level;
-  uint8_t length_size;
-
-  typedef std::vector<uint8_t> SPS;
-  typedef std::vector<uint8_t> PPS;
-
-  std::vector<SPS> sps_list;
-  std::vector<PPS> pps_list;
-
- private:
-  bool ParseInternal(BufferReader* reader,
-                     const scoped_refptr<MediaLog>& media_log);
-};
-
-struct MEDIA_EXPORT VPCodecConfigurationRecord : Box {
-  DECLARE_BOX_METHODS(VPCodecConfigurationRecord);
-
-  VideoCodecProfile profile;
-};
-
-struct MEDIA_EXPORT AV1CodecConfigurationRecord : Box {
-  DECLARE_BOX_METHODS(AV1CodecConfigurationRecord);
-
-  VideoCodecProfile profile;
-};
-
-struct MEDIA_EXPORT PixelAspectRatioBox : Box {
-  DECLARE_BOX_METHODS(PixelAspectRatioBox);
-
-  uint32_t h_spacing;
-  uint32_t v_spacing;
-};
-
-struct MEDIA_EXPORT ColorParameterInformation : Box {
-  DECLARE_BOX_METHODS(ColorParameterInformation);
-
-  uint16 colour_primaries;
-  uint16 transfer_characteristics;
-  uint16 matrix_coefficients;
-  bool full_range;
-};
-
-struct MEDIA_EXPORT MasteringDisplayColorVolume : Box {
-  DECLARE_BOX_METHODS(MasteringDisplayColorVolume);
-
-  float display_primaries_gx;
-  float display_primaries_gy;
-  float display_primaries_bx;
-  float display_primaries_by;
-  float display_primaries_rx;
-  float display_primaries_ry;
-  float white_point_x;
-  float white_point_y;
-  uint32 max_display_mastering_luminance;
-  uint32 min_display_mastering_luminance;
-};
-
-struct MEDIA_EXPORT ContentLightLevelInformation : Box {
-  DECLARE_BOX_METHODS(ContentLightLevelInformation);
-
-  uint16 max_content_light_level;
-  uint16 max_pic_average_light_level;
-};
-
-struct MEDIA_EXPORT VideoSampleEntry : Box {
-  DECLARE_BOX_METHODS(VideoSampleEntry);
-
-  FourCC format;
-  uint16_t data_reference_index;
-  uint16_t width;
-  uint16_t height;
-
-  PixelAspectRatioBox pixel_aspect;
-  ProtectionSchemeInfo sinf;
-
-  VideoCodec video_codec;
-  VideoCodecProfile video_codec_profile;
-
-  base::Optional<ColorParameterInformation> color_parameter_information;
-  base::Optional<MasteringDisplayColorVolume> mastering_display_color_volume;
-  base::Optional<ContentLightLevelInformation> content_light_level_information;
-
-  bool IsFormatValid() const;
-
-  scoped_refptr<BitstreamConverter> frame_bitstream_converter;
-};
-
-struct MEDIA_EXPORT ElementaryStreamDescriptor : Box {
-  DECLARE_BOX_METHODS(ElementaryStreamDescriptor);
-
-  uint8_t object_type;
-  AAC aac;
-};
-
-struct MEDIA_EXPORT AudioSampleEntry : Box {
-  DECLARE_BOX_METHODS(AudioSampleEntry);
-
-  FourCC format;
-  uint16_t data_reference_index;
-  uint16_t channelcount;
-  uint16_t samplesize;
-  uint32_t samplerate;
-
-  ProtectionSchemeInfo sinf;
-  ElementaryStreamDescriptor esds;
-};
-
-struct MEDIA_EXPORT SampleDescription : Box {
-  DECLARE_BOX_METHODS(SampleDescription);
-
-  TrackType type;
-  std::vector<VideoSampleEntry> video_entries;
-  std::vector<AudioSampleEntry> audio_entries;
-};
-
-struct MEDIA_EXPORT CencSampleEncryptionInfoEntry {
-  CencSampleEncryptionInfoEntry();
-  ~CencSampleEncryptionInfoEntry();
-  bool Parse(BoxReader* reader);
-
-  bool is_encrypted;
-  uint8_t iv_size;
-  std::vector<uint8_t> key_id;
-  uint8_t crypt_byte_block;
-  uint8_t skip_byte_block;
-  uint8_t constant_iv_size;
-  uint8_t constant_iv[kInitializationVectorSize];
-};
-
-struct MEDIA_EXPORT SampleGroupDescription : Box {  // 'sgpd'.
-  DECLARE_BOX_METHODS(SampleGroupDescription);
-
-  uint32_t grouping_type;
-  std::vector<CencSampleEncryptionInfoEntry> entries;
-};
-
-struct MEDIA_EXPORT SampleTable : Box {
-  DECLARE_BOX_METHODS(SampleTable);
-
-  // Media Source specific: we ignore many of the sub-boxes in this box,
-  // including some that are required to be present in the BMFF spec. This
-  // includes the 'stts', 'stsc', and 'stco' boxes, which must contain no
-  // samples in order to be compliant files.
-  SampleDescription description;
-  SampleGroupDescription sample_group_description;
-};
-
-struct MEDIA_EXPORT MediaHeader : Box {
-  DECLARE_BOX_METHODS(MediaHeader);
-
-  std::string language() const;
-
-  uint64_t creation_time;
-  uint64_t modification_time;
-  uint32_t timescale;
-  uint64_t duration;
-  uint16_t language_code;
-};
-
-struct MEDIA_EXPORT MediaInformation : Box {
-  DECLARE_BOX_METHODS(MediaInformation);
-
-  SampleTable sample_table;
-};
-
-struct MEDIA_EXPORT Media : Box {
-  DECLARE_BOX_METHODS(Media);
-
-  MediaHeader header;
-  HandlerReference handler;
-  MediaInformation information;
-};
-
-struct MEDIA_EXPORT Track : Box {
-  DECLARE_BOX_METHODS(Track);
-
-  TrackHeader header;
-  Media media;
-  Edit edit;
-};
-
-struct MEDIA_EXPORT MovieExtendsHeader : Box {
-  DECLARE_BOX_METHODS(MovieExtendsHeader);
-
-  uint64_t fragment_duration;
-};
-
-struct MEDIA_EXPORT TrackExtends : Box {
-  DECLARE_BOX_METHODS(TrackExtends);
-
-  uint32_t track_id;
-  uint32_t default_sample_description_index;
-  uint32_t default_sample_duration;
-  uint32_t default_sample_size;
-  uint32_t default_sample_flags;
-};
-
-struct MEDIA_EXPORT MovieExtends : Box {
-  DECLARE_BOX_METHODS(MovieExtends);
-
-  MovieExtendsHeader header;
-  std::vector<TrackExtends> tracks;
-};
-
-struct MEDIA_EXPORT Movie : Box {
-  DECLARE_BOX_METHODS(Movie);
-
-  bool fragmented;
-  MovieHeader header;
-  MovieExtends extends;
-  std::vector<Track> tracks;
-  std::vector<ProtectionSystemSpecificHeader> pssh;
-};
-
-struct MEDIA_EXPORT TrackFragmentDecodeTime : Box {
-  DECLARE_BOX_METHODS(TrackFragmentDecodeTime);
-
-  uint64_t decode_time;
-};
-
-struct MEDIA_EXPORT MovieFragmentHeader : Box {
-  DECLARE_BOX_METHODS(MovieFragmentHeader);
-
-  uint32_t sequence_number;
-};
-
-struct MEDIA_EXPORT TrackFragmentHeader : Box {
-  DECLARE_BOX_METHODS(TrackFragmentHeader);
-
-  uint32_t track_id;
-
-  uint32_t sample_description_index;
-  uint32_t default_sample_duration;
-  uint32_t default_sample_size;
-  uint32_t default_sample_flags;
-
-  // As 'flags' might be all zero, we cannot use zeroness alone to identify
-  // when default_sample_flags wasn't specified, unlike the other values.
-  bool has_default_sample_flags;
-};
-
-struct MEDIA_EXPORT TrackFragmentRun : Box {
-  DECLARE_BOX_METHODS(TrackFragmentRun);
-
-  uint32_t sample_count;
-  uint32_t data_offset;
-  std::vector<uint32_t> sample_flags;
-  std::vector<uint32_t> sample_sizes;
-  std::vector<uint32_t> sample_durations;
-  std::vector<int32_t> sample_composition_time_offsets;
-};
-
-// sample_depends_on values in ISO/IEC 14496-12 Section 8.40.2.3.
-enum SampleDependsOn {
-  kSampleDependsOnUnknown = 0,
-  kSampleDependsOnOthers = 1,
-  kSampleDependsOnNoOther = 2,
-  kSampleDependsOnReserved = 3,
-};
-
-class MEDIA_EXPORT IndependentAndDisposableSamples : public Box {
- public:
-  DECLARE_BOX_METHODS(IndependentAndDisposableSamples);
-
-  // Returns the SampleDependsOn value for the |i|'th value
-  // in the track. If no data was parsed for the |i|'th sample,
-  // then |kSampleDependsOnUnknown| is returned.
-  SampleDependsOn sample_depends_on(size_t i) const;
-
- private:
-  std::vector<SampleDependsOn> sample_depends_on_;
-};
-
-struct MEDIA_EXPORT SampleToGroupEntry {
-  enum GroupDescriptionIndexBase {
-    kTrackGroupDescriptionIndexBase = 0,
-    kFragmentGroupDescriptionIndexBase = 0x10000,
-  };
-
-  uint32_t sample_count;
-  uint32_t group_description_index;
-};
-
-struct MEDIA_EXPORT SampleToGroup : Box {  // 'sbgp'.
-  DECLARE_BOX_METHODS(SampleToGroup);
-
-  uint32_t grouping_type;
-  uint32_t grouping_type_parameter;  // Version 1 only.
-  std::vector<SampleToGroupEntry> entries;
-};
-
-struct MEDIA_EXPORT TrackFragment : Box {
-  DECLARE_BOX_METHODS(TrackFragment);
-
-  TrackFragmentHeader header;
-  std::vector<TrackFragmentRun> runs;
-  TrackFragmentDecodeTime decode_time;
-  SampleAuxiliaryInformationOffset auxiliary_offset;
-  SampleAuxiliaryInformationSize auxiliary_size;
-  IndependentAndDisposableSamples sdtp;
-  SampleGroupDescription sample_group_description;
-  SampleToGroup sample_to_group;
-  SampleEncryption sample_encryption;
-};
-
-struct MEDIA_EXPORT MovieFragment : Box {
-  DECLARE_BOX_METHODS(MovieFragment);
-
-  MovieFragmentHeader header;
-  std::vector<TrackFragment> tracks;
-  std::vector<ProtectionSystemSpecificHeader> pssh;
-};
-
-#undef DECLARE_BOX
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
diff --git a/cobalt/media/formats/mp4/box_reader.cc b/cobalt/media/formats/mp4/box_reader.cc
deleted file mode 100644
index 5d83fe3..0000000
--- a/cobalt/media/formats/mp4/box_reader.cc
+++ /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.
-
-#include "cobalt/media/formats/mp4/box_reader.h"
-
-#include <string.h>
-
-#include <algorithm>
-#include <memory>
-#include <set>
-#include <utility>
-
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-Box::~Box() {}
-
-bool BufferReader::Read1(uint8_t* v) {
-  RCHECK(HasBytes(1));
-  *v = buf_[pos_++];
-  return true;
-}
-
-// Internal implementation of multi-byte reads
-template <typename T>
-bool BufferReader::Read(T* v) {
-  RCHECK(HasBytes(sizeof(T)));
-
-  T tmp = 0;
-  for (size_t i = 0; i < sizeof(T); i++) {
-    tmp <<= 8;
-    tmp += buf_[pos_++];
-  }
-  *v = tmp;
-  return true;
-}
-
-bool BufferReader::Read2(uint16_t* v) { return Read(v); }
-bool BufferReader::Read2s(int16_t* v) { return Read(v); }
-bool BufferReader::Read4(uint32_t* v) { return Read(v); }
-bool BufferReader::Read4s(int32_t* v) { return Read(v); }
-bool BufferReader::Read8(uint64_t* v) { return Read(v); }
-bool BufferReader::Read8s(int64_t* v) { return Read(v); }
-
-bool BufferReader::ReadFourCC(FourCC* v) {
-  return Read4(reinterpret_cast<uint32_t*>(v));
-}
-
-bool BufferReader::ReadVec(std::vector<uint8_t>* vec, uint64_t count) {
-  RCHECK(HasBytes(count));
-  vec->clear();
-  vec->insert(vec->end(), buf_ + pos_, buf_ + pos_ + count);
-  pos_ += count;
-  return true;
-}
-
-bool BufferReader::SkipBytes(uint64_t bytes) {
-  RCHECK(HasBytes(bytes));
-  pos_ += bytes;
-  return true;
-}
-
-bool BufferReader::Read4Into8(uint64_t* v) {
-  uint32_t tmp;
-  RCHECK(Read4(&tmp));
-  *v = tmp;
-  return true;
-}
-
-bool BufferReader::Read4sInto8s(int64_t* v) {
-  // Beware of the need for sign extension.
-  int32_t tmp;
-  RCHECK(Read4s(&tmp));
-  *v = tmp;
-  return true;
-}
-
-BoxReader::BoxReader(const uint8_t* buf, const int size,
-                     const scoped_refptr<MediaLog>& media_log, bool is_EOS)
-    : BufferReader(buf, size),
-      media_log_(media_log),
-      type_(FOURCC_NULL),
-      version_(0),
-      flags_(0),
-      scanned_(false),
-      is_EOS_(is_EOS) {}
-
-BoxReader::~BoxReader() {
-  if (scanned_ && !children_.empty()) {
-    for (ChildMap::iterator itr = children_.begin(); itr != children_.end();
-         ++itr) {
-      DVLOG(1) << "Skipping unknown box: " << FourCCToString(itr->first);
-    }
-  }
-}
-
-// static
-BoxReader* BoxReader::ReadTopLevelBox(const uint8_t* buf, const int buf_size,
-                                      const scoped_refptr<MediaLog>& media_log,
-                                      bool* err) {
-  std::unique_ptr<BoxReader> reader(
-      new BoxReader(buf, buf_size, media_log, false));
-  if (!reader->ReadHeader(err)) return NULL;
-
-  if (!IsValidTopLevelBox(reader->type(), media_log)) {
-    *err = true;
-    return NULL;
-  }
-
-  if (reader->size() <= static_cast<uint64_t>(buf_size))
-    return reader.release();
-
-  return NULL;
-}
-
-// static
-bool BoxReader::StartTopLevelBox(const uint8_t* buf, const int buf_size,
-                                 const scoped_refptr<MediaLog>& media_log,
-                                 FourCC* type, int* box_size, bool* err) {
-  BoxReader reader(buf, buf_size, media_log, false);
-  if (!reader.ReadHeader(err)) return false;
-  if (!IsValidTopLevelBox(reader.type(), media_log)) {
-    *err = true;
-    return false;
-  }
-  *type = reader.type();
-  *box_size = reader.size();
-  return true;
-}
-
-// static
-BoxReader* BoxReader::ReadConcatentatedBoxes(const uint8_t* buf,
-                                             const int buf_size) {
-  return new BoxReader(buf, buf_size, new MediaLog(), true);
-}
-
-// static
-bool BoxReader::IsValidTopLevelBox(const FourCC& type,
-                                   const scoped_refptr<MediaLog>& media_log) {
-  switch (type) {
-    case FOURCC_FTYP:
-    case FOURCC_PDIN:
-    case FOURCC_BLOC:
-    case FOURCC_MOOV:
-    case FOURCC_MOOF:
-    case FOURCC_MFRA:
-    case FOURCC_MDAT:
-    case FOURCC_FREE:
-    case FOURCC_SKIP:
-    case FOURCC_META:
-    case FOURCC_MECO:
-    case FOURCC_STYP:
-    case FOURCC_SIDX:
-    case FOURCC_SSIX:
-    case FOURCC_PRFT:
-    case FOURCC_UUID:
-    case FOURCC_EMSG:
-      return true;
-    default:
-      // Hex is used to show nonprintable characters and aid in debugging
-      MEDIA_LOG(DEBUG, media_log)
-          << "Unrecognized top-level box type " << FourCCToString(type);
-      return false;
-  }
-}
-
-bool BoxReader::ScanChildren() {
-  DCHECK(!scanned_);
-  scanned_ = true;
-
-  bool err = false;
-  while (pos_ < size_) {
-    BoxReader child(&buf_[pos_], size_ - pos_, media_log_, is_EOS_);
-    if (!child.ReadHeader(&err)) break;
-
-    children_.insert(std::pair<FourCC, BoxReader>(child.type(), child));
-    pos_ += child.size();
-  }
-
-  DCHECK(!err);
-  return !err && pos_ == size_;
-}
-
-bool BoxReader::HasChild(Box* child) {
-  DCHECK(scanned_);
-  DCHECK(child);
-  return children_.count(child->BoxType()) > 0;
-}
-
-bool BoxReader::ReadChild(Box* child) {
-  DCHECK(scanned_);
-  FourCC child_type = child->BoxType();
-
-  ChildMap::iterator itr = children_.find(child_type);
-  RCHECK(itr != children_.end());
-  DVLOG(2) << "Found a " << FourCCToString(child_type) << " box.";
-  RCHECK(child->Parse(&itr->second));
-  children_.erase(itr);
-  return true;
-}
-
-bool BoxReader::MaybeReadChild(Box* child) {
-  if (!children_.count(child->BoxType())) return true;
-  return ReadChild(child);
-}
-
-bool BoxReader::ReadFullBoxHeader() {
-  uint32_t vflags;
-  RCHECK(Read4(&vflags));
-  version_ = vflags >> 24;
-  flags_ = vflags & 0xffffff;
-  return true;
-}
-
-bool BoxReader::ReadHeader(bool* err) {
-  uint64_t size = 0;
-  *err = false;
-
-  if (!HasBytes(8)) {
-    // If EOS is known, then this is an error. If not, additional data may be
-    // appended later, so this is a soft error.
-    *err = is_EOS_;
-    return false;
-  }
-  CHECK(Read4Into8(&size) && ReadFourCC(&type_));
-
-  if (size == 0) {
-    if (is_EOS_) {
-      // All the data bytes are expected to be provided.
-      size = size_;
-    } else {
-      MEDIA_LOG(DEBUG, media_log_)
-          << "ISO BMFF boxes that run to EOS are not supported";
-      *err = true;
-      return false;
-    }
-  } else if (size == 1) {
-    if (!HasBytes(8)) {
-      // If EOS is known, then this is an error. If not, it's a soft error.
-      *err = is_EOS_;
-      return false;
-    }
-    CHECK(Read8(&size));
-  }
-
-  // Implementation-specific: support for boxes larger than 2^31 has been
-  // removed.
-  if (size < static_cast<uint64_t>(pos_) ||
-      size > static_cast<uint64_t>(std::numeric_limits<int32_t>::max())) {
-    *err = true;
-    return false;
-  }
-
-  // Make sure the buffer contains at least the expected number of bytes.
-  // Since the data may be appended in pieces, this can only be checked if EOS.
-  if (is_EOS_ && size > size_) {
-    *err = true;
-    return false;
-  }
-
-  // Note that the pos_ head has advanced to the byte immediately after the
-  // header, which is where we want it.
-  size_ = size;
-  return true;
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/box_reader.h b/cobalt/media/formats/mp4/box_reader.h
deleted file mode 100644
index 0be7186..0000000
--- a/cobalt/media/formats/mp4/box_reader.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP4_BOX_READER_H_
-#define COBALT_MEDIA_FORMATS_MP4_BOX_READER_H_
-
-#include <limits>
-#include <map>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/formats/mp4/fourccs.h"
-#include "cobalt/media/formats/mp4/rcheck.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-class BoxReader;
-
-struct MEDIA_EXPORT Box {
-  virtual ~Box();
-
-  // Parse errors may be logged using the BoxReader's media log.
-  virtual bool Parse(BoxReader* reader) = 0;
-
-  virtual FourCC BoxType() const = 0;
-};
-
-class MEDIA_EXPORT BufferReader {
- public:
-  BufferReader(const uint8_t* buf, const int size) : buf_(buf), pos_(0) {
-    CHECK(buf);
-    CHECK_GE(size, 0);
-    size_ = size;
-  }
-
-  bool HasBytes(uint64_t count) {
-    // As the size of a box is implementation limited to 2^31, fail if
-    // attempting to check for too many bytes.
-    return (pos_ <= size_ &&
-            count <
-                static_cast<uint64_t>(std::numeric_limits<int32_t>::max()) &&
-            size_ - pos_ >= count);
-  }
-
-  // Read a value from the stream, performing endian correction, and advance the
-  // stream pointer.
-  bool Read1(uint8_t* v) WARN_UNUSED_RESULT;
-  bool Read2(uint16_t* v) WARN_UNUSED_RESULT;
-  bool Read2s(int16_t* v) WARN_UNUSED_RESULT;
-  bool Read4(uint32_t* v) WARN_UNUSED_RESULT;
-  bool Read4s(int32_t* v) WARN_UNUSED_RESULT;
-  bool Read8(uint64_t* v) WARN_UNUSED_RESULT;
-  bool Read8s(int64_t* v) WARN_UNUSED_RESULT;
-
-  bool ReadFourCC(FourCC* v) WARN_UNUSED_RESULT;
-
-  bool ReadVec(std::vector<uint8_t>* t, uint64_t count) WARN_UNUSED_RESULT;
-
-  // These variants read a 4-byte integer of the corresponding signedness and
-  // store it in the 8-byte return type.
-  bool Read4Into8(uint64_t* v) WARN_UNUSED_RESULT;
-  bool Read4sInto8s(int64_t* v) WARN_UNUSED_RESULT;
-
-  // Advance the stream by this many bytes.
-  bool SkipBytes(uint64_t nbytes) WARN_UNUSED_RESULT;
-
-  const uint8_t* data() const { return buf_; }
-
-  // This returns the size of the box as specified in the box header. Initially
-  // it is the buffer size until the header is read. Note that the size
-  // specified in the box header may be different than the number of bytes
-  // actually provided.
-  uint64_t size() const { return size_; }
-  uint64_t pos() const { return pos_; }
-
- protected:
-  const uint8_t* buf_;
-  uint64_t size_;
-  uint64_t pos_;
-
-  template <typename T>
-  bool Read(T* t) WARN_UNUSED_RESULT;
-};
-
-class MEDIA_EXPORT BoxReader : public BufferReader {
- public:
-  ~BoxReader();
-
-  // Create a BoxReader from a buffer. Note that this function may return NULL
-  // if an intact, complete box was not available in the buffer. If |*err| is
-  // set, there was a stream-level error when creating the box; otherwise, NULL
-  // values are only expected when insufficient data is available.
-  //
-  // |buf| is retained but not owned, and must outlive the BoxReader instance.
-  static BoxReader* ReadTopLevelBox(const uint8_t* buf, const int buf_size,
-                                    const scoped_refptr<MediaLog>& media_log,
-                                    bool* err);
-
-  // Read the box header from the current buffer. This function returns true if
-  // there is enough data to read the header and the header is sane; that is, it
-  // does not check to ensure the entire box is in the buffer before returning
-  // true. The semantics of |*err| are the same as above.
-  //
-  // |buf| is not retained.
-  static bool StartTopLevelBox(const uint8_t* buf, const int buf_size,
-                               const scoped_refptr<MediaLog>& media_log,
-                               FourCC* type, int* box_size,
-                               bool* err) WARN_UNUSED_RESULT;
-
-  // Create a BoxReader from a buffer. |buf| must be the complete buffer, as
-  // errors are returned when sufficient data is not available. |buf| can start
-  // with any type of box -- it does not have to be IsValidTopLevelBox().
-  //
-  // |buf| is retained but not owned, and must outlive the BoxReader instance.
-  static BoxReader* ReadConcatentatedBoxes(const uint8_t* buf,
-                                           const int buf_size);
-
-  // Returns true if |type| is recognized to be a top-level box, false
-  // otherwise. This returns true for some boxes which we do not parse.
-  // Helpful in debugging misaligned appends.
-  static bool IsValidTopLevelBox(const FourCC& type,
-                                 const scoped_refptr<MediaLog>& media_log);
-
-  // Scan through all boxes within the current box, starting at the current
-  // buffer position. Must be called before any of the *Child functions work.
-  bool ScanChildren() WARN_UNUSED_RESULT;
-
-  // Return true if child with type |child.BoxType()| exists.
-  bool HasChild(Box* child) WARN_UNUSED_RESULT;
-
-  // Read exactly one child box from the set of children. The type of the child
-  // will be determined by the BoxType() method of |child|.
-  bool ReadChild(Box* child) WARN_UNUSED_RESULT;
-
-  // Read one child if available. Returns false on error, true on successful
-  // read or on child absent.
-  bool MaybeReadChild(Box* child) WARN_UNUSED_RESULT;
-
-  // Read at least one child. False means error or no such child present.
-  template <typename T>
-  bool ReadChildren(std::vector<T>* children) WARN_UNUSED_RESULT;
-
-  // Read any number of children. False means error.
-  template <typename T>
-  bool MaybeReadChildren(std::vector<T>* children) WARN_UNUSED_RESULT;
-
-  // Read all children, regardless of FourCC. This is used from exactly one box,
-  // corresponding to a rather significant inconsistency in the BMFF spec.
-  // Note that this method is mutually exclusive with ScanChildren() and
-  // ReadAllChildrenAndCheckFourCC().
-  template <typename T>
-  bool ReadAllChildren(std::vector<T>* children) WARN_UNUSED_RESULT;
-
-  // Read all children and verify that the FourCC matches what is expected.
-  // Returns true if all children are successfully parsed and have the correct
-  // box type for |T|. Note that this method is mutually exclusive with
-  // ScanChildren() and ReadAllChildren().
-  template <typename T>
-  bool ReadAllChildrenAndCheckFourCC(std::vector<T>* children)
-      WARN_UNUSED_RESULT;
-
-  // Populate the values of 'version()' and 'flags()' from a full box header.
-  // Many boxes, but not all, use these values. This call should happen after
-  // the box has been initialized, and does not re-read the main box header.
-  bool ReadFullBoxHeader() WARN_UNUSED_RESULT;
-
-  FourCC type() const { return type_; }
-  uint8_t version() const { return version_; }
-  uint32_t flags() const { return flags_; }
-
-  const scoped_refptr<MediaLog>& media_log() const { return media_log_; }
-
- private:
-  // Create a BoxReader from |buf|. |is_EOS| should be true if |buf| is
-  // complete stream (i.e. no additional data is expected to be appended).
-  BoxReader(const uint8_t* buf, const int size,
-            const scoped_refptr<MediaLog>& media_log, bool is_EOS);
-
-  // Must be called immediately after init. If the return is false, this
-  // indicates that the box header and its contents were not available in the
-  // stream or were nonsensical, and that the box must not be used further. In
-  // this case, if |*err| is false, the problem was simply a lack of data, and
-  // should only be an error condition if some higher-level component knows that
-  // no more data is coming (i.e. EOS or end of containing box). If |*err| is
-  // true, the error is unrecoverable and the stream should be aborted.
-  bool ReadHeader(bool* err);
-
-  // Read all children, optionally checking FourCC. Returns true if all
-  // children are successfully parsed and, if |check_box_type|, have the
-  // correct box type for |T|. Note that this method is mutually exclusive
-  // with ScanChildren().
-  template <typename T>
-  bool ReadAllChildrenInternal(std::vector<T>* children, bool check_box_type);
-
-  scoped_refptr<MediaLog> media_log_;
-  FourCC type_;
-  uint8_t version_;
-  uint32_t flags_;
-
-  typedef std::multimap<FourCC, BoxReader> ChildMap;
-
-  // The set of child box FourCCs and their corresponding buffer readers. Only
-  // valid if scanned_ is true.
-  ChildMap children_;
-  bool scanned_;
-
-  // True if the buffer provided to the reader is the complete stream.
-  bool is_EOS_;
-};
-
-// Template definitions
-template <typename T>
-bool BoxReader::ReadChildren(std::vector<T>* children) {
-  RCHECK(MaybeReadChildren(children) && !children->empty());
-  return true;
-}
-
-template <typename T>
-bool BoxReader::MaybeReadChildren(std::vector<T>* children) {
-  DCHECK(scanned_);
-  DCHECK(children->empty());
-
-  children->resize(1);
-  FourCC child_type = (*children)[0].BoxType();
-
-  ChildMap::iterator start_itr = children_.lower_bound(child_type);
-  ChildMap::iterator end_itr = children_.upper_bound(child_type);
-  children->resize(std::distance(start_itr, end_itr));
-  typename std::vector<T>::iterator child_itr = children->begin();
-  for (ChildMap::iterator itr = start_itr; itr != end_itr; ++itr) {
-    RCHECK(child_itr->Parse(&itr->second));
-    ++child_itr;
-  }
-  children_.erase(start_itr, end_itr);
-
-  DVLOG(2) << "Found " << children->size() << " " << FourCCToString(child_type)
-           << " boxes.";
-  return true;
-}
-
-template <typename T>
-bool BoxReader::ReadAllChildren(std::vector<T>* children) {
-  return ReadAllChildrenInternal(children, false);
-}
-
-template <typename T>
-bool BoxReader::ReadAllChildrenAndCheckFourCC(std::vector<T>* children) {
-  return ReadAllChildrenInternal(children, true);
-}
-
-template <typename T>
-bool BoxReader::ReadAllChildrenInternal(std::vector<T>* children,
-                                        bool check_box_type) {
-  DCHECK(!scanned_);
-  scanned_ = true;
-
-  bool err = false;
-  while (pos_ < size_) {
-    BoxReader child_reader(&buf_[pos_], size_ - pos_, media_log_, is_EOS_);
-    if (!child_reader.ReadHeader(&err)) break;
-    T child;
-    RCHECK(!check_box_type || child_reader.type() == child.BoxType());
-    RCHECK(child.Parse(&child_reader));
-    children->push_back(child);
-    pos_ += child_reader.size();
-  }
-
-  return !err;
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_BOX_READER_H_
diff --git a/cobalt/media/formats/mp4/box_reader_unittest.cc b/cobalt/media/formats/mp4/box_reader_unittest.cc
deleted file mode 100644
index 33c43c9..0000000
--- a/cobalt/media/formats/mp4/box_reader_unittest.cc
+++ /dev/null
@@ -1,329 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp4/box_reader.h"
-
-#include <string.h>
-
-#include <memory>
-
-#include "base/logging.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "cobalt/media/formats/mp4/rcheck.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::HasSubstr;
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-static const uint8_t kSkipBox[] = {
-    // Top-level test box containing three children
-    0x00, 0x00, 0x00, 0x40, 's', 'k', 'i', 'p', 0x01, 0x02, 0x03, 0x04, 0x05,
-    0x06, 0x07, 0x08, 0xf9, 0x0a, 0x0b, 0x0c, 0xfd, 0x0e, 0x0f, 0x10,
-    // Ordinary (8-byte header) child box
-    0x00, 0x00, 0x00, 0x0c, 'p', 's', 's', 'h', 0xde, 0xad, 0xbe, 0xef,
-    // Extended-size header child box
-    0x00, 0x00, 0x00, 0x01, 'p', 's', 's', 'h', 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x14, 0xfa, 0xce, 0xca, 0xfe,
-    // Empty free box
-    0x00, 0x00, 0x00, 0x08, 'f', 'r', 'e', 'e',
-    // Trailing garbage
-    0x00};
-
-struct FreeBox : Box {
-  bool Parse(BoxReader* reader) override { return true; }
-  FourCC BoxType() const override { return FOURCC_FREE; }
-};
-
-struct PsshBox : Box {
-  uint32_t val;
-
-  bool Parse(BoxReader* reader) override { return reader->Read4(&val); }
-  FourCC BoxType() const override { return FOURCC_PSSH; }
-};
-
-struct SkipBox : Box {
-  uint8_t a, b;
-  uint16_t c;
-  int32_t d;
-  int64_t e;
-
-  std::vector<PsshBox> kids;
-  FreeBox mpty;
-
-  bool Parse(BoxReader* reader) override {
-    RCHECK(reader->ReadFullBoxHeader() && reader->Read1(&a) &&
-           reader->Read1(&b) && reader->Read2(&c) && reader->Read4s(&d) &&
-           reader->Read4sInto8s(&e));
-    return reader->ScanChildren() && reader->ReadChildren(&kids) &&
-           reader->MaybeReadChild(&mpty);
-  }
-  FourCC BoxType() const override { return FOURCC_SKIP; }
-
-  SkipBox();
-  ~SkipBox() override;
-};
-
-SkipBox::SkipBox() {}
-SkipBox::~SkipBox() {}
-
-class BoxReaderTest : public testing::Test {
- public:
-  BoxReaderTest() : media_log_(new StrictMock<MockMediaLog>()) {}
-
- protected:
-  std::vector<uint8_t> GetBuf() {
-    return std::vector<uint8_t>(kSkipBox, kSkipBox + sizeof(kSkipBox));
-  }
-
-  void TestTopLevelBox(const uint8_t* data, int size, uint32_t fourCC) {
-    std::vector<uint8_t> buf(data, data + size);
-
-    bool err;
-    std::unique_ptr<BoxReader> reader(
-        BoxReader::ReadTopLevelBox(&buf[0], buf.size(), media_log_, &err));
-
-    EXPECT_FALSE(err);
-    EXPECT_TRUE(reader);
-    EXPECT_EQ(fourCC, reader->type());
-    EXPECT_EQ(reader->size(), static_cast<uint64_t>(size));
-  }
-
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-};
-
-TEST_F(BoxReaderTest, ExpectedOperationTest) {
-  std::vector<uint8_t> buf = GetBuf();
-  bool err;
-  std::unique_ptr<BoxReader> reader(
-      BoxReader::ReadTopLevelBox(&buf[0], buf.size(), media_log_, &err));
-  EXPECT_FALSE(err);
-  EXPECT_TRUE(reader.get());
-
-  SkipBox box;
-  EXPECT_TRUE(box.Parse(reader.get()));
-  EXPECT_EQ(0x01, reader->version());
-  EXPECT_EQ(0x020304u, reader->flags());
-  EXPECT_EQ(0x05, box.a);
-  EXPECT_EQ(0x06, box.b);
-  EXPECT_EQ(0x0708, box.c);
-  EXPECT_EQ(static_cast<int32_t>(0xf90a0b0c), box.d);
-  EXPECT_EQ(static_cast<int32_t>(0xfd0e0f10), box.e);
-
-  EXPECT_EQ(2u, box.kids.size());
-  EXPECT_EQ(0xdeadbeef, box.kids[0].val);
-  EXPECT_EQ(0xfacecafe, box.kids[1].val);
-
-  // Accounting for the extra byte outside of the box above
-  EXPECT_EQ(buf.size(), static_cast<uint64_t>(reader->size() + 1));
-}
-
-TEST_F(BoxReaderTest, OuterTooShortTest) {
-  std::vector<uint8_t> buf = GetBuf();
-  bool err;
-
-  // Create a soft failure by truncating the outer box.
-  std::unique_ptr<BoxReader> r(
-      BoxReader::ReadTopLevelBox(&buf[0], buf.size() - 2, media_log_, &err));
-
-  EXPECT_FALSE(err);
-  EXPECT_FALSE(r.get());
-}
-
-TEST_F(BoxReaderTest, InnerTooLongTest) {
-  std::vector<uint8_t> buf = GetBuf();
-  bool err;
-
-  // Make an inner box too big for its outer box.
-  buf[25] = 1;
-  std::unique_ptr<BoxReader> reader(
-      BoxReader::ReadTopLevelBox(&buf[0], buf.size(), media_log_, &err));
-
-  SkipBox box;
-  EXPECT_FALSE(box.Parse(reader.get()));
-}
-
-TEST_F(BoxReaderTest, WrongFourCCTest) {
-  std::vector<uint8_t> buf = GetBuf();
-  bool err;
-
-  // Set an unrecognized top-level FourCC.
-  buf[4] = 0x44;
-  buf[5] = 0x41;
-  buf[6] = 0x4c;
-  buf[7] = 0x45;
-
-  EXPECT_MEDIA_LOG(HasSubstr("Unrecognized top-level box type DALE"));
-
-  std::unique_ptr<BoxReader> reader(
-      BoxReader::ReadTopLevelBox(&buf[0], buf.size(), media_log_, &err));
-  EXPECT_FALSE(reader.get());
-  EXPECT_TRUE(err);
-}
-
-TEST_F(BoxReaderTest, ScanChildrenTest) {
-  std::vector<uint8_t> buf = GetBuf();
-  bool err;
-  std::unique_ptr<BoxReader> reader(
-      BoxReader::ReadTopLevelBox(&buf[0], buf.size(), media_log_, &err));
-
-  EXPECT_TRUE(reader->SkipBytes(16) && reader->ScanChildren());
-
-  FreeBox free;
-  EXPECT_TRUE(reader->ReadChild(&free));
-  EXPECT_FALSE(reader->ReadChild(&free));
-  EXPECT_TRUE(reader->MaybeReadChild(&free));
-
-  std::vector<PsshBox> kids;
-
-  EXPECT_TRUE(reader->ReadChildren(&kids));
-  EXPECT_EQ(2u, kids.size());
-  kids.clear();
-  EXPECT_FALSE(reader->ReadChildren(&kids));
-  EXPECT_TRUE(reader->MaybeReadChildren(&kids));
-}
-
-TEST_F(BoxReaderTest, ReadAllChildrenTest) {
-  std::vector<uint8_t> buf = GetBuf();
-  // Modify buffer to exclude its last 'free' box
-  buf[3] = 0x38;
-  bool err;
-  std::unique_ptr<BoxReader> reader(
-      BoxReader::ReadTopLevelBox(&buf[0], buf.size(), media_log_, &err));
-
-  std::vector<PsshBox> kids;
-  EXPECT_TRUE(reader->SkipBytes(16) && reader->ReadAllChildren(&kids));
-  EXPECT_EQ(2u, kids.size());
-  EXPECT_EQ(kids[0].val, 0xdeadbeef);  // Ensure order is preserved
-}
-
-TEST_F(BoxReaderTest, SkippingBloc) {
-  static const uint8_t kData[] = {0x00, 0x00, 0x00, 0x09, 'b',
-                                  'l',  'o',  'c',  0x00};
-
-  TestTopLevelBox(kData, sizeof(kData), FOURCC_BLOC);
-}
-
-TEST_F(BoxReaderTest, SkippingEmsg) {
-  static const uint8_t kData[] = {
-      0x00, 0x00, 0x00, 0x24, 'e', 'm', 's', 'g',
-      0x00,                    // version = 0
-      0x00, 0x00, 0x00,        // flags = 0
-      0x61, 0x00,              // scheme_id_uri = "a"
-      0x61, 0x00,              // value = "a"
-      0x00, 0x00, 0x00, 0x01,  // timescale = 1
-      0x00, 0x00, 0x00, 0x02,  // presentation_time_delta = 2
-      0x00, 0x00, 0x00, 0x03,  // event_duration = 3
-      0x00, 0x00, 0x00, 0x04,  // id = 4
-      0x05, 0x06, 0x07, 0x08,  // message_data[4] = 0x05060708
-  };
-
-  TestTopLevelBox(kData, sizeof(kData), FOURCC_EMSG);
-}
-
-TEST_F(BoxReaderTest, SkippingUuid) {
-  static const uint8_t kData[] = {
-      0x00, 0x00, 0x00, 0x19, 'u',  'u',  'i',  'd',
-      0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-      0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,  // usertype
-      0x00,
-  };
-
-  TestTopLevelBox(kData, sizeof(kData), FOURCC_UUID);
-}
-
-TEST_F(BoxReaderTest, NestedBoxWithHugeSize) {
-  // This data is not a valid 'emsg' box. It is just used as a top-level box
-  // as ReadTopLevelBox() has a restricted set of boxes it allows. |kData|
-  // contains all the bytes as specified by the 'emsg' header size.
-  // The nested box ('junk') has a large size that was chosen to catch
-  // integer overflows. The nested box should not specify more than the
-  // number of remaining bytes in the enclosing box.
-  static const uint8_t kData[] = {
-      0x00, 0x00, 0x00, 0x24, 'e',  'm',  's',  'g',   // outer box
-      0x7f, 0xff, 0xff, 0xff, 'j',  'u',  'n',  'k',   // nested box
-      0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x3b, 0x03,  // random data for rest
-      0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08};
-
-  bool err;
-  std::unique_ptr<BoxReader> reader(
-      BoxReader::ReadTopLevelBox(kData, sizeof(kData), media_log_, &err));
-
-  EXPECT_FALSE(err);
-  EXPECT_TRUE(reader);
-  EXPECT_EQ(FOURCC_EMSG, reader->type());
-  EXPECT_FALSE(reader->ScanChildren());
-}
-
-TEST_F(BoxReaderTest, ScanChildrenWithInvalidChild) {
-  // This data is not a valid 'emsg' box. It is just used as a top-level box
-  // as ReadTopLevelBox() has a restricted set of boxes it allows.
-  // The nested 'elst' box is used as it includes a count of EditListEntry's.
-  // The sample specifies a large number of EditListEntry's, but only 1 is
-  // actually included in the box. This test verifies that the code checks
-  // properly that the buffer contains the specified number of EditListEntry's
-  // (does not cause an int32_t overflow when checking that the bytes are
-  // available, and does not read past the end of the buffer).
-  static const uint8_t kData[] = {
-      0x00, 0x00, 0x00, 0x2c, 'e',  'm',  's',  'g',  // outer box
-      0x00, 0x00, 0x00, 0x24, 'e',  'l',  's',  't',  // nested box
-      0x01, 0x00, 0x00, 0x00,                         // version = 1, flags = 0
-      0xff, 0xff, 0xff, 0xff,  // count = max, but only 1 actually included
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-  bool err;
-  std::unique_ptr<BoxReader> reader(
-      BoxReader::ReadTopLevelBox(kData, sizeof(kData), media_log_, &err));
-
-  EXPECT_FALSE(err);
-  EXPECT_TRUE(reader);
-  EXPECT_EQ(FOURCC_EMSG, reader->type());
-  EXPECT_TRUE(reader->ScanChildren());
-
-  // 'elst' specifies lots of EditListEntry's but only includes 1. Thus
-  // parsing it should fail.
-  EditList child;
-  EXPECT_FALSE(reader->ReadChild(&child));
-}
-
-TEST_F(BoxReaderTest, ReadAllChildrenWithInvalidChild) {
-  // This data is not a valid 'emsg' box. It is just used as a top-level box
-  // as ReadTopLevelBox() has a restricted set of boxes it allows.
-  // The nested 'trun' box is used as it includes a count of the number
-  // of samples. The data specifies a large number of samples, but only 1
-  // is actually included in the box. Verifying that the large count does not
-  // cause an int32_t overflow which would allow parsing of TrackFragmentRun
-  // to read past the end of the buffer.
-  static const uint8_t kData[] = {
-      0x00, 0x00, 0x00, 0x28, 'e',  'm',  's',  'g',  // outer box
-      0x00, 0x00, 0x00, 0x20, 't',  'r',  'u',  'n',  // nested box
-      0x00, 0x00, 0x0f, 0x00,  // version = 0, flags = samples present
-      0xff, 0xff, 0xff, 0xff,  // count = max, but only 1 actually included
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-  bool err;
-  std::unique_ptr<BoxReader> reader(
-      BoxReader::ReadTopLevelBox(kData, sizeof(kData), media_log_, &err));
-
-  EXPECT_FALSE(err);
-  EXPECT_TRUE(reader);
-  EXPECT_EQ(FOURCC_EMSG, reader->type());
-
-  // Reading the child should fail since the number of samples specified
-  // doesn't match what is in the box.
-  std::vector<TrackFragmentRun> children;
-  EXPECT_FALSE(reader->ReadAllChildrenAndCheckFourCC(&children));
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/es_descriptor.cc b/cobalt/media/formats/mp4/es_descriptor.cc
deleted file mode 100644
index e88eeb8..0000000
--- a/cobalt/media/formats/mp4/es_descriptor.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp4/es_descriptor.h"
-
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/formats/mp4/rcheck.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-
-// The elementary stream size is specific by up to 4 bytes.
-// The MSB of a byte indicates if there are more bytes for the size.
-static bool ReadESSize(BitReader* reader, uint32_t* size) {
-  uint8_t msb;
-  uint8_t byte;
-
-  *size = 0;
-
-  for (size_t i = 0; i < 4; ++i) {
-    RCHECK(reader->ReadBits(1, &msb));
-    RCHECK(reader->ReadBits(7, &byte));
-    *size = (*size << 7) + byte;
-
-    if (msb == 0) break;
-  }
-
-  return true;
-}
-
-}  // namespace
-
-namespace mp4 {
-
-// static
-bool ESDescriptor::IsAAC(uint8_t object_type) {
-  return object_type == kISO_14496_3 || object_type == kISO_13818_7_AAC_LC;
-}
-
-ESDescriptor::ESDescriptor() : object_type_(kForbidden) {}
-
-ESDescriptor::~ESDescriptor() {}
-
-bool ESDescriptor::Parse(const std::vector<uint8_t>& data) {
-  BitReader reader(&data[0], data.size());
-  uint8_t tag;
-  uint32_t size;
-  uint8_t stream_dependency_flag;
-  uint8_t url_flag;
-  uint8_t ocr_stream_flag;
-  uint16_t dummy;
-
-  RCHECK(reader.ReadBits(8, &tag));
-  RCHECK(tag == kESDescrTag);
-  RCHECK(ReadESSize(&reader, &size));
-
-  RCHECK(reader.ReadBits(16, &dummy));  // ES_ID
-  RCHECK(reader.ReadBits(1, &stream_dependency_flag));
-  RCHECK(reader.ReadBits(1, &url_flag));
-  RCHECK(!url_flag);  // We don't support url flag
-  RCHECK(reader.ReadBits(1, &ocr_stream_flag));
-  RCHECK(reader.ReadBits(5, &dummy));  // streamPriority
-
-  if (stream_dependency_flag)
-    RCHECK(reader.ReadBits(16, &dummy));                     // dependsOn_ES_ID
-  if (ocr_stream_flag) RCHECK(reader.ReadBits(16, &dummy));  // OCR_ES_Id
-
-  RCHECK(ParseDecoderConfigDescriptor(&reader));
-
-  return true;
-}
-
-uint8_t ESDescriptor::object_type() const { return object_type_; }
-
-const std::vector<uint8_t>& ESDescriptor::decoder_specific_info() const {
-  return decoder_specific_info_;
-}
-
-bool ESDescriptor::ParseDecoderConfigDescriptor(BitReader* reader) {
-  uint8_t tag;
-  uint32_t size;
-  uint64_t dummy;
-
-  RCHECK(reader->ReadBits(8, &tag));
-  RCHECK(tag == kDecoderConfigDescrTag);
-  RCHECK(ReadESSize(reader, &size));
-
-  RCHECK(reader->ReadBits(8, &object_type_));
-  RCHECK(reader->ReadBits(64, &dummy));
-  RCHECK(reader->ReadBits(32, &dummy));
-  RCHECK(ParseDecoderSpecificInfo(reader));
-
-  return true;
-}
-
-bool ESDescriptor::ParseDecoderSpecificInfo(BitReader* reader) {
-  uint8_t tag;
-  uint32_t size;
-
-  RCHECK(reader->ReadBits(8, &tag));
-  RCHECK(tag == kDecoderSpecificInfoTag);
-  RCHECK(ReadESSize(reader, &size));
-
-  decoder_specific_info_.resize(size);
-  for (uint32_t i = 0; i < size; ++i)
-    RCHECK(reader->ReadBits(8, &decoder_specific_info_[i]));
-
-  return true;
-}
-
-}  // namespace mp4
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/es_descriptor.h b/cobalt/media/formats/mp4/es_descriptor.h
deleted file mode 100644
index e9726af..0000000
--- a/cobalt/media/formats/mp4/es_descriptor.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 COBALT_MEDIA_FORMATS_MP4_ES_DESCRIPTOR_H_
-#define COBALT_MEDIA_FORMATS_MP4_ES_DESCRIPTOR_H_
-
-#include <vector>
-
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class BitReader;
-
-namespace mp4 {
-
-// The following values are extracted from ISO 14496 Part 1 Table 5 -
-// objectTypeIndication Values. Only values currently in use are included.
-enum ObjectType {
-  kForbidden = 0,
-  kISO_14496_3 = 0x40,         // MPEG4 AAC
-  kISO_13818_7_AAC_LC = 0x67,  // MPEG2 AAC-LC
-  kAC3 = 0xa5,                 // AC3
-  kEAC3 = 0xa6                 // EAC3 / Dolby Digital Plus
-};
-
-// This class parse object type and decoder specific information from an
-// elementary stream descriptor, which is usually contained in an esds box.
-// Please refer to ISO 14496 Part 1 7.2.6.5 for more details.
-class MEDIA_EXPORT ESDescriptor {
- public:
-  // Utility function to check if the given object type is AAC.
-  static bool IsAAC(uint8_t object_type);
-
-  ESDescriptor();
-  ~ESDescriptor();
-
-  bool Parse(const std::vector<uint8_t>& data);
-
-  uint8_t object_type() const;
-  const std::vector<uint8_t>& decoder_specific_info() const;
-
- private:
-  enum Tag {
-    kESDescrTag = 0x03,
-    kDecoderConfigDescrTag = 0x04,
-    kDecoderSpecificInfoTag = 0x05
-  };
-
-  bool ParseDecoderConfigDescriptor(BitReader* reader);
-  bool ParseDecoderSpecificInfo(BitReader* reader);
-
-  uint8_t object_type_;
-  std::vector<uint8_t> decoder_specific_info_;
-};
-
-}  // namespace mp4
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_ES_DESCRIPTOR_H_
diff --git a/cobalt/media/formats/mp4/es_descriptor_unittest.cc b/cobalt/media/formats/mp4/es_descriptor_unittest.cc
deleted file mode 100644
index 4b17de8..0000000
--- a/cobalt/media/formats/mp4/es_descriptor_unittest.cc
+++ /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.
-
-#include "cobalt/media/formats/mp4/es_descriptor.h"
-
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-namespace mp4 {
-
-TEST(ESDescriptorTest, SingleByteLengthTest) {
-  ESDescriptor es_desc;
-  uint8_t buffer[] = {0x03, 0x19, 0x00, 0x01, 0x00, 0x04, 0x11, 0x40, 0x15,
-                      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                      0x00, 0x00, 0x05, 0x02, 0x12, 0x10, 0x06, 0x01, 0x02};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-
-  EXPECT_EQ(es_desc.object_type(), kForbidden);
-  EXPECT_TRUE(es_desc.Parse(data));
-  EXPECT_EQ(es_desc.object_type(), kISO_14496_3);
-  EXPECT_EQ(es_desc.decoder_specific_info().size(), 2u);
-  EXPECT_EQ(es_desc.decoder_specific_info()[0], 0x12);
-  EXPECT_EQ(es_desc.decoder_specific_info()[1], 0x10);
-}
-
-TEST(ESDescriptorTest, NonAACTest) {
-  ESDescriptor es_desc;
-  uint8_t buffer[] = {0x03, 0x19, 0x00, 0x01, 0x00, 0x04, 0x11, 0x66, 0x15,
-                      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                      0x00, 0x00, 0x05, 0x02, 0x12, 0x10, 0x06, 0x01, 0x02};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-
-  EXPECT_TRUE(es_desc.Parse(data));
-  EXPECT_NE(es_desc.object_type(), kISO_14496_3);
-  EXPECT_EQ(es_desc.decoder_specific_info().size(), 2u);
-  EXPECT_EQ(es_desc.decoder_specific_info()[0], 0x12);
-  EXPECT_EQ(es_desc.decoder_specific_info()[1], 0x10);
-}
-
-TEST(ESDescriptorTest, MultiByteLengthTest) {
-  ESDescriptor es_desc;
-  uint8_t buffer[] = {0x03, 0x80, 0x19, 0x00, 0x01, 0x00, 0x04, 0x80, 0x80,
-                      0x11, 0x40, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                      0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x80, 0x80, 0x80,
-                      0x02, 0x12, 0x10, 0x06, 0x01, 0x02};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-
-  EXPECT_TRUE(es_desc.Parse(data));
-  EXPECT_EQ(es_desc.object_type(), kISO_14496_3);
-  EXPECT_EQ(es_desc.decoder_specific_info().size(), 2u);
-  EXPECT_EQ(es_desc.decoder_specific_info()[0], 0x12);
-  EXPECT_EQ(es_desc.decoder_specific_info()[1], 0x10);
-}
-
-TEST(ESDescriptorTest, FiveByteLengthTest) {
-  ESDescriptor es_desc;
-  uint8_t buffer[] = {0x03, 0x80, 0x19, 0x00, 0x01, 0x00, 0x04, 0x80, 0x80,
-                      0x11, 0x40, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                      0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x80, 0x80, 0x80,
-                      0x80, 0x02, 0x12, 0x10, 0x06, 0x01, 0x02};
-  std::vector<uint8_t> data;
-
-  data.assign(buffer, buffer + sizeof(buffer));
-
-  EXPECT_TRUE(es_desc.Parse(data));
-  EXPECT_EQ(es_desc.object_type(), kISO_14496_3);
-  EXPECT_EQ(es_desc.decoder_specific_info().size(), 0u);
-}
-
-}  // namespace mp4
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/fourccs.h b/cobalt/media/formats/mp4/fourccs.h
deleted file mode 100644
index b933f91..0000000
--- a/cobalt/media/formats/mp4/fourccs.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP4_FOURCCS_H_
-#define COBALT_MEDIA_FORMATS_MP4_FOURCCS_H_
-
-#include <string>
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-enum FourCC {
-  FOURCC_NULL = 0,
-  FOURCC_AC3 = 0x61632d33,   // "ac-3"
-  FOURCC_EAC3 = 0x65632d33,  // "ec-3"
-  FOURCC_AV01 = 0x61763031,  // "av01"
-  FOURCC_AV1C = 0x61763143,  // "av1C"
-  FOURCC_AVC1 = 0x61766331,
-  FOURCC_AVC3 = 0x61766333,
-  FOURCC_AVCC = 0x61766343,
-  FOURCC_BLOC = 0x626C6F63,
-  FOURCC_CBCS = 0x63626373,
-  FOURCC_CENC = 0x63656e63,
-  FOURCC_CLLI = 0x636c6c69,
-  FOURCC_CO64 = 0x636f3634,
-  FOURCC_COLR = 0x636f6c72,
-  FOURCC_CTTS = 0x63747473,
-  FOURCC_DINF = 0x64696e66,
-  FOURCC_EDTS = 0x65647473,
-  FOURCC_EMSG = 0x656d7367,
-  FOURCC_ELST = 0x656c7374,
-  FOURCC_ENCA = 0x656e6361,
-  FOURCC_ENCV = 0x656e6376,
-  FOURCC_ESDS = 0x65736473,
-  FOURCC_FREE = 0x66726565,
-  FOURCC_FRMA = 0x66726d61,
-  FOURCC_FTYP = 0x66747970,
-  FOURCC_HDLR = 0x68646c72,
-  FOURCC_HINT = 0x68696e74,
-  FOURCC_HEV1 = 0x68657631,
-  FOURCC_HVC1 = 0x68766331,
-  FOURCC_HVCC = 0x68766343,
-  FOURCC_IODS = 0x696f6473,
-  FOURCC_MDAT = 0x6d646174,
-  FOURCC_MDCV = 0x6d646376,
-  FOURCC_MDHD = 0x6d646864,
-  FOURCC_MDIA = 0x6d646961,
-  FOURCC_MECO = 0x6d65636f,
-  FOURCC_MEHD = 0x6d656864,
-  FOURCC_META = 0x6d657461,
-  FOURCC_MFHD = 0x6d666864,
-  FOURCC_MFRA = 0x6d667261,
-  FOURCC_MINF = 0x6d696e66,
-  FOURCC_MOOF = 0x6d6f6f66,
-  FOURCC_MOOV = 0x6d6f6f76,
-  FOURCC_MP4A = 0x6d703461,
-  FOURCC_MP4V = 0x6d703476,
-  FOURCC_MVEX = 0x6d766578,
-  FOURCC_MVHD = 0x6d766864,
-  FOURCC_NCLX = 0x6e636c78,
-  FOURCC_PASP = 0x70617370,
-  FOURCC_PDIN = 0x7064696e,
-  FOURCC_PRFT = 0x70726674,
-  FOURCC_PSSH = 0x70737368,
-  FOURCC_SAIO = 0x7361696f,
-  FOURCC_SAIZ = 0x7361697a,
-  FOURCC_SBGP = 0x73626770,
-  FOURCC_SBTL = 0x7362746c,
-  FOURCC_SCHI = 0x73636869,
-  FOURCC_SCHM = 0x7363686d,
-  FOURCC_SDTP = 0x73647470,
-  FOURCC_SEIG = 0x73656967,
-  FOURCC_SENC = 0x73656e63,
-  FOURCC_SGPD = 0x73677064,
-  FOURCC_SIDX = 0x73696478,
-  FOURCC_SINF = 0x73696e66,
-  FOURCC_SKIP = 0x736b6970,
-  FOURCC_SMHD = 0x736d6864,
-  FOURCC_SOUN = 0x736f756e,
-  FOURCC_SSIX = 0x73736978,
-  FOURCC_STBL = 0x7374626c,
-  FOURCC_STCO = 0x7374636f,
-  FOURCC_STSC = 0x73747363,
-  FOURCC_STSD = 0x73747364,
-  FOURCC_STSS = 0x73747373,
-  FOURCC_STSZ = 0x7374737a,
-  FOURCC_STTS = 0x73747473,
-  FOURCC_STYP = 0x73747970,
-  FOURCC_SUBT = 0x73756274,
-  FOURCC_TENC = 0x74656e63,
-  FOURCC_TEXT = 0x74657874,
-  FOURCC_TFDT = 0x74666474,
-  FOURCC_TFHD = 0x74666864,
-  FOURCC_TKHD = 0x746b6864,
-  FOURCC_TRAF = 0x74726166,
-  FOURCC_TRAK = 0x7472616b,
-  FOURCC_TREX = 0x74726578,
-  FOURCC_TRUN = 0x7472756e,
-  FOURCC_UDTA = 0x75647461,
-  FOURCC_UUID = 0x75756964,
-  FOURCC_VIDE = 0x76696465,
-  FOURCC_VMHD = 0x766d6864,
-  FOURCC_VP09 = 0x76703039,
-  FOURCC_VPCC = 0x76706343,
-  FOURCC_WIDE = 0x77696465,
-};
-
-const inline std::string FourCCToString(FourCC fourcc) {
-  char buf[5];
-  buf[0] = (fourcc >> 24) & 0xff;
-  buf[1] = (fourcc >> 16) & 0xff;
-  buf[2] = (fourcc >> 8) & 0xff;
-  buf[3] = (fourcc)&0xff;
-  buf[4] = 0;
-
-  // Return hex itself if characters can not be printed. Any character within
-  // the "C" locale is considered printable.
-  for (int i = 0; i < 4; ++i) {
-    if (!(buf[i] > 0x1f && buf[i] < 0x7f)) {
-      std::stringstream hex_string;
-      hex_string << "0x" << std::hex << fourcc;
-      return hex_string.str();
-    }
-  }
-
-  return std::string(buf);
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_FOURCCS_H_
diff --git a/cobalt/media/formats/mp4/hevc.cc b/cobalt/media/formats/mp4/hevc.cc
deleted file mode 100644
index 3d2ca08..0000000
--- a/cobalt/media/formats/mp4/hevc.cc
+++ /dev/null
@@ -1,249 +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 "cobalt/media/formats/mp4/hevc.h"
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/logging.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/filters/h265_parser.h"
-#include "cobalt/media/formats/mp4/avc.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "cobalt/media/formats/mp4/box_reader.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-HEVCDecoderConfigurationRecord::HEVCDecoderConfigurationRecord()
-    : configurationVersion(0),
-      general_profile_space(0),
-      general_tier_flag(0),
-      general_profile_idc(0),
-      general_profile_compatibility_flags(0),
-      general_constraint_indicator_flags(0),
-      general_level_idc(0),
-      min_spatial_segmentation_idc(0),
-      parallelismType(0),
-      chromaFormat(0),
-      bitDepthLumaMinus8(0),
-      bitDepthChromaMinus8(0),
-      avgFrameRate(0),
-      constantFrameRate(0),
-      numTemporalLayers(0),
-      temporalIdNested(0),
-      lengthSizeMinusOne(0),
-      numOfArrays(0) {}
-
-HEVCDecoderConfigurationRecord::~HEVCDecoderConfigurationRecord() {}
-FourCC HEVCDecoderConfigurationRecord::BoxType() const { return FOURCC_HVCC; }
-
-bool HEVCDecoderConfigurationRecord::Parse(BoxReader* reader) {
-  return ParseInternal(reader, reader->media_log());
-}
-
-bool HEVCDecoderConfigurationRecord::Parse(const uint8_t* data, int data_size) {
-  BufferReader reader(data, data_size);
-  return ParseInternal(&reader, new MediaLog());
-}
-
-HEVCDecoderConfigurationRecord::HVCCNALArray::HVCCNALArray() : first_byte(0) {}
-
-HEVCDecoderConfigurationRecord::HVCCNALArray::HVCCNALArray(
-    const HVCCNALArray& other) {
-  *this = other;
-}
-
-HEVCDecoderConfigurationRecord::HVCCNALArray::~HVCCNALArray() {}
-
-bool HEVCDecoderConfigurationRecord::ParseInternal(
-    BufferReader* reader, const scoped_refptr<MediaLog>& media_log) {
-  uint8_t profile_indication = 0;
-  uint32_t general_constraint_indicator_flags_hi = 0;
-  uint16_t general_constraint_indicator_flags_lo = 0;
-  uint8_t misc = 0;
-  RCHECK(reader->Read1(&configurationVersion) && configurationVersion == 1 &&
-         reader->Read1(&profile_indication) &&
-         reader->Read4(&general_profile_compatibility_flags) &&
-         reader->Read4(&general_constraint_indicator_flags_hi) &&
-         reader->Read2(&general_constraint_indicator_flags_lo) &&
-         reader->Read1(&general_level_idc) &&
-         reader->Read2(&min_spatial_segmentation_idc) &&
-         reader->Read1(&parallelismType) && reader->Read1(&chromaFormat) &&
-         reader->Read1(&bitDepthLumaMinus8) &&
-         reader->Read1(&bitDepthChromaMinus8) && reader->Read2(&avgFrameRate) &&
-         reader->Read1(&misc) && reader->Read1(&numOfArrays));
-
-  general_profile_space = profile_indication >> 6;
-  general_tier_flag = (profile_indication >> 5) & 1;
-  general_profile_idc = profile_indication & 0x1f;
-
-  general_constraint_indicator_flags = general_constraint_indicator_flags_hi;
-  general_constraint_indicator_flags <<= 16;
-  general_constraint_indicator_flags |= general_constraint_indicator_flags_lo;
-
-  min_spatial_segmentation_idc &= 0xfff;
-  parallelismType &= 3;
-  chromaFormat &= 3;
-  bitDepthLumaMinus8 &= 7;
-  bitDepthChromaMinus8 &= 7;
-
-  constantFrameRate = misc >> 6;
-  numTemporalLayers = (misc >> 3) & 7;
-  temporalIdNested = (misc >> 2) & 1;
-  lengthSizeMinusOne = misc & 3;
-
-  DVLOG(2) << __FUNCTION__ << " numOfArrays=" << static_cast<int>(numOfArrays);
-  arrays.resize(numOfArrays);
-  for (uint32_t j = 0; j < numOfArrays; j++) {
-    RCHECK(reader->Read1(&arrays[j].first_byte));
-    uint16_t numNalus = 0;
-    RCHECK(reader->Read2(&numNalus));
-    arrays[j].units.resize(numNalus);
-    for (uint32_t i = 0; i < numNalus; ++i) {
-      uint16_t naluLength = 0;
-      RCHECK(reader->Read2(&naluLength) &&
-             reader->ReadVec(&arrays[j].units[i], naluLength));
-      DVLOG(4) << __FUNCTION__
-               << " naluType=" << static_cast<int>(arrays[j].first_byte & 0x3f)
-               << " size=" << arrays[j].units[i].size();
-    }
-  }
-
-  if (media_log.get()) {
-    MEDIA_LOG(INFO, media_log) << "Video codec: hevc";
-  }
-
-  return true;
-}
-
-VideoCodecProfile HEVCDecoderConfigurationRecord::GetVideoProfile() const {
-  // The values of general_profile_idc are taken from the HEVC standard, see
-  // the latest https://www.itu.int/rec/T-REC-H.265/en section A.3
-  switch (general_profile_idc) {
-    case 1:
-      return HEVCPROFILE_MAIN;
-    case 2:
-      return HEVCPROFILE_MAIN10;
-    case 3:
-      return HEVCPROFILE_MAIN_STILL_PICTURE;
-  }
-  return VIDEO_CODEC_PROFILE_UNKNOWN;
-}
-
-static const uint8_t kAnnexBStartCode[] = {0, 0, 0, 1};
-static const int kAnnexBStartCodeSize = 4;
-
-bool HEVC::InsertParamSetsAnnexB(
-    const HEVCDecoderConfigurationRecord& hevc_config,
-    std::vector<uint8_t>* buffer, std::vector<SubsampleEntry>* subsamples) {
-  DCHECK(HEVC::IsValidAnnexB(*buffer, *subsamples));
-
-  std::unique_ptr<H265Parser> parser(new H265Parser());
-  const uint8_t* start = &(*buffer)[0];
-  parser->SetEncryptedStream(start, buffer->size(), *subsamples);
-
-  H265NALU nalu;
-  if (parser->AdvanceToNextNALU(&nalu) != H265Parser::kOk) return false;
-
-  std::vector<uint8_t>::iterator config_insert_point = buffer->begin();
-
-  if (nalu.nal_unit_type == H265NALU::AUD_NUT) {
-    // Move insert point to just after the AUD.
-    config_insert_point += (nalu.data + nalu.size) - start;
-  }
-
-  // Clear |parser| and |start| since they aren't needed anymore and
-  // will hold stale pointers once the insert happens.
-  parser.reset();
-  start = NULL;
-
-  std::vector<uint8_t> param_sets;
-  RCHECK(HEVC::ConvertConfigToAnnexB(hevc_config, &param_sets));
-  DVLOG(4) << __FUNCTION__ << " converted hvcC to AnnexB "
-           << " size=" << param_sets.size() << " inserted at "
-           << static_cast<int>(config_insert_point - buffer->begin());
-
-  if (subsamples && !subsamples->empty()) {
-    int subsample_index =
-        AVC::FindSubsampleIndex(*buffer, subsamples, &(*config_insert_point));
-    // Update the size of the subsample where SPS/PPS is to be inserted.
-    (*subsamples)[subsample_index].clear_bytes += param_sets.size();
-  }
-
-  buffer->insert(config_insert_point, param_sets.begin(), param_sets.end());
-
-  DCHECK(HEVC::IsValidAnnexB(*buffer, *subsamples));
-  return true;
-}
-
-bool HEVC::ConvertConfigToAnnexB(
-    const HEVCDecoderConfigurationRecord& hevc_config,
-    std::vector<uint8_t>* buffer) {
-  DCHECK(buffer->empty());
-  buffer->clear();
-
-  for (size_t j = 0; j < hevc_config.arrays.size(); j++) {
-    uint8_t naluType = hevc_config.arrays[j].first_byte & 0x3f;
-    for (size_t i = 0; i < hevc_config.arrays[j].units.size(); ++i) {
-      DVLOG(3) << __FUNCTION__ << " naluType=" << static_cast<int>(naluType)
-               << " size=" << hevc_config.arrays[j].units[i].size();
-      buffer->insert(buffer->end(), kAnnexBStartCode,
-                     kAnnexBStartCode + kAnnexBStartCodeSize);
-      buffer->insert(buffer->end(), hevc_config.arrays[j].units[i].begin(),
-                     hevc_config.arrays[j].units[i].end());
-    }
-  }
-
-  return true;
-}
-
-// Verifies AnnexB NALU order according to section 7.4.2.4.4 of ISO/IEC 23008-2.
-bool HEVC::IsValidAnnexB(const std::vector<uint8_t>& buffer,
-                         const std::vector<SubsampleEntry>& subsamples) {
-  return IsValidAnnexB(&buffer[0], buffer.size(), subsamples);
-}
-
-bool HEVC::IsValidAnnexB(const uint8_t* buffer, size_t size,
-                         const std::vector<SubsampleEntry>& subsamples) {
-  DCHECK(buffer);
-
-  if (size == 0) return true;
-
-  // TODO(servolk): Implement this, see crbug.com/527595
-  return true;
-}
-
-HEVCBitstreamConverter::HEVCBitstreamConverter(
-    std::unique_ptr<HEVCDecoderConfigurationRecord> hevc_config)
-    : hevc_config_(std::move(hevc_config)) {
-  DCHECK(hevc_config_);
-}
-
-HEVCBitstreamConverter::~HEVCBitstreamConverter() {}
-
-bool HEVCBitstreamConverter::ConvertFrame(
-    std::vector<uint8_t>* frame_buf, bool is_keyframe,
-    std::vector<SubsampleEntry>* subsamples) const {
-  RCHECK(AVC::ConvertFrameToAnnexB(hevc_config_->lengthSizeMinusOne + 1,
-                                   frame_buf, subsamples));
-
-  if (is_keyframe) {
-    // If this is a keyframe, we (re-)inject HEVC params headers at the start of
-    // a frame. If subsample info is present, we also update the clear byte
-    // count for that first subsample.
-    RCHECK(HEVC::InsertParamSetsAnnexB(*hevc_config_, frame_buf, subsamples));
-  }
-
-  DCHECK(HEVC::IsValidAnnexB(*frame_buf, *subsamples));
-  return true;
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/hevc.h b/cobalt/media/formats/mp4/hevc.h
deleted file mode 100644
index 5740ede..0000000
--- a/cobalt/media/formats/mp4/hevc.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP4_HEVC_H_
-#define COBALT_MEDIA_FORMATS_MP4_HEVC_H_
-
-#include <memory>
-#include <vector>
-
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/video_codecs.h"
-#include "cobalt/media/formats/mp4/bitstream_converter.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-struct SubsampleEntry;
-
-namespace mp4 {
-
-struct MEDIA_EXPORT HEVCDecoderConfigurationRecord : Box {
-  DECLARE_BOX_METHODS(HEVCDecoderConfigurationRecord);
-
-  // Parses HEVCDecoderConfigurationRecord data encoded in |data|.
-  // Note: This method is intended to parse data outside the MP4StreamParser
-  //       context and therefore the box header is not expected to be present
-  //       in |data|.
-  // Returns true if |data| was successfully parsed.
-  bool Parse(const uint8_t* data, int data_size);
-
-  uint8_t configurationVersion;
-  uint8_t general_profile_space;
-  uint8_t general_tier_flag;
-  uint8_t general_profile_idc;
-  uint32_t general_profile_compatibility_flags;
-  uint64_t general_constraint_indicator_flags;
-  uint8_t general_level_idc;
-  uint16_t min_spatial_segmentation_idc;
-  uint8_t parallelismType;
-  uint8_t chromaFormat;
-  uint8_t bitDepthLumaMinus8;
-  uint8_t bitDepthChromaMinus8;
-  uint16_t avgFrameRate;
-  uint8_t constantFrameRate;
-  uint8_t numTemporalLayers;
-  uint8_t temporalIdNested;
-  uint8_t lengthSizeMinusOne;
-  uint8_t numOfArrays;
-
-  typedef std::vector<uint8_t> HVCCNALUnit;
-  struct HVCCNALArray {
-    HVCCNALArray();
-    HVCCNALArray(const HVCCNALArray& other);
-    ~HVCCNALArray();
-    uint8_t first_byte;
-    std::vector<HVCCNALUnit> units;
-  };
-  std::vector<HVCCNALArray> arrays;
-
-  VideoCodecProfile GetVideoProfile() const;
-
- private:
-  bool ParseInternal(BufferReader* reader,
-                     const scoped_refptr<MediaLog>& media_log);
-};
-
-class MEDIA_EXPORT HEVC {
- public:
-  static bool ConvertConfigToAnnexB(
-      const HEVCDecoderConfigurationRecord& hevc_config,
-      std::vector<uint8_t>* buffer);
-
-  static bool InsertParamSetsAnnexB(
-      const HEVCDecoderConfigurationRecord& hevc_config,
-      std::vector<uint8_t>* buffer, std::vector<SubsampleEntry>* subsamples);
-
-  // Verifies that the contents of |buffer| conform to
-  // Section 7.4.2.4.4 of ISO/IEC 23008-2.
-  // |subsamples| contains the information about what parts of the buffer are
-  // encrypted and which parts are clear.
-  // Returns true if |buffer| contains conformant Annex B data
-  // TODO(servolk): Remove the std::vector version when we can use,
-  // C++11's std::vector<T>::data() method.
-  static bool IsValidAnnexB(const std::vector<uint8_t>& buffer,
-                            const std::vector<SubsampleEntry>& subsamples);
-  static bool IsValidAnnexB(const uint8_t* buffer, size_t size,
-                            const std::vector<SubsampleEntry>& subsamples);
-};
-
-class HEVCBitstreamConverter : public BitstreamConverter {
- public:
-  explicit HEVCBitstreamConverter(
-      std::unique_ptr<HEVCDecoderConfigurationRecord> hevc_config);
-
-  // BitstreamConverter interface
-  bool ConvertFrame(std::vector<uint8_t>* frame_buf, bool is_keyframe,
-                    std::vector<SubsampleEntry>* subsamples) const override;
-
- private:
-  ~HEVCBitstreamConverter() override;
-  std::unique_ptr<HEVCDecoderConfigurationRecord> hevc_config_;
-};
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_HEVC_H_
diff --git a/cobalt/media/formats/mp4/mp4_stream_parser.cc b/cobalt/media/formats/mp4/mp4_stream_parser.cc
deleted file mode 100644
index d76ac05..0000000
--- a/cobalt/media/formats/mp4/mp4_stream_parser.cc
+++ /dev/null
@@ -1,819 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp4/mp4_stream_parser.h"
-
-#include <algorithm>
-#include <limits>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/callback_helpers.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/color_space.h"
-#include "cobalt/media/base/encryption_scheme.h"
-#include "cobalt/media/base/hdr_metadata.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/base/video_util.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "cobalt/media/formats/mp4/box_reader.h"
-#include "cobalt/media/formats/mp4/es_descriptor.h"
-#include "cobalt/media/formats/mp4/rcheck.h"
-#include "cobalt/media/formats/mpeg/adts_constants.h"
-#include "cobalt/media/formats/webm/webm_colour_parser.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-namespace {
-
-using gfx::ColorSpace;
-
-const int kMaxEmptySampleLogs = 20;
-
-// Caller should be prepared to handle return of Unencrypted() in case of
-// unsupported scheme.
-EncryptionScheme GetEncryptionScheme(const ProtectionSchemeInfo& sinf) {
-  if (!sinf.HasSupportedScheme()) return Unencrypted();
-  FourCC fourcc = sinf.type.type;
-  EncryptionScheme::CipherMode mode = EncryptionScheme::CIPHER_MODE_UNENCRYPTED;
-  EncryptionPattern pattern;
-  bool uses_pattern_encryption = false;
-  switch (fourcc) {
-    case FOURCC_CENC:
-      mode = EncryptionScheme::CIPHER_MODE_AES_CTR;
-      break;
-    case FOURCC_CBCS:
-      mode = EncryptionScheme::CIPHER_MODE_AES_CBC;
-      uses_pattern_encryption = true;
-      break;
-    default:
-      NOTREACHED();
-      break;
-  }
-  if (uses_pattern_encryption) {
-    pattern = {sinf.info.track_encryption.default_crypt_byte_block,
-               sinf.info.track_encryption.default_skip_byte_block};
-  }
-  return EncryptionScheme(mode, pattern);
-}
-
-gfx::ColorSpace ConvertColorParameterInformationToColorSpace(
-    const ColorParameterInformation& info) {
-  auto primary_id = static_cast<ColorSpace::PrimaryID>(info.colour_primaries);
-  auto transfer_id =
-      static_cast<ColorSpace::TransferID>(info.transfer_characteristics);
-  auto matrix_id = static_cast<ColorSpace::MatrixID>(info.matrix_coefficients);
-
-  // Note that we don't check whether the embedded ids are valid.  We rely on
-  // the underlying video decoder to reject any ids that it doesn't support.
-  return gfx::ColorSpace(
-      primary_id, transfer_id, matrix_id,
-      info.full_range ? ColorSpace::kRangeIdFull : ColorSpace::kRangeIdLimited);
-}
-
-MasteringMetadata ConvertMdcvToMasteringMetadata(
-    const MasteringDisplayColorVolume& mdcv) {
-  MasteringMetadata mastering_metadata;
-
-  mastering_metadata.primary_r_chromaticity_x = mdcv.display_primaries_rx;
-  mastering_metadata.primary_r_chromaticity_y = mdcv.display_primaries_ry;
-  mastering_metadata.primary_g_chromaticity_x = mdcv.display_primaries_gx;
-  mastering_metadata.primary_g_chromaticity_y = mdcv.display_primaries_gy;
-  mastering_metadata.primary_b_chromaticity_x = mdcv.display_primaries_bx;
-  mastering_metadata.primary_b_chromaticity_y = mdcv.display_primaries_by;
-  mastering_metadata.white_point_chromaticity_x = mdcv.white_point_x;
-  mastering_metadata.white_point_chromaticity_y = mdcv.white_point_y;
-  mastering_metadata.luminance_max =
-      static_cast<float>(mdcv.max_display_mastering_luminance);
-  mastering_metadata.luminance_min =
-      static_cast<float>(mdcv.min_display_mastering_luminance);
-
-  return mastering_metadata;
-}
-
-}  // namespace
-
-MP4StreamParser::MP4StreamParser(DecoderBuffer::Allocator* buffer_allocator,
-                                 const std::set<int>& audio_object_types,
-                                 bool has_sbr)
-    : buffer_allocator_(buffer_allocator),
-      state_(kWaitingForInit),
-      moof_head_(0),
-      mdat_tail_(0),
-      highest_end_offset_(0),
-      has_audio_(false),
-      has_video_(false),
-      audio_object_types_(audio_object_types),
-      has_sbr_(has_sbr),
-      num_empty_samples_skipped_(0) {}
-
-MP4StreamParser::~MP4StreamParser() {}
-
-void MP4StreamParser::Init(
-    const InitCB& init_cb, const NewConfigCB& config_cb,
-    const NewBuffersCB& new_buffers_cb, bool ignore_text_tracks,
-    const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-    const NewMediaSegmentCB& new_segment_cb,
-    const EndMediaSegmentCB& end_of_segment_cb,
-    const scoped_refptr<MediaLog>& media_log) {
-  DCHECK_EQ(state_, kWaitingForInit);
-  DCHECK(init_cb_.is_null());
-  DCHECK(!init_cb.is_null());
-  DCHECK(!config_cb.is_null());
-  DCHECK(!new_buffers_cb.is_null());
-  DCHECK(!encrypted_media_init_data_cb.is_null());
-  DCHECK(!new_segment_cb.is_null());
-  DCHECK(!end_of_segment_cb.is_null());
-
-  ChangeState(kParsingBoxes);
-  init_cb_ = init_cb;
-  config_cb_ = config_cb;
-  new_buffers_cb_ = new_buffers_cb;
-  encrypted_media_init_data_cb_ = encrypted_media_init_data_cb;
-  new_segment_cb_ = new_segment_cb;
-  end_of_segment_cb_ = end_of_segment_cb;
-  media_log_ = media_log;
-}
-
-void MP4StreamParser::Reset() {
-  queue_.Reset();
-  runs_.reset();
-  moof_head_ = 0;
-  mdat_tail_ = 0;
-}
-
-void MP4StreamParser::Flush() {
-  DCHECK_NE(state_, kWaitingForInit);
-  Reset();
-  ChangeState(kParsingBoxes);
-}
-
-bool MP4StreamParser::Parse(const uint8_t* buf, int size) {
-  DCHECK_NE(state_, kWaitingForInit);
-
-  if (state_ == kError) return false;
-
-  queue_.Push(buf, size);
-
-  BufferQueueMap buffers;
-
-  bool result = false;
-  bool err = false;
-
-  do {
-    switch (state_) {
-      case kWaitingForInit:
-      case kError:
-        NOTREACHED();
-        return false;
-
-      case kParsingBoxes:
-        result = ParseBox(&err);
-        break;
-
-      case kWaitingForSampleData:
-        result = HaveEnoughDataToEnqueueSamples();
-        if (result) ChangeState(kEmittingSamples);
-        break;
-
-      case kEmittingSamples:
-        result = EnqueueSample(&buffers, &err);
-        if (result) {
-          int64_t max_clear = runs_->GetMaxClearOffset() + moof_head_;
-          err = !ReadAndDiscardMDATsUntil(max_clear);
-        }
-        break;
-    }
-  } while (result && !err);
-
-  if (!err) err = !SendAndFlushSamples(&buffers);
-
-  if (err) {
-    DLOG(ERROR) << "Error while parsing MP4";
-    moov_.reset();
-    Reset();
-    ChangeState(kError);
-    return false;
-  }
-
-  return true;
-}
-
-bool MP4StreamParser::ParseBox(bool* err) {
-  const uint8_t* buf;
-  int size;
-  queue_.Peek(&buf, &size);
-  if (!size) return false;
-
-  std::unique_ptr<BoxReader> reader(
-      BoxReader::ReadTopLevelBox(buf, size, media_log_, err));
-  if (reader.get() == NULL) return false;
-
-  if (reader->type() == FOURCC_MOOV) {
-    *err = !ParseMoov(reader.get());
-  } else if (reader->type() == FOURCC_MOOF) {
-    moof_head_ = queue_.head();
-    *err = !ParseMoof(reader.get());
-
-    // Set up first mdat offset for ReadMDATsUntil().
-    mdat_tail_ = queue_.head() + reader->size();
-
-    // Return early to avoid evicting 'moof' data from queue. Auxiliary info may
-    // be located anywhere in the file, including inside the 'moof' itself.
-    // (Since 'default-base-is-moof' is mandated, no data references can come
-    // before the head of the 'moof', so keeping this box around is sufficient.)
-    return !(*err);
-  } else {
-    // TODO(wolenetz,chcunningham): Enforce more strict adherence to MSE byte
-    // stream spec for ftyp and styp. See http://crbug.com/504514.
-    DVLOG(2) << "Skipping unrecognized top-level box: "
-             << FourCCToString(reader->type());
-  }
-
-  queue_.Pop(reader->size());
-  return !(*err);
-}
-
-bool MP4StreamParser::ParseMoov(BoxReader* reader) {
-  moov_.reset(new Movie);
-  RCHECK(moov_->Parse(reader));
-  runs_.reset();
-  audio_track_ids_.clear();
-  video_track_ids_.clear();
-  is_track_encrypted_.clear();
-
-  has_audio_ = false;
-  has_video_ = false;
-
-  std::unique_ptr<MediaTracks> media_tracks(new MediaTracks());
-  AudioDecoderConfig audio_config;
-  VideoDecoderConfig video_config;
-  int detected_audio_track_count = 0;
-  int detected_video_track_count = 0;
-  int detected_text_track_count = 0;
-
-  for (std::vector<Track>::const_iterator track = moov_->tracks.begin();
-       track != moov_->tracks.end(); ++track) {
-    const SampleDescription& samp_descr =
-        track->media.information.sample_table.description;
-
-    // TODO: When codec reconfigurations are supported, detect and send
-    // a codec reconfiguration for fragments using a sample description index
-    // different from the previous one
-    size_t desc_idx = 0;
-    for (size_t t = 0; t < moov_->extends.tracks.size(); t++) {
-      const TrackExtends& trex = moov_->extends.tracks[t];
-      if (trex.track_id == track->header.track_id) {
-        desc_idx = trex.default_sample_description_index;
-        break;
-      }
-    }
-    RCHECK(desc_idx > 0);
-    desc_idx -= 1;  // BMFF descriptor index is one-based
-
-    if (track->media.handler.type == kAudio) {
-      detected_audio_track_count++;
-
-      RCHECK(!samp_descr.audio_entries.empty());
-
-      // It is not uncommon to find otherwise-valid files with incorrect sample
-      // description indices, so we fail gracefully in that case.
-      if (desc_idx >= samp_descr.audio_entries.size()) desc_idx = 0;
-      const AudioSampleEntry& entry = samp_descr.audio_entries[desc_idx];
-      const AAC& aac = entry.esds.aac;
-
-      // For encrypted audio streams entry.format is FOURCC_ENCA and actual
-      // format is in entry.sinf.format.format.
-      FourCC audio_format = (entry.format == FOURCC_ENCA)
-                                ? entry.sinf.format.format
-                                : entry.format;
-
-      if (audio_format != FOURCC_MP4A && audio_format != FOURCC_AC3 &&
-          audio_format != FOURCC_EAC3) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Unsupported audio format 0x" << std::hex << entry.format
-            << " in stsd box.";
-        return false;
-      }
-
-      uint8_t audio_type = entry.esds.object_type;
-      if (audio_type == kForbidden) {
-        if (audio_format == FOURCC_AC3) audio_type = kAC3;
-        if (audio_format == FOURCC_EAC3) audio_type = kEAC3;
-      }
-      DVLOG(1) << "audio_type 0x" << std::hex << static_cast<int>(audio_type);
-      if (audio_object_types_.find(audio_type) == audio_object_types_.end()) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "audio object type 0x" << std::hex
-            << static_cast<int>(audio_type)
-            << " does not match what is specified in the mimetype.";
-        return false;
-      }
-
-      AudioCodec codec = kUnknownAudioCodec;
-      ChannelLayout channel_layout = CHANNEL_LAYOUT_NONE;
-      int sample_per_second = 0;
-      std::vector<uint8_t> extra_data;
-      // Check if it is MPEG4 AAC defined in ISO 14496 Part 3 or
-      // supported MPEG2 AAC variants.
-      if (ESDescriptor::IsAAC(audio_type)) {
-        codec = kCodecAAC;
-        channel_layout = aac.GetChannelLayout(has_sbr_);
-        sample_per_second = aac.GetOutputSamplesPerSecond(has_sbr_);
-        extra_data = aac.codec_specific_data();
-      } else if (audio_type == kAC3) {
-        codec = kCodecAC3;
-        channel_layout = GuessChannelLayout(entry.channelcount);
-        sample_per_second = entry.samplerate;
-      } else if (audio_type == kEAC3) {
-        codec = kCodecEAC3;
-        channel_layout = GuessChannelLayout(entry.channelcount);
-        sample_per_second = entry.samplerate;
-      } else {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Unsupported audio object type 0x" << std::hex
-            << static_cast<int>(audio_type) << " in esds.";
-        return false;
-      }
-
-      SampleFormat sample_format;
-      if (entry.samplesize == 8) {
-        sample_format = kSampleFormatU8;
-      } else if (entry.samplesize == 16) {
-        sample_format = kSampleFormatS16;
-      } else if (entry.samplesize == 24) {
-        sample_format = kSampleFormatS24;
-      } else if (entry.samplesize == 32) {
-        sample_format = kSampleFormatS32;
-      } else {
-        LOG(ERROR) << "Unsupported sample size.";
-        return false;
-      }
-
-      uint32_t audio_track_id = track->header.track_id;
-      if (audio_track_ids_.find(audio_track_id) != audio_track_ids_.end()) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Audio track with track_id=" << audio_track_id
-            << " already present.";
-        return false;
-      }
-      bool is_track_encrypted = entry.sinf.info.track_encryption.is_encrypted;
-      is_track_encrypted_[audio_track_id] = is_track_encrypted;
-      EncryptionScheme scheme = Unencrypted();
-      if (is_track_encrypted) {
-        scheme = GetEncryptionScheme(entry.sinf);
-        if (!scheme.is_encrypted()) return false;
-      }
-      audio_config.Initialize(codec, sample_format, channel_layout,
-                              sample_per_second, extra_data, scheme,
-                              base::TimeDelta(), 0);
-      DVLOG(1) << "audio_track_id=" << audio_track_id
-               << " config=" << audio_config.AsHumanReadableString();
-      if (!audio_config.IsValidConfig()) {
-        MEDIA_LOG(ERROR, media_log_) << "Invalid audio decoder config: "
-                                     << audio_config.AsHumanReadableString();
-        return false;
-      }
-      has_audio_ = true;
-      audio_track_ids_.insert(audio_track_id);
-      const char* track_kind = (audio_track_ids_.size() == 1 ? "main" : "");
-      media_tracks->AddAudioTrack(audio_config, audio_track_id, track_kind,
-                                  track->media.handler.name,
-                                  track->media.header.language());
-      continue;
-    }
-
-    if (track->media.handler.type == kVideo) {
-      detected_video_track_count++;
-
-      RCHECK(!samp_descr.video_entries.empty());
-      if (desc_idx >= samp_descr.video_entries.size()) desc_idx = 0;
-      const VideoSampleEntry& entry = samp_descr.video_entries[desc_idx];
-
-      if (!entry.IsFormatValid()) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Unsupported video format 0x" << std::hex << entry.format
-            << " in stsd box.";
-        return false;
-      }
-
-      // TODO: Recover correct crop box
-      math::Size coded_size(entry.width, entry.height);
-      math::Rect visible_rect(coded_size);
-
-      // If PASP is available, use the coded size and PASP to calculate the
-      // natural size. Otherwise, use the size in track header for natural size.
-      math::Size natural_size(visible_rect.size());
-      if (entry.pixel_aspect.h_spacing != 1 ||
-          entry.pixel_aspect.v_spacing != 1) {
-        natural_size =
-            GetNaturalSize(visible_rect.size(), entry.pixel_aspect.h_spacing,
-                           entry.pixel_aspect.v_spacing);
-      } else if (track->header.width && track->header.height) {
-        natural_size = math::Size(track->header.width, track->header.height);
-      }
-
-      uint32_t video_track_id = track->header.track_id;
-      if (video_track_ids_.find(video_track_id) != video_track_ids_.end()) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Video track with track_id=" << video_track_id
-            << " already present.";
-        return false;
-      }
-      bool is_track_encrypted = entry.sinf.info.track_encryption.is_encrypted;
-      is_track_encrypted_[video_track_id] = is_track_encrypted;
-      EncryptionScheme scheme = Unencrypted();
-      if (is_track_encrypted) {
-        scheme = GetEncryptionScheme(entry.sinf);
-        if (!scheme.is_encrypted()) return false;
-      }
-      video_config.Initialize(entry.video_codec, entry.video_codec_profile,
-                              PIXEL_FORMAT_YV12, COLOR_SPACE_HD_REC709,
-                              coded_size, visible_rect, natural_size,
-                              // No decoder-specific buffer needed for AVC;
-                              // SPS/PPS are embedded in the video stream
-                              EmptyExtraData(), scheme);
-      if (entry.color_parameter_information) {
-        WebMColorMetadata color_metadata = {};
-
-        color_metadata.color_space =
-            ConvertColorParameterInformationToColorSpace(
-                *entry.color_parameter_information);
-
-        if (entry.mastering_display_color_volume) {
-          color_metadata.hdr_metadata.mastering_metadata =
-              ConvertMdcvToMasteringMetadata(
-                  *entry.mastering_display_color_volume);
-        }
-
-        if (entry.content_light_level_information) {
-          color_metadata.hdr_metadata.max_cll =
-              entry.content_light_level_information->max_content_light_level;
-          color_metadata.hdr_metadata.max_fall =
-              entry.content_light_level_information
-                  ->max_pic_average_light_level;
-        }
-
-        video_config.set_webm_color_metadata(color_metadata);
-      }
-
-      DVLOG(1) << "video_track_id=" << video_track_id
-               << " config=" << video_config.AsHumanReadableString();
-      if (!video_config.IsValidConfig()) {
-        MEDIA_LOG(ERROR, media_log_) << "Invalid video decoder config: "
-                                     << video_config.AsHumanReadableString();
-        return false;
-      }
-      has_video_ = true;
-      video_track_ids_.insert(video_track_id);
-      const char* track_kind = (video_track_ids_.size() == 1 ? "main" : "");
-      media_tracks->AddVideoTrack(video_config, video_track_id, track_kind,
-                                  track->media.handler.name,
-                                  track->media.header.language());
-      continue;
-    }
-
-    // TODO(wolenetz): Investigate support in MSE and Chrome MSE for CEA 608/708
-    // embedded caption data in video track. At time of init segment parsing, we
-    // don't have this data (unless maybe by SourceBuffer's mimetype).
-    // See https://crbug.com/597073
-    if (track->media.handler.type == kText) detected_text_track_count++;
-  }
-
-  if (!moov_->pssh.empty()) OnEncryptedMediaInitData(moov_->pssh);
-
-  RCHECK(config_cb_.Run(std::move(media_tracks), TextTrackConfigMap()));
-
-  StreamParser::InitParameters params(kInfiniteDuration);
-  if (moov_->extends.header.fragment_duration > 0) {
-    params.duration = TimeDeltaFromRational(
-        moov_->extends.header.fragment_duration, moov_->header.timescale);
-    params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  } else if (moov_->header.duration > 0 &&
-             ((moov_->header.version == 0 &&
-               moov_->header.duration !=
-                   std::numeric_limits<uint32_t>::max()) ||
-              (moov_->header.version == 1 &&
-               moov_->header.duration !=
-                   std::numeric_limits<uint64_t>::max()))) {
-    // In ISO/IEC 14496-12:2012, 8.2.2.3: "If the duration cannot be determined
-    // then duration is set to all 1s."
-    // The duration field is either 32-bit or 64-bit depending on the version in
-    // MovieHeaderBox. We interpret not 0 and not all 1's here as "known
-    // duration".
-    params.duration =
-        TimeDeltaFromRational(moov_->header.duration, moov_->header.timescale);
-    params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  } else {
-    // In ISO/IEC 14496-12:2005(E), 8.30.2: ".. If an MP4 file is created in
-    // real-time, such as used in live streaming, it is not likely that the
-    // fragment_duration is known in advance and this (mehd) box may be
-    // omitted."
-
-    // We have an unknown duration (neither any mvex fragment_duration nor moov
-    // duration value indicated a known duration, above.)
-
-    // TODO(wolenetz): Investigate gating liveness detection on timeline_offset
-    // when it's populated. See http://crbug.com/312699
-    params.liveness = DemuxerStream::LIVENESS_LIVE;
-  }
-
-  DVLOG(1) << "liveness: " << params.liveness;
-
-  if (!init_cb_.is_null()) {
-    params.detected_audio_track_count = detected_audio_track_count;
-    params.detected_video_track_count = detected_video_track_count;
-    params.detected_text_track_count = detected_text_track_count;
-    base::ResetAndReturn(&init_cb_).Run(params);
-  }
-
-  return true;
-}
-
-bool MP4StreamParser::ParseMoof(BoxReader* reader) {
-  RCHECK(moov_.get());  // Must already have initialization segment
-  MovieFragment moof;
-  RCHECK(moof.Parse(reader));
-  if (!runs_) runs_.reset(new TrackRunIterator(moov_.get(), media_log_));
-  RCHECK(runs_->Init(moof));
-  RCHECK(ComputeHighestEndOffset(moof));
-
-  if (!moof.pssh.empty()) OnEncryptedMediaInitData(moof.pssh);
-
-  new_segment_cb_.Run();
-  ChangeState(kWaitingForSampleData);
-  return true;
-}
-
-void MP4StreamParser::OnEncryptedMediaInitData(
-    const std::vector<ProtectionSystemSpecificHeader>& headers) {
-  // TODO: ensure that the value of init_data (all PSSH headers
-  // concatenated in arbitrary order) matches the EME spec.
-  // See https://www.w3.org/Bugs/Public/show_bug.cgi?id=17673.
-  size_t total_size = 0;
-  for (size_t i = 0; i < headers.size(); i++)
-    total_size += headers[i].raw_box.size();
-
-  std::vector<uint8_t> init_data(total_size);
-  size_t pos = 0;
-  for (size_t i = 0; i < headers.size(); i++) {
-    memcpy(&init_data[pos], &headers[i].raw_box[0],
-                 headers[i].raw_box.size());
-    pos += headers[i].raw_box.size();
-  }
-  encrypted_media_init_data_cb_.Run(kEmeInitDataTypeCenc, init_data);
-}
-
-bool MP4StreamParser::PrepareAACBuffer(
-    const AAC& aac_config, std::vector<uint8_t>* frame_buf,
-    std::vector<SubsampleEntry>* subsamples) const {
-  // Append an ADTS header to every audio sample.
-  RCHECK(aac_config.ConvertEsdsToADTS(frame_buf));
-
-  // As above, adjust subsample information to account for the headers. AAC is
-  // not required to use subsample encryption, so we may need to add an entry.
-  if (subsamples->empty()) {
-    subsamples->push_back(SubsampleEntry(
-        kADTSHeaderMinSize, frame_buf->size() - kADTSHeaderMinSize));
-  } else {
-    (*subsamples)[0].clear_bytes += kADTSHeaderMinSize;
-  }
-  return true;
-}
-
-bool MP4StreamParser::EnqueueSample(BufferQueueMap* buffers, bool* err) {
-  DCHECK_EQ(state_, kEmittingSamples);
-
-  if (!runs_->IsRunValid()) {
-    // Flush any buffers we've gotten in this chunk so that buffers don't
-    // cross |new_segment_cb_| calls
-    *err = !SendAndFlushSamples(buffers);
-    if (*err) return false;
-
-    // Remain in kEmittingSamples state, discarding data, until the end of
-    // the current 'mdat' box has been appended to the queue.
-    if (!queue_.Trim(mdat_tail_)) return false;
-
-    ChangeState(kParsingBoxes);
-    end_of_segment_cb_.Run();
-    return true;
-  }
-
-  if (!runs_->IsSampleValid()) {
-    runs_->AdvanceRun();
-    return true;
-  }
-
-  DCHECK(!(*err));
-
-  const uint8_t* buf;
-  int buf_size;
-  queue_.Peek(&buf, &buf_size);
-  if (!buf_size) return false;
-
-  bool audio =
-      audio_track_ids_.find(runs_->track_id()) != audio_track_ids_.end();
-  bool video =
-      video_track_ids_.find(runs_->track_id()) != video_track_ids_.end();
-
-  // Skip this entire track if it's not one we're interested in
-  if (!audio && !video) {
-    runs_->AdvanceRun();
-    return true;
-  }
-
-  // Attempt to cache the auxiliary information first. Aux info is usually
-  // placed in a contiguous block before the sample data, rather than being
-  // interleaved. If we didn't cache it, this would require that we retain the
-  // start of the segment buffer while reading samples. Aux info is typically
-  // quite small compared to sample data, so this pattern is useful on
-  // memory-constrained devices where the source buffer consumes a substantial
-  // portion of the total system memory.
-  if (runs_->AuxInfoNeedsToBeCached()) {
-    queue_.PeekAt(runs_->aux_info_offset() + moof_head_, &buf, &buf_size);
-    if (buf_size < runs_->aux_info_size()) return false;
-    *err = !runs_->CacheAuxInfo(buf, buf_size);
-    return !*err;
-  }
-
-  queue_.PeekAt(runs_->sample_offset() + moof_head_, &buf, &buf_size);
-  if (buf_size < runs_->sample_size()) return false;
-
-  if (runs_->sample_size() == 0) {
-    // Generally not expected, but spec allows it. Code below this block assumes
-    // the current sample is not empty.
-    LIMITED_MEDIA_LOG(DEBUG, media_log_, num_empty_samples_skipped_,
-                      kMaxEmptySampleLogs)
-        << " Skipping 'trun' sample with size of 0.";
-    runs_->AdvanceSample();
-    return true;
-  }
-
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  std::vector<SubsampleEntry> subsamples;
-  if (runs_->is_encrypted()) {
-    decrypt_config = runs_->GetDecryptConfig();
-    if (!decrypt_config) {
-      *err = true;
-      return false;
-    }
-    subsamples = decrypt_config->subsamples();
-  }
-
-  std::vector<uint8_t> frame_buf(buf, buf + runs_->sample_size());
-  if (video) {
-    if (runs_->video_description().video_codec == kCodecH264 ||
-        runs_->video_description().video_codec == kCodecHEVC) {
-      DCHECK(runs_->video_description().frame_bitstream_converter);
-      if (!runs_->video_description().frame_bitstream_converter->ConvertFrame(
-              &frame_buf, runs_->is_keyframe(), &subsamples)) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "Failed to prepare video sample for decode";
-        *err = true;
-        return false;
-      }
-    }
-  }
-
-  if (audio) {
-    if (ESDescriptor::IsAAC(runs_->audio_description().esds.object_type) &&
-        !PrepareAACBuffer(runs_->audio_description().esds.aac, &frame_buf,
-                          &subsamples)) {
-      MEDIA_LOG(ERROR, media_log_) << "Failed to prepare AAC sample for decode";
-      *err = true;
-      return false;
-    }
-  }
-
-  if (decrypt_config) {
-    if (!subsamples.empty()) {
-      // Create a new config with the updated subsamples.
-      decrypt_config.reset(
-          new DecryptConfig(decrypt_config->encryption_mode(),
-                            decrypt_config->key_id(), decrypt_config->iv(),
-                            subsamples, decrypt_config->encryption_pattern()));
-    }
-    // else, use the existing config.
-  }
-
-  StreamParserBuffer::Type buffer_type =
-      audio ? DemuxerStream::AUDIO : DemuxerStream::VIDEO;
-
-  scoped_refptr<StreamParserBuffer> stream_buf = StreamParserBuffer::CopyFrom(
-      buffer_allocator_, &frame_buf[0], frame_buf.size(), runs_->is_keyframe(),
-      buffer_type, runs_->track_id());
-
-  // This causes infinite spinner.
-  if (!stream_buf) {
-    return false;
-  }
-
-  if (decrypt_config) stream_buf->set_decrypt_config(std::move(decrypt_config));
-
-  stream_buf->set_duration(runs_->duration());
-  stream_buf->set_timestamp(runs_->cts());
-  stream_buf->SetDecodeTimestamp(runs_->dts());
-
-  DVLOG(3) << "Emit " << (audio ? "audio" : "video") << " frame: "
-           << " track_id=" << runs_->track_id()
-           << ", key=" << runs_->is_keyframe()
-           << ", dur=" << runs_->duration().InMilliseconds()
-           << ", dts=" << runs_->dts().InMilliseconds()
-           << ", cts=" << runs_->cts().InMilliseconds()
-           << ", size=" << runs_->sample_size();
-
-  (*buffers)[runs_->track_id()].push_back(stream_buf);
-  runs_->AdvanceSample();
-  return true;
-}
-
-bool MP4StreamParser::SendAndFlushSamples(BufferQueueMap* buffers) {
-  if (buffers->empty()) return true;
-  bool success = new_buffers_cb_.Run(*buffers);
-  buffers->clear();
-  return success;
-}
-
-bool MP4StreamParser::ReadAndDiscardMDATsUntil(int64_t max_clear_offset) {
-  bool err = false;
-  int64_t upper_bound = std::min(max_clear_offset, queue_.tail());
-  while (mdat_tail_ < upper_bound) {
-    const uint8_t* buf = NULL;
-    int size = 0;
-    queue_.PeekAt(mdat_tail_, &buf, &size);
-
-    FourCC type;
-    int box_sz;
-    if (!BoxReader::StartTopLevelBox(buf, size, media_log_, &type, &box_sz,
-                                     &err))
-      break;
-
-    if (type != FOURCC_MDAT) {
-      MEDIA_LOG(DEBUG, media_log_)
-          << "Unexpected box type while parsing MDATs: "
-          << FourCCToString(type);
-    }
-    mdat_tail_ += box_sz;
-  }
-  queue_.Trim(std::min(mdat_tail_, upper_bound));
-  return !err;
-}
-
-void MP4StreamParser::ChangeState(State new_state) {
-  DVLOG(2) << "Changing state: " << new_state;
-  state_ = new_state;
-}
-
-bool MP4StreamParser::HaveEnoughDataToEnqueueSamples() {
-  DCHECK_EQ(state_, kWaitingForSampleData);
-  // For muxed content, make sure we have data up to |highest_end_offset_|
-  // so we can ensure proper enqueuing behavior. Otherwise assume we have enough
-  // data and allow per sample offset checks to meter sample enqueuing.
-  // TODO(acolwell): Fix trun box handling so we don't have to special case
-  // muxed content.
-  return !(has_audio_ && has_video_ &&
-           queue_.tail() < highest_end_offset_ + moof_head_);
-}
-
-bool MP4StreamParser::ComputeHighestEndOffset(const MovieFragment& moof) {
-  highest_end_offset_ = 0;
-
-  TrackRunIterator runs(moov_.get(), media_log_);
-  RCHECK(runs.Init(moof));
-
-  while (runs.IsRunValid()) {
-    int64_t aux_info_end_offset = runs.aux_info_offset() + runs.aux_info_size();
-    if (aux_info_end_offset > highest_end_offset_)
-      highest_end_offset_ = aux_info_end_offset;
-
-    while (runs.IsSampleValid()) {
-      int64_t sample_end_offset = runs.sample_offset() + runs.sample_size();
-      if (sample_end_offset > highest_end_offset_)
-        highest_end_offset_ = sample_end_offset;
-
-      runs.AdvanceSample();
-    }
-    runs.AdvanceRun();
-  }
-
-  return true;
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/mp4_stream_parser.h b/cobalt/media/formats/mp4/mp4_stream_parser.h
deleted file mode 100644
index 20c4bdd..0000000
--- a/cobalt/media/formats/mp4/mp4_stream_parser.h
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FORMATS_MP4_MP4_STREAM_PARSER_H_
-#define COBALT_MEDIA_FORMATS_MP4_MP4_STREAM_PARSER_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/formats/common/offset_byte_queue.h"
-#include "cobalt/media/formats/mp4/track_run_iterator.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-struct Movie;
-class BoxReader;
-
-class MEDIA_EXPORT MP4StreamParser : public StreamParser {
- public:
-  MP4StreamParser(DecoderBuffer::Allocator* buffer_allocator,
-                  const std::set<int>& audio_object_types, bool has_sbr);
-  ~MP4StreamParser() override;
-
-  void Init(const InitCB& init_cb, const NewConfigCB& config_cb,
-            const NewBuffersCB& new_buffers_cb, bool ignore_text_tracks,
-            const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-            const NewMediaSegmentCB& new_segment_cb,
-            const EndMediaSegmentCB& end_of_segment_cb,
-            const scoped_refptr<MediaLog>& media_log) override;
-  void Flush() override;
-  bool Parse(const uint8_t* buf, int size) override;
-
- private:
-  enum State {
-    kWaitingForInit,
-    kParsingBoxes,
-    kWaitingForSampleData,
-    kEmittingSamples,
-    kError
-  };
-
-  bool ParseBox(bool* err);
-  bool ParseMoov(mp4::BoxReader* reader);
-  bool ParseMoof(mp4::BoxReader* reader);
-
-  void OnEncryptedMediaInitData(
-      const std::vector<ProtectionSystemSpecificHeader>& headers);
-
-  // To retain proper framing, each 'mdat' atom must be read; to limit memory
-  // usage, the atom's data needs to be discarded incrementally as frames are
-  // extracted from the stream. This function discards data from the stream up
-  // to |max_clear_offset|, updating the |mdat_tail_| value so that framing can
-  // be retained after all 'mdat' information has been read. |max_clear_offset|
-  // is the upper bound on what can be removed from |queue_|. Anything below
-  // this offset is no longer needed by the parser.
-  // Returns 'true' on success, 'false' if there was an error.
-  bool ReadAndDiscardMDATsUntil(int64_t max_clear_offset);
-
-  void ChangeState(State new_state);
-
-  bool EmitConfigs();
-  bool PrepareAACBuffer(const AAC& aac_config, std::vector<uint8_t>* frame_buf,
-                        std::vector<SubsampleEntry>* subsamples) const;
-  bool EnqueueSample(BufferQueueMap* buffers, bool* err);
-  bool SendAndFlushSamples(BufferQueueMap* buffers);
-
-  void Reset();
-
-  // Checks to see if we have enough data in |queue_| to transition to
-  // kEmittingSamples and start enqueuing samples.
-  bool HaveEnoughDataToEnqueueSamples();
-
-  // Sets |highest_end_offset_| based on the data in |moov_|
-  // and |moof|. Returns true if |highest_end_offset_| was successfully
-  // computed.
-  bool ComputeHighestEndOffset(const MovieFragment& moof);
-
-  DecoderBuffer::Allocator* buffer_allocator_;
-  State state_;
-  InitCB init_cb_;
-  NewConfigCB config_cb_;
-  NewBuffersCB new_buffers_cb_;
-  EncryptedMediaInitDataCB encrypted_media_init_data_cb_;
-  NewMediaSegmentCB new_segment_cb_;
-  EndMediaSegmentCB end_of_segment_cb_;
-  scoped_refptr<MediaLog> media_log_;
-
-  OffsetByteQueue queue_;
-
-  // These two parameters are only valid in the |kEmittingSegments| state.
-  //
-  // |moof_head_| is the offset of the start of the most recently parsed moof
-  // block. All byte offsets in sample information are relative to this offset,
-  // as mandated by the Media Source spec.
-  int64_t moof_head_;
-  // |mdat_tail_| is the stream offset of the end of the current 'mdat' box.
-  // Valid iff it is greater than the head of the queue.
-  int64_t mdat_tail_;
-
-  // The highest end offset in the current moof. This offset is
-  // relative to |moof_head_|. This value is used to make sure we have collected
-  // enough bytes to parse all samples and aux_info in the current moof.
-  int64_t highest_end_offset_;
-
-  std::unique_ptr<mp4::Movie> moov_;
-  std::unique_ptr<mp4::TrackRunIterator> runs_;
-
-  bool has_audio_;
-  bool has_video_;
-  std::set<uint32_t> audio_track_ids_;
-  std::set<uint32_t> video_track_ids_;
-  // The object types allowed for audio tracks.
-  std::set<int> audio_object_types_;
-  bool has_sbr_;
-  std::map<uint32_t, bool> is_track_encrypted_;
-
-  // Tracks the number of MEDIA_LOGS for skipping empty trun samples.
-  int num_empty_samples_skipped_;
-
-  DISALLOW_COPY_AND_ASSIGN(MP4StreamParser);
-};
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_MP4_STREAM_PARSER_H_
diff --git a/cobalt/media/formats/mp4/mp4_stream_parser_unittest.cc b/cobalt/media/formats/mp4/mp4_stream_parser_unittest.cc
deleted file mode 100644
index b2127ad..0000000
--- a/cobalt/media/formats/mp4/mp4_stream_parser_unittest.cc
+++ /dev/null
@@ -1,578 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp4/mp4_stream_parser.h"
-
-#include <algorithm>
-#include <memory>
-#include <string>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_track.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/formats/mp4/es_descriptor.h"
-#include "cobalt/media/formats/mp4/fourccs.h"
-#include "cobalt/media/media_features.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::InSequence;
-using ::testing::StrictMock;
-using base::TimeDelta;
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-// Matchers for verifying common media log entry strings.
-MATCHER_P(VideoCodecLog, codec_string, "") {
-  return CONTAINS_STRING(arg, "Video codec: " + std::string(codec_string));
-}
-
-MATCHER_P(AudioCodecLog, codec_string, "") {
-  return CONTAINS_STRING(arg, "Audio codec: " + std::string(codec_string));
-}
-
-MATCHER(SampleEncryptionInfoUnavailableLog, "") {
-  return CONTAINS_STRING(arg, "Sample encryption info is not available.");
-}
-
-MATCHER_P(ErrorLog, error_string, "") {
-  return CONTAINS_STRING(arg, error_string);
-}
-
-class MP4StreamParserTest : public testing::Test {
- public:
-  MP4StreamParserTest()
-      : media_log_(new StrictMock<MockMediaLog>()),
-        configs_received_(false),
-        lower_bound_(
-            DecodeTimestamp::FromPresentationTime(base::TimeDelta::Max())) {
-    std::set<int> audio_object_types;
-    audio_object_types.insert(kISO_14496_3);
-    parser_.reset(new MP4StreamParser(audio_object_types, false));
-  }
-
- protected:
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-  std::unique_ptr<MP4StreamParser> parser_;
-  bool configs_received_;
-  std::unique_ptr<MediaTracks> media_tracks_;
-  AudioDecoderConfig audio_decoder_config_;
-  VideoDecoderConfig video_decoder_config_;
-  DecodeTimestamp lower_bound_;
-  StreamParser::TrackId audio_track_id_;
-  StreamParser::TrackId video_track_id_;
-
-  bool AppendData(const uint8_t* data, size_t length) {
-    return parser_->Parse(data, length);
-  }
-
-  bool AppendDataInPieces(const uint8_t* data, size_t length,
-                          size_t piece_size) {
-    const uint8_t* start = data;
-    const uint8_t* end = data + length;
-    while (start < end) {
-      size_t append_size =
-          std::min(piece_size, static_cast<size_t>(end - start));
-      if (!AppendData(start, append_size)) return false;
-      start += append_size;
-    }
-    return true;
-  }
-
-  void InitF(const StreamParser::InitParameters& expected_params,
-             const StreamParser::InitParameters& params) {
-    DVLOG(1) << "InitF: dur=" << params.duration.InMicroseconds()
-             << ", autoTimestampOffset=" << params.auto_update_timestamp_offset;
-    EXPECT_EQ(expected_params.duration, params.duration);
-    EXPECT_EQ(expected_params.timeline_offset, params.timeline_offset);
-    EXPECT_EQ(expected_params.auto_update_timestamp_offset,
-              params.auto_update_timestamp_offset);
-    EXPECT_EQ(expected_params.liveness, params.liveness);
-    EXPECT_EQ(expected_params.detected_audio_track_count,
-              params.detected_audio_track_count);
-    EXPECT_EQ(expected_params.detected_video_track_count,
-              params.detected_video_track_count);
-    EXPECT_EQ(expected_params.detected_text_track_count,
-              params.detected_text_track_count);
-  }
-
-  bool NewConfigF(std::unique_ptr<MediaTracks> tracks,
-                  const StreamParser::TextTrackConfigMap& tc) {
-    configs_received_ = true;
-    CHECK(tracks.get());
-    DVLOG(1) << "NewConfigF: got " << tracks->tracks().size() << " tracks";
-    for (const auto& track : tracks->tracks()) {
-      const auto& track_id = track->bytestream_track_id();
-      if (track->type() == MediaTrack::Audio) {
-        audio_track_id_ = track_id;
-        audio_decoder_config_ = tracks->getAudioConfig(track_id);
-        DVLOG(1) << "track_id=" << track_id << " audio config="
-                 << (audio_decoder_config_.IsValidConfig()
-                         ? audio_decoder_config_.AsHumanReadableString()
-                         : "INVALID");
-      } else if (track->type() == MediaTrack::Video) {
-        video_track_id_ = track_id;
-        video_decoder_config_ = tracks->getVideoConfig(track_id);
-        DVLOG(1) << "track_id=" << track_id << " video config="
-                 << (video_decoder_config_.IsValidConfig()
-                         ? video_decoder_config_.AsHumanReadableString()
-                         : "INVALID");
-      }
-    }
-    media_tracks_ = std::move(tracks);
-    return true;
-  }
-
-  bool NewBuffersF(const StreamParser::BufferQueueMap& buffer_queue_map) {
-    DecodeTimestamp lowest_end_dts = kNoDecodeTimestamp();
-    for (const auto& it : buffer_queue_map) {
-      DVLOG(3) << "Buffers for track_id=" << it.first;
-      DCHECK(!it.second.empty());
-
-      if (lowest_end_dts == kNoDecodeTimestamp() ||
-          lowest_end_dts > it.second.back()->GetDecodeTimestamp())
-        lowest_end_dts = it.second.back()->GetDecodeTimestamp();
-
-      for (const auto& buf : it.second) {
-        DVLOG(3) << "  track_id=" << buf->track_id()
-                 << ", size=" << buf->data_size()
-                 << ", pts=" << buf->timestamp().InSecondsF()
-                 << ", dts=" << buf->GetDecodeTimestamp().InSecondsF()
-                 << ", dur=" << buf->duration().InSecondsF();
-        // Ensure that track ids are properly assigned on all emitted buffers.
-        EXPECT_EQ(it.first, buf->track_id());
-      }
-    }
-
-    EXPECT_NE(lowest_end_dts, kNoDecodeTimestamp());
-
-    if (lower_bound_ != kNoDecodeTimestamp() && lowest_end_dts < lower_bound_) {
-      return false;
-    }
-
-    lower_bound_ = lowest_end_dts;
-    return true;
-  }
-
-  void KeyNeededF(EmeInitDataType type, const std::vector<uint8_t>& init_data) {
-    DVLOG(1) << "KeyNeededF: " << init_data.size();
-    EXPECT_EQ(EmeInitDataType::CENC, type);
-    EXPECT_FALSE(init_data.empty());
-  }
-
-  void NewSegmentF() {
-    DVLOG(1) << "NewSegmentF";
-    lower_bound_ = kNoDecodeTimestamp();
-  }
-
-  void EndOfSegmentF() {
-    DVLOG(1) << "EndOfSegmentF()";
-    lower_bound_ =
-        DecodeTimestamp::FromPresentationTime(base::TimeDelta::Max());
-  }
-
-  void InitializeParserWithInitParametersExpectations(
-      StreamParser::InitParameters params) {
-    parser_->Init(
-        base::Bind(&MP4StreamParserTest::InitF, base::Unretained(this), params),
-        base::Bind(&MP4StreamParserTest::NewConfigF, base::Unretained(this)),
-        base::Bind(&MP4StreamParserTest::NewBuffersF, base::Unretained(this)),
-        true,
-        base::Bind(&MP4StreamParserTest::KeyNeededF, base::Unretained(this)),
-        base::Bind(&MP4StreamParserTest::NewSegmentF, base::Unretained(this)),
-        base::Bind(&MP4StreamParserTest::EndOfSegmentF, base::Unretained(this)),
-        media_log_);
-  }
-
-  StreamParser::InitParameters GetDefaultInitParametersExpectations() {
-    // Most unencrypted test mp4 files have zero duration and are treated as
-    // live streams.
-    StreamParser::InitParameters params(kInfiniteDuration);
-    params.liveness = DemuxerStream::LIVENESS_LIVE;
-    params.detected_audio_track_count = 1;
-    params.detected_video_track_count = 1;
-    params.detected_text_track_count = 0;
-    return params;
-  }
-
-  void InitializeParserAndExpectLiveness(DemuxerStream::Liveness liveness) {
-    auto params = GetDefaultInitParametersExpectations();
-    params.liveness = liveness;
-    InitializeParserWithInitParametersExpectations(params);
-  }
-
-  void InitializeParser() {
-    InitializeParserWithInitParametersExpectations(
-        GetDefaultInitParametersExpectations());
-  }
-
-  bool ParseMP4File(const std::string& filename, int append_bytes) {
-    scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename);
-    EXPECT_TRUE(
-        AppendDataInPieces(buffer->data(), buffer->data_size(), append_bytes));
-    return true;
-  }
-};
-
-TEST_F(MP4StreamParserTest, UnalignedAppend) {
-  // Test small, non-segment-aligned appends (small enough to exercise
-  // incremental append system)
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F"));
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
-  InitializeParser();
-  ParseMP4File("bear-1280x720-av_frag.mp4", 512);
-}
-
-TEST_F(MP4StreamParserTest, BytewiseAppend) {
-  // Ensure no incremental errors occur when parsing
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F"));
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
-  InitializeParser();
-  ParseMP4File("bear-1280x720-av_frag.mp4", 1);
-}
-
-TEST_F(MP4StreamParserTest, MultiFragmentAppend) {
-  // Large size ensures multiple fragments are appended in one call (size is
-  // larger than this particular test file)
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F"));
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
-  InitializeParser();
-  ParseMP4File("bear-1280x720-av_frag.mp4", 768432);
-}
-
-TEST_F(MP4StreamParserTest, Flush) {
-  // Flush while reading sample data, then start a new stream.
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F")).Times(2);
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2")).Times(2);
-  InitializeParser();
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-1280x720-av_frag.mp4");
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), 65536, 512));
-  parser_->Flush();
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-}
-
-TEST_F(MP4StreamParserTest, Reinitialization) {
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F")).Times(2);
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2")).Times(2);
-  InitializeParser();
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-1280x720-av_frag.mp4");
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-}
-
-TEST_F(MP4StreamParserTest, UnknownDuration_V0_AllBitsSet) {
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F"));
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
-  InitializeParser();
-  // 32 bit duration field in mvhd box, all bits set.
-  ParseMP4File(
-      "bear-1280x720-av_frag-initsegment-mvhd_version_0-mvhd_duration_bits_all_"
-      "set.mp4",
-      512);
-}
-
-TEST_F(MP4StreamParserTest, MPEG2_AAC_LC) {
-  InSequence s;
-  std::set<int> audio_object_types;
-  audio_object_types.insert(kISO_13818_7_AAC_LC);
-  parser_.reset(new MP4StreamParser(audio_object_types, false));
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.67"));
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
-  auto params = GetDefaultInitParametersExpectations();
-  params.detected_video_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-  ParseMP4File("bear-mpeg2-aac-only_frag.mp4", 512);
-}
-
-// Test that a moov box is not always required after Flush() is called.
-TEST_F(MP4StreamParserTest, NoMoovAfterFlush) {
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F"));
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
-  InitializeParser();
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-1280x720-av_frag.mp4");
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-  parser_->Flush();
-
-  const int kFirstMoofOffset = 1307;
-  EXPECT_TRUE(AppendDataInPieces(buffer->data() + kFirstMoofOffset,
-                                 buffer->data_size() - kFirstMoofOffset, 512));
-}
-
-// Test an invalid file where there are encrypted samples, but
-// SampleEncryptionBox (senc) and SampleAuxiliaryInformation{Sizes|Offsets}Box
-// (saiz|saio) are missing.
-// The parser should fail instead of crash. See http://crbug.com/361347
-TEST_F(MP4StreamParserTest, MissingSampleEncryptionInfo) {
-  InSequence s;
-
-  // Encrypted test mp4 files have non-zero duration and are treated as
-  // recorded streams.
-  auto params = GetDefaultInitParametersExpectations();
-  params.duration = base::TimeDelta::FromMicroseconds(23219);
-  params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  params.detected_video_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4");
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2")).Times(2);
-  EXPECT_MEDIA_LOG(SampleEncryptionInfoUnavailableLog());
-  EXPECT_FALSE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-}
-
-// Test a file where all video samples start with an Access Unit
-// Delimiter (AUD) NALU.
-TEST_F(MP4StreamParserTest, VideoSamplesStartWithAUDs) {
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.4D4028"));
-  auto params = GetDefaultInitParametersExpectations();
-  params.detected_audio_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-  ParseMP4File("bear-1280x720-av_with-aud-nalus_frag.mp4", 512);
-}
-
-TEST_F(MP4StreamParserTest, HEVC_in_MP4_container) {
-#if BUILDFLAG(ENABLE_HEVC_DEMUXING)
-  bool expect_success = true;
-  EXPECT_MEDIA_LOG(VideoCodecLog("hevc"));
-#else
-  bool expect_success = false;
-  EXPECT_MEDIA_LOG(ErrorLog("Parse unsupported video format hev1"));
-#endif
-  auto params = GetDefaultInitParametersExpectations();
-  params.duration = base::TimeDelta::FromMicroseconds(1002000);
-  params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  params.detected_audio_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-
-  scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-hevc-frag.mp4");
-  EXPECT_EQ(expect_success,
-            AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-#if BUILDFLAG(ENABLE_HEVC_DEMUXING)
-  EXPECT_EQ(kCodecHEVC, video_decoder_config_.codec());
-  EXPECT_EQ(HEVCPROFILE_MAIN, video_decoder_config_.profile());
-#endif
-}
-
-// Sample encryption information is stored as CencSampleAuxiliaryDataFormat
-// (ISO/IEC 23001-7:2015 8) inside 'mdat' box. No SampleEncryption ('senc') box.
-TEST_F(MP4StreamParserTest, CencWithEncryptionInfoStoredAsAuxDataInMdat) {
-  // Encrypted test mp4 files have non-zero duration and are treated as
-  // recorded streams.
-  auto params = GetDefaultInitParametersExpectations();
-  params.duration = base::TimeDelta::FromMicroseconds(2736066);
-  params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  params.detected_audio_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-1280x720-v_frag-cenc.mp4");
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F"));
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-}
-
-TEST_F(MP4StreamParserTest, CencWithSampleEncryptionBox) {
-  // Encrypted test mp4 files have non-zero duration and are treated as
-  // recorded streams.
-  auto params = GetDefaultInitParametersExpectations();
-  params.duration = base::TimeDelta::FromMicroseconds(2736066);
-  params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  params.detected_audio_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-640x360-v_frag-cenc-senc.mp4");
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001E"));
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-}
-
-TEST_F(MP4StreamParserTest, NaturalSizeWithoutPASP) {
-  auto params = GetDefaultInitParametersExpectations();
-  params.duration = base::TimeDelta::FromMicroseconds(1000966);
-  params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  params.detected_audio_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-640x360-non_square_pixel-without_pasp.mp4");
-
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001E"));
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-  EXPECT_EQ(math::Size(639, 360), video_decoder_config_.natural_size());
-}
-
-TEST_F(MP4StreamParserTest, NaturalSizeWithPASP) {
-  auto params = GetDefaultInitParametersExpectations();
-  params.duration = base::TimeDelta::FromMicroseconds(1000966);
-  params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  params.detected_audio_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-640x360-non_square_pixel-with_pasp.mp4");
-
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001E"));
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-  EXPECT_EQ(math::Size(639, 360), video_decoder_config_.natural_size());
-}
-
-TEST_F(MP4StreamParserTest, DemuxingAC3) {
-  std::set<int> audio_object_types;
-  audio_object_types.insert(kAC3);
-  parser_.reset(new MP4StreamParser(audio_object_types, false));
-
-#if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
-  bool expect_success = true;
-#else
-  bool expect_success = false;
-  EXPECT_MEDIA_LOG(ErrorLog("Unsupported audio format 0x61632d33 in stsd box"));
-#endif
-
-  auto params = GetDefaultInitParametersExpectations();
-  params.duration = base::TimeDelta::FromMicroseconds(1045000);
-  params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  params.detected_video_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-ac3-only-frag.mp4");
-  EXPECT_EQ(expect_success,
-            AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-}
-
-TEST_F(MP4StreamParserTest, DemuxingEAC3) {
-  std::set<int> audio_object_types;
-  audio_object_types.insert(kEAC3);
-  parser_.reset(new MP4StreamParser(audio_object_types, false));
-
-#if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
-  bool expect_success = true;
-#else
-  bool expect_success = false;
-  EXPECT_MEDIA_LOG(ErrorLog("Unsupported audio format 0x65632d33 in stsd box"));
-#endif
-
-  auto params = GetDefaultInitParametersExpectations();
-  params.duration = base::TimeDelta::FromMicroseconds(1045000);
-  params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  params.detected_video_track_count = 0;
-  InitializeParserWithInitParametersExpectations(params);
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-eac3-only-frag.mp4");
-  EXPECT_EQ(expect_success,
-            AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-}
-
-TEST_F(MP4StreamParserTest, FourCCToString) {
-  // A real FOURCC should print.
-  EXPECT_EQ("mvex", FourCCToString(FOURCC_MVEX));
-
-  // Invalid FOURCC should also print whenever ASCII values are printable.
-  EXPECT_EQ("fake", FourCCToString(static_cast<FourCC>(0x66616b65)));
-
-  // Invalid FORCC with non-printable values should not give error message.
-  EXPECT_EQ("0x66616b00", FourCCToString(static_cast<FourCC>(0x66616b00)));
-}
-
-TEST_F(MP4StreamParserTest, MediaTrackInfoSourcing) {
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F"));
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
-  InitializeParser();
-  ParseMP4File("bear-1280x720-av_frag.mp4", 4096);
-
-  EXPECT_EQ(media_tracks_->tracks().size(), 2u);
-  const MediaTrack& video_track = *(media_tracks_->tracks()[0]);
-  EXPECT_EQ(video_track.type(), MediaTrack::Video);
-  EXPECT_EQ(video_track.bytestream_track_id(), 1);
-  EXPECT_EQ(video_track.kind(), "main");
-  EXPECT_EQ(video_track.label(), "VideoHandler");
-  EXPECT_EQ(video_track.language(), "und");
-
-  const MediaTrack& audio_track = *(media_tracks_->tracks()[1]);
-  EXPECT_EQ(audio_track.type(), MediaTrack::Audio);
-  EXPECT_EQ(audio_track.bytestream_track_id(), 2);
-  EXPECT_EQ(audio_track.kind(), "main");
-  EXPECT_EQ(audio_track.label(), "SoundHandler");
-  EXPECT_EQ(audio_track.language(), "und");
-}
-
-TEST_F(MP4StreamParserTest, TextTrackDetection) {
-  auto params = GetDefaultInitParametersExpectations();
-  params.detected_text_track_count = 1;
-  InitializeParserWithInitParametersExpectations(params);
-
-  scoped_refptr<DecoderBuffer> buffer =
-      ReadTestDataFile("bear-1280x720-avt_subt_frag.mp4");
-
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64001F"));
-  EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
-}
-
-TEST_F(MP4StreamParserTest, MultiTrackFile) {
-  auto params = GetDefaultInitParametersExpectations();
-  params.duration = base::TimeDelta::FromMilliseconds(4248);
-  params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  params.detected_audio_track_count = 2;
-  params.detected_video_track_count = 2;
-  InitializeParserWithInitParametersExpectations(params);
-  EXPECT_MEDIA_LOG(VideoCodecLog("avc1.64000D")).Times(2);
-  EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2")).Times(2);
-  ParseMP4File("bbb-320x240-2video-2audio.mp4", 4096);
-
-  EXPECT_EQ(media_tracks_->tracks().size(), 4u);
-
-  const MediaTrack& video_track1 = *(media_tracks_->tracks()[0]);
-  EXPECT_EQ(video_track1.type(), MediaTrack::Video);
-  EXPECT_EQ(video_track1.bytestream_track_id(), 1);
-  EXPECT_EQ(video_track1.kind(), "main");
-  EXPECT_EQ(video_track1.label(), "VideoHandler");
-  EXPECT_EQ(video_track1.language(), "und");
-
-  const MediaTrack& audio_track1 = *(media_tracks_->tracks()[1]);
-  EXPECT_EQ(audio_track1.type(), MediaTrack::Audio);
-  EXPECT_EQ(audio_track1.bytestream_track_id(), 2);
-  EXPECT_EQ(audio_track1.kind(), "main");
-  EXPECT_EQ(audio_track1.label(), "SoundHandler");
-  EXPECT_EQ(audio_track1.language(), "und");
-
-  const MediaTrack& video_track2 = *(media_tracks_->tracks()[2]);
-  EXPECT_EQ(video_track2.type(), MediaTrack::Video);
-  EXPECT_EQ(video_track2.bytestream_track_id(), 3);
-  EXPECT_EQ(video_track2.kind(), "");
-  EXPECT_EQ(video_track2.label(), "VideoHandler");
-  EXPECT_EQ(video_track2.language(), "und");
-
-  const MediaTrack& audio_track2 = *(media_tracks_->tracks()[3]);
-  EXPECT_EQ(audio_track2.type(), MediaTrack::Audio);
-  EXPECT_EQ(audio_track2.bytestream_track_id(), 4);
-  EXPECT_EQ(audio_track2.kind(), "");
-  EXPECT_EQ(audio_track2.label(), "SoundHandler");
-  EXPECT_EQ(audio_track2.language(), "und");
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/rcheck.h b/cobalt/media/formats/mp4/rcheck.h
deleted file mode 100644
index d2030d4..0000000
--- a/cobalt/media/formats/mp4/rcheck.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 COBALT_MEDIA_FORMATS_MP4_RCHECK_H_
-#define COBALT_MEDIA_FORMATS_MP4_RCHECK_H_
-
-#include "base/logging.h"
-#include "cobalt/media/base/media_log.h"
-
-#define RCHECK_MEDIA_LOGGED(condition, log_cb, msg)                 \
-  do {                                                              \
-    if (!(condition)) {                                             \
-      DLOG(ERROR) << "Failure while parsing MP4: " #condition;      \
-      MEDIA_LOG(ERROR, log_cb) << "Failure parsing MP4: " << (msg); \
-      return false;                                                 \
-    }                                                               \
-  } while (0)
-
-// TODO(wolenetz,chcunningham): Where appropriate, replace usage of this macro
-// in favor of RCHECK_MEDIA_LOGGED. See https://crbug.com/487410.
-#define RCHECK(condition)                                      \
-  do {                                                         \
-    if (!(condition)) {                                        \
-      DLOG(ERROR) << "Failure while parsing MP4: " #condition; \
-      return false;                                            \
-    }                                                          \
-  } while (0)
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_RCHECK_H_
diff --git a/cobalt/media/formats/mp4/sample_to_group_iterator.cc b/cobalt/media/formats/mp4/sample_to_group_iterator.cc
deleted file mode 100644
index 5d756a5..0000000
--- a/cobalt/media/formats/mp4/sample_to_group_iterator.cc
+++ /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.
-
-#include "cobalt/media/formats/mp4/sample_to_group_iterator.h"
-
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-SampleToGroupIterator::SampleToGroupIterator(
-    const SampleToGroup& sample_to_group)
-    : remaining_samples_(0),
-      sample_to_group_table_(sample_to_group.entries),
-      iterator_(sample_to_group_table_.begin()) {
-  // Handle the case that the table contains an entry with sample count 0.
-  while (iterator_ != sample_to_group_table_.end()) {
-    remaining_samples_ = iterator_->sample_count;
-    if (remaining_samples_ > 0) break;
-    ++iterator_;
-  }
-}
-
-SampleToGroupIterator::~SampleToGroupIterator() {}
-
-bool SampleToGroupIterator::Advance() {
-  DCHECK(IsValid());
-
-  --remaining_samples_;
-  // Handle the case that the table contains an entry with sample count 0.
-  while (remaining_samples_ == 0) {
-    ++iterator_;
-    if (iterator_ == sample_to_group_table_.end()) return false;
-    remaining_samples_ = iterator_->sample_count;
-  }
-  return true;
-}
-
-bool SampleToGroupIterator::IsValid() const { return remaining_samples_ > 0; }
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/sample_to_group_iterator.h b/cobalt/media/formats/mp4/sample_to_group_iterator.h
deleted file mode 100644
index c98b4d9..0000000
--- a/cobalt/media/formats/mp4/sample_to_group_iterator.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MP4_SAMPLE_TO_GROUP_ITERATOR_H_
-#define COBALT_MEDIA_FORMATS_MP4_SAMPLE_TO_GROUP_ITERATOR_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-// Sample To Group Box ('sbgp') can be used to find the group that a sample
-// belongs to and the associated description of that sample group. It is
-// compactly coded though. This class implements the iterator to iterate
-// through the compressed table to get the associated sample group description
-// index.
-class MEDIA_EXPORT SampleToGroupIterator {
- public:
-  explicit SampleToGroupIterator(const SampleToGroup& sample_to_group);
-  ~SampleToGroupIterator();
-
-  // Advances the iterator to refer to the next sample. Return status
-  // indicating whether the sample is still valid.
-  bool Advance();
-
-  // Returns whether the current sample is valid.
-  bool IsValid() const;
-
-  // Returns group description index for current sample.
-  uint32_t group_description_index() const {
-    return iterator_->group_description_index;
-  }
-
- private:
-  // Track how many samples remaining for current table entry.
-  uint32_t remaining_samples_;
-  const std::vector<SampleToGroupEntry>& sample_to_group_table_;
-  std::vector<SampleToGroupEntry>::const_iterator iterator_;
-
-  DISALLOW_COPY_AND_ASSIGN(SampleToGroupIterator);
-};
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_SAMPLE_TO_GROUP_ITERATOR_H_
diff --git a/cobalt/media/formats/mp4/sample_to_group_iterator_unittest.cc b/cobalt/media/formats/mp4/sample_to_group_iterator_unittest.cc
deleted file mode 100644
index 65fd36c..0000000
--- a/cobalt/media/formats/mp4/sample_to_group_iterator_unittest.cc
+++ /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.
-
-#include "cobalt/media/formats/mp4/sample_to_group_iterator.h"
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-namespace {
-const SampleToGroupEntry kCompactSampleToGroupTable[] = {
-    {10, 8}, {9, 5}, {25, 7}, {48, 63}, {8, 2}};
-}  // namespace
-
-class SampleToGroupIteratorTest : public testing::Test {
- public:
-  SampleToGroupIteratorTest() {
-    // Build sample group description index table from kSampleToGroupTable.
-    for (size_t i = 0; i < arraysize(kCompactSampleToGroupTable); ++i) {
-      for (uint32_t j = 0; j < kCompactSampleToGroupTable[i].sample_count;
-           ++j) {
-        sample_to_group_table_.push_back(
-            kCompactSampleToGroupTable[i].group_description_index);
-      }
-    }
-
-    sample_to_group_.entries.assign(
-        kCompactSampleToGroupTable,
-        kCompactSampleToGroupTable + arraysize(kCompactSampleToGroupTable));
-    sample_to_group_iterator_.reset(
-        new SampleToGroupIterator(sample_to_group_));
-  }
-
- protected:
-  std::vector<uint32_t> sample_to_group_table_;
-  SampleToGroup sample_to_group_;
-  std::unique_ptr<SampleToGroupIterator> sample_to_group_iterator_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SampleToGroupIteratorTest);
-};
-
-TEST_F(SampleToGroupIteratorTest, EmptyTable) {
-  SampleToGroup sample_to_group;
-  SampleToGroupIterator iterator(sample_to_group);
-  EXPECT_FALSE(iterator.IsValid());
-}
-
-TEST_F(SampleToGroupIteratorTest, Advance) {
-  ASSERT_EQ(sample_to_group_table_[0],
-            sample_to_group_iterator_->group_description_index());
-  for (uint32_t sample = 1; sample < sample_to_group_table_.size(); ++sample) {
-    ASSERT_TRUE(sample_to_group_iterator_->Advance());
-    ASSERT_EQ(sample_to_group_table_[sample],
-              sample_to_group_iterator_->group_description_index());
-    ASSERT_TRUE(sample_to_group_iterator_->IsValid());
-  }
-  ASSERT_FALSE(sample_to_group_iterator_->Advance());
-  ASSERT_FALSE(sample_to_group_iterator_->IsValid());
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/track_run_iterator.cc b/cobalt/media/formats/mp4/track_run_iterator.cc
deleted file mode 100644
index e64f895..0000000
--- a/cobalt/media/formats/mp4/track_run_iterator.cc
+++ /dev/null
@@ -1,752 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp4/track_run_iterator.h"
-
-#include <algorithm>
-#include <iomanip>
-#include <limits>
-#include <memory>
-#include <string>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/encryption_scheme.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/formats/mp4/rcheck.h"
-#include "cobalt/media/formats/mp4/sample_to_group_iterator.h"
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-struct SampleInfo {
-  int size;
-  int duration;
-  int cts_offset;
-  bool is_keyframe;
-  uint32_t cenc_group_description_index;
-};
-
-struct TrackRunInfo {
-  uint32_t track_id;
-  std::vector<SampleInfo> samples;
-  int64_t timescale;
-  int64_t start_dts;
-  int64_t sample_start_offset;
-
-  bool is_audio;
-  const AudioSampleEntry* audio_description;
-  const VideoSampleEntry* video_description;
-  const SampleGroupDescription* track_sample_encryption_group;
-
-  // Stores sample encryption entries, which is populated from 'senc' box if it
-  // is available, otherwise will try to load from cenc auxiliary information.
-  std::vector<SampleEncryptionEntry> sample_encryption_entries;
-
-  // These variables are useful to load |sample_encryption_entries| from cenc
-  // auxiliary information when 'senc' box is not available.
-  int64_t aux_info_start_offset;  // Only valid if aux_info_total_size > 0.
-  int aux_info_default_size;
-  std::vector<uint8_t> aux_info_sizes;  // Populated if default_size == 0.
-  int aux_info_total_size;
-
-  EncryptionScheme encryption_scheme;
-
-  std::vector<CencSampleEncryptionInfoEntry> fragment_sample_encryption_info;
-
-  TrackRunInfo();
-  ~TrackRunInfo();
-};
-
-TrackRunInfo::TrackRunInfo()
-    : track_id(0),
-      timescale(-1),
-      start_dts(-1),
-      sample_start_offset(-1),
-      is_audio(false),
-      aux_info_start_offset(-1),
-      aux_info_default_size(-1),
-      aux_info_total_size(-1) {}
-TrackRunInfo::~TrackRunInfo() {}
-
-base::TimeDelta TimeDeltaFromRational(int64_t numer, int64_t denom) {
-  // To avoid overflow, split the following calculation:
-  // (numer * base::Time::kMicrosecondsPerSecond) / denom
-  // into:
-  //  (numer / denom) * base::Time::kMicrosecondsPerSecond +
-  // ((numer % denom) * base::Time::kMicrosecondsPerSecond) / denom
-  int64_t a = numer / denom;
-  DCHECK_LE((a > 0 ? a : -a), std::numeric_limits<int64_t>::max() /
-                                  base::Time::kMicrosecondsPerSecond);
-  int64_t timea_in_us = a * base::Time::kMicrosecondsPerSecond;
-
-  int64_t b = numer % denom;
-  DCHECK_LE((b > 0 ? b : -b), std::numeric_limits<int64_t>::max() /
-                                  base::Time::kMicrosecondsPerSecond);
-  int64_t timeb_in_us = (b * base::Time::kMicrosecondsPerSecond) / denom;
-
-  DCHECK((timeb_in_us < 0) ||
-         (timea_in_us <= std::numeric_limits<int64_t>::max() - timeb_in_us));
-  DCHECK((timeb_in_us > 0) ||
-         (timea_in_us >= std::numeric_limits<int64_t>::min() - timeb_in_us));
-  return base::TimeDelta::FromMicroseconds(timea_in_us + timeb_in_us);
-}
-
-DecodeTimestamp DecodeTimestampFromRational(int64_t numer, int64_t denom) {
-  return DecodeTimestamp::FromPresentationTime(
-      TimeDeltaFromRational(numer, denom));
-}
-
-TrackRunIterator::TrackRunIterator(const Movie* moov,
-                                   const scoped_refptr<MediaLog>& media_log)
-    : moov_(moov), media_log_(media_log), sample_offset_(0) {
-  CHECK(moov);
-}
-
-TrackRunIterator::~TrackRunIterator() {}
-
-static std::string HexFlags(uint32_t flags) {
-  std::stringstream stream;
-  stream << std::setfill('0') << std::setw(sizeof(flags) * 2) << std::hex
-         << flags;
-  return stream.str();
-}
-
-static bool PopulateSampleInfo(const TrackExtends& trex,
-                               const TrackFragmentHeader& tfhd,
-                               const TrackFragmentRun& trun,
-                               const int64_t edit_list_offset, const uint32_t i,
-                               SampleInfo* sample_info,
-                               const SampleDependsOn sdtp_sample_depends_on,
-                               bool is_audio,
-                               const scoped_refptr<MediaLog>& media_log) {
-  if (i < trun.sample_sizes.size()) {
-    sample_info->size = trun.sample_sizes[i];
-  } else if (tfhd.default_sample_size > 0) {
-    sample_info->size = tfhd.default_sample_size;
-  } else {
-    sample_info->size = trex.default_sample_size;
-  }
-
-  if (i < trun.sample_durations.size()) {
-    sample_info->duration = trun.sample_durations[i];
-  } else if (tfhd.default_sample_duration > 0) {
-    sample_info->duration = tfhd.default_sample_duration;
-  } else {
-    sample_info->duration = trex.default_sample_duration;
-  }
-
-  if (i < trun.sample_composition_time_offsets.size()) {
-    sample_info->cts_offset = trun.sample_composition_time_offsets[i];
-  } else {
-    sample_info->cts_offset = 0;
-  }
-  sample_info->cts_offset += edit_list_offset;
-
-  uint32_t flags;
-  if (i < trun.sample_flags.size()) {
-    flags = trun.sample_flags[i];
-    DVLOG(4) << __FUNCTION__ << " trun sample flags " << HexFlags(flags);
-  } else if (tfhd.has_default_sample_flags) {
-    flags = tfhd.default_sample_flags;
-    DVLOG(4) << __FUNCTION__ << " tfhd sample flags " << HexFlags(flags);
-  } else {
-    flags = trex.default_sample_flags;
-    DVLOG(4) << __FUNCTION__ << " trex sample flags " << HexFlags(flags);
-  }
-
-  SampleDependsOn sample_depends_on =
-      static_cast<SampleDependsOn>((flags >> 24) & 0x3);
-  if (sample_depends_on == kSampleDependsOnUnknown) {
-    sample_depends_on = sdtp_sample_depends_on;
-  }
-  DVLOG(4) << __FUNCTION__ << " sample_depends_on " << sample_depends_on;
-  if (sample_depends_on == kSampleDependsOnReserved) {
-    MEDIA_LOG(ERROR, media_log) << "Reserved value used in sample dependency"
-                                   " info.";
-    return false;
-  }
-
-  // Per spec (ISO 14496-12:2012), the definition for a "sync sample" is
-  // equivalent to the downstream code's "is keyframe" concept. But media exists
-  // that marks non-key video frames as sync samples (http://crbug.com/507916
-  // and http://crbug.com/310712). Hence, for video we additionally check that
-  // the sample does not depend on others (FFmpeg does too, see mov_read_trun).
-  // Sample dependency is not ignored for audio because encoded audio samples
-  // can depend on other samples and still be used for random access. Generally
-  // all audio samples are expected to be sync samples, but we  prefer to check
-  // the flags to catch badly muxed audio (for now anyway ;P). History of
-  // attempts to get this right discussed in http://crrev.com/1319813002
-  bool sample_is_sync_sample = !(flags & kSampleIsNonSyncSample);
-  bool sample_depends_on_others = sample_depends_on == kSampleDependsOnOthers;
-  sample_info->is_keyframe =
-      sample_is_sync_sample && (!sample_depends_on_others || is_audio);
-
-  DVLOG(4) << __FUNCTION__ << " is_kf:" << sample_info->is_keyframe
-           << " is_sync:" << sample_is_sync_sample
-           << " deps:" << sample_depends_on_others << " audio:" << is_audio;
-
-  return true;
-}
-
-static const CencSampleEncryptionInfoEntry* GetSampleEncryptionInfoEntry(
-    const TrackRunInfo& run_info, uint32_t group_description_index) {
-  const std::vector<CencSampleEncryptionInfoEntry>* entries = NULL;
-
-  // ISO-14496-12 Section 8.9.2.3 and 8.9.4 : group description index
-  // (1) ranges from 1 to the number of sample group entries in the track
-  // level SampleGroupDescription Box, or (2) takes the value 0 to
-  // indicate that this sample is a member of no group, in this case, the
-  // sample is associated with the default values specified in
-  // TrackEncryption Box, or (3) starts at 0x10001, i.e. the index value
-  // 1, with the value 1 in the top 16 bits, to reference fragment-local
-  // SampleGroupDescription Box.
-  // Case (2) is not supported here. The caller must handle it externally
-  // before invoking this function.
-  DCHECK_NE(group_description_index, 0u);
-  if (group_description_index >
-      SampleToGroupEntry::kFragmentGroupDescriptionIndexBase) {
-    group_description_index -=
-        SampleToGroupEntry::kFragmentGroupDescriptionIndexBase;
-    entries = &run_info.fragment_sample_encryption_info;
-  } else {
-    entries = &run_info.track_sample_encryption_group->entries;
-  }
-
-  // |group_description_index| is 1-based.
-  DCHECK_LE(group_description_index, entries->size());
-  return (group_description_index > entries->size())
-             ? NULL
-             : &(*entries)[group_description_index - 1];
-}
-
-// In well-structured encrypted media, each track run will be immediately
-// preceded by its auxiliary information; this is the only optimal storage
-// pattern in terms of minimum number of bytes from a serial stream needed to
-// begin playback. It also allows us to optimize caching on memory-constrained
-// architectures, because we can cache the relatively small auxiliary
-// information for an entire run and then discard data from the input stream,
-// instead of retaining the entire 'mdat' box.
-//
-// We optimize for this situation (with no loss of generality) by sorting track
-// runs during iteration in order of their first data offset (either sample data
-// or auxiliary data).
-class CompareMinTrackRunDataOffset {
- public:
-  bool operator()(const TrackRunInfo& a, const TrackRunInfo& b) {
-    int64_t a_aux = a.aux_info_total_size ? a.aux_info_start_offset
-                                          : std::numeric_limits<int64_t>::max();
-    int64_t b_aux = b.aux_info_total_size ? b.aux_info_start_offset
-                                          : std::numeric_limits<int64_t>::max();
-
-    int64_t a_lesser = std::min(a_aux, a.sample_start_offset);
-    int64_t a_greater = std::max(a_aux, a.sample_start_offset);
-    int64_t b_lesser = std::min(b_aux, b.sample_start_offset);
-    int64_t b_greater = std::max(b_aux, b.sample_start_offset);
-
-    if (a_lesser == b_lesser) return a_greater < b_greater;
-    return a_lesser < b_lesser;
-  }
-};
-
-bool TrackRunIterator::Init(const MovieFragment& moof) {
-  runs_.clear();
-
-  for (size_t i = 0; i < moof.tracks.size(); i++) {
-    const TrackFragment& traf = moof.tracks[i];
-
-    const Track* trak = NULL;
-    for (size_t t = 0; t < moov_->tracks.size(); t++) {
-      if (moov_->tracks[t].header.track_id == traf.header.track_id)
-        trak = &moov_->tracks[t];
-    }
-    RCHECK(trak);
-
-    const TrackExtends* trex = NULL;
-    for (size_t t = 0; t < moov_->extends.tracks.size(); t++) {
-      if (moov_->extends.tracks[t].track_id == traf.header.track_id)
-        trex = &moov_->extends.tracks[t];
-    }
-    RCHECK(trex);
-
-    const SampleDescription& stsd =
-        trak->media.information.sample_table.description;
-    if (stsd.type != kAudio && stsd.type != kVideo) {
-      DVLOG(1) << "Skipping unhandled track type";
-      continue;
-    }
-    size_t desc_idx = traf.header.sample_description_index;
-    if (!desc_idx) desc_idx = trex->default_sample_description_index;
-    RCHECK(desc_idx > 0);  // Descriptions are one-indexed in the file
-    desc_idx -= 1;
-
-    const std::vector<uint8_t>& sample_encryption_data =
-        traf.sample_encryption.sample_encryption_data;
-    std::unique_ptr<BufferReader> sample_encryption_reader;
-    uint32_t sample_encryption_entries_count = 0;
-    if (!sample_encryption_data.empty()) {
-      sample_encryption_reader.reset(new BufferReader(
-          sample_encryption_data.data(), sample_encryption_data.size()));
-      RCHECK(sample_encryption_reader->Read4(&sample_encryption_entries_count));
-    }
-
-    // Process edit list to remove CTS offset introduced in the presence of
-    // B-frames (those that contain a single edit with a nonnegative media
-    // time). Other uses of edit lists are not supported, as they are
-    // both uncommon and better served by higher-level protocols.
-    int64_t edit_list_offset = 0;
-    const std::vector<EditListEntry>& edits = trak->edit.list.edits;
-    if (!edits.empty()) {
-      if (edits.size() > 1)
-        DVLOG(1) << "Multi-entry edit box detected; some components ignored.";
-
-      if (edits[0].media_time < 0) {
-        DVLOG(1) << "Empty edit list entry ignored.";
-      } else {
-        edit_list_offset = -edits[0].media_time;
-      }
-    }
-
-    SampleToGroupIterator sample_to_group_itr(traf.sample_to_group);
-    bool is_sample_to_group_valid = sample_to_group_itr.IsValid();
-
-    int64_t run_start_dts = traf.decode_time.decode_time;
-    uint64_t sample_count_sum = 0;
-    for (size_t j = 0; j < traf.runs.size(); j++) {
-      const TrackFragmentRun& trun = traf.runs[j];
-      TrackRunInfo tri;
-      tri.track_id = traf.header.track_id;
-      tri.timescale = trak->media.header.timescale;
-      tri.start_dts = run_start_dts;
-      tri.sample_start_offset = trun.data_offset;
-      tri.track_sample_encryption_group =
-          &trak->media.information.sample_table.sample_group_description;
-      tri.fragment_sample_encryption_info =
-          traf.sample_group_description.entries;
-
-      const TrackEncryption* track_encryption;
-      const ProtectionSchemeInfo* sinf;
-      tri.is_audio = (stsd.type == kAudio);
-      if (tri.is_audio) {
-        RCHECK(!stsd.audio_entries.empty());
-        if (desc_idx > stsd.audio_entries.size()) desc_idx = 0;
-        tri.audio_description = &stsd.audio_entries[desc_idx];
-        sinf = &tri.audio_description->sinf;
-        track_encryption = &tri.audio_description->sinf.info.track_encryption;
-      } else {
-        RCHECK(!stsd.video_entries.empty());
-        if (desc_idx > stsd.video_entries.size()) desc_idx = 0;
-        tri.video_description = &stsd.video_entries[desc_idx];
-        sinf = &tri.video_description->sinf;
-        track_encryption = &tri.video_description->sinf.info.track_encryption;
-      }
-
-      if (!sinf->HasSupportedScheme()) {
-        tri.encryption_scheme = Unencrypted();
-      } else {
-        tri.encryption_scheme = EncryptionScheme(
-            sinf->IsCbcsEncryptionScheme()
-                ? EncryptionScheme::CIPHER_MODE_AES_CBC
-                : EncryptionScheme::CIPHER_MODE_AES_CTR,
-            EncryptionPattern(track_encryption->default_crypt_byte_block,
-                              track_encryption->default_skip_byte_block));
-      }
-
-      // Initialize aux_info variables only if no sample encryption entries.
-      if (sample_encryption_entries_count == 0 &&
-          traf.auxiliary_offset.offsets.size() > j) {
-        // Collect information from the auxiliary_offset entry with the same
-        // index in the 'saiz' container as the current run's index in the
-        // 'trun' container, if it is present.
-        // There should be an auxiliary info entry corresponding to each sample
-        // in the auxiliary offset entry's corresponding track run.
-        RCHECK(traf.auxiliary_size.sample_count >=
-               sample_count_sum + trun.sample_count);
-        tri.aux_info_start_offset = traf.auxiliary_offset.offsets[j];
-        tri.aux_info_default_size =
-            traf.auxiliary_size.default_sample_info_size;
-        if (tri.aux_info_default_size == 0) {
-          const std::vector<uint8_t>& sizes =
-              traf.auxiliary_size.sample_info_sizes;
-          tri.aux_info_sizes.insert(
-              tri.aux_info_sizes.begin(), sizes.begin() + sample_count_sum,
-              sizes.begin() + sample_count_sum + trun.sample_count);
-        }
-
-        // If the default info size is positive, find the total size of the aux
-        // info block from it, otherwise sum over the individual sizes of each
-        // aux info entry in the aux_offset entry.
-        if (tri.aux_info_default_size) {
-          tri.aux_info_total_size =
-              tri.aux_info_default_size * trun.sample_count;
-        } else {
-          tri.aux_info_total_size = 0;
-          for (size_t k = 0; k < trun.sample_count; k++) {
-            tri.aux_info_total_size += tri.aux_info_sizes[k];
-          }
-        }
-      } else {
-        tri.aux_info_start_offset = -1;
-        tri.aux_info_total_size = 0;
-      }
-
-      tri.samples.resize(trun.sample_count);
-      for (size_t k = 0; k < trun.sample_count; k++) {
-        if (!PopulateSampleInfo(*trex, traf.header, trun, edit_list_offset, k,
-                                &tri.samples[k], traf.sdtp.sample_depends_on(k),
-                                tri.is_audio, media_log_)) {
-          return false;
-        }
-
-        run_start_dts += tri.samples[k].duration;
-
-        if (!is_sample_to_group_valid) {
-          // Set group description index to 0 to read encryption information
-          // from TrackEncryption Box.
-          tri.samples[k].cenc_group_description_index = 0;
-          continue;
-        }
-
-        uint32_t index = sample_to_group_itr.group_description_index();
-        tri.samples[k].cenc_group_description_index = index;
-        if (index != 0) RCHECK(GetSampleEncryptionInfoEntry(tri, index));
-        is_sample_to_group_valid = sample_to_group_itr.Advance();
-      }
-      if (sample_encryption_entries_count > 0) {
-        RCHECK(sample_encryption_entries_count >=
-               sample_count_sum + trun.sample_count);
-        tri.sample_encryption_entries.resize(trun.sample_count);
-        for (size_t k = 0; k < trun.sample_count; k++) {
-          uint32_t index = tri.samples[k].cenc_group_description_index;
-          const CencSampleEncryptionInfoEntry* info_entry =
-              index == 0 ? nullptr : GetSampleEncryptionInfoEntry(tri, index);
-          const uint8_t iv_size = index == 0 ? track_encryption->default_iv_size
-                                             : info_entry->iv_size;
-          SampleEncryptionEntry& entry = tri.sample_encryption_entries[k];
-          RCHECK(entry.Parse(sample_encryption_reader.get(), iv_size,
-                             traf.sample_encryption.use_subsample_encryption));
-          // If we don't have a per-sample IV, get the constant IV.
-          bool is_encrypted = index == 0 ? track_encryption->is_encrypted
-                                         : info_entry->is_encrypted;
-          // We only support setting the pattern values in the 'tenc' box for
-          // the track (not varying on per sample group basis).
-          // Thus we need to verify that the settings in the sample group match
-          // those in the 'tenc'.
-          if (is_encrypted && index != 0) {
-            RCHECK_MEDIA_LOGGED(info_entry->crypt_byte_block ==
-                                    track_encryption->default_crypt_byte_block,
-                                media_log_,
-                                "Pattern value (crypt byte block) for the "
-                                "sample group does not match that in the tenc "
-                                "box . This is not currently supported.");
-            RCHECK_MEDIA_LOGGED(info_entry->skip_byte_block ==
-                                    track_encryption->default_skip_byte_block,
-                                media_log_,
-                                "Pattern value (skip byte block) for the "
-                                "sample group does not match that in the tenc "
-                                "box . This is not currently supported.");
-          }
-          if (is_encrypted && !iv_size) {
-            const uint8_t constant_iv_size =
-                index == 0 ? track_encryption->default_constant_iv_size
-                           : info_entry->constant_iv_size;
-            RCHECK(constant_iv_size != 0);
-            const uint8_t* constant_iv =
-                index == 0 ? track_encryption->default_constant_iv
-                           : info_entry->constant_iv;
-            memcpy(entry.initialization_vector, constant_iv,
-                         constant_iv_size);
-          }
-        }
-      }
-      runs_.push_back(tri);
-      sample_count_sum += trun.sample_count;
-    }
-
-    // We should have iterated through all samples in SampleToGroup Box.
-    RCHECK(!sample_to_group_itr.IsValid());
-  }
-
-  std::sort(runs_.begin(), runs_.end(), CompareMinTrackRunDataOffset());
-  run_itr_ = runs_.begin();
-  ResetRun();
-  return true;
-}
-
-void TrackRunIterator::AdvanceRun() {
-  ++run_itr_;
-  ResetRun();
-}
-
-void TrackRunIterator::ResetRun() {
-  if (!IsRunValid()) return;
-  sample_dts_ = run_itr_->start_dts;
-  sample_offset_ = run_itr_->sample_start_offset;
-  sample_itr_ = run_itr_->samples.begin();
-}
-
-void TrackRunIterator::AdvanceSample() {
-  DCHECK(IsSampleValid());
-  sample_dts_ += sample_itr_->duration;
-  sample_offset_ += sample_itr_->size;
-  ++sample_itr_;
-}
-
-// This implementation only indicates a need for caching if CENC auxiliary
-// info is available in the stream.
-bool TrackRunIterator::AuxInfoNeedsToBeCached() {
-  DCHECK(IsRunValid());
-  return is_encrypted() && aux_info_size() > 0 &&
-         run_itr_->sample_encryption_entries.size() == 0;
-}
-
-// This implementation currently only caches CENC auxiliary info.
-bool TrackRunIterator::CacheAuxInfo(const uint8_t* buf, int buf_size) {
-  RCHECK(AuxInfoNeedsToBeCached() && buf_size >= aux_info_size());
-
-  std::vector<SampleEncryptionEntry>& sample_encryption_entries =
-      runs_[run_itr_ - runs_.begin()].sample_encryption_entries;
-  sample_encryption_entries.resize(run_itr_->samples.size());
-  int64_t pos = 0;
-  for (size_t i = 0; i < run_itr_->samples.size(); i++) {
-    int info_size = run_itr_->aux_info_default_size;
-    if (!info_size) info_size = run_itr_->aux_info_sizes[i];
-
-    if (IsSampleEncrypted(i)) {
-      BufferReader reader(buf + pos, info_size);
-      const uint8_t iv_size = GetIvSize(i);
-      const bool has_subsamples = info_size > iv_size;
-      SampleEncryptionEntry& entry = sample_encryption_entries[i];
-      RCHECK(entry.Parse(&reader, iv_size, has_subsamples));
-      // if we don't have a per-sample IV, get the constant IV.
-      if (!iv_size) {
-        RCHECK(ApplyConstantIv(i, &entry));
-      }
-    }
-    pos += info_size;
-  }
-
-  return true;
-}
-
-bool TrackRunIterator::IsRunValid() const { return run_itr_ != runs_.end(); }
-
-bool TrackRunIterator::IsSampleValid() const {
-  return IsRunValid() && (sample_itr_ != run_itr_->samples.end());
-}
-
-// Because tracks are in sorted order and auxiliary information is cached when
-// returning samples, it is guaranteed that no data will be required before the
-// lesser of the minimum data offset of this track and the next in sequence.
-// (The stronger condition - that no data is required before the minimum data
-// offset of this track alone - is not guaranteed, because the BMFF spec does
-// not have any inter-run ordering restrictions.)
-int64_t TrackRunIterator::GetMaxClearOffset() {
-  int64_t offset = std::numeric_limits<int64_t>::max();
-
-  if (IsSampleValid()) {
-    offset = std::min(offset, sample_offset_);
-    if (AuxInfoNeedsToBeCached()) offset = std::min(offset, aux_info_offset());
-  }
-  if (run_itr_ != runs_.end()) {
-    std::vector<TrackRunInfo>::const_iterator next_run = run_itr_ + 1;
-    if (next_run != runs_.end()) {
-      offset = std::min(offset, next_run->sample_start_offset);
-      if (next_run->aux_info_total_size)
-        offset = std::min(offset, next_run->aux_info_start_offset);
-    }
-  }
-  if (offset == std::numeric_limits<int64_t>::max()) return 0;
-  return offset;
-}
-
-uint32_t TrackRunIterator::track_id() const {
-  DCHECK(IsRunValid());
-  return run_itr_->track_id;
-}
-
-bool TrackRunIterator::is_encrypted() const {
-  DCHECK(IsSampleValid());
-  return IsSampleEncrypted(sample_itr_ - run_itr_->samples.begin());
-}
-
-int64_t TrackRunIterator::aux_info_offset() const {
-  return run_itr_->aux_info_start_offset;
-}
-
-int TrackRunIterator::aux_info_size() const {
-  return run_itr_->aux_info_total_size;
-}
-
-bool TrackRunIterator::is_audio() const {
-  DCHECK(IsRunValid());
-  return run_itr_->is_audio;
-}
-
-const AudioSampleEntry& TrackRunIterator::audio_description() const {
-  DCHECK(is_audio());
-  DCHECK(run_itr_->audio_description);
-  return *run_itr_->audio_description;
-}
-
-const VideoSampleEntry& TrackRunIterator::video_description() const {
-  DCHECK(!is_audio());
-  DCHECK(run_itr_->video_description);
-  return *run_itr_->video_description;
-}
-
-int64_t TrackRunIterator::sample_offset() const {
-  DCHECK(IsSampleValid());
-  return sample_offset_;
-}
-
-int TrackRunIterator::sample_size() const {
-  DCHECK(IsSampleValid());
-  return sample_itr_->size;
-}
-
-DecodeTimestamp TrackRunIterator::dts() const {
-  DCHECK(IsSampleValid());
-  return DecodeTimestampFromRational(sample_dts_, run_itr_->timescale);
-}
-
-base::TimeDelta TrackRunIterator::cts() const {
-  DCHECK(IsSampleValid());
-  return TimeDeltaFromRational(sample_dts_ + sample_itr_->cts_offset,
-                               run_itr_->timescale);
-}
-
-base::TimeDelta TrackRunIterator::duration() const {
-  DCHECK(IsSampleValid());
-  return TimeDeltaFromRational(sample_itr_->duration, run_itr_->timescale);
-}
-
-bool TrackRunIterator::is_keyframe() const {
-  DCHECK(IsSampleValid());
-  return sample_itr_->is_keyframe;
-}
-
-const ProtectionSchemeInfo& TrackRunIterator::protection_scheme_info() const {
-  if (is_audio())
-    return audio_description().sinf;
-  return video_description().sinf;
-}
-
-const TrackEncryption& TrackRunIterator::track_encryption() const {
-  return protection_scheme_info().info.track_encryption;
-}
-
-std::unique_ptr<DecryptConfig> TrackRunIterator::GetDecryptConfig() {
-  DCHECK(is_encrypted());
-  size_t sample_idx = sample_itr_ - run_itr_->samples.begin();
-  const std::vector<uint8_t>& kid = GetKeyId(sample_idx);
-  std::string key_id(kid.begin(), kid.end());
-
-  if (run_itr_->sample_encryption_entries.empty()) {
-    DCHECK_EQ(0, aux_info_size());
-    // The 'cbcs' scheme allows empty aux info when a constant IV is in use
-    // with full sample encryption. That case will fall through to here.
-    SampleEncryptionEntry sample_encryption_entry;
-    if (ApplyConstantIv(sample_idx, &sample_encryption_entry)) {
-      std::string iv(reinterpret_cast<const char*>(
-                         sample_encryption_entry.initialization_vector),
-                     arraysize(sample_encryption_entry.initialization_vector));
-      switch (run_itr_->encryption_scheme.mode()) {
-        case EncryptionScheme::CIPHER_MODE_UNENCRYPTED:
-          return nullptr;
-        case EncryptionScheme::CIPHER_MODE_AES_CTR:
-          return DecryptConfig::CreateCencConfig(
-              key_id, iv, sample_encryption_entry.subsamples);
-        case EncryptionScheme::CIPHER_MODE_AES_CBC:
-          return DecryptConfig::CreateCbcsConfig(
-              key_id, iv, sample_encryption_entry.subsamples,
-              run_itr_->encryption_scheme.pattern());
-      }
-    }
-    MEDIA_LOG(ERROR, media_log_) << "Sample encryption info is not available.";
-    return nullptr;
-  }
-
-  DCHECK_LT(sample_idx, run_itr_->sample_encryption_entries.size());
-  const SampleEncryptionEntry& sample_encryption_entry =
-      run_itr_->sample_encryption_entries[sample_idx];
-  std::string iv(reinterpret_cast<const char*>(
-                     sample_encryption_entry.initialization_vector),
-                 arraysize(sample_encryption_entry.initialization_vector));
-
-  size_t total_size = 0;
-  if (!sample_encryption_entry.subsamples.empty() &&
-      (!sample_encryption_entry.GetTotalSizeOfSubsamples(&total_size) ||
-       total_size != static_cast<size_t>(sample_size()))) {
-    MEDIA_LOG(ERROR, media_log_) << "Incorrect CENC subsample size.";
-    return nullptr;
-  }
-
-  if (protection_scheme_info().IsCbcsEncryptionScheme()) {
-    uint32_t index = GetGroupDescriptionIndex(sample_idx);
-    uint32_t encrypt_blocks =
-        (index == 0)
-            ? track_encryption().default_crypt_byte_block
-            : GetSampleEncryptionInfoEntry(*run_itr_, index)->crypt_byte_block;
-    uint32_t skip_blocks =
-        (index == 0)
-            ? track_encryption().default_skip_byte_block
-            : GetSampleEncryptionInfoEntry(*run_itr_, index)->skip_byte_block;
-    return DecryptConfig::CreateCbcsConfig(
-        key_id, iv, sample_encryption_entry.subsamples,
-        EncryptionPattern(encrypt_blocks, skip_blocks));
-  }
-
-  return DecryptConfig::CreateCencConfig(key_id, iv,
-                                         sample_encryption_entry.subsamples);
-}
-
-uint32_t TrackRunIterator::GetGroupDescriptionIndex(
-    uint32_t sample_index) const {
-  DCHECK(IsRunValid());
-  DCHECK_LT(sample_index, run_itr_->samples.size());
-  return run_itr_->samples[sample_index].cenc_group_description_index;
-}
-
-bool TrackRunIterator::IsSampleEncrypted(size_t sample_index) const {
-  uint32_t index = GetGroupDescriptionIndex(sample_index);
-  return (index == 0)
-             ? track_encryption().is_encrypted
-             : GetSampleEncryptionInfoEntry(*run_itr_, index)->is_encrypted;
-}
-
-const std::vector<uint8_t>& TrackRunIterator::GetKeyId(
-    size_t sample_index) const {
-  uint32_t index = GetGroupDescriptionIndex(sample_index);
-  return (index == 0) ? track_encryption().default_kid
-                      : GetSampleEncryptionInfoEntry(*run_itr_, index)->key_id;
-}
-
-uint8_t TrackRunIterator::GetIvSize(size_t sample_index) const {
-  uint32_t index = GetGroupDescriptionIndex(sample_index);
-  return (index == 0) ? track_encryption().default_iv_size
-                      : GetSampleEncryptionInfoEntry(*run_itr_, index)->iv_size;
-}
-
-bool TrackRunIterator::ApplyConstantIv(size_t sample_index,
-                                       SampleEncryptionEntry* entry) const {
-  DCHECK(IsSampleEncrypted(sample_index));
-  uint32_t index = GetGroupDescriptionIndex(sample_index);
-  const uint8_t constant_iv_size =
-      index == 0
-          ? track_encryption().default_constant_iv_size
-          : GetSampleEncryptionInfoEntry(*run_itr_, index)->constant_iv_size;
-  RCHECK(constant_iv_size != 0);
-  const uint8_t* constant_iv =
-      index == 0 ? track_encryption().default_constant_iv
-                 : GetSampleEncryptionInfoEntry(*run_itr_, index)->constant_iv;
-  RCHECK(constant_iv != nullptr);
-  memcpy(entry->initialization_vector, constant_iv,
-               kInitializationVectorSize);
-  return true;
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mp4/track_run_iterator.h b/cobalt/media/formats/mp4/track_run_iterator.h
deleted file mode 100644
index d916ca4..0000000
--- a/cobalt/media/formats/mp4/track_run_iterator.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 COBALT_MEDIA_FORMATS_MP4_TRACK_RUN_ITERATOR_H_
-#define COBALT_MEDIA_FORMATS_MP4_TRACK_RUN_ITERATOR_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class DecryptConfig;
-
-namespace mp4 {
-
-base::TimeDelta MEDIA_EXPORT TimeDeltaFromRational(int64_t numer,
-                                                   int64_t denom);
-DecodeTimestamp MEDIA_EXPORT DecodeTimestampFromRational(int64_t numer,
-                                                         int64_t denom);
-
-struct SampleInfo;
-struct TrackRunInfo;
-
-class MEDIA_EXPORT TrackRunIterator {
- public:
-  // Create a new TrackRunIterator. A reference to |moov| will be retained for
-  // the lifetime of this object.
-  TrackRunIterator(const Movie* moov, const scoped_refptr<MediaLog>& media_log);
-  ~TrackRunIterator();
-
-  // Sets up the iterator to handle all the runs from the current fragment.
-  bool Init(const MovieFragment& moof);
-
-  // Returns true if the properties of the current run or sample are valid.
-  bool IsRunValid() const;
-  bool IsSampleValid() const;
-
-  // Advance the properties to refer to the next run or sample. Requires that
-  // the current sample be valid.
-  void AdvanceRun();
-  void AdvanceSample();
-
-  // Returns true if this track run has auxiliary information and has not yet
-  // been cached. Only valid if IsRunValid().
-  bool AuxInfoNeedsToBeCached();
-
-  // Caches the CENC data from the given buffer. |buf| must be a buffer starting
-  // at the offset given by cenc_offset(), with a |size| of at least
-  // cenc_size(). Returns true on success, false on error.
-  bool CacheAuxInfo(const uint8_t* buf, int size);
-
-  // Returns the maximum buffer location at which no data earlier in the stream
-  // will be required in order to read the current or any subsequent sample. You
-  // may clear all data up to this offset before reading the current sample
-  // safely. Result is in the same units as offset() (for Media Source this is
-  // in bytes past the the head of the MOOF box).
-  int64_t GetMaxClearOffset();
-
-  // Property of the current run. Only valid if IsRunValid().
-  uint32_t track_id() const;
-  int64_t aux_info_offset() const;
-  int aux_info_size() const;
-  bool is_encrypted() const;
-  bool is_audio() const;
-  // Only one is valid, based on the value of is_audio().
-  const AudioSampleEntry& audio_description() const;
-  const VideoSampleEntry& video_description() const;
-
-  // Properties of the current sample. Only valid if IsSampleValid().
-  int64_t sample_offset() const;
-  int sample_size() const;
-  DecodeTimestamp dts() const;
-  base::TimeDelta cts() const;
-  base::TimeDelta duration() const;
-  bool is_keyframe() const;
-
-  // Only call when is_encrypted() is true and AuxInfoNeedsToBeCached() is
-  // false. Result is owned by caller.
-  std::unique_ptr<DecryptConfig> GetDecryptConfig();
-
- private:
-  void ResetRun();
-  const ProtectionSchemeInfo& protection_scheme_info() const;
-  const TrackEncryption& track_encryption() const;
-
-  uint32_t GetGroupDescriptionIndex(uint32_t sample_index) const;
-
-  // Sample encryption information.
-  bool IsSampleEncrypted(size_t sample_index) const;
-  uint8_t GetIvSize(size_t sample_index) const;
-  const std::vector<uint8_t>& GetKeyId(size_t sample_index) const;
-  bool ApplyConstantIv(size_t sample_index, SampleEncryptionEntry* entry) const;
-
-  const Movie* moov_;
-  scoped_refptr<MediaLog> media_log_;
-
-  std::vector<TrackRunInfo> runs_;
-  std::vector<TrackRunInfo>::const_iterator run_itr_;
-  std::vector<SampleInfo>::const_iterator sample_itr_;
-
-  int64_t sample_dts_;
-  int64_t sample_offset_;
-
-  DISALLOW_COPY_AND_ASSIGN(TrackRunIterator);
-};
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MP4_TRACK_RUN_ITERATOR_H_
diff --git a/cobalt/media/formats/mp4/track_run_iterator_unittest.cc b/cobalt/media/formats/mp4/track_run_iterator_unittest.cc
deleted file mode 100644
index e6832dd..0000000
--- a/cobalt/media/formats/mp4/track_run_iterator_unittest.cc
+++ /dev/null
@@ -1,1078 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mp4/track_run_iterator.h"
-
-#include <memory>
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/strings/string_split.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/formats/mp4/box_definitions.h"
-#include "cobalt/media/formats/mp4/rcheck.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::StrictMock;
-
-namespace {
-
-// The sum of the elements in a vector initialized with SumAscending,
-// less the value of the last element.
-const int kSumAscending1 = 45;
-
-const int kAudioScale = 48000;
-const int kVideoScale = 25;
-
-const uint8_t kAuxInfo[] = {
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x31, 0x41, 0x54,
-    0x65, 0x73, 0x74, 0x49, 0x76, 0x32, 0x00, 0x02, 0x00, 0x01,
-    0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04,
-};
-
-// Sample encryption data for two samples, one with 8 byte IV, one with 16 byte
-// IV. This data is generated for testing. It should be very unlikely to see
-// IV of mixed size in actual media files, though it is permitted by spec.
-const uint8_t kSampleEncryptionDataWithSubsamples[] = {
-    // Sample count.
-    0x00, 0x00, 0x00, 0x02,
-    // Sample 1: IV (8 Bytes).
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x31,
-    // Sample 1: Subsample count.
-    0x00, 0x01,
-    // Sample 1: Subsample 1.
-    0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-    // Sample 2: IV (16 bytes).
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x32, 0x41, 0x42, 0x43, 0x44,
-    0x45, 0x46, 0x47, 0x48,
-    // Sample 2: Subsample count.
-    0x00, 0x02,
-    // Sample 2: Subsample 1.
-    0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-    // Sample 2: Subsample 2.
-    0x00, 0x03, 0x00, 0x00, 0x00, 0x04,
-};
-
-const uint8_t kSampleEncryptionDataWithoutSubsamples[] = {
-    // Sample count.
-    0x00, 0x00, 0x00, 0x02,
-    // Sample 1: IV.
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x31,
-    // Sample 2: IV.
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x32,
-};
-
-// Size of these two IVs are 8 bytes. They are padded with 0 to 16 bytes.
-const char kIv1[] = {
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x31,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-const char kIv2[] = {
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x32,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-// Size of this IV is 16 bytes.
-const char kIv3[] = {
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x32,
-    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
-};
-
-const uint8_t kKeyId[] = {
-    0x41, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x54,
-    0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x44,
-};
-
-const uint8_t kTrackCencSampleGroupKeyId[] = {
-    0x46, 0x72, 0x61, 0x67, 0x53, 0x61, 0x6d, 0x70,
-    0x6c, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b,
-};
-
-const uint8_t kFragmentCencSampleGroupKeyId[] = {
-    0x6b, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e,
-    0x74, 0x43, 0x65, 0x6e, 0x63, 0x53, 0x61, 0x6d,
-};
-
-// Sample encryption data for two samples, using constant IV (defined by 'tenc'
-// or sample group entry).
-const uint8_t kSampleEncryptionDataWithSubsamplesAndConstantIv[] = {
-    // Sample count.
-    0x00, 0x00, 0x00, 0x05,
-    // Sample 1: Subsample count.
-    0x00, 0x01,
-    // Sample 1: Subsample 1.
-    0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-    // Sample 2: Subsample count.
-    0x00, 0x02,
-    // Sample 2: Subsample 1.
-    0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-    // Sample 2: Subsample 2.
-    0x00, 0x03, 0x00, 0x00, 0x00, 0x04,
-    // Sample 3: Subsample count.
-    0x00, 0x01,
-    // Sample 3: Subsample 1.
-    0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-    // Sample 4: Subsample count.
-    0x00, 0x01,
-    // Sample 4: Subsample 1.
-    0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-    // Sample 5: Subsample count.
-    0x00, 0x01,
-    // Sample 5: Subsample 1.
-    0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-};
-
-// Size of these IVs are 16 bytes.
-const char kIv4[] = {
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x34,
-    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
-};
-
-const char kIv5[] = {
-    0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x35,
-    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
-};
-
-}  // namespace
-
-namespace cobalt {
-namespace media {
-namespace mp4 {
-
-MATCHER(ReservedValueInSampleDependencyInfo, "") {
-  return CONTAINS_STRING(arg, "Reserved value used in sample dependency info.");
-}
-
-class TrackRunIteratorTest : public testing::Test {
- public:
-  TrackRunIteratorTest() : media_log_(new StrictMock<MockMediaLog>()) {
-    CreateMovie();
-  }
-
- protected:
-  Movie moov_;
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-  std::unique_ptr<TrackRunIterator> iter_;
-
-  void CreateMovie() {
-    moov_.header.timescale = 1000;
-    moov_.tracks.resize(3);
-    moov_.extends.tracks.resize(2);
-    moov_.tracks[0].header.track_id = 1;
-    moov_.tracks[0].media.header.timescale = kAudioScale;
-    SampleDescription& desc1 =
-        moov_.tracks[0].media.information.sample_table.description;
-    AudioSampleEntry aud_desc;
-    aud_desc.format = FOURCC_MP4A;
-    aud_desc.sinf.info.track_encryption.is_encrypted = false;
-    desc1.type = kAudio;
-    desc1.audio_entries.push_back(aud_desc);
-    moov_.extends.tracks[0].track_id = 1;
-    moov_.extends.tracks[0].default_sample_description_index = 1;
-    moov_.tracks[1].header.track_id = 2;
-    moov_.tracks[1].media.header.timescale = kVideoScale;
-    SampleDescription& desc2 =
-        moov_.tracks[1].media.information.sample_table.description;
-    VideoSampleEntry vid_desc;
-    vid_desc.format = FOURCC_AVC1;
-    vid_desc.sinf.info.track_encryption.is_encrypted = false;
-    desc2.type = kVideo;
-    desc2.video_entries.push_back(vid_desc);
-    moov_.extends.tracks[1].track_id = 2;
-    moov_.extends.tracks[1].default_sample_description_index = 1;
-
-    moov_.tracks[2].header.track_id = 3;
-    moov_.tracks[2].media.information.sample_table.description.type = kHint;
-  }
-
-  uint32_t ToSampleFlags(const std::string& str) {
-    CHECK_EQ(str.length(), 2u);
-
-    SampleDependsOn sample_depends_on = kSampleDependsOnReserved;
-    bool is_non_sync_sample = false;
-    switch (str[0]) {
-      case 'U':
-        sample_depends_on = kSampleDependsOnUnknown;
-        break;
-      case 'O':
-        sample_depends_on = kSampleDependsOnOthers;
-        break;
-      case 'N':
-        sample_depends_on = kSampleDependsOnNoOther;
-        break;
-      case 'R':
-        sample_depends_on = kSampleDependsOnReserved;
-        break;
-      default:
-        CHECK(false) << "Invalid sample dependency character '" << str[0]
-                     << "'";
-        break;
-    }
-
-    switch (str[1]) {
-      case 'S':
-        is_non_sync_sample = false;
-        break;
-      case 'N':
-        is_non_sync_sample = true;
-        break;
-      default:
-        CHECK(false) << "Invalid sync sample character '" << str[1] << "'";
-        break;
-    }
-    uint32_t flags = static_cast<uint32_t>(sample_depends_on) << 24;
-    if (is_non_sync_sample) flags |= kSampleIsNonSyncSample;
-    return flags;
-  }
-
-  void SetFlagsOnSamples(const std::string& sample_info,
-                         TrackFragmentRun* trun) {
-    // US - SampleDependsOnUnknown & IsSyncSample
-    // UN - SampleDependsOnUnknown & IsNonSyncSample
-    // OS - SampleDependsOnOthers & IsSyncSample
-    // ON - SampleDependsOnOthers & IsNonSyncSample
-    // NS - SampleDependsOnNoOthers & IsSyncSample
-    // NN - SampleDependsOnNoOthers & IsNonSyncSample
-    std::vector<std::string> flags_data = base::SplitString(
-        sample_info, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-
-    if (flags_data.size() == 1u) {
-      // Simulates the first_sample_flags_present set scenario,
-      // where only one sample_flag value is set and the default
-      // flags are used for everything else.
-      ASSERT_GE(trun->sample_count, flags_data.size());
-    } else {
-      ASSERT_EQ(trun->sample_count, flags_data.size());
-    }
-
-    trun->sample_flags.resize(flags_data.size());
-    for (size_t i = 0; i < flags_data.size(); i++)
-      trun->sample_flags[i] = ToSampleFlags(flags_data[i]);
-  }
-
-  std::string KeyframeAndRAPInfo(TrackRunIterator* iter) {
-    CHECK(iter->IsRunValid());
-    std::stringstream ss;
-    ss << iter->track_id();
-
-    while (iter->IsSampleValid()) {
-      ss << " " << (iter->is_keyframe() ? "K" : "P");
-      iter->AdvanceSample();
-    }
-
-    return ss.str();
-  }
-
-  MovieFragment CreateFragment() {
-    MovieFragment moof;
-    moof.tracks.resize(2);
-    moof.tracks[0].decode_time.decode_time = 0;
-    moof.tracks[0].header.track_id = 1;
-    moof.tracks[0].header.has_default_sample_flags = true;
-    moof.tracks[0].header.default_sample_flags = ToSampleFlags("US");
-    moof.tracks[0].header.default_sample_duration = 1024;
-    moof.tracks[0].header.default_sample_size = 4;
-    moof.tracks[0].runs.resize(2);
-    moof.tracks[0].runs[0].sample_count = 10;
-    moof.tracks[0].runs[0].data_offset = 100;
-    SetAscending(&moof.tracks[0].runs[0].sample_sizes);
-
-    moof.tracks[0].runs[1].sample_count = 10;
-    moof.tracks[0].runs[1].data_offset = 10000;
-
-    moof.tracks[1].header.track_id = 2;
-    moof.tracks[1].header.has_default_sample_flags = false;
-    moof.tracks[1].decode_time.decode_time = 10;
-    moof.tracks[1].runs.resize(1);
-    moof.tracks[1].runs[0].sample_count = 10;
-    moof.tracks[1].runs[0].data_offset = 200;
-    SetAscending(&moof.tracks[1].runs[0].sample_sizes);
-    SetAscending(&moof.tracks[1].runs[0].sample_durations);
-    SetFlagsOnSamples("US UN UN UN UN UN UN UN UN UN", &moof.tracks[1].runs[0]);
-
-    return moof;
-  }
-
-  ProtectionSchemeInfo* GetProtectionSchemeInfoForTrack(Track* track) {
-    SampleDescription* stsd =
-        &track->media.information.sample_table.description;
-    ProtectionSchemeInfo* sinf;
-    if (!stsd->video_entries.empty()) {
-      sinf = &stsd->video_entries[0].sinf;
-    } else {
-      sinf = &stsd->audio_entries[0].sinf;
-    }
-    return sinf;
-  }
-
-  // Update the first sample description of a Track to indicate CENC encryption
-  void AddEncryption(Track* track) {
-    ProtectionSchemeInfo* sinf = GetProtectionSchemeInfoForTrack(track);
-    sinf->type.type = FOURCC_CENC;
-    sinf->info.track_encryption.is_encrypted = true;
-    sinf->info.track_encryption.default_iv_size = 8;
-    sinf->info.track_encryption.default_kid.assign(kKeyId,
-                                                   kKeyId + arraysize(kKeyId));
-  }
-
-  // Add SampleGroupDescription Box to track level sample table and to
-  // fragment. Populate SampleToGroup Box from input array.
-  void AddCencSampleGroup(Track* track, TrackFragment* frag,
-                          const SampleToGroupEntry* sample_to_group_entries,
-                          size_t num_entries) {
-    auto& track_cenc_group =
-        track->media.information.sample_table.sample_group_description;
-    track_cenc_group.grouping_type = FOURCC_SEIG;
-    track_cenc_group.entries.resize(1);
-    track_cenc_group.entries[0].is_encrypted = true;
-    track_cenc_group.entries[0].iv_size = 8;
-    track_cenc_group.entries[0].key_id.assign(
-        kTrackCencSampleGroupKeyId,
-        kTrackCencSampleGroupKeyId + arraysize(kTrackCencSampleGroupKeyId));
-
-    frag->sample_group_description.grouping_type = FOURCC_SEIG;
-    frag->sample_group_description.entries.resize(3);
-    frag->sample_group_description.entries[0].is_encrypted = false;
-    frag->sample_group_description.entries[0].iv_size = 0;
-    frag->sample_group_description.entries[1].is_encrypted = true;
-    frag->sample_group_description.entries[1].iv_size = 8;
-    frag->sample_group_description.entries[1].key_id.assign(
-        kFragmentCencSampleGroupKeyId,
-        kFragmentCencSampleGroupKeyId +
-            arraysize(kFragmentCencSampleGroupKeyId));
-    frag->sample_group_description.entries[2].is_encrypted = true;
-    frag->sample_group_description.entries[2].iv_size = 16;
-    frag->sample_group_description.entries[2].key_id.assign(
-        kKeyId, kKeyId + arraysize(kKeyId));
-
-    frag->sample_to_group.grouping_type = FOURCC_SEIG;
-    frag->sample_to_group.entries.assign(sample_to_group_entries,
-                                         sample_to_group_entries + num_entries);
-  }
-
-  // Add aux info covering the first track run to a TrackFragment, and update
-  // the run to ensure it matches length and subsample information.
-  void AddAuxInfoHeaders(int offset, TrackFragment* frag) {
-    frag->auxiliary_offset.offsets.push_back(offset);
-    frag->auxiliary_size.sample_count = 2;
-    frag->auxiliary_size.sample_info_sizes.push_back(8);
-    frag->auxiliary_size.sample_info_sizes.push_back(22);
-    frag->runs[0].sample_count = 2;
-    frag->runs[0].sample_sizes[1] = 10;
-  }
-
-  void AddSampleEncryption(uint8_t use_subsample_flag, TrackFragment* frag) {
-    frag->sample_encryption.use_subsample_encryption = use_subsample_flag;
-    if (use_subsample_flag) {
-      frag->sample_encryption.sample_encryption_data.assign(
-          kSampleEncryptionDataWithSubsamples,
-          kSampleEncryptionDataWithSubsamples +
-              arraysize(kSampleEncryptionDataWithSubsamples));
-    } else {
-      frag->sample_encryption.sample_encryption_data.assign(
-          kSampleEncryptionDataWithoutSubsamples,
-          kSampleEncryptionDataWithoutSubsamples +
-              arraysize(kSampleEncryptionDataWithoutSubsamples));
-    }
-
-    // Update sample sizes and aux info header.
-    frag->runs.resize(1);
-    frag->runs[0].sample_count = 2;
-    frag->auxiliary_offset.offsets.push_back(0);
-    frag->auxiliary_size.sample_count = 2;
-    if (use_subsample_flag) {
-      // Update sample sizes to match with subsample entries above.
-      frag->runs[0].sample_sizes[0] = 3;
-      frag->runs[0].sample_sizes[1] = 10;
-      // Set aux info header.
-      frag->auxiliary_size.sample_info_sizes.push_back(16);
-      frag->auxiliary_size.sample_info_sizes.push_back(30);
-    } else {
-      frag->auxiliary_size.default_sample_info_size = 8;
-    }
-  }
-
-  // Update the first sample description of a Track to indicate CBCS encryption
-  // with a constant IV and pattern.
-  void AddEncryptionCbcs(Track* track) {
-    ProtectionSchemeInfo* sinf = GetProtectionSchemeInfoForTrack(track);
-    sinf->type.type = FOURCC_CBCS;
-    sinf->info.track_encryption.is_encrypted = true;
-    sinf->info.track_encryption.default_iv_size = 0;
-    sinf->info.track_encryption.default_crypt_byte_block = 1;
-    sinf->info.track_encryption.default_skip_byte_block = 9;
-    sinf->info.track_encryption.default_constant_iv_size = 16;
-    memcpy(sinf->info.track_encryption.default_constant_iv, kIv3, 16);
-    sinf->info.track_encryption.default_kid.assign(kKeyId,
-                                                   kKeyId + arraysize(kKeyId));
-  }
-
-  void AddConstantIvsToCencSampleGroup(Track* track, TrackFragment* frag) {
-    auto& track_cenc_group =
-        track->media.information.sample_table.sample_group_description;
-    track_cenc_group.entries[0].iv_size = 0;
-    track_cenc_group.entries[0].crypt_byte_block = 1;
-    track_cenc_group.entries[0].skip_byte_block = 9;
-    track_cenc_group.entries[0].constant_iv_size = 16;
-    memcpy(track_cenc_group.entries[0].constant_iv, kIv4, 16);
-
-    frag->sample_group_description.entries[1].iv_size = 0;
-    frag->sample_group_description.entries[1].crypt_byte_block = 1;
-    frag->sample_group_description.entries[1].skip_byte_block = 9;
-    frag->sample_group_description.entries[1].constant_iv_size = 16;
-    memcpy(frag->sample_group_description.entries[1].constant_iv, kIv5,
-                 16);
-    frag->sample_group_description.entries[2].iv_size = 0;
-    frag->sample_group_description.entries[2].crypt_byte_block = 1;
-    frag->sample_group_description.entries[2].skip_byte_block = 9;
-    frag->sample_group_description.entries[2].constant_iv_size = 16;
-    memcpy(frag->sample_group_description.entries[2].constant_iv, kIv5,
-                 16);
-  }
-
-  void AddSampleEncryptionCbcs(TrackFragment* frag) {
-    frag->sample_encryption.use_subsample_encryption = true;
-    frag->sample_encryption.sample_encryption_data.assign(
-        kSampleEncryptionDataWithSubsamplesAndConstantIv,
-        kSampleEncryptionDataWithSubsamplesAndConstantIv +
-            arraysize(kSampleEncryptionDataWithSubsamplesAndConstantIv));
-
-    // Update sample sizes and aux info header.
-    frag->runs.resize(1);
-    frag->runs[0].sample_count = 5;
-    frag->auxiliary_offset.offsets.push_back(0);
-    frag->auxiliary_size.sample_count = 5;
-    // Update sample sizes to match with subsample entries above.
-    frag->runs[0].sample_sizes[0] = 3;
-    frag->runs[0].sample_sizes[1] = 10;
-    frag->runs[0].sample_sizes[2] = 3;
-    frag->runs[0].sample_sizes[3] = 3;
-    frag->runs[0].sample_sizes[4] = 3;
-    // Set aux info header.
-    frag->auxiliary_size.sample_info_sizes.push_back(16);
-    frag->auxiliary_size.sample_info_sizes.push_back(30);
-    frag->auxiliary_size.sample_info_sizes.push_back(16);
-    frag->auxiliary_size.sample_info_sizes.push_back(16);
-    frag->auxiliary_size.sample_info_sizes.push_back(16);
-  }
-
-  bool InitMoofWithArbitraryAuxInfo(MovieFragment* moof) {
-    // Add aux info header (equal sized aux info for every sample).
-    for (uint32_t i = 0; i < moof->tracks.size(); ++i) {
-      moof->tracks[i].auxiliary_offset.offsets.push_back(50);
-      moof->tracks[i].auxiliary_size.sample_count = 10;
-      moof->tracks[i].auxiliary_size.default_sample_info_size = 8;
-    }
-
-    // We don't care about the actual data in aux.
-    std::vector<uint8_t> aux_info(1000);
-    return iter_->Init(*moof) &&
-           iter_->CacheAuxInfo(&aux_info[0], aux_info.size());
-  }
-
-  void SetAscending(std::vector<uint32_t>* vec) {
-    vec->resize(10);
-    for (size_t i = 0; i < vec->size(); i++) (*vec)[i] = i + 1;
-  }
-};
-
-TEST_F(TrackRunIteratorTest, NoRunsTest) {
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  ASSERT_TRUE(iter_->Init(MovieFragment()));
-  EXPECT_FALSE(iter_->IsRunValid());
-  EXPECT_FALSE(iter_->IsSampleValid());
-}
-
-TEST_F(TrackRunIteratorTest, BasicOperationTest) {
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  MovieFragment moof = CreateFragment();
-
-  // Test that runs are sorted correctly, and that properties of the initial
-  // sample of the first run are correct
-  ASSERT_TRUE(iter_->Init(moof));
-  EXPECT_TRUE(iter_->IsRunValid());
-  EXPECT_FALSE(iter_->is_encrypted());
-  EXPECT_EQ(iter_->track_id(), 1u);
-  EXPECT_EQ(iter_->sample_offset(), 100);
-  EXPECT_EQ(iter_->sample_size(), 1);
-  EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(0, kAudioScale));
-  EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(0, kAudioScale));
-  EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1024, kAudioScale));
-  EXPECT_TRUE(iter_->is_keyframe());
-
-  // Advance to the last sample in the current run, and test its properties
-  for (int i = 0; i < 9; i++) iter_->AdvanceSample();
-  EXPECT_EQ(iter_->track_id(), 1u);
-  EXPECT_EQ(iter_->sample_offset(), 100 + kSumAscending1);
-  EXPECT_EQ(iter_->sample_size(), 10);
-  EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(1024 * 9, kAudioScale));
-  EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1024, kAudioScale));
-  EXPECT_TRUE(iter_->is_keyframe());
-
-  // Test end-of-run
-  iter_->AdvanceSample();
-  EXPECT_FALSE(iter_->IsSampleValid());
-
-  // Test last sample of next run
-  iter_->AdvanceRun();
-  EXPECT_TRUE(iter_->is_keyframe());
-  for (int i = 0; i < 9; i++) iter_->AdvanceSample();
-  EXPECT_EQ(iter_->track_id(), 2u);
-  EXPECT_EQ(iter_->sample_offset(), 200 + kSumAscending1);
-  EXPECT_EQ(iter_->sample_size(), 10);
-  int64_t base_dts = kSumAscending1 + moof.tracks[1].decode_time.decode_time;
-  EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(base_dts, kVideoScale));
-  EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(10, kVideoScale));
-  EXPECT_FALSE(iter_->is_keyframe());
-
-  // Test final run
-  iter_->AdvanceRun();
-  EXPECT_EQ(iter_->track_id(), 1u);
-  EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(1024 * 10, kAudioScale));
-  iter_->AdvanceSample();
-  EXPECT_EQ(moof.tracks[0].runs[1].data_offset +
-                moof.tracks[0].header.default_sample_size,
-            iter_->sample_offset());
-  iter_->AdvanceRun();
-  EXPECT_FALSE(iter_->IsRunValid());
-}
-
-TEST_F(TrackRunIteratorTest, TrackExtendsDefaultsTest) {
-  moov_.extends.tracks[0].default_sample_duration = 50;
-  moov_.extends.tracks[0].default_sample_size = 3;
-  moov_.extends.tracks[0].default_sample_flags = ToSampleFlags("UN");
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  MovieFragment moof = CreateFragment();
-  moof.tracks[0].header.has_default_sample_flags = false;
-  moof.tracks[0].header.default_sample_size = 0;
-  moof.tracks[0].header.default_sample_duration = 0;
-  moof.tracks[0].runs[0].sample_sizes.clear();
-  ASSERT_TRUE(iter_->Init(moof));
-  iter_->AdvanceSample();
-  EXPECT_FALSE(iter_->is_keyframe());
-  EXPECT_EQ(iter_->sample_size(), 3);
-  EXPECT_EQ(iter_->sample_offset(), moof.tracks[0].runs[0].data_offset + 3);
-  EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(50, kAudioScale));
-  EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(50, kAudioScale));
-}
-
-TEST_F(TrackRunIteratorTest, FirstSampleFlagTest) {
-  // Ensure that keyframes are flagged correctly in the face of BMFF boxes which
-  // explicitly specify the flags for the first sample in a run and rely on
-  // defaults for all subsequent samples
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  MovieFragment moof = CreateFragment();
-  moof.tracks[1].header.has_default_sample_flags = true;
-  moof.tracks[1].header.default_sample_flags = ToSampleFlags("UN");
-  SetFlagsOnSamples("US", &moof.tracks[1].runs[0]);
-
-  ASSERT_TRUE(iter_->Init(moof));
-  EXPECT_EQ("1 K K K K K K K K K K", KeyframeAndRAPInfo(iter_.get()));
-
-  iter_->AdvanceRun();
-  EXPECT_EQ("2 K P P P P P P P P P", KeyframeAndRAPInfo(iter_.get()));
-}
-
-// Verify that parsing fails if a reserved value is in the sample flags.
-TEST_F(TrackRunIteratorTest, SampleInfoTest_ReservedInSampleFlags) {
-  EXPECT_MEDIA_LOG(ReservedValueInSampleDependencyInfo());
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  MovieFragment moof = CreateFragment();
-  // Change the "depends on" field on one of the samples to a
-  // reserved value.
-  moof.tracks[1].runs[0].sample_flags[0] = ToSampleFlags("RS");
-  ASSERT_FALSE(iter_->Init(moof));
-}
-
-// Verify that parsing fails if a reserved value is in the default sample flags.
-TEST_F(TrackRunIteratorTest, SampleInfoTest_ReservedInDefaultSampleFlags) {
-  EXPECT_MEDIA_LOG(ReservedValueInSampleDependencyInfo());
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  MovieFragment moof = CreateFragment();
-  // Set the default flag to contain a reserved "depends on" value.
-  moof.tracks[0].header.default_sample_flags = ToSampleFlags("RN");
-  ASSERT_FALSE(iter_->Init(moof));
-}
-
-TEST_F(TrackRunIteratorTest, ReorderingTest) {
-  // Test frame reordering and edit list support. The frames have the following
-  // decode timestamps:
-  //
-  //   0ms 40ms   120ms     240ms
-  //   | 0 | 1  - | 2  -  - |
-  //
-  // ...and these composition timestamps, after edit list adjustment:
-  //
-  //   0ms 40ms       160ms  240ms
-  //   | 0 | 2  -  -  | 1 - |
-
-  // Create an edit list with one entry, with an initial start time of 80ms
-  // (that is, 2 / kVideoTimescale) and a duration of zero (which is treated as
-  // infinite according to 14496-12:2012). This will cause the first 80ms of the
-  // media timeline - which will be empty, due to CTS biasing - to be discarded.
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  EditListEntry entry;
-  entry.segment_duration = 0;
-  entry.media_time = 2;
-  entry.media_rate_integer = 1;
-  entry.media_rate_fraction = 0;
-  moov_.tracks[1].edit.list.edits.push_back(entry);
-
-  // Add CTS offsets. Without bias, the CTS offsets for the first three frames
-  // would simply be [0, 3, -2]. Since CTS offsets should be non-negative for
-  // maximum compatibility, these values are biased up to [2, 5, 0], and the
-  // extra 80ms is removed via the edit list.
-  MovieFragment moof = CreateFragment();
-  std::vector<int32_t>& cts_offsets =
-      moof.tracks[1].runs[0].sample_composition_time_offsets;
-  cts_offsets.resize(10);
-  cts_offsets[0] = 2;
-  cts_offsets[1] = 5;
-  cts_offsets[2] = 0;
-  moof.tracks[1].decode_time.decode_time = 0;
-
-  ASSERT_TRUE(iter_->Init(moof));
-  iter_->AdvanceRun();
-  EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(0, kVideoScale));
-  EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(0, kVideoScale));
-  EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1, kVideoScale));
-  iter_->AdvanceSample();
-  EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(1, kVideoScale));
-  EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(4, kVideoScale));
-  EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(2, kVideoScale));
-  iter_->AdvanceSample();
-  EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(3, kVideoScale));
-  EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(1, kVideoScale));
-  EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(3, kVideoScale));
-}
-
-TEST_F(TrackRunIteratorTest, IgnoreUnknownAuxInfoTest) {
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  MovieFragment moof = CreateFragment();
-  moof.tracks[1].auxiliary_offset.offsets.push_back(50);
-  moof.tracks[1].auxiliary_size.default_sample_info_size = 2;
-  moof.tracks[1].auxiliary_size.sample_count = 2;
-  moof.tracks[1].runs[0].sample_count = 2;
-  ASSERT_TRUE(iter_->Init(moof));
-  iter_->AdvanceRun();
-  EXPECT_FALSE(iter_->AuxInfoNeedsToBeCached());
-}
-
-TEST_F(TrackRunIteratorTest,
-       DecryptConfigTestWithSampleEncryptionAndNoSubsample) {
-  AddEncryption(&moov_.tracks[1]);
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-
-  MovieFragment moof = CreateFragment();
-  AddSampleEncryption(!SampleEncryption::kUseSubsampleEncryption,
-                      &moof.tracks[1]);
-
-  ASSERT_TRUE(iter_->Init(moof));
-  // The run for track 2 will be the second, which is parsed according to
-  // data_offset.
-  iter_->AdvanceRun();
-  EXPECT_EQ(iter_->track_id(), 2u);
-
-  EXPECT_TRUE(iter_->is_encrypted());
-  // No need to cache aux info as it is already available in SampleEncryption.
-  EXPECT_FALSE(iter_->AuxInfoNeedsToBeCached());
-  EXPECT_EQ(iter_->aux_info_size(), 0);
-  EXPECT_EQ(iter_->sample_offset(), 200);
-  EXPECT_EQ(iter_->GetMaxClearOffset(), moof.tracks[1].runs[0].data_offset);
-  std::unique_ptr<DecryptConfig> config = iter_->GetDecryptConfig();
-  EXPECT_EQ(
-      std::string(reinterpret_cast<const char*>(kKeyId), arraysize(kKeyId)),
-      config->key_id());
-  EXPECT_EQ(std::string(reinterpret_cast<const char*>(kIv1), arraysize(kIv1)),
-            config->iv());
-  EXPECT_EQ(config->subsamples().size(), 0u);
-  iter_->AdvanceSample();
-  config = iter_->GetDecryptConfig();
-  EXPECT_EQ(std::string(reinterpret_cast<const char*>(kIv2), arraysize(kIv2)),
-            config->iv());
-  EXPECT_EQ(config->subsamples().size(), 0u);
-}
-
-TEST_F(TrackRunIteratorTest,
-       DecryptConfigTestWithSampleEncryptionAndSubsample) {
-  AddEncryption(&moov_.tracks[1]);
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-
-  MovieFragment moof = CreateFragment();
-  AddSampleEncryption(SampleEncryption::kUseSubsampleEncryption,
-                      &moof.tracks[1]);
-  const SampleToGroupEntry kSampleToGroupTable[] = {
-      // Associated with the second entry in SampleGroupDescription Box.
-      // With Iv size 8 bytes.
-      {1, SampleToGroupEntry::kFragmentGroupDescriptionIndexBase + 2},
-      // Associated with the third entry in SampleGroupDescription Box.
-      // With Iv size 16 bytes.
-      {1, SampleToGroupEntry::kFragmentGroupDescriptionIndexBase + 3}};
-  AddCencSampleGroup(&moov_.tracks[1], &moof.tracks[1], kSampleToGroupTable,
-                     arraysize(kSampleToGroupTable));
-
-  ASSERT_TRUE(iter_->Init(moof));
-  // The run for track 2 will be the second, which is parsed according to
-  // data_offset.
-  iter_->AdvanceRun();
-  EXPECT_EQ(iter_->track_id(), 2u);
-
-  EXPECT_TRUE(iter_->is_encrypted());
-  // No need to cache aux info as it is already available in SampleEncryption.
-  EXPECT_FALSE(iter_->AuxInfoNeedsToBeCached());
-  EXPECT_EQ(iter_->aux_info_size(), 0);
-  EXPECT_EQ(iter_->sample_offset(), 200);
-  EXPECT_EQ(iter_->GetMaxClearOffset(), moof.tracks[1].runs[0].data_offset);
-  std::unique_ptr<DecryptConfig> config = iter_->GetDecryptConfig();
-  EXPECT_EQ(std::string(reinterpret_cast<const char*>(kIv1), arraysize(kIv1)),
-            config->iv());
-  EXPECT_EQ(config->subsamples().size(), 1u);
-  EXPECT_EQ(config->subsamples()[0].clear_bytes, 1u);
-  EXPECT_EQ(config->subsamples()[0].cypher_bytes, 2u);
-  iter_->AdvanceSample();
-  config = iter_->GetDecryptConfig();
-  EXPECT_EQ(std::string(reinterpret_cast<const char*>(kIv3), arraysize(kIv3)),
-            config->iv());
-  EXPECT_EQ(config->subsamples().size(), 2u);
-  EXPECT_EQ(config->subsamples()[0].clear_bytes, 1u);
-  EXPECT_EQ(config->subsamples()[0].cypher_bytes, 2u);
-  EXPECT_EQ(config->subsamples()[1].clear_bytes, 3u);
-  EXPECT_EQ(config->subsamples()[1].cypher_bytes, 4u);
-}
-
-TEST_F(TrackRunIteratorTest, DecryptConfigTestWithAuxInfo) {
-  AddEncryption(&moov_.tracks[1]);
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-
-  MovieFragment moof = CreateFragment();
-  AddAuxInfoHeaders(50, &moof.tracks[1]);
-
-  ASSERT_TRUE(iter_->Init(moof));
-
-  // The run for track 2 will be first, since its aux info offset is the first
-  // element in the file.
-  EXPECT_EQ(iter_->track_id(), 2u);
-  EXPECT_TRUE(iter_->is_encrypted());
-  ASSERT_TRUE(iter_->AuxInfoNeedsToBeCached());
-  EXPECT_EQ(static_cast<uint32_t>(iter_->aux_info_size()), arraysize(kAuxInfo));
-  EXPECT_EQ(iter_->aux_info_offset(), 50);
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 50);
-  EXPECT_FALSE(iter_->CacheAuxInfo(NULL, 0));
-  EXPECT_FALSE(iter_->CacheAuxInfo(kAuxInfo, 3));
-  EXPECT_TRUE(iter_->AuxInfoNeedsToBeCached());
-  EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
-  EXPECT_FALSE(iter_->AuxInfoNeedsToBeCached());
-  EXPECT_EQ(iter_->sample_offset(), 200);
-  EXPECT_EQ(iter_->GetMaxClearOffset(), moof.tracks[0].runs[0].data_offset);
-  std::unique_ptr<DecryptConfig> config = iter_->GetDecryptConfig();
-  EXPECT_EQ(
-      std::string(reinterpret_cast<const char*>(kKeyId), arraysize(kKeyId)),
-      config->key_id());
-  EXPECT_EQ(std::string(reinterpret_cast<const char*>(kIv1), arraysize(kIv1)),
-            config->iv());
-  EXPECT_TRUE(config->subsamples().empty());
-  iter_->AdvanceSample();
-  config = iter_->GetDecryptConfig();
-  EXPECT_EQ(config->subsamples().size(), 2u);
-  EXPECT_EQ(config->subsamples()[0].clear_bytes, 1u);
-  EXPECT_EQ(config->subsamples()[1].cypher_bytes, 4u);
-}
-
-TEST_F(TrackRunIteratorTest, CencSampleGroupTest) {
-  MovieFragment moof = CreateFragment();
-
-  const SampleToGroupEntry kSampleToGroupTable[] = {
-      // Associated with the second entry in SampleGroupDescription Box.
-      {1, SampleToGroupEntry::kFragmentGroupDescriptionIndexBase + 2},
-      // Associated with the first entry in SampleGroupDescription Box.
-      {1, SampleToGroupEntry::kFragmentGroupDescriptionIndexBase + 1}};
-  AddCencSampleGroup(&moov_.tracks[0], &moof.tracks[0], kSampleToGroupTable,
-                     arraysize(kSampleToGroupTable));
-
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  ASSERT_TRUE(InitMoofWithArbitraryAuxInfo(&moof));
-
-  std::string cenc_sample_group_key_id(
-      kFragmentCencSampleGroupKeyId,
-      kFragmentCencSampleGroupKeyId + arraysize(kFragmentCencSampleGroupKeyId));
-  // The first sample is encrypted and the second sample is unencrypted.
-  EXPECT_TRUE(iter_->is_encrypted());
-  EXPECT_EQ(cenc_sample_group_key_id, iter_->GetDecryptConfig()->key_id());
-  iter_->AdvanceSample();
-  EXPECT_FALSE(iter_->is_encrypted());
-}
-
-TEST_F(TrackRunIteratorTest, CencSampleGroupWithTrackEncryptionBoxTest) {
-  // Add TrackEncryption Box.
-  AddEncryption(&moov_.tracks[0]);
-
-  MovieFragment moof = CreateFragment();
-
-  const SampleToGroupEntry kSampleToGroupTable[] = {
-      // Associated with the 2nd entry in fragment SampleGroupDescription Box.
-      {2, SampleToGroupEntry::kFragmentGroupDescriptionIndexBase + 2},
-      // Associated with the default values specified in TrackEncryption Box.
-      {1, 0},
-      // Associated with the 1st entry in fragment SampleGroupDescription Box.
-      {3, SampleToGroupEntry::kFragmentGroupDescriptionIndexBase + 1},
-      // Associated with the 1st entry in track SampleGroupDescription Box.
-      {2, 1}};
-  AddCencSampleGroup(&moov_.tracks[0], &moof.tracks[0], kSampleToGroupTable,
-                     arraysize(kSampleToGroupTable));
-
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  ASSERT_TRUE(InitMoofWithArbitraryAuxInfo(&moof));
-
-  std::string track_encryption_key_id(kKeyId, kKeyId + arraysize(kKeyId));
-  std::string track_cenc_sample_group_key_id(
-      kTrackCencSampleGroupKeyId,
-      kTrackCencSampleGroupKeyId + arraysize(kTrackCencSampleGroupKeyId));
-  std::string fragment_cenc_sample_group_key_id(
-      kFragmentCencSampleGroupKeyId,
-      kFragmentCencSampleGroupKeyId + arraysize(kFragmentCencSampleGroupKeyId));
-
-  for (size_t i = 0; i < kSampleToGroupTable[0].sample_count; ++i) {
-    EXPECT_TRUE(iter_->is_encrypted());
-    EXPECT_EQ(fragment_cenc_sample_group_key_id,
-              iter_->GetDecryptConfig()->key_id());
-    iter_->AdvanceSample();
-  }
-
-  for (size_t i = 0; i < kSampleToGroupTable[1].sample_count; ++i) {
-    EXPECT_TRUE(iter_->is_encrypted());
-    EXPECT_EQ(track_encryption_key_id, iter_->GetDecryptConfig()->key_id());
-    iter_->AdvanceSample();
-  }
-
-  for (size_t i = 0; i < kSampleToGroupTable[2].sample_count; ++i) {
-    EXPECT_FALSE(iter_->is_encrypted());
-    iter_->AdvanceSample();
-  }
-
-  for (size_t i = 0; i < kSampleToGroupTable[3].sample_count; ++i) {
-    EXPECT_TRUE(iter_->is_encrypted());
-    EXPECT_EQ(track_cenc_sample_group_key_id,
-              iter_->GetDecryptConfig()->key_id());
-    iter_->AdvanceSample();
-  }
-
-  // The remaining samples should be associated with the default values
-  // specified in TrackEncryption Box.
-  EXPECT_TRUE(iter_->is_encrypted());
-  EXPECT_EQ(track_encryption_key_id, iter_->GetDecryptConfig()->key_id());
-}
-
-// It is legal for aux info blocks to be shared among multiple formats.
-TEST_F(TrackRunIteratorTest, SharedAuxInfoTest) {
-  AddEncryption(&moov_.tracks[0]);
-  AddEncryption(&moov_.tracks[1]);
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-
-  MovieFragment moof = CreateFragment();
-  moof.tracks[0].runs.resize(1);
-  AddAuxInfoHeaders(50, &moof.tracks[0]);
-  AddAuxInfoHeaders(50, &moof.tracks[1]);
-  moof.tracks[0].auxiliary_size.default_sample_info_size = 8;
-
-  ASSERT_TRUE(iter_->Init(moof));
-  EXPECT_EQ(iter_->track_id(), 1u);
-  EXPECT_EQ(iter_->aux_info_offset(), 50);
-  EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
-  std::unique_ptr<DecryptConfig> config = iter_->GetDecryptConfig();
-  ASSERT_EQ(arraysize(kIv1), config->iv().size());
-  EXPECT_TRUE(!memcmp(kIv1, config->iv().data(), config->iv().size()));
-  iter_->AdvanceSample();
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 50);
-  iter_->AdvanceRun();
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 50);
-  EXPECT_EQ(iter_->aux_info_offset(), 50);
-  EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 200);
-  ASSERT_EQ(arraysize(kIv1), config->iv().size());
-  EXPECT_TRUE(!memcmp(kIv1, config->iv().data(), config->iv().size()));
-  iter_->AdvanceSample();
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 201);
-}
-
-// Sensible files are expected to place auxiliary information for a run
-// immediately before the main data for that run. Alternative schemes are
-// possible, however, including the somewhat reasonable behavior of placing all
-// aux info at the head of the 'mdat' box together, and the completely
-// unreasonable behavior demonstrated here:
-//  byte 50: track 2, run 1 aux info
-//  byte 100: track 1, run 1 data
-//  byte 200: track 2, run 1 data
-//  byte 201: track 1, run 2 aux info (*inside* track 2, run 1 data)
-//  byte 10000: track 1, run 2 data
-//  byte 20000: track 1, run 1 aux info
-TEST_F(TrackRunIteratorTest, UnexpectedOrderingTest) {
-  AddEncryption(&moov_.tracks[0]);
-  AddEncryption(&moov_.tracks[1]);
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-
-  MovieFragment moof = CreateFragment();
-  AddAuxInfoHeaders(20000, &moof.tracks[0]);
-  moof.tracks[0].auxiliary_offset.offsets.push_back(201);
-  moof.tracks[0].auxiliary_size.sample_count += 2;
-  moof.tracks[0].auxiliary_size.default_sample_info_size = 8;
-  moof.tracks[0].runs[1].sample_count = 2;
-  AddAuxInfoHeaders(50, &moof.tracks[1]);
-  moof.tracks[1].runs[0].sample_sizes[0] = 5;
-
-  ASSERT_TRUE(iter_->Init(moof));
-  EXPECT_EQ(iter_->track_id(), 2u);
-  EXPECT_EQ(iter_->aux_info_offset(), 50);
-  EXPECT_EQ(iter_->sample_offset(), 200);
-  EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 100);
-  iter_->AdvanceRun();
-  EXPECT_EQ(iter_->track_id(), 1u);
-  EXPECT_EQ(iter_->aux_info_offset(), 20000);
-  EXPECT_EQ(iter_->sample_offset(), 100);
-  EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 100);
-  iter_->AdvanceSample();
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 101);
-  iter_->AdvanceRun();
-  EXPECT_EQ(iter_->track_id(), 1u);
-  EXPECT_EQ(iter_->aux_info_offset(), 201);
-  EXPECT_EQ(iter_->sample_offset(), 10000);
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 201);
-  EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
-  EXPECT_EQ(iter_->GetMaxClearOffset(), 10000);
-}
-
-TEST_F(TrackRunIteratorTest, KeyFrameFlagCombinations) {
-  // Setup both audio and video tracks to each have 6 samples covering all the
-  // combinations of mp4 "sync sample" and "depends on" relationships.
-  MovieFragment moof = CreateFragment();
-  moof.tracks[0].runs.resize(1);
-  moof.tracks[1].runs.resize(1);
-  moof.tracks[0].runs[0].sample_count = 6;
-  moof.tracks[1].runs[0].sample_count = 6;
-  SetFlagsOnSamples("US UN OS ON NS NN", &moof.tracks[0].runs[0]);
-  SetFlagsOnSamples("US UN OS ON NS NN", &moof.tracks[1].runs[0]);
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-
-  ASSERT_TRUE(iter_->Init(moof));
-  EXPECT_TRUE(iter_->IsRunValid());
-
-  // Keyframes should be marked according to downstream's expectations that
-  // keyframes serve as points of random access for seeking.
-
-  // For audio, any sync sample should be marked as a key frame. Whether a
-  // sample "depends on" other samples is not considered. Unlike video samples,
-  // audio samples are often marked as depending on other samples but are still
-  // workable for random access. While we allow for parsing of audio samples
-  // that are non-sync samples, we generally expect all audio samples to be sync
-  // samples and downstream will log and discard any non-sync audio samples.
-  EXPECT_EQ("1 K P K P K P", KeyframeAndRAPInfo(iter_.get()));
-
-  iter_->AdvanceRun();
-
-  // For video, any key frame should be both a sync sample and have no known
-  // dependents. Ideally, a video sync sample should always be marked as having
-  // no dependents, but we occasionally encounter media where all samples are
-  // marked "sync" and we must rely on combining the two flags to pick out the
-  // true key frames. See http://crbug.com/310712 and http://crbug.com/507916.
-  // Reliably knowing the keyframes for video is also critical to SPS PPS
-  // insertion.
-  EXPECT_EQ("2 K P P P K P", KeyframeAndRAPInfo(iter_.get()));
-}
-
-TEST_F(TrackRunIteratorTest, DecryptConfigTestWithConstantIvNoAuxInfo) {
-  AddEncryptionCbcs(&moov_.tracks[1]);
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-
-  MovieFragment moof = CreateFragment();
-
-  ASSERT_TRUE(iter_->Init(moof));
-
-  // The run for track 2 will be the second.
-  iter_->AdvanceRun();
-  EXPECT_EQ(iter_->track_id(), 2u);
-  EXPECT_TRUE(iter_->is_encrypted());
-  ASSERT_FALSE(iter_->AuxInfoNeedsToBeCached());
-  EXPECT_EQ(iter_->sample_offset(), 200);
-  std::unique_ptr<DecryptConfig> config = iter_->GetDecryptConfig();
-  EXPECT_EQ(
-      std::string(reinterpret_cast<const char*>(kKeyId), arraysize(kKeyId)),
-      config->key_id());
-  EXPECT_EQ(std::string(reinterpret_cast<const char*>(kIv3), arraysize(kIv3)),
-            config->iv());
-  EXPECT_TRUE(config->subsamples().empty());
-  iter_->AdvanceSample();
-  config = iter_->GetDecryptConfig();
-  EXPECT_EQ(
-      std::string(reinterpret_cast<const char*>(kKeyId), arraysize(kKeyId)),
-      config->key_id());
-  EXPECT_EQ(std::string(reinterpret_cast<const char*>(kIv3), arraysize(kIv3)),
-            config->iv());
-  EXPECT_TRUE(config->subsamples().empty());
-}
-
-TEST_F(TrackRunIteratorTest, DecryptConfigTestWithSampleGroupsAndConstantIv) {
-  // Add TrackEncryption Box.
-  AddEncryptionCbcs(&moov_.tracks[1]);
-
-  MovieFragment moof = CreateFragment();
-  AddSampleEncryptionCbcs(&moof.tracks[1]);
-
-  const SampleToGroupEntry kSampleToGroupTable[] = {
-      // Associated with the 2nd entry in fragment SampleGroupDescription Box.
-      {1, SampleToGroupEntry::kFragmentGroupDescriptionIndexBase + 2},
-      // Associated with the default values specified in TrackEncryption Box.
-      {1, 0},
-      // Associated with the 1st entry in fragment SampleGroupDescription Box.
-      {1, SampleToGroupEntry::kFragmentGroupDescriptionIndexBase + 1},
-      // Associated with the 1st entry in track SampleGroupDescription Box.
-      {1, 1}};
-  AddCencSampleGroup(&moov_.tracks[1], &moof.tracks[1], kSampleToGroupTable,
-                     arraysize(kSampleToGroupTable));
-  AddConstantIvsToCencSampleGroup(&moov_.tracks[1], &moof.tracks[1]);
-  iter_.reset(new TrackRunIterator(&moov_, media_log_));
-  ASSERT_TRUE(iter_->Init(moof));
-
-  // The run for track 2 will be the second.
-  iter_->AdvanceRun();
-
-  std::string track_encryption_iv(kIv3, kIv3 + arraysize(kIv3));
-  std::string track_cenc_sample_group_iv(kIv4, kIv4 + arraysize(kIv4));
-  std::string fragment_cenc_sample_group_iv(kIv5, kIv5 + arraysize(kIv5));
-
-  for (size_t i = 0; i < kSampleToGroupTable[0].sample_count; ++i) {
-    EXPECT_TRUE(iter_->is_encrypted());
-    EXPECT_EQ(fragment_cenc_sample_group_iv, iter_->GetDecryptConfig()->iv());
-    iter_->AdvanceSample();
-  }
-
-  for (size_t i = 0; i < kSampleToGroupTable[1].sample_count; ++i) {
-    EXPECT_TRUE(iter_->is_encrypted());
-    EXPECT_EQ(track_encryption_iv, iter_->GetDecryptConfig()->iv());
-    iter_->AdvanceSample();
-  }
-
-  for (size_t i = 0; i < kSampleToGroupTable[2].sample_count; ++i) {
-    EXPECT_FALSE(iter_->is_encrypted());
-    iter_->AdvanceSample();
-  }
-
-  for (size_t i = 0; i < kSampleToGroupTable[3].sample_count; ++i) {
-    EXPECT_TRUE(iter_->is_encrypted());
-    EXPECT_EQ(track_cenc_sample_group_iv, iter_->GetDecryptConfig()->iv());
-    iter_->AdvanceSample();
-  }
-
-  // The remaining samples should be associated with the default values
-  // specified in TrackEncryption Box.
-  EXPECT_TRUE(iter_->is_encrypted());
-  EXPECT_EQ(track_encryption_iv, iter_->GetDecryptConfig()->iv());
-}
-
-}  // namespace mp4
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mpeg/adts_constants.cc b/cobalt/media/formats/mpeg/adts_constants.cc
deleted file mode 100644
index 624da21..0000000
--- a/cobalt/media/formats/mpeg/adts_constants.cc
+++ /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.
-
-#include "cobalt/media/formats/mpeg/adts_constants.h"
-
-#include "base/basictypes.h"
-
-namespace cobalt {
-namespace media {
-
-// The following conversion table is extracted from ISO 14496 Part 3 -
-// Table 1.16 - Sampling Frequency Index.
-const int kADTSFrequencyTable[] = {96000, 88200, 64000, 48000, 44100,
-                                   32000, 24000, 22050, 16000, 12000,
-                                   11025, 8000,  7350};
-const size_t kADTSFrequencyTableSize = arraysize(kADTSFrequencyTable);
-
-// The following conversion table is extracted from ISO 14496 Part 3 -
-// Table 1.17 - Channel Configuration.
-const media::ChannelLayout kADTSChannelLayoutTable[] = {
-    media::CHANNEL_LAYOUT_NONE,     media::CHANNEL_LAYOUT_MONO,
-    media::CHANNEL_LAYOUT_STEREO,   media::CHANNEL_LAYOUT_SURROUND,
-    media::CHANNEL_LAYOUT_4_0,      media::CHANNEL_LAYOUT_5_0_BACK,
-    media::CHANNEL_LAYOUT_5_1_BACK, media::CHANNEL_LAYOUT_7_1};
-const size_t kADTSChannelLayoutTableSize = arraysize(kADTSChannelLayoutTable);
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mpeg/adts_constants.h b/cobalt/media/formats/mpeg/adts_constants.h
deleted file mode 100644
index 4202c25..0000000
--- a/cobalt/media/formats/mpeg/adts_constants.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 COBALT_MEDIA_FORMATS_MPEG_ADTS_CONSTANTS_H_
-#define COBALT_MEDIA_FORMATS_MPEG_ADTS_CONSTANTS_H_
-
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-enum {
-  kADTSHeaderMinSize = 7,
-  kSamplesPerAACFrame = 1024,
-};
-
-MEDIA_EXPORT extern const int kADTSFrequencyTable[];
-MEDIA_EXPORT extern const size_t kADTSFrequencyTableSize;
-
-MEDIA_EXPORT extern const media::ChannelLayout kADTSChannelLayoutTable[];
-MEDIA_EXPORT extern const size_t kADTSChannelLayoutTableSize;
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MPEG_ADTS_CONSTANTS_H_
diff --git a/cobalt/media/formats/mpeg/adts_stream_parser.cc b/cobalt/media/formats/mpeg/adts_stream_parser.cc
deleted file mode 100644
index 9e13f2e..0000000
--- a/cobalt/media/formats/mpeg/adts_stream_parser.cc
+++ /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.
-
-#include "cobalt/media/formats/mpeg/adts_stream_parser.h"
-
-#include "build/build_config.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/formats/mp4/aac.h"
-#include "cobalt/media/formats/mpeg/adts_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-static const uint32_t kADTSStartCodeMask = 0xfff00000;
-
-ADTSStreamParser::ADTSStreamParser(DecoderBuffer::Allocator* buffer_allocator)
-    : MPEGAudioStreamParserBase(buffer_allocator, kADTSStartCodeMask, kCodecAAC,
-                                0) {}
-
-ADTSStreamParser::~ADTSStreamParser() {}
-
-int ADTSStreamParser::ParseFrameHeader(const uint8_t* data, int size,
-                                       int* frame_size, int* sample_rate,
-                                       ChannelLayout* channel_layout,
-                                       int* sample_count, bool* metadata_frame,
-                                       std::vector<uint8_t>* extra_data) const {
-  DCHECK(data);
-  DCHECK_GE(size, 0);
-
-  if (size < kADTSHeaderMinSize) return 0;
-
-  BitReader reader(data, size);
-  int sync;
-  int version;
-  int layer;
-  int protection_absent;
-  int profile;
-  size_t sample_rate_index;
-  size_t channel_layout_index;
-  int frame_length;
-  size_t num_data_blocks;
-  int unused;
-
-  if (!reader.ReadBits(12, &sync) || !reader.ReadBits(1, &version) ||
-      !reader.ReadBits(2, &layer) || !reader.ReadBits(1, &protection_absent) ||
-      !reader.ReadBits(2, &profile) ||
-      !reader.ReadBits(4, &sample_rate_index) || !reader.ReadBits(1, &unused) ||
-      !reader.ReadBits(3, &channel_layout_index) ||
-      !reader.ReadBits(4, &unused) || !reader.ReadBits(13, &frame_length) ||
-      !reader.ReadBits(11, &unused) || !reader.ReadBits(2, &num_data_blocks) ||
-      (!protection_absent && !reader.ReadBits(16, &unused))) {
-    return -1;
-  }
-
-  DVLOG(2) << "Header data :" << std::hex << " sync 0x" << sync << " version 0x"
-           << version << " layer 0x" << layer << " profile 0x" << profile
-           << " sample_rate_index 0x" << sample_rate_index
-           << " channel_layout_index 0x" << channel_layout_index;
-
-  const int bytes_read = reader.bits_read() / 8;
-  if (sync != 0xfff || layer != 0 || frame_length < bytes_read ||
-      sample_rate_index >= kADTSFrequencyTableSize ||
-      channel_layout_index >= kADTSChannelLayoutTableSize) {
-    if (media_log()) {
-      MEDIA_LOG(DEBUG, media_log())
-          << "Invalid header data :" << std::hex << " sync 0x" << sync
-          << " version 0x" << version << " layer 0x" << layer
-          << " sample_rate_index 0x" << sample_rate_index
-          << " channel_layout_index 0x" << channel_layout_index;
-    }
-    return -1;
-  }
-
-  if (sample_rate) *sample_rate = kADTSFrequencyTable[sample_rate_index];
-
-  if (frame_size) *frame_size = frame_length;
-
-  if (sample_count) *sample_count = (num_data_blocks + 1) * kSamplesPerAACFrame;
-
-  if (channel_layout)
-    *channel_layout = kADTSChannelLayoutTable[channel_layout_index];
-
-  if (metadata_frame) *metadata_frame = false;
-
-  if (extra_data) {
-    // See mp4::AAC::Parse() for details. We don't need to worry about writing
-    // extensions since we can't have extended ADTS by this point (it's
-    // explicitly rejected as invalid above).
-    DCHECK_NE(sample_rate_index, 15u);
-
-    // The following code is written according to ISO 14496 Part 3 Table 1.13 -
-    // Syntax of AudioSpecificConfig.
-    const uint16_t esds = (((((profile + 1) << 4) + sample_rate_index) << 4) +
-                           channel_layout_index)
-                          << 3;
-    extra_data->push_back(esds >> 8);
-    extra_data->push_back(esds & 0xFF);
-    if (media_log()) DCHECK(mp4::AAC().Parse(*extra_data, media_log()));
-  }
-
-  return bytes_read;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mpeg/adts_stream_parser.h b/cobalt/media/formats/mpeg/adts_stream_parser.h
deleted file mode 100644
index ca741af..0000000
--- a/cobalt/media/formats/mpeg/adts_stream_parser.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 COBALT_MEDIA_FORMATS_MPEG_ADTS_STREAM_PARSER_H_
-#define COBALT_MEDIA_FORMATS_MPEG_ADTS_STREAM_PARSER_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT ADTSStreamParser : public MPEGAudioStreamParserBase {
- public:
-  explicit ADTSStreamParser(DecoderBuffer::Allocator* buffer_allocator);
-  ~ADTSStreamParser() override;
-
-  // MPEGAudioStreamParserBase overrides.
-  int ParseFrameHeader(const uint8_t* data, int size, int* frame_size,
-                       int* sample_rate, ChannelLayout* channel_layout,
-                       int* sample_count, bool* metadata_frame,
-                       std::vector<uint8_t>* extra_data) const override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ADTSStreamParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MPEG_ADTS_STREAM_PARSER_H_
diff --git a/cobalt/media/formats/mpeg/adts_stream_parser_unittest.cc b/cobalt/media/formats/mpeg/adts_stream_parser_unittest.cc
deleted file mode 100644
index 839dec2..0000000
--- a/cobalt/media/formats/mpeg/adts_stream_parser_unittest.cc
+++ /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.
-
-#include "cobalt/media/formats/mpeg/adts_stream_parser.h"
-
-#include <memory>
-#include <string>
-
-#include "base/memory/ptr_util.h"
-#include "cobalt/media/formats/common/stream_parser_test_base.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class ADTSStreamParserTest : public StreamParserTestBase, public testing::Test {
- public:
-  ADTSStreamParserTest()
-      : StreamParserTestBase(base::MakeUnique<ADTSStreamParser>()) {}
-};
-
-// Test parsing with small prime sized chunks to smoke out "power of
-// 2" field size assumptions.
-TEST_F(ADTSStreamParserTest, UnalignedAppend) {
-  const std::string expected =
-      "NewSegment"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "EndOfSegment"
-      "NewSegment"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "EndOfSegment";
-  EXPECT_EQ(expected, ParseFile("sfx.adts", 17));
-}
-
-// Test parsing with a larger piece size to verify that multiple buffers
-// are passed to |new_buffer_cb_|.
-TEST_F(ADTSStreamParserTest, UnalignedAppend512) {
-  const std::string expected =
-      "NewSegment"
-      "{ 0K 23K 46K }"
-      "{ 0K 23K 46K 69K 92K }"
-      "{ 0K 23K 46K 69K 92K }"
-      "EndOfSegment"
-      "NewSegment"
-      "{ 0K }"
-      "EndOfSegment";
-  EXPECT_EQ(expected, ParseFile("sfx.adts", 512));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.cc b/cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.cc
deleted file mode 100644
index 7632b14..0000000
--- a/cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.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 "cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.h"
-
-#include "cobalt/media/base/media_log.h"
-
-namespace cobalt {
-namespace media {
-
-static const uint32_t kMPEG1StartCodeMask = 0xffe00000;
-
-// Map that determines which bitrate_index & channel_mode combinations
-// are allowed.
-// Derived from: http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html
-static const bool kIsAllowed[17][4] = {
-    {true, true, true, true},     // free
-    {true, false, false, false},  // 32
-    {true, false, false, false},  // 48
-    {true, false, false, false},  // 56
-    {true, true, true, true},     // 64
-    {true, false, false, false},  // 80
-    {true, true, true, true},     // 96
-    {true, true, true, true},     // 112
-    {true, true, true, true},     // 128
-    {true, true, true, true},     // 160
-    {true, true, true, true},     // 192
-    {false, true, true, true},    // 224
-    {false, true, true, true},    // 256
-    {false, true, true, true},    // 320
-    {false, true, true, true},    // 384
-    {false, false, false, false}  // bad
-};
-
-// Maps version and layer information in the frame header
-// into an index for the |kBitrateMap|.
-// Derived from: http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html
-static const int kVersionLayerMap[4][4] = {
-    // { reserved, L3, L2, L1 }
-    {5, 4, 4, 3},  // MPEG 2.5
-    {5, 5, 5, 5},  // reserved
-    {5, 4, 4, 3},  // MPEG 2
-    {5, 2, 1, 0}   // MPEG 1
-};
-
-// Maps the bitrate index field in the header and an index
-// from |kVersionLayerMap| to a frame bitrate.
-// Derived from: http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html
-static const int kBitrateMap[16][6] = {
-    // { V1L1, V1L2, V1L3, V2L1, V2L2 & V2L3, reserved }
-    {0, 0, 0, 0, 0, 0},           {32, 32, 32, 32, 8, 0},
-    {64, 48, 40, 48, 16, 0},      {96, 56, 48, 56, 24, 0},
-    {128, 64, 56, 64, 32, 0},     {160, 80, 64, 80, 40, 0},
-    {192, 96, 80, 96, 48, 0},     {224, 112, 96, 112, 56, 0},
-    {256, 128, 112, 128, 64, 0},  {288, 160, 128, 144, 80, 0},
-    {320, 192, 160, 160, 96, 0},  {352, 224, 192, 176, 112, 0},
-    {384, 256, 224, 192, 128, 0}, {416, 320, 256, 224, 144, 0},
-    {448, 384, 320, 256, 160, 0}, {0, 0, 0, 0, 0}};
-
-// Maps the sample rate index and version fields from the frame header
-// to a sample rate.
-// Derived from: http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html
-static const int kSampleRateMap[4][4] = {
-    // { V2.5, reserved, V2, V1 }
-    {11025, 0, 22050, 44100},
-    {12000, 0, 24000, 48000},
-    {8000, 0, 16000, 32000},
-    {0, 0, 0, 0}};
-
-// Offset in bytes from the end of the MP3 header to "Xing" or "Info" tags which
-// indicate a frame is silent metadata frame.  Values taken from FFmpeg.
-static const int kXingHeaderMap[2][2] = {{32, 17}, {17, 9}};
-
-// Frame header field constants.
-static const int kBitrateFree = 0;
-static const int kBitrateBad = 0xf;
-static const int kSampleRateReserved = 3;
-static const int kCodecDelay = 529;
-
-// static
-bool MPEG1AudioStreamParser::ParseHeader(
-    const scoped_refptr<MediaLog>& media_log, const uint8_t* data,
-    Header* header) {
-  BitReader reader(data, kHeaderSize);
-  int sync;
-  int version;
-  int layer;
-  int is_protected;
-  int bitrate_index;
-  int sample_rate_index;
-  int has_padding;
-  int is_private;
-  int channel_mode;
-  int other_flags;
-
-  if (!reader.ReadBits(11, &sync) || !reader.ReadBits(2, &version) ||
-      !reader.ReadBits(2, &layer) || !reader.ReadBits(1, &is_protected) ||
-      !reader.ReadBits(4, &bitrate_index) ||
-      !reader.ReadBits(2, &sample_rate_index) ||
-      !reader.ReadBits(1, &has_padding) || !reader.ReadBits(1, &is_private) ||
-      !reader.ReadBits(2, &channel_mode) || !reader.ReadBits(6, &other_flags)) {
-    return false;
-  }
-
-  DVLOG(2) << "Header data :" << std::hex << " sync 0x" << sync << " version 0x"
-           << version << " layer 0x" << layer << " bitrate_index 0x"
-           << bitrate_index << " sample_rate_index 0x" << sample_rate_index
-           << " channel_mode 0x" << channel_mode;
-
-  if (sync != 0x7ff || version == kVersionReserved || layer == kLayerReserved ||
-      bitrate_index == kBitrateFree || bitrate_index == kBitrateBad ||
-      sample_rate_index == kSampleRateReserved) {
-    MEDIA_LOG(ERROR, media_log)
-        << "Invalid header data :" << std::hex << " sync 0x" << sync
-        << " version 0x" << version << " layer 0x" << layer
-        << " bitrate_index 0x" << bitrate_index << " sample_rate_index 0x"
-        << sample_rate_index << " channel_mode 0x" << channel_mode;
-    return false;
-  }
-
-  if (layer == kLayer2 && kIsAllowed[bitrate_index][channel_mode]) {
-    MEDIA_LOG(ERROR, media_log)
-        << "Invalid (bitrate_index, channel_mode)"
-        << " combination :" << std::hex << " bitrate_index " << bitrate_index
-        << " channel_mode " << channel_mode;
-    return false;
-  }
-
-  int bitrate = kBitrateMap[bitrate_index][kVersionLayerMap[version][layer]];
-
-  if (bitrate == 0) {
-    MEDIA_LOG(ERROR, media_log)
-        << "Invalid bitrate :" << std::hex << " version " << version
-        << " layer " << layer << " bitrate_index " << bitrate_index;
-    return false;
-  }
-
-  DVLOG(2) << " bitrate " << bitrate;
-
-  int frame_sample_rate = kSampleRateMap[sample_rate_index][version];
-  if (frame_sample_rate == 0) {
-    MEDIA_LOG(ERROR, media_log)
-        << "Invalid sample rate :" << std::hex << " version " << version
-        << " sample_rate_index " << sample_rate_index;
-    return false;
-  }
-  header->sample_rate = frame_sample_rate;
-
-  // http://teslabs.com/openplayer/docs/docs/specs/mp3_structure2.pdf
-  // Table 2.1.5
-  int samples_per_frame;
-  switch (layer) {
-    case kLayer1:
-      samples_per_frame = 384;
-      break;
-
-    case kLayer2:
-      samples_per_frame = 1152;
-      break;
-
-    case kLayer3:
-      if (version == kVersion2 || version == kVersion2_5)
-        samples_per_frame = 576;
-      else
-        samples_per_frame = 1152;
-      break;
-
-    default:
-      return false;
-  }
-  header->sample_count = samples_per_frame;
-
-  // http://teslabs.com/openplayer/docs/docs/specs/mp3_structure2.pdf
-  // Text just below Table 2.1.5.
-  if (layer == kLayer1) {
-    // This formulation is a slight variation on the equation below,
-    // but has slightly different truncation characteristics to deal
-    // with the fact that Layer 1 has 4 byte "slots" instead of single
-    // byte ones.
-    header->frame_size = 4 * (12 * bitrate * 1000 / frame_sample_rate);
-  } else {
-    header->frame_size =
-        ((samples_per_frame / 8) * bitrate * 1000) / frame_sample_rate;
-  }
-
-  if (has_padding) header->frame_size += (layer == kLayer1) ? 4 : 1;
-
-  // Map Stereo(0), Joint Stereo(1), and Dual Channel (2) to
-  // CHANNEL_LAYOUT_STEREO and Single Channel (3) to CHANNEL_LAYOUT_MONO.
-  header->channel_layout =
-      (channel_mode == 3) ? CHANNEL_LAYOUT_MONO : CHANNEL_LAYOUT_STEREO;
-
-  header->version = static_cast<Version>(version);
-  header->layer = static_cast<Layer>(layer);
-  header->channel_mode = channel_mode;
-  return true;
-}
-
-MPEG1AudioStreamParser::MPEG1AudioStreamParser(
-    DecoderBuffer::Allocator* buffer_allocator)
-    : MPEGAudioStreamParserBase(buffer_allocator, kMPEG1StartCodeMask,
-                                kCodecMP3, kCodecDelay) {}
-
-MPEG1AudioStreamParser::~MPEG1AudioStreamParser() {}
-
-int MPEG1AudioStreamParser::ParseFrameHeader(
-    const uint8_t* data, int size, int* frame_size, int* sample_rate,
-    ChannelLayout* channel_layout, int* sample_count, bool* metadata_frame,
-    std::vector<uint8_t>* extra_data) const {
-  DCHECK(data);
-  DCHECK_GE(size, 0);
-  DCHECK(frame_size);
-
-  if (size < kHeaderSize) return 0;
-
-  Header header;
-  if (!ParseHeader(media_log(), data, &header)) return -1;
-
-  *frame_size = header.frame_size;
-  if (sample_rate) *sample_rate = header.sample_rate;
-  if (sample_count) *sample_count = header.sample_count;
-  if (channel_layout) *channel_layout = header.channel_layout;
-  if (metadata_frame) *metadata_frame = false;
-
-  const int header_bytes_read = kHeaderSize;
-  if (header.layer != kLayer3) return header_bytes_read;
-
-  // Check if this is a XING frame and tell the base parser to skip it if so.
-  const int xing_header_index =
-      kXingHeaderMap[header.version == kVersion2 ||
-                     header.version == kVersion2_5][header.channel_mode == 3];
-  uint32_t tag = 0;
-
-  // It's not a XING frame if the frame isn't big enough to be one.
-  if (*frame_size <
-      header_bytes_read + xing_header_index + static_cast<int>(sizeof(tag))) {
-    return header_bytes_read;
-  }
-
-  // If we don't have enough data available to check, return 0 so frame parsing
-  // will be retried once more data is available.
-  BitReader reader(data + header_bytes_read, size - header_bytes_read);
-  if (!reader.SkipBits(xing_header_index * 8) ||
-      !reader.ReadBits(sizeof(tag) * 8, &tag)) {
-    return 0;
-  }
-
-  // Check to see if the tag contains 'Xing' or 'Info'
-  if (tag == 0x496e666f || tag == 0x58696e67) {
-    MEDIA_LOG(DEBUG, media_log()) << "Skipping XING header.";
-    if (metadata_frame) *metadata_frame = true;
-    return header_bytes_read + reader.bits_read() / 8;
-  }
-
-  // If it wasn't a XING frame, just return the number consumed bytes.
-  return header_bytes_read;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.h b/cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.h
deleted file mode 100644
index d720193..0000000
--- a/cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_MPEG_MPEG1_AUDIO_STREAM_PARSER_H_
-#define COBALT_MEDIA_FORMATS_MPEG_MPEG1_AUDIO_STREAM_PARSER_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// MPEG1AudioStreamParser handles MPEG-1 audio streams (ISO/IEC 11172-3)
-// as well as the following extensions:
-// - MPEG-2 audio (ISO/IEC 13818-3),
-// - and MPEG2.5 (not an ISO standard).
-class MEDIA_EXPORT MPEG1AudioStreamParser : public MPEGAudioStreamParserBase {
- public:
-  // Size of an MPEG-1 frame header in bytes.
-  enum {
-    kHeaderSize = 4,
-  };
-
-  // Versions and layers as defined in ISO/IEC 11172-3.
-  enum Version {
-    kVersion1 = 3,
-    kVersion2 = 2,
-    kVersionReserved = 1,
-    kVersion2_5 = 0,
-  };
-
-  enum Layer {
-    kLayer1 = 3,
-    kLayer2 = 2,
-    kLayer3 = 1,
-    kLayerReserved = 0,
-  };
-
-  struct Header {
-    Version version;
-
-    // Layer as defined in ISO/IEC 11172-3 bitstream specification.
-    Layer layer;
-
-    // Frame size in bytes.
-    int frame_size;
-
-    // Sample frequency.
-    int sample_rate;
-
-    // Channel mode as defined in ISO/IEC 11172-3 bitstream specification.
-    int channel_mode;
-
-    // Channel layout.
-    ChannelLayout channel_layout;
-
-    // Number of samples per frame.
-    int sample_count;
-  };
-
-  // Parses the header starting at |data|.
-  // Assumption: size of array |data| should be at least |kHeaderSize|.
-  // Returns false if the header is not valid.
-  static bool ParseHeader(const scoped_refptr<MediaLog>& media_log,
-                          const uint8_t* data, Header* header);
-
-  explicit MPEG1AudioStreamParser(DecoderBuffer::Allocator* buffer_allocator);
-  ~MPEG1AudioStreamParser() override;
-
- private:
-  // MPEGAudioStreamParserBase overrides.
-  int ParseFrameHeader(const uint8_t* data, int size, int* frame_size,
-                       int* sample_rate, ChannelLayout* channel_layout,
-                       int* sample_count, bool* metadata_frame,
-                       std::vector<uint8_t>* extra_data) const override;
-
-  DISALLOW_COPY_AND_ASSIGN(MPEG1AudioStreamParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MPEG_MPEG1_AUDIO_STREAM_PARSER_H_
diff --git a/cobalt/media/formats/mpeg/mpeg1_audio_stream_parser_unittest.cc b/cobalt/media/formats/mpeg/mpeg1_audio_stream_parser_unittest.cc
deleted file mode 100644
index 9014dd2..0000000
--- a/cobalt/media/formats/mpeg/mpeg1_audio_stream_parser_unittest.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mpeg/mpeg1_audio_stream_parser.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/memory/ptr_util.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/formats/common/stream_parser_test_base.h"
-#include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cobalt {
-namespace media {
-
-class MPEG1AudioStreamParserTest : public StreamParserTestBase,
-                                   public testing::Test {
- public:
-  MPEG1AudioStreamParserTest()
-      : StreamParserTestBase(base::MakeUnique<MPEG1AudioStreamParser>()) {}
-};
-
-// Test parsing with small prime sized chunks to smoke out "power of
-// 2" field size assumptions.
-TEST_F(MPEG1AudioStreamParserTest, UnalignedAppend) {
-  const std::string expected =
-      "NewSegment"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "EndOfSegment"
-      "NewSegment"
-      "{ 0K }"
-      "{ 0K }"
-      "{ 0K }"
-      "EndOfSegment"
-      "NewSegment"
-      "{ 0K }"
-      "{ 0K }"
-      "EndOfSegment";
-  EXPECT_EQ(expected, ParseFile("sfx.mp3", 17));
-  EXPECT_GT(last_audio_config().codec_delay(), 0);
-}
-
-// Test parsing with a larger piece size to verify that multiple buffers
-// are passed to |new_buffer_cb_|.
-TEST_F(MPEG1AudioStreamParserTest, UnalignedAppend512) {
-  const std::string expected =
-      "NewSegment"
-      "{ 0K 26K 52K 78K }"
-      "EndOfSegment"
-      "NewSegment"
-      "{ 0K 26K 52K }"
-      "{ 0K 26K 52K 78K }"
-      "{ 0K }"
-      "EndOfSegment";
-  EXPECT_EQ(expected, ParseFile("sfx.mp3", 512));
-  EXPECT_GT(last_audio_config().codec_delay(), 0);
-}
-
-TEST_F(MPEG1AudioStreamParserTest, MetadataParsing) {
-  scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("sfx.mp3");
-  const uint8_t* buffer_ptr = buffer->data();
-
-  // The first 32 bytes of sfx.mp3 are an ID3 tag, so no segments should be
-  // extracted after appending those bytes.
-  const int kId3TagSize = 32;
-  EXPECT_EQ("", ParseData(buffer_ptr, kId3TagSize));
-  EXPECT_FALSE(last_audio_config().IsValidConfig());
-  buffer_ptr += kId3TagSize;
-
-  // The next 417 bytes are a Xing frame; with the identifier 21 bytes into
-  // the frame.  Appending less than 21 bytes, should result in no segments
-  // nor an AudioDecoderConfig being created.
-  const int kXingTagPosition = 21;
-  EXPECT_EQ("", ParseData(buffer_ptr, kXingTagPosition));
-  EXPECT_FALSE(last_audio_config().IsValidConfig());
-  buffer_ptr += kXingTagPosition;
-
-  // Appending the rests of the Xing frame should result in no segments, but
-  // should generate a valid AudioDecoderConfig.
-  const int kXingRemainingSize = 417 - kXingTagPosition;
-  EXPECT_EQ("", ParseData(buffer_ptr, kXingRemainingSize));
-  EXPECT_TRUE(last_audio_config().IsValidConfig());
-  buffer_ptr += kXingRemainingSize;
-
-  // Append the first real frame and ensure we get a segment.
-  const int kFirstRealFrameSize = 182;
-  EXPECT_EQ("NewSegment{ 0K }EndOfSegment",
-            ParseData(buffer_ptr, kFirstRealFrameSize));
-  EXPECT_TRUE(last_audio_config().IsValidConfig());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.cc b/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.cc
deleted file mode 100644
index 940b93b..0000000
--- a/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.cc
+++ /dev/null
@@ -1,408 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.h"
-
-#include <string.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/message_loop/message_loop.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-static const int kMpegAudioTrackId = 1;
-
-static const uint32_t kICYStartCode = 0x49435920;  // 'ICY '
-
-// Arbitrary upper bound on the size of an IceCast header before it
-// triggers an error.
-static const int kMaxIcecastHeaderSize = 4096;
-
-static const uint32_t kID3StartCodeMask = 0xffffff00;
-static const uint32_t kID3v1StartCode = 0x54414700;  // 'TAG\0'
-static const int kID3v1Size = 128;
-static const int kID3v1ExtendedSize = 227;
-static const uint32_t kID3v2StartCode = 0x49443300;  // 'ID3\0'
-
-static int LocateEndOfHeaders(const uint8_t* buf, int buf_len, int i) {
-  bool was_lf = false;
-  char last_c = '\0';
-  for (; i < buf_len; ++i) {
-    char c = buf[i];
-    if (c == '\n') {
-      if (was_lf) return i + 1;
-      was_lf = true;
-    } else if (c != '\r' || last_c != '\n') {
-      was_lf = false;
-    }
-    last_c = c;
-  }
-  return -1;
-}
-
-MPEGAudioStreamParserBase::MPEGAudioStreamParserBase(
-    DecoderBuffer::Allocator* buffer_allocator, uint32_t start_code_mask,
-    AudioCodec audio_codec, int codec_delay)
-    : buffer_allocator_(buffer_allocator),
-      state_(UNINITIALIZED),
-      in_media_segment_(false),
-      start_code_mask_(start_code_mask),
-      audio_codec_(audio_codec),
-      codec_delay_(codec_delay) {
-  DCHECK(buffer_allocator_);
-}
-
-MPEGAudioStreamParserBase::~MPEGAudioStreamParserBase() {}
-
-void MPEGAudioStreamParserBase::Init(
-    const InitCB& init_cb, const NewConfigCB& config_cb,
-    const NewBuffersCB& new_buffers_cb, bool ignore_text_tracks,
-    const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-    const NewMediaSegmentCB& new_segment_cb,
-    const EndMediaSegmentCB& end_of_segment_cb,
-    const scoped_refptr<MediaLog>& media_log) {
-  DVLOG(1) << __FUNCTION__;
-  DCHECK_EQ(state_, UNINITIALIZED);
-  init_cb_ = init_cb;
-  config_cb_ = config_cb;
-  new_buffers_cb_ = new_buffers_cb;
-  new_segment_cb_ = new_segment_cb;
-  end_of_segment_cb_ = end_of_segment_cb;
-  media_log_ = media_log;
-
-  ChangeState(INITIALIZED);
-}
-
-void MPEGAudioStreamParserBase::Flush() {
-  DVLOG(1) << __FUNCTION__;
-  DCHECK_NE(state_, UNINITIALIZED);
-  queue_.Reset();
-  if (timestamp_helper_) timestamp_helper_->SetBaseTimestamp(base::TimeDelta());
-  in_media_segment_ = false;
-}
-
-bool MPEGAudioStreamParserBase::Parse(const uint8_t* buf, int size) {
-  DVLOG(1) << __FUNCTION__ << "(" << size << ")";
-  DCHECK(buf);
-  DCHECK_GT(size, 0);
-  DCHECK_NE(state_, UNINITIALIZED);
-
-  if (state_ == PARSE_ERROR) return false;
-
-  DCHECK_EQ(state_, INITIALIZED);
-
-  queue_.Push(buf, size);
-
-  bool end_of_segment = true;
-  BufferQueue buffers;
-  for (;;) {
-    const uint8_t* data;
-    int data_size;
-    queue_.Peek(&data, &data_size);
-
-    if (data_size < 4) break;
-
-    uint32_t start_code =
-        data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
-    int bytes_read = 0;
-    bool parsed_metadata = true;
-    if ((start_code & start_code_mask_) == start_code_mask_) {
-      bytes_read = ParseFrame(data, data_size, &buffers);
-
-      // Only allow the current segment to end if a full frame has been parsed.
-      end_of_segment = bytes_read > 0;
-      parsed_metadata = false;
-    } else if (start_code == kICYStartCode) {
-      bytes_read = ParseIcecastHeader(data, data_size);
-    } else if ((start_code & kID3StartCodeMask) == kID3v1StartCode) {
-      bytes_read = ParseID3v1(data, data_size);
-    } else if ((start_code & kID3StartCodeMask) == kID3v2StartCode) {
-      bytes_read = ParseID3v2(data, data_size);
-    } else {
-      bytes_read = FindNextValidStartCode(data, data_size);
-
-      if (bytes_read > 0) {
-        DVLOG(1) << "Unexpected start code 0x" << std::hex << start_code;
-        DVLOG(1) << "SKIPPING " << bytes_read << " bytes of garbage.";
-      }
-    }
-
-    CHECK_LE(bytes_read, data_size);
-
-    if (bytes_read < 0) {
-      ChangeState(PARSE_ERROR);
-      return false;
-    } else if (bytes_read == 0) {
-      // Need more data.
-      break;
-    }
-
-    // Send pending buffers if we have encountered metadata.
-    if (parsed_metadata && !buffers.empty() && !SendBuffers(&buffers, true))
-      return false;
-
-    queue_.Pop(bytes_read);
-    end_of_segment = true;
-  }
-
-  if (buffers.empty()) return true;
-
-  // Send buffers collected in this append that haven't been sent yet.
-  return SendBuffers(&buffers, end_of_segment);
-}
-
-void MPEGAudioStreamParserBase::ChangeState(State state) {
-  DVLOG(1) << __FUNCTION__ << "() : " << state_ << " -> " << state;
-  state_ = state;
-}
-
-int MPEGAudioStreamParserBase::ParseFrame(const uint8_t* data, int size,
-                                          BufferQueue* buffers) {
-  DVLOG(2) << __FUNCTION__ << "(" << size << ")";
-
-  int sample_rate;
-  ChannelLayout channel_layout;
-  int frame_size;
-  int sample_count;
-  bool metadata_frame = false;
-  std::vector<uint8_t> extra_data;
-  int bytes_read =
-      ParseFrameHeader(data, size, &frame_size, &sample_rate, &channel_layout,
-                       &sample_count, &metadata_frame, &extra_data);
-
-  if (bytes_read <= 0) return bytes_read;
-
-  // Make sure data contains the entire frame.
-  if (size < frame_size) return 0;
-
-  DVLOG(2) << " sample_rate " << sample_rate << " channel_layout "
-           << channel_layout << " frame_size " << frame_size << " sample_count "
-           << sample_count;
-
-  if (config_.IsValidConfig() && (config_.samples_per_second() != sample_rate ||
-                                  config_.channel_layout() != channel_layout)) {
-    // Clear config data so that a config change is initiated.
-    config_ = AudioDecoderConfig();
-
-    // Send all buffers associated with the previous config.
-    if (!buffers->empty() && !SendBuffers(buffers, true)) return -1;
-  }
-
-  if (!config_.IsValidConfig()) {
-    config_.Initialize(audio_codec_, kSampleFormatF32, channel_layout,
-                       sample_rate, extra_data, Unencrypted(),
-                       base::TimeDelta(), codec_delay_);
-
-    base::TimeDelta base_timestamp;
-    if (timestamp_helper_) base_timestamp = timestamp_helper_->GetTimestamp();
-
-    timestamp_helper_.reset(new AudioTimestampHelper(sample_rate));
-    timestamp_helper_->SetBaseTimestamp(base_timestamp);
-
-    std::unique_ptr<MediaTracks> media_tracks(new MediaTracks());
-    if (config_.IsValidConfig()) {
-      media_tracks->AddAudioTrack(config_, kMpegAudioTrackId, "main", "", "");
-    }
-    if (!config_cb_.Run(std::move(media_tracks), TextTrackConfigMap()))
-      return -1;
-
-    if (!init_cb_.is_null()) {
-      InitParameters params(kInfiniteDuration);
-      params.detected_audio_track_count = 1;
-      params.auto_update_timestamp_offset = true;
-      base::ResetAndReturn(&init_cb_).Run(params);
-    }
-  }
-
-  if (metadata_frame) return frame_size;
-
-  // TODO(wolenetz/acolwell): Validate and use a common cross-parser TrackId
-  // type and allow multiple audio tracks, if applicable. See
-  // https://crbug.com/341581.
-  scoped_refptr<StreamParserBuffer> buffer =
-      StreamParserBuffer::CopyFrom(buffer_allocator_, data, frame_size, true,
-                                   DemuxerStream::AUDIO, kMpegAudioTrackId);
-  if (!buffer) {
-    return -1;
-  }
-  buffer->set_timestamp(timestamp_helper_->GetTimestamp());
-  buffer->set_duration(timestamp_helper_->GetFrameDuration(sample_count));
-  buffers->push_back(buffer);
-
-  timestamp_helper_->AddFrames(sample_count);
-
-  return frame_size;
-}
-
-int MPEGAudioStreamParserBase::ParseIcecastHeader(const uint8_t* data,
-                                                  int size) {
-  DVLOG(1) << __FUNCTION__ << "(" << size << ")";
-
-  if (size < 4) return 0;
-
-  if (memcmp("ICY ", data, 4)) return -1;
-
-  int locate_size = std::min(size, kMaxIcecastHeaderSize);
-  int offset = LocateEndOfHeaders(data, locate_size, 4);
-  if (offset < 0) {
-    if (locate_size == kMaxIcecastHeaderSize) {
-      MEDIA_LOG(ERROR, media_log_) << "Icecast header is too large.";
-      return -1;
-    }
-
-    return 0;
-  }
-
-  return offset;
-}
-
-int MPEGAudioStreamParserBase::ParseID3v1(const uint8_t* data, int size) {
-  DVLOG(1) << __FUNCTION__ << "(" << size << ")";
-
-  if (size < kID3v1Size) return 0;
-
-  // TODO(acolwell): Add code to actually validate ID3v1 data and
-  // expose it as a metadata text track.
-  return !memcmp(data, "TAG+", 4) ? kID3v1ExtendedSize : kID3v1Size;
-}
-
-int MPEGAudioStreamParserBase::ParseID3v2(const uint8_t* data, int size) {
-  DVLOG(1) << __FUNCTION__ << "(" << size << ")";
-
-  if (size < 10) return 0;
-
-  BitReader reader(data, size);
-  int32_t id;
-  int version;
-  uint8_t flags;
-  int32_t id3_size;
-
-  if (!reader.ReadBits(24, &id) || !reader.ReadBits(16, &version) ||
-      !reader.ReadBits(8, &flags) || !ParseSyncSafeInt(&reader, &id3_size)) {
-    return -1;
-  }
-
-  int32_t actual_tag_size = 10 + id3_size;
-
-  // Increment size if 'Footer present' flag is set.
-  if (flags & 0x10) actual_tag_size += 10;
-
-  // Make sure we have the entire tag.
-  if (size < actual_tag_size) return 0;
-
-  // TODO(acolwell): Add code to actually validate ID3v2 data and
-  // expose it as a metadata text track.
-  return actual_tag_size;
-}
-
-bool MPEGAudioStreamParserBase::ParseSyncSafeInt(BitReader* reader,
-                                                 int32_t* value) {
-  *value = 0;
-  for (int i = 0; i < 4; ++i) {
-    uint8_t tmp;
-    if (!reader->ReadBits(1, &tmp) || tmp != 0) {
-      MEDIA_LOG(ERROR, media_log_) << "ID3 syncsafe integer byte MSb is not 0!";
-      return false;
-    }
-
-    if (!reader->ReadBits(7, &tmp)) return false;
-
-    *value <<= 7;
-    *value += tmp;
-  }
-
-  return true;
-}
-
-int MPEGAudioStreamParserBase::FindNextValidStartCode(const uint8_t* data,
-                                                      int size) const {
-  const uint8_t* start = data;
-  const uint8_t* end = data + size;
-
-  while (start < end) {
-    int bytes_left = end - start;
-    const uint8_t* candidate_start_code =
-        static_cast<const uint8_t*>(memchr(start, 0xff, bytes_left));
-
-    if (!candidate_start_code) return 0;
-
-    bool parse_header_failed = false;
-    const uint8_t* sync = candidate_start_code;
-    // Try to find 3 valid frames in a row. 3 was selected to decrease
-    // the probability of false positives.
-    for (int i = 0; i < 3; ++i) {
-      int sync_size = end - sync;
-      int frame_size;
-      int sync_bytes = ParseFrameHeader(sync, sync_size, &frame_size, NULL,
-                                        NULL, NULL, NULL, NULL);
-
-      if (sync_bytes == 0) return 0;
-
-      if (sync_bytes > 0) {
-        DCHECK_LT(sync_bytes, sync_size);
-
-        // Skip over this frame so we can check the next one.
-        sync += frame_size;
-
-        // Make sure the next frame starts inside the buffer.
-        if (sync >= end) return 0;
-      } else {
-        DVLOG(1) << "ParseFrameHeader() " << i << " failed @" << (sync - data);
-        parse_header_failed = true;
-        break;
-      }
-    }
-
-    if (parse_header_failed) {
-      // One of the frame header parses failed so |candidate_start_code|
-      // did not point to the start of a real frame. Move |start| forward
-      // so we can find the next candidate.
-      start = candidate_start_code + 1;
-      continue;
-    }
-
-    return candidate_start_code - data;
-  }
-
-  return 0;
-}
-
-bool MPEGAudioStreamParserBase::SendBuffers(BufferQueue* buffers,
-                                            bool end_of_segment) {
-  DCHECK(!buffers->empty());
-
-  if (!in_media_segment_) {
-    in_media_segment_ = true;
-    new_segment_cb_.Run();
-  }
-
-  BufferQueueMap buffer_queue_map;
-  buffer_queue_map.insert(std::make_pair(kMpegAudioTrackId, *buffers));
-  if (!new_buffers_cb_.Run(buffer_queue_map)) return false;
-  buffers->clear();
-
-  if (end_of_segment) {
-    in_media_segment_ = false;
-    end_of_segment_cb_.Run();
-  }
-
-  timestamp_helper_->SetBaseTimestamp(base::TimeDelta());
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.h b/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.h
deleted file mode 100644
index 98f351a..0000000
--- a/cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.h
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FORMATS_MPEG_MPEG_AUDIO_STREAM_PARSER_BASE_H_
-#define COBALT_MEDIA_FORMATS_MPEG_MPEG_AUDIO_STREAM_PARSER_BASE_H_
-
-#include <memory>
-#include <set>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/audio_timestamp_helper.h"
-#include "cobalt/media/base/bit_reader.h"
-#include "cobalt/media/base/byte_queue.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT MPEGAudioStreamParserBase : public StreamParser {
- public:
-  // |start_code_mask| is used to find the start of each frame header.  Also
-  // referred to as the sync code in the MP3 and ADTS header specifications.
-  // |codec_delay| is the number of samples the decoder will output before the
-  // first real frame.
-  MPEGAudioStreamParserBase(DecoderBuffer::Allocator* buffer_allocator,
-                            uint32_t start_code_mask, AudioCodec audio_codec,
-                            int codec_delay);
-  ~MPEGAudioStreamParserBase() override;
-
-  // StreamParser implementation.
-  void Init(const InitCB& init_cb, const NewConfigCB& config_cb,
-            const NewBuffersCB& new_buffers_cb, bool ignore_text_tracks,
-            const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-            const NewMediaSegmentCB& new_segment_cb,
-            const EndMediaSegmentCB& end_of_segment_cb,
-            const scoped_refptr<MediaLog>& media_log) override;
-  void Flush() override;
-  bool Parse(const uint8_t* buf, int size) override;
-
- protected:
-  // Subclasses implement this method to parse format specific frame headers.
-  // |data| & |size| describe the data available for parsing.
-  //
-  // Implementations are expected to consume an entire frame header.  It should
-  // only return a value greater than 0 when |data| has enough bytes to
-  // successfully parse & consume the entire frame header.
-  //
-  // |frame_size| - Required parameter that is set to the size of the frame, in
-  // bytes, including the frame header if the function returns a value > 0.
-  // |sample_rate| - Optional parameter that is set to the sample rate
-  // of the frame if this function returns a value > 0.
-  // |channel_layout| - Optional parameter that is set to the channel_layout
-  // of the frame if this function returns a value > 0.
-  // |sample_count| - Optional parameter that is set to the number of samples
-  // in the frame if this function returns a value > 0.
-  // |metadata_frame| - Optional parameter that is set to true if the frame has
-  // valid values for the above parameters, but no usable encoded data; only set
-  // to true if this function returns a value > 0.
-  //
-  // |sample_rate|, |channel_layout|, |sample_count|, |metadata_frame| may be
-  // NULL if the caller is not interested in receiving these values from the
-  // frame header.
-  //
-  // If |metadata_frame| is true, the MPEGAudioStreamParserBase will discard the
-  // frame after consuming the metadata values above.
-  //
-  // Returns:
-  // > 0 : The number of bytes parsed.
-  //   0 : If more data is needed to parse the entire frame header.
-  // < 0 : An error was encountered during parsing.
-  virtual int ParseFrameHeader(const uint8_t* data, int size, int* frame_size,
-                               int* sample_rate, ChannelLayout* channel_layout,
-                               int* sample_count, bool* metadata_frame,
-                               std::vector<uint8_t>* extra_data) const = 0;
-
-  const scoped_refptr<MediaLog>& media_log() const { return media_log_; }
-
- private:
-  enum State { UNINITIALIZED, INITIALIZED, PARSE_ERROR };
-
-  void ChangeState(State state);
-
-  // Parsing functions for various byte stream elements.  |data| & |size|
-  // describe the data available for parsing.
-  //
-  // Returns:
-  // > 0 : The number of bytes parsed.
-  //   0 : If more data is needed to parse the entire element.
-  // < 0 : An error was encountered during parsing.
-  int ParseFrame(const uint8_t* data, int size, BufferQueue* buffers);
-  int ParseIcecastHeader(const uint8_t* data, int size);
-  int ParseID3v1(const uint8_t* data, int size);
-  int ParseID3v2(const uint8_t* data, int size);
-
-  // Parses an ID3v2 "sync safe" integer.
-  // |reader| - A BitReader to read from.
-  // |value| - Set to the integer value read, if true is returned.
-  //
-  // Returns true if the integer was successfully parsed and |value|
-  // was set.
-  // Returns false if an error was encountered. The state of |value| is
-  // undefined when false is returned.
-  bool ParseSyncSafeInt(BitReader* reader, int32_t* value);
-
-  // Scans |data| for the next valid start code.
-  // Returns:
-  // > 0 : The number of bytes that should be skipped to reach the
-  //       next start code..
-  //   0 : If a valid start code was not found and more data is needed.
-  // < 0 : An error was encountered during parsing.
-  int FindNextValidStartCode(const uint8_t* data, int size) const;
-
-  // Sends the buffers in |buffers| to |new_buffers_cb_| and then clears
-  // |buffers|.
-  // If |end_of_segment| is set to true, then |end_of_segment_cb_| is called
-  // after |new_buffers_cb_| to signal that these buffers represent the end of a
-  // media segment.
-  // Returns true if the buffers are sent successfully.
-  bool SendBuffers(BufferQueue* buffers, bool end_of_segment);
-
-  DecoderBuffer::Allocator* buffer_allocator_;
-
-  State state_;
-
-  InitCB init_cb_;
-  NewConfigCB config_cb_;
-  NewBuffersCB new_buffers_cb_;
-  NewMediaSegmentCB new_segment_cb_;
-  EndMediaSegmentCB end_of_segment_cb_;
-  scoped_refptr<MediaLog> media_log_;
-
-  ByteQueue queue_;
-
-  AudioDecoderConfig config_;
-  std::unique_ptr<AudioTimestampHelper> timestamp_helper_;
-  bool in_media_segment_;
-  const uint32_t start_code_mask_;
-  const AudioCodec audio_codec_;
-  const int codec_delay_;
-
-  DISALLOW_COPY_AND_ASSIGN(MPEGAudioStreamParserBase);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_MPEG_MPEG_AUDIO_STREAM_PARSER_BASE_H_
diff --git a/cobalt/media/formats/webm/cluster_builder.cc b/cobalt/media/formats/webm/cluster_builder.cc
deleted file mode 100644
index 4fe5b9c..0000000
--- a/cobalt/media/formats/webm/cluster_builder.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/cluster_builder.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/logging.h"
-#include "cobalt/media/base/data_buffer.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-static const uint8_t kClusterHeader[] = {
-    0x1F, 0x43, 0xB6, 0x75,                          // CLUSTER ID
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // cluster(size = 0)
-    0xE7,                                            // Timecode ID
-    0x88,                                            // timecode(size=8)
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // timecode value
-};
-
-static const uint8_t kSimpleBlockHeader[] = {
-    0xA3,                                            // SimpleBlock ID
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // SimpleBlock(size = 0)
-};
-
-static const uint8_t kBlockGroupHeader[] = {
-    0xA0,                                            // BlockGroup ID
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // BlockGroup(size = 0)
-    0x9B,                                            // BlockDuration ID
-    0x88,                                            // BlockDuration(size = 8)
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // duration
-    0xA1,                                            // Block ID
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Block(size = 0)
-};
-
-static const uint8_t kBlockGroupHeaderWithoutBlockDuration[] = {
-    0xA0,                                            // BlockGroup ID
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // BlockGroup(size = 0)
-    0xA1,                                            // Block ID
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Block(size = 0)
-};
-
-static const uint8_t kBlockGroupReferenceBlock[] = {
-    0xFB,        // ReferenceBlock ID
-    0x81, 0x00,  // ReferenceBlock (size=1, value=0)
-};
-
-enum {
-  kClusterSizeOffset = 4,
-  kClusterTimecodeOffset = 14,
-
-  kSimpleBlockSizeOffset = 1,
-
-  kBlockGroupSizeOffset = 1,
-  kBlockGroupWithoutBlockDurationBlockSizeOffset = 10,
-  kBlockGroupDurationOffset = 11,
-  kBlockGroupBlockSizeOffset = 20,
-
-  kInitialBufferSize = 32768,
-};
-
-Cluster::Cluster(std::unique_ptr<uint8_t[]> data, int size)
-    : data_(std::move(data)), size_(size) {}
-Cluster::~Cluster() {}
-
-ClusterBuilder::ClusterBuilder() { Reset(); }
-ClusterBuilder::~ClusterBuilder() {}
-
-void ClusterBuilder::SetClusterTimecode(int64_t cluster_timecode) {
-  DCHECK_EQ(cluster_timecode_, -1);
-
-  cluster_timecode_ = cluster_timecode;
-
-  // Write the timecode into the header.
-  uint8_t* buf = buffer_.get() + kClusterTimecodeOffset;
-  for (int i = 7; i >= 0; --i) {
-    buf[i] = cluster_timecode & 0xff;
-    cluster_timecode >>= 8;
-  }
-}
-
-void ClusterBuilder::AddSimpleBlock(int track_num, int64_t timecode, int flags,
-                                    const uint8_t* data, int size) {
-  int block_size = size + 4;
-  int bytes_needed = sizeof(kSimpleBlockHeader) + block_size;
-  if (bytes_needed > (buffer_size_ - bytes_used_)) ExtendBuffer(bytes_needed);
-
-  uint8_t* buf = buffer_.get() + bytes_used_;
-  int block_offset = bytes_used_;
-  memcpy(buf, kSimpleBlockHeader, sizeof(kSimpleBlockHeader));
-  UpdateUInt64(block_offset + kSimpleBlockSizeOffset, block_size);
-  buf += sizeof(kSimpleBlockHeader);
-
-  WriteBlock(buf, track_num, timecode, flags, data, size);
-
-  bytes_used_ += bytes_needed;
-}
-
-void ClusterBuilder::AddBlockGroup(int track_num, int64_t timecode,
-                                   int duration, int flags, bool is_key_frame,
-                                   const uint8_t* data, int size) {
-  AddBlockGroupInternal(track_num, timecode, true, duration, flags,
-                        is_key_frame, data, size);
-}
-
-void ClusterBuilder::AddBlockGroupWithoutBlockDuration(
-    int track_num, int64_t timecode, int flags, bool is_key_frame,
-    const uint8_t* data, int size) {
-  AddBlockGroupInternal(track_num, timecode, false, 0, flags, is_key_frame,
-                        data, size);
-}
-
-void ClusterBuilder::AddBlockGroupInternal(int track_num, int64_t timecode,
-                                           bool include_block_duration,
-                                           int duration, int flags,
-                                           bool is_key_frame,
-                                           const uint8_t* data, int size) {
-  int block_size = size + 4;
-  int bytes_needed = block_size;
-  if (include_block_duration) {
-    bytes_needed += sizeof(kBlockGroupHeader);
-  } else {
-    bytes_needed += sizeof(kBlockGroupHeaderWithoutBlockDuration);
-  }
-  if (!is_key_frame) {
-    bytes_needed += sizeof(kBlockGroupReferenceBlock);
-  }
-
-  int block_group_size = bytes_needed - 9;
-
-  if (bytes_needed > (buffer_size_ - bytes_used_)) ExtendBuffer(bytes_needed);
-
-  uint8_t* buf = buffer_.get() + bytes_used_;
-  int block_group_offset = bytes_used_;
-  if (include_block_duration) {
-    memcpy(buf, kBlockGroupHeader, sizeof(kBlockGroupHeader));
-    UpdateUInt64(block_group_offset + kBlockGroupDurationOffset, duration);
-    UpdateUInt64(block_group_offset + kBlockGroupBlockSizeOffset, block_size);
-    buf += sizeof(kBlockGroupHeader);
-  } else {
-    memcpy(buf, kBlockGroupHeaderWithoutBlockDuration,
-                 sizeof(kBlockGroupHeaderWithoutBlockDuration));
-    UpdateUInt64(
-        block_group_offset + kBlockGroupWithoutBlockDurationBlockSizeOffset,
-        block_size);
-    buf += sizeof(kBlockGroupHeaderWithoutBlockDuration);
-  }
-
-  UpdateUInt64(block_group_offset + kBlockGroupSizeOffset, block_group_size);
-
-  // Make sure the 4 most-significant bits are 0.
-  // http://www.matroska.org/technical/specs/index.html#block_structure
-  flags &= 0x0f;
-
-  WriteBlock(buf, track_num, timecode, flags, data, size);
-  buf += size + 4;
-
-  if (!is_key_frame) {
-    memcpy(buf, kBlockGroupReferenceBlock,
-                 sizeof(kBlockGroupReferenceBlock));
-  }
-
-  bytes_used_ += bytes_needed;
-}
-
-void ClusterBuilder::WriteBlock(uint8_t* buf, int track_num, int64_t timecode,
-                                int flags, const uint8_t* data, int size) {
-  DCHECK_GE(track_num, 0);
-  DCHECK_LE(track_num, 126);
-  DCHECK_GE(flags, 0);
-  DCHECK_LE(flags, 0xff);
-  DCHECK(data);
-  DCHECK_GT(size, 0);
-  DCHECK_NE(cluster_timecode_, -1);
-
-  int64_t timecode_delta = timecode - cluster_timecode_;
-  DCHECK_GE(timecode_delta, -32768);
-  DCHECK_LE(timecode_delta, 32767);
-
-  buf[0] = 0x80 | (track_num & 0x7F);
-  buf[1] = (timecode_delta >> 8) & 0xff;
-  buf[2] = timecode_delta & 0xff;
-  buf[3] = flags & 0xff;
-  memcpy(buf + 4, data, size);
-}
-
-std::unique_ptr<Cluster> ClusterBuilder::Finish() {
-  DCHECK_NE(cluster_timecode_, -1);
-
-  UpdateUInt64(kClusterSizeOffset, bytes_used_ - (kClusterSizeOffset + 8));
-
-  std::unique_ptr<Cluster> ret(new Cluster(std::move(buffer_), bytes_used_));
-  Reset();
-  return std::move(ret);
-}
-
-std::unique_ptr<Cluster> ClusterBuilder::FinishWithUnknownSize() {
-  DCHECK_NE(cluster_timecode_, -1);
-
-  UpdateUInt64(kClusterSizeOffset, kWebMUnknownSize);
-
-  std::unique_ptr<Cluster> ret(new Cluster(std::move(buffer_), bytes_used_));
-  Reset();
-  return std::move(ret);
-}
-
-void ClusterBuilder::Reset() {
-  buffer_size_ = kInitialBufferSize;
-  buffer_.reset(new uint8_t[buffer_size_]);
-  memcpy(buffer_.get(), kClusterHeader, sizeof(kClusterHeader));
-  bytes_used_ = sizeof(kClusterHeader);
-  cluster_timecode_ = -1;
-}
-
-void ClusterBuilder::ExtendBuffer(int bytes_needed) {
-  int new_buffer_size = 2 * buffer_size_;
-
-  while ((new_buffer_size - bytes_used_) < bytes_needed) new_buffer_size *= 2;
-
-  std::unique_ptr<uint8_t[]> new_buffer(new uint8_t[new_buffer_size]);
-
-  memcpy(new_buffer.get(), buffer_.get(), bytes_used_);
-  buffer_ = std::move(new_buffer);
-  buffer_size_ = new_buffer_size;
-}
-
-void ClusterBuilder::UpdateUInt64(int offset, int64_t value) {
-  DCHECK_LE(offset + 7, buffer_size_);
-  uint8_t* buf = buffer_.get() + offset;
-
-  // Fill the last 7 bytes of size field in big-endian order.
-  for (int i = 7; i > 0; i--) {
-    buf[i] = value & 0xff;
-    value >>= 8;
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/cluster_builder.h b/cobalt/media/formats/webm/cluster_builder.h
deleted file mode 100644
index 2345692..0000000
--- a/cobalt/media/formats/webm/cluster_builder.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 COBALT_MEDIA_FORMATS_WEBM_CLUSTER_BUILDER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_CLUSTER_BUILDER_H_
-
-#include <memory>
-
-#include "base/basictypes.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class Cluster {
- public:
-  Cluster(std::unique_ptr<uint8_t[]> data, int size);
-  ~Cluster();
-
-  const uint8_t* data() const { return data_.get(); }
-  int size() const { return size_; }
-
- private:
-  std::unique_ptr<uint8_t[]> data_;
-  int size_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(Cluster);
-};
-
-class ClusterBuilder {
- public:
-  ClusterBuilder();
-  ~ClusterBuilder();
-
-  void SetClusterTimecode(int64_t cluster_timecode);
-  void AddSimpleBlock(int track_num, int64_t timecode, int flags,
-                      const uint8_t* data, int size);
-  void AddBlockGroup(int track_num, int64_t timecode, int duration, int flags,
-                     bool is_key_frame, const uint8_t* data, int size);
-  void AddBlockGroupWithoutBlockDuration(int track_num, int64_t timecode,
-                                         int flags, bool is_key_frame,
-                                         const uint8_t* data, int size);
-
-  std::unique_ptr<Cluster> Finish();
-  std::unique_ptr<Cluster> FinishWithUnknownSize();
-
- private:
-  void AddBlockGroupInternal(int track_num, int64_t timecode,
-                             bool include_block_duration, int duration,
-                             int flags, bool is_key_frame, const uint8_t* data,
-                             int size);
-  void Reset();
-  void ExtendBuffer(int bytes_needed);
-  void UpdateUInt64(int offset, int64_t value);
-  void WriteBlock(uint8_t* buf, int track_num, int64_t timecode, int flags,
-                  const uint8_t* data, int size);
-
-  std::unique_ptr<uint8_t[]> buffer_;
-  int buffer_size_;
-  int bytes_used_;
-  int64_t cluster_timecode_;
-
-  DISALLOW_COPY_AND_ASSIGN(ClusterBuilder);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_CLUSTER_BUILDER_H_
diff --git a/cobalt/media/formats/webm/opus_packet_builder.cc b/cobalt/media/formats/webm/opus_packet_builder.cc
deleted file mode 100644
index 3e4086e..0000000
--- a/cobalt/media/formats/webm/opus_packet_builder.cc
+++ /dev/null
@@ -1,86 +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 <memory>
-
-#include "base/logging.h"
-#include "cobalt/media/formats/webm/opus_packet_builder.h"
-#include "cobalt/media/formats/webm/webm_cluster_parser.h"
-
-namespace cobalt {
-namespace media {
-
-OpusPacket::OpusPacket(uint8_t config, uint8_t frame_count, bool is_VBR) {
-  DCHECK_GE(config, 0);
-  DCHECK_LT(config, kNumPossibleOpusConfigs);
-  DCHECK_GE(frame_count, kMinOpusPacketFrameCount);
-  DCHECK_LE(frame_count, kMaxOpusPacketFrameCount);
-
-  duration_ms_ = frame_count *
-                 WebMClusterParser::kOpusFrameDurationsMu[config] /
-                 static_cast<float>(1000);
-
-  uint8_t frame_count_code;
-  uint8_t frame_count_byte;
-
-  if (frame_count == 1) {
-    frame_count_code = 0;
-  } else if (frame_count == 2) {
-    frame_count_code = is_VBR ? 2 : 1;
-  } else {
-    frame_count_code = 3;
-    frame_count_byte = (is_VBR ? 1 << 7 : 0) | frame_count;
-  }
-
-  // All opus packets must have TOC byte.
-  uint8_t opus_toc_byte = (config << 3) | frame_count_code;
-  data_.push_back(opus_toc_byte);
-
-  // For code 3 packets, the number of frames is signaled in the "frame
-  // count byte".
-  if (frame_count_code == 3) {
-    data_.push_back(frame_count_byte);
-  }
-
-  // Packet will only conform to layout specification for the TOC byte
-  // and optional frame count bytes appended above. This last byte
-  // is purely dummy padding where frame size data or encoded data might
-  // otherwise start.
-  data_.push_back(static_cast<uint8_t>(0));
-}
-
-OpusPacket::~OpusPacket() {}
-
-const uint8_t* OpusPacket::data() const { return &(data_[0]); }
-
-int OpusPacket::size() const { return data_.size(); }
-
-double OpusPacket::duration_ms() const { return duration_ms_; }
-
-std::vector<std::unique_ptr<OpusPacket>> BuildAllOpusPackets() {
-  std::vector<std::unique_ptr<OpusPacket>> opus_packets;
-
-  for (int frame_count = kMinOpusPacketFrameCount;
-       frame_count <= kMaxOpusPacketFrameCount; frame_count++) {
-    for (int opus_config_num = 0; opus_config_num < kNumPossibleOpusConfigs;
-         opus_config_num++) {
-      bool is_VBR = false;
-      opus_packets.push_back(std::unique_ptr<OpusPacket>(
-          new OpusPacket(opus_config_num, frame_count, is_VBR)));
-
-      if (frame_count >= 2) {
-        // Add another packet with VBR flag toggled. For frame counts >= 2,
-        // VBR triggers changes to packet framing.
-        is_VBR = true;
-        opus_packets.push_back(std::unique_ptr<OpusPacket>(
-            new OpusPacket(opus_config_num, frame_count, is_VBR)));
-      }
-    }
-  }
-
-  return std::move(opus_packets);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/opus_packet_builder.h b/cobalt/media/formats/webm/opus_packet_builder.h
deleted file mode 100644
index 737eeda..0000000
--- a/cobalt/media/formats/webm/opus_packet_builder.h
+++ /dev/null
@@ -1,46 +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 COBALT_MEDIA_FORMATS_WEBM_OPUS_PACKET_BUILDER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_OPUS_PACKET_BUILDER_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// From Opus RFC. See https://tools.ietf.org/html/rfc6716#page-14
-enum OpusConstants {
-  kNumPossibleOpusConfigs = 32,
-  kMinOpusPacketFrameCount = 1,
-  kMaxOpusPacketFrameCount = 48
-};
-
-class OpusPacket {
- public:
-  OpusPacket(uint8_t config, uint8_t frame_count, bool is_VBR);
-  ~OpusPacket();
-
-  const uint8_t* data() const;
-  int size() const;
-  double duration_ms() const;
-
- private:
-  std::vector<uint8_t> data_;
-  double duration_ms_;
-
-  DISALLOW_COPY_AND_ASSIGN(OpusPacket);
-};
-
-// Builds an exhaustive collection of Opus packet configurations.
-std::vector<std::unique_ptr<OpusPacket>> BuildAllOpusPackets();
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_OPUS_PACKET_BUILDER_H_
diff --git a/cobalt/media/formats/webm/tracks_builder.cc b/cobalt/media/formats/webm/tracks_builder.cc
deleted file mode 100644
index c27d43a..0000000
--- a/cobalt/media/formats/webm/tracks_builder.cc
+++ /dev/null
@@ -1,352 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/tracks_builder.h"
-
-#include "base/logging.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-// Returns size of an integer, formatted using Matroska serialization.
-static int GetUIntMkvSize(uint64_t value) {
-  if (value < 0x07FULL) return 1;
-  if (value < 0x03FFFULL) return 2;
-  if (value < 0x01FFFFFULL) return 3;
-  if (value < 0x0FFFFFFFULL) return 4;
-  if (value < 0x07FFFFFFFFULL) return 5;
-  if (value < 0x03FFFFFFFFFFULL) return 6;
-  if (value < 0x01FFFFFFFFFFFFULL) return 7;
-  return 8;
-}
-
-// Returns the minimum size required to serialize an integer value.
-static int GetUIntSize(uint64_t value) {
-  if (value < 0x0100ULL) return 1;
-  if (value < 0x010000ULL) return 2;
-  if (value < 0x01000000ULL) return 3;
-  if (value < 0x0100000000ULL) return 4;
-  if (value < 0x010000000000ULL) return 5;
-  if (value < 0x01000000000000ULL) return 6;
-  if (value < 0x0100000000000000ULL) return 7;
-  return 8;
-}
-
-static int MasterElementSize(int element_id, int payload_size) {
-  return GetUIntSize(element_id) + GetUIntMkvSize(payload_size) + payload_size;
-}
-
-static int UIntElementSize(int element_id, uint64_t value) {
-  return GetUIntSize(element_id) + 1 + GetUIntSize(value);
-}
-
-static int DoubleElementSize(int element_id) {
-  return GetUIntSize(element_id) + 1 + 8;
-}
-
-static int StringElementSize(int element_id, const std::string& value) {
-  return GetUIntSize(element_id) + GetUIntMkvSize(value.length()) +
-         value.length();
-}
-
-static void SerializeInt(uint8_t** buf_ptr, int* buf_size_ptr, int64_t value,
-                         int size) {
-  uint8_t*& buf = *buf_ptr;
-  int& buf_size = *buf_size_ptr;
-
-  for (int idx = 1; idx <= size; ++idx) {
-    *buf++ = static_cast<uint8_t>(value >> ((size - idx) * 8));
-    --buf_size;
-  }
-}
-
-static void SerializeDouble(uint8_t** buf_ptr, int* buf_size_ptr,
-                            double value) {
-  // Use a union to convert |value| to native endian integer bit pattern.
-  union {
-    double src;
-    int64_t dst;
-  } tmp;
-  tmp.src = value;
-
-  // Write the bytes from native endian |tmp.dst| to big-endian form in |buf|.
-  SerializeInt(buf_ptr, buf_size_ptr, tmp.dst, 8);
-}
-
-static void WriteElementId(uint8_t** buf, int* buf_size, int element_id) {
-  SerializeInt(buf, buf_size, element_id, GetUIntSize(element_id));
-}
-
-static void WriteUInt(uint8_t** buf, int* buf_size, uint64_t value) {
-  const int size = GetUIntMkvSize(value);
-  value |= (1ULL << (size * 7));  // Matroska formatting
-  SerializeInt(buf, buf_size, value, size);
-}
-
-static void WriteMasterElement(uint8_t** buf, int* buf_size, int element_id,
-                               int payload_size) {
-  WriteElementId(buf, buf_size, element_id);
-  WriteUInt(buf, buf_size, payload_size);
-}
-
-static void WriteUIntElement(uint8_t** buf, int* buf_size, int element_id,
-                             uint64_t value) {
-  WriteElementId(buf, buf_size, element_id);
-
-  const int size = GetUIntSize(value);
-  WriteUInt(buf, buf_size, size);
-
-  SerializeInt(buf, buf_size, value, size);
-}
-
-static void WriteDoubleElement(uint8_t** buf, int* buf_size, int element_id,
-                               double value) {
-  WriteElementId(buf, buf_size, element_id);
-  WriteUInt(buf, buf_size, 8);
-  SerializeDouble(buf, buf_size, value);
-}
-
-static void WriteStringElement(uint8_t** buf_ptr, int* buf_size_ptr,
-                               int element_id, const std::string& value) {
-  uint8_t*& buf = *buf_ptr;
-  int& buf_size = *buf_size_ptr;
-
-  WriteElementId(&buf, &buf_size, element_id);
-
-  const uint64_t size = value.length();
-  WriteUInt(&buf, &buf_size, size);
-
-  memcpy(buf, value.data(), size);
-  buf += size;
-  buf_size -= size;
-}
-
-TracksBuilder::TracksBuilder(bool allow_invalid_values)
-    : allow_invalid_values_(allow_invalid_values) {}
-TracksBuilder::TracksBuilder() : allow_invalid_values_(false) {}
-TracksBuilder::~TracksBuilder() {}
-
-void TracksBuilder::AddVideoTrack(int track_num, uint64_t track_uid,
-                                  const std::string& codec_id,
-                                  const std::string& name,
-                                  const std::string& language,
-                                  int default_duration, int video_pixel_width,
-                                  int video_pixel_height) {
-  AddTrackInternal(track_num, kWebMTrackTypeVideo, track_uid, codec_id, name,
-                   language, default_duration, video_pixel_width,
-                   video_pixel_height, -1, -1);
-}
-
-void TracksBuilder::AddAudioTrack(int track_num, uint64_t track_uid,
-                                  const std::string& codec_id,
-                                  const std::string& name,
-                                  const std::string& language,
-                                  int default_duration, int audio_channels,
-                                  double audio_sampling_frequency) {
-  AddTrackInternal(track_num, kWebMTrackTypeAudio, track_uid, codec_id, name,
-                   language, default_duration, -1, -1, audio_channels,
-                   audio_sampling_frequency);
-}
-
-void TracksBuilder::AddTextTrack(int track_num, uint64_t track_uid,
-                                 const std::string& codec_id,
-                                 const std::string& name,
-                                 const std::string& language) {
-  AddTrackInternal(track_num, kWebMTrackTypeSubtitlesOrCaptions, track_uid,
-                   codec_id, name, language, -1, -1, -1, -1, -1);
-}
-
-std::vector<uint8_t> TracksBuilder::Finish() {
-  // Allocate the storage
-  std::vector<uint8_t> buffer;
-  buffer.resize(GetTracksSize());
-
-  // Populate the storage with a tracks header
-  WriteTracks(&buffer[0], buffer.size());
-
-  return buffer;
-}
-
-void TracksBuilder::AddTrackInternal(
-    int track_num, int track_type, uint64_t track_uid,
-    const std::string& codec_id, const std::string& name,
-    const std::string& language, int default_duration, int video_pixel_width,
-    int video_pixel_height, int audio_channels,
-    double audio_sampling_frequency) {
-  tracks_.push_back(Track(track_num, track_type, track_uid, codec_id, name,
-                          language, default_duration, video_pixel_width,
-                          video_pixel_height, audio_channels,
-                          audio_sampling_frequency, allow_invalid_values_));
-}
-
-int TracksBuilder::GetTracksSize() const {
-  return MasterElementSize(kWebMIdTracks, GetTracksPayloadSize());
-}
-
-int TracksBuilder::GetTracksPayloadSize() const {
-  int payload_size = 0;
-
-  for (TrackList::const_iterator itr = tracks_.begin(); itr != tracks_.end();
-       ++itr) {
-    payload_size += itr->GetSize();
-  }
-
-  return payload_size;
-}
-
-void TracksBuilder::WriteTracks(uint8_t* buf, int buf_size) const {
-  WriteMasterElement(&buf, &buf_size, kWebMIdTracks, GetTracksPayloadSize());
-
-  for (TrackList::const_iterator itr = tracks_.begin(); itr != tracks_.end();
-       ++itr) {
-    itr->Write(&buf, &buf_size);
-  }
-}
-
-TracksBuilder::Track::Track(int track_num, int track_type, uint64_t track_uid,
-                            const std::string& codec_id,
-                            const std::string& name,
-                            const std::string& language, int default_duration,
-                            int video_pixel_width, int video_pixel_height,
-                            int audio_channels, double audio_sampling_frequency,
-                            bool allow_invalid_values)
-    : track_num_(track_num),
-      track_type_(track_type),
-      track_uid_(track_uid),
-      codec_id_(codec_id),
-      name_(name),
-      language_(language),
-      default_duration_(default_duration),
-      video_pixel_width_(video_pixel_width),
-      video_pixel_height_(video_pixel_height),
-      audio_channels_(audio_channels),
-      audio_sampling_frequency_(audio_sampling_frequency) {
-  if (!allow_invalid_values) {
-    CHECK_GT(track_num_, 0);
-    CHECK_GT(track_type_, 0);
-    CHECK_LT(track_type_, 255);
-    CHECK_GT(track_uid_, 0);
-    if (track_type != kWebMTrackTypeVideo &&
-        track_type != kWebMTrackTypeAudio) {
-      CHECK_EQ(default_duration_, -1);
-    } else {
-      CHECK(default_duration_ == -1 || default_duration_ > 0);
-    }
-
-    if (track_type == kWebMTrackTypeVideo) {
-      CHECK_GT(video_pixel_width_, 0);
-      CHECK_GT(video_pixel_height_, 0);
-    } else {
-      CHECK_EQ(video_pixel_width_, -1);
-      CHECK_EQ(video_pixel_height_, -1);
-    }
-
-    if (track_type == kWebMTrackTypeAudio) {
-      CHECK_GT(audio_channels_, 0);
-      CHECK_GT(audio_sampling_frequency_, 0.0);
-    } else {
-      CHECK_EQ(audio_channels_, -1);
-      CHECK_EQ(audio_sampling_frequency_, -1.0);
-    }
-  }
-}
-
-int TracksBuilder::Track::GetSize() const {
-  return MasterElementSize(kWebMIdTrackEntry, GetPayloadSize());
-}
-
-int TracksBuilder::Track::GetVideoPayloadSize() const {
-  int payload_size = 0;
-
-  if (video_pixel_width_ >= 0)
-    payload_size += UIntElementSize(kWebMIdPixelWidth, video_pixel_width_);
-  if (video_pixel_height_ >= 0)
-    payload_size += UIntElementSize(kWebMIdPixelHeight, video_pixel_height_);
-
-  return payload_size;
-}
-
-int TracksBuilder::Track::GetAudioPayloadSize() const {
-  int payload_size = 0;
-
-  if (audio_channels_ >= 0)
-    payload_size += UIntElementSize(kWebMIdChannels, audio_channels_);
-  if (audio_sampling_frequency_ >= 0)
-    payload_size += DoubleElementSize(kWebMIdSamplingFrequency);
-
-  return payload_size;
-}
-
-int TracksBuilder::Track::GetPayloadSize() const {
-  int size = 0;
-
-  size += UIntElementSize(kWebMIdTrackNumber, track_num_);
-  size += UIntElementSize(kWebMIdTrackType, track_type_);
-  size += UIntElementSize(kWebMIdTrackUID, track_uid_);
-
-  if (default_duration_ >= 0)
-    size += UIntElementSize(kWebMIdDefaultDuration, default_duration_);
-
-  if (!codec_id_.empty()) size += StringElementSize(kWebMIdCodecID, codec_id_);
-
-  if (!name_.empty()) size += StringElementSize(kWebMIdName, name_);
-
-  if (!language_.empty()) size += StringElementSize(kWebMIdLanguage, language_);
-
-  if (GetVideoPayloadSize() > 0) {
-    size += MasterElementSize(kWebMIdVideo, GetVideoPayloadSize());
-  }
-
-  if (GetAudioPayloadSize() > 0) {
-    size += MasterElementSize(kWebMIdAudio, GetAudioPayloadSize());
-  }
-
-  return size;
-}
-
-void TracksBuilder::Track::Write(uint8_t** buf, int* buf_size) const {
-  WriteMasterElement(buf, buf_size, kWebMIdTrackEntry, GetPayloadSize());
-
-  WriteUIntElement(buf, buf_size, kWebMIdTrackNumber, track_num_);
-  WriteUIntElement(buf, buf_size, kWebMIdTrackType, track_type_);
-  WriteUIntElement(buf, buf_size, kWebMIdTrackUID, track_uid_);
-
-  if (default_duration_ >= 0)
-    WriteUIntElement(buf, buf_size, kWebMIdDefaultDuration, default_duration_);
-
-  if (!codec_id_.empty())
-    WriteStringElement(buf, buf_size, kWebMIdCodecID, codec_id_);
-
-  if (!name_.empty()) WriteStringElement(buf, buf_size, kWebMIdName, name_);
-
-  if (!language_.empty())
-    WriteStringElement(buf, buf_size, kWebMIdLanguage, language_);
-
-  if (GetVideoPayloadSize() > 0) {
-    WriteMasterElement(buf, buf_size, kWebMIdVideo, GetVideoPayloadSize());
-
-    if (video_pixel_width_ >= 0)
-      WriteUIntElement(buf, buf_size, kWebMIdPixelWidth, video_pixel_width_);
-
-    if (video_pixel_height_ >= 0)
-      WriteUIntElement(buf, buf_size, kWebMIdPixelHeight, video_pixel_height_);
-  }
-
-  if (GetAudioPayloadSize() > 0) {
-    WriteMasterElement(buf, buf_size, kWebMIdAudio, GetAudioPayloadSize());
-
-    if (audio_channels_ >= 0)
-      WriteUIntElement(buf, buf_size, kWebMIdChannels, audio_channels_);
-
-    if (audio_sampling_frequency_ >= 0) {
-      WriteDoubleElement(buf, buf_size, kWebMIdSamplingFrequency,
-                         audio_sampling_frequency_);
-    }
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/tracks_builder.h b/cobalt/media/formats/webm/tracks_builder.h
deleted file mode 100644
index 4ab04e0..0000000
--- a/cobalt/media/formats/webm/tracks_builder.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_TRACKS_BUILDER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_TRACKS_BUILDER_H_
-
-#include <list>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class TracksBuilder {
- public:
-  // If |allow_invalid_values| is false, some AddTrack() parameters will be
-  // basically checked and will assert if out of valid range. |codec_id|,
-  // |name|, |language| and any device-specific constraints are not checked.
-  explicit TracksBuilder(bool allow_invalid_values);
-  TracksBuilder();  // Sets |allow_invalid_values| to false.
-  ~TracksBuilder();
-
-  // Only a non-negative |default_duration| will result in a serialized
-  // kWebMIdDefaultDuration element. Note, 0 is allowed here for testing only
-  // if |allow_invalid_values_| is true, since it is an illegal value for
-  // DefaultDuration. Similar applies to |audio_channels|,
-  // |audio_sampling_frequency|, |video_pixel_width| and |video_pixel_height|.
-  void AddVideoTrack(int track_num, uint64_t track_uid,
-                     const std::string& codec_id, const std::string& name,
-                     const std::string& language, int default_duration,
-                     int video_pixel_width, int video_pixel_height);
-  void AddAudioTrack(int track_num, uint64_t track_uid,
-                     const std::string& codec_id, const std::string& name,
-                     const std::string& language, int default_duration,
-                     int audio_channels, double audio_sampling_frequency);
-  void AddTextTrack(int track_num, uint64_t track_uid,
-                    const std::string& codec_id, const std::string& name,
-                    const std::string& language);
-
-  std::vector<uint8_t> Finish();
-
- private:
-  void AddTrackInternal(int track_num, int track_type, uint64_t track_uid,
-                        const std::string& codec_id, const std::string& name,
-                        const std::string& language, int default_duration,
-                        int video_pixel_width, int video_pixel_height,
-                        int audio_channels, double audio_sampling_frequency);
-  int GetTracksSize() const;
-  int GetTracksPayloadSize() const;
-  void WriteTracks(uint8_t* buffer, int buffer_size) const;
-
-  class Track {
-   public:
-    Track(int track_num, int track_type, uint64_t track_uid,
-          const std::string& codec_id, const std::string& name,
-          const std::string& language, int default_duration,
-          int video_pixel_width, int video_pixel_height, int audio_channels,
-          double audio_sampling_frequency, bool allow_invalid_values);
-
-    int GetSize() const;
-    void Write(uint8_t** buf, int* buf_size) const;
-
-   private:
-    int GetPayloadSize() const;
-    int GetVideoPayloadSize() const;
-    int GetAudioPayloadSize() const;
-
-    int track_num_;
-    int track_type_;
-    int track_uid_;
-    std::string codec_id_;
-    std::string name_;
-    std::string language_;
-    int default_duration_;
-    int video_pixel_width_;
-    int video_pixel_height_;
-    int audio_channels_;
-    double audio_sampling_frequency_;
-  };
-
-  typedef std::list<Track> TrackList;
-  TrackList tracks_;
-  bool allow_invalid_values_;
-
-  DISALLOW_COPY_AND_ASSIGN(TracksBuilder);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_TRACKS_BUILDER_H_
diff --git a/cobalt/media/formats/webm/webm_audio_client.cc b/cobalt/media/formats/webm/webm_audio_client.cc
deleted file mode 100644
index 9eccca1..0000000
--- a/cobalt/media/formats/webm/webm_audio_client.cc
+++ /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.
-
-#include "cobalt/media/formats/webm/webm_audio_client.h"
-
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-
-namespace cobalt {
-namespace media {
-
-WebMAudioClient::WebMAudioClient(const scoped_refptr<MediaLog>& media_log)
-    : media_log_(media_log) {
-  Reset();
-}
-
-WebMAudioClient::~WebMAudioClient() {}
-
-void WebMAudioClient::Reset() {
-  channels_ = -1;
-  samples_per_second_ = -1;
-  output_samples_per_second_ = -1;
-}
-
-bool WebMAudioClient::InitializeConfig(
-    const std::string& codec_id, const std::vector<uint8_t>& codec_private,
-    int64_t seek_preroll, int64_t codec_delay,
-    const EncryptionScheme& encryption_scheme, AudioDecoderConfig* config) {
-  DCHECK(config);
-  SampleFormat sample_format = kSampleFormatPlanarF32;
-
-  AudioCodec audio_codec = kUnknownAudioCodec;
-  if (codec_id == "A_VORBIS") {
-    audio_codec = kCodecVorbis;
-  } else if (codec_id == "A_OPUS") {
-    audio_codec = kCodecOpus;
-  } else {
-    MEDIA_LOG(ERROR, media_log_) << "Unsupported audio codec_id " << codec_id;
-    return false;
-  }
-
-  if (samples_per_second_ <= 0) return false;
-
-  // Set channel layout default if a Channels element was not present.
-  if (channels_ == -1) channels_ = 1;
-
-  ChannelLayout channel_layout = GuessChannelLayout(channels_);
-
-  if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) {
-    MEDIA_LOG(ERROR, media_log_) << "Unsupported channel count " << channels_;
-    return false;
-  }
-
-  int samples_per_second = samples_per_second_;
-  if (output_samples_per_second_ > 0)
-    samples_per_second = output_samples_per_second_;
-
-  // Always use 48kHz for OPUS.  See the "Input Sample Rate" section of the
-  // spec: http://tools.ietf.org/html/draft-terriberry-oggopus-01#page-11
-  if (audio_codec == kCodecOpus) {
-    samples_per_second = 48000;
-    sample_format = kSampleFormatF32;
-  }
-
-  // Convert |codec_delay| from nanoseconds into frames.
-  int codec_delay_in_frames = 0;
-  if (codec_delay != -1) {
-    codec_delay_in_frames =
-        0.5 + samples_per_second * (static_cast<double>(codec_delay) /
-                                    base::Time::kNanosecondsPerSecond);
-  }
-
-  config->Initialize(audio_codec, sample_format, channel_layout,
-                     samples_per_second, codec_private, encryption_scheme,
-                     base::TimeDelta::FromMicroseconds(
-                         (seek_preroll != -1 ? seek_preroll : 0) / 1000),
-                     codec_delay_in_frames);
-  return config->IsValidConfig();
-}
-
-bool WebMAudioClient::OnUInt(int id, int64_t val) {
-  if (id == kWebMIdChannels) {
-    if (channels_ != -1) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Multiple values for id " << std::hex << id << " specified. ("
-          << channels_ << " and " << val << ")";
-      return false;
-    }
-
-    channels_ = val;
-  }
-  return true;
-}
-
-bool WebMAudioClient::OnFloat(int id, double val) {
-  double* dst = NULL;
-
-  switch (id) {
-    case kWebMIdSamplingFrequency:
-      dst = &samples_per_second_;
-      break;
-    case kWebMIdOutputSamplingFrequency:
-      dst = &output_samples_per_second_;
-      break;
-    default:
-      return true;
-  }
-
-  if (val <= 0) return false;
-
-  if (*dst != -1) {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Multiple values for id " << std::hex << id << " specified (" << *dst
-        << " and " << val << ")";
-    return false;
-  }
-
-  *dst = val;
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_audio_client.h b/cobalt/media/formats/webm/webm_audio_client.h
deleted file mode 100644
index b96a477..0000000
--- a/cobalt/media/formats/webm/webm_audio_client.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_AUDIO_CLIENT_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_AUDIO_CLIENT_H_
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/formats/webm/webm_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-class AudioDecoderConfig;
-class EncryptionScheme;
-
-// Helper class used to parse an Audio element inside a TrackEntry element.
-class WebMAudioClient : public WebMParserClient {
- public:
-  explicit WebMAudioClient(const scoped_refptr<MediaLog>& media_log);
-  ~WebMAudioClient() override;
-
-  // Reset this object's state so it can process a new audio track element.
-  void Reset();
-
-  // Initialize |config| with the data in |codec_id|, |codec_private|,
-  // |encryption_scheme| and the fields parsed from the last audio track element
-  // this object was used to parse.
-  // Returns true if |config| was successfully initialized.
-  // Returns false if there was unexpected values in the provided parameters or
-  // audio track element fields.
-  bool InitializeConfig(const std::string& codec_id,
-                        const std::vector<uint8_t>& codec_private,
-                        const int64_t seek_preroll, const int64_t codec_delay,
-                        const EncryptionScheme& encryption_scheme,
-                        AudioDecoderConfig* config);
-
- private:
-  // WebMParserClient implementation.
-  bool OnUInt(int id, int64_t val) override;
-  bool OnFloat(int id, double val) override;
-
-  scoped_refptr<MediaLog> media_log_;
-  int channels_;
-  double samples_per_second_;
-  double output_samples_per_second_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebMAudioClient);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_AUDIO_CLIENT_H_
diff --git a/cobalt/media/formats/webm/webm_cluster_parser.cc b/cobalt/media/formats/webm/webm_cluster_parser.cc
deleted file mode 100644
index fc75254..0000000
--- a/cobalt/media/formats/webm/webm_cluster_parser.cc
+++ /dev/null
@@ -1,865 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/webm_cluster_parser.h"
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "base/sys_byteorder.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/filters/webvtt_util.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "cobalt/media/formats/webm/webm_crypto_helpers.h"
-#include "cobalt/media/formats/webm/webm_webvtt_parser.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-
-const uint16_t WebMClusterParser::kOpusFrameDurationsMu[] = {
-    10000, 20000, 40000, 60000, 10000, 20000, 40000, 60000, 10000, 20000, 40000,
-    60000, 10000, 20000, 10000, 20000, 2500,  5000,  10000, 20000, 2500,  5000,
-    10000, 20000, 2500,  5000,  10000, 20000, 2500,  5000,  10000, 20000};
-
-enum {
-  // Limits the number of MEDIA_LOG() calls in the path of reading encoded
-  // duration to avoid spamming for corrupted data.
-  kMaxDurationErrorLogs = 10,
-  // Limits the number of MEDIA_LOG() calls warning the user that buffer
-  // durations have been estimated.
-  kMaxDurationEstimateLogs = 10,
-};
-
-WebMClusterParser::WebMClusterParser(
-    DecoderBuffer::Allocator* buffer_allocator, int64_t timecode_scale,
-    int audio_track_num, base::TimeDelta audio_default_duration,
-    int video_track_num, base::TimeDelta video_default_duration,
-    const WebMTracksParser::TextTracks& text_tracks,
-    const std::set<int64_t>& ignored_tracks,
-    const std::string& audio_encryption_key_id,
-    const std::string& video_encryption_key_id, const AudioCodec audio_codec,
-    const scoped_refptr<MediaLog>& media_log)
-    : buffer_allocator_(buffer_allocator),
-      num_duration_errors_(0),
-      timecode_multiplier_(timecode_scale / 1000.0),
-      ignored_tracks_(ignored_tracks),
-      audio_encryption_key_id_(audio_encryption_key_id),
-      video_encryption_key_id_(video_encryption_key_id),
-      audio_codec_(audio_codec),
-      parser_(kWebMIdCluster, this),
-      last_block_timecode_(-1),
-      block_data_size_(-1),
-      block_duration_(-1),
-      block_add_id_(-1),
-      block_additional_data_size_(0),
-      discard_padding_(-1),
-      discard_padding_set_(false),
-      reference_block_set_(false),
-      cluster_timecode_(-1),
-      cluster_start_time_(kNoTimestamp),
-      cluster_ended_(false),
-      audio_(audio_track_num, false, audio_default_duration, media_log),
-      video_(video_track_num, true, video_default_duration, media_log),
-      ready_buffer_upper_bound_(kNoDecodeTimestamp()),
-      media_log_(media_log) {
-  DCHECK(buffer_allocator_);
-  for (WebMTracksParser::TextTracks::const_iterator it = text_tracks.begin();
-       it != text_tracks.end(); ++it) {
-    text_track_map_.insert(std::make_pair(
-        it->first, Track(it->first, false, kNoTimestamp, media_log_)));
-  }
-}
-
-WebMClusterParser::~WebMClusterParser() {}
-
-void WebMClusterParser::Reset() {
-  last_block_timecode_ = -1;
-  cluster_timecode_ = -1;
-  cluster_start_time_ = kNoTimestamp;
-  cluster_ended_ = false;
-  parser_.Reset();
-  audio_.Reset();
-  video_.Reset();
-  ResetTextTracks();
-  ready_buffer_upper_bound_ = kNoDecodeTimestamp();
-}
-
-int WebMClusterParser::Parse(const uint8_t* buf, int size) {
-  audio_.ClearReadyBuffers();
-  video_.ClearReadyBuffers();
-  ClearTextTrackReadyBuffers();
-  ready_buffer_upper_bound_ = kNoDecodeTimestamp();
-
-  int result = parser_.Parse(buf, size);
-
-  if (result < 0) {
-    cluster_ended_ = false;
-    return result;
-  }
-
-  cluster_ended_ = parser_.IsParsingComplete();
-  if (cluster_ended_) {
-    // If there were no buffers in this cluster, set the cluster start time to
-    // be the |cluster_timecode_|.
-    if (cluster_start_time_ == kNoTimestamp) {
-      // If the cluster did not even have a |cluster_timecode_|, signal parse
-      // error.
-      if (cluster_timecode_ < 0) return -1;
-
-      cluster_start_time_ = base::TimeDelta::FromMicroseconds(
-          cluster_timecode_ * timecode_multiplier_);
-    }
-
-    // Reset the parser if we're done parsing so that
-    // it is ready to accept another cluster on the next
-    // call.
-    parser_.Reset();
-
-    last_block_timecode_ = -1;
-    cluster_timecode_ = -1;
-  }
-
-  return result;
-}
-
-const WebMClusterParser::TextBufferQueueMap&
-WebMClusterParser::GetTextBuffers() {
-  if (ready_buffer_upper_bound_ == kNoDecodeTimestamp()) UpdateReadyBuffers();
-
-  // Translate our |text_track_map_| into |text_buffers_map_|, inserting rows in
-  // the output only for non-empty ready_buffer() queues in |text_track_map_|.
-  text_buffers_map_.clear();
-  for (TextTrackMap::const_iterator itr = text_track_map_.begin();
-       itr != text_track_map_.end(); ++itr) {
-    const BufferQueue& text_buffers = itr->second.ready_buffers();
-    if (!text_buffers.empty())
-      text_buffers_map_.insert(std::make_pair(itr->first, text_buffers));
-  }
-
-  return text_buffers_map_;
-}
-
-void WebMClusterParser::GetBuffers(StreamParser::BufferQueueMap* buffers) {
-  DCHECK(buffers->empty());
-  if (ready_buffer_upper_bound_ == kNoDecodeTimestamp()) UpdateReadyBuffers();
-  const BufferQueue& audio_buffers = audio_.ready_buffers();
-  if (!audio_buffers.empty()) {
-    buffers->insert(std::make_pair(audio_.track_num(), audio_buffers));
-  }
-  const BufferQueue& video_buffers = video_.ready_buffers();
-  if (!video_buffers.empty()) {
-    buffers->insert(std::make_pair(video_.track_num(), video_buffers));
-  }
-  const WebMClusterParser::TextBufferQueueMap& text_buffers = GetTextBuffers();
-  for (WebMClusterParser::TextBufferQueueMap::const_iterator it =
-           text_buffers.begin();
-       it != text_buffers.end(); ++it) {
-    DCHECK(!it->second.empty());
-    buffers->insert(*it);
-  }
-}
-
-base::TimeDelta WebMClusterParser::TryGetEncodedAudioDuration(
-    const uint8_t* data, int size) {
-  // Duration is currently read assuming the *entire* stream is unencrypted.
-  // The special "Signal Byte" prepended to Blocks in encrypted streams is
-  // assumed to not be present.
-  // TODO(chcunningham): Consider parsing "Signal Byte" for encrypted streams
-  // to return duration for any unencrypted blocks.
-
-  if (audio_codec_ == kCodecOpus) {
-    return ReadOpusDuration(data, size);
-  }
-
-  // TODO(wolenetz/chcunningham): Implement duration reading for Vorbis. See
-  // motivations in http://crbug.com/396634.
-
-  return kNoTimestamp;
-}
-
-base::TimeDelta WebMClusterParser::ReadOpusDuration(const uint8_t* data,
-                                                    int size) {
-  // Masks and constants for Opus packets. See
-  // https://tools.ietf.org/html/rfc6716#page-14
-  static const uint8_t kTocConfigMask = 0xf8;
-  static const uint8_t kTocFrameCountCodeMask = 0x03;
-  static const uint8_t kFrameCountMask = 0x3f;
-  static const base::TimeDelta kPacketDurationMax =
-      base::TimeDelta::FromMilliseconds(120);
-
-  if (size < 1) {
-    LIMITED_MEDIA_LOG(DEBUG, media_log_, num_duration_errors_,
-                      kMaxDurationErrorLogs)
-        << "Invalid zero-byte Opus packet; demuxed block duration may be "
-           "imprecise.";
-    return kNoTimestamp;
-  }
-
-  // Frame count type described by last 2 bits of Opus TOC byte.
-  int frame_count_type = data[0] & kTocFrameCountCodeMask;
-
-  int frame_count = 0;
-  switch (frame_count_type) {
-    case 0:
-      frame_count = 1;
-      break;
-    case 1:
-    case 2:
-      frame_count = 2;
-      break;
-    case 3:
-      // Type 3 indicates an arbitrary frame count described in the next byte.
-      if (size < 2) {
-        LIMITED_MEDIA_LOG(DEBUG, media_log_, num_duration_errors_,
-                          kMaxDurationErrorLogs)
-            << "Second byte missing from 'Code 3' Opus packet; demuxed block "
-               "duration may be imprecise.";
-        return kNoTimestamp;
-      }
-
-      frame_count = data[1] & kFrameCountMask;
-
-      if (frame_count == 0) {
-        LIMITED_MEDIA_LOG(DEBUG, media_log_, num_duration_errors_,
-                          kMaxDurationErrorLogs)
-            << "Illegal 'Code 3' Opus packet with frame count zero; demuxed "
-               "block duration may be imprecise.";
-        return kNoTimestamp;
-      }
-
-      break;
-    default:
-      LIMITED_MEDIA_LOG(DEBUG, media_log_, num_duration_errors_,
-                        kMaxDurationErrorLogs)
-          << "Unexpected Opus frame count type: " << frame_count_type << "; "
-          << "demuxed block duration may be imprecise.";
-      return kNoTimestamp;
-  }
-
-  int opusConfig = (data[0] & kTocConfigMask) >> 3;
-  CHECK_GE(opusConfig, 0);
-  CHECK_LT(opusConfig, static_cast<int>(arraysize(kOpusFrameDurationsMu)));
-
-  DCHECK_GT(frame_count, 0);
-  base::TimeDelta duration = base::TimeDelta::FromMicroseconds(
-      kOpusFrameDurationsMu[opusConfig] * frame_count);
-
-  if (duration > kPacketDurationMax) {
-    // Intentionally allowing packet to pass through for now. Decoder should
-    // either handle or fail gracefully. MEDIA_LOG as breadcrumbs in case
-    // things go sideways.
-    LIMITED_MEDIA_LOG(DEBUG, media_log_, num_duration_errors_,
-                      kMaxDurationErrorLogs)
-        << "Warning, demuxed Opus packet with encoded duration: "
-        << duration.InMilliseconds() << "ms. Should be no greater than "
-        << kPacketDurationMax.InMilliseconds() << "ms.";
-  }
-
-  return duration;
-}
-
-WebMParserClient* WebMClusterParser::OnListStart(int id) {
-  if (id == kWebMIdCluster) {
-    cluster_timecode_ = -1;
-    cluster_start_time_ = kNoTimestamp;
-  } else if (id == kWebMIdBlockGroup) {
-    block_data_.reset();
-    block_data_size_ = -1;
-    block_duration_ = -1;
-    discard_padding_ = -1;
-    discard_padding_set_ = false;
-    reference_block_set_ = false;
-  } else if (id == kWebMIdBlockAdditions) {
-    block_add_id_ = -1;
-    block_additional_data_.reset();
-    block_additional_data_size_ = 0;
-  }
-
-  return this;
-}
-
-bool WebMClusterParser::OnListEnd(int id) {
-  if (id != kWebMIdBlockGroup) return true;
-
-  // Make sure the BlockGroup actually had a Block.
-  if (block_data_size_ == -1) {
-    MEDIA_LOG(ERROR, media_log_) << "Block missing from BlockGroup.";
-    return false;
-  }
-
-  bool result = ParseBlock(
-      false, block_data_.get(), block_data_size_, block_additional_data_.get(),
-      block_additional_data_size_, block_duration_,
-      discard_padding_set_ ? discard_padding_ : 0, reference_block_set_);
-  block_data_.reset();
-  block_data_size_ = -1;
-  block_duration_ = -1;
-  block_add_id_ = -1;
-  block_additional_data_.reset();
-  block_additional_data_size_ = 0;
-  discard_padding_ = -1;
-  discard_padding_set_ = false;
-  reference_block_set_ = false;
-  return result;
-}
-
-bool WebMClusterParser::OnUInt(int id, int64_t val) {
-  int64_t* dst;
-  switch (id) {
-    case kWebMIdTimecode:
-      dst = &cluster_timecode_;
-      break;
-    case kWebMIdBlockDuration:
-      dst = &block_duration_;
-      break;
-    case kWebMIdBlockAddID:
-      dst = &block_add_id_;
-      break;
-    default:
-      return true;
-  }
-  if (*dst != -1) return false;
-  *dst = val;
-  return true;
-}
-
-bool WebMClusterParser::ParseBlock(bool is_simple_block, const uint8_t* buf,
-                                   int size, const uint8_t* additional,
-                                   int additional_size, int duration,
-                                   int64_t discard_padding,
-                                   bool reference_block_set) {
-  if (size < 4) return false;
-
-  // Return an error if the trackNum > 127. We just aren't
-  // going to support large track numbers right now.
-  if (!(buf[0] & 0x80)) {
-    MEDIA_LOG(ERROR, media_log_) << "TrackNumber over 127 not supported";
-    return false;
-  }
-
-  int track_num = buf[0] & 0x7f;
-  int timecode = buf[1] << 8 | buf[2];
-  int flags = buf[3] & 0xff;
-  int lacing = (flags >> 1) & 0x3;
-
-  if (lacing) {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Lacing " << lacing << " is not supported yet.";
-    return false;
-  }
-
-  // Sign extend negative timecode offsets.
-  if (timecode & 0x8000) timecode |= ~0xffff;
-
-  // The first bit of the flags is set when a SimpleBlock contains only
-  // keyframes. If this is a Block, then keyframe is inferred by the absence of
-  // the ReferenceBlock Element.
-  // http://www.matroska.org/technical/specs/index.html
-  bool is_keyframe =
-      is_simple_block ? (flags & 0x80) != 0 : !reference_block_set;
-
-  const uint8_t* frame_data = buf + 4;
-  int frame_size = size - (frame_data - buf);
-  return OnBlock(is_simple_block, track_num, timecode, duration, frame_data,
-                 frame_size, additional, additional_size, discard_padding,
-                 is_keyframe);
-}
-
-bool WebMClusterParser::OnBinary(int id, const uint8_t* data, int size) {
-  switch (id) {
-    case kWebMIdSimpleBlock:
-      return ParseBlock(true, data, size, NULL, 0, -1, 0, false);
-
-    case kWebMIdBlock:
-      if (block_data_) {
-        MEDIA_LOG(ERROR, media_log_)
-            << "More than 1 Block in a BlockGroup is not "
-               "supported.";
-        return false;
-      }
-      block_data_.reset(new uint8_t[size]);
-      memcpy(block_data_.get(), data, size);
-      block_data_size_ = size;
-      return true;
-
-    case kWebMIdBlockAdditional: {
-      uint64_t block_add_id = base::HostToNet64(block_add_id_);
-      if (block_additional_data_) {
-        // TODO(vigneshv): Technically, more than 1 BlockAdditional is allowed
-        // as per matroska spec. But for now we don't have a use case to
-        // support parsing of such files. Take a look at this again when such a
-        // case arises.
-        MEDIA_LOG(ERROR, media_log_) << "More than 1 BlockAdditional in a "
-                                        "BlockGroup is not supported.";
-        return false;
-      }
-      // First 8 bytes of side_data in DecoderBuffer is the BlockAddID
-      // element's value in Big Endian format. This is done to mimic ffmpeg
-      // demuxer's behavior.
-      block_additional_data_size_ = size + sizeof(block_add_id);
-      block_additional_data_.reset(new uint8_t[block_additional_data_size_]);
-      memcpy(block_additional_data_.get(), &block_add_id,
-                   sizeof(block_add_id));
-      memcpy(block_additional_data_.get() + 8, data, size);
-      return true;
-    }
-    case kWebMIdDiscardPadding: {
-      if (discard_padding_set_ || size <= 0 || size > 8) return false;
-      discard_padding_set_ = true;
-
-      // Read in the big-endian integer.
-      discard_padding_ = static_cast<int8_t>(data[0]);
-      for (int i = 1; i < size; ++i)
-        discard_padding_ = (discard_padding_ << 8) | data[i];
-
-      return true;
-    }
-    case kWebMIdReferenceBlock: {
-      // We use ReferenceBlock to determine whether the current Block contains a
-      // keyframe or not. Other than that, we don't care about the value of the
-      // ReferenceBlock element itself.
-      reference_block_set_ = true;
-      return true;
-    }
-    default:
-      return true;
-  }
-}
-
-bool WebMClusterParser::OnBlock(bool is_simple_block, int track_num,
-                                int timecode, int block_duration,
-                                const uint8_t* data, int size,
-                                const uint8_t* additional, int additional_size,
-                                int64_t discard_padding, bool is_keyframe) {
-  DCHECK_GE(size, 0);
-  if (cluster_timecode_ == -1) {
-    MEDIA_LOG(ERROR, media_log_) << "Got a block before cluster timecode.";
-    return false;
-  }
-
-  // TODO(acolwell): Should relative negative timecode offsets be rejected?  Or
-  // only when the absolute timecode is negative?  See http://crbug.com/271794
-  if (timecode < 0) {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Got a block with negative timecode offset " << timecode;
-    return false;
-  }
-
-  if (last_block_timecode_ != -1 && timecode < last_block_timecode_) {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Got a block with a timecode before the previous block.";
-    return false;
-  }
-
-  Track* track = NULL;
-  StreamParserBuffer::Type buffer_type = DemuxerStream::AUDIO;
-  std::string encryption_key_id;
-  base::TimeDelta encoded_duration = kNoTimestamp;
-  if (track_num == audio_.track_num()) {
-    track = &audio_;
-    encryption_key_id = audio_encryption_key_id_;
-    if (encryption_key_id.empty()) {
-      encoded_duration = TryGetEncodedAudioDuration(data, size);
-    }
-  } else if (track_num == video_.track_num()) {
-    track = &video_;
-    encryption_key_id = video_encryption_key_id_;
-    buffer_type = DemuxerStream::VIDEO;
-  } else if (ignored_tracks_.find(track_num) != ignored_tracks_.end()) {
-    return true;
-  } else if (Track* const text_track = FindTextTrack(track_num)) {
-    if (is_simple_block)  // BlockGroup is required for WebVTT cues
-      return false;
-    if (block_duration < 0)  // not specified
-      return false;
-    track = text_track;
-    buffer_type = DemuxerStream::TEXT;
-  } else {
-    MEDIA_LOG(ERROR, media_log_) << "Unexpected track number " << track_num;
-    return false;
-  }
-
-  last_block_timecode_ = timecode;
-
-  base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds(
-      (cluster_timecode_ + timecode) * timecode_multiplier_);
-
-  scoped_refptr<StreamParserBuffer> buffer;
-  if (buffer_type != DemuxerStream::TEXT) {
-    // Every encrypted Block has a signal byte and IV prepended to it. Current
-    // encrypted WebM request for comments specification is here
-    // http://wiki.webmproject.org/encryption/webm-encryption-rfc
-    std::unique_ptr<DecryptConfig> decrypt_config;
-    int data_offset = 0;
-    if (!encryption_key_id.empty() &&
-        !WebMCreateDecryptConfig(
-            data, size,
-            reinterpret_cast<const uint8_t*>(encryption_key_id.data()),
-            encryption_key_id.size(), &decrypt_config, &data_offset)) {
-      return false;
-    }
-
-    // TODO(wolenetz/acolwell): Validate and use a common cross-parser TrackId
-    // type with remapped bytestream track numbers and allow multiple tracks as
-    // applicable. See https://crbug.com/341581.
-    buffer = StreamParserBuffer::CopyFrom(
-        buffer_allocator_, data + data_offset, size - data_offset, additional,
-        additional_size, is_keyframe, buffer_type, track_num);
-    // This will cause a playback error.
-    if (!buffer) {
-      MEDIA_LOG(ERROR, media_log_) << "Failed to allocate StreamParserBuffer";
-      return false;
-    }
-    if (decrypt_config) buffer->set_decrypt_config(std::move(decrypt_config));
-  } else {
-    std::string id, settings, content;
-    WebMWebVTTParser::Parse(data, size, &id, &settings, &content);
-
-    std::vector<uint8_t> side_data;
-    MakeSideData(id.begin(), id.end(), settings.begin(), settings.end(),
-                 &side_data);
-
-    // TODO(wolenetz/acolwell): Validate and use a common cross-parser TrackId
-    // type with remapped bytestream track numbers and allow multiple tracks as
-    // applicable. See https://crbug.com/341581.
-    buffer = StreamParserBuffer::CopyFrom(
-        buffer_allocator_, reinterpret_cast<const uint8_t*>(content.data()),
-        content.length(), side_data.data(), side_data.size(), true, buffer_type,
-        track_num);
-    // This will cause a playback error.
-    if (!buffer) {
-      MEDIA_LOG(ERROR, media_log_) << "Failed to allocate StreamParserBuffer";
-      return false;
-    }
-  }
-
-  buffer->set_timestamp(timestamp);
-  if (cluster_start_time_ == kNoTimestamp) cluster_start_time_ = timestamp;
-
-  base::TimeDelta block_duration_time_delta = kNoTimestamp;
-  if (block_duration >= 0) {
-    block_duration_time_delta = base::TimeDelta::FromMicroseconds(
-        block_duration * timecode_multiplier_);
-  }
-
-  // Prefer encoded duration over BlockGroup->BlockDuration or
-  // TrackEntry->DefaultDuration when available. This layering violation is a
-  // workaround for http://crbug.com/396634, decreasing the likelihood of
-  // fall-back to rough estimation techniques for Blocks that lack a
-  // BlockDuration at the end of a cluster. Cross cluster durations are not
-  // feasible given flexibility of cluster ordering and MSE APIs. Duration
-  // estimation may still apply in cases of encryption and codecs for which
-  // we do not extract encoded duration. Within a cluster, estimates are applied
-  // as Block Timecode deltas, or once the whole cluster is parsed in the case
-  // of the last Block in the cluster. See Track::AddBuffer and
-  // ApplyDurationEstimateIfNeeded().
-  if (encoded_duration != kNoTimestamp) {
-    DCHECK(encoded_duration != kInfiniteDuration);
-    DCHECK(encoded_duration > base::TimeDelta());
-    buffer->set_duration(encoded_duration);
-
-    DVLOG(3) << __func__ << " : "
-             << "Using encoded duration " << encoded_duration.InSecondsF();
-
-    if (block_duration_time_delta != kNoTimestamp) {
-      base::TimeDelta duration_difference =
-          block_duration_time_delta - encoded_duration;
-
-      const base::TimeDelta kWarnDurationDiff =
-          base::TimeDelta::FromMicroseconds(timecode_multiplier_ * 2);
-      if (duration_difference.magnitude() > kWarnDurationDiff) {
-        LIMITED_MEDIA_LOG(DEBUG, media_log_, num_duration_errors_,
-                          kMaxDurationErrorLogs)
-            << "BlockDuration (" << block_duration_time_delta.InMilliseconds()
-            << "ms) differs significantly from encoded duration ("
-            << encoded_duration.InMilliseconds() << "ms).";
-      }
-    }
-  } else if (block_duration_time_delta != kNoTimestamp) {
-    buffer->set_duration(block_duration_time_delta);
-  } else {
-    DCHECK_NE(buffer_type, DemuxerStream::TEXT);
-    buffer->set_duration(track->default_duration());
-  }
-
-  if (discard_padding != 0) {
-    buffer->set_discard_padding(std::make_pair(
-        base::TimeDelta(),
-        base::TimeDelta::FromMicroseconds(discard_padding / 1000)));
-  }
-
-  return track->AddBuffer(buffer);
-}
-
-WebMClusterParser::Track::Track(int track_num, bool is_video,
-                                base::TimeDelta default_duration,
-                                const scoped_refptr<MediaLog>& media_log)
-    : num_duration_estimates_(0),
-      track_num_(track_num),
-      is_video_(is_video),
-      default_duration_(default_duration),
-      estimated_next_frame_duration_(kNoTimestamp),
-      media_log_(media_log) {
-  DCHECK(default_duration_ == kNoTimestamp ||
-         default_duration_ > base::TimeDelta());
-}
-
-WebMClusterParser::Track::~Track() {}
-
-DecodeTimestamp WebMClusterParser::Track::GetReadyUpperBound() {
-  DCHECK(ready_buffers_.empty());
-  if (last_added_buffer_missing_duration_.get())
-    return last_added_buffer_missing_duration_->GetDecodeTimestamp();
-
-  return DecodeTimestamp::FromPresentationTime(base::TimeDelta::Max());
-}
-
-void WebMClusterParser::Track::ExtractReadyBuffers(
-    const DecodeTimestamp before_timestamp) {
-  DCHECK(ready_buffers_.empty());
-  DCHECK(DecodeTimestamp() <= before_timestamp);
-  DCHECK(kNoDecodeTimestamp() != before_timestamp);
-
-  if (buffers_.empty()) return;
-
-  if (buffers_.back()->GetDecodeTimestamp() < before_timestamp) {
-    // All of |buffers_| are ready.
-    ready_buffers_.swap(buffers_);
-    DVLOG(3) << __func__ << " : " << track_num_ << " All "
-             << ready_buffers_.size() << " are ready: before upper bound ts "
-             << before_timestamp.InSecondsF();
-    return;
-  }
-
-  // Not all of |buffers_| are ready yet. Move any that are ready to
-  // |ready_buffers_|.
-  while (true) {
-    const scoped_refptr<StreamParserBuffer>& buffer = buffers_.front();
-    if (buffer->GetDecodeTimestamp() >= before_timestamp) break;
-    ready_buffers_.push_back(buffer);
-    buffers_.pop_front();
-    DCHECK(!buffers_.empty());
-  }
-
-  DVLOG(3) << __func__ << " : " << track_num_ << " Only "
-           << ready_buffers_.size() << " ready, " << buffers_.size()
-           << " at or after upper bound ts " << before_timestamp.InSecondsF();
-}
-
-bool WebMClusterParser::Track::AddBuffer(
-    const scoped_refptr<StreamParserBuffer>& buffer) {
-  DVLOG(2) << "AddBuffer() : " << track_num_ << " ts "
-           << buffer->timestamp().InSecondsF() << " dur "
-           << buffer->duration().InSecondsF() << " kf "
-           << buffer->is_key_frame() << " size " << buffer->data_size();
-
-  if (last_added_buffer_missing_duration_.get()) {
-    base::TimeDelta derived_duration =
-        buffer->timestamp() - last_added_buffer_missing_duration_->timestamp();
-    last_added_buffer_missing_duration_->set_duration(derived_duration);
-
-    DVLOG(2) << "AddBuffer() : applied derived duration to held-back buffer : "
-             << " ts "
-             << last_added_buffer_missing_duration_->timestamp().InSecondsF()
-             << " dur "
-             << last_added_buffer_missing_duration_->duration().InSecondsF()
-             << " kf " << last_added_buffer_missing_duration_->is_key_frame()
-             << " size " << last_added_buffer_missing_duration_->data_size();
-    scoped_refptr<StreamParserBuffer> updated_buffer =
-        last_added_buffer_missing_duration_;
-    last_added_buffer_missing_duration_ = NULL;
-    if (!QueueBuffer(updated_buffer)) return false;
-  }
-
-  if (buffer->duration() == kNoTimestamp) {
-    last_added_buffer_missing_duration_ = buffer;
-    DVLOG(2) << "AddBuffer() : holding back buffer that is missing duration";
-    return true;
-  }
-
-  return QueueBuffer(buffer);
-}
-
-void WebMClusterParser::Track::ApplyDurationEstimateIfNeeded() {
-  if (!last_added_buffer_missing_duration_.get()) return;
-
-  base::TimeDelta estimated_duration = GetDurationEstimate();
-  last_added_buffer_missing_duration_->set_duration(estimated_duration);
-
-  if (is_video_) {
-    // Exposing estimation so splicing/overlap frame processing can make
-    // informed decisions downstream.
-    // TODO(chcunningham): Set this for audio as well in later change where
-    // audio is switched to max estimation and splicing is disabled.
-    last_added_buffer_missing_duration_->set_is_duration_estimated(true);
-  }
-
-  LIMITED_MEDIA_LOG(INFO, media_log_, num_duration_estimates_,
-                    kMaxDurationEstimateLogs)
-      << "Estimating WebM block duration to be "
-      << estimated_duration.InMilliseconds()
-      << "ms for the last (Simple)Block in the Cluster for this Track. Use "
-         "BlockGroups with BlockDurations at the end of each Track in a "
-         "Cluster to avoid estimation.";
-
-  DVLOG(2) << __func__ << " new dur : ts "
-           << last_added_buffer_missing_duration_->timestamp().InSecondsF()
-           << " dur "
-           << last_added_buffer_missing_duration_->duration().InSecondsF()
-           << " kf " << last_added_buffer_missing_duration_->is_key_frame()
-           << " size " << last_added_buffer_missing_duration_->data_size();
-
-  // Don't use the applied duration as a future estimation (don't use
-  // QueueBuffer() here.)
-  buffers_.push_back(last_added_buffer_missing_duration_);
-  last_added_buffer_missing_duration_ = NULL;
-}
-
-void WebMClusterParser::Track::ClearReadyBuffers() {
-  // Note that |buffers_| are kept and |estimated_next_frame_duration_| is not
-  // reset here.
-  ready_buffers_.clear();
-}
-
-void WebMClusterParser::Track::Reset() {
-  ClearReadyBuffers();
-  buffers_.clear();
-  last_added_buffer_missing_duration_ = NULL;
-}
-
-bool WebMClusterParser::Track::QueueBuffer(
-    const scoped_refptr<StreamParserBuffer>& buffer) {
-  DCHECK(!last_added_buffer_missing_duration_.get());
-
-  // WebMClusterParser::OnBlock() gives MEDIA_LOG and parse error on decreasing
-  // block timecode detection within a cluster. Therefore, we should not see
-  // those here.
-  DecodeTimestamp previous_buffers_timestamp =
-      buffers_.empty() ? DecodeTimestamp()
-                       : buffers_.back()->GetDecodeTimestamp();
-  CHECK(previous_buffers_timestamp <= buffer->GetDecodeTimestamp());
-
-  base::TimeDelta duration = buffer->duration();
-  if (duration < base::TimeDelta() || duration == kNoTimestamp) {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Invalid buffer duration: " << duration.InSecondsF();
-    return false;
-  }
-
-  // The estimated frame duration is the minimum (for audio) or the maximum
-  // (for video) non-zero duration since the last initialization segment. The
-  // minimum is used for audio to ensure frame durations aren't overestimated,
-  // triggering unnecessary frame splicing. For video, splicing does not apply,
-  // so maximum is used and overlap is simply resolved by showing the
-  // later of the overlapping frames at its given PTS, effectively trimming down
-  // the over-estimated duration of the previous frame.
-  // TODO(chcunningham): Use max for audio and disable splicing whenever
-  // estimated buffers are encountered.
-  if (duration > base::TimeDelta()) {
-    base::TimeDelta orig_duration_estimate = estimated_next_frame_duration_;
-    if (estimated_next_frame_duration_ == kNoTimestamp) {
-      estimated_next_frame_duration_ = duration;
-    } else if (is_video_) {
-      estimated_next_frame_duration_ =
-          std::max(duration, estimated_next_frame_duration_);
-    } else {
-      estimated_next_frame_duration_ =
-          std::min(duration, estimated_next_frame_duration_);
-    }
-
-    if (orig_duration_estimate != estimated_next_frame_duration_) {
-      DVLOG(3) << "Updated duration estimate:"
-               << orig_duration_estimate.InSecondsF() << " -> "
-               << estimated_next_frame_duration_.InSecondsF()
-               << " at timestamp: "
-               << buffer->GetDecodeTimestamp().InSecondsF();
-    }
-  }
-
-  buffers_.push_back(buffer);
-  return true;
-}
-
-base::TimeDelta WebMClusterParser::Track::GetDurationEstimate() {
-  base::TimeDelta duration = estimated_next_frame_duration_;
-  if (duration != kNoTimestamp) {
-    DVLOG(3) << __func__ << " : using estimated duration";
-  } else {
-    DVLOG(3) << __func__ << " : using hardcoded default duration";
-    if (is_video_) {
-      duration =
-          base::TimeDelta::FromMilliseconds(kDefaultVideoBufferDurationInMs);
-    } else {
-      duration =
-          base::TimeDelta::FromMilliseconds(kDefaultAudioBufferDurationInMs);
-    }
-  }
-
-  DCHECK(duration > base::TimeDelta());
-  DCHECK(duration != kNoTimestamp);
-  return duration;
-}
-
-void WebMClusterParser::ClearTextTrackReadyBuffers() {
-  text_buffers_map_.clear();
-  for (TextTrackMap::iterator it = text_track_map_.begin();
-       it != text_track_map_.end(); ++it) {
-    it->second.ClearReadyBuffers();
-  }
-}
-
-void WebMClusterParser::ResetTextTracks() {
-  ClearTextTrackReadyBuffers();
-  for (TextTrackMap::iterator it = text_track_map_.begin();
-       it != text_track_map_.end(); ++it) {
-    it->second.Reset();
-  }
-}
-
-void WebMClusterParser::UpdateReadyBuffers() {
-  DCHECK(ready_buffer_upper_bound_ == kNoDecodeTimestamp());
-  DCHECK(text_buffers_map_.empty());
-
-  if (cluster_ended_) {
-    audio_.ApplyDurationEstimateIfNeeded();
-    video_.ApplyDurationEstimateIfNeeded();
-    // Per OnBlock(), all text buffers should already have valid durations, so
-    // there is no need to call ApplyDurationEstimateIfNeeded() on text tracks
-    // here.
-    ready_buffer_upper_bound_ =
-        DecodeTimestamp::FromPresentationTime(base::TimeDelta::Max());
-    DCHECK(ready_buffer_upper_bound_ == audio_.GetReadyUpperBound());
-    DCHECK(ready_buffer_upper_bound_ == video_.GetReadyUpperBound());
-  } else {
-    ready_buffer_upper_bound_ =
-        std::min(audio_.GetReadyUpperBound(), video_.GetReadyUpperBound());
-    DCHECK(DecodeTimestamp() <= ready_buffer_upper_bound_);
-    DCHECK(kNoDecodeTimestamp() != ready_buffer_upper_bound_);
-  }
-
-  // Prepare each track's ready buffers for retrieval.
-  audio_.ExtractReadyBuffers(ready_buffer_upper_bound_);
-  video_.ExtractReadyBuffers(ready_buffer_upper_bound_);
-  for (TextTrackMap::iterator itr = text_track_map_.begin();
-       itr != text_track_map_.end(); ++itr) {
-    itr->second.ExtractReadyBuffers(ready_buffer_upper_bound_);
-  }
-}
-
-WebMClusterParser::Track* WebMClusterParser::FindTextTrack(int track_num) {
-  const TextTrackMap::iterator it = text_track_map_.find(track_num);
-
-  if (it == text_track_map_.end()) return NULL;
-
-  return &it->second;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_cluster_parser.h b/cobalt/media/formats/webm/webm_cluster_parser.h
deleted file mode 100644
index 798bfd8..0000000
--- a/cobalt/media/formats/webm/webm_cluster_parser.h
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_CLUSTER_PARSER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_CLUSTER_PARSER_H_
-
-#include <deque>
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/stream_parser_buffer.h"
-#include "cobalt/media/formats/webm/webm_parser.h"
-#include "cobalt/media/formats/webm/webm_tracks_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT WebMClusterParser : public WebMParserClient {
- public:
-  typedef StreamParser::TrackId TrackId;
-  typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue;
-  typedef std::map<TrackId, const BufferQueue> TextBufferQueueMap;
-
-  // Numbers chosen to estimate the duration of a buffer if none is set and
-  // there is not enough information to get a better estimate.
-  enum {
-    // Common 1k samples @44.1kHz
-    kDefaultAudioBufferDurationInMs = 23,
-
-    // Chosen to represent 16fps duration, which will prevent MSE stalls in
-    // videos with frame-rates as low as 8fps.
-    kDefaultVideoBufferDurationInMs = 63
-  };
-
-  // Opus packets encode the duration and other parameters in the 5 most
-  // significant bits of the first byte. The index in this array corresponds
-  // to the duration of each frame of the packet in microseconds. See
-  // https://tools.ietf.org/html/rfc6716#page-14
-  static const uint16_t kOpusFrameDurationsMu[];
-
- private:
-  // Helper class that manages per-track state.
-  class Track {
-   public:
-    Track(int track_num, bool is_video, base::TimeDelta default_duration,
-          const scoped_refptr<MediaLog>& media_log);
-    ~Track();
-
-    int track_num() const { return track_num_; }
-
-    // If a buffer is currently held aside pending duration calculation, returns
-    // its decode timestamp. Otherwise, returns kInfiniteDuration.
-    DecodeTimestamp GetReadyUpperBound();
-
-    // Prepares |ready_buffers_| for retrieval. Prior to calling,
-    // |ready_buffers_| must be empty. Moves all |buffers_| with decode
-    // timestamp before |before_timestamp| to |ready_buffers_|, preserving their
-    // order.
-    void ExtractReadyBuffers(const DecodeTimestamp before_timestamp);
-
-    const BufferQueue& ready_buffers() const { return ready_buffers_; }
-
-    // If |last_added_buffer_missing_duration_| is set, updates its duration
-    // relative to |buffer|'s timestamp, and adds it to |buffers_| and unsets
-    // |last_added_buffer_missing_duration_|. Then, if |buffer| is missing
-    // duration, saves |buffer| into |last_added_buffer_missing_duration_|, or
-    // otherwise adds |buffer| to |buffers_|.
-    bool AddBuffer(const scoped_refptr<StreamParserBuffer>& buffer);
-
-    // If |last_added_buffer_missing_duration_| is set, updates its duration to
-    // be non-kNoTimestamp value of |estimated_next_frame_duration_| or a
-    // hard-coded default, then adds it to |buffers_| and unsets
-    // |last_added_buffer_missing_duration_|. (This method helps stream parser
-    // emit all buffers in a media segment before signaling end of segment.)
-    void ApplyDurationEstimateIfNeeded();
-
-    // Clears |ready_buffers_| (use ExtractReadyBuffers() to fill it again).
-    // Leaves as-is |buffers_| and any possibly held-aside buffer that is
-    // missing duration.
-    void ClearReadyBuffers();
-
-    // Clears all buffer state, including any possibly held-aside buffer that
-    // was missing duration, and all contents of |buffers_| and
-    // |ready_buffers_|.
-    void Reset();
-
-    base::TimeDelta default_duration() const { return default_duration_; }
-
-   private:
-    // Helper that sanity-checks |buffer| duration, updates
-    // |estimated_next_frame_duration_|, and adds |buffer| to |buffers_|.
-    // Returns false if |buffer| failed sanity check and therefore was not added
-    // to |buffers_|. Returns true otherwise.
-    bool QueueBuffer(const scoped_refptr<StreamParserBuffer>& buffer);
-
-    // Helper that calculates the buffer duration to use in
-    // ApplyDurationEstimateIfNeeded().
-    base::TimeDelta GetDurationEstimate();
-
-    // Counts the number of estimated durations used in this track. Used to
-    // prevent log spam for MEDIA_LOG()s about estimated duration.
-    int num_duration_estimates_;
-
-    int track_num_;
-    bool is_video_;
-
-    // Parsed track buffers, each with duration and in (decode) timestamp order,
-    // that have not yet been extracted into |ready_buffers_|. Note that up to
-    // one additional buffer missing duration may be tracked by
-    // |last_added_buffer_missing_duration_|.
-    BufferQueue buffers_;
-    scoped_refptr<StreamParserBuffer> last_added_buffer_missing_duration_;
-
-    // Buffers in (decode) timestamp order that were previously parsed into and
-    // extracted from |buffers_|. Buffers are moved from |buffers_| to
-    // |ready_buffers_| by ExtractReadyBuffers() if they are below a specified
-    // upper bound timestamp. Track users can therefore extract only those
-    // parsed buffers which are "ready" for emission (all before some maximum
-    // timestamp).
-    BufferQueue ready_buffers_;
-
-    // If kNoTimestamp, then |estimated_next_frame_duration_| will be used.
-    base::TimeDelta default_duration_;
-
-    // If kNoTimestamp, then a default value will be used. This estimate is
-    // the maximum (for video), or minimum (for audio) duration seen so far for
-    // this track, and is used only if |default_duration_| is kNoTimestamp.
-    // TODO(chcunningham): Use maximum for audio too, adding checks to disable
-    // splicing when these estimates are observed in SourceBufferStream.
-    base::TimeDelta estimated_next_frame_duration_;
-
-    scoped_refptr<MediaLog> media_log_;
-  };
-
-  typedef std::map<int, Track> TextTrackMap;
-
- public:
-  WebMClusterParser(DecoderBuffer::Allocator* buffer_allocator,
-                    int64_t timecode_scale, int audio_track_num,
-                    base::TimeDelta audio_default_duration, int video_track_num,
-                    base::TimeDelta video_default_duration,
-                    const WebMTracksParser::TextTracks& text_tracks,
-                    const std::set<int64_t>& ignored_tracks,
-                    const std::string& audio_encryption_key_id,
-                    const std::string& video_encryption_key_id,
-                    const AudioCodec audio_codec,
-                    const scoped_refptr<MediaLog>& media_log);
-  ~WebMClusterParser() override;
-
-  // Resets the parser state so it can accept a new cluster.
-  void Reset();
-
-  // Parses a WebM cluster element in |buf|.
-  //
-  // Returns -1 if the parse fails.
-  // Returns 0 if more data is needed.
-  // Returns the number of bytes parsed on success.
-  int Parse(const uint8_t* buf, int size);
-
-  base::TimeDelta cluster_start_time() const { return cluster_start_time_; }
-
-  // Get the current ready buffers resulting from Parse().
-  // If the parse reached the end of cluster and the last buffer was held aside
-  // due to missing duration, the buffer is given an estimated duration and
-  // included in the result.
-  // Otherwise, if there are is a buffer held aside due to missing duration for
-  // any of the tracks, no buffers with same or greater (decode) timestamp will
-  // be included in the buffers.
-  // The returned deques are cleared by Parse() or Reset() and updated by the
-  // next calls to Get{Audio,Video}Buffers().
-  // If no Parse() or Reset() has occurred since the last call to Get{Audio,
-  // Video,Text}Buffers(), then the previous BufferQueue& is returned again
-  // without any recalculation.
-  void GetBuffers(StreamParser::BufferQueueMap* buffers);
-
-  // Constructs and returns a subset of |text_track_map_| containing only
-  // tracks with non-empty buffer queues produced by the last Parse() and
-  // filtered to exclude any buffers that have (decode) timestamp same or
-  // greater than the lowest (decode) timestamp across all tracks of any buffer
-  // held aside due to missing duration (unless the end of cluster has been
-  // reached).
-  // The returned map is cleared by Parse() or Reset() and updated by the next
-  // call to GetTextBuffers().
-  // If no Parse() or Reset() has occurred since the last call to
-  // GetTextBuffers(), then the previous TextBufferQueueMap& is returned again
-  // without any recalculation.
-  const TextBufferQueueMap& GetTextBuffers();
-
-  // Returns true if the last Parse() call stopped at the end of a cluster.
-  bool cluster_ended() const { return cluster_ended_; }
-
- private:
-  // WebMParserClient methods.
-  WebMParserClient* OnListStart(int id) override;
-  bool OnListEnd(int id) override;
-  bool OnUInt(int id, int64_t val) override;
-  bool OnBinary(int id, const uint8_t* data, int size) override;
-
-  bool ParseBlock(bool is_simple_block, const uint8_t* buf, int size,
-                  const uint8_t* additional, int additional_size, int duration,
-                  int64_t discard_padding, bool reference_block_set);
-  bool OnBlock(bool is_simple_block, int track_num, int timecode, int duration,
-               const uint8_t* data, int size, const uint8_t* additional,
-               int additional_size, int64_t discard_padding, bool is_keyframe);
-
-  // Resets the Track objects associated with each text track.
-  void ResetTextTracks();
-
-  // Clears the the ready buffers associated with each text track.
-  void ClearTextTrackReadyBuffers();
-
-  // Helper method for Get{Audio,Video,Text}Buffers() that recomputes
-  // |ready_buffer_upper_bound_| and calls ExtractReadyBuffers() on each track.
-  // If |cluster_ended_| is true, first applies duration estimate if needed for
-  // |audio_| and |video_| and sets |ready_buffer_upper_bound_| to
-  // kInfiniteDuration. Otherwise, sets |ready_buffer_upper_bound_| to the
-  // minimum upper bound across |audio_| and |video_|. (Text tracks can have no
-  // buffers missing duration, so they are not involved in calculating the upper
-  // bound.)
-  // Parse() or Reset() must be called between calls to UpdateReadyBuffers() to
-  // clear each track's ready buffers and to reset |ready_buffer_upper_bound_|
-  // to kNoDecodeTimestamp().
-  void UpdateReadyBuffers();
-
-  // Search for the indicated track_num among the text tracks.  Returns NULL
-  // if that track num is not a text track.
-  Track* FindTextTrack(int track_num);
-
-  // Attempts to read the duration from the encoded audio data, returning as
-  // TimeDelta or kNoTimestamp if duration cannot be retrieved. This obviously
-  // violates layering rules, but is useful for MSE to know duration in cases
-  // where it isn't explicitly given and cannot be calculated for Blocks at the
-  // end of a Cluster (the next Cluster in playback-order may not be the next
-  // Cluster we parse, so we can't simply use the delta of the first Block in
-  // the next Cluster). Avoid calling if encrypted; may produce unexpected
-  // output. See implementation for supported codecs.
-  base::TimeDelta TryGetEncodedAudioDuration(const uint8_t* data, int size);
-
-  // Reads Opus packet header to determine packet duration. Duration returned
-  // as TimeDelta or kNoTimestamp upon failure to read duration from packet.
-  base::TimeDelta ReadOpusDuration(const uint8_t* data, int size);
-
-  DecoderBuffer::Allocator* buffer_allocator_;
-
-  // Tracks the number of MEDIA_LOGs made in process of reading encoded
-  // duration. Useful to prevent log spam.
-  int num_duration_errors_;
-
-  double timecode_multiplier_;  // Multiplier used to convert timecodes into
-                                // microseconds.
-  std::set<int64_t> ignored_tracks_;
-  std::string audio_encryption_key_id_;
-  std::string video_encryption_key_id_;
-  const AudioCodec audio_codec_;
-
-  WebMListParser parser_;
-
-  int64_t last_block_timecode_;
-  std::unique_ptr<uint8_t[]> block_data_;
-  int block_data_size_;
-  int64_t block_duration_;
-  int64_t block_add_id_;
-
-  std::unique_ptr<uint8_t[]> block_additional_data_;
-  // Must be 0 if |block_additional_data_| is null. Must be > 0 if
-  // |block_additional_data_| is NOT null.
-  int block_additional_data_size_;
-
-  int64_t discard_padding_;
-  bool discard_padding_set_;
-
-  bool reference_block_set_;
-
-  int64_t cluster_timecode_;
-  base::TimeDelta cluster_start_time_;
-  bool cluster_ended_;
-
-  Track audio_;
-  Track video_;
-  TextTrackMap text_track_map_;
-
-  // Subset of |text_track_map_| maintained by GetTextBuffers(), and cleared by
-  // ClearTextTrackReadyBuffers(). Callers of GetTextBuffers() get a const-ref
-  // to this member.
-  TextBufferQueueMap text_buffers_map_;
-
-  // Limits the range of buffers returned by Get{Audio,Video,Text}Buffers() to
-  // this exclusive upper bound. Set to kNoDecodeTimestamp(), meaning not yet
-  // calculated, by Reset() and Parse(). If kNoDecodeTimestamp(), then
-  // Get{Audio,Video,Text}Buffers() will calculate it to be the minimum (decode)
-  // timestamp across all tracks' |last_buffer_missing_duration_|, or
-  // kInfiniteDuration if no buffers are currently missing duration.
-  DecodeTimestamp ready_buffer_upper_bound_;
-
-  scoped_refptr<MediaLog> media_log_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(WebMClusterParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_CLUSTER_PARSER_H_
diff --git a/cobalt/media/formats/webm/webm_cluster_parser_unittest.cc b/cobalt/media/formats/webm/webm_cluster_parser_unittest.cc
deleted file mode 100644
index 1191ef3..0000000
--- a/cobalt/media/formats/webm/webm_cluster_parser_unittest.cc
+++ /dev/null
@@ -1,1162 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/webm_cluster_parser.h"
-
-#include <algorithm>
-#include <cstdlib>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/webm/cluster_builder.h"
-#include "cobalt/media/formats/webm/opus_packet_builder.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::HasSubstr;
-using ::testing::InSequence;
-using ::testing::Return;
-using ::testing::StrictMock;
-using ::testing::Mock;
-using ::testing::_;
-
-namespace cobalt {
-namespace media {
-
-typedef WebMTracksParser::TextTracks TextTracks;
-
-// Matchers for verifying common media log entry strings.
-MATCHER_P(OpusPacketDurationTooHigh, actual_duration_ms, "") {
-  return CONTAINS_STRING(
-      arg, "Warning, demuxed Opus packet with encoded duration: " +
-               base::IntToString(actual_duration_ms) +
-               "ms. Should be no greater than 120ms.");
-}
-
-MATCHER_P(WebMSimpleBlockDurationEstimated, estimated_duration_ms, "") {
-  return CONTAINS_STRING(arg, "Estimating WebM block duration to be " +
-                                  base::IntToString(estimated_duration_ms) +
-                                  "ms for the last (Simple)Block in the "
-                                  "Cluster for this Track. Use BlockGroups "
-                                  "with BlockDurations at the end of each "
-                                  "Track in a Cluster to avoid estimation.");
-}
-
-MATCHER_P2(WebMBlockDurationMismatchesOpusDuration, block_duration_ms,
-           opus_duration_ms, "") {
-  return CONTAINS_STRING(
-      arg, "BlockDuration (" + base::IntToString(block_duration_ms) +
-               "ms) differs significantly from encoded duration (" +
-               base::IntToString(opus_duration_ms) + "ms).");
-}
-
-namespace {
-
-// Timecode scale for millisecond timestamps.
-const int kTimecodeScale = 1000000;
-
-const int kAudioTrackNum = 1;
-const int kVideoTrackNum = 2;
-const int kTextTrackNum = 3;
-const int kTestAudioFrameDefaultDurationInMs = 13;
-const int kTestVideoFrameDefaultDurationInMs = 17;
-
-// Test duration defaults must differ from parser estimation defaults to know
-// which durations parser used when emitting buffers.
-static_assert(
-    static_cast<int>(kTestAudioFrameDefaultDurationInMs) !=
-        static_cast<int>(WebMClusterParser::kDefaultAudioBufferDurationInMs),
-    "test default is the same as estimation fallback audio duration");
-static_assert(
-    static_cast<int>(kTestVideoFrameDefaultDurationInMs) !=
-        static_cast<int>(WebMClusterParser::kDefaultVideoBufferDurationInMs),
-    "test default is the same as estimation fallback video duration");
-
-struct BlockInfo {
-  int track_num;
-  int timestamp;
-
-  // Negative value is allowed only for block groups (not simple blocks) and
-  // directs CreateCluster() to exclude BlockDuration entry from the cluster for
-  // this BlockGroup. The absolute value is used for parser verification.
-  // For simple blocks, this value must be non-negative, and is used only for
-  // parser verification.
-  double duration;
-
-  bool use_simple_block;
-
-  // Default data will be used if no data given.
-  const uint8_t* data;
-  int data_length;
-
-  bool is_key_frame;
-};
-
-const BlockInfo kDefaultBlockInfo[] = {
-    {kAudioTrackNum, 0, 23, true, NULL, 0, true},
-    {kAudioTrackNum, 23, 23, true, NULL, 0, true},
-    // Assumes not using DefaultDuration
-    {kVideoTrackNum, 33, 34, true, NULL, 0, true},
-    {kAudioTrackNum, 46, 23, true, NULL, 0, false},
-    {kVideoTrackNum, 67, 33, false, NULL, 0, true},
-    {kAudioTrackNum, 69, 23, false, NULL, 0, false},
-    {kVideoTrackNum, 100, 33, false, NULL, 0, false},
-};
-
-const uint8_t kEncryptedFrame[] = {
-    // Block is encrypted
-    0x01,
-
-    // IV
-    0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
-
-std::unique_ptr<Cluster> CreateCluster(int timecode,
-                                       const BlockInfo* block_info,
-                                       int block_count) {
-  ClusterBuilder cb;
-  cb.SetClusterTimecode(0);
-
-  uint8_t kDefaultBlockData[] = {0x00};
-
-  for (int i = 0; i < block_count; i++) {
-    const uint8_t* data;
-    int data_length;
-    if (block_info[i].data != NULL) {
-      data = block_info[i].data;
-      data_length = block_info[i].data_length;
-    } else {
-      data = kDefaultBlockData;
-      data_length = sizeof(kDefaultBlockData);
-    }
-
-    if (block_info[i].use_simple_block) {
-      CHECK_GE(block_info[i].duration, 0);
-      cb.AddSimpleBlock(block_info[i].track_num, block_info[i].timestamp,
-                        block_info[i].is_key_frame ? 0x80 : 0x00, data,
-                        data_length);
-      continue;
-    }
-
-    if (block_info[i].duration < 0) {
-      cb.AddBlockGroupWithoutBlockDuration(
-          block_info[i].track_num, block_info[i].timestamp, 0,
-          block_info[i].is_key_frame, data, data_length);
-      continue;
-    }
-
-    cb.AddBlockGroup(block_info[i].track_num, block_info[i].timestamp,
-                     block_info[i].duration, 0, block_info[i].is_key_frame,
-                     data, data_length);
-  }
-
-  return cb.Finish();
-}
-
-// Creates a Cluster with one encrypted Block. |bytes_to_write| is number of
-// bytes of the encrypted frame to write.
-std::unique_ptr<Cluster> CreateEncryptedCluster(int bytes_to_write) {
-  CHECK_GT(bytes_to_write, 0);
-  CHECK_LE(bytes_to_write, static_cast<int>(sizeof(kEncryptedFrame)));
-
-  ClusterBuilder cb;
-  cb.SetClusterTimecode(0);
-  cb.AddSimpleBlock(kVideoTrackNum, 0, 0, kEncryptedFrame, bytes_to_write);
-  return cb.Finish();
-}
-
-bool VerifyBuffers(const StreamParser::BufferQueueMap& buffer_queue_map,
-                   const BlockInfo* block_info, int block_count) {
-  int buffer_count = 0;
-  for (const auto& it : buffer_queue_map) buffer_count += it.second.size();
-  if (block_count != buffer_count) {
-    DVLOG(1) << __FUNCTION__ << " : block_count (" << block_count
-             << ") mismatches buffer_count (" << buffer_count << ")";
-    return false;
-  }
-
-  size_t audio_offset = 0;
-  size_t video_offset = 0;
-  size_t text_offset = 0;
-  for (int i = 0; i < block_count; i++) {
-    const StreamParser::BufferQueue* buffers = NULL;
-    size_t* offset;
-    StreamParserBuffer::Type expected_type = DemuxerStream::UNKNOWN;
-
-    const auto& it = buffer_queue_map.find(block_info[i].track_num);
-    EXPECT_NE(buffer_queue_map.end(), it);
-    buffers = &it->second;
-    if (block_info[i].track_num == kAudioTrackNum) {
-      offset = &audio_offset;
-      expected_type = DemuxerStream::AUDIO;
-    } else if (block_info[i].track_num == kVideoTrackNum) {
-      offset = &video_offset;
-      expected_type = DemuxerStream::VIDEO;
-    } else if (block_info[i].track_num == kTextTrackNum) {
-      offset = &text_offset;
-      expected_type = DemuxerStream::TEXT;
-    } else {
-      LOG(ERROR) << "Unexpected track number " << block_info[i].track_num;
-      return false;
-    }
-
-    if (*offset >= buffers->size()) {
-      DVLOG(1) << __FUNCTION__ << " : Too few buffers (" << buffers->size()
-               << ") for track_num (" << block_info[i].track_num
-               << "), expected at least " << *offset + 1 << " buffers";
-      return false;
-    }
-
-    scoped_refptr<StreamParserBuffer> buffer = (*buffers)[(*offset)++];
-
-    EXPECT_EQ(block_info[i].timestamp, buffer->timestamp().InMilliseconds());
-    EXPECT_EQ(std::abs(block_info[i].duration),
-              buffer->duration().InMillisecondsF());
-    EXPECT_EQ(expected_type, buffer->type());
-    EXPECT_EQ(block_info[i].track_num, buffer->track_id());
-    EXPECT_EQ(block_info[i].is_key_frame, buffer->is_key_frame());
-  }
-
-  return true;
-}
-
-bool VerifyBuffers(const std::unique_ptr<WebMClusterParser>& parser,
-                   const BlockInfo* block_info, int block_count) {
-  StreamParser::BufferQueueMap buffers;
-  parser->GetBuffers(&buffers);
-  return VerifyBuffers(buffers, block_info, block_count);
-}
-
-bool VerifyTextBuffers(const std::unique_ptr<WebMClusterParser>& parser,
-                       const BlockInfo* block_info_ptr, int block_count,
-                       int text_track_num,
-                       const WebMClusterParser::BufferQueue& text_buffers) {
-  const BlockInfo* const block_info_end = block_info_ptr + block_count;
-
-  typedef WebMClusterParser::BufferQueue::const_iterator TextBufferIter;
-  TextBufferIter buffer_iter = text_buffers.begin();
-  const TextBufferIter buffer_end = text_buffers.end();
-
-  while (block_info_ptr != block_info_end) {
-    const BlockInfo& block_info = *block_info_ptr++;
-
-    if (block_info.track_num != text_track_num) continue;
-
-    EXPECT_FALSE(block_info.use_simple_block);
-    EXPECT_FALSE(buffer_iter == buffer_end);
-
-    const scoped_refptr<StreamParserBuffer> buffer = *buffer_iter++;
-    EXPECT_EQ(block_info.timestamp, buffer->timestamp().InMilliseconds());
-    EXPECT_EQ(std::abs(block_info.duration),
-              buffer->duration().InMillisecondsF());
-    EXPECT_EQ(DemuxerStream::TEXT, buffer->type());
-    EXPECT_EQ(text_track_num, buffer->track_id());
-  }
-
-  EXPECT_TRUE(buffer_iter == buffer_end);
-  return true;
-}
-
-void VerifyEncryptedBuffer(scoped_refptr<StreamParserBuffer> buffer) {
-  EXPECT_TRUE(buffer->decrypt_config());
-  EXPECT_EQ(static_cast<size_t>(DecryptConfig::kDecryptionKeySize),
-            buffer->decrypt_config()->iv().length());
-}
-
-void AppendToEnd(const StreamParser::BufferQueue& src,
-                 StreamParser::BufferQueue* dest) {
-  for (StreamParser::BufferQueue::const_iterator itr = src.begin();
-       itr != src.end(); ++itr) {
-    dest->push_back(*itr);
-  }
-}
-
-}  // namespace
-
-class WebMClusterParserTest : public testing::Test {
- public:
-  WebMClusterParserTest()
-      : media_log_(new StrictMock<MockMediaLog>()),
-        parser_(CreateDefaultParser()) {}
-
- protected:
-  void ResetParserToHaveDefaultDurations() {
-    base::TimeDelta default_audio_duration =
-        base::TimeDelta::FromMilliseconds(kTestAudioFrameDefaultDurationInMs);
-    base::TimeDelta default_video_duration =
-        base::TimeDelta::FromMilliseconds(kTestVideoFrameDefaultDurationInMs);
-    ASSERT_GE(default_audio_duration, base::TimeDelta());
-    ASSERT_GE(default_video_duration, base::TimeDelta());
-    ASSERT_NE(kNoTimestamp, default_audio_duration);
-    ASSERT_NE(kNoTimestamp, default_video_duration);
-
-    parser_.reset(CreateParserWithDefaultDurationsAndOptionalTextTracks(
-        default_audio_duration, default_video_duration));
-  }
-
-  // Helper that hard-codes some non-varying constructor parameters.
-  WebMClusterParser* CreateParserHelper(
-      base::TimeDelta audio_default_duration,
-      base::TimeDelta video_default_duration,
-      const WebMTracksParser::TextTracks& text_tracks,
-      const std::set<int64_t>& ignored_tracks,
-      const std::string& audio_encryption_key_id,
-      const std::string& video_encryption_key_id,
-      const AudioCodec audio_codec) {
-    return new WebMClusterParser(
-        kTimecodeScale, kAudioTrackNum, audio_default_duration, kVideoTrackNum,
-        video_default_duration, text_tracks, ignored_tracks,
-        audio_encryption_key_id, video_encryption_key_id, audio_codec,
-        media_log_);
-  }
-
-  // Create a default version of the parser for test.
-  WebMClusterParser* CreateDefaultParser() {
-    return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(),
-                              std::set<int64_t>(), std::string(), std::string(),
-                              kUnknownAudioCodec);
-  }
-
-  // Create a parser for test with custom audio and video default durations, and
-  // optionally custom text tracks.
-  WebMClusterParser* CreateParserWithDefaultDurationsAndOptionalTextTracks(
-      base::TimeDelta audio_default_duration,
-      base::TimeDelta video_default_duration,
-      const WebMTracksParser::TextTracks& text_tracks = TextTracks()) {
-    return CreateParserHelper(audio_default_duration, video_default_duration,
-                              text_tracks, std::set<int64_t>(), std::string(),
-                              std::string(), kUnknownAudioCodec);
-  }
-
-  // Create a parser for test with custom ignored tracks.
-  WebMClusterParser* CreateParserWithIgnoredTracks(
-      std::set<int64_t>& ignored_tracks) {
-    return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(),
-                              ignored_tracks, std::string(), std::string(),
-                              kUnknownAudioCodec);
-  }
-
-  // Create a parser for test with custom encryption key ids and audio codec.
-  WebMClusterParser* CreateParserWithKeyIdsAndAudioCodec(
-      const std::string& audio_encryption_key_id,
-      const std::string& video_encryption_key_id,
-      const AudioCodec audio_codec) {
-    return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(),
-                              std::set<int64_t>(), audio_encryption_key_id,
-                              video_encryption_key_id, audio_codec);
-  }
-
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-  std::unique_ptr<WebMClusterParser> parser_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(WebMClusterParserTest);
-};
-
-TEST_F(WebMClusterParserTest, HeldBackBufferHoldsBackAllTracks) {
-  // If a buffer is missing duration and is being held back, then all other
-  // tracks' buffers that have same or higher (decode) timestamp should be held
-  // back too to keep the timestamps emitted for a cluster monotonically
-  // non-decreasing and in same order as parsed.
-  InSequence s;
-
-  // Reset the parser to have 3 tracks: text, video (no default frame duration),
-  // and audio (with a default frame duration).
-  TextTracks text_tracks;
-  text_tracks.insert(
-      std::make_pair(TextTracks::key_type(kTextTrackNum),
-                     TextTrackConfig(kTextSubtitles, "", "", "")));
-  base::TimeDelta default_audio_duration =
-      base::TimeDelta::FromMilliseconds(kTestAudioFrameDefaultDurationInMs);
-  ASSERT_GE(default_audio_duration, base::TimeDelta());
-  ASSERT_NE(kNoTimestamp, default_audio_duration);
-  parser_.reset(CreateParserWithDefaultDurationsAndOptionalTextTracks(
-      default_audio_duration, kNoTimestamp, text_tracks));
-
-  const int kExpectedVideoEstimationInMs = 33;
-
-  const BlockInfo kBlockInfo[] = {
-      {kVideoTrackNum, 0, 33, true, NULL, 0, false},
-      {kAudioTrackNum, 0, 23, false, NULL, 0, false},
-      {kTextTrackNum, 10, 42, false, NULL, 0, true},
-      {kAudioTrackNum, 23, kTestAudioFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-      {kVideoTrackNum, 33, 33, true, NULL, 0, false},
-      {kAudioTrackNum, 36, kTestAudioFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-      {kVideoTrackNum, 66, kExpectedVideoEstimationInMs, true, NULL, 0, false},
-      {kAudioTrackNum, 70, kTestAudioFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-      {kAudioTrackNum, 83, kTestAudioFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-  };
-
-  const int kExpectedBuffersOnPartialCluster[] = {
-      0,  // Video simple block without DefaultDuration should be held back
-      0,  // Audio buffer ready, but not emitted because its TS >= held back
-          // video
-      0,  // Text buffer ready, but not emitted because its TS >= held back
-          // video
-      0,  // 2nd audio buffer ready, also not emitted for same reason as first
-      4,  // All previous buffers emitted, 2nd video held back with no duration
-      4,  // 2nd video still has no duration, 3rd audio ready but not emitted
-      6,  // All previous buffers emitted, 3rd video held back with no duration
-      6,  // 3rd video still has no duration, 4th audio ready but not emitted
-      9,  // Cluster end emits all buffers and 3rd video's duration is estimated
-  };
-
-  ASSERT_EQ(arraysize(kBlockInfo), arraysize(kExpectedBuffersOnPartialCluster));
-  int block_count = arraysize(kBlockInfo);
-
-  // Iteratively create a cluster containing the first N+1 blocks and parse all
-  // but the last byte of the cluster (except when N==|block_count|, just parse
-  // the whole cluster). Verify that the corresponding entry in
-  // |kExpectedBuffersOnPartialCluster| identifies the exact subset of
-  // |kBlockInfo| returned by the parser.
-  for (int i = 0; i < block_count; ++i) {
-    if (i > 0) parser_->Reset();
-    // Since we don't know exactly the offsets of each block in the full
-    // cluster, build a cluster with exactly one additional block so that
-    // parse of all but one byte should deterministically parse all but the
-    // last full block. Don't |exceed block_count| blocks though.
-    int blocks_in_cluster = std::min(i + 2, block_count);
-    std::unique_ptr<Cluster> cluster(
-        CreateCluster(0, kBlockInfo, blocks_in_cluster));
-    // Parse all but the last byte unless we need to parse the full cluster.
-    bool parse_full_cluster = i == (block_count - 1);
-
-    if (parse_full_cluster) {
-      EXPECT_MEDIA_LOG(
-          WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs));
-    }
-
-    int result = parser_->Parse(cluster->data(), parse_full_cluster
-                                                     ? cluster->size()
-                                                     : cluster->size() - 1);
-    if (parse_full_cluster) {
-      DVLOG(1) << "Verifying parse result of full cluster of "
-               << blocks_in_cluster << " blocks";
-      EXPECT_EQ(cluster->size(), result);
-    } else {
-      DVLOG(1) << "Verifying parse result of cluster of " << blocks_in_cluster
-               << " blocks with last block incomplete";
-      EXPECT_GT(cluster->size(), result);
-      EXPECT_LT(0, result);
-    }
-
-    EXPECT_TRUE(VerifyBuffers(parser_, kBlockInfo,
-                              kExpectedBuffersOnPartialCluster[i]));
-  }
-}
-
-TEST_F(WebMClusterParserTest, Reset) {
-  InSequence s;
-
-  int block_count = arraysize(kDefaultBlockInfo);
-  std::unique_ptr<Cluster> cluster(
-      CreateCluster(0, kDefaultBlockInfo, block_count));
-
-  // Send slightly less than the full cluster so all but the last block is
-  // parsed.
-  int result = parser_->Parse(cluster->data(), cluster->size() - 1);
-  EXPECT_GT(result, 0);
-  EXPECT_LT(result, cluster->size());
-
-  ASSERT_TRUE(VerifyBuffers(parser_, kDefaultBlockInfo, block_count - 1));
-  parser_->Reset();
-
-  // Now parse a whole cluster to verify that all the blocks will get parsed.
-  result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kDefaultBlockInfo, block_count));
-}
-
-TEST_F(WebMClusterParserTest, ParseClusterWithSingleCall) {
-  int block_count = arraysize(kDefaultBlockInfo);
-  std::unique_ptr<Cluster> cluster(
-      CreateCluster(0, kDefaultBlockInfo, block_count));
-
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kDefaultBlockInfo, block_count));
-}
-
-TEST_F(WebMClusterParserTest, ParseClusterWithMultipleCalls) {
-  int block_count = arraysize(kDefaultBlockInfo);
-  std::unique_ptr<Cluster> cluster(
-      CreateCluster(0, kDefaultBlockInfo, block_count));
-
-  const uint8_t* data = cluster->data();
-  int size = cluster->size();
-  int default_parse_size = 3;
-  int parse_size = std::min(default_parse_size, size);
-
-  StreamParser::BufferQueueMap buffers;
-  while (size > 0) {
-    int result = parser_->Parse(data, parse_size);
-    ASSERT_GE(result, 0);
-    ASSERT_LE(result, parse_size);
-
-    if (result == 0) {
-      // The parser needs more data so increase the parse_size a little.
-      parse_size += default_parse_size;
-      parse_size = std::min(parse_size, size);
-      continue;
-    }
-
-    StreamParser::BufferQueueMap bqm;
-    parser_->GetBuffers(&bqm);
-    for (const auto& it : bqm) {
-      AppendToEnd(it.second, &buffers[it.first]);
-    }
-
-    parse_size = default_parse_size;
-
-    data += result;
-    size -= result;
-  }
-  ASSERT_TRUE(VerifyBuffers(buffers, kDefaultBlockInfo, block_count));
-}
-
-// Verify that both BlockGroups with the BlockDuration before the Block
-// and BlockGroups with the BlockDuration after the Block are supported
-// correctly.
-// Note: Raw bytes are use here because ClusterBuilder only generates
-// one of these scenarios.
-TEST_F(WebMClusterParserTest, ParseBlockGroup) {
-  const BlockInfo kBlockInfo[] = {
-      {kAudioTrackNum, 0, 23, false, NULL, 0, true},
-      {kVideoTrackNum, 33, 34, false, NULL, 0, true},
-  };
-  int block_count = arraysize(kBlockInfo);
-
-  const uint8_t kClusterData[] = {
-      0x1F, 0x43, 0xB6, 0x75, 0x9B,  // Cluster(size=27)
-      0xE7, 0x81, 0x00,              // Timecode(size=1, value=0)
-      // BlockGroup with BlockDuration before Block.
-      0xA0, 0x8A,        // BlockGroup(size=10)
-      0x9B, 0x81, 0x17,  // BlockDuration(size=1, value=23)
-      0xA1, 0x85, 0x81, 0x00, 0x00, 0x00, 0xaa,  // Block(size=5, track=1, ts=0)
-      // BlockGroup with BlockDuration after Block.
-      0xA0, 0x8A,  // BlockGroup(size=10)
-      0xA1, 0x85, 0x82, 0x00, 0x21, 0x00,
-      0x55,              // Block(size=5, track=2, ts=33)
-      0x9B, 0x81, 0x22,  // BlockDuration(size=1, value=34)
-  };
-  const int kClusterSize = sizeof(kClusterData);
-
-  int result = parser_->Parse(kClusterData, kClusterSize);
-  EXPECT_EQ(kClusterSize, result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
-}
-
-TEST_F(WebMClusterParserTest, ParseSimpleBlockAndBlockGroupMixture) {
-  const BlockInfo kBlockInfo[] = {
-      {kAudioTrackNum, 0, 23, true, NULL, 0, false},
-      {kAudioTrackNum, 23, 23, false, NULL, 0, false},
-      {kVideoTrackNum, 33, 34, true, NULL, 0, false},
-      {kAudioTrackNum, 46, 23, false, NULL, 0, false},
-      {kVideoTrackNum, 67, 33, false, NULL, 0, false},
-  };
-  int block_count = arraysize(kBlockInfo);
-  std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
-
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
-}
-
-TEST_F(WebMClusterParserTest, IgnoredTracks) {
-  std::set<int64_t> ignored_tracks;
-  ignored_tracks.insert(kTextTrackNum);
-
-  parser_.reset(CreateParserWithIgnoredTracks(ignored_tracks));
-
-  const BlockInfo kInputBlockInfo[] = {
-      {kAudioTrackNum, 0, 23, true, NULL, 0, false},
-      {kAudioTrackNum, 23, 23, true, NULL, 0, false},
-      {kVideoTrackNum, 33, 34, true, NULL, 0, false},
-      {kTextTrackNum, 33, 99, true, NULL, 0, false},
-      {kAudioTrackNum, 46, 23, true, NULL, 0, false},
-      {kVideoTrackNum, 67, 34, true, NULL, 0, false},
-  };
-  int input_block_count = arraysize(kInputBlockInfo);
-
-  const BlockInfo kOutputBlockInfo[] = {
-      {kAudioTrackNum, 0, 23, true, NULL, 0, false},
-      {kAudioTrackNum, 23, 23, true, NULL, 0, false},
-      {kVideoTrackNum, 33, 34, true, NULL, 0, false},
-      {kAudioTrackNum, 46, 23, true, NULL, 0, false},
-      {kVideoTrackNum, 67, 34, true, NULL, 0, false},
-  };
-  int output_block_count = arraysize(kOutputBlockInfo);
-
-  std::unique_ptr<Cluster> cluster(
-      CreateCluster(0, kInputBlockInfo, input_block_count));
-
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(34));
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kOutputBlockInfo, output_block_count));
-}
-
-TEST_F(WebMClusterParserTest, ParseTextTracks) {
-  TextTracks text_tracks;
-
-  text_tracks.insert(
-      std::make_pair(TextTracks::key_type(kTextTrackNum),
-                     TextTrackConfig(kTextSubtitles, "", "", "")));
-
-  parser_.reset(CreateParserWithDefaultDurationsAndOptionalTextTracks(
-      kNoTimestamp, kNoTimestamp, text_tracks));
-
-  const BlockInfo kInputBlockInfo[] = {
-      {kAudioTrackNum, 0, 23, true, NULL, 0, false},
-      {kAudioTrackNum, 23, 23, true, NULL, 0, false},
-      {kVideoTrackNum, 33, 34, true, NULL, 0, false},
-      {kTextTrackNum, 33, 42, false, NULL, 0, true},
-      {kAudioTrackNum, 46, 23, true, NULL, 0, false},
-      {kTextTrackNum, 55, 44, false, NULL, 0, true},
-      {kVideoTrackNum, 67, 34, true, NULL, 0, false},
-  };
-  int input_block_count = arraysize(kInputBlockInfo);
-
-  std::unique_ptr<Cluster> cluster(
-      CreateCluster(0, kInputBlockInfo, input_block_count));
-
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(34));
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kInputBlockInfo, input_block_count));
-}
-
-TEST_F(WebMClusterParserTest, TextTracksSimpleBlock) {
-  TextTracks text_tracks;
-
-  text_tracks.insert(
-      std::make_pair(TextTracks::key_type(kTextTrackNum),
-                     TextTrackConfig(kTextSubtitles, "", "", "")));
-
-  parser_.reset(CreateParserWithDefaultDurationsAndOptionalTextTracks(
-      kNoTimestamp, kNoTimestamp, text_tracks));
-
-  const BlockInfo kInputBlockInfo[] = {
-      {kTextTrackNum, 33, 42, true},
-  };
-  int input_block_count = arraysize(kInputBlockInfo);
-
-  std::unique_ptr<Cluster> cluster(
-      CreateCluster(0, kInputBlockInfo, input_block_count));
-
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_LT(result, 0);
-}
-
-TEST_F(WebMClusterParserTest, ParseMultipleTextTracks) {
-  TextTracks text_tracks;
-
-  const int kSubtitleTextTrackNum = kTextTrackNum;
-  const int kCaptionTextTrackNum = kTextTrackNum + 1;
-
-  text_tracks.insert(
-      std::make_pair(TextTracks::key_type(kSubtitleTextTrackNum),
-                     TextTrackConfig(kTextSubtitles, "", "", "")));
-
-  text_tracks.insert(
-      std::make_pair(TextTracks::key_type(kCaptionTextTrackNum),
-                     TextTrackConfig(kTextCaptions, "", "", "")));
-
-  parser_.reset(CreateParserWithDefaultDurationsAndOptionalTextTracks(
-      kNoTimestamp, kNoTimestamp, text_tracks));
-
-  const BlockInfo kInputBlockInfo[] = {
-      {kAudioTrackNum, 0, 23, true, NULL, 0, false},
-      {kAudioTrackNum, 23, 23, true, NULL, 0, false},
-      {kVideoTrackNum, 33, 34, true, NULL, 0, false},
-      {kSubtitleTextTrackNum, 33, 42, false, NULL, 0, false},
-      {kAudioTrackNum, 46, 23, true, NULL, 0, false},
-      {kCaptionTextTrackNum, 55, 44, false, NULL, 0, false},
-      {kVideoTrackNum, 67, 34, true, NULL, 0, false},
-      {kSubtitleTextTrackNum, 67, 33, false, NULL, 0, false},
-  };
-  int input_block_count = arraysize(kInputBlockInfo);
-
-  std::unique_ptr<Cluster> cluster(
-      CreateCluster(0, kInputBlockInfo, input_block_count));
-
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(34));
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-
-  const WebMClusterParser::TextBufferQueueMap& text_map =
-      parser_->GetTextBuffers();
-  for (WebMClusterParser::TextBufferQueueMap::const_iterator itr =
-           text_map.begin();
-       itr != text_map.end(); ++itr) {
-    const TextTracks::const_iterator find_result = text_tracks.find(itr->first);
-    ASSERT_TRUE(find_result != text_tracks.end());
-    ASSERT_TRUE(VerifyTextBuffers(parser_, kInputBlockInfo, input_block_count,
-                                  itr->first, itr->second));
-  }
-}
-
-TEST_F(WebMClusterParserTest, ParseEncryptedBlock) {
-  std::unique_ptr<Cluster> cluster(
-      CreateEncryptedCluster(sizeof(kEncryptedFrame)));
-
-  parser_.reset(CreateParserWithKeyIdsAndAudioCodec(
-      std::string(), "video_key_id", kUnknownAudioCodec));
-
-  // The encrypted cluster contains just one block, video.
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
-      WebMClusterParser::kDefaultVideoBufferDurationInMs));
-
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  StreamParser::BufferQueueMap buffers;
-  parser_->GetBuffers(&buffers);
-  EXPECT_EQ(1UL, buffers[kVideoTrackNum].size());
-  scoped_refptr<StreamParserBuffer> buffer = buffers[kVideoTrackNum][0];
-  VerifyEncryptedBuffer(buffer);
-}
-
-TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) {
-  std::unique_ptr<Cluster> cluster(
-      CreateEncryptedCluster(sizeof(kEncryptedFrame) - 1));
-
-  parser_.reset(CreateParserWithKeyIdsAndAudioCodec(
-      std::string(), "video_key_id", kUnknownAudioCodec));
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(-1, result);
-}
-
-TEST_F(WebMClusterParserTest, ParseInvalidZeroSizedCluster) {
-  const uint8_t kBuffer[] = {
-      0x1F, 0x43, 0xB6, 0x75, 0x80,  // CLUSTER (size = 0)
-  };
-
-  EXPECT_EQ(-1, parser_->Parse(kBuffer, sizeof(kBuffer)));
-}
-
-TEST_F(WebMClusterParserTest, ParseInvalidUnknownButActuallyZeroSizedCluster) {
-  const uint8_t kBuffer[] = {
-      0x1F, 0x43, 0xB6, 0x75, 0xFF,  // CLUSTER (size = "unknown")
-      0x1F, 0x43, 0xB6, 0x75, 0x85,  // CLUSTER (size = 5)
-  };
-
-  EXPECT_EQ(-1, parser_->Parse(kBuffer, sizeof(kBuffer)));
-}
-
-TEST_F(WebMClusterParserTest, ParseInvalidTextBlockGroupWithoutDuration) {
-  // Text track frames must have explicitly specified BlockGroup BlockDurations.
-  TextTracks text_tracks;
-
-  text_tracks.insert(
-      std::make_pair(TextTracks::key_type(kTextTrackNum),
-                     TextTrackConfig(kTextSubtitles, "", "", "")));
-
-  parser_.reset(CreateParserWithDefaultDurationsAndOptionalTextTracks(
-      kNoTimestamp, kNoTimestamp, text_tracks));
-
-  const BlockInfo kBlockInfo[] = {
-      {kTextTrackNum, 33, -42, false, NULL, 0, false},
-  };
-  int block_count = arraysize(kBlockInfo);
-  std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_LT(result, 0);
-}
-
-TEST_F(WebMClusterParserTest, ParseWithDefaultDurationsSimpleBlocks) {
-  InSequence s;
-  ResetParserToHaveDefaultDurations();
-
-  EXPECT_LT(kTestAudioFrameDefaultDurationInMs, 23);
-  EXPECT_LT(kTestVideoFrameDefaultDurationInMs, 33);
-
-  const BlockInfo kBlockInfo[] = {
-      {kAudioTrackNum, 0, kTestAudioFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-      {kAudioTrackNum, 23, kTestAudioFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-      {kVideoTrackNum, 33, kTestVideoFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-      {kAudioTrackNum, 46, kTestAudioFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-      {kVideoTrackNum, 67, kTestVideoFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-      {kAudioTrackNum, 69, kTestAudioFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-      {kVideoTrackNum, 100, kTestVideoFrameDefaultDurationInMs, true, NULL, 0,
-       false},
-  };
-
-  int block_count = arraysize(kBlockInfo);
-  std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
-
-  // Send slightly less than the full cluster so all but the last block is
-  // parsed. Though all the blocks are simple blocks, none should be held aside
-  // for duration estimation prior to end of cluster detection because all the
-  // tracks have DefaultDurations.
-  int result = parser_->Parse(cluster->data(), cluster->size() - 1);
-  EXPECT_GT(result, 0);
-  EXPECT_LT(result, cluster->size());
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count - 1));
-
-  parser_->Reset();
-
-  // Now parse a whole cluster to verify that all the blocks will get parsed.
-  result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
-}
-
-TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsSimpleBlocks) {
-  InSequence s;
-
-  // Absent DefaultDuration information, SimpleBlock durations are derived from
-  // inter-buffer track timestamp delta if within the cluster. Duration for the
-  // last block in a cluster is estimated independently for each track in the
-  // cluster. For video tracks we use the maximum seen so far. For audio we use
-  // the the minimum.
-  // TODO(chcunningham): Move audio over to use the maximum.
-
-  const int kExpectedAudioEstimationInMs = 22;
-  const int kExpectedVideoEstimationInMs = 34;
-  const BlockInfo kBlockInfo1[] = {
-      {kAudioTrackNum, 0, 23, true, NULL, 0, false},
-      {kAudioTrackNum, 23, 22, true, NULL, 0, false},
-      {kVideoTrackNum, 33, 33, true, NULL, 0, false},
-      {kAudioTrackNum, 45, 23, true, NULL, 0, false},
-      {kVideoTrackNum, 66, 34, true, NULL, 0, false},
-      {kAudioTrackNum, 68, kExpectedAudioEstimationInMs, true, NULL, 0, false},
-      {kVideoTrackNum, 100, kExpectedVideoEstimationInMs, true, NULL, 0, false},
-  };
-
-  int block_count1 = arraysize(kBlockInfo1);
-  std::unique_ptr<Cluster> cluster1(
-      CreateCluster(0, kBlockInfo1, block_count1));
-
-  // Send slightly less than the first full cluster so all but the last video
-  // block is parsed. Verify the last fully parsed audio and video buffer are
-  // both missing from the result (parser should hold them aside for duration
-  // estimation prior to end of cluster detection in the absence of
-  // DefaultDurations.)
-  int result = parser_->Parse(cluster1->data(), cluster1->size() - 1);
-  EXPECT_GT(result, 0);
-  EXPECT_LT(result, cluster1->size());
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1 - 3));
-  StreamParser::BufferQueueMap buffers;
-  parser_->GetBuffers(&buffers);
-  EXPECT_EQ(3UL, buffers[kAudioTrackNum].size());
-  EXPECT_EQ(1UL, buffers[kVideoTrackNum].size());
-
-  parser_->Reset();
-
-  // Now parse the full first cluster and verify all the blocks are parsed.
-  EXPECT_MEDIA_LOG(
-      WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs));
-  EXPECT_MEDIA_LOG(
-      WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs));
-  result = parser_->Parse(cluster1->data(), cluster1->size());
-  EXPECT_EQ(cluster1->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1));
-
-  // Verify that the estimated frame duration is tracked across clusters for
-  // each track.
-  const BlockInfo kBlockInfo2[] = {
-      // Estimate carries over across clusters
-      {kAudioTrackNum, 200, kExpectedAudioEstimationInMs, true, NULL, 0, false},
-      // Estimate carries over across clusters
-      {kVideoTrackNum, 201, kExpectedVideoEstimationInMs, true, NULL, 0, false},
-  };
-
-  int block_count2 = arraysize(kBlockInfo2);
-  std::unique_ptr<Cluster> cluster2(
-      CreateCluster(0, kBlockInfo2, block_count2));
-  EXPECT_MEDIA_LOG(
-      WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs));
-  EXPECT_MEDIA_LOG(
-      WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs));
-  result = parser_->Parse(cluster2->data(), cluster2->size());
-  EXPECT_EQ(cluster2->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo2, block_count2));
-}
-
-TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsBlockGroups) {
-  InSequence s;
-
-  // Absent DefaultDuration and BlockDuration information, BlockGroup block
-  // durations are derived from inter-buffer track timestamp delta if within the
-  // cluster. Duration for the last block in a cluster is estimated
-  // independently for each track in the cluster. For video tracks we use the
-  // maximum seen so far. For audio we use the the minimum.
-  // TODO(chcunningham): Move audio over to use the maximum.
-
-  const int kExpectedAudioEstimationInMs = 22;
-  const int kExpectedVideoEstimationInMs = 34;
-  const BlockInfo kBlockInfo1[] = {
-      {kAudioTrackNum, 0, -23, false, NULL, 0, false},
-      {kAudioTrackNum, 23, -22, false, NULL, 0, false},
-      {kVideoTrackNum, 33, -33, false, NULL, 0, false},
-      {kAudioTrackNum, 45, -23, false, NULL, 0, false},
-      {kVideoTrackNum, 66, -34, false, NULL, 0, false},
-      {kAudioTrackNum, 68, -kExpectedAudioEstimationInMs, false, NULL, 0,
-       false},
-      {kVideoTrackNum, 100, -kExpectedVideoEstimationInMs, false, NULL, 0,
-       false},
-  };
-
-  int block_count1 = arraysize(kBlockInfo1);
-  std::unique_ptr<Cluster> cluster1(
-      CreateCluster(0, kBlockInfo1, block_count1));
-
-  // Send slightly less than the first full cluster so all but the last video
-  // block is parsed. Verify the last fully parsed audio and video buffer are
-  // both missing from the result (parser should hold them aside for duration
-  // estimation prior to end of cluster detection in the absence of
-  // DefaultDurations.)
-  int result = parser_->Parse(cluster1->data(), cluster1->size() - 1);
-  EXPECT_GT(result, 0);
-  EXPECT_LT(result, cluster1->size());
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1 - 3));
-  StreamParser::BufferQueueMap buffers;
-  parser_->GetBuffers(&buffers);
-  EXPECT_EQ(3UL, buffers[kAudioTrackNum].size());
-  EXPECT_EQ(1UL, buffers[kVideoTrackNum].size());
-
-  parser_->Reset();
-
-  // Now parse the full first cluster and verify all the blocks are parsed.
-  EXPECT_MEDIA_LOG(
-      WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs));
-  EXPECT_MEDIA_LOG(
-      WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs));
-  result = parser_->Parse(cluster1->data(), cluster1->size());
-  EXPECT_EQ(cluster1->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1));
-
-  // Verify that the estimated frame duration is tracked across clusters for
-  // each track.
-  const BlockInfo kBlockInfo2[] = {
-      {kAudioTrackNum, 200, -kExpectedAudioEstimationInMs, false, NULL, 0,
-       false},
-      {kVideoTrackNum, 201, -kExpectedVideoEstimationInMs, false, NULL, 0,
-       false},
-  };
-
-  int block_count2 = arraysize(kBlockInfo2);
-  std::unique_ptr<Cluster> cluster2(
-      CreateCluster(0, kBlockInfo2, block_count2));
-  EXPECT_MEDIA_LOG(
-      WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs));
-  EXPECT_MEDIA_LOG(
-      WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs));
-  result = parser_->Parse(cluster2->data(), cluster2->size());
-  EXPECT_EQ(cluster2->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo2, block_count2));
-}
-
-// TODO(wolenetz): Is parser behavior correct? See http://crbug.com/363433.
-TEST_F(WebMClusterParserTest,
-       ParseWithDefaultDurationsBlockGroupsWithoutDurations) {
-  InSequence s;
-  ResetParserToHaveDefaultDurations();
-
-  EXPECT_LT(kTestAudioFrameDefaultDurationInMs, 23);
-  EXPECT_LT(kTestVideoFrameDefaultDurationInMs, 33);
-
-  const BlockInfo kBlockInfo[] = {
-      {kAudioTrackNum, 0, -kTestAudioFrameDefaultDurationInMs, false, NULL, 0,
-       false},
-      {kAudioTrackNum, 23, -kTestAudioFrameDefaultDurationInMs, false, NULL, 0,
-       false},
-      {kVideoTrackNum, 33, -kTestVideoFrameDefaultDurationInMs, false, NULL, 0,
-       false},
-      {kAudioTrackNum, 46, -kTestAudioFrameDefaultDurationInMs, false, NULL, 0,
-       false},
-      {kVideoTrackNum, 67, -kTestVideoFrameDefaultDurationInMs, false, NULL, 0,
-       false},
-      {kAudioTrackNum, 69, -kTestAudioFrameDefaultDurationInMs, false, NULL, 0,
-       false},
-      {kVideoTrackNum, 100, -kTestVideoFrameDefaultDurationInMs, false, NULL, 0,
-       false},
-  };
-
-  int block_count = arraysize(kBlockInfo);
-  std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
-
-  // Send slightly less than the full cluster so all but the last block is
-  // parsed. None should be held aside for duration estimation prior to end of
-  // cluster detection because all the tracks have DefaultDurations.
-  int result = parser_->Parse(cluster->data(), cluster->size() - 1);
-  EXPECT_GT(result, 0);
-  EXPECT_LT(result, cluster->size());
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count - 1));
-
-  parser_->Reset();
-
-  // Now parse a whole cluster to verify that all the blocks will get parsed.
-  result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
-}
-
-TEST_F(WebMClusterParserTest,
-       ParseDegenerateClusterYieldsHardcodedEstimatedDurations) {
-  const BlockInfo kBlockInfo[] = {
-      {kAudioTrackNum, 0, WebMClusterParser::kDefaultAudioBufferDurationInMs,
-       true},
-      {kVideoTrackNum, 0, WebMClusterParser::kDefaultVideoBufferDurationInMs,
-       true},
-  };
-
-  int block_count = arraysize(kBlockInfo);
-  std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
-      WebMClusterParser::kDefaultAudioBufferDurationInMs));
-  EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
-      WebMClusterParser::kDefaultVideoBufferDurationInMs));
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
-}
-
-TEST_F(WebMClusterParserTest,
-       ParseDegenerateClusterWithDefaultDurationsYieldsDefaultDurations) {
-  ResetParserToHaveDefaultDurations();
-
-  const BlockInfo kBlockInfo[] = {
-      {kAudioTrackNum, 0, kTestAudioFrameDefaultDurationInMs, true},
-      {kVideoTrackNum, 0, kTestVideoFrameDefaultDurationInMs, true},
-  };
-
-  int block_count = arraysize(kBlockInfo);
-  std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
-}
-
-TEST_F(WebMClusterParserTest, ReadOpusDurationsSimpleBlockAtEndOfCluster) {
-  int loop_count = 0;
-  for (const auto* packet_ptr : BuildAllOpusPackets()) {
-    InSequence s;
-
-    // Get a new parser each iteration to prevent exceeding the media log cap.
-    parser_.reset(CreateParserWithKeyIdsAndAudioCodec(
-        std::string(), std::string(), kCodecOpus));
-
-    const BlockInfo kBlockInfo[] = {{kAudioTrackNum, 0,
-                                     packet_ptr->duration_ms(),
-                                     true,  // Make it a SimpleBlock.
-                                     packet_ptr->data(), packet_ptr->size()}};
-
-    int block_count = arraysize(kBlockInfo);
-    std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
-    int duration_ms = packet_ptr->duration_ms();  // Casts from double.
-    if (duration_ms > 120) {
-      EXPECT_MEDIA_LOG(OpusPacketDurationTooHigh(duration_ms));
-    }
-
-    int result = parser_->Parse(cluster->data(), cluster->size());
-    EXPECT_EQ(cluster->size(), result);
-    ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
-
-    // Fail early if any iteration fails to meet the logging expectations.
-    ASSERT_TRUE(Mock::VerifyAndClearExpectations(media_log_.get()));
-
-    loop_count++;
-  }
-
-  // Test should minimally cover all the combinations of config and frame count.
-  ASSERT_GE(loop_count, kNumPossibleOpusConfigs * kMaxOpusPacketFrameCount);
-}
-
-TEST_F(WebMClusterParserTest, PreferOpusDurationsOverBlockDurations) {
-  int loop_count = 0;
-  for (const auto* packet_ptr : BuildAllOpusPackets()) {
-    InSequence s;
-
-    // Get a new parser each iteration to prevent exceeding the media log cap.
-    parser_.reset(CreateParserWithKeyIdsAndAudioCodec(
-        std::string(), std::string(), kCodecOpus));
-
-    // Setting BlockDuration != Opus duration to see which one the parser uses.
-    int block_duration_ms = packet_ptr->duration_ms() + 10;
-    if (packet_ptr->duration_ms() > 120) {
-      EXPECT_MEDIA_LOG(OpusPacketDurationTooHigh(packet_ptr->duration_ms()));
-    }
-
-    EXPECT_MEDIA_LOG(WebMBlockDurationMismatchesOpusDuration(
-        block_duration_ms, packet_ptr->duration_ms()));
-
-    BlockInfo block_infos[] = {{kAudioTrackNum, 0, block_duration_ms,
-                                false,  // Not a SimpleBlock.
-                                packet_ptr->data(), packet_ptr->size()}};
-
-    int block_count = arraysize(block_infos);
-    std::unique_ptr<Cluster> cluster(
-        CreateCluster(0, block_infos, block_count));
-    int result = parser_->Parse(cluster->data(), cluster->size());
-    EXPECT_EQ(cluster->size(), result);
-
-    // BlockInfo duration will be used to verify buffer duration, so changing
-    // duration to be that of the Opus packet to verify it was preferred.
-    block_infos[0].duration = packet_ptr->duration_ms();
-
-    ASSERT_TRUE(VerifyBuffers(parser_, block_infos, block_count));
-
-    // Fail early if any iteration fails to meet the logging expectations.
-    ASSERT_TRUE(Mock::VerifyAndClearExpectations(media_log_.get()));
-
-    loop_count++;
-  }
-
-  // Test should minimally cover all the combinations of config and frame count.
-  ASSERT_GE(loop_count, kNumPossibleOpusConfigs * kMaxOpusPacketFrameCount);
-}
-
-// Tests that BlockDuration is used to set duration on buffer rather than
-// encoded duration in Opus packet (or hard coded duration estimates). Encoded
-// Opus duration is usually preferred but cannot be known when encrypted.
-TEST_F(WebMClusterParserTest, DontReadEncodedDurationWhenEncrypted) {
-  // Non-empty dummy value signals encryption is active for audio.
-  std::string audio_encryption_id("audio_key_id");
-
-  // Reset parser to expect Opus codec audio and use audio encryption key id.
-  parser_.reset(CreateParserWithKeyIdsAndAudioCodec(audio_encryption_id,
-                                                    std::string(), kCodecOpus));
-
-  // Single Block with BlockDuration and encrypted data.
-  const BlockInfo kBlockInfo[] = {{kAudioTrackNum, 0,
-                                   kTestAudioFrameDefaultDurationInMs,
-                                   false,            // Not a SimpleBlock
-                                   kEncryptedFrame,  // Encrypted frame data
-                                   arraysize(kEncryptedFrame)}};
-
-  int block_count = arraysize(kBlockInfo);
-  std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
-  int result = parser_->Parse(cluster->data(), cluster->size());
-  EXPECT_EQ(cluster->size(), result);
-
-  // Will verify that duration of buffer matches that of BlockDuration.
-  ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_colour_parser.cc b/cobalt/media/formats/webm/webm_colour_parser.cc
deleted file mode 100644
index 955b6b8..0000000
--- a/cobalt/media/formats/webm/webm_colour_parser.cc
+++ /dev/null
@@ -1,537 +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 "cobalt/media/formats/webm/webm_colour_parser.h"
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-
-namespace cobalt {
-namespace media {
-
-// The definitions below are copied from the current libwebm top-of-tree.
-// Chromium's third_party/libwebm doesn't have these yet. We can probably just
-// include libwebm header directly in the future.
-// ---- Begin copy/paste from libwebm/webm_parser/include/webm/dom_types.h ----
-
-/**
- A parsed \WebMID{MatrixCoefficients} element.
-
- Matroska/WebM adopted these values from Table 4 of ISO/IEC 23001-8:2013/DCOR1.
- See that document for further details.
- */
-enum MatrixCoefficient {
-  /**
-   The identity matrix.
-
-   Typically used for GBR (often referred to as RGB); however, may also be used
-   for YZX (often referred to as XYZ).
-   */
-  kMatrixCoefficientRgb = 0,
-
-  /**
-   Rec. ITU-R BT.709-5.
-   */
-  kMatrixCoefficientBt709 = 1,
-
-  /**
-   Image characteristics are unknown or are determined by the application.
-   */
-  kMatrixCoefficientUnspecified = 2,
-
-  /**
-   United States Federal Communications Commission Title 47 Code of Federal
-   Regulations (2003) 73.682 (a) (20).
-   */
-  kMatrixCoefficientFcc = 4,
-
-  /**
-   Rec. ITU-R BT.470‑6 System B, G (historical).
-   */
-  kMatrixCoefficientBt470Bg = 5,
-
-  /**
-   Society of Motion Picture and Television Engineers 170M (2004).
-   */
-  kMatrixCoefficientSmpte170M = 6,
-
-  /**
-   Society of Motion Picture and Television Engineers 240M (1999).
-   */
-  kMatrixCoefficientSmpte240M = 7,
-
-  /**
-   YCgCo.
-   */
-  kMatrixCoefficientYCgCo = 8,
-
-  /**
-   Rec. ITU-R BT.2020 (non-constant luminance).
-   */
-  kMatrixCoefficientBt2020NonconstantLuminance = 9,
-
-  /**
-   Rec. ITU-R BT.2020 (constant luminance).
-   */
-  kMatrixCoefficientBt2020ConstantLuminance = 10,
-};
-
-/**
- A parsed \WebMID{Range} element.
- */
-enum Range {
-  /**
-   Unspecified.
-   */
-  kRangeUnspecified = 0,
-
-  /**
-   Broadcast range.
-   */
-  kRangeBroadcast = 1,
-
-  /**
-   Full range (no clipping).
-   */
-  kRangeFull = 2,
-
-  /**
-   Defined by MatrixCoefficient/TransferCharacteristic.
-   */
-  kRangeDerived = 3,
-};
-
-/**
- A parsed \WebMID{TransferCharacteristic} element.
-
- Matroska/WebM adopted these values from Table 3 of ISO/IEC 23001-8:2013/DCOR1.
- See that document for further details.
- */
-enum TransferCharacteristic {
-  /**
-   Rec. ITU-R BT.709-6.
-   */
-  kTransferCharacteristicBt709 = 1,
-
-  /**
-   Image characteristics are unknown or are determined by the application.
-   */
-  kTransferCharacteristicUnspecified = 2,
-
-  /**
-   Rec. ITU‑R BT.470‑6 System M (historical) with assumed display gamma 2.2.
-   */
-  kTransferCharacteristicGamma22curve = 4,
-
-  /**
-   Rec. ITU‑R BT.470-6 System B, G (historical) with assumed display gamma 2.8.
-   */
-  kTransferCharacteristicGamma28curve = 5,
-
-  /**
-   Society of Motion Picture and Television Engineers 170M (2004).
-   */
-  kTransferCharacteristicSmpte170M = 6,
-
-  /**
-   Society of Motion Picture and Television Engineers 240M (1999).
-   */
-  kTransferCharacteristicSmpte240M = 7,
-
-  /**
-   Linear transfer characteristics.
-   */
-  kTransferCharacteristicLinear = 8,
-
-  /**
-   Logarithmic transfer characteristic (100:1 range).
-   */
-  kTransferCharacteristicLog = 9,
-
-  /**
-   Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range).
-   */
-  kTransferCharacteristicLogSqrt = 10,
-
-  /**
-   IEC 61966-2-4.
-   */
-  kTransferCharacteristicIec6196624 = 11,
-
-  /**
-   Rec. ITU‑R BT.1361-0 extended colour gamut system (historical).
-   */
-  kTransferCharacteristicBt1361ExtendedColourGamut = 12,
-
-  /**
-   IEC 61966-2-1 sRGB or sYCC.
-   */
-  kTransferCharacteristicIec6196621 = 13,
-
-  /**
-   Rec. ITU-R BT.2020-2 (10-bit system).
-   */
-  kTransferCharacteristic10BitBt2020 = 14,
-
-  /**
-   Rec. ITU-R BT.2020-2 (12-bit system).
-   */
-  kTransferCharacteristic12BitBt2020 = 15,
-
-  /**
-   Society of Motion Picture and Television Engineers ST 2084.
-   */
-  kTransferCharacteristicSmpteSt2084 = 16,
-
-  /**
-   Society of Motion Picture and Television Engineers ST 428-1.
-   */
-  kTransferCharacteristicSmpteSt4281 = 17,
-
-  /**
-   Association of Radio Industries and Businesses (ARIB) STD-B67.
-   */
-  kTransferCharacteristicAribStdB67Hlg = 18,
-};
-
-/**
- A parsed \WebMID{Primaries} element.
-
- Matroska/WebM adopted these values from Table 2 of ISO/IEC 23001-8:2013/DCOR1.
- See that document for further details.
- */
-enum Primary {
-  /**
-   Rec. ITU‑R BT.709-6.
-   */
-  kPrimaryBt709 = 1,
-
-  /**
-   Image characteristics are unknown or are determined by the application.
-   */
-  kPrimaryUnspecified = 2,
-
-  /**
-   Rec. ITU‑R BT.470‑6 System M (historical).
-   */
-  kPrimaryBt470M = 4,
-
-  /**
-   Rec. ITU‑R BT.470‑6 System B, G (historical).
-   */
-  kPrimaryBt470Bg = 5,
-
-  /**
-   Society of Motion Picture and Television Engineers 170M (2004).
-   */
-  kPrimarySmpte170M = 6,
-
-  /**
-   Society of Motion Picture and Television Engineers 240M (1999).
-   */
-  kPrimarySmpte240M = 7,
-
-  /**
-   Generic film.
-   */
-  kPrimaryFilm = 8,
-
-  /**
-   Rec. ITU-R BT.2020-2.
-   */
-  kPrimaryBt2020 = 9,
-
-  /**
-   Society of Motion Picture and Television Engineers ST 428-1.
-   */
-  kPrimarySmpteSt4281 = 10,
-
-  /**
-   JEDEC P22 phosphors/EBU Tech. 3213-E (1975).
-   */
-  kPrimaryJedecP22Phosphors = 22,
-};
-
-// ---- End copy/paste from libwebm/webm_parser/include/webm/dom_types.h ----
-
-// Ensure that libwebm enum values match enums in gfx::ColorSpace.
-#define STATIC_ASSERT_ENUM(a, b)                                              \
-  COMPILE_ASSERT(static_cast<int>(a) == static_cast<int>(gfx::ColorSpace::b), \
-                 mismatching_enums)
-
-STATIC_ASSERT_ENUM(kMatrixCoefficientRgb, kMatrixIdRgb);
-STATIC_ASSERT_ENUM(kMatrixCoefficientBt709, kMatrixIdBt709);
-STATIC_ASSERT_ENUM(kMatrixCoefficientUnspecified, kMatrixIdUnspecified);
-STATIC_ASSERT_ENUM(kMatrixCoefficientFcc, kMatrixIdFcc);
-STATIC_ASSERT_ENUM(kMatrixCoefficientBt470Bg, kMatrixIdBt470Bg);
-STATIC_ASSERT_ENUM(kMatrixCoefficientSmpte170M, kMatrixIdSmpte170M);
-STATIC_ASSERT_ENUM(kMatrixCoefficientSmpte240M, kMatrixIdSmpte240M);
-STATIC_ASSERT_ENUM(kMatrixCoefficientYCgCo, kMatrixIdYCgCo);
-STATIC_ASSERT_ENUM(kMatrixCoefficientBt2020NonconstantLuminance,
-                   kMatrixIdBt2020NonconstantLuminance);
-STATIC_ASSERT_ENUM(kMatrixCoefficientBt2020ConstantLuminance,
-                   kMatrixIdBt2020ConstantLuminance);
-
-gfx::ColorSpace::MatrixID FromWebMMatrixCoefficient(MatrixCoefficient c) {
-  return static_cast<gfx::ColorSpace::MatrixID>(c);
-}
-
-STATIC_ASSERT_ENUM(kRangeUnspecified, kRangeIdUnspecified);
-STATIC_ASSERT_ENUM(kRangeBroadcast, kRangeIdLimited);
-STATIC_ASSERT_ENUM(kRangeFull, kRangeIdFull);
-STATIC_ASSERT_ENUM(kRangeDerived, kRangeIdDerived);
-
-gfx::ColorSpace::RangeID FromWebMRange(Range range) {
-  return static_cast<gfx::ColorSpace::RangeID>(range);
-}
-
-STATIC_ASSERT_ENUM(kTransferCharacteristicBt709, kTransferIdBt709);
-STATIC_ASSERT_ENUM(kTransferCharacteristicUnspecified, kTransferIdUnspecified);
-STATIC_ASSERT_ENUM(kTransferCharacteristicGamma22curve, kTransferIdGamma22);
-STATIC_ASSERT_ENUM(kTransferCharacteristicGamma28curve, kTransferIdGamma28);
-STATIC_ASSERT_ENUM(kTransferCharacteristicSmpte170M, kTransferIdSmpte170M);
-STATIC_ASSERT_ENUM(kTransferCharacteristicSmpte240M, kTransferIdSmpte240M);
-STATIC_ASSERT_ENUM(kTransferCharacteristicLinear, kTransferIdLinear);
-STATIC_ASSERT_ENUM(kTransferCharacteristicLog, kTransferIdLog);
-STATIC_ASSERT_ENUM(kTransferCharacteristicLogSqrt, kTransferIdLogSqrt);
-STATIC_ASSERT_ENUM(kTransferCharacteristicIec6196624, kTransferIdIec6196624);
-STATIC_ASSERT_ENUM(kTransferCharacteristicBt1361ExtendedColourGamut,
-                   kTransferIdBt1361Ecg);
-STATIC_ASSERT_ENUM(kTransferCharacteristicIec6196621, kTransferIdIec6196621);
-STATIC_ASSERT_ENUM(kTransferCharacteristic10BitBt2020, kTransferId10BitBt2020);
-STATIC_ASSERT_ENUM(kTransferCharacteristic12BitBt2020, kTransferId12BitBt2020);
-STATIC_ASSERT_ENUM(kTransferCharacteristicSmpteSt2084, kTransferIdSmpteSt2084);
-STATIC_ASSERT_ENUM(kTransferCharacteristicSmpteSt4281, kTransferIdSmpteSt4281);
-STATIC_ASSERT_ENUM(kTransferCharacteristicAribStdB67Hlg, kTransferIdAribStdB67);
-
-gfx::ColorSpace::TransferID FromWebMTransferCharacteristic(
-    TransferCharacteristic tc) {
-  return static_cast<gfx::ColorSpace::TransferID>(tc);
-}
-
-STATIC_ASSERT_ENUM(kPrimaryBt709, kPrimaryIdBt709);
-STATIC_ASSERT_ENUM(kPrimaryUnspecified, kPrimaryIdUnspecified);
-STATIC_ASSERT_ENUM(kPrimaryBt470M, kPrimaryIdBt470M);
-STATIC_ASSERT_ENUM(kPrimaryBt470Bg, kPrimaryIdBt470Bg);
-STATIC_ASSERT_ENUM(kPrimarySmpte170M, kPrimaryIdSmpte170M);
-STATIC_ASSERT_ENUM(kPrimarySmpte240M, kPrimaryIdSmpte240M);
-STATIC_ASSERT_ENUM(kPrimaryFilm, kPrimaryIdFilm);
-STATIC_ASSERT_ENUM(kPrimaryBt2020, kPrimaryIdBt2020);
-STATIC_ASSERT_ENUM(kPrimarySmpteSt4281, kPrimaryIdSmpteSt4281);
-
-gfx::ColorSpace::PrimaryID FromWebMPrimary(Primary primary) {
-  return static_cast<gfx::ColorSpace::PrimaryID>(primary);
-}
-
-WebMColorMetadata::WebMColorMetadata()
-    : BitsPerChannel(0),
-      ChromaSubsamplingHorz(0),
-      ChromaSubsamplingVert(0),
-      CbSubsamplingHorz(0),
-      CbSubsamplingVert(0),
-      ChromaSitingHorz(0),
-      ChromaSitingVert(0) {}
-
-bool WebMColorMetadata::operator==(const WebMColorMetadata& rhs) const {
-  return (BitsPerChannel == rhs.BitsPerChannel &&
-          ChromaSubsamplingHorz == rhs.ChromaSubsamplingHorz &&
-          ChromaSubsamplingVert == rhs.ChromaSubsamplingVert &&
-          CbSubsamplingHorz == rhs.CbSubsamplingHorz &&
-          CbSubsamplingVert == rhs.CbSubsamplingVert &&
-          ChromaSitingHorz == rhs.ChromaSitingHorz &&
-          ChromaSitingVert == rhs.ChromaSitingVert &&
-          color_space == rhs.color_space && hdr_metadata == rhs.hdr_metadata);
-}
-
-WebMMasteringMetadataParser::WebMMasteringMetadataParser() {}
-WebMMasteringMetadataParser::~WebMMasteringMetadataParser() {}
-
-bool WebMMasteringMetadataParser::OnFloat(int id, double val) {
-  switch (id) {
-    case kWebMIdPrimaryRChromaticityX:
-      mastering_metadata_.primary_r_chromaticity_x = val;
-      break;
-    case kWebMIdPrimaryRChromaticityY:
-      mastering_metadata_.primary_r_chromaticity_y = val;
-      break;
-    case kWebMIdPrimaryGChromaticityX:
-      mastering_metadata_.primary_g_chromaticity_x = val;
-      break;
-    case kWebMIdPrimaryGChromaticityY:
-      mastering_metadata_.primary_g_chromaticity_y = val;
-      break;
-    case kWebMIdPrimaryBChromaticityX:
-      mastering_metadata_.primary_b_chromaticity_x = val;
-      break;
-    case kWebMIdPrimaryBChromaticityY:
-      mastering_metadata_.primary_b_chromaticity_y = val;
-      break;
-    case kWebMIdWhitePointChromaticityX:
-      mastering_metadata_.white_point_chromaticity_x = val;
-      break;
-    case kWebMIdWhitePointChromaticityY:
-      mastering_metadata_.white_point_chromaticity_y = val;
-      break;
-    case kWebMIdLuminanceMax:
-      mastering_metadata_.luminance_max = val;
-      break;
-    case kWebMIdLuminanceMin:
-      mastering_metadata_.luminance_min = val;
-      break;
-    default:
-      DVLOG(1) << "Unexpected id in MasteringMetadata: 0x" << std::hex << id;
-      return false;
-  }
-  return true;
-}
-
-WebMColourParser::WebMColourParser() : mastering_metadata_parsed_(false) {
-  Reset();
-}
-
-WebMColourParser::~WebMColourParser() {}
-
-void WebMColourParser::Reset() {
-  matrix_coefficients_ = -1;
-  bits_per_channel_ = -1;
-  chroma_subsampling_horz_ = -1;
-  chroma_subsampling_vert_ = -1;
-  cb_subsampling_horz_ = -1;
-  cb_subsampling_vert_ = -1;
-  chroma_siting_horz_ = -1;
-  chroma_siting_vert_ = -1;
-  range_ = -1;
-  transfer_characteristics_ = -1;
-  primaries_ = -1;
-  max_cll_ = -1;
-  max_fall_ = -1;
-}
-
-WebMParserClient* WebMColourParser::OnListStart(int id) {
-  if (id == kWebMIdMasteringMetadata) {
-    mastering_metadata_parsed_ = false;
-    return &mastering_metadata_parser_;
-  }
-
-  return this;
-}
-
-bool WebMColourParser::OnListEnd(int id) {
-  if (id == kWebMIdMasteringMetadata) mastering_metadata_parsed_ = true;
-  return true;
-}
-
-bool WebMColourParser::OnUInt(int id, int64_t val) {
-  int64_t* dst = NULL;
-
-  switch (id) {
-    case kWebMIdMatrixCoefficients:
-      dst = &matrix_coefficients_;
-      break;
-    case kWebMIdBitsPerChannel:
-      dst = &bits_per_channel_;
-      break;
-    case kWebMIdChromaSubsamplingHorz:
-      dst = &chroma_subsampling_horz_;
-      break;
-    case kWebMIdChromaSubsamplingVert:
-      dst = &chroma_subsampling_vert_;
-      break;
-    case kWebMIdCbSubsamplingHorz:
-      dst = &cb_subsampling_horz_;
-      break;
-    case kWebMIdCbSubsamplingVert:
-      dst = &cb_subsampling_vert_;
-      break;
-    case kWebMIdChromaSitingHorz:
-      dst = &chroma_siting_horz_;
-      break;
-    case kWebMIdChromaSitingVert:
-      dst = &chroma_siting_vert_;
-      break;
-    case kWebMIdRange:
-      dst = &range_;
-      break;
-    case kWebMIdTransferCharacteristics:
-      dst = &transfer_characteristics_;
-      break;
-    case kWebMIdPrimaries:
-      dst = &primaries_;
-      break;
-    case kWebMIdMaxCLL:
-      dst = &max_cll_;
-      break;
-    case kWebMIdMaxFALL:
-      dst = &max_fall_;
-      break;
-    default:
-      return true;
-  }
-
-  DCHECK(dst);
-  if (*dst != -1) {
-    LOG(ERROR) << "Multiple values for id " << std::hex << id << " specified ("
-               << *dst << " and " << val << ")";
-    return false;
-  }
-
-  *dst = val;
-  return true;
-}
-
-WebMColorMetadata WebMColourParser::GetWebMColorMetadata() const {
-  WebMColorMetadata color_metadata;
-
-  if (bits_per_channel_ != -1)
-    color_metadata.BitsPerChannel = bits_per_channel_;
-
-  if (chroma_subsampling_horz_ != -1)
-    color_metadata.ChromaSubsamplingHorz = chroma_subsampling_horz_;
-  if (chroma_subsampling_vert_ != -1)
-    color_metadata.ChromaSubsamplingVert = chroma_subsampling_vert_;
-  if (cb_subsampling_horz_ != -1)
-    color_metadata.CbSubsamplingHorz = cb_subsampling_horz_;
-  if (cb_subsampling_vert_ != -1)
-    color_metadata.CbSubsamplingVert = cb_subsampling_vert_;
-  if (chroma_siting_horz_ != -1)
-    color_metadata.ChromaSitingHorz = chroma_siting_horz_;
-  if (chroma_siting_vert_ != -1)
-    color_metadata.ChromaSitingVert = chroma_siting_vert_;
-
-  gfx::ColorSpace::MatrixID matrix_id = gfx::ColorSpace::kMatrixIdUnspecified;
-  if (matrix_coefficients_ != -1)
-    matrix_id = FromWebMMatrixCoefficient(
-        static_cast<MatrixCoefficient>(matrix_coefficients_));
-
-  gfx::ColorSpace::RangeID range_id = gfx::ColorSpace::kRangeIdUnspecified;
-  if (range_ != -1) range_id = FromWebMRange(static_cast<Range>(range_));
-
-  gfx::ColorSpace::TransferID transfer_id =
-      gfx::ColorSpace::kTransferIdUnspecified;
-  if (transfer_characteristics_ != -1)
-    transfer_id = FromWebMTransferCharacteristic(
-        static_cast<TransferCharacteristic>(transfer_characteristics_));
-
-  gfx::ColorSpace::PrimaryID primary_id =
-      gfx::ColorSpace::kPrimaryIdUnspecified;
-  if (primaries_ != -1)
-    primary_id = FromWebMPrimary(static_cast<Primary>(primaries_));
-
-  color_metadata.color_space =
-      gfx::ColorSpace(primary_id, transfer_id, matrix_id, range_id);
-
-  if (max_cll_ != -1) color_metadata.hdr_metadata.max_cll = max_cll_;
-
-  if (max_fall_ != -1) color_metadata.hdr_metadata.max_fall = max_fall_;
-
-  if (mastering_metadata_parsed_)
-    color_metadata.hdr_metadata.mastering_metadata =
-        mastering_metadata_parser_.GetMasteringMetadata();
-
-  return color_metadata;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_colour_parser.h b/cobalt/media/formats/webm/webm_colour_parser.h
deleted file mode 100644
index ec18fd2..0000000
--- a/cobalt/media/formats/webm/webm_colour_parser.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 COBALT_MEDIA_FORMATS_WEBM_WEBM_COLOUR_PARSER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_COLOUR_PARSER_H_
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "cobalt/media/base/color_space.h"
-#include "cobalt/media/base/hdr_metadata.h"
-#include "cobalt/media/formats/webm/webm_parser.h"
-
-namespace cobalt {
-namespace media {
-
-// WebM color information, containing HDR metadata:
-// http://www.webmproject.org/docs/container/#Colour
-struct MEDIA_EXPORT WebMColorMetadata {
-  unsigned BitsPerChannel;
-  unsigned ChromaSubsamplingHorz;
-  unsigned ChromaSubsamplingVert;
-  unsigned CbSubsamplingHorz;
-  unsigned CbSubsamplingVert;
-  unsigned ChromaSitingHorz;
-  unsigned ChromaSitingVert;
-
-  gfx::ColorSpace color_space;
-
-  HDRMetadata hdr_metadata;
-
-  WebMColorMetadata();
-  bool operator==(const WebMColorMetadata& rhs) const;
-};
-
-// Parser for WebM MasteringMetadata within Colour element:
-// http://www.webmproject.org/docs/container/#MasteringMetadata
-class WebMMasteringMetadataParser : public WebMParserClient {
- public:
-  WebMMasteringMetadataParser();
-  ~WebMMasteringMetadataParser() override;
-
-  MasteringMetadata GetMasteringMetadata() const { return mastering_metadata_; }
-
- private:
-  // WebMParserClient implementation.
-  bool OnFloat(int id, double val) override;
-
-  MasteringMetadata mastering_metadata_;
-  DISALLOW_COPY_AND_ASSIGN(WebMMasteringMetadataParser);
-};
-
-// Parser for WebM Colour element:
-// http://www.webmproject.org/docs/container/#colour
-class WebMColourParser : public WebMParserClient {
- public:
-  WebMColourParser();
-  ~WebMColourParser() override;
-
-  void Reset();
-
-  WebMColorMetadata GetWebMColorMetadata() const;
-
- private:
-  // WebMParserClient implementation.
-  WebMParserClient* OnListStart(int id) override;
-  bool OnListEnd(int id) override;
-  bool OnUInt(int id, int64_t val) override;
-
-  int64_t matrix_coefficients_;
-  int64_t bits_per_channel_;
-  int64_t chroma_subsampling_horz_;
-  int64_t chroma_subsampling_vert_;
-  int64_t cb_subsampling_horz_;
-  int64_t cb_subsampling_vert_;
-  int64_t chroma_siting_horz_;
-  int64_t chroma_siting_vert_;
-  int64_t range_;
-  int64_t transfer_characteristics_;
-  int64_t primaries_;
-  int64_t max_cll_;
-  int64_t max_fall_;
-
-  WebMMasteringMetadataParser mastering_metadata_parser_;
-  bool mastering_metadata_parsed_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebMColourParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_COLOUR_PARSER_H_
diff --git a/cobalt/media/formats/webm/webm_constants.cc b/cobalt/media/formats/webm/webm_constants.cc
deleted file mode 100644
index 8908353..0000000
--- a/cobalt/media/formats/webm/webm_constants.cc
+++ /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.
-
-#include "cobalt/media/formats/webm/webm_constants.h"
-
-namespace cobalt {
-namespace media {
-
-const char kWebMCodecSubtitles[] = "D_WEBVTT/SUBTITLES";
-const char kWebMCodecCaptions[] = "D_WEBVTT/CAPTIONS";
-const char kWebMCodecDescriptions[] = "D_WEBVTT/DESCRIPTIONS";
-const char kWebMCodecMetadata[] = "D_WEBVTT/METADATA";
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_constants.h b/cobalt/media/formats/webm/webm_constants.h
deleted file mode 100644
index 03eeb62..0000000
--- a/cobalt/media/formats/webm/webm_constants.h
+++ /dev/null
@@ -1,265 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_CONSTANTS_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_CONSTANTS_H_
-
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// WebM element IDs.
-// This is a subset of the IDs in the Matroska spec.
-// http://www.matroska.org/technical/specs/index.html
-const int kWebMIdAESSettingsCipherMode = 0x47E8;
-const int kWebMIdAlphaMode = 0x53C0;
-const int kWebMIdAspectRatioType = 0x54B3;
-const int kWebMIdAttachedFile = 0x61A7;
-const int kWebMIdAttachmentLink = 0x7446;
-const int kWebMIdAttachments = 0x1941A469;
-const int kWebMIdAudio = 0xE1;
-const int kWebMIdBitDepth = 0x6264;
-const int kWebMIdBitsPerChannel = 0x55B2;
-const int kWebMIdBlock = 0xA1;
-const int kWebMIdBlockAddID = 0xEE;
-const int kWebMIdBlockAdditions = 0x75A1;
-const int kWebMIdBlockAdditional = 0xA5;
-const int kWebMIdBlockDuration = 0x9B;
-const int kWebMIdBlockGroup = 0xA0;
-const int kWebMIdBlockMore = 0xA6;
-const int kWebMIdCbSubsamplingHorz = 0x55B5;
-const int kWebMIdCbSubsamplingVert = 0x55B6;
-const int kWebMIdChannels = 0x9F;
-const int kWebMIdChapCountry = 0x437E;
-const int kWebMIdChapLanguage = 0x437C;
-const int kWebMIdChapProcess = 0x6944;
-const int kWebMIdChapProcessCodecID = 0x6955;
-const int kWebMIdChapProcessCommand = 0x6911;
-const int kWebMIdChapProcessData = 0x6933;
-const int kWebMIdChapProcessPrivate = 0x450D;
-const int kWebMIdChapProcessTime = 0x6922;
-const int kWebMIdChapString = 0x85;
-const int kWebMIdChapterAtom = 0xB6;
-const int kWebMIdChapterDisplay = 0x80;
-const int kWebMIdChapterFlagEnabled = 0x4598;
-const int kWebMIdChapterFlagHidden = 0x98;
-const int kWebMIdChapterPhysicalEquiv = 0x63C3;
-const int kWebMIdChapters = 0x1043A770;
-const int kWebMIdChapterSegmentEditionUID = 0x6EBC;
-const int kWebMIdChapterSegmentUID = 0x6E67;
-const int kWebMIdChapterTimeEnd = 0x92;
-const int kWebMIdChapterTimeStart = 0x91;
-const int kWebMIdChapterTrack = 0x8F;
-const int kWebMIdChapterTrackNumber = 0x89;
-const int kWebMIdChapterTranslate = 0x6924;
-const int kWebMIdChapterTranslateCodec = 0x69BF;
-const int kWebMIdChapterTranslateEditionUID = 0x69FC;
-const int kWebMIdChapterTranslateID = 0x69A5;
-const int kWebMIdChapterUID = 0x73C4;
-const int kWebMIdChromaSitingHorz = 0x55B7;
-const int kWebMIdChromaSitingVert = 0x55B8;
-const int kWebMIdChromaSubsamplingHorz = 0x55B3;
-const int kWebMIdChromaSubsamplingVert = 0x55B4;
-const int kWebMIdCluster = 0x1F43B675;
-const int kWebMIdCodecDecodeAll = 0xAA;
-const int kWebMIdCodecDelay = 0x56AA;
-const int kWebMIdCodecID = 0x86;
-const int kWebMIdCodecName = 0x258688;
-const int kWebMIdCodecPrivate = 0x63A2;
-const int kWebMIdCodecState = 0xA4;
-const int kWebMIdColorSpace = 0x2EB524;
-const int kWebMIdColour = 0x55B0;
-const int kWebMIdContentCompAlgo = 0x4254;
-const int kWebMIdContentCompression = 0x5034;
-const int kWebMIdContentCompSettings = 0x4255;
-const int kWebMIdContentEncAESSettings = 0x47E7;
-const int kWebMIdContentEncAlgo = 0x47E1;
-const int kWebMIdContentEncKeyID = 0x47E2;
-const int kWebMIdContentEncoding = 0x6240;
-const int kWebMIdContentEncodingOrder = 0x5031;
-const int kWebMIdContentEncodings = 0x6D80;
-const int kWebMIdContentEncodingScope = 0x5032;
-const int kWebMIdContentEncodingType = 0x5033;
-const int kWebMIdContentEncryption = 0x5035;
-const int kWebMIdContentSigAlgo = 0x47E5;
-const int kWebMIdContentSigHashAlgo = 0x47E6;
-const int kWebMIdContentSigKeyID = 0x47E4;
-const int kWebMIdContentSignature = 0x47E3;
-const int kWebMIdCRC32 = 0xBF;
-const int kWebMIdCueBlockNumber = 0x5378;
-const int kWebMIdCueClusterPosition = 0xF1;
-const int kWebMIdCueCodecState = 0xEA;
-const int kWebMIdCuePoint = 0xBB;
-const int kWebMIdCueReference = 0xDB;
-const int kWebMIdCueRefTime = 0x96;
-const int kWebMIdCues = 0x1C53BB6B;
-const int kWebMIdCueTime = 0xB3;
-const int kWebMIdCueTrack = 0xF7;
-const int kWebMIdCueTrackPositions = 0xB7;
-const int kWebMIdDateUTC = 0x4461;
-const int kWebMIdDefaultDuration = 0x23E383;
-const int kWebMIdDiscardPadding = 0x75A2;
-const int kWebMIdDisplayHeight = 0x54BA;
-const int kWebMIdDisplayUnit = 0x54B2;
-const int kWebMIdDisplayWidth = 0x54B0;
-const int kWebMIdDocType = 0x4282;
-const int kWebMIdDocTypeReadVersion = 0x4285;
-const int kWebMIdDocTypeVersion = 0x4287;
-const int kWebMIdDuration = 0x4489;
-const int kWebMIdEBMLHeader = 0x1A45DFA3;
-const int kWebMIdEBMLMaxIDLength = 0x42F2;
-const int kWebMIdEBMLMaxSizeLength = 0x42F3;
-const int kWebMIdEBMLReadVersion = 0x42F7;
-const int kWebMIdEBMLVersion = 0x4286;
-const int kWebMIdEditionEntry = 0x45B9;
-const int kWebMIdEditionFlagDefault = 0x45DB;
-const int kWebMIdEditionFlagHidden = 0x45BD;
-const int kWebMIdEditionFlagOrdered = 0x45DD;
-const int kWebMIdEditionUID = 0x45BC;
-const int kWebMIdFileData = 0x465C;
-const int kWebMIdFileDescription = 0x467E;
-const int kWebMIdFileMimeType = 0x4660;
-const int kWebMIdFileName = 0x466E;
-const int kWebMIdFileUID = 0x46AE;
-const int kWebMIdFlagDefault = 0x88;
-const int kWebMIdFlagEnabled = 0xB9;
-const int kWebMIdFlagForced = 0x55AA;
-const int kWebMIdFlagInterlaced = 0x9A;
-const int kWebMIdFlagLacing = 0x9C;
-const int kWebMIdFrameRate = 0x2383E3;
-const int kWebMIdInfo = 0x1549A966;
-const int kWebMIdJoinBlocks = 0xE9;
-const int kWebMIdLaceNumber = 0xCC;
-const int kWebMIdLanguage = 0x22B59C;
-const int kWebMIdLuminanceMax = 0x55D9;
-const int kWebMIdLuminanceMin = 0x55DA;
-const int kWebMIdMasteringMetadata = 0x55D0;
-const int kWebMIdMatrixCoefficients = 0x55B1;
-const int kWebMIdMaxBlockAdditionId = 0x55EE;
-const int kWebMIdMaxCache = 0x6DF8;
-const int kWebMIdMaxCLL = 0x55BC;
-const int kWebMIdMaxFALL = 0x55BD;
-const int kWebMIdMinCache = 0x6DE7;
-const int kWebMIdMuxingApp = 0x4D80;
-const int kWebMIdName = 0x536E;
-const int kWebMIdNextFilename = 0x3E83BB;
-const int kWebMIdNextUID = 0x3EB923;
-const int kWebMIdOutputSamplingFrequency = 0x78B5;
-const int kWebMIdPixelCropBottom = 0x54AA;
-const int kWebMIdPixelCropLeft = 0x54CC;
-const int kWebMIdPixelCropRight = 0x54DD;
-const int kWebMIdPixelCropTop = 0x54BB;
-const int kWebMIdPixelHeight = 0xBA;
-const int kWebMIdPixelWidth = 0xB0;
-const int kWebMIdPosition = 0xA7;
-const int kWebMIdPrevFilename = 0x3C83AB;
-const int kWebMIdPrevSize = 0xAB;
-const int kWebMIdPrevUID = 0x3CB923;
-const int kWebMIdPrimaries = 0x55BB;
-const int kWebMIdPrimaryBChromaticityX = 0x55D5;
-const int kWebMIdPrimaryBChromaticityY = 0x55D6;
-const int kWebMIdPrimaryGChromaticityX = 0x55D3;
-const int kWebMIdPrimaryGChromaticityY = 0x55D4;
-const int kWebMIdPrimaryRChromaticityX = 0x55D1;
-const int kWebMIdPrimaryRChromaticityY = 0x55D2;
-const int kWebMIdProjection = 0x7670;
-const int kWebMIdProjectionPosePitch = 0x7674;
-const int kWebMIdProjectionPoseRoll = 0x7675;
-const int kWebMIdProjectionPoseYaw = 0x7673;
-const int kWebMIdProjectionPrivate = 0x7672;
-const int kWebMIdProjectionType = 0x7671;
-const int kWebMIdRange = 0x55B9;
-const int kWebMIdReferenceBlock = 0xFB;
-const int kWebMIdReferencePriority = 0xFA;
-const int kWebMIdSamplingFrequency = 0xB5;
-const int kWebMIdSeek = 0x4DBB;
-const int kWebMIdSeekHead = 0x114D9B74;
-const int kWebMIdSeekID = 0x53AB;
-const int kWebMIdSeekPosition = 0x53AC;
-const int kWebMIdSeekPreRoll = 0x56BB;
-const int kWebMIdSegment = 0x18538067;
-const int kWebMIdSegmentFamily = 0x4444;
-const int kWebMIdSegmentFilename = 0x7384;
-const int kWebMIdSegmentUID = 0x73A4;
-const int kWebMIdSilentTrackNumber = 0x58D7;
-const int kWebMIdSilentTracks = 0x5854;
-const int kWebMIdSimpleBlock = 0xA3;
-const int kWebMIdSimpleTag = 0x67C8;
-const int kWebMIdSlices = 0x8E;
-const int kWebMIdStereoMode = 0x53B8;
-const int kWebMIdTag = 0x7373;
-const int kWebMIdTagAttachmentUID = 0x63C6;
-const int kWebMIdTagBinary = 0x4485;
-const int kWebMIdTagChapterUID = 0x63C4;
-const int kWebMIdTagDefault = 0x4484;
-const int kWebMIdTagEditionUID = 0x63C9;
-const int kWebMIdTagLanguage = 0x447A;
-const int kWebMIdTagName = 0x45A3;
-const int kWebMIdTags = 0x1254C367;
-const int kWebMIdTagString = 0x4487;
-const int kWebMIdTagTrackUID = 0x63C5;
-const int kWebMIdTargets = 0x63C0;
-const int kWebMIdTargetType = 0x63CA;
-const int kWebMIdTargetTypeValue = 0x68CA;
-const int kWebMIdTimecode = 0xE7;
-const int kWebMIdTimecodeScale = 0x2AD7B1;
-const int kWebMIdTimeSlice = 0xE8;
-const int kWebMIdTitle = 0x7BA9;
-const int kWebMIdTrackCombinePlanes = 0xE3;
-const int kWebMIdTrackEntry = 0xAE;
-const int kWebMIdTrackJoinUID = 0xED;
-const int kWebMIdTrackNumber = 0xD7;
-const int kWebMIdTrackOperation = 0xE2;
-const int kWebMIdTrackOverlay = 0x6FAB;
-const int kWebMIdTrackPlane = 0xE4;
-const int kWebMIdTrackPlaneType = 0xE6;
-const int kWebMIdTrackPlaneUID = 0xE5;
-const int kWebMIdTracks = 0x1654AE6B;
-const int kWebMIdTrackTimecodeScale = 0x23314F;
-const int kWebMIdTrackTranslate = 0x6624;
-const int kWebMIdTrackTranslateCodec = 0x66BF;
-const int kWebMIdTrackTranslateEditionUID = 0x66FC;
-const int kWebMIdTrackTranslateTrackID = 0x66A5;
-const int kWebMIdTrackType = 0x83;
-const int kWebMIdTrackUID = 0x73C5;
-const int kWebMIdTransferCharacteristics = 0x55BA;
-const int kWebMIdVideo = 0xE0;
-const int kWebMIdVoid = 0xEC;
-const int kWebMIdWhitePointChromaticityX = 0x55D7;
-const int kWebMIdWhitePointChromaticityY = 0x55D8;
-const int kWebMIdWritingApp = 0x5741;
-
-const int64_t kWebMReservedId = 0x1FFFFFFF;
-const int64_t kWebMUnknownSize = 0x00FFFFFFFFFFFFFFLL;
-
-const uint8_t kWebMFlagKeyframe = 0x80;
-
-// Current encrypted WebM request for comments specification is here
-// http://wiki.webmproject.org/encryption/webm-encryption-rfc
-const uint8_t kWebMFlagEncryptedFrame = 0x1;
-const uint8_t kWebMFlagEncryptedFramePartitioned = 0x2;
-const int kWebMIvSize = 8;
-const int kWebMSignalByteSize = 1;
-const int kWebMEncryptedFrameNumPartitionsSize = 1;
-const int kWebMEncryptedFramePartitionOffsetSize = 4;
-
-// Current specification for WebVTT embedded in WebM
-// http://wiki.webmproject.org/webm-metadata/temporal-metadata/webvtt-in-webm
-
-const int kWebMTrackTypeVideo = 1;
-const int kWebMTrackTypeAudio = 2;
-const int kWebMTrackTypeSubtitlesOrCaptions = 0x11;
-const int kWebMTrackTypeDescriptionsOrMetadata = 0x21;
-
-MEDIA_EXPORT extern const char kWebMCodecSubtitles[];
-MEDIA_EXPORT extern const char kWebMCodecCaptions[];
-MEDIA_EXPORT extern const char kWebMCodecDescriptions[];
-MEDIA_EXPORT extern const char kWebMCodecMetadata[];
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_CONSTANTS_H_
diff --git a/cobalt/media/formats/webm/webm_content_encodings.cc b/cobalt/media/formats/webm/webm_content_encodings.cc
deleted file mode 100644
index ff4af41..0000000
--- a/cobalt/media/formats/webm/webm_content_encodings.cc
+++ /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.
-
-#include "cobalt/media/formats/webm/webm_content_encodings.h"
-#include "base/logging.h"
-
-namespace cobalt {
-namespace media {
-
-ContentEncoding::ContentEncoding()
-    : order_(kOrderInvalid),
-      scope_(kScopeInvalid),
-      type_(kTypeInvalid),
-      encryption_algo_(kEncAlgoInvalid),
-      cipher_mode_(kCipherModeInvalid) {}
-
-ContentEncoding::~ContentEncoding() {}
-
-void ContentEncoding::SetEncryptionKeyId(const uint8_t* encryption_key_id,
-                                         int size) {
-  DCHECK(encryption_key_id);
-  DCHECK_GT(size, 0);
-  encryption_key_id_.assign(reinterpret_cast<const char*>(encryption_key_id),
-                            size);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_content_encodings.h b/cobalt/media/formats/webm/webm_content_encodings.h
deleted file mode 100644
index 68e16c5..0000000
--- a/cobalt/media/formats/webm/webm_content_encodings.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 COBALT_MEDIA_FORMATS_WEBM_WEBM_CONTENT_ENCODINGS_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_CONTENT_ENCODINGS_H_
-
-#include <memory>
-#include <string>
-
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT ContentEncoding {
- public:
-  // The following enum definitions are based on the ContentEncoding element
-  // specified in the Matroska spec.
-
-  static const int kOrderInvalid = -1;
-
-  enum Scope {
-    kScopeInvalid = 0,
-    kScopeAllFrameContents = 1,
-    kScopeTrackPrivateData = 2,
-    kScopeNextContentEncodingData = 4,
-    kScopeMax = 7,
-  };
-
-  enum Type {
-    kTypeInvalid = -1,
-    kTypeCompression = 0,
-    kTypeEncryption = 1,
-  };
-
-  enum EncryptionAlgo {
-    kEncAlgoInvalid = -1,
-    kEncAlgoNotEncrypted = 0,
-    kEncAlgoDes = 1,
-    kEncAlgo3des = 2,
-    kEncAlgoTwofish = 3,
-    kEncAlgoBlowfish = 4,
-    kEncAlgoAes = 5,
-  };
-
-  enum CipherMode {
-    kCipherModeInvalid = 0,
-    kCipherModeCtr = 1,
-  };
-
-  ContentEncoding();
-  ~ContentEncoding();
-
-  int64_t order() const { return order_; }
-  void set_order(int64_t order) { order_ = order; }
-
-  Scope scope() const { return scope_; }
-  void set_scope(Scope scope) { scope_ = scope; }
-
-  Type type() const { return type_; }
-  void set_type(Type type) { type_ = type; }
-
-  EncryptionAlgo encryption_algo() const { return encryption_algo_; }
-  void set_encryption_algo(EncryptionAlgo encryption_algo) {
-    encryption_algo_ = encryption_algo;
-  }
-
-  const std::string& encryption_key_id() const { return encryption_key_id_; }
-  void SetEncryptionKeyId(const uint8_t* encryption_key_id, int size);
-
-  CipherMode cipher_mode() const { return cipher_mode_; }
-  void set_cipher_mode(CipherMode mode) { cipher_mode_ = mode; }
-
- private:
-  int64_t order_;
-  Scope scope_;
-  Type type_;
-  EncryptionAlgo encryption_algo_;
-  std::string encryption_key_id_;
-  CipherMode cipher_mode_;
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_CONTENT_ENCODINGS_H_
diff --git a/cobalt/media/formats/webm/webm_content_encodings_client.cc b/cobalt/media/formats/webm/webm_content_encodings_client.cc
deleted file mode 100644
index 1a387ad..0000000
--- a/cobalt/media/formats/webm/webm_content_encodings_client.cc
+++ /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.
-
-#include "cobalt/media/formats/webm/webm_content_encodings_client.h"
-
-#include "base/logging.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-
-namespace cobalt {
-namespace media {
-
-WebMContentEncodingsClient::WebMContentEncodingsClient(
-    const scoped_refptr<MediaLog>& media_log)
-    : media_log_(media_log),
-      content_encryption_encountered_(false),
-      content_encodings_ready_(false) {}
-
-WebMContentEncodingsClient::~WebMContentEncodingsClient() {}
-
-const ContentEncodings& WebMContentEncodingsClient::content_encodings() const {
-  DCHECK(content_encodings_ready_);
-  return content_encodings_;
-}
-
-WebMParserClient* WebMContentEncodingsClient::OnListStart(int id) {
-  if (id == kWebMIdContentEncodings) {
-    DCHECK(!cur_content_encoding_.get());
-    DCHECK(!content_encryption_encountered_);
-    content_encodings_.clear();
-    content_encodings_ready_ = false;
-    return this;
-  }
-
-  if (id == kWebMIdContentEncoding) {
-    DCHECK(!cur_content_encoding_.get());
-    DCHECK(!content_encryption_encountered_);
-    cur_content_encoding_.reset(new ContentEncoding());
-    return this;
-  }
-
-  if (id == kWebMIdContentEncryption) {
-    DCHECK(cur_content_encoding_.get());
-    if (content_encryption_encountered_) {
-      MEDIA_LOG(ERROR, media_log_) << "Unexpected multiple ContentEncryption.";
-      return NULL;
-    }
-    content_encryption_encountered_ = true;
-    return this;
-  }
-
-  if (id == kWebMIdContentEncAESSettings) {
-    DCHECK(cur_content_encoding_.get());
-    return this;
-  }
-
-  // This should not happen if WebMListParser is working properly.
-  DCHECK(false);
-  return NULL;
-}
-
-// Mandatory occurrence restriction is checked in this function. Multiple
-// occurrence restriction is checked in OnUInt and OnBinary.
-bool WebMContentEncodingsClient::OnListEnd(int id) {
-  if (id == kWebMIdContentEncodings) {
-    // ContentEncoding element is mandatory. Check this!
-    if (content_encodings_.empty()) {
-      MEDIA_LOG(ERROR, media_log_) << "Missing ContentEncoding.";
-      return false;
-    }
-    content_encodings_ready_ = true;
-    return true;
-  }
-
-  if (id == kWebMIdContentEncoding) {
-    DCHECK(cur_content_encoding_.get());
-
-    //
-    // Specify default values to missing mandatory elements.
-    //
-
-    if (cur_content_encoding_->order() == ContentEncoding::kOrderInvalid) {
-      // Default value of encoding order is 0, which should only be used on the
-      // first ContentEncoding.
-      if (!content_encodings_.empty()) {
-        MEDIA_LOG(ERROR, media_log_) << "Missing ContentEncodingOrder.";
-        return false;
-      }
-      cur_content_encoding_->set_order(0);
-    }
-
-    if (cur_content_encoding_->scope() == ContentEncoding::kScopeInvalid)
-      cur_content_encoding_->set_scope(ContentEncoding::kScopeAllFrameContents);
-
-    if (cur_content_encoding_->type() == ContentEncoding::kTypeInvalid)
-      cur_content_encoding_->set_type(ContentEncoding::kTypeCompression);
-
-    // Check for elements valid in spec but not supported for now.
-    if (cur_content_encoding_->type() == ContentEncoding::kTypeCompression) {
-      MEDIA_LOG(ERROR, media_log_) << "ContentCompression not supported.";
-      return false;
-    }
-
-    // Enforce mandatory elements without default values.
-    DCHECK(cur_content_encoding_->type() == ContentEncoding::kTypeEncryption);
-    if (!content_encryption_encountered_) {
-      MEDIA_LOG(ERROR, media_log_) << "ContentEncodingType is encryption but"
-                                   << " ContentEncryption is missing.";
-      return false;
-    }
-
-    content_encodings_.push_back(*cur_content_encoding_);
-    content_encryption_encountered_ = false;
-    return true;
-  }
-
-  if (id == kWebMIdContentEncryption) {
-    DCHECK(cur_content_encoding_.get());
-    // Specify default value for elements that are not present.
-    if (cur_content_encoding_->encryption_algo() ==
-        ContentEncoding::kEncAlgoInvalid) {
-      cur_content_encoding_->set_encryption_algo(
-          ContentEncoding::kEncAlgoNotEncrypted);
-    }
-    return true;
-  }
-
-  if (id == kWebMIdContentEncAESSettings) {
-    if (cur_content_encoding_->cipher_mode() ==
-        ContentEncoding::kCipherModeInvalid)
-      cur_content_encoding_->set_cipher_mode(ContentEncoding::kCipherModeCtr);
-    return true;
-  }
-
-  // This should not happen if WebMListParser is working properly.
-  DCHECK(false);
-  return false;
-}
-
-// Multiple occurrence restriction and range are checked in this function.
-// Mandatory occurrence restriction is checked in OnListEnd.
-bool WebMContentEncodingsClient::OnUInt(int id, int64_t val) {
-  DCHECK(cur_content_encoding_.get());
-
-  if (id == kWebMIdContentEncodingOrder) {
-    if (cur_content_encoding_->order() != ContentEncoding::kOrderInvalid) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unexpected multiple ContentEncodingOrder.";
-      return false;
-    }
-
-    if (val != static_cast<int64_t>(content_encodings_.size())) {
-      // According to the spec, encoding order starts with 0 and counts upwards.
-      MEDIA_LOG(ERROR, media_log_) << "Unexpected ContentEncodingOrder.";
-      return false;
-    }
-
-    cur_content_encoding_->set_order(val);
-    return true;
-  }
-
-  if (id == kWebMIdContentEncodingScope) {
-    if (cur_content_encoding_->scope() != ContentEncoding::kScopeInvalid) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unexpected multiple ContentEncodingScope.";
-      return false;
-    }
-
-    if (val == ContentEncoding::kScopeInvalid ||
-        val > ContentEncoding::kScopeMax) {
-      MEDIA_LOG(ERROR, media_log_) << "Unexpected ContentEncodingScope.";
-      return false;
-    }
-
-    if (val & ContentEncoding::kScopeNextContentEncodingData) {
-      MEDIA_LOG(ERROR, media_log_) << "Encoded next ContentEncoding is not "
-                                      "supported.";
-      return false;
-    }
-
-    cur_content_encoding_->set_scope(static_cast<ContentEncoding::Scope>(val));
-    return true;
-  }
-
-  if (id == kWebMIdContentEncodingType) {
-    if (cur_content_encoding_->type() != ContentEncoding::kTypeInvalid) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unexpected multiple ContentEncodingType.";
-      return false;
-    }
-
-    if (val == ContentEncoding::kTypeCompression) {
-      MEDIA_LOG(ERROR, media_log_) << "ContentCompression not supported.";
-      return false;
-    }
-
-    if (val != ContentEncoding::kTypeEncryption) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unexpected ContentEncodingType " << val << ".";
-      return false;
-    }
-
-    cur_content_encoding_->set_type(static_cast<ContentEncoding::Type>(val));
-    return true;
-  }
-
-  if (id == kWebMIdContentEncAlgo) {
-    if (cur_content_encoding_->encryption_algo() !=
-        ContentEncoding::kEncAlgoInvalid) {
-      MEDIA_LOG(ERROR, media_log_) << "Unexpected multiple ContentEncAlgo.";
-      return false;
-    }
-
-    if (val < ContentEncoding::kEncAlgoNotEncrypted ||
-        val > ContentEncoding::kEncAlgoAes) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unexpected ContentEncAlgo " << val << ".";
-      return false;
-    }
-
-    cur_content_encoding_->set_encryption_algo(
-        static_cast<ContentEncoding::EncryptionAlgo>(val));
-    return true;
-  }
-
-  if (id == kWebMIdAESSettingsCipherMode) {
-    if (cur_content_encoding_->cipher_mode() !=
-        ContentEncoding::kCipherModeInvalid) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unexpected multiple AESSettingsCipherMode.";
-      return false;
-    }
-
-    if (val != ContentEncoding::kCipherModeCtr) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unexpected AESSettingsCipherMode " << val << ".";
-      return false;
-    }
-
-    cur_content_encoding_->set_cipher_mode(
-        static_cast<ContentEncoding::CipherMode>(val));
-    return true;
-  }
-
-  // This should not happen if WebMListParser is working properly.
-  DCHECK(false);
-  return false;
-}
-
-// Multiple occurrence restriction is checked in this function.  Mandatory
-// restriction is checked in OnListEnd.
-bool WebMContentEncodingsClient::OnBinary(int id, const uint8_t* data,
-                                          int size) {
-  DCHECK(cur_content_encoding_.get());
-  DCHECK(data);
-  DCHECK_GT(size, 0);
-
-  if (id == kWebMIdContentEncKeyID) {
-    if (!cur_content_encoding_->encryption_key_id().empty()) {
-      MEDIA_LOG(ERROR, media_log_) << "Unexpected multiple ContentEncKeyID";
-      return false;
-    }
-    cur_content_encoding_->SetEncryptionKeyId(data, size);
-    return true;
-  }
-
-  // This should not happen if WebMListParser is working properly.
-  DCHECK(false);
-  return false;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_content_encodings_client.h b/cobalt/media/formats/webm/webm_content_encodings_client.h
deleted file mode 100644
index 3d4028f..0000000
--- a/cobalt/media/formats/webm/webm_content_encodings_client.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_CONTENT_ENCODINGS_CLIENT_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_CONTENT_ENCODINGS_CLIENT_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/formats/webm/webm_content_encodings.h"
-#include "cobalt/media/formats/webm/webm_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-typedef std::vector<ContentEncoding> ContentEncodings;
-
-// Parser for WebM ContentEncodings element.
-class MEDIA_EXPORT WebMContentEncodingsClient : public WebMParserClient {
- public:
-  explicit WebMContentEncodingsClient(const scoped_refptr<MediaLog>& media_log);
-  ~WebMContentEncodingsClient() override;
-
-  const ContentEncodings& content_encodings() const;
-
-  // WebMParserClient methods
-  WebMParserClient* OnListStart(int id) override;
-  bool OnListEnd(int id) override;
-  bool OnUInt(int id, int64_t val) override;
-  bool OnBinary(int id, const uint8_t* data, int size) override;
-
- private:
-  scoped_refptr<MediaLog> media_log_;
-  std::unique_ptr<ContentEncoding> cur_content_encoding_;
-  bool content_encryption_encountered_;
-  ContentEncodings content_encodings_;
-
-  // |content_encodings_| is ready. For debugging purpose.
-  bool content_encodings_ready_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebMContentEncodingsClient);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_CONTENT_ENCODINGS_CLIENT_H_
diff --git a/cobalt/media/formats/webm/webm_content_encodings_client_unittest.cc b/cobalt/media/formats/webm/webm_content_encodings_client_unittest.cc
deleted file mode 100644
index beed145..0000000
--- a/cobalt/media/formats/webm/webm_content_encodings_client_unittest.cc
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/webm_content_encodings_client.h"
-
-#include <string>
-
-#include "base/bind.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "cobalt/media/formats/webm/webm_parser.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-// Matchers for verifying common media log entry strings.
-MATCHER(MissingContentEncoding, "") {
-  return CONTAINS_STRING(arg, "Missing ContentEncoding.");
-}
-
-MATCHER(UnexpectedContentEncodingOrder, "") {
-  return CONTAINS_STRING(arg, "Unexpected ContentEncodingOrder.");
-}
-
-MATCHER(UnexpectedContentEncodingScope, "") {
-  return CONTAINS_STRING(arg, "Unexpected ContentEncodingScope.");
-}
-
-MATCHER(ContentCompressionNotSupported, "") {
-  return CONTAINS_STRING(arg, "ContentCompression not supported.");
-}
-
-MATCHER(MissingContentEncryption, "") {
-  return CONTAINS_STRING(
-      arg,
-      "ContentEncodingType is encryption but ContentEncryption is missing.");
-}
-
-MATCHER_P(UnexpectedContentEncAlgo, algo, "") {
-  return CONTAINS_STRING(
-      arg, "Unexpected ContentEncAlgo " + base::IntToString(algo) + ".");
-}
-
-class WebMContentEncodingsClientTest : public testing::Test {
- public:
-  WebMContentEncodingsClientTest()
-      : media_log_(new StrictMock<MockMediaLog>()),
-        client_(media_log_),
-        parser_(kWebMIdContentEncodings, &client_) {}
-
-  void ParseAndExpectToFail(const uint8_t* buf, int size) {
-    int result = parser_.Parse(buf, size);
-    EXPECT_EQ(-1, result);
-  }
-
- protected:
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-  WebMContentEncodingsClient client_;
-  WebMListParser parser_;
-};
-
-TEST_F(WebMContentEncodingsClientTest, EmptyContentEncodings) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0x80,  // ContentEncodings (size = 0)
-  };
-  int size = sizeof(kContentEncodings);
-  EXPECT_MEDIA_LOG(MissingContentEncoding());
-  ParseAndExpectToFail(kContentEncodings, size);
-}
-
-TEST_F(WebMContentEncodingsClientTest, EmptyContentEncoding) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0x83,  // ContentEncodings (size = 3)
-      0x63, 0x40, 0x80,  //   ContentEncoding (size = 0)
-  };
-  int size = sizeof(kContentEncodings);
-  ParseAndExpectToFail(kContentEncodings, size);
-}
-
-TEST_F(WebMContentEncodingsClientTest, SingleContentEncoding) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0xA1,        // ContentEncodings (size = 33)
-      0x62, 0x40, 0x9e,        //   ContentEncoding (size = 30)
-      0x50, 0x31, 0x81, 0x00,  //     ContentEncodingOrder (size = 1)
-      0x50, 0x32, 0x81, 0x01,  //     ContentEncodingScope (size = 1)
-      0x50, 0x33, 0x81, 0x01,  //     ContentEncodingType (size = 1)
-      0x50, 0x35, 0x8F,        //     ContentEncryption (size = 15)
-      0x47, 0xE1, 0x81, 0x05,  //       ContentEncAlgo (size = 1)
-      0x47, 0xE2, 0x88,        //       ContentEncKeyID (size = 8)
-      0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
-  };
-  int size = sizeof(kContentEncodings);
-
-  int result = parser_.Parse(kContentEncodings, size);
-  ASSERT_EQ(size, result);
-  const ContentEncodings& content_encodings = client_.content_encodings();
-
-  ASSERT_EQ(1u, content_encodings.size());
-  ASSERT_TRUE(content_encodings[0]);
-  EXPECT_EQ(0, content_encodings[0]->order());
-  EXPECT_EQ(ContentEncoding::kScopeAllFrameContents,
-            content_encodings[0]->scope());
-  EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[0]->type());
-  EXPECT_EQ(ContentEncoding::kEncAlgoAes,
-            content_encodings[0]->encryption_algo());
-  EXPECT_EQ(8u, content_encodings[0]->encryption_key_id().size());
-}
-
-TEST_F(WebMContentEncodingsClientTest, MultipleContentEncoding) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0xC2,        // ContentEncodings (size = 66)
-      0x62, 0x40, 0x9e,        //   ContentEncoding (size = 30)
-      0x50, 0x31, 0x81, 0x00,  //     ContentEncodingOrder (size = 1)
-      0x50, 0x32, 0x81, 0x03,  //     ContentEncodingScope (size = 1)
-      0x50, 0x33, 0x81, 0x01,  //     ContentEncodingType (size = 1)
-      0x50, 0x35, 0x8F,        //     ContentEncryption (size = 15)
-      0x47, 0xE1, 0x81, 0x05,  //       ContentEncAlgo (size = 1)
-      0x47, 0xE2, 0x88,        //       ContentEncKeyID (size = 8)
-      0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
-      0x62, 0x40, 0x9e,        //   ContentEncoding (size = 30)
-      0x50, 0x31, 0x81, 0x01,  //     ContentEncodingOrder (size = 1)
-      0x50, 0x32, 0x81, 0x03,  //     ContentEncodingScope (size = 1)
-      0x50, 0x33, 0x81, 0x01,  //     ContentEncodingType (size = 1)
-      0x50, 0x35, 0x8F,        //     ContentEncryption (size = 15)
-      0x47, 0xE1, 0x81, 0x01,  //       ContentEncAlgo (size = 1)
-      0x47, 0xE2, 0x88,        //       ContentEncKeyID (size = 8)
-      0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
-  };
-  int size = sizeof(kContentEncodings);
-
-  int result = parser_.Parse(kContentEncodings, size);
-  ASSERT_EQ(size, result);
-  const ContentEncodings& content_encodings = client_.content_encodings();
-  ASSERT_EQ(2u, content_encodings.size());
-
-  for (int i = 0; i < 2; ++i) {
-    ASSERT_TRUE(content_encodings[i]);
-    EXPECT_EQ(i, content_encodings[i]->order());
-    EXPECT_EQ(ContentEncoding::kScopeAllFrameContents |
-                  ContentEncoding::kScopeTrackPrivateData,
-              content_encodings[i]->scope());
-    EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[i]->type());
-    EXPECT_EQ(!i ? ContentEncoding::kEncAlgoAes : ContentEncoding::kEncAlgoDes,
-              content_encodings[i]->encryption_algo());
-    EXPECT_EQ(8u, content_encodings[i]->encryption_key_id().size());
-  }
-}
-
-TEST_F(WebMContentEncodingsClientTest, DefaultValues) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0x8A,        // ContentEncodings (size = 10)
-      0x62, 0x40, 0x87,        //   ContentEncoding (size = 7)
-                               //     ContentEncodingOrder missing
-                               //     ContentEncodingScope missing
-      0x50, 0x33, 0x81, 0x01,  //     ContentEncodingType (size = 1)
-      0x50, 0x35, 0x80,        //     ContentEncryption (size = 0)
-                               //     ContentEncAlgo missing
-  };
-  int size = sizeof(kContentEncodings);
-
-  int result = parser_.Parse(kContentEncodings, size);
-  ASSERT_EQ(size, result);
-  const ContentEncodings& content_encodings = client_.content_encodings();
-
-  ASSERT_EQ(1u, content_encodings.size());
-  ASSERT_TRUE(content_encodings[0]);
-  EXPECT_EQ(0, content_encodings[0]->order());
-  EXPECT_EQ(ContentEncoding::kScopeAllFrameContents,
-            content_encodings[0]->scope());
-  EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[0]->type());
-  EXPECT_EQ(ContentEncoding::kEncAlgoNotEncrypted,
-            content_encodings[0]->encryption_algo());
-  EXPECT_TRUE(content_encodings[0]->encryption_key_id().empty());
-}
-
-TEST_F(WebMContentEncodingsClientTest, ContentEncodingsClientReuse) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0xA1,        // ContentEncodings (size = 33)
-      0x62, 0x40, 0x9e,        //   ContentEncoding (size = 30)
-      0x50, 0x31, 0x81, 0x00,  //     ContentEncodingOrder (size = 1)
-      0x50, 0x32, 0x81, 0x01,  //     ContentEncodingScope (size = 1)
-      0x50, 0x33, 0x81, 0x01,  //     ContentEncodingType (size = 1)
-      0x50, 0x35, 0x8F,        //     ContentEncryption (size = 15)
-      0x47, 0xE1, 0x81, 0x05,  //       ContentEncAlgo (size = 1)
-      0x47, 0xE2, 0x88,        //       ContentEncKeyID (size = 8)
-      0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
-  };
-  int size = sizeof(kContentEncodings);
-
-  // Parse for the first time.
-  int result = parser_.Parse(kContentEncodings, size);
-  ASSERT_EQ(size, result);
-
-  // Parse again.
-  parser_.Reset();
-  result = parser_.Parse(kContentEncodings, size);
-  ASSERT_EQ(size, result);
-  const ContentEncodings& content_encodings = client_.content_encodings();
-
-  ASSERT_EQ(1u, content_encodings.size());
-  ASSERT_TRUE(content_encodings[0]);
-  EXPECT_EQ(0, content_encodings[0]->order());
-  EXPECT_EQ(ContentEncoding::kScopeAllFrameContents,
-            content_encodings[0]->scope());
-  EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[0]->type());
-  EXPECT_EQ(ContentEncoding::kEncAlgoAes,
-            content_encodings[0]->encryption_algo());
-  EXPECT_EQ(8u, content_encodings[0]->encryption_key_id().size());
-}
-
-TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingOrder) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0x8E,        // ContentEncodings (size = 14)
-      0x62, 0x40, 0x8B,        //   ContentEncoding (size = 11)
-      0x50, 0x31, 0x81, 0xEE,  //     ContentEncodingOrder (size = 1), invalid
-      0x50, 0x33, 0x81, 0x01,  //     ContentEncodingType (size = 1)
-      0x50, 0x35, 0x80,        //     ContentEncryption (size = 0)
-  };
-  int size = sizeof(kContentEncodings);
-  EXPECT_MEDIA_LOG(UnexpectedContentEncodingOrder());
-  ParseAndExpectToFail(kContentEncodings, size);
-}
-
-TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingScope) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0x8E,        // ContentEncodings (size = 14)
-      0x62, 0x40, 0x8B,        //   ContentEncoding (size = 11)
-      0x50, 0x32, 0x81, 0xEE,  //     ContentEncodingScope (size = 1), invalid
-      0x50, 0x33, 0x81, 0x01,  //     ContentEncodingType (size = 1)
-      0x50, 0x35, 0x80,        //     ContentEncryption (size = 0)
-  };
-  int size = sizeof(kContentEncodings);
-  EXPECT_MEDIA_LOG(UnexpectedContentEncodingScope());
-  ParseAndExpectToFail(kContentEncodings, size);
-}
-
-TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingType) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0x8E,        // ContentEncodings (size = 14)
-      0x62, 0x40, 0x8B,        //   ContentEncoding (size = 11)
-      0x50, 0x33, 0x81, 0x00,  //     ContentEncodingType (size = 1), invalid
-      0x50, 0x35, 0x80,        //     ContentEncryption (size = 0)
-  };
-  int size = sizeof(kContentEncodings);
-  EXPECT_MEDIA_LOG(ContentCompressionNotSupported());
-  ParseAndExpectToFail(kContentEncodings, size);
-}
-
-// ContentEncodingType is encryption but no ContentEncryption present.
-TEST_F(WebMContentEncodingsClientTest, MissingContentEncryption) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0x87,        // ContentEncodings (size = 7)
-      0x62, 0x40, 0x84,        //   ContentEncoding (size = 4)
-      0x50, 0x33, 0x81, 0x01,  //     ContentEncodingType (size = 1)
-                               //     ContentEncryption missing
-  };
-  int size = sizeof(kContentEncodings);
-  EXPECT_MEDIA_LOG(MissingContentEncryption());
-  ParseAndExpectToFail(kContentEncodings, size);
-}
-
-TEST_F(WebMContentEncodingsClientTest, InvalidContentEncAlgo) {
-  const uint8_t kContentEncodings[] = {
-      0x6D, 0x80, 0x99,        // ContentEncodings (size = 25)
-      0x62, 0x40, 0x96,        //   ContentEncoding (size = 22)
-      0x50, 0x33, 0x81, 0x01,  //     ContentEncodingType (size = 1)
-      0x50, 0x35, 0x8F,        //     ContentEncryption (size = 15)
-      0x47, 0xE1, 0x81, 0xEE,  //       ContentEncAlgo (size = 1), invalid
-      0x47, 0xE2, 0x88,        //       ContentEncKeyID (size = 8)
-      0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
-  };
-  int size = sizeof(kContentEncodings);
-  EXPECT_MEDIA_LOG(UnexpectedContentEncAlgo(0xEE));
-  ParseAndExpectToFail(kContentEncodings, size);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_crypto_helpers.cc b/cobalt/media/formats/webm/webm_crypto_helpers.cc
deleted file mode 100644
index 485aec5..0000000
--- a/cobalt/media/formats/webm/webm_crypto_helpers.cc
+++ /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.
-
-#include "cobalt/media/formats/webm/webm_crypto_helpers.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/sys_byteorder.h"
-#include "cobalt/media/base/decrypt_config.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-
-namespace cobalt {
-namespace media {
-namespace {
-
-// Generates a 16 byte CTR counter block. The CTR counter block format is a
-// CTR IV appended with a CTR block counter. |iv| is an 8 byte CTR IV.
-// |iv_size| is the size of |iv| in btyes. Returns a string of
-// kDecryptionKeySize bytes.
-std::string GenerateWebMCounterBlock(const uint8_t* iv, int iv_size) {
-  std::string counter_block(reinterpret_cast<const char*>(iv), iv_size);
-  counter_block.append(DecryptConfig::kDecryptionKeySize - iv_size, 0);
-  return counter_block;
-}
-
-uint32_t ReadInteger(const uint8_t* buf, int size) {
-  // Read in the big-endian integer.
-  uint32_t value = 0;
-  for (int i = 0; i < size; ++i) value = (value << 8) | buf[i];
-  return value;
-}
-
-bool ExtractSubsamples(const uint8_t* buf, size_t frame_data_size,
-                       size_t num_partitions,
-                       std::vector<SubsampleEntry>* subsample_entries) {
-  subsample_entries->clear();
-  uint32_t clear_bytes = 0;
-  // Partition is the wall between alternating sections. Partition offsets are
-  // relative to the start of the actual frame data.
-  // Size of clear/cipher sections can be calculated from the difference between
-  // adjacent partition offsets.
-  // Here is an example with 4 partitions (5 sections):
-  //   "clear |1 cipher |2 clear |3 cipher |4 clear"
-  // With the first and the last implicit partition included:
-  //   "|0 clear |1 cipher |2 clear |3 cipher |4 clear |5"
-  //   where partition_offset_0 = 0, partition_offset_5 = frame_data_size
-  // There are three subsamples in the above example:
-  //   Subsample0.clear_bytes = partition_offset_1 - partition_offset_0
-  //   Subsample0.cipher_bytes = partition_offset_2 - partition_offset_1
-  //   ...
-  //   Subsample2.clear_bytes = partition_offset_5 - partition_offset_4
-  //   Subsample2.cipher_bytes = 0
-  uint32_t partition_offset = 0;
-  for (size_t i = 0, offset = 0; i <= num_partitions; ++i) {
-    const uint32_t prev_partition_offset = partition_offset;
-    partition_offset =
-        (i == num_partitions)
-            ? frame_data_size
-            : ReadInteger(buf + offset, kWebMEncryptedFramePartitionOffsetSize);
-    offset += kWebMEncryptedFramePartitionOffsetSize;
-    if (partition_offset < prev_partition_offset) {
-      DVLOG(1) << "Partition should not be decreasing " << prev_partition_offset
-               << " " << partition_offset;
-      return false;
-    }
-
-    uint32_t cipher_bytes = 0;
-    bool new_subsample_entry = false;
-    // Alternating clear and cipher sections.
-    if ((i % 2) == 0) {
-      clear_bytes = partition_offset - prev_partition_offset;
-      // Generate a new subsample when finishing reading partition offsets.
-      new_subsample_entry = i == num_partitions;
-    } else {
-      cipher_bytes = partition_offset - prev_partition_offset;
-      // Generate a new subsample after seeing a cipher section.
-      new_subsample_entry = true;
-    }
-
-    if (new_subsample_entry) {
-      if (clear_bytes == 0 && cipher_bytes == 0) {
-        DVLOG(1) << "Not expecting >2 partitions with the same offsets.";
-        return false;
-      }
-      subsample_entries->push_back(SubsampleEntry(clear_bytes, cipher_bytes));
-    }
-  }
-  return true;
-}
-
-}  // namespace
-
-bool WebMCreateDecryptConfig(const uint8_t* data, int data_size,
-                             const uint8_t* key_id, int key_id_size,
-                             std::unique_ptr<DecryptConfig>* decrypt_config,
-                             int* data_offset) {
-  if (data_size < kWebMSignalByteSize) {
-    DVLOG(1) << "Got a block from an encrypted stream with no data.";
-    return false;
-  }
-
-  const uint8_t signal_byte = data[0];
-  int frame_offset = sizeof(signal_byte);
-
-  std::string counter_block;
-  std::vector<SubsampleEntry> subsample_entries;
-
-  if (signal_byte & kWebMFlagEncryptedFrame) {
-    if (data_size < kWebMSignalByteSize + kWebMIvSize) {
-      DVLOG(1) << "Got an encrypted block with not enough data " << data_size;
-      return false;
-    }
-    counter_block = GenerateWebMCounterBlock(data + frame_offset, kWebMIvSize);
-    frame_offset += kWebMIvSize;
-
-    if (signal_byte & kWebMFlagEncryptedFramePartitioned) {
-      if (data_size < frame_offset + kWebMEncryptedFrameNumPartitionsSize) {
-        DVLOG(1) << "Got a partitioned encrypted block with not enough data "
-                 << data_size;
-        return false;
-      }
-
-      const size_t num_partitions = data[frame_offset];
-      if (num_partitions == 0) {
-        DVLOG(1) << "Got a partitioned encrypted block with 0 partitions.";
-        return false;
-      }
-      frame_offset += kWebMEncryptedFrameNumPartitionsSize;
-      const uint8_t* partition_data_start = data + frame_offset;
-      frame_offset += kWebMEncryptedFramePartitionOffsetSize * num_partitions;
-      if (data_size <= frame_offset) {
-        DVLOG(1) << "Got a partitioned encrypted block with " << num_partitions
-                 << " partitions but not enough data " << data_size;
-        return false;
-      }
-      const size_t frame_data_size = data_size - frame_offset;
-      if (!ExtractSubsamples(partition_data_start, frame_data_size,
-                             num_partitions, &subsample_entries)) {
-        return false;
-      }
-    }
-  }
-
-  if (counter_block.empty()) {
-    // If the frame is unencrypted the DecryptConfig object should be NULL.
-    decrypt_config->reset();
-  } else {
-    *decrypt_config = DecryptConfig::CreateCencConfig(
-        std::string(reinterpret_cast<const char*>(key_id), key_id_size),
-        counter_block, subsample_entries);
-  }
-  *data_offset = frame_offset;
-
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_crypto_helpers.h b/cobalt/media/formats/webm/webm_crypto_helpers.h
deleted file mode 100644
index b6b4ee3..0000000
--- a/cobalt/media/formats/webm/webm_crypto_helpers.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_CRYPTO_HELPERS_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_CRYPTO_HELPERS_H_
-
-#include <memory>
-
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Fills |decrypt_config|, which can be sent to the Decryptor if the stream
-// has potentially encrypted frames. Also sets |data_offset| which indicates
-// where the encrypted data starts. If the frame is unencrypted
-// |*decrypt_config| will be null. Returns true if |data| is valid, false
-// otherwise, in which case |decrypt_config| and |data_offset| will not be
-// changed. Current encrypted WebM request for comments specification is here
-// http://wiki.webmproject.org/encryption/webm-encryption-rfc
-bool MEDIA_EXPORT WebMCreateDecryptConfig(
-    const uint8_t* data, int data_size, const uint8_t* key_id, int key_id_size,
-    std::unique_ptr<DecryptConfig>* decrypt_config, int* data_offset);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_CRYPTO_HELPERS_H_
diff --git a/cobalt/media/formats/webm/webm_crypto_helpers_unittest.cc b/cobalt/media/formats/webm/webm_crypto_helpers_unittest.cc
deleted file mode 100644
index 5766ba7..0000000
--- a/cobalt/media/formats/webm/webm_crypto_helpers_unittest.cc
+++ /dev/null
@@ -1,241 +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 "cobalt/media/formats/webm/webm_crypto_helpers.h"
-
-#include <memory>
-#include <string>
-
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::ElementsAre;
-
-namespace {
-
-const uint8_t kKeyId[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
-
-}  // namespace
-
-namespace cobalt {
-namespace media {
-
-inline bool operator==(const SubsampleEntry& lhs, const SubsampleEntry& rhs) {
-  return lhs.clear_bytes == rhs.clear_bytes &&
-         lhs.cypher_bytes == rhs.cypher_bytes;
-}
-
-TEST(WebMCryptoHelpersTest, EmptyData) {
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_FALSE(WebMCreateDecryptConfig(NULL, 0, kKeyId, sizeof(kKeyId),
-                                       &decrypt_config, &data_offset));
-}
-
-TEST(WebMCryptoHelpersTest, ClearData) {
-  const uint8_t kData[] = {0x00, 0x0d, 0x0a, 0x0d, 0x0a};
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_TRUE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                      sizeof(kKeyId), &decrypt_config,
-                                      &data_offset));
-  EXPECT_EQ(1, data_offset);
-  EXPECT_FALSE(decrypt_config->is_encrypted());
-}
-
-TEST(WebMCryptoHelpersTest, EncryptedButNotEnoughBytes) {
-  const uint8_t kData[] = {0x01, 0x0d, 0x0a, 0x0d, 0x0a};
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_FALSE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                       sizeof(kKeyId), &decrypt_config,
-                                       &data_offset));
-}
-
-TEST(WebMCryptoHelpersTest, EncryptedNotPartitioned) {
-  const uint8_t kData[] = {
-      // Encrypted
-      0x01,
-      // IV
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      // Data
-      0x01, 0x02,
-  };
-  // Extracted from kData and zero extended to 16 bytes.
-  const uint8_t kExpectedIv[] = {
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  };
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_TRUE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                      sizeof(kKeyId), &decrypt_config,
-                                      &data_offset));
-  EXPECT_TRUE(decrypt_config->is_encrypted());
-  EXPECT_EQ(std::string(kKeyId, kKeyId + sizeof(kKeyId)),
-            decrypt_config->key_id());
-  EXPECT_EQ(std::string(kExpectedIv, kExpectedIv + sizeof(kExpectedIv)),
-            decrypt_config->iv());
-  EXPECT_TRUE(decrypt_config->subsamples().empty());
-}
-
-TEST(WebMCryptoHelpersTest, EncryptedPartitionedMissingNumPartitionField) {
-  const uint8_t kData[] = {
-      // Encrypted and Partitioned
-      0x03,
-      // IV
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-  };
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_FALSE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                       sizeof(kKeyId), &decrypt_config,
-                                       &data_offset));
-}
-
-TEST(WebMCryptoHelpersTest, EncryptedPartitionedNotEnoughBytesForOffsets) {
-  const uint8_t kData[] = {
-      // Encrypted and Partitioned
-      0x03,
-      // IV
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      // Num partitions = 2
-      0x02,
-      // Partition 0 @ offset 3
-      0x00, 0x00, 0x00, 0x03,
-  };
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_FALSE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                       sizeof(kKeyId), &decrypt_config,
-                                       &data_offset));
-}
-
-TEST(WebMCryptoHelpersTest, EncryptedPartitionedNotEnoughBytesForData) {
-  const uint8_t kData[] = {
-      // Encrypted and Partitioned
-      0x03,
-      // IV
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      // Num partitions = 2
-      0x02,
-      // Partition 0 @ offset 3, partition 2 @ offset 5
-      0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05,
-      // Should have more than 5 bytes of data
-      0x00, 0x01, 0x02, 0x03,
-  };
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_FALSE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                       sizeof(kKeyId), &decrypt_config,
-                                       &data_offset));
-}
-
-TEST(WebMCryptoHelpersTest, EncryptedPartitionedNotEnoughBytesForData2) {
-  const uint8_t kData[] = {
-      // Encrypted and Partitioned
-      0x03,
-      // IV
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      // Num partitions = 2
-      0x02,
-      // Partition 0 @ offset 3, partition 1 @ offset 5
-      0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05,
-      // Should have more than 5 bytes of data
-      0x00, 0x01, 0x02, 0x03, 0x04,
-  };
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_FALSE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                       sizeof(kKeyId), &decrypt_config,
-                                       &data_offset));
-}
-
-TEST(WebMCryptoHelpersTest, EncryptedPartitionedDecreasingOffsets) {
-  const uint8_t kData[] = {
-      // Encrypted and Partitioned
-      0x03,
-      // IV
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      // Num partitions = 2
-      0x02,
-      // Partition 0 @ offset 3, partition 1 @ offset 2
-      0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02,
-      // Should have more than 5 bytes of data
-      0x00, 0x01, 0x02, 0x03, 0x04,
-  };
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_FALSE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                       sizeof(kKeyId), &decrypt_config,
-                                       &data_offset));
-}
-
-TEST(WebMCryptoHelpersTest, EncryptedPartitionedEvenNumberOfPartitions) {
-  const uint8_t kData[] = {
-      // Encrypted and Partitioned
-      0x03,
-      // IV
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      // Num partitions = 2
-      0x02,
-      // Partition 0 @ offset 3, partition 1 @ offset 5
-      0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05,
-      // Should have more than 5 bytes of data
-      0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
-  };
-  // Extracted from kData and zero extended to 16 bytes.
-  const uint8_t kExpectedIv[] = {
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  };
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_TRUE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                      sizeof(kKeyId), &decrypt_config,
-                                      &data_offset));
-  EXPECT_TRUE(decrypt_config->is_encrypted());
-  EXPECT_EQ(std::string(kKeyId, kKeyId + sizeof(kKeyId)),
-            decrypt_config->key_id());
-  EXPECT_EQ(std::string(kExpectedIv, kExpectedIv + sizeof(kExpectedIv)),
-            decrypt_config->iv());
-  EXPECT_THAT(decrypt_config->subsamples(),
-              ElementsAre(SubsampleEntry(3, 2), SubsampleEntry(1, 0)));
-  EXPECT_EQ(18, data_offset);
-}
-
-TEST(WebMCryptoHelpersTest, EncryptedPartitionedOddNumberOfPartitions) {
-  const uint8_t kData[] = {
-      // Encrypted and Partitioned
-      0x03,
-      // IV
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      // Num partitions = 1
-      0x01,
-      // Partition 0 @ offset 3,
-      0x00, 0x00, 0x00, 0x03,
-      // Should have more than 3 bytes of data
-      0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
-  };
-  // Extracted from kData and zero extended to 16 bytes.
-  const uint8_t kExpectedIv[] = {
-      0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  };
-  std::unique_ptr<DecryptConfig> decrypt_config;
-  int data_offset;
-  ASSERT_TRUE(WebMCreateDecryptConfig(kData, sizeof(kData), kKeyId,
-                                      sizeof(kKeyId), &decrypt_config,
-                                      &data_offset));
-  EXPECT_TRUE(decrypt_config->is_encrypted());
-  EXPECT_EQ(std::string(kKeyId, kKeyId + sizeof(kKeyId)),
-            decrypt_config->key_id());
-  EXPECT_EQ(std::string(kExpectedIv, kExpectedIv + sizeof(kExpectedIv)),
-            decrypt_config->iv());
-  EXPECT_THAT(decrypt_config->subsamples(), ElementsAre(SubsampleEntry(3, 3)));
-  EXPECT_EQ(14, data_offset);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_info_parser.cc b/cobalt/media/formats/webm/webm_info_parser.cc
deleted file mode 100644
index 2698199..0000000
--- a/cobalt/media/formats/webm/webm_info_parser.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/webm_info_parser.h"
-
-#include "base/logging.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-
-namespace cobalt {
-namespace media {
-
-// Default timecode scale if the TimecodeScale element is
-// not specified in the INFO element.
-static const int kWebMDefaultTimecodeScale = 1000000;
-
-WebMInfoParser::WebMInfoParser() : timecode_scale_(-1), duration_(-1) {}
-
-WebMInfoParser::~WebMInfoParser() {}
-
-int WebMInfoParser::Parse(const uint8_t* buf, int size) {
-  timecode_scale_ = -1;
-  duration_ = -1;
-
-  WebMListParser parser(kWebMIdInfo, this);
-  int result = parser.Parse(buf, size);
-
-  if (result <= 0) return result;
-
-  // For now we do all or nothing parsing.
-  return parser.IsParsingComplete() ? result : 0;
-}
-
-WebMParserClient* WebMInfoParser::OnListStart(int id) { return this; }
-
-bool WebMInfoParser::OnListEnd(int id) {
-  if (id == kWebMIdInfo && timecode_scale_ == -1) {
-    // Set timecode scale to default value if it isn't present in
-    // the Info element.
-    timecode_scale_ = kWebMDefaultTimecodeScale;
-  }
-  return true;
-}
-
-bool WebMInfoParser::OnUInt(int id, int64_t val) {
-  if (id != kWebMIdTimecodeScale) return true;
-
-  if (timecode_scale_ != -1) {
-    DVLOG(1) << "Multiple values for id " << std::hex << id << " specified";
-    return false;
-  }
-
-  timecode_scale_ = val;
-  return true;
-}
-
-bool WebMInfoParser::OnFloat(int id, double val) {
-  if (id != kWebMIdDuration) {
-    DVLOG(1) << "Unexpected float for id" << std::hex << id;
-    return false;
-  }
-
-  if (duration_ != -1) {
-    DVLOG(1) << "Multiple values for duration.";
-    return false;
-  }
-
-  duration_ = val;
-  return true;
-}
-
-bool WebMInfoParser::OnBinary(int id, const uint8_t* data, int size) {
-  if (id == kWebMIdDateUTC) {
-    if (size != 8) return false;
-
-    int64_t date_in_nanoseconds = 0;
-    for (int i = 0; i < size; ++i)
-      date_in_nanoseconds = (date_in_nanoseconds << 8) | data[i];
-
-    base::Time::Exploded exploded_epoch;
-    exploded_epoch.year = 2001;
-    exploded_epoch.month = 1;
-    exploded_epoch.day_of_month = 1;
-    exploded_epoch.hour = 0;
-    exploded_epoch.minute = 0;
-    exploded_epoch.second = 0;
-    exploded_epoch.millisecond = 0;
-
-    if (!base::Time::FromUTCExploded(exploded_epoch, &date_utc_)) {
-      return false;
-    }
-    date_utc_ += base::TimeDelta::FromMicroseconds(date_in_nanoseconds / 1000);
-  }
-  return true;
-}
-
-bool WebMInfoParser::OnString(int id, const std::string& str) { return true; }
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_info_parser.h b/cobalt/media/formats/webm/webm_info_parser.h
deleted file mode 100644
index fbcbd74..0000000
--- a/cobalt/media/formats/webm/webm_info_parser.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 COBALT_MEDIA_FORMATS_WEBM_WEBM_INFO_PARSER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_INFO_PARSER_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/formats/webm/webm_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Parser for WebM Info element.
-class MEDIA_EXPORT WebMInfoParser : public WebMParserClient {
- public:
-  WebMInfoParser();
-  ~WebMInfoParser() override;
-
-  // Parses a WebM Info element in |buf|.
-  //
-  // Returns -1 if the parse fails.
-  // Returns 0 if more data is needed.
-  // Returns the number of bytes parsed on success.
-  int Parse(const uint8_t* buf, int size);
-
-  int64_t timecode_scale() const { return timecode_scale_; }
-  double duration() const { return duration_; }
-  base::Time date_utc() const { return date_utc_; }
-
- private:
-  // WebMParserClient methods
-  WebMParserClient* OnListStart(int id) override;
-  bool OnListEnd(int id) override;
-  bool OnUInt(int id, int64_t val) override;
-  bool OnFloat(int id, double val) override;
-  bool OnBinary(int id, const uint8_t* data, int size) override;
-  bool OnString(int id, const std::string& str) override;
-
-  int64_t timecode_scale_;
-  double duration_;
-  base::Time date_utc_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebMInfoParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_INFO_PARSER_H_
diff --git a/cobalt/media/formats/webm/webm_parser.cc b/cobalt/media/formats/webm/webm_parser.cc
deleted file mode 100644
index 5350253..0000000
--- a/cobalt/media/formats/webm/webm_parser.cc
+++ /dev/null
@@ -1,902 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/webm_parser.h"
-
-// This file contains code to parse WebM file elements. It was created
-// from information in the Matroska spec.
-// http://www.matroska.org/technical/specs/index.html
-// This file contains code for encrypted WebM. Current WebM
-// encrypted request for comments specification is here
-// http://wiki.webmproject.org/encryption/webm-encryption-rfc
-
-#include <string.h>
-
-#include <iomanip>
-#include <limits>
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-enum ElementType {
-  UNKNOWN,
-  LIST,  // Referred to as Master Element in the Matroska spec.
-  UINT,
-  FLOAT,
-  BINARY,
-  STRING,
-  SKIP,
-};
-
-struct ElementIdInfo {
-  ElementType type_;
-  int id_;
-};
-
-struct ListElementInfo {
-  int id_;
-  int level_;
-  const ElementIdInfo* id_info_;
-  int id_info_count_;
-};
-
-// The following are tables indicating what IDs are valid sub-elements
-// of particular elements. If an element is encountered that doesn't
-// appear in the list, a parsing error is signalled. Some elements are
-// marked as SKIP because they are valid, but we don't care about them
-// right now.
-static const ElementIdInfo kEBMLHeaderIds[] = {
-    {UINT, kWebMIdEBMLVersion},        {UINT, kWebMIdEBMLReadVersion},
-    {UINT, kWebMIdEBMLMaxIDLength},    {UINT, kWebMIdEBMLMaxSizeLength},
-    {STRING, kWebMIdDocType},          {UINT, kWebMIdDocTypeVersion},
-    {UINT, kWebMIdDocTypeReadVersion},
-};
-
-static const ElementIdInfo kSegmentIds[] = {
-    {LIST, kWebMIdSeekHead}, {LIST, kWebMIdInfo}, {LIST, kWebMIdCluster},
-    {LIST, kWebMIdTracks},   {LIST, kWebMIdCues}, {LIST, kWebMIdAttachments},
-    {LIST, kWebMIdChapters}, {LIST, kWebMIdTags},
-};
-
-static const ElementIdInfo kSeekHeadIds[] = {
-    {LIST, kWebMIdSeek},
-};
-
-static const ElementIdInfo kSeekIds[] = {
-    {BINARY, kWebMIdSeekID}, {UINT, kWebMIdSeekPosition},
-};
-
-static const ElementIdInfo kInfoIds[] = {
-    {BINARY, kWebMIdSegmentUID},    {STRING, kWebMIdSegmentFilename},
-    {BINARY, kWebMIdPrevUID},       {STRING, kWebMIdPrevFilename},
-    {BINARY, kWebMIdNextUID},       {STRING, kWebMIdNextFilename},
-    {BINARY, kWebMIdSegmentFamily}, {LIST, kWebMIdChapterTranslate},
-    {UINT, kWebMIdTimecodeScale},   {FLOAT, kWebMIdDuration},
-    {BINARY, kWebMIdDateUTC},       {STRING, kWebMIdTitle},
-    {STRING, kWebMIdMuxingApp},     {STRING, kWebMIdWritingApp},
-};
-
-static const ElementIdInfo kChapterTranslateIds[] = {
-    {UINT, kWebMIdChapterTranslateEditionUID},
-    {UINT, kWebMIdChapterTranslateCodec},
-    {BINARY, kWebMIdChapterTranslateID},
-};
-
-static const ElementIdInfo kClusterIds[] = {
-    {BINARY, kWebMIdSimpleBlock}, {UINT, kWebMIdTimecode},
-    {LIST, kWebMIdSilentTracks},  {UINT, kWebMIdPosition},
-    {UINT, kWebMIdPrevSize},      {LIST, kWebMIdBlockGroup},
-};
-
-static const ElementIdInfo kSilentTracksIds[] = {
-    {UINT, kWebMIdSilentTrackNumber},
-};
-
-static const ElementIdInfo kBlockGroupIds[] = {
-    {BINARY, kWebMIdBlock},          {LIST, kWebMIdBlockAdditions},
-    {UINT, kWebMIdBlockDuration},    {UINT, kWebMIdReferencePriority},
-    {BINARY, kWebMIdReferenceBlock}, {BINARY, kWebMIdCodecState},
-    {BINARY, kWebMIdDiscardPadding}, {LIST, kWebMIdSlices},
-};
-
-static const ElementIdInfo kBlockAdditionsIds[] = {
-    {LIST, kWebMIdBlockMore},
-};
-
-static const ElementIdInfo kBlockMoreIds[] = {
-    {UINT, kWebMIdBlockAddID}, {BINARY, kWebMIdBlockAdditional},
-};
-
-static const ElementIdInfo kSlicesIds[] = {
-    {LIST, kWebMIdTimeSlice},
-};
-
-static const ElementIdInfo kTimeSliceIds[] = {
-    {UINT, kWebMIdLaceNumber},
-};
-
-static const ElementIdInfo kTracksIds[] = {
-    {LIST, kWebMIdTrackEntry},
-};
-
-static const ElementIdInfo kTrackEntryIds[] = {
-    {UINT, kWebMIdTrackNumber},
-    {BINARY, kWebMIdTrackUID},
-    {UINT, kWebMIdTrackType},
-    {UINT, kWebMIdFlagEnabled},
-    {UINT, kWebMIdFlagDefault},
-    {UINT, kWebMIdFlagForced},
-    {UINT, kWebMIdFlagLacing},
-    {UINT, kWebMIdMinCache},
-    {UINT, kWebMIdMaxCache},
-    {UINT, kWebMIdDefaultDuration},
-    {FLOAT, kWebMIdTrackTimecodeScale},
-    {UINT, kWebMIdMaxBlockAdditionId},
-    {STRING, kWebMIdName},
-    {STRING, kWebMIdLanguage},
-    {STRING, kWebMIdCodecID},
-    {BINARY, kWebMIdCodecPrivate},
-    {STRING, kWebMIdCodecName},
-    {UINT, kWebMIdAttachmentLink},
-    {UINT, kWebMIdCodecDecodeAll},
-    {UINT, kWebMIdTrackOverlay},
-    {UINT, kWebMIdCodecDelay},
-    {UINT, kWebMIdSeekPreRoll},
-    {LIST, kWebMIdTrackTranslate},
-    {LIST, kWebMIdVideo},
-    {LIST, kWebMIdAudio},
-    {LIST, kWebMIdTrackOperation},
-    {LIST, kWebMIdContentEncodings},
-};
-
-static const ElementIdInfo kTrackTranslateIds[] = {
-    {UINT, kWebMIdTrackTranslateEditionUID},
-    {UINT, kWebMIdTrackTranslateCodec},
-    {BINARY, kWebMIdTrackTranslateTrackID},
-};
-
-static const ElementIdInfo kVideoIds[] = {
-    {UINT, kWebMIdFlagInterlaced},  {UINT, kWebMIdStereoMode},
-    {UINT, kWebMIdAlphaMode},       {LIST, kWebMIdProjection},
-    {UINT, kWebMIdPixelWidth},      {UINT, kWebMIdPixelHeight},
-    {UINT, kWebMIdPixelCropBottom}, {UINT, kWebMIdPixelCropTop},
-    {UINT, kWebMIdPixelCropLeft},   {UINT, kWebMIdPixelCropRight},
-    {UINT, kWebMIdDisplayWidth},    {UINT, kWebMIdDisplayHeight},
-    {UINT, kWebMIdDisplayUnit},     {UINT, kWebMIdAspectRatioType},
-    {BINARY, kWebMIdColorSpace},    {FLOAT, kWebMIdFrameRate},
-    {LIST, kWebMIdColour},
-};
-
-static const ElementIdInfo kColourIds[] = {
-    {UINT, kWebMIdMatrixCoefficients},
-    {UINT, kWebMIdBitsPerChannel},
-    {UINT, kWebMIdChromaSubsamplingHorz},
-    {UINT, kWebMIdChromaSubsamplingVert},
-    {UINT, kWebMIdCbSubsamplingHorz},
-    {UINT, kWebMIdCbSubsamplingVert},
-    {UINT, kWebMIdChromaSitingHorz},
-    {UINT, kWebMIdChromaSitingVert},
-    {UINT, kWebMIdRange},
-    {UINT, kWebMIdTransferCharacteristics},
-    {UINT, kWebMIdPrimaries},
-    {UINT, kWebMIdMaxCLL},
-    {UINT, kWebMIdMaxFALL},
-    {LIST, kWebMIdMasteringMetadata},
-};
-
-static const ElementIdInfo kMasteringMetadataIds[] = {
-    {FLOAT, kWebMIdPrimaryRChromaticityX},
-    {FLOAT, kWebMIdPrimaryRChromaticityY},
-    {FLOAT, kWebMIdPrimaryGChromaticityX},
-    {FLOAT, kWebMIdPrimaryGChromaticityY},
-    {FLOAT, kWebMIdPrimaryBChromaticityX},
-    {FLOAT, kWebMIdPrimaryBChromaticityY},
-    {FLOAT, kWebMIdWhitePointChromaticityX},
-    {FLOAT, kWebMIdWhitePointChromaticityY},
-    {FLOAT, kWebMIdLuminanceMax},
-    {FLOAT, kWebMIdLuminanceMin},
-};
-
-static const ElementIdInfo kAudioIds[] = {
-    {FLOAT, kWebMIdSamplingFrequency},
-    {FLOAT, kWebMIdOutputSamplingFrequency},
-    {UINT, kWebMIdChannels},
-    {UINT, kWebMIdBitDepth},
-};
-
-static const ElementIdInfo kTrackOperationIds[] = {
-    {LIST, kWebMIdTrackCombinePlanes}, {LIST, kWebMIdJoinBlocks},
-};
-
-static const ElementIdInfo kTrackCombinePlanesIds[] = {
-    {LIST, kWebMIdTrackPlane},
-};
-
-static const ElementIdInfo kTrackPlaneIds[] = {
-    {UINT, kWebMIdTrackPlaneUID}, {UINT, kWebMIdTrackPlaneType},
-};
-
-static const ElementIdInfo kJoinBlocksIds[] = {
-    {UINT, kWebMIdTrackJoinUID},
-};
-
-static const ElementIdInfo kContentEncodingsIds[] = {
-    {LIST, kWebMIdContentEncoding},
-};
-
-static const ElementIdInfo kContentEncodingIds[] = {
-    {UINT, kWebMIdContentEncodingOrder}, {UINT, kWebMIdContentEncodingScope},
-    {UINT, kWebMIdContentEncodingType},  {LIST, kWebMIdContentCompression},
-    {LIST, kWebMIdContentEncryption},
-};
-
-static const ElementIdInfo kContentCompressionIds[] = {
-    {UINT, kWebMIdContentCompAlgo}, {BINARY, kWebMIdContentCompSettings},
-};
-
-static const ElementIdInfo kContentEncryptionIds[] = {
-    {LIST, kWebMIdContentEncAESSettings}, {UINT, kWebMIdContentEncAlgo},
-    {BINARY, kWebMIdContentEncKeyID},     {BINARY, kWebMIdContentSignature},
-    {BINARY, kWebMIdContentSigKeyID},     {UINT, kWebMIdContentSigAlgo},
-    {UINT, kWebMIdContentSigHashAlgo},
-};
-
-static const ElementIdInfo kContentEncAESSettingsIds[] = {
-    {UINT, kWebMIdAESSettingsCipherMode},
-};
-
-static const ElementIdInfo kCuesIds[] = {
-    {LIST, kWebMIdCuePoint},
-};
-
-static const ElementIdInfo kCuePointIds[] = {
-    {UINT, kWebMIdCueTime}, {LIST, kWebMIdCueTrackPositions},
-};
-
-static const ElementIdInfo kCueTrackPositionsIds[] = {
-    {UINT, kWebMIdCueTrack},       {UINT, kWebMIdCueClusterPosition},
-    {UINT, kWebMIdCueBlockNumber}, {UINT, kWebMIdCueCodecState},
-    {LIST, kWebMIdCueReference},
-};
-
-static const ElementIdInfo kCueReferenceIds[] = {
-    {UINT, kWebMIdCueRefTime},
-};
-
-static const ElementIdInfo kAttachmentsIds[] = {
-    {LIST, kWebMIdAttachedFile},
-};
-
-static const ElementIdInfo kAttachedFileIds[] = {
-    {STRING, kWebMIdFileDescription}, {STRING, kWebMIdFileName},
-    {STRING, kWebMIdFileMimeType},    {BINARY, kWebMIdFileData},
-    {UINT, kWebMIdFileUID},
-};
-
-static const ElementIdInfo kChaptersIds[] = {
-    {LIST, kWebMIdEditionEntry},
-};
-
-static const ElementIdInfo kEditionEntryIds[] = {
-    {UINT, kWebMIdEditionUID},         {UINT, kWebMIdEditionFlagHidden},
-    {UINT, kWebMIdEditionFlagDefault}, {UINT, kWebMIdEditionFlagOrdered},
-    {LIST, kWebMIdChapterAtom},
-};
-
-static const ElementIdInfo kChapterAtomIds[] = {
-    {UINT, kWebMIdChapterUID},
-    {UINT, kWebMIdChapterTimeStart},
-    {UINT, kWebMIdChapterTimeEnd},
-    {UINT, kWebMIdChapterFlagHidden},
-    {UINT, kWebMIdChapterFlagEnabled},
-    {BINARY, kWebMIdChapterSegmentUID},
-    {UINT, kWebMIdChapterSegmentEditionUID},
-    {UINT, kWebMIdChapterPhysicalEquiv},
-    {LIST, kWebMIdChapterTrack},
-    {LIST, kWebMIdChapterDisplay},
-    {LIST, kWebMIdChapProcess},
-};
-
-static const ElementIdInfo kChapterTrackIds[] = {
-    {UINT, kWebMIdChapterTrackNumber},
-};
-
-static const ElementIdInfo kChapterDisplayIds[] = {
-    {STRING, kWebMIdChapString},
-    {STRING, kWebMIdChapLanguage},
-    {STRING, kWebMIdChapCountry},
-};
-
-static const ElementIdInfo kChapProcessIds[] = {
-    {UINT, kWebMIdChapProcessCodecID},
-    {BINARY, kWebMIdChapProcessPrivate},
-    {LIST, kWebMIdChapProcessCommand},
-};
-
-static const ElementIdInfo kChapProcessCommandIds[] = {
-    {UINT, kWebMIdChapProcessTime}, {BINARY, kWebMIdChapProcessData},
-};
-
-static const ElementIdInfo kTagsIds[] = {
-    {LIST, kWebMIdTag},
-};
-
-static const ElementIdInfo kTagIds[] = {
-    {LIST, kWebMIdTargets}, {LIST, kWebMIdSimpleTag},
-};
-
-static const ElementIdInfo kTargetsIds[] = {
-    {UINT, kWebMIdTargetTypeValue}, {STRING, kWebMIdTargetType},
-    {UINT, kWebMIdTagTrackUID},     {UINT, kWebMIdTagEditionUID},
-    {UINT, kWebMIdTagChapterUID},   {UINT, kWebMIdTagAttachmentUID},
-};
-
-static const ElementIdInfo kSimpleTagIds[] = {
-    {STRING, kWebMIdTagName},   {STRING, kWebMIdTagLanguage},
-    {UINT, kWebMIdTagDefault},  {STRING, kWebMIdTagString},
-    {BINARY, kWebMIdTagBinary},
-};
-
-static const ElementIdInfo kProjectionIds[] = {
-    {FLOAT, kWebMIdProjectionPosePitch}, {FLOAT, kWebMIdProjectionPoseRoll},
-    {FLOAT, kWebMIdProjectionPoseYaw},   {BINARY, kWebMIdProjectionPrivate},
-    {UINT, kWebMIdProjectionType},
-};
-
-#define LIST_ELEMENT_INFO(id, level, id_info) \
-  { (id), (level), (id_info), arraysize(id_info) }
-
-static const ListElementInfo kListElementInfo[] = {
-    LIST_ELEMENT_INFO(kWebMIdCluster, 1, kClusterIds),
-    LIST_ELEMENT_INFO(kWebMIdEBMLHeader, 0, kEBMLHeaderIds),
-    LIST_ELEMENT_INFO(kWebMIdSegment, 0, kSegmentIds),
-    LIST_ELEMENT_INFO(kWebMIdSeekHead, 1, kSeekHeadIds),
-    LIST_ELEMENT_INFO(kWebMIdSeek, 2, kSeekIds),
-    LIST_ELEMENT_INFO(kWebMIdInfo, 1, kInfoIds),
-    LIST_ELEMENT_INFO(kWebMIdChapterTranslate, 2, kChapterTranslateIds),
-    LIST_ELEMENT_INFO(kWebMIdSilentTracks, 2, kSilentTracksIds),
-    LIST_ELEMENT_INFO(kWebMIdBlockGroup, 2, kBlockGroupIds),
-    LIST_ELEMENT_INFO(kWebMIdBlockAdditions, 3, kBlockAdditionsIds),
-    LIST_ELEMENT_INFO(kWebMIdBlockMore, 4, kBlockMoreIds),
-    LIST_ELEMENT_INFO(kWebMIdSlices, 3, kSlicesIds),
-    LIST_ELEMENT_INFO(kWebMIdTimeSlice, 4, kTimeSliceIds),
-    LIST_ELEMENT_INFO(kWebMIdTracks, 1, kTracksIds),
-    LIST_ELEMENT_INFO(kWebMIdTrackEntry, 2, kTrackEntryIds),
-    LIST_ELEMENT_INFO(kWebMIdTrackTranslate, 3, kTrackTranslateIds),
-    LIST_ELEMENT_INFO(kWebMIdVideo, 3, kVideoIds),
-    LIST_ELEMENT_INFO(kWebMIdAudio, 3, kAudioIds),
-    LIST_ELEMENT_INFO(kWebMIdTrackOperation, 3, kTrackOperationIds),
-    LIST_ELEMENT_INFO(kWebMIdTrackCombinePlanes, 4, kTrackCombinePlanesIds),
-    LIST_ELEMENT_INFO(kWebMIdTrackPlane, 5, kTrackPlaneIds),
-    LIST_ELEMENT_INFO(kWebMIdJoinBlocks, 4, kJoinBlocksIds),
-    LIST_ELEMENT_INFO(kWebMIdContentEncodings, 3, kContentEncodingsIds),
-    LIST_ELEMENT_INFO(kWebMIdContentEncoding, 4, kContentEncodingIds),
-    LIST_ELEMENT_INFO(kWebMIdContentCompression, 5, kContentCompressionIds),
-    LIST_ELEMENT_INFO(kWebMIdContentEncryption, 5, kContentEncryptionIds),
-    LIST_ELEMENT_INFO(kWebMIdContentEncAESSettings, 6,
-                      kContentEncAESSettingsIds),
-    LIST_ELEMENT_INFO(kWebMIdCues, 1, kCuesIds),
-    LIST_ELEMENT_INFO(kWebMIdCuePoint, 2, kCuePointIds),
-    LIST_ELEMENT_INFO(kWebMIdCueTrackPositions, 3, kCueTrackPositionsIds),
-    LIST_ELEMENT_INFO(kWebMIdCueReference, 4, kCueReferenceIds),
-    LIST_ELEMENT_INFO(kWebMIdAttachments, 1, kAttachmentsIds),
-    LIST_ELEMENT_INFO(kWebMIdAttachedFile, 2, kAttachedFileIds),
-    LIST_ELEMENT_INFO(kWebMIdChapters, 1, kChaptersIds),
-    LIST_ELEMENT_INFO(kWebMIdEditionEntry, 2, kEditionEntryIds),
-    LIST_ELEMENT_INFO(kWebMIdChapterAtom, 3, kChapterAtomIds),
-    LIST_ELEMENT_INFO(kWebMIdChapterTrack, 4, kChapterTrackIds),
-    LIST_ELEMENT_INFO(kWebMIdChapterDisplay, 4, kChapterDisplayIds),
-    LIST_ELEMENT_INFO(kWebMIdChapProcess, 4, kChapProcessIds),
-    LIST_ELEMENT_INFO(kWebMIdChapProcessCommand, 5, kChapProcessCommandIds),
-    LIST_ELEMENT_INFO(kWebMIdTags, 1, kTagsIds),
-    LIST_ELEMENT_INFO(kWebMIdTag, 2, kTagIds),
-    LIST_ELEMENT_INFO(kWebMIdTargets, 3, kTargetsIds),
-    LIST_ELEMENT_INFO(kWebMIdSimpleTag, 3, kSimpleTagIds),
-    LIST_ELEMENT_INFO(kWebMIdProjection, 4, kProjectionIds),
-    LIST_ELEMENT_INFO(kWebMIdColour, 4, kColourIds),
-    LIST_ELEMENT_INFO(kWebMIdMasteringMetadata, 5, kMasteringMetadataIds),
-};
-
-// Parses an element header id or size field. These fields are variable length
-// encoded. The first byte indicates how many bytes the field occupies.
-// |buf|  - The buffer to parse.
-// |size| - The number of bytes in |buf|
-// |max_bytes| - The maximum number of bytes the field can be. ID fields
-//               set this to 4 & element size fields set this to 8. If the
-//               first byte indicates a larger field size than this it is a
-//               parser error.
-// |mask_first_byte| - For element size fields the field length encoding bits
-//                     need to be masked off. This parameter is true for
-//                     element size fields and is false for ID field values.
-//
-// Returns: The number of bytes parsed on success. -1 on error.
-static int ParseWebMElementHeaderField(const uint8_t* buf, int size,
-                                       int max_bytes, bool mask_first_byte,
-                                       int64_t* num) {
-  DCHECK(buf);
-  DCHECK(num);
-
-  if (size < 0) return -1;
-
-  if (size == 0) return 0;
-
-  int mask = 0x80;
-  uint8_t ch = buf[0];
-  int extra_bytes = -1;
-  bool all_ones = false;
-  for (int i = 0; i < max_bytes; ++i) {
-    if ((ch & mask) != 0) {
-      mask = ~mask & 0xff;
-      *num = mask_first_byte ? ch & mask : ch;
-      all_ones = (ch & mask) == mask;
-      extra_bytes = i;
-      break;
-    }
-    mask = 0x80 | mask >> 1;
-  }
-
-  if (extra_bytes == -1) return -1;
-
-  // Return 0 if we need more data.
-  if ((1 + extra_bytes) > size) return 0;
-
-  int bytes_used = 1;
-
-  for (int i = 0; i < extra_bytes; ++i) {
-    ch = buf[bytes_used++];
-    all_ones &= (ch == 0xff);
-    *num = (*num << 8) | ch;
-  }
-
-  if (all_ones) *num = std::numeric_limits<int64_t>::max();
-
-  return bytes_used;
-}
-
-int WebMParseElementHeader(const uint8_t* buf, int size, int* id,
-                           int64_t* element_size) {
-  DCHECK(buf);
-  DCHECK_GE(size, 0);
-  DCHECK(id);
-  DCHECK(element_size);
-
-  if (size == 0) return 0;
-
-  int64_t tmp = 0;
-  int num_id_bytes = ParseWebMElementHeaderField(buf, size, 4, false, &tmp);
-
-  if (num_id_bytes <= 0) return num_id_bytes;
-
-  if (tmp == std::numeric_limits<int64_t>::max()) tmp = kWebMReservedId;
-
-  *id = static_cast<int>(tmp);
-
-  int num_size_bytes = ParseWebMElementHeaderField(
-      buf + num_id_bytes, size - num_id_bytes, 8, true, &tmp);
-
-  if (num_size_bytes <= 0) return num_size_bytes;
-
-  if (tmp == std::numeric_limits<int64_t>::max()) tmp = kWebMUnknownSize;
-
-  *element_size = tmp;
-  DVLOG(3) << "WebMParseElementHeader() : id " << std::hex << *id << std::dec
-           << " size " << *element_size;
-  return num_id_bytes + num_size_bytes;
-}
-
-// Finds ElementType for a specific ID.
-static ElementType FindIdType(int id, const ElementIdInfo* id_info,
-                              int id_info_count) {
-  // Check for global element IDs that can be anywhere.
-  if (id == kWebMIdVoid || id == kWebMIdCRC32) return SKIP;
-
-  for (int i = 0; i < id_info_count; ++i) {
-    if (id == id_info[i].id_) return id_info[i].type_;
-  }
-
-  return UNKNOWN;
-}
-
-// Finds ListElementInfo for a specific ID.
-static const ListElementInfo* FindListInfo(int id) {
-  for (size_t i = 0; i < arraysize(kListElementInfo); ++i) {
-    if (id == kListElementInfo[i].id_) return &kListElementInfo[i];
-  }
-
-  return NULL;
-}
-
-static int FindListLevel(int id) {
-  const ListElementInfo* list_info = FindListInfo(id);
-  if (list_info) return list_info->level_;
-
-  return -1;
-}
-
-static int ParseUInt(const uint8_t* buf, int size, int id,
-                     WebMParserClient* client) {
-  if ((size <= 0) || (size > 8)) return -1;
-
-  // Read in the big-endian integer.
-  uint64_t value = 0;
-  for (int i = 0; i < size; ++i) value = (value << 8) | buf[i];
-
-  // We use int64_t in place of uint64_t everywhere for convenience.  See this
-  // bug
-  // for more details: http://crbug.com/366750#c3
-  if (static_cast<int64_t>(value) < 0) return -1;
-
-  if (!client->OnUInt(id, value)) return -1;
-
-  return size;
-}
-
-static int ParseFloat(const uint8_t* buf, int size, int id,
-                      WebMParserClient* client) {
-  if ((size != 4) && (size != 8)) return -1;
-
-  double value = -1;
-
-  // Read the bytes from big-endian form into a native endian integer.
-  int64_t tmp = 0;
-  for (int i = 0; i < size; ++i) tmp = (tmp << 8) | buf[i];
-
-  // Use a union to convert the integer bit pattern into a floating point
-  // number.
-  if (size == 4) {
-    union {
-      int32_t src;
-      float dst;
-    } tmp2;
-    tmp2.src = static_cast<int32_t>(tmp);
-    value = tmp2.dst;
-  } else if (size == 8) {
-    union {
-      int64_t src;
-      double dst;
-    } tmp2;
-    tmp2.src = tmp;
-    value = tmp2.dst;
-  } else {
-    return -1;
-  }
-
-  if (!client->OnFloat(id, value)) return -1;
-
-  return size;
-}
-
-static int ParseBinary(const uint8_t* buf, int size, int id,
-                       WebMParserClient* client) {
-  return client->OnBinary(id, buf, size) ? size : -1;
-}
-
-static int ParseString(const uint8_t* buf, int size, int id,
-                       WebMParserClient* client) {
-  const uint8_t* end = static_cast<const uint8_t*>(memchr(buf, '\0', size));
-  int length = (end != NULL) ? static_cast<int>(end - buf) : size;
-  std::string str(reinterpret_cast<const char*>(buf), length);
-  return client->OnString(id, str) ? size : -1;
-}
-
-static int ParseNonListElement(ElementType type, int id, int64_t element_size,
-                               const uint8_t* buf, int size,
-                               WebMParserClient* client) {
-  DCHECK_GE(size, element_size);
-
-  int result = -1;
-  switch (type) {
-    case LIST:
-      NOTIMPLEMENTED();
-      result = -1;
-      break;
-    case UINT:
-      result = ParseUInt(buf, element_size, id, client);
-      break;
-    case FLOAT:
-      result = ParseFloat(buf, element_size, id, client);
-      break;
-    case BINARY:
-      result = ParseBinary(buf, element_size, id, client);
-      break;
-    case STRING:
-      result = ParseString(buf, element_size, id, client);
-      break;
-    case SKIP:
-      result = element_size;
-      break;
-    case UNKNOWN:
-      DVLOG(1) << "Unhandled ID type " << type;
-      return -1;
-  }
-
-  DCHECK_LE(result, size);
-  return result;
-}
-
-WebMParserClient::WebMParserClient() {}
-WebMParserClient::~WebMParserClient() {}
-
-WebMParserClient* WebMParserClient::OnListStart(int id) {
-  DVLOG(1) << "Unexpected list element start with ID " << std::hex << id;
-  return NULL;
-}
-
-bool WebMParserClient::OnListEnd(int id) {
-  DVLOG(1) << "Unexpected list element end with ID " << std::hex << id;
-  return false;
-}
-
-bool WebMParserClient::OnUInt(int id, int64_t val) {
-  DVLOG(1) << "Unexpected unsigned integer element with ID " << std::hex << id;
-  return false;
-}
-
-bool WebMParserClient::OnFloat(int id, double val) {
-  DVLOG(1) << "Unexpected float element with ID " << std::hex << id;
-  return false;
-}
-
-bool WebMParserClient::OnBinary(int id, const uint8_t* data, int size) {
-  DVLOG(1) << "Unexpected binary element with ID " << std::hex << id;
-  return false;
-}
-
-bool WebMParserClient::OnString(int id, const std::string& str) {
-  DVLOG(1) << "Unexpected string element with ID " << std::hex << id;
-  return false;
-}
-
-WebMListParser::WebMListParser(int id, WebMParserClient* client)
-    : state_(NEED_LIST_HEADER),
-      root_id_(id),
-      root_level_(FindListLevel(id)),
-      root_client_(client) {
-  DCHECK_GE(root_level_, 0);
-  DCHECK(client);
-}
-
-WebMListParser::~WebMListParser() {}
-
-void WebMListParser::Reset() {
-  ChangeState(NEED_LIST_HEADER);
-  list_state_stack_.clear();
-}
-
-int WebMListParser::Parse(const uint8_t* buf, int size) {
-  DCHECK(buf);
-
-  if (size < 0 || state_ == PARSE_ERROR || state_ == DONE_PARSING_LIST)
-    return -1;
-
-  if (size == 0) return 0;
-
-  const uint8_t* cur = buf;
-  int cur_size = size;
-  int bytes_parsed = 0;
-
-  while (cur_size > 0 && state_ != PARSE_ERROR && state_ != DONE_PARSING_LIST) {
-    int element_id = 0;
-    int64_t element_size = 0;
-    int result =
-        WebMParseElementHeader(cur, cur_size, &element_id, &element_size);
-
-    if (result < 0) return result;
-
-    if (result == 0) return bytes_parsed;
-
-    switch (state_) {
-      case NEED_LIST_HEADER: {
-        if (element_id != root_id_) {
-          ChangeState(PARSE_ERROR);
-          return -1;
-        }
-
-        // Only allow Segment & Cluster to have an unknown size.
-        if (element_size == kWebMUnknownSize &&
-            (element_id != kWebMIdSegment) && (element_id != kWebMIdCluster)) {
-          ChangeState(PARSE_ERROR);
-          return -1;
-        }
-
-        ChangeState(INSIDE_LIST);
-        if (!OnListStart(root_id_, element_size)) return -1;
-
-        break;
-      }
-
-      case INSIDE_LIST: {
-        int header_size = result;
-        const uint8_t* element_data = cur + header_size;
-        int element_data_size = cur_size - header_size;
-
-        if (element_size < element_data_size) element_data_size = element_size;
-
-        result = ParseListElement(header_size, element_id, element_size,
-                                  element_data, element_data_size);
-
-        DCHECK_LE(result, header_size + element_data_size);
-        if (result < 0) {
-          ChangeState(PARSE_ERROR);
-          return -1;
-        }
-
-        if (result == 0) return bytes_parsed;
-
-        break;
-      }
-      case DONE_PARSING_LIST:
-      case PARSE_ERROR:
-        // Shouldn't be able to get here.
-        NOTIMPLEMENTED();
-        break;
-    }
-
-    cur += result;
-    cur_size -= result;
-    bytes_parsed += result;
-  }
-
-  return (state_ == PARSE_ERROR) ? -1 : bytes_parsed;
-}
-
-bool WebMListParser::IsParsingComplete() const {
-  return state_ == DONE_PARSING_LIST;
-}
-
-void WebMListParser::ChangeState(State new_state) { state_ = new_state; }
-
-int WebMListParser::ParseListElement(int header_size, int id,
-                                     int64_t element_size, const uint8_t* data,
-                                     int size) {
-  DCHECK_GT(list_state_stack_.size(), 0u);
-
-  ListState& list_state = list_state_stack_.back();
-  DCHECK(list_state.element_info_);
-
-  const ListElementInfo* element_info = list_state.element_info_;
-  ElementType id_type =
-      FindIdType(id, element_info->id_info_, element_info->id_info_count_);
-
-  // Unexpected ID.
-  if (id_type == UNKNOWN) {
-    if (list_state.size_ != kWebMUnknownSize ||
-        !IsSiblingOrAncestor(list_state.id_, id)) {
-      DVLOG(1) << "No ElementType info for ID 0x" << std::hex << id;
-      return -1;
-    }
-
-    // We've reached the end of a list of unknown size. Update the size now that
-    // we know it and dispatch the end of list calls.
-    list_state.size_ = list_state.bytes_parsed_;
-
-    if (!OnListEnd()) return -1;
-
-    // Check to see if all open lists have ended.
-    if (list_state_stack_.size() == 0) return 0;
-
-    list_state = list_state_stack_.back();
-  }
-
-  // Make sure the whole element can fit inside the current list.
-  int64_t total_element_size = header_size + element_size;
-  if (list_state.size_ != kWebMUnknownSize &&
-      list_state.size_ < list_state.bytes_parsed_ + total_element_size) {
-    return -1;
-  }
-
-  if (id_type == LIST) {
-    list_state.bytes_parsed_ += header_size;
-
-    if (!OnListStart(id, element_size)) return -1;
-    return header_size;
-  }
-
-  // Make sure we have the entire element before trying to parse a non-list
-  // element.
-  if (size < element_size) return 0;
-
-  int bytes_parsed = ParseNonListElement(id_type, id, element_size, data, size,
-                                         list_state.client_);
-  DCHECK_LE(bytes_parsed, size);
-
-  // Return if an error occurred or we need more data.
-  // Note: bytes_parsed is 0 for a successful parse of a size 0 element. We
-  // need to check the element_size to disambiguate the "need more data" case
-  // from a successful parse.
-  if (bytes_parsed < 0 || (bytes_parsed == 0 && element_size != 0))
-    return bytes_parsed;
-
-  int result = header_size + bytes_parsed;
-  list_state.bytes_parsed_ += result;
-
-  // See if we have reached the end of the current list.
-  if (list_state.bytes_parsed_ == list_state.size_) {
-    if (!OnListEnd()) return -1;
-  }
-
-  return result;
-}
-
-bool WebMListParser::OnListStart(int id, int64_t size) {
-  const ListElementInfo* element_info = FindListInfo(id);
-  if (!element_info) return false;
-
-  int current_level = root_level_ + list_state_stack_.size() - 1;
-  if (current_level + 1 != element_info->level_) return false;
-
-  WebMParserClient* current_list_client = NULL;
-  if (!list_state_stack_.empty()) {
-    // Make sure the new list doesn't go past the end of the current list.
-    ListState current_list_state = list_state_stack_.back();
-    if (current_list_state.size_ != kWebMUnknownSize &&
-        current_list_state.size_ < current_list_state.bytes_parsed_ + size)
-      return false;
-    current_list_client = current_list_state.client_;
-  } else {
-    current_list_client = root_client_;
-  }
-
-  WebMParserClient* new_list_client = current_list_client->OnListStart(id);
-  if (!new_list_client) return false;
-
-  ListState new_list_state = {id, size, 0, element_info, new_list_client};
-  list_state_stack_.push_back(new_list_state);
-
-  if (size == 0) return OnListEnd();
-
-  return true;
-}
-
-bool WebMListParser::OnListEnd() {
-  int lists_ended = 0;
-  for (; !list_state_stack_.empty(); ++lists_ended) {
-    const ListState& list_state = list_state_stack_.back();
-    int64_t bytes_parsed = list_state.bytes_parsed_;
-    int id = list_state.id_;
-
-    if (bytes_parsed != list_state.size_) break;
-
-    list_state_stack_.pop_back();
-
-    WebMParserClient* client = NULL;
-    if (!list_state_stack_.empty()) {
-      // Update the bytes_parsed_ for the parent element.
-      list_state_stack_.back().bytes_parsed_ += bytes_parsed;
-      client = list_state_stack_.back().client_;
-    } else {
-      client = root_client_;
-    }
-
-    if (!client->OnListEnd(id)) return false;
-  }
-
-  DCHECK_GE(lists_ended, 1);
-
-  if (list_state_stack_.empty()) ChangeState(DONE_PARSING_LIST);
-
-  return true;
-}
-
-bool WebMListParser::IsSiblingOrAncestor(int id_a, int id_b) const {
-  DCHECK((id_a == kWebMIdSegment) || (id_a == kWebMIdCluster));
-
-  if (id_a == kWebMIdCluster) {
-    // kWebMIdCluster siblings.
-    for (size_t i = 0; i < arraysize(kSegmentIds); i++) {
-      if (kSegmentIds[i].id_ == id_b) return true;
-    }
-  }
-
-  // kWebMIdSegment siblings.
-  return ((id_b == kWebMIdSegment) || (id_b == kWebMIdEBMLHeader));
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_parser.h b/cobalt/media/formats/webm/webm_parser.h
deleted file mode 100644
index 90f4659..0000000
--- a/cobalt/media/formats/webm/webm_parser.h
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_PARSER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_PARSER_H_
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Interface for receiving WebM parser events.
-//
-// Each method is called when an element of the specified type is parsed.
-// The ID of the element that was parsed is given along with the value
-// stored in the element. List elements generate calls at the start and
-// end of the list. Any pointers passed to these methods are only guaranteed
-// to be valid for the life of that call. Each method (except for OnListStart)
-// returns a bool that indicates whether the parsed data is valid. OnListStart
-// returns a pointer to a WebMParserClient object, which should be used to
-// handle elements parsed out of the list being started. If false (or NULL by
-// OnListStart) is returned then the parse is immediately terminated and an
-// error is reported by the parser.
-class MEDIA_EXPORT WebMParserClient {
- public:
-  virtual ~WebMParserClient();
-
-  virtual WebMParserClient* OnListStart(int id);
-  virtual bool OnListEnd(int id);
-  virtual bool OnUInt(int id, int64_t val);
-  virtual bool OnFloat(int id, double val);
-  virtual bool OnBinary(int id, const uint8_t* data, int size);
-  virtual bool OnString(int id, const std::string& str);
-
- protected:
-  WebMParserClient();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(WebMParserClient);
-};
-
-struct ListElementInfo;
-
-// Parses a WebM list element and all of its children. This
-// class supports incremental parsing of the list so Parse()
-// can be called multiple times with pieces of the list.
-// IsParsingComplete() will return true once the entire list has
-// been parsed.
-class MEDIA_EXPORT WebMListParser {
- public:
-  // |id| - Element ID of the list we intend to parse.
-  // |client| - Called as different elements in the list are parsed.
-  WebMListParser(int id, WebMParserClient* client);
-  ~WebMListParser();
-
-  // Resets the state of the parser so it can start parsing a new list.
-  void Reset();
-
-  // Parses list data contained in |buf|.
-  //
-  // Returns < 0 if the parse fails.
-  // Returns 0 if more data is needed.
-  // Returning > 0 indicates success & the number of bytes parsed.
-  int Parse(const uint8_t* buf, int size);
-
-  // Returns true if the entire list has been parsed.
-  bool IsParsingComplete() const;
-
- private:
-  enum State {
-    NEED_LIST_HEADER,
-    INSIDE_LIST,
-    DONE_PARSING_LIST,
-    PARSE_ERROR,
-  };
-
-  struct ListState {
-    int id_;
-    int64_t size_;
-    int64_t bytes_parsed_;
-    const ListElementInfo* element_info_;
-    WebMParserClient* client_;
-  };
-
-  void ChangeState(State new_state);
-
-  // Parses a single element in the current list.
-  //
-  // |header_size| - The size of the element header
-  // |id| - The ID of the element being parsed.
-  // |element_size| - The size of the element body.
-  // |data| - Pointer to the element contents.
-  // |size| - Number of bytes in |data|
-  // |client| - Client to pass the parsed data to.
-  //
-  // Returns < 0 if the parse fails.
-  // Returns 0 if more data is needed.
-  // Returning > 0 indicates success & the number of bytes parsed.
-  int ParseListElement(int header_size, int id, int64_t element_size,
-                       const uint8_t* data, int size);
-
-  // Called when starting to parse a new list.
-  //
-  // |id| - The ID of the new list.
-  // |size| - The size of the new list.
-  // |client| - The client object to notify that a new list is being parsed.
-  //
-  // Returns true if this list can be started in the current context. False
-  // if starting this list causes some sort of parse error.
-  bool OnListStart(int id, int64_t size);
-
-  // Called when the end of the current list has been reached. This may also
-  // signal the end of the current list's ancestors if the current list happens
-  // to be at the end of its parent.
-  //
-  // Returns true if no errors occurred while ending this list(s).
-  bool OnListEnd();
-
-  // Checks to see if |id_b| is a sibling or ancestor of |id_a|.
-  bool IsSiblingOrAncestor(int id_a, int id_b) const;
-
-  State state_;
-
-  // Element ID passed to the constructor.
-  const int root_id_;
-
-  // Element level for |root_id_|. Used to verify that elements appear at
-  // the correct level.
-  const int root_level_;
-
-  // WebMParserClient to handle the root list.
-  WebMParserClient* const root_client_;
-
-  // Stack of state for all the lists currently being parsed. Lists are
-  // added and removed from this stack as they are parsed.
-  std::vector<ListState> list_state_stack_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebMListParser);
-};
-
-// Parses an element header & returns the ID and element size.
-//
-// Returns < 0 if the parse fails.
-// Returns 0 if more data is needed.
-// Returning > 0 indicates success & the number of bytes parsed.
-// |*id| contains the element ID on success and is undefined otherwise.
-// |*element_size| contains the element size on success and is undefined
-//                 otherwise.
-int MEDIA_EXPORT WebMParseElementHeader(const uint8_t* buf, int size, int* id,
-                                        int64_t* element_size);
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_PARSER_H_
diff --git a/cobalt/media/formats/webm/webm_parser_unittest.cc b/cobalt/media/formats/webm/webm_parser_unittest.cc
deleted file mode 100644
index a652841..0000000
--- a/cobalt/media/formats/webm/webm_parser_unittest.cc
+++ /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.
-
-#include "cobalt/media/formats/webm/webm_parser.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "base/basictypes.h"
-#include "cobalt/media/formats/webm/cluster_builder.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::InSequence;
-using ::testing::Return;
-using ::testing::ReturnNull;
-using ::testing::StrictMock;
-using ::testing::_;
-
-namespace cobalt {
-namespace media {
-
-enum { kBlockCount = 5 };
-
-class MockWebMParserClient : public WebMParserClient {
- public:
-  virtual ~MockWebMParserClient() {}
-
-  // WebMParserClient methods.
-  MOCK_METHOD1(OnListStart, WebMParserClient*(int));
-  MOCK_METHOD1(OnListEnd, bool(int));
-  MOCK_METHOD2(OnUInt, bool(int, int64_t));
-  MOCK_METHOD2(OnFloat, bool(int, double));
-  MOCK_METHOD3(OnBinary, bool(int, const uint8_t*, int));
-  MOCK_METHOD2(OnString, bool(int, const std::string&));
-};
-
-class WebMParserTest : public testing::Test {
- protected:
-  StrictMock<MockWebMParserClient> client_;
-};
-
-static std::unique_ptr<Cluster> CreateCluster(int block_count) {
-  ClusterBuilder cb;
-  cb.SetClusterTimecode(0);
-
-  for (int i = 0; i < block_count; i++) {
-    uint8_t data[] = {0x00};
-    cb.AddSimpleBlock(0, i, 0, data, sizeof(data));
-  }
-
-  return cb.Finish();
-}
-
-static void CreateClusterExpectations(int block_count, bool is_complete_cluster,
-                                      MockWebMParserClient* client) {
-  InSequence s;
-  EXPECT_CALL(*client, OnListStart(kWebMIdCluster)).WillOnce(Return(client));
-  EXPECT_CALL(*client, OnUInt(kWebMIdTimecode, 0)).WillOnce(Return(true));
-
-  for (int i = 0; i < block_count; i++) {
-    EXPECT_CALL(*client, OnBinary(kWebMIdSimpleBlock, _, _))
-        .WillOnce(Return(true));
-  }
-
-  if (is_complete_cluster)
-    EXPECT_CALL(*client, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
-}
-
-TEST_F(WebMParserTest, EmptyCluster) {
-  const uint8_t kEmptyCluster[] = {
-      0x1F, 0x43, 0xB6, 0x75, 0x80  // CLUSTER (size = 0)
-  };
-  int size = sizeof(kEmptyCluster);
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
-  EXPECT_CALL(client_, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
-
-  WebMListParser parser(kWebMIdCluster, &client_);
-  EXPECT_EQ(size, parser.Parse(kEmptyCluster, size));
-  EXPECT_TRUE(parser.IsParsingComplete());
-}
-
-TEST_F(WebMParserTest, EmptyClusterInSegment) {
-  const uint8_t kBuffer[] = {
-      0x18, 0x53, 0x80, 0x67, 0x85,  // SEGMENT (size = 5)
-      0x1F, 0x43, 0xB6, 0x75, 0x80,  // CLUSTER (size = 0)
-  };
-  int size = sizeof(kBuffer);
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&client_));
-  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
-  EXPECT_CALL(client_, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
-  EXPECT_CALL(client_, OnListEnd(kWebMIdSegment)).WillOnce(Return(true));
-
-  WebMListParser parser(kWebMIdSegment, &client_);
-  EXPECT_EQ(size, parser.Parse(kBuffer, size));
-  EXPECT_TRUE(parser.IsParsingComplete());
-}
-
-// Test the case where a non-list child element has a size
-// that is beyond the end of the parent.
-TEST_F(WebMParserTest, ChildNonListLargerThanParent) {
-  const uint8_t kBuffer[] = {
-      0x1F, 0x43, 0xB6, 0x75, 0x81,  // CLUSTER (size = 1)
-      0xE7, 0x81, 0x01,              // Timecode (size=1, value=1)
-  };
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
-
-  WebMListParser parser(kWebMIdCluster, &client_);
-  EXPECT_EQ(-1, parser.Parse(kBuffer, sizeof(kBuffer)));
-  EXPECT_FALSE(parser.IsParsingComplete());
-}
-
-// Test the case where a list child element has a size
-// that is beyond the end of the parent.
-TEST_F(WebMParserTest, ChildListLargerThanParent) {
-  const uint8_t kBuffer[] = {
-      0x18, 0x53, 0x80, 0x67, 0x85,  // SEGMENT (size = 5)
-      0x1F, 0x43, 0xB6, 0x75, 0x81,
-      0x11  // CLUSTER (size = 1)
-  };
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&client_));
-
-  WebMListParser parser(kWebMIdSegment, &client_);
-  EXPECT_EQ(-1, parser.Parse(kBuffer, sizeof(kBuffer)));
-  EXPECT_FALSE(parser.IsParsingComplete());
-}
-
-// Expecting to parse a Cluster, but get a Segment.
-TEST_F(WebMParserTest, ListIdDoesNotMatch) {
-  const uint8_t kBuffer[] = {
-      0x18, 0x53, 0x80, 0x67, 0x80,  // SEGMENT (size = 0)
-  };
-
-  WebMListParser parser(kWebMIdCluster, &client_);
-  EXPECT_EQ(-1, parser.Parse(kBuffer, sizeof(kBuffer)));
-  EXPECT_FALSE(parser.IsParsingComplete());
-}
-
-TEST_F(WebMParserTest, InvalidElementInList) {
-  const uint8_t kBuffer[] = {
-      0x18, 0x53, 0x80, 0x67, 0x82,  // SEGMENT (size = 2)
-      0xAE, 0x80,                    // TrackEntry (size = 0)
-  };
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&client_));
-
-  WebMListParser parser(kWebMIdSegment, &client_);
-  EXPECT_EQ(-1, parser.Parse(kBuffer, sizeof(kBuffer)));
-  EXPECT_FALSE(parser.IsParsingComplete());
-}
-
-// Test specific case of InvalidElementInList to verify EBMLHEADER within
-// known-sized cluster causes parse error.
-TEST_F(WebMParserTest, InvalidEBMLHeaderInCluster) {
-  const uint8_t kBuffer[] = {
-      0x1F, 0x43, 0xB6, 0x75, 0x85,  // CLUSTER (size = 5)
-      0x1A, 0x45, 0xDF, 0xA3, 0x80,  // EBMLHEADER (size = 0)
-  };
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
-
-  WebMListParser parser(kWebMIdCluster, &client_);
-  EXPECT_EQ(-1, parser.Parse(kBuffer, sizeof(kBuffer)));
-  EXPECT_FALSE(parser.IsParsingComplete());
-}
-
-// Verify that EBMLHEADER ends a preceding "unknown"-sized CLUSTER.
-TEST_F(WebMParserTest, UnknownSizeClusterFollowedByEBMLHeader) {
-  const uint8_t kBuffer[] = {
-      0x1F, 0x43, 0xB6,
-      0x75, 0xFF,  // CLUSTER (size = unknown; really 0 due to:)
-      0x1A, 0x45, 0xDF,
-      0xA3, 0x80,  // EBMLHEADER (size = 0)
-  };
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
-  EXPECT_CALL(client_, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
-
-  WebMListParser parser(kWebMIdCluster, &client_);
-
-  // List parse should consume the CLUSTER but not the EBMLHEADER.
-  EXPECT_EQ(5, parser.Parse(kBuffer, sizeof(kBuffer)));
-  EXPECT_TRUE(parser.IsParsingComplete());
-}
-
-TEST_F(WebMParserTest, VoidAndCRC32InList) {
-  const uint8_t kBuffer[] = {
-      0x18, 0x53, 0x80, 0x67, 0x99,  // SEGMENT (size = 25)
-      0xEC, 0x83, 0x00, 0x00, 0x00,  // Void (size = 3)
-      0xBF, 0x83, 0x00, 0x00, 0x00,  // CRC32 (size = 3)
-      0x1F, 0x43, 0xB6, 0x75, 0x8A,  // CLUSTER (size = 10)
-      0xEC, 0x83, 0x00, 0x00, 0x00,  // Void (size = 3)
-      0xBF, 0x83, 0x00, 0x00, 0x00,  // CRC32 (size = 3)
-  };
-  int size = sizeof(kBuffer);
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&client_));
-  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
-  EXPECT_CALL(client_, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
-  EXPECT_CALL(client_, OnListEnd(kWebMIdSegment)).WillOnce(Return(true));
-
-  WebMListParser parser(kWebMIdSegment, &client_);
-  EXPECT_EQ(size, parser.Parse(kBuffer, size));
-  EXPECT_TRUE(parser.IsParsingComplete());
-}
-
-TEST_F(WebMParserTest, ParseListElementWithSingleCall) {
-  std::unique_ptr<Cluster> cluster(CreateCluster(kBlockCount));
-  CreateClusterExpectations(kBlockCount, true, &client_);
-
-  WebMListParser parser(kWebMIdCluster, &client_);
-  EXPECT_EQ(cluster->size(), parser.Parse(cluster->data(), cluster->size()));
-  EXPECT_TRUE(parser.IsParsingComplete());
-}
-
-TEST_F(WebMParserTest, ParseListElementWithMultipleCalls) {
-  std::unique_ptr<Cluster> cluster(CreateCluster(kBlockCount));
-  CreateClusterExpectations(kBlockCount, true, &client_);
-
-  const uint8_t* data = cluster->data();
-  int size = cluster->size();
-  int default_parse_size = 3;
-  WebMListParser parser(kWebMIdCluster, &client_);
-  int parse_size = std::min(default_parse_size, size);
-
-  while (size > 0) {
-    int result = parser.Parse(data, parse_size);
-    ASSERT_GE(result, 0);
-    ASSERT_LE(result, parse_size);
-
-    if (result == 0) {
-      // The parser needs more data so increase the parse_size a little.
-      EXPECT_FALSE(parser.IsParsingComplete());
-      parse_size += default_parse_size;
-      parse_size = std::min(parse_size, size);
-      continue;
-    }
-
-    parse_size = default_parse_size;
-
-    data += result;
-    size -= result;
-
-    EXPECT_EQ((size == 0), parser.IsParsingComplete());
-  }
-  EXPECT_TRUE(parser.IsParsingComplete());
-}
-
-TEST_F(WebMParserTest, Reset) {
-  InSequence s;
-  std::unique_ptr<Cluster> cluster(CreateCluster(kBlockCount));
-
-  // First expect all but the last block.
-  CreateClusterExpectations(kBlockCount - 1, false, &client_);
-
-  // Now expect all blocks.
-  CreateClusterExpectations(kBlockCount, true, &client_);
-
-  WebMListParser parser(kWebMIdCluster, &client_);
-
-  // Send slightly less than the full cluster so all but the last block is
-  // parsed.
-  int result = parser.Parse(cluster->data(), cluster->size() - 1);
-  EXPECT_GT(result, 0);
-  EXPECT_LT(result, cluster->size());
-  EXPECT_FALSE(parser.IsParsingComplete());
-
-  parser.Reset();
-
-  // Now parse a whole cluster to verify that all the blocks will get parsed.
-  EXPECT_EQ(cluster->size(), parser.Parse(cluster->data(), cluster->size()));
-  EXPECT_TRUE(parser.IsParsingComplete());
-}
-
-// Test the case where multiple clients are used for different lists.
-TEST_F(WebMParserTest, MultipleClients) {
-  const uint8_t kBuffer[] = {
-      0x18, 0x53, 0x80, 0x67, 0x94,  // SEGMENT (size = 20)
-      0x16, 0x54, 0xAE, 0x6B, 0x85,  //   TRACKS (size = 5)
-      0xAE, 0x83,                    //     TRACKENTRY (size = 3)
-      0xD7, 0x81, 0x01,              //       TRACKNUMBER (size = 1)
-      0x1F, 0x43, 0xB6, 0x75, 0x85,  //   CLUSTER (size = 5)
-      0xEC, 0x83, 0x00, 0x00, 0x00,  //     Void (size = 3)
-  };
-  int size = sizeof(kBuffer);
-
-  StrictMock<MockWebMParserClient> c1_;
-  StrictMock<MockWebMParserClient> c2_;
-  StrictMock<MockWebMParserClient> c3_;
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&c1_));
-  EXPECT_CALL(c1_, OnListStart(kWebMIdTracks)).WillOnce(Return(&c2_));
-  EXPECT_CALL(c2_, OnListStart(kWebMIdTrackEntry)).WillOnce(Return(&c3_));
-  EXPECT_CALL(c3_, OnUInt(kWebMIdTrackNumber, 1)).WillOnce(Return(true));
-  EXPECT_CALL(c2_, OnListEnd(kWebMIdTrackEntry)).WillOnce(Return(true));
-  EXPECT_CALL(c1_, OnListEnd(kWebMIdTracks)).WillOnce(Return(true));
-  EXPECT_CALL(c1_, OnListStart(kWebMIdCluster)).WillOnce(Return(&c2_));
-  EXPECT_CALL(c1_, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
-  EXPECT_CALL(client_, OnListEnd(kWebMIdSegment)).WillOnce(Return(true));
-
-  WebMListParser parser(kWebMIdSegment, &client_);
-  EXPECT_EQ(size, parser.Parse(kBuffer, size));
-  EXPECT_TRUE(parser.IsParsingComplete());
-}
-
-// Test the case where multiple clients are used for different lists.
-TEST_F(WebMParserTest, InvalidClient) {
-  const uint8_t kBuffer[] = {
-      0x18, 0x53, 0x80, 0x67, 0x85,  // SEGMENT (size = 20)
-      0x16, 0x54, 0xAE, 0x6B, 0x80,  //   TRACKS (size = 5)
-  };
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(ReturnNull());
-
-  WebMListParser parser(kWebMIdSegment, &client_);
-  EXPECT_EQ(-1, parser.Parse(kBuffer, sizeof(kBuffer)));
-  EXPECT_FALSE(parser.IsParsingComplete());
-}
-
-TEST_F(WebMParserTest, ReservedIds) {
-  const uint8_t k1ByteReservedId[] = {0xFF, 0x81};
-  const uint8_t k2ByteReservedId[] = {0x7F, 0xFF, 0x81};
-  const uint8_t k3ByteReservedId[] = {0x3F, 0xFF, 0xFF, 0x81};
-  const uint8_t k4ByteReservedId[] = {0x1F, 0xFF, 0xFF, 0xFF, 0x81};
-  const uint8_t* kBuffers[] = {k1ByteReservedId, k2ByteReservedId,
-                               k3ByteReservedId, k4ByteReservedId};
-
-  for (size_t i = 0; i < arraysize(kBuffers); i++) {
-    int id;
-    int64_t element_size;
-    int buffer_size = 2 + i;
-    EXPECT_EQ(buffer_size, WebMParseElementHeader(kBuffers[i], buffer_size, &id,
-                                                  &element_size));
-    EXPECT_EQ(id, kWebMReservedId);
-    EXPECT_EQ(element_size, 1);
-  }
-}
-
-TEST_F(WebMParserTest, ReservedSizes) {
-  const uint8_t k1ByteReservedSize[] = {0xA3, 0xFF};
-  const uint8_t k2ByteReservedSize[] = {0xA3, 0x7F, 0xFF};
-  const uint8_t k3ByteReservedSize[] = {0xA3, 0x3F, 0xFF, 0xFF};
-  const uint8_t k4ByteReservedSize[] = {0xA3, 0x1F, 0xFF, 0xFF, 0xFF};
-  const uint8_t k5ByteReservedSize[] = {0xA3, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF};
-  const uint8_t k6ByteReservedSize[] = {0xA3, 0x07, 0xFF, 0xFF,
-                                        0xFF, 0xFF, 0xFF};
-  const uint8_t k7ByteReservedSize[] = {0xA3, 0x03, 0xFF, 0xFF,
-                                        0xFF, 0xFF, 0xFF, 0xFF};
-  const uint8_t k8ByteReservedSize[] = {0xA3, 0x01, 0xFF, 0xFF, 0xFF,
-                                        0xFF, 0xFF, 0xFF, 0xFF};
-  const uint8_t* kBuffers[] = {k1ByteReservedSize, k2ByteReservedSize,
-                               k3ByteReservedSize, k4ByteReservedSize,
-                               k5ByteReservedSize, k6ByteReservedSize,
-                               k7ByteReservedSize, k8ByteReservedSize};
-
-  for (size_t i = 0; i < arraysize(kBuffers); i++) {
-    int id;
-    int64_t element_size;
-    int buffer_size = 2 + i;
-    EXPECT_EQ(buffer_size, WebMParseElementHeader(kBuffers[i], buffer_size, &id,
-                                                  &element_size));
-    EXPECT_EQ(id, 0xA3);
-    EXPECT_EQ(element_size, kWebMUnknownSize);
-  }
-}
-
-TEST_F(WebMParserTest, ZeroPaddedStrings) {
-  const uint8_t kBuffer[] = {
-      0x1A, 0x45, 0xDF, 0xA3, 0x91,  // EBMLHEADER (size = 17)
-      0x42, 0x82, 0x80,              // DocType (size = 0)
-      0x42, 0x82, 0x81, 0x00,        // DocType (size = 1) ""
-      0x42, 0x82, 0x81, 'a',         // DocType (size = 1) "a"
-      0x42, 0x82, 0x83, 'a',  0x00,
-      0x00  // DocType (size = 3) "a"
-  };
-  int size = sizeof(kBuffer);
-
-  InSequence s;
-  EXPECT_CALL(client_, OnListStart(kWebMIdEBMLHeader))
-      .WillOnce(Return(&client_));
-  EXPECT_CALL(client_, OnString(kWebMIdDocType, "")).WillOnce(Return(true));
-  EXPECT_CALL(client_, OnString(kWebMIdDocType, "")).WillOnce(Return(true));
-  EXPECT_CALL(client_, OnString(kWebMIdDocType, "a")).WillOnce(Return(true));
-  EXPECT_CALL(client_, OnString(kWebMIdDocType, "a")).WillOnce(Return(true));
-  EXPECT_CALL(client_, OnListEnd(kWebMIdEBMLHeader)).WillOnce(Return(true));
-
-  WebMListParser parser(kWebMIdEBMLHeader, &client_);
-  EXPECT_EQ(size, parser.Parse(kBuffer, size));
-  EXPECT_TRUE(parser.IsParsingComplete());
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_stream_parser.cc b/cobalt/media/formats/webm/webm_stream_parser.cc
deleted file mode 100644
index 4451c6c..0000000
--- a/cobalt/media/formats/webm/webm_stream_parser.cc
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/webm_stream_parser.h"
-
-#include <memory>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "cobalt/media/base/media_track.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/webm/webm_cluster_parser.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "cobalt/media/formats/webm/webm_content_encodings.h"
-#include "cobalt/media/formats/webm/webm_info_parser.h"
-#include "cobalt/media/formats/webm/webm_tracks_parser.h"
-
-namespace cobalt {
-namespace media {
-
-WebMStreamParser::WebMStreamParser(DecoderBuffer::Allocator* buffer_allocator)
-    : buffer_allocator_(buffer_allocator),
-      state_(kWaitingForInit),
-      unknown_segment_size_(false) {
-  DCHECK(buffer_allocator_);
-}
-
-WebMStreamParser::~WebMStreamParser() {}
-
-void WebMStreamParser::Init(
-    const InitCB& init_cb, const NewConfigCB& config_cb,
-    const NewBuffersCB& new_buffers_cb, bool ignore_text_tracks,
-    const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-    const NewMediaSegmentCB& new_segment_cb,
-    const EndMediaSegmentCB& end_of_segment_cb,
-    const scoped_refptr<MediaLog>& media_log) {
-  DCHECK_EQ(state_, kWaitingForInit);
-  DCHECK(init_cb_.is_null());
-  DCHECK(!init_cb.is_null());
-  DCHECK(!config_cb.is_null());
-  DCHECK(!new_buffers_cb.is_null());
-  DCHECK(!encrypted_media_init_data_cb.is_null());
-  DCHECK(!new_segment_cb.is_null());
-  DCHECK(!end_of_segment_cb.is_null());
-
-  ChangeState(kParsingHeaders);
-  init_cb_ = init_cb;
-  config_cb_ = config_cb;
-  new_buffers_cb_ = new_buffers_cb;
-  ignore_text_tracks_ = ignore_text_tracks;
-  encrypted_media_init_data_cb_ = encrypted_media_init_data_cb;
-  new_segment_cb_ = new_segment_cb;
-  end_of_segment_cb_ = end_of_segment_cb;
-  media_log_ = media_log;
-}
-
-void WebMStreamParser::Flush() {
-  DCHECK_NE(state_, kWaitingForInit);
-
-  byte_queue_.Reset();
-  if (cluster_parser_) cluster_parser_->Reset();
-  if (state_ == kParsingClusters) ChangeState(kParsingHeaders);
-}
-
-bool WebMStreamParser::Parse(const uint8_t* buf, int size) {
-  DCHECK_NE(state_, kWaitingForInit);
-
-  if (state_ == kError) return false;
-
-  byte_queue_.Push(buf, size);
-
-  int result = 0;
-  int bytes_parsed = 0;
-  const uint8_t* cur = NULL;
-  int cur_size = 0;
-
-  byte_queue_.Peek(&cur, &cur_size);
-  while (cur_size > 0) {
-    State oldState = state_;
-    switch (state_) {
-      case kParsingHeaders:
-        result = ParseInfoAndTracks(cur, cur_size);
-        break;
-
-      case kParsingClusters:
-        result = ParseCluster(cur, cur_size);
-        break;
-
-      case kWaitingForInit:
-      case kError:
-        return false;
-    }
-
-    if (result < 0) {
-      ChangeState(kError);
-      return false;
-    }
-
-    if (state_ == oldState && result == 0) break;
-
-    DCHECK_GE(result, 0);
-    cur += result;
-    cur_size -= result;
-    bytes_parsed += result;
-  }
-
-  byte_queue_.Pop(bytes_parsed);
-  return true;
-}
-
-void WebMStreamParser::ChangeState(State new_state) {
-  DVLOG(1) << "ChangeState() : " << state_ << " -> " << new_state;
-  state_ = new_state;
-}
-
-int WebMStreamParser::ParseInfoAndTracks(const uint8_t* data, int size) {
-  DVLOG(2) << "ParseInfoAndTracks()";
-  DCHECK(data);
-  DCHECK_GT(size, 0);
-
-  const uint8_t* cur = data;
-  int cur_size = size;
-  int bytes_parsed = 0;
-
-  int id;
-  int64_t element_size;
-  int result = WebMParseElementHeader(cur, cur_size, &id, &element_size);
-
-  if (result <= 0) return result;
-
-  switch (id) {
-    case kWebMIdEBMLHeader:
-    case kWebMIdSeekHead:
-    case kWebMIdVoid:
-    case kWebMIdCRC32:
-    case kWebMIdCues:
-    case kWebMIdChapters:
-    case kWebMIdTags:
-    case kWebMIdAttachments:
-      // TODO(matthewjheaney): Implement support for chapters.
-      if (cur_size < (result + element_size)) {
-        // We don't have the whole element yet. Signal we need more data.
-        return 0;
-      }
-      // Skip the element.
-      return result + element_size;
-      break;
-    case kWebMIdCluster:
-      if (!cluster_parser_) {
-        MEDIA_LOG(ERROR, media_log_) << "Found Cluster element before Info.";
-        return -1;
-      }
-      ChangeState(kParsingClusters);
-      new_segment_cb_.Run();
-      return 0;
-      break;
-    case kWebMIdSegment:
-      // Segment of unknown size indicates live stream.
-      if (element_size == kWebMUnknownSize) unknown_segment_size_ = true;
-      // Just consume the segment header.
-      return result;
-      break;
-    case kWebMIdInfo:
-      // We've found the element we are looking for.
-      break;
-    default: {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Unexpected element ID 0x" << std::hex << id;
-      return -1;
-    }
-  }
-
-  WebMInfoParser info_parser;
-  result = info_parser.Parse(cur, cur_size);
-
-  if (result <= 0) return result;
-
-  cur += result;
-  cur_size -= result;
-  bytes_parsed += result;
-
-  WebMTracksParser tracks_parser(media_log_, ignore_text_tracks_);
-  result = tracks_parser.Parse(cur, cur_size);
-
-  if (result <= 0) return result;
-
-  bytes_parsed += result;
-
-  double timecode_scale_in_us = info_parser.timecode_scale() / 1000.0;
-  InitParameters params(kInfiniteDuration);
-
-  if (info_parser.duration() > 0) {
-    int64_t duration_in_us = info_parser.duration() * timecode_scale_in_us;
-    params.duration = base::TimeDelta::FromMicroseconds(duration_in_us);
-  }
-
-  params.timeline_offset = info_parser.date_utc();
-
-  if (unknown_segment_size_ && (info_parser.duration() <= 0) &&
-      !info_parser.date_utc().is_null()) {
-    params.liveness = DemuxerStream::LIVENESS_LIVE;
-  } else if (info_parser.duration() >= 0) {
-    params.liveness = DemuxerStream::LIVENESS_RECORDED;
-  } else {
-    params.liveness = DemuxerStream::LIVENESS_UNKNOWN;
-  }
-
-  const AudioDecoderConfig& audio_config = tracks_parser.audio_decoder_config();
-  if (audio_config.is_encrypted())
-    OnEncryptedMediaInitData(tracks_parser.audio_encryption_key_id());
-
-  const VideoDecoderConfig& video_config = tracks_parser.video_decoder_config();
-  if (video_config.is_encrypted())
-    OnEncryptedMediaInitData(tracks_parser.video_encryption_key_id());
-
-  std::unique_ptr<MediaTracks> media_tracks = tracks_parser.media_tracks();
-  CHECK(media_tracks.get());
-  if (!config_cb_.Run(std::move(media_tracks), tracks_parser.text_tracks())) {
-    DVLOG(1) << "New config data isn't allowed.";
-    return -1;
-  }
-
-  cluster_parser_.reset(new WebMClusterParser(
-      buffer_allocator_, info_parser.timecode_scale(),
-      tracks_parser.audio_track_num(),
-      tracks_parser.GetAudioDefaultDuration(timecode_scale_in_us),
-      tracks_parser.video_track_num(),
-      tracks_parser.GetVideoDefaultDuration(timecode_scale_in_us),
-      tracks_parser.text_tracks(), tracks_parser.ignored_tracks(),
-      tracks_parser.audio_encryption_key_id(),
-      tracks_parser.video_encryption_key_id(), audio_config.codec(),
-      media_log_));
-
-  if (!init_cb_.is_null()) {
-    params.detected_audio_track_count =
-        tracks_parser.detected_audio_track_count();
-    params.detected_video_track_count =
-        tracks_parser.detected_video_track_count();
-    params.detected_text_track_count =
-        tracks_parser.detected_text_track_count();
-    base::ResetAndReturn(&init_cb_).Run(params);
-  }
-
-  return bytes_parsed;
-}
-
-int WebMStreamParser::ParseCluster(const uint8_t* data, int size) {
-  if (!cluster_parser_) return -1;
-
-  int bytes_parsed = cluster_parser_->Parse(data, size);
-  if (bytes_parsed < 0) return bytes_parsed;
-
-  BufferQueueMap buffer_queue_map;
-  cluster_parser_->GetBuffers(&buffer_queue_map);
-
-  bool cluster_ended = cluster_parser_->cluster_ended();
-
-  if (!buffer_queue_map.empty() && !new_buffers_cb_.Run(buffer_queue_map)) {
-    return -1;
-  }
-
-  if (cluster_ended) {
-    ChangeState(kParsingHeaders);
-    end_of_segment_cb_.Run();
-  }
-
-  return bytes_parsed;
-}
-
-void WebMStreamParser::OnEncryptedMediaInitData(const std::string& key_id) {
-  std::vector<uint8_t> key_id_vector(key_id.begin(), key_id.end());
-  encrypted_media_init_data_cb_.Run(kEmeInitDataTypeWebM, key_id_vector);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_stream_parser.h b/cobalt/media/formats/webm/webm_stream_parser.h
deleted file mode 100644
index 8c982ab..0000000
--- a/cobalt/media/formats/webm/webm_stream_parser.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_STREAM_PARSER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_STREAM_PARSER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/callback_forward.h"
-#include "base/memory/ref_counted.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/byte_queue.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class WebMClusterParser;
-
-class MEDIA_EXPORT WebMStreamParser : public StreamParser {
- public:
-  explicit WebMStreamParser(DecoderBuffer::Allocator* buffer_allocator);
-  ~WebMStreamParser() override;
-
-  // StreamParser implementation.
-  void Init(const InitCB& init_cb, const NewConfigCB& config_cb,
-            const NewBuffersCB& new_buffers_cb, bool ignore_text_tracks,
-            const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
-            const NewMediaSegmentCB& new_segment_cb,
-            const EndMediaSegmentCB& end_of_segment_cb,
-            const scoped_refptr<MediaLog>& media_log) override;
-  void Flush() override;
-  bool Parse(const uint8_t* buf, int size) override;
-
- private:
-  enum State { kWaitingForInit, kParsingHeaders, kParsingClusters, kError };
-
-  void ChangeState(State new_state);
-
-  // Parses WebM Header, Info, Tracks elements. It also skips other level 1
-  // elements that are not used right now. Once the Info & Tracks elements have
-  // been parsed, this method will transition the parser from PARSING_HEADERS to
-  // PARSING_CLUSTERS.
-  //
-  // Returns < 0 if the parse fails.
-  // Returns 0 if more data is needed.
-  // Returning > 0 indicates success & the number of bytes parsed.
-  int ParseInfoAndTracks(const uint8_t* data, int size);
-
-  // Incrementally parses WebM cluster elements. This method also skips
-  // CUES elements if they are encountered since we currently don't use the
-  // data in these elements.
-  //
-  // Returns < 0 if the parse fails.
-  // Returns 0 if more data is needed.
-  // Returning > 0 indicates success & the number of bytes parsed.
-  int ParseCluster(const uint8_t* data, int size);
-
-  // Fire the encrypted event through the |encrypted_media_init_data_cb_|.
-  void OnEncryptedMediaInitData(const std::string& key_id);
-
-  DecoderBuffer::Allocator* buffer_allocator_;
-  State state_;
-  InitCB init_cb_;
-  NewConfigCB config_cb_;
-  NewBuffersCB new_buffers_cb_;
-  bool ignore_text_tracks_;
-  EncryptedMediaInitDataCB encrypted_media_init_data_cb_;
-
-  NewMediaSegmentCB new_segment_cb_;
-  EndMediaSegmentCB end_of_segment_cb_;
-  scoped_refptr<MediaLog> media_log_;
-
-  bool unknown_segment_size_;
-
-  std::unique_ptr<WebMClusterParser> cluster_parser_;
-  ByteQueue byte_queue_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebMStreamParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_STREAM_PARSER_H_
diff --git a/cobalt/media/formats/webm/webm_stream_parser_unittest.cc b/cobalt/media/formats/webm/webm_stream_parser_unittest.cc
deleted file mode 100644
index abf867d..0000000
--- a/cobalt/media/formats/webm/webm_stream_parser_unittest.cc
+++ /dev/null
@@ -1,200 +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 "cobalt/media/formats/webm/webm_stream_parser.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/base/stream_parser.h"
-#include "cobalt/media/base/test_data_util.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::SaveArg;
-using testing::_;
-
-namespace cobalt {
-namespace media {
-
-class WebMStreamParserTest : public testing::Test {
- public:
-  WebMStreamParserTest()
-      : media_log_(new testing::StrictMock<MockMediaLog>()) {}
-
- protected:
-  void ParseWebMFile(const std::string& filename,
-                     const StreamParser::InitParameters& expected_params) {
-    scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename);
-    parser_.reset(new WebMStreamParser());
-    Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb =
-        base::Bind(&WebMStreamParserTest::OnEncryptedMediaInitData,
-                   base::Unretained(this));
-
-    EXPECT_CALL(*this, InitCB(_));
-    EXPECT_CALL(*this, NewMediaSegmentCB()).Times(testing::AnyNumber());
-    EXPECT_CALL(*this, EndMediaSegmentCB()).Times(testing::AnyNumber());
-    EXPECT_CALL(*this, NewBuffersCB(_))
-        .Times(testing::AnyNumber())
-        .WillRepeatedly(testing::Return(true));
-    parser_->Init(
-        base::Bind(&WebMStreamParserTest::InitF, base::Unretained(this),
-                   expected_params),
-        base::Bind(&WebMStreamParserTest::NewConfigCB, base::Unretained(this)),
-        base::Bind(&WebMStreamParserTest::NewBuffersCB, base::Unretained(this)),
-        false,  // don't ignore_text_track
-        encrypted_media_init_data_cb,
-        base::Bind(&WebMStreamParserTest::NewMediaSegmentCB,
-                   base::Unretained(this)),
-        base::Bind(&WebMStreamParserTest::EndMediaSegmentCB,
-                   base::Unretained(this)),
-        media_log_);
-    bool result = parser_->Parse(buffer->data(), buffer->data_size());
-    EXPECT_TRUE(result);
-  }
-
-  // Verifies only the detected track counts by track type, then chains to the
-  // InitCB mock.
-  void InitF(const StreamParser::InitParameters& expected_params,
-             const StreamParser::InitParameters& params) {
-    EXPECT_EQ(expected_params.detected_audio_track_count,
-              params.detected_audio_track_count);
-    EXPECT_EQ(expected_params.detected_video_track_count,
-              params.detected_video_track_count);
-    EXPECT_EQ(expected_params.detected_text_track_count,
-              params.detected_text_track_count);
-    InitCB(params);
-  }
-
-  MOCK_METHOD1(InitCB, void(const StreamParser::InitParameters& params));
-
-  bool NewConfigCB(std::unique_ptr<MediaTracks> tracks,
-                   const StreamParser::TextTrackConfigMap& text_track_map) {
-    DCHECK(tracks.get());
-    media_tracks_ = std::move(tracks);
-    return true;
-  }
-
-  MOCK_METHOD1(NewBuffersCB, bool(const StreamParser::BufferQueueMap&));
-  MOCK_METHOD2(OnEncryptedMediaInitData,
-               void(EmeInitDataType init_data_type,
-                    const std::vector<uint8_t>& init_data));
-  MOCK_METHOD0(NewMediaSegmentCB, void());
-  MOCK_METHOD0(EndMediaSegmentCB, void());
-
-  scoped_refptr<testing::StrictMock<MockMediaLog>> media_log_;
-  std::unique_ptr<WebMStreamParser> parser_;
-  std::unique_ptr<MediaTracks> media_tracks_;
-};
-
-TEST_F(WebMStreamParserTest, VerifyMediaTrackMetadata) {
-  EXPECT_MEDIA_LOG(testing::HasSubstr("Estimating WebM block duration"))
-      .Times(testing::AnyNumber());
-  StreamParser::InitParameters params(kInfiniteDuration);
-  params.detected_audio_track_count = 1;
-  params.detected_video_track_count = 1;
-  params.detected_text_track_count = 0;
-  ParseWebMFile("bear.webm", params);
-  EXPECT_NE(media_tracks_.get(), NULL);
-
-  EXPECT_EQ(media_tracks_->tracks().size(), 2u);
-
-  const MediaTrack& video_track = *(media_tracks_->tracks()[0]);
-  EXPECT_EQ(video_track.type(), MediaTrack::Video);
-  EXPECT_EQ(video_track.bytestream_track_id(), 1);
-  EXPECT_EQ(video_track.kind(), "main");
-  EXPECT_EQ(video_track.label(), "");
-  EXPECT_EQ(video_track.language(), "und");
-
-  const MediaTrack& audio_track = *(media_tracks_->tracks()[1]);
-  EXPECT_EQ(audio_track.type(), MediaTrack::Audio);
-  EXPECT_EQ(audio_track.bytestream_track_id(), 2);
-  EXPECT_EQ(audio_track.kind(), "main");
-  EXPECT_EQ(audio_track.label(), "");
-  EXPECT_EQ(audio_track.language(), "und");
-}
-
-TEST_F(WebMStreamParserTest, VerifyDetectedTrack_AudioOnly) {
-  EXPECT_MEDIA_LOG(testing::HasSubstr("Estimating WebM block duration"))
-      .Times(testing::AnyNumber());
-  StreamParser::InitParameters params(kInfiniteDuration);
-  params.detected_audio_track_count = 1;
-  params.detected_video_track_count = 0;
-  params.detected_text_track_count = 0;
-  ParseWebMFile("bear-320x240-audio-only.webm", params);
-  EXPECT_EQ(media_tracks_->tracks().size(), 1u);
-  EXPECT_EQ(media_tracks_->tracks()[0]->type(), MediaTrack::Audio);
-}
-
-TEST_F(WebMStreamParserTest, VerifyDetectedTrack_VideoOnly) {
-  StreamParser::InitParameters params(kInfiniteDuration);
-  params.detected_audio_track_count = 0;
-  params.detected_video_track_count = 1;
-  params.detected_text_track_count = 0;
-  ParseWebMFile("bear-320x240-video-only.webm", params);
-  EXPECT_EQ(media_tracks_->tracks().size(), 1u);
-  EXPECT_EQ(media_tracks_->tracks()[0]->type(), MediaTrack::Video);
-}
-
-TEST_F(WebMStreamParserTest, VerifyDetectedTracks_AVText) {
-  EXPECT_MEDIA_LOG(testing::HasSubstr("Estimating WebM block duration"))
-      .Times(testing::AnyNumber());
-  StreamParser::InitParameters params(kInfiniteDuration);
-  params.detected_audio_track_count = 1;
-  params.detected_video_track_count = 1;
-  params.detected_text_track_count = 1;
-  ParseWebMFile("bear-vp8-webvtt.webm", params);
-  EXPECT_EQ(media_tracks_->tracks().size(), 2u);
-  EXPECT_EQ(media_tracks_->tracks()[0]->type(), MediaTrack::Video);
-  EXPECT_EQ(media_tracks_->tracks()[1]->type(), MediaTrack::Audio);
-}
-
-TEST_F(WebMStreamParserTest, ColourElement) {
-  EXPECT_MEDIA_LOG(testing::HasSubstr("Estimating WebM block duration"))
-      .Times(testing::AnyNumber());
-  StreamParser::InitParameters params(kInfiniteDuration);
-  params.detected_audio_track_count = 0;
-  params.detected_video_track_count = 1;
-  params.detected_text_track_count = 0;
-  ParseWebMFile("colour.webm", params);
-  EXPECT_EQ(media_tracks_->tracks().size(), 1u);
-
-  const auto& video_track = media_tracks_->tracks()[0];
-  EXPECT_EQ(video_track->type(), MediaTrack::Video);
-
-  const VideoDecoderConfig& video_config =
-      media_tracks_->getVideoConfig(video_track->bytestream_track_id());
-
-  gfx::ColorSpace expected_color_space(gfx::ColorSpace::PrimaryID::SMPTEST428_1,
-                                       gfx::ColorSpace::TransferID::LOG,
-                                       gfx::ColorSpace::MatrixID::RGB,
-                                       gfx::ColorSpace::RangeID::FULL);
-  EXPECT_EQ(video_config.color_space_info(), expected_color_space);
-
-  base::Optional<HDRMetadata> hdr_metadata = video_config.hdr_metadata();
-  EXPECT_TRUE(hdr_metadata.has_value());
-  EXPECT_EQ(hdr_metadata->max_cll, 11u);
-  EXPECT_EQ(hdr_metadata->max_fall, 12u);
-
-  const MasteringMetadata& mmdata = hdr_metadata->mastering_metadata;
-  EXPECT_FLOAT_EQ(mmdata.primary_r_chromaticity_x, 0.1f);
-  EXPECT_FLOAT_EQ(mmdata.primary_r_chromaticity_y, 0.2f);
-  EXPECT_FLOAT_EQ(mmdata.primary_g_chromaticity_x, 0.1f);
-  EXPECT_FLOAT_EQ(mmdata.primary_g_chromaticity_y, 0.2f);
-  EXPECT_FLOAT_EQ(mmdata.primary_b_chromaticity_x, 0.1f);
-  EXPECT_FLOAT_EQ(mmdata.primary_b_chromaticity_y, 0.2f);
-  EXPECT_FLOAT_EQ(mmdata.white_point_chromaticity_x, 0.1f);
-  EXPECT_FLOAT_EQ(mmdata.white_point_chromaticity_y, 0.2f);
-  EXPECT_EQ(mmdata.luminance_max, 40);
-  EXPECT_EQ(mmdata.luminance_min, 30);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_tracks_parser.cc b/cobalt/media/formats/webm/webm_tracks_parser.cc
deleted file mode 100644
index 1f0fffc..0000000
--- a/cobalt/media/formats/webm/webm_tracks_parser.cc
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/webm_tracks_parser.h"
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "cobalt/media/formats/webm/webm_content_encodings.h"
-
-namespace cobalt {
-namespace media {
-
-static TextKind CodecIdToTextKind(const std::string& codec_id) {
-  if (codec_id == kWebMCodecSubtitles) return kTextSubtitles;
-
-  if (codec_id == kWebMCodecCaptions) return kTextCaptions;
-
-  if (codec_id == kWebMCodecDescriptions) return kTextDescriptions;
-
-  if (codec_id == kWebMCodecMetadata) return kTextMetadata;
-
-  return kTextNone;
-}
-
-static base::TimeDelta PrecisionCappedDefaultDuration(
-    const double timecode_scale_in_us, const int64_t duration_in_ns) {
-  if (duration_in_ns <= 0) return kNoTimestamp;
-
-  int64_t mult = duration_in_ns / 1000;
-  mult /= timecode_scale_in_us;
-  if (mult == 0) return kNoTimestamp;
-
-  mult = static_cast<double>(mult) * timecode_scale_in_us;
-  return base::TimeDelta::FromMicroseconds(mult);
-}
-
-WebMTracksParser::WebMTracksParser(const scoped_refptr<MediaLog>& media_log,
-                                   bool ignore_text_tracks)
-    : ignore_text_tracks_(ignore_text_tracks),
-      media_log_(media_log),
-      audio_client_(media_log),
-      video_client_(media_log) {
-  Reset();
-}
-
-WebMTracksParser::~WebMTracksParser() {}
-
-void WebMTracksParser::Reset() {
-  ResetTrackEntry();
-  reset_on_next_parse_ = false;
-  audio_track_num_ = -1;
-  audio_default_duration_ = -1;
-  audio_decoder_config_ = AudioDecoderConfig();
-  video_track_num_ = -1;
-  video_default_duration_ = -1;
-  video_decoder_config_ = VideoDecoderConfig();
-  text_tracks_.clear();
-  ignored_tracks_.clear();
-  detected_audio_track_count_ = 0;
-  detected_video_track_count_ = 0;
-  detected_text_track_count_ = 0;
-  media_tracks_.reset(new MediaTracks());
-}
-
-void WebMTracksParser::ResetTrackEntry() {
-  track_type_ = -1;
-  track_num_ = -1;
-  track_name_.clear();
-  track_language_.clear();
-  codec_id_ = "";
-  codec_private_.clear();
-  seek_preroll_ = -1;
-  codec_delay_ = -1;
-  default_duration_ = -1;
-  audio_client_.Reset();
-  video_client_.Reset();
-}
-
-int WebMTracksParser::Parse(const uint8_t* buf, int size) {
-  if (reset_on_next_parse_) Reset();
-
-  reset_on_next_parse_ = true;
-
-  WebMListParser parser(kWebMIdTracks, this);
-  int result = parser.Parse(buf, size);
-
-  if (result <= 0) return result;
-
-  // For now we do all or nothing parsing.
-  return parser.IsParsingComplete() ? result : 0;
-}
-
-base::TimeDelta WebMTracksParser::GetAudioDefaultDuration(
-    const double timecode_scale_in_us) const {
-  return PrecisionCappedDefaultDuration(timecode_scale_in_us,
-                                        audio_default_duration_);
-}
-
-base::TimeDelta WebMTracksParser::GetVideoDefaultDuration(
-    const double timecode_scale_in_us) const {
-  return PrecisionCappedDefaultDuration(timecode_scale_in_us,
-                                        video_default_duration_);
-}
-
-WebMParserClient* WebMTracksParser::OnListStart(int id) {
-  if (id == kWebMIdContentEncodings) {
-    DCHECK(!track_content_encodings_client_.get());
-    track_content_encodings_client_.reset(
-        new WebMContentEncodingsClient(media_log_));
-    return track_content_encodings_client_->OnListStart(id);
-  }
-
-  if (id == kWebMIdTrackEntry) {
-    ResetTrackEntry();
-    return this;
-  }
-
-  if (id == kWebMIdAudio) return &audio_client_;
-
-  if (id == kWebMIdVideo) return &video_client_;
-
-  return this;
-}
-
-bool WebMTracksParser::OnListEnd(int id) {
-  if (id == kWebMIdContentEncodings) {
-    DCHECK(track_content_encodings_client_.get());
-    return track_content_encodings_client_->OnListEnd(id);
-  }
-
-  if (id == kWebMIdTrackEntry) {
-    if (track_type_ == -1 || track_num_ == -1) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Missing TrackEntry data for "
-          << " TrackType " << track_type_ << " TrackNum " << track_num_;
-      return false;
-    }
-
-    if (track_type_ != kWebMTrackTypeAudio &&
-        track_type_ != kWebMTrackTypeVideo &&
-        track_type_ != kWebMTrackTypeSubtitlesOrCaptions &&
-        track_type_ != kWebMTrackTypeDescriptionsOrMetadata) {
-      MEDIA_LOG(ERROR, media_log_) << "Unexpected TrackType " << track_type_;
-      return false;
-    }
-
-    TextKind text_track_kind = kTextNone;
-    if (track_type_ == kWebMTrackTypeSubtitlesOrCaptions) {
-      text_track_kind = CodecIdToTextKind(codec_id_);
-      if (text_track_kind == kTextNone) {
-        MEDIA_LOG(ERROR, media_log_) << "Missing TrackEntry CodecID"
-                                     << " TrackNum " << track_num_;
-        return false;
-      }
-
-      if (text_track_kind != kTextSubtitles &&
-          text_track_kind != kTextCaptions) {
-        MEDIA_LOG(ERROR, media_log_) << "Wrong TrackEntry CodecID"
-                                     << " TrackNum " << track_num_;
-        return false;
-      }
-    } else if (track_type_ == kWebMTrackTypeDescriptionsOrMetadata) {
-      text_track_kind = CodecIdToTextKind(codec_id_);
-      if (text_track_kind == kTextNone) {
-        MEDIA_LOG(ERROR, media_log_) << "Missing TrackEntry CodecID"
-                                     << " TrackNum " << track_num_;
-        return false;
-      }
-
-      if (text_track_kind != kTextDescriptions &&
-          text_track_kind != kTextMetadata) {
-        MEDIA_LOG(ERROR, media_log_) << "Wrong TrackEntry CodecID"
-                                     << " TrackNum " << track_num_;
-        return false;
-      }
-    }
-
-    std::string encryption_key_id;
-    if (track_content_encodings_client_) {
-      DCHECK(!track_content_encodings_client_->content_encodings().empty());
-      // If we have multiple ContentEncoding in one track. Always choose the
-      // key id in the first ContentEncoding as the key id of the track.
-      encryption_key_id =
-          track_content_encodings_client_->content_encodings()[0]
-              .encryption_key_id();
-    }
-
-    EncryptionScheme encryption_scheme =
-        encryption_key_id.empty() ? Unencrypted() : AesCtrEncryptionScheme();
-
-    if (track_type_ == kWebMTrackTypeAudio) {
-      detected_audio_track_count_++;
-      if (audio_track_num_ == -1) {
-        audio_track_num_ = track_num_;
-        audio_encryption_key_id_ = encryption_key_id;
-
-        if (default_duration_ == 0) {
-          MEDIA_LOG(ERROR, media_log_) << "Illegal 0ns audio TrackEntry "
-                                          "DefaultDuration";
-          return false;
-        }
-        audio_default_duration_ = default_duration_;
-
-        DCHECK(!audio_decoder_config_.IsValidConfig());
-        if (!audio_client_.InitializeConfig(
-                codec_id_, codec_private_, seek_preroll_, codec_delay_,
-                encryption_scheme, &audio_decoder_config_)) {
-          return false;
-        }
-        media_tracks_->AddAudioTrack(
-            audio_decoder_config_,
-            static_cast<StreamParser::TrackId>(track_num_), "main", track_name_,
-            track_language_);
-      } else {
-        MEDIA_LOG(DEBUG, media_log_) << "Ignoring audio track " << track_num_;
-        ignored_tracks_.insert(track_num_);
-      }
-    } else if (track_type_ == kWebMTrackTypeVideo) {
-      detected_video_track_count_++;
-      if (video_track_num_ == -1) {
-        video_track_num_ = track_num_;
-        video_encryption_key_id_ = encryption_key_id;
-
-        if (default_duration_ == 0) {
-          MEDIA_LOG(ERROR, media_log_) << "Illegal 0ns video TrackEntry "
-                                          "DefaultDuration";
-          return false;
-        }
-        video_default_duration_ = default_duration_;
-
-        DCHECK(!video_decoder_config_.IsValidConfig());
-        if (!video_client_.InitializeConfig(codec_id_, codec_private_,
-                                            encryption_scheme,
-                                            &video_decoder_config_)) {
-          return false;
-        }
-        media_tracks_->AddVideoTrack(
-            video_decoder_config_,
-            static_cast<StreamParser::TrackId>(track_num_), "main", track_name_,
-            track_language_);
-      } else {
-        MEDIA_LOG(DEBUG, media_log_) << "Ignoring video track " << track_num_;
-        ignored_tracks_.insert(track_num_);
-      }
-    } else if (track_type_ == kWebMTrackTypeSubtitlesOrCaptions ||
-               track_type_ == kWebMTrackTypeDescriptionsOrMetadata) {
-      detected_text_track_count_++;
-      if (ignore_text_tracks_) {
-        MEDIA_LOG(DEBUG, media_log_) << "Ignoring text track " << track_num_;
-        ignored_tracks_.insert(track_num_);
-      } else {
-        std::string track_num = base::Int64ToString(track_num_);
-        text_tracks_[track_num_] = TextTrackConfig(text_track_kind, track_name_,
-                                                   track_language_, track_num);
-      }
-    } else {
-      MEDIA_LOG(ERROR, media_log_) << "Unexpected TrackType " << track_type_;
-      return false;
-    }
-
-    track_type_ = -1;
-    track_num_ = -1;
-    default_duration_ = -1;
-    track_name_.clear();
-    track_language_.clear();
-    codec_id_ = "";
-    codec_private_.clear();
-    track_content_encodings_client_.reset();
-
-    audio_client_.Reset();
-    video_client_.Reset();
-    return true;
-  }
-
-  return true;
-}
-
-bool WebMTracksParser::OnUInt(int id, int64_t val) {
-  int64_t* dst = NULL;
-
-  switch (id) {
-    case kWebMIdTrackNumber:
-      dst = &track_num_;
-      break;
-    case kWebMIdTrackType:
-      dst = &track_type_;
-      break;
-    case kWebMIdSeekPreRoll:
-      dst = &seek_preroll_;
-      break;
-    case kWebMIdCodecDelay:
-      dst = &codec_delay_;
-      break;
-    case kWebMIdDefaultDuration:
-      dst = &default_duration_;
-      break;
-    default:
-      return true;
-  }
-
-  if (*dst != -1) {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Multiple values for id " << std::hex << id << " specified";
-    return false;
-  }
-
-  *dst = val;
-  return true;
-}
-
-bool WebMTracksParser::OnFloat(int id, double val) { return true; }
-
-bool WebMTracksParser::OnBinary(int id, const uint8_t* data, int size) {
-  if (id == kWebMIdCodecPrivate) {
-    if (!codec_private_.empty()) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Multiple CodecPrivate fields in a track.";
-      return false;
-    }
-    codec_private_.assign(data, data + size);
-    return true;
-  }
-  return true;
-}
-
-bool WebMTracksParser::OnString(int id, const std::string& str) {
-  if (id == kWebMIdCodecID) {
-    if (!codec_id_.empty()) {
-      MEDIA_LOG(ERROR, media_log_) << "Multiple CodecID fields in a track";
-      return false;
-    }
-
-    codec_id_ = str;
-    return true;
-  }
-
-  if (id == kWebMIdName) {
-    track_name_ = str;
-    return true;
-  }
-
-  if (id == kWebMIdLanguage) {
-    // Check that the language string is in ISO 639-2 format (3 letter code of a
-    // language, all lower-case letters).
-    if (str.size() != 3 || str[0] < 'a' || str[0] > 'z' || str[1] < 'a' ||
-        str[1] > 'z' || str[2] < 'a' || str[2] > 'z') {
-      VLOG(2) << "Ignoring kWebMIdLanguage (not ISO 639-2 compliant): " << str;
-      track_language_ = "und";
-    } else {
-      track_language_ = str;
-    }
-    return true;
-  }
-
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_tracks_parser.h b/cobalt/media/formats/webm/webm_tracks_parser.h
deleted file mode 100644
index fd2a54a..0000000
--- a/cobalt/media/formats/webm/webm_tracks_parser.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_TRACKS_PARSER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_TRACKS_PARSER_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "base/time/time.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/text_track_config.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/formats/webm/webm_audio_client.h"
-#include "cobalt/media/formats/webm/webm_content_encodings_client.h"
-#include "cobalt/media/formats/webm/webm_parser.h"
-#include "cobalt/media/formats/webm/webm_video_client.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-// Parser for WebM Tracks element.
-class MEDIA_EXPORT WebMTracksParser : public WebMParserClient {
- public:
-  WebMTracksParser(const scoped_refptr<MediaLog>& media_log,
-                   bool ignore_text_tracks);
-  ~WebMTracksParser() override;
-
-  // Parses a WebM Tracks element in |buf|.
-  //
-  // Returns -1 if the parse fails.
-  // Returns 0 if more data is needed.
-  // Returns the number of bytes parsed on success.
-  int Parse(const uint8_t* buf, int size);
-
-  int64_t audio_track_num() const { return audio_track_num_; }
-  int64_t video_track_num() const { return video_track_num_; }
-
-  // If TrackEntry DefaultDuration field existed for the associated audio or
-  // video track, returns that value converted from ns to base::TimeDelta with
-  // precision not greater than |timecode_scale_in_us|. Defaults to
-  // kNoTimestamp.
-  base::TimeDelta GetAudioDefaultDuration(
-      const double timecode_scale_in_us) const;
-  base::TimeDelta GetVideoDefaultDuration(
-      const double timecode_scale_in_us) const;
-
-  const std::set<int64_t>& ignored_tracks() const { return ignored_tracks_; }
-
-  const std::string& audio_encryption_key_id() const {
-    return audio_encryption_key_id_;
-  }
-
-  const AudioDecoderConfig& audio_decoder_config() {
-    return audio_decoder_config_;
-  }
-
-  const std::string& video_encryption_key_id() const {
-    return video_encryption_key_id_;
-  }
-
-  const VideoDecoderConfig& video_decoder_config() {
-    return video_decoder_config_;
-  }
-
-  typedef std::map<int, TextTrackConfig> TextTracks;
-
-  const TextTracks& text_tracks() const { return text_tracks_; }
-
-  int detected_audio_track_count() const { return detected_audio_track_count_; }
-
-  int detected_video_track_count() const { return detected_video_track_count_; }
-
-  int detected_text_track_count() const { return detected_text_track_count_; }
-
-  // Note: Calling media_tracks() method passes the ownership of the MediaTracks
-  // object from WebMTracksParser to the caller (which is typically
-  // WebMStreamParser object). So this method must be called only once, after
-  // track parsing has been completed.
-  std::unique_ptr<MediaTracks> media_tracks() {
-    CHECK(media_tracks_.get());
-    return std::move(media_tracks_);
-  }
-
- private:
-  void Reset();
-  void ResetTrackEntry();
-
-  // WebMParserClient implementation.
-  WebMParserClient* OnListStart(int id) override;
-  bool OnListEnd(int id) override;
-  bool OnUInt(int id, int64_t val) override;
-  bool OnFloat(int id, double val) override;
-  bool OnBinary(int id, const uint8_t* data, int size) override;
-  bool OnString(int id, const std::string& str) override;
-
-  bool reset_on_next_parse_;
-  int64_t track_type_;
-  int64_t track_num_;
-  std::string track_name_;
-  std::string track_language_;
-  std::string codec_id_;
-  std::vector<uint8_t> codec_private_;
-  int64_t seek_preroll_;
-  int64_t codec_delay_;
-  int64_t default_duration_;
-  std::unique_ptr<WebMContentEncodingsClient> track_content_encodings_client_;
-
-  int64_t audio_track_num_;
-  int64_t audio_default_duration_;
-  int64_t video_track_num_;
-  int64_t video_default_duration_;
-  bool ignore_text_tracks_;
-  TextTracks text_tracks_;
-  std::set<int64_t> ignored_tracks_;
-  std::string audio_encryption_key_id_;
-  std::string video_encryption_key_id_;
-  scoped_refptr<MediaLog> media_log_;
-
-  WebMAudioClient audio_client_;
-  AudioDecoderConfig audio_decoder_config_;
-
-  WebMVideoClient video_client_;
-  VideoDecoderConfig video_decoder_config_;
-
-  int detected_audio_track_count_;
-  int detected_video_track_count_;
-  int detected_text_track_count_;
-  std::unique_ptr<MediaTracks> media_tracks_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebMTracksParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_TRACKS_PARSER_H_
diff --git a/cobalt/media/formats/webm/webm_tracks_parser_unittest.cc b/cobalt/media/formats/webm/webm_tracks_parser_unittest.cc
deleted file mode 100644
index f894d8d..0000000
--- a/cobalt/media/formats/webm/webm_tracks_parser_unittest.cc
+++ /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.
-
-#include <memory>
-
-#include "cobalt/media/formats/webm/webm_tracks_parser.h"
-
-#include "base/logging.h"
-#include "cobalt/media/base/channel_layout.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/base/timestamp_constants.h"
-#include "cobalt/media/formats/webm/tracks_builder.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::HasSubstr;
-using ::testing::InSequence;
-using ::testing::Return;
-using ::testing::StrictMock;
-using ::testing::_;
-
-namespace cobalt {
-namespace media {
-
-static const double kDefaultTimecodeScaleInUs = 1000.0;  // 1 ms resolution
-
-class WebMTracksParserTest : public testing::Test {
- public:
-  WebMTracksParserTest() : media_log_(new StrictMock<MockMediaLog>()) {}
-
- protected:
-  void VerifyTextTrackInfo(const uint8_t* buffer, int buffer_size,
-                           TextKind text_kind, const std::string& name,
-                           const std::string& language) {
-    std::unique_ptr<WebMTracksParser> parser(
-        new WebMTracksParser(media_log_, false));
-
-    int result = parser->Parse(buffer, buffer_size);
-    EXPECT_GT(result, 0);
-    EXPECT_EQ(result, buffer_size);
-
-    const WebMTracksParser::TextTracks& text_tracks = parser->text_tracks();
-    EXPECT_EQ(text_tracks.size(), WebMTracksParser::TextTracks::size_type(1));
-
-    const WebMTracksParser::TextTracks::const_iterator itr =
-        text_tracks.begin();
-    EXPECT_EQ(itr->first, 1);  // track num
-
-    const TextTrackConfig& config = itr->second;
-    EXPECT_EQ(config.kind(), text_kind);
-    EXPECT_TRUE(config.label() == name);
-    EXPECT_TRUE(config.language() == language);
-  }
-
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-};
-
-TEST_F(WebMTracksParserTest, SubtitleNoNameNoLang) {
-  InSequence s;
-
-  TracksBuilder tb;
-  tb.AddTextTrack(1, 1, kWebMCodecSubtitles, "", "");
-
-  const std::vector<uint8_t> buf = tb.Finish();
-  VerifyTextTrackInfo(&buf[0], buf.size(), kTextSubtitles, "", "");
-}
-
-TEST_F(WebMTracksParserTest, SubtitleYesNameNoLang) {
-  InSequence s;
-
-  TracksBuilder tb;
-  tb.AddTextTrack(1, 1, kWebMCodecSubtitles, "Spock", "");
-
-  const std::vector<uint8_t> buf = tb.Finish();
-  VerifyTextTrackInfo(&buf[0], buf.size(), kTextSubtitles, "Spock", "");
-}
-
-TEST_F(WebMTracksParserTest, SubtitleNoNameYesLang) {
-  InSequence s;
-
-  TracksBuilder tb;
-  tb.AddTextTrack(1, 1, kWebMCodecSubtitles, "", "eng");
-
-  const std::vector<uint8_t> buf = tb.Finish();
-  VerifyTextTrackInfo(&buf[0], buf.size(), kTextSubtitles, "", "eng");
-}
-
-TEST_F(WebMTracksParserTest, SubtitleYesNameYesLang) {
-  InSequence s;
-
-  TracksBuilder tb;
-  tb.AddTextTrack(1, 1, kWebMCodecSubtitles, "Picard", "fre");
-
-  const std::vector<uint8_t> buf = tb.Finish();
-  VerifyTextTrackInfo(&buf[0], buf.size(), kTextSubtitles, "Picard", "fre");
-}
-
-TEST_F(WebMTracksParserTest, IgnoringTextTracks) {
-  InSequence s;
-
-  TracksBuilder tb;
-  tb.AddTextTrack(1, 1, kWebMCodecSubtitles, "Subtitles", "fre");
-  tb.AddTextTrack(2, 2, kWebMCodecSubtitles, "Commentary", "fre");
-
-  const std::vector<uint8_t> buf = tb.Finish();
-  std::unique_ptr<WebMTracksParser> parser(
-      new WebMTracksParser(media_log_, true));
-
-  EXPECT_MEDIA_LOG(HasSubstr("Ignoring text track 1"));
-  EXPECT_MEDIA_LOG(HasSubstr("Ignoring text track 2"));
-
-  int result = parser->Parse(&buf[0], buf.size());
-  EXPECT_GT(result, 0);
-  EXPECT_EQ(result, static_cast<int>(buf.size()));
-
-  EXPECT_EQ(parser->text_tracks().size(), 0u);
-
-  const std::set<int64_t>& ignored_tracks = parser->ignored_tracks();
-  EXPECT_TRUE(ignored_tracks.find(1) != ignored_tracks.end());
-  EXPECT_TRUE(ignored_tracks.find(2) != ignored_tracks.end());
-
-  // Test again w/o ignoring the test tracks.
-  parser.reset(new WebMTracksParser(media_log_, false));
-
-  result = parser->Parse(&buf[0], buf.size());
-  EXPECT_GT(result, 0);
-
-  EXPECT_EQ(parser->ignored_tracks().size(), 0u);
-  EXPECT_EQ(parser->text_tracks().size(), 2u);
-}
-
-TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationUnset) {
-  // Other audio/video decoder config fields are necessary in the test
-  // audio/video TrackEntry configurations. This method does only very minimal
-  // verification of their inclusion and parsing; the goal is to confirm
-  // TrackEntry DefaultDuration defaults to -1 if not included in audio or
-  // video TrackEntry.
-  TracksBuilder tb;
-  tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", -1, 2, 8000);
-  tb.AddVideoTrack(2, 2, "V_VP8", "video", "", -1, 320, 240);
-  const std::vector<uint8_t> buf = tb.Finish();
-
-  std::unique_ptr<WebMTracksParser> parser(
-      new WebMTracksParser(media_log_, true));
-  int result = parser->Parse(&buf[0], buf.size());
-  EXPECT_LE(0, result);
-  EXPECT_EQ(static_cast<int>(buf.size()), result);
-
-  EXPECT_EQ(kNoTimestamp,
-            parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs));
-  EXPECT_EQ(kNoTimestamp,
-            parser->GetVideoDefaultDuration(kDefaultTimecodeScaleInUs));
-
-  const VideoDecoderConfig& video_config = parser->video_decoder_config();
-  EXPECT_TRUE(video_config.IsValidConfig());
-  EXPECT_EQ(320, video_config.coded_size().width());
-  EXPECT_EQ(240, video_config.coded_size().height());
-
-  const AudioDecoderConfig& audio_config = parser->audio_decoder_config();
-  EXPECT_TRUE(audio_config.IsValidConfig());
-  EXPECT_EQ(CHANNEL_LAYOUT_STEREO, audio_config.channel_layout());
-  EXPECT_EQ(8000, audio_config.samples_per_second());
-}
-
-TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationSet) {
-  // Confirm audio or video TrackEntry DefaultDuration values are parsed, if
-  // present.
-  TracksBuilder tb;
-  tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 12345678, 2, 8000);
-  tb.AddVideoTrack(2, 2, "V_VP8", "video", "", 987654321, 320, 240);
-  const std::vector<uint8_t> buf = tb.Finish();
-
-  std::unique_ptr<WebMTracksParser> parser(
-      new WebMTracksParser(media_log_, true));
-  int result = parser->Parse(&buf[0], buf.size());
-  EXPECT_LE(0, result);
-  EXPECT_EQ(static_cast<int>(buf.size()), result);
-
-  EXPECT_EQ(base::TimeDelta::FromMicroseconds(12000),
-            parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs));
-  EXPECT_EQ(base::TimeDelta::FromMicroseconds(985000),
-            parser->GetVideoDefaultDuration(5000.0));  // 5 ms resolution
-  EXPECT_EQ(kNoTimestamp, parser->GetAudioDefaultDuration(12346.0));
-  EXPECT_EQ(base::TimeDelta::FromMicroseconds(12345),
-            parser->GetAudioDefaultDuration(12345.0));
-  EXPECT_EQ(base::TimeDelta::FromMicroseconds(12003),
-            parser->GetAudioDefaultDuration(1000.3));  // 1.0003 ms resolution
-}
-
-TEST_F(WebMTracksParserTest, InvalidZeroDefaultDurationSet) {
-  // Confirm parse error if TrackEntry DefaultDuration is present, but is 0ns.
-  TracksBuilder tb(true);
-  tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 0, 2, 8000);
-  const std::vector<uint8_t> buf = tb.Finish();
-
-  std::unique_ptr<WebMTracksParser> parser(
-      new WebMTracksParser(media_log_, true));
-
-  EXPECT_MEDIA_LOG(HasSubstr("Illegal 0ns audio TrackEntry DefaultDuration"));
-
-  EXPECT_EQ(-1, parser->Parse(&buf[0], buf.size()));
-}
-
-TEST_F(WebMTracksParserTest, HighTrackUID) {
-  // Confirm no parse error if TrackEntry TrackUID has MSb set
-  // (http://crbug.com/397067).
-  TracksBuilder tb(true);
-  tb.AddAudioTrack(1, 1ULL << 31, "A_VORBIS", "audio", "", 40, 2, 8000);
-  const std::vector<uint8_t> buf = tb.Finish();
-
-  std::unique_ptr<WebMTracksParser> parser(
-      new WebMTracksParser(media_log_, true));
-  EXPECT_GT(parser->Parse(&buf[0], buf.size()), 0);
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_video_client.cc b/cobalt/media/formats/webm/webm_video_client.cc
deleted file mode 100644
index 962de68..0000000
--- a/cobalt/media/formats/webm/webm_video_client.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/webm_video_client.h"
-
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-
-namespace cobalt {
-namespace media {
-
-namespace {
-// Tries to parse |data| to extract the VP9 Profile ID, or returns Profile 0.
-media::VideoCodecProfile GetVP9CodecProfile(const std::vector<uint8_t>& data) {
-  // VP9 CodecPrivate (http://wiki.webmproject.org/vp9-codecprivate) might have
-  // Profile information in the first field, if present.
-  constexpr uint8_t kVP9ProfileFieldId = 0x01;
-  constexpr uint8_t kVP9ProfileFieldLength = 1;
-  if (data.size() < 3 || data[0] != kVP9ProfileFieldId ||
-      data[1] != kVP9ProfileFieldLength || data[2] > 3) {
-    return VP9PROFILE_PROFILE0;
-  }
-  return static_cast<VideoCodecProfile>(
-      static_cast<size_t>(VP9PROFILE_PROFILE0) + data[2]);
-}
-}  // namespace
-
-WebMVideoClient::WebMVideoClient(const scoped_refptr<MediaLog>& media_log)
-    : media_log_(media_log), colour_parsed_(false) {
-  Reset();
-}
-
-WebMVideoClient::~WebMVideoClient() {}
-
-void WebMVideoClient::Reset() {
-  pixel_width_ = -1;
-  pixel_height_ = -1;
-  crop_bottom_ = -1;
-  crop_top_ = -1;
-  crop_left_ = -1;
-  crop_right_ = -1;
-  display_width_ = -1;
-  display_height_ = -1;
-  display_unit_ = -1;
-  alpha_mode_ = -1;
-  inside_projection_list_ = false;
-  colour_parsed_ = false;
-}
-
-bool WebMVideoClient::InitializeConfig(
-    const std::string& codec_id, const std::vector<uint8_t>& codec_private,
-    const EncryptionScheme& encryption_scheme, VideoDecoderConfig* config) {
-  DCHECK(config);
-
-  VideoCodec video_codec = kUnknownVideoCodec;
-  VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN;
-  if (codec_id == "V_VP8") {
-    video_codec = kCodecVP8;
-    profile = VP8PROFILE_ANY;
-  } else if (codec_id == "V_VP9") {
-    video_codec = kCodecVP9;
-    profile = GetVP9CodecProfile(codec_private);
-  } else {
-    MEDIA_LOG(ERROR, media_log_) << "Unsupported video codec_id " << codec_id;
-    return false;
-  }
-
-  VideoPixelFormat format =
-      (alpha_mode_ == 1) ? PIXEL_FORMAT_YV12A : PIXEL_FORMAT_YV12;
-
-  if (pixel_width_ <= 0 || pixel_height_ <= 0) return false;
-
-  // Set crop and display unit defaults if these elements are not present.
-  if (crop_bottom_ == -1) crop_bottom_ = 0;
-
-  if (crop_top_ == -1) crop_top_ = 0;
-
-  if (crop_left_ == -1) crop_left_ = 0;
-
-  if (crop_right_ == -1) crop_right_ = 0;
-
-  if (display_unit_ == -1) display_unit_ = 0;
-
-  math::Size coded_size(pixel_width_, pixel_height_);
-  math::RectF visible_rect_float(crop_top_, crop_left_,
-                                 pixel_width_ - (crop_left_ + crop_right_),
-                                 pixel_height_ - (crop_top_ + crop_bottom_));
-  math::Rect visible_rect = math::Rect::RoundFromRectF(visible_rect_float);
-  if (display_unit_ == 0) {
-    if (display_width_ <= 0) display_width_ = visible_rect.width();
-    if (display_height_ <= 0) display_height_ = visible_rect.height();
-  } else if (display_unit_ == 3) {
-    if (display_width_ <= 0 || display_height_ <= 0) return false;
-  } else {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Unsupported display unit type " << display_unit_;
-    return false;
-  }
-  math::Size natural_size = math::Size(display_width_, display_height_);
-
-  config->Initialize(video_codec, profile, format, COLOR_SPACE_HD_REC709,
-                     coded_size, visible_rect, natural_size, codec_private,
-                     encryption_scheme);
-  if (colour_parsed_) {
-    WebMColorMetadata color_metadata = colour_parser_.GetWebMColorMetadata();
-    config->set_webm_color_metadata(color_metadata);
-  }
-  return config->IsValidConfig();
-}
-
-WebMParserClient* WebMVideoClient::OnListStart(int id) {
-  if (id == kWebMIdColour) {
-    colour_parsed_ = false;
-    return &colour_parser_;
-  }
-
-  if (id == kWebMIdProjection && !inside_projection_list_) {
-    inside_projection_list_ = true;
-    return this;
-  }
-
-  return this;
-}
-
-bool WebMVideoClient::OnListEnd(int id) {
-  if (id == kWebMIdColour) colour_parsed_ = true;
-
-  if (id == kWebMIdProjection && inside_projection_list_) {
-    inside_projection_list_ = false;
-    return true;
-  }
-
-  return true;
-}
-
-bool WebMVideoClient::OnUInt(int id, int64_t val) {
-  if (inside_projection_list_) {
-    // Accept and ignore all integer fields under kWebMIdProjection list. This
-    // currently includes the kWebMIdProjectionType field.
-    return true;
-  }
-
-  int64_t* dst = NULL;
-
-  switch (id) {
-    case kWebMIdPixelWidth:
-      dst = &pixel_width_;
-      break;
-    case kWebMIdPixelHeight:
-      dst = &pixel_height_;
-      break;
-    case kWebMIdPixelCropTop:
-      dst = &crop_top_;
-      break;
-    case kWebMIdPixelCropBottom:
-      dst = &crop_bottom_;
-      break;
-    case kWebMIdPixelCropLeft:
-      dst = &crop_left_;
-      break;
-    case kWebMIdPixelCropRight:
-      dst = &crop_right_;
-      break;
-    case kWebMIdDisplayWidth:
-      dst = &display_width_;
-      break;
-    case kWebMIdDisplayHeight:
-      dst = &display_height_;
-      break;
-    case kWebMIdDisplayUnit:
-      dst = &display_unit_;
-      break;
-    case kWebMIdAlphaMode:
-      dst = &alpha_mode_;
-      break;
-    default:
-      return true;
-  }
-
-  if (*dst != -1) {
-    MEDIA_LOG(ERROR, media_log_)
-        << "Multiple values for id " << std::hex << id << " specified (" << *dst
-        << " and " << val << ")";
-    return false;
-  }
-
-  *dst = val;
-  return true;
-}
-
-bool WebMVideoClient::OnBinary(int id, const uint8_t* data, int size) {
-  if (inside_projection_list_) {
-    // Accept and ignore all binary fields under kWebMIdProjection list. This
-    // currently includes the kWebMIdProjectionPrivate field.
-    return true;
-  }
-
-  // Accept binary fields we don't care about for now.
-  return true;
-}
-
-bool WebMVideoClient::OnFloat(int id, double val) {
-  if (inside_projection_list_) {
-    // Accept and ignore float fields under kWebMIdProjection list. This
-    // currently includes the kWebMIdProjectionPosePitch,
-    // kWebMIdProjectionPoseYaw, kWebMIdProjectionPoseRoll fields.
-    return true;
-  }
-
-  // Accept float fields we don't care about for now.
-  return true;
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_video_client.h b/cobalt/media/formats/webm/webm_video_client.h
deleted file mode 100644
index 77d26ca..0000000
--- a/cobalt/media/formats/webm/webm_video_client.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_VIDEO_CLIENT_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_VIDEO_CLIENT_H_
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/formats/webm/webm_colour_parser.h"
-#include "cobalt/media/formats/webm/webm_parser.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-class EncryptionScheme;
-class VideoDecoderConfig;
-
-// Helper class used to parse a Video element inside a TrackEntry element.
-class MEDIA_EXPORT WebMVideoClient : public WebMParserClient {
- public:
-  explicit WebMVideoClient(const scoped_refptr<MediaLog>& media_log);
-  ~WebMVideoClient() override;
-
-  // Reset this object's state so it can process a new video track element.
-  void Reset();
-
-  // Initialize |config| with the data in |codec_id|, |codec_private|,
-  // |encryption_scheme| and the fields parsed from the last video track element
-  // this object was used to parse.
-  // Returns true if |config| was successfully initialized.
-  // Returns false if there was unexpected values in the provided parameters or
-  // video track element fields. The contents of |config| are undefined in this
-  // case and should not be relied upon.
-  bool InitializeConfig(const std::string& codec_id,
-                        const std::vector<uint8_t>& codec_private,
-                        const EncryptionScheme& encryption_scheme,
-                        VideoDecoderConfig* config);
-
- private:
-  friend class WebMVideoClientTest;
-
-  // WebMParserClient implementation.
-  WebMParserClient* OnListStart(int id) override;
-  bool OnListEnd(int id) override;
-  bool OnUInt(int id, int64_t val) override;
-  bool OnBinary(int id, const uint8_t* data, int size) override;
-  bool OnFloat(int id, double val) override;
-
-  scoped_refptr<MediaLog> media_log_;
-  int64_t pixel_width_;
-  int64_t pixel_height_;
-  int64_t crop_bottom_;
-  int64_t crop_top_;
-  int64_t crop_left_;
-  int64_t crop_right_;
-  int64_t display_width_;
-  int64_t display_height_;
-  int64_t display_unit_;
-  int64_t alpha_mode_;
-  bool inside_projection_list_;
-
-  WebMColourParser colour_parser_;
-  bool colour_parsed_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebMVideoClient);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_VIDEO_CLIENT_H_
diff --git a/cobalt/media/formats/webm/webm_video_client_unittest.cc b/cobalt/media/formats/webm/webm_video_client_unittest.cc
deleted file mode 100644
index 3dccf80..0000000
--- a/cobalt/media/formats/webm/webm_video_client_unittest.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cobalt/media/formats/webm/webm_video_client.h"
-
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/mock_media_log.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/formats/webm/webm_constants.h"
-
-using testing::StrictMock;
-
-namespace cobalt {
-namespace media {
-
-namespace {
-const math::Size kCodedSize(321, 243);
-
-struct CodecTestParams {
-  VideoCodecProfile profile;
-  const std::vector<uint8_t> codec_private;
-};
-}  // namespace
-
-CodecTestParams kCodecTestParams[] = {
-    {VP9PROFILE_PROFILE0, {}},
-    {VP9PROFILE_PROFILE2,
-     // Valid VP9 Profile 2 example, extracted out of a sample file at
-     // https://www.webmproject.org/vp9/levels/#test-bitstreams
-     {0x01, 0x01, 0x02, 0x02, 0x01, 0x0a, 0x3, 0x1, 0xa, 0x4, 0x1, 0x1}},
-    // Invalid VP9 CodecPrivate: too short.
-    {VP9PROFILE_PROFILE0, {0x01, 0x01}},
-    // Invalid VP9 CodecPrivate: wrong field id.
-    {VP9PROFILE_PROFILE0, {0x77, 0x01, 0x02}},
-    // Invalid VP9 CodecPrivate: wrong field length.
-    {VP9PROFILE_PROFILE0, {0x01, 0x75, 0x02}},
-    // Invalid VP9 CodecPrivate: wrong Profile (can't be > 3).
-    {VP9PROFILE_PROFILE0, {0x01, 0x01, 0x34}}};
-
-class WebMVideoClientTest : public testing::TestWithParam<CodecTestParams> {
- public:
-  WebMVideoClientTest()
-      : media_log_(new StrictMock<MockMediaLog>()),
-        webm_video_client_(media_log_) {
-    // Simulate configuring width and height in the |webm_video_client_|.
-    webm_video_client_.OnUInt(kWebMIdPixelWidth, kCodedSize.width());
-    webm_video_client_.OnUInt(kWebMIdPixelHeight, kCodedSize.height());
-  }
-
-  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
-  WebMVideoClient webm_video_client_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(WebMVideoClientTest);
-};
-
-TEST_P(WebMVideoClientTest, InitializeConfigVP9Profiles) {
-  const std::string kCodecId = "V_VP9";
-  const VideoCodecProfile profile = GetParam().profile;
-  const std::vector<uint8_t> codec_private = GetParam().codec_private;
-
-  VideoDecoderConfig config;
-
-  EXPECT_TRUE(webm_video_client_.InitializeConfig(kCodecId, codec_private,
-                                                  EncryptionScheme(), &config));
-
-  VideoDecoderConfig expected_config(
-      kCodecVP9, profile, PIXEL_FORMAT_YV12, COLOR_SPACE_HD_REC709, kCodedSize,
-      math::Rect(kCodedSize), kCodedSize, codec_private, Unencrypted());
-
-  EXPECT_TRUE(config.Matches(expected_config))
-      << "Config (" << config.AsHumanReadableString()
-      << ") does not match expected ("
-      << expected_config.AsHumanReadableString() << ")";
-}
-
-INSTANTIATE_TEST_CASE_P(/* No prefix. */, WebMVideoClientTest,
-                        ::testing::ValuesIn(kCodecTestParams));
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_webvtt_parser.cc b/cobalt/media/formats/webm/webm_webvtt_parser.cc
deleted file mode 100644
index a36a364..0000000
--- a/cobalt/media/formats/webm/webm_webvtt_parser.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.
-
-#include "cobalt/media/formats/webm/webm_webvtt_parser.h"
-
-namespace cobalt {
-namespace media {
-
-void WebMWebVTTParser::Parse(const uint8_t* payload, int payload_size,
-                             std::string* id, std::string* settings,
-                             std::string* content) {
-  WebMWebVTTParser parser(payload, payload_size);
-  parser.Parse(id, settings, content);
-}
-
-WebMWebVTTParser::WebMWebVTTParser(const uint8_t* payload, int payload_size)
-    : ptr_(payload), ptr_end_(payload + payload_size) {}
-
-void WebMWebVTTParser::Parse(std::string* id, std::string* settings,
-                             std::string* content) {
-  ParseLine(id);
-  ParseLine(settings);
-  content->assign(ptr_, ptr_end_);
-}
-
-bool WebMWebVTTParser::GetByte(uint8_t* byte) {
-  if (ptr_ >= ptr_end_) return false;  // indicates end-of-stream
-
-  *byte = *ptr_++;
-  return true;
-}
-
-void WebMWebVTTParser::UngetByte() { --ptr_; }
-
-void WebMWebVTTParser::ParseLine(std::string* line) {
-  line->clear();
-
-  // Consume characters from the stream, until we reach end-of-line.
-
-  // The WebVTT spec states that lines may be terminated in any of the following
-  // three ways:
-  //  LF
-  //  CR
-  //  CR LF
-
-  // The spec is here:
-  //  http://wiki.webmproject.org/webm-metadata/temporal-metadata/webvtt-in-webm
-
-  enum { kLF = '\x0A', kCR = '\x0D' };
-
-  for (;;) {
-    uint8_t byte;
-
-    if (!GetByte(&byte) || byte == kLF) return;
-
-    if (byte == kCR) {
-      if (GetByte(&byte) && byte != kLF) UngetByte();
-
-      return;
-    }
-
-    line->push_back(byte);
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/formats/webm/webm_webvtt_parser.h b/cobalt/media/formats/webm/webm_webvtt_parser.h
deleted file mode 100644
index ebd0a22..0000000
--- a/cobalt/media/formats/webm/webm_webvtt_parser.h
+++ /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.
-
-#ifndef COBALT_MEDIA_FORMATS_WEBM_WEBM_WEBVTT_PARSER_H_
-#define COBALT_MEDIA_FORMATS_WEBM_WEBM_WEBVTT_PARSER_H_
-
-#include <string>
-
-#include "base/basictypes.h"
-#include "cobalt/media/base/media_export.h"
-#include "starboard/types.h"
-
-namespace cobalt {
-namespace media {
-
-class MEDIA_EXPORT WebMWebVTTParser {
- public:
-  // Utility function to parse the WebVTT cue from a byte stream.
-  static void Parse(const uint8_t* payload, int payload_size, std::string* id,
-                    std::string* settings, std::string* content);
-
- private:
-  // The payload is the embedded WebVTT cue, stored in a WebM block.
-  // The parser treats this as a UTF-8 byte stream.
-  WebMWebVTTParser(const uint8_t* payload, int payload_size);
-
-  // Parse the cue identifier, settings, and content from the stream.
-  void Parse(std::string* id, std::string* settings, std::string* content);
-  // Remove a byte from the stream, advancing the stream pointer.
-  // Returns true if a character was returned; false means "end of stream".
-  bool GetByte(uint8_t* byte);
-
-  // Backup the stream pointer.
-  void UngetByte();
-
-  // Parse a line of text from the stream.
-  void ParseLine(std::string* line);
-
-  // Represents the portion of the stream that has not been consumed yet.
-  const uint8_t* ptr_;
-  const uint8_t* const ptr_end_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebMWebVTTParser);
-};
-
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_FORMATS_WEBM_WEBM_WEBVTT_PARSER_H_
diff --git a/cobalt/media/formats/webm/webm_webvtt_parser_unittest.cc b/cobalt/media/formats/webm/webm_webvtt_parser_unittest.cc
deleted file mode 100644
index a61aa04..0000000
--- a/cobalt/media/formats/webm/webm_webvtt_parser_unittest.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "cobalt/media/formats/webm/webm_webvtt_parser.h"
-#include "starboard/types.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::InSequence;
-
-namespace cobalt {
-namespace media {
-
-typedef std::vector<uint8_t> Cue;
-
-static Cue EncodeCue(const std::string& id, const std::string& settings,
-                     const std::string& content) {
-  const std::string result = id + '\n' + settings + '\n' + content;
-  const uint8_t* const buf = reinterpret_cast<const uint8_t*>(result.data());
-  return Cue(buf, buf + result.length());
-}
-
-static void DecodeCue(const Cue& cue, std::string* id, std::string* settings,
-                      std::string* content) {
-  WebMWebVTTParser::Parse(&cue[0], static_cast<int>(cue.size()), id, settings,
-                          content);
-}
-
-class WebMWebVTTParserTest : public testing::Test {
- public:
-  WebMWebVTTParserTest() {}
-};
-
-TEST_F(WebMWebVTTParserTest, Blank) {
-  InSequence s;
-
-  const Cue cue = EncodeCue("", "", "Subtitle");
-  std::string id, settings, content;
-
-  DecodeCue(cue, &id, &settings, &content);
-  EXPECT_EQ(id, "");
-  EXPECT_EQ(settings, "");
-  EXPECT_EQ(content, "Subtitle");
-}
-
-TEST_F(WebMWebVTTParserTest, Id) {
-  InSequence s;
-
-  for (int i = 1; i <= 9; ++i) {
-    const std::string idsrc(1, '0' + i);
-    const Cue cue = EncodeCue(idsrc, "", "Subtitle");
-    std::string id, settings, content;
-
-    DecodeCue(cue, &id, &settings, &content);
-    EXPECT_EQ(id, idsrc);
-    EXPECT_EQ(settings, "");
-    EXPECT_EQ(content, "Subtitle");
-  }
-}
-
-TEST_F(WebMWebVTTParserTest, Settings) {
-  InSequence s;
-
-  enum { kSettingsCount = 4 };
-  const char* const settings_str[kSettingsCount] = {
-      "vertical:lr", "line:50%", "position:42%",
-      "vertical:rl line:42% position:100%"};
-
-  for (int i = 0; i < kSettingsCount; ++i) {
-    const Cue cue = EncodeCue("", settings_str[i], "Subtitle");
-    std::string id, settings, content;
-
-    DecodeCue(cue, &id, &settings, &content);
-    EXPECT_EQ(id, "");
-    EXPECT_EQ(settings, settings_str[i]);
-    EXPECT_EQ(content, "Subtitle");
-  }
-}
-
-TEST_F(WebMWebVTTParserTest, Content) {
-  InSequence s;
-
-  enum { kContentCount = 4 };
-  const char* const content_str[kContentCount] = {
-      "Subtitle", "Another Subtitle", "Yet Another Subtitle",
-      "Another Subtitle\nSplit Across Two Lines"};
-
-  for (int i = 0; i < kContentCount; ++i) {
-    const Cue cue = EncodeCue("", "", content_str[i]);
-    std::string id, settings, content;
-
-    DecodeCue(cue, &id, &settings, &content);
-    EXPECT_EQ(id, "");
-    EXPECT_EQ(settings, "");
-    EXPECT_EQ(content, content_str[i]);
-  }
-}
-
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/media.gyp b/cobalt/media/media.gyp
deleted file mode 100644
index 42567fa..0000000
--- a/cobalt/media/media.gyp
+++ /dev/null
@@ -1,262 +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.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'media',
-      'type': '<(component)',
-      'cflags_cc': [
-        '-Wno-conversion',
-        '-Wno-unused-parameter',
-        '-Wno-unused-variable',
-      ],
-      'defines': [
-        'MEDIA_IMPLEMENTATION',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'decoder_buffer_allocator.cc',
-        'decoder_buffer_allocator.h',
-        'decoder_buffer_memory_info.h',
-        'fetcher_buffered_data_source.cc',
-        'fetcher_buffered_data_source.h',
-        'media_module.cc',
-        'media_module.h',
-
-        'base/audio_bus.cc',
-        'base/audio_bus.h',
-        'base/audio_codecs.cc',
-        'base/audio_codecs.h',
-        'base/audio_decoder_config.cc',
-        'base/audio_decoder_config.h',
-        'base/audio_timestamp_helper.cc',
-        'base/audio_timestamp_helper.h',
-        'base/bit_reader.cc',
-        'base/bit_reader.h',
-        'base/bit_reader_core.cc',
-        'base/bit_reader_core.h',
-        'base/byte_queue.cc',
-        'base/byte_queue.h',
-        'base/channel_layout.cc',
-        'base/channel_layout.h',
-        'base/color_space.cc',
-        'base/color_space.h',
-        'base/data_source.cc',
-        'base/data_source.h',
-        'base/decoder_buffer.cc',
-        'base/decoder_buffer.h',
-        'base/decoder_buffer_cache.cc',
-        'base/decoder_buffer_cache.h',
-        'base/decrypt_config.cc',
-        'base/decrypt_config.h',
-        'base/demuxer.cc',
-        'base/demuxer.h',
-        'base/demuxer_stream.cc',
-        'base/demuxer_stream.h',
-        'base/demuxer_stream_provider.cc',
-        'base/demuxer_stream_provider.h',
-        'base/drm_system.cc',
-        'base/drm_system.h',
-        "base/encryption_pattern.cc",
-        "base/encryption_pattern.h",
-        'base/encryption_scheme.cc',
-        'base/encryption_scheme.h',
-        'base/hdr_metadata.cc',
-        'base/hdr_metadata.h',
-        'base/interleaved_sinc_resampler.cc',
-        'base/interleaved_sinc_resampler.h',
-        'base/media_log.cc',
-        'base/media_log.h',
-        'base/media_track.cc',
-        'base/media_track.h',
-        'base/media_tracks.cc',
-        'base/media_tracks.h',
-        'base/media_util.cc',
-        'base/media_util.h',
-        'base/mime_util.cc',
-        'base/mime_util.h',
-        'base/mime_util_internal.cc',
-        'base/mime_util_internal.h',
-        'base/playback_statistics.cc',
-        'base/playback_statistics.h',
-        'base/ranges.cc',
-        'base/ranges.h',
-        'base/sample_format.cc',
-        'base/sample_format.h',
-        'base/sbplayer_pipeline.cc',
-        'base/sbplayer_set_bounds_helper.cc',
-        'base/sbplayer_set_bounds_helper.h',
-        'base/starboard_player.cc',
-        'base/starboard_player.h',
-        'base/starboard_utils.cc',
-        'base/starboard_utils.h',
-        'base/stream_parser.cc',
-        'base/stream_parser.h',
-        'base/stream_parser_buffer.cc',
-        'base/stream_parser_buffer.h',
-        'base/text_track_config.cc',
-        'base/text_track_config.h',
-        'base/video_codecs.cc',
-        'base/video_codecs.h',
-        'base/video_decoder_config.cc',
-        'base/video_decoder_config.h',
-        'base/video_frame_provider.h',
-        'base/video_util.cc',
-        'base/video_util.h',
-        'filters/chunk_demuxer.cc',
-        'filters/chunk_demuxer.h',
-        'filters/frame_processor.cc',
-        'filters/frame_processor.h',
-        'filters/h264_bit_reader.cc',
-        'filters/h264_bit_reader.h',
-        'filters/h264_bitstream_buffer.cc',
-        'filters/h264_bitstream_buffer.h',
-        'filters/h264_parser.cc',
-        'filters/h264_parser.h',
-        'filters/h264_to_annex_b_bitstream_converter.cc',
-        'filters/h264_to_annex_b_bitstream_converter.h',
-        'filters/h265_parser.cc',
-        'filters/h265_parser.h',
-        'filters/source_buffer_range.cc',
-        'filters/source_buffer_range.h',
-        'filters/source_buffer_state.cc',
-        'filters/source_buffer_state.h',
-        'filters/source_buffer_stream.cc',
-        'filters/source_buffer_stream.h',
-        'filters/stream_parser_factory.cc',
-        'filters/stream_parser_factory.h',
-        'formats/common/offset_byte_queue.cc',
-        'formats/common/offset_byte_queue.h',
-        'formats/mp4/aac.cc',
-        'formats/mp4/aac.h',
-        'formats/mp4/avc.cc',
-        'formats/mp4/avc.h',
-        'formats/mp4/bitstream_converter.cc',
-        'formats/mp4/bitstream_converter.h',
-        'formats/mp4/box_definitions.cc',
-        'formats/mp4/box_definitions.h',
-        'formats/mp4/box_reader.cc',
-        'formats/mp4/box_reader.h',
-        'formats/mp4/es_descriptor.cc',
-        'formats/mp4/es_descriptor.h',
-        'formats/mp4/fourccs.h',
-        'formats/mp4/hevc.cc',
-        'formats/mp4/hevc.h',
-        'formats/mp4/mp4_stream_parser.cc',
-        'formats/mp4/mp4_stream_parser.h',
-        'formats/mp4/rcheck.h',
-        'formats/mp4/sample_to_group_iterator.cc',
-        'formats/mp4/sample_to_group_iterator.h',
-        'formats/mp4/track_run_iterator.cc',
-        'formats/mp4/track_run_iterator.h',
-        'formats/mpeg/adts_constants.cc',
-        'formats/mpeg/adts_constants.h',
-        'formats/mpeg/adts_stream_parser.cc',
-        'formats/mpeg/adts_stream_parser.h',
-        'formats/mpeg/mpeg1_audio_stream_parser.cc',
-        'formats/mpeg/mpeg1_audio_stream_parser.h',
-        'formats/mpeg/mpeg_audio_stream_parser_base.cc',
-        'formats/mpeg/mpeg_audio_stream_parser_base.h',
-        'formats/webm/cluster_builder.cc',
-        'formats/webm/cluster_builder.h',
-        'formats/webm/opus_packet_builder.cc',
-        'formats/webm/opus_packet_builder.h',
-        'formats/webm/tracks_builder.cc',
-        'formats/webm/tracks_builder.h',
-        'formats/webm/webm_audio_client.cc',
-        'formats/webm/webm_audio_client.h',
-        'formats/webm/webm_cluster_parser.cc',
-        'formats/webm/webm_cluster_parser.h',
-        'formats/webm/webm_colour_parser.cc',
-        'formats/webm/webm_colour_parser.h',
-        'formats/webm/webm_constants.cc',
-        'formats/webm/webm_constants.h',
-        'formats/webm/webm_content_encodings.cc',
-        'formats/webm/webm_content_encodings.h',
-        'formats/webm/webm_content_encodings_client.cc',
-        'formats/webm/webm_content_encodings_client.h',
-        'formats/webm/webm_crypto_helpers.cc',
-        'formats/webm/webm_crypto_helpers.h',
-        'formats/webm/webm_info_parser.cc',
-        'formats/webm/webm_info_parser.h',
-        'formats/webm/webm_parser.cc',
-        'formats/webm/webm_parser.h',
-        'formats/webm/webm_stream_parser.cc',
-        'formats/webm/webm_stream_parser.h',
-        'formats/webm/webm_tracks_parser.cc',
-        'formats/webm/webm_tracks_parser.h',
-        'formats/webm/webm_video_client.cc',
-        'formats/webm/webm_video_client.h',
-        'formats/webm/webm_webvtt_parser.cc',
-        'formats/webm/webm_webvtt_parser.h',
-        'player/buffered_data_source.h',
-        'player/web_media_player_impl.cc',
-        'player/web_media_player_impl.h',
-        'player/web_media_player_proxy.cc',
-        'player/web_media_player_proxy.h',
-        'progressive/avc_access_unit.cc',
-        'progressive/avc_access_unit.h',
-        'progressive/avc_parser.cc',
-        'progressive/avc_parser.h',
-        'progressive/data_source_reader.cc',
-        'progressive/data_source_reader.h',
-        'progressive/mp4_map.cc',
-        'progressive/mp4_map.h',
-        'progressive/mp4_parser.cc',
-        'progressive/mp4_parser.h',
-        'progressive/progressive_demuxer.cc',
-        'progressive/progressive_demuxer.h',
-        'progressive/progressive_parser.cc',
-        'progressive/progressive_parser.h',
-        'progressive/rbsp_stream.cc',
-        'progressive/rbsp_stream.h',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '..',
-        ],
-      },
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/url/url.gyp:url',
-        '<(DEPTH)/nb/nb.gyp:nb',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'media_test',
-      'type': '<(gtest_target_type)',
-      'dependencies': [
-        'media',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'sources': [
-        'progressive/mock_data_source_reader.h',
-        'progressive/mp4_map_unittest.cc',
-        'progressive/rbsp_stream_unittest.cc',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'media_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'media_test',
-      ],
-      'variables': {
-        'executable_name': 'media_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/media/media_module.cc b/cobalt/media/media_module.cc
index 8d4e195..89e251b 100644
--- a/cobalt/media/media_module.cc
+++ b/cobalt/media/media_module.cc
@@ -24,8 +24,7 @@
 #include "base/logging.h"
 #include "base/strings/string_split.h"
 #include "base/synchronization/waitable_event.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/mime_util.h"
+#include "cobalt/media/base/format_support_query_metrics.h"
 #include "nb/memory_scope.h"
 #include "starboard/common/string.h"
 #include "starboard/media.h"
@@ -60,7 +59,9 @@
       continue;
     }
     if (name_and_value[0] == "codecs") {
-      ParseCodecString(name_and_value[1], &codecs, /* strip= */ false);
+      // TODO(b/230888580): Revive ParseCodecString() to enable returning of
+      // `codecs`.
+      //   ParseCodecString(name_and_value[1], &codecs, /* strip= */ false);
       return codecs;
     }
   }
@@ -120,18 +121,27 @@
     //   video/webm; codecs="vp9"
     // We do a rough pre-filter to ensure that only video/mp4 is supported as
     // progressive.
+    SbMediaSupportType support_type;
+    media::FormatSupportQueryMetrics metrics;
     if (strstr(mime_type.c_str(), "video/mp4") == 0 &&
         strstr(mime_type.c_str(), "application/x-mpegURL") == 0) {
-      return kSbMediaSupportTypeNotSupported;
+      support_type = kSbMediaSupportTypeNotSupported;
+    } else {
+      support_type = CanPlayType(mime_type, "");
     }
-
-    return CanPlayType(mime_type, "");
+    metrics.RecordQuery("HTMLMediaElement::canPlayType", mime_type, "",
+                        support_type);
+    return support_type;
   }
 
   SbMediaSupportType CanPlayAdaptive(
       const std::string& mime_type,
       const std::string& key_system) const override {
-    return CanPlayType(mime_type, key_system);
+    media::FormatSupportQueryMetrics metrics;
+    SbMediaSupportType support_type = CanPlayType(mime_type, key_system);
+    metrics.RecordQuery("MediaSource::IsTypeSupported", mime_type, key_system,
+                        support_type);
+    return support_type;
   }
 
  private:
@@ -186,8 +196,7 @@
       window,
       base::Bind(&MediaModule::GetSbDecodeTargetGraphicsContextProvider,
                  base::Unretained(this)),
-      client, this, &decoder_buffer_allocator_,
-      options_.allow_resume_after_suspend, new media::MediaLog));
+      client, this, options_.allow_resume_after_suspend, &media_log_));
 }
 
 void MediaModule::Suspend() {
diff --git a/cobalt/media/media_module.h b/cobalt/media/media_module.h
index c2c3df8..94cc140 100644
--- a/cobalt/media/media_module.h
+++ b/cobalt/media/media_module.h
@@ -34,6 +34,7 @@
 #include "cobalt/render_tree/resource_provider.h"
 #include "cobalt/system_window/system_window.h"
 #include "starboard/common/mutex.h"
+#include "third_party/chromium/media/base/media_log.h"
 
 namespace cobalt {
 namespace media {
@@ -109,6 +110,8 @@
   system_window::SystemWindow* system_window_;
   cobalt::render_tree::ResourceProvider* resource_provider_;
 
+  ::media::MediaLog media_log_;
+
   // Protect access to the list of players.
   starboard::Mutex players_lock_;
 
diff --git a/cobalt/media/player/web_media_player.h b/cobalt/media/player/web_media_player.h
index ea66d09..53a9999 100644
--- a/cobalt/media/player/web_media_player.h
+++ b/cobalt/media/player/web_media_player.h
@@ -8,6 +8,7 @@
 // The temporary home for WebMediaPlayer and WebMediaPlayerClient. They are the
 // interface between the HTMLMediaElement and the media stack.
 
+#include <functional>
 #include <memory>
 #include <string>
 #include <vector>
@@ -18,14 +19,17 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
-#include "cobalt/math/rect.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/ranges.h"
 #include "cobalt/media/base/video_frame_provider.h"
-#include "cobalt/media/filters/chunk_demuxer.h"
 #include "cobalt/media/player/buffered_data_source.h"
 #include "url/gurl.h"
 
+namespace media {
+
+class ChunkDemuxer;
+class TimeRanges;
+
+}  // namespace media
+
 namespace cobalt {
 namespace media {
 
@@ -35,7 +39,8 @@
  public:
   // Return true if the punch through box should be rendered.  Return false if
   // no punch through box should be rendered.
-  typedef base::Callback<bool(const math::Rect&)> SetBoundsCB;
+  typedef base::Callback<bool(int x, int y, int width, int height)> SetBoundsCB;
+  typedef std::function<void(float start, float end)> AddRangeCB;
 
   enum NetworkState {
     kNetworkStateEmpty,
@@ -110,7 +115,7 @@
   virtual void SetRate(float rate) = 0;
   virtual void SetVolume(float volume) = 0;
   virtual void SetVisible(bool visible) = 0;
-  virtual const Ranges<base::TimeDelta>& GetBufferedTimeRanges() = 0;
+  virtual void UpdateBufferedTimeRanges(const AddRangeCB& add_range_cb) = 0;
   virtual float GetMaxTimeSeekable() const = 0;
 
   // Suspend/Resume
@@ -124,7 +129,8 @@
   virtual bool HasAudio() const = 0;
 
   // Dimension of the video.
-  virtual math::Size GetNaturalSize() const = 0;
+  virtual int GetNaturalWidth() const = 0;
+  virtual int GetNaturalHeight() const = 0;
 
   // Getters of playback state.
   virtual bool IsPaused() const = 0;
@@ -162,9 +168,6 @@
     return kAddIdStatusNotSupported;
   }
   virtual bool SourceRemoveId(const std::string& id) { return false; }
-  virtual Ranges<base::TimeDelta> SourceBuffered(const std::string& id) {
-    return Ranges<base::TimeDelta>();
-  }
   virtual bool SourceAppend(const std::string& id, const unsigned char* data,
                             unsigned length) {
     return false;
@@ -216,7 +219,7 @@
   virtual void SetOpaque(bool opaque) {}
   virtual void SawUnsupportedTracks() = 0;
   virtual float Volume() const = 0;
-  virtual void SourceOpened(ChunkDemuxer* chunk_demuxer) = 0;
+  virtual void SourceOpened(::media::ChunkDemuxer* chunk_demuxer) = 0;
   virtual std::string SourceURL() const = 0;
   virtual std::string MaxVideoCapabilities() const = 0;
 
@@ -229,7 +232,7 @@
   // Notifies the client that a video is encrypted. Client is supposed to call
   // |WebMediaPlayer::SetDrmSystem| as soon as possible to avoid stalling
   // playback.
-  virtual void EncryptedMediaInitDataEncountered(EmeInitDataType init_data_type,
+  virtual void EncryptedMediaInitDataEncountered(const char* init_data_type,
                                                  const unsigned char* init_data,
                                                  unsigned init_data_length) = 0;
   // TODO: Revisit the necessity of the following functions.
diff --git a/cobalt/media/player/web_media_player_impl.cc b/cobalt/media/player/web_media_player_impl.cc
index f53cf91..bba2962 100644
--- a/cobalt/media/player/web_media_player_impl.cc
+++ b/cobalt/media/player/web_media_player_impl.cc
@@ -19,14 +19,16 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/trace_event/trace_event.h"
 #include "cobalt/base/instance_counter.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
 #include "cobalt/media/base/drm_system.h"
-#include "cobalt/media/base/limits.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/filters/chunk_demuxer.h"
 #include "cobalt/media/player/web_media_player_proxy.h"
 #include "cobalt/media/progressive/progressive_demuxer.h"
 #include "starboard/types.h"
+#include "third_party/chromium/media/base/bind_to_current_loop.h"
+#include "third_party/chromium/media/base/limits.h"
+#include "third_party/chromium/media/base/timestamp_constants.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/rect.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/size.h"
+#include "third_party/chromium/media/filters/chunk_demuxer.h"
 
 namespace cobalt {
 namespace media {
@@ -94,10 +96,10 @@
 }  // namespace
 
 #define BIND_TO_RENDER_LOOP(function) \
-  BindToCurrentLoop(base::Bind(function, AsWeakPtr()))
+  ::media::BindToCurrentLoop(base::Bind(function, AsWeakPtr()))
 
 #define BIND_TO_RENDER_LOOP_2(function, arg1, arg2) \
-  BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1, arg2))
+  ::media::BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1, arg2))
 
 // TODO(acolwell): Investigate whether the key_system & session_id parameters
 // are really necessary.
@@ -110,15 +112,13 @@
     const Pipeline::GetDecodeTargetGraphicsContextProviderFunc&
         get_decode_target_graphics_context_provider_func,
     WebMediaPlayerClient* client, WebMediaPlayerDelegate* delegate,
-    DecoderBuffer::Allocator* buffer_allocator, bool allow_resume_after_suspend,
-    const scoped_refptr<MediaLog>& media_log)
+    bool allow_resume_after_suspend, ::media::MediaLog* const media_log)
     : pipeline_thread_("media_pipeline"),
       network_state_(WebMediaPlayer::kNetworkStateEmpty),
       ready_state_(WebMediaPlayer::kReadyStateHaveNothing),
       main_loop_(base::MessageLoop::current()),
       client_(client),
       delegate_(delegate),
-      buffer_allocator_(buffer_allocator),
       allow_resume_after_suspend_(allow_resume_after_suspend),
       proxy_(new WebMediaPlayerProxy(main_loop_->task_runner(), this)),
       media_log_(media_log),
@@ -134,14 +134,12 @@
 
   video_frame_provider_ = new VideoFrameProvider();
 
-  DCHECK(buffer_allocator_);
-  media_log_->AddEvent(
-      media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED));
+  media_log_->AddEvent<::media::MediaLogEvent::kWebMediaPlayerCreated>();
 
   pipeline_thread_.Start();
   pipeline_ = Pipeline::Create(window, pipeline_thread_.task_runner(),
                                get_decode_target_graphics_context_provider_func,
-                               allow_resume_after_suspend_, media_log_.get(),
+                               allow_resume_after_suspend_, media_log_,
                                video_frame_provider_.get());
 
   // Also we want to be notified of |main_loop_| destruction.
@@ -167,8 +165,7 @@
   progressive_demuxer_.reset();
   chunk_demuxer_.reset();
 
-  media_log_->AddEvent(
-      media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_DESTROYED));
+  media_log_->AddEvent<::media::MediaLogEvent::kWebMediaPlayerDestroyed>();
 
   // Finally tell the |main_loop_| we don't want to be notified of destruction
   // event.
@@ -226,7 +223,7 @@
   // TODO: Set networkState to WebMediaPlayer::kNetworkStateIdle on stop.
   SetNetworkState(WebMediaPlayer::kNetworkStateLoading);
   SetReadyState(WebMediaPlayer::kReadyStateHaveNothing);
-  media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec()));
+  media_log_->AddEvent<::media::MediaLogEvent::kLoad>(url.spec());
 
   is_local_source_ = !url.SchemeIs("http") && !url.SchemeIs("https");
 
@@ -247,12 +244,13 @@
   SetReadyState(WebMediaPlayer::kReadyStateHaveNothing);
 
   // Media source pipelines can start immediately.
-  chunk_demuxer_.reset(new ChunkDemuxer(
-      buffer_allocator_,
+  chunk_demuxer_.reset(new ::media::ChunkDemuxer(
       BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened),
+      // TODO(b/230878852): Handle progress callback.
+      base::BindRepeating([]() {}),
       BIND_TO_RENDER_LOOP(
-          &WebMediaPlayerImpl::OnEncryptedMediaInitDataEncountered),
-      media_log_, true));
+          &WebMediaPlayerImpl::OnEncryptedMediaInitDataEncounteredWrapper),
+      media_log_));
 
   supports_save_ = false;
   state_.is_media_source = true;
@@ -272,7 +270,7 @@
 
   SetNetworkState(WebMediaPlayer::kNetworkStateLoading);
   SetReadyState(WebMediaPlayer::kReadyStateHaveNothing);
-  media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec()));
+  media_log_->AddEvent<::media::MediaLogEvent::kLoad>(url.spec());
 
   data_source->SetDownloadingStatusCB(
       base::Bind(&WebMediaPlayerImpl::OnDownloadingStatusChanged, AsWeakPtr()));
@@ -280,9 +278,8 @@
 
   is_local_source_ = !url.SchemeIs("http") && !url.SchemeIs("https");
 
-  progressive_demuxer_.reset(
-      new ProgressiveDemuxer(pipeline_thread_.task_runner(), buffer_allocator_,
-                             proxy_->data_source(), media_log_));
+  progressive_demuxer_.reset(new ProgressiveDemuxer(
+      pipeline_thread_.task_runner(), proxy_->data_source(), media_log_));
 
   state_.is_progressive = true;
   StartPipeline(progressive_demuxer_.get());
@@ -300,7 +297,7 @@
   state_.paused = false;
   pipeline_->SetPlaybackRate(state_.playback_rate);
 
-  media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PLAY));
+  media_log_->AddEvent<::media::MediaLogEvent::kPlay>();
 }
 
 void WebMediaPlayerImpl::Pause() {
@@ -310,7 +307,7 @@
   pipeline_->SetPlaybackRate(0.0f);
   state_.paused_time = pipeline_->GetMediaTime();
 
-  media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PAUSE));
+  media_log_->AddEvent<::media::MediaLogEvent::kPause>();
 }
 
 bool WebMediaPlayerImpl::SupportsFullscreen() const {
@@ -345,7 +342,7 @@
     return;
   }
 
-  media_log_->AddEvent(media_log_->CreateSeekEvent(seconds));
+  media_log_->AddEvent<::media::MediaLogEvent::kSeek>(seconds);
 
   base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds);
 
@@ -416,12 +413,20 @@
   return pipeline_->HasAudio();
 }
 
-math::Size WebMediaPlayerImpl::GetNaturalSize() const {
+int WebMediaPlayerImpl::GetNaturalWidth() const {
   DCHECK_EQ(main_loop_, base::MessageLoop::current());
 
-  math::Size size;
+  gfx::Size size;
   pipeline_->GetNaturalVideoSize(&size);
-  return size;
+  return size.width();
+}
+
+int WebMediaPlayerImpl::GetNaturalHeight() const {
+  DCHECK_EQ(main_loop_, base::MessageLoop::current());
+
+  gfx::Size size;
+  pipeline_->GetNaturalVideoSize(&size);
+  return size.height();
 }
 
 bool WebMediaPlayerImpl::IsPaused() const {
@@ -448,7 +453,7 @@
 
   // Return positive infinity if the resource is unbounded.
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#dom-media-duration
-  if (duration == kInfiniteDuration)
+  if (duration == ::media::kInfiniteDuration)
     return std::numeric_limits<float>::infinity();
 
   return static_cast<float>(duration.InSecondsF());
@@ -498,10 +503,16 @@
   return ready_state_;
 }
 
-const Ranges<base::TimeDelta>& WebMediaPlayerImpl::GetBufferedTimeRanges() {
+void WebMediaPlayerImpl::UpdateBufferedTimeRanges(
+    const AddRangeCB& add_range_cb) {
   DCHECK_EQ(main_loop_, base::MessageLoop::current());
-  buffered_ = pipeline_->GetBufferedTimeRanges();
-  return buffered_;
+  DCHECK(add_range_cb);
+
+  auto buffered = pipeline_->GetBufferedTimeRanges();
+
+  for (int i = 0; i < static_cast<int>(buffered.size()); ++i) {
+    add_range_cb(buffered.start(i).InSecondsF(), buffered.end(i).InSecondsF());
+  }
 }
 
 float WebMediaPlayerImpl::GetMaxTimeSeekable() const {
@@ -545,7 +556,7 @@
   DCHECK_EQ(main_loop_, base::MessageLoop::current());
 
   PlayerStatistics statistics;
-  PipelineStatistics pipeline_stats = pipeline_->GetStatistics();
+  ::media::PipelineStatistics pipeline_stats = pipeline_->GetStatistics();
   statistics.audio_bytes_decoded = pipeline_stats.audio_bytes_decoded;
   statistics.video_bytes_decoded = pipeline_stats.video_bytes_decoded;
   statistics.video_frames_decoded = pipeline_stats.video_frames_decoded;
@@ -594,7 +605,7 @@
   }
 }
 
-void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status,
+void WebMediaPlayerImpl::OnPipelineSeek(::media::PipelineStatus status,
                                         bool is_initial_preroll,
                                         const std::string& error_message) {
   DCHECK_EQ(main_loop_, base::MessageLoop::current());
@@ -606,7 +617,7 @@
     return;
   }
 
-  if (status != PIPELINE_OK) {
+  if (status != ::media::PIPELINE_OK) {
     OnPipelineError(status,
                     "Failed pipeline seek with error: " + error_message + ".");
     return;
@@ -621,9 +632,9 @@
   }
 }
 
-void WebMediaPlayerImpl::OnPipelineEnded(PipelineStatus status) {
+void WebMediaPlayerImpl::OnPipelineEnded(::media::PipelineStatus status) {
   DCHECK_EQ(main_loop_, base::MessageLoop::current());
-  if (status != PIPELINE_OK) {
+  if (status != ::media::PIPELINE_OK) {
     OnPipelineError(status, "Failed pipeline end.");
     return;
   }
@@ -632,13 +643,13 @@
   GetClient()->TimeChanged(kEosPlayed);
 }
 
-void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error,
+void WebMediaPlayerImpl::OnPipelineError(::media::PipelineStatus error,
                                          const std::string& message) {
   DCHECK_EQ(main_loop_, base::MessageLoop::current());
 
   if (suppress_destruction_errors_) return;
 
-  media_log_->AddEvent(media_log_->CreatePipelineErrorEvent(error));
+  media_log_->NotifyError(error);
 
   if (ready_state_ == WebMediaPlayer::kReadyStateHaveNothing) {
     // Any error that occurs before reaching ReadyStateHaveMetadata should
@@ -651,19 +662,19 @@
 
   std::string default_message;
   switch (error) {
-    case PIPELINE_OK:
+    case ::media::PIPELINE_OK:
       NOTREACHED() << "PIPELINE_OK isn't an error!";
       break;
 
-    case PIPELINE_ERROR_NETWORK:
+    case ::media::PIPELINE_ERROR_NETWORK:
       SetNetworkError(WebMediaPlayer::kNetworkStateNetworkError,
                       message.empty() ? "Pipeline network error." : message);
       break;
-    case PIPELINE_ERROR_READ:
+    case ::media::PIPELINE_ERROR_READ:
       SetNetworkError(WebMediaPlayer::kNetworkStateNetworkError,
                       message.empty() ? "Pipeline read error." : message);
       break;
-    case CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR:
+    case ::media::CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR:
       SetNetworkError(
           WebMediaPlayer::kNetworkStateNetworkError,
           message.empty() ? "Chunk demuxer eos network error." : message);
@@ -672,73 +683,72 @@
     // TODO(vrk): Because OnPipelineInitialize() directly reports the
     // NetworkStateFormatError instead of calling OnPipelineError(), I believe
     // this block can be deleted. Should look into it! (crbug.com/126070)
-    case PIPELINE_ERROR_INITIALIZATION_FAILED:
+    case ::media::PIPELINE_ERROR_INITIALIZATION_FAILED:
       SetNetworkError(
           WebMediaPlayer::kNetworkStateFormatError,
           message.empty() ? "Pipeline initialization failed." : message);
       break;
-    case PIPELINE_ERROR_COULD_NOT_RENDER:
+    case ::media::PIPELINE_ERROR_COULD_NOT_RENDER:
       SetNetworkError(WebMediaPlayer::kNetworkStateFormatError,
                       message.empty() ? "Pipeline could not render." : message);
       break;
-    case PIPELINE_ERROR_EXTERNAL_RENDERER_FAILED:
+    case ::media::PIPELINE_ERROR_EXTERNAL_RENDERER_FAILED:
       SetNetworkError(
           WebMediaPlayer::kNetworkStateFormatError,
           message.empty() ? "Pipeline external renderer failed." : message);
       break;
-    case DEMUXER_ERROR_COULD_NOT_OPEN:
+    case ::media::DEMUXER_ERROR_COULD_NOT_OPEN:
       SetNetworkError(WebMediaPlayer::kNetworkStateFormatError,
                       message.empty() ? "Demuxer could not open." : message);
       break;
-    case DEMUXER_ERROR_COULD_NOT_PARSE:
+    case ::media::DEMUXER_ERROR_COULD_NOT_PARSE:
       SetNetworkError(WebMediaPlayer::kNetworkStateFormatError,
                       message.empty() ? "Demuxer could not parse." : message);
       break;
-    case DEMUXER_ERROR_NO_SUPPORTED_STREAMS:
+    case ::media::DEMUXER_ERROR_NO_SUPPORTED_STREAMS:
       SetNetworkError(
           WebMediaPlayer::kNetworkStateFormatError,
           message.empty() ? "Demuxer no supported streams." : message);
       break;
-    case DECODER_ERROR_NOT_SUPPORTED:
+    case ::media::DECODER_ERROR_NOT_SUPPORTED:
       SetNetworkError(WebMediaPlayer::kNetworkStateFormatError,
                       message.empty() ? "Decoder not supported." : message);
       break;
 
-    case PIPELINE_ERROR_DECODE:
+    case ::media::PIPELINE_ERROR_DECODE:
       SetNetworkError(WebMediaPlayer::kNetworkStateDecodeError,
                       message.empty() ? "Pipeline decode error." : message);
       break;
-    case PIPELINE_ERROR_ABORT:
+    case ::media::PIPELINE_ERROR_ABORT:
       SetNetworkError(WebMediaPlayer::kNetworkStateDecodeError,
                       message.empty() ? "Pipeline abort." : message);
       break;
-    case PIPELINE_ERROR_INVALID_STATE:
+    case ::media::PIPELINE_ERROR_INVALID_STATE:
       SetNetworkError(WebMediaPlayer::kNetworkStateDecodeError,
                       message.empty() ? "Pipeline invalid state." : message);
       break;
-    case CHUNK_DEMUXER_ERROR_APPEND_FAILED:
+    case ::media::CHUNK_DEMUXER_ERROR_APPEND_FAILED:
       SetNetworkError(
           WebMediaPlayer::kNetworkStateDecodeError,
           message.empty() ? "Chunk demuxer append failed." : message);
       break;
-    case CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR:
+    case ::media::CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR:
       SetNetworkError(
           WebMediaPlayer::kNetworkStateDecodeError,
           message.empty() ? "Chunk demuxer eos decode error." : message);
       break;
-    case AUDIO_RENDERER_ERROR:
+    case ::media::AUDIO_RENDERER_ERROR:
       SetNetworkError(WebMediaPlayer::kNetworkStateDecodeError,
                       message.empty() ? "Audio renderer error." : message);
       break;
-    case AUDIO_RENDERER_ERROR_SPLICE_FAILED:
-      SetNetworkError(
-          WebMediaPlayer::kNetworkStateDecodeError,
-          message.empty() ? "Audio renderer splice failed." : message);
-      break;
-    case PLAYBACK_CAPABILITY_CHANGED:
+    case ::media::PLAYBACK_CAPABILITY_CHANGED:
       SetNetworkError(WebMediaPlayer::kNetworkStateCapabilityChangedError,
                       message.empty() ? "Capability changed." : message);
       break;
+    default:
+      // TODO(b/230881576): Handle any new enum values that not handled.
+      NOTREACHED();
+      break;
   }
 }
 
@@ -783,9 +793,6 @@
   else if (is_downloading &&
            network_state_ == WebMediaPlayer::kNetworkStateIdle)
     SetNetworkState(WebMediaPlayer::kNetworkStateLoading);
-  media_log_->AddEvent(
-      media_log_->CreateBooleanEvent(MediaLogEvent::NETWORK_ACTIVITY_SET,
-                                     "is_downloading_data", is_downloading));
 }
 
 #if SB_HAS(PLAYER_WITH_URL)
@@ -808,7 +815,8 @@
       BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnContentSizeChanged));
 }
 #endif  // SB_HAS(PLAYER_WITH_URL)
-void WebMediaPlayerImpl::StartPipeline(Demuxer* demuxer) {
+
+void WebMediaPlayerImpl::StartPipeline(::media::Demuxer* demuxer) {
   TRACE_EVENT0("cobalt::media", "WebMediaPlayerImpl::StartPipeline");
 
   state_.starting = true;
@@ -910,13 +918,40 @@
 }
 
 void WebMediaPlayerImpl::OnEncryptedMediaInitDataEncountered(
-    EmeInitDataType init_data_type, const std::vector<uint8_t>& init_data) {
+    const char* init_data_type, const std::vector<uint8_t>& init_data) {
   DCHECK_EQ(main_loop_, base::MessageLoop::current());
 
   GetClient()->EncryptedMediaInitDataEncountered(init_data_type, &init_data[0],
                                                  init_data.size());
 }
 
+void WebMediaPlayerImpl::OnEncryptedMediaInitDataEncounteredWrapper(
+    ::media::EmeInitDataType init_data_type,
+    const std::vector<uint8_t>& init_data) {
+  DCHECK_EQ(main_loop_, base::MessageLoop::current());
+
+  // Initialization data types are defined in
+  // https://www.w3.org/TR/eme-initdata-registry/#registry.
+  switch (init_data_type) {
+    case ::media::EmeInitDataType::UNKNOWN:
+      LOG(WARNING) << "Unknown EME initialization data type.";
+      OnEncryptedMediaInitDataEncountered("", init_data);
+      break;
+    case ::media::EmeInitDataType::WEBM:
+      OnEncryptedMediaInitDataEncountered("webm", init_data);
+      break;
+    case ::media::EmeInitDataType::CENC:
+      OnEncryptedMediaInitDataEncountered("cenc", init_data);
+      break;
+    case ::media::EmeInitDataType::KEYIDS:
+      OnEncryptedMediaInitDataEncountered("keyids", init_data);
+      break;
+    default:
+      NOTREACHED();
+      break;
+  }
+}
+
 WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() {
   DCHECK_EQ(main_loop_, base::MessageLoop::current());
   DCHECK(client_);
diff --git a/cobalt/media/player/web_media_player_impl.h b/cobalt/media/player/web_media_player_impl.h
index 8707d64..09ffa6c 100644
--- a/cobalt/media/player/web_media_player_impl.h
+++ b/cobalt/media/player/web_media_player_impl.h
@@ -59,14 +59,13 @@
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "cobalt/math/size.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer.h"
-#include "cobalt/media/base/eme_constants.h"
 #include "cobalt/media/base/pipeline.h"
-#include "cobalt/media/base/ranges.h"
 #include "cobalt/media/base/video_frame_provider.h"
 #include "cobalt/media/player/web_media_player.h"
 #include "cobalt/media/player/web_media_player_delegate.h"
+#include "third_party/chromium/media/base/demuxer.h"
+#include "third_party/chromium/media/base/eme_constants.h"
+#include "third_party/chromium/media/base/media_log.h"
 #include "url/gurl.h"
 
 #if defined(STARBOARD)
@@ -79,8 +78,6 @@
 namespace cobalt {
 namespace media {
 
-class ChunkDemuxer;
-class MediaLog;
 class WebMediaPlayerProxy;
 
 class WebMediaPlayerImpl : public WebMediaPlayer,
@@ -110,9 +107,8 @@
                          get_decode_target_graphics_context_provider_func,
                      WebMediaPlayerClient* client,
                      WebMediaPlayerDelegate* delegate,
-                     DecoderBuffer::Allocator* buffer_allocator,
                      bool allow_resume_after_suspend,
-                     const scoped_refptr<MediaLog>& media_log);
+                     ::media::MediaLog* const media_log);
   ~WebMediaPlayerImpl() override;
 
 #if SB_HAS(PLAYER_WITH_URL)
@@ -135,7 +131,7 @@
   void SetRate(float rate) override;
   void SetVolume(float volume) override;
   void SetVisible(bool visible) override;
-  const Ranges<base::TimeDelta>& GetBufferedTimeRanges() override;
+  void UpdateBufferedTimeRanges(const AddRangeCB& add_range_cb) override;
   float GetMaxTimeSeekable() const override;
 
   // Suspend/Resume
@@ -149,7 +145,8 @@
   bool HasAudio() const override;
 
   // Dimensions of the video.
-  math::Size GetNaturalSize() const override;
+  int GetNaturalWidth() const override;
+  int GetNaturalHeight() const override;
 
   // Getters of playback state.
   bool IsPaused() const override;
@@ -194,10 +191,11 @@
   void SetDrmSystem(const scoped_refptr<media::DrmSystem>& drm_system) override;
   void SetDrmSystemReadyCB(const DrmSystemReadyCB& drm_system_ready_cb);
 
-  void OnPipelineSeek(PipelineStatus status, bool is_initial_preroll,
+  void OnPipelineSeek(::media::PipelineStatus status, bool is_initial_preroll,
                       const std::string& error_message);
-  void OnPipelineEnded(PipelineStatus status);
-  void OnPipelineError(PipelineStatus error, const std::string& message);
+  void OnPipelineEnded(::media::PipelineStatus status);
+  void OnPipelineError(::media::PipelineStatus error,
+                       const std::string& message);
   void OnPipelineBufferingState(Pipeline::BufferingState buffering_state);
   void OnDemuxerOpened();
   void SetOpaque(bool);
@@ -210,7 +208,7 @@
 #if SB_HAS(PLAYER_WITH_URL)
   void StartPipeline(const GURL& url);
 #endif  // SB_HAS(PLAYER_WITH_URL)
-  void StartPipeline(Demuxer* demuxer);
+  void StartPipeline(::media::Demuxer* demuxer);
 
   // Helpers that set the network/ready state and notifies the client if
   // they've changed.
@@ -223,11 +221,11 @@
 
   void GetMediaTimeAndSeekingState(base::TimeDelta* media_time,
                                    bool* is_seeking) const;
-  void OnEncryptedMediaInitDataEncountered(
-      EmeInitDataType init_data_type, const std::vector<uint8_t>& init_data);
   void OnEncryptedMediaInitDataEncounteredWrapper(
-      const char* init_data_type, const unsigned char* init_data,
-      unsigned int init_data_length);
+      ::media::EmeInitDataType init_data_type,
+      const std::vector<uint8_t>& init_data);
+  void OnEncryptedMediaInitDataEncountered(
+      const char* init_data_type, const std::vector<uint8_t>& init_data);
 
   // Getter method to |client_|.
   WebMediaPlayerClient* GetClient();
@@ -244,9 +242,6 @@
   NetworkState network_state_;
   ReadyState ready_state_;
 
-  // Keep a list of buffered time ranges.
-  Ranges<base::TimeDelta> buffered_;
-
   // Message loops for posting tasks between Chrome's main thread. Also used
   // for DCHECKs so methods calls won't execute in the wrong thread.
   base::MessageLoop* main_loop_;
@@ -300,21 +295,20 @@
 
   WebMediaPlayerClient* client_;
   WebMediaPlayerDelegate* delegate_;
-  DecoderBuffer::Allocator* buffer_allocator_;
   bool allow_resume_after_suspend_;
   scoped_refptr<VideoFrameProvider> video_frame_provider_;
 
   scoped_refptr<WebMediaPlayerProxy> proxy_;
 
-  scoped_refptr<MediaLog> media_log_;
+  ::media::MediaLog* const media_log_;
 
   bool incremented_externally_allocated_memory_;
 
   bool is_local_source_;
   bool supports_save_;
 
-  std::unique_ptr<Demuxer> progressive_demuxer_;
-  std::unique_ptr<ChunkDemuxer> chunk_demuxer_;
+  std::unique_ptr<::media::Demuxer> progressive_demuxer_;
+  std::unique_ptr<::media::ChunkDemuxer> chunk_demuxer_;
 
   // Suppresses calls to OnPipelineError() after destruction / shutdown has been
   // started; prevents us from spuriously logging errors that are transient or
diff --git a/cobalt/media/progressive/avc_access_unit.cc b/cobalt/media/progressive/avc_access_unit.cc
index 25ad24e..6e6468b 100644
--- a/cobalt/media/progressive/avc_access_unit.cc
+++ b/cobalt/media/progressive/avc_access_unit.cc
@@ -16,16 +16,19 @@
 
 #include <algorithm>
 
-#include "cobalt/media/base/decoder_buffer.h"
 #include "cobalt/media/base/endian_util.h"
-#include "cobalt/media/base/timestamp_constants.h"
 #include "cobalt/media/progressive/progressive_parser.h"
+#include "third_party/chromium/media/base/decoder_buffer.h"
+#include "third_party/chromium/media/base/timestamp_constants.h"
 
 namespace cobalt {
 namespace media {
 
 namespace {
 
+using ::media::DecoderBuffer;
+using ::media::DemuxerStream;
+
 bool ReadBytes(uint64 offset, size_t size, uint8* buffer,
                DataSourceReader* reader) {
   if (reader->BlockingRead(offset, size, buffer) != size) {
@@ -35,44 +38,14 @@
   return true;
 }
 
-bool ReadBytes(uint64 offset, size_t size, DecoderBuffer* decoder_buffer,
-               uint64 decoder_buffer_offset, DataSourceReader* reader) {
-  size_t buffer_index = 0;
-  auto& allocations = decoder_buffer->allocations();
-  while (size > 0) {
-    if (buffer_index >= allocations.number_of_buffers()) {
-      NOTREACHED();
-      return false;
-    }
-    size_t buffer_size = allocations.buffer_sizes()[buffer_index];
-    if (buffer_size <= decoder_buffer_offset) {
-      decoder_buffer_offset -= buffer_size;
-    } else {
-      size_t bytes_to_read = std::min(
-          size, buffer_size - static_cast<size_t>(decoder_buffer_offset));
-      uint8_t* destination =
-          static_cast<uint8_t*>(allocations.buffers()[buffer_index]);
-      if (reader->BlockingRead(offset, bytes_to_read,
-                               destination + decoder_buffer_offset) !=
-          bytes_to_read) {
-        DLOG(ERROR) << "unable to download AU";
-        return false;
-      }
-      decoder_buffer_offset = 0;
-      size -= bytes_to_read;
-    }
-    ++buffer_index;
-  }
-
-  return true;
-}
-
 // ==== EndOfStreamAU ==================================================
 
 class EndOfStreamAU : public AvcAccessUnit {
  public:
   EndOfStreamAU(Type type, TimeDelta timestamp)
-      : type_(type), timestamp_(timestamp), duration_(kInfiniteDuration) {}
+      : type_(type),
+        timestamp_(timestamp),
+        duration_(::media::kInfiniteDuration) {}
 
  private:
   bool IsEndOfStream() const override { return true; }
@@ -112,7 +85,7 @@
  private:
   bool IsEndOfStream() const override { return false; }
   bool IsValid() const override {
-    return offset_ != 0 && size_ != 0 && timestamp_ != kNoTimestamp;
+    return offset_ != 0 && size_ != 0 && timestamp_ != ::media::kNoTimestamp;
   }
   bool Read(DataSourceReader* reader, DecoderBuffer* buffer) override;
   Type GetType() const override { return DemuxerStream::AUDIO; }
@@ -147,7 +120,9 @@
 
 bool AudioAU::Read(DataSourceReader* reader, DecoderBuffer* buffer) {
   DCHECK_LE(size_ + prepend_size_, buffer->data_size());
-  if (!ReadBytes(offset_, size_, buffer, prepend_size_, reader)) return false;
+  if (!ReadBytes(offset_, size_, buffer->writable_data() + prepend_size_,
+                 reader))
+    return false;
 
   if (!parser_->Prepend(this, buffer)) {
     DLOG(ERROR) << "prepend fail";
@@ -168,7 +143,7 @@
  private:
   bool IsEndOfStream() const override { return false; }
   bool IsValid() const override {
-    return offset_ != 0 && size_ != 0 && timestamp_ != kNoTimestamp;
+    return offset_ != 0 && size_ != 0 && timestamp_ != ::media::kNoTimestamp;
   }
   bool Read(DataSourceReader* reader, DecoderBuffer* buffer) override;
   Type GetType() const override { return DemuxerStream::VIDEO; }
@@ -226,8 +201,8 @@
     uint32 nal_size;
 
     // Store [start code]
-    buffer->allocations().Write(decoder_buffer_offset, kAnnexBStartCode,
-                                kAnnexBStartCodeSize);
+    memcpy(buffer->writable_data() + decoder_buffer_offset, kAnnexBStartCode,
+           kAnnexBStartCodeSize);
     decoder_buffer_offset += kAnnexBStartCodeSize;
     buf_left -= kAnnexBStartCodeSize;
 
@@ -250,8 +225,8 @@
     if (au_left < nal_size || buf_left < nal_size) break;
 
     // Read the [data] from reader into buf
-    if (!ReadBytes(au_offset, nal_size, buffer, decoder_buffer_offset,
-                   reader)) {
+    if (!ReadBytes(au_offset, nal_size,
+                   buffer->writable_data() + decoder_buffer_offset, reader)) {
       return false;
     }
 
diff --git a/cobalt/media/progressive/avc_access_unit.h b/cobalt/media/progressive/avc_access_unit.h
index 7c283e9..fd49527 100644
--- a/cobalt/media/progressive/avc_access_unit.h
+++ b/cobalt/media/progressive/avc_access_unit.h
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef COBALT_MEDIA_PROGRESSIVE_ACCESS_UNIT_H_
-#define COBALT_MEDIA_PROGRESSIVE_ACCESS_UNIT_H_
+#ifndef COBALT_MEDIA_PROGRESSIVE_AVC_ACCESS_UNIT_H_
+#define COBALT_MEDIA_PROGRESSIVE_AVC_ACCESS_UNIT_H_
 
 #include "base/memory/ref_counted.h"
-#include "cobalt/media/base/demuxer_stream.h"
 #include "cobalt/media/progressive/data_source_reader.h"
+#include "media/base/demuxer_stream.h"
 
 namespace cobalt {
 namespace media {
@@ -33,7 +33,7 @@
 class AvcAccessUnit : public base::RefCountedThreadSafe<AvcAccessUnit> {
  public:
   typedef base::TimeDelta TimeDelta;
-  typedef DemuxerStream::Type Type;
+  typedef ::media::DemuxerStream::Type Type;
 
   static scoped_refptr<AvcAccessUnit> CreateEndOfStreamAU(Type type,
                                                           TimeDelta timestamp);
@@ -49,7 +49,8 @@
   virtual bool IsValid() const = 0;
   // Read an AU from reader to buffer and also do all the necessary operations
   // like prepending head to make it ready to decode.
-  virtual bool Read(DataSourceReader* reader, DecoderBuffer* buffer) = 0;
+  virtual bool Read(DataSourceReader* reader,
+                    ::media::DecoderBuffer* buffer) = 0;
   virtual Type GetType() const = 0;
   virtual bool IsKeyframe() const = 0;
   virtual bool AddPrepend() const = 0;
@@ -72,4 +73,4 @@
 }  // namespace media
 }  // namespace cobalt
 
-#endif  // COBALT_MEDIA_PROGRESSIVE_ACCESS_UNIT_H_
+#endif  // COBALT_MEDIA_PROGRESSIVE_AVC_ACCESS_UNIT_H_
diff --git a/cobalt/media/progressive/avc_parser.cc b/cobalt/media/progressive/avc_parser.cc
index f781866..f9dcc0b 100644
--- a/cobalt/media/progressive/avc_parser.cc
+++ b/cobalt/media/progressive/avc_parser.cc
@@ -19,14 +19,19 @@
 
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
-#include "cobalt/media/base/decoder_buffer.h"
 #include "cobalt/media/base/endian_util.h"
-#include "cobalt/media/base/media_util.h"
-#include "cobalt/media/base/video_types.h"
-#include "cobalt/media/formats/mp4/aac.h"
 #include "cobalt/media/progressive/avc_access_unit.h"
 #include "cobalt/media/progressive/rbsp_stream.h"
 #include "starboard/memory.h"
+#include "third_party/chromium/media/base/audio_codecs.h"
+#include "third_party/chromium/media/base/decoder_buffer.h"
+#include "third_party/chromium/media/base/encryption_scheme.h"
+#include "third_party/chromium/media/base/media_util.h"
+#include "third_party/chromium/media/base/video_codecs.h"
+#include "third_party/chromium/media/base/video_color_space.h"
+#include "third_party/chromium/media/base/video_transformation.h"
+#include "third_party/chromium/media/base/video_types.h"
+#include "third_party/chromium/media/formats/mp4/aac.h"
 
 namespace cobalt {
 namespace media {
@@ -37,7 +42,7 @@
 static const uint8 kSPSNALType = 7;
 
 AVCParser::AVCParser(scoped_refptr<DataSourceReader> reader,
-                     const scoped_refptr<MediaLog>& media_log)
+                     MediaLog* media_log)
     : ProgressiveParser(reader),
       media_log_(media_log),
       nal_header_size_(0),
@@ -60,7 +65,7 @@
         NOTREACHED() << "empty/undersized buffer to Prepend()";
         return false;
       }
-      buffer->allocations().Write(0, video_prepend_, video_prepend_size_);
+      memcpy(buffer->writable_data(), video_prepend_, video_prepend_size_);
     }
   } else if (au->GetType() == DemuxerStream::AUDIO) {
     if (audio_prepend_.size() < 6) {
@@ -84,7 +89,7 @@
     audio_prepend[4] = (uint8)((buffer_size & 0x000007f8) >> 3);
     // byte 5 gets bits 2-0 of size
     audio_prepend[5] |= (uint8)((buffer_size & 0x00000007) << 5);
-    buffer->allocations().Write(0, audio_prepend.data(), audio_prepend.size());
+    memcpy(buffer->writable_data(), audio_prepend.data(), audio_prepend.size());
   } else {
     NOTREACHED() << "unsupported demuxer stream type.";
     return false;
@@ -285,10 +290,10 @@
   // checks out, write output structure
   int visible_width = width - (crop_left + crop_right);
   int visible_height = height - (crop_top + crop_bottom);
-  record_out->coded_size = math::Size(width, height),
+  record_out->coded_size = gfx::Size(width, height),
   record_out->visible_rect =
-      math::Rect(crop_left, crop_top, visible_width, visible_height),
-  record_out->natural_size = math::Size(visible_width, visible_height);
+      gfx::Rect(crop_left, crop_top, visible_width, visible_height),
+  record_out->natural_size = gfx::Size(visible_width, visible_height);
   record_out->num_ref_frames = num_ref_frames;
   return true;
 }
@@ -397,12 +402,14 @@
     return false;
   }
   // we can now initialize our video decoder config
-  video_config_.Initialize(kCodecH264,
-                           H264PROFILE_MAIN,  // profile is ignored currently
-                           PIXEL_FORMAT_YV12, COLOR_SPACE_HD_REC709,
-                           sps_record.coded_size, sps_record.visible_rect,
-                           sps_record.natural_size, EmptyExtraData(),
-                           Unencrypted());
+  video_config_.Initialize(
+      ::media::VideoCodec::kH264,
+      // profile is ignored currently
+      ::media::VideoCodecProfile::H264PROFILE_MAIN,
+      ::media::VideoDecoderConfig::AlphaMode::kIsOpaque,
+      ::media::VideoColorSpace::REC709(), ::media::VideoTransformation(),
+      sps_record.coded_size, sps_record.visible_rect, sps_record.natural_size,
+      ::media::EmptyExtraData(), ::media::EncryptionScheme::kUnencrypted);
 
   return BuildAnnexBPrepend(buffer + usable_sps_offset, usable_sps_size,
                             buffer + usable_pps_offset, usable_pps_size);
@@ -432,7 +439,7 @@
   if (pps_size > 0) {
     // pps start code comes next
     memcpy(video_prepend_ + prepend_offset, kAnnexBStartCode,
-                 kAnnexBStartCodeSize);
+           kAnnexBStartCodeSize);
     prepend_offset += kAnnexBStartCodeSize;
     // followed by pps
     memcpy(video_prepend_ + prepend_offset, pps, pps_size);
@@ -445,7 +452,7 @@
 }
 
 void AVCParser::ParseAudioSpecificConfig(uint8 b0, uint8 b1) {
-  media::mp4::AAC aac;
+  ::media::mp4::AAC aac;
   std::vector<uint8> aac_config(2);
 
   aac_config[0] = b0;
@@ -466,9 +473,10 @@
 
   const bool kSbrInMimetype = false;
   audio_config_.Initialize(
-      kCodecAAC, kSampleFormatS16, aac.GetChannelLayout(kSbrInMimetype),
+      ::media::AudioCodec::kAAC, ::media::kSampleFormatS16,
+      aac.GetChannelLayout(kSbrInMimetype),
       aac.GetOutputSamplesPerSecond(kSbrInMimetype), aac.codec_specific_data(),
-      Unencrypted(), base::TimeDelta(), 0);
+      ::media::EncryptionScheme::kUnencrypted, base::TimeDelta(), 0);
 }
 
 size_t AVCParser::CalculatePrependSize(DemuxerStream::Type type,
diff --git a/cobalt/media/progressive/avc_parser.h b/cobalt/media/progressive/avc_parser.h
index e383bdf..b203dc7 100644
--- a/cobalt/media/progressive/avc_parser.h
+++ b/cobalt/media/progressive/avc_parser.h
@@ -17,8 +17,10 @@
 
 #include <vector>
 
-#include "cobalt/media/base/media_log.h"
 #include "cobalt/media/progressive/progressive_parser.h"
+#include "third_party/chromium/media/base/media_log.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/rect.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/size.h"
 
 namespace cobalt {
 namespace media {
@@ -33,14 +35,18 @@
 // ProgressiveParser while leaving the rest for its children.
 class AVCParser : public ProgressiveParser {
  public:
+  typedef ::media::DecoderBuffer DecoderBuffer;
+  typedef ::media::DemuxerStream DemuxerStream;
+  typedef ::media::MediaLog MediaLog;
+
   explicit AVCParser(scoped_refptr<DataSourceReader> reader,
-                     const scoped_refptr<MediaLog>& media_log);
+                     MediaLog* media_log);
   virtual ~AVCParser();
 
   struct SPSRecord {
-    math::Size coded_size;
-    math::Rect visible_rect;
-    math::Size natural_size;
+    gfx::Size coded_size;
+    gfx::Rect visible_rect;
+    gfx::Size natural_size;
     uint32 num_ref_frames;
   };
   static bool ParseSPS(const uint8* sps, size_t sps_size,
@@ -62,7 +68,7 @@
   virtual size_t CalculatePrependSize(DemuxerStream::Type type,
                                       bool is_keyframe);
 
-  scoped_refptr<MediaLog> media_log_;
+  MediaLog* media_log_;
   uint8 nal_header_size_;
   // audio frames have a fixed-size small prepend that we attach to every
   // audio buffer created by DownloadBuffer()
diff --git a/cobalt/media/progressive/mp4_parser.cc b/cobalt/media/progressive/mp4_parser.cc
index 957395d..123a0b1 100644
--- a/cobalt/media/progressive/mp4_parser.cc
+++ b/cobalt/media/progressive/mp4_parser.cc
@@ -20,8 +20,8 @@
 
 #include "base/strings/stringprintf.h"
 #include "cobalt/media/base/endian_util.h"
-#include "cobalt/media/formats/mp4/es_descriptor.h"
 #include "starboard/types.h"
+#include "third_party/chromium/media/formats/mp4/es_descriptor.h"
 
 namespace cobalt {
 namespace media {
@@ -67,10 +67,9 @@
 static const int kMapTableAtomCacheEntries_ctts = 51543 / kEntrySize_ctts;
 
 // static
-PipelineStatus MP4Parser::Construct(scoped_refptr<DataSourceReader> reader,
-                                    const uint8* construction_header,
-                                    scoped_refptr<ProgressiveParser>* parser,
-                                    const scoped_refptr<MediaLog>& media_log) {
+::media::PipelineStatus MP4Parser::Construct(
+    scoped_refptr<DataSourceReader> reader, const uint8* construction_header,
+    scoped_refptr<ProgressiveParser>* parser, MediaLog* media_log) {
   DCHECK(parser);
   DCHECK(media_log);
   *parser = NULL;
@@ -79,24 +78,23 @@
   uint32 ftyp = endian_util::load_uint32_big_endian(construction_header + 4);
   if (ftyp != kAtomType_ftyp) {
     // not an mp4
-    return DEMUXER_ERROR_COULD_NOT_PARSE;
+    return ::media::DEMUXER_ERROR_COULD_NOT_PARSE;
   }
 
   // first 4 bytes will be the size of the ftyp atom
   uint32 ftyp_atom_size =
       endian_util::load_uint32_big_endian(construction_header);
   if (ftyp_atom_size < kAtomMinSize) {
-    return DEMUXER_ERROR_COULD_NOT_PARSE;
+    return ::media::DEMUXER_ERROR_COULD_NOT_PARSE;
   }
 
   // construct new mp4 parser
   *parser = new MP4Parser(reader, ftyp_atom_size, media_log);
-  return PIPELINE_OK;
+  return ::media::PIPELINE_OK;
 }
 
 MP4Parser::MP4Parser(scoped_refptr<DataSourceReader> reader,
-                     uint32 ftyp_atom_size,
-                     const scoped_refptr<MediaLog>& media_log)
+                     uint32 ftyp_atom_size, MediaLog* media_log)
     : AVCParser(reader, media_log),
       atom_offset_(ftyp_atom_size),  // start at next atom, skipping over ftyp
       current_trak_is_video_(false),
@@ -485,7 +483,7 @@
     DLOG(WARNING) << "failed to download esds";
     return false;
   }
-  mp4::ESDescriptor es_descriptor;
+  ::media::mp4::ESDescriptor es_descriptor;
   std::vector<uint8> data(esds, esds + esds_size);
   if (es_descriptor.Parse(data)) {
     const std::vector<uint8>& dsi = es_descriptor.decoder_specific_info();
diff --git a/cobalt/media/progressive/mp4_parser.h b/cobalt/media/progressive/mp4_parser.h
index 6d0d617..49d6bd7 100644
--- a/cobalt/media/progressive/mp4_parser.h
+++ b/cobalt/media/progressive/mp4_parser.h
@@ -15,9 +15,9 @@
 #ifndef COBALT_MEDIA_PROGRESSIVE_MP4_PARSER_H_
 #define COBALT_MEDIA_PROGRESSIVE_MP4_PARSER_H_
 
-#include "cobalt/media/base/media_log.h"
 #include "cobalt/media/progressive/avc_parser.h"
 #include "cobalt/media/progressive/mp4_map.h"
+#include "media/base/media_log.h"
 
 namespace cobalt {
 namespace media {
@@ -65,12 +65,11 @@
   // flv, and if it does make sense returns PIPELINE_OK and |*parser| contains a
   // MP4Parser initialized with some basic state.  If it doesn't make sense
   // this returns an error status and |*parser| contains NULL.
-  static PipelineStatus Construct(scoped_refptr<DataSourceReader> reader,
-                                  const uint8* construction_header,
-                                  scoped_refptr<ProgressiveParser>* parser,
-                                  const scoped_refptr<MediaLog>& media_log);
+  static ::media::PipelineStatus Construct(
+      scoped_refptr<DataSourceReader> reader, const uint8* construction_header,
+      scoped_refptr<ProgressiveParser>* parser, MediaLog* media_log);
   MP4Parser(scoped_refptr<DataSourceReader> reader, uint32 ftyp_atom_size,
-            const scoped_refptr<MediaLog>& media_log);
+            MediaLog* media_log);
   ~MP4Parser() override;
 
   // === ProgressiveParser implementation
diff --git a/cobalt/media/progressive/progressive_demuxer.cc b/cobalt/media/progressive/progressive_demuxer.cc
index 27587ca..36769ca 100644
--- a/cobalt/media/progressive/progressive_demuxer.cc
+++ b/cobalt/media/progressive/progressive_demuxer.cc
@@ -16,6 +16,8 @@
 
 #include <inttypes.h>
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/callback_helpers.h"
@@ -24,14 +26,21 @@
 #include "base/task_runner_util.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-#include "cobalt/media/base/bind_to_current_loop.h"
 #include "cobalt/media/base/data_source.h"
 #include "cobalt/media/base/starboard_utils.h"
-#include "cobalt/media/base/timestamp_constants.h"
 #include "starboard/types.h"
+#include "third_party/chromium/media/base/bind_to_current_loop.h"
+#include "third_party/chromium/media/base/timestamp_constants.h"
 
 namespace cobalt {
 namespace media {
+namespace {
+
+using ::media::AudioDecoderConfig;
+using ::media::kNoTimestamp;
+using ::media::VideoDecoderConfig;
+
+}  // namespace
 
 ProgressiveDemuxerStream::ProgressiveDemuxerStream(ProgressiveDemuxer* demuxer,
                                                    Type type)
@@ -41,7 +50,7 @@
   DCHECK(demuxer_);
 }
 
-void ProgressiveDemuxerStream::Read(const ReadCB& read_cb) {
+void ProgressiveDemuxerStream::Read(ReadCB read_cb) {
   TRACE_EVENT0("media_stack", "ProgressiveDemuxerStream::Read()");
   DCHECK(!read_cb.is_null());
 
@@ -51,8 +60,8 @@
   // The demuxer_ may have been destroyed in the pipeline thread.
   if (stopped_) {
     TRACE_EVENT0("media_stack", "ProgressiveDemuxerStream::Read() EOS sent.");
-    read_cb.Run(DemuxerStream::kOk,
-                scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer()));
+    std::move(read_cb).Run(DemuxerStream::kOk,
+                           DecoderBuffer::CreateEOSBuffer());
     return;
   }
 
@@ -70,11 +79,11 @@
       --total_buffer_count_;
       buffer_queue_.pop_front();
     }
-    read_cb.Run(DemuxerStream::kOk, buffer);
+    std::move(read_cb).Run(DemuxerStream::kOk, buffer);
   } else {
     TRACE_EVENT0("media_stack",
                  "ProgressiveDemuxerStream::Read() request queued.");
-    read_queue_.push_back(read_cb);
+    read_queue_.push_back(std::move(read_cb));
   }
 }
 
@@ -86,12 +95,14 @@
   return demuxer_->VideoConfig();
 }
 
-Ranges<base::TimeDelta> ProgressiveDemuxerStream::GetBufferedRanges() {
+::media::Ranges<base::TimeDelta> ProgressiveDemuxerStream::GetBufferedRanges() {
   base::AutoLock auto_lock(lock_);
   return buffered_ranges_;
 }
 
-DemuxerStream::Type ProgressiveDemuxerStream::type() const { return type_; }
+::media::DemuxerStream::Type ProgressiveDemuxerStream::type() const {
+  return type_;
+}
 
 void ProgressiveDemuxerStream::EnableBitstreamConverter() { NOTIMPLEMENTED(); }
 
@@ -126,9 +137,9 @@
   if (read_queue_.size()) {
     // assumption here is that buffer queue is empty
     DCHECK_EQ(buffer_queue_.size(), 0);
-    ReadCB read_cb(read_queue_.front());
+    ReadCB read_cb = std::move(read_queue_.front());
     read_queue_.pop_front();
-    read_cb.Run(DemuxerStream::kOk, buffer);
+    std::move(read_cb).Run(DemuxerStream::kOk, buffer);
   } else {
     // save the buffer for next read request
     buffer_queue_.push_back(buffer);
@@ -177,8 +188,9 @@
   for (ReadQueue::iterator it = read_queue_.begin(); it != read_queue_.end();
        ++it) {
     TRACE_EVENT0("media_stack", "ProgressiveDemuxerStream::Stop() EOS sent.");
-    it->Run(DemuxerStream::kOk,
-            scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer()));
+    std::move(*it).Run(
+        DemuxerStream::kOk,
+        scoped_refptr<DecoderBuffer>(DecoderBuffer::CreateEOSBuffer()));
   }
   read_queue_.clear();
   stopped_ = true;
@@ -189,10 +201,8 @@
 //
 ProgressiveDemuxer::ProgressiveDemuxer(
     const scoped_refptr<base::SingleThreadTaskRunner>& message_loop,
-    DecoderBuffer::Allocator* buffer_allocator, DataSource* data_source,
-    const scoped_refptr<MediaLog>& media_log)
+    DataSource* data_source, MediaLog* const media_log)
     : message_loop_(message_loop),
-      buffer_allocator_(buffer_allocator),
       host_(NULL),
       blocking_thread_("ProgDemuxerBlk"),
       data_source_(data_source),
@@ -202,7 +212,6 @@
       audio_reached_eos_(false),
       video_reached_eos_(false) {
   DCHECK(message_loop_);
-  DCHECK(buffer_allocator_);
   DCHECK(data_source_);
   DCHECK(media_log_);
   reader_ = new DataSourceReader();
@@ -216,10 +225,8 @@
 }
 
 void ProgressiveDemuxer::Initialize(DemuxerHost* host,
-                                    const PipelineStatusCB& status_cb,
-                                    bool enable_text_tracks) {
+                                    PipelineStatusCallback status_cb) {
   TRACE_EVENT0("media_stack", "ProgressiveDemuxer::Initialize()");
-  DCHECK(!enable_text_tracks);
   DCHECK(MessageLoopBelongsToCurrentThread());
   DCHECK(reader_);
   DCHECK(!parser_);
@@ -236,17 +243,16 @@
 
   // start the blocking thread and have it download and parse the media config
   if (!blocking_thread_.Start()) {
-    status_cb.Run(DEMUXER_ERROR_COULD_NOT_PARSE);
+    std::move(status_cb).Run(::media::DEMUXER_ERROR_COULD_NOT_PARSE);
     return;
   }
 
   blocking_thread_.task_runner()->PostTask(
-      FROM_HERE, base::Bind(&ProgressiveDemuxer::ParseConfigBlocking,
-                            base::Unretained(this), status_cb));
+      FROM_HERE, base::BindOnce(&ProgressiveDemuxer::ParseConfigBlocking,
+                                base::Unretained(this), std::move(status_cb)));
 }
 
-void ProgressiveDemuxer::ParseConfigBlocking(
-    const PipelineStatusCB& status_cb) {
+void ProgressiveDemuxer::ParseConfigBlocking(PipelineStatusCallback status_cb) {
   DCHECK(blocking_thread_.task_runner()->BelongsToCurrentThread());
   DCHECK(!parser_);
 
@@ -256,30 +262,32 @@
   // if we can't construct a parser for this stream it's a fatal error, return
   // false so ParseConfigDone will notify the caller to Initialize() via
   // status_cb.
-  if (!parser_ || status != PIPELINE_OK) {
+  if (!parser_ || status != ::media::PIPELINE_OK) {
     DCHECK(!parser_);
-    DCHECK_NE(status, PIPELINE_OK);
-    if (status == PIPELINE_OK) {
-      status = DEMUXER_ERROR_COULD_NOT_PARSE;
+    DCHECK_NE(status, ::media::PIPELINE_OK);
+    if (status == ::media::PIPELINE_OK) {
+      status = ::media::DEMUXER_ERROR_COULD_NOT_PARSE;
     }
-    ParseConfigDone(status_cb, status);
+    ParseConfigDone(std::move(status_cb), status);
     return;
   }
 
   // instruct the parser to extract audio and video config from the file
   if (!parser_->ParseConfig()) {
-    ParseConfigDone(status_cb, DEMUXER_ERROR_COULD_NOT_PARSE);
+    ParseConfigDone(std::move(status_cb),
+                    ::media::DEMUXER_ERROR_COULD_NOT_PARSE);
     return;
   }
 
   // make sure we got a valid and complete configuration
   if (!parser_->IsConfigComplete()) {
-    ParseConfigDone(status_cb, DEMUXER_ERROR_COULD_NOT_PARSE);
+    ParseConfigDone(std::move(status_cb),
+                    ::media::DEMUXER_ERROR_COULD_NOT_PARSE);
     return;
   }
 
   // IsConfigComplete() should guarantee we know the duration
-  DCHECK(parser_->Duration() != kInfiniteDuration);
+  DCHECK(parser_->Duration() != ::media::kInfiniteDuration);
   host_->SetDuration(parser_->Duration());
   // Bitrate may not be known, however
   uint32 bitrate = parser_->BitsPerSecond();
@@ -288,11 +296,11 @@
   }
 
   // successful parse of config data, inform the nonblocking demuxer thread
-  DCHECK_EQ(status, PIPELINE_OK);
-  ParseConfigDone(status_cb, PIPELINE_OK);
+  DCHECK_EQ(status, ::media::PIPELINE_OK);
+  ParseConfigDone(std::move(status_cb), ::media::PIPELINE_OK);
 }
 
-void ProgressiveDemuxer::ParseConfigDone(const PipelineStatusCB& status_cb,
+void ProgressiveDemuxer::ParseConfigDone(PipelineStatusCallback status_cb,
                                          PipelineStatus status) {
   DCHECK(blocking_thread_.task_runner()->BelongsToCurrentThread());
 
@@ -301,15 +309,15 @@
   }
 
   // if the blocking parser thread cannot parse config we're done.
-  if (status != PIPELINE_OK) {
-    status_cb.Run(status);
+  if (status != ::media::PIPELINE_OK) {
+    std::move(status_cb).Run(status);
     return;
   }
   DCHECK(parser_);
   // start downloading data
   Request(DemuxerStream::AUDIO);
 
-  status_cb.Run(PIPELINE_OK);
+  std::move(status_cb).Run(::media::PIPELINE_OK);
 }
 
 void ProgressiveDemuxer::Request(DemuxerStream::Type type) {
@@ -328,7 +336,7 @@
   if (!au || !au->IsValid()) {
     if (!HasStopCalled()) {
       DLOG(ERROR) << "got back bad AU from parser";
-      host_->OnDemuxerError(DEMUXER_ERROR_COULD_NOT_PARSE);
+      host_->OnDemuxerError(::media::DEMUXER_ERROR_COULD_NOT_PARSE);
     }
     return;
   }
@@ -375,11 +383,12 @@
                                video_demuxer_stream_->GetTotalBufferSize();
     size_t total_buffer_count = audio_demuxer_stream_->GetTotalBufferCount() +
                                 video_demuxer_stream_->GetTotalBufferCount();
+    // Only sdr video is supported in progressive mode.
+    const int kBitDepth = 8;
     int progressive_budget = SbMediaGetProgressiveBufferBudget(
         MediaVideoCodecToSbMediaVideoCodec(VideoConfig().codec()),
         VideoConfig().visible_rect().size().width(),
-        VideoConfig().visible_rect().size().height(),
-        VideoConfig().webm_color_metadata().BitsPerChannel);
+        VideoConfig().visible_rect().size().height(), kBitDepth);
     int progressive_duration_cap_in_seconds =
         SbMediaGetBufferGarbageCollectionDurationThreshold() / kSbTimeSecond;
     const int kEstimatedBufferCountPerSeconds = 70;
@@ -396,25 +405,12 @@
           kDelay);
       return;
     }
-    // Note that "new DecoderBuffer" may return NULL if it is unable to allocate
-    // any DecoderBuffer.
+
     scoped_refptr<DecoderBuffer> decoder_buffer(
-        DecoderBuffer::Create(buffer_allocator_, requested_au_->GetType(),
-                              requested_au_->GetMaxSize()));
-    if (decoder_buffer) {
-      decoder_buffer->set_is_key_frame(requested_au_->IsKeyframe());
-      buffer_allocator_->UpdateVideoConfig(VideoConfig());
-      Download(decoder_buffer);
-    } else {
-      // As the buffer is full of media data, it is safe to delay 100
-      // milliseconds.
-      const base::TimeDelta kDelay = base::TimeDelta::FromMilliseconds(100);
-      blocking_thread_.message_loop()->task_runner()->PostDelayedTask(
-          FROM_HERE,
-          base::Bind(&ProgressiveDemuxer::AllocateBuffer,
-                     base::Unretained(this)),
-          kDelay);
-    }
+        new DecoderBuffer(requested_au_->GetMaxSize()));
+    DCHECK(decoder_buffer);
+    decoder_buffer->set_is_key_frame(requested_au_->IsKeyframe());
+    Download(decoder_buffer);
   }
 }
 
@@ -447,7 +443,7 @@
 
   if (!requested_au_->Read(reader_.get(), buffer.get())) {
     DLOG(ERROR) << "au read failed";
-    host_->OnDemuxerError(PIPELINE_ERROR_READ);
+    host_->OnDemuxerError(::media::PIPELINE_ERROR_READ);
     return;
   }
 
@@ -468,7 +464,7 @@
   requested_au_ = NULL;
 
   // Calculate total range of buffered data for both audio and video.
-  Ranges<base::TimeDelta> buffered(
+  ::media::Ranges<base::TimeDelta> buffered(
       audio_demuxer_stream_->GetBufferedRanges().IntersectionWith(
           video_demuxer_stream_->GetBufferedRanges()));
   // Notify host of each disjoint range.
@@ -562,17 +558,16 @@
   return stopped_;
 }
 
-void ProgressiveDemuxer::Seek(base::TimeDelta time,
-                              const PipelineStatusCB& cb) {
+void ProgressiveDemuxer::Seek(base::TimeDelta time, PipelineStatusCallback cb) {
   blocking_thread_.message_loop()->task_runner()->PostTask(
       FROM_HERE,
-      base::Bind(&ProgressiveDemuxer::SeekTask, base::Unretained(this), time,
-                 BindToCurrentLoop(cb)));
+      base::BindOnce(&ProgressiveDemuxer::SeekTask, base::Unretained(this),
+                     time, ::media::BindToCurrentLoop(std::move(cb))));
 }
 
 // runs on blocking thread
 void ProgressiveDemuxer::SeekTask(base::TimeDelta time,
-                                  const PipelineStatusCB& cb) {
+                                  PipelineStatusCallback cb) {
   TRACE_EVENT1("media_stack", "ProgressiveDemuxer::SeekTask()", "timestamp",
                time.InMicroseconds());
   DLOG(INFO) << base::StringPrintf("seek to: %" PRId64 " ms",
@@ -583,7 +578,7 @@
   // advance parser to new timestamp
   if (!parser_->SeekTo(time)) {
     DLOG(ERROR) << "parser seek failed.";
-    cb.Run(PIPELINE_ERROR_READ);
+    std::move(cb).Run(::media::PIPELINE_ERROR_READ);
     return;
   }
   // if both streams had finished downloading, we need to restart the request
@@ -591,22 +586,16 @@
   audio_reached_eos_ = false;
   video_reached_eos_ = false;
   flushing_ = true;
-  cb.Run(PIPELINE_OK);
+  std::move(cb).Run(::media::PIPELINE_OK);
   if (issue_new_request) {
     DLOG(INFO) << "restarting stopped request loop";
     Request(DemuxerStream::AUDIO);
   }
 }
 
-DemuxerStream* ProgressiveDemuxer::GetStream(media::DemuxerStream::Type type) {
-  if (type == DemuxerStream::AUDIO) {
-    return audio_demuxer_stream_.get();
-  } else if (type == DemuxerStream::VIDEO) {
-    return video_demuxer_stream_.get();
-  } else {
-    DLOG(WARNING) << "unsupported stream type requested";
-  }
-  return NULL;
+std::vector<::media::DemuxerStream*> ProgressiveDemuxer::GetAllStreams() {
+  return std::vector<DemuxerStream*>(
+      {audio_demuxer_stream_.get(), video_demuxer_stream_.get()});
 }
 
 base::TimeDelta ProgressiveDemuxer::GetStartTime() const {
diff --git a/cobalt/media/progressive/progressive_demuxer.h b/cobalt/media/progressive/progressive_demuxer.h
index 6ecb323..f4ef49a 100644
--- a/cobalt/media/progressive/progressive_demuxer.h
+++ b/cobalt/media/progressive/progressive_demuxer.h
@@ -23,41 +23,40 @@
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/threading/thread.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/demuxer.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_log.h"
-#include "cobalt/media/base/ranges.h"
 #include "cobalt/media/progressive/progressive_parser.h"
+#include "third_party/chromium/media/base/decoder_buffer.h"
+#include "third_party/chromium/media/base/demuxer.h"
+#include "third_party/chromium/media/base/demuxer_stream.h"
+#include "third_party/chromium/media/base/media_log.h"
+#include "third_party/chromium/media/base/ranges.h"
+
+namespace media {
+class DecoderBuffer;
+}  // namespace media
 
 namespace cobalt {
 namespace media {
 
-class DecoderBuffer;
 class ProgressiveDemuxer;
 
-class ProgressiveDemuxerStream : public DemuxerStream {
+class ProgressiveDemuxerStream : public ::media::DemuxerStream {
  public:
+  typedef ::media::AudioDecoderConfig AudioDecoderConfig;
+  typedef ::media::DecoderBuffer DecoderBuffer;
+  typedef ::media::VideoDecoderConfig VideoDecoderConfig;
+
   ProgressiveDemuxerStream(ProgressiveDemuxer* demuxer, Type type);
 
   // DemuxerStream implementation
-  void Read(const ReadCB& read_cb) override;
+  void Read(ReadCB read_cb) override;
   AudioDecoderConfig audio_decoder_config() override;
   VideoDecoderConfig video_decoder_config() override;
   Type type() const override;
   void EnableBitstreamConverter() override;
   bool SupportsConfigChanges() override { return false; }
-  VideoRotation video_rotation() override { return VIDEO_ROTATION_0; }
-  bool enabled() const override { return true; }
-  void set_enabled(bool enabled, base::TimeDelta timestamp) override {
-    DCHECK(enabled);
-  }
-  void SetStreamStatusChangeCB(const StreamStatusChangeCB& cb) override {
-    NOTREACHED();
-  }
 
   // Functions used by ProgressiveDemuxer
-  Ranges<base::TimeDelta> GetBufferedRanges();
+  ::media::Ranges<base::TimeDelta> GetBufferedRanges();
   void EnqueueBuffer(scoped_refptr<DecoderBuffer> buffer);
   void FlushBuffers();
   void Stop();
@@ -80,15 +79,15 @@
   // Keeps track of all time ranges this object has seen since creation.
   // The demuxer uses these ranges to update the pipeline about what data
   // it has demuxed.
-  Ranges<base::TimeDelta> buffered_ranges_;
+  ::media::Ranges<base::TimeDelta> buffered_ranges_;
   // The last timestamp of buffer enqueued. This is used in two places:
   //   1. Used with the timestamp of the current frame to calculate the
   //      buffer range.
   //   2. Used by the demuxer to deteminate what type of frame to get next.
-  base::TimeDelta last_buffer_timestamp_ = kNoTimestamp;
+  base::TimeDelta last_buffer_timestamp_ = ::media::kNoTimestamp;
   bool stopped_ = false;
 
-  typedef std::deque<scoped_refptr<DecoderBuffer> > BufferQueue;
+  typedef std::deque<scoped_refptr<DecoderBuffer>> BufferQueue;
   BufferQueue buffer_queue_;
 
   typedef std::deque<ReadCB> ReadQueue;
@@ -100,36 +99,50 @@
   DISALLOW_COPY_AND_ASSIGN(ProgressiveDemuxerStream);
 };
 
-class MEDIA_EXPORT ProgressiveDemuxer : public Demuxer {
+class MEDIA_EXPORT ProgressiveDemuxer : public ::media::Demuxer {
  public:
+  typedef ::media::AudioDecoderConfig AudioDecoderConfig;
+  typedef ::media::DecoderBuffer DecoderBuffer;
+  typedef ::media::DemuxerHost DemuxerHost;
+  typedef ::media::DemuxerStream DemuxerStream;
+  typedef ::media::MediaLog MediaLog;
+  typedef ::media::PipelineStatus PipelineStatus;
+  typedef ::media::PipelineStatusCallback PipelineStatusCallback;
+  typedef ::media::VideoDecoderConfig VideoDecoderConfig;
+
   ProgressiveDemuxer(
       const scoped_refptr<base::SingleThreadTaskRunner>& message_loop,
-      DecoderBuffer::Allocator* buffer_allocator, DataSource* data_source,
-      const scoped_refptr<MediaLog>& media_log);
+      DataSource* data_source, MediaLog* const media_log);
   ~ProgressiveDemuxer() override;
 
   // Demuxer implementation.
   std::string GetDisplayName() const override { return "ProgressiveDemuxer"; }
-  void Initialize(DemuxerHost* host, const PipelineStatusCB& status_cb,
-                  bool enable_text_tracks) override;
+  void Initialize(DemuxerHost* host, PipelineStatusCallback status_cb) override;
   void AbortPendingReads() override {}
   void StartWaitingForSeek(base::TimeDelta seek_time) override {}
   void CancelPendingSeek(base::TimeDelta seek_time) override {}
   void Stop() override;
-  void Seek(base::TimeDelta time, const PipelineStatusCB& cb) override;
-  DemuxerStream* GetStream(DemuxerStream::Type type) override;
+  void Seek(base::TimeDelta time, PipelineStatusCallback cb) override;
+  std::vector<DemuxerStream*> GetAllStreams() override;
   base::TimeDelta GetStartTime() const override;
   base::Time GetTimelineOffset() const override { return base::Time(); }
   int64_t GetMemoryUsage() const override {
     NOTREACHED();
     return 0;
   }
-  void OnEnabledAudioTracksChanged(const std::vector<MediaTrack::Id>& track_ids,
-                                   base::TimeDelta currTime) override {
+  absl::optional<::media::container_names::MediaContainerName>
+  GetContainerForMetrics() const override {
+    NOTREACHED();
+    return absl::nullopt;
+  }
+  void OnEnabledAudioTracksChanged(
+      const std::vector<::media::MediaTrack::Id>& track_ids,
+      base::TimeDelta currTime, TrackChangeCB change_completed_cb) override {
     NOTREACHED();
   }
-  void OnSelectedVideoTrackChanged(const std::vector<MediaTrack::Id>& track_ids,
-                                   base::TimeDelta currTime) override {
+  void OnSelectedVideoTrackChanged(
+      const std::vector<::media::MediaTrack::Id>& track_ids,
+      base::TimeDelta currTime, TrackChangeCB change_completed_cb) override {
     NOTREACHED();
   }
 
@@ -149,27 +162,25 @@
   bool MessageLoopBelongsToCurrentThread() const;
 
  private:
-  void ParseConfigDone(const PipelineStatusCB& status_cb,
-                       PipelineStatus status);
+  void ParseConfigDone(PipelineStatusCallback status_cb, PipelineStatus status);
   void DataSourceStopped(const base::Closure& callback);
   bool HasStopCalled();
 
   // methods that perform blocking I/O, and are therefore run on the
   // blocking_thread_ download enough of the stream to parse the configuration.
-  void ParseConfigBlocking(const PipelineStatusCB& status_cb);
+  void ParseConfigBlocking(PipelineStatusCallback status_cb);
   void AllocateBuffer();
   void Download(scoped_refptr<DecoderBuffer> buffer);
   void IssueNextRequest();
-  void SeekTask(base::TimeDelta time, const PipelineStatusCB& cb);
+  void SeekTask(base::TimeDelta time, PipelineStatusCallback cb);
 
   scoped_refptr<base::SingleThreadTaskRunner> message_loop_;
-  DecoderBuffer::Allocator* buffer_allocator_;
   DemuxerHost* host_;
 
   // Thread on which all blocking operations are executed.
   base::Thread blocking_thread_;
   DataSource* data_source_;
-  scoped_refptr<MediaLog> media_log_;
+  MediaLog* media_log_;
   scoped_refptr<DataSourceReader> reader_;
 
   base::Lock lock_for_stopped_;
diff --git a/cobalt/media/progressive/progressive_parser.cc b/cobalt/media/progressive/progressive_parser.cc
index f9ffb84..fe810b1 100644
--- a/cobalt/media/progressive/progressive_parser.cc
+++ b/cobalt/media/progressive/progressive_parser.cc
@@ -15,8 +15,8 @@
 #include "cobalt/media/progressive/progressive_parser.h"
 
 #include "base/logging.h"
-#include "cobalt/media/base/timestamp_constants.h"
 #include "cobalt/media/progressive/mp4_parser.h"
+#include "third_party/chromium/media/base/timestamp_constants.h"
 
 namespace cobalt {
 namespace media {
@@ -28,10 +28,9 @@
 const int ProgressiveParser::kInitialHeaderSize = 9;
 
 // static
-PipelineStatus ProgressiveParser::Construct(
+::media::PipelineStatus ProgressiveParser::Construct(
     scoped_refptr<DataSourceReader> reader,
-    scoped_refptr<ProgressiveParser>* parser,
-    const scoped_refptr<MediaLog>& media_log) {
+    scoped_refptr<ProgressiveParser>* parser, MediaLog* media_log) {
   DCHECK(parser);
   DCHECK(media_log);
   *parser = NULL;
@@ -41,7 +40,7 @@
   uint8 header[kInitialHeaderSize];
   int bytes_read = reader->BlockingRead(0, kInitialHeaderSize, header);
   if (bytes_read != kInitialHeaderSize) {
-    return DEMUXER_ERROR_COULD_NOT_PARSE;
+    return ::media::DEMUXER_ERROR_COULD_NOT_PARSE;
   }
 
   // attempt to construct mp4 parser from this header
@@ -49,13 +48,15 @@
 }
 
 ProgressiveParser::ProgressiveParser(scoped_refptr<DataSourceReader> reader)
-    : reader_(reader), duration_(kInfiniteDuration), bits_per_second_(0) {}
+    : reader_(reader),
+      duration_(::media::kInfiniteDuration),
+      bits_per_second_(0) {}
 
 ProgressiveParser::~ProgressiveParser() {}
 
 bool ProgressiveParser::IsConfigComplete() {
   return video_config_.IsValidConfig() && audio_config_.IsValidConfig() &&
-         duration_ != kInfiniteDuration;
+         duration_ != ::media::kInfiniteDuration;
 }
 
 }  // namespace media
diff --git a/cobalt/media/progressive/progressive_parser.h b/cobalt/media/progressive/progressive_parser.h
index 0e903f5..f3d3e82 100644
--- a/cobalt/media/progressive/progressive_parser.h
+++ b/cobalt/media/progressive/progressive_parser.h
@@ -12,16 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef COBALT_MEDIA_PROGRESSIVE_PARSER_H_
-#define COBALT_MEDIA_PROGRESSIVE_PARSER_H_
+#ifndef COBALT_MEDIA_PROGRESSIVE_PROGRESSIVE_PARSER_H_
+#define COBALT_MEDIA_PROGRESSIVE_PROGRESSIVE_PARSER_H_
+
 #include "base/memory/ref_counted.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_log.h"
 #include "cobalt/media/base/pipeline.h"
-#include "cobalt/media/base/video_decoder_config.h"
 #include "cobalt/media/progressive/avc_access_unit.h"
 #include "cobalt/media/progressive/data_source_reader.h"
+#include "third_party/chromium/media/base/audio_decoder_config.h"
+#include "third_party/chromium/media/base/demuxer_stream.h"
+#include "third_party/chromium/media/base/media_log.h"
+#include "third_party/chromium/media/base/video_decoder_config.h"
 
 namespace cobalt {
 namespace media {
@@ -30,12 +31,19 @@
 // ProgressiveDemuxer.
 class ProgressiveParser : public base::RefCountedThreadSafe<ProgressiveParser> {
  public:
+  typedef ::media::AudioDecoderConfig AudioDecoderConfig;
+  typedef ::media::DecoderBuffer DecoderBuffer;
+  typedef ::media::DemuxerStream DemuxerStream;
+  typedef ::media::MediaLog MediaLog;
+  typedef ::media::PipelineStatus PipelineStatus;
+  typedef ::media::VideoDecoderConfig VideoDecoderConfig;
+
   static const int kInitialHeaderSize;
   // Determine stream type, construct appropriate parser object, and returns
   // PIPELINE_OK on success or error code.
   static PipelineStatus Construct(scoped_refptr<DataSourceReader> reader,
                                   scoped_refptr<ProgressiveParser>* parser,
-                                  const scoped_refptr<MediaLog>& media_log);
+                                  MediaLog* media_log);
   explicit ProgressiveParser(scoped_refptr<DataSourceReader> reader);
 
   // Seek through the file looking for audio and video configuration info,
@@ -80,4 +88,4 @@
 }  // namespace media
 }  // namespace cobalt
 
-#endif  // COBALT_MEDIA_PROGRESSIVE_PARSER_H_
+#endif  // COBALT_MEDIA_PROGRESSIVE_PROGRESSIVE_PARSER_H_
diff --git a/cobalt/media/sandbox/BUILD.gn b/cobalt/media/sandbox/BUILD.gn
index 8ff9b34..00f87a2 100644
--- a/cobalt/media/sandbox/BUILD.gn
+++ b/cobalt/media/sandbox/BUILD.gn
@@ -23,9 +23,8 @@
     "//cobalt/math",
     "//cobalt/media",
     "//starboard",
+    "//third_party/chromium/media",
   ]
-
-  content_deps = [ "//third_party/icu:icudata" ]
 }
 
 target(final_executable_type, "web_media_player_sandbox") {
@@ -55,6 +54,7 @@
     "//cobalt/system_window",
     "//cobalt/trace_event",
     "//starboard",
+    "//third_party/chromium/media",
     "//url",
   ]
 
diff --git a/cobalt/media/sandbox/demuxer_helper.cc b/cobalt/media/sandbox/demuxer_helper.cc
deleted file mode 100644
index 6828de6..0000000
--- a/cobalt/media/sandbox/demuxer_helper.cc
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/media/sandbox/demuxer_helper.h"
-
-#include <queue>
-
-#include "base/bind_helpers.h"
-#include "base/callback_helpers.h"
-#include "base/logging.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/bind_to_loop.h"
-#include "cobalt/media/base/decoder_buffer.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/fetcher_buffered_data_source.h"
-#include "cobalt/media/progressive/progressive_demuxer.h"
-
-namespace cobalt {
-namespace media {
-namespace sandbox {
-
-namespace {
-
-using ::media::AudioDecoderConfig;
-using ::media::BindToCurrentLoop;
-using ::media::DecoderBuffer;
-using ::media::DemuxerStream;
-using ::media::VideoDecoderConfig;
-
-// A DemuxerStream that caches media data in memory.  Note that it is only for
-// test purpose and no synchronization is provided.
-class DemuxerStreamCache : public ::media::DemuxerStream {
- public:
-  explicit DemuxerStreamCache(const AudioDecoderConfig& audio_decoder_config)
-      : type_(AUDIO) {
-    audio_decoder_config_.CopyFrom(audio_decoder_config);
-  }
-  explicit DemuxerStreamCache(const VideoDecoderConfig& video_decoder_config)
-      : type_(VIDEO) {
-    video_decoder_config_.CopyFrom(video_decoder_config);
-  }
-
-  void Append(const scoped_refptr<DecoderBuffer>& buffer) {
-    DCHECK(buffer);
-    DCHECK(!buffer->IsEndOfStream());
-    buffers_.push(buffer);
-  }
-
- private:
-  // DemuxerStream methods.
-  void Read(const ReadCB& read_cb) override {
-    scoped_refptr<DecoderBuffer> buffer;
-    if (buffers_.empty()) {
-      buffer = DecoderBuffer::CreateEOSBuffer(base::TimeDelta());
-    } else {
-      buffer = buffers_.front();
-      buffers_.pop();
-    }
-    read_cb.Run(kOk, buffer);
-  }
-  const AudioDecoderConfig& audio_decoder_config() override {
-    DCHECK_EQ(type_, AUDIO);
-    return audio_decoder_config_;
-  }
-  const VideoDecoderConfig& video_decoder_config() override {
-    DCHECK_EQ(type_, VIDEO);
-    return video_decoder_config_;
-  }
-  Type type() override { return type_; }
-  void EnableBitstreamConverter() override {}
-  bool StreamWasEncrypted() const override { return false; }
-
-  Type type_;
-  AudioDecoderConfig audio_decoder_config_;
-  VideoDecoderConfig video_decoder_config_;
-  std::queue<scoped_refptr<DecoderBuffer> > buffers_;
-};
-
-// A Demuxer that caches media data in memory.  Note that it is only for test
-// purpose and no synchronization is provided.
-class DemuxerCache : public ::media::Demuxer {
- public:
-  DemuxerCache(const scoped_refptr<Demuxer>& demuxer, uint64 bytes_to_cache,
-               const DemuxerHelper::DemuxerReadyCB& demuxer_ready_cb) {
-    if (demuxer->GetStream(DemuxerStream::AUDIO)) {
-      audio_stream_ = new DemuxerStreamCache(
-          demuxer->GetStream(DemuxerStream::AUDIO)->audio_decoder_config());
-    }
-    if (demuxer->GetStream(DemuxerStream::VIDEO)) {
-      video_stream_ = new DemuxerStreamCache(
-          demuxer->GetStream(DemuxerStream::VIDEO)->video_decoder_config());
-    }
-    DCHECK(audio_stream_ || video_stream_);
-    CacheState cache_state;
-    cache_state.demuxer = demuxer;
-    cache_state.bytes_to_cache = bytes_to_cache;
-    cache_state.audio_eos = !audio_stream_;
-    cache_state.video_eos = !video_stream_;
-    cache_state.demuxer_ready_cb = demuxer_ready_cb;
-
-    if (audio_stream_) {
-      cache_state.last_read_type = DemuxerStream::AUDIO;
-    } else {
-      cache_state.last_read_type = DemuxerStream::VIDEO;
-    }
-    demuxer->GetStream(cache_state.last_read_type)
-        ->Read(BindToCurrentLoop(
-            base::Bind(&DemuxerCache::CacheBuffer, this, cache_state)));
-  }
-
- private:
-  struct CacheState {
-    scoped_refptr<Demuxer> demuxer;
-    uint64 bytes_to_cache;
-    base::TimeDelta last_audio_buffer_timestamp;
-    bool audio_eos;
-    base::TimeDelta last_video_buffer_timestamp;
-    bool video_eos;
-    DemuxerHelper::DemuxerReadyCB demuxer_ready_cb;
-    DemuxerStream::Type last_read_type;
-  };
-
-  void CacheBuffer(CacheState cache_state, DemuxerStream::Status status,
-                   const scoped_refptr<DecoderBuffer>& buffer) {
-    DCHECK_EQ(status, DemuxerStream::kOk);
-    DCHECK(buffer);
-
-    if (cache_state.last_read_type == DemuxerStream::AUDIO) {
-      if (buffer->IsEndOfStream()) {
-        cache_state.audio_eos = true;
-      } else {
-        cache_state.last_audio_buffer_timestamp = buffer->GetTimestamp();
-        if (cache_state.bytes_to_cache >= buffer->GetDataSize()) {
-          cache_state.bytes_to_cache -= buffer->GetDataSize();
-          audio_stream_->Append(buffer);
-        } else {
-          cache_state.bytes_to_cache = 0;
-        }
-      }
-    } else {
-      DCHECK_EQ(cache_state.last_read_type, DemuxerStream::VIDEO);
-      if (buffer->IsEndOfStream()) {
-        cache_state.video_eos = true;
-      } else {
-        cache_state.last_video_buffer_timestamp = buffer->GetTimestamp();
-        if (cache_state.bytes_to_cache >= buffer->GetDataSize()) {
-          cache_state.bytes_to_cache -= buffer->GetDataSize();
-          video_stream_->Append(buffer);
-        } else {
-          cache_state.bytes_to_cache = 0;
-        }
-      }
-    }
-    if ((cache_state.audio_eos && cache_state.video_eos) ||
-        cache_state.bytes_to_cache == 0) {
-      cache_state.demuxer->Stop(base::Bind(cache_state.demuxer_ready_cb,
-                                           scoped_refptr<Demuxer>(this)));
-      return;
-    }
-    cache_state.last_read_type = DemuxerStream::AUDIO;
-    if (cache_state.audio_eos) {
-      cache_state.last_read_type = DemuxerStream::VIDEO;
-    } else if (!cache_state.video_eos) {
-      if (cache_state.last_video_buffer_timestamp <
-          cache_state.last_audio_buffer_timestamp) {
-        cache_state.last_read_type = DemuxerStream::VIDEO;
-      }
-    }
-
-    cache_state.demuxer->GetStream(cache_state.last_read_type)
-        ->Read(BindToCurrentLoop(
-            base::Bind(&DemuxerCache::CacheBuffer, this, cache_state)));
-  }
-
-  // Demuxer methods.
-  void Initialize(::media::DemuxerHost* host,
-                  const ::media::PipelineStatusCB& status_cb) override {
-    NOTREACHED();
-  }
-  void Stop(const base::Closure& callback) override {
-    DCHECK(!callback.is_null());
-    callback.Run();
-  }
-  scoped_refptr<DemuxerStream> GetStream(DemuxerStream::Type type) override {
-    if (type == DemuxerStream::AUDIO) {
-      return audio_stream_;
-    } else if (type == DemuxerStream::VIDEO) {
-      return video_stream_;
-    }
-    NOTREACHED();
-    return NULL;
-  }
-  base::TimeDelta GetStartTime() const override { return base::TimeDelta(); }
-
-  scoped_refptr<DemuxerStreamCache> audio_stream_;
-  scoped_refptr<DemuxerStreamCache> video_stream_;
-};
-
-}  // namespace
-
-class DemuxerHelper::DemuxerHostStub : public ::media::DemuxerHost {
- private:
-  // DataSourceHost methods
-  void SetTotalBytes(int64 total_bytes) override {}
-  void AddBufferedByteRange(int64 start, int64 end) override {}
-  void AddBufferedTimeRange(base::TimeDelta start,
-                            base::TimeDelta end) override {}
-
-  // DemuxerHost methods
-  void SetDuration(base::TimeDelta duration) override {}
-  void OnDemuxerError(::media::PipelineStatus error) override {}
-};
-
-DemuxerHelper::DemuxerHelper(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_message_loop,
-    loader::FetcherFactory* fetcher_factory, const GURL& video_url,
-    const DemuxerReadyCB& demuxer_ready_cb)
-    : host_(new DemuxerHostStub) {
-  CreateDemuxer(media_message_loop, fetcher_factory, video_url,
-                demuxer_ready_cb, 0);
-}
-
-DemuxerHelper::DemuxerHelper(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_message_loop,
-    loader::FetcherFactory* fetcher_factory, const GURL& video_url,
-    const DemuxerReadyCB& demuxer_ready_cb, uint64 bytes_to_cache)
-    : host_(new DemuxerHostStub) {
-  DCHECK_GE(bytes_to_cache, 0);
-
-  CreateDemuxer(media_message_loop, fetcher_factory, video_url,
-                demuxer_ready_cb, bytes_to_cache);
-}
-
-DemuxerHelper::~DemuxerHelper() { delete host_; }
-
-void DemuxerHelper::CreateDemuxer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_message_loop,
-    loader::FetcherFactory* fetcher_factory, const GURL& video_url,
-    const DemuxerReadyCB& demuxer_ready_cb, uint64 bytes_to_cache) {
-  DCHECK(media_message_loop);
-  DCHECK(fetcher_factory);
-  DCHECK(!demuxer_ready_cb.is_null());
-
-  scoped_refptr<FetcherBufferedDataSource> data_source(
-      new FetcherBufferedDataSource(media_message_loop, video_url,
-                                    csp::SecurityCallback(),
-                                    fetcher_factory->network_module(),
-                                    loader::kNoCORSMode, loader::Origin()));
-  scoped_refptr<Demuxer> demuxer =
-      new ::media::ProgressiveDemuxer(media_message_loop, data_source);
-  demuxer->Initialize(
-      host_, base::Bind(&DemuxerHelper::OnDemuxerReady, base::Unretained(this),
-                        demuxer, demuxer_ready_cb, bytes_to_cache));
-}
-
-void DemuxerHelper::OnDemuxerReady(const scoped_refptr<Demuxer>& demuxer,
-                                   const DemuxerReadyCB& demuxer_ready_cb,
-                                   uint64 bytes_to_cache,
-                                   ::media::PipelineStatus status) {
-  DCHECK_EQ(status, ::media::PIPELINE_OK);
-
-  if (bytes_to_cache == 0) {
-    demuxer_ready_cb.Run(demuxer);
-    return;
-  }
-
-  // The newly created object is reference counted and will be passed back
-  // through demuxer_ready_cb.
-  new DemuxerCache(demuxer, bytes_to_cache, demuxer_ready_cb);
-}
-
-}  // namespace sandbox
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/sandbox/demuxer_helper.h b/cobalt/media/sandbox/demuxer_helper.h
deleted file mode 100644
index 83051d8..0000000
--- a/cobalt/media/sandbox/demuxer_helper.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_MEDIA_SANDBOX_DEMUXER_HELPER_H_
-#define COBALT_MEDIA_SANDBOX_DEMUXER_HELPER_H_
-
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "cobalt/loader/fetcher_factory.h"
-#include "cobalt/media/base/demuxer.h"
-#include "url/gurl.h"
-
-namespace cobalt {
-namespace media {
-namespace sandbox {
-
-// This class create and initialize a Demuxer and then call the callback
-// provided.  It can also cache media data in memory to avoid any I/O during
-// playback.
-class DemuxerHelper {
- public:
-  typedef ::media::Demuxer Demuxer;
-  typedef base::Callback<void(const scoped_refptr<Demuxer>&)> DemuxerReadyCB;
-
-  DemuxerHelper(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_message_loop,
-      loader::FetcherFactory* fetcher_factory, const GURL& video_url,
-      const DemuxerReadyCB& demuxer_ready_cb);
-  // This ctor will create an Demuxer internally that caches the media data in
-  // memory before calling the callback.  This ensures that there is no I/O
-  // incurred during playback.
-  DemuxerHelper(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_message_loop,
-      loader::FetcherFactory* fetcher_factory, const GURL& video_url,
-      const DemuxerReadyCB& demuxer_ready_cb, uint64 bytes_to_cache);
-  ~DemuxerHelper();
-
- private:
-  void CreateDemuxer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_message_loop,
-      loader::FetcherFactory* fetcher_factory, const GURL& video_url,
-      const DemuxerReadyCB& demuxer_ready_cb, uint64 bytes_to_cache);
-  void OnDemuxerReady(const scoped_refptr<Demuxer>& demuxer,
-                      const DemuxerReadyCB& ready_cb, uint64 bytes_to_cache,
-                      ::media::PipelineStatus status);
-
-  class DemuxerHostStub;
-  DemuxerHostStub* host_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(DemuxerHelper);
-};
-
-}  // namespace sandbox
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_SANDBOX_DEMUXER_HELPER_H_
diff --git a/cobalt/media/sandbox/format_guesstimator.cc b/cobalt/media/sandbox/format_guesstimator.cc
index a616d53..abac9f6 100644
--- a/cobalt/media/sandbox/format_guesstimator.cc
+++ b/cobalt/media/sandbox/format_guesstimator.cc
@@ -15,6 +15,7 @@
 #include "cobalt/media/sandbox/format_guesstimator.h"
 
 #include <algorithm>
+#include <memory>
 #include <vector>
 
 #include "base/bind.h"
@@ -22,22 +23,23 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/time/time.h"
-#include "cobalt/math/size.h"
-#include "cobalt/media/base/audio_codecs.h"
-#include "cobalt/media/base/audio_decoder_config.h"
-#include "cobalt/media/base/demuxer_stream.h"
-#include "cobalt/media/base/media_tracks.h"
-#include "cobalt/media/base/video_codecs.h"
-#include "cobalt/media/base/video_decoder_config.h"
-#include "cobalt/media/filters/chunk_demuxer.h"
 #include "cobalt/media/sandbox/web_media_player_helper.h"
 #include "cobalt/render_tree/image.h"
+#include "media/base/audio_codecs.h"
+#include "media/base/audio_decoder_config.h"
+#include "media/base/demuxer_stream.h"
+#include "media/base/media_tracks.h"
+#include "media/base/video_codecs.h"
+#include "media/base/video_decoder_config.h"
+#include "media/filters/chunk_demuxer.h"
 #include "net/base/filename_util.h"
 #include "net/base/url_util.h"
 #include "starboard/common/file.h"
 #include "starboard/common/string.h"
 #include "starboard/memory.h"
 #include "starboard/types.h"
+#include "third_party/chromium/media/base/timestamp_constants.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/size.h"
 
 namespace cobalt {
 namespace media {
@@ -45,6 +47,8 @@
 
 namespace {
 
+using ::media::ChunkDemuxer;
+
 // The possible mime type configurations that are supported by cobalt.
 const std::vector<std::string> kSupportedMimeTypes = {
     "audio/mp4; codecs=\"ac-3\"",
@@ -78,6 +82,8 @@
   if (SbFileCanOpen(result.value().c_str(), kSbFileOpenOnly | kSbFileRead)) {
     return result;
   }
+  LOG(WARNING) << "Failed to resolve path \"" << path << "\" as \""
+               << result.value() << '"';
   return base::FilePath();
 }
 
@@ -99,14 +105,13 @@
   return buffer;
 }
 
-void OnInitSegmentReceived(std::unique_ptr<MediaTracks> tracks) {
-}
+void OnInitSegmentReceived(std::unique_ptr<::media::MediaTracks> tracks) {}
 
 // Extract the value of "codecs" parameter from content type. It will return
 // "avc1.42E01E" for "video/mp4; codecs="avc1.42E01E".
 // Note that this function assumes that the input is always valid and does
 // minimum validation..
-std::string ExtractCodec(const std::string& content_type) {
+std::string ExtractCodecs(const std::string& content_type) {
   static const char kCodecs[] = "codecs=";
 
   // SplitString will also trim the results.
@@ -167,7 +172,7 @@
     // obtain a handle to a new |ChunkDemuxer| without any accumulated state as
     // a result of previous calls to |AddId| and |AppendData| methods.
     WebMediaPlayerHelper web_media_player_helper(media_module, open_cb,
-                                                 math::Size(1920, 1080));
+                                                 gfx::Size(1920, 1080));
 
     // |chunk_demuxer| will be set when |open_cb| is called asynchronously
     // during initialization of |web_media_player_helper|. Wait until it is set
@@ -183,11 +188,16 @@
     }
 
     chunk_demuxer->SetTracksWatcher(id, base::Bind(OnInitSegmentReceived));
+    chunk_demuxer->SetParseWarningCallback(
+        id, base::BindRepeating([](::media::SourceBufferParseWarning warning) {
+          LOG(WARNING) << "Encountered SourceBufferParseWarning "
+                       << static_cast<int>(warning);
+        }));
 
     base::TimeDelta unused_timestamp;
-    if (!chunk_demuxer->AppendData(id, header.data(), header.size(),
-                                   base::TimeDelta(), media::kInfiniteDuration,
-                                   &unused_timestamp)) {
+    if (!chunk_demuxer->AppendData(
+            id, header.data(), header.size(), base::TimeDelta(),
+            ::media::kInfiniteDuration, &unused_timestamp)) {
       // Failing to |AppendData()| means the chosen format is not the file's
       // true format.
       continue;
@@ -197,24 +207,23 @@
     // configuration does not match with the configuration determined by the
     // ChunkDemuxer). To confirm, we check the decoder configuration determined
     // by the ChunkDemuxer against the chosen format.
-    if (auto demuxer_stream =
-            chunk_demuxer->GetStream(DemuxerStream::Type::AUDIO)) {
-      const AudioDecoderConfig& decoder_config =
-          demuxer_stream->audio_decoder_config();
-      if (StringToAudioCodec(ExtractCodec(expected_supported_mime_type)) ==
-          decoder_config.codec()) {
+    auto streams = chunk_demuxer->GetAllStreams();
+    DCHECK_EQ(streams.size(), 1);
+
+    if (streams[0]->type() == ::media::DemuxerStream::AUDIO) {
+      const auto& decoder_config = streams[0]->audio_decoder_config();
+      if (::media::StringToAudioCodec(ExtractCodecs(
+              expected_supported_mime_type)) == decoder_config.codec()) {
         adaptive_path_ = path;
         mime_type_ = expected_supported_mime_type;
         break;
       }
       continue;
     }
-    auto demuxer_stream = chunk_demuxer->GetStream(DemuxerStream::Type::VIDEO);
-    DCHECK(demuxer_stream);
-    const VideoDecoderConfig& decoder_config =
-        demuxer_stream->video_decoder_config();
-    if (StringToVideoCodec(ExtractCodec(expected_supported_mime_type)) ==
-        decoder_config.codec()) {
+    DCHECK_EQ(streams[0]->type(), ::media::DemuxerStream::VIDEO);
+    const auto& decoder_config = streams[0]->video_decoder_config();
+    if (::media::StringToVideoCodec(ExtractCodecs(
+            expected_supported_mime_type)) == decoder_config.codec()) {
       adaptive_path_ = path;
       mime_type_ = expected_supported_mime_type;
       break;
diff --git a/cobalt/media/sandbox/fuzzer_app.cc b/cobalt/media/sandbox/fuzzer_app.cc
index 9b4853f..49ea02b 100644
--- a/cobalt/media/sandbox/fuzzer_app.cc
+++ b/cobalt/media/sandbox/fuzzer_app.cc
@@ -14,6 +14,8 @@
 
 #include "cobalt/media/sandbox/fuzzer_app.h"
 
+#include <utility>
+
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "starboard/common/string.h"
@@ -114,21 +116,12 @@
     return;
   }
 
-#if SB_API_VERSION >= 12
   std::vector<char> entry(kSbFileMaxName);
 
   while (SbDirectoryGetNext(directory, entry.data(), entry.size())) {
     std::string file_name = path_name + kSbFileSepString + entry.data();
     AddFile(file_name, min_ratio, max_ratio, initial_seed);
   }
-#else   // SB_API_VERSION >= 12
-  SbDirectoryEntry entry;
-
-  while (SbDirectoryGetNext(directory, &entry)) {
-    std::string file_name = path_name + kSbFileSepString + entry.name;
-    AddFile(file_name, min_ratio, max_ratio, initial_seed);
-  }
-#endif  // SB_API_VERSION >= 12
 
   SbDirectoryClose(directory);
 }
diff --git a/cobalt/media/sandbox/in_memory_data_source.cc b/cobalt/media/sandbox/in_memory_data_source.cc
deleted file mode 100644
index 2534603..0000000
--- a/cobalt/media/sandbox/in_memory_data_source.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "cobalt/media/sandbox/in_memory_data_source.h"
-#include "starboard/memory.h"
-
-namespace cobalt {
-namespace media {
-namespace sandbox {
-
-InMemoryDataSource::InMemoryDataSource(const std::vector<uint8>& content)
-    : content_(content) {}
-
-void InMemoryDataSource::Read(int64 position, int size, uint8* data,
-                              const ReadCB& read_cb) {
-  DCHECK(data);
-
-  if (position < 0 || size < 0) {
-    read_cb.Run(kInvalidSize);
-    return;
-  }
-
-  uint64 uint64_position = static_cast<uint64>(position);
-
-  if (uint64_position > content_.size() ||
-      uint64_position + size > content_.size()) {
-    read_cb.Run(kInvalidSize);
-    return;
-  }
-
-  if (size == 0) {
-    read_cb.Run(0);
-    return;
-  }
-
-  memcpy(data, &content_[0] + position, size);
-  read_cb.Run(size);
-}
-
-void InMemoryDataSource::Stop() {}
-
-bool InMemoryDataSource::GetSize(int64* size_out) {
-  DCHECK(size_out);
-  *size_out = content_.size();
-  return true;
-}
-
-}  // namespace sandbox
-}  // namespace media
-}  // namespace cobalt
diff --git a/cobalt/media/sandbox/in_memory_data_source.h b/cobalt/media/sandbox/in_memory_data_source.h
deleted file mode 100644
index ba22db7..0000000
--- a/cobalt/media/sandbox/in_memory_data_source.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef COBALT_MEDIA_SANDBOX_IN_MEMORY_DATA_SOURCE_H_
-#define COBALT_MEDIA_SANDBOX_IN_MEMORY_DATA_SOURCE_H_
-
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "cobalt/media/base/data_source.h"
-
-namespace cobalt {
-namespace media {
-namespace sandbox {
-
-// A BufferedDataSource that keeps all its data in memory.  This is used for
-// testing or fuzzing only.
-class InMemoryDataSource : public ::media::DataSource {
- public:
-  static const int64 kInvalidSize = -1;
-
-  explicit InMemoryDataSource(const std::vector<uint8>& content);
-
-  // DataSource methods.
-  void Read(int64 position, int size, uint8* data,
-            const ReadCB& read_cb) override;
-  void Stop() override;
-  bool GetSize(int64* size_out) override;
-  bool IsStreaming() override { return false; }
-  void SetBitrate(int bitrate) override {}
-
- private:
-  std::vector<uint8> content_;
-};
-
-}  // namespace sandbox
-}  // namespace media
-}  // namespace cobalt
-
-#endif  // COBALT_MEDIA_SANDBOX_IN_MEMORY_DATA_SOURCE_H_
diff --git a/cobalt/media/sandbox/media2_sandbox.cc b/cobalt/media/sandbox/media2_sandbox.cc
index 8816839..cb89b23 100644
--- a/cobalt/media/sandbox/media2_sandbox.cc
+++ b/cobalt/media/sandbox/media2_sandbox.cc
@@ -19,11 +19,11 @@
 #include "base/path_service.h"
 #include "base/task/task_scheduler/task_scheduler.h"
 #include "cobalt/base/wrap_main.h"
-#include "cobalt/media/base/media_log.h"
 #include "cobalt/media/decoder_buffer_allocator.h"
-#include "cobalt/media/filters/chunk_demuxer.h"
 #include "starboard/common/string.h"
 #include "starboard/event.h"
+#include "third_party/chromium/media/base/media_log.h"
+#include "third_party/chromium/media/filters/chunk_demuxer.h"
 
 namespace cobalt {
 namespace media {
@@ -31,28 +31,26 @@
 
 namespace {
 
-class DemuxerHostStub : public DemuxerHost {
+using ::media::ChunkDemuxer;
+using ::media::DemuxerStream;
+
+class DemuxerHostStub : public ::media::DemuxerHost {
   void OnBufferedTimeRangesChanged(
-      const Ranges<base::TimeDelta>& ranges) override {}
+      const ::media::Ranges<base::TimeDelta>& ranges) override {}
 
   void SetDuration(base::TimeDelta duration) override {}
 
-  void OnDemuxerError(PipelineStatus error) override {}
-
-  void AddTextStream(DemuxerStream* text_stream,
-                     const TextTrackConfig& config) override {}
-
-  void RemoveTextStream(DemuxerStream* text_stream) override {}
+  void OnDemuxerError(::media::PipelineStatus error) override {}
 };
 
 void OnDemuxerOpen() {}
 
-void OnEncryptedMediaInitData(EmeInitDataType type,
+void OnEncryptedMediaInitData(::media::EmeInitDataType type,
                               const std::vector<uint8_t>& init_data) {}
 
-void OnInitSegmentReceived(std::unique_ptr<MediaTracks> tracks) {}
+void OnInitSegmentReceived(std::unique_ptr<::media::MediaTracks> tracks) {}
 
-void OnDemuxerStatus(PipelineStatus status) { status = PIPELINE_OK; }
+void OnDemuxerStatus(::media::PipelineStatus status) {}
 
 std::string LoadFile(const std::string& file_name) {
   base::FilePath file_path(file_name);
@@ -79,7 +77,7 @@
 
 void OnDemuxerStreamRead(DemuxerStream* demuxer_stream,
                          DemuxerStream::Status status,
-                         const scoped_refptr<DecoderBuffer>& decoder_buffer) {
+                         scoped_refptr<::media::DecoderBuffer> decoder_buffer) {
   if (!decoder_buffer->end_of_stream()) {
     LOG(INFO) << "Reading " << GetDemuxerStreamType(demuxer_stream)
               << " buffer at " << decoder_buffer->timestamp();
@@ -92,7 +90,7 @@
 void ReadDemuxerStream(DemuxerStream* demuxer_stream) {
   DCHECK(demuxer_stream);
   demuxer_stream->Read(
-      base::Bind(OnDemuxerStreamRead, base::Unretained(demuxer_stream)));
+      base::BindOnce(OnDemuxerStreamRead, base::Unretained(demuxer_stream)));
 }
 
 }  // namespace
@@ -106,27 +104,28 @@
   }
 
   DecoderBufferAllocator decoder_buffer_allocator;
+  ::media::MediaLog media_log;
   base::MessageLoop message_loop;
   // A one-per-process task scheduler is needed for usage of APIs in
   // base/post_task.h which will be used by some net APIs like
   // URLRequestContext;
   base::TaskScheduler::CreateAndStartWithDefaultParams("Cobalt TaskScheduler");
   DemuxerHostStub demuxer_host;
-  std::unique_ptr<ChunkDemuxer> demuxer(new ChunkDemuxer(
-      &decoder_buffer_allocator, base::Bind(OnDemuxerOpen),
-      base::Bind(OnEncryptedMediaInitData), new MediaLog, false));
-  demuxer->Initialize(&demuxer_host, base::Bind(OnDemuxerStatus), false);
+  std::unique_ptr<ChunkDemuxer> demuxer(
+      new ChunkDemuxer(base::BindOnce(OnDemuxerOpen), base::Closure(),
+                       base::Bind(OnEncryptedMediaInitData), &media_log));
+  demuxer->Initialize(&demuxer_host, base::Bind(OnDemuxerStatus));
 
   ChunkDemuxer::Status status =
-      demuxer->AddId("audio", "audio/mp4; codecs=\"mp4a.40.2\"");
+      demuxer->AddId("audio", "audio/mp4", "mp4a.40.2");
   DCHECK_EQ(status, ChunkDemuxer::kOk);
 
   int video_url_length = strlen(argv[2]);
   if (video_url_length > 5 &&
       strncmp(argv[2] + video_url_length - 5, ".webm", 5) == 0) {
-    status = demuxer->AddId("video", "video/webm; codecs=\"vp9\"");
+    status = demuxer->AddId("video", "video/webm", "vp9");
   } else {
-    status = demuxer->AddId("video", "video/mp4; codecs=\"avc1.640028\"");
+    status = demuxer->AddId("video", "video/mp4", "avc1.640028");
   }
   DCHECK_EQ(status, ChunkDemuxer::kOk);
 
@@ -138,17 +137,43 @@
   DCHECK(!video_content.empty());
 
   demuxer->SetTracksWatcher("audio", base::Bind(OnInitSegmentReceived));
+  demuxer->SetParseWarningCallback(
+      "audio",
+      base::BindRepeating([](::media::SourceBufferParseWarning warning) {
+        LOG(WARNING) << "Encountered SourceBufferParseWarning "
+                     << static_cast<int>(warning);
+      }));
   demuxer->SetTracksWatcher("video", base::Bind(OnInitSegmentReceived));
-  demuxer->AppendData("audio", reinterpret_cast<uint8*>(&audio_content[0]),
-                      audio_content.size(), base::TimeDelta(),
-                      base::TimeDelta::Max(), &timestamp_offset);
-  demuxer->AppendData("video", reinterpret_cast<uint8*>(&video_content[0]),
-                      video_content.size(), base::TimeDelta(),
-                      base::TimeDelta::Max(), &timestamp_offset);
-  demuxer->MarkEndOfStream(PIPELINE_OK);
+  demuxer->SetParseWarningCallback(
+      "video",
+      base::BindRepeating([](::media::SourceBufferParseWarning warning) {
+        LOG(WARNING) << "Encountered SourceBufferParseWarning "
+                     << static_cast<int>(warning);
+      }));
+  bool result =
+      demuxer->AppendData("audio", reinterpret_cast<uint8*>(&audio_content[0]),
+                          audio_content.size(), base::TimeDelta(),
+                          base::TimeDelta::Max(), &timestamp_offset);
+  DCHECK(result);
+  result =
+      demuxer->AppendData("video", reinterpret_cast<uint8*>(&video_content[0]),
+                          video_content.size(), base::TimeDelta(),
+                          base::TimeDelta::Max(), &timestamp_offset);
+  DCHECK(result);
+  demuxer->MarkEndOfStream(::media::PIPELINE_OK);
 
-  DemuxerStream* audio_stream = demuxer->GetStream(DemuxerStream::AUDIO);
-  DemuxerStream* video_stream = demuxer->GetStream(DemuxerStream::VIDEO);
+  auto streams = demuxer->GetAllStreams();
+  DemuxerStream* audio_stream = nullptr;
+  DemuxerStream* video_stream = nullptr;
+  for (auto&& stream : streams) {
+    if (stream->type() == DemuxerStream::AUDIO) {
+      DCHECK(!audio_stream);
+      audio_stream = stream;
+    } else if (stream->type() == DemuxerStream::VIDEO) {
+      DCHECK(!video_stream);
+      video_stream = stream;
+    }
+  }
 
   ReadDemuxerStream(audio_stream);
   ReadDemuxerStream(video_stream);
diff --git a/cobalt/media/sandbox/media_sandbox.cc b/cobalt/media/sandbox/media_sandbox.cc
index e749322..bb2b09a 100644
--- a/cobalt/media/sandbox/media_sandbox.cc
+++ b/cobalt/media/sandbox/media_sandbox.cc
@@ -22,8 +22,8 @@
 #include "base/synchronization/lock.h"
 #include "base/task/task_scheduler/task_scheduler.h"
 #include "cobalt/base/event_dispatcher.h"
+#include "cobalt/math/rect.h"
 #include "cobalt/math/size.h"
-#include "cobalt/math/size_f.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/render_tree/animations/animate_node.h"
 #include "cobalt/render_tree/image_node.h"
@@ -33,6 +33,7 @@
 #include "cobalt/storage/storage_manager.h"
 #include "cobalt/system_window/system_window.h"
 #include "cobalt/trace_event/scoped_trace_to_file.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/size.h"
 
 namespace cobalt {
 namespace media {
@@ -53,8 +54,8 @@
   render_tree::ResourceProvider* GetResourceProvider() {
     return renderer_module_->pipeline()->GetResourceProvider();
   }
-  math::Size GetViewportSize() const {
-    return math::Size(kViewportWidth, kViewportHeight);
+  gfx::Size GetViewportSize() const {
+    return gfx::Size(kViewportWidth, kViewportHeight);
   }
 
  private:
@@ -88,9 +89,10 @@
 
   network_module_.reset(new network::NetworkModule(network_options));
   fetcher_factory_.reset(new loader::FetcherFactory(network_module_.get()));
-  math::Size view_size(kViewportWidth, kViewportHeight);
-  system_window_.reset(
-      new system_window::SystemWindow(&event_dispatcher_, view_size));
+  gfx::Size view_size(kViewportWidth, kViewportHeight);
+  system_window_.reset(new system_window::SystemWindow(
+      &event_dispatcher_,
+      cobalt::math::Size(view_size.width(), view_size.height())));
 
   renderer::RendererModule::Options renderer_options;
   renderer_module_.reset(
@@ -109,7 +111,9 @@
 void MediaSandbox::Impl::AnimateCB(render_tree::ImageNode::Builder* image_node,
                                    base::TimeDelta time) {
   DCHECK(image_node);
-  math::SizeF output_size(renderer_module_->render_target()->GetSize());
+  const auto render_target_size = renderer_module_->render_target()->GetSize();
+  math::SizeF output_size(render_target_size.width(),
+                          render_target_size.height());
   image_node->destination_rect = math::RectF(output_size);
   base::AutoLock auto_lock(lock_);
   image_node->source = frame_cb_.is_null() ? NULL : frame_cb_.Run(time);
@@ -159,7 +163,7 @@
   return impl_->GetResourceProvider();
 }
 
-math::Size MediaSandbox::GetViewportSize() const {
+gfx::Size MediaSandbox::GetViewportSize() const {
   DCHECK(impl_);
   return impl_->GetViewportSize();
 }
diff --git a/cobalt/media/sandbox/media_sandbox.h b/cobalt/media/sandbox/media_sandbox.h
index 22e3f7c..858fa77 100644
--- a/cobalt/media/sandbox/media_sandbox.h
+++ b/cobalt/media/sandbox/media_sandbox.h
@@ -21,10 +21,10 @@
 #include "base/memory/ref_counted.h"
 #include "base/time/time.h"
 #include "cobalt/loader/fetcher_factory.h"
-#include "cobalt/math/size.h"
 #include "cobalt/media/media_module.h"
 #include "cobalt/render_tree/image.h"
 #include "cobalt/render_tree/resource_provider.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/size.h"
 
 namespace cobalt {
 namespace media {
@@ -45,7 +45,7 @@
   MediaModule* GetMediaModule();
   loader::FetcherFactory* GetFetcherFactory();
   render_tree::ResourceProvider* resource_provider();
-  math::Size GetViewportSize() const;
+  gfx::Size GetViewportSize() const;
 
  private:
   class Impl;
diff --git a/cobalt/media/sandbox/sandbox.gyp b/cobalt/media/sandbox/sandbox.gyp
deleted file mode 100644
index df91126..0000000
--- a/cobalt/media/sandbox/sandbox.gyp
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This is a sample sandbox application for experimenting with the Cobalt
-# media/renderer interface.
-
-{
-  'variables': {
-    'has_zzuf': '<!pymod_do_main(starboard.build.gyp_functions dir_exists ../../../third_party/zzuf)',
-  },
-  'targets': [
-    # This target will build a sandbox application that allows for easy
-    # experimentation with the media interface on any platform.  This can
-    # also be useful for visually inspecting the output that the Cobalt
-    # media stack is producing.
-    {
-      'target_name': 'media_sandbox',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'media2_sandbox.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-        '<(DEPTH)/cobalt/media/media.gyp:media',
-      ],
-    },
-    {
-      'target_name': 'media_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'media_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'media_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      'target_name': 'web_media_player_sandbox',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'format_guesstimator.cc',
-        'format_guesstimator.h',
-        'media_sandbox.cc',
-        'media_sandbox.h',
-        'web_media_player_helper.cc',
-        'web_media_player_helper.h',
-        'web_media_player_sandbox.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        # Use test data from demos to avoid keeping two copies of video files.
-        '<(DEPTH)/cobalt/demos/demos.gyp:copy_demos',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/cobalt/media/media.gyp:media',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/cobalt/renderer/renderer.gyp:renderer',
-        '<(DEPTH)/cobalt/system_window/system_window.gyp:system_window',
-        '<(DEPTH)/cobalt/trace_event/trace_event.gyp:trace_event',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-      'conditions': [
-        ['sb_evergreen == 0', {
-          'dependencies': [
-            '<@(cobalt_platform_dependencies)',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'web_media_player_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'web_media_player_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'web_media_player_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/media/sandbox/web_media_player_helper.cc b/cobalt/media/sandbox/web_media_player_helper.cc
index 009cc19..ad1fa4f 100644
--- a/cobalt/media/sandbox/web_media_player_helper.cc
+++ b/cobalt/media/sandbox/web_media_player_helper.cc
@@ -13,11 +13,12 @@
 // limitations under the License.
 
 #include <memory>
+#include <utility>
 
 #include "cobalt/media/sandbox/web_media_player_helper.h"
 
-#include "cobalt/math/rect.h"
 #include "cobalt/media/fetcher_buffered_data_source.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/rect.h"
 
 namespace cobalt {
 namespace media {
@@ -46,14 +47,14 @@
   void PlaybackStateChanged() override {}
   void SawUnsupportedTracks() override {}
   float Volume() const override { return 1.f; }
-  void SourceOpened(ChunkDemuxer* chunk_demuxer) override {
+  void SourceOpened(::media::ChunkDemuxer* chunk_demuxer) override {
     DCHECK(!chunk_demuxer_open_cb_.is_null());
     chunk_demuxer_open_cb_.Run(chunk_demuxer);
   }
   std::string SourceURL() const override { return ""; }
   std::string MaxVideoCapabilities() const override { return std::string(); };
 
-  void EncryptedMediaInitDataEncountered(EmeInitDataType, const unsigned char*,
+  void EncryptedMediaInitDataEncountered(const char*, const unsigned char*,
                                          unsigned) override {}
 
   ChunkDemuxerOpenCB chunk_demuxer_open_cb_;
@@ -61,7 +62,7 @@
 
 WebMediaPlayerHelper::WebMediaPlayerHelper(MediaModule* media_module,
                                            const ChunkDemuxerOpenCB& open_cb,
-                                           const math::Size& viewport_size)
+                                           const gfx::Size& viewport_size)
     : client_(new WebMediaPlayerClientStub(open_cb)),
       player_(media_module->CreateWebMediaPlayer(client_)) {
   player_->SetRate(1.0);
@@ -70,13 +71,13 @@
 
   auto set_bounds_cb = player_->GetSetBoundsCB();
   if (!set_bounds_cb.is_null()) {
-    set_bounds_cb.Run(math::Rect(viewport_size));
+    set_bounds_cb.Run(0, 0, viewport_size.width(), viewport_size.height());
   }
 }
 
 WebMediaPlayerHelper::WebMediaPlayerHelper(
     MediaModule* media_module, loader::FetcherFactory* fetcher_factory,
-    const GURL& video_url, const math::Size& viewport_size)
+    const GURL& video_url, const gfx::Size& viewport_size)
     : client_(new WebMediaPlayerClientStub),
       player_(media_module->CreateWebMediaPlayer(client_)) {
   player_->SetRate(1.0);
@@ -89,7 +90,7 @@
 
   auto set_bounds_cb = player_->GetSetBoundsCB();
   if (!set_bounds_cb.is_null()) {
-    set_bounds_cb.Run(math::Rect(viewport_size));
+    set_bounds_cb.Run(0, 0, viewport_size.width(), viewport_size.height());
   }
 }
 
diff --git a/cobalt/media/sandbox/web_media_player_helper.h b/cobalt/media/sandbox/web_media_player_helper.h
index 62c98b4..939f0ae 100644
--- a/cobalt/media/sandbox/web_media_player_helper.h
+++ b/cobalt/media/sandbox/web_media_player_helper.h
@@ -20,10 +20,10 @@
 
 #include "base/callback.h"
 #include "cobalt/loader/fetcher_factory.h"
-#include "cobalt/math/size.h"
 #include "cobalt/media/base/video_frame_provider.h"
 #include "cobalt/media/media_module.h"
 #include "cobalt/media/player/web_media_player.h"
+#include "third_party/chromium/media/cobalt/ui/gfx/geometry/size.h"
 #include "url/gurl.h"
 
 namespace cobalt {
@@ -35,17 +35,17 @@
 // simplify the using of WebMediaPlayer.
 class WebMediaPlayerHelper {
  public:
-  typedef base::Callback<void(ChunkDemuxer*)> ChunkDemuxerOpenCB;
+  typedef base::Callback<void(::media::ChunkDemuxer*)> ChunkDemuxerOpenCB;
 
   // Ctor to create an adaptive pipeline.  |open_cb| will be called when the
   // ChunkDemuxer is ready to add source buffers.
   WebMediaPlayerHelper(MediaModule* media_module,
                        const ChunkDemuxerOpenCB& chunk_demuxer_open_cb,
-                       const math::Size& viewport_size);
+                       const gfx::Size& viewport_size);
   // Ctor to create a progressive pipeline.
   WebMediaPlayerHelper(MediaModule* media_module,
                        loader::FetcherFactory* fetcher_factory,
-                       const GURL& video_url, const math::Size& viewport_size);
+                       const GURL& video_url, const gfx::Size& viewport_size);
   ~WebMediaPlayerHelper();
 
   SbDecodeTarget GetCurrentDecodeTarget() const;
diff --git a/cobalt/media/sandbox/web_media_player_sandbox.cc b/cobalt/media/sandbox/web_media_player_sandbox.cc
index f97a2b6..1c9f4c6 100644
--- a/cobalt/media/sandbox/web_media_player_sandbox.cc
+++ b/cobalt/media/sandbox/web_media_player_sandbox.cc
@@ -34,6 +34,8 @@
 #include "starboard/event.h"
 #include "starboard/log.h"
 #include "starboard/system.h"
+#include "third_party/chromium/media/base/timestamp_constants.h"
+#include "third_party/chromium/media/filters/chunk_demuxer.h"
 
 namespace cobalt {
 namespace media {
@@ -48,9 +50,9 @@
   std::string executable_file_name =
       base::FilePath(executable_path_name).BaseName().value();
   const char kExampleAdaptiveAudioPathName[] =
-      "cobalt/demos/media-element-demo/dash-audio.mp4";
+      "demos/media-element-demo/public/assets/dash-audio.mp4";
   const char kExampleAdaptiveVideoPathName[] =
-      "cobalt/demos/media-element-demo/dash-video-1080p.mp4";
+      "demos/media-element-demo/public/assets/dash-video-1080p.mp4";
   const char kExampleProgressiveUrl[] =
       "https://storage.googleapis.com/yt-cobalt-media-element-demo/"
       "progressive.mp4";
@@ -90,8 +92,7 @@
   SbLogRaw(ss.str().c_str());
 }
 
-void OnInitSegmentReceived(std::unique_ptr<MediaTracks> tracks) {
-}
+void OnInitSegmentReceived(std::unique_ptr<::media::MediaTracks> tracks) {}
 
 class InitCobaltHelper {
  public:
@@ -150,6 +151,8 @@
   ~Application() { media_sandbox_.RegisterFrameCB(MediaSandbox::FrameCB()); }
 
  private:
+  typedef ::media::ChunkDemuxer ChunkDemuxer;
+
   void InitializeAdaptivePlayback(const FormatGuesstimator& guesstimator) {
     is_adaptive_playback_ = true;
 
@@ -183,6 +186,11 @@
     CHECK_EQ(status, ChunkDemuxer::kOk);
 
     chunk_demuxer_->SetTracksWatcher(id, base::Bind(OnInitSegmentReceived));
+    chunk_demuxer_->SetParseWarningCallback(
+        id, base::BindRepeating([](::media::SourceBufferParseWarning warning) {
+          LOG(WARNING) << "Encountered SourceBufferParseWarning "
+                       << static_cast<int>(warning);
+        }));
     player_ = player_helper_->player();
 
     media_sandbox_.RegisterFrameCB(
@@ -239,8 +247,20 @@
 
     chunk_demuxer_->SetTracksWatcher(kAudioId,
                                      base::Bind(OnInitSegmentReceived));
+    chunk_demuxer_->SetParseWarningCallback(
+        kAudioId,
+        base::BindRepeating([](::media::SourceBufferParseWarning warning) {
+          LOG(WARNING) << "Encountered SourceBufferParseWarning "
+                       << static_cast<int>(warning);
+        }));
     chunk_demuxer_->SetTracksWatcher(kVideoId,
                                      base::Bind(OnInitSegmentReceived));
+    chunk_demuxer_->SetParseWarningCallback(
+        kVideoId,
+        base::BindRepeating([](::media::SourceBufferParseWarning warning) {
+          LOG(WARNING) << "Encountered SourceBufferParseWarning "
+                       << static_cast<int>(warning);
+        }));
     player_ = player_helper_->player();
 
     media_sandbox_.RegisterFrameCB(
@@ -291,7 +311,7 @@
       bool audio_eos = !audio_file_ || audio_offset_ == audio_file_->GetSize();
       bool video_eos = !video_file_ || video_offset_ == video_file_->GetSize();
       if (audio_eos && video_eos) {
-        chunk_demuxer_->MarkEndOfStream(PIPELINE_OK);
+        chunk_demuxer_->MarkEndOfStream(::media::PIPELINE_OK);
         eos_appended_ = true;
       }
     }
@@ -314,7 +334,7 @@
     std::vector<uint8_t> buffer(kMaxBytesToAppend);
 
     while (*offset < file->GetSize()) {
-      Ranges<TimeDelta> ranges = chunk_demuxer_->GetBufferedRanges(id);
+      ::media::Ranges<TimeDelta> ranges = chunk_demuxer_->GetBufferedRanges(id);
       float end_of_buffer =
           ranges.size() == 0 ? 0.f : ranges.end(ranges.size() - 1).InSecondsF();
       if (end_of_buffer - player_->GetCurrentTime() > kLowWaterMarkInSeconds) {
@@ -332,7 +352,7 @@
       base::TimeDelta timestamp_offset;
       auto appended = chunk_demuxer_->AppendData(
           id, buffer.data(), bytes_to_append, base::TimeDelta(),
-          media::kInfiniteDuration, &timestamp_offset);
+          ::media::kInfiniteDuration, &timestamp_offset);
       SB_DCHECK(appended);
 
       *offset += bytes_to_append;
diff --git a/cobalt/media/test/data/48_aac_infinite_loop.m4a b/cobalt/media/test/data/48_aac_infinite_loop.m4a
deleted file mode 100644
index 27a6184..0000000
--- a/cobalt/media/test/data/48_aac_infinite_loop.m4a
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/4ch.wav b/cobalt/media/test/data/4ch.wav
deleted file mode 100644
index 44ffd75..0000000
--- a/cobalt/media/test/data/4ch.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/90rotation.mp4 b/cobalt/media/test/data/90rotation.mp4
deleted file mode 100644
index 13bfe21..0000000
--- a/cobalt/media/test/data/90rotation.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/9ch.ogg b/cobalt/media/test/data/9ch.ogg
deleted file mode 100644
index 97a1d12..0000000
--- a/cobalt/media/test/data/9ch.ogg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/COPYING b/cobalt/media/test/data/COPYING
deleted file mode 100644
index 9354043..0000000
--- a/cobalt/media/test/data/COPYING
+++ /dev/null
@@ -1,21 +0,0 @@
-npot-video.h264, red-green.h264:
-Copyright (c) 2012 The Khronos Group Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and/or associated documentation files (the
-"Materials"), to deal in the Materials without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Materials, and to
-permit persons to whom the Materials are furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Materials.
-
-THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
diff --git a/cobalt/media/test/data/README b/cobalt/media/test/data/README
deleted file mode 100644
index 3d752bd..0000000
--- a/cobalt/media/test/data/README
+++ /dev/null
@@ -1,278 +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.
-
-bear-320x240.webm - WebM encode of bear.1280x720.mp4 resized to 320x240.
-bear-320x240-video-only.webm - The video track of bear-320x240.webm.
-bear-320x240-audio-only.webm - The audio track of bear-320x240.webm.
-bear-vp9.webm - VP9 video only WebM file.
-bear-vp9-opus.webm - VP9 Video with Opus Audio.
-bear-vp8-webvtt.webm - WebM VP8 video with WebVTT subtitle track.
-bear-1280x720_avt_subt_frag.mp4 - Fragmented bear_1280x720.mp4 with text track
-                                  containing srt from bear-vp8-webvtt.webm as
-                                  a 'subt' handler type.
-bear-1280x720_av_frag.mp4 - Fragmented bear_1280x720.mp4.
-bear-1280x720_av_frag-initsegment-mvhd_version_0-mvhd_duration_bits_all_set.mp4:
-  Just the first initialization segment of bear-1280x720_av_frag.mp4, modified to
-  have the mvhd version 0 32-bit duration field set to all 1's.
-bear-vp8a.webm - WebM VP8 video with alpha channel.
-bear-vp8a-odd-dimensions.webm - WebM VP8 video with alpha channel and odd dimensions.
-bear-opus.webm - Opus Audio only WebM file.
-bear-opus-end-trimming.webm - File to test end trimming. It has one byte
-                              artificially added so that there is maximum
-                              padding at the end. It is an Opus Audio only WebM
-                              file.
-no_streams.webm - Header, Info, & Tracks element from bear-320x240.webm slightly corrupted so it looks
-                  like there are no tracks.
-nonzero-start-time.webm - Has the same headers as bear-320x240.webm but the first cluster of this file
-                          is the second cluster of bear-320x240.webm. This creates the situation where
-                          the media data doesn't start at time 0.
-bear-320x240-live.webm - bear-320x240.webm remuxed w/o a duration and using clusters with unknown sizes.
-                         ffmpeg -i bear-320x240.webm -acodec copy -vcodec copy -f webm pipe:1 > bear-320x240-live.webm
-vp8-I-frame-160x240 - The first I frame of a 160x240 reencode of bear-320x240.webm.
-vp8-I-frame-320x120 - The first I frame of a 320x120 reencode of bear-320x240.webm.
-vp8-I-frame-320x240 - The first I frame of bear-320x240.webm.
-vp8-I-frame-320x480 - The first I frame of a 320x480 reencode of bear-320x240.webm.
-vp8-I-frame-640x240 - The first I frame of a 640x240 reencode of bear-320x240.webm.
-vp8-corrupt-I-frame - A copy of vp8-I-frame-320x240 w/ all bytes XORed w/ 0xA5.
-
-colour.webm - a WebM file containing color metadata in MKV/WebM Colour element
-    copied from libwebm/testing/testdata/colour.webm
-
-AAC test data from MPEG-DASH demoplayer (44100 Hz, stereo)
-Duration of each packet is (1024/44100 Hz), approximately 23.22 ms.
-aac-44100-packet-0  - timestamp: 0ms
-aac-44100-packet-1  - timestamp: 23.22ms
-aac-44100-packet-2  - timestamp: 46.44ms
-aac-44100-packet-3  - timestamp: 69.66ms
-
-Vorbis test data from bear.ogv (44100 Hz, 16 bits, stereo)
-vorbis-extradata - Vorbis extradata section
-vorbis-packet-0  - timestamp: 0ms, duration: 0ms
-vorbis-packet-1  - timestamp: 0ms, duration: 0ms
-vorbis-packet-2  - timestamp: 0ms, duration: 0ms
-vorbis-packet-3  - timestamp: 2902ms, duration: 0ms
-
-// 10-bit test file(s)
-bear-320x180-hi10p.mp4
-
-// Encrypted Files
-bear-1280x720-a_frag-cenc.mp4 - A fragmented MP4 version of the audio track of bear-1280x720.mp4 encrypted (ISO CENC) using key ID [1] and key [2].
-bear-1280x720-a_frag-cenc-key_rotation.mp4 - A fragmented MP4 version of the audio track of bear-1280x720.mp4 encrypted (ISO CENC) using key ID [1] and key [2] with key rotation [3].
-bear-1280x720-a_frag-cenc_clear-all.mp4 - Same as bear-1280x720-a_frag-cenc.mp4 but no fragments are encrypted.
-bear-1280x720-v_frag-cenc.mp4 - A fragmented MP4 version of the video track of bear-1280x720.mp4 encrypted (ISO CENC) using key ID [1] and key [2].
-bear-1280x720-v_frag-cenc-key_rotation.mp4 - A fragmented MP4 version of the video track of bear-1280x720.mp4 encrypted (ISO CENC) using key ID [1] and key [2] with key rotation [3].
-bear-1280x720-v_frag-cenc_clear-all.mp4 - Same as bear-1280x720-v_frag-cenc.mp4 but no fragments are encrypted.
-bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4 - An invalid file similar to bear-1280x720-a_frag-cenc.mp4 but has no saiz and saio boxes. To save space, it has only one encrypted sample.
-bear-320x240-v_frag-vp9.mp4 - Bear video with VP9 codec in MP4 container. Generated with shaka-packager (https://github.com/google/shaka-packager):
-                              packager in=bear-vp9.webm,stream=video,out=bear-320x240-v_frag-vp9.mp4
-bear-320x240-v_frag-vp9-cenc.mp4 - Same as above, with video encrypted using key ID [1] and key [2]. Generated with shaka-packager (https://github.com/google/shaka-packager):
-                                   packager in=bear-vp9.webm,stream=video,out=bear-320x240-v_frag-vp9-cenc.mp4 --enable_fixed_key_encryption --key_id 30313233343536373839303132333435 --key ebdd62f16814d27b68ef122afce4ae3c
-bear-320x240-16x9-aspect-av_enc-av.webm - bear-320x240-16x9-aspect.webm with audio & video encrypted using key ID [1] and key [2]
-bear-320x240-av_enc-av.webm - bear-320x240.webm with audio & video encrypted using key ID [1] and key [2].
-bear-320x240-av_enc-av_clear-1s.webm - Same as bear-320x240-av_enc-av.webm but with no frames in the first second encrypted.
-bear-320x240-av_enc-av_clear-all.webm - Same as bear-320x240-av_enc-av.webm but with no frames encrypted.
-bear-640x360-av_enc-av.webm - bear-640x360.webm with audio & video encrypted using key ID [1] and key [2].
-bear-320x240-av_enc-v.webm - bear-320x240.webm with video track encrypted using key ID [1] and key [2].
-bear-320x240-av_enc-a.webm - bear-320x240.webm with audio track encrypted using key ID [1] and key [2].
-bear-320x240-v_enc-v.webm - bear-320x240-video-only.webm encrypted using key ID [1] and key [2].
-bear-320x240-v-vp9_enc-v.webm - bear-vp9.webm VP9 video only encrypted using key ID [1] and key [2].
-bear-320x240-opus-a_enc-a.webm - bear-opus.webm encrypted using key ID [1] and key[2].
-bear-320x240-opus-av_enc-av.webm - bear-vp9-opus.webm with audio & video encrypted using key ID [1] and key[2].
-bear-320x240-opus-av_enc-v.webm - bear-vp9-opus.webm with video track encrypted using key ID [1] and key[2].
-bear-640x360-a_frag-cenc.mp4 - A fragmented MP4 version of the audio track of bear-640x360.mp4 encrypted (ISO CENC) using key ID [1] and key [2].
-bear-640x360-a_frag-cenc-key_rotation.mp4 - A fragmented MP4 version of the audio track of bear-640x360.mp4 encrypted (ISO CENC) using key ID [1] and key [2] with key rotation [3].
-bear-640x360-v_frag-cenc.mp4 - A fragmented MP4 version of the video track of bear-640x360.mp4 encrypted (ISO CENC) using key ID [1] and key [2]  and with sample encryption auxiliary information in the beginning of mdat box.
-bear-640x360-v_frag-cenc-senc.mp4 - Same as above, but with sample encryption information stored in SampleEncryption ('senc') box.
-bear-640x360-v_frag-cenc-key_rotation.mp4 - A fragmented MP4 version of the video track of bear-640x360.mp4 encrypted (ISO CENC) using key ID [1] and key [2] with key rotation [3].
-bear-a_enc-a.webm - bear-320x240-audio-only.webm encrypted using key ID [1] and key [2].
-frame_size_change-av_enc-v.webm - third_party/WebKit/LayoutTests/media/resources/frame_size_change.webm encrypted using key ID [1] and key [2].
-
-
-[1] 30313233343536373839303132333435
-[2] ebdd62f16814d27b68ef122afce4ae3c
-[3] KeyIds and Keys are created by left rotating key ID [1] and key [2] using
-    std::rotate for every new crypto period. This is only for testing. The
-    actual key rotation algorithm is often much more complicated.
-
-// Container Tests (additional containers derived from bear.ogv)
-bear.ac3    -- created using "avconv -i bear.ogv -f ac3 -b 192k bear.ac3".
-bear.adts   -- created using "avconv -i bear.ogv -f adts -strict experimental bear.adts".
-bear.aiff   -- created using "avconv -i bear.ogv -f aiff bear.aiff".
-bear.asf    -- created using "avconv -i bear.ogv -f asf bear.asf".
-bear.avi    -- created using "avconv -i bear.ogv -f avi -b 192k bear.avi".
-bear.eac3   -- created using "avconv -i bear.ogv -f eac3 bear.eac3".
-bear.flac   -- created using "avconv -i bear.ogv -f flac bear.flac".
-bear.flv    -- created using "avconv -i bear.ogv -f flv bear.flv".
-bear.h261   -- created using "avconv -i bear.ogv -f h261 -s:0 cif bear.h261".
-bear.h263   -- created using "avconv -i bear.ogv -f h263 -s:0 cif bear.h263".
-bear.m2ts   -- created using "avconv -i bear.ogv -f mpegts bear.m2ts".
-bear.mjpeg  -- created using "avconv -i bear.ogv -f mjpeg bear.mjpeg".
-bear.mpeg   -- created using "avconv -i bear.ogv -f mpeg bear.mpeg".
-bear.rm     -- created using "avconv -i bear.ogv -f rm -b 192k bear.rm".
-bear.swf    -- created using "avconv -i bear.ogv -f swf -an bear.swf".
-
-// VDA test files: test-25fps
-test-25fps.h264:
-  Using ffmpeg SVN-r0.5.9-4:0.5.9-0ubuntu0.10.04.1 @ WebKit r122718, generated
-  with:
-  ffmpeg -i third_party/WebKit/LayoutTests/media/content/test-25fps.mp4 \
-      -vcodec copy -vbsf h264_mp4toannexb -an test-25fps.h264
-
-test-25fps.h264.md5:
-  MD5s of RGB thumbnail rendered version of test-25fps.h264 decoded with Intel
-  VAAPI and V4L2VDA on various platforms.
-  Written out by video_decode_accelerator_unittest.
-  These differ between implementations because color space-converted frames are
-  not specified to the last bit and GLES shader/texture filtering
-  precision varies.
-
-test-25fps.vp8:
-  ffmpeg git-2012-07-19-a8d8e86, libvpx ToT 7/19, chromium r147247,
-  mkvextract v5.0.1
-  ffmpeg -i test-25fps.h264 -vcodec libvpx -an test-25fps.webm && \
-      mkvextract tracks test-25fps.webm 1:test-25fps.vp8 && rm test-25fps.webm
-
-test-25fps.vp8.md5:
-  MD5 of RGB thumbnail rendered version of test-25fps.vp8. Written out by
-  video_decode_accelerator_unittest.
-
-test-25fps.vp9:
-  avconv 9.16-6:9.16-0ubuntu0.14.04.1, vpxenc v1.3.0
-  avconv -i test-25fps.h264 -c:v rawvideo -pix_fmt yuv420p test-25fps_i420.yuv
-  vpxenc test-25fps_i420.yuv -o test-25fps.vp9 --codec=vp9 -w 320 -h 240 --ivf \
-      --profile=0 --kf-min-dist=0 --kf-max-dist=150 --lag-in-frames=24 \
-      --drop-frame=0 --target-bitrate=140 --cq-level=23 --min-q=4 --max-q=56 \
-      --static-thresh=1000 --arnr-maxframes=7 --arnr-strength=5 --arnr-type=3 \
-      --cpu-used=1 --good --tile-columns=1 --passes=2 --threads=1 --fps=25/1 \
-      --end-usage=cq --auto-alt-ref=1 --bias-pct=50 --minsection-pct=0 \
-      --maxsection-pct=2000 --undershoot-pct=100
-
-test-25fps.vp9.md5:
-  MD5 of RGB thumbnail rendered version of test-25fps.vp9. Written out by
-  video_decode_accelerator_unittest.
-
-// VDA test files: bear
-bear.h264:
-  Using ffmpeg version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, generated with
-  bear.mp4 (https://chromiumcodereview.appspot.com/10805089):
-  ffmpeg -i bear.mp4 -vcodec copy -vbsf h264_mp4toannexb \
-      -an bear.h264
-
-bear.h264.md5:
-  MD5s of RGB thumbnail rendered version of bear.h264 decoded with Intel
-  VAAPI on Ivy Bridge and Sandy Bridge and V4L2VDA on Exynos.
-  Written out by video_decode_accelerator_unittest.
-  These differ between implementations because color space-converted frames are
-  not specified to the last bit and GLES shader/texture filtering
-  precision varies.
-
-// VDA test files: npot-video
-npot-video.h264:
-  Using ffmpeg version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, generated with
-  npot-video.mp4 (https://codereview.chromium.org/8342021):
-  ffmpeg -i npot-video.mp4 -vcodec copy -vbsf h264_mp4toannexb \
-      -an npot-video.h264
-
-npot-video.h264.md5:
-  MD5s of RGB thumbnail rendered version of npot-video.h264 decoded with Intel
-  VAAPI on Ivy Bridge and Sandy Bridge and V4L2VDA on Exynos.
-  Written out by video_decode_accelerator_unittest.
-  These differ between implementations because color space-converted frames are
-  not specified to the last bit and GLES shader/texture filtering
-  precision varies.
-
-// VDA test files: red-green
-red-green.h264:
-  Using ffmpeg version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, generated with
-  red-green.mp4 (https://codereview.chromium.org/8342021):
-  ffmpeg -i red-green.mp4 -vcodec copy -vbsf h264_mp4toannexb \
-      -an red-green.h264
-
-red-green.h264.md5:
-  MD5s of RGB thumbnail rendered version of red-green.h264 decoded with Intel
-  VAAPI on Ivy Bridge and Sandy Bridge and V4L2VDA on Exynos.
-  Written out by video_decode_accelerator_unittest.
-  These differ between implementations because color space-converted frames are
-  not specified to the last bit and GLES shader/texture filtering
-  precision varies.
-
-// VEA test files:
-bear_320x192_40frames.yuv
-  First 40 raw i420 frames of bear-1280x720.mp4 scaled down to 320x192 for
-  video_encode_accelerator_unittest.
-
-// VP9 parser test files:
-bear-vp9.ivf
-  - Created using "avconv -i bear-vp9.webm -vcodec copy -an -f ivf bear-vp9.ivf".
-bear-vp9.ivf.context 
-test-25fps.vp9.context
-  - Manually dumped from libvpx with bear-vp9.ivf and test-25fps.vp9. See
-    vp9_parser_unittest.cc for description of their format.
-
-// WebM files for testing multiple tracks.
-green-a300hz.webm - WebM file containing 12 seconds of solid green video + 300Hz sine wave audio
-red-a500hz.webm - WebM file containing 10 seconds of solid red video + 500Hz sine wave audio
-  - Created with the following commands:
-    ffmpeg -f lavfi -i color=c=green:size=160x120 -t 12 -c:v libvpx green.webm
-    ffmpeg -f lavfi -i color=c=red:size=320x240 -t 10 -c:v libvpx red.webm
-    ffmpeg -f lavfi -i "sine=frequency=300:sample_rate=48000" -t 12 -c:v libvpx a300hz.webm
-    ffmpeg -f lavfi -i "sine=frequency=500:sample_rate=48000" -t 10 -c:v libvpx a500hz.webm
-    ffmpeg -i green.webm -i a300hz.webm -map 0 -map 1 green-a300hz.webm
-    ffmpeg -i red.webm -i a500hz.webm -map 0 -map 1 red-a500hz.webm
-
-// JPEG test files:
-pixel-1280x720.jpg - Single MJEPG encoded frame of 1280x720, captured on Chromebook Pixel. This image does not have Huffman table.
-peach_pi-1280x720.jpg - Single MJPEG encoded frame of 1280x720, captured on Samsung Chromebook 2(13"). This image has Huffman table.
-blank-1x1.jpg - 1x1 small picture to test special cases.
-
-// MP4 files with non-square pixels.
-media/test/data/bear-640x360-non_square_pixel-with_pasp.mp4
-  Size in TKHD is (639.2x360) and size in STSD is (470x360). A PASP box is
-  present with hSpacing=34 and vSpacing=25. Note that 470.0 * 34 / 25 = 639.2.
-
-media/test/data/bear-640x360-non_square_pixel-without_pasp.mp4
-  Size in TKHD is (639.2x360) and size in STSD is (470x360). No PASP box is
-  present.
-
-// MP4 files with AC3 and EAC3 audio
-media/test/data/bear-ac3-only-frag.mp4
-  AC3 audio in framented MP4, generated with
-  ffmpeg -i bear.ac3 -acodec copy -movflags frag_keyframe bear-ac3-only-frag.mp4
-
-media/test/data/bear-eac3-only-frag.mp4
-  EAC3 audio in framented MP4, generated with
-  ffmpeg -i bear.eac3 -acodec copy -movflags frag_keyframe bear-eac3-only-frag.mp4
-
-// Mpeg2ts stream with AAC HE audio that uses SBR
-media/test/data/bear-1280x720-aac_he.ts
-  Generated by the following command:
-  ffmpeg -i bear-1280x720.mp4 -c:v libx264 -c:a libfdk_aac -profile:a aac_he  bear-1280x720-aac_he.ts
-
-// MP4 file with HEVC
-media/test/data/bear-320x240-v_frag-hevc.mp4
-  HEVC video stream in fragmented MP4 container, generated with
-  ffmpeg -i bear-320x240.webm -c:v libx265 -an -movflags faststart+frag_keyframe bear-320x240-v_frag-hevc.mp4
-
-// Multi-track MP4 file
-// (c) copyright 2008, Blender Foundation / www.bigbuckbunny.org
-media/test/data/bbb-320x240-2video-2audio.mp4
-  Generated using following commands
-  // Download the source file with 1 video and 1 audio stream.
-  wget http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4
-  // Generate a scaled down to 320x240 video + 2 channel AAC LC audio from the source file.
-  ffmpeg -i bbb_sunflower_1080p_30fps_normal.mp4 -c:v libx264 -crf 36 -vf  scale=320:240 -c:a libfdk_aac -ac 2 -t 24 bbb1.mp4
-  // Generate a file with the original video scaled down to 320x240 and flipped upside down and sine wave instead of audio.
-  ffmpeg -i bbb_sunflower_1080p_30fps_normal.mp4 -f lavfi -i "sine=frequency=500:sample_rate=48000" -map 0:v -map 1:a -c:v libx264 -crf 36 -vf scale=320:240,vflip -c:a libfdk_aac -ac 2 -t 24 bbb2.mp4
-  // Combine the two files generated above into a single fragmented .mp4 file with 2 video and 2 audio tracks.
-  ffmpeg -i bbb1.mp4 -i bbb2.mp4 -map 0:0 -map 0:1 -map 1:0 -map 1:1 -c:v copy -c:a copy -movflags frag_keyframe+omit_tfhd_offset+separate_moof bbb-320x240-2video-2audio.mp4
-
-// Multi-track WebM file
-media/test/data/multitrack-3video-2audio.webm
-    //Generated using following commands:
-    ffmpeg -f lavfi -i color=c=red:size=320x240 -t 5 -c:v libvpx red.webm
-    ffmpeg -f lavfi -i color=c=green:size=320x240 -t 5 -c:v libvpx green.webm
-    ffmpeg -f lavfi -i color=c=blue:size=160x120 -t 10 -c:v libvpx blue.webm
-    ffmpeg -f lavfi -i "sine=frequency=300:sample_rate=48000" -t 10 -c:v libvpx a300hz.webm
-    ffmpeg -f lavfi -i "sine=frequency=500:sample_rate=48000" -t 5 -c:v libvpx a500hz.webm
-    ffmpeg -i red.webm -i green.webm -i blue.webm -i a300hz.webm -i a500hz.webm -map 0 -map 1 -map 2 -map 3 -map 4  multitrack-3video-2audio.webm
diff --git a/cobalt/media/test/data/aac-44100-packet-0 b/cobalt/media/test/data/aac-44100-packet-0
deleted file mode 100644
index b8132d1..0000000
--- a/cobalt/media/test/data/aac-44100-packet-0
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/aac-44100-packet-1 b/cobalt/media/test/data/aac-44100-packet-1
deleted file mode 100644
index 0dd1c69..0000000
--- a/cobalt/media/test/data/aac-44100-packet-1
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/aac-44100-packet-2 b/cobalt/media/test/data/aac-44100-packet-2
deleted file mode 100644
index 303388f..0000000
--- a/cobalt/media/test/data/aac-44100-packet-2
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/aac-44100-packet-3 b/cobalt/media/test/data/aac-44100-packet-3
deleted file mode 100644
index f723b4f..0000000
--- a/cobalt/media/test/data/aac-44100-packet-3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/audio-start-time-only.webm b/cobalt/media/test/data/audio-start-time-only.webm
deleted file mode 100644
index f3088c8..0000000
--- a/cobalt/media/test/data/audio-start-time-only.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bali_640x360_P420.yuv b/cobalt/media/test/data/bali_640x360_P420.yuv
deleted file mode 100644
index 40d471b..0000000
--- a/cobalt/media/test/data/bali_640x360_P420.yuv
+++ /dev/null
@@ -1 +0,0 @@
-DEHKLLMNNPPPPQSQSRRRSSRRQSQQPONMLJKJGGFCAA>>:;:;;88888899989::988:9767755544211100..--++)'))(())((((''(((('())))**++,,**++,,,,,,,,++++*)))))))))))((''&&&&&&&&&&&&&&&&&&''&&&&&&&&&&'''''''(()+,,-/0224557778899999999::9999::8876677:>EJQYahlquwxxwuqmjhhghjlnnoooopopoqstwy|~~~~|xrldYNA4.,)++++,*+++.4:BOZenx~ƒ†…ƒ‚}wmgXH;/)%$$#$%%'*.178>CLS^emt{€€|zuoiaYSORQTTQSLD=60'%#$$""#"""!!#!"! #%&(+07=DKPW^cglrwxyxwuvvuuuok_WKFA??@@@@@@????==:99975543100/039<CNV]flqty{|zzvrmd]OE92,+)((''''&((()))+*-01236778=>?CFFJNU\bkptxz{}‚‚‚ƒƒ€€~}{yzvttx{€‚ƒ†ˆ‡‡…ƒ~|zxutty€„†…ƒƒƒ€|xpfXJ=4/.-,038=DNZbksx|€‚€ƒƒ‚‚~}{yvwwzz|„ˆŠ‹‹‹ŠŠŠŠˆ‡‡‡ˆˆˆ†€ypdXOHEA><;FIILLLMNNPPPPQRQTSRRSSRRRRQQPONMLJJHHHEAA@=<;<<:8:::::89999:::98888876665544211100..--++*())(())((((''(((('())))**++,,,,++,,,,,,,,++++*)))))))))))((''&&&&&&&&&&&&&&&&&&''&&&&&&&&&&'''''''(()+,-/01124557888899999999::9999::999878;=DKQY_gosyz|||ztqljkklmooppoomlkjjjkkorwz~€~~~wsk`UH<2+*++++++,,+,17?JVamw}…†…„{tk^P?3*&$$$%&(,/258=AEJRZcjr|€€zundZSOMTbpfVNE=6)#$###""#"""!!#""!!"$&+-4=CJPV\belquyz{zwuvvuuuskaVKEB??@@@@@@????>><:::755431000116<CMU]flqty{|zzwvof^RG;3.+)((''''&'(()))+,..0035689;=ABDGKOX^dkpty}~€‚‚„„††‡‡††„„‚€~}|{wsrrvyz}ƒ„…………ƒ}{yyxy~…††……‚‚{umbRD92/...038=BMXbksx|€‚€€|zwwtssvxz„ˆ‹‹‹‹‹‹‹‰ˆˆˆ‰‰ˆ†xnbWNIFA><;HHIKLLNOOOPPQQQRQSRRRRRRQPPPNMLKJJHGEDA@@>=<;:8:9899899:9999::999988776655332100//..-,,++*(((((((((((((())))))))**,,,,,,,,--,,,,,,,,,,+*++**))))))((''''''''&&&&(''('%'&''&&&&&&''&&''''(((())*,..013345558888999988999999999:99778;>CGOU^bjqv{}}~{xvpnllklmnoommkigeca^adjmrw{€‚‚‚|vqi^QB6.*+***++++++05=EQ_jr{€…ˆ††‚}xncTE6-&$$%&',/148=>BDHLU^eow€„„ƒzsh`VPN]euvo`fys@$!######""""!"""##$$*.39AGMS[`ejpsx{}|xvvuvvvsoj`TMD@????@@????@>==<;::755421/0..28;BMT\hnrux|~}|{vqicVJ>4.+)))((''(((())*+,-01134589=>@AEJMSZ_fkrv{‚ƒƒƒ…†‡‡ˆ†……„†}|zwtrppquvy}ƒƒ………~~{yzz{†‡‡†‚„}yrj\N>51-,,.037<CMW`irx|€€€}{xwtroorux„‰ŠŠŒŒŠŠŠŠŠŠ‰‰‰‡€wk^SNIFA>;:IJJKMLNOOOPPQQQRSRRRQQPPPPOOMLKKIIGFDCA@?><;;:9977999:::998:::999988776643332100......-,+*))(())(((((((())))))))**,,,,,,,,--,,,,,,,,,,+*++***)))))((('''''''&&&&(((('&'''&&&&&&&''&&''''(((()))+-/01223555468899998899999999;:9977::?DJRY^flsx|~}|yvsnljjihhiffefd`^ZXUUX\aeluz€‚‚‚~|vmbWI;4,*,******++.28ANXcoy€†ˆ‡‡ƒ~}tj[M=0)$$$%+.168;?BDCFKOXdmu~ƒ††‚}wncWOWl`ilpkdw^I+!$####""""!"""#"%(.3;@FMRY_cgnquy}|{yvvvwwwuph`TKDB????@@????>===<;::755411./..27;BJT\fnruxwz~}|wslcZN?81+())((''))(())*+-.013334679>>DINSY_aimtx}€ƒ„††‡ˆ‰ˆˆˆ……ƒ€~|yvtqoooppsuxƒƒ„„ƒ~~}{||~†††…„‚€{vofXI;3//0..025:BMU^gpw|€~~~~|{xvtqmllnrv{‡‰Š‹‹ŒŒŠŠŠŠŠŠ‹‹Š…€wj]RKGEB?<;HIJJLLMNOOOOQQRRRQRRQQPPPOPOLJJJHGGECA@?>=<;:9::888889::::::::99888865544322210000//----,+)))(((((((((((()))))))****,,,,,,,,,,,,,,,,,,,+**++*())*())))((''''''''''''''''''''&&''''''''((((((***+--.1112455678888999999::9899998769:;@ELSY`fmsvy{yvwspkhedd__^^^^_]ZWTRONOSX_fpz€„ƒ„„}xql\OB8/+*****+++,-28?IWamw€‡ŠŠˆ‡ƒ{vm_RB4*%%%(.249<@CDEDFINU_iqz‚†‡„€yri]U\ijqYIRiqcRWG! !$##"""#"""""&(-4;?EKSW]bdintyz||{xwwwwxwsoj_TJD???>>??????>>==<:997543211///06:@KS\ekrvwy{}{zzwqg\OB81-+))((''((')(**+,-/0232479:?DHNRY`dgmrv{‚…†ˆˆŠŠ‰‰ˆˆ†…ƒ€~}xvtplkjjkmot{‚‚ƒƒ€~}}}~‚…††„ƒ‚€zslbRC82/..../26;BMWaiqwz~€~}}{wusrmiiimqv|„ŠŠŠŠ‹‹‰‰‰‰‹‹‹ŠŠ…vgZNHGEC@><JJKJLLNNOOPPOOPRRQPPQQPPPOOMLJJJHGEDCA@?>=<;;:::99889:::::::::99888876543322100000////--,+*))((((())(((((())))++**++,,,,,,,,,,--,,,,,,,+++++,*))))))))((''''((((''''''''''''''((''''''(((())**++--.0103333567888999999::9899887778:;@EJPYaiouvvvtqolfc_ZYYXXZZXXYYXUOMJGEHPYcjs{‚ƒƒ€}vmcWI<2.-****+++,,07<FS`ku~…‰Šˆ‡„yrdWG6-))).158:?BDFEFFLNRYdow~ƒ……{tk`\djkeWLQi[ONV\YT&""$$$##$"""$(-4:@EKQW]^bhlqvyz||zzwwwwvutpj`SICA==>>>>>>>>>>=<;:9975432311../38?IR\fmptwz{{}|zvqi_RG:2.)))((('((*)*++,,-./13369;@FKPUZ_dhmqvz}‚„…‡‡ˆŠŠŠŠ‰‡…ƒ€zxvtokhgeegjms{‚‚‚€~~~€ƒ†‡†„ƒ„€}xri^O@71.-../226;CMXaiquz}~~~~~}{zywsmmkgggjnqx„‡ŠŠŠŠŠ‰‰ˆˆŠ‹‹‹ˆ…~uh[NIGDC@?@KKKMMMMOOOPPPPRSQQPPPPOOPOMMKKIIHFEDBA?>==<;;;998899::::::::::9988887655321111111100/.--,,++******))**(())******++,,-------,,,--,,--,,,,--++,,**++))))(((((((((((('''((((('&&&''('''((((((()**++,,,-/01233466799888888::88986655678:>BGNW_gmqoomkhgb^XWTSRUUWWXXVVUPKFB><AGQ]fow……‚€{si^PB60,,*+++*++,-49BO[ht|„‰‹‰‡†‚|tj]O>1++/479<>BCEFFGGILPX`jr{„…ƒ|ulb^`S[NUTEOSJFDcjdZ%!$$$$$$#$&)038?ELQV[^`eimqstwzzzywvvwxxuqk`RJC?<<==>>>>>>==;;<:7786432210./.37>HQ[clqtvxz}~|zxtkaRG=40,)((((())+++,,,-../146:?EIORW\afinsux~‚…‡‡‡‡ˆ‹‹Š‰ˆ…‚}{wspnkihdbcgint{€‚‚€€€~€€‚…ˆˆ†…„ƒ€}wqeYK=61-..-.148=FOX`iqv|}}}|}|}ywwsnkjgfccejqw~„‡ŠŠŠ‰‰‰‰ˆˆ‹‹Œ‹‰ƒ}teZRJHGDB@?JILLMLPNOOPPPPOPQQPPPPOOOMMMKJJHFDCB@?>====<;;::8899::::::::::9988887655321111111100/.--,,++******))**))))******++---------,----..---,,,--++,,++++))))(((((((((((('''((((('&%&''('''((((((()**++,,,-/1112335568888888899888755455669=AEKS^ehhffedb]ZURSRQRRRVVWWVSPMGA=879AJWaks}€‚…‚‚€|voeYG:2.,*+++*+++,17?KXdq|ƒˆŠˆ‡†‚|umbRA4//269=?BDGFGGHHHKPV[emu~‚„‚|xnc`UNG:C@59:>@CKT]S##$%%$$$&&*.5;?GLQXZ]`cfgkoqsuyyzyvuvuvvuph^QHA=<<<<======<<;:98777543220//..28=FRZckqvuw{}}||{tlbWK<41-)(*****)+++,,,.//258=BEKPTY^chmpsv|~‚„‡‡†‡ˆˆŠŠŠ‰†ƒ€}yuqoljgda_`cgjnty}€€€€€€ƒ‚‚…ˆ‰ˆ†…„€}vncWJ<73.//./158>FO[cjpw{}~}||{zxurojgfcb``dipv~„‡ŠŠŠ‰‰‰‰ˆŠˆ‹Œ‹ˆ…~tgYQKHGDBA@KKNNMMOOOOPPPQQQQOPPPPOOLLMLMJHFECBA???=>=<<<<;;;;::::::;;;;::::8877744432221122220000..-,,,**))******(*)))***++**,,,-----..........----,,,+++++++)))))())((((''))((((((((((((((''((((((((()**++,,+,--021122445677887777776655443568:>CJRY_bdb``^\ZWTRPPQSTTUUVVSPMGC;5124;EP\hqy~ƒ‚ƒ€€}wpj^PA6/+****(**++/7<FT`mx€†‡ˆ‡†ƒypeYJ;4369;?DFGGHHIIIHILQV_gqz}umd`TUWD;2CZ/-0AQEML8"%%%%$$'*04;AFLRV[^_bdeijjlqtvxxxssutttrmi_QH@<;:;;;;:;;;;;:98876534222100./19=DNZaiquvxz||||ytlcZM@81-+)))*(+++,,,-///26:>DHNSX^cikosu|}ƒ„„†††ˆ‰‰‰‰‰†„|wtpjhfca^]_cgimou{€~€„ƒ…‡‰Šˆ††ƒƒ€|ulaTF;740/0.026=BHR\dipx|}}~}|{wuqolgd_\\\\aiov}…‰‰Š‰ˆˆ‡‡ˆŠ‹‹Œ‰„|sg\QJIFECA@LLNNMMOOOOPPPQQQRQPPPPOMLLKLJHHFDB@@??>?>=<<<<;;;;::::::;;;;::::8877744432221122110000....,,**********(**))***++**,,,,----............--,,,+++++++***)))))(((())))((((((((((((((''((((((((()**++,,+,--..00112445778877776655443333469=BINUWVWZ[[[ZZVUSSSSTUUWXVUROIC=60--27@KVcmv}‚€ƒ€zsmcVI;2-***+*)*++.29DQ^gt}ƒ‡ˆ‡†ƒ|sk_QC97:=?CEEGGGGIIIIIIINW`jsyvhkpd]][MEBWY(+4<;7=DK'%%%%&(*05:@GLRW\]`bddgeefilpsvvvssutuurmf\PG@<999:;;:;;;;;:9::765342220//./27<DNXbiquvxz||||ysnf[NC82+,,++*)+++,-..0139=CHMQW\`fjnqvz|~€€‚„„†††‡ˆˆˆ‡†„}wskgea`\\\^behknptz~~~}~ƒ††‡‰‰‰ˆ†……‚|ulaTF=864200249>FLU]emsw|}|}|zwurmjeb_[YYXZ`jmv~…ˆ‰Š‰ˆˆ‡‡‡‰Œ‹ŒŒˆ‚|sg]RLJFEC@>MMNNNNOOOOPPPQQQQQQQOONNMMKHIGDBA@@@????>=<;<<<<<<;;;;::::;;::98997765432233221110.011////-,,,,,++******++++****++++,,----//-.//.-....---,-,++++****)((())))(((()))((((((((((((((((((()))))))***,,++,,--///33454556666664455443211257;?EKOUVUY[[\[ZWWUVVVVWWXWVSOKF=71,*+.3;FP]gqxƒ€~{wpi]PA3.**)**))**,29@KWdny€‡ˆ‡†„|tmeWJB?>@CFGGIIJJJJHHFFEGMWcmw|}skei`ed`VA<C:1*2.,0<Ab2%%&&(-06:@FLSXZ^_bcdddbacdjmrtsttssssspme[PD=988889:;:::::998875542221/00/016;EMXaipuvxyz{||yxqh_SD:3.--++,,,,-../139=AFLPV[aejnrvy|‚„…„…‡‡‡‡‡†„€|{sjgb][YZ]_cehkmpsvz|}}}}~ƒ„ˆ†‰ŠŠŠˆ‡…ƒƒ|uk`SF>98541147=DJSYafnuz}~||{{xspjga_ZXSRSV^hmw€†‰Š‰ˆˆ††‡‡‰Š‹‹‰†‚}sh\RMHGDCA@MMNNPPOOOOPPQRQQQQNNMMMMLLJHGEBA@???@@>=>=;<<<<<:9;;;;::::99::98777765432233221110.0111///-,,,++**++****++++****++++,,--..---.//.-....-----,++++++**))))))))(((()))((((((((((((())(((()))))))*****++,,--/0100143556666664444332100146:>DINQUVZ[[\\\YYXXXXWWZXWTRMGA94.*)+-07@KWalu}‚~}ytmdUG:0+*********07=ES`jw~ƒ††…„|woh`TJEBDEGHHIIJJKKHGBBBBEP[gttoiflgegeXJC@G9123,9<EIcK%%(*,18;AGLRVY^_aacde`]\\^dhnqtutsssssojdZLA=;887789988888776665553221/0/..26;DNYbipuvxyz{|||xri_SI<71//----..//137;AFKOU[_ejnruw|~‚‚„…†……††ƒƒ~zumg`[XYZ\_behkloqtw{{}}|~~ƒ†‰‰‰ŠŠˆ‡‡‡‡„‚|uj_RE?:965547;AHPV\cjsx}|||zwsmh`[XURPOOS\fmwˆ‰‰‰ˆ‡††‡‡‰ŠŠˆ‡…{sh^RMHFCB@?MMOOQQQPOOOOPPOOPPONLLKIJIGFDBAB@@????@@===<====<<;;::::::888898776665443333222022022200/..-,,,,,,++**,,+*****++++,,--.........///....-,---,,,++++****))))))))(())))))))(((((((((((((()))')))***+++++,,---.//1231455665542433121./2569>DHLQUX\^^]^][YYYYXWYXYTSOIB=6.+(()*.4;FR^hqy€~}{vph\N@4-*)**)****.6:BP\hq|‚………ƒ}{undZQKFFFHHIIIJJJIGD><;=@JVctihigcfd`^B3LSX<@RSD<:CHXfU<$,08=BEKQW[]dfeee`\\WUVY]djqtvtsstrplibWJ@;6666788887777666654331//10//-/14:CMV_gotwwy{{{{|yslaVJ=740/////./025:@EKQW\`ekmrty{~~~~~€€‚ƒƒ„ƒ„„ƒ„ƒ‚€zvqh_YVVY\_cfikmnoqtw{{{{{}‚„ˆŠ‹ŒŒ‹‰††‡‡ƒ{tj^RIA<;:888;>ELSY`fmtz|~}}|{wtolc]VSOMIHLQZemx‚‡ŠŠ‰ˆ††‡†ˆ‰‰‰ˆ‡„~yqj_TNHECA?>MMOOPPPOOOOOPPOONNNMLKKJIGFDBA@?@@????@@?>=<====<<;;:::::::99:877766654444333223222211000/.-,,--,,++++,,,+****++++,,--.........///....-,---,,,++++*+**))))))))(((())))))(((((((((((((()))')))***++++++,,..-./0101222333322321110./2569?EJNTXZ\__``^\[[[[YXY[XVQLE=6/*))))),07ALXbnu}€€~~}ysmcUI90*)))()****07>IWdnw~ƒ„„ƒ|wqkaXPIGGHHIJJJJKJE@<969;ES^pookie`]YSMIJLS``__XKA8+;Rnn5(7<BFNYY[`liTMVa[[aRPPUZaipuutstrponh`UI?856656776666665544332220///.../04:CMV_gotwywy{{{|ysmcYL@:62111111348=DIPT\`fimruy|~}}}}€€€ƒƒƒ‚‚‚‚|ytld]XWY\^bfikmooprvy|z{{||‚„ˆ‹‹ŒŒ‹‰‡‡‡‡ƒ{tj^PGC?>=;;>@CJQX]ejqv{~~}}}{vrmf`YRMJECCHQ\eq|„ˆ‡ˆ‰ˆ†††‡ˆ‰‰‰†…‚~wsi_TMGDB@@>NNOOOONNOOONPPQPNNLLJJIHGFCA@@@@?>?????>??>===<<<<<<::;;::;;:9887776565233443344332221110//--,..--,,,,,+******++++,,--........00//....,---,,,,,,*,+*))))))))))))))(())(((((((((())(((())**))))*)****+++++,,-/////0111122122110/.01149<@GLRVZ^^_`aa`^]]][YY[ZXSNGB:3+()))))*.3;FS^itz~{wog[N>3*)))******/5<DS`lv|ƒƒƒ€|xuog\RKHHHIKKKKJHEA<82216AP_aniRhdZTRGQQJQYabaa`]U?4<I[rr:6>ILcmhcmwJOKTZ[YWJIKNV`iquwuwtssqkh^SF<643344554444555553221200/.,.././4:CLU^gnswwzxyz{||todZQC;663222327:@FMUY`ekotwz|€€~~}}~€€‚‚‚€€}}{xtphd[YZZ]afilooqrrtvy|}|||{ƒ…‰Š‹‰‡‡††ƒ{rj\PIDBAA?AAFIQV]bhouy}~~}{xtpjc[SLFC?=?DO[gs~„ˆˆˆ‰‡……†‡ˆ‰ˆ‡„‚}yskaUMEBA?>>NNOOOONNOOOOPPONLLKKJJHGDB@@@>>>>>?????>???===<<<<<<::;;::9988887776565565334455332221110///.-....--,,,+++****++++,,--........00//...-,---,,,,,,,,,*))))))))))))))(())(((((((((())(((())**)))))())))++++*+,---.//011111101100//.0126:=CGOTY\^`abcca___\[[ZZZUNKC=5.*'(((((),07AMXdnv}€}~}yslaTE7-*))))****-39BM[fq{€‚„‚€}zupi`WPMJJIKKKJIFA=84/-,1;QirsmM]aWUONPMGBNVb`XUX]T=9BT^qZLO[m~w€jh[Ybmpwtd\P@AJT_ksuwvvtssqkh^SF<6422332222333333432210/-..,--,,-38@HS\hoswxxyyz{{{tni]SG>8765556:?DJOW^diotxz€‚€~}||}}~~}}~zywsqngb\YY]acglmprrrsux{}}zz{|ƒˆŠŽŒ‡‡‡††ƒ{rj\RNHFFFEGIKOW^cflrx|~~~}{{ytmf^XOGA=9:<FR\hw‚†ˆˆˆˆ‡……‡‡‰‰ˆ‡…‚€{vrkaUMEA@>>>OONNOOOOPPOPNMNLKJIHFFFDBB@@??>>==>>??@@>=>>====<<<<;:<<;;;;888777665555555554554432222210000./0.--,,-,,,,,,+***++,,------//0001....-,--..---,,,,,++****))(((((((((())**))(())(())(((())))))))))**++++*))*---....//0111100///0./0137=AFLPVZ^`bdeddabaa_\[ZYYTOF?9/*('('&&''*.5<HR]gqz}€}zvpfYL=3,****))**,16=IWcmw~€‚‚|zvulg^UOKMMMNMJGB>:41+**.9Pq~xe`\GYYUQRNLMHQVYLL\_KGA*FL]TO[nto€smhmlepz‚qj\F=KUalswwxxvtsqng]PD:310011112211100111/0/----,-,+,,028>GR\enrvwwy{{{zzwrk`VH@<96689;BGLS[ahmru}‚ƒƒƒ~|}}|}~}€~}}zzywurpmgb]\]_beinoqrrstvy||}zz{}ƒˆ‹Ž‘Šˆˆˆ††ƒ|rh]TPMKLLKLNRX^beknsx}~|}||ywrle]QH@:777>GSbny‡‰Šˆ‡†††††‰ˆ…„ƒ{wslbVLFA?>:9OONNOOOOOOMNMLKJJIIHFCCA??====>>>>>>??@@>=>>==>>==<<<;<<;;;;988766665555555565554444442211100/0/..--.,-,,,,,+***++,,-----.//0000....----...---,,,,++****))))(((((((())))))(())(())(((())))))))))**((((**)*,,-....//00000////--/01459?CINTZ^`cefffeda``_[ZZZWQLB<3-*('('&&&')-18CMYcmw|~€}||xql_SD6-**(())***.49DR_jr{~€‚€~{yupjaXQMLLLLKGC>:5/+('+/5Ts||{o_VHFVVQU[RKT\[jRIZdeZGBFKOJXf_lmqo€{lgl_[pfgKU@HWdnswwxxxwvsng]PD:20//000000//000000/..-,,,,++*+-.17>GQ[entxxxxyz|zzwqkbXNE?=98<@DHOW^eipty~‚ƒ…‚‚€€|{{z{}|~~~€~|zyxvvutsrpnhc__`adgjnpqrsvvxz}|{zz{}ƒˆ‹ŽŽ‰‡ˆˆˆ†ƒ{sj_XTSPPPQRVZ\bfjoqvz~~}|||yvnh`YND<8447>IVdpz‚‡ˆˆˆ‡…††ˆ‰‰‡„„‚}yxqlbVLE@>=:9ONONOONNMLKMLKJHIHEDCB@?;;<<:<<<==>>>>?@>>>>====??==<<<<<;;::877777766667754576655554443211100100/.-,-----,,,+++++++,,--.//////....---.....-,,-,++********(*((''(((())))(((('((())))))))(((((())))))**)))))*++,,.///0/00..//.../166=AGLRX]`cefgijgfca_[ZZXWVPF=8/*('(('&&&''+.5=IT^iqy|~{||}xpe[J;0+)(())**)+28BLXdow}|{{zvsne[TNLJLJGD@;50)($"'+6Ybtwxo`SLJZ[TUa_STZ\^]ST^ldTJM^NQ`ikurfko[IGTV]RXSQRMKVdntwwwvwwvskh\PC92.----.-..////.....-..,,,,,,*+-/17>GPZenquxxxxy|{{xsng\OGB?<=BHMRWaglrw|€„ƒƒ‚ƒ€}}zzyyyz{{{{|{zwrsssrsrpnifb``deiloqrsuvwz|}|{zz{}€„‰ŒŽŠˆ‰‰‡†ƒ{slb\XXWUUVX[^agloruy|~~}|{{ytnf^SJ@83137@LXgs}„‡‰ˆˆ‡†…†ˆˆˆ‡ƒƒ}|xurkbVLC?<:99ONNNMMMMLKKKJIGFFEECA>>=;;:::;<<==>>>>?@>>>>====>>==<<<<<<;::99977776666777788665555444322211110//..------,,,+++++++,,--.../////...---.....-,,-,++********))(((((((())))((((''(())))))))((((((**))))**)))))*++,,+-/./...--//./.137;BGLRV]_cfgikkjgfca_][[YWRIC;4-(''(&'('&'((,19BNXcmvz|~{||{wrj`PB5,)(())**)*/5<GUcksz~}~}}{{yuph_VQMJIIEA<70*&#" $*;_afkqmeLFU[\VTX[YOXRQZX^`gibR@VNDe~ynf_V^K:8=QVHPSGFGKVdouwxxwyywuli\PC90-++++,---....-----,--,,,,++**,-17>GPZdmquxxxxwzzzwtoh^RJE@CFKPW\ahmtx}„…ƒ‚‚€~~}}zzxxwyzzzzzxwusqqqqrrpokfbbcdfiloqrsvvwz}}|{zz{}…‰Œ‹‰‡‡‡†„‚{slb^ZYXXXZ[]`gkprsx}~~~}|{{ytle[QE;52239BP_jv†ˆ‰ˆˆ‡††‡ˆˆˆ‡ƒ‚{xxvslcVLC?;999OOONMMNLKKJIHGFFDCB@=<<;77998:<<>=>>>>??>>??>>>>==>><<>>=;;;9887777766665678666646555554322102220/.//,-,------++,,++----../0....///.....-/-,--,+****))))**))))**(())))))))(*))(())))))))(((((())))))++++++**+++,----....../000227;?FLQU\`acgjjmmigfca^[[ZWSOG=70+((('&&'&&())*/4<GT^hrx{|{{}|ytmeWH:0))))))*)).28BN\how|}|}||{zxtmbYRLIIFB;63+&#! ##(;MUhfc\Y2@Z[WR]QPZVZUP^[W^`jeW4ONNoordbgXZWM8=GCQWD:6?M[gpvxxyyxxvtni_OB80*++,+++++**+-,,+***)+,,**+)++--07>FPZclqwwxxxxz{{xvpi`VNGFHNRY]dipuzƒ†…„€€€€}}{yvvuttuuwvvvwurqqpqqrsqokhdccdgiloqrsvvxz|}}{zz{~†Œ‘‹‰‰ˆŠˆ‡†}vkda^\[\\_abeinsww{}}}}|{{zwrleYNB94224<FTcnz„‡Š‰ˆ‡†…†‡ˆˆˆ†ƒ€|yxxvtneXMC?;99:OOOMLLKJKKIHGFEEB?>;:::978999;;;;=>>????>>==>>>>==>>====;<;;:9887777666666778966675555543331121100010---------,,--,,----....-...///.......-,,,,+****))(())**))**))))))))))))))(())))))))(((((())))))++++,,**++++++--....../00237;@EKQVZadeikkllijifc`^[YXVPI@91-*)(('&&'&'&&()-27ANWbnuz{|{{}{wqi^N?4+*())))))*05=JXalt{|}~}{{|zuof_UNJFC=72,'#!$""#>`^RV_^\URRUZ\]T`\LKZ_^gSJ[c`\VFWKRg_dcgeeedQ4:HECB=/9CP[hqwxxxxxxvtnj_PA70****)*+**++,***))))))))(()**+,.27=EQ[cjruwxxxxx{{yupjbXQMLRV\`flsw}ƒ„ƒƒ‚€€|zywtrpoprtsrrtvutppopqrrrmjebbcdgiloqrswwxz}|{{zz|}†ŒŽ‹‰‰ˆ‡ˆ‰‡ƒ}vkdb_][^^acfjorvy|}€}{{{{yvpkaUJ=73128>KXds}„‡ŠŠˆ‡†…†‡ˆˆ‡…~zyxwvtneXLD=:89:OOMMMMKIHGGGEDDA>=;:9887678:;;;;;<====>=>>>>>>>><>=====<<<;;::9877776677777777888876545543332211011//..-----,,------------...-./../.----..-,++,+**))(())(&(&)(**))))))))))))))(())(((())(((((((()))***++++++++++++----....00228<AGKQUZ_dfhkmlnnlijda^]ZWWSOE<5.**)((''''''(('',/4=HS^jqwzyz||{yrpdUD8/+)(((((()/3;GT`grx{}}}}|wsk`UOEB>94+)$!!#! /eg[FLd]VSQUURDN_iRBNXTW^VY[[XUUSPBHW]h^fcfk^<2EC=DE71:CQ\hqvxxxxvvvtoi^O@6.)''''())))(*)***)((((%%'()**+--16>ENWbkqtvxxxyz{{xvrnc[VSUX^dhms{~„ƒƒ€~~}ywwurnmllmklmpstrqonoqrrqrliec`befhlnoruwwxz}{{zzy{}‚‡ŒŽ‹‰ˆ‰‰ˆŠˆƒ}vleb_^^_`cfhlotvy|€}}yzzyvtmg^OD;6433:@O]iv€‡‰‹‰ˆ‡†‡‡‡ˆˆ…ƒ{wywvvtogYMC=989>OOMMLKIHGFEECBB?;:998787678:;;;;;<=====>>>>>>>====<<==>>==<<:;:9888877777777778866787655554333331110//..--++,,------------....//../.----..-,++,+**))(())()**)&))))))*)))))))))(())(((())(((((((()))***++++++++++++,,--.../0158<BGLQWZ^cgilmpqpqmkgc`^]ZWTOH@93,)*)((''''''(('')-18BNXenuxz{{zzzvqgZI=/*)(((((((-17?MXdowz}~~}|zuof[PGA:4/)&"!!! !7YghZ`]c_HMWTROQ^lT5@IKGS[^\WOFEEBHKJV`N]``e[QGDTG9((3:CQ\hqvxxvvvvusoi^O@6.)''''''(((())**)(''''%%'()**,//38>EQWbkqtvxwwwy{{{wunia]\]`glpsw}‚ƒƒ„€~}|zyutpokjiihjkmpstrqonoqrrrpkhca`bbdgjlmotwwy{|{zzzy}~ƒˆŒŽ‹‰ˆˆ‰ŠŠˆƒ}vledbaaabehkosvz{}~~}|yzzyvsleYME;6435<DSamy‚ˆ‹Š‰ˆ‡†‡‡‡ˆˆ…‚}ywvvvvtldYMC=89;@NMLKJGIHGFDB@B==:987766667889;::::<<<<<<==>>>>>>==>>==>><<====;;:9999788889999886788766665443333332100..--,,,,,,,,------........///....--.-,,,,++))))))))*/28-')))))**))))))))(((())))(((((((((()))*+*+,,*++,,++++,,,-//00159>DIKQW[_ceikmoppprmhea_\ZXWSLC<5/)('''''''&''&&(''*/5<IUaisx{zz{|{xskaQ@3+((('''''+.6=IUamuy|}}yrj]SE>6/,&# !! !#Ohmhcab`_SPSX\ZdTEC=DLP[`VPV?BEBEFHPQPOZW\_TIOU\O,.49CP\hquvvuuuuvtnh]N@4,('&((%%''&&))(()&%%%%&&&'(*,.1148?FQWaiosvxuuwxyzzyvsmgdcdhlrv{ƒƒ‚€€€}}{zxuuqomkgdcfhjmorttrqmopqrqpmkgeaabbcfiimoquyyzzzzzyy|ƒˆŒŽŠˆ‡‡‰ŠŠ‰…}vkffdccdfjkmouwy{}}}}|z{{zwqkcXMA95237?IVdo{…‹‹‹‰‡‡†‡‰‰ˆ‡…€|xuuuwvtph[OB<7:=EMLKJJHGFECCB@=9966655444666678:::9:<<<<<==>>>>>>>>>>>>>>=<====;;::999888889999998777776665544333332100/---,,--++,,,,,,--........///....----,,,,+)))))))))*6CC4'())))**))))))))))(())((''(((((((())*++++,,*++,,++++,,,-//0258>CGMRV[`dfikmoqqppokfc`][XUTOF?81-*('''''''&''&&''')-28CR\fpuy||{||yuodVF6,((('''''),3;CQ]juy|zum_QF<3-*%"!!! !5Wmy\^ba^YXJKPZb[]YMBHFGKYWPPYC4:KORJHHFJLPPPLN\hVO)-5:DO\grvttuutvurmi]N@4+'&%%%%%&&&&()(('&%%&&&&()*,.03459?FQXajosvxuuwxy{{zxvrmjiiorw|€ƒ„‚‚~}}zxwuspplieaabfhknqrttqpnopqqpomiebaabccefhjnruyxz{{{zyy|ƒˆŽŽŠ‰‰‡ˆ‰‰‡ƒ}vkffddddfilnsuwy{{{zzyyz{yvpjbWI>85348@M\iu‡‹‹‹‰‡‡†‡‰‰‰ˆ„yvtttuvtog\QE<9=CJONLIGFFEDA?=<9666654434665557788::;<<<==>>====>>??>>>>??>>==<<<;::::::::99::::998899757776555555332200..--++++*+++++,,--------../..////.---,,,,+**))))**))2:9-)((((((((())))))(((()'(((((((())((+++,,+,-,,+,,,,,,,,.,..0237<CGMRW\_ehjmnpprrponkgc^[ZWTPJC93,)))''&&''&''''&(''&+/5@MXcntxzz{||{xsj\L<0)'&&'''()-29BNYenw|~€€‚~wqgVH;1-*%$#!!##\c_uQ>TJXdUA=O@LTSPNQ:;HMKHHNJUY\^behhaJBKFDBMNLYfVW+,2:EQ]gqssrrrstusni^OA4,(%%$$$$$$&&&'(('&%%'''()+-./1247;@FOV`hosuwuwxx{}}|yxvsqqrwy~„ƒƒ€€‚€~|{{xwuqpnkgc_acfhjlpsstsqpoooopnmkgca_``_acefhlqtx{{{|zwxy}€„‰ŽŽŠˆˆ‰ŠŠ‰ˆ…|tlgfeeeefjknqrtyz{{zyyyxxxsmg`UG=9767;DR`lx†‹‹‹ˆ‡‡ˆ‰ŠŠ‰ˆƒxussttttqg]QE=>BGNLKJGGFDCB@>;97553333323455667988::9:;;==>>==>>??????@>??>>==<<<<;:;;<;::::::::998876778876666655332210..--++++*+++,,,,--------../..////.---,,,++**))))))))**++)((((((((()))))))(&)()))(((((())))+++,,+,-,,+,----,,,././047:@EIPV[`dgilnqrrropnlhda][YVRLE<6/+*))('&&''&''''+5</&(-2;GT_kty{{{|||{unaQB5+'&&'''()-1:ANYantz~€€€‚zsiZJ;/(%&%$!!"7uYKB<;KOVaT?12;@?EBGJA8FIKEIEN[^`bdeecZ>=ICEB^NCP[\J(+3<EQ]gqssrrrstusmh^O@6,)%%&&$$$$%%%&&&&&%%$%')+,/01346:>CIOXaiosvxxwvxy{}~}{zwwwy}€ƒ„„ƒƒ€~|{zxusoolgb_^_acgjlorssutqpoooopnokeba_^]_``ddglqtwxy{|zwxy~†ŠŽŽŽŒ‹ˆˆˆˆˆŠŠˆ‚{rlgeeeefgghmpqsvxzzyxyyxxvslf_QG=:99:=FTbmyƒŠ‹‹‹ˆˆ‡ˆ‰ŠŠ‰ˆƒxussttttqg]QD>AHLPLLIGFECA@><965432212223344557888999:;;<=>>>>??????@@?????>?>====<:;;<<:::::9::99998677777568774433211/---,,+++,,,,----------.......////.--,,,+***)))((((((+5B<,'''(((((((((((()((((((((((((())++++++,++,,,,,------./..0159>DHNRY_behklopssoommkgb_\YXSOI@81,*))*''('''''''&+4-'''+.7COZhpxz|zz||~yqfWE7,('&'&'(,/49BKUaksz}€„}vl_O;-$$###$#%<kL;453=LLbbaUB='799:BA=GKJLPTX]_`adbc^T<5@CEEjmMICDH105<FR[gqsttssttttmg^PA5-)%%%%$$%%$$%%%%%%&%'))*,.023579:?EKQYahosvxwuuwz}}~~€€‚‚„……„‚‚ƒ‚€}{zwvqnnkeb``abdhjlppruutrrpopppnlmjfb_^]]]\^`bgjpsv{{{{zyvz~‚‡ŠŽŽŽŒŠˆˆˆŠŠŠ‰†{rjfeedcbabfikosvwxwwwxywwtpjd]PD=:88<BJXer|…‹‹ŠŠˆ‰‰‰ŠŠŠŠ†‚|wtsssttsqi_RGCFJPVKIGFGDC?<:9754321101002244444788889:;;<=>>>>??????@@????@@?>====;<<;;;;::::9::99997679887877775432210.---+++++++++,,,,------......./---,--,,++**))))(((())'61**'((((((((((((((()(((((((((()))*+++++++++,,,,,----..////137:AFMSX\`dijmnprqqpnllhd`][XWQKC;5.+)(()))'&''''&&'%$%'('*.5?LVcowz|{zz||ztl\K</('&'&'*+06:AJT`jry}ƒ‚€yqbR@1(#$$$$$'BnY>6;58AQbioqhP=F>46CGFPNMNVY[^`abb`]XTR5EGGBNaMJU]K.16=FR]iqsttssttttlh]OA5-)%%%%$$%%%$%%%%%%%&'*+.002457:<<AEKQYahosuyxwvx{~ƒ„ƒ„„„‡‡†……„ƒƒ€€}|yvsrmlifcaabbcfgkoqrtuutrpooooonlkhd`^]\\ZZ[\acinsv{{}|ywy|€ƒˆ‹ŽŽŽŒŠˆˆˆ‰‰‰ˆ…€|siedda`_^`cfjosuvvuuuuwwwtpkcZNE><;;?FQ^iv€ˆ‹‹Š‰ˆˆˆ‰Š‹‰Š‡€zwtsssttsqiaUKFJPVZKIGEEC@;9865422100////11333356897889;;=>=>????@@@@A@@@AA@@?>=====<<<:;<:;<;:::99:97788888877775533210.--,,++++****,,,,,,----....,./.---,--,,****))))((((**'&(((())((((''''(((((()'((')))******+++++++++,,,----....000036:>DJLT[_aeijmonooonkjjfb^\[XTOG?70+*)))*2/((''''''&&&%$&#(-1;HUamuy||zz|{zun`P?2*'%&()*/39=AIS]fov}‚‚ƒƒ‚{tiZF6,&$##%(([kX<6<BAIYentwtVKHCADLPMGCLTXZ]``cba]XTNF>BACDKZTPLL9117>HR^jrtttusttsrli_QB5-)%'''%%&&%%%%&&%&''(,..01356:<>@CHMR\bhosvxyxxy{~„‡ˆˆˆ‰‰‰ˆ‡……„ƒ„€}|yvtpliidb`aabcefilnqstutrqooooponlieb_][[Z[[]]^bglrvz{|}zwz}†‰‹ŽŽŒ‰‡‡‡ˆˆˆ…‚~vnhdcb_`\\`ehknsuuuuuusuuusoj`YOD?>>?EKVbmvˆŒŠ‰‰‰‡‡‰ŠŠ‹ˆ„yvsrrttvurleVOJMT[_HHFCA?<98655222100////01213356777889;;=>=>????@@@@A@@@AAAA?>>>====<<<;;;<<;:::99999999888877775544320.--,,+++++**+,,,,,,----....,./.--.---,,****))))(((((())''((((''(('''''((((()'((')))******+++++++++,,,--..//..000136:AFLSW\`cgikmnlljjiihhc_\[[VSLC;4-**)))**)((''''''%&&&$&%(+.7CQ]hry|}{{||{vofWD3)'%&(*.26:>CJR\elu{€‚ƒƒ|ypaO>0'###$%)DKF8??=>JZdoswr[TNA>ABMKEPTYZ[^``a_\XTMGB:8MB@GUZZVE,247>JT^jrtttussssrli^PB7/+('''%%&&&&%%&&&'(*++.03457:;>@BEKQT\bhosvxwwvw}€„‡ŠŒ‹‰‡†…„ƒ‚€|{vsokhfb_`bbaceehklpqstutrqoonnomnlieb^\ZYYYXYZ\`glrvz{}{xwz}†‰‹ŽŒŠ‰‡‡‡ˆˆˆ…€zslgdb`^^\\`eiloqttssssstvsrnj`XNGC@?BIO[dpzƒ‰‹Š‰‰‰‰‰Š‹‹‹ˆ„yurrsttuusmd[SOQY`dHEDB@=984553101100..../11123566699::;;==>>????@@AAAA?A@@A@???>==<<======<<;:::::::999977997766555310..-,++++++**++++++---.--+--/--,,--..,,++**))))((('''((((''''''''''''''''''''(((((())**+++,,,,,,,--,----.0300../00047<CINRW[_cgiklkiigggfeca]\[YUQI?80,))))(((((('&''&&&&&&%%&')05?O[epwz{z||||xri[K;-&'))-157;?DKOYbkrz~€‚ƒƒ}uhVE6+&"$#$(@NJ>799<JUbqtwtlNCB97>FFPRW[]^_a`^[WRLF@852TC;GPYX\@0269@KVaksuuttstttrlh_QA60,)('''%''&&&$&&'(*,-.0357:;==BDFHOSX^djosvwyyy{„†Š‘‘ŽŒ‰ˆ‡…‚~}ytqnjhc_^`_aeefghilkoqrtttsqoonmnmlieb^[[YXYXWWY\`flqvy|}{{{z~†ˆ‹ŽŒŠˆ†‡‡‰‰…‚}wqjfc_^^\]^afinprtsssrrstttrog`VNHECCFKU_gr{…‹‹‹Š‰‰‰‰Š‹‰‹‰…~zvtstuuutrke_WVX^diGEC@=9864332200000..../11123566699::;;==>>????@@AAAAABBBA@???>==<<======<<;;::::9999::77887766553210..-,++++++**++++++,,-.---./---------,,++**))))((('''''((''''''''''''''''''''(((((())**,++,,,,,,,--,---../0..../11469?DKPTX[_cghiihffeedca`^^\[XSNE=4.*)))))((((('&''&&&&&&&&&'+.2<IVclwz{zyy{|zuk^N?2*))+/379>@EKOWahpx~‚‚‚ƒƒ~wn_N=/'##$%&BuwD&)3:HTcpvxunK;./27.;VYZ]^`aa][VRLFA93.-7?EQOOL_M955:AJUbluwvuuuututlh_QA60,)(''''''''&'&'(*,-.03579<=?ADFHJQUZ`djosuvxz{€…ˆŒŽ’““’‘‰ˆ‡„€~~yvrliea`]^`_accfghillopqsusqpppnmnmkgea]ZYWVWTSTTY\djqw{||zyyz~†ˆ‹ŽŒŠˆ†‡ˆˆˆ…€zupfc`^]\]]^afjlprsrppooprrrpme]TMJGFFJNXblv€ˆ‹‹Š‰‰‰‰‹Š‹ŠŠˆ„}yvtstuvuusnja[Y\`fkFCA=:86743111./0//.....011344568::99;;==>>????@BAA@@BBAA@@????>>========<<;;;;99:998998877666644111/---,++**+++++++++++++-----,.--------,*)**)*)))((('((((''&&&&''''&&&&&&&&&&&&''(('(**+*++,,,,,,-----.--..--...//0368;@HNSTY\_behecbaabb``__`^^[WRKA:2,*****))((((''''''&&&&&&%%).3:DR`lswzzzyy{ztmcSC4+**-257<?CFJNU]gnv~€ƒ‚ysfVC3'%$##"5id,#'/:CSbntusk`6%%*+7LYZ[_`_a_YUQKE=71/.338HPQOUNRW45:ALYcmuwyxuutwtrok`RB91-***(''''''''()+-/012468;=?ACFIKNSW[aflptvwxz}‡‹’••—–“’Š‡†„€|ytolgd`\\^``acegffgikmnprtusqqoonomkifda]YVUTSTSTUX\dkpux{zxxxz~‚‡‰ŒŒŠˆˆ†ˆ‡†„~ysleb`^]\[]^bejmpqrrnnnorssuqmg_WOMIGINU\fp{‚‡‹Š‰ˆ‰‰‰ŠŠ‰‰‰†‚}xusttvvwwuqld]]_djoCA<:986543111...//.....0111245688899;;==>>???@@BAABBBBAA@@??????========<<;;;;;;:998998877666644111/---,++**+++++++++++++,----.---------,*)**)*)))((('((((''&&&&''''&&&&&&&&&&&&''(('(**+*++,,,,,,-----..../..///001269>DINSW[^^bedb`_][\\]]_```][VOF>6.******)))(((''''''&&&&&&%%(+28BO\iqvy{zxxxzvogXF8/--/38;>@DGJMT\dlv}€‚ƒ}vl]J8+&#"" 3L="&/48DRantwxZ=$21?MUZ[[_`a`]YVQLE?80,-/20.?MQRTMII65:AMZcmuwwwvuwwtspi`RB91-**))(((((())),,-013468:;?ACEJMORW[_cglquvwy{~ƒŠŽ“–—˜—–“’Š‡…}ytnjgc`\[\^``acfffgjklnppsvusqqooolljfd`][WVUSRQPQRS[aiouy|ywxxz~‚‡‰ŒŒŠ‰‰ˆ‰‡†ƒ}vpga_^]\ZZ\_dhjmopppnnnorsttqkf^VPNLKMRXbkt}„ˆ‹‹‰ˆ‰‰‰Š‰ˆ‡‡…}xvtuuvvwwurngaabgmr@=;:8865432200..--..../111225677::::<<==<>??AAAAAAAABB@@@@??????>>>>====<;;;;;99:9988788666655554110-,-,****++++++,,++,,,,,,--,,,,,,,,,,,,))()))((((''&'((((&&&&&&&&%%&&&&&&''''''((()**++++,,,,,,----.///00..////2048;AGKOUW\]_bba^\\[[Z[]]`aa`^YTLD;3,******)))('&''''((''''&&&&'*/5?NXeovxy{zwxwtoi[M>411269>@AEGJMSZbhsz€‚‚ƒƒ„„xreS?0(#$.+10&$&226CQ`mty|iIJ[[YXXY\_`__]YUNJD=70--,.--.^SRONORI47<AOYdnvxwwuuvvwuokbRD:2-**))***'(()*,-.014579:<?BEHILPQSZ\beimpsvy{‚‡Ž“—˜™˜—•”’ŒŠŠ‡„€{unida^\Z[]]__bddefgiklopqttsrqpoonnkifb^[YVUTQPPOOOSYaiovxzzyxyz~†ŠŽ‹‰‰‰‰‰ˆ‡{vmb^^][[[Z]adiknqsqpoomorsttpkd]VQQOOQV]fow†Š‰‰Šˆ‰‰Š‰‡†…„‚€|yvutvvvxxvuqjecehls=::86555432200.---..../111435677999:<<==>???AAAABBAABBA@@@??????>>>>====;;;;;;:::9987888877755435322/.-,****++++++,,++--,,++,,,,,,,,,,++++)))+**((((''&&'''''&&&&&&&%%%%%%%%&&&&''(((*****+,--,,,,----.///00//00/0336:?DIMSVZ\]_aa^\ZZYYXZ]_bbb`]XRI?61,******))*))'((('((''''&&&&'*-3;HT_msxyyxwwwurjaQD7337:<?ACBEHLOV`gpz€€ƒƒ}tkYF5+&&=6&%%!%+/6CQ`mtxzzxrme][Z\^_`_\YTPJD=5.,+,----7uXQNLJS?/6;DQ[cmuwwuvvvvwupj_RD:3.++*)**+*++,,--/024689<>@DGJKNRUW[_cgknstvx{~„‰”™™š—–”“‘ŒŠˆ†}uoid^[YYZZ[^__acdefgiknoqqttrqqpoonnjhfb]XWTSRONNMLNQWahpwzzzzz{{‚‡‹‰‰‰‰‰ˆ…€ztlb^[ZYYZZ]afjjmqpqonnmoqrssold]XSPPSUZaks{‚‰ŠŠŠ‰‰‰‰‰ˆ†…„ƒ€|yvuuuvvwwwvqjhgikos;:876644322000.-....../12233566699:;<<==>>?@BBBBBBBBBB@@???>>>??==>>==<<;:;:::9999888989::99:8997975520+*)**+-+-,,,-..-,,,,)++,+,,,,,,,,+*)**))(((((''&&&&&&&&%%%%%%%%%%%%%%&&&&(((())*****+,,,,,,--...///////001235:>CGKOUXZ[_`_^]ZYYYYZ^accdb`\VPE<6/+******))**))))('((''&&'''''(+09CP]iryzywwvwxvmeWH=679;>ACCDFJMMS^flu|€€€€‚ƒ€zo^M<0'&#"$%$$$*/5AQ^mv{||{vnhc]Z^_`a]YUOID=6-+*+-....<jfPQNT^X87>DP[fouwuvwwvvwuoh`QE:3.-,++,,,,-,+,-.123569;>@DGIKNQTW[^beimnrsvx{„‰‘—šš˜—“‘’‹‡…‚ytmd_ZXWWWYZZ]^_adefgjmopprsssqpoponmhhea[VTRQPNMLIKMOV_hptyxxwxxz„ˆŽŒŒŠŠ‰ˆˆ„€yria]ZXXXYZ]afimproonnonquvtsojc]XTRSUY]gmu~…‰Š‰‰‰‰‰‰‰†„ƒ‚~~|yxuwuvvwwwtroiginqu:9876654321111.-....../12233566699:;<<==>>?@BBBBBBBBBB@@???>>>??==<<===;:;;:::9999889:=>@@??@ABBBA>><83.+***./011121110/...--+,+,,,,,,,,+*))*))(((((''&&&&&&&&%%%%%%%%%%%%%%&&&&(((())*****+,,,,,---...///////001358<BFKORWX\^^^_]ZWVVVVY\accdba\VMC;4-+**++**))**))))('(('''''''''')-4>LXgpuxxwvuvwtqhZPB::;=?ADCEFJJLPZbjrz~€€€€‚‚zqgVC4(&##$25!#)-5AN^luz}{xplf`^_`_]YRNIB:5/,+*+,--..2QbSSSObgB7<FS^gpuwvuvvvvvspi]QE:3..-,,,,,,,+,-./14688:<>ADHJMPSVY\_cdhmqstww{…Š–——•”‘ŽŠ‡†ƒ€|wmg`[WUUVWYZZ\]_adeggkmopprsssrpoponmigc^YURPNMLKKIGIMT]fmsvyxwwz|€„ˆŒŽŽŒŠŠŠˆˆ„xof^ZYVWWXY]ahjmmqponoopquvtsojb\ZXVUW]biqy†Š‰‰‰‰‰‰‰‰†ƒ‚~}}|yxusuvvwwwtrojhioqu98766544321110.-.....//123345677:::;==>>>>@ABBCCCCBBBAA@@@?>??????<===<<:99:::9998889;@DFHHHHIIKJJHIFA:3.,-/145679:::8854110/-+*---,,,,+***)((((((((&&&&&&%%&&%%%%%%$$%%%%%%%%&&((''))*****+,,,,--..-.....//0011368:>EKOTWX[[\^__\[ZXWYX\`cdefc^[TKA92,*+++++++++*))))))))''((((((&&),2:GUbmtvxxuuuxvskbSH=;=?ACDEEFFJMPW]fnw~‚€€€‚ƒ~wm[I7+##!#*-##'.5@O\itz}~{yumfc`_][WQLIB92-+,++,,-//115FWQKNWV<8=GT^hrxwxuwwwwvsnh_PF:42...-,,,,++-/12335::<>@CFILORTV[^acgkprvwxy|€„‰”–•”’Œ‹ˆ„‚|yrkdZTUUTTUVXZZ[^_ceghlmnooqssrqpoqpqmjea[XTQPMKHGEDEFKQZflswxxywy|€ƒ‡‹ŒŽŒ‹ŠŠŠ‰ˆ„~wnf\XWWVWX[^bgjlmqromnnoprtsrojb\YYWW[`flt|‚‡‰‰Šˆ‰ˆˆ‰‡ƒ€~}|{||yvsuwvvwxwvromklpsw8766553332110..-.....//1234556779:;<==>>??@ABBCCCCBBBA@@@@?>>>========<;:;;::999879:=AFJMOOOPRSSRRSROIC931258;>@ADDDECB?<:9730/,--,,,,,+*****)))((((&&&&&&%%&&%%%%%%$$%%%%%%%%&&''''))*****+,,,,--....../////01357<@EKOSV[\\]_^]`^\[ZZZ]`acdedc]YPG>70+++++++++++*)))))))))'((((((&&'+07BP\iquwxvttvvsmgYNB=?@BDDEFGFHKOSYahr{€€€€‚ƒƒ€{scP?0'$"!#""#'-2@MZitx~~{yungb_][WRMFA:2-+***+,-/00242LWKII[N68@JU`jtxxwwwwwwwtoj^OE<50....-,,,..-/12335:;=>ADHJMPRVX[^beimquvx{|}„‰Ž““‘‹ˆ†‚€|wtng`WSURSSRTVYZ[^_adgjlmooprssrqpopomkgb_YUQOMKHFDCAACHOYclrwxwwx{}„ˆ‹ŒŒ‹ŠŠŠŠ‰ˆ„~wnf]YYXVWY\_bhknpoopnoorstutspib\YYY[]cipw…ˆ‰ˆ‰ˆˆ‰‰ˆ…€~|{x{}}ywuvwvwwxxwtqmkknsw6666553332110/-,..////0234676778:::<<<==>??@CCCCCCBBB@@>>??>==========<<;:::9989::;=@EINRVWWXY[[ZZZ\YTKC<:;>ACIKMPSTRONJJIE@=81/-,-+++*,**))*))(('''''&&&%%%%%%%$$$$$$$$%%%%%%%%''''()**++++-----..//////1/112248<?DIPRVZ[]^abcc`_^\\\]`baadeca]VMD;4.++**+++++,++****)+))((''''''&&()/5?LXforuuuutvwtpk_SHA@BCEFFFGGGIMMR[dmv}‚„ƒ‚}tiXE5($"$#$##&,4@MZhsz}||yulec^\WQLFA:2-****++,-.//..3YTPIJMV=:AKV_lwyyxuuvxxvsnh]OD=62//....-,..-/023568:<?AFIJMQSVX\_dfjnrvx{|}~…ŠŽ‘‘Š†…ƒ}xrnhaZWSQPORRRSYZ[\_achjlnppsssrrooopolgda\WRONKJGCA><<?ELV_ipx{ywwy‚…‰‹ŒŠ‰‰ŠŠ‰‰‡ƒ€yne]XXXWXZ^`chkmnppppopqruutrnib]ZXZ^bgmv|‚†‰Šˆˆˆ†ˆˆ‡‚~|zxxx||zwvuuwxyyywtqmkmqtv65666543321100.-0011113534677789:::;<<==>??@BBBBAAAAAA@?==?>========<<;;:::99979::<=AGKPSXZZ[\^^___a_\UMECDIMPVX[^_`b__]YVRNGB=62/.-,,,+++))*))(''''''''&%%%%%%%$$$$$$$$%%%%%%%%'''''(**++++----./////0/00011258=ADINRW[]^abdgffdb_^^^_accddec_\RJA91+++**+++++,++********((''''''(((),2;FS`kruwuuuuwvqngYNGCBDFGFGFFFHIILT^hqy~‚‚ƒ‚€xo`M<.'#%#$$$(/9AN\grwz{{xtle_\UQKC?82,*****+,,-.//..2LdXJLLX=9AKWbmvyyxwuvxxvsmg]OC<622/110/.,../1023568:<@CFIKNRSVY]_dfkoquy|€ƒƒˆ‹ŽŠ‰‡†‚|xtpic]WSQOOOPPRUVY[\^`chjlnppqrrqqqqqpomie_ZTNMKIFC@?;::<AJU_hovwwuwy~ƒ…‰ŠŒ‹Šˆˆ‡‡ˆˆ‡ƒxqg`ZZZY\[_cfhkooppoooqrsurtrmhb][Z[^djqx„‡‰Šˆˆˆˆ‰ˆ‡‚~zxttx{{xyvwwyyyyxwtqmknpru774455433211110..122113457777899::;;==??@>@AB@CCDDBBA@?>>=>>====>>>=;;:::99987889:;=BGKORVZZ[\]^adbab`]WPNOSX\_acejjhgffc_]XVQIA<52-++-++***)(((''''&&''&%%%$$$$####$$$$$$%%%%%%%&''''))++,,--../////000/001269=BFJNTVZ]]acehjkieec`__`acefdca[WMD>7/+,,++,,,,++,,++****++)())((((((&'*/7DQ]iruuuustxwtpk_TJCDDGEGFGGFDFEFMWcnx~‚‚‚‚‚‚ƒƒ{sdSA1'$$%&&',58DNZgrvwyyurme]WQJE?80+)))++*+--..//001CfVRNPV8=CMXcnuxzxxwwxxvtmg]PD<62322222/-./02213579:=@CGJMORUXY^acglprvz~€„ƒ…‰ŒŒŠˆ‡„‚|xtpkc\WSPOOONPQSTVW[^_cdegmooopqrqqqqrpomhc^YSNKHCB@=;977:@KT_ipuwwuwz}ƒ†‰ŠŒ‹Šˆ‡†‡‡††ƒzrid]ZXZ]\_aehlooqqqqprsuutsplgb\\\^_fmszˆ‰Š‰ˆˆ‰ŠŠ‰‡}yvstx|zxyxwyxxzzxwurmkmqtu775433432111110//022333568997788::;;:<???@@AAAAABBBA@A>=>===<<<<===<;;::9998778779<>@DILORUXWX[\_bbdfdc`[WZ^^ceggikkmikkigec_YUOH@92-,,**)**)(((''''&&%%%%%%$$$$##$$$$$$$$%%%%%%%&''''))++,,--..//////0011248;?DHLPTV^_bdeijkmllifeca`bbddedd^YSJA92.+,,++,,,,++,,++****+++)))(((((('&)-4@MYdnsvuutuwxwsofYOHDDFFFFGFDA?>BFP]jt|‚ƒ‚‚‚‚ƒƒ|vjZF6+%%&&).17>FN[grvwxxurmcXRKD>80))*))+++,--..//000?baQLOLE<BNYeovyzxxwwxxvtmg]PD<843222221-.//0213579:=@CGJMPSVXZ^acglprv{‚†…ˆŠŒŒ‹ˆ†…‚|ytqkc^WSQPOOPRSUUWYZ[^abdhjmooopqtsqqqrpolic\WPLFC@=<986568>JU`ipuwwuxy€„†‰‹‹Šˆˆ‡…†‡††ƒ€ypfb^\\\]^_bfinpqrrqrrtuvvvtqkea]\]_bhow~„‰ŠŠ‰ˆˆ‰ŠŠ‰‡€|xsqvy{zzxwwvxxxxxwurommnqs6654443210121121113334446577899:99::<;=???@A@AAA@@>@@@?>=<=>==<<==<<;:9999887666569;?BFJMPSUUTSTX]aceegec``bcfegiiiillkliigdcb`[ULE=5.,**)**)(((&&''&%%%%%%%$$######$$###$%%%%%%$%''''()*+,,--..///////01567<@EIMSWY\_dhjmnpprqojihdcabccbca`[TMC<5/.,,,,+,,,,,-,,++++++++****(())((((*-2<HUdmsvvvvvvyywti_SIEDEGGFEEB>;;<@LXdrz‚ƒƒ‚‚‚‚‚€wp_L;.&&')-05;@IP\gqvwwwspk_UMF?5.+())**++,,,-..//1114NeRKOU^M?Q[gqwzzxxwwwwusmh\OE=854332220//////12479;>ACHKLNSUWZ^bcgmqtx~‚ƒ†‡‰Š‹‹Š‰†„ƒ}ytqkf_XTROOORRUXXZZ]^_bcegjkmnopqrtssrrspnnid]VQKDA>;:762248?JV`kqvyxvx{„‡Š‹‹ˆ‡‡†…†‡‰‡„xogb`^]_``cehjnqrrrssuvuxvvsric^]\^bflsy€‡‰‹‹ŠŠ‰ŠŠ‹Š†{vtrtx||xxxwwxxyyxwtqmkmort6654443210122221114455556577989:::;;<=>????@A@AA@@A@??>>=<<=<<==<<;;::99989966654589<?BFHKJJIJJIOTX]_ehhhedegfeedddceefggfgihhheb[SLA60*))**))(('&''&%%%%%%%$$###########$%%%%%%%&''''()*+,,--..///////0469;AGLQRXZ`dgimoqsswuromjfecacdcbb`[UOF<51/.,,,,,,,,,,-,,++,,,,++++**(())((((),19DR_jqvutttvyzzumbXMGFFGGFEC?;878<FTbmv‚„ƒ‚‚‚‚zseTB2)')+049?EMT]hqwxwwroi\PH@8/+))))**++,,,-..//1122=ghRPIZaJM[hsxzyxwwwwwusmh\OE=85434322000000004679;>ACHKMORTXY]^cglptx~‚…ˆˆŠ‹Œ‰‰ˆ…ƒ‚€}ytpjd]XVTUSUXXZ\]_``bcdhiikmoopqpqsrsrrsrpomf`ZTMC=:97531028@KWakrvwxvx{„‡Š‹‹‰ˆ‡†‡ˆ‡ˆˆ…xogb``___adfiloqrssttvvwxvvrpic^\[^bgow}„ˆ‹Œ‹ŠŠ‰ŠŠŠ‰„|xsppsy{{yxxyyxxyyxwtqomnprt55554442232233333455556666679;;;;;<<<>>>????AB@@@@@?>>====>=;;;;::::::998877555544557:9<>=>>:99;CIQW_dhihgfeeba\WTTX\\]]]`adfhjkmj`VLA4-*)**(()('&&&&&%%%%%%$$$$#"####"$##$%&&&&&'''((***+,.----//0001247<?DKPTVY_bgjmoqrvuyxwtqmieddddccb_YVQFA92,,,,,,----,,..----..-,----+**())))))),27?N]iqtuutuvwyywpg\QIGGHEGEC=74449AO_ky€„…ƒ€ƒ„ƒ~wkZH9.*-04:>CJQX_hqxxyvqoh\OD90*)))))****+,--...//103;RdTTGNNRQZgtz|zzyvvvvtqng\OF>:7665553110000013567:=ACGJMORSVXY`bhjnsx}„†Š‹‰Š‰ˆ„ƒ‚|yvphc\XVWWVY[]abceegjklnnpqrssqqrssrrrqtrrqnje_XQJB<65532027@KValsvwwvz}…ˆ‹‹‹Š‰ˆˆˆ‰ŠŠ†…€yohdb`_^_bgfjnrqssstuxxxzwurlfa]]]`ejry…‰‹Œ‹ŠŠ‹ŠŒŠˆ‚|wqmpuy{{xwvvvxxwwyxutpoprsu55554444334344445555556666679;;;;<<<=?>>????@A@@@@?=====<;<<::;;::::::998776655433331456653300029@HQY]begefb_YTOHFFFHKLPQTY\afkmpnleYL>1,+++*))(('&&&&%%%%%%$$"""#####"$$$$%&&&&&''(((***+,.----//001249<AFKPUY\cginnrtvxz{|{wtrmjgfdccb`^YVOH@82-,,,,,,------..----....--...,+*))))))),/5>KYensuutuvwyyxtj_UMHFGFEC@:51024=JZgv~„†„€€‚‚€yqaN>30139>BHNSZ_hqvxyxsnh\L>4-()*)))**+++,--...//014=TNQOKQLBM]jv||{yxvvvvtqnh_RF>:7665533111100002467:=@BEHJMPSUY[^`eilrx~‚‡Š‹‹Š‡‡…ƒ‚€~{wtpjd^]XZ[[]`bdeiillnpqqrrvvvvttstsrrrtuttusokf^XPF@;8653238@KValsvwvx{~‚†ˆ‹‹‹Š‰ˆˆˆ‰ŠŠ‡„xohec`__`cefjnrsuttuvwyyywuqle^]]^`fnv|‚ˆ‹ŒŒŠ‹ŠŠ‹‹‰‡|wplosy{{xxwvvxxwwxxutqpoqsu66554444444455555555665566899:::;;;=====??????????>><;<<=;=;;;::::::99887654543211/..0110--.,+,.58AJQY\]aaa\UMC:556878:;AFKQYcjlrvtmcUJ:1-.,+*))'&&&&&&&%%%$$$##""########$%%%&&'''(((**+,,----./001348?BHNQY]acfjmrsvwz||yzzvrnljeddbba]YRMIA:3-+,,,,------........//./012210--*)))))),/3;IWcmrutttvvx{wuoeWMIGFEC@=72-,.28EUbq|‚…ƒ€€‚‚{vjYH:778>BGKOSZbjqw{yxtnh]M>3,))))****,,*,....0/0023ORY\RPRTKA[kuz|zywvwwvurmg^QF>97665432221100111345:=>ADGILPSUWY^_cfjqw~ƒ‡‰‹‹Šˆ…„‚€€}{xtojea__]^abdehijknprtuvwvxxwvvvttrrrstuvvwutrmi`\SHA:743126@LWbltxwvxz‚†ŠŒ‹‰ˆˆˆ‰ŠŠŠˆƒ~woib`_^`bdghlprttuuwyzzyzwtnic^]]_chqx„ˆŒŒŒŠŒ‹‹Œ‹‰…yrmkotxzzwvuvvxxxvxyvurpqutt6655444444445555555566668899::::;;;===>>??????>>>>==<;;;<<<;::::::::99886644442211/.....,,+,++,.04:DINRVYYXRI>40..-,+,.027?GPZcjquwskaUH<751/+)(&&&&&&&&%%%$$$##""########$%%%%&'''(()**+,----.//02358=DKNS[^cfhlnotwxz|{}yxwsplihecb`]ZXRKF?92-++,,,,------..//....///0124443.-,+**))),-2:FSaksutttuuwyzxoe]QKGFDB>:50,**06AR_my……‚€€€‚„‚~woaSC<;>BGKNSW\djqw{zyvqj^O?3,*())****,,,-,,...01123?bocRJKHPSaluz|zywvwwvurnh^QF>976654322211001113457:=>CEGKMPSWW[\_djpxƒˆ‰ŠŠˆ†„‚€~}zxtoieaa_`aacdfiikmmnqtwvxxzzyxxxutrrrsuvyyzzyvsphbZQJA;86538@LYdntwyxz{€ƒ‡‹ŽŽŒŠ‰Š‰ŠŠŠ‰ˆƒ~wngbba`_adgimqtttuuwy{{yxvrmfa^]]`cjt|†‹ŒŒ‹ŠŒŒŒ‹‰…zqllotxzzwvuvwxxxvxyxurprvvu65554444555555555555557788:::;;;<<==><=???>>>>>>>===;;;;::;::9::9:;988976554321100//..-,++++++**+/5;AGLLONJC93-*))******+.4<FOZcmrwusj`RMD=:53-*(&&&&''&&%$#$$#"#"#####$$$$$$$%%&&''()))+,--..///0258<AJPT[_cgjmprsuwwz||yxwqonkgd`b^[XSOKD=61.-,,,,----.-..//./....//022446540/--,,*))*,09BP\gpttttttvxzyqi_VLGFC@<83.+().5?LZiv……ƒ€€‚ƒ„‚}tk[LCACGJNQSV\cirw{zzwqi^PA4.******++,,....//..0022MnaAKHJAMU`mv||{xvvwwvvtoh^QG?:855554411220011133556;>AEEHJMPTVW\]bhow}ƒ†ˆ‰ˆ…ƒ‚€~~}{yvrmhdbbcbacddfghklnoqsvxxyz{}yyxusrrrsuw{~||z}|xqkcZRIA:6448AMXdosvzyy~…ˆŽŽŒ‹Š‹‹‹‹‹Šˆ…wmfb^]\]_cfinrstuuuvxyyzwtpld_]^^cgow|…ŠŒŒŠŠŒŒŒ‰„wpkipuwyywwwwxwwxvxzywsopruu65554433555555444466668889:::;;;<<<<>=>???>>=====<<<::::<8::;999899988765544220/....--,+******))**-4:=@CA@:4,+*)****))))),.2;GP[eluvtqiaZROJE@:3,(''*++*(&%$$$#""######$$$$$$$%%&&''())*+,--./000148;BGMTZ`deknqqtwwxy{yvtspmkhhdb_]XURMGB;51---,,,,----....///.0000//1135456520.-,,,**,-18BMZensuttttvxywrj_VLGEB>951-)(),3:FVdr}„ƒ€€„„{qbUMHIKMOQSX\cgptvwwwsmbSE>;,*++**++--...../..0246VcJBJGKIHW`mv||{zwwxxwvtoh_RH@:8555544442201111333568;>ADFIKNQSUX\bhpw}ƒˆˆˆ†…‚€~}{|ytplgcbcccc`cdefhijmopqrtwy{||zzxusrrrsvy{~}~€|yrkdZRH?7248AMZfovxyy{…ˆŽŽŒ‹Š‹‹‹‹‹Šˆ…wngb^\[]_bejorsvvuvxz|{xwsnha^\\^bhpw€†‹Œ‹Š‹Œ‹ŠŒ‰ƒ~tljjotwyywwwvwvvwxz{ywtstuvw556677555556766677777788:::::;;;==<===>>>>==<<<<<<;;;;;;99<;::888777655555223///.,----++))))*)(()(),1569840,*(((****))))))+-39EP[equvurlgb^YQMF>80,-23322-'%$$##########$$%%%%%''&(())*+,---.//0147:?FMSZ^dgjlnpqrvwwwusromkifb_\[XTRNHD?730----,,----../-.0/../111122224467641/----++++.15>JUdlrttsssvwxwslaWLFBA<83/,)''*28CRaoz€ƒ‚‚€€„…‚}wl_UONONQRUX[`fjrwwwwtmbTINJ-)))**++---...////016QlG7<9?IIJVamw{|{yxwyxwvuqlaRG@<96655433333111133443689<>AEGJMNPRT[`hqy~ƒ‡ˆˆ‡†„€}|zyvrnieba`aaaaab`abdegghjnrsuxzzzxvtrrrrtvwy{z~‚„„‚~{qkbZQE<549DP[fpwyyyz~‚†‰ŒŒ‹ŠŠŒŒ‹ŠŠ‡ypje\[ZZ\`djnsuuvvxyz{{xvqkd_[YYZ`hs{‚ˆŒŽ‹‹‹Œ‹‹ŒŒ‰ƒ}skhjnsxyxwwuuvwxvx{{zwstuuvx666677556666766677777788:::::;<<==<===>>>>==<<<<;;:::::::999998887776555543210/..,,,,,++*)))))(())(*,-00-*))(())))))(())))*+-28CP\ipuwutpllfa[TKE?:;?@A??71,%$##########$$%%%%%'''((***+,-...//037:>CJPW^cfklmopstttsrpnkifda]\ZXSPMID@;62/.----,,----.../0////011112222335652//..--,,,,-03;GS`jrtsrsstvwwslbXNF@?950,,)'').6?L[iu}‚‚‚€~ƒ„ƒ€}sg]UOOPUUWZ\^cglrvvvsk_RPGB/*****++----../////25a†]98IQOOKUclx}~}yxxxxzxuqlbTG@<966554333332246887755679<>ADFHJLNPX^gov~ƒ‡ˆˆ…„‚€~~}{ywvsmgda`^]^]\Z[Z[Z\]`cbdfimquvwwtsqqrrrtvvxzx|~ƒ„‚~zrjaYOE<9;FQ]hqxzzz}€„‡ŠŒŒ‹ŠŠŒŒ‹Šˆ…‚ztlf^XWY[bhmrtttuvxyz{yutnh`[ZYX[bkt|ƒˆŒŒ‹ŠŠŠ‰‹Œ‹ˆ‚{rliknsyyxwvwvutuvx{{zwtsuvuw77757755776676558867889989::9<==;>>?<<====<<==;;:999999999988898965555332322/..,-,,++*****))(('(('&'(())''(('())('))((((((((*.4=GS^hrwyvuuspnhb]VQNOPQSSOHA7,%#!""$$###$%%%%&&'''''()*,,,-..011258=BIOV\afikmoprutrqniiffc]ZYVTPLJGEB>820...-------------.001111334422211344220000.-,.---/39EP_gqtssrstvvusndYNEA=84.++)'').3:GWgpz‚ƒƒ€}~ƒ„ƒzoe\VTSUVXZY[\ciosvutmaXS7>7+,,++,,+,--../000136UwgIJITTQOYdpx}}|yyxzyzyyslcUG@<96644432213469=<=<<;86579<=@CDFIJPU]gryƒ‡‡‡…ƒ€~}{zxvvpleb^\YYUVUTSSSSRTTUXZ]afknnqqqrrrrrrrsssuxxz}‚„‚€xribVKB>?JS_jqy{{z~€…‰ŒŽŒ‹‹‹ŒŒŒŒŒˆƒ}wpg`]Y\^cjpsuttuwxz{zwsqjd]YWWW\dmw~†‹ŒŒ‹‹ŠŠŠ‹‹Œ‹ˆ‚{pkikmsyyxwuuvvwwvw{{{vtsvutt776777667777666677778899:9;;:;;;:;;<>>====<<;;;;999999998888888877664422120/..-+,,+++**)**))(('(('&'(('''''''())('))((((''(((+.6=HR]hrvyxxwutqnhfa`acdffd[SH:+$$""#####$%%%%&&''''())*,,,-./11147:AFMSY`dgjlnpqssolhfc`\\YURNKHEEA><750/.-..------------.0111121334443322452221110/-....-/28CP\gorssrrrtttrmdYNE@<72.+)('''+17AQ`lw€ƒƒ€}~ƒ„…ƒ~uh`YWVWWWWUWX^fmtuurhZXL7@:,,,++,,+,,-../00022>X_\TWC@NUUXfpx}}|yyxz{zyyslcUI@:866444333389<CFEFEDB>:7778;<=@CGJPY`iry…ˆ‡†ƒ€€~{zzxvtnic_YTSPNMLJIJKLLLLMPQTX]ehknqpqqqprrrrrqqqruvz~€‚‚|xpg[TIABKT`krwyy{}€…‰ŒŽŒ‹‹‹ŒŒŒ‹‹‰…{tme`^^afkpsutuwxzyzxurnf`ZVWUX]eowˆŠŒ‹‹ŠŠ‹ŒŒ‹Š†wohgjmsyyxwvuvvvvwy{{zvrrttss7768988869887777667878::::;;;;<<<<<<<<<=<<<<<<::9988998888887777555521111110---,+***))))))((''''('''''''&&''''(((())))''''(('(,24>GQ[cjosvvuttssopoqruvvrjeWI9)"!!""$$$%$$%%&&&&'()*+,,,,-/012369=CIOV\afilnopsqlkfb\ZVRPLJHGCA=:9842/....------....----00012233555555445544322210////-..028BMXeosrqqqqstsqmeZOE>;60,''((')+.5?LZft|ƒ‚€}~ƒ……†€ynf]YXXWURRPV\bjrvuraXY@6<2,+,,-------../01003;[f^Z`[;HTXVhpz}}{yxxyyyyztmcUJ@96545543246;?EJNPPROKD>967779<>AFKRZclsy…‡††„€}||zxuqmg_YSPMGFFEDEDDDEFGGIJMRY^dgjloqrrsrrronkklmmoqv|€{tlb[PJFNWblsy{{}‚†ŠŽŽŒ‹‹Œ‹‹‹ŒŠ…‚}vqjfeefmpstuuwxyyyzwsnhb]WRSSX]goy‚‰‹Œ‹‹‹‹‹‹ŒŒ‰†wlefiouyywvuuvvvvuwzzzvtrqqqp888899997:889977668878::::;;;;<<<<<<<<<<<<<<::::88888877778757745555111100.--,,,+**))(('((''&&&&'&''''''&&''''((((((''''''(('(*+05=GNT]cfilnqrtuwxz|~……zsfVF5(!!""$$$%$$%%&&&&()*),----/002358;AFLSY`ehjlmnoqnhc\YTPNHDA?><;8764200///..------....0000011123345555555566444322000/0/-/.028@LVcorrqropqrqqmeZOE=84/+(()(()+-3:EVdpz€‚€}|}‚†‡†€{qi`[XWUQQOLOT^irutvbQK?882.,,--------.//000125Mk_WdV8;PWWdqz}}{yxxyyy{ytmcUJ@:7755554459@GMSX[\[YUNB;85667:>@FOV]fnv}‚†‡†„ƒ€~~~||zxuqke^TLGCABBAABAAAABCCDFKPW]`cjmqppqqrttplieebbfhntz€}yog_WPOQYbltz{{}„ˆ‰ŽŽŒ‹‹ŒŒ‹‹‰ˆƒ~zuqkkjkpsuuvvxxyzzyurlf^URPRRW]hr|„‰ŒŒ‹‹‹‹‹‹ŒŒŠ…~wmecjpvyywuuuvvvvuvxxxvsrpqpn9999999999888877877789::::::;<<<<<<<==<;<<;:::887776777777667546545311200/.-,+++**))''''&&(((())&%%&''''&&''''''''''''''''&('''')+4;BHNRXZ]bdhnuw}€„†ˆ‹ˆ†‚|reUG5&#!"$$$$$$%%%%'(****,-../011358;=BGNV\beiklooomia\TNHEA?=<96534321////----..........//00112333455566775566554433220011../137>JT`kpqroonpqppme[PC;51-*''()()*,/7BP_lw‚~}}ƒƒ……~umc^ZUQMIGGHP[jqvtkRBKNF>60,,--,,----/0//10/25H[[[i[76PTVdrz~zyyyyzzxxsmdUJ@:75564446;@HPX^bghfb_VKB964358@FKSZdkry€„‡ˆ…„‚€}|~}zxvrjbZMGC>?>>@?@@@???A@CCGNT[afimoqrqqssqpje]YUVZ]ckswz}{rld[XUY^gouz}}~„‡ŠŽ‘‘ŒŒŒŽ‹Š‡…|{{xxtpqqtuvvvwwy{zywtoic[TPOOPU\gq~…‹ŒŒ‹‹‹‹ŒŒ‰„~skffkqwzywtuvvvuuuvwwwsqnnnpn9999999999888877887789::::::;<<<<<<<==<;::::997766666566765555655431110//..,,****)(''''&&&''''((&%%&''''&&''''''''''''''''('''&&%(*059<CDHKOT\dnv|€„‡‰ŠŠ‰…ƒ|ocRA.$"#$$$$$$%%&&'(*+++--../013467;?DJQX^dgjlonmmh`ZPJCA=:86544311200////----..........//00123344556677777777665533321000///137=HS_jpsspnmnorolg\QE:4/+)('()()*+/5<JZgs|~|||€‚„„ƒ~xpg_YTPHECCGPZfptfM>D\\M?60,,--,,----.///00.2=RY^cdTIQQOVgqz~~zyyyyzzywsmfXKA:75543448=ENU^flqrple]PE<6538<BKPV`hou}…†‡†ƒ€~}~~|zvrjbVMFA?=>=?<>==><=?>?CGNT[aeioppqpqsqqoic[QJHMTZckquzyvoia]\]bgov{{{„†ˆ‹‘ŽŒŒŒŒ‹ˆ‡„zyzz{{zxvxwwwwwxyx{zywsmf_WPPNLOU^it~†Œ‹‹‹‹ŒŒ‰zriffjqwzxwuuvvvuuuvwwvrpmnmkj888899999987887788889:::::::;<<<<<<<<<;:::::987766665455556566555211000/.-++**)*)))('&&%&%%%&&%%&%%&''''&&&&''''''''''&&&&(&%%&%%%%'*/11238@IPYcjsz€‚„……ˆ††‚xo]L8'##$$$$$$$%(((*))*+--/.0013578=AGOUZaehknolljc\TIC=96654444312200000/-----...//....//1112334455667777777766554333021100//48;ER^iprqnmkmnrpmh]QE:3.+)(&())*+*.2;FVeqz€‚~|z{~ƒ„ƒzrj\VPKB?==DMXfphI7B^i`QD80-.--,,..---./0./13A]]baUSYXSPYdq{~}{yxyzzzywtneWKA;8444446;AJT]fotyyzsj`UG=747;BJPV_fosz€ƒ††…ƒƒ~~}}||}{wqh_UJB?><<<=<>=;;<==?@DGNV[agjlnnoqqrrplg_WKC<?GQYahmuuvqkgdbadjry}~|‚†ˆ‘ŽŒ‹‹‹‰‡ƒ€}{{}{}}}{{zzzyyxyzz|{zuoiaZSNLJLOU_kv€‡Œ‹‹‹ŒŒŽŒ‰zqhdejrwzxvuuuvvvvuvwwwsoolljh99999999998788778888::::::::;<<<<<<<<<;:::9987776666445544553334521100.---*++*()))((&&''&%%%&&%%&%%&''''&&&&''''''''''&&&&''%%&%%%$$&())*)*0<CKT]flrvyz|‚ƒ†…~tdS?*!!$$$$$$%&((()*+,,-../0013689>DJRX]bgjmnmmjd]ULB9874433333311100000/-----...//..../011233355557788777777765554322110110048;CNZioqqnllompqog^SG;2-*)(()))++*,39BP_lv}|zz{~‚‚{vj[SLE?:9:AKWbpkN9LjocRE90-...--....-./00123FbibSMjbRUSWfr{~}{yxxyyyzwtneWKA:7443346<BMVblu{€}ulbUI<77;BHOV]flsy‚…††ƒ}}~|}~}{wqh_TJC?=<;;;<<;;;<<<<=BGNV[`fkkmpqpqromje\RJ?76=EPX`flswrmiifgimtz}~„‡‰‘ŽŒ‹‹Šˆ„€{ywsuw|}~{{zzxyzz|{ytmg]VNHIHIOU`mw‚ŠŒ‹‹ŒŒŒ‹‡xmebhlrwxywvvvvvvvuvwwvsomhhge:::::::9998777778888:99999;;::::;;<<<<:;:;99887765555455544443343201/---+,*)((''&&'&'&%$%%%%%%%%&&%%&&''&&&&&&&'&&''''''&&%'&&&&$$%%%%%&%&'+05?FNTZaeilpx~…†„yiXD-"$####$%&'())*++-,-../012469>AIRV\bfhknnnmg`XPF;7444443333212100000/....-.--//..001111334555579999999988776655442211111148;@LWdmpponkmnnqold\NA5-))*)*))**+,18=KZht{~~}zyy|~€€}wj_RHA<557?IT`jqJ?auqgVG<4/.,,....--./00003;Zz{eHN\\HIRYdqz|yxvxxyyxuoeXJ@84332137<EPZdpy„ƒ~umaUI?<>AHPW_emrx}ƒ…‡‡†‚~~}}~~~~|wqj_SI@;<;:999<<;;;;<9=AGOV]cilnoooononmgb[OG:304;ENV`fnqsojjkloru{}~‚…ˆŠŽŽŒŠ‹ŠŠˆƒ|vrniltx}~€|{{{{{{}{xqkd\TLHFFIMWdp|…‹ŽŽ‹‹‹‹ŒŒŒˆ„~ukcaglrwyywuuuuuvtvwvvuqnkjheb::::;;:99987777788889:99::;;;;::;;;;;;:9:8776676555444544444432221/0/.,,,*(((('''&'&'&$$%%%%%%%%$$%%&&&&&&&&&&&'&&''''''&&%'&&&&$$%%%%%$%$&&&*09@EJMNSZbny‚†„ym\D-$#####$%&'())***,---/0/1369<BGLTY^egjlnnmgc\UJB;7444443333212100000/....----....001112334555679999::::98877665442222111348;@KValpponlnnnppmg_RC6.***)*****)*/6;IXery~}zxxz}|wl_RF=6148=FR^kd=BgvofXJ=5.,++,...--.//../0Cn{v^ONYT>NYcer{~}{yxvxyzyxuodWJ@84311248@HP\gs|‚„ƒ~ul`THAAFIOW[cjpx}ƒ†‰‰‡„‚~~}{|~~~~{wqh^PH@;:99999::99999:=AHPY^dilnooonnomjdaWOB61./3;FQ[cjnqroonprtw{~~€ƒ‡ŒŽŽŠŠ‹Š‰†zrkebemrx|~€€||{{{{{}{vniaXOICDEGMXfr}‡ŒŽŽ‹‹ŠŒŒŒŒ‰ƒ|qjbbgltyyywuuuuuuuwwvtspmkifeb;;;;;;;;::9887888888:8999::::9:::999;:888877765454445444234441220//0.-++**)((((('&'&%&&%&&%%%%%%$$$%&&''''&&%%&'%%&&&&&&&&&&&&&&%%%%$$%%$$$$$$',158;=CKWiv€…„zn[C,##$$$$$%&'())*,,,---/0/136:>DKQX\afjjjnmid`XOF>96545444444333321000///.-----...0001133445567789988999998877665443322322136=BIT_iqrpnkmooprpkcWI<0+++))*++,+-/6;GVbnw}~{xxz}~€€~yobSD82036<EQ]jaDFowrh]L@5/---,,--....-.02<_klrXGNNZSQRgjt|~~{yxwwyzxwuogYJ@84211249=GR_jwƒ„ƒ~uk`TLGEIPVZ`gnv|‡ŠŠˆ†~~||||~{wqi^PF?986857777787768<BGQZ_gimnmmnmmnjgc[RH=6.+-05=FS\eloqqqqtuxz|~}€ƒ…‰ŠŽŽŽŒ‹Š‹Šˆƒ~wla\Y^fksy~€~}|||}|||yslf\SJEBABFO[ht‰ŽŽ‹‹‹‹‹ŒŒŒŠ†€{pfacfkszyxwuttvvvvvvuspnjhgea^;;;;::;;::987888888899999::;9:;;9999:877756666434465444323444111/.-.-,++**)(('(('&&&%&&%&&%%%%%%$$$%&&''''&&%%&'&&&&&&&&&&&&&&&&%%%%$$$$####"""$&',./6BQds„ƒylX>)##$$$$$%&'())*,,,--.001369?DJNU[_ffgknnlhcZSJC<665554444443333210000//.-----...0001133355556789999999998767665543322231247<AIR]fnrpnlnooprrlf[M?4,,)+)*+++*,05<FUalv}~{xxy|}~{reSB72036:DO[g[ERutoj_NA6/-+++,--......03KjjulLGFHMLNRons{}~{yxwwwyxwtngYJ@84212239>HUbmy€„…‚~uk`TLHMSXY\dmt{…‰‰Š‡„€€~~~||}{~{vpg\PD=;76667777767767>CJSY_fjmomnmmnmkf_YPE:2.++-18ALVajmtttuxy{}~€‚„ˆŒŒŒ‹Š‹Š‡{sg[SPX`kqvz~~}}}}}||zwrkcZQGB??CHQ]jw‚‰‹Œ‹‹‹ŒŒŒŠ†€xnf_bgltxyxvtttuuuuuuuspnjhfda];;;:::;;:9987788889998999;;;::::99988877655554555544333323554100....,+++**)'''''&&&%&%%$$%%%$$$$$%&%%&')'&&&''''''''&&''''&&%%%%#%$$$$####""#"$$#%&',4>N`q}„‚ykW<'##$$$$%&'()**+++,,.12249=BFKQT[adghimnlif`WNG?8766544444442222110000///.------.0001123455557779999::9999888866554433332458=BIQZckpqommooqrvqjbQC6.))+*+**,+.3:?GS`js|€}yyx{|~€€{sgWF:3149:BNYeTK^ztqk`PC70,,,+,,,----.0/3Rqzw_FEL>>LUUeiq|~{yxwwxxyxuofYJ@9412114;AIWcoz„‡‡„xm`UQQSVX[agpw}…ˆ‰‰ˆ…ƒ~~~}{{}~~}|upf[OB<864456766554457;BKSZ`gjllmmlkmlic]VMA8/,**,06?JT^imsvwwz{~~€€€‚…ˆ‹ŒŒŒ‹‹ŠŠ‡€zpeXKJP\dkrw{}~~~}}}{{xuog^XMD?==@GS_l{„‹Ž‹‹‹ŠŒŒŒ‹‰…uld`chntxxwtssssssuuttqpnjfec`[;;:;::;;:98777888888899989;;::99::8988664455544444333322222221//--,,+****)('''''&%&%&%$$$%%%$$$$$%%'(++--+('('''''''%%&&&&$$$%%%%$$$$$####""#"###$%&+1>M_p}„‚ykW>'##%%$$%&'()**+,,-./0259?DHMQV[]deijkjjjic[SJA97566544444442222221/000.--------.0001123456657778999::999999776655443333346:>CIQ[dkpqonnoqstvtnfZJ<0****+*+,/26<BKT`kt|€~zxx{|~€€|vl[K=5025:BMWdPSgvurmcSD;2-,,+,,,--,--.08lzuubNED>EQQTffq|}{yxwwxxyxtneXJ@9401/15;CMYfr~†‡‡†‚|pdYVVXZ\]dirx~…ˆ‰‰‡ƒ~~~|||}~~|ytof[OC:644444555444457<DMU\bhkllmmlkiifa[TI@30+))+04:EP\fmrvy{|€‚‚‚ƒƒ…‰‹ŽŽŒŠ‰ŠŠŠˆ†xmcUJJNWahpwz}~~}~~~|{ytle^RHA<:>BKWco|†‹ŒŒ‹Œ‹ŒŒŠˆƒ|ujb`chntxwuttsrrrsttsqromjfc`][;::;;;;;9:877788877788889:::::989987776655433333443333221100//.-,+**+++*((''''&&&%%&%%%$$$$$#$$$$%&',03442-+)()))&&&%%$$$$$$#%$$&$####$#$##""#""! $')/:J\my…zkXA)"$#$%%&'()))*+*,.-0259AEJNSV]_cdfhkkkkjf_VMD>86565544433332222110../0.------...0001112346667889989::::9999776665553333567:?DIQZcjoqponqrstvuqkaQB4**++,+.036;AEMValu}‚€~z{{|€~yoaOA71148ALWdLLjvvqleVF;2-++*+,,--,-,00IzrUK^]TPWLMQPiir~}{zywyyyyxtnfXJ?8411/27?FP[hv…‡‹‰†rg]XXY\]`elrz€„ˆ‰‰†ƒ€~}~|~~}~€|yuoeYMA9522232233443348=ENV]ejkmmmnllkie^ZPE:2+))*,/38EO[cjrwy}~€‚ƒ„„„„†‰ŒŒŒŠ‰‰‰‰†…~uj`VKGMT^irx{}~}}{zwqld[OD=::;BLWgs‡‹ŒŒ‹‹‹‹‹‹‹ŠŠˆ}sga^bgotvwurnqqrrssssrqnljfa^[Y;::;;;;;:9877788787788889::::9778877776544333333222211111100//.-,+*****)((''''&&&%%&%$%$$$$$#$$$%$&'+05:=9722100.,(&$$##$$$$#%$$%#####$###"#"#"""!"%(/9GVjy„|n]J1$%#$%%&'()))*+,-.036:@FKOSX\_acfjkkkjjic\SJB;64655544433333333110/.//-------...0001112345677889989:::::988877665553355668<@EIQXaiprrpoqrstvvtneWF8.-.,+.157;@DJQX`js}ƒƒ|{{z}‚‚€{reUD82148AITcKFivvrlfWH=2-,,*+,,-----1DtwmZ8OOMSWQRROcjs}€}{zyxwyyyxuneVI>843125;AIS^lx‚‰Š‹Š†th`[[\]]bflrv|…††„‚~}}|||}~}zxtndZNA9521112211111149>GPY`gjmmmmmllkhc]WMB7/*)))+/3:FO[cipv{~€ƒ†…†ƒ„„†‡ŠŒŒŒŠ‰‰‰‰†…}vl`SKJMT^hpv{}~}}|{zvpjbVKC=::;BNZiu‰‹Œ‹Œ‹‹‹‹‹‹‹‰†€xpe`^bhntvvtrpqqqqrrrrqpmjgca^ZX;9;::;;;::89878788877899999888887766665522221111222210000/00//..,+**))))))'&%%''%%&&%%%$$$##%%$$##$&+.37;;:6777765/*%$$$$$$$####"#####""""""""!!!!#$)-6BRcs~‚~scP8'&$$'''(((**++,./25=CHMQTY]_bdhkkjmkhie^VLD?97665566553333332211///..-------../10011123455678899899999987899764434345676:>@FKPX`iqstrppqsuvxvpg\K;2----169=BEJMT[ajs|„……€~{z}~‚€xk[J;3347>ISaJJjvtrofXI<4-,,*+,,-----.KxzqJ7UNLIMSMRWchr{€~{zyxxyyywtmeYK=752548=ELXcp|†ŒŠ†}tib^\]]_aejpvyƒ…„„ƒ}}}}}~}~}yxumcYK?7321000000000/6:@GQYahmlmmmmlkie`ZUK?5-+++**.4?IS\cjqu{„††„ƒ„„†‡ŠŒ‹‹Š‰‰ˆ‰‰ˆ…~vl_RJKQVajqy|~~~|||{xsne\QG?:89=DO_lyƒŠ‹‹‹‹‹‹ŒŒŒ‹Š‰„}vlc^^bgnuutsrqppppqqqqomkgfc`\WV;9;:9:;;99998777888778889998886677665543222211112111100/0///..--+,**))))('%%%%&&%%&&%%%$$$########$%(*.166456699872-'$$$$$$$####"#####""""""""!!  !#&+2<M]o{‚vfU=*&%'+-,())**++-/26<BIMSU[^_befhjjjiigc_XOF@965665566553333332211///..-------../1001112345567887789999998789976653554568:<@CGKPU`hosttqppsuvxwslaP@6/..18<?BEJPRW]cks{ƒ…„€v{‚xo`O>5347>GR^IHlvtsofXJ=4-,,*+,,------;`pjQ8[WNLPYUMTc`fv}~}zyxxyyywtofXK@96689>ELS]ht~‡ŒŽŠ„|rhc`_^]]^`djov}ƒ„‚~}}}~~~}}yvrmcYK?731000....../04:BKSZcjmlllmmlkic]WPE<3-+),+-09BLU]cjrv{ƒ…††„ƒ„„†‡ŠŒŠŠ‰ˆˆ†ˆ‡‡„}vl_RNNSZbksy|~~}~}||{wrkf\QG<888=FSco{…Š‹‹‹‹‹‹ŒŒŒ‹Š‰…|sic^^biovvtspopqqqqqqqomjgdb^ZWW::<<::::;9::9887888888889977765555445543222211222200//////./.--,++*)('''''%%%%%##%%%$$$$%%#"######$$%'(*++-///26661.(%##""""####$$#""""""""!!!"""""#%)0:JZkx€wi[F/&%*/23,)))*+,-28;AGKQUZ^`cdfhiiiigfdaYPHA<764555555554433322200//.-.-------..0011112325666788888899889888887775445567:<=AEJMQX_gouuusrrtvtvwsndUG:1027<@EHMPTX[_diq{‚‰†ƒ~s^j|€yz€|seTD8336<FP_JGkvsqnfXK>5.,,)*,,,,,,-+2LenaPn|iQO^^NLa^Vk‚|zyyyyyxxvofYJ?;;=ACHLTZbmx†‹ŒŒ‰ƒznga`_]ZXY\bipw}„‚~|}}|}~~~~}{ztqkcWI=630/...---,,-/5<CLU]djmklkllmjhe]WOD91,**,+/5@HRX^ckrw}€…††…ƒƒ„†‡ŠŒŒŠŠˆˆ‡‡ˆ‡‡ƒ|vl`SQRU[elty}~}|}|||{wpibXMA9688>FXdq~‡ŠŠŠ‹‹ŒŒŒŒŒŒ‹ˆ‚{qf`\^cjrvwtsqpqrrrssqoljlge^\ZYY::<<::;;;99988878888888888777655443344332111112222/////.///..--,++)*('''''''''%##%%$$$$$%%#"######$$$$$&&&')**+///+)&%##""""####$$#"""""""! !!"""""#%)/8EWftznaP6)).59;3*))*+.16;@FLQVZ\adcfihhiihgc_YRKB<7655555555554433322200//...---..--..0011112325666688889977899888777765655668:=ADHILQW_emtwusssrttvvtphYJ>859<ADINRVY\_dhlu|‚ˆ†‚wnky~|p{‚}ujXI:337=EO^KHarsrnfZK>5.,,+,,,,,,,,,-4FSkkuteb`aZNBSfkz}{zyyyyyxxsmf\PDCACGJNRZajr|„‰‹Œ‰ˆuic_\ZURSTX`fnwƒƒ~|}{{}~~~~~|yvuqkbVI=63/.---,,,+++/4<CMW_gjmnlklllieb]WOD91,+++/5?GMU\diotx}~„††…ƒƒ„†‡ŠŒŒŒ‰‰ˆ‡‡ˆˆˆƒ|vlaUQSZ`gov{~~}|{}}|{upiaTI=7669?J\ju‰ŠŠŠ‹‹ŒŒŒŒŒŒ‹†ynd[[^ciqvwsrqqrrrrssrokjhfb]\]^^::::;;;;:99877878877887787776643333322221111110011000///.,..,,,,*))))'&&''&&%%$$%%$$$$$$$$#########$$$%%&&%%&&'%(*''%$""""""""""""##!!""""      !!!"$'+4>Qboy€|sgWB-)1;?A7,**,-169=CJQVX^bfeggjhiihfa]VOLD<97754545566444443221100//...-------../01111233456667766889989887766665666676:=@CEIJMQW\emsvwuspssssuuqj_PC<<>AEJNRX[^aegkpvz€†…xwujfqf[hszyo^M=4249CP[PO_qsrkeZK>6/,*++++++,,--+++8YrlgdpdWVTS]hu{}{{zyzyxxxvoi_UMJJLMPTYahov~†Š‹Š‡‚zre]ZVRMJMOS]fr|€ƒ~|||}~~~~}~{xxupibTI>52.----,++++*05>GOYahknlmkkkljgcZULB8/+++04=GNV]binswy|‚„‡‡…‚ƒ„†Š‹Œ‹‹Š‰‡†‡ˆˆ‡ƒ|ulaVRU\biqx|~~~~}~~}xume^RE:6648AM\ly‚Š‹‹‹ŠŠ‹ŒŒŒ‹ˆƒ~vl`YY^elsvwusqrqqrrrrrolhgc`\\^`b;;::;;;;:98777878877777787775433111111110000001100.-////--.+,,,,)()'''&&&&&&%%$$$$$$$$$$$$##########$$%%%%$$%%$##%&%$#""""""""""""""!!  !!        !"#$)/9K]lw~tk\J3),4<?4))*,/38<CGNSX\adfghhhjigda[VOHD>955655545544444443221100//.-.-------../0111123344566776677887788776666655688:=@BEEILMQVZdlswwvtrrrrtssqlbWNEBDJMQU[_dfikpsvz}€ƒ‚vut|dPD?@D^^XohJ8049?KZNM^lrrmeZK>6/,*++++++,,,,,,+5M]chkcDHMLS`ir{}{yywxyyyxuqkc\XRQPTV[`fnu|‚ˆ‹‹Š†xmcYSLHDBEMU^iv}‚ƒ~||}}~~}|{xwtpibTI>52----,,++++,19@HP[bhlmkllkkkieaXSJ@5/*+-3;EPU]ciorwz||‚„††…‚ƒ„†Š‹Œ‹‹‰ˆ‡†‡ˆˆ‡ƒ|ui^WUX_fmty}~~|}}}||xukf\PB84459DP_o{…Š‹‹‹‹‹‹‹ŒŒŒŠˆƒ}uh^YY^elswwusrrqqssssrolheb^^^_bd<;;;::::98988677887766776566421111110000/11100////00/.--,,-,,+,,))('&&%%&&%%%%%$"#########$$""""######$$$$$$$$$"""$$$#""""""""""""""!!          !"##'-5CVhs}{raR>.+/75/*+,.05;>DJPW\`cfiijjjiec_ZTOGB<765456544554445443222110/..---,--,,--...011112333555566777788898866666665679<=@CEFILKMOTYcltvwvtrrrrrrsqoh^TLHJOSY^bhknstvyz}€ƒ€mYZqhU[bi^PxVf`_T<:?YnbKGN_prleZK>5.-+,,,,,,,,,++,2;PVWbfQO]IELVeqz~~|xwxyz{{{yvphc^[YWZ^cgmry‡‰‹‹‰ƒvk_QLD=8;@MYeq{„„~~}€~}|{zxuupibTI=30--,,++**++-3:BJT\dhkjljjkjigc_XOF<3-)-2;FOV]djprvz{}~‚„††„„‚ƒ„†‰‹‹‹‹‰ˆ‡‡‡ˆ‰‡ƒ}vmbWSZaipx{}~~~}}}|}wuicWJ?62229DTbp}†Š‹‹‰‹Œ‹‹‹‹Š‡†zqh]WX_fmtvtutqrsrsstsqnkfca_`_adf<;;;::::988877768877666655443111111100000000//0///0/.---,,,++*))))(''%%%&&%%%%%$"######"##$$""""######$$$$$$$$"$#"$$###"""""""""""""!!         !!"##%)4@N`mz}ufYI5,+-,+*+-047>CGNUZ^bdgiijjjfa\VQJD@;7665663344554445442222110/..---,--,,--../01111233355456766778878876666666789==?BEHIKLMOPS[bkpuzyusqqqqsutsne[TPQUZ_ejqux€ƒ‡†„vX@PZRP@X`^dlNJA@GKh˜“rICLcsqkf[K>5.-+,,,,,,,,-/Hn}„†„tcfjV[JN\Xeqz|}{xwzzy{{{zxvoga_][_chmsx}„‡Š‹Š‡ƒ|uiZL@7339CP\hv}ƒ†„~~€€~}zyxxwspibTI=30--,,++**++-39CKT\djkkjjjihhea[VMB81,+07BKS]fjoty}~}}~„†‡…„‚ƒ…†‰‹‹‹‹ˆ†††‡ˆ‰‡ƒ}vj_XW]emqy{}~~~|}xrh^UH;3122;FXgs€‰Š‹Œ‹‹Œ‹‹‹‰ˆ†ƒ|tkc[WX_fmtvurqqqrrqrrqpmjeca`aadef;;;:::999877776655665556422221001100////..-----//...--+++++)))*)(('&&&&%%%$$$$$$$$$$$###########$$""####$$""##""########""""""""!!!!        !!""""$(.8GWgsz|xnaR>-*((**,-058>ELRY\`cdhijihd_YTNHB>976335444455553344332211000/....,,--.---../001202344555555556666887666447679:<>ABFHJJLNLNQQYbhptz{vtqqpprtvvqkd]XW[]djqw|ƒ‡‡‡‡ˆˆˆŠ‹Œ~jVQZVZ\cfib\EDLQD@LhwmYGZwsole[K=6/--,,,,,,++-/[~€vx}xiiwkRIV_Xdq|~~|yxwwy{{|{zwojeb`bdimry}†ˆ‰‹‰…‚{qeVF;404=HUamx……„€€}|{xxwwvrkbVJ=3.,,---,,+**/3:DNXaeiiiiiijieb\WQH>5.-/5>HT\dkov{~}|}~„„††„‚„‚…ˆ‹Œ‹Šˆ‡‡‡‡ˆ‰ˆ…~uj^Z\`hosy{}~~~|xph\SE80-,0<J\iw„ˆŠ‹‹ŠŠ‹‹ŠŠŠŠ†€yumbXTWahosvurprrsrqtsroliecccddefh<<;:::9988777766556655542222100///10////..----/./.----++++*+))))(('&&&&%%%$$$$$$$$$$############$$""####$$""##""##""""""!!!!!!!!!!!!        !!!"""#&*3?P_mv|zsj[M6,+*+,/046;AHMTY]adgjmkjd^ZRJEA>9554454444455553344332211000/..--,---..--.0/0012023335555555566667775656679;=>@ABEGIKLMMMOPSV^gnuzzxusqsssuwwtpjd_^`diou~ƒ‰‘ŒpVIIW_mrklnYGQCFGIIKTb^O[tnmic[L>6/,,,,,,,,+++,.>Yhpkfd_nkPO^^Tdpy~~|yxxxzz{|{yvojeccfimqvz}…‡ˆ‰‰…‚{qeTD8218BM[fr}„„„‚€€}|{xxwwvqlbVI<3.,,---,,+**.5<GNXafiiiiiiihe`\XOE92/04<DOYbinsy~€~}|}~„„††„‚ƒ„…ˆŠŒ‹Šˆ‡‡‡‡ˆ‰ˆ„~uka\_cipvz{}~|uph\O@5.++3>O_ly„‰Š‹ŠŠŠ‹‹ŠŠŠˆ…€yrk^VSXaipuvsrqrrrrssssolieddeffghg::;;;;99877766656655444200111110/0./..//..--------,,,,,+**(*)'&&((('%%&%&&%%$$##$$$$$$$$####"""###""##""""""###"""!!!!!!!!!!!!!!!!!!     !   !! !#$'.8GWfpz|wocTC2,--0136:@EKRUY]aeijjjhaYSLGB=:674445555444555433333321100//..--,,----..//./11111112445555554455555445568<<>@ABFIIJLMMNONOSX[ckrwxxtsrrqsvxxxuojfdehlqw€‡Š’‘’’‘””•“Š^;BX]Wgag}pVd\KDCGOU[VOUijnlcZL>70,,,,,,++,,,,6SKNVWaPIWQNXR[Xepz}}{xwxyzz{|{{xsjfcffjotwz}‚„‡‰‡…€zqdSC725<ER]jv‚„‚€€€€}|yvvxxvqldWI;2-++,,.-++),/6=GR\bfhihhiiige`ZTMC8127;DKV^ekrv|~~}{}„…†…‚‚„…†‰‹‹Š‰ˆ‡‡‡ˆ‰‰ˆ…~uk`Y_dkqw|~}~~{wodYL=4-+,5@Rap‡Š‹ŠŠŠŠŠŠ‰‰‰‡…yphZVSWaiortsooqqqrrrsrmkheffgiihge::;;;;9987776665552211210/121221221/..//..------++))+++)***)()(('''&%%%$&&%%$$##$$####$$####"""###""##""""""""""""!!!!!!!!!!!!!!!!!!     !   !! !"#%*2?O`jt}}wl\O@222568:?CGMQW[_bfhijgb[TMFA=:7654444444444444543333321100/...--..----..//./111111334444555544555545568:<=@BCDFHJJKLNNOONOSTY^hnuxwusrrqsvzzzwuojfijmt{ˆŽ‘‘“••–——–•‘u^VYP3]s‚|wj\TWRSMMYWQNU^fd`YMA7.,,,,,,++++*,2A]aPZ[Q]T:BEJT^eqz}|{xwxyyy{|{{vojfehhlpuux{|‚…‡‡…€zqdSC837>IVaoyƒ…‚€€€€€€~~}|yvvxxvqldWI;2-++,,-,+++-29AJT\bfhihhiiigd_YQJ@725=BJS\bhnsw{|}{zz{…††…ƒƒ„…†‰‹‹Š‰ˆ‡‡‡‰Š‹Š…~tia^`hlsy|~}~~{wodYJ;4-,/6CXdt€ˆ‹‹ŠŠŠŠŠŠ‰ˆ†‡…€xmeYURXajptrrqpqqstssrpmkjijjhhhfd^<<;;::998766665533331011021146674310//..--,,,+,,,,++**++)))'(())&&%%%%%#%%%%################""""$$""""""""####""!!!!!!!!!!!!    !!    !  !  "!!""#&,9EUcnx}zreYK;669;>>CHLRTX]adfhigc]UPJB=8766654344445544554433333211//......-------..../11001243334455554555443688:<>@BDEGGIJKLMNNOONPOQSYbjqyvttsrqsvy|}ywrmijinuz…‹Ž‘’˜™˜˜™š˜“ˆ„kSy€yob]LEV^YUQOMOPRYa\QC71--,,,,,+,,-*-5ZgWTaVcT:GLSX^hu|}}zzywwxz{{{xslgcccfiloruyy}……ƒ€zrdTE:58AN[gr{ƒƒ‚€~€€~{zyvvwxwslcVH;2-++++****+.4;FNV\cfghgghhhhd_WOG<59<BHPX_dinrvyywvxyz„…†…„ƒƒ…ˆ‹ŒŒŠŠ‰ˆ‰‰ŠŠ‹Š„}ujbabjpuz}}}~~€€€{vndWG:3,*0;HZjx‚ˆ‹‹Š‹‹ŠŠ‰ˆ‡„‡„vlbUQRYajqvursqppqrssqomllkljjhddaZ<;:::::8876655643321//001/1458;<:8531100....-+--,,++****))(''(((&&%%%%%$%%%%$$####$$########""""##""""""""####""!!!!!!!!             !!!!!""%%)2<IZhr{}vmcWG<;=?BDIMRVX]^beehhf`YSKF=976554664444455665544333333110///....-------..../110012243344444434445578;<<?ACDFFHIIJKLMNNOOOOPORV]dluxvtsrqsvwz}{ysnjjmqsv{€…ŠŽ‘’•—ššš˜˜”‘ˆ…|{|€€{sg\NGV[XZPLJMOLLY^VH=4.+,,,,,,,,,,-5E]\G[VWOFWVG>Pdmx~}zzyxwyzzzxuojdbbbbgkkosuxz}‚‚ypeTE96:CP^jv„…ƒ‚€~~~}{zyvwyxwslcVH;1+*********06=GOW_fhiggghhgfb]WOG?<@DIQX\bhllruvvsrswz}‚…‡†ƒ„„„‡ˆ‹Œ‹ŠŠŠ‹‹ŒŒ‹Š„~uk``flrxz|}}~~€~zskbSD81,+1;M_n{…Š‹Œ‹‹‹ŠŠ‰ˆˆ‡†|si^SPR[bjrttrrrrrrsttsqonlllljhf`[V;;99999876665343221///.//2278<>BB@=9554211/....---++*)))))((''('&&%%%%$$%%%%&&%%$$%%$$##########""""""""""""##""""!!!!!!        !!!!""#%&*3BN^ht}zsjbUGABCHLPTWZ]_bdefgeb\WOGB;85455556655445566555544442200000/..----..----///011011212222222423435678<=>ABDEEEHIHIKLLMOOMNONNMOPU^grvvtststtwy|}zuoljllmpsz„Š”•–˜š™—•‘‹„€|{{}~€{tk^RNUOPUVVMGKOSSTWRG;4+..-,,,---,..05:=QNQEDOPC>Pkgw|{xwwyyyzyxutlib[]^aeigmpquwy{~}wlbRF89=HTbny‚†„ƒ~~~}|{yxvxyxwslbVG90+))))**))+18@IRZafgihhhhggeaZUNFBAEJPY[_dhkmprqomorvz~€ƒ„…„„„„‡‰ŒŽŽ‹Š‹‹ŒŒŒŠ„~rgbbgmtyz{}~€}xri]NB7.+,3?Obrˆ‹‹Œ‹‹‹‹‹Š‰ˆ‡†yqg[QPR[clquvtsrssttttrrppolkkkfc\UP;;:9998876554333221///./.16:;@CFIFDA><;855431120..,,+***))((''('&&%%%%$$%%%%&&%%$$$$$$##########""""""""""""##""""!!!!!!        !!"#"""#%'/:GVcnx|wrjaSHHKNRVZ]`abdefedc`\UNF>966666666655555566665555443310000/..----..----///0//01011233545555555789<=AACCEGHHIIIJLLMNNNMLMLKHIJOWblsvusqrttwy{|zuolihfgglpy|‡“•––˜–’‰‚yz|~~~yqj]UURRNNLNIDGOPNJMPJD9----,,,---,--.3=PWPLCISQCAOmiw|zxwwxyyzxwtslg_YXZ`fknolnnorvy|}{ukaPD89@JVdq|ƒ‚€~~~}|yvvvxyxwslbVG90+)))))))),29AJS[bfghihhhgfb_YUMIDGJRX^_bejllmlkiilpuy|ƒ„††„„„‡‰ŒŽŽ‹‹‹‹ŒŒŒŠ…~rhcfjpuz{|}~€|wqh]N@6.+*6CTdt‡ŒŒŒ‹‹‹‹‹Š‰ˆ‡„wndVOOT[dlttsssrrrrsttssqpoonmhc_WNI<<::99888554544121/..../036:=AFJMMKHGEB??<<;87765411.,))))(''&&&%%%%&&%%&&%%%%%%%%$$##$$########""#####$""##$$""!!!!  !!          !$$##!!$&+2?M\ht~|vrkdYTRVX\`ccefffifda_XQKC<6687667777776656668976553333100000/-./....-/./-/01224455566866786688;>???ACDFFHHIIJJKKKLJKKKMLKJHFCDIS^iqtvtsssuwxy{zuqkfd`_behpw{…ŒŽ‘’–•••“Ž‡~yyxz{xsnha^[YVTMMJIJFCGKGCHPMLH/).-,,+-,----,06FXQQIQUGA=>Jky|{zwvuwzzwuurldZWWY^gmcF@Dcknquz~{uj_PC9=DO]hu}‚‚€~~~~~~~~}~{zwwvvwxxvrkaSF80,(('''(()-4;BKS\cfghhiiiifc`[XRLKLQV\_ceiiijihdddintx{‚ƒ„„„……‡ŠŽŽŒŒŽŽŒˆ…tkggmsvy{|}}}~~€xofXK?5-+.8FXjw„ŠŒŒŒ‹‹‹‹‹Š‰‡„~ulbWPNS^gmttssqqrrtttuuutspoolf`ZQIH<<;:98875554332210...../036:?DHLRRPNMKIHFDDC?@@><;9952-+*))'&&&&%$%%&&%%&&%%%%%%%%%%$$$$#########"#####%$$#$$$$"!!!!             #"##"!$&'.8FXepz}{wrle`^^]adffijiiigc_[TMF>999886677777777888:89976643301000000//0/0//00.144456668::<=>=>@@ABBDDFFFFHIJIIIKKKKLLLLKKKKLKLJHGCB@?CLYdqtvtssttwyyyxvpib\XWZ\`krx€‡Š‘••–”’Žˆ|yywvtnecaZYWVYWMKLJE><CGGGIPSS\L%-.,-,+,,-.--.4LMWf[ST@<7:Iizz{xvvuwyysrurjd\XZ[jhM=D@8]iejsyzxsh]L@;?GT`mw€„ƒ€~~}}}}}~}{ywvvvwxxvqjaSF81+(('''((*.4=FNW^eghghiiiifca^ZVPORW[^aeghhifb_^_cimtx{‚‚‚‚„†ˆŒŽŽŽŒŒŽŽŠ…|sjiiotz|{||}~€}wofXH=4--1;L\n}„ŠŒŒ‹‹‹‹‹Š‰‡„~th^RNPT]elrussrrsstttuuuutqpmhc[SMHJ;;:98777543332101/--.....26;?EILRSSRQOOMKLKJIIJIFDB@=951.*)('('&%%%%&&&&&&&&%&&&%%%%%$%%$##$$$######$%$%%%%%%%$#""!!         !!   !!!!$&(-5@Q`lv}|xtplkhhhkkkkkjjieb^YRKD?;9999777788988889;<>??>>:64221/110/21132134577;<<<?BBCGGIJLLMOOPRRTSRTTSSSSRRSSRTRPPONNLJKKIIIFCB>;:9=IUcotusssstwwyzwtpe\SPNPS\cmqy‚ˆ‘‘““’‘Œ†|xwwwpf]YVRQMNVQFGFC;;?CGHKMOMOQ]@#*,-,-,,,-,--0<<Wc`^S=:3AZp{~yxwwvvusjhppje`\\aZ\UE@7Jcaajswvvph[M@<BJWdoz‚‚€}}}}}}|~~|zxvtutvwwuqj`TG80+((''&'((06@IOZaeghhhhhjhhfb`\XVVVZ]`dfeedb_YXX\bhotxz~€€‚…‡ŠŽŽŽŽŽŽŽŠ…~wmklqty{|{z|~~€€|upeXI=4..5>N_o}‰‹ŒŒ‹‹‹‹‹Š‰‡†„{qf[QOQY`iqttqqqqrssttuwwutrolg`XNHEJ::8877775442220/..------/247=BGKQRRRSRPONMNPPPQROPLGDA=940+)('''&&&&&&&&&&&&%&&&%%%%%%%%%%#$$$$###$$%%'%%%%%%%$#""!!         !!!!!!  !!!"%').4>JZfq{€|ywtussqpooppoojgd^UNHA<;999988889989;;=BFIJMNKIC@853223333467:;=<?@DFFIKPPPRUWWY[Z]aaacdgffeehgeeeeeddba_]\[XTQNLJHGDB?<:855<DR^jtvtssstvwxwwtmcZMGAELU^iov~‡Œ‘‘“‘‘‘ƒ~zxvwxskc]XSMJMRQJFDDAACCGLOQNLNJ^iL*&--,-,,-,-/07>`k__K:96Maqy}ywwwuvwp_V_hiea\aS=EH?KX`YW[fryxuneXL?@EN\it|‚€€}}}}}}|~}|zyutrrsutqoh^RE80+((''&'),19CKS[cghhhhhhiihhfea][[[\_acec`]YWTRW^ekqtxz~‚…ˆŒŽŽŽŽŠ†€xpmntxz{|{|}~~~€€}wqgZK=4//3?Rcr€ˆ‹Œ‹Œ‹‹‹‹‹Š‰‡†zod[QNSY`jqssssrprstuuvwwwwspme^ULEDP888877766431111/.---,,,,,.059?CGLPQQQQQPPOQSTTVVSUSSPKGA<52-)('(''%%&&&&&(''%&&&%%&&&&%%%%%%%%&&$$%&&&&'&%%%$$$$##""      !!! !!"""$$&+/4;DQ`js|~|zzzxvxvvurtrrnid]UNF?;:;;::9999::::=AGPTY\_`^[UMA654549;=@CEFIMMOSVVZZ\^_bedghiknmorssttuvuvvwwvvtuttrpooligd_[VOKGD@=87434<GP]irttssstvxvyvtndVLA:>GR[enu~…Œ‘“‘‘Š…zxvuwvolf^XRVWTQKHDBACBDDILNTSLMJDl\9+---,/2///1@\rm_[C98>Xf]p|zxvvvuvo]]b^`[XZU[I^F@D]VMQblqurspgYKBBHS_lv~}}}}}}}~}{xvurqqrsrpmh]QE82+)((&'()-4<ENW^dhiihhiihjjigfc^\\]_`bcdc]URONPW_gmruy{~‚…ˆŒŽŽŽŽŽŽŽ‘Š‡‚zrqqvz|{zz{}~}€|xpfZL>5229DVgv‚ŠŒŒ‹Œ‹‹‹‹Š‰ˆ†xnbYQNS[bkqrrqqqqqrrtvwvvwwuqoe]TJEHU8887776534311/00.---,,,,++.269>BGHJJLLMLNPPRSSWYZXXXVSPLGB:4/+)(''&%&&&&&('''(((''&&''&&&&%%&&&&&&''&&'''&%%$$$$$$$"!     !!! !"""#%%(+/27>JWblu}~||||z|zzywwuusmg]UNE?=<;;<<;;;:9;;@EMV^eknprqoj`QC;:=@CHIMQTVXZ[]cdgikmnprrqttuwyzyx{|~}~~~~}|}}}|zzzywtpjf_XPJB=94348>FR^jsuussstwxwxxtmcP@228BNXaju}†Œ‘’‘‹…|xvvwxxuqjha^XSPPKGFFGEEDFHIOYSDBBJ`h6)+--,..11;OhhVWO999J`eS]{{yuuutoh^c_VWUPOLOb\]]EOR_gsmtp}uqdWJACJVcox€ƒ~}||}}}}}{{zyvrqqqqrrpmh]QD70,)(()'(+.6>IQX`fhiihhiihjjjihfa]]]_aa_]YTQMJLPW`hmrwz{~‚…‡‹ŽŽŽŽŽŽŽŽŽŒˆ…~uttx{{|zz{}~~~€€~yrh[MA833;GXhxƒŠŒŒ‹‹Š‹‹‹‹‹Šˆ†xnbWRRW_fkqrroopqqrrtvwzzyxwtpi`TKGJ\99976553331///....,+++,,+++./379=ABEGGHIKNNNPPUWXYZZWWVSQIC>84.+*'''&&&'((('((((''''''''')%%&'''()(''&''''%%$$$$%%$$"!      !!!!!!""!"$&(*,/26<BNWdmtx|{}}}}~~}}{{yxvsld[RIB?>>><<=<<;=>AGQV_isz}ƒ„ƒ{qcUHEHKOSX[_chhlmnqrstuwwy|z{{{|~~€‚ƒƒ‚ƒ„…„„„‚‚‚‚ƒ€}zuoibZQLF@<>ACIR^hquutsssvvxyyxy{{|^/-?IS^jt|…’’’ŽŠ…€|ywxvxyzxxricWVQRNMIKHFHEFGIMVLCADB?UK$*/,//1<`SKQP\SN9;;Q_jketzztswqeb^ZRPSQJJFDRSdaZJNOWbjih_WlbUICEOZhp{€~}|||||||{zywtponnqrqolg]PC70+)(((')+18BJT[bgiiihhiiijjiigd___^^_^YWPLIGGKQXbjpuvz|}ƒˆ‹ŽŽŽŽˆ…xuux{||z{}}}~€€~|xqh^QD;44>K]m|‡‹Œ‹ŠŠ‹‹‹ŠŠ‰‰ˆ†€xmaWTT[agmqsspopqrsrsuwz|{zwuohaULIPb8876544200////..--,+++++***++-/1488:==@CCEFHJJPSUWYZ[XYXXRMIB;62.+('''')))(())))((''''''')''''(())))('((''&%$$$$%%##"!      !!!!!!""!"%'(*+.25:@ENXdjqsuy{~}~~|{yyuld\TMFC>>=<<<=<?DIOX`kv€†ŠŽ‘‡}qfYSV\`dgloqstvwwy{{|}}~|}}}{{€€€€‚‚€‚‚‚‚„ƒƒƒ‚ƒ‚ƒ………‡†‡…ƒ‚|xtmf`YVRONNPV_irtttssstvvw‘œ ž£ z(3EP]gu‡”“‘‰†€|zywwxy{zvkiaQRXYRRNKIJJIJOQTQQA6DA<;WT,(121<OgoWb^YTM7<AS^dquwxwvtvrdYOR[SNMMJKQ_[ZZJS_^_\I[aQ^laVHGJR\hu}ƒ~|||||||||{zxuromnmpppnjf\OC70+)(((').4<GMU`fhhihhhiiijjihea]]]\\YVQLIEBBFLSZbjpuvz|}‚„ˆ‹ŽŽ‘‘ˆ„|yyz{||z{}}}~€€~|zsh_RF=66?O`p~†‹ŒŠŠŠ‹‹‹ŠŠ‰‰ˆ†wl`VUV^djprsspopqqrtuuwzz{zxvrle[QNZi7765333110//..----+++*))**))**(+--/1325:;<@ADEHLORTVXYYYZXVRNGA;51.,)(****)())(()(((((''(())))))**+)))'((('&&&%%&&$$#"""   !!""""$%%&()-.046;@HOW_fimpsw{{}€€€~}~}{upicZSMGB?@>=>?BHOX`kt~‰”—••”†|reacgkptuwz|}}||}}€€~~}}}}{z{{{{}~€‚€‚‚€€‚ƒ„†‡‡„†‡…„€|zvsolgd_\\_fksuvuqsrstwƒš£¡¢¥«®¨h,>OZiu€Š‘•“‘ŽŒˆ„€|{ywwxzzzwnkcODT`XYQLMKLQRUUPJBOFE<=:BcXJVF0^ysrnW>QUQ:;JY_VivrpvxvvriURW]THJJJLRTMT[L[UV\U@`g^_nbRGHKValv~€~|{{yy{{{{|{zwsponllooonje[OA80+*)((().6>HQXbgijiiiiiijligida^ZYWXUOHEA=>CIPW]fkqtxz}~~‚…‡ŒŽ‘Ž‘‘‘‘‹‰…|}||{{{{||~~€}{{rh^SG=89BSds€ˆ‹‹ŠŠ‹‹‹‹‹‹ŠŠ‰‡}vj_VRW_enrutspopqrqvuvx{}~~|zwqjcYXbr7766433110//..----+++*))**))))'*))),+-.10258<=@CEIMQUVWX[Z[YXSLD?:61.-,+++*)++)))))))((((())****))****()(('&&&%%&&$$$#"""  !!""""$%%&'+-.0469<@HNUZ`ddhnpsxz||~}€‚€€|ztnha[UMGEC@@DINV`hp|†”—˜––—‘Šwmknrsuw|~~~~~}}}}}}||||||zzz{{{}~~‚‚‚‚‚‚‚‚€€‚ƒƒ„†„…†‡‡‡„ƒ}zwwtpnmrtwwwspnnx„—¡ŸŸ¡¨¬°±®’48IZiu‚Œ’•“‘ŽŒˆ„‚~|yxxxzz{{yrbNCPSS^XQQIMUVWQN><MJC::;:Dc^Rlc\pifƒZ<P[T==@FLBXŽ”{oxxzxrbVcbRIMKJJMRT^][VSJD[hgd^`s\QKJKXcny~€}|{{yy{{{{|zyurommllooonje[O@70+*)(()+18BKT\dhijihiihhhigeb`[XXXSNIDB>:;?DLSZagmsvy{}~~~~‚…ˆŽ‘‘‘ŽŒˆ†€}}}}{{{{||}}€}|zwri_UJ@:;EWfv‰‹‹ŠŠ‹‹‹‹‹‹ŠŠ‰…ui^VR[bhosttspopqqsvuwz{}~€~yunh`bmy775543120/..--,,,,++++***)))'''())))**))*-..0359:?CGMSVY[]__]ZVPJC?:631,,,+**++,+++++****)+,*,,,++**++))**('&&&'''%%$$##"!     !!!!""#%$%((,/0479:>@DJPQTW\cginqvx{~€ƒƒ}zvohaXVQKFGKRXagpz„Š“—————’Œxssvwyzz{}}~}~}{||{{||zzzzzxyzzz}}~~‚‚‚‚‚‚€‚€€€‚‚‚ƒ‚ƒ…„„„††…‡‡„‚‚€€}}}}~|xsv…—¢ŸŸš¦«®¯®«šA5GYft‚”•”‘Ž‰†ƒ||zwxwz{|{si`SSR\hbWTLNWXTRK85IC=;:7:>Thf^D,`UUoVRQZI<>KUH;V}zZTabfd_]ZasiGGJJILLTXXPMINQdc`SR_cnmNIP^hs{€~|{zzyz{{{{{ywsqnllklooomjd[PB70+*)*))/4<EMW_eikkhgghggfddb`[YWRPKFC=876<BHPU[`hotwz{}~}}~‚…‰ŽŽŽ‘‘‘Ž‰†‚}}|{{z{|}~~~}}zyvpi`UMB;=J[jy…ŠŒŒ‹‹‹‹‹‹‹‹‹Š‰„~tg]WY]flstutsonpqpsvuwz|‚‚}ytnjnv€55443211..--,,++++****)))(((((('''''(()))())*,.1258>CHOUW\^`^^\ZUOID@=731/-++,+,,,,,++++++,,,---,,,,,,+***)'''''''%%$$##"!     !!!!"""#$%((*,/257:>BDDDEHLSY^bfimovyz€‚…‰‡„‚|yvpid`ZVUWZahny‰‹“––””“‡ywwxxywz{{z{{yxyyyxxuuttrrrstuvvwwzz}}}~~~~||~~€‚‚€€‚ƒ†‡ˆˆˆ‰ˆ†……………‡…ƒ€“ž ›ž¡¦ªª¨¦¥ž–T1HXguƒŒ’•”‘Œ‹ˆƒ||xyyz|~}|xrd_VWadb[RPSPRVPK7.38;;88>CLbqkDVvkYTZm_P@>?QJA@B:9<=<<<==GOQe\BEJKKKHOPUSPQRVWP=MOTTabWJVakv~~zzzzy{{{{{{ywspmllkloopnjd[MA60++*)+,27AJRYagjkkjigfffdbb^ZVSOLGB=77337<BHPW^ekouy|}}~}}~‚…‰ŽŽŽ‘‘‘Ž‰†ƒ}|{{z{}~~~~}|zxuohaYPE?AL]l{†‹ŒŒ‹‹‹‹‹‹‹‹Š‹‰„~tg^YYahovvtsponpqqrvuwz{~‚„…„}yutx‡5554200/.--,-,++**(((())''''((('''((''(''())****,./5:AFNUX\^`a_^[XROJEA<;80--++----,++,,,,-...----..,,+*)))(''''''%%$$$$"!       !!""###$$%'')+.1369=>>??@DGLQW\`cgimpuz~†‡†‡„€}yuroieddfkpx‚ˆŠ‹Ž””“‘‹…}xtuwuvvuuvuuwtrromkjjhgggeffdfiklmpqrstuuuutuuttuvvwxy|}~‚‚€……†ˆ‡‡‰‰‰‰ŠŠŒ‹Œ‹‰“Ÿ›™› £¤¤¢œš–”‘s3DXguƒ””““ŽŒˆƒ}yzyyyz|}}wsic][ddecXXXYVVSC62/7=<:7>KSxx]HPhpjgXUQQ@A?<7>BDFGGFEGFFMTF?BBCMPNKKJIIOVWYSEEO68FUUGCXMXdmx€}zyyyy{z{{{zxvsomkkklmonlhbYK?40,+,,.18@GNU\djljjhhhgffc_^ZUQLHB>:4/136:@DJQY`hmswz}~~~|~‚‡‰Ž‘‘‘‹ˆ„~}{{z{}}~~}}zyvrngbZPGBEPao}†‹‹‹ŠŠ‹‹‹‹‹‹‹Šˆ…}rh_Z[ckswwvspmnqqqrtvwwy~ƒ‡ˆ‡…‚||ˆ334211//.,,++,++**((((((''''((''''''&&''')))******,.19?DLOVZ]_aa_ZXXUQKGB>730..-...-,,----..........---,+++*''''''&&%%$$#"               !!""###$$%'')*-0377;<<<<?CGKPVY]]`dfjmrw{€„ˆˆˆ‡…}}xusqprt|‚ˆ‰ŠŽ““’Š‚zurqsrqrqoollgeeeaa^]YXWUUVWWWZ\`abdhhiijjjjihhjjihiknortwz|~€‚„„„ƒƒ„…†‡ˆˆŠ‹ŒŽŽŽ—š˜”˜ž¢¡œ”ˆ€|’‚AFXguƒŒ’”“ŽŽŒŠ‡ƒ~|||zz{z}}{v_a^V_^ddZWV^_QWC9329;;978@HE5=IKCAloiUG>:CA=GDB=<;;88599@TNF@?EJJLKIFHNYb[UMFJUWNEKJEWNU\eqz€~{yyyyxyz{{{zxtqmmkkklopnlhbXJ?4///0259=DJSZ`gkkjjigfffea_ZVRKDA;60.,/25<AFMT\cinswz}~€€€„ˆŒ‘‘‘‹†…ƒ€}|zzz{}}~~}}zywtohd\SJEHRcr‡‹‹ŠŠ‹‹‹‹‹Œ‹ŠŠ…}re]\ahmuxwuspoppprqrtuvy~ƒ‡‰‰ˆ…‚ƒˆŒŽ220000..,++*))****(('''''''''(((((''''&'))))********-06:@GNSZ\\[^_]\[XVSMIC931...0.//..//////////.//---,+++*))((((&&&&%%$#!!!!     !!!   !!"#$$$%%%&()*+./369<===AEGLPTVXXYX[_chouz…ŠŒŠˆ†ƒ€}|zy{}„‰‰‹‹ŒŽ‘‘‘‘‘Ž‡~sqpmmjjhdc`\[ZXTRPOMJHHGECDHHIKMRRVXZ[^```]^\[]\^_\[[]]aejnrux{~‚‚„………††††‡‰‹‡}„•—•“–œ¡¢™‰|y{pxŒŒ‹‰\LXhv„Œ‘“’‹‰‡ƒ}qbozzy|€}‚~i[WXZ^dhYHJNK=KG7C::;95669;D;7?GAMSSvdP?<CCJH?F8Jr}wsnVT=MjPJCFJHGEFCDGOXVONKFDGGEWIQYSS_lt{}}zyxyyzzy{{zyvtqnjjkllnqomgaUH@64579<@EHLRV^dillkkhfgddba\WRLE<72-))*.27<CHOX_gjpuwz}~€€‚‡‹Ž‘‘‘ŒŠ‡„‚€}{||z|~~~~~}zywsoid]VMHKVfuƒˆŒ‹‹ŒŒ‹ŠŠŠ‹‹ˆ…|sf^]cirwxwuqpqqppqrrrrsv|‚†‰ŠŠˆ‡‡ˆ‹Ž110011/,*)**(())))((''''''''''''&&''''&'))))))********-28?EJNSWYZ]_`a``_YSLD:200.//00///000000000/00...-,,,+))''((&&&&%%$#!!!!     !! !!"####$%$$$%%%&(+,+.057;<=@@EIJMOSTTUTUUW[^fmu}‚‡Œ‹Šˆ„„…‚~„ˆŠŠ‹ŒŒ‘‘‘Ž‡zrkhfdb][XUSPKHFB?>=;8776789>ACEHKLPSUWYWWVUVTSRQQPPOOOOQTX[aejovz}„……„„…………‡pŒ”™›—‹}~~|n|ŠŒ‹sLYgv„‹“‘‹‰‡…‚iamcz…‡ˆ‚wjb\VTa\FCHQRHRb]L::;6565649E@6Xh_UNTYOF;?<@AEI=4c{nWdjMKLHJIKMJFCBBAAHLMMKE=?@@KPEWX\_blu|}}zxwwxyyzzzyxzzrkkhgkklookf`UJ@::;?BDHNRVY]bgkmmiihhffd`]XSNH>5/,)))*.27<CHOY`eksuwz~€ƒ‡‹Ž‘‘‘Ž‹ˆ†„‚€}|||}~~~~~}{xvrmie_XOLNXhv„ŠŒŒŒ‹‹ŒŒ‹Š‹‹‹‹ˆ„{qg`agouzzwurqqqppqrrrrrty~„ˆŠŠ‰‹‹‹211/00/++++*)(((((''''''&&&&&%&&%&''''(())(())******))+,.4:@EINSXY^`abbde^ULA610/.000001221123311111////..-,++*)))(('&&&%$""!!     !!!  !#&()('&%#$%%'$&)*+,/259<?BEGIKNMPRUUWWVWWX_cjoz‚‡ŒŠ‡……†††…„„…ˆ‰ŠŠŒŒŒ‘’‘‡|qf^]ZURNIC?=:9521223022259=?BFHJMPSUUWWWWVVWSPONKHD?>::>BEJQSY_dipw}€ƒ‡†…ƒ‚ƒ„‡ŠŽ‹Ž—œœ”ŒŠ„wsƒ{r|{{‚ZZguƒ‰’Ž‹Šˆ„†‹wpqro‹””‘Œxkoh]Xfc][FGOZcmf;MG:78678659BDEZ`TOHIJ@@=?BNZcH<2Wzm]MPXRNJMNJGFLMFAA;;?DGIIFIJLJOO?XXRbhox~~}|ywvvwwvyxzwvohoz‚~sljorjig\SLHCEGJORTWY[`fhjklkkjhgfda_[VQJA8/+(()((,38;BLSZagmrwz{€€€„†Š‘ŽŽ‹ˆ…ƒ}}{}}~~~~}|{xuqmjfaYSMQ\lz„‹ŒŠ‹‹‹‹Œ‹‹Œ‹Šˆ|rfcgisy{zvvsspooopqrronquz…ˆŠŠŒŒ‘‘1//.--+*+***((''''&&&&&&%&&&&%&&%&''''(())**++********+,,,059?EIMSY^bdfiif^TH<3101/0111122110222111100//..-,++*)))(('&&&%$""!!     !!  "$',/00/-+'&%$&&'(*+/359=@CFIKOPPQRRTVXZ\]]^aejrx€†ŒŽŒ‡……†ˆˆˆ‡‡‡‡ˆŠŠŠŠ‹‘”““‰|l\QNLF?;9531./0....-/2336<>BEHKMPRTWWWWXXWVTSRNJFD>:41/..28=BIOU[`gnvz~}€zvy‚Š‘™›™•‘ŽŽŽ‰{nsmly€Ž›–v~v€Ž‚zƒ‹‘“tp}px’”‚cagjcU\[\PPOIZdX9MK=8878;76=?GcTN7<68=FDAACKW]CF<a\be[@?JDNZVPHFFHC=>;8=AGIIJLLNOQXZXYXZepy}}|{xwuvtyxssvpfJL[p†™`X\SGK[^YQLHJLQVXZ[^cfkmnmnljihgecb`\TMG=4-*(()((,27=ELS[ahntxy|€€€„†Š‘ŽŽ‹ˆ…ƒ|{zz}}~~~~}}{xsolifa[URU_m}‡‹ŽŽ‹‹‹‹Œ‹‹Œ‹Šˆ{sifimtz{zwussrpoopqppnkmqv{†ˆŠŒŽ‘‘‘0/..--+)*)(()('&&&&&%%%%&&&&&&%%&&''(())))))********++,,---.06<AFLQX^dglmke[NB711222122233333222222210/.------+***(('&&&%$$"!      ! ! "&+/4<>>>960,)(')))*.169=BFGJLOPRTTTTVZ\`deeefiqu{€…Œ‰‡…†‰Š‰‰ˆˆ‡ˆ‡†ˆˆŠŒ’“’ŒˆzhREA=9731000../----..048<?BFIJLORRVXXZZZZXXWSSMKFB;60---++,017;AHRY`fmpvuŒ’“•šŸ™„m‘‰’’‘’ƒ¡´¼½¾¾¾»°ž‘}y‡qt‚‡ˆzY{ƒkz‹‚mcuxwj\fjkheb`RTUKEOb\+(=><;9;@E<98:FC@G?:987L@ACEJUSFI_]SZeRRX9BhrhUIFDABB?:7;@CGHIKMPRRUX[[X`foz~}|zwvwuuyt_`whbkrnna`JGFINNEYb\UPPQVY[]`deimopomkijhhgee`]ZTLD;1*)))())-49?FNU\cjpuw{}~€€€„ˆ’Ž‹‹‹ˆ…ƒ€~{yyz}}}~~~}{yvspliea\WUXbp~ˆŒ‹Š‹‹‹‹‹‹ŒŒŒ‹‡€{slkmrw{|zxtssoonnpqqnkhhlpv~„ˆˆ‘’/...-+*)()('((&&&&%%%%%%%%%%%%%%%&''(())))))********++,,,,,-,.29>CKQY`hmrqkcUH:32222223344444333333321/.....--+***(('&&&%$"!!        "%*/39@GKKKGC>70+)*,-/157=AFJLOORTUVVXX\`ehlmnnnprx}†‹ŒŒˆ†…†ˆ‰ŠŠŠ‰‡‡†„††ˆ‹Ž‘”Œ‡{iQD<77353//....----0036:>BDHJNQQRVWXYYZZZXWUURNJF@951-,,,++,,-05;DLT[beuŽ”—’”•™žŸ˜ykomŽ’‘’’’¡¶»¹»½½½¼»»´–‡ƒˆvpihjk_]`vwy{kUVrƒnUZjmjll`]TQTNJSvu<413;<<:@KG847?FDLE;<9;J<ACEIUKH=MieZVJVO;nnniXLE@>=>A<8:<@CDGIJKLNQV[[X]gqu|}xxtsvvmUsmld]^inf^CDNPQJDH]le`ZUTWZ\^adfiloqqomkijhhgee`[XQJB90)()))*,08;AIOW^ejpvx{}€€‚…ŠŒ’ŽŽŒŒ‹‹‰†ƒ}{yz{{{|}}}zyvsqnjgd`\WW]esŠ‹‹‹‹‹‹‹‹ŒŒŒ‹‡€{spnquy}}{wsssponnnnnkihijmqz€…ˆ‘’--,,++('('''&&&%%%%%%%%%%%%%&&&&&&''(())))**********,+,,--..--.27:?JR]hmqsodXK=42222123444443333443212311/00..,,++))('''&%%#"!!!   !"#$(/5=GMRVY[VRJC<60./0449=CFJLORRUUWZZ[\`bfmrtsqqsuy~‚…Š‹‰†……†‰‹‹‹Š‡…„ƒ‚†‰Œ’’Ž‹€o]RLD<84541--//---.2268>BEIJLOPSSVWYYZ[ZZYWUTPLHB=61.++,,,,,,-148?INTYm‘™––ŒŽš”‘}]5c…„‰‘””Ÿ¸¾¼»¿¿¾½¼¾¶³º¤„ˆ†‰|_Rgcspgwz{zlW\dXL[cfb]agWHGNMLZmhJ:9ID><8DA9673EYSA39<<IMBDECJVED9Mwpk2B@Auyng`RNF??=>><;:>BDCDFGFHJPSWY[]gqwxzyvtslrnmorfG6@daHKKLLHFL\kpkhc]YWYZ_achikopqpnljhhhgfdc`ZWOG?5-)'''+,04:ADKRZ^emrvy{}~ƒ†‰Œ‘ŽŽŽŒŒ‹‰‡…‚€~|zyxy{{{|}}yvsplihfc`\[Y^gu‰Œ‹‹‹‹‹‹‹ŒŒ‹Š‡{uqruy{~}zxtsrppoooopmjgfflpw}‚ˆŒ‘’--,,+)''''&&&%$$$$$$$$$$$$$$%%&&&&''(())))********,,,,----../1/.24;DLXbjsvqiYL=53323234444556666444323331/000.--,,))))('&%%#"!!!   !"$(-5>HRW^degfaYQGA;5457:?CGJLNQTVYYZ[[\`ejnrvvvttvyy~‚†ˆˆˆ„„…†‡‰ŠŠ‡…~zyyzƒŠ’‘…ylc\WPID:71./..---0168:@DHIMNOPSSVWYY[[ZZXXURPJE?94/-,,+,+,-.036<BHNTT…ž™š~kyn]pxŠ•˜•Š{\]„•¶½¾½¼½¾¿¾¹¦ls³¸°†˜¡wIZhuz|{{{scRWbOQQ_QAAKX^QNLIOLQX>8FEA<5COQ987<I`JLPNUOCDBRLJTBF<VxkD><<qywqefXHFFDB@=:9;=@CDFGHIJMQRVXWWhuxw{yyvsn`dmjoji_Y_OJKKHDSeklnnmkfa\Z]^bbeglmmooomkjhhhfecb^YUME=4,)'''+/38;BELTZ`hmrvy{}~€€‚…Š‘ŽŽŽŒŒ‹‰‡…‚€~|zyxy{{{{yywtrojggec`\[Zakv‰ŒŒŒ‹‹‹‹‹‹‹‹‹Š‡{uqtw{}}zvusrppoooopmjgffinu{…Œ‘Œ,,,+*(''&&&%%%$$$$$$$$$$$$$$$$$$&&''(())))******++--------..1311238>GT`jstqj[M<54433245544666644555434331/011/.---*)**))'&$"""""  !#&+3;GPXahnoqqlg]TLF?<:=ADHJKPQSVX\[\\\`chnruvvvuvvx{~‚„‡‡†„„†„„…„‚‚~yvvslou|‡Œ’’ŽŠwqmia[VOH?93/-.-/038=@BFIJLNPQSTVWYZ[[ZXVUTRMIB<72/-,----./028=@FKOTqœœ ¤“rYghu€w”Œ‰Švvo»¾¾¾²°¼¾¿½¸“v§º¯…˜ƒQ<H^ov~xtwzoTAsgZY\^H=?;<MaPMNMKBKOD@@A=8BID89689>6OVO@KCFC^YLQAE:nyM0=Bprwxteh^JGGDC@:78:<>ACEFHHJPUUUXQXmvzxxsHZspgZafeqo_TLJNNLOflkllmnnkhd_\]]_`ccgiikmkkjjhgfedc`]XRKC:1,)'&(,04;>BGMV^bhptwz|}~~~}~ƒ†Š‘ŽŽŽŽ‹‹Šˆ‡…}{ywxy{{{zyxurnjgefdc`^\\dnyƒŠŒ‹‹‹‹‹‹‹‹‹‹‹Š‡{usuy|}~}ywttsppoopoolifceintx~„Œ‘‹++**)'''$%%%$$$#########$$$$$$$$&&''(())))****++,,-------...1311238>GT`jrusiZJ=4343335665566665555543433211010.---,++*))'&%###""!#(-5@IT^fouyzxrlf_UQMGEGJIJNOPTUX[^]___aeknotvvusstuy|€‚„…„††ƒ€~~~{wsplgc^agq‡Ž’‘Œˆ~xxuqnkd^VL@91./158<?BDHJKMNQRSTVWXYZZXVUTRNID?93/.---,,-.148:?DHKP_–œœ¡¢£š‡{‰ŽŽxm`yu{ah|£¹¾½ºž™¬·½½½¬‰“°¥‡|˜ŠiOTOnzoY^dlmlej€e]XTL?:9>EITRMKKKTMKEAB?><CE?=;:;A:;KLIA@EFJWXPJCB>zV12?b_fvvsk^YQFFFCB>;98;=>BDGHKLOW][YYdmvywuq;Qsd>[okvwNCSOJEQbihgjjlnoomgc_\\\\^\\^adfhjjjiggfecb`\WPIA80+('(+.38<?AGNV]dkptwz|}~~~}~‚…‹‘ŽŽŽŽŒŒŠˆ„‚|zxwxy{{zyxwrolhfdecc``^_hp{…ŠŒ‹‹‹‹‹‹‹‹‹‹‹Š‡|vtu{|~}{yutsrppooponkgfceinpw~„Œ‘ŒŠ)'))'&%%%%%%$$##""""########$$$$&&&'(()))))*++,,++----......141/238>GU_jtyrh[H;33356556666666666666655554432110.,.-,+*+*'&%$##"!!!!#%*18BMW`hry}{ysoic^ZWTSNNPTSSRTWY[_``aacfikorrtsrrrtvy}~‚„„ƒ~{xtplgc_XQORYeq|†ŽŽ‰€|}||yxtnibYNB;65:=@@DGJLLMNOPRTVWXZXVWSROMID>:630..//..1358<?CEKRR{šš¢žš‹ij¥˜ˆ…„hZT^f|Ÿ¶«»¼±›¥¯¤ ²£†}• ˜†Ÿ’}^^tq_YLKShi]iniq^XR::;=?8JPOFLFESKEDHJLSB8<?;:;=PMSHGPLAD@a]RQAD@Jh27;MZ]gtupj_UNJFBCCB><<>@BEFIJOPRU[^Y\bnvxwttqusdQdovmK?GKJGWljihiklknnmjhb^\ZZWTRSUY\_fhjjiggfeca^\WNG?5.(&&*,059<@DHOV_fmquz|{|}}||~ƒ†‹‘ŽŽŒŒŽŽŒŠ‡…ƒ{yyxxyyyxxvspmhebcecda`aelt€‰ŒŒ‹ŠŠ‹‹‹‹‹‹ŠŠ‰‡…‚{vwxz}‚{yvsrqoooopolkgebdglpv}…Š‘‹‰*)(('&%%%%%%$#!!"""""####"""##$$&&&''()))*)*++,,++----....../321238>FS^itxsh[J;54456556666666666666655554432110110-++**('&&%$$"!!!##$'*19CMWbjrvyxvpqlhed^\[YWZ\ZZY[\_aeffffhijlpqrsrrqqqty}€€~}yvrmhd_[YTGABDMYgv„Ž‹„}{}~~}zvskdYNC??@CDFIKLLMNOPQTVWYXURSNMMID?:842/////1258:>@CFHJN^•ššžŸ—ŒwW\‰¤§–„tbYadIZ¾®†²µ©®nq‹¡š}e™Š™‹gagf]cdYTWf\Teiic\bR;<>D=<FRNJRQCINOQMNRZE<>E=8;:H[fLKPCCBG`RUXAF=W=>CGPXKNqupg_WNJCACC@=<>@ACFMLNVYWZZ[]`hrxyvupoqpnnryfJBJJCAJbefhhhhklmlkie_[YXTOMJLKPY_cgijigfedba]ZUNG>4+'&(+.059>@EKRXbgnswz|{|}}||~€„‡Œ‘ŽŽŒŒŽŽŒŠ‡„‚€~{yxwwxxxyyvspjfb`adddaabgoxƒ‰Œ‹‹‹‹‹‹‹‹‹‹ŠŠ‰‡…€xvuw{~zwusrqoooopolkfcbdfkpv}…Œ‘‹‰)(''%$$$##""""!!""""""##"!!!!"$$&&&''()))*++++,,----....----/133128>HT^juxrh]L=56665576666666666666666665444221000/.,+*)'&'&%$#"""""#&+2:CMW`gnopoomljjjhgcb`^^__a_cefhlkjiijjlnqtsrqonpqvz~€|zxvqke_[WRNJG@>@BFP`qŒŽ‰zuy{~€~}yuoeYPIHGGGJJJJLNNNQSUVVSQNMJIGD@:6440012357:<>@BEGIJPS„ž˜œŸ˜’vYQx–˜~wf‡_( }½»©„}—¬®w[e˜‰>Z“ ˜zUY\]twm_\]ZSVmhghVHE9=MSF@>Td\`u[FLNNGCUA=@=CA779DWS?5CBDC;@O\O>D?;9@JMUSLYjnqjZOMHB@BB?<:=AACFSUS]bba`_^bjsxxwsprpkHTxvFFMNFLgjfdfeegijkkklf`\VUQOGC@CDNV]dhiihgfcdca]ZUME<3,(')+/25:?AFLR[dipux{{||||{}}„ˆŽŽ‹‹ŒŒŽŽŒŠ‡ƒ€~}{ywxwxxxwvtqlhc_^^cdcbaejqy‚ŠŒŒ‹‹‹‹‹‹ŒŒ‹Š‰†ƒxsuw{}}|xutrrqnnooqpljgcbeglsx†Œ‘Œ‹‰(&&&%$$$""""""!!"""""""""!!!!"$$&&&''())**++++,,--......----.022128>DO[epvtkaP@77765556666666666666666665444223200/.,+*)'&'&%$#"""""#&+2;AKU\ceddcacfijjjhgecdceffhklmopnmmmnnnqstsrrppqvz|zzzwupkf]WQJHDDA@>>=>BJZl}‰Œ‹†|rgkqv{~‚‚ƒ€}{tle[SNKIIIJJMMNNPRSROKKIFFDC@;863322579;<>ACDFJLMQQdŸœ œ‘ƒ‚…cQf„ƒ†ƒƒŸ›Z*#x¼»´¥‚]|œ›ˆbVkŽ{lp–¤fC\_cz’’vmdb\haV\X=9?DKWYD9BBc\WbYKFC@:LT38>IJ<435>FJHDAG@E7@GT=@<=:H]X[]?EOM^^_ZO??@ABBB@=>AACFTYW_cecbabgltxwtsl`\rlf_TMCL[dsmhedcbcehjkkkhc]YROJC:76<DMV]fhiihffccb`\XSKB80,(')+/25:?BGLR]flrux{{||{{{}}„ˆŽŽ‹‹ŒŒŽŽŒ‰†ƒ€|zxvvvwxxvttoke`^]]`cbbcfms{„Š‹‹‹‹‹‹‹‹‹‹‹Š‰†‚~xsuw{}}|xurqqpnnoopoljfdeeiorz‚‰’Œ‹‰&%&&$$$$$#!!  !!!!!!!!""""##"!$$''&''()*++,,------....--....0/01016<DLXfnstmbSH=6566557786666666666677775544442111//-,+*(''&%%#"""!"%&+29AHPU[\XTRV\afjlkiggfhhhlllnprrrpoopprttwxtrrsrsxyyvvsoje_YRLD@?@@?===;=AHVgy‡Š‡ƒwhXZaipw{€ƒ‚‚„‚€{uof\UQNJIJLLNNOPPNHFDBEDBA>;7557879<>?BDFHKLMOPQTƒ£Ÿ¢Ÿ™‰pˆ‹uPW|{vs{ —@*#hº¹¶²¦…`dvƒƒi`}‡}pc„‹ODfrŽˆ’Š}|cacSRX\R3>KS^kF/05MSMQJIFDDDW;88=@732548DD;>?BAS@AF@=BJRHVgQQW@F@0OOMP@;?DFHB?>?@BBDHQYZ_fgddefinuyxuqpc]jgJHSNMYesnieccbcceeiihgd_ZRLG@9215:CLV]dfhhfeedca^[XQIB7/*('),046<BCHOW_hmrwyz|||{{{{}…ŠŽŒŽ‹‹ŽŽŒ‹‡„€~}|ywvwvwwwvurmic]Y\[_accdhpx~ˆŒ‹Š‹‹‹‹‹‹ŠŠŠŠ‡„€ytrsw{||{xurppnnnnonmljhgefinq}†Œ‹Š&%$$###!! !!  !!  !!!!!!!!""##$$''''())*++,,------....--....///0004:@KWbjqrofYND<786555555665555555566665554443111/,,+*)(''&%%$#""!"#%(06>CKQSSOJIOTZaeghghhgijjmnpqqqrrqqquuw{{{zwttuvvwutrolga[SKD@>>?>=><<;<=AGRcx†Š‡‚ucOJOXbkrz…†‡…ƒ€yvod[SOKKLLMMMMHFCA@ABCBA=;<:9;>AABCDFHJLNOSUQScš¡ž—‘qY~‡t^Md}{vqu‚2**Mµ´±°«ˆrijmohu|mdtvb>>Xƒ¡™–•Œuf[UKMX_^GKBFZUD329>5:NIIC>;FS:589<F;2228@NF=?7NYQYK9BCQAHVUORN7@20IKY@6:>CFIFA??AACGHU\YZchceagmr{wsj^gg^^RGF::KS_rmiecbadddhgggf`]UMD=5-,.3<FNX_dfgfeeca``^[TOH?7/*('),069;?CHOYaiouwyz|||{{{{~…ŠŽŒŒŒ‹‹Œ‰…‚}}zywuvwxwwutqlfa[XWZ_abcflqy‚ŠŒŠ‹‹‹‹‹‹ŠŠŠŠ‡„~vqpruxz|ywtrppnnnnnmkjjhgeehmq}†‹Š‰&$$$###!   !         !!!"$$%%''())))*++,,--......-.////....//0027<FQ\fkppibWMC<97556345555555444455466653323311/-++*(((''%%$$"""##%).3:>DHKKHGFIOV[^`adcegijjkmopqqsrstvwxz{{||ywvvtrppolie^VLD?@?=>====;;;;<?FPas‚‰‡‚wdM;@ENYcmx„ˆ‡ˆ‡…~yuk_VPMLMLMLFC?;::=ACCCCCCCDDCDDDGJKLNOQOQRUUp£¡œ™”ƒJLnƒlPOqxwwp‚p3105£®§¨¤Š€xj`TYWfjcmlhS8?Tƒ¥ “—’’”tI<^ob[TNLFCCKRD3@D9::8>G43BKK?3A>?713059DC><Pe`i_;=<ANQIEOHMM;<F=C@?817?A@@AA@@AAHIJMMLR`hgfZ_pedcTKDEJEOOJ@BNCIdumgdabddcefhhfc^XPF<3+))/5>IQY`eggeddcb`_\XUPG>4-)((*,058:=BIRZbjpvvxy{{|{zz{}†‰ŒŒ‹‹Œ‹‹ŒŒŒ‹ˆ„}|zwutuvvvutroje_ZUWY]`adhptz„ŽŒŒŒŒŒŒŠŠ‹‹Š‰‡ƒ}tppptvxzxurqqonnnmmnlkkiifghms~‡ŽŒ‹‰‰$!##"!          !"!"$$%%''())))*++,,--......-.////....////029AKW`ekpnh`ULF>;:86644445555444455466665323321/-,,+*((((&%%$"""##%&+039>@CBBCGINSWYX[\\]_aadgikmpqtstuxyy|||||yzxuqnlifc_XPGB?>>==><=<<::9:;=CM^p€ˆ‰†|jS715=HO^ju}„‡†‡‡…‚~{vpi[SOMLKHB?;;;>AEFGGIIJJJJJJJJLMNOQRRRRSWVv£ž›•Œn:Ic‰ˆxXNYrxzx„`854.z¤Ÿ¢¤–‰~mdXNB?D]jhcJ<EQ~Ÿž˜™¢Ÿ”cCN|}vmd`SJPYXZPG<:FG:;=EA?ADUPBA705=6,036:?UbYVN<;=D^XHDFHQ]WLJMKM@>@;<?>:;>@A@>??CFGHITahk\FNN`kZOT]T4/@HCAFGGTrrlheddeccdeihe`[UK@5-())/6>IQ[bfhgedcbba_\XTOE=3-)((*,058:=AJS[bjpvvxy{{|{zz{~†‰ŒŒŒ‹‹‰‰Š‹ŒŒŒ‹ˆ„~|{yxvtuvvxwvtnic\XTTX\`aejqx~ˆŽŒŒŒ‹‹‹‹‹‹Š‰…€yollnpvwzxurqonnnnmmmmmkjjjhjov€ŠŽŽŒŠ‰‰"!!!  !  !!!"!""#%%''())))*++,,--..//......00......,//15;DNYchopkd^UNGC@=:85331444444445566666544332//-,++)()''&&&$$##""$&'-15;:<;=?CEJOQTSSQQRTY]`adgjmprruwy{}€€€~{xtqmid`_YRLE><<<<<<<;::999999;>IYm~ˆŠ†€q\>*+/7?KVdnv}ƒ†‡‡…„‚yri]SLKGDB=<;>CGHJMNNPRSTSPOOOOOPQRSRSUVVV|£ž˜‹j6Ua{Œ}dRLfu}‚‰V9788I”˜ž£”…}wl`ULFI\c\ZGAFJr™•’”žžzZs‰yli\ZV]lqyvjb[TUVUU\hPC?;FNI;019G7--/48Kf`URP=>CJA=>JMFDMNI>ALVVVSWF:=A=:>AACEGEAMRQ^SOY\IERZZdY[TC:>9EG<0<Rpwrooihncjhbbfeea[SH<1(('*/6?JS[cefgfdbaa`_^YRMD;2,**)+-1578<@IS\dlqvvxzz{{{zyz€‚‡‹ŒŒ‹‹‰‰‰‰ŠŠ‹‹‹‹Š‡ƒ€}{xxvuvvvvuusqmh_ZVRSW[_bgmu{‰ŽŒŒŒŒ‹‹‹‹‹ŒŠˆƒ}tniilpuwyvurqonmmmlnnnmmlkkiioxƒŒŽŽŽŒ‰ŠŠ"!!!    !!"!"##%%'(())))*++,,-...///.....//......,-..15=HQ[dhmmhd\XQLGE?<96334444444455666654443311/-,++))(''&&&%$###!"%$(-243578:>CHLMMKKLLMOQW[adgjmprrxyz|„‚~{xsokf^ZWSMF?::;;;;;;::99887777:=DRey…‰†‚yhL0*),09CMZfqy~‚„„„‚€vmbUKFA@CCCEHKNQTUUUVWXWUTSSQQRPTSQUTUTZ‹žœ—s,<Xq†}hMGLfu|uJ:;<<:gŽ‘–†wrtmeYPPTZUQQIFGGfŽ‹‡‹“—•‰}|]NQTMOUNRn‰Œps…pbZMFKXONF;GO@2.37<8/-..3<?C?KVJMI;78;;:<>>A=8:;<CHJMP@ADA>?AABDCCFJJIMRPHCPQBEJITS@?B@AKQfktyxunftxwdX]T^^cfea]UF;1((')07@KU\dfggfdbaa`_\XRMD;2,)))+-1578<AJV_flqvxyzz{{{zyz~€‡‹ŒŒ‹Š‰‰‰‰ŠŠ‹‹‹‹Š‡ƒ€}{xvutuuuuvvtplg_XSOQU[_eiov|‚‰Ž‹‹‹‹ŠŠ‹‹‹Œˆ†zohdgkpuwwusqqonmmmlnnnnnmmkkms|†ŽŽŒ‹‰ŠŠ!!       !!"#$&&'(()**+,+,,.../////.....----//.-,+,-,17=GQ\diiifd_ZUQNID@:653333334444554443332210/.-,,+*)('&&&&$$$#""#$$(-0132689>ADFHHGJLNQUZ[_cfknrrsw{|€~€}|ywqngc]XPMGB=;:::9::99998876666679>K_r€‰ˆ‚}nW;))')-4=IS]hoxƒ„„‚{uvxpaTIEDGIJMRUY[]^]YWXZ]ZXVVUTSRSTRSSV]b•˜˜•Œ}+9N`{ycNKDIPRIA=>>=<9n„Šnmjb_WPPSQJMPIJGEJvˆ„‚€ˆ’‰~[AIOMLJE>5?[ajte[NRWHJL=?:52892550-*'*1;?>TL=74774395358;;:98==;:BQDA?EMGCA=??BGIR^Z]dTV^\J=RZQ:@LGEPapvsswtssmpieJSAH]cegea[SG;1+&'*19BKT]dfggfcbaa_^[WRJC92-*+),.0468=CLW`gmrvxzzz{z{{z}ƒˆŒ‹‹Š‰‰‰ˆˆ‰‰ŠŠŠŠ‰†„€~|xvvuuuuuvuuoje]VQOQW^bfkqy}„‹ŽŽŒŠŠŠŠ‰‰‹‹Š‰†‚~vmeeejnswwtqoqponmmnmnpppnmnlpu~‡Ž‹Š‰‰‰!!!!    !"#$&&'(()**+,,,,.../////.....------,,.,,--047@FR[^cefeb`[XUSMHE=643222344445544433344100/-,++**('((&&%#%$$##$$$'+,-3789=??@CEFMRU[^`dgiklnquwzz}||zwvsojd]WPICA?>;;88889988887765555548:FUj{…‰†‚vdG-(&()),5>HU]gpv}|pe_f{xpeZONPVZbilnooplf_ZY[_^ZVVVTTRPOPPOOY™ —–”Œ318VnpSJPHA<;=@AAA@>7Er~sedaXZRKNNJKMLFGGJLYu‡…z{”ŽwF:ABCAA@>;6/2V€Œ‡vb`UQSI=D98849?=2.1/.-)<A98<86347;<AC:43662<BCG<99;=FFB>8<?@A>AECBIIYQjuMPipraIA@HIH=ThnpqrjZpfl^UR@@LU]chedb[SH:1+'(,2:CLU]dfggfbbaa_^\XRJB:3,++),.0158=ENW`iptvxz{{{zzzz}ƒ†Š‹‹‰‰ˆˆˆˆ‰‰ŠŠŠŠ‰†ƒzxvvvuuuuuvuuoje]VQOQW^bglrz‡ŽŽŒŠŠŠŠ‰‰‰Š‰‰†zrha`bgnsvvsqoooonoonmnpoonmnntzƒŠŽŽ‹Š‰‰‰!###!   "##$%%()()+++,--,..../.././/-----,,,,,,,-,,,.18@HQVZ^`abaa`]ZVPJE@:53322333344334333320/00.-+++*(''''%&$%##$$$##%'*,/37;>@?@CIMVZ]aiknnoopsvxwywvwutqnjc^XQJC<98;<::876567776666542333356=L`s‡ˆ…|pW9'%%'((,/7@KVajojdonSj€}th_]clv}€„‚~}}unghhie_YVSRPNLKLJIGL” š”ˆƒE.6Og\GIRJEB?@@@?>=26FQqnc]ZWVPOMIHFKLIIPRWZXix|†•ŽmC;<;899:9763/;f~††saSNICEKJ=26J;4,34/+*3?=DE953496<BD<7655434334577::>JVI60,38:<E?;=@FZ\QCL[gb]HAHJE=YmmmprtZClvt†FW`WGIP[fghgb[RH:1+)*/4;DNW`dfggfdba`_^\YRIB:0*()*-11479>HSZckquxy{|||zyyy|€ƒ‰‹‹‹‰‰‡‡‡‡ˆˆŠŠŠŠˆ…ƒzxwvuuvvvvuusmgc\SONSY_cgmt|ƒ‰Ž‹‰‰‰‰ŠŠŠ‹Šˆ…€ymd]\`gotuusqonponnnnnnnmmnnqqv}…ŽŒ‹Š‰‰‰!#%%"   ! !#$%%()()+++,--,......././/----,,,,**++,+,,,,16?FLOSX[]^`_`_\WSNHA:532233334433433321///0/-,,-+))'''&&$$#$%$$%%%'+059=ADFJKOU[^cfjnrrstvuwwwtsqomkif`\VPKB:756889::9867566655554331111237BVjy„ˆ…‚yeF,%'%')*06;DSbmhk]dxqxyxyrsrwƒ……ƒ†‚‚……ƒ}~xpg[QOLLGGECCCAzž•Š„ƒY.5A`VCHMJHEBCCBA@?^n^BXlg_XSRNOMKGHMMKMLTVWVXZo˜•„oUB8;:576421.--Dj|‰Œ€eTNJDAIJ/),/32<:,*19,'4?94343413400334331000149<:=CLD/).375BM;?UXQSV`mZ@DPb]KD@B[njnpmpvweEb¨’Kd]LBJQ`hhigb\SH:1+)*.3=GOY`dfggfdba`_^ZWQJB:322337;;<<@EMT\emswyy{||}{xxx{€ƒ‰‹ŒŒ‰‰‡‡‡‡ˆˆŠŠŠŠˆ…‚~{ywvtsvvvvuusmhbZQNOSY`dipw†‹ŽŒŠ‰‰‰‰ŠŠ‹‹Šˆƒ{rh^ZZ^ekrvusqopnonnnnnmmmmnnrrzƒ‰Œ‹‹‹ŠŠ#$&'%   !"#$%%&'()))***,..-.--..-.///.,,--,,+++++*,+,**+-/4;?DIMQVY\]_`b^]UNLB>7312233343333221111//..,,-**)''&&&%$#&%%%%)+/39;@EHNQVWX_fjmnquxzzyxwurpkkgeb^YVQMFA;74446578788665544444443211000023;Lbu‚ˆ‰‡rY=)%$%%(.1:GS[^Yacfoqqkiopu~‚„€~||xy}‡ŒŽ‘”•“ŽŠ‡{l[LA>>B><9;X˜‘Š‡ƒ€q4/=X[IKMKKTFDCE@>:_•jg`ecZSPLPOMGHJLMRMM[VKQTd–ƒl]QE;2247641.,*-He|ŒzeV]WQSOD::249?<007:+(+44644438:EOD=7542/--0.038:?>E>5/1:?@?85EURYW_mj[LNLZmS]etuls€twtyvUcODS[TAHWfgghhc[RG92-+,27@JSZaegggfecba_^[XTOJD@?BGHMOPPPSSX]ciqvzz{{{{zxyyy}ƒ†ŠŒ‹Š‰ˆ‡‡‡‡‰‰ŠŠŠŠ‡„‚}ywwuuuwwvvvvrlg_XNLOTY`elsx€‡‹ŽŒŠ‰‰‰‰ŠŠŠŠ‹†ypdYRU[cltwtspnmoonnnnlkkkknoot{„ŒŒŒŒŒ#$&'&"  !"#$&&''()))***,..-------.///-,,--,,))++))**+***+,.36<@DGMPVX\_`a`_ZRKE=512233333333221111//..,,+**)''''&%$%$%(*+/49?DHLRVY\`deiptvwxyzyyxtpnigd`[WQNJHC>84311124455766543333333332111//-/015CXl~ˆŒŠ†|jQ;&%)45.0<KNGGGONNRMQTWVUZhruyvvuw{„’’“––—•‰ŠŽ‹€r[H>889759~–ˆ‚€Q=?Q_PMNLIJFCDB@>7Uš’‚vgVZ`YPMRNHEEJHKNNNYYSHJS’ˆq]IC43789952-***0J`|•–nadcsk\XSMD738DHI@7+/355326GLIKF67:864:A=8/+-7>AM]A2?CHBHG=GMQRU^gd]UVU`egIWorpmo„~hib[\[YMDI[`H;FOffijfa]SJ<2-,/38BKSZaeggggecdcddeeb_^YUXX[`ehillnnppstwz||{zzzxwxxz~„ŠŒ‹Š‰ˆ‡‡‡‡‰‰ŠŠŠŠ‡„~{ywuvvwwvvvvrlg_WMKNTYafnu{‚ˆŒŽŒŠ‰‰‰‰ŠŠŠŠŠ‡uk^SMQYdmsvsrpnoqonnnnlkkkkkmns|…‘ŒŒŒŒŒ!#&'&#   "#$%&''('(*+***,-/----....00.,,,*++*))**)))***)++++,.259=@EJQV[]__`a\UNG;52222223322210000....---+**(((''&&')-/38;BHMQT[_bfikpstwy{{zyxurolid`[XRLHD>;95211100000033333322222422222210.----.4<Lez‡Œ‹„ueO9)6SUJGT\ZQPQSTY_PJFEFG?FILU^gp{ƒŽ’‘—˜•‘xyw‚’•{aH93467H‚‰‚}jKGWcUOSMEFCBBB<7Frž—†ymZTXZVPIFEFGIGHHIKOPIFJQŽˆ€eA52>C>;720)()**5Ld‚”“ˆ}wturcbXLKLB<MNF>7;:75427<<:>??;:758DEK;.112>JOiqO/=RNLTQR_sZLRZgQ]R;=\fYOT`\^ZYb^VPQID@LJ@ENA<H:1^kkjhb\TI;1--/5<EMT\dgighffhjlnqrqtsppptyz}€ƒƒ€€€ƒƒ„„‚~}|{vuy}ƒ‰Œ‹‹Š‰‰‡‡ˆˆˆˆŠŠ‹Š†ƒ|zxwwwwxxwwutrle^TMJLS\ciqx}†‹ŽŽ‹Šˆ‰‰‹‹‹‹‰†~vgWMIOYbltutrpnnnnnnnmkjiefiknuˆ’‹ŒŒ‹ "$%%" !!"#%%&&'(()****,-..,---....//.,,,*++*))**))))****++***+-257=BGKRY\_bba]TLF;5222123321010000....--,++*(((((++.14:>EINUX]bhjmpstvxzz{yxutqojfa^XROIC=:623210/////00/02222112222243200000/.-,,-.16EZp‚Ž‹‰€yiO:CXWQRK]mpbeh]e`YdcRKE>DDEFGDI\mŽ•––‘ŒƒŠ„”™œš•ŽzYA7<GLh‰}rnngXLOMDDB?A?<;bŒŸ™‰~si^XUQMHDFIJJHGFILEFEGMM~ˆymF<7BGD@80(##%')*8P`xŒ“„ujuiqxdikYJW^QC<97840/025668:89GOG9CC7**+1Nhkmd_HBGCTPOS\mcL]fZMG9CNj[CcieXIIC??ELF77?MYRMGKQ[4Ogkijhb\TH>51139AHPX_cfijlnpqsvz}€ƒ†‡…†††‡‰ŠŠ‹‹ŠŠŠŠŠŠ‹‹ŠŠŠŠŠ‡†{z|€‚‡‹‹‹ŠŠˆ‡‡ˆˆˆ‰ŠŠ‹‰…‚|zxwwwwxxwwutqke^SKINS\dkry€‡ŽŒŠ‰‰‹‹‹‹‹‹‡„|rcQIGPZeotutrpnnnnnnnmkigbdfhnv‹‘‹‹‹‹"$$" !!"#$&'''()*))++--------.....--,,,*++***))(()))*****))**++//48<BGNU[addd]UME93311222200011//....---*+*)()*,/58<BGMPT[_dhmprtwyxxxwvtrpmkgb^YTOJF>;511000..////////./1111112211132111/...-,++,./2<Pg|ˆŽ‹Œ„xrww|~ufQ??Pcuy\OWX_nwtaICCCDFCACDGK\q~~}…Ž‘–•Ž‹“šŸœ•–•Œyc`ny…–ƒ~ŒŠ‚qXLMIGCA?=ELV—Ÿxmb]]ZRIHGHHIHFEFHE<=ESYl†tmiQ@>BFDB=3&! !$'*+>Q`qƒ„tniu~tvpebcZ\G;<;961345369585D;;?;7;65-/9^pqeV]UTOODLSV]WSN\KEPHBZL^m]_`VM+.953674=MQcl_UGDOecihikkgc^VI?8354;FKTYbgnprvvz}ƒ‡‰ŽŒ‹‹‹Œ‹‹‹‹ŠŠ‹‹ŒŽŽŽŽŽ‹‰Š„€€ƒ„‰Œ‹ŠŠ‰ˆ‡‡‡‡ˆ‰ŠŠŠ‰…‚|{yxxwwwwwwutrkd\RIHMS\elrzƒˆŽ‘ŽŽŒŠˆ‰ŠŠ‹‹‹Š‡ƒym^MEGS]hqtusrpnnnnnnomkheccdhoxƒŒŽŒŒŽŽŒ     !!"#$&'''()*))++--------.....-,,,,*++***))))))**))**++****++-04:@GOU[beif]VJB8322122100011//....--,++*)*,148?CGNT[\bhkoruwyyxvusqplkigb^YTOKEA:62/--./--.-...../.../00000011000221110..,-,++++-/7E[rƒŒŠtq‚’•‘‹ƒ~{qXMQdZ`QJPele~|\QHEDDGFCAEFEGIV_’•š’’‘”—žœŽ”—ˆŒ‘‘’•…~|~…XhXJLKGC@A==Co“¡§›Œˆ}ukgdcaaMH]f`WIFEEC929H\hx_`XGDCEB?>8-"!#'*+,/:M\jw„‡‚xw}~‚zuj^OUH<DHOXT=:@<67B42>?CFZU<>31547Uid\V\[Q@;Cajh^\ZUFDL?AMXHVh^\NEK?G;?6?CH\ehxoNL=Aeffijkkgc^VLA:679?FOW`hotw|‚…ˆ‹’’’ŽŒ‹‹Š‹‹‹ŠŠ‹‹‹‹ŠŒŒŒŽŽŒ‹‰ˆ†ˆ‰ŒŒ‹Šˆ‡‡‡‡‡ˆ‰ŠŠŠ‰…‚|{yxxwwwwwwutpjaYPHGLS\elt{ƒˆŽŽŒŠŠ‹ŠŠ‹‹‹Š‡xiVIEJT^jrtusrpnnnnnnomkhebbchqy…ŒŒŽŽŒ!!!"#$%''()()**,,,-..,........-,+***++***))))((((((()(())*'))++-29?GNU_dgjd\RKB:55431200010..//.---.-,,.168?FJOT[_dilmpsuwvvtromihea`]YUPLFB;710.----.---.-----.-..//./0000//00121122/.++,+**))),0:Ndxƒ„z|‹‘Šƒ…Š†ƒ‚‚}zlX]nbVOe„‚w|n`OEAFFEHEFHJLJA?Sn‡•““˜šŽŠŒˆqŠŽ””Ž„{y{‘q…]HJKEA?;::J}—£§œekƒ~unlkjii•–’Œƒx\F>713Kekrnea]MHDDA??=2(%'),,,,-:L]gpv{†‘•„‡uoaQbVNWUXUX>5ECEBD16A:FOKFC0.;9,4JZSNP\UF=FKTLQILQUGEGJMVWHIXZM@EOIG8?C89DXny}ysR4=Qhgggijlhb^WNE=8;<CLU_gqy}†‰‘’’“•”’’Ž‹Š‡‡‡‡‡ˆŠŠŠŠ‰‰‰ŠŠ‰ˆ‹ŒŒ‹ŽŽŽ’ŽŒ‰ˆ‡††‡‡‰Š‹‹Šˆ…‚|{zwwwwwwwwusog`YOGFLT]fmv~„‰ŒŽ‹Š‰‡‰‰‹‹‹Š†€whTHELW`kruurrpommnnnomjgdaachq}‡Ž’ŒŒŽŽŒ! !!$#$%''()()*+,,,-../........-,+******))))))((((((''(()))())++*+06>EPY_gkic[SMEA=876521010/.//----+-/137<CIOU\aejmpsssstrpomjeb^ZWSRNKEA;641,,,,,--,-,,,------+-....-.////////010000/.++++**))()*2@TeosŒ…‚yvv……~~\Rksnf]o‡|umg[WPEEJRKEDCEIKGGJ^–‘“”˜™‰ˆŒ‹†rw†‰‚€zxyŽ“”ŽcGIIEBCOG8Qˆ¦©£^,X{yxvzz„•Ÿ¡™“ˆydM>6/8Selsnga^UKA?A?@>81*.///-+*+:P[gjl“¡˜–˜†{kceebXTDVM<>B?IA0=;AF?GN:.?VD-5IT[JAJ<<LLHP5:<@FWVFEEON\f_M85GYKSL67RY?DJfp_jrOCWcfghhjjlhd_XOF><>BMV_is}‚‡ŒŽ‘“”””””“‹ˆ„~{yy{~€‚ƒ†‡†‡‡†‡‡‡‡‰‰ŒŒŽ’““‘ŒŠˆ‡††‡‡‰Š‹‹Šˆ…‚|{zxwwwwwwwusog_UJFEKR[clw…ŠŒŽ‹Š‰Š‹‹‹‹‹Š†€ufSIJR[emrssqppommllonmjgd``cis~ˆŒŒŽŽŒ!!""$$%&&')*(**,,,,-,-........,+++++**))))))))''((''''''))())()))),19@IR\dikib\WQKGC>=;9533100...-,-//47:?GMTZ`cgmprrtsqqljhea\XTOLHEA=9510.-.++,+++++++++,,--,,,,------.........//.//..,+**)))))(*+5FZf|~†ƒqbphioWXeX\ggd__qƒ’„tlgbZMDFJPJEECDGIKLLOx˜’‘’—ž—ŠˆŽŽ…u}ˆy‹Œ{wv‰ŽqDLKIIC?>7ZŸ¥ª¥Š+4Mr‚}y{‹›¡ ”Ž†t]H;4/9MYbghc[VTOA>??AB>813310/-+*+5L_hdk˜¢¤¤¤¢˜~`VhqfUOaVE<HW>2<:DORK>/&4GWE2;GUcVCED5;F[S<737:EDHB1:AFab8<Y_XL[PKSnh`c`jnNV_]`fegefijkkheaXQHBCHNYbku‡‹‘’”””’“’Ž‹‡€xrlfb``bdgkorx{|~€„„……†‡ˆ‰ŠŠ‹Ž‘‘””“’‹‰ˆ‡‡†‡‰Š‹‹Š‡…‚|{zxwxxwwwwurmf\PGDDJPZcmw‡ŒŽŒ‹ŠŠ‹‹‹ŒŒŒ‹†€ufVOPW_gostrpnponnnnnnmjgea_djt‹‘ŽŽŽŽŽŒ!!""$%%&&')*+(*+,,,-,,........,++++++)))))))))(''(''''''((())(((((*.3:BLT^dhjhc^XVRNKFC?=:8632/.../0369>CHPV]agjmptrpnljfb^[USNKFA=9311-,,--,++*++++++++++,,,,++++,,,,,,--.......//...--,+**))))))(+5Mpzyuqmii^\vso}wtfZ]bTKTbuŒ†uimmgVDAIHJGDEEFFHILMu–Ž‹—ž•‹Œ‹ŽŽ‹Œ’‡Ž‰zvv„‹‹‹zKGHFFEA>5c“¡§§¥šW2=?FI>Aj‡š™’…€ufZS;11>LXZ]^`XTPMC=>BDGB?966431.-)*+5Rb_]n€Š“ŸŸ›‹xixsh`[WZKGV`=94;AGFH89>H<E>9<HQYN<;_C=FZ^E1.66<HE@=EHHT^enkgeieimlfPUi`fl`ekiiecfgggkkkjfaZSLKNRZdoy‰ŒŽ‘“’’ŽŠƒ{rj`XRJFEEGKLR[_glnsvz}}~~€ƒ„…‡‡ˆ‹ŒŽ’ŒŠ‰‡‡†‡‰Š‹‹Š‡…‚|{zxwxxwwwwurne[OEAAGQ[eoy‡ŒŽŒ‹ŠŠ‹‹‹ŒŒŒ‹†€wh\RTZclsttrqpponnnnnnmjgebadlvƒ‘ŽŽŽŽŽŒ !!"$%&&'&'()**++-.----,-.......-,,+++(**)(((((((''((''&&&&((((&&')**/4;DMW\dhhgdd`[YWRQMIECA:6522237:>DHNTY_ehkmnonmjfa^XUPLJE>;730/.-,,++,-++**++++++++++++++++++++,,,,,,,,--------,,,,,+**))))((+0a}oeivodi^f{zym]f`^|ucdlt|‹Œ“Œ…yudUKLLGDEDFFJMMJi”ŒŒ“›‰[r…‰‡Œ‘”‘†{yutŠ‘‘‹\DIHHCA<:rš£¨©¦št0<;974/P~‡‚yqeXPG5:BLRRTVXUOKHD<9AJKFD@;97651.+.17@V^[bkt~„ˆˆˆ‰…ƒ‚~uiUPUTUddLB7522;><?@4779<;:=A:60-:;>7gZ3-0>NA6<JPRLcxwrpnkjikii`Vhs`Zqqmihfeffghjmmljida\YY\cju~†ŠŠ‰†~ti`UKA>;<;;:<>BJOWagosvxzz{}€€€ƒ…‡ˆˆ‰Œˆ‡‡ˆ‰Š‹‹Š‹ˆ†~}{ywwxxwwwvvqkdZQFABHR\hqy‰ŽŒ‹Š‰Š‹‹‹ŒŒ‹Š‡€vj^YZ_gnuvtrpppnnnnnnnmjfdbabn{†’ŽŽŽŒ‹ !""$%&&'&'()**,,,--.--,-......-,++******)(((((((''((''&&&&((((&&&(**+/3<GNV]bdfedcc`^YWSSPMJEA;988==AFKQW]`bhjkihhea\YTPJF>:731//-++,,,,++-,++**++++++++++++++++++++,,,,,,,,,,------,,,,,++*))))*-3G€zqzwtwiikgju`MK[\egebd_g{}‡€“›££Š†xUCHHEGHHIHIIG`•ŠŒ™ˆ/9OcqˆŒŽŒ„ywuw‘šš˜•h@GFEA@=Ey™¢¥ª¦19;;;949fy{zvqg_XPLGGHIJNPNPRNJIF=4@NNKECA?:7642247:7CW]_dlpqsusvwrjhjfVIMUZQVXN12,9E?<IJ29<881/9KD00794<9=Q+,1692HemRPJqzvronkkjjknmqqu]Jmrnigffffghikklmmljijkpv|„ŠŽŒŒŒ‹‹‰†€}vme]VOGA>=;<<<>?BFMV]fmsvwwvwy||~€‚…†††‹ŒŒ‹ˆˆˆˆŠ‹‹ŠŠ‡†~}{ywxxxwwvutnjc[PE@CHQ\hq{ƒ‰ŽŒ‹Š‰Š‹‹‹ŒŒ‹Š‡€vj_[]dkquwupppnnnnnnnnmjfdbaep~ˆ‘’ŽŽŽŽŒ!##$$$&%&('()++,,,,,-........---,,+****))))))((((''(((('&((''((''''(*)+05=ELRX^acdcedaa^][[XTQLHEECDIMPV[_bdgihgda^[SOJE@:61--,,+++++,,,,,,,,,,++****++**************++,,,,--,,----,,++**++,,)+**.7Qdxdf‚…€ppffibOMLNMZgm_TOL^hpj€‰‘¥¨¡œ’xU@IFHIGIJHHHTŽŠ‹‹”Œ@;;<Ig}‡Ž‹{uvwx”žžšzBAFJC>>V~˜Ÿ£¦¦ž}.9=<<:54Jgkljf_VTPNKJKJLNONNNNMKGA5APRPIFFE?<96:;;8799LX]`ejjptvxpZGFHJIDDGQJFHG>;C26<?<99EC=9:;B<<<35<17;?`SK?<<F[ebSOY{xurnkjjiijmnqrsmktpkigffgggihkprtvuvxz}†ŠŒŽ‹ˆˆ…„~{xrmhb\YRME?;:<==>?ACIRYbhptwvvvwyzz{|~ƒ„„„ˆ‰‹‹‹Œ‹‹‰‰‰‹ŠŠŠ‰ˆ…~|zxxxxxvvwvsojcXNE?BHR]kt}ƒŠŽŽŒŠ‰ŠŠ‹Œ‹‹Š‰†wh__bjqvwwtrqpnnnonnoomjfeacfr€‰‘ŽŽŽŽ !"#$$$&'(('()+,,,,,,-........---,,+****))))))((((''((((((((''((''''''('*,4;@GNRVY\^^_aa`a__^\ZVSQPPPTWZ^_acgffb^[WSLGA;50-++**)+*+,++,,,,,,,,,,++****++**************++,,,,--,,,,,,++++****++)+,+0Nsysly…ˆŠ„}|vsyydUP[[K`gdb][V`cd~œž¯³­«¤Ÿ—‚G@FILMMLIDBG‰†‹‘ŽD4>>?E\y††„ztwy{—œ›œ™ŠN?EGD@?h“››Ÿ£ž}.68;:8617S__\][TMIIHFJNNNMMMLKLLLF@JRSVGDHIFD@<=BFB@>>DTXZZ[__ehnpne[TLB;<<GSPV]]Z8-4857;7BC;>B01;CSL8@769<OYID:8Xut\QLp{xsomkiiihilnqpnputokigffggijkpty}‚†ˆ‹Ž‹Š‡ƒ}zurnlifc`^]WQKC@<;;=>?@@EKV^dlsyxyywxyyyyz{}€‚‚ƒ„ƒ…†‰ŠŒ‰‰‰‰ŠŠ‹Š‰ˆ…~|zxwwxxvvvusniaWMD?AHT_lv€‡ŒŽŽŒ‹Š‰ŠŠ‹Œ‹‹Š‰„}rg``hmuwyxvrqpnnnonnnnlihgdejv‚‹‘ŽŽŽ!"!"#$%'&'())**+,,,,,-......--..-,,+****))((((((((''((((((((''''''''(())'',07<CFJNQRVY]_^_`_a``a^][[\^__acdecb^ZTNID<52-+**))*)++**++*,,,,,,,,,,,,+++++++)************++--,,--,,++++++++*)****)+-/I~x|~xw„wvzvpkffoghYFcpWWfcdefk™­°¬¯²¬®«¡wC<HKJGJEAABm‡ƒ„Œ’k.:>@@@Srƒ‚uowx|“˜˜—–“aCHHEADy•›—˜ ›q-6899:973>QVUWVRNJIIGGJMMNLMNJJHIKN\e`UEEEGLLJFDSbSCCB=OWUTPKGIOSY[Z\XK::ILROKIRXK=:.5?9:8>B:86.(*,44(9757?H<B>;<h}‚UM_„|urpmkjgghiintoovtspmjhhghjkosx|€…‰ŽŒŠ‡„~vplgfc_`a_]]ZUOHA><<==>?@BEOW^hpv{}|{xxzyyyz|~ƒ„ƒ‚†‡ˆ‰ˆŒŒ‹‰‰ŒŒŠ‰‡„~{zxwwxxvvvuqmg^ULC?AIUamxˆŽ‹Š‰‰‰Š‹ŒŠŠŠˆƒyoeacjouxzxsqqponnoomnmkjihefmy†Œ‘ŽŽ "#"##$%'&'())*+,,-,,,-......--..-,,+****))((((((((''((((((((''''''''''((''().26:@CGILMSUWX\_aadedcaaa`adeca`]YRMIC;2-*)()'****++++++,,,,,,,,,,,,,,+++++++,++**********+,------,,++++++++*))))))+,?y‰j|{|y€Š€ur|}ypvy~vj\QXkgSGdwyzy‚¨­ª³¹´·¹±›h7IHGFFCCC=WŽ‰}„‹’S4@?=@BNpƒtqxz~””——–xHHLFBG˜“Œ–Ÿœb,699::8521<KQQSQNMLGGGHMJLKMMIGEEKSWWVMJFGILQRPMQ^]PMC9HVRMD=9666:999510:FNQA=ADD8?><HI>9?DE95535/$2<=CA6;CD>:878ENMEMho}|xupnkhgghiorquuuspnlllnopsv{€ƒ‡‘’“”’’ŽŒ‰„|ungc`a_^^^_^\[YTMG?<:;<<=>@DIQ[ajv|€~{yyzzz{{€ƒ‡…ƒ‚…††ˆ‰ŠŠŠ‹‹‹‹‰‡„€}{yxwwxxvvusplf]TJA>BJUcp{‚‰ŽŠŠ‰‰‰Š‹ŒŠŠ‰‡‚xmc^bipuxyvsppoonlmnnomkjhgfgp}‡ŽŽŽ‹‹‹  !!#$$$%%&'(())*+++,--......//-----,,+****))('''((((''((((((((((((''''&&&(''((()-036:=AAGKLORVW\^bbcccccaaa_[WQMHA;3.)'(())((*+*++**++,---------------,+++,,********+++++,----,,--++++++***((()))*7k‘qXowz‚††~€€„|nvspwphcVc}oG4Xv|z…œ£®·º»»»¹­ŠBBELJDBCD>F~Œ‚}…‘ˆ=8?>>ECa‚wsy~…ˆˆ“––‰ONIFAJƒšž›š›š^+677999730-8GNOOMKKIGGFKKMKMMJHFCFSMKNRSIIIJQVW[aiYLJB9EVSJB>@EH@:2//--07CE7223:;>C>DMK?=9BH96864479AC943<A=;9::=<748>@BJOXcnmliggiililtvuttqrrtvvx|€ƒˆŠ’”“•”‘Œ‰„~umgb^[[]]^^^]\\ZXRMH@;:::;==@EIS[foy€……‚€~}{yzz{{}ƒ…ˆ†…‚‚ƒƒ†ˆ‹‹Œ‹ŠŒ‹‰‡„€{ywvwwvwvuuupke\RG@?CKYgs}„ŠŽŽŒŠŠ‰‰‰ŠŠŠŠŠ‰‡ui]]ajouxxusqppnmlmmoonlljigjs~ˆ‘ŒŽŒŒŽŽŽ  !!#$$$%%&'(())*++,,-.......//-----,,+****))('''((((''(((((((())((''''&&&''''''(+*,.0156;?@CGLPTZ]^_````]\ZVQLGA:3.+)'()((())*++**++,,,---------------,+++,,++******+++++,----,,--,,,,++***())))*,GohWYqu|‰†‡ƒ‹Œƒ}‚€{qulpmXEdsjRG]ft‚˜¨µ»»¼»ºµž]7>AEBCC?@Cd‘ˆ~~Š—f1@@>CHq€xxz~{zŒ•—[@EGHJ‚›œžšš”Q07:9:9863/.0;EMONMKIGGGEKMKKJHEFCDXQLNSTHIIKMU_rwod]KB=M[RHGMQRPH?30/00022//0325;;F;;EB938>A=7979:>>82363BO=6589:<;9=CB9:BEHR]aagihjootyzyyxvxz|~€ƒ‡‰ŒŽ’“•““ˆƒ{skc^]\[XZ\\\]]\\\YVRKE=;:9:;<<>EJR_gq|‚‡‡…ƒ€|{z{||ƒ…‰Šˆ†ƒƒ†‰‹ŒŒ‹ˆ†‚~zxvvwwvvvuttoid[OF@?EMZft~…‹ŽŠ‰‰‰‰‰ŠŠŠŠŠˆ„|re\Y^gnswvrqpppnmlmmonnmljihmvŒ‘Œ‹’“”’‹ !""$$%%&&''(****++*-............---,,+**))))((((((((((((((((''''''((''&&''''''&&((((++*-1468>BGLOQUVVYYWURNKE@83))''((')(**)**,,,+--,-......----------,,++,,,,+*++++++,,--------,-,,..06+)++**)*,5Y^cw^k~ˆ€xˆ‹||{{qmvoxu\AVp}ucY]b{Š‘“£¯º¼»»º¸§p06=BADEDDCNƒ†~}‚’ŽH1?BKm~|{€€†‰‰‡‰Ž”•e?CCEP—œœŸ›™’@3;;:::9863/.0=JLMLLLJJGIKMIDCAEDEEX[MOTSBHIKMN[mmlgfI?D[^RPVWWVK@82.*)-.../../147984852.1;A>;;69:;<981::144728BIG>75>CDFC>9?PX[Y\dmqtvy}~}}}~ƒ„‡ŠŒŒŒŽŽ’”’Œ‡‚{pg]WXY[\\]]\\\\\\[[WUPJD<:99:;<<@GKS]kv…‰‰‰†ƒ}|z{|{€„†Š‹Š†ƒ€…„‡ŒŒ‹Œ‰…‚}zwuuvvvvvvtrmgaYOE?=EQ^kv‚†‹ŽŽŠ‰‰‡‡ˆ‰ŠŠŠŠˆ‚xn_VU[blsvvtqponmkklmoppomkjjoz…Ž‘‘Ž‘‹‰ !""$$%%&&''())**++*-............---,,+**))))((((((((((((((((((''''((''&&''''''&&(((())((+,.257:>BDIJJMNKHGC@:2,)((''(('))*+***,,----,-......----------,,,,,,,,,+,,++++,,------------..4S@(++**)*2HRnŠ‡Šqim~“……ˆƒ{{€vprmM?UBbxx|nX_j€Œ˜Ÿ¨²»»»ºº¦t47<??CECCCFcyzƒˆD-C\ƒ~|}‚……ˆŒŒŽ’’zIFAFL–ššœœ™•I5<9::::9542.+4ELONNKIJLLMKGLPRPKDAE]ONTS?EHJMNQ^b`^^MKR]]Y\_\WPE=86-&'*++-----0125@A><<FGHBF?<79779345631/26137:9?<:><?EKJGA7=Ni`H]x|z}ƒ„……†ˆ‰Š‹Š‹ŒŒŽŽŽŽŒˆ€xlcVNLPTXY[[\\[[[[\\[YWUPJC;:989;<?BEMWajs†‹‹Šˆƒ|{z{{|€„ˆ‹‹Š‰…€‚ƒ†ŒŒŽŽŒ‹ˆ„|yvttvvuuuutrmg`XKA<=EQ_lxƒ‰ŒŽŽŠ‰‰‰‰ˆ‰ŠŠŠŠ‡wl]SSZcmtwusqpomlkklmopqpolkmt}‰Ž”ŒŠ‰‰ˆˆˆ   !!""$$%$%'((*****++,.......//------,+,,**)())''''((((((((''''''''''((('''''''''''))))))))))*,/0357:?AAABA=;62,)'&''(()))))*++,-,+,,-,-.....//////----------,,,,,,,,,,,,,,-----------++,/1-*****+,AX_{xƒ~RJTe†‡‡‚ˆ€ttwsupbT>Lut€‡rX_oƒž¥®´¹»º¹£i17:<>AA@@FCDm‘†}{}€Š‰;2gƒ€}€…‡‡‰ŠŽŽƒVKDDK}’–˜›šš“P59:;<;;:941.,/@KPPLJHHLLMPQQQPMG:01aVMQM4=CFGJV]ba^^bbddddc`ZRE<977.'')**+++,,.0019=AHKFFOOKEB<E>FORF?961433453538CF=@A9:@GKIG?7QaV^tƒ†Š‹ŠŒŒŒŒ‹Š‰ˆ‡‰‰‰‡†…wndVMFFLSVYYYZZZ[[[[[[ZZWTOIA::989;<=AJX^alw€†Š‹‹‰„€}zzy{}„‡Š‹‹ˆ†‚‚ƒ‡‰ŒŒ‹†„|xvttuuuuuutqlf]UI@:=EQ_mz…‹ŽŽŒŠˆˆ‡‡‡ˆŠŠŠ‰…~wi\QSZenuwvtrqonlkklmnoppnmkmu‚ˆ’•’Ž‹‰†‡‡…ˆˆ  !!!""$$%$%'((*++**++........//------,+++**)())''''((((((((((''''''''((((''''''''''(((())))***)*,-..13677762/,)((((''(())))*+++--,,--..//../0//////-----------,,,,,,,,,,,,,------..---.-,-,,,**++-8OQy‡€Tb[OJMi›™‰†‘Ž|ty|z€yoH?^xxu„†nScq˜¦©¬°·ºµšN/9:>>=@A>ABBK{Œƒ}zx‹@wƒ}{‡‡‚†‹Ž‘‘‘’mNLEI|—–——–’U59;;<;;9743.-,9IOSVWWWWVSQY[XOB3,(,]^OPJ,/49?T[`e_`jlmhiiij`TF?::992)(,*++***)*-..2=IKMPNXOILHAFMQVNB/264//1460/8K@;85NTIA99@DGA9=Q[Tk‹‘Ž‹Š‰††„€~}}}|yxoj`VLFDGKQTXXWXXXYYYYZZZZVRLFA::989;<?ALTW`lw‚‡Š‹Šˆƒ}zy{{}„‡‹Œ‹‰†…‚€€ƒ…ˆ‰ŠŒ‰‡ƒ~ywvusuuuutttqke\TI@;>FRan{†‹ŽŽ‹‰ˆˆ‡‡‡ˆŠŠŠ‰…}sfXPS[gqvwusrponlklmmnpqppnmqyŒ”—”‹‹‡†‡‡ˆŠŠ  !!!"#$#$%&('()++++,,..////////----,,-,+***))))((((((((((((''''&&''''((((''''''''''(((((()))*))******,,----+*)('&&((((()))**+,,,-....//./001111/////-..//..--------,,,,,,,,----..........--++++,-0JKP…bMHEJSh®©¡›— ˜Œ„vvopkoO:;Hb„Š„~iV\yŸ¥§§©³©|729<=<<?A@B>?BQƒŠ‚{{v€wƒ|w|ƒ†|„ŠŒŒ‘’“‘{ROGIx•“””“`7<;;<==:841/+-8Xmvuoja]YV_eb\K4&%%'TcLLH-..0T`fbaexqpigjkml\IB?<===6/12210.)(%'+../9ALOIV`QJF?GKLEEJF1#093-./0,/?Mx_C<EPTSL=9:==A8<MXj“ŽŠˆ†…|wsrrqssqoke\TJFEHLRTXXXXYYZZZZYY[ZVQMGA<989:<=>DIPYboy‚†‰ŒŠˆƒ€}zxzz}ƒ…‰Œ‹Š‰ˆ„ƒ€‚‚…ˆ‹‹‹†ƒ}xxvstuuutttspjd[SG?=>HTcp‡ŒŽ‹‰ˆ†††‡ˆ‰ŠŠŠˆƒ{qcWQW`jrvvurrponmmmmmnqqqmmot~Ž–”ŽŒ‰‰ŠŠŒŒŒŒ‹Š !!!!"#$$$%%&'())))++,,--..////..----,,,+****))))((((((((((((((''&')(''((((''''''''''(((((((()*))**))))))*****))(()(((((()))*+,,,-.//////./0011111/00//..//..--------,,......--....//......--,,++-.5VIh‰KGEXr†—¡§­­¬§¢›€†‹}okmsr]??83Gmw‚~Y]p€’ž¤¡ŸŠO4;;:::8;:<?>BMOd‰…{ywy„Ž‰|x~…€~ˆˆŒ’‹‰ƒSIHOp‹‘””’‘Œj:<;=<=<85400..[€„}soi[WUTZ]]XE,&)(*HlULJ/,/Tkkkgl{yojhegkme\RJEA@B?<9768630*##$(,-./8AFQ[`RKLTQZc_WQI5!+<<1.00.+*<v‘”‡eI?JPPQN<7BDB:CWhŠŠ…‚|{vqliiiklnnmhc\SJFFIMQUYYXXYYZZZZYYYXVQKE@:98:;<=AFKT\dqz‚†‰‹‰‡ƒ€|yzz{ƒ…ŠŒ‹Šˆ‡‡‡„ƒ„…ˆŠ‰†‚}xwutussttttrojd\RG?>CMYer‡ŒŽ‹‰ˆ‡‡†‡ˆ‰ŠŠŠˆƒzobVSX`jsywurqponmmmmmnpqpomm}”˜“‰†ˆ‰ŒŒŽ‹‹ŒŒ  !!""""#$%%%&&'((')***+,,,,....//.-----,+*)**(())))))))))))(((((()*,)&(''(((((('''(''''((((((()()))))****))())))((*))(())(())*+,....//.//1111111111221111/////.------..----,-...-............------./?]nnnG>aŽšŸ¨¦¡££«ªª©Žwx|zb[KHCDJqy}o^jwˆ“œ™’ŠlD:=:<=ACC?=<>BHJRmˆxuv|…Šzv{y…t}‘“‘’hEIQg„“ŽˆŽ‹u<9:<=;:944/.+K{~zvrpe_XQJHCDGB400-.AlZML01Ejmrox‚|vnifchlomh^XTPOIA=<9<986,%"#$&*..-.2D^eh\PVXdlinlidZG8846/--4<?EYvz…‘’‡oQDLTUR>9=DB8=WoŠ‡{xsokhgfghjllmoic\SKGFIMRSXXXXXYZZZZ[Y[XUPJD>:989:;<AGLS\gs|‚†‰Šˆ…€zyyw{‚†ŠŒ‹Šˆˆ‡††ƒƒ‚‚„†††…ƒ}yvtrstttttsomgc[QG?@FP\huˆŽŽ‹‡†††‡ˆ‰ŠŠ‰‡‚xm`UT\dntwttqponmmmmmmnqqpmp†——’‰††‡‰‹Œ‹‰‹Ž’  !!""""!"%%%&&'(()****+,,,,....//.-----+**)**))))))))))))))(((()))).9+'''((((((''''''''((((((()()))))****))()))))))))()))))**+-,,//./01001111111111222211/////.------..----,-..............//..----./EtzeCRBX¨¥¤£¦¨¥£­¯®«¢‘†„…‰wlj`e[eW_w{{efr{†ŽŽ‰tJB:A>==BIJOJDB??HQRq‰{wuw|‡‚sqy{wkn‡wbs˜šš•{ECM^†‘Ž„wŒŒz@68;;962110,8q}ywuuk`VSTMEA:;;<9644>hZPP39fjqtˆƒ}zroqslcftxofe_XQJE@>@=<7*$$$$&--.,),Gdeg^[[dqy…†‚}{~wa<04.+6FFD?CLL^`\s|}{[FGLFG@7?@=A[s†ypnjhgggghjlnmmkf]UNGHKORUVVXXXXYZZZZZZXUPJD>:989:;<BGNV_jt}‚†‰Šˆ„€}yxxx|€„ˆŠ‹Š‰ˆ‡‡‡…ƒ‚€ƒƒ„ƒ„ƒ„yvtsrsstssromfaYOD?AGR^jw‰ŽŽŽ‹Š‡†††‡ˆ‰ŠŠ‰‡€vj]TT\entwtsppollnnmmmnprmw—”‹‰‡†…†ˆŠ‹‹‹‹‘Ž !!""####"#$$%'''(())**+,,---....//.---,,,+****))))))))))))))((((((((''''''(((((((())((''(((())))))))))))))))))))))))())*)**++,-.,-..00111122222212111111110/////...-....-----..-....////......----,,./DmLB@EQ†¨­ª©  ¡¡ž¬¯¯¥ ¢›‘’“vnaenihfep€‚l`nv}ƒ„yT.4>D>?@?@@IEDM>:AFOIx‡}vsyz‚ƒuttpWa}wm{”•˜˜ŽUBEdš—‹r…~A77998432/0.G{‹yptpom`ps[:F@:;;;:8=]\PSA^jnx‰Šƒ~zz}|n__^iwtmeaYXUQKGDB>2'#"$#*1..+*+K^_aT\Ya`m{usyzzrjT504>?=978>Qlkb]]csi[NJFOPI?=@>A[x‚rlkihgffhjlmmnkc\VNLIKOSTVVWWXXYYYYZZYWUPHB=:87:::=CIPXakv~‚†ŠŠ‡ƒ{vvwy}…‰‹‹Š‰‡ˆˆ†‡……‚€ƒ‚ƒƒ„ƒzwsrrsrrrqppme^XNC?CJValy„‹ŽŽŒ‰‡†††‡ˆ‰ŠŠŠ†~tg\TW^gqvvtromlmmmmmmmomo‚“•ŽŒ‹ŠŠ‰ˆˆ‹‹‹‹ŽŽ   !!""####"#%%&&'((())**+,,---....//.---,,,+****))))))))))))))((((((((''''''(((((((())((''(((())))))))**))))))))))))))()++**++,,..-///00111122222212422222110/////........-----.......////.......---,,./=TGCDTt›³²£¦¨¢¤¥£ª§¥ž—˜¢¡•“Šqdcdimgfkuyt|`kv}z|j<,29?>?@???BFHJA<>AJMLy‡}uvz†ˆxl[V\w€†‘Œ‹“cCCOŒ ¡–^‚?78977744566M”‰~qŸ—•†~€P;DD<;:<<;S\NWeqs‰ˆ„€ƒƒ…xg`_^`bb_ab]XUSROMHF<)$#%$%.2/.++2N\_WGQ[]]amzywwurhijZJF>.6;5+*4T‚Š‹‰~g]SNPVNLM>8=>EZƒ~sigefhfijkmmmjf_XPMKMQSTVVVVXXYYYYZZXVSNGA=::9::;>DJQYcmw~„ˆ‰‰‡ƒ}yvvwy}…‰‹‹Š‰‡ˆˆ††„…€ƒƒ‚{utssttssrqpme^VLC?DKXcn{…ŒŽŽŒ‰‡†††‡ˆ‰ŠŠˆ„|rfZSY`kswvtpponlmnnllmmrŠ–’ŒŒŠ‰ˆŠ‹‰‡‡‡‰ŽŽŽŒ    !"""""##$$$$''('(((***++,,--......--..,,++,+++**))))**))))))))))(((((((((('&((((''(((((('''(('(())))))))))))))******)(****,-,--../00/.002011333322243333331100000/..//..--.----..-................---+//>FFCNq„¦²±˜š­®±²¶·¯¬£™’˜–~vi[ojdehnvz‚‚{jfr{{x_1,01:CDDA>=<9CJH::=HMCR†„|y||ƒŽ‰kHQTk€’˜“‹ˆ~mJCDv™ ¡Œs“v?:;;<>?@>CB2V  ‡}“—˜„opkU27?D?;<=<J_]gpo}ƒƒ††…Š‰rcbdfceb^UNTTURRPPNKC/%#$$&+442/-5DP^ZGCIW]\\ar~yqhimievhH:-0064./4R‹Š…a^r|viXKGCEGBA@Am„qjhhfgijlmlolg`YRMLNQSTVVVVVXZZZ[ZZZWSMF@=;::9;>>DLQZeoy~„‡‡†…|wvvx{}†Š‹‹Š‰‡ˆ††…†…‚€€€‚ƒ‚|wstrrrsssppmd]TJCAENZer}ˆŒŠ‰ˆ‡‡ˆˆ‰‹‹‡ƒ|qcXSZbksuuspnnmnlmmkmlv˜’‰ŠŠ‹Š‹ˆ†…†ŠŒŽŽŽŒ      !"""""##%%%%''(((((***++,,--......----,,++,+++**))))**))))))))))(((((((((('&((((((()(((('''(('(())))))))))))))******+*****----..//00/0012322333355334433331100000/////.......-...-................---+.09AEOp†°µµžŒª¯³µ¹¸³­ ˜’•š—”{zjbi`acst|€†‘~RbpxuX,(+17<@AB@>><;AA<=;AKH9ZŠ†}{{€†‹EIV_xŠ“™š—•‰tqQDEWˆ™–v‚JBBCDFDC@==92n©¥¢›~ˆ…|yg[IA7548?@;<:Cahkqv„…‡ˆŒ’•€e`ghjjhdd^M;=LRPPQPMI>*""%'*056425EQPRF@FHP[\_[bnhfcXQRYciK301./2/,-8o„€€rv„††…xM=FB?CELbsxmjgighjlnnojg`YROMNQTUVVVVVXZZ[\\ZYVSMF@<:;;:<@CHMT\gpz„‡‡†ƒ|wwwx{}†Š‹‹‰ˆ‡ˆ††‡†…‚€€€‚‚€}xtsssrttsqpmd]SGAAGP^ju€‰ŽŒŠ‰‰ˆ‡ˆˆ‰ŠŠ‡ƒzn`UV\dmsuuspnmlmllkngw—‘ŒŠŠ‹‹ŠŠ‡„‡ŠŽŽŽŽ‹"!""!!""######$$$$''''(((***++,,--......--,,,,,,,+++*)))))**))))****))))(((((((('&''''(())((((''''''(())))))))))))))******+*++,.,--..//01111112332443344444433332211000000//..........................----,,,/<DUt…Ž¥³´·¡œ¡«¥©©§¨£›’‹‘’‰|xqggemnqt†‹š ›SRjutR'(+.86:IDA?=<:9=:=;?GMDF{‡{y€…‹|GOXzŠŒŽ‘““yaFCDi™˜Š_DA?=?@=9:7R`B…®¢•Š‰ŠŽqhiZQC864324>C?<AWkntz‚…‹š˜igffimpmkf\B00>LRQRSRJ7&""'+,3659:@KROD7<AIPTWW]`cY\\H=72:GWO6//21/..I_gx{y{|~‚€wkobT>CHEEGEPPS^cgghkllmolga]TOMNRUVVVUWYYYZ\]\\ZURLFA>===<>BGLPW`irz€„‡‡†ƒ~yvxxy|}†‰‹‹ˆ‡†‡†††‡…€€€}xtqsrsttrqljd]QE?BHT`kx‚ŠŽ‹Š‰ˆˆˆ‰‰ˆ‰‰†‚xm^VU]fotusqpnnmjikjh~–—‘Š‹ŒŒ‰‰‰‰‰‹ŽŒ‰"!!!""""######$$$$''''(((***++,,--......--,,,,,,,+++*)))))**))))****))))(((((((('&''''''''((((''''''(())))))))))))))******+*++,---..//001111123234444444554433332211000000//....................--..------,,,/?Qo†‰˜®¦¥²p~¦Ÿš¤¬© ™Ž…“Šˆzsljckqut}…ŒŸ©­nJejhL*+&,.>MKJBAA?<;>;;=>DHFFwˆ~{{}ƒuJRv‡…„€‡ŽyrNFCKsrLE@?=>=<::5GdX©›—ƒ~‚€f[PMMC6643126>IHBE`osx€ˆ–“sqkkjklpspjX9./3BOQRRPA-%$'+-0;?BABFGHLB89>HOQNVYYXOC3,.1334BOO:7618;6N=<Spuyzub]kqq…m>LE>HHKMNQUV_dilnnnkgb_VQOOSVVVVUWYYYZ\]]]YWRLFA@?>?@BEJNR[bkt{€‚……„}yvwwy|ƒ‡ŠŠŠˆ‡†‡††‡‡…„€~€€€~yssrstsssrnhaZQE?BKXcny„ŠŽ‹‰ˆˆˆˆ‰Š‰ˆˆ…wl\SW_hptusqpnlkmjil‚––‹‹‰‰‰Š‹‘Œ‰""####"#%%$$$$$%%%''''(((***++,,----....--,,--,,,+++*)))******))**)))))((((('''''&(('''''((((('''&''(())))))))***********+***,---..//0010011132455665444665444332222111000//...........-.---......--,,,,----,0Ce€Ž‹¡©š«—pr‘¥®®¬¬§ž˜„‡“Ž‚€ƒ}pifnrs{ƒ„“©®ŠG_^]G..3.-6G:>FCB@<>=<<<=BKLHzrzŠ‡€|{€…ŠlMc{€yndk}‚_EDBLcpTFEA>===;:814Zj¥“€yvmeWLCBA74334:CKSSSEGOUX\s…‡|€€zqmlopvwqiS4-005HRTQH8-*+,.2>IMNOONGEF:8:>BJOOTSI@-+A`z›£¦¥¥£”~k]WF2=@5?Yosyzj\ayŒŽ‡†JCG<EKEUcXVUSWZ_ekkmmg_XTRQUVUVVUVXYYZ\[[[XUOLFBA@@@BDHLRV\dmu|€‚„„‚€{wvwv{|ƒˆŠ‰‰‡††‡‡‡‡†…ƒ‚€~~~~~yusssstsrqlf_XOE>DMZeq}…‹ŽŒŠ‰‰‡ˆˆ‰‰ˆ‡„~tgZSW_irtuspollkljj„—•‘ŽŒŽŒŒ‰‰‰‘‘Œ‰#######$%%$$%%%&&&''''(((***++,,----------,,,,,,,+++*)))******)))))))))((((('''''&(('''''((((('')'''(())))))))***********+***,--..//00111133333355666655665444332222111000////../......-.-,,------,,++,,----,0Jx‘™“’‘™£œˆˆ©²¶ª˜˜Ž„„Šs{xtvsiqw|„ŒŒ—©°£RUWV@*+AC20037DA@@=?<==;;?DJG{vjŽ†|z†ˆ`Rfmc^^^k‚‰~H?CAABGHDB?=>;95225Td‚¥Ÿ€|vi_UTLD?834;?GRVY[XYYMIGIOU]izŠŒ†xihry~zmF.,0317IOI</.-.12GY[Z]^YTOG<76<AFJMNK=2)7Xy¦¶»»»»º»ºµ®ª™h/1540?Xku}€{w‚†‚s|mbAJEHMNnuhbd[VVW]]ddda[UTSUVUVVTUXYYZ[]\\XUQLGCBABBDFKOTX_fov|‚„ƒ€}yvuwx{|…‰‹‰‰‡††‡‡‡†††…ƒ€~~~~~zuqqrssssplf^VMC@EQ]gs~†‹ŽŽ‹Š‰ˆˆˆˆ‰‰‰‡ƒ|sfYT[ckrrtropmkjkk‰˜”‹‹ŒŒ‹‹ˆˆ‰‘’ŽŽŽŒ‰$#"#%%$%&&%%%%%&''(((((()+++,,,,.......-,,,,,+++++++**********))****))))((((''''&&&&&&&&''''''''&&(((((()))))))*****++++++,,,,--////112233433444456666665666554433221010000//.-/+.--.-----,,,,,,,,,,,,,,----+0[†—›ž“‰“–š §¬­¨‘™Ÿ‘‰Šrwvwz{rx}„Šƒp®¥XNPJ5(*7C/-0007CE=A><;;9;@EKH|~sj„Šƒ}wzˆƒZ_d[\]\ew‚‡o?@A@?BFDB>=;98400;Ub|›|pskXUPE997<CJOTVYX[]\`ZJDDKS\i|–waZu…ˆŠŠp6-026628DA1,0221<Waahqm`WPF627@IJLH<3,0>ZzŽ¤»¾¾¿¾¾¾¾½º·´°ª}9(024?Mdtw‚ƒ„||‰Š‡LHHOSPZtkjie`]YYZ]^]YWUUUUUUUVWWXZZ[\\[YUSMIEDDEEGJNRV[bhpu}€ƒ„‚{wuvvx{~‚†‹Œ‹Šˆ‡‡ˆ††‡‡††„}{{}}~{zvssttssqojd^UKCBIT_jw‚‡ŒŒˆ‰‡‡ˆˆˆˆˆ‡‚{reWS[bkrvvqolkihk‰—“‹ŠŒŽ‹Š‰‰†ˆ‹‘‘’‘ŒŽŒˆ&$#$%%$%&&%%%&%&''((((())+++,,,,.......---,,,,++++++**********))****))))((((''''&&&&&&&&''''''''&&(((((()))))))*****++++++,,,,--////1122334334444566666656665544332210100/0//./.8/,,------,,,,,,,,,,,,,,--,++2g„ œ™™‘‘Œš£•“¦¤¥¡£’Ž“Œ‰‹”‚yy|~ywtv|{a3›ˆLPKE/'(,.,,+.16;FA?C=?<<;<AFEy€smoŒ‚|{~„ˆrSZRUWYfv€€†‚U??=@CCCC==864100=R_y{plj]JJA457@JNSTYZ[\^_bbOEFLR[i{™š{bmŒ˜—˜Ž\--13775353++1449T_emx|ueYJ>64@MONH6.,=HWvŒ¦¹¾¾¿¾¾¾¾¾¼º·³°®¥„8.4348Uhg~z}~‚‡Œ{hGDNNNOyxkhjhgojd_][\YWXYWUVVUVXYZ[\]]\ZXURNIGGGHHJNRVZ^dlrw}€„ƒ}zuuvxz|ƒ‡‹Œ‹Šˆ‡‡ˆ‡‡‡‡†††‚€}|}~~}}{wssttssqojd]TKCCJVbkyƒŠŒŽŽ‹Š‰‡‡‡ˆˆˆˆˆ‡‚zpcYT[dmtuspnmkijŒ™’Š‹‹‹‹‹Šˆ„„ˆ““‘ŽŒˆ(&$%%%%%&&&&''''(())))*+**++,,,,,,,,---,++,,,,++++************))))))(())((((''''&&&&&&&&''''''''&&(((((()))))))***++++,,,,,,----//0002223333344455565566665555553322110//...../MK0----,,,,,,++++++++++++,+,*+5h{Œ ¢¡Ÿ›š›‰Ž¢… §¦¢œ‰’Œ‰Ž„xv{}|yvokojW;]dNMPN@+')+-/;1.027JD==>@>?;;?@Djxsnu‹€||‚…^XWTT[jz}xx‡{M>@ABCGH=:8431.0<R\xtqmd]KH=875?MSY[\aa`abc]JKNSTZdu›žw‘ £ ƒA//0258:51--.049M^epz…‰pYB:99DQWQB//5CMc†¤¹¿¾¾¾¾¾¾¾½»º¸µ±¬¨ r018G5>XVou{|‚„{c†n>HGOPo~tmlhdedbb_[WUVWXXVVVUUWXY^`][ZZYXSNJIHHJKMQRV\`fmuz„{vtuvwy}…‰‹ŒŠ‰‡†‡‡‡†‡††……„ƒ€}}{}~}zwusssssqnicZPIDGO[cq{„ŠŒŽŽ‹‰‰ˆˆˆˆˆ‡ˆ‡†€xmbVV]fnuwsqolml‹—“Ž‹‰ŠŠŠŠ‡†„‚~‹““‘ŒŒŽ‘Ž‹‡'&$%%%''&&&&''''(()))*++**++,,,,,,,,---,++,,,,++++************))))))(())((((''''&&%%%%%%&&&&&'''&&(((((()))))))***++++,,,,,,----//0002223333344455565566665566553322110//.....,),.------,,,,++++++++++++,++++6f{‘££›™š›–‘…¢™œ§žšš•“‹‡Œƒzvuyyxrme\WQJPNNMPK<+'*),0.+,344459>>@@?=;=A?_‰vnln…“‡~{}ƒ‹pQPU^dq|xsl}‰kB?CBCFD=:7521/0;MZtz~xsh\YSF>?:5;PWY_dfqslf]XWVLLQYao‡™ —›žž›Œa130146674421036I\eow|ŠŒl:7:;<<>@=70/7?Ef—¶¾½¾¾¾¾¾¾¾»»º¶³­§ž›–U0LW@0CBaYm€}€xFM~[?EKNV`^URJIIJLMRQMKJOSWWUVTWYVT[dee^Y[_]VPKIJIKLORUY^chov|ƒ~ztsuvx{}…‰ŒŒŠ‰‡†‡‡‡†‡††…†…ƒƒ€~~~}zxutssssqnicZPFFHP\es}†ŒŒŽŽ‹‰‰ˆ‡‡ˆˆ‡‡†„vl_VX_gpuvsrpknˆ–“Ž‹‹‰Š‹‡…„ƒ~t~Š‘‘ŒŒŒŒŽ‘ŽŠ†''&&''''''''((''(((()***)*++,,,,,,,,,,,,++++***,++**********))))))(((())((((''&&&&&&&&&&%%%%&'''&&''(((()))))))*))**+++,,,,,----.0/102223433444555665566665555543311110///.-..-..----,,,,,,,++*)**********)*)6j†—Ÿš—•š’‘‰›—™›˜–‹ˆŽ“ŒŒ‹„yz{}wpbgaPEKQONOQLJ<'&()+-*)*,+/31619>>A>=?>?P‡uonlrŒƒ|~|„‚UASdpyzreY`xy\CDB?DH>:74310/:L`ƒŽ…maVTSFBB>8<SX[ahnv†ywrvgbfegix›˜š™—”‘†nD6667986234453E`flu|ƒŒ‘b27765567530047Bu¬º½¾¾¿¾½¿½¾¼º¸µ²«¡—’~MKUT19TjX^}~~€zyƒwMENNeWSTRPUYVXWVQONMOWUTVX[\[TWZ\b^ZZ`ddf]OLKLLMQTX\`fjpv}~€€|yuttwx|ƒ‡‹Œ‹‰ˆ‡†‡‡††‡†††…†…‚‚}~~}|yuvttsqpmgaZPFEIS^hv†ŠŒŽŠ‰‡††‡ˆˆˆˆ‡ƒ|tj]WYairvvtqlm‡˜‘‘Ž‹‰ˆˆ‡ƒ‚…|jn€‹‘ŒŒŒŒŽ’’Š…''''''''''''(((((()))***)*++,,,,++++++++++++*,++******++****))))((((''((((((''&&&&&&&&&&%%%%%&''&&''(((())))))))))**+++,,-,,--../00002223444554555665566665555543311110///.----..----,,,,,,,++*)**********++/6kŒ™™–œ‹˜’‚’•˜™–—“Œƒ„‚Š†ƒƒˆzztniajcK9COOQOPOH8'(()***)*,+.5;JG9:@@=><9;Bz‚wwuwƒ’Š~€ˆqXahv{wn\G>HZeWECEC@@9731/0-;I`Š›ŒcGSTVHDGCCHRX_hjn€‘‰ƒwf^elgmrutw‚‡ŒŽ‰„~wpV=:9898543258:Yttuxƒ‡‰b675443020..266EqŸ´»»½¾¼¼¸´¶ºº¹³®¤™‘Œ†ZRLUR14MO=h€€||xnTKLLMNPMONLDLXUMECCEGVRQ[YSYWceemkhhfmoh^QMLNNORUX\bhnsz~€‚‚~zvtstwx|ƒ‡‹Œ‹‰ˆ‡†‡‡†††††‡†‡†„‚~~~}yusrrpnomgaZPIHMW`kx†ŠŽŽŠ‰‡†††‡‡††„{si\W\ckrwwqplƒ–’Ž‹Š‹Š‰‡„…|ddtƒ‘ŒŒŒŒŽ’Œ‰†((((((((''(((((()))))****)*,,,,,+*++++*****)(+*)))**))))))))))))((((''''''''&&&&%%%%%%%%%%%%&&&'&&&'((''))))))))))**++++,-,,..//./1011112344554555666666555555432211000/...---------,,,,++++***************0@>h˜“–š‘–•Œ—›š–‹†‡‰ƒ„……Š}yqqpmlgcTJKKMNQNJH7'((())+(*.,+,7P=83<:??=<9;l‚‚ˆ’„~‚„‚YitxzxjWD97:KaTB?CCCA841/..<KZv˜žˆRGGWXMHCBLLV[\eu…–œ“{`SMbyƒŠŒŽ…tit|vsmhaS@<;98766656:Uw~{„…ˆ†c:863200/-.049<JUo‘¤¬³¶±§–š¨®°¯¨ž’‹‰Š‡XIJGWI07E4Kty}wep>LP^c]_`VRHZhhlke[SUgRGX_Zcia[gmlc`Xkl^SOOOPPRUVZ^bgnuz}‚}yvusvxx|ƒ‡Š‹Š‰ˆ‡‡‡‡††††††‡ˆ‡…ƒ€€~}yusrrpomjg_YPIJQ[epy‚‡ŠŽ‹Š‰ˆ‡‡†‡‡‡‡„€zqf\X^fnuvwrp~–“‹ŠŠ‹‰…†ƒƒ{d^iwƒŽŽŽ‘‘Œ‰ˆ((((((((''(((((()))))****)*,,,,,*+++++*****)(+*)))))))))))))))))((((''''''''&&&&%%%%%%%%%%%%&&&&&&&'((''(())()))))**++++,-,-,,--./1011112333555555666666555555332211000/..---,--,,,,,,,,++++***************,.0a†’”–Ž•••—››˜–ˆ‡€Žƒƒ‹ˆ‚‹…wywvrme^UNLIKNNNKI:)((())**+---,/3+0VDB=?@>;=\“Œ‰††‹—€}‚‡qrwwytgTC8548LZODAFDD=51//.<Mez•™s4@LNPLA<?BSX]dp…˜ž–tum]Rbx|ŠŸšœ”{nrtrlfc[YPDA>=:97779:Mv„€€„‡…€g<75631/.-/39;CU_fks{‹••Š}w€‘š›—‹‡‡†~ZDDIKQP<<Mm}wx~~l_‰‚CMYccekhYP\flmmnlga`XPJM[Z]ZVOVbeUHA]dWQQOPPPRVXZ^diov{~‚}yvsuwxz}…‡Š‹Š‰ˆ‡‡‡‡††††††‡‡ˆ‡ƒ‚‚~|xusqqqomjg_XOILS]gp{„ˆ‹Ž‹Š‰ˆ‡†…‡ˆ‡†„€ypf\\bipwvuqy””‹‰‰‰‡ˆ…„„zd^`jv„ŽŽŒŒŽ‘‘ŒŠŒ((((((((((()))))********++++++++++++++******))(())))))))))))))))((('&&&(''&&&&&&%%%%$$%%%%%%%%%%&&&'''&''('((())))**++,,,-,,-...000110111233445556565565465554442120//.-------,,,,++++++**++****+,(*))****))),Z}‹”Ž‹Œœžœ™œ•‰ŠŒ‘’‹‡Šƒ‚‹Ž€}xvtmd]RE>BGMMKHH>-(')*(()*-.,+(),.:CP;?=><>J‘Š‡†Œ“˜•ˆ~‚…duxvpcO>777:EV\O?>B?@:40./:Kg„’—h.6QdTHB>>AE[ad{‘—‚vx{p~”–‹€š¤¢¢ “~rmhgd_ZZTOIB@>=;98:4[‰ˆw{…‚|{jD6643/../15:?Ph}~ywma_becdlx€ƒ‡ˆƒ|{ncY?@7<7EZBAbvxu|‚€dL`OMijgg`^[_hjmlnnkha^__WYZXUW\]ajhB08WoWQQPQQQSVY\`djpw|€‚‚}yttvxy|ƒˆŠŒŒ‹‰ˆ‡‡††‡‡‡†‡‡‡ˆˆ‡„‚‚‚}xutttqomje^VMIOV`iu~„ˆŒŽŠˆ‡††‡‡‡‡††ƒxpd]]dksvuou–Ž‹ˆ‡‡ˆ‡†„ƒ~g__enz„‰ŠŒŒŽŽŽŽ‘’ŽŠ‰‘((((((((((()))))********+++++++++++*********))(())))))))))))))))((('&&&%%%&&&&&&%%%%$$%%%%%%%%%%&&&'''&''''((())))**++,,,----.//001110111233445556565565554444322100/.--------,,,,******))**))**/2))))(())))),Pm}ŽŒŽ‹ˆ‰››šœ˜‡‡Ž‰Š‡ƒ‰‘ƒxwwtoe_UD@CJNIKHF=-(')*'(((*,++.-3+).8<>?<:<@“ŒŠŽ‘•–—Š€…Šinwup`LB88<DZf_TMDB@?;51//;H[}’’Y2Srx`LEA?@AOfnw•Ÿ–‚s‚¥«Ÿ¥¦¦›—®°ª¥—‡{rie`]ZVRNKEA==>??>;Z…~sw~€{xnQ8753300158?BVvŒŽ‡}iZVROMT[^`d`]\ZbtYB?=B4=AK7Kegnz‚…h&bqSZ]dklfhcbhopppkgd__\ZXYYYZTT\^X6(1OaURRPQQRTXZ\`fkrx}€ƒƒ}zvsuxy|„‡Œ‹‹Š‰ˆ‡‡††††‡†‡‡‡ˆ‰ˆ††„„}xtssspnlie^VMLQXakv~„ˆŒ‰‡†††‡‡‡‡††ƒwod^`gnswttŠ•‘‹‡…†‡ˆ†ƒ…iccbfq~‰ŒŽŽŽŽŽŽ‘ˆŽ”))(((())))))))****)*********++,,++******++))))((((((((((((((''''&&''&&&&&&&%%%%%%%$$$$%%$$$$$%%%&%&&&&&'''''(((()))*)+,,,,,,-...////01/11222445555654444433333201///..----,,,,++**++++***********)))'''''''()+Ik~†„‡‰…‚‹˜’‹ŽŒ}‡‹Œ‰ˆˆ„€€…’qtyslhaSLHGF<@IGE</(()*)((**+,+-,--*,/54=<7;L–—‹’–••“†€ƒ‡‚ruum[K<87D_lrh]WOF@B?810-8D_rŒˆPNwŒƒoSJHAA>NUe|…‹’ ­µ²²²¬¥ œ®³®¤ŸŽ}slec^YWXTMHB@@BCB@Cb‚†‚xw|}yvo[@:;;<7257<@E[xŠŒ‘‘‘‚qjc\VSMGFHHLXgsoLGI>G8>EDG?HWay€8E’’€IXVQVckb]lmqtqmhd`][ZYXXYZWZ]\VE?LWYUQPQPRRUY[_chltx|€‚‚€}zxwvz{}€„‡‹‹Š‰‰ˆ‡‡††††‡†††‡ˆŠˆ‡…ƒƒ~zwssssonlgd\TMNS[cmx€…‰ŒŽ‹‰‰ˆ‡‡‡‡††††ƒ~wme`bhovuq†“‹‰ˆ‡ˆ†…ˆkeebbhv‚ŒŽŒŽŒ••***)))))**))******)***********++))***)))**))))((((((((((((((''''&&''&&&&&&&%%%%%%%$$$$%%%%%%%%%%%$$$&&&&''''''(()))))+,,,,,,-...////0010122233555554444433333310////..----,,++++))****))))))))))*))&'''''''()+<sƒ‹Š†‹‚z~Ž–Œ‹z‚‰†~nv†„ƒˆ}qqqqocYQOMHF@AJEC>0'()*)('+**+,*)*)++-.17:@Kkœ™‘‘–˜—‡’Žƒ‚„‡ˆurtm[ICCCJWeok`UPPIAA@:5/2C[qƒyNc‡‚zzeG=E>NVP]yŠ–¥±³µ³°­«¤›”ª­¦¡¢–‡tnjda\bpg\QHEDDDDDP|’ƒ{z~wui_\Y]\_P48;>ABWo‚…Š‘Œywupcca]\[^afmpfBA=@BC;LAIG?Rgv€peŠ“„PPWKJVOKWqrrtqniea^\[[YY[\\\\\XVZ[XUUSQPPRRUX\_cinsw|€‚‚|yvwx{|}€„‡‹‹Š‰‰ˆ‡‡†††††…††‡ˆˆˆ††ƒƒƒzwssqqonkfbZSNPU]eq|‚‡‰ŒŽ‰ˆˆ‡††††…………ƒ~wmdcgirwr|’‘‰ŠŠŠ‡‡„‡…rhifbbjx…ŽŽŽŽŽŽ‘Œ‘˜•))****(****())++**))******++******))))((((((((((((((((((((''((''&&&&&&%%&&'%%%%%$$$$$$$$$$$$$%%%&%%&&&&&&&''''''''))(*,,++,,-...//00111012222244555544332233220./..-----,+++**))))))))('(((())))))''''''''&(),2k‹ŠŒŠƒz„ŒŽ•Š}}†‚sgd~‰†‡ŠŽq^_^`gdQQSUMLNNJFE?1'')))))(+(),*+*+,-,,047Uz‘•’”•—–›zŠ–ˆ„††‰ƒ|{vqssu}ˆ‹‚jY[ZUNGFGA72?Njxl\„•—‰„‹‘tL@>JULRmŒž¨±³°¬¨££¤¢Ÿ£œ•’‘Œ€smkhmmjsjcZSKHHICBN}”˜Ž‚€}wriiotzzve=68:>BNaz†‹„zx{{zsfdjg`\_fgjnZ[[X96:>MKCFDO`y|[rŒ’„TGRK6GMelprtsqoke_][[ZZZ\\[\][Z\ZWWUSQPPNRRUY]_cjnrv|€‚‚€~zxxy{|~„ˆ‹‹‰ˆˆ‡‡‡††…………†††‡ˆˆ‡†…ƒ€~yvrqqqonlgc\RPTY_hr|ƒ‡ŠŠ‰ˆ‡‡‡‡‡††……„~wmfegmuv{‘Œ‰‰ŠŠˆ‡†ˆ„oiiidbeozˆ‘’ŽŒŒŒŒŽ––•))))))(****+++++**))********))**)))))))(((((((((((((((((((''''''&&&&&&%%&&%%%%%%$$$$$$$$$$$$$%%%%%%%%%%&&&''''''''))(*,,++,,-...//00//1012222244444444222233310//.------++++**))((((((''&&&&''((''''''''''&()/3N‰Œˆ…€|‚†‹’Œ‹ˆwinnft‚‹‡Š‹ŠaOOPTV_]OMONKJKHGE?1''))*#*+**'&(+++*+,++.An’šš”’“•—–•z•Žˆƒ†ˆ‰‡†’”–•’”——’‰uRPRXRMGEJC64Jmˆw{”™›‘’Ÿ£Ÿ…hiZO@Mf«°°²­¥  ¡¬¤Ž £¤¤¢ž“i[do€vqnf_SJHKKGB@]Œ˜Ž‚€xuxxqv€‰„sP46;??DSiy}qlqusqmgcgf_[_cbgb\`seB7;=>FJQG;Nx{d{‹Š‚\IO>+@T]dqqrssolfa]\\[[[[Z[[\\\\ZXUUQPPPOPRUY]_chlrvy~‚€~|yy{{|~†‰‹‹ˆˆ‡‡‡‡††…………†††‡ˆˆ‡†…ƒ€~zvsqqqonlgb[RPTY`is~ƒ‡‹Ž‰ˆ‡†††††††……ƒ}wmfgjqu{‘Š‹Š‹Š‡††‡tjnliecgq~‰’‘ŽŽŽŽŽ‘’—””**))))*++***++++**))******))))))))))))((''((((((((((((((((''&&&&&&&&&&&%%%%%%%%%$$$$$$$$#$$$$%%%%%%%%%&&%%''''''''(())**)+,-,--.000011101222223333333322112322///.-----,++****))(('''&''''''''&&''&&''''''&(,1;Ek†‡…„ƒ†ƒ…‹ˆ‚ƒ„‚‡„qv‰ŒŽŽ‚[NLTXTGWb[ONNKJKFC=/%'(*,Im8#(,,))+,,././2T€˜ ˜’’•š––~{‘•‰„„ˆ‹ˆz’”˜™—–———–…`VXXZ\UJFGB:>a‰“•—–š¤¥¤ “†“š†_@OŒ¦®°¯­¢œž ¢Š¤¥¦¥ Ÿ”[<J`z‡~sleZJFHLKGADo“uz…„…ƒ}~ˆ†‚wa55:<=@HUflkcgif```[Y\][Z[_`_JQ\g`I:C?7ACFRGHex„ˆ‹…}RJT=-GA05eussqnjfa^][ZZZ[[Z[\[[\[ZVSRMMNNORUZ]`cejquz~‚€~|zz|{}~†‰Š‹ˆˆ‡‡††………………†††‡ˆˆˆ†„‚€}yussqppnlg`XTPW\clu~„ˆŒŽŒŠ‰‡†††††‡‡†„ƒ|wmggntzŠ“Ž‹‰‹ŒŠ‡„††vllmliffju€‹ŽŽŒŒŽŽ––”’********+*****++**))++****)))))))(((((((''((((((((((((((((''&&&&&&&&&&&%%%%%%%%%$$$$$$$$#$$$$%%%$$%%%%&%%%&&&&&&''((())))+,-,--.////1110122222332233221111110////------,++**))))''&&&&''&&&&&&&&''%%''&&''')18EYru}…‚‚ˆƒ~{z€|†˜¡ŸŸ’“”ŒŒ‰pWOQ]cZXUii_LFLKJGC:-$&'))9=(&'(()(*/0-0/-=a~›Ÿ”’”——””ˆ|}ƒ–ƒƒ„ˆŒ‚‘•™–˜™™™’rW[Z]_`YMDDA@n’’—–˜¤ª¦šs…š ¥Œ`l›ª¬¬©Ÿ™™™œ”›Ÿ–—šš˜”Y<AJr•}pibTJHFDEHAP}…€‡‹ŒŒˆ€ƒ~{tg>257<<AFR\][^`\VYYTOSTWXZ]WEBLU_la9;631=Y[eWVp€†‡†ƒ…cIJE8=@4=ftttrnifa^][ZZ[[Y[[\][[ZYUSPOOLOQRUZ^adgjptx}ƒ‚€|{|||}€ƒ†‰‰‰ˆˆ‡‡††………………†††‡††‡…„‚|xtssqppnif`XRQW\dnv„ˆŒŽŒŠ‰‡†††††‡‡†„ƒ|wmiimuŒ–‹‹‰Š‹ˆ……‡|lmonmkhhnwƒŒŽŽŽŽŽŽŽ“—””’**********++++******))***)**))))))(('''''''(((((((''(('''&&&&&%%$$%%%%%%%&%%%%%%%%$$$$##$$$$$$$$%%%%&&&&$$%%&&&'''''(()))+++,,-....011111113221123212233000000..----,,,+*+**)))(''&%&&&&&&%%&&%%%%&&''(&')*+7F[u{tdmqtxullkls€œ¢¤¡”•ŽŠŒz^WY]aba^fglp_[SMHHB7*'''((&'''''&'((*+-/,5Ldx‘œ—“”˜•”‘ƒ~|}“Š†‚…‰|ƒˆŽ’•—˜——Šrdac\[_]VJB@?^’–‘’’™’h[q—¡¦¨™}ž¥©¤™–•”—ŽŽ›•””“•–“…WACJaœ—‰{qjbQGBAFHD@a”ˆ“Œ…€ƒ€xtohH//28;>@CJRTWXWUTSPNQSTWYP:+<HNOSM@G?94@WJQON[p{„‹‰„eKCE@38E^pttsqnie`]\[[\\[ZZ[ZZ[ZZWSPNMNNOPSVZ^`chjorw|€ƒƒ€~|{|~€‚…ˆ‡†ˆ‡†††…„„„………‡‡‡‡‡†‡…„‚€|xusrqpomje_XSRV^enx‚…ˆ‹‹Š‰†…††††‡‡†…‚|vnkko…”‘Œ‹‹‰Š‰…†Šnmnomonilqy„ŽŽŽŒŒ‹‹‹Ž‘–•”‘Ž**********++++******))**))))))))))(('''''''((((((('''(''&&&&&&%%%%%%%%%%%&%%%%%%%%$$$$##$$$$$$$$%%%%%%%%$$$%&&&'''''(()))+++,,-....011111113223321110000//////----,,,,+*)**)))((&&%%&&&%%%$$%%$$&&%&&%&(**-5EYnqa`[X^cd\SX[\]s¡˜””‰ŒŽ€`UWeiidfdghrzqmhe]KA0&&''''&'''''&'((*++,/:Vht–“—˜”’Ž~yyy…•†„ƒˆŽ…‰’•—–Œˆujgffd`^\ZQF=;[–‘ŠŽŒˆ‰‚pfa\e£Ÿœ˜Ž•Ÿ¢––’‘‰‡—’““’‘‘‘ˆ{gMNf¦£•‹zoeUHDUt‰€hjyŽ—’’”‰‚€yrkifQ/,./58;=BIMPQQPPQONPRSQC00>?8;>:?CC=>=AJGIX[J^kŠ†ƒuXFIRD<NYlttsqnid_]\[[[[[ZZ[\\ZXYURONMNNNOSVY\`cfhmrv{€€}}~~ƒ…ˆ‡‡‡‡…………„ƒ„„……‡‡‡‡‡†‡…„‚€}yrrqqpomid^XUUX^gpx‚…ˆ‹ŒŠŠ‰‡†††††‡‡†…€zsnml€“‘‹Š‰‰Š‰‡…ˆ‡qnqpopomjlt{ˆŽŽŒŒ‹‹ŠŠ’–•”“Ž++++++****++++******))))))((()((((('&&'''''(((((((''''((&&%%%%%%%%%%%%%%%%%%%%$$$$$$$$##$$$$$$$$$$$$$$$$$$$%&&&'''''(((()+++,,-...-/11110002112210/10/0...//.---,,,++++)))))(('&%%%%$$$$$$$$$$$$%%&&%'&&*.4BZrzjb^VWY\YOCKQTZm‡—†‡’Œ‘gUR[ibdjhcdjtpumplwxgD%'&*'('&''('&)()(*+.7EVft”’‘”–”‹€|„”‡‚‚€†‹‹ƒ•’“““‡„ƒ‚ƒ~xxvpb]ZQH??}›ŠŠˆ„|m\_`_cx•™¢¦žˆz“š—’“‡s†ˆ‘•“Ž‹ŠŠˆ€|`Tyª£•‡vk]LDK]x‹’‘~›˜‰‚|xtnfa^V4-.)*.38<BFJMMMNMNOKH?3,/7BF7?FF@KOLI>BMI@LRT_bt†…xKAJZaPZopqssqnje_][ZZZZZZZZZZZXWTPNMLLMMNRUX\acdgjquz~‚ƒƒ€}~‚„ˆˆ‡‡‡†…„……ƒƒƒ„……††‡‡ˆ‡ˆ…ƒ~{vsqqppnlhd]XSV\`hry‚†‰‹Œ‹‰Š‰‡†††††††……€yrnkwŒŒŒŠŠŠŠˆ‡‹‰ulnmnpppmot|ŠŽŽŒ‹’”—”“’++++++****++++******)))))(((((((((('&&'''''(((((((''''''&&%%%%%%%%%%%%%%%%%%%%$$$$$$$$##$$$$$$$$$$$$$$$$$$$%&&&'%%'''((()+++,,-.../01111000211111021//.---..-,,,,++++**)(()(((&&%%%%%%##########%%%%%&'',1@Vu|uf^WYfdWQLEIVU\dx{|ŠŠŽŽ†lZ]`kgiknlbhopkopshmr|d<),,)())(''''((**-;NZbx“ŒŽ•‘Ž‰|…†…†”‹„‚€…Œ„|‹‘’‘”š¡—œŸ˜~h]\YPH=uœ•ŠˆnZ`ppknp‚•¦¡ˆŽŽ~s‚‰„‚†ˆ„~~phƒ¥œ™•‰yocRDCHnŽyš›‘Œ‰yskf^[ZV@,+('))+/479<????<81,*+.35EU>6;?EIK?BQNJ<LLNUV_hy‚„r<=ERb[`opqssqnje_\[ZZZZZZZZ[\YWURONJIIKLNRUY]`bdgipty}ƒƒ€€€€ƒ„ˆŠˆ‡‡†„„„ƒƒƒƒ„……††‡‡ˆˆ‡…ƒ~zvrqqppnlhd\XUWZajry‚†‰‹ŒŒŠ‰‡‡††††††††ƒ~wqkq‰ŒŒŠ‰Š‰ˆ‡†ˆŠ{mqqrrtvvwx}„Š‹Œ‹‹ŒŽ’’“–”“‘‘Ž++++++++++++**********))(((((())(())''('''''((((((''''''&&%%$$$$&&%%%%%%$$$$$$$$$$$$$$##$$$$##$$$$$$%%$$$$$%%&&&&&'''())*+++++-...00001101110011110.-----,-.-,++++**)++)((''&&'&%$##$$$$######$$%%%%&&(+1=UrzvsgUQ]qtc]]QIJ[bcspƒŠ†‡ŒˆqSPWlumpmpnmmsmojrtmfsr~‹`7%(+*++*(19-)(().;MZc…ˆŒŒ‰†‹‰ˆ‡‹ˆ•‘ˆ‚}}}„‰lHXbfw“™œ¥¦¬ª¦™Šwa^ZSLIj˜˜„}r[s‰|yz€‚€‘¡£—ˆŠˆ†‡†yop|‡‹„~„™Ÿ“‚vu‚›•’†zqj`PCT}Š‡€s…‘˜˜Œ†€unhaZWQNF0)(('('&')*))(('&')++.168=EJND>:=<HXUHI:0NMECRdj}{dNBBCMV`nrrsrqmid^\[ZZZZZZZZYYWUTQOMJJIKLOSVY[`ceeknry~‚„„‚€€€„‡‰Šˆ‡‡…ƒƒƒƒ‚ƒ„…†‡ˆˆˆˆ‡‡†ƒ~yurppppokhd]WUZ]bkt|‚†ŠŒŒ‹‰ˆ‡†††……†††…‚}wqo†‡ˆˆˆŠ‰ˆ„…‰‚qrvz||~€ƒ„„‰ŒŽŽ‹ŠŒ‘’““‘”’‘,,,,,,,,++++**********))(((((((((((('''(''''((((((''''''&&%%$$$$%%%%%%%%$$$$$$$$$$$$$$##$$$$%%$$%%$$$$$$$$$$%%&&&&'''())*+++++-...//./00/011110000/.-----,,,,,++*****)()(('&&&&&$$###"####""""##%$$&''(-6Nlzuqxsnvwwuib\G/@jos}nˆ†‰‰}XGNYuqsumks…vggmv~vflyv…Œa7$(+++*0>0')))-;NZiŒ‰†‰‹‡†„†Š†ƒ‡‹‘˜—‹{zvzˆ`5OYfqx’¥°°±©¡˜†nc^\PIc“™“•‰„v]u’”‹Œˆ„ˆ”œ •zx~‚}xtq’”‚mt‡˜¢ª¦¡–~ˆ‹ƒ|vqldXEg…‰Š…|“”…€wngb]UOIC:.(&'&&&&&'((((')****,.16:=CDLHG<59NG<;@G:3AIHTdw‚ve\VkhQV]fqrsrqmid^[ZZZZZZZZZYYWURONKJJJKLOSVY^_bbdhlqx}ƒƒ‚€€‚ƒ„‡ŠŠ‡††……„ƒ‚‚ƒ…†‡ˆˆˆ‰ˆ‡†„}yurppoomjfb\WUY_fmu|‚ˆŒŒ‹‹‰‡‡†††……†††„{vp‚‹‡…‰ˆˆˆˆ‡‰Š{yƒ†‡‰Š‹ŒŽŽŽŒŒŒŽ‘‘‘‘‘,,++++++++++**++****))))''''''''''''''''''''(((((())((''&&&&%$%&%%%%%%%%%%%%$$$$$$##$$$$$$$$$$$$%%##$$$$$$$$$$&&&&&&&()))*,,,,--......//./0000////..-,++,,,,,,,+*))))(((''&&%%%$##""""""""""""##$$%%%(+5Fdyxsw||zz{vtj_UE<Jdryuq‰ˆ††„lMO]ipszxwrmq€tqjgnyz}jozuz„‚xZ.+'*(()))+++.@PYp‡†‚‚‚‚}~ƒˆŠ‡ƒš“„zwusyƒ‹\GJRZk‡Ÿ­±®¯©ŸŽtd`ZTNaœ“•ˆt^v“ŽŒ’”Ž……”™phtxkt•¤ª¨‚ZPYk„—™”Š’™“ŠƒztqpneXEg‚…Š‹‡~Œ‹†wh[SPOJB9.'$&$%%$%&%%''(')('')-./792367?FRD564JOJY>3+1?P[cb^jjVWird\[`lqsqpmid^[ZZZYYZZYYYYVTQMKJHHJKMPSVZ\^`bdgkqv{€ƒƒƒ„†‰‹Šˆ‡†…„„ƒƒ€ƒ………‡‰ˆˆ‹†‡…„€~ysrqponliea\XV\`fmt{‡ŠŒ‹‹‰†††††……†‡…ƒ€{p~Ž‹ˆ††‡‡†‡ˆŒ…„ˆŒŽŽŽŽŽŽŒŒŒŒ‹‹ŒŽŽ,,++++++++++********))))''''''''''''''''''''(((((())((''&&&&&&&&%%%%%%%%%%%%$$$$$$##$$$$$$%%##$$%%$#$$$$$$$$$$&&&&&&&()))*,,,,--......//./00//////..-,+++++++++*)))(((('&&&%%%$$##""##!!!!!!!!""$$%%%*0Dbxwqv|~|zxtph\PHQaj}~jwŠ‚ƒ‚zWQWqymr{qqquytwu€op~yto_urbmŠŒŽrN3((()**+++4GT^xŠ…€{ptx|}€„„Ž—™•Œ€vpmqz„W:O]s‡Ÿ­°¬®§Š]IMNQNN_š˜š€jP\…‰ŒŽŠˆ…Ž“{jkox€•§«§£—{SJJGYƒ˜„Šš—“ˆ}sonnofPA]‚ŽŽ…{‚€…€tbG:4342.(%%#%%%$$$%$%%%&%'(*,/015?53/*+.2>^R?@QJ<QG-+4AZ_RTIOtr€vnSQ]hprqpmid^[ZXXWWXXYYXXUSPLJHHHIKMPSVZ\^`acfjpuzƒƒ‚ƒ„ˆŠ‹Š‡ˆ†…„ƒƒƒƒƒƒ„‡„‡‰ˆˆ‰‡‡…„‚|wsrqponliea\XX\`hov}ƒ‡Š‹‹‰‡†††††……††…‚~z|ŽŠŠ‰‡†‡‡ˆŠŒ‹’””‘ŽŽŽŽŒŒ‹‹Œ‹‹ŒŒŒŒŒŒŒŒ,,++++++++********))))((((''''''''''''''(('''((())((((''&&&&&&''&&&&&&%%%%%%%%%%#####$$$$$%%###$%%%%%%$$$$$$$$&&&%&&(())(*,,,,------..////..---------,++**++***))))(((&&&&&$$$####!!!!!!!!""""##$%%$(/>Wsxqtz||z{zzrjf[NIWivˆ}p€‚€‚iKNPcnnhikptuqfuxyposvkeX`plW—’‘mdg?2')))(*5ALYcˆ‚}}|vnpstvrv}„Ž’Œ†{urppz…WQ`rŠš®²°©C=DEDKPP[Š›šžšT:=ds{‚…{xy‚|h_aixˆ–¢Ÿœ›“~UFHOk‹–•’š”‹trskhkoaHFSlx€{rnyy~}cB40.,*(('&$#$$$%%$%&&%$%'',/1022473-(&&)*.E_PXYZYVI,+-9QPTL\y}}‚‡zSQOXcppqpmhc]ZXWWWWXVXXWWUQOKJGFFHJLORUY[^_`aeinty‚‚‚‚‚ƒƒ„ˆ‹‹Šˆˆ†…„„ƒƒƒƒ„„‡ˆ‰‰Š‰‰‰‡†ƒ‚|vsrqonmkhe_[XX^cjry~ƒˆ‹Š‰‰‡………………„……„‚||‘‘ˆˆ†…†ˆ‰‘’’“’ŒŽŽŽŽŽŽŽŠŒŒŽŽ‹‹‹‹Š‹‹,,++++++++********))))((((''''''''''''''((''(((())))((''&&''&&''&&&&&&%%%%%%%%%%$$$$$%%%$$%%##$%%%%%%%$$$$$$$$&&&%&&(())*+,,,,------..////..---------,++****)))((((''''&&&%$$$#"##!!!!!!!!!"""###%'',8Lktrrw{|zz|yxqlbVNJ[v‡ˆxuƒ}}€yYGGSinokekfjsmhl~rosohigGjnTn”†qhft?MD)(,*)2<LYf…‡zyy{uljnnjkknr‡Šˆ‡…zqtrnvƒˆe`v›ª¯¨wiQB==@PYZ[‡”œ…V8ASgw{vrpopspjls~‰–›—ŽŒ}T=>N{••—•Œ~cS\`befUHBFWswqi`jpuuS401/,*(('%$#$$$%%$%%$&(+-.12463220.(&%%')+<SXNVT\WH?/2@JORXR\lsyvmYMWnrqqmhc]ZXWWWWWWXWWWTPNIGFEEGILORUY[]]_aeikqw}‚‚‚‚‚ƒ…†ˆ‹‹‹‰‡†…„„ƒƒƒƒ„„†‡‰‰‰ŠŠˆˆ†ƒ€{vsrqonmkhc^[XZ`eltz~ƒˆ‹Šˆ‰‡………………„……„}Š‰‡‡‡ŠŒŽ‘’’‘ŽŽŽŽŽŒŒŒŒŒŒŒ‘ŽŠŒ‹‹++++++++********)))))(''))((('''(('''''''''((())))((((((''((''&&''&&&&&%&&%%%%%%$$$$$%%%&&&&%%%%%%&&$$%%%%%%%%&&%&&'())**+++----....--//--------.,,,,+*)))(())(((('&&&%%$$%$##""##!!!!!!!!!""#""$%(+5Gasqsv{|yyy{xusj`UJJc‡u}z{|nMEL]hiijebdgjmluw„rc‚‚xoiGPw_Ekdf[hhnvZ:+++4?KW`„„~vywvsljkhcdifinquwx|€uqnnrx‚lzŠ•¢žwawQ=7@Xnph`Ž””`9@ao†rmjikpnjkw†Ÿ¤œŒƒ}{wdHA=Mr„†‹Š†yM/3AQa_PJKUozrlb[dppkJ,/0/+*(('&&%$%%%&%('()+02121574.+*)%&')+)+7AFQQUMVgCA@JMRSMXV_]fk{toaKVirrpmgc]YWWWVVWWWWWVSOMHFDBCEHKNRUXZ]^^`dhkpv|€€‚„†‡‰‹‹Šˆ††………ƒƒ„„„ƒ†‡ŠŠŠ‰ˆŠ‰†ƒzurqqommjhd_XZ_agou|€…‰ŒŠˆˆ††…………………ƒˆ‘‹‡‡‡ŠŒ’’’‘ŽŽŽŽŒŒ‹ŠŒŽ‹‹‹ŠŒ’’‘ŒŒŒ++++++++********))))((''))((('''((''''''''(((()*))(((((((((('''''''&&&&&&&%%%%%%%%$$#%&&&&&&%%%%%%&&%%&&%%%%%%&&%&&'())***++----....--..--------,++++*))))(())(((('&&&%%$$##"""!""!!!!!!!!!!"#$$%'*3C[noov{{wruwvwutg]UJIiˆs|z|}bIGP`acfjffhcUNVYXcgQ]YWQVD>co]€‰dWg]hfYVI9/3>JVZ~„}zvuvrpoliecba^_agecby}qlnmlu‚}sˆ“RS[Q>:Jk„Ž…rc‰{‚pLQkvŠynifbejioy—¦žŽzvqqkM=:<Kcu…ˆ—‚pD/,/?cg^Y[h„ˆsf]fmj_F*-0-+*('&&&%$%%"#%))**/4568>FCD<+'(&&&()))07?IY]U]cP@ELFMWk\SWS^kyK@]Lfkfqomgc]YWVVVVWWWWVURPKFEBABDGKNRUXZ\]^^afjou{‚‚ƒ„†‡Š‹‹Šˆ‡…„……ƒƒ„„…‡†ˆŠŠŠ‰‹Š†…}ytprqommjhc^WY_diqw}€…‹ŒŠˆˆ††……………………‚…‹‰ŠŠŒŽŽŽŽ‘‘ŽŒ‰‡……‡ŒŒ‹‰‰‹Œ’“‘Ž‘’++++++******)))))))(''''(('((((((((((((('((((())))((((((((('&&((''''&&&&''%%%%&&&&&&&&&&&&&&%%%%%%%%&&%%%%&&&&&&&'((()()**++----..----.---------,+*****)))((((((((&&&&%$###"""!!        !"!!""#$$'0B\nlmq{{tqrvxxywof\RDBn…xk€xxyqVFHQbhjmfbUTNDKHHEFJE>887;BAF^ZJˆŒpa~tpnaTKHA;>JPVyƒ}ytqqqssohe_[ZWYZaaWHIqupoifkw‚u|‡[OVN?<LvŽššo_†‹ŒŠsNceezzŽ†wmgb]bfej‚£ ’‡xleh^HB=;GZgv‰Ž…{`<,,3GivnYXf€‹ƒ…qlmeU>)*,,**('&%%$#$$#"$&%&,:BEEDGGB=5)&&&&&()'*/3:DDJWd`ZVF@;@LWXZ\>B[T28fQN]irpmhb\XVTTUWWWWWUTQNJEA@@ACFJMQTXYZ[\]`chmrz|~€ƒ……Š‹‹ˆ‡ˆ‡„…„„„„ƒƒ„††‡ŠŠ‹ŠŠˆ‡„}xsqpqpmljga]Z[`djqx}†‹‹‹‹ˆ††……………………‚Ž’‹‡‹ŽŽŽŒ‹ŽŒˆ†ƒ€‚ˆŒ‹Œ‰ŠŠ‘”“ŽŒŒ‘Ž++++++******)))))))(''''(('(((((((((((((((((())))))((((((((())((((''&&&&'''%&&''''''''''&&&&&&%%%%%%&&%%%%&&&&&&&'((()()**++,,,,..----.---------,+**)))))(''''''''&&%%$###""""!       !"!!!"#$%,<VqphntytmmprswxvnbVM=:h†‡rrwrwykNCHUgilvdWGDGAJPKKJJDGA>;;@F?O]:k{…ˆ‡„~tcTMIEA@FJQr‚zvsronprnie_[YONT`^RF2Gjmnjhhnv€|c@KNNEHo¢žj\o…‹†y51Lw“‰€wkd^[^c\f™Ÿ–‡|o\al\FB@DMWakqwvunU8+-;Rht~wd^dx††„„{i_S4&)-,*)''&%%$$$$#""#$(/:BDC?:8760'''&'((''*16:=8GQX[YVOIKCLYZRPF6Q\MVjYJYrspnhb\XVTTTSVVUUTSPLJEA@?@BEJMQTXYXZZ\^aejqw}~€ƒ…†ˆ‹‹Š‰‡†„…„„„„ƒƒ„††‡Š‹‹Š‰‡‡„€|vsqqqpmljga]Z]afks{€ƒ‰‹‹‹‹ˆ††……………†††Š‹‹ŠŒŽŽŽŒŒŽ‹‰…‚€|y{~‚‰ŽŽŒ‹ŠŠŠ‹““’Ž‹’‘‘Ž,,+++++*******)))))('()(''((''))))(())(((((())))))**)(((()*((()))('''&''''''''((''''''''''''&&''&&&&&&&&%%%%%%''''(((())*+++++,,------------,,+++***)))))(''''&&&&&%##$#"""!""!!!!  !!!!!!!!###&)7OmrikqvslijkoqvwtkcVK?;j‹tyrpxwbKHPag_`hWJFDICHNKLKMECB@>?>E@AJD:<w‡„}rbUMFDCCBFLg„wusqnlnongb[X[SNNCLOI9,FjjfjhjowzG<BIIGm“¢££¡sa]Ž†‡C+=€˜„{wh_\YXZSu¡˜€p[PY\M;:BIRW[adfjkaM7,7I\inv~vjyŒ…z}k\J,%(***('&%$%%$###"""!&/7:<?>==;81('''(('(&*1;=79BGI[^[\GFADKKIV`R@YRcn^J\stpmgb\WUTSTTTTTTSRNKGC@??@AEILPTWXYZZZ\^bgntx}~€ƒ†ˆ‰‹‹Š‰‡†„…„„ƒƒƒƒ„…ˆˆ‹‹‹ŠŠˆ‡„€|vrqpppoljga]Z\`hnu{€…ˆ‹‹Š‰††………………„†ŠŒŒŽŽŒŒ‹‹ŒŒŒŠŠˆ†‚~|yyxy|€…‹ŽŒŠŠŒŽ““’‹‹‘Ž,,,,,,,+******)))))('()(''(((())))(())((((()))))))****))()*((()))''''&''''''''((''((((((''''&&''&&&&&&&&%%%%%%''''(((())*+++++,,------------,,+++***)))))(''''&&&&&%####""!!!!! !!!!!!!!!!!!#"#)0FftmkptsmkhijmpsurkcVJ>6f—’~quxz\CHQek_]_PDFILGMQOMJJDBA@A?@BDCCF@n„‰‡ƒzkYNKECBBADG_…xvtqnjikjga^ZVPG>63;=867VmggffgowqF:7;_Œ£¦¤¦ž‡u`eyŒ†‰K1@„—‡ƒzsbZXVVNTˆ›’„yjONYP;19BKQWY\_cfe\J60=Qcikku|~™œ’‚z|wdT>*&'))*('&%$%%$###"""#*3:=?A>>;630+&''((((&)-2319<:DU[RW\D?DQTU^i]Lbwx~gDXktomfb\WUSRSSTTTTSRNKEC@??@AEILPTVWXYYYY\`dkqx}~€ƒ†ˆ‰‹‹ˆ‡‡…„…„„ƒƒƒƒ„…ˆ‰‹‹‹ŠŠˆ„{urqpqonkhe`\[^cimv}‡‰‹‹Š‡††…………………‡ŽŽŽŒ‹‰‰‰ŠŠ‹‹‹ˆ„|yxxwwx{}ˆŽ‹‹“’Œ‹‹‘’ŽŒ‹**************)())))(((())))))))))))))))))******++**,,,+****))))))((((((''''))))))))((''((''''((&&''''&&&&&&&&'''')))***)*,,,,,,,,,,..--,,,,,+**))))))((('&&&&&&%%%$##"""!!!    !!    !!! "$#$(/B^qmjottlhfdadintsskbUH81U”‘„vnszm[HKSda\]ZLDJONNORSRKGGEFILA<>@?CEDW‡‡†€rgUJGCBAB@>@\‡ysopokhhhea]YTPH91155556<iligcehm}X02As˜¢¥§¤•…m\vq‚‚`7>w‘‡}shVRUTTMq›–…yn^OZaT54;GNTX\^abc`YF9?KZdgfglph“™‚ysi^T?,())())'%%$#####""!#%09<=>?@<831/*''((((&&(-.1347:<JZZJSOC=@IHLPLZmwnidEWmuunic[XSRQPPSTSSRQOJEB>=>@BFIMNRUVWXXWWX]bhnuz|‚…‡‰‰Šˆ‡‡……„„ƒƒƒƒƒ…†ˆ‰Š‹‹‰‰‡‡„€{urqppoljfc_\]_ciqx}‚‡ŠŒŒŠ‰‡‡…………………ŽŽŽ‹‰ˆˆ†‰ŠŠ‰‰ˆƒ}yvvuvvwy{{ƒŠŽŽŽŒ‹’’‘Ž‹‹‹Š’“‘ŽŒ‹**************)((())(((())))))))))))))))))***+**++--,,,+**++*)))))(((((((((())))))))((((((((''''''''''&&&&&&&&''''((*****+,,,,,,,,,,--,,,+,,,+**))))))))('&&&&&&%%%$$$"""!!!    !!    !! "(5%&-?Wrtlntunieb_\_inswqjaTG6-J’„trrvaOJLO]YSROCFMONKLPY[PHHIFHLPNBA@@CDA€ˆ…}n_QICA>;=<9;T…}qopnhfgec_\VUPD533113356Mplhfecltt>,O~˜ £¢˜Š}cZw`v|r:6oskXNORRQW†–‡wmcXTVZUB?DKRW[]_`caZRHELR\bdgkpy€™Ž}sng_ZU@,*'(())'%%$####!""!#,7<=>?@?<8530+('((((''&+.135557;CMOBFUZ>AO\TVY\bMS\JRivwple_WRPPQPQSSSRQNHDA>=>@AEIMOSUVWWWVVW[_fmrw}ƒ†‡‰‰Šˆ‡††…„„ƒƒƒƒƒ…†‡ˆŠŠ‹‰‰‡‡„ytrqppoljfc_\]`fkry~‚‡Š‹‹‰‡‡‡…………„‚‹’‘‘ŽŒ‹‰ˆˆ†ˆŠ‰†ƒ}xwtuvwwwxz{{€…ŠŽŽŽ‹Œ‘‘Œ‰ŠŠ‹”“Œ‹****++******))(''()))())))))))))(())**++*+++++,,++,,,,,,,,,,*)))))(()))))))))))))))))))))))))(''''''''&&&&&&&&''''((()++**,,,,,,,,,,,,,,,+--++*)))))(((('&%%%%%%$$$#%%"""!    !!    !!  "%(,>Vounqsvojea]WV]iqvvrk`SF58[‰|prsl\QFGPTLDACDGMKKJLN]\OFDBA@@RVD=A>D>>i‡vmd[TD;888779B~~rlljhdc_XVWVRL<..1/./0275drja`cgis_9^|™›”ŠnNR^CavsG7rxlaGGGMNNdƒˆwh^ORTPLSUPSVY\^__bdb`RJNW]`dlolp™Ž|oieb[YS=+(&''(&&%%$###$"!!"&1;==?@A@>;864-&$&&''%$&(,/0256777<IFFKPGCFNMUdbZTVVOEIezqlf^XRPPQOQQQQRQLHC@>=>@DGJMOSUVVVUTUVY]cjpv|€‡ˆŠŠ‰ˆ‡†……„…„ƒƒƒƒ…†ˆˆ‹ŠŠŠŒŠ‡ƒ~xrpqqpnljeb^]]ahntz„ˆŠŠ‰ˆ†††††„„„‡’’‘ŽŒ‹Š‰‰‰†ˆ…‚}zwwvuwwwxyyz{|€†‹ŽŽŽŽ‘ŒŠŠ‰‹’•“Œ****++******))(''())))))))))))))(())**++++++++,,++,,,,,,,,,,*)))))))))))))))))))))))))))))))))((''''''&&&&&&&&''''((()**)+,,,,,,,,,,,,,,,+++++*)))))((((&&%%%%%%$$$#$$"""!          !! ""'-<Vpunnswpifb\TPP^krxvog]PD56Mw†tmps^LTEDLHEA?DEGFIIIIPVVOEEF?>=;9D??>=A@J€tlgdTA;6764468b~smjgec_\QLNMIE6**/.,./018Oojedcabfp[c{ŠŒ„zmRFFCBW~upU:vŠtk\BEGLKRkvui^TSTVXC<PZY[Z]`bcdfebVP^giglxl]w“|nga_]VUR?+(('('&&%%$##$#"!!!)5<>>?@A@?=<85+$"##$$##%&*.10379<;:9889CMLLQ[UX_aWEI_dKOqtmd]XSQPOQQQQQPOLHC@>=?ACFINOSTUVVUTTUW\bkpw|€ƒ‡‰ŠŠ‰ˆ‡‡†…„„„ƒƒƒƒ…†ˆˆ‰‹ŠŠ‹Šˆ€}wrpqqpnljda^]^biqu{€„ˆŠŠ‰ˆ††………„„…‘’Ž‹Šˆˆˆ‰ˆ‚|wwvvuvvwwwxxz{}ƒ‡ŒŽŽŽŒ‘ŽŠ‰‰ŠŒ‘“•“Œ********))*))))'()))))))))))****))**))**+,*,++,,,,----..,,,-+*++**++****))**++****))))))))))))))''''''''''''''(())(())***+++++--,,,,,,,,++*)***)))((('((&%%%%%%%$$$#"""""!!    !! #')9TovpnswskeaZTMJO]iotsme[NC75I]kfhqSEGC=BEGCBDEHFGIIIKQQNF@BBCED>;B==>?@:m{rkfcM@D=411235;rrieeeb`ZQKNOKE6-**--.//.7@inifb`\`jiiw„†xlT>FBAKX}xjbBz†tfW@BHJLVdge\TSTVVE4.8Vg``_ceddggg\_imlr{r^`‚ˆ|le_]\WQPN>+%&''''&%%%$$$!"!"&1:=?@@@CB@?>;4,$"""$$""$%'*./15:===71.+.6HVXPRYYiiLIbbZLmukc\XXZROPPPQQQNJFA>=>@CCFJMPRSRUWTSSUW[bjpv|‚‡‰‹‰ˆˆ‡‡†…„……ƒƒƒ„†‡Š‹Œ‹Š‹‰…€{trppppnljc`]]_eipu|ƒ†ˆŠ‹‰ˆ†„„……„„Š‘“’‘ŽŽ‹‰‰‰ˆ‡‰„zyywwwwvwwwwvxyz{„‰ŽŽŽ‹‹‰‰†‰Ž•–”’ŽŒ‹))******)))))))())))))))))))******++**+++,++++,---------,,-,,+++++++++****++++++++**))**))))))))((((''''''''''(())(())))*+++,,----,,,,,,++*)))))**((('&&&%%%%%&$$$##"""""!        !!#%+7Vpyolqvvoga\UMDEO]gnqskbWJ>424`~hgmoJFC>:@CGEDDEDGHHIIFKOQTXdnnqokcURU_P79Wxqjg_OB@93212312Hrjcba_^YQLIMNMG;.*.1/./237Joni_\[]bmsw{|uk\A?BDMS`rn__Mu„seSAGIJMZ]ZXVTSUR@0.4C_jmnkggfgiieckortzg[W`z{lc]YXYRPMJ;*&%&(''&%%%$#"""!#-9<>AA@@B@@?>;5("####$##$%%%(*.1379862,++.<R`Z[_alfaPIFSJfrne\W_^^YOPPPPNKHDA>=>@CFILNQQQQSTSQQTX\ckqx~€ƒ‡ŠŠŠ‰ˆ‡†……„„„ƒƒƒ„†‡Š‹‹Œ‹ŠŠ‰„€ztqppppnkic`]]`flsv|ƒ‡ŠŒ‹Šˆ†…………ƒ‡ŒŽ’’Ž‹‡‡‡ˆ‰‡€}yxyxxwwvwwwxxxzz{„ˆŽŽŽ‘ŒŠ‰ˆ‡‰Œ“––“ŽŒ‹‹(())))))(((())))))))))))))))****+++++++++++,,,,--...------..,,,,++++++**++++**,,,,+***++*)**))))((((((''''''''(())**))****++,,,,--,,,,,,**+***)))*)))&%%&%$$##%%$"!"##""!!!        !! !#'5Qnxrnpuuslc]VLA=DP]forpi^WJ<411f|khokEE?99=BEFFEEDFIECFCCLi‚•š†xvwiU_qyY7?snke[M?621110./13Xkc`^]\XRMJIJMNNG9+*-/-/343RrmaWXY\amzvpjbM<@?B]`gbYZXRmm`NHJMLORRTTUSQM=303@Sgqtxzvokilljmry}rZIZPWffc^[XYTMJHD5'$&&')('%%%$#"# #)7=>=@@@@AA@@?<3& ##"#%$$#$$%'(),-.*+*+*)+-7P\RZcdba[\i[K[soi_c[@V_SOOOMLHGC@==>ABDGLOQQQRTRQPQSX\cksy}€ƒ‡ŠŠ‰ˆ‡…„„„ƒ‚‚‚‚ƒƒ…‡Š‹‹‹ŠŠŠ‰…~ysppppomjhca]^bgnsy}ƒˆŠ‹‰ˆ†††„„†Œ“‘‹‰‡……ŠŠ{{xxxxyyxvwwwxxwwz|†‰ŽŽ’‘ŒŠ‰ˆˆ‹Ž“—•’ŽŒ‹Š(())))))(((())))))))))))))))****++++++++++,,,,,.......------,,,,++++++++,,,,++,,++*+++++*)**))))((((((''''''''(())**))****++,,,,,,,,,,,,**))*)))(((((&&&&%$$##%%$$""##""!!!        !!#$(7LkwmmsuvuqiaZOA:=DO^hmnlf^UH<43>tvhgncAC@:9?ECDEDCAEHKFBBHh£ªª¡•‹|wx{hWg‚{T/`ole[K=62231/./12<dc_[YXVSPLKKKKOMJB61-+-31+/Zf^XU]]_fowjaYC=<Facb`]ZPTdd{dUGHMPQRTUUUQOH?411;N^mwtrwxurqqqprstu]GVODQZ^_[XUURLHE?2&$'''''&%%%$##"#(3<=>?@@@@AA@@?<2% ##"#&&##$$&.))&%&***+*++,.3FJ[__X`dZ_YLVqrbZE)4NNLOOOMLHEB?==>ABFILOQQRSRQPPQSX_dlsy}„‡ŠŠ‰ˆ‡…„…„ƒ‚‚‚‚ƒƒ†ˆŠ‹‹‹ŠŠ‹ˆƒ~ztppppomigb`]^bhnty~ƒ‡‰ŒŠ‰‡…………†Š“‘’‹‹ŒŠ‡‹„ywyzyxxyxwwwwvwwwxz|ƒ‡ŽŽŽ‘“ŽŒ‰ˆ‡‹‘”–’‘ŽŒ‹Š))**))))(())))))))))*)))))******++++,,+++,---.-.//......-.-,-,--,,,,,,,,--,,++,,,,+++++++*++****))((((''(((())*******(******,,,,+,,,,,,,*)()))**('&&&%%%%%%%%%&'**%$#""!""!     "#  !!%(0Ijwmhntxtsnf\SC76?HQ^hoplg\QF:46P~rabl_ABA:6?EBBBCC@CHQJ?H^Šž¥­¥”Ž’”ŠqZb}‰w;FrkeZO@622233/.155>^`WVUTSRNLMMKLLKKH</),/-&'4_b_[X[^deqn^R=;@^_UZZ\WPGPQk`PCJJMNRX\`]ZNE;313EYfpvuqprqmjloonnlpKOUGFQ[]\ZVUTNJFB:-##$%&''%%%%$##$'29;<>??@AAAA@@?:/#! !"""#&#!"%)+))++**++++,*,//1DVmigf_fjXRVngh`N+1FOPNNNLKGDA>==>ABDGMOPPRRQPPPORY`gou{~‚…ˆ‰‰‰ˆ‡…„„‚‚‚ƒ„†‰Š‹‹‹‹Š‰…‚~ysoooonlhda`_adjpv|€„ˆ‰‹‰‡‡…„…†‹‘”’ŽŽŽ‹ŒŒ…|{yzxyxxwwxxxxxxxwx{~„‹ŽŽ’‘Œ‹ŠŠ‰Œ”—–“‘ŽŒŒŠŠ(())(((((())))))))))*)))))**++**++++,,,,+,---..///......-.,,-,--,,----,,++,,+,,,,,,,,,,++*++****))((((''(((())*******(******,,,,+,,,,,,,*()+))))(&&&&%%%%%%%%%&*00&#"!"!""!     !!!!#%&1FdyogkrxvvrjaWJ807AJT`iprme[OD81<aƒpefnZ@D@96<CDAACCBDEHEKdƒ™ ¤¬§•˜œ}vtj…‘†e3pje\RC2.,,***+,/0/;V\WSPPONMLMKMKJIHE@5.1.)$):Z^abca]^hhaH:BUZW[`aYRLIDGNXMFLQOORU[a_VL@9307J_kotvsnmlgeijgg_\ZGZNIHR]^\ZVURJFC@5*$$$$''&'&&&%##&08;;<?@?@AAAA@@?:/##%!!""""##%'(***++**++++++./38@TbhmoideUMWije^\XUONMNNNLJFDA>==>ABGJMNPPRRPPOONSZ`hpu{~‚…ˆ‰‰‰ˆ‡…„„‚‚‚‚…‡ŠŠ‹‹‹‹Š‰…}uqoooonlhda``bflrx~‚†‹ŒŠŠˆ‡…„†ŠŽ’’“’ŽŽŽ~y{yyxxxxwwwwwwwwwwy|‚‡‘‘ŽŽ•Œ‹ŠŠ‹•—•’ŽŒŒŠŠ(((())(()))))*****))+*++**++++,,,,++,,,,,,..--//..........--....,,..------,,,,,,,,,,,,,,,,++**++(((((((())))))))**++**+++++++++,,,,,,,,+**))))(('&%%%%%%$$$$$$&&)(%#""!!""!!!!!!  !"$)-@auskkrvxxtoe\M>01:DPZbjqricXLC71Eu‚lgjqVAF>99?CDCBBCACEDIa—£¦¨ª¬ª¡œ™–‡vyz’ŽŽ|Edlf`WOGGFEEFEFJLWZTHLRSRONMLKKKKKHGDDD>73.*'#%>YYW[\]]^]bUIRYRTWVUSMJG@4;EADIMLLQTW\\VI<701=P`lptvtnkhgfiige_[NURGHMZaa^[USMGD@=1($##%%%&&&&&$""+59:<>>??@BBAA@@?:/##$#""!###""%((**++++***+,.148=BDGTfggmiNL^jjd`ZTLLNMNNNMKGC@>=>?ADFIMMPPPPPPNOOUZbiqx}ƒ…ˆˆŠˆ‡…ƒƒ‚€ƒ†ˆŠŠŠŠ‰ˆˆˆ„ztpoooomkgecbbchnuz~‚ˆŒŒŠˆ‡‡††Š’’‘Ž‘ŽŽyyxywxxxxwxxwwwwwwxz}„‰’’ŽŽŽ““ŒŒ‹‰ˆ‹‘–—•‘‹‹‹Š(((())(())))*+******+*+++*++,,,,,,++,,----..-.//..........--....,-,,,,----,,,,--.-,,,,,,,,+++*++*((((((())))))****++**+++++++++,,,,,,,,+**))))((&&%%%%%%%#$$$$##%$"#""!!""!!!!""!!#%(1?[vskkqvvvvof\QB4/5>HU^fnqng_UI=67V{‚lfiqT?E>99BEEDCCCBCEHYp‹—š¤¬«ª®£¡žœ”r†‡€ˆ’†iQd_]]\YYVTUTSTTRWWY[SNMNKLKLKJIIJHEEBA>:73-(&'&CWPPW\YWZ`bUUWYUTRPKGBB?43>HCEIJLOQUXWQF=722>N]hpxxqkiifffghgXD8FMJHR^`a\XUPHDA=9,%#"#$$%&&&&%##&08;<>@???@BBAA@@=;/#  ""!!###""%'**********+/069?<=<?DKQ_qmIGXY_de[SVQNNNNNMLHE?==>?BFHKMMPPPPOONOQV\biqz~ƒ…ˆ‰‰ˆ‡…ƒƒ‚€ƒ†‰‹‹‹Š‰ˆˆ„€|uqnooooljgebcefjqw{€„ŠŒŠ‰ˆ……‰’“”‘‘ŽŽŽŽ†wy|yyzxxwwxxxwwvvwwxz~…‹’“’‘’•‘Œ‹Š‡ŠŒ’•••‘ŒŒ‹Š''(((((())))))++++,,+++++*++,,,,,,,,----..--//////..................----..----,,------++,,++**,,+***))))**))))**********++++++++,,,,+***))((''''&%%%%%$$$$$$$$$$&$####"!""!!!!""#"%)1=XsqjlprrsrmdYNC5/07BMVbiopke[OC75Be~lhflO@C@87BGECCEFC@@Nk––ž§ªª¬¢££¤¢Œ}ƒ‰‹”šŠzRYXWUTOOPPOOOOPPRV[[UPIIFEEFEEFHHHHEA?>:853,'&(.PZUSUTSUY]bWRRNPNKFA=?A7.3=AADFKMNRWYQF:834>KWelrslhhgfffghicN6@FEIX^^\XUSKEB?;5)######$%%$$###)29=>?@@??@A@@@??>:.#!!""!!"""""$&+++)******,04666689<CFEHUTFG\R]ef[W\SMNMNNMKGD?==?@DGHKMMNNNOPOOPQV_ckrw}ƒ…ˆŠˆˆ…„‚‚€€€~€„‡ŠŒ‹Š‰ˆ‡„€ytpoppnnkigeecghlsx}ƒ‡‹ŒŠ…†‡Ž’“’ŽŽŽŽŒzszzxyyyyxxwwwwwxzyww{‡Ž““’••Œ‹‰ˆŠ“—•”Œ‰''(((((())))))++++,,,,,,,,------,,------....////....................----..----..------,,,,,,++,,+***))))**))))**********++++++++,,++****))((''''%%%%%%$$$$$$$$$$%$####"!""!!!!!!"#'-7Povjknprrqg`VL?2,.2<GR[fmooi`XK?21Iq}lgjlL@CC:8@DEDEGGC?C^}Œ•˜’•š£®°®°®©«’tvŽ£¡£–ƒ`QUSRQQQQQRRQQPPQSTSVQMKGECB@A@?CCBB@>>:9630*%'*2R_XPRURPTa[DICEFEB><>>5/,-:@AEJLMNNPOC9743:HU^glmlihfffe_XVLOULCFOZ^\ZVSOHC><93'$#####$%%$$###)3:=>?@@@?@@@@@??>:.#!!""!!""""!"$(**)******,/3444569@GIIIMC@AUhonfbcgSLMMNMLJFC@??@ADGHKMMNNOPRTTTWY_fktz}ƒ‡‰Šˆˆ…„‚‚€€€~€…ˆŒŠ‰ˆ†ƒytpooonnljgedehiov{ƒ‡‹‹‰‰‡†‹”‘’‘‘ŽŽŽŽŽsx{{yyyxxxxwwwwwwwxxy|‚ˆŽ’“’‘Ž”‘ŒŠŠˆ‰Œ’•—•”Œ‹Š''((((()))**++++++,,,,,,+-----------......////00//..............................------,,,,,,,,,,+***))********++****++**++++++++,+******))''&&&&&&$$$$$$$%$$$#$$$%#"""#""""!!!##%(*7Kjypilmppme\QD91++.8@KVajpple\QG;35Y{ylgknQ@EC<7?DEEFHGB?No…•˜‰¡¯¹º»¸ª§’|“˜¢žŸsMUXXVWVSRSSRPRRUUUUWPNJHFFEECBBAAAA@>><;:63.)(+*5T][XSQOR[aJ;??CB?;8873/--9DIKLNPOOQO?652.5DQWY]dihkkfgi\OW8LYKGNY]\ZVSQKD@<:91&####$"#$$####")4=????@A@AA@@@@@?<-#! """"""""!"#'')*+*+))++-102479669=@ED?CFAKfg`_\ZUNMNNMLJFCA??ABEHIJLLNNPRVWZZ]aaemt{~€„‡‰Š‰†„ƒƒ‚€~‚‡‹Ž‹Š‰ˆ†|wronmmnmjhgdefjlpw}€ƒˆ‹ŽŒŠ‡‡Š“‘ŽŽ‹ˆzux|}zyxxxxwwwwwvuuxxy~ƒŠ”“‘Ž“–Œ‹‹ˆˆŠŽ’•–”“Ž‹Š''((((()))**++++++,,,,,,,...--------.....///////................................--...-,,,,,,,,,,+*************++********++++++++,+******)(''&&&&&&%%$$$$$%$$$#$$$$#"""#"!!"!""##'.7EfyrkknmlkcXK?4,))-3:GP[fmqpkbXMA516^{y~mein`?CC>8>EEEFIHDHaw‰Œ”’ƒ‹¤±¹»¼º²¯©ª¬®  ¥—\XXXVTTTPQQQPPQSUXYYTPMFFEEDDEDCC@@A@>>=;;950-+,.7UUWWRQPTZUB;;>>=;8751//2>HLMMNPPOQUG(/0.2<EOSV^bbegihkid_QQTOOWZ[XWTOJD@?;95-%""$#"##$$####")6>A@AAAAABA@@@@@@>/#! """"""""!"##$$()()**++,/135653668=?>CCC=I_ff\ZTUOLNNMLJFCA?@BCEHJLLLOORUYZ_aegglpw{~€„‡‰‡‡†„ƒƒ‚€~„ˆŽŒŠ‰†ƒytpnnmmnmjhfefgjmty~‚†‰ŽŽŒŠ‡ˆŽ“‘‘ŽŒ‹‹‹Š€utz|{{zxxxxwwwwwvvvxxy~…Œ’”“‘“‘‹ŒŠˆˆ‹”•–”’‹Š(())**)))******++++---------......--/......0////.../............///////.////////-./.....-,,,,,++,,,,++++++++*********+,,,,++***+++++**))('''&&%%$$%%%%%%%%$$$$$$$$########"""#$'+1=Zxrjjqpph]TH8-(%&)-5?IT^fnome]RF;20>gwvkbelvK?D@::EDDFGFL`tˆ†Ž‘„‘£±µ¶º»¶¹»º»º®¦¢žŠjZVRRQSSTPPNMMRTRTUUSQNKHFEDCDCCCBBBA@@>===9841...AWVQPQPOMUV;5;<=:8432019GMNMNNNNNQSSG=)(/5;CJMV[_bdfgfcabUVTKPY[[YUQMEA<;:60'$$$$$$##"#""""#'2>ACCB@??@BAAAA@?=3%!  "!!!!!!!!!!"""&))**++*+/1324468;;:9==BGMR[fba\VPTQNNMJFB@@BBCFIKMLMMQUZ\`ekoppptw}€ƒ‡‰‰ˆ†„„‚€€„‡ŠŒŒ‹‡„{wronmmmlkjgffgilqw{€‚…ŠŽŽŠ‰ˆŒ’““’ŽŽŽŽŒ‰‡‹ˆywx{}}zyxxwwwwwwwwwwwxz€‡’“’‘““‹ˆ‹Šˆ‰Œ‘“•–“ŽŒ‹‹‰(())**))****++++,----.------......../...//./////../-............///////.........-./.....-,,,,,++,,,,++++++++*********+,,,,++**++++++**))('''&&%%$$%%%%%%%%$$$$$$$$########""""%(-8Mrxpmqtri_SF5)'%%&)09CNWbkpmh`YO@2/0Cmxxmccnzr=A?:8ACBEAG_vƒ€Ž‡Ž”“™ ¤¯®°¹¼¼¹³°µ´µ©©¡wUTYesyyyyum^NLLNNORRPNKHFEDECCCCBBA@@@?>==:9863..,@SPONNKKMQR:69:8652202=KPONNNNNNPUUTT929:;=AFRWZ[_b`a_\_YSNKOXZYXSPJ?<9750*%$$$$$$######""#&/;@ACB@?@AAABBA@?<5)!!!!!!!!!!!!!!"""$&(**(()*,/0124547755699;BJSblbZRPOSPMMJFCACCCDHJLMLNORU[afkrvwxxxy}€€„‡‰‰‡†„‚€€€‚„‡ŠŽŒŠ‡„{ysommmmmlkifgggimrx|…ˆ‹Šˆ‰’’ŽŽŽ‹‡‡Œyy{|||zyxxwwwwwwwwwwwx{‚‡“”’‘‘“‘Œ‹‹Šˆˆ‹“•••’ŽŒ‹Šˆ))))******+++++,,----.-............././0//00//////..........................................-,,,,,,,+++++++*****++++,,,,,,++*++++++*****)'&&&&%%$$%%%%%%%%$$$$$$###########"#$'+4GivnjqvvncVF5'$$$%&)1:EPZdlpkf]RG:.-4Usxxlcahw~U:@76?ACDAQu†Œ†’•“––“—š›¥¦¬¹¾¼³³²³±¬¤¨¦”€^bt~~}|{xxutk`YXWURROLJGDEFFDDDBCA@??@>=<;:98754.-/?OLMLJIGIPL66965310/5CMRRNOMMLLMPSW\VF;9<;=@IPVWZZZY[ZYUPLLSXZVRNLC9840,(%$$$$$$$$$$###""#$+8@ABCBAAA@@AA>??<7*!""!!!!!""""""##""$&+*)**)****/2244010/57<@EJ[fjaYTOPPNLKGCABAEFIKLMMMNQU]aipx|}}{zz~‚††ˆˆ‡‡„ƒ€€€ƒ†ˆ‹ŽŒ‹‰†‚~ytommmlmmkjihghhjnty~†ŠŒŠ‰’‘Ž‹‹ˆ†‰ˆyyy|}{{zyxxvvwwwwwwvvvy}ƒ‡““‘‘“ŒŠŠˆˆ”•“•‘ŒŒ‰ˆ))))****+++++,,,-..................../00//00//////......................//..................-,,,,,,,+++++++*****++++,,,,,,+++++++++*****)'&&&&%%$$%%%%%%%%$$$$$$#########$#"#%(0=^ysinvvqgZL6($#$$%&+3;FQ[ennjaZMA3--8\xws~pacht€u@=:5<@ACLf†”––˜™’„Œ‘‘š ¤²¶·´±¯¬­Ÿ™––”nt{zvwvwtssstqomjhdb]YTRNLEDDBABA@AA@?==<;:9875430--@MGGFFFFKQF686530//8IQSSQOMMKKLLPRYWXL;69<=CJMRTVTTTUVQMMSXYVSOLIB81/+%#$$$$$$%%$$%#"$""##&2=?@AACCA?=@BB@?>8,""""!!!!""""""##""$$+)*+,*(((+0//0-**1403879>OWaWQZYQPMKIFC@@CEEHLMKMMLOT[cjsz‚€~~~„†ˆ‰††ƒƒ€€€ƒ†‡‰ŠŽ‹‹ˆ…‚{wrnmmmlllkjhhghhjouz}†ŠŒ‹‰Š’‘ŽŽ‹ˆ††Œ†zxz{}{zzxwwvvvvwwwwvvvy}ƒˆ“‘““ŒŒ‰‡‡Œ’””•“‘ŽŒ‹‰ˆ))))***++++,,,,,-.......////....--//000000//////................//--00////////....///.......-,----,,++*,++++,,,,,,,,,,,,,,+,,,,,++++***)*)&&&&%%$$$$$$%%$$$$$$##########$$##%),6Nswljruqk_O:*$!""#$'+3=HR^dkje]RH=1,5Hk}}€sbcht€e5968?CB[|“‘™ž˜”œ”‡Š‘˜¤£©«¯³´©£‘Œ†tgtuutrqroonnnllifb`__^\\\XUTQMJHEA==>===<:98765210..<KHEFCBBGRA6872111=LTWWSQPOKKKKMQRSNTSE<=?@CHORUTONNLPPPPRRPNKID>6/.+&%$$$$$$$$$$$$$$####$+8>@@@@BA>>?>?=<;5+"!!""!""""""!!####$$'((*))(+./,+)*))*-17<=CGNW[aotbUONMKGDB@AEHHIKMMMMLORZbkv|€ƒ‚€~|…‡ˆ††„ƒƒ€€€€„‡ˆŠŒŒ‹ˆ†ƒysomkkklkkkigfghimqv{†Š‹ˆ’Ž‹Œ‰…„Š€|yy{|{{yxxwvvuuvvvvwwxz~„ŠŽ’‘“’ŽŽŽŽ‰‰ŠŽ“•“”’‘Œ‹Šˆ‡))))**+*,,,,,,---...../0////////..//000000//////....////........//--//////////....///.......-,--,,,,,,,,++++,,,,,,,,,,,,,,,,,,,,++++***)('&&&&%%$$$$$$%%$$$$$$##$$$$$$$$$$#$(+2Ek|okpttncUB-#""""#$'-5=HR]fjjbXMB705Gi|~}v}wbdfp€‚~H776=AHjŠ—š–˜£¤›ž›‹ŒŽ˜¢¦­¬®±­¦œ“‹ˆ‹‹„ˆ€kooqqpmmkjkjiihdbe`__ZYXXXWTQSRSRRPG?==;::98776422...=DBACBBDIT>664024BOSVWSSPOLJJLLMQSMNTSLB?@BDIMNMMJDDEGHFDDCEFC@91,+)'&%%$$%%$$$$%%%%%%%%#%,6<???@???@><:83*#""!!"!""""""""####$$&'''&*,09<3(('&')1=CEMPQUVY_p€y^XNKLIA@BBCFGIKMNNNMNOU^gr{€ƒ‚€~…‡‡†…‚‚ƒ€€‚‚†‰Š‹Œ‹ˆ‡ƒ€{wrnlkkklkkkigfghimqv{†Œ‹‹ŠŠ‘‘ŒŒ‹‡ƒ†Œ†|zyz|||{yxwvvvuuvvvvwwxz~„ŠŽŽ‘•ŽŒˆ‰Œ‘“•“”’‘Œ‹Š‰‡†))))++,,,,,-----....../0////////0000000000//00//..////..........00////////....//......////...---,,,,,,-+++++,,,,,,,,--,,,-,,,,,,++++**))('''&&%%%%%%$$$$$$$$$$!#$$$$$$$$#$$$(.<`tlqvyqhZN5$!!##!#%'.5<GQ[dieaVJA96?]‚ˆ~zv{{hbbl~„ƒt195<@Ov‘›žŸ¢¡¤ œ™Œ“ž¤¥¤¡ Ÿž˜‘Š{txu{Šikklmjkigghffda[V[\ZXZXTQPPOMMMMNQSRGA<;9:89886551/0/2FGEEBDEIRP633216GQTTUURROMKKKKKMMPONOLD62:?AEFGHFBCCCB?CFIJHFA<0+(')'''&&%%$%$%''&&&$$%%%&*07;>?=?@?<84-&#!"#!"" """""""""""#&&%&'''(')4:/(&%''+1;BEJNQSSWXYj~]^oPHGC@@@BEFIKLLNNMNMQWcmv}€~}}~‚‡‰‰‡…„‚‚ƒ„ˆŠ‹Œ‹ˆ‡†‚}wtqlkkkkkkkjhfffgimqv{‚‡‹‹‹‹Ž‘ŽŽŽŒŒ‰„‚ŠŒ|yy||}{zxwwuuuuuuvuvuuxz…‰’”ŽŽŽŒ‰ŠŽ‘”””•’ŽŒŠ‰ˆ‡)))))*,,,-----......../1////////00000000000/000/..////..........//////////..-///......////...---,,,,,,-+++++,,,,,,,,--,,--,,,,,,++++**))('''&&%%%%%%$$$$$$$$$$$$$$$$$$$$%%$&)3Oyqpw}zpdTC-#!""##$&(+3<GR\bfd`UKDCL`{Œ†zwvz|ia`j|„ƒˆZ+26>Uz›¥¦¥§¢™ Ÿ”ŽŽ—Ÿ¢Ÿœ”Šuiba\n‡v_gghhfecbdeb___]ZXZXVQOMIIIKKKLKKMNMGC?<:99875554110.9HEBEDFFJOF22437HRUTTSSSQOMKJKLKKMMKKJ?0%',29;CGFD@@A@BFJIHFC@6/*'''&''''&&&%$%'('''&$%%%%%&*-38:=>;61*$""%$"#$%!""""""""##"#$$%%&&'(&'(&'('&&%'*26>DGMNPSZcnaN^\ICA??@BFHIKLLNNMNJOS]iqy~}|}„†‡ˆ†…„‚‚‚…‰ŠŒŒ‹‰Š‡„€|wsnmlkkkkkkjhffffhlqv{‚‡‹‹ŒŒ’‘ŽŒŠ‡ƒ„Œˆ{vxyzz{ywvwuuuuuuuuvuuy{†ŒŽŽŽŽ””ŽŽ‹‰‹Ž‘””•”’Ž‹‰ˆ‡†****,-,,,-......./////00//11////0000000000000011//////.0////..//..//////........////////.....-......,,,,,,,,,,,,----,,-,--..--,,,,++**))((&&&&%%%%%%%%$$%$$$$$%$$$$$$$%%%%%'+;fwqr{yk^M:(#"!"#"#&(*1:EOZ`cc`VOQ\m}ˆŒ‡xxv|}k`^dz„ˆŽC+2<Tz—Ÿ§©ª©¥žŸ¡šŽ‹‰‰’˜š›‹…~wlghiaq}„]bfhfdb_dbb`^][YVVVTQOKIGGEFHHIJJJKMOOHC<97765665333/0CKGFGGCFIM?112:GRTUSSRSQPNMLLLKKJIGFD:,#$$%)-6<=><>AABFIECA:4,(('*++*()(''&&&&&&'&''&$&%$###"%+.231-'"""#$%""###"""""#"$%%&&)+'&&$&&%%''&&''(()),.18=EJPW`jvu\Y\j^G@AA?AFHIKKKLNMKJLPWemv|~~~}z~…ˆˆ‡†„ƒ€ƒˆŠ‹‹Š‹†…{wsnkkkkjjkjhggggghlqv|„‰ŠŠ‘‘ŽŽŽŽŒ‰…„‡Œ„~zyxy{{zxvvutusuuvvvuwvx}€…‹ŽŽŒ”’ŽŽŠ‰‘“”•”“’Œ‹‹‹Šˆ‡†****,-,,,,....////////00////////000000000001001100//////////..//..//////........////////.....-......,,,,,,,,,,,,----,,,-....--,,,,++**)(''&&&&%%%%%%%%$$$$$$$$!$$$$$$$%%%%&),?q„try€‚ufYF1$#"""#"#%'*19DOZ`cdaZ]gq~†‰Š„y~€j`\^v‡ŒŒz6/5Ow‹— §©©¨§¢œœ—‹‡|‚Œ’‘Šyuvsfagkr}u~lV_cb`\\_]\[\XVSSSQPMKHFDAABAACDDDEGIIJGB<8665666533227KOGGGGJGHL=028FPTTUSRPOPNMLKKKKJIFEB8*###%&'&)+/:<<@DDEFB5-*+---*++*)*)((''&&&&&&&%%&&%$$$#"##"$$""!""!##"""###"""""#$$),15975.)'((%%''&&''(((*+*,/7DMTX[\[^hiWPJC?>?ACFHIKKKKLMKJJOVbitz~~~}zƒ‡‡‡…„ƒ‚‡ˆ‹ŒŽ‹Š‰„„zvpliklljjjigfffgijnrw{†ŠŠŠ‹ŽŽŽŒŽ‹‡„…‹ˆ}yxxy{{{yvvutstuuvvvuuwy~ƒˆ‹Ž’”ŽŽŽŒ‰‰‘“”•”’ŽŒ‹‹‹Šˆ‡†**+++,--+,..//0000001111111100110011001111111111111100//////.../..////////....//..00////.....----..-,,,,,,,,------..,,,.....----,,+***)(((&&&&&&%%%%%%$$%$$$####$$$$$$$$%%%+.@outy€€p_Q=+$###"#"#%(,08CNX^ac__ku}…‰‹‹ƒ|ƒ…|m_[\t…{nv~b21Dp…”¥¨¨¨¨£œ™“„wu„ugelqj`eZpp]qyUSWYYYZZVWVTSSNOPLLKIFDA?=<;<?@A@CEFFECCA<756446555662;KICDCHHHIN=16FPTUTTUSPONNMMLKKIIGE?5%##$$%&''(*-2;BFDA;2--,---,-,*+*((((((&&%'%%%%%%%$####""""""""##""#"#""###""####%*18AGIHD<3*$#%%&&&&'')*++)+,0;ELJOPV]c^UNJEB@?@ACFHHJKKMMKJIJOT]hry~€}‚ƒ†‡†……ƒ€€€ƒ‡‰ŒŽŽ‹ŠŠ…‚}wsnjijjjjjjhgffggilptx|…‰ŠŠŽŽŽŽŽŠ…ƒˆŒ„{xwyz{zyxvvuttstuvvuuvwz~„‰ŒŽ”’ŽŠŠ‹’““””“ŽŒ‹‹Š‰ˆˆ‡**+++,--./..//0000001111111100110011001111111100111100//////.../..////////....0000//..//.....----..-,,,,,,,,------..........----,,+***)((('''&&&%%%%%%$$%$$$####$$$$$$$$%%',/>jusz€zeWI3'$#####"#$'*-6ALV]`ba_n|…ˆˆŒƒxx{}}o]Z[gf_i{ƒ|H)>d}Ž–Ÿ¤¦¨¦¢—“€u|vprpoleahhdgpeN^Ic…YMQSTUSUUSRRPNHIKJJGEB@=;98999;=<?BCCEEBB@<764456666643>IEDCDEDFHTC6BOTUTSQQOONNMLKKKIIGE?2$%#$$%&''(*)4@BB?7.+-./,..--,,++(''''''&&((('%%%%$####""""""""##"""#!#""##$$##"%*4?JSWWVRLA3'$#%&&&&)),/-,.36;<?HKP]llg_YQNGC??@ACFHHJKKKKJIHILR]gpx~€‚…†‡†……‚‚€‚…‰‹ŽŽŽŽ‹Šˆ„€zvpkjjhjjjjjhgffghjlptx|€…ˆ‘ŒŒŒŽ‡„„ˆ‰}zwwyz{zyxvvuttstuvvtvwx}…‹ŒŒŽ–‘ŽŽŽŠ‹Ž’“”•’ŽŒ‹Š‰ˆ‡††**+++,....-.//11000000001111001100111111111000//00000000////////....//////............//..--....,---,,,,,,,,------..--......----,,++**)(((((('&&&&&&%$%%$$%$######$$%%$$%%'-3>eusv|paP=+$#%$######&)-6@KV\adebn€…‰ŠŒ‡uwx{~o\YZfcgpzx|=-Vs‡“š ¥§¥£Ÿš–†z{wqjihjegjhqw{rTHQW~bIOONKPMSRNLJHDEHEDDCA?<6544366779>BBBAAA@@<963465654468=FEDDEECELWG@MSUSSQPOOOMMMLKKJJHF>1$$#$%%((''(*+4960+-..--..-.-.-**($#&'*'&'())*'&&$$$##""!######"""##%$"!"!!""""#(2@LVaihgaZPB3*$$%%&&(*05:=A=8L\lvuvvsngaZQMHD@?ABDGIIJJJKKIIIIJP[grzƒ‚€„†‡‡…„„ƒ€‚…ˆŠ‹ŒŒ‹‹‡ƒ~xrnjjiijjjjihhgfhjjmrvz~ƒ‡Š““ŽŒŽŠ„ƒ…Š…}yvvyz{zxwuutsrrtuvvvvvw~ˆ‹Œ’˜‘ŽŒŠŒ‘’”””’ŽŒŠˆ‡†„„‚**+++,....-.00112222220011110011111111111110000000000000////////....//////............--..--..--,---,,,,,,,,------..--......----,,++**)(((('%%&&&&&&%$%%$$%$######$$%%$$%&)/6Aa~usuxkZJ5&"$%$$$####&)-5?IS\adgnz„†ˆ†}kpwvxzr`]^dguz{y}Žx/>hzŠ“™ž£¢¡ ›‡€zvpggfhgegox|xwob\Wg]CKJFFIJTUMGFD@?BA?@?@>:63310034459>@@???>>>>843556665467@HFDDFEEHOXKHPUURQPOOOMMLLLLKKIG?3$$#$%%''&'(*('*'(,/.///.0.-/./-'%##&'*(''(((&''&%$%$#"""######""##)52%!!!!""""$,8DS_ktxtoh\N?0*%%%').0/4<HY[Pu€wsvvutqmf]TLFB?AACEGIIJJJKKIIHHJP[grz€„„‚ƒƒ†ˆ‡…„ƒ‚‚ƒ†‰ŠŒŒŒŠ‰‰„€{vpkiiiiiijiihhggjkkosxz€…ˆ’”‘ŽŽŽŽŒ†ƒ„‡‰ƒ€}yvvxzzyxwutssrrtuvvvvwz~„ŠŒŽ•”ŽŽŽŒŠŒ‘‘“”“‘ŒŒŠ‰‡†„„„‚,*+--,--..-.11002233222222221111001111112200122211110/00////////////////////.........---..-,--,,....,,,,--------------......------**)))(((''((''&&&&%%%%%%%$$$$$##$$$$$%&'+1:B\|uqqqlV?-&$#%$%$###$&).2;EQZbhmv€‚„ƒ„z_Omjippsda`fs~xvy…‰ˆa3[r‚Š˜žŸœ˜‹††‚pgaaehgb^fowpovxxovo8DGBAA?AEEDAC>;=<;<=:853211/./11159<=>>>>===;8556776888:<DHFGEFFFHMTNHQUSQPOONMMMMLKKJKFA5&%$%%%&'&'))(&%$(+-//...00//01/'""#%',*(((''''''%%%%$$##"""""""###&-*$"!!!!!""%/=KZiv~„zrg\M>1)'),04<JTMDOO_~|vvuutqmf^VMFB?DABDGIIIJKIIHHGGHOYgr|ƒ††…††‡‡‡…ƒ‚„„ˆ‰ŠŒŒŠˆ†…„~xtnjhhiihhjjihggfikmpty|‡Œ‘””‘ŽŽŠƒ…‰‡‚~{xwvxzyxwvtssssstuuuuvy|‚†‰ŒŒ•’Š‰Œ‘““’‘ŒŒ‹‰‡†‡…ƒƒ,*+-..--../011112233222222221111001111112211333311110/00////////////////////.........---..-,--,,----,,,,--------------......----,,**)))(((''''''&&&&%%%%%%%$$$$$##$$$$$%%(.4;FWwuqqonS7'%%#%%%$###$&)-39CPZcmt{€|ub<Gkppsqwhdcfs|wv„‰‚PCet†Ž–™š˜•†„ˆ†p\`aghc`]cly}ukl{||L9BC<;;<@><<=;998778641//./-,-///269:;>>>====;877777997:<=DGFDDFEEHLPNHNPPONMLMMMMLJKJIGC9&$$%%%&''())(&%$%+../..22/0355/'  !#',*(((((''''&&&&%%$$""""""#$##!""#"#!!!!""&0?LYj{‡Šˆzqf\MA8436ASalk[]bgy}‚€wttuusnibWNEBBABDFGIIIJKIIHHGGKR]is~…‡‡‡‡‡‡‡‡…ƒ‚€…‡‰‰ŒŒŠ‰ˆ†ƒ|vqljhhiihhjjihgggiknquz}„ˆŽ”•‘ŽŒŽ†‚‚†Š…€}yxvwyzyxwvsssssstuuuvwy|‚†ŠŽ’•’Ž‹ŠŽ’‘“ŽŒŒŠˆ‡†„ƒ„‚---.....//01112222222221121122111211222233333333330000//////////................//--.-,,,,,,,,,,------------------....--./....--,,+))))))(''&&''''&&%%%%%%%%%%%%"$$$%%%%'+05<IXmxkhkmY2$%%$%%%%%%%&&(+28AM\hu|~|{wp\;(?fyrqtzjdcbmt{……}{z|uIRmy‚‹“—”‰ƒ„m_\`a^adcgt}pktxtwj-9><867:::867553266510/-,,,(*-,,/1467:<<<;;<=977899<DKA>:?EGGEDEEFGIOEAKNKLMLKKKKKKJHGGE=+#%%&&'')*,)(&%$%,.///111688:80&   "'-.,*&)()'''''&%%%&$$$$$############""!!""%.=L]m‰Š‰‚}umh^TPIFHTbfekeelsvyx|zvuwtrqkcYPHCAADEGHHIIJJJJGGFGLS^it…Š‰ˆ‰ˆˆˆ†„ƒ‚‚„‡ˆŒ‹‹ˆ‰†…‚~xrnjihhhhhhhhhggghjkprv{~ˆ”•‘‘ŽŽŽŽŠƒƒ…ˆˆƒ€}zwwyzyzvvutsttttttttsvx|ƒ‡ŒŽŒŽ””Ž‹ˆ‹Ž‘‘ŽŒŠŠ‡‡†…ƒ€,-./..../001122222223321121122111211222233333322000000//////////................//,,,-,,,,,,,,,,------------------....--./....----+))))))('''&'''''&&%%%%%%%%%%%%$$$%&%%)-33=JYgrngfid@$%%$%%%%%&&%%(*.6ANat|yumaJ4.6Yxsry{laagir†ywwzzdK]pxy€ƒŠŽ’Š‚vlhddgaY\binv…|rllnqsv>1475455564322210231/..,,,,('))+,/02389:<<<<<;:89<=?YbHB@>BIIFFGFFHGHJBCHJKLKJJJJKKJHGGD@5&%%&&(***+*'%%$%,.//.048=>;=;3' "*012/-,++)''))&%%%%&$$$$$$##########""!!""'.<K^n}ˆ‹‹‡‚yupkf`WWX]fg_[SO]dRJkqmrvuuqmd\RJCBCDEGIIIIHHHHGGFGLS]jvˆ‹‹Š‹Šˆ‡†„‚‚‚…‡Š‹‹Œˆˆ‡‡„€ztqmkihhhhjjjjhgggijmqty{~…“•”‘ŽŒŽŽ‡‚…ˆˆ‚|ywvxzywwvutsssssstttvvz…ŠŒ•‘Š‰‹ŽŽŽ‹ŠŠˆ‡†‚€ƒ........000111222233332223333322333333333333333322110000/////////////..............-,,,,,,,,,,--,,----------------....--.///..--,,+)*****)(())('((('&%&&%%%%%%%%%$%%&%%%*/16=MZfonhdcfV+!%$$$$%%%&'(().6FXo‚„€}xofUE?69Tupl||kcbeiv…†usuvyzbL`pprv|„ƒ{rjgihhmlkmryxz~‚ymaVKKGMK.03111112310..//-//---++,,'$))'(,,03588::9:;:::;:=??BCCBADFILIFHGDFIJH@>FHJLIFGIJKJHFEC@9)$$&$(++++*(%%%&+.00.1:=@B@=:4(%-24785/-.*&&%&''%%%%$$$#%#%$%%##""""##"""#%*4GYj}†‹ŒŠ‡†ƒ~{zwmlgY[W\f^F@F5<`v|wssntog\SJDCCBEGHIIIIIIIHHEHMT_mxƒ‰ŒŒŒ‹ˆ††„‚‚„‡ˆ‹‹‹Šˆˆ†ƒ}ytoljhhhiiiihhhgggiknrtx{€Š’••’‘ŒŽ‰ƒ„„ˆ„~~zxvuwxxwvuutsssssssuuvy{€†‹ŒŽ””ŽŽŽ‹‰ˆ‹ŽŽŽŽŽ‹‰‡†††„‚‚ƒ„........00011122223322222333332233333333333333334411000000///////////.............-,,,,,,,,,,,,,,,----------------....--/.////--,,+)*****)(())))((('&%&&%%%%%%%%$'+)'%&(+,/5>LZfoqkgcfcA"$#%$%%%%%&))+3DTl…ˆ„{tj_VPIDFRabf~zncahk~‰‡{ssuvw|yOQgljkoustkgjklot|}€†‡„„yq^MD;1224---.0011.///,*++++-,,,++++(%&&'(*+.135787567779::>BDFHJFFFFHJLMKJIHKKJG@@DHJIDDGIJIHGEB?9+$$%&(+,,,+)&%%%*.00/6>@DCA?>3( !"'07<<99852.(('%&&%%%%$$$#"#$%%%%#####$$$$$#$(2GYj|‡ŒŒŒ‹ˆ„…ƒ‚{un]\cieZPVO?Kj}~vthC`qhaUMFEEEGHHIJJIIGGFFEHMT`nxƒ‰ŒŒŒ‹ˆ†„ƒ‚‚„…ˆ‰‹‹Š‰†…†ƒ€|wsmkihhhhhiihhhgggiknruy{‚””’‘ŽŒŒŠ…€ƒˆˆƒ€}zxvuwxxwvuutsssssssuuvy|‚‡ŒŒ‹–“ŒŒŠˆ‰ŽŽŽ‘‹‹‰‡††ƒ€‚ƒ†‡--..///-/011112222222222233333223333334222333333332211111000/.//////..--..........-+,,,,,,,,,,,,,,------------------............,,,+++++****))))(()('&%%%%%%&&&'*8C7'&'&)-06?L[fotpigbeZ/$##$&$$&'(,3=Ocx…‹‹…wld`YWRNOXadn{wngfhp‡Œƒyknrprw{WAWbfacegwnalos{ƒˆˆ†ŠŒŒ‰~kWD86444471*()/.----,,*)))*****(''''%#$&&''*,/1345533333788<BFIJIJJHILLPRQPOQNKHIHCABEFBBCGGHIHF@?9,%%%'(+-..-*(%##)-..1:@EIEBB=1$#%+2:=?=:8642+*)%$%$###%%#"$$%%%%$%&%&''())('),2EVgy‡Ž‹‰‰ˆ…„€|pdkoji[]h[5Adv|wrbcpjaXNFEEGIIIJJJIIGGDDFGKUamxƒ‰ŒŽŒŒŠˆ†ƒ‚ƒ„‡‹‹ŒŠ‰ˆ†……‚€|xrljhhhhggiihhhggijlosvz}Š’“”“ŒŽˆ€€„Š…‚~{yxwvxxwvtttsrrrssssuuuy~ƒŠŒŒŽ”‘ŽŽ‹ˆ‡ŠŽŽ‹Š‰††…ƒƒƒ…‡ˆ--..//0/111111333333333334444433333333343333333333222221100000//////..--........,,++,,,,,,,,,,,,,,++----------------............++++++++++++))))(()()'&&&&&&'''(-FZL00+')-28ANZenrsliccfQ)##%%$#((.9K`tƒ‰‰ŠŠƒyjcaa`\XVUYhuvsxrhfio€†unnnopwyY8KW\^]Z[nyjwyr}…‡‡‰ŠŠ‰‚oW>9448?;697.'(*,--,,+*('''((''&'&%%%#$$#$&%'),./10222222478>CIKLLLMONNQTWXXXVROKJIGBAA?=?BCEFGFD@<5*&&'()*,,.-*('&%(-.00<CEIIEB:+! "%07;;;<;:741.,+'#%%###$$#"""!!!##$$$%&'())+,.18FYjzˆŽŽŽŽŽŽŒŒ‹‡…yrh^OG>40031:AMmyuvvsokc[QIFFHJJJJJJJJHHFFEGKUamw‚‰ŒŒŠ‡„‚‚ƒ„‡Š‹ŒŠ‰‡…„‚€€|vpkihhhhggiihhhggijlosvz–‘’ŽŒŒ‹†€€„‰ƒ€~{wvuvxxwvtttsrrrrsssuuw{~ƒŠŒŽ’”‹ˆˆ‹ŽŽŒ‹‰†ƒƒƒƒ…‡‡‰--////0011111133333333333333333344443333443333333322441000000000................,,,,,,,,,,,,,,,,,,++,,--------------......//..--++++++**++**))))((()((((''((((()+?UP<;-)*.2:EP[dmorlhdbegC#"%&$%+.;Oi|‡†‰‰ˆxcXX^a`_]ZWWe{{ozsggfmtxyvpomoruz\36KVVXXR\ntxrbk~zˆ†}iP@98865889;?5('''*,*)(('%%%$&%%%%$$$$$$"!$%$&(*.,-///0111499?EGMNOOOQTUVWYY]ZYXURNJIIGDB><=ABABCB>8/*''&')**+,,*(((%'+/03@BGJJH@2' &5:<=>=93/--.--*(&$$#!!!#"!!   !"$$%())*.-,.04EZp~}„ŒŽŒŽŽ‹Š‡}uj`WOE7.(&#&*6:@NYiottnf^SLHGIIJJJJJIIIHFFEFLWalx€ˆŒŒŒŠ†ƒ‚„†ˆŠ‹‹Š‡‡†…ƒ€{voljihhhgghhhhhghjknotw{„’”’‘ŽŒ‹Œ‹‰ƒ€€…‡„}|xwtvxwvvtssrrrrrrsstuy}‡‹Œ””‹ŒŠˆˆŒ‘‘ŠŠ‰†…ƒ‚ƒ…ˆ‡ˆ..//0000111111333333333333333355444433334433333333334410000000..................,,,,,,,,,,,,,,,,,,++,,--------------.....///..----++++**++**))))(((((((((()))))**2IXK:-*+/6>GR^gkkflmc`cif;"$$%),5Ih‚…„…†…|oXJNPX^bb``\Zc}~{‚ujjhkmouxrmnnruw^1.7KQPQMNX^ZRFBi}{uzvkP;56:987768;<;.&%%&''%%%$$$$#$##$##"""""!!##$%&)+,,----.0147;>FJKNPQQSVWZ[\Y[]\ZYUSONNKIGDB>>@@AA?<5/*''&'((*+++*(((''+..4BBGIHF?-#  )5;=?>72.+)&$(,,*&$#"#""!#"!! !!#$%'*)*,,05;9ESd{x|‰ŽŒŒ‹Š†yskfZRB9.((+09DFLONQ\kkicWOJIIJLJJJJIIHGEEEFLWanyˆŒŒŒ‹‰†ƒ‚……‡Š‹Œ‹Š‡†„ƒƒzumjhhggggghhhhhghjmorux~‹•’’Ž‹‹‹‹‹…‚€€……‚}zxwuvxwvutssrrrrrrsssux}„‰ŒŽ•“ŽŒ‹ŠŠˆˆŒŽŽ‘‘‘‘‹Š‡…„„„…ˆ‰‰Š////000022221133333333333333444455553333444444443344432011000000..........----------+++++,,,++,,++,,,,,,,,,,,,------.....///..--++,,,,**++**))**))(())'')+**,,+,-09LT<--/3:BLU`hjga`khbbcoc/$(+/>^~‡„‡…w]B5<ELRX\_adbbds€ˆˆ{nkjijlrtpkklouu_2,.9HKHNKJLBB?4;dxzpbN;4579;;:968:;;6(%$$%%%$$##""""""""""""""!!!#$%&&(+---,--/.;A=BEILORSTUUUX\^]^^]]\XUSSTRQPIFD@=;>=<94.*))(((((*++****(')*.4AFHHEB7)  "#,6=><940,*('$$'(*($###$$"!"""! !$%'(+--/36<Qhnjp{ŠŽŠ‹ŒŠˆ†‡†ytlf\RE732249?GEDGIKWZY]aTIHKMIKLIJIIHFEDEFLW`nx€ˆŒŒŒŠˆ…‚‚ƒ…‡ˆ‰ŒŒŠ‰ˆ†…ƒ„zsligggggggghhhhhijmosxxƒ”‘‹ŠŠ‹‹ˆ…€‚‡ƒ}zyvvwxwuttssrqssssrstw|‡ŒŽŽŽ–“ŽŒŒŠ‰‰‰‘‘‘Œ‹ˆ†…ƒ„„†ˆ‹ŠŠ////002222112233333333333333444455555333444444443344431121000000..........----,,,,,,+++++,,,++,,++,,,,,,,,,,,,------......//..--++,,,,,*+++*))**))(())**+*-.////111/GA1128?HP[cije[QZmgbagqT$#),2Hl„ƒƒyiI.)24;DJRXZ]adfhu‚‡†qigfhlmkiikloqv_,)+.4FHEGF>65IF53Vd]H<55689;;::979:;=-%%#$%%$$##""""""    !!!!    #$&&%&(*+***,.49;<CHNORRRSSTUW\]]^bb`^YVXYXXWWUMIC=978730,+)))(((*++*****(*,/5AFFEC=/# !%-6<?;71.+)&%##"#$&#"$))%%#"###"#%')*,022/1=\u~zy|~€€ˆŠŠ‹ŒŠ‰‡„‚„ƒ|wpic\PFA:768:??ADFINKNHJ^eSUZHFJJJJJGFEDDHOXboz‚‡‹ŒŠ‰†…‚‚…‡ˆˆ‹ŒŒ‰ˆˆ‡‡…„}vrmigffffggghhhhhjlprtw|ˆ’”Œ‰ˆ‰‰‰‡ƒ€€ƒ†‚~|ywuvwxwuttssttrrrrrstw|€‡Ž‘“‹‰‰‰‹Ž‘‘‘‘ŽŒŠ‡…„„…‡‰‰ŠŠˆ00112233332222223343234444444444555555334444445555443322322200000.......--,...--,,,,+++++,+,+++,*,,,,,------..------..........----..--,+,,,+****))*))++-..00121100119B=57>ENT]fjjbUKHakecdnq>!(*6Qy‚}~sW9&(+,15<AHPTZ_dlr~‰‚z|shdbgmqmkijkoop^+)+**7FIEC>3,131*1DC843247:::;;;78:;<6(('&%&''%$""##""!!!!!!    ! "#$%(***,,,.367;<BGLORQQQSVVZZ\[`aca^\]^]Y\^WSNID<75640..-,*)())**++++,+,-17@DEDA7+!""#(.4;>:4/*)&%#""!"$!%&)))&$#"$%%%&&*++,./-.;KXctxws|{„‡ŠŠŠŠ‡„y|‚…ƒ|xrib\VOB:>:=@CEGHLNUQVZJHVS_i\MIJJKIGECDHQXdoy€ˆ‰‹ˆˆ…‚‚ƒ„‡ˆŠ‹‰ˆ‰‰‡†„{vqmhgfeeeggghghhimmpqtvŽ’‘Ž‹‹Š‰ˆˆŠ‡…‚€€„†‚}{yxyyyutssrrrrrrqqssuv{‚Š‘”’ŽŒŠŠˆˆ‰‘‘‘‘ŽŽŒŠ‡††„ˆ‰ŠŠ‹ˆ‡001122333322222233432344444444445555554444444455554433323333200000......------,,,,,,+++++++,,+++*,,,,,------,,------......--..--....--,+,,,+****))+++--/0122334444444>JC9BLT]fklj`UE8Hiidbita*#+:Z|}xwc7%'*),,059@EMS[frx„’…yxse``aipofgkmnor],(*-129FA@<6**)('(,/023598::9:;;9779<;-(*+,())*)('%#$$""""!!     "#$%&)))*,,,/3689<AEJORRPPTVX[\\_^`ab`___\[[[ZWINH<74220/.-,+)))**+++++-,-0;@DED?5& !"$).39;950+'&$#""""##$%(***$%###$&('*++++*+3APWB=9<:Zlr~†ŠŠ‰‰ˆƒ|us{€„ƒ~xpkg_UNDB@@CFKKMLLQNH?KKLOXglbIIKIHFDCEIP\epy€…‡‰ˆ‡„‚‚„…ˆ‰ŠŠ‹‹‰‰‰‰‡†ƒ€zuqmgffeffgghfgiiilnqruvƒŽ‹Š‰ˆ‡„…†„„‚†…‚€~{yxyywttssrrqqqpqqssux~…Œ‘’”’‹‹Šˆˆ‰Ž‘‘Œ‹Š‡†‡ˆ‡‰Š‹Šˆ‰„001222332222333333433444444455555555555555444444556644444222100000/.....------,,,,,,++++++,-++++,,+,,,--,,,,,,------....--------------,++++***++**,,//1233456656567788DLDHRY`fmmi[P>05VpiccjqH$)8Z~{xs\.&&)((+,039?FKXiwyƒŒzud^\]clphggilorZ-'*-5;9RH=:92+%'$&&)-.27@=989:998668<<7-+-/,,,...,)%#$##"""   "##$&'())),,/373139>AHMPQOQSUVXZ]][[adcbb_^_ab\RTRG;753320-.-+++,,++,,./003;@CCA;1$!!%'(-26:93-)(&%$""$%#$%()),-(%$$$&''()**)(+/8ETU=5*'/BXk}ˆŠ‹‰ˆ„}ukhqx‚~xsleaYRKCBFFFIPQSWTLIPNORYeV]]MKJJGEDEJS]fqyƒ†‡†…„ƒƒ…‡Š‹‹Š‰‰‰‰‰‰‡†‚~xsokggedffggghghikmprtvxˆ“ŽŒŠˆ‰ˆ‡„…ƒƒ„~ƒ†ƒ€€|xxzxwtsssrrqqrqqqstsy€†Œ’‘’•‘Œ‹Šˆ‡ŠŒŽŽ‘‘Œˆˆ‡ˆ‰‰‹‹ŠŠ‰†„222222332222333333433444444455555555555566555555556655554422111100/.....------,,,,,,,+++++,-++++,,,-,,--,,,,,,------....--------------,+++**,,++,-/03367668899888:;;;;>JURT\cjrmcWJ8.,?fmebelf;$5Qw|vq^6&'))'()*.38>GWlyu|†Œƒzvh^\[^chggegmprZ+'*-5<Cc[B793,,(%(()*,.5<;557887876577:2++-,++,-./,*)(&&$"!   "##$&'('((()-110/05:>AGNRTPRSSUUWXX[\]a_`__[[YY[VSNG@674210---++,,,,--.1333;>AA?9/$!"(+,/19<ED>3+'&$&&#$#&))(*..-,)%$%'*((((((+264<1*''*5CZn~‰Š‹Š‡ƒ|qjeiqx‚‚}xsokeYRLJIOOQUY\\VQWRKNTWZUIPXKDEEEDFNT]grx‚……„ƒƒ……†‰Š‹‹‰ˆˆ‰‰‰‡‡†}xsokffedffggghiijlnpruv}Ž“Ž‹ˆ‡‡††††…„„€€……ƒ€~|yxzuwtrssrrqqqqqqrst{ˆ‘““‹‹Šˆ‡‰‘‘‘‘‹‹‰ˆˆŠŠŠ‹Œ‹‰ˆ†‚333333331344333322444555443345555555556677555555556666554432221111/...----,,,,----,,,,,,++++++++,,--,,--------------....----..--....--,+,,,,---.1222559;::;;;<;;<<===@CFOVZ\fnvnaSF5.,3Mpifcem]/*Dj{upeA&%')'&))*/48AZryos‚ˆzvna][^efffcfjlkZ-%&,17Jg[N8//,++((*++*,.13224577685596582*)+,,++,,+,+)(''&$  ""#$&''''''((*(),/28>AKQQRTSRSSSTTRUXZ\Y[^]]dc`ZRQQMI887211/0-------//34548=>><6+##$&)/19M`lpk_RA3+*&"""&-64688830-,*++*))))&%*+'%%'''(2C\p‹‹Œ‹‡„|pc\`hry€„‚}ztpkhbbca`_b_^][bmhY[^]YWP@8OVeZGFFGLU`isz€ƒ„„‚ƒ„„†‰ŠŠ‹‰‡‡ˆˆˆˆ‡ƒ}wrnjgfedfffghhiijmorstyƒŒˆ‡†‡††††…„ƒ€„„€~}|zyzvvsqrrrrrqppqqrsu{„‰Ž”‘ŒŒ‹ˆ‡ˆŽ‘ŽŒŠˆ‡‰‰‹ŒŒ‹Š‡†ƒ333333333444333322444555444456555555556677655555556666554432221111/...------,,----,,,,,,++++++++,,--,,--------------....----..--....--,+,,,,-../24758;>?=>>>@@@AAABBCDFJLSVYZjvn_OD5/,-9ZtiedjlZ.2YwvpiO*')'(&)*)+/5D`wsjn~ƒztoqf^\\`bffcgmlm\.&&++0MgYRQ9**++,,-,,-.---//14587556875@P+*-,,+++*+++,*('&$""""##$$%%''((*/98<FLRSTPTXUTQOQOQSUVW^ab_bfc]UTRQM:5;9400....--/025684489;60'##%%+6F[s€„…†ƒzm`TB.%$,9AFGFEACB<4442221000/-*'$$$$$&(4H_u„‹ŒŒ‹Šƒ{qaWY`jsy‚‚ƒ€|wqjghddda`afkllc[WXW`efaa[LUk\JEFKOXbisz|€‚„„„…††ˆ‰‰‰‰‰‡‡ˆ‡†„„}{wrnjfeedffffffiijmorsu|ˆ“‘‹ˆ‡†…………„ƒ„ƒ€€…„€~|zyxvvsqrrrrrqppqqrsv}†‹•‹ŒŠ‡†Š‘‘ŽŠ‡‡‡Š‹Š‹Œ‰‰‡†„‚2222223344465544334444445555554466666666556666666666766544442111110/..----,,,,----,,++,,+,,,-,+,----,,+,..--------....------....//.--,*+,,--/0125789<>?ABACDCDCDDDEEEGHKQY_^\cpkZL?3/.-0AipldfmsY-GlwumY5&()'))*,-1;Sqxljr||tomqm`][_acfgijlm_.%*,.1Pe]WUV:+'(((()*-./-,,-.0445314433KxR!//.---,++*++*('&%"  ! !!#$$#"&&&(,37=EJOSWSSPROQNQOPRTRZ`efghddZN>QNY@0;=7220000100168862452*&#%&(4J^p‚‰‹‹ŒŽŽ‹„zkT1):EMIA?EFFEA;:8:::<<:863,&! """%'7NdwˆŒ‹‹‹‹†}ncUSYckt{€†…ƒ€zzyxxwmlnmuyupklqosrikjkno]NTOGCMUZbirx{~€€‚…†‡‡‰ŠŠˆ‡ˆ††‡‡„ƒ‚}yupnjggfffeggfgijkmprvv‘ŽŠˆ‡††‡‡†ƒƒ…‚€€„‡ƒ€€~|zyxvvsqqqqqrrqqppqrx€‡‘”’ŽŒ‹‹ˆˆˆ‹‘’’ŽŠ†ˆˆŠ‹ŠŒŒ‹‡†„„ƒƒ2222333344465544444444445555554455556666556666666666666543443222110/..----,,,,----,,++,,+,,,-,+,-----,,-..--------....------....//../.,-..//113689<>?ABDEFGGGGGGHHIIIKJNU]dggadg[L?2/.-04TpkidhruJ<azwpc=%'&'()*+-0A`xvklx~xsmlovd]\[aceffikl]/&*,-3Sg[Y[XN9*'&&')(-00/.++-012311699Ie€‡6&.00/11..-,++('&%$$%%"!" ! !! !#""')-/7?DFINQLNPRPMJLNQRRSW]effhgdZUVKIZN67=:62111111278864230(%%',Cax‚‰ŽŽ‹‰‹ŽŽ…wO0:BMB><@LJID?967:;<<9998-$ !$$$*?Si}‰ŽŠŠŒŒŠtdSKPZeov|„††…ƒ€€{zwuqsxzyxtufadkjpqong_TWgbfTLT\ejsvz}€‚†‡ˆˆ‰Šˆ‡‡‡…††…„~|xtomifeeefeggfgijlnqqtw„’‘Œˆ‡†‡ˆ‡†„„…€‚†ˆ€€~|zzyvtsqqqqqqqooppqry€‰Ž’•’Ž‹Œ‰ˆˆŒ‘‘‘Šˆˆ‰Š‹‹‹‹Š†„ƒƒƒƒ3333444444454455554444555555555544456666455677665666666654443322110/..------------,,,,,,,,,,,,,,------,,--,,----------------....////010...013559:;?ACDDEGIIJJLKKLLLKLNOSY`gmpmd\UK?62////;_phedjtk@UwysiF(''))()*-3Fi{rkn|zqmkdavk\]\`cdcchjj]0'*+-3XhZYYVRJ>,&&'''+23/..,,-../24>FPaxŠ”w+13234321/-+((%#"####"    !! !#$&)-3:@DEFHHGJLNONNMMPOQU\`feijgd[RMJZeXF?<:7320112366876332+'')Ai‰Ž‘’‘Ž‘‘ŒŒ’†lB?FLEDMITYUOMIB==>AA>>?<2($#%%&'.BXmŒ‹‹‹‰ƒyeNBHR_ipx€†ˆˆ……€~yvutuqtwwkfc]Z`^bfb[a\Z=AQd]^[_emrvzz|‚…†‡‰Š‰ˆ‡……„„‚‚}zvsnlieeeefffffgijnosst{Ž””ŒŠˆˆ‰‰ˆ‡…„…€€‚‡‡‚‚~|yxyusrpqqqpppoopppu{‚‰‘”‘Œˆ†‡ˆŒ‘‘‘‹ˆ‰‰Š‹ŒŒŒ‰ˆ…„‚‚„†333344444454445555444455555555554445666645567766566666665444332211//..------------,,,,,,,,,,,,,,------,,--,,----..----------......0335400023378<>?CEFEHJMNNNOPPOPPPOQRRUZahnospbRC>7543//1Cjpfeely^Nt|voP+&(**((*-2Jmyolrxnlgbdopb`^^acabeih\0'+,06_e[]][POL@.('&'(.2/-,,*+,,-7BNYix„Œ–˜[-4566321/-+*)(&#"""!    !#$$&(-269>ABDEEINKOPPOPMOSV\l_aoljc[QLYe_UOIA98852212567798662,(9b‚‡Œ“——”“•–’‹Š’Ž{R<FIJJKNSVXX\aa^UUQONMGA4&##%&((.AWmŒ‹‹‹ˆudI9=JW`kv}„‡‰‰ˆ†‚}~~tjada^`h]aYUWafaWZa…ACW_[`diosvxy|ƒ…ˆˆŠ‰‡†„ƒƒ„‚~|yurmkheeeeffeefgijnosst|””‘‰ˆˆ‰‰ˆ†…„ƒ€€‚‡‡~|yywusrpppqqppooppqv|„‹“”Œ‹‰‡‡‰ŒŒˆ‰ŠŠ‹Š‰‰ˆ‡…„„„…‰33444444554444445544444455444455555566666677666666667664554433331100..----,,---,----,,,,,,,,,,,,,,--..,,,-,,----......------..//..014577667799>@ABFGKMMOOQQSUUTTTTSSSSUV\ciqqqoe[PC<8542105Pqieffru]q€ysY0&&)*)),.5Rqvmmu~qeggiiith_^\_``cdghZ0&,-1:ee^`^[OMNQD-)('%'//+)+**+/8GWbn{†Šˆ–›“6$/3444400--.-,)&$!!  !"""#%)-.16:>@BCEMSRQNMIHMQU[ejoplmj`SNK`cUPPNI?8743334478:<<<949Z‹Š’—–“•šš—’ŒŠŠŒ‘…^>IIJHLMRTZ^_bcd]Z^]ZXTE0%##%%&&-ASi}ŒŽŒŠŠ„|pbE/1>JXelw‡‹Œ‰‡†…‚€xjaZY^\WWW\^^_jeXiƒˆ}LZa^ZYforsvz|‚…‡‰‰‡„……ƒ‚ƒ~~~~}zxtqkkgedeeedeeghilnpsss‚“““‹‡‡‡ˆ†…„ƒ€€ƒ‰†€€~|zxvuqqpppoooooonopw}…–“ŒŒ‹‰ˆˆ‹‘ŽŒˆˆ‰ŠŠŠ‰‰‡‡†…„„„†44444444554444445555444444444455555566666677776666667634554433331100/.----,,---,----,,,,--,,,,,,----..,,,,,,..--......--------//134468;<<<<<;;=@DDHJLNOQRSUWXYXYXXXXXXZ[`fkpsqoeZQPKA8433208^qgdhnvuxƒ€xa3(*(**+,.<Zxsmls~vjiiiijpma]\^cabfhfY0+.34?fd^]^ZMJPTSC,'&$$&*.*-317AKWhp|‚‹‡”šx(/244310/,--++)%#!  "!#&(*,,-279<@BGMPQIBHKNSY__ejglni\TVMRdXSOPPMHA80/13666666<8=YzŠ‹‹Œ‘‘““‘••—’ˆˆ‰lFFIILMOQSVY\^__\\[\[XQB,$"##$$&)7Mcx†‹‹‹‰ˆ‚ynX=,)/@LYet~„‹ŽŒ‹Š‡‚€yvtdefeZZ^jjg_LHNk…ˆŽtSPLQYgnsuuw|€‚„†ˆˆ†…„…„€€~||}}{xtqkieedddddfffgilnpqtu‡•”‘Ž‹‰‡‡††……„„‚€‚‡…€€~zywtsqqpoooooooonnrxŠ‘–“ŽŒˆ‡‡‹ŽŽŽŒŠ‡ˆ‰ŠŠŠ‰‰‡…„„„……‡Ž44444444554444444434444444554455555566666677777777778AC;6644443231000/....,,---,------------,,----..--------......------....--//13558;=AABB@==@CFHKNPRTUXY[[[\]\\Z[[\\^_bhnsvtqg]TLQUPB5211/>enhfhqy~yi>%'*())*0Bdyolkq€ukhgiigflc_]^bbdgfgV31114Gfc]__YFFNSTRC+&$##'6=69?EOX`jx…Š“–›™U*,.10/...-,++*'$"""%'*+++,/37:@JKQQNJOLNPSW^^^acaaZVYSUc^QONNNLHE>72.+//02345Os‡ŠŒŠŠ‘€ps€Ž’Œ‡‡Š‹rHAHIJLNQSSSVWYWW\^^\XUE,!! "$%$'4Jbw„ŠŠ‰†~uiR3(56>DO^o|‚‰ŽŒŒŠ…‚€ztneZWVX^djdedRL[{‡‰Ž}of[Valonw}„†‡‡††…„ƒ‚€{|{{{yxtokheddccddeeeghloqrty–”‘Š‰‰‰‡…„ƒ„ƒ€‚ˆ„‚‚€€|yvvusqpqppoonnnnlot{„‹‘“–’ŽŒ‹‰ˆ†‡ŒŽŒ‹‡†ˆˆ‰Š‰ˆˆ†††„…†…ˆ44444444554444444434444444444455555566666677777777778DWN96544432310000....-,--------------..------..--------......------....--//23579;?DDEFEBACEIKNQSTVX[]^_````_`````bdgkpsvtrk`WMHDHMKA4101Gkkdchp}…€zpV0(*(+-17Jiumkhozojhhiieceha`_^bdeefU31112Pga_c`WEFKPQRP?)###%1DNDCMSZbiy„ˆ‰‘— –;/.00//./.-++*'$"! !#%&&*,,-/37?DEKMNKIJMOQSWZ^^a`b^YUSUc]QPNNNLHEDC>830.,+//Diƒ„„ˆŠŒŽˆwU=AYx†…ŠŒŒuPDHIIILMNORSURRTWYXVRPC.!! "$%$&2E]r‚ŠŠ‰†ƒ}sfR/&7;?AMany…‰ŒŒ‹†‚yskcYSQPKOVX^_^_v‰Ž‘•™œ›ŸŸ—}WU[TU[`cp~ƒ„ƒƒ€~|{zz{|ywsnjgdddccddeeegimpstu~’—”’ŽŒ‰ŠŠŠ†ƒƒ„ƒƒ‰ƒ€|yxvtrqqpoooonnnnnpu|…Œ‘’”•ŽŒ‹‰ˆ†‡ŒŒŒ‹‹‰ˆ‡ˆˆ‰Š‰ˆˆ‡†††††…ˆ44443455444444444444555544334455665566776677776666667:GN<555444331//00...---..-...,,--..------..---...........------------....//1469;>BHJMMLIGGJLNPSWY[^_bbcddddccddeeffjnquvwrlcZQJCBBFIID:10Pofcbfr~„~ykWC536:BJYoqjgenumkijjheecmda`_bdddeS0,*,2[idaghWIKMOOOOL9&$%(0AVXKHRXagr{‡‰‡Œ”šž„%(.320//.+)***(&# !""$&'*-/24:ADGPTYYZ[]^emvustpkf`_ZPWf`SPOOMKIFDBBC=:421+2\~‚ƒƒ…‡Š‰€mK*()=cƒŽ‡„‡ŒvPAIJKKKMOONNNKKPSSONMKC.!!""$%%(2H]rƒ‰‡†ƒ€{obM-)+/6?Malu|‚…ˆŒŠ‰ˆ…yskfYUQPR]_]\bgo{’•› Ÿ¢¥¤œWLNSQJG@;ALVl~‚ƒ~zyyz{zyvsmhedddddddeeegjmqstu†–•”‘Œ‹‹‹‹‡‚‚ƒ‚€†‰‚€€‚€€}xwuspoppppnnnnmnopu~‡‘‘•”ŽŒ‰‰††ˆŒŽŠ‹Œ‹‰‡‡‡ˆˆˆ‡†……†‡‡……„Š‘44443455444444444444555544444455555566776677776666666657:3554443310000....--..-..-..-.//------..---...........------------....//357:<@DIMORRPMJLNQSUXZ_abeegffhhiihhiiiinqtuvurlcZTMFB@>=DMNE?>\ldccis}yrf\UV[`dlrnigdlxoijihfbdbmlfecdfddcR0)**<gidfegOLOMNNMNNK8((.6:K\ZLQY]dmw~…ˆ‰‹Ž’–››h(//./-+)(())('$!!""#%%),/112FWdlqrvxzvrttvtrtsstrmaUXeaTONNNLIFDBCBDFIA0/Ao‚z{~ƒ„…}a7%()%2W}Œ†ƒ…Š‰sIDIJKKKMNNMMIFKLNNNOKIB-!!""$%%(3I_t‚‡‡„€~wn^F(+3/*3M_iqx|ƒ†ˆ‰ˆ‡}xpieb[U[\^\]agqŠ”™ ›’…iSHVaain\MJHGGDBJf|‚|zyz{zyxurmhddddddddeeegjmqsuw——’ŽŒŒ‹ŒŒŒˆ‚‚ƒ‚€†ˆ‚€|zxwuspopooonmnnmnopvˆ‘”“‘ŽŒ‰‰ˆ‡Š‹ŠŠˆ‡ˆˆ‡ˆˆˆ‡†…††‡‡………Ž‘44444444444444445555554454554455456666677766666655665563455543333222110./.---.............//..........////..--------..--------00368;?CFKNRVXWSOPQTWZ[^bcfehijkkkkkjkllmnrsssutpkb]TNKDC@><:=CEEOghddfoy||wysppprropnhefbk{pgfffeccbmvjfeadcdbQ,**,IlgfhgfKKONNONLLKH82599=SZTOSZ_iq|„‡‰‹‘•š›™C*,,***''&&&&&%#   !"!&'*/9Nahjjijpyyvustsqooponprrtsqm`UQOONLIGECBBEJQ``P[{€{||€„~m8&(%'/NwŠ†ƒ†ˆ‚hCDIJKKJKNMMLFFJKLLKJIG>.! "#$$%(3K`w†‰…‚~{tl\G.&1)(:P[elqw{~ƒ………„ƒ€{smijkhaZ^cgkpx‚‹‚B.0;M]`nqtfVXchimmh^RVgy{xyxzzyxupkfdbbddddddeegknqss{’—•Ž‹‹ŒŒŽ‡‚ƒ€€ˆ‡‚‚ƒ~|yvtrqpoooomlllmmosy‚ŠŽ“’Œ‹‰‰ˆ‰ŒŽŠŠ‰‰ˆˆ‡‡‡ˆˆˆ‡‡‡‡‡ˆ…„„†4433444444445544555544445455445545666667776666665566555553554333332211110/..-../00//////..//..........////..--------....------/0/28;@DHLQVY[[ZUSTUZ\^begjjlmmnnnnnmnpprsuvvvtsoib]UPMHEB@=9856;CRfeceisyuxvttuxvsolfbbebi}pijhjhiijo{nihcceb^N,*+/XlhfjnaELPPOPNLKIGFB?<=;=E9<KV^fnr|„ˆŠŽ“–›ž‰,!&(''&&&%%$$#"!   !#"'?Zfgdcdegrxxutvtsromkkllnpprv{}t\PLNNLHFECBCDHSamrz‚~{}}}~y],$%&$$/NtŠ†ƒ„‡€Z9DHLMMLMNMLKFHKLMMKJIG>.#!"""%(8Pfz‡‡‚~~{tiX>+,0,.EQZ^gkquz|}~‚€|yutspngefhkqxƒŠŒ‹\2DL\ba]nsm†Ÿ£©¦“ˆ€‚ogmvwxzywxsojedbbdddddefgimooru~—™“Œ‹ŠŒŽ‡ƒ€ˆ‡‚‚‚€}{yvtrqpoooollllmmoszƒ‘‘‘ŒŒ‹‰‰‡ˆŒŽŠŠ‰‰ˆˆ‡‰‡‡ˆ‡††‡‡ˆ†ƒ‚ƒ‰5544443333444444444555444444445555775556666666666666665555542244332111000//../....//////////////......////..../---..--..------/0146:@DHLQX\^a`ZXYZ\``dhijlmnooooooqqrrstwwvutqmfa\WQMJHDA?;96213<Wjcfeorghgfjkjifgiffed`fxsomiifeghh}rhfdaga\N,*)<gkhilmSBKOPQQONLIGCB@B>?9;54BQZbglu€ƒ‡‰‘•—˜šs $'&'%%$$""!!  "7[lica`acirzwuuwvtsrpnnlllkkloptz€wZLONLKGECCCCJT`kt€„}y{{xuoJ)&&%&&.Ntˆƒ……zO7BFJLLMLLLKHEIKKMKJHFD>.#  !!!%,<Tk~‰‡}yrgS8"'18=LQZ\`fknqrwy|~~~|wxwuqqqojnsz‡Œ‹‰ˆA'7EQ[]QUb}š³¼»º¹±¢Ž~p™wt|zzzyvsnkgcbbdddccdegilnqss„™—’‹Š‹Ž’„‚ˆ…ƒ€}zxvtrpooonmllllnlot|†Œ‘‘Œ‹‰‰‰ŠŽŽ‹‹‰ˆ‡‡ˆ‡‡‡‡†††‰ˆˆ„€‚†‘5544443333444444444555444444445555665556666666666666665555454444332111000//..///..////0/////////....../////.....--..--..----..00146:>AHLPV\`cda^\]_abfhilnppqoooooqqrsuwxxvtsokfa\VSPMJFD@=:74111GjeacilXKRUTTNJKWhfa_\Zdxpjidgjjgdexxkhfchg[J,'.PnihlojEELPSTRQOMIEC><@E>;9=9?TV[`gmv~„ˆŠ’•—˜X&&$$$$%%""!!   4Zkje``bcclvyuvuxxxxusqpnnlljjjklnsz‚y\ONLKGECBBEJRant€}ywwsp`9,,(&'(/Os‡‚€„„vI7BFJLLMLJJICEIJIIIHIGE?-$##!"#%,@Xm€ˆ‡‚€zrdP5""&2BMPVY\aeikmqtxz|||{{|{wtttrptx~ˆŒ‹ˆ‚71<ES_VQMn ¶¾º¶·£«´™Ž“š–€fXp{yvrmgccbccccccdehjmoqsuŠ›˜“ŽŒŒ‹‹Žƒ‚‚‚‚ƒŠ…‚‚€}zwutrpooonmllllmmpu}‡Ž‘Ž‘ŽŒ‹‰‰‰ŠŽŠŠ‰ˆ‡†‰‡‡‡†…†ˆ‰‡…‚†Š‘554444444433334444554444444444446666555677666666666666555344444444321100000////.//////////////////////.////.//.//.....---------/1358;@EJOT[aejiea]_bdfjljmnnpnnnnnqrtwyzxwvtrnid`\WTROLHFB@<97312:^ia`bkX04;:62/7Nhd\ZWS]xrigbdhjhilr}mfcbjo\G'(@hkijpp]?HNSTUSQPNIEA?=<>EB=8@ARdQYafku}‚†‰‹Ž’–—‘=&((%&%$##""!!  "Eloe^\`ddfjxzwvwxy{zyxvurqpqmkkkiijlr{„z[PLJFECDCDITant~zvsstqrZ7/0,(''2Qu„€~‚ƒp=3AHKJLMLJIABGIIIJIHIHF>,"#%#$%'/C[qƒ‰…ƒ€}ypaM2 !%9KPTVUX\^cegklsvxy{{{}~zzxxuvy|ƒ‡‰…„33<DT[LEX”´½½«–¨¤¬¹²‘†ž•…w_nxwvokgecbbbcccccegjmoqswŽ™˜’ŽŒŠ‹Š„‚ƒƒ‚‚‚…‰ƒ‚ƒ€{xwusrpoooomkklllnqv‰’Ž‘ŽŒ‹‡‡ŠŒŒ‹Œ‹‡‰‰‰ˆ†………ˆ‰‰†ƒ‚…‰Ž‘‘554444444433334444554444444444446666555677666666666666555344444444322210000///////////////////////////.////./////.....--------/01357:=BFMS[aejmjfcbdehkkjmnnpnnnopqsvx{{xwtsqmgd`\XVSPMJGDB>:74213Nj`]`gg5'*++,.9Re_WVPMVxshggcekejkn‚tiffmv`C&BdjhilpqNBKPUVVTROLGEC?=9:@JJ?9>E[XPX`bju{„‰ŠŽ’’•†- ()'''%%%""!!   /]nk_^`cegjqzwuvwxy{}}}}ywvtrqonmkjfhgksyqULJFECCCDJTblr|zrppqnnmaE1//++5Uw…~~€i2#5EJKNMLG?=CIKJJJIHIHF<*"##"%%&0G_wˆ‰…ƒ€}wo`H-#%,BPTWWWYZZ]\`dfkqtvxyy{}}}}|xz}~€ƒ……‚y77;AMRJDo¦·¾¶ˆ| ´º¸¶‘~Š—–’˜‚uvutokgecbaabbbbcegjmost|“™—ŒŒ‹Œ‰ƒ‚ƒƒ‚€€…‰…‚‚‚€}zvtrrqpnnkkkklllnpwŠŽŽŽŒ‹††ŠŒ‹Œ‹‰Š‰‡††………ˆ‡‡ƒ‚‰’445543555544444444333353444455556655555656665566667777664444443344343311111100////////0000//./00////00.///0000/..-....----..../134679<AELRZ`fknnjgfgiiijiklnpooorswx{|yxxwvsnige_\ZXSQOKIFB?:8622/?cc^afjG&(*)+/;Te[WRMNTtwfghiiifhlp~mkjhuzpgihhlpnphCGMQUWURRNIFEA>=;859FI?:9BIPPV^fmu~„‡ŠŒ’“w%"(((&%%$! !""Bjnb^`cefjpw{wtvxw{|~}~~}zxuvwtrqojgfeffmsz|iPJGFCECGLUbrxyupmnpoopomaG2-,7Vy‚~€~d0#$*;FHJH?53<CIKLKKJHHE8%""""$$&3Md{‰Š…„‚}vm]C)"*:LUWZ]\\[ZYTUZdhlqttuwx~€~}}~€‚‚‚~~‚rG9@CKICM‰©¶½¶{Yƒ‘©²ªŽƒ‹–“¡£œˆuqrokfbbaaabbccdfhkoqqr~–™”‰Š‹’‰ƒ‚€‚ƒ‰ƒ‚‚€~zwtsqoooonmlkklljmpxƒ‹ŽŽŽŒŒŒŒŠ‡†‰ŽŠ‰ˆˆ‡‡††††‡…ƒ€ƒ†‘“’‘555543455544444444333344444455444455555665555566667777664444444444222211111100////////0000//./00////00.///0000/..-....----..//0135789<AEKQX^djppmjgfhhijlknoqpqswy|}~{yzywrmjfc_\[XTRPMIFB?;962304[g`_bhW(%)),0<VfZUQOPUrxheeebekhimzƒskjio|zxoloppq\AHNPSUTROLGC@><:95328CG>15=CFQ[^enu{‚†ˆŠŒ‘”k%&&""#" ! #Nnl`_eddirwz|wtsuxz{{|}}||xtuxvtttrpkigefhmszx`KHDCDDHMXfrxwrqnmonnqromk`TB?\z|~€y[(""#!*8AA7/9@BFGIKLJIHD6%""""$$(:Qi{ˆŠ…„‚xmZ?&%1DRVY[^__ZYWTSY]ekmoompsx|}}‚‚|‚ƒmVCFEIE@a“¨²·¸ªŽ|†–•›•š”’’“›¦•ƒronhfdbbbbaacddfglnqrs„™™”Œ‰ŠŠŒ‘Ž‰ƒ‚‚€„‡‚‚‚‚€~zwusqooonmlkkklmknry„ŒŽŒŒŒ‹Œ‰‡‡ŠŽŽŒŠ‰ˆˆ††††††„ƒ…‹–•’Ž65554345555555444433443333445544555566666655445566756666545544443333211111110000//////0000//0000..//00//////00/..-....----..000135689<AEIQU[biptrnjggfhikloqvyy|}‚~{zwqmjfb_\[XUROLJGC?<973213Li^]aca0$()+0>XdWSQRTXirfabcaailrpq€ujffhq{zyuonprnNDJNORRROKJEA><:75331/2@C:37<?DT\acnu|„…ˆ†‹“’X"$!!  "#$&# -Yokedhhinrusvwustuvyzyz{yrjiihquqprvwrolhfilpswrSIFFBEIP]krwvonmnpmprqojeiooko€|~}wS$!#$#"%#+*(/:?EGIIJEFF?1%#$""$%-?Vm€Š‰„ƒ€ylX:&*;JU[ZZ]__]ZWUSV[`eikljkowz|||}€‚‚‚~ƒ‚mVOLGIBAlš¥««¨šš¡ ¡˜“™š˜Ž˜˜ˆskidbbbabbbcceggjnqssŠœ™–ŠŠŠ‘ˆƒ„ƒ‚…‚€}zwsqonnmllkkjjjkkns{†ŒŽŽŒ‹ŠŠ‹‡‡†ŠŽŽŒ‹‰ˆ‡†……………ƒ‚…Š••”‘655555665555554444554433334455545555666666555555666766666555444433333311111100000/////0000//0000////00//////00/..-....----..00013568:=?CHNTZ`gnrusnjighhinqv|ƒƒ……‡‡‡ƒ~{zwqnkfb_\[XUROLJGC?<973200@c`X]be@%((*/A[bVRQTVVdsg`ccchmmokgqsh^_cimrx{xttm]GIKMNOOOKKJEA>;9653321/2<=437AGRYYaemuy‚†…ˆ‘M  "%(+-% 7amhdgimmrxunprrqposvvwyzphcehmnopnmkkrxwoihjlmrtsdMHDCGKUcotvtnmmonkntrpljhimr{ƒ€{~|sK$!$$"$$$'*+).:AEHIKMLE<0&$$##&'0DYq…‹ˆ„‚whT4%0BLRYZ[^``_\WUSTY^afhiknpuquz|}€‚‚‚€„€n[ZZTQHDqœ¦¥£ž•—˜Š‹™—–“–š˜•šœ“‰‚jedabbabbbcceghkppsv‹š˜•ŠŠŠŒ†„ƒƒ€~€ƒ‚}zvsqnnmlllkkjjkjlnt~ˆŒŽŽŠŠ‰‹‹ˆ†‡Œ‘ŒŠˆ‡††…„„……‚‚‚ˆ“•””‘55665566645555444455443333345544555555556666666666666666665554443333332211001111/////0//00//0000///////////////..-....----..//123579:=?CGLSX_flqwurokighiot{†‡‡‡ˆ‰ˆ‡…}zwrolhdb^[[YUSOLJGC?;8621./4SdZW[cS&%(+2C]aXRQVYX`ricjjnlkmkllcgie`]cinquzzn^OMNMMNNMLKJIEB?=96522/.../6A?7>GNWaU]dlt{‚‚†‹‘•A  !!!!  !%(/4-Aemhehjknvwpiknrponoqttuvkcaaagjmnqnlifju{slljjlnpqmWFCCHNXeptxqnopqnjmrroljjhkt}‚|}}rC#$$"##"%%',.**4=BGHGHE</%$$$$&)2G^u†‹‰…€tgS1&6DKOV[\_^]_\YVTTX\`caceikppmuw|€‚‚‚ƒƒpdgcZVQOu¦¥£™–“ŽŽ’”™•”›¡ ‘‘Ž|fbca`abaaccegilqquy™–’Š‰ŠŠ†…ƒ~ƒ‚ƒ‚{xuqnmmllkjkkjhkkmow€‰Š‹‰ˆ‰‹ˆ……‡Ž’ŒŒ‹‰ˆ†………„„…ƒ‚ƒ‡”–•”“9999886676555533445544333333444455555555666666666666667666664444333333221122111100///0//////000000/////////////..-....----..//013579:=?CGLPW\ciorutpmifhltx|„………†ˆ†„{vspnlhdb^[ZWTQNKIHC?;86220/1Cb[XZ`]2%+.0@Z]VSUWXY`smdhpqqnnqmnk_]bidfgklngaUQSSTQQOOMKIHGEB?>;762100//,-7FE?CHNidU_glqx}~ƒ†‹‘•‰8   """""""" !#"'/8HZhhhkmmqwvligillmmopqqtr][[[_`ekopnoqmjditwqokkmlnnreIDBIQ[hqwunnpppmfirrpnkljiq{„€z|{k;$&%$%%%#%',12+$(6ADGFB7+#$%$$&*6Mcz‰‡„ƒ|reL.&7EKOSYY\^]][WUUUX\^abddccikjorx|€‚ƒ|rnkge`\\|ž¤¢œ™“‰Š‡z’“—˜••™¢Ÿž“†}kcbbbabaaccegilqrt{’š–’Š‰Š‘‹…„‚~‚ˆ†€€‚{xupnmllljjkkjkjjmqx‚‹Œ‹Œ‹‰‡ˆ‡‡…††’‹Š‹‰ˆ†…„„……ƒ‚…‹‘–•””’Œ9899998777665554444444333333444444446666556666666666666665664444433322221111111111//////--//0000110000//00/////..-....----.../013579;>@BFJOTY_eiptwsplggmwz}€ƒƒƒƒ…„‚‚~zvusplifca^[YVROMJHFC>:86330//5Y`WX\aC&),0A\]WVVYYY_sqijkmqljjlnjjdXYYR=:>BFRSWYYYVSOOKJGFDB@?<;9740/.----/8FKFFCSrcY`iisz}ƒ‡Œ”‹2! !!"####"$$%$$""(%5HMRZdjootxwiceddgggknpnojRQXW[\_cfhlpsutnjdkyyspllmlorpUDCJQ]muxrnoppnibhqspmmmmlu}„€|{yh7%''%%'(&'*./41*$%-:DC@3*$$$$'',9Pg|‡†„ƒyn_A)(<EJNRVY[]]\\[[ZZ[]_`a``_beedhlpx{}€€|wsspkgfe™ž–Žˆ……~sVo‹•˜™””—š˜‰yydaccabaabcegjmpru}”™–“Š‰ŠŠŽ“Š„ƒ‚~€‚ˆ…‚‚€{wtpnmkkkkjkkhijkmsz„ŒŒ‹‰‡††…„‚…‰ŒŒŠŠ‰ˆ†……†……„„…Š”•”“’’ŽŒ;::::::877665554444444333333444444445555556666666666666665554444443321221111110011//////--//0000..//////00/////..-....----.../013579;>@BDHLRV\agmrvvspljnuy{~€€€€|zyuroljgeb`^[ZWROMJHFC>:86330..1Ib\Y[`T((+0B[]WUUWWX\ovlnquyqoqrkike]\ZL==@HNTXY[[YVSQOMIDCBA>>=<:8520...//159CLIB2F^g]^djsy‚„†Œ•Š2! "$#$$$$$$$%%%$%5SlbNJWblqx{obaacaaccbgklnaAELRXY]bcdgmquuwsmiit~yqnkmmmprcHEJUarvxropppnb_gqupmkjhlr|ƒ~}}ze1&&'%%&(())&%)24,&%%.;>1&$%%('(-?Voˆ†„ƒ€€ynZ8(0?GJNQTY\][]][[[[]^^_`_^]^bcbcgjovy}}}€€{uttrsqop„”š–’šš”v{ƒ‰‹–™›š˜––—˜•ƒ|o`ababaabcegjmqst˜™•’ŠŠ‹‘“Š„ƒ‚€ƒˆ…€}zuspmmkkkkjkkijilns|‡‹ŒŠˆ†………„„‡‹‘ŒŒ‰‰ˆ‡‡…††……„„ˆ”•”””““ŽŒ<;::::::98887766444444333444333344556655555555666655666655444444333322221111000000////....//////00//0//////.....--....-------.012479:=?AEGKNRW]bjpuwvtmlovx{{~~|z|{{zxvqolkiecb_\YWTROMJEEA=977321-./9]aYY_a6&+0C[^YYYZ[[_kwqnmpy{xtwohef^WTG<>BHMRVZ\[ZWUSPLHDA@><<;:8764311/015;?;;JMFAB]g_`dkry€ƒ†Œ‘—ˆ/"&#$$%&##!$$%#*FhuqdLAJ`t|yg_b^_acccaaeikT?CJHOTWZaa`dintyzwtqloy{rmmmmkmmiPILWfvxuqqrqpm\^fptqmkkiks}ƒ{}xa,'('(('(*)'&'(-00'(()*//*)'&(%&0F\sƒˆˆƒ€€yjU1'5EKJLPRTXZ\\\\[\]]\]``_`]^^[Y\`elotwyz}~xrstuwutv…Œ‘“ ¬¬¢•z{ƒ‡Œ’•šž¡•”˜™’‚xdb``aabacehknrtt…——“ŒŒŠŒŽ‘’‰ƒƒƒ‚€€„ˆ…€€€{wvuqnmlkjjjkkkkjkowˆ‹‹Šˆ…„ƒƒƒ…ˆŒŽŒŒŠŠ‰ˆ†…††……ƒ…’••”””’’’ŽŒ=<;;;;::98887766544444333444333344556655555555666655666655444433333322221111000000////....//////00/////////.....--....-------.012479:=?ADEILOSY^dkrvwwrprsvwz{z{{zzzywuroljheba^[YUROMKHEB?;976411../2Ma[Y[bO'+/=X`\\\^^`agwuoqw‚‚wvxrkheUJOA:=@CKQUXYYYWVRPMJEC@>=;::::86532334<=;;=<>S]Zcijcddmsy~€ƒˆ——ƒ+('&%&&$#%$!(Onxi`c^K<ATntdY[]^bbbfe_`hdO=?ICGHNUVUWZ`hoty|{xuqlt|tlllkjhhhXKR[mwvqpqrqpeW[fosplkkjmt}ƒ||wY)'(())*))('''(*-4.(()****))*)))3Kat…ˆ†‚xfL-,<GJKLNQRVXYZZ\\\\^^\Z^]Z]__\YZ\^biostwywqnpuuuuvw‚† ³¶®£€{„Œ‹‹‹”š™šž –”š“‡|rabaa```bfhknrtvˆ™•‘ŽŒŒŠŒŽ‘‡‚‚‚‚€~„ˆ…€€€{wtqpmmlkjjjkkkkkmrw€‰‹‹ˆ‡…„ƒƒƒ†ˆŒŽŒŒŠŠ‰ˆ†…††………Š”••”””’’’ŽŒ==>=<<<;;;99887765444444334433445555665555666666665566665544333333321111111111////....---.//00//00/////...........//..//.-....012468:=?ACEGJNPV[_fjntwurqrtvxyxxyyxxwutonlihfb_]ZWSPNLIFC?>:97422/.--.=^^YY`a;(-=Xe`_^_ciigs}ut|Š…ywwunj_QJPE:=@CGNQVVWVUURPMIFDA@><:::::7544579=<<;=6,3L^fginndbjqw{€„†”—…&!)')'&%$#"5qyrke_]XN?>QRVYYY\^bbeeeefWD=<BHEHFMQOQT_hosstvyywups}xolkkjhif[RTapvtprssrm^VYbnrnjjjimt~}~uT'()(()*)(('()'),21)'(*+*+,,0--/;Si|ˆ‡„‚ƒ}scC+/>IKKMPPQRUWXYZZ\]_^]]]]\\]^ZWXY[[`ippquqghmosvxwz‹®³«žŽ…„‚‚ƒ‚‚Š—œœ›Ÿ¡œ–’˜‚~f`_``a`adhmprtwŠ˜•’ŒŒŒ’Žƒ€‚‚€„ˆ…€}{wsqnmlkkkkkkkllkmqx‚‰‹‹‹‡………ƒƒƒ‡‹ŽŒ‹‰ˆˆ‡†††……„‡”–•”””“‘‘‘Ž‹@@?===<<;;99887777555544334433445555665555666666665566665544333333321111111100////....---.////--00/////...........//..//.-.....02468:=?ACEILMNRV[`glpvxxtrtvvvwwuuvvutsnmkgfe`_]XUQNLJGDB?=;:8641/.---2Q`[Z^bR*,9Udcddelppir~z}‡Š|v|unf`UK=:9<?AFHMRSTSTSRPMJGEB@>=;:;:7544456;>=<;;3/+*<Yfgjrthcdktz~‚Š”˜‡,"))'''#@rvnjjkijfZA8IMEOUVY\acdeg^C4E?AQKEHHILNS]flrttstuxyxvx}}umjlhffcaWZiuwsprstphVTXalrnjkijnu~|}rK$')))()((***)*')03-''(****-0339G\s…‡…‚‚|r`A+3BJKKMPPPPRTVYYYZ\___]\\[Y_^[TUY_`ZbjjmodZ`gnswy|€…‘ ¨©•Ž‡‡‡„‚‡•œ›™žŸ•—‘Š~o_`__`_cfkmppuv‹˜•’ŒŒ‹‹Ž“…‚‚‚€„ˆ…~yurplllkkkkkkklllory‚‰‹‹‹‡………„„†ŠŒŠ‰ˆˆ‡†††…„ˆŽ“––•”““’Ž‹A@ACB@?><<;:::88776666554455444444445566665566555566665554443333222222011110//////....---.--...........---............//.......02458:;>@BDFILMQUX]dhlquxtrttuuusssrtrroljhfdb_[YVSPLJHFCB?>:87641/-,,,-A_]YZ^b=)7Qffiknqutpt|‚ŠŠpmuslj_XH789:<=AEKPQPPQPONOKFB@?>=;;988543237=>><<81...+0Jchhqqogfmsx}ƒŠ“–(!'+('"3suokkmmloo[C8<ODJUXZ[\^^[L94586EMIBIJJLT\cgimprqppuxzzz}}unhjgcaab\`pzxqqqrslbPPW`jpkjljjqy|~€qC&''(''()*))**)(*-150'(())*,234>Rfz‡‰…‚}yo]:+9EIMOOOPOOPRRVWYZ[^^_`]YXXW][TSUYed_dehk]V^fmtz{‡Œ”¡ ž—“‹‹‹††ŠŠŠ‡‡‰›š˜ž˜–’ƒyda`aaadgiloswz’˜’‘ŽŒ‹‰‰Œ’‹„ƒ‚€€„Š…|ywtqpomkjkkjjjjjjkns}…‹Š‹Š‡…„„…ƒ†‹ŽŽŒŠ‰ŠŠ‡†††…ƒ…‹’”•••”’‘’‘ŒBAA@?@?>>;;:::88776666554455444444445566666666555566666644443333222222011110//////....------...........---............//....../123468;=@CEEGJLPSVZ]cglquuqqqpprrppqpmmljheca^ZXVTQMKHFEBA><:76420.,+++-3O`VUY`W,2Jaklmqvxvqqs€mtlnvieh^XWB8::99:=AHNPMKLNOONLHC?<;:8778854325:?@><<71//0/.+5Sjjjurhejr{€ƒ‰‹’v$('(&jwmhjprttxrZG<7GIESWYZZXE657:81:DB@BDHIQ]dgfghginnprvxwvyzuojhea_`a_dswvsqrrpiYNOU`ilijljjq||€m<%'()))*+*+**++*++/471&'()),18<I\rƒŒ‰…„‚€wjV4,:DIMOOPRQONOPRUYZ]^_a`]YWUU\_]YSONaggfgfZYagrv|~ƒ‰Ž‘—››—‹’””‘˜ ¢žš’‹Š‘—˜–š›™’‡ˆ‡tfeddegilmpsw~•™“‘ŽŒ‹ŠŠŽ‘Šƒƒƒ„‰„~|vsqmllmlkijjjjjjlou…‹ŒŒ‹‰‡…„„…†‰ŽŒŒŠŠˆ†…†„„‰”••••””’’‘ŒFFEDDCA???<:998877777755333344443344555566666655555566555544333322211101111000////....--,,,,--..//------........--...........//112356;;>>@CEGINQTWY^chnnoommnnoommmkkjhgeba^[YTRQNKIHECA>>;86631/.,,++,.<\XST\_A)=Tflos{zvolgin[bq†Œxg[OSSB::;9977;CJMKHFJKMLKEB<::88887643237>BB@><5111100/,'@]flmpmjmvy~ƒˆŒŒ‘O#(&Qzqkjpuw{}`VG;3;B;?IUZO5)6;9=@=;;>BDGIQZchifabc`_eikoqstsrqqjd`_^`_chwxtturqodRMNT_fhjmkikr|„}€m@2.*++++****+,--,--08</&(),..9ASgy‰‰…„‚~udH-+:CGKNOPRSRONNORSX[]___^ZVTQZ`c_ZWTU_giie[_hnuz~‚‡Š‘–”™¤¤¢žœššššŒŽ””˜›–‡~‹†}lhkiikmnrsuw‚—˜“‘ŽŒŒŒ“‰ƒ‚ƒ€€„‡‚~~{wurolllkjikiiiijjmpw‡Œ‹Š‹‰†…„„„‰‹’ŒŒ‰‰‡……†„†Œ“••””“‘”’Ž‹HHFECCBBA?>><<:988777655433344443344665566666655555555555544333322211111111000////....--,,,,--....------........--...........//0123578:;=?BEGHKORVXY]begikkkiijjiiihhfedb_^[WUSPNLJHFCA?=<886420,+++++,,2M_VQW[W,0=P^houztmh_WQJZr…Ž†€sfe`I=9;99778>CIHEEFHIHGC@<:85545653357=CDBB=94222010../,+Dcjmpqmpsv~€…ˆ‰w $"B{qhjovy|‚w\VVI9257876;8,05679:>>>EHLQTZ[aijfa^cf_Z\_abfoqmlnqjd`_^^]alvtqqrqoo`LKOU]cekmjjnu}†‚‚„rRIE<0,,+*++*+..,+--.2:92)-8>7=MbtƒŒ‰…„ƒ‚€ueJ/'0>FJKNQPPOONMNNORX]]^_^[WTSW_fhdcbejklnjcipv|‚‡‹ŠŠ‹‹“š¢£ š˜™š—•––ŽŠŽ‘’““•‡„‚vpnmooqrswxy…—–’ŒŒ“‰ƒ‚ƒ„ˆƒ~~{wurpmlljiihiiiijjmpxˆ‹‰Šˆ……„…‡‹“’ŽŒŠ‰ˆ‡…„„‰”••”“’’’‰MMIHGFDBCA@?=<;;8986556666554444444455555555556644444445544333332222222221//////......,,,,,,--,.---...------------..--..........0023668;<>@BEHHMORVXZ\`bdeddbcegfeefecba^[ZXURPOLJHHEAA>;;86421.++++++,-,<[YRU[bE&19EW`ksoha\XUIH`|‰…{uujN<9<:87658=@A@BCCCCDA?<96430//146;?BEECB=6323311210320(3Rgmmjt}wtvz‚€j7 4uujjnvw~u[TUVN>423565432788::99CJNPT\_`^ejhe`cghec_]YPP`omjlqkb]\]^\^ovqopqrqlRLLOSX\ellgimv€†……ˆ†ylc[SD4-+++++++,++++,.4;=033:>DZnŒ‰ˆˆ†„{uj][WLEADFHNONONLJD@ILTZZYX\\[WY^flooprsstqsrqsw{‚ƒ†‹Œ‹ŠˆˆŠŒ‘“—š™™”“–˜˜–“‘ŽŽŽ’”†…Š„}wustvwwxwz|Š•”’‹‹‹‹Ž‘ˆ‚‚‚‚€~~„ˆ~|ywtqpnlljjjiiihhkklqyƒŠ‰ˆŠ‡………‡‰Œ‘•’‹Šˆ†„ƒ…‰Ž”•””“’‘’Ž‹NNLKIHEDECCA?=<<:996556666553333444455555555554444444445533333332222222221//////......,,,,,,--,.--,---------------..--..........00234779:<>?ACGJMQSUUVX\\^]]^_acba``_`^]ZWVTROOKIGFCA?><;98521.,++++++-,-1G_WQZd_0(0:MX[ced^XYZRJNlztpoorbQA<54421/14554678;<><:;964332158?BEFFEB>9311222255555450/=Zinny}{ueRT8'/ltihlow~|gWWZ[XRA3468<3/1666:>?BJMOTWW[__bfgfedeehea[YRE@Qfjjkpi`[[\\\eyzppqsqpbJHKNPU\eolikp{†ˆ‰Š‰‰…ypd[I6,+++*++,++++*,/5>735=BQizˆŽ‰ˆˆ†ƒ}tj\]affeWJFGLLJKGA.*>BFVXXY\`_]^emrsstvyyxxwvxz}‚ƒ†ˆŒŒ‹‹‰‰ˆ‰Œ“•––’‘’“““‹’–•”“”‘Œ†{wyzzz||‹““ŽŠŠŠŠŒ‘…‚‚‚‚€~~€‚ˆ~{ywrqpnlkiiiiiihhjklq{…‹Œ‰‰‰†…†‡‹Œ‘““’‹Šˆ†„ƒ†Ž”••”“’‘“‘Ž‹ONNMKJHFEDCB@?>=;;977677555555444444444444444444333334544333333322222211110///....----,,,,,,,,,,--,---------------------.....-.-001445789:;=?AFGKLOPQQSVWXXXXZ[]]\]\\\ZXURRPOLJJGECAA?;9764320,,,,**,,,,,-7U[SU]eO&,4@MSUYXTRVYXUR]lmkfhibXK8-.-+*(('''''*-148<ACDDEGGC@AEFGGGFEA;40000155766655633.0Ibgs{|xX $+kvlnqoryscW\\[^\UA556530-/4DIFFXdTQVZZY^^bded```dcdc\WTM?:CUbggkg_ZY[]]n~wpprqqsXFEKNQW]ejlmrx€‡Ž‰ˆsk^L4-,,,-,,-+++++-16:;;BLZrŽŽŒŠ‡‡†|sh`]bfcbbYGOMG>9=?9#/3.GXZ\_cdcfkrvwyyyyz|~}|}€ƒ…††ŠŒŽŒŽ‘‘’’‘‘‘ŽŒŒ‘‘Œ‹Š‹Š„€€€€€ƒ„Œ’ŽŒŠ‰‰‰ŒŽ„‚‚~~‚ˆ~zxvrppnlkiihfhiiiikms}‡‹Œ‰‰ˆ†…†‰‹’”’‘Ž‹Šˆ‡…‡ˆ’–•“’’‘‘ŽŽ‘Ž‹PONNMKJHGEDB@>>=<;987677555555444444444444444444333334544333333322222211110///....----,,,,,,,,,,,,,,,,,,----------------.....-..//03345789:;=@DEIJLNMOOPQRRRUWYZYXYXXWVTQONMLJIHFDB@>;977531/.,,,,++,,,,,,/C_WSXch>*-3@LPLLLMNRVYVTgkkhcbb^[J+('&%##!!""#$&)09ENQRPOONMJIIHGGFCA<7100001567666445554105I^owyye0*izmnmnrxw\XZ[\]a__G65531-.04FJILelSSSRSW]]acb_\\\]_^ZYQNC:7=O`g`ij`\\\[ax~urpsqqlLBEIMQW^djnuy†‹’’““ŽŒˆ€vk[D0-.----,,++++,/4;;=@Nbvˆ’ŒŠˆˆ‡‚{pe_DFciea^Scmg_VL=@;9<@KY_acefhnrvyz||||}~}~€‚†††‰Ž““•––———————•••“‘Œ‹ŒŒŒŽŽŒŒ‰‡…„ƒ„…„ƒ„„„‚‚„„ƒ‡Ž‹ŠŠ‰‰‰ŒŒ‚€€€€~~‚‡~|zwurppnlkiihfffhhijovˆŒ‰‰‡…†…ŠŒ‘“”’ŽŒ‹ŠŠˆ‡ˆ”–”“‘‘‘‘ŽŽ’Ž‹TSRPNNMKIGFDCB>==;9:8677466655444444444444444443333345442222331133222211000///..--,,,,,,,,,,,+++++++,,--------------------........013355778:=@DDFHIKMMMMNNOOPSTSTTTSSRROMMKIIGGFD@?<<:75421.-,,,--,,,,,,,-.5TaVX_fa0+/6ALJFGHGHMVUSXiopcZ\daWC'%%#!!""##$')/:KUTRPOOONJJIIGDDCA=7300001446777;895653560.07?EB5,jxnnrqpzz]XZ\_aa`aO@74430/--26>ABJNQWXUTUZ]__ZZ\[]]YTQMGA<66=O\^V`lb]]]\lƒ~uqqrsp_DBFHLOV_cgr|…‰Ž‘’““”“ŽŒ†tgV=//......++,+-.07<@ERj€ŽŒ‹ŠŠ‰ƒ|pdcP=^gbeehhhhlolbODKQQYafgknrsx{€~~~€~|}~ƒ„‡”˜šž   ¡¢£¡£¢ ™—”ŒŒŒŒŒ‹‡†‚‚ƒƒƒƒƒ‚ƒ……‡ˆˆ†……‰Œ‹‹Š‰ˆˆˆŒŽ‰‚~~~~~~}€†~{yvtqonllkihgfeeggijpw€ˆŒŒˆ‰‡…„‡‹Ž“–”’‹‰ŠŠŠŠ‹‘––”’“‘Ž‹“Ž‹UTSSPOOMKIFFCB@>=;:8977765665544444444443344443233333332222211111122221100/////.--,,,,,,,,++++++****++++,,++,,------------......//01115577:<<>ACDFFHJJLMLNNNNPQPQPPONLLJJHFFEDCB@?<::86420/.--,+----,,,,,,..?a`WX_gO(*.6BMJGIEDHKMTW^mqf_`de^T9!$"! """$',1?P[YXYVRUQNJGFFDA@?<9400001244668<><9557754410/-.+1evmkoqpw{cY[^^dffP>8;84422101347:BKPX[YZYY]]]]ZZ[\\YTPMI=8656=KSTQYhe[]]awƒ}vtutsqR?BFGKOV_houˆŽ‘”–—••“’ŽŒŒ‡}sbM5---....,,,++-,27K\dtˆ’‘ŽŒ‹‹ˆ‚ylcbcZ^eccefiiggjooppokdgmrsuuyz€‚‚„„‚€€€~|{zxy{|}…œ£¦ª««««¬­®°­ªª©£Ÿš–‹‹‹‹‰‡„„€€€€€€‚ƒ‡Š‰†„…‰‹Œ‹‹‰‰‰‰‰‹ˆƒ€~~|~||}€ƒ}{yvtqomllkihffefggijqz„Œ‹ŠŠ…„„‡Œ‘••’‘ŽŒŠ‰‰Š‰‹‘”•““”‘Ž‹’ŠXWUSRRQOMKHIEC@>=;;9977765554444333333333322333344222211111100110120110011//...---,,++++++******))**++**++*+++,,,,--,,----..-.////01333356799;=?ACEEFHIIKKLMNNMMMKKJHGFDDBCCB@A@><;967410/.---,+----,,-,++--4PeYWX`g=#,/6CKJFDCBEFHQWerjihb]X\S2($!! !"%)/=S^^``\[[TQKFBAA?>778821001233478;@A=8875544320-,-6lwljonnwzh\\[]`aW:(.7;9520036435:?GPUXWTVYY^^]\Z[]^^ZTRQG;7524:FMQSVdf]^[f€ƒzwvtstvkK=BEJQU\ky~ˆ’•–˜™—•’‘Œ‹ƒym]C2.,//00...++-..4CawŽ”’ŽŒŒŒ…€ug`_aabacddggeehnrrvy~}||~~†††ˆ‡ƒ€~|{xwtrsttt~¦¬¯±´´´¶·º»»º´³²®©¥•Ž‹ˆ†‚€~zzy{{{|}ˆŠˆ……‡‰Š‹ŠŠ‰ŠŠ‰ŠŒˆƒ€€€~~}}~‚~zxurqnmkjiihffffggijs|†ŒŒ‰†„„†Œ“••’ŒŠ‰ˆˆ‰‰‘–•’’’‘‘Œ‹Ž‘ŒŠYXWWUTSPNMIHECA?><<:877765554444333322222211222233222211111100110120000000//...---,,++**********))****))+++*++,,,,--,,--....-.//001122223668::<=??ACDEGGIIIJJJLLIGFFDCDA@A@@>=><<9864520//..--,,----,,-,+,,-/;ZaZUYed3&,/9CKHEECAAAHPZkuwp^PU`bJ( !!!!#%+6N`bedb_YOHA8500277569842111233567:>=:8875544533,-Bmumjmqqvyga\`^aX:))-07:952028755:?HORX[WOOVZaa^\Z[^]^ZXVWNB<655<FOUSR^g^Z\m‚xvustsqvtSAGLMP_s}„Ž’””–—™˜“‘Ž‹ŒŒŒˆ~sfW>149;;<862-*+022C_y‹““’ŽŒ‹ŠŠ…|ob_baabbdeeeggjkprtx}€„ƒƒ……„……ˆˆˆ‡‡ƒ€zxwttpqonnqu«±²·¹¹¹»¼¾½½¼»º¹·°¬¡–”•ˆ…„ƒ‚~|ywvuvvvwy{~…ˆ„„ˆ‰ŠŠ‰ŠŠ‰Š‹‡„‚€€€€}}~|yvsrnmlkkjihffhhhhimt}‡Œ‹Šˆƒƒ…ˆ””’‘Ž‹Šˆˆˆ‹’”’‘ŽŽ‹Œ‹Ž‘‹[[ZXXXTQONLIGDB@?=<;88875555323333332222221122000111111111//00001110//0/-/..--.---+++*))))**)((((()()*+++++++,,,,,,,----..--..0000000012445788:<<=>ABDDEEFGGGGFEGDCCCAAA?===:<=;9864332///..------,,---------3Hg`WU\g_)&&/5@HGFDA@@BIT_nro`PT]^W;!!""$'.D]ccdc\ND7,(#!#'(+.15:<943347679;==@:897565445307b}xmgkqsuw`Z\_abS-&(-/36477418;899>FOTUWWTPPRW^___\\^\[ZZ\\XK?<89DNTUVV[daW_v€}yvtprrjjwxXEIMVcw‚Š’”••–—™”‰„‡‹‡|qcSEGLPPPMHC@81214Ed|”“Œ‹‹‹ˆ†xk`_cbcaabcfghjossu{ƒ…†‡ˆ‰‰ˆˆ††ˆ†…„ƒ€~yvspohfimpmn˜­²³¸¼¼½½¾¾¾½¼»»»»¶°§žž–‹€€€{yxvsrorpprrvw„€{~…‹‹Š‰ŠŠŠ‹Š†„ƒ€€€~~€ƒ{xwsplllljiiihfiihhilu€‰Œ‹ŒŠ†„„†Š’•’Ž‹‹‰‡ˆŠŒ’’“‘ŽŽŽŒ‹‹‹Ž‹‰[[[[YYVTRNMJGEB@@>=<998755553333333322222211220001111111110000000000100//..-,,,++++++)))))**)((((()(')*****+++++,,,,----..--..00110000124446889:=>=>?ABBCDEEDDDCCB@>>===<<;;;:::77522221///.----..--.-...-,,--3ShZWY^iQ#%*,3>FHDCB@<AIRfppk`[^]]T+!!"%*6QdbceZF0,)%$"##$$&(*/9;844447;==?BBE@;:86766750Ku}tkimqvzua[_Z_gK((+.-1038:7<FE>;>>GMVXTSSSPQSQUZ^^]ZZYYYX^d`OCB>?FRUUUVXa`[i€€|wususj`bkuxXFKXo}†‘’‘‘’’’‡€~zz‰ŒŠƒxsid_bfffb]VQJA846Ml„‘’’‹Š‰‰‡|rdb`bcbb`abdglptw{|…‡ˆ‰ŠŠŠŠˆˆ†…‚~}}}|xsnjff_hmpkoŸ¯´¸»¾¾¾½¾¾½¾½¼»»»ºµ¬¦‰zz}~zxvtromkhhjjljoy}v{‚‹Š‰ŠŠŠ‹Š†…„ƒ~~€„‚zwupnkjiijiiihfhhhhjpw‰ŒŠŒŠ†„„ˆŒ”—“‘ŒŠ‰ˆˆ‰’“’’’’“—˜“ŽŽŒŒ‹‹‹Ž‹‰[[\\[YWVSQNLJHFD@>=<:9765542223322221102222222111100000011000000//0/....---,,,+*++**))(())))(())((()()))*****++++,,,----------/1..0011223333667799<>>@@AAAAAA@??=>><;;::::999866555221110000----.....--------./8Wc\XYcd@!%)+1;FIB@@>=@EUjsrmkihieD!""#'.?^iedbL3*+)%#!#""#&(+/79666679=@BCFHGB?;8766543I~yrmilqsyud[^]aaD$)++-.047:=9>JF<9=ELPTXURRRNMONPSV[ZXZZ[VTZa]NHFCCDLRUUVV_`ar|xwvtvtd]`glssVO^sƒŽ‘‘ŽŒŒˆ…}qotvyŒŽ‹†€}zxy{}|zwrkf\VKFK[q‡”’Œˆ‰‡†…|xkaadbaccehiknquy}}‚…‡ŠŠŠ‰Šˆ‡ˆ†…ƒ~zvvwvvusmhb\_dacgm‚¡«³¸»½½½¾½¶¾¿¾½½½½¼´ª …styyyz{zxurpkgffijhdemnw{ww|‚‡‹ˆˆŠ‹‰†‡„ƒ„‚€€€„‚{wtrpllkkjjiighhhiikq|„ŠŠŠ…„ƒˆ•–”’ŽŒŠ‰ˆ‹‹‘“”“’““˜¡¡›’Ž‹‹‹ŒŒ‘ŒŠ^^\\[YWVTROLJHEECA=<:976654222331111111111111100//000000110/////./..--..,,,,--**++**))((((((''(('''()))))))******+++**,-----..--//001122445566779:;<>>>@?????>>><;:9998888778866553221110000/-..-,---,-------./0?_cXVYba.#''+.7CGFBB>;<DXv}sjgbnt]/ !$'1Hhmml]7*-)'%#"!#%#$&*-46666679=@DFHHGC@<985441:s‚uonqstyyb^`]agI%%*/9:78>>?A>=FD?=@FMNLMLKNQMLNOOQRSVWW[\VTUWUNKKGEEHNUUVV\dj}|vusuuuua]bbekso_i{‰‹ˆ††‡„€xkhmtrx…‹ŒŠ‡„„†ŠŽŒ‹‡{tlf\\_m{‹’‘Š‡‡……„}tf]^_bdcfgklquw{„…‡ŠŒŒ‹‹Š‹Š†„€…wnjjkljd[WTQRUSW`‚Ÿ¡ª¶³µ»¸¸¼¾¼½½¿½½½½¼¹¦}imqtuvvwvuronkidipopkfltsjekpuvˆˆ‹‹‡††…………ƒ‚‚€ƒ‚}wurqllkkjiiighiiiikq{†‹Œ‹‹Š…„‰“–”“‘‹ŠŠ‰‘’““’‘‘“œ£¤œŒŠŒ‹ŒŽŽŒŠ]]\\[YXWTRPNLIGDB?<;:987643322111100111100000000////....//..........----,,,,--++**)((()(&'((&&''&&'((((())))()****++++,,,,--,.--0000112222223456778;<=====<<<<<;::::9988776888655533210000000///..--,,.---...---1Fd^UV]hV%&'&(+3?IGA??<:C^qjjbapsqM##'3NmpqnP--,)$""!!"#""$),0456678:=@DHJHGA>=875110^€xtqtuz|~gY_]bgU&,)-4=GEHLOIGDEIEFEDEKLIFCEJKIIKNRTQQRUYY\\URTQOPOKHFELSVWUYds{wrsvvvwr_[__agkqtt‚ŒŒŒˆ„ƒ‚ƒ…yecholm{…‹‹‹‹Ž“–•–“ˆƒ|wolqx„Ž“‹‰†„„„{o`Z_`^bgjnqsv|}€†ˆ‰‰ŠŒŽ‹‹‰ˆ‡‡ƒ~wz}|{sfZZXTPMWPGQ^jl‰£¨­µ¹»²Œ˜œ¬¾¾¿¾¾½½¼½·¢rYcilppqttttrqpnkgjonoppmqvm\[`emzˆŠ‹ˆ…………………‚‚‚‚„ƒ~xurolkjlhhiiihhhhjou}‡Œ‹Š‹ˆ„‚‡”•’Ž‹‹Ž“””’‘’™£¢—ŽŒ‹Š‹ŒŠ^^]][YYWVSQOLJHDB?<;:987643322221100////../000//....//////------/.--,,,,,,,,,,****((((('&'(('&''&&&'((((((()**))**++++,,,,,-,,.-..00112222223456779:;<<===<<;;97777777776654446533332111000000////..//..--...--,.3PgYRXbeF#%$#$(.;EIF@?>>Hcpncekhkf8!$(1PopokG.,)&#" !!"#"!#(+-14679:<>?AEIJIA=>>:50/[yxsqtx|{~pV\^`h^,),,0:CDEOQSXSMQOCINMGFGEDCCDIIHGMNTUTUVXZ^_YTSQOOQOLHDHQVWX[fuztrsstuwr_[\``ago|‹ŒŒŠ‡„ƒ„€wdbdljbq‰ŒŽŒ’–™š™—”Ž‹‡ƒ}…Š‘Šˆ…„„ƒ{m^[^^^einrwz|ƒ‡ŠŒŒŒŒŒŒŠ‰ˆ…‚{ytquy|vvld[T^aFDl’š™§²·¸¸¹¾¦w™Œ‘»¾¾¿¾¾¾½²]RW^cgkloqtssrqqroloromkkloooaORV`t†ˆ‹ˆ……„………„‚‚‚ƒ„ƒ€}xtpmlkihhhiiihhhkpw€‰Œ‹Œ‹ˆ„ƒ‹’–“’ŽŒ‹ŒŒ“”•’‘‘’™ Ÿ—Œ‹‹‹ŒŠ^^]][ZYWTSQONJHEC@<;:976644310110000//.....0////..........----,,--++,-,,+++***))))('')''('''&&&&&&''''''((((()))(***,,++,,,,---.111122113333335556798:::::8:::888777666666544443333222221111000////.//.-..--.----/6[bRQWab9"##""',6BHGCBB?PgbXZ]gknZ("%-Ffmjf@+,'&#! !$%##"$(+-/336:<==>AFIKC??A<25`wrlstxz||u[Z]]dg:++,-.6=AGOTXfbWICDMLIGEB@ABBCGIGHJNSVWWYZZ]a]YUSRRSNMHDEMUXZ[fsvqswxvuvq`[^]`dgsˆ‘‰†„ƒƒ„ƒtbccii^j{‡ŒŽŽ’•™ššš—–’‘Œ‰‡†ŠŒ‹Šˆ‡‡……whZTX^bhkos{„†‰ŠŽŽŒ‹Œ‹Š‡‡ƒ‚~}zzzug\armnge^_qsIZ™¬±´¹»»½¾¼»µ¬¸°³¼¾¾¾¿¾º§uHEORX\`dkoppprrqsvvrrxtlgginrriRAMWoƒ‡‹ˆ…ƒ„„„„ƒƒ‚‚„ƒ†‚~zwrnllihhhhhhhhimqz„‹‹ŠŒ‹ˆ„…Ž”•“’‘‘ŽŒ‹ŒŽ•—•‘‘“› œ–ŽŠŠŠŒŒŒŠ^]]][ZYWUTQNLIGEDB=<:9766433211100..//.....0//..,,........----,,,,+++,++***)))))(('&'(''('&&&&&&&&'''''''''((((()***++++,,,,--./111122113333335556778899999888777666666666444443333222221111000/////00/...--.-,,+--=b\TUZ_W-!"!#"(2BJJHCBAX_OLOW_hkC#)9YhibA,*&$" !$$#!!#$'+-0369<==>ADHIGCA?8Lpvmmlpvvyzs_Y]\^eI)-,11059@HOWakhWJGJNNJEA@>>??BDFHILMOSVXYXZ[]^\XXWWTONJEDGQWYZervsvzyxuwr_XY\_dkxƒŽ‘Œ‰†ƒƒ‚„‚~qbacfg]h{‡ŽŽ’“˜™šš˜–•’‹ŒŒ‰‰‡‡†„~vh^WUajghov}„‰‹ŽŒŒ‹‰†„„}}ytonj]SIennpuhU\jLo¦´¸»½¿¿¾»´³·º»½¾¾¿¿½»°—dFKSQOQUZ^bgjmprqrruyyrswqppoqwvshKEYp„ˆ‹ƒ‚„ƒ„ƒƒƒƒ„…‡‚€|yupnlkhhhhhhhhimr{…‹Š‰ŒŠ‡„‰’••’‘‘‘ŒŒŒŽ‘––“‘‘’˜œ™Œ‹‹ŒŒŽŒŽŽŒŒŠ^^^^[ZZXVSQOMJJGEB@>;96664331111//.-----....--..,,--..---,,,-,,,++++++++***)**))))(''&&&&&%%%%%%%%$%'&''(('&''))((******+,,,.../00112111223334446655777787777777666666777766664333333322222211100000//..----,,,,,,+-GdWRU[cV,!"! "'0<MROKGKa]QJKMYnc.%1Rd`V?,&""""!!#%%##""$(),.2449:<>?ABAB>;H_tqljiputvvq`Y\]^f_)+/0325888?HXil_UMMPSUSME==<<<?CFHJLMMQSVYYYWX\[ZYXXTPNIECDMSW[ennpruvsuvng\X]_hs€’‘‹‹‰‡‡†…‡…oaaabeal{ŠŽ“•–™™š˜—”’‘ŽŽ‹Šˆˆ‡ƒ~vlb^_gossy}‚‡‹ŒŽŒŠˆ‰„}{wutskqo_YpsmklsjZX[Wuª¸º¼¾¾¼¸±ªµº¼¾¾½¾¿»´›rQKTTQMNNNSV\`dilooppsyƒvwwssmiprpoaBKp„‰ˆ€€‚‚ƒ„„„„‡ˆ…~{xusoljhhhggghjms~ˆ‹Œ‰Šˆ†‡••“ŽŒŒ‹Œ”•“‘Ž–˜”Œ‰ŠŒŽ‹‡ŒŠ[[[[[ZYWVSQOMJHEDB?=;97764331111//.-------------,,------,,,,,,+++++***))))))))))))'&&&&&&&%%%%%%%%$%'&''(('&''))((******+,,,.../00112111223334445555777787666667777666777765664333333322222211000000//..----,,,,)***0QfUPV\b[-!   &+9HQTMIQe\NNPSetK!$/NaYUK;'""""!!#%%$##"$')*,/14668;;;<;7Icrsmfgjopu{wmaZY\^`d@-,/02589736AR\UKHPRUUWZUL@=;::=?DGLLMMORVYYYXYZZXUUUSOLIDABHOVXbjjjlpsqsrke_YZ`o{‡”’‹‹‰‡‰‰‰‰†oaaaekiq…Ž’’“––—•”Œ‹‹‘‘‘ŽŒŠˆˆ‡ƒ€yrnjhny~……‰ŒŽŽŽ‹Šˆ‡„€}zwuvrrronpqrnoqmkhfYS_c|©·º½½»º¶¯¥°¸»½¾¿»¶©~UMRRQOLMNOOOQV[_cgkpqqrt||wqsxqj`mvxwn\ay„‰„}}€€‚„„„…ˆ†…ƒ€}{wtqmlhgggghhimu~ˆ‹‹ˆ‰ˆ‡‰‘•“‘ŽŒŒ‹‘”•‘’’›žš“‹‹ŒŠŠ‹ŒŠ†ŽŽŒŠZZZZZYYWTSQOMJHEDB?=;:9764322000//.-----------,,,,,,,,,,,,,,+**(++++))((((('''(((('&&&%%$$$$$$$$$$#$&&&&&&&&''(())))**++,,,,../000112222233323444466666677666667777666667766554333333333221110////////.-----,,++,,+()5_bSPU\fa2 "(*7CRTOJ[i[PKQZpk5 ,Jc]TMG*""""!"$%%&%#$$',+**.//1269841Owpmgdfimppwpmc\YZ]^`Q1//2258<;:8<=KE=;EQWVXZ\ZQF>;;;;=BFLNNMPPUZZYY[\YUQOOLKJHDCACKRW`gghjmompmdcb\ZdsŽ’’’Ž‹‹‰ˆ‹ŒŒŠ‰ƒsb`bhru}Œ‘Ž‘’“”“‘Œˆ„„‡‘’‘‘‘‹Š‰ˆ…{yxsrx„†‰‹ŽŽ‹‡ƒ€||zywsqpomppkjknpqmiejc^c_v¥µº¼¾¼º¹µ£¬­¸»¼¹±“eJLSRQQQPPOOOMMQTZ^agipqrtssusv{|tq}ƒˆ‰py€ƒ†}y||}~‚ƒƒ…†ˆ…„‚€}{wrpnjihfgggkoxˆŠ‰ˆˆˆˆŒ““Ž“––‘Ž—œ—ˆˆ‹Š‹Œ‰„€ŽŽŽ‹\\\\ZYXVUTQONKIFC@?=;:9764322000//------,,,,,,,,,,,,,,,,,,++***())**)()))))(((((((&&&&%%$$$$$$$$$$#$&&&&&&&&''(())))****++,,-./000112222233333565566666666666666777666667766554333333333221110///////../----,,++,,))'):d`USV_id4!"##$%+3>MSPSgnZNNSatX#(>afYMB*""""!"$%&'%&%%(0/*))**+++,.,NrqkhgkooopviXea\ZZYUX4..366679;78@?B;19EORPRUSQJD=999;=BFLNPRTTUWYZ[\\YRLKIIGHEDCAAFKT]ddehklkmj_`hd`hw‰’’‘ŽŠŠ‰ŠŒŒ‹ŒŠ†ub_dkv{‡‘ŽŽŽ‘‘Ž‹ˆ„~~ƒ‹‘’‘ŽŽ‹Š‹Šˆ…‚€~}€„‡‰‹ŒŽŽŽ‡~xuqmmrsppqonmlklonnncY`ed`ZU`ž´¹»º¸¸¸´®°©²º¸¬QLMRRRPOQPPNMMNLNQUY^chlnrqprvx†‡…zŠ‘’‰y…ƒzx{{{|}}€‚ƒ…†‡†…„€}{zwsomjhggghkpzƒˆŠˆˆˆ‡‰”“ŽŽ’••’ŽŽ“›œš‘‹‹‹‹‹Œ†}ŒŒŠYYYYYXWUSRPNLKIFFD?==:8764332000/.---,,,,,,,--,,--++,,++******((**))))))))(((((('&$&%%%%%%%%$$$$$$"#%%%%&&''&&(())))***+,,,--//00000123323444456666666555766666676666677666655543333333322221100//../...------++,++('''BkbTRW_hc8!#$$$()*6FQTXliYPTXhsA)3FOJ</%!!  !!"%&'&$(&(+/,('&(&$$!*Lrnmhhlmnmpr[Khf`\ZYQYL*.1699788:75786328DKMKKMMHEB>:88:>AELNQTWXVVXZ\]\XPMJLJFEGDEEDAFMW`abehiikfZ]ghjp}Ž‘‰‰‰‰ŒŒŠˆŠ‹…wd_fpz‘“’ŒŒ‹ŽŽ‹‰…‚}„Š’”’ŒŒŒŒ‹Šˆ„ƒ‚„ˆŠŒŽŽŠ„{voga\_chklpqroonllnmlU@MX_[H@YŒ°¶¹¶¯µ·«¯±­¶¶ª€NOQOQQSRRSQPNNLOONNSUX\bfimoqt|…Ž–•’‡’˜šˆ„ƒvvyzzzz{~€‚ƒ†‡…„ƒ‚€~zuqolkjihjls|…ˆŠ††‰ŠŒ“’Ž’••’“™žœ–ŽŠŠŠ‹‹‹Š„}|Œ‹‹‰YYYYYXWUSRPNLKIFFDA?<<8764332000.----,++++****++,,++**))))))))(())))(()(((''''&&&&&%%%%%%%%%$$$$$$#$%%%%&&''''(())))***+,,..-//00000122233454456666666556666666665666677666655543333333322221100//......----,,++,+++(%#)HmaYWW_ggC!$%&%%$'/;JP\teWUW_rj2,,()%# !!  !!#$')./,,(&+)('%$""$%WtmollnokmrrF>hle\XZPXW0+159:<<;>;55463.39DIHHFFEDBA>:88:<?DGLOSXYVVXZ[\XVPJKKHGFFFGGGFCIPX]`dgijjcX[cinw‰‘Œ‹‰‰‹Œ‹‡ˆ‹…yd_ft‡’’‘Ž‹‹Š‰‰†ˆŠŠ‰„€}|†””Œ‹‹‹ŒŒŠ‹‰‰ˆ‡ˆˆˆ‰ŽŽŽŒ‡‚}uhXLIORT\`bcfmpoonnjeN=R_^V>3Np¥´¶¯‹˜°—¦²°± ˜oMOT]WSTXWURQQPOOOOOPQUX[`hq}ˆ“š¡¢ž™™—•ŽŠ…wuyzzzz{|~€……ƒ‚ƒ‚~~}xvtpnkihilt€‡Šˆ……†‰”•’Ž“•”‘Ž•žŸš‘‰ŠŒŒˆ‚w}‹ŽŒŠˆWWXXWWUTTSPNMKHEEA?=<;98532220//-,---,+*++++++++****)))))*))))))(((('''((('''&&&%%%%$$$$$$%%$$$$$$%%%%%%&&''(((((()))*++,,,--/////00122244455566666666666555555556566556666666433333332221/111//00......,,,,++,,+,*,,(%%*KmbXVW]diK##$$$$"! &2?FkwcXWUevP#''%#"! !!! !##%.9@<:/(++)&%#"#!=spklonmposk:+`kid\[UK[A)/49::=@@=86542-149@DDA=?ABAB?<:98;=BEJLQVVTTVXYZVTOJKLKHHHHJKJHDDIMV^ceefheWXdmt€‘ŽŒŠ‰‰Š‹ŽŽ‰‡‡Š†}h_jvŒ’ŽŠ‰‡…ƒƒ‚…ŠŒ‡„|‚ˆ”‘Š‰‰ˆ‹‹‹ŠŒŠ‰ŠŠŽŽŽŽŽŒ‰†zm[N\a\]^^ZZXY`ejmmmeWG=GJKNB?M^•¯²”R‡¤}š³·ª…v\MNRXQTYa]TUVVTQPRRPNOPR]n~œ¢£¢ ›Ÿ£Ÿšš˜’Œ‰Šˆ‡ƒ~xvxxzz{{z|~…„€~}{wutrollknyˆ‹ˆ†…‡Š‘””ŽŽŒŒŽ‘••‘Ž’šž•‹ŠŠ‹Œ†}rx†‹‰†WWWWUUTTRQPNLJHEDA?=<;98652220//-,,--+*+************))))))))))))(''''''(((((&&&&%%%%$$$$$$$$$$$$$$%%%%%%&&''(((((()))*++,,,--///11001222444555666666666655555555565665566666664333333322210011////....--,,,,+++++++,,)&#(/Mm`VUX^fl[&"$%#" !)3HlqbWVZhp2&#$#!! !!! !$"(.3782/++-*'%#"#-hnkjjmpllta.5_kigc`bJ[Q++<>;:=?D>7559830258<@=:7:>>>?>=:97:<?DIMOSSQQSUVWTRNJKKKKIGJMMLIFACIOW\acffcYZepz‡ŽŽ‹ˆˆˆŠŽŒ‰ˆ‡‰„}h_ly…‘‹ˆ†„~|xy~„‡‡‡…ƒ‰Ž‘‹ˆ‡‡ˆŠ‹‹‹‹‹‹Œ‹‰‡…~wod[mm[RWVY`\XXY^dffc\UF51GQORZ]z¢ªŽ_”‰sŸ²µ¨vVIILOOOSVVROTUTUTRQQRQNMa~–¥«°¯ª§¡œžžœœœ˜“’‡€ywxxzz{{{{|}‚ƒ€€€€€~~|zywtromnqzƒˆ‰ˆ††‰”•”ŽŽŒ’””‘’˜œž™‘‹‰ˆ‰‹‰€voxˆŒŠˆ„VVVVTTTRQONLJHGECAA><:87543320//-,++++**********))))))))((((((((''''''''''''&&&%%%$$$###""$#$$$$$$%%%%&'''''((((()))**++,--.-.000022223433555666666666665555556666666666666666443322111111000/0.//.-..-,++++++)))*,--+)%$'-MobUTW]dl_4!$#"! !%*Epn`YY`rU#%"""!     "$(-/2761,-./,)%$""XvmggllmukO3Cahjjhd^L\[5.:@?@@BB>835:@B<4379976567::<><<::78;>CIOQQQONOQTUSQLLKKLLKKMNNNLGDABFOT\acec\[iv‚‰‹ŽŒŠ‡…††ˆŠ‰†ˆˆˆˆ„~jbp{‡‹ˆ„‚€|wqosy|€ƒ†‡„‡‰Œ‹ˆ‡ˆ‡ˆŠŠŠŠŠ‹’’Œˆˆ…‚€xsssrqigjhiicWPQW[ZVTUUOCCTSVY]get¤€™‰…£¯¯¦|WJHIMLLRUQOPPRUWWUQRTOTfˆ¦²¹¼º¸°©¥››ž  ¡Ÿœ™™•‡{v{zzz{{{zy|~‚}}~~}}||ywrqppu}„Š‰…ƒ‡ŠŽ•”’Ž’“Ž‘–š›˜“‰ŠˆŠŒŒ†{rnw…‰Šˆ…UUTTSSSPPNLKIGEDBA@=<;7574331///-,++++**********))))))))((((((((''''''''''&&%%%%%%$$$###""##$$$$$$%%%%&'''''((((())**+++,-....00002222344445666666666666555555666666666666664444332211111100///.//.-..,,++++++*)()+++*(&(+./PndXTWZ^ffC""   !Gwm^VZeq:!##"!     #&-2111,+,-12.*'$#<sjjgikpt_<;ZegjfggaMV_F29E?DCEC<;756>FEA955564332599;;<<;:99<AEJPRTRMLMOPQQMLKKKLLNNOOOOMGDA@BGKRYaec[^o|ˆ‹ŠŒŠ‡……†„…„‚€†††‡ƒ|jcq~ŒŠ†ƒ~ypggmsv{~‚……‰‰Œ‹‹‹ˆ‰‡ˆ‡‡‰‰ŠŒŽŽ‹‡…‚€~vrpppqstqoc]aSEEPWTNHINPMKQQPTSfa`‘”|¥¨©¬ªŸmLHHMNMMNPPSTTSRSTRQQPUnª·»½¿¼ºµ­¨žžŸžž ¤£ŸŸ¡ ™|u{{zz{{yyzy}€{{|}~~}}}}{zwtrrx€‡Šˆƒ„‰Œ‘•“ŒŒŒ‹Œ’“”˜š˜”‹‰‰‰ŠŒŠ„xnmx†‡ˆˆ…TTRRSQPOONLIHFDCA?><;:866532100/-,,+++*)****))))((((((((((((((((''''''&&%%%%%%$$$$$%$#########$$$$%%$%%&'''''()))))**++,,-.-./0101223345554555557766666656665566666655555555444433221111100/..--/.-,--,+++****)((**+-,)'+,.0/HkcVSTX]_fQ/!!#Uzg][^j`%"# "! !! #(*,*++),,-461,(%2lnffjijp]<HgfaabcccWRVI65=;=C??=97532:BDB<543230312589;=>=;:<@DJMPSVURPONNMLKKKLLMNNPQPOOMHFCA@@CHRZaa`fxƒŠ‹‰‰†„„‚„‚|y{„‡…„€{jes‚ŽŒ‡ƒ‚€~vl`_dkosw|‚…‡Š‰‰ŠŠ‰‰‡††ˆ‰‰Š‹ŒŠŒŒŒŒŠŒŒ‡„}|zwtqqqpqqn\9489<DINMKKKMIJFMRRPlljŠ˜‰Œ §¨©¨UFGHJJILLOKKPOMMOPPQOXw™­¸»½¾¾¾¾¼´­¤Ÿ Ÿ¤ œ ¦¥ž—„vz|{zzzzyxy|~€wwy}}|}}}}}||yxtrz‚‰‰†„†ˆ––“ŽŒŒŒŒŒŽ‘”’•˜›™–‹Š‰‰Š‹‹†}uonz‡ˆˆ‡…RRQQPOONMMKHFECBA?=<;976653210/.-,,,++*)****))))((((((((((((((((''''''&&%%%%&&%%$$$$##########$$$$%%$%%&''&&'())))**+++,,-.../0101223345555555557766666656665566666655555555554433221111000/.---..-,++*)))))''*)))*+-,)),,-013Egj]TRSY^dbF$!!!"'fxb[]`nJ""!   !&(*++***--.120,,/cpjedhkn_M`jhdaacb[_[J?47899;<:97565108ABB=6310//012237:;=>>=?DHKMPRTSSQPNMKKKKKLLNPPQTSPOLIFCB@>?@GQU[bm|†ŠŠ‰‡„ƒ‚‚‚}vqu‡…„€{jiv…Šƒ‚€~}xma]`eimqv}„„†‰‰‡‡ˆ‡††††††‡‰Š‹‰ˆ††‡ˆˆ‡‰ˆ„~|{zwvtpqqpqnM)5688<CDJPSOKHKMVZZV^_l„’˜™ž¨ª§¤wDHIIKJILLMJJLKJLMLMMTsœ¯¸¼¼¾¾¾¾¾¼¹³­¤ Ÿš™˜›ž¥¥¡›‹|z}{z}|zzxx{}vsuwz{|}}||||{ywtz‚‰‰†„†ˆ–“‘ŽŒŒ‹‹‘‘“—›š–ŒŠˆ‡‰Œ‰‚yqon{‡ˆˆ‡…QQPPOOMMMKHFECBAA?;;986654320///-,-+,,****))))((((((((((((((''''((''&&&&%%%%%%$$$$$$##########$$$$%%%%$%'''''()))***++,,-,-./01123223455555555445577666666665555555555555544333333111100////...-,,,+,,++****))))())-/0.+*+/3477Bcn^SQSU]cj[1   $$3lrb^[am0 "!""$(*,*,+++./012/,.`oghgijphdjkhe``acb]VH8205768>@<84364107AFDB:430.013454679<>AABEFHKNOOQSRPNLJIIKKMMOPSSUSPNLIFDD@AA>AEKTar„‰‰‰ˆ†„€€€znkv€ˆˆ„€yjjw…Œ‹‡‚€}zvkd_^_ehmsy€…††ˆˆ‡‡„„‡…………………‡†ƒ|}~~‚‚„††~}zywvuutuvkR/.:<>CGKGGHOPQXXV\`aeidm‹—“œ§©¦ mAFJILKJIJIJJJJJJIKJSl–®·¼½¾¾¾¾¾¾¾¾¹µ®¥£¡š™™˜˜££Ÿ•„z~}{{{{yzxxz~sptuww|{|~~~}}{yv{ƒ‰‰…‚‡Œ‘•”‘Ž‹ŠŠ‹Œ’‘‘“–™™•‘Š‰ˆ‰Š‹Œˆuoon{…ˆˆ‡†OONNMMLLLJGFDB@@@=;::76643220///-,++,,****))))((((((((((((((''''((''&&&&%%%%%%$$$$$$##########$$$$%%%%%''''''()))**++,,,,-..001132223455555555555566666666665555555555555544333333111100/.....--,,,+++**))))))(()))-/21/-.147:=>>UjeXSRVX_ihN%  %((;qr]_akb "!!!$(*,,.---./0110,UrfcdhkpnjhgefdaabcdfY51333459AGC94451104>EFA:51/.013566779<>BBCEFJJLLLNOQSOMLIIJJLMPRTTUSOMJHFDCAAA@>?BO[pƒŠŠˆ…‚€~zqhlt‚‡‡†ymlx…‰‰„|{|vkb_\[_`fmu~ˆ‡„††‡‡„„…„……„„……ƒ€{vqpqou|~‚…‚~|{|{{{yxy{wgJ@AFP[^XKMX\]^\Zadefkkc{”‹›§§¥™cCHJIJKJIHHIIJJHHIIOfª·º¾¾½¾¾¾¾¾¾¾¾º¶«§£¡›™™š–—Ÿ¢¢œŽ€{{|{{{zxxy{}nlnqttxy{|}|||{zy{ƒŠˆ„ƒŠŽ••“ŽŽŽŠ‰Š‹Œ‘’“——˜–‘ŒŠ‰‡Š‰Š‹Š„}uoon}†‰‰‡†LLLKKKIIJGDBCA@>>;:87755421000/...,+,,****))))(((((((((())((''''''''&&'&&&&%%%%%$$$$########$$$$$$%%%&''((''()*****++,,---//0012433334455555665555555555666655555555555444333333221110///..--,--**++**)(((''''(((()-1442/236:<BEA>Idm\SQQUZfma9"%',,Htjc``pF! "!%&+-/20..000221LrhbcejppigdddddcefdjbE1255348:DX]93332103:EKF;53.,/13567879;>BCDFFIGJJKLNORRRNKIHHJJMOSTURMKIGDCB@@@A@@?FSiz„‡…‚~}|ujcivƒŠˆ†‚yomy…ˆ†‚~||zufefed^^ait€ˆ‡………††„„„„„…ƒ…ƒ‚€zvmbaees{|}‚€|}€‚€~~yphdehiidW[`a``bcfgjkohbl‹–Ÿ§©¤SCFKKIJIHFGGGHJGGHI]„£²¹¼½¾¾¾¾¾¾¾¾¾¾½¸³­¥Ÿ›š˜–•‘“—™™”…zyzz{zyxxyy~pjllqrtvy|~|z|||z}ƒˆ‡„„Š–”ŽŠ‰Š‹Ž’’”˜š™˜“Œ‹Š‰ˆ‰Œ‹‹‹‡|tnon|ˆ‰‰ˆ‡KKKIJJHHGHFDBA?=<::877663210000.--,+,,****))))(((((((((())((''''''''&&'&&&&%%%%%$$##########$$$$$$%%%&''(())))****++,,,---/00112433334455555665555555555666655555555555444333333221110///.---,,+**))**)(((''''''(()-167524:<>BFJBC@?VkbWQPS[_gn^4$+,-.Oxj__`l4 "$&&)-1232244441IsmfffinphedddddeegddYC7534437;?CLN723322128CHF=830../0156669;<@BDFFGFGHHIMPPQNLKIHHHHJNPSTPMKIGDCA?@@CDCAAHYjt|€€~}|~|wnbbkw„Š‰ˆ„{omy„‡ƒ}z||yulhjhe`^^iv…‹Šˆ„„„„„„„„„„†…ƒ€}woeWNQXmvy{}€~ƒ†‡†ˆˆ‡}wqssqnjdW_a`__`eeghlogcg{•ž¥¥£‡JEKJIHFHGGGGGGGIHFLnš¯¸¼¿¾¾¾¾¾¾¾¾¾¾¾½»´¬¦¡™•‘‰…„‹…{yzyyzzyyz{€qjggnqpsvxz|z{{}{~…ˆ‡ƒ…’•’ŒŠŠ‹Œ”—˜š™—’ŒŠ‰‰ˆ‰‹‹‹‹Š†ytnno}‡‰‰‰ˆIIIIHHGEDDCBB@?><;98866543000//-.--,,+*)))**))((((((''))))))))))((''''&&%%%%%%%%$$$$$$$$$$%%%%$$%%&&%&'())**))*,++,,....///011223344446456666666666666664455545564444433422222221100//...-,,++*)))))''&&''(('&%%&')+16:976>?BHLMJIC?<PbeZRRUX\_inR1)))))SsbZ`j[ "$$&***.024545775=ikhhkklqgdeghhcdeih^G@B332227FD@732121111466:@C<;6..//1234569;<=ACDEFFGEGHILNNMMKIHHGGILNPROLJIGEDC@@@BDDDDEIS`ktxz{{|vqh^`jw„‹ŠŠ†}on{ƒƒƒ|{{{|{skjjhebcn~Š†ƒ‚‚ƒƒƒ‚„…ƒztf^MCDVmswz|~}~‚„‡‹ŒŽŽŠˆtppmmcX\___`abdfgeckgdiu ¤ ‚G?GIKIFFFFFFFHEGFFZˆ¨·¼¾¾¾¾¾¾¾¾¾¾¾¾¾½¹²¬§¤ ˜”‰…‚†‰zyyxxxxzzz{qgehhmoou{|}}{{{z~„ˆ‡ƒŠ’–•‘ŽŒŒŒ‹‹Ž‘•˜™š—“‹Š‰‰ˆ‰Š‹‹‹‡}yrnmn€†‹Œ‹‹GGGGEEEDCCA@@?=<:987755443000//----,,+*)))**))(((((((())))))))))((''''&&%%%%%%%%$$$$$$$$$$%%%%$$%%&&%&'())**))*,+,,-....//011122334444566666666666666644445554334544443334222222100//..---,++*))))((''&&&&''&&%%&'(*/7<=;8<BHJLLJIED?=GXje[XXXY[bhfR*"()(Ztd]blL&$&**+-0378:;987fjgikjophcfggghfgilWA?B7353337CKE731///0124699799951.././025789;<>ABCEEEEEDGGHHIIHHFFGGGJOQROLJHFEDC@@@@CEEEEGHP[dmty{wqfb^_ky†‹‰‹…{oo{€€|{{{{}}ypoljiffq‰…‚€€‚ƒƒƒ…„‚}ztgZTKHPctvvy{}~‚„‡‹ŽŽŽ‹‰wponj[_`a``cacefgc^efhnq†šŸF@FGHGHEEEEEFEEDFOtž²º½¾¾¾¾¾¾¾¾¾¾¾¾¾½¹²¬§£Ÿ˜“Š…„…†‹‹„{yyyyyyyywy}rgeggjnnsvyz|{{{z…ˆ‡…”•“ŽŒŒŒŒ‹‹Ž“–˜—•‘ŠŠŠ‰‰ˆ‰ŠŒŒ‰†|xpmls‚ŠŽŽŽŽEEEEDDBA@@A@><;::876745422100/...-,,,,+*******))))))))******))))((''((&&&&%%&&%%%%$$%%%%%%%%%%%%&&''''()))*****,,,+,././/111111233443444555555556655554345555334443333332333111111//....-,++**)()(('''&%'%&&&&%%%%&*19?BB==FKKLJJHEB??A;I`jdYYYWY]`kgA&&&(bvdbdj:!(+*,--145688?jkgiigltkdfghhiill_H:BE>3153016A[R520/..01348<:966642-,---/04798;==?AABBCCDCCCCCCCDEDEFFGGJKNQLIGFEECA@?@CDGGFFIGMV_gosqgSX_bn{ˆŠ‰‰„|qp{~|{yxyy}}tonnkilv…’‡ƒ~€€‚ƒƒ‚‚€~ysha[WQQZhsuwxz}€‚„‡ŠŽŽ‰wpljb]`abbbacdfgd^Ydfemrz‘šžšx@BFEDHGGECDFDDCEJd’¬¸º½¾¾¾¾¾¾¾¾¾¾¾¾½¼¶²¬§¢›–‡„‚ƒ…‰‡}{{zzyxxwvw}sddgefkloswx{{{{z‡ˆ†ˆ””’‹‹‹‹”–—”“‰‰ˆˆ†‡†ŠŒŒ‹†€{yutw~ˆŽ‘‘BBBBBBAA@@@?<;::9765554322210/...-**+++*******))))))))******))))))((((&&&&%%&&%%%%$$%%%%%%%%%%%%&&''''))))*****,,,,,//.//111111134443455555555556655554445554334443333222233211110/..-.-,,+**)((((('&&%%%$%%%%%%&'(+/:BGHC=FNOPNJJEB?=<:69Mhi]XVTUY]ciV2!$,`vccbg1"*,0321378<8=iqjhjhiolfgjjgjnn[B9:?DI;3442016?PI30////276769<<9853/++,,--/159:;==>@@@@>?A@??=>>@?AACDDDDEHJJIHFDEECA@?@CDEFGFHGGJOX`fcVIO^en|‰Š‹Š…|pqz}~}yyzzz|€wtqonlnyˆ’†~~€ƒ„ƒ‚€~{xriea[WW]isuwwz}„…ˆŒŽŽŽ‰‚xpgc``abccccdfffa]]hhhkru€•ž›u<BEFIGFGDCDECCBEWƒ¥´»½½¾¾¾¾¾¾¾¾¾¾¾¾¾º¶²®©¢™–‘ˆ„‚~}{~…~{{zz{zxwvw}wgefgejlopsuy{{}|‡‡…Š’””’‹‹‹‹’”––‘Œ‰‰‰‰ˆ†‡‡ŠŒ‹‰ƒ€ƒ‡‰Œ‘“‘@@AA@@??=>><::998744343322110/..++,+,++)))******++****++++++******('(('&&&&&&&&&&&%%%&&&%%%%%%&&&&&&''')******++,---.///0011202224445566666655555555555545543333333333222122111000..----,+**)))((('&&%%%&%$$$$$%$&&*.8ELPIDGRTVRMIDA><<992.8VebWUSVX\^ggK+'craeh]'*,27=CKLI@IjsmjmiipnfhiikngZL;9:=?@;642200467;71/11/037:97:@A=:53/++,----/2669;;<?=;;:;=><;;=>>??@ACCBADFFGGFDCBB@?@?@BCCDDEEEFEGJQUQJEGWfs~ˆˆˆ‡ƒympw{}{zyyyz|€„~wqqoor}‹“Œ…€z{z~ƒ…ƒ‚~|}}}|uqmida`cbisvww{|ƒ„†ˆ‹ŽŽŽŠ‚ypebbcdccccccfdcc]^ijjmrstŒ›˜r>AEDECCEDDDEDBDKm™®¶º½¾¾¾¾¾¾¾¾¾¾¾¾¾¾º¸µ®« •‘ŽŒŠ…ƒ~zy~~{zzzyxxwvu|zhehgdejnnqtvy|}|ˆ††Ž’‘“ŽŒŒ‹‹ŒŒ“–”‘Œˆ‹‹Œ‹‡ˆŠ‹‰…„††‡‰‹‘‘”““@@@@????<<;:99887666533322110/..,+++++*)))******++****++++++****))*((('&&&&&&&&&&&&&&&&&%%%%&&'''''''()*))++++,,,--..//0001111222344556666665555555555553454333333333322122211100/.--,-,++*))(((('&&&%$$&&$$%&$#$$&)-8EOTRMKSXVSOKGC?;:732/.,=XgaYTSVX[`gbB&$^oaeeV:85=@ILQXcrrlmljkppjiklojSEFGHCABA>84420//36763.-.11149=;7;BD@=71/+,,----/14678:;=:889<<<;;;:::===>?ABCCDDEDCA@@@AA??@@AABBBBDCDDCDEFDEEShuƒ‡†‡…€tmqxxzzzyyyz{|‰ŒxurqqwŒ’‹…€{zy{~‚„ƒ‚~ywxzyzwxpnlmmlhmtwwx{}‚…††‡ˆ‹Š‡unjfbfeddcccccdb`_floljpxyŽ“oCBGDEDACDDDEDBCW…¦³·¼¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½¹¸²« ™•–•”‘ŽŠ…~vuyyyzzyxwwuvyzgeedefiklnrvy}}|„ˆ†ˆ“’‘‘ŒŒ‹‹ŒŒ‘’‘ŒˆˆŠ‘––’Ž‹Š‹ŠˆŒ’’’‘’‘“‘‘’’????>>==>;;;9788767643321100.-..++++*+++********++****,,,,,,,,+**,+(**((&&''''''''''''((''&%&'''(()))))***+,,,....../0/00010022223445555666655665566554444443333332122221101000/..--,,+++*))((('''&&&%$$$&$#####$#$&+6ALVZVQSXYXTNKHD?<8310./,,Dah^VTTTX_chcE,^i]chP+7<ET]djosjjlmmppllmmgP<BMQOHILIA:5432.-055540/,+253389989@DCB<51---,,.//134468898777;::98989::9;=<=@ABDABBB@?@@>>????@@AAAAABBBCCCBBBETiv€‚‚{oiovvwxxxyzuuv‡’€yvtrx‚ŒŠƒ{xxx|‚„…ƒxpptwuwvusrsutqlktwxx{…†…†‡ˆˆ…}uspkfcefffdccbc`[]cgkqnoru{‰ˆpFCCEEEBABCDEFCJj—¬µ»¼¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾½»¹³¨£¢  ¡œ–“Œvuwxyzzywwwvxz}heecfdghknrvy}{}…††‰”“’ŽŒŒ‹‹‹’‘ŽŒŠˆˆ‹–›š—•‘Ž‘“•–”““’’’‘‘’‘’<<<<<<;;<9888755656532211100.---++++************++***+,,,,,,,,,,+**)((((''''''''''''''((''''''''(()))))*+++,,,.../../0000010022223445555666655665566554444443333332122111100000/.--,,++***)(('''''&%%%$$$$$$#####$$%)0:FQYXQQXYXXSOLHD?;752/.-/*1HeiYSSVXY\dibVjqcdbJ8K_eggntlhjlmppkml]=-5I[]TOMEGG=74230/,0:=621.--03668::89>AEB@93/--,,-.0222455567778989:988888889;;=?@ABBBB?>??>>>>>>?@@AAA???@AAB@BAJ[ky{{|}yrkipttvwwwyxrgl€“zxvsy‚ŒŽˆƒ|yyy|ƒ…†„xoimmopsvvuuwvutpmrwz{„……††‡‡„ytpnijgffecccca]Z]cgmuuuomp†ˆpLDDDEDACCCDDEFV€£²¸»½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¼»¸¶µ±ª¦£›”Žƒzuwxyzzywwwwwz}hedcdeghimqtz|{}„…†‰“”“’ŽŽŒŒ‹‹‹ŠŠˆˆ‹˜œ™˜–•–––———•”““““’’’‘Œ<<;;;;::998876776655211100..-,++**************++**++--,,------,,,+****))((('''((((((((((((''(((())))))*+,,+,----..////00011102222344445556665555555555444444333311110000000////.--,-,++***))(('''&&%$#$$##"#""""###$&-6CMSTPNUZ[[YTMIGB?<732/+,,,+3Ui_ZWWWYYZbjqutponligeblrjhgjnqrnj\>")3G]_ZRMB8EE;5220/./7HL<31//..3789;867<BFCA<71/-,,-/1324435555666668777799887788;=>?@@???>?>=<====>?@AAA@@>>>@@?BIWcrzwvzyqj^blqsuuvwwwqcWn˜‚}yx{„Œ‹†‚}zz{|€„…ˆ‡ƒ|sb_dghlnpsuxxvtstttuz~ƒ„………‡‡‡ƒ{wxusoigfedcbb_^Z^fmtwvupliv†pQGFFFDCBCDEEAJd’ª´¹½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾»°«¦Ž„zuwyzyyywwwvwz}lccdddfhjmrs{z|~…††‹“–’‘ŽŒ‹‹‹‘Ž‹ŠŠ‹Ž”—œššš˜š™™—˜—–•”““”••’“‡::::;;::99776666554431110/..-,++,,************++**++----......,,++++++)))((((())))))))))))))(((())))))*+,,,,------////000111022223444455566655555555555444443333111100000////....-,+++***))(('''&&%%$$####""!!""""!#$)3>GLIFIOY\^]XQNLGC?:74/+*)+(*+<Ye_UZUVWZaefjjjgefb`jspihkntwo\8'-6/Ifg`]WO76JC851///..2:9421.0111567;857=BEEC=82.+,,-/024543444445554566779988777788;<==??>===<<====>?AAAA??>?>>?AIT_mwvtvupeXOUafkoqtuywn[;2m–‹}{~„Œ‹†‚}zz|‚†‡ˆ‡†‚xiYY]`dfglrvwwvvuutwz|‚ƒƒ„……†ƒ~zyzuromgddcb__^]ajsywvupmko~YDGFEBBBCDEEANs›¬¶¹¼½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½¾¾¾¾½µ¬ xnpsuwwyyyywwwvwz}kccbddfhjmqtz||~„…‡““’‘ŽŒ‹‹‹Ž‘‹Š‹Ž’“•–šš›™ššš™™˜—–••““’‘‘ŽŠ…€{99:::9::8888666644442011/..--,++****)))***+++,,+++,,--........-,+,+*++))**)))))()'((((((**))))(((()*++++,,--..--..//0000001101222233334555666655554455333444222211110.//00//--...-,++**)))((''&&&%%$#"##""""!!!!!!""#'09CEA?BMWZ__^WUPKGC?90('('&&&'#*C[_YWSRUWY\`bccdcclwqiglptyh?!#((9Neidcc[L42A9420//.,-/1/011/15412579888=EGFD@;50,++../1344433333344456677667755557788:;>>=<<<<<<==<?@@@AA@@><==AES_isvrrqldUB>FPX\bgmstthYVLfŽ†€‚‡ŒŠ†‚~~}„‡ˆ‰‡‰ˆq_QSUZ]`fjrttuuwvvyyz}‚„„„„ƒƒ~||zuupkhfda_][\eipsussnjigr|cGFFFDBCCDCDBR~ ­¶º½½¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½¾¾¾¾½µ¥Žscdeinsxyzzyxwvwwy~ncbbdfegjlou{|}‚…ˆ•”“ŽŒ‹‰‰Ž‹Š‹Ž’•—™™šœ›šš™šš˜˜––”’’Œˆ…€yumd99::99998888655532222000...--,++))++**)*+++++,,+,,,,---........,--,+,,+*++***)))*(**))))**))**))))*+++++,,--..--..//0000001112332222333455444455554444333444222211110.//....----++++**)))((''&&&%%$$##""!!!!!!!!!!""#'-8BGD>BHPW]`_^\ZTNKE?.'&&%((('&$$(@]bTOTWWZ^_acedluspkorvxe;%&(&'=]iiec_UI,+86310/.-*+,./00002672236::89>BDEEA<61,++...0133333222244444456466655555677:;<==9::;;;<=<?@?@??C@>==?GRZgrtqtrkcU>029?DIQZ`fmnh_ehr‚‘‹„‚‚ŠŽŠ†„‚€€„‡ˆˆŠˆˆŠ…zmVMOPTW]dkpqsttvwxyz|}}~€€‚„„„‚}|yttnjgc`^^\ajpppqqqmihfiroPLJJEBBBBABEU…£°·»½½¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾½¼¼¼¾½¼¹©ˆhY_dehhkqxyyyywvvvy~sfccgiijlnqv|}~€‚…‰Ž’‘’ŽŒ‹‰‰Ž‹ŠŠŽ‘”˜™›››™™˜˜–————–•“‰ƒ~ztldYQP8899997788875555322220/....--,++++++***++++++,----............--..-+,,,++++*))****))****+)***+*(*++,++++,,--..--..//0000/1111222223322333345445555334433453222220011/././....-,,,++**))((((&&&%%&%$##"""!!!!!!!!! !"#&+4AFFDGIOUZ_bca_\WSM>.))%$$$&(*((($*G]]UY]`acchhmsplkmqswkN4,+&'*C^ibWRYSJ-(76000/--*,0/11121389757:<><;;@CEEB?;50,+,,-.0112332200223344444444554234679;<;978888:;<>==??BBBA?<>CP[fqussng_R@2//0369@FOW_b`[^V]tŽ†„„‡‹‰……„„„„„†‡ˆˆ‰ˆˆˆŠ†ylVJHJLR[gnnoprtwyxx{}~~~€ƒ‚ƒ€~{xvrnjd`^[]ehjmpqonligddfkWTPICBABBBAEX‡¤°¶º¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¾½¼»ºº½½»·­…\PW]`dghijrwxxxvvwx|€yqprssssttw}~‚†Š‘’‘ŽŒŒ‹ŠŠ‹Š‹“—˜˜š™š™˜•”’‘‘ŽŒˆ€wpg`XNGDHN8888887788755555322220/....--,++++++***++++++,----......//////....-.,,,,,+++**++++**++**+,***+++*++,++++,,--..--..//000000111222223322333333443333554433330002220000../....---,+++**))(')&'&&%%%$$##""!!       !!  !#&+4?HJJKNPSZ_eeffb^XM4)+(&$%'&&+-..+&%*:KWgljkmnkurmmosuwlSI52<=12LcdZSLMMG0%65/00.---/201212369=;988;<==>@?@B@?=92.,,,-.0112332210113344443333444233568:;989888879:;;;<=@ABA?=@NYcopqsoh\N<.-,-/00047:CINPWYRZi‹†……‡ˆ†…ƒƒ‚‚ƒƒ†‡ŠŠŠ‰ˆ‡‰Š‡~o[HDEHQcikkmprxywwy{{{|}}~~‚ƒ‚}{yurnje[PT\efgnonnligddb`XRPFDBBAAABDXˆ¥±·¹¼¾½¾¾¾¾¾¾¾¾¾¾¾¾¾¼º¸·»»½¹±•\EPY\^bfgihltxyyzz|‚…‚‚‚‚€~~~~€‚‚†ŒŽ‘ŒŒ‹ŠŠŒŒ’–——˜˜™™—•“ŒŠˆ†„ysg_VNEEFJLPS88777777765555553222200///.--,,,,,++++*,,,,,,,..--//....00////......--..,,,,+++*++++****,,++++,,**,,,,+-,,--..--..//000000011112222222343333333333333333320.0111000/......--,,+++**))(&&''&&%%$$$##""!!!  !!  !!  !"%+3=EILOQQT[`fkjfdc[H1,/,()))')*,,-/.01128AQX`cfrroortuteQPO;;HOJO[`XURKKOF1$3500/-.-16855324469?>=;;<@@BA><?B@@=;4/----/1122222222222244321122332121156775677777888899::<=?@=@HWanqqrog\P>0.-,--//011248<BHIKPXj~|y|~€€€‚††‡‰‰Š‹‰‡†‰‹Œ‰s\HBCJ[cffhmryywwyzzzzz{|~~~{zwusole_ahd_dmoonlhfbaa_[NNHFCBBBB>DY‰¦°·¹»½½¾¾¾¾¾¾¾¾¾¾¾¾¼»¹¶µ·º»¹­‚FEOV\^`ddgiiow{{|…‡‡ŠŠ‹‹ŠŠ‰‡†„„††…„ƒƒ‡ŒŽ‘ŽŒŒŒŒŠ‰‹‘”•—–•–——–”Ž‰…}xuqncVLFBA@CHMMPT77777768765555553222200///.---,,,,++*)*,++,,--....--..//00////..----....----,+++,,**++++,,++++,,,,,,,,+--,--..--..//00000001110122222233333333332233333333210011//......----++++))))(''&'&&%%$$$##""!!    !!  !!  !#(.6>EIKPSTW_djnliebV>.-,***--(**,,,**-.0110..((drllkhim`ILNPDCNRQY^ZY][UUTR<'/6830.--17=<:63335;@AACA?@BBA<:<>==<:51.---/11112222222222331111113321//112443345555667799::<=>?>FP]krnolf\N=0.,,,,-////00101359;>AK`f`dhkpqsvz}ƒ……‡‰‰‹‰‰†„‡ŠŒŒ„vcG?HWcfdekpzyvwyz{yxxxz{|}~}|€|zvsrooplknkkoooljhfbab`\KLOGCBBBBABV„£®¶¹¼½¾¾¾¾¾¾¾¾¾¾¾¾¾¼º¸³¯µ»»·§pHLQY\^bdgjjjms{„‡‹ŽŽ‹ˆ‡‡‡‡††…„ˆŒŽŽŽŽŒŒŒŒŠ‰‹‘“”“•““”“ŽŒ†uld`ZOE@<=>A@CHLNOR77777777665544333222201000/...-,------............11110000000000--..-.0...--..----,,,,,,,,--,,,,,,,,--,.....-...000000000.11110022221111345433222222221111110.00--------,,+,++****))((((&%&%%%$$##! !!           "$*08@EHKPSVZbfkonie^O0*)))**-1,,,,--*%#$',0016.Zvjjkolh\UJIJIEKROX]a`aaZX_^ZK/)4A@5.-0:ACB<64469;?CDEHDBABC<78999:8840--,.00111122112222221000002211//01001122444466668989;===@JVdnlnje[M;3/,+,,--..//00//00221236@EEIMSU[achotyz€†…ˆ‰†„……‡Š‡yeIGVdeacisyyvvyyzywtqvwz|}}}~}}{yvsrnnoonmlmnjggebaab]OKSPDBDCBCDRw›®¶º¼½¼½½½¾¾¾¾¾¾¿¿¼»»µ«­´¸·®šo_cdddgjjkmnnry}…‡‰‘‘ŽŒ‹†‡†……†„…‰‹Œ‹‹Œ‹ŠŒŽŒ‘‘“Œ‰…€vkaUME>98:;<>@@DFILLL77777777665544333222201000/.....------....,,...../11110000000000/...-.0.......----,,,,,,,,--,,,,,,------....-...000000000.//00//11111111233133222222221111111/00....----,,+,+**)**))((((''%%$$$###!!!!          !$',4=CFGHKQUZafhlkieZB-(*++**((++++,,,'#"%%),2;Zulikjke[MLEGE95JPQW`_[__ZZ[_VS:+/DM9//3@DEE@99:88<>?BDHID??::7555589983.-,.00111122112200000000000011///1001111233444566879899:ANYhmmje\N>520.+,,--..//00//00221220/04468<@GHNV\diouy}€‚‚ƒƒ„‡‹Œ‡|hSX_dbdowxwvvyywvpnnotwz{}}~~~}|zyvtrqqpnnmljfdbaa`a`VMMPHCCCCBDKo—¬¶¹¼½¼¼¼¼½½½½¼¼»»¸·±­¦¦«¯®¤—€xzwwvvwwwvyy}}€ƒ…ˆ‹‘’‘’’‘‘ŽŒ‰‡†…„„„„„ˆŒŒŒŒŒŒ‹‹Œ‹‰ŠŒŒŽ’‘ŽŽŒ†…}xngZOE>;:7879<=?@ADFGJJJ77777766665544333222310/00/...----..-------/..//0000000000111100000000//00////..------,,,,,,----....../-..--..//00//////////00//00001122211212222211100000000000//..----,+++**)))))('''''&%$$#""!!""!!        !#)/6>EFFFINUY`ehjiigW7.-,-)**))((((*++)(''%&*(IpjjfgecPAKMIDB@@FNXbd\Zb_WQR\YOD:36=2./08?EFB;>@:889:;?HKF?:75654467;;852/--//0011112222////0000////00//./0011112222123466777759CP^hjhf]P?6421.,,,,,./....//00110222000/0//0026<CIOU\bjnrvx{}~ƒˆŠ€qeabfnvwxvuuutrmhggjmswyz|~~}~~|ywuvstrppomifdda___a[KIJLIECD@AGm•©²¹ºº¼¼ºº¹¸µ³±°®«¨¦£¡Ÿ ¤£ ™”‹ŠŠˆˆ†……„ƒ‚€‚‚……‡‰‹Ž‘’’’’‘ŽŒ‰‡‡ƒ‚‚ƒƒƒ†‰‰‹‹ŒŒŒŒŒ‹Š‰ŠŒŠŒ‹‹…€{vqiaZMC=<===<:989<???CDDDDDD77777766666554333222310/000///..--..-------/00//0000000000110000000000//00////..------,,,,,,,,--....../.......////////////0000//0000112221021122111110000000////....----+++**))))))(''''&&$$##""!!""!!        !&)/6>DGGHGKPX]`ddeebI-++)+'))))(((((***))'&&'>hfgfgdcN@DMML><JNIW_c__`d`TTZ]aOGB;48879114<CCBB?:99778;FLME=74435567:<><830-//00001122220///////////..//./0011111101111233444448DQ^ggd_UC54410/-,,,,--,,..../011022211100.-..,../37<@GMSY^dhlpsx€…ˆ‡€sghqy|{xwwvqlgd\TV`gmrwxz}~}~}|}{yxvutsrqomjfba___`]PHJIHDACCGQj£­°±±±±­¬ª©§¤¤¡Ÿžœ›šœœšš™˜•’‘‘ŽŒŠˆ†„ƒ…„ƒ……‡‰‹Ž‘’’’’‘Šˆ‡ƒ‚‚‚‚‚…ˆˆ‰ŠŒŒŒŒ‰ˆ‰†‡‡…‚‚}ypjcZOGB;9;;;<==<<:9:=?A@CDDCCAA887766776666553332222210110/////------........////000000111100000000//////////..------,,----,+--......./////................////00001122221121110000//000///..--....---,++*****)))('''(&%$$#$##"""!!!!      #%)/6?FHHHHKOTY[^_b`W9'*)'((((()(((()+++*(),$Cl`bbdceP;B<:KG>=EDSda]]ab_c^ab`bTHDHVJ>BG9,05;?BGB:766336AJMGB:53355679>?A>:51..//0011235510////00..////////0000000000000011222238CQ^cb`XJ;4430///-,,,,,,,--//0111111121000/.-----..--.13;?DHLRW^dipuwwrlmsxwwyvspja]XMHQZ]dmrrw}~~~~~}~}|{ywvutusplhfa_``__[NLJEEHPV^jv ¤¦¦¦¤£  Ÿžœ››™—–˜˜˜˜˜˜——––•“’’ŽŒŠˆ†ƒ„‚ƒ††‡‰Ž’““’’‘ŽŠ‡ƒ‚‚‚‚„††ˆˆ‰‰ŠŠ‡~|zvrnia\ULF>;:9:89;<<==<<;:<>>BBABC@@@?777777776666553332222210000/////------......//////000000111100000000000000////..------,,--------.......///////..............////00001111221111110000//000///..--..--,,,*+*,+**))))''''&%$$####""""!!       !#%)/4<BGHIIIPUVWZYZWF-''''((((((((((++,,,)&&=md[[afhS>@;76@F=556Pcccddda_`debcXLDGJA;@A:1.028ADE?634012:BEFB;7445579;=?AA>:51/0011112344420/////...////////////0////00////////16AMZa]ZRE9121////..,,,,,,--//0111111121120/..-,-----./../0036:>DIMSV[^^^afjklljgd]UQMMOIEQ^fjmpu{€||||}}{yyvvttqmjhecaa```TLNQX_ks|‚”›žžŸŸœ›œ›™™™˜™˜——–––••”““‘ŽŽŒ‹ŠŠ‰‡†ƒƒ‚‚‚ƒƒ„‡‰Ž’’’’‘Šˆ…ƒ‚‚‚‚‚„„†‡‡‡„‚}wmfdaYQKHA<;;;;;:;<<;<<==<<:;<=??BBBB@@?@776678776655442211223310////////--....//..////..00000011111111111111111100////....--------------....////////................/////0//0000221111000000//00/....-..--,,++++++**)(*(''''&&%$###"#""!!!!     !"%()-3;ADFHJLORSUUSM?4)''''))(((())))++-++)*0ll`_adfV8AD<239@DBKEI_baffbc_cddgeguK@>?=>@A90/.7EED@821.-/29@BB?;6543368:<?BB?:62011001234452200//..../......--..////////......../3>IW[VSLA70///...--,,,,,-.../1000001111100/.-.-,---..0..//0/00/1568<>ACEHMPTVVXUSNECCFKF?DR[aflov}€||}||}|{yxwwsqomjgebcacb\_kq{ƒŠ’˜›››œœ›››››™™˜—••••””’ŽŽ‹‹‹‰ˆ†…‚€‚‚…‡‡‹ŒŽ‘’’‘ŽŒŠ†„ƒ‚‚‚ƒ„…‚ƒ‚wl_UJE@?A?B@:<<;<;<<<<<<=<<=:9<<==?BCCB@BD776678776655443322223100//00////......////////..00000011111111111111111100////....--------------....////////................/////0//0000111111000000//00/....-,,,,+++++++***((*'''''&%%$#"""""""!!!      "#&),04<ADFGJLNPRRSOG7-'''('))(((())))++*,+(,ekhhfcgW7AHG8-/7:=>D?Peegjecddb_aebfdGBBDEEEE>3/.279AE>3/.-./29>A?976645578;>@@@>:611100123444422210/....--....----.................1<FSVRNI@6-,,,-..--,,,,,-.../10////0011100/.-..--.//.0///000////./0../10468=>?BAA>;;;>BB>?ENSZbenu}~}}|}~|{yxyyvtqonkjgilrvx|‚‹’–š™šœœœ›››››››š™™šš˜—””””””Œ‰‰ˆŠŽŽŒŠˆ‡„‚€€€€~‚„ˆŠ‹Œ‘‘Ž‹‡…„‚ƒ„„€zri^TJC?@@?BA=<<;<<<<;=<<<;;;<;<<==@CDDEEFF66776866775554332222210/..///////0////....////////0000111111111111111111//.////...--,,-------------.00//////..........------....///////////000000000/////....-,,,,++++++**)())((''&&&%%%$##""!""!!!!     !$&+.27?BHIIJLNOPQQMH:,'&&&'()((((**))*))*,-]legdbfV,<FRQJ=337;55:Rfqnme^abc_]af[ROKKJHJIHB80/125@GD:1-----16<;;755544568==>?@=97321011244554444410...--...-------..//..--..----,09BMUPLF?5-,,,,,,,,,,++,-...///00000011110///......////0000000000........./0/001111367:;;==AGKPW_hry~€}|}~}|{{{zvvtsqonotz‚ˆ•——™™››››››š››ššš˜š—˜——˜˜–‹’’’‘‰…ƒ…’”””•”“’ŽŒˆ†ƒ€€}†ˆŠŒŽŽŽ‹Š†„ƒƒ‚ƒ‚‚~{tmia\PB@@?B@><<<==;;;;;;<;<:<=???@BEFFGGHG77776866776554332222210/////////-/////....////////0000111111111111111110///./.....--,,-------------.00//////..........------....///////////000000000/////....-,,,,++++++**('))((''&&%%%$$##""!""!!!!    !"#&(,039AFIIIJLNOPPNID4('&&&'((((')))*(((()-[ndge`h[-2>GTYXQF8:<98?^ltrlhje^`aaff\SROLNONLLH?3/237=CF?4/---,-/477765554679<=>@A?<9621011234555577522///.-...-------......--..-----.7AJROJF?5-******++++++,-...///00000011110000////..////0000000000..--........../////13366778;<?ENYcnw}€~€~}|zy{{zywuvw†Š“–˜——™™š››››™˜˜˜–”’Ž‹‰‰ˆˆ‰Š‹„€†‹Ž‰rrz‚’™››››š–“‹ˆ„‚€€€~‚…‡ˆ‰ŠŠŠ‹‹‰ˆˆ…ƒƒ‚ƒ‚‚‚|xsoh`QB=<><;;<<<<;;;;;;;=>??@BBBCEGGGHHHG88777766665544322222211000///000//////..////....////0001111111110/./1100///.--.,--,,,,----,,,,,,....////////........--...--.........///.//000000000000///....---,,++,,+**)''''(('&&%%%$$#""!"!!!  ""       #%(),15<CIJIHIJKNMLLE?.'&%&'((('')()(((()*(Qmcedac]./7=FPWXYM729:?<\trrpcYa^[`fhe]WSQQRQPNLJC933/18=CA81-**+*,.135445678879<>@A>=:7520/1213455689643100.-...,,,,,++,,-----,,,----,,5@FQNIE@7.(())))****,,--..--..////0000111000//////////00000000000/...-..--.../////0001222344556;IWcmx„€}€~zyxz{{{{|€‡‹Ž’“•••–—™™šš™š˜”‘Š†|uolhffkmpqs{‚„‚thnz‹˜Ÿž ž  š™”‘Œ‰…€|z{{}€…†ˆ‰ˆˆ‰‰‰‰††ƒ‚ƒƒ‚‚€€€€€}wsh]M@?<;::;;<<;;:;;;>@@AABCDFFFHGGGFFF6677996666554432222221100////010//////..//////....//0000111111110/./00//.-..---,--,,,-----,,,,,,....////..///.....------.--.............//000000000000///....---,,+++++*)'''''&&&&&%%$$$#""!"!!!  !!    !#%(++.37>EJJHEDFGIKJGC;+&&&''())'')('((()+%Oibde`ea0,38=GNUYXP4/9AEHlttto`X`[Z_chg`YVTTQPPQPLGA:53127=@:2,***)**-012357888779<>??>=:752112133467876542000/..-,,,,,++++,,,,-,,,++,,--1<ENMHE@94*())))**))+++,++--..////00001111110/////////00000000000/....--..///000//00011223443333:GVblv}}~~{vsvz~‚‡Š””“•––——•’‹…wpic[UPMHHMQ`]_dnsqlgs…–Ÿ£¢¡¡¡¡Ÿ›‘Œ‡„}ytrssx{~€‚ƒ†‡……††††ƒƒƒ‚€€€€~~~~‚ƒ‚yqj]L@===<;;:<<<;<>>ACCDDEFGGGGGFFEEEE7777666655554432222210000000//0///////-///////...../0000111111000///.......-------,,,,,,+,,,,,,,--..////00////....,.....----..........,-..//////0000/////....---,,++++*(((''''%%&&%%$$$##""!!!!!        %'*+,049@FIIHEBBFGGFE?5)&&&''((((''(()****Tm`bea`c1*566=DIPWXT>==><KlpstUV`cabeeegc]YXWSPPQQMLF>81/138<<3,+*)))*,/13589:9:7778:>@AA@=:642012334567535422110..---,,++++++,,++,,++**)).8>FKGDA:5.''(''&((())))()++--./../0010001221111//////////00//11//..--.......///1/00/1112344442249CS`ksyƒ€}|wqotx}ƒƒ…†ˆ‰‰ŽŽŽŽŒ†~woh`XSNLFCDDDEM]XROTZ_gn”ž ŸŸžŸž›–‘Œ†€|toiddeimsw|~€„„„„„ƒ‚‚‚€}~~~}~~€„€~zrgZF><;;<<><>>?ABCEFGGFFFFFFFFEEECCD6677776655554432220000000000///.//////-///0000......///001////00////.....---,,,++++++++++,,,,,,,--..////00////.....-....----........,,-...//////0000/////....---,,++**)(((''''&%&%%%$$###""!!!!!       "$',-/39<@FIIGB??BEFEA=/(&&&&&''''''())*+._kaab_dd5&29;>>BJOPPI>;<ACTmqrne[Ycaekmkhe^][YVRPSROMJE=30/24993,+*))))+.01489:;<97779=@BBA=::6520013345655555432110/////--,+++,,,,,,++**)),2:@HHC@<6/('''''''())))()**++,--.../100001111110/////////00//00//..---------.112311111123555522247CQ^ipz€€€}|zvpoquy}€€‚‚€}}}~{ri\TLIIKLONLJHHIKQQOKIKT_o†’’““’’Œˆ{sme`\YVVX[beipsv{~€€€~~|{{|}}||~~€ƒ|wodWF===@AA?@@ACFGFFGGGGFFFFFFEEEFCC6666665544554432210000////000010//////.---............//////////..--------,,,+++++++**,,++,,,,,,--....////////....-,-...----........---/...///////////../...-,,,,,++)))(''''''&&%%%$$####""!! !!   "$%),.27;@CHHGFA>>BCECB:,'%%&&''((()')(*)3el^`_]`j?"/4:<@B@CHJJ?8;A@<Zqqsomi]eghlppida^^\WSPQPONKGC:3005473.+*))((*,-045789:86777:=ABB><;:752111224567797553442213330/.,,,----++**+)))*-6<DJA?:51*'&'''%%''&%&''(****+++./..001111221110//....////00..00-----------04455322012456766333347?NZeov|€€~{zxunkloux{||zzyxtsqnmlg^VNJJIIKMLNNJGGHJLKHFGKNZm{}|{}yzvqjb[UMGDBEGOUY^_deilqtyxy}~}|{{{zz{{|}||{|}€|tkbUI@AABCCDEEFFFGGGGFGHHGGFFFFFFGG6666665544555422210000////000010//////.---............/////////...------,,,,+++*****++,,++,,,,,,--..//////////...-----------........---....//////////////...-,,,,,++)))(''''''&&%%$$$##"#""!!        !#%(+/38<BEGIHFCA>>ABDB?7)'%%&&''((((**+':ki^__]boG -238:DGKFEHG=>Qd[DOjlmgjiegkmpqnief`\ZWTQOMLLKGF>7114363.-+))(()*+-13379:766677:=>>><<;975211123435579:76753333330/....--,,++*****)(+19@FC>:53.(''''%%%%%&%%%&')))*)*,,-..011112222210/....////..//..----------.156884320235677883333246?JYcmux~€}{yvrmjkorv{||zxwusqniida\XRPNKKKKJIFCCDFECCB@ADOZ[YYYYYVQNFA=98779?EJRV\___aceimpqvz}~|{zzzz{{{|||{{|~€yskaWKCDEEEDDEEEEEEFFEFFFFFFFEEGFGE6654556644333322102211000///////000.......-.//..----/.........----,,------,,+*******))*+,,,,----+,--..//00..........--,-----------..............///...///.------++++)))(''&&&&&&$$%%$#$$#"!!     #$(+-18<DGJLLJGB?ABCEFB=2&('&&&''''(')))Gog`[^abjU!.:<==;EGXOLJHB=EOWWXdjhgiiabiqrojchhd_]ZVTQLIKIFDA:614675/,,++))))*,-015988855569:;<>===;97543002222568997995442101100///.++-*****))()-5;@C>;73/,)%$&&%%%$%%%%%&''''()**,---./012322220000.0///.--..--,,,,,,**--/1468534422345896666521134=IV`irv}€~zyvrljfkotx|{}{zzwusqmie_[XTQMLJGEB@?=@>><<;;==?????><<9:::89::9:<BHMSX[^`^]_^behlpux}~|yyyxxzz{y{{|{||~|ytldZMFFDFFEECCCCCEEEEDEEFGFHHGFHF4433332233323311211100///.......//......-.--..--,,,,,---/-----,,,,,,----++,,+*))))***)*+,,,,,,,,+,--..////..........--,-----------------......//....//....------+*++)))(''&&&&&&%%%%$#$$""!!      "%*,.29AFKPOLJGDBABEFIF<,('&&&&((')%(')Vlc_\bhglS2JLLNSUJGJNKIA<D@BGQ^aeghji_gjnplbejgbac^WTPLHGFEDB=834675/++++****))++0269995534457:=>>>=;97532111333335888876421/0000000/.-,,**))))())-6;@>:641.*&$&&$$%$%%%%%&''''''))++,,../02222221111////..------,,--,+,,,-/11344123434456866666411344<FR[eov{}€}ywtrkdgjlquy{{||{yxwtrokgc`\WVTQNJFA<:88887677::::9;;;<=>><9;;99;?EJOS[^`_`_\ZY[`ejqvz{{yyxxzz|{y{{||||}~}ytmc[NEFFEDCDCBBBCCCCDEFGGIIHHFGF54224322322211110000////////......//..----++,--,+-,,,,,,-+***+++,,++,,,,++++++**)))))))*++++++++,,,,..----..........---------------,------....//--...0--------,,+*****('''&&&&&&&&%$####""""  !"%()-/4;AHMPPLIFEB@BBDJG8**'$$&('''&'$7fmc]_chhlZ&+CKJNMOTSKING@9NaVZWR]dilkkqnlnpob_eggebb_WSPLHCBACB?:30254.,,++++,,+**+-/3578652113688;<=>>>>;955312331024425775422001123431/--***))))(((18;=:6640.+)%%%%%%%%&&&&&&&&''(()***,,-.01000011111/00////.-,,,+**+*+++-.0111112333223455566766644559ANYbkqx~}xurniefgjmqvy{{{zzzxxvtpligfca]XSMIFDA>::6777677899<<==<<=<:9889<@FJPUZ]```][USTZ]dhpv{{zzxyyy{{{|}|}{{|}}|xtkb[OEDEDCCBAAACCCDEFFHHJJIHFFD33222222221110010000//......----....--,,,,++*,,+,++++++++++++,,,++**++++********)))))))*++,,++++,,,,..--,-..........----------------..----......--....--------,,,+****('''&&&&&&&&%$$$$#""      "#&)),.28>DGJKKIFEBCBCBFB0(+'&'&'''(*%@pmbb`ffhoL#*0EQJGF@BLQFKJ?<FT[dWVcinonlopklpeW_jjhica_XRRMIDA>>=<93/011,++++++,,+,+,,/.3565531/057789;<>@@?=:76334300011114445332222234320--,**)))(&&'*38:<865430,*(&%%%%%%%%%&&&&&&''()**,,-//0000011111000////.-,,++++**+++,-...../01221233355666555334437?KT]emty~|vrpnlgbegjoux{{zzzzyywtrnlkkihd`[XUPMHFA;877666777::;;;;::887779<BGLQW[]__][WQMMTY`gptwzzwwxyyzzy{|||{zy{}}xribYNEDCCCABAACCDEFFJKJJJIGFED1132222211111/.//........-------,.,,++*,+++,+++*****++**++++**,,*)****++****(******+*)****++,,,,,,++------......--..--------------,,------.......-..-,--------,,++++))((''&&&&&&&&%$$$###"""   #$'*,-.26;@BFIJIGGDAAA@?8-*,('%''&(''<pkddegjlh=+/3?ZLCFG<PRNKIGFLQ_f`X_gmoonpqopof_ejhgiffa]XRNGB=;:;:74110-,++**)*,+--,*,./01345420037589::<>A@?<:8697531//.//122444433355431/.-,,*)(*)'%''-2499856720-+'%%%%$$$$$%%%%&$%%'(**,,........---/0000..0..-,,++++++**++,,,,----01111233444433332232126:BNWbjqx{zurmmkfbbekqtvzxyzyxxvttolmmmljiggb^ZVQLE?986656777789::998866569>BFMSX\^^^]YUNIHJS[ckqwz{xuvvwxwwyz{}}z{{{zvpi`XPFDCB@@ABCDDDGHHJLKJHGECA1110111100/.//-..-------,+++,,,,-,++++*+)*++***)))******++**))++))**))))))))()((''(**)****++,,,,++++,,------------..--------------,,--,,,,--,,,,.,-.-,------,,,,++++))((''''&&&&&&&%%%$$#"""  !$%)*,-.16;?CEGJJIHEBBA@9.*++('()(((*>kmfcfkmog5&.10=XXKNKJLMRSNDFFPQhieafltolknnknl`bdffefghf_ZVRJB=;:866:;83/-,*(()**,-./...../124642223568999<??>=><:;9753221/0132334433344321/.-,,+*)))('&&),15::997661/,'$%$$$$##$$$$$$&&'(**,,--......---/.....///.---,,++++**++,,,,--..////0112222211112210/0235>JV^gotyyvrpmlhcaejlptwxyyxvsqomjiijjkjmmkie`ZSKD<87666667777776666555768>DINTZ\\^^]UQJFBGOXaiotxxxvttuvvuuy{{zxyyzxvqibYPECABBCDDEGHIJIKKJJHFCAB000000//0/////0.----+,,,,*,,,,,,,+**))*)())))))*))*)****++**))))(('(((('(()))((((((())********++++++,,,,,,,,,,------..--,,------,,++++**+++++++++++-----,,+*,,+,,,****(('''''%''&&&&%%$#$#""   "%(),+.147>BEFHIKJIHDDC?0*)*(&(*&)(*)dpgeejjoW*(0/4DV\LKHILKBIRKE?IY_YX[`jpskjjelnlg_aegc_afhe_]YUNGB=:879=D?51-+)((((+,--//..--.//3345521136779;<<<????>><9866533334444542300000.-..-,+*)))('&'(,27::;;9841.*$#####""""##$%$&()*,,,,-....--,,,---.././/....--,,,,++,,,,,,,,----..//01000000//11/.////15;FO\ckry{wtpmiheaagjoruwwtqqnkihfdddhjijljgd_YQH>987665566775544445555569?ELQWY[^_]ZSMIC@IPX`gntyywurrstrrruy{yyyz|xvpjd\SJAACDFEHJJJJIIKJIFFCA?////....//.././---,,+,,,,*,,++))(*))(()('((('())***)))))**))))))(('((((&''(('&'''''())**********++++,,,,,,,,,,--------,,,,------,,++++**+++++++++++++,,+,,+*,,++++****((''''&&''&&&&&&$#$#""   "&)*,.148>CEFIJKKJJIFFF9++**)'&&'((#TojijnpoO,43.-4CJNOQMSSSOLKDBGG[^UK\biqommjgmomifdba``_cfb^ZYVPKD?<<=<<B=53/)((((()+,//./.-----/2466321135689;;=??@@@@??=<;:998888755410....,.-..-,+*)))(''&'(-147:;97630,($####""""###$%'&'(*,,,-....--,,,-----////....--,,,,--,,,,,,,,----..///00000//..00....../128DNX`hpuzywoljgeb`agnqssuqomiedb`[\^`cfhihd_YPG>988665566775544445544568>CJNTZ\]_][WPJEDDJQZbhpswxvtrpqqqrruz{zyyz{zwsog_XMFECGHIJJJJIIIIIFDA=<....--...--,-.--,,))****+((((((('''''''''''(((''''(((())**(((())(((('&&&&&&&&&&&''&'))****++))))))+++++++,,*++,-,,,,+*++*,,+,,,,****++++**++++++******+*+,++++++******))))('&'((''%%&&%%$$!!     $(+,/137;AGLMNLJKJLKJJC.&)'%'''(('&Mqhciopi?"300/14=GRZ^XVXYUMIB6<HbcZYhqmrrqmnmiijkgda_b`_^]\USUSQMIC@@C?8:9561(&''((())*./00.,+++,,-03101/025788:;=???@@AAB>@@@?>>=;;8542/-,---,-.,,+**)))('&&&%&+/24688441.,'"#######$$$$%&'(++,,--..,,++,,--......////..,,,,------..--------..//000011//..//..--....017?IS\emswwvpjhhd_^^flnpppnlgba^[WTSSX[`ea_ZWME=986665566775566556666669<AGMSWZ\_]\YSNHFEHMT]ekpuwxxvspmnopqsx{zyyy{zwtqjc[UMIHIHIJIGIGHGFC@=;9....-----,,--,,,,+**))((('''((((''''''''(('(''''''(((())**))(((()(((&&&&&&&&&&&&''&'(())))**(())))+++++++,+**+,-,,+,**+,,+**,,,,****++++***+++********+**,++++++******))))('''((''%%&&%%$$""    "%),/147;=BHNRQOMLKKMLH7*&&('&'&&($Ntiejjle2#120.306EIOWYVVVWVMD;08F^RU[akjruqmprnjiggdb`]^^YUTNMPRNLMF??A<763551+'''(((()*-.//.-,,++*+,-.00/0035778::;<>@@@@AABBBAAA?=;87531//.--,,,+++**)))''&&&%$&(+.025442/-)%#######$$%%%&'(++,,,,--,,++,,--......////.-,,,,------......----.///0000111/0000/.--..//0122;EP[ainvyupmjie_Z]bhknqrplfb^YUQNLOOSXYWUPJB9786666677887777889999:::;AFKQVY[\]^ZUQKGFHMRXahlpuwyywrmmoonorv{zzz{||yxtolc\RKIIIIHHGEEDC?=;76....,+-,,,--,,,,+****(''(&&&&&''''&&''''''&&%%''''(((())(())((('''''%%%%%%%%%%%%&&&&&&''(''''())))*)*+++*++++++,++++****))+++*++**********))))**************++++******)))))((((((('%%%%%$$""!!   $&)-037;>@CHMPQONNLLMK?-)(('*('&%&TvjefjdgC#.210.-/9HORXYY^dZTMG>1<HZZTW^hjmqqswvqiaafd_ZY^_VPNIHJNMMMIDB@<854774-(%&'()))),/..-...+)(('))*--.014566899;<=>??A=>?@@BBA=::8664210//-,+**+*))(('&%%$#$$$%),.1234/.+&#"$##$#%%&&&''(****++++,,,,----.-......//.-,,,+---------.-------.///00011001100/.00//00230149AJV]fkrxwqpjec]ZZ^cglmonlgb[VSPIGGHJMMKFC=88:9887788888888:<<<;;;;<;?CHMRXZZ\^[WRJIGILQUZagmqtxyxvrmonpqrsv{{{{|}€€{xsohaVNIHGGDDCDA?;:752,,,,--,*++++******((*)))&%%%&&&&&&%%&&&&''&&%%''''&&(())((((('((''&&%%%%%%%%%%%%&&&&&&'''&&&'())))*)))++*******+***++***))****))))))))))))(()))*))))))))**))**********)))))(((((((((((&%$$""!!   $(*-037?CDEHIJLMOMMLJB2''''(*)%%$StkafhiiM&.10..-+/>MWPUVY__][TH>7CQ^^UWc_[htstwyzqffki`[Z[\ZRKIHJJJKJJFDA<875654-(%&'())))+-,,-....*''&$%(*+-/25568988;<<<===;::;>>><9::::8732100.,+***+))((&&%%##$$##%&*,.11/.-*%%$##$$%%&&&''(****++++,,,,--...-......//.-,,,+,,,,-----.-------.////00000011100/1111222223236>GQYajpuxrnhc^[VY^`ekmnnnhc\VSNHDA@CCB@==:;<;::::;;;;;;;;<=======>==BDIPSWXZ\YWTNJKJJNSW\dgkqtxyxvromqrrrty|{{|€ƒ~}wqlaULIHEBCB?=;97633++,,,,,+****))))(((&&&&&&%%%%%%%%%%%%%%%%%%%%%&&''&&&'((((((((''&&%%%#%%%%%%%%%%%%&&&&%&&&&&'))(''*())()))))))****++*)))))))(((())))(()))((())))))(((())))))))))))**)))))))((())((''((&$$%$#"!!! %'*/27:@EGFGEFIKNNMJD7,*((()*+$#A{m_^edj_%+1038/++-8DLORSUZ[^]QJB=HRWYQRZRTbrstx}|wusoh`\YVUTPHHIHGGEFJGDA>976543.('''(((')*++++-//.,*'%"$'(+.046776679=<<<=<:976798877:;<<;76320/.,*****))(('&&&#$$$$$#$'*-.10/.,)&$$$%%%%&&''(())**++,,----..///,---...//.-,,++**++++,----,----....//00001112221133334455434467<DLT_eltvsmhc_YUTX^cgkmmmje]XRNHE?<:<>>?>>=>>???<<=>????@@????>>>=<>BHLPTVXYZWUPLKHINRUY_dhnrvyzyvrqqqrssvy~€€‚ƒ…„‚~yri_QGFC?==;9644330+++,,+******))(((((&&&&&&%$$$$%%%%%%%%%%%%%%%%&&''&&%&((''((((''&&%%$%%%%%%%%%%%%%&&&&%%&&&&'''''')((('(()))))))(())))))))))((((((''''(((((())))))(((((())))))))))**)))))))((())(('''''%%%$###!! %),/4:=BGIIHFEGJNONNG>3))))*)((-qwi`dijb5%.1122-**,5BLNNSW[]\ZNF<8HVY[[S`dY[bmptswwwunjaZTQPPLFGHIFDDEIJHCB?;98851+((()))*)')*++,...,-,(%$$'*.26887668:;=<<<;:9664666577;9897521//.-,,,,,**))('''&$$$$$#$%(*.01//0-)(&%%%%%&&''(()))*++,,----..-------......-,,++**++++,---..........//001122123333344455777877778;@IQYdhpttmha[ZSRV]`dkmmlid^XUOLHC?@@@AAA@@@AAA@@?@AAAA@@??==>><;;<?BGMSUVXYYVRMLJLNRTX\afkqsvwzywtrqqtvxx}ƒ…†…ƒwocVGC@<;:964332/.**))****))(())(('''&&&&&%$##$$$$$$%%%%%%%%%%%%%%&&&&&%&&(&'(('&&''&&%%%%%%%%%%%%%%%%%%$$%&''''''''((((((((*((((((((())))((((((((''''''(((((((((((((((())(((((())****))))))*)()))((''(('%&&%$##""!  "%(,/4;?AEHIGFEFLNONMNG7'')**)((]{mceiph@!.20/.,*)+-7AFJRRTX^c^OEA=M_ffjnwq_YS`edkrxyumjd[VSPOJDEFHFDDDHHGFFFC>:852+)))+*+,,((')+,-.-,.,*)'&&(+.59854799<<=<::9755545555653666210///.-,/..,++,****'%$$$#$$$%),.21121.+(%#%''&&&'(((()*++++,,,,....----....,-..,+++****++,,--/.....//..//00223221243345556677888888779>EMU]emsrmib][WSV\_cgkijiec[XTOLGEDBCCDCBCCBBAAAABBBB@@?=<;;;;99:;@EKPRWYZZXSPOLOQSXY\achlqsvy{{xusuuuwz|ƒ„‚‚ƒ……ƒzqfYHA<98755211.,,**))((**))(())((''&&&&%%$$###$$$$$%%%%%%&&%%%%%%&&&&&%''(&''''&&''&&%%%%%%%%%%%%%%%%%%$$%&''''''''((((((((('''''''''((((''''''''&&&&&&''''((((((''((((''(((((())****)))))))(()))((''(('%&&&%$#""!  $&(,.37;<?ADA@AEKLMMLHC4(('))*%UwolhnrpW&+/3/..,+**+8@KORRUVVY^QCCO^gkjgmjVYa^ZWWcortplni_YVRNHC@CEGFEFGEFHIIFD?;94.**-**.11.+(')+,,,,-+,+,))()-164345688;:988764222333332222210//-----....,--****(&%%%$$$$%(*.100210.+(&%&&&&&'(((()*++++,,,,......--//..,---++++****++,,--/...//////00112343233334455666778999888998;AIQ[bnrsole`[[YXY_cgikjjhe^[XSPJGEDEFECCCBBAAAABBBBA@?=<;::9999:>EHNRUW[ZYVSQQRTVX[]`bbhmpswx||zxusvx||~‚…„‚€‚‚~yri[J>8754220/.-+,**))(())))(()('''&&&%%$$$$$$$$%%$$$$%%%%%%%%&&&&%%'''''''&''&&&&''&%%%&%%%%%$$$$$$%%%%%%%&&&'&''(('''%'('&&&&&&&''&(''''''&&&%%%%%%&&&&&%%&&'''''''''''''((((()(((**))(()))(())))'(((((('''&$###!  $%*,-1467:<=;>@BIJLJJF>2*'()(%Syocagso]$'//.--++***,/BKMRSSQPU[ZLDNbkooerj_[heaaMWglomkjgc^]XNGB?@ACEFDDEHIIHFDB@=7/,,//03682.*'(())+,+,--..++--000011236676544111012222100.//////..--..//11/.,*))*)('&&#%$$%)-1323330/,)&%%%&'''(((**++,,,,,-...../..////..-+**++*))++++++,.//01111222222233333444556666666887799888777?FOZciqusnje`^[YX\`eghklid`\WUPKHHGFEECCBA??@@BBAAA@?=<;:987889<@DJOTWY[[YVTVVXY[\]_ddghlprtx||{xuvxz}‚„…€~|yriZI;5531/.-,++++))))(())))(()('''&&&%%$$$$$$$$%%$$$$%%%%%%%%%%&&%%'''''''&''&&&&''&%%%&%%%%%$$$$$$%%%%%%%&&&'&''(('''%%%%%&&&&&&&&&'''''%%&&%$$$$%%%%%%%&&%%&&&&''&&&&&&''''((&'((**))(()))))))))'(((((('''&#$##!   "%(+-023347:;>BDFIKKJFB6*'))&G|o`_fqqe7 ,0.---++***-=GDGQTWROQYYRJSbjq^ovbeoha`bRP\dhjhd_`b^YQGB@?@BCCDDEFFFFEDB@=7/-/13425420+)((((***,/12200..--//../02241111011012222100///////...-..//11/..,,,*)('&&$%$$$'+-2555410-+(&%%&''''((**++,,,,-....../00110000/-+++++**+,,,,+,.//011112222222222223434566655557877998887666<CNXaiqtvtqjgb`][Z]dgkjhhfc^YVTPKHGFEDCBAAABBBBBBA@?=<;:977889<AEJOQUWZ[[[Y[[Z[\_acceffhknqtx{|zwxx{€‚ƒ„‚|{{yuqg^M=200.-,,+++++(((((())))(''''''&&%%%$$$$$$##%%%%$%&%%%&&%%$$%%%%&&'''''%((''&&''''&&%%%%%%$$%%$$$$$$%%&&&&&&'&''&&''%%%%%%&&&&&&&&&&&&%&%%%%$$$$$$$$$$$$$$%%%%&&&%&&&&&&'''''''())))))***)(())('''(('&&&('$%#"""     #')./12237:=@BCFHJMLGA4)(*'6uvkkjpqj8%-.----++))*0FCBIQSQPOSRMXY[`k]Knovnigd^YYVRYabe`\][[\SKFA?>?@CFFEDCEECBA@<72.04872-121-,*))()(),/255442..,..--///.///////00133332111..//0000..--00000/.-,,*)('&$%%$$$$(+.2455211.+)'%%''((()++++----........001111200/,,----,,--,,,,..//1111111122111101223444554444566688888888659BLV_jsx|zwrkgc`ZX]adghhjhd`\YVQLIGFEDC@??BDCDECBA@?;;;:89:::<?CHNSWZ\^^____^^_bdffffcbehkorvz||zz{}ƒ‚‚~{yvtsni^QA2..-+,,-++**(((((())))('''&&''&%%%$$$$$$##%%%%%&&%%%&&&&''%%%%&&''''&'((''&&&&''&&%%%%%%$$%%$$$$$$%%&&&&&&'&''&&&&%%%%%%%%%%%%%%%%%%&$$$$$##############$$##$$$$%%%%&&&&&'&''()))))))))(((((('))(('&&&'&'%$##""   ""'),.01358<BCDDFJLOLGA2((,,l|kkqrnlA#*------++*))-/9FLQPPPPKLPW^`[b^W_eproiiec][X]`aa]\ZUXXSOLE?<=>?CCBAAEFB@?ABA90.1550-/211/.,)))++/-0358830.,,,--...-.--..-0/013333332200001111../000000/.,++*)(''&%%$$$$%),0244221/-,('%%%((()++++------......000000001011/---..--,,----./00000011110011012223444455444466777777774448@LWaju|~}zvpie_YW[]cffijifb\ZVQLIGGFEBBDFGFGGECB@@?=<;9:::;=ADHNSWZ\__``aa``acegggfc``bdjosx}||zz{~€€€}xvtrqmh_VF6---+++,,,++''(((((())('&&&&&'&%%%$$$$##$$%%&&&&&&&&''&&&&&&&&&&''%%%&((''(('''''&&&$&&&%%%%%%%%%%%%&&''&&&&%%&&%%&&$$%%%%$$%%%%%$$$$#####""""""!"""""""####$$##$%%%%%%&&&&&'(((''))))))))))(())))''&((&&'%%$""  !##')*+.039<@BFJMNNOOJFA1()*[wlmvsoP  #,,,,,,,,,**+15:@HORONKHKKUadXQZeigackh[Xda___\__\ZYSQORRNHB@><;;=<<=?====?DKA1**.0.//33201/,*-0110214883/+*)),+,,,,,-....///02123234433221100//..00110/.,,++*(''&&%$%#$#&'++/0111//-+)'''((())*+++,,,+++,...-0000//01001100..--..--,,----,..../00////000011222233443333466666777654447@LWclv||vrie\USX\aeiijifb_[VRMIIHGGFGHJJJJGEDCC@>=<;;==??AEHMRVZ^`accbbabedeffffc`][\djnsuy{{zz{~~~ywuronlicYM=.***+++,+))(((((((())('''&&&&&%%%$$$$##$$%%&&&&&&&&''&&&&&&&&&&&&%%%&''''((''''&%&&&%&&%%%%%%%%%%%%&&''&&&&&&&&%%%%###%%%$$$$$$$####"##"""!!!"""!!!!!!!""!!""""#$$$%%%%%&&&('''''))))))))))))))))****''''&$$#!!!!"$')*+-/16>BFIMPRRTRJF?.()9zrinwwqT! "&,,++,++,,***/05>FILLIJLMLXbcYEHST_fldda_`bike^^_^]ZRPQSRLEBA><87788989999;BPI1*),-022421/0//023445222330-*)**)+++----.////0/0100023443333221100..//00/./--,+*)()(&&%%$#$$$'(*-./0100/.,)'(()(()**)+,,....//.-////..,-////....-...--,,,,,,,-..-.//////0000001100002322222333334554444469@LYcpv{{}}wqh_VPQW\aehjjlgda\VRMLKJJJKLLMMLIGFDC@?=<<<==??CGHMRVY]__cddebddeeffffc]]ZX[aflpsyz{{yz~~}xvrpmnlje^TC1+)*)**+*(('''())('))('''''&&%%%%%%%%$$$$%%&&&&&&''''''&&&&&&%%''&&''''''''&&&&''%%&%%%$$%&%%&&%%%%%&&&%%''&&%%%%$$$$"###$$$$##""""""!!!!! !!!!!! ! !!!!!##""!"##$$$%%%%%&'&&(((((())))))))))))****((((&%$$""!!!$()*++./5=AEJSUTTVQJE;*)(Tuqmsyte* "!%*,,***+,.,+++*3=BHKGHHFDFP_SFKSQTbgeijf^_\bjdZX[\\ZSPTVSQLCB?;:7544545688:AE@8,)+,.334422145665676310//,+*)(((()+----.0/011////0001331223333110/,-/../-.,-,+++*))(&$$$$$#$$$'(+,,/0221/-+*)))******+,..00/0/-./////....////......-,,,++++,,--....//////00////////00122211111123334434578ANYenwz{|yuoeXPPQTZbfgjkjgdb]XRPOMOMNOONNLIHFED@@?>=<>>>>AEINQU[]]acefffgffggffdb_[URQV^dhkrvz|z{|zzxuqrllkif_XJ:,)+*))))(('''())('))('''''&&%%%%%%$#$$$%%%&&&&&&&&&&''&&&&&&%%''&&''''''''&&&&&&&&&%%%%%%&%%&&%%%%%&&&%%%%&&%%%%$$$$#"""####""!!!!!!          !!! !!!  !$$!!!"##$%$$%%&&&'))(((((())))))))********(((('%$$##""#&())*+..48>HKRVUURKHD9)(,ksjqxsi7$"#'*++**)+,./,*,+5AGGIIF@?;=FRJ?IRYkhfhhceg\P]gaXTWXZZVQUSMMJCC@==:755534688<>>><0))+-0144434688875431/---,+*)((((()*,../0/011///////01113234445320/,+../----,++**++(''%$&$$$$#&&(*+.133220//,**++++,,,.0000/0110.////....////....//-,,,----..--....//111100//////////002211222223334454576:CNYcjsyyyurj_VOSRW\bgmklkieb\XWRQPPOPPNNJHGEDDB@@??=??AACEGNQU[]^bdgihghggggfeda]XRONORYaglptx{zyzzxxwsmmligd\SC4-*)((''((€€€€~~~~~~}}||}}~€€€€€€€€€€~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}|{zzzzyyyyyyyyyz}€‚…†‰ˆ‰ˆˆˆ‰‰ˆˆ†…ƒ‚‚ƒƒ‚€|{zzzzz|}ƒƒ……„‚€~‚€ƒ†‡‡„‚ƒˆ„„‚€~~~~~~~~~~€ƒƒ‚€~}{||{}~~~~~~~}}}€ƒ„„…†‡‡ƒ~}}}}||{{{{||{}||}~€€€€€€€~||{|~~~€€€ƒƒƒ€}{xwyz~€€€€~}|}~~~~‚„}|€€€€~~~~~~}}||}}€€€€€€€€€€€~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}|{zzzzyyyyyyyyyz}€‚‡ˆˆˆˆ‡„„„„„„ƒ„ƒ€~~~‚ƒƒ‚€|{zzzzz{}~€‚ƒ„„ƒ€€‚ƒƒƒ‚‚ƒ………~x{‚…„‚~~~~~‚ƒƒƒ‚€}{||{}}}~~~~~}}}~ƒ„„…†‡‡ƒ~}}}}||{{{{||}~~~}~€€€€€~|yy{|~~~~~€€€‚~}{zyz{~€€€€~}|}~~~~‚„}{y€€€€€~~~~}}{{}~€€€€€€€€€€€~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}||zyyzzyyyyyyyy{}€ƒ…ˆ‡†ƒ‚€ƒƒ„……‚~~}}‚„„ƒ‚|{z{{zz{~€‚„„ƒ€€ƒƒƒƒ‚‚‚‚ƒƒ…„€yssu€†ˆ~~~~~€‚ƒƒƒ‚€}|}}}}|||}~~~}}}}~€‚ƒ……††‡„‚~~}}}|{zz{|}}€€€€€€€€~}|{yz{|~~~}}€€‚‚ƒ‚}}zzyz|}€€€€‚‚‚€~~|~~~~~~€‚ƒ~yy€€€€€~~||}}}}~€€€€€€€€€€€~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}||z{{zzyyyyyyyyy|‚„„‚„…††‡„}|{}‚„„ƒ‚€}{z{{{{{}~€‚„„ƒ‚‚ƒƒƒƒƒƒƒ„ƒyvuvzƒ€~~€ƒ‚ƒƒ€‚}|}}}}|||}~~~~}|}}‚‚„…††‡…ƒ~~}}}|{{{|}€€€€€€|{xwxy{|~~}|}€€‚‚„ƒ~|{zy{|}€€‚‚€}}|~~~~~~ƒ„€{yy€€€~~}}|{}}}€€€€€€€€€€€€€€€€€}}~~~~~}}}||}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~~~~~}}||{{yyyyyyxxxxyz|€€‚ƒƒƒƒ†‡‡…„‚}|{{|ƒƒƒƒ|{zzzz|}€‚„„„ƒƒ„„ƒƒƒƒƒ~€~}|z{‚€€€‚„ƒƒ‚‚€€€€€~|{}}}}}}|}~~}}}}|~€ƒƒƒ„…†„‚€}~~}|||}€€€‚ƒƒ‚€€€~|yxwwxz|}}}|{|‚‚……ƒ‚€~|{{{|~‚‚ƒƒ‚}{z}~~~~~‚„{yx€€€}}||{z||}€€€€€€€€€€€€€€€€€~~~~}}}}||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzyyyyxxxxyz{~‚ƒ„…………†‡‡…‚€|{{{|ƒƒƒƒ‚€}{zzzzz|~€€‚„„„„„„ƒƒƒƒ}|}~}}}~}~ƒ…ƒ€ƒ„ƒƒ‚~~€€€~|{}}}}}}}~~~~}}||}ƒƒƒ„…†„‚€}~~~~~‚ƒƒ‚‚‚€€€~|}}zywvvxz|}}}|{|‚‚……ƒ‚€~}{||}‚‚‚}{yz|~~~~~~‚ƒ‚}{y€€~~{|{{{{|~€€€‚‚€€€€€€€€€€€€€€€€€€}}}}}|{}}}}}}}}}}}}}}}~~~~~~}}~~}}}}}}~~~~~~}}||||{{zyyyxxxxy{|~‚„„†††††…††„}{z{{}~€‚‚ƒ‚{{{zz{{}~€€€ƒ„„„ƒƒƒƒƒ‚€|}~~~~}}„ˆ‰ƒ}}‚„„‚„‡‡ƒ‚‚~|||‚‚€~}|||}}}}}}~~~|{{}~ƒƒƒ„…†…ƒ‚ƒƒ„„ƒ€€€€€€~}~~~}zyvuuw{|}}||z|€€‚‚……ƒƒ€~}~~‚ƒ€~|zwxz}~„‚|z€~}}{{{zz{}~€€€€€€€€€€€€€€€€€€€€€€}}}}||{}}}}}}}}}}}}}}}~~~~~~}}~~}}}}}}~~~~~~}}}}||}|{{zyyyxxxxy{}‚„„†††††…†…‚|{|{{{}€‚ƒƒ‚€|{{zz{{|}€€ƒ„„ƒƒƒƒ‚~}}€€~~€€~}{{ƒ…††…„„‚€~}|‚‚€~}|||}}}}}}~~~~}{{|‚ƒƒƒ„…†…ƒ€‚ƒƒ„ƒƒ€€~}~~~}zxuttw{~}||z|€€‚‚……ƒƒ‚€€€‚‚‚~|wvw{~ƒƒ€}{€€€€~~}{{zzz{~~~~€€€€€€€€€€€€€~}}}|{{{{|||||||}}}}}}}}}}~~}}}}}}~~}}}}}}}}}}}}}}}}|||zzyxxxxwxy}€ƒ……††„………„ƒ||||||||~€‚ƒ„ƒ~|{zz{{|}}~€€‚„„ƒƒ‚€~~€~~€~}||y~‚€{vvz|}|ƒƒƒ~|{{{|||}|~}}~~}}{|~‚ƒƒƒƒ†…ƒ€€‚ƒƒ„„ƒ‚‚~~~~~~}~~~~{xusstw{|}}|{{}€ƒ††„„ƒƒƒƒ€‚ƒ„ƒzwvy|~~~~„„~z€€€€~}|{{{{{|~~~€€€€€€€€€€€€€~}~}|{{{{|||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|||zzyxxywxz{‚‚ƒ…††„………„~||||||||}~~€ƒ„ƒ‚€}zzz{{{|}€€‚„„ƒƒ‚}}~}|}~€~}|zxyzx|‚~xtqqrtw|ƒƒƒ~}|}}||}}|~}}}}||{|~‚ƒƒƒƒ„„‚€€€‚ƒƒƒƒ‚€~}||}}~}~~}}yvsrrsw{}~}|{{}€ƒ……„„„„ƒƒ‚‚„…ƒ}yvwy~~~~‚…ƒ{€€€€~}||{{|}}}~~~€€€€€€€€€€€€€€€~~~}|{zz{{||||||||}}}}}}}}}}}}|||||}||||}}}}}}}}}}||{|{|zzyxxwy|~ƒƒƒ„…„„„……„~||||||||}}~€€‚‚ƒƒ~|{{||{}~€‚„…„ƒ‚€~}}~€}|}~|{{zzywvv|‚‚~xtvxz}~€€‚ƒƒ~}|||||}}}}}}}}|{{{}€ƒƒƒƒƒƒ‚€€‚‚‚‚€€}|{y{|~~~}}}zxusqqrvz}~}|z|~€€€‚ƒ……„„„„ƒƒƒ‚ƒƒ„…ƒ€{xvxy~~~~€ƒ…„€|€€}}|{|||}}}~~~€€€€€€€€€€€€€€~||{zzz||{{||||||}}}}}}}}}}~~~~||||||||}}}}}}}}}}||{{{{zzyxyx{~€‚„„ƒ„„„„„„„„}{||||||||}}~€‚‚ƒƒ|{{||{|}~€‚‚„„ƒ€~~}€€~~|zz{{zxxvw{~zz{||||}€€‚ƒƒ~}||||}}}}}}}}|{{yz}€€‚ƒƒƒƒƒ‚€€€~|yyxy{~~~}}|ywtqppsvz}~|{{}~€€€‚ƒ……„„„„ƒƒ‚‚‚ƒ„‚{xvx|~~~€ƒ…„€|~~}}|}}~~~~}~~~€€€€€€‚~}|{{{{{{{{{{{{||||}}~~~~}~~~€||||||||}}}}}}}}}}{{{{{{zzyyy{~€‚ƒ‚ƒ„„„„„ƒƒƒ}||||||}}|}|}}~€‚‚ƒƒ„€}y{||{||}€‚ƒƒ„‚}~~~|yz~}}~~||}}|{wvyxuy€~{z{~ƒƒ~~}}}}}}}}}||zyzyyz}‚ƒƒƒƒ‚‚‚‚}|{ywvwx|}~}~~}|xuspnpruy}|{|~€‚ƒ…………„‚‚‚‚‚‚ƒ‚}zwvz}€€~~‚††~~~}}|}}~~~~~~~€€€€€€€€‚~}|{{{{{{{{{{{||||||}}||||{}~~~|||||||||}}}}}}}}||{{{{zzzzyyz|€‚ƒ„‚‚‚‚‚‚‚€}||||||}}|||}}~€‚‚ƒƒ„~}}||}~€€‚ƒ„‚}~~}ztsw}~}|}~€€‚„„‚|tswwy~€{z{~ƒƒ~~}~~}}}}}}{{yyxxwx{}‚ƒƒƒ‚‚€€€€~{zywvvwz}~~|zwurpnnpuy}|{|~€‚ƒ……ƒƒ‚€€€€‚|zwx{€€€‚„„~~~}~~~~€€€€€€‚‚‚‚€~~}|{{{zz{{{{{{||}}}}}}}}}}}}||||||}}}}}}}}}}||||{{{{{{zzzzxz|}€€‚‚‚€€€€‚‚~~}||||||||}}}}}~€‚‚ƒƒ„ƒ€~||}~€ƒƒƒ‚€}~~||yy|}„‡…€~~€€ƒ„„ƒ~wsuwz}}|z|‚‚‚}|}}}}~~}|zyyxwutvy}€‚ƒƒ€€~}|zxwvuuvy~€|zusqpnnpuz}}|{|~€€€‚„„ƒ€€€€€€}zvvy|€€€€„„~~~}~~~€€€€€‚‚‚‚€~}|{z{{zz{{{{{{||||}}}}}}}}}}||||||}}}}}}}}}}||||{{{{{{zzzzxz|~€€€€€}{z|||||||{|}}}}~€‚‚ƒ‚ƒƒ€~}~€€‚€€ƒƒ‚~~~}}{}}€ƒ…‚€€‚‚‚‚€}ysprw{|z{|‚‚‚€~}|}}}}}}|zyxwwutrtx}€‚‚‚€€€€€€€}|zywvusuvz€€€~|yutrpnnpuz}}|{|~€€€‚„„ƒ€€€€~zwuuy|€€€€„„~~~~~€€€€€€€€€€‚‚€€€~}|{{{{{{{{{{z|||}}}}||||}}}}}}}}}}~~~~~~}}}}|||z{{{{zzzyyyy|~€‚~}}~€€}||{{||||||}}}}}~€‚‚ƒ‚€‚‚ƒ€€€€‚„ƒ~|||~}ƒ„‚€}{xtolu|~{{|€‚‚ƒƒ}|||||||{yxwwvtsprv{~€‚‚€€}||}~~}|yxvvusstw|~€€€|yvtsrompty}}||}€€€‚‚ƒƒ‚€€~~~~}zxusvz}€€„ƒ}~~€€€€€€€€‚‚€€€~}|{{{{{{{{{{z|||}}}}||||}}}}}}}}}}~~~~~~}}}}|||z{{{{zzzyyyz}‚€~}}~€€}{||{{||||||}}}}}~€‚‚ƒ‚€€€‚‚ƒ€€€‚„ƒ~{xy||~‚ƒ‚ƒ„ƒ‚‚€}{ywuoks|}{{|€‚‚ƒƒ€}{z||||{{zywvsrponouz}~~|zz{|}|zxxvtsrrtw}€€€€~|xttrqonpty}}||}€€€‚‚ƒƒ‚€€~~}}{xtrsv{~€€„‚~€€€€€€€€€€€€‚‚‚‚‚‚‚€€€€~}|{{zz{{{{{{||}}}}}}}}}}}}~~}}||~~~~~~}}}}||{{zzzzyyyxxz{‚„ƒ€}}~€‚‚‚|{{{{{||||||}}}}~~€‚‚‚ƒ‚€€ƒ‚€€€‚ƒƒƒ‚€~|{||~‚†‡‡…„ƒƒ€}{zyzxtmqz|z{}€‚‚ƒƒ~{z{{|{{{zxwvsqnmlmry}~|zyxxz{}|yxwtrqpqsx}€€€€~|wtsrqonpty}}||~€€€‚‚ƒƒ€€€}|yxtpqrw}€€}}~€€‚}€€€€€€€€€€€€€€€‚‚‚‚‚‚„……††„‚~}}}}~~||}}}}}}}}}}}}~~}}}}~~~~~~}}}}||{{zzzzyyyxy{~‚ƒƒ‚€€€€‚‚|{{{||||||||}}}}~~€‚ƒƒ‚ƒ‚€€€‚ƒƒ‚€~~}}}~„„……„……‚~|zyyxxvpnw{z{}€‚‚ƒƒ~{z{{{{{zyxutqnkjikpv|~}zxwvvvx{||zywtrqpquy~€€€~|vtsrrpnpv{}}||~€€€‚‚ƒƒ€€€}|zxtqnorw}€€}||}~€€}€€€€€€€€€€€€‚‚€ƒ…ˆ‰‰‹‹ˆ‡ƒ€~€‚ƒƒ††…‚~}|||}}}}}}}~~}}~~~~~~~~~~~|||||{{zzzzyyyy{~ƒƒ„„‚‚€ƒ‚}|{{{||||||||}}}}}}€€€€„„ƒƒ‚‚‚„ƒ‚}~€€‚‚ƒ‚~~€‚‚„„ƒ~{{zzyxwwpnuyy|}‚‚‚‚€}{z{{yyzxxvtqomkifiov|~{xvtsstxz{zzyvtrqpqty€€€€€zvtssrqqrx||||}~‚ƒ‚€€€€€€~|zxvrokouy~€€~z|~€€€€~€€€€€€‚‚€ƒ„…ˆ‰‰‰‰‰ˆ‡…ƒ…‡ˆ‰Š‰‡‡†ƒ€~~}}}}}}}}~~}}~~~~~~~~~~~|||||{{yyyyyyy{‚‚„„……ƒ‚€‚€€|{{{{||||||||}}}}}}}~€‚‚ƒƒƒƒ‚‚‚ƒ‚}|}€‚‚‚ƒƒ~}‚‚ƒƒ‚~|{{zzyxwwvsuyy}~‚‚‚‚€}{z{{{{{zxvuroljgfiov|~{xvtutuxz{zyxvtrqpqu{€€€€€{wutusrsux||||}~‚ƒ‚€€€€€~|zwtqnkou{€€€{y{}€€€€~€€€€€€€€€€€€€€„‡ˆ‡ˆˆˆˆ‡‡††ˆ‡‰‰‡‡ˆ‰ˆ„‚~~}}}}}}~~~~~~~~}}~~~~}}||{{zzyyxzy{}€„„………„„‚€‚€}{{{{{||||||||}}}}}}~€‚‚‚‚ƒƒƒƒƒƒ‚€}|~€€‚ƒƒƒ€~€€‚‚‚‚‚‚~|{zzyxxwwwxtsxz|€€‚‚€}{z{{{{zzywurolifeflu|~€|yxuvvwyz|{zyxvsrstx}€€€€€zxvwvsuuvz}{{{|€€€‚ƒ‚€€€€€}yvqollpv}€€€€€}zx{~€€€€€€~}€€€€€€€€€€€€‚ƒ‚‚‚ƒ…††……†………………†ˆˆ†‚€~}}}}}}~~~~~~~~~~~~~~}}||{{zzyyxz|‚„…†††††„‚‚‚~{z{|||||||||||}}}}}}~€‚‚‚‚ƒƒƒƒƒƒ‚~{{~€€‚ƒƒƒ‚€€‚‚ƒ‚‚‚‚‚‚|{zzzyxxwwwwssy{|~€€‚‚€}{z{{{{zzywurolifeflu|~~}{zxxz{}~€€~|{yxxy|~€€€€€~{yxwvutvy{{{{|€€€‚ƒ‚€€€€€}yvqnkkry~€€€€}xwz~€€€€€€~}‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€~|}}‚„…ƒ~{{~~€ƒ†‡ˆ†ƒ€~~}}}}}}~~~~~~~~~~}}|{{{zzyz{}„‡†…………††‚ƒ€€€€~||{{{{zz{{{{{{||}}||}}|}€ƒƒƒƒƒƒ‚€}||}€‚‚‚‚ƒƒ‚‚ƒ…„…ƒƒ‚‚€|{zzzyyxxvxwtrvz~€ƒƒ|{yz{||{zyxutoljgfhlu|~~~}|||~€€‚‚‚‚€~}~~€€€€~{yywutvz|||}~~€€‚ƒ‚€€€€€}yupljltz~€€€{wuz~€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~|}}~€}xwxxyy|€‚†……ƒ‚€€~~~~~~~~}}|{{{zzz|}€‚…†…†………ƒƒ|zzz{{{{zz{{{{{{||}}|||||}€ƒƒƒƒƒ‚~}{{|€‚‚‚‚ƒƒƒ„…†……ƒƒ‚‚ƒ€}{zzzyyxwxxxtqry|€|{yz{||{zyxutqnkhgimu|~~~~}~€ƒƒƒƒƒ‚‚€€€€€€€€€~{xvuwz|||}~~€€‚ƒ‚€€€€~}yupllpu|€€}yvwz~€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~~~~~~}}||}}~zxxyzz{{|~€ƒƒ„†…„ƒƒ€€€€€€~~~~~~}}|{{{zzz}€ƒ……„„………„‚€€|zxxxzz{{zz{{{{||||}}||{{{||€€‚‚‚ƒƒ€~}||{|€‚‚ƒƒƒ…„……†††„ƒƒƒ‚‚€}|{zzyyxxxyvsnpw|€€€|{zzz}}}{zywtrokhhinv|~}}~€‚„ƒƒƒƒ~€€€~~~€‚€~zwuwy|||}}€€€ƒ„}~{wtojkpw}€€€}yux{€€€€€€~‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~~~~~~}}||||{{xxy{{{||}}~€‚ƒ„……†††††††…~~~~~~~~}}|{{{zz{~‚„„„„…„ƒ‚~~||{zxwyzzzzzzzz{{{{zz{{zzzz{{{|}€€€‚‚‚‚‚€}|{{z{~‚‚ƒƒƒ„…‡‡‡†„‚‚‚€}|{zzyywwx{}ytrw|€ƒƒ€}}{||}}|~~}ywspoljkov{}~}~€‚€€~|zyxyyz|€€€~}}|~€‚ƒ|wuwy|||}}~~€ƒ„|~~~~~}{wrmkmtz~€€}yux{€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€€€€€~~~~}}}}}}}|~~}}||{{{{{{}}}}~~€‚ƒ„ƒ†‡ˆ‰‰Š‰…€}~~~~}}||{{{{{|}€„„„„…†„~}|yyyywwwyzzzzzz||{{{zyzzyzzzz{{z{~€‚‚€~}}{{{{|~€‚‚ƒ„„…††…‚€€€~~{zyyxxwwxx{{utx|}‚‚~}|||}~€€|zvsonnnrz}~~€€|zxwvtrqruy~€€€~~|||}‚„„~xwxz|||~~~~~€‚ƒ‚~€~}{urmjnv}€~|xux|€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€~~~~}}}}}}}|}}||}}{{{{||}}}}}}}~~€‚ƒ…‡ˆˆ‰ˆ†~}}~~~~}}||{{{{{|~‚‚„„„‚~{zxwvwwwwwwwyzzzzzz{{{{yyyy{yyyzz{{z{|~€‚‚‚~}|{{{{{}€‚‚‚ƒ„…†…ƒ€|{}}{yyyxxwwvvwvwvwz}‚‚‚‚~}|||}ƒ„„}xvtrstx{~~zyxwvusqpqty~€€€€~{vxz~ƒƒ‚|xyz|||~~~~~~~‚‚~~~}yupnmqy~€~€|wux|€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€€€~~~~}}||||||||||||||||||||||||||}|{{}}€ƒƒƒ„„……„€}}~~~}}}||{{zz{}~ƒ„„ƒƒ{xvvwwvvxxwxyyzzzzzzzy{{zyzzzzyyyyyz{{|}€‚‚‚€~}{||zz||‚„„ƒ~~~~|v|€~|zyyxxxwvvuvywvy}‚‚‚‚~}||~ƒ…„ƒ€|zyy{{{~€€€€~yxxwuutrrsuz~€€€‚ƒ}yutw{ƒ‚}{yz{{{|}}}~~€‚‚~~|zuqoot{€€€|wux|€€€€€}ƒƒƒƒ‚‚‚‚‚‚€€€€€€€~~~~}}||||||||||||||||||||||||||}}|{||}€€ƒ„€||~~~}}}||{{zz{}‚ƒƒƒ‚€|ywvvvvvvxxwxyyzzzzzzzyyyyyyyyyxxyyyz{{|}~€‚‚‚€~|{||{{||‚ƒ‚€||}{xy€‚}{yyxxxwxzxvvtvy}‚‚‚‚~}|{||}€ƒƒ‚€~~}~€€€~€~{yxwuutsstw{€€€€€|vsty~ƒ€|zz{{{|}}}~}|}€~yuqnou|€€|vux|€€€€€€€}„„„„‚‚‚‚‚‚€€€€€€}}}}||||||||||}}}}||||||||||~~~~~~}}{}~}|{|€„…„}yz}~}}}}{zzz{{}€‚ƒ„„ƒ~zxwwwwwwwxxyxyyzzzzzzzz{{yyxxyyxxyyyyzz|}€€€‚‚‚‚~|{|||}|~€€‚‚‚€}|z|{x{ƒ€}{yxxxwx{zussv{}‚‚ƒƒ€}|zzz||~€€€€€€€€€~~€€ƒ€~{yxxxvvsuuz~€€€€‚€}yutw|€‚~z{{{{z{}}~~}{yz}~|xtpnpw}~~xttz}€€€€€~|„„„„‚‚‚‚‚‚€€€€}||||||||||||||||}}}}}||||}}~~~~~~~~~~}|~ƒ‡‡‚|yz}~}}}}|{zz{~ƒ„„„„ƒ€|yxwwwwwwwxxyxyyzzzzzzzzyyyyxxyyxxyyyy{{}~€‚‚ƒƒ€|{|}}~~€€}|z|{x{ƒ€}{yxxxwy}€zuttv{}‚‚ƒƒ€}|zz{|||~€€€€€~€€ƒ|yxxxvwwxw{~€€€€‚€}zvtw{~€€|{{{{z{}}}~~{wvy||wtposx~~~|wrtz}€€€€€~|ƒƒ„„‚‚‚‚€~}}||{{||||||||||}}~~~|}}|{||}}}}~~~~~~…ˆ‰ƒ~{{}~}}}|||||~‚„„……ƒƒ‚|wwwwwwwwwxxyxzz{{{{{{zyzyyyxxxxxxyyyyz|~€€€ƒƒƒƒ}|}|~€€€€‚‚ƒ|z{zv~‚ƒ€}{yxxxyz}ytrrtz~€€ƒƒ|zzz{{|}€ƒƒƒ‚‚‚€€€~€€ƒ|zyyyxxwxz~€€€€€€}{xuvz}€}|{{{z{}}}}yvx{}}~~~{vsopty~€€{uruz}€€€€€~{ƒƒƒƒ‚‚‚‚€~~~||||{{{||||||||||~€€€~~~~|||}}}}~~~~~~~~„‡‡…{{}~}}}||}~„……„…„ƒƒ~zxwwwwwwwwxxyxzz{{{{{{zyzzyyxxxxxxyyyy|}~€ƒƒƒƒ‚€~|~€ƒ……ƒ‚‚€||yxx~‚ƒ€}{yxxxy||wuurtz~€€‚‚}{{{{{|}€ƒƒƒ‚€€€€€€€~€€ƒ€}|{{{zyxy{€€€€}{xwwx{|{}||{{{|}}}}€~zwx{}}~~~{wsppu{~~~~zuruz}€€€€€{xƒƒ‚‚‚€€€~~~~~~}}{{{{{{||}}}}}}}}||~}|||~~~~~~~~~~~~~ƒ†‰…‚|z|}}|}}‚†‡‡†…„…‚~|yxxxwwwwxxxxyyzz{{{{{{zzzzyyyyyyyyyyyz|~€€‚‚‚‚‚€€„…††‚€€€|{xvv}‚„€}{zzyyyz}~yuuqtz~€€‚€~}~}|z{|ƒƒƒ‚€~}~€€~~€‚{z{{{zyyz}€‚‚~|{yyyyyz{{{{{||||{}~€€~{wy{}~~€€~{vsqrx|}~}}~~|yssu{€€€€€€}zuƒƒ‚‚‚‚€€~~~~~~~~~~}}}}||||||}}}}}}}}||}~~~~}|||~~~~~~~~~~~~~ƒ†‡‡„€~~€}}~…‡‡ˆ‡†…ƒ‚{ywvwwwwwwxxxyyyzz{{{{{{zzzzyyyywwwwyyz{|‚‚‚‚‚‚€€ƒ†‡††„‚€€‚‚€}|yvv|ƒ}{zzyyxxx|~{xsu{~€€ƒ‚‚€}|{|~‚ƒƒ}z|~€€~~€‚}{{{{zyyz}€€€}{{{{{{{yy{{{||||{}~€€~|zz|~~€€~{wsqsx|}~~~~~}ytsw|€€€€€€}ywƒƒ‚‚‚‚‚€€€€€~~~~~~~~~}}}{||}}}}}}}}}}||||||}}}}||}}}}}}~~~~~~~~‚…†‡…}~~€ƒ†‡ˆˆ‡‡…‚~zxwwvvvwwxxxxzzz{zz{{{{{{zzzzyyxxyyyyyy{}€‚‚‚‚‚‚ƒ„…†……ƒ„€€~€ƒ‚~~vu{‚}{zzzz{zwx}}xtu{~€€‚‚„ƒ„ƒ‚‚}||}‚||{{€€~€‚‚€}{{{{zyy{}€€€€€€€}|{|}~~}{zz{{{zz{{z|~€€||||}}~~~{wsruy}}~~~}xttw|€€€€{xwƒƒ‚‚‚‚€€€€~~~~~~~~~}}}{||}}}}}}}}}}||||||}}}}}}}}}}}}~~~~~~~~€ƒ…††‚}}}}~‚…†‡ˆˆ†ƒ€}zwxxvvvvwwxxyyzz{{{{{{{{{{zzzzyyyyyyyyz{}€‚‚‚‚‚‚‚‚„†…††…ƒ‚€€~}€€zvz‚}{zzzz|€‚ƒ~ysu{~€€‚‚„…„„„ƒ~||~~|z{|~€€~€‚‚€}{{{{zyy|}€€€€€€}|{|}~~}{xzz{{zz{{z|~€€||||}~~€€~{wsrwz~}~~~}xttx|€€€€€|zx„„‚€~~~~~~~~}}~~}|||}}}}}}}}}}||||}}}}}}}}~~}}~~~~~~}~~~~€‚…‡…‚~~~~€‚„††††„|yxwwwwwwwwwxxyyzz{{{{{{{{{{zzzzzzzzyyzz|€‚‚‚‚€‚‚ƒƒ„†††…„€€~‚‚€|{y{€}|{zzzxxww{zvrv{€€€€€€‚……„„„‚€}}€€}{{|€€€€€€€‚‚€~|}}{yyz{~€€€€€~{{}}~~~}{xyz{{zz{{z|~€{{|}}|~~€}wstx|}~||||wuty~€€€€~~ƒƒ‚€€~~~~}}~~}|||}}}}}}}}}}}}}}}}}}}}}}~~}}~~}}~~~~~~}~~~~ƒ…†ƒ€€‚„…††…ƒ|zxwvwwwwwwwwxxyyzz{{{{{{{{{{zzzzzzzzz{|~€‚‚‚‚‚‚‚€€‚‚ƒƒƒ„…†…ƒ€€€€€ƒ‚‚ƒƒ‚€}~€€}|{zzz{{}}{xttv{}~€€€€€‚„„ƒƒƒ€}}€€}{{|€€€€€€€‚‚€}{{{{zyz{~€€€€€~}}~~~~~}{xyz{{zz{{z|~€}{{|}~|~~€}wttx|}~||||wuuy~€€€€€‚‚‚€€€€€~€‚‚~~}}}}||~~~~~~~~}}~~}}}}}}}}}}~~}}}}~~~~~~~~ƒ…††„‚ƒ„„…†…‡‡„|yxuvvvvwwwwwwxxyyzz{{||{{{{{{{{{{zzz||~€ƒƒƒƒ‚‚‚€‚ƒƒƒ„„„ƒ€€~€€‚„‚‚€€~|{{{zy|}|xvux{~€€€€€€‚‚‚‚€€€~}||{{}~€€€€€‚ƒƒ}|{{zzyz}~€€€€€€~~~~}yxxy{{{{zz||€~{{|~~}}‚‚|wtvz|~}}}}~|wtv{€€€€€€‚‚‚€€€€€~€€††„ƒ‚‚‚‚€€}}~~~~~~~~~~~~}}}}}}}}}}}}~~}}}}~~~~~~~~ƒ††…„…†‡‡ˆ†……‚€~zwwvvvvwwwwwwxxyyzz{{||||||~~~~~~~~}€‚‚‚ƒ‚ƒƒƒ‚‚~~€€‚ƒƒ‚€~~€€€€~€€|{{{zyzz{usv{~~€€€€€€€€}{{}}{{{}~€€€€‚‚€}||{zzy{}~€€€€€€€€€€€~~|{yxxyzz{{||||~€}{{|~~}}€‚‚|vtuz|~}}}}~|xuw{€€€€€€€€€€€€€€„ˆ‰ˆ‡……ƒƒƒƒ€€~~~~~~~~~~~~}}}}}}}}}}||}}}~~|~~~~~~~~~~~~~~€ƒ††††‡ˆˆˆ‡†„‚€|zwuuuuuvvvxxyzyyyy{|{|~~}~~€€€€‚‚„„ƒƒ„„„„ƒ‚~}{}€‚‚‚‚‚‚€€~~~~€€€€€€€~~‚€{z{zzyy{vvz{}~€€€€€€‚}zzy}~~}{{}~€€€€€}|{{zz{|~€€€€€€€‚||{{yyyyz{|||{|€}|||~~}}€ƒƒ{wuuz}}}}~~€~yvx|~~~~€€‚}€€€€€€€€„ˆ‰ˆ‡ˆˆˆˆˆˆ††ƒ~}~~~~~~~~~}}}}}}}}}}||}}|}}~~~~~~~~~~~~~~~€€€ƒ††††‡ˆˆˆ‡†„‚yvtttttuvvz~€€~}{{{|~ƒƒ„……†‡ˆˆˆˆˆˆˆˆˆˆˆˆ††††„ƒ€~|}~€€€‚‚‚‚‚~~‚‚€~~~€€€€€€~ƒ‚~{{{{zzyz||}~€€‚„„‚|zz~€~|zz}~€€€€€}|{{zzz|~€€€€€‚ƒ‚‚ƒƒ‚~{{z{yyyyz{|||{|€€~|||~~}}€ƒƒ{utx|}}}}~~€~yxy|~~~~~€‚ƒƒ|€€€€€€€€€„…†‡ˆˆ‰‰‰ŠŠŠ‡„€~~}}~~~}~~~~~~}}}}}}||||}}}}~~~~~~~~~~~~€€€‚‚„………†‡‡‡…„‚}xtstsrrsw|ƒˆ‰ˆ†‚€€€„…„‡ˆ‰Š‹ŒŒ‹‹‹‹‰‰ˆˆ‰‰‰‰ˆˆˆˆˆˆ…„‚€~~€€€€‚‚‚}‚€~~€€€‚ƒ€€~€‚ƒ~z{{|zz{{}}~‚ƒ†…ƒ€€€{zz}~€€€€€€€}||z{y{}~€€€€€‚„ƒƒƒƒ‚{z{zyyxzxz||||{}~€~||}}~}}€‚ƒ€zuuy{}}}}}~‚{y{|}~€„…„|€€€€€€€€€‚‚……††‡‰‰‰Š‰†‚€}~~~}~~~~~~}}}}}}||||}}}}~~~~~~~~~~~~€€€‚ƒƒƒ„………†…„‚~zwtsttx|ƒ‡‡‰ˆ††„…‡ˆ‰ˆ‰‰‰‰‰‰‰‰‰‡‡ˆˆ‡‡‡‡‡‡††‡‡‡‡††††„ƒƒ€€‚ƒ…‰‹Š„€€€~€€‚€€€€€€~€€}~€€{x{}}ƒ‚€‚‚€€~{zz}~€€€€€€€}||z{z{}~€€€€‚„ƒƒƒ‚€}{z{zyyxzxz||||z{|~||}}~}}€ƒ„€ztvz|}}}}}~‚{y{|}~€‚ƒ„|€€€€ƒ„†‡ˆ‰‰ˆ‡ƒ‚€€~~}|~~|~~~|||||||||}}}~~~~~~~~~~~~~~€€€‚‚„†††…†„€zvvw{…‡ˆˆ††……‡‰ˆˆˆˆˆ‡††……„„ƒƒ„„„„…………„„……‡‡‡‡‡‡‡‡††ƒ€€‚…‡ˆ†‡†‡‚€~~~~~€€€€€€~~~€€~{|}~€ƒƒ‚€€ƒ‚ƒ€€€€‚{z|~~~€€€€€€€€}|zz{{}€€€€ƒ„„„€€~}zzzyyyyz{{{{zz|}}{||{|{~ƒytvz|}}}}}€‚‚€}z|}~~~}}~€ƒ‚|€€~~~€‚ƒ…ˆŠŠˆ‡„ƒ}}}||||~~~|||||||||}}}~~~~~~~~~~~~~~€€~~}}‚ƒ„„…………‚€~~…†‡††……ƒ„…†††„„…ƒƒƒƒƒƒƒ„„ƒƒƒƒƒƒƒƒ„„„„……„„„„„„††…ƒ„†‡†…‚ƒ„ƒ€€~~~~~€€€€€~~€€~}|~~€}}}}}€~|}€‚ƒ€€€€€€€€~{z|~~~€€€€€€€€}|zyz{}€€€€‚‚€~}zzzyyyyz{{{{zz|}~~}{||{|{~ƒytvz|}}}}~ƒƒ€~{}}~~~}}}~€€}€€~~†‡ˆˆ‰‰‡…„€~}}}}}}}}||||||||||}}~~~~~~~~~~~~~~~~||}}€‚ƒ……‡‡†„„……†…„„„‚‚ƒƒƒƒ‚‚‚€€~~€€€€€€‚‚‚ƒƒ‚„„„„„„„ƒ„…†ƒ{}„‚€~~}€~€‚‚‚€€~~€€~}|{}}||‚€€€€‚‚€€€€~}z{~~~~~~€€€€€€‚€}}~}|}~€€€€€€€€~}~~~~}zzzzyyzz{{{{{{z{~~||||{||}ƒ€ztvz|||||~€„„€~}}~~}{{|~€€~~~~‚„†ˆˆ‰‰ˆ„}}}}}}}}||||||||||}}~~~~~~€€~~~~~~~~€€€~~~}‚„…†……†……„„„„‚‚€~||{{|||~€‚‚‚‚ƒ€€}}}ƒƒ‚‚‚‚€€€}z}„„€~}}}€}z{‚……ƒ€€€€€€~|||}~€~}~€€€ƒ……„ƒ‚€€€}|z{~~~~€€€€€€€€€€~€€€€€€||{}~~~}zzzzyyzz{{{{{{z{}}||||{||}ƒ€ztvz|||||~€‚‚€~~~~}{z{|~~~€€€€~~~~}}€ƒ„†‰‰‰…~{|||||{{{{{zz||||||}}~~~~‚€~}}~~~€€€€€€€ƒƒƒ„„……††„„ƒƒ„‚~{zyyyyyz|~€ƒƒ„„„„„„ƒƒ€}{{{{}}~‚ƒƒƒ‚‚€~}€„†€~}|~„ƒ~…ƒ€€€€~~~~}zz|}~~€€‚‚‚‚‚€€€€€€~{{|€€€€€€€€‚‚‚‚€€€€€€€~}{{}|~~|{zyzzyyy{{{{{{{yy{{||||{||}€‚zuw{|||{}~€‚~~~~~|zxz{}~€€~~~~}}}~€„‡‰‰†|z{{||{{{zzz{{{{{{|||}~~~~€€ƒ„†††ƒ~~€‚‚‚‚ƒƒ…„„„„„ƒƒ„„„„ƒƒƒƒƒƒƒ~|{zyy{{|~~€ƒƒ„„„…………„„‚~}}}|}~‚ƒ…„„‚~~‚‚‚…~~~{yz}€€€~}~~~€~€‚‚€~~~~~}}{||}|‚ƒƒƒ„ƒ‚~€€|{|~€€}~~~€‚‚‚€€€€€€€~}{{~}}}|{zyxxyyy{{{zzyyyyzz{{{{{||}€‚zvx{|||{}~€‚€~~~}zxxz|}~~~~~~~~~~~}}}}€…ˆˆ†zyzz||{{{zzzzz{{{{{|||}}~~~„†Š‰‰ˆƒ‚‚‚ƒƒ„„„„„„†…††…‡„ƒ„„ƒ‚€€€ƒ‚‚‚~}|}~€ƒ‚ƒƒ„„„„„ƒƒ‚~~~~€‚„†…‚~|€~~~}„„‚}|~~~}~~}}}~€‚€}~~~}}~~~€‚‚‚€€€€€}z{|}€‚~}}€ƒƒ‚€€€€€€€€€€~}||}|{zxwwwyzz{{zzzzyyzz{{{{|{{|~€~zwy{}||{}~€‚€~~}{xvx{|~~~~~~~}}||}}}}€…‰‰ˆ{yzz||{{{zzzzzzzzz{{||}}~~€‚…ˆŠŠ‰ˆ†…„„„„„„………†††††…„„…„ƒƒƒ€~{zz~‚ƒ……‡†„€~€ƒƒƒƒƒ„„„„„ƒ‚~~~~‚ƒ„„‚€~}€~~~~}wz~~€}|~||}~||{z{{{}~}}}|{zz{}}}~~‚~~~~€}z{~~~€€~~€€€‚ƒƒ‚€€€€€€€€€€€€~}~~€€€~|{zxwwwyzz{{zzzzyyzz{{{{|{{|~€~zxz{}||{}~€‚€~}{xwy|}~~}~~~~~~~~}}||||}}„‰‹‰‚{yz{{{{{{{{{yyzzyyz{|}||~~€ƒ††‰ˆˆ‡†ˆ‰‰‡‡ˆˆ††……„„†…„…………„ƒ€}|zwvuz‚ƒƒƒ…‡ˆˆ†„ƒ‚‚„„„„ƒƒ…„‚‚€€~~€‚ƒƒ„„}zwy|}}||~~~€|vtw|~€€|{~}|z{zzz{{{|~~}~{{{zyyxwz|}}}~€ƒƒ€~~~€€z{}‚€‚ƒ„„ƒ€}}}€€€€€€€€}||~€€}{yxxxxxz{||zzzxyyyy{{z|||||~|yx{||{{{}~€€}zwx{~~~~~~~~~~~~}}||||}}„‰‹ˆ{yz{{{{{zzzzyyzzyyz{z{||~~€ƒ…………ƒ…†ˆ‰‰ˆˆ‡‡‡‡††‡‡†…„………‚zwtsrruz‚ƒ‚ƒ„†††††…„„„„„„ƒƒ‚€€€€€€‚„………„€{trtxxwxyyzuxzy{}||{zzz|{||||zzzyz|||~}{z|{yyy{{zyy|}}~~}~‚‚€~~~€€zz}~€ƒ„…„€€€€‚ƒ‚€~{{|~€€€€€€€€}||~€€}{yxxxxxz{{{zzzxyyyy{{|}}}||}}|yy||{{{{}€}zwx{}~~~~~~~~}}||||}}€…‰‰„|{|{zzzyyyyzzzzzzzyz{{||}~€€ƒ„„‚ƒ„‡‡ˆˆˆ‰ˆˆ‡†ˆ†‡ˆ‡†‡†…ƒ‚~wtppqqquz€ƒ„€}„†……††„„………„ƒ‚€€‚‚ƒƒ„……………‚|vtsuvustuy{xx„€{xxwyz|{{zxyzxwyyxxz|||}{{{{}~}}~~~}~€€€€€€€~{{~‚ƒƒƒ‚€€€€€€‚„ƒ€}|||}€€€€~|{}~€€}{yyyyyyyzzzyyzzyyxz{||}}{zz}}{zz{|z{{{}€‚€€€~~}zwx{~~~~~~~~~~}}||||}}}„‡ˆ…ƒ}||{zzyyyyzzzzzzyxyz{||}~€€‚ƒ‚‚ƒ„…………„†ˆˆ‡ˆ‡†‡‡†…„ƒ€|vsrqqrrsvxƒ„}{}€ƒ„………………„‚€‚ƒ„„……………†…„†„~ywwtuvvustw|}||{}}}{zwvxz|{zxwz|~}}|{zz|||}||{|}~~~~~}}€€€~~~~€~€ƒ„„„ƒ~~€~|‚ƒ‚||{|}€€€€€~~}}~}}}{yyyyyyyzzzyyxxyyxz{||}}{{{||{z{||{{{{}€~~~~}zwxz~~~~~~~~~~~}}}}}}}|||||~€…ˆ††ƒ||yyyyyyyyyyyyyyzzz|}}~~€€€€€ƒƒ„„ƒƒ…†‡‡‡‡‡†††„ƒƒ~{wsssssrstux~‚„‚{z|~€€‚ƒ……†ƒ‚‚‚ƒ†‡††††…„………†…‚~zzywtuvussuyz|~‚‚~{{zyvvz{zxvsu{~~zz|zyzz{{}}~~~~}}|{}~~~~~€‚€‚‚‚€€|xvx€‚‚‚{zz{~€€€€€€€€~~~~}}~~|zxxxxxxzzzzyyxxwxyzz{{~~}|{|||{z{|z||{}}}~€~}}~~yxyz~~~~~~~~}}}}}}}}}}|||||}~………†…„‚|{zzyyyyyyyyyyzzz|}}~~€€€€‚‚„„†‡‡‡‡‡…„„„‚€~{xvttttttstuvx|„„‚||}}~‚‚ƒ…„„„‡ˆ‰Š‰‡‡ˆˆ‡†…„„„ƒ~{{ywtturqruvy|€ƒƒ€|yxwvtwywusqpqsux{|}}|{zz|||}}}|{|||~~~}}~€€€‚‚‚€€€€€€{sry‚‚‚{z{}~€€€€€€€€~~~~|||||zyyyyzz{{zzyyxxwxyzz{{~~}zy|{{{{||z|{|~{{}~}}}~~{yz|~~~~~~~~}}}}}||||||||||}}~€ƒƒ…ˆˆ†„€~{zyyyyyyyyyyyz{{|~}~~~€€€ƒ„„‡ˆˆ‰ˆ‡†…ƒ„ƒ€}zxvvwxvvvuuuuvvw|„„ƒ}€€‚ƒ„†…‡‹ŒŒŒŠ‰‰ˆ‰‰ˆ…ƒ‚€€€€|{zzwtuvuttwxz~€„‚{ywvtttsrrrssuuuuuy{}}~~}~€€€~||~~~}}}|~||~~~~~€‚€€€~}€€|st|‚„„‚{z|}~€€€€€€€€~~|{|||{yyyxyy{{zyyyyxwxyzz{{~~|{z{{{{{|{{{|~‚{{}~~~~}}~~|z{}~~~~~~~~~~}}}}|||||||||||}}|}€€‚…†‡‡„~{yyyyyyyyyyyz{{{|}~‚…†ˆ‰‰Š‰‰ˆ†…„‚€~{zxwuvwyyywwvvvvwwx{‚„„ƒ€~~€}{{~€„†††……‡‡††††ƒ~~}}|{|}zxwwtutv{|xx{}|zxtsuusolmrwwvvwvtvz~ƒ„‚€~€€~}||~€€~}~€~~~}~€€€€|y{}zvx‚„„‚}||}~€€€€€‚ƒƒ‚‚‚‚€~~}|zzyxyy{{zyyyyxwxyzz{{~~|zyzz{z{|{{{}€~xy|}~~}}}}zy}~~~~~~~~~~~~~~~|||||||{||||||||}}}}}}‚ƒ…‡‡‡ƒ}zyxxxxwwyyyyzz{|€ƒ…‡ŠŠŠ‰ˆ‡‡†…„‚~}|{yxxxxxxxxxwwwwwwwxy{~‚ƒ„ƒƒ‚}vuwxxwz|}„……ƒ~‚†‡„€€}ƒ‚}xvvvtwxwrpuxyzwustwwphhpvyxyyyxwy{~~ƒƒ‚€}{|~}€€€~‚‚}~{zz|~}€|{z{}||}~|z|€‚ƒ…ƒ~}}~€‚ƒƒƒ……„„„‚‚‚€}|zyyz{{yxxxxwwxz{zz|~{yyzzy{{{{{{|€zvy|~~}|wwy}~~~~~~~~~~~~~}}~~|||||||{||||||||}}}}}}}}}‚„‡ˆ‡}zzzzzyyyyyyzz|~‚ƒ…‡ˆˆŠ‰ˆ†…„ƒƒ€}|{zxyyyyyyyyyyyxxxxxxxyy{}€ƒƒ„ƒ‚}|xusrsuvvxz|||}}}‚‚ƒƒ„††‡…ƒ€€„‚}yuvvtrqrnknsw{zwtttuoecjswxz{{zyvx{{z~}{zz}‚ƒ€€€}}}~~}{zz{{|~~{zz{|||||€}~ƒ„…„ƒ€~~~‚‚ƒƒƒƒ‚‚€€€|{z{{yxxyxwwxyzzz|~{yxxyyz{{{{{|€~yvy|~~}{wvy}~~~~~~~~~~~~~~~~~||||||{{{{||||||}}}}~~}}}}€‚†ˆ‡…‚~|{{zzzyyyz|}ƒ†‡ˆˆ‡†‡†„‚€€|{zz{zzzzzyyzzzzzzyyyyyy{{z{{‚ƒ}wolotuqsyy{{z}~‚„ƒƒ„ƒƒ‚‚‚€~ƒ‚zwwuupklnlmpw}}xuttsoihlswy{||{{xwwwtx‚€|z{~‚€€€~{||}{xuvxz{}{xxx{|~}€‚€~€€„††ƒ€€€€‚„„‚ƒ‚€€€€€€ƒ‚ƒ}{zyyywwxxwxyzyz|~|xwwwy{{{zz|}€‚~zvx|~€~{vux}~~~~~~~~~~~~~~~~~||||||{{{{||}}}}}}}}~~~~~~€„‡ˆ‡…ƒƒ‚}}|||}~€ƒ†ˆ‡‡†…„‚€~}||||{{||||{{{{{zz{{zzyyyy{{{{{|€ƒƒ€~€€yrlinrrnpux|||~‚„ƒƒƒƒ‚‚‚€~}ywwunmiopnnrvsmmptusomptwy{||{{yxwvstxƒƒ}‚ƒ‚€€}|{{}}|}zyz{{x{~~€€‚€‚ƒ…‡„‚‚‚‚‚€€€}|~~~€€€~|zyyyyxwwxyzyz||xwvwyz{{zz|}€‚€|x{|~€€~yuvy}~~~~~}}~~~~~~}}||||||{{{{||}}}}}}~~~~‚†ˆ‡†‡‡††ƒ‚~~€ƒ„†‡†…„ƒ€~|}{{{{||}}|}||||{{{{{{{{{{zzzz{{{{|~€‚„ƒ€ƒ‚|smjlmrvux{}}}‚ƒ€€€}|ƒ‚zxvrmiglqttromlmquvtqoruwxz{}{zyyxvtppty}€€}ƒ…ƒ€€}}~}}~~}yx{{||€€€€€~‚‚‚ƒ„„„‚€€€€€€‚ƒƒ„„„„‚€~~}|{{}~~€|yyxxvvwzyy{|}€€|xwvvxzzzzz{}€‚{|}~~~|yvw{}}~~~~~~}}||||||{{{{||}}}}~~~~~~€‚„†††ˆˆˆ‡…ƒ‚ƒ„…†††„‚|zz||}}}}}}}|}||||||||||||||{{{{|||||~ƒ……‡„€~|ztlhikr|€~~€€€€~~}€||…ƒ€|yvohdelrvvtroooqruutstuwwwz{~|zwvxxwuuvwxww|€‚‚‚€€€€€€€~}}}{z~€€~€€€€€~~‚‚‚‚‚‚‚€€€€€€‚ƒ„††‡‡†„‚~}|zy{{|~€€~zvwwvvvxxyz|}€€|xuvvxzzzzz{}€‚€|}}~~~|yvx}}}}}~~~~~~}}}}||||{{z|||}}}}~~€€‚ƒ……‡ˆ‰‰‡………„„„‚~{{zz{|~~~~~}}}}|||||||||||||||||||}}||~ƒ…„‡ˆ†„ƒƒ‚€|unlmv€‚~}}€~}~€}z|…„‚|ytnf`emrtwwtrrssrtuusstustyz}}xtsuwxwstwwwx|€€€€€€€€€~~}||yz}}}€€~€€€~}||‚‚‚‚€‚‚€€€‚‚‚……†‡‡†„‚~~~|{zzyz|€|ywvvvvxxy{z}€€}xttwyzzzzz{€~}~~~~~~~}{ywy|}~~~~~~}}}}||||{{z|||}}}}~~~~~€€ƒ„†††………ƒ€}|{{|{}}}~~~~~}}}}|||||||||||||||||||}}}}€„„†‰ŠŠˆ†…„„€~{vtw}€€‚~}{{{|~€€~|z||y{€‚„…€ztnfcfmsvxxwwvuttuvwvwutqruvyywrqsuxvttvvwwz|}~€€€€€€€€€€~}}}zz|zwvtw{~}|~€‚‚‚ƒ€‚‚‚‚„……„„…ƒ~{{|}zyyxwy{~‚|yvvvvxxyz{~€}xttwyzzzzz{€}{|~~~~~~~}{ywy|€‚‚~~~~~~}}||||||||||||||~~~~~~~~~~}}~‚ƒƒ‚~|{{{}}}~~~~~~~}}|||{||||||||||||||{|~~~~|‚†‰ˆ‰‹‹‹‡……ƒ€‚„€zy{~~~‚~zyyzz}€€~{xz€†‡†€ztojegnruvvxxxutttwxyz{yusuwwvrporssrqrtuvxzyz|}€€€€€€€€}}}~~€~|xtns|€~‚„„„ƒ€€€‚‚‚ƒ„ƒƒ‚„ƒ|yyyyzxxxvvz}yvttwxxxy{~€€zustwyzyyxz}~{xz}}|||zwwy}ƒ…~~~~~~}}||||||||||||||~~~~~~~~~~~~}|||}~~}{{z|||}}~~~~~~~~}}|||{||||||||||||||{|}}}}~€‡‹†~„‹‹Š…„„ƒƒ…‡‰…}z{€€€|zyyyxz}€€€~|wtx‚†‡†ztojfgnruvwwxxuttvwxy|}ywuwxwtpnnooonorsuwyzyz{}€€€€€€~~~€€}zvtx€‚‚‚‚ƒ€€€€€€‚‚‚ƒ„ƒƒ‚‚€~zwwvwxwxxuvy{}€‚}xuuwxxxx{~€ytqtwyzyyxz}€}xwz|~}}|yvz‚……ƒ‚~~~~~~~~}}||||||||||||~~~~~~~~~~~~~~~~~|}}||||||}}}}~~~~~~~~~~~~}}|{||||||||}}|||||||||}‚‰‡z|€„…ƒ€ƒƒ‡Šƒ}|ƒƒ~|||zyvwy~}~|zurw€†ˆ‡ƒ}unkhhnsstuxywsqsuwyy||zxxyxvsommljgkmqtuxz{|{z{|}€€€€~}}ƒ„‚€~zvuy€‚‚‚‚‚€€‚„‚€€‚ƒ„‚ƒ‚‚|yuuuvvvvuvwwyz|~|ywwxxxx{€}xsrtwxyyyx{~}uu{}~€~}|{y|‚ƒ‚‚‚ƒƒ~~~~~~~~}}||||||||||||~~~~~~~~~~~~~~~~~|}}||||||}}}}~~~~~~~~~~~~}}|{||||||||{{|||||||||}…‚}z}xwz|yssx{xttx‚†ƒ~}|~~}~~{ywvyz{zwtqw€ƒ……ƒ}umkhjnstuxxwpjfgijmrsvwvvwwtqokgddhgkruxz{|}|{{z{€€€„…†…ƒ~}zwyz|}~}}}{wz‚ƒ€€‚ƒ„‚ƒ‚{wtsstvvvuuvwyy{~€€|wwwwwx{~€|wrqtwyzyyx{ysu|~€~}||„ƒ‚€€€€~~}}}}}|}}||||||}}}}~~~~~~~~~~~~~~~~~~}}}}||||||||~~~~~~~~~~~~}}}|||||||{{zz{{{{|||||}{z}zrttuvtuvspoont|‚|zxw{~€~}zwvvxyzwrry€ƒ„†‚}wolihlruxxwrg_]]\`joqsqrrtsrqmhdddijmrx|~~~}{z{}€|z|~€„†}ywwwywvsuz}}yw|€‚ƒ€€€€‚‚ƒ‚‚|yvssrsuuvutuwwxz}€~zxwwwy|~~zuqqtwz{yxx{€}vty}~~}{|€„„‚ƒ~~~~~~}}}}}}}|||||||}}}}~~~~~~~~~~~~~~~~~~~~}}}}||||||||~~~~~~~~~~~~~~}}}|||||||{{{{{{{{{{{{z{|zwxzwruz||zrnoonnt}}xvvz}€~}{xwwxyyxvvz€„……ƒ}xqnjimsvxvvpcTOOMWdorsqponllikjiggjmnosvz}~|zyz}€~{{|}„‡ƒ{ywx}~||~~|wvx|€€€ƒ€€€€€€‚‚ƒ‚‚|wtrrrsuuuttuwwxx|}€|ywvww{~~zuqqtwz{yxx{~€{vty}~~}{}‚ƒƒ‚~~~~€€~~~~}}}}}}}|||||||}}|~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}}}{||||||}}}}~~~~~~~~~~}|}|||||||{{zz{{{{{{{{{|}yvuzvnqwwz~~tqoopos|~vuv{}~}{zxwxxwwwxz‚‚ƒƒƒ~unjkpsuuuvqiTLNV_irttsqoifeefhigefmqrsuwz{{yxxz|~}|}|{}€‚†‰Š…|zwz}€|urrv||}~ƒ€€€€‚ƒƒƒ‚€|vtqqrstttstvvvwwz||}€~ywuvx{~yrpquxyyyyx{{uty}}~}|‚„„ƒƒ~}}}}~~~~~~}}}}}}}|||||||}}|~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}}}{||||||}}}}~~~~~~~~~~}|}|||||||{z{{{{{{{{{{{||xpnqplmrssw{ztqqqooq{€yvw{|}}~}|{yxxxvvuwy|~z}€ztpqtuuvttpka\[bhmqrpnmnnkigeccccgntttuxyzywutwz}}}~€…ˆ…„„‡ˆ‡ƒ{y{|~€€|yxtorv{€€€€€€‚ƒ„ƒ‚~{urqqrstttstvvvvvyz|}€zwwwx{~xrpquxyyyyx{~ysuz}}}|‚„ƒƒ‚€}}}}}}~~~~~~~~~~~~}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~~}}}||||||||}}}}}}}}~~}}||||{|}}||||||||{{{{|}|wohhklosqory{uprtsqu||wx||||~~||{zwvuttvww{{{}€zwvvututrnifbchopoljgfimqpmhe_Z[dpvxxxxxvsnmprw|‚‚~~}…Œ…~z{|}~€€€~€}vqpuz}€€~~€‚……ƒ‚}yurpqssssstvvvuuuvx{}€€|wvvx}}vqqrwxxxwxx{zttz~~}€‚„„ƒƒ~}~~||}}~~~~~~~~~~~~}}}}}}}}}}}}~~}}~~~~~~~~~~~~~~~}}}||||||||}}}}}}}}~~}}||||{|}}||||||||}}}}|}}xpkkjkmpmmpv|ytsvvtw|~|yz||||{|}|zywvtstuvvx||}~~|yxwvwwwtoljhkopolgb``chnpnjgc_`hrvxxxxurmhhnsvz~~‚ƒ~~~~~‚‡‡ƒ€}|~~€€€‚‚€ztqotwz{|~}€„…ƒ‚|xtqpqssssstvvutttuwz|€€|wvvx}~{uposwxxxwwy{~~xtvz|}€ƒƒƒƒ‚~{y{||||}}~~~~}}}}}}~~}}}}}}}}}}~~~~~~~~~~~~~~~~}~~~~~~}}}|}}||||}}}}}}}}~~~~}}}}}}{{{||||||||||||||||}zrljklmlghks{zxvuuvy}~}{{|~|z|{{{zzwvvsrruux|€}}}|{yxvvwtpnlnoqrpkd]XX]cjomidb^_fptuvxxtnhdfovwxyyz{~~~€€„‹””Šƒ~}~€€€‚€€}{sopqqty}‚ƒƒƒ|wtrqrrrrrstvvutsstwy|{wuvy|ztppswyxxxwy{~|urvx{‚ƒƒ‚‚{vy{{{{{||~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}~~~~~~}}}|}}||||}}}}}}}}~~~~}}}}||{{{||||||||||||||||}zrljlllgdfjqy}zywxxz}}|||{||z{zzz{zyxvussstty€}}}|{yyyyyvnjmoqqqokcZVW_fhecbaaacgnqrtuurlfadkruwzz{}{xxz}‚ƒ…‰‹‰„€~}~€‚‚€€€€zwvy|~€€‚ƒƒ€{wrpoqrrrrstvvutsstw{~zusuy|~ytppswyxxwwy|~zvtux‚ƒ‚{vuy{{{{{zz}}~~}}}}||}}}}}}}}||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}{{||}}}}}}~~}~~~}}||||zz{{|||}}}||||~~}}~~~{rkhkmkedhnr{€~{zzzz|}|{{||||{zzyzzzzywtsrrsv~€€~}|||yxyyxuoklopppmib[XZdc^VXY\^cgjmpqrstqkgcciouwz{|}|zwvy~€‚†††‡‡†ƒ€~}€‚ƒ€€€€~}~~~‚ƒ‚zupoopqqssstvvusssrv{~€€{vsuz}|wrnpsyyyyvvy{~ystw}‚ƒ}vrtz{{{zzz}}}}}}}}}||}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}||||}}}}}}}}}}||||{{{{|||}}}}}}}~~}}~~}skijkieflsv|~|}}z|}|{{||||{{zz{{zyywsqqrsv{€€|vuvwxupmljjlmnkf__iok[KNNOWagjkloqrqoiebcimrvz{|}}€€‚ƒ„‡†‡‡‡‚~ƒ‚~}}~~~~~‚}ytpoopqqssstuuussstx|€ytsuy||wqpqtwwwwvvy{|wsty‚‚yrrw{}{{zzz}}}}}}}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||||}}}}}}}}}}}||||||||||}}}}}}}}~~~~~}ukhhijgipuy|~~}~}||{{{{|}}{{{zz{||zxrpnorsx~‚}wrstvwtpiecfjkkhdhjlh\RKHHPZefbagopokgc``cgmv{|{{}„…†ˆ‰‰‰‰Šˆƒ€€€€~}~ƒ‚~}}}~€~~~~~~€€~|wsonoppqssstuuussstw}~xttvy{{vopruwwvvvvy{{wsw~‚‚zurrw{{zyz{|€}}}}}}}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||||}}}}}}}}}}}||||||||||}}}}~~~~~~~~ƒƒ|pjjkkoquy}~}||}€€|{{{}~||{{{yzzwtpnmnqqtz€~xrqqtvsohcdghg^_cjlmhaWQNMOYfaWW`imnkfb_]_bmu|}{{}€ƒ…†††‡ˆˆŠ‰Š†ƒ‚€€ƒ‚||}~€~~~~~~~~€~|xspmlmpqssstuuussstw}~wstvy{ztopsvwwvvvvy{{wu|‚ƒ‚‚~{wurrw{{zyz{~‚||||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||||}}}}}}{{}}}}~~}}~~~~}}~~‚‡‡vpnmovxz|~}{|}~~ƒ„‚}{{|}}}}|{{zyvtrqmjkoqqu{|zuqnorrqoheehlh]UXckig_WTVY^bi`WPYekjga_^\`dmv||{|„…†……†‡ˆ‰Š‰‡„ƒ„„‚€€ƒƒ}}}~~~~~~~~~€‚€}{wsollmprrrssttssrrvy~€|vssuz{xsopruwvuuuvx{yw{„„‚zvvrotyzzzzz}€„||||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||||}}||}}~~}}}}~~~~~~~~}}~‚†‰ƒ}xvvtux{}~}|}~€„‡‡…}}}}}}}|{zyxvsqnmlkmopqtwwxvuqpnnppqogbempm`VWYacd^YZ``_`d^ZPS`hcUSV]]`dnty~~|{}~‚ƒ‚ƒƒ…ˆ‰Š‰‰†„„„ƒ€€‚ƒ€}}}~~~}}}}~~€}{wsolkloqrrssttssrrvz€{vssuyzvqnoruvvutuvxzw{€‚‚€{xxzxx|~ƒ„||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}{{||||}}||||||||}}}}}}}}~~~~~~~~}||€†ˆ†€~~zzz|~~}{|~€‚ƒ†ŠŠ‡„€}}|~}||zyxvspnnonklorsrrqpqtrnkmopogcfkigdYQV\bca`bc_\XYVRQU^fcSJNY\`fnsx~~}}|}|~€‚„†ˆŠ‰‡††„ƒ‚ƒ‚€}{}~}||||}~€~{yvsojklopqrtttrssqrvzzsrsuyyupnpruuttstvxxz~‚‚‚€~||€€€‚ƒ„ƒƒƒƒ„„„„||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||||||||||}}}}}}}}~~~~~~~~~~€„‰ˆ†„‚‚€€~z}~}|~€€‚…ŠŠŠ‡…ƒ€~~}||zyxvromkmmkjnprrttqnoqqlklnmiegic]Z[UW[a`^\_fga\XTOTX]baWMOX_ekrvz}}~~}~€€€‚ƒ……‡‡††‡„‚‚…„€~~~~}~}||||}~€€}zxvsojjknoqrtttrssrtx|€€~ysrsuwwtonpruuttsuvvz‚‚‚‚‚„„„„„„„…„„„„„„„„||}}||||}}}}~~~~~~}}~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{||{{{{zz||||}}}}}}}}~~~~~~~~~~~~‚‡‡†…‚‚€€{z~~}~€€‚ƒ„ƒ„‰‰Šˆ‡…‚~~|{zxwtrnjklmjjlorrturmonjinoonlhiicYY\Z]aa^TOZiojbZXZ__`de[PT\dkqvz|}}~~~~€€€€‚‚‚‚‚‚…‡ˆ††ƒ„††‚~}~~}|||||~€€|{xurniijnpqrtttrrrruy}€€~yrqsuwvqnnpsutsstsvy‚‚‚‚‚ƒ………„†„ƒ„„ƒ‚ƒƒƒƒƒƒƒ}}}}||||}}}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~||{{{{}}||||}}}}}}}}~~~~~~~~~~€ƒ†ˆ…„ƒ‚‚€€zz€~}}~~€€‚‚ƒ…††ˆ‰†‚€}|zxvsqmjhjjkkkoqrtsqnmklprqppljjlf^[]abc`VMUalojb]^enmhig`Z]ckrwyz|}}}}€‚‚ƒƒ„‚‚„„†ˆ‡„„†ˆ…€€~~~}|||||~€€~{zwurniijnpqrtttrrrsvz~€}wrqsuvtpmnpsutsrstv|€„„……………ƒƒ‚€~}}‚‚‚ƒƒ}}}}|||||}}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~~~~~~~~~}}~~~~}}||{{|{{||||||||}~~}}~~~~~~~~~~~„‡ˆ…ƒ‚ƒ‚€}yy||{|yyy|}}€‚…‡†ƒƒ‚~~|{wqnmighjnonnqrttsomnrrppopljlke]]aefaYNS]gnnjgdbfooiiiaY[dnuxzz|}}}}~€„ƒ……ƒ‚‚‚ƒ…Š‹‰…†ˆ‰„€}~}||{{{~~|zywvspljknoqrtttrrrsw|€€|uqqsuvromnrsutsssvz€ƒƒ„„„„„„„zxz{|y{€‚‚€}}}}|||||}}}~~~~~~}}}}}}}}}}}}||||~~~~~~~~~~~~~~~~~~~~~~}}||{{|{{||||||||}~~~~~~~~~~~~~~†‰‡„ƒ‚ƒ‚€|{}|zyxwwwwy{||…†„„‚~}}{xqnmkiikoqsrsssstsrssqrrrppool_Y^ehe]UT^gloligecipkcbfc\]epvy{z|}}}}~~~~~~€€€‚ƒ„‡‰ˆ†‡ˆ†„‚€~}||{{{~~}{yxvvspljknoqrtttrrrty|€zuqqsuupmlnrsttsrry‚ƒƒƒƒƒ„„}{vqrtwz{y|€ƒ‚~~||}}}}||~~~~~~~~~~~~~~}}}}||||}}}}~~~~~~~~~~~~~~~~~~~~~}}}||||||||}}}}}}~~~~~~~~~~~~~~€‚…ˆ‡…ƒƒ€ƒ‚€€~|~|xxxxvvuw{||‚„…ƒ‚}|||zrnmlllmprvvvtttttuvtqrttrrqpi`[bkne[V\ejmnkgddgmmidegdbekruz|}}~~~~~}||{|~€€€€‚ƒ……†††‡‡…‚€~~}{zzz{}~}{zxxwvtqnllmoqsssrrrruz}yspqrttplloqtssrqu|ƒƒ‚‚‚‚}vsqomorxyz|„}{}}}}}}}}~~~~~~~~~~~~~~}}}}||||}}}}~~~~~~~~~~~~~~~~~~~~}}}}||||||||}}}}}}~~~~~~~~~~~~~~€€„‡‡…ƒ‚€€ƒƒ€‚‚€}{|zxxxxvvuvz|}~ƒ…„‚}|}|zrnmopoprtxxxwvvttvtsrsuusrqqj`_gnph__ejmnmjfefikkhiihffjmquz|}}~~~~~||{z|~€€€€€€€€ƒ„……ˆ‰‡„€~€~|{zz{}~~~|zxxwvuqnlmnpqsssrrrrvz~€~wrpqrtsommpstssrtz‚ƒƒƒ‚‚}wsponmlmsyz{~€ƒ‚~{z~~~~}}|~~~~~~~~~~~~~~~}}}}||||}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}||}}}}}}}}~~~~~~~~~~~€„ˆˆ…‚‚‚‚€‚~|z{yxxxxvvuvxy{|}‚„ƒƒ€}z{|yuomprtuvx{{{ywuttvurruuttrqrngekoolhilopnhgfeghffimlihkmprvz||}~}~~}}{{z{}~~~€€€€€€‚‚„†‡†„}~€}{{{{|~}|{zxxwvupnmmoqqrssrrruy}€~wrpqstqnlmpsssrsyƒƒƒ€~xsrponnmloswy{‚~{zy~~~~~}|~~~~~~~~~~~~~~~}}}}||||}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}||}}}}}}}}~~~~~~~~~~€…‡ˆ†ƒ‚‚€‚ƒ|ywxxwwxxvwwwtnlmx‚…„ƒ€}zyzzxroqsuwz}~~}|yxvvvuvvssqppoqokkoppmmnqqogaacbaaadjmmklnpqux{||}|}}}zzzzyz}~~~}}€€‚ƒ„„„„ƒ~€}{{{|}|{{zxxwvuqnmnpqqrssrrruz}€{tqpqstpllmpssssv|ƒƒƒyrppooonkjmqwz{}€‚‚€}zxx~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~€„ˆ‰†ƒ~~‚„‚~ƒ…}ywwvvvwyyyxxqmjjr€†„‚~y{{{ywtrtwz|~€yxwvvutsssponloqpprrommprqmd__aba``glonmnpprvy|}}}}}|{{{zz{{}~~~~}~€€€€‚…††~€}{zz{||{zzzxxwvuromnqqrssrqqruz}€€~ysqpqqqnkkmqssuv|ƒ„„ƒspoooomlkjnuwy|€~yxww~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~€„ˆˆ†„„€~~ƒƒ‚€€„„€{ywwvvvwxyxwurnmmp|……‚€€€~|zxuvwz|~€|{zxvvutsqnmnnpstuutpoprsrngcccdcdhloplloqrtwz|~}}}}|{{{zz{{}~~~~}~€€€‚„…‚}~|zzz{||{zzzxxwvuromnqqrssrqqsvz}~~|wtqpqqqnkloqssw{„„ƒ„‚wponnnnmlkjnuyz}€€~yxww~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}}|~~~~~~~~~}}~~~~ƒ‡‡†…ƒ‚}}€‚ƒ…ƒ€„{ywwvvuwxxutttrqmn{…†ƒ€€€€~|zxxxy{|~€~{yyyxvuutrooqsttvvwvtrqruuqjedeeefhnponoprsuz|}}}}|||{zzzzz{}~~}~~€€€€€€€~~~€~~{zxx{||{zzyyxwwtqonnpqssrqpqty|}|||vrppppomllortv{€‚ƒ…ƒ„~qnlnommlkkkntxz€€{yxvv~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}}|~~~~~~~~~}}~~~~†‰‡…ƒ}|~€‚ƒ„„„€}ywwvvwvvurrry{vtu}…‡„‚€€~{zzzzz{{|}~}|{zyxwvwvtsstuwwwxzzywstvvsokihfegipqppqrtuw{|}}}}|||{zzzzz{}~~}~~~€€€€€€€€€€€}~|zz{||{zzyyxwutqonnpqssrqpqty|}||ytpopponmlmpsux}‚ƒ„„ƒ~vllmmnmmlkkkovz}€€~zxvvv~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}||}}~~~~~~}}~~~~‚†ˆˆ…„€}|~€‚„„„‚~‚ƒ€}ywwvxwvuropsy|{}~…‡†‚‚‚€~}|{zzzz|||}~~~~|{zzyxxvvvvvwwyy{}}|xvvwwupnkihjlrqrrtwwx{||}}}}}|{z{zzzz{|~~~€€€€€€}}{zzz}{{z{{zxvtttsrpopqrrrrorw|}}|zuroooonmlmnprw|‚ƒ„‚zollmmmlkkjilrx{€€}yuutv~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}||}}~~~~~~~~}}~~ƒ‡ˆ‡…ƒ{{~€‚„…ƒ~}€ƒ€|xxxxxvsspmosw}€€††ƒ€€€€~|{{{|||||}~~~~|{zzyxyyxxwxxxz{|}}|zyvwwwurqomnosttvwzzy|||}}}}}|{z{zz{z{|~~~~~€€€€€€}{xy{}}{|||{{{zxvtsssrpopqrrrrrux|}|zwrpoooonmlmnptz‚ƒƒƒ{rmllmmmlkkjjmsy|€‚~{vuutv~~~~~~~~~~||~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}~~~~~~~~}}~~€…ˆ‡†ƒ€~||‚‚„ƒ€€‚ƒ€}yyzzyxurpmmrw|}{{ƒ†„€€€€€€€~~~|}{zyzyzyzxxwwxy{}~~~}{xwvvyywutrtvuwxz|||}~~}}}}}|||{zzz{{}~}}€||{xuuy~}{{zzzzxvtrrssqpprrrqqrvz|{{ytqoooooomkmoru{ƒ‚€yqmkllmlkkjiinuy}‚‚|xvvvvv~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}~~}}~~~~~~~~~~~ƒ‡†…„}|}}‚‚ƒƒ„‚~€|y{{|zxuqonqv{}~{x}‚‚€€€€€€€€€€€~|{zzyyxyyzyxwwxz{}~~~}{|z{zz{zyxxxyz|}}}}z|||}}}||||||{||{|~~€~||}|zxz}‚}{zzzzxvtrrssqpprrrqqsx{}zywsonoooomlkkns}‚ƒ‚€|tnkkllmlkkjiintx|€‚€{wuuuuu~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||}}~~~~~~~~~~~~~~~~†‡……ƒ||}}€€€ƒ„ƒƒ„ˆ„~€‚~zz}}{zxuqorvz{|{|‚ƒ‚€€€€€€€€€~|{zzywwyy{{yxwx|}~€~~~}}}}}||}|{z{~|z{yyz|}}||}}}}}}}}~~~~~~~€}}{{|{|€‚‚~zyyyxxwusqrtrqqsrrssvz||zxtrpnnnommkikov}€ƒƒ‚€€yrmklmmmkkkjjkou{}xuttttt~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~„†„ƒ~||}~€ƒ„ƒ…ˆˆ„~}€}ywx|}|zwsqrtwxx{}ƒ…„€€€€€€€€€€~|{zzyyyyy{{zyxxx{}~~~~~~~~~}}}||}}{yxyyzz|}}||}}}}}}}}~~~~€‚‚‚€~~}}{{|}}€}{zyyyxxwusqrtrqqsrrstw{||zwsqpnnnommkkmsz€‚ƒ‚€}vqlklmmmkkkjjlpvz|vtsssss~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}}~~~~~~~~~~~~~~€ƒ……‚€~|}}~€ƒ†‡ˆ„‚|{~€{vsty€~{yvsrquyz}€„„€}}{{{{zzxxxz{{xwwy}~~~~}}}}~{xxz{}~|~}|||}}}}}~}}~~~~‚ƒ„ƒ‚~}}{|{{}~€}|yzzxxywusqstrqqsrssu{{||zvroooooomlkjnxƒ‚ƒ‚zsnljkllljjjiimrv|€‚{vsrrrrr~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}}~~~~~~~~~~~~~~€ƒ……‚~||~}~€ƒ…†‡†‚~~}~€|wuvy~€€}{xurruz{}€~}€„€~~}}||{{zzzzz{{{xwvw{~~~€€~}}}}}||yxy{}€€~}|||}}}}}}}}~~~~€‚ƒ„„ƒ€}}|{|€€~|yzzxxywurpqrrqqsrstx{{{{xuqoooooomlknt{ƒƒƒ„~xpmkjkllljjjjjmry~€‚~yurrrrrr~~~~~~~~~~~~~~~~~~~~}}}{~~~~}}}}}}}~~~}}}}}}}{||||||||||}}~~~~€€~~~~~~€~|~€„„ƒ‚{||~~~ƒ†ˆ‡ƒ~~~|~€}xvwy}€~}{wuvy{y{}{xz‚‚€~~~~~~~~~~~~~~~~|{{z{zx{|{zyxxwy|}}~~}}~{zz|€‚ƒ‚€~}}|~}}}}}}}~~~~~~€„„„„ƒ}€€~€|{zzyxxwuqooprrrrrsw{||zyvspooooonlkknw~ƒ„„„|upllkkllmkkkijptz~€€€{xusrqqqs~~~~~~~~~~~~~~~~~~~~}}}{}}}}}}}}}}}~~~}}}}}}}{||||||||||}}~~~~~~~~~~~~€~~~€„…„ƒ‚||~}~~ƒ†‰‰…ƒ‚€€~|~€}usu{|~€|yyz|{xyyywx~€~~~~~~~~~~~~~~~~~}}}}|{y|}}|zyxwxz|~~}||}}~|{zz~‚„„ƒ€€~}}}}}}}}~~~~~~~~€„„„„ƒ‚€}|~~€|{zzyxxwuqooprrrrsuy{|{ywtrpooooonlknr{„ƒƒƒ~yspllllmmmkkkjkpv}€zvsrqqqsu~~~~~~~~~~~~~~~~~~~~~~~~~~||~~~~~~~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~~€~~…‡………|||~}ƒ…ˆ‰…„……ƒ~z}€|vsx{}}ƒƒ~}}}}zxxxxy}~~~~~~~~~~~~~~~~€~~€~~}{|}}||zzzzyy{}~€€€}}~~|zzƒ…„‚€€‚„ƒ€~~}~~~~~~~~~}~~|~€‚ƒƒƒƒƒƒƒƒƒ‚€€€|zyzzyxvtonoprrrstw|||zvvsqpooooonmlnvƒƒƒƒ‚€|uqomllmmmmkjjjnqw|€ytsrrpqvy€€~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~~~~€ƒƒ~„††…†ƒ{{~†‰ˆ†…‚‚††…‚y|~zvx|~|ƒƒ€}zyxyz{|~~~~~~~~~~~~~~~~€€€}}|}~~}~}|{z{{z{{}~}}}}}~~}{{€ƒ…ƒ€€‚‚€€~~}~~~~~~~~~}}}~€‚ƒƒƒƒ…‡„„‚ƒ………„ƒ‚€}|zzzyxvtonoprrrsw{}}{yussqpooooomknrz€‚‚ƒ‚xsqomllmmmmkjjkosz~€|wsrrrrtx{~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||{{||||||||}}}}~~~~~~~~~~~~}……††……‚}|„ˆ‰…‚€‚†‡†„xx€~yy||z|€‚ƒƒ€~~zwxyz{}}}}}}~~~~~~~~~~~~€€~||||~}}~~||||||z{||}|||{}~}}||}……ƒ‚‚‚€€~~~~}}~~~~}||‚‚‚„ƒƒƒƒ„„„„‡ˆŒ‹‰„||zyxwtpopqqrrvy|~|{xurrqonnnmmklov~‚‚‚}urpnllmmmmmmiimqx}€{vsrrtvx|~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||}}}}}}~~~~~~~~~~~}€ƒ††ƒ‚„…†‚|…‡ƒ||„…†„uv}‚{{}}zy~€‚‚€~~|zxyz{}}~~||}}}}}}}}~~~~€€~}}}}~}}~~~~}}||{{{{{{{{z|||}||}„„‚}|}€€~~~}}~~~~}‚†…„ƒ€‚ƒƒƒƒ‚‚‚…ˆŠ‹ŒŠ‡††ƒ€|yywtpopqrrtx{}~{ywtrqppnnnmmklqz€‚‚‚~ztromllmmmmmmiimry~yutssvy}€€€€€~~~~~~~~~}}}}~~~~||}}}}}}}}||||||||||||}}}}}}~~}}~~~~~~~~~~€‚„…†€‚…†„~ƒ„€zz}~€€ƒ‡†~usy€€}{~|{z{‚€{zyxz{}}~~|z||||||}}~~~~~€€€~}}}~~~~~}}}~}|||||z|{{zz{{{{}~„„‚}|}€€€€€~~}~ƒƒ€~~„„„„ƒ‚‚„ˆ‰‹ŒŠ‡……ˆ‰…~{xwspooqqswy}}|ywusrpooooonmlms|‚‚‚€~xsqolllllmmmmkjns{€€}yvtrsw|€€€€~~~~~~~~~}}}}~~~~~~}}}}}}}}||||||||||||}}}}}}~~}}~~~~~~~~~~€‚„…„~„……ƒƒ‚}z{}}}††~usy~~{z{€€€~~|{{zz{}}}~~}||||||||~~}}~~~€€€~}}|}~~~~~~}~}}}|}}}}|{zzzz{{}~‚‚€~|}~‚‚ƒ‚€€€€€€€€€€€}||ƒƒ„„„‚‚„‡ˆŠŒ‹‰…‡‡‡‡‰ˆ…ƒ|wtqpqrsuz|~}{xvsrpqonnmmmklov~‚€~xqomlllllmmmmjjou|€€}wttsv{~€‚~}~~}}~~~~~~~~~~}}}}}}||||||||||}}}}~}}~~~~~~}}}}}}~~~€‚„„„€€„†…ƒƒƒ„{{{|~‚‡†}svy‚€€~|z}~€€~}}~}}{z{{|}€ƒ‚|zz||}}~~~~~~~~}~~~~~~~~}}}}}~~}|||~~|{{yzz{{|~~~~ƒ„„ƒƒ‚€€€€€€€€€€}}}€……„‚‚‚„………ƒ‚‚‡‰ˆ‡ˆ‹Š‡€ysrrsqty}~}{zvsrqqppnnmkkjkqz€€€€€}wqonlmmmmlllkkkou~€{trtux|~}~~}}}}~~~~~~~~~~}}}}}}||||||||||}}}}~~~~~~~~~}}}}}}~~~€‚„„„€€ƒ…†………†ƒ}z{|ƒˆ†tqu|€€~|z{}~~|{z|}~|{{|}ƒ‡ˆ‚{zz||||}}~~~~~~}~~~~~~~~}~~~~~}||||}~~}|{{{{|~}}}€‚‚„„„ƒƒ‚~}€‚ƒ‚€‚‚‚€€}}~€‚ƒ„††„‚‚‚ƒ‚‚‚„„††ƒ‡ˆ‰ˆ‰ˆ‰‚yusqqv{~|ywsrpqqppnnmkkjmt|€€€}wponlmmmmlllkkkrx€zutvy{}€~€€€€~~~~~}}}}~~~~~~~||||||||||||||||||}~~€~~~~~}}}}}|}}}}~‚…„‚€€„††……ˆƒ~z{}„‡…xxy~‚€€}{}}}{zxxx|~}}}~ƒ†‰‹ˆ{zzz{{{{}~~~~~~~~~~~~~~~}}~~~|~}~~€€€~|||}}|~~€ƒƒ‚ƒ„}{zƒ†‡†††‡„€€~|}~€€‚††„‚‚ƒƒƒ…†…„ƒ……‡ŠŠ‡xtrrz}€{yvqppqqpponnllknw€€€~woommmmmmmmljimsz€€~ytuxz~‚~{€€€€~~~~~}}}}~~~~~~~||||||||||||||||||}~~€~~}}}}}|}}}}~€ƒ„‚€€„„†††}xy}†ˆ‡ƒ~~~€€€€~}}}{zxvtuy|}‚…ˆ‰ŠŒ‹…|{zz{{{{{}~~~~}}}}~~~~~~}}||}~~~}~}}|}}€€€~||||}~‚ƒ‚‚‚‚„|z|~€‚ƒƒ„†‚€|{}~€„……‚€€‚‚ƒƒ„…„ƒ€€||Œ—Œˆ{z{€~zwtpppqqpponnljinw€‚‚€€{tonlmmmmmmmljinuz€~}xux|€€{x~~~~~~~~}}}}~~}}}|||||||||||||{{|||~~~‚‚ƒ~}}}}}||}}~~}‚ƒƒ€€€‚ƒ………„€~|}…†‡…~~}~~}|}|{ywtttvx~‚„†ˆ‰‰ŠŒŒ‹‚{zzzz{||}~~~~~~~~~~~~~~}{{y||}~~~~~}}~€€~|{{{|~‚ƒ‚€€‚ƒƒ~}}|~ƒ~~{|~~€‚…ƒ€€‚‚‚ƒƒƒƒƒƒ‚‚€}€‹ŽŒ‘Ž…}{|zyvrooqqqooonmkhjpzƒ€|unnlmmmnnnmkikow}€€{vvy}€€~wv€€~~~~~~}}}}}}}}||||||||||||||}}|||~~~€ƒ„ƒ‚~}||}}}}}}~~€‚ƒƒ€€€ƒ„„„…††‡‡ˆˆ‡…ƒ}}}~~€~|{{{yvursrtw|€‚„‡‰‰‰‰‹ŒŽ‰{{{||||}~~~~~~~~~~~~~}|{|}~~€€~~~~€€~|{zz|~ƒƒ€~~€‚ƒƒ}|||}}}‚‚€~}~{|~‚…ƒ€‚ƒƒƒƒƒƒƒƒƒ„„ƒ‚„Š‘‹†ƒ~zyyyxyxwsqoqqqooonmkklt}€‚€{rmmlmmmnnnmjhkrx}€€{xy}~€€€xtu~~~~~~}}}}}}|}||||||||||||||||||~~}}„………}|||}~€€ƒ‚ƒ‚€€€€€‚„„……‡ˆˆˆˆ‡†„~|~~~~}{zzzwvtsqqqtx|‚‚…‰‹‹ˆ}{|}|}}~~~~~~~~~~~~~}}}~€~~~~~€~}}{xz{€‚|}~€„„~|{|}{{|€€}||~‚…†ƒ€ƒ…………ƒ‚ƒ……………„†ŠŽ‰‚}{vs|€€|tv}{tqpqpomnmmkjms€€zqmmlmmmnnmliiltz}€~zy{~€}tsu~~~~~~}}}}}}|}||||||||||||||||||~~}}ƒ„……ƒ||}€‚‚ƒƒ‚‚ƒ‚ƒ‚€€€~~€ƒ„ƒ€„‡ˆ‡…„~|}~}~}|zyxxuutrsrqsv{‚‚†ˆ‰‹Œ„|{||}}~~~~~~~~~~~~~~€€~~~}}}}||}~€~}}{yy}€~}{|}€ƒ‚€~}~}}~€€€~~}||~‚…†ƒ€€‚†‡‡……ƒƒ…„„„„…†ˆ‹Œ†~vqq|„ƒ}wy|wsqqpomnmmkinw‚‚€€xpmmlmmmnnmliinu{~€~||~€€€€~xssw~~}}~~}}}{||||||||||||||||}}}}~~~~~€‚…†…}|~€ƒ„„„††………ƒƒ‚„ƒ}}‡ˆ…„„~|||}}|zwvxvtuusssrsvx|€‚ƒ„†‡‰‹ŒŽ‹|{|}}}~~~~~~~~}}~}}}}|}|{zxz{|}{zz|€€~{||{|~ƒ†ƒ€€€~€€~}{}‚ƒ…„‚„ˆ‰ˆ‡…„†††……„„…‡ˆŠ‡}uos}ƒ€~~vv|zsrpppnmkkjpy€€‚€€~wpmmllkmmmkjhinv|~}€€€€€€zqru|~~}}~~}}}{||||||||||||||||}}}}~~~~~€‚…†‡ƒ~‚„…„„……„„„‚‚€€€€€‚ƒ~z}‡ˆ…„„}{}}}}|zzyvtsuvutttuvxz|€‚ƒˆ‰‹‹ŽŽ‰~}}~}~~~~~~~}}}€€~}||{|{{{{|{yzz}~}{zz|€€~{|||~„†„€€~~€€~~}~€‚ƒ…„‚„ˆ‰ˆ‡…„†††…………††ˆŠ‡€vqqy}|z~|||~|yspppnmkkkqz€‚€{uommllkmmmmlgipx}~€€~~€€€}vqty}~~~~~~~~}}||||||||||||}}}}}}}}}}~~~~~~„…†„„„†…ƒ……„„ƒ‚~€€€€€ƒƒ€|}‡Šˆ‡†‚~~~}{{zzxuvvwwvxuvyy{{}€…‰Š‹Žˆ~}~~~~~~~~}~€€|{zz{z{{}~~~}|{|}€~{xz}€|z{|}~€„†ƒ~~€‚‚‚€~}|~€‚„…„‚„‡ˆˆ‡†…†‡‡‡††………†‰†„}tuy|€€‚ƒ€~vpppnmljkr}€€|rlmmllllmmljhkty~€}vrtx|}~~~~~~}}||||||||||||}}}}}}}}}}~~~~~~~‚„……„‚„…„‚‚‚€~~€€€€€€€‚ƒ‚~|€‡Šˆ‡‡…€}|{{|||yxvuuvxz{{{||}„‡‰ŠŒŽ‡€}~~~~~€}{zyyzz{|~€€€~}~€€€~{xz}€|yy{|~€…†‚~~~€€~~}|}‚„…„ƒ†‡ˆ‡ˆ†„†‡††††††‡‡‡…‚||~‚€€‚„ƒƒ‚€~uppnmljkr}€€|tnmmllllmmlihltz~€zutvz{}€€~~~~~~~~~~~~}}}}|}{{||||||||}}}}}}}}~~~~~~~~}€‚†……†ƒ„ƒ‚€€€€€~~~€€€€€€€€‚ƒ~}€‡Š‰ˆ†„ƒ€|{zz|}}zxuttuyz||~}~€€€€‚…‡ˆŠŠŒŒŒ‡~~~€~~~€~|{yyxy{}}€€ƒ‚‚~€€€€zw{}~zwyy{‚„„~}}~€~||}~‚„ƒ‚€„†‡ˆˆ†ƒƒ††††…‡‡‡ˆˆ…‚€}|}‚€€‚…†„€zroonkkms~€‚€€}uollllkmmmmjjmw}€~}~€~wtuxy{~~~~~~~~~~~~~~~~}}|}}||||||||}}}}}}}}}}~~~~~~}€‚„…†„†ƒ‚€€€€€~€€€€€€€€ƒ€‡Š‰ˆ……„ƒ€}zxxxz||{xusrsvz||~€€€€‚†ŠŠ‰‹ŒŒŒŒ†€~~~€€~~}|{zzyz|}}~~‚…‡†…ƒ€€~~|{}~€~zwyy{‚„„~}}}}~~}||}ƒ…„‚€ƒ„‡ˆ‡††…††††…‡ˆˆ††…‚€ƒƒ‚…………ƒ‚}uponkkmv~€‚€€}tnllllkmmmmjiow}€~}~€ysuvxy{~~~~~~~~~}~~~~~~~~~~}|||||||||||}}~~~~}}}}~~~~~~~~€„†††„ƒ€~~~€€~~ƒƒ€†Š‰‡†…„{wvuuvy{{{wusssuy{}~€€~|€…ŠŒ‹‹ŒŒŒ‰„~~}}~}||{{{|}~~~‚‡‰Š‰‡…ƒ€~~||}€}xvwy|‚ƒ„~}|||~~}}{{}ƒ……„‚‚‚ƒ„†‡††„……………†ˆˆ†…„‚‚‚ƒƒ„„‚ƒ††……„‚€zspnkjnx€‚€€|umllkkmmnljijqy|~}}~€‚‚}xuxyyy{~~~~~~~~~}~~~~~~~~~~}|||||||||||}}~~~~}}}}~~~~~~~~€ƒ…††…„‚~~~€€~}~€‚‚‚ƒ‰Š†„€{xrooruy{{{yvsssuy{}}}~€€|{|†Š‹‹‹‹‹‹Š…€€€‚~~~}}|||{{||}}ƒ†ˆˆŠŠˆ†„‚€~~|}€€~yxyy|~€‚„„~~}}~~}}||}‚ƒƒ„ƒ‚‚‚‚‚ƒƒ„†‡‡…ƒƒ………†‡‡…„„ƒƒƒ„„……†‡ˆˆ‡…ƒƒƒ‚{wtqpsz€‚€€|slllkkmmlkjhks{}~}}~€‚zwvyzyy{~~~~~~~~~€€~~~~~~~~~~~~}}}|||||||||||}}}}}}~~~~~~}}~~~~ƒ„……‚€~~~~~€€}|…†‚|}|xqnoty|}}zzvwvwyz||}€|{|}„ˆ‰Š‰‰ˆ…€€‚€~}}}}||{{{{}ƒ…‰‰ŠŠŠ‰Š…„~}}}|}|zwxx{~‚ƒ‚‚~~~~€€~|}~€‚ƒ‚‚‚ƒƒ‚‚‚„‡…ƒ„„„……††……„ƒ„„……††††††††„„ƒƒƒ‚€}{yy~‚€~{rnkkklmmlkjimv|~~~‚‚{wuxzzxxz~~~~~~~~~~~~~~~~~~~~~}}}|||||||||||}}}}}}~~~~~~}}~~~~‚ƒƒ€~~~~~~~€‚‚|€‚€ƒƒ~xrorvz~~~~|||||}~~€}|{z|}~€„ˆ‹ŒŒˆ…€~~}}}||}}}~€‚„…ˆŠŠ‰‹‹‰ˆƒ‚€~||}}€€|zwxz}‚‚ƒƒƒƒ~~€€~}‚„‚ƒ………„„„‚‚‚~‚„…ƒ„…„……†††…„„………………††††††……„„„ƒ„„‚€‚‚‚‚‚€~{rnkkklmmlkihmw}~|}‚‚{wwyyywwz~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||~~~~~~~~~~~~}}~~~~~~~~€€€€~~~~~~€€~}}}}}~~|}€ƒ‚„„„ƒ}vpqvy|}~~~}~€‚‚‚~}|{{||{|€‚…ŠŠ‡„€‚€~}||{{{||}€„„…†ˆ‰ŠŠŠŠ‰†ƒ€€~||}€€}|zxy{~€ƒƒƒ„„ƒ€~~~|}€ƒƒƒƒ„„ƒƒƒ…„ƒ†ƒƒ€~ƒ…ƒ„„……†…………ƒ‚ƒƒ……„……†‡‡‡‡‡‡††††„„„ƒƒƒ„„„„‚€€yrnkkklnnlkgipx~}}€}zwyyyxvvz~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~}}~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}~~ƒ‚~{~€ƒ„„ƒƒ‚}usux{|~~~~€€€€€~}|z{{||{|}€€‚‚€€€~}|{|{{{{{„†‡‡‰‹ŠŠŠŠ‡„€~}zz|}€€~||zxyz}}}€‚‚‚ƒƒƒ€~~~~€ƒƒƒƒ„„„„ƒ……††††……‚‚ƒƒ„„……†ˆˆ†~€€€ƒ†………………††††„„„ƒƒƒ„„„„„‚€€yqlkkkllllkikqy}~}}€€|yxyyxwvvz~€€}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~}}~~~~}~~~~~}}}}}}~~~~}}~~~~~~}~~~~~~~~~~}}}}}}}}}}~‚€}z}„„ƒƒƒƒzsrvyz}~~~}|{{{{{zzz|~}~‚‚€€}|z{{{z{{|€‚†ˆˆ‰‰‹ŠŠ‹Šˆ…~|zyz|~€€~|z{yzzz{}€ƒƒƒ‚€€€€~~|}€‚‚ƒƒ„„ƒƒ………………„„„„„„ƒƒ„††‡†…€yux|}~€ƒ„…‡„………„……„…„„„‚„„……„„ƒƒyqmkkllllkjilt{}}}€€‚|yyzzxvvvy}€€€~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~}}~~~~}}~~~~}}}}}}~~~~}}~~~~~~}~~~~~~~~~~}}}}}}}}}||~‚‚{z}‚„ƒ‚„„xtuxy{}{|}}~}||{{{zzz|~}~€‚‚‚€~}|{zzz{|}~„‡ˆˆˆˆ‰ŠŠŠ‰‰‡ƒ}zyz|~€€}}{|{zyy}€‚‚‚€€‚‚€~€€‚‚ƒƒ„„ƒƒ„„……„„„„„„ƒƒ„„†………‚}tnpx}~~}~~€ˆ‹Š†…†„„‚‚ƒ„„……„ƒƒƒƒ„„„„ƒ}tnllllllkjimu|}€€€|yy|€xtty}€~~~~~}}}~~~~~~~~~~|}}}}}}~~~~||}|}}}}}}}}~~}}}}}}|}~~}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~||}}||||}}}~€‚~xy~ƒ„„„„ƒ~ww{yy}€zy||}~€~}}}||{{zyz||€~}|{zz{z~€‚‚ƒ„††††ˆ‰Š‰‰‰ˆ†ƒ|zy}~~~~~}|zy{~€€‚‚‚‚ƒƒ‚‚‚‚‚ƒ„ƒƒƒƒ„„ƒƒƒƒ„„„„„„„†„ƒ€~zrnntz~~}}~~‡ˆ„„„„„ƒ€ƒ„†ˆ†ƒ€ƒ„„……ƒ€ysonmmmmkihnw~~}€€€{yy}„ƒytty~€~~~~~}}}~~~~~~~~~~~~|}}}}}}~~~~~~}|}}}}}}}}~~}}}}}}{}}}}}}}}}}}}}~~~~}}~~~~~~}}~~~~~~~~~~}}||||}}}~~‚€|xz~‚ƒ„„ƒ‚~~{z|~|z|}~~€~}}}||{{zyz|}€~}|||{~€‚‚‚‚„………†‡‰‰ŠŠ‰‰†‚}zy|}||~~~~~€€‚ƒƒ‚‚ƒƒ‚‚ƒ„ƒƒ‚‚ƒ‚‚‚ƒƒ„„……„„ƒ„‡ˆ…~usu{{}}y{~~Œƒ~‚ƒƒ„‚€ƒ„†‡ˆ‡‚€ƒƒƒƒ„ƒzsponmmkiipx~~}€‚€~zzz~„ytty~‚€€~}}}}~~~~~~~~~~~~~~|}}}}}}~~~~~~~~~~~~}}}}~~~~}}~~}}}}}}}}}}}}|||~~~~~~~}}~~~~}}}}}}}}~~}}}}||}}~‚‚€{xz~„………ƒ~{}}}~~}}|||||{zy{~€€€~~~}}}|~‚ƒ„…ƒ‚‚€€‚„††ˆ‰‰‰‰Š‰ˆ„}{||}}~~€~~~€€€€€‚ƒƒ‚‚‚‚ƒƒƒƒ‚€€‚‚‚‚„„…………„…ˆˆ†}sw}~~||~ˆŠ€zzz}€‚‚~~ƒ†‡‡ˆˆ}~‚‚ƒ„„ƒ‚|vronmjhhqz~}€zwxzƒƒ{wttx|‚€€~}}}}~~~~~~~~~~~~~~|}}}}}}~~~~~~~~~~~~}}}}~~~~}}~~}}}}}}}}}}}}|||~~~~~~~}}}}}}~~~~}}||}}~~}}}}}}}}}}‚|xx}‚„„„ƒ|~‚‚}~~}||||{{{|€€~€~}~~}}}|~~„†‡…„‚€€‚……‡ˆˆˆˆ‰‰ˆ…|||}}~~€€€}}~€€€€€€‚‚‚‚‚ƒƒƒƒ‚€€‚‚ƒƒ„„……†††‡ˆˆ…€uw|~~yy~ƒ‹‡zyyyyz{~‚‚€‚‚‚„ˆ„€}}€‚‚ƒ„„ƒ‚~xtqnkglv{€}{x{‚}wustx|‚‚€€~~~~~~~~}}~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~}}~~}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~}‚€|xz}~„…„‚€€~€‚€~€€~~}}{zyz~€€~~~~}|}}}}}€‚…‡…„€€€„…††ˆˆˆ‡‡‡…„‚}|}}~~}€€€€€‚‚‚~||€€€€€€€‚‚‚‚ƒ€€€€€‚‚‚„„„„††‡ˆ‡‡†‚yw{{{xz…„zwvwyyyyy|~}{}~€ƒ…‡‡}|‚‚„„„„‚~ztolkmu}€€€€}zx|‚xrqssw|‚‚€€~~~~~~~~}}~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~}}~~}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}‚}zy{}€‚„„€|{}~~€€~~}}{z|€€€}}|{|||{}}}||€‚ƒ‚€€€ƒ„……†‡‡†„……‡†ƒ€~~}}~€€€‚‚‚~|}€€€‚€€€‚‚€€€€€€‚‚‚‚‚ƒƒ„…„„‚}wzzwu{‚‚|vuvwvvvvuqqszƒ„†††‡†ƒ~{~€€ƒƒƒ‚ƒƒƒ€{umjpx~€€€€|y{}vttspty‚‚}}~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}}|}}}}}}}}}}}}}}}}}}~zxy}€€ƒƒ€€}{|}~~~~~~}|{{€€~~~~{zy{||~~~~~~€€€€„„„„…„„„…‡ˆˆ†„ƒ~~~€€€ƒ‚€|}€‚„ƒ~~€€‚€€€€€€€‚ƒƒƒƒ‚€€‚~ywtrrz€}vtttutttuokrz„†………‡ˆ‡†‚~~~ƒ„‚‚ƒ‚‚€zqnty}€€€€€||y}‚ysrrqoty‚‚~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~}}}}}~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}}|}}}}}}}}}}}}}}}}|||{vx|~‚‚€}|}~~~~}}~~~||}€}~~~~}{||{|{}~~~€€~~~€€‚‚ƒ‚‚ƒƒƒ„…†‡‡…„ƒ€~€€ƒ‚€~€ƒ††…‚€~€€‚€€€€€€€ƒƒ„„„ƒy{|~~{uqqryzutttuuvtnlt|~~€…†……‡ˆˆ‡…€€~€‚ƒƒ‚|vsuz}€€€€~||€{vsssnnuz‚€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}||}}}}}}~~~~~~~~~~~~~~}}~~}}}}}}}}}}}}||||||€€€€€}yxz|‚‚}||~}}~~~|}~}}~~}}|z{zz{||~~~~~}~~€‚‚‚€‚ƒƒ„†‡††„„ƒ€€‚€‚‚„†‰ˆ…‚€€‚‚ƒ„€€‚ƒ{wy|}~€€‚€zposz{xuttuuttojq{~~~~€††††‡‡…ƒ‚€€€|y~€€‚‚zuw{~€€~}~„€{vssurlksx‚€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~||||||}}|~~{zz{~€‚}{{|~~~~~}~~}}~}}|{{{zz|~~‚‚~}~~€‚‚‚€€€€ƒ„†‡……„„ƒ„„„‚€€‚~‚„…‡‡†‚€€‚ƒ„ƒ€€€€‚„ƒ€~€€ƒ‚„„sprz{wtttuuuqkr{}~~~~}€†††‡‡…„„€yty}€‚‚€|xy|~€~‚‚|vssssqkmv{€€€€~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~}zzzxyz|~~€zvy}‚‚€{z{|}~}~~€|}}~{z{~~|||}~|}~€~~~~€€€€ƒ„„„‚ƒƒƒ„††„‚‚€€‚€~€‚ƒ††…ƒ€€€€„…„‚‚ƒ‚ƒ…„„ƒƒƒƒ‚ƒ††xssz{wuutturlly~~~~~~~‚‡……††„€€€zpsx}€‚}zz|€€€€~€~|xusqrrmjmw}€€€€~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~}zyywwxy|~€}zz|€€{z|}}}||~~~~{{{zz{|||||~~}}|}~~€~~~~€€€€€€€€€€‚‚‚€ƒ…………ƒƒ‚‚€€€‚€~€‚ƒ††…ƒ€€€€€ƒ„ƒ‚ƒƒƒ‚ƒ…„„„„ƒƒ‚ƒ……‚}wuyyvtttttojr}~~~~~~~‚…„‚„„‚€€€{qpt{|{{}€€€€~€|xtqqqqrqsx}€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~€€€€~~~~~~~~}}}}~~~~}}~~~~~~}~~}yxxvwwxy|€€€zx|€|y{{zzy}~}}zzxyzz{{||}}€}|}€€~}|||}€€€€€~~~~~‚ƒ„„ƒƒƒƒ~€ƒ‚€€‚€‚†……ƒ€~€€€‚„ƒƒ‚‚‚‚„…„„……„ƒƒƒ‚‚ƒ€zxyyustutrjlx}~~~~~~~„€€€€€‚€€|sqrx}}|}€€€€~€|xxxwustyxz‚‚€€€€~~~~~~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~~}}}}~~~~}}~~~~~~}~~}yxxusstvx{|~€€€}||}}zxxz|~~~|||{zyxxz{||}~~}}}~€€~}||||}~~~~~}~~~~€€€‚‚‚€€€‚ƒ‚€€‚ƒ†…ƒ€~„‚‚„ƒƒ‚‚‚‚‚„„„……„ƒƒƒywyxtsssrnirz}~~~~~~~€€„„‚€€{qpquz~~}|}€€€€~|xwy}€~~€‚„„……~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~|zzvtqrrvwy}~€€~||{zz}€~~~||{xxxy{{{{|}}~}}~~~€~}|||}|||}~~||}}}}}}~~~~~~€€€€€€€€ƒ„„ƒ‚€‚‚€ƒ„ƒ~~}~~}‚ƒ‚ƒƒ‚‚„„‚‚ƒƒ„„„„„„‚€€~xvxwusssqkku}~~~~~~~~}~~€„†ˆ„ƒƒ€€uoquw|}}}€€€€€{xuw{~‚„ƒ‚‚„„……†~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zzwtqqqrvy||€€~|{z|~€€}}}}{yxwwx{{{{||~~}}}~~}~}||{|{{{|||||||}}||}~~~~~~~~~~€‚……„„„ƒ‚‚‚~~„ƒ€~}~~|}ƒƒ„„„„„„„ƒƒ„„ƒƒ„„„„„„‚€€ytrxwvtssqjnz~~~~~~~~~~…‹ˆ‡…ƒƒ‚~vrswy|}}}€€€€€~zxyz€‚‚ƒƒ……‡‰Š‹~~}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~|xvusrqqsv{}~~|~~€€€{{|~€€}zyvwyyxxyz{{{||}~~~~|}}~~~~}{{{{{{zz{{{{||||{|}}}}~~||}}~~~€‚„…„…ƒ‚‚ƒ„„‚€~ƒ‚€€€}}€ƒƒ‚‚ƒƒƒƒ‚„„ƒ„„„„„„ƒƒ‚€{xuuuwwuusojoz~~~~~~~~~…‹……††ƒ‚€~yy{|€€€€~{y|~€‚ƒ„„‡ˆ‰Š‹~~}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~|xvttsrrtx{|{{z{{|~~€}|yxwwwxzyyyz{{{||}~~|||~~~~}{{{{{{zz{{{{{{{{{{||}}}}}}}}}}}„††…ƒ€€€‚ƒ„‚ƒ†…ƒƒ€€‚€€€€‚ƒ„„„„„ƒƒƒƒ‚~{vvuutvvvutpkqz}~~~~~~~~‡‰ƒ€‚…†ƒ‚€€€€€€€€€€€€~{{~€‚ƒƒ…„†††‡Š‹~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~€€€€~~}}~~~~~~~~}~~~~~~~~~~~~~~~~|zwwwtsstz|||z{{||}|{}€~zxvwxyzyzzyz{}}||}}~€~}}}}}||zzzzzzzzzz{{{{{{{{{{{{{{{|||~€‚……„~~~~ƒ„‡‡†…ƒ‚‚€€€‚‚€}{|}~~‚„„ƒƒƒƒ‚‚€}{xuutuvwwvsqnqz}~}}ƒ€‚…ƒ€„„ƒƒƒƒ‚‚ƒƒ„„ƒƒƒƒ‚€}|}€„…‡‡„„„„†ˆŠ~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~€€€€~~~~~~~~~~~~}~~~~~~~~~~~~~~~~|zwxwuttvy|||z{{|||~~€€}{yvwxyzzyxyz{{|}}}}~€€}}|{{{{zzzzzzzzzz{{{{{{{{{{{{{{{|||~€„…ƒ~~~~~~~€€€ƒ„„„ƒ‚ƒ‚ƒƒ„„„„ƒ‚}~}}}‚„„„„ƒƒƒƒƒ€}{yutttuvvsolnx‚„…‡‡†…ƒ…†…‚‚‚ƒ„„„„ƒƒ‚‚ƒƒ„„ƒƒƒƒ‚€‚„†‡ˆˆ‡…ƒƒ†ˆŠ~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~€€€€~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~|{xyyxvwy|||||||||{|~€}||zwyzzyyxyyz{|~}}}}~}~€€}}{{{{{||zzzzzzzz{{{{{{||||||||||||}~€‚€~}}}~~~~~~€€€€€€€„†‡‡†‡‡„‚€€~~‚ƒƒƒƒƒƒƒƒƒƒ€~zwtsttopoov„…††††††…„…………„„„„……††„ƒ‚‚‚‚‚‚‚‚ƒ„ƒƒ‚‚…„„‡ˆˆ‰†„‚ƒƒƒ„ƒ†‡ˆŠŠ~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~€€€€~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~|{xxxxxy{{||||||}|~€€zxxyyzzz{{{|zzz{}}{{{{{{|}}}{{{||||{{zzzzzz{{{{{{||||||||||||}}€~}|}}~~~~~~€€€€€€‚ƒ†‡‡‡†…„„‚‚‚€€‚‚‚ƒƒƒƒƒ‚‚€|zwusvwz~‚„…†…………„ƒƒ…………„„„„„„„„†„„„‚‚ƒƒ‚…†‰ˆˆˆ†„ƒ‚€€ƒƒ„„…†‡‡‡~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}}}~~~~~~~~~~~}~~~~}}~~~~~~~~~~€€~~~~~~~~~}~~}}~~{zyxxwyz{{||{||||}€€}yttvw{{{|}~}|zzzz|{|zz{||}~}}{{z{{{||{{{{z{{{{{{{|}|||}}}~~}}}}}~~}}}}}}~~~~~~~~~~~~‚‚ƒƒƒƒƒƒƒƒ‚ƒ‚€€€‚ƒƒƒƒƒƒƒ„„‚‚€€}}~€€‚„ƒ……………„„ƒƒ„„‚€‚ƒƒ„††……‚€€ƒƒ…„„‡ˆˆ†„……ƒƒƒƒƒƒƒ„„…………~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~}|zyyyyy{{||{||{}‚‚€{vttw{||~~~}{zzzz{yzz{z||{}}}|{z{{{||{{{{z{{{||||}}|||}}}}}~~}}}~~}}}}}}}~~~~~~~~~~~~‚‚ƒƒƒƒƒƒ€€€~~€‚‚ƒƒƒƒƒ„„ƒƒ„‚‚ƒ‚‚ƒƒ„…‡ˆ‡‡‡‡„‚€}|z~~€‚‚„…††……ƒ‚€€€€‚ƒƒƒ…‡ŠŠ†……ƒƒƒ‚‚‚‚ƒƒ„„……~~~~}}}}}~~~~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}{yyzyyyzz|||{{|~‚‚}zwuuvz|}{}}|{xxxyyzxy{{||||||zzz{{{||{{{{{||}}}}}}}||}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~€€ƒ‚ƒƒƒ€~~€‚ƒ„„„„„„„……ƒƒ„…„…††‡ˆ‡†…„€~{zzyy|€‚ƒ„„‡‡‡‡‡††„ƒ€‚‚‚ƒƒƒ„ˆŠ‰…„‚€€€€ƒƒ‚‚~~~~}}}}}~~~~~~~~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}{yyzyyzzz{{{{|~‚‚€~|zwuuux{{{{{{zxxxyyzz{yyzz{{{{zzz{{{||{{{{{||}}}}}}}|}}}}}~~~~~~~~~~~~}}}}}}||~~~~~~~~~~€€€€€€€€‚ƒƒ„„„„„„…………„……†‡‡ˆ‰†ƒ‚€}{|…†ˆˆ‰‰‡††††††…„‚‚‚‚ƒƒ‚ƒ†‡‰…€€€€€€~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|z{{zzzzz{{zz|‚‚€~{zz|zwuvvvy|||}|yyvvwxzz{zzzz{{{{{z{{zz||||{{{|}~}}~~}}}}}}~~~~~~~~€€€~}}}}~~~~}}}}}}~~~~~~€€€€€€€€€€€€€€€€‚‚ƒ……„„………†„„ƒƒ„„„„„……„„„„ƒƒƒƒ„…†‡‡†……‚ƒ…†……‡†„~‚‚ƒƒƒ„……‡†ƒ€€€€€€€~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~€|z{{|{zzz{||~‚ƒƒ||{{yxvqrv|}|||{yywwwwzz|{zzz{{{{{{zyzz{{||{{{|{|||~~~~}}}}}}~~~~~~~~€€€€~~~~~~~~~}}}}}}~~~~~~€€€€€€€€€€€€€€€€€‚‚ƒ…„……………††……„ƒ„„……††…………„„„„„„„…„„„ƒƒ€„†††‡ˆ‡…‚‚‚ƒƒƒƒ„…‡‡…ƒ€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}}~€€}|{{~}|{z{{~‚ƒƒƒ|zyzzywvtqw|~||zxwywwuwxy{{zzy{{{{{{{zz{zz{{}}}~|{}}}}}}}}}}~~~~~~~~~~€€‚€~~~~}}}}}}}}}}~~~~~€€‚‚ƒ„……‡‡…………†‡…ƒ………†‡†‡‡‡‡††††„…„„ƒƒ„„‚€€‚„†‡ˆˆ†…ƒ€€‚‚ƒƒ‚‚ƒ„…†‡…ƒ€~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~}|{{{z||{|ƒ„„€|z{{zyyyxvqpv|}{yvvwyxxuuuxzzzzyzz{{{{{zz{{{{{{{|}|{||||||}}~~~~~~~~~~~~€€‚‚‚‚~~~~}}}}}}}}}}~~~~~~~~~~€€‚‚ƒƒƒƒ„…………†‡‡†……ƒ…†‡ˆˆˆˆˆ‰‰ˆ‡…ƒƒ‚‚ƒƒ€€€€ƒ„…‡‰‡…ƒ‚‚‚‚ƒƒƒƒ‚ƒ„…†……‚€}}}}}}~~~~~~~~~~~~~~~~€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~|||{{{{{z}ƒ…ƒ}|}|{zxwspotx{zyvvvwwxyyxwxxyzzy{{{{{{{||}}}|||}}}}}}||}}}}~~~~~~~~~~~~€ƒ‚‚€~~~|}}|}}}~~}}}}}}||~~~~~~}}€€€€€€‚‚‚‚ƒ……††‡‡‡†…„„„†ˆ‰‰‰‰‰‹Š†…ƒ‚€€€€€~~~‚…†ˆ‰‡…ƒ‚‚‚‚ƒƒ‚‚‚ƒƒ„„……„‚~~€€€€}}}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€~|~}{{{{|}‚‚€~||~€|ywuqnnrvyyyvvvuwy{{{ywwyzzy{{{{{{{||}}}|||{{{{||}}~~}}~~~~~~~~~~~~€€‚‚€~~~}}|}}}||}}}}}}~~~~~~~~€€€€€€‚„……†‡‡‡†„„„…†‡‡‡ˆˆ‡…‚€}~~~„…††ˆ†„ƒƒ„„ƒƒ‚‚‚‚‚ƒƒ„………„‚€€€€}}}}}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~||}~~~~~~~~~~~~~~~~~~}}~~~€€€€~~~~~~€€}|{z{z}€}{||~‚‚€}yxwtrpquyyxwuuwy{}}||zyyyzxzzz||{|}}}}||||{{{{zz{{}}}}|~~~}}}}}}~~€‚€~~~}}}}}}}}|}}}}}}}~~~~~~~€€€€€€€‚ƒ…†…‡‡‡……„„„…‡†…„€~~~~~}}~~~~‚ƒ…†ˆ†…„„„„ƒ‚‚‚‚‚‚„„……‡…„‚€€€€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~€€€€~|{z{~€€~}|{||~‚‚~zyxusppsuxxwwvwy{|}||z{yyywxyyzz{|}}}}{{{|||||{{{{{{{{{|||}}}}}}~~€‚‚€~~}}}}}}}}|}}}}}}}}}~~~~~€€€€€€€€€‚„……††……„„ƒ„††„‚€~}~~}}}}~~~~ƒ„…‡†…„„„„ƒ‚‚‚€ƒƒ„†ˆˆƒ€€€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€~~~~~~€€|{{~€‚ƒ‚|{{{|}€‚€~}ywwsooqsuwxvwxxyy||{||zyyxwwxyyyz{{}}{{z|{{{{zzzzzzyyzz{{{|||}}~~~~~~‚ƒ‚‚€~}}}}}}}}}}}}}}}||}}~~~~€€€€€€€€€€€€„„…‡†…‡††††………‚€}}~~}}|}}~€ƒ„……††„ƒƒƒƒ„‚‚€€‚„„†‰ˆ†ƒ€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€~~~~~~€€€€€|{|ƒ‚€€{{{|}~€‚ƒ‚€~zyxtpopoqsuvyzzyy{{{||zzzxwwxyyyz{{|||||{{{{{zzzyyyzzzz{{{|||}}}}~~~~~€‚‚ƒ‚€~}}}}}}}}}}}}}}~~~~~~~~~~€€€€€€€€€€~‚ƒ…„…††‡††………„ƒ}}}}|||}}~€ƒ…„†††…„„„€€‚„†‡Š‡„€~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€~~~~~~}}€€€€~|}ƒƒ€~|{||}|~€‚„ƒƒ~{xurqponoqsvwzyzyz}}}}{{zyyyyyzzyz||||||zz{zyyzyxxzzzzzz||||||||}}~~~~€‚‚€~}}}}}||||||}}}}}}~~~~€€€€~~~~ƒ„ƒ…†‡‡‡……………ƒ€~}{z{{|||~~~~‚‚„………………ƒ‚€~~‚€‚ƒƒ…ˆˆ…‚~~~~~~~~~~~~~~}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€~~}}€‚‚‚€~}‚ƒ‚~|{{||}|~€‚‚‚€~{vtrononnprsvyz|zxyy{{{{zzzyyyyyyz||||||||{zyyyxyyyyzz||||||||||{|||}~~~€‚€€~}}}}||||||}}}}}}~~~~~~~~~~~~~~‚‚ƒ…‡‡‡……………„‚€~|{{{|||~~~~€‚‚ƒ………………ƒ‚€}|~€€‚ƒƒ…ˆˆ†ƒ‚‚klmnooonooortuvvwxzzzzwurpqqppppqqrssuxyzzyyyy||}}~€€€€€€€€€€}~~}}}}}}}}{{||||||||||||}}~~~€‚ƒ„„…………††……††„ƒ‚|sjd^[]_ada_][^cehhe``bglsz€„……„„{qf]YX]bjtz~{urppmifaadgknpquyz€€€€€€|wpmjjjjjjjkknqqtuuuuuvvuwvwyxupf[XTV[^choy€‚‚ƒ€€~~|xvtomjggcdfgghfhjjmprtttttsrrqpoqutuuz|zvplhbbdca\Z]dknttsrrsuwz~‚ƒ…‚mooppporssttuvwwxzzzzxvtrpqqppppqqrsuvvxzzzzzz{{||{}~~€€€€}~~}}}}}}}}}}||}|~}||||||}}~~~‚‚ƒ„„…………††‡‡††„ƒ}wpgc_^^`bb]ZYX[_dghfc`acfmu~‚……„„‚{si_\Z[bhpw}}{wtrpmnifcbbejmppqsv{€€€|zupkihhhhhhiklnortuuuuuvvuwvwyxupg]VUW\^cgpw€€€€~~{wtoljihgeegiiijjkjmprttttsrppqpoqsrpsw{||ytqmhdccb`\Z]dlsuusrrsuwz~„†ˆ…moqqssrstutuvwxxy{{{ywusqpppppqqsssstuuwyyy{}}||||}}}~}~~~~||~~~~}}||}}~~~}|}}~~~~~~‚ƒƒ„„…………‡‡†††„ƒ‚}vmg`]^`cda^[XVY]fmojea``emt{‚ƒ………ƒ€vmfcaadhot{yusqnmnjiihedehpy†„zwz~€€}{wrnjhhhjjiiijlnosvwvvvvwwwwwxxyupg]WUVZ^dhpw}€€€€€€€€|ztrojghhgghhjjjkklnnpstsuuropppoprrqrtxz||wsqkgecca_[]aelsutsstuvxy}„ˆ‰‡nonprrqrtuvwxyzz{|{{yvvsqppppprrssuuuwwxyyy{{{||||}}}~}~~~~~~~~~~}}~~~}|}}~~~~€‚ƒ„„……††‡‡†††„ƒ‚wnc^__dddb`YTT[epuvneaabfkqwƒ………„{smgbbeilostpnmllllmmkigglwƒ…‚ynqy€‚€zvqkihjiikkjjjkmoqrtvwwwwwwwwwxyzxsj`XTW[`cgnu|€€~|yurnlihhhhffgkmmmnonllpsvtssroooomoqportxz{yvrlhca`adaacdhnstrqqtuuwz†‰‰ˆnnmnpqstuuuvwx{||{ywvurqqqppqrrttvxxxxxxzz{{y{}}}}}~~~~~~~~}}~~~~€€€€~~~~~€€€€‚‚ƒƒ„„‡‡‡‡……………‚~yohfbeffc^\WUWamv|{rkca`chnu{„„…„‚}vrjeefikopoomllkknonnjijov}‚xqqw~|wrnkhhiikklkiiknoqruvxxxxxxxvxxyyyukbZWVZ`chms|~€~|xsnjihgheefgijnoooonljkpsssuuroomnppommptxxzxspmida_aebaejnsuurpqtuwwy}†ŠŠŠnnnopqtuuvwxz{}~}}{zxvutrqqqrrrsuvwxxxxxyyzzzzy{}}}}}}~~~~~~~~~~~€€€€€€€~€€€‚‚‚ƒƒ„……††……………‚€zslhdcdec`^ZX^iv|~wpic``dkry‚„……„€yrkdbehjlnonlllllppppnorsxzwtonv||vrpkhjlmoopnkijlpptuxyyyxxxxyxyyz{ytlcZWY]_bglsy~}ywsonliggfddefiklnoooolijmpsssssromlnppommruxxuspmkfbabeefimpuxvsqpqtvvtuy…ŠŠŠjlnopqsuvxxzz}~~}{zxvutssqqqqrrsuuwxxyyyz{{yyz|}}|||}~~~~~~€~€€€€€€€€ƒƒ‚ƒƒ„„„…………†„…ƒztnhecca`^]\]fr{ƒ€zukeb^bgms{€ƒ„…ƒ|unlgdfjkjiikkkmorttrtuvx{|xqmmppijtusnjjklmoprspkhikmoswxyxxxxyyyyzzz{zunf_ZZ\_bglqwz{}|zwrokigeecbbdegimopqponmljhlortsrsronlnpqnmnqtutrqnnkgdabffkpsvxzwrpqsuvtstx„‰‹‹jlnopqsuvyz|~~~~}|{zxvutssqqqqrruvwxxxyyyz{{{{z|}}|||}}~~~~~€€€€€€€€€€€€€€€€‚‚‚‚ƒƒ„„…………„ƒƒ‚~xrlfb``ba`^_dpy}ƒ€{vrlda`fkqyƒ„…ƒ~xqnigikjhiklllnqtvuttxyyyzvonprokjjnniiloqonrttpkhikmoswyzzzyyyyyyzzz{zvnfa^[]_bgjowz{zvsqmiggecbceeefilnoqsponmjhhkpstsrsspnlnpromnoppnlkkkhdcdehkrw{~~{usrstuwtsrv€‡‡ˆmmopopqwx{}}~}}{yvutsqqqqppqstuvxyzzz{{zzzz{{}}yz|}|}~~}}~~€€€€€€€€€€€‚‚€‚‚ƒƒ„„„„„ƒƒƒ{tnie`\]``^^ckv}‚‚ƒƒ€|umga`bgpv|„„„‚}|wqljgklihknmnpruvvwv|~zwwwwxzvkhiinsooqvytmnqrpkiijmprwyzyyyxyyyyzzzzyxohd`^^acfkpsxytrnlhgddb_abdfgimmqqrrpmmnjiilrvuuttspnlmopmkkkkjijhfecbbegkou{~€~xtsrtvxwtqpu|ƒ††mmmooprwy|~}}{yvutsssrrrrsttuvxyzz{zz{{||{{yyz||}}~~~€€€€€€€€€€€€€‚‚€‚‚ƒƒƒ„„„ƒƒƒ}xqje_]]^__`cir{€‚‚ƒƒ‚xqkebagmtz‚„„ƒ~yrmjgghkjkkmnrtwyzz{€ysuz~}vqoieeiosu{‚{tqrrpkiijlorw{|||zzzz{{{{zzzxrkd`^^acfhlpsspkjfdcbbdedfhikmnnnnppnlkllkjnrvuuttspnlnqpkhgfffededccbbehlrx}}{wsprtvwurqprz……llnooruw{~~~~~||{yvvusrrqqpqqsuvvwwzzzzzzzzzzz{{{|}~}~~~~€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒƒƒƒƒƒ„‚€}xrmgc``_```afnx‚ƒƒƒƒƒ€|vnh``chou|‚ƒƒƒysnjfehjjklpsuxzz|z|}~vqx~yvtolkjijnpx{wqpvwupkghkmprw|}||{{{z||{{|{{xrkda``bcegjnpoigegdbabbcgihjnoonmnoomnnomkkosuuuuuspmmopoicbeea`adcdeeffhmry}|{zuqqssuurqqppx‚‚lllnqtvx{{}}~~{{zwvutrrrqqqrstuvwxxzzzzzzz{{zz{zz{|}}~}€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒƒƒƒƒ…„{vrmhdb_\Z``bekr{‚ƒƒƒƒƒ€~xrlc_bflrz€ƒƒƒ~xtnjfehjjklqty{|{zxvvvvw}‚€|xsqpoonpt{xtsx}}ytlhhklorw|}||||{{zz{{yyxvplgc``adghikjjhbacddcegfgijknoonnoqqpnnonlmqtvvvwvurpoprmgaabb`_`abcccdghmry}|zxtqrssuttsrqqt{kmmoqswxyz{|~~~|zyxwvutrqqrrstuvuvxxwxxx{{z|zz{{{{||}}~~€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚ƒƒƒƒ€{uplgec`^]]__bgqz€ƒƒƒƒ‚ƒƒ‚{vof`bekqw}‚‚€xvqjfdfhjkmtx}|}~‚{vvuv|‚|zyy{vtvstw|wqt|~}xrlhhjloqv|}}}}{|||zywwwvtsojea``cijjgggecacddihijkkklnonmmmpmmprronnruvttvvspnopplf`aa^^__abccehhjnsx|{xvrprstvtqrrqqsy~lnmoruwxyz{|}}{zyxxwuttqqqqqqrssvwxxyyzzyyyzzz||||||}}~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ{vojfeec`__`ceinv|€ƒƒƒƒƒƒ‚~|voga`dhnu{‚‚}{uqnhfghkkpvzz~€‚‡Šƒ~~~~|xvssqopqruxzxuv}~}xrlhhjnpty|}}}~}}}|zywvutspmidbaadefedggebceggjjkjjjiknonmlllllprrpoosvxuuvvtqnoppkebba^^\_adefijjkosy{zxvrprstvtqooppqwzymmmotuvxxz{{||}{xwwvvusrppqqrsstxxxxyyzzzzzzzz{{{{||~~}€€€€€€€€ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚}wqlieeecbabefhks{€‚ƒƒƒƒƒƒ‚‚€}vohbaaglrz~|wtpmifegklqvz{‚†…ytruvwtrqmknoosuuxzyvw~~xqokiklnqv{}~~~~~|{ywussttqnhebbbeffgggghhggjkjlmjijkknmmllnmnopoqrortvttruvtqmnqokc``ccbaacdefijlmqtxzywtqqruuvsqpppppuutmnoqsttuwxzzzzzywwuutsrqqqqqrrstwwxxyyyzzz{{zz{{{{}}~~}€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚|wplifeeeeefghlqx~€‚ƒƒƒƒƒƒ‚‚ƒzsmhbcfkpw}|ytrpnkhehlpptx{‚„‚}wsqmnpqppnmmmpuy{zyzwvz~xqmiiknprw{}~~~~|{zxvstssrolhgcaadgghhhhiijjmnmnnkjijjkkkjlmnmlprssstwwutuvwtqopqokfbbdddbbefhjjijnrvyyxurqqruwtpnppppoqqpnoqqrqrswxyyyxxxvvutsrqppppqssttuvwwwxyz{{{{}}~~~~~~~~€€€€€€€€€‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ}wpjhhghhhiiklpw€‚ƒƒƒƒƒƒƒƒ‚~{uojfceipt{}|zvppppmifgjnoswz~€~zuppnmnoonnnmpux{€{xuu|~xpkiikntuy|~~~~}|zxvvtutsrmjijfbbdhklmljllnoqrrpnljeggijkknmmnnprtttwyzwtuvvtpopqolfddeddcbdhjlllkosxxxvrqppsvxwspnponnnoonoqqrrstuwxxyxwwuussrqqppppqssttuvvwxyyz{{{{{{}}~~~~~~~~€€€€€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ~ysnjiiklllmmmotz€‚ƒƒƒƒƒƒƒƒ‚|vpkfceimswzywtqppomkgdgloquz~ƒ~xsomoqpmmmooqw{ƒ…{wvz€~xpljklorwz|~~~}|{yxvvtutspolkhgcdhmptutqpqrsrttqmkjhhhijiigiklnprsuvyzxutuvusoopqolfffdcbbbdhjmmnlpsvxvurqppsvxwtqonmlkknnppqqrssuvwwvwwwwvuttsrrqqqqrrsttuvwxyzyz||z{{z{{|||}~~}~}€€€€€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚‚€€{tnjijknopoponrv|‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚~yrmhddglouwwvsqoomlkiehknosw}€€|vrplkjfgklnqu{€ƒ„†ƒ{vuz~wpkklmoqv{}~€€~}{zzywutrqonkjhgghotw{zxvtrsvwwvsnlijjjhiiiggjlnqssvvxyyustvuqoorrpledbcbabcehknnmmosvwutrqoqsvwwtqomkjjjlmppooqrrtvwwvvvssttsssrrqqqqrrsttuuvwxyyzyyzyxuuussux||{zzyzz|}~€€€€€€€€€€€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚ƒ~wpjihiloprqqpnrw|‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚€zuoiecekorstsqpoomnljfeinpqw}~}|{xspljhhiknosy‚…„†…}vrw}~wpkklmoqw|~~~~}}|zyxvtspooljihinu|€}zvtvxzzvspmlhgghiiikjjmnqsstvz{yustvwrporrpgddb```acehknonmpswutspprstuvvtqomkjhhklnoooopqsuvwuttuuuuttssrrqqrrssttuvvwxyy{|ywtrokjhilpwwusrpqrrux|~€€€€~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒzslhghjkooooooqu|€‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚€|vqjdadimopqqppppnpokhginpptz~}~|xuqmjiiimnrw}‚ƒ…††‡ƒzvw‚wpkkjkoqv}€€€~}|zyxvuqpnoljhhkt{€‚„€{wvw{|zxtpnljihiigiiillnoqsuxy|yutuwvrrrssme`bbaa_`cfhknnnnquvtrqqqstuvxwtomljihhjknoppprstuvutttuuuussqqrrrrsssttuvvwwxyy{{xuqljihfefjnmifcbdehloswz|~~~€€€€‚‚‚ƒƒƒƒƒƒƒƒ„ƒƒ‚}yqjgeccdimpppoprw|€‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚~xrkecceilmpppqqqqrrmhfilpqsx|}}{wtqmljjjnrw|€‚…†††‡…}uv}|vplllmoqv}€€€~~}{zxwvrqopmkjjnv~‚„„ƒ}yy{||ywurqnlihfffghhjlpqqqrv{{yuwxwvrrrssme`a````adgilnnklquvtqppqsttuvvqnomljhhjkklnopqqqssssttssrrrrrrrrssssststuvvvxyz{yxvrmljigecbccbbbb`adeehou{}~}}~~€€€€‚‚‚‚‚‚ƒƒƒƒƒ‚€|xsmfc````foqrqpqw|ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚xrnfacfkjjkmoprsstspjghknpqtz|{ytpqlkklmqw{~‚„…††††{tu|€~wpllklnrx}~~~}||zxvusqoqomllqw}ƒ„€}{z{zyxwtrpmjigffiihgijnpqrsw{|zvuxwurrrrqia^_]^`bdfhkmnmlmrsuttrprtttuwwrnmmkifehkklmnpqqqssssrrssrrrrrrrrrsssttvvvvvwxyz{yxvrnmkjhfdcbcdbaabdddccflqw{}}~~~€€€€€€‚‚‚‚‚‚ƒƒ‚‚~zupkhd_]\`ekpsrqrtz‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚{uojeacehjkmopsuxxvslihjnoqtxyxsnlljkkmqvz~€‚„„…††††wsuy{uokkklosw|~€€€|{zxvtrpqomlkqwz}€|yuuustsrppolhgfhjiiihhkmopqswzywstvwuqqrroh`]_]^`cegilonmlmqrrqqqqsvwuwyxtollkiedfhmnqqppqqrsttttssrrsrrrrrrsttuuuuwwyyxyz{{{xurrrrnjgggfcfffffdeba`cjtxz||}~~~€€€€€€‚‚ƒƒƒƒƒƒƒ}wqleb_][\^blnqsrtwz€ƒƒ„„„„„„„ƒƒƒƒƒƒƒ‚~wqkeceggijmpqsx{{yvojhhoppsuurmkkjkllnqx‚ƒƒƒ…………‡†„|srwxupljklnrw|€€€~}}}|zyvtsrqonnqsvyz|zwppqmkkmkmmkifdceiiihgggjoppswz|zvtuutrrsrne^\\[`bcehkoqnkilpqsrpppsuttuxxqmnnlhgdefmnppppqqrsssssrrssrqrrrrsstuuuuuxxwxxyz{{{zzxxyyurmlijmqsuttqmhbbbcksvwxz|}}~~€€€€€€‚‚ƒƒƒƒ‚‚|vojdb_^]`aeimprsuy|~€‚ƒƒ„„„„„„„ƒƒƒƒƒƒƒ„‚xrleacdhjjmqtw{}}{xslhhloppplifhhjlllnqx‚ƒƒƒ……„…‡„€ysrsvtoljjknrx}€€€€~}}}}|zzxvusrpnpoqtvwvqmhfecbadgjnkhddceijjhjlljjjotxz|wstuutrrsrne^\\[_befloopnkjmopppppqsutstzysnmmkgeccelmmmmonpqqqqppqqppqqqqrsstuuvvvvwxxxyz{|{{{{||||wuonnquxy{{{ytmecbcehkoruxyz{{~}~€€‚‚ƒƒƒƒƒƒ‚~xokgfcaaabdglorsuz€ƒƒƒƒƒƒƒƒ„„„„ƒƒ‚‚ƒƒƒƒ‚~unhb`dghikrvy~~~{vohgknqlieebdehkkmnrx‚ƒ„„„„…………ƒywxxupmkijotx}~~}}}||}||{zxvtqnpnnnpsusof```^]^cfjllkgdcgjklmpponmknqw{{xuuvvussrqog]Z[_bgiikopomjjmpqssqqsuvvtsxxqnmlihebefklmmlmnpqqqqppqqrrqqqqqrttuvvvwwxxxxyz{|{{||||{{zxvvvxyz|{|||ytokhdb`bdgijijlqv|}~€€‚‚ƒƒƒƒƒƒ~ysnigdbabfglnpquy|‚ƒ„ƒƒƒƒƒƒƒƒ„„……ƒƒƒƒ„„ƒƒ~vrlfcchjknswz~€{yrjfhlnjebbceehlmnpru|‚ƒ„„„„……ƒ€€}xuzzupkiijnsx}~~~~{xxy||}|zwusqnnnmnpqqlda`aaabgknppmhdcfikopsuronlkou{{wtuvvusstsme\Y[afgkkloqplhijnprsqqsuvvruyvqnljjiebdbkjjklmoqrrqqppqqrrrrsstuuuttvvwwxxxxyz{{||{|||||||{{||{{||||{zvsqmieabd``]_bdgnwz~€€€€‚‚ƒƒƒƒƒƒƒ‚€{vqljhebaejlqsvw|~ƒƒƒƒƒƒƒƒƒƒƒƒ„……†……………………ƒ{slfdegjlpv{~‚‚}yslfehlkc`acfhmoonoty~‚ƒƒƒƒ„ƒƒ„ƒ|srwzupllmnnqx}€€€}xtpqwy{|}|zvspnonnnqrnkfggjmnrtuvupkfbbeilosw{xrnjint{{vtuvwtrstrlc[YV_hlmmoprnjggjmqtspqtvxwstxupolkjhedefjijkmnnpppqqppqqrrrrsttuuuuuvvxxxxxxyz{||||~}}}}||||{{||||||{zyyurmkhgda^\\]^`gpx}€€‚‚‚‚ƒƒƒƒƒƒƒ‚}xrmkhgghkptxyz}‚‚ƒƒƒƒƒƒƒƒƒƒ„„……††††††…………ƒ}umfcdgjosw}‚‚‚~xtoigilkhcbfknrsqmou|€‚ƒƒƒƒ„……‚yroovyupllklnqx}€€€~xrieemty||zwspoommkmoppooqvxyyzzzzwrlfbcegjmqx{|vofejszzvtuvvsrstsnf_]\ahlnooppmighjostrstvwwutvxuomlkjhfefhjjjkmnppqqqqqqrrrrrrsttuuuuuvvxxxxzzyz{{}}||}}||||{{{{{{||zz||zyxusomigea`````enw}‚‚ƒƒ„„„„ƒƒ‚|wqmkkiimsy|~€€ƒƒƒƒƒƒƒƒƒƒ„„„„……††‡‡‡‡††……„ƒ|wphefhlosz‚‚‚€zvqkijknifdiotvxsmmqw}€ƒ‚‚„„……ƒ~vooqwyvokkjknsy~‚|rh`\]ent{{wsqponlmnopqppqv|}||~~~|zskfcdfhjlsx~|vnfadnwxvuvwwtuutroiba^agkoqssqmigikqsststwxxuuxyvolllkidfhijjjkmnppqqqqqqrrrrrrstuuwwwwvvxxyyxyzz||||||}}||||{{{{{{{{zz|||z{yxwtqnkjhfda^bkt}‚‚ƒƒ„„„„ƒƒƒ~ytnmjjkqvz~€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„…††‡‡‡‡‡††……„ƒ}yskffgjosx~ƒƒƒ‚~{vojhjmljjqw{|{uommr|„„„„„„‚|usrquxvokkjknsy~zpha]_fntxwsommonlmoppqrruz}~~~~~|xqjgdehikmqv{{vld`bltxvuvwwtuuvtpifebejnpsssqnigkmrvurstwxxuruxuoljjkigilmijjjlmoqppppppppqrsstuvwxxxxwwxxzzxxxy{}||{{zz{{zy|zyyyy{{{{||{{zz|||{wusqmga^agr|€‚‚‚ƒƒ„„‚ƒƒ‚€~xrkjklqw|ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„†‡‡ˆˆˆ‡‡†††…„ƒ|vpheehmrx~‚„„ƒ‚€€|wsliimnmnu}~ytomnrxƒ„„„„ƒ‚{uuwuvvvnlkmlotz‚‚|riccdhorssolllkklmnoppqquz}€~~}vngcdefgjmrvyyulc_bkuxvuvwvutvvsnigihhloprtrnjgfjnquuttuxxwsquwrnkkjhfgjkmijkklmnoppppppqqqrssttuvxxyywwxxzz{zy{{}||||}}{{zyxyxxyyzz{{||||||{{{{zzxvqha^`jt|€‚‚‚ƒƒ„„……‚€|wupmklmrw~€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„†‡‡ˆˆˆ‡‡‡††…„ƒ~zupgedgjov|‚ƒƒ‚~yuvtmjimopqxztollrxƒ„„„„ƒ‚|wtz}zvvwplkknnsx}‚‚€zsjggklnpppnnmmllnnpqqqqqsw}~zsmebcehijnswyytmf`ajsvtuvxvutvurnjijkknprsutnjiimrtussuvxxvrswxsnkkjhfgjoqijjjklnppqpqqqrqqrssuuwxyyyyxxyyyzzz{{{{||||}}{{yyyxyyyz{y{{{{||||{{{{{{|zukb^ajt|€‚ƒƒ„„ƒ„ƒ‚€}wpnlllnqtz~€ƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„……†‡‡ˆˆˆˆˆ‡‡††…„|wpjfdeimr{ƒƒ€|ustuokkmopry}zvqkjov„„„„„„€zvw{|xtttqnlmmosy‚€|uqmmnnmoppmmomomnoqqqqppsx}~~~~}ysmhcdegjlpsy|ysmfbckrttuwxwvuuuqnklmmnpqsttqmlkmqvwvstvvxxtptyysnlkkiegilqijkklklmnppqqqqqrsvvwxwxyyyyyyyyxyzz{{{{||||zzzzyxwvuuuwwxzz{{||||||||{{|yvnd`ags{~ƒƒ„„ƒ„‚€ztplkkllmqw}ƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„……†‡‡ˆˆˆˆˆ‡‡‡†ƒ‚}xurlfdeimrw}~zumlorokjjlorw}€|vqnmqw~ƒ„„„„‚}z|}xusrrsrnlllnry‚€{vrsssnmoppnnommnoppqqqqqtx|~~~~~|xqkgceghkosu{|ytoieenqrtuwxwvvvvqlijmpqsttuusomnotwxvtuvvwwsrtyxrnlkkihjlothijllmmnmoqqrrrrsuwwvvxxyyxy{{{{{{{{||||}}|{{{yyxxwwwwuutuwy{|{{{{||||||{{xpfaaeqz~‚ƒ„„ƒ‚}wqnkhhiijotz‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…††‡‡ˆˆˆˆˆ‡†‡…‚€}xsrmgddfiptz}}ysmefmqnjhllnsv{}vromrx~‚ƒ„ƒƒƒz{{vsopqtpmmmlmqw‚{xssvvtommpppqqomnoopprrssuz|~~}}zvoiecdghlosz}|wrlighorttvxwwvwwwrnlmoqsututvspoorvywsstuuwwttvxvqonljjjknqwhijllnppqrrrrrsstvwwwwyyzzyz||||{{||}}|z{{{z{{yyyyyywwuuvxwyy{}}}}||||{{{{ysja_clu{€ƒƒ}wrkgggfgilrw}€‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…††‡‡‡ˆˆˆˆ‡†‡…‚zuqoniffhhnsxxuoidcegnnnnpoqstz}xsolou}„…„„ƒƒ~|zxurqrsqmjlklnuz|yvsuwzzvppprrrtqomnpppqrrssty|€~}|zvojeddfhkpty{zvpmkjnsvuuwxxwvwwvsnlmoqstvvuvsqpsuxzvutuxxxxttxzwolkljjjmprrijjllmopqqqrrsttuuxxy{{zzz{{||{{||||||||{{y{yyzzzzzzzzyywwxxxy{{||}}|||zz{ztmd`cjtz~€€‚‚wsmgccbdgiqu}€‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…†…†‡‡‡‡‡‡††…‚zwtpnnkihiilprqlgdba`cioqrv{{xwz~€|xrmnqwƒ…†……„„‚{urqstpljkjkmpsutppty{zurqttuvupnmnnoqqsqqruy}~{xuojedceimquzzxronnprvyxvxzzyyxxxrljmprtwwuvwurswy}{wuuvxyzyuuxytnkkkkkkllnmijlmlmopppqstuvvvwxxy{{{||||||||||||||{{yyyzyyyyyyzzzzyyyyyyy{{{||||{{|zz{zwqkbaenw}€€|smga`aceiow|€‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„„…††‡‡‡‡‡‡…„ƒ|xsqpnolhgiijlkjgda_ceimquz}~€}|‚{wspnrxƒ…†……‚||}xrquwvpljkjiilpqpmlqvz{vsvwzxvrpnnprrrrrsrtvy|~~{wrnieefiknrxzyvqonnpuxzwxz{{yyyyxrklnprtuvvwwutvy|}{wuwxxyywuw{yrmkjjjkkkljjjklmnopppqrtvvvvwxyyz||||||||||||||||{zzxxwwxyyyyyzzzzyyyyzz{|||{|{{{{{{{{{ztoheektz~€~ysje``_cjqv}€€€‚ƒƒƒƒƒ„„„„ƒƒƒ‚‚‚‚‚ƒƒ„„„„…………†††…„‚€|tqpponmkhghhiieadcdcjlnptx}yw|†Š‹‰€xqpsyƒ…………„ƒƒƒ~ysrw{yqkjjkjknnmlilru{{ywx{|xxspopqrrrprttuwy|~~{ywqlhddfgjnrvvtqqqppruzzxwy{zyyyzzsnnqrsuuvuvvtsvy{}zwwyyxzyxuvz{smjiiijjjjhjjklmnopppqstvvvvwxyyz|||||}}||||||||{{zyxxyyxyyyyyzzzzzzyyzzyzzz{|{{{{{{{{{zwrmgcfnuy{{zwqhc`aciqx{~€€€‚ƒƒƒƒ„„„„ƒƒƒ‚‚‚‚‚ƒƒ„„„„……………„„‚}{vtqppnnpqlhgghhfbcbbdjnrtvvyvqsttx††‚}zwx|ƒ…………„„‚‚}yww{xrkjiihjkkjijmswxxywx{|xvrnnpqssrprttuwy|~~}}ztpkfeegikosurqppooosx}|yyz{zyyz|xrmnrtuvvvwwvtux{}}zwwyyz{{yvy|zrmkhiijjikjkjkmnnoppqstuvuustuvy{{{}{|}~}}||||{{{zzyxxyyyyyyyyyyxyzzzzzzz{{{{{{{{{{{{{{{ytqjebflqtutqmhecciov{€€‚‚ƒƒ‚‚ƒƒ……ƒƒƒƒ‚‚‚‚ƒƒ„„„„„„………‚}zwusqqppnnpqpgeefgfdccbdhlpswwqijlmprv{ƒƒƒ€}|‚„…††…‚~{yz|wqmkjkkkmkmkkouxzxxwyz{xvtppqrssrrrttuxz}~}|zxsnkhghkmmopppppppootz~{zz{{zz{{xplotuuvwwwwvuvy|~€zwxxy||}zv||xqljjkjgfikilijjknopprstutsolkmpsvvvwy|}~~~~~||{{{zyy{{yyyyyyxxwwwxzzzzzzz{{{{{{{{{{{{{{{|zumf`cfkmlkhdbbbgms|}€€‚‚ƒƒ‚‚ƒƒ‚‚ƒƒ‚‚‚‚ƒƒƒƒƒƒ‚‚|yvtssqppppqrstpjffghgeffb_`fmsuwvpnknprv}‚‚ƒ††„ƒ‚ƒ„…††…„‚}{z„~wqmkklllllnopqux{zyxyzzwvrppqrttrrrttuux}~~{wqnigghkmponnooooonpu|€~{zzzzzz||wolrvvuvwxyyttvy}}ywxyz||{wv||xplkkjhfgiknpjjijloqrrstusqmhgfgjnnoqrvvy||{{||{{zzzzyyxxyyyyyyxxxxxxzzzz{{{{{{{{zzy{||||||wqhb_bccddcaabfmqx~~~€€€€‚‚ƒƒ„„‚‚„ƒ€€~~}}}}{ywwtsprpnnooqsuvurkhhiiiijjd_[aluwxwqmnqvz~„†‡‰‰ˆˆ…ƒ„…†……‚|z~…ˆ‚yrmkjlmmlqsx}}xxzzxxz{zvtqpppsutqqrttuvy~~zuqmjhhilljhjkmnpomorw|~}|zzzzz|~{tontvstwwxwvqsw|~|xwyy{||ytu}}yqmjjjggghkqvjjkkloqrrstusqkfdceeggghklmpvxz{}}{{zzzzyyyyyyyyxxxxyy{{zzzz{{{{{{{{zzy{||||}}xrkdca__``aaabfltz~€|zxwy}€‚‚€~}{xwtsqqpponnnnnlijjhgghijjlorvxywrkgghikkpokaVXeouvwrnot{„…†ˆ‰‹‹‹‰…~}€…†…………‚ƒƒˆ‡€xpmknprqpt{€€yyyyxxz{{xurrrrstsqqrttuwz}zuolighjigdbehjlmnprvxz}}|||{{|}}zsnouwuvxxxwtqsw|€€|yyzy{{{wqsz}yqmlkkigghltyhjjlnprrrsuxvuplhegfffddffghlpvyz{{yyyzzyxxxxxxxxxyyzzzzzz{{{{zzzzzz{{{|||||{zysnjgc_\_^^^abglu{€€}yrkgfhpx}{xuommlkhffffedccdcbccdc`````bfkrvyywrlgfijhjqtqgZYdouwtqonrv}‚‚„‡Š‹‹Š‡„ƒ}z€……ƒƒƒƒ‚„‡„|vpmlnsx{|}~{xtuvuwxx{|zwsrrrssrqppprruy|~€}xsmifgiifd``cfjmooqvxz{}}|}}||}~}ztpquuuwxxywuqrv}€{xzz{{|yrmqz}womlmkjhfgmv}hjjlmoppqrtvvuroljjigggdddedeglprvwxyyyyxxxxxxxxxxyyzzzzzz{{{{zzzzzz{{z{|||||{zwsokgb`_^[[]^cgow~~€}xnc\\]bhnrolhda`_]]]]\\[ZWWXWYZ\]^^]]___bgjmnpqpkjhffdegmsodairuwurpnnprx~ƒ…‡ˆˆˆ†‚ƒ†‚~€ƒ‚|€…ˆ‚zvpmlot|‚…„|tohfimuwwzzzvrqqqrrqpooprswx{~{vqlhffhhec]]beknnruuxz~}|}}||}~~{xtrvxuwxxyvspqv}€{xyy{{{xqlqz{uomlmmkjiglv}ikjlnoppqqstuvurpppmmkjihgecdefilpruwxwwwwwwwwwwvvyyzzz{{x{{{{zzzzzzzzzzz{||}}{yvspnkhfc_\]\^bhmt{~}ype_YY[^beheb^\[XWYXWWVVUSTTRSVWWXYUXVX[_adggfgimkigdb_`dimrpmrwvvtqpooorx|€ƒ„„‚€‚ˆŠƒz|€~}~‡‡‚zsmlkow~„„ƒ~slgijltuyz{wsqpprsqponnnqsux{}zuoighjkkgcaabfknqqtvwy~}|~|{|~zusvvvwyy{tnlnu|‚€{xyz{{yvnkpyxqonnnkifehlu{ikkmnoppqqrsstttuuvuusrqnmkhfdccfjnprtvvuuuuuuuuvvwwyyyz{z{{{{zzzzzzzzzz{|~~}}|{ywvtqmifc`_]\\^bgnqqne^[[[]_`__][ZYXY[\^``aa_^]]\^`abca^\[ZZZ\_behikijgb`ceggdhqvswxwwurponnory}~~{|ƒŠŠ‚z{|xyˆ‰ƒ~€‚€„††ulefjompsy|yurrrstsokknortwx{~~{vqligghjjieeeimqrssuvxz~}|~|{|~{xvvwwyzzxsmlnu|{xyz{{xrjipwvqonnnopollptyhjkmmnnoqqqrrtuuuuwwxywwurpkgecabcfgkqstttsuuuuuuvwwwwwyzzzzzz{{zzzzzz{{|||}}|zwxwvsljgdc`b_\\^dihd__]^\\\\\\^_aabdegllkkkigedbdggijifda^]]\Z\_`dgihd`bhmoi]\luvyyxwvtpnmnosy|}~~|zzˆŽˆƒ€}y}…‹ŒŠ‹ŽŒ‹ˆ…„…„……}thdejlpu|}ytrsrsvspmlmoqtvyyyxsrplggikllkhjlpvwvutuwx{~}}~|{|~~{zyxxyzyxsmlmt|‚€zyzzzzxogipttonmnoprromosvikkmmnnoqqrtsuuuttwwxyxxxxvqliecba`_ahnqrrstttttuvxxxxwyzz||{{{{zzzzzz{{{{|}}|zxwsromnnlie`\[^]\\]____^^^^^ehmnpqqrtuutrplihgefggimonnmjiedbb`_``abceknnog\Vetwxxwutrrqollr{}xv|€|}†Œ†~‚‰Œ‹‰ƒytx‚…†‡ˆ‰†vpkkptvz{wsrsrsromllmprsuvvtsqnmkkkklmmnnotw{{xtrtvy~~}}~||~~}{zxxyzzysmmnt|€~zy{{zzwogirvtqrqprsuxwtqrtjllnmnopqrttvvttttwwwwxxxxwwsojgb`^\`dkopprrrrssssuuuvwxxy{||zz{zzzzzyywwvw||€}{yvtssonnnmjb^\[]^\[[\]^__`adgmtwy}}~~~{{yurnlihgghikpuuvvtrnmjhgdfdadhnqnklojeioruxwtqlonhfgpz{wt{~~{~†Œˆ„‚…ŠŽ‰…ƒ€wrv~ƒ„‡ˆ‹ŒŒˆ…‚|vruz{wsqrssromnqryxuroqpnlkkhigjlnoqsv|~|wuuvy{€~|}}}~€€€€}yzz{{yyrmlmr{zy{{zzvqgjruvtsrqpsuz{xtttkmmopppqqrttttttttwwwwxxxxxxwsqmjfa]]bhnppqqqqrrrrsstuvwwxz{zyz{zzzzzwpiikpuy||yusqqpqqmgdbba_]\][[\^]^]`aadgnu{‚‚‚‚|yuromjihiiimouy|}||zvqmifdcfhnsrjghnw{~{upqtronpmmlosy~}{}ƒ„‚†‹ŒŒ‹‹‰ˆŠˆ‰‰…„ƒ|vy}}z|„‰ŒŒŠˆ†zy{zvspnnnoot}„‰‰„xooqpnljihijknpqsuy{|{xsorvy|€€}}}~€€€€€€}yyz{||ysnkls}{z{{{{umejswtrsrqpsu}~{wuumonopprrssuuuuuuvvwwwwxxxxxxwvsrpjc[Y^fopprrqqppqqssrtuvvxz{zzzzzzzytmd`bdinrvutrpqpnlke`[XZYWXVYYY]ceeeccefgkqwz~€~zupmkkkjhhiimry}€€}yunhdbinrsrkhhk|€€~wlhgmurroqv~‚ƒ‡‰ŒŠ‡‚‚…ˆ‰‡Š‹Š‡‡†ˆ‡…‡†}€€wry‚‡‹ŒŽŽŒŒ‰‰…|~ywtqljmox‚‰‹‰€xpnopqpkjhghilnppsu{~~{uqprvy|€‚}}}}~€€zz|}||xrolmt~€~{{{{{{thdjrusrrrooqx}}|yvunpprttttttuuuuuuvvwwwwxxxxxxwvustnd\Z^empppppprrrrrrqstuuwxyxxzz{{zwphea^_adimnlklmlljhaZUTVVWUTTX]dkpqqmjgdbceilpux||zvrolkkkkjklnrv{~~~|zwqmgglsutsslhpy„ˆ‰}rnsz}{vuz€ƒ„‡‹ŒŽ‹Šˆ†‰Œ‹‹‡ƒ‚ƒ~}…ˆ„‚zpov~„‰‹‹‹‰‡„~~ysrqqrv}…ˆ„|tomnnopqpmlkiiklnpqsvzzzwspptwz~€~~~€€}{|}~||xromnt~€~{{{{{ypgdjqssrrrqqqx{{zxwvqprrttstttwwvvttuuuuwwxxxvwwusttqme]XZcmpoonppqqqqqqqqrrttuvwwxxyxxtmgc^``abeegggfgged_[TPORVWZY[`elrx{{wnhe_]]`eijlpqtqpnmmkkklmpqty|~}ytroomtz€~{{|wyƒ……ŽŒ‡|rv}ƒ……„ƒ„†ˆŠŠ‹‹ˆ‰‰ˆˆˆ‹ŒŒŒŽŽ‡ƒ†„{y‚†‡„ysqw~„†ŠŒŒ‰‰ƒ}w{}{sppq{‚‰‰ƒwmnmoopprrrpnmjjlmnoqsvz{wtqqrtx|€€~€‚‚€€~|{{}}{vsonot}|yz{{yunebjturrssrrrvzyyyvvpsuuuutuvvwwvvvvvvvwwwxxxvvvussspld\UXbiooopppooooppppppsttuwwxx{ywtohc_aabdddcca_``^][WOMLPRTX]ckry}€‚}tkda]^]^aefgijlnmmmllmoqtwy}}|{ywuqnmpu}‡Ž‹‡„„ŠŠ‚‹“‰|v{‡ŽŽŒŒŽŽŒŒˆ„„„‡‹‰Š‹ŠŠˆ„†„€…‡†€|vttz…ˆŠŒ‹ˆƒxpnqy}ztnkr‡†€uonmmlmnrtttrpmkjlmnprtwzyuqqqrtx|€€~€‚‚ƒ€~|}}}}zvsonot}~|{{{{yukbdmssrrqqrruyyxyyvvpsvvuvvvxxxxxxxxvwvwxwwwxxwwvvuuqnh_XY]djmmnnnoonnooppppqrtuuwxxxxxuqnjhdcbabdb__]^]ZXVUPMJHMU]dnw‚ƒƒ„ƒvlfddfed_^_bdfhklmnoopqtvxzzzwwsqppnnqz…Œ‘Œˆ‹Ž…‡“‘Š~rwƒ’’’“‘Œˆ…ƒƒˆ‹‹ŠŠˆ‰ŒŽ‹‡†„…†„€|yxvv{ˆŠŠŠŠˆƒwolry}xnhn~„‚|tnmmnnoopruvurpolllopqrtw|zvsppsux}€€€~}€‚ƒ‚‚ƒ~{}}||yvsomnu}}{z{}|ztjdgousqqopprvy{zyxxwvwvvwxzzyyxxxxwwwwzzzxxxxxwwvvuuspke^Z]_dilnoooonnoopppppqrrtvxxxxywtpnlkigdacddb`_[XVUSQPOOQ]gq{ƒ………„„wmhfjprojgb`adddhknsutuutsrrrqqppnmmpy†Š“’Ž“’‹ˆ‹’Ž{ˆ“‘ŽŒ“’‹‹‹ˆ†ƒ‚†‰ŠŠŠ‰Š‰‹Š‰„€€„ˆˆ…„}|y}ƒˆŠŠŠŠˆ„~qhljf_`hz„‚~yspnnnnonptwyxtqnmnnopqrux{yvsqqsux}€€€€€‚ƒ‚‚ƒ~{||||yvuqmnu}}|{||zyrjfluusqqoppruxyzyxvwwwxxwwyyzzywwwwxzzzzzzyyyxxxwvvvspmha^^^_aehknoommnnpppppprsuvwyxyxxvtroonljhhid`^\VTTTTUWXZ^it|€ƒƒƒƒƒ‚~xoffjsvurnme_^`bgimqrsqqonmomlonopomq{„‡Ž“••”–—–’‹‰ˆˆ…‚…ˆŒ”’Ž‘’“”’ŽŠˆ‡ˆ‹‹ŒŒŠ‰ˆ‡†‚ˆŒŒ‹Š‰‰…€ƒ‡‡ˆŠˆ‡‡„{te]Z_it|}xyuqprromlmrvyywtqnnnnopprx|}{xwtttvy~€‚€€€€‚ƒƒ}{{{||ywtrmqw}~}|~}|xtlhrywqppppqqsxxyzzyywwxxyyyyzzywwwz{zzzzzzyyyxxxwvwwutrkgcbbaa`agjlnmmnnnnooooqrsuvwwxzzxvvtrpnmigcb_][XWY[\_aeipx~‚ƒƒƒƒ‚ƒzskfhov|zusokghiiihjlihhghknmllnprqrx{ƒ†Ž•—™›œœš—‰„€}‡Œ‘—š˜’’—œŸŸœ˜”ŽŠ‡‡Š‹‹Šˆ††„ƒƒ†‰ŒŽŠ‹‹‹Œ‹‰†……„……ƒ}|rnuƒ~xvtwvtsuvsmlmrwz{ytqnnnnpqstw{|zxwuuvxz‚€€€€‚ƒƒƒƒ}{}}}|zwurptz}~}|{}}ytlkvyvpppppqqqruyzzzzxxxxyyzzzzyyyyyyxxxxzyyyyzyxywwuwwuqmiiea`__bcfjmonnnnnnnnqqrtuwxz{{zxxtpmlhfc^\[Y\^_bcfinty|}€‚‚‚‚‚‚|tnffjqw|{wpmpsqkljiijjjooponjiptvxz|ƒƒ†Ž•šœœœ˜•‰ƒ€„ˆŽ”š  œ”’”–™™š™—•–Š…ƒ‚…ˆ…ƒ‚„€€†ŒŽŽŠ‰Š‰‰Š‹Œ‰†ƒ€€‚„„~{|wr|†‡vtw~}xrpsqmlnsx{{wtqnmmoqqssvwwvuuuwuw|‚€€€€‚ƒƒƒƒƒ|{|}~|zvurpu{}~}|}~}{ros||tpppoopppqvzzzzzyyzz{{||{{{{yyyyzzzzzyzzz{zyywwuxxyxtqnjgda_]^bglmnnoopppppprtuwwyzytqnjgea][[YZ[^acgknru{~€€‚‚‚‚‚‚}wpheejpwuxz{€~wsrpmkihffhlmjhhpw{}€‚‚ƒ„Š’›ž˜’‹‹‹‰ˆ‰‹˜žž›˜•’Ž’‘‹…wu~€ƒƒ‚ƒ„ŠŽŠ†„„ˆŠŠˆ‰‹Š†‚~~~‚}~€}yx||zwt{ƒ†€uqrqnnoquxyvtqnmlmmmkknonlmmopuw{€‚€€€€‚ƒƒƒƒƒ|{~~~|ywvtsy}~}}{tpx~{soppqqrrqsvzzz||zzyyzz{{{yzzzzyzzyx{{{{{zz{{yyxxwwxxwwvrnjfb`__bgkmonoppoprttuwvssqnkfd`[YWX[]^`behlqux{~€€€‚‚€yskegjkqsz‚…‡‡‰ˆ†…‚~zslddd_]bjlnnrv{|~Œ™žžž˜ŒŒŽ‘˜˜˜˜™™•ŽŽŽŠ…€volov…‡ŠŒ†„„…ƒ€€‚ƒ†…„~€‚€}yxuz|€ƒ†€xtrrppqrvzytpnmmmjkkknmmonooortuy{z|~‚‚€‚‚ƒƒƒƒ‚€€€€€}zzyvv{€€~~~~€|wv~zrppppqsttu{|{{{{zz{{|||||z{{zzz{{zy{{{{{{{zzzzzyzzyyyywutqnjd`^_cglmnoooopqrsttslida^ZYWWWYZ^chjmpuz{}€€€€€€|upifkosuz„‰‹‹‹Š‰‹‹ˆ…‚}zsjfgjkhhijkrz|tuƒ”›žžœš“ŽŽ’—œœš•˜œžš•ŒŠˆ‡‰Šˆ†ƒ€€zw|†ŠŽ‰|{~|||~ƒ„„‚€‚‚„†„€€}|}€~|{|yvssrrsuxzzurlkjjjklmnmlllkmmmlnsuwxz€‚ƒƒ‚‚„„„„ƒ€€€€€{{zzy~~~€yux‚|tqppqruuz~}zz{{yy{{{{{{zz{{{{zz||{{zzzz||{{|{{{zzzz{{{{xvtqlfa__cilmnopoqssutojd^ZXWVVX[^_bhnruy{~€‚‚‚‚‚‚|yroru}€|z‚‹‘‹ˆ‹ŒŒ‹‹Ž‹‚rioma\ahlqyxqm{šœš”’‘ŽŽ”™š™˜—šš˜•‘Œ‰††ˆ‰‰ˆ††‰Š‹‹‹ŽŽŠ‚{xz}~~„………ƒ„†…ƒƒ„ƒ„†…€~~}|yyyyzzwttstx}~ysomnnkkklnprrponlkijjijorw|€‚‚ƒ„„„„„„‚€€~z{{{z~€€€€xsw€ƒ{qpqrsstw|€|y{{{||{{{{{{zzzzzz|||}||||||||{{{{||{{{{{{{{|zxvqkda_^`cefghloppolhb][[\^^^cgkoruy{~‚‚‚‚‚‚‚‚‚‚{ww~ƒ†‡…„„‰Ž“‹ˆŠŠ‹‹ŠŠ’’‡wttj`]`is|}untŠ˜œ›™—”˜——”’’–™™–“’••”‘ŽŠˆ‡‡‡ˆˆˆˆ‡‹ŒŒ‹ŒŽŽŠ…ƒyy{{z}ƒ…†ˆˆ‡††„ƒ‚ƒ‚ƒ…„€{yyzy{}|zwxvwuuux|zspoljjkknrtvwyyyyvtsssokjlntz~‚ƒ„…………„ƒ‚‚‚|{|~}ƒ‚€€}tov~€ytsrstuux}€~|{|||{{{{||||{{{{zz{{||||{}}}||}}||||{{||||zz||{ztokgd`_^^_``dgihec_]Z[]`bgimrvy{~‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚€~z|€‚‚†‡‡†‡Œ’Š†…†ˆ‰Š‘’’‹|ww{slfguxpt‰•™››–”šššš™–•–—•“‘’‹Šˆˆ‡‡‡‰Š‰‰ŒŽŽŽŠ‡…‚€|zzzxxz}€ƒƒ„…‡ˆ‹‡‚€€‚zyy{z{}~}{xyxwvststtqoklloqoprvz}~~}{yyy{ztnihkq{‚ƒƒ†††‡„ƒƒ‚ƒ‚‚}{|~€‚…‚€€€€zqnt}}yvuttvvvz~€~|{||}{{||{{||{{{{zz{{||||{}}}}}}}||||{{|||||||||{ytplhe`^^\\\^ab`__^__bfjotx||~€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€}~„„ƒ…‡‡†††‰ŽŽ‰„‚ƒˆŽ’•–•Œ{|ƒ…„}vzxnn—š›˜“•šš™™™–”““’‘ŽŒŒŒ‹‹‹Š‰………‰‹Š‰ˆŠŒ‹‰ˆˆˆ„~y{yusuy~}yx{„‰Š‡…ƒ‚{zy{z{|~|zyxxxuronppoorstttstx|€€€‚‚‚~wnhhpzƒ„†ˆ‡‡…„…ƒ‚‚€~~€„„‚€€‚€zokr||wusuuvvvz~€~|{|}{{||||||{{{{{{||||{{{{}}~~}}||||||}}}}||||zzyxwsnjea]]][\\^`__`bglswy|}€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚}€……„ƒ†‡ˆ‡††…ŠŽŽŠ†€|}}‹“˜—–ƒ€ƒ‰Š„„whfs†”š›™š—ššš™”’‘ŽŒŽŽŠ‰Š‹‹ŒŒŒ‰……†‹‹Šˆ‡‰‹‹‹Š‰ˆyz{wutvy|}zxw‡ŒŠ†€€‚}wz{yz{|€€|yzxwtqnlknoqqruuuvwxz}€€€€‚€ƒ„„…‚|rjhp|‚…†‡ˆ‡‡†……ƒ‚‚‚ƒ…„zqnw~|xuuvvwvwy~~|~~~~{{||{{{{{{{{{{||||||}}}}}}}}||||||}}}}|||||||{ywvrpmkgba^^`befjnrxz|~€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‰Œ…„„†‡‡‡ˆ†„†‰Š†‚|{||€Ž—™™•‹„‚ƒ†‹Ž‹…†‡~tmt…‘—š—™™ššš™•’Ž‹‹ŠŠŠ‰‰‡‡ˆŠŒŒŠ††‡ŒŠ‰ŠŒŒŒ‹ˆ„|yyzyz|~|{{€†Š‰ˆ†„†‡ƒ}ywwxz}~zuqqonkjjmprrrsvxxyyz{€€€€‚‚‚‚„……†…ƒ{pfhr~„‡ˆˆ‡‡†……„ƒ‚‚ƒ„„……„‚‚‚|uu{}xwwwwywwy~|ywusq{{{{zzzzyyz|zz{{{{}}}}~~}|}}}}}}||}}{{||||||||{{||ywspniedehknrv~~€€€€€‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚ƒ‡‹‰„„‡ˆ‰‰‰ˆ††††ˆ‰ˆ„|{{}Š–››š˜Œ„‚‚†ˆ†‡‰…|totƒŽ–˜™™š››››™”Œ‰‰‰‰Šˆ……†‰Œ‹ŠŠ‹’”’Ž‘’ŠŠ‰‰ˆ…|{zyy{‚„††ˆŠ‰ˆ†‡ŒŒ‹‰…}vuvw{zvsqpmmnoruutuwxy||}}}}~€‚ƒƒƒ„……‡‡‡‡ˆ…zkdiu‚†‡‰ˆ‡‡†‡……ƒƒ‚…†‡†ƒƒƒƒƒƒƒ~z{„zwvuxxvw{€€{rjiii{{{{zzzzyyz{}}||}}}}}}~~}|}}}}}}||}}zz||||||||{{||{zxzxvsrqsvx{}€€~~~‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒƒƒƒƒƒƒƒ‚‡‰ŒŽŠ‹ŒŠˆˆˆˆˆˆ†…‡†ƒ~zz~‹”™œœ›‘‡‚‚ƒ††‰Š‡}pko}Œ•—˜˜šœš–‘Œ‹‹Š‰‡ƒƒ…‰ŒŒ‹‹Œ”–•“’””“Ž‹‰ˆˆ‰ˆ†ƒ~vsru{‚‡‡…„„…†…„„†‡‰‹ŠŠ„zxsrqqsrqsuvwwx{zzz{}}}}}}~€‚ƒ„…†‡ˆ‡‡‡‡ˆˆƒuhejx„‰‰ˆˆ‡‡†††„„…‡ˆ‰‡…ƒƒƒƒƒƒ‚€€„†…}zxw{{yxy{skgjljj||{{zzyyyyzz||}}||~~~~}}}}||||||||zz{{zz||{|}}}}||z|~~|z{|}~€€€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ€ˆŒ”Š‹Œ‹‹ŒŒ‹Š‰‡……‡†{{‡”–™›œš‘ˆ„…†ˆ‰‹ˆ|omr~˜™˜˜™œžŸžœ–’‘‹‰Š‹ˆˆ‰ˆŠŠŠŒ“”–•–——–“Ž‹‰ˆ‡‡………vliku€‡Š†ƒƒ„ƒ|y{€†‡ŠŒ‰†sqrrtutwyyzz}}||}~~€€€€€„†ˆˆ‰‰Š‰‰‰‡†…~peeq€…‡ˆˆˆˆˆˆ†……†ˆŠŠ‡…„„„„„„„ƒƒ…ˆƒ€}{{}}|zxvojlmkllozzzz{{zzzzzzzz{{{{~~~~}}}}||||||{{yyyxzz{{zz}}~~}}}~~€€‚‚‚€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ‚…‹ŽŠ‰Š‹‹‘‘’‹‡„…ˆˆ…†Œ’“”•–™œ›‘ˆ‡‡ŠŒˆ|sqsyŠ˜›™——šœœœ˜”“’••”’’‘‘Œ‹ŠŒ‘“•–—˜—•“‹ˆ‡……„„†„€tgbehnv€ƒ„ƒzzzvv|ƒ††ˆˆ†}zwyz{|}|{{{}~}|}~~~~~€€ƒ…‡ŠŠ‹‹Š‰‰‰ˆ‡‡…{megq~†ˆ‰‰‰‰‰‡††‡‰Š‹‡…„„„„„„ƒƒ„ˆ‰„~|}}~ztlinrrpqruyyyyyyyyzzzzyyz{|}~~€€~~}}}}}}||}}{{||zzzzzzyz||}}}~€€€€~~~~~€€‚‚‚‚ƒƒƒƒ„„ƒƒ‚‚„„„‚ƒƒƒ†Š‹Š‹ŠŠŠŠŽ“—–“‹…„ˆŒ‹’•”““”—›˜ˆ‡ŠŽ‰|vy}€ˆ–œ˜——™šš™”””˜™š™——”““““’‘ŽŽ’•––”””“‹†„ƒƒ„‡ˆ†xhhnkhnv~‚ƒ€~zxxxy{‚‚ƒ„„}{z~|||{{||}~}||~€€€€€€‚„‡Š‹‹‹‰‰‰ŠŠŠˆˆŠ€pgdis‚ˆ‰Š‰ˆ‰‡…†‡ŠŒŠ†„„„„„„„ƒ…‡ˆˆƒ‚}tklnprtuwx{xxxxyyyyzzzzzzz{|}}}~~~~}}}}}}||||{{{{zzzzzzyz||}}}~€€‚‚‚‚‚‚‚‚}}}|}}~~€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„„‚ƒƒƒ‰‘Š‡‹Š†ƒˆ‚€†—›š”ˆ‚‡’’“•”““”—šš”ŽŠ‹‹Œˆ€tpvˆ“œš—šœœ›š˜—™••žŸ™•””””•”’“””““”“’’’ŒŠ†ƒ‚„†ˆˆ„yqrusonr{€|{yuuwwuttrrv|~~||}|}||||}~}|}€€€€€€~‚„ˆŒŒ‹ŠŠŠŠŠˆ‡ˆ…yjcenz„‰ŠŠ‰‰‡…†ˆŒŒŠ†„„„„„„„„„ˆ‹Š„€€€{pkmosvy{|~€xxxxxxyyyyzz{{||}}~~}~~~}}||||||{{zz{yzzzz{|{{|||}€‚‚‚‚‚‚‚~|{{|{{{||~€€€‚‚‚‚ƒƒƒƒƒƒ……ƒƒƒƒ„„„„ƒƒ…‹‘ŽŠ†ŒŠŠ‰ˆ‚~„˜™™•‘Š‚‹’‘’•”•—˜››˜‘ŒŠŒŒˆƒztnr{‹šžœœŸŸŸžš˜—Ÿ ¡ ˜•“’’”•–—••”““””““’‰‡††ˆ‰‰‡{|{wsqt|ƒ„€|xwsnqvvtpmqx}|}}|}}|{}}}}€€€€€€€€‚…‰Œ‹ŠŠŠŠ‰‰‰Š‡pgcjx‚‰Š‹Š‰†…†‰ŒŒŠ†„„„………ƒ„„‰Œ‰…€€‚vljlpsvz}~€€xxxxxxyyyyzz{{||}~~~}~~~}}||||||{{||{yzzzz{||||||}~€‚‚‚‚‚‚‚~~|||{z{{||~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒ…‹ŽŒŒŽŒŠ‰‰…ƒŒ”–•“‘‹‚‰’‘‹“•–—˜šš˜“ŽŒŒŠ†€{tt‘œ¢¢žžœ˜–—”šŸœ™–’‘’•–—˜—––––—–”‘ŽŒŠˆ‰Š‹‹Š†ƒ€{{{~‚ƒ}{{wrlknsuusqqt{„ƒzxxz|||{}}}}€€€€€}}}~…‰‹‹ŠŠŠŠ‰‰‰ŠŠ„znikxƒˆ‹‹Š‰†…†‰ŒŒŠ†„„„………ƒ…‡Š‹‰…‚‚€wlkmosw{~~€€wwwwwwxxyyzzzz{|~~~~~~}}}}}||}{zyzzzz{{zzzzz{||}~~€€~}{{{{{{|}}~~€‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚…Œ’ŽŽ‹…ƒˆ“’…‚ˆŽŽ‹ŒŽ••———˜˜•‘Ž‹Š‡€|yy~‰•›Ÿžžš˜˜˜–˜›š™•”””•–••••–•—˜š›š˜’ŽŽŽŽŽ‘‘‹‡ƒ‚ƒ„…ƒ€€€|qeampsvxywuv|„‡ƒzxyz||z{{€€€~|{||„ˆ‹ŒŒ‹‹ŠŠŠŠŠ‰„ypnvˆŒ‹Š‰†„‡‰ŽŒ‰†„……†††……‡‰‹ˆ…ƒxnlnprvz€€wwwwwwxxyyzzzzz{||~~~}}}}}||}{zyzzzzzzzzzzz{||}~€€€~}{{{zz{|}}~~€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚†Ž’‘‘‘‘‘Žˆƒ…Œˆ†ˆ‹Š‰‹Œ“–—˜˜˜™•’‘‘ŒŒˆ}‚„‹“˜˜˜™—••–•”•—–••––––˜˜––••˜˜š•˜š”ŽŽŽ‘”•”‘Š…„…‡†„€€€~yqbOViotwvusqv€‡‡ƒ…‡‡„€~{z|{}}||zzxwx{}€„ˆŽ‹ŒŒ‹‹ŠŠŠŠŠ‰‡€vptˆŒ‹Š‰†„‡‹ŽŒ‰†„……‡‡‡†…†‰Š‰…€ymkpruy|‚‚‚xxwwxxyxyyzzzz{{||}}~}~~~~}}}}}}||{{{yywwwxyzzz{||~€€‚€€~}}{zz{{z{|}}€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚…Ž“’“‘‘‘”“’‹…„ŠŒ‰‡‰ŠŠ‰‰‹Œ”—™™™˜—”’Œˆ}…ƒƒ†‘”•––““““••••”•–˜™›™™———–˜š›œœ˜•“’ŽŽ‘”——–”Ž‹‹‰‰‡ƒ€€€|ylU73Whptvwwst|†‰‰‰‰ˆŠ‹‹‡‚|zz{zwuttutuw|€†ŠŽŒŒ‹ŠŠŠŠŠŠŠ‰wpt~ˆŒŒ‹‰†„ˆ‹‹‰…†…†††‡…†ˆ‹ŒŠ…{nlpsuy~„…ƒƒƒƒƒ‚‚ƒxxxxxxyxyyzzzz{{{{}}~}~~~~}}}}}}||{{|{zxxxxyzzz{{{~€€€€€~}{zz{{z{|}}€‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚…Ž–•””““””’Žˆ„‡‹Ž‹ˆ‰ŠŠŠŠŠ‹ŒŽ‘•—™™——’Ž‹†‚‚ƒ„ƒ†‰’“’‘‘“––—•••–˜œ›ž›œœ™šš›œ›™™––•’‘’”–˜—––“Œ‹ŠŠŽ‰„‚}ucC,/Vknnrwyupv€‚}x{~ƒƒ†‚€}zyvutux~„‹Ž‘ŒŒ‹ŠŠŠŠŠŠŠ‰wsv‰Œ‹‰††‰Šˆ…††‡ˆˆ‡…†‰Œ‹ˆ~smqtuz€ƒ†„ƒƒƒƒƒ‚ƒxxzzyyxxxyyz{{}}}}}}~~~~~~}}~~}}}}|zzz{yxxwwyyzz{{}~€€€€€~}}|{{{z{{|}~~€€€‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚„Ž–———••––”‘Žˆ„†ŠŒŽŠŠˆ‰‹‹‹‹‹ŒŽ‘“–˜™•ŒŽŽ‹‰„‚‚„…††‹Ž‘’•——••”–˜›™›¡ž˜Ÿ‘—™š™™——••••—˜—˜˜—–“‘‹‰ˆ‰‹‘Œ†€taJ<F`qrnorvusuz}ztvx{~€€ƒ‚‚€~}{vtsvz€†ŠŽŒ‹‹Š‹‹‹‹Œ‹‰€uswˆ‹Œ‹‰††ŠŽŽŠˆ††‡ˆ‰‰‡…†ŠŒsmqtvyˆ‰ˆ„ƒƒ„„„‚~sxxxxxxxxyyzzzz||}}}}~~~~~~}}~~}}}}|zzzyxxxyyyyyy{{|}}€€€€€€€~~}}|{{{zz{|}~~€€€‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚„‹–˜—˜•”–•”‘Ž‰……‰‹Š‰‰‰ˆ‰‰‰‹‹‹ŒŽ“–—”ŒŒŒ†~~„ˆ‘’’“–˜™–””–™›žž†‰˜Š˜›š™™™••–—šš™˜˜˜˜”‹‰‰†„…†…}ul[JNgwyuqotvutw}{y}€€€€€€~}}ywvvw{†‹Œ‹‹Š‹‹‹‹Œ‹‰€utxƒŠŒŒ‹ˆ…†ŠŽŽŠˆˆˆ‡ˆ‰‰ˆ††ŠŒˆxpqvvx€‰‹ŒŠ…ƒƒ„„„‚xmxxxxwwzzzzz{||{|||}}}}}}~~~~~~}}||||{zyyyyyyyyzz{{|}}~€€€€€€~~}|}|}{zz{{|}}}~€€€‚‚‚‚ƒƒƒƒƒƒ‚‚‚‚€€…“˜——–”–•“Œ‰……ˆŒ‹‡ˆˆ‰ŠŠŠ‹‹‰ŠŒŽ‘’””Ž‘Ž‡~xvwx}†––’‘‘–šš—“”—™™‰Œ’“’šžŸžŸ›š˜—–—š››ššš˜’ŠŠ‰ˆ‡„ƒ‚{tkaVO\v€{vppuwtx~ƒ‚~~€€€€€€~~|ywvvz~‚‡ŒŽŒŒŒŠ‹‹‹‹‹Œˆwv{„ŠŽ‹‰†‡‹ŽŠˆˆˆ‡‰‰‰‰‡ˆ‹‰}pruvx~†ŠŒŒˆ„ƒƒ„„ƒrixxxxyyzzz{z|||{|||}}}}~~~~~~}}||||{zyyxxyyyyzz{{|}}~€€€€€~}|}|}{{{{{||}}~€‚‚‚‚‚‚‚‚‚~zxƒ’—˜—–•”’Ž‹‡†‰Œ‘Š‡‡‡ˆ‰‰ŠŠˆ‰Š‹ŽŽ‘ŽŒ‘‘‘ŽŒ†~yxxyŽ——•”’“•˜š–‘“•™š›‰‘——œš””™žžž žš™˜—š›œ›››š“‹Šˆˆ†ƒ{wrmga`k{€|{wpirywx}„…€€€ƒƒ€~{ywvvz~‚ˆ“‘ŒŒŒŠ‹‹‹‹‹Œˆvu|…‹Ž‹‰†ˆŒŽŠˆˆˆ‡‰‰‰‡…‡‡pquvw~…ŠŽŒˆ„„„„„‚ynjxxxxyzzz{{{{||||||~~~~~~~~}}}|{|}}}}||{||||zzz{{{{~~}}~~€€€€~~{{}}||{{||}}~€‚‚‚‚‚€€€‚‚‚~wom|‹”•””•”’‹ŠŽ‰…„„‡ˆ‰‰ˆ‰ŠŠ‹ŽŽŽ’’‘Œ†ƒ€€†˜˜˜——•”•——•—™—‘›—’˜ž œŸŸšž˜ œ˜˜™ŸŸžœ—“Šˆ‰ˆ‡„‚zurqroorwyuuuogjsxy|‚‚‚‚‚‚‚‚~~{yyy}…‰Œ’’Ž‹‹ŒŒŒ‹†}vv~†ŽŒ‰†‰ŽŒŠˆˆˆ‰‰Š‰ˆ‡‡€snrvy~ˆ‹Œ‘‹ˆ…„††…}pikxxxxyzzz{{{{||||||{{~~~~~~~|}~~~~}||{|}}|zzz{{{{||||||~~~~~~~~}}||}}||}}~€‚‚‚‚€€€€xndgy‡Ž‘“••Ž‰Œ’“‘Ž‹†z~…‡ˆ‰ŠŠ‰ŒŽ’’‘’‘‘‘“–˜™˜˜–••—™˜—™œ™’››žž¡ ¢Ÿ¡Ÿ¡œŸ›š›¡Ÿ ™œœ˜“Š‡ˆˆ‡†„~{z{zxqllmknstmhkpw……‚€€‚‚‚‚‚‚€~{yzz{‚…‰Œ’’‹‹ŒŒŒ‹…}wy€ˆŽŒ‰ˆŠŽŒŠˆ‰‰‰‰Š‰ˆ†€xprtv}‡ŒŒ‹Šˆƒ€€€}zshgjyyxyyzzz{{{{||||}}}}~~~~~~}}~~~~~~||{{}}{{zz||}}}}}}}}|}}||}~~}}}}||||||}}€€€€€€€€€€~|qd_fw}{|‚‰’‘Œ’”“‘ŽŒˆƒ|y€„ˆ‰ŠŠ‰Š‹ŒŽ‘‘‘‘’“’‘’“›¡ŸšŽŒ•šš˜š˜—˜››š™š™—   ŸŸŸ ž”— ¡¢Ÿœšœ¢¥¥žœ›—’‰‡†……†„ƒƒƒ}xnbafknqrpjfjuƒˆ†‚‚‚‚‚‚‚‚}|{|~„‡ŠŒ“’‘ŒŒŒŒŒ‰‚{xz€ˆŒŒ‰ˆŠŽŒ‹ŠŠŠŠŠ‰‰ˆ‚vrtuvy…ƒ‚~{vqnooomlfeflzzyz{|||}}}}||||}}}}}}~~~~}}||}}||||{{||||||{||{z|}}}}}}||||}}~~€€€€~~€€€~zshb`ehjknz„‘’Ž‹‹””’‹‹ˆ„‚orz‚‡‰Š‰‹ŒŒŽ‘‘‘‘“”“‘‘‘•¨¦‘Š›¦§¢›˜˜››š˜˜šœ›¡¡ ”› ¡šŸ› Ÿž›ž¡£¢ ž›—‘Œ‰ˆ‡…„„‚‚€~}ytqnicbglornhen|€€‚‚‚‚‚‚‚~}}€‚…‡ŠŒ““‘ŒŒŒŒŒŒ‰zx}ƒŠŽŒ‰‰ŒŽŒ‹ŠŠŠ‹‹‹Š„wqtvutvspnjihhfghhhgfecehzzyz{|}}||}}||||}}}}}}€€€€€€€€~}}~~}}||||{{{{zz{{{{||}}}}}}}}|~€€€€€€€€€€~~}~~~|{vmfabdehin{ˆ’’Œ‰Ž‘”—”Ž‹ŒŒˆ„ƒ‚tjlw†‰ŠŒŒ‹‹’“““““••’’‘“™¡¤’‹œ­®©¥——šœœ›š›žŸ ˜šœœœ˜˜šœŸŸŸœœ £¡žœ›—‘ˆ‡††„ƒ‚€~{vux|yla^bjoojfkuyz{~€‚‚‚ƒƒƒƒ€€‚ƒ…‡ŠŒ”“‘ŽŒŒŒŒŒŒ†~yz~…‹Œ‹‰ŠŽ‹Š‹‹ŒŒ‹‡}stvsonieccdehilnoponkhhffzzyz{|}}}}}}||||}}}}}}€€€€€€€€~}}~~}}}}}}}}{{{{{{||||}}}}}}}}|~€€€€€€€€€€~~~}~~~|ukeehfeefgo|‰‘Ž‹‹’”—–”’ŽŠˆ†ƒ}trv|‚‰Š‹ŒŽ“””•”“”””’’’•›¡™¢«§¢ žš™˜›œœœœœ˜—¢Ÿ›™šœ›™œœ›™››™œžž›˜•’Ž‹‰‡††„ƒ„€~|zvx{€ync^`hmkgmy€€€‚‚‚ƒƒƒƒ€€‚ƒ†‰ŠŒ”“‘ŽŒŒŒŒŒ‹…~y{€‡Œ‹Š‹ŽŽ‹ŠŒŒŒŒ‰€tsrligdedehlouy}~€€xqlmlnn{{{{{}}}~~}}}}}}|||~~~~~~~}~€€€€€€€€€~~~~~~~~~}{||||{{||||}}}}}}}}}}€€€€€€€€€€~~~~~~~xofbehddedgp{‰Œ‰Œ‘“–˜–•”’ŽŠŠ‡{utzƒ‹ŒŽŽ’“”–•”“”•”•““”—ž¨«¦ž›˜››™™œžžžœ››–£§¥¡žžžœšš™–•™˜˜šœ›™—’ŽŒ‹‰‡†…„ƒƒ€}yyy|}wkb]blmlmt{‚‚‚‚ƒƒƒƒƒƒƒƒ…‡‰Š‘“““ŽŒ‹ŒŒŒŠ‚|{{ˆ‘Œ‹ŽŒŒŒŒŒŒ„vnlhgdghkkntzƒ…‡ƒ…†‚zrmoqvx{{{{{}}}~~}}}}~~~~|~~~~~~~~€€€€€€€€€€€€~~~~~~~~~}{||||{{{{{{||}}}}}}}}€€€€€€€€€€~~~~~~|xpfeffgggccir€Œ‰‹”—™—–––“‘‘ŽŠ†€vtz„’‘Ž‘’“”––•‘‘‘”–””•–™ ¡˜“”—––—šž›š››Ÿ¤¤¡žœœ›š™˜••™™˜šš˜”Œ‹‰ˆ†…„ƒƒƒ‚€~~~€€€€€}xqe^elqroqu|‚ƒ‚‚ƒƒƒƒ„„ƒ‚ƒ…‡‰Š’““ŽŒ‹ŒŒŒˆ|{{ƒ‰Ž‘Œ‹ŽŽŒŒŒŒ‹†xnkikkmmqv|„Š‰†††~rnnt{…||{}|}}~}}}}~~~~~~}~~~}~€€€~~~~~~}}}}|z||||||{{z{||||}}|}~~}€€€€€€€€~}}}}}yshdfgikkibbjs~ˆ‡‡Œ‘”—˜˜˜™™—•Œ‰…|y|„“‘‘’“““•”‘Ž’•––•“—˜š—’•””•–šžŸ›˜•››¢¢¡ž›———˜š™˜—–˜™˜™˜••“‹‰‰ˆ†…„ƒ‚~||}€‚€€€zqcfjoojelxƒ‚€~ƒ„‚„„‚‚€‚‚…††ˆ‹Œ‘’’ŽŒ‹‹‡€zz„Š‘Œ‹‘ŒŒŒŠ}mifhmqrv~†Œ‘’’‘‰ˆ‡ƒyqnrx~„…zzz{|}}~~~}}}}~~~~~€€€€€€€€€€}}|z{{{{zzzz|||||||||}~~€€€~~~~~~~}}}|zshccfilmkgbbit„…‡’”–˜š™™šš˜–ŽŽ‹Š‰‚{~†‘‘‘‘’““’““ŽŒŽ’••“’’”˜—•”””•–˜››—••—›žœ›™–••–——˜˜–•––—••”‘‰‰ˆ‡†…„ƒ‚€}{z{}€€‚€zurqrogjvƒ†„‚„„ƒ„„‚‚ƒƒ…†‡‰Š‹‘’‘ŽŒ‹Œ‰…}|{€‡‹‘Œ‹ŒŒŒ‹pffhkty~…Œ‘’’’‘‰‡†~tpps{‚…‡{{||}~}~~~~~~~~~~~|~€€€€€€€€€€€€€€€}}}}|zzzzzyyzz{{{{||}}~~~~€€€€}}}|||}}}}{uicaehmqpnibcluƒ„‰“••–™›ššš™—•‘Ž‹‰†ƒ~…’“Ž‹ŠŠ‰‹ŒŽ‘”““’’••“““”–˜˜™˜—•’’“•š›šš™š—–•——™˜˜˜˜–•”•“‘‰ˆˆ††…„ƒ€~|{y{{|€‚ƒƒƒƒ‚€}~}{{{urw}„†ƒ€€‚„„ƒƒ‚‚„„†††ˆŠ‹Ž’ŽŒŒŒŒŒ‡|{|‚ˆ‘Œ‘ŽŒŒŒˆuhfknrz…‹‘’“““‘‘‰ˆ„yqqsy…ˆ‡||}}{|}~~~~~~~}}~~~~~~~~€€€€€€€€€€€€€€€}}}}|zzz{{{{{{||{{{{z|~~~~}}}}~~~}}}}}zrjddcekpsqngbcir|„‰”—–—™›šš™—•’ŽŽŒ…}z~‚ˆŽŽ‘ŽŒŠ†‚€‚…‡‘‘““““”—ž¢ –“”’‘“”——˜˜—šž›˜—˜™›š›˜•“”“Œ‰ˆ‡††…‚~|{z{{|€‚ƒƒƒƒ‚‚€€€‚ƒ‚}x~…ywx€„„„„ƒƒ„…†††ˆŠ‹ŽŒŒŒŒ‹…€|{|‚ˆŽ‘‘ŽŽŒŒŠzlfinr{‡‘‘’““““‘ŽŠ‡…uprt|ƒ‡‰‰}}}}}}~~~~~~}}||}}||~~€€€€€€€€€€€€€€€~~}}{{{{yzzzz{{||||{{{|~~~~~}}|}€€€€}|ztjddeeiossqlfaelx„…‰•˜—™››››—•“ŽŒˆxnu|†‹ŒŒ‰‡„€~{|ƒ‰ŠŒ‘’‘•—§¬¦™”‘‘“•—˜———˜››™™šœ››œž›˜•””’‰‡‡‡………ƒ‚~||{{|}€‚ƒƒƒƒ‚‚‚ƒƒ‡‡y|‚z{}ƒ……„„ƒƒ……††‡‰‰‹ŽŒŒŒ‹„~}}€„Š‘‘‘’’Œ‹~mdfknu„“““””••”‘Œˆ†…{rnqxˆ‰‰‰~~~~~~~~~~~~}}||||||}}~€€€€€€€€€€€€€€€~~}|{{{{yzzzz{{||||{{{|}}}}}}}}}}~~}}}{ukdcegimqttpkhgip|…††‹•˜™›››š™˜•’ŽŒ‹ŠŠŠ|giu||~€…‡‰ŠŠ‡„€|{|ƒ†‰ŠŒŽ‘”œ§«¬©£›•’’‘’•–—•••–™™™™šœ›š›œ›˜”“‘‹ˆ‡‡‡………ƒ‚~}}}}}~€‚ƒƒƒƒ‚‚‚‚ƒ„‡‰ˆ…€‚‚~{„……„„ƒƒ……†††ˆ‰‹ŽŒŒŒ‰ƒ~~…‹‘‘‘’’‹€qjiilr’“””””••”‘Œˆ‡€uoqv{„ˆ‰ŠŠ~~~~~~~~||}||||||~€€€€€€€€€€€€€~~}|}|{{{z{{{{zz{{{{{{||zz||}}~~~~~}|ulcaehlnqvwsnjghlsˆˆ‡–™™œœ›š˜—•“Š‰‰‹‚l`lvvxwx|ƒ†‡††…‚€~‚‚†ˆ‰‹ŽŽ’¨ª¥¢žš•“•”‘‘”˜™—™›š—˜˜–•“’‰‡‡‡ˆˆ†„ƒ~~}}~ƒƒƒƒƒ‚‚„…‡ˆ†„‚„€yx{~‚„„ƒƒƒƒ„†……†ˆ‰ŠŒŽŽŒŒŒˆƒ€‚ˆ’‘‘‘‘‘‘ŽŒŠ…ykjklr{‹’””“”••••“Š‡†|spty€†ŠŠŠŒ~~~~~~~~~~}|||||~€€€€€€€€€€€€€€€€€€~}}|||{z{{{{zz{{{{{{||}}||}}}~~~}wmd`dhknsvxwqlhgks{„Œ‰†Œ•˜—šœ›š˜—–”†‚…ˆ†‚qacpvwwx|‚„…„…„„„‚ƒƒƒ„†ˆŠŒŽ“™œœ™—“Ž‰ˆ‰‹ŽŽ”•–˜›š˜•””’Ž‹ˆ‡‡†‡‡†„ƒ€ƒƒƒƒƒ‚‚‚‚‚„††…„ƒƒ}tsw|„„ƒƒƒƒ„†‡‡†ˆ‰ŠŒŽŽŽŽŒˆƒ„‰Ž‘‘‘‘‘‘‘‘ŽŒ‡{lklmpxƒŽ”“““”••••“‰†‚xqrv{‡ŠŠŠŒ~~~}|||{}}||}}|||}~~€€€€€€€€~~}|}}{{z||{zzzz{{{|}}}}}}}}|}~~}}~}zshbbhkmsyz|wqlihnt{‡ŽŒ‡ˆ•—™š˜–•“‘‰†ƒƒ~vf`mtwxz~ƒ…„…„„„ƒƒƒƒƒƒ„†‰ŠŽ’”—˜—”“‰ƒ„†‰Œ‹ŠŠŒ”“—˜™–““’ŒŒŠ‰‡‡ˆˆ††††„‚€~~€‚‚ƒƒ„„ƒƒƒƒƒƒ„„…„„{totzƒƒƒ‚„„…†††‡‰ŒŒŒŽŽŽŽŽŽ‹†„‚‚„ˆ’’’’’’‘ŽŽ‰€qkonnw””””••••••’‰…|trtw}…ŠŠŠŠŠ€€~~~}}}}}||||}}|||}~~€€€€€€~~}}~~}|||{{z|{zzz{{{{{|||}}}}}}|}~€€{tkcafikqwyzytmihlpw{…‹…‡’•˜™š™–•””’Šƒƒ~yk`m~€ƒƒ……„„„ƒƒƒƒƒƒ„†‡‰‹ŒŽŽ’”““‘Œˆƒ‚ƒ…ˆŠ‹‰Š‹Ž’”•”‘ŒŠ‹‹‰ˆ‡‡ˆˆ‡‡‡‡„ƒ€€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒ|tkchuƒƒƒ„„……††‰‹ŽŽŒŽŽŽŽŽ‹ˆ…‚ƒ„†‹Ž‘’’’’’’‘†vlknps|ˆ‘•”””••••••’ˆ„xqrvz€ˆŠ‹‹ŒŒ€€~~~~~~||{{{{||||||||}~~~~||~~|}||||||zz{{{{{{||{{|||}}}}}~~~~zpgbeilpw{||yunihnuxz…Ž‹†…ˆ’•™˜•”“““’Ž‹ˆ†ƒ€~q`i€‚‚ƒƒ……ƒƒƒƒƒƒƒƒ…†‡ˆŠŠŠŠŒ‘‘Œ†ƒ‚‚‚„‰ŠŠ‰‰Š‹‘‹‰‰‡ˆˆˆ‡‡ˆˆ‡‡‡‡†…ƒ€€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒxslb[gzƒƒƒ„…†††‰‹ŒŽŒŽŽŽ‹†‚‚ƒ†‰‘’’’’’‘’’‘Špjkptzƒ“”•””””••–”“Žˆ‚vqsw}‚‰‹‹€€~~~~||}|{{{{{{|||||||}~~~~~~~~~~~~~~}}|}}}}}||{{{{||||||{{{{{|}}}}~~~~wlbchjnty{}{yuqmmnmjm~Ž†…ˆ‹’•”‘‘‘‰††…wee{„„ƒƒƒ„„„„ƒƒ††……„„ƒƒƒ…†‡‰‰‰Š‹‹ŽŒ‰…ƒ‚‚‚ƒ†‡ˆˆˆ‡‰Š‹ŠŠ‰‡††‡ˆˆˆ‡‡ˆˆˆˆˆˆ‡†…ƒ€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒ}wqlcRPgz€‚„……†††ˆŠŠ‹ŒŽŽŽŽŒˆƒ‚ƒ…‡‹‘’’’’’‘’’‘†unmnqu}‡‘”•”””””••–”’Žˆursx~„‰Œ‹€€~~|~~~~{{{{{{{|||||||}}}~~~~~~~~~~~~||}}||}}||||||{{{{||||||}}~~~|vkegikov{}}}{wspplc_i‚‘‡ƒ…‹Ž’ŽŽ’Ž‰ˆ‡…‚zkew„ˆ†„„……††††‡‡††††„„ƒ…‡‡ˆˆˆ‰ŠŠ‹Œˆ„‚‚€ƒƒ„…††ˆ‰ˆˆ††…„„†ˆˆ‰‰ˆˆ‡‡ˆˆˆˆ‰ˆ††…ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚ƒ‚ƒƒƒƒ‚~vmbOLZp€ƒ…††††‡ˆ‰‹ŒŒ‹ŽŽŽŠ‡ƒƒ„‡ŠŽ‘’’’’’’‘’’’Œ}olnpt{‚‹“••”••••–––“‘Œ‡|ssu{ˆŠ‹ŒŒ~~~~}|}|{|{{{{{{|||||||}}}~~~~€€~~}}||}}}}}}||||||{{{{|||||}}}~~}{vnhjkmsx}~{{zxuspg^_mƒ‘‡ƒ†Œ‘ŒŒ‹ŒŽ’Š‡…{mbqƒŠˆ‡‡ˆˆˆˆˆˆ‰‰ˆˆˆˆ††…†‡‡ˆˆˆ‰ŠŠŠŠŒŽŒˆ„‚‚€€€‚„††‡ˆˆˆ†„„…‡‰‰‰‰‡ˆˆ‡‡‡‡‡‡‡‡††…„„„„„„„ƒƒƒƒ‚~zwv{€‚ƒƒ‚‚‚€zrnotz~‚„ƒ…††††‡ˆ‰‹ŒŒ‹ŽŽŒˆ„ƒƒ„‡ŠŽ‘’’’’’’’“’Žƒsmnprw~†Ž“••”••••–––“Š„xssv|…ˆ‹ŒŽŽ~~~~}|||{{{{{{{{||{{{{|}}}}}}}}}~~}}}}}}}}}}||||||{{||{{}}|}||}}~~|ztpknmpw|~~}}zwsld]_n…†„‡‘‹Š‹ŒŒŽ“‘ˆ…‚|tpgg‰‹ˆ‰‰‰‰‰ˆˆŠŠ‰‰ˆˆ††……‡‡‡‡‡‡‰‰ŠŠ‹ŒŠ†„‚€€€€ƒ„††‡‡‡†…†ˆ‰Šˆ‡ˆ††ˆ‡‡††††………†‡‡……„„„„„„…„ujcgqzƒƒ‚‚€~|||~{}‚‚…†……††‡ˆˆ‹ŒŒŒŒŒ‹†ƒƒƒ…‡ŠŽ‘’’’’’’’”’{omops{‚Š’“”•”•••––––“Štqsv}†ŠŒŽŽ~~~~}|{{z{{{{{{{||{{{{|}}}}}}}}}~~~~}}}}}}}}}}}}||||||{{||{{{{z|||}}~~{ytpmnory|~€}zwpgZXfu‚‰‰…ƒ†ŒŠŠŠŠŠ‹’’‹ˆ„{rl`e|†ŠŠŠŠŠŠŠ‰‰ŠŠ‰‰‰‰ˆˆ‡‡‡‡††‡‡ˆˆˆ‰ŠŒŒ‹ˆ††„‚€€‚„††‡‡‡†‡‡ˆŠ‰‡…„„„…††††††………†…………„„„„„„„‚|qc^]eoz€€}yx|~||~ƒ…†‡‡††‡ˆŠŒŒŒŒŒŒ‹ˆƒƒƒ…†‰ŒŽ‘’’’’’’’”Žƒrllnpv}„‹“”•”•••–––•’Œ†{ssuz‡‹ŽŽŽ}}}}||||}}||{{zz{{{{{{zz{{}}||}}|}}}}~~~~~~~~~~~~}}}}}}}}}}||{{zz{{zzzyyz||z||||yplmknry€€~€€~zsk]Z]js}‡‹‡ƒ„‰ŽŒŠ‰Š‰‰‰‹ŒŽ‰‡…ƒ{unbo‹‹‹ŒŒŠŠŠŠ‰‰ˆˆˆˆ‰‡ˆˆ††‡‡ˆ‹‹‰‰ŠŠ‹ŒŒŒŠ‰‡…ƒ‚€‚‚„††‡‡‡‡‡ˆ‰Š‰„€}ƒ„„……†††…†…„„ƒƒƒ„……†…„ƒ|qe^Y\emt{}zyyy{~}|~‚„„…†‡‡‡ˆ‰‹ŽŒŠ†„‚……ˆŒ‘‘’’’’’’”‘‡znnlmqx€‡Ž’•••”•••–––”‹„wsru}„ŠŠŽŽ‹}}}}{{||}}||{{zz{{{{{{|||||||||||}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}||||{{||zyyz{{yyz{yunkkjjnx|~€{tkb[\aemx…‰…„ŒŽ‰ˆˆˆˆˆ‰‹‹Š‡††‡†ƒ‚€}~‚‡‰‰ŠŠˆˆ‰ˆ‰‰ˆˆˆˆ‰‡ˆˆ††‡‡ˆŠŠ‰‰‰‰Š‹‹ŒŒ‹Š‰‡„ƒ‚‚„††‡‡‡‡‡ˆ‰‰„~ywz€‚€}~~ƒ„…†…„„ƒƒƒ„ƒƒƒƒƒƒ}re^\]`ipwyzzyvvx{|{z}„…„†‡‡‡ˆ‰ŒŠ‡…ƒ„†‡ŠŒ‘‘’’’’’’’Œ~qmnmqu|Š’•••”•••–––”Štstx†‹ŽŽŠ„}{{{{{{y{{{{{{zzzzzz||{{}}}}}}zz}}}}}}}}~~~~~~~~~~~~}}}}}}}}}~~~~~}}||}}}}{zy{zywvxywrlggghmu{~ypiedcecags‚ˆ†„Ž“‰ˆˆ†††‡Š‰‡ˆˆ‡ˆ‰‹Š‡‡††‡‡ˆˆ‡‡‡†ˆ‡‡‡‡‡ˆˆ‡‡†††‡ˆ‰‹Š‰‰ˆ‰‰‰‹‹Š‰†…………†‡ˆ‡‡‡‡ˆ‰‡‚yvv{}yyy|„…‡†„„ƒƒƒƒƒƒ€€~{tib`_^fmqtx|{zxx{{|{~„…„…†ˆ‡‰ŠŽŽŒŠ‰†ƒ‚„‡ŠŒ‘‘‘““““““’ˆynnnou{€…“••””””•–••’Žˆ~uuvyˆŒŽŽŽŽ‹„|}{{{{{y{{{{{{{zzzzzzzz{{{{||{{}}}}}}}}}}~~~~~~~~~~||}}}}}}}}}~~~~~}}||}}||z{{zzyvuvvuqjfcfghowxphdejlgb`bk}ˆ‡€‚•‰ˆ‰‡††„‡‰Š‰‰ŠŒŒ‹Š‡‡‡‡‡‡‡†…‡†††††……†††††‡Š‹‹Œ‹Š‰Š‹‹‹‹‹‹Š‰‰‡†††‡‡ˆ‡‡‡‡ˆ‰‡{vw}zwx|~‚ƒ……„„„ƒƒƒƒƒƒ}{tmheeb``_`aiq{{tnmqtxy~‚„†…†ˆ‡‰ŠŽŽŒŠ‡ƒ‚„†‰‹‘’’““““““ƒrmopqx}ƒˆŽ’••””””•–••‘†{tuu{ƒŠŒŽ‹„xn{{yyzzzzzzyyzzyyyyzzzz{{{{{{{{{{}}}}}}}}}}}}}}}}}}||}}}}}}||~€€}}}}}}||{zzzyyyyvvtsrmgabchehryzridhnsrqh`^f}ŽŽƒ‹”ˆˆ‰‰…„„„†‰‹‹‹’’Ž‹ŒŠˆ†††††………………„„……†††††‡‰ŠŽŒŒŒ‹‹‹‰Š‰Šˆ‡‡‡‡ˆˆˆˆ‡‡ˆ‡†|z|~‚|z{~ƒƒ„…ƒƒ„ƒ„ƒƒƒ‚‚€zkRFN\eca`a``eluwrnhb][dou~ƒ„‡ˆ†‰‹ŽŽŒ‹‡…‚ƒ„‡ŠŒŽ‘‘““““’‘‹|qnppuy†‹Ž‘“••””””••”“‹‚ywwy†‰ŒŽ‹†zok{{{{zzyyyyyyzyyyyyyyyyzz{{{{{{{{}}}}}}}}}}}}}}}}}}||||||}}~~~~~}}~~}}||{zzzyyxxwwtspkebcgiihjswrklqx|{wqhch€‘’‡‡Žˆˆ‰‰‡†‚„†‰‰Œ‘“”“Œˆ‡††††………………„„„„„„„„†‡‰ŠŽŽŽŽŽŽŒŠ‰‰‰Š‡‡ˆˆ‰ˆˆˆˆˆˆ‡†~}€€}|~ƒƒƒ„„ƒ‚ƒƒƒƒƒ‚‚~ueYX`egebabeecdfllhd^YUOU]^fr€†ˆˆ‰‹ŽŽŒŒ‰†„‚ƒ„‰‹‘’““““““…wqsruy}€‡‘“••””””••”’‡|vwwz€‡ŠŒŽ‡|rmk{{zzyyyyyyzzxxwwxxyyxxzz{|||||{{}}}}}}||}}}}}}}}}}|||||||~}}}}}}~~~~~|}|{yxxyyyyxwurohcadjmlgekrqpru{€€{rmq‚”ŠƒƒŠŒˆ†ˆˆ‡†„‚ƒ…‡‡‹’””’Œ‰††…††‡‡††……„„ƒƒ„„ƒƒ„†ˆŠŽŽŽ‘‘Ž‹‹ˆˆ‡ˆ†‡ˆˆ‰‰ˆˆˆ‡…‚‚‚ƒ‚€€ƒƒ‚‚~{~€‚€€‚‚}wqs}|vnidcgkjeacdfeaXSONTSOQdy„…ˆŠ‹ŽŽŒ‰†‚ƒ„„‡ŠŒ‘“’““’““‚uttty|~‚ŠŽ‘’”””””••••”‘‡|wxx{ƒ‡‰Œ‰€tmmnzzyyxxyyyyyyxwyyyyyyyyzzz{||||}}}}}}}}~~~~~~}}~~}}|||||||~}}~~~~~~~~~|}|{yzzzzzzxwvtokfchnrrojkqqompy‚€ztv‚™’„†‹‰ˆˆˆ‡†…„‚ƒ……‡Š’”’’‰…„………‡‡‡‡……„„ƒƒ„„ƒƒ„††ˆˆŠŒŽŽ’’“‘ŽŠˆ……„…†ˆ‰‰ˆˆˆ‡„ƒƒƒ„„ƒ€yrrw|€€|tporw{{{||€ƒwogcdhpojdb`_ZSKGFF@KJLWer~†‰‹ŒŒ‰†ƒ‚ƒ…‡‹‘‘“’““’“’‰|tssty}‚Š‘’”””””••••”‘‹‚yvyy}…‹‹ˆ‚xpmpsyyyywwwwxxwyxxyyzzzzxyzz{{||||}}}}}}~~}}}}||||{{}}||||||}}~~}|}|{{{{||||zxxwvsnjgfjqturnkmnnihr}‚‚|wxƒ—“…}‚ˆ‰‰‰‰‰ˆ…„ƒƒ…†„‡‰Š’‘Ž†}ƒ……††‡‡‡‡††„ƒ‚‚ƒƒ„„„…‡ˆŠŒŽ‘’‘’““‘Š‡†„ƒ‡ˆˆˆˆ‡†††……‡„zpjgggjpuuqnjjnpsqpsx|ƒ}sjbbadnpleb\YTL@:68=EC@HUfu€†‰Š‹‹Š‰„€‚ƒ…‡ŠŒ‘’’’’“““”Ž„vqrtv{~~ƒŠ‘“”””””””••“’Šwvyy†ŒŠvonquvxxwwwwwwxxwyxxyyyyyyxyzzzzzz||||}}}}~~}}}}||||{{}}||||||}}~~}|||{{{{{||||zxxwurnjeehotutpkjjjdcmz€€zvv€•’ˆ}|‚†ˆ‰‰‰ˆ‡……‡‰‡†††ˆ‹ŽŽ‹ƒrcn}‚„……††……††„ƒ‚‚ƒƒƒƒƒ„†‡ˆ‰Š‹Ž‘‘’”“Ž‹‰†|vy„…‡‡†††„…vliigefginturmhcdghgis|€ukgcabjrqjc]ZUOIB<>GMNRWPMcq}†‰‹‹‰†‚€ƒ†‰‹‘’’’’”””’‹~ustvx}~~‚‘“”””””””••’Žˆ}wxy{‡‹‹„{qmnty|wwvvwwwwwwwwwwyyxxyyzzzzzyzz{{||}}}}}}}}}}}{{{{{||}}{{}}}}}}~|zzyyy||||{{{{{yxvspkdcenswxuplkjgcjw€ytuŒ’“‹‚~~„ˆˆˆ‰‰‡‡ˆ‹‡……†ˆŠ‰Š„vfXYs~‚„„ƒ„……†…ƒ‚‚‚‚‚ƒ„……‡ˆˆŠŽ‘‘‘““‘Žˆ€srv|ƒ‡†‡†ˆ…‚yqoppljijjmtvvnieb`_`fs}ƒ„„‚xmhebcmzzrkd`]YVZ\ZYYTY_H,@_t„‹Šˆ…€€ƒ„‡ŠŽ’’‘’”””’ˆyppruz|}~„‘’“””””“•••’…|wxy|‚ˆŠˆ}toonu}uuvvwwwwwwwwwwwwxxyyzzzzzxyy{{||}}}}}}|||||}}}||{{{{}}}}}}€€~zwvuux{{{|{{{{{{zvsolfcbhnrwvtpkjgcet}~xvsvŒ’“Ž‡}†‡‡‰‰‰‰‹‘‘Œˆ‚~}{|zujaTN[y€„„ƒ„………ƒƒ€‚‚‚ƒƒƒ…†‡‰Ž‘‘‘ŽŠƒxqssy‚…†„~wustvwupnklswwvrnjfffkv‚ƒƒƒ}rlfbfszxsked`^]^cfe_^_Y=,1ATi|„†ƒ„…‰ŒŽ’’’”••”‘„xqqruz|}~„‘’“””””“•••Œƒyvyz~ƒˆŠƒxqpqu|‚ttvvwwwwvvxxwwvvwwyyzzzzzzyyz{||||{|}{}|}}}}}}||||||}}}}}~~€~~~}{wsqsvz|~|}||{z{yyvrmgbcjosuvtroljdaiqropsvƒ’’Š‚}…‡ˆˆˆˆŠŽ“””’‹ƒyoinqlf`TKLc{‚„„„„…ƒƒƒ‚‚‚ƒ„†‡ˆ‹ŒŒŽ‹Š‰‰‡‡ˆˆ‰„vnnruy|~€‚€|yxtu}‚€vpnoquvuutqpnnqv~‚ƒƒƒ{rld_cpwwtoiccbbcgjlkd[M:8FOZpƒˆˆˆ‹‹ˆˆŽŽ’’’“••”€rooovz~}€‡’‘’“””””””•“‰zwxy†‹…ztpqrx‚‡„vvvvvvwwxxxxwwxxyyyyzzzzzzzz{|{{||~~}|}|}}|{||}}||||}}}}}~~€€€|zwsqqsw{|~~~~|{zyxvrmecfnqvxxwvpmkf_biiimrxƒ’’‹……‡ˆˆ‡ˆ‹––—“Ž‡}nggkid^VOGMl|………„………„ƒ‚‚ƒ„‡ˆˆ‡††……ƒ„„ƒ„…ƒ‚{tqruyzyyzywyx{€‚…ƒzqorvyxwwwvsqqtzƒƒƒ}smfbht{{uqjhhgeddccb^TD:?Xw‡‘‘Œ‰„‚ƒ‡‹Ž’’’“““”~rqoov|}€‰’‘’“””””””•“ˆyyyz€†…}ursuwˆ‰ƒuuvvuuuvwwxxxxxxyyyyyyyz||||{|||~}~~||}||||{{{{{{{|||||||}€€€~{wrqqty}~€|{wvttqoiefjpuvxyxvtqokghjmlosz…’‘Š„‡ˆˆˆŠ”˜™—“’‹ƒulihhc[RNHEPu……………„…ƒƒ‚€€€€€€ƒ„†‡††ˆ†……„„…†„‚ƒƒzvruxzyz{yyzx|…‡‚zspsz|zywwxvssw}€‚ƒ…ƒ|tkednx|ytqmllhbbcb_a`TKHPi†“˜™–ˆxuxxwz…Œ‘‘’““””{spoqx~~‹“’“”””””•••“…~{zy{ƒvrquvzƒŒ‰ƒuuvvuuuvwwxxxxxxwwyyyyyz{{{{{|||}|||||}|{|{{{{{{{{{{||||~€€€~{wrqprx{|{vtokighihfeinsvwvxxyxurprtuwqnqx‚‘’”’Œ„„‡ˆˆŠŒ‘•™š™”“Š€vnhdb^WPKCCXy†………„…ƒƒ‚ƒ‚„……†‡‡‡‡‡†……†…„„„‚}wtwyy{{||{z}ƒ…‚ysqv}~}|zzyxuvz}‚ƒ„yqkefowysnklmmjebcfcbaZSPXp‹™Ÿž€zzwtrnlv‡‘‘’““””ˆxqppry~|€‹“’“”””””••”‘‹„|zzy{ytrsw{Š‹†€uuuuuuuvwwwxxxwwxxxxxxyyzzyyz{{z{{{{{{|z{{z|||{{{{||{}~~}~~~~|ytnnov{zwqid`_^\]`chntuxxxxy{xwspty||sosx€Œ“””’Ž…€‚ˆŠŠŠ”™š™—”Œ…unjfa[SLG@Db{„…„„„ƒƒƒƒ‚‚ƒƒ‚ƒ‚„„†††††…††††‡†‡‡……„„ƒƒ|vuxyzz~|{}~wppv€‚‚€|zwwy~ƒƒƒuokeht|ztnihjjmgdefdab_YX_tŠš Ÿ‹yuqlfcr‰’‘‘‘’“””“ˆxoppry}}}ƒŒ‘””””””””••“Šƒ{yzx{}ztrsvx€„Œ‰ttuuuuuvwwwxxxwwwwxxxxyyzzyyyzzy{{{{{{|z{{z|||{{{{||{}~~}~~€€~|vqnorxwsjeaceb_^_elrvxxxxxy{ywtqsy|{rnrv€’””•“Œ…„‡‰ŒŒ’–—™˜–’‘ŽŠ‡€|xqh_YQG@<Ghzƒ„‚‚ƒƒƒƒƒƒ„……„ƒƒ…††‡‡‡‡‡‡ˆŠ‰‰‰‰ˆ†„„‚‚|yy{{{~|{}€€}zxrpqxƒƒ„„ƒ€~zxz~ƒƒƒ~toicht|zulhgimkhhihfdb___ds‡•œšŠ…yphdb^buˆ‘‘‘’“””…wqrsu{}}„Ž‘””””””””••“Š€{{zxxxvqsuy†‹‰†ttuuuuuvxxyyyywwxxxxyyyyzzzzzz{|{{{{{{{{{{{{{{{{||||||~~}~€~ztqpptuofdhmpmfdfnsvyyxxyyzzyxtstx|zroqu{‡‘””–‘‡†ˆ‹Ž’”•—•“‘‹‰ˆ…‚}tjaZWME?CRp|ƒ‚ƒƒƒ‚ƒ…†††„ƒ„‡‰‰Šˆˆˆ‰ŒŽŒ‹Šˆ‡‡†…‚‚‚~{||||~|~€€|yurpqz„„ƒƒ‚‚~|~€ƒ…„|smgcju}|wplhklkmnnkgeca`bdp~–•‰…‚xnd^]\[dzŽ’‘‘’“””ursrt|~~†’””””””“•–•“…}{}}xuussux|‚Š‰‡…‚€vvvvuuuvwwxxwwwwxxxxyyyyzzzz{{{|{{{{{{{{{{{{{{{{}}||||}}€€€}uqmloqnhimuzyrkinuwyyxxyyyy{yvttwzyspqrwˆŒ’–—“ŠŒ‘““”•”’Šˆ‡‡†ypg^YVOIDFTr€ƒƒƒƒƒƒƒ…†ˆˆ‡…‡‰Š‰‹‰‰‹ŽŒŠ‰‡†………‚‚ƒ|||||~}|~‚|uqps~„††…„‚‚‚‚‚‚‚„†ƒzrlcdlx}|xtplkknooomkkheddflq}ˆŒ‰…‚}ujb_`^\i‘‘’“””spont|~~†‘””””””“•“•’Ž…~|~~xsqqrtx€ˆŠŠ‡…stuutuuvuuvwwwxxyyyyxxyyyyzz{{{{zz{{{{||{{{{{{{{||||||}}|€€€~tmikliggrz|ywtruzzyxyyyyzzzzyxuuxxuqqrw€…‡‘——“Ž‘’“”“‘ŽŒ‰‡†…„ƒ€zreZXYRNIL\w‚„‚‚‚ƒ„‚„…ˆ‹Š‰‰‰‰‹‹‹ŽŒŠ††…„†ƒƒƒ}||||}|}ƒƒ€{tqss}…†‡ˆ†…ƒƒƒ……†‡††‚wplghr{~|xxupomlmpnmopnjhilmms|ƒ„„€~xrh_`bbaasŒ’‘“””“‹|roqqv~€}…“••••••“•••’‹ƒ}{~}xqossu|‚‰Šˆ‡†~stuuvvvvvvwxyyxxyyyyxxyyyyyyzzzzzz{{zz{{{{{{{{{{||||~~}}~~€€€€€~yokkgcaeow}|{zzz{{zyyyzzzzzzzyvvxytpnqw}‚…•——“ŒŽ‘“”“‘‹ˆ††…„ƒƒƒr_UTWWTR[gyƒƒ‚€ƒ†ŒŽ‹Š‹ŒŽŽ’”’‹‡„…„„„„„„ƒ~~}|{„„€{urqt}‚…†‡‡‡…ƒƒ„„†‡††}rmifjs}|yxxvtponnrsrqpqpnpsttwx|€}yzwoe`_bdb`l‚‘’“””“‹|rooow~}…‘”••••••“•””‘Šƒ}}~zuqoquy€†ˆˆ‡‡†~rsttuuwwwwvxyywwxxxxwwxxxyyyzzzzzzzzzzzz||{{{{{{{{{}~~~~~~~~~~~€|wqlgb^_isz~~~}|{{{yyy{{zz{{{ywvvwuros|‚ˆ–•”“ŽŽ‘’””’Œ‰ˆ…„…„„„†‡ƒyfWVZ\\Y_k|‚ƒ†ŒŽŽ‹‹‹’”“‹ˆ†……„ƒ……………ƒ~~}~|zz„„€}vqpwƒ†‡‡ˆˆˆ„‚‚………‚ynmjflw}}{ywwxsqppstrpqrqpquxxtpsuussojc^^begfiw‰‘”’‰zrqppx~|†“•••••••••“‘‹‚~~~vsnort{„ˆˆˆˆ‰†‚oqtttuvwwwvxwwwwxxxxwwxxwyyyzzzzzzzz{zzz{{{{{{{{}}{}~~~~~~~~€€€€€~yrkfa^dpz~~~}|zzz{zz{{zz{{{yywwxyyy}€ƒ†Š”–”‘ŽŒŒŽ‘’””’Ž‹‰ˆ‡†„„„„†‡††}rcZ[^_`fr}€„†ŒŽ‘’‹ˆˆˆ‰ˆ‡‡ˆ‡………ƒ€}{z„„~wqpv~„…†‡ˆˆˆ…ƒ‚‚ƒƒƒ|qlljhpy|yxyyzxvtqtvtnmlkjjnppnlllmmnolia\]cghho}…Š‹‹„xqpppx~~‡‘••••••••••“‡~{tpnosw€†ˆˆˆˆ‰†‚oqrssvwvwwyyyyyyxxxxxxyyyyzzzzzzyyyyyzzyzzyy{{||}}|||}~~~~~~€€€€€€€€~xpkfdhpz}~}}{yz{{{{{||{{{{{zxxw{|~„…‡…†Œ’–”‘Œ‹Š‰Œ‘‹ˆ‡………ƒƒ‚„…†……ƒ‚wl^X]bkt{€ƒ††‹’‘‘‘Ž‹ˆ‡ˆ‰‹ŒŠˆ††…ƒƒ‚~{yz~ƒ‚zrlkmr{„…‡‡‡‡…„€|smkmkikoqvyz{}}}}|xyxumf_]]]_ehgfegjmpmkgd`_ahijmsy|€ƒƒ}pppoqx~}~‰’••••••••••“Œƒ~~~yropqt|ƒ‡‡ˆ‰Š‰†‚noprruwvxxyyyyyyxxxxxxxxxxyyzzzzzz{{yzzyyyyy{{||}}|||}~~~~~~~~~~€€€€€€{zuqprx~~}|{z{{{{{{{{{{{{{zxxy|€‚‚‚~„Œ’“‘Œˆ†…„…†‡‡ˆ‡†ƒ‚‚‚‚‚„…†…††‡…„wja`ky}}€‚ƒ…†‡ŠŒŽŒŠŠ‡‰‰ŠŒŠ‡……ƒƒƒ‚~{yz~ƒ‚|qicacdht~„†††‡……‚€vljkjiehlkjlorwy}€}yvrle\VTTTV[dhjmnppqnmiea`cfhiighlqvvrmllmoy€~Š’••••••••••“‹‚~}vqpqsv}„†‡ˆ‰Š‰†‚mmopqttuvwwyyyyyyywwxxxxwwxxyyzzyyyy{{{{{{{{||{{||}}}}}}}}||}}~~~~~~€€~~|||}}|}|||{z||}}|{{|||||||yz|€…„‚}{y…’‘Œˆ…„ƒƒƒƒ…†ƒ‚‚‚‚‚„„†……†††††ƒ|y{}}~„…‡†ˆŠŽŒŒ‹ŠŠ‹‹‹ŒŽŽ‰‡……ƒ‚‚‚€zyy~~ticbcbabkv††‡‡‡‡…}rhghiiejllgecbeipvvrmhc^WROPSY_lv{zzzxxspkedbcddefebbbfhhhhhknw~}€Œ”••••••••••‘Š{sqqsuy„†‡‰‰ŠŠ‡ƒ€mmopprstvwwyyyyyyywwxxyyyyxxwwxxzz{{{{{{{{{{||||||}}}}}}}}}}}}}}~~~~~~~~€€€€~}||{zzz{{|}}|||||{z{||}„†„‚|zz~€ˆ‘Ž‰…ƒƒƒ„„„……„ƒƒƒƒ„…†………††‡‡‡…„…ƒ‚€}ƒ„…‡ŠŒŽŽŒŠŠŠŠŠŠŒŽ‡ƒƒ„†„‚‚‚}|~{pjjiieb`cm|ƒ…†……†‡ƒ{skjjhhfhiiigeecdbccdcb`]\YYZ^hy„……ƒƒ}|wsppokikmopmkigdacccccgqxzy~‹”••••••••••‡}||xruusu{‚†‡‡‰Š‹‹†~mmnoqrsuvwyyyyyyyyxxxy{{yyyyzz{{{{zz{{zzzzzz||||||||||||}}}}}}}}~~}}{{}{}}}~}|}}|{zz||{{{{||||}}||}}{|…†„~|||}ŠŽŒ‡„„„…„……‡†………„„†‡††††‡‰‰‡…„‚~{~‚ƒ„†ˆŠŒ‘ŽŽŒŠ‰‰‰‹‹‹ŒŽŠ„~€„…ƒƒƒ„ƒ‚‚€~ysrqpnlhaacp||{z…‚xnjlkgfhjijihggebbbbabccefediv„Ž’Œ‡‚€~{xvvvtooty~}{ytnhdeddeekoru‹••––––••••”Ž„}zzwrssux{‚†‡†‡ŠŒ‹‡ƒnnnopqrsvwyyyyyyyyxxxyyyyyyyzz{{{{||||{{{{||||||||||{{{{||||}}}}||}}}}}{||}~~~}|}}|{zz||{{||||||||||}}~ƒ…†ƒ€~|z}‚‹ŽŠ‡……††‡‡‰‡‡††……‡†„„„†‡‰‰‡…„‚~|~€‚„„‡ˆŠŽŽŽ‹‹‹ŒŒŒŒˆƒ{}‚…ƒƒƒ‚‚ƒ}xtvxwtstoe`_flihims{{vomnmkggfefgecbcbddfdbagnsv{‚˜œœ‘†ƒ€}}|€€ywz…‡ˆ†„}umkigeefjlq{ˆ”••””••••”‚|{ytrssuy~…‡…~~†‹‹‡nonopqrswxzzyyyyyyyyzzzzyyyyzz{{||||{z{{{{||||||{{{{{{{{{|||||||}}}}{{{{|||||}}}{{}}||||||||||||{{||||~~€~„†„ƒ€~{|€†‹‹‹‰†……‡‰Šˆ††††„„……………†‡‰‰ˆ††}~ƒƒ……ˆŠŒŽŽŽŽ‘’‘‘ŒŒŒ‹ŒŒ‹‡{€‚ƒ„„ƒ€€zqptvrptyvnfaaded`bflqolmnnjkiidcddddccddfhhedmw|‚—š•ˆƒ…‡ƒ}~†Ž‰€€†Š‹ŠŠ„}vrpkhefhiis‰•”“”••••”‹zzvssssvz…ˆ†{z†ŠŒ†lnnooqrsvwwxyyyyyyzzzzzzyyyyzz||~~~~}{{{{{||||||{{{{zzzz{|||||||{{{{{{{{zz|||}||{{{{||||||||||}}||}}||~~€€„…ƒ€€~‚†‡ˆ‡†…„…ˆŠˆ†…„„„„„…………†‡‰‰ˆ†ƒ€€ƒ„…†‰‹ŒŽŠˆŒŽ““”“’‘Ž‹‹ŒŒ‹‰{€‚ƒ„„ƒ{snoqroptx{ulbaddeeffegiklkklpssoigfddddeeegmun_YcwŠ“Š…€„…„‚„šŸ˜’‰„ƒ‚…Š‹ŠŠˆƒ‚}ytnkjjggny‚Š‘“”••••’ˆ{yxussrsw|‚‡‡‚}€ˆŒŒ†nnnnnpqrvxyxzzyyzz{{{{{{{{||}}}}~~}||||||||{{{{{{{{zz{{z|}}|{|||||{{{zzz{{{}}{{}}{{{{||||||}}~~}}}}}~€‚€ƒ„ƒƒ‚ƒ‚€€€„„„…‚€‚…††„„…„……„„„„‡‡ˆˆ…‚€ƒ„‚ƒƒ„‡‰ŒŽŽ‹‰ˆŠŽ’“”•”‘ŽŒŒ‹ŽŒ†€ƒ„…„€|}unklooorvyyuleehijjecccegfdejnvupjfefeebbcbejjcWIVuŠ„†‡‚€‹˜ ŸŸžš“‹†……ˆˆ††‡†€}zvsnlhjr{€‡‘“••–•…{xtsttsuz†‡†~}…ŠŽŒ‡ƒƒnnnnnpqrtvwyyyyyzz{{{{{{{{||}}}}~~}||||||||||}}||{{{{{{z|{{z{{{{{{zyyzzz{{{zz{{{{||||||{{{{||||}}}}}}}~€‚ƒ€‚„……„„„‚‚‚„„ƒ„„€„„„„„„……„„„„„„ƒ‚‚ƒƒƒ„ƒƒ„†ˆ‹ŒŽŒ‹ŒŒŒŽ’“”•”“’Œ†ƒƒ„†„€{zxrlklmlnqvyysmhgikmponjihgfedfhjkkgggfeca_]][]]ZTRXe„ƒ…‹ˆ‰˜ ¢¢ŸŸžžœ”‰…‡‡‡‡‰‰„€{yvqmiosw}„ŠŽ“•””Œwvtsttsv{‚‡ˆz‰ŒŽŒˆ„„oonnnpqsvvwxyyyyzzzz{{|||||||}~~~~~~~~|{{{{{||}}||||{||{{{||{{{{{{{{zzzzzzzzzzzz{{{{|||||z{{||||~}||}}}~€ƒƒ„ƒ‚…‡†††ƒƒ„…ƒ„…ˆˆ„ƒ„„ƒ„……„ƒ„„„„…ƒ‚€ƒƒƒ……„…†‰ŠŒŽŽ‘’””””“’’ˆ…„……wrolnppolmmty{snkhhlppuwupolhfcccbcghijihhie]ZXYYXY_aev‡‡„‡ˆ‰ˆ‹— ¢ ŸŸŸŸŸž›–‘ŒŒ‹‰‡‰ˆ†ƒƒƒ€{zwplprty~†Œ“•’‹~wutssssx‡ˆƒ|}†ŠŽŽŒ‡…ƒoonnnpqsvvwxyyyyzzzz{{{{{{||}~~~~~~~~|{{{{{||||||||{||{{{{{zzzzzzzzzzzzzzzzzzzzzz{{{{{{{yzz{{||~~}}}}}~€ƒ„…ƒ‚€€‚‡ˆˆ‡„‚ƒ„…†…‡‡‡†„„ƒ„………„„„„„ƒ‚‚‚ƒƒ……„…‡ˆ‰ŒŽ‘‘’’’””••”“’‘‘‘“’ŽŠ†„„‚{snopqpmiiiowxrmihinqtvutsqokebaaacdglopqrsrjeddb`agilvƒ‹ŒŽŽŒ‰“¢Ÿž  žž–Œˆ„…†ˆˆˆ…~€ƒƒ~wnrvttv|ƒ‹‘“‘Š}ussqssvz€…†|ƒˆŒŽŽ‹†„ppoonpqtvvwxxyxxyyyy{{{{|{}}~~~}|||}|{{{}}||}}}}zzzyyyyyxxxxzzzzzzyyzzzzzzzzyyz{zz{{{{z|||}}~~~~}€ƒ…‡‡†‚‚‚„‡ˆ‡ƒ‚ƒ‚…††‡‡††„ƒƒ„……††„ƒ„„ƒ‚ƒ………ƒ…†ˆ‹ŒŽ’‘’’’‘‘‘‘’’“”••••••’’’’’ŽŽŠ†„|sqrtspnihgnyxrkgcgpssstsqomjedbbacehmqrsvtutropmllonqz„Ž˜¡¤¢¡    Ÿ Ÿ™Š‚ƒ†‰‰ˆ‡…zw}~€~zty|vurv|„Š‰ztuttttx|‚ƒ|ˆŽŽ‹†…ppppnpqtvvwxxyyyyyzz{{{{{~~~~~~~~}}||}|{zz}}||}}}}||zyyyyyxxxxwwxxyyyyzzzzzzzzzzz{{{{{{{z|||~~}‚…‡‡†……ƒƒƒ„……„‚ƒ††…‡†…„ƒƒ„……„„„ƒ„„„…………†ˆ‹‘’’’‘’‘‘‘‘‘’“•••••–””••’‘Š†zqstuusqnhejsuoieclruvutsomkfdcbdegkmoqstwvtrqsvtssuwvx€Š’“œ¤¦¤¢¡¡¡  Ÿ–†€€‚†‰Š‰†‚vnr{~€€{z…‚yvuu}…ŠŒ…ystuuuv|€…€|†‹ŽŽŽ’Œ†…ppoonrsuwwwwwwxzzzzzz{}}~~~~~~~~|}}||||||||}}}}}{zyyyywyyxxxxxxxxyyzzyyyyz|{{{{{{||{{{{||}~~~}}~~€‚…ˆˆˆ‡‡†…„ƒƒ„„ƒƒ„††††††……„„„„„ƒƒ„‚ƒƒ…‡††††ˆ‰Œ‘‘‘‘‘’““••–––•••’‘‹…{tsyxusuphfkqqlgdentwxvuqokjgedefhlqqrrruuqpnpw{{xvvvspr}Š‘–Ÿ¥¥¥£¢¢¢¡¡™‡€€€€„‰‰Š‰„vjiu~}|ƒŠ‰€ywxz†‰‚zuvvvux|€€|~‡ŠŽŽŽ‘”…ƒppppqqsuuuwwwwwxyyzzz{||}~}}€|}}||||||||}}}}{zzyyyywwwxxxxxxxxyyyyyyyyyz{{{{{{||{{{{||}~~~~~„ˆˆˆˆˆˆˆ†…ƒ‚‚ƒ…‡‰‰‡†††……„„„„„ƒ‚ƒ‚ƒ„†‡†‡‡ˆ‰ŒŽŽŽŽ‘’““••–––––•“‘‘‘‘’‘‹‚{xyxxwwrljptrmjdgqvwzzwrpiiifeeinvywuuusrmhgkry{vsttpmmtƒŽ‘™¢¥¥¥£¢¢¢¢Œ€€€€€€…‰Š‰†qgm{€€}{„Œˆ€xsu{…vtwuuvyy{z€†ŠŒŒŽ’‘‹„‚ppqqprqttuxwxxvwxx{{{||}}}}}}~~~€€|}}~~||{{||}}}}{{{{zzywxxwwvvwwwyyyxxyyzz{{{{||||{{||}}}}}}~~~~~€…ˆ‰‰‰‹‹ˆ…‚€„ˆŠŠ‡‡‡‡†††„‚ƒƒƒƒƒ„…‡†ˆˆ‰‰‰ŠŽŽŽŽ‘‘Ž‘‘‘’“””––––••”“““““““’Ž†€zvwyzvonpsqmhflvxuxxtqmjiiggflq|}xxuronidbluxutrrrnkq€‹”™¢¥¦¥¤¤£  “ƒ€€€€€€…ŒŒˆ‡siky€€~z‚“Œ‡€yx{€|uvwuvvxwz†‹ŽŽŽ’•‡~xqqqqrsttttutvvvwxxyyz{|}}}}}}}}}~~~~~~~~}}||||}}}}}}}}{{{{zzywxxxxxxxxwyyyxxyyzzzz{{||||||||}}}}}}~~~~}‚…‰ŠŠ‹ŒŒŒŠ‡…ƒ‚ƒ…‡‡‡ˆˆˆˆ‡†ƒƒƒƒƒ„††ˆ‰Š‹ŒŽŽ‹ŒŽŽ‘’‘Ž‘’‘’““””––––••–”””””””“‘‘Ž‹„}~}wrpqsplhfpzzxyxuojjllllklpwz{yvurrpkfelttstsssoor|†Ž”›£¦¦¥¤¥¤¢›ˆ‚€€€€€€€†ŽŽ†‚|qgju~€~z€“Šƒ~{}€xsuvuvwy{†Š‹ŽŽŒ‹Šƒyqnrrqrssttstuuwwwxyyzzz{||||}}||}~~~~~}}}}}}||{{}}}}~~}}{{|z{{yyxxyyzzzzyxyyxxxxyyyyzz{{{{z{{{{|}}}}}~~~~~€†‹ŒŒŽŽŒŠ‰‡…„…ƒ„„…ˆˆ‰ŠŠŠˆ‡‡…ƒƒ…†‡ŠŠ‘‘ŽŽŒŒŽŽ‘’“’’‘’’“““““””•–––––•••••••••““’’ˆ†€vqqrrolhgs~z{zvrmmmpooonkmorstxtssolklpsqtutrrssy…Ž”›¢¦¦¦¤¤¥¢„€€€€€€ƒ„‹Œ…€zrmnw}}z}Š“‹†}€}xuvvwwx‚‡‰‰„…‰‰‡ytmigkqqqrsstttuuvwwwxyyyyxyzzzzzz{{{{{{{{}}}}}}||}}~~~~~~}}||}|{{zzyyyyzzzzzyyyxxxxyyzzzz{{{{z{{{{|}}}}}~~~~}ƒŠŒŒŽŠ‰‰ˆ†…ƒƒ„†‡ˆ‹‹Šˆˆ†…„…†‡‡ˆ‹““‘‘‘ŒŒŒŒŽ‘’““’’‘’’’“””““””•–––––•••••••••””““”“Šxrrrqnkgfs}~~zussstrrqpljjjjkopqqqqplloqtutuussw‚‹‘š¢¥§§¥¥¤œˆ‚€€€€€€€…†ƒ€zrmntz~~z}‰’‘ˆƒ‚€}xuvvvv{‚ˆŠ‡}vtxwpjdbcejnrrssrrttttvvwwwwyyxxwwxxyzyyzzy{zzz{||}}~~}}}~~~~}}}{yzzzzxxxxzzzzzzzzyyyyyyz{{{||||||||{|}}}}~~€€~~€ƒˆŒŽ‘’‘ŽŒ‹‰Šˆ†……„…††ˆˆ‡†…‚ƒ„†…†…ˆŒ‘’’‘‘‘‹‹ŒŽ‘‘“”•“’‘‘’‘“““””••””–––––••”••••”””””””“‡€zvuupnjgdp€„€}|zuttuutqswtomhgfgjmmmpnmlnrvtustuw~…Š˜¡¥¨§¥¥¢”…€€€€€€€€€€€€~wolquz}y{‡‘’Ž‹…‚zvuuuux~†ŠŠvnkligfebbeimuuttttttttttuuuuvvwwwwwwwwxxyyxzzz{|||}}|||~}}~~~~}}}|zzzzzzzyyzzzzyyzzyyyyyyz{{{||||||||{|}}}}~~~~‚‡ŒŽ‘’’‘Ž‹ˆ‡†‡††…†††††‡†ƒƒ„………‚ƒ‰Ž’’‘‹Œ‹ŒŽ‘““”•”“‘‘’‘“““””••––•••••”””••••”””””““‘Š|{|‚xrjfs‚†‚}zwuuuttromu~{wpkgefggilljjkmpuvvwx}„ˆ‹Ž–œ£¥§§¦¢„€€€€€€€€€€€„„ƒ{sqsy{x{†ŽŒ‰†‚~wtuuuwz‡†xqponoqrsrrtxzttttttttssuuuuttvvwwwwwwwwvwwwwwyy{|||}}||||}}~~~~}}}{{{zzzzzzzzyyyyyyzzzzzz{{{{{{{{{{z{|||}~~~~}}|†‹‘‘””‘‹ˆ‡‡‡‡ˆˆˆˆˆ‡ˆ…„ƒ‚…‰‡‡†‡ŠŽŽŽŽŒŽŽ‘’”””–••“’‘‘’’”””––••””••””””““••”””””“‘‹ƒ|~…ˆŠ‰ˆ„you€ƒ{xuuuwvtrmhn{ƒ‚{snjc``dfgiljknpruwz€…‰Œ”š £¦¦¦ŸŽƒ€€€€€€€‚‚ˆ”Žƒysqvyvu|‚}}~€|vvvuuwz€„‚wprtwwwz|~‚……‡„ttssttttttuuttttuuuuuuuuvvwxxxxxxxz{{{{{|||||}|}~~}}}{{{zzzzzzzzyyyyyyzzzzzz{{{{{{{{{{z{|||}}}}}~~~~}}~€†Œ‹‰‰‰‰‰ŠŠŠŠŠŠ‰ƒ‚‚„‡‰‰‰ˆŠ‹ŒŒŽ‘“””•––—•’‘‘’’”””””””““””“““’““““’’’’“‘Œ…€ƒˆ‹‹‹Ž‹‡ƒ††„yustuwvsmgfo|}xpdbbabcehikmoqs|„‡‹Œ—¢¥¦¦Ÿƒ€€€€€€€ƒ†„ƒ˜›”Œ‚{ttqnkjkhiiinstsvvuuy{€ztsuwz{~ƒˆ‹Œ‰‡„‚ttssrsttuuuuuuvvuuttstuuuwwwvvwwxxyyzz{{{{||||}}}~~~~~~~~||{{{zyyy{{{{zzzzz{zz{{{{|z{{{{{|{{||||~~}}}}}}~}ƒˆŒŽŒŠˆŠŠŠŠ‹Š‰Š‰…„ƒ„‡‰‹‹‹‰ŒŽ‰‰ŠŒ‘‘“”––––––”“‘‘““””•”““’’““““““‘‘‘‘‘‘‘‘‘Š…„…ŠŽŽŽŽ‹‰‡‚|z{yxtqlhehozysjhgc``afgghimr{€…‡ŒŒ”š ¤§§¡’„€€€€ƒ„„†‹‘ˆyqlifebaa__bgmpqrtuvx~}vuvvx~„‡‹ŽŒŠ…‚zttssrsttuuuuuuttttsssttutvvvvvwwxxyyzz{{{{||||}}}~~~~~~||{{{zy{{{{{{zz{{{|{{|||||{{{{{{|||||||~~~~}}}}}€„‰‹ŽŠŠˆŠŠŠŠ‹Šˆˆ†ƒ‚ƒ††‡ˆˆ‰‹ŽŽ‹Š‘’‘‘““••––——•”““““““““’‘‘‘‘‘‘‘‘‘‹ˆ…ˆŒŽŽŽŽŒ‹‰ˆˆ‰‡†„|umjhhmttnkjnokjiiggffghkrx}‚†Š‹Œ‘—Ÿ£¥£‘†ƒƒ‚~~~||{xxwvtooifedccb`]\_`cgmpsuuxz{ww{ƒˆ‹ŒŽŽŠˆ…‚€ssttttttuuuuttsssssstuuvvvvvvvvvvvxxyyyz{{{{{{{|}}~~~~~}}{z{{zzzz{{zz{{z{{{||{{{|||{{{}||}}{{||~~~~}}|~‚„†‰‹ŽŽŠ‰‰‰ŠŠŠŠŠŠŠ‡…‚ƒ„…„…‡ˆ‰ŒŽ’‘ŒŒŒŽ‘’’‘‘‘’”•••——––”“’‘‘‘’’‘‘‘Ž‹ˆˆŠŽŽŽŽŽŽŽŽŒŒŒŒ‹ŠŠ‰‰Š‡„|tpqqomjmrssqtrnjgeddhmrv|€…ˆ‰’œ¡Ÿ—†€}}|zyyzyxvuttsqolhgfeddcceffbaaadgkntw{}ƒ‡‹Ž‰‰‰†…ƒ‚ƒrrssttttuuuuttttssssttuvvvvvwwwwxxyyyyyz{{{{{{{|}}~~~~~}}}|||{{{{{{{{||{|||||{{||||}}{}||||{{{{~~~~}}|~ƒ…ˆ‰ŠŒŽŽ‹Š‰ŠŠŠŠŠŠŠ‰†ƒ‚‚„‡ˆ‡‡†‡ŠŒŒŽ’““’‘’”•••––––•”‘ŽŽŒŒŽŽŽŽŽŽŽŽŽŽŒŠ‰ŠŒŽŽŽŽŽŽŽ‹ŠŠŠŠ‰ˆˆ†‡†„…‚~€‚‚ƒ‚{wrjgddfinrwz}„ˆŒŽŒ†€|yyxzyyzzzz{{xywvtrpliidcacefhhgfdddefhlu‚‡Š‹Ž‹ŠŠ‰‡††…ƒ„ssssssssttutssttssrsrsttvvwwwwwwxxyyzz{{{{||zzz|}}~~~~}}}}~~}|||||||{{}|||||||{{||}}~~}}}}}}||||~~~~}|~‚…‡‰Š‹ŒŽŒ‹ŠŠŠŠ‰‰ŠŠ‰‡ƒ‚†Š‹‡†‡‰‹‹ŒŒŽŽŽŽ’“’‘’“••””–•••’ŽŒ‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŠ‰Š‹ŽŽ‹‹‰‰‰ˆˆˆˆˆŠŠ‰Š‰ŠŒŒŠ‰††…„~unhddfijlory|{zyxxxxyxx{}~€€€‚ƒƒƒ}yvuspliea`cgghjjigfcccfkv‰‹ŒŽŽŒ‹‹Šˆˆ‡‡……ttttuuuuvvutttttssrsuuvwwwwwxxxxxxyyyyyy{{|||||}}}~~~~}}}}}}|{{{||||}}}|||||||||||}}~~}}}}}}||||~~~~~}}‚„‡ˆŠŠ‹ŒŽ‹ŠŠŠŠ‰‰‡ˆ†ƒ€ƒ†‡ŠŽŠ††‡ˆŠ‹ŽŽŽŽŽŽ’“’‘‘’“”•–••••“‘Œ‹‹Š‰‰‰‰‰‰ŠŠŠŠŠŠŠŠŠŠ‹‹Š‰ˆŠ‹‹‹‹‹‹‹‹‹‹ŒŒŽŽŒŒŠ‰ˆˆˆˆˆˆŠŠŠŒŽŽŽŽ‰ƒzoigghihhklnoqvvxxy{}€‡Œ‘“’Œ‹Œ‹†~zwwurpnkjieeimoomkifccedem|†ŠŒŽŽŽŒ‹ŠŠŠ‰‰‡‡ssttuuuuuuutttttssrtuvwwwwwwxyzzzzyyzzzz{{|||||}|~~~}}}|}}||||}}}}}}||||{{}~~~~~}}}}}{{{{{||||{{{|{}€ƒ…‡‰Š‹ŒŽŽŠ‰‰‰‰ŠŠˆ…ƒ~~ƒ†‡†ˆ‹ŒŒ‰††‡‹ŽŽŽŽŽ’’“’‘‘“”””””“‘ŒŠˆ‡ˆ†‡‡‡‡ˆˆ‰‰‰‰ˆˆˆˆˆ‰Šˆˆˆˆ‰‰‰‰‰‰‰‰‰‰ŠŽŽŽŽŽŽŒŒŒŠŠ‰ˆˆ‰‰‰‰‹‹ŒŽŽŽŽŒ…{phjiijllggjmossw|‚Œ’–˜››˜“‘’ˆ~yxxyywyyvuojjlmqqookjfcddbep€‰ŽŽŽ‹ŠŠŠ‰‰ˆˆuuuuuuuuuuutttttsstuvvwxxxyyxyzz{{zzzzzz{{|||||}|~~~~~}|}}||||}}}}}}||||||}~~~~~}}}}}{{{{{||||{{{|~‚…‡‰‰‹ŒŽŽŽŽŒŠ‰‰‰‰ˆ‡…|}‡ˆˆˆˆ‰‹ŒŒ‰ˆˆŠ‹ŒŒ’’“’‘‘’“”””““‘ŒŠ‰ˆ‡†…………††‡‡‡‡ˆˆˆˆˆ‰ˆ‡‡‡‡ˆˆˆˆˆˆˆˆˆ‰Š‹‹ŒŒŽŽŽŽŒŒŒŠŠ‰ŠŠ‰‰‰‰‹‹ŠŒŽ‹Š…{rlihillheeghlqu~†Œ’’““”’‘‰…„‚ƒ…†‹ŒŠ…}tppoqrrpppnjgddcbfrƒŽŽ‹ŠŠŠ‰‰ŠŠvvuuvvuuvvvutssstttvxwyzzyzz{{{{||{{{{zz{{zz{{}}}}~~}||||}}}}}}}}||||}}~~~~~}||||{{{{|||||||||}…ˆ‰‹‹Œ‹‰‰‰‰‡‚~{~…‹‹Š‰ˆŠŠ‹Œ‹‰ˆˆ‰‰Š’‘‘‘‘’’’’“‘‘‘‘‘‘’““’‘‘‘ŽŒŒŠ‰ˆ‡†„ƒƒƒ„…††††„†ˆˆˆˆˆˆ‡†‡‡ˆ‰‰ˆ‰‰‰‰‰‰ŠŠ‹ŒŒŒŒ‹Š‰‰‰‰‰‰ˆŠ‰‹ŽŠˆ„zqkfgjmkjfcffgjnrv{…‡‹‹ŽŒŒŒŽŽŽ‘‘‹‚wpmrvyyuqponjgffecix…‘ŽŒ‹ŠŠŠŠŠŠŠuuuuuuuuvvvutssstttvwxzz{zyyzzzz||||{{zz{{{{||}}}}~~~}||||}}}}}}}}~~||}}}}}}}}|{||{{||}}|||||||}‚†‰‹ŒŽŒ‰Š‰‰‰†{z{€„‰ŒŒŠ‰ˆ‰ŠŽŽ‹‰ˆˆˆŠŒ‘‘‘’““’‘’‘‘‘‘‘’’ŽŒŒŠ‰ˆˆ†‡†„„„…††……„†‡‡‡‡‡‡†………ƒ…‡‡‡‡ˆˆˆˆˆˆŠŒ‹‹ŒŒ‹‹Œ‹ŠŠ‰‰‰‰‰‰ˆŠ‹ŒŽŽŽ‹Š††‚zpjijmqpnfcccdehhimr{€„ˆŠŒŒŒŽŽŽ‘‘Œ†|rmmt}}ytpnljihffgmx…ŒŒ‹ŠŠŠŠŠŠŠttvuttttvvvussrrsuvvwyz{||||}}}}}}}}||||}}}}}}~~~~~~~~~~}}}}{{||}}}}}}~~}}}|}~~~}|}|||||{|||||||{~…ˆŠŒŽ‹Š‰‰ˆ‡ywy~ˆŠŠŒŒŠˆˆˆŠŒ‰‡‡ˆ‰‹Ž’““””’‘’‘‘‘Œ‹ˆ‡ˆ‡†‡‡…†………„„……††‡‡†††„„‚‚„‡‡‡ˆ‡‡‡‡‡ˆ‰Š‹‹‰‹‹‹Œ‹Š‰‰‰‰‰‰‰ŠŠŠŠ‹ŽŽ‹‰ˆˆ‡‡}qffgorokffcbdfdacehow…‰‹Ž‘’’’‚xpnrzƒ„yqlknnligghnx‚ŠŽŒ‹‰‰‰‰‰‰wwvuvvvvvvuvttsstvwwwyz{||}}~~}}}}}}}}||}}}}}}~~~~~~~~~~}}}}||||}}}}}}~~€€}|{}~~|||{{{zz{|||||||{~ƒ†‰‹ŽŽŽŒŠ‰‰ˆ†yx{†ŒŽ‹Œ‹‰ˆ‰‹ŽŠˆŠ‹‹ŒŽ‘“”•–”’ŽŽŽŽŽŽŽŒ‹Š‰‰ˆˆ‰ˆ‡†………†††††††††††„„‚‚ƒ„†‡‡‡‡‡‡ˆˆˆ‰‰‰‹‹‹‹ŠŠ‰‰‰‰‰‰‰‰‰‰‰Š‹ŒŒŒ‹ŠŠŠŠ‡€uhehmqtqkfa`dikjfdejr~†‰‹‹ŒŒŽ’‘‘‡wppw€……xnklpqpkhhjmuƒŠŒŒ‹‰‰‰‰‰‰wwxxwwwwwwvvvvuutuvwxxz{}~~|}}}}||}}||}}}}}}~~~~~~~~~~}}||}}}}|}~~~~~~~~}}||}|}|{{{zyxyzz{}}||}€„ˆ‹ŽŽ‘‹‰‰‡‚zw{‚‡ŒŽŽŒŒ‹Šˆ‰‹ŽŽŠ‰‰‰Š‹Ž‘’”•—˜•“‘ŽŽŽŽŒŒŽŽ‹‹ŠŠ‰‰ˆ‡††……‡‡††††††‡‡…„‚~€‚„†‡‡ˆˆ‡ˆˆˆ‰‰ŠŠ‹‹‰‰‰‰ŠŠ‰‰ˆˆˆˆˆˆ‰ŠŠŠ‹‹‹‹ŠŠŠŠŠŠ‹‰‚whdfkqsqlfeimsvurnqv~‡ŠŒŒŒŒŽ‘‘‘Ž‰‚|vqt{ƒ††~tmkptytmiijlt~‡Š‹‹Š‰ŠŠŠŠxxxxwwwwwwvvwwwwvwyz{{{|}~~~~}}||}}}}}}}}}}~~~~~~~~}}~~}}}}|}~~~~~~}}~~}||{zzzyxwxyz{||||}€…‰‹ŒŽ‘Ž‹ŠŠŠ‡yxzˆŒŒŒŒ‹‹ŠŠ‹Ž‘‹‰‰‰Š‘“’”•–——”“’‘ŽŽŽŽŒŒŒŒ‹‹ŒŽŽŒŒ‹‹Š‰‡‡‡‡‡‡††††††‡‡†…ƒ€~€‚…†‡ˆˆ‡ˆˆˆ‰‰‰‰‰‰‰‰‰‰ˆˆ‰‰ˆˆˆˆˆˆˆ‰ˆˆ‰‰‰‰ŠŠŠŠŠŠŠ‹Š†zngefnvxsmhjovƒ……‡‰‹Ž‘’’’‘Œ‡wppx€„ƒyrllovzwpjhgglv…‡‰‰ŠŠŠŠxxwwwuwwwwwwxxxxvwz{|~}~~~~~}}~~}|||}}~~~~~~~~~~~~~~~~}~~~~~}}}}}}}}|{{{{yyyxxxwyzz{{||‚†‰‹Œ‘‘‘Œ‹Šˆ‚xuz‡ŒŒŒ‹ŽŽ‹Š‰ˆŠŽ‹ˆˆ‰Œ‘‘“”•••••““ŽŽŽŒ‹‹ŠŠ‹ŒŽŽŽŒŠŠ‰ˆˆ†††††††††‡„ƒ}|~††ˆˆˆˆ‰‰‰‰‰‰ˆˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡‡‡‡‡ˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠ†~ujcdny|xsnjmv~†‹Œ‘’““’‘ŽŒ‰„wppv~‚‚€}wrqpuy{xqjggehq~…‰‰‰‰‹‹xxxxyxxxwwwwxxyywxz{|~}~~~~~}}~~}|||}}}}}}~~~~~~~~}|}}~~~}}}}}}}}|{{xxwwxwwwvxzz{{||‚‡ŠŒŽŽŒ‹ˆ„|uv}„‰ŒŒŒ‹ŽŽŒŠˆ‡ˆŽŒ‹Š‹Œ’““““”””•–•”‘ŽŒŒŒŠŠ‹ŒŒŒŽŽŽŒŒŠ‰‰ˆ‡‡‡‡††††††„‚z|ƒ…ˆˆˆˆ‰‰‰‰‰‰ˆˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡‡‡‡‡ˆˆˆˆ‡‡ˆˆ‰‰ˆˆˆˆ‰ˆ…{nbajx~|tljmt}…Š‘’“”“‘ŽŒ‰…zspt{„€}yxsruy{voiecchuˆ‰‰‰‰‰zzzzyxxxxxwwxxyyzyy{{|~~}€€~~}}}}}}}}}}||}~€€~~~~}}}}}}}}}|||{zzyxxwuxxwwxyxz{|„ˆ‹ŒŽŽŽ‹†|wx|ˆŒŽŽŒŒŽŽŽ‹Š‰‰‹ŽŒ‹Œ’“”“““””••••“‘’’‘ŽŽŽŽŒ‹‹‹Š‹ŽŽŽŒ‹Š‰‰ˆˆˆˆ††…†‡‡‡‡†„€}{|‚„‡‡‰‰‰‰‰‰ˆˆˆˆˆ‰‰‰‰ŠŠ‰‰‡‡††††††††††‡‡‡‡ˆˆˆˆ‰‰ŠŠŠ‡{j^\fu|{uoons}…ŠŒ“•”•’ŽŒŠ†wrry~„ƒ‚€€|xtvxwrjfebem}†ˆ‰‡ˆˆzzzzyxxxxxxxyyzzzyz{{|~~}€€~~}}}}}}}}}}}~~~~~~~}}}}}}}}~~~~|}||zyyyxxwuvvvvvwxzz{~ƒˆ‹ŒŽŽŽŽ‹…~uvz€…ŠŒŒŒŒŒ‹Œ‹ŠŠŒŽ‘‘Ž’“”“““““””””’‘’“’‘ŽŽŽŒŒŒŒŽŒŠŠŠ‰ˆˆˆ‡‡††…†‡‡‡‡‡†ƒ€~€ƒ…‡‰‰‰‰‰‰ˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡††††††‡‡‡‡‡‡‡‡ˆˆˆˆ‰‰ŠŠŠŠ‡~n_\^gq{|vpns}„‹’”–——–“‘ŒŠ†ƒ{uru{€‚‚ƒ‡†‚zwwxxrkjgejw‡ˆ†‡‡{{yyxxxxyyyyyyzzz|||}}}}}~~}}}}}}~~}}€~~€€~~~~~}}}|||||||{zywxxwuuvvuuvvxyy{~‚‡ŠŒŒŒŒ‰ŠŒˆ‚xuyƒ‡ŠŒŒŒ‹Š‹ŒŽŽŒ‹ŒŒ’““‘‘’“”“““““’““‘’’‘‘‘ŽŒ‹‹‰ˆŠ‰‡‡‡†„„……†‡††‡††„‚€€€‚‚†ˆ‰‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡‡‡†‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‰‰‰ŠŠŠ‰ŠŒŠ}h^YZcu}zuqnt}†“”—˜—–”’‹ˆ„}vrru{‚„‡ŒŠ€xvxvsomiefq{…†‡††{{yyxxxxyyzz{{zz{|}}}}}}}€€}}€~~~~~~~~~}}}||||||{zzywxwvuuvvuuvwwxxz}†‰‹Œ‹‰ˆˆ‰ŠŒˆ~vx}„‡ˆŠ‹ŒŒŒŒ‹ŽŽŽŽŒŒŽ’‘‘’’“““““’‘’’ŽŽ’’‘‘‘‘‘ŽŽŽŽŽŒ‹‹Š‰‡††‡‡‡†„„……„†††‡††……„ƒ‚‚‚„‡ˆˆˆˆˆˆˆˆ‡‡‡‡ˆˆˆˆ‡‡‡†‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‰‰‰ŠŠŠ‰Š‹ŒŠ{h\WXct}~ytor}†‘•˜——–”’ŽŒ‰‰ƒysmov{}€†ŒŽ‹„|wvuqnkgfis~„„„„
\ No newline at end of file
diff --git a/cobalt/media/test/data/bali_640x360_P420_alpha.yuv b/cobalt/media/test/data/bali_640x360_P420_alpha.yuv
deleted file mode 100644
index ca52ae7..0000000
--- a/cobalt/media/test/data/bali_640x360_P420_alpha.yuv
+++ /dev/null
@@ -1 +0,0 @@
-DEHKLLMNNPPPPQSQSRRRSSRRQSQQPONMLJKJGGFCAA>>:;:;;88888899989::988:9767755544211100..--++)'))(())((((''(((('())))**++,,**++,,,,,,,,++++*)))))))))))((''&&&&&&&&&&&&&&&&&&''&&&&&&&&&&'''''''(()+,,-/0224557778899999999::9999::8876677:>EJQYahlquwxxwuqmjhhghjlnnoooopopoqstwy|~~~~|xrldYNA4.,)++++,*+++.4:BOZenx~ƒ†…ƒ‚}wmgXH;/)%$$#$%%'*.178>CLS^emt{€€|zuoiaYSORQTTQSLD=60'%#$$""#"""!!#!"! #%&(+07=DKPW^cglrwxyxwuvvuuuok_WKFA??@@@@@@????==:99975543100/039<CNV]flqty{|zzvrmd]OE92,+)((''''&((()))+*-01236778=>?CFFJNU\bkptxz{}‚‚‚ƒƒ€€~}{yzvttx{€‚ƒ†ˆ‡‡…ƒ~|zxutty€„†…ƒƒƒ€|xpfXJ=4/.-,038=DNZbksx|€‚€ƒƒ‚‚~}{yvwwzz|„ˆŠ‹‹‹ŠŠŠŠˆ‡‡‡ˆˆˆ†€ypdXOHEA><;FIILLLMNNPPPPQRQTSRRSSRRRRQQPONMLJJHHHEAA@=<;<<:8:::::89999:::98888876665544211100..--++*())(())((((''(((('())))**++,,,,++,,,,,,,,++++*)))))))))))((''&&&&&&&&&&&&&&&&&&''&&&&&&&&&&'''''''(()+,-/01124557888899999999::9999::999878;=DKQY_gosyz|||ztqljkklmooppoomlkjjjkkorwz~€~~~wsk`UH<2+*++++++,,+,17?JVamw}…†…„{tk^P?3*&$$$%&(,/258=AEJRZcjr|€€zundZSOMTbpfVNE=6)#$###""#"""!!#""!!"$&+-4=CJPV\belquyz{zwuvvuuuskaVKEB??@@@@@@????>><:::755431000116<CMU]flqty{|zzwvof^RG;3.+)((''''&'(()))+,..0035689;=ABDGKOX^dkpty}~€‚‚„„††‡‡††„„‚€~}|{wsrrvyz}ƒ„…………ƒ}{yyxy~…††……‚‚{umbRD92/...038=BMXbksx|€‚€€|zwwtssvxz„ˆ‹‹‹‹‹‹‹‰ˆˆˆ‰‰ˆ†xnbWNIFA><;HHIKLLNOOOPPQQQRQSRRRRRRQPPPNMLKJJHGEDA@@>=<;:8:9899899:9999::999988776655332100//..-,,++*(((((((((((((())))))))**,,,,,,,,--,,,,,,,,,,+*++**))))))((''''''''&&&&(''('%'&''&&&&&&''&&''''(((())*,..013345558888999988999999999:99778;>CGOU^bjqv{}}~{xvpnllklmnoommkigeca^adjmrw{€‚‚‚|vqi^QB6.*+***++++++05=EQ_jr{€…ˆ††‚}xncTE6-&$$%&',/148=>BDHLU^eow€„„ƒzsh`VPN]euvo`fys@$!######""""!"""##$$*.39AGMS[`ejpsx{}|xvvuvvvsoj`TMD@????@@????@>==<;::755421/0..28;BMT\hnrux|~}|{vqicVJ>4.+)))((''(((())*+,-01134589=>@AEJMSZ_fkrv{‚ƒƒƒ…†‡‡ˆ†……„†}|zwtrppquvy}ƒƒ………~~{yzz{†‡‡†‚„}yrj\N>51-,,.037<CMW`irx|€€€}{xwtroorux„‰ŠŠŒŒŠŠŠŠŠŠ‰‰‰‡€wk^SNIFA>;:IJJKMLNOOOPPQQQRSRRRQQPPPPOOMLKKIIGFDCA@?><;;:9977999:::998:::999988776643332100......-,+*))(())(((((((())))))))**,,,,,,,,--,,,,,,,,,,+*++***)))))((('''''''&&&&(((('&'''&&&&&&&''&&''''(((()))+-/01223555468899998899999999;:9977::?DJRY^flsx|~}|yvsnljjihhiffefd`^ZXUUX\aeluz€‚‚‚~|vmbWI;4,*,******++.28ANXcoy€†ˆ‡‡ƒ~}tj[M=0)$$$%+.168;?BDCFKOXdmu~ƒ††‚}wncWOWl`ilpkdw^I+!$####""""!"""#"%(.3;@FMRY_cgnquy}|{yvvvwwwuph`TKDB????@@????>===<;::755411./..27;BJT\fnruxwz~}|wslcZN?81+())((''))(())*+-.013334679>>DINSY_aimtx}€ƒ„††‡ˆ‰ˆˆˆ……ƒ€~|yvtqoooppsuxƒƒ„„ƒ~~}{||~†††…„‚€{vofXI;3//0..025:BMU^gpw|€~~~~|{xvtqmllnrv{‡‰Š‹‹ŒŒŠŠŠŠŠŠ‹‹Š…€wj]RKGEB?<;HIJJLLMNOOOOQQRRRQRRQQPPPOPOLJJJHGGECA@?>=<;:9::888889::::::::99888865544322210000//----,+)))(((((((((((()))))))****,,,,,,,,,,,,,,,,,,,+**++*())*())))((''''''''''''''''''''&&''''''''((((((***+--.1112455678888999999::9899998769:;@ELSY`fmsvy{yvwspkhedd__^^^^_]ZWTRONOSX_fpz€„ƒ„„}xql\OB8/+*****+++,-28?IWamw€‡ŠŠˆ‡ƒ{vm_RB4*%%%(.249<@CDEDFINU_iqz‚†‡„€yri]U\ijqYIRiqcRWG! !$##"""#"""""&(-4;?EKSW]bdintyz||{xwwwwxwsoj_TJD???>>??????>>==<:997543211///06:@KS\ekrvwy{}{zzwqg\OB81-+))((''((')(**+,-/0232479:?DHNRY`dgmrv{‚…†ˆˆŠŠ‰‰ˆˆ†…ƒ€~}xvtplkjjkmot{‚‚ƒƒ€~}}}~‚…††„ƒ‚€zslbRC82/..../26;BMWaiqwz~€~}}{wusrmiiimqv|„ŠŠŠŠ‹‹‰‰‰‰‹‹‹ŠŠ…vgZNHGEC@><JJKJLLNNOOPPOOPRRQPPQQPPPOOMLJJJHGEDCA@?>=<;;:::99889:::::::::99888876543322100000////--,+*))((((())(((((())))++**++,,,,,,,,,,--,,,,,,,+++++,*))))))))((''''((((''''''''''''''((''''''(((())**++--.0103333567888999999::9899887778:;@EJPYaiouvvvtqolfc_ZYYXXZZXXYYXUOMJGEHPYcjs{‚ƒƒ€}vmcWI<2.-****+++,,07<FS`ku~…‰Šˆ‡„yrdWG6-))).158:?BDFEFFLNRYdow~ƒ……{tk`\djkeWLQi[ONV\YT&""$$$##$"""$(-4:@EKQW]^bhlqvyz||zzwwwwvutpj`SICA==>>>>>>>>>>=<;:9975432311../38?IR\fmptwz{{}|zvqi_RG:2.)))((('((*)*++,,-./13369;@FKPUZ_dhmqvz}‚„…‡‡ˆŠŠŠŠ‰‡…ƒ€zxvtokhgeegjms{‚‚‚€~~~€ƒ†‡†„ƒ„€}xri^O@71.-../226;CMXaiquz}~~~~~}{zywsmmkgggjnqx„‡ŠŠŠŠŠ‰‰ˆˆŠ‹‹‹ˆ…~uh[NIGDC@?@KKKMMMMOOOPPPPRSQQPPPPOOPOMMKKIIHFEDBA?>==<;;;998899::::::::::9988887655321111111100/.--,,++******))**(())******++,,-------,,,--,,--,,,,--++,,**++))))(((((((((((('''((((('&&&''('''((((((()**++,,,-/01233466799888888::88986655678:>BGNW_gmqoomkhgb^XWTSRUUWWXXVVUPKFB><AGQ]fow……‚€{si^PB60,,*+++*++,-49BO[ht|„‰‹‰‡†‚|tj]O>1++/479<>BCEFFGGILPX`jr{„…ƒ|ulb^`S[NUTEOSJFDcjdZ%!$$$$$$#$&)038?ELQV[^`eimqstwzzzywvvwxxuqk`RJC?<<==>>>>>>==;;<:7786432210./.37>HQ[clqtvxz}~|zxtkaRG=40,)((((())+++,,,-../146:?EIORW\afinsux~‚…‡‡‡‡ˆ‹‹Š‰ˆ…‚}{wspnkihdbcgint{€‚‚€€€~€€‚…ˆˆ†…„ƒ€}wqeYK=61-..-.148=FOX`iqv|}}}|}|}ywwsnkjgfccejqw~„‡ŠŠŠ‰‰‰‰ˆˆ‹‹Œ‹‰ƒ}teZRJHGDB@?JILLMLPNOOPPPPOPQQPPPPOOOMMMKJJHFDCB@?>====<;;::8899::::::::::9988887655321111111100/.--,,++******))**))))******++---------,----..---,,,--++,,++++))))(((((((((((('''((((('&%&''('''((((((()**++,,,-/1112335568888888899888755455669=AEKS^ehhffedb]ZURSRQRRRVVWWVSPMGA=879AJWaks}€‚…‚‚€|voeYG:2.,*+++*+++,17?KXdq|ƒˆŠˆ‡†‚|umbRA4//269=?BDGFGGHHHKPV[emu~‚„‚|xnc`UNG:C@59:>@CKT]S##$%%$$$&&*.5;?GLQXZ]`cfgkoqsuyyzyvuvuvvuph^QHA=<<<<======<<;:98777543220//..28=FRZckqvuw{}}||{tlbWK<41-)(*****)+++,,,.//258=BEKPTY^chmpsv|~‚„‡‡†‡ˆˆŠŠŠ‰†ƒ€}yuqoljgda_`cgjnty}€€€€€€ƒ‚‚…ˆ‰ˆ†…„€}vncWJ<73.//./158>FO[cjpw{}~}||{zxurojgfcb``dipv~„‡ŠŠŠ‰‰‰‰ˆŠˆ‹Œ‹ˆ…~tgYQKHGDBA@KKNNMMOOOOPPPQQQQOPPPPOOLLMLMJHFECBA???=>=<<<<;;;;::::::;;;;::::8877744432221122220000..-,,,**))******(*)))***++**,,,-----..........----,,,+++++++)))))())((((''))((((((((((((((''((((((((()**++,,+,--021122445677887777776655443568:>CJRY_bdb``^\ZWTRPPQSTTUUVVSPMGC;5124;EP\hqy~ƒ‚ƒ€€}wpj^PA6/+****(**++/7<FT`mx€†‡ˆ‡†ƒypeYJ;4369;?DFGGHHIIIHILQV_gqz}umd`TUWD;2CZ/-0AQEML8"%%%%$$'*04;AFLRV[^_bdeijjlqtvxxxssutttrmi_QH@<;:;;;;:;;;;;:98876534222100./19=DNZaiquvxz||||ytlcZM@81-+)))*(+++,,,-///26:>DHNSX^cikosu|}ƒ„„†††ˆ‰‰‰‰‰†„|wtpjhfca^]_cgimou{€~€„ƒ…‡‰Šˆ††ƒƒ€|ulaTF;740/0.026=BHR\dipx|}}~}|{wuqolgd_\\\\aiov}…‰‰Š‰ˆˆ‡‡ˆŠ‹‹Œ‰„|sg\QJIFECA@LLNNMMOOOOPPPQQQRQPPPPOMLLKLJHHFDB@@??>?>=<<<<;;;;::::::;;;;::::8877744432221122110000....,,**********(**))***++**,,,,----............--,,,+++++++***)))))(((())))((((((((((((((''((((((((()**++,,+,--..00112445778877776655443333469=BINUWVWZ[[[ZZVUSSSSTUUWXVUROIC=60--27@KVcmv}‚€ƒ€zsmcVI;2-***+*)*++.29DQ^gt}ƒ‡ˆ‡†ƒ|sk_QC97:=?CEEGGGGIIIIIIINW`jsyvhkpd]][MEBWY(+4<;7=DK'%%%%&(*05:@GLRW\]`bddgeefilpsvvvssutuurmf\PG@<999:;;:;;;;;:9::765342220//./27<DNXbiquvxz||||ysnf[NC82+,,++*)+++,-..0139=CHMQW\`fjnqvz|~€€‚„„†††‡ˆˆˆ‡†„}wskgea`\\\^behknptz~~~}~ƒ††‡‰‰‰ˆ†……‚|ulaTF=864200249>FLU]emsw|}|}|zwurmjeb_[YYXZ`jmv~…ˆ‰Š‰ˆˆ‡‡‡‰Œ‹ŒŒˆ‚|sg]RLJFEC@>MMNNNNOOOOPPPQQQQQQQOONNMMKHIGDBA@@@????>=<;<<<<<<;;;;::::;;::98997765432233221110.011////-,,,,,++******++++****++++,,----//-.//.-....---,-,++++****)((())))(((()))((((((((((((((((((()))))))***,,++,,--///33454556666664455443211257;?EKOUVUY[[\[ZWWUVVVVWWXWVSOKF=71,*+.3;FP]gqxƒ€~{wpi]PA3.**)**))**,29@KWdny€‡ˆ‡†„|tmeWJB?>@CFGGIIJJJJHHFFEGMWcmw|}skei`ed`VA<C:1*2.,0<Ab2%%&&(-06:@FLSXZ^_bcdddbacdjmrtsttssssspme[PD=988889:;:::::998875542221/00/016;EMXaipuvxyz{||yxqh_SD:3.--++,,,,-../139=AFLPV[aejnrvy|‚„…„…‡‡‡‡‡†„€|{sjgb][YZ]_cehkmpsvz|}}}}~ƒ„ˆ†‰ŠŠŠˆ‡…ƒƒ|uk`SF>98541147=DJSYafnuz}~||{{xspjga_ZXSRSV^hmw€†‰Š‰ˆˆ††‡‡‰Š‹‹‰†‚}sh\RMHGDCA@MMNNPPOOOOPPQRQQQQNNMMMMLLJHGEBA@???@@>=>=;<<<<<:9;;;;::::99::98777765432233221110.0111///-,,,++**++****++++****++++,,--..---.//.-....-----,++++++**))))))))(((()))((((((((((((())(((()))))))*****++,,--/0100143556666664444332100146:>DINQUVZ[[\\\YYXXXXWWZXWTRMGA94.*)+-07@KWalu}‚~}ytmdUG:0+*********07=ES`jw~ƒ††…„|woh`TJEBDEGHHIIJJKKHGBBBBEP[gttoiflgegeXJC@G9123,9<EIcK%%(*,18;AGLRVY^_aacde`]\\^dhnqtutsssssojdZLA=;887789988888776665553221/0/..26;DNYbipuvxyz{|||xri_SI<71//----..//137;AFKOU[_ejnruw|~‚‚„…†……††ƒƒ~zumg`[XYZ\_behkloqtw{{}}|~~ƒ†‰‰‰ŠŠˆ‡‡‡‡„‚|uj_RE?:965547;AHPV\cjsx}|||zwsmh`[XURPOOS\fmwˆ‰‰‰ˆ‡††‡‡‰ŠŠˆ‡…{sh^RMHFCB@?MMOOQQQPOOOOPPOOPPONLLKIJIGFDBAB@@????@@===<====<<;;::::::888898776665443333222022022200/..-,,,,,,++**,,+*****++++,,--.........///....-,---,,,++++****))))))))(())))))))(((((((((((((()))')))***+++++,,---.//1231455665542433121./2569>DHLQUX\^^]^][YYYYXWYXYTSOIB=6.+(()*.4;FR^hqy€~}{vph\N@4-*)**)****.6:BP\hq|‚………ƒ}{undZQKFFFHHIIIJJJIGD><;=@JVctihigcfd`^B3LSX<@RSD<:CHXfU<$,08=BEKQW[]dfeee`\\WUVY]djqtvtsstrplibWJ@;6666788887777666654331//10//-/14:CMV_gotwwy{{{{|yslaVJ=740/////./025:@EKQW\`ekmrty{~~~~~€€‚ƒƒ„ƒ„„ƒ„ƒ‚€zvqh_YVVY\_cfikmnoqtw{{{{{}‚„ˆŠ‹ŒŒ‹‰††‡‡ƒ{tj^RIA<;:888;>ELSY`fmtz|~}}|{wtolc]VSOMIHLQZemx‚‡ŠŠ‰ˆ††‡†ˆ‰‰‰ˆ‡„~yqj_TNHECA?>MMOOPPPOOOOOPPOONNNMLKKJIGFDBA@?@@????@@?>=<====<<;;:::::::99:877766654444333223222211000/.-,,--,,++++,,,+****++++,,--.........///....-,---,,,++++*+**))))))))(((())))))(((((((((((((()))')))***++++++,,..-./0101222333322321110./2569?EJNTXZ\__``^\[[[[YXY[XVQLE=6/*))))),07ALXbnu}€€~~}ysmcUI90*)))()****07>IWdnw~ƒ„„ƒ|wqkaXPIGGHHIJJJJKJE@<969;ES^pookie`]YSMIJLS``__XKA8+;Rnn5(7<BFNYY[`liTMVa[[aRPPUZaipuutstrponh`UI?856656776666665544332220///.../04:CMV_gotwywy{{{|ysmcYL@:62111111348=DIPT\`fimruy|~}}}}€€€ƒƒƒ‚‚‚‚|ytld]XWY\^bfikmooprvy|z{{||‚„ˆ‹‹ŒŒ‹‰‡‡‡‡ƒ{tj^PGC?>=;;>@CJQX]ejqv{~~}}}{vrmf`YRMJECCHQ\eq|„ˆ‡ˆ‰ˆ†††‡ˆ‰‰‰†…‚~wsi_TMGDB@@>NNOOOONNOOONPPQPNNLLJJIHGFCA@@@@?>?????>??>===<<<<<<::;;::;;:9887776565233443344332221110//--,..--,,,,,+******++++,,--........00//....,---,,,,,,*,+*))))))))))))))(())(((((((((())(((())**))))*)****+++++,,-/////0111122122110/.01149<@GLRVZ^^_`aa`^]]][YY[ZXSNGB:3+()))))*.3;FS^itz~{wog[N>3*)))******/5<DS`lv|ƒƒƒ€|xuog\RKHHHIKKKKJHEA<82216AP_aniRhdZTRGQQJQYabaa`]U?4<I[rr:6>ILcmhcmwJOKTZ[YWJIKNV`iquwuwtssqkh^SF<643344554444555553221200/.,.././4:CLU^gnswwzxyz{||todZQC;663222327:@FMUY`ekotwz|€€~~}}~€€‚‚‚€€}}{xtphd[YZZ]afilooqrrtvy|}|||{ƒ…‰Š‹‰‡‡††ƒ{rj\PIDBAA?AAFIQV]bhouy}~~}{xtpjc[SLFC?=?DO[gs~„ˆˆˆ‰‡……†‡ˆ‰ˆ‡„‚}yskaUMEBA?>>NNOOOONNOOOOPPONLLKKJJHGDB@@@>>>>>?????>???===<<<<<<::;;::9988887776565565334455332221110///.-....--,,,+++****++++,,--........00//...-,---,,,,,,,,,*))))))))))))))(())(((((((((())(((())**)))))())))++++*+,---.//011111101100//.0126:=CGOTY\^`abcca___\[[ZZZUNKC=5.*'(((((),07AMXdnv}€}~}yslaTE7-*))))****-39BM[fq{€‚„‚€}zupi`WPMJJIKKKJIFA=84/-,1;QirsmM]aWUONPMGBNVb`XUX]T=9BT^qZLO[m~w€jh[Ybmpwtd\P@AJT_ksuwvvtssqkh^SF<6422332222333333432210/-..,--,,-38@HS\hoswxxyyz{{{tni]SG>8765556:?DJOW^diotxz€‚€~}||}}~~}}~zywsqngb\YY]acglmprrrsux{}}zz{|ƒˆŠŽŒ‡‡‡††ƒ{rj\RNHFFFEGIKOW^cflrx|~~~}{{ytmf^XOGA=9:<FR\hw‚†ˆˆˆˆ‡……‡‡‰‰ˆ‡…‚€{vrkaUMEA@>>>OONNOOOOPPOPNMNLKJIHFFFDBB@@??>>==>>??@@>=>>====<<<<;:<<;;;;888777665555555554554432222210000./0.--,,-,,,,,,+***++,,------//0001....-,--..---,,,,,++****))(((((((((())**))(())(())(((())))))))))**++++*))*---....//0111100///0./0137=AFLPVZ^`bdeddabaa_\[ZYYTOF?9/*('('&&''*.5<HR]gqz}€}zvpfYL=3,****))**,16=IWcmw~€‚‚|zvulg^UOKMMMNMJGB>:41+**.9Pq~xe`\GYYUQRNLMHQVYLL\_KGA*FL]TO[nto€smhmlepz‚qj\F=KUalswwxxvtsqng]PD:310011112211100111/0/----,-,+,,028>GR\enrvwwy{{{zzwrk`VH@<96689;BGLS[ahmru}‚ƒƒƒ~|}}|}~}€~}}zzywurpmgb]\]_beinoqrrstvy||}zz{}ƒˆ‹Ž‘Šˆˆˆ††ƒ|rh]TPMKLLKLNRX^beknsx}~|}||ywrle]QH@:777>GSbny‡‰Šˆ‡†††††‰ˆ…„ƒ{wslbVLFA?>:9OONNOOOOOOMNMLKJJIIHFCCA??====>>>>>>??@@>=>>==>>==<<<;<<;;;;988766665555555565554444442211100/0/..--.,-,,,,,+***++,,-----.//0000....----...---,,,,++****))))(((((((())))))(())(())(((())))))))))**((((**)*,,-....//00000////--/01459?CINTZ^`cefffeda``_[ZZZWQLB<3-*('('&&&')-18CMYcmw|~€}||xql_SD6-**(())***.49DR_jr{~€‚€~{yupjaXQMLLLLKGC>:5/+('+/5Ts||{o_VHFVVQU[RKT\[jRIZdeZGBFKOJXf_lmqo€{lgl_[pfgKU@HWdnswwxxxwvsng]PD:20//000000//000000/..-,,,,++*+-.17>GQ[entxxxxyz|zzwqkbXNE?=98<@DHOW^eipty~‚ƒ…‚‚€€|{{z{}|~~~€~|zyxvvutsrpnhc__`adgjnpqrsvvxz}|{zz{}ƒˆ‹ŽŽ‰‡ˆˆˆ†ƒ{sj_XTSPPPQRVZ\bfjoqvz~~}|||yvnh`YND<8447>IVdpz‚‡ˆˆˆ‡…††ˆ‰‰‡„„‚}yxqlbVLE@>=:9ONONOONNMLKMLKJHIHEDCB@?;;<<:<<<==>>>>?@>>>>====??==<<<<<;;::877777766667754576655554443211100100/.-,-----,,,+++++++,,--.//////....---.....-,,-,++********(*((''(((())))(((('((())))))))(((((())))))**)))))*++,,.///0/00..//.../166=AGLRX]`cefgijgfca_[ZZXWVPF=8/*('(('&&&''+.5=IT^iqy|~{||}xpe[J;0+)(())**)+28BLXdow}|{{zvsne[TNLJLJGD@;50)($"'+6Ybtwxo`SLJZ[TUa_STZ\^]ST^ldTJM^NQ`ikurfko[IGTV]RXSQRMKVdntwwwvwwvskh\PC92.----.-..////.....-..,,,,,,*+-/17>GPZenquxxxxy|{{xsng\OGB?<=BHMRWaglrw|€„ƒƒ‚ƒ€}}zzyyyz{{{{|{zwrsssrsrpnifb``deiloqrsuvwz|}|{zz{}€„‰ŒŽŠˆ‰‰‡†ƒ{slb\XXWUUVX[^agloruy|~~}|{{ytnf^SJ@83137@LXgs}„‡‰ˆˆ‡†…†ˆˆˆ‡ƒƒ}|xurkbVLC?<:99ONNNMMMMLKKKJIGFFEECA>>=;;:::;<<==>>>>?@>>>>====>>==<<<<<<;::99977776666777788665555444322211110//..------,,,+++++++,,--.../////...---.....-,,-,++********))(((((((())))((((''(())))))))((((((**))))**)))))*++,,+-/./...--//./.137;BGLRV]_cfgikkjgfca_][[YWRIC;4-(''(&'('&'((,19BNXcmvz|~{||{wrj`PB5,)(())**)*/5<GUcksz~}~}}{{yuph_VQMJIIEA<70*&#" $*;_afkqmeLFU[\VTX[YOXRQZX^`gibR@VNDe~ynf_V^K:8=QVHPSGFGKVdouwxxwyywuli\PC90-++++,---....-----,--,,,,++**,-17>GPZdmquxxxxwzzzwtoh^RJE@CFKPW\ahmtx}„…ƒ‚‚€~~}}zzxxwyzzzzzxwusqqqqrrpokfbbcdfiloqrsvvwz}}|{zz{}…‰Œ‹‰‡‡‡†„‚{slb^ZYXXXZ[]`gkprsx}~~~}|{{ytle[QE;52239BP_jv†ˆ‰ˆˆ‡††‡ˆˆˆ‡ƒ‚{xxvslcVLC?;999OOONMMNLKKJIHGFFDCB@=<<;77998:<<>=>>>>??>>??>>>>==>><<>>=;;;9887777766665678666646555554322102220/.//,-,------++,,++----../0....///.....-/-,--,+****))))**))))**(())))))))(*))(())))))))(((((())))))++++++**+++,----....../000227;?FLQU\`acgjjmmigfca^[[ZWSOG=70+((('&&'&&())*/4<GT^hrx{|{{}|ytmeWH:0))))))*)).28BN\how|}|}||{zxtmbYRLIIFB;63+&#! ##(;MUhfc\Y2@Z[WR]QPZVZUP^[W^`jeW4ONNoordbgXZWM8=GCQWD:6?M[gpvxxyyxxvtni_OB80*++,+++++**+-,,+***)+,,**+)++--07>FPZclqwwxxxxz{{xvpi`VNGFHNRY]dipuzƒ†…„€€€€}}{yvvuttuuwvvvwurqqpqqrsqokhdccdgiloqrsvvxz|}}{zz{~†Œ‘‹‰‰ˆŠˆ‡†}vkda^\[\\_abeinsww{}}}}|{{zwrleYNB94224<FTcnz„‡Š‰ˆ‡†…†‡ˆˆˆ†ƒ€|yxxvtneXMC?;99:OOOMLLKJKKIHGFEEB?>;:::978999;;;;=>>????>>==>>>>==>>====;<;;:9887777666666778966675555543331121100010---------,,--,,----....-...///.......-,,,,+****))(())**))**))))))))))))))(())))))))(((((())))))++++,,**++++++--....../00237;@EKQVZadeikkllijifc`^[YXVPI@91-*)(('&&'&'&&()-27ANWbnuz{|{{}{wqi^N?4+*())))))*05=JXalt{|}~}{{|zuof_UNJFC=72,'#!$""#>`^RV_^\URRUZ\]T`\LKZ_^gSJ[c`\VFWKRg_dcgeeedQ4:HECB=/9CP[hqwxxxxxxvtnj_PA70****)*+**++,***))))))))(()**+,.27=EQ[cjruwxxxxx{{yupjbXQMLRV\`flsw}ƒ„ƒƒ‚€€|zywtrpoprtsrrtvutppopqrrrmjebbcdgiloqrswwxz}|{{zz|}†ŒŽ‹‰‰ˆ‡ˆ‰‡ƒ}vkdb_][^^acfjorvy|}€}{{{{yvpkaUJ=73128>KXds}„‡ŠŠˆ‡†…†‡ˆˆ‡…~zyxwvtneXLD=:89:OOMMMMKIHGGGEDDA>=;:9887678:;;;;;<====>=>>>>>>>><>=====<<<;;::9877776677777777888876545543332211011//..-----,,------------...-./../.----..-,++,+**))(())(&(&)(**))))))))))))))(())(((())(((((((()))***++++++++++++----....00228<AGKQUZ_dfhkmlnnlijda^]ZWWSOE<5.**)((''''''(('',/4=HS^jqwzyz||{yrpdUD8/+)(((((()/3;GT`grx{}}}}|wsk`UOEB>94+)$!!#! /eg[FLd]VSQUURDN_iRBNXTW^VY[[XUUSPBHW]h^fcfk^<2EC=DE71:CQ\hqvxxxxvvvtoi^O@6.)''''())))(*)***)((((%%'()**+--16>ENWbkqtvxxxyz{{xvrnc[VSUX^dhms{~„ƒƒ€~~}ywwurnmllmklmpstrqonoqrrqrliec`befhlnoruwwxz}{{zzy{}‚‡ŒŽ‹‰ˆ‰‰ˆŠˆƒ}vleb_^^_`cfhlotvy|€}}yzzyvtmg^OD;6433:@O]iv€‡‰‹‰ˆ‡†‡‡‡ˆˆ…ƒ{wywvvtogYMC=989>OOMMLKIHGFEECBB?;:998787678:;;;;;<=====>>>>>>>====<<==>>==<<:;:9888877777777778866787655554333331110//..--++,,------------....//../.----..-,++,+**))(())()**)&))))))*)))))))))(())(((())(((((((()))***++++++++++++,,--.../0158<BGLQWZ^cgilmpqpqmkgc`^]ZWTOH@93,)*)((''''''(('')-18BNXenuxz{{zzzvqgZI=/*)(((((((-17?MXdowz}~~}|zuof[PGA:4/)&"!!! !7YghZ`]c_HMWTROQ^lT5@IKGS[^\WOFEEBHKJV`N]``e[QGDTG9((3:CQ\hqvxxvvvvusoi^O@6.)''''''(((())**)(''''%%'()**,//38>EQWbkqtvxwwwy{{{wunia]\]`glpsw}‚ƒƒ„€~}|zyutpokjiihjkmpstrqonoqrrrpkhca`bbdgjlmotwwy{|{zzzy}~ƒˆŒŽ‹‰ˆˆ‰ŠŠˆƒ}vledbaaabehkosvz{}~~}|yzzyvsleYME;6435<DSamy‚ˆ‹Š‰ˆ‡†‡‡‡ˆˆ…‚}ywvvvvtldYMC=89;@NMLKJGIHGFDB@B==:987766667889;::::<<<<<<==>>>>>>==>>==>><<====;;:9999788889999886788766665443333332100..--,,,,,,,,------........///....--.-,,,,++))))))))*/28-')))))**))))))))(((())))(((((((((()))*+*+,,*++,,++++,,,-//00159>DIKQW[_ceikmoppprmhea_\ZXWSLC<5/)('''''''&''&&(''*/5<IUaisx{zz{|{xskaQ@3+((('''''+.6=IUamuy|}}yrj]SE>6/,&# !! !#Ohmhcab`_SPSX\ZdTEC=DLP[`VPV?BEBEFHPQPOZW\_TIOU\O,.49CP\hquvvuuuuvtnh]N@4,('&((%%''&&))(()&%%%%&&&'(*,.1148?FQWaiosvxuuwxyzzyvsmgdcdhlrv{ƒƒ‚€€€}}{zxuuqomkgdcfhjmorttrqmopqrqpmkgeaabbcfiimoquyyzzzzzyy|ƒˆŒŽŠˆ‡‡‰ŠŠ‰…}vkffdccdfjkmouwy{}}}}|z{{zwqkcXMA95237?IVdo{…‹‹‹‰‡‡†‡‰‰ˆ‡…€|xuuuwvtph[OB<7:=EMLKJJHGFECCB@=9966655444666678:::9:<<<<<==>>>>>>>>>>>>>>=<====;;::999888889999998777776665544333332100/---,,--++,,,,,,--........///....----,,,,+)))))))))*6CC4'())))**))))))))))(())((''(((((((())*++++,,*++,,++++,,,-//0258>CGMRV[`dfikmoqqppokfc`][XUTOF?81-*('''''''&''&&''')-28CR\fpuy||{||yuodVF6,((('''''),3;CQ]juy|zum_QF<3-*%"!!! !5Wmy\^ba^YXJKPZb[]YMBHFGKYWPPYC4:KORJHHFJLPPPLN\hVO)-5:DO\grvttuutvurmi]N@4+'&%%%%%&&&&()(('&%%&&&&()*,.03459?FQXajosvxuuwxy{{zxvrmjiiorw|€ƒ„‚‚~}}zxwuspplieaabfhknqrttqpnopqqpomiebaabccefhjnruyxz{{{zyy|ƒˆŽŽŠ‰‰‡ˆ‰‰‡ƒ}vkffddddfilnsuwy{{{zzyyz{yvpjbWI>85348@M\iu‡‹‹‹‰‡‡†‡‰‰‰ˆ„yvtttuvtog\QE<9=CJONLIGFFEDA?=<9666654434665557788::;<<<==>>====>>??>>>>??>>==<<<;::::::::99::::998899757776555555332200..--++++*+++++,,--------../..////.---,,,,+**))))**))2:9-)((((((((())))))(((()'(((((((())((+++,,+,-,,+,,,,,,,,.,..0237<CGMRW\_ehjmnpprrponkgc^[ZWTPJC93,)))''&&''&''''&(''&+/5@MXcntxzz{||{xsj\L<0)'&&'''()-29BNYenw|~€€‚~wqgVH;1-*%$#!!##\c_uQ>TJXdUA=O@LTSPNQ:;HMKHHNJUY\^behhaJBKFDBMNLYfVW+,2:EQ]gqssrrrstusni^OA4,(%%$$$$$$&&&'(('&%%'''()+-./1247;@FOV`hosuwuwxx{}}|yxvsqqrwy~„ƒƒ€€‚€~|{{xwuqpnkgc_acfhjlpsstsqpoooopnmkgca_``_acefhlqtx{{{|zwxy}€„‰ŽŽŠˆˆ‰ŠŠ‰ˆ…|tlgfeeeefjknqrtyz{{zyyyxxxsmg`UG=9767;DR`lx†‹‹‹ˆ‡‡ˆ‰ŠŠ‰ˆƒxussttttqg]QE=>BGNLKJGGFDCB@>;97553333323455667988::9:;;==>>==>>??????@>??>>==<<<<;:;;<;::::::::998876778876666655332210..--++++*+++,,,,--------../..////.---,,,++**))))))))**++)((((((((()))))))(&)()))(((((())))+++,,+,-,,+,----,,,././047:@EIPV[`dgilnqrrropnlhda][YVRLE<6/+*))('&&''&''''+5</&(-2;GT_kty{{{|||{unaQB5+'&&'''()-1:ANYantz~€€€‚zsiZJ;/(%&%$!!"7uYKB<;KOVaT?12;@?EBGJA8FIKEIEN[^`bdeecZ>=ICEB^NCP[\J(+3<EQ]gqssrrrstusmh^O@6,)%%&&$$$$%%%&&&&&%%$%')+,/01346:>CIOXaiosvxxwvxy{}~}{zwwwy}€ƒ„„ƒƒ€~|{zxusoolgb_^_acgjlorssutqpoooopnokeba_^]_``ddglqtwxy{|zwxy~†ŠŽŽŽŒ‹ˆˆˆˆˆŠŠˆ‚{rlgeeeefgghmpqsvxzzyxyyxxvslf_QG=:99:=FTbmyƒŠ‹‹‹ˆˆ‡ˆ‰ŠŠ‰ˆƒxussttttqg]QD>AHLPLLIGFECA@><965432212223344557888999:;;<=>>>>??????@@?????>?>====<:;;<<:::::9::99998677777568774433211/---,,+++,,,,----------.......////.--,,,+***)))((((((+5B<,'''(((((((((((()((((((((((((())++++++,++,,,,,------./..0159>DHNRY_behklopssoommkgb_\YXSOI@81,*))*''('''''''&+4-'''+.7COZhpxz|zz||~yqfWE7,('&'&'(,/49BKUaksz}€„}vl_O;-$$###$#%<kL;453=LLbbaUB='799:BA=GKJLPTX]_`adbc^T<5@CEEjmMICDH105<FR[gqsttssttttmg^PA5-)%%%%$$%%$$%%%%%%&%'))*,.023579:?EKQYahosvxwuuwz}}~~€€‚‚„……„‚‚ƒ‚€}{zwvqnnkeb``abdhjlppruutrrpopppnlmjfb_^]]]\^`bgjpsv{{{{zyvz~‚‡ŠŽŽŽŒŠˆˆˆŠŠŠ‰†{rjfeedcbabfikosvwxwwwxywwtpjd]PD=:88<BJXer|…‹‹ŠŠˆ‰‰‰ŠŠŠŠ†‚|wtsssttsqi_RGCFJPVKIGFGDC?<:9754321101002244444788889:;;<=>>>>??????@@????@@?>====;<<;;;;::::9::99997679887877775432210.---+++++++++,,,,------......./---,--,,++**))))(((())'61**'((((((((((((((()(((((((((()))*+++++++++,,,,,----..////137:AFMSX\`dijmnprqqpnllhd`][XWQKC;5.+)(()))'&''''&&'%$%'('*.5?LVcowz|{zz||ztl\K</('&'&'*+06:AJT`jry}ƒ‚€yqbR@1(#$$$$$'BnY>6;58AQbioqhP=F>46CGFPNMNVY[^`abb`]XTR5EGGBNaMJU]K.16=FR]iqsttssttttlh]OA5-)%%%%$$%%%$%%%%%%%&'*+.002457:<<AEKQYahosuyxwvx{~ƒ„ƒ„„„‡‡†……„ƒƒ€€}|yvsrmlifcaabbcfgkoqrtuutrpooooonlkhd`^]\\ZZ[\acinsv{{}|ywy|€ƒˆ‹ŽŽŽŒŠˆˆˆ‰‰‰ˆ…€|siedda`_^`cfjosuvvuuuuwwwtpkcZNE><;;?FQ^iv€ˆ‹‹Š‰ˆˆˆ‰Š‹‰Š‡€zwtsssttsqiaUKFJPVZKIGEEC@;9865422100////11333356897889;;=>=>????@@@@A@@@AA@@?>=====<<<:;<:;<;:::99:97788888877775533210.--,,++++****,,,,,,----....,./.---,--,,****))))((((**'&(((())((((''''(((((()'((')))******+++++++++,,,----....000036:>DJLT[_aeijmonooonkjjfb^\[XTOG?70+*)))*2/((''''''&&&%$&#(-1;HUamuy||zz|{zun`P?2*'%&()*/39=AIS]fov}‚‚ƒƒ‚{tiZF6,&$##%(([kX<6<BAIYentwtVKHCADLPMGCLTXZ]``cba]XTNF>BACDKZTPLL9117>HR^jrtttusttsrli_QB5-)%'''%%&&%%%%&&%&''(,..01356:<>@CHMR\bhosvxyxxy{~„‡ˆˆˆ‰‰‰ˆ‡……„ƒ„€}|yvtpliidb`aabcefilnqstutrqooooponlieb_][[Z[[]]^bglrvz{|}zwz}†‰‹ŽŽŒ‰‡‡‡ˆˆˆ…‚~vnhdcb_`\\`ehknsuuuuuusuuusoj`YOD?>>?EKVbmvˆŒŠ‰‰‰‡‡‰ŠŠ‹ˆ„yvsrrttvurleVOJMT[_HHFCA?<98655222100////01213356777889;;=>=>????@@@@A@@@AAAA?>>>====<<<;;;<<;:::99999999888877775544320.--,,+++++**+,,,,,,----....,./.--.---,,****))))(((((())''((((''(('''''((((()'((')))******+++++++++,,,--..//..000136:AFLSW\`cgikmnlljjiihhc_\[[VSLC;4-**)))**)((''''''%&&&$&%(+.7CQ]hry|}{{||{vofWD3)'%&(*.26:>CJR\elu{€‚ƒƒ|ypaO>0'###$%)DKF8??=>JZdoswr[TNA>ABMKEPTYZ[^``a_\XTMGB:8MB@GUZZVE,247>JT^jrtttussssrli^PB7/+('''%%&&&&%%&&&'(*++.03457:;>@BEKQT\bhosvxwwvw}€„‡ŠŒ‹‰‡†…„ƒ‚€|{vsokhfb_`bbaceehklpqstutrqoonnomnlieb^\ZYYYXYZ\`glrvz{}{xwz}†‰‹ŽŒŠ‰‡‡‡ˆˆˆ…€zslgdb`^^\\`eiloqttssssstvsrnj`XNGC@?BIO[dpzƒ‰‹Š‰‰‰‰‰Š‹‹‹ˆ„yurrsttuusmd[SOQY`dHEDB@=984553101100..../11123566699::;;==>>????@@AAAA?A@@A@???>==<<======<<;:::::::999977997766555310..-,++++++**++++++---.--+--/--,,--..,,++**))))((('''((((''''''''''''''''''''(((((())**+++,,,,,,,--,----.0300../00047<CINRW[_cgiklkiigggfeca]\[YUQI?80,))))(((((('&''&&&&&&%%&')05?O[epwz{z||||xri[K;-&'))-157;?DKOYbkrz~€‚ƒƒ}uhVE6+&"$#$(@NJ>799<JUbqtwtlNCB97>FFPRW[]^_a`^[WRLF@852TC;GPYX\@0269@KVaksuuttstttrlh_QA60,)('''%''&&&$&&'(*,-.0357:;==BDFHOSX^djosvwyyy{„†Š‘‘ŽŒ‰ˆ‡…‚~}ytqnjhc_^`_aeefghilkoqrtttsqoonmnmlieb^[[YXYXWWY\`flqvy|}{{{z~†ˆ‹ŽŒŠˆ†‡‡‰‰…‚}wqjfc_^^\]^afinprtsssrrstttrog`VNHECCFKU_gr{…‹‹‹Š‰‰‰‰Š‹‰‹‰…~zvtstuuutrke_WVX^diGEC@=9864332200000..../11123566699::;;==>>????@@AAAAABBBA@???>==<<======<<;;::::9999::77887766553210..-,++++++**++++++,,-.---./---------,,++**))))((('''''((''''''''''''''''''''(((((())**,++,,,,,,,--,---../0..../11469?DKPTX[_cghiihffeedca`^^\[XSNE=4.*)))))((((('&''&&&&&&&&&'+.2<IVclwz{zyy{|zuk^N?2*))+/379>@EKOWahpx~‚‚‚ƒƒ~wn_N=/'##$%&BuwD&)3:HTcpvxunK;./27.;VYZ]^`aa][VRLFA93.-7?EQOOL_M955:AJUbluwvuuuututlh_QA60,)(''''''''&'&'(*,-.03579<=?ADFHJQUZ`djosuvxz{€…ˆŒŽ’““’‘‰ˆ‡„€~~yvrliea`]^`_accfghillopqsusqpppnmnmkgea]ZYWVWTSTTY\djqw{||zyyz~†ˆ‹ŽŒŠˆ†‡ˆˆˆ…€zupfc`^]\]]^afjlprsrppooprrrpme]TMJGFFJNXblv€ˆ‹‹Š‰‰‰‰‹Š‹ŠŠˆ„}yvtstuvuusnja[Y\`fkFCA=:86743111./0//.....011344568::99;;==>>????@BAA@@BBAA@@????>>========<<;;;;99:998998877666644111/---,++**+++++++++++++-----,.--------,*)**)*)))((('((((''&&&&''''&&&&&&&&&&&&''(('(**+*++,,,,,,-----.--..--...//0368;@HNSTY\_behecbaabb``__`^^[WRKA:2,*****))((((''''''&&&&&&%%).3:DR`lswzzzyy{ztmcSC4+**-257<?CFJNU]gnv~€ƒ‚ysfVC3'%$##"5id,#'/:CSbntusk`6%%*+7LYZ[_`_a_YUQKE=71/.338HPQOUNRW45:ALYcmuwyxuutwtrok`RB91-***(''''''''()+-/012468;=?ACFIKNSW[aflptvwxz}‡‹’••—–“’Š‡†„€|ytolgd`\\^``acegffgikmnprtusqqoonomkifda]YVUTSTSTUX\dkpux{zxxxz~‚‡‰ŒŒŠˆˆ†ˆ‡†„~ysleb`^]\[]^bejmpqrrnnnorssuqmg_WOMIGINU\fp{‚‡‹Š‰ˆ‰‰‰ŠŠ‰‰‰†‚}xusttvvwwuqld]]_djoCA<:986543111...//.....0111245688899;;==>>???@@BAABBBBAA@@??????========<<;;;;;;:998998877666644111/---,++**+++++++++++++,----.---------,*)**)*)))((('((((''&&&&''''&&&&&&&&&&&&''(('(**+*++,,,,,,-----..../..///001269>DINSW[^^bedb`_][\\]]_```][VOF>6.******)))(((''''''&&&&&&%%(+28BO\iqvy{zxxxzvogXF8/--/38;>@DGJMT\dlv}€‚ƒ}vl]J8+&#"" 3L="&/48DRantwxZ=$21?MUZ[[_`a`]YVQLE?80,-/20.?MQRTMII65:AMZcmuwwwvuwwtspi`RB91-**))(((((())),,-013468:;?ACEJMORW[_cglquvwy{~ƒŠŽ“–—˜—–“’Š‡…}ytnjgc`\[\^``acfffgjklnppsvusqqooolljfd`][WVUSRQPQRS[aiouy|ywxxz~‚‡‰ŒŒŠ‰‰ˆ‰‡†ƒ}vpga_^]\ZZ\_dhjmopppnnnorsttqkf^VPNLKMRXbkt}„ˆ‹‹‰ˆ‰‰‰Š‰ˆ‡‡…}xvtuuvvwwurngaabgmr@=;:8865432200..--..../111225677::::<<==<>??AAAAAAAABB@@@@??????>>>>====<;;;;;99:9988788666655554110-,-,****++++++,,++,,,,,,--,,,,,,,,,,,,))()))((((''&'((((&&&&&&&&%%&&&&&&''''''((()**++++,,,,,,----.///00..////2048;AGKOUW\]_bba^\\[[Z[]]`aa`^YTLD;3,******)))('&''''((''''&&&&'*/5?NXeovxy{zwxwtoi[M>411269>@AEGJMSZbhsz€‚‚ƒƒ„„xreS?0(#$.+10&$&226CQ`mty|iIJ[[YXXY\_`__]YUNJD=70--,.--.^SRONORI47<AOYdnvxwwuuvvwuokbRD:2-**))***'(()*,-.014579:<?BEHILPQSZ\beimpsvy{‚‡Ž“—˜™˜—•”’ŒŠŠ‡„€{unida^\Z[]]__bddefgiklopqttsrqpoonnkifb^[YVUTQPPOOOSYaiovxzzyxyz~†ŠŽ‹‰‰‰‰‰ˆ‡{vmb^^][[[Z]adiknqsqpoomorsttpkd]VQQOOQV]fow†Š‰‰Šˆ‰‰Š‰‡†…„‚€|yvutvvvxxvuqjecehls=::86555432200.---..../111435677999:<<==>???AAAABBAABBA@@@??????>>>>====;;;;;;:::9987888877755435322/.-,****++++++,,++--,,++,,,,,,,,,,++++)))+**((((''&&'''''&&&&&&&%%%%%%%%&&&&''(((*****+,--,,,,----.///00//00/0336:?DIMSVZ\]_aa^\ZZYYXZ]_bbb`]XRI?61,******))*))'((('((''''&&&&'*-3;HT_msxyyxwwwurjaQD7337:<?ACBEHLOV`gpz€€ƒƒ}tkYF5+&&=6&%%!%+/6CQ`mtxzzxrme][Z\^_`_\YTPJD=5.,+,----7uXQNLJS?/6;DQ[cmuwwuvvvvwupj_RD:3.++*)**+*++,,--/024689<>@DGJKNRUW[_cgknstvx{~„‰”™™š—–”“‘ŒŠˆ†}uoid^[YYZZ[^__acdefgiknoqqttrqqpoonnjhfb]XWTSRONNMLNQWahpwzzzzz{{‚‡‹‰‰‰‰‰ˆ…€ztlb^[ZYYZZ]afjjmqpqonnmoqrssold]XSPPSUZaks{‚‰ŠŠŠ‰‰‰‰‰ˆ†…„ƒ€|yvuuuvvwwwvqjhgikos;:876644322000.-....../12233566699:;<<==>>?@BBBBBBBBBB@@???>>>??==>>==<<;:;:::9999888989::99:8997975520+*)**+-+-,,,-..-,,,,)++,+,,,,,,,,+*)**))(((((''&&&&&&&&%%%%%%%%%%%%%%&&&&(((())*****+,,,,,,--...///////001235:>CGKOUXZ[_`_^]ZYYYYZ^accdb`\VPE<6/+******))**))))('((''&&'''''(+09CP]iryzywwvwxvmeWH=679;>ACCDFJMMS^flu|€€€€‚ƒ€zo^M<0'&#"$%$$$*/5AQ^mv{||{vnhc]Z^_`a]YUOID=6-+*+-....<jfPQNT^X87>DP[fouwuvwwvvwuoh`QE:3.-,++,,,,-,+,-.123569;>@DGIKNQTW[^beimnrsvx{„‰‘—šš˜—“‘’‹‡…‚ytmd_ZXWWWYZZ]^_adefgjmopprsssqpoponmhhea[VTRQPNMLIKMOV_hptyxxwxxz„ˆŽŒŒŠŠ‰ˆˆ„€yria]ZXXXYZ]afimproonnonquvtsojc]XTRSUY]gmu~…‰Š‰‰‰‰‰‰‰†„ƒ‚~~|yxuwuvvwwwtroiginqu:9876654321111.-....../12233566699:;<<==>>?@BBBBBBBBBB@@???>>>??==<<===;:;;:::9999889:=>@@??@ABBBA>><83.+***./011121110/...--+,+,,,,,,,,+*))*))(((((''&&&&&&&&%%%%%%%%%%%%%%&&&&(((())*****+,,,,,---...///////001358<BFKORWX\^^^_]ZWVVVVY\accdba\VMC;4-+**++**))**))))('(('''''''''')-4>LXgpuxxwvuvwtqhZPB::;=?ADCEFJJLPZbjrz~€€€€‚‚zqgVC4(&##$25!#)-5AN^luz}{xplf`^_`_]YRNIB:5/,+*+,--..2QbSSSObgB7<FS^gpuwvuvvvvvspi]QE:3..-,,,,,,,+,-./14688:<>ADHJMPSVY\_cdhmqstww{…Š–——•”‘ŽŠ‡†ƒ€|wmg`[WUUVWYZZ\]_adeggkmopprsssrpoponmigc^YURPNMLKKIGIMT]fmsvyxwwz|€„ˆŒŽŽŒŠŠŠˆˆ„xof^ZYVWWXY]ahjmmqponoopquvtsojb\ZXVUW]biqy†Š‰‰‰‰‰‰‰‰†ƒ‚~}}|yxusuvvwwwtrojhioqu98766544321110.-.....//123345677:::;==>>>>@ABBCCCCBBBAA@@@?>??????<===<<:99:::9998889;@DFHHHHIIKJJHIFA:3.,-/145679:::8854110/-+*---,,,,+***)((((((((&&&&&&%%&&%%%%%%$$%%%%%%%%&&((''))*****+,,,,--..-.....//0011368:>EKOTWX[[\^__\[ZXWYX\`cdefc^[TKA92,*+++++++++*))))))))''((((((&&),2:GUbmtvxxuuuxvskbSH=;=?ACDEEFFJMPW]fnw~‚€€€‚ƒ~wm[I7+##!#*-##'.5@O\itz}~{yumfc`_][WQLIB92-+,++,,-//115FWQKNWV<8=GT^hrxwxuwwwwvsnh_PF:42...-,,,,++-/12335::<>@CFILORTV[^acgkprvwxy|€„‰”–•”’Œ‹ˆ„‚|yrkdZTUUTTUVXZZ[^_ceghlmnooqssrqpoqpqmjea[XTQPMKHGEDEFKQZflswxxywy|€ƒ‡‹ŒŽŒ‹ŠŠŠ‰ˆ„~wnf\XWWVWX[^bgjlmqromnnoprtsrojb\YYWW[`flt|‚‡‰‰Šˆ‰ˆˆ‰‡ƒ€~}|{||yvsuwvvwxwvromklpsw8766553332110..-.....//1234556779:;<==>>??@ABBCCCCBBBA@@@@?>>>========<;:;;::999879:=AFJMOOOPRSSRRSROIC931258;>@ADDDECB?<:9730/,--,,,,,+*****)))((((&&&&&&%%&&%%%%%%$$%%%%%%%%&&''''))*****+,,,,--....../////01357<@EKOSV[\\]_^]`^\[ZZZ]`acdedc]YPG>70+++++++++++*)))))))))'((((((&&'+07BP\iquwxvttvvsmgYNB=?@BDDEFGFHKOSYahr{€€€€‚ƒƒ€{scP?0'$"!#""#'-2@MZitx~~{yungb_][WRMFA:2-+***+,-/00242LWKII[N68@JU`jtxxwwwwwwwtoj^OE<50....-,,,..-/12335:;=>ADHJMPRVX[^beimquvx{|}„‰Ž““‘‹ˆ†‚€|wtng`WSURSSRTVYZ[^_adgjlmooprssrqpopomkgb_YUQOMKHFDCAACHOYclrwxwwx{}„ˆ‹ŒŒ‹ŠŠŠŠ‰ˆ„~wnf]YYXVWY\_bhknpoopnoorstutspib\YYY[]cipw…ˆ‰ˆ‰ˆˆ‰‰ˆ…€~|{x{}}ywuvwvwwxxwtqmkknsw6666553332110/-,..////0234676778:::<<<==>??@CCCCCCBBB@@>>??>==========<<;:::9989::;=@EINRVWWXY[[ZZZ\YTKC<:;>ACIKMPSTRONJJIE@=81/-,-+++*,**))*))(('''''&&&%%%%%%%$$$$$$$$%%%%%%%%''''()**++++-----..//////1/112248<?DIPRVZ[]^abcc`_^\\\]`baadeca]VMD;4.++**+++++,++****)+))((''''''&&()/5?LXforuuuutvwtpk_SHA@BCEFFFGGGIMMR[dmv}‚„ƒ‚}tiXE5($"$#$##&,4@MZhsz}||yulec^\WQLFA:2-****++,-.//..3YTPIJMV=:AKV_lwyyxuuvxxvsnh]OD=62//....-,..-/023568:<?AFIJMQSVX\_dfjnrvx{|}~…ŠŽ‘‘Š†…ƒ}xrnhaZWSQPORRRSYZ[\_achjlnppsssrrooopolgda\WRONKJGCA><<?ELV_ipx{ywwy‚…‰‹ŒŠ‰‰ŠŠ‰‰‡ƒ€yne]XXXWXZ^`chkmnppppopqruutrnib]ZXZ^bgmv|‚†‰Šˆˆˆ†ˆˆ‡‚~|zxxx||zwvuuwxyyywtqmkmqtv65666543321100.-0011113534677789:::;<<==>??@BBBBAAAAAA@?==?>========<<;;:::99979::<=AGKPSXZZ[\^^___a_\UMECDIMPVX[^_`b__]YVRNGB=62/.-,,,+++))*))(''''''''&%%%%%%%$$$$$$$$%%%%%%%%'''''(**++++----./////0/00011258=ADINRW[]^abdgffdb_^^^_accddec_\RJA91+++**+++++,++********((''''''(((),2;FS`kruwuuuuwvqngYNGCBDFGFGFFFHIILT^hqy~‚‚ƒ‚€xo`M<.'#%#$$$(/9AN\grwz{{xtle_\UQKC?82,*****+,,-.//..2LdXJLLX=9AKWbmvyyxwuvxxvsmg]OC<622/110/.,../1023568:<@CFIKNRSVY]_dfkoquy|€ƒƒˆ‹ŽŠ‰‡†‚|xtpic]WSQOOOPPRUVY[\^`chjlnppqrrqqqqqpomie_ZTNMKIFC@?;::<AJU_hovwwuwy~ƒ…‰ŠŒ‹Šˆˆ‡‡ˆˆ‡ƒxqg`ZZZY\[_cfhkooppoooqrsurtrmhb][Z[^djqx„‡‰Šˆˆˆˆ‰ˆ‡‚~zxttx{{xyvwwyyyyxwtqmknpru774455433211110..122113457777899::;;==??@>@AB@CCDDBBA@?>>=>>====>>>=;;:::99987889:;=BGKORVZZ[\]^adbab`]WPNOSX\_acejjhgffc_]XVQIA<52-++-++***)(((''''&&''&%%%$$$$####$$$$$$%%%%%%%&''''))++,,--../////000/001269=BFJNTVZ]]acehjkieec`__`acefdca[WMD>7/+,,++,,,,++,,++****++)())((((((&'*/7DQ]iruuuustxwtpk_TJCDDGEGFGGFDFEFMWcnx~‚‚‚‚‚‚ƒƒ{sdSA1'$$%&&',58DNZgrvwyyurme]WQJE?80+)))++*+--..//001CfVRNPV8=CMXcnuxzxxwwxxvtmg]PD<62322222/-./02213579:=@CGJMORUXY^acglprvz~€„ƒ…‰ŒŒŠˆ‡„‚|xtpkc\WSPOOONPQSTVW[^_cdegmooopqrqqqqrpomhc^YSNKHCB@=;977:@KT_ipuwwuwz}ƒ†‰ŠŒ‹Šˆ‡†‡‡††ƒzrid]ZXZ]\_aehlooqqqqprsuutsplgb\\\^_fmszˆ‰Š‰ˆˆ‰ŠŠ‰‡}yvstx|zxyxwyxxzzxwurmkmqtu775433432111110//022333568997788::;;:<???@@AAAAABBBA@A>=>===<<<<===<;;::9998778779<>@DILORUXWX[\_bbdfdc`[WZ^^ceggikkmikkigec_YUOH@92-,,**)**)(((''''&&%%%%%%$$$$##$$$$$$$$%%%%%%%&''''))++,,--..//////0011248;?DHLPTV^_bdeijkmllifeca`bbddedd^YSJA92.+,,++,,,,++,,++****+++)))(((((('&)-4@MYdnsvuutuwxwsofYOHDDFFFFGFDA?>BFP]jt|‚ƒ‚‚‚‚ƒƒ|vjZF6+%%&&).17>FN[grvwxxurmcXRKD>80))*))+++,--..//000?baQLOLE<BNYeovyzxxwwxxvtmg]PD<843222221-.//0213579:=@CGJMPSVXZ^acglprv{‚†…ˆŠŒŒ‹ˆ†…‚|ytqkc^WSQPOOPRSUUWYZ[^abdhjmooopqtsqqqrpolic\WPLFC@=<986568>JU`ipuwwuxy€„†‰‹‹Šˆˆ‡…†‡††ƒ€ypfb^\\\]^_bfinpqrrqrrtuvvvtqkea]\]_bhow~„‰ŠŠ‰ˆˆ‰ŠŠ‰‡€|xsqvy{zzxwwvxxxxxwurommnqs6654443210121121113334446577899:99::<;=???@A@AAA@@>@@@?>=<=>==<<==<<;:9999887666569;?BFJMPSUUTSTX]aceegec``bcfegiiiillkliigdcb`[ULE=5.,**)**)(((&&''&%%%%%%%$$######$$###$%%%%%%$%''''()*+,,--..///////01567<@EIMSWY\_dhjmnpprqojihdcabccbca`[TMC<5/.,,,,+,,,,,-,,++++++++****(())((((*-2<HUdmsvvvvvvyywti_SIEDEGGFEEB>;;<@LXdrz‚ƒƒ‚‚‚‚‚€wp_L;.&&')-05;@IP\gqvwwwspk_UMF?5.+())**++,,,-..//1114NeRKOU^M?Q[gqwzzxxwwwwusmh\OE=854332220//////12479;>ACHKLNSUWZ^bcgmqtx~‚ƒ†‡‰Š‹‹Š‰†„ƒ}ytqkf_XTROOORRUXXZZ]^_bcegjkmnopqrtssrrspnnid]VQKDA>;:762248?JV`kqvyxvx{„‡Š‹‹ˆ‡‡†…†‡‰‡„xogb`^]_``cehjnqrrrssuvuxvvsric^]\^bflsy€‡‰‹‹ŠŠ‰ŠŠ‹Š†{vtrtx||xxxwwxxyyxwtqmkmort6654443210122221114455556577989:::;;<=>????@A@AA@@A@??>>=<<=<<==<<;;::99989966654589<?BFHKJJIJJIOTX]_ehhhedegfeedddceefggfgihhheb[SLA60*))**))(('&''&%%%%%%%$$###########$%%%%%%%&''''()*+,,--..///////0469;AGLQRXZ`dgimoqsswuromjfecacdcbb`[UOF<51/.,,,,,,,,,,-,,++,,,,++++**(())((((),19DR_jqvutttvyzzumbXMGFFGGFEC?;878<FTbmv‚„ƒ‚‚‚‚zseTB2)')+049?EMT]hqwxwwroi\PH@8/+))))**++,,,-..//1122=ghRPIZaJM[hsxzyxwwwwwusmh\OE=85434322000000004679;>ACHKMORTXY]^cglptx~‚…ˆˆŠ‹Œ‰‰ˆ…ƒ‚€}ytpjd]XVTUSUXXZ\]_``bcdhiikmoopqpqsrsrrsrpomf`ZTMC=:97531028@KWakrvwxvx{„‡Š‹‹‰ˆ‡†‡ˆ‡ˆˆ…xogb``___adfiloqrssttvvwxvvrpic^\[^bgow}„ˆ‹Œ‹ŠŠ‰ŠŠŠ‰„|xsppsy{{yxxyyxxyyxwtqomnprt55554442232233333455556666679;;;;;<<<>>>????AB@@@@@?>>====>=;;;;::::::998877555544557:9<>=>>:99;CIQW_dhihgfeeba\WTTX\\]]]`adfhjkmj`VLA4-*)**(()('&&&&&%%%%%%$$$$#"####"$##$%&&&&&'''((***+,.----//0001247<?DKPTVY_bgjmoqrvuyxwtqmieddddccb_YVQFA92,,,,,,----,,..----..-,----+**())))))),27?N]iqtuutuvwyywpg\QIGGHEGEC=74449AO_ky€„…ƒ€ƒ„ƒ~wkZH9.*-04:>CJQX_hqxxyvqoh\OD90*)))))****+,--...//103;RdTTGNNRQZgtz|zzyvvvvtqng\OF>:7665553110000013567:=ACGJMORSVXY`bhjnsx}„†Š‹‰Š‰ˆ„ƒ‚|yvphc\XVWWVY[]abceegjklnnpqrssqqrssrrrqtrrqnje_XQJB<65532027@KValsvwwvz}…ˆ‹‹‹Š‰ˆˆˆ‰ŠŠ†…€yohdb`_^_bgfjnrqssstuxxxzwurlfa]]]`ejry…‰‹Œ‹ŠŠ‹ŠŒŠˆ‚|wqmpuy{{xwvvvxxwwyxutpoprsu55554444334344445555556666679;;;;<<<=?>>????@A@@@@?=====<;<<::;;::::::998776655433331456653300029@HQY]begefb_YTOHFFFHKLPQTY\afkmpnleYL>1,+++*))(('&&&&%%%%%%$$"""#####"$$$$%&&&&&''(((***+,.----//001249<AFKPUY\cginnrtvxz{|{wtrmjgfdccb`^YVOH@82-,,,,,,------..----....--...,+*))))))),/5>KYensuutuvwyyxtj_UMHFGFEC@:51024=JZgv~„†„€€‚‚€yqaN>30139>BHNSZ_hqvxyxsnh\L>4-()*)))**+++,--...//014=TNQOKQLBM]jv||{yxvvvvtqnh_RF>:7665533111100002467:=@BEHJMPSUY[^`eilrx~‚‡Š‹‹Š‡‡…ƒ‚€~{wtpjd^]XZ[[]`bdeiillnpqqrrvvvvttstsrrrtuttusokf^XPF@;8653238@KValsvwvx{~‚†ˆ‹‹‹Š‰ˆˆˆ‰ŠŠ‡„xohec`__`cefjnrsuttuvwyyywuqle^]]^`fnv|‚ˆ‹ŒŒŠ‹ŠŠ‹‹‰‡|wplosy{{xxwvvxxwwxxutqpoqsu66554444444455555555665566899:::;;;=====??????????>><;<<=;=;;;::::::99887654543211/..0110--.,+,.58AJQY\]aaa\UMC:556878:;AFKQYcjlrvtmcUJ:1-.,+*))'&&&&&&&%%%$$$##""########$%%%&&'''(((**+,,----./001348?BHNQY]acfjmrsvwz||yzzvrnljeddbba]YRMIA:3-+,,,,------........//./012210--*)))))),/3;IWcmrutttvvx{wuoeWMIGFEC@=72-,.28EUbq|‚…ƒ€€‚‚{vjYH:778>BGKOSZbjqw{yxtnh]M>3,))))****,,*,....0/0023ORY\RPRTKA[kuz|zywvwwvurmg^QF>97665432221100111345:=>ADGILPSUWY^_cfjqw~ƒ‡‰‹‹Šˆ…„‚€€}{xtojea__]^abdehijknprtuvwvxxwvvvttrrrstuvvwutrmi`\SHA:743126@LWbltxwvxz‚†ŠŒ‹‰ˆˆˆ‰ŠŠŠˆƒ~woib`_^`bdghlprttuuwyzzyzwtnic^]]_chqx„ˆŒŒŒŠŒ‹‹Œ‹‰…yrmkotxzzwvuvvxxxvxyvurpqutt6655444444445555555566668899::::;;;===>>??????>>>>==<;;;<<<;::::::::99886644442211/.....,,+,++,.04:DINRVYYXRI>40..-,+,.027?GPZcjquwskaUH<751/+)(&&&&&&&&%%%$$$##""########$%%%%&'''(()**+,----.//02358=DKNS[^cfhlnotwxz|{}yxwsplihecb`]ZXRKF?92-++,,,,------..//....///0124443.-,+**))),-2:FSaksutttuuwyzxoe]QKGFDB>:50,**06AR_my……‚€€€‚„‚~woaSC<;>BGKNSW\djqw{zyvqj^O?3,*())****,,,-,,...01123?bocRJKHPSaluz|zywvwwvurnh^QF>976654322211001113457:=>CEGKMPSWW[\_djpxƒˆ‰ŠŠˆ†„‚€~}zxtoieaa_`aacdfiikmmnqtwvxxzzyxxxutrrrsuvyyzzyvsphbZQJA;86538@LYdntwyxz{€ƒ‡‹ŽŽŒŠ‰Š‰ŠŠŠ‰ˆƒ~wngbba`_adgimqtttuuwy{{yxvrmfa^]]`cjt|†‹ŒŒ‹ŠŒŒŒ‹‰…zqllotxzzwvuvwxxxvxyxurprvvu65554444555555555555557788:::;;;<<==><=???>>>>>>>===;;;;::;::9::9:;988976554321100//..-,++++++**+/5;AGLLONJC93-*))******+.4<FOZcmrwusj`RMD=:53-*(&&&&''&&%$#$$#"#"#####$$$$$$$%%&&''()))+,--..///0258<AJPT[_cgjmprsuwwz||yxwqonkgd`b^[XSOKD=61.-,,,,----.-..//./....//022446540/--,,*))*,09BP\gpttttttvxzyqi_VLGFC@<83.+().5?LZiv……ƒ€€‚ƒ„‚}tk[LCACGJNQSV\cirw{zzwqi^PA4.******++,,....//..0022MnaAKHJAMU`mv||{xvvwwvvtoh^QG?:855554411220011133556;>AEEHJMPTVW\]bhow}ƒ†ˆ‰ˆ…ƒ‚€~~}{yvrmhdbbcbacddfghklnoqsvxxyz{}yyxusrrrsuw{~||z}|xqkcZRIA:6448AMXdosvzyy~…ˆŽŽŒ‹Š‹‹‹‹‹Šˆ…wmfb^]\]_cfinrstuuuvxyyzwtpld_]^^cgow|…ŠŒŒŠŠŒŒŒ‰„wpkipuwyywwwwxwwxvxzywsopruu65554433555555444466668889:::;;;<<<<>=>???>>=====<<<::::<8::;999899988765544220/....--,+******))**-4:=@CA@:4,+*)****))))),.2;GP[eluvtqiaZROJE@:3,(''*++*(&%$$$#""######$$$$$$$%%&&''())*+,--./000148;BGMTZ`deknqqtwwxy{yvtspmkhhdb_]XURMGB;51---,,,,----....///.0000//1135456520.-,,,**,-18BMZensuttttvxywrj_VLGEB>951-)(),3:FVdr}„ƒ€€„„{qbUMHIKMOQSX\cgptvwwwsmbSE>;,*++**++--...../..0246VcJBJGKIHW`mv||{zwwxxwvtoh_RH@:8555544442201111333568;>ADFIKNQSUX\bhpw}ƒˆˆˆ†…‚€~}{|ytplgcbcccc`cdefhijmopqrtwy{||zzxusrrrsvy{~}~€|yrkdZRH?7248AMZfovxyy{…ˆŽŽŒ‹Š‹‹‹‹‹Šˆ…wngb^\[]_bejorsvvuvxz|{xwsnha^\\^bhpw€†‹Œ‹Š‹Œ‹ŠŒ‰ƒ~tljjotwyywwwvwvvwxz{ywtstuvw556677555556766677777788:::::;;;==<===>>>>==<<<<<<;;;;;;99<;::888777655555223///.,----++))))*)(()(),1569840,*(((****))))))+-39EP[equvurlgb^YQMF>80,-23322-'%$$##########$$%%%%%''&(())*+,---.//0147:?FMSZ^dgjlnpqrvwwwusromkifb_\[XTRNHD?730----,,----../-.0/../111122224467641/----++++.15>JUdlrttsssvwxwslaWLFBA<83/,)''*28CRaoz€ƒ‚‚€€„…‚}wl_UONONQRUX[`fjrwwwwtmbTINJ-)))**++---...////016QlG7<9?IIJVamw{|{yxwyxwvuqlaRG@<96655433333111133443689<>AEGJMNPRT[`hqy~ƒ‡ˆˆ‡†„€}|zyvrnieba`aaaaab`abdegghjnrsuxzzzxvtrrrrtvwy{z~‚„„‚~{qkbZQE<549DP[fpwyyyz~‚†‰ŒŒ‹ŠŠŒŒ‹ŠŠ‡ypje\[ZZ\`djnsuuvvxyz{{xvqkd_[YYZ`hs{‚ˆŒŽ‹‹‹Œ‹‹ŒŒ‰ƒ}skhjnsxyxwwuuvwxvx{{zwstuuvx666677556666766677777788:::::;<<==<===>>>>==<<<<;;:::::::999998887776555543210/..,,,,,++*)))))(())(*,-00-*))(())))))(())))*+-28CP\ipuwutpllfa[TKE?:;?@A??71,%$##########$$%%%%%'''((***+,-...//037:>CJPW^cfklmopstttsrpnkifda]\ZXSPMID@;62/.----,,----.../0////011112222335652//..--,,,,-03;GS`jrtsrsstvwwslbXNF@?950,,)'').6?L[iu}‚‚‚€~ƒ„ƒ€}sg]UOOPUUWZ\^cglrvvvsk_RPGB/*****++----../////25a†]98IQOOKUclx}~}yxxxxzxuqlbTG@<966554333332246887755679<>ADFHJLNPX^gov~ƒ‡ˆˆ…„‚€~~}{ywvsmgda`^]^]\Z[Z[Z\]`cbdfimquvwwtsqqrrrtvvxzx|~ƒ„‚~zrjaYOE<9;FQ]hqxzzz}€„‡ŠŒŒ‹ŠŠŒŒ‹Šˆ…‚ztlf^XWY[bhmrtttuvxyz{yutnh`[ZYX[bkt|ƒˆŒŒ‹ŠŠŠ‰‹Œ‹ˆ‚{rliknsyyxwvwvutuvx{{zwtsuvuw77757755776676558867889989::9<==;>>?<<====<<==;;:999999999988898965555332322/..,-,,++*****))(('(('&'(())''(('())('))((((((((*.4=GS^hrwyvuuspnhb]VQNOPQSSOHA7,%#!""$$###$%%%%&&'''''()*,,,-..011258=BIOV\afikmoprutrqniiffc]ZYVTPLJGEB>820...-------------.001111334422211344220000.-,.---/39EP_gqtssrstvvusndYNEA=84.++)'').3:GWgpz‚ƒƒ€}~ƒ„ƒzoe\VTSUVXZY[\ciosvutmaXS7>7+,,++,,+,--../000136UwgIJITTQOYdpx}}|yyxzyzyyslcUG@<96644432213469=<=<<;86579<=@CDFIJPU]gryƒ‡‡‡…ƒ€~}{zxvvpleb^\YYUVUTSSSSRTTUXZ]afknnqqqrrrrrrrsssuxxz}‚„‚€xribVKB>?JS_jqy{{z~€…‰ŒŽŒ‹‹‹ŒŒŒŒŒˆƒ}wpg`]Y\^cjpsuttuwxz{zwsqjd]YWWW\dmw~†‹ŒŒ‹‹ŠŠŠ‹‹Œ‹ˆ‚{pkikmsyyxwuuvvwwvw{{{vtsvutt776777667777666677778899:9;;:;;;:;;<>>====<<;;;;999999998888888877664422120/..-+,,+++**)**))(('(('&'(('''''''())('))((((''(((+.6=HR]hrvyxxwutqnhfa`acdffd[SH:+$$""#####$%%%%&&''''())*,,,-./11147:AFMSY`dgjlnpqssolhfc`\\YURNKHEEA><750/.-..------------.0111121334443322452221110/-....-/28CP\gorssrrrtttrmdYNE@<72.+)('''+17AQ`lw€ƒƒ€}~ƒ„…ƒ~uh`YWVWWWWUWX^fmtuurhZXL7@:,,,++,,+,,-../00022>X_\TWC@NUUXfpx}}|yyxz{zyyslcUI@:866444333389<CFEFEDB>:7778;<=@CGJPY`iry…ˆ‡†ƒ€€~{zzxvtnic_YTSPNMLJIJKLLLLMPQTX]ehknqpqqqprrrrrqqqruvz~€‚‚|xpg[TIABKT`krwyy{}€…‰ŒŽŒ‹‹‹ŒŒŒ‹‹‰…{tme`^^afkpsutuwxzyzxurnf`ZVWUX]eowˆŠŒ‹‹ŠŠ‹ŒŒ‹Š†wohgjmsyyxwvuvvvvwy{{zvrrttss7768988869887777667878::::;;;;<<<<<<<<<=<<<<<<::9988998888887777555521111110---,+***))))))((''''('''''''&&''''(((())))''''(('(,24>GQ[cjosvvuttssopoqruvvrjeWI9)"!!""$$$%$$%%&&&&'()*+,,,,-/012369=CIOV\afilnopsqlkfb\ZVRPLJHGCA=:9842/....------....----00012233555555445544322210////-..028BMXeosrqqqqstsqmeZOE>;60,''((')+.5?LZft|ƒ‚€}~ƒ……†€ynf]YXXWURRPV\bjrvuraXY@6<2,+,,-------../01003;[f^Z`[;HTXVhpz}}{yxxyyyyztmcUJ@96545543246;?EJNPPROKD>967779<>AFKRZclsy…‡††„€}||zxuqmg_YSPMGFFEDEDDDEFGGIJMRY^dgjloqrrsrrronkklmmoqv|€{tlb[PJFNWblsy{{}‚†ŠŽŽŒ‹‹Œ‹‹‹ŒŠ…‚}vqjfeefmpstuuwxyyyzwsnhb]WRSSX]goy‚‰‹Œ‹‹‹‹‹‹ŒŒ‰†wlefiouyywvuuvvvvuwzzzvtrqqqp888899997:889977668878::::;;;;<<<<<<<<<<<<<<::::88888877778757745555111100.--,,,+**))(('((''&&&&'&''''''&&''''((((((''''''(('(*+05=GNT]cfilnqrtuwxz|~……zsfVF5(!!""$$$%$$%%&&&&()*),----/002358;AFLSY`ehjlmnoqnhc\YTPNHDA?><;8764200///..------....0000011123345555555566444322000/0/-/.028@LVcorrqropqrqqmeZOE=84/+(()(()+-3:EVdpz€‚€}|}‚†‡†€{qi`[XWUQQOLOT^irutvbQK?882.,,--------.//000125Mk_WdV8;PWWdqz}}{yxxyyy{ytmcUJ@:7755554459@GMSX[\[YUNB;85667:>@FOV]fnv}‚†‡†„ƒ€~~~||zxuqke^TLGCABBAABAAAABCCDFKPW]`cjmqppqqrttplieebbfhntz€}yog_WPOQYbltz{{}„ˆ‰ŽŽŒ‹‹ŒŒ‹‹‰ˆƒ~zuqkkjkpsuuvvxxyzzyurlf^URPRRW]hr|„‰ŒŒ‹‹‹‹‹‹ŒŒŠ…~wmecjpvyywuuuvvvvuvxxxvsrpqpn9999999999888877877789::::::;<<<<<<<==<;<<;:::887776777777667546545311200/.-,+++**))''''&&(((())&%%&''''&&''''''''''''''''&('''')+4;BHNRXZ]bdhnuw}€„†ˆ‹ˆ†‚|reUG5&#!"$$$$$$%%%%'(****,-../011358;=BGNV\beiklooomia\TNHEA?=<96534321////----..........//00112333455566775566554433220011../137>JT`kpqroonpqppme[PC;51-*''()()*,/7BP_lw‚~}}ƒƒ……~umc^ZUQMIGGHP[jqvtkRBKNF>60,,--,,----/0//10/25H[[[i[76PTVdrz~zyyyyzzxxsmdUJ@:75564446;@HPX^bghfb_VKB964358@FKSZdkry€„‡ˆ…„‚€}|~}zxvrjbZMGC>?>>@?@@@???A@CCGNT[afimoqrqqssqpje]YUVZ]ckswz}{rld[XUY^gouz}}~„‡ŠŽ‘‘ŒŒŒŽ‹Š‡…|{{xxtpqqtuvvvwwy{zywtoic[TPOOPU\gq~…‹ŒŒ‹‹‹‹ŒŒ‰„~skffkqwzywtuvvvuuuvwwwsqnnnpn9999999999888877887789::::::;<<<<<<<==<;::::997766666566765555655431110//..,,****)(''''&&&''''((&%%&''''&&''''''''''''''''('''&&%(*059<CDHKOT\dnv|€„‡‰ŠŠ‰…ƒ|ocRA.$"#$$$$$$%%&&'(*+++--../013467;?DJQX^dgjlonmmh`ZPJCA=:86544311200////----..........//00123344556677777777665533321000///137=HS_jpsspnmnorolg\QE:4/+)('()()*+/5<JZgs|~|||€‚„„ƒ~xpg_YTPHECCGPZfptfM>D\\M?60,,--,,----.///00.2=RY^cdTIQQOVgqz~~zyyyyzzywsmfXKA:75543448=ENU^flqrple]PE<6538<BKPV`hou}…†‡†ƒ€~}~~|zvrjbVMFA?=>=?<>==><=?>?CGNT[aeioppqpqsqqoic[QJHMTZckquzyvoia]\]bgov{{{„†ˆ‹‘ŽŒŒŒŒ‹ˆ‡„zyzz{{zxvxwwwwwxyx{zywsmf_WPPNLOU^it~†Œ‹‹‹‹ŒŒ‰zriffjqwzxwuuvvvuuuvwwvrpmnmkj888899999987887788889:::::::;<<<<<<<<<;:::::987766665455556566555211000/.-++**)*)))('&&%&%%%&&%%&%%&''''&&&&''''''''''&&&&(&%%&%%%%'*/11238@IPYcjsz€‚„……ˆ††‚xo]L8'##$$$$$$$%(((*))*+--/.0013578=AGOUZaehknolljc\TIC=96654444312200000/-----...//....//1112334455667777777766554333021100//48;ER^iprqnmkmnrpmh]QE:3.+)(&())*+*.2;FVeqz€‚~|z{~ƒ„ƒzrj\VPKB?==DMXfphI7B^i`QD80-.--,,..---./0./13A]]baUSYXSPYdq{~}{yxyzzzywtneWKA;8444446;AJT]fotyyzsj`UG=747;BJPV_fosz€ƒ††…ƒƒ~~}}||}{wqh_UJB?><<<=<>=;;<==?@DGNV[agjlnnoqqrrplg_WKC<?GQYahmuuvqkgdbadjry}~|‚†ˆ‘ŽŒ‹‹‹‰‡ƒ€}{{}{}}}{{zzzyyxyzz|{zuoiaZSNLJLOU_kv€‡Œ‹‹‹ŒŒŽŒ‰zqhdejrwzxvuuuvvvvuvwwwsoolljh99999999998788778888::::::::;<<<<<<<<<;:::9987776666445544553334521100.---*++*()))((&&''&%%%&&%%&%%&''''&&&&''''''''''&&&&''%%&%%%$$&())*)*0<CKT]flrvyz|‚ƒ†…~tdS?*!!$$$$$$%&((()*+,,-../0013689>DJRX]bgjmnmmjd]ULB9874433333311100000/-----...//..../011233355557788777777765554322110110048;CNZioqqnllompqog^SG;2-*)(()))++*,39BP_lv}|zz{~‚‚{vj[SLE?:9:AKWbpkN9LjocRE90-...--....-./00123FbibSMjbRUSWfr{~}{yxxyyyzwtneWKA:7443346<BMVblu{€}ulbUI<77;BHOV]flsy‚…††ƒ}}~|}~}{wqh_TJC?=<;;;<<;;;<<<<=BGNV[`fkkmpqpqromje\RJ?76=EPX`flswrmiifgimtz}~„‡‰‘ŽŒ‹‹Šˆ„€{ywsuw|}~{{zzxyzz|{ytmg]VNHIHIOU`mw‚ŠŒ‹‹ŒŒŒ‹‡xmebhlrwxywvvvvvvvuvwwvsomhhge:::::::9998777778888:99999;;::::;;<<<<:;:;99887765555455544443343201/---+,*)((''&&'&'&%$%%%%%%%%&&%%&&''&&&&&&&'&&''''''&&%'&&&&$$%%%%%&%&'+05?FNTZaeilpx~…†„yiXD-"$####$%&'())*++-,-../012469>AIRV\bfhknnnmg`XPF;7444443333212100000/....-.--//..001111334555579999999988776655442211111148;@LWdmpponkmnnqold\NA5-))*)*))**+,18=KZht{~~}zyy|~€€}wj_RHA<557?IT`jqJ?auqgVG<4/.,,....--./00003;Zz{eHN\\HIRYdqz|yxvxxyyxuoeXJ@84332137<EPZdpy„ƒ~umaUI?<>AHPW_emrx}ƒ…‡‡†‚~~}}~~~~|wqj_SI@;<;:999<<;;;;<9=AGOV]cilnoooononmgb[OG:304;ENV`fnqsojjkloru{}~‚…ˆŠŽŽŒŠ‹ŠŠˆƒ|vrniltx}~€|{{{{{{}{xqkd\TLHFFIMWdp|…‹ŽŽ‹‹‹‹ŒŒŒˆ„~ukcaglrwyywuuuuuvtvwvvuqnkjheb::::;;:99987777788889:99::;;;;::;;;;;;:9:8776676555444544444432221/0/.,,,*(((('''&'&'&$$%%%%%%%%$$%%&&&&&&&&&&&'&&''''''&&%'&&&&$$%%%%%$%$&&&*09@EJMNSZbny‚†„ym\D-$#####$%&'())***,---/0/1369<BGLTY^egjlnnmgc\UJB;7444443333212100000/....----....001112334555679999::::98877665442222111348;@KValpponlnnnppmg_RC6.***)*****)*/6;IXery~}zxxz}|wl_RF=6148=FR^kd=BgvofXJ=5.,++,...--.//../0Cn{v^ONYT>NYcer{~}{yxvxyzyxuodWJ@84311248@HP\gs|‚„ƒ~ul`THAAFIOW[cjpx}ƒ†‰‰‡„‚~~}{|~~~~{wqh^PH@;:99999::99999:=AHPY^dilnooonnomjdaWOB61./3;FQ[cjnqroonprtw{~~€ƒ‡ŒŽŽŠŠ‹Š‰†zrkebemrx|~€€||{{{{{}{vniaXOICDEGMXfr}‡ŒŽŽ‹‹ŠŒŒŒŒ‰ƒ|qjbbgltyyywuuuuuuuwwvtspmkifeb;;;;;;;;::9887888888:8999::::9:::999;:888877765454445444234441220//0.-++**)((((('&'&%&&%&&%%%%%%$$$%&&''''&&%%&'%%&&&&&&&&&&&&&&%%%%$$%%$$$$$$',158;=CKWiv€…„zn[C,##$$$$$%&'())*,,,---/0/136:>DKQX\afjjjnmid`XOF>96545444444333321000///.-----...0001133445567789988999998877665443322322136=BIT_iqrpnkmooprpkcWI<0+++))*++,+-/6;GVbnw}~{xxz}~€€~yobSD82036<EQ]jaDFowrh]L@5/---,,--....-.02<_klrXGNNZSQRgjt|~~{yxwwyzxwuogYJ@84211249=GR_jwƒ„ƒ~uk`TLGEIPVZ`gnv|‡ŠŠˆ†~~||||~{wqi^PF?986857777787768<BGQZ_gimnmmnmmnjgc[RH=6.+-05=FS\eloqqqqtuxz|~}€ƒ…‰ŠŽŽŽŒ‹Š‹Šˆƒ~wla\Y^fksy~€~}|||}|||yslf\SJEBABFO[ht‰ŽŽ‹‹‹‹‹ŒŒŒŠ†€{pfacfkszyxwuttvvvvvvuspnjhgea^;;;;::;;::987888888899999::;9:;;9999:877756666434465444323444111/.-.-,++**)(('(('&&&%&&%&&%%%%%%$$$%&&''''&&%%&'&&&&&&&&&&&&&&&&%%%%$$$$####"""$&',./6BQds„ƒylX>)##$$$$$%&'())*,,,--.001369?DJNU[_ffgknnlhcZSJC<665554444443333210000//.-----...0001133355556789999999998767665543322231247<AIR]fnrpnlnooprrlf[M?4,,)+)*+++*,05<FUalv}~{xxy|}~{reSB72036:DO[g[ERutoj_NA6/-+++,--......03KjjulLGFHMLNRons{}~{yxwwwyxwtngYJ@84212239>HUbmy€„…‚~uk`TLHMSXY\dmt{…‰‰Š‡„€€~~~||}{~{vpg\PD=;76667777767767>CJSY_fjmomnmmnmkf_YPE:2.++-18ALVajmtttuxy{}~€‚„ˆŒŒŒ‹Š‹Š‡{sg[SPX`kqvz~~}}}}}||zwrkcZQGB??CHQ]jw‚‰‹Œ‹‹‹ŒŒŒŠ†€xnf_bgltxyxvtttuuuuuuuspnjhfda];;;:::;;:9987788889998999;;;::::99988877655554555544333323554100....,+++**)'''''&&&%&%%$$%%%$$$$$%&%%&')'&&&''''''''&&''''&&%%%%#%$$$$####""#"$$#%&',4>N`q}„‚ykW<'##$$$$%&'()**+++,,.12249=BFKQT[adghimnlif`WNG?8766544444442222110000///.------.0001123455557779999::9999888866554433332458=BIQZckpqommooqrvqjbQC6.))+*+**,+.3:?GS`js|€}yyx{|~€€{sgWF:3149:BNYeTK^ztqk`PC70,,,+,,,----.0/3Rqzw_FEL>>LUUeiq|~{yxwwxxyxuofYJ@9412114;AIWcoz„‡‡„xm`UQQSVX[agpw}…ˆ‰‰ˆ…ƒ~~~}{{}~~}|upf[OB<864456766554457;BKSZ`gjllmmlkmlic]VMA8/,**,06?JT^imsvwwz{~~€€€‚…ˆ‹ŒŒŒ‹‹ŠŠ‡€zpeXKJP\dkrw{}~~~}}}{{xuog^XMD?==@GS_l{„‹Ž‹‹‹ŠŒŒŒ‹‰…uld`chntxxwtssssssuuttqpnjfec`[;;:;::;;:98777888888899989;;::99::8988664455544444333322222221//--,,+****)('''''&%&%&%$$$%%%$$$$$%%'(++--+('('''''''%%&&&&$$$%%%%$$$$$####""#"###$%&+1>M_p}„‚ykW>'##%%$$%&'()**+,,-./0259?DHMQV[]deijkjjjic[SJA97566544444442222221/000.--------.0001123456657778999::999999776655443333346:>CIQ[dkpqonnoqstvtnfZJ<0****+*+,/26<BKT`kt|€~zxx{|~€€|vl[K=5025:BMWdPSgvurmcSD;2-,,+,,,--,--.08lzuubNED>EQQTffq|}{yxwwxxyxtneXJ@9401/15;CMYfr~†‡‡†‚|pdYVVXZ\]dirx~…ˆ‰‰‡ƒ~~~|||}~~|ytof[OC:644444555444457<DMU\bhkllmmlkiifa[TI@30+))+04:EP\fmrvy{|€‚‚‚ƒƒ…‰‹ŽŽŒŠ‰ŠŠŠˆ†xmcUJJNWahpwz}~~}~~~|{ytle^RHA<:>BKWco|†‹ŒŒ‹Œ‹ŒŒŠˆƒ|ujb`chntxwuttsrrrsttsqromjfc`][;::;;;;;9:877788877788889:::::989987776655433333443333221100//.-,+**+++*((''''&&&%%&%%%$$$$$#$$$$%&',03442-+)()))&&&%%$$$$$$#%$$&$####$#$##""#""! $')/:J\my…zkXA)"$#$%%&'()))*+*,.-0259AEJNSV]_cdfhkkkkjf_VMD>86565544433332222110../0.------...0001112346667889989::::9999776665553333567:?DIQZcjoqponqrstvuqkaQB4**++,+.036;AEMValu}‚€~z{{|€~yoaOA71148ALWdLLjvvqleVF;2-++*+,,--,-,00IzrUK^]TPWLMQPiir~}{zywyyyyxtnfXJ?8411/27?FP[hv…‡‹‰†rg]XXY\]`elrz€„ˆ‰‰†ƒ€~}~|~~}~€|yuoeYMA9522232233443348=ENV]ejkmmmnllkie^ZPE:2+))*,/38EO[cjrwy}~€‚ƒ„„„„†‰ŒŒŒŠ‰‰‰‰†…~uj`VKGMT^irx{}~}}{zwqld[OD=::;BLWgs‡‹ŒŒ‹‹‹‹‹‹‹ŠŠˆ}sga^bgotvwurnqqrrssssrqnljfa^[Y;::;;;;;:9877788787788889::::9778877776544333333222211111100//.-,+*****)((''''&&&%%&%$%$$$$$#$$$%$&'+05:=9722100.,(&$$##$$$$#%$$%#####$###"#"#"""!"%(/9GVjy„|n]J1$%#$%%&'()))*+,-.036:@FKOSX\_acfjkkkjjic\SJB;64655544433333333110/.//-------...0001112345677889989:::::988877665553355668<@EIQXaiprrpoqrstvvtneWF8.-.,+.157;@DJQX`js}ƒƒ|{{z}‚‚€{reUD82148AITcKFivvrlfWH=2-,,*+,,-----1DtwmZ8OOMSWQRROcjs}€}{zyxwyyyxuneVI>843125;AIS^lx‚‰Š‹Š†th`[[\]]bflrv|…††„‚~}}|||}~}zxtndZNA9521112211111149>GPY`gjmmmmmllkhc]WMB7/*)))+/3:FO[cipv{~€ƒ†…†ƒ„„†‡ŠŒŒŒŠ‰‰‰‰†…}vl`SKJMT^hpv{}~}}|{zvpjbVKC=::;BNZiu‰‹Œ‹Œ‹‹‹‹‹‹‹‰†€xpe`^bhntvvtrpqqqqrrrrqpmjgca^ZX;9;::;;;::89878788877899999888887766665522221111222210000/00//..,+**))))))'&%%''%%&&%%%$$$##%%$$##$&+.37;;:6777765/*%$$$$$$$####"#####""""""""!!!!#$)-6BRcs~‚~scP8'&$$'''(((**++,./25=CHMQTY]_bdhkkjmkhie^VLD?97665566553333332211///..-------../10011123455678899899999987899764434345676:>@FKPX`iqstrppqsuvxvpg\K;2----169=BEJMT[ajs|„……€~{z}~‚€xk[J;3347>ISaJJjvtrofXI<4-,,*+,,-----.KxzqJ7UNLIMSMRWchr{€~{zyxxyyywtmeYK=752548=ELXcp|†ŒŠ†}tib^\]]_aejpvyƒ…„„ƒ}}}}}~}~}yxumcYK?7321000000000/6:@GQYahmlmmmmlkie`ZUK?5-+++**.4?IS\cjqu{„††„ƒ„„†‡ŠŒ‹‹Š‰‰ˆ‰‰ˆ…~vl_RJKQVajqy|~~~|||{xsne\QG?:89=DO_lyƒŠ‹‹‹‹‹‹ŒŒŒ‹Š‰„}vlc^^bgnuutsrqppppqqqqomkgfc`\WV;9;:9:;;99998777888778889998886677665543222211112111100/0///..--+,**))))('%%%%&&%%&&%%%$$$########$%(*.166456699872-'$$$$$$$####"#####""""""""!!  !#&+2<M]o{‚vfU=*&%'+-,())**++-/26<BIMSU[^_befhjjjiigc_XOF@965665566553333332211///..-------../1001112345567887789999998789976653554568:<@CGKPU`hosttqppsuvxwslaP@6/..18<?BEJPRW]cks{ƒ…„€v{‚xo`O>5347>GR^IHlvtsofXJ=4-,,*+,,------;`pjQ8[WNLPYUMTc`fv}~}zyxxyyywtofXK@96689>ELS]ht~‡ŒŽŠ„|rhc`_^]]^`djov}ƒ„‚~}}}~~~}}yvrmcYK?731000....../04:BKSZcjmlllmmlkic]WPE<3-+),+-09BLU]cjrv{ƒ…††„ƒ„„†‡ŠŒŠŠ‰ˆˆ†ˆ‡‡„}vl_RNNSZbksy|~~}~}||{wrkf\QG<888=FSco{…Š‹‹‹‹‹‹ŒŒŒ‹Š‰…|sic^^biovvtspopqqqqqqqomjgdb^ZWW::<<::::;9::9887888888889977765555445543222211222200//////./.--,++*)('''''%%%%%##%%%$$$$%%#"######$$%'(*++-///26661.(%##""""####$$#""""""""!!!"""""#%)0:JZkx€wi[F/&%*/23,)))*+,-28;AGKQUZ^`cdfhiiiigfdaYPHA<764555555554433322200//.-.-------..0011112325666788888899889888887775445567:<=AEJMQX_gouuusrrtvtvwsndUG:1027<@EHMPTX[_diq{‚‰†ƒ~s^j|€yz€|seTD8336<FP_JGkvsqnfXK>5.,,)*,,,,,,-+2LenaPn|iQO^^NLa^Vk‚|zyyyyyxxvofYJ?;;=ACHLTZbmx†‹ŒŒ‰ƒznga`_]ZXY\bipw}„‚~|}}|}~~~~}{ztqkcWI=630/...---,,-/5<CLU]djmklkllmjhe]WOD91,**,+/5@HRX^ckrw}€…††…ƒƒ„†‡ŠŒŒŠŠˆˆ‡‡ˆ‡‡ƒ|vl`SQRU[elty}~}|}|||{wpibXMA9688>FXdq~‡ŠŠŠ‹‹ŒŒŒŒŒŒ‹ˆ‚{qf`\^cjrvwtsqpqrrrssqoljlge^\ZYY::<<::;;;99988878888888888777655443344332111112222/////.///..--,++)*('''''''''%##%%$$$$$%%#"######$$$$$&&&')**+///+)&%##""""####$$#"""""""! !!"""""#%)/8EWftznaP6)).59;3*))*+.16;@FLQVZ\adcfihhiihgc_YRKB<7655555555554433322200//...---..--..0011112325666688889977899888777765655668:=ADHILQW_emtwusssrttvvtphYJ>859<ADINRVY\_dhlu|‚ˆ†‚wnky~|p{‚}ujXI:337=EO^KHarsrnfZK>5.,,+,,,,,,,,,-4FSkkuteb`aZNBSfkz}{zyyyyyxxsmf\PDCACGJNRZajr|„‰‹Œ‰ˆuic_\ZURSTX`fnwƒƒ~|}{{}~~~~~|yvuqkbVI=63/.---,,,+++/4<CMW_gjmnlklllieb]WOD91,+++/5?GMU\diotx}~„††…ƒƒ„†‡ŠŒŒŒ‰‰ˆ‡‡ˆˆˆƒ|vlaUQSZ`gov{~~}|{}}|{upiaTI=7669?J\ju‰ŠŠŠ‹‹ŒŒŒŒŒŒ‹†ynd[[^ciqvwsrqqrrrrssrokjhfb]\]^^::::;;;;:99877878877887787776643333322221111110011000///.,..,,,,*))))'&&''&&%%$$%%$$$$$$$$#########$$$%%&&%%&&'%(*''%$""""""""""""##!!""""      !!!"$'+4>Qboy€|sgWB-)1;?A7,**,-169=CJQVX^bfeggjhiihfa]VOLD<97754545566444443221100//...-------../01111233456667766889989887766665666676:=@CEIJMQW\emsvwuspssssuuqj_PC<<>AEJNRX[^aegkpvz€†…xwujfqf[hszyo^M=4249CP[PO_qsrkeZK>6/,*++++++,,--+++8YrlgdpdWVTS]hu{}{{zyzyxxxvoi_UMJJLMPTYahov~†Š‹Š‡‚zre]ZVRMJMOS]fr|€ƒ~|||}~~~~}~{xxupibTI>52.----,++++*05>GOYahknlmkkkljgcZULB8/+++04=GNV]binswy|‚„‡‡…‚ƒ„†Š‹Œ‹‹Š‰‡†‡ˆˆ‡ƒ|ulaVRU\biqx|~~~~}~~}xume^RE:6648AM\ly‚Š‹‹‹ŠŠ‹ŒŒŒ‹ˆƒ~vl`YY^elsvwusqrqqrrrrrolhgc`\\^`b;;::;;;;:98777878877777787775433111111110000001100.-////--.+,,,,)()'''&&&&&&%%$$$$$$$$$$$$##########$$%%%%$$%%$##%&%$#""""""""""""""!!  !!        !"#$)/9K]lw~tk\J3),4<?4))*,/38<CGNSX\adfghhhjigda[VOHD>955655545544444443221100//.-.-------../0111123344566776677887788776666655688:=@BEEILMQVZdlswwvtrrrrtssqlbWNEBDJMQU[_dfikpsvz}€ƒ‚vut|dPD?@D^^XohJ8049?KZNM^lrrmeZK>6/,*++++++,,,,,,+5M]chkcDHMLS`ir{}{yywxyyyxuqkc\XRQPTV[`fnu|‚ˆ‹‹Š†xmcYSLHDBEMU^iv}‚ƒ~||}}~~}|{xwtpibTI>52----,,++++,19@HP[bhlmkllkkkieaXSJ@5/*+-3;EPU]ciorwz||‚„††…‚ƒ„†Š‹Œ‹‹‰ˆ‡†‡ˆˆ‡ƒ|ui^WUX_fmty}~~|}}}||xukf\PB84459DP_o{…Š‹‹‹‹‹‹‹ŒŒŒŠˆƒ}uh^YY^elswwusrrqqssssrolheb^^^_bd<;;;::::98988677887766776566421111110000/11100////00/.--,,-,,+,,))('&&%%&&%%%%%$"#########$$""""######$$$$$$$$$"""$$$#""""""""""""""!!          !"##'-5CVhs}{raR>.+/75/*+,.05;>DJPW\`cfiijjjiec_ZTOGB<765456544554445443222110/..---,--,,--...011112333555566777788898866666665679<=@CEFILKMOTYcltvwvtrrrrrrsqoh^TLHJOSY^bhknstvyz}€ƒ€mYZqhU[bi^PxVf`_T<:?YnbKGN_prleZK>5.-+,,,,,,,,,++,2;PVWbfQO]IELVeqz~~|xwxyz{{{yvphc^[YWZ^cgmry‡‰‹‹‰ƒvk_QLD=8;@MYeq{„„~~}€~}|{zxuupibTI=30--,,++**++-3:BJT\dhkjljjkjigc_XOF<3-)-2;FOV]djprvz{}~‚„††„„‚ƒ„†‰‹‹‹‹‰ˆ‡‡‡ˆ‰‡ƒ}vmbWSZaipx{}~~~}}}|}wuicWJ?62229DTbp}†Š‹‹‰‹Œ‹‹‹‹Š‡†zqh]WX_fmtvtutqrsrsstsqnkfca_`_adf<;;;::::988877768877666655443111111100000000//0///0/.---,,,++*))))(''%%%&&%%%%%$"######"##$$""""######$$$$$$$$"$#"$$###"""""""""""""!!         !!"##%)4@N`mz}ufYI5,+-,+*+-047>CGNUZ^bdgiijjjfa\VQJD@;7665663344554445442222110/..---,--,,--../01111233355456766778878876666666789==?BEHIKLMOPS[bkpuzyusqqqqsutsne[TPQUZ_ejqux€ƒ‡†„vX@PZRP@X`^dlNJA@GKh˜“rICLcsqkf[K>5.-+,,,,,,,,-/Hn}„†„tcfjV[JN\Xeqz|}{xwzzy{{{zxvoga_][_chmsx}„‡Š‹Š‡ƒ|uiZL@7339CP\hv}ƒ†„~~€€~}zyxxwspibTI=30--,,++**++-39CKT\djkkjjjihhea[VMB81,+07BKS]fjoty}~}}~„†‡…„‚ƒ…†‰‹‹‹‹ˆ†††‡ˆ‰‡ƒ}vj_XW]emqy{}~~~|}xrh^UH;3122;FXgs€‰Š‹Œ‹‹Œ‹‹‹‰ˆ†ƒ|tkc[WX_fmtvurqqqrrqrrqpmjeca`aadef;;;:::999877776655665556422221001100////..-----//...--+++++)))*)(('&&&&%%%$$$$$$$$$$$###########$$""####$$""##""########""""""""!!!!        !!""""$(.8GWgsz|xnaR>-*((**,-058>ELRY\`cdhijihd_YTNHB>976335444455553344332211000/....,,--.---../001202344555555556666887666447679:<>ABFHJJLNLNQQYbhptz{vtqqpprtvvqkd]XW[]djqw|ƒ‡‡‡‡ˆˆˆŠ‹Œ~jVQZVZ\cfib\EDLQD@LhwmYGZwsole[K=6/--,,,,,,++-/[~€vx}xiiwkRIV_Xdq|~~|yxwwy{{|{zwojeb`bdimry}†ˆ‰‹‰…‚{qeVF;404=HUamx……„€€}|{xxwwvrkbVJ=3.,,---,,+**/3:DNXaeiiiiiijieb\WQH>5.-/5>HT\dkov{~}|}~„„††„‚„‚…ˆ‹Œ‹Šˆ‡‡‡‡ˆ‰ˆ…~uj^Z\`hosy{}~~~|xph\SE80-,0<J\iw„ˆŠ‹‹ŠŠ‹‹ŠŠŠŠ†€yumbXTWahosvurprrsrqtsroliecccddefh<<;:::9988777766556655542222100///10////..----/./.----++++*+))))(('&&&&%%%$$$$$$$$$$############$$""####$$""##""##""""""!!!!!!!!!!!!        !!!"""#&*3?P_mv|zsj[M6,+*+,/046;AHMTY]adgjmkjd^ZRJEA>9554454444455553344332211000/..--,---..--.0/0012023335555555566667775656679;=>@ABEGIKLMMMOPSV^gnuzzxusqsssuwwtpjd_^`diou~ƒ‰‘ŒpVIIW_mrklnYGQCFGIIKTb^O[tnmic[L>6/,,,,,,,,+++,.>Yhpkfd_nkPO^^Tdpy~~|yxxxzz{|{yvojeccfimqvz}…‡ˆ‰‰…‚{qeTD8218BM[fr}„„„‚€€}|{xxwwvqlbVI<3.,,---,,+**.5<GNXafiiiiiiihe`\XOE92/04<DOYbinsy~€~}|}~„„††„‚ƒ„…ˆŠŒ‹Šˆ‡‡‡‡ˆ‰ˆ„~uka\_cipvz{}~|uph\O@5.++3>O_ly„‰Š‹ŠŠŠ‹‹ŠŠŠˆ…€yrk^VSXaipuvsrqrrrrssssolieddeffghg::;;;;99877766656655444200111110/0./..//..--------,,,,,+**(*)'&&((('%%&%&&%%$$##$$$$$$$$####"""###""##""""""###"""!!!!!!!!!!!!!!!!!!     !   !! !#$'.8GWfpz|wocTC2,--0136:@EKRUY]aeijjjhaYSLGB=:674445555444555433333321100//..--,,----..//./11111112445555554455555445568<<>@ABFIIJLMMNONOSX[ckrwxxtsrrqsvxxxuojfdehlqw€‡Š’‘’’‘””•“Š^;BX]Wgag}pVd\KDCGOU[VOUijnlcZL>70,,,,,,++,,,,6SKNVWaPIWQNXR[Xepz}}{xwxyzz{|{{xsjfcffjotwz}‚„‡‰‡…€zqdSC725<ER]jv‚„‚€€€€}|yvvxxvqldWI;2-++,,.-++),/6=GR\bfhihhiiige`ZTMC8127;DKV^ekrv|~~}{}„…†…‚‚„…†‰‹‹Š‰ˆ‡‡‡ˆ‰‰ˆ…~uk`Y_dkqw|~}~~{wodYL=4-+,5@Rap‡Š‹ŠŠŠŠŠŠ‰‰‰‡…yphZVSWaiortsooqqqrrrsrmkheffgiihge::;;;;9987776665552211210/121221221/..//..------++))+++)***)()(('''&%%%$&&%%$$##$$####$$####"""###""##""""""""""""!!!!!!!!!!!!!!!!!!     !   !! !"#%*2?O`jt}}wl\O@222568:?CGMQW[_bfhijgb[TMFA=:7654444444444444543333321100/...--..----..//./111111334444555544555545568:<=@BCDFHJJKLNNOONOSTY^hnuxwusrrqsvzzzwuojfijmt{ˆŽ‘‘“••–——–•‘u^VYP3]s‚|wj\TWRSMMYWQNU^fd`YMA7.,,,,,,++++*,2A]aPZ[Q]T:BEJT^eqz}|{xwxyyy{|{{vojfehhlpuux{|‚…‡‡…€zqdSC837>IVaoyƒ…‚€€€€€€~~}|yvvxxvqldWI;2-++,,-,+++-29AJT\bfhihhiiigd_YQJ@725=BJS\bhnsw{|}{zz{…††…ƒƒ„…†‰‹‹Š‰ˆ‡‡‡‰Š‹Š…~tia^`hlsy|~}~~{wodYJ;4-,/6CXdt€ˆ‹‹ŠŠŠŠŠŠ‰ˆ†‡…€xmeYURXajptrrqpqqstssrpmkjijjhhhfd^<<;;::998766665533331011021146674310//..--,,,+,,,,++**++)))'(())&&%%%%%#%%%%################""""$$""""""""####""!!!!!!!!!!!!    !!    !  !  "!!""#&,9EUcnx}zreYK;669;>>CHLRTX]adfhigc]UPJB=8766654344445544554433333211//......-------..../11001243334455554555443688:<>@BDEGGIJKLMNNOONPOQSYbjqyvttsrqsvy|}ywrmijinuz…‹Ž‘’˜™˜˜™š˜“ˆ„kSy€yob]LEV^YUQOMOPRYa\QC71--,,,,,+,,-*-5ZgWTaVcT:GLSX^hu|}}zzywwxz{{{xslgcccfiloruyy}……ƒ€zrdTE:58AN[gr{ƒƒ‚€~€€~{zyvvwxwslcVH;2-++++****+.4;FNV\cfghgghhhhd_WOG<59<BHPX_dinrvyywvxyz„…†…„ƒƒ…ˆ‹ŒŒŠŠ‰ˆ‰‰ŠŠ‹Š„}ujbabjpuz}}}~~€€€{vndWG:3,*0;HZjx‚ˆ‹‹Š‹‹ŠŠ‰ˆ‡„‡„vlbUQRYajqvursqppqrssqomllkljjhddaZ<;:::::8876655643321//001/1458;<:8531100....-+--,,++****))(''(((&&%%%%%$%%%%$$####$$########""""##""""""""####""!!!!!!!!             !!!!!""%%)2<IZhr{}vmcWG<;=?BDIMRVX]^beehhf`YSKF=976554664444455665544333333110///....-------..../110012243344444434445578;<<?ACDFFHIIJKLMNNOOOOPORV]dluxvtsrqsvwz}{ysnjjmqsv{€…ŠŽ‘’•—ššš˜˜”‘ˆ…|{|€€{sg\NGV[XZPLJMOLLY^VH=4.+,,,,,,,,,,-5E]\G[VWOFWVG>Pdmx~}zzyxwyzzzxuojdbbbbgkkosuxz}‚‚ypeTE96:CP^jv„…ƒ‚€~~~}{zyvwyxwslcVH;1+*********06=GOW_fhiggghhgfb]WOG?<@DIQX\bhllruvvsrswz}‚…‡†ƒ„„„‡ˆ‹Œ‹ŠŠŠ‹‹ŒŒ‹Š„~uk``flrxz|}}~~€~zskbSD81,+1;M_n{…Š‹Œ‹‹‹ŠŠ‰ˆˆ‡†|si^SPR[bjrttrrrrrrsttsqonlllljhf`[V;;99999876665343221///.//2278<>BB@=9554211/....---++*)))))((''('&&%%%%$$%%%%&&%%$$%%$$##########""""""""""""##""""!!!!!!        !!!!""#%&*3BN^ht}zsjbUGABCHLPTWZ]_bdefgeb\WOGB;85455556655445566555544442200000/..----..----///011011212222222423435678<=>ABDEEEHIHIKLLMOOMNONNMOPU^grvvtststtwy|}zuoljllmpsz„Š”•–˜š™—•‘‹„€|{{}~€{tk^RNUOPUVVMGKOSSTWRG;4+..-,,,---,..05:=QNQEDOPC>Pkgw|{xwwyyyzyxutlib[]^aeigmpquwy{~}wlbRF89=HTbny‚†„ƒ~~~}|{yxvxyxwslbVG90+))))**))+18@IRZafgihhhhggeaZUNFBAEJPY[_dhkmprqomorvz~€ƒ„…„„„„‡‰ŒŽŽ‹Š‹‹ŒŒŒŠ„~rgbbgmtyz{}~€}xri]NB7.+,3?Obrˆ‹‹Œ‹‹‹‹‹Š‰ˆ‡†yqg[QPR[clquvtsrssttttrrppolkkkfc\UP;;:9998876554333221///./.16:;@CFIFDA><;855431120..,,+***))((''('&&%%%%$$%%%%&&%%$$$$$$##########""""""""""""##""""!!!!!!        !!"#"""#%'/:GVcnx|wrjaSHHKNRVZ]`abdefedc`\UNF>966666666655555566665555443310000/..----..----///0//01011233545555555789<=AACCEGHHIIIJLLMNNNMLMLKHIJOWblsvusqrttwy{|zuolihfgglpy|‡“•––˜–’‰‚yz|~~~yqj]UURRNNLNIDGOPNJMPJD9----,,,---,--.3=PWPLCISQCAOmiw|zxwwxyyzxwtslg_YXZ`fknolnnorvy|}{ukaPD89@JVdq|ƒ‚€~~~}|yvvvxyxwslbVG90+)))))))),29AJS[bfghihhhgfb_YUMIDGJRX^_bejllmlkiilpuy|ƒ„††„„„‡‰ŒŽŽ‹‹‹‹ŒŒŒŠ…~rhcfjpuz{|}~€|wqh]N@6.+*6CTdt‡ŒŒŒ‹‹‹‹‹Š‰ˆ‡„wndVOOT[dlttsssrrrrsttssqpoonmhc_WNI<<::99888554544121/..../036:=AFJMMKHGEB??<<;87765411.,))))(''&&&%%%%&&%%&&%%%%%%%%$$##$$########""#####$""##$$""!!!!  !!          !$$##!!$&+2?M\ht~|vrkdYTRVX\`ccefffifda_XQKC<6687667777776656668976553333100000/-./....-/./-/01224455566866786688;>???ACDFFHHIIJJKKKLJKKKMLKJHFCDIS^iqtvtsssuwxy{zuqkfd`_behpw{…ŒŽ‘’–•••“Ž‡~yyxz{xsnha^[YVTMMJIJFCGKGCHPMLH/).-,,+-,----,06FXQQIQUGA=>Jky|{zwvuwzzwuurldZWWY^gmcF@Dcknquz~{uj_PC9=DO]hu}‚‚€~~~~~~~~}~{zwwvvwxxvrkaSF80,(('''(()-4;BKS\cfghhiiiifc`[XRLKLQV\_ceiiijihdddintx{‚ƒ„„„……‡ŠŽŽŒŒŽŽŒˆ…tkggmsvy{|}}}~~€xofXK?5-+.8FXjw„ŠŒŒŒ‹‹‹‹‹Š‰‡„~ulbWPNS^gmttssqqrrtttuuutspoolf`ZQIH<<;:98875554332210...../036:?DHLRRPNMKIHFDDC?@@><;9952-+*))'&&&&%$%%&&%%&&%%%%%%%%%%$$$$#########"#####%$$#$$$$"!!!!             #"##"!$&'.8FXepz}{wrle`^^]adffijiiigc_[TMF>999886677777777888:89976643301000000//0/0//00.144456668::<=>=>@@ABBDDFFFFHIJIIIKKKKLLLLKKKKLKLJHGCB@?CLYdqtvtssttwyyyxvpib\XWZ\`krx€‡Š‘••–”’Žˆ|yywvtnecaZYWVYWMKLJE><CGGGIPSS\L%-.,-,+,,-.--.4LMWf[ST@<7:Iizz{xvvuwyysrurjd\XZ[jhM=D@8]iejsyzxsh]L@;?GT`mw€„ƒ€~~}}}}}~}{ywvvvwxxvqjaSF81+(('''((*.4=FNW^eghghiiiifca^ZVPORW[^aeghhifb_^_cimtx{‚‚‚‚„†ˆŒŽŽŽŒŒŽŽŠ…|sjiiotz|{||}~€}wofXH=4--1;L\n}„ŠŒŒ‹‹‹‹‹Š‰‡„~th^RNPT]elrussrrsstttuuuutqpmhc[SMHJ;;:98777543332101/--.....26;?EILRSSRQOOMKLKJIIJIFDB@=951.*)('('&%%%%&&&&&&&&%&&&%%%%%$%%$##$$$######$%$%%%%%%%$#""!!         !!   !!!!$&(-5@Q`lv}|xtplkhhhkkkkkjjieb^YRKD?;9999777788988889;<>??>>:64221/110/21132134577;<<<?BBCGGIJLLMOOPRRTSRTTSSSSRRSSRTRPPONNLJKKIIIFCB>;:9=IUcotusssstwwyzwtpe\SPNPS\cmqy‚ˆ‘‘““’‘Œ†|xwwwpf]YVRQMNVQFGFC;;?CGHKMOMOQ]@#*,-,-,,,-,--0<<Wc`^S=:3AZp{~yxwwvvusjhppje`\\aZ\UE@7Jcaajswvvph[M@<BJWdoz‚‚€}}}}}}|~~|zxvtutvwwuqj`TG80+((''&'((06@IOZaeghhhhhjhhfb`\XVVVZ]`dfeedb_YXX\bhotxz~€€‚…‡ŠŽŽŽŽŽŽŽŠ…~wmklqty{|{z|~~€€|upeXI=4..5>N_o}‰‹ŒŒ‹‹‹‹‹Š‰‡†„{qf[QOQY`iqttqqqqrssttuwwutrolg`XNHEJ::8877775442220/..------/247=BGKQRRRSRPONMNPPPQROPLGDA=940+)('''&&&&&&&&&&&&%&&&%%%%%%%%%%#$$$$###$$%%'%%%%%%%$#""!!         !!!!!!  !!!"%').4>JZfq{€|ywtussqpooppoojgd^UNHA<;999988889989;;=BFIJMNKIC@853223333467:;=<?@DFFIKPPPRUWWY[Z]aaacdgffeehgeeeeeddba_]\[XTQNLJHGDB?<:855<DR^jtvtssstvwxwwtmcZMGAELU^iov~‡Œ‘‘“‘‘‘ƒ~zxvwxskc]XSMJMRQJFDDAACCGLOQNLNJ^iL*&--,-,,-,-/07>`k__K:96Maqy}ywwwuvwp_V_hiea\aS=EH?KX`YW[fryxuneXL?@EN\it|‚€€}}}}}}|~}|zyutrrsutqoh^RE80+((''&'),19CKS[cghhhhhhiihhfea][[[\_acec`]YWTRW^ekqtxz~‚…ˆŒŽŽŽŽŠ†€xpmntxz{|{|}~~~€€}wqgZK=4//3?Rcr€ˆ‹Œ‹Œ‹‹‹‹‹Š‰‡†zod[QNSY`jqssssrprstuuvwwwwspme^ULEDP888877766431111/.---,,,,,.059?CGLPQQQQQPPOQSTTVVSUSSPKGA<52-)('(''%%&&&&&(''%&&&%%&&&&%%%%%%%%&&$$%&&&&'&%%%$$$$##""      !!! !!"""$$&+/4;DQ`js|~|zzzxvxvvurtrrnid]UNF?;:;;::9999::::=AGPTY\_`^[UMA654549;=@CEFIMMOSVVZZ\^_bedghiknmorssttuvuvvwwvvtuttrpooligd_[VOKGD@=87434<GP]irttssstvxvyvtndVLA:>GR[enu~…Œ‘“‘‘Š…zxvuwvolf^XRVWTQKHDBACBDDILNTSLMJDl\9+---,/2///1@\rm_[C98>Xf]p|zxvvvuvo]]b^`[XZU[I^F@D]VMQblqurspgYKBBHS_lv~}}}}}}}~}{xvurqqrsrpmh]QE82+)((&'()-4<ENW^dhiihhiihjjigfc^\\]_`bcdc]URONPW_gmruy{~‚…ˆŒŽŽŽŽŽŽŽ‘Š‡‚zrqqvz|{zz{}~}€|xpfZL>5229DVgv‚ŠŒŒ‹Œ‹‹‹‹Š‰ˆ†xnbYQNS[bkqrrqqqqqrrtvwvvwwuqoe]TJEHU8887776534311/00.---,,,,++.269>BGHJJLLMLNPPRSSWYZXXXVSPLGB:4/+)(''&%&&&&&('''(((''&&''&&&&%%&&&&&&''&&'''&%%$$$$$$$"!     !!! !"""#%%(+/27>JWblu}~||||z|zzywwuusmg]UNE?=<;;<<;;;:9;;@EMV^eknprqoj`QC;:=@CHIMQTVXZ[]cdgikmnprrqttuwyzyx{|~}~~~~}|}}}|zzzywtpjf_XPJB=94348>FR^jsuussstwxwxxtmcP@228BNXaju}†Œ‘’‘‹…|xvvwxxuqjha^XSPPKGFFGEEDFHIOYSDBBJ`h6)+--,..11;OhhVWO999J`eS]{{yuuutoh^c_VWUPOLOb\]]EOR_gsmtp}uqdWJACJVcox€ƒ~}||}}}}}{{zyvrqqqqrrpmh]QD70,)(()'(+.6>IQX`fhiihhiihjjjihfa]]]_aa_]YTQMJLPW`hmrwz{~‚…‡‹ŽŽŽŽŽŽŽŽŽŒˆ…~uttx{{|zz{}~~~€€~yrh[MA833;GXhxƒŠŒŒ‹‹Š‹‹‹‹‹Šˆ†xnbWRRW_fkqrroopqqrrtvwzzyxwtpi`TKGJ\99976553331///....,+++,,+++./379=ABEGGHIKNNNPPUWXYZZWWVSQIC>84.+*'''&&&'((('((((''''''''')%%&'''()(''&''''%%$$$$%%$$"!      !!!!!!""!"$&(*,/26<BNWdmtx|{}}}}~~}}{{yxvsld[RIB?>>><<=<<;=>AGQV_isz}ƒ„ƒ{qcUHEHKOSX[_chhlmnqrstuwwy|z{{{|~~€‚ƒƒ‚ƒ„…„„„‚‚‚‚ƒ€}zuoibZQLF@<>ACIR^hquutsssvvxyyxy{{|^/-?IS^jt|…’’’ŽŠ…€|ywxvxyzxxricWVQRNMIKHFHEFGIMVLCADB?UK$*/,//1<`SKQP\SN9;;Q_jketzztswqeb^ZRPSQJJFDRSdaZJNOWbjih_WlbUICEOZhp{€~}|||||||{zywtponnqrqolg]PC70+)(((')+18BJT[bgiiihhiiijjiigd___^^_^YWPLIGGKQXbjpuvz|}ƒˆ‹ŽŽŽŽˆ…xuux{||z{}}}~€€~|xqh^QD;44>K]m|‡‹Œ‹ŠŠ‹‹‹ŠŠ‰‰ˆ†€xmaWTT[agmqsspopqrsrsuwz|{zwuohaULIPb8876544200////..--,+++++***++-/1488:==@CCEFHJJPSUWYZ[XYXXRMIB;62.+('''')))(())))((''''''')''''(())))('((''&%$$$$%%##"!      !!!!!!""!"%'(*+.25:@ENXdjqsuy{~}~~|{yyuld\TMFC>>=<<<=<?DIOX`kv€†ŠŽ‘‡}qfYSV\`dgloqstvwwy{{|}}~|}}}{{€€€€‚‚€‚‚‚‚„ƒƒƒ‚ƒ‚ƒ………‡†‡…ƒ‚|xtmf`YVRONNPV_irtttssstvvw‘œ ž£ z(3EP]gu‡”“‘‰†€|zywwxy{zvkiaQRXYRRNKIJJIJOQTQQA6DA<;WT,(121<OgoWb^YTM7<AS^dquwxwvtvrdYOR[SNMMJKQ_[ZZJS_^_\I[aQ^laVHGJR\hu}ƒ~|||||||||{zxuromnmpppnjf\OC70+)(((').4<GMU`fhhihhhiiijjihea]]]\\YVQLIEBBFLSZbjpuvz|}‚„ˆ‹ŽŽ‘‘ˆ„|yyz{||z{}}}~€€~|zsh_RF=66?O`p~†‹ŒŠŠŠ‹‹‹ŠŠ‰‰ˆ†wl`VUV^djprsspopqqrtuuwzz{zxvrle[QNZi7765333110//..----+++*))**))**(+--/1325:;<@ADEHLORTVXYYYZXVRNGA;51.,)(****)())(()(((((''(())))))**+)))'((('&&&%%&&$$#"""   !!""""$%%&()-.046;@HOW_fimpsw{{}€€€~}~}{upicZSMGB?@>=>?BHOX`kt~‰”—••”†|reacgkptuwz|}}||}}€€~~}}}}{z{{{{}~€‚€‚‚€€‚ƒ„†‡‡„†‡…„€|zvsolgd_\\_fksuvuqsrstwƒš£¡¢¥«®¨h,>OZiu€Š‘•“‘ŽŒˆ„€|{ywwxzzzwnkcODT`XYQLMKLQRUUPJBOFE<=:BcXJVF0^ysrnW>QUQ:;JY_VivrpvxvvriURW]THJJJLRTMT[L[UV\U@`g^_nbRGHKValv~€~|{{yy{{{{|{zwsponllooonje[OA80+*)((().6>HQXbgijiiiiiijligida^ZYWXUOHEA=>CIPW]fkqtxz}~~‚…‡ŒŽ‘Ž‘‘‘‘‹‰…|}||{{{{||~~€}{{rh^SG=89BSds€ˆ‹‹ŠŠ‹‹‹‹‹‹ŠŠ‰‡}vj_VRW_enrutspopqrqvuvx{}~~|zwqjcYXbr7766433110//..----+++*))**))))'*))),+-.10258<=@CEIMQUVWX[Z[YXSLD?:61.-,+++*)++)))))))((((())****))****()(('&&&%%&&$$$#"""  !!""""$%%&'+-.0469<@HNUZ`ddhnpsxz||~}€‚€€|ztnha[UMGEC@@DINV`hp|†”—˜––—‘Šwmknrsuw|~~~~~}}}}}}||||||zzz{{{}~~‚‚‚‚‚‚‚‚€€‚ƒƒ„†„…†‡‡‡„ƒ}zwwtpnmrtwwwspnnx„—¡ŸŸ¡¨¬°±®’48IZiu‚Œ’•“‘ŽŒˆ„‚~|yxxxzz{{yrbNCPSS^XQQIMUVWQN><MJC::;:Dc^Rlc\pifƒZ<P[T==@FLBXŽ”{oxxzxrbVcbRIMKJJMRT^][VSJD[hgd^`s\QKJKXcny~€}|{{yy{{{{|zyurommllooonje[O@70+*)(()+18BKT\dhijihiihhhigeb`[XXXSNIDB>:;?DLSZagmsvy{}~~~~‚…ˆŽ‘‘‘ŽŒˆ†€}}}}{{{{||}}€}|zwri_UJ@:;EWfv‰‹‹ŠŠ‹‹‹‹‹‹ŠŠ‰…ui^VR[bhosttspopqqsvuwz{}~€~yunh`bmy775543120/..--,,,,++++***)))'''())))**))*-..0359:?CGMSVY[]__]ZVPJC?:631,,,+**++,+++++****)+,*,,,++**++))**('&&&'''%%$$##"!     !!!!""#%$%((,/0479:>@DJPQTW\cginqvx{~€ƒƒ}zvohaXVQKFGKRXagpz„Š“—————’Œxssvwyzz{}}~}~}{||{{||zzzzzxyzzz}}~~‚‚‚‚‚‚€‚€€€‚‚‚ƒ‚ƒ…„„„††…‡‡„‚‚€€}}}}~|xsv…—¢ŸŸš¦«®¯®«šA5GYft‚”•”‘Ž‰†ƒ||zwxwz{|{si`SSR\hbWTLNWXTRK85IC=;:7:>Thf^D,`UUoVRQZI<>KUH;V}zZTabfd_]ZasiGGJJILLTXXPMINQdc`SR_cnmNIP^hs{€~|{zzyz{{{{{ywsqnllklooomjd[PB70+*)*))/4<EMW_eikkhgghggfddb`[YWRPKFC=876<BHPU[`hotwz{}~}}~‚…‰ŽŽŽ‘‘‘Ž‰†‚}}|{{z{|}~~~}}zyvpi`UMB;=J[jy…ŠŒŒ‹‹‹‹‹‹‹‹‹Š‰„~tg]WY]flstutsonpqpsvuwz|‚‚}ytnjnv€55443211..--,,++++****)))(((((('''''(()))())*,.1258>CHOUW\^`^^\ZUOID@=731/-++,+,,,,,++++++,,,---,,,,,,+***)'''''''%%$$##"!     !!!!"""#$%((*,/257:>BDDDEHLSY^bfimovyz€‚…‰‡„‚|yvpid`ZVUWZahny‰‹“––””“‡ywwxxywz{{z{{yxyyyxxuuttrrrstuvvwwzz}}}~~~~||~~€‚‚€€‚ƒ†‡ˆˆˆ‰ˆ†……………‡…ƒ€“ž ›ž¡¦ªª¨¦¥ž–T1HXguƒŒ’•”‘Œ‹ˆƒ||xyyz|~}|xrd_VWadb[RPSPRVPK7.38;;88>CLbqkDVvkYTZm_P@>?QJA@B:9<=<<<==GOQe\BEJKKKHOPUSPQRVWP=MOTTabWJVakv~~zzzzy{{{{{{ywspmllkloopnjd[MA60++*)+,27AJRYagjkkjigfffdbb^ZVSOLGB=77337<BHPW^ekouy|}}~}}~‚…‰ŽŽŽ‘‘‘Ž‰†ƒ}|{{z{}~~~~}|zxuohaYPE?AL]l{†‹ŒŒ‹‹‹‹‹‹‹‹Š‹‰„~tg^YYahovvtsponpqqrvuwz{~‚„…„}yutx‡5554200/.--,-,++**(((())''''((('''((''(''())****,./5:AFNUX\^`a_^[XROJEA<;80--++----,++,,,,-...----..,,+*)))(''''''%%$$$$"!       !!""###$$%'')+.1369=>>??@DGLQW\`cgimpuz~†‡†‡„€}yuroieddfkpx‚ˆŠ‹Ž””“‘‹…}xtuwuvvuuvuuwtrromkjjhgggeffdfiklmpqrstuuuutuuttuvvwxy|}~‚‚€……†ˆ‡‡‰‰‰‰ŠŠŒ‹Œ‹‰“Ÿ›™› £¤¤¢œš–”‘s3DXguƒ””““ŽŒˆƒ}yzyyyz|}}wsic][ddecXXXYVVSC62/7=<:7>KSxx]HPhpjgXUQQ@A?<7>BDFGGFEGFFMTF?BBCMPNKKJIIOVWYSEEO68FUUGCXMXdmx€}zyyyy{z{{{zxvsomkkklmonlhbYK?40,+,,.18@GNU\djljjhhhgffc_^ZUQLHB>:4/136:@DJQY`hmswz}~~~|~‚‡‰Ž‘‘‘‹ˆ„~}{{z{}}~~}}zyvrngbZPGBEPao}†‹‹‹ŠŠ‹‹‹‹‹‹‹Šˆ…}rh_Z[ckswwvspmnqqqrtvwwy~ƒ‡ˆ‡…‚||ˆ334211//.,,++,++**((((((''''((''''''&&''')))******,.19?DLOVZ]_aa_ZXXUQKGB>730..-...-,,----..........---,+++*''''''&&%%$$#"               !!""###$$%'')*-0377;<<<<?CGKPVY]]`dfjmrw{€„ˆˆˆ‡…}}xusqprt|‚ˆ‰ŠŽ““’Š‚zurqsrqrqoollgeeeaa^]YXWUUVWWWZ\`abdhhiijjjjihhjjihiknortwz|~€‚„„„ƒƒ„…†‡ˆˆŠ‹ŒŽŽŽ—š˜”˜ž¢¡œ”ˆ€|’‚AFXguƒŒ’”“ŽŽŒŠ‡ƒ~|||zz{z}}{v_a^V_^ddZWV^_QWC9329;;978@HE5=IKCAloiUG>:CA=GDB=<;;88599@TNF@?EJJLKIFHNYb[UMFJUWNEKJEWNU\eqz€~{yyyyxyz{{{zxtqmmkkklopnlhbXJ?4///0259=DJSZ`gkkjjigfffea_ZVRKDA;60.,/25<AFMT\cinswz}~€€€„ˆŒ‘‘‘‹†…ƒ€}|zzz{}}~~}}zywtohd\SJEHRcr‡‹‹ŠŠ‹‹‹‹‹Œ‹ŠŠ…}re]\ahmuxwuspoppprqrtuvy~ƒ‡‰‰ˆ…‚ƒˆŒŽ220000..,++*))****(('''''''''(((((''''&'))))********-06:@GNSZ\\[^_]\[XVSMIC931...0.//..//////////.//---,+++*))((((&&&&%%$#!!!!     !!!   !!"#$$$%%%&()*+./369<===AEGLPTVXXYX[_chouz…ŠŒŠˆ†ƒ€}|zy{}„‰‰‹‹ŒŽ‘‘‘‘‘Ž‡~sqpmmjjhdc`\[ZXTRPOMJHHGECDHHIKMRRVXZ[^```]^\[]\^_\[[]]aejnrux{~‚‚„………††††‡‰‹‡}„•—•“–œ¡¢™‰|y{pxŒŒ‹‰\LXhv„Œ‘“’‹‰‡ƒ}qbozzy|€}‚~i[WXZ^dhYHJNK=KG7C::;95669;D;7?GAMSSvdP?<CCJH?F8Jr}wsnVT=MjPJCFJHGEFCDGOXVONKFDGGEWIQYSS_lt{}}zyxyyzzy{{zyvtqnjjkllnqomgaUH@64579<@EHLRV^dillkkhfgddba\WRLE<72-))*.27<CHOX_gjpuwz}~€€‚‡‹Ž‘‘‘ŒŠ‡„‚€}{||z|~~~~~}zywsoid]VMHKVfuƒˆŒ‹‹ŒŒ‹ŠŠŠ‹‹ˆ…|sf^]cirwxwuqpqqppqrrrrsv|‚†‰ŠŠˆ‡‡ˆ‹Ž110011/,*)**(())))((''''''''''''&&''''&'))))))********-28?EJNSWYZ]_`a``_YSLD:200.//00///000000000/00...-,,,+))''((&&&&%%$#!!!!     !! !!"####$%$$$%%%&(+,+.057;<=@@EIJMOSTTUTUUW[^fmu}‚‡Œ‹Šˆ„„…‚~„ˆŠŠ‹ŒŒ‘‘‘Ž‡zrkhfdb][XUSPKHFB?>=;8776789>ACEHKLPSUWYWWVUVTSRQQPPOOOOQTX[aejovz}„……„„…………‡pŒ”™›—‹}~~|n|ŠŒ‹sLYgv„‹“‘‹‰‡…‚iamcz…‡ˆ‚wjb\VTa\FCHQRHRb]L::;6565649E@6Xh_UNTYOF;?<@AEI=4c{nWdjMKLHJIKMJFCBBAAHLMMKE=?@@KPEWX\_blu|}}zxwwxyyzzzyxzzrkkhgkklookf`UJ@::;?BDHNRVY]bgkmmiihhffd`]XSNH>5/,)))*.27<CHOY`eksuwz~€ƒ‡‹Ž‘‘‘Ž‹ˆ†„‚€}|||}~~~~~}{xvrmie_XOLNXhv„ŠŒŒŒ‹‹ŒŒ‹Š‹‹‹‹ˆ„{qg`agouzzwurqqqppqrrrrrty~„ˆŠŠ‰‹‹‹211/00/++++*)(((((''''''&&&&&%&&%&''''(())(())******))+,.4:@EINSXY^`abbde^ULA610/.000001221123311111////..-,++*)))(('&&&%$""!!     !!!  !#&()('&%#$%%'$&)*+,/259<?BEGIKNMPRUUWWVWWX_cjoz‚‡ŒŠ‡……†††…„„…ˆ‰ŠŠŒŒŒ‘’‘‡|qf^]ZURNIC?=:9521223022259=?BFHJMPSUUWWWWVVWSPONKHD?>::>BEJQSY_dipw}€ƒ‡†…ƒ‚ƒ„‡ŠŽ‹Ž—œœ”ŒŠ„wsƒ{r|{{‚ZZguƒ‰’Ž‹Šˆ„†‹wpqro‹””‘Œxkoh]Xfc][FGOZcmf;MG:78678659BDEZ`TOHIJ@@=?BNZcH<2Wzm]MPXRNJMNJGFLMFAA;;?DGIIFIJLJOO?XXRbhox~~}|ywvvwwvyxzwvohoz‚~sljorjig\SLHCEGJORTWY[`fhjklkkjhgfda_[VQJA8/+(()((,38;BLSZagmrwz{€€€„†Š‘ŽŽ‹ˆ…ƒ}}{}}~~~~}|{xuqmjfaYSMQ\lz„‹ŒŠ‹‹‹‹Œ‹‹Œ‹Šˆ|rfcgisy{zvvsspooopqrronquz…ˆŠŠŒŒ‘‘1//.--+*+***((''''&&&&&&%&&&&%&&%&''''(())**++********+,,,059?EIMSY^bdfiif^TH<3101/0111122110222111100//..-,++*)))(('&&&%$""!!     !!  "$',/00/-+'&%$&&'(*+/359=@CFIKOPPQRRTVXZ\]]^aejrx€†ŒŽŒ‡……†ˆˆˆ‡‡‡‡ˆŠŠŠŠ‹‘”““‰|l\QNLF?;9531./0....-/2336<>BEHKMPRTWWWWXXWVTSRNJFD>:41/..28=BIOU[`gnvz~}€zvy‚Š‘™›™•‘ŽŽŽ‰{nsmly€Ž›–v~v€Ž‚zƒ‹‘“tp}px’”‚cagjcU\[\PPOIZdX9MK=8878;76=?GcTN7<68=FDAACKW]CF<a\be[@?JDNZVPHFFHC=>;8=AGIIJLLNOQXZXYXZepy}}|{xwuvtyxssvpfJL[p†™`X\SGK[^YQLHJLQVXZ[^cfkmnmnljihgecb`\TMG=4-*(()((,27=ELS[ahntxy|€€€„†Š‘ŽŽ‹ˆ…ƒ|{zz}}~~~~}}{xsolifa[URU_m}‡‹ŽŽ‹‹‹‹Œ‹‹Œ‹Šˆ{sifimtz{zwussrpoopqppnkmqv{†ˆŠŒŽ‘‘‘0/..--+)*)(()('&&&&&%%%%&&&&&&%%&&''(())))))********++,,---.06<AFLQX^dglmke[NB711222122233333222222210/.------+***(('&&&%$$"!      ! ! "&+/4<>>>960,)(')))*.169=BFGJLOPRTTTTVZ\`deeefiqu{€…Œ‰‡…†‰Š‰‰ˆˆ‡ˆ‡†ˆˆŠŒ’“’ŒˆzhREA=9731000../----..048<?BFIJLORRVXXZZZZXXWSSMKFB;60---++,017;AHRY`fmpvuŒ’“•šŸ™„m‘‰’’‘’ƒ¡´¼½¾¾¾»°ž‘}y‡qt‚‡ˆzY{ƒkz‹‚mcuxwj\fjkheb`RTUKEOb\+(=><;9;@E<98:FC@G?:987L@ACEJUSFI_]SZeRRX9BhrhUIFDABB?:7;@CGHIKMPRRUX[[X`foz~}|zwvwuuyt_`whbkrnna`JGFINNEYb\UPPQVY[]`deimopomkijhhgee`]ZTLD;1*)))())-49?FNU\cjpuw{}~€€€„ˆ’Ž‹‹‹ˆ…ƒ€~{yyz}}}~~~}{yvspliea\WUXbp~ˆŒ‹Š‹‹‹‹‹‹ŒŒŒ‹‡€{slkmrw{|zxtssoonnpqqnkhhlpv~„ˆˆ‘’/...-+*)()('((&&&&%%%%%%%%%%%%%%%&''(())))))********++,,,,,-,.29>CKQY`hmrqkcUH:32222223344444333333321/.....--+***(('&&&%$"!!        "%*/39@GKKKGC>70+)*,-/157=AFJLOORTUVVXX\`ehlmnnnprx}†‹ŒŒˆ†…†ˆ‰ŠŠŠ‰‡‡†„††ˆ‹Ž‘”Œ‡{iQD<77353//....----0036:>BDHJNQQRVWXYYZZZXWUURNJF@951-,,,++,,-05;DLT[beuŽ”—’”•™žŸ˜ykomŽ’‘’’’¡¶»¹»½½½¼»»´–‡ƒˆvpihjk_]`vwy{kUVrƒnUZjmjll`]TQTNJSvu<413;<<:@KG847?FDLE;<9;J<ACEIUKH=MieZVJVO;nnniXLE@>=>A<8:<@CDGIJKLNQV[[X]gqu|}xxtsvvmUsmld]^inf^CDNPQJDH]le`ZUTWZ\^adfiloqqomkijhhgee`[XQJB90)()))*,08;AIOW^ejpvx{}€€‚…ŠŒ’ŽŽŒŒ‹‹‰†ƒ}{yz{{{|}}}zyvsqnjgd`\WW]esŠ‹‹‹‹‹‹‹‹ŒŒŒ‹‡€{spnquy}}{wsssponnnnnkihijmqz€…ˆ‘’--,,++('('''&&&%%%%%%%%%%%%%&&&&&&''(())))**********,+,,--..--.27:?JR]hmqsodXK=42222123444443333443212311/00..,,++))('''&%%#"!!!   !"#$(/5=GMRVY[VRJC<60./0449=CFJLORRUUWZZ[\`bfmrtsqqsuy~‚…Š‹‰†……†‰‹‹‹Š‡…„ƒ‚†‰Œ’’Ž‹€o]RLD<84541--//---.2268>BEIJLOPSSVWYYZ[ZZYWUTPLHB=61.++,,,,,,-148?INTYm‘™––ŒŽš”‘}]5c…„‰‘””Ÿ¸¾¼»¿¿¾½¼¾¶³º¤„ˆ†‰|_Rgcspgwz{zlW\dXL[cfb]agWHGNMLZmhJ:9ID><8DA9673EYSA39<<IMBDECJVED9Mwpk2B@Auyng`RNF??=>><;:>BDCDFGFHJPSWY[]gqwxzyvtslrnmorfG6@daHKKLLHFL\kpkhc]YWYZ_achikopqpnljhhhgfdc`ZWOG?5-)'''+,04:ADKRZ^emrvy{}~ƒ†‰Œ‘ŽŽŽŒŒ‹‰‡…‚€~|zyxy{{{|}}yvsplihfc`\[Y^gu‰Œ‹‹‹‹‹‹‹ŒŒ‹Š‡{uqruy{~}zxtsrppoooopmjgfflpw}‚ˆŒ‘’--,,+)''''&&&%$$$$$$$$$$$$$$%%&&&&''(())))********,,,,----../1/.24;DLXbjsvqiYL=53323234444556666444323331/000.--,,))))('&%%#"!!!   !"$(-5>HRW^degfaYQGA;5457:?CGJLNQTVYYZ[[\`ejnrvvvttvyy~‚†ˆˆˆ„„…†‡‰ŠŠ‡…~zyyzƒŠ’‘…ylc\WPID:71./..---0168:@DHIMNOPSSVWYY[[ZZXXURPJE?94/-,,+,+,-.036<BHNTT…ž™š~kyn]pxŠ•˜•Š{\]„•¶½¾½¼½¾¿¾¹¦ls³¸°†˜¡wIZhuz|{{{scRWbOQQ_QAAKX^QNLIOLQX>8FEA<5COQ987<I`JLPNUOCDBRLJTBF<VxkD><<qywqefXHFFDB@=:9;=@CDFGHIJMQRVXWWhuxw{yyvsn`dmjoji_Y_OJKKHDSeklnnmkfa\Z]^bbeglmmooomkjhhhfecb^YUME=4,)'''+/38;BELTZ`hmrvy{}~€€‚…Š‘ŽŽŽŒŒ‹‰‡…‚€~|zyxy{{{{yywtrojggec`\[Zakv‰ŒŒŒ‹‹‹‹‹‹‹‹‹Š‡{uqtw{}}zvusrppoooopmjgffinu{…Œ‘Œ,,,+*(''&&&%%%$$$$$$$$$$$$$$$$$$&&''(())))******++--------..1311238>GT`jstqj[M<54433245544666644555434331/011/.---*)**))'&$"""""  !#&+3;GPXahnoqqlg]TLF?<:=ADHJKPQSVX\[\\\`chnruvvvuvvx{~‚„‡‡†„„†„„…„‚‚~yvvslou|‡Œ’’ŽŠwqmia[VOH?93/-.-/038=@BFIJLNPQSTVWYZ[[ZXVUTRMIB<72/-,----./028=@FKOTqœœ ¤“rYghu€w”Œ‰Švvo»¾¾¾²°¼¾¿½¸“v§º¯…˜ƒQ<H^ov~xtwzoTAsgZY\^H=?;<MaPMNMKBKOD@@A=8BID89689>6OVO@KCFC^YLQAE:nyM0=Bprwxteh^JGGDC@:78:<>ACEFHHJPUUUXQXmvzxxsHZspgZafeqo_TLJNNLOflkllmnnkhd_\]]_`ccgiikmkkjjhgfedc`]XRKC:1,)'&(,04;>BGMV^bhptwz|}~~~}~ƒ†Š‘ŽŽŽŽ‹‹Šˆ‡…}{ywxy{{{zyxurnjgefdc`^\\dnyƒŠŒ‹‹‹‹‹‹‹‹‹‹‹Š‡{usuy|}~}ywttsppoopoolifceintx~„Œ‘‹++**)'''$%%%$$$#########$$$$$$$$&&''(())))****++,,-------...1311238>GT`jrusiZJ=4343335665566665555543433211010.---,++*))'&%###""!#(-5@IT^fouyzxrlf_UQMGEGJIJNOPTUX[^]___aeknotvvusstuy|€‚„…„††ƒ€~~~{wsplgc^agq‡Ž’‘Œˆ~xxuqnkd^VL@91./158<?BDHJKMNQRSTVWXYZZXVUTRNID?93/.---,,-.148:?DHKP_–œœ¡¢£š‡{‰ŽŽxm`yu{ah|£¹¾½ºž™¬·½½½¬‰“°¥‡|˜ŠiOTOnzoY^dlmlej€e]XTL?:9>EITRMKKKTMKEAB?><CE?=;:;A:;KLIA@EFJWXPJCB>zV12?b_fvvsk^YQFFFCB>;98;=>BDGHKLOW][YYdmvywuq;Qsd>[okvwNCSOJEQbihgjjlnoomgc_\\\\^\\^adfhjjjiggfecb`\WPIA80+('(+.38<?AGNV]dkptwz|}~~~}~‚…‹‘ŽŽŽŽŒŒŠˆ„‚|zxwxy{{zyxwrolhfdecc``^_hp{…ŠŒ‹‹‹‹‹‹‹‹‹‹‹Š‡|vtu{|~}{yutsrppooponkgfceinpw~„Œ‘ŒŠ)'))'&%%%%%%$$##""""########$$$$&&&'(()))))*++,,++----......141/238>GU_jtyrh[H;33356556666666666666655554432110.,.-,+*+*'&%$##"!!!!#%*18BMW`hry}{ysoic^ZWTSNNPTSSRTWY[_``aacfikorrtsrrrtvy}~‚„„ƒ~{xtplgc_XQORYeq|†ŽŽ‰€|}||yxtnibYNB;65:=@@DGJLLMNOPRTVWXZXVWSROMID>:630..//..1358<?CEKRR{šš¢žš‹ij¥˜ˆ…„hZT^f|Ÿ¶«»¼±›¥¯¤ ²£†}• ˜†Ÿ’}^^tq_YLKShi]iniq^XR::;=?8JPOFLFESKEDHJLSB8<?;:;=PMSHGPLAD@a]RQAD@Jh27;MZ]gtupj_UNJFBCCB><<>@BEFIJOPRU[^Y\bnvxwttqusdQdovmK?GKJGWljihiklknnmjhb^\ZZWTRSUY\_fhjjiggfeca^\WNG?5.(&&*,059<@DHOV_fmquz|{|}}||~ƒ†‹‘ŽŽŒŒŽŽŒŠ‡…ƒ{yyxxyyyxxvspmhebcecda`aelt€‰ŒŒ‹ŠŠ‹‹‹‹‹‹ŠŠ‰‡…‚{vwxz}‚{yvsrqoooopolkgebdglpv}…Š‘‹‰*)(('&%%%%%%$#!!"""""####"""##$$&&&''()))*)*++,,++----....../321238>FS^itxsh[J;54456556666666666666655554432110110-++**('&&%$$"!!!##$'*19CMWbjrvyxvpqlhed^\[YWZ\ZZY[\_aeffffhijlpqrsrrqqqty}€€~}yvrmhd_[YTGABDMYgv„Ž‹„}{}~~}zvskdYNC??@CDFIKLLMNOPQTVWYXURSNMMID?:842/////1258:>@CFHJN^•ššžŸ—ŒwW\‰¤§–„tbYadIZ¾®†²µ©®nq‹¡š}e™Š™‹gagf]cdYTWf\Teiic\bR;<>D=<FRNJRQCINOQMNRZE<>E=8;:H[fLKPCCBG`RUXAF=W=>CGPXKNqupg_WNJCACC@=<>@ACFMLNVYWZZ[]`hrxyvupoqpnnryfJBJJCAJbefhhhhklmlkie_[YXTOMJLKPY_cgijigfedba]ZUNG>4+'&(+.059>@EKRXbgnswz|{|}}||~€„‡Œ‘ŽŽŒŒŽŽŒŠ‡„‚€~{yxwwxxxyyvspjfb`adddaabgoxƒ‰Œ‹‹‹‹‹‹‹‹‹‹ŠŠ‰‡…€xvuw{~zwusrqoooopolkfcbdfkpv}…Œ‘‹‰)(''%$$$##""""!!""""""##"!!!!"$$&&&''()))*++++,,----....----/133128>HT^juxrh]L=56665576666666666666666665444221000/.,+*)'&'&%$#"""""#&+2:CMW`gnopoomljjjhgcb`^^__a_cefhlkjiijjlnqtsrqonpqvz~€|zxvqke_[WRNJG@>@BFP`qŒŽ‰zuy{~€~}yuoeYPIHGGGJJJJLNNNQSUVVSQNMJIGD@:6440012357:<>@BEGIJPS„ž˜œŸ˜’vYQx–˜~wf‡_( }½»©„}—¬®w[e˜‰>Z“ ˜zUY\]twm_\]ZSVmhghVHE9=MSF@>Td\`u[FLNNGCUA=@=CA779DWS?5CBDC;@O\O>D?;9@JMUSLYjnqjZOMHB@BB?<:=AACFSUS]bba`_^bjsxxwsprpkHTxvFFMNFLgjfdfeegijkkklf`\VUQOGC@CDNV]dhiihgfcdca]ZUME<3,(')+/25:?AFLR[dipux{{||||{}}„ˆŽŽ‹‹ŒŒŽŽŒŠ‡ƒ€~}{ywxwxxxwvtqlhc_^^cdcbaejqy‚ŠŒŒ‹‹‹‹‹‹ŒŒ‹Š‰†ƒxsuw{}}|xutrrqnnooqpljgcbeglsx†Œ‘Œ‹‰(&&&%$$$""""""!!"""""""""!!!!"$$&&&''())**++++,,--......----.022128>DO[epvtkaP@77765556666666666666666665444223200/.,+*)'&'&%$#"""""#&+2;AKU\ceddcacfijjjhgecdceffhklmopnmmmnnnqstsrrppqvz|zzzwupkf]WQJHDDA@>>=>BJZl}‰Œ‹†|rgkqv{~‚‚ƒ€}{tle[SNKIIIJJMMNNPRSROKKIFFDC@;863322579;<>ACDFJLMQQdŸœ œ‘ƒ‚…cQf„ƒ†ƒƒŸ›Z*#x¼»´¥‚]|œ›ˆbVkŽ{lp–¤fC\_cz’’vmdb\haV\X=9?DKWYD9BBc\WbYKFC@:LT38>IJ<435>FJHDAG@E7@GT=@<=:H]X[]?EOM^^_ZO??@ABBB@=>AACFTYW_cecbabgltxwtsl`\rlf_TMCL[dsmhedcbcehjkkkhc]YROJC:76<DMV]fhiihffccb`\XSKB80,(')+/25:?BGLR]flrux{{||{{{}}„ˆŽŽ‹‹ŒŒŽŽŒ‰†ƒ€|zxvvvwxxvttoke`^]]`cbbcfms{„Š‹‹‹‹‹‹‹‹‹‹‹Š‰†‚~xsuw{}}|xurqqpnnoopoljfdeeiorz‚‰’Œ‹‰&%&&$$$$$#!!  !!!!!!!!""""##"!$$''&''()*++,,------....--....0/01016<DLXfnstmbSH=6566557786666666666677775544442111//-,+*(''&%%#"""!"%&+29AHPU[\XTRV\afjlkiggfhhhlllnprrrpoopprttwxtrrsrsxyyvvsoje_YRLD@?@@?===;=AHVgy‡Š‡ƒwhXZaipw{€ƒ‚‚„‚€{uof\UQNJIJLLNNOPPNHFDBEDBA>;7557879<>?BDFHKLMOPQTƒ£Ÿ¢Ÿ™‰pˆ‹uPW|{vs{ —@*#hº¹¶²¦…`dvƒƒi`}‡}pc„‹ODfrŽˆ’Š}|cacSRX\R3>KS^kF/05MSMQJIFDDDW;88=@732548DD;>?BAS@AF@=BJRHVgQQW@F@0OOMP@;?DFHB?>?@BBDHQYZ_fgddefinuyxuqpc]jgJHSNMYesnieccbcceeiihgd_ZRLG@9215:CLV]dfhhfeedca^[XQIB7/*('),046<BCHOW_hmrwyz|||{{{{}…ŠŽŒŽ‹‹ŽŽŒ‹‡„€~}|ywvwvwwwvurmic]Y\[_accdhpx~ˆŒ‹Š‹‹‹‹‹‹ŠŠŠŠ‡„€ytrsw{||{xurppnnnnonmljhgefinq}†Œ‹Š&%$$###!! !!  !!  !!!!!!!!""##$$''''())*++,,------....--....///0004:@KWbjqrofYND<786555555665555555566665554443111/,,+*)(''&%%$#""!"#%(06>CKQSSOJIOTZaeghghhgijjmnpqqqrrqqquuw{{{zwttuvvwutrolga[SKD@>>?>=><<;<=AGRcx†Š‡‚ucOJOXbkrz…†‡…ƒ€yvod[SOKKLLMMMMHFCA@ABCBA=;<:9;>AABCDFHJLNOSUQScš¡ž—‘qY~‡t^Md}{vqu‚2**Mµ´±°«ˆrijmohu|mdtvb>>Xƒ¡™–•Œuf[UKMX_^GKBFZUD329>5:NIIC>;FS:589<F;2228@NF=?7NYQYK9BCQAHVUORN7@20IKY@6:>CFIFA??AACGHU\YZchceagmr{wsj^gg^^RGF::KS_rmiecbadddhgggf`]UMD=5-,.3<FNX_dfgfeeca``^[TOH?7/*('),069;?CHOYaiouwyz|||{{{{~…ŠŽŒŒŒ‹‹Œ‰…‚}}zywuvwxwwutqlfa[XWZ_abcflqy‚ŠŒŠ‹‹‹‹‹‹ŠŠŠŠ‡„~vqpruxz|ywtrppnnnnnmkjjhgeehmq}†‹Š‰&$$$###!   !         !!!"$$%%''())))*++,,--......-.////....//0027<FQ\fkppibWMC<97556345555555444455466653323311/-++*(((''%%$$"""##%).3:>DHKKHGFIOV[^`adcegijjkmopqqsrstvwxz{{||ywvvtrppolie^VLD?@?=>====;;;;<?FPas‚‰‡‚wdM;@ENYcmx„ˆ‡ˆ‡…~yuk_VPMLMLMLFC?;::=ACCCCCCCDDCDDDGJKLNOQOQRUUp£¡œ™”ƒJLnƒlPOqxwwp‚p3105£®§¨¤Š€xj`TYWfjcmlhS8?Tƒ¥ “—’’”tI<^ob[TNLFCCKRD3@D9::8>G43BKK?3A>?713059DC><Pe`i_;=<ANQIEOHMM;<F=C@?817?A@@AA@@AAHIJMMLR`hgfZ_pedcTKDEJEOOJ@BNCIdumgdabddcefhhfc^XPF<3+))/5>IQY`eggeddcb`_\XUPG>4-)((*,058:=BIRZbjpvvxy{{|{zz{}†‰ŒŒ‹‹Œ‹‹ŒŒŒ‹ˆ„}|zwutuvvvutroje_ZUWY]`adhptz„ŽŒŒŒŒŒŒŠŠ‹‹Š‰‡ƒ}tppptvxzxurqqonnnmmnlkkiifghms~‡ŽŒ‹‰‰$!##"!          !"!"$$%%''())))*++,,--......-.////....////029AKW`ekpnh`ULF>;:86644445555444455466665323321/-,,+*((((&%%$"""##%&+039>@CBBCGINSWYX[\\]_aadgikmpqtstuxyy|||||yzxuqnlifc_XPGB?>>==><=<<::9:;=CM^p€ˆ‰†|jS715=HO^ju}„‡†‡‡…‚~{vpi[SOMLKHB?;;;>AEFGGIIJJJJJJJJLMNOQRRRRSWVv£ž›•Œn:Ic‰ˆxXNYrxzx„`854.z¤Ÿ¢¤–‰~mdXNB?D]jhcJ<EQ~Ÿž˜™¢Ÿ”cCN|}vmd`SJPYXZPG<:FG:;=EA?ADUPBA705=6,036:?UbYVN<;=D^XHDFHQ]WLJMKM@>@;<?>:;>@A@>??CFGHITahk\FNN`kZOT]T4/@HCAFGGTrrlheddeccdeihe`[UK@5-())/6>IQ[bfhgedcbba_\XTOE=3-)((*,058:=AJS[bjpvvxy{{|{zz{~†‰ŒŒŒ‹‹‰‰Š‹ŒŒŒ‹ˆ„~|{yxvtuvvxwvtnic\XTTX\`aejqx~ˆŽŒŒŒ‹‹‹‹‹‹Š‰…€yollnpvwzxurqonnnnmmmmmkjjjhjov€ŠŽŽŒŠ‰‰"!!!  !  !!!"!""#%%''())))*++,,--..//......00......,//15;DNYchopkd^UNGC@=:85331444444445566666544332//-,++)()''&&&$$##""$&'-15;:<;=?CEJOQTSSQQRTY]`adgjmprruwy{}€€€~{xtqmid`_YRLE><<<<<<<;::999999;>IYm~ˆŠ†€q\>*+/7?KVdnv}ƒ†‡‡…„‚yri]SLKGDB=<;>CGHJMNNPRSTSPOOOOOPQRSRSUVVV|£ž˜‹j6Ua{Œ}dRLfu}‚‰V9788I”˜ž£”…}wl`ULFI\c\ZGAFJr™•’”žžzZs‰yli\ZV]lqyvjb[TUVUU\hPC?;FNI;019G7--/48Kf`URP=>CJA=>JMFDMNI>ALVVVSWF:=A=:>AACEGEAMRQ^SOY\IERZZdY[TC:>9EG<0<Rpwrooihncjhbbfeea[SH<1(('*/6?JS[cefgfdbaa`_^YRMD;2,**)+-1578<@IS\dlqvvxzz{{{zyz€‚‡‹ŒŒ‹‹‰‰‰‰ŠŠ‹‹‹‹Š‡ƒ€}{xxvuvvvvuusqmh_ZVRSW[_bgmu{‰ŽŒŒŒŒ‹‹‹‹‹ŒŠˆƒ}tniilpuwyvurqonmmmlnnnmmlkkiioxƒŒŽŽŽŒ‰ŠŠ"!!!    !!"!"##%%'(())))*++,,-...///.....//......,-..15=HQ[dhmmhd\XQLGE?<96334444444455666654443311/-,++))(''&&&%$###!"%$(-243578:>CHLMMKKLLMOQW[adgjmprrxyz|„‚~{xsokf^ZWSMF?::;;;;;;::99887777:=DRey…‰†‚yhL0*),09CMZfqy~‚„„„‚€vmbUKFA@CCCEHKNQTUUUVWXWUTSSQQRPTSQUTUTZ‹žœ—s,<Xq†}hMGLfu|uJ:;<<:gŽ‘–†wrtmeYPPTZUQQIFGGfŽ‹‡‹“—•‰}|]NQTMOUNRn‰Œps…pbZMFKXONF;GO@2.37<8/-..3<?C?KVJMI;78;;:<>>A=8:;<CHJMP@ADA>?AABDCCFJJIMRPHCPQBEJITS@?B@AKQfktyxunftxwdX]T^^cfea]UF;1((')07@KU\dfggfdbaa`_\XRMD;2,)))+-1578<AJV_flqvxyzz{{{zyz~€‡‹ŒŒ‹Š‰‰‰‰ŠŠ‹‹‹‹Š‡ƒ€}{xvutuuuuvvtplg_XSOQU[_eiov|‚‰Ž‹‹‹‹ŠŠ‹‹‹Œˆ†zohdgkpuwwusqqonmmmlnnnnnmmkkms|†ŽŽŒ‹‰ŠŠ!!       !!"#$&&'(()**+,+,,.../////.....----//.-,+,-,17=GQ\diiifd_ZUQNID@:653333334444554443332210/.-,,+*)('&&&&$$$#""#$$(-0132689>ADFHHGJLNQUZ[_cfknrrsw{|€~€}|ywqngc]XPMGB=;:::9::99998876666679>K_r€‰ˆ‚}nW;))')-4=IS]hoxƒ„„‚{uvxpaTIEDGIJMRUY[]^]YWXZ]ZXVVUTSRSTRSSV]b•˜˜•Œ}+9N`{ycNKDIPRIA=>>=<9n„Šnmjb_WPPSQJMPIJGEJvˆ„‚€ˆ’‰~[AIOMLJE>5?[ajte[NRWHJL=?:52892550-*'*1;?>TL=74774395358;;:98==;:BQDA?EMGCA=??BGIR^Z]dTV^\J=RZQ:@LGEPapvsswtssmpieJSAH]cegea[SG;1+&'*19BKT]dfggfcbaa_^[WRJC92-*+),.0468=CLW`gmrvxzzz{z{{z}ƒˆŒ‹‹Š‰‰‰ˆˆ‰‰ŠŠŠŠ‰†„€~|xvvuuuuuvuuoje]VQOQW^bfkqy}„‹ŽŽŒŠŠŠŠ‰‰‹‹Š‰†‚~vmeeejnswwtqoqponmmnmnpppnmnlpu~‡Ž‹Š‰‰‰!!!!    !"#$&&'(()**+,,,,.../////.....------,,.,,--047@FR[^cefeb`[XUSMHE=643222344445544433344100/-,++**('((&&%#%$$##$$$'+,-3789=??@CEFMRU[^`dgiklnquwzz}||zwvsojd]WPICA?>;;88889988887765555548:FUj{…‰†‚vdG-(&()),5>HU]gpv}|pe_f{xpeZONPVZbilnooplf_ZY[_^ZVVVTTRPOPPOOY™ —–”Œ318VnpSJPHA<;=@AAA@>7Er~sedaXZRKNNJKMLFGGJLYu‡…z{”ŽwF:ABCAA@>;6/2V€Œ‡vb`UQSI=D98849?=2.1/.-)<A98<86347;<AC:43662<BCG<99;=FFB>8<?@A>AECBIIYQjuMPipraIA@HIH=ThnpqrjZpfl^UR@@LU]chedb[SH:1+'(,2:CLU]dfggfbbaa_^\XRJB:3,++),.0158=ENW`iptvxz{{{zzzz}ƒ†Š‹‹‰‰ˆˆˆˆ‰‰ŠŠŠŠ‰†ƒzxvvvuuuuuvuuoje]VQOQW^bglrz‡ŽŽŒŠŠŠŠ‰‰‰Š‰‰†zrha`bgnsvvsqoooonoonmnpoonmnntzƒŠŽŽ‹Š‰‰‰!###!   "##$%%()()+++,--,..../.././/-----,,,,,,,-,,,.18@HQVZ^`abaa`]ZVPJE@:53322333344334333320/00.-+++*(''''%&$%##$$$##%'*,/37;>@?@CIMVZ]aiknnoopsvxwywvwutqnjc^XQJC<98;<::876567776666542333356=L`s‡ˆ…|pW9'%%'((,/7@KVajojdonSj€}th_]clv}€„‚~}}unghhie_YVSRPNLKLJIGL” š”ˆƒE.6Og\GIRJEB?@@@?>=26FQqnc]ZWVPOMIHFKLIIPRWZXix|†•ŽmC;<;899:9763/;f~††saSNICEKJ=26J;4,34/+*3?=DE953496<BD<7655434334577::>JVI60,38:<E?;=@FZ\QCL[gb]HAHJE=YmmmprtZClvt†FW`WGIP[fghgb[RH:1+)*/4;DNW`dfggfdba`_^\YRIB:0*()*-11479>HSZckquxy{|||zyyy|€ƒ‰‹‹‹‰‰‡‡‡‡ˆˆŠŠŠŠˆ…ƒzxwvuuvvvvuusmgc\SONSY_cgmt|ƒ‰Ž‹‰‰‰‰ŠŠŠ‹Šˆ…€ymd]\`gotuusqonponnnnnnnmmnnqqv}…ŽŒ‹Š‰‰‰!#%%"   ! !#$%%()()+++,--,......././/----,,,,**++,+,,,,16?FLOSX[]^`_`_\WSNHA:532233334433433321///0/-,,-+))'''&&$$#$%$$%%%'+059=ADFJKOU[^cfjnrrstvuwwwtsqomkif`\VPKB:756889::9867566655554331111237BVjy„ˆ…‚yeF,%'%')*06;DSbmhk]dxqxyxyrsrwƒ……ƒ†‚‚……ƒ}~xpg[QOLLGGECCCAzž•Š„ƒY.5A`VCHMJHEBCCBA@?^n^BXlg_XSRNOMKGHMMKMLTVWVXZo˜•„oUB8;:576421.--Dj|‰Œ€eTNJDAIJ/),/32<:,*19,'4?94343413400334331000149<:=CLD/).375BM;?UXQSV`mZ@DPb]KD@B[njnpmpvweEb¨’Kd]LBJQ`hhigb\SH:1+)*.3=GOY`dfggfdba`_^ZWQJB:322337;;<<@EMT\emswyy{||}{xxx{€ƒ‰‹ŒŒ‰‰‡‡‡‡ˆˆŠŠŠŠˆ…‚~{ywvtsvvvvuusmhbZQNOSY`dipw†‹ŽŒŠ‰‰‰‰ŠŠ‹‹Šˆƒ{rh^ZZ^ekrvusqopnonnnnnmmmmnnrrzƒ‰Œ‹‹‹ŠŠ#$&'%   !"#$%%&'()))***,..-.--..-.///.,,--,,+++++*,+,**+-/4;?DIMQVY\]_`b^]UNLB>7312233343333221111//..,,-**)''&&&%$#&%%%%)+/39;@EHNQVWX_fjmnquxzzyxwurpkkgeb^YVQMFA;74446578788665544444443211000023;Lbu‚ˆ‰‡rY=)%$%%(.1:GS[^Yacfoqqkiopu~‚„€~||xy}‡ŒŽ‘”•“ŽŠ‡{l[LA>>B><9;X˜‘Š‡ƒ€q4/=X[IKMKKTFDCE@>:_•jg`ecZSPLPOMGHJLMRMM[VKQTd–ƒl]QE;2247641.,*-He|ŒzeV]WQSOD::249?<007:+(+44644438:EOD=7542/--0.038:?>E>5/1:?@?85EURYW_mj[LNLZmS]etuls€twtyvUcODS[TAHWfgghhc[RG92-+,27@JSZaegggfecba_^[XTOJD@?BGHMOPPPSSX]ciqvzz{{{{zxyyy}ƒ†ŠŒ‹Š‰ˆ‡‡‡‡‰‰ŠŠŠŠ‡„‚}ywwuuuwwvvvvrlg_XNLOTY`elsx€‡‹ŽŒŠ‰‰‰‰ŠŠŠŠ‹†ypdYRU[cltwtspnmoonnnnlkkkknoot{„ŒŒŒŒŒ#$&'&"  !"#$&&''()))***,..-------.///-,,--,,))++))**+***+,.36<@DGMPVX\_`a`_ZRKE=512233333333221111//..,,+**)''''&%$%$%(*+/49?DHLRVY\`deiptvwxyzyyxtpnigd`[WQNJHC>84311124455766543333333332111//-/015CXl~ˆŒŠ†|jQ;&%)45.0<KNGGGONNRMQTWVUZhruyvvuw{„’’“––—•‰ŠŽ‹€r[H>889759~–ˆ‚€Q=?Q_PMNLIJFCDB@>7Uš’‚vgVZ`YPMRNHEEJHKNNNYYSHJS’ˆq]IC43789952-***0J`|•–nadcsk\XSMD738DHI@7+/355326GLIKF67:864:A=8/+-7>AM]A2?CHBHG=GMQRU^gd]UVU`egIWorpmo„~hib[\[YMDI[`H;FOffijfa]SJ<2-,/38BKSZaeggggecdcddeeb_^YUXX[`ehillnnppstwz||{zzzxwxxz~„ŠŒ‹Š‰ˆ‡‡‡‡‰‰ŠŠŠŠ‡„~{ywuvvwwvvvvrlg_WMKNTYafnu{‚ˆŒŽŒŠ‰‰‰‰ŠŠŠŠŠ‡uk^SMQYdmsvsrpnoqonnnnlkkkkkmns|…‘ŒŒŒŒŒ!#&'&#   "#$%&''('(*+***,-/----....00.,,,*++*))**)))***)++++,.259=@EJQV[]__`a\UNG;52222223322210000....---+**(((''&&')-/38;BHMQT[_bfikpstwy{{zyxurolid`[XRLHD>;95211100000033333322222422222210.----.4<Lez‡Œ‹„ueO9)6SUJGT\ZQPQSTY_PJFEFG?FILU^gp{ƒŽ’‘—˜•‘xyw‚’•{aH93467H‚‰‚}jKGWcUOSMEFCBBB<7Frž—†ymZTXZVPIFEFGIGHHIKOPIFJQŽˆ€eA52>C>;720)()**5Ld‚”“ˆ}wturcbXLKLB<MNF>7;:75427<<:>??;:758DEK;.112>JOiqO/=RNLTQR_sZLRZgQ]R;=\fYOT`\^ZYb^VPQID@LJ@ENA<H:1^kkjhb\TI;1--/5<EMT\dgighffhjlnqrqtsppptyz}€ƒƒ€€€ƒƒ„„‚~}|{vuy}ƒ‰Œ‹‹Š‰‰‡‡ˆˆˆˆŠŠ‹Š†ƒ|zxwwwwxxwwutrle^TMJLS\ciqx}†‹ŽŽ‹Šˆ‰‰‹‹‹‹‰†~vgWMIOYbltutrpnnnnnnnmkjiefiknuˆ’‹ŒŒ‹ "$%%" !!"#%%&&'(()****,-..,---....//.,,,*++*))**))))****++***+-257=BGKRY\_bba]TLF;5222123321010000....--,++*(((((++.14:>EINUX]bhjmpstvxzz{yxutqojfa^XROIC=:623210/////00/02222112222243200000/.-,,-.16EZp‚Ž‹‰€yiO:CXWQRK]mpbeh]e`YdcRKE>DDEFGDI\mŽ•––‘ŒƒŠ„”™œš•ŽzYA7<GLh‰}rnngXLOMDDB?A?<;bŒŸ™‰~si^XUQMHDFIJJHGFILEFEGMM~ˆymF<7BGD@80(##%')*8P`xŒ“„ujuiqxdikYJW^QC<97840/025668:89GOG9CC7**+1Nhkmd_HBGCTPOS\mcL]fZMG9CNj[CcieXIIC??ELF77?MYRMGKQ[4Ogkijhb\TH>51139AHPX_cfijlnpqsvz}€ƒ†‡…†††‡‰ŠŠ‹‹ŠŠŠŠŠŠ‹‹ŠŠŠŠŠ‡†{z|€‚‡‹‹‹ŠŠˆ‡‡ˆˆˆ‰ŠŠ‹‰…‚|zxwwwwxxwwutqke^SKINS\dkry€‡ŽŒŠ‰‰‹‹‹‹‹‹‡„|rcQIGPZeotutrpnnnnnnnmkigbdfhnv‹‘‹‹‹‹"$$" !!"#$&'''()*))++--------.....--,,,*++***))(()))*****))**++//48<BGNU[addd]UME93311222200011//....---*+*)()*,/58<BGMPT[_dhmprtwyxxxwvtrpmkgb^YTOJF>;511000..////////./1111112211132111/...-,++,./2<Pg|ˆŽ‹Œ„xrww|~ufQ??Pcuy\OWX_nwtaICCCDFCACDGK\q~~}…Ž‘–•Ž‹“šŸœ•–•Œyc`ny…–ƒ~ŒŠ‚qXLMIGCA?=ELV—Ÿxmb]]ZRIHGHHIHFEFHE<=ESYl†tmiQ@>BFDB=3&! !$'*+>Q`qƒ„tniu~tvpebcZ\G;<;961345369585D;;?;7;65-/9^pqeV]UTOODLSV]WSN\KEPHBZL^m]_`VM+.953674=MQcl_UGDOecihikkgc^VI?8354;FKTYbgnprvvz}ƒ‡‰ŽŒ‹‹‹Œ‹‹‹‹ŠŠ‹‹ŒŽŽŽŽŽ‹‰Š„€€ƒ„‰Œ‹ŠŠ‰ˆ‡‡‡‡ˆ‰ŠŠŠ‰…‚|{yxxwwwwwwutrkd\RIHMS\elrzƒˆŽ‘ŽŽŒŠˆ‰ŠŠ‹‹‹Š‡ƒym^MEGS]hqtusrpnnnnnnomkheccdhoxƒŒŽŒŒŽŽŒ     !!"#$&'''()*))++--------.....-,,,,*++***))))))**))**++****++-04:@GOU[beif]VJB8322122100011//....--,++*)*,148?CGNT[\bhkoruwyyxvusqplkigb^YTOKEA:62/--./--.-...../.../00000011000221110..,-,++++-/7E[rƒŒŠtq‚’•‘‹ƒ~{qXMQdZ`QJPele~|\QHEDDGFCAEFEGIV_’•š’’‘”—žœŽ”—ˆŒ‘‘’•…~|~…XhXJLKGC@A==Co“¡§›Œˆ}ukgdcaaMH]f`WIFEEC929H\hx_`XGDCEB?>8-"!#'*+,/:M\jw„‡‚xw}~‚zuj^OUH<DHOXT=:@<67B42>?CFZU<>31547Uid\V\[Q@;Cajh^\ZUFDL?AMXHVh^\NEK?G;?6?CH\ehxoNL=Aeffijkkgc^VLA:679?FOW`hotw|‚…ˆ‹’’’ŽŒ‹‹Š‹‹‹ŠŠ‹‹‹‹ŠŒŒŒŽŽŒ‹‰ˆ†ˆ‰ŒŒ‹Šˆ‡‡‡‡‡ˆ‰ŠŠŠ‰…‚|{yxxwwwwwwutpjaYPHGLS\elt{ƒˆŽŽŒŠŠ‹ŠŠ‹‹‹Š‡xiVIEJT^jrtusrpnnnnnnomkhebbchqy…ŒŒŽŽŒ!!!"#$%''()()**,,,-..,........-,+***++***))))((((((()(())*'))++-29?GNU_dgjd\RKB:55431200010..//.---.-,,.168?FJOT[_dilmpsuwvvtromihea`]YUPLFB;710.----.---.-----.-..//./0000//00121122/.++,+**))),0:Ndxƒ„z|‹‘Šƒ…Š†ƒ‚‚}zlX]nbVOe„‚w|n`OEAFFEHEFHJLJA?Sn‡•““˜šŽŠŒˆqŠŽ””Ž„{y{‘q…]HJKEA?;::J}—£§œekƒ~unlkjii•–’Œƒx\F>713Kekrnea]MHDDA??=2(%'),,,,-:L]gpv{†‘•„‡uoaQbVNWUXUX>5ECEBD16A:FOKFC0.;9,4JZSNP\UF=FKTLQILQUGEGJMVWHIXZM@EOIG8?C89DXny}ysR4=Qhgggijlhb^WNE=8;<CLU_gqy}†‰‘’’“•”’’Ž‹Š‡‡‡‡‡ˆŠŠŠŠ‰‰‰ŠŠ‰ˆ‹ŒŒ‹ŽŽŽ’ŽŒ‰ˆ‡††‡‡‰Š‹‹Šˆ…‚|{zwwwwwwwwusog`YOGFLT]fmv~„‰ŒŽ‹Š‰‡‰‰‹‹‹Š†€whTHELW`kruurrpommnnnomjgdaachq}‡Ž’ŒŒŽŽŒ! !!$#$%''()()*+,,,-../........-,+******))))))((((((''(()))())++*+06>EPY_gkic[SMEA=876521010/.//----+-/137<CIOU\aejmpsssstrpomjeb^ZWSRNKEA;641,,,,,--,-,,,------+-....-.////////010000/.++++**))()*2@TeosŒ…‚yvv……~~\Rksnf]o‡|umg[WPEEJRKEDCEIKGGJ^–‘“”˜™‰ˆŒ‹†rw†‰‚€zxyŽ“”ŽcGIIEBCOG8Qˆ¦©£^,X{yxvzz„•Ÿ¡™“ˆydM>6/8Selsnga^UKA?A?@>81*.///-+*+:P[gjl“¡˜–˜†{kceebXTDVM<>B?IA0=;AF?GN:.?VD-5IT[JAJ<<LLHP5:<@FWVFEEON\f_M85GYKSL67RY?DJfp_jrOCWcfghhjjlhd_XOF><>BMV_is}‚‡ŒŽ‘“”””””“‹ˆ„~{yy{~€‚ƒ†‡†‡‡†‡‡‡‡‰‰ŒŒŽ’““‘ŒŠˆ‡††‡‡‰Š‹‹Šˆ…‚|{zxwwwwwwwusog_UJFEKR[clw…ŠŒŽ‹Š‰Š‹‹‹‹‹Š†€ufSIJR[emrssqppommllonmjgd``cis~ˆŒŒŽŽŒ!!""$$%&&')*(**,,,,-,-........,+++++**))))))))''((''''''))())()))),19@IR\dikib\WQKGC>=;9533100...-,-//47:?GMTZ`cgmprrtsqqljhea\XTOLHEA=9510.-.++,+++++++++,,--,,,,------.........//.//..,+**)))))(*+5FZf|~†ƒqbphioWXeX\ggd__qƒ’„tlgbZMDFJPJEECDGIKLLOx˜’‘’—ž—ŠˆŽŽ…u}ˆy‹Œ{wv‰ŽqDLKIIC?>7ZŸ¥ª¥Š+4Mr‚}y{‹›¡ ”Ž†t]H;4/9MYbghc[VTOA>??AB>813310/-+*+5L_hdk˜¢¤¤¤¢˜~`VhqfUOaVE<HW>2<:DORK>/&4GWE2;GUcVCED5;F[S<737:EDHB1:AFab8<Y_XL[PKSnh`c`jnNV_]`fegefijkkheaXQHBCHNYbku‡‹‘’”””’“’Ž‹‡€xrlfb``bdgkorx{|~€„„……†‡ˆ‰ŠŠ‹Ž‘‘””“’‹‰ˆ‡‡†‡‰Š‹‹Š‡…‚|{zxwxxwwwwurmf\PGDDJPZcmw‡ŒŽŒ‹ŠŠ‹‹‹ŒŒŒ‹†€ufVOPW_gostrpnponnnnnnmjgea_djt‹‘ŽŽŽŽŽŒ!!""$%%&&')*+(*+,,,-,,........,++++++)))))))))(''(''''''((())(((((*.3:BLT^dhjhc^XVRNKFC?=:8632/.../0369>CHPV]agjmptrpnljfb^[USNKFA=9311-,,--,++*++++++++++,,,,++++,,,,,,--.......//...--,+**))))))(+5Mpzyuqmii^\vso}wtfZ]bTKTbuŒ†uimmgVDAIHJGDEEFFHILMu–Ž‹—ž•‹Œ‹ŽŽ‹Œ’‡Ž‰zvv„‹‹‹zKGHFFEA>5c“¡§§¥šW2=?FI>Aj‡š™’…€ufZS;11>LXZ]^`XTPMC=>BDGB?966431.-)*+5Rb_]n€Š“ŸŸ›‹xixsh`[WZKGV`=94;AGFH89>H<E>9<HQYN<;_C=FZ^E1.66<HE@=EHHT^enkgeieimlfPUi`fl`ekiiecfgggkkkjfaZSLKNRZdoy‰ŒŽ‘“’’ŽŠƒ{rj`XRJFEEGKLR[_glnsvz}}~~€ƒ„…‡‡ˆ‹ŒŽ’ŒŠ‰‡‡†‡‰Š‹‹Š‡…‚|{zxwxxwwwwurne[OEAAGQ[eoy‡ŒŽŒ‹ŠŠ‹‹‹ŒŒŒ‹†€wh\RTZclsttrqpponnnnnnmjgebadlvƒ‘ŽŽŽŽŽŒ !!"$%&&'&'()**++-.----,-.......-,,+++(**)(((((((''((''&&&&((((&&')**/4;DMW\dhhgdd`[YWRQMIECA:6522237:>DHNTY_ehkmnonmjfa^XUPLJE>;730/.-,,++,-++**++++++++++++++++++++,,,,,,,,--------,,,,,+**))))((+0a}oeivodi^f{zym]f`^|ucdlt|‹Œ“Œ…yudUKLLGDEDFFJMMJi”ŒŒ“›‰[r…‰‡Œ‘”‘†{yutŠ‘‘‹\DIHHCA<:rš£¨©¦št0<;974/P~‡‚yqeXPG5:BLRRTVXUOKHD<9AJKFD@;97651.+.17@V^[bkt~„ˆˆˆ‰…ƒ‚~uiUPUTUddLB7522;><?@4779<;:=A:60-:;>7gZ3-0>NA6<JPRLcxwrpnkjikii`Vhs`Zqqmihfeffghjmmljida\YY\cju~†ŠŠ‰†~ti`UKA>;<;;:<>BJOWagosvxzz{}€€€ƒ…‡ˆˆ‰Œˆ‡‡ˆ‰Š‹‹Š‹ˆ†~}{ywwxxwwwvvqkdZQFABHR\hqy‰ŽŒ‹Š‰Š‹‹‹ŒŒ‹Š‡€vj^YZ_gnuvtrpppnnnnnnnmjfdbabn{†’ŽŽŽŒ‹ !""$%&&'&'()**,,,--.--,-......-,++******)(((((((''((''&&&&((((&&&(**+/3<GNV]bdfedcc`^YWSSPMJEA;988==AFKQW]`bhjkihhea\YTPJF>:731//-++,,,,++-,++**++++++++++++++++++++,,,,,,,,,,------,,,,,++*))))*-3G€zqzwtwiikgju`MK[\egebd_g{}‡€“›££Š†xUCHHEGHHIHIIG`•ŠŒ™ˆ/9OcqˆŒŽŒ„ywuw‘šš˜•h@GFEA@=Ey™¢¥ª¦19;;;949fy{zvqg_XPLGGHIJNPNPRNJIF=4@NNKECA?:7642247:7CW]_dlpqsusvwrjhjfVIMUZQVXN12,9E?<IJ29<881/9KD00794<9=Q+,1692HemRPJqzvronkkjjknmqqu]Jmrnigffffghikklmmljijkpv|„ŠŽŒŒŒ‹‹‰†€}vme]VOGA>=;<<<>?BFMV]fmsvwwvwy||~€‚…†††‹ŒŒ‹ˆˆˆˆŠ‹‹ŠŠ‡†~}{ywxxxwwvutnjc[PE@CHQ\hq{ƒ‰ŽŒ‹Š‰Š‹‹‹ŒŒ‹Š‡€vj_[]dkquwupppnnnnnnnnmjfdbaep~ˆ‘’ŽŽŽŽŒ!##$$$&%&('()++,,,,,-........---,,+****))))))((((''(((('&((''((''''(*)+05=ELRX^acdcedaa^][[XTQLHEECDIMPV[_bdgihgda^[SOJE@:61--,,+++++,,,,,,,,,,++****++**************++,,,,--,,----,,++**++,,)+**.7Qdxdf‚…€ppffibOMLNMZgm_TOL^hpj€‰‘¥¨¡œ’xU@IFHIGIJHHHTŽŠ‹‹”Œ@;;<Ig}‡Ž‹{uvwx”žžšzBAFJC>>V~˜Ÿ£¦¦ž}.9=<<:54Jgkljf_VTPNKJKJLNONNNNMKGA5APRPIFFE?<96:;;8799LX]`ejjptvxpZGFHJIDDGQJFHG>;C26<?<99EC=9:;B<<<35<17;?`SK?<<F[ebSOY{xurnkjjiijmnqrsmktpkigffgggihkprtvuvxz}†ŠŒŽ‹ˆˆ…„~{xrmhb\YRME?;:<==>?ACIRYbhptwvvvwyzz{|~ƒ„„„ˆ‰‹‹‹Œ‹‹‰‰‰‹ŠŠŠ‰ˆ…~|zxxxxxvvwvsojcXNE?BHR]kt}ƒŠŽŽŒŠ‰ŠŠ‹Œ‹‹Š‰†wh__bjqvwwtrqpnnnonnoomjfeacfr€‰‘ŽŽŽŽ !"#$$$&'(('()+,,,,,,-........---,,+****))))))((((''((((((((''((''''''('*,4;@GNRVY\^^_aa`a__^\ZVSQPPPTWZ^_acgffb^[WSLGA;50-++**)+*+,++,,,,,,,,,,++****++**************++,,,,--,,,,,,++++****++)+,+0Nsysly…ˆŠ„}|vsyydUP[[K`gdb][V`cd~œž¯³­«¤Ÿ—‚G@FILMMLIDBG‰†‹‘ŽD4>>?E\y††„ztwy{—œ›œ™ŠN?EGD@?h“››Ÿ£ž}.68;:8617S__\][TMIIHFJNNNMMMLKLLLF@JRSVGDHIFD@<=BFB@>>DTXZZ[__ehnpne[TLB;<<GSPV]]Z8-4857;7BC;>B01;CSL8@769<OYID:8Xut\QLp{xsomkiiihilnqpnputokigffggijkpty}‚†ˆ‹Ž‹Š‡ƒ}zurnlifc`^]WQKC@<;;=>?@@EKV^dlsyxyywxyyyyz{}€‚‚ƒ„ƒ…†‰ŠŒ‰‰‰‰ŠŠ‹Š‰ˆ…~|zxwwxxvvvusniaWMD?AHT_lv€‡ŒŽŽŒ‹Š‰ŠŠ‹Œ‹‹Š‰„}rg``hmuwyxvrqpnnnonnnnlihgdejv‚‹‘ŽŽŽ!"!"#$%'&'())**+,,,,,-......--..-,,+****))((((((((''((((((((''''''''(())'',07<CFJNQRVY]_^_`_a``a^][[\^__acdecb^ZTNID<52-+**))*)++**++*,,,,,,,,,,,,+++++++)************++--,,--,,++++++++*)****)+-/I~x|~xw„wvzvpkffoghYFcpWWfcdefk™­°¬¯²¬®«¡wC<HKJGJEAABm‡ƒ„Œ’k.:>@@@Srƒ‚uowx|“˜˜—–“aCHHEADy•›—˜ ›q-6899:973>QVUWVRNJIIGGJMMNLMNJJHIKN\e`UEEEGLLJFDSbSCCB=OWUTPKGIOSY[Z\XK::ILROKIRXK=:.5?9:8>B:86.(*,44(9757?H<B>;<h}‚UM_„|urpmkjgghiintoovtspmjhhghjkosx|€…‰ŽŒŠ‡„~vplgfc_`a_]]ZUOHA><<==>?@BEOW^hpv{}|{xxzyyyz|~ƒ„ƒ‚†‡ˆ‰ˆŒŒ‹‰‰ŒŒŠ‰‡„~{zxwwxxvvvuqmg^ULC?AIUamxˆŽ‹Š‰‰‰Š‹ŒŠŠŠˆƒyoeacjouxzxsqqponnoomnmkjihefmy†Œ‘ŽŽ "#"##$%'&'())*+,,-,,,-......--..-,,+****))((((((((''((((((((''''''''''((''().26:@CGILMSUWX\_aadedcaaa`adeca`]YRMIC;2-*)()'****++++++,,,,,,,,,,,,,,+++++++,++**********+,------,,++++++++*))))))+,?y‰j|{|y€Š€ur|}ypvy~vj\QXkgSGdwyzy‚¨­ª³¹´·¹±›h7IHGFFCCC=WŽ‰}„‹’S4@?=@BNpƒtqxz~””——–xHHLFBG˜“Œ–Ÿœb,699::8521<KQQSQNMLGGGHMJLKMMIGEEKSWWVMJFGILQRPMQ^]PMC9HVRMD=9666:999510:FNQA=ADD8?><HI>9?DE95535/$2<=CA6;CD>:878ENMEMho}|xupnkhgghiorquuuspnlllnopsv{€ƒ‡‘’“”’’ŽŒ‰„|ungc`a_^^^_^\[YTMG?<:;<<=>@DIQ[ajv|€~{yyzzz{{€ƒ‡…ƒ‚…††ˆ‰ŠŠŠ‹‹‹‹‰‡„€}{yxwwxxvvusplf]TJA>BJUcp{‚‰ŽŠŠ‰‰‰Š‹ŒŠŠ‰‡‚xmc^bipuxyvsppoonlmnnomkjhgfgp}‡ŽŽŽ‹‹‹  !!#$$$%%&'(())*+++,--......//-----,,+****))('''((((''((((((((((((''''&&&(''((()-036:=AAGKLORVW\^bbcccccaaa_[WQMHA;3.)'(())((*+*++**++,---------------,+++,,********+++++,----,,--++++++***((()))*7k‘qXowz‚††~€€„|nvspwphcVc}oG4Xv|z…œ£®·º»»»¹­ŠBBELJDBCD>F~Œ‚}…‘ˆ=8?>>ECa‚wsy~…ˆˆ“––‰ONIFAJƒšž›š›š^+677999730-8GNOOMKKIGGFKKMKMMJHFCFSMKNRSIIIJQVW[aiYLJB9EVSJB>@EH@:2//--07CE7223:;>C>DMK?=9BH96864479AC943<A=;9::=<748>@BJOXcnmliggiililtvuttqrrtvvx|€ƒˆŠ’”“•”‘Œ‰„~umgb^[[]]^^^]\\ZXRMH@;:::;==@EIS[foy€……‚€~}{yzz{{}ƒ…ˆ†…‚‚ƒƒ†ˆ‹‹Œ‹ŠŒ‹‰‡„€{ywvwwvwvuuupke\RG@?CKYgs}„ŠŽŽŒŠŠ‰‰‰ŠŠŠŠŠ‰‡ui]]ajouxxusqppnmlmmoonlljigjs~ˆ‘ŒŽŒŒŽŽŽ  !!#$$$%%&'(())*++,,-.......//-----,,+****))('''((((''(((((((())((''''&&&''''''(+*,.0156;?@CGLPTZ]^_````]\ZVQLGA:3.+)'()((())*++**++,,,---------------,+++,,++******+++++,----,,--,,,,++***())))*,GohWYqu|‰†‡ƒ‹Œƒ}‚€{qulpmXEdsjRG]ft‚˜¨µ»»¼»ºµž]7>AEBCC?@Cd‘ˆ~~Š—f1@@>CHq€xxz~{zŒ•—[@EGHJ‚›œžšš”Q07:9:9863/.0;EMONMKIGGGEKMKKJHEFCDXQLNSTHIIKMU_rwod]KB=M[RHGMQRPH?30/00022//0325;;F;;EB938>A=7979:>>82363BO=6589:<;9=CB9:BEHR]aagihjootyzyyxvxz|~€ƒ‡‰ŒŽ’“•““ˆƒ{skc^]\[XZ\\\]]\\\YVRKE=;:9:;<<>EJR_gq|‚‡‡…ƒ€|{z{||ƒ…‰Šˆ†ƒƒ†‰‹ŒŒ‹ˆ†‚~zxvvwwvvvuttoid[OF@?EMZft~…‹ŽŠ‰‰‰‰‰ŠŠŠŠŠˆ„|re\Y^gnswvrqpppnmlmmonnmljihmvŒ‘Œ‹’“”’‹ !""$$%%&&''(****++*-............---,,+**))))((((((((((((((((''''''((''&&''''''&&((((++*-1468>BGLOQUVVYYWURNKE@83))''((')(**)**,,,+--,-......----------,,++,,,,+*++++++,,--------,-,,..06+)++**)*,5Y^cw^k~ˆ€xˆ‹||{{qmvoxu\AVp}ucY]b{Š‘“£¯º¼»»º¸§p06=BADEDDCNƒ†~}‚’ŽH1?BKm~|{€€†‰‰‡‰Ž”•e?CCEP—œœŸ›™’@3;;:::9863/.0=JLMLLLJJGIKMIDCAEDEEX[MOTSBHIKMN[mmlgfI?D[^RPVWWVK@82.*)-.../../147984852.1;A>;;69:;<981::144728BIG>75>CDFC>9?PX[Y\dmqtvy}~}}}~ƒ„‡ŠŒŒŒŽŽ’”’Œ‡‚{pg]WXY[\\]]\\\\\\[[WUPJD<:99:;<<@GKS]kv…‰‰‰†ƒ}|z{|{€„†Š‹Š†ƒ€…„‡ŒŒ‹Œ‰…‚}zwuuvvvvvvtrmgaYOE?=EQ^kv‚†‹ŽŽŠ‰‰‡‡ˆ‰ŠŠŠŠˆ‚xn_VU[blsvvtqponmkklmoppomkjjoz…Ž‘‘Ž‘‹‰ !""$$%%&&''())**++*-............---,,+**))))((((((((((((((((((''''((''&&''''''&&(((())((+,.257:>BDIJJMNKHGC@:2,)((''(('))*+***,,----,-......----------,,,,,,,,,+,,++++,,------------..4S@(++**)*2HRnŠ‡Šqim~“……ˆƒ{{€vprmM?UBbxx|nX_j€Œ˜Ÿ¨²»»»ºº¦t47<??CECCCFcyzƒˆD-C\ƒ~|}‚……ˆŒŒŽ’’zIFAFL–ššœœ™•I5<9::::9542.+4ELONNKIJLLMKGLPRPKDAE]ONTS?EHJMNQ^b`^^MKR]]Y\_\WPE=86-&'*++-----0125@A><<FGHBF?<79779345631/26137:9?<:><?EKJGA7=Ni`H]x|z}ƒ„……†ˆ‰Š‹Š‹ŒŒŽŽŽŽŒˆ€xlcVNLPTXY[[\\[[[[\\[YWUPJC;:989;<?BEMWajs†‹‹Šˆƒ|{z{{|€„ˆ‹‹Š‰…€‚ƒ†ŒŒŽŽŒ‹ˆ„|yvttvvuuuutrmg`XKA<=EQ_lxƒ‰ŒŽŽŠ‰‰‰‰ˆ‰ŠŠŠŠ‡wl]SSZcmtwusqpomlkklmopqpolkmt}‰Ž”ŒŠ‰‰ˆˆˆ   !!""$$%$%'((*****++,.......//------,+,,**)())''''((((((((''''''''''((('''''''''''))))))))))*,/0357:?AAABA=;62,)'&''(()))))*++,-,+,,-,-.....//////----------,,,,,,,,,,,,,,-----------++,/1-*****+,AX_{xƒ~RJTe†‡‡‚ˆ€ttwsupbT>Lut€‡rX_oƒž¥®´¹»º¹£i17:<>AA@@FCDm‘†}{}€Š‰;2gƒ€}€…‡‡‰ŠŽŽƒVKDDK}’–˜›šš“P59:;<;;:941.,/@KPPLJHHLLMPQQQPMG:01aVMQM4=CFGJV]ba^^bbddddc`ZRE<977.'')**+++,,.0019=AHKFFOOKEB<E>FORF?961433453538CF=@A9:@GKIG?7QaV^tƒ†Š‹ŠŒŒŒŒ‹Š‰ˆ‡‰‰‰‡†…wndVMFFLSVYYYZZZ[[[[[[ZZWTOIA::989;<=AJX^alw€†Š‹‹‰„€}zzy{}„‡Š‹‹ˆ†‚‚ƒ‡‰ŒŒ‹†„|xvttuuuuuutqlf]UI@:=EQ_mz…‹ŽŽŒŠˆˆ‡‡‡ˆŠŠŠ‰…~wi\QSZenuwvtrqonlkklmnoppnmkmu‚ˆ’•’Ž‹‰†‡‡…ˆˆ  !!!""$$%$%'((*++**++........//------,+++**)())''''((((((((((''''''''((((''''''''''(((())))***)*,-..13677762/,)((((''(())))*+++--,,--..//../0//////-----------,,,,,,,,,,,,,------..---.-,-,,,**++-8OQy‡€Tb[OJMi›™‰†‘Ž|ty|z€yoH?^xxu„†nScq˜¦©¬°·ºµšN/9:>>=@A>ABBK{Œƒ}zx‹@wƒ}{‡‡‚†‹Ž‘‘‘’mNLEI|—–——–’U59;;<;;9743.-,9IOSVWWWWVSQY[XOB3,(,]^OPJ,/49?T[`e_`jlmhiiij`TF?::992)(,*++***)*-..2=IKMPNXOILHAFMQVNB/264//1460/8K@;85NTIA99@DGA9=Q[Tk‹‘Ž‹Š‰††„€~}}}|yxoj`VLFDGKQTXXWXXXYYYYZZZZVRLFA::989;<?ALTW`lw‚‡Š‹Šˆƒ}zy{{}„‡‹Œ‹‰†…‚€€ƒ…ˆ‰ŠŒ‰‡ƒ~ywvusuuuutttqke\TI@;>FRan{†‹ŽŽ‹‰ˆˆ‡‡‡ˆŠŠŠ‰…}sfXPS[gqvwusrponlklmmnpqppnmqyŒ”—”‹‹‡†‡‡ˆŠŠ  !!!"#$#$%&('()++++,,..////////----,,-,+***))))((((((((((((''''&&''''((((''''''''''(((((()))*))******,,----+*)('&&((((()))**+,,,-....//./001111/////-..//..--------,,,,,,,,----..........--++++,-0JKP…bMHEJSh®©¡›— ˜Œ„vvopkoO:;Hb„Š„~iV\yŸ¥§§©³©|729<=<<?A@B>?BQƒŠ‚{{v€wƒ|w|ƒ†|„ŠŒŒ‘’“‘{ROGIx•“””“`7<;;<==:841/+-8Xmvuoja]YV_eb\K4&%%'TcLLH-..0T`fbaexqpigjkml\IB?<===6/12210.)(%'+../9ALOIV`QJF?GKLEEJF1#093-./0,/?Mx_C<EPTSL=9:==A8<MXj“ŽŠˆ†…|wsrrqssqoke\TJFEHLRTXXXXYYZZZZYY[ZVQMGA<989:<=>DIPYboy‚†‰ŒŠˆƒ€}zxzz}ƒ…‰Œ‹Š‰ˆ„ƒ€‚‚…ˆ‹‹‹†ƒ}xxvstuuutttspjd[SG?=>HTcp‡ŒŽ‹‰ˆ†††‡ˆ‰ŠŠŠˆƒ{qcWQW`jrvvurrponmmmmmnqqqmmot~Ž–”ŽŒ‰‰ŠŠŒŒŒŒ‹Š !!!!"#$$$%%&'())))++,,--..////..----,,,+****))))((((((((((((((''&')(''((((''''''''''(((((((()*))**))))))*****))(()(((((()))*+,,,-.//////./0011111/00//..//..--------,,......--....//......--,,++-.5VIh‰KGEXr†—¡§­­¬§¢›€†‹}okmsr]??83Gmw‚~Y]p€’ž¤¡ŸŠO4;;:::8;:<?>BMOd‰…{ywy„Ž‰|x~…€~ˆˆŒ’‹‰ƒSIHOp‹‘””’‘Œj:<;=<=<85400..[€„}soi[WUTZ]]XE,&)(*HlULJ/,/Tkkkgl{yojhegkme\RJEA@B?<9768630*##$(,-./8AFQ[`RKLTQZc_WQI5!+<<1.00.+*<v‘”‡eI?JPPQN<7BDB:CWhŠŠ…‚|{vqliiiklnnmhc\SJFFIMQUYYXXYYZZZZYYYXVQKE@:98:;<=AFKT\dqz‚†‰‹‰‡ƒ€|yzz{ƒ…ŠŒ‹Šˆ‡‡‡„ƒ„…ˆŠ‰†‚}xwutussttttrojd\RG?>CMYer‡ŒŽ‹‰ˆ‡‡†‡ˆ‰ŠŠŠˆƒzobVSX`jsywurqponmmmmmnpqpomm}”˜“‰†ˆ‰ŒŒŽ‹‹ŒŒ  !!""""#$%%%&&'((')***+,,,,....//.-----,+*)**(())))))))))))(((((()*,)&(''(((((('''(''''((((((()()))))****))())))((*))(())(())*+,....//.//1111111111221111/////.------..----,-...-............------./?]nnnG>aŽšŸ¨¦¡££«ªª©Žwx|zb[KHCDJqy}o^jwˆ“œ™’ŠlD:=:<=ACC?=<>BHJRmˆxuv|…Šzv{y…t}‘“‘’hEIQg„“ŽˆŽ‹u<9:<=;:944/.+K{~zvrpe_XQJHCDGB400-.AlZML01Ejmrox‚|vnifchlomh^XTPOIA=<9<986,%"#$&*..-.2D^eh\PVXdlinlidZG8846/--4<?EYvz…‘’‡oQDLTUR>9=DB8=WoŠ‡{xsokhgfghjllmoic\SKGFIMRSXXXXXYZZZZ[Y[XUPJD>:989:;<AGLS\gs|‚†‰Šˆ…€zyyw{‚†ŠŒ‹Šˆˆ‡††ƒƒ‚‚„†††…ƒ}yvtrstttttsomgc[QG?@FP\huˆŽŽ‹‡†††‡ˆ‰ŠŠ‰‡‚xm`UT\dntwttqponmmmmmmnqqpmp†——’‰††‡‰‹Œ‹‰‹Ž’  !!""""!"%%%&&'(()****+,,,,....//.-----+**)**))))))))))))))(((()))).9+'''((((((''''''''((((((()()))))****))()))))))))()))))**+-,,//./01001111111111222211/////.------..----,-..............//..----./EtzeCRBX¨¥¤£¦¨¥£­¯®«¢‘†„…‰wlj`e[eW_w{{efr{†ŽŽ‰tJB:A>==BIJOJDB??HQRq‰{wuw|‡‚sqy{wkn‡wbs˜šš•{ECM^†‘Ž„wŒŒz@68;;962110,8q}ywuuk`VSTMEA:;;<9644>hZPP39fjqtˆƒ}zroqslcftxofe_XQJE@>@=<7*$$$$&--.,),Gdeg^[[dqy…†‚}{~wa<04.+6FFD?CLL^`\s|}{[FGLFG@7?@=A[s†ypnjhgggghjlnmmkf]UNGHKORUVVXXXXYZZZZZZXUPJD>:989:;<BGNV_jt}‚†‰Šˆ„€}yxxx|€„ˆŠ‹Š‰ˆ‡‡‡…ƒ‚€ƒƒ„ƒ„ƒ„yvtsrsstssromfaYOD?AGR^jw‰ŽŽŽ‹Š‡†††‡ˆ‰ŠŠ‰‡€vj]TT\entwtsppollnnmmmnprmw—”‹‰‡†…†ˆŠ‹‹‹‹‘Ž !!""####"#$$%'''(())**+,,---....//.---,,,+****))))))))))))))((((((((''''''(((((((())((''(((())))))))))))))))))))))))())*)**++,-.,-..00111122222212111111110/////...-....-----..-....////......----,,./DmLB@EQ†¨­ª©  ¡¡ž¬¯¯¥ ¢›‘’“vnaenihfep€‚l`nv}ƒ„yT.4>D>?@?@@IEDM>:AFOIx‡}vsyz‚ƒuttpWa}wm{”•˜˜ŽUBEdš—‹r…~A77998432/0.G{‹yptpom`ps[:F@:;;;:8=]\PSA^jnx‰Šƒ~zz}|n__^iwtmeaYXUQKGDB>2'#"$#*1..+*+K^_aT\Ya`m{usyzzrjT504>?=978>Qlkb]]csi[NJFOPI?=@>A[x‚rlkihgffhjlmmnkc\VNLIKOSTVVWWXXYYYYZZYWUPHB=:87:::=CIPXakv~‚†ŠŠ‡ƒ{vvwy}…‰‹‹Š‰‡ˆˆ†‡……‚€ƒ‚ƒƒ„ƒzwsrrsrrrqppme^XNC?CJValy„‹ŽŽŒ‰‡†††‡ˆ‰ŠŠŠ†~tg\TW^gqvvtromlmmmmmmmomo‚“•ŽŒ‹ŠŠ‰ˆˆ‹‹‹‹ŽŽ   !!""####"#%%&&'((())**+,,---....//.---,,,+****))))))))))))))((((((((''''''(((((((())((''(((())))))))**))))))))))))))()++**++,,..-///00111122222212422222110/////........-----.......////.......---,,./=TGCDTt›³²£¦¨¢¤¥£ª§¥ž—˜¢¡•“Šqdcdimgfkuyt|`kv}z|j<,29?>?@???BFHJA<>AJMLy‡}uvz†ˆxl[V\w€†‘Œ‹“cCCOŒ ¡–^‚?78977744566M”‰~qŸ—•†~€P;DD<;:<<;S\NWeqs‰ˆ„€ƒƒ…xg`_^`bb_ab]XUSROMHF<)$#%$%.2/.++2N\_WGQ[]]amzywwurhijZJF>.6;5+*4T‚Š‹‰~g]SNPVNLM>8=>EZƒ~sigefhfijkmmmjf_XPMKMQSTVVVVXXYYYYZZXVSNGA=::9::;>DJQYcmw~„ˆ‰‰‡ƒ}yvvwy}…‰‹‹Š‰‡ˆˆ††„…€ƒƒ‚{utssttssrqpme^VLC?DKXcn{…ŒŽŽŒ‰‡†††‡ˆ‰ŠŠˆ„|rfZSY`kswvtpponlmnnllmmrŠ–’ŒŒŠ‰ˆŠ‹‰‡‡‡‰ŽŽŽŒ    !"""""##$$$$''('(((***++,,--......--..,,++,+++**))))**))))))))))(((((((((('&((((''(((((('''(('(())))))))))))))******)(****,-,--../00/.002011333322243333331100000/..//..--.----..-................---+//>FFCNq„¦²±˜š­®±²¶·¯¬£™’˜–~vi[ojdehnvz‚‚{jfr{{x_1,01:CDDA>=<9CJH::=HMCR†„|y||ƒŽ‰kHQTk€’˜“‹ˆ~mJCDv™ ¡Œs“v?:;;<>?@>CB2V  ‡}“—˜„opkU27?D?;<=<J_]gpo}ƒƒ††…Š‰rcbdfceb^UNTTURRPPNKC/%#$$&+442/-5DP^ZGCIW]\\ar~yqhimievhH:-0064./4R‹Š…a^r|viXKGCEGBA@Am„qjhhfgijlmlolg`YRMLNQSTVVVVVXZZZ[ZZZWSMF@=;::9;>>DLQZeoy~„‡‡†…|wvvx{}†Š‹‹Š‰‡ˆ††…†…‚€€€‚ƒ‚|wstrrrsssppmd]TJCAENZer}ˆŒŠ‰ˆ‡‡ˆˆ‰‹‹‡ƒ|qcXSZbksuuspnnmnlmmkmlv˜’‰ŠŠ‹Š‹ˆ†…†ŠŒŽŽŽŒ      !"""""##%%%%''(((((***++,,--......----,,++,+++**))))**))))))))))(((((((((('&((((((()(((('''(('(())))))))))))))******+*****----..//00/0012322333355334433331100000/////.......-...-................---+.09AEOp†°µµžŒª¯³µ¹¸³­ ˜’•š—”{zjbi`acst|€†‘~RbpxuX,(+17<@AB@>><;AA<=;AKH9ZŠ†}{{€†‹EIV_xŠ“™š—•‰tqQDEWˆ™–v‚JBBCDFDC@==92n©¥¢›~ˆ…|yg[IA7548?@;<:Cahkqv„…‡ˆŒ’•€e`ghjjhdd^M;=LRPPQPMI>*""%'*056425EQPRF@FHP[\_[bnhfcXQRYciK301./2/,-8o„€€rv„††…xM=FB?CELbsxmjgighjlnnojg`YROMNQTUVVVVVXZZ[\\ZYVSMF@<:;;:<@CHMT\gpz„‡‡†ƒ|wwwx{}†Š‹‹‰ˆ‡ˆ††‡†…‚€€€‚‚€}xtsssrttsqpmd]SGAAGP^ju€‰ŽŒŠ‰‰ˆ‡ˆˆ‰ŠŠ‡ƒzn`UV\dmsuuspnmlmllkngw—‘ŒŠŠ‹‹ŠŠ‡„‡ŠŽŽŽŽ‹"!""!!""######$$$$''''(((***++,,--......--,,,,,,,+++*)))))**))))****))))(((((((('&''''(())((((''''''(())))))))))))))******+*++,.,--..//01111112332443344444433332211000000//..........................----,,,/<DUt…Ž¥³´·¡œ¡«¥©©§¨£›’‹‘’‰|xqggemnqt†‹š ›SRjutR'(+.86:IDA?=<:9=:=;?GMDF{‡{y€…‹|GOXzŠŒŽ‘““yaFCDi™˜Š_DA?=?@=9:7R`B…®¢•Š‰ŠŽqhiZQC864324>C?<AWkntz‚…‹š˜igffimpmkf\B00>LRQRSRJ7&""'+,3659:@KROD7<AIPTWW]`cY\\H=72:GWO6//21/..I_gx{y{|~‚€wkobT>CHEEGEPPS^cgghkllmolga]TOMNRUVVVUWYYYZ\]\\ZURLFA>===<>BGLPW`irz€„‡‡†ƒ~yvxxy|}†‰‹‹ˆ‡†‡†††‡…€€€}xtqsrsttrqljd]QE?BHT`kx‚ŠŽ‹Š‰ˆˆˆ‰‰ˆ‰‰†‚xm^VU]fotusqpnnmjikjh~–—‘Š‹ŒŒ‰‰‰‰‰‹ŽŒ‰"!!!""""######$$$$''''(((***++,,--......--,,,,,,,+++*)))))**))))****))))(((((((('&''''''''((((''''''(())))))))))))))******+*++,---..//001111123234444444554433332211000000//....................--..------,,,/?Qo†‰˜®¦¥²p~¦Ÿš¤¬© ™Ž…“Šˆzsljckqut}…ŒŸ©­nJejhL*+&,.>MKJBAA?<;>;;=>DHFFwˆ~{{}ƒuJRv‡…„€‡ŽyrNFCKsrLE@?=>=<::5GdX©›—ƒ~‚€f[PMMC6643126>IHBE`osx€ˆ–“sqkkjklpspjX9./3BOQRRPA-%$'+-0;?BABFGHLB89>HOQNVYYXOC3,.1334BOO:7618;6N=<Spuyzub]kqq…m>LE>HHKMNQUV_dilnnnkgb_VQOOSVVVVUWYYYZ\]]]YWRLFA@?>?@BEJNR[bkt{€‚……„}yvwwy|ƒ‡ŠŠŠˆ‡†‡††‡‡…„€~€€€~yssrstsssrnhaZQE?BKXcny„ŠŽ‹‰ˆˆˆˆ‰Š‰ˆˆ…wl\SW_hptusqpnlkmjil‚––‹‹‰‰‰Š‹‘Œ‰""####"#%%$$$$$%%%''''(((***++,,----....--,,--,,,+++*)))******))**)))))((((('''''&(('''''((((('''&''(())))))))***********+***,---..//0010011132455665444665444332222111000//...........-.---......--,,,,----,0Ce€Ž‹¡©š«—pr‘¥®®¬¬§ž˜„‡“Ž‚€ƒ}pifnrs{ƒ„“©®ŠG_^]G..3.-6G:>FCB@<>=<<<=BKLHzrzŠ‡€|{€…ŠlMc{€yndk}‚_EDBLcpTFEA>===;:814Zj¥“€yvmeWLCBA74334:CKSSSEGOUX\s…‡|€€zqmlopvwqiS4-005HRTQH8-*+,.2>IMNOONGEF:8:>BJOOTSI@-+A`z›£¦¥¥£”~k]WF2=@5?Yosyzj\ayŒŽ‡†JCG<EKEUcXVUSWZ_ekkmmg_XTRQUVUVVUVXYYZ\[[[XUOLFBA@@@BDHLRV\dmu|€‚„„‚€{wvwv{|ƒˆŠ‰‰‡††‡‡‡‡†…ƒ‚€~~~~~yusssstsrqlf_XOE>DMZeq}…‹ŽŒŠ‰‰‡ˆˆ‰‰ˆ‡„~tgZSW_irtuspollkljj„—•‘ŽŒŽŒŒ‰‰‰‘‘Œ‰#######$%%$$%%%&&&''''(((***++,,----------,,,,,,,+++*)))******)))))))))((((('''''&(('''''((((('')'''(())))))))***********+***,--..//00111133333355666655665444332222111000////../......-.-,,------,,++,,----,0Jx‘™“’‘™£œˆˆ©²¶ª˜˜Ž„„Šs{xtvsiqw|„ŒŒ—©°£RUWV@*+AC20037DA@@=?<==;;?DJG{vjŽ†|z†ˆ`Rfmc^^^k‚‰~H?CAABGHDB?=>;95225Td‚¥Ÿ€|vi_UTLD?834;?GRVY[XYYMIGIOU]izŠŒ†xihry~zmF.,0317IOI</.-.12GY[Z]^YTOG<76<AFJMNK=2)7Xy¦¶»»»»º»ºµ®ª™h/1540?Xku}€{w‚†‚s|mbAJEHMNnuhbd[VVW]]ddda[UTSUVUVVTUXYYZ[]\\XUQLGCBABBDFKOTX_fov|‚„ƒ€}yvuwx{|…‰‹‰‰‡††‡‡‡†††…ƒ€~~~~~zuqqrssssplf^VMC@EQ]gs~†‹ŽŽ‹Š‰ˆˆˆˆ‰‰‰‡ƒ|sfYT[ckrrtropmkjkk‰˜”‹‹ŒŒ‹‹ˆˆ‰‘’ŽŽŽŒ‰$#"#%%$%&&%%%%%&''(((((()+++,,,,.......-,,,,,+++++++**********))****))))((((''''&&&&&&&&''''''''&&(((((()))))))*****++++++,,,,--////112233433444456666665666554433221010000//.-/+.--.-----,,,,,,,,,,,,,,----+0[†—›ž“‰“–š §¬­¨‘™Ÿ‘‰Šrwvwz{rx}„Šƒp®¥XNPJ5(*7C/-0007CE=A><;;9;@EKH|~sj„Šƒ}wzˆƒZ_d[\]\ew‚‡o?@A@?BFDB>=;98400;Ub|›|pskXUPE997<CJOTVYX[]\`ZJDDKS\i|–waZu…ˆŠŠp6-026628DA1,0221<Waahqm`WPF627@IJLH<3,0>ZzŽ¤»¾¾¿¾¾¾¾½º·´°ª}9(024?Mdtw‚ƒ„||‰Š‡LHHOSPZtkjie`]YYZ]^]YWUUUUUUUVWWXZZ[\\[YUSMIEDDEEGJNRV[bhpu}€ƒ„‚{wuvvx{~‚†‹Œ‹Šˆ‡‡ˆ††‡‡††„}{{}}~{zvssttssqojd^UKCBIT_jw‚‡ŒŒˆ‰‡‡ˆˆˆˆˆ‡‚{reWS[bkrvvqolkihk‰—“‹ŠŒŽ‹Š‰‰†ˆ‹‘‘’‘ŒŽŒˆ&$#$%%$%&&%%%&%&''((((())+++,,,,.......---,,,,++++++**********))****))))((((''''&&&&&&&&''''''''&&(((((()))))))*****++++++,,,,--////1122334334444566666656665544332210100/0//./.8/,,------,,,,,,,,,,,,,,--,++2g„ œ™™‘‘Œš£•“¦¤¥¡£’Ž“Œ‰‹”‚yy|~ywtv|{a3›ˆLPKE/'(,.,,+.16;FA?C=?<<;<AFEy€smoŒ‚|{~„ˆrSZRUWYfv€€†‚U??=@CCCC==864100=R_y{plj]JJA457@JNSTYZ[\^_bbOEFLR[i{™š{bmŒ˜—˜Ž\--13775353++1449T_emx|ueYJ>64@MONH6.,=HWvŒ¦¹¾¾¿¾¾¾¾¾¼º·³°®¥„8.4348Uhg~z}~‚‡Œ{hGDNNNOyxkhjhgojd_][\YWXYWUVVUVXYZ[\]]\ZXURNIGGGHHJNRVZ^dlrw}€„ƒ}zuuvxz|ƒ‡‹Œ‹Šˆ‡‡ˆ‡‡‡‡†††‚€}|}~~}}{wssttssqojd]TKCCJVbkyƒŠŒŽŽ‹Š‰‡‡‡ˆˆˆˆˆ‡‚zpcYT[dmtuspnmkijŒ™’Š‹‹‹‹‹Šˆ„„ˆ““‘ŽŒˆ(&$%%%%%&&&&''''(())))*+**++,,,,,,,,---,++,,,,++++************))))))(())((((''''&&&&&&&&''''''''&&(((((()))))))***++++,,,,,,----//0002223333344455565566665555553322110//...../MK0----,,,,,,++++++++++++,+,*+5h{Œ ¢¡Ÿ›š›‰Ž¢… §¦¢œ‰’Œ‰Ž„xv{}|yvokojW;]dNMPN@+')+-/;1.027JD==>@>?;;?@Djxsnu‹€||‚…^XWTT[jz}xx‡{M>@ABCGH=:8431.0<R\xtqmd]KH=875?MSY[\aa`abc]JKNSTZdu›žw‘ £ ƒA//0258:51--.049M^epz…‰pYB:99DQWQB//5CMc†¤¹¿¾¾¾¾¾¾¾½»º¸µ±¬¨ r018G5>XVou{|‚„{c†n>HGOPo~tmlhdedbb_[WUVWXXVVVUUWXY^`][ZZYXSNJIHHJKMQRV\`fmuz„{vtuvwy}…‰‹ŒŠ‰‡†‡‡‡†‡††……„ƒ€}}{}~}zwusssssqnicZPIDGO[cq{„ŠŒŽŽ‹‰‰ˆˆˆˆˆ‡ˆ‡†€xmbVV]fnuwsqolml‹—“Ž‹‰ŠŠŠŠ‡†„‚~‹““‘ŒŒŽ‘Ž‹‡'&$%%%''&&&&''''(()))*++**++,,,,,,,,---,++,,,,++++************))))))(())((((''''&&%%%%%%&&&&&'''&&(((((()))))))***++++,,,,,,----//0002223333344455565566665566553322110//.....,),.------,,,,++++++++++++,++++6f{‘££›™š›–‘…¢™œ§žšš•“‹‡Œƒzvuyyxrme\WQJPNNMPK<+'*),0.+,344459>>@@?=;=A?_‰vnln…“‡~{}ƒ‹pQPU^dq|xsl}‰kB?CBCFD=:7521/0;MZtz~xsh\YSF>?:5;PWY_dfqslf]XWVLLQYao‡™ —›žž›Œa130146674421036I\eow|ŠŒl:7:;<<>@=70/7?Ef—¶¾½¾¾¾¾¾¾¾»»º¶³­§ž›–U0LW@0CBaYm€}€xFM~[?EKNV`^URJIIJLMRQMKJOSWWUVTWYVT[dee^Y[_]VPKIJIKLORUY^chov|ƒ~ztsuvx{}…‰ŒŒŠ‰‡†‡‡‡†‡††…†…ƒƒ€~~~}zxutssssqnicZPFFHP\es}†ŒŒŽŽ‹‰‰ˆ‡‡ˆˆ‡‡†„vl_VX_gpuvsrpknˆ–“Ž‹‹‰Š‹‡…„ƒ~t~Š‘‘ŒŒŒŒŽ‘ŽŠ†''&&''''''''((''(((()***)*++,,,,,,,,,,,,++++***,++**********))))))(((())((((''&&&&&&&&&&%%%%&'''&&''(((()))))))*))**+++,,,,,----.0/102223433444555665566665555543311110///.-..-..----,,,,,,,++*)**********)*)6j†—Ÿš—•š’‘‰›—™›˜–‹ˆŽ“ŒŒ‹„yz{}wpbgaPEKQONOQLJ<'&()+-*)*,+/31619>>A>=?>?P‡uonlrŒƒ|~|„‚UASdpyzreY`xy\CDB?DH>:74310/:L`ƒŽ…maVTSFBB>8<SX[ahnv†ywrvgbfegix›˜š™—”‘†nD6667986234453E`flu|ƒŒ‘b27765567530047Bu¬º½¾¾¿¾½¿½¾¼º¸µ²«¡—’~MKUT19TjX^}~~€zyƒwMENNeWSTRPUYVXWVQONMOWUTVX[\[TWZ\b^ZZ`ddf]OLKLLMQTX\`fjpv}~€€|yuttwx|ƒ‡‹Œ‹‰ˆ‡†‡‡††‡†††…†…‚‚}~~}|yuvttsqpmgaZPFEIS^hv†ŠŒŽŠ‰‡††‡ˆˆˆˆ‡ƒ|tj]WYairvvtqlm‡˜‘‘Ž‹‰ˆˆ‡ƒ‚…|jn€‹‘ŒŒŒŒŽ’’Š…''''''''''''(((((()))***)*++,,,,++++++++++++*,++******++****))))((((''((((((''&&&&&&&&&&%%%%%&''&&''(((())))))))))**+++,,-,,--../00002223444554555665566665555543311110///.----..----,,,,,,,++*)**********++/6kŒ™™–œ‹˜’‚’•˜™–—“Œƒ„‚Š†ƒƒˆzztniajcK9COOQOPOH8'(()***)*,+.5;JG9:@@=><9;Bz‚wwuwƒ’Š~€ˆqXahv{wn\G>HZeWECEC@@9731/0-;I`Š›ŒcGSTVHDGCCHRX_hjn€‘‰ƒwf^elgmrutw‚‡ŒŽ‰„~wpV=:9898543258:Yttuxƒ‡‰b675443020..266EqŸ´»»½¾¼¼¸´¶ºº¹³®¤™‘Œ†ZRLUR14MO=h€€||xnTKLLMNPMONLDLXUMECCEGVRQ[YSYWceemkhhfmoh^QMLNNORUX\bhnsz~€‚‚~zvtstwx|ƒ‡‹Œ‹‰ˆ‡†‡‡†††††‡†‡†„‚~~~}yusrrpnomgaZPIHMW`kx†ŠŽŽŠ‰‡†††‡‡††„{si\W\ckrwwqplƒ–’Ž‹Š‹Š‰‡„…|ddtƒ‘ŒŒŒŒŽ’Œ‰†((((((((''(((((()))))****)*,,,,,+*++++*****)(+*)))**))))))))))))((((''''''''&&&&%%%%%%%%%%%%&&&'&&&'((''))))))))))**++++,-,,..//./1011112344554555666666555555432211000/...---------,,,,++++***************0@>h˜“–š‘–•Œ—›š–‹†‡‰ƒ„……Š}yqqpmlgcTJKKMNQNJH7'((())+(*.,+,7P=83<:??=<9;l‚‚ˆ’„~‚„‚YitxzxjWD97:KaTB?CCCA841/..<KZv˜žˆRGGWXMHCBLLV[\eu…–œ“{`SMbyƒŠŒŽ…tit|vsmhaS@<;98766656:Uw~{„…ˆ†c:863200/-.049<JUo‘¤¬³¶±§–š¨®°¯¨ž’‹‰Š‡XIJGWI07E4Kty}wep>LP^c]_`VRHZhhlke[SUgRGX_Zcia[gmlc`Xkl^SOOOPPRUVZ^bgnuz}‚}yvusvxx|ƒ‡Š‹Š‰ˆ‡‡‡‡††††††‡ˆ‡…ƒ€€~}yusrrpomjg_YPIJQ[epy‚‡ŠŽ‹Š‰ˆ‡‡†‡‡‡‡„€zqf\X^fnuvwrp~–“‹ŠŠ‹‰…†ƒƒ{d^iwƒŽŽŽ‘‘Œ‰ˆ((((((((''(((((()))))****)*,,,,,*+++++*****)(+*)))))))))))))))))((((''''''''&&&&%%%%%%%%%%%%&&&&&&&'((''(())()))))**++++,-,-,,--./1011112333555555666666555555332211000/..---,--,,,,,,,,++++***************,.0a†’”–Ž•••—››˜–ˆ‡€Žƒƒ‹ˆ‚‹…wywvrme^UNLIKNNNKI:)((())**+---,/3+0VDB=?@>;=\“Œ‰††‹—€}‚‡qrwwytgTC8548LZODAFDD=51//.<Mez•™s4@LNPLA<?BSX]dp…˜ž–tum]Rbx|ŠŸšœ”{nrtrlfc[YPDA>=:97779:Mv„€€„‡…€g<75631/.-/39;CU_fks{‹••Š}w€‘š›—‹‡‡†~ZDDIKQP<<Mm}wx~~l_‰‚CMYccekhYP\flmmnlga`XPJM[Z]ZVOVbeUHA]dWQQOPPPRVXZ^diov{~‚}yvsuwxz}…‡Š‹Š‰ˆ‡‡‡‡††††††‡‡ˆ‡ƒ‚‚~|xusqqqomjg_XOILS]gp{„ˆ‹Ž‹Š‰ˆ‡†…‡ˆ‡†„€ypf\\bipwvuqy””‹‰‰‰‡ˆ…„„zd^`jv„ŽŽŒŒŽ‘‘ŒŠŒ((((((((((()))))********++++++++++++++******))(())))))))))))))))((('&&&(''&&&&&&%%%%$$%%%%%%%%%%&&&'''&''('((())))**++,,,-,,-...000110111233445556565565465554442120//.-------,,,,++++++**++****+,(*))****))),Z}‹”Ž‹Œœžœ™œ•‰ŠŒ‘’‹‡Šƒ‚‹Ž€}xvtmd]RE>BGMMKHH>-(')*(()*-.,+(),.:CP;?=><>J‘Š‡†Œ“˜•ˆ~‚…duxvpcO>777:EV\O?>B?@:40./:Kg„’—h.6QdTHB>>AE[ad{‘—‚vx{p~”–‹€š¤¢¢ “~rmhgd_ZZTOIB@>=;98:4[‰ˆw{…‚|{jD6643/../15:?Ph}~ywma_becdlx€ƒ‡ˆƒ|{ncY?@7<7EZBAbvxu|‚€dL`OMijgg`^[_hjmlnnkha^__WYZXUW\]ajhB08WoWQQPQQQSVY\`djpw|€‚‚}yttvxy|ƒˆŠŒŒ‹‰ˆ‡‡††‡‡‡†‡‡‡ˆˆ‡„‚‚‚}xutttqomje^VMIOV`iu~„ˆŒŽŠˆ‡††‡‡‡‡††ƒxpd]]dksvuou–Ž‹ˆ‡‡ˆ‡†„ƒ~g__enz„‰ŠŒŒŽŽŽŽ‘’ŽŠ‰‘((((((((((()))))********+++++++++++*********))(())))))))))))))))((('&&&%%%&&&&&&%%%%$$%%%%%%%%%%&&&'''&''''((())))**++,,,----.//001110111233445556565565554444322100/.--------,,,,******))**))**/2))))(())))),Pm}ŽŒŽ‹ˆ‰››šœ˜‡‡Ž‰Š‡ƒ‰‘ƒxwwtoe_UD@CJNIKHF=-(')*'(((*,++.-3+).8<>?<:<@“ŒŠŽ‘•–—Š€…Šinwup`LB88<DZf_TMDB@?;51//;H[}’’Y2Srx`LEA?@AOfnw•Ÿ–‚s‚¥«Ÿ¥¦¦›—®°ª¥—‡{rie`]ZVRNKEA==>??>;Z…~sw~€{xnQ8753300158?BVvŒŽ‡}iZVROMT[^`d`]\ZbtYB?=B4=AK7Kegnz‚…h&bqSZ]dklfhcbhopppkgd__\ZXYYYZTT\^X6(1OaURRPQQRTXZ\`fkrx}€ƒƒ}zvsuxy|„‡Œ‹‹Š‰ˆ‡‡††††‡†‡‡‡ˆ‰ˆ††„„}xtssspnlie^VMLQXakv~„ˆŒ‰‡†††‡‡‡‡††ƒwod^`gnswttŠ•‘‹‡…†‡ˆ†ƒ…iccbfq~‰ŒŽŽŽŽŽŽ‘ˆŽ”))(((())))))))****)*********++,,++******++))))((((((((((((((''''&&''&&&&&&&%%%%%%%$$$$%%$$$$$%%%&%&&&&&'''''(((()))*)+,,,,,,-...////01/11222445555654444433333201///..----,,,,++**++++***********)))'''''''()+Ik~†„‡‰…‚‹˜’‹ŽŒ}‡‹Œ‰ˆˆ„€€…’qtyslhaSLHGF<@IGE</(()*)((**+,+-,--*,/54=<7;L–—‹’–••“†€ƒ‡‚ruum[K<87D_lrh]WOF@B?810-8D_rŒˆPNwŒƒoSJHAA>NUe|…‹’ ­µ²²²¬¥ œ®³®¤ŸŽ}slec^YWXTMHB@@BCB@Cb‚†‚xw|}yvo[@:;;<7257<@E[xŠŒ‘‘‘‚qjc\VSMGFHHLXgsoLGI>G8>EDG?HWay€8E’’€IXVQVckb]lmqtqmhd`][ZYXXYZWZ]\VE?LWYUQPQPRRUY[_chltx|€‚‚€}zxwvz{}€„‡‹‹Š‰‰ˆ‡‡††††‡†††‡ˆŠˆ‡…ƒƒ~zwssssonlgd\TMNS[cmx€…‰ŒŽ‹‰‰ˆ‡‡‡‡††††ƒ~wme`bhovuq†“‹‰ˆ‡ˆ†…ˆkeebbhv‚ŒŽŒŽŒ••***)))))**))******)***********++))***)))**))))((((((((((((((''''&&''&&&&&&&%%%%%%%$$$$%%%%%%%%%%%$$$&&&&''''''(()))))+,,,,,,-...////0010122233555554444433333310////..----,,++++))****))))))))))*))&'''''''()+<sƒ‹Š†‹‚z~Ž–Œ‹z‚‰†~nv†„ƒˆ}qqqqocYQOMHF@AJEC>0'()*)('+**+,*)*)++-.17:@Kkœ™‘‘–˜—‡’Žƒ‚„‡ˆurtm[ICCCJWeok`UPPIAA@:5/2C[qƒyNc‡‚zzeG=E>NVP]yŠ–¥±³µ³°­«¤›”ª­¦¡¢–‡tnjda\bpg\QHEDDDDDP|’ƒ{z~wui_\Y]\_P48;>ABWo‚…Š‘Œywupcca]\[^afmpfBA=@BC;LAIG?Rgv€peŠ“„PPWKJVOKWqrrtqniea^\[[YY[\\\\\XVZ[XUUSQPPRRUX\_cinsw|€‚‚|yvwx{|}€„‡‹‹Š‰‰ˆ‡‡†††††…††‡ˆˆˆ††ƒƒƒzwssqqonkfbZSNPU]eq|‚‡‰ŒŽ‰ˆˆ‡††††…………ƒ~wmdcgirwr|’‘‰ŠŠŠ‡‡„‡…rhifbbjx…ŽŽŽŽŽŽ‘Œ‘˜•))****(****())++**))******++******))))((((((((((((((((((((''((''&&&&&&%%&&'%%%%%$$$$$$$$$$$$$%%%&%%&&&&&&&''''''''))(*,,++,,-...//00111012222244555544332233220./..-----,+++**))))))))('(((())))))''''''''&(),2k‹ŠŒŠƒz„ŒŽ•Š}}†‚sgd~‰†‡ŠŽq^_^`gdQQSUMLNNJFE?1'')))))(+(),*+*+,-,,047Uz‘•’”•—–›zŠ–ˆ„††‰ƒ|{vqssu}ˆ‹‚jY[ZUNGFGA72?Njxl\„•—‰„‹‘tL@>JULRmŒž¨±³°¬¨££¤¢Ÿ£œ•’‘Œ€smkhmmjsjcZSKHHICBN}”˜Ž‚€}wriiotzzve=68:>BNaz†‹„zx{{zsfdjg`\_fgjnZ[[X96:>MKCFDO`y|[rŒ’„TGRK6GMelprtsqoke_][[ZZZ\\[\][Z\ZWWUSQPPNRRUY]_cjnrv|€‚‚€~zxxy{|~„ˆ‹‹‰ˆˆ‡‡‡††…………†††‡ˆˆ‡†…ƒ€~yvrqqqonlgc\RPTY_hr|ƒ‡ŠŠ‰ˆ‡‡‡‡‡††……„~wmfegmuv{‘Œ‰‰ŠŠˆ‡†ˆ„oiiidbeozˆ‘’ŽŒŒŒŒŽ––•))))))(****+++++**))********))**)))))))(((((((((((((((((((''''''&&&&&&%%&&%%%%%%$$$$$$$$$$$$$%%%%%%%%%%&&&''''''''))(*,,++,,-...//00//1012222244444444222233310//.------++++**))((((((''&&&&''((''''''''''&()/3N‰Œˆ…€|‚†‹’Œ‹ˆwinnft‚‹‡Š‹ŠaOOPTV_]OMONKJKHGE?1''))*#*+**'&(+++*+,++.An’šš”’“•—–•z•Žˆƒ†ˆ‰‡†’”–•’”——’‰uRPRXRMGEJC64Jmˆw{”™›‘’Ÿ£Ÿ…hiZO@Mf«°°²­¥  ¡¬¤Ž £¤¤¢ž“i[do€vqnf_SJHKKGB@]Œ˜Ž‚€xuxxqv€‰„sP46;??DSiy}qlqusqmgcgf_[_cbgb\`seB7;=>FJQG;Nx{d{‹Š‚\IO>+@T]dqqrssolfa]\\[[[[Z[[\\\\ZXUUQPPPOPRUY]_chlrvy~‚€~|yy{{|~†‰‹‹ˆˆ‡‡‡‡††…………†††‡ˆˆ‡†…ƒ€~zvsqqqonlgb[RPTY`is~ƒ‡‹Ž‰ˆ‡†††††††……ƒ}wmfgjqu{‘Š‹Š‹Š‡††‡tjnliecgq~‰’‘ŽŽŽŽŽ‘’—””**))))*++***++++**))******))))))))))))((''((((((((((((((((''&&&&&&&&&&&%%%%%%%%%$$$$$$$$#$$$$%%%%%%%%%&&%%''''''''(())**)+,-,--.000011101222223333333322112322///.-----,++****))(('''&''''''''&&''&&''''''&(,1;Ek†‡…„ƒ†ƒ…‹ˆ‚ƒ„‚‡„qv‰ŒŽŽ‚[NLTXTGWb[ONNKJKFC=/%'(*,Im8#(,,))+,,././2T€˜ ˜’’•š––~{‘•‰„„ˆ‹ˆz’”˜™—–———–…`VXXZ\UJFGB:>a‰“•—–š¤¥¤ “†“š†_@OŒ¦®°¯­¢œž ¢Š¤¥¦¥ Ÿ”[<J`z‡~sleZJFHLKGADo“uz…„…ƒ}~ˆ†‚wa55:<=@HUflkcgif```[Y\][Z[_`_JQ\g`I:C?7ACFRGHex„ˆ‹…}RJT=-GA05eussqnjfa^][ZZZ[[Z[\[[\[ZVSRMMNNORUZ]`cejquz~‚€~|zz|{}~†‰Š‹ˆˆ‡‡††………………†††‡ˆˆˆ†„‚€}yussqppnlg`XTPW\clu~„ˆŒŽŒŠ‰‡†††††‡‡†„ƒ|wmggntzŠ“Ž‹‰‹ŒŠ‡„††vllmliffju€‹ŽŽŒŒŽŽ––”’********+*****++**))++****)))))))(((((((''((((((((((((((((''&&&&&&&&&&&%%%%%%%%%$$$$$$$$#$$$$%%%$$%%%%&%%%&&&&&&''((())))+,-,--.////1110122222332233221111110////------,++**))))''&&&&''&&&&&&&&''%%''&&''')18EYru}…‚‚ˆƒ~{z€|†˜¡ŸŸ’“”ŒŒ‰pWOQ]cZXUii_LFLKJGC:-$&'))9=(&'(()(*/0-0/-=a~›Ÿ”’”——””ˆ|}ƒ–ƒƒ„ˆŒ‚‘•™–˜™™™’rW[Z]_`YMDDA@n’’—–˜¤ª¦šs…š ¥Œ`l›ª¬¬©Ÿ™™™œ”›Ÿ–—šš˜”Y<AJr•}pibTJHFDEHAP}…€‡‹ŒŒˆ€ƒ~{tg>257<<AFR\][^`\VYYTOSTWXZ]WEBLU_la9;631=Y[eWVp€†‡†ƒ…cIJE8=@4=ftttrnifa^][ZZ[[Y[[\][[ZYUSPOOLOQRUZ^adgjptx}ƒ‚€|{|||}€ƒ†‰‰‰ˆˆ‡‡††………………†††‡††‡…„‚|xtssqppnif`XRQW\dnv„ˆŒŽŒŠ‰‡†††††‡‡†„ƒ|wmiimuŒ–‹‹‰Š‹ˆ……‡|lmonmkhhnwƒŒŽŽŽŽŽŽŽ“—””’**********++++******))***)**))))))(('''''''(((((((''(('''&&&&&%%$$%%%%%%%&%%%%%%%%$$$$##$$$$$$$$%%%%&&&&$$%%&&&'''''(()))+++,,-....011111113221123212233000000..----,,,+*+**)))(''&%&&&&&&%%&&%%%%&&''(&')*+7F[u{tdmqtxullkls€œ¢¤¡”•ŽŠŒz^WY]aba^fglp_[SMHHB7*'''((&'''''&'((*+-/,5Ldx‘œ—“”˜•”‘ƒ~|}“Š†‚…‰|ƒˆŽ’•—˜——Šrdac\[_]VJB@?^’–‘’’™’h[q—¡¦¨™}ž¥©¤™–•”—ŽŽ›•””“•–“…WACJaœ—‰{qjbQGBAFHD@a”ˆ“Œ…€ƒ€xtohH//28;>@CJRTWXWUTSPNQSTWYP:+<HNOSM@G?94@WJQON[p{„‹‰„eKCE@38E^pttsqnie`]\[[\\[ZZ[ZZ[ZZWSPNMNNOPSVZ^`chjorw|€ƒƒ€~|{|~€‚…ˆ‡†ˆ‡†††…„„„………‡‡‡‡‡†‡…„‚€|xusrqpomje_XSRV^enx‚…ˆ‹‹Š‰†…††††‡‡†…‚|vnkko…”‘Œ‹‹‰Š‰…†Šnmnomonilqy„ŽŽŽŒŒ‹‹‹Ž‘–•”‘Ž**********++++******))**))))))))))(('''''''((((((('''(''&&&&&&%%%%%%%%%%%&%%%%%%%%$$$$##$$$$$$$$%%%%%%%%$$$%&&&'''''(()))+++,,-....011111113223321110000//////----,,,,+*)**)))((&&%%&&&%%%$$%%$$&&%&&%&(**-5EYnqa`[X^cd\SX[\]s¡˜””‰ŒŽ€`UWeiidfdghrzqmhe]KA0&&''''&'''''&'((*++,/:Vht–“—˜”’Ž~yyy…•†„ƒˆŽ…‰’•—–Œˆujgffd`^\ZQF=;[–‘ŠŽŒˆ‰‚pfa\e£Ÿœ˜Ž•Ÿ¢––’‘‰‡—’““’‘‘‘ˆ{gMNf¦£•‹zoeUHDUt‰€hjyŽ—’’”‰‚€yrkifQ/,./58;=BIMPQQPPQONPRSQC00>?8;>:?CC=>=AJGIX[J^kŠ†ƒuXFIRD<NYlttsqnid_]\[[[[[ZZ[\\ZXYURONMNNNOSVY\`cfhmrv{€€}}~~ƒ…ˆ‡‡‡‡…………„ƒ„„……‡‡‡‡‡†‡…„‚€}yrrqqpomid^XUUX^gpx‚…ˆ‹ŒŠŠ‰‡†††††‡‡†…€zsnml€“‘‹Š‰‰Š‰‡…ˆ‡qnqpopomjlt{ˆŽŽŒŒ‹‹ŠŠ’–•”“Ž++++++****++++******))))))((()((((('&&'''''(((((((''''((&&%%%%%%%%%%%%%%%%%%%%$$$$$$$$##$$$$$$$$$$$$$$$$$$$%&&&'''''(((()+++,,-...-/11110002112210/10/0...//.---,,,++++)))))(('&%%%%$$$$$$$$$$$$%%&&%'&&*.4BZrzjb^VWY\YOCKQTZm‡—†‡’Œ‘gUR[ibdjhcdjtpumplwxgD%'&*'('&''('&)()(*+.7EVft”’‘”–”‹€|„”‡‚‚€†‹‹ƒ•’“““‡„ƒ‚ƒ~xxvpb]ZQH??}›ŠŠˆ„|m\_`_cx•™¢¦žˆz“š—’“‡s†ˆ‘•“Ž‹ŠŠˆ€|`Tyª£•‡vk]LDK]x‹’‘~›˜‰‚|xtnfa^V4-.)*.38<BFJMMMNMNOKH?3,/7BF7?FF@KOLI>BMI@LRT_bt†…xKAJZaPZopqssqnje_][ZZZZZZZZZZZXWTPNMLLMMNRUX\acdgjquz~‚ƒƒ€}~‚„ˆˆ‡‡‡†…„……ƒƒƒ„……††‡‡ˆ‡ˆ…ƒ~{vsqqppnlhd]XSV\`hry‚†‰‹Œ‹‰Š‰‡†††††††……€yrnkwŒŒŒŠŠŠŠˆ‡‹‰ulnmnpppmot|ŠŽŽŒ‹’”—”“’++++++****++++******)))))(((((((((('&&'''''(((((((''''''&&%%%%%%%%%%%%%%%%%%%%$$$$$$$$##$$$$$$$$$$$$$$$$$$$%&&&'%%'''((()+++,,-.../01111000211111021//.---..-,,,,++++**)(()(((&&%%%%%%##########%%%%%&'',1@Vu|uf^WYfdWQLEIVU\dx{|ŠŠŽŽ†lZ]`kgiknlbhopkopshmr|d<),,)())(''''((**-;NZbx“ŒŽ•‘Ž‰|…†…†”‹„‚€…Œ„|‹‘’‘”š¡—œŸ˜~h]\YPH=uœ•ŠˆnZ`ppknp‚•¦¡ˆŽŽ~s‚‰„‚†ˆ„~~phƒ¥œ™•‰yocRDCHnŽyš›‘Œ‰yskf^[ZV@,+('))+/479<????<81,*+.35EU>6;?EIK?BQNJ<LLNUV_hy‚„r<=ERb[`opqssqnje_\[ZZZZZZZZ[\YWURONJIIKLNRUY]`bdgipty}ƒƒ€€€€ƒ„ˆŠˆ‡‡†„„„ƒƒƒƒ„……††‡‡ˆˆ‡…ƒ~zvrqqppnlhd\XUWZajry‚†‰‹ŒŒŠ‰‡‡††††††††ƒ~wqkq‰ŒŒŠ‰Š‰ˆ‡†ˆŠ{mqqrrtvvwx}„Š‹Œ‹‹ŒŽ’’“–”“‘‘Ž++++++++++++**********))(((((())(())''('''''((((((''''''&&%%$$$$&&%%%%%%$$$$$$$$$$$$$$##$$$$##$$$$$$%%$$$$$%%&&&&&'''())*+++++-...00001101110011110.-----,-.-,++++**)++)((''&&'&%$##$$$$######$$%%%%&&(+1=UrzvsgUQ]qtc]]QIJ[bcspƒŠ†‡ŒˆqSPWlumpmpnmmsmojrtmfsr~‹`7%(+*++*(19-)(().;MZc…ˆŒŒ‰†‹‰ˆ‡‹ˆ•‘ˆ‚}}}„‰lHXbfw“™œ¥¦¬ª¦™Šwa^ZSLIj˜˜„}r[s‰|yz€‚€‘¡£—ˆŠˆ†‡†yop|‡‹„~„™Ÿ“‚vu‚›•’†zqj`PCT}Š‡€s…‘˜˜Œ†€unhaZWQNF0)(('('&')*))(('&')++.168=EJND>:=<HXUHI:0NMECRdj}{dNBBCMV`nrrsrqmid^\[ZZZZZZZZYYWUTQOMJJIKLOSVY[`ceeknry~‚„„‚€€€„‡‰Šˆ‡‡…ƒƒƒƒ‚ƒ„…†‡ˆˆˆˆ‡‡†ƒ~yurppppokhd]WUZ]bkt|‚†ŠŒŒ‹‰ˆ‡†††……†††…‚}wqo†‡ˆˆˆŠ‰ˆ„…‰‚qrvz||~€ƒ„„‰ŒŽŽ‹ŠŒ‘’““‘”’‘,,,,,,,,++++**********))(((((((((((('''(''''((((((''''''&&%%$$$$%%%%%%%%$$$$$$$$$$$$$$##$$$$%%$$%%$$$$$$$$$$%%&&&&'''())*+++++-...//./00/011110000/.-----,,,,,++*****)()(('&&&&&$$###"####""""##%$$&''(-6Nlzuqxsnvwwuib\G/@jos}nˆ†‰‰}XGNYuqsumks…vggmv~vflyv…Œa7$(+++*0>0')))-;NZiŒ‰†‰‹‡†„†Š†ƒ‡‹‘˜—‹{zvzˆ`5OYfqx’¥°°±©¡˜†nc^\PIc“™“•‰„v]u’”‹Œˆ„ˆ”œ •zx~‚}xtq’”‚mt‡˜¢ª¦¡–~ˆ‹ƒ|vqldXEg…‰Š…|“”…€wngb]UOIC:.(&'&&&&&'((((')****,.16:=CDLHG<59NG<;@G:3AIHTdw‚ve\VkhQV]fqrsrqmid^[ZZZZZZZZZYYWURONKJJJKLOSVY^_bbdhlqx}ƒƒ‚€€‚ƒ„‡ŠŠ‡††……„ƒ‚‚ƒ…†‡ˆˆˆ‰ˆ‡†„}yurppoomjfb\WUY_fmu|‚ˆŒŒ‹‹‰‡‡†††……†††„{vp‚‹‡…‰ˆˆˆˆ‡‰Š{yƒ†‡‰Š‹ŒŽŽŽŒŒŒŽ‘‘‘‘‘,,++++++++++**++****))))''''''''''''''''''''(((((())((''&&&&%$%&%%%%%%%%%%%%$$$$$$##$$$$$$$$$$$$%%##$$$$$$$$$$&&&&&&&()))*,,,,--......//./0000////..-,++,,,,,,,+*))))(((''&&%%%$##""""""""""""##$$%%%(+5Fdyxsw||zz{vtj_UE<Jdryuq‰ˆ††„lMO]ipszxwrmq€tqjgnyz}jozuz„‚xZ.+'*(()))+++.@PYp‡†‚‚‚‚}~ƒˆŠ‡ƒš“„zwusyƒ‹\GJRZk‡Ÿ­±®¯©ŸŽtd`ZTNaœ“•ˆt^v“ŽŒ’”Ž……”™phtxkt•¤ª¨‚ZPYk„—™”Š’™“ŠƒztqpneXEg‚…Š‹‡~Œ‹†wh[SPOJB9.'$&$%%$%&%%''(')('')-./792367?FRD564JOJY>3+1?P[cb^jjVWird\[`lqsqpmid^[ZZZYYZZYYYYVTQMKJHHJKMPSVZ\^`bdgkqv{€ƒƒƒ„†‰‹Šˆ‡†…„„ƒƒ€ƒ………‡‰ˆˆ‹†‡…„€~ysrqponliea\XV\`fmt{‡ŠŒ‹‹‰†††††……†‡…ƒ€{p~Ž‹ˆ††‡‡†‡ˆŒ…„ˆŒŽŽŽŽŽŽŒŒŒŒ‹‹ŒŽŽ,,++++++++++********))))''''''''''''''''''''(((((())((''&&&&&&&&%%%%%%%%%%%%$$$$$$##$$$$$$%%##$$%%$#$$$$$$$$$$&&&&&&&()))*,,,,--......//./00//////..-,+++++++++*)))(((('&&&%%%$$##""##!!!!!!!!""$$%%%*0Dbxwqv|~|zxtph\PHQaj}~jwŠ‚ƒ‚zWQWqymr{qqquytwu€op~yto_urbmŠŒŽrN3((()**+++4GT^xŠ…€{ptx|}€„„Ž—™•Œ€vpmqz„W:O]s‡Ÿ­°¬®§Š]IMNQNN_š˜š€jP\…‰ŒŽŠˆ…Ž“{jkox€•§«§£—{SJJGYƒ˜„Šš—“ˆ}sonnofPA]‚ŽŽ…{‚€…€tbG:4342.(%%#%%%$$$%$%%%&%'(*,/015?53/*+.2>^R?@QJ<QG-+4AZ_RTIOtr€vnSQ]hprqpmid^[ZXXWWXXYYXXUSPLJHHHIKMPSVZ\^`acfjpuzƒƒ‚ƒ„ˆŠ‹Š‡ˆ†…„ƒƒƒƒƒƒ„‡„‡‰ˆˆ‰‡‡…„‚|wsrqponliea\XX\`hov}ƒ‡Š‹‹‰‡†††††……††…‚~z|ŽŠŠ‰‡†‡‡ˆŠŒ‹’””‘ŽŽŽŽŒŒ‹‹Œ‹‹ŒŒŒŒŒŒŒŒ,,++++++++********))))((((''''''''''''''(('''((())((((''&&&&&&''&&&&&&%%%%%%%%%%#####$$$$$%%###$%%%%%%$$$$$$$$&&&%&&(())(*,,,,------..////..---------,++**++***))))(((&&&&&$$$####!!!!!!!!""""##$%%$(/>Wsxqtz||z{zzrjf[NIWivˆ}p€‚€‚iKNPcnnhikptuqfuxyposvkeX`plW—’‘mdg?2')))(*5ALYcˆ‚}}|vnpstvrv}„Ž’Œ†{urppz…WQ`rŠš®²°©C=DEDKPP[Š›šžšT:=ds{‚…{xy‚|h_aixˆ–¢Ÿœ›“~UFHOk‹–•’š”‹trskhkoaHFSlx€{rnyy~}cB40.,*(('&$#$$$%%$%&&%$%'',/1022473-(&&)*.E_PXYZYVI,+-9QPTL\y}}‚‡zSQOXcppqpmhc]ZXWWWWXVXXWWUQOKJGFFHJLORUY[^_`aeinty‚‚‚‚‚ƒƒ„ˆ‹‹Šˆˆ†…„„ƒƒƒƒ„„‡ˆ‰‰Š‰‰‰‡†ƒ‚|vsrqonmkhe_[XX^cjry~ƒˆ‹Š‰‰‡………………„……„‚||‘‘ˆˆ†…†ˆ‰‘’’“’ŒŽŽŽŽŽŽŽŠŒŒŽŽ‹‹‹‹Š‹‹,,++++++++********))))((((''''''''''''''((''(((())))((''&&''&&''&&&&&&%%%%%%%%%%$$$$$%%%$$%%##$%%%%%%%$$$$$$$$&&&%&&(())*+,,,,------..////..---------,++****)))((((''''&&&%$$$#"##!!!!!!!!!"""###%'',8Lktrrw{|zz|yxqlbVNJ[v‡ˆxuƒ}}€yYGGSinokekfjsmhl~rosohigGjnTn”†qhft?MD)(,*)2<LYf…‡zyy{uljnnjkknr‡Šˆ‡…zqtrnvƒˆe`v›ª¯¨wiQB==@PYZ[‡”œ…V8ASgw{vrpopspjls~‰–›—ŽŒ}T=>N{••—•Œ~cS\`befUHBFWswqi`jpuuS401/,*(('%$#$$$%%$%%$&(+-.12463220.(&%%')+<SXNVT\WH?/2@JORXR\lsyvmYMWnrqqmhc]ZXWWWWWWXWWWTPNIGFEEGILORUY[]]_aeikqw}‚‚‚‚‚ƒ…†ˆ‹‹‹‰‡†…„„ƒƒƒƒ„„†‡‰‰‰ŠŠˆˆ†ƒ€{vsrqonmkhc^[XZ`eltz~ƒˆ‹Šˆ‰‡………………„……„}Š‰‡‡‡ŠŒŽ‘’’‘ŽŽŽŽŽŒŒŒŒŒŒŒ‘ŽŠŒ‹‹++++++++********)))))(''))((('''(('''''''''((())))((((((''((''&&''&&&&&%&&%%%%%%$$$$$%%%&&&&%%%%%%&&$$%%%%%%%%&&%&&'())**+++----....--//--------.,,,,+*)))(())(((('&&&%%$$%$##""##!!!!!!!!!""#""$%(+5Gasqsv{|yyy{xusj`UJJc‡u}z{|nMEL]hiijebdgjmluw„rc‚‚xoiGPw_Ekdf[hhnvZ:+++4?KW`„„~vywvsljkhcdifinquwx|€uqnnrx‚lzŠ•¢žwawQ=7@Xnph`Ž””`9@ao†rmjikpnjkw†Ÿ¤œŒƒ}{wdHA=Mr„†‹Š†yM/3AQa_PJKUozrlb[dppkJ,/0/+*(('&&%$%%%&%('()+02121574.+*)%&')+)+7AFQQUMVgCA@JMRSMXV_]fk{toaKVirrpmgc]YWWWVVWWWWWVSOMHFDBCEHKNRUXZ]^^`dhkpv|€€‚„†‡‰‹‹Šˆ††………ƒƒ„„„ƒ†‡ŠŠŠ‰ˆŠ‰†ƒzurqqommjhd_XZ_agou|€…‰ŒŠˆˆ††…………………ƒˆ‘‹‡‡‡ŠŒ’’’‘ŽŽŽŽŒŒ‹ŠŒŽ‹‹‹ŠŒ’’‘ŒŒŒ++++++++********))))((''))((('''((''''''''(((()*))(((((((((('''''''&&&&&&&%%%%%%%%$$#%&&&&&&%%%%%%&&%%&&%%%%%%&&%&&'())***++----....--..--------,++++*))))(())(((('&&&%%$$##"""!""!!!!!!!!!!"#$$%'*3C[noov{{wruwvwutg]UJIiˆs|z|}bIGP`acfjffhcUNVYXcgQ]YWQVD>co]€‰dWg]hfYVI9/3>JVZ~„}zvuvrpoliecba^_agecby}qlnmlu‚}sˆ“RS[Q>:Jk„Ž…rc‰{‚pLQkvŠynifbejioy—¦žŽzvqqkM=:<Kcu…ˆ—‚pD/,/?cg^Y[h„ˆsf]fmj_F*-0-+*('&&&%$%%"#%))**/4568>FCD<+'(&&&()))07?IY]U]cP@ELFMWk\SWS^kyK@]Lfkfqomgc]YWVVVVWWWWVURPKFEBABDGKNRUXZ\]^^afjou{‚‚ƒ„†‡Š‹‹Šˆ‡…„……ƒƒ„„…‡†ˆŠŠŠ‰‹Š†…}ytprqommjhc^WY_diqw}€…‹ŒŠˆˆ††……………………‚…‹‰ŠŠŒŽŽŽŽ‘‘ŽŒ‰‡……‡ŒŒ‹‰‰‹Œ’“‘Ž‘’++++++******)))))))(''''(('((((((((((((('((((())))((((((((('&&((''''&&&&''%%%%&&&&&&&&&&&&&&%%%%%%%%&&%%%%&&&&&&&'((()()**++----..----.---------,+*****)))((((((((&&&&%$###"""!!        !"!!""#$$'0B\nlmq{{tqrvxxywof\RDBn…xk€xxyqVFHQbhjmfbUTNDKHHEFJE>887;BAF^ZJˆŒpa~tpnaTKHA;>JPVyƒ}ytqqqssohe_[ZWYZaaWHIqupoifkw‚u|‡[OVN?<LvŽššo_†‹ŒŠsNceezzŽ†wmgb]bfej‚£ ’‡xleh^HB=;GZgv‰Ž…{`<,,3GivnYXf€‹ƒ…qlmeU>)*,,**('&%%$#$$#"$&%&,:BEEDGGB=5)&&&&&()'*/3:DDJWd`ZVF@;@LWXZ\>B[T28fQN]irpmhb\XVTTUWWWWWUTQNJEA@@ACFJMQTXYZ[\]`chmrz|~€ƒ……Š‹‹ˆ‡ˆ‡„…„„„„ƒƒ„††‡ŠŠ‹ŠŠˆ‡„}xsqpqpmljga]Z[`djqx}†‹‹‹‹ˆ††……………………‚Ž’‹‡‹ŽŽŽŒ‹ŽŒˆ†ƒ€‚ˆŒ‹Œ‰ŠŠ‘”“ŽŒŒ‘Ž++++++******)))))))(''''(('(((((((((((((((((())))))((((((((())((((''&&&&'''%&&''''''''''&&&&&&%%%%%%&&%%%%&&&&&&&'((()()**++,,,,..----.---------,+**)))))(''''''''&&%%$###""""!       !"!!!"#$%,<VqphntytmmprswxvnbVM=:h†‡rrwrwykNCHUgilvdWGDGAJPKKJJDGA>;;@F?O]:k{…ˆ‡„~tcTMIEA@FJQr‚zvsronprnie_[YONT`^RF2Gjmnjhhnv€|c@KNNEHo¢žj\o…‹†y51Lw“‰€wkd^[^c\f™Ÿ–‡|o\al\FB@DMWakqwvunU8+-;Rht~wd^dx††„„{i_S4&)-,*)''&%%$$$$#""#$(/:BDC?:8760'''&'((''*16:=8GQX[YVOIKCLYZRPF6Q\MVjYJYrspnhb\XVTTTSVVUUTSPLJEA@?@BEJMQTXYXZZ\^aejqw}~€ƒ…†ˆ‹‹Š‰‡†„…„„„„ƒƒ„††‡Š‹‹Š‰‡‡„€|vsqqqpmljga]Z]afks{€ƒ‰‹‹‹‹ˆ††……………†††Š‹‹ŠŒŽŽŽŒŒŽ‹‰…‚€|y{~‚‰ŽŽŒ‹ŠŠŠ‹““’Ž‹’‘‘Ž,,+++++*******)))))('()(''((''))))(())(((((())))))**)(((()*((()))('''&''''''''((''''''''''''&&''&&&&&&&&%%%%%%''''(((())*+++++,,------------,,+++***)))))(''''&&&&&%##$#"""!""!!!!  !!!!!!!!###&)7OmrikqvslijkoqvwtkcVK?;j‹tyrpxwbKHPag_`hWJFDICHNKLKMECB@>?>E@AJD:<w‡„}rbUMFDCCBFLg„wusqnlnongb[X[SNNCLOI9,FjjfjhjowzG<BIIGm“¢££¡sa]Ž†‡C+=€˜„{wh_\YXZSu¡˜€p[PY\M;:BIRW[adfjkaM7,7I\inv~vjyŒ…z}k\J,%(***('&%$%%$###"""!&/7:<?>==;81('''(('(&*1;=79BGI[^[\GFADKKIV`R@YRcn^J\stpmgb\WUTSTTTTTTSRNKGC@??@AEILPTWXYZZZ\^bgntx}~€ƒ†ˆ‰‹‹Š‰‡†„…„„ƒƒƒƒ„…ˆˆ‹‹‹ŠŠˆ‡„€|vrqpppoljga]Z\`hnu{€…ˆ‹‹Š‰††………………„†ŠŒŒŽŽŒŒ‹‹ŒŒŒŠŠˆ†‚~|yyxy|€…‹ŽŒŠŠŒŽ““’‹‹‘Ž,,,,,,,+******)))))('()(''(((())))(())((((()))))))****))()*((()))''''&''''''''((''((((((''''&&''&&&&&&&&%%%%%%''''(((())*+++++,,------------,,+++***)))))(''''&&&&&%####""!!!!! !!!!!!!!!!!!#"#)0FftmkptsmkhijmpsurkcVJ>6f—’~quxz\CHQek_]_PDFILGMQOMJJDBA@A?@BDCCF@n„‰‡ƒzkYNKECBBADG_…xvtqnjikjga^ZVPG>63;=867VmggffgowqF:7;_Œ£¦¤¦ž‡u`eyŒ†‰K1@„—‡ƒzsbZXVVNTˆ›’„yjONYP;19BKQWY\_cfe\J60=Qcikku|~™œ’‚z|wdT>*&'))*('&%$%%$###"""#*3:=?A>>;630+&''((((&)-2319<:DU[RW\D?DQTU^i]Lbwx~gDXktomfb\WUSRSSTTTTSRNKEC@??@AEILPTVWXYYYY\`dkqx}~€ƒ†ˆ‰‹‹ˆ‡‡…„…„„ƒƒƒƒ„…ˆ‰‹‹‹ŠŠˆ„{urqpqonkhe`\[^cimv}‡‰‹‹Š‡††…………………‡ŽŽŽŒ‹‰‰‰ŠŠ‹‹‹ˆ„|yxxwwx{}ˆŽ‹‹“’Œ‹‹‘’ŽŒ‹**************)())))(((())))))))))))))))))******++**,,,+****))))))((((((''''))))))))((''((''''((&&''''&&&&&&&&'''')))***)*,,,,,,,,,,..--,,,,,+**))))))((('&&&&&&%%%$##"""!!!    !!    !!! "$#$(/B^qmjottlhfdadintsskbUH81U”‘„vnszm[HKSda\]ZLDJONNORSRKGGEFILA<>@?CEDW‡‡†€rgUJGCBAB@>@\‡ysopokhhhea]YTPH91155556<iligcehm}X02As˜¢¥§¤•…m\vq‚‚`7>w‘‡}shVRUTTMq›–…yn^OZaT54;GNTX\^abc`YF9?KZdgfglph“™‚ysi^T?,())())'%%$#####""!#%09<=>?@<831/*''((((&&(-.1347:<JZZJSOC=@IHLPLZmwnidEWmuunic[XSRQPPSTSSRQOJEB>=>@BFIMNRUVWXXWWX]bhnuz|‚…‡‰‰Šˆ‡‡……„„ƒƒƒƒƒ…†ˆ‰Š‹‹‰‰‡‡„€{urqppoljfc_\]_ciqx}‚‡ŠŒŒŠ‰‡‡…………………ŽŽŽ‹‰ˆˆ†‰ŠŠ‰‰ˆƒ}yvvuvvwy{{ƒŠŽŽŽŒ‹’’‘Ž‹‹‹Š’“‘ŽŒ‹**************)((())(((())))))))))))))))))***+**++--,,,+**++*)))))(((((((((())))))))((((((((''''''''''&&&&&&&&''''((*****+,,,,,,,,,,--,,,+,,,+**))))))))('&&&&&&%%%$$$"""!!!    !!    !! "(5%&-?Wrtlntunieb_\_inswqjaTG6-J’„trrvaOJLO]YSROCFMONKLPY[PHHIFHLPNBA@@CDA€ˆ…}n_QICA>;=<9;T…}qopnhfgec_\VUPD533113356Mplhfecltt>,O~˜ £¢˜Š}cZw`v|r:6oskXNORRQW†–‡wmcXTVZUB?DKRW[]_`caZRHELR\bdgkpy€™Ž}sng_ZU@,*'(())'%%$####!""!#,7<=>?@?<8530+('((((''&+.135557;CMOBFUZ>AO\TVY\bMS\JRivwple_WRPPQPQSSSRQNHDA>=>@AEIMOSUVWWWVVW[_fmrw}ƒ†‡‰‰Šˆ‡††…„„ƒƒƒƒƒ…†‡ˆŠŠ‹‰‰‡‡„ytrqppoljfc_\]`fkry~‚‡Š‹‹‰‡‡‡…………„‚‹’‘‘ŽŒ‹‰ˆˆ†ˆŠ‰†ƒ}xwtuvwwwxz{{€…ŠŽŽŽ‹Œ‘‘Œ‰ŠŠ‹”“Œ‹****++******))(''()))())))))))))(())**++*+++++,,++,,,,,,,,,,*)))))(()))))))))))))))))))))))))(''''''''&&&&&&&&''''((()++**,,,,,,,,,,,,,,,+--++*)))))(((('&%%%%%%$$$#%%"""!    !!    !!  "%(,>Vounqsvojea]WV]iqvvrk`SF58[‰|prsl\QFGPTLDACDGMKKJLN]\OFDBA@@RVD=A>D>>i‡vmd[TD;888779B~~rlljhdc_XVWVRL<..1/./0275drja`cgis_9^|™›”ŠnNR^CavsG7rxlaGGGMNNdƒˆwh^ORTPLSUPSVY\^__bdb`RJNW]`dlolp™Ž|oieb[YS=+(&''(&&%%$###$"!!"&1;==?@A@>;864-&$&&''%$&(,/0256777<IFFKPGCFNMUdbZTVVOEIezqlf^XRPPQOQQQQRQLHC@>=>@DGJMOSUVVVUTUVY]cjpv|€‡ˆŠŠ‰ˆ‡†……„…„ƒƒƒƒ…†ˆˆ‹ŠŠŠŒŠ‡ƒ~xrpqqpnljeb^]]ahntz„ˆŠŠ‰ˆ†††††„„„‡’’‘ŽŒ‹Š‰‰‰†ˆ…‚}zwwvuwwwxyyz{|€†‹ŽŽŽŽ‘ŒŠŠ‰‹’•“Œ****++******))(''())))))))))))))(())**++++++++,,++,,,,,,,,,,*)))))))))))))))))))))))))))))))))((''''''&&&&&&&&''''((()**)+,,,,,,,,,,,,,,,+++++*)))))((((&&%%%%%%$$$#$$"""!          !! ""'-<Vpunnswpifb\TPP^krxvog]PD56Mw†tmps^LTEDLHEA?DEGFIIIIPVVOEEF?>=;9D??>=A@J€tlgdTA;6764468b~smjgec_\QLNMIE6**/.,./018Oojedcabfp[c{ŠŒ„zmRFFCBW~upU:vŠtk\BEGLKRkvui^TSTVXC<PZY[Z]`bcdfebVP^giglxl]w“|nga_]VUR?+(('('&&%%$##$#"!!!)5<>>?@A@?=<85+$"##$$##%&*.10379<;:9889CMLLQ[UX_aWEI_dKOqtmd]XSQPOQQQQQPOLHC@>=?ACFINOSTUVVUTTUW\bkpw|€ƒ‡‰ŠŠ‰ˆ‡‡†…„„„ƒƒƒƒ…†ˆˆ‰‹ŠŠ‹Šˆ€}wrpqqpnljda^]^biqu{€„ˆŠŠ‰ˆ††………„„…‘’Ž‹Šˆˆˆ‰ˆ‚|wwvvuvvwwwxxz{}ƒ‡ŒŽŽŽŒ‘ŽŠ‰‰ŠŒ‘“•“Œ********))*))))'()))))))))))****))**))**+,*,++,,,,----..,,,-+*++**++****))**++****))))))))))))))''''''''''''''(())(())***+++++--,,,,,,,,++*)***)))((('((&%%%%%%%$$$#"""""!!    !! #')9TovpnswskeaZTMJO]iotsme[NC75I]kfhqSEGC=BEGCBDEHFGIIIKQQNF@BBCED>;B==>?@:m{rkfcM@D=411235;rrieeeb`ZQKNOKE6-**--.//.7@inifb`\`jiiw„†xlT>FBAKX}xjbBz†tfW@BHJLVdge\TSTVVE4.8Vg``_ceddggg\_imlr{r^`‚ˆ|le_]\WQPN>+%&''''&%%%$$$!"!"&1:=?@@@CB@?>;4,$"""$$""$%'*./15:===71.+.6HVXPRYYiiLIbbZLmukc\XXZROPPPQQQNJFA>=>@CCFJMPRSRUWTSSUW[bjpv|‚‡‰‹‰ˆˆ‡‡†…„……ƒƒƒ„†‡Š‹Œ‹Š‹‰…€{trppppnljc`]]_eipu|ƒ†ˆŠ‹‰ˆ†„„……„„Š‘“’‘ŽŽ‹‰‰‰ˆ‡‰„zyywwwwvwwwwvxyz{„‰ŽŽŽ‹‹‰‰†‰Ž•–”’ŽŒ‹))******)))))))())))))))))))******++**+++,++++,---------,,-,,+++++++++****++++++++**))**))))))))((((''''''''''(())(())))*+++,,----,,,,,,++*)))))**((('&&&%%%%%&$$$##"""""!        !!#%+7Vpyolqvvoga\UMDEO]gnqskbWJ>424`~hgmoJFC>:@CGEDDEDGHHIIFKOQTXdnnqokcURU_P79Wxqjg_OB@93212312Hrjcba_^YQLIMNMG;.*.1/./237Joni_\[]bmsw{|uk\A?BDMS`rn__Mu„seSAGIJMZ]ZXVTSUR@0.4C_jmnkggfgiieckortzg[W`z{lc]YXYRPMJ;*&%&(''&%%%$#"""!#-9<>AA@@B@@?>;5("####$##$%%%(*.1379862,++.<R`Z[_alfaPIFSJfrne\W_^^YOPPPPNKHDA>=>@CFILNQQQQSTSQQTX\ckqx~€ƒ‡ŠŠŠ‰ˆ‡†……„„„ƒƒƒ„†‡Š‹‹Œ‹ŠŠ‰„€ztqppppnkic`]]`flsv|ƒ‡ŠŒ‹Šˆ†…………ƒ‡ŒŽ’’Ž‹‡‡‡ˆ‰‡€}yxyxxwwvwwwxxxzz{„ˆŽŽŽ‘ŒŠ‰ˆ‡‰Œ“––“ŽŒ‹‹(())))))(((())))))))))))))))****+++++++++++,,,,--...------..,,,,++++++**++++**,,,,+***++*)**))))((((((''''''''(())**))****++,,,,--,,,,,,**+***)))*)))&%%&%$$##%%$"!"##""!!!        !! !#'5Qnxrnpuuslc]VLA=DP]forpi^WJ<411f|khokEE?99=BEFFEEDFIECFCCLi‚•š†xvwiU_qyY7?snke[M?621110./13Xkc`^]\XRMJIJMNNG9+*-/-/343RrmaWXY\amzvpjbM<@?B]`gbYZXRmm`NHJMLORRTTUSQM=303@Sgqtxzvokilljmry}rZIZPWffc^[XYTMJHD5'$&&')('%%%$#"# #)7=>=@@@@AA@@?<3& ##"#%$$#$$%'(),-.*+*+*)+-7P\RZcdba[\i[K[soi_c[@V_SOOOMLHGC@==>ABDGLOQQQRTRQPQSX\cksy}€ƒ‡ŠŠ‰ˆ‡…„„„ƒ‚‚‚‚ƒƒ…‡Š‹‹‹ŠŠŠ‰…~ysppppomjhca]^bgnsy}ƒˆŠ‹‰ˆ†††„„†Œ“‘‹‰‡……ŠŠ{{xxxxyyxvwwwxxwwz|†‰ŽŽ’‘ŒŠ‰ˆˆ‹Ž“—•’ŽŒ‹Š(())))))(((())))))))))))))))****++++++++++,,,,,.......------,,,,++++++++,,,,++,,++*+++++*)**))))((((((''''''''(())**))****++,,,,,,,,,,,,**))*)))(((((&&&&%$$##%%$$""##""!!!        !!#$(7LkwmmsuvuqiaZOA:=DO^hmnlf^UH<43>tvhgncAC@:9?ECDEDCAEHKFBBHh£ªª¡•‹|wx{hWg‚{T/`ole[K=62231/./12<dc_[YXVSPLKKKKOMJB61-+-31+/Zf^XU]]_fowjaYC=<Facb`]ZPTdd{dUGHMPQRTUUUQOH?411;N^mwtrwxurqqqprstu]GVODQZ^_[XUURLHE?2&$'''''&%%%$##"#(3<=>?@@@@AA@@?<2% ##"#&&##$$&.))&%&***+*++,.3FJ[__X`dZ_YLVqrbZE)4NNLOOOMLHEB?==>ABFILOQQRSRQPPQSX_dlsy}„‡ŠŠ‰ˆ‡…„…„ƒ‚‚‚‚ƒƒ†ˆŠ‹‹‹ŠŠ‹ˆƒ~ztppppomigb`]^bhnty~ƒ‡‰ŒŠ‰‡…………†Š“‘’‹‹ŒŠ‡‹„ywyzyxxyxwwwwvwwwxz|ƒ‡ŽŽŽ‘“ŽŒ‰ˆ‡‹‘”–’‘ŽŒ‹Š))**))))(())))))))))*)))))******++++,,+++,---.-.//......-.-,-,--,,,,,,,,--,,++,,,,+++++++*++****))((((''(((())*******(******,,,,+,,,,,,,*)()))**('&&&%%%%%%%%%&'**%$#""!""!     "#  !!%(0Ijwmhntxtsnf\SC76?HQ^hoplg\QF:46P~rabl_ABA:6?EBBBCC@CHQJ?H^Šž¥­¥”Ž’”ŠqZb}‰w;FrkeZO@622233/.155>^`WVUTSRNLMMKLLKKH</),/-&'4_b_[X[^deqn^R=;@^_UZZ\WPGPQk`PCJJMNRX\`]ZNE;313EYfpvuqprqmjloonnlpKOUGFQ[]\ZVUTNJFB:-##$%&''%%%%$##$'29;<>??@AAAA@@?:/#! !"""#&#!"%)+))++**++++,*,//1DVmigf_fjXRVngh`N+1FOPNNNLKGDA>==>ABDGMOPPRRQPPPORY`gou{~‚…ˆ‰‰‰ˆ‡…„„‚‚‚ƒ„†‰Š‹‹‹‹Š‰…‚~ysoooonlhda`_adjpv|€„ˆ‰‹‰‡‡…„…†‹‘”’ŽŽŽ‹ŒŒ…|{yzxyxxwwxxxxxxxwx{~„‹ŽŽ’‘Œ‹ŠŠ‰Œ”—–“‘ŽŒŒŠŠ(())(((((())))))))))*)))))**++**++++,,,,+,---..///......-.,,-,--,,----,,++,,+,,,,,,,,,,++*++****))((((''(((())*******(******,,,,+,,,,,,,*()+))))(&&&&%%%%%%%%%&*00&#"!"!""!     !!!!#%&1FdyogkrxvvrjaWJ807AJT`iprme[OD81<aƒpefnZ@D@96<CDAACCBDEHEKdƒ™ ¤¬§•˜œ}vtj…‘†e3pje\RC2.,,***+,/0/;V\WSPPONMLMKMKJIHE@5.1.)$):Z^abca]^hhaH:BUZW[`aYRLIDGNXMFLQOORU[a_VL@9307J_kotvsnmlgeijgg_\ZGZNIHR]^\ZVURJFC@5*$$$$''&'&&&%##&08;;<?@?@AAAA@@?:/##%!!""""##%'(***++**++++++./38@TbhmoideUMWije^\XUONMNNNLJFDA>==>ABGJMNPPRRPPOONSZ`hpu{~‚…ˆ‰‰‰ˆ‡…„„‚‚‚‚…‡ŠŠ‹‹‹‹Š‰…}uqoooonlhda``bflrx~‚†‹ŒŠŠˆ‡…„†ŠŽ’’“’ŽŽŽ~y{yyxxxxwwwwwwwwwwy|‚‡‘‘ŽŽ•Œ‹ŠŠ‹•—•’ŽŒŒŠŠ(((())(()))))*****))+*++**++++,,,,++,,,,,,..--//..........--....,,..------,,,,,,,,,,,,,,,,++**++(((((((())))))))**++**+++++++++,,,,,,,,+**))))(('&%%%%%%$$$$$$&&)(%#""!!""!!!!!!  !"$)-@auskkrvxxtoe\M>01:DPZbjqricXLC71Eu‚lgjqVAF>99?CDCBBCACEDIa—£¦¨ª¬ª¡œ™–‡vyz’ŽŽ|Edlf`WOGGFEEFEFJLWZTHLRSRONMLKKKKKHGDDD>73.*'#%>YYW[\]]^]bUIRYRTWVUSMJG@4;EADIMLLQTW\\VI<701=P`lptvtnkhgfiige_[NURGHMZaa^[USMGD@=1($##%%%&&&&&$""+59:<>>??@BBAA@@?:/##$#""!###""%((**++++***+,.148=BDGTfggmiNL^jjd`ZTLLNMNNNMKGC@>=>?ADFIMMPPPPPPNOOUZbiqx}ƒ…ˆˆŠˆ‡…ƒƒ‚€ƒ†ˆŠŠŠŠ‰ˆˆˆ„ztpoooomkgecbbchnuz~‚ˆŒŒŠˆ‡‡††Š’’‘Ž‘ŽŽyyxywxxxxwxxwwwwwwxz}„‰’’ŽŽŽ““ŒŒ‹‰ˆ‹‘–—•‘‹‹‹Š(((())(())))*+******+*+++*++,,,,,,++,,----..-.//..........--....,-,,,,----,,,,--.-,,,,,,,,+++*++*((((((())))))****++**+++++++++,,,,,,,,+**))))((&&%%%%%%%#$$$$##%$"#""!!""!!!!""!!#%(1?[vskkqvvvvof\QB4/5>HU^fnqng_UI=67V{‚lfiqT?E>99BEEDCCCBCEHYp‹—š¤¬«ª®£¡žœ”r†‡€ˆ’†iQd_]]\YYVTUTSTTRWWY[SNMNKLKLKJIIJHEEBA>:73-(&'&CWPPW\YWZ`bUUWYUTRPKGBB?43>HCEIJLOQUXWQF=722>N]hpxxqkiifffghgXD8FMJHR^`a\XUPHDA=9,%#"#$$%&&&&%##&08;<>@???@BBAA@@=;/#  ""!!###""%'**********+/069?<=<?DKQ_qmIGXY_de[SVQNNNNNMLHE?==>?BFHKMMPPPPOONOQV\biqz~ƒ…ˆ‰‰ˆ‡…ƒƒ‚€ƒ†‰‹‹‹Š‰ˆˆ„€|uqnooooljgebcefjqw{€„ŠŒŠ‰ˆ……‰’“”‘‘ŽŽŽŽ†wy|yyzxxwwxxxwwvvwwxz~…‹’“’‘’•‘Œ‹Š‡ŠŒ’•••‘ŒŒ‹Š''(((((())))))++++,,+++++*++,,,,,,,,----..--//////..................----..----,,------++,,++**,,+***))))**))))**********++++++++,,,,+***))((''''&%%%%%$$$$$$$$$$&$####"!""!!!!""#"%)1=XsqjlprrsrmdYNC5/07BMVbiopke[OC75Be~lhflO@C@87BGECCEFC@@Nk––ž§ªª¬¢££¤¢Œ}ƒ‰‹”šŠzRYXWUTOOPPOOOOPPRV[[UPIIFEEFEEFHHHHEA?>:853,'&(.PZUSUTSUY]bWRRNPNKFA=?A7.3=AADFKMNRWYQF:834>KWelrslhhgfffghicN6@FEIX^^\XUSKEB?;5)######$%%$$###)29=>?@@??@A@@@??>:.#!!""!!"""""$&+++)******,04666689<CFEHUTFG\R]ef[W\SMNMNNMKGD?==?@DGHKMMNNNOPOOPQV_ckrw}ƒ…ˆŠˆˆ…„‚‚€€€~€„‡ŠŒ‹Š‰ˆ‡„€ytpoppnnkigeecghlsx}ƒ‡‹ŒŠ…†‡Ž’“’ŽŽŽŽŒzszzxyyyyxxwwwwwxzyww{‡Ž““’••Œ‹‰ˆŠ“—•”Œ‰''(((((())))))++++,,,,,,,,------,,------....////....................----..----..------,,,,,,++,,+***))))**))))**********++++++++,,++****))((''''%%%%%%$$$$$$$$$$%$####"!""!!!!!!"#'-7Povjknprrqg`VL?2,.2<GR[fmooi`XK?21Iq}lgjlL@CC:8@DEDEGGC?C^}Œ•˜’•š£®°®°®©«’tvŽ£¡£–ƒ`QUSRQQQQQRRQQPPQSTSVQMKGECB@A@?CCBB@>>:9630*%'*2R_XPRURPTa[DICEFEB><>>5/,-:@AEJLMNNPOC9743:HU^glmlihfffe_XVLOULCFOZ^\ZVSOHC><93'$#####$%%$$###)3:=>?@@@?@@@@@??>:.#!!""!!""""!"$(**)******,/3444569@GIIIMC@AUhonfbcgSLMMNMLJFC@??@ADGHKMMNNOPRTTTWY_fktz}ƒ‡‰Šˆˆ…„‚‚€€€~€…ˆŒŠ‰ˆ†ƒytpooonnljgedehiov{ƒ‡‹‹‰‰‡†‹”‘’‘‘ŽŽŽŽŽsx{{yyyxxxxwwwwwwwxxy|‚ˆŽ’“’‘Ž”‘ŒŠŠˆ‰Œ’•—•”Œ‹Š''((((()))**++++++,,,,,,+-----------......////00//..............................------,,,,,,,,,,+***))********++****++**++++++++,+******))''&&&&&&$$$$$$$%$$$#$$$%#"""#""""!!!##%(*7Kjypilmppme\QD91++.8@KVajpple\QG;35Y{ylgknQ@EC<7?DEEFHGB?No…•˜‰¡¯¹º»¸ª§’|“˜¢žŸsMUXXVWVSRSSRPRRUUUUWPNJHFFEECBBAAAA@>><;:63.)(+*5T][XSQOR[aJ;??CB?;8873/--9DIKLNPOOQO?652.5DQWY]dihkkfgi\OW8LYKGNY]\ZVSQKD@<:91&####$"#$$####")4=????@A@AA@@@@@?<-#! """"""""!"#'')*+*+))++-102479669=@ED?CFAKfg`_\ZUNMNNMLJFCA??ABEHIJLLNNPRVWZZ]aaemt{~€„‡‰Š‰†„ƒƒ‚€~‚‡‹Ž‹Š‰ˆ†|wronmmnmjhgdefjlpw}€ƒˆ‹ŽŒŠ‡‡Š“‘ŽŽ‹ˆzux|}zyxxxxwwwwwvuuxxy~ƒŠ”“‘Ž“–Œ‹‹ˆˆŠŽ’•–”“Ž‹Š''((((()))**++++++,,,,,,,...--------.....///////................................--...-,,,,,,,,,,+*************++********++++++++,+******)(''&&&&&&%%$$$$$%$$$#$$$$#"""#"!!"!""##'.7EfyrkknmlkcXK?4,))-3:GP[fmqpkbXMA516^{y~mein`?CC>8>EEEFIHDHaw‰Œ”’ƒ‹¤±¹»¼º²¯©ª¬®  ¥—\XXXVTTTPQQQPPQSUXYYTPMFFEEDDEDCC@@A@>>=;;950-+,.7UUWWRQPTZUB;;>>=;8751//2>HLMMNPPOQUG(/0.2<EOSV^bbegihkid_QQTOOWZ[XWTOJD@?;95-%""$#"##$$####")6>A@AAAAABA@@@@@@>/#! """"""""!"##$$()()**++,/135653668=?>CCC=I_ff\ZTUOLNNMLJFCA?@BCEHJLLLOORUYZ_aegglpw{~€„‡‰‡‡†„ƒƒ‚€~„ˆŽŒŠ‰†ƒytpnnmmnmjhfefgjmty~‚†‰ŽŽŒŠ‡ˆŽ“‘‘ŽŒ‹‹‹Š€utz|{{zxxxxwwwwwvvvxxy~…Œ’”“‘“‘‹ŒŠˆˆ‹”•–”’‹Š(())**)))******++++---------......--/......0////.../............///////.////////-./.....-,,,,,++,,,,++++++++*********+,,,,++***+++++**))('''&&%%$$%%%%%%%%$$$$$$$$########"""#$'+1=Zxrjjqpph]TH8-(%&)-5?IT^fnome]RF;20>gwvkbelvK?D@::EDDFGFL`tˆ†Ž‘„‘£±µ¶º»¶¹»º»º®¦¢žŠjZVRRQSSTPPNMMRTRTUUSQNKHFEDCDCCCBBBA@@>===9841...AWVQPQPOMUV;5;<=:8432019GMNMNNNNNQSSG=)(/5;CJMV[_bdfgfcabUVTKPY[[YUQMEA<;:60'$$$$$$##"#""""#'2>ACCB@??@BAAAA@?=3%!  "!!!!!!!!!!"""&))**++*+/1324468;;:9==BGMR[fba\VPTQNNMJFB@@BBCFIKMLMMQUZ\`ekoppptw}€ƒ‡‰‰ˆ†„„‚€€„‡ŠŒŒ‹‡„{wronmmmlkjgffgilqw{€‚…ŠŽŽŠ‰ˆŒ’““’ŽŽŽŽŒ‰‡‹ˆywx{}}zyxxwwwwwwwwwwwxz€‡’“’‘““‹ˆ‹Šˆ‰Œ‘“•–“ŽŒ‹‹‰(())**))****++++,----.------......../...//./////../-............///////.........-./.....-,,,,,++,,,,++++++++*********+,,,,++**++++++**))('''&&%%$$%%%%%%%%$$$$$$$$########""""%(-8Mrxpmqtri_SF5)'%%&)09CNWbkpmh`YO@2/0Cmxxmccnzr=A?:8ACBEAG_vƒ€Ž‡Ž”“™ ¤¯®°¹¼¼¹³°µ´µ©©¡wUTYesyyyyum^NLLNNORRPNKHFEDECCCCBBA@@@?>==:9863..,@SPONNKKMQR:69:8652202=KPONNNNNNPUUTT929:;=AFRWZ[_b`a_\_YSNKOXZYXSPJ?<9750*%$$$$$$######""#&/;@ACB@?@AAABBA@?<5)!!!!!!!!!!!!!!"""$&(**(()*,/0124547755699;BJSblbZRPOSPMMJFCACCCDHJLMLNORU[afkrvwxxxy}€€„‡‰‰‡†„‚€€€‚„‡ŠŽŒŠ‡„{ysommmmmlkifgggimrx|…ˆ‹Šˆ‰’’ŽŽŽ‹‡‡Œyy{|||zyxxwwwwwwwwwwwx{‚‡“”’‘‘“‘Œ‹‹Šˆˆ‹“•••’ŽŒ‹Šˆ))))******+++++,,----.-............././0//00//////..........................................-,,,,,,,+++++++*****++++,,,,,,++*++++++*****)'&&&&%%$$%%%%%%%%$$$$$$###########"#$'+4GivnjqvvncVF5'$$$%&)1:EPZdlpkf]RG:.-4Usxxlcahw~U:@76?ACDAQu†Œ†’•“––“—š›¥¦¬¹¾¼³³²³±¬¤¨¦”€^bt~~}|{xxutk`YXWURROLJGDEFFDDDBCA@??@>=<;:98754.-/?OLMLJIGIPL66965310/5CMRRNOMMLLMPSW\VF;9<;=@IPVWZZZY[ZYUPLLSXZVRNLC9840,(%$$$$$$$$$$###""#$+8@ABCBAAA@@AA>??<7*!""!!!!!""""""##""$&+*)**)****/2244010/57<@EJ[fjaYTOPPNLKGCABAEFIKLMMMNQU]aipx|}}{zz~‚††ˆˆ‡‡„ƒ€€€ƒ†ˆ‹ŽŒ‹‰†‚~ytommmlmmkjihghhjnty~†ŠŒŠ‰’‘Ž‹‹ˆ†‰ˆyyy|}{{zyxxvvwwwwwwvvvy}ƒ‡““‘‘“ŒŠŠˆˆ”•“•‘ŒŒ‰ˆ))))****+++++,,,-..................../00//00//////......................//..................-,,,,,,,+++++++*****++++,,,,,,+++++++++*****)'&&&&%%$$%%%%%%%%$$$$$$#########$#"#%(0=^ysinvvqgZL6($#$$%&+3;FQ[ennjaZMA3--8\xws~pacht€u@=:5<@ACLf†”––˜™’„Œ‘‘š ¤²¶·´±¯¬­Ÿ™––”nt{zvwvwtssstqomjhdb]YTRNLEDDBABA@AA@?==<;:9875430--@MGGFFFFKQF686530//8IQSSQOMMKKLLPRYWXL;69<=CJMRTVTTTUVQMMSXYVSOLIB81/+%#$$$$$$%%$$%#"$""##&2=?@AACCA?=@BB@?>8,""""!!!!""""""##""$$+)*+,*(((+0//0-**1403879>OWaWQZYQPMKIFC@@CEEHLMKMMLOT[cjsz‚€~~~„†ˆ‰††ƒƒ€€€ƒ†‡‰ŠŽ‹‹ˆ…‚{wrnmmmlllkjhhghhjouz}†ŠŒ‹‰Š’‘ŽŽ‹ˆ††Œ†zxz{}{zzxwwvvvvwwwwvvvy}ƒˆ“‘““ŒŒ‰‡‡Œ’””•“‘ŽŒ‹‰ˆ))))***++++,,,,,-.......////....--//000000//////................//--00////////....///.......-,----,,++*,++++,,,,,,,,,,,,,,+,,,,,++++***)*)&&&&%%$$$$$$%%$$$$$$##########$$##%),6Nswljruqk_O:*$!""#$'+3=HR^dkje]RH=1,5Hk}}€sbcht€e5968?CB[|“‘™ž˜”œ”‡Š‘˜¤£©«¯³´©£‘Œ†tgtuutrqroonnnllifb`__^\\\XUTQMJHEA==>===<:98765210..<KHEFCBBGRA6872111=LTWWSQPOKKKKMQRSNTSE<=?@CHORUTONNLPPPPRRPNKID>6/.+&%$$$$$$$$$$$$$$####$+8>@@@@BA>>?>?=<;5+"!!""!""""""!!####$$'((*))(+./,+)*))*-17<=CGNW[aotbUONMKGDB@AEHHIKMMMMLORZbkv|€ƒ‚€~|…‡ˆ††„ƒƒ€€€€„‡ˆŠŒŒ‹ˆ†ƒysomkkklkkkigfghimqv{†Š‹ˆ’Ž‹Œ‰…„Š€|yy{|{{yxxwvvuuvvvvwwxz~„ŠŽ’‘“’ŽŽŽŽ‰‰ŠŽ“•“”’‘Œ‹Šˆ‡))))**+*,,,,,,---...../0////////..//000000//////....////........//--//////////....///.......-,--,,,,,,,,++++,,,,,,,,,,,,,,,,,,,,++++***)('&&&&%%$$$$$$%%$$$$$$##$$$$$$$$$$#$(+2Ek|okpttncUB-#""""#$'-5=HR]fjjbXMB705Gi|~}v}wbdfp€‚~H776=AHjŠ—š–˜£¤›ž›‹ŒŽ˜¢¦­¬®±­¦œ“‹ˆ‹‹„ˆ€kooqqpmmkjkjiihdbe`__ZYXXXWTQSRSRRPG?==;::98776422...=DBACBBDIT>664024BOSVWSSPOLJJLLMQSMNTSLB?@BDIMNMMJDDEGHFDDCEFC@91,+)'&%%$$%%$$$$%%%%%%%%#%,6<???@???@><:83*#""!!"!""""""""####$$&'''&*,09<3(('&')1=CEMPQUVY_p€y^XNKLIA@BBCFGIKMNNNMNOU^gr{€ƒ‚€~…‡‡†…‚‚ƒ€€‚‚†‰Š‹Œ‹ˆ‡ƒ€{wrnlkkklkkkigfghimqv{†Œ‹‹ŠŠ‘‘ŒŒ‹‡ƒ†Œ†|zyz|||{yxwvvvuuvvvvwwxz~„ŠŽŽ‘•ŽŒˆ‰Œ‘“•“”’‘Œ‹Š‰‡†))))++,,,,,-----....../0////////0000000000//00//..////..........00////////....//......////...---,,,,,,-+++++,,,,,,,,--,,,-,,,,,,++++**))('''&&%%%%%%$$$$$$$$$$!#$$$$$$$$#$$$(.<`tlqvyqhZN5$!!##!#%'.5<GQ[dieaVJA96?]‚ˆ~zv{{hbbl~„ƒt195<@Ov‘›žŸ¢¡¤ œ™Œ“ž¤¥¤¡ Ÿž˜‘Š{txu{Šikklmjkigghffda[V[\ZXZXTQPPOMMMMNQSRGA<;9:89886551/0/2FGEEBDEIRP633216GQTTUURROMKKKKKMMPONOLD62:?AEFGHFBCCCB?CFIJHFA<0+(')'''&&%%$%$%''&&&$$%%%&*07;>?=?@?<84-&#!"#!"" """""""""""#&&%&'''(')4:/(&%''+1;BEJNQSSWXYj~]^oPHGC@@@BEFIKLLNNMNMQWcmv}€~}}~‚‡‰‰‡…„‚‚ƒ„ˆŠ‹Œ‹ˆ‡†‚}wtqlkkkkkkkjhfffgimqv{‚‡‹‹‹‹Ž‘ŽŽŽŒŒ‰„‚ŠŒ|yy||}{zxwwuuuuuuvuvuuxz…‰’”ŽŽŽŒ‰ŠŽ‘”””•’ŽŒŠ‰ˆ‡)))))*,,,-----......../1////////00000000000/000/..////..........//////////..-///......////...---,,,,,,-+++++,,,,,,,,--,,--,,,,,,++++**))('''&&%%%%%%$$$$$$$$$$$$$$$$$$$$%%$&)3Oyqpw}zpdTC-#!""##$&(+3<GR\bfd`UKDCL`{Œ†zwvz|ia`j|„ƒˆZ+26>Uz›¥¦¥§¢™ Ÿ”ŽŽ—Ÿ¢Ÿœ”Šuiba\n‡v_gghhfecbdeb___]ZXZXVQOMIIIKKKLKKMNMGC?<:99875554110.9HEBEDFFJOF22437HRUTTSSSQOMKJKLKKMMKKJ?0%',29;CGFD@@A@BFJIHFC@6/*'''&''''&&&%$%'('''&$%%%%%&*-38:=>;61*$""%$"#$%!""""""""##"#$$%%&&'(&'(&'('&&%'*26>DGMNPSZcnaN^\ICA??@BFHIKLLNNMNJOS]iqy~}|}„†‡ˆ†…„‚‚‚…‰ŠŒŒ‹‰Š‡„€|wsnmlkkkkkkjhffffhlqv{‚‡‹‹ŒŒ’‘ŽŒŠ‡ƒ„Œˆ{vxyzz{ywvwuuuuuuuuvuuy{†ŒŽŽŽŽ””ŽŽ‹‰‹Ž‘””•”’Ž‹‰ˆ‡†****,-,,,-......./////00//11////0000000000000011//////.0////..//..//////........////////.....-......,,,,,,,,,,,,----,,-,--..--,,,,++**))((&&&&%%%%%%%%$$%$$$$$%$$$$$$$%%%%%'+;fwqr{yk^M:(#"!"#"#&(*1:EOZ`cc`VOQ\m}ˆŒ‡xxv|}k`^dz„ˆŽC+2<Tz—Ÿ§©ª©¥žŸ¡šŽ‹‰‰’˜š›‹…~wlghiaq}„]bfhfdb_dbb`^][YVVVTQOKIGGEFHHIJJJKMOOHC<97765665333/0CKGFGGCFIM?112:GRTUSSRSQPNMLLLKKJIGFD:,#$$%)-6<=><>AABFIECA:4,(('*++*()(''&&&&&&'&''&$&%$###"%+.231-'"""#$%""###"""""#"$%%&&)+'&&$&&%%''&&''(()),.18=EJPW`jvu\Y\j^G@AA?AFHIKKKLNMKJLPWemv|~~~}z~…ˆˆ‡†„ƒ€ƒˆŠ‹‹Š‹†…{wsnkkkkjjkjhggggghlqv|„‰ŠŠ‘‘ŽŽŽŽŒ‰…„‡Œ„~zyxy{{zxvvutusuuvvvuwvx}€…‹ŽŽŒ”’ŽŽŠ‰‘“”•”“’Œ‹‹‹Šˆ‡†****,-,,,,....////////00////////000000000001001100//////////..//..//////........////////.....-......,,,,,,,,,,,,----,,,-....--,,,,++**)(''&&&&%%%%%%%%$$$$$$$$!$$$$$$$%%%%&),?q„try€‚ufYF1$#"""#"#%'*19DOZ`cdaZ]gq~†‰Š„y~€j`\^v‡ŒŒz6/5Ow‹— §©©¨§¢œœ—‹‡|‚Œ’‘Šyuvsfagkr}u~lV_cb`\\_]\[\XVSSSQPMKHFDAABAACDDDEGIIJGB<8665666533227KOGGGGJGHL=028FPTTUSRPOPNMLKKKKJIFEB8*###%&'&)+/:<<@DDEFB5-*+---*++*)*)((''&&&&&&&%%&&%$$$#"##"$$""!""!##"""###"""""#$$),15975.)'((%%''&&''(((*+*,/7DMTX[\[^hiWPJC?>?ACFHIKKKKLMKJJOVbitz~~~}zƒ‡‡‡…„ƒ‚‡ˆ‹ŒŽ‹Š‰„„zvpliklljjjigfffgijnrw{†ŠŠŠ‹ŽŽŽŒŽ‹‡„…‹ˆ}yxxy{{{yvvutstuuvvvuuwy~ƒˆ‹Ž’”ŽŽŽŒ‰‰‘“”•”’ŽŒ‹‹‹Šˆ‡†**+++,--+,..//0000001111111100110011001111111111111100//////.../..////////....//..00////.....----..-,,,,,,,,------..,,,.....----,,+***)(((&&&&&&%%%%%%$$%$$$####$$$$$$$$%%%+.@outy€€p_Q=+$###"#"#%(,08CNX^ac__ku}…‰‹‹ƒ|ƒ…|m_[\t…{nv~b21Dp…”¥¨¨¨¨£œ™“„wu„ugelqj`eZpp]qyUSWYYYZZVWVTSSNOPLLKIFDA?=<;<?@A@CEFFECCA<756446555662;KICDCHHHIN=16FPTUTTUSPONNMMLKKIIGE?5%##$$%&''(*-2;BFDA;2--,---,-,*+*((((((&&%'%%%%%%%$####""""""""##""#"#""###""####%*18AGIHD<3*$#%%&&&&'')*++)+,0;ELJOPV]c^UNJEB@?@ACFHHJKKMMKJIJOT]hry~€}‚ƒ†‡†……ƒ€€€ƒ‡‰ŒŽŽ‹ŠŠ…‚}wsnjijjjjjjhgffggilptx|…‰ŠŠŽŽŽŽŽŠ…ƒˆŒ„{xwyz{zyxvvuttstuvvuuvwz~„‰ŒŽ”’ŽŠŠ‹’““””“ŽŒ‹‹Š‰ˆˆ‡**+++,--./..//0000001111111100110011001111111100111100//////.../..////////....0000//..//.....----..-,,,,,,,,------..........----,,+***)((('''&&&%%%%%%$$%$$$####$$$$$$$$%%',/>jusz€zeWI3'$#####"#$'*-6ALV]`ba_n|…ˆˆŒƒxx{}}o]Z[gf_i{ƒ|H)>d}Ž–Ÿ¤¦¨¦¢—“€u|vprpoleahhdgpeN^Ic…YMQSTUSUUSRRPNHIKJJGEB@=;98999;=<?BCCEEBB@<764456666643>IEDCDEDFHTC6BOTUTSQQOONNMLKKKIIGE?2$%#$$%&''(*)4@BB?7.+-./,..--,,++(''''''&&((('%%%%$####""""""""##"""#!#""##$$##"%*4?JSWWVRLA3'$#%&&&&)),/-,.36;<?HKP]llg_YQNGC??@ACFHHJKKKKJIHILR]gpx~€‚…†‡†……‚‚€‚…‰‹ŽŽŽŽ‹Šˆ„€zvpkjjhjjjjjhgffghjlptx|€…ˆ‘ŒŒŒŽ‡„„ˆ‰}zwwyz{zyxvvuttstuvvtvwx}…‹ŒŒŽ–‘ŽŽŽŠ‹Ž’“”•’ŽŒ‹Š‰ˆ‡††**+++,....-.//11000000001111001100111111111000//00000000////////....//////............//..--....,---,,,,,,,,------..--......----,,++**)(((((('&&&&&&%$%%$$%$######$$%%$$%%'-3>eusv|paP=+$#%$######&)-6@KV\adebn€…‰ŠŒ‡uwx{~o\YZfcgpzx|=-Vs‡“š ¥§¥£Ÿš–†z{wqjihjegjhqw{rTHQW~bIOONKPMSRNLJHDEHEDDCA?<6544366779>BBBAAA@@<963465654468=FEDDEECELWG@MSUSSQPOOOMMMLKKJJHF>1$$#$%%((''(*+4960+-..--..-.-.-**($#&'*'&'())*'&&$$$##""!######"""##%$"!"!!""""#(2@LVaihgaZPB3*$$%%&&(*05:=A=8L\lvuvvsngaZQMHD@?ABDGIIJJJKKIIIIJP[grzƒ‚€„†‡‡…„„ƒ€‚…ˆŠ‹ŒŒ‹‹‡ƒ~xrnjjiijjjjihhgfhjjmrvz~ƒ‡Š““ŽŒŽŠ„ƒ…Š…}yvvyz{zxwuutsrrtuvvvvvw~ˆ‹Œ’˜‘ŽŒŠŒ‘’”””’ŽŒŠˆ‡†„„‚**+++,....-.00112222220011110011111111111110000000000000////////....//////............--..--..--,---,,,,,,,,------..--......----,,++**)(((('%%&&&&&&%$%%$$%$######$$%%$$%&)/6Aa~usuxkZJ5&"$%$$$####&)-5?IS\adgnz„†ˆ†}kpwvxzr`]^dguz{y}Žx/>hzŠ“™ž£¢¡ ›‡€zvpggfhgegox|xwob\Wg]CKJFFIJTUMGFD@?BA?@?@>:63310034459>@@???>>>>843556665467@HFDDFEEHOXKHPUURQPOOOMMLLLLKKIG?3$$#$%%''&'(*('*'(,/.///.0.-/./-'%##&'*(''(((&''&%$%$#"""######""##)52%!!!!""""$,8DS_ktxtoh\N?0*%%%').0/4<HY[Pu€wsvvutqmf]TLFB?AACEGIIJJJKKIIHHJP[grz€„„‚ƒƒ†ˆ‡…„ƒ‚‚ƒ†‰ŠŒŒŒŠ‰‰„€{vpkiiiiiijiihhggjkkosxz€…ˆ’”‘ŽŽŽŽŒ†ƒ„‡‰ƒ€}yvvxzzyxwutssrrtuvvvvwz~„ŠŒŽ•”ŽŽŽŒŠŒ‘‘“”“‘ŒŒŠ‰‡†„„„‚,*+--,--..-.11002233222222221111001111112200122211110/00////////////////////.........---..-,--,,....,,,,--------------......------**)))(((''((''&&&&%%%%%%%$$$$$##$$$$$%&'+1:B\|uqqqlV?-&$#%$%$###$&).2;EQZbhmv€‚„ƒ„z_Omjippsda`fs~xvy…‰ˆa3[r‚Š˜žŸœ˜‹††‚pgaaehgb^fowpovxxovo8DGBAA?AEEDAC>;=<;<=:853211/./11159<=>>>>===;8556776888:<DHFGEFFFHMTNHQUSQPOONMMMMLKKJKFA5&%$%%%&'&'))(&%$(+-//...00//01/'""#%',*(((''''''%%%%$$##"""""""###&-*$"!!!!!""%/=KZiv~„zrg\M>1)'),04<JTMDOO_~|vvuutqmf^VMFB?DABDGIIIJKIIHHGGHOYgr|ƒ††…††‡‡‡…ƒ‚„„ˆ‰ŠŒŒŠˆ†…„~xtnjhhiihhjjihggfikmpty|‡Œ‘””‘ŽŽŠƒ…‰‡‚~{xwvxzyxwvtssssstuuuuvy|‚†‰ŒŒ•’Š‰Œ‘““’‘ŒŒ‹‰‡†‡…ƒƒ,*+-..--../011112233222222221111001111112211333311110/00////////////////////.........---..-,--,,----,,,,--------------......----,,**)))(((''''''&&&&%%%%%%%$$$$$##$$$$$%%(.4;FWwuqqonS7'%%#%%%$###$&)-39CPZcmt{€|ub<Gkppsqwhdcfs|wv„‰‚PCet†Ž–™š˜•†„ˆ†p\`aghc`]cly}ukl{||L9BC<;;<@><<=;998778641//./-,-///269:;>>>====;877777997:<=DGFDDFEEHLPNHNPPONMLMMMMLJKJIGC9&$$%%%&''())(&%$%+../..22/0355/'  !#',*(((((''''&&&&%%$$""""""#$##!""#"#!!!!""&0?LYj{‡Šˆzqf\MA8436ASalk[]bgy}‚€wttuusnibWNEBBABDFGIIIJKIIHHGGKR]is~…‡‡‡‡‡‡‡‡…ƒ‚€…‡‰‰ŒŒŠ‰ˆ†ƒ|vqljhhiihhjjihgggiknquz}„ˆŽ”•‘ŽŒŽ†‚‚†Š…€}yxvwyzyxwvsssssstuuuvwy|‚†ŠŽ’•’Ž‹ŠŽ’‘“ŽŒŒŠˆ‡†„ƒ„‚---.....//01112222222221121122111211222233333333330000//////////................//--.-,,,,,,,,,,------------------....--./....--,,+))))))(''&&''''&&%%%%%%%%%%%%"$$$%%%%'+05<IXmxkhkmY2$%%$%%%%%%%&&(+28AM\hu|~|{wp\;(?fyrqtzjdcbmt{……}{z|uIRmy‚‹“—”‰ƒ„m_\`a^adcgt}pktxtwj-9><867:::867553266510/-,,,(*-,,/1467:<<<;;<=977899<DKA>:?EGGEDEEFGIOEAKNKLMLKKKKKKJHGGE=+#%%&&'')*,)(&%$%,.///111688:80&   "'-.,*&)()'''''&%%%&$$$$$############""!!""%.=L]m‰Š‰‚}umh^TPIFHTbfekeelsvyx|zvuwtrqkcYPHCAADEGHHIIJJJJGGFGLS^it…Š‰ˆ‰ˆˆˆ†„ƒ‚‚„‡ˆŒ‹‹ˆ‰†…‚~xrnjihhhhhhhhhggghjkprv{~ˆ”•‘‘ŽŽŽŽŠƒƒ…ˆˆƒ€}zwwyzyzvvutsttttttttsvx|ƒ‡ŒŽŒŽ””Ž‹ˆ‹Ž‘‘ŽŒŠŠ‡‡†…ƒ€,-./..../001122222223321121122111211222233333322000000//////////................//,,,-,,,,,,,,,,------------------....--./....----+))))))('''&'''''&&%%%%%%%%%%%%$$$%&%%)-33=JYgrngfid@$%%$%%%%%&&%%(*.6ANat|yumaJ4.6Yxsry{laagir†ywwzzdK]pxy€ƒŠŽ’Š‚vlhddgaY\binv…|rllnqsv>1475455564322210231/..,,,,('))+,/02389:<<<<<;:89<=?YbHB@>BIIFFGFFHGHJBCHJKLKJJJJKKJHGGD@5&%%&&(***+*'%%$%,.//.048=>;=;3' "*012/-,++)''))&%%%%&$$$$$$##########""!!""'.<K^n}ˆ‹‹‡‚yupkf`WWX]fg_[SO]dRJkqmrvuuqmd\RJCBCDEGIIIIHHHHGGFGLS]jvˆ‹‹Š‹Šˆ‡†„‚‚‚…‡Š‹‹Œˆˆ‡‡„€ztqmkihhhhjjjjhgggijmqty{~…“•”‘ŽŒŽŽ‡‚…ˆˆ‚|ywvxzywwvutsssssstttvvz…ŠŒ•‘Š‰‹ŽŽŽ‹ŠŠˆ‡†‚€ƒ........000111222233332223333322333333333333333322110000/////////////..............-,,,,,,,,,,--,,----------------....--.///..--,,+)*****)(())('((('&%&&%%%%%%%%%$%%&%%%*/16=MZfonhdcfV+!%$$$$%%%&'(().6FXo‚„€}xofUE?69Tupl||kcbeiv…†usuvyzbL`pprv|„ƒ{rjgihhmlkmryxz~‚ymaVKKGMK.03111112310..//-//---++,,'$))'(,,03588::9:;:::;:=??BCCBADFILIFHGDFIJH@>FHJLIFGIJKJHFEC@9)$$&$(++++*(%%%&+.00.1:=@B@=:4(%-24785/-.*&&%&''%%%%$$$#%#%$%%##""""##"""#%*4GYj}†‹ŒŠ‡†ƒ~{zwmlgY[W\f^F@F5<`v|wssntog\SJDCCBEGHIIIIIIIHHEHMT_mxƒ‰ŒŒŒ‹ˆ††„‚‚„‡ˆ‹‹‹Šˆˆ†ƒ}ytoljhhhiiiihhhgggiknrtx{€Š’••’‘ŒŽ‰ƒ„„ˆ„~~zxvuwxxwvuutsssssssuuvy{€†‹ŒŽ””ŽŽŽ‹‰ˆ‹ŽŽŽŽŽ‹‰‡†††„‚‚ƒ„........00011122223322222333332233333333333333334411000000///////////.............-,,,,,,,,,,,,,,,----------------....--/.////--,,+)*****)(())))((('&%&&%%%%%%%%$'+)'%&(+,/5>LZfoqkgcfcA"$#%$%%%%%&))+3DTl…ˆ„{tj_VPIDFRabf~zncahk~‰‡{ssuvw|yOQgljkoustkgjklot|}€†‡„„yq^MD;1224---.0011.///,*++++-,,,++++(%&&'(*+.135787567779::>BDFHJFFFFHJLMKJIHKKJG@@DHJIDDGIJIHGEB?9+$$%&(+,,,+)&%%%*.00/6>@DCA?>3( !"'07<<99852.(('%&&%%%%$$$#"#$%%%%#####$$$$$#$(2GYj|‡ŒŒŒ‹ˆ„…ƒ‚{un]\cieZPVO?Kj}~vthC`qhaUMFEEEGHHIJJIIGGFFEHMT`nxƒ‰ŒŒŒ‹ˆ†„ƒ‚‚„…ˆ‰‹‹Š‰†…†ƒ€|wsmkihhhhhiihhhgggiknruy{‚””’‘ŽŒŒŠ…€ƒˆˆƒ€}zxvuwxxwvuutsssssssuuvy|‚‡ŒŒ‹–“ŒŒŠˆ‰ŽŽŽ‘‹‹‰‡††ƒ€‚ƒ†‡--..///-/011112222222222233333223333334222333333332211111000/.//////..--..........-+,,,,,,,,,,,,,,------------------............,,,+++++****))))(()('&%%%%%%&&&'*8C7'&'&)-06?L[fotpigbeZ/$##$&$$&'(,3=Ocx…‹‹…wld`YWRNOXadn{wngfhp‡Œƒyknrprw{WAWbfacegwnalos{ƒˆˆ†ŠŒŒ‰~kWD86444471*()/.----,,*)))*****(''''%#$&&''*,/1345533333788<BFIJIJJHILLPRQPOQNKHIHCABEFBBCGGHIHF@?9,%%%'(+-..-*(%##)-..1:@EIEBB=1$#%+2:=?=:8642+*)%$%$###%%#"$$%%%%$%&%&''())('),2EVgy‡Ž‹‰‰ˆ…„€|pdkoji[]h[5Adv|wrbcpjaXNFEEGIIIJJJIIGGDDFGKUamxƒ‰ŒŽŒŒŠˆ†ƒ‚ƒ„‡‹‹ŒŠ‰ˆ†……‚€|xrljhhhhggiihhhggijlosvz}Š’“”“ŒŽˆ€€„Š…‚~{yxwvxxwvtttsrrrssssuuuy~ƒŠŒŒŽ”‘ŽŽ‹ˆ‡ŠŽŽ‹Š‰††…ƒƒƒ…‡ˆ--..//0/111111333333333334444433333333343333333333222221100000//////..--........,,++,,,,,,,,,,,,,,++----------------............++++++++++++))))(()()'&&&&&&'''(-FZL00+')-28ANZenrsliccfQ)##%%$#((.9K`tƒ‰‰ŠŠƒyjcaa`\XVUYhuvsxrhfio€†unnnopwyY8KW\^]Z[nyjwyr}…‡‡‰ŠŠ‰‚oW>9448?;697.'(*,--,,+*('''((''&'&%%%#$$#$&%'),./10222222478>CIKLLLMONNQTWXXXVROKJIGBAA?=?BCEFGFD@<5*&&'()*,,.-*('&%(-.00<CEIIEB:+! "%07;;;<;:741.,+'#%%###$$#"""!!!##$$$%&'())+,.18FYjzˆŽŽŽŽŽŽŒŒ‹‡…yrh^OG>40031:AMmyuvvsokc[QIFFHJJJJJJJJHHFFEGKUamw‚‰ŒŒŠ‡„‚‚ƒ„‡Š‹ŒŠ‰‡…„‚€€|vpkihhhhggiihhhggijlosvz–‘’ŽŒŒ‹†€€„‰ƒ€~{wvuvxxwvtttsrrrrsssuuw{~ƒŠŒŽ’”‹ˆˆ‹ŽŽŒ‹‰†ƒƒƒƒ…‡‡‰--////0011111133333333333333333344443333443333333322441000000000................,,,,,,,,,,,,,,,,,,++,,--------------......//..--++++++**++**))))((()((((''((((()+?UP<;-)*.2:EP[dmorlhdbegC#"%&$%+.;Oi|‡†‰‰ˆxcXX^a`_]ZWWe{{ozsggfmtxyvpomoruz\36KVVXXR\ntxrbk~zˆ†}iP@98865889;?5('''*,*)(('%%%$&%%%%$$$$$$"!$%$&(*.,-///0111499?EGMNOOOQTUVWYY]ZYXURNJIIGDB><=ABABCB>8/*''&')**+,,*(((%'+/03@BGJJH@2' &5:<=>=93/--.--*(&$$#!!!#"!!   !"$$%())*.-,.04EZp~}„ŒŽŒŽŽ‹Š‡}uj`WOE7.(&#&*6:@NYiottnf^SLHGIIJJJJJIIIHFFEFLWalx€ˆŒŒŒŠ†ƒ‚„†ˆŠ‹‹Š‡‡†…ƒ€{voljihhhgghhhhhghjknotw{„’”’‘ŽŒ‹Œ‹‰ƒ€€…‡„}|xwtvxwvvtssrrrrrrsstuy}‡‹Œ””‹ŒŠˆˆŒ‘‘ŠŠ‰†…ƒ‚ƒ…ˆ‡ˆ..//0000111111333333333333333355444433334433333333334410000000..................,,,,,,,,,,,,,,,,,,++,,--------------.....///..----++++**++**))))(((((((((()))))**2IXK:-*+/6>GR^gkkflmc`cif;"$$%),5Ih‚…„…†…|oXJNPX^bb``\Zc}~{‚ujjhkmouxrmnnruw^1.7KQPQMNX^ZRFBi}{uzvkP;56:987768;<;.&%%&''%%%$$$$#$##$##"""""!!##$%&)+,,----.0147;>FJKNPQQSVWZ[\Y[]\ZYUSONNKIGDB>>@@AA?<5/*''&'((*+++*(((''+..4BBGIHF?-#  )5;=?>72.+)&$(,,*&$#"#""!#"!! !!#$%'*)*,,05;9ESd{x|‰ŽŒŒ‹Š†yskfZRB9.((+09DFLONQ\kkicWOJIIJLJJJJIIHGEEEFLWanyˆŒŒŒ‹‰†ƒ‚……‡Š‹Œ‹Š‡†„ƒƒzumjhhggggghhhhhghjmorux~‹•’’Ž‹‹‹‹‹…‚€€……‚}zxwuvxwvutssrrrrrrsssux}„‰ŒŽ•“ŽŒ‹ŠŠˆˆŒŽŽ‘‘‘‘‹Š‡…„„„…ˆ‰‰Š////000022221133333333333333444455553333444444443344432011000000..........----------+++++,,,++,,++,,,,,,,,,,,,------.....///..--++,,,,**++**))**))(())'')+**,,+,-09LT<--/3:BLU`hjga`khbbcoc/$(+/>^~‡„‡…w]B5<ELRX\_adbbds€ˆˆ{nkjijlrtpkklouu_2,.9HKHNKJLBB?4;dxzpbN;4579;;:968:;;6(%$$%%%$$##""""""""""""""!!!#$%&&(+---,--/.;A=BEILORSTUUUX\^]^^]]\XUSSTRQPIFD@=;>=<94.*))(((((*++****(')*.4AFHHEB7)  "#,6=><940,*('$$'(*($###$$"!"""! !$%'(+--/36<Qhnjp{ŠŽŠ‹ŒŠˆ†‡†ytlf\RE732249?GEDGIKWZY]aTIHKMIKLIJIIHFEDEFLW`nx€ˆŒŒŒŠˆ…‚‚ƒ…‡ˆ‰ŒŒŠ‰ˆ†…ƒ„zsligggggggghhhhhijmosxxƒ”‘‹ŠŠ‹‹ˆ…€‚‡ƒ}zyvvwxwuttssrqssssrstw|‡ŒŽŽŽ–“ŽŒŒŠ‰‰‰‘‘‘Œ‹ˆ†…ƒ„„†ˆ‹ŠŠ////002222112233333333333333444455555333444444443344431121000000..........----,,,,,,+++++,,,++,,++,,,,,,,,,,,,------......//..--++,,,,,*+++*))**))(())**+*-.////111/GA1128?HP[cije[QZmgbagqT$#),2Hl„ƒƒyiI.)24;DJRXZ]adfhu‚‡†qigfhlmkiikloqv_,)+.4FHEGF>65IF53Vd]H<55689;;::979:;=-%%#$%%$$##""""""    !!!!    #$&&%&(*+***,.49;<CHNORRRSSTUW\]]^bb`^YVXYXXWWUMIC=978730,+)))(((*++*****(*,/5AFFEC=/# !%-6<?;71.+)&%##"#$&#"$))%%#"###"#%')*,022/1=\u~zy|~€€ˆŠŠ‹ŒŠ‰‡„‚„ƒ|wpic\PFA:768:??ADFINKNHJ^eSUZHFJJJJJGFEDDHOXboz‚‡‹ŒŠ‰†…‚‚…‡ˆˆ‹ŒŒ‰ˆˆ‡‡…„}vrmigffffggghhhhhjlprtw|ˆ’”Œ‰ˆ‰‰‰‡ƒ€€ƒ†‚~|ywuvwxwuttssttrrrrrstw|€‡Ž‘“‹‰‰‰‹Ž‘‘‘‘ŽŒŠ‡…„„…‡‰‰ŠŠˆ00112233332222223343234444444444555555334444445555443322322200000.......--,...--,,,,+++++,+,+++,*,,,,,------..------..........----..--,+,,,+****))*))++-..00121100119B=57>ENT]fjjbUKHakecdnq>!(*6Qy‚}~sW9&(+,15<AHPTZ_dlr~‰‚z|shdbgmqmkijkoop^+)+**7FIEC>3,131*1DC843247:::;;;78:;<6(('&%&''%$""##""!!!!!!    ! "#$%(***,,,.367;<BGLORQQQSVVZZ\[`aca^\]^]Y\^WSNID<75640..-,*)())**++++,+,-17@DEDA7+!""#(.4;>:4/*)&%#""!"$!%&)))&$#"$%%%&&*++,./-.;KXctxws|{„‡ŠŠŠŠ‡„y|‚…ƒ|xrib\VOB:>:=@CEGHLNUQVZJHVS_i\MIJJKIGECDHQXdoy€ˆ‰‹ˆˆ…‚‚ƒ„‡ˆŠ‹‰ˆ‰‰‡†„{vqmhgfeeeggghghhimmpqtvŽ’‘Ž‹‹Š‰ˆˆŠ‡…‚€€„†‚}{yxyyyutssrrrrrrqqssuv{‚Š‘”’ŽŒŠŠˆˆ‰‘‘‘‘ŽŽŒŠ‡††„ˆ‰ŠŠ‹ˆ‡001122333322222233432344444444445555554444444455554433323333200000......------,,,,,,+++++++,,+++*,,,,,------,,------......--..--....--,+,,,+****))+++--/0122334444444>JC9BLT]fklj`UE8Hiidbita*#+:Z|}xwc7%'*),,059@EMS[frx„’…yxse``aipofgkmnor],(*-129FA@<6**)('(,/023598::9:;;9779<;-(*+,())*)('%#$$""""!!     "#$%&)))*,,,/3689<AEJORRPPTVX[\\_^`ab`___\[[[ZWINH<74220/.-,+)))**+++++-,-0;@DED?5& !"$).39;950+'&$#""""##$%(***$%###$&('*++++*+3APWB=9<:Zlr~†ŠŠ‰‰ˆƒ|us{€„ƒ~xpkg_UNDB@@CFKKMLLQNH?KKLOXglbIIKIHFDCEIP\epy€…‡‰ˆ‡„‚‚„…ˆ‰ŠŠ‹‹‰‰‰‰‡†ƒ€zuqmgffeffgghfgiiilnqruvƒŽ‹Š‰ˆ‡„…†„„‚†…‚€~{yxyywttssrrqqqpqqssux~…Œ‘’”’‹‹Šˆˆ‰Ž‘‘Œ‹Š‡†‡ˆ‡‰Š‹Šˆ‰„001222332222333333433444444455555555555555444444556644444222100000/.....------,,,,,,++++++,-++++,,+,,,--,,,,,,------....--------------,++++***++**,,//1233456656567788DLDHRY`fmmi[P>05VpiccjqH$)8Z~{xs\.&&)((+,039?FKXiwyƒŒzud^\]clphggilorZ-'*-5;9RH=:92+%'$&&)-.27@=989:998668<<7-+-/,,,...,)%#$##"""   "##$&'())),,/373139>AHMPQOQSUVXZ]][[adcbb_^_ab\RTRG;753320-.-+++,,++,,./003;@CCA;1$!!%'(-26:93-)(&%$""$%#$%()),-(%$$$&''()**)(+/8ETU=5*'/BXk}ˆŠ‹‰ˆ„}ukhqx‚~xsleaYRKCBFFFIPQSWTLIPNORYeV]]MKJJGEDEJS]fqyƒ†‡†…„ƒƒ…‡Š‹‹Š‰‰‰‰‰‰‡†‚~xsokggedffggghghikmprtvxˆ“ŽŒŠˆ‰ˆ‡„…ƒƒ„~ƒ†ƒ€€|xxzxwtsssrrqqrqqqstsy€†Œ’‘’•‘Œ‹Šˆ‡ŠŒŽŽ‘‘Œˆˆ‡ˆ‰‰‹‹ŠŠ‰†„222222332222333333433444444455555555555566555555556655554422111100/.....------,,,,,,,+++++,-++++,,,-,,--,,,,,,------....--------------,+++**,,++,-/03367668899888:;;;;>JURT\cjrmcWJ8.,?fmebelf;$5Qw|vq^6&'))'()*.38>GWlyu|†Œƒzvh^\[^chggegmprZ+'*-5<Cc[B793,,(%(()*,.5<;557887876577:2++-,++,-./,*)(&&$"!   "##$&'('((()-110/05:>AGNRTPRSSUUWXX[\]a_`__[[YY[VSNG@674210---++,,,,--.1333;>AA?9/$!"(+,/19<ED>3+'&$&&#$#&))(*..-,)%$%'*((((((+264<1*''*5CZn~‰Š‹Š‡ƒ|qjeiqx‚‚}xsokeYRLJIOOQUY\\VQWRKNTWZUIPXKDEEEDFNT]grx‚……„ƒƒ……†‰Š‹‹‰ˆˆ‰‰‰‡‡†}xsokffedffggghiijlnpruv}Ž“Ž‹ˆ‡‡††††…„„€€……ƒ€~|yxzuwtrssrrqqqqqqrst{ˆ‘““‹‹Šˆ‡‰‘‘‘‘‹‹‰ˆˆŠŠŠ‹Œ‹‰ˆ†‚333333331344333322444555443345555555556677555555556666554432221111/...----,,,,----,,,,,,++++++++,,--,,--------------....----..--....--,+,,,,---.1222559;::;;;<;;<<===@CFOVZ\fnvnaSF5.,3Mpifcem]/*Dj{upeA&%')'&))*/48AZryos‚ˆzvna][^efffcfjlkZ-%&,17Jg[N8//,++((*++*,.13224577685596582*)+,,++,,+,+)(''&$  ""#$&''''''((*(),/28>AKQQRTSRSSSTTRUXZ\Y[^]]dc`ZRQQMI887211/0-------//34548=>><6+##$&)/19M`lpk_RA3+*&"""&-64688830-,*++*))))&%*+'%%'''(2C\p‹‹Œ‹‡„|pc\`hry€„‚}ztpkhbbca`_b_^][bmhY[^]YWP@8OVeZGFFGLU`isz€ƒ„„‚ƒ„„†‰ŠŠ‹‰‡‡ˆˆˆˆ‡ƒ}wrnjgfedfffghhiijmorstyƒŒˆ‡†‡††††…„ƒ€„„€~}|zyzvvsqrrrrrqppqqrsu{„‰Ž”‘ŒŒ‹ˆ‡ˆŽ‘ŽŒŠˆ‡‰‰‹ŒŒ‹Š‡†ƒ333333333444333322444555444456555555556677655555556666554432221111/...------,,----,,,,,,++++++++,,--,,--------------....----..--....--,+,,,,-../24758;>?=>>>@@@AAABBCDFJLSVYZjvn_OD5/,-9ZtiedjlZ.2YwvpiO*')'(&)*)+/5D`wsjn~ƒztoqf^\\`bffcgmlm\.&&++0MgYRQ9**++,,-,,-.---//14587556875@P+*-,,+++*+++,*('&$""""##$$%%''((*/98<FLRSTPTXUTQOQOQSUVW^ab_bfc]UTRQM:5;9400....--/025684489;60'##%%+6F[s€„…†ƒzm`TB.%$,9AFGFEACB<4442221000/-*'$$$$$&(4H_u„‹ŒŒ‹Šƒ{qaWY`jsy‚‚ƒ€|wqjghddda`afkllc[WXW`efaa[LUk\JEFKOXbisz|€‚„„„…††ˆ‰‰‰‰‰‡‡ˆ‡†„„}{wrnjfeedffffffiijmorsu|ˆ“‘‹ˆ‡†…………„ƒ„ƒ€€…„€~|zyxvvsqrrrrrqppqqrsv}†‹•‹ŒŠ‡†Š‘‘ŽŠ‡‡‡Š‹Š‹Œ‰‰‡†„‚2222223344465544334444445555554466666666556666666666766544442111110/..----,,,,----,,++,,+,,,-,+,----,,+,..--------....------....//.--,*+,,--/0125789<>?ABACDCDCDDDEEEGHKQY_^\cpkZL?3/.-0AipldfmsY-GlwumY5&()'))*,-1;Sqxljr||tomqm`][_acfgijlm_.%*,.1Pe]WUV:+'(((()*-./-,,-.0445314433KxR!//.---,++*++*('&%"  ! !!#$$#"&&&(,37=EJOSWSSPROQNQOPRTRZ`efghddZN>QNY@0;=7220000100168862452*&#%&(4J^p‚‰‹‹ŒŽŽ‹„zkT1):EMIA?EFFEA;:8:::<<:863,&! """%'7NdwˆŒ‹‹‹‹†}ncUSYckt{€†…ƒ€zzyxxwmlnmuyupklqosrikjkno]NTOGCMUZbirx{~€€‚…†‡‡‰ŠŠˆ‡ˆ††‡‡„ƒ‚}yupnjggfffeggfgijkmprvv‘ŽŠˆ‡††‡‡†ƒƒ…‚€€„‡ƒ€€~|zyxvvsqqqqqrrqqppqrx€‡‘”’ŽŒ‹‹ˆˆˆ‹‘’’ŽŠ†ˆˆŠ‹ŠŒŒ‹‡†„„ƒƒ2222333344465544444444445555554455556666556666666666666543443222110/..----,,,,----,,++,,+,,,-,+,-----,,-..--------....------....//../.,-..//113689<>?ABDEFGGGGGGHHIIIKJNU]dggadg[L?2/.-04TpkidhruJ<azwpc=%'&'()*+-0A`xvklx~xsmlovd]\[aceffikl]/&*,-3Sg[Y[XN9*'&&')(-00/.++-012311699Ie€‡6&.00/11..-,++('&%$$%%"!" ! !! !#""')-/7?DFINQLNPRPMJLNQRRSW]effhgdZUVKIZN67=:62111111278864230(%%',Cax‚‰ŽŽ‹‰‹ŽŽ…wO0:BMB><@LJID?967:;<<9998-$ !$$$*?Si}‰ŽŠŠŒŒŠtdSKPZeov|„††…ƒ€€{zwuqsxzyxtufadkjpqong_TWgbfTLT\ejsvz}€‚†‡ˆˆ‰Šˆ‡‡‡…††…„~|xtomifeeefeggfgijlnqqtw„’‘Œˆ‡†‡ˆ‡†„„…€‚†ˆ€€~|zzyvtsqqqqqqqooppqry€‰Ž’•’Ž‹Œ‰ˆˆŒ‘‘‘Šˆˆ‰Š‹‹‹‹Š†„ƒƒƒƒ3333444444454455554444555555555544456666455677665666666654443322110/..------------,,,,,,,,,,,,,,------,,--,,----------------....////010...013559:;?ACDDEGIIJJLKKLLLKLNOSY`gmpmd\UK?62////;_phedjtk@UwysiF(''))()*-3Fi{rkn|zqmkdavk\]\`cdcchjj]0'*+-3XhZYYVRJ>,&&'''+23/..,,-../24>FPaxŠ”w+13234321/-+((%#"####"    !! !#$&)-3:@DEFHHGJLNONNMMPOQU\`feijgd[RMJZeXF?<:7320112366876332+'')Ai‰Ž‘’‘Ž‘‘ŒŒ’†lB?FLEDMITYUOMIB==>AA>>?<2($#%%&'.BXmŒ‹‹‹‰ƒyeNBHR_ipx€†ˆˆ……€~yvutuqtwwkfc]Z`^bfb[a\Z=AQd]^[_emrvzz|‚…†‡‰Š‰ˆ‡……„„‚‚}zvsnlieeeefffffgijnosst{Ž””ŒŠˆˆ‰‰ˆ‡…„…€€‚‡‡‚‚~|yxyusrpqqqpppoopppu{‚‰‘”‘Œˆ†‡ˆŒ‘‘‘‹ˆ‰‰Š‹ŒŒŒ‰ˆ…„‚‚„†333344444454445555444455555555554445666645567766566666665444332211//..------------,,,,,,,,,,,,,,------,,--,,----..----------......0335400023378<>?CEFEHJMNNNOPPOPPPOQRRUZahnospbRC>7543//1Cjpfeely^Nt|voP+&(**((*-2Jmyolrxnlgbdopb`^^acabeih\0'+,06_e[]][POL@.('&'(.2/-,,*+,,-7BNYix„Œ–˜[-4566321/-+*)(&#"""!    !#$$&(-269>ABDEEINKOPPOPMOSV\l_aoljc[QLYe_UOIA98852212567798662,(9b‚‡Œ“——”“•–’‹Š’Ž{R<FIJJKNSVXX\aa^UUQONMGA4&##%&((.AWmŒ‹‹‹ˆudI9=JW`kv}„‡‰‰ˆ†‚}~~tjada^`h]aYUWafaWZa…ACW_[`diosvxy|ƒ…ˆˆŠ‰‡†„ƒƒ„‚~|yurmkheeeeffeefgijnosst|””‘‰ˆˆ‰‰ˆ†…„ƒ€€‚‡‡~|yywusrpppqqppooppqv|„‹“”Œ‹‰‡‡‰ŒŒˆ‰ŠŠ‹Š‰‰ˆ‡…„„„…‰33444444554444445544444455444455555566666677666666667664554433331100..----,,---,----,,,,,,,,,,,,,,--..,,,-,,----......------..//..014577667799>@ABFGKMMOOQQSUUTTTTSSSSUV\ciqqqoe[PC<8542105Pqieffru]q€ysY0&&)*)),.5Rqvmmu~qeggiiith_^\_``cdghZ0&,-1:ee^`^[OMNQD-)('%'//+)+**+/8GWbn{†Šˆ–›“6$/3444400--.-,)&$!!  !"""#%)-.16:>@BCEMSRQNMIHMQU[ejoplmj`SNK`cUPPNI?8743334478:<<<949Z‹Š’—–“•šš—’ŒŠŠŒ‘…^>IIJHLMRTZ^_bcd]Z^]ZXTE0%##%%&&-ASi}ŒŽŒŠŠ„|pbE/1>JXelw‡‹Œ‰‡†…‚€xjaZY^\WWW\^^_jeXiƒˆ}LZa^ZYforsvz|‚…‡‰‰‡„……ƒ‚ƒ~~~~}zxtqkkgedeeedeeghilnpsss‚“““‹‡‡‡ˆ†…„ƒ€€ƒ‰†€€~|zxvuqqpppoooooonopw}…–“ŒŒ‹‰ˆˆ‹‘ŽŒˆˆ‰ŠŠŠ‰‰‡‡†…„„„†44444444554444445555444444444455555566666677776666667634554433331100/.----,,---,----,,,,--,,,,,,----..,,,,,,..--......--------//134468;<<<<<;;=@DDHJLNOQRSUWXYXYXXXXXXZ[`fkpsqoeZQPKA8433208^qgdhnvuxƒ€xa3(*(**+,.<Zxsmls~vjiiiijpma]\^cabfhfY0+.34?fd^]^ZMJPTSC,'&$$&*.*-317AKWhp|‚‹‡”šx(/244310/,--++)%#!  "!#&(*,,-279<@BGMPQIBHKNSY__ejglni\TVMRdXSOPPMHA80/13666666<8=YzŠ‹‹Œ‘‘““‘••—’ˆˆ‰lFFIILMOQSVY\^__\\[\[XQB,$"##$$&)7Mcx†‹‹‹‰ˆ‚ynX=,)/@LYet~„‹ŽŒ‹Š‡‚€yvtdefeZZ^jjg_LHNk…ˆŽtSPLQYgnsuuw|€‚„†ˆˆ†…„…„€€~||}}{xtqkieedddddfffgilnpqtu‡•”‘Ž‹‰‡‡††……„„‚€‚‡…€€~zywtsqqpoooooooonnrxŠ‘–“ŽŒˆ‡‡‹ŽŽŽŒŠ‡ˆ‰ŠŠŠ‰‰‡…„„„……‡Ž44444444554444444434444444554455555566666677777777778AC;6644443231000/....,,---,------------,,----..--------......------....--//13558;=AABB@==@CFHKNPRTUXY[[[\]\\Z[[\\^_bhnsvtqg]TLQUPB5211/>enhfhqy~yi>%'*())*0Bdyolkq€ukhgiigflc_]^bbdgfgV31114Gfc]__YFFNSTRC+&$##'6=69?EOX`jx…Š“–›™U*,.10/...-,++*'$"""%'*+++,/37:@JKQQNJOLNPSW^^^acaaZVYSUc^QONNNLHE>72.+//02345Os‡ŠŒŠŠ‘€ps€Ž’Œ‡‡Š‹rHAHIJLNQSSSVWYWW\^^\XUE,!! "$%$'4Jbw„ŠŠ‰†~uiR3(56>DO^o|‚‰ŽŒŒŠ…‚€ztneZWVX^djdedRL[{‡‰Ž}of[Valonw}„†‡‡††…„ƒ‚€{|{{{yxtokheddccddeeeghloqrty–”‘Š‰‰‰‡…„ƒ„ƒ€‚ˆ„‚‚€€|yvvusqpqppoonnnnlot{„‹‘“–’ŽŒ‹‰ˆ†‡ŒŽŒ‹‡†ˆˆ‰Š‰ˆˆ†††„…†…ˆ44444444554444444434444444444455555566666677777777778DWN96544432310000....-,--------------..------..--------......------....--//23579;?DDEFEBACEIKNQSTVX[]^_````_`````bdgkpsvtrk`WMHDHMKA4101Gkkdchp}…€zpV0(*(+-17Jiumkhozojhhiieceha`_^bdeefU31112Pga_c`WEFKPQRP?)###%1DNDCMSZbiy„ˆ‰‘— –;/.00//./.-++*'$"! !#%&&*,,-/37?DEKMNKIJMOQSWZ^^a`b^YUSUc]QPNNNLHEDC>830.,+//Diƒ„„ˆŠŒŽˆwU=AYx†…ŠŒŒuPDHIIILMNORSURRTWYXVRPC.!! "$%$&2E]r‚ŠŠ‰†ƒ}sfR/&7;?AMany…‰ŒŒ‹†‚yskcYSQPKOVX^_^_v‰Ž‘•™œ›ŸŸ—}WU[TU[`cp~ƒ„ƒƒ€~|{zz{|ywsnjgdddccddeeegimpstu~’—”’ŽŒ‰ŠŠŠ†ƒƒ„ƒƒ‰ƒ€|yxvtrqqpoooonnnnnpu|…Œ‘’”•ŽŒ‹‰ˆ†‡ŒŒŒ‹‹‰ˆ‡ˆˆ‰Š‰ˆˆ‡†††††…ˆ44443455444444444444555544334455665566776677776666667:GN<555444331//00...---..-...,,--..------..---...........------------....//1469;>BHJMMLIGGJLNPSWY[^_bbcddddccddeeffjnquvwrlcZQJCBBFIID:10Pofcbfr~„~ykWC536:BJYoqjgenumkijjheecmda`_bdddeS0,*,2[idaghWIKMOOOOL9&$%(0AVXKHRXagr{‡‰‡Œ”šž„%(.320//.+)***(&# !""$&'*-/24:ADGPTYYZ[]^emvustpkf`_ZPWf`SPOOMKIFDBBC=:421+2\~‚ƒƒ…‡Š‰€mK*()=cƒŽ‡„‡ŒvPAIJKKKMOONNNKKPSSONMKC.!!""$%%(2H]rƒ‰‡†ƒ€{obM-)+/6?Malu|‚…ˆŒŠ‰ˆ…yskfYUQPR]_]\bgo{’•› Ÿ¢¥¤œWLNSQJG@;ALVl~‚ƒ~zyyz{zyvsmhedddddddeeegjmqstu†–•”‘Œ‹‹‹‹‡‚‚ƒ‚€†‰‚€€‚€€}xwuspoppppnnnnmnopu~‡‘‘•”ŽŒ‰‰††ˆŒŽŠ‹Œ‹‰‡‡‡ˆˆˆ‡†……†‡‡……„Š‘44443455444444444444555544444455555566776677776666666657:3554443310000....--..-..-..-.//------..---...........------------....//357:<@DIMORRPMJLNQSUXZ_abeegffhhiihhiiiinqtuvurlcZTMFB@>=DMNE?>\ldccis}yrf\UV[`dlrnigdlxoijihfbdbmlfecdfddcR0)**<gidfegOLOMNNMNNK8((.6:K\ZLQY]dmw~…ˆ‰‹Ž’–››h(//./-+)(())('$!!""#%%),/112FWdlqrvxzvrttvtrtsstrmaUXeaTONNNLIFDBCBDFIA0/Ao‚z{~ƒ„…}a7%()%2W}Œ†ƒ…Š‰sIDIJKKKMNNMMIFKLNNNOKIB-!!""$%%(3I_t‚‡‡„€~wn^F(+3/*3M_iqx|ƒ†ˆ‰ˆ‡}xpieb[U[\^\]agqŠ”™ ›’…iSHVaain\MJHGGDBJf|‚|zyz{zyxurmhddddddddeeegjmqsuw——’ŽŒŒ‹ŒŒŒˆ‚‚ƒ‚€†ˆ‚€|zxwuspopooonmnnmnopvˆ‘”“‘ŽŒ‰‰ˆ‡Š‹ŠŠˆ‡ˆˆ‡ˆˆˆ‡†…††‡‡………Ž‘44444444444444445555554454554455456666677766666655665563455543333222110./.---.............//..........////..--------..--------00368;?CFKNRVXWSOPQTWZ[^bcfehijkkkkkjkllmnrsssutpkb]TNKDC@><:=CEEOghddfoy||wysppprropnhefbk{pgfffeccbmvjfeadcdbQ,**,IlgfhgfKKONNONLLKH82599=SZTOSZ_iq|„‡‰‹‘•š›™C*,,***''&&&&&%#   !"!&'*/9Nahjjijpyyvustsqooponprrtsqm`UQOONLIGECBBEJQ``P[{€{||€„~m8&(%'/NwŠ†ƒ†ˆ‚hCDIJKKJKNMMLFFJKLLKJIG>.! "#$$%(3K`w†‰…‚~{tl\G.&1)(:P[elqw{~ƒ………„ƒ€{smijkhaZ^cgkpx‚‹‚B.0;M]`nqtfVXchimmh^RVgy{xyxzzyxupkfdbbddddddeegknqss{’—•Ž‹‹ŒŒŽ‡‚ƒ€€ˆ‡‚‚ƒ~|yvtrqpoooomlllmmosy‚ŠŽ“’Œ‹‰‰ˆ‰ŒŽŠŠ‰‰ˆˆ‡‡‡ˆˆˆ‡‡‡‡‡ˆ…„„†4433444444445544555544445455445545666667776666665566555553554333332211110/..-../00//////..//..........////..--------....------/0/28;@DHLQVY[[ZUSTUZ\^begjjlmmnnnnnmnpprsuvvvtsoib]UPMHEB@=9856;CRfeceisyuxvttuxvsolfbbebi}pijhjhiijo{nihcceb^N,*+/XlhfjnaELPPOPNLKIGFB?<=;=E9<KV^fnr|„ˆŠŽ“–›ž‰,!&(''&&&%%$$#"!   !#"'?Zfgdcdegrxxutvtsromkkllnpprv{}t\PLNNLHFECBCDHSamrz‚~{}}}~y],$%&$$/NtŠ†ƒ„‡€Z9DHLMMLMNMLKFHKLMMKJIG>.#!"""%(8Pfz‡‡‚~~{tiX>+,0,.EQZ^gkquz|}~‚€|yutspngefhkqxƒŠŒ‹\2DL\ba]nsm†Ÿ£©¦“ˆ€‚ogmvwxzywxsojedbbdddddefgimooru~—™“Œ‹ŠŒŽ‡ƒ€ˆ‡‚‚‚€}{yvtrqpoooollllmmoszƒ‘‘‘ŒŒ‹‰‰‡ˆŒŽŠŠ‰‰ˆˆ‡‰‡‡ˆ‡††‡‡ˆ†ƒ‚ƒ‰5544443333444444444555444444445555775556666666666666665555542244332111000//../....//////////////......////..../---..--..------/0146:@DHLQX\^a`ZXYZ\``dhijlmnooooooqqrrstwwvutqmfa\WQMJHDA?;96213<Wjcfeorghgfjkjifgiffed`fxsomiifeghh}rhfdaga\N,*)<gkhilmSBKOPQQONLIGCB@B>?9;54BQZbglu€ƒ‡‰‘•—˜šs $'&'%%$$""!!  "7[lica`acirzwuuwvtsrpnnlllkkloptz€wZLONLKGECCCCJT`kt€„}y{{xuoJ)&&%&&.Ntˆƒ……zO7BFJLLMLLLKHEIKKMKJHFD>.#  !!!%,<Tk~‰‡}yrgS8"'18=LQZ\`fknqrwy|~~~|wxwuqqqojnsz‡Œ‹‰ˆA'7EQ[]QUb}š³¼»º¹±¢Ž~p™wt|zzzyvsnkgcbbdddccdegilnqss„™—’‹Š‹Ž’„‚ˆ…ƒ€}zxvtrpooonmllllnlot|†Œ‘‘Œ‹‰‰‰ŠŽŽ‹‹‰ˆ‡‡ˆ‡‡‡‡†††‰ˆˆ„€‚†‘5544443333444444444555444444445555665556666666666666665555454444332111000//..///..////0/////////....../////.....--..--..----..00146:>AHLPV\`cda^\]_abfhilnppqoooooqqrsuwxxvtsokfa\VSPMJFD@=:74111GjeacilXKRUTTNJKWhfa_\Zdxpjidgjjgdexxkhfchg[J,'.PnihlojEELPSTRQOMIEC><@E>;9=9?TV[`gmv~„ˆŠ’•—˜X&&$$$$%%""!!   4Zkje``bcclvyuvuxxxxusqpnnlljjjklnsz‚y\ONLKGECBBEJRant€}ywwsp`9,,(&'(/Os‡‚€„„vI7BFJLLMLJJICEIJIIIHIGE?-$##!"#%,@Xm€ˆ‡‚€zrdP5""&2BMPVY\aeikmqtxz|||{{|{wtttrptx~ˆŒ‹ˆ‚71<ES_VQMn ¶¾º¶·£«´™Ž“š–€fXp{yvrmgccbccccccdehjmoqsuŠ›˜“ŽŒŒ‹‹Žƒ‚‚‚‚ƒŠ…‚‚€}zwutrpooonmllllmmpu}‡Ž‘Ž‘ŽŒ‹‰‰‰ŠŽŠŠ‰ˆ‡†‰‡‡‡†…†ˆ‰‡…‚†Š‘554444444433334444554444444444446666555677666666666666555344444444321100000////.//////////////////////.////.//.//.....---------/1358;@EJOT[aejiea]_bdfjljmnnpnnnnnqrtwyzxwvtrnid`\WTROLHFB@<97312:^ia`bkX04;:62/7Nhd\ZWS]xrigbdhjhilr}mfcbjo\G'(@hkijpp]?HNSTUSQPNIEA?=<>EB=8@ARdQYafku}‚†‰‹Ž’–—‘=&((%&%$##""!!  "Eloe^\`ddfjxzwvwxy{zyxvurqpqmkkkiijlr{„z[PLJFECDCDITant~zvsstqrZ7/0,(''2Qu„€~‚ƒp=3AHKJLMLJIABGIIIJIHIHF>,"#%#$%'/C[qƒ‰…ƒ€}ypaM2 !%9KPTVUX\^cegklsvxy{{{}~zzxxuvy|ƒ‡‰…„33<DT[LEX”´½½«–¨¤¬¹²‘†ž•…w_nxwvokgecbbbcccccegjmoqswŽ™˜’ŽŒŠ‹Š„‚ƒƒ‚‚‚…‰ƒ‚ƒ€{xwusrpoooomkklllnqv‰’Ž‘ŽŒ‹‡‡ŠŒŒ‹Œ‹‡‰‰‰ˆ†………ˆ‰‰†ƒ‚…‰Ž‘‘554444444433334444554444444444446666555677666666666666555344444444322210000///////////////////////////.////./////.....--------/01357:=BFMS[aejmjfcbdehkkjmnnpnnnopqsvx{{xwtsqmgd`\XVSPMJGDB>:74213Nj`]`gg5'*++,.9Re_WVPMVxshggcekejkn‚tiffmv`C&BdjhilpqNBKPUVVTROLGEC?=9:@JJ?9>E[XPX`bju{„‰ŠŽ’’•†- ()'''%%%""!!   /]nk_^`cegjqzwuvwxy{}}}}ywvtrqonmkjfhgksyqULJFECCCDJTblr|zrppqnnmaE1//++5Uw…~~€i2#5EJKNMLG?=CIKJJJIHIHF<*"##"%%&0G_wˆ‰…ƒ€}wo`H-#%,BPTWWWYZZ]\`dfkqtvxyy{}}}}|xz}~€ƒ……‚y77;AMRJDo¦·¾¶ˆ| ´º¸¶‘~Š—–’˜‚uvutokgecbaabbbbcegjmost|“™—ŒŒ‹Œ‰ƒ‚ƒƒ‚€€…‰…‚‚‚€}zvtrrqpnnkkkklllnpwŠŽŽŽŒ‹††ŠŒ‹Œ‹‰Š‰‡††………ˆ‡‡ƒ‚‰’445543555544444444333353444455556655555656665566667777664444443344343311111100////////0000//./00////00.///0000/..-....----..../134679<AELRZ`fknnjgfgiiijiklnpooorswx{|yxxwvsnige_\ZXSQOKIFB?:8622/?cc^afjG&(*)+/;Te[WRMNTtwfghiiifhlp~mkjhuzpgihhlpnphCGMQUWURRNIFEA>=;859FI?:9BIPPV^fmu~„‡ŠŒ’“w%"(((&%%$! !""Bjnb^`cefjpw{wtvxw{|~}~~}zxuvwtrqojgfeffmsz|iPJGFCECGLUbrxyupmnpoopomaG2-,7Vy‚~€~d0#$*;FHJH?53<CIKLKKJHHE8%""""$$&3Md{‰Š…„‚}vm]C)"*:LUWZ]\\[ZYTUZdhlqttuwx~€~}}~€‚‚‚~~‚rG9@CKICM‰©¶½¶{Yƒ‘©²ªŽƒ‹–“¡£œˆuqrokfbbaaabbccdfhkoqqr~–™”‰Š‹’‰ƒ‚€‚ƒ‰ƒ‚‚€~zwtsqoooonmlkklljmpxƒ‹ŽŽŽŒŒŒŒŠ‡†‰ŽŠ‰ˆˆ‡‡††††‡…ƒ€ƒ†‘“’‘555543455544444444333344444455444455555665555566667777664444444444222211111100////////0000//./00////00.///0000/..-....----..//0135789<AEKQX^djppmjgfhhijlknoqpqswy|}~{yzywrmjfc_\[XTRPMIFB?;962304[g`_bhW(%)),0<VfZUQOPUrxheeebekhimzƒskjio|zxoloppq\AHNPSUTROLGC@><:95328CG>15=CFQ[^enu{‚†ˆŠŒ‘”k%&&""#" ! #Nnl`_eddirwz|wtsuxz{{|}}||xtuxvtttrpkigefhmszx`KHDCDDHMXfrxwrqnmonnqromk`TB?\z|~€y[(""#!*8AA7/9@BFGIKLJIHD6%""""$$(:Qi{ˆŠ…„‚xmZ?&%1DRVY[^__ZYWTSY]ekmoompsx|}}‚‚|‚ƒmVCFEIE@a“¨²·¸ªŽ|†–•›•š”’’“›¦•ƒronhfdbbbbaacddfglnqrs„™™”Œ‰ŠŠŒ‘Ž‰ƒ‚‚€„‡‚‚‚‚€~zwusqooonmlkkklmknry„ŒŽŒŒŒ‹Œ‰‡‡ŠŽŽŒŠ‰ˆˆ††††††„ƒ…‹–•’Ž65554345555555444433443333445544555566666655445566756666545544443333211111110000//////0000//0000..//00//////00/..-....----..000135689<AEIQU[biptrnjggfhikloqvyy|}‚~{zwqmjfb_\[XUROLJGC?<973213Li^]aca0$()+0>XdWSQRTXirfabcaailrpq€ujffhq{zyuonprnNDJNORRROKJEA><:75331/2@C:37<?DT\acnu|„…ˆ†‹“’X"$!!  "#$&# -Yokedhhinrusvwustuvyzyz{yrjiihquqprvwrolhfilpswrSIFFBEIP]krwvonmnpmprqojeiooko€|~}wS$!#$#"%#+*(/:?EGIIJEFF?1%#$""$%-?Vm€Š‰„ƒ€ylX:&*;JU[ZZ]__]ZWUSV[`eikljkowz|||}€‚‚‚~ƒ‚mVOLGIBAlš¥««¨šš¡ ¡˜“™š˜Ž˜˜ˆskidbbbabbbcceggjnqssŠœ™–ŠŠŠ‘ˆƒ„ƒ‚…‚€}zwsqonnmllkkjjjkkns{†ŒŽŽŒ‹ŠŠ‹‡‡†ŠŽŽŒ‹‰ˆ‡†……………ƒ‚…Š••”‘655555665555554444554433334455545555666666555555666766666555444433333311111100000/////0000//0000////00//////00/..-....----..00013568:=?CHNTZ`gnrusnjighhinqv|ƒƒ……‡‡‡ƒ~{zwqnkfb_\[XUROLJGC?<973200@c`X]be@%((*/A[bVRQTVVdsg`ccchmmokgqsh^_cimrx{xttm]GIKMNOOOKKJEA>;9653321/2<=437AGRYYaemuy‚†…ˆ‘M  "%(+-% 7amhdgimmrxunprrqposvvwyzphcehmnopnmkkrxwoihjlmrtsdMHDCGKUcotvtnmmonkntrpljhimr{ƒ€{~|sK$!$$"$$$'*+).:AEHIKMLE<0&$$##&'0DYq…‹ˆ„‚whT4%0BLRYZ[^``_\WUSTY^afhiknpuquz|}€‚‚‚€„€n[ZZTQHDqœ¦¥£ž•—˜Š‹™—–“–š˜•šœ“‰‚jedabbabbbcceghkppsv‹š˜•ŠŠŠŒ†„ƒƒ€~€ƒ‚}zvsqnnmlllkkjjkjlnt~ˆŒŽŽŠŠ‰‹‹ˆ†‡Œ‘ŒŠˆ‡††…„„……‚‚‚ˆ“•””‘55665566645555444455443333345544555555556666666666666666665554443333332211001111/////0//00//0000///////////////..-....----..//123579:=?CGLSX_flqwurokighiot{†‡‡‡ˆ‰ˆ‡…}zwrolhdb^[[YUSOLJGC?;8621./4SdZW[cS&%(+2C]aXRQVYX`ricjjnlkmkllcgie`]cinquzzn^OMNMMNNMLKJIEB?=96522/.../6A?7>GNWaU]dlt{‚‚†‹‘•A  !!!!  !%(/4-Aemhehjknvwpiknrponoqttuvkcaaagjmnqnlifju{slljjlnpqmWFCCHNXeptxqnopqnjmrroljjhkt}‚|}}rC#$$"##"%%',.**4=BGHGHE</%$$$$&)2G^u†‹‰…€tgS1&6DKOV[\_^]_\YVTTX\`caceikppmuw|€‚‚‚ƒƒpdgcZVQOu¦¥£™–“ŽŽ’”™•”›¡ ‘‘Ž|fbca`abaaccegilqquy™–’Š‰ŠŠ†…ƒ~ƒ‚ƒ‚{xuqnmmllkjkkjhkkmow€‰Š‹‰ˆ‰‹ˆ……‡Ž’ŒŒ‹‰ˆ†………„„…ƒ‚ƒ‡”–•”“9999886676555533445544333333444455555555666666666666667666664444333333221122111100///0//////000000/////////////..-....----..//013579:=?CGLPW\ciorutpmifhltx|„………†ˆ†„{vspnlhdb^[ZWTQNKIHC?;86220/1Cb[XZ`]2%+.0@Z]VSUWXY`smdhpqqnnqmnk_]bidfgklngaUQSSTQQOOMKIHGEB?>;762100//,-7FE?CHNidU_glqx}~ƒ†‹‘•‰8   """""""" !#"'/8HZhhhkmmqwvligillmmopqqtr][[[_`ekopnoqmjditwqokkmlnnreIDBIQ[hqwunnpppmfirrpnkljiq{„€z|{k;$&%$%%%#%',12+$(6ADGFB7+#$%$$&*6Mcz‰‡„ƒ|reL.&7EKOSYY\^]][WUUUX\^abddccikjorx|€‚ƒ|rnkge`\\|ž¤¢œ™“‰Š‡z’“—˜••™¢Ÿž“†}kcbbbabaaccegilqrt{’š–’Š‰Š‘‹…„‚~‚ˆ†€€‚{xupnmllljjkkjkjjmqx‚‹Œ‹Œ‹‰‡ˆ‡‡…††’‹Š‹‰ˆ†…„„……ƒ‚…‹‘–•””’Œ9899998777665554444444333333444444446666556666666666666665664444433322221111111111//////--//0000110000//00/////..-....----.../013579;>@BFJOTY_eiptwsplggmwz}€ƒƒƒƒ…„‚‚~zvusplifca^[YVROMJHFC>:86330//5Y`WX\aC&),0A\]WVVYYY_sqijkmqljjlnjjdXYYR=:>BFRSWYYYVSOOKJGFDB@?<;9740/.----/8FKFFCSrcY`iisz}ƒ‡Œ”‹2! !!"####"$$%$$""(%5HMRZdjootxwiceddgggknpnojRQXW[\_cfhlpsutnjdkyyspllmlorpUDCJQ]muxrnoppnibhqspmmmmlu}„€|{yh7%''%%'(&'*./41*$%-:DC@3*$$$$'',9Pg|‡†„ƒyn_A)(<EJNRVY[]]\\[[ZZ[]_`a``_beedhlpx{}€€|wsspkgfe™ž–Žˆ……~sVo‹•˜™””—š˜‰yydaccabaabcegjmpru}”™–“Š‰ŠŠŽ“Š„ƒ‚~€‚ˆ…‚‚€{wtpnmkkkkjkkhijkmsz„ŒŒ‹‰‡††…„‚…‰ŒŒŠŠ‰ˆ†……†……„„…Š”•”“’’ŽŒ;::::::877665554444444333333444444445555556666666666666665554444443321221111110011//////--//0000..//////00/////..-....----.../013579;>@BDHLRV\agmrvvspljnuy{~€€€€|zyuroljgeb`^[ZWROMJHFC>:86330..1Ib\Y[`T((+0B[]WUUWWX\ovlnquyqoqrkike]\ZL==@HNTXY[[YVSQOMIDCBA>>=<:8520...//159CLIB2F^g]^djsy‚„†Œ•Š2! "$#$$$$$$$%%%$%5SlbNJWblqx{obaacaaccbgklnaAELRXY]bcdgmquuwsmiit~yqnkmmmprcHEJUarvxropppnb_gqupmkjhlr|ƒ~}}ze1&&'%%&(())&%)24,&%%.;>1&$%%('(-?Voˆ†„ƒ€€ynZ8(0?GJNQTY\][]][[[[]^^_`_^]^bcbcgjovy}}}€€{uttrsqop„”š–’šš”v{ƒ‰‹–™›š˜––—˜•ƒ|o`ababaabcegjmqst˜™•’ŠŠ‹‘“Š„ƒ‚€ƒˆ…€}zuspmmkkkkjkkijilns|‡‹ŒŠˆ†………„„‡‹‘ŒŒ‰‰ˆ‡‡…††……„„ˆ”•”””““ŽŒ<;::::::98887766444444333444333344556655555555666655666655444444333322221111000000////....//////00//0//////.....--....-------.012479:=?AEGKNRW]bjpuwvtmlovx{{~~|z|{{zxvqolkiecb_\YWTROMJEEA=977321-./9]aYY_a6&+0C[^YYYZ[[_kwqnmpy{xtwohef^WTG<>BHMRVZ\[ZWUSPLHDA@><<;:8764311/015;?;;JMFAB]g_`dkry€ƒ†Œ‘—ˆ/"&#$$%&##!$$%#*FhuqdLAJ`t|yg_b^_acccaaeikT?CJHOTWZaa`dintyzwtqloy{rmmmmkmmiPILWfvxuqqrqpm\^fptqmkkiks}ƒ{}xa,'('(('(*)'&'(-00'(()*//*)'&(%&0F\sƒˆˆƒ€€yjU1'5EKJLPRTXZ\\\\[\]]\]``_`]^^[Y\`elotwyz}~xrstuwutv…Œ‘“ ¬¬¢•z{ƒ‡Œ’•šž¡•”˜™’‚xdb``aabacehknrtt…——“ŒŒŠŒŽ‘’‰ƒƒƒ‚€€„ˆ…€€€{wvuqnmlkjjjkkkkjkowˆ‹‹Šˆ…„ƒƒƒ…ˆŒŽŒŒŠŠ‰ˆ†…††……ƒ…’••”””’’’ŽŒ=<;;;;::98887766544444333444333344556655555555666655666655444433333322221111000000////....//////00/////////.....--....-------.012479:=?ADEILOSY^dkrvwwrprsvwz{z{{zzzywuroljheba^[YUROMKHEB?;976411../2Ma[Y[bO'+/=X`\\\^^`agwuoqw‚‚wvxrkheUJOA:=@CKQUXYYYWVRPMJEC@>=;::::86532334<=;;=<>S]Zcijcddmsy~€ƒˆ——ƒ+('&%&&$#%$!(Onxi`c^K<ATntdY[]^bbbfe_`hdO=?ICGHNUVUWZ`hoty|{xuqlt|tlllkjhhhXKR[mwvqpqrqpeW[fosplkkjmt}ƒ||wY)'(())*))('''(*-4.(()****))*)))3Kat…ˆ†‚xfL-,<GJKLNQRVXYZZ\\\\^^\Z^]Z]__\YZ\^biostwywqnpuuuuvw‚† ³¶®£€{„Œ‹‹‹”š™šž –”š“‡|rabaa```bfhknrtvˆ™•‘ŽŒŒŠŒŽ‘‡‚‚‚‚€~„ˆ…€€€{wtqpmmlkjjjkkkkkmrw€‰‹‹ˆ‡…„ƒƒƒ†ˆŒŽŒŒŠŠ‰ˆ†…††………Š”••”””’’’ŽŒ==>=<<<;;;99887765444444334433445555665555666666665566665544333333321111111111////....---.//00//00/////...........//..//.-....012468:=?ACEGJNPV[_fjntwurqrtvxyxxyyxxwutonlihfb_]ZWSPNLIFC?>:97422/.--.=^^YY`a;(-=Xe`_^_ciigs}ut|Š…ywwunj_QJPE:=@CGNQVVWVUURPMIFDA@><:::::7544579=<<;=6,3L^fginndbjqw{€„†”—…&!)')'&%$#"5qyrke_]XN?>QRVYYY\^bbeeeefWD=<BHEHFMQOQT_hosstvyywups}xolkkjhif[RTapvtprssrm^VYbnrnjjjimt~}~uT'()(()*)(('()'),21)'(*+*+,,0--/;Si|ˆ‡„‚ƒ}scC+/>IKKMPPQRUWXYZZ\]_^]]]]\\]^ZWXY[[`ippquqghmosvxwz‹®³«žŽ…„‚‚ƒ‚‚Š—œœ›Ÿ¡œ–’˜‚~f`_``a`adhmprtwŠ˜•’ŒŒŒ’Žƒ€‚‚€„ˆ…€}{wsqnmlkkkkkkkllkmqx‚‰‹‹‹‡………ƒƒƒ‡‹ŽŒ‹‰ˆˆ‡†††……„‡”–•”””“‘‘‘Ž‹@@?===<<;;99887777555544334433445555665555666666665566665544333333321111111100////....---.////--00/////...........//..//.-.....02468:=?ACEILMNRV[`glpvxxtrtvvvwwuuvvutsnmkgfe`_]XUQNLJGDB?=;:8641/.---2Q`[Z^bR*,9Udcddelppir~z}‡Š|v|unf`UK=:9<?AFHMRSTSTSRPMJGEB@>=;:;:7544456;>=<;;3/+*<Yfgjrthcdktz~‚Š”˜‡,"))'''#@rvnjjkijfZA8IMEOUVY\acdeg^C4E?AQKEHHILNS]flrttstuxyxvx}}umjlhffcaWZiuwsprstphVTXalrnjkijnu~|}rK$')))()((***)*')03-''(****-0339G\s…‡…‚‚|r`A+3BJKKMPPPPRTVYYYZ\___]\\[Y_^[TUY_`ZbjjmodZ`gnswy|€…‘ ¨©•Ž‡‡‡„‚‡•œ›™žŸ•—‘Š~o_`__`_cfkmppuv‹˜•’ŒŒ‹‹Ž“…‚‚‚€„ˆ…~yurplllkkkkkkklllory‚‰‹‹‹‡………„„†ŠŒŠ‰ˆˆ‡†††…„ˆŽ“––•”““’Ž‹A@ACB@?><<;:::88776666554455444444445566665566555566665554443333222222011110//////....---.--...........---............//.......02458:;>@BDFILMQUX]dhlquxtrttuuusssrtrroljhfdb_[YVSPLJHFCB?>:87641/-,,,-A_]YZ^b=)7Qffiknqutpt|‚ŠŠpmuslj_XH789:<=AEKPQPPQPONOKFB@?>=;;988543237=>><<81...+0Jchhqqogfmsx}ƒŠ“–(!'+('"3suokkmmloo[C8<ODJUXZ[\^^[L94586EMIBIJJLT\cgimprqppuxzzz}}unhjgcaab\`pzxqqqrslbPPW`jpkjljjqy|~€qC&''(''()*))**)(*-150'(())*,234>Rfz‡‰…‚}yo]:+9EIMOOOPOOPRRVWYZ[^^_`]YXXW][TSUYed_dehk]V^fmtz{‡Œ”¡ ž—“‹‹‹††ŠŠŠ‡‡‰›š˜ž˜–’ƒyda`aaadgiloswz’˜’‘ŽŒ‹‰‰Œ’‹„ƒ‚€€„Š…|ywtqpomkjkkjjjjjjkns}…‹Š‹Š‡…„„…ƒ†‹ŽŽŒŠ‰ŠŠ‡†††…ƒ…‹’”•••”’‘’‘ŒBAA@?@?>>;;:::88776666554455444444445566666666555566666644443333222222011110//////....------...........---............//....../123468;=@CEEGJLPSVZ]cglquuqqqpprrppqpmmljheca^ZXVTQMKHFEBA><:76420.,+++-3O`VUY`W,2Jaklmqvxvqqs€mtlnvieh^XWB8::99:=AHNPMKLNOONLHC?<;:8778854325:?@><<71//0/.+5Sjjjurhejr{€ƒ‰‹’v$('(&jwmhjprttxrZG<7GIESWYZZXE657:81:DB@BDHIQ]dgfghginnprvxwvyzuojhea_`a_dswvsqrrpiYNOU`ilijljjq||€m<%'()))*+*+**++*++/471&'()),18<I\rƒŒ‰…„‚€wjV4,:DIMOOPRQONOPRUYZ]^_a`]YWUU\_]YSONaggfgfZYagrv|~ƒ‰Ž‘—››—‹’””‘˜ ¢žš’‹Š‘—˜–š›™’‡ˆ‡tfeddegilmpsw~•™“‘ŽŒ‹ŠŠŽ‘Šƒƒƒ„‰„~|vsqmllmlkijjjjjjlou…‹ŒŒ‹‰‡…„„…†‰ŽŒŒŠŠˆ†…†„„‰”••••””’’‘ŒFFEDDCA???<:998877777755333344443344555566666655555566555544333322211101111000////....--,,,,--..//------........--...........//112356;;>>@CEGINQTWY^chnnoommnnoommmkkjhgeba^[YTRQNKIHECA>>;86631/.,,++,.<\XST\_A)=Tflos{zvolgin[bq†Œxg[OSSB::;9977;CJMKHFJKMLKEB<::88887643237>BB@><5111100/,'@]flmpmjmvy~ƒˆŒŒ‘O#(&Qzqkjpuw{}`VG;3;B;?IUZO5)6;9=@=;;>BDGIQZchifabc`_eikoqstsrqqjd`_^`_chwxtturqodRMNT_fhjmkikr|„}€m@2.*++++****+,--,--08</&(),..9ASgy‰‰…„‚~udH-+:CGKNOPRSRONNORSX[]___^ZVTQZ`c_ZWTU_giie[_hnuz~‚‡Š‘–”™¤¤¢žœššššŒŽ””˜›–‡~‹†}lhkiikmnrsuw‚—˜“‘ŽŒŒŒ“‰ƒ‚ƒ€€„‡‚~~{wurolllkjikiiiijjmpw‡Œ‹Š‹‰†…„„„‰‹’ŒŒ‰‰‡……†„†Œ“••””“‘”’Ž‹HHFECCBBA?>><<:988777655433344443344665566666655555555555544333322211111111000////....--,,,,--....------........--...........//0123578:;=?BEGHKORVXY]begikkkiijjiiihhfedb_^[WUSPNLJHFCA?=<886420,+++++,,2M_VQW[W,0=P^houztmh_WQJZr…Ž†€sfe`I=9;99778>CIHEEFHIHGC@<:85545653357=CDBB=94222010../,+Dcjmpqmpsv~€…ˆ‰w $"B{qhjovy|‚w\VVI9257876;8,05679:>>>EHLQTZ[aijfa^cf_Z\_abfoqmlnqjd`_^^]alvtqqrqoo`LKOU]cekmjjnu}†‚‚„rRIE<0,,+*++*+..,+--.2:92)-8>7=MbtƒŒ‰…„ƒ‚€ueJ/'0>FJKNQPPOONMNNORX]]^_^[WTSW_fhdcbejklnjcipv|‚‡‹ŠŠ‹‹“š¢£ š˜™š—•––ŽŠŽ‘’““•‡„‚vpnmooqrswxy…—–’ŒŒ“‰ƒ‚ƒ„ˆƒ~~{wurpmlljiihiiiijjmpxˆ‹‰Šˆ……„…‡‹“’ŽŒŠ‰ˆ‡…„„‰”••”“’’’‰MMIHGFDBCA@?=<;;8986556666554444444455555555556644444445544333332222222221//////......,,,,,,--,.---...------------..--..........0023668;<>@BEHHMORVXZ\`bdeddbcegfeefecba^[ZXURPOLJHHEAA>;;86421.++++++,-,<[YRU[bE&19EW`ksoha\XUIH`|‰…{uujN<9<:87658=@A@BCCCCDA?<96430//146;?BEECB=6323311210320(3Rgmmjt}wtvz‚€j7 4uujjnvw~u[TUVN>423565432788::99CJNPT\_`^ejhe`cghec_]YPP`omjlqkb]\]^\^ovqopqrqlRLLOSX\ellgimv€†……ˆ†ylc[SD4-+++++++,++++,.4;=033:>DZnŒ‰ˆˆ†„{uj][WLEADFHNONONLJD@ILTZZYX\\[WY^flooprsstqsrqsw{‚ƒ†‹Œ‹ŠˆˆŠŒ‘“—š™™”“–˜˜–“‘ŽŽŽ’”†…Š„}wustvwwxwz|Š•”’‹‹‹‹Ž‘ˆ‚‚‚‚€~~„ˆ~|ywtqpnlljjjiiihhkklqyƒŠ‰ˆŠ‡………‡‰Œ‘•’‹Šˆ†„ƒ…‰Ž”•””“’‘’Ž‹NNLKIHEDECCA?=<<:996556666553333444455555555554444444445533333332222222221//////......,,,,,,--,.--,---------------..--..........00234779:<>?ACGJMQSUUVX\\^]]^_acba``_`^]ZWVTROOKIGFCA?><;98521.,++++++-,-1G_WQZd_0(0:MX[ced^XYZRJNlztpoorbQA<54421/14554678;<><:;964332158?BEFFEB>9311222255555450/=Zinny}{ueRT8'/ltihlow~|gWWZ[XRA3468<3/1666:>?BJMOTWW[__bfgfedeehea[YRE@Qfjjkpi`[[\\\eyzppqsqpbJHKNPU\eolikp{†ˆ‰Š‰‰…ypd[I6,+++*++,++++*,/5>735=BQizˆŽ‰ˆˆ†ƒ}tj\]affeWJFGLLJKGA.*>BFVXXY\`_]^emrsstvyyxxwvxz}‚ƒ†ˆŒŒ‹‹‰‰ˆ‰Œ“•––’‘’“““‹’–•”“”‘Œ†{wyzzz||‹““ŽŠŠŠŠŒ‘…‚‚‚‚€~~€‚ˆ~{ywrqpnlkiiiiiihhjklq{…‹Œ‰‰‰†…†‡‹Œ‘““’‹Šˆ†„ƒ†Ž”••”“’‘“‘Ž‹ONNMKJHFEDCB@?>=;;977677555555444444444444444444333334544333333322222211110///....----,,,,,,,,,,--,---------------------.....-.-001445789:;=?AFGKLOPQQSVWXXXXZ[]]\]\\\ZXURRPOLJJGECAA?;9764320,,,,**,,,,,-7U[SU]eO&,4@MSUYXTRVYXUR]lmkfhibXK8-.-+*(('''''*-148<ACDDEGGC@AEFGGGFEA;40000155766655633.0Ibgs{|xX $+kvlnqoryscW\\[^\UA556530-/4DIFFXdTQVZZY^^bded```dcdc\WTM?:CUbggkg_ZY[]]n~wpprqqsXFEKNQW]ejlmrx€‡Ž‰ˆsk^L4-,,,-,,-+++++-16:;;BLZrŽŽŒŠ‡‡†|sh`]bfcbbYGOMG>9=?9#/3.GXZ\_cdcfkrvwyyyyz|~}|}€ƒ…††ŠŒŽŒŽ‘‘’’‘‘‘ŽŒŒ‘‘Œ‹Š‹Š„€€€€€ƒ„Œ’ŽŒŠ‰‰‰ŒŽ„‚‚~~‚ˆ~zxvrppnlkiihfhiiiikms}‡‹Œ‰‰ˆ†…†‰‹’”’‘Ž‹Šˆ‡…‡ˆ’–•“’’‘‘ŽŽ‘Ž‹PONNMKJHGEDB@>>=<;987677555555444444444444444444333334544333333322222211110///....----,,,,,,,,,,,,,,,,,,----------------.....-..//03345789:;=@DEIJLNMOOPQRRRUWYZYXYXXWVTQONMLJIHFDB@>;977531/.,,,,++,,,,,,/C_WSXch>*-3@LPLLLMNRVYVTgkkhcbb^[J+('&%##!!""#$&)09ENQRPOONMJIIHGGFCA<7100001567666445554105I^owyye0*izmnmnrxw\XZ[\]a__G65531-.04FJILelSSSRSW]]acb_\\\]_^ZYQNC:7=O`g`ij`\\\[ax~urpsqqlLBEIMQW^djnuy†‹’’““ŽŒˆ€vk[D0-.----,,++++,/4;;=@Nbvˆ’ŒŠˆˆ‡‚{pe_DFciea^Scmg_VL=@;9<@KY_acefhnrvyz||||}~}~€‚†††‰Ž““•––———————•••“‘Œ‹ŒŒŒŽŽŒŒ‰‡…„ƒ„…„ƒ„„„‚‚„„ƒ‡Ž‹ŠŠ‰‰‰ŒŒ‚€€€€~~‚‡~|zwurppnlkiihfffhhijovˆŒ‰‰‡…†…ŠŒ‘“”’ŽŒ‹ŠŠˆ‡ˆ”–”“‘‘‘‘ŽŽ’Ž‹TSRPNNMKIGFDCB>==;9:8677466655444444444444444443333345442222331133222211000///..--,,,,,,,,,,,+++++++,,--------------------........013355778:=@DDFHIKMMMMNNOOPSTSTTTSSRROMMKIIGGFD@?<<:75421.-,,,--,,,,,,,-.5TaVX_fa0+/6ALJFGHGHMVUSXiopcZ\daWC'%%#!!""##$')/:KUTRPOOONJJIIGDDCA=7300001446777;895653560.07?EB5,jxnnrqpzz]XZ\_aa`aO@74430/--26>ABJNQWXUTUZ]__ZZ\[]]YTQMGA<66=O\^V`lb]]]\lƒ~uqqrsp_DBFHLOV_cgr|…‰Ž‘’““”“ŽŒ†tgV=//......++,+-.07<@ERj€ŽŒ‹ŠŠ‰ƒ|pdcP=^gbeehhhhlolbODKQQYafgknrsx{€~~~€~|}~ƒ„‡”˜šž   ¡¢£¡£¢ ™—”ŒŒŒŒŒ‹‡†‚‚ƒƒƒƒƒ‚ƒ……‡ˆˆ†……‰Œ‹‹Š‰ˆˆˆŒŽ‰‚~~~~~~}€†~{yvtqonllkihgfeeggijpw€ˆŒŒˆ‰‡…„‡‹Ž“–”’‹‰ŠŠŠŠ‹‘––”’“‘Ž‹“Ž‹UTSSPOOMKIFFCB@>=;:8977765665544444444443344443233333332222211111122221100/////.--,,,,,,,,++++++****++++,,++,,------------......//01115577:<<>ACDFFHJJLMLNNNNPQPQPPONLLJJHFFEDCB@?<::86420/.--,+----,,,,,,..?a`WX_gO(*.6BMJGIEDHKMTW^mqf_`de^T9!$"! """$',1?P[YXYVRUQNJGFFDA@?<9400001244668<><9557754410/-.+1evmkoqpw{cY[^^dffP>8;84422101347:BKPX[YZYY]]]]ZZ[\\YTPMI=8656=KSTQYhe[]]awƒ}vtutsqR?BFGKOV_houˆŽ‘”–—••“’ŽŒŒ‡}sbM5---....,,,++-,27K\dtˆ’‘ŽŒ‹‹ˆ‚ylcbcZ^eccefiiggjooppokdgmrsuuyz€‚‚„„‚€€€~|{zxy{|}…œ£¦ª««««¬­®°­ªª©£Ÿš–‹‹‹‹‰‡„„€€€€€€‚ƒ‡Š‰†„…‰‹Œ‹‹‰‰‰‰‰‹ˆƒ€~~|~||}€ƒ}{yvtqomllkihffefggijqz„Œ‹ŠŠ…„„‡Œ‘••’‘ŽŒŠ‰‰Š‰‹‘”•““”‘Ž‹’ŠXWUSRRQOMKHIEC@>=;;9977765554444333333333322333344222211111100110120110011//...---,,++++++******))**++**++*+++,,,,--,,----..-.////01333356799;=?ACEEFHIIKKLMNNMMMKKJHGFDDBCCB@A@><;967410/.---,+----,,-,++--4PeYWX`g=#,/6CKJFDCBEFHQWerjihb]X\S2($!! !"%)/=S^^``\[[TQKFBAA?>778821001233478;@A=8875544320-,-6lwljonnwzh\\[]`aW:(.7;9520036435:?GPUXWTVYY^^]\Z[]^^ZTRQG;7524:FMQSVdf]^[f€ƒzwvtstvkK=BEJQU\ky~ˆ’•–˜™—•’‘Œ‹ƒym]C2.,//00...++-..4CawŽ”’ŽŒŒŒ…€ug`_aabacddggeehnrrvy~}||~~†††ˆ‡ƒ€~|{xwtrsttt~¦¬¯±´´´¶·º»»º´³²®©¥•Ž‹ˆ†‚€~zzy{{{|}ˆŠˆ……‡‰Š‹ŠŠ‰ŠŠ‰ŠŒˆƒ€€€~~}}~‚~zxurqnmkjiihffffggijs|†ŒŒ‰†„„†Œ“••’ŒŠ‰ˆˆ‰‰‘–•’’’‘‘Œ‹Ž‘ŒŠYXWWUTSPNMIHECA?><<:877765554444333322222211222233222211111100110120000000//...---,,++**********))****))+++*++,,,,--,,--....-.//001122223668::<=??ACDEGGIIIJJJLLIGFFDCDA@A@@>=><<9864520//..--,,----,,-,+,,-/;ZaZUYed3&,/9CKHEECAAAHPZkuwp^PU`bJ( !!!!#%+6N`bedb_YOHA8500277569842111233567:>=:8875544533,-Bmumjmqqvyga\`^aX:))-07:952028755:?HORX[WOOVZaa^\Z[^]^ZXVWNB<655<FOUSR^g^Z\m‚xvustsqvtSAGLMP_s}„Ž’””–—™˜“‘Ž‹ŒŒŒˆ~sfW>149;;<862-*+022C_y‹““’ŽŒ‹ŠŠ…|ob_baabbdeeeggjkprtx}€„ƒƒ……„……ˆˆˆ‡‡ƒ€zxwttpqonnqu«±²·¹¹¹»¼¾½½¼»º¹·°¬¡–”•ˆ…„ƒ‚~|ywvuvvvwy{~…ˆ„„ˆ‰ŠŠ‰ŠŠ‰Š‹‡„‚€€€€}}~|yvsrnmlkkjihffhhhhimt}‡Œ‹Šˆƒƒ…ˆ””’‘Ž‹Šˆˆˆ‹’”’‘ŽŽ‹Œ‹Ž‘‹[[ZXXXTQONLIGDB@?=<;88875555323333332222221122000111111111//00001110//0/-/..--.---+++*))))**)((((()()*+++++++,,,,,,,----..--..0000000012445788:<<=>ABDDEEFGGGGFEGDCCCAAA?===:<=;9864332///..------,,---------3Hg`WU\g_)&&/5@HGFDA@@BIT_nro`PT]^W;!!""$'.D]ccdc\ND7,(#!#'(+.15:<943347679;==@:897565445307b}xmgkqsuw`Z\_abS-&(-/36477418;899>FOTUWWTPPRW^___\\^\[ZZ\\XK?<89DNTUVV[daW_v€}yvtprrjjwxXEIMVcw‚Š’”••–—™”‰„‡‹‡|qcSEGLPPPMHC@81214Ed|”“Œ‹‹‹ˆ†xk`_cbcaabcfghjossu{ƒ…†‡ˆ‰‰ˆˆ††ˆ†…„ƒ€~yvspohfimpmn˜­²³¸¼¼½½¾¾¾½¼»»»»¶°§žž–‹€€€{yxvsrorpprrvw„€{~…‹‹Š‰ŠŠŠ‹Š†„ƒ€€€~~€ƒ{xwsplllljiiihfiihhilu€‰Œ‹ŒŠ†„„†Š’•’Ž‹‹‰‡ˆŠŒ’’“‘ŽŽŽŒ‹‹‹Ž‹‰[[[[YYVTRNMJGEB@@>=<998755553333333322222211220001111111110000000000100//..-,,,++++++)))))**)((((()(')*****+++++,,,,----..--..00110000124446889:=>=>?ABBCDEEDDDCCB@>>===<<;;;:::77522221///.----..--.-...-,,--3ShZWY^iQ#%*,3>FHDCB@<AIRfppk`[^]]T+!!"%*6QdbceZF0,)%$"##$$&(*/9;844447;==?BBE@;:86766750Ku}tkimqvzua[_Z_gK((+.-1038:7<FE>;>>GMVXTSSSPQSQUZ^^]ZZYYYX^d`OCB>?FRUUUVXa`[i€€|wususj`bkuxXFKXo}†‘’‘‘’’’‡€~zz‰ŒŠƒxsid_bfffb]VQJA846Ml„‘’’‹Š‰‰‡|rdb`bcbb`abdglptw{|…‡ˆ‰ŠŠŠŠˆˆ†…‚~}}}|xsnjff_hmpkoŸ¯´¸»¾¾¾½¾¾½¾½¼»»»ºµ¬¦‰zz}~zxvtromkhhjjljoy}v{‚‹Š‰ŠŠŠ‹Š†…„ƒ~~€„‚zwupnkjiijiiihfhhhhjpw‰ŒŠŒŠ†„„ˆŒ”—“‘ŒŠ‰ˆˆ‰’“’’’’“—˜“ŽŽŒŒ‹‹‹Ž‹‰[[\\[YWVSQNLJHFD@>=<:9765542223322221102222222111100000011000000//0/....---,,,+*++**))(())))(())((()()))*****++++,,,----------/1..0011223333667799<>>@@AAAAAA@??=>><;;::::999866555221110000----.....--------./8Wc\XYcd@!%)+1;FIB@@>=@EUjsrmkihieD!""#'.?^iedbL3*+)%#!#""#&(+/79666679=@BCFHGB?;8766543I~yrmilqsyud[^]aaD$)++-.047:=9>JF<9=ELPTXURRRNMONPSV[ZXZZ[VTZa]NHFCCDLRUUVV_`ar|xwvtvtd]`glssVO^sƒŽ‘‘ŽŒŒˆ…}qotvyŒŽ‹†€}zxy{}|zwrkf\VKFK[q‡”’Œˆ‰‡†…|xkaadbaccehiknquy}}‚…‡ŠŠŠ‰Šˆ‡ˆ†…ƒ~zvvwvvusmhb\_dacgm‚¡«³¸»½½½¾½¶¾¿¾½½½½¼´ª …styyyz{zxurpkgffijhdemnw{ww|‚‡‹ˆˆŠ‹‰†‡„ƒ„‚€€€„‚{wtrpllkkjjiighhhiikq|„ŠŠŠ…„ƒˆ•–”’ŽŒŠ‰ˆ‹‹‘“”“’““˜¡¡›’Ž‹‹‹ŒŒ‘ŒŠ^^\\[YWVTROLJHEECA=<:976654222331111111111111100//000000110/////./..--..,,,,--**++**))((((((''(('''()))))))******+++**,-----..--//001122445566779:;<>>>@?????>>><;:9998888778866553221110000/-..-,---,-------./0?_cXVYba.#''+.7CGFBB>;<DXv}sjgbnt]/ !$'1Hhmml]7*-)'%#"!#%#$&*-46666679=@DFHHGC@<985441:s‚uonqstyyb^`]agI%%*/9:78>>?A>=FD?=@FMNLMLKNQMLNOOQRSVWW[\VTUWUNKKGEEHNUUVV\dj}|vusuuuua]bbekso_i{‰‹ˆ††‡„€xkhmtrx…‹ŒŠ‡„„†ŠŽŒ‹‡{tlf\\_m{‹’‘Š‡‡……„}tf]^_bdcfgklquw{„…‡ŠŒŒ‹‹Š‹Š†„€…wnjjkljd[WTQRUSW`‚Ÿ¡ª¶³µ»¸¸¼¾¼½½¿½½½½¼¹¦}imqtuvvwvuronkidipopkfltsjekpuvˆˆ‹‹‡††…………ƒ‚‚€ƒ‚}wurqllkkjiiighiiiikq{†‹Œ‹‹Š…„‰“–”“‘‹ŠŠ‰‘’““’‘‘“œ£¤œŒŠŒ‹ŒŽŽŒŠ]]\\[YXWTRPNLIGDB?<;:987643322111100111100000000////....//..........----,,,,--++**)((()(&'((&&''&&'((((())))()****++++,,,,--,.--0000112222223456778;<=====<<<<<;::::9988776888655533210000000///..--,,.---...---1Fd^UV]hV%&'&(+3?IGA??<:C^qjjbapsqM##'3NmpqnP--,)$""!!"#""$),0456678:=@DHJHGA>=875110^€xtqtuz|~gY_]bgU&,)-4=GEHLOIGDEIEFEDEKLIFCEJKIIKNRTQQRUYY\\URTQOPOKHFELSVWUYds{wrsvvvwr_[__agkqtt‚ŒŒŒˆ„ƒ‚ƒ…yecholm{…‹‹‹‹Ž“–•–“ˆƒ|wolqx„Ž“‹‰†„„„{o`Z_`^bgjnqsv|}€†ˆ‰‰ŠŒŽ‹‹‰ˆ‡‡ƒ~wz}|{sfZZXTPMWPGQ^jl‰£¨­µ¹»²Œ˜œ¬¾¾¿¾¾½½¼½·¢rYcilppqttttrqpnkgjonoppmqvm\[`emzˆŠ‹ˆ…………………‚‚‚‚„ƒ~xurolkjlhhiiihhhhjou}‡Œ‹Š‹ˆ„‚‡”•’Ž‹‹Ž“””’‘’™£¢—ŽŒ‹Š‹ŒŠ^^]][YYWVSQOLJHDB?<;:987643322221100////../000//....//////------/.--,,,,,,,,,,****((((('&'(('&''&&&'((((((()**))**++++,,,,,-,,.-..00112222223456779:;<<===<<;;97777777776654446533332111000000////..//..--...--,.3PgYRXbeF#%$#$(.;EIF@?>>Hcpncekhkf8!$(1PopokG.,)&#" !!"#"!#(+-14679:<>?AEIJIA=>>:50/[yxsqtx|{~pV\^`h^,),,0:CDEOQSXSMQOCINMGFGEDCCDIIHGMNTUTUVXZ^_YTSQOOQOLHDHQVWX[fuztrsstuwr_[\``ago|‹ŒŒŠ‡„ƒ„€wdbdljbq‰ŒŽŒ’–™š™—”Ž‹‡ƒ}…Š‘Šˆ…„„ƒ{m^[^^^einrwz|ƒ‡ŠŒŒŒŒŒŒŠ‰ˆ…‚{ytquy|vvld[T^aFDl’š™§²·¸¸¹¾¦w™Œ‘»¾¾¿¾¾¾½²]RW^cgkloqtssrqqroloromkkloooaORV`t†ˆ‹ˆ……„………„‚‚‚ƒ„ƒ€}xtpmlkihhhiiihhhkpw€‰Œ‹Œ‹ˆ„ƒ‹’–“’ŽŒ‹ŒŒ“”•’‘‘’™ Ÿ—Œ‹‹‹ŒŠ^^]][ZYWTSQONJHEC@<;:976644310110000//.....0////..........----,,--++,-,,+++***))))('')''('''&&&&&&''''''((((()))(***,,++,,,,---.111122113333335556798:::::8:::888777666666544443333222221111000////.//.-..--.----/6[bRQWab9"##""',6BHGCBB?PgbXZ]gknZ("%-Ffmjf@+,'&#! !$%##"$(+-/336:<==>AFIKC??A<25`wrlstxz||u[Z]]dg:++,-.6=AGOTXfbWICDMLIGEB@ABBCGIGHJNSVWWYZZ]a]YUSRRSNMHDEMUXZ[fsvqswxvuvq`[^]`dgsˆ‘‰†„ƒƒ„ƒtbccii^j{‡ŒŽŽ’•™ššš—–’‘Œ‰‡†ŠŒ‹Šˆ‡‡……whZTX^bhkos{„†‰ŠŽŽŒ‹Œ‹Š‡‡ƒ‚~}zzzug\armnge^_qsIZ™¬±´¹»»½¾¼»µ¬¸°³¼¾¾¾¿¾º§uHEORX\`dkoppprrqsvvrrxtlgginrriRAMWoƒ‡‹ˆ…ƒ„„„„ƒƒ‚‚„ƒ†‚~zwrnllihhhhhhhhimqz„‹‹ŠŒ‹ˆ„…Ž”•“’‘‘ŽŒ‹ŒŽ•—•‘‘“› œ–ŽŠŠŠŒŒŒŠ^]]][ZYWUTQNLIGEDB=<:9766433211100..//.....0//..,,........----,,,,+++,++***)))))(('&'(''('&&&&&&&&'''''''''((((()***++++,,,,--./111122113333335556778899999888777666666666444443333222221111000/////00/...--.-,,+--=b\TUZ_W-!"!#"(2BJJHCBAX_OLOW_hkC#)9YhibA,*&$" !$$#!!#$'+-0369<==>ADHIGCA?8Lpvmmlpvvyzs_Y]\^eI)-,11059@HOWakhWJGJNNJEA@>>??BDFHILMOSVXYXZ[]^\XXWWTONJEDGQWYZervsvzyxuwr_XY\_dkxƒŽ‘Œ‰†ƒƒ‚„‚~qbacfg]h{‡ŽŽ’“˜™šš˜–•’‹ŒŒ‰‰‡‡†„~vh^WUajghov}„‰‹ŽŒŒ‹‰†„„}}ytonj]SIennpuhU\jLo¦´¸»½¿¿¾»´³·º»½¾¾¿¿½»°—dFKSQOQUZ^bgjmprqrruyyrswqppoqwvshKEYp„ˆ‹ƒ‚„ƒ„ƒƒƒƒ„…‡‚€|yupnlkhhhhhhhhimr{…‹Š‰ŒŠ‡„‰’••’‘‘‘ŒŒŒŽ‘––“‘‘’˜œ™Œ‹‹ŒŒŽŒŽŽŒŒŠ^^^^[ZZXVSQOMJJGEB@>;96664331111//.-----....--..,,--..---,,,-,,,++++++++***)**))))(''&&&&&%%%%%%%%$%'&''(('&''))((******+,,,.../00112111223334446655777787777777666666777766664333333322222211100000//..----,,,,,,+-GdWRU[cV,!"! "'0<MROKGKa]QJKMYnc.%1Rd`V?,&""""!!#%%##""$(),.2449:<>?ABAB>;H_tqljiputvvq`Y\]^f_)+/0325888?HXil_UMMPSUSME==<<<?CFHJLMMQSVYYYWX\[ZYXXTPNIECDMSW[ennpruvsuvng\X]_hs€’‘‹‹‰‡‡†…‡…oaaabeal{ŠŽ“•–™™š˜—”’‘ŽŽ‹Šˆˆ‡ƒ~vlb^_gossy}‚‡‹ŒŽŒŠˆ‰„}{wutskqo_YpsmklsjZX[Wuª¸º¼¾¾¼¸±ªµº¼¾¾½¾¿»´›rQKTTQMNNNSV\`dilooppsyƒvwwssmiprpoaBKp„‰ˆ€€‚‚ƒ„„„„‡ˆ…~{xusoljhhhggghjms~ˆ‹Œ‰Šˆ†‡••“ŽŒŒ‹Œ”•“‘Ž–˜”Œ‰ŠŒŽ‹‡ŒŠ[[[[[ZYWVSQOMJHEDB?=;97764331111//.-------------,,------,,,,,,+++++***))))))))))))'&&&&&&&%%%%%%%%$%'&''(('&''))((******+,,,.../00112111223334445555777787666667777666777765664333333322222211000000//..----,,,,)***0QfUPV\b[-!   &+9HQTMIQe\NNPSetK!$/NaYUK;'""""!!#%%$##"$')*,/14668;;;<;7Icrsmfgjopu{wmaZY\^`d@-,/02589736AR\UKHPRUUWZUL@=;::=?DGLLMMORVYYYXYZZXUUUSOLIDABHOVXbjjjlpsqsrke_YZ`o{‡”’‹‹‰‡‰‰‰‰†oaaaekiq…Ž’’“––—•”Œ‹‹‘‘‘ŽŒŠˆˆ‡ƒ€yrnjhny~……‰ŒŽŽŽ‹Šˆ‡„€}zwuvrrronpqrnoqmkhfYS_c|©·º½½»º¶¯¥°¸»½¾¿»¶©~UMRRQOLMNOOOQV[_cgkpqqrt||wqsxqj`mvxwn\ay„‰„}}€€‚„„„…ˆ†…ƒ€}{wtqmlhgggghhimu~ˆ‹‹ˆ‰ˆ‡‰‘•“‘ŽŒŒ‹‘”•‘’’›žš“‹‹ŒŠŠ‹ŒŠ†ŽŽŒŠZZZZZYYWTSQOMJHEDB?=;:9764322000//.-----------,,,,,,,,,,,,,,+**(++++))((((('''(((('&&&%%$$$$$$$$$$#$&&&&&&&&''(())))**++,,,,../000112222233323444466666677666667777666667766554333333333221110////////.-----,,++,,+()5_bSPU\fa2 "(*7CRTOJ[i[PKQZpk5 ,Jc]TMG*""""!"$%%&%#$$',+**.//1269841Owpmgdfimppwpmc\YZ]^`Q1//2258<;:8<=KE=;EQWVXZ\ZQF>;;;;=BFLNNMPPUZZYY[\YUQOOLKJHDCACKRW`gghjmompmdcb\ZdsŽ’’’Ž‹‹‰ˆ‹ŒŒŠ‰ƒsb`bhru}Œ‘Ž‘’“”“‘Œˆ„„‡‘’‘‘‘‹Š‰ˆ…{yxsrx„†‰‹ŽŽ‹‡ƒ€||zywsqpomppkjknpqmiejc^c_v¥µº¼¾¼º¹µ£¬­¸»¼¹±“eJLSRQQQPPOOOMMQTZ^agipqrtssusv{|tq}ƒˆ‰py€ƒ†}y||}~‚ƒƒ…†ˆ…„‚€}{wrpnjihfgggkoxˆŠ‰ˆˆˆˆŒ““Ž“––‘Ž—œ—ˆˆ‹Š‹Œ‰„€ŽŽŽ‹\\\\ZYXVUTQONKIFC@?=;:9764322000//------,,,,,,,,,,,,,,,,,,++***())**)()))))(((((((&&&&%%$$$$$$$$$$#$&&&&&&&&''(())))****++,,-./000112222233333565566666666666666777666667766554333333333221110///////../----,,++,,))'):d`USV_id4!"##$%+3>MSPSgnZNNSatX#(>afYMB*""""!"$%&'%&%%(0/*))**+++,.,NrqkhgkooopviXea\ZZYUX4..366679;78@?B;19EORPRUSQJD=999;=BFLNPRTTUWYZ[\\YRLKIIGHEDCAAFKT]ddehklkmj_`hd`hw‰’’‘ŽŠŠ‰ŠŒŒ‹ŒŠ†ub_dkv{‡‘ŽŽŽ‘‘Ž‹ˆ„~~ƒ‹‘’‘ŽŽ‹Š‹Šˆ…‚€~}€„‡‰‹ŒŽŽŽ‡~xuqmmrsppqonmlklonnncY`ed`ZU`ž´¹»º¸¸¸´®°©²º¸¬QLMRRRPOQPPNMMNLNQUY^chlnrqprvx†‡…zŠ‘’‰y…ƒzx{{{|}}€‚ƒ…†‡†…„€}{zwsomjhggghkpzƒˆŠˆˆˆ‡‰”“ŽŽ’••’ŽŽ“›œš‘‹‹‹‹‹Œ†}ŒŒŠYYYYYXWUSRPNLKIFFD?==:8764332000/.---,,,,,,,--,,--++,,++******((**))))))))(((((('&$&%%%%%%%%$$$$$$"#%%%%&&''&&(())))***+,,,--//00000123323444456666666555766666676666677666655543333333322221100//../...------++,++('''BkbTRW_hc8!#$$$()*6FQTXliYPTXhsA)3FOJ</%!!  !!"%&'&$(&(+/,('&(&$$!*Lrnmhhlmnmpr[Khf`\ZYQYL*.1699788:75786328DKMKKMMHEB>:88:>AELNQTWXVVXZ\]\XPMJLJFEGDEEDAFMW`abehiikfZ]ghjp}Ž‘‰‰‰‰ŒŒŠˆŠ‹…wd_fpz‘“’ŒŒ‹ŽŽ‹‰…‚}„Š’”’ŒŒŒŒ‹Šˆ„ƒ‚„ˆŠŒŽŽŠ„{voga\_chklpqroonllnmlU@MX_[H@YŒ°¶¹¶¯µ·«¯±­¶¶ª€NOQOQQSRRSQPNNLOONNSUX\bfimoqt|…Ž–•’‡’˜šˆ„ƒvvyzzzz{~€‚ƒ†‡…„ƒ‚€~zuqolkjihjls|…ˆŠ††‰ŠŒ“’Ž’••’“™žœ–ŽŠŠŠ‹‹‹Š„}|Œ‹‹‰YYYYYXWUSRPNLKIFFDA?<<8764332000.----,++++****++,,++**))))))))(())))(()(((''''&&&&&%%%%%%%%%$$$$$$#$%%%%&&''''(())))***+,,..-//00000122233454456666666556666666665666677666655543333333322221100//......----,,++,+++(%#)HmaYWW_ggC!$%&%%$'/;JP\teWUW_rj2,,()%# !!  !!#$')./,,(&+)('%$""$%WtmollnokmrrF>hle\XZPXW0+159:<<;>;55463.39DIHHFFEDBA>:88:<?DGLOSXYVVXZ[\XVPJKKHGFFFGGGFCIPX]`dgijjcX[cinw‰‘Œ‹‰‰‹Œ‹‡ˆ‹…yd_ft‡’’‘Ž‹‹Š‰‰†ˆŠŠ‰„€}|†””Œ‹‹‹ŒŒŠ‹‰‰ˆ‡ˆˆˆ‰ŽŽŽŒ‡‚}uhXLIORT\`bcfmpoonnjeN=R_^V>3Np¥´¶¯‹˜°—¦²°± ˜oMOT]WSTXWURQQPOOOOOPQUX[`hq}ˆ“š¡¢ž™™—•ŽŠ…wuyzzzz{|~€……ƒ‚ƒ‚~~}xvtpnkihilt€‡Šˆ……†‰”•’Ž“•”‘Ž•žŸš‘‰ŠŒŒˆ‚w}‹ŽŒŠˆWWXXWWUTTSPNMKHEEA?=<;98532220//-,---,+*++++++++****)))))*))))))(((('''((('''&&&%%%%$$$$$$%%$$$$$$%%%%%%&&''(((((()))*++,,,--/////00122244455566666666666555555556566556666666433333332221/111//00......,,,,++,,+,*,,(%%*KmbXVW]diK##$$$$"! &2?FkwcXWUevP#''%#"! !!! !##%.9@<:/(++)&%#"#!=spklonmposk:+`kid\[UK[A)/49::=@@=86542-149@DDA=?ABAB?<:98;=BEJLQVVTTVXYZVTOJKLKHHHHJKJHDDIMV^ceefheWXdmt€‘ŽŒŠ‰‰Š‹ŽŽ‰‡‡Š†}h_jvŒ’ŽŠ‰‡…ƒƒ‚…ŠŒ‡„|‚ˆ”‘Š‰‰ˆ‹‹‹ŠŒŠ‰ŠŠŽŽŽŽŽŒ‰†zm[N\a\]^^ZZXY`ejmmmeWG=GJKNB?M^•¯²”R‡¤}š³·ª…v\MNRXQTYa]TUVVTQPRRPNOPR]n~œ¢£¢ ›Ÿ£Ÿšš˜’Œ‰Šˆ‡ƒ~xvxxzz{{z|~…„€~}{wutrollknyˆ‹ˆ†…‡Š‘””ŽŽŒŒŽ‘••‘Ž’šž•‹ŠŠ‹Œ†}rx†‹‰†WWWWUUTTRQPNLJHEDA?=<;98652220//-,,--+*+************))))))))))))(''''''(((((&&&&%%%%$$$$$$$$$$$$$$%%%%%%&&''(((((()))*++,,,--///11001222444555666666666655555555565665566666664333333322210011////....--,,,,+++++++,,)&#(/Mm`VUX^fl[&"$%#" !)3HlqbWVZhp2&#$#!! !!! !$"(.3782/++-*'%#"#-hnkjjmpllta.5_kigc`bJ[Q++<>;:=?D>7559830258<@=:7:>>>?>=:97:<?DIMOSSQQSUVWTRNJKKKKIGJMMLIFACIOW\acffcYZepz‡ŽŽ‹ˆˆˆŠŽŒ‰ˆ‡‰„}h_ly…‘‹ˆ†„~|xy~„‡‡‡…ƒ‰Ž‘‹ˆ‡‡ˆŠ‹‹‹‹‹‹Œ‹‰‡…~wod[mm[RWVY`\XXY^dffc\UF51GQORZ]z¢ªŽ_”‰sŸ²µ¨vVIILOOOSVVROTUTUTRQQRQNMa~–¥«°¯ª§¡œžžœœœ˜“’‡€ywxxzz{{{{|}‚ƒ€€€€€~~|zywtromnqzƒˆ‰ˆ††‰”•”ŽŽŒ’””‘’˜œž™‘‹‰ˆ‰‹‰€voxˆŒŠˆ„VVVVTTTRQONLJHGECAA><:87543320//-,++++**********))))))))((((((((''''''''''''&&&%%%$$$###""$#$$$$$$%%%%&'''''((((()))**++,--.-.000022223433555666666666665555556666666666666666443322111111000/0.//.-..-,++++++)))*,--+)%$'-MobUTW]dl_4!$#"! !%*Epn`YY`rU#%"""!     "$(-/2761,-./,)%$""XvmggllmukO3Cahjjhd^L\[5.:@?@@BB>835:@B<4379976567::<><<::78;>CIOQQQONOQTUSQLLKKLLKKMNNNLGDABFOT\acec\[iv‚‰‹ŽŒŠ‡…††ˆŠ‰†ˆˆˆˆ„~jbp{‡‹ˆ„‚€|wqosy|€ƒ†‡„‡‰Œ‹ˆ‡ˆ‡ˆŠŠŠŠŠ‹’’Œˆˆ…‚€xsssrqigjhiicWPQW[ZVTUUOCCTSVY]get¤€™‰…£¯¯¦|WJHIMLLRUQOPPRUWWUQRTOTfˆ¦²¹¼º¸°©¥››ž  ¡Ÿœ™™•‡{v{zzz{{{zy|~‚}}~~}}||ywrqppu}„Š‰…ƒ‡ŠŽ•”’Ž’“Ž‘–š›˜“‰ŠˆŠŒŒ†{rnw…‰Šˆ…UUTTSSSPPNLKIGEDBA@=<;7574331///-,++++**********))))))))((((((((''''''''''&&%%%%%%$$$###""##$$$$$$%%%%&'''''((((())**+++,-....00002222344445666666666666555555666666666666664444332211111100///.//.-..,,++++++*)()+++*(&(+./PndXTWZ^ffC""   !Gwm^VZeq:!##"!     #&-2111,+,-12.*'$#<sjjgikpt_<;ZegjfggaMV_F29E?DCEC<;756>FEA955564332599;;<<;:99<AEJPRTRMLMOPQQMLKKKLLNNOOOOMGDA@BGKRYaec[^o|ˆ‹ŠŒŠ‡……†„…„‚€†††‡ƒ|jcq~ŒŠ†ƒ~ypggmsv{~‚……‰‰Œ‹‹‹ˆ‰‡ˆ‡‡‰‰ŠŒŽŽ‹‡…‚€~vrpppqstqoc]aSEEPWTNHINPMKQQPTSfa`‘”|¥¨©¬ªŸmLHHMNMMNPPSTTSRSTRQQPUnª·»½¿¼ºµ­¨žžŸžž ¤£ŸŸ¡ ™|u{{zz{{yyzy}€{{|}~~}}}}{zwtrrx€‡Šˆƒ„‰Œ‘•“ŒŒŒ‹Œ’“”˜š˜”‹‰‰‰ŠŒŠ„xnmx†‡ˆˆ…TTRRSQPOONLIHFDCA?><;:866532100/-,,+++*)****))))((((((((((((((((''''''&&%%%%%%$$$$$%$#########$$$$%%$%%&'''''()))))**++,,-.-./0101223345554555557766666656665566666655555555444433221111100/..--/.-,--,+++****)((**+-,)'+,.0/HkcVSTX]_fQ/!!#Uzg][^j`%"# "! !! #(*,*++),,-461,(%2lnffjijp]<HgfaabcccWRVI65=;=C??=97532:BDB<543230312589;=>=;:<@DJMPSVURPONNMLKKKLLMNNPQPOOMHFCA@@CHRZaa`fxƒŠ‹‰‰†„„‚„‚|y{„‡…„€{jes‚ŽŒ‡ƒ‚€~vl`_dkosw|‚…‡Š‰‰ŠŠ‰‰‡††ˆ‰‰Š‹ŒŠŒŒŒŒŠŒŒ‡„}|zwtqqqpqqn\9489<DINMKKKMIJFMRRPlljŠ˜‰Œ §¨©¨UFGHJJILLOKKPOMMOPPQOXw™­¸»½¾¾¾¾¼´­¤Ÿ Ÿ¤ œ ¦¥ž—„vz|{zzzzyxy|~€wwy}}|}}}}}||yxtrz‚‰‰†„†ˆ––“ŽŒŒŒŒŒŽ‘”’•˜›™–‹Š‰‰Š‹‹†}uonz‡ˆˆ‡…RRQQPOONMMKHFECBA?=<;976653210/.-,,,++*)****))))((((((((((((((((''''''&&%%%%&&%%$$$$##########$$$$%%$%%&''&&'())))**+++,,-.../0101223345555555557766666656665566666655555555554433221111000/.---..-,++*)))))''*)))*+-,)),,-013Egj]TRSY^dbF$!!!"'fxb[]`nJ""!   !&(*++***--.120,,/cpjedhkn_M`jhdaacb[_[J?47899;<:97565108ABB=6310//012237:;=>>=?DHKMPRTSSQPNMKKKKKLLNPPQTSPOLIFCB@>?@GQU[bm|†ŠŠ‰‡„ƒ‚‚‚}vqu‡…„€{jiv…Šƒ‚€~}xma]`eimqv}„„†‰‰‡‡ˆ‡††††††‡‰Š‹‰ˆ††‡ˆˆ‡‰ˆ„~|{zwvtpqqpqnM)5688<CDJPSOKHKMVZZV^_l„’˜™ž¨ª§¤wDHIIKJILLMJJLKJLMLMMTsœ¯¸¼¼¾¾¾¾¾¼¹³­¤ Ÿš™˜›ž¥¥¡›‹|z}{z}|zzxx{}vsuwz{|}}||||{ywtz‚‰‰†„†ˆ–“‘ŽŒŒ‹‹‘‘“—›š–ŒŠˆ‡‰Œ‰‚yqon{‡ˆˆ‡…QQPPOOMMMKHFECBAA?;;986654320///-,-+,,****))))((((((((((((((''''((''&&&&%%%%%%$$$$$$##########$$$$%%%%$%'''''()))***++,,-,-./01123223455555555445577666666665555555555555544333333111100////...-,,,+,,++****))))())-/0.+*+/3477Bcn^SQSU]cj[1   $$3lrb^[am0 "!""$(*,*,+++./012/,.`oghgijphdjkhe``acb]VH8205768>@<84364107AFDB:430.013454679<>AABEFHKNOOQSRPNLJIIKKMMOPSSUSPNLIFDD@AA>AEKTar„‰‰‰ˆ†„€€€znkv€ˆˆ„€yjjw…Œ‹‡‚€}zvkd_^_ehmsy€…††ˆˆ‡‡„„‡…………………‡†ƒ|}~~‚‚„††~}zywvuutuvkR/.:<>CGKGGHOPQXXV\`aeidm‹—“œ§©¦ mAFJILKJIJIJJJJJJIKJSl–®·¼½¾¾¾¾¾¾¾¾¹µ®¥£¡š™™˜˜££Ÿ•„z~}{{{{yzxxz~sptuww|{|~~~}}{yv{ƒ‰‰…‚‡Œ‘•”‘Ž‹ŠŠ‹Œ’‘‘“–™™•‘Š‰ˆ‰Š‹Œˆuoon{…ˆˆ‡†OONNMMLLLJGFDB@@@=;::76643220///-,++,,****))))((((((((((((((''''((''&&&&%%%%%%$$$$$$##########$$$$%%%%%''''''()))**++,,,,-..001132223455555555555566666666665555555555555544333333111100/.....--,,,+++**))))))(()))-/21/-.147:=>>UjeXSRVX_ihN%  %((;qr]_akb "!!!$(*,,.---./0110,UrfcdhkpnjhgefdaabcdfY51333459AGC94451104>EFA:51/.013566779<>BBCEFJJLLLNOQSOMLIIJJLMPRTTUSOMJHFDCAAA@>?BO[pƒŠŠˆ…‚€~zqhlt‚‡‡†ymlx…‰‰„|{|vkb_\[_`fmu~ˆ‡„††‡‡„„…„……„„……ƒ€{vqpqou|~‚…‚~|{|{{{yxy{wgJ@AFP[^XKMX\]^\Zadefkkc{”‹›§§¥™cCHJIJKJIHHIIJJHHIIOfª·º¾¾½¾¾¾¾¾¾¾¾º¶«§£¡›™™š–—Ÿ¢¢œŽ€{{|{{{zxxy{}nlnqttxy{|}|||{zy{ƒŠˆ„ƒŠŽ••“ŽŽŽŠ‰Š‹Œ‘’“——˜–‘ŒŠ‰‡Š‰Š‹Š„}uoon}†‰‰‡†LLLKKKIIJGDBCA@>>;:87755421000/...,+,,****))))(((((((((())((''''''''&&'&&&&%%%%%$$$$########$$$$$$%%%&''((''()*****++,,---//0012433334455555665555555555666655555555555444333333221110///..--,--**++**)(((''''(((()-1442/236:<BEA>Idm\SQQUZfma9"%',,Htjc``pF! "!%&+-/20..000221LrhbcejppigdddddcefdjbE1255348:DX]93332103:EKF;53.,/13567879;>BCDFFIGJJKLNORRRNKIHHJJMOSTURMKIGDCB@@@A@@?FSiz„‡…‚~}|ujcivƒŠˆ†‚yomy…ˆ†‚~||zufefed^^ait€ˆ‡………††„„„„„…ƒ…ƒ‚€zvmbaees{|}‚€|}€‚€~~yphdehiidW[`a``bcfgjkohbl‹–Ÿ§©¤SCFKKIJIHFGGGHJGGHI]„£²¹¼½¾¾¾¾¾¾¾¾¾¾½¸³­¥Ÿ›š˜–•‘“—™™”…zyzz{zyxxyy~pjllqrtvy|~|z|||z}ƒˆ‡„„Š–”ŽŠ‰Š‹Ž’’”˜š™˜“Œ‹Š‰ˆ‰Œ‹‹‹‡|tnon|ˆ‰‰ˆ‡KKKIJJHHGHFDBA?=<::877663210000.--,+,,****))))(((((((((())((''''''''&&'&&&&%%%%%$$##########$$$$$$%%%&''(())))****++,,,---/00112433334455555665555555555666655555555555444333333221110///.---,,+**))**)(((''''''(()-167524:<>BFJBC@?VkbWQPS[_gn^4$+,-.Oxj__`l4 "$&&)-1232244441IsmfffinphedddddeegddYC7534437;?CLN723322128CHF=830../0156669;<@BDFFGFGHHIMPPQNLKIHHHHJNPSTPMKIGDCA?@@CDCAAHYjt|€€~}|~|wnbbkw„Š‰ˆ„{omy„‡ƒ}z||yulhjhe`^^iv…‹Šˆ„„„„„„„„„„†…ƒ€}woeWNQXmvy{}€~ƒ†‡†ˆˆ‡}wqssqnjdW_a`__`eeghlogcg{•ž¥¥£‡JEKJIHFHGGGGGGGIHFLnš¯¸¼¿¾¾¾¾¾¾¾¾¾¾¾½»´¬¦¡™•‘‰…„‹…{yzyyzzyyz{€qjggnqpsvxz|z{{}{~…ˆ‡ƒ…’•’ŒŠŠ‹Œ”—˜š™—’ŒŠ‰‰ˆ‰‹‹‹‹Š†ytnno}‡‰‰‰ˆIIIIHHGEDDCBB@?><;98866543000//-.--,,+*)))**))((((((''))))))))))((''''&&%%%%%%%%$$$$$$$$$$%%%%$$%%&&%&'())**))*,++,,....///011223344446456666666666666664455545564444433422222221100//...-,,++*)))))''&&''(('&%%&')+16:976>?BHLMJIC?<PbeZRRUX\_inR1)))))SsbZ`j[ "$$&***.024545775=ikhhkklqgdeghhcdeih^G@B332227FD@732121111466:@C<;6..//1234569;<=ACDEFFGEGHILNNMMKIHHGGILNPROLJIGEDC@@@BDDDDEIS`ktxz{{|vqh^`jw„‹ŠŠ†}on{ƒƒƒ|{{{|{skjjhebcn~Š†ƒ‚‚ƒƒƒ‚„…ƒztf^MCDVmswz|~}~‚„‡‹ŒŽŽŠˆtppmmcX\___`abdfgeckgdiu ¤ ‚G?GIKIFFFFFFFHEGFFZˆ¨·¼¾¾¾¾¾¾¾¾¾¾¾¾¾½¹²¬§¤ ˜”‰…‚†‰zyyxxxxzzz{qgehhmoou{|}}{{{z~„ˆ‡ƒŠ’–•‘ŽŒŒŒ‹‹Ž‘•˜™š—“‹Š‰‰ˆ‰Š‹‹‹‡}yrnmn€†‹Œ‹‹GGGGEEEDCCA@@?=<:987755443000//----,,+*)))**))(((((((())))))))))((''''&&%%%%%%%%$$$$$$$$$$%%%%$$%%&&%&'())**))*,+,,-....//011122334444566666666666666644445554334544443334222222100//..---,++*))))((''&&&&''&&%%&'(*/7<=;8<BHJLLJIED?=GXje[XXXY[bhfR*"()(Ztd]blL&$&**+-0378:;987fjgikjophcfggghfgilWA?B7353337CKE731///0124699799951.././025789;<>ABCEEEEEDGGHHIIHHFFGGGJOQROLJHFEDC@@@@CEEEEGHP[dmty{wqfb^_ky†‹‰‹…{oo{€€|{{{{}}ypoljiffq‰…‚€€‚ƒƒƒ…„‚}ztgZTKHPctvvy{}~‚„‡‹ŽŽŽ‹‰wponj[_`a``cacefgc^efhnq†šŸF@FGHGHEEEEEFEEDFOtž²º½¾¾¾¾¾¾¾¾¾¾¾¾¾½¹²¬§£Ÿ˜“Š…„…†‹‹„{yyyyyyyywy}rgeggjnnsvyz|{{{z…ˆ‡…”•“ŽŒŒŒŒ‹‹Ž“–˜—•‘ŠŠŠ‰‰ˆ‰ŠŒŒ‰†|xpmls‚ŠŽŽŽŽEEEEDDBA@@A@><;::876745422100/...-,,,,+*******))))))))******))))((''((&&&&%%&&%%%%$$%%%%%%%%%%%%&&''''()))*****,,,+,././/111111233443444555555556655554345555334443333332333111111//....-,++**)()(('''&%'%&&&&%%%%&*19?BB==FKKLJJHEB??A;I`jdYYYWY]`kgA&&&(bvdbdj:!(+*,--145688?jkgiigltkdfghhiill_H:BE>3153016A[R520/..01348<:966642-,---/04798;==?AABBCCDCCCCCCCDEDEFFGGJKNQLIGFEECA@?@CDGGFFIGMV_gosqgSX_bn{ˆŠ‰‰„|qp{~|{yxyy}}tonnkilv…’‡ƒ~€€‚ƒƒ‚‚€~ysha[WQQZhsuwxz}€‚„‡ŠŽŽ‰wpljb]`abbbacdfgd^Ydfemrz‘šžšx@BFEDHGGECDFDDCEJd’¬¸º½¾¾¾¾¾¾¾¾¾¾¾¾½¼¶²¬§¢›–‡„‚ƒ…‰‡}{{zzyxxwvw}sddgefkloswx{{{{z‡ˆ†ˆ””’‹‹‹‹”–—”“‰‰ˆˆ†‡†ŠŒŒ‹†€{yutw~ˆŽ‘‘BBBBBBAA@@@?<;::9765554322210/...-**+++*******))))))))******))))))((((&&&&%%&&%%%%$$%%%%%%%%%%%%&&''''))))*****,,,,,//.//111111134443455555555556655554445554334443333222233211110/..-.-,,+**)((((('&&%%%$%%%%%%&'(+/:BGHC=FNOPNJJEB?=<:69Mhi]XVTUY]ciV2!$,`vccbg1"*,0321378<8=iqjhjhiolfgjjgjnn[B9:?DI;3442016?PI30////276769<<9853/++,,--/159:;==>@@@@>?A@??=>>@?AACDDDDEHJJIHFDEECA@?@CDEFGFHGGJOX`fcVIO^en|‰Š‹Š…|pqz}~}yyzzz|€wtqonlnyˆ’†~~€ƒ„ƒ‚€~{xriea[WW]isuwwz}„…ˆŒŽŽŽ‰‚xpgc``abccccdfffa]]hhhkru€•ž›u<BEFIGFGDCDECCBEWƒ¥´»½½¾¾¾¾¾¾¾¾¾¾¾¾¾º¶²®©¢™–‘ˆ„‚~}{~…~{{zz{zxwvw}wgefgejlopsuy{{}|‡‡…Š’””’‹‹‹‹’”––‘Œ‰‰‰‰ˆ†‡‡ŠŒ‹‰ƒ€ƒ‡‰Œ‘“‘@@AA@@??=>><::998744343322110/..++,+,++)))******++****++++++******('(('&&&&&&&&&&&%%%&&&%%%%%%&&&&&&''')******++,---.///0011202224445566666655555555555545543333333333222122111000..----,+**)))((('&&%%%&%$$$$$%$&&*.8ELPIDGRTVRMIDA><<992.8VebWUSVX\^ggK+'craeh]'*,27=CKLI@IjsmjmiipnfhiikngZL;9:=?@;642200467;71/11/037:97:@A=:53/++,----/2669;;<?=;;:;=><;;=>>??@ACCBADFFGGFDCBB@?@?@BCCDDEEEFEGJQUQJEGWfs~ˆˆˆ‡ƒympw{}{zyyyz|€„~wqqoor}‹“Œ…€z{z~ƒ…ƒ‚~|}}}|uqmida`cbisvww{|ƒ„†ˆ‹ŽŽŽŠ‚ypebbcdccccccfdcc]^ijjmrstŒ›˜r>AEDECCEDDDEDBDKm™®¶º½¾¾¾¾¾¾¾¾¾¾¾¾¾¾º¸µ®« •‘ŽŒŠ…ƒ~zy~~{zzzyxxwvu|zhehgdejnnqtvy|}|ˆ††Ž’‘“ŽŒŒ‹‹ŒŒ“–”‘Œˆ‹‹Œ‹‡ˆŠ‹‰…„††‡‰‹‘‘”““@@@@????<<;:99887666533322110/..,+++++*)))******++****++++++****))*((('&&&&&&&&&&&&&&&&&%%%%&&'''''''()*))++++,,,--..//0001111222344556666665555555555553454333333333322122211100/.--,-,++*))(((('&&&%$$&&$$%&$#$$&)-8EOTRMKSXVSOKGC?;:732/.,=XgaYTSVX[`gbB&$^oaeeV:85=@ILQXcrrlmljkppjiklojSEFGHCABA>84420//36763.-.11149=;7;BD@=71/+,,----/14678:;=:889<<<;;;:::===>?ABCCDDEDCA@@@AA??@@AABBBBDCDDCDEFDEEShuƒ‡†‡…€tmqxxzzzyyyz{|‰ŒxurqqwŒ’‹…€{zy{~‚„ƒ‚~ywxzyzwxpnlmmlhmtwwx{}‚…††‡ˆ‹Š‡unjfbfeddcccccdb`_floljpxyŽ“oCBGDEDACDDDEDBCW…¦³·¼¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½¹¸²« ™•–•”‘ŽŠ…~vuyyyzzyxwwuvyzgeedefiklnrvy}}|„ˆ†ˆ“’‘‘ŒŒ‹‹ŒŒ‘’‘ŒˆˆŠ‘––’Ž‹Š‹ŠˆŒ’’’‘’‘“‘‘’’????>>==>;;;9788767643321100.-..++++*+++********++****,,,,,,,,+**,+(**((&&''''''''''''((''&%&'''(()))))***+,,,....../0/00010022223445555666655665566554444443333332122221101000/..--,,+++*))((('''&&&%$$$&$#####$#$&+6ALVZVQSXYXTNKHD?<8310./,,Dah^VTTTX_chcE,^i]chP+7<ET]djosjjlmmppllmmgP<BMQOHILIA:5432.-055540/,+253389989@DCB<51---,,.//134468898777;::98989::9;=<=@ABDABBB@?@@>>????@@AAAAABBBCCCBBBETiv€‚‚{oiovvwxxxyzuuv‡’€yvtrx‚ŒŠƒ{xxx|‚„…ƒxpptwuwvusrsutqlktwxx{…†…†‡ˆˆ…}uspkfcefffdccbc`[]cgkqnoru{‰ˆpFCCEEEBABCDEFCJj—¬µ»¼¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾½»¹³¨£¢  ¡œ–“Œvuwxyzzywwwvxz}heecfdghknrvy}{}…††‰”“’ŽŒŒ‹‹‹’‘ŽŒŠˆˆ‹–›š—•‘Ž‘“•–”““’’’‘‘’‘’<<<<<<;;<9888755656532211100.---++++************++***+,,,,,,,,,,+**)((((''''''''''''''((''''''''(()))))*+++,,,.../../0000010022223445555666655665566554444443333332122111100000/.--,,++***)(('''''&%%%$$$$$$#####$$%)0:FQYXQQXYXXSOLHD?;752/.-/*1HeiYSSVXY\dibVjqcdbJ8K_eggntlhjlmppkml]=-5I[]TOMEGG=74230/,0:=621.--03668::89>AEB@93/--,,-.0222455567778989:988888889;;=?@ABBBB?>??>>>>>>?@@AAA???@AAB@BAJ[ky{{|}yrkipttvwwwyxrgl€“zxvsy‚ŒŽˆƒ|yyy|ƒ…†„xoimmopsvvuuwvutpmrwz{„……††‡‡„ytpnijgffecccca]Z]cgmuuuomp†ˆpLDDDEDACCCDDEFV€£²¸»½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¼»¸¶µ±ª¦£›”Žƒzuwxyzzywwwwwz}hedcdeghimqtz|{}„…†‰“”“’ŽŽŒŒ‹‹‹ŠŠˆˆ‹˜œ™˜–•–––———•”““““’’’‘Œ<<;;;;::998876776655211100..-,++**************++**++--,,------,,,+****))((('''((((((((((((''(((())))))*+,,+,----..////00011102222344445556665555555555444444333311110000000////.--,-,++***))(('''&&%$#$$##"#""""###$&-6CMSTPNUZ[[YTMIGB?<732/+,,,+3Ui_ZWWWYYZbjqutponligeblrjhgjnqrnj\>")3G]_ZRMB8EE;5220/./7HL<31//..3789;867<BFCA<71/-,,-/1324435555666668777799887788;=>?@@???>?>=<====>?@AAA@@>>>@@?BIWcrzwvzyqj^blqsuuvwwwqcWn˜‚}yx{„Œ‹†‚}zz{|€„…ˆ‡ƒ|sb_dghlnpsuxxvtstttuz~ƒ„………‡‡‡ƒ{wxusoigfedcbb_^Z^fmtwvupliv†pQGFFFDCBCDEEAJd’ª´¹½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾»°«¦Ž„zuwyzyyywwwvwz}lccdddfhjmrs{z|~…††‹“–’‘ŽŒ‹‹‹‘Ž‹ŠŠ‹Ž”—œššš˜š™™—˜—–•”““”••’“‡::::;;::99776666554431110/..-,++,,************++**++----......,,++++++)))((((())))))))))))))(((())))))*+,,,,------////000111022223444455566655555555555444443333111100000////....-,+++***))(('''&&%%$$####""!!""""!#$)3>GLIFIOY\^]XQNLGC?:74/+*)+(*+<Ye_UZUVWZaefjjjgefb`jspihkntwo\8'-6/Ifg`]WO76JC851///..2:9421.0111567;857=BEEC=82.+,,-/024543444445554566779988777788;<==??>===<<====>?AAAA??>?>>?AIT_mwvtvupeXOUafkoqtuywn[;2m–‹}{~„Œ‹†‚}zz|‚†‡ˆ‡†‚xiYY]`dfglrvwwvvuutwz|‚ƒƒ„……†ƒ~zyzuromgddcb__^]ajsywvupmko~YDGFEBBBCDEEANs›¬¶¹¼½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½¾¾¾¾½µ¬ xnpsuwwyyyywwwvwz}kccbddfhjmqtz||~„…‡““’‘ŽŒ‹‹‹Ž‘‹Š‹Ž’“•–šš›™ššš™™˜—–••““’‘‘ŽŠ…€{99:::9::8888666644442011/..--,++****)))***+++,,+++,,--........-,+,+*++))**)))))()'((((((**))))(((()*++++,,--..--..//0000001101222233334555666655554455333444222211110.//00//--...-,++**)))((''&&&%%$#"##""""!!!!!!""#'09CEA?BMWZ__^WUPKGC?90('('&&&'#*C[_YWSRUWY\`bccdcclwqiglptyh?!#((9Neidcc[L42A9420//.,-/1/011/15412579888=EGFD@;50,++../1344433333344456677667755557788:;>>=<<<<<<==<?@@@AA@@><==AES_isvrrqldUB>FPX\bgmstthYVLfŽ†€‚‡ŒŠ†‚~~}„‡ˆ‰‡‰ˆq_QSUZ]`fjrttuuwvvyyz}‚„„„„ƒƒ~||zuupkhfda_][\eipsussnjigr|cGFFFDBCCDCDBR~ ­¶º½½¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½¾¾¾¾½µ¥Žscdeinsxyzzyxwvwwy~ncbbdfegjlou{|}‚…ˆ•”“ŽŒ‹‰‰Ž‹Š‹Ž’•—™™šœ›šš™šš˜˜––”’’Œˆ…€yumd99::99998888655532222000...--,++))++**)*+++++,,+,,,,---........,--,+,,+*++***)))*(**))))**))**))))*+++++,,--..--..//0000001112332222333455444455554444333444222211110.//....----++++**)))((''&&&%%$$##""!!!!!!!!!!""#'-8BGD>BHPW]`_^\ZTNKE?.'&&%((('&$$(@]bTOTWWZ^_acedluspkorvxe;%&(&'=]iiec_UI,+86310/.-*+,./00002672236::89>BDEEA<61,++...0133333222244444456466655555677:;<==9::;;;<=<?@?@??C@>==?GRZgrtqtrkcU>029?DIQZ`fmnh_ehr‚‘‹„‚‚ŠŽŠ†„‚€€„‡ˆˆŠˆˆŠ…zmVMOPTW]dkpqsttvwxyz|}}~€€‚„„„‚}|yttnjgc`^^\ajpppqqqmihfiroPLJJEBBBBABEU…£°·»½½¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾½¼¼¼¾½¼¹©ˆhY_dehhkqxyyyywvvvy~sfccgiijlnqv|}~€‚…‰Ž’‘’ŽŒ‹‰‰Ž‹ŠŠŽ‘”˜™›››™™˜˜–————–•“‰ƒ~ztldYQP8899997788875555322220/....--,++++++***++++++,----............--..-+,,,++++*))****))****+)***+*(*++,++++,,--..--..//0000/1111222223322333345445555334433453222220011/././....-,,,++**))((((&&&%%&%$##"""!!!!!!!!! !"#&+4AFFDGIOUZ_bca_\WSM>.))%$$$&(*((($*G]]UY]`acchhmsplkmqswkN4,+&'*C^ibWRYSJ-(76000/--*,0/11121389757:<><;;@CEEB?;50,+,,-.0112332200223344444444554234679;<;978888:;<>==??BBBA?<>CP[fqussng_R@2//0369@FOW_b`[^V]tŽ†„„‡‹‰……„„„„„†‡ˆˆ‰ˆˆˆŠ†ylVJHJLR[gnnoprtwyxx{}~~~€ƒ‚ƒ€~{xvrnjd`^[]ehjmpqonligddfkWTPICBABBBAEX‡¤°¶º¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¾½¼»ºº½½»·­…\PW]`dghijrwxxxvvwx|€yqprssssttw}~‚†Š‘’‘ŽŒŒ‹ŠŠ‹Š‹“—˜˜š™š™˜•”’‘‘ŽŒˆ€wpg`XNGDHN8888887788755555322220/....--,++++++***++++++,----......//////....-.,,,,,+++**++++**++**+,***+++*++,++++,,--..--..//000000111222223322333333443333554433330002220000../....---,+++**))(')&'&&%%%$$##""!!       !!  !#&+4?HJJKNPSZ_eeffb^XM4)+(&$%'&&+-..+&%*:KWgljkmnkurmmosuwlSI52<=12LcdZSLMMG0%65/00.---/201212369=;988;<==>@?@B@?=92.,,,-.0112332210113344443333444233568:;989888879:;;;<=@ABA?=@NYcopqsoh\N<.-,-/00047:CINPWYRZi‹†……‡ˆ†…ƒƒ‚‚ƒƒ†‡ŠŠŠ‰ˆ‡‰Š‡~o[HDEHQcikkmprxywwy{{{|}}~~‚ƒ‚}{yurnje[PT\efgnonnligddb`XRPFDBBAAABDXˆ¥±·¹¼¾½¾¾¾¾¾¾¾¾¾¾¾¾¾¼º¸·»»½¹±•\EPY\^bfgihltxyyzz|‚…‚‚‚‚€~~~~€‚‚†ŒŽ‘ŒŒ‹ŠŠŒŒ’–——˜˜™™—•“ŒŠˆ†„ysg_VNEEFJLPS88777777765555553222200///.--,,,,,++++*,,,,,,,..--//....00////......--..,,,,+++*++++****,,++++,,**,,,,+-,,--..--..//000000011112222222343333333333333333320.0111000/......--,,+++**))(&&''&&%%$$$##""!!!  !!  !!  !"%+3=EILOQQT[`fkjfdc[H1,/,()))')*,,-/.01128AQX`cfrroortuteQPO;;HOJO[`XURKKOF1$3500/-.-16855324469?>=;;<@@BA><?B@@=;4/----/1122222222222244321122332121156775677777888899::<=?@=@HWanqqrog\P>0.-,--//011248<BHIKPXj~|y|~€€€‚††‡‰‰Š‹‰‡†‰‹Œ‰s\HBCJ[cffhmryywwyzzzzz{|~~~{zwusole_ahd_dmoonlhfbaa_[NNHFCBBBB>DY‰¦°·¹»½½¾¾¾¾¾¾¾¾¾¾¾¾¼»¹¶µ·º»¹­‚FEOV\^`ddgiiow{{|…‡‡ŠŠ‹‹ŠŠ‰‡†„„††…„ƒƒ‡ŒŽ‘ŽŒŒŒŒŠ‰‹‘”•—–•–——–”Ž‰…}xuqncVLFBA@CHMMPT77777768765555553222200///.---,,,,++*)*,++,,--....--..//00////..----....----,+++,,**++++,,++++,,,,,,,,+--,--..--..//00000001110122222233333333332233333333210011//......----++++))))(''&'&&%%$$$##""!!    !!  !!  !#(.6>EIKPSTW_djnliebV>.-,***--(**,,,**-.0110..((drllkhim`ILNPDCNRQY^ZY][UUTR<'/6830.--17=<:63335;@AACA?@BBA<:<>==<:51.---/11112222222222331111113321//112443345555667799::<=>?>FP]krnolf\N=0.,,,,-////00101359;>AK`f`dhkpqsvz}ƒ……‡‰‰‹‰‰†„‡ŠŒŒ„vcG?HWcfdekpzyvwyz{yxxxz{|}~}|€|zvsrooplknkkoooljhfbab`\KLOGCBBBBABV„£®¶¹¼½¾¾¾¾¾¾¾¾¾¾¾¾¾¼º¸³¯µ»»·§pHLQY\^bdgjjjms{„‡‹ŽŽ‹ˆ‡‡‡‡††…„ˆŒŽŽŽŽŒŒŒŒŠ‰‹‘“”“•““”“ŽŒ†uld`ZOE@<=>A@CHLNOR77777777665544333222201000/...-,------............11110000000000--..-.0...--..----,,,,,,,,--,,,,,,,,--,.....-...000000000.11110022221111345433222222221111110.00--------,,+,++****))((((&%&%%%$$##! !!           "$*08@EHKPSVZbfkonie^O0*)))**-1,,,,--*%#$',0016.Zvjjkolh\UJIJIEKROX]a`aaZX_^ZK/)4A@5.-0:ACB<64469;?CDEHDBABC<78999:8840--,.00111122112222221000002211//01001122444466668989;===@JVdnlnje[M;3/,+,,--..//00//00221236@EEIMSU[achotyz€†…ˆ‰†„……‡Š‡yeIGVdeacisyyvvyyzywtqvwz|}}}~}}{yvsrnnoonmlmnjggebaab]OKSPDBDCBCDRw›®¶º¼½¼½½½¾¾¾¾¾¾¿¿¼»»µ«­´¸·®šo_cdddgjjkmnnry}…‡‰‘‘ŽŒ‹†‡†……†„…‰‹Œ‹‹Œ‹ŠŒŽŒ‘‘“Œ‰…€vkaUME>98:;<>@@DFILLL77777777665544333222201000/.....------....,,...../11110000000000/...-.0.......----,,,,,,,,--,,,,,,------....-...000000000.//00//11111111233133222222221111111/00....----,,+,+**)**))((((''%%$$$###!!!!          !$',4=CFGHKQUZafhlkieZB-(*++**((++++,,,'#"%%),2;Zulikjke[MLEGE95JPQW`_[__ZZ[_VS:+/DM9//3@DEE@99:88<>?BDHID??::7555589983.-,.00111122112200000000000011///1001111233444566879899:ANYhmmje\N>520.+,,--..//00//00221220/04468<@GHNV\diouy}€‚‚ƒƒ„‡‹Œ‡|hSX_dbdowxwvvyywvpnnotwz{}}~~~}|zyvtrqqpnnmljfdbaa`a`VMMPHCCCCBDKo—¬¶¹¼½¼¼¼¼½½½½¼¼»»¸·±­¦¦«¯®¤—€xzwwvvwwwvyy}}€ƒ…ˆ‹‘’‘’’‘‘ŽŒ‰‡†…„„„„„ˆŒŒŒŒŒŒ‹‹Œ‹‰ŠŒŒŽ’‘ŽŽŒ†…}xngZOE>;:7879<=?@ADFGJJJ77777766665544333222310/00/...----..-------/..//0000000000111100000000//00////..------,,,,,,----....../-..--..//00//////////00//00001122211212222211100000000000//..----,+++**)))))('''''&%$$#""!!""!!        !#)/6>EFFFINUY`ehjiigW7.-,-)**))((((*++)(''%&*(IpjjfgecPAKMIDB@@FNXbd\Zb_WQR\YOD:36=2./08?EFB;>@:889:;?HKF?:75654467;;852/--//0011112222////0000////00//./0011112222123466777759CP^hjhf]P?6421.,,,,,./....//00110222000/0//0026<CIOU\bjnrvx{}~ƒˆŠ€qeabfnvwxvuuutrmhggjmswyz|~~}~~|ywuvstrppomifdda___a[KIJLIECD@AGm•©²¹ºº¼¼ºº¹¸µ³±°®«¨¦£¡Ÿ ¤£ ™”‹ŠŠˆˆ†……„ƒ‚€‚‚……‡‰‹Ž‘’’’’‘ŽŒ‰‡‡ƒ‚‚ƒƒƒ†‰‰‹‹ŒŒŒŒŒ‹Š‰ŠŒŠŒ‹‹…€{vqiaZMC=<===<:989<???CDDDDDD77777766666554333222310/000///..--..-------/00//0000000000110000000000//00////..------,,,,,,,,--....../.......////////////0000//0000112221021122111110000000////....----+++**))))))(''''&&$$##""!!""!!        !&)/6>DGGHGKPX]`ddeebI-++)+'))))(((((***))'&&'>hfgfgdcN@DMML><JNIW_c__`d`TTZ]aOGB;48879114<CCBB?:99778;FLME=74435567:<><830-//00001122220///////////..//./0011111101111233444448DQ^ggd_UC54410/-,,,,--,,..../011022211100.-..,../37<@GMSY^dhlpsx€…ˆ‡€sghqy|{xwwvqlgd\TV`gmrwxz}~}~}|}{yxvutsrqomjfba___`]PHJIHDACCGQj£­°±±±±­¬ª©§¤¤¡Ÿžœ›šœœšš™˜•’‘‘ŽŒŠˆ†„ƒ…„ƒ……‡‰‹Ž‘’’’’‘Šˆ‡ƒ‚‚‚‚‚…ˆˆ‰ŠŒŒŒŒ‰ˆ‰†‡‡…‚‚}ypjcZOGB;9;;;<==<<:9:=?A@CDDCCAA887766776666553332222210110/////------........////000000111100000000//////////..------,,----,+--......./////................////00001122221121110000//000///..--....---,++*****)))('''(&%$$#$##"""!!!!      #%)/6?FHHHHKOTY[^_b`W9'*)'((((()(((()+++*(),$Cl`bbdceP;B<:KG>=EDSda]]ab_c^ab`bTHDHVJ>BG9,05;?BGB:766336AJMGB:53355679>?A>:51..//0011235510////00..////////0000000000000011222238CQ^cb`XJ;4430///-,,,,,,,--//0111111121000/.-----..--.13;?DHLRW^dipuwwrlmsxwwyvspja]XMHQZ]dmrrw}~~~~~}~}|{ywvutusplhfa_``__[NLJEEHPV^jv ¤¦¦¦¤£  Ÿžœ››™—–˜˜˜˜˜˜——––•“’’ŽŒŠˆ†ƒ„‚ƒ††‡‰Ž’““’’‘ŽŠ‡ƒ‚‚‚‚„††ˆˆ‰‰ŠŠ‡~|zvrnia\ULF>;:9:89;<<==<<;:<>>BBABC@@@?777777776666553332222210000/////------......//////000000111100000000000000////..------,,--------.......///////..............////00001111221111110000//000///..--..--,,,*+*,+**))))''''&%$$####""""!!       !#%)/4<BGHIIIPUVWZYZWF-''''((((((((((++,,,)&&=md[[afhS>@;76@F=556Pcccddda_`debcXLDGJA;@A:1.028ADE?634012:BEFB;7445579;=?AA>:51/0011112344420/////...////////////0////00////////16AMZa]ZRE9121////..,,,,,,--//0111111121120/..-,-----./../0036:>DIMSV[^^^afjklljgd]UQMMOIEQ^fjmpu{€||||}}{yyvvttqmjhecaa```TLNQX_ks|‚”›žžŸŸœ›œ›™™™˜™˜——–––••”““‘ŽŽŒ‹ŠŠ‰‡†ƒƒ‚‚‚ƒƒ„‡‰Ž’’’’‘Šˆ…ƒ‚‚‚‚‚„„†‡‡‡„‚}wmfdaYQKHA<;;;;;:;<<;<<==<<:;<=??BBBB@@?@776678776655442211223310////////--....//..////..00000011111111111111111100////....--------------....////////................/////0//0000221111000000//00/....-..--,,++++++**)(*(''''&&%$###"#""!!!!     !"%()-3;ADFHJLORSUUSM?4)''''))(((())))++-++)*0ll`_adfV8AD<239@DBKEI_baffbc_cddgeguK@>?=>@A90/.7EED@821.-/29@BB?;6543368:<?BB?:62011001234452200//..../......--..////////......../3>IW[VSLA70///...--,,,,,-.../1000001111100/.-.-,---..0..//0/00/1568<>ACEHMPTVVXUSNECCFKF?DR[aflov}€||}||}|{yxwwsqomjgebcacb\_kq{ƒŠ’˜›››œœ›››››™™˜—••••””’ŽŽ‹‹‹‰ˆ†…‚€‚‚…‡‡‹ŒŽ‘’’‘ŽŒŠ†„ƒ‚‚‚ƒ„…‚ƒ‚wl_UJE@?A?B@:<<;<;<<<<<<=<<=:9<<==?BCCB@BD776678776655443322223100//00////......////////..00000011111111111111111100////....--------------....////////................/////0//0000111111000000//00/....-,,,,+++++++***((*'''''&%%$#"""""""!!!      "#&),04<ADFGJLNPRRSOG7-'''('))(((())))++*,+(,ekhhfcgW7AHG8-/7:=>D?Peegjecddb_aebfdGBBDEEEE>3/.279AE>3/.-./29>A?976645578;>@@@>:611100123444422210/....--....----.................1<FSVRNI@6-,,,-..--,,,,,-.../10////0011100/.-..--.//.0///000////./0../10468=>?BAA>;;;>BB>?ENSZbenu}~}}|}~|{yxyyvtqonkjgilrvx|‚‹’–š™šœœœ›››››››š™™šš˜—””””””Œ‰‰ˆŠŽŽŒŠˆ‡„‚€€€€~‚„ˆŠ‹Œ‘‘Ž‹‡…„‚ƒ„„€zri^TJC?@@?BA=<<;<<<<;=<<<;;;<;<<==@CDDEEFF66776866775554332222210/..///////0////....////////0000111111111111111111//.////...--,,-------------.00//////..........------....///////////000000000/////....-,,,,++++++**)())((''&&&%%%$##""!""!!!!     !$&+.27?BHIIJLNOPQQMH:,'&&&'()((((**))*))*,-]legdbfV,<FRQJ=337;55:Rfqnme^abc_]af[ROKKJHJIHB80/125@GD:1-----16<;;755544568==>?@=97321011244554444410...--...-------..//..--..----,09BMUPLF?5-,,,,,,,,,,++,-...///00000011110///......////0000000000........./0/001111367:;;==AGKPW_hry~€}|}~}|{{{zvvtsqonotz‚ˆ•——™™››››››š››ššš˜š—˜——˜˜–‹’’’‘‰…ƒ…’”””•”“’ŽŒˆ†ƒ€€}†ˆŠŒŽŽŽ‹Š†„ƒƒ‚ƒ‚‚~{tmia\PB@@?B@><<<==;;;;;;<;<:<=???@BEFFGGHG77776866776554332222210/////////-/////....////////0000111111111111111110///./.....--,,-------------.00//////..........------....///////////000000000/////....-,,,,++++++**('))((''&&%%%$$##""!""!!!!    !"#&(,039AFIIIJLNOPPNID4('&&&'((((')))*(((()-[ndge`h[-2>GTYXQF8:<98?^ltrlhje^`aaff\SROLNONLLH?3/237=CF?4/---,-/477765554679<=>@A?<9621011234555577522///.-...-------......--..-----.7AJROJF?5-******++++++,-...///00000011110000////..////0000000000..--........../////13366778;<?ENYcnw}€~€~}|zy{{zywuvw†Š“–˜——™™š››››™˜˜˜–”’Ž‹‰‰ˆˆ‰Š‹„€†‹Ž‰rrz‚’™››››š–“‹ˆ„‚€€€~‚…‡ˆ‰ŠŠŠ‹‹‰ˆˆ…ƒƒ‚ƒ‚‚‚|xsoh`QB=<><;;<<<<;;;;;;;=>??@BBBCEGGGHHHG88777766665544322222211000///000//////..////....////0001111111110/./1100///.--.,--,,,,----,,,,,,....////////........--...--.........///.//000000000000///....---,,++,,+**)''''(('&&%%%$$#""!"!!!  ""       #%(),15<CIJIHIJKNMLLE?.'&%&'((('')()(((()*(Qmcedac]./7=FPWXYM729:?<\trrpcYa^[`fhe]WSQQRQPNLJC933/18=CA81-**+*,.135445678879<>@A>=:7520/1213455689643100.-...,,,,,++,,-----,,,----,,5@FQNIE@7.(())))****,,--..--..////0000111000//////////00000000000/...-..--.../////0001222344556;IWcmx„€}€~zyxz{{{{|€‡‹Ž’“•••–—™™šš™š˜”‘Š†|uolhffkmpqs{‚„‚thnz‹˜Ÿž ž  š™”‘Œ‰…€|z{{}€…†ˆ‰ˆˆ‰‰‰‰††ƒ‚ƒƒ‚‚€€€€€}wsh]M@?<;::;;<<;;:;;;>@@AABCDFFFHGGGFFF6677996666554432222221100////010//////..//////....//0000111111110/./00//.-..---,--,,,-----,,,,,,....////..///.....------.--.............//000000000000///....---,,+++++*)'''''&&&&&%%$$$#""!"!!!  !!    !#%(++.37>EJJHEDFGIKJGC;+&&&''())'')('((()+%Oibde`ea0,38=GNUYXP4/9AEHlttto`X`[Z_chg`YVTTQPPQPLGA:53127=@:2,***)**-012357888779<>??>=:752112133467876542000/..-,,,,,++++,,,,-,,,++,,--1<ENMHE@94*())))**))+++,++--..////00001111110/////////00000000000/....--..///000//00011223443333:GVblv}}~~{vsvz~‚‡Š””“•––——•’‹…wpic[UPMHHMQ`]_dnsqlgs…–Ÿ£¢¡¡¡¡Ÿ›‘Œ‡„}ytrssx{~€‚ƒ†‡……††††ƒƒƒ‚€€€€~~~~‚ƒ‚yqj]L@===<;;:<<<;<>>ACCDDEFGGGGGFFEEEE7777666655554432222210000000//0///////-///////...../0000111111000///.......-------,,,,,,+,,,,,,,--..////00////....,.....----..........,-..//////0000/////....---,,++++*(((''''%%&&%%$$$##""!!!!!        %'*+,049@FIIHEBBFGGFE?5)&&&''((((''(()****Tm`bea`c1*566=DIPWXT>==><KlpstUV`cabeeegc]YXWSPPQQMLF>81/138<<3,+*)))*,/13589:9:7778:>@AA@=:642012334567535422110..---,,++++++,,++,,++**)).8>FKGDA:5.''(''&((())))()++--./../0010001221111//////////00//11//..--.......///1/00/1112344442249CS`ksyƒ€}|wqotx}ƒƒ…†ˆ‰‰ŽŽŽŽŒ†~woh`XSNLFCDDDEM]XROTZ_gn”ž ŸŸžŸž›–‘Œ†€|toiddeimsw|~€„„„„„ƒ‚‚‚€}~~~}~~€„€~zrgZF><;;<<><>>?ABCEFGGFFFFFFFFEEECCD6677776655554432220000000000///.//////-///0000......///001////00////.....---,,,++++++++++,,,,,,,--..////00////.....-....----........,,-...//////0000/////....---,,++**)(((''''&%&%%%$$###""!!!!!       "$',-/39<@FIIGB??BEFEA=/(&&&&&''''''())*+._kaab_dd5&29;>>BJOPPI>;<ACTmqrne[Ycaekmkhe^][YVRPSROMJE=30/24993,+*))))+.01489:;<97779=@BBA=::6520013345655555432110/////--,+++,,,,,,++**)),2:@HHC@<6/('''''''())))()**++,--.../100001111110/////////00//00//..---------.112311111123555522247CQ^ipz€€€}|zvpoquy}€€‚‚€}}}~{ri\TLIIKLONLJHHIKQQOKIKT_o†’’““’’Œˆ{sme`\YVVX[beipsv{~€€€~~|{{|}}||~~€ƒ|wodWF===@AA?@@ACFGFFGGGGFFFFFFEEEFCC6666665544554432210000////000010//////.---............//////////..--------,,,+++++++**,,++,,,,,,--....////////....-,-...----........---/...///////////../...-,,,,,++)))(''''''&&%%%$$####""!! !!   "$%),.27;@CHHGFA>>BCECB:,'%%&&''((()')(*)3el^`_]`j?"/4:<@B@CHJJ?8;A@<Zqqsomi]eghlppida^^\WSPQPONKGC:3005473.+*))((*,-045789:86777:=ABB><;:752111224567797553442213330/.,,,----++**+)))*-6<DJA?:51*'&'''%%''&%&''(****+++./..001111221110//....////00..00-----------04455322012456766333347?NZeov|€€~{zxunkloux{||zzyxtsqnmlg^VNJJIIKMLNNJGGHJLKHFGKNZm{}|{}yzvqjb[UMGDBEGOUY^_deilqtyxy}~}|{{{zz{{|}||{|}€|tkbUI@AABCCDEEFFFGGGGFGHHGGFFFFFFGG6666665544555422210000////000010//////.---............/////////...------,,,,+++*****++,,++,,,,,,--..//////////...-----------........---....//////////////...-,,,,,++)))(''''''&&%%$$$##"#""!!        !#%(+/38<BEGIHFCA>>ABDB?7)'%%&&''((((**+':ki^__]boG -238:DGKFEHG=>Qd[DOjlmgjiegkmpqnief`\ZWTQOMLLKGF>7114363.-+))(()*+-13379:766677:=>>><<;975211123435579:76753333330/....--,,++*****)(+19@FC>:53.(''''%%%%%&%%%&')))*)*,,-..011112222210/....////..//..----------.156884320235677883333246?JYcmux~€}{yvrmjkorv{||zxwusqniida\XRPNKKKKJIFCCDFECCB@ADOZ[YYYYYVQNFA=98779?EJRV\___aceimpqvz}~|{zzzz{{{|||{{|~€yskaWKCDEEEDDEEEEEEFFEFFFFFFFEEGFGE6654556644333322102211000///////000.......-.//..----/.........----,,------,,+*******))*+,,,,----+,--..//00..........--,-----------..............///...///.------++++)))(''&&&&&&$$%%$#$$#"!!     #$(+-18<DGJLLJGB?ABCEFB=2&('&&&''''(')))Gog`[^abjU!.:<==;EGXOLJHB=EOWWXdjhgiiabiqrojchhd_]ZVTQLIKIFDA:614675/,,++))))*,-015988855569:;<>===;97543002222568997995442101100///.++-*****))()-5;@C>;73/,)%$&&%%%$%%%%%&''''()**,---./012322220000.0///.--..--,,,,,,**--/1468534422345896666521134=IV`irv}€~zyvrljfkotx|{}{zzwusqmie_[XTQMLJGEB@?=@>><<;;==?????><<9:::89::9:<BHMSX[^`^]_^behlpux}~|yyyxxzz{y{{|{||~|ytldZMFFDFFEECCCCCEEEEDEEFGFHHGFHF4433332233323311211100///.......//......-.--..--,,,,,---/-----,,,,,,----++,,+*))))***)*+,,,,,,,,+,--..////..........--,-----------------......//....//....------+*++)))(''&&&&&&%%%%$#$$""!!      "%*,.29AFKPOLJGDBABEFIF<,('&&&&((')%(')Vlc_\bhglS2JLLNSUJGJNKIA<D@BGQ^aeghji_gjnplbejgbac^WTPLHGFEDB=834675/++++****))++0269995534457:=>>>=;97532111333335888876421/0000000/.-,,**))))())-6;@>:641.*&$&&$$%$%%%%%&''''''))++,,../02222221111////..------,,--,+,,,-/11344123434456866666411344<FR[eov{}€}ywtrkdgjlquy{{||{yxwtrokgc`\WVTQNJFA<:88887677::::9;;;<=>><9;;99;?EJOS[^`_`_\ZY[`ejqvz{{yyxxzz|{y{{||||}~}ytmc[NEFFEDCDCBBBCCCCDEFGGIIHHFGF54224322322211110000////////......//..----++,--,+-,,,,,,-+***+++,,++,,,,++++++**)))))))*++++++++,,,,..----..........---------------,------....//--...0--------,,+*****('''&&&&&&&&%$####""""  !"%()-/4;AHMPPLIFEB@BBDJG8**'$$&('''&'$7fmc]_chhlZ&+CKJNMOTSKING@9NaVZWR]dilkkqnlnpob_eggebb_WSPLHCBACB?:30254.,,++++,,+**+-/3578652113688;<=>>>>;955312331024425775422001123431/--***))))(((18;=:6640.+)%%%%%%%%&&&&&&&&''(()***,,-.01000011111/00////.-,,,+**+*+++-.0111112333223455566766644559ANYbkqx~}xurniefgjmqvy{{{zzzxxvtpligfca]XSMIFDA>::6777677899<<==<<=<:9889<@FJPUZ]```][USTZ]dhpv{{zzxyyy{{{|}|}{{|}}|xtkb[OEDEDCCBAAACCCDEFFHHJJIHFFD33222222221110010000//......----....--,,,,++*,,+,++++++++++++,,,++**++++********)))))))*++,,++++,,,,..--,-..........----------------..----......--....--------,,,+****('''&&&&&&&&%$$$$#""      "#&)),.28>DGJKKIFEBCBCBFB0(+'&'&'''(*%@pmbb`ffhoL#*0EQJGF@BLQFKJ?<FT[dWVcinonlopklpeW_jjhica_XRRMIDA>>=<93/011,++++++,,+,+,,/.3565531/057789;<>@@?=:76334300011114445332222234320--,**)))(&&'*38:<865430,*(&%%%%%%%%%&&&&&&''()**,,-//0000011111000////.-,,++++**+++,-...../01221233355666555334437?KT]emty~|vrpnlgbegjoux{{zzzzyywtrnlkkihd`[XUPMHFA;877666777::;;;;::887779<BGLQW[]__][WQMMTY`gptwzzwwxyyzzy{|||{zy{}}xribYNEDCCCABAACCDEFFJKJJJIGFED1132222211111/.//........-------,.,,++*,+++,+++*****++**++++**,,*)****++****(******+*)****++,,,,,,++------......--..--------------,,------.......-..-,--------,,++++))((''&&&&&&&&%$$$###"""   #$'*,-.26;@BFIJIGGDAAA@?8-*,('%''&(''<pkddegjlh=+/3?ZLCFG<PRNKIGFLQ_f`X_gmoonpqopof_ejhgiffa]XRNGB=;:;:74110-,++**)*,+--,*,./01345420037589::<>A@?<:8697531//.//122444433355431/.-,,*)(*)'%''-2499856720-+'%%%%$$$$$%%%%&$%%'(**,,........---/0000..0..-,,++++++**++,,,,----01111233444433332232126:BNWbjqx{zurmmkfbbekqtvzxyzyxxvttolmmmljiggb^ZVQLE?986656777789::998866569>BFMSX\^^^]YUNIHJS[ckqwz{xuvvwxwwyz{}}z{{{zvpi`XPFDCB@@ABCDDDGHHJLKJHGECA1110111100/.//-..-------,+++,,,,-,++++*+)*++***)))******++**))++))**))))))))()((''(**)****++,,,,++++,,------------..--------------,,--,,,,--,,,,.,-.-,------,,,,++++))((''''&&&&&&&%%%$$#"""  !$%)*,-.16;?CEGJJIHEBBA@9.*++('()(((*>kmfcfkmog5&.10=XXKNKJLMRSNDFFPQhieafltolknnknl`bdffefghf_ZVRJB=;:866:;83/-,*(()**,-./...../124642223568999<??>=><:;9753221/0132334433344321/.-,,+*)))('&&),15::997661/,'$%$$$$##$$$$$$&&'(**,,--......---/.....///.---,,++++**++,,,,--..////0112222211112210/0235>JV^gotyyvrpmlhcaejlptwxyyxvsqomjiijjkjmmkie`ZSKD<87666667777776666555768>DINTZ\\^^]UQJFBGOXaiotxxxvttuvvuuy{{zxyyzxvqibYPECABBCDDEGHIJIKKJJHFCAB000000//0/////0.----+,,,,*,,,,,,,+**))*)())))))*))*)****++**))))(('(((('(()))((((((())********++++++,,,,,,,,,,------..--,,------,,++++**+++++++++++-----,,+*,,+,,,****(('''''%''&&&&%%$#$#""   "%(),+.147>BEFHIKJIHDDC?0*)*(&(*&)(*)dpgeejjoW*(0/4DV\LKHILKBIRKE?IY_YX[`jpskjjelnlg_aegc_afhe_]YUNGB=:879=D?51-+)((((+,--//..--.//3345521136779;<<<????>><9866533334444542300000.-..-,+*)))('&'(,27::;;9841.*$#####""""##$%$&()*,,,,-....--,,,---.././/....--,,,,++,,,,,,,,----..//01000000//11/.////15;FO\ckry{wtpmiheaagjoruwwtqqnkihfdddhjijljgd_YQH>987665566775544445555569?ELQWY[^_]ZSMIC@IPX`gntyywurrstrrruy{yyyz|xvpjd\SJAACDFEHJJJJIIKJIFFCA?////....//.././---,,+,,,,*,,++))(*))(()('((('())***)))))**))))))(('((((&''(('&'''''())**********++++,,,,,,,,,,--------,,,,------,,++++**+++++++++++++,,+,,+*,,++++****((''''&&''&&&&&&$#$#""   "&)*,.148>CEFIJKKJJIFFF9++**)'&&'((#TojijnpoO,43.-4CJNOQMSSSOLKDBGG[^UK\biqommjgmomifdba``_cfb^ZYVPKD?<<=<<B=53/)((((()+,//./.-----/2466321135689;;=??@@@@??=<;:998888755410....,.-..-,+*)))(''&'(-147:;97630,($####""""###$%'&'(*,,,-....--,,,-----////....--,,,,--,,,,,,,,----..///00000//..00....../128DNX`hpuzywoljgeb`agnqssuqomiedb`[\^`cfhihd_YPG>988665566775544445544568>CJNTZ\]_][WPJEDDJQZbhpswxvtrpqqqrruz{zyyz{zwsog_XMFECGHIJJJJIIIIIFDA=<....--...--,-.--,,))****+((((((('''''''''''(((''''(((())**(((())(((('&&&&&&&&&&&''&'))****++))))))+++++++,,*++,-,,,,+*++*,,+,,,,****++++**++++++******+*+,++++++******))))('&'((''%%&&%%$$!!     $(+,/137;AGLMNLJKJLKJJC.&)'%'''(('&Mqhciopi?"300/14=GRZ^XVXYUMIB6<HbcZYhqmrrqmnmiijkgda_b`_^]\USUSQMIC@@C?8:9561(&''((())*./00.,+++,,-03101/025788:;=???@@AAB>@@@?>>=;;8542/-,---,-.,,+**)))('&&&%&+/24688441.,'"#######$$$$%&'(++,,--..,,++,,--......////..,,,,------..--------..//000011//..//..--....017?IS\emswwvpjhhd_^^flnpppnlgba^[WTSSX[`ea_ZWME=986665566775566556666669<AGMSWZ\_]\YSNHFEHMT]ekpuwxxvspmnopqsx{zyyy{zwtqjc[UMIHIHIJIGIGHGFC@=;9....-----,,--,,,,+**))((('''((((''''''''(('(''''''(((())**))(((()(((&&&&&&&&&&&&''&'(())))**(())))+++++++,+**+,-,,+,**+,,+**,,,,****++++***+++********+**,++++++******))))('''((''%%&&%%$$""    "%),/147;=BHNRQOMLKKMLH7*&&('&'&&($Ntiejjle2#120.306EIOWYVVVWVMD;08F^RU[akjruqmprnjiggdb`]^^YUTNMPRNLMF??A<763551+'''(((()*-.//.-,,++*+,-.00/0035778::;<>@@@@AABBBAAA?=;87531//.--,,,+++**)))''&&&%$&(+.025442/-)%#######$$%%%&'(++,,,,--,,++,,--......////.-,,,,------......----.///0000111/0000/.--..//0122;EP[ainvyupmjie_Z]bhknqrplfb^YUQNLOOSXYWUPJB9786666677887777889999:::;AFKQVY[\]^ZUQKGFHMRXahlpuwyywrmmoonorv{zzz{||yxtolc\RKIIIIHHGEEDC?=;76....,+-,,,--,,,,+****(''(&&&&&''''&&''''''&&%%''''(((())(())((('''''%%%%%%%%%%%%&&&&&&''(''''())))*)*+++*++++++,++++****))+++*++**********))))**************++++******)))))((((((('%%%%%$$""!!   $&)-037;>@CHMPQONNLLMK?-)(('*('&%&TvjefjdgC#.210.-/9HORXYY^dZTMG>1<HZZTW^hjmqqswvqiaafd_ZY^_VPNIHJNMMMIDB@<854774-(%&'()))),/..-...+)(('))*--.014566899;<=>??A=>?@@BBA=::8664210//-,+**+*))(('&%%$#$$$%),.1234/.+&#"$##$#%%&&&''(****++++,,,,----.-......//.-,,,+---------.-------.///00011001100/.00//00230149AJV]fkrxwqpjec]ZZ^cglmonlgb[VSPIGGHJMMKFC=88:9887788888888:<<<;;;;<;?CHMRXZZ\^[WRJIGILQUZagmqtxyxvrmonpqrsv{{{{|}€€{xsohaVNIHGGDDCDA?;:752,,,,--,*++++******((*)))&%%%&&&&&&%%&&&&''&&%%''''&&(())((((('((''&&%%%%%%%%%%%%&&&&&&'''&&&'())))*)))++*******+***++***))****))))))))))))(()))*))))))))**))**********)))))(((((((((((&%$$""!!   $(*-037?CDEHIJLMOMMLJB2''''(*)%%$StkafhiiM&.10..-+/>MWPUVY__][TH>7CQ^^UWc_[htstwyzqffki`[Z[\ZRKIHJJJKJJFDA<875654-(%&'())))+-,,-....*''&$%(*+-/25568988;<<<===;::;>>><9::::8732100.,+***+))((&&%%##$$##%&*,.11/.-*%%$##$$%%&&&''(****++++,,,,--...-......//.-,,,+,,,,-----.-------.////00000011100/1111222223236>GQYajpuxrnhc^[VY^`ekmnnnhc\VSNHDA@CCB@==:;<;::::;;;;;;;;<=======>==BDIPSWXZ\YWTNJKJJNSW\dgkqtxyxvromqrrrty|{{|€ƒ~}wqlaULIHEBCB?=;97633++,,,,,+****))))(((&&&&&&%%%%%%%%%%%%%%%%%%%%%&&''&&&'((((((((''&&%%%#%%%%%%%%%%%%&&&&%&&&&&'))(''*())()))))))****++*)))))))(((())))(()))((())))))(((())))))))))))**)))))))((())((''((&$$%$#"!!! %'*/27:@EGFGEFIKNNMJD7,*((()*+$#A{m_^edj_%+1038/++-8DLORSUZ[^]QJB=HRWYQRZRTbrstx}|wusoh`\YVUTPHHIHGGEFJGDA>976543.('''(((')*++++-//.,*'%"$'(+.046776679=<<<=<:976798877:;<<;76320/.,*****))(('&&&#$$$$$#$'*-.10/.,)&$$$%%%%&&''(())**++,,----..///,---...//.-,,++**++++,----,----....//00001112221133334455434467<DLT_eltvsmhc_YUTX^cgkmmmje]XRNHE?<:<>>?>>=>>???<<=>????@@????>>>=<>BHLPTVXYZWUPLKHINRUY_dhnrvyzyvrqqqrssvy~€€‚ƒ…„‚~yri_QGFC?==;9644330+++,,+******))(((((&&&&&&%$$$$%%%%%%%%%%%%%%%%&&''&&%&((''((((''&&%%$%%%%%%%%%%%%%&&&&%%&&&&'''''')((('(()))))))(())))))))))((((((''''(((((())))))(((((())))))))))**)))))))((())(('''''%%%$###!! %),/4:=BGIIHFEGJNONNG>3))))*)((-qwi`dijb5%.1122-**,5BLNNSW[]\ZNF<8HVY[[S`dY[bmptswwwunjaZTQPPLFGHIFDDEIJHCB?;98851+((()))*)')*++,...,-,(%$$'*.26887668:;=<<<;:9664666577;9897521//.-,,,,,**))('''&$$$$$#$%(*.01//0-)(&%%%%%&&''(()))*++,,----..-------......-,,++**++++,---..........//001122123333344455777877778;@IQYdhpttmha[ZSRV]`dkmmlid^XUOLHC?@@@AAA@@@AAA@@?@AAAA@@??==>><;;<?BGMSUVXYYVRMLJLNRTX\afkqsvwzywtrqqtvxx}ƒ…†…ƒwocVGC@<;:964332/.**))****))(())(('''&&&&&%$##$$$$$$%%%%%%%%%%%%%%&&&&&%&&(&'(('&&''&&%%%%%%%%%%%%%%%%%%$$%&''''''''((((((((*((((((((())))((((((((''''''(((((((((((((((())(((((())****))))))*)()))((''(('%&&%$##""!  "%(,/4;?AEHIGFEFLNONMNG7'')**)((]{mceiph@!.20/.,*)+-7AFJRRTX^c^OEA=M_ffjnwq_YS`edkrxyumjd[VSPOJDEFHFDDDHHGFFFC>:852+)))+*+,,((')+,-.-,.,*)'&&(+.59854799<<=<::9755545555653666210///.-,/..,++,****'%$$$#$$$%),.21121.+(%#%''&&&'(((()*++++,,,,....----....,-..,+++****++,,--/.....//..//00223221243345556677888888779>EMU]emsrmib][WSV\_cgkijiec[XTOLGEDBCCDCBCCBBAAAABBBB@@?=<;;;;99:;@EKPRWYZZXSPOLOQSXY\achlqsvy{{xusuuuwz|ƒ„‚‚ƒ……ƒzqfYHA<98755211.,,**))((**))(())((''&&&&%%$$###$$$$$%%%%%%&&%%%%%%&&&&&%''(&''''&&''&&%%%%%%%%%%%%%%%%%%$$%&''''''''((((((((('''''''''((((''''''''&&&&&&''''((((((''((((''(((((())****)))))))(()))((''(('%&&&%$#""!  $&(,.37;<?ADA@AEKLMMLHC4(('))*%UwolhnrpW&+/3/..,+**+8@KORRUVVY^QCCO^gkjgmjVYa^ZWWcortplni_YVRNHC@CEGFEFGEFHIIFD?;94.**-**.11.+(')+,,,,-+,+,))()-164345688;:988764222333332222210//-----....,--****(&%%%$$$$%(*.100210.+(&%&&&&&'(((()*++++,,,,......--//..,---++++****++,,--/...//////00112343233334455666778999888998;AIQ[bnrsole`[[YXY_cgikjjhe^[XSPJGEDEFECCCBBAAAABBBBA@?=<;::9999:>EHNRUW[ZYVSQQRTVX[]`bbhmpswx||zxusvx||~‚…„‚€‚‚~yri[J>8754220/.-+,**))(())))(()('''&&&%%$$$$$$$$%%$$$$%%%%%%%%&&&&%%'''''''&''&&&&''&%%%&%%%%%$$$$$$%%%%%%%&&&'&''(('''%'('&&&&&&&''&(''''''&&&%%%%%%&&&&&%%&&'''''''''''''((((()(((**))(()))(())))'(((((('''&$###!  $%*,-1467:<=;>@BIJLJJF>2*'()(%Syocagso]$'//.--++***,/BKMRSSQPU[ZLDNbkooerj_[heaaMWglomkjgc^]XNGB?@ACEFDDEHIIHFDB@=7/,,//03682.*'(())+,+,--..++--000011236676544111012222100.//////..--..//11/.,*))*)('&&#%$$%)-1323330/,)&%%%&'''(((**++,,,,,-...../..////..-+**++*))++++++,.//01111222222233333444556666666887799888777?FOZciqusnje`^[YX\`eghklid`\WUPKHHGFEECCBA??@@BBAAA@?=<;:987889<@DJOTWY[[YVTVVXY[\]_ddghlprtx||{xuvxz}‚„…€~|yriZI;5531/.-,++++))))(())))(()('''&&&%%$$$$$$$$%%$$$$%%%%%%%%%%&&%%'''''''&''&&&&''&%%%&%%%%%$$$$$$%%%%%%%&&&'&''(('''%%%%%&&&&&&&&&'''''%%&&%$$$$%%%%%%%&&%%&&&&''&&&&&&''''((&'((**))(()))))))))'(((((('''&#$##!   "%(+-023347:;>BDFIKKJFB6*'))&G|o`_fqqe7 ,0.---++***-=GDGQTWROQYYRJSbjq^ovbeoha`bRP\dhjhd_`b^YQGB@?@BCCDDEFFFFEDB@=7/-/13425420+)((((***,/12200..--//../02241111011012222100///////...-..//11/..,,,*)('&&$%$$$'+-2555410-+(&%%&''''((**++,,,,-....../00110000/-+++++**+,,,,+,.//011112222222222223434566655557877998887666<CNXaiqtvtqjgb`][Z]dgkjhhfc^YVTPKHGFEDCBAAABBBBBBA@?=<;:977889<AEJOQUWZ[[[Y[[Z[\_acceffhknqtx{|zwxx{€‚ƒ„‚|{{yuqg^M=200.-,,+++++(((((())))(''''''&&%%%$$$$$$##%%%%$%&%%%&&%%$$%%%%&&'''''%((''&&''''&&%%%%%%$$%%$$$$$$%%&&&&&&'&''&&''%%%%%%&&&&&&&&&&&&%&%%%%$$$$$$$$$$$$$$%%%%&&&%&&&&&&'''''''())))))***)(())('''(('&&&('$%#"""     #')./12237:=@BCFHJMLGA4)(*'6uvkkjpqj8%-.----++))*0FCBIQSQPOSRMXY[`k]Knovnigd^YYVRYabe`\][[\SKFA?>?@CFFEDCEECBA@<72.04872-121-,*))()(),/255442..,..--///.///////00133332111..//0000..--00000/.-,,*)('&$%%$$$$(+.2455211.+)'%%''((()++++----........001111200/,,----,,--,,,,..//1111111122111101223444554444566688888888659BLV_jsx|zwrkgc`ZX]adghhjhd`\YVQLIGFEDC@??BDCDECBA@?;;;:89:::<?CHNSWZ\^^____^^_bdffffcbehkorvz||zz{}ƒ‚‚~{yvtsni^QA2..-+,,-++**(((((())))('''&&''&%%%$$$$$$##%%%%%&&%%%&&&&''%%%%&&''''&'((''&&&&''&&%%%%%%$$%%$$$$$$%%&&&&&&'&''&&&&%%%%%%%%%%%%%%%%%%&$$$$$##############$$##$$$$%%%%&&&&&'&''()))))))))(((((('))(('&&&'&'%$##""   ""'),.01358<BCDDFJLOLGA2((,,l|kkqrnlA#*------++*))-/9FLQPPPPKLPW^`[b^W_eproiiec][X]`aa]\ZUXXSOLE?<=>?CCBAAEFB@?ABA90.1550-/211/.,)))++/-0358830.,,,--...-.--..-0/013333332200001111../000000/.,++*)(''&%%$$$$%),0244221/-,('%%%((()++++------......000000001011/---..--,,----./00000011110011012223444455444466777777774448@LWaju|~}zvpie_YW[]cffijifb\ZVQLIGGFEBBDFGFGGECB@@?=<;9:::;=ADHNSWZ\__``aa``acegggfc``bdjosx}||zz{~€€€}xvtrqmh_VF6---+++,,,++''(((((())('&&&&&'&%%%$$$$##$$%%&&&&&&&&''&&&&&&&&&&''%%%&((''(('''''&&&$&&&%%%%%%%%%%%%&&''&&&&%%&&%%&&$$%%%%$$%%%%%$$$$#####""""""!"""""""####$$##$%%%%%%&&&&&'(((''))))))))))(())))''&((&&'%%$""  !##')*+.039<@BFJMNNOOJFA1()*[wlmvsoP  #,,,,,,,,,**+15:@HORONKHKKUadXQZeigackh[Xda___\__\ZYSQORRNHB@><;;=<<=?====?DKA1**.0.//33201/,*-0110214883/+*)),+,,,,,-....///02123234433221100//..00110/.,,++*(''&&%$%#$#&'++/0111//-+)'''((())*+++,,,+++,...-0000//01001100..--..--,,----,..../00////000011222233443333466666777654447@LWclv||vrie\USX\aeiijifb_[VRMIIHGGFGHJJJJGEDCC@>=<;;==??AEHMRVZ^`accbbabedeffffc`][\djnsuy{{zz{~~~ywuronlicYM=.***+++,+))(((((((())('''&&&&&%%%$$$$##$$%%&&&&&&&&''&&&&&&&&&&&&%%%&''''((''''&%&&&%&&%%%%%%%%%%%%&&''&&&&&&&&%%%%###%%%$$$$$$$####"##"""!!!"""!!!!!!!""!!""""#$$$%%%%%&&&('''''))))))))))))))))****''''&$$#!!!!"$')*+-/16>BFIMPRRTRJF?.()9zrinwwqT! "&,,++,++,,***/05>FILLIJLMLXbcYEHST_fldda_`bike^^_^]ZRPQSRLEBA><87788989999;BPI1*),-022421/0//023445222330-*)**)+++----.////0/0100023443333221100..//00/./--,+*)()(&&%%$#$$$'(*-./0100/.,)'(()(()**)+,,....//.-////..,-////....-...--,,,,,,,-..-.//////0000001100002322222333334554444469@LYcpv{{}}wqh_VPQW\aehjjlgda\VRMLKJJJKLLMMLIGFDC@?=<<<==??CGHMRVY]__cddebddeeffffc]]ZX[aflpsyz{{yz~~}xvrpmnlje^TC1+)*)**+*(('''())('))('''''&&%%%%%%%%$$$$%%&&&&&&''''''&&&&&&%%''&&''''''''&&&&''%%&%%%$$%&%%&&%%%%%&&&%%''&&%%%%$$$$"###$$$$##""""""!!!!! !!!!!! ! !!!!!##""!"##$$$%%%%%&'&&(((((())))))))))))****((((&%$$""!!!$()*++./5=AEJSUTTVQJE;*)(Tuqmsyte* "!%*,,***+,.,+++*3=BHKGHHFDFP_SFKSQTbgeijf^_\bjdZX[\\ZSPTVSQLCB?;:7544545688:AE@8,)+,.334422145665676310//,+*)(((()+----.0/011////0001331223333110/,-/../-.,-,+++*))(&$$$$$#$$$'(+,,/0221/-+*)))******+,..00/0/-./////....////......-,,,++++,,--....//////00////////00122211111123334434578ANYenwz{|yuoeXPPQTZbfgjkjgdb]XRPOMOMNOONNLIHFED@@?>=<>>>>AEINQU[]]acefffgffggffdb_[URQV^dhkrvz|z{|zzxuqrllkif_XJ:,)+*))))(('''())('))('''''&&%%%%%%$#$$$%%%&&&&&&&&&&''&&&&&&%%''&&''''''''&&&&&&&&&%%%%%%&%%&&%%%%%&&&%%%%&&%%%%$$$$#"""####""!!!!!!          !!! !!!  !$$!!!"##$%$$%%&&&'))(((((())))))))********(((('%$$##""#&())*+..48>HKRVUURKHD9)(,ksjqxsi7$"#'*++**)+,./,*,+5AGGIIF@?;=FRJ?IRYkhfhhceg\P]gaXTWXZZVQUSMMJCC@==:755534688<>>><0))+-0144434688875431/---,+*)((((()*,../0/011///////01113234445320/,+../----,++**++(''%$&$$$$#&&(*+.133220//,**++++,,,.0000/0110.////....////....//-,,,----..--....//111100//////////002211222223334454576:CNYcjsyyyurj_VOSRW\bgmklkieb\XWRQPPOPPNNJHGEDDB@@??=??AACEGNQU[]^bdgihghggggfeda]XRONORYaglptx{zyzzxxwsmmligd\SC4-*)((''((€€€€~~~~~~}}||}}~€€€€€€€€€€~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}|{zzzzyyyyyyyyyz}€‚…†‰ˆ‰ˆˆˆ‰‰ˆˆ†…ƒ‚‚ƒƒ‚€|{zzzzz|}ƒƒ……„‚€~‚€ƒ†‡‡„‚ƒˆ„„‚€~~~~~~~~~~€ƒƒ‚€~}{||{}~~~~~~~}}}€ƒ„„…†‡‡ƒ~}}}}||{{{{||{}||}~€€€€€€€~||{|~~~€€€ƒƒƒ€}{xwyz~€€€€~}|}~~~~‚„}|€€€€~~~~~~}}||}}€€€€€€€€€€€~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}|{zzzzyyyyyyyyyz}€‚‡ˆˆˆˆ‡„„„„„„ƒ„ƒ€~~~‚ƒƒ‚€|{zzzzz{}~€‚ƒ„„ƒ€€‚ƒƒƒ‚‚ƒ………~x{‚…„‚~~~~~‚ƒƒƒ‚€}{||{}}}~~~~~}}}~ƒ„„…†‡‡ƒ~}}}}||{{{{||}~~~}~€€€€€~|yy{|~~~~~€€€‚~}{zyz{~€€€€~}|}~~~~‚„}{y€€€€€~~~~}}{{}~€€€€€€€€€€€~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}||zyyzzyyyyyyyy{}€ƒ…ˆ‡†ƒ‚€ƒƒ„……‚~~}}‚„„ƒ‚|{z{{zz{~€‚„„ƒ€€ƒƒƒƒ‚‚‚‚ƒƒ…„€yssu€†ˆ~~~~~€‚ƒƒƒ‚€}|}}}}|||}~~~}}}}~€‚ƒ……††‡„‚~~}}}|{zz{|}}€€€€€€€€~}|{yz{|~~~}}€€‚‚ƒ‚}}zzyz|}€€€€‚‚‚€~~|~~~~~~€‚ƒ~yy€€€€€~~||}}}}~€€€€€€€€€€€~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}||z{{zzyyyyyyyyy|‚„„‚„…††‡„}|{}‚„„ƒ‚€}{z{{{{{}~€‚„„ƒ‚‚ƒƒƒƒƒƒƒ„ƒyvuvzƒ€~~€ƒ‚ƒƒ€‚}|}}}}|||}~~~~}|}}‚‚„…††‡…ƒ~~}}}|{{{|}€€€€€€|{xwxy{|~~}|}€€‚‚„ƒ~|{zy{|}€€‚‚€}}|~~~~~~ƒ„€{yy€€€~~}}|{}}}€€€€€€€€€€€€€€€€€}}~~~~~}}}||}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~~~~~}}||{{yyyyyyxxxxyz|€€‚ƒƒƒƒ†‡‡…„‚}|{{|ƒƒƒƒ|{zzzz|}€‚„„„ƒƒ„„ƒƒƒƒƒ~€~}|z{‚€€€‚„ƒƒ‚‚€€€€€~|{}}}}}}|}~~}}}}|~€ƒƒƒ„…†„‚€}~~}|||}€€€‚ƒƒ‚€€€~|yxwwxz|}}}|{|‚‚……ƒ‚€~|{{{|~‚‚ƒƒ‚}{z}~~~~~‚„{yx€€€}}||{z||}€€€€€€€€€€€€€€€€€~~~~}}}}||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzyyyyxxxxyz{~‚ƒ„…………†‡‡…‚€|{{{|ƒƒƒƒ‚€}{zzzzz|~€€‚„„„„„„ƒƒƒƒ}|}~}}}~}~ƒ…ƒ€ƒ„ƒƒ‚~~€€€~|{}}}}}}}~~~~}}||}ƒƒƒ„…†„‚€}~~~~~‚ƒƒ‚‚‚€€€~|}}zywvvxz|}}}|{|‚‚……ƒ‚€~}{||}‚‚‚}{yz|~~~~~~‚ƒ‚}{y€€~~{|{{{{|~€€€‚‚€€€€€€€€€€€€€€€€€€}}}}}|{}}}}}}}}}}}}}}}~~~~~~}}~~}}}}}}~~~~~~}}||||{{zyyyxxxxy{|~‚„„†††††…††„}{z{{}~€‚‚ƒ‚{{{zz{{}~€€€ƒ„„„ƒƒƒƒƒ‚€|}~~~~}}„ˆ‰ƒ}}‚„„‚„‡‡ƒ‚‚~|||‚‚€~}|||}}}}}}~~~|{{}~ƒƒƒ„…†…ƒ‚ƒƒ„„ƒ€€€€€€~}~~~}zyvuuw{|}}||z|€€‚‚……ƒƒ€~}~~‚ƒ€~|zwxz}~„‚|z€~}}{{{zz{}~€€€€€€€€€€€€€€€€€€€€€€}}}}||{}}}}}}}}}}}}}}}~~~~~~}}~~}}}}}}~~~~~~}}}}||}|{{zyyyxxxxy{}‚„„†††††…†…‚|{|{{{}€‚ƒƒ‚€|{{zz{{|}€€ƒ„„ƒƒƒƒ‚~}}€€~~€€~}{{ƒ…††…„„‚€~}|‚‚€~}|||}}}}}}~~~~}{{|‚ƒƒƒ„…†…ƒ€‚ƒƒ„ƒƒ€€~}~~~}zxuttw{~}||z|€€‚‚……ƒƒ‚€€€‚‚‚~|wvw{~ƒƒ€}{€€€€~~}{{zzz{~~~~€€€€€€€€€€€€€~}}}|{{{{|||||||}}}}}}}}}}~~}}}}}}~~}}}}}}}}}}}}}}}}|||zzyxxxxwxy}€ƒ……††„………„ƒ||||||||~€‚ƒ„ƒ~|{zz{{|}}~€€‚„„ƒƒ‚€~~€~~€~}||y~‚€{vvz|}|ƒƒƒ~|{{{|||}|~}}~~}}{|~‚ƒƒƒƒ†…ƒ€€‚ƒƒ„„ƒ‚‚~~~~~~}~~~~{xusstw{|}}|{{}€ƒ††„„ƒƒƒƒ€‚ƒ„ƒzwvy|~~~~„„~z€€€€~}|{{{{{|~~~€€€€€€€€€€€€€~}~}|{{{{|||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|||zzyxxywxz{‚‚ƒ…††„………„~||||||||}~~€ƒ„ƒ‚€}zzz{{{|}€€‚„„ƒƒ‚}}~}|}~€~}|zxyzx|‚~xtqqrtw|ƒƒƒ~}|}}||}}|~}}}}||{|~‚ƒƒƒƒ„„‚€€€‚ƒƒƒƒ‚€~}||}}~}~~}}yvsrrsw{}~}|{{}€ƒ……„„„„ƒƒ‚‚„…ƒ}yvwy~~~~‚…ƒ{€€€€~}||{{|}}}~~~€€€€€€€€€€€€€€€~~~}|{zz{{||||||||}}}}}}}}}}}}|||||}||||}}}}}}}}}}||{|{|zzyxxwy|~ƒƒƒ„…„„„……„~||||||||}}~€€‚‚ƒƒ~|{{||{}~€‚„…„ƒ‚€~}}~€}|}~|{{zzywvv|‚‚~xtvxz}~€€‚ƒƒ~}|||||}}}}}}}}|{{{}€ƒƒƒƒƒƒ‚€€‚‚‚‚€€}|{y{|~~~}}}zxusqqrvz}~}|z|~€€€‚ƒ……„„„„ƒƒƒ‚ƒƒ„…ƒ€{xvxy~~~~€ƒ…„€|€€}}|{|||}}}~~~€€€€€€€€€€€€€€~||{zzz||{{||||||}}}}}}}}}}~~~~||||||||}}}}}}}}}}||{{{{zzyxyx{~€‚„„ƒ„„„„„„„„}{||||||||}}~€‚‚ƒƒ|{{||{|}~€‚‚„„ƒ€~~}€€~~|zz{{zxxvw{~zz{||||}€€‚ƒƒ~}||||}}}}}}}}|{{yz}€€‚ƒƒƒƒƒ‚€€€~|yyxy{~~~}}|ywtqppsvz}~|{{}~€€€‚ƒ……„„„„ƒƒ‚‚‚ƒ„‚{xvx|~~~€ƒ…„€|~~}}|}}~~~~}~~~€€€€€€‚~}|{{{{{{{{{{{{||||}}~~~~}~~~€||||||||}}}}}}}}}}{{{{{{zzyyy{~€‚ƒ‚ƒ„„„„„ƒƒƒ}||||||}}|}|}}~€‚‚ƒƒ„€}y{||{||}€‚ƒƒ„‚}~~~|yz~}}~~||}}|{wvyxuy€~{z{~ƒƒ~~}}}}}}}}}||zyzyyz}‚ƒƒƒƒ‚‚‚‚}|{ywvwx|}~}~~}|xuspnpruy}|{|~€‚ƒ…………„‚‚‚‚‚‚ƒ‚}zwvz}€€~~‚††~~~}}|}}~~~~~~~€€€€€€€€‚~}|{{{{{{{{{{{||||||}}||||{}~~~|||||||||}}}}}}}}||{{{{zzzzyyz|€‚ƒ„‚‚‚‚‚‚‚€}||||||}}|||}}~€‚‚ƒƒ„~}}||}~€€‚ƒ„‚}~~}ztsw}~}|}~€€‚„„‚|tswwy~€{z{~ƒƒ~~}~~}}}}}}{{yyxxwx{}‚ƒƒƒ‚‚€€€€~{zywvvwz}~~|zwurpnnpuy}|{|~€‚ƒ……ƒƒ‚€€€€‚|zwx{€€€‚„„~~~}~~~~€€€€€€‚‚‚‚€~~}|{{{zz{{{{{{||}}}}}}}}}}}}||||||}}}}}}}}}}||||{{{{{{zzzzxz|}€€‚‚‚€€€€‚‚~~}||||||||}}}}}~€‚‚ƒƒ„ƒ€~||}~€ƒƒƒ‚€}~~||yy|}„‡…€~~€€ƒ„„ƒ~wsuwz}}|z|‚‚‚}|}}}}~~}|zyyxwutvy}€‚ƒƒ€€~}|zxwvuuvy~€|zusqpnnpuz}}|{|~€€€‚„„ƒ€€€€€€}zvvy|€€€€„„~~~}~~~€€€€€‚‚‚‚€~}|{z{{zz{{{{{{||||}}}}}}}}}}||||||}}}}}}}}}}||||{{{{{{zzzzxz|~€€€€€}{z|||||||{|}}}}~€‚‚ƒ‚ƒƒ€~}~€€‚€€ƒƒ‚~~~}}{}}€ƒ…‚€€‚‚‚‚€}ysprw{|z{|‚‚‚€~}|}}}}}}|zyxwwutrtx}€‚‚‚€€€€€€€}|zywvusuvz€€€~|yutrpnnpuz}}|{|~€€€‚„„ƒ€€€€~zwuuy|€€€€„„~~~~~€€€€€€€€€€‚‚€€€~}|{{{{{{{{{{z|||}}}}||||}}}}}}}}}}~~~~~~}}}}|||z{{{{zzzyyyy|~€‚~}}~€€}||{{||||||}}}}}~€‚‚ƒ‚€‚‚ƒ€€€€‚„ƒ~|||~}ƒ„‚€}{xtolu|~{{|€‚‚ƒƒ}|||||||{yxwwvtsprv{~€‚‚€€}||}~~}|yxvvusstw|~€€€|yvtsrompty}}||}€€€‚‚ƒƒ‚€€~~~~}zxusvz}€€„ƒ}~~€€€€€€€€‚‚€€€~}|{{{{{{{{{{z|||}}}}||||}}}}}}}}}}~~~~~~}}}}|||z{{{{zzzyyyz}‚€~}}~€€}{||{{||||||}}}}}~€‚‚ƒ‚€€€‚‚ƒ€€€‚„ƒ~{xy||~‚ƒ‚ƒ„ƒ‚‚€}{ywuoks|}{{|€‚‚ƒƒ€}{z||||{{zywvsrponouz}~~|zz{|}|zxxvtsrrtw}€€€€~|xttrqonpty}}||}€€€‚‚ƒƒ‚€€~~}}{xtrsv{~€€„‚~€€€€€€€€€€€€‚‚‚‚‚‚‚€€€€~}|{{zz{{{{{{||}}}}}}}}}}}}~~}}||~~~~~~}}}}||{{zzzzyyyxxz{‚„ƒ€}}~€‚‚‚|{{{{{||||||}}}}~~€‚‚‚ƒ‚€€ƒ‚€€€‚ƒƒƒ‚€~|{||~‚†‡‡…„ƒƒ€}{zyzxtmqz|z{}€‚‚ƒƒ~{z{{|{{{zxwvsqnmlmry}~|zyxxz{}|yxwtrqpqsx}€€€€~|wtsrqonpty}}||~€€€‚‚ƒƒ€€€}|yxtpqrw}€€}}~€€‚}€€€€€€€€€€€€€€€‚‚‚‚‚‚„……††„‚~}}}}~~||}}}}}}}}}}}}~~}}}}~~~~~~}}}}||{{zzzzyyyxy{~‚ƒƒ‚€€€€‚‚|{{{||||||||}}}}~~€‚ƒƒ‚ƒ‚€€€‚ƒƒ‚€~~}}}~„„……„……‚~|zyyxxvpnw{z{}€‚‚ƒƒ~{z{{{{{zyxutqnkjikpv|~}zxwvvvx{||zywtrqpquy~€€€~|vtsrrpnpv{}}||~€€€‚‚ƒƒ€€€}|zxtqnorw}€€}||}~€€}€€€€€€€€€€€€‚‚€ƒ…ˆ‰‰‹‹ˆ‡ƒ€~€‚ƒƒ††…‚~}|||}}}}}}}~~}}~~~~~~~~~~~|||||{{zzzzyyyy{~ƒƒ„„‚‚€ƒ‚}|{{{||||||||}}}}}}€€€€„„ƒƒ‚‚‚„ƒ‚}~€€‚‚ƒ‚~~€‚‚„„ƒ~{{zzyxwwpnuyy|}‚‚‚‚€}{z{{yyzxxvtqomkifiov|~{xvtsstxz{zzyvtrqpqty€€€€€zvtssrqqrx||||}~‚ƒ‚€€€€€€~|zxvrokouy~€€~z|~€€€€~€€€€€€‚‚€ƒ„…ˆ‰‰‰‰‰ˆ‡…ƒ…‡ˆ‰Š‰‡‡†ƒ€~~}}}}}}}}~~}}~~~~~~~~~~~|||||{{yyyyyyy{‚‚„„……ƒ‚€‚€€|{{{{||||||||}}}}}}}~€‚‚ƒƒƒƒ‚‚‚ƒ‚}|}€‚‚‚ƒƒ~}‚‚ƒƒ‚~|{{zzyxwwvsuyy}~‚‚‚‚€}{z{{{{{zxvuroljgfiov|~{xvtutuxz{zyxvtrqpqu{€€€€€{wutusrsux||||}~‚ƒ‚€€€€€~|zwtqnkou{€€€{y{}€€€€~€€€€€€€€€€€€€€„‡ˆ‡ˆˆˆˆ‡‡††ˆ‡‰‰‡‡ˆ‰ˆ„‚~~}}}}}}~~~~~~~~}}~~~~}}||{{zzyyxzy{}€„„………„„‚€‚€}{{{{{||||||||}}}}}}~€‚‚‚‚ƒƒƒƒƒƒ‚€}|~€€‚ƒƒƒ€~€€‚‚‚‚‚‚~|{zzyxxwwwxtsxz|€€‚‚€}{z{{{{zzywurolifeflu|~€|yxuvvwyz|{zyxvsrstx}€€€€€zxvwvsuuvz}{{{|€€€‚ƒ‚€€€€€}yvqollpv}€€€€€}zx{~€€€€€€~}€€€€€€€€€€€€‚ƒ‚‚‚ƒ…††……†………………†ˆˆ†‚€~}}}}}}~~~~~~~~~~~~~~}}||{{zzyyxz|‚„…†††††„‚‚‚~{z{|||||||||||}}}}}}~€‚‚‚‚ƒƒƒƒƒƒ‚~{{~€€‚ƒƒƒ‚€€‚‚ƒ‚‚‚‚‚‚|{zzzyxxwwwwssy{|~€€‚‚€}{z{{{{zzywurolifeflu|~~}{zxxz{}~€€~|{yxxy|~€€€€€~{yxwvutvy{{{{|€€€‚ƒ‚€€€€€}yvqnkkry~€€€€}xwz~€€€€€€~}‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€~|}}‚„…ƒ~{{~~€ƒ†‡ˆ†ƒ€~~}}}}}}~~~~~~~~~~}}|{{{zzyz{}„‡†…………††‚ƒ€€€€~||{{{{zz{{{{{{||}}||}}|}€ƒƒƒƒƒƒ‚€}||}€‚‚‚‚ƒƒ‚‚ƒ…„…ƒƒ‚‚€|{zzzyyxxvxwtrvz~€ƒƒ|{yz{||{zyxutoljgfhlu|~~~}|||~€€‚‚‚‚€~}~~€€€€~{yywutvz|||}~~€€‚ƒ‚€€€€€}yupljltz~€€€{wuz~€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~|}}~€}xwxxyy|€‚†……ƒ‚€€~~~~~~~~}}|{{{zzz|}€‚…†…†………ƒƒ|zzz{{{{zz{{{{{{||}}|||||}€ƒƒƒƒƒ‚~}{{|€‚‚‚‚ƒƒƒ„…†……ƒƒ‚‚ƒ€}{zzzyyxwxxxtqry|€|{yz{||{zyxutqnkhgimu|~~~~}~€ƒƒƒƒƒ‚‚€€€€€€€€€~{xvuwz|||}~~€€‚ƒ‚€€€€~}yupllpu|€€}yvwz~€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~~~~~~}}||}}~zxxyzz{{|~€ƒƒ„†…„ƒƒ€€€€€€~~~~~~}}|{{{zzz}€ƒ……„„………„‚€€|zxxxzz{{zz{{{{||||}}||{{{||€€‚‚‚ƒƒ€~}||{|€‚‚ƒƒƒ…„……†††„ƒƒƒ‚‚€}|{zzyyxxxyvsnpw|€€€|{zzz}}}{zywtrokhhinv|~}}~€‚„ƒƒƒƒ~€€€~~~€‚€~zwuwy|||}}€€€ƒ„}~{wtojkpw}€€€}yux{€€€€€€~‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~~~~~~}}||||{{xxy{{{||}}~€‚ƒ„……†††††††…~~~~~~~~}}|{{{zz{~‚„„„„…„ƒ‚~~||{zxwyzzzzzzzz{{{{zz{{zzzz{{{|}€€€‚‚‚‚‚€}|{{z{~‚‚ƒƒƒ„…‡‡‡†„‚‚‚€}|{zzyywwx{}ytrw|€ƒƒ€}}{||}}|~~}ywspoljkov{}~}~€‚€€~|zyxyyz|€€€~}}|~€‚ƒ|wuwy|||}}~~€ƒ„|~~~~~}{wrmkmtz~€€}yux{€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€€€€€~~~~}}}}}}}|~~}}||{{{{{{}}}}~~€‚ƒ„ƒ†‡ˆ‰‰Š‰…€}~~~~}}||{{{{{|}€„„„„…†„~}|yyyywwwyzzzzzz||{{{zyzzyzzzz{{z{~€‚‚€~}}{{{{|~€‚‚ƒ„„…††…‚€€€~~{zyyxxwwxx{{utx|}‚‚~}|||}~€€|zvsonnnrz}~~€€|zxwvtrqruy~€€€~~|||}‚„„~xwxz|||~~~~~€‚ƒ‚~€~}{urmjnv}€~|xux|€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€~~~~}}}}}}}|}}||}}{{{{||}}}}}}}~~€‚ƒ…‡ˆˆ‰ˆ†~}}~~~~}}||{{{{{|~‚‚„„„‚~{zxwvwwwwwwwyzzzzzz{{{{yyyy{yyyzz{{z{|~€‚‚‚~}|{{{{{}€‚‚‚ƒ„…†…ƒ€|{}}{yyyxxwwvvwvwvwz}‚‚‚‚~}|||}ƒ„„}xvtrstx{~~zyxwvusqpqty~€€€€~{vxz~ƒƒ‚|xyz|||~~~~~~~‚‚~~~}yupnmqy~€~€|wux|€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€€€~~~~}}||||||||||||||||||||||||||}|{{}}€ƒƒƒ„„……„€}}~~~}}}||{{zz{}~ƒ„„ƒƒ{xvvwwvvxxwxyyzzzzzzzy{{zyzzzzyyyyyz{{|}€‚‚‚€~}{||zz||‚„„ƒ~~~~|v|€~|zyyxxxwvvuvywvy}‚‚‚‚~}||~ƒ…„ƒ€|zyy{{{~€€€€~yxxwuutrrsuz~€€€‚ƒ}yutw{ƒ‚}{yz{{{|}}}~~€‚‚~~|zuqoot{€€€|wux|€€€€€}ƒƒƒƒ‚‚‚‚‚‚€€€€€€€~~~~}}||||||||||||||||||||||||||}}|{||}€€ƒ„€||~~~}}}||{{zz{}‚ƒƒƒ‚€|ywvvvvvvxxwxyyzzzzzzzyyyyyyyyyxxyyyz{{|}~€‚‚‚€~|{||{{||‚ƒ‚€||}{xy€‚}{yyxxxwxzxvvtvy}‚‚‚‚~}|{||}€ƒƒ‚€~~}~€€€~€~{yxwuutsstw{€€€€€|vsty~ƒ€|zz{{{|}}}~}|}€~yuqnou|€€|vux|€€€€€€€}„„„„‚‚‚‚‚‚€€€€€€}}}}||||||||||}}}}||||||||||~~~~~~}}{}~}|{|€„…„}yz}~}}}}{zzz{{}€‚ƒ„„ƒ~zxwwwwwwwxxyxyyzzzzzzzz{{yyxxyyxxyyyyzz|}€€€‚‚‚‚~|{|||}|~€€‚‚‚€}|z|{x{ƒ€}{yxxxwx{zussv{}‚‚ƒƒ€}|zzz||~€€€€€€€€€~~€€ƒ€~{yxxxvvsuuz~€€€€‚€}yutw|€‚~z{{{{z{}}~~}{yz}~|xtpnpw}~~xttz}€€€€€~|„„„„‚‚‚‚‚‚€€€€}||||||||||||||||}}}}}||||}}~~~~~~~~~~}|~ƒ‡‡‚|yz}~}}}}|{zz{~ƒ„„„„ƒ€|yxwwwwwwwxxyxyyzzzzzzzzyyyyxxyyxxyyyy{{}~€‚‚ƒƒ€|{|}}~~€€}|z|{x{ƒ€}{yxxxwy}€zuttv{}‚‚ƒƒ€}|zz{|||~€€€€€~€€ƒ|yxxxvwwxw{~€€€€‚€}zvtw{~€€|{{{{z{}}}~~{wvy||wtposx~~~|wrtz}€€€€€~|ƒƒ„„‚‚‚‚€~}}||{{||||||||||}}~~~|}}|{||}}}}~~~~~~…ˆ‰ƒ~{{}~}}}|||||~‚„„……ƒƒ‚|wwwwwwwwwxxyxzz{{{{{{zyzyyyxxxxxxyyyyz|~€€€ƒƒƒƒ}|}|~€€€€‚‚ƒ|z{zv~‚ƒ€}{yxxxyz}ytrrtz~€€ƒƒ|zzz{{|}€ƒƒƒ‚‚‚€€€~€€ƒ|zyyyxxwxz~€€€€€€}{xuvz}€}|{{{z{}}}}yvx{}}~~~{vsopty~€€{uruz}€€€€€~{ƒƒƒƒ‚‚‚‚€~~~||||{{{||||||||||~€€€~~~~|||}}}}~~~~~~~~„‡‡…{{}~}}}||}~„……„…„ƒƒ~zxwwwwwwwwxxyxzz{{{{{{zyzzyyxxxxxxyyyy|}~€ƒƒƒƒ‚€~|~€ƒ……ƒ‚‚€||yxx~‚ƒ€}{yxxxy||wuurtz~€€‚‚}{{{{{|}€ƒƒƒ‚€€€€€€€~€€ƒ€}|{{{zyxy{€€€€}{xwwx{|{}||{{{|}}}}€~zwx{}}~~~{wsppu{~~~~zuruz}€€€€€{xƒƒ‚‚‚€€€~~~~~~}}{{{{{{||}}}}}}}}||~}|||~~~~~~~~~~~~~ƒ†‰…‚|z|}}|}}‚†‡‡†…„…‚~|yxxxwwwwxxxxyyzz{{{{{{zzzzyyyyyyyyyyyz|~€€‚‚‚‚‚€€„…††‚€€€|{xvv}‚„€}{zzyyyz}~yuuqtz~€€‚€~}~}|z{|ƒƒƒ‚€~}~€€~~€‚{z{{{zyyz}€‚‚~|{yyyyyz{{{{{||||{}~€€~{wy{}~~€€~{vsqrx|}~}}~~|yssu{€€€€€€}zuƒƒ‚‚‚‚€€~~~~~~~~~~}}}}||||||}}}}}}}}||}~~~~}|||~~~~~~~~~~~~~ƒ†‡‡„€~~€}}~…‡‡ˆ‡†…ƒ‚{ywvwwwwwwxxxyyyzz{{{{{{zzzzyyyywwwwyyz{|‚‚‚‚‚‚€€ƒ†‡††„‚€€‚‚€}|yvv|ƒ}{zzyyxxx|~{xsu{~€€ƒ‚‚€}|{|~‚ƒƒ}z|~€€~~€‚}{{{{zyyz}€€€}{{{{{{{yy{{{||||{}~€€~|zz|~~€€~{wsqsx|}~~~~~}ytsw|€€€€€€}ywƒƒ‚‚‚‚‚€€€€€~~~~~~~~~}}}{||}}}}}}}}}}||||||}}}}||}}}}}}~~~~~~~~‚…†‡…}~~€ƒ†‡ˆˆ‡‡…‚~zxwwvvvwwxxxxzzz{zz{{{{{{zzzzyyxxyyyyyy{}€‚‚‚‚‚‚ƒ„…†……ƒ„€€~€ƒ‚~~vu{‚}{zzzz{zwx}}xtu{~€€‚‚„ƒ„ƒ‚‚}||}‚||{{€€~€‚‚€}{{{{zyy{}€€€€€€€}|{|}~~}{zz{{{zz{{z|~€€||||}}~~~{wsruy}}~~~}xttw|€€€€{xwƒƒ‚‚‚‚€€€€~~~~~~~~~}}}{||}}}}}}}}}}||||||}}}}}}}}}}}}~~~~~~~~€ƒ…††‚}}}}~‚…†‡ˆˆ†ƒ€}zwxxvvvvwwxxyyzz{{{{{{{{{{zzzzyyyyyyyyz{}€‚‚‚‚‚‚‚‚„†…††…ƒ‚€€~}€€zvz‚}{zzzz|€‚ƒ~ysu{~€€‚‚„…„„„ƒ~||~~|z{|~€€~€‚‚€}{{{{zyy|}€€€€€€}|{|}~~}{xzz{{zz{{z|~€€||||}~~€€~{wsrwz~}~~~}xttx|€€€€€|zx„„‚€~~~~~~~~}}~~}|||}}}}}}}}}}||||}}}}}}}}~~}}~~~~~~}~~~~€‚…‡…‚~~~~€‚„††††„|yxwwwwwwwwwxxyyzz{{{{{{{{{{zzzzzzzzyyzz|€‚‚‚‚€‚‚ƒƒ„†††…„€€~‚‚€|{y{€}|{zzzxxww{zvrv{€€€€€€‚……„„„‚€}}€€}{{|€€€€€€€‚‚€~|}}{yyz{~€€€€€~{{}}~~~}{xyz{{zz{{z|~€{{|}}|~~€}wstx|}~||||wuty~€€€€~~ƒƒ‚€€~~~~}}~~}|||}}}}}}}}}}}}}}}}}}}}}}~~}}~~}}~~~~~~}~~~~ƒ…†ƒ€€‚„…††…ƒ|zxwvwwwwwwwwxxyyzz{{{{{{{{{{zzzzzzzzz{|~€‚‚‚‚‚‚‚€€‚‚ƒƒƒ„…†…ƒ€€€€€ƒ‚‚ƒƒ‚€}~€€}|{zzz{{}}{xttv{}~€€€€€‚„„ƒƒƒ€}}€€}{{|€€€€€€€‚‚€}{{{{zyz{~€€€€€~}}~~~~~}{xyz{{zz{{z|~€}{{|}~|~~€}wttx|}~||||wuuy~€€€€€‚‚‚€€€€€~€‚‚~~}}}}||~~~~~~~~}}~~}}}}}}}}}}~~}}}}~~~~~~~~ƒ…††„‚ƒ„„…†…‡‡„|yxuvvvvwwwwwwxxyyzz{{||{{{{{{{{{{zzz||~€ƒƒƒƒ‚‚‚€‚ƒƒƒ„„„ƒ€€~€€‚„‚‚€€~|{{{zy|}|xvux{~€€€€€€‚‚‚‚€€€~}||{{}~€€€€€‚ƒƒ}|{{zzyz}~€€€€€€~~~~}yxxy{{{{zz||€~{{|~~}}‚‚|wtvz|~}}}}~|wtv{€€€€€€‚‚‚€€€€€~€€††„ƒ‚‚‚‚€€}}~~~~~~~~~~~~}}}}}}}}}}}}~~}}}}~~~~~~~~ƒ††…„…†‡‡ˆ†……‚€~zwwvvvvwwwwwwxxyyzz{{||||||~~~~~~~~}€‚‚‚ƒ‚ƒƒƒ‚‚~~€€‚ƒƒ‚€~~€€€€~€€|{{{zyzz{usv{~~€€€€€€€€}{{}}{{{}~€€€€‚‚€}||{zzy{}~€€€€€€€€€€€~~|{yxxyzz{{||||~€}{{|~~}}€‚‚|vtuz|~}}}}~|xuw{€€€€€€€€€€€€€€„ˆ‰ˆ‡……ƒƒƒƒ€€~~~~~~~~~~~~}}}}}}}}}}||}}}~~|~~~~~~~~~~~~~~€ƒ††††‡ˆˆˆ‡†„‚€|zwuuuuuvvvxxyzyyyy{|{|~~}~~€€€€‚‚„„ƒƒ„„„„ƒ‚~}{}€‚‚‚‚‚‚€€~~~~€€€€€€€~~‚€{z{zzyy{vvz{}~€€€€€€‚}zzy}~~}{{}~€€€€€}|{{zz{|~€€€€€€€‚||{{yyyyz{|||{|€}|||~~}}€ƒƒ{wuuz}}}}~~€~yvx|~~~~€€‚}€€€€€€€€„ˆ‰ˆ‡ˆˆˆˆˆˆ††ƒ~}~~~~~~~~~}}}}}}}}}}||}}|}}~~~~~~~~~~~~~~~€€€ƒ††††‡ˆˆˆ‡†„‚yvtttttuvvz~€€~}{{{|~ƒƒ„……†‡ˆˆˆˆˆˆˆˆˆˆˆˆ††††„ƒ€~|}~€€€‚‚‚‚‚~~‚‚€~~~€€€€€€~ƒ‚~{{{{zzyz||}~€€‚„„‚|zz~€~|zz}~€€€€€}|{{zzz|~€€€€€‚ƒ‚‚ƒƒ‚~{{z{yyyyz{|||{|€€~|||~~}}€ƒƒ{utx|}}}}~~€~yxy|~~~~~€‚ƒƒ|€€€€€€€€€„…†‡ˆˆ‰‰‰ŠŠŠ‡„€~~}}~~~}~~~~~~}}}}}}||||}}}}~~~~~~~~~~~~€€€‚‚„………†‡‡‡…„‚}xtstsrrsw|ƒˆ‰ˆ†‚€€€„…„‡ˆ‰Š‹ŒŒ‹‹‹‹‰‰ˆˆ‰‰‰‰ˆˆˆˆˆˆ…„‚€~~€€€€‚‚‚}‚€~~€€€‚ƒ€€~€‚ƒ~z{{|zz{{}}~‚ƒ†…ƒ€€€{zz}~€€€€€€€}||z{y{}~€€€€€‚„ƒƒƒƒ‚{z{zyyxzxz||||{}~€~||}}~}}€‚ƒ€zuuy{}}}}}~‚{y{|}~€„…„|€€€€€€€€€‚‚……††‡‰‰‰Š‰†‚€}~~~}~~~~~~}}}}}}||||}}}}~~~~~~~~~~~~€€€‚ƒƒƒ„………†…„‚~zwtsttx|ƒ‡‡‰ˆ††„…‡ˆ‰ˆ‰‰‰‰‰‰‰‰‰‡‡ˆˆ‡‡‡‡‡‡††‡‡‡‡††††„ƒƒ€€‚ƒ…‰‹Š„€€€~€€‚€€€€€€~€€}~€€{x{}}ƒ‚€‚‚€€~{zz}~€€€€€€€}||z{z{}~€€€€‚„ƒƒƒ‚€}{z{zyyxzxz||||z{|~||}}~}}€ƒ„€ztvz|}}}}}~‚{y{|}~€‚ƒ„|€€€€ƒ„†‡ˆ‰‰ˆ‡ƒ‚€€~~}|~~|~~~|||||||||}}}~~~~~~~~~~~~~~€€€‚‚„†††…†„€zvvw{…‡ˆˆ††……‡‰ˆˆˆˆˆ‡††……„„ƒƒ„„„„…………„„……‡‡‡‡‡‡‡‡††ƒ€€‚…‡ˆ†‡†‡‚€~~~~~€€€€€€~~~€€~{|}~€ƒƒ‚€€ƒ‚ƒ€€€€‚{z|~~~€€€€€€€€}|zz{{}€€€€ƒ„„„€€~}zzzyyyyz{{{{zz|}}{||{|{~ƒytvz|}}}}}€‚‚€}z|}~~~}}~€ƒ‚|€€~~~€‚ƒ…ˆŠŠˆ‡„ƒ}}}||||~~~|||||||||}}}~~~~~~~~~~~~~~€€~~}}‚ƒ„„…………‚€~~…†‡††……ƒ„…†††„„…ƒƒƒƒƒƒƒ„„ƒƒƒƒƒƒƒƒ„„„„……„„„„„„††…ƒ„†‡†…‚ƒ„ƒ€€~~~~~€€€€€~~€€~}|~~€}}}}}€~|}€‚ƒ€€€€€€€€~{z|~~~€€€€€€€€}|zyz{}€€€€‚‚€~}zzzyyyyz{{{{zz|}~~}{||{|{~ƒytvz|}}}}~ƒƒ€~{}}~~~}}}~€€}€€~~†‡ˆˆ‰‰‡…„€~}}}}}}}}||||||||||}}~~~~~~~~~~~~~~~~||}}€‚ƒ……‡‡†„„……†…„„„‚‚ƒƒƒƒ‚‚‚€€~~€€€€€€‚‚‚ƒƒ‚„„„„„„„ƒ„…†ƒ{}„‚€~~}€~€‚‚‚€€~~€€~}|{}}||‚€€€€‚‚€€€€~}z{~~~~~~€€€€€€‚€}}~}|}~€€€€€€€€~}~~~~}zzzzyyzz{{{{{{z{~~||||{||}ƒ€ztvz|||||~€„„€~}}~~}{{|~€€~~~~‚„†ˆˆ‰‰ˆ„}}}}}}}}||||||||||}}~~~~~~€€~~~~~~~~€€€~~~}‚„…†……†……„„„„‚‚€~||{{|||~€‚‚‚‚ƒ€€}}}ƒƒ‚‚‚‚€€€}z}„„€~}}}€}z{‚……ƒ€€€€€€~|||}~€~}~€€€ƒ……„ƒ‚€€€}|z{~~~~€€€€€€€€€€~€€€€€€||{}~~~}zzzzyyzz{{{{{{z{}}||||{||}ƒ€ztvz|||||~€‚‚€~~~~}{z{|~~~€€€€~~~~}}€ƒ„†‰‰‰…~{|||||{{{{{zz||||||}}~~~~‚€~}}~~~€€€€€€€ƒƒƒ„„……††„„ƒƒ„‚~{zyyyyyz|~€ƒƒ„„„„„„ƒƒ€}{{{{}}~‚ƒƒƒ‚‚€~}€„†€~}|~„ƒ~…ƒ€€€€~~~~}zz|}~~€€‚‚‚‚‚€€€€€€~{{|€€€€€€€€‚‚‚‚€€€€€€€~}{{}|~~|{zyzzyyy{{{{{{{yy{{||||{||}€‚zuw{|||{}~€‚~~~~~|zxz{}~€€~~~~}}}~€„‡‰‰†|z{{||{{{zzz{{{{{{|||}~~~~€€ƒ„†††ƒ~~€‚‚‚‚ƒƒ…„„„„„ƒƒ„„„„ƒƒƒƒƒƒƒ~|{zyy{{|~~€ƒƒ„„„…………„„‚~}}}|}~‚ƒ…„„‚~~‚‚‚…~~~{yz}€€€~}~~~€~€‚‚€~~~~~}}{||}|‚ƒƒƒ„ƒ‚~€€|{|~€€}~~~€‚‚‚€€€€€€€~}{{~}}}|{zyxxyyy{{{zzyyyyzz{{{{{||}€‚zvx{|||{}~€‚€~~~}zxxz|}~~~~~~~~~~~}}}}€…ˆˆ†zyzz||{{{zzzzz{{{{{|||}}~~~„†Š‰‰ˆƒ‚‚‚ƒƒ„„„„„„†…††…‡„ƒ„„ƒ‚€€€ƒ‚‚‚~}|}~€ƒ‚ƒƒ„„„„„ƒƒ‚~~~~€‚„†…‚~|€~~~}„„‚}|~~~}~~}}}~€‚€}~~~}}~~~€‚‚‚€€€€€}z{|}€‚~}}€ƒƒ‚€€€€€€€€€€~}||}|{zxwwwyzz{{zzzzyyzz{{{{|{{|~€~zwy{}||{}~€‚€~~}{xvx{|~~~~~~~}}||}}}}€…‰‰ˆ{yzz||{{{zzzzzzzzz{{||}}~~€‚…ˆŠŠ‰ˆ†…„„„„„„………†††††…„„…„ƒƒƒ€~{zz~‚ƒ……‡†„€~€ƒƒƒƒƒ„„„„„ƒ‚~~~~‚ƒ„„‚€~}€~~~~}wz~~€}|~||}~||{z{{{}~}}}|{zz{}}}~~‚~~~~€}z{~~~€€~~€€€‚ƒƒ‚€€€€€€€€€€€€~}~~€€€~|{zxwwwyzz{{zzzzyyzz{{{{|{{|~€~zxz{}||{}~€‚€~}{xwy|}~~}~~~~~~~~}}||||}}„‰‹‰‚{yz{{{{{{{{{yyzzyyz{|}||~~€ƒ††‰ˆˆ‡†ˆ‰‰‡‡ˆˆ††……„„†…„…………„ƒ€}|zwvuz‚ƒƒƒ…‡ˆˆ†„ƒ‚‚„„„„ƒƒ…„‚‚€€~~€‚ƒƒ„„}zwy|}}||~~~€|vtw|~€€|{~}|z{zzz{{{|~~}~{{{zyyxwz|}}}~€ƒƒ€~~~€€z{}‚€‚ƒ„„ƒ€}}}€€€€€€€€}||~€€}{yxxxxxz{||zzzxyyyy{{z|||||~|yx{||{{{}~€€}zwx{~~~~~~~~~~~~}}||||}}„‰‹ˆ{yz{{{{{zzzzyyzzyyz{z{||~~€ƒ…………ƒ…†ˆ‰‰ˆˆ‡‡‡‡††‡‡†…„………‚zwtsrruz‚ƒ‚ƒ„†††††…„„„„„„ƒƒ‚€€€€€€‚„………„€{trtxxwxyyzuxzy{}||{zzz|{||||zzzyz|||~}{z|{yyy{{zyy|}}~~}~‚‚€~~~€€zz}~€ƒ„…„€€€€‚ƒ‚€~{{|~€€€€€€€€}||~€€}{yxxxxxz{{{zzzxyyyy{{|}}}||}}|yy||{{{{}€}zwx{}~~~~~~~~}}||||}}€…‰‰„|{|{zzzyyyyzzzzzzzyz{{||}~€€ƒ„„‚ƒ„‡‡ˆˆˆ‰ˆˆ‡†ˆ†‡ˆ‡†‡†…ƒ‚~wtppqqquz€ƒ„€}„†……††„„………„ƒ‚€€‚‚ƒƒ„……………‚|vtsuvustuy{xx„€{xxwyz|{{zxyzxwyyxxz|||}{{{{}~}}~~~}~€€€€€€€~{{~‚ƒƒƒ‚€€€€€€‚„ƒ€}|||}€€€€~|{}~€€}{yyyyyyyzzzyyzzyyxz{||}}{zz}}{zz{|z{{{}€‚€€€~~}zwx{~~~~~~~~~~}}||||}}}„‡ˆ…ƒ}||{zzyyyyzzzzzzyxyz{||}~€€‚ƒ‚‚ƒ„…………„†ˆˆ‡ˆ‡†‡‡†…„ƒ€|vsrqqrrsvxƒ„}{}€ƒ„………………„‚€‚ƒ„„……………†…„†„~ywwtuvvustw|}||{}}}{zwvxz|{zxwz|~}}|{zz|||}||{|}~~~~~}}€€€~~~~€~€ƒ„„„ƒ~~€~|‚ƒ‚||{|}€€€€€~~}}~}}}{yyyyyyyzzzyyxxyyxz{||}}{{{||{z{||{{{{}€~~~~}zwxz~~~~~~~~~~~}}}}}}}|||||~€…ˆ††ƒ||yyyyyyyyyyyyyyzzz|}}~~€€€€€ƒƒ„„ƒƒ…†‡‡‡‡‡†††„ƒƒ~{wsssssrstux~‚„‚{z|~€€‚ƒ……†ƒ‚‚‚ƒ†‡††††…„………†…‚~zzywtuvussuyz|~‚‚~{{zyvvz{zxvsu{~~zz|zyzz{{}}~~~~}}|{}~~~~~€‚€‚‚‚€€|xvx€‚‚‚{zz{~€€€€€€€€~~~~}}~~|zxxxxxxzzzzyyxxwxyzz{{~~}|{|||{z{|z||{}}}~€~}}~~yxyz~~~~~~~~}}}}}}}}}}|||||}~………†…„‚|{zzyyyyyyyyyyzzz|}}~~€€€€‚‚„„†‡‡‡‡‡…„„„‚€~{xvttttttstuvx|„„‚||}}~‚‚ƒ…„„„‡ˆ‰Š‰‡‡ˆˆ‡†…„„„ƒ~{{ywtturqruvy|€ƒƒ€|yxwvtwywusqpqsux{|}}|{zz|||}}}|{|||~~~}}~€€€‚‚‚€€€€€€{sry‚‚‚{z{}~€€€€€€€€~~~~|||||zyyyyzz{{zzyyxxwxyzz{{~~}zy|{{{{||z|{|~{{}~}}}~~{yz|~~~~~~~~}}}}}||||||||||}}~€ƒƒ…ˆˆ†„€~{zyyyyyyyyyyyz{{|~}~~~€€€ƒ„„‡ˆˆ‰ˆ‡†…ƒ„ƒ€}zxvvwxvvvuuuuvvw|„„ƒ}€€‚ƒ„†…‡‹ŒŒŒŠ‰‰ˆ‰‰ˆ…ƒ‚€€€€|{zzwtuvuttwxz~€„‚{ywvtttsrrrssuuuuuy{}}~~}~€€€~||~~~}}}|~||~~~~~€‚€€€~}€€|st|‚„„‚{z|}~€€€€€€€€~~|{|||{yyyxyy{{zyyyyxwxyzz{{~~|{z{{{{{|{{{|~‚{{}~~~~}}~~|z{}~~~~~~~~~~}}}}|||||||||||}}|}€€‚…†‡‡„~{yyyyyyyyyyyz{{{|}~‚…†ˆ‰‰Š‰‰ˆ†…„‚€~{zxwuvwyyywwvvvvwwx{‚„„ƒ€~~€}{{~€„†††……‡‡††††ƒ~~}}|{|}zxwwtutv{|xx{}|zxtsuusolmrwwvvwvtvz~ƒ„‚€~€€~}||~€€~}~€~~~}~€€€€|y{}zvx‚„„‚}||}~€€€€€‚ƒƒ‚‚‚‚€~~}|zzyxyy{{zyyyyxwxyzz{{~~|zyzz{z{|{{{}€~xy|}~~}}}}zy}~~~~~~~~~~~~~~~|||||||{||||||||}}}}}}‚ƒ…‡‡‡ƒ}zyxxxxwwyyyyzz{|€ƒ…‡ŠŠŠ‰ˆ‡‡†…„‚~}|{yxxxxxxxxxwwwwwwwxy{~‚ƒ„ƒƒ‚}vuwxxwz|}„……ƒ~‚†‡„€€}ƒ‚}xvvvtwxwrpuxyzwustwwphhpvyxyyyxwy{~~ƒƒ‚€}{|~}€€€~‚‚}~{zz|~}€|{z{}||}~|z|€‚ƒ…ƒ~}}~€‚ƒƒƒ……„„„‚‚‚€}|zyyz{{yxxxxwwxz{zz|~{yyzzy{{{{{{|€zvy|~~}|wwy}~~~~~~~~~~~~~}}~~|||||||{||||||||}}}}}}}}}‚„‡ˆ‡}zzzzzyyyyyyzz|~‚ƒ…‡ˆˆŠ‰ˆ†…„ƒƒ€}|{zxyyyyyyyyyyyxxxxxxxyy{}€ƒƒ„ƒ‚}|xusrsuvvxz|||}}}‚‚ƒƒ„††‡…ƒ€€„‚}yuvvtrqrnknsw{zwtttuoecjswxz{{zyvx{{z~}{zz}‚ƒ€€€}}}~~}{zz{{|~~{zz{|||||€}~ƒ„…„ƒ€~~~‚‚ƒƒƒƒ‚‚€€€|{z{{yxxyxwwxyzzz|~{yxxyyz{{{{{|€~yvy|~~}{wvy}~~~~~~~~~~~~~~~~~||||||{{{{||||||}}}}~~}}}}€‚†ˆ‡…‚~|{{zzzyyyz|}ƒ†‡ˆˆ‡†‡†„‚€€|{zz{zzzzzyyzzzzzzyyyyyy{{z{{‚ƒ}wolotuqsyy{{z}~‚„ƒƒ„ƒƒ‚‚‚€~ƒ‚zwwuupklnlmpw}}xuttsoihlswy{||{{xwwwtx‚€|z{~‚€€€~{||}{xuvxz{}{xxx{|~}€‚€~€€„††ƒ€€€€‚„„‚ƒ‚€€€€€€ƒ‚ƒ}{zyyywwxxwxyzyz|~|xwwwy{{{zz|}€‚~zvx|~€~{vux}~~~~~~~~~~~~~~~~~||||||{{{{||}}}}}}}}~~~~~~€„‡ˆ‡…ƒƒ‚}}|||}~€ƒ†ˆ‡‡†…„‚€~}||||{{||||{{{{{zz{{zzyyyy{{{{{|€ƒƒ€~€€yrlinrrnpux|||~‚„ƒƒƒƒ‚‚‚€~}ywwunmiopnnrvsmmptusomptwy{||{{yxwvstxƒƒ}‚ƒ‚€€}|{{}}|}zyz{{x{~~€€‚€‚ƒ…‡„‚‚‚‚‚€€€}|~~~€€€~|zyyyyxwwxyzyz||xwvwyz{{zz|}€‚€|x{|~€€~yuvy}~~~~~}}~~~~~~}}||||||{{{{||}}}}}}~~~~‚†ˆ‡†‡‡††ƒ‚~~€ƒ„†‡†…„ƒ€~|}{{{{||}}|}||||{{{{{{{{{{zzzz{{{{|~€‚„ƒ€ƒ‚|smjlmrvux{}}}‚ƒ€€€}|ƒ‚zxvrmiglqttromlmquvtqoruwxz{}{zyyxvtppty}€€}ƒ…ƒ€€}}~}}~~}yx{{||€€€€€~‚‚‚ƒ„„„‚€€€€€€‚ƒƒ„„„„‚€~~}|{{}~~€|yyxxvvwzyy{|}€€|xwvvxzzzzz{}€‚{|}~~~|yvw{}}~~~~~~}}||||||{{{{||}}}}~~~~~~€‚„†††ˆˆˆ‡…ƒ‚ƒ„…†††„‚|zz||}}}}}}}|}||||||||||||||{{{{|||||~ƒ……‡„€~|ztlhikr|€~~€€€€~~}€||…ƒ€|yvohdelrvvtroooqruutstuwwwz{~|zwvxxwuuvwxww|€‚‚‚€€€€€€€~}}}{z~€€~€€€€€~~‚‚‚‚‚‚‚€€€€€€‚ƒ„††‡‡†„‚~}|zy{{|~€€~zvwwvvvxxyz|}€€|xuvvxzzzzz{}€‚€|}}~~~|yvx}}}}}~~~~~~}}}}||||{{z|||}}}}~~€€‚ƒ……‡ˆ‰‰‡………„„„‚~{{zz{|~~~~~}}}}|||||||||||||||||||}}||~ƒ…„‡ˆ†„ƒƒ‚€|unlmv€‚~}}€~}~€}z|…„‚|ytnf`emrtwwtrrssrtuusstustyz}}xtsuwxwstwwwx|€€€€€€€€€~~}||yz}}}€€~€€€~}||‚‚‚‚€‚‚€€€‚‚‚……†‡‡†„‚~~~|{zzyz|€|ywvvvvxxy{z}€€}xttwyzzzzz{€~}~~~~~~~}{ywy|}~~~~~~}}}}||||{{z|||}}}}~~~~~€€ƒ„†††………ƒ€}|{{|{}}}~~~~~}}}}|||||||||||||||||||}}}}€„„†‰ŠŠˆ†…„„€~{vtw}€€‚~}{{{|~€€~|z||y{€‚„…€ztnfcfmsvxxwwvuttuvwvwutqruvyywrqsuxvttvvwwz|}~€€€€€€€€€€~}}}zz|zwvtw{~}|~€‚‚‚ƒ€‚‚‚‚„……„„…ƒ~{{|}zyyxwy{~‚|yvvvvxxyz{~€}xttwyzzzzz{€}{|~~~~~~~}{ywy|€‚‚~~~~~~}}||||||||||||||~~~~~~~~~~}}~‚ƒƒ‚~|{{{}}}~~~~~~~}}|||{||||||||||||||{|~~~~|‚†‰ˆ‰‹‹‹‡……ƒ€‚„€zy{~~~‚~zyyzz}€€~{xz€†‡†€ztojegnruvvxxxutttwxyz{yusuwwvrporssrqrtuvxzyz|}€€€€€€€€}}}~~€~|xtns|€~‚„„„ƒ€€€‚‚‚ƒ„ƒƒ‚„ƒ|yyyyzxxxvvz}yvttwxxxy{~€€zustwyzyyxz}~{xz}}|||zwwy}ƒ…~~~~~~}}||||||||||||||~~~~~~~~~~~~}|||}~~}{{z|||}}~~~~~~~~}}|||{||||||||||||||{|}}}}~€‡‹†~„‹‹Š…„„ƒƒ…‡‰…}z{€€€|zyyyxz}€€€~|wtx‚†‡†ztojfgnruvwwxxuttvwxy|}ywuwxwtpnnooonorsuwyzyz{}€€€€€€~~~€€}zvtx€‚‚‚‚ƒ€€€€€€‚‚‚ƒ„ƒƒ‚‚€~zwwvwxwxxuvy{}€‚}xuuwxxxx{~€ytqtwyzyyxz}€}xwz|~}}|yvz‚……ƒ‚~~~~~~~~}}||||||||||||~~~~~~~~~~~~~~~~~|}}||||||}}}}~~~~~~~~~~~~}}|{||||||||}}|||||||||}‚‰‡z|€„…ƒ€ƒƒ‡Šƒ}|ƒƒ~|||zyvwy~}~|zurw€†ˆ‡ƒ}unkhhnsstuxywsqsuwyy||zxxyxvsommljgkmqtuxz{|{z{|}€€€€~}}ƒ„‚€~zvuy€‚‚‚‚‚€€‚„‚€€‚ƒ„‚ƒ‚‚|yuuuvvvvuvwwyz|~|ywwxxxx{€}xsrtwxyyyx{~}uu{}~€~}|{y|‚ƒ‚‚‚ƒƒ~~~~~~~~}}||||||||||||~~~~~~~~~~~~~~~~~|}}||||||}}}}~~~~~~~~~~~~}}|{||||||||{{|||||||||}…‚}z}xwz|yssx{xttx‚†ƒ~}|~~}~~{ywvyz{zwtqw€ƒ……ƒ}umkhjnstuxxwpjfgijmrsvwvvwwtqokgddhgkruxz{|}|{{z{€€€„…†…ƒ~}zwyz|}~}}}{wz‚ƒ€€‚ƒ„‚ƒ‚{wtsstvvvuuvwyy{~€€|wwwwwx{~€|wrqtwyzyyx{ysu|~€~}||„ƒ‚€€€€~~}}}}}|}}||||||}}}}~~~~~~~~~~~~~~~~~~}}}}||||||||~~~~~~~~~~~~}}}|||||||{{zz{{{{|||||}{z}zrttuvtuvspoont|‚|zxw{~€~}zwvvxyzwrry€ƒ„†‚}wolihlruxxwrg_]]\`joqsqrrtsrqmhdddijmrx|~~~}{z{}€|z|~€„†}ywwwywvsuz}}yw|€‚ƒ€€€€‚‚ƒ‚‚|yvssrsuuvutuwwxz}€~zxwwwy|~~zuqqtwz{yxx{€}vty}~~}{|€„„‚ƒ~~~~~~}}}}}}}|||||||}}}}~~~~~~~~~~~~~~~~~~~~}}}}||||||||~~~~~~~~~~~~~~}}}|||||||{{{{{{{{{{{{z{|zwxzwruz||zrnoonnt}}xvvz}€~}{xwwxyyxvvz€„……ƒ}xqnjimsvxvvpcTOOMWdorsqponllikjiggjmnosvz}~|zyz}€~{{|}„‡ƒ{ywx}~||~~|wvx|€€€ƒ€€€€€€‚‚ƒ‚‚|wtrrrsuuuttuwwxx|}€|ywvww{~~zuqqtwz{yxx{~€{vty}~~}{}‚ƒƒ‚~~~~€€~~~~}}}}}}}|||||||}}|~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}}}{||||||}}}}~~~~~~~~~~}|}|||||||{{zz{{{{{{{{{|}yvuzvnqwwz~~tqoopos|~vuv{}~}{zxwxxwwwxz‚‚ƒƒƒ~unjkpsuuuvqiTLNV_irttsqoifeefhigefmqrsuwz{{yxxz|~}|}|{}€‚†‰Š…|zwz}€|urrv||}~ƒ€€€€‚ƒƒƒ‚€|vtqqrstttstvvvwwz||}€~ywuvx{~yrpquxyyyyx{{uty}}~}|‚„„ƒƒ~}}}}~~~~~~}}}}}}}|||||||}}|~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}}}{||||||}}}}~~~~~~~~~~}|}|||||||{z{{{{{{{{{{{||xpnqplmrssw{ztqqqooq{€yvw{|}}~}|{yxxxvvuwy|~z}€ztpqtuuvttpka\[bhmqrpnmnnkigeccccgntttuxyzywutwz}}}~€…ˆ…„„‡ˆ‡ƒ{y{|~€€|yxtorv{€€€€€€‚ƒ„ƒ‚~{urqqrstttstvvvvvyz|}€zwwwx{~xrpquxyyyyx{~ysuz}}}|‚„ƒƒ‚€}}}}}}~~~~~~~~~~~~}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~~}}}||||||||}}}}}}}}~~}}||||{|}}||||||||{{{{|}|wohhklosqory{uprtsqu||wx||||~~||{zwvuttvww{{{}€zwvvututrnifbchopoljgfimqpmhe_Z[dpvxxxxxvsnmprw|‚‚~~}…Œ…~z{|}~€€€~€}vqpuz}€€~~€‚……ƒ‚}yurpqssssstvvvuuuvx{}€€|wvvx}}vqqrwxxxwxx{zttz~~}€‚„„ƒƒ~}~~||}}~~~~~~~~~~~~}}}}}}}}}}}}~~}}~~~~~~~~~~~~~~~}}}||||||||}}}}}}}}~~}}||||{|}}||||||||}}}}|}}xpkkjkmpmmpv|ytsvvtw|~|yz||||{|}|zywvtstuvvx||}~~|yxwvwwwtoljhkopolgb``chnpnjgc_`hrvxxxxurmhhnsvz~~‚ƒ~~~~~‚‡‡ƒ€}|~~€€€‚‚€ztqotwz{|~}€„…ƒ‚|xtqpqssssstvvutttuwz|€€|wvvx}~{uposwxxxwwy{~~xtvz|}€ƒƒƒƒ‚~{y{||||}}~~~~}}}}}}~~}}}}}}}}}}~~~~~~~~~~~~~~~~}~~~~~~}}}|}}||||}}}}}}}}~~~~}}}}}}{{{||||||||||||||||}zrljklmlghks{zxvuuvy}~}{{|~|z|{{{zzwvvsrruux|€}}}|{yxvvwtpnlnoqrpkd]XX]cjomidb^_fptuvxxtnhdfovwxyyz{~~~€€„‹””Šƒ~}~€€€‚€€}{sopqqty}‚ƒƒƒ|wtrqrrrrrstvvutsstwy|{wuvy|ztppswyxxxwy{~|urvx{‚ƒƒ‚‚{vy{{{{{||~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}~~~~~~}}}|}}||||}}}}}}}}~~~~}}}}||{{{||||||||||||||||}zrljlllgdfjqy}zywxxz}}|||{||z{zzz{zyxvussstty€}}}|{yyyyyvnjmoqqqokcZVW_fhecbaaacgnqrtuurlfadkruwzz{}{xxz}‚ƒ…‰‹‰„€~}~€‚‚€€€€zwvy|~€€‚ƒƒ€{wrpoqrrrrstvvutsstw{~zusuy|~ytppswyxxwwy|~zvtux‚ƒ‚{vuy{{{{{zz}}~~}}}}||}}}}}}}}||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}{{||}}}}}}~~}~~~}}||||zz{{|||}}}||||~~}}~~~{rkhkmkedhnr{€~{zzzz|}|{{||||{zzyzzzzywtsrrsv~€€~}|||yxyyxuoklopppmib[XZdc^VXY\^cgjmpqrstqkgcciouwz{|}|zwvy~€‚†††‡‡†ƒ€~}€‚ƒ€€€€~}~~~‚ƒ‚zupoopqqssstvvusssrv{~€€{vsuz}|wrnpsyyyyvvy{~ystw}‚ƒ}vrtz{{{zzz}}}}}}}}}||}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}||||}}}}}}}}}}||||{{{{|||}}}}}}}~~}}~~}skijkieflsv|~|}}z|}|{{||||{{zz{{zyywsqqrsv{€€|vuvwxupmljjlmnkf__iok[KNNOWagjkloqrqoiebcimrvz{|}}€€‚ƒ„‡†‡‡‡‚~ƒ‚~}}~~~~~‚}ytpoopqqssstuuussstx|€ytsuy||wqpqtwwwwvvy{|wsty‚‚yrrw{}{{zzz}}}}}}}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||||}}}}}}}}}}}||||||||||}}}}}}}}~~~~~}ukhhijgipuy|~~}~}||{{{{|}}{{{zz{||zxrpnorsx~‚}wrstvwtpiecfjkkhdhjlh\RKHHPZefbagopokgc``cgmv{|{{}„…†ˆ‰‰‰‰Šˆƒ€€€€~}~ƒ‚~}}}~€~~~~~~€€~|wsonoppqssstuuussstw}~xttvy{{vopruwwvvvvy{{wsw~‚‚zurrw{{zyz{|€}}}}}}}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||||}}}}}}}}}}}||||||||||}}}}~~~~~~~~ƒƒ|pjjkkoquy}~}||}€€|{{{}~||{{{yzzwtpnmnqqtz€~xrqqtvsohcdghg^_cjlmhaWQNMOYfaWW`imnkfb_]_bmu|}{{}€ƒ…†††‡ˆˆŠ‰Š†ƒ‚€€ƒ‚||}~€~~~~~~~~€~|xspmlmpqssstuuussstw}~wstvy{ztopsvwwvvvvy{{wu|‚ƒ‚‚~{wurrw{{zyz{~‚||||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||||}}}}}}{{}}}}~~}}~~~~}}~~‚‡‡vpnmovxz|~}{|}~~ƒ„‚}{{|}}}}|{{zyvtrqmjkoqqu{|zuqnorrqoheehlh]UXckig_WTVY^bi`WPYekjga_^\`dmv||{|„…†……†‡ˆ‰Š‰‡„ƒ„„‚€€ƒƒ}}}~~~~~~~~~€‚€}{wsollmprrrssttssrrvy~€|vssuz{xsopruwvuuuvx{yw{„„‚zvvrotyzzzzz}€„||||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||||}}||}}~~}}}}~~~~~~~~}}~‚†‰ƒ}xvvtux{}~}|}~€„‡‡…}}}}}}}|{zyxvsqnmlkmopqtwwxvuqpnnppqogbempm`VWYacd^YZ``_`d^ZPS`hcUSV]]`dnty~~|{}~‚ƒ‚ƒƒ…ˆ‰Š‰‰†„„„ƒ€€‚ƒ€}}}~~~}}}}~~€}{wsolkloqrrssttssrrvz€{vssuyzvqnoruvvutuvxzw{€‚‚€{xxzxx|~ƒ„||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}{{||||}}||||||||}}}}}}}}~~~~~~~~}||€†ˆ†€~~zzz|~~}{|~€‚ƒ†ŠŠ‡„€}}|~}||zyxvspnnonklorsrrqpqtrnkmopogcfkigdYQV\bca`bc_\XYVRQU^fcSJNY\`fnsx~~}}|}|~€‚„†ˆŠ‰‡††„ƒ‚ƒ‚€}{}~}||||}~€~{yvsojklopqrtttrssqrvzzsrsuyyupnpruuttstvxxz~‚‚‚€~||€€€‚ƒ„ƒƒƒƒ„„„„||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||||||||||}}}}}}}}~~~~~~~~~~€„‰ˆ†„‚‚€€~z}~}|~€€‚…ŠŠŠ‡…ƒ€~~}||zyxvromkmmkjnprrttqnoqqlklnmiegic]Z[UW[a`^\_fga\XTOTX]baWMOX_ekrvz}}~~}~€€€‚ƒ……‡‡††‡„‚‚…„€~~~~}~}||||}~€€}zxvsojjknoqrtttrssrtx|€€~ysrsuwwtonpruuttsuvvz‚‚‚‚‚„„„„„„„…„„„„„„„„||}}||||}}}}~~~~~~}}~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{||{{{{zz||||}}}}}}}}~~~~~~~~~~~~‚‡‡†…‚‚€€{z~~}~€€‚ƒ„ƒ„‰‰Šˆ‡…‚~~|{zxwtrnjklmjjlorrturmonjinoonlhiicYY\Z]aa^TOZiojbZXZ__`de[PT\dkqvz|}}~~~~€€€€‚‚‚‚‚‚…‡ˆ††ƒ„††‚~}~~}|||||~€€|{xurniijnpqrtttrrrruy}€€~yrqsuwvqnnpsutsstsvy‚‚‚‚‚ƒ………„†„ƒ„„ƒ‚ƒƒƒƒƒƒƒ}}}}||||}}}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~||{{{{}}||||}}}}}}}}~~~~~~~~~~€ƒ†ˆ…„ƒ‚‚€€zz€~}}~~€€‚‚ƒ…††ˆ‰†‚€}|zxvsqmjhjjkkkoqrtsqnmklprqppljjlf^[]abc`VMUalojb]^enmhig`Z]ckrwyz|}}}}€‚‚ƒƒ„‚‚„„†ˆ‡„„†ˆ…€€~~~}|||||~€€~{zwurniijnpqrtttrrrsvz~€}wrqsuvtpmnpsutsrstv|€„„……………ƒƒ‚€~}}‚‚‚ƒƒ}}}}|||||}}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~~~~~~~~~}}~~~~}}||{{|{{||||||||}~~}}~~~~~~~~~~~„‡ˆ…ƒ‚ƒ‚€}yy||{|yyy|}}€‚…‡†ƒƒ‚~~|{wqnmighjnonnqrttsomnrrppopljlke]]aefaYNS]gnnjgdbfooiiiaY[dnuxzz|}}}}~€„ƒ……ƒ‚‚‚ƒ…Š‹‰…†ˆ‰„€}~}||{{{~~|zywvspljknoqrtttrrrsw|€€|uqqsuvromnrsutsssvz€ƒƒ„„„„„„„zxz{|y{€‚‚€}}}}|||||}}}~~~~~~}}}}}}}}}}}}||||~~~~~~~~~~~~~~~~~~~~~~}}||{{|{{||||||||}~~~~~~~~~~~~~~†‰‡„ƒ‚ƒ‚€|{}|zyxwwwwy{||…†„„‚~}}{xqnmkiikoqsrsssstsrssqrrrppool_Y^ehe]UT^gloligecipkcbfc\]epvy{z|}}}}~~~~~~€€€‚ƒ„‡‰ˆ†‡ˆ†„‚€~}||{{{~~}{yxvvspljknoqrtttrrrty|€zuqqsuupmlnrsttsrry‚ƒƒƒƒƒ„„}{vqrtwz{y|€ƒ‚~~||}}}}||~~~~~~~~~~~~~~}}}}||||}}}}~~~~~~~~~~~~~~~~~~~~~}}}||||||||}}}}}}~~~~~~~~~~~~~~€‚…ˆ‡…ƒƒ€ƒ‚€€~|~|xxxxvvuw{||‚„…ƒ‚}|||zrnmlllmprvvvtttttuvtqrttrrqpi`[bkne[V\ejmnkgddgmmidegdbekruz|}}~~~~~}||{|~€€€€‚ƒ……†††‡‡…‚€~~}{zzz{}~}{zxxwvtqnllmoqsssrrrruz}yspqrttplloqtssrqu|ƒƒ‚‚‚‚}vsqomorxyz|„}{}}}}}}}}~~~~~~~~~~~~~~}}}}||||}}}}~~~~~~~~~~~~~~~~~~~~}}}}||||||||}}}}}}~~~~~~~~~~~~~~€€„‡‡…ƒ‚€€ƒƒ€‚‚€}{|zxxxxvvuvz|}~ƒ…„‚}|}|zrnmopoprtxxxwvvttvtsrsuusrqqj`_gnph__ejmnmjfefikkhiihffjmquz|}}~~~~~||{z|~€€€€€€€€ƒ„……ˆ‰‡„€~€~|{zz{}~~~|zxxwvuqnlmnpqsssrrrrvz~€~wrpqrtsommpstssrtz‚ƒƒƒ‚‚}wsponmlmsyz{~€ƒ‚~{z~~~~}}|~~~~~~~~~~~~~~~}}}}||||}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}||}}}}}}}}~~~~~~~~~~~€„ˆˆ…‚‚‚‚€‚~|z{yxxxxvvuvxy{|}‚„ƒƒ€}z{|yuomprtuvx{{{ywuttvurruuttrqrngekoolhilopnhgfeghffimlihkmprvz||}~}~~}}{{z{}~~~€€€€€€‚‚„†‡†„}~€}{{{{|~}|{zxxwvupnmmoqqrssrrruy}€~wrpqstqnlmpsssrsyƒƒƒ€~xsrponnmloswy{‚~{zy~~~~~}|~~~~~~~~~~~~~~~}}}}||||}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}||}}}}}}}}~~~~~~~~~~€…‡ˆ†ƒ‚‚€‚ƒ|ywxxwwxxvwwwtnlmx‚…„ƒ€}zyzzxroqsuwz}~~}|yxvvvuvvssqppoqokkoppmmnqqogaacbaaadjmmklnpqux{||}|}}}zzzzyz}~~~}}€€‚ƒ„„„„ƒ~€}{{{|}|{{zxxwvuqnmnpqqrssrrruz}€{tqpqstpllmpssssv|ƒƒƒyrppooonkjmqwz{}€‚‚€}zxx~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~€„ˆ‰†ƒ~~‚„‚~ƒ…}ywwvvvwyyyxxqmjjr€†„‚~y{{{ywtrtwz|~€yxwvvutsssponloqpprrommprqmd__aba``glonmnpprvy|}}}}}|{{{zz{{}~~~~}~€€€€‚…††~€}{zz{||{zzzxxwvuromnqqrssrqqruz}€€~ysqpqqqnkkmqssuv|ƒ„„ƒspoooomlkjnuwy|€~yxww~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~€„ˆˆ†„„€~~ƒƒ‚€€„„€{ywwvvvwxyxwurnmmp|……‚€€€~|zxuvwz|~€|{zxvvutsqnmnnpstuutpoprsrngcccdcdhloplloqrtwz|~}}}}|{{{zz{{}~~~~}~€€€‚„…‚}~|zzz{||{zzzxxwvuromnqqrssrqqsvz}~~|wtqpqqqnkloqssw{„„ƒ„‚wponnnnmlkjnuyz}€€~yxww~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}}|~~~~~~~~~}}~~~~ƒ‡‡†…ƒ‚}}€‚ƒ…ƒ€„{ywwvvuwxxutttrqmn{…†ƒ€€€€~|zxxxy{|~€~{yyyxvuutrooqsttvvwvtrqruuqjedeeefhnponoprsuz|}}}}|||{zzzzz{}~~}~~€€€€€€€~~~€~~{zxx{||{zzyyxwwtqonnpqssrqpqty|}|||vrppppomllortv{€‚ƒ…ƒ„~qnlnommlkkkntxz€€{yxvv~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}}|~~~~~~~~~}}~~~~†‰‡…ƒ}|~€‚ƒ„„„€}ywwvvwvvurrry{vtu}…‡„‚€€~{zzzzz{{|}~}|{zyxwvwvtsstuwwwxzzywstvvsokihfegipqppqrtuw{|}}}}|||{zzzzz{}~~}~~~€€€€€€€€€€€}~|zz{||{zzyyxwutqonnpqssrqpqty|}||ytpopponmlmpsux}‚ƒ„„ƒ~vllmmnmmlkkkovz}€€~zxvvv~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}||}}~~~~~~}}~~~~‚†ˆˆ…„€}|~€‚„„„‚~‚ƒ€}ywwvxwvuropsy|{}~…‡†‚‚‚€~}|{zzzz|||}~~~~|{zzyxxvvvvvwwyy{}}|xvvwwupnkihjlrqrrtwwx{||}}}}}|{z{zzzz{|~~~€€€€€€}}{zzz}{{z{{zxvtttsrpopqrrrrorw|}}|zuroooonmlmnprw|‚ƒ„‚zollmmmlkkjilrx{€€}yuutv~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}||}}~~~~~~~~}}~~ƒ‡ˆ‡…ƒ{{~€‚„…ƒ~}€ƒ€|xxxxxvsspmosw}€€††ƒ€€€€~|{{{|||||}~~~~|{zzyxyyxxwxxxz{|}}|zyvwwwurqomnosttvwzzy|||}}}}}|{z{zz{z{|~~~~~€€€€€€}{xy{}}{|||{{{zxvtsssrpopqrrrrrux|}|zwrpoooonmlmnptz‚ƒƒƒ{rmllmmmlkkjjmsy|€‚~{vuutv~~~~~~~~~~||~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}~~~~~~~~}}~~€…ˆ‡†ƒ€~||‚‚„ƒ€€‚ƒ€}yyzzyxurpmmrw|}{{ƒ†„€€€€€€€~~~|}{zyzyzyzxxwwxy{}~~~}{xwvvyywutrtvuwxz|||}~~}}}}}|||{zzz{{}~}}€||{xuuy~}{{zzzzxvtrrssqpprrrqqrvz|{{ytqoooooomkmoru{ƒ‚€yqmkllmlkkjiinuy}‚‚|xvvvvv~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}~~}}~~~~~~~~~~~ƒ‡†…„}|}}‚‚ƒƒ„‚~€|y{{|zxuqonqv{}~{x}‚‚€€€€€€€€€€€~|{zzyyxyyzyxwwxz{}~~~}{|z{zz{zyxxxyz|}}}}z|||}}}||||||{||{|~~€~||}|zxz}‚}{zzzzxvtrrssqpprrrqqsx{}zywsonoooomlkkns}‚ƒ‚€|tnkkllmlkkjiintx|€‚€{wuuuuu~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||}}~~~~~~~~~~~~~~~~†‡……ƒ||}}€€€ƒ„ƒƒ„ˆ„~€‚~zz}}{zxuqorvz{|{|‚ƒ‚€€€€€€€€€~|{zzywwyy{{yxwx|}~€~~~}}}}}||}|{z{~|z{yyz|}}||}}}}}}}}~~~~~~~€}}{{|{|€‚‚~zyyyxxwusqrtrqqsrrssvz||zxtrpnnnommkikov}€ƒƒ‚€€yrmklmmmkkkjjkou{}xuttttt~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~„†„ƒ~||}~€ƒ„ƒ…ˆˆ„~}€}ywx|}|zwsqrtwxx{}ƒ…„€€€€€€€€€€~|{zzyyyyy{{zyxxx{}~~~~~~~~~}}}||}}{yxyyzz|}}||}}}}}}}}~~~~€‚‚‚€~~}}{{|}}€}{zyyyxxwusqrtrqqsrrstw{||zwsqpnnnommkkmsz€‚ƒ‚€}vqlklmmmkkkjjlpvz|vtsssss~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}}~~~~~~~~~~~~~~€ƒ……‚€~|}}~€ƒ†‡ˆ„‚|{~€{vsty€~{yvsrquyz}€„„€}}{{{{zzxxxz{{xwwy}~~~~}}}}~{xxz{}~|~}|||}}}}}~}}~~~~‚ƒ„ƒ‚~}}{|{{}~€}|yzzxxywusqstrqqsrssu{{||zvroooooomlkjnxƒ‚ƒ‚zsnljkllljjjiimrv|€‚{vsrrrrr~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}}~~~~~~~~~~~~~~€ƒ……‚~||~}~€ƒ…†‡†‚~~}~€|wuvy~€€}{xurruz{}€~}€„€~~}}||{{zzzzz{{{xwvw{~~~€€~}}}}}||yxy{}€€~}|||}}}}}}}}~~~~€‚ƒ„„ƒ€}}|{|€€~|yzzxxywurpqrrqqsrstx{{{{xuqoooooomlknt{ƒƒƒ„~xpmkjkllljjjjjmry~€‚~yurrrrrr~~~~~~~~~~~~~~~~~~~~}}}{~~~~}}}}}}}~~~}}}}}}}{||||||||||}}~~~~€€~~~~~~€~|~€„„ƒ‚{||~~~ƒ†ˆ‡ƒ~~~|~€}xvwy}€~}{wuvy{y{}{xz‚‚€~~~~~~~~~~~~~~~~|{{z{zx{|{zyxxwy|}}~~}}~{zz|€‚ƒ‚€~}}|~}}}}}}}~~~~~~€„„„„ƒ}€€~€|{zzyxxwuqooprrrrrsw{||zyvspooooonlkknw~ƒ„„„|upllkkllmkkkijptz~€€€{xusrqqqs~~~~~~~~~~~~~~~~~~~~}}}{}}}}}}}}}}}~~~}}}}}}}{||||||||||}}~~~~~~~~~~~~€~~~€„…„ƒ‚||~}~~ƒ†‰‰…ƒ‚€€~|~€}usu{|~€|yyz|{xyyywx~€~~~~~~~~~~~~~~~~~}}}}|{y|}}|zyxwxz|~~}||}}~|{zz~‚„„ƒ€€~}}}}}}}}~~~~~~~~€„„„„ƒ‚€}|~~€|{zzyxxwuqooprrrrsuy{|{ywtrpooooonlknr{„ƒƒƒ~yspllllmmmkkkjkpv}€zvsrqqqsu~~~~~~~~~~~~~~~~~~~~~~~~~~||~~~~~~~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~~€~~…‡………|||~}ƒ…ˆ‰…„……ƒ~z}€|vsx{}}ƒƒ~}}}}zxxxxy}~~~~~~~~~~~~~~~~€~~€~~}{|}}||zzzzyy{}~€€€}}~~|zzƒ…„‚€€‚„ƒ€~~}~~~~~~~~~}~~|~€‚ƒƒƒƒƒƒƒƒƒ‚€€€|zyzzyxvtonoprrrstw|||zvvsqpooooonmlnvƒƒƒƒ‚€|uqomllmmmmkjjjnqw|€ytsrrpqvy€€~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~~~~€ƒƒ~„††…†ƒ{{~†‰ˆ†…‚‚††…‚y|~zvx|~|ƒƒ€}zyxyz{|~~~~~~~~~~~~~~~~€€€}}|}~~}~}|{z{{z{{}~}}}}}~~}{{€ƒ…ƒ€€‚‚€€~~}~~~~~~~~~}}}~€‚ƒƒƒƒ…‡„„‚ƒ………„ƒ‚€}|zzzyxvtonoprrrsw{}}{yussqpooooomknrz€‚‚ƒ‚xsqomllmmmmkjjkosz~€|wsrrrrtx{~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||{{||||||||}}}}~~~~~~~~~~~~}……††……‚}|„ˆ‰…‚€‚†‡†„xx€~yy||z|€‚ƒƒ€~~zwxyz{}}}}}}~~~~~~~~~~~~€€~||||~}}~~||||||z{||}|||{}~}}||}……ƒ‚‚‚€€~~~~}}~~~~}||‚‚‚„ƒƒƒƒ„„„„‡ˆŒ‹‰„||zyxwtpopqqrrvy|~|{xurrqonnnmmklov~‚‚‚}urpnllmmmmmmiimqx}€{vsrrtvx|~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||}}}}}}~~~~~~~~~~~}€ƒ††ƒ‚„…†‚|…‡ƒ||„…†„uv}‚{{}}zy~€‚‚€~~|zxyz{}}~~||}}}}}}}}~~~~€€~}}}}~}}~~~~}}||{{{{{{{{z|||}||}„„‚}|}€€~~~}}~~~~}‚†…„ƒ€‚ƒƒƒƒ‚‚‚…ˆŠ‹ŒŠ‡††ƒ€|yywtpopqrrtx{}~{ywtrqppnnnmmklqz€‚‚‚~ztromllmmmmmmiimry~yutssvy}€€€€€~~~~~~~~~}}}}~~~~||}}}}}}}}||||||||||||}}}}}}~~}}~~~~~~~~~~€‚„…†€‚…†„~ƒ„€zz}~€€ƒ‡†~usy€€}{~|{z{‚€{zyxz{}}~~|z||||||}}~~~~~€€€~}}}~~~~~}}}~}|||||z|{{zz{{{{}~„„‚}|}€€€€€~~}~ƒƒ€~~„„„„ƒ‚‚„ˆ‰‹ŒŠ‡……ˆ‰…~{xwspooqqswy}}|ywusrpooooonmlms|‚‚‚€~xsqolllllmmmmkjns{€€}yvtrsw|€€€€~~~~~~~~~}}}}~~~~~~}}}}}}}}||||||||||||}}}}}}~~}}~~~~~~~~~~€‚„…„~„……ƒƒ‚}z{}}}††~usy~~{z{€€€~~|{{zz{}}}~~}||||||||~~}}~~~€€€~}}|}~~~~~~}~}}}|}}}}|{zzzz{{}~‚‚€~|}~‚‚ƒ‚€€€€€€€€€€€}||ƒƒ„„„‚‚„‡ˆŠŒ‹‰…‡‡‡‡‰ˆ…ƒ|wtqpqrsuz|~}{xvsrpqonnmmmklov~‚€~xqomlllllmmmmjjou|€€}wttsv{~€‚~}~~}}~~~~~~~~~~}}}}}}||||||||||}}}}~}}~~~~~~}}}}}}~~~€‚„„„€€„†…ƒƒƒ„{{{|~‚‡†}svy‚€€~|z}~€€~}}~}}{z{{|}€ƒ‚|zz||}}~~~~~~~~}~~~~~~~~}}}}}~~}|||~~|{{yzz{{|~~~~ƒ„„ƒƒ‚€€€€€€€€€€}}}€……„‚‚‚„………ƒ‚‚‡‰ˆ‡ˆ‹Š‡€ysrrsqty}~}{zvsrqqppnnmkkjkqz€€€€€}wqonlmmmmlllkkkou~€{trtux|~}~~}}}}~~~~~~~~~~}}}}}}||||||||||}}}}~~~~~~~~~}}}}}}~~~€‚„„„€€ƒ…†………†ƒ}z{|ƒˆ†tqu|€€~|z{}~~|{z|}~|{{|}ƒ‡ˆ‚{zz||||}}~~~~~~}~~~~~~~~}~~~~~}||||}~~}|{{{{|~}}}€‚‚„„„ƒƒ‚~}€‚ƒ‚€‚‚‚€€}}~€‚ƒ„††„‚‚‚ƒ‚‚‚„„††ƒ‡ˆ‰ˆ‰ˆ‰‚yusqqv{~|ywsrpqqppnnmkkjmt|€€€}wponlmmmmlllkkkrx€zutvy{}€~€€€€~~~~~}}}}~~~~~~~||||||||||||||||||}~~€~~~~~}}}}}|}}}}~‚…„‚€€„††……ˆƒ~z{}„‡…xxy~‚€€}{}}}{zxxx|~}}}~ƒ†‰‹ˆ{zzz{{{{}~~~~~~~~~~~~~~~}}~~~|~}~~€€€~|||}}|~~€ƒƒ‚ƒ„}{zƒ†‡†††‡„€€~|}~€€‚††„‚‚ƒƒƒ…†…„ƒ……‡ŠŠ‡xtrrz}€{yvqppqqpponnllknw€€€~woommmmmmmmljimsz€€~ytuxz~‚~{€€€€~~~~~}}}}~~~~~~~||||||||||||||||||}~~€~~}}}}}|}}}}~€ƒ„‚€€„„†††}xy}†ˆ‡ƒ~~~€€€€~}}}{zxvtuy|}‚…ˆ‰ŠŒ‹…|{zz{{{{{}~~~~}}}}~~~~~~}}||}~~~}~}}|}}€€€~||||}~‚ƒ‚‚‚‚„|z|~€‚ƒƒ„†‚€|{}~€„……‚€€‚‚ƒƒ„…„ƒ€€||Œ—Œˆ{z{€~zwtpppqqpponnljinw€‚‚€€{tonlmmmmmmmljinuz€~}xux|€€{x~~~~~~~~}}}}~~}}}|||||||||||||{{|||~~~‚‚ƒ~}}}}}||}}~~}‚ƒƒ€€€‚ƒ………„€~|}…†‡…~~}~~}|}|{ywtttvx~‚„†ˆ‰‰ŠŒŒ‹‚{zzzz{||}~~~~~~~~~~~~~~}{{y||}~~~~~}}~€€~|{{{|~‚ƒ‚€€‚ƒƒ~}}|~ƒ~~{|~~€‚…ƒ€€‚‚‚ƒƒƒƒƒƒ‚‚€}€‹ŽŒ‘Ž…}{|zyvrooqqqooonmkhjpzƒ€|unnlmmmnnnmkikow}€€{vvy}€€~wv€€~~~~~~}}}}}}}}||||||||||||||}}|||~~~€ƒ„ƒ‚~}||}}}}}}~~€‚ƒƒ€€€ƒ„„„…††‡‡ˆˆ‡…ƒ}}}~~€~|{{{yvursrtw|€‚„‡‰‰‰‰‹ŒŽ‰{{{||||}~~~~~~~~~~~~~}|{|}~~€€~~~~€€~|{zz|~ƒƒ€~~€‚ƒƒ}|||}}}‚‚€~}~{|~‚…ƒ€‚ƒƒƒƒƒƒƒƒƒ„„ƒ‚„Š‘‹†ƒ~zyyyxyxwsqoqqqooonmkklt}€‚€{rmmlmmmnnnmjhkrx}€€{xy}~€€€xtu~~~~~~}}}}}}|}||||||||||||||||||~~}}„………}|||}~€€ƒ‚ƒ‚€€€€€‚„„……‡ˆˆˆˆ‡†„~|~~~~}{zzzwvtsqqqtx|‚‚…‰‹‹ˆ}{|}|}}~~~~~~~~~~~~~}}}~€~~~~~€~}}{xz{€‚|}~€„„~|{|}{{|€€}||~‚…†ƒ€ƒ…………ƒ‚ƒ……………„†ŠŽ‰‚}{vs|€€|tv}{tqpqpomnmmkjms€€zqmmlmmmnnmliiltz}€~zy{~€}tsu~~~~~~}}}}}}|}||||||||||||||||||~~}}ƒ„……ƒ||}€‚‚ƒƒ‚‚ƒ‚ƒ‚€€€~~€ƒ„ƒ€„‡ˆ‡…„~|}~}~}|zyxxuutrsrqsv{‚‚†ˆ‰‹Œ„|{||}}~~~~~~~~~~~~~~€€~~~}}}}||}~€~}}{yy}€~}{|}€ƒ‚€~}~}}~€€€~~}||~‚…†ƒ€€‚†‡‡……ƒƒ…„„„„…†ˆ‹Œ†~vqq|„ƒ}wy|wsqqpomnmmkinw‚‚€€xpmmlmmmnnmliinu{~€~||~€€€€~xssw~~}}~~}}}{||||||||||||||||}}}}~~~~~€‚…†…}|~€ƒ„„„††………ƒƒ‚„ƒ}}‡ˆ…„„~|||}}|zwvxvtuusssrsvx|€‚ƒ„†‡‰‹ŒŽ‹|{|}}}~~~~~~~~}}~}}}}|}|{zxz{|}{zz|€€~{||{|~ƒ†ƒ€€€~€€~}{}‚ƒ…„‚„ˆ‰ˆ‡…„†††……„„…‡ˆŠ‡}uos}ƒ€~~vv|zsrpppnmkkjpy€€‚€€~wpmmllkmmmkjhinv|~}€€€€€€zqru|~~}}~~}}}{||||||||||||||||}}}}~~~~~€‚…†‡ƒ~‚„…„„……„„„‚‚€€€€€‚ƒ~z}‡ˆ…„„}{}}}}|zzyvtsuvutttuvxz|€‚ƒˆ‰‹‹ŽŽ‰~}}~}~~~~~~~}}}€€~}||{|{{{{|{yzz}~}{zz|€€~{|||~„†„€€~~€€~~}~€‚ƒ…„‚„ˆ‰ˆ‡…„†††…………††ˆŠ‡€vqqy}|z~|||~|yspppnmkkkqz€‚€{uommllkmmmmlgipx}~€€~~€€€}vqty}~~~~~~~~}}||||||||||||}}}}}}}}}}~~~~~~„…†„„„†…ƒ……„„ƒ‚~€€€€€ƒƒ€|}‡Šˆ‡†‚~~~}{{zzxuvvwwvxuvyy{{}€…‰Š‹Žˆ~}~~~~~~~~}~€€|{zz{z{{}~~~}|{|}€~{xz}€|z{|}~€„†ƒ~~€‚‚‚€~}|~€‚„…„‚„‡ˆˆ‡†…†‡‡‡††………†‰†„}tuy|€€‚ƒ€~vpppnmljkr}€€|rlmmllllmmljhkty~€}vrtx|}~~~~~~}}||||||||||||}}}}}}}}}}~~~~~~~‚„……„‚„…„‚‚‚€~~€€€€€€€‚ƒ‚~|€‡Šˆ‡‡…€}|{{|||yxvuuvxz{{{||}„‡‰ŠŒŽ‡€}~~~~~€}{zyyzz{|~€€€~}~€€€~{xz}€|yy{|~€…†‚~~~€€~~}|}‚„…„ƒ†‡ˆ‡ˆ†„†‡††††††‡‡‡…‚||~‚€€‚„ƒƒ‚€~uppnmljkr}€€|tnmmllllmmlihltz~€zutvz{}€€~~~~~~~~~~~~}}}}|}{{||||||||}}}}}}}}~~~~~~~~}€‚†……†ƒ„ƒ‚€€€€€~~~€€€€€€€€‚ƒ~}€‡Š‰ˆ†„ƒ€|{zz|}}zxuttuyz||~}~€€€€‚…‡ˆŠŠŒŒŒ‡~~~€~~~€~|{yyxy{}}€€ƒ‚‚~€€€€zw{}~zwyy{‚„„~}}~€~||}~‚„ƒ‚€„†‡ˆˆ†ƒƒ††††…‡‡‡ˆˆ…‚€}|}‚€€‚…†„€zroonkkms~€‚€€}uollllkmmmmjjmw}€~}~€~wtuxy{~~~~~~~~~~~~~~~~}}|}}||||||||}}}}}}}}}}~~~~~~}€‚„…†„†ƒ‚€€€€€~€€€€€€€€ƒ€‡Š‰ˆ……„ƒ€}zxxxz||{xusrsvz||~€€€€‚†ŠŠ‰‹ŒŒŒŒ†€~~~€€~~}|{zzyz|}}~~‚…‡†…ƒ€€~~|{}~€~zwyy{‚„„~}}}}~~}||}ƒ…„‚€ƒ„‡ˆ‡††…††††…‡ˆˆ††…‚€ƒƒ‚…………ƒ‚}uponkkmv~€‚€€}tnllllkmmmmjiow}€~}~€ysuvxy{~~~~~~~~~}~~~~~~~~~~}|||||||||||}}~~~~}}}}~~~~~~~~€„†††„ƒ€~~~€€~~ƒƒ€†Š‰‡†…„{wvuuvy{{{wusssuy{}~€€~|€…ŠŒ‹‹ŒŒŒ‰„~~}}~}||{{{|}~~~‚‡‰Š‰‡…ƒ€~~||}€}xvwy|‚ƒ„~}|||~~}}{{}ƒ……„‚‚‚ƒ„†‡††„……………†ˆˆ†…„‚‚‚ƒƒ„„‚ƒ††……„‚€zspnkjnx€‚€€|umllkkmmnljijqy|~}}~€‚‚}xuxyyy{~~~~~~~~~}~~~~~~~~~~}|||||||||||}}~~~~}}}}~~~~~~~~€ƒ…††…„‚~~~€€~}~€‚‚‚ƒ‰Š†„€{xrooruy{{{yvsssuy{}}}~€€|{|†Š‹‹‹‹‹‹Š…€€€‚~~~}}|||{{||}}ƒ†ˆˆŠŠˆ†„‚€~~|}€€~yxyy|~€‚„„~~}}~~}}||}‚ƒƒ„ƒ‚‚‚‚‚ƒƒ„†‡‡…ƒƒ………†‡‡…„„ƒƒƒ„„……†‡ˆˆ‡…ƒƒƒ‚{wtqpsz€‚€€|slllkkmmlkjhks{}~}}~€‚zwvyzyy{~~~~~~~~~€€~~~~~~~~~~~~}}}|||||||||||}}}}}}~~~~~~}}~~~~ƒ„……‚€~~~~~€€}|…†‚|}|xqnoty|}}zzvwvwyz||}€|{|}„ˆ‰Š‰‰ˆ…€€‚€~}}}}||{{{{}ƒ…‰‰ŠŠŠ‰Š…„~}}}|}|zwxx{~‚ƒ‚‚~~~~€€~|}~€‚ƒ‚‚‚ƒƒ‚‚‚„‡…ƒ„„„……††……„ƒ„„……††††††††„„ƒƒƒ‚€}{yy~‚€~{rnkkklmmlkjimv|~~~‚‚{wuxzzxxz~~~~~~~~~~~~~~~~~~~~~}}}|||||||||||}}}}}}~~~~~~}}~~~~‚ƒƒ€~~~~~~~€‚‚|€‚€ƒƒ~xrorvz~~~~|||||}~~€}|{z|}~€„ˆ‹ŒŒˆ…€~~}}}||}}}~€‚„…ˆŠŠ‰‹‹‰ˆƒ‚€~||}}€€|zwxz}‚‚ƒƒƒƒ~~€€~}‚„‚ƒ………„„„‚‚‚~‚„…ƒ„…„……†††…„„………………††††††……„„„ƒ„„‚€‚‚‚‚‚€~{rnkkklmmlkihmw}~|}‚‚{wwyyywwz~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||~~~~~~~~~~~~}}~~~~~~~~€€€€~~~~~~€€~}}}}}~~|}€ƒ‚„„„ƒ}vpqvy|}~~~}~€‚‚‚~}|{{||{|€‚…ŠŠ‡„€‚€~}||{{{||}€„„…†ˆ‰ŠŠŠŠ‰†ƒ€€~||}€€}|zxy{~€ƒƒƒ„„ƒ€~~~|}€ƒƒƒƒ„„ƒƒƒ…„ƒ†ƒƒ€~ƒ…ƒ„„……†…………ƒ‚ƒƒ……„……†‡‡‡‡‡‡††††„„„ƒƒƒ„„„„‚€€yrnkkklnnlkgipx~}}€}zwyyyxvvz~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~}}~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}~~ƒ‚~{~€ƒ„„ƒƒ‚}usux{|~~~~€€€€€~}|z{{||{|}€€‚‚€€€~}|{|{{{{{„†‡‡‰‹ŠŠŠŠ‡„€~}zz|}€€~||zxyz}}}€‚‚‚ƒƒƒ€~~~~€ƒƒƒƒ„„„„ƒ……††††……‚‚ƒƒ„„……†ˆˆ†~€€€ƒ†………………††††„„„ƒƒƒ„„„„„‚€€yqlkkkllllkikqy}~}}€€|yxyyxwvvz~€€}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~}}~~~~}~~~~~}}}}}}~~~~}}~~~~~~}~~~~~~~~~~}}}}}}}}}}~‚€}z}„„ƒƒƒƒzsrvyz}~~~}|{{{{{zzz|~}~‚‚€€}|z{{{z{{|€‚†ˆˆ‰‰‹ŠŠ‹Šˆ…~|zyz|~€€~|z{yzzz{}€ƒƒƒ‚€€€€~~|}€‚‚ƒƒ„„ƒƒ………………„„„„„„ƒƒ„††‡†…€yux|}~€ƒ„…‡„………„……„…„„„‚„„……„„ƒƒyqmkkllllkjilt{}}}€€‚|yyzzxvvvy}€€€~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~}}~~~~}}~~~~}}}}}}~~~~}}~~~~~~}~~~~~~~~~~}}}}}}}}}||~‚‚{z}‚„ƒ‚„„xtuxy{}{|}}~}||{{{zzz|~}~€‚‚‚€~}|{zzz{|}~„‡ˆˆˆˆ‰ŠŠŠ‰‰‡ƒ}zyz|~€€}}{|{zyy}€‚‚‚€€‚‚€~€€‚‚ƒƒ„„ƒƒ„„……„„„„„„ƒƒ„„†………‚}tnpx}~~}~~€ˆ‹Š†…†„„‚‚ƒ„„……„ƒƒƒƒ„„„„ƒ}tnllllllkjimu|}€€€|yy|€xtty}€~~~~~}}}~~~~~~~~~~|}}}}}}~~~~||}|}}}}}}}}~~}}}}}}|}~~}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~||}}||||}}}~€‚~xy~ƒ„„„„ƒ~ww{yy}€zy||}~€~}}}||{{zyz||€~}|{zz{z~€‚‚ƒ„††††ˆ‰Š‰‰‰ˆ†ƒ|zy}~~~~~}|zy{~€€‚‚‚‚ƒƒ‚‚‚‚‚ƒ„ƒƒƒƒ„„ƒƒƒƒ„„„„„„„†„ƒ€~zrnntz~~}}~~‡ˆ„„„„„ƒ€ƒ„†ˆ†ƒ€ƒ„„……ƒ€ysonmmmmkihnw~~}€€€{yy}„ƒytty~€~~~~~}}}~~~~~~~~~~~~|}}}}}}~~~~~~}|}}}}}}}}~~}}}}}}{}}}}}}}}}}}}}~~~~}}~~~~~~}}~~~~~~~~~~}}||||}}}~~‚€|xz~‚ƒ„„ƒ‚~~{z|~|z|}~~€~}}}||{{zyz|}€~}|||{~€‚‚‚‚„………†‡‰‰ŠŠ‰‰†‚}zy|}||~~~~~€€‚ƒƒ‚‚ƒƒ‚‚ƒ„ƒƒ‚‚ƒ‚‚‚ƒƒ„„……„„ƒ„‡ˆ…~usu{{}}y{~~Œƒ~‚ƒƒ„‚€ƒ„†‡ˆ‡‚€ƒƒƒƒ„ƒzsponmmkiipx~~}€‚€~zzz~„ytty~‚€€~}}}}~~~~~~~~~~~~~~|}}}}}}~~~~~~~~~~~~}}}}~~~~}}~~}}}}}}}}}}}}|||~~~~~~~}}~~~~}}}}}}}}~~}}}}||}}~‚‚€{xz~„………ƒ~{}}}~~}}|||||{zy{~€€€~~~}}}|~‚ƒ„…ƒ‚‚€€‚„††ˆ‰‰‰‰Š‰ˆ„}{||}}~~€~~~€€€€€‚ƒƒ‚‚‚‚ƒƒƒƒ‚€€‚‚‚‚„„…………„…ˆˆ†}sw}~~||~ˆŠ€zzz}€‚‚~~ƒ†‡‡ˆˆ}~‚‚ƒ„„ƒ‚|vronmjhhqz~}€zwxzƒƒ{wttx|‚€€~}}}}~~~~~~~~~~~~~~|}}}}}}~~~~~~~~~~~~}}}}~~~~}}~~}}}}}}}}}}}}|||~~~~~~~}}}}}}~~~~}}||}}~~}}}}}}}}}}‚|xx}‚„„„ƒ|~‚‚}~~}||||{{{|€€~€~}~~}}}|~~„†‡…„‚€€‚……‡ˆˆˆˆ‰‰ˆ…|||}}~~€€€}}~€€€€€€‚‚‚‚‚ƒƒƒƒ‚€€‚‚ƒƒ„„……†††‡ˆˆ…€uw|~~yy~ƒ‹‡zyyyyz{~‚‚€‚‚‚„ˆ„€}}€‚‚ƒ„„ƒ‚~xtqnkglv{€}{x{‚}wustx|‚‚€€~~~~~~~~}}~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~}}~~}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~}‚€|xz}~„…„‚€€~€‚€~€€~~}}{zyz~€€~~~~}|}}}}}€‚…‡…„€€€„…††ˆˆˆ‡‡‡…„‚}|}}~~}€€€€€‚‚‚~||€€€€€€€‚‚‚‚ƒ€€€€€‚‚‚„„„„††‡ˆ‡‡†‚yw{{{xz…„zwvwyyyyy|~}{}~€ƒ…‡‡}|‚‚„„„„‚~ztolkmu}€€€€}zx|‚xrqssw|‚‚€€~~~~~~~~}}~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~}}~~}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}‚}zy{}€‚„„€|{}~~€€~~}}{z|€€€}}|{|||{}}}||€‚ƒ‚€€€ƒ„……†‡‡†„……‡†ƒ€~~}}~€€€‚‚‚~|}€€€‚€€€‚‚€€€€€€‚‚‚‚‚ƒƒ„…„„‚}wzzwu{‚‚|vuvwvvvvuqqszƒ„†††‡†ƒ~{~€€ƒƒƒ‚ƒƒƒ€{umjpx~€€€€|y{}vttspty‚‚}}~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}}|}}}}}}}}}}}}}}}}}}~zxy}€€ƒƒ€€}{|}~~~~~~}|{{€€~~~~{zy{||~~~~~~€€€€„„„„…„„„…‡ˆˆ†„ƒ~~~€€€ƒ‚€|}€‚„ƒ~~€€‚€€€€€€€‚ƒƒƒƒ‚€€‚~ywtrrz€}vtttutttuokrz„†………‡ˆ‡†‚~~~ƒ„‚‚ƒ‚‚€zqnty}€€€€€||y}‚ysrrqoty‚‚~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~}}}}}~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}}|}}}}}}}}}}}}}}}}|||{vx|~‚‚€}|}~~~~}}~~~||}€}~~~~}{||{|{}~~~€€~~~€€‚‚ƒ‚‚ƒƒƒ„…†‡‡…„ƒ€~€€ƒ‚€~€ƒ††…‚€~€€‚€€€€€€€ƒƒ„„„ƒy{|~~{uqqryzutttuuvtnlt|~~€…†……‡ˆˆ‡…€€~€‚ƒƒ‚|vsuz}€€€€~||€{vsssnnuz‚€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}||}}}}}}~~~~~~~~~~~~~~}}~~}}}}}}}}}}}}||||||€€€€€}yxz|‚‚}||~}}~~~|}~}}~~}}|z{zz{||~~~~~}~~€‚‚‚€‚ƒƒ„†‡††„„ƒ€€‚€‚‚„†‰ˆ…‚€€‚‚ƒ„€€‚ƒ{wy|}~€€‚€zposz{xuttuuttojq{~~~~€††††‡‡…ƒ‚€€€|y~€€‚‚zuw{~€€~}~„€{vssurlksx‚€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~||||||}}|~~{zz{~€‚}{{|~~~~~}~~}}~}}|{{{zz|~~‚‚~}~~€‚‚‚€€€€ƒ„†‡……„„ƒ„„„‚€€‚~‚„…‡‡†‚€€‚ƒ„ƒ€€€€‚„ƒ€~€€ƒ‚„„sprz{wtttuuuqkr{}~~~~}€†††‡‡…„„€yty}€‚‚€|xy|~€~‚‚|vssssqkmv{€€€€~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~}zzzxyz|~~€zvy}‚‚€{z{|}~}~~€|}}~{z{~~|||}~|}~€~~~~€€€€ƒ„„„‚ƒƒƒ„††„‚‚€€‚€~€‚ƒ††…ƒ€€€€„…„‚‚ƒ‚ƒ…„„ƒƒƒƒ‚ƒ††xssz{wuutturlly~~~~~~~‚‡……††„€€€zpsx}€‚}zz|€€€€~€~|xusqrrmjmw}€€€€~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~}zyywwxy|~€}zz|€€{z|}}}||~~~~{{{zz{|||||~~}}|}~~€~~~~€€€€€€€€€€‚‚‚€ƒ…………ƒƒ‚‚€€€‚€~€‚ƒ††…ƒ€€€€€ƒ„ƒ‚ƒƒƒ‚ƒ…„„„„ƒƒ‚ƒ……‚}wuyyvtttttojr}~~~~~~~‚…„‚„„‚€€€{qpt{|{{}€€€€~€|xtqqqqrqsx}€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~€€€€~~~~~~~~}}}}~~~~}}~~~~~~}~~}yxxvwwxy|€€€zx|€|y{{zzy}~}}zzxyzz{{||}}€}|}€€~}|||}€€€€€~~~~~‚ƒ„„ƒƒƒƒ~€ƒ‚€€‚€‚†……ƒ€~€€€‚„ƒƒ‚‚‚‚„…„„……„ƒƒƒ‚‚ƒ€zxyyustutrjlx}~~~~~~~„€€€€€‚€€|sqrx}}|}€€€€~€|xxxwustyxz‚‚€€€€~~~~~~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~~}}}}~~~~}}~~~~~~}~~}yxxusstvx{|~€€€}||}}zxxz|~~~|||{zyxxz{||}~~}}}~€€~}||||}~~~~~}~~~~€€€‚‚‚€€€‚ƒ‚€€‚ƒ†…ƒ€~„‚‚„ƒƒ‚‚‚‚‚„„„……„ƒƒƒywyxtsssrnirz}~~~~~~~€€„„‚€€{qpquz~~}|}€€€€~|xwy}€~~€‚„„……~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~|zzvtqrrvwy}~€€~||{zz}€~~~||{xxxy{{{{|}}~}}~~~€~}|||}|||}~~||}}}}}}~~~~~~€€€€€€€€ƒ„„ƒ‚€‚‚€ƒ„ƒ~~}~~}‚ƒ‚ƒƒ‚‚„„‚‚ƒƒ„„„„„„‚€€~xvxwusssqkku}~~~~~~~~}~~€„†ˆ„ƒƒ€€uoquw|}}}€€€€€{xuw{~‚„ƒ‚‚„„……†~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zzwtqqqrvy||€€~|{z|~€€}}}}{yxwwx{{{{||~~}}}~~}~}||{|{{{|||||||}}||}~~~~~~~~~~€‚……„„„ƒ‚‚‚~~„ƒ€~}~~|}ƒƒ„„„„„„„ƒƒ„„ƒƒ„„„„„„‚€€ytrxwvtssqjnz~~~~~~~~~~…‹ˆ‡…ƒƒ‚~vrswy|}}}€€€€€~zxyz€‚‚ƒƒ……‡‰Š‹~~}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~|xvusrqqsv{}~~|~~€€€{{|~€€}zyvwyyxxyz{{{||}~~~~|}}~~~~}{{{{{{zz{{{{||||{|}}}}~~||}}~~~€‚„…„…ƒ‚‚ƒ„„‚€~ƒ‚€€€}}€ƒƒ‚‚ƒƒƒƒ‚„„ƒ„„„„„„ƒƒ‚€{xuuuwwuusojoz~~~~~~~~~…‹……††ƒ‚€~yy{|€€€€~{y|~€‚ƒ„„‡ˆ‰Š‹~~}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~|xvttsrrtx{|{{z{{|~~€}|yxwwwxzyyyz{{{||}~~|||~~~~}{{{{{{zz{{{{{{{{{{||}}}}}}}}}}}„††…ƒ€€€‚ƒ„‚ƒ†…ƒƒ€€‚€€€€‚ƒ„„„„„ƒƒƒƒ‚~{vvuutvvvutpkqz}~~~~~~~~‡‰ƒ€‚…†ƒ‚€€€€€€€€€€€€~{{~€‚ƒƒ…„†††‡Š‹~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~€€€€~~}}~~~~~~~~}~~~~~~~~~~~~~~~~|zwwwtsstz|||z{{||}|{}€~zxvwxyzyzzyz{}}||}}~€~}}}}}||zzzzzzzzzz{{{{{{{{{{{{{{{|||~€‚……„~~~~ƒ„‡‡†…ƒ‚‚€€€‚‚€}{|}~~‚„„ƒƒƒƒ‚‚€}{xuutuvwwvsqnqz}~}}ƒ€‚…ƒ€„„ƒƒƒƒ‚‚ƒƒ„„ƒƒƒƒ‚€}|}€„…‡‡„„„„†ˆŠ~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~€€€€~~~~~~~~~~~~}~~~~~~~~~~~~~~~~|zwxwuttvy|||z{{|||~~€€}{yvwxyzzyxyz{{|}}}}~€€}}|{{{{zzzzzzzzzz{{{{{{{{{{{{{{{|||~€„…ƒ~~~~~~~€€€ƒ„„„ƒ‚ƒ‚ƒƒ„„„„ƒ‚}~}}}‚„„„„ƒƒƒƒƒ€}{yutttuvvsolnx‚„…‡‡†…ƒ…†…‚‚‚ƒ„„„„ƒƒ‚‚ƒƒ„„ƒƒƒƒ‚€‚„†‡ˆˆ‡…ƒƒ†ˆŠ~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~€€€€~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~|{xyyxvwy|||||||||{|~€}||zwyzzyyxyyz{|~}}}}~}~€€}}{{{{{||zzzzzzzz{{{{{{||||||||||||}~€‚€~}}}~~~~~~€€€€€€€„†‡‡†‡‡„‚€€~~‚ƒƒƒƒƒƒƒƒƒƒ€~zwtsttopoov„…††††††…„…………„„„„……††„ƒ‚‚‚‚‚‚‚‚ƒ„ƒƒ‚‚…„„‡ˆˆ‰†„‚ƒƒƒ„ƒ†‡ˆŠŠ~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~€€€€~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~|{xxxxxy{{||||||}|~€€zxxyyzzz{{{|zzz{}}{{{{{{|}}}{{{||||{{zzzzzz{{{{{{||||||||||||}}€~}|}}~~~~~~€€€€€€‚ƒ†‡‡‡†…„„‚‚‚€€‚‚‚ƒƒƒƒƒ‚‚€|zwusvwz~‚„…†…………„ƒƒ…………„„„„„„„„†„„„‚‚ƒƒ‚…†‰ˆˆˆ†„ƒ‚€€ƒƒ„„…†‡‡‡~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}}}~~~~~~~~~~~}~~~~}}~~~~~~~~~~€€~~~~~~~~~}~~}}~~{zyxxwyz{{||{||||}€€}yttvw{{{|}~}|zzzz|{|zz{||}~}}{{z{{{||{{{{z{{{{{{{|}|||}}}~~}}}}}~~}}}}}}~~~~~~~~~~~~‚‚ƒƒƒƒƒƒƒƒ‚ƒ‚€€€‚ƒƒƒƒƒƒƒ„„‚‚€€}}~€€‚„ƒ……………„„ƒƒ„„‚€‚ƒƒ„††……‚€€ƒƒ…„„‡ˆˆ†„……ƒƒƒƒƒƒƒ„„…………~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~}|zyyyyy{{||{||{}‚‚€{vttw{||~~~}{zzzz{yzz{z||{}}}|{z{{{||{{{{z{{{||||}}|||}}}}}~~}}}~~}}}}}}}~~~~~~~~~~~~‚‚ƒƒƒƒƒƒ€€€~~€‚‚ƒƒƒƒƒ„„ƒƒ„‚‚ƒ‚‚ƒƒ„…‡ˆ‡‡‡‡„‚€}|z~~€‚‚„…††……ƒ‚€€€€‚ƒƒƒ…‡ŠŠ†……ƒƒƒ‚‚‚‚ƒƒ„„……~~~~}}}}}~~~~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}{yyzyyyzz|||{{|~‚‚}zwuuvz|}{}}|{xxxyyzxy{{||||||zzz{{{||{{{{{||}}}}}}}||}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~€€ƒ‚ƒƒƒ€~~€‚ƒ„„„„„„„……ƒƒ„…„…††‡ˆ‡†…„€~{zzyy|€‚ƒ„„‡‡‡‡‡††„ƒ€‚‚‚ƒƒƒ„ˆŠ‰…„‚€€€€ƒƒ‚‚~~~~}}}}}~~~~~~~~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}{yyzyyzzz{{{{|~‚‚€~|zwuuux{{{{{{zxxxyyzz{yyzz{{{{zzz{{{||{{{{{||}}}}}}}|}}}}}~~~~~~~~~~~~}}}}}}||~~~~~~~~~~€€€€€€€€‚ƒƒ„„„„„„…………„……†‡‡ˆ‰†ƒ‚€}{|…†ˆˆ‰‰‡††††††…„‚‚‚‚ƒƒ‚ƒ†‡‰…€€€€€€~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|z{{zzzzz{{zz|‚‚€~{zz|zwuvvvy|||}|yyvvwxzz{zzzz{{{{{z{{zz||||{{{|}~}}~~}}}}}}~~~~~~~~€€€~}}}}~~~~}}}}}}~~~~~~€€€€€€€€€€€€€€€€‚‚ƒ……„„………†„„ƒƒ„„„„„……„„„„ƒƒƒƒ„…†‡‡†……‚ƒ…†……‡†„~‚‚ƒƒƒ„……‡†ƒ€€€€€€€~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~€|z{{|{zzz{||~‚ƒƒ||{{yxvqrv|}|||{yywwwwzz|{zzz{{{{{{zyzz{{||{{{|{|||~~~~}}}}}}~~~~~~~~€€€€~~~~~~~~~}}}}}}~~~~~~€€€€€€€€€€€€€€€€€‚‚ƒ…„……………††……„ƒ„„……††…………„„„„„„„…„„„ƒƒ€„†††‡ˆ‡…‚‚‚ƒƒƒƒ„…‡‡…ƒ€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}}~€€}|{{~}|{z{{~‚ƒƒƒ|zyzzywvtqw|~||zxwywwuwxy{{zzy{{{{{{{zz{zz{{}}}~|{}}}}}}}}}}~~~~~~~~~~€€‚€~~~~}}}}}}}}}}~~~~~€€‚‚ƒ„……‡‡…………†‡…ƒ………†‡†‡‡‡‡††††„…„„ƒƒ„„‚€€‚„†‡ˆˆ†…ƒ€€‚‚ƒƒ‚‚ƒ„…†‡…ƒ€~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~}|{{{z||{|ƒ„„€|z{{zyyyxvqpv|}{yvvwyxxuuuxzzzzyzz{{{{{zz{{{{{{{|}|{||||||}}~~~~~~~~~~~~€€‚‚‚‚~~~~}}}}}}}}}}~~~~~~~~~~€€‚‚ƒƒƒƒ„…………†‡‡†……ƒ…†‡ˆˆˆˆˆ‰‰ˆ‡…ƒƒ‚‚ƒƒ€€€€ƒ„…‡‰‡…ƒ‚‚‚‚ƒƒƒƒ‚ƒ„…†……‚€}}}}}}~~~~~~~~~~~~~~~~€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~|||{{{{{z}ƒ…ƒ}|}|{zxwspotx{zyvvvwwxyyxwxxyzzy{{{{{{{||}}}|||}}}}}}||}}}}~~~~~~~~~~~~€ƒ‚‚€~~~|}}|}}}~~}}}}}}||~~~~~~}}€€€€€€‚‚‚‚ƒ……††‡‡‡†…„„„†ˆ‰‰‰‰‰‹Š†…ƒ‚€€€€€~~~‚…†ˆ‰‡…ƒ‚‚‚‚ƒƒ‚‚‚ƒƒ„„……„‚~~€€€€}}}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€~|~}{{{{|}‚‚€~||~€|ywuqnnrvyyyvvvuwy{{{ywwyzzy{{{{{{{||}}}|||{{{{||}}~~}}~~~~~~~~~~~~€€‚‚€~~~}}|}}}||}}}}}}~~~~~~~~€€€€€€‚„……†‡‡‡†„„„…†‡‡‡ˆˆ‡…‚€}~~~„…††ˆ†„ƒƒ„„ƒƒ‚‚‚‚‚ƒƒ„………„‚€€€€}}}}}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~||}~~~~~~~~~~~~~~~~~~}}~~~€€€€~~~~~~€€}|{z{z}€}{||~‚‚€}yxwtrpquyyxwuuwy{}}||zyyyzxzzz||{|}}}}||||{{{{zz{{}}}}|~~~}}}}}}~~€‚€~~~}}}}}}}}|}}}}}}}~~~~~~~€€€€€€€‚ƒ…†…‡‡‡……„„„…‡†…„€~~~~~}}~~~~‚ƒ…†ˆ†…„„„„ƒ‚‚‚‚‚‚„„……‡…„‚€€€€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~€€€€~|{z{~€€~}|{||~‚‚~zyxusppsuxxwwvwy{|}||z{yyywxyyzz{|}}}}{{{|||||{{{{{{{{{|||}}}}}}~~€‚‚€~~}}}}}}}}|}}}}}}}}}~~~~~€€€€€€€€€‚„……††……„„ƒ„††„‚€~}~~}}}}~~~~ƒ„…‡†…„„„„ƒ‚‚‚€ƒƒ„†ˆˆƒ€€€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€~~~~~~€€|{{~€‚ƒ‚|{{{|}€‚€~}ywwsooqsuwxvwxxyy||{||zyyxwwxyyyz{{}}{{z|{{{{zzzzzzyyzz{{{|||}}~~~~~~‚ƒ‚‚€~}}}}}}}}}}}}}}}||}}~~~~€€€€€€€€€€€€„„…‡†…‡††††………‚€}}~~}}|}}~€ƒ„……††„ƒƒƒƒ„‚‚€€‚„„†‰ˆ†ƒ€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€~~~~~~€€€€€|{|ƒ‚€€{{{|}~€‚ƒ‚€~zyxtpopoqsuvyzzyy{{{||zzzxwwxyyyz{{|||||{{{{{zzzyyyzzzz{{{|||}}}}~~~~~€‚‚ƒ‚€~}}}}}}}}}}}}}}~~~~~~~~~~€€€€€€€€€€~‚ƒ…„…††‡††………„ƒ}}}}|||}}~€ƒ…„†††…„„„€€‚„†‡Š‡„€~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€~~~~~~}}€€€€~|}ƒƒ€~|{||}|~€‚„ƒƒ~{xurqponoqsvwzyzyz}}}}{{zyyyyyzzyz||||||zz{zyyzyxxzzzzzz||||||||}}~~~~€‚‚€~}}}}}||||||}}}}}}~~~~€€€€~~~~ƒ„ƒ…†‡‡‡……………ƒ€~}{z{{|||~~~~‚‚„………………ƒ‚€~~‚€‚ƒƒ…ˆˆ…‚~~~~~~~~~~~~~~}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€~~}}€‚‚‚€~}‚ƒ‚~|{{||}|~€‚‚‚€~{vtrononnprsvyz|zxyy{{{{zzzyyyyyyz||||||||{zyyyxyyyyzz||||||||||{|||}~~~€‚€€~}}}}||||||}}}}}}~~~~~~~~~~~~~~‚‚ƒ…‡‡‡……………„‚€~|{{{|||~~~~€‚‚ƒ………………ƒ‚€}|~€€‚ƒƒ…ˆˆ†ƒ‚‚klmnooonooortuvvwxzzzzwurpqqppppqqrssuxyzzyyyy||}}~€€€€€€€€€€}~~}}}}}}}}{{||||||||||||}}~~~€‚ƒ„„…………††……††„ƒ‚|sjd^[]_ada_][^cehhe``bglsz€„……„„{qf]YX]bjtz~{urppmifaadgknpquyz€€€€€€|wpmjjjjjjjkknqqtuuuuuvvuwvwyxupf[XTV[^choy€‚‚ƒ€€~~|xvtomjggcdfgghfhjjmprtttttsrrqpoqutuuz|zvplhbbdca\Z]dknttsrrsuwz~‚ƒ…‚mooppporssttuvwwxzzzzxvtrpqqppppqqrsuvvxzzzzzz{{||{}~~€€€€}~~}}}}}}}}}}||}|~}||||||}}~~~‚‚ƒ„„…………††‡‡††„ƒ}wpgc_^^`bb]ZYX[_dghfc`acfmu~‚……„„‚{si_\Z[bhpw}}{wtrpmnifcbbejmppqsv{€€€|zupkihhhhhhiklnortuuuuuvvuwvwyxupg]VUW\^cgpw€€€€~~{wtoljihgeegiiijjkjmprttttsrppqpoqsrpsw{||ytqmhdccb`\Z]dlsuusrrsuwz~„†ˆ…moqqssrstutuvwxxy{{{ywusqpppppqqsssstuuwyyy{}}||||}}}~}~~~~||~~~~}}||}}~~~}|}}~~~~~~‚ƒƒ„„…………‡‡†††„ƒ‚}vmg`]^`cda^[XVY]fmojea``emt{‚ƒ………ƒ€vmfcaadhot{yusqnmnjiihedehpy†„zwz~€€}{wrnjhhhjjiiijlnosvwvvvvwwwwwxxyupg]WUVZ^dhpw}€€€€€€€€|ztrojghhgghhjjjkklnnpstsuuropppoprrqrtxz||wsqkgecca_[]aelsutsstuvxy}„ˆ‰‡nonprrqrtuvwxyzz{|{{yvvsqppppprrssuuuwwxyyy{{{||||}}}~}~~~~~~~~~~}}~~~}|}}~~~~€‚ƒ„„……††‡‡†††„ƒ‚wnc^__dddb`YTT[epuvneaabfkqwƒ………„{smgbbeilostpnmllllmmkigglwƒ…‚ynqy€‚€zvqkihjiikkjjjkmoqrtvwwwwwwwwwxyzxsj`XTW[`cgnu|€€~|yurnlihhhhffgkmmmnonllpsvtssroooomoqportxz{yvrlhca`adaacdhnstrqqtuuwz†‰‰ˆnnmnpqstuuuvwx{||{ywvurqqqppqrrttvxxxxxxzz{{y{}}}}}~~~~~~~~}}~~~~€€€€~~~~~€€€€‚‚ƒƒ„„‡‡‡‡……………‚~yohfbeffc^\WUWamv|{rkca`chnu{„„…„‚}vrjeefikopoomllkknonnjijov}‚xqqw~|wrnkhhiikklkiiknoqruvxxxxxxxvxxyyyukbZWVZ`chms|~€~|xsnjihgheefgijnoooonljkpsssuuroomnppommptxxzxspmida_aebaejnsuurpqtuwwy}†ŠŠŠnnnopqtuuvwxz{}~}}{zxvutrqqqrrrsuvwxxxxxyyzzzzy{}}}}}}~~~~~~~~~~~€€€€€€€~€€€‚‚‚ƒƒ„……††……………‚€zslhdcdec`^ZX^iv|~wpic``dkry‚„……„€yrkdbehjlnonlllllppppnorsxzwtonv||vrpkhjlmoopnkijlpptuxyyyxxxxyxyyz{ytlcZWY]_bglsy~}ywsonliggfddefiklnoooolijmpsssssromlnppommruxxuspmkfbabeefimpuxvsqpqtvvtuy…ŠŠŠjlnopqsuvxxzz}~~}{zxvutssqqqqrrsuuwxxyyyz{{yyz|}}|||}~~~~~~€~€€€€€€€€ƒƒ‚ƒƒ„„„…………†„…ƒztnhecca`^]\]fr{ƒ€zukeb^bgms{€ƒ„…ƒ|unlgdfjkjiikkkmorttrtuvx{|xqmmppijtusnjjklmoprspkhikmoswxyxxxxyyyyzzz{zunf_ZZ\_bglqwz{}|zwrokigeecbbdegimopqponmljhlortsrsronlnpqnmnqtutrqnnkgdabffkpsvxzwrpqsuvtstx„‰‹‹jlnopqsuvyz|~~~~}|{zxvutssqqqqrruvwxxxyyyz{{{{z|}}|||}}~~~~~€€€€€€€€€€€€€€€€‚‚‚‚ƒƒ„„…………„ƒƒ‚~xrlfb``ba`^_dpy}ƒ€{vrlda`fkqyƒ„…ƒ~xqnigikjhiklllnqtvuttxyyyzvonprokjjnniiloqonrttpkhikmoswyzzzyyyyyyzzz{zvnfa^[]_bgjowz{zvsqmiggecbceeefilnoqsponmjhhkpstsrsspnlnpromnoppnlkkkhdcdehkrw{~~{usrstuwtsrv€‡‡ˆmmopopqwx{}}~}}{yvutsqqqqppqstuvxyzzz{{zzzz{{}}yz|}|}~~}}~~€€€€€€€€€€€‚‚€‚‚ƒƒ„„„„„ƒƒƒ{tnie`\]``^^ckv}‚‚ƒƒ€|umga`bgpv|„„„‚}|wqljgklihknmnpruvvwv|~zwwwwxzvkhiinsooqvytmnqrpkiijmprwyzyyyxyyyyzzzzyxohd`^^acfkpsxytrnlhgddb_abdfgimmqqrrpmmnjiilrvuuttspnlmopmkkkkjijhfecbbegkou{~€~xtsrtvxwtqpu|ƒ††mmmooprwy|~}}{yvutsssrrrrsttuvxyzz{zz{{||{{yyz||}}~~~€€€€€€€€€€€€€‚‚€‚‚ƒƒƒ„„„ƒƒƒ}xqje_]]^__`cir{€‚‚ƒƒ‚xqkebagmtz‚„„ƒ~yrmjgghkjkkmnrtwyzz{€ysuz~}vqoieeiosu{‚{tqrrpkiijlorw{|||zzzz{{{{zzzxrkd`^^acfhlpsspkjfdcbbdedfhikmnnnnppnlkllkjnrvuuttspnlnqpkhgfffededccbbehlrx}}{wsprtvwurqprz……llnooruw{~~~~~||{yvvusrrqqpqqsuvvwwzzzzzzzzzzz{{{|}~}~~~~€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒƒƒƒƒƒ„‚€}xrmgc``_```afnx‚ƒƒƒƒƒ€|vnh``chou|‚ƒƒƒysnjfehjjklpsuxzz|z|}~vqx~yvtolkjijnpx{wqpvwupkghkmprw|}||{{{z||{{|{{xrkda``bcegjnpoigegdbabbcgihjnoonmnoomnnomkkosuuuuuspmmopoicbeea`adcdeeffhmry}|{zuqqssuurqqppx‚‚lllnqtvx{{}}~~{{zwvutrrrqqqrstuvwxxzzzzzzz{{zz{zz{|}}~}€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒƒƒƒƒ…„{vrmhdb_\Z``bekr{‚ƒƒƒƒƒ€~xrlc_bflrz€ƒƒƒ~xtnjfehjjklqty{|{zxvvvvw}‚€|xsqpoonpt{xtsx}}ytlhhklorw|}||||{{zz{{yyxvplgc``adghikjjhbacddcegfgijknoonnoqqpnnonlmqtvvvwvurpoprmgaabb`_`abcccdghmry}|zxtqrssuttsrqqt{kmmoqswxyz{|~~~|zyxwvutrqqrrstuvuvxxwxxx{{z|zz{{{{||}}~~€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚ƒƒƒƒ€{uplgec`^]]__bgqz€ƒƒƒƒ‚ƒƒ‚{vof`bekqw}‚‚€xvqjfdfhjkmtx}|}~‚{vvuv|‚|zyy{vtvstw|wqt|~}xrlhhjloqv|}}}}{|||zywwwvtsojea``cijjgggecacddihijkkklnonmmmpmmprronnruvttvvspnopplf`aa^^__abccehhjnsx|{xvrprstvtqrrqqsy~lnmoruwxyz{|}}{zyxxwuttqqqqqqrssvwxxyyzzyyyzzz||||||}}~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ{vojfeec`__`ceinv|€ƒƒƒƒƒƒ‚~|voga`dhnu{‚‚}{uqnhfghkkpvzz~€‚‡Šƒ~~~~|xvssqopqruxzxuv}~}xrlhhjnpty|}}}~}}}|zywvutspmidbaadefedggebceggjjkjjjiknonmlllllprrpoosvxuuvvtqnoppkebba^^\_adefijjkosy{zxvrprstvtqooppqwzymmmotuvxxz{{||}{xwwvvusrppqqrsstxxxxyyzzzzzzzz{{{{||~~}€€€€€€€€ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚}wqlieeecbabefhks{€‚ƒƒƒƒƒƒ‚‚€}vohbaaglrz~|wtpmifegklqvz{‚†…ytruvwtrqmknoosuuxzyvw~~xqokiklnqv{}~~~~~|{ywussttqnhebbbeffgggghhggjkjlmjijkknmmllnmnopoqrortvttruvtqmnqokc``ccbaacdefijlmqtxzywtqqruuvsqpppppuutmnoqsttuwxzzzzzywwuutsrqqqqqrrstwwxxyyyzzz{{zz{{{{}}~~}€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚|wplifeeeeefghlqx~€‚ƒƒƒƒƒƒ‚‚ƒzsmhbcfkpw}|ytrpnkhehlpptx{‚„‚}wsqmnpqppnmmmpuy{zyzwvz~xqmiiknprw{}~~~~|{zxvstssrolhgcaadgghhhhiijjmnmnnkjijjkkkjlmnmlprssstwwutuvwtqopqokfbbdddbbefhjjijnrvyyxurqqruwtpnppppoqqpnoqqrqrswxyyyxxxvvutsrqppppqssttuvwwwxyz{{{{}}~~~~~~~~€€€€€€€€€‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ}wpjhhghhhiiklpw€‚ƒƒƒƒƒƒƒƒ‚~{uojfceipt{}|zvppppmifgjnoswz~€~zuppnmnoonnnmpux{€{xuu|~xpkiikntuy|~~~~}|zxvvtutsrmjijfbbdhklmljllnoqrrpnljeggijkknmmnnprtttwyzwtuvvtpopqolfddeddcbdhjlllkosxxxvrqppsvxwspnponnnoonoqqrrstuwxxyxwwuussrqqppppqssttuvvwxyyz{{{{{{}}~~~~~~~~€€€€€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ~ysnjiiklllmmmotz€‚ƒƒƒƒƒƒƒƒ‚|vpkfceimswzywtqppomkgdgloquz~ƒ~xsomoqpmmmooqw{ƒ…{wvz€~xpljklorwz|~~~}|{yxvvtutspolkhgcdhmptutqpqrsrttqmkjhhhijiigiklnprsuvyzxutuvusoopqolfffdcbbbdhjmmnlpsvxvurqppsvxwtqonmlkknnppqqrssuvwwvwwwwvuttsrrqqqqrrsttuvwxyzyz||z{{z{{|||}~~}~}€€€€€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚‚€€{tnjijknopoponrv|‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚~yrmhddglouwwvsqoomlkiehknosw}€€|vrplkjfgklnqu{€ƒ„†ƒ{vuz~wpkklmoqv{}~€€~}{zzywutrqonkjhgghotw{zxvtrsvwwvsnlijjjhiiiggjlnqssvvxyyustvuqoorrpledbcbabcehknnmmosvwutrqoqsvwwtqomkjjjlmppooqrrtvwwvvvssttsssrrqqqqrrsttuuvwxyyzyyzyxuuussux||{zzyzz|}~€€€€€€€€€€€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚ƒ~wpjihiloprqqpnrw|‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚€zuoiecekorstsqpoomnljfeinpqw}~}|{xspljhhiknosy‚…„†…}vrw}~wpkklmoqw|~~~~}}|zyxvtspooljihinu|€}zvtvxzzvspmlhgghiiikjjmnqsstvz{yustvwrporrpgddb```acehknonmpswutspprstuvvtqomkjhhklnoooopqsuvwuttuuuuttssrrqqrrssttuvvwxyy{|ywtrokjhilpwwusrpqrrux|~€€€€~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒzslhghjkooooooqu|€‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚€|vqjdadimopqqppppnpokhginpptz~}~|xuqmjiiimnrw}‚ƒ…††‡ƒzvw‚wpkkjkoqv}€€€~}|zyxvuqpnoljhhkt{€‚„€{wvw{|zxtpnljihiigiiillnoqsuxy|yutuwvrrrssme`bbaa_`cfhknnnnquvtrqqqstuvxwtomljihhjknoppprstuvutttuuuussqqrrrrsssttuvvwwxyy{{xuqljihfefjnmifcbdehloswz|~~~€€€€‚‚‚ƒƒƒƒƒƒƒƒ„ƒƒ‚}yqjgeccdimpppoprw|€‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚~xrkecceilmpppqqqqrrmhfilpqsx|}}{wtqmljjjnrw|€‚…†††‡…}uv}|vplllmoqv}€€€~~}{zxwvrqopmkjjnv~‚„„ƒ}yy{||ywurqnlihfffghhjlpqqqrv{{yuwxwvrrrssme`a````adgilnnklquvtqppqsttuvvqnomljhhjkklnopqqqssssttssrrrrrrrrssssststuvvvxyz{yxvrmljigecbccbbbb`adeehou{}~}}~~€€€€‚‚‚‚‚‚ƒƒƒƒƒ‚€|xsmfc````foqrqpqw|ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚xrnfacfkjjkmoprsstspjghknpqtz|{ytpqlkklmqw{~‚„…††††{tu|€~wpllklnrx}~~~}||zxvusqoqomllqw}ƒ„€}{z{zyxwtrpmjigffiihgijnpqrsw{|zvuxwurrrrqia^_]^`bdfhkmnmlmrsuttrprtttuwwrnmmkifehkklmnpqqqssssrrssrrrrrrrrrsssttvvvvvwxyz{yxvrnmkjhfdcbcdbaabdddccflqw{}}~~~€€€€€€‚‚‚‚‚‚ƒƒ‚‚~zupkhd_]\`ekpsrqrtz‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚{uojeacehjkmopsuxxvslihjnoqtxyxsnlljkkmqvz~€‚„„…††††wsuy{uokkklosw|~€€€|{zxvtrpqomlkqwz}€|yuuustsrppolhgfhjiiihhkmopqswzywstvwuqqrroh`]_]^`cegilonmlmqrrqqqqsvwuwyxtollkiedfhmnqqppqqrsttttssrrsrrrrrrsttuuuuwwyyxyz{{{xurrrrnjgggfcfffffdeba`cjtxz||}~~~€€€€€€‚‚ƒƒƒƒƒƒƒ}wqleb_][\^blnqsrtwz€ƒƒ„„„„„„„ƒƒƒƒƒƒƒ‚~wqkeceggijmpqsx{{yvojhhoppsuurmkkjkllnqx‚ƒƒƒ…………‡†„|srwxupljklnrw|€€€~}}}|zyvtsrqonnqsvyz|zwppqmkkmkmmkifdceiiihgggjoppswz|zvtuutrrsrne^\\[`bcehkoqnkilpqsrpppsuttuxxqmnnlhgdefmnppppqqrsssssrrssrqrrrrsstuuuuuxxwxxyz{{{zzxxyyurmlijmqsuttqmhbbbcksvwxz|}}~~€€€€€€‚‚ƒƒƒƒ‚‚|vojdb_^]`aeimprsuy|~€‚ƒƒ„„„„„„„ƒƒƒƒƒƒƒ„‚xrleacdhjjmqtw{}}{xslhhloppplifhhjlllnqx‚ƒƒƒ……„…‡„€ysrsvtoljjknrx}€€€€~}}}}|zzxvusrpnpoqtvwvqmhfecbadgjnkhddceijjhjlljjjotxz|wstuutrrsrne^\\[_befloopnkjmopppppqsutstzysnmmkgeccelmmmmonpqqqqppqqppqqqqrsstuuvvvvwxxxyz{|{{{{||||wuonnquxy{{{ytmecbcehkoruxyz{{~}~€€‚‚ƒƒƒƒƒƒ‚~xokgfcaaabdglorsuz€ƒƒƒƒƒƒƒƒ„„„„ƒƒ‚‚ƒƒƒƒ‚~unhb`dghikrvy~~~{vohgknqlieebdehkkmnrx‚ƒ„„„„…………ƒywxxupmkijotx}~~}}}||}||{zxvtqnpnnnpsusof```^]^cfjllkgdcgjklmpponmknqw{{xuuvvussrqog]Z[_bgiikopomjjmpqssqqsuvvtsxxqnmlihebefklmmlmnpqqqqppqqrrqqqqqrttuvvvwwxxxxyz{|{{||||{{zxvvvxyz|{|||ytokhdb`bdgijijlqv|}~€€‚‚ƒƒƒƒƒƒ~ysnigdbabfglnpquy|‚ƒ„ƒƒƒƒƒƒƒƒ„„……ƒƒƒƒ„„ƒƒ~vrlfcchjknswz~€{yrjfhlnjebbceehlmnpru|‚ƒ„„„„……ƒ€€}xuzzupkiijnsx}~~~~{xxy||}|zwusqnnnmnpqqlda`aaabgknppmhdcfikopsuronlkou{{wtuvvusstsme\Y[afgkkloqplhijnprsqqsuvvruyvqnljjiebdbkjjklmoqrrqqppqqrrrrsstuuuttvvwwxxxxyz{{||{|||||||{{||{{||||{zvsqmieabd``]_bdgnwz~€€€€‚‚ƒƒƒƒƒƒƒ‚€{vqljhebaejlqsvw|~ƒƒƒƒƒƒƒƒƒƒƒƒ„……†……………………ƒ{slfdegjlpv{~‚‚}yslfehlkc`acfhmoonoty~‚ƒƒƒƒ„ƒƒ„ƒ|srwzupllmnnqx}€€€}xtpqwy{|}|zvspnonnnqrnkfggjmnrtuvupkfbbeilosw{xrnjint{{vtuvwtrstrlc[YV_hlmmoprnjggjmqtspqtvxwstxupolkjhedefjijkmnnpppqqppqqrrrrsttuuuuuvvxxxxxxyz{||||~}}}}||||{{||||||{zyyurmkhgda^\\]^`gpx}€€‚‚‚‚ƒƒƒƒƒƒƒ‚}xrmkhgghkptxyz}‚‚ƒƒƒƒƒƒƒƒƒƒ„„……††††††…………ƒ}umfcdgjosw}‚‚‚~xtoigilkhcbfknrsqmou|€‚ƒƒƒƒ„……‚yroovyupllklnqx}€€€~xrieemty||zwspoommkmoppooqvxyyzzzzwrlfbcegjmqx{|vofejszzvtuvvsrstsnf_]\ahlnooppmighjostrstvwwutvxuomlkjhfefhjjjkmnppqqqqqqrrrrrrsttuuuuuvvxxxxzzyz{{}}||}}||||{{{{{{||zz||zyxusomigea`````enw}‚‚ƒƒ„„„„ƒƒ‚|wqmkkiimsy|~€€ƒƒƒƒƒƒƒƒƒƒ„„„„……††‡‡‡‡††……„ƒ|wphefhlosz‚‚‚€zvqkijknifdiotvxsmmqw}€ƒ‚‚„„……ƒ~vooqwyvokkjknsy~‚|rh`\]ent{{wsqponlmnopqppqv|}||~~~|zskfcdfhjlsx~|vnfadnwxvuvwwtuutroiba^agkoqssqmigikqsststwxxuuxyvolllkidfhijjjkmnppqqqqqqrrrrrrstuuwwwwvvxxyyxyzz||||||}}||||{{{{{{{{zz|||z{yxwtqnkjhfda^bkt}‚‚ƒƒ„„„„ƒƒƒ~ytnmjjkqvz~€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„…††‡‡‡‡‡††……„ƒ}yskffgjosx~ƒƒƒ‚~{vojhjmljjqw{|{uommr|„„„„„„‚|usrquxvokkjknsy~zpha]_fntxwsommonlmoppqrruz}~~~~~|xqjgdehikmqv{{vld`bltxvuvwwtuuvtpifebejnpsssqnigkmrvurstwxxuruxuoljjkigilmijjjlmoqppppppppqrsstuvwxxxxwwxxzzxxxy{}||{{zz{{zy|zyyyy{{{{||{{zz|||{wusqmga^agr|€‚‚‚ƒƒ„„‚ƒƒ‚€~xrkjklqw|ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„†‡‡ˆˆˆ‡‡†††…„ƒ|vpheehmrx~‚„„ƒ‚€€|wsliimnmnu}~ytomnrxƒ„„„„ƒ‚{uuwuvvvnlkmlotz‚‚|riccdhorssolllkklmnoppqquz}€~~}vngcdefgjmrvyyulc_bkuxvuvwvutvvsnigihhloprtrnjgfjnquuttuxxwsquwrnkkjhfgjkmijkklmnoppppppqqqrssttuvxxyywwxxzz{zy{{}||||}}{{zyxyxxyyzz{{||||||{{{{zzxvqha^`jt|€‚‚‚ƒƒ„„……‚€|wupmklmrw~€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„†‡‡ˆˆˆ‡‡‡††…„ƒ~zupgedgjov|‚ƒƒ‚~yuvtmjimopqxztollrxƒ„„„„ƒ‚|wtz}zvvwplkknnsx}‚‚€zsjggklnpppnnmmllnnpqqqqqsw}~zsmebcehijnswyytmf`ajsvtuvxvutvurnjijkknprsutnjiimrtussuvxxvrswxsnkkjhfgjoqijjjklnppqpqqqrqqrssuuwxyyyyxxyyyzzz{{{{||||}}{{yyyxyyyz{y{{{{||||{{{{{{|zukb^ajt|€‚ƒƒ„„ƒ„ƒ‚€}wpnlllnqtz~€ƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„……†‡‡ˆˆˆˆˆ‡‡††…„|wpjfdeimr{ƒƒ€|ustuokkmopry}zvqkjov„„„„„„€zvw{|xtttqnlmmosy‚€|uqmmnnmoppmmomomnoqqqqppsx}~~~~}ysmhcdegjlpsy|ysmfbckrttuwxwvuuuqnklmmnpqsttqmlkmqvwvstvvxxtptyysnlkkiegilqijkklklmnppqqqqqrsvvwxwxyyyyyyyyxyzz{{{{||||zzzzyxwvuuuwwxzz{{||||||||{{|yvnd`ags{~ƒƒ„„ƒ„‚€ztplkkllmqw}ƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„……†‡‡ˆˆˆˆˆ‡‡‡†ƒ‚}xurlfdeimrw}~zumlorokjjlorw}€|vqnmqw~ƒ„„„„‚}z|}xusrrsrnlllnry‚€{vrsssnmoppnnommnoppqqqqqtx|~~~~~|xqkgceghkosu{|ytoieenqrtuwxwvvvvqlijmpqsttuusomnotwxvtuvvwwsrtyxrnlkkihjlothijllmmnmoqqrrrrsuwwvvxxyyxy{{{{{{{{||||}}|{{{yyxxwwwwuutuwy{|{{{{||||||{{xpfaaeqz~‚ƒ„„ƒ‚}wqnkhhiijotz‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…††‡‡ˆˆˆˆˆ‡†‡…‚€}xsrmgddfiptz}}ysmefmqnjhllnsv{}vromrx~‚ƒ„ƒƒƒz{{vsopqtpmmmlmqw‚{xssvvtommpppqqomnoopprrssuz|~~}}zvoiecdghlosz}|wrlighorttvxwwvwwwrnlmoqsututvspoorvywsstuuwwttvxvqonljjjknqwhijllnppqrrrrrsstvwwwwyyzzyz||||{{||}}|z{{{z{{yyyyyywwuuvxwyy{}}}}||||{{{{ysja_clu{€ƒƒ}wrkgggfgilrw}€‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…††‡‡‡ˆˆˆˆ‡†‡…‚zuqoniffhhnsxxuoidcegnnnnpoqstz}xsolou}„…„„ƒƒ~|zxurqrsqmjlklnuz|yvsuwzzvppprrrtqomnpppqrrssty|€~}|zvojeddfhkpty{zvpmkjnsvuuwxxwvwwvsnlmoqstvvuvsqpsuxzvutuxxxxttxzwolkljjjmprrijjllmopqqqrrsttuuxxy{{zzz{{||{{||||||||{{y{yyzzzzzzzzyywwxxxy{{||}}|||zz{ztmd`cjtz~€€‚‚wsmgccbdgiqu}€‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…†…†‡‡‡‡‡‡††…‚zwtpnnkihiilprqlgdba`cioqrv{{xwz~€|xrmnqwƒ…†……„„‚{urqstpljkjkmpsutppty{zurqttuvupnmnnoqqsqqruy}~{xuojedceimquzzxronnprvyxvxzzyyxxxrljmprtwwuvwurswy}{wuuvxyzyuuxytnkkkkkkllnmijlmlmopppqstuvvvwxxy{{{||||||||||||||{{yyyzyyyyyyzzzzyyyyyyy{{{||||{{|zz{zwqkbaenw}€€|smga`aceiow|€‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„„…††‡‡‡‡‡‡…„ƒ|xsqpnolhgiijlkjgda_ceimquz}~€}|‚{wspnrxƒ…†……‚||}xrquwvpljkjiilpqpmlqvz{vsvwzxvrpnnprrrrrsrtvy|~~{wrnieefiknrxzyvqonnpuxzwxz{{yyyyxrklnprtuvvwwutvy|}{wuwxxyywuw{yrmkjjjkkkljjjklmnopppqrtvvvvwxyyz||||||||||||||||{zzxxwwxyyyyyzzzzyyyyzz{|||{|{{{{{{{{{ztoheektz~€~ysje``_cjqv}€€€‚ƒƒƒƒƒ„„„„ƒƒƒ‚‚‚‚‚ƒƒ„„„„…………†††…„‚€|tqpponmkhghhiieadcdcjlnptx}yw|†Š‹‰€xqpsyƒ…………„ƒƒƒ~ysrw{yqkjjkjknnmlilru{{ywx{|xxspopqrrrprttuwy|~~{ywqlhddfgjnrvvtqqqppruzzxwy{zyyyzzsnnqrsuuvuvvtsvy{}zwwyyxzyxuvz{smjiiijjjjhjjklmnopppqstvvvvwxyyz|||||}}||||||||{{zyxxyyxyyyyyzzzzzzyyzzyzzz{|{{{{{{{{{zwrmgcfnuy{{zwqhc`aciqx{~€€€‚ƒƒƒƒ„„„„ƒƒƒ‚‚‚‚‚ƒƒ„„„„……………„„‚}{vtqppnnpqlhgghhfbcbbdjnrtvvyvqsttx††‚}zwx|ƒ…………„„‚‚}yww{xrkjiihjkkjijmswxxywx{|xvrnnpqssrprttuwy|~~}}ztpkfeegikosurqppooosx}|yyz{zyyz|xrmnrtuvvvwwvtux{}}zwwyyz{{yvy|zrmkhiijjikjkjkmnnoppqstuvuustuvy{{{}{|}~}}||||{{{zzyxxyyyyyyyyyyxyzzzzzzz{{{{{{{{{{{{{{{ytqjebflqtutqmhecciov{€€‚‚ƒƒ‚‚ƒƒ……ƒƒƒƒ‚‚‚‚ƒƒ„„„„„„………‚}zwusqqppnnpqpgeefgfdccbdhlpswwqijlmprv{ƒƒƒ€}|‚„…††…‚~{yz|wqmkjkkkmkmkkouxzxxwyz{xvtppqrssrrrttuxz}~}|zxsnkhghkmmopppppppootz~{zz{{zz{{xplotuuvwwwwvuvy|~€zwxxy||}zv||xqljjkjgfikilijjknopprstutsolkmpsvvvwy|}~~~~~||{{{zyy{{yyyyyyxxwwwxzzzzzzz{{{{{{{{{{{{{{{|zumf`cfkmlkhdbbbgms|}€€‚‚ƒƒ‚‚ƒƒ‚‚ƒƒ‚‚‚‚ƒƒƒƒƒƒ‚‚|yvtssqppppqrstpjffghgeffb_`fmsuwvpnknprv}‚‚ƒ††„ƒ‚ƒ„…††…„‚}{z„~wqmkklllllnopqux{zyxyzzwvrppqrttrrrttuux}~~{wqnigghkmponnooooonpu|€~{zzzzzz||wolrvvuvwxyyttvy}}ywxyz||{wv||xplkkjhfgiknpjjijloqrrstusqmhgfgjnnoqrvvy||{{||{{zzzzyyxxyyyyyyxxxxxxzzzz{{{{{{{{zzy{||||||wqhb_bccddcaabfmqx~~~€€€€‚‚ƒƒ„„‚‚„ƒ€€~~}}}}{ywwtsprpnnooqsuvurkhhiiiijjd_[aluwxwqmnqvz~„†‡‰‰ˆˆ…ƒ„…†……‚|z~…ˆ‚yrmkjlmmlqsx}}xxzzxxz{zvtqpppsutqqrttuvy~~zuqmjhhilljhjkmnpomorw|~}|zzzzz|~{tontvstwwxwvqsw|~|xwyy{||ytu}}yqmjjjggghkqvjjkkloqrrstusqkfdceeggghklmpvxz{}}{{zzzzyyyyyyyyxxxxyy{{zzzz{{{{{{{{zzy{||||}}xrkdca__``aaabfltz~€|zxwy}€‚‚€~}{xwtsqqpponnnnnlijjhgghijjlorvxywrkgghikkpokaVXeouvwrnot{„…†ˆ‰‹‹‹‰…~}€…†…………‚ƒƒˆ‡€xpmknprqpt{€€yyyyxxz{{xurrrrstsqqrttuwz}zuolighjigdbehjlmnprvxz}}|||{{|}}zsnouwuvxxxwtqsw|€€|yyzy{{{wqsz}yqmlkkigghltyhjjlnprrrsuxvuplhegfffddffghlpvyz{{yyyzzyxxxxxxxxxyyzzzzzz{{{{zzzzzz{{{|||||{zysnjgc_\_^^^abglu{€€}yrkgfhpx}{xuommlkhffffedccdcbccdc`````bfkrvyywrlgfijhjqtqgZYdouwtqonrv}‚‚„‡Š‹‹Š‡„ƒ}z€……ƒƒƒƒ‚„‡„|vpmlnsx{|}~{xtuvuwxx{|zwsrrrssrqppprruy|~€}xsmifgiifd``cfjmooqvxz{}}|}}||}~}ztpquuuwxxywuqrv}€{xzz{{|yrmqz}womlmkjhfgmv}hjjlmoppqrtvvuroljjigggdddedeglprvwxyyyyxxxxxxxxxxyyzzzzzz{{{{zzzzzz{{z{|||||{zwsokgb`_^[[]^cgow~~€}xnc\\]bhnrolhda`_]]]]\\[ZWWXWYZ\]^^]]___bgjmnpqpkjhffdegmsodairuwurpnnprx~ƒ…‡ˆˆˆ†‚ƒ†‚~€ƒ‚|€…ˆ‚zvpmlot|‚…„|tohfimuwwzzzvrqqqrrqpooprswx{~{vqlhffhhec]]beknnruuxz~}|}}||}~~{xtrvxuwxxyvspqv}€{xyy{{{xqlqz{uomlmmkjiglv}ikjlnoppqqstuvurpppmmkjihgecdefilpruwxwwwwwwwwwwvvyyzzz{{x{{{{zzzzzzzzzzz{||}}{yvspnkhfc_\]\^bhmt{~}ype_YY[^beheb^\[XWYXWWVVUSTTRSVWWXYUXVX[_adggfgimkigdb_`dimrpmrwvvtqpooorx|€ƒ„„‚€‚ˆŠƒz|€~}~‡‡‚zsmlkow~„„ƒ~slgijltuyz{wsqpprsqponnnqsux{}zuoighjkkgcaabfknqqtvwy~}|~|{|~zusvvvwyy{tnlnu|‚€{xyz{{yvnkpyxqonnnkifehlu{ikkmnoppqqrsstttuuvuusrqnmkhfdccfjnprtvvuuuuuuuuvvwwyyyz{z{{{{zzzzzzzzzz{|~~}}|{ywvtqmifc`_]\\^bgnqqne^[[[]_`__][ZYXY[\^``aa_^]]\^`abca^\[ZZZ\_behikijgb`ceggdhqvswxwwurponnory}~~{|ƒŠŠ‚z{|xyˆ‰ƒ~€‚€„††ulefjompsy|yurrrstsokknortwx{~~{vqligghjjieeeimqrssuvxz~}|~|{|~{xvvwwyzzxsmlnu|{xyz{{xrjipwvqonnnopollptyhjkmmnnoqqqrrtuuuuwwxywwurpkgecabcfgkqstttsuuuuuuvwwwwwyzzzzzz{{zzzzzz{{|||}}|zwxwvsljgdc`b_\\^dihd__]^\\\\\\^_aabdegllkkkigedbdggijifda^]]\Z\_`dgihd`bhmoi]\luvyyxwvtpnmnosy|}~~|zzˆŽˆƒ€}y}…‹ŒŠ‹ŽŒ‹ˆ…„…„……}thdejlpu|}ytrsrsvspmlmoqtvyyyxsrplggikllkhjlpvwvutuwx{~}}~|{|~~{zyxxyzyxsmlmt|‚€zyzzzzxogipttonmnoprromosvikkmmnnoqqrtsuuuttwwxyxxxxvqliecba`_ahnqrrstttttuvxxxxwyzz||{{{{zzzzzz{{{{|}}|zxwsromnnlie`\[^]\\]____^^^^^ehmnpqqrtuutrplihgefggimonnmjiedbb`_``abceknnog\Vetwxxwutrrqollr{}xv|€|}†Œ†~‚‰Œ‹‰ƒytx‚…†‡ˆ‰†vpkkptvz{wsrsrsromllmprsuvvtsqnmkkkklmmnnotw{{xtrtvy~~}}~||~~}{zxxyzzysmmnt|€~zy{{zzwogirvtqrqprsuxwtqrtjllnmnopqrttvvttttwwwwxxxxwwsojgb`^\`dkopprrrrssssuuuvwxxy{||zz{zzzzzyywwvw||€}{yvtssonnnmjb^\[]^\[[\]^__`adgmtwy}}~~~{{yurnlihgghikpuuvvtrnmjhgdfdadhnqnklojeioruxwtqlonhfgpz{wt{~~{~†Œˆ„‚…ŠŽ‰…ƒ€wrv~ƒ„‡ˆ‹ŒŒˆ…‚|vruz{wsqrssromnqryxuroqpnlkkhigjlnoqsv|~|wuuvy{€~|}}}~€€€€}yzz{{yyrmlmr{zy{{zzvqgjruvtsrqpsuz{xtttkmmopppqqrttttttttwwwwxxxxxxwsqmjfa]]bhnppqqqqrrrrsstuvwwxz{zyz{zzzzzwpiikpuy||yusqqpqqmgdbba_]\][[\^]^]`aadgnu{‚‚‚‚|yuromjihiiimouy|}||zvqmifdcfhnsrjghnw{~{upqtronpmmlosy~}{}ƒ„‚†‹ŒŒ‹‹‰ˆŠˆ‰‰…„ƒ|vy}}z|„‰ŒŒŠˆ†zy{zvspnnnoot}„‰‰„xooqpnljihijknpqsuy{|{xsorvy|€€}}}~€€€€€€}yyz{||ysnkls}{z{{{{umejswtrsrqpsu}~{wuumonopprrssuuuuuuvvwwwwxxxxxxwvsrpjc[Y^fopprrqqppqqssrtuvvxz{zzzzzzzytmd`bdinrvutrpqpnlke`[XZYWXVYYY]ceeeccefgkqwz~€~zupmkkkjhhiimry}€€}yunhdbinrsrkhhk|€€~wlhgmurroqv~‚ƒ‡‰ŒŠ‡‚‚…ˆ‰‡Š‹Š‡‡†ˆ‡…‡†}€€wry‚‡‹ŒŽŽŒŒ‰‰…|~ywtqljmox‚‰‹‰€xpnopqpkjhghilnppsu{~~{uqprvy|€‚}}}}~€€zz|}||xrolmt~€~{{{{{{thdjrusrrrooqx}}|yvunpprttttttuuuuuuvvwwwwxxxxxxwvustnd\Z^empppppprrrrrrqstuuwxyxxzz{{zwphea^_adimnlklmlljhaZUTVVWUTTX]dkpqqmjgdbceilpux||zvrolkkkkjklnrv{~~~|zwqmgglsutsslhpy„ˆ‰}rnsz}{vuz€ƒ„‡‹ŒŽ‹Šˆ†‰Œ‹‹‡ƒ‚ƒ~}…ˆ„‚zpov~„‰‹‹‹‰‡„~~ysrqqrv}…ˆ„|tomnnopqpmlkiiklnpqsvzzzwspptwz~€~~~€€}{|}~||xromnt~€~{{{{{ypgdjqssrrrqqqx{{zxwvqprrttstttwwvvttuuuuwwxxxvwwusttqme]XZcmpoonppqqqqqqqqrrttuvwwxxyxxtmgc^``abeegggfgged_[TPORVWZY[`elrx{{wnhe_]]`eijlpqtqpnmmkkklmpqty|~}ytroomtz€~{{|wyƒ……ŽŒ‡|rv}ƒ……„ƒ„†ˆŠŠ‹‹ˆ‰‰ˆˆˆ‹ŒŒŒŽŽ‡ƒ†„{y‚†‡„ysqw~„†ŠŒŒ‰‰ƒ}w{}{sppq{‚‰‰ƒwmnmoopprrrpnmjjlmnoqsvz{wtqqrtx|€€~€‚‚€€~|{{}}{vsonot}|yz{{yunebjturrssrrrvzyyyvvpsuuuutuvvwwvvvvvvvwwwxxxvvvussspld\UXbiooopppooooppppppsttuwwxx{ywtohc_aabdddcca_``^][WOMLPRTX]ckry}€‚}tkda]^]^aefgijlnmmmllmoqtwy}}|{ywuqnmpu}‡Ž‹‡„„ŠŠ‚‹“‰|v{‡ŽŽŒŒŽŽŒŒˆ„„„‡‹‰Š‹ŠŠˆ„†„€…‡†€|vttz…ˆŠŒ‹ˆƒxpnqy}ztnkr‡†€uonmmlmnrtttrpmkjlmnprtwzyuqqqrtx|€€~€‚‚ƒ€~|}}}}zvsonot}~|{{{{yukbdmssrrqqrruyyxyyvvpsvvuvvvxxxxxxxxvwvwxwwwxxwwvvuuqnh_XY]djmmnnnoonnooppppqrtuuwxxxxxuqnjhdcbabdb__]^]ZXVUPMJHMU]dnw‚ƒƒ„ƒvlfddfed_^_bdfhklmnoopqtvxzzzwwsqppnnqz…Œ‘Œˆ‹Ž…‡“‘Š~rwƒ’’’“‘Œˆ…ƒƒˆ‹‹ŠŠˆ‰ŒŽ‹‡†„…†„€|yxvv{ˆŠŠŠŠˆƒwolry}xnhn~„‚|tnmmnnoopruvurpolllopqrtw|zvsppsux}€€€~}€‚ƒ‚‚ƒ~{}}||yvsomnu}}{z{}|ztjdgousqqopprvy{zyxxwvwvvwxzzyyxxxxwwwwzzzxxxxxwwvvuuspke^Z]_dilnoooonnoopppppqrrtvxxxxywtpnlkigdacddb`_[XVUSQPOOQ]gq{ƒ………„„wmhfjprojgb`adddhknsutuutsrrrqqppnmmpy†Š“’Ž“’‹ˆ‹’Ž{ˆ“‘ŽŒ“’‹‹‹ˆ†ƒ‚†‰ŠŠŠ‰Š‰‹Š‰„€€„ˆˆ…„}|y}ƒˆŠŠŠŠˆ„~qhljf_`hz„‚~yspnnnnonptwyxtqnmnnopqrux{yvsqqsux}€€€€€‚ƒ‚‚ƒ~{||||yvuqmnu}}|{||zyrjfluusqqoppruxyzyxvwwwxxwwyyzzywwwwxzzzzzzyyyxxxwvvvspmha^^^_aehknoommnnpppppprsuvwyxyxxvtroonljhhid`^\VTTTTUWXZ^it|€ƒƒƒƒƒ‚~xoffjsvurnme_^`bgimqrsqqonmomlonopomq{„‡Ž“••”–—–’‹‰ˆˆ…‚…ˆŒ”’Ž‘’“”’ŽŠˆ‡ˆ‹‹ŒŒŠ‰ˆ‡†‚ˆŒŒ‹Š‰‰…€ƒ‡‡ˆŠˆ‡‡„{te]Z_it|}xyuqprromlmrvyywtqnnnnopprx|}{xwtttvy~€‚€€€€‚ƒƒ}{{{||ywtrmqw}~}|~}|xtlhrywqppppqqsxxyzzyywwxxyyyyzzywwwz{zzzzzzyyyxxxwvwwutrkgcbbaa`agjlnmmnnnnooooqrsuvwwxzzxvvtrpnmigcb_][XWY[\_aeipx~‚ƒƒƒƒ‚ƒzskfhov|zusokghiiihjlihhghknmllnprqrx{ƒ†Ž•—™›œœš—‰„€}‡Œ‘—š˜’’—œŸŸœ˜”ŽŠ‡‡Š‹‹Šˆ††„ƒƒ†‰ŒŽŠ‹‹‹Œ‹‰†……„……ƒ}|rnuƒ~xvtwvtsuvsmlmrwz{ytqnnnnpqstw{|zxwuuvxz‚€€€€‚ƒƒƒƒ}{}}}|zwurptz}~}|{}}ytlkvyvpppppqqqruyzzzzxxxxyyzzzzyyyyyyxxxxzyyyyzyxywwuwwuqmiiea`__bcfjmonnnnnnnnqqrtuwxz{{zxxtpmlhfc^\[Y\^_bcfinty|}€‚‚‚‚‚‚|tnffjqw|{wpmpsqkljiijjjooponjiptvxz|ƒƒ†Ž•šœœœ˜•‰ƒ€„ˆŽ”š  œ”’”–™™š™—•–Š…ƒ‚…ˆ…ƒ‚„€€†ŒŽŽŠ‰Š‰‰Š‹Œ‰†ƒ€€‚„„~{|wr|†‡vtw~}xrpsqmlnsx{{wtqnmmoqqssvwwvuuuwuw|‚€€€€‚ƒƒƒƒƒ|{|}~|zvurpu{}~}|}~}{ros||tpppoopppqvzzzzzyyzz{{||{{{{yyyyzzzzzyzzz{zyywwuxxyxtqnjgda_]^bglmnnoopppppprtuwwyzytqnjgea][[YZ[^acgknru{~€€‚‚‚‚‚‚}wpheejpwuxz{€~wsrpmkihffhlmjhhpw{}€‚‚ƒ„Š’›ž˜’‹‹‹‰ˆ‰‹˜žž›˜•’Ž’‘‹…wu~€ƒƒ‚ƒ„ŠŽŠ†„„ˆŠŠˆ‰‹Š†‚~~~‚}~€}yx||zwt{ƒ†€uqrqnnoquxyvtqnmlmmmkknonlmmopuw{€‚€€€€‚ƒƒƒƒƒ|{~~~|ywvtsy}~}}{tpx~{soppqqrrqsvzzz||zzyyzz{{{yzzzzyzzyx{{{{{zz{{yyxxwwxxwwvrnjfb`__bgkmonoppoprttuwvssqnkfd`[YWX[]^`behlqux{~€€€‚‚€yskegjkqsz‚…‡‡‰ˆ†…‚~zslddd_]bjlnnrv{|~Œ™žžž˜ŒŒŽ‘˜˜˜˜™™•ŽŽŽŠ…€volov…‡ŠŒ†„„…ƒ€€‚ƒ†…„~€‚€}yxuz|€ƒ†€xtrrppqrvzytpnmmmjkkknmmonooortuy{z|~‚‚€‚‚ƒƒƒƒ‚€€€€€}zzyvv{€€~~~~€|wv~zrppppqsttu{|{{{{zz{{|||||z{{zzz{{zy{{{{{{{zzzzzyzzyyyywutqnjd`^_cglmnoooopqrsttslida^ZYWWWYZ^chjmpuz{}€€€€€€|upifkosuz„‰‹‹‹Š‰‹‹ˆ…‚}zsjfgjkhhijkrz|tuƒ”›žžœš“ŽŽ’—œœš•˜œžš•ŒŠˆ‡‰Šˆ†ƒ€€zw|†ŠŽ‰|{~|||~ƒ„„‚€‚‚„†„€€}|}€~|{|yvssrrsuxzzurlkjjjklmnmlllkmmmlnsuwxz€‚ƒƒ‚‚„„„„ƒ€€€€€{{zzy~~~€yux‚|tqppqruuz~}zz{{yy{{{{{{zz{{{{zz||{{zzzz||{{|{{{zzzz{{{{xvtqlfa__cilmnopoqssutojd^ZXWVVX[^_bhnruy{~€‚‚‚‚‚‚|yroru}€|z‚‹‘‹ˆ‹ŒŒ‹‹Ž‹‚rioma\ahlqyxqm{šœš”’‘ŽŽ”™š™˜—šš˜•‘Œ‰††ˆ‰‰ˆ††‰Š‹‹‹ŽŽŠ‚{xz}~~„………ƒ„†…ƒƒ„ƒ„†…€~~}|yyyyzzwttstx}~ysomnnkkklnprrponlkijjijorw|€‚‚ƒ„„„„„„‚€€~z{{{z~€€€€xsw€ƒ{qpqrsstw|€|y{{{||{{{{{{zzzzzz|||}||||||||{{{{||{{{{{{{{|zxvqkda_^`cefghloppolhb][[\^^^cgkoruy{~‚‚‚‚‚‚‚‚‚‚{ww~ƒ†‡…„„‰Ž“‹ˆŠŠ‹‹ŠŠ’’‡wttj`]`is|}untŠ˜œ›™—”˜——”’’–™™–“’••”‘ŽŠˆ‡‡‡ˆˆˆˆ‡‹ŒŒ‹ŒŽŽŠ…ƒyy{{z}ƒ…†ˆˆ‡††„ƒ‚ƒ‚ƒ…„€{yyzy{}|zwxvwuuux|zspoljjkknrtvwyyyyvtsssokjlntz~‚ƒ„…………„ƒ‚‚‚|{|~}ƒ‚€€}tov~€ytsrstuux}€~|{|||{{{{||||{{{{zz{{||||{}}}||}}||||{{||||zz||{ztokgd`_^^_``dgihec_]Z[]`bgimrvy{~‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚€~z|€‚‚†‡‡†‡Œ’Š†…†ˆ‰Š‘’’‹|ww{slfguxpt‰•™››–”šššš™–•–—•“‘’‹Šˆˆ‡‡‡‰Š‰‰ŒŽŽŽŠ‡…‚€|zzzxxz}€ƒƒ„…‡ˆ‹‡‚€€‚zyy{z{}~}{xyxwvststtqoklloqoprvz}~~}{yyy{ztnihkq{‚ƒƒ†††‡„ƒƒ‚ƒ‚‚}{|~€‚…‚€€€€zqnt}}yvuttvvvz~€~|{||}{{||{{||{{{{zz{{||||{}}}}}}}||||{{|||||||||{ytplhe`^^\\\^ab`__^__bfjotx||~€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€}~„„ƒ…‡‡†††‰ŽŽ‰„‚ƒˆŽ’•–•Œ{|ƒ…„}vzxnn—š›˜“•šš™™™–”““’‘ŽŒŒŒ‹‹‹Š‰………‰‹Š‰ˆŠŒ‹‰ˆˆˆ„~y{yusuy~}yx{„‰Š‡…ƒ‚{zy{z{|~|zyxxxuronppoorstttstx|€€€‚‚‚~wnhhpzƒ„†ˆ‡‡…„…ƒ‚‚€~~€„„‚€€‚€zokr||wusuuvvvz~€~|{|}{{||||||{{{{{{||||{{{{}}~~}}||||||}}}}||||zzyxwsnjea]]][\\^`__`bglswy|}€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚}€……„ƒ†‡ˆ‡††…ŠŽŽŠ†€|}}‹“˜—–ƒ€ƒ‰Š„„whfs†”š›™š—ššš™”’‘ŽŒŽŽŠ‰Š‹‹ŒŒŒ‰……†‹‹Šˆ‡‰‹‹‹Š‰ˆyz{wutvy|}zxw‡ŒŠ†€€‚}wz{yz{|€€|yzxwtqnlknoqqruuuvwxz}€€€€‚€ƒ„„…‚|rjhp|‚…†‡ˆ‡‡†……ƒ‚‚‚ƒ…„zqnw~|xuuvvwvwy~~|~~~~{{||{{{{{{{{{{||||||}}}}}}}}||||||}}}}|||||||{ywvrpmkgba^^`befjnrxz|~€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‰Œ…„„†‡‡‡ˆ†„†‰Š†‚|{||€Ž—™™•‹„‚ƒ†‹Ž‹…†‡~tmt…‘—š—™™ššš™•’Ž‹‹ŠŠŠ‰‰‡‡ˆŠŒŒŠ††‡ŒŠ‰ŠŒŒŒ‹ˆ„|yyzyz|~|{{€†Š‰ˆ†„†‡ƒ}ywwxz}~zuqqonkjjmprrrsvxxyyz{€€€€‚‚‚‚„……†…ƒ{pfhr~„‡ˆˆ‡‡†……„ƒ‚‚ƒ„„……„‚‚‚|uu{}xwwwwywwy~|ywusq{{{{zzzzyyz|zz{{{{}}}}~~}|}}}}}}||}}{{||||||||{{||ywspniedehknrv~~€€€€€‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚ƒ‡‹‰„„‡ˆ‰‰‰ˆ††††ˆ‰ˆ„|{{}Š–››š˜Œ„‚‚†ˆ†‡‰…|totƒŽ–˜™™š››››™”Œ‰‰‰‰Šˆ……†‰Œ‹ŠŠ‹’”’Ž‘’ŠŠ‰‰ˆ…|{zyy{‚„††ˆŠ‰ˆ†‡ŒŒ‹‰…}vuvw{zvsqpmmnoruutuwxy||}}}}~€‚ƒƒƒ„……‡‡‡‡ˆ…zkdiu‚†‡‰ˆ‡‡†‡……ƒƒ‚…†‡†ƒƒƒƒƒƒƒ~z{„zwvuxxvw{€€{rjiii{{{{zzzzyyz{}}||}}}}}}~~}|}}}}}}||}}zz||||||||{{||{zxzxvsrqsvx{}€€~~~‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒƒƒƒƒƒƒƒ‚‡‰ŒŽŠ‹ŒŠˆˆˆˆˆˆ†…‡†ƒ~zz~‹”™œœ›‘‡‚‚ƒ††‰Š‡}pko}Œ•—˜˜šœš–‘Œ‹‹Š‰‡ƒƒ…‰ŒŒ‹‹Œ”–•“’””“Ž‹‰ˆˆ‰ˆ†ƒ~vsru{‚‡‡…„„…†…„„†‡‰‹ŠŠ„zxsrqqsrqsuvwwx{zzz{}}}}}}~€‚ƒ„…†‡ˆ‡‡‡‡ˆˆƒuhejx„‰‰ˆˆ‡‡†††„„…‡ˆ‰‡…ƒƒƒƒƒƒ‚€€„†…}zxw{{yxy{skgjljj||{{zzyyyyzz||}}||~~~~}}}}||||||||zz{{zz||{|}}}}||z|~~|z{|}~€€€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ€ˆŒ”Š‹Œ‹‹ŒŒ‹Š‰‡……‡†{{‡”–™›œš‘ˆ„…†ˆ‰‹ˆ|omr~˜™˜˜™œžŸžœ–’‘‹‰Š‹ˆˆ‰ˆŠŠŠŒ“”–•–——–“Ž‹‰ˆ‡‡………vliku€‡Š†ƒƒ„ƒ|y{€†‡ŠŒ‰†sqrrtutwyyzz}}||}~~€€€€€„†ˆˆ‰‰Š‰‰‰‡†…~peeq€…‡ˆˆˆˆˆˆ†……†ˆŠŠ‡…„„„„„„„ƒƒ…ˆƒ€}{{}}|zxvojlmkllozzzz{{zzzzzzzz{{{{~~~~}}}}||||||{{yyyxzz{{zz}}~~}}}~~€€‚‚‚€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ‚…‹ŽŠ‰Š‹‹‘‘’‹‡„…ˆˆ…†Œ’“”•–™œ›‘ˆ‡‡ŠŒˆ|sqsyŠ˜›™——šœœœ˜”“’••”’’‘‘Œ‹ŠŒ‘“•–—˜—•“‹ˆ‡……„„†„€tgbehnv€ƒ„ƒzzzvv|ƒ††ˆˆ†}zwyz{|}|{{{}~}|}~~~~~€€ƒ…‡ŠŠ‹‹Š‰‰‰ˆ‡‡…{megq~†ˆ‰‰‰‰‰‡††‡‰Š‹‡…„„„„„„ƒƒ„ˆ‰„~|}}~ztlinrrpqruyyyyyyyyzzzzyyz{|}~~€€~~}}}}}}||}}{{||zzzzzzyz||}}}~€€€€~~~~~€€‚‚‚‚ƒƒƒƒ„„ƒƒ‚‚„„„‚ƒƒƒ†Š‹Š‹ŠŠŠŠŽ“—–“‹…„ˆŒ‹’•”““”—›˜ˆ‡ŠŽ‰|vy}€ˆ–œ˜——™šš™”””˜™š™——”““““’‘ŽŽ’•––”””“‹†„ƒƒ„‡ˆ†xhhnkhnv~‚ƒ€~zxxxy{‚‚ƒ„„}{z~|||{{||}~}||~€€€€€€‚„‡Š‹‹‹‰‰‰ŠŠŠˆˆŠ€pgdis‚ˆ‰Š‰ˆ‰‡…†‡ŠŒŠ†„„„„„„„ƒ…‡ˆˆƒ‚}tklnprtuwx{xxxxyyyyzzzzzzz{|}}}~~~~}}}}}}||||{{{{zzzzzzyz||}}}~€€‚‚‚‚‚‚‚‚}}}|}}~~€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„„‚ƒƒƒ‰‘Š‡‹Š†ƒˆ‚€†—›š”ˆ‚‡’’“•”““”—šš”ŽŠ‹‹Œˆ€tpvˆ“œš—šœœ›š˜—™••žŸ™•””””•”’“””““”“’’’ŒŠ†ƒ‚„†ˆˆ„yqrusonr{€|{yuuwwuttrrv|~~||}|}||||}~}|}€€€€€€~‚„ˆŒŒ‹ŠŠŠŠŠˆ‡ˆ…yjcenz„‰ŠŠ‰‰‡…†ˆŒŒŠ†„„„„„„„„„ˆ‹Š„€€€{pkmosvy{|~€xxxxxxyyyyzz{{||}}~~}~~~}}||||||{{zz{yzzzz{|{{|||}€‚‚‚‚‚‚‚~|{{|{{{||~€€€‚‚‚‚ƒƒƒƒƒƒ……ƒƒƒƒ„„„„ƒƒ…‹‘ŽŠ†ŒŠŠ‰ˆ‚~„˜™™•‘Š‚‹’‘’•”•—˜››˜‘ŒŠŒŒˆƒztnr{‹šžœœŸŸŸžš˜—Ÿ ¡ ˜•“’’”•–—••”““””““’‰‡††ˆ‰‰‡{|{wsqt|ƒ„€|xwsnqvvtpmqx}|}}|}}|{}}}}€€€€€€€€‚…‰Œ‹ŠŠŠŠ‰‰‰Š‡pgcjx‚‰Š‹Š‰†…†‰ŒŒŠ†„„„………ƒ„„‰Œ‰…€€‚vljlpsvz}~€€xxxxxxyyyyzz{{||}~~~}~~~}}||||||{{||{yzzzz{||||||}~€‚‚‚‚‚‚‚~~|||{z{{||~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒ…‹ŽŒŒŽŒŠ‰‰…ƒŒ”–•“‘‹‚‰’‘‹“•–—˜šš˜“ŽŒŒŠ†€{tt‘œ¢¢žžœ˜–—”šŸœ™–’‘’•–—˜—––––—–”‘ŽŒŠˆ‰Š‹‹Š†ƒ€{{{~‚ƒ}{{wrlknsuusqqt{„ƒzxxz|||{}}}}€€€€€}}}~…‰‹‹ŠŠŠŠ‰‰‰ŠŠ„znikxƒˆ‹‹Š‰†…†‰ŒŒŠ†„„„………ƒ…‡Š‹‰…‚‚€wlkmosw{~~€€wwwwwwxxyyzzzz{|~~~~~~}}}}}||}{zyzzzz{{zzzzz{||}~~€€~}{{{{{{|}}~~€‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚…Œ’ŽŽ‹…ƒˆ“’…‚ˆŽŽ‹ŒŽ••———˜˜•‘Ž‹Š‡€|yy~‰•›Ÿžžš˜˜˜–˜›š™•”””•–••••–•—˜š›š˜’ŽŽŽŽŽ‘‘‹‡ƒ‚ƒ„…ƒ€€€|qeampsvxywuv|„‡ƒzxyz||z{{€€€~|{||„ˆ‹ŒŒ‹‹ŠŠŠŠŠ‰„ypnvˆŒ‹Š‰†„‡‰ŽŒ‰†„……†††……‡‰‹ˆ…ƒxnlnprvz€€wwwwwwxxyyzzzzz{||~~~}}}}}||}{zyzzzzzzzzzzz{||}~€€€~}{{{zz{|}}~~€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚†Ž’‘‘‘‘‘Žˆƒ…Œˆ†ˆ‹Š‰‹Œ“–—˜˜˜™•’‘‘ŒŒˆ}‚„‹“˜˜˜™—••–•”•—–••––––˜˜––••˜˜š•˜š”ŽŽŽ‘”•”‘Š…„…‡†„€€€~yqbOViotwvusqv€‡‡ƒ…‡‡„€~{z|{}}||zzxwx{}€„ˆŽ‹ŒŒ‹‹ŠŠŠŠŠ‰‡€vptˆŒ‹Š‰†„‡‹ŽŒ‰†„……‡‡‡†…†‰Š‰…€ymkpruy|‚‚‚xxwwxxyxyyzzzz{{||}}~}~~~~}}}}}}||{{{yywwwxyzzz{||~€€‚€€~}}{zz{{z{|}}€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚…Ž“’“‘‘‘”“’‹…„ŠŒ‰‡‰ŠŠ‰‰‹Œ”—™™™˜—”’Œˆ}…ƒƒ†‘”•––““““••••”•–˜™›™™———–˜š›œœ˜•“’ŽŽ‘”——–”Ž‹‹‰‰‡ƒ€€€|ylU73Whptvwwst|†‰‰‰‰ˆŠ‹‹‡‚|zz{zwuttutuw|€†ŠŽŒŒ‹ŠŠŠŠŠŠŠ‰wpt~ˆŒŒ‹‰†„ˆ‹‹‰…†…†††‡…†ˆ‹ŒŠ…{nlpsuy~„…ƒƒƒƒƒ‚‚ƒxxxxxxyxyyzzzz{{{{}}~}~~~~}}}}}}||{{|{zxxxxyzzz{{{~€€€€€~}{zz{{z{|}}€‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚…Ž–•””““””’Žˆ„‡‹Ž‹ˆ‰ŠŠŠŠŠ‹ŒŽ‘•—™™——’Ž‹†‚‚ƒ„ƒ†‰’“’‘‘“––—•••–˜œ›ž›œœ™šš›œ›™™––•’‘’”–˜—––“Œ‹ŠŠŽ‰„‚}ucC,/Vknnrwyupv€‚}x{~ƒƒ†‚€}zyvutux~„‹Ž‘ŒŒ‹ŠŠŠŠŠŠŠ‰wsv‰Œ‹‰††‰Šˆ…††‡ˆˆ‡…†‰Œ‹ˆ~smqtuz€ƒ†„ƒƒƒƒƒ‚ƒxxzzyyxxxyyz{{}}}}}}~~~~~~}}~~}}}}|zzz{yxxwwyyzz{{}~€€€€€~}}|{{{z{{|}~~€€€‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚„Ž–———••––”‘Žˆ„†ŠŒŽŠŠˆ‰‹‹‹‹‹ŒŽ‘“–˜™•ŒŽŽ‹‰„‚‚„…††‹Ž‘’•——••”–˜›™›¡ž˜Ÿ‘—™š™™——••••—˜—˜˜—–“‘‹‰ˆ‰‹‘Œ†€taJ<F`qrnorvusuz}ztvx{~€€ƒ‚‚€~}{vtsvz€†ŠŽŒ‹‹Š‹‹‹‹Œ‹‰€uswˆ‹Œ‹‰††ŠŽŽŠˆ††‡ˆ‰‰‡…†ŠŒsmqtvyˆ‰ˆ„ƒƒ„„„‚~sxxxxxxxxyyzzzz||}}}}~~~~~~}}~~}}}}|zzzyxxxyyyyyy{{|}}€€€€€€€~~}}|{{{zz{|}~~€€€‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚„‹–˜—˜•”–•”‘Ž‰……‰‹Š‰‰‰ˆ‰‰‰‹‹‹ŒŽ“–—”ŒŒŒ†~~„ˆ‘’’“–˜™–””–™›žž†‰˜Š˜›š™™™••–—šš™˜˜˜˜”‹‰‰†„…†…}ul[JNgwyuqotvutw}{y}€€€€€€~}}ywvvw{†‹Œ‹‹Š‹‹‹‹Œ‹‰€utxƒŠŒŒ‹ˆ…†ŠŽŽŠˆˆˆ‡ˆ‰‰ˆ††ŠŒˆxpqvvx€‰‹ŒŠ…ƒƒ„„„‚xmxxxxwwzzzzz{||{|||}}}}}}~~~~~~}}||||{zyyyyyyyyzz{{|}}~€€€€€€~~}|}|}{zz{{|}}}~€€€‚‚‚‚ƒƒƒƒƒƒ‚‚‚‚€€…“˜——–”–•“Œ‰……ˆŒ‹‡ˆˆ‰ŠŠŠ‹‹‰ŠŒŽ‘’””Ž‘Ž‡~xvwx}†––’‘‘–šš—“”—™™‰Œ’“’šžŸžŸ›š˜—–—š››ššš˜’ŠŠ‰ˆ‡„ƒ‚{tkaVO\v€{vppuwtx~ƒ‚~~€€€€€€~~|ywvvz~‚‡ŒŽŒŒŒŠ‹‹‹‹‹Œˆwv{„ŠŽ‹‰†‡‹ŽŠˆˆˆ‡‰‰‰‰‡ˆ‹‰}pruvx~†ŠŒŒˆ„ƒƒ„„ƒrixxxxyyzzz{z|||{|||}}}}~~~~~~}}||||{zyyxxyyyyzz{{|}}~€€€€€~}|}|}{{{{{||}}~€‚‚‚‚‚‚‚‚‚~zxƒ’—˜—–•”’Ž‹‡†‰Œ‘Š‡‡‡ˆ‰‰ŠŠˆ‰Š‹ŽŽ‘ŽŒ‘‘‘ŽŒ†~yxxyŽ——•”’“•˜š–‘“•™š›‰‘——œš””™žžž žš™˜—š›œ›››š“‹Šˆˆ†ƒ{wrmga`k{€|{wpirywx}„…€€€ƒƒ€~{ywvvz~‚ˆ“‘ŒŒŒŠ‹‹‹‹‹Œˆvu|…‹Ž‹‰†ˆŒŽŠˆˆˆ‡‰‰‰‡…‡‡pquvw~…ŠŽŒˆ„„„„„‚ynjxxxxyzzz{{{{||||||~~~~~~~~}}}|{|}}}}||{||||zzz{{{{~~}}~~€€€€~~{{}}||{{||}}~€‚‚‚‚‚€€€‚‚‚~wom|‹”•””•”’‹ŠŽ‰…„„‡ˆ‰‰ˆ‰ŠŠ‹ŽŽŽ’’‘Œ†ƒ€€†˜˜˜——•”•——•—™—‘›—’˜ž œŸŸšž˜ œ˜˜™ŸŸžœ—“Šˆ‰ˆ‡„‚zurqroorwyuuuogjsxy|‚‚‚‚‚‚‚‚~~{yyy}…‰Œ’’Ž‹‹ŒŒŒ‹†}vv~†ŽŒ‰†‰ŽŒŠˆˆˆ‰‰Š‰ˆ‡‡€snrvy~ˆ‹Œ‘‹ˆ…„††…}pikxxxxyzzz{{{{||||||{{~~~~~~~|}~~~~}||{|}}|zzz{{{{||||||~~~~~~~~}}||}}||}}~€‚‚‚‚€€€€xndgy‡Ž‘“••Ž‰Œ’“‘Ž‹†z~…‡ˆ‰ŠŠ‰ŒŽ’’‘’‘‘‘“–˜™˜˜–••—™˜—™œ™’››žž¡ ¢Ÿ¡Ÿ¡œŸ›š›¡Ÿ ™œœ˜“Š‡ˆˆ‡†„~{z{zxqllmknstmhkpw……‚€€‚‚‚‚‚‚€~{yzz{‚…‰Œ’’‹‹ŒŒŒ‹…}wy€ˆŽŒ‰ˆŠŽŒŠˆ‰‰‰‰Š‰ˆ†€xprtv}‡ŒŒ‹Šˆƒ€€€}zshgjyyxyyzzz{{{{||||}}}}~~~~~~}}~~~~~~||{{}}{{zz||}}}}}}}}|}}||}~~}}}}||||||}}€€€€€€€€€€~|qd_fw}{|‚‰’‘Œ’”“‘ŽŒˆƒ|y€„ˆ‰ŠŠ‰Š‹ŒŽ‘‘‘‘’“’‘’“›¡ŸšŽŒ•šš˜š˜—˜››š™š™—   ŸŸŸ ž”— ¡¢Ÿœšœ¢¥¥žœ›—’‰‡†……†„ƒƒƒ}xnbafknqrpjfjuƒˆ†‚‚‚‚‚‚‚‚}|{|~„‡ŠŒ“’‘ŒŒŒŒŒ‰‚{xz€ˆŒŒ‰ˆŠŽŒ‹ŠŠŠŠŠ‰‰ˆ‚vrtuvy…ƒ‚~{vqnooomlfeflzzyz{|||}}}}||||}}}}}}~~~~}}||}}||||{{||||||{||{z|}}}}}}||||}}~~€€€€~~€€€~zshb`ehjknz„‘’Ž‹‹””’‹‹ˆ„‚orz‚‡‰Š‰‹ŒŒŽ‘‘‘‘“”“‘‘‘•¨¦‘Š›¦§¢›˜˜››š˜˜šœ›¡¡ ”› ¡šŸ› Ÿž›ž¡£¢ ž›—‘Œ‰ˆ‡…„„‚‚€~}ytqnicbglornhen|€€‚‚‚‚‚‚‚~}}€‚…‡ŠŒ““‘ŒŒŒŒŒŒ‰zx}ƒŠŽŒ‰‰ŒŽŒ‹ŠŠŠ‹‹‹Š„wqtvutvspnjihhfghhhgfecehzzyz{|}}||}}||||}}}}}}€€€€€€€€~}}~~}}||||{{{{zz{{{{||}}}}}}}}|~€€€€€€€€€€~~}~~~|{vmfabdehin{ˆ’’Œ‰Ž‘”—”Ž‹ŒŒˆ„ƒ‚tjlw†‰ŠŒŒ‹‹’“““““••’’‘“™¡¤’‹œ­®©¥——šœœ›š›žŸ ˜šœœœ˜˜šœŸŸŸœœ £¡žœ›—‘ˆ‡††„ƒ‚€~{vux|yla^bjoojfkuyz{~€‚‚‚ƒƒƒƒ€€‚ƒ…‡ŠŒ”“‘ŽŒŒŒŒŒŒ†~yz~…‹Œ‹‰ŠŽ‹Š‹‹ŒŒ‹‡}stvsonieccdehilnoponkhhffzzyz{|}}}}}}||||}}}}}}€€€€€€€€~}}~~}}}}}}}}{{{{{{||||}}}}}}}}|~€€€€€€€€€€~~~}~~~|ukeehfeefgo|‰‘Ž‹‹’”—–”’ŽŠˆ†ƒ}trv|‚‰Š‹ŒŽ“””•”“”””’’’•›¡™¢«§¢ žš™˜›œœœœœ˜—¢Ÿ›™šœ›™œœ›™››™œžž›˜•’Ž‹‰‡††„ƒ„€~|zvx{€ync^`hmkgmy€€€‚‚‚ƒƒƒƒ€€‚ƒ†‰ŠŒ”“‘ŽŒŒŒŒŒ‹…~y{€‡Œ‹Š‹ŽŽ‹ŠŒŒŒŒ‰€tsrligdedehlouy}~€€xqlmlnn{{{{{}}}~~}}}}}}|||~~~~~~~}~€€€€€€€€€~~~~~~~~~}{||||{{||||}}}}}}}}}}€€€€€€€€€€~~~~~~~xofbehddedgp{‰Œ‰Œ‘“–˜–•”’ŽŠŠ‡{utzƒ‹ŒŽŽ’“”–•”“”•”•““”—ž¨«¦ž›˜››™™œžžžœ››–£§¥¡žžžœšš™–•™˜˜šœ›™—’ŽŒ‹‰‡†…„ƒƒ€}yyy|}wkb]blmlmt{‚‚‚‚ƒƒƒƒƒƒƒƒ…‡‰Š‘“““ŽŒ‹ŒŒŒŠ‚|{{ˆ‘Œ‹ŽŒŒŒŒŒŒ„vnlhgdghkkntzƒ…‡ƒ…†‚zrmoqvx{{{{{}}}~~}}}}~~~~|~~~~~~~~€€€€€€€€€€€€~~~~~~~~~}{||||{{{{{{||}}}}}}}}€€€€€€€€€€~~~~~~|xpfeffgggccir€Œ‰‹”—™—–––“‘‘ŽŠ†€vtz„’‘Ž‘’“”––•‘‘‘”–””•–™ ¡˜“”—––—šž›š››Ÿ¤¤¡žœœ›š™˜••™™˜šš˜”Œ‹‰ˆ†…„ƒƒƒ‚€~~~€€€€€}xqe^elqroqu|‚ƒ‚‚ƒƒƒƒ„„ƒ‚ƒ…‡‰Š’““ŽŒ‹ŒŒŒˆ|{{ƒ‰Ž‘Œ‹ŽŽŒŒŒŒ‹†xnkikkmmqv|„Š‰†††~rnnt{…||{}|}}~}}}}~~~~~~}~~~}~€€€~~~~~~}}}}|z||||||{{z{||||}}|}~~}€€€€€€€€~}}}}}yshdfgikkibbjs~ˆ‡‡Œ‘”—˜˜˜™™—•Œ‰…|y|„“‘‘’“““•”‘Ž’•––•“—˜š—’•””•–šžŸ›˜•››¢¢¡ž›———˜š™˜—–˜™˜™˜••“‹‰‰ˆ†…„ƒ‚~||}€‚€€€zqcfjoojelxƒ‚€~ƒ„‚„„‚‚€‚‚…††ˆ‹Œ‘’’ŽŒ‹‹‡€zz„Š‘Œ‹‘ŒŒŒŠ}mifhmqrv~†Œ‘’’‘‰ˆ‡ƒyqnrx~„…zzz{|}}~~~}}}}~~~~~€€€€€€€€€€}}|z{{{{zzzz|||||||||}~~€€€~~~~~~~}}}|zshccfilmkgbbit„…‡’”–˜š™™šš˜–ŽŽ‹Š‰‚{~†‘‘‘‘’““’““ŽŒŽ’••“’’”˜—•”””•–˜››—••—›žœ›™–••–——˜˜–•––—••”‘‰‰ˆ‡†…„ƒ‚€}{z{}€€‚€zurqrogjvƒ†„‚„„ƒ„„‚‚ƒƒ…†‡‰Š‹‘’‘ŽŒ‹Œ‰…}|{€‡‹‘Œ‹ŒŒŒ‹pffhkty~…Œ‘’’’‘‰‡†~tpps{‚…‡{{||}~}~~~~~~~~~~~|~€€€€€€€€€€€€€€€}}}}|zzzzzyyzz{{{{||}}~~~~€€€€}}}|||}}}}{uicaehmqpnibcluƒ„‰“••–™›ššš™—•‘Ž‹‰†ƒ~…’“Ž‹ŠŠ‰‹ŒŽ‘”““’’••“““”–˜˜™˜—•’’“•š›šš™š—–•——™˜˜˜˜–•”•“‘‰ˆˆ††…„ƒ€~|{y{{|€‚ƒƒƒƒ‚€}~}{{{urw}„†ƒ€€‚„„ƒƒ‚‚„„†††ˆŠ‹Ž’ŽŒŒŒŒŒ‡|{|‚ˆ‘Œ‘ŽŒŒŒˆuhfknrz…‹‘’“““‘‘‰ˆ„yqqsy…ˆ‡||}}{|}~~~~~~~}}~~~~~~~~€€€€€€€€€€€€€€€}}}}|zzz{{{{{{||{{{{z|~~~~}}}}~~~}}}}}zrjddcekpsqngbcir|„‰”—–—™›šš™—•’ŽŽŒ…}z~‚ˆŽŽ‘ŽŒŠ†‚€‚…‡‘‘““““”—ž¢ –“”’‘“”——˜˜—šž›˜—˜™›š›˜•“”“Œ‰ˆ‡††…‚~|{z{{|€‚ƒƒƒƒ‚‚€€€‚ƒ‚}x~…ywx€„„„„ƒƒ„…†††ˆŠ‹ŽŒŒŒŒ‹…€|{|‚ˆŽ‘‘ŽŽŒŒŠzlfinr{‡‘‘’““““‘ŽŠ‡…uprt|ƒ‡‰‰}}}}}}~~~~~~}}||}}||~~€€€€€€€€€€€€€€€~~}}{{{{yzzzz{{||||{{{|~~~~~}}|}€€€€}|ztjddeeiossqlfaelx„…‰•˜—™››››—•“ŽŒˆxnu|†‹ŒŒ‰‡„€~{|ƒ‰ŠŒ‘’‘•—§¬¦™”‘‘“•—˜———˜››™™šœ››œž›˜•””’‰‡‡‡………ƒ‚~||{{|}€‚ƒƒƒƒ‚‚‚ƒƒ‡‡y|‚z{}ƒ……„„ƒƒ……††‡‰‰‹ŽŒŒŒ‹„~}}€„Š‘‘‘’’Œ‹~mdfknu„“““””••”‘Œˆ†…{rnqxˆ‰‰‰~~~~~~~~~~~~}}||||||}}~€€€€€€€€€€€€€€€~~}|{{{{yzzzz{{||||{{{|}}}}}}}}}}~~}}}{ukdcegimqttpkhgip|…††‹•˜™›››š™˜•’ŽŒ‹ŠŠŠ|giu||~€…‡‰ŠŠ‡„€|{|ƒ†‰ŠŒŽ‘”œ§«¬©£›•’’‘’•–—•••–™™™™šœ›š›œ›˜”“‘‹ˆ‡‡‡………ƒ‚~}}}}}~€‚ƒƒƒƒ‚‚‚‚ƒ„‡‰ˆ…€‚‚~{„……„„ƒƒ……†††ˆ‰‹ŽŒŒŒ‰ƒ~~…‹‘‘‘’’‹€qjiilr’“””””••”‘Œˆ‡€uoqv{„ˆ‰ŠŠ~~~~~~~~||}||||||~€€€€€€€€€€€€€~~}|}|{{{z{{{{zz{{{{{{||zz||}}~~~~~}|ulcaehlnqvwsnjghlsˆˆ‡–™™œœ›š˜—•“Š‰‰‹‚l`lvvxwx|ƒ†‡††…‚€~‚‚†ˆ‰‹ŽŽ’¨ª¥¢žš•“•”‘‘”˜™—™›š—˜˜–•“’‰‡‡‡ˆˆ†„ƒ~~}}~ƒƒƒƒƒ‚‚„…‡ˆ†„‚„€yx{~‚„„ƒƒƒƒ„†……†ˆ‰ŠŒŽŽŒŒŒˆƒ€‚ˆ’‘‘‘‘‘‘ŽŒŠ…ykjklr{‹’””“”••••“Š‡†|spty€†ŠŠŠŒ~~~~~~~~~~}|||||~€€€€€€€€€€€€€€€€€€~}}|||{z{{{{zz{{{{{{||}}||}}}~~~}wmd`dhknsvxwqlhgks{„Œ‰†Œ•˜—šœ›š˜—–”†‚…ˆ†‚qacpvwwx|‚„…„…„„„‚ƒƒƒ„†ˆŠŒŽ“™œœ™—“Ž‰ˆ‰‹ŽŽ”•–˜›š˜•””’Ž‹ˆ‡‡†‡‡†„ƒ€ƒƒƒƒƒ‚‚‚‚‚„††…„ƒƒ}tsw|„„ƒƒƒƒ„†‡‡†ˆ‰ŠŒŽŽŽŽŒˆƒ„‰Ž‘‘‘‘‘‘‘‘ŽŒ‡{lklmpxƒŽ”“““”••••“‰†‚xqrv{‡ŠŠŠŒ~~~}|||{}}||}}|||}~~€€€€€€€€~~}|}}{{z||{zzzz{{{|}}}}}}}}|}~~}}~}zshbbhkmsyz|wqlihnt{‡ŽŒ‡ˆ•—™š˜–•“‘‰†ƒƒ~vf`mtwxz~ƒ…„…„„„ƒƒƒƒƒƒ„†‰ŠŽ’”—˜—”“‰ƒ„†‰Œ‹ŠŠŒ”“—˜™–““’ŒŒŠ‰‡‡ˆˆ††††„‚€~~€‚‚ƒƒ„„ƒƒƒƒƒƒ„„…„„{totzƒƒƒ‚„„…†††‡‰ŒŒŒŽŽŽŽŽŽ‹†„‚‚„ˆ’’’’’’‘ŽŽ‰€qkonnw””””••••••’‰…|trtw}…ŠŠŠŠŠ€€~~~}}}}}||||}}|||}~~€€€€€€~~}}~~}|||{{z|{zzz{{{{{|||}}}}}}|}~€€{tkcafikqwyzytmihlpw{…‹…‡’•˜™š™–•””’Šƒƒ~yk`m~€ƒƒ……„„„ƒƒƒƒƒƒ„†‡‰‹ŒŽŽ’”““‘Œˆƒ‚ƒ…ˆŠ‹‰Š‹Ž’”•”‘ŒŠ‹‹‰ˆ‡‡ˆˆ‡‡‡‡„ƒ€€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒ|tkchuƒƒƒ„„……††‰‹ŽŽŒŽŽŽŽŽ‹ˆ…‚ƒ„†‹Ž‘’’’’’’‘†vlknps|ˆ‘•”””••••••’ˆ„xqrvz€ˆŠ‹‹ŒŒ€€~~~~~~||{{{{||||||||}~~~~||~~|}||||||zz{{{{{{||{{|||}}}}}~~~~zpgbeilpw{||yunihnuxz…Ž‹†…ˆ’•™˜•”“““’Ž‹ˆ†ƒ€~q`i€‚‚ƒƒ……ƒƒƒƒƒƒƒƒ…†‡ˆŠŠŠŠŒ‘‘Œ†ƒ‚‚‚„‰ŠŠ‰‰Š‹‘‹‰‰‡ˆˆˆ‡‡ˆˆ‡‡‡‡†…ƒ€€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒxslb[gzƒƒƒ„…†††‰‹ŒŽŒŽŽŽ‹†‚‚ƒ†‰‘’’’’’‘’’‘Špjkptzƒ“”•””””••–”“Žˆ‚vqsw}‚‰‹‹€€~~~~||}|{{{{{{|||||||}~~~~~~~~~~~~~~}}|}}}}}||{{{{||||||{{{{{|}}}}~~~~wlbchjnty{}{yuqmmnmjm~Ž†…ˆ‹’•”‘‘‘‰††…wee{„„ƒƒƒ„„„„ƒƒ††……„„ƒƒƒ…†‡‰‰‰Š‹‹ŽŒ‰…ƒ‚‚‚ƒ†‡ˆˆˆ‡‰Š‹ŠŠ‰‡††‡ˆˆˆ‡‡ˆˆˆˆˆˆ‡†…ƒ€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒ}wqlcRPgz€‚„……†††ˆŠŠ‹ŒŽŽŽŽŒˆƒ‚ƒ…‡‹‘’’’’’‘’’‘†unmnqu}‡‘”•”””””••–”’Žˆursx~„‰Œ‹€€~~|~~~~{{{{{{{|||||||}}}~~~~~~~~~~~~||}}||}}||||||{{{{||||||}}~~~|vkegikov{}}}{wspplc_i‚‘‡ƒ…‹Ž’ŽŽ’Ž‰ˆ‡…‚zkew„ˆ†„„……††††‡‡††††„„ƒ…‡‡ˆˆˆ‰ŠŠ‹Œˆ„‚‚€ƒƒ„…††ˆ‰ˆˆ††…„„†ˆˆ‰‰ˆˆ‡‡ˆˆˆˆ‰ˆ††…ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚ƒ‚ƒƒƒƒ‚~vmbOLZp€ƒ…††††‡ˆ‰‹ŒŒ‹ŽŽŽŠ‡ƒƒ„‡ŠŽ‘’’’’’’‘’’’Œ}olnpt{‚‹“••”••••–––“‘Œ‡|ssu{ˆŠ‹ŒŒ~~~~}|}|{|{{{{{{|||||||}}}~~~~€€~~}}||}}}}}}||||||{{{{|||||}}}~~}{vnhjkmsx}~{{zxuspg^_mƒ‘‡ƒ†Œ‘ŒŒ‹ŒŽ’Š‡…{mbqƒŠˆ‡‡ˆˆˆˆˆˆ‰‰ˆˆˆˆ††…†‡‡ˆˆˆ‰ŠŠŠŠŒŽŒˆ„‚‚€€€‚„††‡ˆˆˆ†„„…‡‰‰‰‰‡ˆˆ‡‡‡‡‡‡‡‡††…„„„„„„„ƒƒƒƒ‚~zwv{€‚ƒƒ‚‚‚€zrnotz~‚„ƒ…††††‡ˆ‰‹ŒŒ‹ŽŽŒˆ„ƒƒ„‡ŠŽ‘’’’’’’’“’Žƒsmnprw~†Ž“••”••••–––“Š„xssv|…ˆ‹ŒŽŽ~~~~}|||{{{{{{{{||{{{{|}}}}}}}}}~~}}}}}}}}}}||||||{{||{{}}|}||}}~~|ztpknmpw|~~}}zwsld]_n…†„‡‘‹Š‹ŒŒŽ“‘ˆ…‚|tpgg‰‹ˆ‰‰‰‰‰ˆˆŠŠ‰‰ˆˆ††……‡‡‡‡‡‡‰‰ŠŠ‹ŒŠ†„‚€€€€ƒ„††‡‡‡†…†ˆ‰Šˆ‡ˆ††ˆ‡‡††††………†‡‡……„„„„„„…„ujcgqzƒƒ‚‚€~|||~{}‚‚…†……††‡ˆˆ‹ŒŒŒŒŒ‹†ƒƒƒ…‡ŠŽ‘’’’’’’’”’{omops{‚Š’“”•”•••––––“Štqsv}†ŠŒŽŽ~~~~}|{{z{{{{{{{||{{{{|}}}}}}}}}~~~~}}}}}}}}}}}}||||||{{||{{{{z|||}}~~{ytpmnory|~€}zwpgZXfu‚‰‰…ƒ†ŒŠŠŠŠŠ‹’’‹ˆ„{rl`e|†ŠŠŠŠŠŠŠ‰‰ŠŠ‰‰‰‰ˆˆ‡‡‡‡††‡‡ˆˆˆ‰ŠŒŒ‹ˆ††„‚€€‚„††‡‡‡†‡‡ˆŠ‰‡…„„„…††††††………†…………„„„„„„„‚|qc^]eoz€€}yx|~||~ƒ…†‡‡††‡ˆŠŒŒŒŒŒŒ‹ˆƒƒƒ…†‰ŒŽ‘’’’’’’’”Žƒrllnpv}„‹“”•”•••–––•’Œ†{ssuz‡‹ŽŽŽ}}}}||||}}||{{zz{{{{{{zz{{}}||}}|}}}}~~~~~~~~~~~~}}}}}}}}}}||{{zz{{zzzyyz||z||||yplmknry€€~€€~zsk]Z]js}‡‹‡ƒ„‰ŽŒŠ‰Š‰‰‰‹ŒŽ‰‡…ƒ{unbo‹‹‹ŒŒŠŠŠŠ‰‰ˆˆˆˆ‰‡ˆˆ††‡‡ˆ‹‹‰‰ŠŠ‹ŒŒŒŠ‰‡…ƒ‚€‚‚„††‡‡‡‡‡ˆ‰Š‰„€}ƒ„„……†††…†…„„ƒƒƒ„……†…„ƒ|qe^Y\emt{}zyyy{~}|~‚„„…†‡‡‡ˆ‰‹ŽŒŠ†„‚……ˆŒ‘‘’’’’’’”‘‡znnlmqx€‡Ž’•••”•••–––”‹„wsru}„ŠŠŽŽ‹}}}}{{||}}||{{zz{{{{{{|||||||||||}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}||||{{||zyyz{{yyz{yunkkjjnx|~€{tkb[\aemx…‰…„ŒŽ‰ˆˆˆˆˆ‰‹‹Š‡††‡†ƒ‚€}~‚‡‰‰ŠŠˆˆ‰ˆ‰‰ˆˆˆˆ‰‡ˆˆ††‡‡ˆŠŠ‰‰‰‰Š‹‹ŒŒ‹Š‰‡„ƒ‚‚„††‡‡‡‡‡ˆ‰‰„~ywz€‚€}~~ƒ„…†…„„ƒƒƒ„ƒƒƒƒƒƒ}re^\]`ipwyzzyvvx{|{z}„…„†‡‡‡ˆ‰ŒŠ‡…ƒ„†‡ŠŒ‘‘’’’’’’’Œ~qmnmqu|Š’•••”•••–––”Štstx†‹ŽŽŠ„}{{{{{{y{{{{{{zzzzzz||{{}}}}}}zz}}}}}}}}~~~~~~~~~~~~}}}}}}}}}~~~~~}}||}}}}{zy{zywvxywrlggghmu{~ypiedcecags‚ˆ†„Ž“‰ˆˆ†††‡Š‰‡ˆˆ‡ˆ‰‹Š‡‡††‡‡ˆˆ‡‡‡†ˆ‡‡‡‡‡ˆˆ‡‡†††‡ˆ‰‹Š‰‰ˆ‰‰‰‹‹Š‰†…………†‡ˆ‡‡‡‡ˆ‰‡‚yvv{}yyy|„…‡†„„ƒƒƒƒƒƒ€€~{tib`_^fmqtx|{zxx{{|{~„…„…†ˆ‡‰ŠŽŽŒŠ‰†ƒ‚„‡ŠŒ‘‘‘““““““’ˆynnnou{€…“••””””•–••’Žˆ~uuvyˆŒŽŽŽŽ‹„|}{{{{{y{{{{{{{zzzzzzzz{{{{||{{}}}}}}}}}}~~~~~~~~~~||}}}}}}}}}~~~~~}}||}}||z{{zzyvuvvuqjfcfghowxphdejlgb`bk}ˆ‡€‚•‰ˆ‰‡††„‡‰Š‰‰ŠŒŒ‹Š‡‡‡‡‡‡‡†…‡†††††……†††††‡Š‹‹Œ‹Š‰Š‹‹‹‹‹‹Š‰‰‡†††‡‡ˆ‡‡‡‡ˆ‰‡{vw}zwx|~‚ƒ……„„„ƒƒƒƒƒƒ}{tmheeb``_`aiq{{tnmqtxy~‚„†…†ˆ‡‰ŠŽŽŒŠ‡ƒ‚„†‰‹‘’’““““““ƒrmopqx}ƒˆŽ’••””””•–••‘†{tuu{ƒŠŒŽ‹„xn{{yyzzzzzzyyzzyyyyzzzz{{{{{{{{{{}}}}}}}}}}}}}}}}}}||}}}}}}||~€€}}}}}}||{zzzyyyyvvtsrmgabchehryzridhnsrqh`^f}ŽŽƒ‹”ˆˆ‰‰…„„„†‰‹‹‹’’Ž‹ŒŠˆ†††††………………„„……†††††‡‰ŠŽŒŒŒ‹‹‹‰Š‰Šˆ‡‡‡‡ˆˆˆˆ‡‡ˆ‡†|z|~‚|z{~ƒƒ„…ƒƒ„ƒ„ƒƒƒ‚‚€zkRFN\eca`a``eluwrnhb][dou~ƒ„‡ˆ†‰‹ŽŽŒ‹‡…‚ƒ„‡ŠŒŽ‘‘““““’‘‹|qnppuy†‹Ž‘“••””””••”“‹‚ywwy†‰ŒŽ‹†zok{{{{zzyyyyyyzyyyyyyyyyzz{{{{{{{{}}}}}}}}}}}}}}}}}}||||||}}~~~~~}}~~}}||{zzzyyxxwwtspkebcgiihjswrklqx|{wqhch€‘’‡‡Žˆˆ‰‰‡†‚„†‰‰Œ‘“”“Œˆ‡††††………………„„„„„„„„†‡‰ŠŽŽŽŽŽŽŒŠ‰‰‰Š‡‡ˆˆ‰ˆˆˆˆˆˆ‡†~}€€}|~ƒƒƒ„„ƒ‚ƒƒƒƒƒ‚‚~ueYX`egebabeecdfllhd^YUOU]^fr€†ˆˆ‰‹ŽŽŒŒ‰†„‚ƒ„‰‹‘’““““““…wqsruy}€‡‘“••””””••”’‡|vwwz€‡ŠŒŽ‡|rmk{{zzyyyyyyzzxxwwxxyyxxzz{|||||{{}}}}}}||}}}}}}}}}}|||||||~}}}}}}~~~~~|}|{yxxyyyyxwurohcadjmlgekrqpru{€€{rmq‚”ŠƒƒŠŒˆ†ˆˆ‡†„‚ƒ…‡‡‹’””’Œ‰††…††‡‡††……„„ƒƒ„„ƒƒ„†ˆŠŽŽŽ‘‘Ž‹‹ˆˆ‡ˆ†‡ˆˆ‰‰ˆˆˆ‡…‚‚‚ƒ‚€€ƒƒ‚‚~{~€‚€€‚‚}wqs}|vnidcgkjeacdfeaXSONTSOQdy„…ˆŠ‹ŽŽŒ‰†‚ƒ„„‡ŠŒ‘“’““’““‚uttty|~‚ŠŽ‘’”””””••••”‘‡|wxx{ƒ‡‰Œ‰€tmmnzzyyxxyyyyyyxwyyyyyyyyzzz{||||}}}}}}}}~~~~~~}}~~}}|||||||~}}~~~~~~~~~|}|{yzzzzzzxwvtokfchnrrojkqqompy‚€ztv‚™’„†‹‰ˆˆˆ‡†…„‚ƒ……‡Š’”’’‰…„………‡‡‡‡……„„ƒƒ„„ƒƒ„††ˆˆŠŒŽŽ’’“‘ŽŠˆ……„…†ˆ‰‰ˆˆˆ‡„ƒƒƒ„„ƒ€yrrw|€€|tporw{{{||€ƒwogcdhpojdb`_ZSKGFF@KJLWer~†‰‹ŒŒ‰†ƒ‚ƒ…‡‹‘‘“’““’“’‰|tssty}‚Š‘’”””””••••”‘‹‚yvyy}…‹‹ˆ‚xpmpsyyyywwwwxxwyxxyyzzzzxyzz{{||||}}}}}}~~}}}}||||{{}}||||||}}~~}|}|{{{{||||zxxwvsnjgfjqturnkmnnihr}‚‚|wxƒ—“…}‚ˆ‰‰‰‰‰ˆ…„ƒƒ…†„‡‰Š’‘Ž†}ƒ……††‡‡‡‡††„ƒ‚‚ƒƒ„„„…‡ˆŠŒŽ‘’‘’““‘Š‡†„ƒ‡ˆˆˆˆ‡†††……‡„zpjgggjpuuqnjjnpsqpsx|ƒ}sjbbadnpleb\YTL@:68=EC@HUfu€†‰Š‹‹Š‰„€‚ƒ…‡ŠŒ‘’’’’“““”Ž„vqrtv{~~ƒŠ‘“”””””””••“’Šwvyy†ŒŠvonquvxxwwwwwwxxwyxxyyyyyyxyzzzzzz||||}}}}~~}}}}||||{{}}||||||}}~~}|||{{{{{||||zxxwurnjeehotutpkjjjdcmz€€zvv€•’ˆ}|‚†ˆ‰‰‰ˆ‡……‡‰‡†††ˆ‹ŽŽ‹ƒrcn}‚„……††……††„ƒ‚‚ƒƒƒƒƒ„†‡ˆ‰Š‹Ž‘‘’”“Ž‹‰†|vy„…‡‡†††„…vliigefginturmhcdghgis|€ukgcabjrqjc]ZUOIB<>GMNRWPMcq}†‰‹‹‰†‚€ƒ†‰‹‘’’’’”””’‹~ustvx}~~‚‘“”””””””••’Žˆ}wxy{‡‹‹„{qmnty|wwvvwwwwwwwwwwyyxxyyzzzzzyzz{{||}}}}}}}}}}}{{{{{||}}{{}}}}}}~|zzyyy||||{{{{{yxvspkdcenswxuplkjgcjw€ytuŒ’“‹‚~~„ˆˆˆ‰‰‡‡ˆ‹‡……†ˆŠ‰Š„vfXYs~‚„„ƒ„……†…ƒ‚‚‚‚‚ƒ„……‡ˆˆŠŽ‘‘‘““‘Žˆ€srv|ƒ‡†‡†ˆ…‚yqoppljijjmtvvnieb`_`fs}ƒ„„‚xmhebcmzzrkd`]YVZ\ZYYTY_H,@_t„‹Šˆ…€€ƒ„‡ŠŽ’’‘’”””’ˆyppruz|}~„‘’“””””“•••’…|wxy|‚ˆŠˆ}toonu}uuvvwwwwwwwwwwwwxxyyzzzzzxyy{{||}}}}}}|||||}}}||{{{{}}}}}}€€~zwvuux{{{|{{{{{{zvsolfcbhnrwvtpkjgcet}~xvsvŒ’“Ž‡}†‡‡‰‰‰‰‹‘‘Œˆ‚~}{|zujaTN[y€„„ƒ„………ƒƒ€‚‚‚ƒƒƒ…†‡‰Ž‘‘‘ŽŠƒxqssy‚…†„~wustvwupnklswwvrnjfffkv‚ƒƒƒ}rlfbfszxsked`^]^cfe_^_Y=,1ATi|„†ƒ„…‰ŒŽ’’’”••”‘„xqqruz|}~„‘’“””””“•••Œƒyvyz~ƒˆŠƒxqpqu|‚ttvvwwwwvvxxwwvvwwyyzzzzzzyyz{||||{|}{}|}}}}}}||||||}}}}}~~€~~~}{wsqsvz|~|}||{z{yyvrmgbcjosuvtroljdaiqropsvƒ’’Š‚}…‡ˆˆˆˆŠŽ“””’‹ƒyoinqlf`TKLc{‚„„„„…ƒƒƒ‚‚‚ƒ„†‡ˆ‹ŒŒŽ‹Š‰‰‡‡ˆˆ‰„vnnruy|~€‚€|yxtu}‚€vpnoquvuutqpnnqv~‚ƒƒƒ{rld_cpwwtoiccbbcgjlkd[M:8FOZpƒˆˆˆ‹‹ˆˆŽŽ’’’“••”€rooovz~}€‡’‘’“””””””•“‰zwxy†‹…ztpqrx‚‡„vvvvvvwwxxxxwwxxyyyyzzzzzzzz{|{{||~~}|}|}}|{||}}||||}}}}}~~€€€|zwsqqsw{|~~~~|{zyxvrmecfnqvxxwvpmkf_biiimrxƒ’’‹……‡ˆˆ‡ˆ‹––—“Ž‡}nggkid^VOGMl|………„………„ƒ‚‚ƒ„‡ˆˆ‡††……ƒ„„ƒ„…ƒ‚{tqruyzyyzywyx{€‚…ƒzqorvyxwwwvsqqtzƒƒƒ}smfbht{{uqjhhgeddccb^TD:?Xw‡‘‘Œ‰„‚ƒ‡‹Ž’’’“““”~rqoov|}€‰’‘’“””””””•“ˆyyyz€†…}ursuwˆ‰ƒuuvvuuuvwwxxxxxxyyyyyyyz||||{|||~}~~||}||||{{{{{{{|||||||}€€€~{wrqqty}~€|{wvttqoiefjpuvxyxvtqokghjmlosz…’‘Š„‡ˆˆˆŠ”˜™—“’‹ƒulihhc[RNHEPu……………„…ƒƒ‚€€€€€€ƒ„†‡††ˆ†……„„…†„‚ƒƒzvruxzyz{yyzx|…‡‚zspsz|zywwxvssw}€‚ƒ…ƒ|tkednx|ytqmllhbbcb_a`TKHPi†“˜™–ˆxuxxwz…Œ‘‘’““””{spoqx~~‹“’“”””””•••“…~{zy{ƒvrquvzƒŒ‰ƒuuvvuuuvwwxxxxxxwwyyyyyz{{{{{|||}|||||}|{|{{{{{{{{{{||||~€€€~{wrqprx{|{vtokighihfeinsvwvxxyxurprtuwqnqx‚‘’”’Œ„„‡ˆˆŠŒ‘•™š™”“Š€vnhdb^WPKCCXy†………„…ƒƒ‚ƒ‚„……†‡‡‡‡‡†……†…„„„‚}wtwyy{{||{z}ƒ…‚ysqv}~}|zzyxuvz}‚ƒ„yqkefowysnklmmjebcfcbaZSPXp‹™Ÿž€zzwtrnlv‡‘‘’““””ˆxqppry~|€‹“’“”””””••”‘‹„|zzy{ytrsw{Š‹†€uuuuuuuvwwwxxxwwxxxxxxyyzzyyz{{z{{{{{{|z{{z|||{{{{||{}~~}~~~~|ytnnov{zwqid`_^\]`chntuxxxxy{xwspty||sosx€Œ“””’Ž…€‚ˆŠŠŠ”™š™—”Œ…unjfa[SLG@Db{„…„„„ƒƒƒƒ‚‚ƒƒ‚ƒ‚„„†††††…††††‡†‡‡……„„ƒƒ|vuxyzz~|{}~wppv€‚‚€|zwwy~ƒƒƒuokeht|ztnihjjmgdefdab_YX_tŠš Ÿ‹yuqlfcr‰’‘‘‘’“””“ˆxoppry}}}ƒŒ‘””””””””••“Šƒ{yzx{}ztrsvx€„Œ‰ttuuuuuvwwwxxxwwwwxxxxyyzzyyyzzy{{{{{{|z{{z|||{{{{||{}~~}~~€€~|vqnorxwsjeaceb_^_elrvxxxxxy{ywtqsy|{rnrv€’””•“Œ…„‡‰ŒŒ’–—™˜–’‘ŽŠ‡€|xqh_YQG@<Ghzƒ„‚‚ƒƒƒƒƒƒ„……„ƒƒ…††‡‡‡‡‡‡ˆŠ‰‰‰‰ˆ†„„‚‚|yy{{{~|{}€€}zxrpqxƒƒ„„ƒ€~zxz~ƒƒƒ~toicht|zulhgimkhhihfdb___ds‡•œšŠ…yphdb^buˆ‘‘‘’“””…wqrsu{}}„Ž‘””””””””••“Š€{{zxxxvqsuy†‹‰†ttuuuuuvxxyyyywwxxxxyyyyzzzzzz{|{{{{{{{{{{{{{{{{||||||~~}~€~ztqpptuofdhmpmfdfnsvyyxxyyzzyxtstx|zroqu{‡‘””–‘‡†ˆ‹Ž’”•—•“‘‹‰ˆ…‚}tjaZWME?CRp|ƒ‚ƒƒƒ‚ƒ…†††„ƒ„‡‰‰Šˆˆˆ‰ŒŽŒ‹Šˆ‡‡†…‚‚‚~{||||~|~€€|yurpqz„„ƒƒ‚‚~|~€ƒ…„|smgcju}|wplhklkmnnkgeca`bdp~–•‰…‚xnd^]\[dzŽ’‘‘’“””ursrt|~~†’””””””“•–•“…}{}}xuussux|‚Š‰‡…‚€vvvvuuuvwwxxwwwwxxxxyyyyzzzz{{{|{{{{{{{{{{{{{{{{}}||||}}€€€}uqmloqnhimuzyrkinuwyyxxyyyy{yvttwzyspqrwˆŒ’–—“ŠŒ‘““”•”’Šˆ‡‡†ypg^YVOIDFTr€ƒƒƒƒƒƒƒ…†ˆˆ‡…‡‰Š‰‹‰‰‹ŽŒŠ‰‡†………‚‚ƒ|||||~}|~‚|uqps~„††…„‚‚‚‚‚‚‚„†ƒzrlcdlx}|xtplkknooomkkheddflq}ˆŒ‰…‚}ujb_`^\i‘‘’“””spont|~~†‘””””””“•“•’Ž…~|~~xsqqrtx€ˆŠŠ‡…stuutuuvuuvwwwxxyyyyxxyyyyzz{{{{zz{{{{||{{{{{{{{||||||}}|€€€~tmikliggrz|ywtruzzyxyyyyzzzzyxuuxxuqqrw€…‡‘——“Ž‘’“”“‘ŽŒ‰‡†…„ƒ€zreZXYRNIL\w‚„‚‚‚ƒ„‚„…ˆ‹Š‰‰‰‰‹‹‹ŽŒŠ††…„†ƒƒƒ}||||}|}ƒƒ€{tqss}…†‡ˆ†…ƒƒƒ……†‡††‚wplghr{~|xxupomlmpnmopnjhilmms|ƒ„„€~xrh_`bbaasŒ’‘“””“‹|roqqv~€}…“••••••“•••’‹ƒ}{~}xqossu|‚‰Šˆ‡†~stuuvvvvvvwxyyxxyyyyxxyyyyyyzzzzzz{{zz{{{{{{{{{{||||~~}}~~€€€€€~yokkgcaeow}|{zzz{{zyyyzzzzzzzyvvxytpnqw}‚…•——“ŒŽ‘“”“‘‹ˆ††…„ƒƒƒr_UTWWTR[gyƒƒ‚€ƒ†ŒŽ‹Š‹ŒŽŽ’”’‹‡„…„„„„„„ƒ~~}|{„„€{urqt}‚…†‡‡‡…ƒƒ„„†‡††}rmifjs}|yxxvtponnrsrqpqpnpsttwx|€}yzwoe`_bdb`l‚‘’“””“‹|rooow~}…‘”••••••“•””‘Šƒ}}~zuqoquy€†ˆˆ‡‡†~rsttuuwwwwvxyywwxxxxwwxxxyyyzzzzzzzzzzzz||{{{{{{{{{}~~~~~~~~~~~€|wqlgb^_isz~~~}|{{{yyy{{zz{{{ywvvwuros|‚ˆ–•”“ŽŽ‘’””’Œ‰ˆ…„…„„„†‡ƒyfWVZ\\Y_k|‚ƒ†ŒŽŽ‹‹‹’”“‹ˆ†……„ƒ……………ƒ~~}~|zz„„€}vqpwƒ†‡‡ˆˆˆ„‚‚………‚ynmjflw}}{ywwxsqppstrpqrqpquxxtpsuussojc^^begfiw‰‘”’‰zrqppx~|†“•••••••••“‘‹‚~~~vsnort{„ˆˆˆˆ‰†‚oqtttuvwwwvxwwwwxxxxwwxxwyyyzzzzzzzz{zzz{{{{{{{{}}{}~~~~~~~~€€€€€~yrkfa^dpz~~~}|zzz{zz{{zz{{{yywwxyyy}€ƒ†Š”–”‘ŽŒŒŽ‘’””’Ž‹‰ˆ‡†„„„„†‡††}rcZ[^_`fr}€„†ŒŽ‘’‹ˆˆˆ‰ˆ‡‡ˆ‡………ƒ€}{z„„~wqpv~„…†‡ˆˆˆ…ƒ‚‚ƒƒƒ|qlljhpy|yxyyzxvtqtvtnmlkjjnppnlllmmnolia\]cghho}…Š‹‹„xqpppx~~‡‘••••••••••“‡~{tpnosw€†ˆˆˆˆ‰†‚oqrssvwvwwyyyyyyxxxxxxyyyyzzzzzzyyyyyzzyzzyy{{||}}|||}~~~~~~€€€€€€€€~xpkfdhpz}~}}{yz{{{{{||{{{{{zxxw{|~„…‡…†Œ’–”‘Œ‹Š‰Œ‘‹ˆ‡………ƒƒ‚„…†……ƒ‚wl^X]bkt{€ƒ††‹’‘‘‘Ž‹ˆ‡ˆ‰‹ŒŠˆ††…ƒƒ‚~{yz~ƒ‚zrlkmr{„…‡‡‡‡…„€|smkmkikoqvyz{}}}}|xyxumf_]]]_ehgfegjmpmkgd`_ahijmsy|€ƒƒ}pppoqx~}~‰’••••••••••“Œƒ~~~yropqt|ƒ‡‡ˆ‰Š‰†‚noprruwvxxyyyyyyxxxxxxxxxxyyzzzzzz{{yzzyyyyy{{||}}|||}~~~~~~~~~~€€€€€€{zuqprx~~}|{z{{{{{{{{{{{{{zxxy|€‚‚‚~„Œ’“‘Œˆ†…„…†‡‡ˆ‡†ƒ‚‚‚‚‚„…†…††‡…„wja`ky}}€‚ƒ…†‡ŠŒŽŒŠŠ‡‰‰ŠŒŠ‡……ƒƒƒ‚~{yz~ƒ‚|qicacdht~„†††‡……‚€vljkjiehlkjlorwy}€}yvrle\VTTTV[dhjmnppqnmiea`cfhiighlqvvrmllmoy€~Š’••••••••••“‹‚~}vqpqsv}„†‡ˆ‰Š‰†‚mmopqttuvwwyyyyyyywwxxxxwwxxyyzzyyyy{{{{{{{{||{{||}}}}}}}}||}}~~~~~~€€~~|||}}|}|||{z||}}|{{|||||||yz|€…„‚}{y…’‘Œˆ…„ƒƒƒƒ…†ƒ‚‚‚‚‚„„†……†††††ƒ|y{}}~„…‡†ˆŠŽŒŒ‹ŠŠ‹‹‹ŒŽŽ‰‡……ƒ‚‚‚€zyy~~ticbcbabkv††‡‡‡‡…}rhghiiejllgecbeipvvrmhc^WROPSY_lv{zzzxxspkedbcddefebbbfhhhhhknw~}€Œ”••••••••••‘Š{sqqsuy„†‡‰‰ŠŠ‡ƒ€mmopprstvwwyyyyyyywwxxyyyyxxwwxxzz{{{{{{{{{{||||||}}}}}}}}}}}}}}~~~~~~~~€€€€~}||{zzz{{|}}|||||{z{||}„†„‚|zz~€ˆ‘Ž‰…ƒƒƒ„„„……„ƒƒƒƒ„…†………††‡‡‡…„…ƒ‚€}ƒ„…‡ŠŒŽŽŒŠŠŠŠŠŠŒŽ‡ƒƒ„†„‚‚‚}|~{pjjiieb`cm|ƒ…†……†‡ƒ{skjjhhfhiiigeecdbccdcb`]\YYZ^hy„……ƒƒ}|wsppokikmopmkigdacccccgqxzy~‹”••••••••••‡}||xruusu{‚†‡‡‰Š‹‹†~mmnoqrsuvwyyyyyyyyxxxy{{yyyyzz{{{{zz{{zzzzzz||||||||||||}}}}}}}}~~}}{{}{}}}~}|}}|{zz||{{{{||||}}||}}{|…†„~|||}ŠŽŒ‡„„„…„……‡†………„„†‡††††‡‰‰‡…„‚~{~‚ƒ„†ˆŠŒ‘ŽŽŒŠ‰‰‰‹‹‹ŒŽŠ„~€„…ƒƒƒ„ƒ‚‚€~ysrqpnlhaacp||{z…‚xnjlkgfhjijihggebbbbabccefediv„Ž’Œ‡‚€~{xvvvtooty~}{ytnhdeddeekoru‹••––––••••”Ž„}zzwrssux{‚†‡†‡ŠŒ‹‡ƒnnnopqrsvwyyyyyyyyxxxyyyyyyyzz{{{{||||{{{{||||||||||{{{{||||}}}}||}}}}}{||}~~~}|}}|{zz||{{||||||||||}}~ƒ…†ƒ€~|z}‚‹ŽŠ‡……††‡‡‰‡‡††……‡†„„„†‡‰‰‡…„‚~|~€‚„„‡ˆŠŽŽŽ‹‹‹ŒŒŒŒˆƒ{}‚…ƒƒƒ‚‚ƒ}xtvxwtstoe`_flihims{{vomnmkggfefgecbcbddfdbagnsv{‚˜œœ‘†ƒ€}}|€€ywz…‡ˆ†„}umkigeefjlq{ˆ”••””••••”‚|{ytrssuy~…‡…~~†‹‹‡nonopqrswxzzyyyyyyyyzzzzyyyyzz{{||||{z{{{{||||||{{{{{{{{{|||||||}}}}{{{{|||||}}}{{}}||||||||||||{{||||~~€~„†„ƒ€~{|€†‹‹‹‰†……‡‰Šˆ††††„„……………†‡‰‰ˆ††}~ƒƒ……ˆŠŒŽŽŽŽ‘’‘‘ŒŒŒ‹ŒŒ‹‡{€‚ƒ„„ƒ€€zqptvrptyvnfaaded`bflqolmnnjkiidcddddccddfhhedmw|‚—š•ˆƒ…‡ƒ}~†Ž‰€€†Š‹ŠŠ„}vrpkhefhiis‰•”“”••••”‹zzvssssvz…ˆ†{z†ŠŒ†lnnooqrsvwwxyyyyyyzzzzzzyyyyzz||~~~~}{{{{{||||||{{{{zzzz{|||||||{{{{{{{{zz|||}||{{{{||||||||||}}||}}||~~€€„…ƒ€€~‚†‡ˆ‡†…„…ˆŠˆ†…„„„„„…………†‡‰‰ˆ†ƒ€€ƒ„…†‰‹ŒŽŠˆŒŽ““”“’‘Ž‹‹ŒŒ‹‰{€‚ƒ„„ƒ{snoqroptx{ulbaddeeffegiklkklpssoigfddddeeegmun_YcwŠ“Š…€„…„‚„šŸ˜’‰„ƒ‚…Š‹ŠŠˆƒ‚}ytnkjjggny‚Š‘“”••••’ˆ{yxussrsw|‚‡‡‚}€ˆŒŒ†nnnnnpqrvxyxzzyyzz{{{{{{{{||}}}}~~}||||||||{{{{{{{{zz{{z|}}|{|||||{{{zzz{{{}}{{}}{{{{||||||}}~~}}}}}~€‚€ƒ„ƒƒ‚ƒ‚€€€„„„…‚€‚…††„„…„……„„„„‡‡ˆˆ…‚€ƒ„‚ƒƒ„‡‰ŒŽŽ‹‰ˆŠŽ’“”•”‘ŽŒŒ‹ŽŒ†€ƒ„…„€|}unklooorvyyuleehijjecccegfdejnvupjfefeebbcbejjcWIVuŠ„†‡‚€‹˜ ŸŸžš“‹†……ˆˆ††‡†€}zvsnlhjr{€‡‘“••–•…{xtsttsuz†‡†~}…ŠŽŒ‡ƒƒnnnnnpqrtvwyyyyyzz{{{{{{{{||}}}}~~}||||||||||}}||{{{{{{z|{{z{{{{{{zyyzzz{{{zz{{{{||||||{{{{||||}}}}}}}~€‚ƒ€‚„……„„„‚‚‚„„ƒ„„€„„„„„„……„„„„„„ƒ‚‚ƒƒƒ„ƒƒ„†ˆ‹ŒŽŒ‹ŒŒŒŽ’“”•”“’Œ†ƒƒ„†„€{zxrlklmlnqvyysmhgikmponjihgfedfhjkkgggfeca_]][]]ZTRXe„ƒ…‹ˆ‰˜ ¢¢ŸŸžžœ”‰…‡‡‡‡‰‰„€{yvqmiosw}„ŠŽ“•””Œwvtsttsv{‚‡ˆz‰ŒŽŒˆ„„oonnnpqsvvwxyyyyzzzz{{|||||||}~~~~~~~~|{{{{{||}}||||{||{{{||{{{{{{{{zzzzzzzzzzzz{{{{|||||z{{||||~}||}}}~€ƒƒ„ƒ‚…‡†††ƒƒ„…ƒ„…ˆˆ„ƒ„„ƒ„……„ƒ„„„„…ƒ‚€ƒƒƒ……„…†‰ŠŒŽŽ‘’””””“’’ˆ…„……wrolnppolmmty{snkhhlppuwupolhfcccbcghijihhie]ZXYYXY_aev‡‡„‡ˆ‰ˆ‹— ¢ ŸŸŸŸŸž›–‘ŒŒ‹‰‡‰ˆ†ƒƒƒ€{zwplprty~†Œ“•’‹~wutssssx‡ˆƒ|}†ŠŽŽŒ‡…ƒoonnnpqsvvwxyyyyzzzz{{{{{{||}~~~~~~~~|{{{{{||||||||{||{{{{{zzzzzzzzzzzzzzzzzzzzzz{{{{{{{yzz{{||~~}}}}}~€ƒ„…ƒ‚€€‚‡ˆˆ‡„‚ƒ„…†…‡‡‡†„„ƒ„………„„„„„ƒ‚‚‚ƒƒ……„…‡ˆ‰ŒŽ‘‘’’’””••”“’‘‘‘“’ŽŠ†„„‚{snopqpmiiiowxrmihinqtvutsqokebaaacdglopqrsrjeddb`agilvƒ‹ŒŽŽŒ‰“¢Ÿž  žž–Œˆ„…†ˆˆˆ…~€ƒƒ~wnrvttv|ƒ‹‘“‘Š}ussqssvz€…†|ƒˆŒŽŽ‹†„ppoonpqtvvwxxyxxyyyy{{{{|{}}~~~}|||}|{{{}}||}}}}zzzyyyyyxxxxzzzzzzyyzzzzzzzzyyz{zz{{{{z|||}}~~~~}€ƒ…‡‡†‚‚‚„‡ˆ‡ƒ‚ƒ‚…††‡‡††„ƒƒ„……††„ƒ„„ƒ‚ƒ………ƒ…†ˆ‹ŒŽ’‘’’’‘‘‘‘’’“”••••••’’’’’ŽŽŠ†„|sqrtspnihgnyxrkgcgpssstsqomjedbbacehmqrsvtutropmllonqz„Ž˜¡¤¢¡    Ÿ Ÿ™Š‚ƒ†‰‰ˆ‡…zw}~€~zty|vurv|„Š‰ztuttttx|‚ƒ|ˆŽŽ‹†…ppppnpqtvvwxxyyyyyzz{{{{{~~~~~~~~}}||}|{zz}}||}}}}||zyyyyyxxxxwwxxyyyyzzzzzzzzzzz{{{{{{{z|||~~}‚…‡‡†……ƒƒƒ„……„‚ƒ††…‡†…„ƒƒ„……„„„ƒ„„„…………†ˆ‹‘’’’‘’‘‘‘‘‘’“•••••–””••’‘Š†zqstuusqnhejsuoieclruvutsomkfdcbdegkmoqstwvtrqsvtssuwvx€Š’“œ¤¦¤¢¡¡¡  Ÿ–†€€‚†‰Š‰†‚vnr{~€€{z…‚yvuu}…ŠŒ…ystuuuv|€…€|†‹ŽŽŽ’Œ†…ppoonrsuwwwwwwxzzzzzz{}}~~~~~~~~|}}||||||||}}}}}{zyyyywyyxxxxxxxxyyzzyyyyz|{{{{{{||{{{{||}~~~}}~~€‚…ˆˆˆ‡‡†…„ƒƒ„„ƒƒ„††††††……„„„„„ƒƒ„‚ƒƒ…‡††††ˆ‰Œ‘‘‘‘‘’““••–––•••’‘‹…{tsyxusuphfkqqlgdentwxvuqokjgedefhlqqrrruuqpnpw{{xvvvspr}Š‘–Ÿ¥¥¥£¢¢¢¡¡™‡€€€€„‰‰Š‰„vjiu~}|ƒŠ‰€ywxz†‰‚zuvvvux|€€|~‡ŠŽŽŽ‘”…ƒppppqqsuuuwwwwwxyyzzz{||}~}}€|}}||||||||}}}}{zzyyyywwwxxxxxxxxyyyyyyyyyz{{{{{{||{{{{||}~~~~~„ˆˆˆˆˆˆˆ†…ƒ‚‚ƒ…‡‰‰‡†††……„„„„„ƒ‚ƒ‚ƒ„†‡†‡‡ˆ‰ŒŽŽŽŽ‘’““••–––––•“‘‘‘‘’‘‹‚{xyxxwwrljptrmjdgqvwzzwrpiiifeeinvywuuusrmhgkry{vsttpmmtƒŽ‘™¢¥¥¥£¢¢¢¢Œ€€€€€€…‰Š‰†qgm{€€}{„Œˆ€xsu{…vtwuuvyy{z€†ŠŒŒŽ’‘‹„‚ppqqprqttuxwxxvwxx{{{||}}}}}}~~~€€|}}~~||{{||}}}}{{{{zzywxxwwvvwwwyyyxxyyzz{{{{||||{{||}}}}}}~~~~~€…ˆ‰‰‰‹‹ˆ…‚€„ˆŠŠ‡‡‡‡†††„‚ƒƒƒƒƒ„…‡†ˆˆ‰‰‰ŠŽŽŽŽ‘‘Ž‘‘‘’“””––––••”“““““““’Ž†€zvwyzvonpsqmhflvxuxxtqmjiiggflq|}xxuronidbluxutrrrnkq€‹”™¢¥¦¥¤¤£  “ƒ€€€€€€…ŒŒˆ‡siky€€~z‚“Œ‡€yx{€|uvwuvvxwz†‹ŽŽŽ’•‡~xqqqqrsttttutvvvwxxyyz{|}}}}}}}}}~~~~~~~~}}||||}}}}}}}}{{{{zzywxxxxxxxxwyyyxxyyzzzz{{||||||||}}}}}}~~~~}‚…‰ŠŠ‹ŒŒŒŠ‡…ƒ‚ƒ…‡‡‡ˆˆˆˆ‡†ƒƒƒƒƒ„††ˆ‰Š‹ŒŽŽ‹ŒŽŽ‘’‘Ž‘’‘’““””––––••–”””””””“‘‘Ž‹„}~}wrpqsplhfpzzxyxuojjllllklpwz{yvurrpkfelttstsssoor|†Ž”›£¦¦¥¤¥¤¢›ˆ‚€€€€€€€†ŽŽ†‚|qgju~€~z€“Šƒ~{}€xsuvuvwy{†Š‹ŽŽŒ‹Šƒyqnrrqrssttstuuwwwxyyzzz{||||}}||}~~~~~}}}}}}||{{}}}}~~}}{{|z{{yyxxyyzzzzyxyyxxxxyyyyzz{{{{z{{{{|}}}}}~~~~~€†‹ŒŒŽŽŒŠ‰‡…„…ƒ„„…ˆˆ‰ŠŠŠˆ‡‡…ƒƒ…†‡ŠŠ‘‘ŽŽŒŒŽŽ‘’“’’‘’’“““““””•–––––•••••••••““’’ˆ†€vqqrrolhgs~z{zvrmmmpooonkmorstxtssolklpsqtutrrssy…Ž”›¢¦¦¦¤¤¥¢„€€€€€€ƒ„‹Œ…€zrmnw}}z}Š“‹†}€}xuvvwwx‚‡‰‰„…‰‰‡ytmigkqqqrsstttuuvwwwxyyyyxyzzzzzz{{{{{{{{}}}}}}||}}~~~~~~}}||}|{{zzyyyyzzzzzyyyxxxxyyzzzz{{{{z{{{{|}}}}}~~~~}ƒŠŒŒŽŠ‰‰ˆ†…ƒƒ„†‡ˆ‹‹Šˆˆ†…„…†‡‡ˆ‹““‘‘‘ŒŒŒŒŽ‘’““’’‘’’’“””““””•–––––•••••••••””““”“Šxrrrqnkgfs}~~zussstrrqpljjjjkopqqqqplloqtutuussw‚‹‘š¢¥§§¥¥¤œˆ‚€€€€€€€…†ƒ€zrmntz~~z}‰’‘ˆƒ‚€}xuvvvv{‚ˆŠ‡}vtxwpjdbcejnrrssrrttttvvwwwwyyxxwwxxyzyyzzy{zzz{||}}~~}}}~~~~}}}{yzzzzxxxxzzzzzzzzyyyyyyz{{{||||||||{|}}}}~~€€~~€ƒˆŒŽ‘’‘ŽŒ‹‰Šˆ†……„…††ˆˆ‡†…‚ƒ„†…†…ˆŒ‘’’‘‘‘‹‹ŒŽ‘‘“”•“’‘‘’‘“““””••””–––––••”••••”””””””“‡€zvuupnjgdp€„€}|zuttuutqswtomhgfgjmmmpnmlnrvtustuw~…Š˜¡¥¨§¥¥¢”…€€€€€€€€€€€€~wolquz}y{‡‘’Ž‹…‚zvuuuux~†ŠŠvnkligfebbeimuuttttttttttuuuuvvwwwwwwwwxxyyxzzz{|||}}|||~}}~~~~}}}|zzzzzzzyyzzzzyyzzyyyyyyz{{{||||||||{|}}}}~~~~‚‡ŒŽ‘’’‘Ž‹ˆ‡†‡††…†††††‡†ƒƒ„………‚ƒ‰Ž’’‘‹Œ‹ŒŽ‘““”•”“‘‘’‘“““””••––•••••”””••••”””””““‘Š|{|‚xrjfs‚†‚}zwuuuttromu~{wpkgefggilljjkmpuvvwx}„ˆ‹Ž–œ£¥§§¦¢„€€€€€€€€€€€„„ƒ{sqsy{x{†ŽŒ‰†‚~wtuuuwz‡†xqponoqrsrrtxzttttttttssuuuuttvvwwwwwwwwvwwwwwyy{|||}}||||}}~~~~}}}{{{zzzzzzzzyyyyyyzzzzzz{{{{{{{{{{z{|||}~~~~}}|†‹‘‘””‘‹ˆ‡‡‡‡ˆˆˆˆˆ‡ˆ…„ƒ‚…‰‡‡†‡ŠŽŽŽŽŒŽŽ‘’”””–••“’‘‘’’”””––••””••””””““••”””””“‘‹ƒ|~…ˆŠ‰ˆ„you€ƒ{xuuuwvtrmhn{ƒ‚{snjc``dfgiljknpruwz€…‰Œ”š £¦¦¦ŸŽƒ€€€€€€€‚‚ˆ”Žƒysqvyvu|‚}}~€|vvvuuwz€„‚wprtwwwz|~‚……‡„ttssttttttuuttttuuuuuuuuvvwxxxxxxxz{{{{{|||||}|}~~}}}{{{zzzzzzzzyyyyyyzzzzzz{{{{{{{{{{z{|||}}}}}~~~~}}~€†Œ‹‰‰‰‰‰ŠŠŠŠŠŠ‰ƒ‚‚„‡‰‰‰ˆŠ‹ŒŒŽ‘“””•––—•’‘‘’’”””””””““””“““’““““’’’’“‘Œ…€ƒˆ‹‹‹Ž‹‡ƒ††„yustuwvsmgfo|}xpdbbabcehikmoqs|„‡‹Œ—¢¥¦¦Ÿƒ€€€€€€€ƒ†„ƒ˜›”Œ‚{ttqnkjkhiiinstsvvuuy{€ztsuwz{~ƒˆ‹Œ‰‡„‚ttssrsttuuuuuuvvuuttstuuuwwwvvwwxxyyzz{{{{||||}}}~~~~~~~~||{{{zyyy{{{{zzzzz{zz{{{{|z{{{{{|{{||||~~}}}}}}~}ƒˆŒŽŒŠˆŠŠŠŠ‹Š‰Š‰…„ƒ„‡‰‹‹‹‰ŒŽ‰‰ŠŒ‘‘“”––––––”“‘‘““””•”““’’““““““‘‘‘‘‘‘‘‘‘Š…„…ŠŽŽŽŽ‹‰‡‚|z{yxtqlhehozysjhgc``afgghimr{€…‡ŒŒ”š ¤§§¡’„€€€€ƒ„„†‹‘ˆyqlifebaa__bgmpqrtuvx~}vuvvx~„‡‹ŽŒŠ…‚zttssrsttuuuuuuttttsssttutvvvvvwwxxyyzz{{{{||||}}}~~~~~~||{{{zy{{{{{{zz{{{|{{|||||{{{{{{|||||||~~~~}}}}}€„‰‹ŽŠŠˆŠŠŠŠ‹Šˆˆ†ƒ‚ƒ††‡ˆˆ‰‹ŽŽ‹Š‘’‘‘““••––——•”““““““““’‘‘‘‘‘‘‘‘‘‹ˆ…ˆŒŽŽŽŽŒ‹‰ˆˆ‰‡†„|umjhhmttnkjnokjiiggffghkrx}‚†Š‹Œ‘—Ÿ£¥£‘†ƒƒ‚~~~||{xxwvtooifedccb`]\_`cgmpsuuxz{ww{ƒˆ‹ŒŽŽŠˆ…‚€ssttttttuuuuttsssssstuuvvvvvvvvvvvxxyyyz{{{{{{{|}}~~~~~}}{z{{zzzz{{zz{{z{{{||{{{|||{{{}||}}{{||~~~~}}|~‚„†‰‹ŽŽŠ‰‰‰ŠŠŠŠŠŠŠ‡…‚ƒ„…„…‡ˆ‰ŒŽ’‘ŒŒŒŽ‘’’‘‘‘’”•••——––”“’‘‘‘’’‘‘‘Ž‹ˆˆŠŽŽŽŽŽŽŽŽŒŒŒŒ‹ŠŠ‰‰Š‡„|tpqqomjmrssqtrnjgeddhmrv|€…ˆ‰’œ¡Ÿ—†€}}|zyyzyxvuttsqolhgfeddcceffbaaadgkntw{}ƒ‡‹Ž‰‰‰†…ƒ‚ƒrrssttttuuuuttttssssttuvvvvvwwwwxxyyyyyz{{{{{{{|}}~~~~~}}}|||{{{{{{{{||{|||||{{||||}}{}||||{{{{~~~~}}|~ƒ…ˆ‰ŠŒŽŽ‹Š‰ŠŠŠŠŠŠŠ‰†ƒ‚‚„‡ˆ‡‡†‡ŠŒŒŽ’““’‘’”•••––––•”‘ŽŽŒŒŽŽŽŽŽŽŽŽŽŽŒŠ‰ŠŒŽŽŽŽŽŽŽ‹ŠŠŠŠ‰ˆˆ†‡†„…‚~€‚‚ƒ‚{wrjgddfinrwz}„ˆŒŽŒ†€|yyxzyyzzzz{{xywvtrpliidcacefhhgfdddefhlu‚‡Š‹Ž‹ŠŠ‰‡††…ƒ„ssssssssttutssttssrsrsttvvwwwwwwxxyyzz{{{{||zzz|}}~~~~}}}}~~}|||||||{{}|||||||{{||}}~~}}}}}}||||~~~~}|~‚…‡‰Š‹ŒŽŒ‹ŠŠŠŠ‰‰ŠŠ‰‡ƒ‚†Š‹‡†‡‰‹‹ŒŒŽŽŽŽ’“’‘’“••””–•••’ŽŒ‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŠ‰Š‹ŽŽ‹‹‰‰‰ˆˆˆˆˆŠŠ‰Š‰ŠŒŒŠ‰††…„~unhddfijlory|{zyxxxxyxx{}~€€€‚ƒƒƒ}yvuspliea`cgghjjigfcccfkv‰‹ŒŽŽŒ‹‹Šˆˆ‡‡……ttttuuuuvvutttttssrsuuvwwwwwxxxxxxyyyyyy{{|||||}}}~~~~}}}}}}|{{{||||}}}|||||||||||}}~~}}}}}}||||~~~~~}}‚„‡ˆŠŠ‹ŒŽ‹ŠŠŠŠ‰‰‡ˆ†ƒ€ƒ†‡ŠŽŠ††‡ˆŠ‹ŽŽŽŽŽŽ’“’‘‘’“”•–••••“‘Œ‹‹Š‰‰‰‰‰‰ŠŠŠŠŠŠŠŠŠŠ‹‹Š‰ˆŠ‹‹‹‹‹‹‹‹‹‹ŒŒŽŽŒŒŠ‰ˆˆˆˆˆˆŠŠŠŒŽŽŽŽ‰ƒzoigghihhklnoqvvxxy{}€‡Œ‘“’Œ‹Œ‹†~zwwurpnkjieeimoomkifccedem|†ŠŒŽŽŽŒ‹ŠŠŠ‰‰‡‡ssttuuuuuuutttttssrtuvwwwwwwxyzzzzyyzzzz{{|||||}|~~~}}}|}}||||}}}}}}||||{{}~~~~~}}}}}{{{{{||||{{{|{}€ƒ…‡‰Š‹ŒŽŽŠ‰‰‰‰ŠŠˆ…ƒ~~ƒ†‡†ˆ‹ŒŒ‰††‡‹ŽŽŽŽŽ’’“’‘‘“”””””“‘ŒŠˆ‡ˆ†‡‡‡‡ˆˆ‰‰‰‰ˆˆˆˆˆ‰Šˆˆˆˆ‰‰‰‰‰‰‰‰‰‰ŠŽŽŽŽŽŽŒŒŒŠŠ‰ˆˆ‰‰‰‰‹‹ŒŽŽŽŽŒ…{phjiijllggjmossw|‚Œ’–˜››˜“‘’ˆ~yxxyywyyvuojjlmqqookjfcddbep€‰ŽŽŽ‹ŠŠŠ‰‰ˆˆuuuuuuuuuuutttttsstuvvwxxxyyxyzz{{zzzzzz{{|||||}|~~~~~}|}}||||}}}}}}||||||}~~~~~}}}}}{{{{{||||{{{|~‚…‡‰‰‹ŒŽŽŽŽŒŠ‰‰‰‰ˆ‡…|}‡ˆˆˆˆ‰‹ŒŒ‰ˆˆŠ‹ŒŒ’’“’‘‘’“”””““‘ŒŠ‰ˆ‡†…………††‡‡‡‡ˆˆˆˆˆ‰ˆ‡‡‡‡ˆˆˆˆˆˆˆˆˆ‰Š‹‹ŒŒŽŽŽŽŒŒŒŠŠ‰ŠŠ‰‰‰‰‹‹ŠŒŽ‹Š…{rlihillheeghlqu~†Œ’’““”’‘‰…„‚ƒ…†‹ŒŠ…}tppoqrrpppnjgddcbfrƒŽŽ‹ŠŠŠ‰‰ŠŠvvuuvvuuvvvutssstttvxwyzzyzz{{{{||{{{{zz{{zz{{}}}}~~}||||}}}}}}}}||||}}~~~~~}||||{{{{|||||||||}…ˆ‰‹‹Œ‹‰‰‰‰‡‚~{~…‹‹Š‰ˆŠŠ‹Œ‹‰ˆˆ‰‰Š’‘‘‘‘’’’’“‘‘‘‘‘‘’““’‘‘‘ŽŒŒŠ‰ˆ‡†„ƒƒƒ„…††††„†ˆˆˆˆˆˆ‡†‡‡ˆ‰‰ˆ‰‰‰‰‰‰ŠŠ‹ŒŒŒŒ‹Š‰‰‰‰‰‰ˆŠ‰‹ŽŠˆ„zqkfgjmkjfcffgjnrv{…‡‹‹ŽŒŒŒŽŽŽ‘‘‹‚wpmrvyyuqponjgffecix…‘ŽŒ‹ŠŠŠŠŠŠŠuuuuuuuuvvvutssstttvwxzz{zyyzzzz||||{{zz{{{{||}}}}~~~}||||}}}}}}}}~~||}}}}}}}}|{||{{||}}|||||||}‚†‰‹ŒŽŒ‰Š‰‰‰†{z{€„‰ŒŒŠ‰ˆ‰ŠŽŽ‹‰ˆˆˆŠŒ‘‘‘’““’‘’‘‘‘‘‘’’ŽŒŒŠ‰ˆˆ†‡†„„„…††……„†‡‡‡‡‡‡†………ƒ…‡‡‡‡ˆˆˆˆˆˆŠŒ‹‹ŒŒ‹‹Œ‹ŠŠ‰‰‰‰‰‰ˆŠ‹ŒŽŽŽ‹Š††‚zpjijmqpnfcccdehhimr{€„ˆŠŒŒŒŽŽŽ‘‘Œ†|rmmt}}ytpnljihffgmx…ŒŒ‹ŠŠŠŠŠŠŠttvuttttvvvussrrsuvvwyz{||||}}}}}}}}||||}}}}}}~~~~~~~~~~}}}}{{||}}}}}}~~}}}|}~~~}|}|||||{|||||||{~…ˆŠŒŽ‹Š‰‰ˆ‡ywy~ˆŠŠŒŒŠˆˆˆŠŒ‰‡‡ˆ‰‹Ž’““””’‘’‘‘‘Œ‹ˆ‡ˆ‡†‡‡…†………„„……††‡‡†††„„‚‚„‡‡‡ˆ‡‡‡‡‡ˆ‰Š‹‹‰‹‹‹Œ‹Š‰‰‰‰‰‰‰ŠŠŠŠ‹ŽŽ‹‰ˆˆ‡‡}qffgorokffcbdfdacehow…‰‹Ž‘’’’‚xpnrzƒ„yqlknnligghnx‚ŠŽŒ‹‰‰‰‰‰‰wwvuvvvvvvuvttsstvwwwyz{||}}~~}}}}}}}}||}}}}}}~~~~~~~~~~}}}}||||}}}}}}~~€€}|{}~~|||{{{zz{|||||||{~ƒ†‰‹ŽŽŽŒŠ‰‰ˆ†yx{†ŒŽ‹Œ‹‰ˆ‰‹ŽŠˆŠ‹‹ŒŽ‘“”•–”’ŽŽŽŽŽŽŽŒ‹Š‰‰ˆˆ‰ˆ‡†………†††††††††††„„‚‚ƒ„†‡‡‡‡‡‡ˆˆˆ‰‰‰‹‹‹‹ŠŠ‰‰‰‰‰‰‰‰‰‰‰Š‹ŒŒŒ‹ŠŠŠŠ‡€uhehmqtqkfa`dikjfdejr~†‰‹‹ŒŒŽ’‘‘‡wppw€……xnklpqpkhhjmuƒŠŒŒ‹‰‰‰‰‰‰wwxxwwwwwwvvvvuutuvwxxz{}~~|}}}}||}}||}}}}}}~~~~~~~~~~}}||}}}}|}~~~~~~~~}}||}|}|{{{zyxyzz{}}||}€„ˆ‹ŽŽ‘‹‰‰‡‚zw{‚‡ŒŽŽŒŒ‹Šˆ‰‹ŽŽŠ‰‰‰Š‹Ž‘’”•—˜•“‘ŽŽŽŽŒŒŽŽ‹‹ŠŠ‰‰ˆ‡††……‡‡††††††‡‡…„‚~€‚„†‡‡ˆˆ‡ˆˆˆ‰‰ŠŠ‹‹‰‰‰‰ŠŠ‰‰ˆˆˆˆˆˆ‰ŠŠŠ‹‹‹‹ŠŠŠŠŠŠ‹‰‚whdfkqsqlfeimsvurnqv~‡ŠŒŒŒŒŽ‘‘‘Ž‰‚|vqt{ƒ††~tmkptytmiijlt~‡Š‹‹Š‰ŠŠŠŠxxxxwwwwwwvvwwwwvwyz{{{|}~~~~}}||}}}}}}}}}}~~~~~~~~}}~~}}}}|}~~~~~~}}~~}||{zzzyxwxyz{||||}€…‰‹ŒŽ‘Ž‹ŠŠŠ‡yxzˆŒŒŒŒ‹‹ŠŠ‹Ž‘‹‰‰‰Š‘“’”•–——”“’‘ŽŽŽŽŒŒŒŒ‹‹ŒŽŽŒŒ‹‹Š‰‡‡‡‡‡‡††††††‡‡†…ƒ€~€‚…†‡ˆˆ‡ˆˆˆ‰‰‰‰‰‰‰‰‰‰ˆˆ‰‰ˆˆˆˆˆˆˆ‰ˆˆ‰‰‰‰ŠŠŠŠŠŠŠ‹Š†zngefnvxsmhjovƒ……‡‰‹Ž‘’’’‘Œ‡wppx€„ƒyrllovzwpjhgglv…‡‰‰ŠŠŠŠxxwwwuwwwwwwxxxxvwz{|~}~~~~~}}~~}|||}}~~~~~~~~~~~~~~~~}~~~~~}}}}}}}}|{{{{yyyxxxwyzz{{||‚†‰‹Œ‘‘‘Œ‹Šˆ‚xuz‡ŒŒŒ‹ŽŽ‹Š‰ˆŠŽ‹ˆˆ‰Œ‘‘“”•••••““ŽŽŽŒ‹‹ŠŠ‹ŒŽŽŽŒŠŠ‰ˆˆ†††††††††‡„ƒ}|~††ˆˆˆˆ‰‰‰‰‰‰ˆˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡‡‡‡‡ˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠ†~ujcdny|xsnjmv~†‹Œ‘’““’‘ŽŒ‰„wppv~‚‚€}wrqpuy{xqjggehq~…‰‰‰‰‹‹xxxxyxxxwwwwxxyywxz{|~}~~~~~}}~~}|||}}}}}}~~~~~~~~}|}}~~~}}}}}}}}|{{xxwwxwwwvxzz{{||‚‡ŠŒŽŽŒ‹ˆ„|uv}„‰ŒŒŒ‹ŽŽŒŠˆ‡ˆŽŒ‹Š‹Œ’““““”””•–•”‘ŽŒŒŒŠŠ‹ŒŒŒŽŽŽŒŒŠ‰‰ˆ‡‡‡‡††††††„‚z|ƒ…ˆˆˆˆ‰‰‰‰‰‰ˆˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡‡‡‡‡ˆˆˆˆ‡‡ˆˆ‰‰ˆˆˆˆ‰ˆ…{nbajx~|tljmt}…Š‘’“”“‘ŽŒ‰…zspt{„€}yxsruy{voiecchuˆ‰‰‰‰‰zzzzyxxxxxwwxxyyzyy{{|~~}€€~~}}}}}}}}}}||}~€€~~~~}}}}}}}}}|||{zzyxxwuxxwwxyxz{|„ˆ‹ŒŽŽŽ‹†|wx|ˆŒŽŽŒŒŽŽŽ‹Š‰‰‹ŽŒ‹Œ’“”“““””••••“‘’’‘ŽŽŽŽŒ‹‹‹Š‹ŽŽŽŒ‹Š‰‰ˆˆˆˆ††…†‡‡‡‡†„€}{|‚„‡‡‰‰‰‰‰‰ˆˆˆˆˆ‰‰‰‰ŠŠ‰‰‡‡††††††††††‡‡‡‡ˆˆˆˆ‰‰ŠŠŠ‡{j^\fu|{uoons}…ŠŒ“•”•’ŽŒŠ†wrry~„ƒ‚€€|xtvxwrjfebem}†ˆ‰‡ˆˆzzzzyxxxxxxxyyzzzyz{{|~~}€€~~}}}}}}}}}}}~~~~~~~}}}}}}}}~~~~|}||zyyyxxwuvvvvvwxzz{~ƒˆ‹ŒŽŽŽŽ‹…~uvz€…ŠŒŒŒŒŒ‹Œ‹ŠŠŒŽ‘‘Ž’“”“““““””””’‘’“’‘ŽŽŽŒŒŒŒŽŒŠŠŠ‰ˆˆˆ‡‡††…†‡‡‡‡‡†ƒ€~€ƒ…‡‰‰‰‰‰‰ˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡††††††‡‡‡‡‡‡‡‡ˆˆˆˆ‰‰ŠŠŠŠ‡~n_\^gq{|vpns}„‹’”–——–“‘ŒŠ†ƒ{uru{€‚‚ƒ‡†‚zwwxxrkjgejw‡ˆ†‡‡{{yyxxxxyyyyyyzzz|||}}}}}~~}}}}}}~~}}€~~€€~~~~~}}}|||||||{zywxxwuuvvuuvvxyy{~‚‡ŠŒŒŒŒ‰ŠŒˆ‚xuyƒ‡ŠŒŒŒ‹Š‹ŒŽŽŒ‹ŒŒ’““‘‘’“”“““““’““‘’’‘‘‘ŽŒ‹‹‰ˆŠ‰‡‡‡†„„……†‡††‡††„‚€€€‚‚†ˆ‰‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡‡‡†‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‰‰‰ŠŠŠ‰ŠŒŠ}h^YZcu}zuqnt}†“”—˜—–”’‹ˆ„}vrru{‚„‡ŒŠ€xvxvsomiefq{…†‡††{{yyxxxxyyzz{{zz{|}}}}}}}€€}}€~~~~~~~~~}}}||||||{zzywxwvuuvvuuvwwxxz}†‰‹Œ‹‰ˆˆ‰ŠŒˆ~vx}„‡ˆŠ‹ŒŒŒŒ‹ŽŽŽŽŒŒŽ’‘‘’’“““““’‘’’ŽŽ’’‘‘‘‘‘ŽŽŽŽŽŒ‹‹Š‰‡††‡‡‡†„„……„†††‡††……„ƒ‚‚‚„‡ˆˆˆˆˆˆˆˆ‡‡‡‡ˆˆˆˆ‡‡‡†‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‰‰‰ŠŠŠ‰Š‹ŒŠ{h\WXct}~ytor}†‘•˜——–”’ŽŒ‰‰ƒysmov{}€†ŒŽ‹„|wvuqnkgfis~„„„„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
\ No newline at end of file
diff --git a/cobalt/media/test/data/bali_640x360_P422.yuv b/cobalt/media/test/data/bali_640x360_P422.yuv
deleted file mode 100644
index a7616ca..0000000
--- a/cobalt/media/test/data/bali_640x360_P422.yuv
+++ /dev/null
@@ -1 +0,0 @@
-DEHKLLMNNPPPPQSQSRRRSSRRQSQQPONMLJKJGGFCAA>>:;:;;88888899989::988:9767755544211100..--++)'))(())((((''(((('())))**++,,**++,,,,,,,,++++*)))))))))))((''&&&&&&&&&&&&&&&&&&''&&&&&&&&&&'''''''(()+,,-/0224557778899999999::9999::8876677:>EJQYahlquwxxwuqmjhhghjlnnoooopopoqstwy|~~~~|xrldYNA4.,)++++,*+++.4:BOZenx~ƒ†…ƒ‚}wmgXH;/)%$$#$%%'*.178>CLS^emt{€€|zuoiaYSORQTTQSLD=60'%#$$""#"""!!#!"! #%&(+07=DKPW^cglrwxyxwuvvuuuok_WKFA??@@@@@@????==:99975543100/039<CNV]flqty{|zzvrmd]OE92,+)((''''&((()))+*-01236778=>?CFFJNU\bkptxz{}‚‚‚ƒƒ€€~}{yzvttx{€‚ƒ†ˆ‡‡…ƒ~|zxutty€„†…ƒƒƒ€|xpfXJ=4/.-,038=DNZbksx|€‚€ƒƒ‚‚~}{yvwwzz|„ˆŠ‹‹‹ŠŠŠŠˆ‡‡‡ˆˆˆ†€ypdXOHEA><;FIILLLMNNPPPPQRQTSRRSSRRRRQQPONMLJJHHHEAA@=<;<<:8:::::89999:::98888876665544211100..--++*())(())((((''(((('())))**++,,,,++,,,,,,,,++++*)))))))))))((''&&&&&&&&&&&&&&&&&&''&&&&&&&&&&'''''''(()+,-/01124557888899999999::9999::999878;=DKQY_gosyz|||ztqljkklmooppoomlkjjjkkorwz~€~~~wsk`UH<2+*++++++,,+,17?JVamw}…†…„{tk^P?3*&$$$%&(,/258=AEJRZcjr|€€zundZSOMTbpfVNE=6)#$###""#"""!!#""!!"$&+-4=CJPV\belquyz{zwuvvuuuskaVKEB??@@@@@@????>><:::755431000116<CMU]flqty{|zzwvof^RG;3.+)((''''&'(()))+,..0035689;=ABDGKOX^dkpty}~€‚‚„„††‡‡††„„‚€~}|{wsrrvyz}ƒ„…………ƒ}{yyxy~…††……‚‚{umbRD92/...038=BMXbksx|€‚€€|zwwtssvxz„ˆ‹‹‹‹‹‹‹‰ˆˆˆ‰‰ˆ†xnbWNIFA><;HHIKLLNOOOPPQQQRQSRRRRRRQPPPNMLKJJHGEDA@@>=<;:8:9899899:9999::999988776655332100//..-,,++*(((((((((((((())))))))**,,,,,,,,--,,,,,,,,,,+*++**))))))((''''''''&&&&(''('%'&''&&&&&&''&&''''(((())*,..013345558888999988999999999:99778;>CGOU^bjqv{}}~{xvpnllklmnoommkigeca^adjmrw{€‚‚‚|vqi^QB6.*+***++++++05=EQ_jr{€…ˆ††‚}xncTE6-&$$%&',/148=>BDHLU^eow€„„ƒzsh`VPN]euvo`fys@$!######""""!"""##$$*.39AGMS[`ejpsx{}|xvvuvvvsoj`TMD@????@@????@>==<;::755421/0..28;BMT\hnrux|~}|{vqicVJ>4.+)))((''(((())*+,-01134589=>@AEJMSZ_fkrv{‚ƒƒƒ…†‡‡ˆ†……„†}|zwtrppquvy}ƒƒ………~~{yzz{†‡‡†‚„}yrj\N>51-,,.037<CMW`irx|€€€}{xwtroorux„‰ŠŠŒŒŠŠŠŠŠŠ‰‰‰‡€wk^SNIFA>;:IJJKMLNOOOPPQQQRSRRRQQPPPPOOMLKKIIGFDCA@?><;;:9977999:::998:::999988776643332100......-,+*))(())(((((((())))))))**,,,,,,,,--,,,,,,,,,,+*++***)))))((('''''''&&&&(((('&'''&&&&&&&''&&''''(((()))+-/01223555468899998899999999;:9977::?DJRY^flsx|~}|yvsnljjihhiffefd`^ZXUUX\aeluz€‚‚‚~|vmbWI;4,*,******++.28ANXcoy€†ˆ‡‡ƒ~}tj[M=0)$$$%+.168;?BDCFKOXdmu~ƒ††‚}wncWOWl`ilpkdw^I+!$####""""!"""#"%(.3;@FMRY_cgnquy}|{yvvvwwwuph`TKDB????@@????>===<;::755411./..27;BJT\fnruxwz~}|wslcZN?81+())((''))(())*+-.013334679>>DINSY_aimtx}€ƒ„††‡ˆ‰ˆˆˆ……ƒ€~|yvtqoooppsuxƒƒ„„ƒ~~}{||~†††…„‚€{vofXI;3//0..025:BMU^gpw|€~~~~|{xvtqmllnrv{‡‰Š‹‹ŒŒŠŠŠŠŠŠ‹‹Š…€wj]RKGEB?<;HIJJLLMNOOOOQQRRRQRRQQPPPOPOLJJJHGGECA@?>=<;:9::888889::::::::99888865544322210000//----,+)))(((((((((((()))))))****,,,,,,,,,,,,,,,,,,,+**++*())*())))((''''''''''''''''''''&&''''''''((((((***+--.1112455678888999999::9899998769:;@ELSY`fmsvy{yvwspkhedd__^^^^_]ZWTRONOSX_fpz€„ƒ„„}xql\OB8/+*****+++,-28?IWamw€‡ŠŠˆ‡ƒ{vm_RB4*%%%(.249<@CDEDFINU_iqz‚†‡„€yri]U\ijqYIRiqcRWG! !$##"""#"""""&(-4;?EKSW]bdintyz||{xwwwwxwsoj_TJD???>>??????>>==<:997543211///06:@KS\ekrvwy{}{zzwqg\OB81-+))((''((')(**+,-/0232479:?DHNRY`dgmrv{‚…†ˆˆŠŠ‰‰ˆˆ†…ƒ€~}xvtplkjjkmot{‚‚ƒƒ€~}}}~‚…††„ƒ‚€zslbRC82/..../26;BMWaiqwz~€~}}{wusrmiiimqv|„ŠŠŠŠ‹‹‰‰‰‰‹‹‹ŠŠ…vgZNHGEC@><JJKJLLNNOOPPOOPRRQPPQQPPPOOMLJJJHGEDCA@?>=<;;:::99889:::::::::99888876543322100000////--,+*))((((())(((((())))++**++,,,,,,,,,,--,,,,,,,+++++,*))))))))((''''((((''''''''''''''((''''''(((())**++--.0103333567888999999::9899887778:;@EJPYaiouvvvtqolfc_ZYYXXZZXXYYXUOMJGEHPYcjs{‚ƒƒ€}vmcWI<2.-****+++,,07<FS`ku~…‰Šˆ‡„yrdWG6-))).158:?BDFEFFLNRYdow~ƒ……{tk`\djkeWLQi[ONV\YT&""$$$##$"""$(-4:@EKQW]^bhlqvyz||zzwwwwvutpj`SICA==>>>>>>>>>>=<;:9975432311../38?IR\fmptwz{{}|zvqi_RG:2.)))((('((*)*++,,-./13369;@FKPUZ_dhmqvz}‚„…‡‡ˆŠŠŠŠ‰‡…ƒ€zxvtokhgeegjms{‚‚‚€~~~€ƒ†‡†„ƒ„€}xri^O@71.-../226;CMXaiquz}~~~~~}{zywsmmkgggjnqx„‡ŠŠŠŠŠ‰‰ˆˆŠ‹‹‹ˆ…~uh[NIGDC@?@KKKMMMMOOOPPPPRSQQPPPPOOPOMMKKIIHFEDBA?>==<;;;998899::::::::::9988887655321111111100/.--,,++******))**(())******++,,-------,,,--,,--,,,,--++,,**++))))(((((((((((('''((((('&&&''('''((((((()**++,,,-/01233466799888888::88986655678:>BGNW_gmqoomkhgb^XWTSRUUWWXXVVUPKFB><AGQ]fow……‚€{si^PB60,,*+++*++,-49BO[ht|„‰‹‰‡†‚|tj]O>1++/479<>BCEFFGGILPX`jr{„…ƒ|ulb^`S[NUTEOSJFDcjdZ%!$$$$$$#$&)038?ELQV[^`eimqstwzzzywvvwxxuqk`RJC?<<==>>>>>>==;;<:7786432210./.37>HQ[clqtvxz}~|zxtkaRG=40,)((((())+++,,,-../146:?EIORW\afinsux~‚…‡‡‡‡ˆ‹‹Š‰ˆ…‚}{wspnkihdbcgint{€‚‚€€€~€€‚…ˆˆ†…„ƒ€}wqeYK=61-..-.148=FOX`iqv|}}}|}|}ywwsnkjgfccejqw~„‡ŠŠŠ‰‰‰‰ˆˆ‹‹Œ‹‰ƒ}teZRJHGDB@?JILLMLPNOOPPPPOPQQPPPPOOOMMMKJJHFDCB@?>====<;;::8899::::::::::9988887655321111111100/.--,,++******))**))))******++---------,----..---,,,--++,,++++))))(((((((((((('''((((('&%&''('''((((((()**++,,,-/1112335568888888899888755455669=AEKS^ehhffedb]ZURSRQRRRVVWWVSPMGA=879AJWaks}€‚…‚‚€|voeYG:2.,*+++*+++,17?KXdq|ƒˆŠˆ‡†‚|umbRA4//269=?BDGFGGHHHKPV[emu~‚„‚|xnc`UNG:C@59:>@CKT]S##$%%$$$&&*.5;?GLQXZ]`cfgkoqsuyyzyvuvuvvuph^QHA=<<<<======<<;:98777543220//..28=FRZckqvuw{}}||{tlbWK<41-)(*****)+++,,,.//258=BEKPTY^chmpsv|~‚„‡‡†‡ˆˆŠŠŠ‰†ƒ€}yuqoljgda_`cgjnty}€€€€€€ƒ‚‚…ˆ‰ˆ†…„€}vncWJ<73.//./158>FO[cjpw{}~}||{zxurojgfcb``dipv~„‡ŠŠŠ‰‰‰‰ˆŠˆ‹Œ‹ˆ…~tgYQKHGDBA@KKNNMMOOOOPPPQQQQOPPPPOOLLMLMJHFECBA???=>=<<<<;;;;::::::;;;;::::8877744432221122220000..-,,,**))******(*)))***++**,,,-----..........----,,,+++++++)))))())((((''))((((((((((((((''((((((((()**++,,+,--021122445677887777776655443568:>CJRY_bdb``^\ZWTRPPQSTTUUVVSPMGC;5124;EP\hqy~ƒ‚ƒ€€}wpj^PA6/+****(**++/7<FT`mx€†‡ˆ‡†ƒypeYJ;4369;?DFGGHHIIIHILQV_gqz}umd`TUWD;2CZ/-0AQEML8"%%%%$$'*04;AFLRV[^_bdeijjlqtvxxxssutttrmi_QH@<;:;;;;:;;;;;:98876534222100./19=DNZaiquvxz||||ytlcZM@81-+)))*(+++,,,-///26:>DHNSX^cikosu|}ƒ„„†††ˆ‰‰‰‰‰†„|wtpjhfca^]_cgimou{€~€„ƒ…‡‰Šˆ††ƒƒ€|ulaTF;740/0.026=BHR\dipx|}}~}|{wuqolgd_\\\\aiov}…‰‰Š‰ˆˆ‡‡ˆŠ‹‹Œ‰„|sg\QJIFECA@LLNNMMOOOOPPPQQQRQPPPPOMLLKLJHHFDB@@??>?>=<<<<;;;;::::::;;;;::::8877744432221122110000....,,**********(**))***++**,,,,----............--,,,+++++++***)))))(((())))((((((((((((((''((((((((()**++,,+,--..00112445778877776655443333469=BINUWVWZ[[[ZZVUSSSSTUUWXVUROIC=60--27@KVcmv}‚€ƒ€zsmcVI;2-***+*)*++.29DQ^gt}ƒ‡ˆ‡†ƒ|sk_QC97:=?CEEGGGGIIIIIIINW`jsyvhkpd]][MEBWY(+4<;7=DK'%%%%&(*05:@GLRW\]`bddgeefilpsvvvssutuurmf\PG@<999:;;:;;;;;:9::765342220//./27<DNXbiquvxz||||ysnf[NC82+,,++*)+++,-..0139=CHMQW\`fjnqvz|~€€‚„„†††‡ˆˆˆ‡†„}wskgea`\\\^behknptz~~~}~ƒ††‡‰‰‰ˆ†……‚|ulaTF=864200249>FLU]emsw|}|}|zwurmjeb_[YYXZ`jmv~…ˆ‰Š‰ˆˆ‡‡‡‰Œ‹ŒŒˆ‚|sg]RLJFEC@>MMNNNNOOOOPPPQQQQQQQOONNMMKHIGDBA@@@????>=<;<<<<<<;;;;::::;;::98997765432233221110.011////-,,,,,++******++++****++++,,----//-.//.-....---,-,++++****)((())))(((()))((((((((((((((((((()))))))***,,++,,--///33454556666664455443211257;?EKOUVUY[[\[ZWWUVVVVWWXWVSOKF=71,*+.3;FP]gqxƒ€~{wpi]PA3.**)**))**,29@KWdny€‡ˆ‡†„|tmeWJB?>@CFGGIIJJJJHHFFEGMWcmw|}skei`ed`VA<C:1*2.,0<Ab2%%&&(-06:@FLSXZ^_bcdddbacdjmrtsttssssspme[PD=988889:;:::::998875542221/00/016;EMXaipuvxyz{||yxqh_SD:3.--++,,,,-../139=AFLPV[aejnrvy|‚„…„…‡‡‡‡‡†„€|{sjgb][YZ]_cehkmpsvz|}}}}~ƒ„ˆ†‰ŠŠŠˆ‡…ƒƒ|uk`SF>98541147=DJSYafnuz}~||{{xspjga_ZXSRSV^hmw€†‰Š‰ˆˆ††‡‡‰Š‹‹‰†‚}sh\RMHGDCA@MMNNPPOOOOPPQRQQQQNNMMMMLLJHGEBA@???@@>=>=;<<<<<:9;;;;::::99::98777765432233221110.0111///-,,,++**++****++++****++++,,--..---.//.-....-----,++++++**))))))))(((()))((((((((((((())(((()))))))*****++,,--/0100143556666664444332100146:>DINQUVZ[[\\\YYXXXXWWZXWTRMGA94.*)+-07@KWalu}‚~}ytmdUG:0+*********07=ES`jw~ƒ††…„|woh`TJEBDEGHHIIJJKKHGBBBBEP[gttoiflgegeXJC@G9123,9<EIcK%%(*,18;AGLRVY^_aacde`]\\^dhnqtutsssssojdZLA=;887789988888776665553221/0/..26;DNYbipuvxyz{|||xri_SI<71//----..//137;AFKOU[_ejnruw|~‚‚„…†……††ƒƒ~zumg`[XYZ\_behkloqtw{{}}|~~ƒ†‰‰‰ŠŠˆ‡‡‡‡„‚|uj_RE?:965547;AHPV\cjsx}|||zwsmh`[XURPOOS\fmwˆ‰‰‰ˆ‡††‡‡‰ŠŠˆ‡…{sh^RMHFCB@?MMOOQQQPOOOOPPOOPPONLLKIJIGFDBAB@@????@@===<====<<;;::::::888898776665443333222022022200/..-,,,,,,++**,,+*****++++,,--.........///....-,---,,,++++****))))))))(())))))))(((((((((((((()))')))***+++++,,---.//1231455665542433121./2569>DHLQUX\^^]^][YYYYXWYXYTSOIB=6.+(()*.4;FR^hqy€~}{vph\N@4-*)**)****.6:BP\hq|‚………ƒ}{undZQKFFFHHIIIJJJIGD><;=@JVctihigcfd`^B3LSX<@RSD<:CHXfU<$,08=BEKQW[]dfeee`\\WUVY]djqtvtsstrplibWJ@;6666788887777666654331//10//-/14:CMV_gotwwy{{{{|yslaVJ=740/////./025:@EKQW\`ekmrty{~~~~~€€‚ƒƒ„ƒ„„ƒ„ƒ‚€zvqh_YVVY\_cfikmnoqtw{{{{{}‚„ˆŠ‹ŒŒ‹‰††‡‡ƒ{tj^RIA<;:888;>ELSY`fmtz|~}}|{wtolc]VSOMIHLQZemx‚‡ŠŠ‰ˆ††‡†ˆ‰‰‰ˆ‡„~yqj_TNHECA?>MMOOPPPOOOOOPPOONNNMLKKJIGFDBA@?@@????@@?>=<====<<;;:::::::99:877766654444333223222211000/.-,,--,,++++,,,+****++++,,--.........///....-,---,,,++++*+**))))))))(((())))))(((((((((((((()))')))***++++++,,..-./0101222333322321110./2569?EJNTXZ\__``^\[[[[YXY[XVQLE=6/*))))),07ALXbnu}€€~~}ysmcUI90*)))()****07>IWdnw~ƒ„„ƒ|wqkaXPIGGHHIJJJJKJE@<969;ES^pookie`]YSMIJLS``__XKA8+;Rnn5(7<BFNYY[`liTMVa[[aRPPUZaipuutstrponh`UI?856656776666665544332220///.../04:CMV_gotwywy{{{|ysmcYL@:62111111348=DIPT\`fimruy|~}}}}€€€ƒƒƒ‚‚‚‚|ytld]XWY\^bfikmooprvy|z{{||‚„ˆ‹‹ŒŒ‹‰‡‡‡‡ƒ{tj^PGC?>=;;>@CJQX]ejqv{~~}}}{vrmf`YRMJECCHQ\eq|„ˆ‡ˆ‰ˆ†††‡ˆ‰‰‰†…‚~wsi_TMGDB@@>NNOOOONNOOONPPQPNNLLJJIHGFCA@@@@?>?????>??>===<<<<<<::;;::;;:9887776565233443344332221110//--,..--,,,,,+******++++,,--........00//....,---,,,,,,*,+*))))))))))))))(())(((((((((())(((())**))))*)****+++++,,-/////0111122122110/.01149<@GLRVZ^^_`aa`^]]][YY[ZXSNGB:3+()))))*.3;FS^itz~{wog[N>3*)))******/5<DS`lv|ƒƒƒ€|xuog\RKHHHIKKKKJHEA<82216AP_aniRhdZTRGQQJQYabaa`]U?4<I[rr:6>ILcmhcmwJOKTZ[YWJIKNV`iquwuwtssqkh^SF<643344554444555553221200/.,.././4:CLU^gnswwzxyz{||todZQC;663222327:@FMUY`ekotwz|€€~~}}~€€‚‚‚€€}}{xtphd[YZZ]afilooqrrtvy|}|||{ƒ…‰Š‹‰‡‡††ƒ{rj\PIDBAA?AAFIQV]bhouy}~~}{xtpjc[SLFC?=?DO[gs~„ˆˆˆ‰‡……†‡ˆ‰ˆ‡„‚}yskaUMEBA?>>NNOOOONNOOOOPPONLLKKJJHGDB@@@>>>>>?????>???===<<<<<<::;;::9988887776565565334455332221110///.-....--,,,+++****++++,,--........00//...-,---,,,,,,,,,*))))))))))))))(())(((((((((())(((())**)))))())))++++*+,---.//011111101100//.0126:=CGOTY\^`abcca___\[[ZZZUNKC=5.*'(((((),07AMXdnv}€}~}yslaTE7-*))))****-39BM[fq{€‚„‚€}zupi`WPMJJIKKKJIFA=84/-,1;QirsmM]aWUONPMGBNVb`XUX]T=9BT^qZLO[m~w€jh[Ybmpwtd\P@AJT_ksuwvvtssqkh^SF<6422332222333333432210/-..,--,,-38@HS\hoswxxyyz{{{tni]SG>8765556:?DJOW^diotxz€‚€~}||}}~~}}~zywsqngb\YY]acglmprrrsux{}}zz{|ƒˆŠŽŒ‡‡‡††ƒ{rj\RNHFFFEGIKOW^cflrx|~~~}{{ytmf^XOGA=9:<FR\hw‚†ˆˆˆˆ‡……‡‡‰‰ˆ‡…‚€{vrkaUMEA@>>>OONNOOOOPPOPNMNLKJIHFFFDBB@@??>>==>>??@@>=>>====<<<<;:<<;;;;888777665555555554554432222210000./0.--,,-,,,,,,+***++,,------//0001....-,--..---,,,,,++****))(((((((((())**))(())(())(((())))))))))**++++*))*---....//0111100///0./0137=AFLPVZ^`bdeddabaa_\[ZYYTOF?9/*('('&&''*.5<HR]gqz}€}zvpfYL=3,****))**,16=IWcmw~€‚‚|zvulg^UOKMMMNMJGB>:41+**.9Pq~xe`\GYYUQRNLMHQVYLL\_KGA*FL]TO[nto€smhmlepz‚qj\F=KUalswwxxvtsqng]PD:310011112211100111/0/----,-,+,,028>GR\enrvwwy{{{zzwrk`VH@<96689;BGLS[ahmru}‚ƒƒƒ~|}}|}~}€~}}zzywurpmgb]\]_beinoqrrstvy||}zz{}ƒˆ‹Ž‘Šˆˆˆ††ƒ|rh]TPMKLLKLNRX^beknsx}~|}||ywrle]QH@:777>GSbny‡‰Šˆ‡†††††‰ˆ…„ƒ{wslbVLFA?>:9OONNOOOOOOMNMLKJJIIHFCCA??====>>>>>>??@@>=>>==>>==<<<;<<;;;;988766665555555565554444442211100/0/..--.,-,,,,,+***++,,-----.//0000....----...---,,,,++****))))(((((((())))))(())(())(((())))))))))**((((**)*,,-....//00000////--/01459?CINTZ^`cefffeda``_[ZZZWQLB<3-*('('&&&')-18CMYcmw|~€}||xql_SD6-**(())***.49DR_jr{~€‚€~{yupjaXQMLLLLKGC>:5/+('+/5Ts||{o_VHFVVQU[RKT\[jRIZdeZGBFKOJXf_lmqo€{lgl_[pfgKU@HWdnswwxxxwvsng]PD:20//000000//000000/..-,,,,++*+-.17>GQ[entxxxxyz|zzwqkbXNE?=98<@DHOW^eipty~‚ƒ…‚‚€€|{{z{}|~~~€~|zyxvvutsrpnhc__`adgjnpqrsvvxz}|{zz{}ƒˆ‹ŽŽ‰‡ˆˆˆ†ƒ{sj_XTSPPPQRVZ\bfjoqvz~~}|||yvnh`YND<8447>IVdpz‚‡ˆˆˆ‡…††ˆ‰‰‡„„‚}yxqlbVLE@>=:9ONONOONNMLKMLKJHIHEDCB@?;;<<:<<<==>>>>?@>>>>====??==<<<<<;;::877777766667754576655554443211100100/.-,-----,,,+++++++,,--.//////....---.....-,,-,++********(*((''(((())))(((('((())))))))(((((())))))**)))))*++,,.///0/00..//.../166=AGLRX]`cefgijgfca_[ZZXWVPF=8/*('(('&&&''+.5=IT^iqy|~{||}xpe[J;0+)(())**)+28BLXdow}|{{zvsne[TNLJLJGD@;50)($"'+6Ybtwxo`SLJZ[TUa_STZ\^]ST^ldTJM^NQ`ikurfko[IGTV]RXSQRMKVdntwwwvwwvskh\PC92.----.-..////.....-..,,,,,,*+-/17>GPZenquxxxxy|{{xsng\OGB?<=BHMRWaglrw|€„ƒƒ‚ƒ€}}zzyyyz{{{{|{zwrsssrsrpnifb``deiloqrsuvwz|}|{zz{}€„‰ŒŽŠˆ‰‰‡†ƒ{slb\XXWUUVX[^agloruy|~~}|{{ytnf^SJ@83137@LXgs}„‡‰ˆˆ‡†…†ˆˆˆ‡ƒƒ}|xurkbVLC?<:99ONNNMMMMLKKKJIGFFEECA>>=;;:::;<<==>>>>?@>>>>====>>==<<<<<<;::99977776666777788665555444322211110//..------,,,+++++++,,--.../////...---.....-,,-,++********))(((((((())))((((''(())))))))((((((**))))**)))))*++,,+-/./...--//./.137;BGLRV]_cfgikkjgfca_][[YWRIC;4-(''(&'('&'((,19BNXcmvz|~{||{wrj`PB5,)(())**)*/5<GUcksz~}~}}{{yuph_VQMJIIEA<70*&#" $*;_afkqmeLFU[\VTX[YOXRQZX^`gibR@VNDe~ynf_V^K:8=QVHPSGFGKVdouwxxwyywuli\PC90-++++,---....-----,--,,,,++**,-17>GPZdmquxxxxwzzzwtoh^RJE@CFKPW\ahmtx}„…ƒ‚‚€~~}}zzxxwyzzzzzxwusqqqqrrpokfbbcdfiloqrsvvwz}}|{zz{}…‰Œ‹‰‡‡‡†„‚{slb^ZYXXXZ[]`gkprsx}~~~}|{{ytle[QE;52239BP_jv†ˆ‰ˆˆ‡††‡ˆˆˆ‡ƒ‚{xxvslcVLC?;999OOONMMNLKKJIHGFFDCB@=<<;77998:<<>=>>>>??>>??>>>>==>><<>>=;;;9887777766665678666646555554322102220/.//,-,------++,,++----../0....///.....-/-,--,+****))))**))))**(())))))))(*))(())))))))(((((())))))++++++**+++,----....../000227;?FLQU\`acgjjmmigfca^[[ZWSOG=70+((('&&'&&())*/4<GT^hrx{|{{}|ytmeWH:0))))))*)).28BN\how|}|}||{zxtmbYRLIIFB;63+&#! ##(;MUhfc\Y2@Z[WR]QPZVZUP^[W^`jeW4ONNoordbgXZWM8=GCQWD:6?M[gpvxxyyxxvtni_OB80*++,+++++**+-,,+***)+,,**+)++--07>FPZclqwwxxxxz{{xvpi`VNGFHNRY]dipuzƒ†…„€€€€}}{yvvuttuuwvvvwurqqpqqrsqokhdccdgiloqrsvvxz|}}{zz{~†Œ‘‹‰‰ˆŠˆ‡†}vkda^\[\\_abeinsww{}}}}|{{zwrleYNB94224<FTcnz„‡Š‰ˆ‡†…†‡ˆˆˆ†ƒ€|yxxvtneXMC?;99:OOOMLLKJKKIHGFEEB?>;:::978999;;;;=>>????>>==>>>>==>>====;<;;:9887777666666778966675555543331121100010---------,,--,,----....-...///.......-,,,,+****))(())**))**))))))))))))))(())))))))(((((())))))++++,,**++++++--....../00237;@EKQVZadeikkllijifc`^[YXVPI@91-*)(('&&'&'&&()-27ANWbnuz{|{{}{wqi^N?4+*())))))*05=JXalt{|}~}{{|zuof_UNJFC=72,'#!$""#>`^RV_^\URRUZ\]T`\LKZ_^gSJ[c`\VFWKRg_dcgeeedQ4:HECB=/9CP[hqwxxxxxxvtnj_PA70****)*+**++,***))))))))(()**+,.27=EQ[cjruwxxxxx{{yupjbXQMLRV\`flsw}ƒ„ƒƒ‚€€|zywtrpoprtsrrtvutppopqrrrmjebbcdgiloqrswwxz}|{{zz|}†ŒŽ‹‰‰ˆ‡ˆ‰‡ƒ}vkdb_][^^acfjorvy|}€}{{{{yvpkaUJ=73128>KXds}„‡ŠŠˆ‡†…†‡ˆˆ‡…~zyxwvtneXLD=:89:OOMMMMKIHGGGEDDA>=;:9887678:;;;;;<====>=>>>>>>>><>=====<<<;;::9877776677777777888876545543332211011//..-----,,------------...-./../.----..-,++,+**))(())(&(&)(**))))))))))))))(())(((())(((((((()))***++++++++++++----....00228<AGKQUZ_dfhkmlnnlijda^]ZWWSOE<5.**)((''''''(('',/4=HS^jqwzyz||{yrpdUD8/+)(((((()/3;GT`grx{}}}}|wsk`UOEB>94+)$!!#! /eg[FLd]VSQUURDN_iRBNXTW^VY[[XUUSPBHW]h^fcfk^<2EC=DE71:CQ\hqvxxxxvvvtoi^O@6.)''''())))(*)***)((((%%'()**+--16>ENWbkqtvxxxyz{{xvrnc[VSUX^dhms{~„ƒƒ€~~}ywwurnmllmklmpstrqonoqrrqrliec`befhlnoruwwxz}{{zzy{}‚‡ŒŽ‹‰ˆ‰‰ˆŠˆƒ}vleb_^^_`cfhlotvy|€}}yzzyvtmg^OD;6433:@O]iv€‡‰‹‰ˆ‡†‡‡‡ˆˆ…ƒ{wywvvtogYMC=989>OOMMLKIHGFEECBB?;:998787678:;;;;;<=====>>>>>>>====<<==>>==<<:;:9888877777777778866787655554333331110//..--++,,------------....//../.----..-,++,+**))(())()**)&))))))*)))))))))(())(((())(((((((()))***++++++++++++,,--.../0158<BGLQWZ^cgilmpqpqmkgc`^]ZWTOH@93,)*)((''''''(('')-18BNXenuxz{{zzzvqgZI=/*)(((((((-17?MXdowz}~~}|zuof[PGA:4/)&"!!! !7YghZ`]c_HMWTROQ^lT5@IKGS[^\WOFEEBHKJV`N]``e[QGDTG9((3:CQ\hqvxxvvvvusoi^O@6.)''''''(((())**)(''''%%'()**,//38>EQWbkqtvxwwwy{{{wunia]\]`glpsw}‚ƒƒ„€~}|zyutpokjiihjkmpstrqonoqrrrpkhca`bbdgjlmotwwy{|{zzzy}~ƒˆŒŽ‹‰ˆˆ‰ŠŠˆƒ}vledbaaabehkosvz{}~~}|yzzyvsleYME;6435<DSamy‚ˆ‹Š‰ˆ‡†‡‡‡ˆˆ…‚}ywvvvvtldYMC=89;@NMLKJGIHGFDB@B==:987766667889;::::<<<<<<==>>>>>>==>>==>><<====;;:9999788889999886788766665443333332100..--,,,,,,,,------........///....--.-,,,,++))))))))*/28-')))))**))))))))(((())))(((((((((()))*+*+,,*++,,++++,,,-//00159>DIKQW[_ceikmoppprmhea_\ZXWSLC<5/)('''''''&''&&(''*/5<IUaisx{zz{|{xskaQ@3+((('''''+.6=IUamuy|}}yrj]SE>6/,&# !! !#Ohmhcab`_SPSX\ZdTEC=DLP[`VPV?BEBEFHPQPOZW\_TIOU\O,.49CP\hquvvuuuuvtnh]N@4,('&((%%''&&))(()&%%%%&&&'(*,.1148?FQWaiosvxuuwxyzzyvsmgdcdhlrv{ƒƒ‚€€€}}{zxuuqomkgdcfhjmorttrqmopqrqpmkgeaabbcfiimoquyyzzzzzyy|ƒˆŒŽŠˆ‡‡‰ŠŠ‰…}vkffdccdfjkmouwy{}}}}|z{{zwqkcXMA95237?IVdo{…‹‹‹‰‡‡†‡‰‰ˆ‡…€|xuuuwvtph[OB<7:=EMLKJJHGFECCB@=9966655444666678:::9:<<<<<==>>>>>>>>>>>>>>=<====;;::999888889999998777776665544333332100/---,,--++,,,,,,--........///....----,,,,+)))))))))*6CC4'())))**))))))))))(())((''(((((((())*++++,,*++,,++++,,,-//0258>CGMRV[`dfikmoqqppokfc`][XUTOF?81-*('''''''&''&&''')-28CR\fpuy||{||yuodVF6,((('''''),3;CQ]juy|zum_QF<3-*%"!!! !5Wmy\^ba^YXJKPZb[]YMBHFGKYWPPYC4:KORJHHFJLPPPLN\hVO)-5:DO\grvttuutvurmi]N@4+'&%%%%%&&&&()(('&%%&&&&()*,.03459?FQXajosvxuuwxy{{zxvrmjiiorw|€ƒ„‚‚~}}zxwuspplieaabfhknqrttqpnopqqpomiebaabccefhjnruyxz{{{zyy|ƒˆŽŽŠ‰‰‡ˆ‰‰‡ƒ}vkffddddfilnsuwy{{{zzyyz{yvpjbWI>85348@M\iu‡‹‹‹‰‡‡†‡‰‰‰ˆ„yvtttuvtog\QE<9=CJONLIGFFEDA?=<9666654434665557788::;<<<==>>====>>??>>>>??>>==<<<;::::::::99::::998899757776555555332200..--++++*+++++,,--------../..////.---,,,,+**))))**))2:9-)((((((((())))))(((()'(((((((())((+++,,+,-,,+,,,,,,,,.,..0237<CGMRW\_ehjmnpprrponkgc^[ZWTPJC93,)))''&&''&''''&(''&+/5@MXcntxzz{||{xsj\L<0)'&&'''()-29BNYenw|~€€‚~wqgVH;1-*%$#!!##\c_uQ>TJXdUA=O@LTSPNQ:;HMKHHNJUY\^behhaJBKFDBMNLYfVW+,2:EQ]gqssrrrstusni^OA4,(%%$$$$$$&&&'(('&%%'''()+-./1247;@FOV`hosuwuwxx{}}|yxvsqqrwy~„ƒƒ€€‚€~|{{xwuqpnkgc_acfhjlpsstsqpoooopnmkgca_``_acefhlqtx{{{|zwxy}€„‰ŽŽŠˆˆ‰ŠŠ‰ˆ…|tlgfeeeefjknqrtyz{{zyyyxxxsmg`UG=9767;DR`lx†‹‹‹ˆ‡‡ˆ‰ŠŠ‰ˆƒxussttttqg]QE=>BGNLKJGGFDCB@>;97553333323455667988::9:;;==>>==>>??????@>??>>==<<<<;:;;<;::::::::998876778876666655332210..--++++*+++,,,,--------../..////.---,,,++**))))))))**++)((((((((()))))))(&)()))(((((())))+++,,+,-,,+,----,,,././047:@EIPV[`dgilnqrrropnlhda][YVRLE<6/+*))('&&''&''''+5</&(-2;GT_kty{{{|||{unaQB5+'&&'''()-1:ANYantz~€€€‚zsiZJ;/(%&%$!!"7uYKB<;KOVaT?12;@?EBGJA8FIKEIEN[^`bdeecZ>=ICEB^NCP[\J(+3<EQ]gqssrrrstusmh^O@6,)%%&&$$$$%%%&&&&&%%$%')+,/01346:>CIOXaiosvxxwvxy{}~}{zwwwy}€ƒ„„ƒƒ€~|{zxusoolgb_^_acgjlorssutqpoooopnokeba_^]_``ddglqtwxy{|zwxy~†ŠŽŽŽŒ‹ˆˆˆˆˆŠŠˆ‚{rlgeeeefgghmpqsvxzzyxyyxxvslf_QG=:99:=FTbmyƒŠ‹‹‹ˆˆ‡ˆ‰ŠŠ‰ˆƒxussttttqg]QD>AHLPLLIGFECA@><965432212223344557888999:;;<=>>>>??????@@?????>?>====<:;;<<:::::9::99998677777568774433211/---,,+++,,,,----------.......////.--,,,+***)))((((((+5B<,'''(((((((((((()((((((((((((())++++++,++,,,,,------./..0159>DHNRY_behklopssoommkgb_\YXSOI@81,*))*''('''''''&+4-'''+.7COZhpxz|zz||~yqfWE7,('&'&'(,/49BKUaksz}€„}vl_O;-$$###$#%<kL;453=LLbbaUB='799:BA=GKJLPTX]_`adbc^T<5@CEEjmMICDH105<FR[gqsttssttttmg^PA5-)%%%%$$%%$$%%%%%%&%'))*,.023579:?EKQYahosvxwuuwz}}~~€€‚‚„……„‚‚ƒ‚€}{zwvqnnkeb``abdhjlppruutrrpopppnlmjfb_^]]]\^`bgjpsv{{{{zyvz~‚‡ŠŽŽŽŒŠˆˆˆŠŠŠ‰†{rjfeedcbabfikosvwxwwwxywwtpjd]PD=:88<BJXer|…‹‹ŠŠˆ‰‰‰ŠŠŠŠ†‚|wtsssttsqi_RGCFJPVKIGFGDC?<:9754321101002244444788889:;;<=>>>>??????@@????@@?>====;<<;;;;::::9::99997679887877775432210.---+++++++++,,,,------......./---,--,,++**))))(((())'61**'((((((((((((((()(((((((((()))*+++++++++,,,,,----..////137:AFMSX\`dijmnprqqpnllhd`][XWQKC;5.+)(()))'&''''&&'%$%'('*.5?LVcowz|{zz||ztl\K</('&'&'*+06:AJT`jry}ƒ‚€yqbR@1(#$$$$$'BnY>6;58AQbioqhP=F>46CGFPNMNVY[^`abb`]XTR5EGGBNaMJU]K.16=FR]iqsttssttttlh]OA5-)%%%%$$%%%$%%%%%%%&'*+.002457:<<AEKQYahosuyxwvx{~ƒ„ƒ„„„‡‡†……„ƒƒ€€}|yvsrmlifcaabbcfgkoqrtuutrpooooonlkhd`^]\\ZZ[\acinsv{{}|ywy|€ƒˆ‹ŽŽŽŒŠˆˆˆ‰‰‰ˆ…€|siedda`_^`cfjosuvvuuuuwwwtpkcZNE><;;?FQ^iv€ˆ‹‹Š‰ˆˆˆ‰Š‹‰Š‡€zwtsssttsqiaUKFJPVZKIGEEC@;9865422100////11333356897889;;=>=>????@@@@A@@@AA@@?>=====<<<:;<:;<;:::99:97788888877775533210.--,,++++****,,,,,,----....,./.---,--,,****))))((((**'&(((())((((''''(((((()'((')))******+++++++++,,,----....000036:>DJLT[_aeijmonooonkjjfb^\[XTOG?70+*)))*2/((''''''&&&%$&#(-1;HUamuy||zz|{zun`P?2*'%&()*/39=AIS]fov}‚‚ƒƒ‚{tiZF6,&$##%(([kX<6<BAIYentwtVKHCADLPMGCLTXZ]``cba]XTNF>BACDKZTPLL9117>HR^jrtttusttsrli_QB5-)%'''%%&&%%%%&&%&''(,..01356:<>@CHMR\bhosvxyxxy{~„‡ˆˆˆ‰‰‰ˆ‡……„ƒ„€}|yvtpliidb`aabcefilnqstutrqooooponlieb_][[Z[[]]^bglrvz{|}zwz}†‰‹ŽŽŒ‰‡‡‡ˆˆˆ…‚~vnhdcb_`\\`ehknsuuuuuusuuusoj`YOD?>>?EKVbmvˆŒŠ‰‰‰‡‡‰ŠŠ‹ˆ„yvsrrttvurleVOJMT[_HHFCA?<98655222100////01213356777889;;=>=>????@@@@A@@@AAAA?>>>====<<<;;;<<;:::99999999888877775544320.--,,+++++**+,,,,,,----....,./.--.---,,****))))(((((())''((((''(('''''((((()'((')))******+++++++++,,,--..//..000136:AFLSW\`cgikmnlljjiihhc_\[[VSLC;4-**)))**)((''''''%&&&$&%(+.7CQ]hry|}{{||{vofWD3)'%&(*.26:>CJR\elu{€‚ƒƒ|ypaO>0'###$%)DKF8??=>JZdoswr[TNA>ABMKEPTYZ[^``a_\XTMGB:8MB@GUZZVE,247>JT^jrtttussssrli^PB7/+('''%%&&&&%%&&&'(*++.03457:;>@BEKQT\bhosvxwwvw}€„‡ŠŒ‹‰‡†…„ƒ‚€|{vsokhfb_`bbaceehklpqstutrqoonnomnlieb^\ZYYYXYZ\`glrvz{}{xwz}†‰‹ŽŒŠ‰‡‡‡ˆˆˆ…€zslgdb`^^\\`eiloqttssssstvsrnj`XNGC@?BIO[dpzƒ‰‹Š‰‰‰‰‰Š‹‹‹ˆ„yurrsttuusmd[SOQY`dHEDB@=984553101100..../11123566699::;;==>>????@@AAAA?A@@A@???>==<<======<<;:::::::999977997766555310..-,++++++**++++++---.--+--/--,,--..,,++**))))((('''((((''''''''''''''''''''(((((())**+++,,,,,,,--,----.0300../00047<CINRW[_cgiklkiigggfeca]\[YUQI?80,))))(((((('&''&&&&&&%%&')05?O[epwz{z||||xri[K;-&'))-157;?DKOYbkrz~€‚ƒƒ}uhVE6+&"$#$(@NJ>799<JUbqtwtlNCB97>FFPRW[]^_a`^[WRLF@852TC;GPYX\@0269@KVaksuuttstttrlh_QA60,)('''%''&&&$&&'(*,-.0357:;==BDFHOSX^djosvwyyy{„†Š‘‘ŽŒ‰ˆ‡…‚~}ytqnjhc_^`_aeefghilkoqrtttsqoonmnmlieb^[[YXYXWWY\`flqvy|}{{{z~†ˆ‹ŽŒŠˆ†‡‡‰‰…‚}wqjfc_^^\]^afinprtsssrrstttrog`VNHECCFKU_gr{…‹‹‹Š‰‰‰‰Š‹‰‹‰…~zvtstuuutrke_WVX^diGEC@=9864332200000..../11123566699::;;==>>????@@AAAAABBBA@???>==<<======<<;;::::9999::77887766553210..-,++++++**++++++,,-.---./---------,,++**))))((('''''((''''''''''''''''''''(((((())**,++,,,,,,,--,---../0..../11469?DKPTX[_cghiihffeedca`^^\[XSNE=4.*)))))((((('&''&&&&&&&&&'+.2<IVclwz{zyy{|zuk^N?2*))+/379>@EKOWahpx~‚‚‚ƒƒ~wn_N=/'##$%&BuwD&)3:HTcpvxunK;./27.;VYZ]^`aa][VRLFA93.-7?EQOOL_M955:AJUbluwvuuuututlh_QA60,)(''''''''&'&'(*,-.03579<=?ADFHJQUZ`djosuvxz{€…ˆŒŽ’““’‘‰ˆ‡„€~~yvrliea`]^`_accfghillopqsusqpppnmnmkgea]ZYWVWTSTTY\djqw{||zyyz~†ˆ‹ŽŒŠˆ†‡ˆˆˆ…€zupfc`^]\]]^afjlprsrppooprrrpme]TMJGFFJNXblv€ˆ‹‹Š‰‰‰‰‹Š‹ŠŠˆ„}yvtstuvuusnja[Y\`fkFCA=:86743111./0//.....011344568::99;;==>>????@BAA@@BBAA@@????>>========<<;;;;99:998998877666644111/---,++**+++++++++++++-----,.--------,*)**)*)))((('((((''&&&&''''&&&&&&&&&&&&''(('(**+*++,,,,,,-----.--..--...//0368;@HNSTY\_behecbaabb``__`^^[WRKA:2,*****))((((''''''&&&&&&%%).3:DR`lswzzzyy{ztmcSC4+**-257<?CFJNU]gnv~€ƒ‚ysfVC3'%$##"5id,#'/:CSbntusk`6%%*+7LYZ[_`_a_YUQKE=71/.338HPQOUNRW45:ALYcmuwyxuutwtrok`RB91-***(''''''''()+-/012468;=?ACFIKNSW[aflptvwxz}‡‹’••—–“’Š‡†„€|ytolgd`\\^``acegffgikmnprtusqqoonomkifda]YVUTSTSTUX\dkpux{zxxxz~‚‡‰ŒŒŠˆˆ†ˆ‡†„~ysleb`^]\[]^bejmpqrrnnnorssuqmg_WOMIGINU\fp{‚‡‹Š‰ˆ‰‰‰ŠŠ‰‰‰†‚}xusttvvwwuqld]]_djoCA<:986543111...//.....0111245688899;;==>>???@@BAABBBBAA@@??????========<<;;;;;;:998998877666644111/---,++**+++++++++++++,----.---------,*)**)*)))((('((((''&&&&''''&&&&&&&&&&&&''(('(**+*++,,,,,,-----..../..///001269>DINSW[^^bedb`_][\\]]_```][VOF>6.******)))(((''''''&&&&&&%%(+28BO\iqvy{zxxxzvogXF8/--/38;>@DGJMT\dlv}€‚ƒ}vl]J8+&#"" 3L="&/48DRantwxZ=$21?MUZ[[_`a`]YVQLE?80,-/20.?MQRTMII65:AMZcmuwwwvuwwtspi`RB91-**))(((((())),,-013468:;?ACEJMORW[_cglquvwy{~ƒŠŽ“–—˜—–“’Š‡…}ytnjgc`\[\^``acfffgjklnppsvusqqooolljfd`][WVUSRQPQRS[aiouy|ywxxz~‚‡‰ŒŒŠ‰‰ˆ‰‡†ƒ}vpga_^]\ZZ\_dhjmopppnnnorsttqkf^VPNLKMRXbkt}„ˆ‹‹‰ˆ‰‰‰Š‰ˆ‡‡…}xvtuuvvwwurngaabgmr@=;:8865432200..--..../111225677::::<<==<>??AAAAAAAABB@@@@??????>>>>====<;;;;;99:9988788666655554110-,-,****++++++,,++,,,,,,--,,,,,,,,,,,,))()))((((''&'((((&&&&&&&&%%&&&&&&''''''((()**++++,,,,,,----.///00..////2048;AGKOUW\]_bba^\\[[Z[]]`aa`^YTLD;3,******)))('&''''((''''&&&&'*/5?NXeovxy{zwxwtoi[M>411269>@AEGJMSZbhsz€‚‚ƒƒ„„xreS?0(#$.+10&$&226CQ`mty|iIJ[[YXXY\_`__]YUNJD=70--,.--.^SRONORI47<AOYdnvxwwuuvvwuokbRD:2-**))***'(()*,-.014579:<?BEHILPQSZ\beimpsvy{‚‡Ž“—˜™˜—•”’ŒŠŠ‡„€{unida^\Z[]]__bddefgiklopqttsrqpoonnkifb^[YVUTQPPOOOSYaiovxzzyxyz~†ŠŽ‹‰‰‰‰‰ˆ‡{vmb^^][[[Z]adiknqsqpoomorsttpkd]VQQOOQV]fow†Š‰‰Šˆ‰‰Š‰‡†…„‚€|yvutvvvxxvuqjecehls=::86555432200.---..../111435677999:<<==>???AAAABBAABBA@@@??????>>>>====;;;;;;:::9987888877755435322/.-,****++++++,,++--,,++,,,,,,,,,,++++)))+**((((''&&'''''&&&&&&&%%%%%%%%&&&&''(((*****+,--,,,,----.///00//00/0336:?DIMSVZ\]_aa^\ZZYYXZ]_bbb`]XRI?61,******))*))'((('((''''&&&&'*-3;HT_msxyyxwwwurjaQD7337:<?ACBEHLOV`gpz€€ƒƒ}tkYF5+&&=6&%%!%+/6CQ`mtxzzxrme][Z\^_`_\YTPJD=5.,+,----7uXQNLJS?/6;DQ[cmuwwuvvvvwupj_RD:3.++*)**+*++,,--/024689<>@DGJKNRUW[_cgknstvx{~„‰”™™š—–”“‘ŒŠˆ†}uoid^[YYZZ[^__acdefgiknoqqttrqqpoonnjhfb]XWTSRONNMLNQWahpwzzzzz{{‚‡‹‰‰‰‰‰ˆ…€ztlb^[ZYYZZ]afjjmqpqonnmoqrssold]XSPPSUZaks{‚‰ŠŠŠ‰‰‰‰‰ˆ†…„ƒ€|yvuuuvvwwwvqjhgikos;:876644322000.-....../12233566699:;<<==>>?@BBBBBBBBBB@@???>>>??==>>==<<;:;:::9999888989::99:8997975520+*)**+-+-,,,-..-,,,,)++,+,,,,,,,,+*)**))(((((''&&&&&&&&%%%%%%%%%%%%%%&&&&(((())*****+,,,,,,--...///////001235:>CGKOUXZ[_`_^]ZYYYYZ^accdb`\VPE<6/+******))**))))('((''&&'''''(+09CP]iryzywwvwxvmeWH=679;>ACCDFJMMS^flu|€€€€‚ƒ€zo^M<0'&#"$%$$$*/5AQ^mv{||{vnhc]Z^_`a]YUOID=6-+*+-....<jfPQNT^X87>DP[fouwuvwwvvwuoh`QE:3.-,++,,,,-,+,-.123569;>@DGIKNQTW[^beimnrsvx{„‰‘—šš˜—“‘’‹‡…‚ytmd_ZXWWWYZZ]^_adefgjmopprsssqpoponmhhea[VTRQPNMLIKMOV_hptyxxwxxz„ˆŽŒŒŠŠ‰ˆˆ„€yria]ZXXXYZ]afimproonnonquvtsojc]XTRSUY]gmu~…‰Š‰‰‰‰‰‰‰†„ƒ‚~~|yxuwuvvwwwtroiginqu:9876654321111.-....../12233566699:;<<==>>?@BBBBBBBBBB@@???>>>??==<<===;:;;:::9999889:=>@@??@ABBBA>><83.+***./011121110/...--+,+,,,,,,,,+*))*))(((((''&&&&&&&&%%%%%%%%%%%%%%&&&&(((())*****+,,,,,---...///////001358<BFKORWX\^^^_]ZWVVVVY\accdba\VMC;4-+**++**))**))))('(('''''''''')-4>LXgpuxxwvuvwtqhZPB::;=?ADCEFJJLPZbjrz~€€€€‚‚zqgVC4(&##$25!#)-5AN^luz}{xplf`^_`_]YRNIB:5/,+*+,--..2QbSSSObgB7<FS^gpuwvuvvvvvspi]QE:3..-,,,,,,,+,-./14688:<>ADHJMPSVY\_cdhmqstww{…Š–——•”‘ŽŠ‡†ƒ€|wmg`[WUUVWYZZ\]_adeggkmopprsssrpoponmigc^YURPNMLKKIGIMT]fmsvyxwwz|€„ˆŒŽŽŒŠŠŠˆˆ„xof^ZYVWWXY]ahjmmqponoopquvtsojb\ZXVUW]biqy†Š‰‰‰‰‰‰‰‰†ƒ‚~}}|yxusuvvwwwtrojhioqu98766544321110.-.....//123345677:::;==>>>>@ABBCCCCBBBAA@@@?>??????<===<<:99:::9998889;@DFHHHHIIKJJHIFA:3.,-/145679:::8854110/-+*---,,,,+***)((((((((&&&&&&%%&&%%%%%%$$%%%%%%%%&&((''))*****+,,,,--..-.....//0011368:>EKOTWX[[\^__\[ZXWYX\`cdefc^[TKA92,*+++++++++*))))))))''((((((&&),2:GUbmtvxxuuuxvskbSH=;=?ACDEEFFJMPW]fnw~‚€€€‚ƒ~wm[I7+##!#*-##'.5@O\itz}~{yumfc`_][WQLIB92-+,++,,-//115FWQKNWV<8=GT^hrxwxuwwwwvsnh_PF:42...-,,,,++-/12335::<>@CFILORTV[^acgkprvwxy|€„‰”–•”’Œ‹ˆ„‚|yrkdZTUUTTUVXZZ[^_ceghlmnooqssrqpoqpqmjea[XTQPMKHGEDEFKQZflswxxywy|€ƒ‡‹ŒŽŒ‹ŠŠŠ‰ˆ„~wnf\XWWVWX[^bgjlmqromnnoprtsrojb\YYWW[`flt|‚‡‰‰Šˆ‰ˆˆ‰‡ƒ€~}|{||yvsuwvvwxwvromklpsw8766553332110..-.....//1234556779:;<==>>??@ABBCCCCBBBA@@@@?>>>========<;:;;::999879:=AFJMOOOPRSSRRSROIC931258;>@ADDDECB?<:9730/,--,,,,,+*****)))((((&&&&&&%%&&%%%%%%$$%%%%%%%%&&''''))*****+,,,,--....../////01357<@EKOSV[\\]_^]`^\[ZZZ]`acdedc]YPG>70+++++++++++*)))))))))'((((((&&'+07BP\iquwxvttvvsmgYNB=?@BDDEFGFHKOSYahr{€€€€‚ƒƒ€{scP?0'$"!#""#'-2@MZitx~~{yungb_][WRMFA:2-+***+,-/00242LWKII[N68@JU`jtxxwwwwwwwtoj^OE<50....-,,,..-/12335:;=>ADHJMPRVX[^beimquvx{|}„‰Ž““‘‹ˆ†‚€|wtng`WSURSSRTVYZ[^_adgjlmooprssrqpopomkgb_YUQOMKHFDCAACHOYclrwxwwx{}„ˆ‹ŒŒ‹ŠŠŠŠ‰ˆ„~wnf]YYXVWY\_bhknpoopnoorstutspib\YYY[]cipw…ˆ‰ˆ‰ˆˆ‰‰ˆ…€~|{x{}}ywuvwvwwxxwtqmkknsw6666553332110/-,..////0234676778:::<<<==>??@CCCCCCBBB@@>>??>==========<<;:::9989::;=@EINRVWWXY[[ZZZ\YTKC<:;>ACIKMPSTRONJJIE@=81/-,-+++*,**))*))(('''''&&&%%%%%%%$$$$$$$$%%%%%%%%''''()**++++-----..//////1/112248<?DIPRVZ[]^abcc`_^\\\]`baadeca]VMD;4.++**+++++,++****)+))((''''''&&()/5?LXforuuuutvwtpk_SHA@BCEFFFGGGIMMR[dmv}‚„ƒ‚}tiXE5($"$#$##&,4@MZhsz}||yulec^\WQLFA:2-****++,-.//..3YTPIJMV=:AKV_lwyyxuuvxxvsnh]OD=62//....-,..-/023568:<?AFIJMQSVX\_dfjnrvx{|}~…ŠŽ‘‘Š†…ƒ}xrnhaZWSQPORRRSYZ[\_achjlnppsssrrooopolgda\WRONKJGCA><<?ELV_ipx{ywwy‚…‰‹ŒŠ‰‰ŠŠ‰‰‡ƒ€yne]XXXWXZ^`chkmnppppopqruutrnib]ZXZ^bgmv|‚†‰Šˆˆˆ†ˆˆ‡‚~|zxxx||zwvuuwxyyywtqmkmqtv65666543321100.-0011113534677789:::;<<==>??@BBBBAAAAAA@?==?>========<<;;:::99979::<=AGKPSXZZ[\^^___a_\UMECDIMPVX[^_`b__]YVRNGB=62/.-,,,+++))*))(''''''''&%%%%%%%$$$$$$$$%%%%%%%%'''''(**++++----./////0/00011258=ADINRW[]^abdgffdb_^^^_accddec_\RJA91+++**+++++,++********((''''''(((),2;FS`kruwuuuuwvqngYNGCBDFGFGFFFHIILT^hqy~‚‚ƒ‚€xo`M<.'#%#$$$(/9AN\grwz{{xtle_\UQKC?82,*****+,,-.//..2LdXJLLX=9AKWbmvyyxwuvxxvsmg]OC<622/110/.,../1023568:<@CFIKNRSVY]_dfkoquy|€ƒƒˆ‹ŽŠ‰‡†‚|xtpic]WSQOOOPPRUVY[\^`chjlnppqrrqqqqqpomie_ZTNMKIFC@?;::<AJU_hovwwuwy~ƒ…‰ŠŒ‹Šˆˆ‡‡ˆˆ‡ƒxqg`ZZZY\[_cfhkooppoooqrsurtrmhb][Z[^djqx„‡‰Šˆˆˆˆ‰ˆ‡‚~zxttx{{xyvwwyyyyxwtqmknpru774455433211110..122113457777899::;;==??@>@AB@CCDDBBA@?>>=>>====>>>=;;:::99987889:;=BGKORVZZ[\]^adbab`]WPNOSX\_acejjhgffc_]XVQIA<52-++-++***)(((''''&&''&%%%$$$$####$$$$$$%%%%%%%&''''))++,,--../////000/001269=BFJNTVZ]]acehjkieec`__`acefdca[WMD>7/+,,++,,,,++,,++****++)())((((((&'*/7DQ]iruuuustxwtpk_TJCDDGEGFGGFDFEFMWcnx~‚‚‚‚‚‚ƒƒ{sdSA1'$$%&&',58DNZgrvwyyurme]WQJE?80+)))++*+--..//001CfVRNPV8=CMXcnuxzxxwwxxvtmg]PD<62322222/-./02213579:=@CGJMORUXY^acglprvz~€„ƒ…‰ŒŒŠˆ‡„‚|xtpkc\WSPOOONPQSTVW[^_cdegmooopqrqqqqrpomhc^YSNKHCB@=;977:@KT_ipuwwuwz}ƒ†‰ŠŒ‹Šˆ‡†‡‡††ƒzrid]ZXZ]\_aehlooqqqqprsuutsplgb\\\^_fmszˆ‰Š‰ˆˆ‰ŠŠ‰‡}yvstx|zxyxwyxxzzxwurmkmqtu775433432111110//022333568997788::;;:<???@@AAAAABBBA@A>=>===<<<<===<;;::9998778779<>@DILORUXWX[\_bbdfdc`[WZ^^ceggikkmikkigec_YUOH@92-,,**)**)(((''''&&%%%%%%$$$$##$$$$$$$$%%%%%%%&''''))++,,--..//////0011248;?DHLPTV^_bdeijkmllifeca`bbddedd^YSJA92.+,,++,,,,++,,++****+++)))(((((('&)-4@MYdnsvuutuwxwsofYOHDDFFFFGFDA?>BFP]jt|‚ƒ‚‚‚‚ƒƒ|vjZF6+%%&&).17>FN[grvwxxurmcXRKD>80))*))+++,--..//000?baQLOLE<BNYeovyzxxwwxxvtmg]PD<843222221-.//0213579:=@CGJMPSVXZ^acglprv{‚†…ˆŠŒŒ‹ˆ†…‚|ytqkc^WSQPOOPRSUUWYZ[^abdhjmooopqtsqqqrpolic\WPLFC@=<986568>JU`ipuwwuxy€„†‰‹‹Šˆˆ‡…†‡††ƒ€ypfb^\\\]^_bfinpqrrqrrtuvvvtqkea]\]_bhow~„‰ŠŠ‰ˆˆ‰ŠŠ‰‡€|xsqvy{zzxwwvxxxxxwurommnqs6654443210121121113334446577899:99::<;=???@A@AAA@@>@@@?>=<=>==<<==<<;:9999887666569;?BFJMPSUUTSTX]aceegec``bcfegiiiillkliigdcb`[ULE=5.,**)**)(((&&''&%%%%%%%$$######$$###$%%%%%%$%''''()*+,,--..///////01567<@EIMSWY\_dhjmnpprqojihdcabccbca`[TMC<5/.,,,,+,,,,,-,,++++++++****(())((((*-2<HUdmsvvvvvvyywti_SIEDEGGFEEB>;;<@LXdrz‚ƒƒ‚‚‚‚‚€wp_L;.&&')-05;@IP\gqvwwwspk_UMF?5.+())**++,,,-..//1114NeRKOU^M?Q[gqwzzxxwwwwusmh\OE=854332220//////12479;>ACHKLNSUWZ^bcgmqtx~‚ƒ†‡‰Š‹‹Š‰†„ƒ}ytqkf_XTROOORRUXXZZ]^_bcegjkmnopqrtssrrspnnid]VQKDA>;:762248?JV`kqvyxvx{„‡Š‹‹ˆ‡‡†…†‡‰‡„xogb`^]_``cehjnqrrrssuvuxvvsric^]\^bflsy€‡‰‹‹ŠŠ‰ŠŠ‹Š†{vtrtx||xxxwwxxyyxwtqmkmort6654443210122221114455556577989:::;;<=>????@A@AA@@A@??>>=<<=<<==<<;;::99989966654589<?BFHKJJIJJIOTX]_ehhhedegfeedddceefggfgihhheb[SLA60*))**))(('&''&%%%%%%%$$###########$%%%%%%%&''''()*+,,--..///////0469;AGLQRXZ`dgimoqsswuromjfecacdcbb`[UOF<51/.,,,,,,,,,,-,,++,,,,++++**(())((((),19DR_jqvutttvyzzumbXMGFFGGFEC?;878<FTbmv‚„ƒ‚‚‚‚zseTB2)')+049?EMT]hqwxwwroi\PH@8/+))))**++,,,-..//1122=ghRPIZaJM[hsxzyxwwwwwusmh\OE=85434322000000004679;>ACHKMORTXY]^cglptx~‚…ˆˆŠ‹Œ‰‰ˆ…ƒ‚€}ytpjd]XVTUSUXXZ\]_``bcdhiikmoopqpqsrsrrsrpomf`ZTMC=:97531028@KWakrvwxvx{„‡Š‹‹‰ˆ‡†‡ˆ‡ˆˆ…xogb``___adfiloqrssttvvwxvvrpic^\[^bgow}„ˆ‹Œ‹ŠŠ‰ŠŠŠ‰„|xsppsy{{yxxyyxxyyxwtqomnprt55554442232233333455556666679;;;;;<<<>>>????AB@@@@@?>>====>=;;;;::::::998877555544557:9<>=>>:99;CIQW_dhihgfeeba\WTTX\\]]]`adfhjkmj`VLA4-*)**(()('&&&&&%%%%%%$$$$#"####"$##$%&&&&&'''((***+,.----//0001247<?DKPTVY_bgjmoqrvuyxwtqmieddddccb_YVQFA92,,,,,,----,,..----..-,----+**())))))),27?N]iqtuutuvwyywpg\QIGGHEGEC=74449AO_ky€„…ƒ€ƒ„ƒ~wkZH9.*-04:>CJQX_hqxxyvqoh\OD90*)))))****+,--...//103;RdTTGNNRQZgtz|zzyvvvvtqng\OF>:7665553110000013567:=ACGJMORSVXY`bhjnsx}„†Š‹‰Š‰ˆ„ƒ‚|yvphc\XVWWVY[]abceegjklnnpqrssqqrssrrrqtrrqnje_XQJB<65532027@KValsvwwvz}…ˆ‹‹‹Š‰ˆˆˆ‰ŠŠ†…€yohdb`_^_bgfjnrqssstuxxxzwurlfa]]]`ejry…‰‹Œ‹ŠŠ‹ŠŒŠˆ‚|wqmpuy{{xwvvvxxwwyxutpoprsu55554444334344445555556666679;;;;<<<=?>>????@A@@@@?=====<;<<::;;::::::998776655433331456653300029@HQY]begefb_YTOHFFFHKLPQTY\afkmpnleYL>1,+++*))(('&&&&%%%%%%$$"""#####"$$$$%&&&&&''(((***+,.----//001249<AFKPUY\cginnrtvxz{|{wtrmjgfdccb`^YVOH@82-,,,,,,------..----....--...,+*))))))),/5>KYensuutuvwyyxtj_UMHFGFEC@:51024=JZgv~„†„€€‚‚€yqaN>30139>BHNSZ_hqvxyxsnh\L>4-()*)))**+++,--...//014=TNQOKQLBM]jv||{yxvvvvtqnh_RF>:7665533111100002467:=@BEHJMPSUY[^`eilrx~‚‡Š‹‹Š‡‡…ƒ‚€~{wtpjd^]XZ[[]`bdeiillnpqqrrvvvvttstsrrrtuttusokf^XPF@;8653238@KValsvwvx{~‚†ˆ‹‹‹Š‰ˆˆˆ‰ŠŠ‡„xohec`__`cefjnrsuttuvwyyywuqle^]]^`fnv|‚ˆ‹ŒŒŠ‹ŠŠ‹‹‰‡|wplosy{{xxwvvxxwwxxutqpoqsu66554444444455555555665566899:::;;;=====??????????>><;<<=;=;;;::::::99887654543211/..0110--.,+,.58AJQY\]aaa\UMC:556878:;AFKQYcjlrvtmcUJ:1-.,+*))'&&&&&&&%%%$$$##""########$%%%&&'''(((**+,,----./001348?BHNQY]acfjmrsvwz||yzzvrnljeddbba]YRMIA:3-+,,,,------........//./012210--*)))))),/3;IWcmrutttvvx{wuoeWMIGFEC@=72-,.28EUbq|‚…ƒ€€‚‚{vjYH:778>BGKOSZbjqw{yxtnh]M>3,))))****,,*,....0/0023ORY\RPRTKA[kuz|zywvwwvurmg^QF>97665432221100111345:=>ADGILPSUWY^_cfjqw~ƒ‡‰‹‹Šˆ…„‚€€}{xtojea__]^abdehijknprtuvwvxxwvvvttrrrstuvvwutrmi`\SHA:743126@LWbltxwvxz‚†ŠŒ‹‰ˆˆˆ‰ŠŠŠˆƒ~woib`_^`bdghlprttuuwyzzyzwtnic^]]_chqx„ˆŒŒŒŠŒ‹‹Œ‹‰…yrmkotxzzwvuvvxxxvxyvurpqutt6655444444445555555566668899::::;;;===>>??????>>>>==<;;;<<<;::::::::99886644442211/.....,,+,++,.04:DINRVYYXRI>40..-,+,.027?GPZcjquwskaUH<751/+)(&&&&&&&&%%%$$$##""########$%%%%&'''(()**+,----.//02358=DKNS[^cfhlnotwxz|{}yxwsplihecb`]ZXRKF?92-++,,,,------..//....///0124443.-,+**))),-2:FSaksutttuuwyzxoe]QKGFDB>:50,**06AR_my……‚€€€‚„‚~woaSC<;>BGKNSW\djqw{zyvqj^O?3,*())****,,,-,,...01123?bocRJKHPSaluz|zywvwwvurnh^QF>976654322211001113457:=>CEGKMPSWW[\_djpxƒˆ‰ŠŠˆ†„‚€~}zxtoieaa_`aacdfiikmmnqtwvxxzzyxxxutrrrsuvyyzzyvsphbZQJA;86538@LYdntwyxz{€ƒ‡‹ŽŽŒŠ‰Š‰ŠŠŠ‰ˆƒ~wngbba`_adgimqtttuuwy{{yxvrmfa^]]`cjt|†‹ŒŒ‹ŠŒŒŒ‹‰…zqllotxzzwvuvwxxxvxyxurprvvu65554444555555555555557788:::;;;<<==><=???>>>>>>>===;;;;::;::9::9:;988976554321100//..-,++++++**+/5;AGLLONJC93-*))******+.4<FOZcmrwusj`RMD=:53-*(&&&&''&&%$#$$#"#"#####$$$$$$$%%&&''()))+,--..///0258<AJPT[_cgjmprsuwwz||yxwqonkgd`b^[XSOKD=61.-,,,,----.-..//./....//022446540/--,,*))*,09BP\gpttttttvxzyqi_VLGFC@<83.+().5?LZiv……ƒ€€‚ƒ„‚}tk[LCACGJNQSV\cirw{zzwqi^PA4.******++,,....//..0022MnaAKHJAMU`mv||{xvvwwvvtoh^QG?:855554411220011133556;>AEEHJMPTVW\]bhow}ƒ†ˆ‰ˆ…ƒ‚€~~}{yvrmhdbbcbacddfghklnoqsvxxyz{}yyxusrrrsuw{~||z}|xqkcZRIA:6448AMXdosvzyy~…ˆŽŽŒ‹Š‹‹‹‹‹Šˆ…wmfb^]\]_cfinrstuuuvxyyzwtpld_]^^cgow|…ŠŒŒŠŠŒŒŒ‰„wpkipuwyywwwwxwwxvxzywsopruu65554433555555444466668889:::;;;<<<<>=>???>>=====<<<::::<8::;999899988765544220/....--,+******))**-4:=@CA@:4,+*)****))))),.2;GP[eluvtqiaZROJE@:3,(''*++*(&%$$$#""######$$$$$$$%%&&''())*+,--./000148;BGMTZ`deknqqtwwxy{yvtspmkhhdb_]XURMGB;51---,,,,----....///.0000//1135456520.-,,,**,-18BMZensuttttvxywrj_VLGEB>951-)(),3:FVdr}„ƒ€€„„{qbUMHIKMOQSX\cgptvwwwsmbSE>;,*++**++--...../..0246VcJBJGKIHW`mv||{zwwxxwvtoh_RH@:8555544442201111333568;>ADFIKNQSUX\bhpw}ƒˆˆˆ†…‚€~}{|ytplgcbcccc`cdefhijmopqrtwy{||zzxusrrrsvy{~}~€|yrkdZRH?7248AMZfovxyy{…ˆŽŽŒ‹Š‹‹‹‹‹Šˆ…wngb^\[]_bejorsvvuvxz|{xwsnha^\\^bhpw€†‹Œ‹Š‹Œ‹ŠŒ‰ƒ~tljjotwyywwwvwvvwxz{ywtstuvw556677555556766677777788:::::;;;==<===>>>>==<<<<<<;;;;;;99<;::888777655555223///.,----++))))*)(()(),1569840,*(((****))))))+-39EP[equvurlgb^YQMF>80,-23322-'%$$##########$$%%%%%''&(())*+,---.//0147:?FMSZ^dgjlnpqrvwwwusromkifb_\[XTRNHD?730----,,----../-.0/../111122224467641/----++++.15>JUdlrttsssvwxwslaWLFBA<83/,)''*28CRaoz€ƒ‚‚€€„…‚}wl_UONONQRUX[`fjrwwwwtmbTINJ-)))**++---...////016QlG7<9?IIJVamw{|{yxwyxwvuqlaRG@<96655433333111133443689<>AEGJMNPRT[`hqy~ƒ‡ˆˆ‡†„€}|zyvrnieba`aaaaab`abdegghjnrsuxzzzxvtrrrrtvwy{z~‚„„‚~{qkbZQE<549DP[fpwyyyz~‚†‰ŒŒ‹ŠŠŒŒ‹ŠŠ‡ypje\[ZZ\`djnsuuvvxyz{{xvqkd_[YYZ`hs{‚ˆŒŽ‹‹‹Œ‹‹ŒŒ‰ƒ}skhjnsxyxwwuuvwxvx{{zwstuuvx666677556666766677777788:::::;<<==<===>>>>==<<<<;;:::::::999998887776555543210/..,,,,,++*)))))(())(*,-00-*))(())))))(())))*+-28CP\ipuwutpllfa[TKE?:;?@A??71,%$##########$$%%%%%'''((***+,-...//037:>CJPW^cfklmopstttsrpnkifda]\ZXSPMID@;62/.----,,----.../0////011112222335652//..--,,,,-03;GS`jrtsrsstvwwslbXNF@?950,,)'').6?L[iu}‚‚‚€~ƒ„ƒ€}sg]UOOPUUWZ\^cglrvvvsk_RPGB/*****++----../////25a†]98IQOOKUclx}~}yxxxxzxuqlbTG@<966554333332246887755679<>ADFHJLNPX^gov~ƒ‡ˆˆ…„‚€~~}{ywvsmgda`^]^]\Z[Z[Z\]`cbdfimquvwwtsqqrrrtvvxzx|~ƒ„‚~zrjaYOE<9;FQ]hqxzzz}€„‡ŠŒŒ‹ŠŠŒŒ‹Šˆ…‚ztlf^XWY[bhmrtttuvxyz{yutnh`[ZYX[bkt|ƒˆŒŒ‹ŠŠŠ‰‹Œ‹ˆ‚{rliknsyyxwvwvutuvx{{zwtsuvuw77757755776676558867889989::9<==;>>?<<====<<==;;:999999999988898965555332322/..,-,,++*****))(('(('&'(())''(('())('))((((((((*.4=GS^hrwyvuuspnhb]VQNOPQSSOHA7,%#!""$$###$%%%%&&'''''()*,,,-..011258=BIOV\afikmoprutrqniiffc]ZYVTPLJGEB>820...-------------.001111334422211344220000.-,.---/39EP_gqtssrstvvusndYNEA=84.++)'').3:GWgpz‚ƒƒ€}~ƒ„ƒzoe\VTSUVXZY[\ciosvutmaXS7>7+,,++,,+,--../000136UwgIJITTQOYdpx}}|yyxzyzyyslcUG@<96644432213469=<=<<;86579<=@CDFIJPU]gryƒ‡‡‡…ƒ€~}{zxvvpleb^\YYUVUTSSSSRTTUXZ]afknnqqqrrrrrrrsssuxxz}‚„‚€xribVKB>?JS_jqy{{z~€…‰ŒŽŒ‹‹‹ŒŒŒŒŒˆƒ}wpg`]Y\^cjpsuttuwxz{zwsqjd]YWWW\dmw~†‹ŒŒ‹‹ŠŠŠ‹‹Œ‹ˆ‚{pkikmsyyxwuuvvwwvw{{{vtsvutt776777667777666677778899:9;;:;;;:;;<>>====<<;;;;999999998888888877664422120/..-+,,+++**)**))(('(('&'(('''''''())('))((((''(((+.6=HR]hrvyxxwutqnhfa`acdffd[SH:+$$""#####$%%%%&&''''())*,,,-./11147:AFMSY`dgjlnpqssolhfc`\\YURNKHEEA><750/.-..------------.0111121334443322452221110/-....-/28CP\gorssrrrtttrmdYNE@<72.+)('''+17AQ`lw€ƒƒ€}~ƒ„…ƒ~uh`YWVWWWWUWX^fmtuurhZXL7@:,,,++,,+,,-../00022>X_\TWC@NUUXfpx}}|yyxz{zyyslcUI@:866444333389<CFEFEDB>:7778;<=@CGJPY`iry…ˆ‡†ƒ€€~{zzxvtnic_YTSPNMLJIJKLLLLMPQTX]ehknqpqqqprrrrrqqqruvz~€‚‚|xpg[TIABKT`krwyy{}€…‰ŒŽŒ‹‹‹ŒŒŒ‹‹‰…{tme`^^afkpsutuwxzyzxurnf`ZVWUX]eowˆŠŒ‹‹ŠŠ‹ŒŒ‹Š†wohgjmsyyxwvuvvvvwy{{zvrrttss7768988869887777667878::::;;;;<<<<<<<<<=<<<<<<::9988998888887777555521111110---,+***))))))((''''('''''''&&''''(((())))''''(('(,24>GQ[cjosvvuttssopoqruvvrjeWI9)"!!""$$$%$$%%&&&&'()*+,,,,-/012369=CIOV\afilnopsqlkfb\ZVRPLJHGCA=:9842/....------....----00012233555555445544322210////-..028BMXeosrqqqqstsqmeZOE>;60,''((')+.5?LZft|ƒ‚€}~ƒ……†€ynf]YXXWURRPV\bjrvuraXY@6<2,+,,-------../01003;[f^Z`[;HTXVhpz}}{yxxyyyyztmcUJ@96545543246;?EJNPPROKD>967779<>AFKRZclsy…‡††„€}||zxuqmg_YSPMGFFEDEDDDEFGGIJMRY^dgjloqrrsrrronkklmmoqv|€{tlb[PJFNWblsy{{}‚†ŠŽŽŒ‹‹Œ‹‹‹ŒŠ…‚}vqjfeefmpstuuwxyyyzwsnhb]WRSSX]goy‚‰‹Œ‹‹‹‹‹‹ŒŒ‰†wlefiouyywvuuvvvvuwzzzvtrqqqp888899997:889977668878::::;;;;<<<<<<<<<<<<<<::::88888877778757745555111100.--,,,+**))(('((''&&&&'&''''''&&''''((((((''''''(('(*+05=GNT]cfilnqrtuwxz|~……zsfVF5(!!""$$$%$$%%&&&&()*),----/002358;AFLSY`ehjlmnoqnhc\YTPNHDA?><;8764200///..------....0000011123345555555566444322000/0/-/.028@LVcorrqropqrqqmeZOE=84/+(()(()+-3:EVdpz€‚€}|}‚†‡†€{qi`[XWUQQOLOT^irutvbQK?882.,,--------.//000125Mk_WdV8;PWWdqz}}{yxxyyy{ytmcUJ@:7755554459@GMSX[\[YUNB;85667:>@FOV]fnv}‚†‡†„ƒ€~~~||zxuqke^TLGCABBAABAAAABCCDFKPW]`cjmqppqqrttplieebbfhntz€}yog_WPOQYbltz{{}„ˆ‰ŽŽŒ‹‹ŒŒ‹‹‰ˆƒ~zuqkkjkpsuuvvxxyzzyurlf^URPRRW]hr|„‰ŒŒ‹‹‹‹‹‹ŒŒŠ…~wmecjpvyywuuuvvvvuvxxxvsrpqpn9999999999888877877789::::::;<<<<<<<==<;<<;:::887776777777667546545311200/.-,+++**))''''&&(((())&%%&''''&&''''''''''''''''&('''')+4;BHNRXZ]bdhnuw}€„†ˆ‹ˆ†‚|reUG5&#!"$$$$$$%%%%'(****,-../011358;=BGNV\beiklooomia\TNHEA?=<96534321////----..........//00112333455566775566554433220011../137>JT`kpqroonpqppme[PC;51-*''()()*,/7BP_lw‚~}}ƒƒ……~umc^ZUQMIGGHP[jqvtkRBKNF>60,,--,,----/0//10/25H[[[i[76PTVdrz~zyyyyzzxxsmdUJ@:75564446;@HPX^bghfb_VKB964358@FKSZdkry€„‡ˆ…„‚€}|~}zxvrjbZMGC>?>>@?@@@???A@CCGNT[afimoqrqqssqpje]YUVZ]ckswz}{rld[XUY^gouz}}~„‡ŠŽ‘‘ŒŒŒŽ‹Š‡…|{{xxtpqqtuvvvwwy{zywtoic[TPOOPU\gq~…‹ŒŒ‹‹‹‹ŒŒ‰„~skffkqwzywtuvvvuuuvwwwsqnnnpn9999999999888877887789::::::;<<<<<<<==<;::::997766666566765555655431110//..,,****)(''''&&&''''((&%%&''''&&''''''''''''''''('''&&%(*059<CDHKOT\dnv|€„‡‰ŠŠ‰…ƒ|ocRA.$"#$$$$$$%%&&'(*+++--../013467;?DJQX^dgjlonmmh`ZPJCA=:86544311200////----..........//00123344556677777777665533321000///137=HS_jpsspnmnorolg\QE:4/+)('()()*+/5<JZgs|~|||€‚„„ƒ~xpg_YTPHECCGPZfptfM>D\\M?60,,--,,----.///00.2=RY^cdTIQQOVgqz~~zyyyyzzywsmfXKA:75543448=ENU^flqrple]PE<6538<BKPV`hou}…†‡†ƒ€~}~~|zvrjbVMFA?=>=?<>==><=?>?CGNT[aeioppqpqsqqoic[QJHMTZckquzyvoia]\]bgov{{{„†ˆ‹‘ŽŒŒŒŒ‹ˆ‡„zyzz{{zxvxwwwwwxyx{zywsmf_WPPNLOU^it~†Œ‹‹‹‹ŒŒ‰zriffjqwzxwuuvvvuuuvwwvrpmnmkj888899999987887788889:::::::;<<<<<<<<<;:::::987766665455556566555211000/.-++**)*)))('&&%&%%%&&%%&%%&''''&&&&''''''''''&&&&(&%%&%%%%'*/11238@IPYcjsz€‚„……ˆ††‚xo]L8'##$$$$$$$%(((*))*+--/.0013578=AGOUZaehknolljc\TIC=96654444312200000/-----...//....//1112334455667777777766554333021100//48;ER^iprqnmkmnrpmh]QE:3.+)(&())*+*.2;FVeqz€‚~|z{~ƒ„ƒzrj\VPKB?==DMXfphI7B^i`QD80-.--,,..---./0./13A]]baUSYXSPYdq{~}{yxyzzzywtneWKA;8444446;AJT]fotyyzsj`UG=747;BJPV_fosz€ƒ††…ƒƒ~~}}||}{wqh_UJB?><<<=<>=;;<==?@DGNV[agjlnnoqqrrplg_WKC<?GQYahmuuvqkgdbadjry}~|‚†ˆ‘ŽŒ‹‹‹‰‡ƒ€}{{}{}}}{{zzzyyxyzz|{zuoiaZSNLJLOU_kv€‡Œ‹‹‹ŒŒŽŒ‰zqhdejrwzxvuuuvvvvuvwwwsoolljh99999999998788778888::::::::;<<<<<<<<<;:::9987776666445544553334521100.---*++*()))((&&''&%%%&&%%&%%&''''&&&&''''''''''&&&&''%%&%%%$$&())*)*0<CKT]flrvyz|‚ƒ†…~tdS?*!!$$$$$$%&((()*+,,-../0013689>DJRX]bgjmnmmjd]ULB9874433333311100000/-----...//..../011233355557788777777765554322110110048;CNZioqqnllompqog^SG;2-*)(()))++*,39BP_lv}|zz{~‚‚{vj[SLE?:9:AKWbpkN9LjocRE90-...--....-./00123FbibSMjbRUSWfr{~}{yxxyyyzwtneWKA:7443346<BMVblu{€}ulbUI<77;BHOV]flsy‚…††ƒ}}~|}~}{wqh_TJC?=<;;;<<;;;<<<<=BGNV[`fkkmpqpqromje\RJ?76=EPX`flswrmiifgimtz}~„‡‰‘ŽŒ‹‹Šˆ„€{ywsuw|}~{{zzxyzz|{ytmg]VNHIHIOU`mw‚ŠŒ‹‹ŒŒŒ‹‡xmebhlrwxywvvvvvvvuvwwvsomhhge:::::::9998777778888:99999;;::::;;<<<<:;:;99887765555455544443343201/---+,*)((''&&'&'&%$%%%%%%%%&&%%&&''&&&&&&&'&&''''''&&%'&&&&$$%%%%%&%&'+05?FNTZaeilpx~…†„yiXD-"$####$%&'())*++-,-../012469>AIRV\bfhknnnmg`XPF;7444443333212100000/....-.--//..001111334555579999999988776655442211111148;@LWdmpponkmnnqold\NA5-))*)*))**+,18=KZht{~~}zyy|~€€}wj_RHA<557?IT`jqJ?auqgVG<4/.,,....--./00003;Zz{eHN\\HIRYdqz|yxvxxyyxuoeXJ@84332137<EPZdpy„ƒ~umaUI?<>AHPW_emrx}ƒ…‡‡†‚~~}}~~~~|wqj_SI@;<;:999<<;;;;<9=AGOV]cilnoooononmgb[OG:304;ENV`fnqsojjkloru{}~‚…ˆŠŽŽŒŠ‹ŠŠˆƒ|vrniltx}~€|{{{{{{}{xqkd\TLHFFIMWdp|…‹ŽŽ‹‹‹‹ŒŒŒˆ„~ukcaglrwyywuuuuuvtvwvvuqnkjheb::::;;:99987777788889:99::;;;;::;;;;;;:9:8776676555444544444432221/0/.,,,*(((('''&'&'&$$%%%%%%%%$$%%&&&&&&&&&&&'&&''''''&&%'&&&&$$%%%%%$%$&&&*09@EJMNSZbny‚†„ym\D-$#####$%&'())***,---/0/1369<BGLTY^egjlnnmgc\UJB;7444443333212100000/....----....001112334555679999::::98877665442222111348;@KValpponlnnnppmg_RC6.***)*****)*/6;IXery~}zxxz}|wl_RF=6148=FR^kd=BgvofXJ=5.,++,...--.//../0Cn{v^ONYT>NYcer{~}{yxvxyzyxuodWJ@84311248@HP\gs|‚„ƒ~ul`THAAFIOW[cjpx}ƒ†‰‰‡„‚~~}{|~~~~{wqh^PH@;:99999::99999:=AHPY^dilnooonnomjdaWOB61./3;FQ[cjnqroonprtw{~~€ƒ‡ŒŽŽŠŠ‹Š‰†zrkebemrx|~€€||{{{{{}{vniaXOICDEGMXfr}‡ŒŽŽ‹‹ŠŒŒŒŒ‰ƒ|qjbbgltyyywuuuuuuuwwvtspmkifeb;;;;;;;;::9887888888:8999::::9:::999;:888877765454445444234441220//0.-++**)((((('&'&%&&%&&%%%%%%$$$%&&''''&&%%&'%%&&&&&&&&&&&&&&%%%%$$%%$$$$$$',158;=CKWiv€…„zn[C,##$$$$$%&'())*,,,---/0/136:>DKQX\afjjjnmid`XOF>96545444444333321000///.-----...0001133445567789988999998877665443322322136=BIT_iqrpnkmooprpkcWI<0+++))*++,+-/6;GVbnw}~{xxz}~€€~yobSD82036<EQ]jaDFowrh]L@5/---,,--....-.02<_klrXGNNZSQRgjt|~~{yxwwyzxwuogYJ@84211249=GR_jwƒ„ƒ~uk`TLGEIPVZ`gnv|‡ŠŠˆ†~~||||~{wqi^PF?986857777787768<BGQZ_gimnmmnmmnjgc[RH=6.+-05=FS\eloqqqqtuxz|~}€ƒ…‰ŠŽŽŽŒ‹Š‹Šˆƒ~wla\Y^fksy~€~}|||}|||yslf\SJEBABFO[ht‰ŽŽ‹‹‹‹‹ŒŒŒŠ†€{pfacfkszyxwuttvvvvvvuspnjhgea^;;;;::;;::987888888899999::;9:;;9999:877756666434465444323444111/.-.-,++**)(('(('&&&%&&%&&%%%%%%$$$%&&''''&&%%&'&&&&&&&&&&&&&&&&%%%%$$$$####"""$&',./6BQds„ƒylX>)##$$$$$%&'())*,,,--.001369?DJNU[_ffgknnlhcZSJC<665554444443333210000//.-----...0001133355556789999999998767665543322231247<AIR]fnrpnlnooprrlf[M?4,,)+)*+++*,05<FUalv}~{xxy|}~{reSB72036:DO[g[ERutoj_NA6/-+++,--......03KjjulLGFHMLNRons{}~{yxwwwyxwtngYJ@84212239>HUbmy€„…‚~uk`TLHMSXY\dmt{…‰‰Š‡„€€~~~||}{~{vpg\PD=;76667777767767>CJSY_fjmomnmmnmkf_YPE:2.++-18ALVajmtttuxy{}~€‚„ˆŒŒŒ‹Š‹Š‡{sg[SPX`kqvz~~}}}}}||zwrkcZQGB??CHQ]jw‚‰‹Œ‹‹‹ŒŒŒŠ†€xnf_bgltxyxvtttuuuuuuuspnjhfda];;;:::;;:9987788889998999;;;::::99988877655554555544333323554100....,+++**)'''''&&&%&%%$$%%%$$$$$%&%%&')'&&&''''''''&&''''&&%%%%#%$$$$####""#"$$#%&',4>N`q}„‚ykW<'##$$$$%&'()**+++,,.12249=BFKQT[adghimnlif`WNG?8766544444442222110000///.------.0001123455557779999::9999888866554433332458=BIQZckpqommooqrvqjbQC6.))+*+**,+.3:?GS`js|€}yyx{|~€€{sgWF:3149:BNYeTK^ztqk`PC70,,,+,,,----.0/3Rqzw_FEL>>LUUeiq|~{yxwwxxyxuofYJ@9412114;AIWcoz„‡‡„xm`UQQSVX[agpw}…ˆ‰‰ˆ…ƒ~~~}{{}~~}|upf[OB<864456766554457;BKSZ`gjllmmlkmlic]VMA8/,**,06?JT^imsvwwz{~~€€€‚…ˆ‹ŒŒŒ‹‹ŠŠ‡€zpeXKJP\dkrw{}~~~}}}{{xuog^XMD?==@GS_l{„‹Ž‹‹‹ŠŒŒŒ‹‰…uld`chntxxwtssssssuuttqpnjfec`[;;:;::;;:98777888888899989;;::99::8988664455544444333322222221//--,,+****)('''''&%&%&%$$$%%%$$$$$%%'(++--+('('''''''%%&&&&$$$%%%%$$$$$####""#"###$%&+1>M_p}„‚ykW>'##%%$$%&'()**+,,-./0259?DHMQV[]deijkjjjic[SJA97566544444442222221/000.--------.0001123456657778999::999999776655443333346:>CIQ[dkpqonnoqstvtnfZJ<0****+*+,/26<BKT`kt|€~zxx{|~€€|vl[K=5025:BMWdPSgvurmcSD;2-,,+,,,--,--.08lzuubNED>EQQTffq|}{yxwwxxyxtneXJ@9401/15;CMYfr~†‡‡†‚|pdYVVXZ\]dirx~…ˆ‰‰‡ƒ~~~|||}~~|ytof[OC:644444555444457<DMU\bhkllmmlkiifa[TI@30+))+04:EP\fmrvy{|€‚‚‚ƒƒ…‰‹ŽŽŒŠ‰ŠŠŠˆ†xmcUJJNWahpwz}~~}~~~|{ytle^RHA<:>BKWco|†‹ŒŒ‹Œ‹ŒŒŠˆƒ|ujb`chntxwuttsrrrsttsqromjfc`][;::;;;;;9:877788877788889:::::989987776655433333443333221100//.-,+**+++*((''''&&&%%&%%%$$$$$#$$$$%&',03442-+)()))&&&%%$$$$$$#%$$&$####$#$##""#""! $')/:J\my…zkXA)"$#$%%&'()))*+*,.-0259AEJNSV]_cdfhkkkkjf_VMD>86565544433332222110../0.------...0001112346667889989::::9999776665553333567:?DIQZcjoqponqrstvuqkaQB4**++,+.036;AEMValu}‚€~z{{|€~yoaOA71148ALWdLLjvvqleVF;2-++*+,,--,-,00IzrUK^]TPWLMQPiir~}{zywyyyyxtnfXJ?8411/27?FP[hv…‡‹‰†rg]XXY\]`elrz€„ˆ‰‰†ƒ€~}~|~~}~€|yuoeYMA9522232233443348=ENV]ejkmmmnllkie^ZPE:2+))*,/38EO[cjrwy}~€‚ƒ„„„„†‰ŒŒŒŠ‰‰‰‰†…~uj`VKGMT^irx{}~}}{zwqld[OD=::;BLWgs‡‹ŒŒ‹‹‹‹‹‹‹ŠŠˆ}sga^bgotvwurnqqrrssssrqnljfa^[Y;::;;;;;:9877788787788889::::9778877776544333333222211111100//.-,+*****)((''''&&&%%&%$%$$$$$#$$$%$&'+05:=9722100.,(&$$##$$$$#%$$%#####$###"#"#"""!"%(/9GVjy„|n]J1$%#$%%&'()))*+,-.036:@FKOSX\_acfjkkkjjic\SJB;64655544433333333110/.//-------...0001112345677889989:::::988877665553355668<@EIQXaiprrpoqrstvvtneWF8.-.,+.157;@DJQX`js}ƒƒ|{{z}‚‚€{reUD82148AITcKFivvrlfWH=2-,,*+,,-----1DtwmZ8OOMSWQRROcjs}€}{zyxwyyyxuneVI>843125;AIS^lx‚‰Š‹Š†th`[[\]]bflrv|…††„‚~}}|||}~}zxtndZNA9521112211111149>GPY`gjmmmmmllkhc]WMB7/*)))+/3:FO[cipv{~€ƒ†…†ƒ„„†‡ŠŒŒŒŠ‰‰‰‰†…}vl`SKJMT^hpv{}~}}|{zvpjbVKC=::;BNZiu‰‹Œ‹Œ‹‹‹‹‹‹‹‰†€xpe`^bhntvvtrpqqqqrrrrqpmjgca^ZX;9;::;;;::89878788877899999888887766665522221111222210000/00//..,+**))))))'&%%''%%&&%%%$$$##%%$$##$&+.37;;:6777765/*%$$$$$$$####"#####""""""""!!!!#$)-6BRcs~‚~scP8'&$$'''(((**++,./25=CHMQTY]_bdhkkjmkhie^VLD?97665566553333332211///..-------../10011123455678899899999987899764434345676:>@FKPX`iqstrppqsuvxvpg\K;2----169=BEJMT[ajs|„……€~{z}~‚€xk[J;3347>ISaJJjvtrofXI<4-,,*+,,-----.KxzqJ7UNLIMSMRWchr{€~{zyxxyyywtmeYK=752548=ELXcp|†ŒŠ†}tib^\]]_aejpvyƒ…„„ƒ}}}}}~}~}yxumcYK?7321000000000/6:@GQYahmlmmmmlkie`ZUK?5-+++**.4?IS\cjqu{„††„ƒ„„†‡ŠŒ‹‹Š‰‰ˆ‰‰ˆ…~vl_RJKQVajqy|~~~|||{xsne\QG?:89=DO_lyƒŠ‹‹‹‹‹‹ŒŒŒ‹Š‰„}vlc^^bgnuutsrqppppqqqqomkgfc`\WV;9;:9:;;99998777888778889998886677665543222211112111100/0///..--+,**))))('%%%%&&%%&&%%%$$$########$%(*.166456699872-'$$$$$$$####"#####""""""""!!  !#&+2<M]o{‚vfU=*&%'+-,())**++-/26<BIMSU[^_befhjjjiigc_XOF@965665566553333332211///..-------../1001112345567887789999998789976653554568:<@CGKPU`hosttqppsuvxwslaP@6/..18<?BEJPRW]cks{ƒ…„€v{‚xo`O>5347>GR^IHlvtsofXJ=4-,,*+,,------;`pjQ8[WNLPYUMTc`fv}~}zyxxyyywtofXK@96689>ELS]ht~‡ŒŽŠ„|rhc`_^]]^`djov}ƒ„‚~}}}~~~}}yvrmcYK?731000....../04:BKSZcjmlllmmlkic]WPE<3-+),+-09BLU]cjrv{ƒ…††„ƒ„„†‡ŠŒŠŠ‰ˆˆ†ˆ‡‡„}vl_RNNSZbksy|~~}~}||{wrkf\QG<888=FSco{…Š‹‹‹‹‹‹ŒŒŒ‹Š‰…|sic^^biovvtspopqqqqqqqomjgdb^ZWW::<<::::;9::9887888888889977765555445543222211222200//////./.--,++*)('''''%%%%%##%%%$$$$%%#"######$$%'(*++-///26661.(%##""""####$$#""""""""!!!"""""#%)0:JZkx€wi[F/&%*/23,)))*+,-28;AGKQUZ^`cdfhiiiigfdaYPHA<764555555554433322200//.-.-------..0011112325666788888899889888887775445567:<=AEJMQX_gouuusrrtvtvwsndUG:1027<@EHMPTX[_diq{‚‰†ƒ~s^j|€yz€|seTD8336<FP_JGkvsqnfXK>5.,,)*,,,,,,-+2LenaPn|iQO^^NLa^Vk‚|zyyyyyxxvofYJ?;;=ACHLTZbmx†‹ŒŒ‰ƒznga`_]ZXY\bipw}„‚~|}}|}~~~~}{ztqkcWI=630/...---,,-/5<CLU]djmklkllmjhe]WOD91,**,+/5@HRX^ckrw}€…††…ƒƒ„†‡ŠŒŒŠŠˆˆ‡‡ˆ‡‡ƒ|vl`SQRU[elty}~}|}|||{wpibXMA9688>FXdq~‡ŠŠŠ‹‹ŒŒŒŒŒŒ‹ˆ‚{qf`\^cjrvwtsqpqrrrssqoljlge^\ZYY::<<::;;;99988878888888888777655443344332111112222/////.///..--,++)*('''''''''%##%%$$$$$%%#"######$$$$$&&&')**+///+)&%##""""####$$#"""""""! !!"""""#%)/8EWftznaP6)).59;3*))*+.16;@FLQVZ\adcfihhiihgc_YRKB<7655555555554433322200//...---..--..0011112325666688889977899888777765655668:=ADHILQW_emtwusssrttvvtphYJ>859<ADINRVY\_dhlu|‚ˆ†‚wnky~|p{‚}ujXI:337=EO^KHarsrnfZK>5.,,+,,,,,,,,,-4FSkkuteb`aZNBSfkz}{zyyyyyxxsmf\PDCACGJNRZajr|„‰‹Œ‰ˆuic_\ZURSTX`fnwƒƒ~|}{{}~~~~~|yvuqkbVI=63/.---,,,+++/4<CMW_gjmnlklllieb]WOD91,+++/5?GMU\diotx}~„††…ƒƒ„†‡ŠŒŒŒ‰‰ˆ‡‡ˆˆˆƒ|vlaUQSZ`gov{~~}|{}}|{upiaTI=7669?J\ju‰ŠŠŠ‹‹ŒŒŒŒŒŒ‹†ynd[[^ciqvwsrqqrrrrssrokjhfb]\]^^::::;;;;:99877878877887787776643333322221111110011000///.,..,,,,*))))'&&''&&%%$$%%$$$$$$$$#########$$$%%&&%%&&'%(*''%$""""""""""""##!!""""      !!!"$'+4>Qboy€|sgWB-)1;?A7,**,-169=CJQVX^bfeggjhiihfa]VOLD<97754545566444443221100//...-------../01111233456667766889989887766665666676:=@CEIJMQW\emsvwuspssssuuqj_PC<<>AEJNRX[^aegkpvz€†…xwujfqf[hszyo^M=4249CP[PO_qsrkeZK>6/,*++++++,,--+++8YrlgdpdWVTS]hu{}{{zyzyxxxvoi_UMJJLMPTYahov~†Š‹Š‡‚zre]ZVRMJMOS]fr|€ƒ~|||}~~~~}~{xxupibTI>52.----,++++*05>GOYahknlmkkkljgcZULB8/+++04=GNV]binswy|‚„‡‡…‚ƒ„†Š‹Œ‹‹Š‰‡†‡ˆˆ‡ƒ|ulaVRU\biqx|~~~~}~~}xume^RE:6648AM\ly‚Š‹‹‹ŠŠ‹ŒŒŒ‹ˆƒ~vl`YY^elsvwusqrqqrrrrrolhgc`\\^`b;;::;;;;:98777878877777787775433111111110000001100.-////--.+,,,,)()'''&&&&&&%%$$$$$$$$$$$$##########$$%%%%$$%%$##%&%$#""""""""""""""!!  !!        !"#$)/9K]lw~tk\J3),4<?4))*,/38<CGNSX\adfghhhjigda[VOHD>955655545544444443221100//.-.-------../0111123344566776677887788776666655688:=@BEEILMQVZdlswwvtrrrrtssqlbWNEBDJMQU[_dfikpsvz}€ƒ‚vut|dPD?@D^^XohJ8049?KZNM^lrrmeZK>6/,*++++++,,,,,,+5M]chkcDHMLS`ir{}{yywxyyyxuqkc\XRQPTV[`fnu|‚ˆ‹‹Š†xmcYSLHDBEMU^iv}‚ƒ~||}}~~}|{xwtpibTI>52----,,++++,19@HP[bhlmkllkkkieaXSJ@5/*+-3;EPU]ciorwz||‚„††…‚ƒ„†Š‹Œ‹‹‰ˆ‡†‡ˆˆ‡ƒ|ui^WUX_fmty}~~|}}}||xukf\PB84459DP_o{…Š‹‹‹‹‹‹‹ŒŒŒŠˆƒ}uh^YY^elswwusrrqqssssrolheb^^^_bd<;;;::::98988677887766776566421111110000/11100////00/.--,,-,,+,,))('&&%%&&%%%%%$"#########$$""""######$$$$$$$$$"""$$$#""""""""""""""!!          !"##'-5CVhs}{raR>.+/75/*+,.05;>DJPW\`cfiijjjiec_ZTOGB<765456544554445443222110/..---,--,,--...011112333555566777788898866666665679<=@CEFILKMOTYcltvwvtrrrrrrsqoh^TLHJOSY^bhknstvyz}€ƒ€mYZqhU[bi^PxVf`_T<:?YnbKGN_prleZK>5.-+,,,,,,,,,++,2;PVWbfQO]IELVeqz~~|xwxyz{{{yvphc^[YWZ^cgmry‡‰‹‹‰ƒvk_QLD=8;@MYeq{„„~~}€~}|{zxuupibTI=30--,,++**++-3:BJT\dhkjljjkjigc_XOF<3-)-2;FOV]djprvz{}~‚„††„„‚ƒ„†‰‹‹‹‹‰ˆ‡‡‡ˆ‰‡ƒ}vmbWSZaipx{}~~~}}}|}wuicWJ?62229DTbp}†Š‹‹‰‹Œ‹‹‹‹Š‡†zqh]WX_fmtvtutqrsrsstsqnkfca_`_adf<;;;::::988877768877666655443111111100000000//0///0/.---,,,++*))))(''%%%&&%%%%%$"######"##$$""""######$$$$$$$$"$#"$$###"""""""""""""!!         !!"##%)4@N`mz}ufYI5,+-,+*+-047>CGNUZ^bdgiijjjfa\VQJD@;7665663344554445442222110/..---,--,,--../01111233355456766778878876666666789==?BEHIKLMOPS[bkpuzyusqqqqsutsne[TPQUZ_ejqux€ƒ‡†„vX@PZRP@X`^dlNJA@GKh˜“rICLcsqkf[K>5.-+,,,,,,,,-/Hn}„†„tcfjV[JN\Xeqz|}{xwzzy{{{zxvoga_][_chmsx}„‡Š‹Š‡ƒ|uiZL@7339CP\hv}ƒ†„~~€€~}zyxxwspibTI=30--,,++**++-39CKT\djkkjjjihhea[VMB81,+07BKS]fjoty}~}}~„†‡…„‚ƒ…†‰‹‹‹‹ˆ†††‡ˆ‰‡ƒ}vj_XW]emqy{}~~~|}xrh^UH;3122;FXgs€‰Š‹Œ‹‹Œ‹‹‹‰ˆ†ƒ|tkc[WX_fmtvurqqqrrqrrqpmjeca`aadef;;;:::999877776655665556422221001100////..-----//...--+++++)))*)(('&&&&%%%$$$$$$$$$$$###########$$""####$$""##""########""""""""!!!!        !!""""$(.8GWgsz|xnaR>-*((**,-058>ELRY\`cdhijihd_YTNHB>976335444455553344332211000/....,,--.---../001202344555555556666887666447679:<>ABFHJJLNLNQQYbhptz{vtqqpprtvvqkd]XW[]djqw|ƒ‡‡‡‡ˆˆˆŠ‹Œ~jVQZVZ\cfib\EDLQD@LhwmYGZwsole[K=6/--,,,,,,++-/[~€vx}xiiwkRIV_Xdq|~~|yxwwy{{|{zwojeb`bdimry}†ˆ‰‹‰…‚{qeVF;404=HUamx……„€€}|{xxwwvrkbVJ=3.,,---,,+**/3:DNXaeiiiiiijieb\WQH>5.-/5>HT\dkov{~}|}~„„††„‚„‚…ˆ‹Œ‹Šˆ‡‡‡‡ˆ‰ˆ…~uj^Z\`hosy{}~~~|xph\SE80-,0<J\iw„ˆŠ‹‹ŠŠ‹‹ŠŠŠŠ†€yumbXTWahosvurprrsrqtsroliecccddefh<<;:::9988777766556655542222100///10////..----/./.----++++*+))))(('&&&&%%%$$$$$$$$$$############$$""####$$""##""##""""""!!!!!!!!!!!!        !!!"""#&*3?P_mv|zsj[M6,+*+,/046;AHMTY]adgjmkjd^ZRJEA>9554454444455553344332211000/..--,---..--.0/0012023335555555566667775656679;=>@ABEGIKLMMMOPSV^gnuzzxusqsssuwwtpjd_^`diou~ƒ‰‘ŒpVIIW_mrklnYGQCFGIIKTb^O[tnmic[L>6/,,,,,,,,+++,.>Yhpkfd_nkPO^^Tdpy~~|yxxxzz{|{yvojeccfimqvz}…‡ˆ‰‰…‚{qeTD8218BM[fr}„„„‚€€}|{xxwwvqlbVI<3.,,---,,+**.5<GNXafiiiiiiihe`\XOE92/04<DOYbinsy~€~}|}~„„††„‚ƒ„…ˆŠŒ‹Šˆ‡‡‡‡ˆ‰ˆ„~uka\_cipvz{}~|uph\O@5.++3>O_ly„‰Š‹ŠŠŠ‹‹ŠŠŠˆ…€yrk^VSXaipuvsrqrrrrssssolieddeffghg::;;;;99877766656655444200111110/0./..//..--------,,,,,+**(*)'&&((('%%&%&&%%$$##$$$$$$$$####"""###""##""""""###"""!!!!!!!!!!!!!!!!!!     !   !! !#$'.8GWfpz|wocTC2,--0136:@EKRUY]aeijjjhaYSLGB=:674445555444555433333321100//..--,,----..//./11111112445555554455555445568<<>@ABFIIJLMMNONOSX[ckrwxxtsrrqsvxxxuojfdehlqw€‡Š’‘’’‘””•“Š^;BX]Wgag}pVd\KDCGOU[VOUijnlcZL>70,,,,,,++,,,,6SKNVWaPIWQNXR[Xepz}}{xwxyzz{|{{xsjfcffjotwz}‚„‡‰‡…€zqdSC725<ER]jv‚„‚€€€€}|yvvxxvqldWI;2-++,,.-++),/6=GR\bfhihhiiige`ZTMC8127;DKV^ekrv|~~}{}„…†…‚‚„…†‰‹‹Š‰ˆ‡‡‡ˆ‰‰ˆ…~uk`Y_dkqw|~}~~{wodYL=4-+,5@Rap‡Š‹ŠŠŠŠŠŠ‰‰‰‡…yphZVSWaiortsooqqqrrrsrmkheffgiihge::;;;;9987776665552211210/121221221/..//..------++))+++)***)()(('''&%%%$&&%%$$##$$####$$####"""###""##""""""""""""!!!!!!!!!!!!!!!!!!     !   !! !"#%*2?O`jt}}wl\O@222568:?CGMQW[_bfhijgb[TMFA=:7654444444444444543333321100/...--..----..//./111111334444555544555545568:<=@BCDFHJJKLNNOONOSTY^hnuxwusrrqsvzzzwuojfijmt{ˆŽ‘‘“••–——–•‘u^VYP3]s‚|wj\TWRSMMYWQNU^fd`YMA7.,,,,,,++++*,2A]aPZ[Q]T:BEJT^eqz}|{xwxyyy{|{{vojfehhlpuux{|‚…‡‡…€zqdSC837>IVaoyƒ…‚€€€€€€~~}|yvvxxvqldWI;2-++,,-,+++-29AJT\bfhihhiiigd_YQJ@725=BJS\bhnsw{|}{zz{…††…ƒƒ„…†‰‹‹Š‰ˆ‡‡‡‰Š‹Š…~tia^`hlsy|~}~~{wodYJ;4-,/6CXdt€ˆ‹‹ŠŠŠŠŠŠ‰ˆ†‡…€xmeYURXajptrrqpqqstssrpmkjijjhhhfd^<<;;::998766665533331011021146674310//..--,,,+,,,,++**++)))'(())&&%%%%%#%%%%################""""$$""""""""####""!!!!!!!!!!!!    !!    !  !  "!!""#&,9EUcnx}zreYK;669;>>CHLRTX]adfhigc]UPJB=8766654344445544554433333211//......-------..../11001243334455554555443688:<>@BDEGGIJKLMNNOONPOQSYbjqyvttsrqsvy|}ywrmijinuz…‹Ž‘’˜™˜˜™š˜“ˆ„kSy€yob]LEV^YUQOMOPRYa\QC71--,,,,,+,,-*-5ZgWTaVcT:GLSX^hu|}}zzywwxz{{{xslgcccfiloruyy}……ƒ€zrdTE:58AN[gr{ƒƒ‚€~€€~{zyvvwxwslcVH;2-++++****+.4;FNV\cfghgghhhhd_WOG<59<BHPX_dinrvyywvxyz„…†…„ƒƒ…ˆ‹ŒŒŠŠ‰ˆ‰‰ŠŠ‹Š„}ujbabjpuz}}}~~€€€{vndWG:3,*0;HZjx‚ˆ‹‹Š‹‹ŠŠ‰ˆ‡„‡„vlbUQRYajqvursqppqrssqomllkljjhddaZ<;:::::8876655643321//001/1458;<:8531100....-+--,,++****))(''(((&&%%%%%$%%%%$$####$$########""""##""""""""####""!!!!!!!!             !!!!!""%%)2<IZhr{}vmcWG<;=?BDIMRVX]^beehhf`YSKF=976554664444455665544333333110///....-------..../110012243344444434445578;<<?ACDFFHIIJKLMNNOOOOPORV]dluxvtsrqsvwz}{ysnjjmqsv{€…ŠŽ‘’•—ššš˜˜”‘ˆ…|{|€€{sg\NGV[XZPLJMOLLY^VH=4.+,,,,,,,,,,-5E]\G[VWOFWVG>Pdmx~}zzyxwyzzzxuojdbbbbgkkosuxz}‚‚ypeTE96:CP^jv„…ƒ‚€~~~}{zyvwyxwslcVH;1+*********06=GOW_fhiggghhgfb]WOG?<@DIQX\bhllruvvsrswz}‚…‡†ƒ„„„‡ˆ‹Œ‹ŠŠŠ‹‹ŒŒ‹Š„~uk``flrxz|}}~~€~zskbSD81,+1;M_n{…Š‹Œ‹‹‹ŠŠ‰ˆˆ‡†|si^SPR[bjrttrrrrrrsttsqonlllljhf`[V;;99999876665343221///.//2278<>BB@=9554211/....---++*)))))((''('&&%%%%$$%%%%&&%%$$%%$$##########""""""""""""##""""!!!!!!        !!!!""#%&*3BN^ht}zsjbUGABCHLPTWZ]_bdefgeb\WOGB;85455556655445566555544442200000/..----..----///011011212222222423435678<=>ABDEEEHIHIKLLMOOMNONNMOPU^grvvtststtwy|}zuoljllmpsz„Š”•–˜š™—•‘‹„€|{{}~€{tk^RNUOPUVVMGKOSSTWRG;4+..-,,,---,..05:=QNQEDOPC>Pkgw|{xwwyyyzyxutlib[]^aeigmpquwy{~}wlbRF89=HTbny‚†„ƒ~~~}|{yxvxyxwslbVG90+))))**))+18@IRZafgihhhhggeaZUNFBAEJPY[_dhkmprqomorvz~€ƒ„…„„„„‡‰ŒŽŽ‹Š‹‹ŒŒŒŠ„~rgbbgmtyz{}~€}xri]NB7.+,3?Obrˆ‹‹Œ‹‹‹‹‹Š‰ˆ‡†yqg[QPR[clquvtsrssttttrrppolkkkfc\UP;;:9998876554333221///./.16:;@CFIFDA><;855431120..,,+***))((''('&&%%%%$$%%%%&&%%$$$$$$##########""""""""""""##""""!!!!!!        !!"#"""#%'/:GVcnx|wrjaSHHKNRVZ]`abdefedc`\UNF>966666666655555566665555443310000/..----..----///0//01011233545555555789<=AACCEGHHIIIJLLMNNNMLMLKHIJOWblsvusqrttwy{|zuolihfgglpy|‡“•––˜–’‰‚yz|~~~yqj]UURRNNLNIDGOPNJMPJD9----,,,---,--.3=PWPLCISQCAOmiw|zxwwxyyzxwtslg_YXZ`fknolnnorvy|}{ukaPD89@JVdq|ƒ‚€~~~}|yvvvxyxwslbVG90+)))))))),29AJS[bfghihhhgfb_YUMIDGJRX^_bejllmlkiilpuy|ƒ„††„„„‡‰ŒŽŽ‹‹‹‹ŒŒŒŠ…~rhcfjpuz{|}~€|wqh]N@6.+*6CTdt‡ŒŒŒ‹‹‹‹‹Š‰ˆ‡„wndVOOT[dlttsssrrrrsttssqpoonmhc_WNI<<::99888554544121/..../036:=AFJMMKHGEB??<<;87765411.,))))(''&&&%%%%&&%%&&%%%%%%%%$$##$$########""#####$""##$$""!!!!  !!          !$$##!!$&+2?M\ht~|vrkdYTRVX\`ccefffifda_XQKC<6687667777776656668976553333100000/-./....-/./-/01224455566866786688;>???ACDFFHHIIJJKKKLJKKKMLKJHFCDIS^iqtvtsssuwxy{zuqkfd`_behpw{…ŒŽ‘’–•••“Ž‡~yyxz{xsnha^[YVTMMJIJFCGKGCHPMLH/).-,,+-,----,06FXQQIQUGA=>Jky|{zwvuwzzwuurldZWWY^gmcF@Dcknquz~{uj_PC9=DO]hu}‚‚€~~~~~~~~}~{zwwvvwxxvrkaSF80,(('''(()-4;BKS\cfghhiiiifc`[XRLKLQV\_ceiiijihdddintx{‚ƒ„„„……‡ŠŽŽŒŒŽŽŒˆ…tkggmsvy{|}}}~~€xofXK?5-+.8FXjw„ŠŒŒŒ‹‹‹‹‹Š‰‡„~ulbWPNS^gmttssqqrrtttuuutspoolf`ZQIH<<;:98875554332210...../036:?DHLRRPNMKIHFDDC?@@><;9952-+*))'&&&&%$%%&&%%&&%%%%%%%%%%$$$$#########"#####%$$#$$$$"!!!!             #"##"!$&'.8FXepz}{wrle`^^]adffijiiigc_[TMF>999886677777777888:89976643301000000//0/0//00.144456668::<=>=>@@ABBDDFFFFHIJIIIKKKKLLLLKKKKLKLJHGCB@?CLYdqtvtssttwyyyxvpib\XWZ\`krx€‡Š‘••–”’Žˆ|yywvtnecaZYWVYWMKLJE><CGGGIPSS\L%-.,-,+,,-.--.4LMWf[ST@<7:Iizz{xvvuwyysrurjd\XZ[jhM=D@8]iejsyzxsh]L@;?GT`mw€„ƒ€~~}}}}}~}{ywvvvwxxvqjaSF81+(('''((*.4=FNW^eghghiiiifca^ZVPORW[^aeghhifb_^_cimtx{‚‚‚‚„†ˆŒŽŽŽŒŒŽŽŠ…|sjiiotz|{||}~€}wofXH=4--1;L\n}„ŠŒŒ‹‹‹‹‹Š‰‡„~th^RNPT]elrussrrsstttuuuutqpmhc[SMHJ;;:98777543332101/--.....26;?EILRSSRQOOMKLKJIIJIFDB@=951.*)('('&%%%%&&&&&&&&%&&&%%%%%$%%$##$$$######$%$%%%%%%%$#""!!         !!   !!!!$&(-5@Q`lv}|xtplkhhhkkkkkjjieb^YRKD?;9999777788988889;<>??>>:64221/110/21132134577;<<<?BBCGGIJLLMOOPRRTSRTTSSSSRRSSRTRPPONNLJKKIIIFCB>;:9=IUcotusssstwwyzwtpe\SPNPS\cmqy‚ˆ‘‘““’‘Œ†|xwwwpf]YVRQMNVQFGFC;;?CGHKMOMOQ]@#*,-,-,,,-,--0<<Wc`^S=:3AZp{~yxwwvvusjhppje`\\aZ\UE@7Jcaajswvvph[M@<BJWdoz‚‚€}}}}}}|~~|zxvtutvwwuqj`TG80+((''&'((06@IOZaeghhhhhjhhfb`\XVVVZ]`dfeedb_YXX\bhotxz~€€‚…‡ŠŽŽŽŽŽŽŽŠ…~wmklqty{|{z|~~€€|upeXI=4..5>N_o}‰‹ŒŒ‹‹‹‹‹Š‰‡†„{qf[QOQY`iqttqqqqrssttuwwutrolg`XNHEJ::8877775442220/..------/247=BGKQRRRSRPONMNPPPQROPLGDA=940+)('''&&&&&&&&&&&&%&&&%%%%%%%%%%#$$$$###$$%%'%%%%%%%$#""!!         !!!!!!  !!!"%').4>JZfq{€|ywtussqpooppoojgd^UNHA<;999988889989;;=BFIJMNKIC@853223333467:;=<?@DFFIKPPPRUWWY[Z]aaacdgffeehgeeeeeddba_]\[XTQNLJHGDB?<:855<DR^jtvtssstvwxwwtmcZMGAELU^iov~‡Œ‘‘“‘‘‘ƒ~zxvwxskc]XSMJMRQJFDDAACCGLOQNLNJ^iL*&--,-,,-,-/07>`k__K:96Maqy}ywwwuvwp_V_hiea\aS=EH?KX`YW[fryxuneXL?@EN\it|‚€€}}}}}}|~}|zyutrrsutqoh^RE80+((''&'),19CKS[cghhhhhhiihhfea][[[\_acec`]YWTRW^ekqtxz~‚…ˆŒŽŽŽŽŠ†€xpmntxz{|{|}~~~€€}wqgZK=4//3?Rcr€ˆ‹Œ‹Œ‹‹‹‹‹Š‰‡†zod[QNSY`jqssssrprstuuvwwwwspme^ULEDP888877766431111/.---,,,,,.059?CGLPQQQQQPPOQSTTVVSUSSPKGA<52-)('(''%%&&&&&(''%&&&%%&&&&%%%%%%%%&&$$%&&&&'&%%%$$$$##""      !!! !!"""$$&+/4;DQ`js|~|zzzxvxvvurtrrnid]UNF?;:;;::9999::::=AGPTY\_`^[UMA654549;=@CEFIMMOSVVZZ\^_bedghiknmorssttuvuvvwwvvtuttrpooligd_[VOKGD@=87434<GP]irttssstvxvyvtndVLA:>GR[enu~…Œ‘“‘‘Š…zxvuwvolf^XRVWTQKHDBACBDDILNTSLMJDl\9+---,/2///1@\rm_[C98>Xf]p|zxvvvuvo]]b^`[XZU[I^F@D]VMQblqurspgYKBBHS_lv~}}}}}}}~}{xvurqqrsrpmh]QE82+)((&'()-4<ENW^dhiihhiihjjigfc^\\]_`bcdc]URONPW_gmruy{~‚…ˆŒŽŽŽŽŽŽŽ‘Š‡‚zrqqvz|{zz{}~}€|xpfZL>5229DVgv‚ŠŒŒ‹Œ‹‹‹‹Š‰ˆ†xnbYQNS[bkqrrqqqqqrrtvwvvwwuqoe]TJEHU8887776534311/00.---,,,,++.269>BGHJJLLMLNPPRSSWYZXXXVSPLGB:4/+)(''&%&&&&&('''(((''&&''&&&&%%&&&&&&''&&'''&%%$$$$$$$"!     !!! !"""#%%(+/27>JWblu}~||||z|zzywwuusmg]UNE?=<;;<<;;;:9;;@EMV^eknprqoj`QC;:=@CHIMQTVXZ[]cdgikmnprrqttuwyzyx{|~}~~~~}|}}}|zzzywtpjf_XPJB=94348>FR^jsuussstwxwxxtmcP@228BNXaju}†Œ‘’‘‹…|xvvwxxuqjha^XSPPKGFFGEEDFHIOYSDBBJ`h6)+--,..11;OhhVWO999J`eS]{{yuuutoh^c_VWUPOLOb\]]EOR_gsmtp}uqdWJACJVcox€ƒ~}||}}}}}{{zyvrqqqqrrpmh]QD70,)(()'(+.6>IQX`fhiihhiihjjjihfa]]]_aa_]YTQMJLPW`hmrwz{~‚…‡‹ŽŽŽŽŽŽŽŽŽŒˆ…~uttx{{|zz{}~~~€€~yrh[MA833;GXhxƒŠŒŒ‹‹Š‹‹‹‹‹Šˆ†xnbWRRW_fkqrroopqqrrtvwzzyxwtpi`TKGJ\99976553331///....,+++,,+++./379=ABEGGHIKNNNPPUWXYZZWWVSQIC>84.+*'''&&&'((('((((''''''''')%%&'''()(''&''''%%$$$$%%$$"!      !!!!!!""!"$&(*,/26<BNWdmtx|{}}}}~~}}{{yxvsld[RIB?>>><<=<<;=>AGQV_isz}ƒ„ƒ{qcUHEHKOSX[_chhlmnqrstuwwy|z{{{|~~€‚ƒƒ‚ƒ„…„„„‚‚‚‚ƒ€}zuoibZQLF@<>ACIR^hquutsssvvxyyxy{{|^/-?IS^jt|…’’’ŽŠ…€|ywxvxyzxxricWVQRNMIKHFHEFGIMVLCADB?UK$*/,//1<`SKQP\SN9;;Q_jketzztswqeb^ZRPSQJJFDRSdaZJNOWbjih_WlbUICEOZhp{€~}|||||||{zywtponnqrqolg]PC70+)(((')+18BJT[bgiiihhiiijjiigd___^^_^YWPLIGGKQXbjpuvz|}ƒˆ‹ŽŽŽŽˆ…xuux{||z{}}}~€€~|xqh^QD;44>K]m|‡‹Œ‹ŠŠ‹‹‹ŠŠ‰‰ˆ†€xmaWTT[agmqsspopqrsrsuwz|{zwuohaULIPb8876544200////..--,+++++***++-/1488:==@CCEFHJJPSUWYZ[XYXXRMIB;62.+('''')))(())))((''''''')''''(())))('((''&%$$$$%%##"!      !!!!!!""!"%'(*+.25:@ENXdjqsuy{~}~~|{yyuld\TMFC>>=<<<=<?DIOX`kv€†ŠŽ‘‡}qfYSV\`dgloqstvwwy{{|}}~|}}}{{€€€€‚‚€‚‚‚‚„ƒƒƒ‚ƒ‚ƒ………‡†‡…ƒ‚|xtmf`YVRONNPV_irtttssstvvw‘œ ž£ z(3EP]gu‡”“‘‰†€|zywwxy{zvkiaQRXYRRNKIJJIJOQTQQA6DA<;WT,(121<OgoWb^YTM7<AS^dquwxwvtvrdYOR[SNMMJKQ_[ZZJS_^_\I[aQ^laVHGJR\hu}ƒ~|||||||||{zxuromnmpppnjf\OC70+)(((').4<GMU`fhhihhhiiijjihea]]]\\YVQLIEBBFLSZbjpuvz|}‚„ˆ‹ŽŽ‘‘ˆ„|yyz{||z{}}}~€€~|zsh_RF=66?O`p~†‹ŒŠŠŠ‹‹‹ŠŠ‰‰ˆ†wl`VUV^djprsspopqqrtuuwzz{zxvrle[QNZi7765333110//..----+++*))**))**(+--/1325:;<@ADEHLORTVXYYYZXVRNGA;51.,)(****)())(()(((((''(())))))**+)))'((('&&&%%&&$$#"""   !!""""$%%&()-.046;@HOW_fimpsw{{}€€€~}~}{upicZSMGB?@>=>?BHOX`kt~‰”—••”†|reacgkptuwz|}}||}}€€~~}}}}{z{{{{}~€‚€‚‚€€‚ƒ„†‡‡„†‡…„€|zvsolgd_\\_fksuvuqsrstwƒš£¡¢¥«®¨h,>OZiu€Š‘•“‘ŽŒˆ„€|{ywwxzzzwnkcODT`XYQLMKLQRUUPJBOFE<=:BcXJVF0^ysrnW>QUQ:;JY_VivrpvxvvriURW]THJJJLRTMT[L[UV\U@`g^_nbRGHKValv~€~|{{yy{{{{|{zwsponllooonje[OA80+*)((().6>HQXbgijiiiiiijligida^ZYWXUOHEA=>CIPW]fkqtxz}~~‚…‡ŒŽ‘Ž‘‘‘‘‹‰…|}||{{{{||~~€}{{rh^SG=89BSds€ˆ‹‹ŠŠ‹‹‹‹‹‹ŠŠ‰‡}vj_VRW_enrutspopqrqvuvx{}~~|zwqjcYXbr7766433110//..----+++*))**))))'*))),+-.10258<=@CEIMQUVWX[Z[YXSLD?:61.-,+++*)++)))))))((((())****))****()(('&&&%%&&$$$#"""  !!""""$%%&'+-.0469<@HNUZ`ddhnpsxz||~}€‚€€|ztnha[UMGEC@@DINV`hp|†”—˜––—‘Šwmknrsuw|~~~~~}}}}}}||||||zzz{{{}~~‚‚‚‚‚‚‚‚€€‚ƒƒ„†„…†‡‡‡„ƒ}zwwtpnmrtwwwspnnx„—¡ŸŸ¡¨¬°±®’48IZiu‚Œ’•“‘ŽŒˆ„‚~|yxxxzz{{yrbNCPSS^XQQIMUVWQN><MJC::;:Dc^Rlc\pifƒZ<P[T==@FLBXŽ”{oxxzxrbVcbRIMKJJMRT^][VSJD[hgd^`s\QKJKXcny~€}|{{yy{{{{|zyurommllooonje[O@70+*)(()+18BKT\dhijihiihhhigeb`[XXXSNIDB>:;?DLSZagmsvy{}~~~~‚…ˆŽ‘‘‘ŽŒˆ†€}}}}{{{{||}}€}|zwri_UJ@:;EWfv‰‹‹ŠŠ‹‹‹‹‹‹ŠŠ‰…ui^VR[bhosttspopqqsvuwz{}~€~yunh`bmy775543120/..--,,,,++++***)))'''())))**))*-..0359:?CGMSVY[]__]ZVPJC?:631,,,+**++,+++++****)+,*,,,++**++))**('&&&'''%%$$##"!     !!!!""#%$%((,/0479:>@DJPQTW\cginqvx{~€ƒƒ}zvohaXVQKFGKRXagpz„Š“—————’Œxssvwyzz{}}~}~}{||{{||zzzzzxyzzz}}~~‚‚‚‚‚‚€‚€€€‚‚‚ƒ‚ƒ…„„„††…‡‡„‚‚€€}}}}~|xsv…—¢ŸŸš¦«®¯®«šA5GYft‚”•”‘Ž‰†ƒ||zwxwz{|{si`SSR\hbWTLNWXTRK85IC=;:7:>Thf^D,`UUoVRQZI<>KUH;V}zZTabfd_]ZasiGGJJILLTXXPMINQdc`SR_cnmNIP^hs{€~|{zzyz{{{{{ywsqnllklooomjd[PB70+*)*))/4<EMW_eikkhgghggfddb`[YWRPKFC=876<BHPU[`hotwz{}~}}~‚…‰ŽŽŽ‘‘‘Ž‰†‚}}|{{z{|}~~~}}zyvpi`UMB;=J[jy…ŠŒŒ‹‹‹‹‹‹‹‹‹Š‰„~tg]WY]flstutsonpqpsvuwz|‚‚}ytnjnv€55443211..--,,++++****)))(((((('''''(()))())*,.1258>CHOUW\^`^^\ZUOID@=731/-++,+,,,,,++++++,,,---,,,,,,+***)'''''''%%$$##"!     !!!!"""#$%((*,/257:>BDDDEHLSY^bfimovyz€‚…‰‡„‚|yvpid`ZVUWZahny‰‹“––””“‡ywwxxywz{{z{{yxyyyxxuuttrrrstuvvwwzz}}}~~~~||~~€‚‚€€‚ƒ†‡ˆˆˆ‰ˆ†……………‡…ƒ€“ž ›ž¡¦ªª¨¦¥ž–T1HXguƒŒ’•”‘Œ‹ˆƒ||xyyz|~}|xrd_VWadb[RPSPRVPK7.38;;88>CLbqkDVvkYTZm_P@>?QJA@B:9<=<<<==GOQe\BEJKKKHOPUSPQRVWP=MOTTabWJVakv~~zzzzy{{{{{{ywspmllkloopnjd[MA60++*)+,27AJRYagjkkjigfffdbb^ZVSOLGB=77337<BHPW^ekouy|}}~}}~‚…‰ŽŽŽ‘‘‘Ž‰†ƒ}|{{z{}~~~~}|zxuohaYPE?AL]l{†‹ŒŒ‹‹‹‹‹‹‹‹Š‹‰„~tg^YYahovvtsponpqqrvuwz{~‚„…„}yutx‡5554200/.--,-,++**(((())''''((('''((''(''())****,./5:AFNUX\^`a_^[XROJEA<;80--++----,++,,,,-...----..,,+*)))(''''''%%$$$$"!       !!""###$$%'')+.1369=>>??@DGLQW\`cgimpuz~†‡†‡„€}yuroieddfkpx‚ˆŠ‹Ž””“‘‹…}xtuwuvvuuvuuwtrromkjjhgggeffdfiklmpqrstuuuutuuttuvvwxy|}~‚‚€……†ˆ‡‡‰‰‰‰ŠŠŒ‹Œ‹‰“Ÿ›™› £¤¤¢œš–”‘s3DXguƒ””““ŽŒˆƒ}yzyyyz|}}wsic][ddecXXXYVVSC62/7=<:7>KSxx]HPhpjgXUQQ@A?<7>BDFGGFEGFFMTF?BBCMPNKKJIIOVWYSEEO68FUUGCXMXdmx€}zyyyy{z{{{zxvsomkkklmonlhbYK?40,+,,.18@GNU\djljjhhhgffc_^ZUQLHB>:4/136:@DJQY`hmswz}~~~|~‚‡‰Ž‘‘‘‹ˆ„~}{{z{}}~~}}zyvrngbZPGBEPao}†‹‹‹ŠŠ‹‹‹‹‹‹‹Šˆ…}rh_Z[ckswwvspmnqqqrtvwwy~ƒ‡ˆ‡…‚||ˆ334211//.,,++,++**((((((''''((''''''&&''')))******,.19?DLOVZ]_aa_ZXXUQKGB>730..-...-,,----..........---,+++*''''''&&%%$$#"               !!""###$$%'')*-0377;<<<<?CGKPVY]]`dfjmrw{€„ˆˆˆ‡…}}xusqprt|‚ˆ‰ŠŽ““’Š‚zurqsrqrqoollgeeeaa^]YXWUUVWWWZ\`abdhhiijjjjihhjjihiknortwz|~€‚„„„ƒƒ„…†‡ˆˆŠ‹ŒŽŽŽ—š˜”˜ž¢¡œ”ˆ€|’‚AFXguƒŒ’”“ŽŽŒŠ‡ƒ~|||zz{z}}{v_a^V_^ddZWV^_QWC9329;;978@HE5=IKCAloiUG>:CA=GDB=<;;88599@TNF@?EJJLKIFHNYb[UMFJUWNEKJEWNU\eqz€~{yyyyxyz{{{zxtqmmkkklopnlhbXJ?4///0259=DJSZ`gkkjjigfffea_ZVRKDA;60.,/25<AFMT\cinswz}~€€€„ˆŒ‘‘‘‹†…ƒ€}|zzz{}}~~}}zywtohd\SJEHRcr‡‹‹ŠŠ‹‹‹‹‹Œ‹ŠŠ…}re]\ahmuxwuspoppprqrtuvy~ƒ‡‰‰ˆ…‚ƒˆŒŽ220000..,++*))****(('''''''''(((((''''&'))))********-06:@GNSZ\\[^_]\[XVSMIC931...0.//..//////////.//---,+++*))((((&&&&%%$#!!!!     !!!   !!"#$$$%%%&()*+./369<===AEGLPTVXXYX[_chouz…ŠŒŠˆ†ƒ€}|zy{}„‰‰‹‹ŒŽ‘‘‘‘‘Ž‡~sqpmmjjhdc`\[ZXTRPOMJHHGECDHHIKMRRVXZ[^```]^\[]\^_\[[]]aejnrux{~‚‚„………††††‡‰‹‡}„•—•“–œ¡¢™‰|y{pxŒŒ‹‰\LXhv„Œ‘“’‹‰‡ƒ}qbozzy|€}‚~i[WXZ^dhYHJNK=KG7C::;95669;D;7?GAMSSvdP?<CCJH?F8Jr}wsnVT=MjPJCFJHGEFCDGOXVONKFDGGEWIQYSS_lt{}}zyxyyzzy{{zyvtqnjjkllnqomgaUH@64579<@EHLRV^dillkkhfgddba\WRLE<72-))*.27<CHOX_gjpuwz}~€€‚‡‹Ž‘‘‘ŒŠ‡„‚€}{||z|~~~~~}zywsoid]VMHKVfuƒˆŒ‹‹ŒŒ‹ŠŠŠ‹‹ˆ…|sf^]cirwxwuqpqqppqrrrrsv|‚†‰ŠŠˆ‡‡ˆ‹Ž110011/,*)**(())))((''''''''''''&&''''&'))))))********-28?EJNSWYZ]_`a``_YSLD:200.//00///000000000/00...-,,,+))''((&&&&%%$#!!!!     !! !!"####$%$$$%%%&(+,+.057;<=@@EIJMOSTTUTUUW[^fmu}‚‡Œ‹Šˆ„„…‚~„ˆŠŠ‹ŒŒ‘‘‘Ž‡zrkhfdb][XUSPKHFB?>=;8776789>ACEHKLPSUWYWWVUVTSRQQPPOOOOQTX[aejovz}„……„„…………‡pŒ”™›—‹}~~|n|ŠŒ‹sLYgv„‹“‘‹‰‡…‚iamcz…‡ˆ‚wjb\VTa\FCHQRHRb]L::;6565649E@6Xh_UNTYOF;?<@AEI=4c{nWdjMKLHJIKMJFCBBAAHLMMKE=?@@KPEWX\_blu|}}zxwwxyyzzzyxzzrkkhgkklookf`UJ@::;?BDHNRVY]bgkmmiihhffd`]XSNH>5/,)))*.27<CHOY`eksuwz~€ƒ‡‹Ž‘‘‘Ž‹ˆ†„‚€}|||}~~~~~}{xvrmie_XOLNXhv„ŠŒŒŒ‹‹ŒŒ‹Š‹‹‹‹ˆ„{qg`agouzzwurqqqppqrrrrrty~„ˆŠŠ‰‹‹‹211/00/++++*)(((((''''''&&&&&%&&%&''''(())(())******))+,.4:@EINSXY^`abbde^ULA610/.000001221123311111////..-,++*)))(('&&&%$""!!     !!!  !#&()('&%#$%%'$&)*+,/259<?BEGIKNMPRUUWWVWWX_cjoz‚‡ŒŠ‡……†††…„„…ˆ‰ŠŠŒŒŒ‘’‘‡|qf^]ZURNIC?=:9521223022259=?BFHJMPSUUWWWWVVWSPONKHD?>::>BEJQSY_dipw}€ƒ‡†…ƒ‚ƒ„‡ŠŽ‹Ž—œœ”ŒŠ„wsƒ{r|{{‚ZZguƒ‰’Ž‹Šˆ„†‹wpqro‹””‘Œxkoh]Xfc][FGOZcmf;MG:78678659BDEZ`TOHIJ@@=?BNZcH<2Wzm]MPXRNJMNJGFLMFAA;;?DGIIFIJLJOO?XXRbhox~~}|ywvvwwvyxzwvohoz‚~sljorjig\SLHCEGJORTWY[`fhjklkkjhgfda_[VQJA8/+(()((,38;BLSZagmrwz{€€€„†Š‘ŽŽ‹ˆ…ƒ}}{}}~~~~}|{xuqmjfaYSMQ\lz„‹ŒŠ‹‹‹‹Œ‹‹Œ‹Šˆ|rfcgisy{zvvsspooopqrronquz…ˆŠŠŒŒ‘‘1//.--+*+***((''''&&&&&&%&&&&%&&%&''''(())**++********+,,,059?EIMSY^bdfiif^TH<3101/0111122110222111100//..-,++*)))(('&&&%$""!!     !!  "$',/00/-+'&%$&&'(*+/359=@CFIKOPPQRRTVXZ\]]^aejrx€†ŒŽŒ‡……†ˆˆˆ‡‡‡‡ˆŠŠŠŠ‹‘”““‰|l\QNLF?;9531./0....-/2336<>BEHKMPRTWWWWXXWVTSRNJFD>:41/..28=BIOU[`gnvz~}€zvy‚Š‘™›™•‘ŽŽŽ‰{nsmly€Ž›–v~v€Ž‚zƒ‹‘“tp}px’”‚cagjcU\[\PPOIZdX9MK=8878;76=?GcTN7<68=FDAACKW]CF<a\be[@?JDNZVPHFFHC=>;8=AGIIJLLNOQXZXYXZepy}}|{xwuvtyxssvpfJL[p†™`X\SGK[^YQLHJLQVXZ[^cfkmnmnljihgecb`\TMG=4-*(()((,27=ELS[ahntxy|€€€„†Š‘ŽŽ‹ˆ…ƒ|{zz}}~~~~}}{xsolifa[URU_m}‡‹ŽŽ‹‹‹‹Œ‹‹Œ‹Šˆ{sifimtz{zwussrpoopqppnkmqv{†ˆŠŒŽ‘‘‘0/..--+)*)(()('&&&&&%%%%&&&&&&%%&&''(())))))********++,,---.06<AFLQX^dglmke[NB711222122233333222222210/.------+***(('&&&%$$"!      ! ! "&+/4<>>>960,)(')))*.169=BFGJLOPRTTTTVZ\`deeefiqu{€…Œ‰‡…†‰Š‰‰ˆˆ‡ˆ‡†ˆˆŠŒ’“’ŒˆzhREA=9731000../----..048<?BFIJLORRVXXZZZZXXWSSMKFB;60---++,017;AHRY`fmpvuŒ’“•šŸ™„m‘‰’’‘’ƒ¡´¼½¾¾¾»°ž‘}y‡qt‚‡ˆzY{ƒkz‹‚mcuxwj\fjkheb`RTUKEOb\+(=><;9;@E<98:FC@G?:987L@ACEJUSFI_]SZeRRX9BhrhUIFDABB?:7;@CGHIKMPRRUX[[X`foz~}|zwvwuuyt_`whbkrnna`JGFINNEYb\UPPQVY[]`deimopomkijhhgee`]ZTLD;1*)))())-49?FNU\cjpuw{}~€€€„ˆ’Ž‹‹‹ˆ…ƒ€~{yyz}}}~~~}{yvspliea\WUXbp~ˆŒ‹Š‹‹‹‹‹‹ŒŒŒ‹‡€{slkmrw{|zxtssoonnpqqnkhhlpv~„ˆˆ‘’/...-+*)()('((&&&&%%%%%%%%%%%%%%%&''(())))))********++,,,,,-,.29>CKQY`hmrqkcUH:32222223344444333333321/.....--+***(('&&&%$"!!        "%*/39@GKKKGC>70+)*,-/157=AFJLOORTUVVXX\`ehlmnnnprx}†‹ŒŒˆ†…†ˆ‰ŠŠŠ‰‡‡†„††ˆ‹Ž‘”Œ‡{iQD<77353//....----0036:>BDHJNQQRVWXYYZZZXWUURNJF@951-,,,++,,-05;DLT[beuŽ”—’”•™žŸ˜ykomŽ’‘’’’¡¶»¹»½½½¼»»´–‡ƒˆvpihjk_]`vwy{kUVrƒnUZjmjll`]TQTNJSvu<413;<<:@KG847?FDLE;<9;J<ACEIUKH=MieZVJVO;nnniXLE@>=>A<8:<@CDGIJKLNQV[[X]gqu|}xxtsvvmUsmld]^inf^CDNPQJDH]le`ZUTWZ\^adfiloqqomkijhhgee`[XQJB90)()))*,08;AIOW^ejpvx{}€€‚…ŠŒ’ŽŽŒŒ‹‹‰†ƒ}{yz{{{|}}}zyvsqnjgd`\WW]esŠ‹‹‹‹‹‹‹‹ŒŒŒ‹‡€{spnquy}}{wsssponnnnnkihijmqz€…ˆ‘’--,,++('('''&&&%%%%%%%%%%%%%&&&&&&''(())))**********,+,,--..--.27:?JR]hmqsodXK=42222123444443333443212311/00..,,++))('''&%%#"!!!   !"#$(/5=GMRVY[VRJC<60./0449=CFJLORRUUWZZ[\`bfmrtsqqsuy~‚…Š‹‰†……†‰‹‹‹Š‡…„ƒ‚†‰Œ’’Ž‹€o]RLD<84541--//---.2268>BEIJLOPSSVWYYZ[ZZYWUTPLHB=61.++,,,,,,-148?INTYm‘™––ŒŽš”‘}]5c…„‰‘””Ÿ¸¾¼»¿¿¾½¼¾¶³º¤„ˆ†‰|_Rgcspgwz{zlW\dXL[cfb]agWHGNMLZmhJ:9ID><8DA9673EYSA39<<IMBDECJVED9Mwpk2B@Auyng`RNF??=>><;:>BDCDFGFHJPSWY[]gqwxzyvtslrnmorfG6@daHKKLLHFL\kpkhc]YWYZ_achikopqpnljhhhgfdc`ZWOG?5-)'''+,04:ADKRZ^emrvy{}~ƒ†‰Œ‘ŽŽŽŒŒ‹‰‡…‚€~|zyxy{{{|}}yvsplihfc`\[Y^gu‰Œ‹‹‹‹‹‹‹ŒŒ‹Š‡{uqruy{~}zxtsrppoooopmjgfflpw}‚ˆŒ‘’--,,+)''''&&&%$$$$$$$$$$$$$$%%&&&&''(())))********,,,,----../1/.24;DLXbjsvqiYL=53323234444556666444323331/000.--,,))))('&%%#"!!!   !"$(-5>HRW^degfaYQGA;5457:?CGJLNQTVYYZ[[\`ejnrvvvttvyy~‚†ˆˆˆ„„…†‡‰ŠŠ‡…~zyyzƒŠ’‘…ylc\WPID:71./..---0168:@DHIMNOPSSVWYY[[ZZXXURPJE?94/-,,+,+,-.036<BHNTT…ž™š~kyn]pxŠ•˜•Š{\]„•¶½¾½¼½¾¿¾¹¦ls³¸°†˜¡wIZhuz|{{{scRWbOQQ_QAAKX^QNLIOLQX>8FEA<5COQ987<I`JLPNUOCDBRLJTBF<VxkD><<qywqefXHFFDB@=:9;=@CDFGHIJMQRVXWWhuxw{yyvsn`dmjoji_Y_OJKKHDSeklnnmkfa\Z]^bbeglmmooomkjhhhfecb^YUME=4,)'''+/38;BELTZ`hmrvy{}~€€‚…Š‘ŽŽŽŒŒ‹‰‡…‚€~|zyxy{{{{yywtrojggec`\[Zakv‰ŒŒŒ‹‹‹‹‹‹‹‹‹Š‡{uqtw{}}zvusrppoooopmjgffinu{…Œ‘Œ,,,+*(''&&&%%%$$$$$$$$$$$$$$$$$$&&''(())))******++--------..1311238>GT`jstqj[M<54433245544666644555434331/011/.---*)**))'&$"""""  !#&+3;GPXahnoqqlg]TLF?<:=ADHJKPQSVX\[\\\`chnruvvvuvvx{~‚„‡‡†„„†„„…„‚‚~yvvslou|‡Œ’’ŽŠwqmia[VOH?93/-.-/038=@BFIJLNPQSTVWYZ[[ZXVUTRMIB<72/-,----./028=@FKOTqœœ ¤“rYghu€w”Œ‰Švvo»¾¾¾²°¼¾¿½¸“v§º¯…˜ƒQ<H^ov~xtwzoTAsgZY\^H=?;<MaPMNMKBKOD@@A=8BID89689>6OVO@KCFC^YLQAE:nyM0=Bprwxteh^JGGDC@:78:<>ACEFHHJPUUUXQXmvzxxsHZspgZafeqo_TLJNNLOflkllmnnkhd_\]]_`ccgiikmkkjjhgfedc`]XRKC:1,)'&(,04;>BGMV^bhptwz|}~~~}~ƒ†Š‘ŽŽŽŽ‹‹Šˆ‡…}{ywxy{{{zyxurnjgefdc`^\\dnyƒŠŒ‹‹‹‹‹‹‹‹‹‹‹Š‡{usuy|}~}ywttsppoopoolifceintx~„Œ‘‹++**)'''$%%%$$$#########$$$$$$$$&&''(())))****++,,-------...1311238>GT`jrusiZJ=4343335665566665555543433211010.---,++*))'&%###""!#(-5@IT^fouyzxrlf_UQMGEGJIJNOPTUX[^]___aeknotvvusstuy|€‚„…„††ƒ€~~~{wsplgc^agq‡Ž’‘Œˆ~xxuqnkd^VL@91./158<?BDHJKMNQRSTVWXYZZXVUTRNID?93/.---,,-.148:?DHKP_–œœ¡¢£š‡{‰ŽŽxm`yu{ah|£¹¾½ºž™¬·½½½¬‰“°¥‡|˜ŠiOTOnzoY^dlmlej€e]XTL?:9>EITRMKKKTMKEAB?><CE?=;:;A:;KLIA@EFJWXPJCB>zV12?b_fvvsk^YQFFFCB>;98;=>BDGHKLOW][YYdmvywuq;Qsd>[okvwNCSOJEQbihgjjlnoomgc_\\\\^\\^adfhjjjiggfecb`\WPIA80+('(+.38<?AGNV]dkptwz|}~~~}~‚…‹‘ŽŽŽŽŒŒŠˆ„‚|zxwxy{{zyxwrolhfdecc``^_hp{…ŠŒ‹‹‹‹‹‹‹‹‹‹‹Š‡|vtu{|~}{yutsrppooponkgfceinpw~„Œ‘ŒŠ)'))'&%%%%%%$$##""""########$$$$&&&'(()))))*++,,++----......141/238>GU_jtyrh[H;33356556666666666666655554432110.,.-,+*+*'&%$##"!!!!#%*18BMW`hry}{ysoic^ZWTSNNPTSSRTWY[_``aacfikorrtsrrrtvy}~‚„„ƒ~{xtplgc_XQORYeq|†ŽŽ‰€|}||yxtnibYNB;65:=@@DGJLLMNOPRTVWXZXVWSROMID>:630..//..1358<?CEKRR{šš¢žš‹ij¥˜ˆ…„hZT^f|Ÿ¶«»¼±›¥¯¤ ²£†}• ˜†Ÿ’}^^tq_YLKShi]iniq^XR::;=?8JPOFLFESKEDHJLSB8<?;:;=PMSHGPLAD@a]RQAD@Jh27;MZ]gtupj_UNJFBCCB><<>@BEFIJOPRU[^Y\bnvxwttqusdQdovmK?GKJGWljihiklknnmjhb^\ZZWTRSUY\_fhjjiggfeca^\WNG?5.(&&*,059<@DHOV_fmquz|{|}}||~ƒ†‹‘ŽŽŒŒŽŽŒŠ‡…ƒ{yyxxyyyxxvspmhebcecda`aelt€‰ŒŒ‹ŠŠ‹‹‹‹‹‹ŠŠ‰‡…‚{vwxz}‚{yvsrqoooopolkgebdglpv}…Š‘‹‰*)(('&%%%%%%$#!!"""""####"""##$$&&&''()))*)*++,,++----....../321238>FS^itxsh[J;54456556666666666666655554432110110-++**('&&%$$"!!!##$'*19CMWbjrvyxvpqlhed^\[YWZ\ZZY[\_aeffffhijlpqrsrrqqqty}€€~}yvrmhd_[YTGABDMYgv„Ž‹„}{}~~}zvskdYNC??@CDFIKLLMNOPQTVWYXURSNMMID?:842/////1258:>@CFHJN^•ššžŸ—ŒwW\‰¤§–„tbYadIZ¾®†²µ©®nq‹¡š}e™Š™‹gagf]cdYTWf\Teiic\bR;<>D=<FRNJRQCINOQMNRZE<>E=8;:H[fLKPCCBG`RUXAF=W=>CGPXKNqupg_WNJCACC@=<>@ACFMLNVYWZZ[]`hrxyvupoqpnnryfJBJJCAJbefhhhhklmlkie_[YXTOMJLKPY_cgijigfedba]ZUNG>4+'&(+.059>@EKRXbgnswz|{|}}||~€„‡Œ‘ŽŽŒŒŽŽŒŠ‡„‚€~{yxwwxxxyyvspjfb`adddaabgoxƒ‰Œ‹‹‹‹‹‹‹‹‹‹ŠŠ‰‡…€xvuw{~zwusrqoooopolkfcbdfkpv}…Œ‘‹‰)(''%$$$##""""!!""""""##"!!!!"$$&&&''()))*++++,,----....----/133128>HT^juxrh]L=56665576666666666666666665444221000/.,+*)'&'&%$#"""""#&+2:CMW`gnopoomljjjhgcb`^^__a_cefhlkjiijjlnqtsrqonpqvz~€|zxvqke_[WRNJG@>@BFP`qŒŽ‰zuy{~€~}yuoeYPIHGGGJJJJLNNNQSUVVSQNMJIGD@:6440012357:<>@BEGIJPS„ž˜œŸ˜’vYQx–˜~wf‡_( }½»©„}—¬®w[e˜‰>Z“ ˜zUY\]twm_\]ZSVmhghVHE9=MSF@>Td\`u[FLNNGCUA=@=CA779DWS?5CBDC;@O\O>D?;9@JMUSLYjnqjZOMHB@BB?<:=AACFSUS]bba`_^bjsxxwsprpkHTxvFFMNFLgjfdfeegijkkklf`\VUQOGC@CDNV]dhiihgfcdca]ZUME<3,(')+/25:?AFLR[dipux{{||||{}}„ˆŽŽ‹‹ŒŒŽŽŒŠ‡ƒ€~}{ywxwxxxwvtqlhc_^^cdcbaejqy‚ŠŒŒ‹‹‹‹‹‹ŒŒ‹Š‰†ƒxsuw{}}|xutrrqnnooqpljgcbeglsx†Œ‘Œ‹‰(&&&%$$$""""""!!"""""""""!!!!"$$&&&''())**++++,,--......----.022128>DO[epvtkaP@77765556666666666666666665444223200/.,+*)'&'&%$#"""""#&+2;AKU\ceddcacfijjjhgecdceffhklmopnmmmnnnqstsrrppqvz|zzzwupkf]WQJHDDA@>>=>BJZl}‰Œ‹†|rgkqv{~‚‚ƒ€}{tle[SNKIIIJJMMNNPRSROKKIFFDC@;863322579;<>ACDFJLMQQdŸœ œ‘ƒ‚…cQf„ƒ†ƒƒŸ›Z*#x¼»´¥‚]|œ›ˆbVkŽ{lp–¤fC\_cz’’vmdb\haV\X=9?DKWYD9BBc\WbYKFC@:LT38>IJ<435>FJHDAG@E7@GT=@<=:H]X[]?EOM^^_ZO??@ABBB@=>AACFTYW_cecbabgltxwtsl`\rlf_TMCL[dsmhedcbcehjkkkhc]YROJC:76<DMV]fhiihffccb`\XSKB80,(')+/25:?BGLR]flrux{{||{{{}}„ˆŽŽ‹‹ŒŒŽŽŒ‰†ƒ€|zxvvvwxxvttoke`^]]`cbbcfms{„Š‹‹‹‹‹‹‹‹‹‹‹Š‰†‚~xsuw{}}|xurqqpnnoopoljfdeeiorz‚‰’Œ‹‰&%&&$$$$$#!!  !!!!!!!!""""##"!$$''&''()*++,,------....--....0/01016<DLXfnstmbSH=6566557786666666666677775544442111//-,+*(''&%%#"""!"%&+29AHPU[\XTRV\afjlkiggfhhhlllnprrrpoopprttwxtrrsrsxyyvvsoje_YRLD@?@@?===;=AHVgy‡Š‡ƒwhXZaipw{€ƒ‚‚„‚€{uof\UQNJIJLLNNOPPNHFDBEDBA>;7557879<>?BDFHKLMOPQTƒ£Ÿ¢Ÿ™‰pˆ‹uPW|{vs{ —@*#hº¹¶²¦…`dvƒƒi`}‡}pc„‹ODfrŽˆ’Š}|cacSRX\R3>KS^kF/05MSMQJIFDDDW;88=@732548DD;>?BAS@AF@=BJRHVgQQW@F@0OOMP@;?DFHB?>?@BBDHQYZ_fgddefinuyxuqpc]jgJHSNMYesnieccbcceeiihgd_ZRLG@9215:CLV]dfhhfeedca^[XQIB7/*('),046<BCHOW_hmrwyz|||{{{{}…ŠŽŒŽ‹‹ŽŽŒ‹‡„€~}|ywvwvwwwvurmic]Y\[_accdhpx~ˆŒ‹Š‹‹‹‹‹‹ŠŠŠŠ‡„€ytrsw{||{xurppnnnnonmljhgefinq}†Œ‹Š&%$$###!! !!  !!  !!!!!!!!""##$$''''())*++,,------....--....///0004:@KWbjqrofYND<786555555665555555566665554443111/,,+*)(''&%%$#""!"#%(06>CKQSSOJIOTZaeghghhgijjmnpqqqrrqqquuw{{{zwttuvvwutrolga[SKD@>>?>=><<;<=AGRcx†Š‡‚ucOJOXbkrz…†‡…ƒ€yvod[SOKKLLMMMMHFCA@ABCBA=;<:9;>AABCDFHJLNOSUQScš¡ž—‘qY~‡t^Md}{vqu‚2**Mµ´±°«ˆrijmohu|mdtvb>>Xƒ¡™–•Œuf[UKMX_^GKBFZUD329>5:NIIC>;FS:589<F;2228@NF=?7NYQYK9BCQAHVUORN7@20IKY@6:>CFIFA??AACGHU\YZchceagmr{wsj^gg^^RGF::KS_rmiecbadddhgggf`]UMD=5-,.3<FNX_dfgfeeca``^[TOH?7/*('),069;?CHOYaiouwyz|||{{{{~…ŠŽŒŒŒ‹‹Œ‰…‚}}zywuvwxwwutqlfa[XWZ_abcflqy‚ŠŒŠ‹‹‹‹‹‹ŠŠŠŠ‡„~vqpruxz|ywtrppnnnnnmkjjhgeehmq}†‹Š‰&$$$###!   !         !!!"$$%%''())))*++,,--......-.////....//0027<FQ\fkppibWMC<97556345555555444455466653323311/-++*(((''%%$$"""##%).3:>DHKKHGFIOV[^`adcegijjkmopqqsrstvwxz{{||ywvvtrppolie^VLD?@?=>====;;;;<?FPas‚‰‡‚wdM;@ENYcmx„ˆ‡ˆ‡…~yuk_VPMLMLMLFC?;::=ACCCCCCCDDCDDDGJKLNOQOQRUUp£¡œ™”ƒJLnƒlPOqxwwp‚p3105£®§¨¤Š€xj`TYWfjcmlhS8?Tƒ¥ “—’’”tI<^ob[TNLFCCKRD3@D9::8>G43BKK?3A>?713059DC><Pe`i_;=<ANQIEOHMM;<F=C@?817?A@@AA@@AAHIJMMLR`hgfZ_pedcTKDEJEOOJ@BNCIdumgdabddcefhhfc^XPF<3+))/5>IQY`eggeddcb`_\XUPG>4-)((*,058:=BIRZbjpvvxy{{|{zz{}†‰ŒŒ‹‹Œ‹‹ŒŒŒ‹ˆ„}|zwutuvvvutroje_ZUWY]`adhptz„ŽŒŒŒŒŒŒŠŠ‹‹Š‰‡ƒ}tppptvxzxurqqonnnmmnlkkiifghms~‡ŽŒ‹‰‰$!##"!          !"!"$$%%''())))*++,,--......-.////....////029AKW`ekpnh`ULF>;:86644445555444455466665323321/-,,+*((((&%%$"""##%&+039>@CBBCGINSWYX[\\]_aadgikmpqtstuxyy|||||yzxuqnlifc_XPGB?>>==><=<<::9:;=CM^p€ˆ‰†|jS715=HO^ju}„‡†‡‡…‚~{vpi[SOMLKHB?;;;>AEFGGIIJJJJJJJJLMNOQRRRRSWVv£ž›•Œn:Ic‰ˆxXNYrxzx„`854.z¤Ÿ¢¤–‰~mdXNB?D]jhcJ<EQ~Ÿž˜™¢Ÿ”cCN|}vmd`SJPYXZPG<:FG:;=EA?ADUPBA705=6,036:?UbYVN<;=D^XHDFHQ]WLJMKM@>@;<?>:;>@A@>??CFGHITahk\FNN`kZOT]T4/@HCAFGGTrrlheddeccdeihe`[UK@5-())/6>IQ[bfhgedcbba_\XTOE=3-)((*,058:=AJS[bjpvvxy{{|{zz{~†‰ŒŒŒ‹‹‰‰Š‹ŒŒŒ‹ˆ„~|{yxvtuvvxwvtnic\XTTX\`aejqx~ˆŽŒŒŒ‹‹‹‹‹‹Š‰…€yollnpvwzxurqonnnnmmmmmkjjjhjov€ŠŽŽŒŠ‰‰"!!!  !  !!!"!""#%%''())))*++,,--..//......00......,//15;DNYchopkd^UNGC@=:85331444444445566666544332//-,++)()''&&&$$##""$&'-15;:<;=?CEJOQTSSQQRTY]`adgjmprruwy{}€€€~{xtqmid`_YRLE><<<<<<<;::999999;>IYm~ˆŠ†€q\>*+/7?KVdnv}ƒ†‡‡…„‚yri]SLKGDB=<;>CGHJMNNPRSTSPOOOOOPQRSRSUVVV|£ž˜‹j6Ua{Œ}dRLfu}‚‰V9788I”˜ž£”…}wl`ULFI\c\ZGAFJr™•’”žžzZs‰yli\ZV]lqyvjb[TUVUU\hPC?;FNI;019G7--/48Kf`URP=>CJA=>JMFDMNI>ALVVVSWF:=A=:>AACEGEAMRQ^SOY\IERZZdY[TC:>9EG<0<Rpwrooihncjhbbfeea[SH<1(('*/6?JS[cefgfdbaa`_^YRMD;2,**)+-1578<@IS\dlqvvxzz{{{zyz€‚‡‹ŒŒ‹‹‰‰‰‰ŠŠ‹‹‹‹Š‡ƒ€}{xxvuvvvvuusqmh_ZVRSW[_bgmu{‰ŽŒŒŒŒ‹‹‹‹‹ŒŠˆƒ}tniilpuwyvurqonmmmlnnnmmlkkiioxƒŒŽŽŽŒ‰ŠŠ"!!!    !!"!"##%%'(())))*++,,-...///.....//......,-..15=HQ[dhmmhd\XQLGE?<96334444444455666654443311/-,++))(''&&&%$###!"%$(-243578:>CHLMMKKLLMOQW[adgjmprrxyz|„‚~{xsokf^ZWSMF?::;;;;;;::99887777:=DRey…‰†‚yhL0*),09CMZfqy~‚„„„‚€vmbUKFA@CCCEHKNQTUUUVWXWUTSSQQRPTSQUTUTZ‹žœ—s,<Xq†}hMGLfu|uJ:;<<:gŽ‘–†wrtmeYPPTZUQQIFGGfŽ‹‡‹“—•‰}|]NQTMOUNRn‰Œps…pbZMFKXONF;GO@2.37<8/-..3<?C?KVJMI;78;;:<>>A=8:;<CHJMP@ADA>?AABDCCFJJIMRPHCPQBEJITS@?B@AKQfktyxunftxwdX]T^^cfea]UF;1((')07@KU\dfggfdbaa`_\XRMD;2,)))+-1578<AJV_flqvxyzz{{{zyz~€‡‹ŒŒ‹Š‰‰‰‰ŠŠ‹‹‹‹Š‡ƒ€}{xvutuuuuvvtplg_XSOQU[_eiov|‚‰Ž‹‹‹‹ŠŠ‹‹‹Œˆ†zohdgkpuwwusqqonmmmlnnnnnmmkkms|†ŽŽŒ‹‰ŠŠ!!       !!"#$&&'(()**+,+,,.../////.....----//.-,+,-,17=GQ\diiifd_ZUQNID@:653333334444554443332210/.-,,+*)('&&&&$$$#""#$$(-0132689>ADFHHGJLNQUZ[_cfknrrsw{|€~€}|ywqngc]XPMGB=;:::9::99998876666679>K_r€‰ˆ‚}nW;))')-4=IS]hoxƒ„„‚{uvxpaTIEDGIJMRUY[]^]YWXZ]ZXVVUTSRSTRSSV]b•˜˜•Œ}+9N`{ycNKDIPRIA=>>=<9n„Šnmjb_WPPSQJMPIJGEJvˆ„‚€ˆ’‰~[AIOMLJE>5?[ajte[NRWHJL=?:52892550-*'*1;?>TL=74774395358;;:98==;:BQDA?EMGCA=??BGIR^Z]dTV^\J=RZQ:@LGEPapvsswtssmpieJSAH]cegea[SG;1+&'*19BKT]dfggfcbaa_^[WRJC92-*+),.0468=CLW`gmrvxzzz{z{{z}ƒˆŒ‹‹Š‰‰‰ˆˆ‰‰ŠŠŠŠ‰†„€~|xvvuuuuuvuuoje]VQOQW^bfkqy}„‹ŽŽŒŠŠŠŠ‰‰‹‹Š‰†‚~vmeeejnswwtqoqponmmnmnpppnmnlpu~‡Ž‹Š‰‰‰!!!!    !"#$&&'(()**+,,,,.../////.....------,,.,,--047@FR[^cefeb`[XUSMHE=643222344445544433344100/-,++**('((&&%#%$$##$$$'+,-3789=??@CEFMRU[^`dgiklnquwzz}||zwvsojd]WPICA?>;;88889988887765555548:FUj{…‰†‚vdG-(&()),5>HU]gpv}|pe_f{xpeZONPVZbilnooplf_ZY[_^ZVVVTTRPOPPOOY™ —–”Œ318VnpSJPHA<;=@AAA@>7Er~sedaXZRKNNJKMLFGGJLYu‡…z{”ŽwF:ABCAA@>;6/2V€Œ‡vb`UQSI=D98849?=2.1/.-)<A98<86347;<AC:43662<BCG<99;=FFB>8<?@A>AECBIIYQjuMPipraIA@HIH=ThnpqrjZpfl^UR@@LU]chedb[SH:1+'(,2:CLU]dfggfbbaa_^\XRJB:3,++),.0158=ENW`iptvxz{{{zzzz}ƒ†Š‹‹‰‰ˆˆˆˆ‰‰ŠŠŠŠ‰†ƒzxvvvuuuuuvuuoje]VQOQW^bglrz‡ŽŽŒŠŠŠŠ‰‰‰Š‰‰†zrha`bgnsvvsqoooonoonmnpoonmnntzƒŠŽŽ‹Š‰‰‰!###!   "##$%%()()+++,--,..../.././/-----,,,,,,,-,,,.18@HQVZ^`abaa`]ZVPJE@:53322333344334333320/00.-+++*(''''%&$%##$$$##%'*,/37;>@?@CIMVZ]aiknnoopsvxwywvwutqnjc^XQJC<98;<::876567776666542333356=L`s‡ˆ…|pW9'%%'((,/7@KVajojdonSj€}th_]clv}€„‚~}}unghhie_YVSRPNLKLJIGL” š”ˆƒE.6Og\GIRJEB?@@@?>=26FQqnc]ZWVPOMIHFKLIIPRWZXix|†•ŽmC;<;899:9763/;f~††saSNICEKJ=26J;4,34/+*3?=DE953496<BD<7655434334577::>JVI60,38:<E?;=@FZ\QCL[gb]HAHJE=YmmmprtZClvt†FW`WGIP[fghgb[RH:1+)*/4;DNW`dfggfdba`_^\YRIB:0*()*-11479>HSZckquxy{|||zyyy|€ƒ‰‹‹‹‰‰‡‡‡‡ˆˆŠŠŠŠˆ…ƒzxwvuuvvvvuusmgc\SONSY_cgmt|ƒ‰Ž‹‰‰‰‰ŠŠŠ‹Šˆ…€ymd]\`gotuusqonponnnnnnnmmnnqqv}…ŽŒ‹Š‰‰‰!#%%"   ! !#$%%()()+++,--,......././/----,,,,**++,+,,,,16?FLOSX[]^`_`_\WSNHA:532233334433433321///0/-,,-+))'''&&$$#$%$$%%%'+059=ADFJKOU[^cfjnrrstvuwwwtsqomkif`\VPKB:756889::9867566655554331111237BVjy„ˆ…‚yeF,%'%')*06;DSbmhk]dxqxyxyrsrwƒ……ƒ†‚‚……ƒ}~xpg[QOLLGGECCCAzž•Š„ƒY.5A`VCHMJHEBCCBA@?^n^BXlg_XSRNOMKGHMMKMLTVWVXZo˜•„oUB8;:576421.--Dj|‰Œ€eTNJDAIJ/),/32<:,*19,'4?94343413400334331000149<:=CLD/).375BM;?UXQSV`mZ@DPb]KD@B[njnpmpvweEb¨’Kd]LBJQ`hhigb\SH:1+)*.3=GOY`dfggfdba`_^ZWQJB:322337;;<<@EMT\emswyy{||}{xxx{€ƒ‰‹ŒŒ‰‰‡‡‡‡ˆˆŠŠŠŠˆ…‚~{ywvtsvvvvuusmhbZQNOSY`dipw†‹ŽŒŠ‰‰‰‰ŠŠ‹‹Šˆƒ{rh^ZZ^ekrvusqopnonnnnnmmmmnnrrzƒ‰Œ‹‹‹ŠŠ#$&'%   !"#$%%&'()))***,..-.--..-.///.,,--,,+++++*,+,**+-/4;?DIMQVY\]_`b^]UNLB>7312233343333221111//..,,-**)''&&&%$#&%%%%)+/39;@EHNQVWX_fjmnquxzzyxwurpkkgeb^YVQMFA;74446578788665544444443211000023;Lbu‚ˆ‰‡rY=)%$%%(.1:GS[^Yacfoqqkiopu~‚„€~||xy}‡ŒŽ‘”•“ŽŠ‡{l[LA>>B><9;X˜‘Š‡ƒ€q4/=X[IKMKKTFDCE@>:_•jg`ecZSPLPOMGHJLMRMM[VKQTd–ƒl]QE;2247641.,*-He|ŒzeV]WQSOD::249?<007:+(+44644438:EOD=7542/--0.038:?>E>5/1:?@?85EURYW_mj[LNLZmS]etuls€twtyvUcODS[TAHWfgghhc[RG92-+,27@JSZaegggfecba_^[XTOJD@?BGHMOPPPSSX]ciqvzz{{{{zxyyy}ƒ†ŠŒ‹Š‰ˆ‡‡‡‡‰‰ŠŠŠŠ‡„‚}ywwuuuwwvvvvrlg_XNLOTY`elsx€‡‹ŽŒŠ‰‰‰‰ŠŠŠŠ‹†ypdYRU[cltwtspnmoonnnnlkkkknoot{„ŒŒŒŒŒ#$&'&"  !"#$&&''()))***,..-------.///-,,--,,))++))**+***+,.36<@DGMPVX\_`a`_ZRKE=512233333333221111//..,,+**)''''&%$%$%(*+/49?DHLRVY\`deiptvwxyzyyxtpnigd`[WQNJHC>84311124455766543333333332111//-/015CXl~ˆŒŠ†|jQ;&%)45.0<KNGGGONNRMQTWVUZhruyvvuw{„’’“––—•‰ŠŽ‹€r[H>889759~–ˆ‚€Q=?Q_PMNLIJFCDB@>7Uš’‚vgVZ`YPMRNHEEJHKNNNYYSHJS’ˆq]IC43789952-***0J`|•–nadcsk\XSMD738DHI@7+/355326GLIKF67:864:A=8/+-7>AM]A2?CHBHG=GMQRU^gd]UVU`egIWorpmo„~hib[\[YMDI[`H;FOffijfa]SJ<2-,/38BKSZaeggggecdcddeeb_^YUXX[`ehillnnppstwz||{zzzxwxxz~„ŠŒ‹Š‰ˆ‡‡‡‡‰‰ŠŠŠŠ‡„~{ywuvvwwvvvvrlg_WMKNTYafnu{‚ˆŒŽŒŠ‰‰‰‰ŠŠŠŠŠ‡uk^SMQYdmsvsrpnoqonnnnlkkkkkmns|…‘ŒŒŒŒŒ!#&'&#   "#$%&''('(*+***,-/----....00.,,,*++*))**)))***)++++,.259=@EJQV[]__`a\UNG;52222223322210000....---+**(((''&&')-/38;BHMQT[_bfikpstwy{{zyxurolid`[XRLHD>;95211100000033333322222422222210.----.4<Lez‡Œ‹„ueO9)6SUJGT\ZQPQSTY_PJFEFG?FILU^gp{ƒŽ’‘—˜•‘xyw‚’•{aH93467H‚‰‚}jKGWcUOSMEFCBBB<7Frž—†ymZTXZVPIFEFGIGHHIKOPIFJQŽˆ€eA52>C>;720)()**5Ld‚”“ˆ}wturcbXLKLB<MNF>7;:75427<<:>??;:758DEK;.112>JOiqO/=RNLTQR_sZLRZgQ]R;=\fYOT`\^ZYb^VPQID@LJ@ENA<H:1^kkjhb\TI;1--/5<EMT\dgighffhjlnqrqtsppptyz}€ƒƒ€€€ƒƒ„„‚~}|{vuy}ƒ‰Œ‹‹Š‰‰‡‡ˆˆˆˆŠŠ‹Š†ƒ|zxwwwwxxwwutrle^TMJLS\ciqx}†‹ŽŽ‹Šˆ‰‰‹‹‹‹‰†~vgWMIOYbltutrpnnnnnnnmkjiefiknuˆ’‹ŒŒ‹ "$%%" !!"#%%&&'(()****,-..,---....//.,,,*++*))**))))****++***+-257=BGKRY\_bba]TLF;5222123321010000....--,++*(((((++.14:>EINUX]bhjmpstvxzz{yxutqojfa^XROIC=:623210/////00/02222112222243200000/.-,,-.16EZp‚Ž‹‰€yiO:CXWQRK]mpbeh]e`YdcRKE>DDEFGDI\mŽ•––‘ŒƒŠ„”™œš•ŽzYA7<GLh‰}rnngXLOMDDB?A?<;bŒŸ™‰~si^XUQMHDFIJJHGFILEFEGMM~ˆymF<7BGD@80(##%')*8P`xŒ“„ujuiqxdikYJW^QC<97840/025668:89GOG9CC7**+1Nhkmd_HBGCTPOS\mcL]fZMG9CNj[CcieXIIC??ELF77?MYRMGKQ[4Ogkijhb\TH>51139AHPX_cfijlnpqsvz}€ƒ†‡…†††‡‰ŠŠ‹‹ŠŠŠŠŠŠ‹‹ŠŠŠŠŠ‡†{z|€‚‡‹‹‹ŠŠˆ‡‡ˆˆˆ‰ŠŠ‹‰…‚|zxwwwwxxwwutqke^SKINS\dkry€‡ŽŒŠ‰‰‹‹‹‹‹‹‡„|rcQIGPZeotutrpnnnnnnnmkigbdfhnv‹‘‹‹‹‹"$$" !!"#$&'''()*))++--------.....--,,,*++***))(()))*****))**++//48<BGNU[addd]UME93311222200011//....---*+*)()*,/58<BGMPT[_dhmprtwyxxxwvtrpmkgb^YTOJF>;511000..////////./1111112211132111/...-,++,./2<Pg|ˆŽ‹Œ„xrww|~ufQ??Pcuy\OWX_nwtaICCCDFCACDGK\q~~}…Ž‘–•Ž‹“šŸœ•–•Œyc`ny…–ƒ~ŒŠ‚qXLMIGCA?=ELV—Ÿxmb]]ZRIHGHHIHFEFHE<=ESYl†tmiQ@>BFDB=3&! !$'*+>Q`qƒ„tniu~tvpebcZ\G;<;961345369585D;;?;7;65-/9^pqeV]UTOODLSV]WSN\KEPHBZL^m]_`VM+.953674=MQcl_UGDOecihikkgc^VI?8354;FKTYbgnprvvz}ƒ‡‰ŽŒ‹‹‹Œ‹‹‹‹ŠŠ‹‹ŒŽŽŽŽŽ‹‰Š„€€ƒ„‰Œ‹ŠŠ‰ˆ‡‡‡‡ˆ‰ŠŠŠ‰…‚|{yxxwwwwwwutrkd\RIHMS\elrzƒˆŽ‘ŽŽŒŠˆ‰ŠŠ‹‹‹Š‡ƒym^MEGS]hqtusrpnnnnnnomkheccdhoxƒŒŽŒŒŽŽŒ     !!"#$&'''()*))++--------.....-,,,,*++***))))))**))**++****++-04:@GOU[beif]VJB8322122100011//....--,++*)*,148?CGNT[\bhkoruwyyxvusqplkigb^YTOKEA:62/--./--.-...../.../00000011000221110..,-,++++-/7E[rƒŒŠtq‚’•‘‹ƒ~{qXMQdZ`QJPele~|\QHEDDGFCAEFEGIV_’•š’’‘”—žœŽ”—ˆŒ‘‘’•…~|~…XhXJLKGC@A==Co“¡§›Œˆ}ukgdcaaMH]f`WIFEEC929H\hx_`XGDCEB?>8-"!#'*+,/:M\jw„‡‚xw}~‚zuj^OUH<DHOXT=:@<67B42>?CFZU<>31547Uid\V\[Q@;Cajh^\ZUFDL?AMXHVh^\NEK?G;?6?CH\ehxoNL=Aeffijkkgc^VLA:679?FOW`hotw|‚…ˆ‹’’’ŽŒ‹‹Š‹‹‹ŠŠ‹‹‹‹ŠŒŒŒŽŽŒ‹‰ˆ†ˆ‰ŒŒ‹Šˆ‡‡‡‡‡ˆ‰ŠŠŠ‰…‚|{yxxwwwwwwutpjaYPHGLS\elt{ƒˆŽŽŒŠŠ‹ŠŠ‹‹‹Š‡xiVIEJT^jrtusrpnnnnnnomkhebbchqy…ŒŒŽŽŒ!!!"#$%''()()**,,,-..,........-,+***++***))))((((((()(())*'))++-29?GNU_dgjd\RKB:55431200010..//.---.-,,.168?FJOT[_dilmpsuwvvtromihea`]YUPLFB;710.----.---.-----.-..//./0000//00121122/.++,+**))),0:Ndxƒ„z|‹‘Šƒ…Š†ƒ‚‚}zlX]nbVOe„‚w|n`OEAFFEHEFHJLJA?Sn‡•““˜šŽŠŒˆqŠŽ””Ž„{y{‘q…]HJKEA?;::J}—£§œekƒ~unlkjii•–’Œƒx\F>713Kekrnea]MHDDA??=2(%'),,,,-:L]gpv{†‘•„‡uoaQbVNWUXUX>5ECEBD16A:FOKFC0.;9,4JZSNP\UF=FKTLQILQUGEGJMVWHIXZM@EOIG8?C89DXny}ysR4=Qhgggijlhb^WNE=8;<CLU_gqy}†‰‘’’“•”’’Ž‹Š‡‡‡‡‡ˆŠŠŠŠ‰‰‰ŠŠ‰ˆ‹ŒŒ‹ŽŽŽ’ŽŒ‰ˆ‡††‡‡‰Š‹‹Šˆ…‚|{zwwwwwwwwusog`YOGFLT]fmv~„‰ŒŽ‹Š‰‡‰‰‹‹‹Š†€whTHELW`kruurrpommnnnomjgdaachq}‡Ž’ŒŒŽŽŒ! !!$#$%''()()*+,,,-../........-,+******))))))((((((''(()))())++*+06>EPY_gkic[SMEA=876521010/.//----+-/137<CIOU\aejmpsssstrpomjeb^ZWSRNKEA;641,,,,,--,-,,,------+-....-.////////010000/.++++**))()*2@TeosŒ…‚yvv……~~\Rksnf]o‡|umg[WPEEJRKEDCEIKGGJ^–‘“”˜™‰ˆŒ‹†rw†‰‚€zxyŽ“”ŽcGIIEBCOG8Qˆ¦©£^,X{yxvzz„•Ÿ¡™“ˆydM>6/8Selsnga^UKA?A?@>81*.///-+*+:P[gjl“¡˜–˜†{kceebXTDVM<>B?IA0=;AF?GN:.?VD-5IT[JAJ<<LLHP5:<@FWVFEEON\f_M85GYKSL67RY?DJfp_jrOCWcfghhjjlhd_XOF><>BMV_is}‚‡ŒŽ‘“”””””“‹ˆ„~{yy{~€‚ƒ†‡†‡‡†‡‡‡‡‰‰ŒŒŽ’““‘ŒŠˆ‡††‡‡‰Š‹‹Šˆ…‚|{zxwwwwwwwusog_UJFEKR[clw…ŠŒŽ‹Š‰Š‹‹‹‹‹Š†€ufSIJR[emrssqppommllonmjgd``cis~ˆŒŒŽŽŒ!!""$$%&&')*(**,,,,-,-........,+++++**))))))))''((''''''))())()))),19@IR\dikib\WQKGC>=;9533100...-,-//47:?GMTZ`cgmprrtsqqljhea\XTOLHEA=9510.-.++,+++++++++,,--,,,,------.........//.//..,+**)))))(*+5FZf|~†ƒqbphioWXeX\ggd__qƒ’„tlgbZMDFJPJEECDGIKLLOx˜’‘’—ž—ŠˆŽŽ…u}ˆy‹Œ{wv‰ŽqDLKIIC?>7ZŸ¥ª¥Š+4Mr‚}y{‹›¡ ”Ž†t]H;4/9MYbghc[VTOA>??AB>813310/-+*+5L_hdk˜¢¤¤¤¢˜~`VhqfUOaVE<HW>2<:DORK>/&4GWE2;GUcVCED5;F[S<737:EDHB1:AFab8<Y_XL[PKSnh`c`jnNV_]`fegefijkkheaXQHBCHNYbku‡‹‘’”””’“’Ž‹‡€xrlfb``bdgkorx{|~€„„……†‡ˆ‰ŠŠ‹Ž‘‘””“’‹‰ˆ‡‡†‡‰Š‹‹Š‡…‚|{zxwxxwwwwurmf\PGDDJPZcmw‡ŒŽŒ‹ŠŠ‹‹‹ŒŒŒ‹†€ufVOPW_gostrpnponnnnnnmjgea_djt‹‘ŽŽŽŽŽŒ!!""$%%&&')*+(*+,,,-,,........,++++++)))))))))(''(''''''((())(((((*.3:BLT^dhjhc^XVRNKFC?=:8632/.../0369>CHPV]agjmptrpnljfb^[USNKFA=9311-,,--,++*++++++++++,,,,++++,,,,,,--.......//...--,+**))))))(+5Mpzyuqmii^\vso}wtfZ]bTKTbuŒ†uimmgVDAIHJGDEEFFHILMu–Ž‹—ž•‹Œ‹ŽŽ‹Œ’‡Ž‰zvv„‹‹‹zKGHFFEA>5c“¡§§¥šW2=?FI>Aj‡š™’…€ufZS;11>LXZ]^`XTPMC=>BDGB?966431.-)*+5Rb_]n€Š“ŸŸ›‹xixsh`[WZKGV`=94;AGFH89>H<E>9<HQYN<;_C=FZ^E1.66<HE@=EHHT^enkgeieimlfPUi`fl`ekiiecfgggkkkjfaZSLKNRZdoy‰ŒŽ‘“’’ŽŠƒ{rj`XRJFEEGKLR[_glnsvz}}~~€ƒ„…‡‡ˆ‹ŒŽ’ŒŠ‰‡‡†‡‰Š‹‹Š‡…‚|{zxwxxwwwwurne[OEAAGQ[eoy‡ŒŽŒ‹ŠŠ‹‹‹ŒŒŒ‹†€wh\RTZclsttrqpponnnnnnmjgebadlvƒ‘ŽŽŽŽŽŒ !!"$%&&'&'()**++-.----,-.......-,,+++(**)(((((((''((''&&&&((((&&')**/4;DMW\dhhgdd`[YWRQMIECA:6522237:>DHNTY_ehkmnonmjfa^XUPLJE>;730/.-,,++,-++**++++++++++++++++++++,,,,,,,,--------,,,,,+**))))((+0a}oeivodi^f{zym]f`^|ucdlt|‹Œ“Œ…yudUKLLGDEDFFJMMJi”ŒŒ“›‰[r…‰‡Œ‘”‘†{yutŠ‘‘‹\DIHHCA<:rš£¨©¦št0<;974/P~‡‚yqeXPG5:BLRRTVXUOKHD<9AJKFD@;97651.+.17@V^[bkt~„ˆˆˆ‰…ƒ‚~uiUPUTUddLB7522;><?@4779<;:=A:60-:;>7gZ3-0>NA6<JPRLcxwrpnkjikii`Vhs`Zqqmihfeffghjmmljida\YY\cju~†ŠŠ‰†~ti`UKA>;<;;:<>BJOWagosvxzz{}€€€ƒ…‡ˆˆ‰Œˆ‡‡ˆ‰Š‹‹Š‹ˆ†~}{ywwxxwwwvvqkdZQFABHR\hqy‰ŽŒ‹Š‰Š‹‹‹ŒŒ‹Š‡€vj^YZ_gnuvtrpppnnnnnnnmjfdbabn{†’ŽŽŽŒ‹ !""$%&&'&'()**,,,--.--,-......-,++******)(((((((''((''&&&&((((&&&(**+/3<GNV]bdfedcc`^YWSSPMJEA;988==AFKQW]`bhjkihhea\YTPJF>:731//-++,,,,++-,++**++++++++++++++++++++,,,,,,,,,,------,,,,,++*))))*-3G€zqzwtwiikgju`MK[\egebd_g{}‡€“›££Š†xUCHHEGHHIHIIG`•ŠŒ™ˆ/9OcqˆŒŽŒ„ywuw‘šš˜•h@GFEA@=Ey™¢¥ª¦19;;;949fy{zvqg_XPLGGHIJNPNPRNJIF=4@NNKECA?:7642247:7CW]_dlpqsusvwrjhjfVIMUZQVXN12,9E?<IJ29<881/9KD00794<9=Q+,1692HemRPJqzvronkkjjknmqqu]Jmrnigffffghikklmmljijkpv|„ŠŽŒŒŒ‹‹‰†€}vme]VOGA>=;<<<>?BFMV]fmsvwwvwy||~€‚…†††‹ŒŒ‹ˆˆˆˆŠ‹‹ŠŠ‡†~}{ywxxxwwvutnjc[PE@CHQ\hq{ƒ‰ŽŒ‹Š‰Š‹‹‹ŒŒ‹Š‡€vj_[]dkquwupppnnnnnnnnmjfdbaep~ˆ‘’ŽŽŽŽŒ!##$$$&%&('()++,,,,,-........---,,+****))))))((((''(((('&((''((''''(*)+05=ELRX^acdcedaa^][[XTQLHEECDIMPV[_bdgihgda^[SOJE@:61--,,+++++,,,,,,,,,,++****++**************++,,,,--,,----,,++**++,,)+**.7Qdxdf‚…€ppffibOMLNMZgm_TOL^hpj€‰‘¥¨¡œ’xU@IFHIGIJHHHTŽŠ‹‹”Œ@;;<Ig}‡Ž‹{uvwx”žžšzBAFJC>>V~˜Ÿ£¦¦ž}.9=<<:54Jgkljf_VTPNKJKJLNONNNNMKGA5APRPIFFE?<96:;;8799LX]`ejjptvxpZGFHJIDDGQJFHG>;C26<?<99EC=9:;B<<<35<17;?`SK?<<F[ebSOY{xurnkjjiijmnqrsmktpkigffgggihkprtvuvxz}†ŠŒŽ‹ˆˆ…„~{xrmhb\YRME?;:<==>?ACIRYbhptwvvvwyzz{|~ƒ„„„ˆ‰‹‹‹Œ‹‹‰‰‰‹ŠŠŠ‰ˆ…~|zxxxxxvvwvsojcXNE?BHR]kt}ƒŠŽŽŒŠ‰ŠŠ‹Œ‹‹Š‰†wh__bjqvwwtrqpnnnonnoomjfeacfr€‰‘ŽŽŽŽ !"#$$$&'(('()+,,,,,,-........---,,+****))))))((((''((((((((''((''''''('*,4;@GNRVY\^^_aa`a__^\ZVSQPPPTWZ^_acgffb^[WSLGA;50-++**)+*+,++,,,,,,,,,,++****++**************++,,,,--,,,,,,++++****++)+,+0Nsysly…ˆŠ„}|vsyydUP[[K`gdb][V`cd~œž¯³­«¤Ÿ—‚G@FILMMLIDBG‰†‹‘ŽD4>>?E\y††„ztwy{—œ›œ™ŠN?EGD@?h“››Ÿ£ž}.68;:8617S__\][TMIIHFJNNNMMMLKLLLF@JRSVGDHIFD@<=BFB@>>DTXZZ[__ehnpne[TLB;<<GSPV]]Z8-4857;7BC;>B01;CSL8@769<OYID:8Xut\QLp{xsomkiiihilnqpnputokigffggijkpty}‚†ˆ‹Ž‹Š‡ƒ}zurnlifc`^]WQKC@<;;=>?@@EKV^dlsyxyywxyyyyz{}€‚‚ƒ„ƒ…†‰ŠŒ‰‰‰‰ŠŠ‹Š‰ˆ…~|zxwwxxvvvusniaWMD?AHT_lv€‡ŒŽŽŒ‹Š‰ŠŠ‹Œ‹‹Š‰„}rg``hmuwyxvrqpnnnonnnnlihgdejv‚‹‘ŽŽŽ!"!"#$%'&'())**+,,,,,-......--..-,,+****))((((((((''((((((((''''''''(())'',07<CFJNQRVY]_^_`_a``a^][[\^__acdecb^ZTNID<52-+**))*)++**++*,,,,,,,,,,,,+++++++)************++--,,--,,++++++++*)****)+-/I~x|~xw„wvzvpkffoghYFcpWWfcdefk™­°¬¯²¬®«¡wC<HKJGJEAABm‡ƒ„Œ’k.:>@@@Srƒ‚uowx|“˜˜—–“aCHHEADy•›—˜ ›q-6899:973>QVUWVRNJIIGGJMMNLMNJJHIKN\e`UEEEGLLJFDSbSCCB=OWUTPKGIOSY[Z\XK::ILROKIRXK=:.5?9:8>B:86.(*,44(9757?H<B>;<h}‚UM_„|urpmkjgghiintoovtspmjhhghjkosx|€…‰ŽŒŠ‡„~vplgfc_`a_]]ZUOHA><<==>?@BEOW^hpv{}|{xxzyyyz|~ƒ„ƒ‚†‡ˆ‰ˆŒŒ‹‰‰ŒŒŠ‰‡„~{zxwwxxvvvuqmg^ULC?AIUamxˆŽ‹Š‰‰‰Š‹ŒŠŠŠˆƒyoeacjouxzxsqqponnoomnmkjihefmy†Œ‘ŽŽ "#"##$%'&'())*+,,-,,,-......--..-,,+****))((((((((''((((((((''''''''''((''().26:@CGILMSUWX\_aadedcaaa`adeca`]YRMIC;2-*)()'****++++++,,,,,,,,,,,,,,+++++++,++**********+,------,,++++++++*))))))+,?y‰j|{|y€Š€ur|}ypvy~vj\QXkgSGdwyzy‚¨­ª³¹´·¹±›h7IHGFFCCC=WŽ‰}„‹’S4@?=@BNpƒtqxz~””——–xHHLFBG˜“Œ–Ÿœb,699::8521<KQQSQNMLGGGHMJLKMMIGEEKSWWVMJFGILQRPMQ^]PMC9HVRMD=9666:999510:FNQA=ADD8?><HI>9?DE95535/$2<=CA6;CD>:878ENMEMho}|xupnkhgghiorquuuspnlllnopsv{€ƒ‡‘’“”’’ŽŒ‰„|ungc`a_^^^_^\[YTMG?<:;<<=>@DIQ[ajv|€~{yyzzz{{€ƒ‡…ƒ‚…††ˆ‰ŠŠŠ‹‹‹‹‰‡„€}{yxwwxxvvusplf]TJA>BJUcp{‚‰ŽŠŠ‰‰‰Š‹ŒŠŠ‰‡‚xmc^bipuxyvsppoonlmnnomkjhgfgp}‡ŽŽŽ‹‹‹  !!#$$$%%&'(())*+++,--......//-----,,+****))('''((((''((((((((((((''''&&&(''((()-036:=AAGKLORVW\^bbcccccaaa_[WQMHA;3.)'(())((*+*++**++,---------------,+++,,********+++++,----,,--++++++***((()))*7k‘qXowz‚††~€€„|nvspwphcVc}oG4Xv|z…œ£®·º»»»¹­ŠBBELJDBCD>F~Œ‚}…‘ˆ=8?>>ECa‚wsy~…ˆˆ“––‰ONIFAJƒšž›š›š^+677999730-8GNOOMKKIGGFKKMKMMJHFCFSMKNRSIIIJQVW[aiYLJB9EVSJB>@EH@:2//--07CE7223:;>C>DMK?=9BH96864479AC943<A=;9::=<748>@BJOXcnmliggiililtvuttqrrtvvx|€ƒˆŠ’”“•”‘Œ‰„~umgb^[[]]^^^]\\ZXRMH@;:::;==@EIS[foy€……‚€~}{yzz{{}ƒ…ˆ†…‚‚ƒƒ†ˆ‹‹Œ‹ŠŒ‹‰‡„€{ywvwwvwvuuupke\RG@?CKYgs}„ŠŽŽŒŠŠ‰‰‰ŠŠŠŠŠ‰‡ui]]ajouxxusqppnmlmmoonlljigjs~ˆ‘ŒŽŒŒŽŽŽ  !!#$$$%%&'(())*++,,-.......//-----,,+****))('''((((''(((((((())((''''&&&''''''(+*,.0156;?@CGLPTZ]^_````]\ZVQLGA:3.+)'()((())*++**++,,,---------------,+++,,++******+++++,----,,--,,,,++***())))*,GohWYqu|‰†‡ƒ‹Œƒ}‚€{qulpmXEdsjRG]ft‚˜¨µ»»¼»ºµž]7>AEBCC?@Cd‘ˆ~~Š—f1@@>CHq€xxz~{zŒ•—[@EGHJ‚›œžšš”Q07:9:9863/.0;EMONMKIGGGEKMKKJHEFCDXQLNSTHIIKMU_rwod]KB=M[RHGMQRPH?30/00022//0325;;F;;EB938>A=7979:>>82363BO=6589:<;9=CB9:BEHR]aagihjootyzyyxvxz|~€ƒ‡‰ŒŽ’“•““ˆƒ{skc^]\[XZ\\\]]\\\YVRKE=;:9:;<<>EJR_gq|‚‡‡…ƒ€|{z{||ƒ…‰Šˆ†ƒƒ†‰‹ŒŒ‹ˆ†‚~zxvvwwvvvuttoid[OF@?EMZft~…‹ŽŠ‰‰‰‰‰ŠŠŠŠŠˆ„|re\Y^gnswvrqpppnmlmmonnmljihmvŒ‘Œ‹’“”’‹ !""$$%%&&''(****++*-............---,,+**))))((((((((((((((((''''''((''&&''''''&&((((++*-1468>BGLOQUVVYYWURNKE@83))''((')(**)**,,,+--,-......----------,,++,,,,+*++++++,,--------,-,,..06+)++**)*,5Y^cw^k~ˆ€xˆ‹||{{qmvoxu\AVp}ucY]b{Š‘“£¯º¼»»º¸§p06=BADEDDCNƒ†~}‚’ŽH1?BKm~|{€€†‰‰‡‰Ž”•e?CCEP—œœŸ›™’@3;;:::9863/.0=JLMLLLJJGIKMIDCAEDEEX[MOTSBHIKMN[mmlgfI?D[^RPVWWVK@82.*)-.../../147984852.1;A>;;69:;<981::144728BIG>75>CDFC>9?PX[Y\dmqtvy}~}}}~ƒ„‡ŠŒŒŒŽŽ’”’Œ‡‚{pg]WXY[\\]]\\\\\\[[WUPJD<:99:;<<@GKS]kv…‰‰‰†ƒ}|z{|{€„†Š‹Š†ƒ€…„‡ŒŒ‹Œ‰…‚}zwuuvvvvvvtrmgaYOE?=EQ^kv‚†‹ŽŽŠ‰‰‡‡ˆ‰ŠŠŠŠˆ‚xn_VU[blsvvtqponmkklmoppomkjjoz…Ž‘‘Ž‘‹‰ !""$$%%&&''())**++*-............---,,+**))))((((((((((((((((((''''((''&&''''''&&(((())((+,.257:>BDIJJMNKHGC@:2,)((''(('))*+***,,----,-......----------,,,,,,,,,+,,++++,,------------..4S@(++**)*2HRnŠ‡Šqim~“……ˆƒ{{€vprmM?UBbxx|nX_j€Œ˜Ÿ¨²»»»ºº¦t47<??CECCCFcyzƒˆD-C\ƒ~|}‚……ˆŒŒŽ’’zIFAFL–ššœœ™•I5<9::::9542.+4ELONNKIJLLMKGLPRPKDAE]ONTS?EHJMNQ^b`^^MKR]]Y\_\WPE=86-&'*++-----0125@A><<FGHBF?<79779345631/26137:9?<:><?EKJGA7=Ni`H]x|z}ƒ„……†ˆ‰Š‹Š‹ŒŒŽŽŽŽŒˆ€xlcVNLPTXY[[\\[[[[\\[YWUPJC;:989;<?BEMWajs†‹‹Šˆƒ|{z{{|€„ˆ‹‹Š‰…€‚ƒ†ŒŒŽŽŒ‹ˆ„|yvttvvuuuutrmg`XKA<=EQ_lxƒ‰ŒŽŽŠ‰‰‰‰ˆ‰ŠŠŠŠ‡wl]SSZcmtwusqpomlkklmopqpolkmt}‰Ž”ŒŠ‰‰ˆˆˆ   !!""$$%$%'((*****++,.......//------,+,,**)())''''((((((((''''''''''((('''''''''''))))))))))*,/0357:?AAABA=;62,)'&''(()))))*++,-,+,,-,-.....//////----------,,,,,,,,,,,,,,-----------++,/1-*****+,AX_{xƒ~RJTe†‡‡‚ˆ€ttwsupbT>Lut€‡rX_oƒž¥®´¹»º¹£i17:<>AA@@FCDm‘†}{}€Š‰;2gƒ€}€…‡‡‰ŠŽŽƒVKDDK}’–˜›šš“P59:;<;;:941.,/@KPPLJHHLLMPQQQPMG:01aVMQM4=CFGJV]ba^^bbddddc`ZRE<977.'')**+++,,.0019=AHKFFOOKEB<E>FORF?961433453538CF=@A9:@GKIG?7QaV^tƒ†Š‹ŠŒŒŒŒ‹Š‰ˆ‡‰‰‰‡†…wndVMFFLSVYYYZZZ[[[[[[ZZWTOIA::989;<=AJX^alw€†Š‹‹‰„€}zzy{}„‡Š‹‹ˆ†‚‚ƒ‡‰ŒŒ‹†„|xvttuuuuuutqlf]UI@:=EQ_mz…‹ŽŽŒŠˆˆ‡‡‡ˆŠŠŠ‰…~wi\QSZenuwvtrqonlkklmnoppnmkmu‚ˆ’•’Ž‹‰†‡‡…ˆˆ  !!!""$$%$%'((*++**++........//------,+++**)())''''((((((((((''''''''((((''''''''''(((())))***)*,-..13677762/,)((((''(())))*+++--,,--..//../0//////-----------,,,,,,,,,,,,,------..---.-,-,,,**++-8OQy‡€Tb[OJMi›™‰†‘Ž|ty|z€yoH?^xxu„†nScq˜¦©¬°·ºµšN/9:>>=@A>ABBK{Œƒ}zx‹@wƒ}{‡‡‚†‹Ž‘‘‘’mNLEI|—–——–’U59;;<;;9743.-,9IOSVWWWWVSQY[XOB3,(,]^OPJ,/49?T[`e_`jlmhiiij`TF?::992)(,*++***)*-..2=IKMPNXOILHAFMQVNB/264//1460/8K@;85NTIA99@DGA9=Q[Tk‹‘Ž‹Š‰††„€~}}}|yxoj`VLFDGKQTXXWXXXYYYYZZZZVRLFA::989;<?ALTW`lw‚‡Š‹Šˆƒ}zy{{}„‡‹Œ‹‰†…‚€€ƒ…ˆ‰ŠŒ‰‡ƒ~ywvusuuuutttqke\TI@;>FRan{†‹ŽŽ‹‰ˆˆ‡‡‡ˆŠŠŠ‰…}sfXPS[gqvwusrponlklmmnpqppnmqyŒ”—”‹‹‡†‡‡ˆŠŠ  !!!"#$#$%&('()++++,,..////////----,,-,+***))))((((((((((((''''&&''''((((''''''''''(((((()))*))******,,----+*)('&&((((()))**+,,,-....//./001111/////-..//..--------,,,,,,,,----..........--++++,-0JKP…bMHEJSh®©¡›— ˜Œ„vvopkoO:;Hb„Š„~iV\yŸ¥§§©³©|729<=<<?A@B>?BQƒŠ‚{{v€wƒ|w|ƒ†|„ŠŒŒ‘’“‘{ROGIx•“””“`7<;;<==:841/+-8Xmvuoja]YV_eb\K4&%%'TcLLH-..0T`fbaexqpigjkml\IB?<===6/12210.)(%'+../9ALOIV`QJF?GKLEEJF1#093-./0,/?Mx_C<EPTSL=9:==A8<MXj“ŽŠˆ†…|wsrrqssqoke\TJFEHLRTXXXXYYZZZZYY[ZVQMGA<989:<=>DIPYboy‚†‰ŒŠˆƒ€}zxzz}ƒ…‰Œ‹Š‰ˆ„ƒ€‚‚…ˆ‹‹‹†ƒ}xxvstuuutttspjd[SG?=>HTcp‡ŒŽ‹‰ˆ†††‡ˆ‰ŠŠŠˆƒ{qcWQW`jrvvurrponmmmmmnqqqmmot~Ž–”ŽŒ‰‰ŠŠŒŒŒŒ‹Š !!!!"#$$$%%&'())))++,,--..////..----,,,+****))))((((((((((((((''&')(''((((''''''''''(((((((()*))**))))))*****))(()(((((()))*+,,,-.//////./0011111/00//..//..--------,,......--....//......--,,++-.5VIh‰KGEXr†—¡§­­¬§¢›€†‹}okmsr]??83Gmw‚~Y]p€’ž¤¡ŸŠO4;;:::8;:<?>BMOd‰…{ywy„Ž‰|x~…€~ˆˆŒ’‹‰ƒSIHOp‹‘””’‘Œj:<;=<=<85400..[€„}soi[WUTZ]]XE,&)(*HlULJ/,/Tkkkgl{yojhegkme\RJEA@B?<9768630*##$(,-./8AFQ[`RKLTQZc_WQI5!+<<1.00.+*<v‘”‡eI?JPPQN<7BDB:CWhŠŠ…‚|{vqliiiklnnmhc\SJFFIMQUYYXXYYZZZZYYYXVQKE@:98:;<=AFKT\dqz‚†‰‹‰‡ƒ€|yzz{ƒ…ŠŒ‹Šˆ‡‡‡„ƒ„…ˆŠ‰†‚}xwutussttttrojd\RG?>CMYer‡ŒŽ‹‰ˆ‡‡†‡ˆ‰ŠŠŠˆƒzobVSX`jsywurqponmmmmmnpqpomm}”˜“‰†ˆ‰ŒŒŽ‹‹ŒŒ  !!""""#$%%%&&'((')***+,,,,....//.-----,+*)**(())))))))))))(((((()*,)&(''(((((('''(''''((((((()()))))****))())))((*))(())(())*+,....//.//1111111111221111/////.------..----,-...-............------./?]nnnG>aŽšŸ¨¦¡££«ªª©Žwx|zb[KHCDJqy}o^jwˆ“œ™’ŠlD:=:<=ACC?=<>BHJRmˆxuv|…Šzv{y…t}‘“‘’hEIQg„“ŽˆŽ‹u<9:<=;:944/.+K{~zvrpe_XQJHCDGB400-.AlZML01Ejmrox‚|vnifchlomh^XTPOIA=<9<986,%"#$&*..-.2D^eh\PVXdlinlidZG8846/--4<?EYvz…‘’‡oQDLTUR>9=DB8=WoŠ‡{xsokhgfghjllmoic\SKGFIMRSXXXXXYZZZZ[Y[XUPJD>:989:;<AGLS\gs|‚†‰Šˆ…€zyyw{‚†ŠŒ‹Šˆˆ‡††ƒƒ‚‚„†††…ƒ}yvtrstttttsomgc[QG?@FP\huˆŽŽ‹‡†††‡ˆ‰ŠŠ‰‡‚xm`UT\dntwttqponmmmmmmnqqpmp†——’‰††‡‰‹Œ‹‰‹Ž’  !!""""!"%%%&&'(()****+,,,,....//.-----+**)**))))))))))))))(((()))).9+'''((((((''''''''((((((()()))))****))()))))))))()))))**+-,,//./01001111111111222211/////.------..----,-..............//..----./EtzeCRBX¨¥¤£¦¨¥£­¯®«¢‘†„…‰wlj`e[eW_w{{efr{†ŽŽ‰tJB:A>==BIJOJDB??HQRq‰{wuw|‡‚sqy{wkn‡wbs˜šš•{ECM^†‘Ž„wŒŒz@68;;962110,8q}ywuuk`VSTMEA:;;<9644>hZPP39fjqtˆƒ}zroqslcftxofe_XQJE@>@=<7*$$$$&--.,),Gdeg^[[dqy…†‚}{~wa<04.+6FFD?CLL^`\s|}{[FGLFG@7?@=A[s†ypnjhgggghjlnmmkf]UNGHKORUVVXXXXYZZZZZZXUPJD>:989:;<BGNV_jt}‚†‰Šˆ„€}yxxx|€„ˆŠ‹Š‰ˆ‡‡‡…ƒ‚€ƒƒ„ƒ„ƒ„yvtsrsstssromfaYOD?AGR^jw‰ŽŽŽ‹Š‡†††‡ˆ‰ŠŠ‰‡€vj]TT\entwtsppollnnmmmnprmw—”‹‰‡†…†ˆŠ‹‹‹‹‘Ž !!""####"#$$%'''(())**+,,---....//.---,,,+****))))))))))))))((((((((''''''(((((((())((''(((())))))))))))))))))))))))())*)**++,-.,-..00111122222212111111110/////...-....-----..-....////......----,,./DmLB@EQ†¨­ª©  ¡¡ž¬¯¯¥ ¢›‘’“vnaenihfep€‚l`nv}ƒ„yT.4>D>?@?@@IEDM>:AFOIx‡}vsyz‚ƒuttpWa}wm{”•˜˜ŽUBEdš—‹r…~A77998432/0.G{‹yptpom`ps[:F@:;;;:8=]\PSA^jnx‰Šƒ~zz}|n__^iwtmeaYXUQKGDB>2'#"$#*1..+*+K^_aT\Ya`m{usyzzrjT504>?=978>Qlkb]]csi[NJFOPI?=@>A[x‚rlkihgffhjlmmnkc\VNLIKOSTVVWWXXYYYYZZYWUPHB=:87:::=CIPXakv~‚†ŠŠ‡ƒ{vvwy}…‰‹‹Š‰‡ˆˆ†‡……‚€ƒ‚ƒƒ„ƒzwsrrsrrrqppme^XNC?CJValy„‹ŽŽŒ‰‡†††‡ˆ‰ŠŠŠ†~tg\TW^gqvvtromlmmmmmmmomo‚“•ŽŒ‹ŠŠ‰ˆˆ‹‹‹‹ŽŽ   !!""####"#%%&&'((())**+,,---....//.---,,,+****))))))))))))))((((((((''''''(((((((())((''(((())))))))**))))))))))))))()++**++,,..-///00111122222212422222110/////........-----.......////.......---,,./=TGCDTt›³²£¦¨¢¤¥£ª§¥ž—˜¢¡•“Šqdcdimgfkuyt|`kv}z|j<,29?>?@???BFHJA<>AJMLy‡}uvz†ˆxl[V\w€†‘Œ‹“cCCOŒ ¡–^‚?78977744566M”‰~qŸ—•†~€P;DD<;:<<;S\NWeqs‰ˆ„€ƒƒ…xg`_^`bb_ab]XUSROMHF<)$#%$%.2/.++2N\_WGQ[]]amzywwurhijZJF>.6;5+*4T‚Š‹‰~g]SNPVNLM>8=>EZƒ~sigefhfijkmmmjf_XPMKMQSTVVVVXXYYYYZZXVSNGA=::9::;>DJQYcmw~„ˆ‰‰‡ƒ}yvvwy}…‰‹‹Š‰‡ˆˆ††„…€ƒƒ‚{utssttssrqpme^VLC?DKXcn{…ŒŽŽŒ‰‡†††‡ˆ‰ŠŠˆ„|rfZSY`kswvtpponlmnnllmmrŠ–’ŒŒŠ‰ˆŠ‹‰‡‡‡‰ŽŽŽŒ    !"""""##$$$$''('(((***++,,--......--..,,++,+++**))))**))))))))))(((((((((('&((((''(((((('''(('(())))))))))))))******)(****,-,--../00/.002011333322243333331100000/..//..--.----..-................---+//>FFCNq„¦²±˜š­®±²¶·¯¬£™’˜–~vi[ojdehnvz‚‚{jfr{{x_1,01:CDDA>=<9CJH::=HMCR†„|y||ƒŽ‰kHQTk€’˜“‹ˆ~mJCDv™ ¡Œs“v?:;;<>?@>CB2V  ‡}“—˜„opkU27?D?;<=<J_]gpo}ƒƒ††…Š‰rcbdfceb^UNTTURRPPNKC/%#$$&+442/-5DP^ZGCIW]\\ar~yqhimievhH:-0064./4R‹Š…a^r|viXKGCEGBA@Am„qjhhfgijlmlolg`YRMLNQSTVVVVVXZZZ[ZZZWSMF@=;::9;>>DLQZeoy~„‡‡†…|wvvx{}†Š‹‹Š‰‡ˆ††…†…‚€€€‚ƒ‚|wstrrrsssppmd]TJCAENZer}ˆŒŠ‰ˆ‡‡ˆˆ‰‹‹‡ƒ|qcXSZbksuuspnnmnlmmkmlv˜’‰ŠŠ‹Š‹ˆ†…†ŠŒŽŽŽŒ      !"""""##%%%%''(((((***++,,--......----,,++,+++**))))**))))))))))(((((((((('&((((((()(((('''(('(())))))))))))))******+*****----..//00/0012322333355334433331100000/////.......-...-................---+.09AEOp†°µµžŒª¯³µ¹¸³­ ˜’•š—”{zjbi`acst|€†‘~RbpxuX,(+17<@AB@>><;AA<=;AKH9ZŠ†}{{€†‹EIV_xŠ“™š—•‰tqQDEWˆ™–v‚JBBCDFDC@==92n©¥¢›~ˆ…|yg[IA7548?@;<:Cahkqv„…‡ˆŒ’•€e`ghjjhdd^M;=LRPPQPMI>*""%'*056425EQPRF@FHP[\_[bnhfcXQRYciK301./2/,-8o„€€rv„††…xM=FB?CELbsxmjgighjlnnojg`YROMNQTUVVVVVXZZ[\\ZYVSMF@<:;;:<@CHMT\gpz„‡‡†ƒ|wwwx{}†Š‹‹‰ˆ‡ˆ††‡†…‚€€€‚‚€}xtsssrttsqpmd]SGAAGP^ju€‰ŽŒŠ‰‰ˆ‡ˆˆ‰ŠŠ‡ƒzn`UV\dmsuuspnmlmllkngw—‘ŒŠŠ‹‹ŠŠ‡„‡ŠŽŽŽŽ‹"!""!!""######$$$$''''(((***++,,--......--,,,,,,,+++*)))))**))))****))))(((((((('&''''(())((((''''''(())))))))))))))******+*++,.,--..//01111112332443344444433332211000000//..........................----,,,/<DUt…Ž¥³´·¡œ¡«¥©©§¨£›’‹‘’‰|xqggemnqt†‹š ›SRjutR'(+.86:IDA?=<:9=:=;?GMDF{‡{y€…‹|GOXzŠŒŽ‘““yaFCDi™˜Š_DA?=?@=9:7R`B…®¢•Š‰ŠŽqhiZQC864324>C?<AWkntz‚…‹š˜igffimpmkf\B00>LRQRSRJ7&""'+,3659:@KROD7<AIPTWW]`cY\\H=72:GWO6//21/..I_gx{y{|~‚€wkobT>CHEEGEPPS^cgghkllmolga]TOMNRUVVVUWYYYZ\]\\ZURLFA>===<>BGLPW`irz€„‡‡†ƒ~yvxxy|}†‰‹‹ˆ‡†‡†††‡…€€€}xtqsrsttrqljd]QE?BHT`kx‚ŠŽ‹Š‰ˆˆˆ‰‰ˆ‰‰†‚xm^VU]fotusqpnnmjikjh~–—‘Š‹ŒŒ‰‰‰‰‰‹ŽŒ‰"!!!""""######$$$$''''(((***++,,--......--,,,,,,,+++*)))))**))))****))))(((((((('&''''''''((((''''''(())))))))))))))******+*++,---..//001111123234444444554433332211000000//....................--..------,,,/?Qo†‰˜®¦¥²p~¦Ÿš¤¬© ™Ž…“Šˆzsljckqut}…ŒŸ©­nJejhL*+&,.>MKJBAA?<;>;;=>DHFFwˆ~{{}ƒuJRv‡…„€‡ŽyrNFCKsrLE@?=>=<::5GdX©›—ƒ~‚€f[PMMC6643126>IHBE`osx€ˆ–“sqkkjklpspjX9./3BOQRRPA-%$'+-0;?BABFGHLB89>HOQNVYYXOC3,.1334BOO:7618;6N=<Spuyzub]kqq…m>LE>HHKMNQUV_dilnnnkgb_VQOOSVVVVUWYYYZ\]]]YWRLFA@?>?@BEJNR[bkt{€‚……„}yvwwy|ƒ‡ŠŠŠˆ‡†‡††‡‡…„€~€€€~yssrstsssrnhaZQE?BKXcny„ŠŽ‹‰ˆˆˆˆ‰Š‰ˆˆ…wl\SW_hptusqpnlkmjil‚––‹‹‰‰‰Š‹‘Œ‰""####"#%%$$$$$%%%''''(((***++,,----....--,,--,,,+++*)))******))**)))))((((('''''&(('''''((((('''&''(())))))))***********+***,---..//0010011132455665444665444332222111000//...........-.---......--,,,,----,0Ce€Ž‹¡©š«—pr‘¥®®¬¬§ž˜„‡“Ž‚€ƒ}pifnrs{ƒ„“©®ŠG_^]G..3.-6G:>FCB@<>=<<<=BKLHzrzŠ‡€|{€…ŠlMc{€yndk}‚_EDBLcpTFEA>===;:814Zj¥“€yvmeWLCBA74334:CKSSSEGOUX\s…‡|€€zqmlopvwqiS4-005HRTQH8-*+,.2>IMNOONGEF:8:>BJOOTSI@-+A`z›£¦¥¥£”~k]WF2=@5?Yosyzj\ayŒŽ‡†JCG<EKEUcXVUSWZ_ekkmmg_XTRQUVUVVUVXYYZ\[[[XUOLFBA@@@BDHLRV\dmu|€‚„„‚€{wvwv{|ƒˆŠ‰‰‡††‡‡‡‡†…ƒ‚€~~~~~yusssstsrqlf_XOE>DMZeq}…‹ŽŒŠ‰‰‡ˆˆ‰‰ˆ‡„~tgZSW_irtuspollkljj„—•‘ŽŒŽŒŒ‰‰‰‘‘Œ‰#######$%%$$%%%&&&''''(((***++,,----------,,,,,,,+++*)))******)))))))))((((('''''&(('''''((((('')'''(())))))))***********+***,--..//00111133333355666655665444332222111000////../......-.-,,------,,++,,----,0Jx‘™“’‘™£œˆˆ©²¶ª˜˜Ž„„Šs{xtvsiqw|„ŒŒ—©°£RUWV@*+AC20037DA@@=?<==;;?DJG{vjŽ†|z†ˆ`Rfmc^^^k‚‰~H?CAABGHDB?=>;95225Td‚¥Ÿ€|vi_UTLD?834;?GRVY[XYYMIGIOU]izŠŒ†xihry~zmF.,0317IOI</.-.12GY[Z]^YTOG<76<AFJMNK=2)7Xy¦¶»»»»º»ºµ®ª™h/1540?Xku}€{w‚†‚s|mbAJEHMNnuhbd[VVW]]ddda[UTSUVUVVTUXYYZ[]\\XUQLGCBABBDFKOTX_fov|‚„ƒ€}yvuwx{|…‰‹‰‰‡††‡‡‡†††…ƒ€~~~~~zuqqrssssplf^VMC@EQ]gs~†‹ŽŽ‹Š‰ˆˆˆˆ‰‰‰‡ƒ|sfYT[ckrrtropmkjkk‰˜”‹‹ŒŒ‹‹ˆˆ‰‘’ŽŽŽŒ‰$#"#%%$%&&%%%%%&''(((((()+++,,,,.......-,,,,,+++++++**********))****))))((((''''&&&&&&&&''''''''&&(((((()))))))*****++++++,,,,--////112233433444456666665666554433221010000//.-/+.--.-----,,,,,,,,,,,,,,----+0[†—›ž“‰“–š §¬­¨‘™Ÿ‘‰Šrwvwz{rx}„Šƒp®¥XNPJ5(*7C/-0007CE=A><;;9;@EKH|~sj„Šƒ}wzˆƒZ_d[\]\ew‚‡o?@A@?BFDB>=;98400;Ub|›|pskXUPE997<CJOTVYX[]\`ZJDDKS\i|–waZu…ˆŠŠp6-026628DA1,0221<Waahqm`WPF627@IJLH<3,0>ZzŽ¤»¾¾¿¾¾¾¾½º·´°ª}9(024?Mdtw‚ƒ„||‰Š‡LHHOSPZtkjie`]YYZ]^]YWUUUUUUUVWWXZZ[\\[YUSMIEDDEEGJNRV[bhpu}€ƒ„‚{wuvvx{~‚†‹Œ‹Šˆ‡‡ˆ††‡‡††„}{{}}~{zvssttssqojd^UKCBIT_jw‚‡ŒŒˆ‰‡‡ˆˆˆˆˆ‡‚{reWS[bkrvvqolkihk‰—“‹ŠŒŽ‹Š‰‰†ˆ‹‘‘’‘ŒŽŒˆ&$#$%%$%&&%%%&%&''((((())+++,,,,.......---,,,,++++++**********))****))))((((''''&&&&&&&&''''''''&&(((((()))))))*****++++++,,,,--////1122334334444566666656665544332210100/0//./.8/,,------,,,,,,,,,,,,,,--,++2g„ œ™™‘‘Œš£•“¦¤¥¡£’Ž“Œ‰‹”‚yy|~ywtv|{a3›ˆLPKE/'(,.,,+.16;FA?C=?<<;<AFEy€smoŒ‚|{~„ˆrSZRUWYfv€€†‚U??=@CCCC==864100=R_y{plj]JJA457@JNSTYZ[\^_bbOEFLR[i{™š{bmŒ˜—˜Ž\--13775353++1449T_emx|ueYJ>64@MONH6.,=HWvŒ¦¹¾¾¿¾¾¾¾¾¼º·³°®¥„8.4348Uhg~z}~‚‡Œ{hGDNNNOyxkhjhgojd_][\YWXYWUVVUVXYZ[\]]\ZXURNIGGGHHJNRVZ^dlrw}€„ƒ}zuuvxz|ƒ‡‹Œ‹Šˆ‡‡ˆ‡‡‡‡†††‚€}|}~~}}{wssttssqojd]TKCCJVbkyƒŠŒŽŽ‹Š‰‡‡‡ˆˆˆˆˆ‡‚zpcYT[dmtuspnmkijŒ™’Š‹‹‹‹‹Šˆ„„ˆ““‘ŽŒˆ(&$%%%%%&&&&''''(())))*+**++,,,,,,,,---,++,,,,++++************))))))(())((((''''&&&&&&&&''''''''&&(((((()))))))***++++,,,,,,----//0002223333344455565566665555553322110//...../MK0----,,,,,,++++++++++++,+,*+5h{Œ ¢¡Ÿ›š›‰Ž¢… §¦¢œ‰’Œ‰Ž„xv{}|yvokojW;]dNMPN@+')+-/;1.027JD==>@>?;;?@Djxsnu‹€||‚…^XWTT[jz}xx‡{M>@ABCGH=:8431.0<R\xtqmd]KH=875?MSY[\aa`abc]JKNSTZdu›žw‘ £ ƒA//0258:51--.049M^epz…‰pYB:99DQWQB//5CMc†¤¹¿¾¾¾¾¾¾¾½»º¸µ±¬¨ r018G5>XVou{|‚„{c†n>HGOPo~tmlhdedbb_[WUVWXXVVVUUWXY^`][ZZYXSNJIHHJKMQRV\`fmuz„{vtuvwy}…‰‹ŒŠ‰‡†‡‡‡†‡††……„ƒ€}}{}~}zwusssssqnicZPIDGO[cq{„ŠŒŽŽ‹‰‰ˆˆˆˆˆ‡ˆ‡†€xmbVV]fnuwsqolml‹—“Ž‹‰ŠŠŠŠ‡†„‚~‹““‘ŒŒŽ‘Ž‹‡'&$%%%''&&&&''''(()))*++**++,,,,,,,,---,++,,,,++++************))))))(())((((''''&&%%%%%%&&&&&'''&&(((((()))))))***++++,,,,,,----//0002223333344455565566665566553322110//.....,),.------,,,,++++++++++++,++++6f{‘££›™š›–‘…¢™œ§žšš•“‹‡Œƒzvuyyxrme\WQJPNNMPK<+'*),0.+,344459>>@@?=;=A?_‰vnln…“‡~{}ƒ‹pQPU^dq|xsl}‰kB?CBCFD=:7521/0;MZtz~xsh\YSF>?:5;PWY_dfqslf]XWVLLQYao‡™ —›žž›Œa130146674421036I\eow|ŠŒl:7:;<<>@=70/7?Ef—¶¾½¾¾¾¾¾¾¾»»º¶³­§ž›–U0LW@0CBaYm€}€xFM~[?EKNV`^URJIIJLMRQMKJOSWWUVTWYVT[dee^Y[_]VPKIJIKLORUY^chov|ƒ~ztsuvx{}…‰ŒŒŠ‰‡†‡‡‡†‡††…†…ƒƒ€~~~}zxutssssqnicZPFFHP\es}†ŒŒŽŽ‹‰‰ˆ‡‡ˆˆ‡‡†„vl_VX_gpuvsrpknˆ–“Ž‹‹‰Š‹‡…„ƒ~t~Š‘‘ŒŒŒŒŽ‘ŽŠ†''&&''''''''((''(((()***)*++,,,,,,,,,,,,++++***,++**********))))))(((())((((''&&&&&&&&&&%%%%&'''&&''(((()))))))*))**+++,,,,,----.0/102223433444555665566665555543311110///.-..-..----,,,,,,,++*)**********)*)6j†—Ÿš—•š’‘‰›—™›˜–‹ˆŽ“ŒŒ‹„yz{}wpbgaPEKQONOQLJ<'&()+-*)*,+/31619>>A>=?>?P‡uonlrŒƒ|~|„‚UASdpyzreY`xy\CDB?DH>:74310/:L`ƒŽ…maVTSFBB>8<SX[ahnv†ywrvgbfegix›˜š™—”‘†nD6667986234453E`flu|ƒŒ‘b27765567530047Bu¬º½¾¾¿¾½¿½¾¼º¸µ²«¡—’~MKUT19TjX^}~~€zyƒwMENNeWSTRPUYVXWVQONMOWUTVX[\[TWZ\b^ZZ`ddf]OLKLLMQTX\`fjpv}~€€|yuttwx|ƒ‡‹Œ‹‰ˆ‡†‡‡††‡†††…†…‚‚}~~}|yuvttsqpmgaZPFEIS^hv†ŠŒŽŠ‰‡††‡ˆˆˆˆ‡ƒ|tj]WYairvvtqlm‡˜‘‘Ž‹‰ˆˆ‡ƒ‚…|jn€‹‘ŒŒŒŒŽ’’Š…''''''''''''(((((()))***)*++,,,,++++++++++++*,++******++****))))((((''((((((''&&&&&&&&&&%%%%%&''&&''(((())))))))))**+++,,-,,--../00002223444554555665566665555543311110///.----..----,,,,,,,++*)**********++/6kŒ™™–œ‹˜’‚’•˜™–—“Œƒ„‚Š†ƒƒˆzztniajcK9COOQOPOH8'(()***)*,+.5;JG9:@@=><9;Bz‚wwuwƒ’Š~€ˆqXahv{wn\G>HZeWECEC@@9731/0-;I`Š›ŒcGSTVHDGCCHRX_hjn€‘‰ƒwf^elgmrutw‚‡ŒŽ‰„~wpV=:9898543258:Yttuxƒ‡‰b675443020..266EqŸ´»»½¾¼¼¸´¶ºº¹³®¤™‘Œ†ZRLUR14MO=h€€||xnTKLLMNPMONLDLXUMECCEGVRQ[YSYWceemkhhfmoh^QMLNNORUX\bhnsz~€‚‚~zvtstwx|ƒ‡‹Œ‹‰ˆ‡†‡‡†††††‡†‡†„‚~~~}yusrrpnomgaZPIHMW`kx†ŠŽŽŠ‰‡†††‡‡††„{si\W\ckrwwqplƒ–’Ž‹Š‹Š‰‡„…|ddtƒ‘ŒŒŒŒŽ’Œ‰†((((((((''(((((()))))****)*,,,,,+*++++*****)(+*)))**))))))))))))((((''''''''&&&&%%%%%%%%%%%%&&&'&&&'((''))))))))))**++++,-,,..//./1011112344554555666666555555432211000/...---------,,,,++++***************0@>h˜“–š‘–•Œ—›š–‹†‡‰ƒ„……Š}yqqpmlgcTJKKMNQNJH7'((())+(*.,+,7P=83<:??=<9;l‚‚ˆ’„~‚„‚YitxzxjWD97:KaTB?CCCA841/..<KZv˜žˆRGGWXMHCBLLV[\eu…–œ“{`SMbyƒŠŒŽ…tit|vsmhaS@<;98766656:Uw~{„…ˆ†c:863200/-.049<JUo‘¤¬³¶±§–š¨®°¯¨ž’‹‰Š‡XIJGWI07E4Kty}wep>LP^c]_`VRHZhhlke[SUgRGX_Zcia[gmlc`Xkl^SOOOPPRUVZ^bgnuz}‚}yvusvxx|ƒ‡Š‹Š‰ˆ‡‡‡‡††††††‡ˆ‡…ƒ€€~}yusrrpomjg_YPIJQ[epy‚‡ŠŽ‹Š‰ˆ‡‡†‡‡‡‡„€zqf\X^fnuvwrp~–“‹ŠŠ‹‰…†ƒƒ{d^iwƒŽŽŽ‘‘Œ‰ˆ((((((((''(((((()))))****)*,,,,,*+++++*****)(+*)))))))))))))))))((((''''''''&&&&%%%%%%%%%%%%&&&&&&&'((''(())()))))**++++,-,-,,--./1011112333555555666666555555332211000/..---,--,,,,,,,,++++***************,.0a†’”–Ž•••—››˜–ˆ‡€Žƒƒ‹ˆ‚‹…wywvrme^UNLIKNNNKI:)((())**+---,/3+0VDB=?@>;=\“Œ‰††‹—€}‚‡qrwwytgTC8548LZODAFDD=51//.<Mez•™s4@LNPLA<?BSX]dp…˜ž–tum]Rbx|ŠŸšœ”{nrtrlfc[YPDA>=:97779:Mv„€€„‡…€g<75631/.-/39;CU_fks{‹••Š}w€‘š›—‹‡‡†~ZDDIKQP<<Mm}wx~~l_‰‚CMYccekhYP\flmmnlga`XPJM[Z]ZVOVbeUHA]dWQQOPPPRVXZ^diov{~‚}yvsuwxz}…‡Š‹Š‰ˆ‡‡‡‡††††††‡‡ˆ‡ƒ‚‚~|xusqqqomjg_XOILS]gp{„ˆ‹Ž‹Š‰ˆ‡†…‡ˆ‡†„€ypf\\bipwvuqy””‹‰‰‰‡ˆ…„„zd^`jv„ŽŽŒŒŽ‘‘ŒŠŒ((((((((((()))))********++++++++++++++******))(())))))))))))))))((('&&&(''&&&&&&%%%%$$%%%%%%%%%%&&&'''&''('((())))**++,,,-,,-...000110111233445556565565465554442120//.-------,,,,++++++**++****+,(*))****))),Z}‹”Ž‹Œœžœ™œ•‰ŠŒ‘’‹‡Šƒ‚‹Ž€}xvtmd]RE>BGMMKHH>-(')*(()*-.,+(),.:CP;?=><>J‘Š‡†Œ“˜•ˆ~‚…duxvpcO>777:EV\O?>B?@:40./:Kg„’—h.6QdTHB>>AE[ad{‘—‚vx{p~”–‹€š¤¢¢ “~rmhgd_ZZTOIB@>=;98:4[‰ˆw{…‚|{jD6643/../15:?Ph}~ywma_becdlx€ƒ‡ˆƒ|{ncY?@7<7EZBAbvxu|‚€dL`OMijgg`^[_hjmlnnkha^__WYZXUW\]ajhB08WoWQQPQQQSVY\`djpw|€‚‚}yttvxy|ƒˆŠŒŒ‹‰ˆ‡‡††‡‡‡†‡‡‡ˆˆ‡„‚‚‚}xutttqomje^VMIOV`iu~„ˆŒŽŠˆ‡††‡‡‡‡††ƒxpd]]dksvuou–Ž‹ˆ‡‡ˆ‡†„ƒ~g__enz„‰ŠŒŒŽŽŽŽ‘’ŽŠ‰‘((((((((((()))))********+++++++++++*********))(())))))))))))))))((('&&&%%%&&&&&&%%%%$$%%%%%%%%%%&&&'''&''''((())))**++,,,----.//001110111233445556565565554444322100/.--------,,,,******))**))**/2))))(())))),Pm}ŽŒŽ‹ˆ‰››šœ˜‡‡Ž‰Š‡ƒ‰‘ƒxwwtoe_UD@CJNIKHF=-(')*'(((*,++.-3+).8<>?<:<@“ŒŠŽ‘•–—Š€…Šinwup`LB88<DZf_TMDB@?;51//;H[}’’Y2Srx`LEA?@AOfnw•Ÿ–‚s‚¥«Ÿ¥¦¦›—®°ª¥—‡{rie`]ZVRNKEA==>??>;Z…~sw~€{xnQ8753300158?BVvŒŽ‡}iZVROMT[^`d`]\ZbtYB?=B4=AK7Kegnz‚…h&bqSZ]dklfhcbhopppkgd__\ZXYYYZTT\^X6(1OaURRPQQRTXZ\`fkrx}€ƒƒ}zvsuxy|„‡Œ‹‹Š‰ˆ‡‡††††‡†‡‡‡ˆ‰ˆ††„„}xtssspnlie^VMLQXakv~„ˆŒ‰‡†††‡‡‡‡††ƒwod^`gnswttŠ•‘‹‡…†‡ˆ†ƒ…iccbfq~‰ŒŽŽŽŽŽŽ‘ˆŽ”))(((())))))))****)*********++,,++******++))))((((((((((((((''''&&''&&&&&&&%%%%%%%$$$$%%$$$$$%%%&%&&&&&'''''(((()))*)+,,,,,,-...////01/11222445555654444433333201///..----,,,,++**++++***********)))'''''''()+Ik~†„‡‰…‚‹˜’‹ŽŒ}‡‹Œ‰ˆˆ„€€…’qtyslhaSLHGF<@IGE</(()*)((**+,+-,--*,/54=<7;L–—‹’–••“†€ƒ‡‚ruum[K<87D_lrh]WOF@B?810-8D_rŒˆPNwŒƒoSJHAA>NUe|…‹’ ­µ²²²¬¥ œ®³®¤ŸŽ}slec^YWXTMHB@@BCB@Cb‚†‚xw|}yvo[@:;;<7257<@E[xŠŒ‘‘‘‚qjc\VSMGFHHLXgsoLGI>G8>EDG?HWay€8E’’€IXVQVckb]lmqtqmhd`][ZYXXYZWZ]\VE?LWYUQPQPRRUY[_chltx|€‚‚€}zxwvz{}€„‡‹‹Š‰‰ˆ‡‡††††‡†††‡ˆŠˆ‡…ƒƒ~zwssssonlgd\TMNS[cmx€…‰ŒŽ‹‰‰ˆ‡‡‡‡††††ƒ~wme`bhovuq†“‹‰ˆ‡ˆ†…ˆkeebbhv‚ŒŽŒŽŒ••***)))))**))******)***********++))***)))**))))((((((((((((((''''&&''&&&&&&&%%%%%%%$$$$%%%%%%%%%%%$$$&&&&''''''(()))))+,,,,,,-...////0010122233555554444433333310////..----,,++++))****))))))))))*))&'''''''()+<sƒ‹Š†‹‚z~Ž–Œ‹z‚‰†~nv†„ƒˆ}qqqqocYQOMHF@AJEC>0'()*)('+**+,*)*)++-.17:@Kkœ™‘‘–˜—‡’Žƒ‚„‡ˆurtm[ICCCJWeok`UPPIAA@:5/2C[qƒyNc‡‚zzeG=E>NVP]yŠ–¥±³µ³°­«¤›”ª­¦¡¢–‡tnjda\bpg\QHEDDDDDP|’ƒ{z~wui_\Y]\_P48;>ABWo‚…Š‘Œywupcca]\[^afmpfBA=@BC;LAIG?Rgv€peŠ“„PPWKJVOKWqrrtqniea^\[[YY[\\\\\XVZ[XUUSQPPRRUX\_cinsw|€‚‚|yvwx{|}€„‡‹‹Š‰‰ˆ‡‡†††††…††‡ˆˆˆ††ƒƒƒzwssqqonkfbZSNPU]eq|‚‡‰ŒŽ‰ˆˆ‡††††…………ƒ~wmdcgirwr|’‘‰ŠŠŠ‡‡„‡…rhifbbjx…ŽŽŽŽŽŽ‘Œ‘˜•))****(****())++**))******++******))))((((((((((((((((((((''((''&&&&&&%%&&'%%%%%$$$$$$$$$$$$$%%%&%%&&&&&&&''''''''))(*,,++,,-...//00111012222244555544332233220./..-----,+++**))))))))('(((())))))''''''''&(),2k‹ŠŒŠƒz„ŒŽ•Š}}†‚sgd~‰†‡ŠŽq^_^`gdQQSUMLNNJFE?1'')))))(+(),*+*+,-,,047Uz‘•’”•—–›zŠ–ˆ„††‰ƒ|{vqssu}ˆ‹‚jY[ZUNGFGA72?Njxl\„•—‰„‹‘tL@>JULRmŒž¨±³°¬¨££¤¢Ÿ£œ•’‘Œ€smkhmmjsjcZSKHHICBN}”˜Ž‚€}wriiotzzve=68:>BNaz†‹„zx{{zsfdjg`\_fgjnZ[[X96:>MKCFDO`y|[rŒ’„TGRK6GMelprtsqoke_][[ZZZ\\[\][Z\ZWWUSQPPNRRUY]_cjnrv|€‚‚€~zxxy{|~„ˆ‹‹‰ˆˆ‡‡‡††…………†††‡ˆˆ‡†…ƒ€~yvrqqqonlgc\RPTY_hr|ƒ‡ŠŠ‰ˆ‡‡‡‡‡††……„~wmfegmuv{‘Œ‰‰ŠŠˆ‡†ˆ„oiiidbeozˆ‘’ŽŒŒŒŒŽ––•))))))(****+++++**))********))**)))))))(((((((((((((((((((''''''&&&&&&%%&&%%%%%%$$$$$$$$$$$$$%%%%%%%%%%&&&''''''''))(*,,++,,-...//00//1012222244444444222233310//.------++++**))((((((''&&&&''((''''''''''&()/3N‰Œˆ…€|‚†‹’Œ‹ˆwinnft‚‹‡Š‹ŠaOOPTV_]OMONKJKHGE?1''))*#*+**'&(+++*+,++.An’šš”’“•—–•z•Žˆƒ†ˆ‰‡†’”–•’”——’‰uRPRXRMGEJC64Jmˆw{”™›‘’Ÿ£Ÿ…hiZO@Mf«°°²­¥  ¡¬¤Ž £¤¤¢ž“i[do€vqnf_SJHKKGB@]Œ˜Ž‚€xuxxqv€‰„sP46;??DSiy}qlqusqmgcgf_[_cbgb\`seB7;=>FJQG;Nx{d{‹Š‚\IO>+@T]dqqrssolfa]\\[[[[Z[[\\\\ZXUUQPPPOPRUY]_chlrvy~‚€~|yy{{|~†‰‹‹ˆˆ‡‡‡‡††…………†††‡ˆˆ‡†…ƒ€~zvsqqqonlgb[RPTY`is~ƒ‡‹Ž‰ˆ‡†††††††……ƒ}wmfgjqu{‘Š‹Š‹Š‡††‡tjnliecgq~‰’‘ŽŽŽŽŽ‘’—””**))))*++***++++**))******))))))))))))((''((((((((((((((((''&&&&&&&&&&&%%%%%%%%%$$$$$$$$#$$$$%%%%%%%%%&&%%''''''''(())**)+,-,--.000011101222223333333322112322///.-----,++****))(('''&''''''''&&''&&''''''&(,1;Ek†‡…„ƒ†ƒ…‹ˆ‚ƒ„‚‡„qv‰ŒŽŽ‚[NLTXTGWb[ONNKJKFC=/%'(*,Im8#(,,))+,,././2T€˜ ˜’’•š––~{‘•‰„„ˆ‹ˆz’”˜™—–———–…`VXXZ\UJFGB:>a‰“•—–š¤¥¤ “†“š†_@OŒ¦®°¯­¢œž ¢Š¤¥¦¥ Ÿ”[<J`z‡~sleZJFHLKGADo“uz…„…ƒ}~ˆ†‚wa55:<=@HUflkcgif```[Y\][Z[_`_JQ\g`I:C?7ACFRGHex„ˆ‹…}RJT=-GA05eussqnjfa^][ZZZ[[Z[\[[\[ZVSRMMNNORUZ]`cejquz~‚€~|zz|{}~†‰Š‹ˆˆ‡‡††………………†††‡ˆˆˆ†„‚€}yussqppnlg`XTPW\clu~„ˆŒŽŒŠ‰‡†††††‡‡†„ƒ|wmggntzŠ“Ž‹‰‹ŒŠ‡„††vllmliffju€‹ŽŽŒŒŽŽ––”’********+*****++**))++****)))))))(((((((''((((((((((((((((''&&&&&&&&&&&%%%%%%%%%$$$$$$$$#$$$$%%%$$%%%%&%%%&&&&&&''((())))+,-,--.////1110122222332233221111110////------,++**))))''&&&&''&&&&&&&&''%%''&&''')18EYru}…‚‚ˆƒ~{z€|†˜¡ŸŸ’“”ŒŒ‰pWOQ]cZXUii_LFLKJGC:-$&'))9=(&'(()(*/0-0/-=a~›Ÿ”’”——””ˆ|}ƒ–ƒƒ„ˆŒ‚‘•™–˜™™™’rW[Z]_`YMDDA@n’’—–˜¤ª¦šs…š ¥Œ`l›ª¬¬©Ÿ™™™œ”›Ÿ–—šš˜”Y<AJr•}pibTJHFDEHAP}…€‡‹ŒŒˆ€ƒ~{tg>257<<AFR\][^`\VYYTOSTWXZ]WEBLU_la9;631=Y[eWVp€†‡†ƒ…cIJE8=@4=ftttrnifa^][ZZ[[Y[[\][[ZYUSPOOLOQRUZ^adgjptx}ƒ‚€|{|||}€ƒ†‰‰‰ˆˆ‡‡††………………†††‡††‡…„‚|xtssqppnif`XRQW\dnv„ˆŒŽŒŠ‰‡†††††‡‡†„ƒ|wmiimuŒ–‹‹‰Š‹ˆ……‡|lmonmkhhnwƒŒŽŽŽŽŽŽŽ“—””’**********++++******))***)**))))))(('''''''(((((((''(('''&&&&&%%$$%%%%%%%&%%%%%%%%$$$$##$$$$$$$$%%%%&&&&$$%%&&&'''''(()))+++,,-....011111113221123212233000000..----,,,+*+**)))(''&%&&&&&&%%&&%%%%&&''(&')*+7F[u{tdmqtxullkls€œ¢¤¡”•ŽŠŒz^WY]aba^fglp_[SMHHB7*'''((&'''''&'((*+-/,5Ldx‘œ—“”˜•”‘ƒ~|}“Š†‚…‰|ƒˆŽ’•—˜——Šrdac\[_]VJB@?^’–‘’’™’h[q—¡¦¨™}ž¥©¤™–•”—ŽŽ›•””“•–“…WACJaœ—‰{qjbQGBAFHD@a”ˆ“Œ…€ƒ€xtohH//28;>@CJRTWXWUTSPNQSTWYP:+<HNOSM@G?94@WJQON[p{„‹‰„eKCE@38E^pttsqnie`]\[[\\[ZZ[ZZ[ZZWSPNMNNOPSVZ^`chjorw|€ƒƒ€~|{|~€‚…ˆ‡†ˆ‡†††…„„„………‡‡‡‡‡†‡…„‚€|xusrqpomje_XSRV^enx‚…ˆ‹‹Š‰†…††††‡‡†…‚|vnkko…”‘Œ‹‹‰Š‰…†Šnmnomonilqy„ŽŽŽŒŒ‹‹‹Ž‘–•”‘Ž**********++++******))**))))))))))(('''''''((((((('''(''&&&&&&%%%%%%%%%%%&%%%%%%%%$$$$##$$$$$$$$%%%%%%%%$$$%&&&'''''(()))+++,,-....011111113223321110000//////----,,,,+*)**)))((&&%%&&&%%%$$%%$$&&%&&%&(**-5EYnqa`[X^cd\SX[\]s¡˜””‰ŒŽ€`UWeiidfdghrzqmhe]KA0&&''''&'''''&'((*++,/:Vht–“—˜”’Ž~yyy…•†„ƒˆŽ…‰’•—–Œˆujgffd`^\ZQF=;[–‘ŠŽŒˆ‰‚pfa\e£Ÿœ˜Ž•Ÿ¢––’‘‰‡—’““’‘‘‘ˆ{gMNf¦£•‹zoeUHDUt‰€hjyŽ—’’”‰‚€yrkifQ/,./58;=BIMPQQPPQONPRSQC00>?8;>:?CC=>=AJGIX[J^kŠ†ƒuXFIRD<NYlttsqnid_]\[[[[[ZZ[\\ZXYURONMNNNOSVY\`cfhmrv{€€}}~~ƒ…ˆ‡‡‡‡…………„ƒ„„……‡‡‡‡‡†‡…„‚€}yrrqqpomid^XUUX^gpx‚…ˆ‹ŒŠŠ‰‡†††††‡‡†…€zsnml€“‘‹Š‰‰Š‰‡…ˆ‡qnqpopomjlt{ˆŽŽŒŒ‹‹ŠŠ’–•”“Ž++++++****++++******))))))((()((((('&&'''''(((((((''''((&&%%%%%%%%%%%%%%%%%%%%$$$$$$$$##$$$$$$$$$$$$$$$$$$$%&&&'''''(((()+++,,-...-/11110002112210/10/0...//.---,,,++++)))))(('&%%%%$$$$$$$$$$$$%%&&%'&&*.4BZrzjb^VWY\YOCKQTZm‡—†‡’Œ‘gUR[ibdjhcdjtpumplwxgD%'&*'('&''('&)()(*+.7EVft”’‘”–”‹€|„”‡‚‚€†‹‹ƒ•’“““‡„ƒ‚ƒ~xxvpb]ZQH??}›ŠŠˆ„|m\_`_cx•™¢¦žˆz“š—’“‡s†ˆ‘•“Ž‹ŠŠˆ€|`Tyª£•‡vk]LDK]x‹’‘~›˜‰‚|xtnfa^V4-.)*.38<BFJMMMNMNOKH?3,/7BF7?FF@KOLI>BMI@LRT_bt†…xKAJZaPZopqssqnje_][ZZZZZZZZZZZXWTPNMLLMMNRUX\acdgjquz~‚ƒƒ€}~‚„ˆˆ‡‡‡†…„……ƒƒƒ„……††‡‡ˆ‡ˆ…ƒ~{vsqqppnlhd]XSV\`hry‚†‰‹Œ‹‰Š‰‡†††††††……€yrnkwŒŒŒŠŠŠŠˆ‡‹‰ulnmnpppmot|ŠŽŽŒ‹’”—”“’++++++****++++******)))))(((((((((('&&'''''(((((((''''''&&%%%%%%%%%%%%%%%%%%%%$$$$$$$$##$$$$$$$$$$$$$$$$$$$%&&&'%%'''((()+++,,-.../01111000211111021//.---..-,,,,++++**)(()(((&&%%%%%%##########%%%%%&'',1@Vu|uf^WYfdWQLEIVU\dx{|ŠŠŽŽ†lZ]`kgiknlbhopkopshmr|d<),,)())(''''((**-;NZbx“ŒŽ•‘Ž‰|…†…†”‹„‚€…Œ„|‹‘’‘”š¡—œŸ˜~h]\YPH=uœ•ŠˆnZ`ppknp‚•¦¡ˆŽŽ~s‚‰„‚†ˆ„~~phƒ¥œ™•‰yocRDCHnŽyš›‘Œ‰yskf^[ZV@,+('))+/479<????<81,*+.35EU>6;?EIK?BQNJ<LLNUV_hy‚„r<=ERb[`opqssqnje_\[ZZZZZZZZ[\YWURONJIIKLNRUY]`bdgipty}ƒƒ€€€€ƒ„ˆŠˆ‡‡†„„„ƒƒƒƒ„……††‡‡ˆˆ‡…ƒ~zvrqqppnlhd\XUWZajry‚†‰‹ŒŒŠ‰‡‡††††††††ƒ~wqkq‰ŒŒŠ‰Š‰ˆ‡†ˆŠ{mqqrrtvvwx}„Š‹Œ‹‹ŒŽ’’“–”“‘‘Ž++++++++++++**********))(((((())(())''('''''((((((''''''&&%%$$$$&&%%%%%%$$$$$$$$$$$$$$##$$$$##$$$$$$%%$$$$$%%&&&&&'''())*+++++-...00001101110011110.-----,-.-,++++**)++)((''&&'&%$##$$$$######$$%%%%&&(+1=UrzvsgUQ]qtc]]QIJ[bcspƒŠ†‡ŒˆqSPWlumpmpnmmsmojrtmfsr~‹`7%(+*++*(19-)(().;MZc…ˆŒŒ‰†‹‰ˆ‡‹ˆ•‘ˆ‚}}}„‰lHXbfw“™œ¥¦¬ª¦™Šwa^ZSLIj˜˜„}r[s‰|yz€‚€‘¡£—ˆŠˆ†‡†yop|‡‹„~„™Ÿ“‚vu‚›•’†zqj`PCT}Š‡€s…‘˜˜Œ†€unhaZWQNF0)(('('&')*))(('&')++.168=EJND>:=<HXUHI:0NMECRdj}{dNBBCMV`nrrsrqmid^\[ZZZZZZZZYYWUTQOMJJIKLOSVY[`ceeknry~‚„„‚€€€„‡‰Šˆ‡‡…ƒƒƒƒ‚ƒ„…†‡ˆˆˆˆ‡‡†ƒ~yurppppokhd]WUZ]bkt|‚†ŠŒŒ‹‰ˆ‡†††……†††…‚}wqo†‡ˆˆˆŠ‰ˆ„…‰‚qrvz||~€ƒ„„‰ŒŽŽ‹ŠŒ‘’““‘”’‘,,,,,,,,++++**********))(((((((((((('''(''''((((((''''''&&%%$$$$%%%%%%%%$$$$$$$$$$$$$$##$$$$%%$$%%$$$$$$$$$$%%&&&&'''())*+++++-...//./00/011110000/.-----,,,,,++*****)()(('&&&&&$$###"####""""##%$$&''(-6Nlzuqxsnvwwuib\G/@jos}nˆ†‰‰}XGNYuqsumks…vggmv~vflyv…Œa7$(+++*0>0')))-;NZiŒ‰†‰‹‡†„†Š†ƒ‡‹‘˜—‹{zvzˆ`5OYfqx’¥°°±©¡˜†nc^\PIc“™“•‰„v]u’”‹Œˆ„ˆ”œ •zx~‚}xtq’”‚mt‡˜¢ª¦¡–~ˆ‹ƒ|vqldXEg…‰Š…|“”…€wngb]UOIC:.(&'&&&&&'((((')****,.16:=CDLHG<59NG<;@G:3AIHTdw‚ve\VkhQV]fqrsrqmid^[ZZZZZZZZZYYWURONKJJJKLOSVY^_bbdhlqx}ƒƒ‚€€‚ƒ„‡ŠŠ‡††……„ƒ‚‚ƒ…†‡ˆˆˆ‰ˆ‡†„}yurppoomjfb\WUY_fmu|‚ˆŒŒ‹‹‰‡‡†††……†††„{vp‚‹‡…‰ˆˆˆˆ‡‰Š{yƒ†‡‰Š‹ŒŽŽŽŒŒŒŽ‘‘‘‘‘,,++++++++++**++****))))''''''''''''''''''''(((((())((''&&&&%$%&%%%%%%%%%%%%$$$$$$##$$$$$$$$$$$$%%##$$$$$$$$$$&&&&&&&()))*,,,,--......//./0000////..-,++,,,,,,,+*))))(((''&&%%%$##""""""""""""##$$%%%(+5Fdyxsw||zz{vtj_UE<Jdryuq‰ˆ††„lMO]ipszxwrmq€tqjgnyz}jozuz„‚xZ.+'*(()))+++.@PYp‡†‚‚‚‚}~ƒˆŠ‡ƒš“„zwusyƒ‹\GJRZk‡Ÿ­±®¯©ŸŽtd`ZTNaœ“•ˆt^v“ŽŒ’”Ž……”™phtxkt•¤ª¨‚ZPYk„—™”Š’™“ŠƒztqpneXEg‚…Š‹‡~Œ‹†wh[SPOJB9.'$&$%%$%&%%''(')('')-./792367?FRD564JOJY>3+1?P[cb^jjVWird\[`lqsqpmid^[ZZZYYZZYYYYVTQMKJHHJKMPSVZ\^`bdgkqv{€ƒƒƒ„†‰‹Šˆ‡†…„„ƒƒ€ƒ………‡‰ˆˆ‹†‡…„€~ysrqponliea\XV\`fmt{‡ŠŒ‹‹‰†††††……†‡…ƒ€{p~Ž‹ˆ††‡‡†‡ˆŒ…„ˆŒŽŽŽŽŽŽŒŒŒŒ‹‹ŒŽŽ,,++++++++++********))))''''''''''''''''''''(((((())((''&&&&&&&&%%%%%%%%%%%%$$$$$$##$$$$$$%%##$$%%$#$$$$$$$$$$&&&&&&&()))*,,,,--......//./00//////..-,+++++++++*)))(((('&&&%%%$$##""##!!!!!!!!""$$%%%*0Dbxwqv|~|zxtph\PHQaj}~jwŠ‚ƒ‚zWQWqymr{qqquytwu€op~yto_urbmŠŒŽrN3((()**+++4GT^xŠ…€{ptx|}€„„Ž—™•Œ€vpmqz„W:O]s‡Ÿ­°¬®§Š]IMNQNN_š˜š€jP\…‰ŒŽŠˆ…Ž“{jkox€•§«§£—{SJJGYƒ˜„Šš—“ˆ}sonnofPA]‚ŽŽ…{‚€…€tbG:4342.(%%#%%%$$$%$%%%&%'(*,/015?53/*+.2>^R?@QJ<QG-+4AZ_RTIOtr€vnSQ]hprqpmid^[ZXXWWXXYYXXUSPLJHHHIKMPSVZ\^`acfjpuzƒƒ‚ƒ„ˆŠ‹Š‡ˆ†…„ƒƒƒƒƒƒ„‡„‡‰ˆˆ‰‡‡…„‚|wsrqponliea\XX\`hov}ƒ‡Š‹‹‰‡†††††……††…‚~z|ŽŠŠ‰‡†‡‡ˆŠŒ‹’””‘ŽŽŽŽŒŒ‹‹Œ‹‹ŒŒŒŒŒŒŒŒ,,++++++++********))))((((''''''''''''''(('''((())((((''&&&&&&''&&&&&&%%%%%%%%%%#####$$$$$%%###$%%%%%%$$$$$$$$&&&%&&(())(*,,,,------..////..---------,++**++***))))(((&&&&&$$$####!!!!!!!!""""##$%%$(/>Wsxqtz||z{zzrjf[NIWivˆ}p€‚€‚iKNPcnnhikptuqfuxyposvkeX`plW—’‘mdg?2')))(*5ALYcˆ‚}}|vnpstvrv}„Ž’Œ†{urppz…WQ`rŠš®²°©C=DEDKPP[Š›šžšT:=ds{‚…{xy‚|h_aixˆ–¢Ÿœ›“~UFHOk‹–•’š”‹trskhkoaHFSlx€{rnyy~}cB40.,*(('&$#$$$%%$%&&%$%'',/1022473-(&&)*.E_PXYZYVI,+-9QPTL\y}}‚‡zSQOXcppqpmhc]ZXWWWWXVXXWWUQOKJGFFHJLORUY[^_`aeinty‚‚‚‚‚ƒƒ„ˆ‹‹Šˆˆ†…„„ƒƒƒƒ„„‡ˆ‰‰Š‰‰‰‡†ƒ‚|vsrqonmkhe_[XX^cjry~ƒˆ‹Š‰‰‡………………„……„‚||‘‘ˆˆ†…†ˆ‰‘’’“’ŒŽŽŽŽŽŽŽŠŒŒŽŽ‹‹‹‹Š‹‹,,++++++++********))))((((''''''''''''''((''(((())))((''&&''&&''&&&&&&%%%%%%%%%%$$$$$%%%$$%%##$%%%%%%%$$$$$$$$&&&%&&(())*+,,,,------..////..---------,++****)))((((''''&&&%$$$#"##!!!!!!!!!"""###%'',8Lktrrw{|zz|yxqlbVNJ[v‡ˆxuƒ}}€yYGGSinokekfjsmhl~rosohigGjnTn”†qhft?MD)(,*)2<LYf…‡zyy{uljnnjkknr‡Šˆ‡…zqtrnvƒˆe`v›ª¯¨wiQB==@PYZ[‡”œ…V8ASgw{vrpopspjls~‰–›—ŽŒ}T=>N{••—•Œ~cS\`befUHBFWswqi`jpuuS401/,*(('%$#$$$%%$%%$&(+-.12463220.(&%%')+<SXNVT\WH?/2@JORXR\lsyvmYMWnrqqmhc]ZXWWWWWWXWWWTPNIGFEEGILORUY[]]_aeikqw}‚‚‚‚‚ƒ…†ˆ‹‹‹‰‡†…„„ƒƒƒƒ„„†‡‰‰‰ŠŠˆˆ†ƒ€{vsrqonmkhc^[XZ`eltz~ƒˆ‹Šˆ‰‡………………„……„}Š‰‡‡‡ŠŒŽ‘’’‘ŽŽŽŽŽŒŒŒŒŒŒŒ‘ŽŠŒ‹‹++++++++********)))))(''))((('''(('''''''''((())))((((((''((''&&''&&&&&%&&%%%%%%$$$$$%%%&&&&%%%%%%&&$$%%%%%%%%&&%&&'())**+++----....--//--------.,,,,+*)))(())(((('&&&%%$$%$##""##!!!!!!!!!""#""$%(+5Gasqsv{|yyy{xusj`UJJc‡u}z{|nMEL]hiijebdgjmluw„rc‚‚xoiGPw_Ekdf[hhnvZ:+++4?KW`„„~vywvsljkhcdifinquwx|€uqnnrx‚lzŠ•¢žwawQ=7@Xnph`Ž””`9@ao†rmjikpnjkw†Ÿ¤œŒƒ}{wdHA=Mr„†‹Š†yM/3AQa_PJKUozrlb[dppkJ,/0/+*(('&&%$%%%&%('()+02121574.+*)%&')+)+7AFQQUMVgCA@JMRSMXV_]fk{toaKVirrpmgc]YWWWVVWWWWWVSOMHFDBCEHKNRUXZ]^^`dhkpv|€€‚„†‡‰‹‹Šˆ††………ƒƒ„„„ƒ†‡ŠŠŠ‰ˆŠ‰†ƒzurqqommjhd_XZ_agou|€…‰ŒŠˆˆ††…………………ƒˆ‘‹‡‡‡ŠŒ’’’‘ŽŽŽŽŒŒ‹ŠŒŽ‹‹‹ŠŒ’’‘ŒŒŒ++++++++********))))((''))((('''((''''''''(((()*))(((((((((('''''''&&&&&&&%%%%%%%%$$#%&&&&&&%%%%%%&&%%&&%%%%%%&&%&&'())***++----....--..--------,++++*))))(())(((('&&&%%$$##"""!""!!!!!!!!!!"#$$%'*3C[noov{{wruwvwutg]UJIiˆs|z|}bIGP`acfjffhcUNVYXcgQ]YWQVD>co]€‰dWg]hfYVI9/3>JVZ~„}zvuvrpoliecba^_agecby}qlnmlu‚}sˆ“RS[Q>:Jk„Ž…rc‰{‚pLQkvŠynifbejioy—¦žŽzvqqkM=:<Kcu…ˆ—‚pD/,/?cg^Y[h„ˆsf]fmj_F*-0-+*('&&&%$%%"#%))**/4568>FCD<+'(&&&()))07?IY]U]cP@ELFMWk\SWS^kyK@]Lfkfqomgc]YWVVVVWWWWVURPKFEBABDGKNRUXZ\]^^afjou{‚‚ƒ„†‡Š‹‹Šˆ‡…„……ƒƒ„„…‡†ˆŠŠŠ‰‹Š†…}ytprqommjhc^WY_diqw}€…‹ŒŠˆˆ††……………………‚…‹‰ŠŠŒŽŽŽŽ‘‘ŽŒ‰‡……‡ŒŒ‹‰‰‹Œ’“‘Ž‘’++++++******)))))))(''''(('((((((((((((('((((())))((((((((('&&((''''&&&&''%%%%&&&&&&&&&&&&&&%%%%%%%%&&%%%%&&&&&&&'((()()**++----..----.---------,+*****)))((((((((&&&&%$###"""!!        !"!!""#$$'0B\nlmq{{tqrvxxywof\RDBn…xk€xxyqVFHQbhjmfbUTNDKHHEFJE>887;BAF^ZJˆŒpa~tpnaTKHA;>JPVyƒ}ytqqqssohe_[ZWYZaaWHIqupoifkw‚u|‡[OVN?<LvŽššo_†‹ŒŠsNceezzŽ†wmgb]bfej‚£ ’‡xleh^HB=;GZgv‰Ž…{`<,,3GivnYXf€‹ƒ…qlmeU>)*,,**('&%%$#$$#"$&%&,:BEEDGGB=5)&&&&&()'*/3:DDJWd`ZVF@;@LWXZ\>B[T28fQN]irpmhb\XVTTUWWWWWUTQNJEA@@ACFJMQTXYZ[\]`chmrz|~€ƒ……Š‹‹ˆ‡ˆ‡„…„„„„ƒƒ„††‡ŠŠ‹ŠŠˆ‡„}xsqpqpmljga]Z[`djqx}†‹‹‹‹ˆ††……………………‚Ž’‹‡‹ŽŽŽŒ‹ŽŒˆ†ƒ€‚ˆŒ‹Œ‰ŠŠ‘”“ŽŒŒ‘Ž++++++******)))))))(''''(('(((((((((((((((((())))))((((((((())((((''&&&&'''%&&''''''''''&&&&&&%%%%%%&&%%%%&&&&&&&'((()()**++,,,,..----.---------,+**)))))(''''''''&&%%$###""""!       !"!!!"#$%,<VqphntytmmprswxvnbVM=:h†‡rrwrwykNCHUgilvdWGDGAJPKKJJDGA>;;@F?O]:k{…ˆ‡„~tcTMIEA@FJQr‚zvsronprnie_[YONT`^RF2Gjmnjhhnv€|c@KNNEHo¢žj\o…‹†y51Lw“‰€wkd^[^c\f™Ÿ–‡|o\al\FB@DMWakqwvunU8+-;Rht~wd^dx††„„{i_S4&)-,*)''&%%$$$$#""#$(/:BDC?:8760'''&'((''*16:=8GQX[YVOIKCLYZRPF6Q\MVjYJYrspnhb\XVTTTSVVUUTSPLJEA@?@BEJMQTXYXZZ\^aejqw}~€ƒ…†ˆ‹‹Š‰‡†„…„„„„ƒƒ„††‡Š‹‹Š‰‡‡„€|vsqqqpmljga]Z]afks{€ƒ‰‹‹‹‹ˆ††……………†††Š‹‹ŠŒŽŽŽŒŒŽ‹‰…‚€|y{~‚‰ŽŽŒ‹ŠŠŠ‹““’Ž‹’‘‘Ž,,+++++*******)))))('()(''((''))))(())(((((())))))**)(((()*((()))('''&''''''''((''''''''''''&&''&&&&&&&&%%%%%%''''(((())*+++++,,------------,,+++***)))))(''''&&&&&%##$#"""!""!!!!  !!!!!!!!###&)7OmrikqvslijkoqvwtkcVK?;j‹tyrpxwbKHPag_`hWJFDICHNKLKMECB@>?>E@AJD:<w‡„}rbUMFDCCBFLg„wusqnlnongb[X[SNNCLOI9,FjjfjhjowzG<BIIGm“¢££¡sa]Ž†‡C+=€˜„{wh_\YXZSu¡˜€p[PY\M;:BIRW[adfjkaM7,7I\inv~vjyŒ…z}k\J,%(***('&%$%%$###"""!&/7:<?>==;81('''(('(&*1;=79BGI[^[\GFADKKIV`R@YRcn^J\stpmgb\WUTSTTTTTTSRNKGC@??@AEILPTWXYZZZ\^bgntx}~€ƒ†ˆ‰‹‹Š‰‡†„…„„ƒƒƒƒ„…ˆˆ‹‹‹ŠŠˆ‡„€|vrqpppoljga]Z\`hnu{€…ˆ‹‹Š‰††………………„†ŠŒŒŽŽŒŒ‹‹ŒŒŒŠŠˆ†‚~|yyxy|€…‹ŽŒŠŠŒŽ““’‹‹‘Ž,,,,,,,+******)))))('()(''(((())))(())((((()))))))****))()*((()))''''&''''''''((''((((((''''&&''&&&&&&&&%%%%%%''''(((())*+++++,,------------,,+++***)))))(''''&&&&&%####""!!!!! !!!!!!!!!!!!#"#)0FftmkptsmkhijmpsurkcVJ>6f—’~quxz\CHQek_]_PDFILGMQOMJJDBA@A?@BDCCF@n„‰‡ƒzkYNKECBBADG_…xvtqnjikjga^ZVPG>63;=867VmggffgowqF:7;_Œ£¦¤¦ž‡u`eyŒ†‰K1@„—‡ƒzsbZXVVNTˆ›’„yjONYP;19BKQWY\_cfe\J60=Qcikku|~™œ’‚z|wdT>*&'))*('&%$%%$###"""#*3:=?A>>;630+&''((((&)-2319<:DU[RW\D?DQTU^i]Lbwx~gDXktomfb\WUSRSSTTTTSRNKEC@??@AEILPTVWXYYYY\`dkqx}~€ƒ†ˆ‰‹‹ˆ‡‡…„…„„ƒƒƒƒ„…ˆ‰‹‹‹ŠŠˆ„{urqpqonkhe`\[^cimv}‡‰‹‹Š‡††…………………‡ŽŽŽŒ‹‰‰‰ŠŠ‹‹‹ˆ„|yxxwwx{}ˆŽ‹‹“’Œ‹‹‘’ŽŒ‹**************)())))(((())))))))))))))))))******++**,,,+****))))))((((((''''))))))))((''((''''((&&''''&&&&&&&&'''')))***)*,,,,,,,,,,..--,,,,,+**))))))((('&&&&&&%%%$##"""!!!    !!    !!! "$#$(/B^qmjottlhfdadintsskbUH81U”‘„vnszm[HKSda\]ZLDJONNORSRKGGEFILA<>@?CEDW‡‡†€rgUJGCBAB@>@\‡ysopokhhhea]YTPH91155556<iligcehm}X02As˜¢¥§¤•…m\vq‚‚`7>w‘‡}shVRUTTMq›–…yn^OZaT54;GNTX\^abc`YF9?KZdgfglph“™‚ysi^T?,())())'%%$#####""!#%09<=>?@<831/*''((((&&(-.1347:<JZZJSOC=@IHLPLZmwnidEWmuunic[XSRQPPSTSSRQOJEB>=>@BFIMNRUVWXXWWX]bhnuz|‚…‡‰‰Šˆ‡‡……„„ƒƒƒƒƒ…†ˆ‰Š‹‹‰‰‡‡„€{urqppoljfc_\]_ciqx}‚‡ŠŒŒŠ‰‡‡…………………ŽŽŽ‹‰ˆˆ†‰ŠŠ‰‰ˆƒ}yvvuvvwy{{ƒŠŽŽŽŒ‹’’‘Ž‹‹‹Š’“‘ŽŒ‹**************)((())(((())))))))))))))))))***+**++--,,,+**++*)))))(((((((((())))))))((((((((''''''''''&&&&&&&&''''((*****+,,,,,,,,,,--,,,+,,,+**))))))))('&&&&&&%%%$$$"""!!!    !!    !! "(5%&-?Wrtlntunieb_\_inswqjaTG6-J’„trrvaOJLO]YSROCFMONKLPY[PHHIFHLPNBA@@CDA€ˆ…}n_QICA>;=<9;T…}qopnhfgec_\VUPD533113356Mplhfecltt>,O~˜ £¢˜Š}cZw`v|r:6oskXNORRQW†–‡wmcXTVZUB?DKRW[]_`caZRHELR\bdgkpy€™Ž}sng_ZU@,*'(())'%%$####!""!#,7<=>?@?<8530+('((((''&+.135557;CMOBFUZ>AO\TVY\bMS\JRivwple_WRPPQPQSSSRQNHDA>=>@AEIMOSUVWWWVVW[_fmrw}ƒ†‡‰‰Šˆ‡††…„„ƒƒƒƒƒ…†‡ˆŠŠ‹‰‰‡‡„ytrqppoljfc_\]`fkry~‚‡Š‹‹‰‡‡‡…………„‚‹’‘‘ŽŒ‹‰ˆˆ†ˆŠ‰†ƒ}xwtuvwwwxz{{€…ŠŽŽŽ‹Œ‘‘Œ‰ŠŠ‹”“Œ‹****++******))(''()))())))))))))(())**++*+++++,,++,,,,,,,,,,*)))))(()))))))))))))))))))))))))(''''''''&&&&&&&&''''((()++**,,,,,,,,,,,,,,,+--++*)))))(((('&%%%%%%$$$#%%"""!    !!    !!  "%(,>Vounqsvojea]WV]iqvvrk`SF58[‰|prsl\QFGPTLDACDGMKKJLN]\OFDBA@@RVD=A>D>>i‡vmd[TD;888779B~~rlljhdc_XVWVRL<..1/./0275drja`cgis_9^|™›”ŠnNR^CavsG7rxlaGGGMNNdƒˆwh^ORTPLSUPSVY\^__bdb`RJNW]`dlolp™Ž|oieb[YS=+(&''(&&%%$###$"!!"&1;==?@A@>;864-&$&&''%$&(,/0256777<IFFKPGCFNMUdbZTVVOEIezqlf^XRPPQOQQQQRQLHC@>=>@DGJMOSUVVVUTUVY]cjpv|€‡ˆŠŠ‰ˆ‡†……„…„ƒƒƒƒ…†ˆˆ‹ŠŠŠŒŠ‡ƒ~xrpqqpnljeb^]]ahntz„ˆŠŠ‰ˆ†††††„„„‡’’‘ŽŒ‹Š‰‰‰†ˆ…‚}zwwvuwwwxyyz{|€†‹ŽŽŽŽ‘ŒŠŠ‰‹’•“Œ****++******))(''())))))))))))))(())**++++++++,,++,,,,,,,,,,*)))))))))))))))))))))))))))))))))((''''''&&&&&&&&''''((()**)+,,,,,,,,,,,,,,,+++++*)))))((((&&%%%%%%$$$#$$"""!          !! ""'-<Vpunnswpifb\TPP^krxvog]PD56Mw†tmps^LTEDLHEA?DEGFIIIIPVVOEEF?>=;9D??>=A@J€tlgdTA;6764468b~smjgec_\QLNMIE6**/.,./018Oojedcabfp[c{ŠŒ„zmRFFCBW~upU:vŠtk\BEGLKRkvui^TSTVXC<PZY[Z]`bcdfebVP^giglxl]w“|nga_]VUR?+(('('&&%%$##$#"!!!)5<>>?@A@?=<85+$"##$$##%&*.10379<;:9889CMLLQ[UX_aWEI_dKOqtmd]XSQPOQQQQQPOLHC@>=?ACFINOSTUVVUTTUW\bkpw|€ƒ‡‰ŠŠ‰ˆ‡‡†…„„„ƒƒƒƒ…†ˆˆ‰‹ŠŠ‹Šˆ€}wrpqqpnljda^]^biqu{€„ˆŠŠ‰ˆ††………„„…‘’Ž‹Šˆˆˆ‰ˆ‚|wwvvuvvwwwxxz{}ƒ‡ŒŽŽŽŒ‘ŽŠ‰‰ŠŒ‘“•“Œ********))*))))'()))))))))))****))**))**+,*,++,,,,----..,,,-+*++**++****))**++****))))))))))))))''''''''''''''(())(())***+++++--,,,,,,,,++*)***)))((('((&%%%%%%%$$$#"""""!!    !! #')9TovpnswskeaZTMJO]iotsme[NC75I]kfhqSEGC=BEGCBDEHFGIIIKQQNF@BBCED>;B==>?@:m{rkfcM@D=411235;rrieeeb`ZQKNOKE6-**--.//.7@inifb`\`jiiw„†xlT>FBAKX}xjbBz†tfW@BHJLVdge\TSTVVE4.8Vg``_ceddggg\_imlr{r^`‚ˆ|le_]\WQPN>+%&''''&%%%$$$!"!"&1:=?@@@CB@?>;4,$"""$$""$%'*./15:===71.+.6HVXPRYYiiLIbbZLmukc\XXZROPPPQQQNJFA>=>@CCFJMPRSRUWTSSUW[bjpv|‚‡‰‹‰ˆˆ‡‡†…„……ƒƒƒ„†‡Š‹Œ‹Š‹‰…€{trppppnljc`]]_eipu|ƒ†ˆŠ‹‰ˆ†„„……„„Š‘“’‘ŽŽ‹‰‰‰ˆ‡‰„zyywwwwvwwwwvxyz{„‰ŽŽŽ‹‹‰‰†‰Ž•–”’ŽŒ‹))******)))))))())))))))))))******++**+++,++++,---------,,-,,+++++++++****++++++++**))**))))))))((((''''''''''(())(())))*+++,,----,,,,,,++*)))))**((('&&&%%%%%&$$$##"""""!        !!#%+7Vpyolqvvoga\UMDEO]gnqskbWJ>424`~hgmoJFC>:@CGEDDEDGHHIIFKOQTXdnnqokcURU_P79Wxqjg_OB@93212312Hrjcba_^YQLIMNMG;.*.1/./237Joni_\[]bmsw{|uk\A?BDMS`rn__Mu„seSAGIJMZ]ZXVTSUR@0.4C_jmnkggfgiieckortzg[W`z{lc]YXYRPMJ;*&%&(''&%%%$#"""!#-9<>AA@@B@@?>;5("####$##$%%%(*.1379862,++.<R`Z[_alfaPIFSJfrne\W_^^YOPPPPNKHDA>=>@CFILNQQQQSTSQQTX\ckqx~€ƒ‡ŠŠŠ‰ˆ‡†……„„„ƒƒƒ„†‡Š‹‹Œ‹ŠŠ‰„€ztqppppnkic`]]`flsv|ƒ‡ŠŒ‹Šˆ†…………ƒ‡ŒŽ’’Ž‹‡‡‡ˆ‰‡€}yxyxxwwvwwwxxxzz{„ˆŽŽŽ‘ŒŠ‰ˆ‡‰Œ“––“ŽŒ‹‹(())))))(((())))))))))))))))****+++++++++++,,,,--...------..,,,,++++++**++++**,,,,+***++*)**))))((((((''''''''(())**))****++,,,,--,,,,,,**+***)))*)))&%%&%$$##%%$"!"##""!!!        !! !#'5Qnxrnpuuslc]VLA=DP]forpi^WJ<411f|khokEE?99=BEFFEEDFIECFCCLi‚•š†xvwiU_qyY7?snke[M?621110./13Xkc`^]\XRMJIJMNNG9+*-/-/343RrmaWXY\amzvpjbM<@?B]`gbYZXRmm`NHJMLORRTTUSQM=303@Sgqtxzvokilljmry}rZIZPWffc^[XYTMJHD5'$&&')('%%%$#"# #)7=>=@@@@AA@@?<3& ##"#%$$#$$%'(),-.*+*+*)+-7P\RZcdba[\i[K[soi_c[@V_SOOOMLHGC@==>ABDGLOQQQRTRQPQSX\cksy}€ƒ‡ŠŠ‰ˆ‡…„„„ƒ‚‚‚‚ƒƒ…‡Š‹‹‹ŠŠŠ‰…~ysppppomjhca]^bgnsy}ƒˆŠ‹‰ˆ†††„„†Œ“‘‹‰‡……ŠŠ{{xxxxyyxvwwwxxwwz|†‰ŽŽ’‘ŒŠ‰ˆˆ‹Ž“—•’ŽŒ‹Š(())))))(((())))))))))))))))****++++++++++,,,,,.......------,,,,++++++++,,,,++,,++*+++++*)**))))((((((''''''''(())**))****++,,,,,,,,,,,,**))*)))(((((&&&&%$$##%%$$""##""!!!        !!#$(7LkwmmsuvuqiaZOA:=DO^hmnlf^UH<43>tvhgncAC@:9?ECDEDCAEHKFBBHh£ªª¡•‹|wx{hWg‚{T/`ole[K=62231/./12<dc_[YXVSPLKKKKOMJB61-+-31+/Zf^XU]]_fowjaYC=<Facb`]ZPTdd{dUGHMPQRTUUUQOH?411;N^mwtrwxurqqqprstu]GVODQZ^_[XUURLHE?2&$'''''&%%%$##"#(3<=>?@@@@AA@@?<2% ##"#&&##$$&.))&%&***+*++,.3FJ[__X`dZ_YLVqrbZE)4NNLOOOMLHEB?==>ABFILOQQRSRQPPQSX_dlsy}„‡ŠŠ‰ˆ‡…„…„ƒ‚‚‚‚ƒƒ†ˆŠ‹‹‹ŠŠ‹ˆƒ~ztppppomigb`]^bhnty~ƒ‡‰ŒŠ‰‡…………†Š“‘’‹‹ŒŠ‡‹„ywyzyxxyxwwwwvwwwxz|ƒ‡ŽŽŽ‘“ŽŒ‰ˆ‡‹‘”–’‘ŽŒ‹Š))**))))(())))))))))*)))))******++++,,+++,---.-.//......-.-,-,--,,,,,,,,--,,++,,,,+++++++*++****))((((''(((())*******(******,,,,+,,,,,,,*)()))**('&&&%%%%%%%%%&'**%$#""!""!     "#  !!%(0Ijwmhntxtsnf\SC76?HQ^hoplg\QF:46P~rabl_ABA:6?EBBBCC@CHQJ?H^Šž¥­¥”Ž’”ŠqZb}‰w;FrkeZO@622233/.155>^`WVUTSRNLMMKLLKKH</),/-&'4_b_[X[^deqn^R=;@^_UZZ\WPGPQk`PCJJMNRX\`]ZNE;313EYfpvuqprqmjloonnlpKOUGFQ[]\ZVUTNJFB:-##$%&''%%%%$##$'29;<>??@AAAA@@?:/#! !"""#&#!"%)+))++**++++,*,//1DVmigf_fjXRVngh`N+1FOPNNNLKGDA>==>ABDGMOPPRRQPPPORY`gou{~‚…ˆ‰‰‰ˆ‡…„„‚‚‚ƒ„†‰Š‹‹‹‹Š‰…‚~ysoooonlhda`_adjpv|€„ˆ‰‹‰‡‡…„…†‹‘”’ŽŽŽ‹ŒŒ…|{yzxyxxwwxxxxxxxwx{~„‹ŽŽ’‘Œ‹ŠŠ‰Œ”—–“‘ŽŒŒŠŠ(())(((((())))))))))*)))))**++**++++,,,,+,---..///......-.,,-,--,,----,,++,,+,,,,,,,,,,++*++****))((((''(((())*******(******,,,,+,,,,,,,*()+))))(&&&&%%%%%%%%%&*00&#"!"!""!     !!!!#%&1FdyogkrxvvrjaWJ807AJT`iprme[OD81<aƒpefnZ@D@96<CDAACCBDEHEKdƒ™ ¤¬§•˜œ}vtj…‘†e3pje\RC2.,,***+,/0/;V\WSPPONMLMKMKJIHE@5.1.)$):Z^abca]^hhaH:BUZW[`aYRLIDGNXMFLQOORU[a_VL@9307J_kotvsnmlgeijgg_\ZGZNIHR]^\ZVURJFC@5*$$$$''&'&&&%##&08;;<?@?@AAAA@@?:/##%!!""""##%'(***++**++++++./38@TbhmoideUMWije^\XUONMNNNLJFDA>==>ABGJMNPPRRPPOONSZ`hpu{~‚…ˆ‰‰‰ˆ‡…„„‚‚‚‚…‡ŠŠ‹‹‹‹Š‰…}uqoooonlhda``bflrx~‚†‹ŒŠŠˆ‡…„†ŠŽ’’“’ŽŽŽ~y{yyxxxxwwwwwwwwwwy|‚‡‘‘ŽŽ•Œ‹ŠŠ‹•—•’ŽŒŒŠŠ(((())(()))))*****))+*++**++++,,,,++,,,,,,..--//..........--....,,..------,,,,,,,,,,,,,,,,++**++(((((((())))))))**++**+++++++++,,,,,,,,+**))))(('&%%%%%%$$$$$$&&)(%#""!!""!!!!!!  !"$)-@auskkrvxxtoe\M>01:DPZbjqricXLC71Eu‚lgjqVAF>99?CDCBBCACEDIa—£¦¨ª¬ª¡œ™–‡vyz’ŽŽ|Edlf`WOGGFEEFEFJLWZTHLRSRONMLKKKKKHGDDD>73.*'#%>YYW[\]]^]bUIRYRTWVUSMJG@4;EADIMLLQTW\\VI<701=P`lptvtnkhgfiige_[NURGHMZaa^[USMGD@=1($##%%%&&&&&$""+59:<>>??@BBAA@@?:/##$#""!###""%((**++++***+,.148=BDGTfggmiNL^jjd`ZTLLNMNNNMKGC@>=>?ADFIMMPPPPPPNOOUZbiqx}ƒ…ˆˆŠˆ‡…ƒƒ‚€ƒ†ˆŠŠŠŠ‰ˆˆˆ„ztpoooomkgecbbchnuz~‚ˆŒŒŠˆ‡‡††Š’’‘Ž‘ŽŽyyxywxxxxwxxwwwwwwxz}„‰’’ŽŽŽ““ŒŒ‹‰ˆ‹‘–—•‘‹‹‹Š(((())(())))*+******+*+++*++,,,,,,++,,----..-.//..........--....,-,,,,----,,,,--.-,,,,,,,,+++*++*((((((())))))****++**+++++++++,,,,,,,,+**))))((&&%%%%%%%#$$$$##%$"#""!!""!!!!""!!#%(1?[vskkqvvvvof\QB4/5>HU^fnqng_UI=67V{‚lfiqT?E>99BEEDCCCBCEHYp‹—š¤¬«ª®£¡žœ”r†‡€ˆ’†iQd_]]\YYVTUTSTTRWWY[SNMNKLKLKJIIJHEEBA>:73-(&'&CWPPW\YWZ`bUUWYUTRPKGBB?43>HCEIJLOQUXWQF=722>N]hpxxqkiifffghgXD8FMJHR^`a\XUPHDA=9,%#"#$$%&&&&%##&08;<>@???@BBAA@@=;/#  ""!!###""%'**********+/069?<=<?DKQ_qmIGXY_de[SVQNNNNNMLHE?==>?BFHKMMPPPPOONOQV\biqz~ƒ…ˆ‰‰ˆ‡…ƒƒ‚€ƒ†‰‹‹‹Š‰ˆˆ„€|uqnooooljgebcefjqw{€„ŠŒŠ‰ˆ……‰’“”‘‘ŽŽŽŽ†wy|yyzxxwwxxxwwvvwwxz~…‹’“’‘’•‘Œ‹Š‡ŠŒ’•••‘ŒŒ‹Š''(((((())))))++++,,+++++*++,,,,,,,,----..--//////..................----..----,,------++,,++**,,+***))))**))))**********++++++++,,,,+***))((''''&%%%%%$$$$$$$$$$&$####"!""!!!!""#"%)1=XsqjlprrsrmdYNC5/07BMVbiopke[OC75Be~lhflO@C@87BGECCEFC@@Nk––ž§ªª¬¢££¤¢Œ}ƒ‰‹”šŠzRYXWUTOOPPOOOOPPRV[[UPIIFEEFEEFHHHHEA?>:853,'&(.PZUSUTSUY]bWRRNPNKFA=?A7.3=AADFKMNRWYQF:834>KWelrslhhgfffghicN6@FEIX^^\XUSKEB?;5)######$%%$$###)29=>?@@??@A@@@??>:.#!!""!!"""""$&+++)******,04666689<CFEHUTFG\R]ef[W\SMNMNNMKGD?==?@DGHKMMNNNOPOOPQV_ckrw}ƒ…ˆŠˆˆ…„‚‚€€€~€„‡ŠŒ‹Š‰ˆ‡„€ytpoppnnkigeecghlsx}ƒ‡‹ŒŠ…†‡Ž’“’ŽŽŽŽŒzszzxyyyyxxwwwwwxzyww{‡Ž““’••Œ‹‰ˆŠ“—•”Œ‰''(((((())))))++++,,,,,,,,------,,------....////....................----..----..------,,,,,,++,,+***))))**))))**********++++++++,,++****))((''''%%%%%%$$$$$$$$$$%$####"!""!!!!!!"#'-7Povjknprrqg`VL?2,.2<GR[fmooi`XK?21Iq}lgjlL@CC:8@DEDEGGC?C^}Œ•˜’•š£®°®°®©«’tvŽ£¡£–ƒ`QUSRQQQQQRRQQPPQSTSVQMKGECB@A@?CCBB@>>:9630*%'*2R_XPRURPTa[DICEFEB><>>5/,-:@AEJLMNNPOC9743:HU^glmlihfffe_XVLOULCFOZ^\ZVSOHC><93'$#####$%%$$###)3:=>?@@@?@@@@@??>:.#!!""!!""""!"$(**)******,/3444569@GIIIMC@AUhonfbcgSLMMNMLJFC@??@ADGHKMMNNOPRTTTWY_fktz}ƒ‡‰Šˆˆ…„‚‚€€€~€…ˆŒŠ‰ˆ†ƒytpooonnljgedehiov{ƒ‡‹‹‰‰‡†‹”‘’‘‘ŽŽŽŽŽsx{{yyyxxxxwwwwwwwxxy|‚ˆŽ’“’‘Ž”‘ŒŠŠˆ‰Œ’•—•”Œ‹Š''((((()))**++++++,,,,,,+-----------......////00//..............................------,,,,,,,,,,+***))********++****++**++++++++,+******))''&&&&&&$$$$$$$%$$$#$$$%#"""#""""!!!##%(*7Kjypilmppme\QD91++.8@KVajpple\QG;35Y{ylgknQ@EC<7?DEEFHGB?No…•˜‰¡¯¹º»¸ª§’|“˜¢žŸsMUXXVWVSRSSRPRRUUUUWPNJHFFEECBBAAAA@>><;:63.)(+*5T][XSQOR[aJ;??CB?;8873/--9DIKLNPOOQO?652.5DQWY]dihkkfgi\OW8LYKGNY]\ZVSQKD@<:91&####$"#$$####")4=????@A@AA@@@@@?<-#! """"""""!"#'')*+*+))++-102479669=@ED?CFAKfg`_\ZUNMNNMLJFCA??ABEHIJLLNNPRVWZZ]aaemt{~€„‡‰Š‰†„ƒƒ‚€~‚‡‹Ž‹Š‰ˆ†|wronmmnmjhgdefjlpw}€ƒˆ‹ŽŒŠ‡‡Š“‘ŽŽ‹ˆzux|}zyxxxxwwwwwvuuxxy~ƒŠ”“‘Ž“–Œ‹‹ˆˆŠŽ’•–”“Ž‹Š''((((()))**++++++,,,,,,,...--------.....///////................................--...-,,,,,,,,,,+*************++********++++++++,+******)(''&&&&&&%%$$$$$%$$$#$$$$#"""#"!!"!""##'.7EfyrkknmlkcXK?4,))-3:GP[fmqpkbXMA516^{y~mein`?CC>8>EEEFIHDHaw‰Œ”’ƒ‹¤±¹»¼º²¯©ª¬®  ¥—\XXXVTTTPQQQPPQSUXYYTPMFFEEDDEDCC@@A@>>=;;950-+,.7UUWWRQPTZUB;;>>=;8751//2>HLMMNPPOQUG(/0.2<EOSV^bbegihkid_QQTOOWZ[XWTOJD@?;95-%""$#"##$$####")6>A@AAAAABA@@@@@@>/#! """"""""!"##$$()()**++,/135653668=?>CCC=I_ff\ZTUOLNNMLJFCA?@BCEHJLLLOORUYZ_aegglpw{~€„‡‰‡‡†„ƒƒ‚€~„ˆŽŒŠ‰†ƒytpnnmmnmjhfefgjmty~‚†‰ŽŽŒŠ‡ˆŽ“‘‘ŽŒ‹‹‹Š€utz|{{zxxxxwwwwwvvvxxy~…Œ’”“‘“‘‹ŒŠˆˆ‹”•–”’‹Š(())**)))******++++---------......--/......0////.../............///////.////////-./.....-,,,,,++,,,,++++++++*********+,,,,++***+++++**))('''&&%%$$%%%%%%%%$$$$$$$$########"""#$'+1=Zxrjjqpph]TH8-(%&)-5?IT^fnome]RF;20>gwvkbelvK?D@::EDDFGFL`tˆ†Ž‘„‘£±µ¶º»¶¹»º»º®¦¢žŠjZVRRQSSTPPNMMRTRTUUSQNKHFEDCDCCCBBBA@@>===9841...AWVQPQPOMUV;5;<=:8432019GMNMNNNNNQSSG=)(/5;CJMV[_bdfgfcabUVTKPY[[YUQMEA<;:60'$$$$$$##"#""""#'2>ACCB@??@BAAAA@?=3%!  "!!!!!!!!!!"""&))**++*+/1324468;;:9==BGMR[fba\VPTQNNMJFB@@BBCFIKMLMMQUZ\`ekoppptw}€ƒ‡‰‰ˆ†„„‚€€„‡ŠŒŒ‹‡„{wronmmmlkjgffgilqw{€‚…ŠŽŽŠ‰ˆŒ’““’ŽŽŽŽŒ‰‡‹ˆywx{}}zyxxwwwwwwwwwwwxz€‡’“’‘““‹ˆ‹Šˆ‰Œ‘“•–“ŽŒ‹‹‰(())**))****++++,----.------......../...//./////../-............///////.........-./.....-,,,,,++,,,,++++++++*********+,,,,++**++++++**))('''&&%%$$%%%%%%%%$$$$$$$$########""""%(-8Mrxpmqtri_SF5)'%%&)09CNWbkpmh`YO@2/0Cmxxmccnzr=A?:8ACBEAG_vƒ€Ž‡Ž”“™ ¤¯®°¹¼¼¹³°µ´µ©©¡wUTYesyyyyum^NLLNNORRPNKHFEDECCCCBBA@@@?>==:9863..,@SPONNKKMQR:69:8652202=KPONNNNNNPUUTT929:;=AFRWZ[_b`a_\_YSNKOXZYXSPJ?<9750*%$$$$$$######""#&/;@ACB@?@AAABBA@?<5)!!!!!!!!!!!!!!"""$&(**(()*,/0124547755699;BJSblbZRPOSPMMJFCACCCDHJLMLNORU[afkrvwxxxy}€€„‡‰‰‡†„‚€€€‚„‡ŠŽŒŠ‡„{ysommmmmlkifgggimrx|…ˆ‹Šˆ‰’’ŽŽŽ‹‡‡Œyy{|||zyxxwwwwwwwwwwwx{‚‡“”’‘‘“‘Œ‹‹Šˆˆ‹“•••’ŽŒ‹Šˆ))))******+++++,,----.-............././0//00//////..........................................-,,,,,,,+++++++*****++++,,,,,,++*++++++*****)'&&&&%%$$%%%%%%%%$$$$$$###########"#$'+4GivnjqvvncVF5'$$$%&)1:EPZdlpkf]RG:.-4Usxxlcahw~U:@76?ACDAQu†Œ†’•“––“—š›¥¦¬¹¾¼³³²³±¬¤¨¦”€^bt~~}|{xxutk`YXWURROLJGDEFFDDDBCA@??@>=<;:98754.-/?OLMLJIGIPL66965310/5CMRRNOMMLLMPSW\VF;9<;=@IPVWZZZY[ZYUPLLSXZVRNLC9840,(%$$$$$$$$$$###""#$+8@ABCBAAA@@AA>??<7*!""!!!!!""""""##""$&+*)**)****/2244010/57<@EJ[fjaYTOPPNLKGCABAEFIKLMMMNQU]aipx|}}{zz~‚††ˆˆ‡‡„ƒ€€€ƒ†ˆ‹ŽŒ‹‰†‚~ytommmlmmkjihghhjnty~†ŠŒŠ‰’‘Ž‹‹ˆ†‰ˆyyy|}{{zyxxvvwwwwwwvvvy}ƒ‡““‘‘“ŒŠŠˆˆ”•“•‘ŒŒ‰ˆ))))****+++++,,,-..................../00//00//////......................//..................-,,,,,,,+++++++*****++++,,,,,,+++++++++*****)'&&&&%%$$%%%%%%%%$$$$$$#########$#"#%(0=^ysinvvqgZL6($#$$%&+3;FQ[ennjaZMA3--8\xws~pacht€u@=:5<@ACLf†”––˜™’„Œ‘‘š ¤²¶·´±¯¬­Ÿ™––”nt{zvwvwtssstqomjhdb]YTRNLEDDBABA@AA@?==<;:9875430--@MGGFFFFKQF686530//8IQSSQOMMKKLLPRYWXL;69<=CJMRTVTTTUVQMMSXYVSOLIB81/+%#$$$$$$%%$$%#"$""##&2=?@AACCA?=@BB@?>8,""""!!!!""""""##""$$+)*+,*(((+0//0-**1403879>OWaWQZYQPMKIFC@@CEEHLMKMMLOT[cjsz‚€~~~„†ˆ‰††ƒƒ€€€ƒ†‡‰ŠŽ‹‹ˆ…‚{wrnmmmlllkjhhghhjouz}†ŠŒ‹‰Š’‘ŽŽ‹ˆ††Œ†zxz{}{zzxwwvvvvwwwwvvvy}ƒˆ“‘““ŒŒ‰‡‡Œ’””•“‘ŽŒ‹‰ˆ))))***++++,,,,,-.......////....--//000000//////................//--00////////....///.......-,----,,++*,++++,,,,,,,,,,,,,,+,,,,,++++***)*)&&&&%%$$$$$$%%$$$$$$##########$$##%),6Nswljruqk_O:*$!""#$'+3=HR^dkje]RH=1,5Hk}}€sbcht€e5968?CB[|“‘™ž˜”œ”‡Š‘˜¤£©«¯³´©£‘Œ†tgtuutrqroonnnllifb`__^\\\XUTQMJHEA==>===<:98765210..<KHEFCBBGRA6872111=LTWWSQPOKKKKMQRSNTSE<=?@CHORUTONNLPPPPRRPNKID>6/.+&%$$$$$$$$$$$$$$####$+8>@@@@BA>>?>?=<;5+"!!""!""""""!!####$$'((*))(+./,+)*))*-17<=CGNW[aotbUONMKGDB@AEHHIKMMMMLORZbkv|€ƒ‚€~|…‡ˆ††„ƒƒ€€€€„‡ˆŠŒŒ‹ˆ†ƒysomkkklkkkigfghimqv{†Š‹ˆ’Ž‹Œ‰…„Š€|yy{|{{yxxwvvuuvvvvwwxz~„ŠŽ’‘“’ŽŽŽŽ‰‰ŠŽ“•“”’‘Œ‹Šˆ‡))))**+*,,,,,,---...../0////////..//000000//////....////........//--//////////....///.......-,--,,,,,,,,++++,,,,,,,,,,,,,,,,,,,,++++***)('&&&&%%$$$$$$%%$$$$$$##$$$$$$$$$$#$(+2Ek|okpttncUB-#""""#$'-5=HR]fjjbXMB705Gi|~}v}wbdfp€‚~H776=AHjŠ—š–˜£¤›ž›‹ŒŽ˜¢¦­¬®±­¦œ“‹ˆ‹‹„ˆ€kooqqpmmkjkjiihdbe`__ZYXXXWTQSRSRRPG?==;::98776422...=DBACBBDIT>664024BOSVWSSPOLJJLLMQSMNTSLB?@BDIMNMMJDDEGHFDDCEFC@91,+)'&%%$$%%$$$$%%%%%%%%#%,6<???@???@><:83*#""!!"!""""""""####$$&'''&*,09<3(('&')1=CEMPQUVY_p€y^XNKLIA@BBCFGIKMNNNMNOU^gr{€ƒ‚€~…‡‡†…‚‚ƒ€€‚‚†‰Š‹Œ‹ˆ‡ƒ€{wrnlkkklkkkigfghimqv{†Œ‹‹ŠŠ‘‘ŒŒ‹‡ƒ†Œ†|zyz|||{yxwvvvuuvvvvwwxz~„ŠŽŽ‘•ŽŒˆ‰Œ‘“•“”’‘Œ‹Š‰‡†))))++,,,,,-----....../0////////0000000000//00//..////..........00////////....//......////...---,,,,,,-+++++,,,,,,,,--,,,-,,,,,,++++**))('''&&%%%%%%$$$$$$$$$$!#$$$$$$$$#$$$(.<`tlqvyqhZN5$!!##!#%'.5<GQ[dieaVJA96?]‚ˆ~zv{{hbbl~„ƒt195<@Ov‘›žŸ¢¡¤ œ™Œ“ž¤¥¤¡ Ÿž˜‘Š{txu{Šikklmjkigghffda[V[\ZXZXTQPPOMMMMNQSRGA<;9:89886551/0/2FGEEBDEIRP633216GQTTUURROMKKKKKMMPONOLD62:?AEFGHFBCCCB?CFIJHFA<0+(')'''&&%%$%$%''&&&$$%%%&*07;>?=?@?<84-&#!"#!"" """""""""""#&&%&'''(')4:/(&%''+1;BEJNQSSWXYj~]^oPHGC@@@BEFIKLLNNMNMQWcmv}€~}}~‚‡‰‰‡…„‚‚ƒ„ˆŠ‹Œ‹ˆ‡†‚}wtqlkkkkkkkjhfffgimqv{‚‡‹‹‹‹Ž‘ŽŽŽŒŒ‰„‚ŠŒ|yy||}{zxwwuuuuuuvuvuuxz…‰’”ŽŽŽŒ‰ŠŽ‘”””•’ŽŒŠ‰ˆ‡)))))*,,,-----......../1////////00000000000/000/..////..........//////////..-///......////...---,,,,,,-+++++,,,,,,,,--,,--,,,,,,++++**))('''&&%%%%%%$$$$$$$$$$$$$$$$$$$$%%$&)3Oyqpw}zpdTC-#!""##$&(+3<GR\bfd`UKDCL`{Œ†zwvz|ia`j|„ƒˆZ+26>Uz›¥¦¥§¢™ Ÿ”ŽŽ—Ÿ¢Ÿœ”Šuiba\n‡v_gghhfecbdeb___]ZXZXVQOMIIIKKKLKKMNMGC?<:99875554110.9HEBEDFFJOF22437HRUTTSSSQOMKJKLKKMMKKJ?0%',29;CGFD@@A@BFJIHFC@6/*'''&''''&&&%$%'('''&$%%%%%&*-38:=>;61*$""%$"#$%!""""""""##"#$$%%&&'(&'(&'('&&%'*26>DGMNPSZcnaN^\ICA??@BFHIKLLNNMNJOS]iqy~}|}„†‡ˆ†…„‚‚‚…‰ŠŒŒ‹‰Š‡„€|wsnmlkkkkkkjhffffhlqv{‚‡‹‹ŒŒ’‘ŽŒŠ‡ƒ„Œˆ{vxyzz{ywvwuuuuuuuuvuuy{†ŒŽŽŽŽ””ŽŽ‹‰‹Ž‘””•”’Ž‹‰ˆ‡†****,-,,,-......./////00//11////0000000000000011//////.0////..//..//////........////////.....-......,,,,,,,,,,,,----,,-,--..--,,,,++**))((&&&&%%%%%%%%$$%$$$$$%$$$$$$$%%%%%'+;fwqr{yk^M:(#"!"#"#&(*1:EOZ`cc`VOQ\m}ˆŒ‡xxv|}k`^dz„ˆŽC+2<Tz—Ÿ§©ª©¥žŸ¡šŽ‹‰‰’˜š›‹…~wlghiaq}„]bfhfdb_dbb`^][YVVVTQOKIGGEFHHIJJJKMOOHC<97765665333/0CKGFGGCFIM?112:GRTUSSRSQPNMLLLKKJIGFD:,#$$%)-6<=><>AABFIECA:4,(('*++*()(''&&&&&&'&''&$&%$###"%+.231-'"""#$%""###"""""#"$%%&&)+'&&$&&%%''&&''(()),.18=EJPW`jvu\Y\j^G@AA?AFHIKKKLNMKJLPWemv|~~~}z~…ˆˆ‡†„ƒ€ƒˆŠ‹‹Š‹†…{wsnkkkkjjkjhggggghlqv|„‰ŠŠ‘‘ŽŽŽŽŒ‰…„‡Œ„~zyxy{{zxvvutusuuvvvuwvx}€…‹ŽŽŒ”’ŽŽŠ‰‘“”•”“’Œ‹‹‹Šˆ‡†****,-,,,,....////////00////////000000000001001100//////////..//..//////........////////.....-......,,,,,,,,,,,,----,,,-....--,,,,++**)(''&&&&%%%%%%%%$$$$$$$$!$$$$$$$%%%%&),?q„try€‚ufYF1$#"""#"#%'*19DOZ`cdaZ]gq~†‰Š„y~€j`\^v‡ŒŒz6/5Ow‹— §©©¨§¢œœ—‹‡|‚Œ’‘Šyuvsfagkr}u~lV_cb`\\_]\[\XVSSSQPMKHFDAABAACDDDEGIIJGB<8665666533227KOGGGGJGHL=028FPTTUSRPOPNMLKKKKJIFEB8*###%&'&)+/:<<@DDEFB5-*+---*++*)*)((''&&&&&&&%%&&%$$$#"##"$$""!""!##"""###"""""#$$),15975.)'((%%''&&''(((*+*,/7DMTX[\[^hiWPJC?>?ACFHIKKKKLMKJJOVbitz~~~}zƒ‡‡‡…„ƒ‚‡ˆ‹ŒŽ‹Š‰„„zvpliklljjjigfffgijnrw{†ŠŠŠ‹ŽŽŽŒŽ‹‡„…‹ˆ}yxxy{{{yvvutstuuvvvuuwy~ƒˆ‹Ž’”ŽŽŽŒ‰‰‘“”•”’ŽŒ‹‹‹Šˆ‡†**+++,--+,..//0000001111111100110011001111111111111100//////.../..////////....//..00////.....----..-,,,,,,,,------..,,,.....----,,+***)(((&&&&&&%%%%%%$$%$$$####$$$$$$$$%%%+.@outy€€p_Q=+$###"#"#%(,08CNX^ac__ku}…‰‹‹ƒ|ƒ…|m_[\t…{nv~b21Dp…”¥¨¨¨¨£œ™“„wu„ugelqj`eZpp]qyUSWYYYZZVWVTSSNOPLLKIFDA?=<;<?@A@CEFFECCA<756446555662;KICDCHHHIN=16FPTUTTUSPONNMMLKKIIGE?5%##$$%&''(*-2;BFDA;2--,---,-,*+*((((((&&%'%%%%%%%$####""""""""##""#"#""###""####%*18AGIHD<3*$#%%&&&&'')*++)+,0;ELJOPV]c^UNJEB@?@ACFHHJKKMMKJIJOT]hry~€}‚ƒ†‡†……ƒ€€€ƒ‡‰ŒŽŽ‹ŠŠ…‚}wsnjijjjjjjhgffggilptx|…‰ŠŠŽŽŽŽŽŠ…ƒˆŒ„{xwyz{zyxvvuttstuvvuuvwz~„‰ŒŽ”’ŽŠŠ‹’““””“ŽŒ‹‹Š‰ˆˆ‡**+++,--./..//0000001111111100110011001111111100111100//////.../..////////....0000//..//.....----..-,,,,,,,,------..........----,,+***)((('''&&&%%%%%%$$%$$$####$$$$$$$$%%',/>jusz€zeWI3'$#####"#$'*-6ALV]`ba_n|…ˆˆŒƒxx{}}o]Z[gf_i{ƒ|H)>d}Ž–Ÿ¤¦¨¦¢—“€u|vprpoleahhdgpeN^Ic…YMQSTUSUUSRRPNHIKJJGEB@=;98999;=<?BCCEEBB@<764456666643>IEDCDEDFHTC6BOTUTSQQOONNMLKKKIIGE?2$%#$$%&''(*)4@BB?7.+-./,..--,,++(''''''&&((('%%%%$####""""""""##"""#!#""##$$##"%*4?JSWWVRLA3'$#%&&&&)),/-,.36;<?HKP]llg_YQNGC??@ACFHHJKKKKJIHILR]gpx~€‚…†‡†……‚‚€‚…‰‹ŽŽŽŽ‹Šˆ„€zvpkjjhjjjjjhgffghjlptx|€…ˆ‘ŒŒŒŽ‡„„ˆ‰}zwwyz{zyxvvuttstuvvtvwx}…‹ŒŒŽ–‘ŽŽŽŠ‹Ž’“”•’ŽŒ‹Š‰ˆ‡††**+++,....-.//11000000001111001100111111111000//00000000////////....//////............//..--....,---,,,,,,,,------..--......----,,++**)(((((('&&&&&&%$%%$$%$######$$%%$$%%'-3>eusv|paP=+$#%$######&)-6@KV\adebn€…‰ŠŒ‡uwx{~o\YZfcgpzx|=-Vs‡“š ¥§¥£Ÿš–†z{wqjihjegjhqw{rTHQW~bIOONKPMSRNLJHDEHEDDCA?<6544366779>BBBAAA@@<963465654468=FEDDEECELWG@MSUSSQPOOOMMMLKKJJHF>1$$#$%%((''(*+4960+-..--..-.-.-**($#&'*'&'())*'&&$$$##""!######"""##%$"!"!!""""#(2@LVaihgaZPB3*$$%%&&(*05:=A=8L\lvuvvsngaZQMHD@?ABDGIIJJJKKIIIIJP[grzƒ‚€„†‡‡…„„ƒ€‚…ˆŠ‹ŒŒ‹‹‡ƒ~xrnjjiijjjjihhgfhjjmrvz~ƒ‡Š““ŽŒŽŠ„ƒ…Š…}yvvyz{zxwuutsrrtuvvvvvw~ˆ‹Œ’˜‘ŽŒŠŒ‘’”””’ŽŒŠˆ‡†„„‚**+++,....-.00112222220011110011111111111110000000000000////////....//////............--..--..--,---,,,,,,,,------..--......----,,++**)(((('%%&&&&&&%$%%$$%$######$$%%$$%&)/6Aa~usuxkZJ5&"$%$$$####&)-5?IS\adgnz„†ˆ†}kpwvxzr`]^dguz{y}Žx/>hzŠ“™ž£¢¡ ›‡€zvpggfhgegox|xwob\Wg]CKJFFIJTUMGFD@?BA?@?@>:63310034459>@@???>>>>843556665467@HFDDFEEHOXKHPUURQPOOOMMLLLLKKIG?3$$#$%%''&'(*('*'(,/.///.0.-/./-'%##&'*(''(((&''&%$%$#"""######""##)52%!!!!""""$,8DS_ktxtoh\N?0*%%%').0/4<HY[Pu€wsvvutqmf]TLFB?AACEGIIJJJKKIIHHJP[grz€„„‚ƒƒ†ˆ‡…„ƒ‚‚ƒ†‰ŠŒŒŒŠ‰‰„€{vpkiiiiiijiihhggjkkosxz€…ˆ’”‘ŽŽŽŽŒ†ƒ„‡‰ƒ€}yvvxzzyxwutssrrtuvvvvwz~„ŠŒŽ•”ŽŽŽŒŠŒ‘‘“”“‘ŒŒŠ‰‡†„„„‚,*+--,--..-.11002233222222221111001111112200122211110/00////////////////////.........---..-,--,,....,,,,--------------......------**)))(((''((''&&&&%%%%%%%$$$$$##$$$$$%&'+1:B\|uqqqlV?-&$#%$%$###$&).2;EQZbhmv€‚„ƒ„z_Omjippsda`fs~xvy…‰ˆa3[r‚Š˜žŸœ˜‹††‚pgaaehgb^fowpovxxovo8DGBAA?AEEDAC>;=<;<=:853211/./11159<=>>>>===;8556776888:<DHFGEFFFHMTNHQUSQPOONMMMMLKKJKFA5&%$%%%&'&'))(&%$(+-//...00//01/'""#%',*(((''''''%%%%$$##"""""""###&-*$"!!!!!""%/=KZiv~„zrg\M>1)'),04<JTMDOO_~|vvuutqmf^VMFB?DABDGIIIJKIIHHGGHOYgr|ƒ††…††‡‡‡…ƒ‚„„ˆ‰ŠŒŒŠˆ†…„~xtnjhhiihhjjihggfikmpty|‡Œ‘””‘ŽŽŠƒ…‰‡‚~{xwvxzyxwvtssssstuuuuvy|‚†‰ŒŒ•’Š‰Œ‘““’‘ŒŒ‹‰‡†‡…ƒƒ,*+-..--../011112233222222221111001111112211333311110/00////////////////////.........---..-,--,,----,,,,--------------......----,,**)))(((''''''&&&&%%%%%%%$$$$$##$$$$$%%(.4;FWwuqqonS7'%%#%%%$###$&)-39CPZcmt{€|ub<Gkppsqwhdcfs|wv„‰‚PCet†Ž–™š˜•†„ˆ†p\`aghc`]cly}ukl{||L9BC<;;<@><<=;998778641//./-,-///269:;>>>====;877777997:<=DGFDDFEEHLPNHNPPONMLMMMMLJKJIGC9&$$%%%&''())(&%$%+../..22/0355/'  !#',*(((((''''&&&&%%$$""""""#$##!""#"#!!!!""&0?LYj{‡Šˆzqf\MA8436ASalk[]bgy}‚€wttuusnibWNEBBABDFGIIIJKIIHHGGKR]is~…‡‡‡‡‡‡‡‡…ƒ‚€…‡‰‰ŒŒŠ‰ˆ†ƒ|vqljhhiihhjjihgggiknquz}„ˆŽ”•‘ŽŒŽ†‚‚†Š…€}yxvwyzyxwvsssssstuuuvwy|‚†ŠŽ’•’Ž‹ŠŽ’‘“ŽŒŒŠˆ‡†„ƒ„‚---.....//01112222222221121122111211222233333333330000//////////................//--.-,,,,,,,,,,------------------....--./....--,,+))))))(''&&''''&&%%%%%%%%%%%%"$$$%%%%'+05<IXmxkhkmY2$%%$%%%%%%%&&(+28AM\hu|~|{wp\;(?fyrqtzjdcbmt{……}{z|uIRmy‚‹“—”‰ƒ„m_\`a^adcgt}pktxtwj-9><867:::867553266510/-,,,(*-,,/1467:<<<;;<=977899<DKA>:?EGGEDEEFGIOEAKNKLMLKKKKKKJHGGE=+#%%&&'')*,)(&%$%,.///111688:80&   "'-.,*&)()'''''&%%%&$$$$$############""!!""%.=L]m‰Š‰‚}umh^TPIFHTbfekeelsvyx|zvuwtrqkcYPHCAADEGHHIIJJJJGGFGLS^it…Š‰ˆ‰ˆˆˆ†„ƒ‚‚„‡ˆŒ‹‹ˆ‰†…‚~xrnjihhhhhhhhhggghjkprv{~ˆ”•‘‘ŽŽŽŽŠƒƒ…ˆˆƒ€}zwwyzyzvvutsttttttttsvx|ƒ‡ŒŽŒŽ””Ž‹ˆ‹Ž‘‘ŽŒŠŠ‡‡†…ƒ€,-./..../001122222223321121122111211222233333322000000//////////................//,,,-,,,,,,,,,,------------------....--./....----+))))))('''&'''''&&%%%%%%%%%%%%$$$%&%%)-33=JYgrngfid@$%%$%%%%%&&%%(*.6ANat|yumaJ4.6Yxsry{laagir†ywwzzdK]pxy€ƒŠŽ’Š‚vlhddgaY\binv…|rllnqsv>1475455564322210231/..,,,,('))+,/02389:<<<<<;:89<=?YbHB@>BIIFFGFFHGHJBCHJKLKJJJJKKJHGGD@5&%%&&(***+*'%%$%,.//.048=>;=;3' "*012/-,++)''))&%%%%&$$$$$$##########""!!""'.<K^n}ˆ‹‹‡‚yupkf`WWX]fg_[SO]dRJkqmrvuuqmd\RJCBCDEGIIIIHHHHGGFGLS]jvˆ‹‹Š‹Šˆ‡†„‚‚‚…‡Š‹‹Œˆˆ‡‡„€ztqmkihhhhjjjjhgggijmqty{~…“•”‘ŽŒŽŽ‡‚…ˆˆ‚|ywvxzywwvutsssssstttvvz…ŠŒ•‘Š‰‹ŽŽŽ‹ŠŠˆ‡†‚€ƒ........000111222233332223333322333333333333333322110000/////////////..............-,,,,,,,,,,--,,----------------....--.///..--,,+)*****)(())('((('&%&&%%%%%%%%%$%%&%%%*/16=MZfonhdcfV+!%$$$$%%%&'(().6FXo‚„€}xofUE?69Tupl||kcbeiv…†usuvyzbL`pprv|„ƒ{rjgihhmlkmryxz~‚ymaVKKGMK.03111112310..//-//---++,,'$))'(,,03588::9:;:::;:=??BCCBADFILIFHGDFIJH@>FHJLIFGIJKJHFEC@9)$$&$(++++*(%%%&+.00.1:=@B@=:4(%-24785/-.*&&%&''%%%%$$$#%#%$%%##""""##"""#%*4GYj}†‹ŒŠ‡†ƒ~{zwmlgY[W\f^F@F5<`v|wssntog\SJDCCBEGHIIIIIIIHHEHMT_mxƒ‰ŒŒŒ‹ˆ††„‚‚„‡ˆ‹‹‹Šˆˆ†ƒ}ytoljhhhiiiihhhgggiknrtx{€Š’••’‘ŒŽ‰ƒ„„ˆ„~~zxvuwxxwvuutsssssssuuvy{€†‹ŒŽ””ŽŽŽ‹‰ˆ‹ŽŽŽŽŽ‹‰‡†††„‚‚ƒ„........00011122223322222333332233333333333333334411000000///////////.............-,,,,,,,,,,,,,,,----------------....--/.////--,,+)*****)(())))((('&%&&%%%%%%%%$'+)'%&(+,/5>LZfoqkgcfcA"$#%$%%%%%&))+3DTl…ˆ„{tj_VPIDFRabf~zncahk~‰‡{ssuvw|yOQgljkoustkgjklot|}€†‡„„yq^MD;1224---.0011.///,*++++-,,,++++(%&&'(*+.135787567779::>BDFHJFFFFHJLMKJIHKKJG@@DHJIDDGIJIHGEB?9+$$%&(+,,,+)&%%%*.00/6>@DCA?>3( !"'07<<99852.(('%&&%%%%$$$#"#$%%%%#####$$$$$#$(2GYj|‡ŒŒŒ‹ˆ„…ƒ‚{un]\cieZPVO?Kj}~vthC`qhaUMFEEEGHHIJJIIGGFFEHMT`nxƒ‰ŒŒŒ‹ˆ†„ƒ‚‚„…ˆ‰‹‹Š‰†…†ƒ€|wsmkihhhhhiihhhgggiknruy{‚””’‘ŽŒŒŠ…€ƒˆˆƒ€}zxvuwxxwvuutsssssssuuvy|‚‡ŒŒ‹–“ŒŒŠˆ‰ŽŽŽ‘‹‹‰‡††ƒ€‚ƒ†‡--..///-/011112222222222233333223333334222333333332211111000/.//////..--..........-+,,,,,,,,,,,,,,------------------............,,,+++++****))))(()('&%%%%%%&&&'*8C7'&'&)-06?L[fotpigbeZ/$##$&$$&'(,3=Ocx…‹‹…wld`YWRNOXadn{wngfhp‡Œƒyknrprw{WAWbfacegwnalos{ƒˆˆ†ŠŒŒ‰~kWD86444471*()/.----,,*)))*****(''''%#$&&''*,/1345533333788<BFIJIJJHILLPRQPOQNKHIHCABEFBBCGGHIHF@?9,%%%'(+-..-*(%##)-..1:@EIEBB=1$#%+2:=?=:8642+*)%$%$###%%#"$$%%%%$%&%&''())('),2EVgy‡Ž‹‰‰ˆ…„€|pdkoji[]h[5Adv|wrbcpjaXNFEEGIIIJJJIIGGDDFGKUamxƒ‰ŒŽŒŒŠˆ†ƒ‚ƒ„‡‹‹ŒŠ‰ˆ†……‚€|xrljhhhhggiihhhggijlosvz}Š’“”“ŒŽˆ€€„Š…‚~{yxwvxxwvtttsrrrssssuuuy~ƒŠŒŒŽ”‘ŽŽ‹ˆ‡ŠŽŽ‹Š‰††…ƒƒƒ…‡ˆ--..//0/111111333333333334444433333333343333333333222221100000//////..--........,,++,,,,,,,,,,,,,,++----------------............++++++++++++))))(()()'&&&&&&'''(-FZL00+')-28ANZenrsliccfQ)##%%$#((.9K`tƒ‰‰ŠŠƒyjcaa`\XVUYhuvsxrhfio€†unnnopwyY8KW\^]Z[nyjwyr}…‡‡‰ŠŠ‰‚oW>9448?;697.'(*,--,,+*('''((''&'&%%%#$$#$&%'),./10222222478>CIKLLLMONNQTWXXXVROKJIGBAA?=?BCEFGFD@<5*&&'()*,,.-*('&%(-.00<CEIIEB:+! "%07;;;<;:741.,+'#%%###$$#"""!!!##$$$%&'())+,.18FYjzˆŽŽŽŽŽŽŒŒ‹‡…yrh^OG>40031:AMmyuvvsokc[QIFFHJJJJJJJJHHFFEGKUamw‚‰ŒŒŠ‡„‚‚ƒ„‡Š‹ŒŠ‰‡…„‚€€|vpkihhhhggiihhhggijlosvz–‘’ŽŒŒ‹†€€„‰ƒ€~{wvuvxxwvtttsrrrrsssuuw{~ƒŠŒŽ’”‹ˆˆ‹ŽŽŒ‹‰†ƒƒƒƒ…‡‡‰--////0011111133333333333333333344443333443333333322441000000000................,,,,,,,,,,,,,,,,,,++,,--------------......//..--++++++**++**))))((()((((''((((()+?UP<;-)*.2:EP[dmorlhdbegC#"%&$%+.;Oi|‡†‰‰ˆxcXX^a`_]ZWWe{{ozsggfmtxyvpomoruz\36KVVXXR\ntxrbk~zˆ†}iP@98865889;?5('''*,*)(('%%%$&%%%%$$$$$$"!$%$&(*.,-///0111499?EGMNOOOQTUVWYY]ZYXURNJIIGDB><=ABABCB>8/*''&')**+,,*(((%'+/03@BGJJH@2' &5:<=>=93/--.--*(&$$#!!!#"!!   !"$$%())*.-,.04EZp~}„ŒŽŒŽŽ‹Š‡}uj`WOE7.(&#&*6:@NYiottnf^SLHGIIJJJJJIIIHFFEFLWalx€ˆŒŒŒŠ†ƒ‚„†ˆŠ‹‹Š‡‡†…ƒ€{voljihhhgghhhhhghjknotw{„’”’‘ŽŒ‹Œ‹‰ƒ€€…‡„}|xwtvxwvvtssrrrrrrsstuy}‡‹Œ””‹ŒŠˆˆŒ‘‘ŠŠ‰†…ƒ‚ƒ…ˆ‡ˆ..//0000111111333333333333333355444433334433333333334410000000..................,,,,,,,,,,,,,,,,,,++,,--------------.....///..----++++**++**))))(((((((((()))))**2IXK:-*+/6>GR^gkkflmc`cif;"$$%),5Ih‚…„…†…|oXJNPX^bb``\Zc}~{‚ujjhkmouxrmnnruw^1.7KQPQMNX^ZRFBi}{uzvkP;56:987768;<;.&%%&''%%%$$$$#$##$##"""""!!##$%&)+,,----.0147;>FJKNPQQSVWZ[\Y[]\ZYUSONNKIGDB>>@@AA?<5/*''&'((*+++*(((''+..4BBGIHF?-#  )5;=?>72.+)&$(,,*&$#"#""!#"!! !!#$%'*)*,,05;9ESd{x|‰ŽŒŒ‹Š†yskfZRB9.((+09DFLONQ\kkicWOJIIJLJJJJIIHGEEEFLWanyˆŒŒŒ‹‰†ƒ‚……‡Š‹Œ‹Š‡†„ƒƒzumjhhggggghhhhhghjmorux~‹•’’Ž‹‹‹‹‹…‚€€……‚}zxwuvxwvutssrrrrrrsssux}„‰ŒŽ•“ŽŒ‹ŠŠˆˆŒŽŽ‘‘‘‘‹Š‡…„„„…ˆ‰‰Š////000022221133333333333333444455553333444444443344432011000000..........----------+++++,,,++,,++,,,,,,,,,,,,------.....///..--++,,,,**++**))**))(())'')+**,,+,-09LT<--/3:BLU`hjga`khbbcoc/$(+/>^~‡„‡…w]B5<ELRX\_adbbds€ˆˆ{nkjijlrtpkklouu_2,.9HKHNKJLBB?4;dxzpbN;4579;;:968:;;6(%$$%%%$$##""""""""""""""!!!#$%&&(+---,--/.;A=BEILORSTUUUX\^]^^]]\XUSSTRQPIFD@=;>=<94.*))(((((*++****(')*.4AFHHEB7)  "#,6=><940,*('$$'(*($###$$"!"""! !$%'(+--/36<Qhnjp{ŠŽŠ‹ŒŠˆ†‡†ytlf\RE732249?GEDGIKWZY]aTIHKMIKLIJIIHFEDEFLW`nx€ˆŒŒŒŠˆ…‚‚ƒ…‡ˆ‰ŒŒŠ‰ˆ†…ƒ„zsligggggggghhhhhijmosxxƒ”‘‹ŠŠ‹‹ˆ…€‚‡ƒ}zyvvwxwuttssrqssssrstw|‡ŒŽŽŽ–“ŽŒŒŠ‰‰‰‘‘‘Œ‹ˆ†…ƒ„„†ˆ‹ŠŠ////002222112233333333333333444455555333444444443344431121000000..........----,,,,,,+++++,,,++,,++,,,,,,,,,,,,------......//..--++,,,,,*+++*))**))(())**+*-.////111/GA1128?HP[cije[QZmgbagqT$#),2Hl„ƒƒyiI.)24;DJRXZ]adfhu‚‡†qigfhlmkiikloqv_,)+.4FHEGF>65IF53Vd]H<55689;;::979:;=-%%#$%%$$##""""""    !!!!    #$&&%&(*+***,.49;<CHNORRRSSTUW\]]^bb`^YVXYXXWWUMIC=978730,+)))(((*++*****(*,/5AFFEC=/# !%-6<?;71.+)&%##"#$&#"$))%%#"###"#%')*,022/1=\u~zy|~€€ˆŠŠ‹ŒŠ‰‡„‚„ƒ|wpic\PFA:768:??ADFINKNHJ^eSUZHFJJJJJGFEDDHOXboz‚‡‹ŒŠ‰†…‚‚…‡ˆˆ‹ŒŒ‰ˆˆ‡‡…„}vrmigffffggghhhhhjlprtw|ˆ’”Œ‰ˆ‰‰‰‡ƒ€€ƒ†‚~|ywuvwxwuttssttrrrrrstw|€‡Ž‘“‹‰‰‰‹Ž‘‘‘‘ŽŒŠ‡…„„…‡‰‰ŠŠˆ00112233332222223343234444444444555555334444445555443322322200000.......--,...--,,,,+++++,+,+++,*,,,,,------..------..........----..--,+,,,+****))*))++-..00121100119B=57>ENT]fjjbUKHakecdnq>!(*6Qy‚}~sW9&(+,15<AHPTZ_dlr~‰‚z|shdbgmqmkijkoop^+)+**7FIEC>3,131*1DC843247:::;;;78:;<6(('&%&''%$""##""!!!!!!    ! "#$%(***,,,.367;<BGLORQQQSVVZZ\[`aca^\]^]Y\^WSNID<75640..-,*)())**++++,+,-17@DEDA7+!""#(.4;>:4/*)&%#""!"$!%&)))&$#"$%%%&&*++,./-.;KXctxws|{„‡ŠŠŠŠ‡„y|‚…ƒ|xrib\VOB:>:=@CEGHLNUQVZJHVS_i\MIJJKIGECDHQXdoy€ˆ‰‹ˆˆ…‚‚ƒ„‡ˆŠ‹‰ˆ‰‰‡†„{vqmhgfeeeggghghhimmpqtvŽ’‘Ž‹‹Š‰ˆˆŠ‡…‚€€„†‚}{yxyyyutssrrrrrrqqssuv{‚Š‘”’ŽŒŠŠˆˆ‰‘‘‘‘ŽŽŒŠ‡††„ˆ‰ŠŠ‹ˆ‡001122333322222233432344444444445555554444444455554433323333200000......------,,,,,,+++++++,,+++*,,,,,------,,------......--..--....--,+,,,+****))+++--/0122334444444>JC9BLT]fklj`UE8Hiidbita*#+:Z|}xwc7%'*),,059@EMS[frx„’…yxse``aipofgkmnor],(*-129FA@<6**)('(,/023598::9:;;9779<;-(*+,())*)('%#$$""""!!     "#$%&)))*,,,/3689<AEJORRPPTVX[\\_^`ab`___\[[[ZWINH<74220/.-,+)))**+++++-,-0;@DED?5& !"$).39;950+'&$#""""##$%(***$%###$&('*++++*+3APWB=9<:Zlr~†ŠŠ‰‰ˆƒ|us{€„ƒ~xpkg_UNDB@@CFKKMLLQNH?KKLOXglbIIKIHFDCEIP\epy€…‡‰ˆ‡„‚‚„…ˆ‰ŠŠ‹‹‰‰‰‰‡†ƒ€zuqmgffeffgghfgiiilnqruvƒŽ‹Š‰ˆ‡„…†„„‚†…‚€~{yxyywttssrrqqqpqqssux~…Œ‘’”’‹‹Šˆˆ‰Ž‘‘Œ‹Š‡†‡ˆ‡‰Š‹Šˆ‰„001222332222333333433444444455555555555555444444556644444222100000/.....------,,,,,,++++++,-++++,,+,,,--,,,,,,------....--------------,++++***++**,,//1233456656567788DLDHRY`fmmi[P>05VpiccjqH$)8Z~{xs\.&&)((+,039?FKXiwyƒŒzud^\]clphggilorZ-'*-5;9RH=:92+%'$&&)-.27@=989:998668<<7-+-/,,,...,)%#$##"""   "##$&'())),,/373139>AHMPQOQSUVXZ]][[adcbb_^_ab\RTRG;753320-.-+++,,++,,./003;@CCA;1$!!%'(-26:93-)(&%$""$%#$%()),-(%$$$&''()**)(+/8ETU=5*'/BXk}ˆŠ‹‰ˆ„}ukhqx‚~xsleaYRKCBFFFIPQSWTLIPNORYeV]]MKJJGEDEJS]fqyƒ†‡†…„ƒƒ…‡Š‹‹Š‰‰‰‰‰‰‡†‚~xsokggedffggghghikmprtvxˆ“ŽŒŠˆ‰ˆ‡„…ƒƒ„~ƒ†ƒ€€|xxzxwtsssrrqqrqqqstsy€†Œ’‘’•‘Œ‹Šˆ‡ŠŒŽŽ‘‘Œˆˆ‡ˆ‰‰‹‹ŠŠ‰†„222222332222333333433444444455555555555566555555556655554422111100/.....------,,,,,,,+++++,-++++,,,-,,--,,,,,,------....--------------,+++**,,++,-/03367668899888:;;;;>JURT\cjrmcWJ8.,?fmebelf;$5Qw|vq^6&'))'()*.38>GWlyu|†Œƒzvh^\[^chggegmprZ+'*-5<Cc[B793,,(%(()*,.5<;557887876577:2++-,++,-./,*)(&&$"!   "##$&'('((()-110/05:>AGNRTPRSSUUWXX[\]a_`__[[YY[VSNG@674210---++,,,,--.1333;>AA?9/$!"(+,/19<ED>3+'&$&&#$#&))(*..-,)%$%'*((((((+264<1*''*5CZn~‰Š‹Š‡ƒ|qjeiqx‚‚}xsokeYRLJIOOQUY\\VQWRKNTWZUIPXKDEEEDFNT]grx‚……„ƒƒ……†‰Š‹‹‰ˆˆ‰‰‰‡‡†}xsokffedffggghiijlnpruv}Ž“Ž‹ˆ‡‡††††…„„€€……ƒ€~|yxzuwtrssrrqqqqqqrst{ˆ‘““‹‹Šˆ‡‰‘‘‘‘‹‹‰ˆˆŠŠŠ‹Œ‹‰ˆ†‚333333331344333322444555443345555555556677555555556666554432221111/...----,,,,----,,,,,,++++++++,,--,,--------------....----..--....--,+,,,,---.1222559;::;;;<;;<<===@CFOVZ\fnvnaSF5.,3Mpifcem]/*Dj{upeA&%')'&))*/48AZryos‚ˆzvna][^efffcfjlkZ-%&,17Jg[N8//,++((*++*,.13224577685596582*)+,,++,,+,+)(''&$  ""#$&''''''((*(),/28>AKQQRTSRSSSTTRUXZ\Y[^]]dc`ZRQQMI887211/0-------//34548=>><6+##$&)/19M`lpk_RA3+*&"""&-64688830-,*++*))))&%*+'%%'''(2C\p‹‹Œ‹‡„|pc\`hry€„‚}ztpkhbbca`_b_^][bmhY[^]YWP@8OVeZGFFGLU`isz€ƒ„„‚ƒ„„†‰ŠŠ‹‰‡‡ˆˆˆˆ‡ƒ}wrnjgfedfffghhiijmorstyƒŒˆ‡†‡††††…„ƒ€„„€~}|zyzvvsqrrrrrqppqqrsu{„‰Ž”‘ŒŒ‹ˆ‡ˆŽ‘ŽŒŠˆ‡‰‰‹ŒŒ‹Š‡†ƒ333333333444333322444555444456555555556677655555556666554432221111/...------,,----,,,,,,++++++++,,--,,--------------....----..--....--,+,,,,-../24758;>?=>>>@@@AAABBCDFJLSVYZjvn_OD5/,-9ZtiedjlZ.2YwvpiO*')'(&)*)+/5D`wsjn~ƒztoqf^\\`bffcgmlm\.&&++0MgYRQ9**++,,-,,-.---//14587556875@P+*-,,+++*+++,*('&$""""##$$%%''((*/98<FLRSTPTXUTQOQOQSUVW^ab_bfc]UTRQM:5;9400....--/025684489;60'##%%+6F[s€„…†ƒzm`TB.%$,9AFGFEACB<4442221000/-*'$$$$$&(4H_u„‹ŒŒ‹Šƒ{qaWY`jsy‚‚ƒ€|wqjghddda`afkllc[WXW`efaa[LUk\JEFKOXbisz|€‚„„„…††ˆ‰‰‰‰‰‡‡ˆ‡†„„}{wrnjfeedffffffiijmorsu|ˆ“‘‹ˆ‡†…………„ƒ„ƒ€€…„€~|zyxvvsqrrrrrqppqqrsv}†‹•‹ŒŠ‡†Š‘‘ŽŠ‡‡‡Š‹Š‹Œ‰‰‡†„‚2222223344465544334444445555554466666666556666666666766544442111110/..----,,,,----,,++,,+,,,-,+,----,,+,..--------....------....//.--,*+,,--/0125789<>?ABACDCDCDDDEEEGHKQY_^\cpkZL?3/.-0AipldfmsY-GlwumY5&()'))*,-1;Sqxljr||tomqm`][_acfgijlm_.%*,.1Pe]WUV:+'(((()*-./-,,-.0445314433KxR!//.---,++*++*('&%"  ! !!#$$#"&&&(,37=EJOSWSSPROQNQOPRTRZ`efghddZN>QNY@0;=7220000100168862452*&#%&(4J^p‚‰‹‹ŒŽŽ‹„zkT1):EMIA?EFFEA;:8:::<<:863,&! """%'7NdwˆŒ‹‹‹‹†}ncUSYckt{€†…ƒ€zzyxxwmlnmuyupklqosrikjkno]NTOGCMUZbirx{~€€‚…†‡‡‰ŠŠˆ‡ˆ††‡‡„ƒ‚}yupnjggfffeggfgijkmprvv‘ŽŠˆ‡††‡‡†ƒƒ…‚€€„‡ƒ€€~|zyxvvsqqqqqrrqqppqrx€‡‘”’ŽŒ‹‹ˆˆˆ‹‘’’ŽŠ†ˆˆŠ‹ŠŒŒ‹‡†„„ƒƒ2222333344465544444444445555554455556666556666666666666543443222110/..----,,,,----,,++,,+,,,-,+,-----,,-..--------....------....//../.,-..//113689<>?ABDEFGGGGGGHHIIIKJNU]dggadg[L?2/.-04TpkidhruJ<azwpc=%'&'()*+-0A`xvklx~xsmlovd]\[aceffikl]/&*,-3Sg[Y[XN9*'&&')(-00/.++-012311699Ie€‡6&.00/11..-,++('&%$$%%"!" ! !! !#""')-/7?DFINQLNPRPMJLNQRRSW]effhgdZUVKIZN67=:62111111278864230(%%',Cax‚‰ŽŽ‹‰‹ŽŽ…wO0:BMB><@LJID?967:;<<9998-$ !$$$*?Si}‰ŽŠŠŒŒŠtdSKPZeov|„††…ƒ€€{zwuqsxzyxtufadkjpqong_TWgbfTLT\ejsvz}€‚†‡ˆˆ‰Šˆ‡‡‡…††…„~|xtomifeeefeggfgijlnqqtw„’‘Œˆ‡†‡ˆ‡†„„…€‚†ˆ€€~|zzyvtsqqqqqqqooppqry€‰Ž’•’Ž‹Œ‰ˆˆŒ‘‘‘Šˆˆ‰Š‹‹‹‹Š†„ƒƒƒƒ3333444444454455554444555555555544456666455677665666666654443322110/..------------,,,,,,,,,,,,,,------,,--,,----------------....////010...013559:;?ACDDEGIIJJLKKLLLKLNOSY`gmpmd\UK?62////;_phedjtk@UwysiF(''))()*-3Fi{rkn|zqmkdavk\]\`cdcchjj]0'*+-3XhZYYVRJ>,&&'''+23/..,,-../24>FPaxŠ”w+13234321/-+((%#"####"    !! !#$&)-3:@DEFHHGJLNONNMMPOQU\`feijgd[RMJZeXF?<:7320112366876332+'')Ai‰Ž‘’‘Ž‘‘ŒŒ’†lB?FLEDMITYUOMIB==>AA>>?<2($#%%&'.BXmŒ‹‹‹‰ƒyeNBHR_ipx€†ˆˆ……€~yvutuqtwwkfc]Z`^bfb[a\Z=AQd]^[_emrvzz|‚…†‡‰Š‰ˆ‡……„„‚‚}zvsnlieeeefffffgijnosst{Ž””ŒŠˆˆ‰‰ˆ‡…„…€€‚‡‡‚‚~|yxyusrpqqqpppoopppu{‚‰‘”‘Œˆ†‡ˆŒ‘‘‘‹ˆ‰‰Š‹ŒŒŒ‰ˆ…„‚‚„†333344444454445555444455555555554445666645567766566666665444332211//..------------,,,,,,,,,,,,,,------,,--,,----..----------......0335400023378<>?CEFEHJMNNNOPPOPPPOQRRUZahnospbRC>7543//1Cjpfeely^Nt|voP+&(**((*-2Jmyolrxnlgbdopb`^^acabeih\0'+,06_e[]][POL@.('&'(.2/-,,*+,,-7BNYix„Œ–˜[-4566321/-+*)(&#"""!    !#$$&(-269>ABDEEINKOPPOPMOSV\l_aoljc[QLYe_UOIA98852212567798662,(9b‚‡Œ“——”“•–’‹Š’Ž{R<FIJJKNSVXX\aa^UUQONMGA4&##%&((.AWmŒ‹‹‹ˆudI9=JW`kv}„‡‰‰ˆ†‚}~~tjada^`h]aYUWafaWZa…ACW_[`diosvxy|ƒ…ˆˆŠ‰‡†„ƒƒ„‚~|yurmkheeeeffeefgijnosst|””‘‰ˆˆ‰‰ˆ†…„ƒ€€‚‡‡~|yywusrpppqqppooppqv|„‹“”Œ‹‰‡‡‰ŒŒˆ‰ŠŠ‹Š‰‰ˆ‡…„„„…‰33444444554444445544444455444455555566666677666666667664554433331100..----,,---,----,,,,,,,,,,,,,,--..,,,-,,----......------..//..014577667799>@ABFGKMMOOQQSUUTTTTSSSSUV\ciqqqoe[PC<8542105Pqieffru]q€ysY0&&)*)),.5Rqvmmu~qeggiiith_^\_``cdghZ0&,-1:ee^`^[OMNQD-)('%'//+)+**+/8GWbn{†Šˆ–›“6$/3444400--.-,)&$!!  !"""#%)-.16:>@BCEMSRQNMIHMQU[ejoplmj`SNK`cUPPNI?8743334478:<<<949Z‹Š’—–“•šš—’ŒŠŠŒ‘…^>IIJHLMRTZ^_bcd]Z^]ZXTE0%##%%&&-ASi}ŒŽŒŠŠ„|pbE/1>JXelw‡‹Œ‰‡†…‚€xjaZY^\WWW\^^_jeXiƒˆ}LZa^ZYforsvz|‚…‡‰‰‡„……ƒ‚ƒ~~~~}zxtqkkgedeeedeeghilnpsss‚“““‹‡‡‡ˆ†…„ƒ€€ƒ‰†€€~|zxvuqqpppoooooonopw}…–“ŒŒ‹‰ˆˆ‹‘ŽŒˆˆ‰ŠŠŠ‰‰‡‡†…„„„†44444444554444445555444444444455555566666677776666667634554433331100/.----,,---,----,,,,--,,,,,,----..,,,,,,..--......--------//134468;<<<<<;;=@DDHJLNOQRSUWXYXYXXXXXXZ[`fkpsqoeZQPKA8433208^qgdhnvuxƒ€xa3(*(**+,.<Zxsmls~vjiiiijpma]\^cabfhfY0+.34?fd^]^ZMJPTSC,'&$$&*.*-317AKWhp|‚‹‡”šx(/244310/,--++)%#!  "!#&(*,,-279<@BGMPQIBHKNSY__ejglni\TVMRdXSOPPMHA80/13666666<8=YzŠ‹‹Œ‘‘““‘••—’ˆˆ‰lFFIILMOQSVY\^__\\[\[XQB,$"##$$&)7Mcx†‹‹‹‰ˆ‚ynX=,)/@LYet~„‹ŽŒ‹Š‡‚€yvtdefeZZ^jjg_LHNk…ˆŽtSPLQYgnsuuw|€‚„†ˆˆ†…„…„€€~||}}{xtqkieedddddfffgilnpqtu‡•”‘Ž‹‰‡‡††……„„‚€‚‡…€€~zywtsqqpoooooooonnrxŠ‘–“ŽŒˆ‡‡‹ŽŽŽŒŠ‡ˆ‰ŠŠŠ‰‰‡…„„„……‡Ž44444444554444444434444444554455555566666677777777778AC;6644443231000/....,,---,------------,,----..--------......------....--//13558;=AABB@==@CFHKNPRTUXY[[[\]\\Z[[\\^_bhnsvtqg]TLQUPB5211/>enhfhqy~yi>%'*())*0Bdyolkq€ukhgiigflc_]^bbdgfgV31114Gfc]__YFFNSTRC+&$##'6=69?EOX`jx…Š“–›™U*,.10/...-,++*'$"""%'*+++,/37:@JKQQNJOLNPSW^^^acaaZVYSUc^QONNNLHE>72.+//02345Os‡ŠŒŠŠ‘€ps€Ž’Œ‡‡Š‹rHAHIJLNQSSSVWYWW\^^\XUE,!! "$%$'4Jbw„ŠŠ‰†~uiR3(56>DO^o|‚‰ŽŒŒŠ…‚€ztneZWVX^djdedRL[{‡‰Ž}of[Valonw}„†‡‡††…„ƒ‚€{|{{{yxtokheddccddeeeghloqrty–”‘Š‰‰‰‡…„ƒ„ƒ€‚ˆ„‚‚€€|yvvusqpqppoonnnnlot{„‹‘“–’ŽŒ‹‰ˆ†‡ŒŽŒ‹‡†ˆˆ‰Š‰ˆˆ†††„…†…ˆ44444444554444444434444444444455555566666677777777778DWN96544432310000....-,--------------..------..--------......------....--//23579;?DDEFEBACEIKNQSTVX[]^_````_`````bdgkpsvtrk`WMHDHMKA4101Gkkdchp}…€zpV0(*(+-17Jiumkhozojhhiieceha`_^bdeefU31112Pga_c`WEFKPQRP?)###%1DNDCMSZbiy„ˆ‰‘— –;/.00//./.-++*'$"! !#%&&*,,-/37?DEKMNKIJMOQSWZ^^a`b^YUSUc]QPNNNLHEDC>830.,+//Diƒ„„ˆŠŒŽˆwU=AYx†…ŠŒŒuPDHIIILMNORSURRTWYXVRPC.!! "$%$&2E]r‚ŠŠ‰†ƒ}sfR/&7;?AMany…‰ŒŒ‹†‚yskcYSQPKOVX^_^_v‰Ž‘•™œ›ŸŸ—}WU[TU[`cp~ƒ„ƒƒ€~|{zz{|ywsnjgdddccddeeegimpstu~’—”’ŽŒ‰ŠŠŠ†ƒƒ„ƒƒ‰ƒ€|yxvtrqqpoooonnnnnpu|…Œ‘’”•ŽŒ‹‰ˆ†‡ŒŒŒ‹‹‰ˆ‡ˆˆ‰Š‰ˆˆ‡†††††…ˆ44443455444444444444555544334455665566776677776666667:GN<555444331//00...---..-...,,--..------..---...........------------....//1469;>BHJMMLIGGJLNPSWY[^_bbcddddccddeeffjnquvwrlcZQJCBBFIID:10Pofcbfr~„~ykWC536:BJYoqjgenumkijjheecmda`_bdddeS0,*,2[idaghWIKMOOOOL9&$%(0AVXKHRXagr{‡‰‡Œ”šž„%(.320//.+)***(&# !""$&'*-/24:ADGPTYYZ[]^emvustpkf`_ZPWf`SPOOMKIFDBBC=:421+2\~‚ƒƒ…‡Š‰€mK*()=cƒŽ‡„‡ŒvPAIJKKKMOONNNKKPSSONMKC.!!""$%%(2H]rƒ‰‡†ƒ€{obM-)+/6?Malu|‚…ˆŒŠ‰ˆ…yskfYUQPR]_]\bgo{’•› Ÿ¢¥¤œWLNSQJG@;ALVl~‚ƒ~zyyz{zyvsmhedddddddeeegjmqstu†–•”‘Œ‹‹‹‹‡‚‚ƒ‚€†‰‚€€‚€€}xwuspoppppnnnnmnopu~‡‘‘•”ŽŒ‰‰††ˆŒŽŠ‹Œ‹‰‡‡‡ˆˆˆ‡†……†‡‡……„Š‘44443455444444444444555544444455555566776677776666666657:3554443310000....--..-..-..-.//------..---...........------------....//357:<@DIMORRPMJLNQSUXZ_abeegffhhiihhiiiinqtuvurlcZTMFB@>=DMNE?>\ldccis}yrf\UV[`dlrnigdlxoijihfbdbmlfecdfddcR0)**<gidfegOLOMNNMNNK8((.6:K\ZLQY]dmw~…ˆ‰‹Ž’–››h(//./-+)(())('$!!""#%%),/112FWdlqrvxzvrttvtrtsstrmaUXeaTONNNLIFDBCBDFIA0/Ao‚z{~ƒ„…}a7%()%2W}Œ†ƒ…Š‰sIDIJKKKMNNMMIFKLNNNOKIB-!!""$%%(3I_t‚‡‡„€~wn^F(+3/*3M_iqx|ƒ†ˆ‰ˆ‡}xpieb[U[\^\]agqŠ”™ ›’…iSHVaain\MJHGGDBJf|‚|zyz{zyxurmhddddddddeeegjmqsuw——’ŽŒŒ‹ŒŒŒˆ‚‚ƒ‚€†ˆ‚€|zxwuspopooonmnnmnopvˆ‘”“‘ŽŒ‰‰ˆ‡Š‹ŠŠˆ‡ˆˆ‡ˆˆˆ‡†…††‡‡………Ž‘44444444444444445555554454554455456666677766666655665563455543333222110./.---.............//..........////..--------..--------00368;?CFKNRVXWSOPQTWZ[^bcfehijkkkkkjkllmnrsssutpkb]TNKDC@><:=CEEOghddfoy||wysppprropnhefbk{pgfffeccbmvjfeadcdbQ,**,IlgfhgfKKONNONLLKH82599=SZTOSZ_iq|„‡‰‹‘•š›™C*,,***''&&&&&%#   !"!&'*/9Nahjjijpyyvustsqooponprrtsqm`UQOONLIGECBBEJQ``P[{€{||€„~m8&(%'/NwŠ†ƒ†ˆ‚hCDIJKKJKNMMLFFJKLLKJIG>.! "#$$%(3K`w†‰…‚~{tl\G.&1)(:P[elqw{~ƒ………„ƒ€{smijkhaZ^cgkpx‚‹‚B.0;M]`nqtfVXchimmh^RVgy{xyxzzyxupkfdbbddddddeegknqss{’—•Ž‹‹ŒŒŽ‡‚ƒ€€ˆ‡‚‚ƒ~|yvtrqpoooomlllmmosy‚ŠŽ“’Œ‹‰‰ˆ‰ŒŽŠŠ‰‰ˆˆ‡‡‡ˆˆˆ‡‡‡‡‡ˆ…„„†4433444444445544555544445455445545666667776666665566555553554333332211110/..-../00//////..//..........////..--------....------/0/28;@DHLQVY[[ZUSTUZ\^begjjlmmnnnnnmnpprsuvvvtsoib]UPMHEB@=9856;CRfeceisyuxvttuxvsolfbbebi}pijhjhiijo{nihcceb^N,*+/XlhfjnaELPPOPNLKIGFB?<=;=E9<KV^fnr|„ˆŠŽ“–›ž‰,!&(''&&&%%$$#"!   !#"'?Zfgdcdegrxxutvtsromkkllnpprv{}t\PLNNLHFECBCDHSamrz‚~{}}}~y],$%&$$/NtŠ†ƒ„‡€Z9DHLMMLMNMLKFHKLMMKJIG>.#!"""%(8Pfz‡‡‚~~{tiX>+,0,.EQZ^gkquz|}~‚€|yutspngefhkqxƒŠŒ‹\2DL\ba]nsm†Ÿ£©¦“ˆ€‚ogmvwxzywxsojedbbdddddefgimooru~—™“Œ‹ŠŒŽ‡ƒ€ˆ‡‚‚‚€}{yvtrqpoooollllmmoszƒ‘‘‘ŒŒ‹‰‰‡ˆŒŽŠŠ‰‰ˆˆ‡‰‡‡ˆ‡††‡‡ˆ†ƒ‚ƒ‰5544443333444444444555444444445555775556666666666666665555542244332111000//../....//////////////......////..../---..--..------/0146:@DHLQX\^a`ZXYZ\``dhijlmnooooooqqrrstwwvutqmfa\WQMJHDA?;96213<Wjcfeorghgfjkjifgiffed`fxsomiifeghh}rhfdaga\N,*)<gkhilmSBKOPQQONLIGCB@B>?9;54BQZbglu€ƒ‡‰‘•—˜šs $'&'%%$$""!!  "7[lica`acirzwuuwvtsrpnnlllkkloptz€wZLONLKGECCCCJT`kt€„}y{{xuoJ)&&%&&.Ntˆƒ……zO7BFJLLMLLLKHEIKKMKJHFD>.#  !!!%,<Tk~‰‡}yrgS8"'18=LQZ\`fknqrwy|~~~|wxwuqqqojnsz‡Œ‹‰ˆA'7EQ[]QUb}š³¼»º¹±¢Ž~p™wt|zzzyvsnkgcbbdddccdegilnqss„™—’‹Š‹Ž’„‚ˆ…ƒ€}zxvtrpooonmllllnlot|†Œ‘‘Œ‹‰‰‰ŠŽŽ‹‹‰ˆ‡‡ˆ‡‡‡‡†††‰ˆˆ„€‚†‘5544443333444444444555444444445555665556666666666666665555454444332111000//..///..////0/////////....../////.....--..--..----..00146:>AHLPV\`cda^\]_abfhilnppqoooooqqrsuwxxvtsokfa\VSPMJFD@=:74111GjeacilXKRUTTNJKWhfa_\Zdxpjidgjjgdexxkhfchg[J,'.PnihlojEELPSTRQOMIEC><@E>;9=9?TV[`gmv~„ˆŠ’•—˜X&&$$$$%%""!!   4Zkje``bcclvyuvuxxxxusqpnnlljjjklnsz‚y\ONLKGECBBEJRant€}ywwsp`9,,(&'(/Os‡‚€„„vI7BFJLLMLJJICEIJIIIHIGE?-$##!"#%,@Xm€ˆ‡‚€zrdP5""&2BMPVY\aeikmqtxz|||{{|{wtttrptx~ˆŒ‹ˆ‚71<ES_VQMn ¶¾º¶·£«´™Ž“š–€fXp{yvrmgccbccccccdehjmoqsuŠ›˜“ŽŒŒ‹‹Žƒ‚‚‚‚ƒŠ…‚‚€}zwutrpooonmllllmmpu}‡Ž‘Ž‘ŽŒ‹‰‰‰ŠŽŠŠ‰ˆ‡†‰‡‡‡†…†ˆ‰‡…‚†Š‘554444444433334444554444444444446666555677666666666666555344444444321100000////.//////////////////////.////.//.//.....---------/1358;@EJOT[aejiea]_bdfjljmnnpnnnnnqrtwyzxwvtrnid`\WTROLHFB@<97312:^ia`bkX04;:62/7Nhd\ZWS]xrigbdhjhilr}mfcbjo\G'(@hkijpp]?HNSTUSQPNIEA?=<>EB=8@ARdQYafku}‚†‰‹Ž’–—‘=&((%&%$##""!!  "Eloe^\`ddfjxzwvwxy{zyxvurqpqmkkkiijlr{„z[PLJFECDCDITant~zvsstqrZ7/0,(''2Qu„€~‚ƒp=3AHKJLMLJIABGIIIJIHIHF>,"#%#$%'/C[qƒ‰…ƒ€}ypaM2 !%9KPTVUX\^cegklsvxy{{{}~zzxxuvy|ƒ‡‰…„33<DT[LEX”´½½«–¨¤¬¹²‘†ž•…w_nxwvokgecbbbcccccegjmoqswŽ™˜’ŽŒŠ‹Š„‚ƒƒ‚‚‚…‰ƒ‚ƒ€{xwusrpoooomkklllnqv‰’Ž‘ŽŒ‹‡‡ŠŒŒ‹Œ‹‡‰‰‰ˆ†………ˆ‰‰†ƒ‚…‰Ž‘‘554444444433334444554444444444446666555677666666666666555344444444322210000///////////////////////////.////./////.....--------/01357:=BFMS[aejmjfcbdehkkjmnnpnnnopqsvx{{xwtsqmgd`\XVSPMJGDB>:74213Nj`]`gg5'*++,.9Re_WVPMVxshggcekejkn‚tiffmv`C&BdjhilpqNBKPUVVTROLGEC?=9:@JJ?9>E[XPX`bju{„‰ŠŽ’’•†- ()'''%%%""!!   /]nk_^`cegjqzwuvwxy{}}}}ywvtrqonmkjfhgksyqULJFECCCDJTblr|zrppqnnmaE1//++5Uw…~~€i2#5EJKNMLG?=CIKJJJIHIHF<*"##"%%&0G_wˆ‰…ƒ€}wo`H-#%,BPTWWWYZZ]\`dfkqtvxyy{}}}}|xz}~€ƒ……‚y77;AMRJDo¦·¾¶ˆ| ´º¸¶‘~Š—–’˜‚uvutokgecbaabbbbcegjmost|“™—ŒŒ‹Œ‰ƒ‚ƒƒ‚€€…‰…‚‚‚€}zvtrrqpnnkkkklllnpwŠŽŽŽŒ‹††ŠŒ‹Œ‹‰Š‰‡††………ˆ‡‡ƒ‚‰’445543555544444444333353444455556655555656665566667777664444443344343311111100////////0000//./00////00.///0000/..-....----..../134679<AELRZ`fknnjgfgiiijiklnpooorswx{|yxxwvsnige_\ZXSQOKIFB?:8622/?cc^afjG&(*)+/;Te[WRMNTtwfghiiifhlp~mkjhuzpgihhlpnphCGMQUWURRNIFEA>=;859FI?:9BIPPV^fmu~„‡ŠŒ’“w%"(((&%%$! !""Bjnb^`cefjpw{wtvxw{|~}~~}zxuvwtrqojgfeffmsz|iPJGFCECGLUbrxyupmnpoopomaG2-,7Vy‚~€~d0#$*;FHJH?53<CIKLKKJHHE8%""""$$&3Md{‰Š…„‚}vm]C)"*:LUWZ]\\[ZYTUZdhlqttuwx~€~}}~€‚‚‚~~‚rG9@CKICM‰©¶½¶{Yƒ‘©²ªŽƒ‹–“¡£œˆuqrokfbbaaabbccdfhkoqqr~–™”‰Š‹’‰ƒ‚€‚ƒ‰ƒ‚‚€~zwtsqoooonmlkklljmpxƒ‹ŽŽŽŒŒŒŒŠ‡†‰ŽŠ‰ˆˆ‡‡††††‡…ƒ€ƒ†‘“’‘555543455544444444333344444455444455555665555566667777664444444444222211111100////////0000//./00////00.///0000/..-....----..//0135789<AEKQX^djppmjgfhhijlknoqpqswy|}~{yzywrmjfc_\[XTRPMIFB?;962304[g`_bhW(%)),0<VfZUQOPUrxheeebekhimzƒskjio|zxoloppq\AHNPSUTROLGC@><:95328CG>15=CFQ[^enu{‚†ˆŠŒ‘”k%&&""#" ! #Nnl`_eddirwz|wtsuxz{{|}}||xtuxvtttrpkigefhmszx`KHDCDDHMXfrxwrqnmonnqromk`TB?\z|~€y[(""#!*8AA7/9@BFGIKLJIHD6%""""$$(:Qi{ˆŠ…„‚xmZ?&%1DRVY[^__ZYWTSY]ekmoompsx|}}‚‚|‚ƒmVCFEIE@a“¨²·¸ªŽ|†–•›•š”’’“›¦•ƒronhfdbbbbaacddfglnqrs„™™”Œ‰ŠŠŒ‘Ž‰ƒ‚‚€„‡‚‚‚‚€~zwusqooonmlkkklmknry„ŒŽŒŒŒ‹Œ‰‡‡ŠŽŽŒŠ‰ˆˆ††††††„ƒ…‹–•’Ž65554345555555444433443333445544555566666655445566756666545544443333211111110000//////0000//0000..//00//////00/..-....----..000135689<AEIQU[biptrnjggfhikloqvyy|}‚~{zwqmjfb_\[XUROLJGC?<973213Li^]aca0$()+0>XdWSQRTXirfabcaailrpq€ujffhq{zyuonprnNDJNORRROKJEA><:75331/2@C:37<?DT\acnu|„…ˆ†‹“’X"$!!  "#$&# -Yokedhhinrusvwustuvyzyz{yrjiihquqprvwrolhfilpswrSIFFBEIP]krwvonmnpmprqojeiooko€|~}wS$!#$#"%#+*(/:?EGIIJEFF?1%#$""$%-?Vm€Š‰„ƒ€ylX:&*;JU[ZZ]__]ZWUSV[`eikljkowz|||}€‚‚‚~ƒ‚mVOLGIBAlš¥««¨šš¡ ¡˜“™š˜Ž˜˜ˆskidbbbabbbcceggjnqssŠœ™–ŠŠŠ‘ˆƒ„ƒ‚…‚€}zwsqonnmllkkjjjkkns{†ŒŽŽŒ‹ŠŠ‹‡‡†ŠŽŽŒ‹‰ˆ‡†……………ƒ‚…Š••”‘655555665555554444554433334455545555666666555555666766666555444433333311111100000/////0000//0000////00//////00/..-....----..00013568:=?CHNTZ`gnrusnjighhinqv|ƒƒ……‡‡‡ƒ~{zwqnkfb_\[XUROLJGC?<973200@c`X]be@%((*/A[bVRQTVVdsg`ccchmmokgqsh^_cimrx{xttm]GIKMNOOOKKJEA>;9653321/2<=437AGRYYaemuy‚†…ˆ‘M  "%(+-% 7amhdgimmrxunprrqposvvwyzphcehmnopnmkkrxwoihjlmrtsdMHDCGKUcotvtnmmonkntrpljhimr{ƒ€{~|sK$!$$"$$$'*+).:AEHIKMLE<0&$$##&'0DYq…‹ˆ„‚whT4%0BLRYZ[^``_\WUSTY^afhiknpuquz|}€‚‚‚€„€n[ZZTQHDqœ¦¥£ž•—˜Š‹™—–“–š˜•šœ“‰‚jedabbabbbcceghkppsv‹š˜•ŠŠŠŒ†„ƒƒ€~€ƒ‚}zvsqnnmlllkkjjkjlnt~ˆŒŽŽŠŠ‰‹‹ˆ†‡Œ‘ŒŠˆ‡††…„„……‚‚‚ˆ“•””‘55665566645555444455443333345544555555556666666666666666665554443333332211001111/////0//00//0000///////////////..-....----..//123579:=?CGLSX_flqwurokighiot{†‡‡‡ˆ‰ˆ‡…}zwrolhdb^[[YUSOLJGC?;8621./4SdZW[cS&%(+2C]aXRQVYX`ricjjnlkmkllcgie`]cinquzzn^OMNMMNNMLKJIEB?=96522/.../6A?7>GNWaU]dlt{‚‚†‹‘•A  !!!!  !%(/4-Aemhehjknvwpiknrponoqttuvkcaaagjmnqnlifju{slljjlnpqmWFCCHNXeptxqnopqnjmrroljjhkt}‚|}}rC#$$"##"%%',.**4=BGHGHE</%$$$$&)2G^u†‹‰…€tgS1&6DKOV[\_^]_\YVTTX\`caceikppmuw|€‚‚‚ƒƒpdgcZVQOu¦¥£™–“ŽŽ’”™•”›¡ ‘‘Ž|fbca`abaaccegilqquy™–’Š‰ŠŠ†…ƒ~ƒ‚ƒ‚{xuqnmmllkjkkjhkkmow€‰Š‹‰ˆ‰‹ˆ……‡Ž’ŒŒ‹‰ˆ†………„„…ƒ‚ƒ‡”–•”“9999886676555533445544333333444455555555666666666666667666664444333333221122111100///0//////000000/////////////..-....----..//013579:=?CGLPW\ciorutpmifhltx|„………†ˆ†„{vspnlhdb^[ZWTQNKIHC?;86220/1Cb[XZ`]2%+.0@Z]VSUWXY`smdhpqqnnqmnk_]bidfgklngaUQSSTQQOOMKIHGEB?>;762100//,-7FE?CHNidU_glqx}~ƒ†‹‘•‰8   """""""" !#"'/8HZhhhkmmqwvligillmmopqqtr][[[_`ekopnoqmjditwqokkmlnnreIDBIQ[hqwunnpppmfirrpnkljiq{„€z|{k;$&%$%%%#%',12+$(6ADGFB7+#$%$$&*6Mcz‰‡„ƒ|reL.&7EKOSYY\^]][WUUUX\^abddccikjorx|€‚ƒ|rnkge`\\|ž¤¢œ™“‰Š‡z’“—˜••™¢Ÿž“†}kcbbbabaaccegilqrt{’š–’Š‰Š‘‹…„‚~‚ˆ†€€‚{xupnmllljjkkjkjjmqx‚‹Œ‹Œ‹‰‡ˆ‡‡…††’‹Š‹‰ˆ†…„„……ƒ‚…‹‘–•””’Œ9899998777665554444444333333444444446666556666666666666665664444433322221111111111//////--//0000110000//00/////..-....----.../013579;>@BFJOTY_eiptwsplggmwz}€ƒƒƒƒ…„‚‚~zvusplifca^[YVROMJHFC>:86330//5Y`WX\aC&),0A\]WVVYYY_sqijkmqljjlnjjdXYYR=:>BFRSWYYYVSOOKJGFDB@?<;9740/.----/8FKFFCSrcY`iisz}ƒ‡Œ”‹2! !!"####"$$%$$""(%5HMRZdjootxwiceddgggknpnojRQXW[\_cfhlpsutnjdkyyspllmlorpUDCJQ]muxrnoppnibhqspmmmmlu}„€|{yh7%''%%'(&'*./41*$%-:DC@3*$$$$'',9Pg|‡†„ƒyn_A)(<EJNRVY[]]\\[[ZZ[]_`a``_beedhlpx{}€€|wsspkgfe™ž–Žˆ……~sVo‹•˜™””—š˜‰yydaccabaabcegjmpru}”™–“Š‰ŠŠŽ“Š„ƒ‚~€‚ˆ…‚‚€{wtpnmkkkkjkkhijkmsz„ŒŒ‹‰‡††…„‚…‰ŒŒŠŠ‰ˆ†……†……„„…Š”•”“’’ŽŒ;::::::877665554444444333333444444445555556666666666666665554444443321221111110011//////--//0000..//////00/////..-....----.../013579;>@BDHLRV\agmrvvspljnuy{~€€€€|zyuroljgeb`^[ZWROMJHFC>:86330..1Ib\Y[`T((+0B[]WUUWWX\ovlnquyqoqrkike]\ZL==@HNTXY[[YVSQOMIDCBA>>=<:8520...//159CLIB2F^g]^djsy‚„†Œ•Š2! "$#$$$$$$$%%%$%5SlbNJWblqx{obaacaaccbgklnaAELRXY]bcdgmquuwsmiit~yqnkmmmprcHEJUarvxropppnb_gqupmkjhlr|ƒ~}}ze1&&'%%&(())&%)24,&%%.;>1&$%%('(-?Voˆ†„ƒ€€ynZ8(0?GJNQTY\][]][[[[]^^_`_^]^bcbcgjovy}}}€€{uttrsqop„”š–’šš”v{ƒ‰‹–™›š˜––—˜•ƒ|o`ababaabcegjmqst˜™•’ŠŠ‹‘“Š„ƒ‚€ƒˆ…€}zuspmmkkkkjkkijilns|‡‹ŒŠˆ†………„„‡‹‘ŒŒ‰‰ˆ‡‡…††……„„ˆ”•”””““ŽŒ<;::::::98887766444444333444333344556655555555666655666655444444333322221111000000////....//////00//0//////.....--....-------.012479:=?AEGKNRW]bjpuwvtmlovx{{~~|z|{{zxvqolkiecb_\YWTROMJEEA=977321-./9]aYY_a6&+0C[^YYYZ[[_kwqnmpy{xtwohef^WTG<>BHMRVZ\[ZWUSPLHDA@><<;:8764311/015;?;;JMFAB]g_`dkry€ƒ†Œ‘—ˆ/"&#$$%&##!$$%#*FhuqdLAJ`t|yg_b^_acccaaeikT?CJHOTWZaa`dintyzwtqloy{rmmmmkmmiPILWfvxuqqrqpm\^fptqmkkiks}ƒ{}xa,'('(('(*)'&'(-00'(()*//*)'&(%&0F\sƒˆˆƒ€€yjU1'5EKJLPRTXZ\\\\[\]]\]``_`]^^[Y\`elotwyz}~xrstuwutv…Œ‘“ ¬¬¢•z{ƒ‡Œ’•šž¡•”˜™’‚xdb``aabacehknrtt…——“ŒŒŠŒŽ‘’‰ƒƒƒ‚€€„ˆ…€€€{wvuqnmlkjjjkkkkjkowˆ‹‹Šˆ…„ƒƒƒ…ˆŒŽŒŒŠŠ‰ˆ†…††……ƒ…’••”””’’’ŽŒ=<;;;;::98887766544444333444333344556655555555666655666655444433333322221111000000////....//////00/////////.....--....-------.012479:=?ADEILOSY^dkrvwwrprsvwz{z{{zzzywuroljheba^[YUROMKHEB?;976411../2Ma[Y[bO'+/=X`\\\^^`agwuoqw‚‚wvxrkheUJOA:=@CKQUXYYYWVRPMJEC@>=;::::86532334<=;;=<>S]Zcijcddmsy~€ƒˆ——ƒ+('&%&&$#%$!(Onxi`c^K<ATntdY[]^bbbfe_`hdO=?ICGHNUVUWZ`hoty|{xuqlt|tlllkjhhhXKR[mwvqpqrqpeW[fosplkkjmt}ƒ||wY)'(())*))('''(*-4.(()****))*)))3Kat…ˆ†‚xfL-,<GJKLNQRVXYZZ\\\\^^\Z^]Z]__\YZ\^biostwywqnpuuuuvw‚† ³¶®£€{„Œ‹‹‹”š™šž –”š“‡|rabaa```bfhknrtvˆ™•‘ŽŒŒŠŒŽ‘‡‚‚‚‚€~„ˆ…€€€{wtqpmmlkjjjkkkkkmrw€‰‹‹ˆ‡…„ƒƒƒ†ˆŒŽŒŒŠŠ‰ˆ†…††………Š”••”””’’’ŽŒ==>=<<<;;;99887765444444334433445555665555666666665566665544333333321111111111////....---.//00//00/////...........//..//.-....012468:=?ACEGJNPV[_fjntwurqrtvxyxxyyxxwutonlihfb_]ZWSPNLIFC?>:97422/.--.=^^YY`a;(-=Xe`_^_ciigs}ut|Š…ywwunj_QJPE:=@CGNQVVWVUURPMIFDA@><:::::7544579=<<;=6,3L^fginndbjqw{€„†”—…&!)')'&%$#"5qyrke_]XN?>QRVYYY\^bbeeeefWD=<BHEHFMQOQT_hosstvyywups}xolkkjhif[RTapvtprssrm^VYbnrnjjjimt~}~uT'()(()*)(('()'),21)'(*+*+,,0--/;Si|ˆ‡„‚ƒ}scC+/>IKKMPPQRUWXYZZ\]_^]]]]\\]^ZWXY[[`ippquqghmosvxwz‹®³«žŽ…„‚‚ƒ‚‚Š—œœ›Ÿ¡œ–’˜‚~f`_``a`adhmprtwŠ˜•’ŒŒŒ’Žƒ€‚‚€„ˆ…€}{wsqnmlkkkkkkkllkmqx‚‰‹‹‹‡………ƒƒƒ‡‹ŽŒ‹‰ˆˆ‡†††……„‡”–•”””“‘‘‘Ž‹@@?===<<;;99887777555544334433445555665555666666665566665544333333321111111100////....---.////--00/////...........//..//.-.....02468:=?ACEILMNRV[`glpvxxtrtvvvwwuuvvutsnmkgfe`_]XUQNLJGDB?=;:8641/.---2Q`[Z^bR*,9Udcddelppir~z}‡Š|v|unf`UK=:9<?AFHMRSTSTSRPMJGEB@>=;:;:7544456;>=<;;3/+*<Yfgjrthcdktz~‚Š”˜‡,"))'''#@rvnjjkijfZA8IMEOUVY\acdeg^C4E?AQKEHHILNS]flrttstuxyxvx}}umjlhffcaWZiuwsprstphVTXalrnjkijnu~|}rK$')))()((***)*')03-''(****-0339G\s…‡…‚‚|r`A+3BJKKMPPPPRTVYYYZ\___]\\[Y_^[TUY_`ZbjjmodZ`gnswy|€…‘ ¨©•Ž‡‡‡„‚‡•œ›™žŸ•—‘Š~o_`__`_cfkmppuv‹˜•’ŒŒ‹‹Ž“…‚‚‚€„ˆ…~yurplllkkkkkkklllory‚‰‹‹‹‡………„„†ŠŒŠ‰ˆˆ‡†††…„ˆŽ“––•”““’Ž‹A@ACB@?><<;:::88776666554455444444445566665566555566665554443333222222011110//////....---.--...........---............//.......02458:;>@BDFILMQUX]dhlquxtrttuuusssrtrroljhfdb_[YVSPLJHFCB?>:87641/-,,,-A_]YZ^b=)7Qffiknqutpt|‚ŠŠpmuslj_XH789:<=AEKPQPPQPONOKFB@?>=;;988543237=>><<81...+0Jchhqqogfmsx}ƒŠ“–(!'+('"3suokkmmloo[C8<ODJUXZ[\^^[L94586EMIBIJJLT\cgimprqppuxzzz}}unhjgcaab\`pzxqqqrslbPPW`jpkjljjqy|~€qC&''(''()*))**)(*-150'(())*,234>Rfz‡‰…‚}yo]:+9EIMOOOPOOPRRVWYZ[^^_`]YXXW][TSUYed_dehk]V^fmtz{‡Œ”¡ ž—“‹‹‹††ŠŠŠ‡‡‰›š˜ž˜–’ƒyda`aaadgiloswz’˜’‘ŽŒ‹‰‰Œ’‹„ƒ‚€€„Š…|ywtqpomkjkkjjjjjjkns}…‹Š‹Š‡…„„…ƒ†‹ŽŽŒŠ‰ŠŠ‡†††…ƒ…‹’”•••”’‘’‘ŒBAA@?@?>>;;:::88776666554455444444445566666666555566666644443333222222011110//////....------...........---............//....../123468;=@CEEGJLPSVZ]cglquuqqqpprrppqpmmljheca^ZXVTQMKHFEBA><:76420.,+++-3O`VUY`W,2Jaklmqvxvqqs€mtlnvieh^XWB8::99:=AHNPMKLNOONLHC?<;:8778854325:?@><<71//0/.+5Sjjjurhejr{€ƒ‰‹’v$('(&jwmhjprttxrZG<7GIESWYZZXE657:81:DB@BDHIQ]dgfghginnprvxwvyzuojhea_`a_dswvsqrrpiYNOU`ilijljjq||€m<%'()))*+*+**++*++/471&'()),18<I\rƒŒ‰…„‚€wjV4,:DIMOOPRQONOPRUYZ]^_a`]YWUU\_]YSONaggfgfZYagrv|~ƒ‰Ž‘—››—‹’””‘˜ ¢žš’‹Š‘—˜–š›™’‡ˆ‡tfeddegilmpsw~•™“‘ŽŒ‹ŠŠŽ‘Šƒƒƒ„‰„~|vsqmllmlkijjjjjjlou…‹ŒŒ‹‰‡…„„…†‰ŽŒŒŠŠˆ†…†„„‰”••••””’’‘ŒFFEDDCA???<:998877777755333344443344555566666655555566555544333322211101111000////....--,,,,--..//------........--...........//112356;;>>@CEGINQTWY^chnnoommnnoommmkkjhgeba^[YTRQNKIHECA>>;86631/.,,++,.<\XST\_A)=Tflos{zvolgin[bq†Œxg[OSSB::;9977;CJMKHFJKMLKEB<::88887643237>BB@><5111100/,'@]flmpmjmvy~ƒˆŒŒ‘O#(&Qzqkjpuw{}`VG;3;B;?IUZO5)6;9=@=;;>BDGIQZchifabc`_eikoqstsrqqjd`_^`_chwxtturqodRMNT_fhjmkikr|„}€m@2.*++++****+,--,--08</&(),..9ASgy‰‰…„‚~udH-+:CGKNOPRSRONNORSX[]___^ZVTQZ`c_ZWTU_giie[_hnuz~‚‡Š‘–”™¤¤¢žœššššŒŽ””˜›–‡~‹†}lhkiikmnrsuw‚—˜“‘ŽŒŒŒ“‰ƒ‚ƒ€€„‡‚~~{wurolllkjikiiiijjmpw‡Œ‹Š‹‰†…„„„‰‹’ŒŒ‰‰‡……†„†Œ“••””“‘”’Ž‹HHFECCBBA?>><<:988777655433344443344665566666655555555555544333322211111111000////....--,,,,--....------........--...........//0123578:;=?BEGHKORVXY]begikkkiijjiiihhfedb_^[WUSPNLJHFCA?=<886420,+++++,,2M_VQW[W,0=P^houztmh_WQJZr…Ž†€sfe`I=9;99778>CIHEEFHIHGC@<:85545653357=CDBB=94222010../,+Dcjmpqmpsv~€…ˆ‰w $"B{qhjovy|‚w\VVI9257876;8,05679:>>>EHLQTZ[aijfa^cf_Z\_abfoqmlnqjd`_^^]alvtqqrqoo`LKOU]cekmjjnu}†‚‚„rRIE<0,,+*++*+..,+--.2:92)-8>7=MbtƒŒ‰…„ƒ‚€ueJ/'0>FJKNQPPOONMNNORX]]^_^[WTSW_fhdcbejklnjcipv|‚‡‹ŠŠ‹‹“š¢£ š˜™š—•––ŽŠŽ‘’““•‡„‚vpnmooqrswxy…—–’ŒŒ“‰ƒ‚ƒ„ˆƒ~~{wurpmlljiihiiiijjmpxˆ‹‰Šˆ……„…‡‹“’ŽŒŠ‰ˆ‡…„„‰”••”“’’’‰MMIHGFDBCA@?=<;;8986556666554444444455555555556644444445544333332222222221//////......,,,,,,--,.---...------------..--..........0023668;<>@BEHHMORVXZ\`bdeddbcegfeefecba^[ZXURPOLJHHEAA>;;86421.++++++,-,<[YRU[bE&19EW`ksoha\XUIH`|‰…{uujN<9<:87658=@A@BCCCCDA?<96430//146;?BEECB=6323311210320(3Rgmmjt}wtvz‚€j7 4uujjnvw~u[TUVN>423565432788::99CJNPT\_`^ejhe`cghec_]YPP`omjlqkb]\]^\^ovqopqrqlRLLOSX\ellgimv€†……ˆ†ylc[SD4-+++++++,++++,.4;=033:>DZnŒ‰ˆˆ†„{uj][WLEADFHNONONLJD@ILTZZYX\\[WY^flooprsstqsrqsw{‚ƒ†‹Œ‹ŠˆˆŠŒ‘“—š™™”“–˜˜–“‘ŽŽŽ’”†…Š„}wustvwwxwz|Š•”’‹‹‹‹Ž‘ˆ‚‚‚‚€~~„ˆ~|ywtqpnlljjjiiihhkklqyƒŠ‰ˆŠ‡………‡‰Œ‘•’‹Šˆ†„ƒ…‰Ž”•””“’‘’Ž‹NNLKIHEDECCA?=<<:996556666553333444455555555554444444445533333332222222221//////......,,,,,,--,.--,---------------..--..........00234779:<>?ACGJMQSUUVX\\^]]^_acba``_`^]ZWVTROOKIGFCA?><;98521.,++++++-,-1G_WQZd_0(0:MX[ced^XYZRJNlztpoorbQA<54421/14554678;<><:;964332158?BEFFEB>9311222255555450/=Zinny}{ueRT8'/ltihlow~|gWWZ[XRA3468<3/1666:>?BJMOTWW[__bfgfedeehea[YRE@Qfjjkpi`[[\\\eyzppqsqpbJHKNPU\eolikp{†ˆ‰Š‰‰…ypd[I6,+++*++,++++*,/5>735=BQizˆŽ‰ˆˆ†ƒ}tj\]affeWJFGLLJKGA.*>BFVXXY\`_]^emrsstvyyxxwvxz}‚ƒ†ˆŒŒ‹‹‰‰ˆ‰Œ“•––’‘’“““‹’–•”“”‘Œ†{wyzzz||‹““ŽŠŠŠŠŒ‘…‚‚‚‚€~~€‚ˆ~{ywrqpnlkiiiiiihhjklq{…‹Œ‰‰‰†…†‡‹Œ‘““’‹Šˆ†„ƒ†Ž”••”“’‘“‘Ž‹ONNMKJHFEDCB@?>=;;977677555555444444444444444444333334544333333322222211110///....----,,,,,,,,,,--,---------------------.....-.-001445789:;=?AFGKLOPQQSVWXXXXZ[]]\]\\\ZXURRPOLJJGECAA?;9764320,,,,**,,,,,-7U[SU]eO&,4@MSUYXTRVYXUR]lmkfhibXK8-.-+*(('''''*-148<ACDDEGGC@AEFGGGFEA;40000155766655633.0Ibgs{|xX $+kvlnqoryscW\\[^\UA556530-/4DIFFXdTQVZZY^^bded```dcdc\WTM?:CUbggkg_ZY[]]n~wpprqqsXFEKNQW]ejlmrx€‡Ž‰ˆsk^L4-,,,-,,-+++++-16:;;BLZrŽŽŒŠ‡‡†|sh`]bfcbbYGOMG>9=?9#/3.GXZ\_cdcfkrvwyyyyz|~}|}€ƒ…††ŠŒŽŒŽ‘‘’’‘‘‘ŽŒŒ‘‘Œ‹Š‹Š„€€€€€ƒ„Œ’ŽŒŠ‰‰‰ŒŽ„‚‚~~‚ˆ~zxvrppnlkiihfhiiiikms}‡‹Œ‰‰ˆ†…†‰‹’”’‘Ž‹Šˆ‡…‡ˆ’–•“’’‘‘ŽŽ‘Ž‹PONNMKJHGEDB@>>=<;987677555555444444444444444444333334544333333322222211110///....----,,,,,,,,,,,,,,,,,,----------------.....-..//03345789:;=@DEIJLNMOOPQRRRUWYZYXYXXWVTQONMLJIHFDB@>;977531/.,,,,++,,,,,,/C_WSXch>*-3@LPLLLMNRVYVTgkkhcbb^[J+('&%##!!""#$&)09ENQRPOONMJIIHGGFCA<7100001567666445554105I^owyye0*izmnmnrxw\XZ[\]a__G65531-.04FJILelSSSRSW]]acb_\\\]_^ZYQNC:7=O`g`ij`\\\[ax~urpsqqlLBEIMQW^djnuy†‹’’““ŽŒˆ€vk[D0-.----,,++++,/4;;=@Nbvˆ’ŒŠˆˆ‡‚{pe_DFciea^Scmg_VL=@;9<@KY_acefhnrvyz||||}~}~€‚†††‰Ž““•––———————•••“‘Œ‹ŒŒŒŽŽŒŒ‰‡…„ƒ„…„ƒ„„„‚‚„„ƒ‡Ž‹ŠŠ‰‰‰ŒŒ‚€€€€~~‚‡~|zwurppnlkiihfffhhijovˆŒ‰‰‡…†…ŠŒ‘“”’ŽŒ‹ŠŠˆ‡ˆ”–”“‘‘‘‘ŽŽ’Ž‹TSRPNNMKIGFDCB>==;9:8677466655444444444444444443333345442222331133222211000///..--,,,,,,,,,,,+++++++,,--------------------........013355778:=@DDFHIKMMMMNNOOPSTSTTTSSRROMMKIIGGFD@?<<:75421.-,,,--,,,,,,,-.5TaVX_fa0+/6ALJFGHGHMVUSXiopcZ\daWC'%%#!!""##$')/:KUTRPOOONJJIIGDDCA=7300001446777;895653560.07?EB5,jxnnrqpzz]XZ\_aa`aO@74430/--26>ABJNQWXUTUZ]__ZZ\[]]YTQMGA<66=O\^V`lb]]]\lƒ~uqqrsp_DBFHLOV_cgr|…‰Ž‘’““”“ŽŒ†tgV=//......++,+-.07<@ERj€ŽŒ‹ŠŠ‰ƒ|pdcP=^gbeehhhhlolbODKQQYafgknrsx{€~~~€~|}~ƒ„‡”˜šž   ¡¢£¡£¢ ™—”ŒŒŒŒŒ‹‡†‚‚ƒƒƒƒƒ‚ƒ……‡ˆˆ†……‰Œ‹‹Š‰ˆˆˆŒŽ‰‚~~~~~~}€†~{yvtqonllkihgfeeggijpw€ˆŒŒˆ‰‡…„‡‹Ž“–”’‹‰ŠŠŠŠ‹‘––”’“‘Ž‹“Ž‹UTSSPOOMKIFFCB@>=;:8977765665544444444443344443233333332222211111122221100/////.--,,,,,,,,++++++****++++,,++,,------------......//01115577:<<>ACDFFHJJLMLNNNNPQPQPPONLLJJHFFEDCB@?<::86420/.--,+----,,,,,,..?a`WX_gO(*.6BMJGIEDHKMTW^mqf_`de^T9!$"! """$',1?P[YXYVRUQNJGFFDA@?<9400001244668<><9557754410/-.+1evmkoqpw{cY[^^dffP>8;84422101347:BKPX[YZYY]]]]ZZ[\\YTPMI=8656=KSTQYhe[]]awƒ}vtutsqR?BFGKOV_houˆŽ‘”–—••“’ŽŒŒ‡}sbM5---....,,,++-,27K\dtˆ’‘ŽŒ‹‹ˆ‚ylcbcZ^eccefiiggjooppokdgmrsuuyz€‚‚„„‚€€€~|{zxy{|}…œ£¦ª««««¬­®°­ªª©£Ÿš–‹‹‹‹‰‡„„€€€€€€‚ƒ‡Š‰†„…‰‹Œ‹‹‰‰‰‰‰‹ˆƒ€~~|~||}€ƒ}{yvtqomllkihffefggijqz„Œ‹ŠŠ…„„‡Œ‘••’‘ŽŒŠ‰‰Š‰‹‘”•““”‘Ž‹’ŠXWUSRRQOMKHIEC@>=;;9977765554444333333333322333344222211111100110120110011//...---,,++++++******))**++**++*+++,,,,--,,----..-.////01333356799;=?ACEEFHIIKKLMNNMMMKKJHGFDDBCCB@A@><;967410/.---,+----,,-,++--4PeYWX`g=#,/6CKJFDCBEFHQWerjihb]X\S2($!! !"%)/=S^^``\[[TQKFBAA?>778821001233478;@A=8875544320-,-6lwljonnwzh\\[]`aW:(.7;9520036435:?GPUXWTVYY^^]\Z[]^^ZTRQG;7524:FMQSVdf]^[f€ƒzwvtstvkK=BEJQU\ky~ˆ’•–˜™—•’‘Œ‹ƒym]C2.,//00...++-..4CawŽ”’ŽŒŒŒ…€ug`_aabacddggeehnrrvy~}||~~†††ˆ‡ƒ€~|{xwtrsttt~¦¬¯±´´´¶·º»»º´³²®©¥•Ž‹ˆ†‚€~zzy{{{|}ˆŠˆ……‡‰Š‹ŠŠ‰ŠŠ‰ŠŒˆƒ€€€~~}}~‚~zxurqnmkjiihffffggijs|†ŒŒ‰†„„†Œ“••’ŒŠ‰ˆˆ‰‰‘–•’’’‘‘Œ‹Ž‘ŒŠYXWWUTSPNMIHECA?><<:877765554444333322222211222233222211111100110120000000//...---,,++**********))****))+++*++,,,,--,,--....-.//001122223668::<=??ACDEGGIIIJJJLLIGFFDCDA@A@@>=><<9864520//..--,,----,,-,+,,-/;ZaZUYed3&,/9CKHEECAAAHPZkuwp^PU`bJ( !!!!#%+6N`bedb_YOHA8500277569842111233567:>=:8875544533,-Bmumjmqqvyga\`^aX:))-07:952028755:?HORX[WOOVZaa^\Z[^]^ZXVWNB<655<FOUSR^g^Z\m‚xvustsqvtSAGLMP_s}„Ž’””–—™˜“‘Ž‹ŒŒŒˆ~sfW>149;;<862-*+022C_y‹““’ŽŒ‹ŠŠ…|ob_baabbdeeeggjkprtx}€„ƒƒ……„……ˆˆˆ‡‡ƒ€zxwttpqonnqu«±²·¹¹¹»¼¾½½¼»º¹·°¬¡–”•ˆ…„ƒ‚~|ywvuvvvwy{~…ˆ„„ˆ‰ŠŠ‰ŠŠ‰Š‹‡„‚€€€€}}~|yvsrnmlkkjihffhhhhimt}‡Œ‹Šˆƒƒ…ˆ””’‘Ž‹Šˆˆˆ‹’”’‘ŽŽ‹Œ‹Ž‘‹[[ZXXXTQONLIGDB@?=<;88875555323333332222221122000111111111//00001110//0/-/..--.---+++*))))**)((((()()*+++++++,,,,,,,----..--..0000000012445788:<<=>ABDDEEFGGGGFEGDCCCAAA?===:<=;9864332///..------,,---------3Hg`WU\g_)&&/5@HGFDA@@BIT_nro`PT]^W;!!""$'.D]ccdc\ND7,(#!#'(+.15:<943347679;==@:897565445307b}xmgkqsuw`Z\_abS-&(-/36477418;899>FOTUWWTPPRW^___\\^\[ZZ\\XK?<89DNTUVV[daW_v€}yvtprrjjwxXEIMVcw‚Š’”••–—™”‰„‡‹‡|qcSEGLPPPMHC@81214Ed|”“Œ‹‹‹ˆ†xk`_cbcaabcfghjossu{ƒ…†‡ˆ‰‰ˆˆ††ˆ†…„ƒ€~yvspohfimpmn˜­²³¸¼¼½½¾¾¾½¼»»»»¶°§žž–‹€€€{yxvsrorpprrvw„€{~…‹‹Š‰ŠŠŠ‹Š†„ƒ€€€~~€ƒ{xwsplllljiiihfiihhilu€‰Œ‹ŒŠ†„„†Š’•’Ž‹‹‰‡ˆŠŒ’’“‘ŽŽŽŒ‹‹‹Ž‹‰[[[[YYVTRNMJGEB@@>=<998755553333333322222211220001111111110000000000100//..-,,,++++++)))))**)((((()(')*****+++++,,,,----..--..00110000124446889:=>=>?ABBCDEEDDDCCB@>>===<<;;;:::77522221///.----..--.-...-,,--3ShZWY^iQ#%*,3>FHDCB@<AIRfppk`[^]]T+!!"%*6QdbceZF0,)%$"##$$&(*/9;844447;==?BBE@;:86766750Ku}tkimqvzua[_Z_gK((+.-1038:7<FE>;>>GMVXTSSSPQSQUZ^^]ZZYYYX^d`OCB>?FRUUUVXa`[i€€|wususj`bkuxXFKXo}†‘’‘‘’’’‡€~zz‰ŒŠƒxsid_bfffb]VQJA846Ml„‘’’‹Š‰‰‡|rdb`bcbb`abdglptw{|…‡ˆ‰ŠŠŠŠˆˆ†…‚~}}}|xsnjff_hmpkoŸ¯´¸»¾¾¾½¾¾½¾½¼»»»ºµ¬¦‰zz}~zxvtromkhhjjljoy}v{‚‹Š‰ŠŠŠ‹Š†…„ƒ~~€„‚zwupnkjiijiiihfhhhhjpw‰ŒŠŒŠ†„„ˆŒ”—“‘ŒŠ‰ˆˆ‰’“’’’’“—˜“ŽŽŒŒ‹‹‹Ž‹‰[[\\[YWVSQNLJHFD@>=<:9765542223322221102222222111100000011000000//0/....---,,,+*++**))(())))(())((()()))*****++++,,,----------/1..0011223333667799<>>@@AAAAAA@??=>><;;::::999866555221110000----.....--------./8Wc\XYcd@!%)+1;FIB@@>=@EUjsrmkihieD!""#'.?^iedbL3*+)%#!#""#&(+/79666679=@BCFHGB?;8766543I~yrmilqsyud[^]aaD$)++-.047:=9>JF<9=ELPTXURRRNMONPSV[ZXZZ[VTZa]NHFCCDLRUUVV_`ar|xwvtvtd]`glssVO^sƒŽ‘‘ŽŒŒˆ…}qotvyŒŽ‹†€}zxy{}|zwrkf\VKFK[q‡”’Œˆ‰‡†…|xkaadbaccehiknquy}}‚…‡ŠŠŠ‰Šˆ‡ˆ†…ƒ~zvvwvvusmhb\_dacgm‚¡«³¸»½½½¾½¶¾¿¾½½½½¼´ª …styyyz{zxurpkgffijhdemnw{ww|‚‡‹ˆˆŠ‹‰†‡„ƒ„‚€€€„‚{wtrpllkkjjiighhhiikq|„ŠŠŠ…„ƒˆ•–”’ŽŒŠ‰ˆ‹‹‘“”“’““˜¡¡›’Ž‹‹‹ŒŒ‘ŒŠ^^\\[YWVTROLJHEECA=<:976654222331111111111111100//000000110/////./..--..,,,,--**++**))((((((''(('''()))))))******+++**,-----..--//001122445566779:;<>>>@?????>>><;:9998888778866553221110000/-..-,---,-------./0?_cXVYba.#''+.7CGFBB>;<DXv}sjgbnt]/ !$'1Hhmml]7*-)'%#"!#%#$&*-46666679=@DFHHGC@<985441:s‚uonqstyyb^`]agI%%*/9:78>>?A>=FD?=@FMNLMLKNQMLNOOQRSVWW[\VTUWUNKKGEEHNUUVV\dj}|vusuuuua]bbekso_i{‰‹ˆ††‡„€xkhmtrx…‹ŒŠ‡„„†ŠŽŒ‹‡{tlf\\_m{‹’‘Š‡‡……„}tf]^_bdcfgklquw{„…‡ŠŒŒ‹‹Š‹Š†„€…wnjjkljd[WTQRUSW`‚Ÿ¡ª¶³µ»¸¸¼¾¼½½¿½½½½¼¹¦}imqtuvvwvuronkidipopkfltsjekpuvˆˆ‹‹‡††…………ƒ‚‚€ƒ‚}wurqllkkjiiighiiiikq{†‹Œ‹‹Š…„‰“–”“‘‹ŠŠ‰‘’““’‘‘“œ£¤œŒŠŒ‹ŒŽŽŒŠ]]\\[YXWTRPNLIGDB?<;:987643322111100111100000000////....//..........----,,,,--++**)((()(&'((&&''&&'((((())))()****++++,,,,--,.--0000112222223456778;<=====<<<<<;::::9988776888655533210000000///..--,,.---...---1Fd^UV]hV%&'&(+3?IGA??<:C^qjjbapsqM##'3NmpqnP--,)$""!!"#""$),0456678:=@DHJHGA>=875110^€xtqtuz|~gY_]bgU&,)-4=GEHLOIGDEIEFEDEKLIFCEJKIIKNRTQQRUYY\\URTQOPOKHFELSVWUYds{wrsvvvwr_[__agkqtt‚ŒŒŒˆ„ƒ‚ƒ…yecholm{…‹‹‹‹Ž“–•–“ˆƒ|wolqx„Ž“‹‰†„„„{o`Z_`^bgjnqsv|}€†ˆ‰‰ŠŒŽ‹‹‰ˆ‡‡ƒ~wz}|{sfZZXTPMWPGQ^jl‰£¨­µ¹»²Œ˜œ¬¾¾¿¾¾½½¼½·¢rYcilppqttttrqpnkgjonoppmqvm\[`emzˆŠ‹ˆ…………………‚‚‚‚„ƒ~xurolkjlhhiiihhhhjou}‡Œ‹Š‹ˆ„‚‡”•’Ž‹‹Ž“””’‘’™£¢—ŽŒ‹Š‹ŒŠ^^]][YYWVSQOLJHDB?<;:987643322221100////../000//....//////------/.--,,,,,,,,,,****((((('&'(('&''&&&'((((((()**))**++++,,,,,-,,.-..00112222223456779:;<<===<<;;97777777776654446533332111000000////..//..--...--,.3PgYRXbeF#%$#$(.;EIF@?>>Hcpncekhkf8!$(1PopokG.,)&#" !!"#"!#(+-14679:<>?AEIJIA=>>:50/[yxsqtx|{~pV\^`h^,),,0:CDEOQSXSMQOCINMGFGEDCCDIIHGMNTUTUVXZ^_YTSQOOQOLHDHQVWX[fuztrsstuwr_[\``ago|‹ŒŒŠ‡„ƒ„€wdbdljbq‰ŒŽŒ’–™š™—”Ž‹‡ƒ}…Š‘Šˆ…„„ƒ{m^[^^^einrwz|ƒ‡ŠŒŒŒŒŒŒŠ‰ˆ…‚{ytquy|vvld[T^aFDl’š™§²·¸¸¹¾¦w™Œ‘»¾¾¿¾¾¾½²]RW^cgkloqtssrqqroloromkkloooaORV`t†ˆ‹ˆ……„………„‚‚‚ƒ„ƒ€}xtpmlkihhhiiihhhkpw€‰Œ‹Œ‹ˆ„ƒ‹’–“’ŽŒ‹ŒŒ“”•’‘‘’™ Ÿ—Œ‹‹‹ŒŠ^^]][ZYWTSQONJHEC@<;:976644310110000//.....0////..........----,,--++,-,,+++***))))('')''('''&&&&&&''''''((((()))(***,,++,,,,---.111122113333335556798:::::8:::888777666666544443333222221111000////.//.-..--.----/6[bRQWab9"##""',6BHGCBB?PgbXZ]gknZ("%-Ffmjf@+,'&#! !$%##"$(+-/336:<==>AFIKC??A<25`wrlstxz||u[Z]]dg:++,-.6=AGOTXfbWICDMLIGEB@ABBCGIGHJNSVWWYZZ]a]YUSRRSNMHDEMUXZ[fsvqswxvuvq`[^]`dgsˆ‘‰†„ƒƒ„ƒtbccii^j{‡ŒŽŽ’•™ššš—–’‘Œ‰‡†ŠŒ‹Šˆ‡‡……whZTX^bhkos{„†‰ŠŽŽŒ‹Œ‹Š‡‡ƒ‚~}zzzug\armnge^_qsIZ™¬±´¹»»½¾¼»µ¬¸°³¼¾¾¾¿¾º§uHEORX\`dkoppprrqsvvrrxtlgginrriRAMWoƒ‡‹ˆ…ƒ„„„„ƒƒ‚‚„ƒ†‚~zwrnllihhhhhhhhimqz„‹‹ŠŒ‹ˆ„…Ž”•“’‘‘ŽŒ‹ŒŽ•—•‘‘“› œ–ŽŠŠŠŒŒŒŠ^]]][ZYWUTQNLIGEDB=<:9766433211100..//.....0//..,,........----,,,,+++,++***)))))(('&'(''('&&&&&&&&'''''''''((((()***++++,,,,--./111122113333335556778899999888777666666666444443333222221111000/////00/...--.-,,+--=b\TUZ_W-!"!#"(2BJJHCBAX_OLOW_hkC#)9YhibA,*&$" !$$#!!#$'+-0369<==>ADHIGCA?8Lpvmmlpvvyzs_Y]\^eI)-,11059@HOWakhWJGJNNJEA@>>??BDFHILMOSVXYXZ[]^\XXWWTONJEDGQWYZervsvzyxuwr_XY\_dkxƒŽ‘Œ‰†ƒƒ‚„‚~qbacfg]h{‡ŽŽ’“˜™šš˜–•’‹ŒŒ‰‰‡‡†„~vh^WUajghov}„‰‹ŽŒŒ‹‰†„„}}ytonj]SIennpuhU\jLo¦´¸»½¿¿¾»´³·º»½¾¾¿¿½»°—dFKSQOQUZ^bgjmprqrruyyrswqppoqwvshKEYp„ˆ‹ƒ‚„ƒ„ƒƒƒƒ„…‡‚€|yupnlkhhhhhhhhimr{…‹Š‰ŒŠ‡„‰’••’‘‘‘ŒŒŒŽ‘––“‘‘’˜œ™Œ‹‹ŒŒŽŒŽŽŒŒŠ^^^^[ZZXVSQOMJJGEB@>;96664331111//.-----....--..,,--..---,,,-,,,++++++++***)**))))(''&&&&&%%%%%%%%$%'&''(('&''))((******+,,,.../00112111223334446655777787777777666666777766664333333322222211100000//..----,,,,,,+-GdWRU[cV,!"! "'0<MROKGKa]QJKMYnc.%1Rd`V?,&""""!!#%%##""$(),.2449:<>?ABAB>;H_tqljiputvvq`Y\]^f_)+/0325888?HXil_UMMPSUSME==<<<?CFHJLMMQSVYYYWX\[ZYXXTPNIECDMSW[ennpruvsuvng\X]_hs€’‘‹‹‰‡‡†…‡…oaaabeal{ŠŽ“•–™™š˜—”’‘ŽŽ‹Šˆˆ‡ƒ~vlb^_gossy}‚‡‹ŒŽŒŠˆ‰„}{wutskqo_YpsmklsjZX[Wuª¸º¼¾¾¼¸±ªµº¼¾¾½¾¿»´›rQKTTQMNNNSV\`dilooppsyƒvwwssmiprpoaBKp„‰ˆ€€‚‚ƒ„„„„‡ˆ…~{xusoljhhhggghjms~ˆ‹Œ‰Šˆ†‡••“ŽŒŒ‹Œ”•“‘Ž–˜”Œ‰ŠŒŽ‹‡ŒŠ[[[[[ZYWVSQOMJHEDB?=;97764331111//.-------------,,------,,,,,,+++++***))))))))))))'&&&&&&&%%%%%%%%$%'&''(('&''))((******+,,,.../00112111223334445555777787666667777666777765664333333322222211000000//..----,,,,)***0QfUPV\b[-!   &+9HQTMIQe\NNPSetK!$/NaYUK;'""""!!#%%$##"$')*,/14668;;;<;7Icrsmfgjopu{wmaZY\^`d@-,/02589736AR\UKHPRUUWZUL@=;::=?DGLLMMORVYYYXYZZXUUUSOLIDABHOVXbjjjlpsqsrke_YZ`o{‡”’‹‹‰‡‰‰‰‰†oaaaekiq…Ž’’“––—•”Œ‹‹‘‘‘ŽŒŠˆˆ‡ƒ€yrnjhny~……‰ŒŽŽŽ‹Šˆ‡„€}zwuvrrronpqrnoqmkhfYS_c|©·º½½»º¶¯¥°¸»½¾¿»¶©~UMRRQOLMNOOOQV[_cgkpqqrt||wqsxqj`mvxwn\ay„‰„}}€€‚„„„…ˆ†…ƒ€}{wtqmlhgggghhimu~ˆ‹‹ˆ‰ˆ‡‰‘•“‘ŽŒŒ‹‘”•‘’’›žš“‹‹ŒŠŠ‹ŒŠ†ŽŽŒŠZZZZZYYWTSQOMJHEDB?=;:9764322000//.-----------,,,,,,,,,,,,,,+**(++++))((((('''(((('&&&%%$$$$$$$$$$#$&&&&&&&&''(())))**++,,,,../000112222233323444466666677666667777666667766554333333333221110////////.-----,,++,,+()5_bSPU\fa2 "(*7CRTOJ[i[PKQZpk5 ,Jc]TMG*""""!"$%%&%#$$',+**.//1269841Owpmgdfimppwpmc\YZ]^`Q1//2258<;:8<=KE=;EQWVXZ\ZQF>;;;;=BFLNNMPPUZZYY[\YUQOOLKJHDCACKRW`gghjmompmdcb\ZdsŽ’’’Ž‹‹‰ˆ‹ŒŒŠ‰ƒsb`bhru}Œ‘Ž‘’“”“‘Œˆ„„‡‘’‘‘‘‹Š‰ˆ…{yxsrx„†‰‹ŽŽ‹‡ƒ€||zywsqpomppkjknpqmiejc^c_v¥µº¼¾¼º¹µ£¬­¸»¼¹±“eJLSRQQQPPOOOMMQTZ^agipqrtssusv{|tq}ƒˆ‰py€ƒ†}y||}~‚ƒƒ…†ˆ…„‚€}{wrpnjihfgggkoxˆŠ‰ˆˆˆˆŒ““Ž“––‘Ž—œ—ˆˆ‹Š‹Œ‰„€ŽŽŽ‹\\\\ZYXVUTQONKIFC@?=;:9764322000//------,,,,,,,,,,,,,,,,,,++***())**)()))))(((((((&&&&%%$$$$$$$$$$#$&&&&&&&&''(())))****++,,-./000112222233333565566666666666666777666667766554333333333221110///////../----,,++,,))'):d`USV_id4!"##$%+3>MSPSgnZNNSatX#(>afYMB*""""!"$%&'%&%%(0/*))**+++,.,NrqkhgkooopviXea\ZZYUX4..366679;78@?B;19EORPRUSQJD=999;=BFLNPRTTUWYZ[\\YRLKIIGHEDCAAFKT]ddehklkmj_`hd`hw‰’’‘ŽŠŠ‰ŠŒŒ‹ŒŠ†ub_dkv{‡‘ŽŽŽ‘‘Ž‹ˆ„~~ƒ‹‘’‘ŽŽ‹Š‹Šˆ…‚€~}€„‡‰‹ŒŽŽŽ‡~xuqmmrsppqonmlklonnncY`ed`ZU`ž´¹»º¸¸¸´®°©²º¸¬QLMRRRPOQPPNMMNLNQUY^chlnrqprvx†‡…zŠ‘’‰y…ƒzx{{{|}}€‚ƒ…†‡†…„€}{zwsomjhggghkpzƒˆŠˆˆˆ‡‰”“ŽŽ’••’ŽŽ“›œš‘‹‹‹‹‹Œ†}ŒŒŠYYYYYXWUSRPNLKIFFD?==:8764332000/.---,,,,,,,--,,--++,,++******((**))))))))(((((('&$&%%%%%%%%$$$$$$"#%%%%&&''&&(())))***+,,,--//00000123323444456666666555766666676666677666655543333333322221100//../...------++,++('''BkbTRW_hc8!#$$$()*6FQTXliYPTXhsA)3FOJ</%!!  !!"%&'&$(&(+/,('&(&$$!*Lrnmhhlmnmpr[Khf`\ZYQYL*.1699788:75786328DKMKKMMHEB>:88:>AELNQTWXVVXZ\]\XPMJLJFEGDEEDAFMW`abehiikfZ]ghjp}Ž‘‰‰‰‰ŒŒŠˆŠ‹…wd_fpz‘“’ŒŒ‹ŽŽ‹‰…‚}„Š’”’ŒŒŒŒ‹Šˆ„ƒ‚„ˆŠŒŽŽŠ„{voga\_chklpqroonllnmlU@MX_[H@YŒ°¶¹¶¯µ·«¯±­¶¶ª€NOQOQQSRRSQPNNLOONNSUX\bfimoqt|…Ž–•’‡’˜šˆ„ƒvvyzzzz{~€‚ƒ†‡…„ƒ‚€~zuqolkjihjls|…ˆŠ††‰ŠŒ“’Ž’••’“™žœ–ŽŠŠŠ‹‹‹Š„}|Œ‹‹‰YYYYYXWUSRPNLKIFFDA?<<8764332000.----,++++****++,,++**))))))))(())))(()(((''''&&&&&%%%%%%%%%$$$$$$#$%%%%&&''''(())))***+,,..-//00000122233454456666666556666666665666677666655543333333322221100//......----,,++,+++(%#)HmaYWW_ggC!$%&%%$'/;JP\teWUW_rj2,,()%# !!  !!#$')./,,(&+)('%$""$%WtmollnokmrrF>hle\XZPXW0+159:<<;>;55463.39DIHHFFEDBA>:88:<?DGLOSXYVVXZ[\XVPJKKHGFFFGGGFCIPX]`dgijjcX[cinw‰‘Œ‹‰‰‹Œ‹‡ˆ‹…yd_ft‡’’‘Ž‹‹Š‰‰†ˆŠŠ‰„€}|†””Œ‹‹‹ŒŒŠ‹‰‰ˆ‡ˆˆˆ‰ŽŽŽŒ‡‚}uhXLIORT\`bcfmpoonnjeN=R_^V>3Np¥´¶¯‹˜°—¦²°± ˜oMOT]WSTXWURQQPOOOOOPQUX[`hq}ˆ“š¡¢ž™™—•ŽŠ…wuyzzzz{|~€……ƒ‚ƒ‚~~}xvtpnkihilt€‡Šˆ……†‰”•’Ž“•”‘Ž•žŸš‘‰ŠŒŒˆ‚w}‹ŽŒŠˆWWXXWWUTTSPNMKHEEA?=<;98532220//-,---,+*++++++++****)))))*))))))(((('''((('''&&&%%%%$$$$$$%%$$$$$$%%%%%%&&''(((((()))*++,,,--/////00122244455566666666666555555556566556666666433333332221/111//00......,,,,++,,+,*,,(%%*KmbXVW]diK##$$$$"! &2?FkwcXWUevP#''%#"! !!! !##%.9@<:/(++)&%#"#!=spklonmposk:+`kid\[UK[A)/49::=@@=86542-149@DDA=?ABAB?<:98;=BEJLQVVTTVXYZVTOJKLKHHHHJKJHDDIMV^ceefheWXdmt€‘ŽŒŠ‰‰Š‹ŽŽ‰‡‡Š†}h_jvŒ’ŽŠ‰‡…ƒƒ‚…ŠŒ‡„|‚ˆ”‘Š‰‰ˆ‹‹‹ŠŒŠ‰ŠŠŽŽŽŽŽŒ‰†zm[N\a\]^^ZZXY`ejmmmeWG=GJKNB?M^•¯²”R‡¤}š³·ª…v\MNRXQTYa]TUVVTQPRRPNOPR]n~œ¢£¢ ›Ÿ£Ÿšš˜’Œ‰Šˆ‡ƒ~xvxxzz{{z|~…„€~}{wutrollknyˆ‹ˆ†…‡Š‘””ŽŽŒŒŽ‘••‘Ž’šž•‹ŠŠ‹Œ†}rx†‹‰†WWWWUUTTRQPNLJHEDA?=<;98652220//-,,--+*+************))))))))))))(''''''(((((&&&&%%%%$$$$$$$$$$$$$$%%%%%%&&''(((((()))*++,,,--///11001222444555666666666655555555565665566666664333333322210011////....--,,,,+++++++,,)&#(/Mm`VUX^fl[&"$%#" !)3HlqbWVZhp2&#$#!! !!! !$"(.3782/++-*'%#"#-hnkjjmpllta.5_kigc`bJ[Q++<>;:=?D>7559830258<@=:7:>>>?>=:97:<?DIMOSSQQSUVWTRNJKKKKIGJMMLIFACIOW\acffcYZepz‡ŽŽ‹ˆˆˆŠŽŒ‰ˆ‡‰„}h_ly…‘‹ˆ†„~|xy~„‡‡‡…ƒ‰Ž‘‹ˆ‡‡ˆŠ‹‹‹‹‹‹Œ‹‰‡…~wod[mm[RWVY`\XXY^dffc\UF51GQORZ]z¢ªŽ_”‰sŸ²µ¨vVIILOOOSVVROTUTUTRQQRQNMa~–¥«°¯ª§¡œžžœœœ˜“’‡€ywxxzz{{{{|}‚ƒ€€€€€~~|zywtromnqzƒˆ‰ˆ††‰”•”ŽŽŒ’””‘’˜œž™‘‹‰ˆ‰‹‰€voxˆŒŠˆ„VVVVTTTRQONLJHGECAA><:87543320//-,++++**********))))))))((((((((''''''''''''&&&%%%$$$###""$#$$$$$$%%%%&'''''((((()))**++,--.-.000022223433555666666666665555556666666666666666443322111111000/0.//.-..-,++++++)))*,--+)%$'-MobUTW]dl_4!$#"! !%*Epn`YY`rU#%"""!     "$(-/2761,-./,)%$""XvmggllmukO3Cahjjhd^L\[5.:@?@@BB>835:@B<4379976567::<><<::78;>CIOQQQONOQTUSQLLKKLLKKMNNNLGDABFOT\acec\[iv‚‰‹ŽŒŠ‡…††ˆŠ‰†ˆˆˆˆ„~jbp{‡‹ˆ„‚€|wqosy|€ƒ†‡„‡‰Œ‹ˆ‡ˆ‡ˆŠŠŠŠŠ‹’’Œˆˆ…‚€xsssrqigjhiicWPQW[ZVTUUOCCTSVY]get¤€™‰…£¯¯¦|WJHIMLLRUQOPPRUWWUQRTOTfˆ¦²¹¼º¸°©¥››ž  ¡Ÿœ™™•‡{v{zzz{{{zy|~‚}}~~}}||ywrqppu}„Š‰…ƒ‡ŠŽ•”’Ž’“Ž‘–š›˜“‰ŠˆŠŒŒ†{rnw…‰Šˆ…UUTTSSSPPNLKIGEDBA@=<;7574331///-,++++**********))))))))((((((((''''''''''&&%%%%%%$$$###""##$$$$$$%%%%&'''''((((())**+++,-....00002222344445666666666666555555666666666666664444332211111100///.//.-..,,++++++*)()+++*(&(+./PndXTWZ^ffC""   !Gwm^VZeq:!##"!     #&-2111,+,-12.*'$#<sjjgikpt_<;ZegjfggaMV_F29E?DCEC<;756>FEA955564332599;;<<;:99<AEJPRTRMLMOPQQMLKKKLLNNOOOOMGDA@BGKRYaec[^o|ˆ‹ŠŒŠ‡……†„…„‚€†††‡ƒ|jcq~ŒŠ†ƒ~ypggmsv{~‚……‰‰Œ‹‹‹ˆ‰‡ˆ‡‡‰‰ŠŒŽŽ‹‡…‚€~vrpppqstqoc]aSEEPWTNHINPMKQQPTSfa`‘”|¥¨©¬ªŸmLHHMNMMNPPSTTSRSTRQQPUnª·»½¿¼ºµ­¨žžŸžž ¤£ŸŸ¡ ™|u{{zz{{yyzy}€{{|}~~}}}}{zwtrrx€‡Šˆƒ„‰Œ‘•“ŒŒŒ‹Œ’“”˜š˜”‹‰‰‰ŠŒŠ„xnmx†‡ˆˆ…TTRRSQPOONLIHFDCA?><;:866532100/-,,+++*)****))))((((((((((((((((''''''&&%%%%%%$$$$$%$#########$$$$%%$%%&'''''()))))**++,,-.-./0101223345554555557766666656665566666655555555444433221111100/..--/.-,--,+++****)((**+-,)'+,.0/HkcVSTX]_fQ/!!#Uzg][^j`%"# "! !! #(*,*++),,-461,(%2lnffjijp]<HgfaabcccWRVI65=;=C??=97532:BDB<543230312589;=>=;:<@DJMPSVURPONNMLKKKLLMNNPQPOOMHFCA@@CHRZaa`fxƒŠ‹‰‰†„„‚„‚|y{„‡…„€{jes‚ŽŒ‡ƒ‚€~vl`_dkosw|‚…‡Š‰‰ŠŠ‰‰‡††ˆ‰‰Š‹ŒŠŒŒŒŒŠŒŒ‡„}|zwtqqqpqqn\9489<DINMKKKMIJFMRRPlljŠ˜‰Œ §¨©¨UFGHJJILLOKKPOMMOPPQOXw™­¸»½¾¾¾¾¼´­¤Ÿ Ÿ¤ œ ¦¥ž—„vz|{zzzzyxy|~€wwy}}|}}}}}||yxtrz‚‰‰†„†ˆ––“ŽŒŒŒŒŒŽ‘”’•˜›™–‹Š‰‰Š‹‹†}uonz‡ˆˆ‡…RRQQPOONMMKHFECBA?=<;976653210/.-,,,++*)****))))((((((((((((((((''''''&&%%%%&&%%$$$$##########$$$$%%$%%&''&&'())))**+++,,-.../0101223345555555557766666656665566666655555555554433221111000/.---..-,++*)))))''*)))*+-,)),,-013Egj]TRSY^dbF$!!!"'fxb[]`nJ""!   !&(*++***--.120,,/cpjedhkn_M`jhdaacb[_[J?47899;<:97565108ABB=6310//012237:;=>>=?DHKMPRTSSQPNMKKKKKLLNPPQTSPOLIFCB@>?@GQU[bm|†ŠŠ‰‡„ƒ‚‚‚}vqu‡…„€{jiv…Šƒ‚€~}xma]`eimqv}„„†‰‰‡‡ˆ‡††††††‡‰Š‹‰ˆ††‡ˆˆ‡‰ˆ„~|{zwvtpqqpqnM)5688<CDJPSOKHKMVZZV^_l„’˜™ž¨ª§¤wDHIIKJILLMJJLKJLMLMMTsœ¯¸¼¼¾¾¾¾¾¼¹³­¤ Ÿš™˜›ž¥¥¡›‹|z}{z}|zzxx{}vsuwz{|}}||||{ywtz‚‰‰†„†ˆ–“‘ŽŒŒ‹‹‘‘“—›š–ŒŠˆ‡‰Œ‰‚yqon{‡ˆˆ‡…QQPPOOMMMKHFECBAA?;;986654320///-,-+,,****))))((((((((((((((''''((''&&&&%%%%%%$$$$$$##########$$$$%%%%$%'''''()))***++,,-,-./01123223455555555445577666666665555555555555544333333111100////...-,,,+,,++****))))())-/0.+*+/3477Bcn^SQSU]cj[1   $$3lrb^[am0 "!""$(*,*,+++./012/,.`oghgijphdjkhe``acb]VH8205768>@<84364107AFDB:430.013454679<>AABEFHKNOOQSRPNLJIIKKMMOPSSUSPNLIFDD@AA>AEKTar„‰‰‰ˆ†„€€€znkv€ˆˆ„€yjjw…Œ‹‡‚€}zvkd_^_ehmsy€…††ˆˆ‡‡„„‡…………………‡†ƒ|}~~‚‚„††~}zywvuutuvkR/.:<>CGKGGHOPQXXV\`aeidm‹—“œ§©¦ mAFJILKJIJIJJJJJJIKJSl–®·¼½¾¾¾¾¾¾¾¾¹µ®¥£¡š™™˜˜££Ÿ•„z~}{{{{yzxxz~sptuww|{|~~~}}{yv{ƒ‰‰…‚‡Œ‘•”‘Ž‹ŠŠ‹Œ’‘‘“–™™•‘Š‰ˆ‰Š‹Œˆuoon{…ˆˆ‡†OONNMMLLLJGFDB@@@=;::76643220///-,++,,****))))((((((((((((((''''((''&&&&%%%%%%$$$$$$##########$$$$%%%%%''''''()))**++,,,,-..001132223455555555555566666666665555555555555544333333111100/.....--,,,+++**))))))(()))-/21/-.147:=>>UjeXSRVX_ihN%  %((;qr]_akb "!!!$(*,,.---./0110,UrfcdhkpnjhgefdaabcdfY51333459AGC94451104>EFA:51/.013566779<>BBCEFJJLLLNOQSOMLIIJJLMPRTTUSOMJHFDCAAA@>?BO[pƒŠŠˆ…‚€~zqhlt‚‡‡†ymlx…‰‰„|{|vkb_\[_`fmu~ˆ‡„††‡‡„„…„……„„……ƒ€{vqpqou|~‚…‚~|{|{{{yxy{wgJ@AFP[^XKMX\]^\Zadefkkc{”‹›§§¥™cCHJIJKJIHHIIJJHHIIOfª·º¾¾½¾¾¾¾¾¾¾¾º¶«§£¡›™™š–—Ÿ¢¢œŽ€{{|{{{zxxy{}nlnqttxy{|}|||{zy{ƒŠˆ„ƒŠŽ••“ŽŽŽŠ‰Š‹Œ‘’“——˜–‘ŒŠ‰‡Š‰Š‹Š„}uoon}†‰‰‡†LLLKKKIIJGDBCA@>>;:87755421000/...,+,,****))))(((((((((())((''''''''&&'&&&&%%%%%$$$$########$$$$$$%%%&''((''()*****++,,---//0012433334455555665555555555666655555555555444333333221110///..--,--**++**)(((''''(((()-1442/236:<BEA>Idm\SQQUZfma9"%',,Htjc``pF! "!%&+-/20..000221LrhbcejppigdddddcefdjbE1255348:DX]93332103:EKF;53.,/13567879;>BCDFFIGJJKLNORRRNKIHHJJMOSTURMKIGDCB@@@A@@?FSiz„‡…‚~}|ujcivƒŠˆ†‚yomy…ˆ†‚~||zufefed^^ait€ˆ‡………††„„„„„…ƒ…ƒ‚€zvmbaees{|}‚€|}€‚€~~yphdehiidW[`a``bcfgjkohbl‹–Ÿ§©¤SCFKKIJIHFGGGHJGGHI]„£²¹¼½¾¾¾¾¾¾¾¾¾¾½¸³­¥Ÿ›š˜–•‘“—™™”…zyzz{zyxxyy~pjllqrtvy|~|z|||z}ƒˆ‡„„Š–”ŽŠ‰Š‹Ž’’”˜š™˜“Œ‹Š‰ˆ‰Œ‹‹‹‡|tnon|ˆ‰‰ˆ‡KKKIJJHHGHFDBA?=<::877663210000.--,+,,****))))(((((((((())((''''''''&&'&&&&%%%%%$$##########$$$$$$%%%&''(())))****++,,,---/00112433334455555665555555555666655555555555444333333221110///.---,,+**))**)(((''''''(()-167524:<>BFJBC@?VkbWQPS[_gn^4$+,-.Oxj__`l4 "$&&)-1232244441IsmfffinphedddddeegddYC7534437;?CLN723322128CHF=830../0156669;<@BDFFGFGHHIMPPQNLKIHHHHJNPSTPMKIGDCA?@@CDCAAHYjt|€€~}|~|wnbbkw„Š‰ˆ„{omy„‡ƒ}z||yulhjhe`^^iv…‹Šˆ„„„„„„„„„„†…ƒ€}woeWNQXmvy{}€~ƒ†‡†ˆˆ‡}wqssqnjdW_a`__`eeghlogcg{•ž¥¥£‡JEKJIHFHGGGGGGGIHFLnš¯¸¼¿¾¾¾¾¾¾¾¾¾¾¾½»´¬¦¡™•‘‰…„‹…{yzyyzzyyz{€qjggnqpsvxz|z{{}{~…ˆ‡ƒ…’•’ŒŠŠ‹Œ”—˜š™—’ŒŠ‰‰ˆ‰‹‹‹‹Š†ytnno}‡‰‰‰ˆIIIIHHGEDDCBB@?><;98866543000//-.--,,+*)))**))((((((''))))))))))((''''&&%%%%%%%%$$$$$$$$$$%%%%$$%%&&%&'())**))*,++,,....///011223344446456666666666666664455545564444433422222221100//...-,,++*)))))''&&''(('&%%&')+16:976>?BHLMJIC?<PbeZRRUX\_inR1)))))SsbZ`j[ "$$&***.024545775=ikhhkklqgdeghhcdeih^G@B332227FD@732121111466:@C<;6..//1234569;<=ACDEFFGEGHILNNMMKIHHGGILNPROLJIGEDC@@@BDDDDEIS`ktxz{{|vqh^`jw„‹ŠŠ†}on{ƒƒƒ|{{{|{skjjhebcn~Š†ƒ‚‚ƒƒƒ‚„…ƒztf^MCDVmswz|~}~‚„‡‹ŒŽŽŠˆtppmmcX\___`abdfgeckgdiu ¤ ‚G?GIKIFFFFFFFHEGFFZˆ¨·¼¾¾¾¾¾¾¾¾¾¾¾¾¾½¹²¬§¤ ˜”‰…‚†‰zyyxxxxzzz{qgehhmoou{|}}{{{z~„ˆ‡ƒŠ’–•‘ŽŒŒŒ‹‹Ž‘•˜™š—“‹Š‰‰ˆ‰Š‹‹‹‡}yrnmn€†‹Œ‹‹GGGGEEEDCCA@@?=<:987755443000//----,,+*)))**))(((((((())))))))))((''''&&%%%%%%%%$$$$$$$$$$%%%%$$%%&&%&'())**))*,+,,-....//011122334444566666666666666644445554334544443334222222100//..---,++*))))((''&&&&''&&%%&'(*/7<=;8<BHJLLJIED?=GXje[XXXY[bhfR*"()(Ztd]blL&$&**+-0378:;987fjgikjophcfggghfgilWA?B7353337CKE731///0124699799951.././025789;<>ABCEEEEEDGGHHIIHHFFGGGJOQROLJHFEDC@@@@CEEEEGHP[dmty{wqfb^_ky†‹‰‹…{oo{€€|{{{{}}ypoljiffq‰…‚€€‚ƒƒƒ…„‚}ztgZTKHPctvvy{}~‚„‡‹ŽŽŽ‹‰wponj[_`a``cacefgc^efhnq†šŸF@FGHGHEEEEEFEEDFOtž²º½¾¾¾¾¾¾¾¾¾¾¾¾¾½¹²¬§£Ÿ˜“Š…„…†‹‹„{yyyyyyyywy}rgeggjnnsvyz|{{{z…ˆ‡…”•“ŽŒŒŒŒ‹‹Ž“–˜—•‘ŠŠŠ‰‰ˆ‰ŠŒŒ‰†|xpmls‚ŠŽŽŽŽEEEEDDBA@@A@><;::876745422100/...-,,,,+*******))))))))******))))((''((&&&&%%&&%%%%$$%%%%%%%%%%%%&&''''()))*****,,,+,././/111111233443444555555556655554345555334443333332333111111//....-,++**)()(('''&%'%&&&&%%%%&*19?BB==FKKLJJHEB??A;I`jdYYYWY]`kgA&&&(bvdbdj:!(+*,--145688?jkgiigltkdfghhiill_H:BE>3153016A[R520/..01348<:966642-,---/04798;==?AABBCCDCCCCCCCDEDEFFGGJKNQLIGFEECA@?@CDGGFFIGMV_gosqgSX_bn{ˆŠ‰‰„|qp{~|{yxyy}}tonnkilv…’‡ƒ~€€‚ƒƒ‚‚€~ysha[WQQZhsuwxz}€‚„‡ŠŽŽ‰wpljb]`abbbacdfgd^Ydfemrz‘šžšx@BFEDHGGECDFDDCEJd’¬¸º½¾¾¾¾¾¾¾¾¾¾¾¾½¼¶²¬§¢›–‡„‚ƒ…‰‡}{{zzyxxwvw}sddgefkloswx{{{{z‡ˆ†ˆ””’‹‹‹‹”–—”“‰‰ˆˆ†‡†ŠŒŒ‹†€{yutw~ˆŽ‘‘BBBBBBAA@@@?<;::9765554322210/...-**+++*******))))))))******))))))((((&&&&%%&&%%%%$$%%%%%%%%%%%%&&''''))))*****,,,,,//.//111111134443455555555556655554445554334443333222233211110/..-.-,,+**)((((('&&%%%$%%%%%%&'(+/:BGHC=FNOPNJJEB?=<:69Mhi]XVTUY]ciV2!$,`vccbg1"*,0321378<8=iqjhjhiolfgjjgjnn[B9:?DI;3442016?PI30////276769<<9853/++,,--/159:;==>@@@@>?A@??=>>@?AACDDDDEHJJIHFDEECA@?@CDEFGFHGGJOX`fcVIO^en|‰Š‹Š…|pqz}~}yyzzz|€wtqonlnyˆ’†~~€ƒ„ƒ‚€~{xriea[WW]isuwwz}„…ˆŒŽŽŽ‰‚xpgc``abccccdfffa]]hhhkru€•ž›u<BEFIGFGDCDECCBEWƒ¥´»½½¾¾¾¾¾¾¾¾¾¾¾¾¾º¶²®©¢™–‘ˆ„‚~}{~…~{{zz{zxwvw}wgefgejlopsuy{{}|‡‡…Š’””’‹‹‹‹’”––‘Œ‰‰‰‰ˆ†‡‡ŠŒ‹‰ƒ€ƒ‡‰Œ‘“‘@@AA@@??=>><::998744343322110/..++,+,++)))******++****++++++******('(('&&&&&&&&&&&%%%&&&%%%%%%&&&&&&''')******++,---.///0011202224445566666655555555555545543333333333222122111000..----,+**)))((('&&%%%&%$$$$$%$&&*.8ELPIDGRTVRMIDA><<992.8VebWUSVX\^ggK+'craeh]'*,27=CKLI@IjsmjmiipnfhiikngZL;9:=?@;642200467;71/11/037:97:@A=:53/++,----/2669;;<?=;;:;=><;;=>>??@ACCBADFFGGFDCBB@?@?@BCCDDEEEFEGJQUQJEGWfs~ˆˆˆ‡ƒympw{}{zyyyz|€„~wqqoor}‹“Œ…€z{z~ƒ…ƒ‚~|}}}|uqmida`cbisvww{|ƒ„†ˆ‹ŽŽŽŠ‚ypebbcdccccccfdcc]^ijjmrstŒ›˜r>AEDECCEDDDEDBDKm™®¶º½¾¾¾¾¾¾¾¾¾¾¾¾¾¾º¸µ®« •‘ŽŒŠ…ƒ~zy~~{zzzyxxwvu|zhehgdejnnqtvy|}|ˆ††Ž’‘“ŽŒŒ‹‹ŒŒ“–”‘Œˆ‹‹Œ‹‡ˆŠ‹‰…„††‡‰‹‘‘”““@@@@????<<;:99887666533322110/..,+++++*)))******++****++++++****))*((('&&&&&&&&&&&&&&&&&%%%%&&'''''''()*))++++,,,--..//0001111222344556666665555555555553454333333333322122211100/.--,-,++*))(((('&&&%$$&&$$%&$#$$&)-8EOTRMKSXVSOKGC?;:732/.,=XgaYTSVX[`gbB&$^oaeeV:85=@ILQXcrrlmljkppjiklojSEFGHCABA>84420//36763.-.11149=;7;BD@=71/+,,----/14678:;=:889<<<;;;:::===>?ABCCDDEDCA@@@AA??@@AABBBBDCDDCDEFDEEShuƒ‡†‡…€tmqxxzzzyyyz{|‰ŒxurqqwŒ’‹…€{zy{~‚„ƒ‚~ywxzyzwxpnlmmlhmtwwx{}‚…††‡ˆ‹Š‡unjfbfeddcccccdb`_floljpxyŽ“oCBGDEDACDDDEDBCW…¦³·¼¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½¹¸²« ™•–•”‘ŽŠ…~vuyyyzzyxwwuvyzgeedefiklnrvy}}|„ˆ†ˆ“’‘‘ŒŒ‹‹ŒŒ‘’‘ŒˆˆŠ‘––’Ž‹Š‹ŠˆŒ’’’‘’‘“‘‘’’????>>==>;;;9788767643321100.-..++++*+++********++****,,,,,,,,+**,+(**((&&''''''''''''((''&%&'''(()))))***+,,,....../0/00010022223445555666655665566554444443333332122221101000/..--,,+++*))((('''&&&%$$$&$#####$#$&+6ALVZVQSXYXTNKHD?<8310./,,Dah^VTTTX_chcE,^i]chP+7<ET]djosjjlmmppllmmgP<BMQOHILIA:5432.-055540/,+253389989@DCB<51---,,.//134468898777;::98989::9;=<=@ABDABBB@?@@>>????@@AAAAABBBCCCBBBETiv€‚‚{oiovvwxxxyzuuv‡’€yvtrx‚ŒŠƒ{xxx|‚„…ƒxpptwuwvusrsutqlktwxx{…†…†‡ˆˆ…}uspkfcefffdccbc`[]cgkqnoru{‰ˆpFCCEEEBABCDEFCJj—¬µ»¼¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾½»¹³¨£¢  ¡œ–“Œvuwxyzzywwwvxz}heecfdghknrvy}{}…††‰”“’ŽŒŒ‹‹‹’‘ŽŒŠˆˆ‹–›š—•‘Ž‘“•–”““’’’‘‘’‘’<<<<<<;;<9888755656532211100.---++++************++***+,,,,,,,,,,+**)((((''''''''''''''((''''''''(()))))*+++,,,.../../0000010022223445555666655665566554444443333332122111100000/.--,,++***)(('''''&%%%$$$$$$#####$$%)0:FQYXQQXYXXSOLHD?;752/.-/*1HeiYSSVXY\dibVjqcdbJ8K_eggntlhjlmppkml]=-5I[]TOMEGG=74230/,0:=621.--03668::89>AEB@93/--,,-.0222455567778989:988888889;;=?@ABBBB?>??>>>>>>?@@AAA???@AAB@BAJ[ky{{|}yrkipttvwwwyxrgl€“zxvsy‚ŒŽˆƒ|yyy|ƒ…†„xoimmopsvvuuwvutpmrwz{„……††‡‡„ytpnijgffecccca]Z]cgmuuuomp†ˆpLDDDEDACCCDDEFV€£²¸»½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¼»¸¶µ±ª¦£›”Žƒzuwxyzzywwwwwz}hedcdeghimqtz|{}„…†‰“”“’ŽŽŒŒ‹‹‹ŠŠˆˆ‹˜œ™˜–•–––———•”““““’’’‘Œ<<;;;;::998876776655211100..-,++**************++**++--,,------,,,+****))((('''((((((((((((''(((())))))*+,,+,----..////00011102222344445556665555555555444444333311110000000////.--,-,++***))(('''&&%$#$$##"#""""###$&-6CMSTPNUZ[[YTMIGB?<732/+,,,+3Ui_ZWWWYYZbjqutponligeblrjhgjnqrnj\>")3G]_ZRMB8EE;5220/./7HL<31//..3789;867<BFCA<71/-,,-/1324435555666668777799887788;=>?@@???>?>=<====>?@AAA@@>>>@@?BIWcrzwvzyqj^blqsuuvwwwqcWn˜‚}yx{„Œ‹†‚}zz{|€„…ˆ‡ƒ|sb_dghlnpsuxxvtstttuz~ƒ„………‡‡‡ƒ{wxusoigfedcbb_^Z^fmtwvupliv†pQGFFFDCBCDEEAJd’ª´¹½½½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾»°«¦Ž„zuwyzyyywwwvwz}lccdddfhjmrs{z|~…††‹“–’‘ŽŒ‹‹‹‘Ž‹ŠŠ‹Ž”—œššš˜š™™—˜—–•”““”••’“‡::::;;::99776666554431110/..-,++,,************++**++----......,,++++++)))((((())))))))))))))(((())))))*+,,,,------////000111022223444455566655555555555444443333111100000////....-,+++***))(('''&&%%$$####""!!""""!#$)3>GLIFIOY\^]XQNLGC?:74/+*)+(*+<Ye_UZUVWZaefjjjgefb`jspihkntwo\8'-6/Ifg`]WO76JC851///..2:9421.0111567;857=BEEC=82.+,,-/024543444445554566779988777788;<==??>===<<====>?AAAA??>?>>?AIT_mwvtvupeXOUafkoqtuywn[;2m–‹}{~„Œ‹†‚}zz|‚†‡ˆ‡†‚xiYY]`dfglrvwwvvuutwz|‚ƒƒ„……†ƒ~zyzuromgddcb__^]ajsywvupmko~YDGFEBBBCDEEANs›¬¶¹¼½¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½¾¾¾¾½µ¬ xnpsuwwyyyywwwvwz}kccbddfhjmqtz||~„…‡““’‘ŽŒ‹‹‹Ž‘‹Š‹Ž’“•–šš›™ššš™™˜—–••““’‘‘ŽŠ…€{99:::9::8888666644442011/..--,++****)))***+++,,+++,,--........-,+,+*++))**)))))()'((((((**))))(((()*++++,,--..--..//0000001101222233334555666655554455333444222211110.//00//--...-,++**)))((''&&&%%$#"##""""!!!!!!""#'09CEA?BMWZ__^WUPKGC?90('('&&&'#*C[_YWSRUWY\`bccdcclwqiglptyh?!#((9Neidcc[L42A9420//.,-/1/011/15412579888=EGFD@;50,++../1344433333344456677667755557788:;>>=<<<<<<==<?@@@AA@@><==AES_isvrrqldUB>FPX\bgmstthYVLfŽ†€‚‡ŒŠ†‚~~}„‡ˆ‰‡‰ˆq_QSUZ]`fjrttuuwvvyyz}‚„„„„ƒƒ~||zuupkhfda_][\eipsussnjigr|cGFFFDBCCDCDBR~ ­¶º½½¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾½½¾¾¾¾½µ¥Žscdeinsxyzzyxwvwwy~ncbbdfegjlou{|}‚…ˆ•”“ŽŒ‹‰‰Ž‹Š‹Ž’•—™™šœ›šš™šš˜˜––”’’Œˆ…€yumd99::99998888655532222000...--,++))++**)*+++++,,+,,,,---........,--,+,,+*++***)))*(**))))**))**))))*+++++,,--..--..//0000001112332222333455444455554444333444222211110.//....----++++**)))((''&&&%%$$##""!!!!!!!!!!""#'-8BGD>BHPW]`_^\ZTNKE?.'&&%((('&$$(@]bTOTWWZ^_acedluspkorvxe;%&(&'=]iiec_UI,+86310/.-*+,./00002672236::89>BDEEA<61,++...0133333222244444456466655555677:;<==9::;;;<=<?@?@??C@>==?GRZgrtqtrkcU>029?DIQZ`fmnh_ehr‚‘‹„‚‚ŠŽŠ†„‚€€„‡ˆˆŠˆˆŠ…zmVMOPTW]dkpqsttvwxyz|}}~€€‚„„„‚}|yttnjgc`^^\ajpppqqqmihfiroPLJJEBBBBABEU…£°·»½½¾¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾½¼¼¼¾½¼¹©ˆhY_dehhkqxyyyywvvvy~sfccgiijlnqv|}~€‚…‰Ž’‘’ŽŒ‹‰‰Ž‹ŠŠŽ‘”˜™›››™™˜˜–————–•“‰ƒ~ztldYQP8899997788875555322220/....--,++++++***++++++,----............--..-+,,,++++*))****))****+)***+*(*++,++++,,--..--..//0000/1111222223322333345445555334433453222220011/././....-,,,++**))((((&&&%%&%$##"""!!!!!!!!! !"#&+4AFFDGIOUZ_bca_\WSM>.))%$$$&(*((($*G]]UY]`acchhmsplkmqswkN4,+&'*C^ibWRYSJ-(76000/--*,0/11121389757:<><;;@CEEB?;50,+,,-.0112332200223344444444554234679;<;978888:;<>==??BBBA?<>CP[fqussng_R@2//0369@FOW_b`[^V]tŽ†„„‡‹‰……„„„„„†‡ˆˆ‰ˆˆˆŠ†ylVJHJLR[gnnoprtwyxx{}~~~€ƒ‚ƒ€~{xvrnjd`^[]ehjmpqonligddfkWTPICBABBBAEX‡¤°¶º¼¼¾¾¾¾¾¾¾¾¾¾¾¾¾¾½¼»ºº½½»·­…\PW]`dghijrwxxxvvwx|€yqprssssttw}~‚†Š‘’‘ŽŒŒ‹ŠŠ‹Š‹“—˜˜š™š™˜•”’‘‘ŽŒˆ€wpg`XNGDHN8888887788755555322220/....--,++++++***++++++,----......//////....-.,,,,,+++**++++**++**+,***+++*++,++++,,--..--..//000000111222223322333333443333554433330002220000../....---,+++**))(')&'&&%%%$$##""!!       !!  !#&+4?HJJKNPSZ_eeffb^XM4)+(&$%'&&+-..+&%*:KWgljkmnkurmmosuwlSI52<=12LcdZSLMMG0%65/00.---/201212369=;988;<==>@?@B@?=92.,,,-.0112332210113344443333444233568:;989888879:;;;<=@ABA?=@NYcopqsoh\N<.-,-/00047:CINPWYRZi‹†……‡ˆ†…ƒƒ‚‚ƒƒ†‡ŠŠŠ‰ˆ‡‰Š‡~o[HDEHQcikkmprxywwy{{{|}}~~‚ƒ‚}{yurnje[PT\efgnonnligddb`XRPFDBBAAABDXˆ¥±·¹¼¾½¾¾¾¾¾¾¾¾¾¾¾¾¾¼º¸·»»½¹±•\EPY\^bfgihltxyyzz|‚…‚‚‚‚€~~~~€‚‚†ŒŽ‘ŒŒ‹ŠŠŒŒ’–——˜˜™™—•“ŒŠˆ†„ysg_VNEEFJLPS88777777765555553222200///.--,,,,,++++*,,,,,,,..--//....00////......--..,,,,+++*++++****,,++++,,**,,,,+-,,--..--..//000000011112222222343333333333333333320.0111000/......--,,+++**))(&&''&&%%$$$##""!!!  !!  !!  !"%+3=EILOQQT[`fkjfdc[H1,/,()))')*,,-/.01128AQX`cfrroortuteQPO;;HOJO[`XURKKOF1$3500/-.-16855324469?>=;;<@@BA><?B@@=;4/----/1122222222222244321122332121156775677777888899::<=?@=@HWanqqrog\P>0.-,--//011248<BHIKPXj~|y|~€€€‚††‡‰‰Š‹‰‡†‰‹Œ‰s\HBCJ[cffhmryywwyzzzzz{|~~~{zwusole_ahd_dmoonlhfbaa_[NNHFCBBBB>DY‰¦°·¹»½½¾¾¾¾¾¾¾¾¾¾¾¾¼»¹¶µ·º»¹­‚FEOV\^`ddgiiow{{|…‡‡ŠŠ‹‹ŠŠ‰‡†„„††…„ƒƒ‡ŒŽ‘ŽŒŒŒŒŠ‰‹‘”•—–•–——–”Ž‰…}xuqncVLFBA@CHMMPT77777768765555553222200///.---,,,,++*)*,++,,--....--..//00////..----....----,+++,,**++++,,++++,,,,,,,,+--,--..--..//00000001110122222233333333332233333333210011//......----++++))))(''&'&&%%$$$##""!!    !!  !!  !#(.6>EIKPSTW_djnliebV>.-,***--(**,,,**-.0110..((drllkhim`ILNPDCNRQY^ZY][UUTR<'/6830.--17=<:63335;@AACA?@BBA<:<>==<:51.---/11112222222222331111113321//112443345555667799::<=>?>FP]krnolf\N=0.,,,,-////00101359;>AK`f`dhkpqsvz}ƒ……‡‰‰‹‰‰†„‡ŠŒŒ„vcG?HWcfdekpzyvwyz{yxxxz{|}~}|€|zvsrooplknkkoooljhfbab`\KLOGCBBBBABV„£®¶¹¼½¾¾¾¾¾¾¾¾¾¾¾¾¾¼º¸³¯µ»»·§pHLQY\^bdgjjjms{„‡‹ŽŽ‹ˆ‡‡‡‡††…„ˆŒŽŽŽŽŒŒŒŒŠ‰‹‘“”“•““”“ŽŒ†uld`ZOE@<=>A@CHLNOR77777777665544333222201000/...-,------............11110000000000--..-.0...--..----,,,,,,,,--,,,,,,,,--,.....-...000000000.11110022221111345433222222221111110.00--------,,+,++****))((((&%&%%%$$##! !!           "$*08@EHKPSVZbfkonie^O0*)))**-1,,,,--*%#$',0016.Zvjjkolh\UJIJIEKROX]a`aaZX_^ZK/)4A@5.-0:ACB<64469;?CDEHDBABC<78999:8840--,.00111122112222221000002211//01001122444466668989;===@JVdnlnje[M;3/,+,,--..//00//00221236@EEIMSU[achotyz€†…ˆ‰†„……‡Š‡yeIGVdeacisyyvvyyzywtqvwz|}}}~}}{yvsrnnoonmlmnjggebaab]OKSPDBDCBCDRw›®¶º¼½¼½½½¾¾¾¾¾¾¿¿¼»»µ«­´¸·®šo_cdddgjjkmnnry}…‡‰‘‘ŽŒ‹†‡†……†„…‰‹Œ‹‹Œ‹ŠŒŽŒ‘‘“Œ‰…€vkaUME>98:;<>@@DFILLL77777777665544333222201000/.....------....,,...../11110000000000/...-.0.......----,,,,,,,,--,,,,,,------....-...000000000.//00//11111111233133222222221111111/00....----,,+,+**)**))((((''%%$$$###!!!!          !$',4=CFGHKQUZafhlkieZB-(*++**((++++,,,'#"%%),2;Zulikjke[MLEGE95JPQW`_[__ZZ[_VS:+/DM9//3@DEE@99:88<>?BDHID??::7555589983.-,.00111122112200000000000011///1001111233444566879899:ANYhmmje\N>520.+,,--..//00//00221220/04468<@GHNV\diouy}€‚‚ƒƒ„‡‹Œ‡|hSX_dbdowxwvvyywvpnnotwz{}}~~~}|zyvtrqqpnnmljfdbaa`a`VMMPHCCCCBDKo—¬¶¹¼½¼¼¼¼½½½½¼¼»»¸·±­¦¦«¯®¤—€xzwwvvwwwvyy}}€ƒ…ˆ‹‘’‘’’‘‘ŽŒ‰‡†…„„„„„ˆŒŒŒŒŒŒ‹‹Œ‹‰ŠŒŒŽ’‘ŽŽŒ†…}xngZOE>;:7879<=?@ADFGJJJ77777766665544333222310/00/...----..-------/..//0000000000111100000000//00////..------,,,,,,----....../-..--..//00//////////00//00001122211212222211100000000000//..----,+++**)))))('''''&%$$#""!!""!!        !#)/6>EFFFINUY`ehjiigW7.-,-)**))((((*++)(''%&*(IpjjfgecPAKMIDB@@FNXbd\Zb_WQR\YOD:36=2./08?EFB;>@:889:;?HKF?:75654467;;852/--//0011112222////0000////00//./0011112222123466777759CP^hjhf]P?6421.,,,,,./....//00110222000/0//0026<CIOU\bjnrvx{}~ƒˆŠ€qeabfnvwxvuuutrmhggjmswyz|~~}~~|ywuvstrppomifdda___a[KIJLIECD@AGm•©²¹ºº¼¼ºº¹¸µ³±°®«¨¦£¡Ÿ ¤£ ™”‹ŠŠˆˆ†……„ƒ‚€‚‚……‡‰‹Ž‘’’’’‘ŽŒ‰‡‡ƒ‚‚ƒƒƒ†‰‰‹‹ŒŒŒŒŒ‹Š‰ŠŒŠŒ‹‹…€{vqiaZMC=<===<:989<???CDDDDDD77777766666554333222310/000///..--..-------/00//0000000000110000000000//00////..------,,,,,,,,--....../.......////////////0000//0000112221021122111110000000////....----+++**))))))(''''&&$$##""!!""!!        !&)/6>DGGHGKPX]`ddeebI-++)+'))))(((((***))'&&'>hfgfgdcN@DMML><JNIW_c__`d`TTZ]aOGB;48879114<CCBB?:99778;FLME=74435567:<><830-//00001122220///////////..//./0011111101111233444448DQ^ggd_UC54410/-,,,,--,,..../011022211100.-..,../37<@GMSY^dhlpsx€…ˆ‡€sghqy|{xwwvqlgd\TV`gmrwxz}~}~}|}{yxvutsrqomjfba___`]PHJIHDACCGQj£­°±±±±­¬ª©§¤¤¡Ÿžœ›šœœšš™˜•’‘‘ŽŒŠˆ†„ƒ…„ƒ……‡‰‹Ž‘’’’’‘Šˆ‡ƒ‚‚‚‚‚…ˆˆ‰ŠŒŒŒŒ‰ˆ‰†‡‡…‚‚}ypjcZOGB;9;;;<==<<:9:=?A@CDDCCAA887766776666553332222210110/////------........////000000111100000000//////////..------,,----,+--......./////................////00001122221121110000//000///..--....---,++*****)))('''(&%$$#$##"""!!!!      #%)/6?FHHHHKOTY[^_b`W9'*)'((((()(((()+++*(),$Cl`bbdceP;B<:KG>=EDSda]]ab_c^ab`bTHDHVJ>BG9,05;?BGB:766336AJMGB:53355679>?A>:51..//0011235510////00..////////0000000000000011222238CQ^cb`XJ;4430///-,,,,,,,--//0111111121000/.-----..--.13;?DHLRW^dipuwwrlmsxwwyvspja]XMHQZ]dmrrw}~~~~~}~}|{ywvutusplhfa_``__[NLJEEHPV^jv ¤¦¦¦¤£  Ÿžœ››™—–˜˜˜˜˜˜——––•“’’ŽŒŠˆ†ƒ„‚ƒ††‡‰Ž’““’’‘ŽŠ‡ƒ‚‚‚‚„††ˆˆ‰‰ŠŠ‡~|zvrnia\ULF>;:9:89;<<==<<;:<>>BBABC@@@?777777776666553332222210000/////------......//////000000111100000000000000////..------,,--------.......///////..............////00001111221111110000//000///..--..--,,,*+*,+**))))''''&%$$####""""!!       !#%)/4<BGHIIIPUVWZYZWF-''''((((((((((++,,,)&&=md[[afhS>@;76@F=556Pcccddda_`debcXLDGJA;@A:1.028ADE?634012:BEFB;7445579;=?AA>:51/0011112344420/////...////////////0////00////////16AMZa]ZRE9121////..,,,,,,--//0111111121120/..-,-----./../0036:>DIMSV[^^^afjklljgd]UQMMOIEQ^fjmpu{€||||}}{yyvvttqmjhecaa```TLNQX_ks|‚”›žžŸŸœ›œ›™™™˜™˜——–––••”““‘ŽŽŒ‹ŠŠ‰‡†ƒƒ‚‚‚ƒƒ„‡‰Ž’’’’‘Šˆ…ƒ‚‚‚‚‚„„†‡‡‡„‚}wmfdaYQKHA<;;;;;:;<<;<<==<<:;<=??BBBB@@?@776678776655442211223310////////--....//..////..00000011111111111111111100////....--------------....////////................/////0//0000221111000000//00/....-..--,,++++++**)(*(''''&&%$###"#""!!!!     !"%()-3;ADFHJLORSUUSM?4)''''))(((())))++-++)*0ll`_adfV8AD<239@DBKEI_baffbc_cddgeguK@>?=>@A90/.7EED@821.-/29@BB?;6543368:<?BB?:62011001234452200//..../......--..////////......../3>IW[VSLA70///...--,,,,,-.../1000001111100/.-.-,---..0..//0/00/1568<>ACEHMPTVVXUSNECCFKF?DR[aflov}€||}||}|{yxwwsqomjgebcacb\_kq{ƒŠ’˜›››œœ›››››™™˜—••••””’ŽŽ‹‹‹‰ˆ†…‚€‚‚…‡‡‹ŒŽ‘’’‘ŽŒŠ†„ƒ‚‚‚ƒ„…‚ƒ‚wl_UJE@?A?B@:<<;<;<<<<<<=<<=:9<<==?BCCB@BD776678776655443322223100//00////......////////..00000011111111111111111100////....--------------....////////................/////0//0000111111000000//00/....-,,,,+++++++***((*'''''&%%$#"""""""!!!      "#&),04<ADFGJLNPRRSOG7-'''('))(((())))++*,+(,ekhhfcgW7AHG8-/7:=>D?Peegjecddb_aebfdGBBDEEEE>3/.279AE>3/.-./29>A?976645578;>@@@>:611100123444422210/....--....----.................1<FSVRNI@6-,,,-..--,,,,,-.../10////0011100/.-..--.//.0///000////./0../10468=>?BAA>;;;>BB>?ENSZbenu}~}}|}~|{yxyyvtqonkjgilrvx|‚‹’–š™šœœœ›››››››š™™šš˜—””””””Œ‰‰ˆŠŽŽŒŠˆ‡„‚€€€€~‚„ˆŠ‹Œ‘‘Ž‹‡…„‚ƒ„„€zri^TJC?@@?BA=<<;<<<<;=<<<;;;<;<<==@CDDEEFF66776866775554332222210/..///////0////....////////0000111111111111111111//.////...--,,-------------.00//////..........------....///////////000000000/////....-,,,,++++++**)())((''&&&%%%$##""!""!!!!     !$&+.27?BHIIJLNOPQQMH:,'&&&'()((((**))*))*,-]legdbfV,<FRQJ=337;55:Rfqnme^abc_]af[ROKKJHJIHB80/125@GD:1-----16<;;755544568==>?@=97321011244554444410...--...-------..//..--..----,09BMUPLF?5-,,,,,,,,,,++,-...///00000011110///......////0000000000........./0/001111367:;;==AGKPW_hry~€}|}~}|{{{zvvtsqonotz‚ˆ•——™™››››››š››ššš˜š—˜——˜˜–‹’’’‘‰…ƒ…’”””•”“’ŽŒˆ†ƒ€€}†ˆŠŒŽŽŽ‹Š†„ƒƒ‚ƒ‚‚~{tmia\PB@@?B@><<<==;;;;;;<;<:<=???@BEFFGGHG77776866776554332222210/////////-/////....////////0000111111111111111110///./.....--,,-------------.00//////..........------....///////////000000000/////....-,,,,++++++**('))((''&&%%%$$##""!""!!!!    !"#&(,039AFIIIJLNOPPNID4('&&&'((((')))*(((()-[ndge`h[-2>GTYXQF8:<98?^ltrlhje^`aaff\SROLNONLLH?3/237=CF?4/---,-/477765554679<=>@A?<9621011234555577522///.-...-------......--..-----.7AJROJF?5-******++++++,-...///00000011110000////..////0000000000..--........../////13366778;<?ENYcnw}€~€~}|zy{{zywuvw†Š“–˜——™™š››››™˜˜˜–”’Ž‹‰‰ˆˆ‰Š‹„€†‹Ž‰rrz‚’™››››š–“‹ˆ„‚€€€~‚…‡ˆ‰ŠŠŠ‹‹‰ˆˆ…ƒƒ‚ƒ‚‚‚|xsoh`QB=<><;;<<<<;;;;;;;=>??@BBBCEGGGHHHG88777766665544322222211000///000//////..////....////0001111111110/./1100///.--.,--,,,,----,,,,,,....////////........--...--.........///.//000000000000///....---,,++,,+**)''''(('&&%%%$$#""!"!!!  ""       #%(),15<CIJIHIJKNMLLE?.'&%&'((('')()(((()*(Qmcedac]./7=FPWXYM729:?<\trrpcYa^[`fhe]WSQQRQPNLJC933/18=CA81-**+*,.135445678879<>@A>=:7520/1213455689643100.-...,,,,,++,,-----,,,----,,5@FQNIE@7.(())))****,,--..--..////0000111000//////////00000000000/...-..--.../////0001222344556;IWcmx„€}€~zyxz{{{{|€‡‹Ž’“•••–—™™šš™š˜”‘Š†|uolhffkmpqs{‚„‚thnz‹˜Ÿž ž  š™”‘Œ‰…€|z{{}€…†ˆ‰ˆˆ‰‰‰‰††ƒ‚ƒƒ‚‚€€€€€}wsh]M@?<;::;;<<;;:;;;>@@AABCDFFFHGGGFFF6677996666554432222221100////010//////..//////....//0000111111110/./00//.-..---,--,,,-----,,,,,,....////..///.....------.--.............//000000000000///....---,,+++++*)'''''&&&&&%%$$$#""!"!!!  !!    !#%(++.37>EJJHEDFGIKJGC;+&&&''())'')('((()+%Oibde`ea0,38=GNUYXP4/9AEHlttto`X`[Z_chg`YVTTQPPQPLGA:53127=@:2,***)**-012357888779<>??>=:752112133467876542000/..-,,,,,++++,,,,-,,,++,,--1<ENMHE@94*())))**))+++,++--..////00001111110/////////00000000000/....--..///000//00011223443333:GVblv}}~~{vsvz~‚‡Š””“•––——•’‹…wpic[UPMHHMQ`]_dnsqlgs…–Ÿ£¢¡¡¡¡Ÿ›‘Œ‡„}ytrssx{~€‚ƒ†‡……††††ƒƒƒ‚€€€€~~~~‚ƒ‚yqj]L@===<;;:<<<;<>>ACCDDEFGGGGGFFEEEE7777666655554432222210000000//0///////-///////...../0000111111000///.......-------,,,,,,+,,,,,,,--..////00////....,.....----..........,-..//////0000/////....---,,++++*(((''''%%&&%%$$$##""!!!!!        %'*+,049@FIIHEBBFGGFE?5)&&&''((((''(()****Tm`bea`c1*566=DIPWXT>==><KlpstUV`cabeeegc]YXWSPPQQMLF>81/138<<3,+*)))*,/13589:9:7778:>@AA@=:642012334567535422110..---,,++++++,,++,,++**)).8>FKGDA:5.''(''&((())))()++--./../0010001221111//////////00//11//..--.......///1/00/1112344442249CS`ksyƒ€}|wqotx}ƒƒ…†ˆ‰‰ŽŽŽŽŒ†~woh`XSNLFCDDDEM]XROTZ_gn”ž ŸŸžŸž›–‘Œ†€|toiddeimsw|~€„„„„„ƒ‚‚‚€}~~~}~~€„€~zrgZF><;;<<><>>?ABCEFGGFFFFFFFFEEECCD6677776655554432220000000000///.//////-///0000......///001////00////.....---,,,++++++++++,,,,,,,--..////00////.....-....----........,,-...//////0000/////....---,,++**)(((''''&%&%%%$$###""!!!!!       "$',-/39<@FIIGB??BEFEA=/(&&&&&''''''())*+._kaab_dd5&29;>>BJOPPI>;<ACTmqrne[Ycaekmkhe^][YVRPSROMJE=30/24993,+*))))+.01489:;<97779=@BBA=::6520013345655555432110/////--,+++,,,,,,++**)),2:@HHC@<6/('''''''())))()**++,--.../100001111110/////////00//00//..---------.112311111123555522247CQ^ipz€€€}|zvpoquy}€€‚‚€}}}~{ri\TLIIKLONLJHHIKQQOKIKT_o†’’““’’Œˆ{sme`\YVVX[beipsv{~€€€~~|{{|}}||~~€ƒ|wodWF===@AA?@@ACFGFFGGGGFFFFFFEEEFCC6666665544554432210000////000010//////.---............//////////..--------,,,+++++++**,,++,,,,,,--....////////....-,-...----........---/...///////////../...-,,,,,++)))(''''''&&%%%$$####""!! !!   "$%),.27;@CHHGFA>>BCECB:,'%%&&''((()')(*)3el^`_]`j?"/4:<@B@CHJJ?8;A@<Zqqsomi]eghlppida^^\WSPQPONKGC:3005473.+*))((*,-045789:86777:=ABB><;:752111224567797553442213330/.,,,----++**+)))*-6<DJA?:51*'&'''%%''&%&''(****+++./..001111221110//....////00..00-----------04455322012456766333347?NZeov|€€~{zxunkloux{||zzyxtsqnmlg^VNJJIIKMLNNJGGHJLKHFGKNZm{}|{}yzvqjb[UMGDBEGOUY^_deilqtyxy}~}|{{{zz{{|}||{|}€|tkbUI@AABCCDEEFFFGGGGFGHHGGFFFFFFGG6666665544555422210000////000010//////.---............/////////...------,,,,+++*****++,,++,,,,,,--..//////////...-----------........---....//////////////...-,,,,,++)))(''''''&&%%$$$##"#""!!        !#%(+/38<BEGIHFCA>>ABDB?7)'%%&&''((((**+':ki^__]boG -238:DGKFEHG=>Qd[DOjlmgjiegkmpqnief`\ZWTQOMLLKGF>7114363.-+))(()*+-13379:766677:=>>><<;975211123435579:76753333330/....--,,++*****)(+19@FC>:53.(''''%%%%%&%%%&')))*)*,,-..011112222210/....////..//..----------.156884320235677883333246?JYcmux~€}{yvrmjkorv{||zxwusqniida\XRPNKKKKJIFCCDFECCB@ADOZ[YYYYYVQNFA=98779?EJRV\___aceimpqvz}~|{zzzz{{{|||{{|~€yskaWKCDEEEDDEEEEEEFFEFFFFFFFEEGFGE6654556644333322102211000///////000.......-.//..----/.........----,,------,,+*******))*+,,,,----+,--..//00..........--,-----------..............///...///.------++++)))(''&&&&&&$$%%$#$$#"!!     #$(+-18<DGJLLJGB?ABCEFB=2&('&&&''''(')))Gog`[^abjU!.:<==;EGXOLJHB=EOWWXdjhgiiabiqrojchhd_]ZVTQLIKIFDA:614675/,,++))))*,-015988855569:;<>===;97543002222568997995442101100///.++-*****))()-5;@C>;73/,)%$&&%%%$%%%%%&''''()**,---./012322220000.0///.--..--,,,,,,**--/1468534422345896666521134=IV`irv}€~zyvrljfkotx|{}{zzwusqmie_[XTQMLJGEB@?=@>><<;;==?????><<9:::89::9:<BHMSX[^`^]_^behlpux}~|yyyxxzz{y{{|{||~|ytldZMFFDFFEECCCCCEEEEDEEFGFHHGFHF4433332233323311211100///.......//......-.--..--,,,,,---/-----,,,,,,----++,,+*))))***)*+,,,,,,,,+,--..////..........--,-----------------......//....//....------+*++)))(''&&&&&&%%%%$#$$""!!      "%*,.29AFKPOLJGDBABEFIF<,('&&&&((')%(')Vlc_\bhglS2JLLNSUJGJNKIA<D@BGQ^aeghji_gjnplbejgbac^WTPLHGFEDB=834675/++++****))++0269995534457:=>>>=;97532111333335888876421/0000000/.-,,**))))())-6;@>:641.*&$&&$$%$%%%%%&''''''))++,,../02222221111////..------,,--,+,,,-/11344123434456866666411344<FR[eov{}€}ywtrkdgjlquy{{||{yxwtrokgc`\WVTQNJFA<:88887677::::9;;;<=>><9;;99;?EJOS[^`_`_\ZY[`ejqvz{{yyxxzz|{y{{||||}~}ytmc[NEFFEDCDCBBBCCCCDEFGGIIHHFGF54224322322211110000////////......//..----++,--,+-,,,,,,-+***+++,,++,,,,++++++**)))))))*++++++++,,,,..----..........---------------,------....//--...0--------,,+*****('''&&&&&&&&%$####""""  !"%()-/4;AHMPPLIFEB@BBDJG8**'$$&('''&'$7fmc]_chhlZ&+CKJNMOTSKING@9NaVZWR]dilkkqnlnpob_eggebb_WSPLHCBACB?:30254.,,++++,,+**+-/3578652113688;<=>>>>;955312331024425775422001123431/--***))))(((18;=:6640.+)%%%%%%%%&&&&&&&&''(()***,,-.01000011111/00////.-,,,+**+*+++-.0111112333223455566766644559ANYbkqx~}xurniefgjmqvy{{{zzzxxvtpligfca]XSMIFDA>::6777677899<<==<<=<:9889<@FJPUZ]```][USTZ]dhpv{{zzxyyy{{{|}|}{{|}}|xtkb[OEDEDCCBAAACCCDEFFHHJJIHFFD33222222221110010000//......----....--,,,,++*,,+,++++++++++++,,,++**++++********)))))))*++,,++++,,,,..--,-..........----------------..----......--....--------,,,+****('''&&&&&&&&%$$$$#""      "#&)),.28>DGJKKIFEBCBCBFB0(+'&'&'''(*%@pmbb`ffhoL#*0EQJGF@BLQFKJ?<FT[dWVcinonlopklpeW_jjhica_XRRMIDA>>=<93/011,++++++,,+,+,,/.3565531/057789;<>@@?=:76334300011114445332222234320--,**)))(&&'*38:<865430,*(&%%%%%%%%%&&&&&&''()**,,-//0000011111000////.-,,++++**+++,-...../01221233355666555334437?KT]emty~|vrpnlgbegjoux{{zzzzyywtrnlkkihd`[XUPMHFA;877666777::;;;;::887779<BGLQW[]__][WQMMTY`gptwzzwwxyyzzy{|||{zy{}}xribYNEDCCCABAACCDEFFJKJJJIGFED1132222211111/.//........-------,.,,++*,+++,+++*****++**++++**,,*)****++****(******+*)****++,,,,,,++------......--..--------------,,------.......-..-,--------,,++++))((''&&&&&&&&%$$$###"""   #$'*,-.26;@BFIJIGGDAAA@?8-*,('%''&(''<pkddegjlh=+/3?ZLCFG<PRNKIGFLQ_f`X_gmoonpqopof_ejhgiffa]XRNGB=;:;:74110-,++**)*,+--,*,./01345420037589::<>A@?<:8697531//.//122444433355431/.-,,*)(*)'%''-2499856720-+'%%%%$$$$$%%%%&$%%'(**,,........---/0000..0..-,,++++++**++,,,,----01111233444433332232126:BNWbjqx{zurmmkfbbekqtvzxyzyxxvttolmmmljiggb^ZVQLE?986656777789::998866569>BFMSX\^^^]YUNIHJS[ckqwz{xuvvwxwwyz{}}z{{{zvpi`XPFDCB@@ABCDDDGHHJLKJHGECA1110111100/.//-..-------,+++,,,,-,++++*+)*++***)))******++**))++))**))))))))()((''(**)****++,,,,++++,,------------..--------------,,--,,,,--,,,,.,-.-,------,,,,++++))((''''&&&&&&&%%%$$#"""  !$%)*,-.16;?CEGJJIHEBBA@9.*++('()(((*>kmfcfkmog5&.10=XXKNKJLMRSNDFFPQhieafltolknnknl`bdffefghf_ZVRJB=;:866:;83/-,*(()**,-./...../124642223568999<??>=><:;9753221/0132334433344321/.-,,+*)))('&&),15::997661/,'$%$$$$##$$$$$$&&'(**,,--......---/.....///.---,,++++**++,,,,--..////0112222211112210/0235>JV^gotyyvrpmlhcaejlptwxyyxvsqomjiijjkjmmkie`ZSKD<87666667777776666555768>DINTZ\\^^]UQJFBGOXaiotxxxvttuvvuuy{{zxyyzxvqibYPECABBCDDEGHIJIKKJJHFCAB000000//0/////0.----+,,,,*,,,,,,,+**))*)())))))*))*)****++**))))(('(((('(()))((((((())********++++++,,,,,,,,,,------..--,,------,,++++**+++++++++++-----,,+*,,+,,,****(('''''%''&&&&%%$#$#""   "%(),+.147>BEFHIKJIHDDC?0*)*(&(*&)(*)dpgeejjoW*(0/4DV\LKHILKBIRKE?IY_YX[`jpskjjelnlg_aegc_afhe_]YUNGB=:879=D?51-+)((((+,--//..--.//3345521136779;<<<????>><9866533334444542300000.-..-,+*)))('&'(,27::;;9841.*$#####""""##$%$&()*,,,,-....--,,,---.././/....--,,,,++,,,,,,,,----..//01000000//11/.////15;FO\ckry{wtpmiheaagjoruwwtqqnkihfdddhjijljgd_YQH>987665566775544445555569?ELQWY[^_]ZSMIC@IPX`gntyywurrstrrruy{yyyz|xvpjd\SJAACDFEHJJJJIIKJIFFCA?////....//.././---,,+,,,,*,,++))(*))(()('((('())***)))))**))))))(('((((&''(('&'''''())**********++++,,,,,,,,,,--------,,,,------,,++++**+++++++++++++,,+,,+*,,++++****((''''&&''&&&&&&$#$#""   "&)*,.148>CEFIJKKJJIFFF9++**)'&&'((#TojijnpoO,43.-4CJNOQMSSSOLKDBGG[^UK\biqommjgmomifdba``_cfb^ZYVPKD?<<=<<B=53/)((((()+,//./.-----/2466321135689;;=??@@@@??=<;:998888755410....,.-..-,+*)))(''&'(-147:;97630,($####""""###$%'&'(*,,,-....--,,,-----////....--,,,,--,,,,,,,,----..///00000//..00....../128DNX`hpuzywoljgeb`agnqssuqomiedb`[\^`cfhihd_YPG>988665566775544445544568>CJNTZ\]_][WPJEDDJQZbhpswxvtrpqqqrruz{zyyz{zwsog_XMFECGHIJJJJIIIIIFDA=<....--...--,-.--,,))****+((((((('''''''''''(((''''(((())**(((())(((('&&&&&&&&&&&''&'))****++))))))+++++++,,*++,-,,,,+*++*,,+,,,,****++++**++++++******+*+,++++++******))))('&'((''%%&&%%$$!!     $(+,/137;AGLMNLJKJLKJJC.&)'%'''(('&Mqhciopi?"300/14=GRZ^XVXYUMIB6<HbcZYhqmrrqmnmiijkgda_b`_^]\USUSQMIC@@C?8:9561(&''((())*./00.,+++,,-03101/025788:;=???@@AAB>@@@?>>=;;8542/-,---,-.,,+**)))('&&&%&+/24688441.,'"#######$$$$%&'(++,,--..,,++,,--......////..,,,,------..--------..//000011//..//..--....017?IS\emswwvpjhhd_^^flnpppnlgba^[WTSSX[`ea_ZWME=986665566775566556666669<AGMSWZ\_]\YSNHFEHMT]ekpuwxxvspmnopqsx{zyyy{zwtqjc[UMIHIHIJIGIGHGFC@=;9....-----,,--,,,,+**))((('''((((''''''''(('(''''''(((())**))(((()(((&&&&&&&&&&&&''&'(())))**(())))+++++++,+**+,-,,+,**+,,+**,,,,****++++***+++********+**,++++++******))))('''((''%%&&%%$$""    "%),/147;=BHNRQOMLKKMLH7*&&('&'&&($Ntiejjle2#120.306EIOWYVVVWVMD;08F^RU[akjruqmprnjiggdb`]^^YUTNMPRNLMF??A<763551+'''(((()*-.//.-,,++*+,-.00/0035778::;<>@@@@AABBBAAA?=;87531//.--,,,+++**)))''&&&%$&(+.025442/-)%#######$$%%%&'(++,,,,--,,++,,--......////.-,,,,------......----.///0000111/0000/.--..//0122;EP[ainvyupmjie_Z]bhknqrplfb^YUQNLOOSXYWUPJB9786666677887777889999:::;AFKQVY[\]^ZUQKGFHMRXahlpuwyywrmmoonorv{zzz{||yxtolc\RKIIIIHHGEEDC?=;76....,+-,,,--,,,,+****(''(&&&&&''''&&''''''&&%%''''(((())(())((('''''%%%%%%%%%%%%&&&&&&''(''''())))*)*+++*++++++,++++****))+++*++**********))))**************++++******)))))((((((('%%%%%$$""!!   $&)-037;>@CHMPQONNLLMK?-)(('*('&%&TvjefjdgC#.210.-/9HORXYY^dZTMG>1<HZZTW^hjmqqswvqiaafd_ZY^_VPNIHJNMMMIDB@<854774-(%&'()))),/..-...+)(('))*--.014566899;<=>??A=>?@@BBA=::8664210//-,+**+*))(('&%%$#$$$%),.1234/.+&#"$##$#%%&&&''(****++++,,,,----.-......//.-,,,+---------.-------.///00011001100/.00//00230149AJV]fkrxwqpjec]ZZ^cglmonlgb[VSPIGGHJMMKFC=88:9887788888888:<<<;;;;<;?CHMRXZZ\^[WRJIGILQUZagmqtxyxvrmonpqrsv{{{{|}€€{xsohaVNIHGGDDCDA?;:752,,,,--,*++++******((*)))&%%%&&&&&&%%&&&&''&&%%''''&&(())((((('((''&&%%%%%%%%%%%%&&&&&&'''&&&'())))*)))++*******+***++***))****))))))))))))(()))*))))))))**))**********)))))(((((((((((&%$$""!!   $(*-037?CDEHIJLMOMMLJB2''''(*)%%$StkafhiiM&.10..-+/>MWPUVY__][TH>7CQ^^UWc_[htstwyzqffki`[Z[\ZRKIHJJJKJJFDA<875654-(%&'())))+-,,-....*''&$%(*+-/25568988;<<<===;::;>>><9::::8732100.,+***+))((&&%%##$$##%&*,.11/.-*%%$##$$%%&&&''(****++++,,,,--...-......//.-,,,+,,,,-----.-------.////00000011100/1111222223236>GQYajpuxrnhc^[VY^`ekmnnnhc\VSNHDA@CCB@==:;<;::::;;;;;;;;<=======>==BDIPSWXZ\YWTNJKJJNSW\dgkqtxyxvromqrrrty|{{|€ƒ~}wqlaULIHEBCB?=;97633++,,,,,+****))))(((&&&&&&%%%%%%%%%%%%%%%%%%%%%&&''&&&'((((((((''&&%%%#%%%%%%%%%%%%&&&&%&&&&&'))(''*())()))))))****++*)))))))(((())))(()))((())))))(((())))))))))))**)))))))((())((''((&$$%$#"!!! %'*/27:@EGFGEFIKNNMJD7,*((()*+$#A{m_^edj_%+1038/++-8DLORSUZ[^]QJB=HRWYQRZRTbrstx}|wusoh`\YVUTPHHIHGGEFJGDA>976543.('''(((')*++++-//.,*'%"$'(+.046776679=<<<=<:976798877:;<<;76320/.,*****))(('&&&#$$$$$#$'*-.10/.,)&$$$%%%%&&''(())**++,,----..///,---...//.-,,++**++++,----,----....//00001112221133334455434467<DLT_eltvsmhc_YUTX^cgkmmmje]XRNHE?<:<>>?>>=>>???<<=>????@@????>>>=<>BHLPTVXYZWUPLKHINRUY_dhnrvyzyvrqqqrssvy~€€‚ƒ…„‚~yri_QGFC?==;9644330+++,,+******))(((((&&&&&&%$$$$%%%%%%%%%%%%%%%%&&''&&%&((''((((''&&%%$%%%%%%%%%%%%%&&&&%%&&&&'''''')((('(()))))))(())))))))))((((((''''(((((())))))(((((())))))))))**)))))))((())(('''''%%%$###!! %),/4:=BGIIHFEGJNONNG>3))))*)((-qwi`dijb5%.1122-**,5BLNNSW[]\ZNF<8HVY[[S`dY[bmptswwwunjaZTQPPLFGHIFDDEIJHCB?;98851+((()))*)')*++,...,-,(%$$'*.26887668:;=<<<;:9664666577;9897521//.-,,,,,**))('''&$$$$$#$%(*.01//0-)(&%%%%%&&''(()))*++,,----..-------......-,,++**++++,---..........//001122123333344455777877778;@IQYdhpttmha[ZSRV]`dkmmlid^XUOLHC?@@@AAA@@@AAA@@?@AAAA@@??==>><;;<?BGMSUVXYYVRMLJLNRTX\afkqsvwzywtrqqtvxx}ƒ…†…ƒwocVGC@<;:964332/.**))****))(())(('''&&&&&%$##$$$$$$%%%%%%%%%%%%%%&&&&&%&&(&'(('&&''&&%%%%%%%%%%%%%%%%%%$$%&''''''''((((((((*((((((((())))((((((((''''''(((((((((((((((())(((((())****))))))*)()))((''(('%&&%$##""!  "%(,/4;?AEHIGFEFLNONMNG7'')**)((]{mceiph@!.20/.,*)+-7AFJRRTX^c^OEA=M_ffjnwq_YS`edkrxyumjd[VSPOJDEFHFDDDHHGFFFC>:852+)))+*+,,((')+,-.-,.,*)'&&(+.59854799<<=<::9755545555653666210///.-,/..,++,****'%$$$#$$$%),.21121.+(%#%''&&&'(((()*++++,,,,....----....,-..,+++****++,,--/.....//..//00223221243345556677888888779>EMU]emsrmib][WSV\_cgkijiec[XTOLGEDBCCDCBCCBBAAAABBBB@@?=<;;;;99:;@EKPRWYZZXSPOLOQSXY\achlqsvy{{xusuuuwz|ƒ„‚‚ƒ……ƒzqfYHA<98755211.,,**))((**))(())((''&&&&%%$$###$$$$$%%%%%%&&%%%%%%&&&&&%''(&''''&&''&&%%%%%%%%%%%%%%%%%%$$%&''''''''((((((((('''''''''((((''''''''&&&&&&''''((((((''((((''(((((())****)))))))(()))((''(('%&&&%$#""!  $&(,.37;<?ADA@AEKLMMLHC4(('))*%UwolhnrpW&+/3/..,+**+8@KORRUVVY^QCCO^gkjgmjVYa^ZWWcortplni_YVRNHC@CEGFEFGEFHIIFD?;94.**-**.11.+(')+,,,,-+,+,))()-164345688;:988764222333332222210//-----....,--****(&%%%$$$$%(*.100210.+(&%&&&&&'(((()*++++,,,,......--//..,---++++****++,,--/...//////00112343233334455666778999888998;AIQ[bnrsole`[[YXY_cgikjjhe^[XSPJGEDEFECCCBBAAAABBBBA@?=<;::9999:>EHNRUW[ZYVSQQRTVX[]`bbhmpswx||zxusvx||~‚…„‚€‚‚~yri[J>8754220/.-+,**))(())))(()('''&&&%%$$$$$$$$%%$$$$%%%%%%%%&&&&%%'''''''&''&&&&''&%%%&%%%%%$$$$$$%%%%%%%&&&'&''(('''%'('&&&&&&&''&(''''''&&&%%%%%%&&&&&%%&&'''''''''''''((((()(((**))(()))(())))'(((((('''&$###!  $%*,-1467:<=;>@BIJLJJF>2*'()(%Syocagso]$'//.--++***,/BKMRSSQPU[ZLDNbkooerj_[heaaMWglomkjgc^]XNGB?@ACEFDDEHIIHFDB@=7/,,//03682.*'(())+,+,--..++--000011236676544111012222100.//////..--..//11/.,*))*)('&&#%$$%)-1323330/,)&%%%&'''(((**++,,,,,-...../..////..-+**++*))++++++,.//01111222222233333444556666666887799888777?FOZciqusnje`^[YX\`eghklid`\WUPKHHGFEECCBA??@@BBAAA@?=<;:987889<@DJOTWY[[YVTVVXY[\]_ddghlprtx||{xuvxz}‚„…€~|yriZI;5531/.-,++++))))(())))(()('''&&&%%$$$$$$$$%%$$$$%%%%%%%%%%&&%%'''''''&''&&&&''&%%%&%%%%%$$$$$$%%%%%%%&&&'&''(('''%%%%%&&&&&&&&&'''''%%&&%$$$$%%%%%%%&&%%&&&&''&&&&&&''''((&'((**))(()))))))))'(((((('''&#$##!   "%(+-023347:;>BDFIKKJFB6*'))&G|o`_fqqe7 ,0.---++***-=GDGQTWROQYYRJSbjq^ovbeoha`bRP\dhjhd_`b^YQGB@?@BCCDDEFFFFEDB@=7/-/13425420+)((((***,/12200..--//../02241111011012222100///////...-..//11/..,,,*)('&&$%$$$'+-2555410-+(&%%&''''((**++,,,,-....../00110000/-+++++**+,,,,+,.//011112222222222223434566655557877998887666<CNXaiqtvtqjgb`][Z]dgkjhhfc^YVTPKHGFEDCBAAABBBBBBA@?=<;:977889<AEJOQUWZ[[[Y[[Z[\_acceffhknqtx{|zwxx{€‚ƒ„‚|{{yuqg^M=200.-,,+++++(((((())))(''''''&&%%%$$$$$$##%%%%$%&%%%&&%%$$%%%%&&'''''%((''&&''''&&%%%%%%$$%%$$$$$$%%&&&&&&'&''&&''%%%%%%&&&&&&&&&&&&%&%%%%$$$$$$$$$$$$$$%%%%&&&%&&&&&&'''''''())))))***)(())('''(('&&&('$%#"""     #')./12237:=@BCFHJMLGA4)(*'6uvkkjpqj8%-.----++))*0FCBIQSQPOSRMXY[`k]Knovnigd^YYVRYabe`\][[\SKFA?>?@CFFEDCEECBA@<72.04872-121-,*))()(),/255442..,..--///.///////00133332111..//0000..--00000/.-,,*)('&$%%$$$$(+.2455211.+)'%%''((()++++----........001111200/,,----,,--,,,,..//1111111122111101223444554444566688888888659BLV_jsx|zwrkgc`ZX]adghhjhd`\YVQLIGFEDC@??BDCDECBA@?;;;:89:::<?CHNSWZ\^^____^^_bdffffcbehkorvz||zz{}ƒ‚‚~{yvtsni^QA2..-+,,-++**(((((())))('''&&''&%%%$$$$$$##%%%%%&&%%%&&&&''%%%%&&''''&'((''&&&&''&&%%%%%%$$%%$$$$$$%%&&&&&&'&''&&&&%%%%%%%%%%%%%%%%%%&$$$$$##############$$##$$$$%%%%&&&&&'&''()))))))))(((((('))(('&&&'&'%$##""   ""'),.01358<BCDDFJLOLGA2((,,l|kkqrnlA#*------++*))-/9FLQPPPPKLPW^`[b^W_eproiiec][X]`aa]\ZUXXSOLE?<=>?CCBAAEFB@?ABA90.1550-/211/.,)))++/-0358830.,,,--...-.--..-0/013333332200001111../000000/.,++*)(''&%%$$$$%),0244221/-,('%%%((()++++------......000000001011/---..--,,----./00000011110011012223444455444466777777774448@LWaju|~}zvpie_YW[]cffijifb\ZVQLIGGFEBBDFGFGGECB@@?=<;9:::;=ADHNSWZ\__``aa``acegggfc``bdjosx}||zz{~€€€}xvtrqmh_VF6---+++,,,++''(((((())('&&&&&'&%%%$$$$##$$%%&&&&&&&&''&&&&&&&&&&''%%%&((''(('''''&&&$&&&%%%%%%%%%%%%&&''&&&&%%&&%%&&$$%%%%$$%%%%%$$$$#####""""""!"""""""####$$##$%%%%%%&&&&&'(((''))))))))))(())))''&((&&'%%$""  !##')*+.039<@BFJMNNOOJFA1()*[wlmvsoP  #,,,,,,,,,**+15:@HORONKHKKUadXQZeigackh[Xda___\__\ZYSQORRNHB@><;;=<<=?====?DKA1**.0.//33201/,*-0110214883/+*)),+,,,,,-....///02123234433221100//..00110/.,,++*(''&&%$%#$#&'++/0111//-+)'''((())*+++,,,+++,...-0000//01001100..--..--,,----,..../00////000011222233443333466666777654447@LWclv||vrie\USX\aeiijifb_[VRMIIHGGFGHJJJJGEDCC@>=<;;==??AEHMRVZ^`accbbabedeffffc`][\djnsuy{{zz{~~~ywuronlicYM=.***+++,+))(((((((())('''&&&&&%%%$$$$##$$%%&&&&&&&&''&&&&&&&&&&&&%%%&''''((''''&%&&&%&&%%%%%%%%%%%%&&''&&&&&&&&%%%%###%%%$$$$$$$####"##"""!!!"""!!!!!!!""!!""""#$$$%%%%%&&&('''''))))))))))))))))****''''&$$#!!!!"$')*+-/16>BFIMPRRTRJF?.()9zrinwwqT! "&,,++,++,,***/05>FILLIJLMLXbcYEHST_fldda_`bike^^_^]ZRPQSRLEBA><87788989999;BPI1*),-022421/0//023445222330-*)**)+++----.////0/0100023443333221100..//00/./--,+*)()(&&%%$#$$$'(*-./0100/.,)'(()(()**)+,,....//.-////..,-////....-...--,,,,,,,-..-.//////0000001100002322222333334554444469@LYcpv{{}}wqh_VPQW\aehjjlgda\VRMLKJJJKLLMMLIGFDC@?=<<<==??CGHMRVY]__cddebddeeffffc]]ZX[aflpsyz{{yz~~}xvrpmnlje^TC1+)*)**+*(('''())('))('''''&&%%%%%%%%$$$$%%&&&&&&''''''&&&&&&%%''&&''''''''&&&&''%%&%%%$$%&%%&&%%%%%&&&%%''&&%%%%$$$$"###$$$$##""""""!!!!! !!!!!! ! !!!!!##""!"##$$$%%%%%&'&&(((((())))))))))))****((((&%$$""!!!$()*++./5=AEJSUTTVQJE;*)(Tuqmsyte* "!%*,,***+,.,+++*3=BHKGHHFDFP_SFKSQTbgeijf^_\bjdZX[\\ZSPTVSQLCB?;:7544545688:AE@8,)+,.334422145665676310//,+*)(((()+----.0/011////0001331223333110/,-/../-.,-,+++*))(&$$$$$#$$$'(+,,/0221/-+*)))******+,..00/0/-./////....////......-,,,++++,,--....//////00////////00122211111123334434578ANYenwz{|yuoeXPPQTZbfgjkjgdb]XRPOMOMNOONNLIHFED@@?>=<>>>>AEINQU[]]acefffgffggffdb_[URQV^dhkrvz|z{|zzxuqrllkif_XJ:,)+*))))(('''())('))('''''&&%%%%%%$#$$$%%%&&&&&&&&&&''&&&&&&%%''&&''''''''&&&&&&&&&%%%%%%&%%&&%%%%%&&&%%%%&&%%%%$$$$#"""####""!!!!!!          !!! !!!  !$$!!!"##$%$$%%&&&'))(((((())))))))********(((('%$$##""#&())*+..48>HKRVUURKHD9)(,ksjqxsi7$"#'*++**)+,./,*,+5AGGIIF@?;=FRJ?IRYkhfhhceg\P]gaXTWXZZVQUSMMJCC@==:755534688<>>><0))+-0144434688875431/---,+*)((((()*,../0/011///////01113234445320/,+../----,++**++(''%$&$$$$#&&(*+.133220//,**++++,,,.0000/0110.////....////....//-,,,----..--....//111100//////////002211222223334454576:CNYcjsyyyurj_VOSRW\bgmklkieb\XWRQPPOPPNNJHGEDDB@@??=??AACEGNQU[]^bdgihghggggfeda]XRONORYaglptx{zyzzxxwsmmligd\SC4-*)((''((€€€€~~~~~~}}||}}~€€€€€€€€€€~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}|{zzzzyyyyyyyyyz}€‚…†‰ˆ‰ˆˆˆ‰‰ˆˆ†…ƒ‚‚ƒƒ‚€|{zzzzz|}ƒƒ……„‚€~‚€ƒ†‡‡„‚ƒˆ„„‚€~~~~~~~~~~€ƒƒ‚€~}{||{}~~~~~~~}}}€ƒ„„…†‡‡ƒ~}}}}||{{{{||{}||}~€€€€€€€~||{|~~~€€€ƒƒƒ€}{xwyz~€€€€~}|}~~~~‚„}|€€€€~~~~~~}}||}}€€€€€€€€€€~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}|{zzzzyyyyyyyyyz}€‚‡‡‰ˆ‰ˆ††‡‡††…„‚~~~‚ƒƒ‚€|{zzzzz{}~‚ƒ„…„‚€~ƒ‚‚‚€ƒ…†‡…ƒƒ……‡†~~~~€ƒƒ‚€~}{||{}}}~~~~~}}}€ƒ„„…†‡‡ƒ~}}}}||{{{{|||}}}}~€€€€€}{{{|~~~~~€€€‚‚}zxwyz~€€€€~}|}~~~~‚„~}{€€€€~~~~~~}}||}}€€€€€€€€€€€~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}|{zzzzyyyyyyyyyz}€‚‡ˆˆˆˆ‡„„„„„„ƒ„ƒ€~~~‚ƒƒ‚€|{zzzzz{}~€‚ƒ„„ƒ€€‚ƒƒƒ‚‚ƒ………{}ƒ†ƒ~~~~~‚‚ƒƒ‚€}{||{}}}~~~~~}}}~ƒ„„…†‡‡ƒ~}}}}||{{{{||}~~~}~€€€€€~|yy{|~~~~~€€€‚~}{zyz{~€€€€~}|}~~~~‚„}{y€€€€~~~~~~}}||}}€€€€€€€€€€€~~~~~~~~~}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}|{zzzzyyyyyyyyyz}€‚‡‰ˆ‡‡…ƒƒ‚‚ƒƒƒ„‚~}~‚ƒƒƒ€|{zzzz{{}~€‚ƒ„ƒƒ€€‚ƒ„ƒ‚€ƒƒ„„€{tv}‚„ƒ€€~~~~€€‚ƒ„ƒƒ‚€}{||{}||~~~~~}}}}~ƒ„„…†‡‡ƒ‚~}}}}||{{{{||}~~~}~€€€€€~~}|yy{|~~~}}€€ƒ‚€}zzyz|~€€€€~}|}~~~~‚„‚}|z€€€€€~~~~}}{{}~€€€€€€€€€€€~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}||zyyzzyyyyyyyy{}€ƒ…ˆ‡†„‚‚ƒ„„„‚~~}}‚„„ƒ~{{z{{zz{~€‚„„ƒ€€‚ƒƒƒ‚‚ƒƒ…„€yssv€†‡~~~~~€‚ƒƒƒ‚€}|}}|}|||}~~~}}}}~€‚ƒ……††‡„‚~~}}}|{zz{|}}~€€€€~}|{yz{|~~~}}~€€‚‚ƒ‚}}zzyz|}€€€€‚‚‚€~~|~~~~~~€‚ƒ~zy€€€€€~~}}}}||}~€€€€€€€€€€€~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}||zyyzzyyyyyyyyz}ƒ†ˆ…„‚€€€ƒ„…†…‚~||}‚„„ƒ‚|{z{{{{|~‚ƒ„ƒƒƒƒƒƒ‚ƒ‚€€‚‚„ƒ€yttu}…‡~~~~~€‚‚ƒƒ‚‚€}|}}}}|||}~~~~}|}~€‚ƒ……†…†…ƒ~~}}}|{{{{|~~€€€€€€€€~|zyyz{|~~~}}€€‚‚ƒ‚~|{zz{|}€€€‚‚€~~|~~~~~~€‚„|yy€€€€€~~||}}}}~€€€€€€€€€€€~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}||z{{zzyyyyyyyyy|€‚„…‚ƒ„††‡„}|{}‚„„ƒ‚€}{z{{{{{}~€‚„„ƒ‚‚ƒƒƒƒƒƒƒ„ƒyvuvz€„€~~€ƒ‚ƒƒ€‚}|}}}}|||}~~~~}|}}‚‚„…†…‡…ƒ~~}}}|{{{|}€€€€|{xwxy{|~~}|}€€‚‚„ƒ~|{zy{|}€€‚‚€}}|~~~~~~ƒ„€{yy€€€€€~~||}}}}~€€€€€€€€€€€€~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~}||z{{zzyyyyyyyyy{}€‚‚€‚‚„…†…†€|{{}‚„„ƒ‚€}{z{{{{z}~‚ƒ„„‚‚ƒƒƒƒƒƒƒ‚€€€€ƒ‚yxwwz|€€~~€€‚‚ƒƒ€‚€~}|}}}}|||}~~~~}}}}‚‚„„…†‡…ƒ~~}}}|{{{|~€€‚‚€€€€~~{zyxwy{|~~}{}€€‚‚ƒ„ƒ€}|zy{|~€ƒƒ€|||~~~~~~ƒ„{yy€€€~~}}|{}}}~€€€€€€€€€€€€€€€€€}}~~~~~}}}||}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~~~~~~~}}|{{{yyyyyyxxxxyz|€€‚‚‚ƒƒ†‡†…„‚~|{{|ƒƒƒƒ~|{zzzz{}€‚„„ƒƒƒ„„ƒƒƒƒƒ~}|{z{‚€‚ƒ‚ƒ‚‚€€€€€~|{}}}}}}|}~~}}}}|~€ƒƒƒ„…†„‚€}~~}||{}~€ƒƒ‚€€€~|yxwwxz|}}}|{|‚‚……ƒ‚€~|{{{|}‚‚ƒƒ‚~{z}~~~~~‚„{yx€€€~}}|{z||}€€€€€€€€€€€€€€€€€~~~~~~~}}}||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zyyyyyxxxxyz|€ƒ„„„„†‡‡…„}|{{|ƒƒƒƒ‚|{zzzz{}~€‚ƒ„„ƒƒƒƒƒƒƒƒƒ€~€~|{|yz}‚‚€€€‚ƒƒ„‚‚‚~€€€~|{}}}}}}|}~~~}}||}€ƒƒƒ„…†„‚€}~~}|}}~€€‚‚‚‚€€€~~~{yxvvxz|}}}|{|‚‚……ƒ‚€~|{{{}~‚‚‚‚€|zz|~~~~~~‚„|yx€€€}}||{z||}€€€€€€€€€€€€€€€€€~~~~}}}}||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}||{{zzyyyyxxxxyz{~‚‚„…………†‡‡…‚€|{{{|ƒƒƒƒ‚€}{zzzzz|~€€‚„„„„„„ƒƒƒƒ}|}~}}|~}|~ƒ„‚€ƒ„ƒƒ‚~~€€€~|{}}}}}}}~~~~}}||}ƒƒƒ„…†„‚€}~~~}~~€‚‚‚‚‚‚€€€~|}}zywvvxz|}}}|{|‚‚……ƒ‚€~}{||}‚‚‚~{yz|~~~~~~‚ƒ‚}{y€€€}}||zz||}€€€€€€€€€€€€€€€€€€~~~~}}}|||}}}}}}}}}}~~~~~~}}~~~~~~~~~~~~~~~~~~}}||{{zzyyyyxxxxyz{~‚„……………†‡‡…~|{{{|ƒƒƒƒƒ€}{yyzzz{~€€‚„„„„ƒƒƒƒƒƒ€~|{|~~~}}}~€~}„„‚ƒ„ƒ„‚‚€}~€€€~|{}}}}}}}~~~}}|{}ƒƒƒ„…†„‚€}~~~~~‚ƒ„ƒ‚€€€€|}}zxwuvxz|}}}|{|‚‚……ƒ‚€~}|||}€‚€‚ƒ‚€€|yxz|~~‚ƒƒ}{z€€~~{|{{{{|~€€€‚‚€€€€€€€€€€€€€€€€€€}}}}}|{}}}}}}}}}}}}}}}~~~~~~}}~~}}}}}}~~~~~~}}||||{{zyyyxxxxy{|~‚ƒ„†††††…††„}{z{{}~€‚‚ƒ‚~{zzzz{{}~€€€ƒ„„„ƒƒƒƒƒ‚€|}}~~~}}€ƒ‡ˆ‚}~ƒ„ƒ‚ƒ††ƒ‚‚~}||‚‚€~}|||}}}}}}~~~|{{}~ƒƒƒ„…†…ƒ~€€‚ƒ„„ƒ€€€€€€~|}~~}zyvuuw{|}}||z|€€‚‚……ƒƒ€~}}~~€ƒ€~}zxxz}~„‚~|z€€€~}{{{{{{}~€€€€€€€€€€€€€€€€€€€€€€}}}}||{}}}}}}}}}}}}}}}~~~~~~}}~~}}}}}}~~~~~~~~}}||||{{zyyyxxxxy{|~‚„„†††††…††ƒ|{{{{|~€‚‚ƒ‚‚€|{{zz{{|~€€€‚„„„ƒƒƒƒƒ‚~||~~~~~~€ƒ††ƒ~{„…„†‡†„‚‚~|{|‚‚€~}|||}}}}}}~~~~}{{|~ƒƒƒ„…†…ƒ€‚ƒƒ„„ƒ€€€€€€~}~~~}zxvuuw{}~}||z|€€‚‚……ƒƒ~~‚‚‚€~|xvv{~~„‚€}{€~}}{{{zz{}~€€€€€€€€€€€€€€€€€€€€€€}}}}||{}}}}}}}}}}}}}}}~~~~~~}}~~}}}}}}~~~~~~}}}}||}|{{zyyyxxxxy{}‚„„†††††…†…‚|{|{{{}€‚ƒƒ‚€|{{zz{{|}€€ƒ„„ƒƒƒƒ‚~}}~~€€~€‚‚€}{|ƒ…††…„„‚€~}{~‚‚€~}|||}}}}}}~~~~}{{|‚ƒƒƒ„…†…ƒ€‚ƒƒ„ƒƒ€€~}~~~}zxuttw{~}||z|€€‚‚……ƒƒ‚€€€€‚‚‚~|wvw{~ƒ‚€}{€~}}z{zzz{}~€€€€€€€€€€€€€€€€€€€€€€€€€}}}|||{}}}}}}}}}}}}}}}~~~~~~}}~~}}}}}}~~~~~~}}}}||}}{{zyyyxxxxy{~€‚„„†††††…†…‚~|{{{{{|€‚ƒ„ƒ}{zzz{{|}€‚„„ƒƒƒƒ‚€~}}€€}}€~~€}zzƒ„„„„‚€€~}‚‚€~}|||}}}}}}~~~~}{z|ƒƒƒ„…†…ƒ€‚„„„ƒƒ€€~~~~~}~~~}zxuttw{~}||z|€€‚‚……ƒƒ‚€€€‚‚‚}|xvx{~€ƒƒ‚}€€€€~~}{{zzz{}~~~€€€€€€€€€€€€€~}}}|{{{{|||||||}}}}}}}}}}~~}}}}}}~~}}}}}}}}}}}}}}}}|||zzyxxxxwxy|€ƒ……††„………„ƒ€||||||||~€‚ƒ„ƒ~|zzz{{|}}~€€‚„„ƒƒ‚€~~€~~~€~}|{y~€‚€‚}xx{}}|ƒ‚‚~|{{{|||}|~}}~~}}{|~‚ƒƒƒƒ†…ƒ€€‚‚ƒ„„ƒ‚‚~~~~~~}~~~~{xusstw{|}}|{{}€ƒ††„„‚‚‚‚€€‚ƒ„ƒzwvx|~~~~„„~z€€€€~}|{{{{z{~~~€€€€€€€€€€€€€~}~}|{{{{|||||||}}}}}}}}}}~~}}}}||}~}}}}}}}}}}}}}}}}|||zzyxxxxxxz~€ƒ„„…†„………„~||||||||~~€ƒ„ƒ‚|{zz{{|}}€€‚„„ƒƒ‚€~~~~~}}~€€€~~}|z{y{}|spqtxz|ƒƒƒ~|{||||}}|~}}}}||{|~‚ƒƒƒƒ……ƒ€€‚ƒ„„„‚~}}~~~}~~~~zwtrstw{}~}|{{}€ƒ……„„„„ƒƒ‚‚ƒ„ƒ~zwvy}~~~€ƒ„~z€€€€~}|{{{{{|~~~€€€€€€€€€€€€€~}~}|{{{{|||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|||zzyxxywxy{€‚‚ƒ…††„………„~||||||||}~~€ƒ„ƒ‚€}zzz{{{|}€€‚„„ƒƒ‚}}~}|}~€~}|zxyzx|‚~xspprtw|ƒƒƒ~}|}}||}}|~}}}}||{|~‚ƒƒƒƒ„„‚€€€‚ƒƒƒƒ‚€~}||}}~}~~}}yvsrrsw{}~}|{{}€ƒ……„„„„ƒƒ‚‚„…ƒ}yvwy~~~~‚…ƒ{€€€€~~}|{{||{}~~~€€€€€€€€€€€€€~~~}|{{{{|||||||}}}}}}}}}}||}}}}}|||}}}}}}}}}}}}}}}}|||zzzxxzxy{|‚ƒƒ„„…†„……ƒ|||||||||{}~€ƒ„ƒƒ}zzz{{z{~~€€‚„„ƒƒ‚~~}~||}~€~}}|zxxyvy€€zvssrtx|ƒƒƒ~~}}}||}}|~}}}}||z{~‚ƒƒƒƒ„„‚€€‚‚ƒ‚‚‚€€}|||||~}~~||xurqqrw{~}|{{}€ƒ††„„„„„„‚‚„…ƒ}xvwy}~~~‚…ƒ|€€€€~}||{{|}|}~~~€€€€€€€€€€€€€€€~~~}|{zz{{||||||||}}}}}}}}}}}}|||||}||||}}}}}}}}}}||{|{{zzyxxwy|}ƒƒƒ„…„„„……„~|||||||||}~€€‚‚ƒƒ~{{{||{}~€‚„…„ƒ‚€~}}~€||}~|{{zyywvv}‚}wtuwz}~€€‚ƒƒ~}|||||}}}}}}}}|{{{}€ƒƒƒƒƒƒ‚€€‚‚‚‚€€}|{z{|}~~}}}zxusqqrvz}~}|z|~€€€ƒ……„„„„ƒƒƒ‚ƒƒ„…ƒ€{xvxy}~~~€ƒ…„€|€€~}|{{{|}}}~~~€€€€€€€€€€€€€€~}||{zz{{{{||||||}}}}}}}}}}~~||||||||||}}}}}}}}}}||{|{|zzyxxwy}„ƒ„……„„„……„~|||||||||}}~€‚‚ƒƒ~|{{||z|}~€‚ƒ…„ƒ~}~€~~~~~~|zz{zzwwvy}}xwxz{}~€€‚ƒƒ~}||||}}}}}}}}|{{z{}€€ƒƒƒƒƒƒ‚€€€‚‚‚€€~{{zy{}~~~}}}zxurqprvz}~}|{|~€€€‚ƒ……„„„„ƒƒƒ‚‚‚„…ƒ€{xvxz~~~€ƒ…„€|€€}}|{|||}}}~~~€€€€€€€€€€€€€€~||{zzz||{{||||||}}}}}}}}}}~~~~||||||||}}}}}}}}}}||{{{{zzyxyx{~€‚„„ƒ„„„„„„„„}{||||||||}}~€‚‚ƒƒ|{{||{|}~€‚‚„„ƒ€~~}€€~~|zz{{zxxvw{€~zyz{|||}€€‚ƒƒ~}||||}}}}}}}}|{{yz}€€‚ƒƒƒƒƒ‚€€€~|yyxy{~~~}}|ywtqppsvz}~|{{}~€€€‚ƒ……„„„„ƒƒ‚‚‚ƒ„‚{xvx{~~~€ƒ…„€|€€~~}||{}}|}}}~~~€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€~||zyzz{{zz||||||}}}}}}}}}}~~||||||||}}}}}}}}}}||{{{{zzyxzx{€‚……ƒ„„„„„ƒƒ‚}{||||||||}}~€‚‚ƒ„|{{||z{|~€‚‚ƒ„ƒ}~}~~€}}{z||zxxvwz}}x{|}|z{}€€‚ƒƒ~}||||}}}}}}}}|{{yz}€‚ƒƒƒƒƒ€€€~}||yxwy{~~~}}{ywtqoprvz}~{z|}~€€€‚ƒ……„„„„ƒƒ‚€ƒ„{xvx|€~~~€ƒ…„€|~~}}|}|~~}~}~~~€€€€€€‚~}|{z{{{{{{{{{{||||}}~~~~}~~~€||||||||}}}}}}}}}}{{{{{{zzyyyz}€ƒ‚ƒ„„„„„ƒƒƒ}||||||}}|}|}}~€‚‚ƒƒƒ€}y{||z||}€‚ƒƒ„‚}~~~}z{~}}~~}|||{{ywwzyuy~{z{~ƒƒ~~}}}}}}}}}||zyzyyz}€‚ƒƒƒƒ‚‚‚}|{zwvwx|}~}~~}|xuspnpruy}|{|~€‚ƒ…………„‚‚‚‚‚ƒ‚}zwvy}€€~~‚†…~~~}}|}}~~~~~~~€€€€€€‚}|{{{{{{{{{{{||||||}}}}}}|~~~~||||||||}}}}}}}}||{{{{{{zzyyy{~€‚ƒ„ƒƒƒƒƒƒ‚‚€}||||||}}|||}}~€‚‚ƒƒ„€}{||||}}}€‚ƒƒ„‚}~~||wuw}|{|}~~€~}}€zuvvuy€{z{~ƒƒ~~}}}}}}}}}||zzyxxy|~‚ƒƒƒ‚‚‚‚‚€€|{zxwvwx|~~~~}{xuspnoquy~|{|~€€€‚ƒ……„„ƒ‚‚€‚‚‚€}zwwz~€€‚……~~~}}|}}~~~~~~~€€€€€€€€‚~}|{{{{{{{{{{{||||||}}||||{}~~~|||||||||}}}}}}}}||{{{{zzzzyyz|€‚ƒ„‚‚‚‚‚‚‚€}||||||}}|||}}~€‚‚ƒƒ„~}}||}~€€‚ƒ„‚}~~|ztsw}~}||}~€~„„‚|tsvvy~€{z{~ƒƒ~~}~~}}}}}}{{yyxxwx{}‚ƒƒƒ‚‚€€€€~{zywvvwz}~~|zwurpnnpuy}|{|~€‚ƒ……ƒƒ‚€€€€‚|zwx{€€‚„„~~~}}|}}~~~~~~€€€€€€€€‚~}|{{{{{{{{{{{}}||||}}||||{|}}}{||||||||}}}}}}}}{{{{{{yyzzyy{}‚‚ƒ‚‚‚‚‚‚€}||||||}}|||}}~€‚‚ƒƒ„‚}{||~€€€‚ƒ„‚}~~}ztuw~~~}}€€€ƒƒƒ‚}tswxz|~{z{~ƒƒ~~}~~}}}}}}zzzywwvwz}‚ƒƒ‚‚‚‚‚€€€€}{zywvvwz}€€€{zwtrpnnpuy{}|{|~€‚ƒ……ƒƒ‚€€‚{zwx{€€€€€‚„„~~~}~}~~~€€€€€€‚‚‚‚€~~}|{{{zz{{{{{{||}}}}}}}}}}|}||||||}}}}}}}}}}||||{{{{{{zzzzxz|}€€‚‚‚€€€€‚‚}||||||||}}}}}~€‚‚ƒƒ„ƒ€~||}~€€ƒƒƒ‚€}~~|{xx{}ƒ†„}~€€ƒ„„ƒ}vsuwz}}|z|‚‚‚}|}}}}~~}|zyyxwutvy}€‚ƒƒ€€~~|zxwvuuvy~€|zusqpnnpuz|}|{|~€€€‚„„ƒ€€€€€€}zwvy|€€€€„„~~~}~~~~€€€€‚‚‚‚€~~}|z{{zz{{{{{{||}}}}}}}}}}}}||||||}}}}}}}}}}||||{{{{{{zzzzxz|~€‚‚‚€€€€~|{||||||||}}}}}~€‚‚ƒƒ„ƒ€~}|}~€‚‚ƒ‚~~~||{{}~ƒ††€€‚ƒƒƒ‚~ysrvy|}{z|‚‚‚}|}}}}}}}{zxxxvusux}€‚ƒƒ€€€€€€}|{zxvvtuvy~€€€}yusqpnnpuz}}|{|~€€€‚„„ƒ€€€|yvvy|€€€€„„~~~}~~~€€€€€‚‚‚‚€~}|{z{{zz{{{{{{||||}}}}}}}}}}||||||}}}}}}}}}}||||{{{{{{zzzzxz|~€€€€€}{z|||||||{|}}}}~€‚‚ƒ‚ƒƒ€~}~€‚€€ƒƒ‚~~~}}{}}€ƒ…‚€€‚‚‚‚€}yspsw{|z{|‚‚‚€~}|}}}}}}|zyxwwutrtx}€‚‚‚€€€€€€€}|zywvusuvz€€€~|yutrpnnpuz}}|{|~€€€‚„„ƒ€€€€~zwuuy|€€€€„„~~}}}~~~€€€€€€‚‚‚‚‚‚€~}|{z{{zz{{{{{{||{{}}}}}}}}}}||||||}}}}}}}}}}||||{{{{{{zzzzxz|~‚€~€€€€}|{||||||||}}}}}~€‚‚ƒ‚‚ƒ€~}‚€€ƒƒ‚~~}}||}€‚‚€€‚‚‚‚‚€|xsopv{|z||‚‚‚~}|}}}}||{zxwwvusrsw|€‚€}|zxvutsuv{€€€€~|yuurpnnpuz}}|{|~€€€‚„„ƒ€€€~}yvuty|€€€€„„~~~~~€€€€€€€€€€‚‚€€€~}|{{{{{{{{{{z|||||}}||||}}}}}}}}}}~~~~~~}}}}|||z{{{{zzzyyyy{}‚~~~€€€}||{{||||||}}}}}~€‚‚ƒ‚~€‚‚ƒ€€€€‚„ƒ€~|||~}€ƒƒ‚€~{xtomu|}{{|€‚‚ƒƒ€}|||||||{yxwwvtsprv{~€‚‚€€}}}}~~}|zxvvusstw|~€€€|yvtsqompty}}||}€€€‚‚ƒƒ‚€€€€~~~~}{xusuy}€€„ƒ}~~~~€€€€€€€‚‚€€€~}|{{{{{{{{{{z|||}}}}||||}}}}}}}}}}~~~~~~}}}}|||z{{{{zzzyyyy}~€‚‚~}}~€€|||{{||||||}}}}}~€‚‚ƒ‚€€€‚‚ƒ€€€€‚„ƒ~|z{{|~~€‚‚ƒ„‚€|zwtnlt|}{{|€‚‚ƒƒ~|{|||||{zyxvvusropuz~€‚~}{{|}}}{yxvutsstw|~€€€€|yutsrompty}}||}€€€‚‚ƒƒ‚€€~~~~|yvssvz~€€„ƒ~~~€€€€€€€€‚‚€€€~}|{{{{{{{{{{z|||}}}}||||}}}}}}}}}}~~~~~~}}}}|||z{{{{zzzyyyz}‚€~}}~€€}{||{{||||||}}}}}~€‚‚ƒ‚€€€‚‚ƒ€€€‚„ƒ~{xy||~‚‚€‚‚„ƒ‚‚€}{ywuoks|}{{|€‚‚ƒƒ€}{z||||{{zywvtrppnouz}~~|zz{|}|zxxvtsrrtw}€€€€~|xttrqonpty}}||}€€€‚‚ƒƒ‚€€~~}}{xtrsv{~€€„‚~~~€€€~€€€€€€€€‚‚‚‚€€€~}|{{{{{{{{{{z|||}}}}||||}}}}}}}}}}~~~~~~}}}}|||z{{{{zzzyyyz~ƒ~}}~€‚€}{||{{||||||}}}}}~€‚ƒƒ‚€‚‚ƒ€€€‚„ƒ‚~{xz||~ƒ…„„„ƒƒ‚|yzwwqjq{|{{|€‚‚ƒƒ€}{z||||{{zywvsronlnsy}~€€~}}{yyz|||zwxvtsrrtw}€€€~|wtsrpnnqty}}||}€€€‚‚ƒƒ‚€€~~}}ywspsv{~€€„‚€€€€€€€€€€€€€‚‚‚‚‚‚‚€€€~}||{{zz{{{{{{||}}}}}}}}}}}}~~}}||~~~~~~}}}}||{{zzzzyyyxxz{€‚ƒƒ€}}~‚‚|{{{{{||||||}}}}~~€‚‚‚ƒ‚€€ƒ‚€€€‚ƒƒƒ‚€~|z{|}‚…‡‡…„ƒƒ€}{zyzxslqz|z{}€‚‚ƒƒ~{z{{|{{{zxwvsqnmlmry}~|zyxxz{}|yxwtrqpqsx}€€€€~|wtsrqonpty}}||~€€€‚‚ƒƒ€€€}|zxtpqrw}€€}}~€€‚}€€€€€€€€€€€€‚‚‚‚‚‚‚~}||{{||||{{||}}}}}}}}}}}}~~}}}}~~~~~~}}}}||{{zzzzyyyxxz|€‚ƒ„ƒ€}}€‚‚€|{{{{{||||||}}}}~~€‚‚‚ƒƒ‚€€ƒ‚€€€‚ƒƒƒ‚€~}|~}~€„…†……„„‚€|{zyxxunpy|z{}€‚‚ƒƒ~{z{{{{{zyxvtrplkjlqx}~~}zyxwwy{|{zywtrqpqtx~€€€~|vtsrqonpuz}}||~€€€‚‚ƒƒ€€€~}{yvsoprw}€€~}}~~€€}€€€€€€€€€€€€€€€‚‚‚‚‚‚ƒ„„……ƒ~}}}}~~~~}}||}}}}}}}}}}}}~~}}}}~~~~~~}}}}||{{zzzzyyyxy{~‚ƒƒ‚€€‚‚|{{{||||||||}}}}~~€‚ƒƒ‚ƒ‚€€€‚ƒƒ‚€~~}}}~„„……„……‚~|zyyxxvpnw{z{}€‚‚ƒƒ~{z{{{{{zyxutqnkjikpv|~}zxwvvvx{||zywtrqpqux~€€€~|vtsrrpnpv{}}||~€€€‚‚ƒƒ€€€}|zxtqnorw}€€}||}~€€}€€€€€€€€€€€€€€‚‚‚‚‚‚€ƒ……‡‡„ƒ~~}~~€€€€~~||}}}}}}}}}}}}~~}}~~~~~~~~}}}}||{{zzzzyyyxy|~ƒƒƒƒ€‚‚‚}{{{}}||||||}}}}~~~€€‚„„ƒ‚ƒ‚€€€€ƒƒ‚€~~~~~~‚ƒ„ƒ„„ƒ~{zzyxvtqov{z{}€‚‚ƒƒ~{z{{{{zzyxtspmjiginu|~|zyvutuxz}|yywtrqpquz‚€~|vtsrrpnpv{}}||~€€€‚‚ƒƒ€€€}|yxsomnrw}€€}||}~€€~}€€€€€€€€€€€€‚‚€‚„‡ˆˆŠŠ‡†‚€~‚‚……„€}}|||}}}}}}}~~}}~~~~~~~~~~~|||||{{zzzzyyyxz}€‚ƒ„„‚‚€ƒ‚}|{{{||||||||}}}}}}€€€€„„ƒ‚‚‚‚„ƒ‚}~€€‚‚ƒ~~€‚‚„„ƒ~{{zzyxwvpnuyy|}‚‚‚‚€}{z{{yyzxxvtqomkifiov|~{xwtsstxz{zzyvtrqpqty€€€€€zvtssrqpqw||||}~‚ƒ‚€€€€€€~|zxvrokntx~€€}z|}€€€~€€€€€€€€€€€€‚‚€‚„…ˆ‰‰ŠŠ‰ˆ„€‚„…†ˆˆ†„ƒ€~}||}}}}}}}~~}}~~~~~~~~~~~|||||{{zzzzyyyz|‚„„……ƒ‚€‚}|{{{||||||||}}}}}}~€€„„ƒƒ‚‚‚ƒƒ‚}|}€‚‚‚ƒ‚~~€‚‚ƒƒ‚€}{{zzyxwwrouyz{}‚‚‚‚€}{z{{yyzxxvtqoljhfiov|~{xvtstuxz{zyxvtrqpqtz€€€€€zwuttsqrsx||||}~‚ƒ‚€€€€€€~|zxurokouz~€€}y{}€€€€~€€€€€€‚‚€ƒ„…ˆ‰‰‰‰‰ˆ†„‚„†‡ˆŠ‰‡†…‚~~}}}}}}}}~~}}~~~~~~~~~~~|||||{{yyyyyyy{~‚„„……ƒ‚€‚€€|{{{{||||||||}}}}}}}~€‚‚ƒƒƒƒ‚‚‚ƒ‚}|}€‚‚‚ƒƒ~}‚‚ƒƒ‚~|{{zzyxwwvruyy}~‚‚‚‚€}{z{{{{{zxvuroljgfiov|~{xvtutuxz{zyxvtrqpqu{€€€€€zwutusrstx||||}~‚ƒ‚€€€€€~|zwtqnkou{€€€{y{}€€€€~‚‚€€€€‚‚€€€€‚‚€ƒ…ˆ‰‰‰‰ˆ‡ˆ…ƒ†ˆˆ‹Š‰ˆˆ†ƒ‚~~~|}}}}}}~~}}~~~~~~~~~~~|||||{{yyxxzyy{€ƒƒ…………ƒ‚€€||{{{||||||||}}}}}}}~€‚‚‚‚ƒƒ‚‚ƒƒ‚}~€‚‚‚ƒƒ~~€€‚‚‚‚‚~|{{zzyxwwvsuxy|~‚‚‚‚€}{z{{{{{zxwuroliffiov|~{ywuvuvxz{zyxwurqpqu{€€€€€{xvuutrtvx||||}~‚ƒ‚€€€€€~|zwtpnkov}€€€yy|~€€€€~€€€€€€€€€€€€€€„‡ˆ‡ˆˆˆˆ‡†…†ˆ‡‰‰‡‡ˆˆ‡„~}}}}}}}~~~~~~~~}}~~~~}}||{{zzyyxyyz|„„………„„‚€€}{{{{{||||||||}}}}}}~€‚‚‚‚ƒƒƒƒƒƒ‚€}|~€€‚ƒƒƒ€~€€‚‚‚‚‚|{zzyxxwwwwtsxz|€€‚‚€}{z{{{{zzywurolifeflu|~€|yxuvvwxz{zyxwurqrsw|€€€€€zxvvvstuvy}{{{|€€€‚ƒ‚€€€€€}yvqolkov}€€€€€}zx{~€€€€€€~}€€€€€€€€€€€€ƒ††…‡‡‡‡‡‡††‡‡ˆˆ‡‡‡‡‡…ƒ€~}}}}}}~~~~~~~~~~~~~~}}||{{zzyyxzy|ƒ…………†„ƒ‚‚~|zz{{{||||||||}}}}}}~€‚‚‚‚ƒƒƒƒƒƒ‚€~||~€€‚ƒƒ‚€€€‚‚‚‚‚‚‚‚€~|zzzyxxwwwwssx{}€€‚‚€}{z{{{{zzywurolifeflu|~|yyuwwxz{}}|{ywutsty~€€€€€€{xwwvtvuvz|{{{|€€€‚ƒ‚€€€€€€}yvqnkkqw}€€€€€}yw{~€€€€€€~}€€€€€€€€€€€€ƒ„‚ƒƒ„…††……†…††………†ˆ‡…€~}}}}}}~~~~~~~~~~~~~~}}||{{zzyyxz{~ƒ…†…†††„‚‚‚~{z{|||||||||||}}}}}}~€‚‚‚‚ƒƒƒƒƒƒ‚~{{~€€‚ƒƒƒ‚€€‚ƒ‚‚‚‚‚‚|{zzzyxxwwwwssy{|~€€‚‚€}{z{{{{zzywurolifeflu|~~}{zwxyz|}~}{zxwwx{~€€€€€}zxxwvutvy{{{{|€€€‚ƒ‚€€€€€}yvqnkkrx~€€€€}xwz~€€€€€€~}€€‚‚€€€€€€€€€€€€ƒ………„…ƒƒƒƒƒƒ…‡‰†‚€~}}}}}}~~~~~~~~~~~~}}||{{zzyyxy|€‚………‡‡††ƒ‚‚€~|{yz{}}||||||||}}}}}}~€‚‚‚‚ƒƒƒƒƒ‚~{{~€‚‚‚ƒƒƒ€€ƒ‚‚‚‚‚‚‚~{{zzzyxxwwwwtsw|}~€€‚‚€}{z{{{{zzywurolhfeflu|~~~|zxxz{~}|{yyz}€€€€€‚{yxxvusuy{{{{|€€€‚ƒƒ€€€€}yvqmjjrz€€€€}ww{~€€€€€€~}‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€~}}}‚„…ƒ‚}}ƒ†‡‡…‚~~}}}}}}~~~~~~~~~~}}|{{{zzyyz|€ƒ††…………††‚ƒ€€€€~||{z{{{{{{{{{{||}}||}}|}€ƒƒƒƒƒƒ‚€}||}€‚‚‚‚ƒƒ‚‚‚„ƒ„‚ƒ‚‚€|{zzzyyxxvxwtrvz~€ƒƒ|{yz{||{zyxusoligfglu|~~~}{{{}‚€}|}}€€€€}zxywutvz||||}~€€‚ƒ‚€€€€€}yupljksz~€€€{wuz~€€€€€€~‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€~|}}~€‚ƒ€}zxx{{}„‡‡‡ƒ€~~~~~~~~~~~~~~~~}}|{{{zzy{|~„‡††………„„‚‚€€€€}{{{{{{zz{{{{{{||}}|||||}€ƒƒƒƒƒ‚€}||}€‚‚‚‚ƒƒ‚ƒ„†……ƒƒ‚‚€|{zzzyyxwwxwurtz}€‚‚|{yz{||{zyxutpmjgghlu|~~~}}}}‚ƒ„„ƒƒ€€~~~€€€€€|zywutvz|||}~~€€‚ƒ‚€€€}yupkjmt{~€€~zwvz~€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~|}}~€}ywxxyy|€‚†……ƒ€€~~~~~~~~}}|{{{zzz|}„†…†………ƒƒ}zzz{{{{zz{{{{{{||}}|||||}€ƒƒƒƒƒ‚~}{{|€‚‚‚‚ƒƒ‚„…†……ƒƒ‚‚ƒ€}{zzzyyxwxxxtqry|€|{yz{||{zyxutqnjhgimu|~~~~}~~€ƒƒƒƒƒ‚‚€€€€€€€€}zxvuwz|||}~~€€‚ƒ‚€€€€~}yupllou|€€}yvvz~€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~|}}}~€€|xvxxyy{~………ƒ‚€€€€€€€€€~~~~~~~~}}|{{{zz{|~€‚††……………‚‚€€€€€~{yzz{{{{zzzzzzzz||}}||{{|}€ƒƒƒƒƒ‚~||{|€‚‚‚‚ƒ„„……‡†…ƒƒ‚‚ƒ‚€}{zzzyyxwwyxsnrx|€|{yz{||{zyxutqnlihimu{~}}}~€‚„…„„ƒ‚€€€€€€€€€€€|xvvxz|||}~~€€‚ƒ‚€~€~~}yupklpv}€€€€€}yuwz~€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~~~~~~}}||}}~{xxxyy{{|~€ƒƒ„…„ƒ‚‚€€€€€€~~~~~~}}|{{{zzz}‚„…„„………„‚€€|zxxxzz{{zz{{{{{{||}}||{{{|}€€‚‚‚ƒƒ€~}||{|€‚‚ƒƒƒ…„……†††„ƒƒƒ‚‚€}|{zzyyxxxyvsnpw|€€€|{zzz}}|{zyvtrokhhinv|~}}~€‚„ƒƒƒƒ~€€€~~~€€}ywuwy|||}}€€€ƒ„}~{wtojkpw}€€€}yux{€€€€€€~‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~~~~~~}}||}|}}yxxzzz{{|}}ƒƒ……„†„‚‚‚‚‚€~~~~~~}}|{{{zz{}ƒ……„……„„ƒ€€~}zyxxxzz{{zz{{{{{{{{{{{{{{{||€€‚‚‚‚‚€~}|{{|€‚‚ƒƒƒ………„††…‚‚‚‚‚‚€}|{zzyywxxzzuoqw|€€}|z{{}}}|{yxtspliijnv{~~~}~ƒ‚‚~~}|~}€€€~~~~‚€zwuwy|||}}€ƒ„}~}{wsnjkqy}€€}yux{€€€€€€~‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~~~~~~}}||||{{xxy{{{||}}~€‚ƒ„…„††……………„€~~~~~~~~}}|{{{zz{~‚„„„„…„ƒ‚~~|}|zxwyzzzzzzzz{{{{zz{{zzzz{{{|}€€€‚‚‚‚‚€}|{{z{~‚‚ƒƒƒ„…††††„‚‚‚€}|{zzyywwx{}xsrw|€ƒƒ€}}{||}}|~}|yvspnkjjnv{}~}~€‚€}{zyzz{|€€€~}}|~€‚‚€{wuwy|||}}~~€ƒ„|~~~~~}{wrmkmtz~€€}yux{€€€€€€~‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~~~~~~}}||}|{zyyy{{{||}|~€‚‚ƒ„†…††‡†††…}}~~~~~~}}|{{{zz|‚…„„„…„ƒ‚}}|zzzywyzzzzyyzz{{{{zzzz{{zz{{z{}€€‚‚‚€}|{{zz}~‚‚ƒƒƒ„…‡‡ˆ…ƒ€€‚‚€}|{zzyywxxz|zusw|€‚‚~}|||}}|~zxtqoljlpw|~~~~}~€€~~}ywvuvwx{€€€~||{}‚„}wuwy|||}}~~€ƒ„|}~~~~~}{wrmkmu{~€€}yux{€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€€€€€~~~~}}}}}}}|~~}}|{z{z{{{}}}}~~€€‚ƒ„ƒ†‡ˆˆˆ‰ˆ„€}~~~~~~}}||{{{{{{}ƒ„„„…†„€~|zzyywwwyzzzzzz{{{{{zyzzyzzzz{{z{~€‚‚€~}}{{{{|~€‚‚ƒ„„…††…‚€€€€~~{zyyxxwwxx{{utx|}‚‚~}|||}~€€{yurommmry}~~~€€|{ywvtrrsuy~€€€~}|||}‚„ƒ}wvxz|||~~~~~€‚ƒ‚}~}{urmjmv|~€~|xux|€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€€€€€~~~~}}}}}}}|}}||||||||||}}}}~~~~€‚„…†ˆ‰‰Šˆ…€~~~~~~~}}||{{{{{|}€„„„„……‚€}{zywwwwwwwyzzzzzz{{{{zzyzzxyyzz{{z{}€‚‚€~}|{{{{|~€‚‚ƒ„„…†…„€€|}}{yyyxxwwwwyzvux{}‚‚~}|||}~€‚‚‚{wsqpootz~€}zywutsqpqty~€€€~{zz|€ƒ„€zwxz|||~~~~~‚ƒ‚€~~}zuqmknw~€~€|wux|€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€~~~~}}}}}}}|}}||}}{{{{||}}}}}}}~~€‚ƒ…‡ˆˆ‰ˆ†~}}~~~~}}||{{{{{|~‚‚„„„‚|zxwvwwwwwwwyzzzzzz{{{{yyyy{yyyzz{{z{|~€‚‚‚~}|{{{{{}€‚‚‚ƒ„…†…ƒ€}{}}{yyyxxwwvvwwwvwz}‚‚‚‚~}|||}ƒ„„}xusqrsw{~~zyxwvusqpqty~€€€€~{vxz~ƒƒ‚|xyz|||~~~~~~~‚‚~~~}yupnlpx~€~€|wux|€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€~~~~~~~~}}}}}}}|||{{||||||}}}}}}|||}|}~€ƒ…††‡‡†}}~~~~}}||{{{{{|~‚‚„„ƒ€{zyxwvwwwwwwwyzzzzzzzz{{xxxy{zyyzz{{z{|}€€‚‚~||{{{{z|€‚‚ƒ„……„~~zy}~{zyyxxwwvuvvwvvz}ƒƒ‚‚~}|||}ƒ„ƒ~xvvuuvy|€€€~yxxwuusqpquz~€€€€€~zvvx}‚‚‚|xyz|||~~~~}}~€‚‚€~~~}xtponqy~€~€|wux|€€€€€€~ƒƒƒƒ‚‚‚‚‚‚€€€€€€€€~~~~}}||||||||||||||||||||||||||}|{{}~€ƒƒƒ„………ƒ€}}~~~}}}||{{zz{}~‚ƒ„ƒƒ{xwvwwvvxxwxxyzzzzzzzy{{yyyzzzyyyyyz{{|}€‚‚‚€~}{||zz{|‚„„ƒ~~~~}v{~|zyyxxxwvuuvxwvy}‚‚‚‚~}||}~ƒ…„ƒ{yxxzz{~€€€€~yxxwuutrqruz~€€€ƒ}yutw{€ƒ‚}zyz{{{|}}}~~~€‚‚~~|yuqoosz~€€€|wux|€€€€€}ƒƒƒƒ‚‚‚‚‚‚€€€€€€€~~~~}}||||||||||||||||||||||||||}|{{{|~‚‚ƒ„„€}}~~~}}}||{{zz{}‚ƒƒ„ƒ‚~zwvvwwvvwwwxyyzzzzzzzyzzyyzyyyxxyyyz{{|}€€‚‚€~|{||{{||‚ƒƒ‚€~}}}zw||zyyxxxwwvvvyvvy}‚‚‚‚~}||}~~€ƒ……ƒ€|{zz|||€€€~€€~yxxwuutsstv{~€€€‚~yusvz‚ƒ~{yz{{{|}}}~}~€‚‚€€}yuqnot|€€|vux|€€€€€€€}ƒƒƒƒ‚‚‚‚‚‚€€€€€€€~~~~}}||||||||||||||||||||||||||}}|{||}€€ƒ„€||~~~}}}||{{zz{}‚ƒƒƒ‚€|ywvvvvvvxxwxyyzzzzzzzyyyyyyyyyxxyyyz{{|}~€‚‚‚€~|{||{{||‚ƒ‚€||}{xx‚}{yyxxxwxyxvvtvy}‚‚‚‚~}|{||}€„ƒ‚€~}}|~~€€€~€~zyxwuutsstw{€€€€{usty~ƒ|zz{{{|}}}~}|}€~yuqnou|€€|vux|€€€€€€€}ƒƒƒƒ‚‚‚‚‚‚€€€€€€€~~~~}}||||||||||||||||||||||||||}}|||}}~~~„„€{{~~~}}}||{{zz{}ƒƒƒƒ{xvvwwwxxxxwxyyzzzzzzzyyyyyyyyyxxyyyz{{|}~€€‚‚€}|{||||||‚‚{{}{yzƒ€}{yyxxxwxzyvttvy}‚‚‚‚~}|{||}€~}~€€€~€‚~|zxxvvusttw|€€€€‚‚}wttx|€ƒ}{z{{{|}}}~}{|~€€€€~|ytomou}€€zuuw|€€€€€}„„„„‚‚‚‚‚‚€€€€€€}}}}||||||||||}}}}||||||||||}}}}~~}}{}~}|{}ƒ…„~yz}~}}}}{zzz{z|ƒƒ„ƒ~zxwwwwwwwxxxxyyzzzzzzzzzzyyxxyyxxyyyyzz|}€€‚‚‚~|{|||}|}€€‚‚‚€}|z|{x{ƒ€}{yxxxwxz~zussvz}‚‚ƒƒ€}|zzz||~€€€€€€€€€€~~€€ƒ€~{yxxwvvsuuy~€€€€‚€}yutw|€‚~z{{{{z{}}~~}{y{~~|xtpnpv}~~xttz}€€€€€~|„„„„‚‚‚‚‚‚€€€€€€€}}}}||||||||||}}}}||||||||||~~~~~~}}|~~}|{|€„†‚|yz}~}}}}|{zz{|~€ƒ„„„ƒ€}zwwwwwwwwxxyxyyzzzzzzzzzzyyxxyyxxyyyyzz}~€€‚‚‚‚€~|{|||~}~€€‚‚‚€}|z|{x{ƒ€}{yxxxwx|€zuttv{}‚‚ƒƒ€}|zzz||}~€€€€€€€€€~~€€ƒ~{yxxxvwuvv{~€€€€‚€}yutw{‚€~{{{{{z{}}}~}{xy|~|xtpoqw}~}xstz}€€€€€~|„„„„‚‚‚‚‚‚€€€€}||||||||||||||||}}}}}||||}}~~~~~~~~~~}|~‚†‡‚|yz}~}}}}|{zz{}€‚„„„„ƒ€|yxwwwwwwwxxyxyyzzzzzzzzyyyyxxyyxxyyyy{{}~€‚‚ƒƒ€|{|}}~~€€}|z|{x{ƒ€}{yxxxwy}€zuttv{}‚‚ƒƒ€}|zz{|||~€€€€€~€€ƒ|yxxxvwwxw{~€€€€‚€}zvtw{~€€|{{{{z{}}}~~{wvy||wtporx~~~|wrtz}€€€€€~|„„„„‚‚‚‚‚‚€€€€€||||||||||||||{{{|}}}}{{||~~~~~~~~~~~}„ˆ‡„}yz}~}}}}|{z{{~‚…„„ƒƒ‚€|ywvwwwwwwxxyxyyzzzzzzzzzyyyxxyyxxyyyy||~€‚‚‚ƒƒ€}{|}}~€€€€€}|z|{x{ƒ€}{yxxxwy~€yutrv{}‚‚ƒƒ€}|zz{|||}€‚‚€€€€~~~€€ƒ|zyyywwxwx|€€€€€€}zvuwz~€~||{{{z{}}}~}wvy}|wtppsy~~~|vrtz}€€€€€~|ƒƒ„„‚‚‚‚€~}}||{{|||||||||||}~~~||||{||}}}}~~~~~~€…ˆˆƒ~z{}~}}}||{||}ƒ„……ƒƒ‚|wwwwwwwwwxxyxzz{{{{{{zyzyyyxxxxxxyyyyz|~€€€ƒƒƒƒ}|}|}€€€€€€‚€~|z{zv}‚ƒ€}{yxxxxz}ytrrtz}€€ƒƒ~|zzz{{|}€ƒƒ‚‚‚€€~€€ƒ|zyyyxxwxy}€€€€€€}{wuvz}€}|{{{z{}}}}xvx{}}~~~{vsopty~€€{uruz}€€€€€~{ƒƒƒƒ‚‚‚‚€~~}||||{{||||||||||}}}}}}{||}}}}~~~~~~…ˆˆƒ~{{}~}}}|||}}€ƒ…„„ƒ„„‚{wwwwwwwwwxxyxzz{{{{{{zyzzyyxxxxxxyyyy{|~€€ƒƒƒƒ‚}|~}‚€€€‚‚‚|{zyw~‚ƒ€}{yxxxy{~}xtsrtz~€€‚‚|zzz{{|}€ƒƒƒ‚€€€~€€ƒ‚|{yyzyxxx{~€€}{xvwx{~~}|{{{{|}}}€}yvx{}}~~~{wsppuz~~{uruz}€€€€€}zƒƒƒƒ‚‚‚‚€~~~||||{{{||||||||||~€€€~}}~|||}}}}~~~~~~~~„‡‡…{{}~}}}||}~€ƒ„…„…„ƒƒ~zxwwwwwwwwxxyxzz{{{{{{zyzzyyxxxxxxyyyy|}~€ƒƒƒƒ‚€~|~€ƒ„„ƒ‚‚€||yxx~‚ƒ€}{yxxxy|~|wuurtz~€€‚‚}{{{{{|}€ƒƒƒ‚€€€€€€€~€€ƒ€}|{{{zyxy{€€€€}{xwwx{|{}||{{{|}}}}€~zwx{}}~~~{wsppuz~~~~zuruz}€€€€€{xƒƒ‚‚‚‚‚‚€}|{{{{{{||||||||||}~€~}||}}}}~~~~~~~~ƒ‡‡…{{}~}}}|}}~‚„†……„„ƒƒ}yywwwwwwwwxxyxzz{{{{{{zzzzyyxxxxxxyyyy|}~‚ƒƒƒƒ‚€~}€ƒ……ƒ‚‚‚‚‚€||yxx~‚ƒ€}{yxxxy|}vutqtz~€€~{{|{{|}€ƒƒƒ‚€€€€€~€€ƒ€}|{{{zxyy{€€‚}{xwwy{{{||{||{z{}}}€{xy{}}~~~{vrqqw|~~~}zuruz}€€€€€{wƒƒ‚‚‚€€€~~~~~~}}{{{{{{||}}}}}}}}||€~}|||~~~~~~~~~~~~~ƒ†ˆ…|z|}~}|}}~…†‡†…„…‚|yxxxwwwwxxxxyyzz{{{{{{zzzzyyyyyyyyyyyz|~€‚‚‚‚‚€~€ƒ„††‚€€€|{xvv}‚„€}{zyyyyz~~xutqtz~€€‚€~}}}|z{|‚ƒƒ‚€~~~€€~~€‚{z{{{zyyz|€‚‚~|{yxxyyz{{{{{||{|{}~€€~{wy{}~~€€~{vsqrx|}~}}~~|yssu{~€€€€€€}zuƒƒ‚‚‚‚€€~~~~~~~~~~}}||||||}}}}}}}}}}||~€€€~}|||~~~~~~~~~~~~~ƒ†ˆ†‚~|}~}|}~€‚†‡‡‡†„„‚€|zxwxxwwwwxxxxyyzz{{{{{{zzzzyyyyxxxxyxyz|~‚‚‚‚‚€€„…††ƒ‚€€€‚||yvv}‚„€}{zzyyxx||wvrtz~€€‚‚~~|{{|~ƒ„ƒ‚}|~€€~~€‚|{{{{zyyz}€~}{zzzyy{z{{{{||||{}~€€~|wy{~~~€€~{vsqsx|}~}}~~|yssv|€€€€€}zuƒƒ‚‚‚‚€€~~~~~~~~~~}}}}||||||}}}}}}}}||}~~~~}|||~~~~~~~~~~~~~ƒ†‡‡ƒ€~~€}}~„†‡ˆ‡†…ƒ‚{ywvwwwwwwxxxyyyzz{{{{{{zzzzyyyywwwwyyy{|‚‚‚‚‚‚€€ƒ††††„‚€€‚‚€}|yvv|ƒ}{zzyyxxx|~zxsuz~€€ƒ‚€€}|{|~‚ƒƒ~z|~€€~~€‚}{{{{zyyz}€€€}{{{{{{{yy{{{||||{}~€€~|yz|~~€€~{wsqsx|}~~~~~}ytsw|€€€€€€}yvƒƒ‚‚‚€€~~~~~~}}}}}}}}}}}}||}}}}}}}}|||}~~~~~}|||~~~~~~~~~~~~~ƒ…‡ˆ…~~€}}€‚‡ˆˆˆ‡†…ƒ~zxwwvvwwwwxxxyyyzz{{{{{{zzzzyyyyxxxxyyz{~€‚‚‚‚‚‚€€‚„‡‡†…„ƒ€€~€€}}yvv|‚}{zzyyxwvy~|xtv|~€€‚‚‚‚‚€}|{|~‚€{z|~€€~~€‚}{{{{zyyz}€€€€€€}{||{|||zz{{{{{||{}~€€~|{{|~~€€~{wsqsx|}~~~}ytsx~~€€€€€|ywƒƒ‚‚‚‚‚€€€€€~~~~~~~~~}}}{||}}}}}}}}}}||||||}}}}||}}}}}}~~~~~~~~‚…†‡…}~~~€ƒ†‡ˆˆ‡‡…‚{xwwvvvwwxxxxyzy{zz{{{{{{zzzzyyxxyyyyyy{}€‚‚‚‚‚‚‚„…†……ƒ„€€~~€‚‚€}}vu{‚}{zzzzzyvw}}xtu{~€€‚‚„ƒƒƒ‚‚~}||}€‚}|{{€€~€‚‚€}{{{{zyy{}€€€€€€€}|{|}}~}{zz{{{zz{{z|~€€||||}}~~~{wsruy}}~~~}xttw|€€€€{xwƒƒ‚‚‚‚€€€€€~~~~~~~~~}}}{||}}}}}}}}}}||||||}}}}}}}}}}}}~~~~~~~~‚„…†…~~~~~„‡‡ˆ‰‡…ƒ|xxwwvvvwwxxxxzz{{{{{{{{{{zzzzyyxxyyyyyz|~‚‚‚‚‚‚‚„„…„…„‚‚€€~~‚‚€€wuz€‚}{zzzz||~€€~xsu{~€€‚‚„„„ƒƒ‚€}||~}{{{{€€~€‚‚€}{{{{zyy{}€€€€€€}|{|}~~}{yz{{{zz{{z|~€€||||}~~~~{wsrvy}}~~~}xttw|€€€€|xwƒƒ‚‚‚‚€€€€~~~~~~~~~}}}{||}}}}}}}}}}||||||}}}}}}}}}}}}~~~~~~~~€ƒ…††‚}}}}~‚…†‡ˆˆ†ƒ€~zwxxvvvvwwxxyyzz{{{{{{{{{{zzzzyyyyyyyyy{|~€‚‚‚‚‚‚‚‚ƒ……†……ƒ‚€€~}€€zvy‚}{zzzz|‚ƒ~ysu{~€€‚‚„…„„„‚~||~~|z{|~€€~€‚‚€}{{{{zyy|}€€€€€€}|{|}~~}{xzz{{zz{{z|~€€||||}~~€€~{wsrwz~}~~~}xttx|€€€€€|yxƒƒ‚‚‚€€€€~~~~~~~~~~}}}{||}}}}}}}}}}||||||}}}}~~}}}}}}~~~~~~~~€‚„††‚}}}}~„†‡‡‡†‚~{xwwwuvvvwwxxyyz{{{||{{{{{{zzzzyyyyyyyy{{}€€‚‚‚‚‚‚‚ƒ„†…†‡…€~}}€€€yu{€‚}{zzzz{}xru{~€€‚„…„ƒ…„||~~|z{|€€~€‚‚€}{{{{zyy|}€€€€€€}z{|}~~}{xyz{{zz{{z|~€€||||}~~~{wssw{~}~~~}xutx|€€€€€€|zx„„‚€~~~~~~~~}}~~}|||}}}}}}}}}}||||}}}}}}}}~~}}~~~~~~~~}~~~~€‚…‡„}~~~€‚„††††„|yxwwwvwwwwwxxyyzz{{{{{{{{{{zzzzzzzzyyyy|~‚‚‚€‚‚‚ƒ„†…†…„€€~~€|{yz~€}|{zzzxyyx|{vrv{€€€€€€‚……„„„‚€}}€}{{|€€€€€€‚‚€~|}}{yyz{~€€€€€~{z|}~~~}{xyz{{zz{{z|~€{{|}}|~~|wstx{}~||||wuty}€€€€~}}ƒƒ‚€€~~~~~~~~~~~~}}~~}|||}}}}}}}}}}||||}}}}}}}}~~}}~~~~~~~~~~}~~~~€‚„††ƒ~€ƒ„†††…‚{xwvwwwwwwwwxxyyzz{{{{{{{{{{zzzzzzzzyyz|}€‚‚‚‚€‚‚ƒƒ„……†…ƒ€€€€~€ƒ‚€~}||€}|{zzzxxwyyxsrv{~€€€€€‚„„ƒƒƒ€}}€€}{{|€€€€€€€‚‚€}{||{yyz{~€€€€€~{|}}~~~}{xyz{{zz{{z|~€}{{|}~|~~€}xttx|}~||||wuty~€€€€ƒƒ‚€€~~~~}}~~}|||}}}}}}}}}}}}}}}}}}}}}}~~}}~~}}~~~~~~}~~~~ƒ…†ƒ€€€„…††…ƒ|zxwvwwwwwwwwxxyyzz{{{{{{{{{{zzzzzzzzy{{~~€‚‚‚‚‚‚‚€€‚‚ƒƒƒ„…†…ƒ€€€€€€‚‚‚ƒƒ‚€~}~€€}|{zzz{{|}zxssv{}~€€€€€‚„„ƒƒƒ€}}€€}{{|€€€€€€€‚‚€}{{{{zyz{~€€€€€~}}~~~~~}{xyz{{zz{{z|~€}{{|}~|~~€}wttx|}~||||wuuy~€€€€€‚‚‚€€€€€~~~~}}~~}|||}}}}~~~~}}~~~~}}}}}}}}~~}}~~}}}}~~~~}~~~~~€ƒ……‚€‚ƒƒ…††„~|ywvvwwwwwwwwxxyyzz{{{{{{{{{{zzzzzzzzz|}~€‚ƒ‚‚‚‚‚€€€‚‚ƒƒƒ„„†…ƒ€€‚„‚‚‚‚‚‚~}€}|{zzz{{|}{xuvv{}~€€€€€‚ƒƒ‚‚‚€€}}€€}{{}~€€€€€€€‚‚€|z{{{zyz{~€€€€€~}}~~~}{xyz{{zz{{z|~€€~{{|}~}~~€}wtty|}~||||wuuz~€€€€€€€‚‚‚€€€€€~€€~~}}}}||~~~~~~~~}}~~}}}}}}}}}}~~}}}}~~~~~~~~~ƒ…†…ƒ‚‚ƒƒ„……‡‡„|yxuvvvvwwwwwwxxyyzz{{||{{{{{{{{{{zzz{{}€ƒƒƒƒ‚‚‚€‚ƒƒƒ„„„ƒ€€~€€‚„‚‚€~€~}|{{{zy|}|xvuw{~€€€€€€‚‚‚‚€€€~}||{{}~€€€€€‚ƒƒ}{{{zzyz|~€€€€€€~~~~}yxxy{{{{zz{|€~{{|~~}}‚‚€|wtvz|~}}}}~|wtv{€€€€€€‚‚‚€€€€€~€‚ƒ€€€€€€€~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}~~}}}}~~~~~~~~‚„††…ƒ„„…†‡…††ƒ}yxvvvvvwwwwwwxxyyzz{{||{{{{||{{{{zzz}}‚‚ƒƒƒƒ‚‚€~~€‚‚‚‚ƒ„„‚€€~~€‚‚€‚€~|{{{yxyz{vtuy|~€€€€€€€€}||~|{{}~€€€ƒ‚€}|{{zzy{}~€€€€€€~}|yxxyzz{{{{||~€}{{|~~}}‚‚|wtuy|~}}}}~|wtv{€€€€€€‚‚‚€€€€€~€€……ƒ‚€€}}~~~~~~~~~~~~}}}}}}}}}}}}~~}}}}~~~~~~~~ƒ††…„„…‡†ˆ†……‚€~zwwvvvvwwwwwwxxyyzz{{||||||~~}}}}}}|~‚‚‚‚‚ƒƒƒ‚‚~~€€‚ƒƒ‚€~~€€€€~€€|{{{yyzz{usu{~~€€€€€€€€}{{}}{{{}~€€€€‚‚€}||{zzy{}~€€€€€€€€€€€~~|{yxxyzz{{||||~€}{{|~~}}€‚‚|vtuz|~}}}}~|xuv{€€€€€€‚‚‚€€€€€~€‚‡ˆ…„ƒƒƒƒ€€€€}}~~~~~~~~~~~~}}}}}}}}}}}}~~}}}}~~~~~~~~ƒ††……††ˆˆˆ‡……‚|yvvvvvvwwwwwwxxyyzz{{||}}}}}}~€€‚ƒƒ‚ƒƒ„ƒƒ‚‚€~}}€‚ƒ‚‚‚‚‚€}~~€€€€€€~{{{{{yyz{vuxz}~€€€€€€€€€€€€|zz}}z{|~~~€€€€}|||zzy{}~€€€€€€€€}}|{yxxyyy{{||||~~|{{|~~}}€‚‚|vtuz|~}}}}~}xuxz€€€€€€‚€€€€€€€€„ˆ‰‡†„„‚‚‚‚€€€€~~~~~~~~~~~~}}}}}}}}}}||}}}~~|~~~~~~~~~~~~~€ƒ††††‡ˆˆˆ‡†„‚€}zwuuuuuvvvwwxyyyyy{{{{}}}}~~}~€€ƒƒƒƒ„„„„ƒ‚~}{}€‚‚‚‚‚‚€€~~~~€€€€€€€~~~{z{zzyy{vvz{}~€€€€€€€€}zzy}~~}{{}~€€€€€}|{{zz{|~€€€€€€€~||{zyyyyz{|||{|€}|||~~}}€ƒƒ{wuuz}}}}~}€~yvx{~~~~€€‚}€€€€€€€€„ˆ‰Šˆ‡‡††……ƒƒ€~~~~~~~~~~}}}}}}}}}}||}}}~~|~~~~~~~~~~~~€ƒ††††‡ˆˆˆ‡†„‚{xuuuuuuvvwy{zzzyyy{}{}€‚‚‚ƒƒƒƒƒƒƒ„„……„„„„„„ƒ‚}|}€‚‚‚‚‚€‚‚€~~~~€€€€€€€€~~€‚}z{{{yyzww{{}~€€€€‚ƒ‚}zyy}~}{z}~€€€€€}|{{zz{|~€€€€€€ƒƒ‚~|{z{yyyyz{|||{|€}|||~~}}€ƒƒ{vuv{}}}}~~€~ywy|~~~~€ƒ}€€€€€€€€„ˆ‰ˆ‡ˆˆˆˆ‡‡……‚~}~~~~~~~~~}}}}}}}}}}||}}|}}~~~~~~~~~~~~~~~€€€ƒ††††‡ˆˆˆ‡†„‚yvtttttuvvy}~}|zzz|~~€€‚‚ƒ„„…†‡‡‡‡‡‡‡‡‡‡‡‡…………„‚€~|}~€€€‚‚‚‚‚~~‚‚€~~~€€€€€€~ƒ}{{{{yzxy||}~€€€ƒ„‚~{zy~€~|zz}~€€€€€}|{{zzz|~€€€€€‚‚‚ƒƒ‚~{{z{yyyyz{|||{|€€~|||~~}}€ƒƒ{utx|}}}}~~€~yxy|~~~~~€‚ƒ‚|€€€€€€€€„†‡‡†ˆˆˆˆ‰ˆ††„€}}~~~~~~~~}}}}~~~~}}||}}{}|~~~~~~~~~~~}}~~€€€ƒ††††‡ˆˆˆ‡†„‚~ytsttssuvx|ƒƒ~|{|}ƒƒ…†‡ˆˆ‡ˆ‰‰‰‰ˆˆ‰‰‰‰ˆˆ‡‡‡‡„ƒ€}~€€‚‚‚‚€}~~‚ƒ‚~~~‚‚€€€€€~ƒƒz{||{y{{}}~~€€€‚……ƒ€|z|~~{y{}~€€€€€}|{{zzz|~€€€€€ƒ„ƒƒƒƒ‚€}{zy{yyyyz{|||{|€€~|||~~}}€ƒƒ{utx|}}}}~~€~yxy|~~~~~ƒ„ƒ|€€€€€€€€„…†‡ˆˆ‰‰‰Š‰‰†ƒ€~~}}~~~}~~~~~~}}}}}}|||||}}}~~~~~~~~~~~~€€€‚ƒ„………†‡‡‡…„‚}xtstsrrsv{‡ˆ‡…‚„ƒ†‡ˆ‰Š‹‹ŠŠ‹‹‰‰ˆˆ‰‰‰‰ˆˆˆˆˆˆ…„€~}€€€‚‚€~~}‚€~~€€€‚ƒ€€~€‚ƒ}z{{{zz{{}}~€€€€ƒ†…ƒ€~~€{zz}~€€€€€€€}||z{y{}~€€€€€‚„ƒƒƒƒ‚{z{zyyxzxz||||{}~€~||}}~}}€‚ƒ€zuuy{}}}}}~‚zy{|}~€„…„|€€€€€€€€€ƒ„ƒ…‡‡ˆˆˆŠŠŠˆ†‚~}}~~~}~~~~~~}}}}}}||||}}}}~~~~~~~~~~~~€€‚ƒ………†‡‡†…„‚}xustsssuy…ˆ‰‰‡ƒ€‚…††ˆŠŠŠŠŠŠŠŠ‰‰‰‰ˆˆˆˆˆˆ‡‡ˆˆˆˆ†„‚€€€€€‚‚…ˆ„€~~€€€‚ƒ€€~€z{|}yyy{}}€‚‚‚‚‚ƒ‚€€€~{zz}~€€€€€€€}||z{z{}~€€€€€‚„ƒƒƒƒ‚~|{{zyyxzxz||||{|}€~||}}~}}€‚ƒ€zsuz|}}}}}~‚{y{|}~€ƒ„„|€€€€€€€€€‚‚……††‡‰‰‰Šˆ…€}~~~}~~~~~~}}}}}}||||}}}}~~~~~~~~~~~~€€€‚ƒƒƒ„………†„„|yvtsttw{‚‡‡‰ˆ††ƒ„†‡ˆˆ‰‰‰‰‰‰‰‰‰‡‡ˆˆ‡‡‡‡‡‡††‡‡‡‡†………ƒ‚‚€€€‚ƒ„ˆ‹‰ƒ€€€~€€‚€€€€€€€€|~zxz}}~€ƒ‚€‚‚€€~{zz}~€€€€€€€}||z{z{}~€€€€‚„ƒƒƒ‚€}{z{zyyxzxz||||z{|~||}}~}}€ƒ„€ztvz|}}}}}~‚{y{|}~€‚ƒ„|€€€€€€€€€€‚ƒƒ„„†‡‰‰ˆ‰ˆƒ€}~~~}~~~~~~}}}}}}||||}}}}~~~~~~~~~~~~€€€‚‚‚‚ƒ„„„……„ƒ€|xsstty~ƒ†ˆ‰ˆ‡†…†‡‰Š‰‰Š‰‰†‡‡‡‡††††……††††……‡‡‡‡†‡††„„„‚€€‚ƒ‡‰‹‹…€€€€€€‚€€€€}~~‚|y}}ƒƒ€€€€~{zz~~€€€€€€€}||z{z{}~€€€€‚„ƒƒ‚€}{z{zyyxzxz||||z{|~~||}}~}}€ƒ…€zuwz|}}}}}~‚{y{|}~€‚ƒ„{€€€ƒ…‡‡ˆ‰‰‡†‚~~~}|~~|~~~|||||||||}}}~~~~~~~~~~~~~~€€€‚‚„††…„…‚~xuuvz€„‡ˆˆ††……‡ˆˆˆˆˆˆ‡‡†……„„ƒƒ„„„„…………„„……‡‡‡‡‡‡†††…‚€€‚„†ˆ‡ˆ‡‡‚€~~~~~€€€€€€€~~~€€€}{|}}‚ƒ‚€€‚‚ƒ€€€€€{z{~~~€€€€€€€€}|zz{{|~€€€ƒ„„„€€}|zzzyyyyz{{{{zz|}}{||{|{~ƒytvz|}}}}}‚‚€|z|}~~~}}~€ƒ‚{€€€€‚„†‡ˆŠ‰‡„ƒ€€~~}|}}|~~~|||||||||}}}~~~~~~~~~~~~~~€€€€€ƒ………†††ƒ~yxy}‚…‡ˆˆ††„„†ˆˆˆ‡‡†…„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„…………††††„€€‚…‡‡„„…†€~~~~~€€€€‚€€€€~}~~€€~~}|}~€€‚‚€~~‚‚ƒ€€€€€{z|~~~€€€€€€€€}|zz{{}€€€€‚ƒ‚€€~}zzzyyyyz{{{{zz|}}{||{|{~ƒytvz|}}}}~‚‚€}{}}~~~}}~‚|€€~~€‚ƒ…ˆŠŠˆ†ƒ‚}}}||||~~~|||||||||}}}~~~~~~~~~~~~~~€€~~}}‚ƒ„„…………~}}€„†‡††……ƒ„…†††„„…ƒƒƒƒƒƒƒ„„ƒƒƒƒƒƒƒƒ„„„„„„„„„„„„††…‚ƒ…††…‚ƒ„ƒ€€~~~~~€€€€€~~€€~}|~~€}}}}}€~|}€‚ƒ€€€€€€€€~{z|~~~€€€€€€€€}|zyz{}€€€€‚‚€~}zzzyyyyz{{{{zz|}~~}{||{|{~ƒytvz|}}}}~ƒƒ€~{}}~~~}}}~€€}€€~~}€ƒˆ‰‰ˆ‡†„ƒ€~}}||||~~~|||||||||}}}~~~~~~~~~~~~~~€€~||}}~‚„„„„……„ƒ€…††……„„ƒ„„„„„„„ƒ‚‚‚‚‚‚‚‚‚ƒƒ„„„„„„„„††„ƒ…‡‡…ƒ€ƒ€€~~~~~€€€€€€~~€€~|||}}|€~}}~€~||‚ƒ€€€€€€€~{z|~~~€€€€€€€€}|zy{|}€€€€€€~~~}zzzyyyyz{{{{zz|}}}}{||{|{~ƒytvz|}}}}~‚„„{|}~~~}}}~€€}€€~~†‡ˆˆˆˆ†„ƒ€~}}}}}}}}||||||||||}}~~~~~~~~~~~~~~~~||}}~‚ƒ……‡‡…ƒƒ„„†…„„„‚‚ƒƒƒƒ‚‚‚~€€€€€€‚‚‚ƒƒ‚„„„„„„„ƒ„…†„‚€|~„€~~}€~€‚‚€€~~€€}}|{}}||€€~€‚‚€€€€€€~}zz}~~~~~€€€€€€€}}}||}~€€€€€€€€~}~~~~}zzzzyyzz{{{{{{z{~~||||{||}ƒ€ztvz|||||~€„„€~|}~~~}{{|~~€€~~~~€„…†ˆ‰Šˆ‡…‚}}}}}}}}||||||||||}}~~~~~~~~~~~~||}}€€ƒ„…†‡……††…„„„„‚ƒ‚‚‚‚€€€~~|}~‚€€€€€€€‚ƒƒƒƒƒ‚‚ƒƒƒƒ€zz~„‚€€€~~~~~~|~‚ƒƒ€€€~~~}{{||||~€€€‚„„ƒ‚‚‚€€€€€~}z{~~~~€€€€€€€}~}|}~€€€€€€€€}}|~~~~}zzzzyyzz{{{{{{z{}}||||{||}ƒ€ztvz|||||~€ƒƒ€~~~~}{z|}€€~~~~‚‚„†ˆˆ‰‰‡„}}}}}}}}||||||||||}}~~~~~~€€~~~~~~~~~€€~~~}‚„…†……†……„„„„‚‚€|||||||~€‚‚‚‚ƒ€€}}}€ƒƒ‚‚‚‚€€€|z}„„€~}}}}z{‚„„ƒ€€€€€€~||||}~}~€€€€„……„‚‚€€€}|z{~~~~€€€€€€€€€~~~€€€€€€||{}~~~}zzzzyyzz{{{{{{z{}}||||{||}ƒ€ztvz|||||~€‚‚€~~~~}{z{|~~~€€~~}}€€ƒ…†‡‰Šˆ…€}|}}}}}}||||||||||}}~~~~~~€€€€~~~~~~~~€€~~~}~ƒƒ„………†…„ƒ„„„‚€€€~}{{zz||}~ƒƒ‚‚„‚~{{{~~~€‚‚‚‚€€~z|„…€~}}}€}y{†‡ƒ€€~€‚}|}~€}}}}€~„„ƒ„ƒ€€€€€€~|{z{~~~~€€‚‚‚‚€€€€€€€€~€€€€€€€~||{|~~~}zzzzyyzz{{{{{{z{||||||{||}ƒ€ztvz|||||~€‚‚€~~~~}{yz|}}}€€€€~~~~}}€ƒ„†‰‰‰…~{|||||{{{{{zz||||||}}~~~~‚€€€€~}}~~~€€€€€€€€~ƒƒƒ„„……††„„ƒƒ„‚|{zyyyyz|}€‚‚„„ƒƒ„„‚‚€}{{{{}}~‚‚ƒƒ‚‚€}€~}~„†€}|~€ƒ‚}~…„€€€€~~}~}zz|}~~~€‚‚‚‚‚€€€€€€}{{|€€€€€€€€€€€‚‚€€€€€€€€~}{{||~~|{zyzzyyy{{{{{{{yy{{||||{||}€‚zuw{|||{}~€‚~~~~~|zxz{}~€€€€~~~~}}€ƒ…ˆ‰‰†}{||||{{{{{{{{{{{{||}}~~~~‚ƒ‚‚‚€€~}}~‚‚€€‚€€ƒƒƒ„„„„„„ƒƒƒƒ„‚~{yyxxyyz|}€‚ƒƒ„„…………„„€~|||{|}~€ƒ„„‚~‚€„…††‚|z{~‚ƒƒ~€€€€~}~~~}}z{{}}€ƒƒƒƒ‚~€€€€~{{|~€€€€€€€€~}}~‚‚‚€€€€€€€~}{{}}~}|{zyyyyyy{{{{{zzyyzz{{{{{||}€‚zuw{|||{}~€‚€~~~~|zxy{}~€€~~~~}}}~„‡‰‰†|z{{||{{{zzz{{{{{{|||}~~~~€€ƒ„………‚~~€‚‚‚‚‚‚„ƒƒƒƒ„ƒƒ„„„„ƒƒƒƒƒƒƒ~{zyxx{{|~~€ƒƒ„„„…………„„‚~}}||}~‚…„„‚~~‚‚„‚€€€{xz}€€€~}~~~€~€€~~~~~}}{{|}|‚ƒƒƒ„ƒ‚~€€|{|~€€}~}~€‚‚‚€€€€€€€~}{{~}}}|{zyxxyyy{{{zzyyyyzz{{{{{||}€‚zvx{|||{}~€‚€~~~}zxxz|}~~€€~~~~}}|}}ƒ†‰‰†|zzz||{{{zzz{{{{{{{||}~~~~ƒ„‡‡‡ƒ‚€~~€‚‚‚‚ƒƒ„„†………„„ƒƒ„„ƒƒ‚‚‚‚‚ƒ‚€}}|{{{||}‚ƒ„„„„„„„„ƒƒ‚€~~~~}~€„…†„ƒ€~}~‚ƒƒ~~€}|||€~}~~~€€€‚ƒ‚~~~}}}|}|}|~‚‚‚‚‚~€€€€}{|}~~€~{~~‚‚€€€€€€€€~}{{~~}}|{zyxxyyy{{{yyyyyyyy{{{{{||}€‚zwy{|||{}~€‚€~~}zxxy{}~~~~~~~~~~~}}}}€…ˆˆ†zyzz||{{{zzzzz{{{{{|||}}~~„…‰ˆˆ‡ƒ€€‚ƒƒ„„„„„„†…††…†„ƒ„„ƒ‚€€€ƒ‚€€}}||~€ƒ‚ƒƒ„„„„„ƒƒ‚~~~~~€„†…‚}€€€~~~}ƒƒ}}~~~}~~~}‚€}~~~|}~~~€‚‚‚€€€€€}z{|}€‚€~}|€‚‚‚€€€€€€€€€€~}||~}|{zxwwwyzz{{zzzzyyzz{{{{|{{|~€~zwy{}||{}~€‚€~~}{xvx{|~~~~~~~~~||}}}}€…ˆˆ‡€zyzz||{{{zzzzz{{{{{{||}}~~‚„‡ŠŠŠ‰„ƒƒ‚ƒƒ„„…„„„†††……†„ƒ„„‚€€‚‚ƒƒ‚ƒ€~}}‚ƒƒƒ„„„„„„ƒƒ‚~~~~~€‚ƒ…„ƒ€~}ƒƒ~~}}z}ƒƒ}{}~~}|}|}|{||}}€€€~~||}|}}~~~~~€€€‚‚€€€€€}z{}~~€‚€~~€€ƒƒ‚€€€€€€€€€€€€€~}}}€}|{zxwwwyzz{{zzzzyyzz{{{{|{{|~€~zwy{}||{}~€‚€~~}{xvx{|~~~~~~~}}||}}}}€…ˆ‰ˆ{yzz||{{{zzzzzzzzz{{||}}~~€‚…ˆŠŠ‰ˆ…„ƒƒ„„„„„„…††…††…„„…„ƒƒƒ€~|{{~‚ƒ……†…ƒ~~€ƒƒƒƒƒ„„„„„ƒ‚~~~~‚ƒ„„‚€~}~~~~}wz€}{~~||}~||{z{{{}~}}}|{{z{}}}~~‚~~~~€}z{~~~€€~€€€‚ƒƒ‚€€€€€€€€€€€€~}~~€€€~|{zxwwwyzz{{zzzzyyzz{{{{|{{|~€~zxz{}||{}~€‚€~}{xwy|}~~~~~~~||||}}}}€…‰‰ˆ{yzz||{{zzzzzzzzzzz{{|}}~~€ƒ…‰‰Šˆ†ˆ…„„ƒƒ„„††††††‡‡…„„…„ƒ‚‚€~}yxx|‚ƒ……‡ˆ„€‚„„„„„„„„„ƒ‚€~~~ƒ„„„€}}€~~~}vx}~~€}{}}}{|{{z{|€€€~}~}|{yyz|||}~~€‚€€€€}z{~€~~€€}}€€€€‚ƒƒ‚€~€€€€€€€€€€~}~~€€€~|{zxwwwyzz{{zzzzyyzz|||||{{|~€~zy{{}||{}~€‚€~}{xxy|~~~}~~~~~~~~}}||||}}„‰Š‰‚{yz{{{{{{{{{yyzzyyz{|}||~~€ƒ†‡‰ˆˆ††‡ˆˆ††‡‡††……„„†…„…………„ƒ€~}{xvuz‚ƒƒƒ…‡ˆ‡…ƒ‚‚„„„„ƒƒ…„‚‚€€~~€‚ƒ„„}{xz}~}}|~~~€}wtw|~€€}{}}|z{zzz{{{}~~}~{{{yyyyxz|}}}~€ƒ‚€~~~€€z{|€€~~€‚‚„„ƒ€}}~€€€€€€€€}||~€€}{yxxxxxz{||zzzxyyyy{{z|||||~|yx{||{{{}~€€}zwxz}~~}~~~~~~~~}}||||}}‚…ŠŒˆ{yz{{{{{zzzzzzyyzzz{{|||~~€ƒ……ˆ‡†‡†ˆ‰‰ˆˆˆˆ††……„…†…„………ƒ‚{xvtsuz‚ƒ‚‚„…‡‡†…„ƒƒƒ„„„„ƒƒ„ƒ‚‚€€€€€ƒ„„…„€|wuvz{{z{}~{|}{uty}}~~{||}|{|{zz{|||~~|||{yzy{yzxwz|}}}}~ƒƒ€~~~€€zz}~€‚‚‚‚€€‚€€ƒ„ƒ|}}~€€€€€€€€}||~€€}{yxxxxxz{{{zzzxyyyy{{{|}}||~~|yx{||{{{}€}zwx{~~~~~~~~~~~~}}||||}}„‰‹ˆ{yz{{{{{zzzzyyzzyyz{z{||~~€ƒ…………ƒ…†ˆ‰‰ˆˆ‡‡‡‡†††‡†…„………‚{xusrruz‚ƒ‚ƒ„††††……„„„„„„ƒƒ‚€€€€€€‚„„……„€{trtxxwxyzzvyzxy||||z{z|{||||zzzyz|||~}{z|{yyy{zzxx{|}~~}~‚‚€~~~€€zz}~€ƒƒ„ƒ€€€€€‚ƒ‚€~{{|~€€€€€€€€}||~€€}{yxxxxxz{{{zzzxyyyy{{|}}}||}}|yy||{{{{}€}zwx{}~~~€~~~~~~~~}}||||}}‚‡‰‰{yzz{{{{yyyyzzzzzzz{z{||~~€ƒ„„…ƒ‚…†ˆ‰‰‰‰ˆˆˆˆ††‡‡††„……„‚€}wtrqqquz‚ƒ‚€‚‚…††††…„„„„„„ƒƒ€€€€€€€€€‚ƒ„†…†ƒ~ytssvvvwxz~|utx~~{zyyx{}z{{zzzyyyyzz|}||{{{yyz|{{zz}~~}~‚‚€~~~€€zz}~„……ƒ‚€€€€€‚‚}zz|}€€€€€€€€}||~€€}{yxxxxxz{zzzzzxyyyy{{|}}}||}}|yy||{{{{}€‚€}zwx{}~~~~~~~~}}||||}}€…‰‰ƒ~{{{{zzzyyyyzzzzzzzyz{{||}~€ƒ„„‚ƒ„‡‡ˆˆˆ‰ˆˆ‡†‡†‡ˆ††††…ƒ‚xtppqqquz€ƒ„~€„†……††„„………„ƒ‚€€‚‚ƒ„…………‚|wtstvutuvy~zwxƒ€{xxwyz|{{zxyzxwyyxxz|||}{{z{|~}}|}~~}~~€€€€€€€~zz}ƒƒƒƒ€€€€€€‚„ƒ€}|{{}~€€€€~|{}~€€}{yyyyyyyzzzyyzzyyxz{||}}{zz}}{yz{|z{{{}€‚€€€~~}zwx{~~~~~~~~~~~}}||||}}~€…ˆ‰…€}||{zzzyyyyzzzzzzzyz{{||}~€€‚ƒ„ƒ„†††††ˆ‰‰ˆ‡ˆ‡ˆˆ‡††…ƒ‚€|urqqrrrvy€ƒ„€}}‚ƒ„…††……………ƒ‚€€€ƒƒ„„„……………€{vutuvussuy}~}yy}‚€}xwvx{|{{yxzz{z{zxxy||{||{{{}~}}~~~€€€€}ƒƒƒ€~€€€‚ƒ‚€}|{{}€€€€€~}|}~~~}{yyyyyyyzzzyyyyyyxz{||}}{z{}}{zz{|{{{{}€‚€~~}zwx{~~~~~~~~~~}}||||}}}„‡ˆ…‚~}||{zzyyyyzzzzzzyxyz{||}~€€‚ƒ‚‚ƒ„…………„†ˆˆ‡ˆ‡†‡‡†…„ƒ€}wsrqqrrsvxƒ„}{}ƒ„………………„‚€ƒƒƒ„„………†…„†„~ywvtuvvtstw|}||z}~}{ywvxz|{zxwz{}}}|zzy|||}||{|}~~~~~}}€€€~~~~€~‚„„„ƒ~~€~}‚ƒ‚||{|}€€€€€~~}}~}}}{yyyyyyyzzzyyxxyyxz{||}}{{{||{z{||{{{{}€~~~~}zwxz~~~~~~~~}}}}||||}}}ƒ‡‡†ƒ€~}}{zzyyyyzzzzzzxxyy{||}~€€‚‚ƒ„……„„„…‡‡†ˆ‡†††…„„ƒ€ztrrrrsssux~ƒ„‚}{{}ƒ„„„„……ƒ‚€‚‚‚ƒƒƒ……………†…„…ƒ}zwxtuuvutuwz||||~~}z{xvxy{{yvvy|~|~~{{{}{z{{|||}~~~~}~~}}€€~~}}€€€€€‚ƒ„ƒ‚~~|y}€‚ƒ‚{z||}€€€€€~~}}~~~}{yyyyyyyzzzyyxxxyxz{||}}|{{{|{z{||{{{{}€~~~~}zwxz~~~~~~~~~~~}}}}}}}|||||~…ˆ†…‚€~|{yyyyyyyyyyyyyyzzz|}}~~€€€€€ƒƒ„„ƒƒ„…‡‡†‡‡†††„ƒƒ|wsssssrstux~‚„‚{z|~€‚ƒ……†ƒ‚‚€‚‚…†……………„……………‚~zyyvtuvussuyz|}€~{{zyvvz{zxvtv|~~zz|zyzz{{}}~~~~}}|{}~~€€~}~€€‚‚‚€€|yvy€‚‚‚{zz{~€€€€€€€€~~~~}}~~|zxxxxxxzzzzyyxxwxyzz{{~~}|{|||{z{|z||{}}}~€~}}~~yxxz~~~~~~~~~~~}}}}}}}|||||~ƒ†††ƒ‚€}yyyyyyyyyyyyyyzzz|}}~~€€€‚‚‚‚‚‚…†‡‡‡‡†………„‚€|xurssssrstux}‚„‚€|z|~~‚„„…ƒ‚‚‚‚ƒ„††‡‡‡‡†„………†„‚~{{zwtuvsrsuwx|ƒƒ{yzwuvxyxwussuy{}}}{zzzyy{||}}~}}|{{{|~~}}€€‚‚€€€€€€‚€|usx‚‚‚{zz|~€€€€€€€€~~~~}}}}|zyyxxxxzzzzyyxxwxyzz{{~~}{z||{{z{|z|{{~€}|~~}}~~yxy{~~~~~~~~}}}}}}}}}}|||||}~…………„ƒ{zyyyyyyyyyyyyzzz|}}~~€€€€‚‚ƒƒ†‡‡‡‡‡…„„„‚€~{xvtsttttstuvx|„„‚~{|}}~‚‚ƒ„„„ƒ†‡ˆ‰ˆ‡‡ˆˆ‡†…„„„ƒ~{{ywtturqruvy|€ƒƒ€|yxwvtwywusqpqtvy{|}|{zyy|||}}}|{|{|}~~~}~€€€‚‚‚€€€€€€{sry‚‚‚{z{}~€€€€€€€€~~~~|||||zyyyyzz{{zzyyxxwxyzz{{~~}zy|{{{{||z|{|~{{}~}}}~~{yz|~~~~~~~~||}}}||||||||||}}‚„„††…ƒ€~{{{yyyyyyyyyyzzz|}}~~~~€€€€€€ƒƒ……†ˆ‡‡‡‡„ƒ„ƒ€~zxxvuuuuttstuvx|„„ƒ}}}~~}‚…„„…ˆ‰ŠŠ‰‡‡ˆˆ‡†…„ƒƒ€|{zywtturrstvy}ƒ‚€|yxwuuvvuttqqprtwz{||}}||}}}~~~}{|}}~~~~~}|~€~~}~€ƒ‚€€€€}€|try‚‚‚‚{z|}~€€€€€€€€~~~~{{|||zzzzzzz||zzyyxxwxyzz{{~~~zy{{{z|}|z|{}€|y{|~}}}~~{z{|~~~~~~~~}}}}}||||||||||}}~€ƒƒ…ˆ‡…ƒ}{zyyyyyyyyyyyz{{|~}~~~€€€€‚ƒ„†‡‡ˆˆ‡†…„„ƒ€~zxvvwwvvvuutuvvw|„„ƒ€}~~‚ƒ„†…‡Š‹ŒŒŠ‰‰ˆ‰‰ˆ…ƒ‚€€|{zzwttvtttvwy~€„‚{ywvtttsrrsrrtttuvz{}}~~}}~€~||}~~}}}|~||~~~~~~€‚€€€~}€€|ss{‚ƒƒ‚{z|}~€€€€€€€€~~|{|||{yyyxyy{{zyyyyxwxyzz{{~~|{z{{{{{|{{{|~‚{z|~~~~~}}~~|z{}~~~~~~~~~~}}}}|||||||||||}}}~‚‚„‡‡†…‚|zyyyyyyyyyyyz{{|}}~~~€€‚„……ˆ‰‰‰‡‡…„ƒ‚}|xwvwxyxvvuuuuvvw{ƒ…ƒ‚}~€€€€€‚„ƒ†‰‹‹‹‡‡ˆˆ‰‰ˆ…‚€€~~}{{{xvvwutuwz{|~€€}zyuuttsppoquuuvvutx{}€€€~~€~}|}~}}}{}}}~~~~~~€€€€€~|{su|‚„„‚|{|}~€€€€€€€€€€|{|||{yyyxyy{{zyyyyxwxyzz{{~~|zy{z{{{|{{{}€‚~zz}~~~~~}}}}{z|}~~~~~~~~~~}}}}|||||||||||}}|}€€‚…††‡„€}{yyyyyyyyyyyz{{{|}~€„…‡ˆˆ‰‰‰ˆ†…„‚€~|zywuvwyyywwvvvvwwx{‚„„ƒ€~~€€~||€‚…‡‡‡……‡‡‡‡††ƒ~~}}|{||zxwwtutv{|yy|}|zxtsuusnlmqwwvvwvsvz~ƒƒ‚€~€€~}||~€~~~~~}~~~~}~€€€€|z|}zuw~‚„„‚}||}~€€€€€‚‚‚~}}}|yyyxyy{{zyyyyxwxyzz{{~~|zyzz{z{|{{{}€~xy|}~~}}}}zy}~~~~~~~~~}}}}}|||||||||||}}|}}~~€„…‡ˆ„‚~{yyyyyyyyyyyz{{{|}~‚†‡ˆŠŠ‰ˆˆ‡†„ƒ€}zyvvvwwyyyxxwwwwxxy{‚ƒ…ƒ~~€|yyy{}~‚ƒƒƒ…………„„„„ƒ}}}}|{~{yvutuuvy{wvy{zxwtstttpklqvxwvxwtvz~€ƒƒ€}}||€€€€€~€€~€~|||}~~{xz}zxz€‚„„‚{z|}~€€€€€ƒ„„ƒƒƒ„€}|zzyxyy{{zyyyyxwxyzz{{~~|yxzzzz{|{{{}€|wx|}~~€€}}||zy}~~~~~~~~~~~~~~~|||||||{||||||||}}}}}}‚ƒ…‡††‚|yyxxxxwwyyyyzz{|~€‚„†‰‰Š‰ˆ‡‡†…„‚~}{yxwwwxxxxxwwwwwwwxy{~‚ƒ„ƒ‚€}wuwxxx{}~€„……ƒ€€‚…†‚€~}‚|wuuvtwxxsqvxyywustwwpiipvyxxyxwvy|~ƒƒ‚€~{|~}€€€~‚‚~~|zz|}}€||{|}|{|}{z{€‚ƒ„‚€}|}~€‚‚ƒ……„„„‚‚€€~|{yyyz{{yxxxxwwxz{zz|~{yyzzy{{{{{{|€zvy|~~}|xxy}~~~~~~~~~~~~~~~~~|||||||{||||||||}}}}}}}}€„†‡ˆƒ~zyxxxxwwyyyyzz{}€‚ƒ†ˆŠŠ‰ˆ‡†……ƒ€|{yzxxyyyyxxyyxxxxxxxyy{}ƒ„ƒƒ‚€|ustuwvxz{}‚‚~ƒ…†…ƒ‚ƒ~€„‚}xvvvtvvupnruxzwuttvwoffmtxxyyyxwwz||~ƒ‚}}z|~~€€€€€€~~~~}||{z{|}|}}{{z{||~~~|{‚ƒ…„‚~}~€‚ƒ„„„„„ƒƒƒ‚‚‚‚‚€€~{yyz{{yxxxxwwxyzzz|~{yyyyy{{{{{{|€zvy|~~}{wvy}~~~~~~~~~~~~~}}~~|||||||{||||||||}}}}}}}}}‚„‡ˆ†€|zzzzzyyyyyyzz|~ƒ„†ˆˆŠ‰ˆ†…„ƒƒ€}|{zxyxxyyyyyyyyxxxxxxxyy{}€ƒƒ„ƒ‚}{wtsrtuvwx{||}~~}€ƒƒ„†…†…ƒ€€„‚}xuvvtrrrnknsw{yvtttuoecjswxzzzyxvx{{{}{zz}‚€€€}}}~~}{zz{{|~~{zz{|||||€€}}ƒ„…„ƒ€~~~‚‚ƒƒƒƒ‚‚€€€€~{zz{{yxxyxwwxyzzz|~{yxxyyz{{{{{|€~yvy|~~}{wvy}~~~~~~~~~~~~~}}~~|||||||{||||||||}}}}}}~~~€€ƒ…ˆˆ‚~zzzzzyyyyyyzz}ƒƒ‡ˆˆ‰‰ˆ‡„ƒ‚‚€{{zyyyyyzzxxzzzzyyyyyyxzy{|€ƒƒ…„‚~|{vrpqtutvy{|{{{}‚ƒƒƒ‚ƒ……‡…ƒ€„ƒ}yvwvupopmknrw{|zutssoeckrwxz||{ywvxyw{€€~|y{}€ƒƒ€€€€~{||~|zxxz{{}}{xyz||{|}€‚€~~ƒ„†„„‚ƒ‚ƒ„„ƒ€€‚€€€‚‚‚~|{{{yxxyxwwxxyzz|~{xxwwyz{{{{{|€~xvy|~~~zwwy}~~~~~~~~~~~~~~~~~||||||{{{{||||||}}}}~~}}}~€‚†ˆ‡„}{zzzzzyyyz{|€‚…†ˆˆ‡‡‡†…‚€€}|zz{yzzzzyyyyzzzzyyyyyyz{z{{‚ƒ}wpmotuqtyy{{z|~‚„ƒƒ„ƒƒƒƒ‚€~ƒywwuupkmnkmqw}}yuttsohgkswy{||{zxwwwtx€{z{~‚€€€~{||}{xuvxz{}|xwx{|~|~~€‚€~€€„††ƒ€€€€‚„„‚ƒ‚€€€€€€ƒ‚ƒ€}{zyyywwxxwxyzyz|~|xwwwy{{{zz|}€‚~zvx|~~{vux}~~~~~~~~~~~~~~~~~||||||{{{{||}}}}}}}}~~}}~}€‚„ˆ‡…ƒ~||zzzyyyz}~„‡ˆˆ‡†…„„‚~~{{z{|{{{zzyyzzzzzzyyyyzz{{z{|€€~||zrnkoutoqwy|{{}~‚„ƒ‚„ƒƒ‚€~‚|xwvuokkollmu{ysrrtspkkmtwy{||{{xxwvtw~‚„‚}z{~‚‚€€€€~|{{}|xwwxz||yyzz{}~€€€€‚„…†ƒ€€‚‚ƒ‚‚€~}€‚‚‚|{yyywwyxwxyzyz||xwwwyz{{zz|}€‚{wy|~€€~yuvy}~~~~~~~~~~~~~~~~~||||||{{{{||}}}}}}}}~~~~~~€„‡ˆ†„‚‚€~||{{{|~€ƒ…ˆ‡‡†…„‚€}||||{{||||{{{{{zz{{zzyyyy{{{{{|€‚‚€~~xrlinsrnpux|{{}‚„ƒƒƒƒ‚‚‚€~}ywwunmipomnrwtnnpturnlotwy{||{{yxwvsuy€„ƒ€~|‚ƒ‚€€}|{{}}{|yyz{{x{}~}€€€‚€‚ƒ…‡„‚‚‚‚€€€}|~~~€€€~|zyyyyxwwxyzyz||xwvwyz{{zz|}€‚€|xz|~€€~yuvy}~~~~~~~~~~~~~~~~~||||||{{{{||}}}}}}}}~~~€ƒ†ˆ‰…„„ƒ€|||}„‡‡††…ƒ‚€~|{z{{|||}|||{{{{{{{||zzyyyyyy{{{}~ƒ„€{qjhkpropuy}}}€‚„ƒ‚ƒƒ‚‚€}€€~zxwtmlhnpnnqsplkptvsomquwyz||{{yxwvsqu|€‚‚~€ƒ„‚€€~|{{}}}|zz{{y{€~€€€‚ƒƒ…†„€€€€‚‚‚€~}|~}}~~€€€‚€|{yyyywwwxyzyz||xwvvyz{{zz|}€‚€|y||~€€~yuvy}~~~~~}}~~~~~~}}||||||{{{{||}}}}}}~~~~ƒ†ˆ††††……‚~}}‚ƒ…‡†…„ƒ}}|{{{|{}}|}||||{{{{{{{{{{yyyyzz{{|~‚„ƒ€ƒ‚|rljlmrttwz}}}‚ƒ€€}|€‚~zxvrmiglqssromllquvspnruwxz{}{zyyxvtppuz~}ƒ„ƒ€€}|}}}~~}yx{{{|€€€€€€~‚‚‚ƒ„„„‚€€€€€€‚‚‚ƒƒƒƒ}}}|{|}~~€~{yyxxvvwyyyz{}€€|xwvvxzzzzz{}€‚~z|}~~~|yvwz~}}~~~~~~~~}}||||||{{{{||}}}}~~~~~~€‚…†‡†‡‡‡‡ƒ‚€€„…‡‡†„ƒ|{{z{||}}}}|}||||{{||||||||{{{{|||||~ƒ„‚‚€€~}zqlhkmsxzz|~}~€€€€€}|„‚{xvqkhflqvvrpmlnqtvurpruwxy{|{zyxxvvrrrvz{zz}‚ƒ‚€€€~~€~~~~}yx|}~~€€€€~~‚‚‚‚ƒ‚‚€€€€€€‚ƒ„……††„‚€~}|z{|}~€€€|yxwwvvwyyy{{}€€|xvvvxzzzzz{}€‚|}}~~~|yvw|~~}}~~~~~~}}||||||{{{{||}}}}~~~~~~€‚„†††‡ˆˆ†„‚‚„…†††„‚|zz{{|}}}}}}|}||||||||||||||{{{{|||||~ƒ„„†„€}{yslhikr{}~~€€€€~~}€||…ƒ€|yvoheelrvvtqnnnqruusrtuwwwz{}|zwvwxvttvwxww|€‚‚‚€€€€€€€€€~}}}zz}€~€€€€€~~‚‚‚‚‚‚‚€€€€€€‚ƒ„††‡‡†„‚~}|zy{{|€€~zvwwvvvxxyz|}€€|xuvvxzzzzz{}€‚€|}}~~~|yvx}}}}}~~~~~~~~}}||||||{{{{||}}}}~~~~~‚…††ˆˆˆˆ†…ƒƒ……†„„ƒ€}zz{}}}~~~~}}|}||||}}||||||||{{{{||||}~‚„…‡‡„‚€zumhhjr|€€€€€€€~~}€{|…ƒ€|yuogcelsvvvspoprqsvtuuuvvvz{}yvvxxxusuxxxw{‚‚‚€€€€€‚€~}|}|{€~€€€~}~‚‚‚‚‚‚‚‚‚„„†††‡†ƒ~}|zyyx{|€{vvvvvvxxyz{}€€}xtvvxzzzzz{}€‚|~}~~~|yvy}}}}}~~~~~~}}}}||||{{z|||}}}}~~€€ƒ„…†‡ˆ‰‰‡…„…„„„‚|{zz{|~~~~~}}}}|||||||||||||||||||}}||~‚…„‡ˆ†„ƒ‚€~{slklu~€€‚~}}€~}€}z|…„‚|ytnf`emrtwwtqqrsrtuusstuttyz}}xttuwxwstwwwx|€€€€€€€€€€~~}||zz~~~€€~€€€~}||‚‚‚‚€‚‚€€€‚‚‚……†‡‡†„‚~~~|{zzyz|€|xwvvvvxxy{z}€€}xttwyzzzzz{~€~}~~~~~~~}{ywy|}~~~~~~~~~}}}}||||{{z|||}}}}~~€€‚‚…†‡‡†………„„ƒ|z{z{||~~~~~}}}}|||||||||||||||||||}}||ƒ…„ˆˆ‡…ƒ„ƒ‚}zuopw€‚}}||~€€}|~}z{€ƒƒƒ}ztnf`fnstwwutstsstuvttutqswx||wrruvywstvvwx{}~€€€€€€€€€€€|||zyyxwy|~€€€}|}‚‚‚‚€‚‚€€€„…†……†„‚€}}~}{zzxwz}‚|zxvvvvxxyzz}€€}xttwyzzzzz{€}}~~~~~~~}{ywy|~€€~~~~~~}}}}||||{{z|||}}}}~~~~~€€ƒ„†††………ƒ‚~|{{|{}}}~~~~~}}}}|||||||||||||||||||}}}}€ƒ„…‰Š‰‡…„„„}ztsw}€€‚~}{{{|~€€~|z||y{€‚ƒ„ztnfbfmsvxxwwuuttuvwvvutqruvzzwrqsuxvttvvwwz|}~€€€€€€€€€€~}}}zy{yvvuy|~}|~€‚‚‚ƒ€‚€€‚„……„„…ƒ{{|}zyyxwy{~‚~{yvvvvxxyz{~€}xttwyzzzzz{€}{|~~~~~~~}{ywy|€~~~~~~}}}}||||{{z|||}}}}~~~~~~~‚‚……„ƒƒƒ~{|{{|||}}}}~~~}}}}|||||||||||||||||||}}~~…„†‰‹Šˆ‡†„„€~yux}€‚~|zyy{}€~|z|{xz‚……‚ztnedemsuwwwwwvuutvvwxwvqruwxxuppruwttttvwxy{{}~€€€€€€€€~~}~~{{}zyvrrw|}|~‚‚‚ƒ€€€‚‚‚‚ƒ„…†…„‚€|zzz{{yyxxxz}€}yvvvvxxyz{~€|wstwyzzzzz{€|y{|~~~~~~}{ywy|€ƒƒ~~~~~~}}||||||||||{|||~~~~~~~~~~~}~‚ƒƒ‚~|{{{|}}}~~~~~~}}|||{||||||||||||||{|}}~~|†ˆˆ‰‹‹Š‡……ƒ€‚‚~yy{~~~‚~zyyzz}€€~~}{xz€…‡†€ztniefnruvvxxxutttwxyzzxtruwwvrporttrrrtuvxzyz|}€€€€€€€€}}}~}~€~}{vrot}€}~€‚ƒƒ„ƒ€€€‚‚‚ƒ„ƒƒ‚„ƒ|yyyyzxxxvvz}xvttwxxxy{~€€zustwyzyyxz}~{xz}}|||zxwy|€€ƒ…~~~~~~}}||||||||||||||~~~~~~~~~~~}}}€‚‚€}|{{{{}}}~~~~~~~}}|||{||||||||||||||{|~~~~}„‡‰…„ˆŠ‹‰†…‚‚‚ƒ…„~zy}}zzyyy{~€€}zwy€†‡†ztojfgnruvvxyxvutuwxy{|zvtvxwuponpqqportuwyzyy{}€€€€€€€~}}~€€~|wstx~€‚‚ƒƒ„‚€€€€€€‚‚‚ƒ„ƒƒ‚ƒ‚~{xxxxyxxxvvy{~€‚|xuuwxxxy{~€€zurtwyzyyxz}€}ywz}}|||zvx{ƒƒ„…~~~~~~}}||||||||||||||~~~~~~~~~~~~}|||~€€~{{z|||}}~~~~~~~~}}|||{||||||||||||||{|}}}}~€†Š†€„‹‹Š…„„ƒƒ…‡ˆ„|y{€€€€|zyyyxz}€€€~|wux†‡†ztojfgnruvwwxxuttvwxy|}ywuwxwtpnnooonorsuwyzyz{}€€€€€€~~~€€€€|yuty€‚‚‚‚ƒ€€€€€€‚‚‚ƒ„ƒƒ‚‚€~zwwvwxwxxuvy{}€‚}xuuwxxxx{~€ytqtwyzyyxz}€}xwz|~}}|yvy€……ƒ‚~~~~~~}}||||||||||||||~~~~~~~~}}~~}||{|}~~}|||{}}}}}~~~~~~~~}}|||{||||||||||||||{|}}||~ˆŠƒ|~ƒŠ‹ˆ„ƒ„‚„†Š‡{{€ƒ{zzyywxz~€€}|vsx‚†‡†‚ztokggnruvvwxwtssuxxy||ywvxyvspnnnmmlnrtuxy{yz{|~€€~~~€ƒ€€}vrt~€ƒƒƒƒƒ‚€€€€€‚‚‚ƒ„ƒƒ‚‚€}{vvvvxwxxvvxz|‚~zwuvwwwx{~€}xtqtwyzyyxz}}vvz}€~}||yx|ƒ……ƒ~~~~~~~~}}||||||||||||~~~~~~~~~~~~~~~~~}}||}|||||||}}}~~~~~~~~~~~~}}|{||||||||}}|||||||||}ˆˆ€z}…†„‚„ƒ€‚ˆŠ‚|{ƒƒ~{|{yyvwy~~~|zurw€†ˆ‡ƒ|unkhhnsstuxywsrsuxyy||zxxyxvsomnmkhkmqtuxz{{{z{|}€~€~}~€ƒ„€~yutz€‚‚‚‚‚€€ƒ‚€€€‚ƒ„‚ƒ‚‚|yuuuvvvvuvwwyz|~|ywwxxxx{€}xsrtwxyyyx{~€}uu{}~€~}|{x{‚‚‚‚ƒ‚~~~~~~~~}}||||||||||||~~~~~~~~~~~~~~~~~|}}||||||}}}}~~~~~~~~~~~~}}|{|||||||||||||||||||}„†‚}|{|ƒ€yx~‚~zz‚‰†}|{|zywwx||~{ytrw€…‡†„}umkginstuvxxvpmoqqtvyzzwwxxuromlhfgimqtvy{||{{{{|€‚ƒƒ€~}{|€‚‚€|{xw~€€€‚ƒ‚€€‚ƒ„‚ƒ‚‚€|wuttuvvvuuvwxy|€€}yvvwwwx{~€}xsqtwxyyyx{€|tu{}~€~}}|{‚ƒ‚‚‚~~~~~~~~}}||||||||||||~~~~~~~~~~~~~~~~~|}}||||||}}}}~~~~~~~~~~~~}}|{||||||||{{|||||||||}…ƒ~{}xx{}zssy|yuuz„‡ƒ~~}~~|~}zxwvyz{zwtqw€ƒ……ƒ}umkhjnstuxxwrkghkknrtwxvvwwtqokhddggkruwz{|}|{{z{€€€„…†„‚~}zxz|}~}}}zwz‚ƒ€€‚ƒ„‚ƒ‚{wtsstvvvuuvwyy{~€€{wwwwwx{~€|wrqtwyyyyx{ysu|~€~}||~ƒƒ‚€€€€~~~~~~~~}}||||||||||||~~~~~~~~~~~~~~~~~|}}||||||}}}}~~~~~~~~~~~~}}|{||||||||{{|||||||{|}ƒ€}z{wvxzxsswzvqqu~„„~}{z|}€{zxwxz{yvspw€‚„„„~vnkiinsuvwxumecceilpruuuuvwtqnjeeeigksvy{|}}|{z{|€€‚„…†„€~|wttwxy{{|~}xz€‚‚ƒƒ€€€‚ƒ„‚ƒ‚€~yvsrrsvvvuuvvxyz~€}wvvvwx{~|urqtwz{yyx{~€}wrv|~~€~|{|„ƒ‚€€~~}}}}}|}}||||||}}}}}}~~~~~~~~~~~~~~~~}}}}||||||||~~~~~~~~~~~~}}}|||||||{{zz{{{{|||||}€|z}zsttuvttvtqooov~‚|zyx{~€~|zwvvxyzwrqx€‚„…‚}wokihlruxxwsh`^^^cjoqsqrrttrqmhdddiimrx|~~~}{z{}€}{}‚„†€}ywvvxvvtvz}}yx}€‚ƒ€€€€‚‚ƒ‚‚|yvssrsuuvutuwwxz}€~ywwwwx|~~zuqptwz{yxx{}vsx}~~}{|„„‚ƒ~~~~}}}}}}}}||||||}}}}~~~~~~~~~~~~~~~~~~}}}}||||||||~~~~~~~~~~~~~~}}}|||||||{{zz{{{{||||{|}}xy{xrtvvwvxurnoonqw~|xvv{~€~}zxvvxyywrry€ƒ„†‚}vpmiimrvxxwobYWYTYfoqsqrrrqonkgeffjkmpuy|~€~}zzz}€}zz|~€ƒ†ƒ~zyywy{zxvz{|ywz‚€ƒ€€€€€€‚‚ƒ‚‚|xussrsuuvutuwwxy|~€€~{xwwwx|~~zuqqtwz{yxx{€}uty}~~~|{}„ƒ‚‚€~~}}}}}}}|||||||}}}}~~~~~~~~~~~~~~~~~~~~}}}}||||||||~~~~~~~~~~~~~~}}}|||||||{{{{{{{{{{{{z{|zwxzwruy{{}~yrnoonnt}}xvvz}€~}{xwwxyyxuuz€„……‚}wqnjimsvxvvobUPQMVdorsqppommjkihggjlnosvz}~|zyz}€~{z|}„†‚~{ywx}~{{}}|wvy}€€€ƒ€€€€€€‚‚ƒ‚‚|wtrrrsuuuttuwwxx|}€|ywvww{~~zuqqtwz{yxx{~€{vty}~~}{|€‚ƒƒ‚~~~~~~}}}}~~}|||||||}}}}~~~~~~~~~~}}~~~~~~~~}}}}||||||||~~}}~~~~~~~~~~}}}|||||||{{{{{{{{zzzzz{}zwwzxru{}}{sooonns}~xuv{}~}{yxxxyxywwz€‚ƒ…ƒ}yrmjimsvwuvqeRKKMXenstqomliigjjihfimopsuz{}}{yyz}}{|}|€ƒ‡†|ywv{~~}€~wuvx{~€~ƒ€€€€‚‚ƒ‚‚|wtqqrsuuustuwwxx{}}€}ywuvwz~~ztqqtwz{yxx{~{vty}~~|z€ƒƒƒƒ‚€}}}}}€€~~~~}}}}}}}|||||||}}|~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}}}{||||||}}}}~~~~~~~~~~}|}|||||||{{zz{{{{{{{{{|}yvuzvorxy{}tqoopos|~vuv{}~}{zxwxxwwwxz‚‚„ƒ‚}tmjkosuuuvqhSKLS]hqttrpnifeegiigefmqqsuwz{{yxxz|~}|}|{|…ˆ‰„~{yvz}€}ztrsx}}~~ƒ€€€€‚ƒƒƒ‚€|vtqqrstttstvvvwwz||}€~ywuvx{~yrpquxyyyyx{{uty}}~}{~‚„„ƒƒ~}}}}~~~~}}}}}}}|||||||}}|~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}}}{||||||}}}}~~~~~~~~~~}|}|||||||{{{{{{{{{{{{{|}ytswumotsvz}|tqpponr{~wuv{}~}{zxwxxwwvxz~€€‚wplmqsuvuuqkYSSZckqtsrpojgeefffefgmrrsuwyzzxwvy|}}}~}|~‚†ˆ‹Œ‰„€|wx|~€€€~zvsrvvy}ƒ€€€€€€‚ƒƒƒ‚|vsqqrstttstvvvuvy{|}ywvwx{~xrpquxyyyyx{ytty}}}||€ƒƒ„‚‚~}}}}}~~~~~~}}}}}}}|||||||}}|~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}}}{||||||}}}}~~~~~~~~~~}|}|||||||{z{{{{{{{{{{{||xqorqlmrssw{ztqqqooq{yvw{|}}~}|{yxxxvvuwy|~{}€€ysopstuvttpk`ZZagmqsqonnmjhfecccdhnsttuxyzywvtw{}}}~~…ˆ†††ˆˆ†zx{|~€€~{xvspsw|€€€€€€€‚ƒ„ƒ‚~{urqqrstttstvvvvvyz|}€ywwwx{~xrpquxyyyyx{~ysuz}}}|~‚„ƒƒ‚€}}}}}}~~~~~~}}}}}}||||||||}}|~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}}}{||||||}}}}~~~~~~~~~~}|}|||||||{z{{{{{{{{{{{||wokmmlmqrqu{ztqqpqoq{zww||}}~}}{zxxxuuuvwz~~z}€{urrvvuvtrojb^]dinqpnlkmomkiecab`fouuuvxyywusrtx}}}~~€…„€€‚„ˆ…}yz{~€€~}|yopsy}€€€€‚ƒ„ƒ‚~zurqqrstttstvvvvvxz||€zwvvx{~wrpquxyyyyx{€ztuz}}||€ƒƒƒ‚€~||}}}}~~~~~~~~~~~~}}}}}}}}}}~~}~}}~~~~~~~~~~~~~~~}}}||||||||}}}}}}}}~~}}||||{|}}|{||||||{{{{|}|wohhklosqosz{uprssqt{|wx||||~~||{ywvuttvww||{}€yvuvututrnieaagnpomkhgjnqolgd_[[dpvwwxxxwtonprw|~~€‚ƒ€~~}†‹ƒ}z{|}~€€€~ztpqw|~€€~~€‚„…ƒ‚}yurpqssssstuvvuuuvx{}€€|wvvx|}vqqrvxxxwxx{zttz~~|‚„„ƒƒ€~}}}||}}~~~~~~~~~~~~}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~~}}}||||||||}}}}}}}}~~}}||||{|}}|||||||||||||}}woihjknsoorx{vqruusv}|xy|||||}}|{zxwsrtuvwz{{}{xvvvvwurnjgdfkppnjgddglqpnif`[\epvxxxxvsqlkorw{€€‚ƒƒ~~~}…ˆ€||}}~€€€~€‚€{wtnsu{~~€„…ƒ‚|xtrpqssssstvvvuuuvx{}€€|wvvx}|upprwxxxxxy{~~ytuz}}~ƒ„ƒ‚}|}}}||}}~~~~~~~~~~~~}}}}}}}}}}}}~~}}~~~~~~~~~~~~~~~}}}||||||||}}}}}}}}~~}}||||{|}}||||||||}}}}|}}xojjjkmpmnpv|xssvvtv|~|yz||||{|}|zywvsstuvvx||}~~|ywwvwwwtoligjnpolhcaadiopnjgb^_gqvxxxxurnihnsvz~~€‚ƒ~~~~~‚†Œ…}|~~€€€‚‚~yrqoux{|}~€„…ƒ‚|xtqpqssssstvvutttuwz|€€|wvvx}~{uposwxxxwwy{~~xtvz|}ƒƒƒƒ‚~{y{||||}}~~~~~~~~~~~~}}}}}}}}}}}}~~}}~~~~~~~~~~~~~~~}}}||||||||}}}}}}}}~~}}||||{|}}||||||||}}}}|}~xqlkjkmnlknu{zusvvtx}~}yz||||||||zxwvutstuvw{|}~}}zxxwuuwtomkjlppokf`^]`fmomjgca_hruxxxxwrkegmtvz}~}}€‚~~~~‚ˆŠ†}|~~€€€‚‚€~ysprtwwwz{……ƒ‚|xtqpqssssstvvusttuwz}€€|wvvx}}{uqoswxxxvwy{wsux|~€ƒ‚‚ƒ€}yx{||||}}~~~~}}}}}}~~}}}}}}}}}}~~~~~~~~~~~~~~~~}~~~~~~}}}|}}||||}}}}}}}}~~~~}}}}}}{{{||||||||||||||||}~zrljkkmlhhks{zwuuuvy}~}z{|}|z|{{{zywvvsrruux|~~}}}{zxxuuwtpnlmnqrpkd^YY]cjomidb^_fptvvxxuoidfovwxyzz{€~~~~€€ƒŠ““Ž‰‚~~}~€€€‚€{yqoqrrty}‚ƒƒƒ|wtrqrrrrrstvvutsstwy|{wuvy|~ztppswyxxxwy{~|urvx{‚ƒƒ‚‚{vy{{{{{||~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}~~~~~~}}}|}}||||}}}}}}}}~~~~}}}}||{{{||||||||||||||||}zrlkkmnjefiqyzywuvwy}~}{{|}|z|z{zzyxvvtsrttvz€}}}|{xxyyxuollnpqqokd\VW]djmkid`]`fortuwwtmgbemtvxzyzz}}}}~€€…””ŽŠ„€~}~€‚‚ƒƒ€€€~ztqqsv{€‚ƒƒ‚{wsqprrrrrstvvutsstwz}{vtvy|~ztppswyxxwwy{~{vsvx|€ƒƒƒ‚‚yuy{{{{{zz~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}~~~~~~}}}|}}||||}}}}}}}}~~~~}}}}||{{{||||||||||||||||}zrljlllgdfjqy|zxwxxz}}|||{||z{zzz{yywvussstty€}}}|{yyyyyvnjmoqqqokcZVW^figecba`bgnqrtuurlfadkruwzz{|{yy{}‚‚…Š‹‰„€~}~€‚‚€€€yvux{~€€‚ƒƒ€{wrpoqrrrrstvvutsstw{~zusuy|~ytppswyxxwwy|~zvtux~‚ƒ‚|wuy{{{{{zz~~~~}}}}}}||}}}}}}}}}}~~~~~~~~~~~~~~~~}~~~~~~}}}|}}||||}}}}}}}}~~~~}}}}{{{{{||||||||||||||||}zskhklkfdfjqy~zzxyyz}}|||{||zzy{{|{zywwsrssty€~}}|{yyyyyunjmppqqokbZVX_ed`^^_abdhmpqsttqjebdjquwzz{}|yuw{ƒ…ˆŒŒ‰ˆ„€~}€‚ƒ‚‚€€€€{yxz|~~€‚ƒƒ€{vqpoprrrrstvvutsstw{~zusuy|}ytppswyxxwwy{}zvsux€ƒƒ„€zsty{{{{{{{}}~~}}}}||}}}}}}}}||}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}{{||}}}}}}~~}~~~}}||||zz{{|||}}}||||}}}}}~~{rkhkmkedgmr{€}{yzzz|}|{{|||{{zzyzzzzywtsrrsw~€€~}|||yxyyxunklopppmibZWYbc_XYZ\^cfjmpqrstqkgcciouwz{|}|yvuy~€‚††‡ˆ‡†ƒ€~}€‚ƒ€€€€€~|}}~~‚ƒ‚zupoopqqssstvvusssrv{~€€{vsuz}|wrnpsxyyyvvy{~ystv|‚ƒ~wrty{{{zzz|}}~~}}}}||}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||}}}}}}}}}~~~}}||||{{{{|||}}}}}}}~~}}~~~|qlijkiedips|€|{zzz|}|{{||||{zzy{{zyywtrrrsv}€€~}|{wwxxxuplloooonic]Z_ie[QTTV\ehknpqrrrpjfbdiotvyz|~}}|{}~€ƒ……‡ˆ†ƒ~~ƒ‚~€€~~~~~‚€~yupnopqqssstvvusssrw|€zusuy||wroqtxxxxvvy{}yssw~ƒƒ€{sruz|{{zzz}}}}}}}}}||}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}||||}}}}}}}}}}||||{{{{|||}}}}}}}~~}}~~}rkijkieeksu|}|||z|}|{{||||{{zz{{zyywsqqrsv{€€~~{vuvwxupmlkklmmke^^gnjZLOOPXbgjlmpqrqoiebcimrvz{|}}€€‚ƒ††‡‡‡‚~ƒ‚~}~~~~~~‚}ytpoopqqssstuuussstx|€ytsuy||wqpqtwwwwvvy{|wstx€‚‚yrrv{}{{zzz~}}||}}}}||}}}}}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}{{{{}}||}}}}}}||||||{{|||}}}}}}}~~}}~~€}tmhikjefltw|€}}}z|}|{{||||{{zz{z|{ywtppqsu{€‚€€€€|vttuxuqmjfejmolg`akok[IJJMS_gighnpqqnhcachkpw{||{|~€€‚ƒ……‡‡ˆˆ‡ƒ€~~~„‚~}}~~~~~~~€€€}ytonopqqssstttussstx}€€ytsux{|wppruwwwwvvy{{vsu{‚€~xrrx|}{{zzz€}}}}}}}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||||||}}}}}}}}}}||||||||||}}}}}}}}~~~~~}tkhhijfhotx|~~}~|||{{{{|}}{{{zz{||zxrpoorsx~‚}wrstvwsoiecfjlkhcfjlh\PJGHP[egcbiopolgc`adhmv{|{{}ƒ„…‡ˆ‰‰‰Š‡ƒ€€€~}~ƒ‚~}}}~€€~~~~~~€€~|wsonoppqssstuuussstw}~xttvy{{vopruwwvvvvy{{wsv}‚€{vrrw{{zyz{{€}}}}~~}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||||}}}}}}}}}}}||||||||||}}}}}}}}~~~~~wliiijilpu{~€~}}}~~}|{{{|~~|||{{{{{xvqomorrv}€}xrrruvtohccfhhfhfikmi_YNKJPYec]]emnokfb_^aelw||{{|‚…††‡ˆˆ‰‰‰ˆƒ€~~ƒ‚}||~€~~~~~~~~€~|wrpmmnpqssstuuussstw}~xttvy{zuopruwwvvvvy{{vtxƒ‚€}xusrv{{zyz{|€}}}}}}}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||||}}}}}}}}}}}||||||||||}}}}~~~~~~~~‚‚{oijkjnptx}~}||}€~|{{{}~||{{{yzzwtpnmnqqtz€~xrqqtvsohccghg_adjlmhaXPNLOXfaWXajmnkfb_]_blu|}{{}€ƒ…†††‡ˆˆŠ‰Š…‚€€ƒ‚||}~€~~~~~~~~€~|xspmlmpqssstuuussstw}~wstvy{ztopsvwwvvvvy{{wt{ƒ‚‚{wurrw{{zyz{~‚}}}}||}}||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||||}}}}}}}}}}}||||||||||}}}}~~~~~~~~ƒ„~rmkkkpswz}~~|||}€}|{{{}~}}{zzyyzvspnlmoqrx€~}xrpqsusogcfhie[Z_immhbVRNNQZgbUT^gmnjeb^]`bmu}}|{}ƒ…†‡††‡ˆˆˆ‰†ƒ€‚€€ƒ‚€}}~~€~~~~~~~~€}{xronmnpqssstuuussstw}~vstvy{ytopsvwwvvvvy{{wv}ƒƒƒ‚€}zwtqsx{{zyz{ƒ||||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||||}}}}}}{{}}}}~~}}~~~~}}~~†‡uomlnuwy{~}{|}}~‚ƒ~|{{|}}}}|{{zywtrqmjkoqqv|€}{vqnorsroheegkg\UYdljg`VSTV[ah`VPZekkhb`^\`dmv||{|„…†……†‡ˆ‰Šˆ†ƒ‚„ƒ€€ƒƒ}}}~~~~~~~~~€‚€}{wsollmprrrssttssrrux~€|vssuz{xsopruwvuuuvx{ywz€„„‚zwvrosyzzzyz|€„||||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||||}}}}}}||}}}}~~~~~~~~}}ƒ‡†€vrpnpwy{}~|}~~€ƒ„ƒ€}z{}}}}}|{{yxvsqoljknppsx|}}zxspopqqqogceini]UW^gfe^WV[^`eh`XOVcig^ZY[\_dnu{~|{{~€‚ƒ„ƒ„„†ˆ‰Š‰ˆ…ƒ„„ƒ€€‚ƒ€~}}~~~}}~~~~€}{wsolkloqrrssttssrrvz~€|vssuy{wrnoruvvuuuvx{xx|‚ƒƒ}xuusqw{{{{{{~„||||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||||}}||}}~~}}}}~~~~~~~~}}~…ˆƒ}xuustx{|~}|}~€ƒ††„€|}}}}}}|{zyxvsqnmkkmopquxxywvqpnnppqogbelpl_VWYbcd^XY_`_ae^ZPS`hcVTV\\_dnty~}|{}~‚ƒ‚ƒƒ…ˆ‰Š‰‰…„„„ƒ€€‚ƒ€}}}~~~}}}}~~€}{wsolkloqrrssttssrrvz€{vssuyzvqnoruvvutuvxzwz‚‚€{xwywv{~~~~~}€‚„||||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||||}}{{}}}}~~~~~~~~~~}}}ƒˆˆ‚}zwwuvx{~}{|~~€€…‡ˆ†„~~|}}}}|{zyyvsqnmllmopqruuutsqpmnppqofbelombVUX_bb^\\``\]`\YPS^hcTOU\^`dntx~|{|}~€€‚„ˆ‰‰‰ˆ†…ƒ„„€€|}}~~~||||~~€€~}{wsoljknprrssttssrrvz{vssuxyvqmnruvvutuvxxw|‚‚€zxwz{|€€€€€‚„…||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}{{||||}}||||||||}}}}}}}}~~~~~~~~}||€…ˆ†~||yyy|~~}{|~€‚ƒ†Š‰†ƒ|}|~}||zyxvspnnnmklorsrrqpqsqmknopogbeljidXQV\bca_ab_[X[WSPT^fcSJOZ\`emsx~~}||}|~€‚„†ˆŠ‰‡††„ƒ‚‚€}{}~~}||||}~€~{yvsojklopqrtttrssqrvzzsrsuyyupnoruuttstvxxy}‚‚‚€~{{~‚ƒ‚‚‚‚ƒƒ„„||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}||||||||||||||||}}}}}}}}~~~~~~~~~}}ˆ‡†‚€€€}{z|~~}{}€ƒ†ŠŠ‡…~}}~}||zyxvromnnnjknqrrrpqoqtollnnmhdfhe``ZRU[ab`_ac`[WUSOQV]cbTKNY]ahoty}~~~}~}~€‚ƒ†‡‰ˆ†††„‚‚„ƒ€~~|}~~}||||}~€€~{yvsojjkopqrtttrssqrvz€~zsrsuxxtonpruuttsuvwy{‚‚‚‚‚ƒ„…„„„„„„„„||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||||||||||}}}}}}}}~~~~~~~~~~ƒ‰ˆ†„‚‚€€~z}~}|~€€‚…ŠŠ‰†„‚~~}||zyxvromlmmkjnprrssqnorqlklnmieghc][[TWZa`^]`ee_ZWTOSW]baVLOX_djquz}}~~}~€€€‚ƒ……‡‡††‡„‚‚„ƒ€~~~~}~}||||}~€€}zxvsojjknoqrtttrssrsw{€€~ysrsuwwtonpruuttsuvvz~‚‚‚‚ƒƒ„„ƒ„„…„„„„„„„„||||||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}{{||||{{||||||||}}}}}}}}~~~~~~~~~~…ˆ†„ƒ‚‚€}z}~}|~€‚‚ƒ„‰‰Š‡†„~}||zywvrnljllkimprstuqnppqjjkpniegic[YZVW]b`\W\gkfaYTQWZ^baWMOX_fmtvy}}~~}~€€‚‚ƒ„„…††††„……€€}~}||||}~€}zwvsojiknoqrtttrsssuy}€€~ysrsuxwsonpruutsstuwz€‚€‚‚‚ƒƒ……„…„„„…„„„„„„„„||}}||||}}}}~~~~~~}}~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}{{||{{{{zz||||}}}}}}}}~~~~~~~~~~~~‡‡†„‚‚€€{z~€~}~€€‚ƒƒƒ„‰‰Š‡‡…‚~~|{zxwtrnjklljjlorrturmonkhmnonkghicYY[Y\`a^VPZinjbZVX]]_cdZOR[cjpvy{}}~~~~€€€€‚‚‚‚‚‚…‡ˆ†…‚ƒ††‚~}~~}|||||~€€€|{xurniijnpqrtttrrrruy}€€~yrqsuwvqnnpsutsstsvy~‚‚‚‚„„…„†„ƒ„„ƒ‚ƒƒƒƒƒƒƒ||}}||||}}}}~~~~~~}}~~}}}}}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}||||{{{{{{||||}}}}}}}}~~~~~~~~~~~€ƒˆ‡…„‚‚€€zz€~~~~‚ƒ„‚„‡‡‡‰‡…‚}}zxwtqmjjklkjkorrttrmonikoopoliijd[Y\]_b`[QP\ioiaZZ`gdcef]UY^gntwz|}}~~~~€‚ƒ‚‚‚‚‚…†ˆ‡†ƒ„††‚~~~}|||||~€€€€~{zwurniijnpqrtttrrrruy}€€~xrqsuwtpnnpsutssssuz€ƒ‚‚„………„…„‚‚ƒ‚ƒ‚ƒƒ}}}}||||}}}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~||{{{{}}||||}}}}}}}}~~~~~~~~~~€‚…ˆ…„ƒ‚‚€€zz€~}}~~€‚‚‚ƒ…††ˆ‰†‚€}|zxvsqmjhjjkjkoqrtsqnmkkoqpppljjkf]Z\`ac`WNT_koja\]dmlghg`Y\bjqwyz|}}}}€‚‚ƒƒ„‚‚„„†‡†„„†‡„€€~~~}|||||~€€~{zwurniijnpqrtttrrrsvz~€}wrqsuvtpmnpsutsrstu{€„„„…………ƒƒ‚€~}‚‚‚ƒƒ~~}}||||}}}}~~~~~~}}||}}}}}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}||{{{{||||||}}}}}}}}~~~~~~~~~~€„…‡„ƒ‚‚‚€€z{€~||~~~~ƒ…„‡‰†‚~|zxvspljgiillknqrttqmmknrrrppljkle^\^abb]QLWdmojd__eoojkha[_clrwyz|}}||‚ƒ„ƒ„‚‚‚ƒ„†ˆˆ„„…‰†€€~~~}|||||~€€}zyvurniijnpqrtttrrrtwz€}vrqsuvtpmmpsussrsuw|€‚‚„„„„……„‚€~|~|{{€‚ƒ‚‚‚}}}}|||||}}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~~~~~~~~~}}~~~~}}||{{|{{||||||||}~~}}~~~~~~~~~~~ƒ†‡…ƒ‚ƒ‚€}yy||{|zzz}~~‚†‡†ƒ‚‚~~{zwqnmighjmnmnqrttrnlmqrppopljkke]\`deaYNQ\fnnjfcafooiji`Y\dmtxzz|}}}}~€„ƒ……ƒ‚‚‚ƒ…Š‹ˆ„†ˆˆƒ€}~}||{{{~~|zywvsokjknoqrtttrrrsw{€€|uqqsuvromnqsutsssvyƒƒ„„„„„„„€{y{||y{€‚‚€}}}}|||||}}}~~~~~~}}}}}}}}}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}||{{|{{||||||||}~~}}~~~~~~~~~~~€„ˆˆ…ƒ‚ƒ‚€}yz€}}{{zyyyz{}~€‚ˆ‡ƒƒ‚€}}|{wqnmjhikopporstttqnorqpoopnlnkbZ]bfe_VPV`hmligdbgpmffhaXZcnvxzz|}}}}~~€‚ƒƒ€€ƒ„ˆ‰‰…†ˆ‰…€~}~}||{{{~~{zxwvspljknoqrtttrrrsx|€€{uqqsuvqomnrsttsssv{‚ƒƒ„„„ƒƒƒ}yuvxz{y|€‚ƒ€€}}}}|||||}}}~~~~~~}}}}}}}}}}}}||||~~~~~~~~~~~~~~~~~~~~~~}}||{{|{{||||||||}~~~~~~~~~~~~~~…ˆ‡„ƒ‚ƒ‚€{{}|zyxwwwwy{||††„„‚~}}{xqnmkiikoqsqrssstsqrsqqqqppnol_Y]dhe]UR\fknligebhpkcbfb[\dpvy{z|}}}}~~~~€€€‚ƒ„‡‰‡†‡ˆ†ƒ~~}||{{{~~}{yxvvspljknoqrtttrrrty|€zuqqsuupmlnrsttsrrx~‚ƒƒƒƒƒ„„~|wrrtwz{y|€ƒ‚~~}}}}|||||}}}~~~~~~}}}}}}}}}}||||||~~~~~~~~}}~~~~~~~~~~~~}}||{{|{{||||||||}~~~~~~~~~~~~€€‡‰‡„ƒ‚ƒ‚€|{€~}|zxxwvwwy{|}‚„……‚~}}{xqnmkijkoqssuttsusstspqrsrqpol`Z_fhe]TWahnpmigedioibaec^`gpvy{z|}}}}~}}{||~€€€€€‚ƒ…ˆ‰†‡‡†„ƒ€~}||{{{~~|zxwvvspljknoqrtttrrruy|€zuqqsuupllnrstsrrr{€ƒ„ƒƒƒƒ„‚{vsnnswz{y}‚„‚~||}}}}||}~~~~~~~~~~~~~}}}}||||}}}}~~~~~~~~~~~~~~~~~~~~~}}}||||||||}}}}}}}~~~~~~~~~~~~~„ˆ‡…ƒƒ€ƒ‚€€~~€~|~|xxxxvvuw{||‚„…ƒ‚}|||yrnmkkklpruuvtttttuvtqrtsrrqpi`[ajmd[U[dimnkgddglmicdfcadjquy||}~~~~~}||{|~€€€€‚ƒ…††††††„‚€~~}{zzz{}~}{zxxwvtqmklmoqsssrrrruz}yspqrttplloqtssrqt|€ƒƒ‚‚‚‚~xtqpmnrxyz{„}|}}}}}}}|~~~~~~~~~~~~~~}}}}||||}}}}~~~~~~~~~~~~~~~~~~~~~}}}||||||||}}}}}}~~~~~~~~~~~~~~€ƒ†ˆ†„ƒ‚€ƒ‚‚€€€}|}zxxxxvvuwz{|„…„‚}|||zrnmmmlmqswwvtuuttvusrruusrqpi_\dmne[X_fkmmjgdehllidfgecglqv{|}}~~~~~|||z|~€€€€€€ƒ…†††‡ˆ†ƒ~€}|{zz{}~~}{zxxwvtqnllmoqsssrrrrvz}€~wrpqrttpllortssrrw~‚ƒƒ‚~xroommnryyz|€ƒ€~|z}}}}}}}}~~~~~~~~~~~~~~}}}}||||}}}}~~~~~~~~~~~~~~~~~~~~}}}}||||||||}}}}}}~~~~~~~~~~~~~~€€„‡‡…ƒ‚€€ƒ‚€‚€}{|zxxxxvvuvz|}~ƒ…„‚}|}|zrnmoonortxxwvvvttvtsrsuusrqpj_^fnog^]dilnmjfefikkhhhhfeimquz|}}~~~~~||{z|~€€€€€€€€ƒ„……ˆ‰‡„€~€~|{zz{}~~~|zxxwvuqnlmnpqsssrrrrvz~€~wrpqrtsommpstssrsyƒƒƒ‚‚~xtponmlmsyz{}€ƒ‚~{z~~}}}}}}~~~~~~~~~~~~~~}}}}||||}}}}~~~~~~~~~~~~~~~~~~~~}}}}||||||||}}}}}}~~~~~~~~~~~~~~€…‡†…ƒ‚€€ƒƒ€€‚~|{{yxxxxvvtvy{|~~ƒ„„‚}|{{{snloqqrruyyxwvvttusrrtvusrqqj``gnqiccfkmnlifegiiigjjhfgjmqvy{}}~~~}}|{{z{~€€€€€€€ƒƒ„„‡‰‡„}~}{zz{}~~~|zxxwwuqnlmnpqsssrrrrvz~€~uppqrtronnpstsrqu{‚‚ƒƒƒƒztqqponlmtzz{~€‚‚}zy~~~~}}|~~~~~~~~~~~~~~~}}}}||||}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}||}}}}}}}}~~~~~~~~~~~ƒ‡ˆ…‚‚‚‚€‚~|z{yxxxxvvuvxz|}}‚„ƒƒ€}z{|ytomprstuw{{zxwuttvtrruuttrqrmedjoolghknonigfeghggimkigjloqvz||}~}~~}}{{z{}~~€€€€€€‚‚„†‡†„}~€}{{{{|~}|{zxxwvupnmmoqqrssrrrtx|€~vqpqstqnlmpsssrrx‚ƒƒ€ytrponnmlnswy{‚~{zy~~~~}}|~~~~~~~~~~~~~~~}}}}||||}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}||}}}}}}}}~~~~~~~~~~€‚…ˆ‡„‚€€€‚‚€‚€}{yzxwwxxvvvvvutu{‚…„ƒ€}z{{zvompsuwx{{{|zwvuuvuttttsrrqrnhgmponjkmpokeedcdfccjmljiknpswz||}}}~}{{{zy{}~~~~~€€‚„………„~~~|{{{|~}|{zxxwvuqnmmoqqrssrrruz}€€|tqpqstqmlmpsssrsz€ƒƒƒ}ztqqponlklotyy{‚}zyy~~~~~}|~~~~~~~~~~~~~~~}}}}||||}}}}}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}||}}}}}}}}~~~~~~~~~~€„†ˆ†ƒ‚‚€‚ƒ|ywxxwwxxvwwvtomny‚…„ƒ€}zyzzwqnqsuwz}}}}|xwvvvuvvssqppoqojjoppmlmpqohbacbabadjmlkkmoqux{||}|}}}zzzzyz}~~~}}€€‚ƒ„„„„ƒ~€}{{{|}|{{zxxwvuqnmnpqqrssrrruz}€{tqpqstpllmpsssru{ƒƒƒzsppooonkjmpvz{}€‚‚€}zxx~~~~~~}~~~~~~~~~~~~~~~}}}}||||}}}}}}}}}}||||~~~~~~~~}}}}}}}}}}}}||}}}}}}}}~~~~~~~~~~€…‡ˆ†ƒ€€‚‚€‚„{xvwxvvxxwxxxslijt…„ƒ€}zyzzytqptuw{}€~}zywwvvuussqponpolmpqqmnoqqpf_`aaba_djnnkloqrux{|}}}}}|zzzzyz}~~~~~€€€‚ƒƒ„„ƒ€€}{{{||{{{zxxwvuqnmnpqqrssrrruz}€~ztqpqstollmpssssw~‚ƒƒƒxqooooonlkmqxz|~‚‚|yww~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~€ƒ‡‰†ƒ~~‚ƒ‚~ƒ…|ywwvvvwyxyxxqmjjr€†„‚}yzz{yvsqtvy|~yxwvvutsssponloqoorrommprqmd__aaa`_flonmnpprvx|}}}}}|{{{zzz{}~~~~}~€€€€‚………~€}{zz{||{zzzxxwvuromnqqrssrqqruz}€€~ysqpqqqnkkmqsstu{€ƒ„„ƒtpoooomlkjntwy|€~yxww~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~€‚…ˆˆ†ƒ€~}€‚„‚€€ƒ…€|ywwvvvwyzyxwqmjjq†…‚|||{yxvsux{|~€zyxwvvttrronmkorqqsromnpsqnd__acb`djlommnpqsvz|}}}}}|{{{zz{{}~~~~}~€€€€„……‚~~}{zz{||{zzzxxwvuromnqqrssrqqruz}}xtppqqqnkknqssuw}‚ƒ„„‚|ronnnnmlkjnuwy|€~yxww~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~€ƒ‡ˆ†„„€~~ƒƒ‚€€„„€{ywwvvvwxyxwuqmllp}……‚}{zwuvwz|~€|{zxvvutrqnmmmpssttspnorsrnfbbcdccglnplloqrtwz|~}}}}|{{{zz{{}~~~~}~€€€‚„…‚}~|zzz{||{zzzxxwvuromnqqrssrqqsvz}~~|wtqpqqqnkknqssvz€„„ƒ„‚xponnnnmlkjnuxz}€€~yxww~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~€„‰ˆ…ƒ„~}€‚ƒƒ€…ƒ{ywwvvvwxyvuuromnoz„†‚€€€~}{zwwwz{~€|{zywwvttpmmnppsuvvupoprtsmhddcddegkopmloqrtx{}}}}}}|{{{zz{{}~~~~}~€€~~~€‚ƒ‚~~|yzz{||{zzzxxwvuromnqqrssrqqswz}~~|wsppqqqnklorrrx}ƒ„„ƒ„€unmoommmlkjnuy{~‚‚€~yxww~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}}|~~~~~~~~~}}~~~~‚†‡†…ƒ‚}}ƒ„ƒ€„{ywwvvuwxxuttsqpmn{…†ƒ€€€€~|zxwxy{}~€~{yyyxvuutqnnprstvvwvsqprutpidddeeehmpomnprsuz|}}}}|||{zzzzz{}~~}~~€€€€€€€~~~~~~{yxx{||{zzyyxwwtqonnpqssrqpqtx{}|||vrppppomllorsuz‚ƒ„ƒ„~rnlnommlkkkntxz€€{yxvv~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}}|~~~~~~~~~}}~~~~€„‡ˆ…„‚~|~€‚ƒ„ƒ„|ywwvvvwwvtrsvvsop{…†ƒ~}|zxyyyyy|~~|zzyxwvvurpprtutvvwwusrsuvrkfeeeefioqpnpqstv{|}}}}|||{zzzzz{}~~}~~€€€€€€€~~~|{yy{||{zzyyxwvtqonnpqssrqpqty|}||zuqppppomllortw|ƒ„„ƒ‚{ollmnmmlkkkntx{€€{xwvv~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}}|~~~~~~~~~}}~~~~…‰‡…ƒ}|~€‚ƒ„„„€}ywwvvwvvurrrxzuss}…†„‚€€~{zzzzyzz|}~}|{zyxwvwvsrrsuvvwwyyxvstvvsnjhgfegipqppprtuw{|}}}}|||{zzzzz{}~~}~~~€€€€€€€€€€€}~|zz{||{zzyyxwutqonnpqssrqpqty|}||ytpopponmlmpstw|‚ƒ„„ƒwlllmnmmlkkkovz|€€~zxvvv~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}}}}}|~~~~~~~~~}}~~~~†‰†„ƒ€}{~‚„„ƒ€~ƒ„€}ywwvvwvvtqqrz}ywx~…†„‚‚‚€€~}{zzy{{{{}~}|}|{yxxwwwuttuvxxxy{zzwstwwtpkjiffgipqpqqruuw|||}}}|||{zzzzz{}~~}~~}~€€€€€€€€€~}|{zz{||{zzyyxwutronnpqssrqpqty|}||xspoppommlnpsvy~ƒ„„„‚~tlkmmnmmlkkjov{~€‚€~zwvvv~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}||}}~~}~~~}}~~~~…ˆˆ…„€}|}‚„„„‚~‚ƒ€}xwwvwwvuropsy}{|}€…‡†‚‚‚€~}|zzyzz|||}~}~~|{zyxxxvuvvvwwyy{|}{wvvwwtomjhgikqqqqsvvwz||}}}}}|{z{zzzz{|~~~~€€€€€€}}{zzz|{{z{{zxvtttsqoopqrrrrorv{}}|zuroooonmlmnprv{€‚ƒ„‚€{pllmmmlkkjilqx{€€}yuutv~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}||}}~~~~~~~~}}~~~†ˆ‡…ƒ€~{|~€‚„…ƒ‚~‚‚€~ywxwxwutrpoqwz|~€ƒ‡†‚€€€€}{z{{{{|||}~~~~|{zzyxxwwwwwxxzz|}}|xwvwwvspmkijmrrsruwwy{||}}}}}|{z{zzzz{|~~~€€€€€€~~{{|{{{}|{z{{zxvtttsrpopqrrrrprw{|||xtqoooonmlmnprx}‚ƒ„‚~vnllmmmlkkjilsx||xuutv~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}||}}~~~~~~~~}}~~‚‡ˆ‡…ƒ|{~€‚„…ƒ~}€‚€|xxxxxvsspmotw}€€††ƒ€€€€~{z{{|||||}~~~~|{zzyxyxxxwxxxz{|}}|yxvwwwurpnlmnsttuvyyy|||}}}}}|{z{zz{z{|~~~~~€€€€€€}|xz{}}{|||{{{zxvtsssrpopqrrrrrtx{}|zwrpoooonmlmnpty‚ƒƒƒ|smllmmmlkkjjmsx|€‚~{vuutv~~~~~~~~~~~~}}~~~~~~}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}~~~~~~~~}}}}}}||}}~~~~~~~~}}~~ƒˆˆ†…‚~{{~€‚„…ƒ~}€ƒ~€{xxyyyvtqomnrx|€€ƒ†„€€€}{{{|||||}~~~~|{zzyxyyyxwxxxzz|}}|{zvwwxvsrqppqtuuwx{{z}||}}}}}|{{{z{{z{|~~~~~€€€€€~|zuvz~~||}|{zzzxvtrrsrpopqrrrrrux}{{zuqooooonmlmnpu|‚ƒ„ƒyqmklmmmlkkjjmsy|€‚‚}zuuutv~~~~~~~~~~||~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}~~~~~~~~}}~~„ˆ‡†ƒ€~||‚‚„ƒƒ€€|xxzzyxuqommrw|}||ƒ†„€€€€~~~~~~~~~|}{zyzyzyyxxwwxy{}~~}|{wwvvxxvtsqsuuvwz||{}~~}}}}}|||{zzz{{}~}}€}|{xuuy~~}{{zzzzxvtrrssqpprrrqqruy|{{ytqoooooomkmnqu{ƒ‚€yqmkllmlkkjiinty}‚‚|xvvvuv~~~~~~~~~~}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}~~}}~~~~~~~~~~~~†‡†…‚}||‚‚ƒ€ƒƒ€€{zzzzyvspnlqv{~}zw€„ƒ€€€€€€€€€€€€~~~||{zyzyzyzxxwwxz{}~~~}{zxwwzzxwutuvvyy{}}{}}}}}}}}|||{z{{{|~~~~€~|||yvvz~€}{zzzzxvtrrssqpprrrqqrw{|{zwspooooonmklorx}‚ƒ‚~wolkllmlkkjiinty}‚‚|xvvvvv~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}~~}}~~~~~~~~~~~ƒ‡†…„}|}}‚‚ƒƒ„‚~€|y{z|zwupomqv{}~{w~‚‚€€€€€€€€€€€~|{zzyyxyyzyxwwxz{}~~~}{|zzyz{zywwwxy{|}}}z|||}}}||||||{||{|~~€~||}|yxz}}{zzzzxvtrrssqpprrrqqsx{}zywsonoooomlkkns|€‚ƒ‚€|tnkkllmlkkjiintx|€‚€{wuuuuu~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}~~~~~~~~~~~ƒ‡†…ƒ€|}~~‚‚ƒ€‚„„‚~€{y{|}{yvrporwz|}|{}‚‚‚€€€€€€‚‚€€~|{zzyyxyyzyxwwyz|}~~~}{{z{{z|{yzyyz|~~||z{||}}}|||||}|||{}~~€~||||{yz}‚„‚}{zzzzxvtrrssqpprrrqqty{|yxvromoooomlkjms}€‚ƒ‚€{rmlkllmlkkjiintx|‚‚{wutttt~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||}}~~~~~~~~~~~~~~~~€…‡……ƒ||}}€€€ƒ„‚‚ƒ‡„~€‚}zz}}{zwtqorvz{|{|‚ƒ‚€€€€€€€€€~|{zzywwyy{zyxwx|}~~~}|||||||||{z{~|z{yyz|}}||}}}}}}}}}~~~~~~€}}{{|z{‚‚~zyyyxxwusqrtrqqsrrrrvz||zxtrpnnnommkijnu}€ƒƒ‚€€yrmklmmmkkkjjjouz~}yuttttt~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||}}~~~~~~~~~~~~~~~~…‡…„‚{||~€ƒ„ƒƒ†ˆƒ~}€}yy}~|{yvroruyyy{}‚„ƒ€€€€€€€€€€€€€~|{zzywxyy{{yxwy{|~~~~~~~~}}|}|{z|~~{yzyyz|}}||}}}}}}~~~~~~€~~€€}}{{{||‚‚}zyyyxxwusqrtrqqsrrssvz||zxsqpnnnommkjlpxƒƒ‚€xqlklmmmkkkjjlpv{}xtttttt~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~„†„ƒ~||}~€ƒ„ƒ„ˆˆ„~}€~zwx|}|zwsqrtwxx{}ƒ„„€€€€€€€€€€~|{zzyyyyy{{zyxxx{}~~~~~~~~~}}}|||}|yxyyzz|}}||}}}}}}}}~~~~€€€‚€~~}}{{|}}€}{zyyyxxwusqrtrqqsrrstw{||zwsqpnnnommkklrz€‚ƒ‚€}vqlklmmmkkkjjlpvz|vtsssss~~~~~~~~~~~~}}}}~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}~~~~~~€€€€~~~~~~„†„ƒ~||~~~~€ƒ„ƒ†‡†ƒ}|~{wvw|}{xtrqtuwy|~€ƒ…„€€€€€€€€€€~|{zzyyyyy{{zyxxx{}~~~~~~~~}}~~|yxxzyzz|}}||}}}}}}}}~~~~€‚ƒƒ‚}}}}||}~~€}{zyyyxxwusqrtrqqsrrrtw|||ywropnnnommkknt|‚‚ƒ‚€|upkklmmmkkkjjmqwz|vtsssss~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}}~~~~~~~~~~~~~~€ƒ…„‚€~|}}~€ƒ…‡ˆ„‚|{~€{vtty€~{yusrruxz}€„„€}}{{{zzzxxxz{zxwwy}~~~~}}}}~{xxy{|}{}}|||}}}}}~}}~~~~‚ƒ„‚‚~}}{|{{}~€}|yzzxxywusqstrqqsrrsuz{||zvroooooomlkjnw~ƒ‚ƒ‚ztnljkllljjjiimrv|€‚{vsrrrrr~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}}~~~~~~~~~~~~~~€ƒ……‚}|~}~€„†‡‡ƒ||~€{vtux~€|zwtrquy{~€€ƒ„€~~}}||{{zzxxxz{{xvvx|~~€€~}}}}}}}yxy{|~}~}|||}}}}}}}}~~~~ƒ„ƒ‚€~}}|{{{}€}|yzzxxywusqrsrqqsrssv{{{{yvqoooooomlkkqy€‚ƒƒ„‚yrnljkllljjjiilrw}€‚€{usrrrrr~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}}~~~~~~~~~~~~~~€ƒ……‚~||~}~€‚…†‡†‚€~~}~€|wuvy~€€}{xurquy{}€~~€„€~~}}||{{zzzzz{{{xwvw{~~~€€~}}}}}||yxy{}€~~}|||}}}}}}}}~~~~€‚ƒ„„ƒ€}}|{{~€~|yzzxxywurpqrrqqsrstw{{{{xuqoooooomlkmt{ƒƒƒ„~xpmkjkllljjjjjlry~€‚~yurrrrrr~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}}~~~~~~~~€ƒ…„}{|~}~€ƒ……‡…‚~~}~€}xuvy~€~|yvsruz|}~}|€„€}}}}}}{{zzzzz{{{xwvwz}~€€~}}}}}||yyy|~€~}|||}}}}}|~~~~~~€ƒ„…ƒ€€}}|{}€€~|yzzxxywuqpqrrqqsrsuy{{zzxtqoooooomlknt{‚ƒƒ‚}wpmkjkllljjjjjmsz~€‚}xurqqqqq~~~~~~~~~~~~~~~~~~~~}}}{~~~~}}}}}}}~~~}}}}}}}{||||||||||}}~~~~€€~~~~~~€~|~€„„ƒ‚~{||}~~ƒ…‡‡ƒ~~~|~€}xvwy}€~}zwtux{z{}{y{‚‚€€~~~~~~~~~~~~~~~~~~|{{z{zx{|{yxwxxz}}}~~}}~{yz{ƒ‚€~~~}}|~}}}}}}}~~~~~~€„„„„‚~}€~€|zzzyxxwuqooprrrrrsv{||zyvspooooonlkknv~‚„„ƒ|uplkkkllmkkkijotz~€€€{xusrqqqr~~~~~~~~~~~~~~~~~~~~}}}{}}}}}}}}}}}~~~}}}}}}}{||||||||||}}~~~~~~~~~~€}ƒ„„ƒ{||~~~ƒ‡ˆ†ƒ€~~~|~€}wuvy}€~}|xuwz{yz{ywx€‚~~~~~~~~~~~~~~~~|||z{zx{||{yxwvx{}~~}||}}~|{zz}€ƒƒ‚€~€€~}|}}}}}}}}~~~~~~~~€„„„„ƒ€}€€~€‚€|{zzyxxwuqooprrrrstx{||zxuspooooonlkkpy„ƒƒƒ{tollkkllmkkkijpu{€€€{wtrqqqqt~~~~~~~~~~~~~~~~~~~~}}}{}}}}}}}}}}}~~~}}}}}}}{||||||||||}}~~~~~~~~~~~~€~~~€„„„ƒ‚~||~}~~‚…‰‰…ƒ~|~€}usuz|~€€|yxy{{xyyywx~€~~~~~~~~~~~~~~~~~}}}||{y|}}|yyxwxz|~~}||}}~|{zz~„„ƒ€~}}}}}}}}}~~~~~~~~€„„„„ƒ}|~~€|{zzyxxwuqooprrrrsuy{|{ywtrpooooonlkmqz„ƒƒƒ~yspllkkllmkkkjkpv|€zvsrqqqrt~~~~~~~~~~~~~~~~~~~~}}}{||||}}}}}}}~~~}}}}}}}{||||||||||}}~~~~~~~~~~~~€€~~„……„ƒ€}|}}~„‡‰‡…ƒƒ€~|~€|tru{|~‚}xy{}{xyxwwx}~~~~~~~~~~~~~~~~~~~}}}|z}~|{{zywxz{}}}||}}}{zzƒ„„ƒ€€€~}}}}}}}~~~~~~}}€„„„„ƒ€€}}€|{{zzxxwuqooprrrrtvz|}{wvtqpooooonlkot|„ƒƒ‚€}wrollmlnnmkkkjkpv}€‚‚zusrqqqsv~~~~~~~~~~~~~~~~~~~~~~~~~~||}}}}~~~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~~€€€~~…†……„|||~}€‚…ˆ‰…„„„‚~z}€|usw{|}ƒ‚~||||yxxxwx}~~~~~~~~~~~~~~~~€~~€~~~}{|}}||zzyyyy{}~€€€~}}~~~~|zzƒ…„‚€€‚ƒƒ€~~}~~~~~~~~~}~~|~€‚ƒƒƒƒ‚‚‚‚‚‚~€€|zyzzyxvtonoprrrstv{||zvvsqpooooonmlnu~‚ƒƒƒ‚€|uqomllmmmmkjjjmqw|€ytsrrpqux~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~~~~€‚‚~€‚„†……†‚}{|~~ƒ††‡‡„„……„~z}€}vtx|}}€ƒƒ~~~}zwxxxy}~~~~~~~~~~~~~~~~€~~€€~~~|}~~}}z{{zyy{|}~~}}~~~~|{{ƒ…„‚€€‚„ƒ€~~}~~~~~~~~~}}}|~€‚ƒƒƒƒƒ…„ƒƒ€€€€€€}{yzzyxvtonoprrrsux|}{yvusqpooooomlloxƒƒƒƒ‚€{tqomllmmmmkjjjnrx}€~xsrrrprwz€€~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~~~~€ƒƒ~„††…†ƒ{{~€…‰ˆ†…‚‚………‚y|~yux|~|ƒƒ€}zxxyy{|~~~~~~~~~~~~~~~~€€€}}|}~~}~||{z{{z{{}~}}}}}~~}{{€ƒ…ƒ€€‚‚€€~~}~~~~~~~~~}}}~€€‚ƒƒƒƒ…†„„‚‚ƒ„„ƒ‚€}|zzzyxvtonoprrrswz}}{yussqpooooomknqz‚‚ƒ‚xsqomllmmmmkjjkosz~€|wsrrrqtx{€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||||||||}}}}~~~~~~~~}}€‚‚€~€‚„††…†„|{‡‰†…‚€‚‡‡…ƒ€y|~{vx|~|ƒƒ€}yxyy{||~~~~~~~~~~~~~~~~€€€€}||}~~~~}|{{{{z{z|~~~}}}}}~~}||ƒ…„‚€€‚€~~}~~~~~~~~~}||~‚€‚ƒƒƒƒ„†„„ƒ…ˆ‰‰†……€}}{{zyxvtonoprrrsx{~}zxussqpooooolkns|‚‚‚‚wspomllmmmmkjjkosz€|vsrrqsuy|~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||{{||||||||}}}}~~~~~~~~~~~~}……††…„||ƒˆ‰…ƒ€‚†‡†ƒxy€}xx||z|‚ƒƒ€~~ywxyz{}}}}}}~~~~~~~~~~~~€€~||||~}}~~|||||{z{||}|||{}~}}||}„…ƒ‚‚‚€€~~~~}}~~~~}||€‚‚ƒƒƒƒƒ„„„„†‡‹ŒŒŒŠˆƒ€~{{zyxwtpopqqrrux|~|zxurrqonnnmmklnu~‚‚‚}urpnllmmmmmliilpw|€€{vsrrsuw{~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||}}}}~~~~~~~~~~~~}~€……„„…†ƒ|„‡‡‚€~…††„ww~~zz}}z{ƒƒ‚€~~{xxyz{}}}}}}}}~~~~~~~~~~€€~}}}}~}}~~}}}}||zz{{|{{|z||}}||}……ƒ€~}~‚‚€€~~~}}~~~~}}„„ƒ‚ƒƒƒƒƒƒƒ„„‡ˆŠŒŒŒŠˆ…ƒ~}yyxwtpopqqrswz}~|zxtrqponnnmmklpx‚‚€|uqpnllmmmmmmiimry~€zvsrstwy}€~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||}}}}}}~~~~~~~~~~~}€€‚††ƒ‚„……|…‡„€}|„…†„uv}‚zz}}zy~‚‚€~~|zxyz{}}~~||}}}}}}}}~~~~€€~}}}}~}}~~~~}}||{{{{{{{{z|||}||}„„‚}|}€€~~~}}~~~~}~†…„ƒ€‚ƒƒƒƒ‚‚‚…ˆ‰‹‹Š‡……‚{yywtpopqrrtx{}~{ywtrqppnnnmmklqz€‚‚‚~ztromllmmmmmmiimry~yutssuy|€}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||}}||||||||}}}}||~~~~~~~~~~}~~‚„††‚„††ƒ|„†‚}{{~€‚ƒ†„~tu|‚€{{~~zx|‚€~~{yxyz{}}~~{{||||}}}}~~~~€€~~~~~~}}~~~~}}||{{{{{{z{z{{||||}„„‚}|}€€€~~}}€‚„ƒ‚€‚ƒƒƒƒ‚‚„ˆŠ‹ŒŒ‡…†‡…‚}yywtpopqrrty|}~{yvurqpponnmmjlqz€ƒ‚‚}ysqnlllmmmmmmiimrz~€yuutsvz~€€€€€€~~~~~~~~~}}}}~~~~||}}}}}}}}||||||||||||}}}}}}~~}}~~~~~~~~~~€‚„…†€‚…†„~~ƒ„€zz}~€€ƒ‡…~usy€€|{~|zy{‚€{yyxz{}}~~|z||||||}}~~~~~€€€~}}}~~~~~}}}~}|||||z|{{zz{{{{}}„„‚}|}€€€€€~~}~ƒƒ„„„„ƒ‚‚„ˆ‰‹ŒŠ‡……ˆˆ„}zxwspooqqsvy}}|ywusrpooooonmklr{€‚‚‚€~xsqolllllmmmmkjns{€€~yvtrsv|€€€€~~~~~~~~~}}}}~~~~||}}}}}}}}||||||||||||}}}}}}~~}}~~~~~~~~~~€ƒ…†…€………€‚„€zz{}~‚††~usy€€}|~|{zz~€{zzxz{}}}~}{||||||||~~~~~~~€€€~}}|}~~~~}}}~}|||||{{z{zzz{{{}~ƒƒ}~|€€€€€€€€€~}€€}||ƒƒ„„ƒ‚„‡ˆŠŒŒ‹Š†„…ˆ‰„€~ywspooqrswz}}|xvtsqpoonnnmllnt~‚‚‚€~xrpmlllllmmmmjint|€}wttrtx}€€€€~~~~~~~~~}}}}~~~~~~}}}}}}}}||||||||||||}}}}}}~~}}~~~~~~~~~~€‚„…„~„…„‚ƒ‚|z{}}}††~usy~}~{z{€€€~~|{{zz{}}}~~}||||||||~~}}~~~€€€~}}|}~~~~~~}~}}}|}}||{{zzzz{{}~‚‚€~|}~‚€€€€€€€€€~€€}||ƒƒ„„„‚‚„‡ˆŠŒ‹‰†‡††‡‰‡„‚{wtqpqrsty{~}{xvsrpqonnmmmklov~‚€~xqomlllllmmmmjjou|€€}wttsvz~€‚€€€€~~~~~~~~~}}}}~~~~~~}}}}}}}}||||||||||||}}}}}}~~}}~~~~~~~~~~€„……~~……ƒ€ƒ‚~{{|}}††~usy‚€~{z{~€€~}}}{{zz{}}}~~}{|||}}||~~}}~~~€€€~}}}~~~~~~~}~}}||}}}|{zzzzz{}~‚‚€}|}~ƒƒ„ƒ€€€€€€€€€€~|}}‚‚„„ƒ‚ƒ„†‡‰Œˆ‡…†‡‡ˆŠŠˆ„}vsrqqssuz}~|zwusqpqpnnmmlklpw‚€€€}xqomlllllmmmmijov}€€}wtttw|€€~}~~}}~~~~~~~~~~}}}}}}||||||||||}}}}~~}}~~~~~~}}}}}}~~~€‚„„„~€„†„‚‚ƒƒ€{{{|~‚††}svy‚€€~|z|~€€~}}~~||{z{{|}‚~|zz||}}~~~~~~~~~~~~~~~~~}}}}}~~}|||~}{z{yzz{{|~~~~~€ƒ„„ƒƒ€€€€€€€€€€€}}}€……„‚‚‚„…††„ƒ‚‡‰ˆ‡ˆ‹Š†xsrrrqtx|~}{zvsrqqppnnmkkjkqy€€€€}wqonlmmmmlllkjkou~€€{trtux|€~}~~}}}}~~~~~~~~~~}}}}}}||||||||||}}}}~~~~~~~~~}}}}}}~~~€‚„„„€€ƒ†…„„„„‚{{{|‚‡†~ssw}€€€~|z|~}||~~~}|{{z{~……€|zz||}}}}~~~~~~}~~~~~~~~}}}~~~~||||~~~}{{zzz{{|~~~}~€‚ƒ„„ƒƒ‚€~€€€€‚€€}}~€‚‚……„‚‚‚ƒ„ƒƒƒ‚…†‡ˆ‰‰‰‰ƒ|urrrquz~|zxurqqqppnnmkkjlr{€€€€€€}wponlmmmmlllkkkpvztruvy}~}~~}}}}~~~~~~~~~~}}}}}}||||||||||}}}}~~~~~~~~~}}}}}}~~~€‚„„„€€ƒ…†„……†ƒ|z{|ƒˆ†tqu|€€~|z{}~~|{z|}~|{{{|‚†‡{zz||||}}~~~~~~}~~~~~~~~}~~~~~|||||}~~}{{{{{|~}}}€‚‚„„„ƒƒ‚~}€‚€‚‚€€}}~€‚ƒ„††„‚‚‚ƒ‚‚‚„ƒ……ƒ‡ˆ‰ˆ‰ˆˆxtsqqv{~|ywsrpqqppnnmkkjmt|€€€}wponlmmmmlllkkkrx€zutvx{}€~~}~~~~}}~~~~~~~~~~}}}}}}||||||||||}}}}~~~~~~~~~}}}}}}~~~€‚„„„€€‚…†………†ƒ~z{|ƒ‰†tsv|€€€~|z{|~~{{yz|}|||~„‡‰„|{{||{{||~~~~~~}~~~~~~~~~}}}||}~~|{|{{|~||~€€‚‚„„„„ƒ‚}|€ƒ„ƒƒ‚ƒ‚‚€€}}~‚ƒ††„‚‚‚‚‚„……ˆƒ…‡‡…ˆ†Šƒ|wsrsw}€~{xvsqpqqppnnmkkjmu}€€}wponlmmmmlllkkkry€xttwz{}€}€€€€~~~~~}}}}~~~~~~~||||||||||||||||||}~~€~~~~~~}}}}}|}}}}~‚„„‚€€€„††……‡ƒ~z{}ƒ‡…€wwx}€}{|}}{zxxx|~}}}}€‚†‰Š‡~{zzz{{{{}~~~~~~~~~~~~~~~}}~~~|}}~~€}|||}}|}~€ƒƒ‚ƒ„}{zƒ†††……†„€€~|}~€€‚††„‚‚‚ƒƒ…†…„ƒ……€‡ˆ‰†~wtrry}€{yvqppqqpponnllknw€€€~woommmmmmmmljilsz€€~ytuwz}~~{€€€€~~~~~}}}}~~~~~~~||||||||||||||||||}~~€€~~}}}}}|}}}}~„„‚€€ƒ……††‡‚}xy~…‡…‚{zz~€€}|}}|{ywvv{~~}~~‚„†‰‹‰{{zz{{{{|~~~~~}}}}~}}~~~}}}}~}~}~}}}€€€~}||||}~€€ƒƒ‚‚„~{z}„††…†‡ƒ€€}{}~€€ƒ††ƒ€‚‚‚ƒƒ„…„ƒƒz‰‘Œˆyttt|~€zxupppqqpponnlkjnv‚‚€€|upnlmmmmmmmljimt{€€~xuvy{~€€}z€€€€~~~~~}}}}~~~~~~~||||||||||||||||||}~~€~~}}}}}|}}}}~€ƒ„‚€€„„†††}xy}†‡†ƒ€}}~€€€€~}}}{zxvtuy|}~€€„‡ˆŠ‹Š„{{zz{{{{{}~~~~}}}}~~~~~~}}||}~~~}~}}|}}€€€~||||}~€‚‚‚‚‚„|z|‚ƒƒ„†‚€|{}~€„……‚€€‚‚ƒƒ„…„ƒ€}{‹—‹†yyy€~zwtpppqqpponnljinv€‚‚€€{tonlmmmmmmmljinuz€~}xux|~€€{x€€€€~~~~~~}}}}~~~~~~~||||||||||||||||||}~~€€€~~}}}}}|}}}}~€ƒ„‚€€€€„„……†~yy{€†‰ˆƒ€~~~€€€€~}}}{zwusty{|‚‚ƒ†ŠŠ‹‡}{zz{{{{{|~~~~~~~~~~~~~|{||}~~~~~}}|}|€€~||{{|~€‚ƒƒ€‚„|z|}‚„…‚€~|{}~€„……‚€€‚‚‚‚„…„ƒ€}~•‹†€}|~~~zwtpppqqpponnljinx€‚‚‚€|unnlmmmmmmmljjnuz€~|vtx|€€{w~~~~~~~~}}}}~~}}}|||||||||||||{{|||~~~‚‚ƒ~}}}}}||}}~~}‚ƒƒ€€€‚ƒ………ƒ}{|€…†‡„~~}~~}|}|{ywtttwy~‚„…ˆ‰‰ŠŒŒŠ{zzzz{||}~~~~~~~~~~~~~~}{{y||}~~~~~~}|~€€~|{{{|~ƒ‚€€‚ƒ‚~|}|~€ƒ~~{|~~€‚…ƒ‚€€‚‚‚ƒƒƒƒƒƒ‚€}€‘Ž‹…}|}{yvrooqqqooonmkhjoyƒ€|unnlmmmnnnmkiknv|€€{vuy}€€~xv~~~~~~}}}}}}}}}||||||||||||||||||~~~‚ƒ€~}}}}}}}}}~~~‚ƒƒ€€€ƒ„„…„ƒ„††…ƒ~~}}~~}|}|zxvsssuw|€ƒ…†‡‰‰‰‹ŒŒ„|zyz{{||}~~~~~~~~~~~~~~}{{y||}~~~~~~~~€€~|{{z|~‚ƒ€‚ƒƒ}||{}~‚€~~~{|~‚…ƒ€‚ƒƒƒƒƒƒƒƒ‚‚~‰Ž’‘‰}zxyzxvrooqqqooonmkijr{€‚€|tnnlmmmnnnmkikox~€€{wwz}€€|vv€€~~~~~~}}}}}}}}||||||||||||||}}|||~~~€ƒ„ƒ~}||}}}}}}~~€‚ƒƒ€€€ƒ„„„„……††‡ˆ‡…ƒ}}}~~€~|{{{yvursrtw|€‚„‡ˆ‰‰‰‹Œˆ~zz{||||}~~~~~~~~~~~~~}|{{}~~€€~~~~€€~|{zz|~ƒƒ€€~~€‚ƒƒ}|||}}}‚‚€~}~{|~‚…ƒ€‚‚ƒƒƒƒƒƒƒƒƒƒ‚ƒ‰’ˆƒ{yxxxyxvspoqqqooonmkjkt}€‚€{rmmlmmmnnnmjhkqx}€€{xy|~€€€ytu€€~~~~~~}}}}||}|||||||||||||||}}|||~~~€ƒ„„ƒ~}{{}}~~}}~~€‚ƒƒ€~€€‚ƒƒ„…†‡‰‰ˆˆ††„€||~~€~{zzzxvurrqsv{€ƒƒ…‡‰‰Š‹Ž‹}||||||}~~~~~~~~~~~~~~}|}}~€€~~€€~|zyy|~‚~|}}€ƒƒ}||}||}‚€~}~{|~€‚‚…ƒ€‚ƒ„„ƒƒƒƒƒƒ……ƒƒ…Š†|vv|zywyxsqoqqqooonmkkmt~€‚€{qlllmmmnnnmjhksx}€€{xz€€€~vrt~~~~~~}}}}}}|}||||||||||||||||||}~}}„……„€}|||}~~~€‚‚ƒ‚€€€€€‚„„……‡ˆˆˆˆ‡†„}|~~~~}{zzzwvtsqqqtx}‚‚…‰‹‹Œ‡}{|}|}}~~~~~~~~~~~~~}}}}€~~~~~€~}}{xz{€‚|}~€„„~|{|}{{|€€€}||~‚„†ƒ€‚„„„„ƒ‚ƒ„„………„†ŠŽŠƒ~{wrz{tw|ysppqpomnmmkjms€€zqmmlmmmnnmliilty}€~zxz~€}tsu~~~~~~}}}}}}|}||||||||||||||||||~~}}„„……}|||~~€€‚‚ƒ‚ƒ‚€€€„„„„…‡‡ˆˆ‡†„~|}~~~~|{zzywvtrqqqtw|„ˆŠŠŒŽŠ~||}|}}~~~~~~~~~~~~~}~~~~~~}}~€€~}}{xy{€€€~{|}ƒ‚}{|~||}€€€~~}||~‚…†ƒ€€‚ƒ…………ƒ‚„„„„„…„‡Š‡€zwrv‚‚}wv||urpqpomnmmkjmu€‚‚€€yqmmlmmmnnmliimtz~€~zz|€€€{trv~~~~~~}}}}}}|}||||||||||||||||||~~}}ƒ„……‚~||}€ƒƒ‚‚ƒ‚ƒ‚€€€~~€ƒ„ƒ‚…‡ˆ‡…„~|}~}~}|zyxxuutrrrqsv{‚€‚†ˆ‰‹‹ƒ|{||}}~~~~~~~~~~~~~~€€~~~}}}}||}~€~}}{yy}€~}{|}€ƒ‚€~|}}|~€€€~~}||~‚…†ƒ€€‚…‡‡……ƒƒ…„„„„……ˆ‹Œ†~wrq{ƒƒ€{wz|vsqqpomnmmkinw‚‚€€xpmmlmmmnnmliinuz~€~{|~€€€€~xssw~~~~~~}}}}}}|}||||||||||||||||||~~}}ƒ„……„€||~€ƒƒ„„ƒƒƒ‚ƒ‚€€€€~~€‚ƒ‚~~‚‡ˆ‡…„~|}}}~|{yxwvsstsrrqrvz~‚…‡‰‹‹Ž‡~|{|}}~~~~~~~~~~~~~~€€~~~}}}|zz{}~€~}}{yy}€~|{{{}€ƒƒ€~}€}}~€€~}||~‚…†ƒ€ƒ‡‡ˆ……ƒƒ…ƒ„„„†ˆ‰‰…|tor}…‚‚|vx{yrrqpomnmmkhnw€‚€€xommlmmmnnmljiov|€~||€€}wrsx~~}}~~}}}{||||||||||||||||}}}}~~~~~‚…†„}|~€‚ƒ„„††……„ƒƒ‚„‚}}‡ˆ…„„~|||}}|zwvxvttusssrsvx|€‚ƒ„†‡‰‹ŒŽŽŠ€|{|}}}~~~~~~~~}}~}}}}|}|{zxz{|}{zz{€€~{||{|~‚†ƒ€€€~~€~}{|‚ƒ…„‚„ˆ‰ˆ†…„…†………„„…‡ˆ‹†|tos}ƒ€~€}vv|xsrpponmkkioy€€‚€€~wpmmllkmmmkjhinv|~}€€€€€{rru{~~}}~~}}}{||||||||||||||||}}}}~~~~~€‚…††‚~}ƒ„„„††……„ƒƒ€€€€‚„‚~{}‡ˆ…„„€|{}}}}|zwwvussutssstvx{‚ƒ„ˆ‰‹ŒŽŽ„~||}}}~~~~~~~~}|~€~~|||}|{z{{yyy|~}{zz|€€~{||{}~„†„€€~€€€€~}|}€‚ƒ…„‚„ˆ‰ˆ‡…„†††………„…‡‰‰‡~ups|~{~~xv|€{trpppnmkkjpy€€‚€€}vommllkmmmkjginw|~€€~€€€€~wqru|~~}}~~}}}{||||||||||||||||}}}}~~~~~€‚…†‡ƒ~‚„…„„……„„„‚‚€€€€€‚ƒ~z}‡ˆ…„„}{}}}}|zyxvtstvutttuvxz}€‚ƒˆ‰‹‹ŽŽˆ€}}}~}~~~~~~~}}}€~}||{|{{{{|zyyz}~}{zz|€€~{|||~„†„€€~~€€~~}~€‚ƒ…„‚„ˆ‰ˆ‡…„†††…………††ˆŠ‡€vqrz~|z~{z||xspppnmkkkqz€‚€{uommllkmmmmlgiox}~€€~~€€€€}vqsx}~~}}~~}}}{||||||||||||||||}}}}~~~~~€‚…†‡ƒ€€ƒ„†„„……„„ƒ‚‚€‚ƒ‚{}‡ˆ…„…}{~~}}|z{zvttuvuutuvvyz{~‚†‰Š‹ŽŠƒ}||~}~~~~~~~~|}€€}||{|{|{z{{}|y{z|}~{zz|€€~{||}~„‡‚€€~~~€€~}}~‚ƒ…„‚„ˆ‰ˆ‡…„†††…………††‡ˆ‡‚xqqx|}|~~}|zspppnmkkkq{€‚€€{tnmmllkmmmmlgipx|}€€~€‚{upty}~~~~~~~~}}||||||||||||}}}}}}}}}}~~~~~~„…†„€„„†…ƒ……„„ƒ‚~€€€€€ƒƒ|}‡‰‡††~}~}{{zzxtuvwwvwuvxy{{}€…‰Š‹ŽŒ†}}~~~~~~~~}}~€€|{zz{z{{|}~~~|{{|}€~{xz}€€|z{|}~€„†ƒ~~€‚‚‚€~}|~€‚„…„‚„‡ˆˆ‡……††††††………†‰†ƒ|stx|€€‚€~}upppnmljkr|€€|rlmmllllmmljhjsx}~€€~wssw{}~~~~~~}}||||||||||||}}}}}}}}}}~~~~~~€ƒ…†„€„……„ƒƒƒƒƒ‚€€~€€€€€€€‚ƒ}}‡Šˆ‡†‚€~}{{{{yvwwvvvxvxzz||}„ˆŠŠŒŽ‹ƒ~}}~~}|€€{zzz{zz|~~€~~~}|}~€~{xz}€|zz{|~€„†‚}~~€~}|~‚„…„ƒ‡ˆˆ‡‡……‡‡‡†††……†ˆ†…ww{~€€€ƒ…‚€€€yqppnmljkr}€€|rlmmllllmmlihktz~€|vstx|}~~~~~~}}||||||||||||}}}}}}}}}}~~~~~~~‚„……ƒ„…„‚‚‚€~~€€€€€€€‚ƒ‚~|€‡Šˆ‡‡„€€}|{{||{xxvuuvxyz{{||}„‡‰ŠŒŽ†}~~~}}€~{zyyzz{|~€}}~€€€~{xz}€|yy{|~€…†‚~~~€€~~}|}‚„…„ƒ†‡ˆ‡ˆ†„†‡††††††‡‡‡…{{}‚€€‚„ƒ‚€}tppnmljkr}€€|tnmmllllmmlihltz~€zutuy{}€€~~~~~~}}||||||||||||}}}}}}}}}}~~~~~~}‚ƒ„†…‚‚…„ƒ€€€~~~~€€€€€€‚‚~|€‡Šˆ‡†…‚€}{{{||}zxvuuvx{{{|}}}€„‡‰ŠŒŒŒˆƒ~~~~€€~~€€~|{yyyzz{}€€€€}~€€€~{xz}€|xy{{~€…†‚€~~€€~}||}‚‚„…„€‚…†ˆ‡ˆ‡„…‡‡†††††‡‡‡…ƒ}~~}€€ƒƒƒ‚vppnmljkr}€€|tnmmllllmmmihluz~~~€€€zutvz{|€€~~~~~~~~~~~~}}}}|}{{||||||||}}}}}}}}~~~~~~~~}€‚…………ƒ„ƒ‚€€€€~~~€€€€€€€€‚ƒ~}€‡Š‰ˆ†„ƒ€|{zz|}}zxuttuyz||}}~€€€‚…‡ˆŠŠŒŒ‹†€~~~€~~~€~|{yyxy{}}€€‚€~€€€€zw{}~zwyy{‚„„~}}~€~||}~‚„ƒ‚€„†‡ˆˆ†ƒƒ††††…††‡ˆˆ…‚€}|}‚€€‚„…„€yqoonkkls~€‚€€}uollllkmmmmjimw|€~}~€~wtuxy{}~~~~~~~~~~~~}}}}||||||||||||}}}}}}}}~~~~~~~~}€………†ƒ„ƒ‚€€€€€~€€€€€€€€‚ƒ~€‡Š‰ˆ†…„‚€|{yy{}|zxussuxz||~}~€€€€„†ˆŠŠŒŒŒˆ‚~~~~~€}|{zzxy{}}~€€‚ƒƒƒ‚€€€{x{}€~zwyy{‚„„~|}~~~||}ƒ„ƒ‚€ƒ…‡ˆ‡†ƒƒ††††…‡‡‡‡‡…‚}|}‚‚€€ƒ„…„{roonkkmt~€‚€€}tnllllkmmmmjjnw}€~}~€}utuxy{~~~~~~~~~~~~~~~~}}|}}||||||||}}}}}}}}}}~~~~~~}€‚„…†„†ƒ‚€€€€€~€€€€€€€€ƒ€€‡Š‰ˆ……„ƒ€~zyxxz||{xusrsvz||~~~€€€€‚†ŠŠ‰‹ŒŒŒ‹…~~~€€~~}|{zzxz|}}~~„†…„ƒ€€~~|z|~€~zwyy{‚„„~}}}}~~}||}ƒ…„‚€ƒ„‡ˆ‡†…„††††…‡‡‡††…‚~€ƒƒ‚„„„…‚}tponkkmu~€‚€€}tnllllkmmmmjiow}€~}~€zsuvxy{~~~~~~~~~~~~~~~~}~}}}||||||||}}}}}}}}||~~~~~~}€€ƒ…†„†ƒ‚€€€€€€€~€€€€€€€~ƒ‚€€‡Š‰‡………‚|ywwwz{{|xurqstz||~€€€€€€„‰Š‰ŠŒŒŒŽˆ‚~€€~~~}|{zzz{|}}~~€„‡ˆˆ†„‚€€€~~|}~€~zwyy{ƒ…„~~~||~~|||}ƒ…„ƒ€‚ƒ‡ˆ††‡†††††…‡‰‰††…ƒ‚ƒƒ‚ƒ…††…„ƒ~wqomkkmw~€‚€€}smllllkmmmljipw}€~}~€xruwxy{~~~~~~~~~}~~~~~~~~~~}|||||||||||}}~~~~}}}}~~~~~~~~€„†††„‚€~~~€€~~ƒƒ€†Š‰‡†…„|xwuuvy{{{wusrsuy{}~€€~}†Š‹‹‹ŒŒŒ‰ƒ~~}}~}||{{{|}~~~†‰Š‰‡„ƒ€~~||}€}xvwy|‚ƒ„~}|||~~}}{{}€‚„…„‚‚‚ƒ„††††„……………†ˆˆ†…„‚‚‚ƒƒ„„‚ƒ…†……„‚€yromjjmx‚€€|tmllkklmnljijqx|~~}~€‚}xtwxyy{~~~~~~~~~}~~~~~~~~~~}|||||||||||}}~~~~}}}}~~~~~~~~€ƒ…††…„‚~~~€€~~ƒƒ€„Š‰‡…ƒ‚ytsstvy{{{xusssuy{}~~€€}|ƒ‰Œ‹‹‹‹Œ‰‡€‚€~}}}||{{{|}}}~€ƒˆ‰ŠŠˆ†„€~~}}~€}ywwy|~€ƒ„„~~|||~~}}||}ƒ„…„‚‚‚‚‚‚ƒ„†‡†‡„„„………†ˆˆ†…„ƒƒƒ„„„„ƒ„‡†……ƒ‚€{vromlox€‚€€|tmllkkmmmljijrz|~}}~€‚|xvxyyy{~~~~~~~~~}~~~~~~~~~~}|||||||||||}}~~~~}}}}~~~~~~~~€ƒ…††…„‚~~~€€~}~€‚‚‚ƒ‰Š†„€{xrooruy{{{yvsssuy{}}}~€€|{|€‡Š‹‹‹‹‹ŠŠ„€€€‚~~~}}|||{{||}}‚…ˆˆŠŠˆ†„‚€~~|}€€~yxyy|~€‚„„~~}}~~}}||}‚ƒƒ„ƒ‚‚‚‚‚ƒƒ„†‡‡…ƒƒ………†‡‡…„„ƒƒƒ„„………†ˆ‡†…ƒƒƒ€zvsporz€‚€€|slllkkmmlkjhks{}~}}~€‚zwvyzyy{~~~~~~~~~}~~~~~~~~~~}|||||||||||}}~~~~}}}}~~~~~~~~~€‚„†††…ƒ‚~~~€€~}}‚‚€€€†‰…„€~zysooquy{{{yvtssvy{}}}~€€|z|}ƒ†‹‹ŠŠŠ‹‰†€€€~~~~}|||{{|||~}€ƒ‡ˆˆ‰‰ˆˆ„‚€~~}}€€~}zxyy|~€‚‚„~~~~~~}}}}}‚ƒ„…ƒ‚‚ƒƒ‚ƒƒƒ…ˆ‡…ƒƒ………†‡‡…„…ƒƒƒ„„……‡††ˆ‡†„‚ƒƒ‚~ywsrs{€‚€€|slllkkmmlkjhls{~~}}~€‚yvwy{yy{~~~~~~~~~€€~~~~~~~~~~~~}}}|||||||||||}}}}}}~~~~~~}}~~~~ƒ„……‚€~~~~~€€}|€††‚||{wpnoty|||yyuvuvyz||}€€|{|}€…‰‰Š‰‰ˆ…€€‚€~}}}}||{{{{|~‚„ˆˆŠŠŠ‰‰…„~}}}|}|zwxx{~‚ƒ‚‚€€~~~~€~~|}}€‚ƒ‚‚‚ƒƒ‚‚‚…‡…ƒ„„„……††……„ƒ„„……††††††††„ƒƒƒƒ|ywx}€‚€~{rmkkklmmlkjimu|~~~~€‚€|xuxzzxxz~~~~~~~~~~~~~~~~~~~~~}}}|||||||||||}}}}}}~~~~~~}}~~~~€€ƒ„……‚~~~~~~~€‚|~‚ƒ‚}~zronsy|~~{{yxyyzz||~€€~|{{}~€ƒ†‰‹‰‰ˆ…€€€~}}}}}||{|}€„†‰‰Š‹Š‰‰„ƒ~}}}|~|zwxx{ƒƒƒƒ‚‚€€~~€€~|~€‚ƒ‚‚ƒ‚‚‚‚‚‚€ƒ†…ƒ„…„……††……„„…………††††††††„„„„„ƒ‚€~|{‚‚‚‚‚€~{rnkkklmmlkjhmv|~~~‚‚{wvxyyxxz~~~~~~~~~~~~~~~~~~~~~}}}|||||||||||}}}}}}~~~~~~}}~~~~‚ƒƒ€~~~~~~~€‚~|€‚€€‚‚}wqorwz~~}}{{{{{|}}}|{z|}~„ˆ‹‹‹ˆ…€~~}}}||}}}}~„„‡ŠŠ‰‹‹‰ˆƒ‚€~||}}€€|zwxz}‚‚ƒƒƒƒ~~€€~}‚ƒ‚ƒ………„„ƒ‚‚‚~‚„…ƒ„…„……†††…„„………………††††††„„„„„ƒ„ƒ~€‚‚‚‚‚€~{rnkkklmmlkihmw}~|}‚‚{wwyyywwz~~~~~~~~~~~~~~~~~~~~~~~}}}|||||||||||}}}}}}~~~~~~}}~~~~€‚‚€~}}~~~~~‚{‚‚„…€ysoquy}}}}}}~€€€€‚~}|{z{|}~ƒ‡Šˆ…‚‚€~~}}}{{{|}~€‚ƒƒ†‰‹‹Š‹Šˆ†‚€~||}}|zwxz}~‚ƒƒƒƒ‚~~~~€€~~‚ƒ‚ƒ„„„ƒ…„ƒ‚‚~~„…ƒ„…„……†††…„„……„„„„††††††……„„…ƒ„„ƒ€€‚ƒƒƒƒ‚€~{rnkkklmmlkiimw}~{|‚‚zwwzxxvvz~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||~~~~~~~~~~~~}}~~~~~~~~€€€€~~~~~~€€~}}}}}~~|}€ƒ‚ƒ„„‚|uoqvy|}~~~~}~€‚‚‚}|{{{|{|€ƒ†‹‹‡„€‚€~}||{{{||}ƒ„„…‡‰ŠŠŠŠ‰†ƒ€€~||}~€€}|zxy{~€ƒƒƒ„„ƒ~~~|}€ƒƒƒƒ„„ƒƒƒ…„ƒ…‚‚~ƒ…ƒ„„……†…………ƒ‚ƒƒ……„……†‡‡‡‡‡‡†††…„„„‚‚ƒ„„„„‚€€yrnkkklnnlkgiox~|}€}zwxyyxvvz~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~}}}}}~€}|€‚‚„„„ƒxrrux{|}}~~€‚~}{{{||{|~ƒ……„‚€~}|||{{{||~€„…†‡ˆŠŠŠŠŠˆ…}||}€€}|zxyz}€€ƒƒƒ„„ƒ€~~~}~€ƒƒƒƒ„„ƒƒƒ…„ƒ†„„‚‚‚ƒƒ„„……†††……€‚„…‡††††††††††„„„ƒƒƒ„„„„ƒ€€yrmkkklmmlkhjpx~}}€|yxyyyxvvz~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~}}~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}~~ƒ~{~ƒ„„ƒƒ‚|tsux{|~~~~€€€€€~}|z{{||{|}€‚‚€€€~}|{|{{{{{„†‡‡‰‹ŠŠŠŠ‡„€~}{z|}€€~||zxyz}}~€‚‚‚ƒƒƒ€~~~~€ƒƒƒƒ„„„„ƒ………†††…„‚‚ƒƒ„„……†ˆˆ†‚~€€€ƒ†………………††††„„„ƒƒƒ„„„„ƒ‚€€yqlkkkllllkikqy}~}}€€|yxyyxwvvz~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||~~~~~~~~~~~~~~}}||~~~~~~~~~~}}~~~~~~~~}}~}}}}}~~z|ƒ„„„ƒƒ}uptwz{~~~~€€€€~|{z{{||{||~€€‚€€~~}|{|{{{{{…†‡‡Š‹ŠŠŠŠ‡ƒ€|{yz|}€€}{|zxyy||}‚‚ƒ‚€~~~|}€ƒƒƒƒ„„……ƒ…†††……„„‚ƒ„ƒ„„……†‡‡…€}|~~~~€„……„………††††„„„ƒƒƒ„„„„„‚€€yplkkkllllkikqy}~}~€€|xxyyxvvvz~€€}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~}}~~~~}~~~~~}}}}}}~~~~}}~~~~~~}~~~~~~~~~~}}}}}}}}}}~‚€|z}„„ƒƒƒ‚yrrvyz}~~}|{{{{{zzz|~}~‚‚€€}|z{{{z{{|€…ˆˆˆ‰‹ŠŠ‹Šˆ…~|zyz|~€€~|z{xyzz{}€ƒƒƒ‚€€€~~|}€‚‚ƒƒ„„ƒƒ„……………„„„„„„ƒƒ„††‡†…{vy|}~€ƒ„…†„………„……„…„„„‚„„……„ƒ‚‚€ypmkkllllkjiksz~}}}€€‚|yyyywvvvy}€€}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~}}~~~~}~~~~~}}}}}}~~~~}}~~~~~~}~~~~~~~~~~}}}}}}}}}}}z{€ƒ„ƒƒ„ƒ{truyz|~~~}}~}|{{{{{zzz|~~}~€‚‚€€€~}|{zy{{||}ƒ‡ˆˆˆ‰ŠŠŠ‹Šˆ…‚}zyz|~€€~|{zz{zzz}€ƒƒƒ‚€€}~€‚‚ƒƒ„„ƒƒ„„……„„„„„„„„ƒƒ„†††…ƒ{trw|}~~~~~ƒ†ˆ„………„„„„…„„ƒ‚ƒƒ„„„„ƒƒ‚{rnllllllkjimu|}~~€€€|yy{}zwuuy}€€€~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~}}~~~~}}~~~~}}}}}}~~~~}}~~~~~~}~~~~~~~~~~}}}}}}}}}||~‚‚zz}‚„ƒ‚„„~wsuxy{}||}}~}||{{{zzz|~}~€‚‚€~}|{zzz{|}~„‡ˆˆˆˆ‰ŠŠŠ‰‰†ƒ}zyz|~€€}|{|{zyy}€‚‚‚€€‚‚€~€€‚‚ƒƒ„„ƒƒ„„……„„„„„„ƒƒ„„†………‚uopx}~~~}~~€‡ŠŠ†……„„‚‚ƒ„„…„„ƒƒƒƒ„„„„ƒ}snllllllkjimu|}€€€|yy|~xtty}€€~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}~~}}~~~~}}~~}}}}}}~~~~}}~~~~~~}~~~~~~~~~~}}}}}}}}}||‚‚‚|y{ƒƒ‚„„€yuvwy{|z{|}~}}{{{zzz|~}ƒ‚‚€€~}{{zyz|}~‚ƒ†‡‡ˆˆ‰ŠŠŠ‰ˆ‡„‚~{yz|~€€€~~{}{zyy~€€€‚‚‚~€‚‚ƒƒ„„ƒƒ„ƒ„„ƒƒ„„„„‚‚…„†„„ƒzsmow}€~}~~€ŠŒŠ†……„ƒƒ„„…„‚‚ƒƒ„„„„ƒvollllllkjinv}}€€€|yy|€ytty}€~~~~~}}}~~~~~~~~~~|}}}}}}~~~~||}|}}}}}}}}~~}}}}}}|}~~}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~||}}||||}}}~€‚~xyƒ„ƒ„„‚}vvzyy}€zy||}~€~}}}||{{zyz||€~}|{zzzz~€‚ƒ„††††ˆ‰Š‰‰‰‡…ƒ€|zy}~~~~}}|zxz~€€‚‚ƒƒ‚€‚‚‚‚ƒ„ƒƒƒƒ„„ƒƒƒƒ„„„„ƒƒ„†„ƒ|snmry~~}}~}…‰…„„„„ƒ€ƒ„†‡†‚€ƒ„„……ƒxrnmmlmmkihnw~~}€€€{yy}ƒ‚ytty~€~~~~~}}}~~~~~~~~~~~~|}}}}}}~~~~}|}|}}}}}}}}~~}}}}}}|}}}}}}}}}}}}}~~~~}}~~~~~~~~~~~~~~~~||}}||||}}}~~xx}‚ƒ„„„ƒzy|yy|~zy|}~~€~}}}||{{zyz||€€€~}||{{{{~€‚‚ƒ„…………†ˆŠ‰‰‰‰ˆ„|zy}~}}~~~}||}€€€€€‚‚‚‚‚ƒƒ‚‚ƒƒ‚‚ƒ„ƒƒƒƒ„ƒ‚‚ƒƒ„„„„„„„…„„€~vpnqw{~|{~~}ƒ‹„‚ƒƒ„„‚€ƒ„†ˆ†ƒ€‚ƒƒ„„„‚}vonmnmmkihow~~}€€€~zyy}„ytty~€~~~~~}}}~~~~~~~~~~~~|}}}}}}~~~~~~}|}}}}}}}}~~}}}}}}{}}}}}}}}}}}}}~~~~}}~~~~~~}}~~~~~~~~~~}}||||}}}~~‚€{xz‚ƒ„„ƒ~}}zz|~|z|}~~€~}}}||{{zyz|}€~}|||{}~€‚‚‚‚„……„†‡‰‰ŠŠ‰‰†‚}zy|}||~~~~~€€‚ƒƒ‚‚ƒƒ‚‚ƒ„ƒƒ‚‚ƒ‚‚‚ƒƒ„„„„„„ƒ„†‡„~ursyz}}yz~~‹…€‚ƒƒ„‚€‚„…†ˆ†‚€ƒƒƒƒ„ƒyroonmmkiipx~~}€‚€~zzz~„€ytty~€~~~~~}}}~~~~~~~~~}}~|}}}}}}~~~~~~}|}}}}}}}}~~}}}}}}{}||}}}}}}}}}}~~~~}}~~~~~~}}~~~~~~~~~~}}||||}}}~~ƒ}wz}€ƒ„…„‚{y{~|z|~~€~}}}||{{zyz|~€~}||||€€‚‚‚‚‚„„†‡‡ˆ‰ŠŠŠˆ†ƒ~yy{|||~~~€‚€€€€€‚ƒƒƒƒƒ‚‚ƒ„ƒƒ‚‚‚‚ƒƒƒƒ„„††„„ƒ„ˆŠ†~tuz}}~zz||~ˆ‰€|}€ƒƒƒ€„„‡ˆˆˆ‚‚ƒƒ„„€{tpoommkiipy~~}€‚€}yzzƒ~wtty~‚€~}}}}~~~~~~~~~~~~~~|}}}}}}~~~~~~~}~~~~}}}}~~~~}}~~|}}}}}}}}}}}|||~~~~~~~}}~~~~}}}}}}}}~~}}}}||}}~‚‚zxz„……„‚€~}{}€~|}~~}}|||||{zy{}€€~~~}}}|}‚ƒ„„ƒ‚€€‚„††ˆ‰‰‰‰Š‰‡„|z{|}}~~€~~~€€€€€‚ƒƒ‚‚‚‚ƒƒƒƒ‚€€‚‚‚‚„„…………„„ˆˆ†}sw}~~~{{~}†Œ‚{z{~€‚‚~~ƒ†‡‡ˆˆ}~‚‚ƒ„„ƒ‚~zuqommjhhqz~}~€€zwxy‚ƒ{wttx|‚€€~}}}}~~~~~~~~~~~~~~|}}}}}}~~~~~~~~~~~~}}}}~~~~}}~~}}}}}}}}}}}}|||~~~~~~~}}||||}}}}}}}}}}~~}}}}||}}~‚}yy|€‚„……ƒ‚€€~|~‚€~}~~}|||||{zy|€€~~~}}}}|~‚„„†„ƒ‚€€‚ƒ…†‡ˆˆ‰‰Š‰ˆ…€~{||}}€~}~€€€€€‚‚‚‚‚‚‚ƒƒƒƒ‚€€‚‚ƒƒ„„…………„…ˆˆ‡}sv{~|z}„ŒŠ‚|yyy|~€‚………‡ˆ‚}}€ƒƒ„„ƒ~xtqomjgjs{~~~zwy|‚zvstx|‚€€~}}}}~~~~~~~~~~~~~~|}}}}}}~~~~~~~~~~~~}}}}~~~~}}~~}}}}}}}}}}}}|||~~~~~~~}}}}||~~~~}}||}}~~}}}}}}}}}}‚{xx~‚„„„‚|~‚‚}~~}||||{{z{~€€~€~}~~}}}|~~„†‡…„‚€€‚……‡ˆˆˆˆ‰‰ˆ…€|||}}~~€€€}}~€€€€€€‚‚‚‚‚ƒƒƒƒ‚€€‚‚ƒƒ„„……††…†ˆˆ…tw|~~yy~‚Š‰ƒ{yyyyz{~‚€‚‚‚„ˆƒ}~€‚‚ƒ„„ƒ}wspnkglu{~€}{xz~‚~xustx|‚€€~}}}}~~~~~~~~~~~~~~|}}}}}}~~~~~~~~~~~~}}}}~~~~}}~~}}}}}}}}}}}}|||~~~~~~~}}}}~~}}}}}}}}}}~~}}}}~~}}}}€€€xy|}ƒƒ„ƒ‚€}ƒƒ€}~~}||||{{{}€~~}€~~}}}~~€ƒ†ˆ†…‚€€‚„…†‡ˆˆˆˆ‡‡…‚|||}~~~~€€€||~€€€€€€€€‚‚ƒƒƒƒ‚€€‚‚„„„„……†††ˆˆˆ…€vx{}{yx…‰„|yzyyzzz}€€~~‚„ˆ„||€€‚ƒ„„„„€|wrokglv|€€‚~|zx|€ƒ{ttssx{‚‚€€~~~~~~~~~}}~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~}}~~}}}}}}~~~~}}}~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~}€{xz}„…„€‚€~~€€~~}}{zyz~€€~~~~}|}}}}}€‚…‡…„€€€„…††ˆˆˆ‡‡‡…ƒ~}|}}~~}€€€€€‚‚~||€€€€€€€‚‚‚‚ƒ€€€€€‚‚‚„„„„††‡ˆ‡‡†‚xw{{{xz€……|wvwyyyyy|€~|}~€‚…‡†}|‚‚„„„„‚}ysoljlu}€€€€}zx|‚‚yrqssw|‚‚€€~~~~~~~~}}~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~}}~~}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}|~€‚~zx{}€‚„„‚€}~~~€€~~}}{zz|€€€~~}}}}|}|}|}||‚„„„‚€€€„……†ˆˆ‡‡††…„‚€~|}}|}}~€€€€€‚‚‚~||€€€€€€€€‚‚‚‚‚€€€€€‚‚‚‚‚ƒƒ……†‡††„‚zvzzyv{‚„€wvvwwwwwwyxz{|€‚„…‡‡}{ƒ„„ƒƒ‚€|wqljnv}€€€€}yx~‚vsrsqv{‚‚€€~~~~~~~~}}~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~}}~~}}}}}}}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}|}‚|yy{~€‚„„€|{}~~€€~~}}{z|€€€€}}|{|||{}}}||€‚ƒ‚€€€ƒ„……†‡‡†„……†…‚€~~}}~€€€‚‚‚~|}€€€‚€€€‚‚€€€€€€‚‚‚‚‚ƒƒ„…„„‚|vzzwu{‚‚}vuvwvvvvurrsz~‚ƒ……†‡†ƒ}{~€€ƒƒƒ‚ƒƒ‚ztliox~€€€€|yz}vttspty‚‚€€~~~~~~~~}}~~~~~~}}}}}}}}~~~~~~~~~~~~}}}}}}}}~~}}~~}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~}‚€~zxy|~„„‚€|{|}~€€~~}}{z}~‚€~~|{|{{z|{}}~||€‚€€€€ƒƒ„…†††…„……‡‡„€~||~€€€‚‚‚~|}€€€‚‚€€‚‚€€€€€€€€‚‚‚‚‚‚‚‚‚ƒ„ƒƒƒ‚}wyyvsz‚zvuvvuuuusons{ƒ…†††‡†„|~€‚ƒƒ‚„…ƒ}volqy~€€€€~{y|€zurtroty‚‚}}~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}}|}}}}}}}}}}}}}}}}}}}yxz}€ƒƒ€€}{|}~~~~~~}|{z~€~~~}{zy{{|}~~}}~€€€€„„„„…„„„…‡ˆˆ…„‚}}~€€€ƒ‚|}€ƒƒ~~€€‚€€€€€€€‚ƒƒ‚‚€‚‚~ywurrz€~wtttutttupkpy~ƒ†………‡ˆ‡…~~~ƒ„‚‚ƒ‚ypmty}€€€€€||y}‚€ysrrqoty‚‚~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}}|}}}}}}}}}}}}}}}}||~€{xx|€‚‚€}||}~~~~~~~~}|||€~~~~}{zyz{}~~~~~€€€€€ƒƒƒƒ„„„„…‡ˆˆ†…ƒ€~~~€€€ƒ‚€|}€‚„„‚€~€€‚€€€€€€€ƒƒ‚‚ƒ„}€~~‚yurqrz€|vtttututrmmw|ƒ†………‡ˆˆ‡‚~‚‚ƒƒƒ{soty}€€€€€|||ƒ}xssspoty‚‚~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~}}}}}~~}}}}}}}}~~~~~~~~~~~~~~}}}}}}}|}}}}}}}}}}}}}}}}|||~zvy|‚‚}|}~~~~}}~~~||}€}~~~~}{|{{{{}~~~€€~~~€€‚‚ƒ‚‚ƒƒƒ„…†‡‡…„ƒ€€~€€ƒ‚€}~€ƒ…†„€~€€‚€€€€€€€ƒƒ„„„ƒ€z|}~~zuqqryzutttuuvtnlr{~~€…………‡ˆˆ‡„€€€€€‚ƒƒ‚|vruz}€€€€~||~€{vsssnnuz‚‚~~~~~~}}}}~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}~~}}}}~~}}}}~~~~~~~~~~~~~~~~~~}}~~~~}|}}}}}}}}}}}}}}}}{{{~€€}wwz}‚‚€~|}~~~~}}~~~|~~€}}~~}}{|}|{z|~~~€€~}}~~€€‚‚‚‚‚ƒ‚‚„……††„„ƒƒ€€€€ƒ‚€€€ƒ††…ƒ€€‚€€‚€€€€ƒƒƒƒ„|wyz}}}‚}wqrry}yttttuuurmnx~~…†……‡ˆ‡†‡ƒ€€€|}€„„ƒ}vsu{}€€€}||~~yusttlnv{‚€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}||}}}}}}~~~~~~~~~~~~~~}}~~}}}}}}}}}}}}||||||€€€€{yx{}‚‚}||~}}~~~|}~}}~~}}|z{{z{{|~~~~~}~~€‚‚‚€‚ƒƒ„…††…„„ƒ€€‚€‚‚„†ˆ‡„‚€€€‚ƒƒ€€‚ƒ{wy{}}€‚yposz{xuttuuttpjp{~~~~††††‡‡…„‚€€€|z~€‚‚ytv{~€€~}}‚€{vssurlksx‚€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}}|}}}}}}~~~~~~~~~~~~~~}}~~}}}}}}}}}}}}||||||~~{xy|~€}{|}~~~~~}~~~}}~}}}{{{zy|}}~~~~~}~~€‚‚‚€€€‚ƒ„†‡……„„ƒ‚‚€‚‚„…ˆ‡…‚€€‚ƒ„„‚€€€€‚„{xz|~€‚‚}qor{|wuttuutslmu|~~~~~„†††‡‡…ƒƒ€~zx}€‚‚{vx{~€€~~„~xusstrlksx‚€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~||||||}}|~}zyz|€‚}{{|~~~~~}~~}}~}}|{{{zz|~~~~‚‚~}~~€‚‚‚€€€€ƒ„†‡……„„ƒ„ƒƒ‚€€‚~‚„…‡‡…‚€€‚ƒ„ƒ€€€€‚„‚}€‚‚„ƒsprz{wtttuuuqkqz}~~~~}€†††‡‡…„„€yuz}€‚‚€|xx|~€~€‚‚|vssssqkmuz‚€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}}}}}}}~~~~~~~~~~~~~~}}||}}}}}}}}}}}}~~||||zz|}}~|zyy}ƒ~{{|~~}}~~~}}}}||{|y{z}€€€~~‚€~~~~€‚‚‚€€ƒ„†‡„„„„ƒ„„„‚€‚~‚ƒ„‡‡†ƒ€€‚„…„€€‚„ƒ‚‚‚‚„…€tps|{vtttuutpku~}~~~~~€†††‡‡…ƒƒ‚€€yrw}€‚‚€{wy}~€€~€‚zurssspkmv{€€€€~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~}}~~~~}}zzzxyz|~~yvz~‚‚{z{}}~}~~€|}}~{z{}~{|{}~|}~€~~~~€€€€ƒ„„„‚ƒƒƒ„††ƒ‚‚€€‚€~€‚ƒ††…ƒ€€€€„…„‚‚‚‚ƒ…ƒƒƒƒ‚ƒ‚ƒ††wrs{{wuuttusmkx~~~~~~~‚‡……††„€€ypty~€‚€|yz|€€€€~€}yusqrrmjlv|€€€€~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}zzzxyz{~€€}yx{€‚|z{|}~~}}~~~|||{yz|}}||}~~~|}~€~~~~€€€€€€‚ƒƒƒ‚‚ƒ………„ƒƒ€€‚€~€‚ƒ††…ƒ€€€€€€€ƒ…„‚‚ƒ‚ƒ…„„ƒƒƒƒ‚ƒ……‚yutz{vuuttupjlz~~~~~~~‚†…„……ƒ€€€zpqw}‚€}z{}€€€€~€~yvsrqrqmloy~€€€€~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~}zyywwxy|~€|yz}€{z|}}}||~~~~{{{zz{|||||~~}}|}~~€~~~~€€€€€€€€€€‚‚‚€ƒ…………ƒƒ‚‚€€€‚€~€‚ƒ††…ƒ€€€€€ƒ„ƒ‚‚‚ƒ‚ƒ…„„„„ƒƒ‚ƒ……‚|wuyyvtttttojq|~~~~~~~‚…„‚„„‚€€€{qpu{|{{}€€€€~€€}xtqqqqqpqv|€€€€~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€~~~~~~~~~~~~~~~~~~~~}}~~~~~}~}zyywvxy{€€{z{‚{z|}||z{~~}{zzz{}||||||||}~€~~~~~€€€€€€€€€€‚‚‚€‚„……„ƒƒ‚€‚€~€‚ƒ††…ƒ€€€€€‚ƒ‚‚„„ƒ‚ƒ…„„……ƒƒ‚ƒ„„ƒwuxxwtttttnjs~~~~~~~~‚…„ƒƒ€€{qorx}€{||~€€€€€~€}zxtrqqsstv{‚€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~€€€€~~~~~~~~}}}}~~~~}}~~~~~~}~~}yxxvwwxy}€€€~zx}|y{{z{y|~}}zzxyz{{{||}}€}|}~€€~}|||}€€€€€~~~~‚ƒ„„ƒƒƒƒ~€ƒ‚€€‚€‚†……ƒ€~€€€‚„ƒ‚‚‚‚‚„…„„……„ƒƒƒ‚‚ƒ€ywyyustutrjkw}~~~~~~~„‚€€€‚€€|sprx}||}€€€€~€}yxwvtrsxwx}€‚€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~€€€€~~~~~~~~}}}}~~~~}}~~~~~~}~~}yxxvuuwxz}€€€}zy}€|yyyyyz~~|{zzzyyxy{||}}~}|}€€~}|||}~€~~~~~~€€€€‚ƒƒ‚‚‚‚€ƒ‚€€‚………ƒ€~€€‚€‚„ƒƒ‚‚‚‚ƒ…„„……„ƒƒƒ‚‚zwyxtssssqimy}~~~~~~~€‚€€‚€€{qpqv{~~}|}€€€€~zxxzzxvx|~‚ƒ„„€€€€~~~~~~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~~}}}}~~~~}}~~~~~~}~~}yxxussuvx{|€€€|{|~}zxxy{}~~|{|{zyxxz{||}~~}}}~€€~}||||}~~~~~}~~~~€€€‚‚‚€€€‚ƒ‚€€‚ƒ†…ƒ€~„‚‚„ƒƒ‚‚‚‚‚„„„……„ƒƒƒywyxtsssrniqz}~~~~~~~€€ƒƒ‚€€{qpquz~~}|}€€€€~}xwy|€||‚„„……€€€€~~~~~~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~~}}}}~~~~}}~~~~~~}}~}yxxussrtwy||€€~}}|}{xxz}}|{||zyxwxz{||}~~}}}€€~}||||}}}~}}}}~~~~€‚‚€€€‚‚ƒ‚€‚‚ƒ†„ƒ€~‚ƒ‚„ƒƒ‚‚‚‚‚ƒ„„……„ƒƒƒƒywwwtstspljsz}~~~~~~~~~€€€„…‚‚€€{rpquy}}}|}€€€€€~{vwy}‚€€ƒƒ……†…~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~{yyvtqrrvwy}~€~||{zz|~~}||{xxxxz{{{|}}~}}~~~€~}|||}|||}~~||}}}}}}~~~~~~€€€€€€€€ƒƒ„ƒ‚€‚‚€ƒ„ƒ~~}~~}‚ƒƒ‚‚‚„„‚‚ƒƒ„„„„„„‚€€~xvxwusssqkjt|~~~~~~~~~}~~ƒ…‡ƒ‚ƒ€€uoquw|}}}~€€€€€|yuw{~‚ƒ‚‚‚„„……†~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~|{zwtqrrtvy|}€€€~}|{{{}€€~}|}|yxxwx{{{{|}~~}}~~}~}|||}|||}}}||}}~~}}~~~~~~€€~€€„„„„ƒ‚‚‚~ƒ„ƒ~}~~|}ƒ„ƒƒƒ‚‚„„ƒƒƒƒ„„„„„„‚€€€}vtwvusssqjlw}~~~~~~~~~~~†‡‰…ƒƒ€~topuw|}}}€€€€€{xvw|‚ƒ„‚ƒƒ„„††‡~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zzwtqqqrvy||€€~|{z|~€€}}}}{yxwwx{{{{||~~}}}~~}~}||{|{{{|||||||}}||}~~~~~~~~~~€‚„„„„„ƒ‚‚‚~~„ƒ€~}~~|}ƒƒ„„„„„„„ƒƒƒƒƒƒ„„„„„„‚€€ztrxwvtssqjmz~~~~~~~~~~~„Šˆ‡…ƒƒ‚~uqrvx|}}}€€€€€~zxxy~€‚‚ƒƒ……†ˆ‰Š~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~zxywtqpprvz||~~~zzz|€~}||{yzywwy{{{{||~~}}}~}}~}||z{zzz{||||||||||}}~~~~~~~€‚ƒ…†…„„„ƒ‚‚‚}€„ƒ€~}~~}~‚„„……„„„„„„……ƒƒ„„„„„„‚€€~wtrwvvtstqio{~~~~~~~~~~€‰Œˆ†…‚ƒƒ€€~wsuwy|}}}€€€€€}zyy{€‚‚ƒƒƒ„…ˆ‰‹Œ~~}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~{xvusrqqsv{}~~|~~€€{z|}€€}zzvwyyxxyz{{{||}~~~~|}}~~~~}{{{{{{zz{{{{||||{|}}}}~~||}}~~~ƒ„„…ƒ‚‚ƒƒƒ‚€~ƒ‚€€~}}€ƒƒ‚‚ƒƒƒƒ‚„„ƒ„„„„„„ƒƒ‚€|xutuwwuusojoz~~~~~~~~~„Œ‹†………ƒ‚}wxz{~~~~€€€€~{y{~€‚ƒ„„‡ˆ‰Š‹~~}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~|xuusrqqtw{}}}{|}€€|{}€~{yxvwxyxyyz{{{||}~~~~|||~~~~}{{{{{{zz{{{{||||{{||}}~~}}~~~~}€ƒ„……„ƒ€‚„…ƒ~ƒ‚€€€~~€‚‚‚‚‚‚‚‚ƒ„…„„„„„„„ƒƒ‚~xwuuuvwuutpkpz}~~~~~~~†Œˆƒ„††ƒ‚€}}~€€€€€€~{z}~€ƒƒ„…‡‰ŠŒ~~}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~|xvttsrrtx{|{{z{{|~~~~}|yxwwwxzyyyz{{{||}~~|||~~~~}{{{{{{zz{{{{{{{{{{||}}}}}}}}}}}€ƒ††…ƒ€€€‚ƒ„‚€‚…„‚‚€€‚€€€€‚ƒ„„„„„ƒƒƒƒ‚~{vvuutvvvutpkpz}~~~~~~~~†‰„‚…†ƒ‚€€€€€€€€€€€€€~{{~€‚‚…„†††‡Š‹~~}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~|xwuusrrtx{|{{{}{}}}~}€}{xxwwwwyyyy{{|{|||~~|}|}~~}}{{{{{{zz{{{{{{{{zz||}}||||}}}}}…‡…ƒ‚€}~€„ƒ‚„†…„ƒ€€€‚€€€€ƒ„„„„‚‚ƒƒ‚~ywuuuuuwvutqkqz}~~~~~~~~~‡†€}‚…†ƒ‚€€‚‚‚€€€€€€~{{ƒ…„……„††‡Š‹~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~€€€€~~}}~~~~~~~~}~~~~~~~~~~~~~~~~~|zwwvtssty|||z{{||}|{}€~{xvwxxyyzzyz{|}||}}~€}}}}}}||zzzzzzzzzz{{{{{{{{{{{{{{{|||~~‚……„€~~~~ƒ„‡†…„‚€€€‚€}|}~~~‚„„ƒƒƒƒ‚‚€}zxuutuuwwvsqnqz}~}}~~€‚…ƒ~€‚„„ƒ‚‚‚‚ƒƒƒ„ƒƒ‚‚‚€}||~ƒ„††„„„„†ˆŠŒ~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~€€€€~~~~~~~~~~~~}~~~~~~~~~~~~~~~~|zwwwussuz|||z{{|||}|}€€}zwuwxyzzyyyz{}}}}}}~€~}}}||||zzzzzzzzzz{{{{{{{{{{{{{{{|||~~€ƒ„…‚~~~~‚ƒ…††…„ƒ‚€€‚‚€~{|}~~‚„„„„ƒƒ‚‚~|xvutuuvwwsploy~~~€€€ƒ„ƒ…„€€„„ƒƒƒƒ‚‚ƒƒ„„ƒƒƒƒ‚€€~|~‚„†‡ˆ†„‚‚ƒ†ˆŠ~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~€€€€~~~~~~~~~~~~}~~~~~~~~~~~~~~~~|zwxwuttvy|||z{{|||~~€}{xuwxyzzyxyz{{|}}}}~€€}}|{{{{zzzzzzzzzz{{{{{{{{{{{{{{{|||~€„…ƒ~~~~~~~€€€ƒ„„„ƒ‚ƒ‚‚‚ƒƒ„„ƒ‚}~}}}‚„„„„ƒƒƒƒƒ€}zxutttuvvsolnx~€€ƒ„††……ƒ„†…‚‚‚ƒ„„„„ƒƒ‚‚ƒƒ„„ƒƒƒƒ‚€~ƒ…†ˆˆ‡…ƒƒ†ˆŠ~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~€€€€~~~~~~~~~~}~~~~~~~~~~~~~~~~|zxyxvtuwy|||z{{||{|}€}||zxwwxzzyyzz{z{||}}~€}}|zz{{zzzzzzzzzz{{{{{{{{{{{{{{{|||~~ƒ„ƒ€~}}~~~~€€€‚‚ƒ‚‚„………„„ƒƒ€}~~}}€ƒƒƒ„„ƒƒƒƒ„‚}|zutssvvuqolo{€„……††‡‡†…„††„‚‚‚„„„„ƒƒ‚‚ƒƒ„„ƒƒƒƒ‚€€€€„†‡ˆˆ‡†…ƒ‚‚ƒ†ˆŠ~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~€€€€~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~|{xyywuvx{|||{||||{|~€}||zwxyyyyxyyz{{}}}}}~}~€€}}{{{{{{{zzzzzzzz{{{{{{||||||||||||}~€‚~}}}~~~~~~€€€€€€„†‡‡…††ƒ€}}‚ƒƒƒƒƒƒƒƒƒ‚€€~}yvtsttppnnt~ƒ…††††††…„…………ƒƒƒƒ……††„ƒ‚‚‚‚‚‚‚‚ƒ„ƒ‚„ƒƒ†‡ˆ‰‡…ƒƒƒƒ„ƒ…†ˆŠŠ~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|{xyxxwxz|||||||||{}€|{{{yz{{yyyzyz{|}}|||||}~}}{{{||||zzzzzzzz{{{{{{||||||||||||}~€‚€}}}~~~~~~€€€€€€€€€‚……ˆ‰ˆ……ƒ‚‚ƒƒƒƒƒƒƒƒ€{xustrqqsv{€„…†††††…„„…………„„„„…………„ƒ‚‚‚‚‚‚‚‚‚„ƒ‚ƒ„†††ˆ‡†„ƒ‚ƒƒƒ…„…‡ˆ‰‰~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~€€€€~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~|{xxxxxy{{||||||}|}€€zyyyyzzz{{{|zzz{}}{{{{{{|}}}{{{||||{{zzzzzz{{{{{{||||||||||||}}€~}|}}~~~~~~€€€€€€‚ƒ†‡‡‡†…„„‚‚‚€€‚‚‚ƒƒƒƒƒ‚‚€~{yvtruuy}„…†…………„ƒƒ…………„„„„„„„„†„„„‚‚ƒƒ‚…†ˆˆˆˆ†„ƒ‚€€ƒƒ„„…†‡‡‡~~}}}}}}~~~~~~~~~~~~~~~~~~€€~~~~~~~~~~}}}}}}}~~~~~€€€€~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~|{xxxxyz{{||||||}}€zwvyyyz{{{|}{{{{|}{{{{{{||}}{{{{{||||zzzzzz{{{{{{||||||||||||}}}~}|}}~~~~~~€€‚‚‚ƒ„…††……ƒƒ‚‚‚€€€‚‚ƒƒƒƒƒƒ‚ƒƒ€~{xwvy{|€‚„„…„………„‚‚…„…„ƒƒƒƒƒƒ„„†„„„‚‚€€€€‚ƒƒ……‰‰ˆ‡„„„‚ƒƒƒƒ„…†††~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}}}}~~~~~~~~~~~~}~~~~}}~~~~~~~~~~€€~~~~~~~~~}~~}}~~{zyxxwyz{{||{||||}€€}yttvwz{{||~}|zzzz|{|zz{||}~}|{{z{{{||{{{{z{{{{{{{|}|||}}}~~}}}}}~~}}}}}}~~~~~~~~~~~~€‚ƒƒƒƒƒƒƒƒ‚ƒ‚€€€‚ƒƒƒƒƒƒƒ„„‚‚€|||€€ƒƒ„…„……„„ƒƒ„„ƒ‚€‚ƒƒ„††……‚€€ƒƒ„„„‡ˆˆ†„……‚ƒ‚ƒƒƒƒ„„…………~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~}~~~~}}~~~~~~~~~~~~~~~~~~~}~~}}~~|{yxxxzz{{||{||{|}‚‚}zusuw{||}}~}{zzzz{z{zz{|||~}}{{z{{{||{{{{z{{{||||}}|||}}}}}~~}}}~~}}}}}}}~~~~~~~~~~~~€€ƒƒƒƒƒƒ‚‚€~~€‚ƒƒƒƒƒƒ„„ƒƒ€€~€‚‚‚ƒ„…†……††„„€}~€€‚‚ƒ…††……ƒ‚€€€ƒ‚„„„†‡ˆ‡„……ƒƒƒ‚‚‚‚ƒƒ„„„„~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~}|zyyyyy{{||{||{}~‚€{vstw{||~~~}{zzzz{yzz{z||{}}}|{z{{{||{{{{z{{{||||}}|||}}}}}~~}}}~~}}}}}}}~~~~~~~~~~~~‚‚ƒƒƒƒƒƒ€€€~~€‚‚ƒƒƒƒƒ„„ƒƒƒ‚€‚‚‚ƒƒ„…‡ˆ‡‡‡‡„‚€~|z~~€‚‚„…††……ƒ‚€€€€‚ƒƒƒ…‡Š‰………ƒƒƒ‚‚‚‚ƒƒ„„……~~~~}}}}~~~~~~€€~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~}~~~~}}~~~~~~~~~~~~~~~~~~~~~~~}}~~}|{yyyxx{{||{{{|~‚‚~{xutwz||~}|}{zzzzzyzz{z||{|}}|{z{{{||{{{{{{{{||||}}}}}~~~}}~~}}}~~}}}}}}~~~~~~~~~~~~€€ƒƒƒƒƒƒ€~~~€‚‚ƒƒƒƒ„„„„„ƒ‚ƒ…ƒƒ„„„…†‡‡‡…†‚€~}|z{|}~€‚„…††……ƒ‚€€€‚ƒ„„ƒ†Š‹‡……ƒƒƒ‚‚ƒƒ„„~~~~}}}}}~~~~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}{yyzyyxzz|||{{|~‚}zwuuvz|}|}}|{xxxyyzxy{{||||||zzz{{{||{{{{{|||}}}}}}||}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~€€ƒ‚ƒƒƒ€~~€‚ƒ„„„„„„„…„‚ƒ„…„„……†‡††……‚{zzyy|~‚ƒƒ†††‡‡††„ƒ€‚€‚‚ƒƒƒ„ˆŠˆ…„‚€€€€ƒƒ‚‚~~~~}}}}}~~~~~~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}{yyzyyzzz|||{{}‚ƒ}zwuuuy|{z||{zxxxyyzxyzz{{{{{{zzz{{{||{{{{{||}}}}}}}||}}}}~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~€€‚‚‚‚‚€€€~~€€€€€‚ƒƒ„„„„„„……„„„……†‡‡ˆˆ†„‚€}}|zyy}‚‚„…†‡ˆˆˆ††††„ƒ‚€‚‚ƒƒƒ„‡ˆ‰…‚€€€€€‚‚~~~~}}}}}~~~~~~~~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}{yyzyyzzz{{{{|~‚‚€~|zwuuux{{z{{{zxxxyyzz{yyzz{{{{zzz{{{||{{{{{||}}}}}}}|}}}}}~~~~~~~~~~~~}}}}}}||~~~~~~~~~~€€€€€€‚ƒƒ„„„„„„…………„……†‡‡ˆ‰†ƒ€€|z{€„…‡‡‰‰‡††††††…„‚‚‚‚ƒƒ‚ƒ†‡‰…€€€€€€~~~~}}}}}~~}}}}~~~}~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~}~~}}}~}{yyzyyzzzzz{|~‚‚‚€~}|zwutsw{}|{|{yxxxyyz{{yyzz||||zzz{{{||{{{{{||}}}}}}~}}}}}}~~~~~~~~~~}}}}}}}}~~~~~~~~~~€€€€€€€€€€€€€‚ƒƒ„„„„„„…………„…„…††‡ˆ…‚€‚‚€}ƒ†ˆ‰ˆ‰ˆ†„„……††…ƒ‚€€‚‚‚ƒƒƒƒ…†‰…‚€€€€€€€~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|zzzzzzzz{{zz|‚€|zz|zwuvuvy|||}|yyvvwxzz{yzzz{{{{{z{{zz||||{{{|}~}}~~~~}}}}}}~~~~~~~~€€~~}}}}~~~~}}}}}}~~~~~~€€€€€€€€€€€€€€€€€‚‚ƒ……„„„……†„„ƒƒ„„„„……„ƒƒƒƒƒ‚‚‚€ƒ…†‡‡‡†…ƒƒ…………†…ƒ~‚‚ƒƒƒ„……‡†‚€€€€€€€€~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€|z{{zzzzz{{z{~€ƒ‚~|{zzyxvttvz}|}||yyvvwxzz|{zzz{{{{{{zzzz||||{{{||}}}~~}}}}}}~~~~~~~~€€€~~~~~~~~~}}}}}}~~~~~~€€€€€€€€€€€€€€€€€€‚‚ƒ……„„………†„…„ƒ„„„„„……„„„„ƒƒƒƒ‚„…†††…„„€‚„†……‡‡„‚€~‚‚ƒƒƒ„……‡‡ƒ€€€€€€€€~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~€|z{{{zzzz{||}€‚ƒƒ||{{yxvqrv{}|||{yywwwwzz|{zzz{{{{{{zyzz{{||{{{|{|||~~~~}}}}}}~~~~~~~~€€€€~~~~~~~~~}}}}}}~~~~~~€€€€€€€€€€€€€€€€€‚‚ƒ…„„…………††……„ƒ„„…………„„„„„„„„ƒ„„…„„„ƒƒ€„†……‡ˆ†„€‚‚ƒƒƒƒ„…‡‡…‚€€~~~~}}~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~‚€|z{{}|{zz{|}‚ƒ‚€}}{zzxxvqru|}|{zyyyxwvwyz|{zzz{{{{{{zyzzzz||{{{|{|||~~~~}}}}}}~~~~~~~~€€€€~~~~~~}}}}}}~~~~}~€€€€€€€€€€€€€€€‚‚ƒ…„……„……†††…„ƒ„„††‡‡…………„„„„…„ƒ…ƒƒ„ƒƒ€„…‡ˆ‡ˆˆ†‚‚‚‚ƒƒƒƒ„…†††„€~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}}~€€}{{{~}|{z{{}ƒƒƒ|zyzzxwvtqv|~||zxwywwuwxy{{zzy{{{{{{{zz{zz{{}}}~|{}}}}}}}}}}~~~~~~~~~~€€€€€~~~~}}}}}}}}}}~~~~~€€‚‚ƒ„……‡†…………††„ƒ………†‡†‡‡‡‡…………„…„„ƒƒ„„‚€€‚„†‡ˆˆ†„ƒ€€‚‚ƒƒ‚‚ƒ„…†‡…‚€~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~€}|{{|{|{{|~‚ƒ‚~|{zyyzzxvsqw||zxwwywwuuvxzzzzy{{||{{{zz{zz{{|||}|{||||}}}}~~~~~~~~~~~~€€‚€~~~~}}}}}}}}}}~~~~~~~~~~€€€€‚‚‚„„„………………†‡…„……„†‡†‡‡‡‡‡‡‡‡„…„„ƒƒ„„‚€€€„…†‡‰‡…ƒ‚‚ƒƒ‚ƒƒ„„…†…ƒ~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~}|{{{z||{|ƒ„„€|z{zyyyyxvqpv|}{yvvwyxxuuuxzzzzyzz{{{{{zz{{{{{{{|}|{||||||}}~~~~~~~~~~~~€€‚‚‚‚~~~~}}}}}}}}}}~~~~~~~~~~€€‚‚ƒƒƒƒ„…………†‡‡†……ƒ…††‡‡‡‡ˆˆˆˆ†…ƒƒ‚‚ƒƒ€€€€ƒ„…‡‰‡…ƒ‚‚‚‚ƒƒƒƒ‚ƒ„…†……‚€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~~||}~~~~}|{{{{||z}‚„„€|{||zywxytppu{|yyvvwyyxvuvwyyzzyzzyy{{{{z{||{{{{{||{||||{{}}~~~~~~~~~~€€‚‚‚‚~~~~}}}}}}}}}}~~}~~~~~}}~~€€‚‚‚‚‚‚ƒ„………†‡†………ƒ„†‡‰‰ˆ‰‰‰Š‰‡„‚‚‚‚€€€ƒ„…‡‰ˆ…ƒ‚‚‚‚ƒƒƒƒ‚‚ƒ„…†…ƒ€€€€€}}}}}}~~~~~~~~~~~~~~~~€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}|~~|||{{{{{z}€ƒ…ƒ~|}~~{{yxwspotx{zyvvvwwxyxxwxxyzzy{zz{{{{{|}}||||}}}}}}||||}}~~~~~~~~~~~~€ƒ‚‚€~~~|}}|}}}~~}}}}}}||~~~~~~}}€€€€€€‚‚‚‚ƒ……††‡†††…ƒ„„†ˆ‰‰‰‰‰‹Š†…ƒ‚€€€€€~~~‚„†ˆ‰‡…ƒ‚‚‚‚ƒƒ‚‚‚ƒƒ„„……„€~~€€€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~|}}{{{{{{~‚ƒƒ}||~€€}|zxvroosxzyyvvvuwxzzywxxyzzy{{{{{{{||}}}|||||||}}}}~~}}~~~~~~~~~~~~€‚‚‚€~~~|}}|}}}}}}}}}}}||~~~~~~~~€€€€€€‚ƒ………†‡‡†…„„„†‡ˆ‰ˆ‰‰‰ˆ…„‚€€€€€~~~~„…†ˆˆ†„ƒƒ‚‚ƒƒ‚‚‚‚‚„„………ƒ‚€~€€€€}}}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€~|~}{{{{|}‚‚€~||~|ywuqnnrvyyyvvvuwy{{zxwwyzzy{{{{{{{||}}}|||{{{{||}}~~}}~~~~~~~~~~~~€€‚‚€~~~}}|}}}||}}}}}}~~~~~~~~€€€€€€‚„……†‡‡††„„„…†‡‡‡ˆˆ‡†‚€}~~~„…††ˆ†„ƒƒ„„ƒƒ‚‚‚‚‚ƒƒ„………„€€€€€}}}}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€~~{{{{|€}{{‚‚€}ywurooquyyyvvvvxy||{ywwyzzy{{{{{{{||}}}|||{{{{{{||}}}}~~~~~~~~~~~~~€‚‚€~~~}}|}}}||}}}}}}~~~~~~~~€€€€€€€€€€€„……††‡‡†„„ƒ…††††††…ƒ€~~~~~~}~~~€ƒƒ……‡‡„„„„„ƒƒ‚‚‚‚‚‚ƒ„…†…ƒ€€€€€}}}}}}~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~||}~~~~~~~~~~~~~~~~~~}}~~~€€€€~~~~~~€€}|{z{z}€}{||~‚‚€}yxvsqpquyyxwuuwyz}}|{yxyyzxzzz||{|}}}}||||{{{{zz{{}}}}|~~~}}}}}}~~€‚€~~~}}}}}}}}|}}}}}}}~~~~~~~€€€€€€€‚ƒ…†…‡‡†…„„„„…‡†…„~~~~~}}~~~~‚ƒ……ˆ†…„„„„ƒ‚‚‚‚‚‚„„……‡„ƒ€€€€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||}~~~~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~€€€€€}|{z{{~€~|{|}~‚‚€}yxxuroptwxxwvuwz|}}|{zzyyyxyzz{{{|}}}}{{{|{{{{zz{{|||||}}}}}}}}}~~€‚€€~~}}}}}}}}|}}}}}}}~~~~~~~€€€€€€€„……‡‡‡……„„ƒ„††„‚€~~~~~}}~~~~€ƒ…†‡†…„„„„ƒ‚‚‚‚„„„†‡†‚€€€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}~~~~~~~~~~~~~~~~~~~~€€€€~~~~~~€€€€~|{z{}€~}|{||~‚‚~zyxusppsuxxwwvwy{|}||z{yyywxyyzz{|}}}}{{{|||||{{{{{{{{{|||}}}}}}~~€‚‚€~~}}}}}}}}|}}}}}}}}}~~~~~€€€€€€€€€‚„……††……„„ƒ„††ƒ‚€~}~~}}}}~~~~ƒ„…‡†…„„„„ƒ‚‚‚€ƒƒ„†ˆˆ‚€€€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|}~~~~~~~~~~~~~~~~~~~~€€€~~~~~~€€€€}{z{~€}|{{|}~‚‚zyxuspprtwxwwwwxz{}|{z{zyxwxxxzz{|}}}}z{{{||||{{zzzzzz{|||}}}}}}~~€‚ƒ‚€~~}}}}}}}}|}}}}}}}||~~~~~€€€€€€€€ƒ……††…†„„ƒ„††…ƒ€~|~~||}}~~~~~€‚„…††…„„„„ƒ‚‚‚€ƒƒƒ†ˆˆ„‚€€€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~~}~~~~~~~~~~~~~~~~~~~€€€€€€€€~~~~~~€€|{{}ƒ~|{{{|}€‚€~|ywvsooqsuwxvwwxyy||{||zyyxwwxyyyz{{}}{{z|{{{{zzzzzzyyzz{{{|||}}~~~~~~‚ƒ‚‚€~}}}}}}}}}}}}}}}||}}~~~~€€€€€€€€€€€„„…††…†………†………‚€~}}}}}}|}}~€ƒ„……††„ƒƒƒƒƒ‚‚€€‚„„†‰ˆ†ƒ€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€~~~~~~€€€€€|{{~€‚€|{{{|}€‚~zxxtpopqsvwvxyyyy{{{||zyyxwwxyyyz{{}}{{{|{{{{zzzzzzzzzz{{{|||}}}}~~~~~ƒ‚‚€}}}}}}}}}}}}}}}||}}~~~~€€€€€€€€€€€ƒƒ…†……‡‡‡††………ƒ€€}}}}}}|}}~€‚„……††…„„„„ƒ‚€€€‚ƒ„†ˆˆ‡ƒ€€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€~~~~~~€€€€€|{|‚‚€€{{{|}~€‚‚‚€~zyxtpopoqtuvyzzyy{{{||zyyxwwxyyyz{{|||||{{{{{zzzyyyzzzz{{{|||}}}}~~~~~€‚‚ƒ‚€~}}}}}}}}}}}}}}~~~~~~~~~~€€€€€€€€€€~‚ƒ…„…††‡††………„‚}}}}|||}}~€ƒ…„†††…„„„€€‚„†‡Š‡„€}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€~~~~~}~€|{|€‚‚~{{{}~~€ƒ„ƒ{ywtqppmnqtuxyyyyzz{||z{{yxxxyyyz{{{{}}|z{{{{zzzyyyzzzz{{{|||}}||}}~~~€‚‚ƒ‚‚€}}}}}}}}}}}}}}~~~~~~~~€€€€€€€€€€~€ƒ„„„…†ˆ††…………„‚}}||{{|}}~€€„„††„ƒƒƒƒ€€€€€‚„†‡Šˆ…€~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€~~~~~~}}€€€€~|}~‚ƒ€~|{||}|~€‚„ƒƒ}zxurqpnnoqsvwzxyyz}}}|{{zyxyyyzzyz|||||{zz{zyyzyxxzzzzzz||||||||}}~~~~€‚‚€~}}}}}||||||}}}}}}~~~~€€€€~~~~ƒ„ƒ…†‡††……………ƒ€~}{z{{|||~~~~‚‚„……„„„„ƒ€~~‚€‚ƒƒ…ˆˆ…‚€€~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€~~}}€~|~€ƒƒ~}|{||}|~€‚„ƒ‚€~zwtrnnonnpstwzz{yy|{||{{z{{yyyyyyz||||||{{{zzzzyyyzzzz{{||||||||||||}~~€‚‚}}}}}||||||}}}}}}~~~~~~~~€€‚ƒƒ„†‡‡‡……………„}|z{{|||~~~~‚‚„………………ƒ‚€}}€€‚ƒƒ„ˆˆ…‚~~~~~~~~~~~~~~}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€~~}}€‚‚‚€~}‚ƒ‚~|{{||}|~€‚‚‚€~{vtrnnonnprsvyz|zxyy{{{{zzzyyyyyyz||||||||{zyyyxyyyyzz||||||||||{|||}~~~€‚€€~}}}}||||||}}}}}}~~~~~~~~~~~~~~‚‚ƒ…‡‡‡……………„‚€~|{{{|||~~~~€‚‚ƒ………………ƒ‚€}|~€€‚ƒƒ„ˆˆ†ƒ‚‚~~~~~~~~~~~~~~}~~}~~~~~~~~€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€~~}}‚ƒƒ€~~‚ƒ‚|z{||}|~€€‚‚~{wsqqponnprsvxyz{xyy{{{{zyyyyyxxyz||||||||{zzyxxyyyyzz{|||||||||||{||~~~€€‚€}}}}||||||}}}}}}~~~~~~~~~~~~~~~€‚‚„‡‡‡………………‚€}||||||~~~~€‚ƒ………………ƒ‚€}{~€€‚ƒƒ†ˆˆ‡ƒ‚‚‚klmnooonooortuvvwxzzzzwurpqqppppqqrssuxyzzyyyy||}}~€€€€€€€€€€}~~}}}}}}}}{{||||||||||||}}~~~€‚ƒ„„…………††……††„ƒ‚|sjd^[]_ada_][^cehhe``bglsz€„……„„{qf]YX]bjtz~{urppmifaadgknprvyz€€€€€€|wpmjjjjjjjkknqqtuuuuuvvuwvwyxupf[XTV[^choy€‚‚ƒ€€~~|xvtomjggcdfgghfhjjmprtttttsrrqpoqutuuz|zvplhbbdca\Z]dknttsrrsuwz~‚ƒ…‚kmnopppopppsuvwwwxzzzywurpqqppppqqrstvwyzzyyzz||}}}€€€€€€€€€€}~~}}}}}}}}||||||}|||||||}}~~~€‚ƒ„„…………††††††„ƒyohc_\^_ac`]\Z]aehgda`beiqxƒ……„„‚zrh]YX[cisz~€~zvspomhfaacfkmnknsy~€€€€€€~}ztnkiihhhhiklnpqtuuuuuvvuwvwyxupf\WTW\^chpx€€€€~~|xusnliggcdfhhigijjmprtttttsqqqpoqsrqswy~~zuplgbbcba[Y\ckottsrrsuwz~ƒ„†ƒlnopppoqrrstuvwwxzzzzxvtrpqqppppqqrsuvvxzzyyzz{{||{}~~€€€€}~~}}}}}}}}}}||}|~|||||||}}~~~‚‚ƒ„„…………††‡‡††„ƒ}wogc_]^_bb]ZYX[_dggeb_acfmu~‚……„„‚{si^[Y[bhpx}~|xtrpmnifbbbejmonorw{€€€|zvqkihhhhhhiklnortuuuuuvvuwvwyxupg\VUW\^cgpw€€€€~~{wtpljihgdegiiiijkjmprttttsrppqpoqsrprvz||ytqmhcbcb`\Z]ckruusrrsuwz~ƒ…ˆ…npoppposttvuvwxxyzzzzxvtrpqqppppqqrssuvwzz{{zz{{||{|~~€€€€~~}~~}}}}}}}}}}||}}~~||||||}}~~~‚‚ƒ„„…………††‡‡††„ƒ|vngc__^`cb]ZXWZ_dhjhc`aaent}‚……„„‚{ria][\bgnu||zurqommifdbbdinsvwwv{~€€~~€{ytojhhhhhhhhilnortuuuuuvvuwvwyxupg]VUW[^dfow€€€€€~~{wsnliiihffhiihjjkimprttttsqppqpnqsrptx{{{xtqlheddc_\Z\dmtvvsrrsuwz~„‡ˆ…moqqrrrstutuvwxxy{{{ywusqpppppqqrrrstuuwyyy{}}|||||}}~}~~~~~||~~~~}}||}}~~~}|}}}}~~~~‚ƒƒ„„…………†††††„ƒ‚}vmga]^_cda]ZXVY]elnida``emt|‚ƒ………ƒuleb``chot{yvtqomnjihgdcdhow}ƒyx{€}{xrnjhhhiiiiijlnosuwvvvvwwvwwxxyupg]VUVZ^dhow~€€€€€€€€|zurojghhgghhjjikjkmnpstsuuropppoprrqqtxz||wsqkgecca_[\`elsutssstvxy}„‡‰†nooqssqrtuuvwyyyy{{{yvvrqpppppqqsstttvvwyyy{||||||}}}~}~~~~}}~~~~~~}}||~~}|}}~~~~~~‚ƒƒ„„……††‡‡†††„ƒ‚~vnd]\^acca_ZVUX`jqrld``aflrz€ƒ………ƒ€zrhc``dhmrxwsqnllmjjjjfdeit~†…{prz~~|xsplhhiijjiiijmoprtvvvvvwwwwwxyzvqg]WUWZ^dgow|€€~{wromighhffgijjjklmmmpsutttroooomprqprtxz{zwsniecaba_^_bflsusrrtuuxz~ƒ‡ˆ‡nonprrqrtuvwxyzz{|{{yvvrqppppprrssuuuwwxyyy{{{||||}}}~}~~~~~~~~~~}}}}~}|}}~~~~€‚ƒ„„……††‡‡†††„ƒ‚wnb]^^cccb`YTTZdotunea`bfkqwƒ………„{slfaaeilottpnmlllllljhfgkwƒ…ƒynqx‚€zvqlihjiikkjjjkmoqrtvwwwwwwwwwxyzxri_XTW[_cgnu|€€~}zvsoljhhhhffgjlllmnnllpsvtssroooomoqportxz{yvrlhca`ac``bcgnstrqqtuuwz…ˆˆˆnnmnqqrsstuvwx{z{|{{ywvtqppppprrssssuwwxyyy{{{||||}}}~}~~~~~~~~~~~~~~€€€}|}}~~~~€€€‚‚„„……††‡‡†††„ƒ‚xnea`_dee`^XUT\hqwwngaaadkqw~ƒ………„{sliccfjlortpnmlklkmmlkhhnv~ƒ„wpq{€‚~xuoljhhjjkkjjjknpqruwwwxxwwwwwxyyxskaYTV[`cgmt{~~~{xsnljgghhhgfgkmmmonlllpstsssronnpnpqoortyz{ytpmjdb`aeccdfjnrsrqqtuvxy†‰‰ˆnnmnpqsttuuvwx{|~~|{ywvurqqqppqrrtsuwxxxxxzz{{z{}}}}}~~~~~~~~}}~~~~€€€~~~~~~~€€€€‚‚ƒƒ„„‡‡‡‡…………„‚~ynhebdefc^\WUV_lu{zqjba`ciou|„„…„‚|uqjeefikoppomllkkmnnnjhinv}‚‚xqqx}wsnkhhiijjkkiiknoqruvxxxxxxxvxxyyytkbZVVZ`chms|~€~}ytojihghfefghimoooonljkpsssuuroomnppommptxxzxspmida_aebadimrturpqtuwwy}†ŠŠ‰nnmnpqstuvuvwx|}~~|{xvutrqqqpprssuuwxxxxyyzz{{y{}}}}}~~~~~~~~}}~~€€€€€€~~~€€€€€‚‚ƒƒƒ„††††……………‚yoigcdeec^\WUYdpx}|skda`bflt{€ƒ„…„ƒ}wskecgijloonmllllopnolklow~‚~xrpt|~yuqlkiijlnmmkiilopqsuwxxxxxxxwxxzzyukc[XW[_bgms{€~~~}xuqmihihgdefhjknooooljjkpsssttronmnppommquxxxvromhb`_cebdhkqtvsqpqtvwww|†ŠŠŠnnnnpqtuuvvwyz}~}}{zxvutrqqqrrrsuvwxxxxxyyzzzzy{}}}}}}~~~~~~~~~~~€€€€€€€~~€€€‚‚‚ƒƒ„……††……………‚€zrkhdcdec`^YW]ht{}vohc``dkry‚„…„„xrkdbfhjknonlllllppoonnqrx€{wtoow}|vrpkhjklooonkijlppstwxyyxxxxyxyyz{ytlcZWY]_bglsy~}zxtpoliggfedefijkmoooolijmpsssssromlnppommquxxuspmkfbaaeeehlotwvsqpqtvvuuy…ŠŠŠnnoppqtuuvxy||~~~{ywutsrqqqrrqrtuvwxxxxzyzzyyy{}}}}}}~~~~~~~~~~}}€€€€€€€‚‚‚‚‚ƒƒ„………………………‚€ztmhdbceb`^ZW`lx~~xqjd`_cjrx}€„……„€yskfaceimmmmkllllqpppmotuy€{ussojs{{vqojhjmnooqokiiknouvxyyyxxxxyxzz{{ytlc[XX\^afksy|~{vtpmjjhgedccefjlnnooooljjlpsssssromlnppommrvxxsqnkifa`cefhloqvywrppquvuqtx…‰ŠŠklnopqsuvwxzz}~~}{zxvutsrqqqqrrsuuwxxyyyz{{yyz|}}|||}~~~~~~}€€€€€€€€ƒƒ‚ƒƒ„„„…………†„…ƒztnheccb`^][\dpz‚€ztjda^bhnt{€ƒ„…ƒ{tmkfdeikjijkkkmnrssrstvxz}ysnnqphluvtokjjklnoqrpkhikmoswxyxxxxyyyyzzz{zume^ZZ\_aglrwz{}}{xspligffdbbcdfhmnppponmljhlortsrsronlnpqnmnqtvurqnmkgc`bffjoruxzwrpqruvtrtx„‰‹‹jlnopqsuvyyz{~~~~}{zxvutssqqqqrrsuvwxxyyyz{{zzz|}}|||}~~~~~~€€€~€€€€€€€€€€€€€‚‚‚ƒƒƒ„„……………„„‚€ztnhdbba`^]\^ju|€ƒ€zumgb^aflsz€ƒ„…ƒ|vomhehjkiiijllmpsuustvwx{{uoijoplhpspkijnpoprstpkhikmoswxyxxxxyyyyzzz{zvnf_ZZ\_bgkqwz{|zxupligeddcbbdehjnoprponmljhlpstsrsronlnpromnqstroolljfcacfhmrvy{zurprsuvtsrv‚ˆ‰Šjlnopqsuvyy{}~~~}|{zxvutssqqqqrruvwxxxyyyz{{{{z|}}|||}}~~~~~€€€€€€€€€€€€€€€€‚‚‚‚ƒƒ„„…………„ƒƒ‚~xslfb``ba`^^cox}ƒ€{vqkc``fkqyƒ„…ƒ}wpnigikjhijkllnqtvuttwxyyzunlnqolikoniikoqonrttpkhikmoswyyzzyyyyyyzzz{zvnfa][]_bgjowz{zwtrniggecbcddefiknoqsponmjhhkpstsrsspnlnpromnoqqolkkkhdccegjqvz}}{usrstuwtsrv€‡‡ˆjlnopqsuwyz|~~~~}|{xvutssqqqqrruvwxxxyyyz{{yyz|}}|||}}~~~~~€€€€€€€€€€€€‚‚ƒƒ„„…………„ƒƒ}wpieb``a``_`eqz~‚ƒ€{vrlea`eiow~‚„…ƒyrniehkjiilmlloquwvuuxzyxxwrpttmkjhllgjmppmmsttokhikmoswz{zzzzyyyyzzz{zvnfa^[^_bhinwz{yuqnkgeecbacffegimnppqponmjhgkqttsrstqnlnpqnmnnnnmjjiifdddfjlsz}~zurstuvwtsrt†‡‡lmooopqvxz|}~}}{yvutsqqqqppqrtuvxyyzyz{zzyy{{}}yz|}|}~~}}~~€€€€€€€€€€€‚‚€€‚‚ƒƒ„„„„„ƒƒƒ{unie`]]``^^biu|‚ƒ‚{tlfa`bgpv|„„„}{vpkigklihknmnpruvvvv{}zwwvvwyvkhiimqmnptvrmoqrpkiijmprwyzyyyxyyyyzzzzywohc`]^`cfkotxyusnligddb_abdffhlmpqrrpmmnjhhkrvutstspnlmopmklllkjjhffcbbegknt{~~xtrrtvwwtqpu}ƒ††mmnpoprwy{~~~}}{ywutrrrrrpprttuvxyzzzzz{{{{{{{{y{|}|}~~~~€€€€€€€€€€€‚‚€‚‚ƒƒƒ„„„ƒƒƒ‚€zrlgb^\]___afnv~‚‚ƒƒ}unhbabhpv|€ƒ„„ƒ~}wrljghjjijllmpsvvxxw|zuuyz{yslgfglqrqt|snqrpljijmprwz{yyyyzyyyzzzzzxoid`^^acfjnrvwspmjedccb`bceghjmmppqqomklkiilrvuuttspnlmopmihiigfgeedcbadgkrx|}wtqqtvxvsqqt{‚……mmmooprwy|~}}{yvutsssrrrrsttuvxyzz{zz{{||{{yyz||}}~~~€€€€€€€€€€€€€‚‚€‚‚ƒƒƒ„„„ƒƒƒ}xqje_]\^__`chqz‚‚ƒƒ‚~wpjdbagnuz‚„„ƒ€~xrmjgghkjjklmqtvxzzz~ysuz}}vqnheeiostz‚‚|tpqrpkiijlorw{|{{zzzzzz{{zzzxqjd`^^acfhlpttqljfdcbbdddeghjlmmnnppnlklljjnrvuuttspnlnppkhgfffeeedccbaehlrx}}{wspqtvwurqprz……mmmnnprxz}~}}{ywvusssqqrrqstuvxy{{{||{{zz{{yy{||}~~~~€€€€€€€€€€€€€‚‚‚‚ƒƒƒ„„ƒ‚ƒ‚€|xphc^]]_```clu{‚‚ƒƒƒxrkfb`flrx~„„‚~ysmjgghjimlnoruxz{{{€zsuz~|toojfeglru{€~xtrrrpigijkorw{|}}{{zz||{{z{{xslc`^^acfhlorqnjhedcbbdddgiklnoommppnllmmllnrvuuttspnloqpjfeeedcbddccacfilrx{~|{wsqttvvuqqpqy€„„llnooqtw{~~~~~||{yvvusrrqqpqqsuvvwwzzzzzzzzzzz{{{|}~}~~~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒƒƒƒƒƒƒ‚~ysngc`__```aemw‚‚‚ƒƒƒ€{umg``chou|‚ƒƒƒysnjfehjjklprtwyz|z|~wqw~~yurokjihjoqx|xrquvtojghklprw|}||{{{z||{{{{{xrkda__bcegjnpojhefdbabbcgihjmoonmmoommnomkkosuuuuuspmlopoicbeea`adcdddffhmrx||{zuqqssuurqqppx‚‚lllnorux{}~~~~||zxvvtsrrqqpqrsuvwxxzzzzzzz{{zz{{z{}~}~~€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒƒƒƒƒ„„€{vnjfc^]\_``bhnx‚ƒƒƒƒƒ€}woi`_bgns{ƒƒƒ~ysnieehjjklptxz{zywyzxus{{yupmlkjlmryyuqrxyvqkhhklorw|}|||{{{{{{{{{ywqkea``bdegjmnniecedcacccfhijnoonmnppnmmnmlkpsuvvvvtqnnpqnhbbdda``bcddddghmry}|{ytqqssutsrrrrw~‚‚lllnqsvx{{}}~~{{zwvutrrrqqprstuvwxxzzzzzzz{{zz{zz{|}}~}€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒƒƒƒƒ…„€|wsmhdb^\Z``adjqz‚ƒƒƒƒƒ€~xqkb_bflrz€ƒƒƒ~xtnieehjjklqty{|zywvvvvw}€{wrponnmot{xtsv||xtkhhklorw|}||||{{zz{{yyxvplfb``adghikkkhbacddbdfefhjknoonmoqqpmmnnllptvvvwvurpoprmgaabb`_`abcccdghmry}|zxtqrssuttsrqqu|llmoruvy{{}}~~zzywuusrrrqqqsstuvxyxzzz{{{{zzzzzzz{{|}~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€‚‚ƒƒƒ‚ƒ„‚~ytplgcc_[Z_`cfkt{‚ƒƒƒƒƒ€xrmc_afjpyƒƒƒ~ytnkhehjjklqtx|}|}zuvvtv|‚‚€|ytttqpopu|ysu{~}xsmihkmprw|}|||||{{{zzwwwvplgd``aehhhhghfcaddddghhikklnoonnpqqoooonlnrtwuuwwsponoplfaaaa_^aaabccefhmry}|zxurqssuurqqqqsz€€klmoqswxyz{|~~~|zyxwvutrqqrrrtuvuvxxwxxx{{z|zz{{{{{||}~~€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚ƒƒƒƒ€|uqmgec`^\]__bgpy‚ƒƒƒ‚ƒƒ‚zune`bekqw}‚‚€xvpjfdfhjkmsw||}}yuutu|‚}zyxzvtursv{wqt|~}xrlhhjloqv|}}}}{|||zywwwvtrnie```cijjgggecacddhhijkkklnonmmmpnmpqqonnruvttvvspnopplf`aa^^__aabcdggimsx|{xvrprstvtqrrqqsy~klmoqtwxyz{|~~{zzyxvvttqqqqqrsttuvxxxxxyzzz{zz{{||||}}~~€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚ƒƒƒ~ysnjeec`^]]abeirz€ƒƒƒƒƒƒ‚€{vofaaejpv|‚‚~yupjgeghkknuyz}}„‡zzyz}€zwyyvrpqrtx{xsu|~}yskghjmprw|}}}}||||zywwvusroiea``chhieeeebbdeeiijjkkjlnonmlmnllorronosuwuuvvtqnoppkeaba^]]^addcfiijnty|{xvrprstvtqqqpprx~|kmmoruwxyz{|}}{zyxxwuttqqqqqqrssvwxxyyzzyyyzzz||||||}}~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ|vpjfeec`___cdhmu|€ƒƒƒƒƒƒ‚~|voga`dhnu{‚‚}zuqmhfghkkpvzy~†Šƒ}~~}}xvttroopruxzxuu}~}xrkghjnpty|}}}~}}}|zywvutspmidbaadffedffebceggjjjjjjiknonmlllllprrpoosvxuuvvtqnoppkebba^]\_adeehjjkosy{zxvrprstvtqooppqw{znomosuwxyz{|}}|zxwwvutsqqqppqrrsvxxxyyzzyyyzzz||}}||}}~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ|ytmieeec`^_bdejqx|€ƒƒƒƒƒƒ‚~|vohb`cgmu{‚‚~zupohdfhkkow{|ƒ‰ˆ‚~}}}|xutqqnmpqsuwzxux}~}wqmihjlosx|}}}~}~~|zywuusrplidcabedddeggebcfhikkkkiiijnonmkkllmqrrqpotwxttvvurnoppjd`aa]_\_accgikklotyzyxvrprstvtqooooqwxwmmmotuvxxz{{||}{xwwvvusrppqqrsstwxxxyyzzzzyzzz{{{{||~~}€€€€€€€€ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚}wqlieeeca`adegksz€ƒƒƒƒƒƒ‚‚|vohb`aglsz|wtpmieegklpvz{‚†…€zvtvxxurqnlnnortuxzxvw~€~wqokiklnqv{}~~~~~|{ywussttqmhebbbeeeffggggfgjkjkmjijjjnmmllmmnopoqroqtvutruvtqmnqokc``bbb``bcdfijllqtxzyxuqqrtuvsqpppppuutmmnptuuvxy{{||{zwvvuvusqqqqqrrstxxxxyyyzzz{{zz{{{{}}~~}€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚|wqljgfdcbacfgilt|€‚ƒƒƒƒƒƒ‚‚~xpicaaglry~€€~{vspmjgehknquy{€‚„‚zupnqrtrqolkmoptxvx{zux~~xqnjikloqv{}~~~~}|{ywtsssspmhebbbefggggghhhhjkklmjijkkmmlklnmnnppsspruvutruvtqnoqokc`_cccaacdfgjjlmruxzytqqqruvuqopppppstsmnoqsttuwxzzzzzywwuutsrqqqqqrrstwwxxyyyzzz{{zz{{{{}}~~}€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚|wplifeedddeghkpw~€‚ƒƒƒƒƒƒ‚‚ƒzslgbcfkpw}|ytrpnkhehlpptx{‚„‚~wspmnpqppnmmmotxzyy{xuy~~xqmiiknprw{}~~~~|{zxvstssrolhfcaadgghhhhiijjlmmnnkjijjkkkjlmmmlprssrsvwuttvwtqopqokeaaddcbbeegijijnrvyyxurqqruwtpnppppoqrqmmprrtuvwxyyyyyxvvvvsrrqrrqqqrstvvxxxyyzzz{{zz{{{{~~~~}€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚|vpkjfdedfeggimsy~€‚ƒƒƒƒƒƒ‚ƒ‚~zrniacfjov}~{xsppokiefknotx{‚„‚|vqqmmmnnnmmnmqvz|}yxuuz€~xqmiiknpsx{}~~~~|{zwvssrrqnkggc`adgghhhijjkkmnmonljiiijjkjklomkpqrttuwwvtuvwtqopqokfccdddccegjkjjkosvyxwurqqruwtpoppppopponoqqrqrswxyyyxxxvvutsrqppppqrsttuvwwwxyz{{{{||}}~~~~~~~~~€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ}wpjhgfgghhhjkov~€ƒƒƒƒƒƒƒƒ‚~{tojeceiot{~|zvpppomifgjnoswz~€zuppnmmnnnnnmotwzzxuu|~xpkiiknsuy|~~~~}|zxvvtttsrmjhieabdgjklkikkmnpqqpnljfggijkkmmmnmprtttwyywtuvvtpopqolfcceddcbdhjlkkkosxxxvrqppsvxvrpnponnnoonoqqrqstvxyyzyxwuuttrqqppppqssttuvwwxyyz{{{{||~~~~~~~~€€€€€€€€€‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ~{unjhhgiiijjlmpw€‚ƒƒƒƒƒƒƒƒ‚{upjgceiosy|{xuppppnifeinorvz~{vqommoqomnonqvx}‚~ytty~xpkijknsvz|~~~~}|zxvvtttsqnkiifbbdimpqommnnpqrspmkjehhijjjlklmnprstuxyyvuvvvtpopqolfeedcccbdhjlllkptwxwvrqppsvxwsqnolkkknnnoqqrrstuwxxyxwwuussrqqppppqssttuvvwxyyz{{{{{{}}~~~~~~~~€€€€€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ~ysnjiijkkklllnsy€‚ƒƒƒƒƒƒƒƒ‚€|vpkfceimswzywtqppomjgdgloquz~ƒ}xsomnqpnmmooqvzƒ„€{vuz€~xpljkkorwz|~~~}|{yxvvtutspoljhgccglostspopqrqstqmkjghhijiihiklnprsuvxyxutuvusoopqolfffdcbbbdhjmmnlpsvxvurqppsvxwtqonmlkknnnoqqrrstuvwwwwwwvvssqpqppppqssttuvvwyzyz{{{{{{||}}~~~~~~€€€€€€€€€‚‚‚‚‚‚€€‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚€~wrljjjklmmnnmouz€‚ƒƒƒƒƒƒƒƒ‚‚}wpkfdcgmrvyxutqppnlkhdgkoquz~€ƒ€}wrpnpqnljloory|€ƒ…‚zxwz€~xplkklprw{|~~~||{yywwuttrqmkkhgcfknrtvurqrsttutqnljiiiijiigijknpqsuuz{xursvuroopqolfddcbbbbdhjmmnmnrvwvtrqppsvxwtrpnmkjjmmopqqrsstvwwvwwwwvuttrqrqqqqrrsttuvwxyzyz||z{{z{{|||}~~}~}€€€€€€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚‚€€|uojijkmnonponqv{‚ƒƒƒƒƒƒƒƒƒƒ‚‚~xqlgddglpuwwvsqoomlkiehknosw}|vrplmlggjlnpuz‚„†ƒ{vuz~wpkklmoqv{}~€€}}{yzxwutrqonkjhgfhnrvyywusrsuvwurnlijjjhiiiggjknqrsvvxyyustvuqooqrpledbcbabcehknnmmnsvwutrqopsvwwtqomkjjjlmppnnqrrtvwwvvvuuuusrsrrqqqqrrsttuuwxxyyzzzz{{yzzzz{|}}}|}|~~€€€€€€€€€€€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚ƒ€€yrliijknpqpponrv|‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚ysmiecfkotuvurqoollljegimosx~€~}{wrpljgfgkloru{„…†ƒ{vsw}~wpkklmoqv{}~~~~}{{zyxvtrqonljiggjrx{||zwvstwxxvsoljihhhiiihhkmnqssuwyzyustvvroorrpjddbbbabcehknnnmosvvutqqoqsvvvtqomkjiilmppnnqrrtvwwvvvssttsrsrrqqqqrrsttuuvwxyyzyyzyyvvvttvy||{z{z{{}~€€€€€€€€€€€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚ƒ~wpjihiloprqqpnrw|‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚€zuniecekorstsqpoommljeeimpqw}~}|{xspljghikmosx~‚…„†„|vrv}~wpkklmoqw|~~~~}}|zyxvtspooljihhmt{~~|yvtuxyyvspmlhgghiiikjjmnqsstvz{yustvwrporrpgcdb```acehknonmpswutsppqstuvvtqomkjhhklppoopqqtvwwvuussttttsrrqqqqrrsttuuuvwxyzyzzxvrqqpprwzzyyywyyyz|€€€€€€‚‚ƒƒƒƒ‚‚‚‚ƒƒƒ‚‚€|voghghmpqqpqposw|‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚€{vpiebfjnprsqqpooonljfejopqu{||{zxsplijijloot{ƒ……‡†vsx}~wpkklmoqw|~€~}}|{zxvusqnoljihinw}€}zwuwy{{vspmkighhiiijjikmqsstvz{yustwwsqorrphedb__`acehkoonmptwusrppstuuwwtqomkjhhjknoooopqsuvwuttuuuuttssrrqqrrssttuvvwxyy{{ywusolkijmqxxvttrstsvy}~€€€€~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ{tmhghjkoooooopt{‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚€|vqjdaeimopqqppppnonjhginpptz}}}{xtqmjiiimnqv}ƒ…††‡‚yuw‚wpkkjkoqv}€€€~}|zyxvuqpnolihhjszƒzwvw{|zwtpmkjihiigiiiklnoqsuwy|yutuwvrrqrsnfabb``_`cfhknnnnquvtrqqqstuvxwtpmljihhjknooooprsuvvuttuuvvssrrrrqqrrssttuvvwxyy{|ywspmjifgjntsqokjikmquz}~~€€€€‚‚‚ƒƒƒƒƒƒƒƒ„ƒ‚‚}wokhffhjnoooopqu|€‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚}wqjebdgknopppqppopokhginpqsy}}~{wuqlkiiinosx~‚„………†ƒ}wx~~vokkjkoqv}€€€~}|{yxvuqpnpmjiiku|ƒ„‚|xwx||yxurpmkihggfgiiklopqsswz|zvuvwvrrrssmd`ba```adfiknnlmquvtqoppstuvvvrnmljihhjknoppprstuvutttuuuussqqrrrqsssttuvvwwxyy{{xuqljihfegkonjgdcdfimptx{|~~~€€€€‚‚‚ƒƒƒƒƒƒƒƒ„ƒƒ‚~zrkhfdceimpppopqv|€‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚~xrjecceilmpppqppprqmhfilpqsx|}}{wtqlljjjnqv{‚…………†„}uv}|vpkklmoqv}€€€~~}{zxwvrqopmkjjmv~‚„„ƒ}yxz||ywurqnlihfffghhjlpqqqrv{{yuwxwvrrrssme`a````adgilnnklquvtqopqsttuvvqnomljhhjknoqqqrstuvusttuussrrqqrrssttsttuvvwwxyy{zxtpljigfedhjhgcb`bcfjlpty{|~~~~~~€€€‚‚‚ƒƒƒƒ‚‚ƒƒ„ƒ€{vpidba`chmqpppptx|‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚~xskfccfiklooprsssrsnheiloprw|||zusqnlkkjosx}‚…†††‡†ztt}|vqmmlmoqv}€€€~}{zywvrqoqnkjjow~‚„ƒ‚‚}zz||{ywurpljihggghhhjloprqtwz|wsvwwvrrrssme```__aaehjmnnlmquvtrqqrstsuwwqnonlkhhjkkmoopqqqstssttssrrrrrrrrssssststuvvvxyz{yxuqmkjhgeccddcbba`adffipv{}~}}~~€€€€‚‚‚‚‚‚ƒƒƒƒƒ‚€}ytnfc````fnqqqppv{~ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚xrmfacfkjjlmoprssssoighknpqtz|{ytqqlkkllpvz~‚„…††††ztu}€~wpllklnrx}~~~}||zxvusqoqomkkpw}ƒ„€}{z{zyxwtrpmjigffiihgijnpqrsw{|yuuxwurrrrqja^_]^`bcfhkmnmlmrsuttrprtttuwwqnmmkiffhkklmnpqqqssssssssrrrrrrrrsssstttuuvvwxyz{yxvrnljhfdbaaaaa``accddekpv|}|}~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒ‚€~{uqkfa]]`ciorrqqrx}€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ysngbadijjkmoprtuutpkhhknoqtyzzvqnnjkklmrw|‚„…††††|tsz~|unkkklnrw|~~}|{xwvtrpqomlkqw|‚{yxzyxvusrpmihgggiiihikmpqrswy{xuuwwurrrrpi`]^]^`cefiknnmlmrssrsqprvutvwxsnllkifdhjklmnpqqqssssrrssrrrrrrrrrsssttvvvvvwxyz{yxvrnmjigecbabca``bdcdccfmrx{}}~~~€€€€€€‚‚‚‚‚‚ƒƒ‚‚~{vqlie_]\`ekpsrqrty~‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚{uoidacehjkmopstwwurkihjnoqtxyysnlljkkmpuy~€‚„„…††††€vrvz{unkkklnsw|~€€€|{yxvtrpqomlkqwz}€}yvvvtutsppolhgfhjiiihhkmopqswzywstvwuqqrroh`]_]^`cegilonmlmqrrqqqprvwuwyxtollkiedfhklmopqqqssssrrssrrrrrrrrqrssttvvvvwwxyz{yxvqnmmkigedcddb``ceedccfiouy{{}~~€€€€‚‚‚‚‚‚ƒƒ‚ƒ€~xrmheb^\]`fkqsrqrtzƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚|vokebdegjkmpquxyyvslihjmoptwxvrnkmkkknrv{ƒ„„…††††‚xtsyzupjjklosx}~€€~}{{ywurpqomllqvy{}{xtsrqrrqnmmkhgffiiihhgimopqsw{ywssvwuqprrog`]^]^_bdgjlonmlmprsrqqrtuvvwyxtollkidceglmpqppqqrsttttssrrsrrrrrrsttuuuuwwxxxyz{zzwtqqqpmifffeceddeecdbaadktxz||}~~~€€€€€€‚‚ƒƒƒƒƒƒƒ~xrmfc`^[\]akmqsrsvy~€‚ƒ„„„„„„„ƒƒƒƒƒƒƒ‚€}wqkeceggijmpqsxzzxunjhhoppsuvsnlkjkllnqw~‚ƒƒ…………††„{srxxupkjklnrw|€~}}||zxvsrrpnmmqtwy{}{xrqrnllnlmmkjfddeiiihgggkoppswz{zvtuutqqsrne^\\[_abegjnpnkilpqsrpppsuttuxxqmnnlhfdefmnppppqqrsssssrrrrrqrrrrssttuuuuxxxxxyz{{{yvttvvqmihhgfilmllhhdb`bfpvyzz{}}}€€€€€€‚‚ƒƒƒƒ‚‚ztnhda^\\]afmoqrsvy|ƒƒ„„„„„„„ƒƒƒƒƒƒƒ‚~xrkdadfhjjmprtx||zwpjhhmppqsrokiijlllnqx‚ƒƒƒ…………ˆ†‚yrqtwupljjknrx}€€€€}}}}|zywussrpnooruxy{wrmkkhgfhikmkhddceijjihhhhlmotxz|yutuutrrsrne^\\[_adfjmoqnkilopqpppqststuyyrmmmlhfdcemnppppqqrsssssrrssrqrrrrsstuuuuuxxwxxyz{{{zywwxxtqlkhilortrrolgbaacltwwxz|}}~~€€€€€€‚‚ƒƒƒƒ‚‚|wpjdb_^\_`dhmpqrux{~€‚ƒƒ„„„„„„„ƒƒƒƒƒƒƒ„‚xrleacdhjjmqsvz}}zxrkhhloppqmjghhjlllnqx‚ƒƒƒ……„…‡„€yrqsvtoljjknrx}€€€€~}}}}|zzxuusrpnpoqtvwwrnigfdcadgjnkhddceijjhjkkijjotxz|wstuutrrsrne^\\[^aefloopnkjmopppppqstsstzysnmmkgeccemnooppqqrsrrrrqqrrqprrrrsttuuuuuwwxxxyz{{{z{yyzzwtnmjlosuxwwsqjbbbcjpsuvyz||}}€€€€€€‚‚ƒƒƒƒ‚|unica^_^abfinqstvy}~€‚ƒƒ„„„„„„„ƒƒƒƒƒƒƒ„ƒxrlfabcghjmqux|~~{xtlghjnppmkgefejmllnqx‚ƒƒƒ……„……ƒ{tstvtnljijnry~€€~~}|}}|z{xwvtqpoonortvtmiddc`_`cgimkhedceikjhkmmljknswz|wstuutrrsrne^\\[`begknopnkkmooqqqqrtvvrsxxqmlljgebdflmmmmonpqqqqppqqppqqqqrsstuuvvvvwxxxyz{|{{{{||{{wunnmptwxzzzxsldbbcfimqsvyz{||~~€€‚‚ƒƒƒƒƒƒ‚ypkgeb```bdfkorsuy~€‚ƒƒƒƒƒƒƒ„„„„ƒƒ‚‚ƒƒƒƒ}tmhb`dghikrvy~~}zvnhgknqmifebdehkklnrx‚ƒ„„„„…………‚~xvwwuplkijosx}~~}}}||}|{{yxvtqnpnnnpsusnf```^]^cfilkkgdcfjklloonnlknqw{{xtuvvussrqog]Z[^bfhhknpomjjmppssqqsuvvtsxxqnmlihebefklmmmnnpqqqqppqqppqqqqqrttuuvvvvxxxxyz{|{{||{{{{xvrqqtwyy{{{zupifcbcdfilprrstw|~}~€€‚‚ƒƒƒƒƒƒ‚€}vnifdcaaabeknpruw{€‚ƒƒƒƒƒƒƒƒ„„„„ƒƒƒƒ„„„„‚}voicbcgiikquy}€~{vpigjmnjgcdcdehlkmnrv}‚ƒ„„„„……„ƒzxyyupkiijotx}~~~~}|{||||zxvtroonnmnqsrme`_`^^^bgjmnlhdcfiklnqqoomkmqv{{xuuvvusssrnf\Z\`cgjjloqpmijlnprsqqsuvvrtxwqnmkjiebedklmmlmnpqqqqppqqrrqqqqqrttuvvvwwxxxxyz{|{{||||{{zwuuuwyz|{|||xsnjgcb`bdgjkjkmrw|}~€€‚‚ƒƒƒƒƒƒ~zsnigdbaaefjmpptx{~ƒ„ƒƒƒƒƒƒƒƒ„„……ƒƒƒƒ„„ƒƒ~vqlfcchjkmrvy}€{xqjfhlnjebbceehllnoru|‚ƒ„„„„……ƒ€€}xvzzupkiijnsx}~~~~|yyz|||{ywusqnnnmnpqqld`_```aejmopmhdcfiknortqonlkou{{wtuvvusstsme\Y[aegkkloqplhijnprsqqsuvvquyvqnljjiebdblmmmlmnpqqqqppqqrrqqqqqstuuvvvxxxxxyyz{|{{}}{{yy{yxxvyz{}{{{{{uqkifc`abffffgimu{}~€€‚‚ƒƒƒƒƒƒ‚}wqlhecaabghlnotxz}€‚‚ƒƒƒƒƒƒƒƒ„„……ƒƒ„„……ƒƒ}vslebehjlnsx{‚€{ysjefjnjd`acefhlmnqsv}‚ƒ„„„„……ƒ€€|vtyyupljjkmrx}~~||xwxx||~|{xusqnnnnopqpkdbddbcdjmpppkgdcehkpqswrpoljnt{{vtuvvussrqme[YZ`fhkllpqqkhjimorsqqsuvvuuyvqnkjihebcckjjklmoqrrqqppqqrrrrrrstuuttvvwwxxxxyz{{||{|||{{|{zz{{{{||||{zvsplid`acaa_`cehox{~€€€€‚‚ƒƒƒƒƒƒƒ‚€{vqljgda`dikortv{}€‚ƒ‚ƒƒƒƒƒƒƒƒƒ„……†„„„„……„„ƒ~zslfcegjlpuz~‚‚}yskfehlkc`acehlnnnotx~‚ƒƒƒƒ„ƒƒ„‚|trwzupllmnmqx}€€€}yurrwz{|}|zvspnonnnqrnkeffhjlorsutpkfbbeilorvzwrnjint{{vtuvwtrssrlcZYV_gkmmnpqojggjmpsspqtuxwstxupoljjhecdfkijklmnpqqqqppqqrrrrsttuuuuuvvwwxxxxyz{{||{|||||||{{{{{{||||{zwtrnjfceb^\Z[^`bluz~€€‚‚ƒƒƒƒƒƒƒ‚ztolihfdehmptvy{ƒƒƒƒƒƒƒƒƒƒƒƒ………†††††…………ƒ|tmfcdgjmqv{~‚‚€}xtlgfhlkf`adhjnpomou{€‚ƒƒƒƒ„„„ƒ‚}wqqwzuplllmorx}€€€{vplmtx{{}{xurponnnnopokijlqstvwwxwqkfbcegjnrx{ysnhgmtzzvtuvwtrstslc[YW_imnmopqmiggjnruspruvwusuxupnlkjhedegjijklmnpppqqppqqrrrrsttuuuuuvvxxxxxxyz{||||~}}}}||||{{||||||{zxxtqljggc`][[\^`hqx}€€‚‚‚‚ƒƒƒƒƒƒƒ‚~xrmkhgggjnsvxy|~‚ƒƒƒƒƒƒƒƒƒƒ„„……††††††…………ƒ€}umfcdgjosw}‚‚‚~xtnhgilkhbbfjmqrpmou|€‚ƒƒƒƒ„……‚yroovyupllklnqx}€€€xsjffnuy||zwspoommlmoppnnotwxxyyyzwrlfbcegjmqx{|unfejszzvtuvvsrstsne^\[ahlnooppmighjostrrsvwwutvxuomlkjhfefhihjknomoppqqppqqrrrrsttuvvuuvvyyxxxxyz{|||}~}}}}{{||{{||||||{zz{urnljgda_]]\^`enw}€€‚‚‚‚ƒƒƒƒƒƒƒ‚|wqlkhggjnsw{||€‚ƒ‚ƒƒƒƒƒƒƒƒƒƒ…………††††††…………ƒ‚}ungcegjnrx~‚‚‚~ytpjgjljhdcfkottqmot{ƒƒƒƒ„……‚xqppvxupllkllpx}€€}|vofbbkry|}{vrqnmnmjmqqpqquyzzz{{zzwrlfccegilqw{~xpfchsyyvtuvvsrstsmf_]\bfjooopplhehjnrsqtuvwwutvxuomlkjhgeghjijkmnopqqqqqqrrrrrrsttuuuuuvvxxxxzzyz{{}}||}}||||{{{{{{||zz|{zywtrnlhfd`____`enw}‚‚ƒƒ„„„„ƒƒ‚€|wqlkjhhlrx{}~€€ƒƒƒƒƒƒƒƒƒƒ„„„„……††‡‡‡‡††……„ƒ|vogefhknsz€‚‚‚zupkhjkmiechnsuwrlmrx}€ƒ‚‚„„……ƒ~vooqwyvokkjkmry~|sia]]fou{{xtqpomlmmnpqppqv{}{{}}}{yskfcdehjlrx}|vnfaeoxxvtvwvttttrnha`^agjoprrqlifikprssstwxxuuxyvolllkideghjjjkmnppqqqqqqrrrrrrstuuvvvvvvxxyyyyzz|{||{{||{{{{zzzzzz{{zz||{yywuqnkhfdccb``dmv}‚‚ƒƒ„„„„ƒƒ‚zuomjjijpx|~€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„…†††‡‡‡‡††……„ƒ|xpifehkosw}‚ƒƒ€{wrljiknjgekrwyxtnmnu|‚‚‚„„„„ƒ}uooqvyvokkjknsy~‚{qg`[]enuzzvqonnnlmoppqqqsx}}}}}zrkgcegikmrw}|vme`bmuwvuvwwtuuuspjed_bhlorssrnihjmrttsstwxxusvxuolkkkiegijjjjkmnppqqqqqqrrrrrrstuuwwwwvvxxyyxyzz||||||}}||||{{{{{{{{zz|||z{ywvroljiged`^bkt}‚‚ƒƒ„„„„ƒƒƒ~ytnmjjjouz~€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„…†††‡‡‡‡††……„ƒ}yrkffgjosx~ƒƒƒ‚}zunjhjmkiipvz|{uommr|„„„„„„‚|urqquxvokkjknsy~zph`\^entyxsommonlmoppqrruz}~~~~~~|xqjgdehikmqv{{vld`bltwvuvwwtuuvtpifeadjmpsssqnigkmrutrstwxxuruxuoljjkigikmjjjkmnppqqqqqqrrrrrrstuuwwwwvvxxzzxxz{||||{{||{{{{zzzzzzzzzz|||{zyyyxsqnlkhea^ajt}‚‚ƒƒ„„„„ƒƒ„~xsmlkkkrw{ƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„…††‡‡‡‡‡††……„ƒ~yskgfgjosy~‚ƒ„„ƒ|wpkhjlmlksy{|zuokmtz€„„„„ƒƒ‚{vtrquxvokkjknsy~€zqia^`gotwtrnlmnmlnnopqppuz}~~~}{vpifdegiknpvz{uld_bmuyvuvwwtuuvtpigecejoqsssplihklrwurstwxxtqtwtoljjkifhkmijjjlmoqppppppppqrsstuvwxxxxwwxxzzwxxy{}||{{zz{{zy|zyyyy{{{{||{{zy||{zvtrplga^agr|€‚‚‚ƒƒ„„‚ƒƒ‚~xrkjklpv{~‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„††‡ˆˆˆ‡‡†††…„ƒ{uoheehmrx~‚„„ƒ‚€€|wrliimnlmu|~}ytolnrx‚„„„„ƒ‚{utvtuvvnlklkotz‚‚{ricbchorssolllkklmnoppqquz}€~}}vngcdefgjmqvyyulc_bkuxvuvwvutvvsnighggloprtrnjgfjmquustuxxwsquwrnkkjhffijmijkjlmopppppppppqrssuvvwxxxxwwxxzzyyxy{}||{{zz{{zyzzyyzzzz{{||{{{{{{{{xwtsnga^bis{€‚‚‚ƒƒ„„ƒ„ƒ~|vpljklqw|€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„†‡‡ˆˆˆ‡‡†††…„ƒ~zupheehlqw}‚ƒƒ‚~zwsmjimomov~€~ytommrxƒ„„„„ƒ‚yuvzvvvwnkjkmoty~‚‚{ricdfjoqrrolmmlllmopqqqqsx}~{tnfccefhimrvyytmd_bjtwttwxvutvvsoihiihmoprtsnjhgjosvuttuxxwsquwrnkkjhfgjmnijkklmnoppppppqqqrssttuvxxyywwxxzz{zy{{}||||||{{zyxyxxyyzz{{||||||{{{{zywupha^ajt{€‚‚‚ƒƒ„„……‚€|xupmkklqw}€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„†‡‡ˆˆˆ‡‡‡††…„ƒ~zupgedgjov|‚ƒƒ‚~zvvtmjimoopxztollrxƒ„„„„ƒ‚}wty}yvvwpkjknnsx}‚‚€zsjffjlnpppnnmmllmmpqqqqqsw}~zsmebcehijmswyytmf_ajsvtuvxvutvurnjijjjnprsutnjiilqtussuvxxvrrwxsnkkjhfgjoqijlllmnoppppppqqqrssuuvwxxyywwxxzzyyz{{}||}}~~{{zyyyxxzz{|{{||}}||||{{{{xwsja^`jt~€‚‚‚ƒƒ„„ƒƒ€zutolkmmsx‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„†‡‡ˆˆˆ‡‡‡†††„ƒ~{uogedfinu{ƒƒ‚€}yuvumkimopqy{toklrxƒ„„„„„‚yvty}zvvvqmlllmrx}‚‚{sjggklmpppnnmnlmooqrqqrrtx}}~}zrlebcegiknsxyyunha`iruuvxyvutvuqnkjjlknprsutnjjjnruursuwxxuqtxxsnkkjhfgjnpijjjklnppqpqqqrqqrssuuwxyyyyxxyyyzzz{{{{||||}}{{yyyxyyyz{z{{{{||||{{{{{{{zuka^ajt|€‚ƒƒ„„ƒ„ƒ‚€}xqolllnptz~€ƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„……†‡‡ˆˆˆˆˆ‡‡††…„|vpifdeims{ƒƒ€|vttuokjmopry}zuqkjovƒ„„„„„zvvz}yuttqnlmmnsy~‚|tollmmmoppmmomnmnoqqqqppsx}~~~~}ysmgbcegjkosy{ysmfabjrttuwxwvuuuqnkkllmoqsttqmkklpvwvrsvvxxtptyysnlkkiegilqijjjklmooqpqqqrqqrttvvwxyyyyxxyyxxzz{{{{||||||{{yyvuuuvwzyzz{{||||||{{{{{ytkc^ait|‚ƒƒ„„„„‚~{uomlllmqu{ƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„……†‡‡ˆˆˆˆˆ‡‡††„ƒ€zvqjfdejnry~‚ƒ€~zqortokkkmpsx}zvqlkow„„„„„ƒ~zxyyyvstsrnlmmosy‚‚}uqnnpnmoppmmomnmooqrqqppty}~~~~|xrkgcdfhkmqrx|ytnfbckprtuwxwvvvuqmjlmnoqrsttqmlkorvxvtuvvxxtptyysnlkkieijlqijkkkklmnppqqqqqrsuuwxwxyyyyyyyyxxzz{{{{||||zzzzyxvvttuwxxzz{{||||||||{{|yumd`ags{~ƒƒ„„ƒ„‚€{uqmkkllmqw}ƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„……†‡‡ˆˆˆˆˆ‡‡††ƒ‚}xurkfdeimrw}~{vnlorokjjlorw}€|vqnmqw~ƒ„„„„‚}z{|xusrrsrnlllnry‚€|vrrrsnmoppnnommnoppqqqqqtx|~~~~~|xqkgceghknstz|ytohddmprtuwxwvvvvqlijmpqrstuusommotwxvtuvvwwsrtyxrnlkkigjlnsijllljklnopqqrqqrtwwwwvwyyyyzzyyxzzz{{{{||||zzyyxxwvvvuvvwyy{{||||{{||{{}zxpd`afsz~ƒƒ„„ƒƒ‚~ysnjjkklmpw}€ƒƒƒ„„ƒƒƒƒƒƒƒƒƒƒƒƒ„„……†‡‡ˆˆˆˆˆˆ‡‡†ƒ‚~ytrlfdegkqv|€}yslkmqokijmosw}|vqmlqx~‚„„„„}z|}xtqqqtqnllknqyƒ€~yvrttqnmopponommooppqrrqquy}~~~~~|vqjfccfhkotw}|ysnjffossuvwxwvwwwqljinprtutvvsomnptwxvstvvwwrrtywqnlkkiijlpuhijllllmmoqqrrrrsuwwvvwxyyxy{{zzz{{{||||}}|{{{yyxxwwwwuutuwy{|{{{{||||||{{xpfaaeqz~‚ƒ„„ƒ‚~ysolhhiijnsy~‚ƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…††‡‡ˆˆˆˆˆ‡†‡…‚€}ysrmgddfiptz~~zunfgmqnjhllnsv{}vrnlrx~‚ƒ„ƒƒ‚~z{{vsopqtpmmmlmqw€‚{xssuusommppoppnmnoopprrrruz|~~}}zvoiecdghlosy}|wrliggnrttvwwwvwwwqmkloqsututvspoorvxwsstuuwwssuxvqomljjjjmqwhijllmmnopqqrrsssuwwwwxxyyxy{{{{{{{{|||{|||z{{yyyyxxvvuuuvwyz|||||||||{{{{wpe__cnx|‚„„€zunkihghijpu{€‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…††‡‡ˆˆˆˆˆ‡†‡…‚€zuqpmheegins{|{vpjedinokimmosu{€}wrolpv~‚ƒ„„„ƒ€zzyvtppqsqnklkmpv€~yvtuwwupnnqpprqomnoppqrrssuz|~}~}zvoidcdfhlpsxz{wqlihjpstuxxwwvwwwrnlmoqsuuutvspopswzwstuuuxxttwywpnlljjjloqvhijllnooqrrrrrsstvwwwwyyzzyz||||{{||}}|z{{{z{{yyyyyywwuuvxwyy{}}}}||||{{{{xri`_clu{€ƒƒ~wskgggfgikqw|€‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…††‡‡‡ˆˆˆˆ‡†‡…‚zuqomiffhhnsyyvpjecegnnmmonpstz}xsolou}„…„„ƒ‚}{ywurqrsqmjlklnu{}zvsuwyyvppprqqsqomnpppqrrssty|€~}|zvojeddfhkptxzzvpmkimruuuwxxwvwwvsnlmoqstuvuvsqpruxzvutuwwxxttxzwolkljjjmprshijlmnppqrrrssssuwwwxxyyzzyz||||{{}}~~}z{{{{{{yyzzyyxxuuuwwyyz{{}}||||zz{{zulc`djsz~‚‚‚}voieefefilsx~‚‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…††‡‡‡ˆˆˆˆ†††„‚~xtrpniffhhlruvrmfbbdflmnoqssrsz}xsolou|€„†……ƒ„|}{urrrtplkkjknsxywtqtw{{wpporsstqomnppqqrrssty|€}|yvpkdcdehkpt{|xupmkjotwusvxxwvwwutnlmpqstvvuvsrpsuxzvuuvyyyyttvxvnllljjjkorqijjllmopqqqrrsttuuxxyzzyzzz{||{{|||||||{{{y{yyzzzzzzzzxxvwxxxy{{||}}||{zz{ztmc`cjtz~€‚‚€xtngdccdgipt|€‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…†…†‡‡‡‡‡‡††…‚€{wtpnnjhhiilprrmhdba`cinpquyywvz~€|xrmmqw~‚…†……„„‚€€{urqstpljkjkmqtvtqptx{zurpssuvupnmnnoqqsqqruy}~{xuojeccehlquzzxsonmoquxwuwyzxxxxwrljmprtvwuvwtrrvx|{wuuvxyzyuuwytnkkkkkkllonijkllmooqqqrrtuuvvxxy{{{{{||||||||||||||zzy{yyyyyyyyyyxxxxyyxy{{|||||||zz{ztnf``hqx~€€}upjeaccdgksw~€€‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„…†…†‡‡‡‡‡‡……„~zvspnnlhgiilopoiec`abdjprs{‚}yz~~zvqmnqwƒ…†……ƒ‚€€€ytsrstpljkjjknrsrnnsx{zusquuvvspnmoopqrsrqsvy}~{xsniedcfjmqv{zwponmoswzxvy{zyyxxxrljmprtvwvvxvstxz}{wuvwxyzxuuxysmkkkkkkllmlijlllmopppqssuvvvwxxy{{{||||||||||||||{{yyyzyyyyyyzzzzyyyyyyy{{{||||{{|zz{zvpja`enw}€€|smgb`acehnv{€‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„„…††‡‡‡‡‡‡…„ƒ}xsqpnolhgiijmlkgda_bdhlqux}}{~zvronrwƒ…†……‚€||}xrqtvvpljkjiilpqpmlqvz{vsuvywvrpnmprrrrrsrtvy|~~{wrnieeehknrxzyvponmouxzwxz{{yyyyxrklnprtuvvwwutvy{}{wuwxxyywuwzyrmkjjjkkkljjijlmlmnopprsuvvvwwxxy{{{}}||{{||||||||zzyyyzyyxxxxzzzzyyyyzzz{{{||{{zz|zz{zwrldafnw|€€€€zslf_^acejpw}€‚€‚ƒƒƒƒ„„„„ƒƒƒƒƒƒƒƒƒƒƒ„ƒ„††‡‡‡‡‡‡…„€{vqqpnomihiiijihec`_cejorv|{{}|~„…€|ytpnryƒ…†……ƒ~|}|wqqvwwpljkjhikopnjkpuz{wsxyzxvrpnooqrrrqsstvz|~{vqnifefilpsxzytqonoquy{wy{|{yyzzxrjlmprtvvvwussuz|}zwuwxxyxwux{yqmkjiikkklihjklmmooppqrtvvvvwxyyz||||||||||||||||{zzxxwwxyyyyyzzzzyyyyzz{|||{|{{{{{{{{{zsngdekuz€ysje`__ciou|€€€‚ƒƒƒƒƒ„„„„ƒƒƒ‚‚‚‚‚ƒƒ„„„„…………†††…„‚€}urpponmkhghhiiebdccbikmpsx}yx|†‰‰‡wposyƒ…………ƒ‚}xrqwzyqkjjkjkmnnlikqu{{xvx{{xwspopprrrqrttuwy|~~{ywqlhddfgjnrvwuqqqopruzzxwy{zyyyzysmmpqsuuvuvvtsvy{}zwwxyxzyxuvzzsmjiiijjjjhijklmnopppqrtvvvvwxyyz||||||||||||||||{zyyywwxyyyyyzzzzyyyyzzyzzz{|{{{{{{{{{zuoieejqx}}}|wqhc```fltx~€€€‚ƒƒƒƒƒ„„„„ƒƒƒ‚‚‚‚‚ƒƒ„„„„…………†……„‚~ytqppnnnmhhhhiieacccdjloqtw{wty{~‚†‹ˆysrszƒ……………„„…|vtw{xqkjjjhjmmkjilrvyyywx{|yvsoopqrrrprttuwy|~~|zvqkgdefhjnsvtspppppruz{xwy{zyyy{yrnmqstuvvvwvtsvz|}zwwyyyzzxvw{{qnkjiijjjjijjklmnopppqstvvvvwxyyz|||||}}||||||||{{zyxxyyxyyyyyzzzzyyyyzzyzzz{|{{{{{{{{{zwqlfdgnvz{{zwqhc``bhowz~€€€‚ƒƒƒƒ„„„„ƒƒƒ‚‚‚‚‚ƒƒ„„„„……………„„‚€~{vtqppnnppkhgghhfbcbbdjmqtvvzvqtuuz€‡‡‚|xvw|ƒ…………„„‚‚}xvw{xrkjiihjkkjijmswxxywx{|xvrnnpqssrprttuwy|~~}}ztpkfeegikosurqppooosw||yyy{zyyz|xrmnrtuvvvwwvttx{}}zwwyyz{{yvy|zrmkhiijjikjkjklmnopppqstvuttuvwwz|||||}}||||||||{{zyxxxxxyyyyyzzzz{{yyzzz{{{{|{{{{{{{{{zxsngbdjqwyyyvojd_bfksz|€€€€‚ƒƒƒƒ„„„„ƒƒƒ‚‚‚‚‚ƒƒ„„„„……………ƒ‚~|yttqppoopqmiffggfbcbabiorsvuvsoprptz‚„~{x}ƒ…………ƒ€€}{ww{yqkjhiikjjjijmswxyywx{|ywrnnpqttrprttuwy|~}|{xrpjfeeghlprtrpppooosx}|zyz{zyy{|xqmnstuvvvxxvtvy{}~zwwyyz{{zwy|zrmliiijjhkjkjkmnnoppqrtuvuustuvx{{{}{|}~}}||||{{{zzyxxxxyyyyyyyyxyzzzzzzz{{{{{{{{{{{{{{{xspidbfmruvurniebchnu{~€€€‚ƒƒ‚‚ƒƒ……ƒƒƒƒ‚‚‚‚ƒƒ„„„„„„………‚€~{xvsqqppnnpqogeefgfcccadhmpswwqjjlmprv|ƒ‚‚||‚„…††…~{xy{wqlkijkkljljkntxzxxwyz{xvtooqrssrqrttuxz}~}|zxsnkgggjllopppppppootz~}{zz{{zz{{xplotuuvwwwwvuvy|~€zwxxy{||zv{|xqljjjjggikikijlmnoppqstutssqqsuxzzz||}~~~}}||{{{zzyyyzzyyyyxxwwxyzzzzzzz{{{{{{{{{{{{{{{zwqkd`djosrpmifccdkpx|€€€‚‚ƒƒ‚‚ƒƒƒƒƒƒ‚‚‚‚‚‚ƒƒ„„„„„„……ƒ€}zwtsqqqppppqrogeefgfdccbafkosvvtmjkmpsw{‚ƒ„ƒ}€ƒ„…††…‚€€|{}wqmkklkkkkmkkouxzxxwyz{xvsppqrssrrrttuvy}~~|zxrnjhghkmnpoopppponou{~{zz{{zz{{xqlpuvuvwxxxuuvy}~zwxxy|||yw||xqlkjkigfhklnijjknopprstutspmlnqtwwwxz|}~~~~~||{{{zyy{{yyyyyyxxwwwxzzzzzzz{{{{{{{{{{{{{{{|ytle`cglnmliebbbflr{}€€‚‚ƒƒ‚‚ƒƒ‚‚ƒƒ‚‚‚‚ƒƒƒƒƒƒƒƒ€}yvtssqppppqrsspiffghgeeea_agmsuwvpmkmprv|‚ƒ……ƒ‚ƒ„…††…ƒ‚}|{~ƒ~wqmkklkkkkmnopux{yyxyzzwvrppqrttrrrttuux}~~{wqnigghkmponnooooonpu|€~{zzzzzz||wolqvvuvwxyyttvy}}ywxyz||{wv||xplkkjhfgijnphijknopprstusrmjhjmpssuvx{||}}~~||{{{zyyzzyyyyyyyyxxvxzzzzzzz{{{{{{{{{{{{{{{|zvnha`cgiihfbbbbhnt}}~€€‚‚ƒƒ‚‚ƒƒƒƒƒƒ€€€€‚‚‚‚‚‚}zxussqnooppqqtupjgghiheffb^]emsuwvplknqtw}ƒƒ„†‡…„‚ƒ„…†††„}|xy€…wqmkjkmmmmnpqrtx{zzxyzyvsrppqruurrrttuvy}~~{vrlifghkmonmmoooonmqv|€~{zzyyzz||vomsutuvwxxwtsvy~€}ywxy{||{uv}|wpljkihfgiloqijijloqqrstusqmhgfhkooprswwz||{{||{{zzzzyyxxyyyyyyxxwxxxzzzz{{{{{{{{zzy{|||||{wqha_bcdeedaabelpw~~~€€€‚‚ƒƒ„„‚‚„ƒ€€€€€€€€}{xxutqrpnnooprtuuqkhhiiihiic^\bluwxwqmmpux|€„…†ˆˆ‡‡„ƒ„…†……~{y|„‡‚xrmkikmmlprvzzwxzzxxz{yvsqpppsutqqrttuvy~~~zuqmjghillkikkmnpomnqv|}|zzzzz{}{tontvstwwxwvqsw{~|xwyy{||ytu}}xqmjjjggghkpujjjjloqrrsturpkgfedgkkkmnqsvz{||||{{zzzzyyxxyyyyyyxxyyyyzzzz{{{{{{{{zzy{||||}}wqhb_baaaabbabfmsy~~~‚ƒƒƒ‚‚‚}}{{{{{wvuuuuurqqonnoommnoqtwwvrkggijjjlkg`W[fquvwrmnsx}€‚„‡ˆŠŠ‰ˆ…€‚…„†……ƒ‚††yqmkjlmmlpt|‚yxyzxxz{yvtrqqqsutqqrttuwz}zuplihhjjjhghiklppmpsx{~}|{{zz{|~{tontvsuwxxwuqsw|€|yxyy{|{ytu|}yqmjjjhgghlsxjjkkloqrrsturpkfdcdeggghkmnqwyz{}}{{zzzzyyyyyyyyxxxxyy{{zzzz{{{{{{{{zzy{||||}}xrjdba__``aaabfltz~€}{zy{~‚‚€~}zxvussrrpooooonjkkihhijkkmorvxywrkgghikjonj`UXeouvwrnot{€ƒ„†ˆ‰‹‹‹‰…~…†…………‚ƒƒˆ‡€xpmkmoqposz€yyyyxxz{zwurrrrstsqqrttuwz}zuolighjigecehjlmnoquxz}}|||{{|}}zsnnuwuvxxxwtqsw|€€|yyyy{{{xrsz}yqmlkkigghltyjjljloqrrstutrkfdcfefffgijlosvyz~~{{zzzzyyyyyyyywwxxzzzzzzzz{{{{{{{{zzy{||||||yskdca__```aabfksy~€~yuqrrz|zwtrponnmmkjiiiihfggdccdefhjosxyywrkffghjkoqmbVVdpvwvrnpt{……†ˆ‰‹‹‹‰…z}ƒ………„ƒƒ‰†xpmkoqttsw}}{wzyxwxz|zxsrsssrtrqqrttux{€€€~zuokhfhiifbadhjllmqswyz}}||||||}|zsmovxuvxwxwsqsw|€€|yyzy{zzunrz}yqmlkligghkuyhjjkmprrrsuwvtokgdgfffddfghimqwy{|{yyyzzyxxxxxxxxxyyzzzzzz{{{{zzzzzz{{z|||||{zyrmifb_\_^^_abglu{€~ztmihjry~|zwqoomlihhggfeddedcddec```aacglswyywrlgfhjhjqtpeYXdouwtqonrw~ƒƒ„‡Š‹‹Š‡„ƒ|z€……ƒƒƒ‚‚„‡„}vpmlnswyz{~|yvvwvwxx{|zwsrrrssrqppprruy|~€}xsmifgiigd``cgjmnnqvxz{}}|}}||}~}zsoquvuwxxxwtqrv}€{xzzz{{yrmqz}womllkjgfglv|hjjlnpqqrstwvuqmifhgggdddddehlruxyzyyyyyxxxxxxxxxxyyzzzzzz{{{{zzzzzz{{{|||||{zysnjhd`]^\\\_`ejtz€{vld``dlvxwsojhgffcaaaa`_^^_^^_`aa^_____ciosuvuqlhfghginrsk][eouvurpnorx}€„†‰ŠŠ‰‡ƒƒ|~„„‚‚…ˆ‚zvpmlnsz~€€}wqmloruww{{yurqqqrrrqppprrvy{~€€|wrmiffhhec^^bekmoortxz|}}|}}||}~}{uqquvuwxxywtqrv}€€{xyy{{|yrmqz|vomlmlkighmv}hjjlmoppqrtvvurnkiihggfdddddehmqswxxyyyyxxxxxxxxxxyyzzzzzz{{{{zzzzzz{{z{|||||{zvrnjfa_^][[]^chpx~~€}xod]\]bhpspmieba`^^^^]]\[XXYXZ[\^^^]]___bgknoqrpkjhffefhnsob_hquwurpnnpsy~ƒ…‡ˆˆˆ†‚ƒ…}€ƒ‚}€€…ˆ‚zvpmlot|„ƒ|tohfinuwwzzzvrqqqrrqpooprswx{~{vqlhffhhec]]beknnquuxz~}|}}||}~~{xtrvwuwxxyvspqv}€{xyy{{{xqlqz{uomlmmkjiglv}hjjllopppqsvvusomjjiffgdeedbefjmqtvwyyxxxxxxxxxxxxyyzzzzzz{{{{zzzzzz{{y{||||}{zxtplhda`^[\]_aemv~€{vk`[[\aglnlgdb^^\ZY[[YYYXTTVTVVYZ[\\\]]abfgjlmnpkigfeccdiqogdlrwwurponnqx~‚ƒ†‡‡†ƒ€ƒ‡†~~‚~z}…‡ƒzvomlpt}†ƒ|umfeinvvwz{zuqrrrssqonnprswx{~~zupkgffhhfd]]cflnostuwz€}|}}||}~~|xsswyuwxxyvsopv}€{xxx{{zwqlqz{uomlmkjihhlu|ikjlmoppqqstuvuqooolkjihgfdbdegimqsuwxwwwwwwwwwwvvyyzzz{{x{{{{zzzzzzzzzzz{||}|{yvromifdb^\]\^ciow|~yqf_YY[_cfigc_][YXYXWWVVUSSSRRUVWXYVXWY[_adggghjnkigec_`dhnqnkqvvvtqpooorx|€ƒ…„‚€‚ˆ‰{}€~|~‡‡‚ztmljov~ƒ„ƒ}slghiluuyz{xsqpprsqponnnqsux{}zuoighikkgc``bfknqqtvwy~}|~|{|~~ytsvwvwyyztolnu|‚€{xyy{{yvokpyxronmnkifehlu{ikjlnoppqqsttutrrrrppnmlihgedddgjnqtuvvvvvvvvvvvvvxxyyz{{y{{{{zzzzzzzzzzz{}}}}{zwtqpnkgc_\]\\_bipvzyvlb]YY\^bcda_[YWVVXWXXWWWVWWUWYZ[\\WWVXZ\_behhfhjiheb`aadhlrtqswwwurpooopv{‚‚€~‚‰Œ†|y||}|‡‡€wploosy„…„siehkmqswz{wtqpprsrommnnqsvx{~~|xsoigghjjhdbachmpqqtvwy~}|~|{|~{utvvvxyyztnlnu|{xyz{{xtkipxwronnnlkhgjnuzikklnoppqqrssttsttuttrqpmljgedcdfjoqstvvuuuuuuuuvvwwyyyz{z{{{{zzzzzzzzzz{|~~}}|{xwusplheb_^]\\^ciorrof^[ZZ]^```][ZXWXZ[\^^__]\[[[]_`ab`][ZYZZ\`cfhhjhjgb`bdffeiqvsvxwwurponnory}~||‚ŠŽ‰y{|yy‡ˆ‚|z{~}}~€„††tkefjnmpsy|xurrrstsokknortwx{~~{vqligghjjieddhlpqrruvxz~}|~|{|~{wuvwwyyzxsmlnu|{xyz{{xrjipwvqonnnnonklptyiklnnoppqqqsstuuvvwwwutsppljgedceiloqrttuuuuuuuuvvwwxxxzzz{{{{zzzzzzzzzz{}||}}|{zwwurojgc`^][\\_djnnib\[\\]`_^_][[\Z[^^accddcbaa_`cdded`^][[Y\]abehjjieaaeggfacpvsxxxxvrponmprx|€‚€}zz…‹Šƒ||{vxˆŠ‡„†Š‹‰…‚„„…‚wmeejonpsy}yusrrstspkjmortwx{~~ztplighikkidfgkotsssuwy{~}|~|{|~|yvvxxyzzwrllnu|‚€{xyz{{yqiipwuqonnnnppllpsyhjkmmnnoqqqrrtuuuuwwxxvvtqojgecabdgilqstttsuuuuuuvwwwwwyzzzzzz{{zzzzzz{{|||}~~}|zwxwurkifca_`^\\_ejie_^\]\\]]\\]^_``bcejjiiihfdcacffhihdb`]\\\Z\_aehjhd`bglmh]]muuyyxwvtpnmnosy|~|zz‡ŽŒ†‚|x|„Š‹‰‹ŽŒˆ…ƒ…ƒ…„{rgcfklpt{}ytrsrsvsplkmoqtvyyzytrplggiklljgikntvvutuwx{~}}~|{|~~{yxxxyzyxsmlmt|‚€zyzzzzxogipttonmnnoqqnlosvjklnmnnoqqqsrtttuuvvwxxxwurmhecacddefnprssstttttuvxxxxwyzz{{zz{{zzzzzz{{|||}~|{xyxvsnlligdc^][]`baa^`^^\\\[\^`defgjkkpponnkifddehhjlmkhfca`_]__`begfb`ekoqk[Xiuxxxwusqqonnosy}{{}}|{€‡Œ‹…}y~…‹ŒŒ‰‡„‡†„„†„…†xledflqt{|xtrsrsuromkloqtvxxxvrpokhhjkmmljlpswwwtrtvx|~}}~|{}~€€~|zyxxyzyxsmmnt|zyzzzzxngiqtvqonopqsusnosuikkmmnnoqqrtsuuuttwwxyxxxxupkhdbbb``binqrrstttttuvxxxxwyzz||{{{{zzzzzz{{{{|}}|zxwsromnmkhe_\[]]]\^___^^^^]]cfklnooqrttsqpligfefggilommlhgdcaa__`abbcdjnooh[Vetwxxwutrqqommrz}yw|€|}†Œ…}~ˆŒŒ‹‰„{w{‚…††‡ˆ…~tmiiosuz{wsrsrsspmlklprsuvvutqnmkkkklmmmmnsvzzxtrtvy~~}}~||~~}{yxxyzzxsmmnt|€~zy{{zzwngirutqrpprsuxvrprthjikmnnpqqstsuttuuvvwxyyxywqojgdb`^\_ekpqqrsttttuvwwwwwyzz||||{{zzzzzz{{zz|}~|ywvssomnnljda][]][Z[^_`_^^]``hlpqsuuvwxwvtqmjigfhggimooopmmihec_^__^adinnllg]Wdrvwwxwtrsrnjip{}xu|~z|…Ž†‚~…ŠŽŒ‰‡‚uos|‚……ˆˆ‰†‚zvporsxz{vsrsrsqnlllnprruvurqpmmkjjklmmooqwx{}xusuwy~~}}~|}~~€}|zxxyz{ysmlmt|€~zy{{zzvpgjrwtrqpoqrtxxuqqtikkmlnopqrttuvttttwwwwxxxxwvrnifb`^\_dkopprrrrssstuuuvwxxy{||zz{zzzzzyyxxwx|}€}{yvtssonnnmjb^\[]^\[Z\]^_^_`celruw{{|||zzyurnlihgghhjosttuspmligecec`cgmqnklmf`gpsuxwurnpohffoz{wt{~~{}†Œˆ„„‰ŽŠ…ƒ€vqu}ƒ„‡ˆŠ‹‹‡ƒ€|yuruz{wsqrssrommopvvtrprpnlkkhigjlnoqru{~}|wuuvxz€~|}}}~€€€~}yzyz{yyrmlmr{zy{{zzvqgjruvtrqppsuyzxsstjllnmoopqrttttttttwwwwxxxxyyvrkhda^\^binppqqrrsssstttvwwxy{{{zz{zzzz{{vrrquz|{xvtrqromlkjhb^]\^\\[[[\]`_`bfkry|~€€€}zxtqnkihhhhjlrvwyyxuqoljfdeecgmrojiktvsspqtwvrkhklhhjt{|wt{~~}~…‹ŽŒ‰…„‡ŠŒŒ‡„‚~usy†ˆ‹ŒŒ‹ˆ†ƒ€zvwz{wrrrtrpnoqw}‚xpoqpnmkjhigjlopqsw|~}zvssvy{€|~}}~€€€€€€}yyz{|yyrmlmr|zy{{zzvpgjsvussrqpsu{|yuttklmooppqqrttttttttwwwwxxxxxxwsplie`]]bhnppqqqqrrrrsstuvwwxz{zyz{zzzzzxqkjlqvz}}zutqqpqqmhedca_]\][[\]\]\`aadgnu{‚‚‚‚|yuromjihiiilntx{|{{yuqmifdcfglrrkghmwz}ztprusomnllkmqx~}z{ƒ€~…‹ŒŒ‹‹ˆ‡Šˆ‰‰…„‚|vx|}{}„‰Œ‹‰‡…€yy{zvspoooonsz‚‡‰„xooqpnljihiikmpprux{|{xsorvy|€€}}}~€€€€€€}yyz{|{ysnkls}zy{{{{umejswtrsrqpsu}~zvuulmmoqopqqrttttttttwwwwxxxxxxxsrolga][`fnpprrqqrrrrrrsuvvwxyzzxz{zzzzyrkffhmrx{yvrpopopqmd`__`^\[[\[\^__^`aadgmsz~€‚‚}ytqmmjihiijnovy|}}~|wqniebbgjpuqjggqy{}xpqqnorsqnnsw}~~‚‡‡ƒ€…‰ŠŠ‹Œ‰‰‰ˆ‰‰…„ƒ|wz{vx‚ˆ‹ŒŒŠˆ†‚{z{zwsnkjlnqx€‡ŠŠ‚uooqpnkjhiijlnpqsvy{{zwqorvy|€€~}}~€€€€}yyy||}ytojks}|{{{||uldirutrsrqpsu|}{wuumomopoqrrsuuuuuuuuwwwwxxxxxxwusroib[Y^fnpprrqqppqqssrtuvvxz{zyzzzzzyuneacejoswvtrpppnmlfa\Y[ZXYWYZY]acccbbdeglrx{€€~{vqmkkkjhhiimqx|€€}yunhdbglpssligjz~€|umigmtrropu|€…ˆ‹‰†…ˆ‰‡Š‹Š‡ˆ†ˆ‡…‡…~{€xsy‚‡‹ŒŽŒ‹‰ˆ„€{}ywtpkilnw€‡ŠŠƒzqnopqokjhghilnppsu{~}{uqprvy|€‚}}}}~€€zy{}||xroklt~€~{{{{{{ticjrusrrroorw}}|yvumonpqqssttuuuuuuvvwwwwxxxxxxwvtsqkc[Y^fnppqqpppprrrrrsuuuwxyyyzz{{zyrjc__aejmqsroopnmkid]XUWWVUTVWY^fhhhfdfeeglqtx}}xtpnmkkjihjjnsz~~|wsngdelqrrofbgp€€‡|lhjrxurosx€‚ƒ†‹Œ‰…ƒ†‰‰ˆŠŒŠ†„„…ƒ‚†‡‚~pow€†Š‹‹Œ‰‰†}~yutqnlnt}…Š†€wpomopqpkjhghjlnpqsvz}}ztppsvy|€‚€~~}}~€€~zz|}||xrolmt~€~{{{{{{shdjrtsrrrpoqx||{yvunppqssttttuuuuuuvvwwwwxxxxxxwvustmd\Z^empppppprrrrrrqstuuwxyxxzz{{zwphea^_aejnomllmlljhaZUTVVVUTTW\cjnookigdbdfjmqwz}}zvrolkkkkjjkmqu{~~~|zwqmgfkqtsrrjfnwƒ†~‰}plqy|zusx~‚ƒ†ŠŒŽ‹Šˆ…ˆ‹ŒŠŒŠ‡ƒ‚ƒ~…ˆ„€‚zonv~„‰‹‹‹‰‡„~ysrqqqt{„ˆ…~vpmnnopqpmljhiklnpqsvzzzxspptwz~€~~~€€}{{}~||xrolnt~€~{{{{{yqgdjqssrrrqqqx{{zxwvnpqsttuuuuuuuuuuvvwwwwxxxxxxwvutsnd\X]dmppppppqqpprrqrtttvvwxxzzzzzvngd`^^`bfjljikkjkif`YUTUWXWUVZ]entuuqmhdaaceimpuzzxtpomkkkkjlnnsw|~€~|xvpkijouvuuuqnr{€†„†}rrx}yy~„…†‡Œ‹ŠŠ‡‡ŠŒŽŒ†ƒ‚„|{ƒ‡„ƒ‚ypov€ƒˆ‹‹Šˆ‡‚}~~yqqpqtzˆˆ€vommmmopqpmlkjjklnpqsv{{xvsoptw{€€~~€€}||~~}|xronot~€~{{{{{xogdjqssrrrqqqx{{zwxvpprrttstttvvvvttuuuuwwxxxvwwutttqme]XZcmpoonppqqqqqqqqrrttuvwwxxyxxtmgc^__`befhghghhfe`\UQPSVWZXY_cjqwyzvmhe_^^afjknrsurpnmmkkkkmppsy|~}zusonlrw}}|yyzuwƒ…‹‰†|ru|„ƒ‚ƒ…‡‰‰‹‹‰‰‰ˆ‡‡‹ŒŒŒŽ‡ƒ…„{y‚††„yrpv~ƒ†ŠŒŒ‰‰„ƒ~x|}{rppqz€ˆ‰…ynnmnnppqrqommjjlmnoqsvz{wtqprtx|€€~€‚‚€€}|{{}}{vsonot}|yz{{yunebjsurrssrrqvzyyxvvqprrttttuuwwvvuuuvvvwwxxxvvvusttqme]WYbkpponppppppqqqqrrstuvwwxxyxwsmgc^``bceeeeedccba]YRONQTVXY^ciqv|ypie^[[]`fijmoononmmllklmpsvz}~|wsomopw†‡ƒ€€‚‹‡‹‘”ˆ|rv€†ŠŠ‡†‡‰ˆ‰Š‹‰…‡‡ˆ‰ˆŠ‹‹‹ŽŽ‡ƒ†„}|ƒ‡ˆƒytrx…‡ŠŒ‹‰…zwsy~ztqoq|†‹ˆ~rmmmmopqsssqnnkjlmnoqsvzzvsqqrtx|€€~€‚‚€‚€~|{{}}zvsonot}|yz{{yulcbjttrrrrrrrvyxyyvvprttuutuvvwwvvvvvvvwwwxxxvvvussspld\UXbiooopppooooppppppsttuwwxx{ywtnhc^aabdddcca```^][WONMPRTW\bipw{|sjd`\]\^bfghjklnmmmlllnpsvx}}}|zxuqnmpt|…Ž‰†ƒƒˆˆ‚ŒŽŒ”‰}uz†‹ŠŒŒ‹‹ˆ„……‡ŠˆŠ‹ŠŠŽ‡ƒ†„…‡†}vtsz…‡ŠŒ‹ˆƒyqoqy}zuolq~‡‡‚wonmmlmnrtttrpmkjlmnprtwzyuqqqrtx|€€~€‚‚ƒ€~|}}}}zvsonot}~|{{{{yukbclssrrqqrrtxyxyyvvpsuuuuuuvvwwvvvvvvvvwwxxxvuuusrrpkc[UYaimoopppooooqqqqpprstuwwxx{zyvohca`aabccbb_]^^]\YUNJINQRW^enw}€ƒ‚~ulda_`_^`cdeghinmmmllnoruwy||zywutommpv€ˆ‘ˆ„…‹Œˆ’†yw~‰ŽŒ‰„‚„ˆŒŠŒ‹‰ŠŒŽˆ…†ƒ~…†„~zvuu{ƒ†ˆŠŒŠ‡„wnlqy}ysjjs„‚|rnmmmlmnrtutsqmkjlmnpsuxzxtpqqrtx|€€~€‚‚‚ƒ€~|}}}}zvsonot}~{{{{{yulbensrrrqqrrvzyyyyvvpsvvuvuuwwxxwwwwvwvwxwwwxwvvvuttqmg^WX^ekmmnnnoonnooppppqrtuuwxxxxxuqmhfcbaabdb_^\^]ZYWUPLIINT\blu}‚ƒƒƒvleccecb^^`cdfhllmnnnopsvxz{{xwtrqpnnpy„‹‘‹‡Š„‡Ž“‘Šsw‚Œ’’Ž‘’‘ŽŒˆ„ƒƒˆ‹‹ŠŠˆ‰ŒŽŒ‡†„€„…„€|xwuu{ˆŠŠŠŠˆƒwnlry}yohm|ƒ‚}unmmnmnnoruutrpolklnoqrtw{yurppsux}€€€€€~}€‚ƒ‚‚‚~{}}||yvsomnu}}{z{}|ztjcfourqqopprvy{zyxxwrtvvvwxxxxxxxxxxwwwxywxxxxwwvvuuroia\Z]agjnonnoonnoopppppqsttwxxxxxvrnjhhgca`bbaa`^]YWUTPMKIMW_ir{ƒ„„…„€wmhfhjkid`]_cefhklnpqsuuuuvvvttqommnnt}†‹‘Š‘‡‡Œ‘’Œ}sz†Ž’‘Œ‘“’Ž‹Œ‹‰†ƒ„ˆŠ‹ŠŠˆˆ‹ŒŠˆ†ƒ€‚…†„}yxww|‚ˆŠŠŠŠˆ„|njrxxpigt‚…€ztnmmnnoopsvxvspomllopqrvx{yvsqqsux}€€€~€‚ƒ‚‚ƒ~{||||yvtomnu}}{{||zysjehpusqqoppruy{zyxvvuwvvwxzzyyxxxxwwwwzzzxxxxxwwvvuuspkd^Z]_dilnoooonnoopppppqrrtvxxxxywspmkjifc`bcdb`_[XVUSQONMP[eoy~ƒ………„„wmhfjoqniea_adddiknsttuutssssqqppnmmpx€†Š’‘Ž’‘Š‡‹’Ž€y€‡“‘ŽŒ“’‹‹‹ˆ†ƒ‚†‰ŠŠŠ‰‰‰‹Š‰„€€ƒ‡‡…ƒ€}|{x}ƒˆŠŠŠŠˆ„~phmnjbbgy„ƒyspnmnnonptwyxtqnmnnopqrux{yvsqqsux}€€€€€‚ƒ‚‚ƒ~{||||yvupmnu}}|{||zyrjfktusqqoppruxyzyxvwvvvvwwyzzzxxxxvvwwyzzyyyxxwwvvuuspje][]_chjlnnoonnooppppppqrsvxxxxzwupomkjhdcddba_]YVTTRQPQQU`kt„„„…„}ulfgkpsrnje`_bdfgjnrusttsrpppoononmmqz‚…ˆŽ““‘Ž‘•“‰ŠŽ‹ƒ€ƒ‰”‘‹Ž‘‘‹ˆ‡ƒƒ†ˆŠ‹ŠŠ‰ˆŠ‰‡‚€„ˆ‰‡†‚‚{}ƒˆŠŠŠŠˆ…skhb\Y]ky‚{ytonnnmnnptwyxurnnnnopqrvy|yvrqqsux}€€€€€‚ƒ‚‚ƒ~{{{||yvvrmnu}~}}}}{xrjgmvusqqopprtwxzzxwxwwwwwwyyzzywwwwwyyzzzzyyyxxxwvvvsplg`]]^`bfilnoommnnpppppprstvwyxyxxvsqnnmkigghc`^\VTTSSSUVX\grz€ƒƒƒƒƒ~wnffjrvtqmkc^^`cgimqssrrpononlonoonlq{„‡Ž“””“•–•‘‹‰‰Š†ƒ„‡‹”‘Œ‘‘‘’‹‰‡†ˆŠ‹ŒŒŒŠ‰‰‡†~‡‹Œ‹Šˆˆ‡ƒ‚†‡ˆŠˆ‡‡„yre\X[er{~zyvroqqnmlmquxywtqnnnnopprx|}{wvtttvy~€‚€€€€‚ƒƒ}{{{||ywtrmpv}~}|~}|xskhqxvqppppqqsxxyzyyywwxxxxyyzzywwwxyzzzzzzyyyxxxwvvvtrnic_^^_bbejmmnmmnnoopppprstvwxwxyywusqpomkiihc^]\VSTUUX[]`fpz‚ƒƒƒƒƒ‚yqgeiqvxuqoje`acghloponmjkklklnnopoos{ƒ†Ž”–—˜˜›™”ˆ…ƒ€…‰Ž”–“Ž‘”˜›™”’ŽŠˆ‡ŠŽ‹‰‡††…„…†ˆŽ‹‹‹‰‡†ˆ‡‡ˆ‡‡†„}xlfenu{{zuwuqruuqmlmrvyywtqnnnnopqrw{}{xvssuwy~€€€€‚ƒƒ}{||}|ywurmrx}~}|}}}xtlirxwqppppqqrvwyzzyywwxxyyyyzzywwwz{zzzzzzyyyxxxwvwwutqjfbaaaa`bgklnmmnnnnooooqrsuvwwxzzxvvtrpnmihdb_][XVXYZ]`cgnv~‚ƒƒƒƒ‚‚€ysjfhov{ytrnjefghhhkmjiighjmlllnpqpqw{ƒ†Ž”—™››œš–‰„€}~†‹–™—‘Ž‘–›Ÿž›—“‰†‡‹Œ‹Šˆ††„ƒƒ†‰‹ŽŠ‹‹‹ŒŠ‰†…†………ƒ}|qms|€~ywtwussuvsmlmrwz{ytqnnnnpqrtw{|zxwttvxz‚€€€€‚ƒƒƒƒ}{}}}|zwurosy}~}|{}}ytljuyvpppppqqqsuyzzzzwwxxyyyyzzywwwyzzzzzzzyyyxxxwvwwvusliedc`_^_dgklmmnnnnnnnnpqstvwyyzzywusqpnlgeba]\\XYZ^_bcinuz~€ƒƒƒƒ‚ƒ‚ztlfhnt{|wtqlklljkiijhghhglonmlnpstvy}€ƒ†•˜™›œœ›˜‘‰„€}€ˆŒ‘˜››”Ž’—œŸŸœš–’Œ‡…‡ˆ‰‰‡……„‚‚‡ŠŽŒŠŠŠŒ‹Œˆ†„‚‚ƒ…„{ztnx„‡vsuxyurstrmlmrwz{ytqnnnnprtuvzyxxwwwvx{€‚€~€€€€‚ƒƒƒƒ}{}}}|zwurptz|~}|z~}zsmmxzupppppqqpqtyzzzzxxxxyyyyzzyxxxyyxxxxzyyyyyyxxwwuwvtplhhd`___bdgjmnnnnnnnnnqqrtuwxz{{zxxtqnmifc_][Y\]^`adgkqwz|€€‚‚‚‚‚‚|tnffkrx|zwplorojljiiijjnnponjipsuxy{€‚ƒ†Ž•™›œœ™–ˆƒ€ƒˆŽ“™ŸŸš’‘”–š››š˜••‰…„ƒ†ˆ…ƒ‚„€€†ŒŽŽŠ‰Š‰‰Š‹Œˆ†ƒ€€‚„„~{{vq|†‡vtv}|wrpsqmlnsx{{wtqnmmoqqstvxxwvvuwuw|‚€€€€‚ƒƒ‚ƒƒ|{|}~|zvurpu{}~}||~}{ror{|tpppoopppqvyzzzzxxyyyy{{zzyzyyyyxxxxzyzzz{zyywwuxxwsqnjfba__`aeimnnnnnoooopprtuwxz{|zxtqljgcb`\[YZ\_begknvz~~~€€‚‚‚‚‚‚|ungehms{zxrptvtnkjhhjihlmoqpkhlrwy{~‚ƒ‚†Œ”šœœœ—’Š…„„†‰•›Ÿ ˜•”“““–•”””‘‹…}€…„ƒ‚‚€€‡ŽŠ‡‡ŠŠŠŠŒŒ‹‡ƒ~ƒ‚}{~yu{ƒƒ}usw€{qorqmlnrvyzwtqnmmnpppprsqqppsuvx|ƒ‚€€€€‚ƒƒƒƒƒ{z|~~|yvvsqv|~~}|~~~{sou}|tpppooppprvzzz{{yyzz{{||{{{{yyyyzzzzzyzzz{zyywwuxxxwspmifc`_]_cglmnnoopppppprtuwwyzzurokhfb^\\YZZ]`bfjlqsz~~€€‚‚‚‚‚‚}woheejpxvxxy}~|uqpnkjihgginnjhhpw{}€‚‚ƒ„Š’›œ—’‹‹Šˆ‡ˆŠ—žžž›—”’Ž’‘‘‘‹…~xw€ƒƒ‚‚ƒ‰Ž‹‡„„ˆŠŠ‰Š‹Š†‚~~~‚}}€|xy}}zvtz‚…tprqmnnquxyvtqnmlmnnllopnlmmoquw{€‚€€€€‚ƒƒƒƒƒ{z~~~|ywvtsx}~}}{tow}{soppqqrrqsvzzz||yyzz{{||||{{yyyyzzzzzy{{{|{zywwuxxxxvspmifb^\]`flmnnpppppppprtuwvxywqnjfda^ZZZXZ]_bdknquy}€€€€‚‚‚‚‚‚}xpidejouux}€„„ƒ|xwurmkhdcdhjiiimu{}‚‚‚‰šŸ ˜‘Š‹Œ‹‹‹Œ˜ž›šš˜–‘ŽŽŽŒŠ„}tqw|ƒƒƒ†ŒŒˆƒƒ…ˆ‡‡†‡ˆ‰…‚~~~‚~€yvyzyzu|„‡vrpqnnoqvxyutqnmlmlljjlmmkllnotvz€€€€€‚ƒƒƒƒƒ}|~}ywwuuz€~}~{usy|snppqqrrqsvzzz||zzyyzz{{{zzzyyyzzyx{{z{{zz{{yxwwwwxxwvuqmiea_^_chkmonoppoprstuvvttsplhea]ZXXZ\]^acfjosvz}€€€€‚‚€xrjegjlrsy„‡‡ˆ†ƒ‚{wpjbcc__cjknptx}€}€™žžž˜‹ŒŽ‘˜˜˜˜™˜”ŽŽŽŠ…unmqx€„†‰‡…„…„‚ƒ„††„€~€‚€€€}ywuz~€zƒ†€xsqqoopqvzytqommmjkkjmlmomnnortuy|{}~‚€‚‚ƒƒƒƒ‚€€€}zyxvv{€€~~~~€|wu}zropppqsssty{{{{{zzyy{{{{{yzz{{yzzzy{{{{{zzzzyyyyxxxxxxvrpliea`_aeimnnoooopqrrtvvrplieb^\XVVX\^aceimruy{}€€€€ytmfejkms|…‡‡ˆŠŠˆ‡‡…‚|tkiga^bhknkmlqy}}wy‡—œžž™‘ŒŽŽ’˜œ˜–˜››—ŽŽŒ‹‹Œ‰†ytmls€†‹ˆƒ‚‚ƒ~}|€ƒƒƒ}‚‚‚ƒ‚~{xvz€‚~xtsrqqqrvzytpmkkkjkllnnmnmnnnqqrvxxz}‚ƒ€‚‚‚ƒƒƒƒƒ€€€€~zzyww|€~~€{vw~‚{sqppprttwy||{{{{zz{{|||||z{{zzz{{zy{{{{{{{zzyyzyzzyyyywtspmic`^_cglmnoooopqrstttmjeb_[YWWVXZ]bfiknsyz|~€€€€€€{uohekmqtz‚…ˆŠ‹‹Š‰ŠŠ‡ƒyvphdfijihiiksz|uuƒ”›žžœš“ŽŽŽ’—œœš•˜œž™”ŒŠˆ‡‰Šˆ†‚~wty„‰Ž‰‚}|€||{~ƒ„„€~‚‚„…„|z|€~}||yussrrrtxzyurlkjjjkllnmllllmmnmosuwx{€‚ƒƒ‚‚„„„„ƒ€€€€€{{zyy~€~~€yux‚|tqpppruuy}}zz{{zz{{||{{{yzz{{yz{zy{{{{{||{{{{{yyyzzyywvvrplf`]^aelmmoppoprtttrnieb_\VWWXX[]`ekmqtx|}€‚‚‚€€€€€}uqkgkswwy{ƒ‰‹ŠŠŒŠˆˆ‡†€znjhllefikjqy{rt’šœœš“‘’—›œš•˜œž›–‘‹‰‡…ˆŠ‰‡ƒ‚ƒ‚}ˆŒˆzx}}}||{~‚„„…ƒ€‚‚‚ƒ†„€‚€}}€|zyzywstrstwx{{upkjjjjkknnmmlkjkjjjlprtwx‚‚‚ƒ‚‚„„„„ƒ‚€€{{{|y~~€€€xtxzrpppqsuv{~|yy{{yy{{{{{{zz{{{{yz|{z{zzzz||{{|{{{zzzzzzzzwuspke`__djlmoppoqssutpke_[YWVVXZ\^`flpswz}‚‚‚‚€|xrnor{~{y‹Ž‹ˆ‹Œ‹‹ŠŒŠˆ}ohnlb^cikqyxqn|‘šœš”‘ŽŽ”™š™˜—š›™•‘Œ‰†…ˆ‰‰ˆ……ˆ‰‰‰ŠŽŽŠzxz}~~~€€„„……ƒƒ…„‚ƒ„ƒƒ…„€~~}zyyyzzvtsstw|}ysolmmkkjknoqponlkjhijjkpsx}‚‚ƒƒ„„„„„‚€€~z{{{z~€€xsw€‚{qppqrstw||yz{{zz{{{{{{zzzzzz{{||||{{{{||{{{{||zzzz{{{{zxvsmgb_]aegijklorsssqmhaZXXXXX[_behlruy}€‚‚‚‚}zsqx}‚…„€†Œ’Œˆ‹ŒŒŒ‹‹Œ~pppbY\emrz{slwšœ›˜”””’”˜™–•–˜˜—”‘‹ˆ††ˆ‰ˆˆ‡†‹Š‹Œ‹Žˆ‚}xx{{|~‚„†††…ƒ…†„ƒƒƒ„…‡„||yxzz{yyywtttuy}}wrnmmlkkloqsuwutrponmmijlosx~€‚ƒ„…………„‚|z{|{|€‚€€€~wrx€zqpqrttux|€}y{{{||{{{{{{zzzzzz|||}||||||||{{{{||{{{{{{{{|zxupjc`^^adfghimpqqpmic][Z[]\\aeimpsxz}‚‚‚‚‚‚‚‚‚‚{vv}‚…‡…„ƒˆŽ“‹ˆŠŠ‹‹ŠŠ’’†vssh^\`js|}umuŠ˜œ›™—”——–“‘‘–™™–““––•’ŽŠˆ‡‡‡ˆˆˆˆ‡‹Œ‹‹ŒŽ‹…ƒyy{{z}ƒ…†ˆˆ†…†„ƒ‚ƒ‚ƒ……|yyyx{}|zwxvvuuux|{tpoljjkknqtvwyxxxusrrrnjjlou{~‚ƒ„…………„ƒ‚‚‚|{|~}~‚‚€€}tpv~€ysrrstuux}€~|{|||{{{{{{{{zz{{{{||}}||}}}}||{{||||||||{{{{|{xvrmfc_^^acdefkmoolid`\\\]_abginstx{|‚‚‚‚‚‚‚‚‚~zyy‚†‡…„…‰“ŽŠ‡‰‰ŠŒ‹Š‘’‰yuund_`fr{}vns‰—š›š—”™˜™–”’“—˜˜•“““’ŽŒŠ‡‡‡‡ˆ‰ˆˆ‡ŠŒŒ‹ŒŠ†ƒ~yz{{{}€ƒ„†ˆ‡†‡„‚‚ƒ€‚„}xxyzz{}|zxxwwvvvxyxqpoljkmmnqtvyz|{ywwusspljjlqw}‚ƒ„††………ƒ‚ƒƒ€~||~€ƒƒ€€|snt|zutrtuuvy~{{|}}{{{{||||{{{{zz{{||||{}}}||||||||{{||||zz|{zytnjfc_^^_`aaehjifd_]Z[\_aeglptxy}~€€‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚€~z|‚‚†‡†…‡Œ’Š††‡ˆŠŠŒŽ‘’Š{vvxohdft~€xpt‰•™››–”ššš™˜••–—•“‘’‹Šˆ‡‡‡‡‰ŠˆˆŒŽŽŽŠˆ…‚€}{yzyyz}€ƒƒ„†‡ˆŠ†€‚zyy{z{|~}{xyxwvsttutqoklknqnoquy|}~}|zxxxywrlhhlr{€‚ƒƒ†††‡„ƒƒ‚ƒ‚‚}{|~…‚€€€€zqnt}~yvustvvvy~€~|{||}{{{{{{||{{{{zz{{||||{}}}||}}||||{{||||{{{{|{wrmieb`]]]^^adecb`^][]_bhmorvz}~€‚‚‚‚‚‚‚‚‚‚‚‚€~zƒ‚ƒ†‡‡†‡‹‘ŽŠ„ƒ„‡‡ŠŽ’’’‹}yx~~xomu€xps†“˜š›–”ššššš–•••”’ŽŽ‹‹Šˆˆ†††‰‹ŠŠ‹ŒŽŒ‰‡†„{xzywvy{€€€ƒ‡‹ˆƒ€‚zyyzz{}~}{yyyxvtqprqonmopssppty|€€~|}}{~€|toiglw~‚ƒ„†††‡…„ƒ‚ƒƒ}|}ƒ…‚€€€zplt}|xusttvvvz~€~|{||~{{||{{||{{{{zz{{||||{}}}}}}}||||{{|||||||||{ysokgd`]]\\\^ab`__^^^adhnswz{}€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€}}ƒ„ƒ„‡‡†††‰ŽŽ‰ƒƒ„ˆŽ‘”•”Œ€{{‚„‚{tyxooŽ—š›—’”šš™™™–”““’‘ŽŒŒŒ‹‹Š‰‰………‰‹Š‰ˆŠŒ‹‰ˆ‡‡ƒ}y{yusvy~}zy}„‰Š†„‚‚|zy{z{|~|zyxxxusonpponqrtttrsw{~€€€~~‚|ulghq{ƒ„†ˆ‡‡…„„ƒ‚‚€}~€„„‚€€‚€zokr||wusuuvvvz~€~|{|}{{}}||||{{{{zz{{||||{}}}~~}}||||{{||||||}}|zztrniea^_\\\\_a___^`behmswz~€€€‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚ƒƒ‚‚€|~ƒƒ„††‡††…‡ŽŽŠ…€€†Ž“•˜–‚{}‚†‡‚|z‚xll{‹–š›˜••šš™˜—”“’‘ŽŠ‹ŒŒŒ‹Œ‹‰………‰‹Š‰‰Š‰‰‰ˆˆ‰…~z|ztsrw|~|xux‰Šˆ‡ƒ€ƒ‚zyyzy{}~{yywuurpnnpooprtttttuy}€€€‚‚ƒ{skgnwƒ„†‡‡‡…„…ƒƒ‚€‚„„‚€€‚€zpkr{|wvtvvvvvz~€~|{|~{{||||||{{{{{{||||{{{{}}~~}}||||||}}}}||||zzywvrmid`\\\[\\^`^^_aejqux{}€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚}~ƒ„„ƒ†‡ˆ†………ŠŽŽŠ†€|}~€Œ“——–‚~ƒ‰Œˆƒ€„whgt†”š›™™–šš™˜”’‘ŽŽŽŠ‰Š‹‹ŒŒŒ‰………ŠŒ‹Šˆ‡‰ŠŠŠ‰‰‡~yzzvtsvy|}zww‡Œ‹Š…€€‚~wz{yz{|€|yzxwtqnllnopqruuuuvwz}€€€€‚€‚ƒ„„zpiiq}‚…†‡ˆ‡‡†…„ƒ‚€‚ƒ…„zqmv}|xuuvvwvwy~~|}~~~{{||||||{{{{{{|||||||{}}~~}}||||||}}}}||||{{zxxtpmifb`]\\\^aaacflqvx{~€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€}‚ˆ…„„†ˆ‡†††…‰ŽŠ†{|}~‡˜˜—’†€€ƒ‡ŒŽˆ‚…ƒylhr…“˜š˜™˜ššš™•‘Ž‹Š‹ŒŒŠ‰ˆ‰‰ŠŒŒ‰…†‡ŒŽŒ‹ˆˆˆŒŒŒŒ‹‰‚|}|ywvvy|}zxv}†ŒŠ‰†}xxyyy{}€{xtsrqnkijmprqruuuxxy{~€€€€‚‚‚‚„…„†„€vlelx€„†‡ˆ‡‡†……„‚‚ƒ‚„…„‚‚zrow~}xvvwwxvwy~}{|{|{{{||{{{{{{{{{{||||||}}}}}}}}||||||}}}}||||||{zyvuqoljfa`]]_adeilqwy{~€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‡‹…„„†‡‡‡ˆ†„†‰Š†|{||Ž—™™”Šƒƒ†‹ŽŠ„††}sls…‘—š—™™ššš™•‘Ž‹‹ŠŠŠ‰‰‡‡ˆŠŒŒŠ††‡ŒŒ‰ˆ‰ŒŒŒ‹†‚€|yyyxy|~{zz†Š‰ˆ…„…†|xwwxz}~zuqqonkjiloqrqsvwwyyz{€€€€‚‚‚‚„…„†…‚zofis„†‡ˆ‡‡†……„‚‚ƒ„ƒ„…„‚‚‚€{ttz~}xwwwwywwy~|yxvus{{||zzzz{{{{{{||||}}}}}}||}}||||||}}}}||||||}|ywwtqolidc__`cfgkpuz|}~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€ƒ‹Š†„„†‡‡‡ˆ†„…‡‹Š†ƒ|{zz~—šš–†‚‚…Š‹††‡tntƒ—™—˜™››šš•’Ž‹Š‰ŠŠŠˆ††ˆŠŒŒ‹††‡ŽŒŠŠ‹ŽŒ‹Š‹‰‡‚}zyzzz|}‚‡‰‰‡†…ˆˆ†€{wvxy}}xtpqnkkjlnqsrstwxxxyz{~€€€ƒ‚‚‚ƒ„……†……~sgen{‚ˆ‰ˆ‡‡†……„ƒ„ƒƒ„…†…„ƒƒ‚‚‚|uv~}ywwxxyxwy~|wtrpm{{{{zzzzyyz|zz{{{{}}}}~~}|}}}}}}||}}{{||||||||zz{zwuqnkgcbdfilpu|}€€‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚‚†‹‰„ƒ†‡ˆˆˆˆ†……†ˆ‰ˆƒ~|{{}Š–›šš–Šƒ‚ƒ‡‰‡‡ˆ…}totƒ–˜™™š››››˜“Œ‰‰‰‰Šˆ……†‰Œ‹‰‰Š‘“‘ŽŽ‘ŠŠ‰‰ˆ…€{{zyy{€ƒ„†ˆŠ‰ˆ†‡‹‹‹‡ƒ{uuwx|{vsqpmlmnpstttvwy{{||||~€‚ƒ‚ƒ„„…†‡††‡„xjciwƒ†‡‰ˆ‡†…†„„ƒƒ‚„†‡…ƒƒƒƒƒƒƒ~yz€ƒ~zwvuxxvwz€{tljji{{{{zzzzyyz{{{{{||}}}}~~}|}}}}}}||}}{{}}||||||{{||zxvtrnkjjlorwy~~€€€€€‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒƒƒƒƒƒƒƒ‚‚†‰‰ˆˆˆ‰‰‰‰ˆ††††‡ˆˆ„}zz}Š”™œœ™‚„‡†‡‰…}rmr€–—˜˜š›œœœš”‘ŠŠŠ‰‰ˆ„„…‰ŒŒ‹ŠŠŒ“•“‘’’ŒŠ‰ˆ‰ˆ†‚}yxxy|‚„………†‡‡……‡Š‹‹Œ‰‚zvuvwvuqqpnoqruvvvvxyz}}}}}}~€‚ƒ„„„…†‡‡‡‡‰†oefp~…ˆ‰ˆˆ‡†††…„ƒ‚††‡†ƒƒƒƒƒƒƒ}~„…€zxwvyxww{€|ulghii{{{{zzzzyyz{}}||}}}}}}~~}|}}}}}}||}}zz||||||||{{||{ywywurppruwz|€€~~~‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒƒƒƒƒƒƒƒ‚†‰‹ŒŠ‹‹Šˆˆˆˆ‡‡†…‡†ƒ~zz~Š”™œœ›†‚ƒ††ˆŠ†}pko}Œ•—˜˜šœš•‘Œ‹‹Š‰‡ƒƒ…‰ŒŒ‹Š‹Ž“••’‘“““Ž‹‰ˆˆ‰ˆ†ƒ~wtsv{‚†‡…„„…†…„„‡ˆŠŒŠ‰‚}xxssqqrqprtuwwwzyzz{}}}}}}~€‚ƒ„„…‡‡‡‡‡‡ˆˆ‚tgeky„‰‰ˆˆ‡‡†††„„„‡‡ˆ‡…ƒƒƒƒƒƒ‚€€ƒ……}zxwzzyxz|ulgikii{{{{zzzzyyz{||}}}}}}}}~~}|}}}}}}||}}{{{{||||||{{|||{{{zxuttvxz|~€€~~~‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒ€€ˆŠŽŽŠŒ‹ˆˆˆ‰ˆ‰†……‡ƒyxŒ”˜šœœ“Šƒ‚‚…†‰Šˆ}pko}Œ•—™˜šœžžš—’Œ‹Š‰‰†„……‰‹ŒŒŒ‘”—•””••“Ž‹‰ˆ‡ˆˆ‡„€upoqy‚‡‡…ƒ„……„ƒ€‚ƒ‡‰‰‹‡ƒzqppstrsvvwxw{||z{|}}}}}}~€‚ƒ…†‡‡‰†‡‡‡ˆˆ„ykdhvƒ‡‡ˆˆ‡ˆ†††…„…ˆˆŠ‡…ƒƒƒƒƒƒƒ†‡„€|{yx{{zyxxnhflkll||{{zzyyyyzz||}}||~~~~~~}}}}||||||||zz{{zz||{|||}}||z|}}{yy{|~~€€€€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒ‚‚€ˆŒ“Š‹Œ‹Š‹‹Š‰ˆ†……‡†€zz…”–™›œ™†ƒ„…‡‰‹ˆ|olq~—˜˜˜™œžŸžœ–’ŽŠˆ‰Š‡‡ˆˆŠŠŠŒ“”–•––—–“Ž‹‰ˆ‡‡………€uljlvˆŠ†ƒƒ„ƒ€}{}‚‡‡Š‹ˆ…~rpqrtttwxxzy}~}||}~~~~€€€„†‡‡ˆ‰‰ˆˆˆ‡†…}oeer…‡ˆˆˆˆ‡‡………†ˆŠŠ‡…„„„„„„„ƒƒ…ˆƒ€}{{|||zxwqkkkkkln{{{{{{zzzzzz{{{{{{~~~~}}}}||||||{{yyxyzz{{{{}}~~||{}~~~|}~€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ€‰’Œ‰ŠŒ‹ŽŽŒ‹‡………†ƒ€ˆ“•–™›œ•‹……†‰Š‹ˆ|pnq|Œ™š˜˜™›žš•’’‘ŽŒŒ‹‹‰‰ŠŠŠ‹’•••–˜—•’Ž‹ˆ‡††…„†zohflu~„„ƒƒƒ‚}yusv€†‰‰‰ˆwuuvwxxzzz{{}~}{|}~~€€„‡ˆ‰ŠŠŠ‰‰‰ˆ‡‡shem{ƒ†ˆ‰ˆˆˆˆ††…†‰ŠŠ‡…„„„„„„ƒƒƒ†ˆƒ}||}}|zwqjjopnoprzzzz{{zzzzzzzz{{{{~~~~}}}}||||||{{yyxxzz{{zz}}~~}}|~~~€€‚‚‚€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒ‚„‹Š‰Š‹‹‘ŽŠ†„…‡‡„…‹’“”•–™œš‡†‡Š‹Œˆ|rpryŠ˜›™——šœœœ˜”’‘””“‘‘Œ‹Œ‹ŠŒ‘“••—˜—•’‹ˆ‡……„„†ƒsgbejqy€ƒ„ƒzyyuu|ƒ‡†ˆˆ…|ywxyz{||{{{}~}|}~~~~~€€ƒ„‡ŠŠ‹‹Š‰‰‰ˆ‡‡„ylehs†ˆ‰ˆˆˆ‰‡††‡‰Š‹‡…„„„„„„ƒƒ„ˆ‰„~|}}~~}zumimqrpqqtzzyyzzyyz{zzzz{{||~~~~}}}}||||||zzyyzyzzzzyz}}}}~~}}€€~€€‚‚€€€€€€~~‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒƒƒ€†ŒŽ‹Š‰Š‰‹Œ’””ˆ……‰ˆ†ˆ‘““““˜šœ’ŠˆˆŠŽˆ|tru{‰—œš——™›œ›—“““—––”“““‘ŽŽŒŠŒŽ‘’•———–””‹ˆ†…„ƒ„††‚vgbeehq}‚„ƒ{{|zw|ƒ†‡ˆ†{wz{}~}}||}}}}~€€~~~~€€‚ƒ…‡‹‹ŒŒŠ‰‰‰‰ˆ††}ngen{„ˆ‰ŠŠ‰‰‡††‡Š‹‹‡…„„„„„„ƒ„…ˆ‰…~}~~€ypijpstqrtvyyyyyyyyzzzzyyz{|}~~€€~~}}}}}}||}}{{{{zzzzzzyz||}}}~~~€€€€€€€~~~~~€€‚‚‚‚ƒƒƒƒ„„ƒƒ‚‚„„„‚ƒƒƒ…‹‹‹ŠŠŠ‰ŠŠŽ“––’Š…„ˆ‹ŠŒ’””““”—›—Žˆ‡ŠŽ‰|vx{~ˆ–œ˜——™šš™””“—™™™––”““’’‘ŽŽ’•––•””“‹†„ƒƒ„‡‡…xhflignw‚ƒ€~zyyxx{€ƒ‚ƒ„…ƒ|zy}|}|{{||}~}||~€€€€‚ƒ‡‰‹‹‹‰‰‰ŠŠŠˆ‡‰ogdju‚ˆ‰Š‰ˆ‰‡…†‡ŠŒŠ†„„„„„„„ƒ…‡ˆˆƒ€~ulkmprttvwzyyyyyyyyzzzzzzz{|}~~~~}}}}}}||||{{{{zzzzzzyz||}}}~€€‚‚~~}}~~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚„„„‚ƒƒƒ‡‘‹ˆ‹‰Š‰‰ˆˆŒ”˜˜”Ž‡ƒˆ’•”’’”—›™‰‡ŠŒŽ‰~tw~ƒŠ—›—–™™š™˜””˜™œ–˜™–“””“’“‘“”••’’’’Œ‡„‚‚„„‡ˆ„wjjqoklqz€~yvwxxxxz||~‚|{}}|}||||}~}|}€€€€€€€€‚„‡‹‹‹‹‰‰ŠŠŠŠˆˆ‰‚tgcgq†ˆŠŠ‰‰‡…†‡‹ŒŠ†„„„„„„„ƒ…‡‰ˆƒ€€€xokmoruxy{|~xxxxyyyyzzzzzzz{|}}}~~~~}}}}}}||||{{{{zzzzzzyz||}}}~€€‚‚‚‚‚‚‚‚}}}|}}~~€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„„‚ƒƒƒˆ‘Š‡‹Š‡„ˆƒ‡–›š”ˆ‚‡’’“•”’’”—šš“‰‹‹Œˆ€tqx‰”›™–š›œš™—–™––žœœ˜•””“”•“‘’“”““”’’’’Œ‰†ƒ‚„†ˆˆ„xoptsnmqz€}{xuuwwuttstw}}||}|}||||}~}|}€€€€€€~‚„ˆŒ‹‹ŠŠŠŠŠˆ‡ˆ„xicen{„‰ŠŠ‰‰‡…†ˆŒŒŠ†„„„„„„„„„‡‹Š„€€€|qkloruxz{~€xxxxyyyyzzzz{{z{|}}}~~~~}}}}}}||{{{{zzzzzzzzyz||}}}~‚‚ƒƒ‚‚‚‚‚}}||}}~~€€ƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„„‚ƒƒƒŠ’‰†‹Š†„ˆ€}„™›š•ˆ‚„’‘‘“””””—šš•‹‹Š‹ˆ€umr{…‘››˜›œ›™™˜‘—ž¡ žš•““”””•””•”“““”“‘’Š†ƒ‚„‡ˆˆ…ztvvtonr{€|{{wuututrposz~}|}||}}||}~}|~€€€€€~~‚„‰ŒŒ‹‹‹ŠŠŠˆ‡ˆ…{mddky„ŠŠ‹Š‰‡…†‰ŒŒ‰†„„„„„„„ƒ…‰‹Š…€‚~wlkmptwy{}€€xxxxxxyyyyzz{{{|}}~~}~~~}}||||||{{zz{yzzzzz{{{|||}€‚‚‚‚‚‚‚~}{{|{{{||~€€€‚‚‚‚ƒƒƒƒƒƒ„„ƒƒƒƒ„„„ƒƒƒ„‹‘ŽŠ†‹Š‰ˆˆ}„˜™™•‘‰ƒŒ’‘’””•–˜š›—ŒŠ‹Œˆ‚yqms}Œš››ŸžŸžš˜—ž ¡ ˜•“’’”•––••”“““”“’’Œˆ†…†ˆˆˆ†y{zvrps{‚ƒ€|xwsoqvuspmqx€€}|}}|}}|{}}}}€€€€€€€€‚…‰Œ‹ŠŠŠŠ‰‰ˆ‰‡~ofcjx‚‰Š‹Š‰†…†‰ŒŒŠ†„„„………ƒ„„‰Œ‰…€€xnikoruy|}€€xxxxxxyyyyzz{{||}~~~}~~~}}||||||{{{{{yzzzz{||||||}‚‚‚‚‚‚‚€~||{{{{{||~€€€‚‚‚‚ƒƒƒƒƒƒ„„ƒƒƒƒ„„„„ƒƒ…‹‘ŽŠˆ‹‹Šˆƒ„—˜—•‘Š‚Š’’‘””•—˜››˜‘ŒŠŒŒ‰ƒ~{utx†–ŸŸŸŸŸž™––•Ÿ Ÿœ˜“‘’”•–˜—–”“’””“’Šˆ‡†ˆ‰‰ˆƒ~zxvvy„„€|zwrlnuwupmqv}‚~{{|||||{}}}}€€€€€€~~€€‚…‰‹‹ŠŠŠŠ‰‰‰Šˆ€sieixƒ‰Š‹Š‰†…†‰ŒŒŠ†„„„………ƒ……ŠŒ‰…}qjkmqtw{}€€xxxxxxyyyyzz{{||}~~~}~~~}}||||||{{||{yzzzz{||||||}~€‚‚‚‚‚‚‚~~|||{z{{||~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒ…‹Ž‹‹ŽŒŠ‰‰„ƒ”–•“‘‹‚‰’‘‹“”–—˜šš˜“ŒŒŒŠ…ztt€’œ¡¢žžœ˜–—•šŸœš–’‘’•–—˜—––••–•”‘ŽŒ‰‡ˆ‰‹Š‰…‚zzz|€ƒ~|{xsmknsvurpqt{ƒ‚zxyz|||{}}}}€€€€€}}}~…‰‹‹ŠŠŠŠ‰‰‰ŠŠƒxmhjxƒˆ‹‹Š‰†…†‰ŒŒŠ†„„„………ƒ…†Š‹‰…‚‚€xmjmorvz}~€€xxxxxxyyyyzz{{||}~~~}~~~}}||||||{{zz{yzzzz{|}}|||}~‚‚‚‚‚€~~||{zz{{||~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„ƒƒ…‹ŒŒŽ‰‡‰†‚‚‹“”“‘‘‹‚€ˆ‘‹‹’•——˜šš˜”ŒŒ‹‡|vt}Žš  žžœ™—˜”šž›—•’‘‘’••–——–———™–•‘ŽŽŒŠ‰Š‹ŒŒ‹†„€||}€„ƒ€|{{yohjnrtvutqsx€……|xwy{{|{}}||€€€€€~}}|}~…‰Œ‹ŠŠŠŠ‰‰‰Š‹…|pllw‚‡‹‹Š‰†…†‰ŒŒŠ†„„„………ƒ…ˆŠ‹‰…‚‚tjknptx{~€€wwwwwwxxyyzzzz{|~~~~~~~}}}}}||}{zyzzzz{{zzzz{{||}~~€€~}{{{{{{|}}~~€‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚…Œ‘ŽŽ‹ŒŠ„ƒ‰“’„ˆŽ‹ŒŽ••———˜˜”‹Š†€|yx~‰–œŸžžš˜˜˜•™››™•””“”•••••–•—˜™›™—’ŽŽŽŒŽŠ†‚€€‚ƒ…ƒ€~|qecnqsvxxvuv}„‡ywyz{|z{{€€€€€~|{||„ˆŽŽ‹‹‹‹‹ŠŠŠŠŠˆ‚womv‡Œ‹Š‰†„‡‰Œ‰†„……………„…‡‰‹ˆ…ƒ‚yokmoquy€€€€wwwwwwxxyyzzzz{|}}~~~~~}}}}}||}{zyzzzzzzzzzzz{||}~€€€~}{{{{{{|}}~~€‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚…“ŽŒ…„‡Ž’‘…ƒˆŒŒŠŒ”•—˜˜˜™–’‘ŒŠˆ|{}†‘˜œœœ›™–––•–™˜—•””•––••––••˜™œ›š™’ŽŽŽŽ‘’‘Œˆƒƒ…„†ƒ€€€zqf[inquwxusuz‚ˆ„|xz{}|y{{~€€~~}}zz{|~…‰‹ŒŒ‹‹ŠŠŠŠŠ‰…{rouˆŒ‹Š‰†„‡ŠŽŒ‰†„……‡‡‡†…†‰‹ˆ…‚~skmprtx}€wwwwwwxxyyzzzzz{||~~~}}}}}||}{zyzzzzzzzzzzz{||}~€€€~}{{{zz{|}}~~€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚†Ž’‘‘‘‘‘‡ƒ…Œ‡…ˆ‹Š‰‹Œ“–—˜˜˜™•’‘‘Œ‹ˆ}~€„Œ”™˜˜™—••–•”•—–••–•––——––••˜˜š–˜š“ŽŽŽ“”“‘‰„ƒ„‡†„€€~yqcQ[jotwvusqw€‡†‚„…‚~}{z}{~~}}{{yxy{}€„ˆŽ‹ŒŒ‹‹ŠŠŠŠŠ‰‡uptˆŒ‹Š‰†„‡‹ŽŒ‰†„……‡‡‡†…†‰Šˆ…znkortx{€‚‚‚wwwwwwxxyyzzzzy{||~~~€€}}}}}||}{zyzzzzyyzzzzz{||}~€€‚€€~}{{{yy{|}}~~€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„ƒ‚‚†Ž“‘‘‘‘’‘‘ˆƒ„ŒŽŽˆ‡‰‹Š‰ŠŒ‘•—˜—™˜–’‘ŽŽˆ~€ƒƒˆ•–—˜–””–•“•–•••–———™™––••—˜™—››•‘ŽŽŽŽ‘”–•‘‹‡‡‡‡‡‚~€€~xo^HGflsvvusqu~†ˆ††ˆŠŠ‰…}z{{{{yzxxvvwz}€„‰Ž‹ŒŒ‹‹ŠŠŠŠ‹Š†€vptˆŒ‹Š‰†„‡ŒŽŒ‰†„……‡‡‡†††‰Š‰†tklqsvz‚‚‚‚xxwwxxyxyyzzzzz{||}}~}~~~~}}}}}}||{zzyywwwxyzzz{||~€€‚€€~}}{zzzzz{|}}€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚…Ž“’’‘‘‘“’’Š„ƒŠŒ‰‡‰ŠŠ‰‰‹Œ”—™˜™˜—”’Œˆ}„‚ƒ†’••––““”“”•••”•–˜˜š˜™——–•˜™š›œ—”’‘ŽŽ“–—–“ŠŠˆˆ†‚€€|ymX:6Zhpuvwvst|†‰‰‰Š‰ŠŒŠ†{zz{zwvttutuw|€…‰ŽŒŒŒ‹ŠŠŠŠŠŠŠˆwpt~ˆŒŒ‹‰†„‡‹‹‰…………††‡…†‡‹ŒŠ…|okortx}ƒ…ƒ‚‚‚‚‚‚ƒxxxxxxyxyyzzzz{{||}}~}~~~~}}}}}}||{{|zzxwwxyzzz{||~€€‚€€~}{zz{{z{|}}€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚…Ž“’“‘‘‘””’Œ…„‰ŒŒŠˆ‰ŠŠ‰‰‹ŒŽ“–˜™™˜—“‘ŽŽˆ}„ƒƒ†‹‘“•”‘“‘“•••–••–˜››š—˜˜–™šœœ›˜–”“‘•˜—–•‘ŽŒ‹ŠŠ‰†ƒ|xjM/.Sinrtxxtrz…ˆ†„„„‡‡‡‡„|y{|xuutttuw}‚‡‹ŒŒ‹ŠŠŠŠŠŠŠ‰xqu‰Œ‹‰†„ˆ‹‹‰…†…†††‡……ˆ‹Œ‰ƒwlnqtx|€……ƒƒƒƒƒ‚ƒƒxxxxxxyxyyzzzz{{{{}}~}~~~~}}}}}}||{{|{zxxxxyzzz{{{~€€€€€~}{zz{{z{|}}€‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚…Ž•”““’’””’Ž‡„‡‹Ž‹ˆ‰ŠŠŠŠŠ‹ŒŽ’•—™™——’ŽŠ…ƒ„ƒ†‰’“’‘‘“––—•••–˜œœœš››™šš›œ›™™––•‘‘“–˜—––“Œ‹ŠŠŒŽŒ‡ƒ|udD+.Uknorwyupvƒz}€‚‚„ƒ…€}~|yxuutux~„Š‘ŒŒ‹ŠŠŠŠŠŠŠ‰wrv‰Œ‹‰††ˆŠˆ…††‡ˆˆ‡……‰Œ‹ˆslptuz‚†„ƒƒƒƒƒ‚ƒ€xxyyxxyxyyzzzz{{zz}}~}~~~~}}}}}}||{{{y{yyyxyzzz{{{~€€€€~~}}{zz{{z{|}}€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚…Ž––”•””””“’‰„†‹ŽŠˆ‰Š‰‰‹‹‹ŒŽ“”˜™—–’ŽŽŽŒˆƒ‚ƒƒ†‰Ž‘’“––—–––—™š™žžœœ™š™š››™˜–•”’‘”•—™˜——“Œ‹‰‰’“Ž†ƒ~s`C,1Ymonpwyvqt~ytx}}€‚…„‚€~{{xttux~„ŠŒŒ‹ŠŠŠŠŠ‹Š‰urv€ˆŒŒ‹‰††Š‰‡…††ˆˆˆ‡……‰ŒŒ†{qnruv{„‡„ƒƒƒƒƒ‚‚}xxzzyyxxxyyz{{}}||}}~~~~~~}}~~}}}}|zzz{yxxwwyyzz{{}~€€€€€~}}|{{{z{{|}~~€€€‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚„Ž–——–•••–”‘Žˆ„†ŠŒŽŠŠˆ‰ŠŠ‹‹‹ŒŽ‘“—˜˜•ŒŽŽŽ‹‰„‚‚„…†‡ŒŽ‘’”——••”–˜š™š¡ŸŸ™Ÿ’“—™š™™——••””–——˜˜—–“‹‰ˆŠŒ‘‘‹†€s`H8A_pqmosvurtz}ysvy{~€€ƒ‚‚€~}{vtsvz…ŠŽŒ‹‹Š‹‹‹‹Œ‹‰€uswˆ‹Œ‹‰††ŠŽŽŠˆ…†‡ˆ‰‰‡……ŠŒ‚tnpsvx~‡ˆ‡„ƒƒ„„„‚uxxyyxxxxyyzz{{||}}}}~~~~~~}}~~}}}}|zzzzyxxwwyyxy{{}~~€€€€€€}|}|{{{z{{|}~~€€€‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚„––˜˜•”•”“‘Žˆ„†ŠŒ‹‰‰ˆ‰ŠŠ‹‹‹ŒŽ’•˜˜”ŒŽŒŠ„‚ƒ„„†Š‘’•—˜••”–™œšŸ‘“’šŠ˜š›™˜——•••–—˜—˜˜˜–”‘‹Šˆ‡‡ŠŠ…‚wjWIKbrupopttsuy}|xww{€€€€~~{vttvz€‡‹ŽŒ‹‹Š‹‹‹‹Œ‹‰€usw‰‹Œ‹‰††ŠŽŽŠˆ††‡ˆ‰‰‡…†ŠŒŠ~qnsuw|‚‰Š‰…ƒƒ„„„‚|qxxxxxxxxyyzzzz||}}}}~~~~~~}}~~}}}}|zzzyxxxyyyyxy{{|}}€€€€€€€~~}}|{{{zz{|}~~€€€‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚„‹–˜—˜•”–•”‘Ž‰……‰‹‹‰‰‰ˆ‰‰‰‹‹‹ŒŽ“–—”ŒŒ‹†€€€„ˆ‘‘“•˜™–””–™›Ÿ‡Š—‰Ž—œ›™˜˜˜•••—™™˜˜˜˜˜”‹‰‰†„†‡†‚~vm[JNfvxtpotuutw}~zx}€€€€€€~}}ywuuv{†‹Œ‹‹Š‹‹‹‹Œ‹‰€utx‚ŠŒŒ‹ˆ…†ŠŽŽŠˆˆˆ‡ˆ‰‰‡…†ŠŒ‰yppuvxˆŠ‹Š…ƒƒ„„„‚ymxxxxwwxxyzz{yy{{}}}}~~~~~~}}~~}}}}|zzzyxyyyyzzzz{{{|}~€€€€€~~~}}|{{{zy{|}~~€€€‚‚‚‚‚‚ƒ‚‚‚‚‚‚„Š”——˜•”–•”ˆ…„ˆŠ‰‡ˆˆˆ‰‰‰‹‹‹ŒŽ’”–”‘ŒŒ‡~}{|}‡‘“’‘‘“—™™–“”–™œž—‰†Šš“šž›››š™••–—š›™™˜˜˜“ŒŠ‰Š†…„ƒƒzri[LPjx{wrqswusx}‚€||~€€€~}|xwvww{†ŒŒ‹‹Š‹‹‹‹Œ‹‰€utxƒŠŒ‹‡„†ŠŽŽŠˆˆˆ‡ˆ‰‰‰‡†‹Š„torwwz‰‹…ƒƒ„„„‚wmxxxxwwyyzzz{{{{|||}}}}}}~~~~~~}}|||{{zyyyyyyyyzz{{|}}~€€€€€€~~}|}||{zzz{|}}}~€€€‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚€€‚†”˜——–”–•“Œ‰…„ˆ‹Š‡ˆˆ‰ŠŠŠ‹‹‰ŠŒŽ‘’•”ŽŽŽ‡~yvxx}†••‘‘‘–šš—“”—™™‰Š’“—Ÿžžš™——–—š››š™™˜’ŠŠ‰ˆ‡„ƒ‚|ulbWMYt~~zupquvsx~ƒ}}€€€€€€~~|ywvvy}‚‡ŒŽŒŒŒŠ‹‹‹‹‹Œˆvuz„Š‹‰††ŠŽŠˆˆˆ‡‰‰‰‰‡ˆ‹‰~pqtvw}…ŠŒŒˆ„ƒƒ„„ƒ€sixxxxxxzzzzz|||{|||}}}}~~~~~~~~}}||||{zyyxxyyyyzz{{|}}~€€€€€~~}|}|}{{{{{|}}}~€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€Ž––—–••””Œ‰…†‰ŒŒ‡ˆˆˆ‰‰‰ŠŠˆ‰ŠŒŽ‘’’Œ‘‘ŽŽ‰zxwx|ƒ˜—“‘‘‘–™š–”“–šš›‰Ž””‘ ””–žžžœ™˜——š›œ›šš™“ŽŠŠˆˆ†ƒ‚€}ztkbXUbz|xonvxvx}ƒ‚€€€€€€~|yxwvz~‚‡Œ’ŽŒŒŒŠ‹‹‹‹‹Œˆvu|„ŠŽŽ‹‰†‡‹ŽŠˆˆˆ‡‰‰‰ˆ†‡‰…wosuwz‡Šˆ„„„„„ƒ~qixxxxyyzzz{z|||{|||}}}}~~~~~~}}||||{zyyxxyyyyzz{{|}}~€€€€€~}|}|}{{{{{||}}~€‚‚‚‚‚‚‚‚‚{z…“—˜—–•”’Ž‹‡†ˆ‹‰‡‡‡ˆ‰‰ŠŠˆ‰Š‹ŽŽ‘ŽŒ‘‘‘Ž‹…}yxxyŽ——•“’“•˜š•‘“•™››Žˆ––šœ““—žž žš™˜—š›œ›››š“‹Šˆˆ†ƒ{wrme_^j{€}{wpjsywx}„„€€€€ƒƒ€~{ywvvz~‚ˆ“‘ŒŒŒŠ‹‹‹‹‹Œˆvu|„‹Ž‹‰†ˆŒŽŠˆˆˆ‡‰‰‰‡…‡ˆ€qpuvw}„‰ŒŽŒˆ„„„„„‚zojxxxxyyzz{{{|||{|||}}}}~~~~~~}}||||{zyyxxyyyyzz{{|}}~€€€€€€€}|}|}{||{|}}}}~€‚‚‚‚‚‚‚‚‚‚€}wt~–˜—••“‘Ž‰‡†Š‘’‹††‡ˆˆˆŠŠˆ‰‰‹Ž‘’‘Ž‰{xyzŽ˜˜–•““”—˜•”——”ž”Œ’™˜ ˜™™›ŸžžŸž›š˜—š›œœ›™“Œ‰ˆˆ†„~ywrmiedny€|zxphoxwy}„„€~€‚‚~}{ywvvz‚ˆ’‘ŒŒŒŠ‹‹‹‹‹Œˆwv}…ŒŽ‹‰†ˆŒŽŠˆˆˆ‡‰‰‰‡…†…|nrvwx€†ŒŽŽŒˆ„…„„„‚xmkxxxxyzzz{{{{||||||~~~~~~~~}}}|{|}}}}|{z{{{{zzz{{{{~~}}~~€€€€~~{{}}||{{||}}~~‚‚‚‚‚€€€‚‚‚yqn|‹”•””•”‘‹‰‹Žˆ………‡ˆ‰‰ˆ‰ŠŠ‹ŽŽŽ’’‘‹„~~„˜˜——–””•——”–™–œ–‘—œœ ›žžž›žš œ˜˜˜œžžžœ—“Šˆ‰ˆ†„yuqppmmqw{vvuogjtxy|‚‚‚‚‚‚‚~~~{xxx|€„‰Œ’’Ž‹‹ŒŒŒŒŒ‹†}vv~†ŒŽŒ‰†‰ŽŒŠˆˆˆˆ‰Š‰ˆ†‡tnrvy}†ŠŒ‹ˆ…„†……~qjkxxxxyzzz{{{{||||||||~~~~~~~~~|{}~}}}||{||||zzz{{{{}}||}}~~||}}||||||}}~€‚‚‚‚‚€€€€|sjiyŠ“””””•“Ž‰‹ŽŽŠ…€…†ˆˆˆ‰ŠŠŠŽŽ’’‘‰‡†††Š‘˜™˜——•”•—˜–—™˜–œœ–šž  ŸŸ¡žœšŸ“Ÿ˜™šž  œžœ—“Šˆ‰ˆ‡…ƒzuttuspqtupqsphgovy}‚€€‚‚‚‚‚‚~~~yyyz~‚…‰Œ’’Ž‹‹ŒŒŒ‹†}vv†ŽŒ‰‡ŠŽŒŠˆ‰‰‰‰Š‰ˆ†…}porvz‚ŠŽŠ†ƒƒ„…ƒ{mhkxxxxyzzz{{{{||||||{{~~~~~~~|}~~~~}||{|}}|zzz{{{{||||||~~~~~~~~}}||}}||}}~€‚‚‚‚€€€€yoegy‡Ž‘’“••Ž‰Œ‘’Ž‹†{…‡ˆ‰ŠŠ‰ŒŽ’’‘‘‘‘ŽŒŒ‹Ž“–˜™˜˜–••—™——™œ˜”œšž¡ ¢Ÿ¡Ÿœ¡œŸšš› Ÿ ™œœ˜“Š‡ˆˆ‡†„€}zyzywqmnnlnsslgkqx~„„€€‚‚‚‚‚‚€~{yzz{‚…‰Œ’’‹‹ŒŒŒ‹…}wx€‡ŽŒ‰ˆŠŽŒŠˆ‰‰‰‰Š‰ˆ†yoqtv|†ŒŒŒ‹Š…€|uhgjxxxxyzzz{{{{||||||||~~~~~~}}}|}~~~~~||{|~~|zzz{{{{||}}||}}}}~~}}}}||}}||}}~€‚‚‚‚€€€€€|tjbhy„‰‰ŒŽ“•“Œ‰“’‘Œˆxz}ƒ†ˆ‰ŠŠ‰ŒŽŽ’’‘’‘‘‘‘‘””””—™™™–••—š™–˜œœ•˜žŸŸŸ¡ žŸŸžž¡“ ›šœ¢¢¡˜œœ˜“‰‡‡‡‡……ƒ}}}|ypiijjnssnhhnv†…ƒ‚‚‚‚‚‚~{zzz{€ƒ†‰Œ’’‘‹‹ŒŒŒŠ…|wz€‰ŽŒŠ‡ŠŽŽŒŠˆ‰‰ŠŠ‹Š‰†}upsuv†ŠŠ‡†‚}zzzyyuoggjyyxyyzzz{{{{||||}}}}~~~~~~}}~~~~~~||{{}}{{zz||}}}}}}}}|}}|}}~~}}}}||||||}}€€€€€€€€€€~|re_fx~„Š’‘Œ‹‘”’‘ŽŒˆ‚}{y…ˆ‰ŠŠ‰Š‹ŒŽ‘‘‘‘’’’‘’“™Ÿ™–š™—™——˜››™™š™—   Ÿ ŸŸž–˜ ¡›¡Ÿœšœ¢¥¤œ›—’‰‡†……†„ƒ‚‚€}xnbbgknrroifku‚ˆ†‚‚‚‚‚‚‚‚}|{{}„‡ŠŒ“’‘ŒŒŒŒŒ‰ƒ{xz€ˆŒŒ‰‡ŠŽŒ‹‰ŠŠŠŠ‰‰ˆƒwrstvx………~ytpqqqongefkyyxyy{{{||||||||}}}}}}~~~~}}~~~~}}||||||{{{{{{}}}}}}|}}|{}~~}}}}||||}}~~€€€€€€€€~~€€€€€~~wma_gqust}…Ž’Œ‹‘”“’ŽŒ‰…€}z€†‰‰Š‰Š‹ŒŒŒŽ‘‘‘‘“”’‘’“š¢¥ŸŠ‘™›œ›™—˜››™—™›š™¡¡¡ž›ž Ÿ”•Ÿ¡Ÿ¡žœ›œ¢¤¤Ÿ›–‘Ž‰‡†…„…„ƒƒ‚|wnfbdhkmpqlghs‚†„€€‚‚‚‚‚‚‚}|{}„‡ŠŒ““‘ŒŒŒŒŒŒŠ‚{y|ˆŽŒ‰‰‹ŽŒ‹ŠŠŠŠŠ‰Š‡|rquvwz~xuroniikiigeecfkzzyz{|||}}}}||||}}}}}}~~~~~~}}||}}||||{{||||||{||{z|}}}}}}||||}}~~€€€€~~€€€~{shb`fikloz„’Ž‹‹”“’‹‹‡„qu}„‡‰Š‰‹ŒŒŽ‘‘‘‘“”’‘‘’–ž¨¥‘‰š¤¥ š˜˜››™—˜šœ›¡¡¡–‘› ¡›™žœ Ÿž›ž¡£¢Ÿž›—‘Œ‰ˆ‡…„„‚‚€~zuplgbchlornheo}‚€€€‚‚‚‚‚‚‚~}}~€‚…‡ŠŒ““‘ŒŒŒŒŒŒ‰zx}‚‰ŽŒ‰‰ŒŽŒ‹ŠŠŠ‹‹‹Š„wqsvuuwvspkjhhfghhhfeeceizzy{{|||{{}}||||}}}}~~~~€€€€€€~~}}}}}}||||{{{{{{{{{||{z{||}}}}||||~~~€~~€€~~€€}yrgb_ceginz…‘’Œ‹Œ”“’‹‹ˆ„ƒ€mms}†‰Š‰‹Œ‹ŒŽ‘‘‘‘‘“””’’“›¦§‘ŠŽ¡ª©£œ—˜šœ›™˜›žž¡¡žœžŸž››Ÿžžœž¡£¢ ž›—‘Œ‰‡†…„„‚‚€~~{xssrnc^djospielx~|}‚‚‚‚‚‚‚}~€€‚…ˆŠŒ““‘ŽŒŒŒŒŒ‡€zx}ƒ‹ŽŒ‰‰ŒŒ‹Š‹‹‹‹Š‰‚vpuvuqrnkigffgfhihhiheddgzzyz{|}}||}}||||}}}}}}€€€€€€€€~~}}~~}}||||{{{{zz{{{{{|}}}}}}}}|}€€€€€€€€€~~}~~~|{wnfaacehinz‡’’Œ‰Ž‘”–“‹ŒŒ‡„ƒ‚rjlx‚‡‰ŠŒŒ‹‹’““’““••’’‘“š¢¥‘Š˜«®ª¥——šœœ›™›žŸ ž•˜œœœ™˜šœŸŸŸœœ £¡žœ›—‘ˆ‡†…„ƒ‚€~{vtwzwj_^ckpojfkuyz{~€‚‚‚ƒƒƒƒ€~ƒ…‡ŠŒ”“‘ŽŒŒŒŒŒŒ†~yy~…‹Œ‹‰ŠŽŒ‹Š‹‹ŒŒ‹‡~tsvtqnjfdcdeghjlmnmmkggefzzyz{|}}||}}||||}}}}}}€€€€€€€€€€~}}~~}}}}||||{{{{{{||||}}}}}}}}|~€€€€€€€€€€€~~}~~~}{siedceegfl{‰‘Œ‰’”—”’ŒŒŒ‰†„‚vlmw~„ˆˆŒŒ‹‹’““”““••“’‘’—Ÿ£“Ž¦­©¥£œ——šœ››œžžšžœšš˜˜™œž››Ÿ¢Ÿ›˜•Œˆ‡††„ƒƒ€~|yww|~sf__glnjfly|||~‚‚‚ƒƒƒƒ€€‚ƒ…‡ŠŒ”“‘ŽŒŒŒŒŒ‹…~y{†ŒŒ‹ŠŠŽ‹ŠŒŒŒŒŠ…yutsokhedceggkostvvqnjjiiizzyz{|}}}}}}||||}}}}}}€€€€€€€€~}}~~}}}}}}}}{{{{{{||||}}}}}}}}|~€€€€€€€€€€~~~}~~~|vmfegeeefgn|‰‘Ž‹‹’”—–“‘ŽŒŠ‡†ƒ{rqv|‚ˆ‰‹ŒŒ’““•““””“’‘’•›¡—ž«©£¡Ÿš™˜›œœœœœš—¡Ÿ›™š›š™œœœš››™œžž›™•’Ž‹‰‡††„ƒ„€~|zvwz€xlb^aimjfmy€€‚‚‚ƒƒƒƒ€€‚ƒ…ˆŠŒ”“‘ŽŒŒŒŒŒ‹…~y{€‡Œ‹Š‹ŽŽ‹ŠŒŒŒŒ‰tssmjgddddgjmsw{|~~vpkmkmmzzyz{|}}~~}}||||}}}}}}€€€€€€€€~}}~~}}~~}}}}{{||{{}}||}}}}}}}}|~€€€€€€€€€€~~~}~~~zrgcfhfdeego}‰‘‰Œ‘“”——•”Š‰†„vtu}ƒ‰Š‹Ž‘”•”•”“””•’’“”™ Ÿ««¤Ÿ›™˜˜›žœœœœ•›¤Ÿ›š›œ›™š›™—™™™››—”‹Š‡††„ƒƒ€|zxvy}€yqd^^gmkglw€€€€‚‚‚ƒƒƒƒ€€‚ƒ‡ŠŠŒ”“‘ŽŒŒŒŒŒŠ„~y|€‡Œ‹‹ŒŽ‹ŠŒŒˆ~qspjfeehefintz}€‚„‚zrmmmpq{{z{{}}}~~}}}}}}|||~~~~~~~}~€€€€€€€€€~~~~~~~~~~~}{||||{{||||}}}}}}}}}}€€€€€€€€€€~~~~~~~xpebehddedgp{‰Œ‰Œ‘“•˜–•”‘ŒŠ‰†€zttzƒŠ‹Ž’“”–•”“”•””““”—ž¦¬¨Ÿœ™››™™œžžžœ››œ•¢¦¤ œšš™–•™˜˜šœ›™—’ŽŒ‹‰‡†…„ƒƒ€|yxx{€|via]clmkmt|€‚‚ƒƒƒƒƒƒ‚ƒ„‡‰Š‘““’ŽŒ‹ŒŒŒŠ‚|z{€‡Œ‹ŽŒ‹ŒŒŒŒ…wnmigdfgjilqw€‚…‚„†‚zrmnptv{{{{{}}}~~}}}}}}|||~~~~~~~}€€€€€€€€€€€~~~~~~~~~}{||||{{||{{||}}}}}}}}€€€€€€€€~~~~~~~}ukebegddddhq~‹Š‰‘“–˜–•””Ž‹Šˆ„~vuz„ŽŽ’“”–•”““”•–”“”•œ§¨¢œ˜–™™˜˜›žžœœš››˜¤¦¤¡ Ÿœ™™˜••˜˜˜››™–‘ŽŒŠ‰†……„ƒƒ~||}~€€€~{pg^_imnoqx|€ƒƒƒƒƒƒƒƒƒƒ€€€ƒ…‡‰Š“““ŽŒ‹ŒŒŒ‰‚|{{‚ˆŽ‘Œ‹ŽŒŒŒŒŒ‹rmkhgggjnpw~„‰‰ˆ……†€vnlqtz}{{{{{}}}~~}}}}~~~~|~~~~~~~~€€€€€€€€€€€€~~~~~~~~~}{||||{{{{{{||}}}}}}}}€€€€€€€€€€~~~~~~|yqgeeegffccir€Œ‰Š“—™—–•–’‘ŽŒ‰†€vtz„’Ž‘’“”––•‘‘‘”–””•–™¢£ž˜””—––—šž›š››¤¤¢Ÿœ›š™˜••™˜˜šš˜”Œ‹‰ˆ†…„ƒƒƒ‚€~~~€€€€€|woc^elqqorv|‚ƒ‚‚ƒƒƒƒ„„ƒ‚ƒ…‡‰Š’““ŽŒ‹ŒŒŒˆ|{{ƒ‰Ž‘Œ‹ŽŽŒŒŒŒ‹‡yokijjlkotyˆŒ‰†††~rmmsz€„{{{{{}}}~~}}}}~~|~~~~~~~€€€€€€€€€€~~~~~~~~~}{||||{{zzzz{{}}}}}}}}€€€€€€~~€€~~~~~~{wndegggghccir€‹‹‰‹”˜™—–––“‘ŽŽ‹†€vuz„Ž’’’’“”–•”‘‘“••””•–›œ—‘“—––—šžžœš™šš ££Ÿš›š™š™˜••™š™™›™˜“Ž‹Š‰‡…„„‚ƒ‚|}€€€€~{ui`dkqqont{‚‚ƒƒƒƒ……ƒ‚ƒ†‡‰Š’““ŽŒ‹ŒŒŒˆ|{zƒŠŽ‘ŒŒŽŽŒŒ‹…umjgklmosyˆŽ’‰††„}qopw|ƒ†||{||}}~}}}}~~~~}~}~~~}~€€€~~~~~~}}}}|z||||||{{z{||||}}|}~~}€€€€€€€€~}}}}}ytidfgijjhbbjs~ˆˆ‡Œ‘”—˜˜—˜˜–”Œˆ„{x|„“‘‘’“““•”‘Ž“••••“—™›—‘”””•–šžŸ›˜•›š¢¢¢ž›———˜š™˜—–˜™˜™˜––“‹‰‰ˆ……„ƒ‚~}|}€‚€€€~yoaejoojgnyƒ‚€~ƒ„‚„„‚‚€‚‚„††ˆ‹Œ‘’’ŽŒ‹‹‡€zz~ƒ‰‘Œ‹ŒŒŒŠoifhlppt{ƒŠ‘’‘‰‡‡ƒzqnrx~„…{{{||}}~~~}}}}~~~~~~~}€€€~~}}|z{{{{{{{{z{{{|||||}~~~€€€€€€~}}}}}xofcfgjkkhbbjs……†Œ‘”—˜˜˜™™—–ŽŒ‰‡~y}„Ž’‘‘’“““•“’”••”“••™–“”””•–™œŸš—•šœ¡ Ÿ›™–––—˜—˜˜–——–˜–•”’Ž‰‰‰‡†…„ƒ‚€}|{|€€}xnlmnnibixƒ„€~ƒƒ‚„„‚‚‚ƒ…†‡‰ŠŒ‘’’ŽŒ‹Š…~{z~…‹‘Œ‹‘ŒŒŒˆxiegjotv|…ŒŽ‘’’‘‰‡‡‚xqnsy…†zzz{|}}~~~}}}}~~~~~€€€€€€€€€€}}|z{{{{zzzz{||||||||}~~€€€~~~~~~~}}}|{tidcfiklkgbbit„…†Ž‘“–˜š˜˜šš˜–ŽŽ‹Š‰z~†‘‘‘‘’““’““ŽŒŽ’••“’’”˜—•”””•–˜››˜••˜›žœ›™–••–——˜˜–•––—••”‘‰‰ˆ‡†…„ƒ‚€}{z{}€€‚~xsqpqmeivƒ†ƒ€‚„„ƒ„„‚‚ƒƒ…†‡‰Š‹‘’‘ŽŒ‹Œ‰…}|{†‹‘Œ‹ŒŒŒ‹qfehksx|ƒ‹‘‘’’‘‰‡†upps{…‡zzy{|}}~}}}}}}~~~~~~}}€€€€€€€€€€}}|z||zzzzyy{{{{zz{{|}~~€€€~~~~~~~}}}{xodacfilnkgbbhu~„…ˆ’”–™šššš™—–ŽŽŠŠ‰ƒ|~†‘‘‘’”“’‘‘‘Œ‹Ž””“’“”––””“”•–˜››™•““•™››œ›™–•••——˜˜–••––•••‰ˆˆ‡†…ƒƒ|{z{|€‚‚‚|xtuusklu‚†„‚ƒƒƒƒ„„‚‚‚ƒ„…†ˆŠŠ‹‘’ŽŒ‹Œ‰ƒ|||‡Œ‘Œ‹ŽŒŒŒŽŠ|mfgilv{‚‰Œ’“’’‘‰‡†|ropt|‚…‡{{{{}~}~~~~~~~~~~~}~€€€€€€€€€€€€€€€~~}|}}{zzzyyyyzz{{{{||}}~~~~€€€€}}}|||}}}}{vjbadglpomibckuƒ„‰’”•–™›ššš™—•‘Ž‹‰‡ƒ~…‘’“ŽŒ‹‹ŠŒŒ’”““’’••“““”•——š˜—•’’“•š›šš™™—••——˜˜———–•”•“‘‰ˆˆ††…„ƒ€~|{y{{}€‚‚‚ƒƒ‚€}|{zzyspv~…†ƒ€‚„„ƒƒ‚‚„„…††ˆŠ‹Ž’ŽŒŒŒŒŒ‡|{|‚‡‘ŒŒ‘ŽŒŒŒ‰vhejmqyƒ‰‘“““‘‘‰ˆ„zqprx€„‡‡|||||}}~~~~~~~}}~~~~~~}~€€€€€€€€€€€€€€€}}}}|zzz{{yy{{{{{{{{{|~~~~~~~~~|||}}}|wpgdaeimrpnibcjs}‚„‰”••–™›ššš™–”Ž‹‡„€‚‹ŽŽ’’Œ‰‡†…†ˆ‹Ž‘’’’’””“““•™›š—–”“‘’“•˜˜—™š›˜––——™™˜™š—•”•“Œ‰ˆˆ††…„‚€~|zzz{|€‚ƒƒƒƒ‚€~{wyzƒ†‚{y|„„ƒƒ‚ƒ„„†††ˆŠ‹ŽŽŒŒŒŒŒ†€|z|‚ˆŽ‘ŽŽ‘ŽŒŒŒ„rghmov€‰Ž‘‘““““‘Œˆ†ƒxpprz‚…‰ˆ||}}{|}~~~~~~~}}~~~~~~}~€€€€€€€€€€€€€€€}}}}|zzz{{{{{{||{{{{z|~~~~}}}}~~~}}}}}zskedcejosqngbcir|„‰”––—™›šš™—•’ŽŽŒ…~{‚ˆŽŽ‘ŽŠ†ƒ‚…ˆ‘‘““““”–¡Ÿ–“”’‘““–—˜˜—šžš˜—˜™šššœ˜•“”“Œ‰ˆ‡††…‚~|{z{{|€‚ƒƒƒƒ‚‚€€€|x…ywx€„„„„ƒƒ„…†††ˆŠ‹ŽŒŒŒŒ‹…€|{|‚ˆŽ‘‘ŽŽŒŒ‹|mfinqz†Ž‘‘’““““‘ŽŠ‡…€vpqs{ƒ‡‰‰}}}}{|~~~~~~~~||}}}}~~~€€€€€€€€€€€€€€€}}}}|zzz||{{{{||{{||{~~~~~}}||~~~~~}}|zqhddddkpsrnfbcir|…‰”˜–˜™›šš™—”‘ŽŽ…{w}}ƒˆŽŒŒŒŽ‹ˆ…€~€ƒ…‹Ž‘‘‘’“”™¡¦Ÿ—““’’“”˜˜˜˜–™œ™˜™šœšœžœ—”“”’‹ˆˆ‡††„‚~|{y{{|€‚ƒƒƒƒ‚€€€€ƒ‚„„~w{ƒ€xvy„„……ƒƒ……†††ˆŠ‹ŽŒŒŒŒŠ…€|{|ƒˆŽ‘‘Ž‘ŽŒŒ‡uhdios~Š’’’““’“‘Š‡…~spsu}ƒˆŠŠ}}}}|}~~~~~~}}||}}||~~€€€€€€€€€€€€€€€~~}}{{{{yzzzz{{||||{{{|~~~~~~}}|}€€€€}|zulededhnrsqlfadkw~ƒ…‰•˜—™››››—•“Œ‡xow|‚†Ž‹ŒŒ‰‡„€~{|ƒ‰‹‘‘‘”–œ¦«¥˜“‘‘“•—˜———˜››™™šœ››œž›˜”””’‰‡‡‡………ƒ‚~||z{|}€‚ƒƒƒƒ‚ƒ‚††€x{‚zz|‚……„„ƒƒ……††‡‰‰‹ŽŒŒŒ‹„}|„‰‘‘’’ŒŽŒ€ndeknt‚Ž’““““””“‘Œˆ†…|rnqw€‡‰‰‰~~~~}}~~~~~~}}||}}}}~~€€€€€€€€€€€€€€€~~}|{{{{yzzzz{{||||{{{|}}}}~}}{}€€}}}{yqhcdffipttqlgdfmy€„…‰•˜˜š›››š—•’ŽŒ‹‹‹Šyjqy‰Šˆ‰‹‹‹‹‰ˆ„€}{|ƒ‡‰‹‘’—¤ª­¥™”‘‘“•——–––—šš™™šœœ›œš—”“’‘Œˆ‡‡‡………ƒ‚~}}|||}€‚ƒƒƒƒ‚‚‚ƒ„ˆ‡ƒ{~ƒ€|}„……„„ƒƒ……††‡‰‰‹ŽŒŒŒŠ„}}€„‹‘‘‘’’Œ‡ykfgkny‰“”“””••”‘Œˆ†„xpory‚ˆ‰ŠŠ~~~~~~~~~~~~}}||||||}}~€€€€€€€€€€€€€€€~~}|{{{{yzzzz{{||||{{{|}}}}}}}}|}~~}}}{vldceghlqttpkhgho{„…†‹•˜™›››š™˜•’ŽŒ‹ŠŠŠ{gjv}}€‚‚†ˆŠŠŠ‡„€|{|ƒ†‰ŠŒŽ‘”›¥ª¬ª£›•’’‘’•–—•••–™™™™šœ›š›œ›˜”“‘‹ˆ‡‡‡………ƒ‚~}}}}}~€‚ƒƒƒƒ‚‚‚‚ƒ„†‰ˆ…‚{„……„„ƒƒ……†††ˆ‰‹ŽŒŒŒ‰ƒ~~…‹‘‘‘’’‹sjhikq~‘“”“””••”‘Œˆ‡uoquzƒˆ‰ŠŠ~~~~~~~~~~}}}}||}}}}~€€€€€€€€€€€€€€~}}|{{{yzzzz{{||||{{{|||||||}}~~}}~~~~}zshcdffjnqutolhgjr}†‡‡‹•˜™›œœš˜—•’Ž‹ŠŠŠ‰|feszxyz|~‚…‡‰ˆ‡…|{|ƒ…‰Š‹Ž”ž©¬«¦¢”‘‘”•–”””•™™™™šœ›™š›š˜”“Š‡‡‡‡………ƒ‚~~~}}}~€‚ƒƒƒƒ‚‚ƒƒƒ…‡ˆ‰…‚‚‚}z~‚……„„ƒƒ……††…‡‰‹ŒŽŒŒŒ‰ƒ€…Œ‘‘‘’’Ž‹~mijknv‚““””””••”‘Œˆ†}upqv{…ˆ‰‹‹~~~~~~~~||}||||||~€€€€€€€€€€€€€~~}|}|{{{z{{{{zz{{{{{{||zz||}}~~~~~~}|vmdaehjmpuwsnjghks~‡ˆ‡–™™œœ›š˜—•“Š‰‰Š€jamwvxwx|ƒ†‡††…‚}~‚†ˆ‰‹ŽŽ’ž©«¦£Ÿš•Ž‘“•”’‘”˜™—™›š—˜™—•“’‰‡‡‡ˆ‡†„ƒ~~}}~ƒƒƒƒƒ‚‚„…‡ˆ‡„‚ƒ€zy|~‚„„ƒƒƒƒ„†………ˆ‰ŠŒŽŽŒŒŒˆƒ€‚‡’‘‘‘‘‘‘ŽŒ‹†zkjjlqz‰‘””“”••••“Š‡†|spsx…‰ŠŠŒ~~~~~~~~||}||||||~€€€€€€€€€€€€€€€~~}}|||{z{{{{zz{{{{{{||{{||}}~~~}zqhbafimoswxrlighmv€ˆˆ‡•˜˜›œ›š—–•“‹‡‡ˆŠƒn`isuvwy{~ƒ††…†…ƒ‚€‚‚…‡‰‹Ž‘™¢¦£¡œ™“Ž‹‹Ž‘“’’–˜–™›œ™•––•“‘ŽŒ‰‡‡‡‡‡†„ƒ~~~ƒƒƒƒƒ‚‚ƒ…††…„ƒ…vuy}„„ƒƒƒƒ„†……†ˆ‰ŠŒŽŽŒˆƒ€€€ƒ‰Ž‘’‘‘‘‘‘‘Ž‰sjkkmtŒ“““’”••••“Š‡„zrqty€†ŠŠŠŒ~~~~~~~~~~}|||||~€€€€€€€€€€€€€€€€€€~}}|||{z{{{{zz{{{{{{||}}||}}}~~~}xne`cgjmruxwqlhgjrzƒ‹‰†Œ•˜—šœ›š˜—–”‡ƒ…ˆ‡‚p`dqvwwx|‚„…„…„„„‚ƒƒ‚„†ˆŠŒŽ”šŸš—“ŽŠˆ‰‹ŽŽ”•–˜›š˜•””“‘Ž‹ˆ‡‡†‡‡†„ƒ€ƒƒƒƒƒ‚‚‚‚‚„††…„ƒƒ}tsw|„„ƒƒƒƒ„†‡‡†ˆ‰ŠŒŽŽŽŽŒˆƒ„‰Ž‘‘‘‘‘‘‘‘ŽŒ‡|mkklow‚”““’”••••“‰†ƒxqruz‡ŠŠŠŒ~~~~~~~~~~}|||||~€€€€€€€€€€€€€€€~}|}}{z{{{{zz{{{{{{||||||}}}~~}~}vkb`dhkntwywqlhimu|…‰…‹”——šœ›š˜–•“…€„‡„sb`nuvwx{~‚ƒ…„„„ƒƒ‚ƒƒ„ƒ…‡‰‹ŒŽŽ–™šš—–’‰‡‡‰Œ‹Œ’”•˜›™—•“’ŽŒŠˆˆ‡††††„ƒ€€€ƒƒƒƒƒƒƒ‚‚‚ƒ„„„„ƒ‚{srw}„„ƒƒƒƒ„†‡‡†ˆ‰ŠŒŽŽŽŽŽŒˆƒƒŠŽ‘’‘‘‘‘‘‘ŽŠ†vjjlmq{†”““””••••“‰†vrsv|ˆŠŠŠŒ~~~}|||{}}||}}|||}~~€€€€€€€€~~}|}}{{z||{zzzz{{{|}}}}}}}}|}~~}}~}{sibagjmrxy|wqlihnt{†Ž‹‡‰•—™š˜–•“ˆ…ƒƒve`ltvwy}ƒ…„…„„„ƒƒƒƒƒƒ„†‰ŠŽ“•—˜—”“‰„…†‰Œ‹ŠŠ”“—™™–““’ŒŒŠ‰‡‡ˆ‡†††…ƒ‚€~~€‚‚ƒƒ„„ƒƒƒ‚ƒƒ„„…„„ztpu{€ƒƒƒ‚„„…††††‰‹‹ŒŽŽŽŽŽŽ‹†ƒ‚‚ƒ‡Œ’’’’’’‘ŽŽ‰‚rjnmnv€Œ“”””••••••’‰…}ursv|„‰ŠŠŠŠ~~~}}}|{}}||}}|||}~~€€€€~~~~~~}|||{{z||{zz{{{{{|}}}}}}}}|}~~~~zxpf`chkmtyzztolhhnu{…Ž‹†ˆŽ“–˜›œš—•”“‘‹ˆ‚}wh^mwz|}€ƒ„„…„„„ƒƒƒƒƒƒ„†‰Š‹Ž“•–•“’ˆƒ‚„‡ŠŠŠŠ‹’‘•–—•’’ŽŒŒŒŠ‰‡‡ˆˆ††††„ƒ€€~~€‚‚ƒƒ„„ƒƒƒƒ‚ƒƒƒ„„ƒƒ{sklt|‚‚‚„„…†††‡ŠŒŽŽŽŽŽ‰†ƒƒƒ„‰Ž’’’’’’‘Žˆ{ojnnpxƒ”“””••••••’‰„zsrtx~†Š‹‹ŠŠ€€~~~}}}}}||||}}|||}~~€€€€€€~~}}~~}|||{{z|{zzz{{{{{|||}}}}}}|}~€€{tlc`eijpvyzytmihkow{…‹…‡’•˜™š™–•”“’Š‚‚}xj_m}~€ƒƒ……„„„ƒƒƒƒƒƒ„†‡‰‹ŒŽŽ“”““‘Œˆƒ‚ƒ…ˆŠ‹‰Š‹“”•”‘ŒŠ‹‹‰ˆ‡‡ˆˆ‡‡‡†„ƒ€€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ„„ƒƒ|tkdjvƒ‚‚„„……††‰‹ŽŽŒŽŽŽŽŽ‹ˆ…‚ƒƒ…ŠŽ‘’’’’’’‘†wlknor{‡•”””••••••’ˆ„xqrvy€‡Š‹‹ŒŒ~~~}}}}}{{||}}|||}~~€€€€~~}}~~}|{{{{z|{yzz{{{{{|{{}}}}}}|}~zricafjltyyzxslhglrt{†Š…‡Œ’”—˜™—””””’Š……‚{mal~€ƒƒ†…„„„ƒƒƒƒƒƒ„††‡Š‹ŒŒŽ‘“’’Œˆƒ‚„†‰‹ŠŠŠŒ’“’Š‰ŠŠ‰‡‡‡ˆˆ‡‡‡‡„„€€€‚‚ƒƒ‚‚ƒƒƒƒƒƒƒƒƒ„„ƒ‚€}ukacr€„„„ƒ„……††‰‹ŽŽŒŽŽŽŽŽŒˆƒ‚„‡Œ’’’’’’’‘Œƒtklnpu}ˆ‘–”””••••••’ˆ„wqsv{ˆŠŒ‹ŒŒ€€~~~~~~||{{{{||||||||}~~~~||~~|}||||{|zy{{{{{{||{{|||}}}}}~~~~zqhbdilov{{|ytmhgmux{…Š……‰’•™˜•”“““’Ž‹‡†ƒ}p`j€‚‚ƒƒ……ƒƒƒƒƒƒƒƒ…†‡ˆŠŠŠŠŒ‘‘Œ‡ƒ‚‚‚„‰ŠŠ‰‰Š‹Ž‘‘‹‰‰‡ˆˆˆ‡‡ˆˆ‡‡‡‡……‚€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒƒytla\j|ƒƒƒ„…†††‰‹ŒŽŒŽŽŽ‹†‚‚ƒ†‰‘’’’’’‘’’‘Š€pjkosy‚Œ’””””””••–”“Žˆ‚vqsw}‚‰‹‹€€~~~~}}}|{{{{||||||||}~~~~~~~~~~~~~||}}|}}}}}||{{{{||{|||{{{{{|}}}}~~~~}wmdbfjmqx{||yuojjnrru‚Ž‹†…‰‘”—–”’‘’’’Œˆ…„‚saf}ƒ‚€‚‚‚‚ƒƒƒƒƒƒ„„„„ƒƒ„††ˆŠ‰ŠŠ‹ŒŽŽŠ…ƒ‚‚‚ƒ†ˆˆˆ‰‰‰ŠŽ‹‰‡ˆ‡ˆˆˆ‡‡ˆˆˆˆˆˆ‡…ƒ‚€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒ‚|vpjbVZr€‚ƒ„…†††‰‹‹ŒŒŽŽŽŠ„‚‚„†‰Ž‘’’’’’‘’’‘Š{okkot{„“••””””••–”’Žˆvrsw~ƒ‰‹‹€€~~~~||}|{{{{{{|||||||}~~~~~~~~~~~~~~}}|}}}}}||{{{{||||||{{{{{|}}}}~~~}wlbbgjnsx{}{yuqllnnkn~Ž†…ˆ‹’•”‘‘‘ˆ…†„€vde{„„‚ƒƒ„„„„ƒƒ…………„„ƒƒƒ…†‡‰‰‰Š‹‹ŽŒ‰…ƒ‚‚‚ƒ†‡ˆˆˆ‡‰Š‹ŠŠ‰‡††‡ˆˆˆ‡‡ˆˆˆˆˆˆ‡†„ƒ€€‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒ|vpkbRQi|€‚„„…†††ˆŠŠ‹ŒŽŽŽŽŒˆƒ‚ƒ…†Š‘’’’’’‘’’‘‡vnmmpt}†”•”””””••–”’Žˆursx~„‰Œ‹€€~~~~||}|{{{{zz|||||||}}}}}}}~~€€~~~~~~|}||||||||{{{|||||{{|||}}}}}~~~~vk`chiotz}}zyurnnojgkŽŽ†…†Œ’““‘‘Ž‰‡†…‚yhfz„…ƒ„„„„„„„„††……„„ƒƒƒ„†‡‰‰‰ŠŠŠŒŽŒ‰…ƒ‚‚‚ƒ„†‡ˆ‡†ˆ‰‰‰ˆ‡…„…‡ˆˆˆ‡‡ˆˆˆˆˆˆ‡†…„€€€ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚ztneQL`w~‚…†††††‡‰‹ŒŒŽŽŽŽ‹‡ƒ‚ƒ…‡Œ‘’’’’’‘’’‘Ž„snmnrw~ˆ‘”•”””””••–”’Žˆ~tqsx…ŠŒ‹€€~~|~~~~{{{{{{{|||||||}}}~~~~~~~~~~}~||}}||}}||||||{{{{||||||}}~~~|vkdfijou{}}|zvsppmdai‡ƒ…‹Ž’‘ŽŽ’Ž‰ˆ‡…‚zjew„‡…„„„„…………††…………„„ƒ…†‡ˆˆˆ‰ŠŠ‹Œˆ„‚‚€ƒƒ„…††‡‰ˆˆ††…„„…‡ˆ‰‰ˆˆ‡‡ˆˆˆˆ‰‡††„‚€€‚ƒƒƒƒƒƒƒƒƒ‚‚‚ƒ‚ƒ‚ƒƒ‚}umbMJYp~€ƒ…††††‡ˆ‰‹ŒŒ‹ŽŽŽŠ‡ƒƒ„†‰’’’’’’‘’’’plmoszŠ’••”••••–––“‘Œ‡|srtz€‡Š‹‹Œ€€~~|}}}}{{{{{{{|||||||}}}~~~~~~~~~~||}}}}}}||||||{{{{||||}}}}~~~{vlfhjlov|~{{zvsqpk`]jƒ‘‡ƒ†ŒŽ‘ŽŽŽ’Š‰†„zkdu„ˆ‡„„……‡‡‡‡‡‡‡‡‡‡„„„…‡‡ˆˆˆ‰ŠŠ‹ŒŽ‹ˆ„‚‚€€‚„††ˆ‰ˆˆ†„ƒ„„†‰‰‰ˆˆˆ‡‡‡‡‡‡‰ˆ††…„‚‚ƒƒƒƒƒƒƒƒ„€‚‚ƒƒƒƒƒƒ~uk`[]ly€‚ƒ…††††‡ˆ‰‹ŒŒ‹ŽŽŠ†ƒƒ„‡ŠŽ‘’’’’’’’“‘‡xnlopu{ƒ‹“••”••••–––“‹…zssu{ƒ‡Š‹ŽŽ~~~~}|}|{|{{{{{{|||||||}}}~~~~€€~~}}||}}}}}}||||||{{{{|||||}}}~~}{vmgiklrw}~{{ywtrph^^lƒ‘‡ƒ†Œ‘ŒŒ‹ŒŽ’Š‡„{lbrƒŠ‡††‡‡‡‡‡‡ˆˆ‡‡‡‡††……‡‡ˆˆˆ‰ŠŠŠŠŒŽŒˆ„‚‚€€€‚„††‡ˆˆˆ†„ƒ„†ˆ‰‰‰‡ˆˆ‡‡‡‡‡‡‡‡††…„„„„„„„ƒƒƒƒ‚{yx|€‚ƒƒ‚‚‚ypjkqy~‚„ƒ…††††‡ˆ‰‹ŒŒ‹ŽŽŒˆ„ƒƒ„‡ŠŽ‘’’’’’’’“’Žƒsmmpqv}…“••”••••–––“Š„xssv|„‡‹ŒŽŽ~~}}~~~|{{{}{{{{{{|||||||}}}~~~~€€€€~~||||~~}}}}||||||{{{{||||}}}}}}~~}zvnijlmty}~||{zvtpe\_nƒ‘‡ƒ‡’ŠŒŒŽŽ’Š‡„€xocoƒ‹ˆˆ‡‰‰‰‰‰‰ŠŠ‰‰‰‰††…†‡‡ˆˆˆ‰ŠŠ‰Š‹ŽŒ‰„ƒ‚€~‚ƒ†††‡ˆˆ†„„†ˆŠŠ‰ˆ‡ˆˆ‡‡††††††††…ƒ………………ƒƒƒƒ|tprx€‚ƒƒ~zxuux~‚‚ƒ…††††‡ˆ‰‹ŒŒ‹ŽŽ‹‡„ƒƒ„‡‹’’’’’’’“”“Œpmppsy€†“••”••••–––“‰ƒxssv|…Š‹ŒŽŽ~~~~}|||{{{{{{{{||{{{{|}}}}}}}}}~~}}}}}}}}}}||||||{{||{{}}|}||}}~~|ztojmlov{~~~}|zwsme]_n…†„‡‘‹Š‹ŒŒŽ“‘ˆ…‚}upfiŠŠˆˆ‰‰‰‰ˆˆŠŠ‰‰ˆˆ††……‡‡‡‡‡‡‰‰ŠŠ‹ŒŠ†„‚€€€€ƒ„††‡‡‡†…†‡‰Šˆ‡ˆ††ˆ‡‡††††………†‡†……„„„„„„„„vleis{€ƒƒ‚‚€~|||}z|‚„†……††‡ˆˆ‹ŒŒŒŒŒ‹†ƒƒƒ…‡ŠŽ‘’’’’’’’”’|nmopsz‚‰’“”•”•••––––“Šuqsv|†ŠŒŽŽ~~~~}||{z{{{{{{{||{{{{|}}}}}}}}}~~~~~~}}}}}}}}}}||||||{{||{{||{}||}}~~|ytplnnrx|~€~}zxsi_Zap„ŽŽ†„†Œ‘Œ‹ŠŠ‹ŒŽ“’‡…yqmcdˆ‹‰Š‰‰‰‰ˆˆ‰‰ˆˆ‰‰††……‡‡††‡‡‰‰‰Š‹Œ‹‡„ƒƒ‚„††‡‡‡††‡ˆŠŠ‡‡†……‡††††††………†††……„„„„„„…ƒ}rf_enx~~zz|~{|~‚ƒ…†……††‡ˆˆ‹ŒŒŒŒŒŠ„ƒƒ„…‡ŠŽ‘’’’’’’’”‰wnmnpt{‚Š“”•”•••––––“Ž‰sqtw~†ŠŽ~~~~}|{{z{{{{{{{||{{{{|}}}}}}}}}~~~~}}}}}}}}}}}}||||||{{||{{{{z|||}}~~{ytpmnory|~€}zwqgZXetƒŠŠ…ƒ†ŒŠŠŠŠŠ‹’’Œ‡„zql`d|†Š‰ŠŠŠŠŠ‰‰ŠŠ‰‰‰‰ˆˆ‡‡‡‡††‡‡ˆˆˆ‰ŠŒŒ‹‡……„€€€‚„††‡‡‡††‡ˆŠ‰‡…„„„…††††††………†…………„„„„„„„‚|qc^^gq{€€}yx|~{|~ƒ…†‡‡††‡ˆŠ‹ŒŒŒŒŒ‹ˆƒƒƒ„†‰ŒŽ‘’’’’’’’”„smlnpv|ƒŠ“”•”•••–––•’Œ‡|ssuy€‡‹ŽŽŽ~~~~}|{{zz{{{{{{||{{{{|}}}}}}}}}}}}}||}}}}}}}}}}||||||{{||{{{{z{||||}}zxtpnnnqy|~}}zuneXXht‰‰…‚…‹ŽŒŠˆŠ‰ŠŠŒŠ‡„|toaex†ŠŠ‹ŠŠŠŠ‰‰‰‰ˆˆŠŠˆˆ‡‡‡‡††‡†‡‡ˆ‰ŠŒ‹ˆ‡†ƒƒ‚€ƒ„††‡‡‡†‡ˆ‰Š‰†ƒ‚‚ƒ„……††††………†…………„„„„„„ƒ‚|rc^Zbkw~}€€~{xw|~}}}€ƒ…†‡‡††‡ˆŠŒŒŒŒŒŒ‹‡‚ƒƒ…†‰Œ’’’’’’’’”‹€plmnpw†‘“”•”•••–––”‘‹„yrsu{‚‡‹Ž}}}}||||||{{{{zz{{{{{{zz{{}}||}}|}}}}~~~~~~~~}}~~}}}}}}}}}}||{{zz{{zzzyyz||z||||yqmmlnry~€~ztl_Y\js~‡‹†ƒ„‰ŽŠ‰‰‰‰‰‹ŒŽ‰‡…‚~yskap‚‹‹‹ŒŒŠŠŠŠ‰‰ˆˆˆˆ‰‡ˆˆ††‡‡ˆŠŠˆ‰ŠŠ‹ŒŒ‹‰ˆ†„ƒ‚€‚‚„††‡‡‡†‡ˆ‰Š‰…~€‚ƒ„„……†††…†…„„ƒƒƒ„…………„ƒ|qe^Y]fov|~zyyy{~}|~‚„„…†‡†‡ˆ‰‹ŒŠ†„‚„…‡‹Ž‘’’’’’’“‘ˆ{nmlmqx€‡Ž’”••”•••–––”‹„wsru}ƒ‰ŠŽŽŒ}}}}||||}}||{{zz{{{{{{{{|||||||||}}}}~~~~~~~~~~~~}}}}}}}}}}||{{{{{{{{zyyz||zz{{zwokkjlry~€~xpeZY^ir{‡Š†‚„‰ŽŒŠ‰‰‰‰‰ŠŒŒˆ‡…„ƒ{sjr€‰ŠŠ‹‹‰‰‰‰‰‰ˆˆˆˆ‰‡ˆˆ††‡‡ˆŠŠˆˆ‰‰Š‹‹Œ‹‰ˆ…„‚€‚‚„††‡‡‡‡‡ˆŠŠ‡}z}ƒƒ‚ƒ‚ƒ„……†…„„ƒƒƒ„„„„„ƒƒ|qd]Y[clqy}{zywwy~~|z}„„…†‡‡‡ˆ‰‹Ž‹ˆ…‚ƒ……ˆŒ‘‘’’’’’’“ƒulmlnqx‡Ž’•••”•••–––”Š‚usru~…Š‹ŽŒˆ}}}}{{||}}||{{zz{{{{{{|||||||||||}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}||||{{||zyyz{{yyz{yunkkjjox|~€|ulbZ[`fny…‰…„‹Ž‰ˆˆˆˆˆ‰‹‹Š‡†…†…‚€}y|‡‰‰ŠŠˆˆ‰ˆ‰‰ˆˆˆˆ‰‡ˆˆ††‡‡ˆŠŠ‰‰‰‰Š‹‹ŒŒ‹‰ˆ†„‚‚‚„††‡‡‡‡‡ˆ‰‰„~zwz€‚~ƒ„…†…„„ƒƒƒ„ƒƒƒƒƒƒ}rd][\aipwzzzyvvx||{z}„…„†‡‡‡ˆ‰ŒŠ‡…ƒƒ…‡ŠŒ‘‘’’’’’’’Œrmnlpt{‰’•••”•••–––”Š€tstw…‹ŽŽŠ…}}}}{{||}}||{{zz{{{{{{||}}}}||{{|}}}}~}}~~~~~~~~~~~}}}}}}}}}}~~}}||{{||zyyzzzyyyzxtmjhhjmw|~~wohb\_aelv„ˆ…„Ž‰ˆˆˆ‡‡‰ŠŠ‰‡†ˆ‰ˆ††…ƒƒƒ‡‰‰ŠŠˆˆ‰‡ˆˆ‡‡‡‡ˆ†‡‡††‡‡ˆ‰‰‰‰‰ˆ‰Š‹ŒŒŒŠŠˆ…„‚‚„††‡‡‡‡‡ˆ‰ˆ„|wwz~{{|€„…†…„„ƒƒƒ„ƒƒƒƒƒƒ~sf_^]_houxxzyvwwz|}{}„…ƒ†‡‡‡ˆ‰Š‡„ƒ„‡‡ŠŒ‘‘’’’’’’’‹{nmnmqu|‚Š‘’•••”•••–––”‰~vtuy†ŠŽŽŽˆ}{{{{{{y{{{{{{zzzzzz||{{}}}}}}zz}}}}}}}}~~~~~~~~~~~~}}}}}}}}}~~~~~}}||||}}{zy{zywvxywslggghmu{~zqjfcadcbhsƒˆ†„Ž’‰ˆˆ†††‡Š‰‡ˆ‡‡ˆ‰ŒŠ‰††…†‡‡ˆˆ‡‡‡†ˆ‡‡‡‡‡ˆ‡‡‡†††‡ˆ‰ŠŠ‰‰ˆ‰‰‰‹‹ŒŠ‰…„„„…††ˆ‡‡‡‡ˆ‰‡‚yvvz€}yyy}„…‡†„„ƒƒƒƒƒƒ|uha`_^fnruy|zyxx{{|{~„…„…†ˆ‡‰ŠŽŽŒŠ‰†ƒ‚„‡‰‹‘‘““““““’ˆynmnnty„Œ“••””””•–••’Žˆ~uuvyˆŒŽŽŽŽ‹…}}{{{{{yz{{{{{{zzzzzz{{{{||||{{zz}}}}}}}}~~~~~~~~~~}}}}}}}}}}}~~~~~}}~~}}||{zy{zywvwxvqkgeghktz€}umfddfdbbfq€‡…€ƒŽ”Ž‰ˆ‰‡†††‰‰‡ˆˆˆŠ‹‹‰‰††‡‡‡‡‡‡†…‡††††††††††††‡ˆ‰ŠŠŠ‰ˆ‰ŠŠ‹ŠŒŒŠ‰†…………†‡ˆ‡‡‡‡ˆ‰‡yuw|{xxy|„…†…„„ƒƒƒƒƒƒ}ypic``^cehns|||xwy{{z|~………†ˆ‡‰ŠŽŽŒŠ‡„‚‚„‡Š‘’’““““““‘†vmooov|†‘“••””””•–••’Ž‡|tuvz‰‹ŽŽŽˆ€u}{{{{{y{{{{{{{zzzzzzzz{{{{||{{||}}}}}}}}~~~~~~~~~~||}}}}}}}}}~~~~~}}||}}||z{{zzyvuvvuqjfcfgipxyqiddhjfb`cl}‡†€‚•‰ˆ‰‡††„‡‰‰ˆˆŠ‹ŽŒ‹‰‡‡‡‡‡‡‡†…‡†††††……†††††‡ŠŠ‹‹‹Š‰Š‹‹‹‹‹‹Š‰ˆ‡……††‡ˆ‡‡‡‡ˆ‰‡zvw}zwx{}ƒ……„„„ƒƒƒƒƒƒ}|vpjfeb`__`aiq{{uposvyz~„……†ˆ‡‰ŠŽŽŒŠ‡ƒ‚„†ˆ‹‘’’““““““ƒsmopqw}ƒ‡Ž’••””””•–••‘†{tuuzƒŠŒŒŽ‹…yo}{{{{{zy{{{{{{zzzzzzzz{{{{{{||}}}}}}}}}}~~~~~~~~~~||}}}}}}}}}~~~~~}}||}}{{z{{yzyvuvvtpiecdfgku}}vjecgmnib^`i}‰‰‚”‰ˆŠˆ††ƒ†‰‹ŠŠ‹‘Œ‹‹Š‡‡‡††‡‡†…‡†††††……†††††‡ŠŠŒŒŠŠŠŒŒ‹Š‹‹Š‰‰ˆ‡‡†‡‡ˆ‡‡‡‡ˆ‰‡{vw~zwy}‚ƒ……„„„ƒƒƒƒƒƒ|xmdbceba````fq{}ypiehmsx|ƒ†…†ˆ‡‰ŠŽŽŒŠ…ƒƒ…†‹‹‘‘‘““““““Ž‚pnpprx~ƒ‰ŽŽ‘••””””•–••Œ„zsutzƒŠŒŽŒŠ‚um{{yyzzzzzzyyzzyyyyzzzz{{{{{{{{{{}}}}}}}}}}}}}}}}}}||}}}}}}||~€€}}}}}}||{zzzyyyyvvttrngbbcgehrzzricflqpof_^f|ƒ€‹”ˆˆ‰‰…„„…‡‰‹‹‹Ž’‘‹Œ‰ˆ†††††………………„„……†††††‡‰ŠŽŒ‹ŒŒŒ‹‹‹‰Š‰Šˆ‡‡†‡‡ˆˆˆ‡‡ˆ‡†|y{~|z{~‚ƒ„…ƒƒ„ƒ„ƒƒƒ‚‚€{mWKQ]eca`a`_enwysngb^^grw€„„†ˆ†‰‹ŽŽŒ‹‡…‚ƒ„†ŠŒŽ‘‘““““’‘Œ}pnpptx~…‹Ž’••””””••”“‹‚yvvx~…‰ŒŽ‹‡{pk{{yyzzzzyyzzzyyyyyzzzz{{{{{{{{{{}}}}}}}}}}}}}}}}}}||||||}}||~}}}}}}||{zzzyyxxvvtsqlfabdighowxqiglrwvrkc^e}ƒ€Š‘ˆˆ‰‰…ƒ‚‚…ˆ‹‹Œ‘’’‘ŒŒŠ‡†††††………………„„………………†‡‰ŠŽŒŽŒ‹Œ‹‰Š‰Š‰‡‡ˆˆ‰ˆˆˆ‡‡ˆ‡†|{}~ƒ€|{{ƒƒ……„…„ƒ„ƒƒƒ‚‚xfMBL[eda`a``bhnqolf`\VY_jrw~‚‡ˆ†‰‹ŽŽŒŠ‡„‚ƒƒˆŠ‘‘““““’‰zqnpquz†ŒŽ‘“••””””••”“‰vvvy€†ŠŒŠ‚wnl{{{{zzyyyyyyzyyyyyyyyyzz{{{{{{{{}}}}}}}}}}}}}}}}}}||||||}}~~~~~}}~~}}||{zzzyyxxwwtspkebcfiihktwqjkpw{zupgag‘†ˆŽˆˆ‰‰‡†‚„†‰‰Œ‘““’Ž‹ˆ‡††††………………„„„„„„„„†‡‰ŠŽŽŽŽŽŽŒŠ‰‰‰Š‡‡ˆˆ‰ˆˆˆ‡‡ˆ‡†~|~€€}|}€ƒƒƒ„„ƒ‚ƒƒƒƒƒ‚‚~ueUR[bfdbaaddbdgllhe^ZUPU_aiu†ˆ‡‰‹ŽŽŒŒ‰†„‚ƒ„‰‹‘‘’““““’†xqrqtx|€‡‘“••””””••”’‡|vwwz€‡ŠŒŽ‡}smk{{{{zzxxzzyyyyyxyyxxxxyy{{{{{{{{}}}}}}}}}}}}}}}}}}||{{{{}}~~~~~}}}}||{zzzyywwxxtsojebcgijiiquskkrz~}ztkfm€‘”‡†ŽŒˆˆ‰‰‡†ƒ‚ƒ…ˆˆŠ‘“”“Œˆ†††††………………„„ƒƒ„„„„†‡ˆŠŽŽ‘ŒŠŠ‰‰Š‡‡‡ˆ‰ˆˆˆ‰‰ˆ‡†~€}|‚ƒƒƒƒ‚ƒƒƒ‚‚~ugdikjhebbbffdadjkgb\XTQZXX^m}„‰ˆ‰‹ŽŽŒŒˆ…ƒ‚ƒ„‰ŒŽ‘“”““““”‚tqtsvz‡Ž’“••””””••”’‡|uxxz€‡‹ŒŒ†zpmj{{zzyyyyyyzzxxwwxxyyxxzz{|||||{{}}}}}}||}}}}}}}}}}|||||||~}}}}}}~~~~~|}|{yxxyyxxxwurohcacilkgelsroqu{€~yplp‚“‰‚ƒŠŒˆ†ˆˆ‡†„‚ƒ…‡‡‹’”“‘ŽŽŒˆ††…††††††……„„ƒƒ„„ƒƒ„†ˆŠŽŽŽ‘Ž‹Šˆˆ‡ˆ†‡ˆˆ‰‰ˆˆˆ‡…~~‚‚‚ƒƒ‚‚€}‚‚‚}vopzytlhccejidacegfaYTPOVTPTfz„†ˆŠ‹ŽŽŒ‰†ƒƒƒ„†ŠŒ‘“’““’““Ž‚tsttx|~‚‰Ž’“””””••••”‘‡|wxx{‚‡‰ŒŠvmmmzzyyyyyyyyyyxxwwxxyyyyzz{|||||||}}}}}}||~~~~}}~~}}|||||||~}}}}~~~~~~~|}|{yxxyyyyxwvsoic`ejnnjgkppopt|€}vqt‚–Œƒ‚‰Œˆ‡ˆˆ‡†„‚ƒ„††‰‹’””’ŽŒŠ‡†………‡‡††……„„ƒƒ„„ƒƒ„†‡‰ŒŒŽŽ’‘‹‹‰ˆ†††ˆˆˆ‰‰ˆˆˆ‡„‚€€ƒ‚„ƒ|~‚ƒƒ‚€|zw{}€~zw{€yphddhlkeabbdb]TPKKMRNM]q}ƒ‡‰‹ŽŽ‹‡…‚‚ƒ„‡‹Ž‘‘“’““’““‹ussty}~‚Š‘’”””””••••”‘„{wxw|ƒˆ‹Œ‹‡|qmopzzyyxxyyyyyyxwyyyyyyyyzzz{||||}}}}}}}}~~~~~~}}~~}}|||||||~}}~~~~~~~~~|}|{yzyyyzzxwvtojebgmqqnikqqomqy‚ysu‚˜‘ƒ€‡‹‰ˆˆˆ‡†…ƒ‚ƒ……‡Š’”’‘Š†„………‡‡††……„„ƒƒ„„ƒƒ„††ˆ‰ŠŒŽŽ’’“‘ŒŠˆ……„††ˆ‰‰ˆˆˆ‡„ƒ‚‚„„ƒ{ttz~€}uqqtx|||}}~~€ƒ€xogcdhonicb``\UMIGHBLKLXgt†‰‹ŒŒ‰†ƒ‚ƒ…‡‹‘‘“’““’“’‰|tssty}‚Š‘’”””””••••”‘‹‚yvyx}…‹‹‰ƒypmpryyxxwwyyyyxxwwyyzzyyzzzzy{||||}}}}}}}}~~}}}}}}}}}}|||||||~}}~~~~~~|}|{yzz{{yyxwurokgeinssplkpqoknv}ƒ{uw‚™’„~…ŠŠˆˆˆ‡†…„‚ƒ……‡‰‹Ž‘”’“Œ‡„ƒ…††††‡‡……„„ƒƒ„„ƒƒ„††ˆ‡‰ŒŽŽ’““‘‘‹‰…„ƒƒ…ˆ‰‰ˆˆˆ‡ƒƒ„„„„}tonrw}}zrmkotxyyyy}ƒƒƒ~umgccgpokea^[VNGE@>EJHGS^l{…‡Š‹ŒŒ‹ˆ…‚‚ƒ…‡ŒŽ‘‘‘““““’“‡{srrty€ƒ‹‘’”””””••••”‘Œ‚wvyy~†Š‹†~uooqtyyyywwwwxxwyxxyyzzzzxyzzz{||||}}}}}}~~}}}}||||{{}}||||||}}~~}|}|{{{z{{||zxxwvsnjgfjpsuqnknoniis}‚‚|wxƒ˜“…}ƒˆ‰‰‰‰ˆ‡…„‚ƒ……„‡‰‹’‘‘Ž‡ƒ……††‡‡††……„ƒ‚‚ƒƒ„„„…‡ˆŠŒŽ‘’‘’’’Œ‰†…ƒ„‡ˆˆˆˆ‡†………„‡„|rlhhilsvvqmjjortsrty}ƒ}sjcbaeoplea\YTLA<78?FC@IVgw‚†‰Š‹‹Š‰„€‚ƒ„†‰Œ‘’’’’““’“Ž„wqrsuz~~ƒŠ‘“”””””””••“’Šwvyy†‹Š‚wpnqtuxxxxwwwwxxwyxxyyzzyyxyzz{{{{||||}}}}~~}}}}||||{{}}||||||}~~~}|}}|{{{{||||zxxwurnjffipturnjkkkgep|‚{ww‚–’…}€†ˆ‰‰‰‰ˆ…„ƒ„…‡„†ˆŠŽŽ‰syƒ………††††††„ƒ‚‚ƒƒ„„„…†ˆ‰Š‘‘‘“”’ŽŒˆ†„}‚…‡‡ˆ‡†††…†…rihgffgkstqnkhjlonnpv|€}tjcbadlpngb\ZULB635=GECIUcnz‚ˆ‰‹‹Š‡‚€ƒ…ˆŠŒŽ‘’’’’““””ursvw|~~ƒŠ‘“”””””””••“‰xwyz€†ŒŒˆtmnqvwxxwwwwwwxxwyxxyyyyyyxyzzzzzz||||}}}}~~}}}}||||{{}}||||||}}~~}|||{{{{{||||zxxwurnjeehotusojjjjdcmz€€zvv€•’‡}|‚†ˆ‰‰‰ˆ†…„†ˆ‡…††ˆ‹ŽŽŽ‹„tfp~‚„……††……††„ƒ‚‚ƒƒƒƒƒ„†‡ˆ‰Š‹Ž‘‘’”“ŽŠˆ…|w{€„…‡‡†††„…wlhhfefgiottqlhdehihjs|€ujfcabjqpib\ZUNG>9;DLLNTQSfr~†‰‹‹‰†‚€ƒ†‰‹‘’’’’“””’‹~ustvx}~~‚Œ‘“”””””””••’Žˆ}wxyz‡‹‹„|qmnsx{wwwwwwwwxxwyxxyyxxxxxyzzzzzz||}}}}}}~~}}}}||||{{}}||||||||~~}|{|z{{{{||||zxxwvsnjedhotuuplkjjddly€€zvuŒ”’ˆ}}‚…ˆ‰‰‰ˆ‡……ˆŠˆ‡†…‡ŠŒ‰€l^f{ƒ„„…………††„ƒ‚‚ƒƒƒƒ‚„…†ˆ‰ŠŠŽ‘“•“ŒŠ‡|uu|ƒ„‡‡†††‚ƒslkkiggfhnuvsmhbbcdbgq|€‚‚ukhdaajssle^YUQLKGILPRX]L>\i{…‰Š‰‡…‚ƒ†ŠŒŽ‘’’’’”””‘‰}sssux~~~‚‘“”””””””••’Žˆ}vxy|‡‹‹ƒyqmoty~wwvvwwwwwwwwwwyyxxyyyzzzzyzz{{||}}}}}}}}}}}{{{{{||}}{{}}}}}}~|{zzyy||||{{{{zyxvsokdcfnswwtokkjfcjw€ytu€Œ’“Š€}„ˆˆˆ‰‰‡†‡ŒŒŠ†……†‰‹Š‹…xgY\u‚„„ƒ„……†…ƒ‚‚‚‚‚ƒ„……‡ˆˆŠŽ‘‘‘““‘ŽŒˆsrw~ƒ‡†‡†‡„‚zqnookiiiimtvumhcb`_`er|‚„„wlhebblyyqjc^[WTWYWVXSX_H.Ebv…‹Šˆ…€€ƒ„†Š’’‘’”””‘ˆzppruz|}~ƒ‘’“””””“•••’…}wxy|‚ˆŠˆ~uonmt|vvvvwwwwwwwwwwxxxxyyzzzzzyzy{{||}}}}}}}}||}|||||{{||||}}}}~€€€€~zxxxxy|{{|{{{{{zyvsolebclquwvplljgdhw€‚~ytvŒ’“Ž…~~ƒ‡ˆˆ‰‰‡‡ˆŽŽ‡…ƒ„…†…ƒ~rdVSl|„„ƒ„……†„ƒ‚€ƒƒ„„…†‡ŠŽ‘‘‘‘‘‘ˆ‚ursv~„„††‡…xsssromkkjmswwsnhdaa`gt~ƒ„„ƒ{pjfcdpzysleb^[X[^]\WX^^H+4Ri|‡ˆˆ€ƒ…‡‹Ž’’‘’”””’†yqqruy{}~„Œ‘’“””””“•••‘„zvyz|ƒˆŠ†{soorx}€uuvvwwwwwwwwwwwwxxyyzzzzzxyy{{||}}}}}}|||||}}}||{{{{}}}}}}€€~zwvuux{{{|{{{{{{zvsolfbbhnrwvsokjgcfu~ywsvŒ’“Ž‡}†‡‡‰‰‰‰Š‹ˆ‚~}~{vkaTO^z€„„ƒ„………ƒƒ€‚‚‚ƒƒƒ…†‡‰Ž‘‘‘ŽŠƒxqssy€ƒ…†„wustuutomjlswwvrmheedjv‚ƒƒƒ}rlfbfszxsked_]\]bdc\]_Z?+0CXl~…†‚€€ƒ…ˆŒŽ’’’“••”‘„xqqruz|}~„Œ‘’“””””“•••Œƒyvyz~ƒˆŠƒyqpqt{€uuvvwwwwwwwwwwwwxxyyzzzzzxyy{{||}}}}}}{{{{{}}}{{zz{{}}}}}~~~}yvuttxz|{|{{{{{zyvsokfdbhnrvwuqkjgccpz{vsquŒ’“Ž‡}€…‡‡‰‰‰‰‹‘’Œˆƒ~zvxwrg_TMUs„„ƒ„……„ƒƒ€€€‚ƒƒƒ…†‡‰Ž‘ŽŽŽŽŠ„xpprw|€…†ƒ~xttsw{ysnjkrvvutpmiiinu~‚„„}skeaeqzwskfea^^^dihca^T918EPby„†…ƒƒƒ„…Š’’“”••“‘‚wpoqt{}}~…‘’“””””“•••‹‚zwyy}ƒ‰ˆwpqrw}‚ƒttvvwwwwvvxxwwvvwwyyzzzzzyyyz{||||{|}{||||}}}}||{{||}}}}}~~€~~~}zwsqsvz|}||||{z{yxuqlgbcinsuvtrnkidajstpprv‚’’‰|„‡ˆˆˆˆŠ’““‘Šƒyqlprmf`TKNf|ƒ„ƒ„„…ƒƒƒ‚‚‚ƒ„†‡ˆ‹ŒŒ‹ŠŠˆ‰Š‰‰„vnnruy|ƒ|xwtt|€~upmnquvutspommpu~‚ƒƒƒ{rkd_cpwvsnhcbaabgjljd\N97DLUk€‡ˆ‡‹‰‰‡‡ŒŽŽ’’’“••”€sooouz~}‡‘‘’“””””“”•“‰zwxy~…‹†{upqrx†ƒuuvvvvwwwwxxwwwwxxyyzzzzzzzzz{{{||{|}{}|}}}|||}}||||}}}}}~~€|zwsqruy|}}}}}{zzyyvsnfbckptvwusolje_enmlmsvƒ’’Š‚}…‡ˆˆˆ‰Š“””“‹ƒzlehkje`ULGWw€………„…„„ƒ‚€€€€‚‚ƒƒ…‡ˆŠ‹Š‰‡‡……„ƒ…†‡‚xonruyz{~€~zyxvy€„xqnprvwwwurqonrw~‚„ƒƒ{rme`dqwxupieeccdgijf`XI::HZoƒŒ‰ŠŠŠ‰ŠŽŽ’’’“”””~ponov{~}€ˆ’‘’“””””””•“‰€zxxy†Šxsqrs{„ˆ…vvvvvvwwxxxxwwxxyyyyzzzzzzzz{|{{||}~}|}|}}|{||}}||||}}}}}~~€€€€|zwsqqsw{|~~~~|{zyxvrmebempvxxvuplkf_bjiimrwƒ’’Š„…‡ˆˆ‡ˆŠ••–“†|mfgjid^VNFNo}………„………„‚‚‚ƒ„‡ˆˆˆ††……ƒ„„ƒ„…ƒ‚zspruyzyz{zwyxz‚…‚zqoruxxwwwurpptyƒƒƒ}smfagsz{uqjggfededdb^UE9=TqƒŽŒ‰†„„„ˆŒŽ’’’“““”~qpoov|}€‰’‘’“””””””•“ˆyyyz€††~urstv~‡ˆƒvvvvuuwwxxxxxxyyyyyyzzzzzz{{{}||||~~}{{{}}|{{{||||||}}}}}~~€‚€€|{wsqpsv{|~~|{zyvtpkecgoqwxxxwpmjeacghhnsyƒ’’‹……‡ˆˆ‡ˆŒ––˜”ˆ}rigmje[VPHHbzƒ……„…………ƒ‚€€‚ƒ„†‡‡…†††„ƒ„„ƒƒƒ‚‚|vqruyzzzzyxyx|ƒ„‚zrpswzxwwvvtrru{€„ƒƒ}tldbiu|ztqjjjfcb``_`]RD=B_”“‡~{|~ƒ‰’’’“““”~uqoov|€~€‰’‘’“””””””•“ˆ~zyz{€…„|rqruyŠŠ„uuvvuuuvwwxxxxxxyyyyyyyz{{||{|||}}~~|||{|||{{{{{{{|||||||}€€€~}zvrqquy|~€}|xwuuroieeiptvxxxvspniefikjosz„’‘Ž‰€„‡ˆˆˆ‰Œ“—˜—“‘Štkhiic[SNHFSw……………„…ƒƒ‚€€€€€€ƒ„†‡†…‡†……„„……„‚‚ƒ€yuruxzyz{yyzx|…†‚zspsy|zxwwwusrv|€‚ƒ„ƒ|tkecmx|ytqmllgbbba^`_SIEMg…’——•‰€yvxyy}†Œ‘‘’“““”{tpopw}~Š’’““””””•••“…~{zy{ƒwrqtvzƒŒ‰ƒuuvvuuuvwwxxxxxxxxyyyyyz{{{{{|||~}}}|||{||||{{{{{{{{|||||~€€€~{wrqptx|}~{wsrppnnhegkpvwwyywurolllnqnnqz„‘‘‘Š‚„‡ˆˆˆŠ”˜™˜“’…ypliec[ROHBHl}„…………„…ƒƒ‚‚€‚ƒ………††‡………„„……„‚„ƒ}wsuxyyz{yyzy{…‡ƒzsqt{}{zwwywuux}€ƒƒ…‚{skeenwzwrpnmmhbbcc`a`VOLSmŠ—œœ”ƒ|wtvurt€Œ‘‘’““””Œysqoqx~|€‹“’“”””””•••’…}zzy{€|sqrtv|„Œˆ‚uuvvuuuvwwxxxxxxwwyyyyyz{{{{{|||}|||||}|{|{{{{{{{{{{||||~€€€~{wrqprx{||xuqmkiijifehmrvwvxxyxuqoqrtvpmqy‚‘‘“‘‹ƒ„‡ˆ‡‰Œ•˜š™”“‰unhdb]VPJBD\z‚†………„…ƒƒ‚ƒ‚„…„…‡†‡‡‡…„„……„„„‚€|vtwyy{{{{{z|ƒ…ƒysqu}}|{yyyxuvz}‚ƒ„yqkefnwytollmmidbcfbb`YROWp‹˜žžŽ€zyvuromxˆ‘‘’““””ˆxqppry~|€‹“’“”””””••”‘‹„|zzy{€ytqsvz€‰‹†€uuvvuuuvwwxxxxxxwwyyyyyzzzzz{|||}|||||}|{{{z{{{{{{||||||~€€€~|wrqpqw{{zrpjfecdggddinuvywxwywusqtwwxsprwŒ’•“Œ„„‡ˆˆŠ‘•™šš””‹‚wniea^XQMDAOt†………„…ƒƒ‚ƒ‚‚‚‚‚‚ƒ„…†‡ˆˆ‡††‡……‡…„„ƒ‚~wtvyyz{||{y}€‚ƒxsqv~~|zzxxwuy~‚‚ƒ„ypkefoxzrmkjlljfbcecca[SRYq‹š¡Ÿ‹z{xsqmioƒ‘‘’““””†xpoorz~}‹“’“”””””••”‘Œƒ|zzy|}vtttx|ƒ‹‹…uuuuuuuvwwwxxxwwxxxxxxyyzzyyz{{z{{{{{{|z{{z{||{{{{||{}}}}~~~~|xsnnov{zxqjea`_]_acgmruwxxxxzxvspty{{sosx€‹’””’Ž„€‚ˆ‰Š‰”™š™–”Œ„}slhd`ZSLF@Fg|„…„„„ƒƒƒƒ‚‚ƒƒ‚ƒ‚„„…††††…††††‡†‡†„„ƒƒƒ‚{uuxyzz}|{|€‚~wqpv€~{ywvy~ƒƒƒ€vokegs|zsnihjjlgcdedab^WV]sŠš ŸŠ€€yuqlfev‹‘‘‘‘’““”“‡xoopry}}}‚Œ‘“““”””””••“Šƒ{yzx{~{trsuxƒŒ‰‚uuuuuuuvwwwxxxwwwwxxxxyyzzyyyz{z{{{{{{|z{{z|||{{{{||{}~~}~~|ztnnouzywpha__^Z\`ciouuxxxxy{ywtqtz}|sosw“•”’†€‚‡Š‹‹Ž”˜š™—“‘‡‚ytpjd]UMHA@Uv…„„ƒƒƒƒƒƒƒ„ƒ‚„‚„…‡††††…†††‡‡‡‡ˆ†…ƒ„ƒ‚~xvxy{{~|{}}}|vpqw‚ƒ‚‚}zxwy~ƒƒƒ~tojdgs{ytmhgijlgdfhebc`[[at‰˜Ÿž„ƒ‚{toie`jƒŽ‘‘‘‘’“””’‡wopqsy}}}ƒ‘””””””””••“‰zyzxz|wrrsvz‚‡Œ‡~ttuuuuuvwwwxxxwwwwxxxxyyzzyyyzzy{{{{{{|z{{z|||{{{{||{}~~}~~€€}{upnosxxskeabca^]_dkrvwxxxxy{ywtqsy|{rnrv€’”””’‹„ƒ‡‰ŒŒ‘–—™˜–’‘Ž‰†zwpg^XPG@=Ik{ƒ„‚‚ƒƒƒƒƒƒ„„„„ƒƒ…†††††‡‡†‡‰ˆ‰‰‰ˆ†„„‚{xy{{{~|{}€€}zyspqxƒƒ„„ƒ}yxy~ƒƒƒ~toicgs{yulhgilkhghhfdb_^^cs‡–›‰„yqiec^cxŠ‘‘‘’“””…wqrrt{}}„Ž‘””””””””••“Š€{zzxxyvqsux~…ŠŠ†ssuuuuuvwwwxxxwwvvxxxxyyzzyyxyzy{{{{{{|z{{z|||{{{{||{}~~}~~€€|wqnoqvvqhdcegea`agntwyxxxxy{yxuqtx|{qnrv}‹‘’”–“†…†‰ŒŒ‘–—™—•’ŒŠˆƒzria[SG@<E^y„‚‚ƒƒƒƒƒ„„††„ƒƒ„…†‡ˆ‡ˆˆ‡ˆŠŠ‰‰‰ˆ†„ƒ‚‚}zz{||~|{}}yvqoqyƒƒ„„ƒ‚zxz~ƒƒƒ}sniciu~{vlhhinkhhjgeec^__ds‡‘š˜Š†wnea`^_n„‘‘‘’“””„vqstv|€}}…Ž‘””””””””••“‰{|{ywvtstvz€†‹‰„~ssuuuuuvxxxyyywwwwxxyyyyzzzzyz{{{{{{{{{{{{{{{{{{||||||~~}~€}yspppuuofdglnkecemruxyxxyyzzyxtrtx|zqnqu{‡Ž‘””•‹††ˆ‹’”•—•“‘‹‰ˆ…|siaZVLD>CTs}‚‚ƒƒƒ‚ƒ„††…ƒƒ„†ˆˆŠˆˆˆˆ‹Œ‹Šˆ‡†…„‚‚‚}{{|||}|~€€|xuqoqz„„ƒƒ‚‚}{}ƒ„„|smgciu}|wokhjlklmmjfec`_bdq€Ž—•‰…wnd^]\[e|Ž’‘‘’“””€ursst|~~…’””””””“•–•“…}z}|xuussux{‰‰‡…‚vvvvuuuvwwxxxxwwxxxxyyyyzzzzzz{|{{{{{{{{{{{{{{{{}}||||}}~€€~zspnoqsogekqurkggntwyyxxyyyyyxuttw{ztqqtx„‹’”•“‘Š‡ˆ‹‘’”•–•“‘ŽŠ‰ˆ…ƒ~vka[XQHAAKdz€„ƒƒƒƒƒƒ…‡††„„…ˆ‰‰Š‰‰‰‹ŽŒ‹Šˆ‡††…‚‚ƒ{||||~|~€€}zuqqr{„„„ƒ‚‚‚~€‚ƒ…ƒ{rmedkw}|wqlijklnoolhfebacemx…‘ˆ„‚zpf^]\[_s‰‘‘’“””Ž€tqqpt|~~‡‘””””””“•”•“…}{~}xtsrsux~„‹Šˆ…‚vvvvuuuvwwxxwwwwxxxxyyyyzzzz{{{|{{{{{{{{{{{{{{{{}}||||}}€€€€|tpmlornhhmtyxqjhntwyyxxyyyy{yvttwzyspqrwˆ’•–’‰‹‘’“”•”’Šˆ‡‡…€xne]XUMGCFVt€ƒƒƒƒƒƒƒ…†ˆ‡†„‡‰Š‰‹‰‰‹ŽŒŠ‰‡†………‚‚ƒ|||||~}|~‚|uqps~ƒ……„„‚‚‚‚„…ƒzrlcdlx}|xsokjknoooljjgdcdflr~‰Š…‚}tia__]\jƒ‘‘’“””spont|~~†‘””””””“•“•’Ž…~|~~xsqqrtx€‡ŠŠ‡…ttuuuuuvvvwwwwwwxxxxyyyyzzzz||||{{{{{{{{{{{{{{{{||||||||}~€€~xrnlnpngimv{{smlpuxyyxxyyzzzyvttvzyspqqw…‰‘——•Ž‹‘’’”•”‘Œ‰ˆ†…†ƒ|sk_YVQLFEPg}‚ƒƒƒƒƒ„†ˆˆ‡…‡‰ŠŠ‹Š‹ŒŽŒŠ‰‡………†ƒ‚ƒ|||||~||~}zuqps~„‡†…„ƒ‚‚‚ƒƒ‚„†‚yplbcmy}|xtpmmkmnnnnlljeddfloy…Š‡ƒ{ska^`^]f}Ž‘‘’“””€spont|~~„Ž‘””””””“•””’ƒ}|~~wrorrtzˆŠŠ‡„‚stuutuuvuuvwwwxxyyyyxxyyyyzz{{{{zz{{{{||{{{{{{{{||||||}}|€€€}smjkmjggqy{yvsptyzyxyyyyzzzzxwuuxxuqqrw€…‡‘——“Ž‘’’”“‘ŽŒ‰‡†…„ƒyqdYWXQLGL^x‚„‚‚‚ƒƒ‚„…ˆŠ‰ˆˆ‰‰‹‹‹‹Š††…„†ƒƒƒ€}||||}|}‚‚{tqrs}…†‡‡†„‚ƒƒ„„…†††‚wplfgq{~|xwtonllmommoomighkmmt~„„„€~xsi__aa`buŒ’‘““”“‹|roqqu}€}…“••••••“•••’‹ƒ}{~}xqossu|‰Šˆ‡…~stuuuvuuuuvwxxxxyyyyxxyyyyyz{{{{zz{{{{{z{{{{{{{{||||}}}}|€€€~wojkkgefqy}zwvxzzyxyyyyzzzyyxuuxxtppqv~„†’——“‘’“”“‘ŽŒ‰‡†…„ƒ‚}sfXWXSPOQ[q‚ƒƒ‚‚ƒƒ…ŠŒŒŠ‰ŠŠ‹ŒŒŽ‘‘‘‘‹ˆ………„…„ƒƒ~}}}}~}|„„€{trrt|ƒ†‡‡†…„ƒƒ……†‡††€uolghs|}zxxvqpnlmqonppokijmoou}‚ƒƒ}xoe_`cb`^nˆ’‘’””“Œ}rooov~€}…“••••••“••”’Šƒ}}€|wqortu|ƒ‰‰ˆ‡†~stuuvvvvvvwxyyxxyyyyxxyyyyyyzzzzzz{{zz{{{{{{{{{{||||~~}}~~€€€€€~yokkhdbeow~}{yyz{{zyyyyyzzzyzyvvxytpnqv}‚…”——“ŒŽ‘“”“‘‹ˆ††…„ƒƒ|o\UUVUSRZhzƒƒ‚€ƒ†ŒŽ‹Š‹ŒŽŽ’“‘‹‡„…„„„„„„ƒ~~}|{„„€{urqt|‚…†‡‡‡„ƒƒ„„†‡††}rmifis}|yxxvsponnrrqqppomorsswy}~zzwoe__bda_lƒ‘’“””“‹|rooow~}…‘”••••••“•””‘Šƒ}}~zuqoqux…ˆˆ‡‡†~stuuvvwwwwwyyyxxyyyyxxyyyyyyzzzzzz{{yyz{{{{{{{{{||||}}~~~}~~€€€~|pjjeb_dov{{{{{{||{yyy{{zzz{zzwwwztpnqx~‚†•–”“Œ‘’”“‘ŽŒŠ‡††…„„‚„ƒyfWRVXVS[csƒ‚€€‚†ŒŽŽŒ‹Š‹ŒŽ‘”“‘ŽŠ‡ƒ„ƒ„„ƒ……„~~€€{zzƒƒ€{urpu~ƒ„…††‡†ƒƒ„„†‡††{pmifjt}}zxxvuqpnntusqprqpruvvvvy}{wyvod__`deal‘’””“‰{ropqx€}}…‘”••••••“••“Šƒ}}}ytqoquz‡ˆˆ‡‡†~rsttuuwwwwvxyywwxxxxwwxxxyyyzzzzzzzzyzzz||{{{{{{{{{}~~~~~~~~~~~€{vokfb^`jsz}~}}|{{{yyy{{zz{{{ywvvwuqnr{~‚‡••”“ŽŽ‘’”“’Œ‰ˆ…„…„„ƒ…†vbUVZZZY_l|‚ƒ†ŒŽŽŒ‹Š‹Œ’”“Œˆ†„„„ƒ„„………‚~~}~|zz„„€|vqpvƒ†††‡ˆ‡„‚‚………ƒynmjfkv|}{ywwwrpoostrpqrqpquxxtqtwvttpkc^^begejyŠ‘”’‰zrpppx~|†“••••••”••“‘‹‚~~~vsoortzƒˆˆˆˆˆ…‚pqttuuvwwwvxxxwwxxxxwwxxxyyyzzzzzzzz{zzz{{{{{{{{||{}~~~~~~~~€€}zsmhb]^fqz~~~}|{{{yyy{{zz{{{yxvvwvurv}€ƒˆ•–””ŽŒŒŽ‘’””’Œ‰ˆ…„„„„„†‡…q`WW]_\^hwƒ€€ƒ†ŒŒŒŽ‘”’Ž‰‡†††……†…………ƒ~~}|zz„„€}vqpx€„†‡‡ˆˆˆ…‚‚………wlligny~}zyxxxutppsuroqsqpptvvrnqrrqpnke^]`dhhiu…‹Ž“‘‡xrqppx~}†“•••••••••“‰~~}vrnort|…ˆˆˆˆ‰†‚oqtttuvwwwvxwwwwxxxxwwxxwyyyzzzzzzzz{zzz{{{{{{{{}}{}~~~~~~~~€€€€€}xqje`^dpz~~~}|zzz{yy{{zz{{{yywwxxxx|‚†ŠŽ‘”•”‘ŽŒŒŽ‘’””’Ž‹‰ˆ‡†„„„„†‡†…{o`X[^_`fs}€„†ŒŽ‘’Œˆˆ‡ˆˆ††ˆ‡………ƒ€€}{z„„~wqpv„…†‡ˆˆˆ…ƒ‚‚ƒƒƒ}rlljhpy|yxyyywvspsvtnnnmlkoqqolmmnnnolh`\]cghhp†‹ŒŽŒ„xqpppx~~‡‘••••••••••“‡~{tpnosv†ˆˆˆˆ‰†‚prtttuvwwwvxwwwwxxxxwwxxwxxyzzzzzzzzzzzzzz{{{{{{}}{}~~~~~~~~€€€~~zrkfb_eoz~~~}|zzy{{{{{zz{{{yyxwyzz{€‚ƒ†ˆ‹•••‘Ž‹‹Ž‘‘““‘‹ˆ‡‡†„ƒƒƒ…††…yj][]_afp{€‚„‡ŒŽ‘‘‰†ˆ‰ŠŠ‰ˆˆ‡………ƒ‚‚€}{{„„~vporz‚……‡ˆˆˆ†ƒ‚‚‚‚‚yojkhiow}|ywyyzzxuruwulihgefjlllkjjklnnmja]]cghgly†‡ŒŠ‚wqoppx~~‡‘••••••••••“Ž…~~zsonosw†ˆˆˆˆ‰†‚oqrssvwvwwxyxxxxxxxxxxyyxyyzzzzzyyyyyzzyzzyy{{||}}|||}~~~~~~€€€€€€}wniebgoz}~}}{yzz{{{{|{{{{{zzxxw{{}„…‡†‡“–”‘Œ‹Š‰‘‘Œ‰‡………ƒƒ‚„…†……ƒ€th\X]bjs{€ƒ…†‹’‘‘‘Ž‹ˆ†ˆ‰‹ŒŒ‰ˆ††…ƒƒ‚~{yz~ƒ‚{smlnt}€……‡‡‡‡„ƒ€€~tmjljilptxyzz||||{wxxumfa_^_afihffgjmpmkgc__ahijmt{~‚…„~qppoqx~}~‰’••••••••••“Œƒ~~~yroopt{‚‡‡ˆ‰‰‰†‚opqrsuvvxxyyyyyyxxxxxxxxxxyyzzzzyyyyyzzyzzyy{{||}}|||}~~~~~~€€€€€€€€~ytojhks{~~}|{z{{{{{{||{{{{{zxxw|}ƒ„…ƒ„‰”“‘‹Š‰ˆˆ‹‹ŒŒˆ†…„„„‚‚‚„…†…†…ƒ~tf\Z]kx|}€‚„†‡ŠŽŒ‰‰‡ˆŠŒŽ‹‰‡†…ƒƒ‚~{yz~‚ƒ€wnhfgjsz„†‡‡‡…„‚€yokjljgiklquwz}}€~zywqja[XXX[aeffghilollhd`_agiilmqw|zonnnpy}~‰’••••••••••“Œƒ~~|wrppru|ƒ‡‡ˆ‰Š‰†‚noprruwvxxyyyyyyxxxxxxxxxxyyzzzzyy{{yzzyyyyy{{||}}|||}~~~~~~~~~~€€€€€€zytonpw}~}|{z{{{{{{{{{{{{{zxxy|‚‚€…’“‘Œˆ†…„†‡ˆˆˆ‡†ƒ‚‚‚‚‚„„……††‡…ƒ}tg^^jy}}€‚ƒ…†‡ŠŒŽŠŠ‡‰ˆ‰‹Š‡……ƒƒƒ‚~{yz~‚‚}rjdaceju~„†††‡……‚€vljkjiehkkkmqtxz~€}ywsmf]VUUTV\dgiklnopmmiea`cfhiiginsxxtmllmoy€~Š’••••••••••“‹‚~}vqpqsv}„†‡ˆ‰Š‰†‚nopqrtvvwwyyyyyyxxxxxxwwwwxxzzzz{{{{z{{zyyyy{{|||||||}~~}}}}~~~~€€~~€€€€||wusuz~}~}{|{{{{{{{{{{{{{{zxwz|€ƒ€||‚Š“‘Œˆ…ƒ‚ƒ……‡…„‚‚‚ƒ‚„…†…………„„|rhemx}~ƒƒ†‡ˆ‰ŒŽŒŒ‹‹Š‡ˆŠ‹ŒŠ‡„ƒƒƒ„‚~{yz~ƒznfbabbfp|‚…††‡……‚€ukikihfhmlijjlruz~{wtpjbZTQQTVZdknpqssromieb`cfghhfehmrrnkkklnx~€Š’••••••••••’Š‚~|tpqrsv}…†‡ˆ‰Š‰†‚mmopqttuvwwyyyyyyywwxxxxwwxxyyzzyyyy{{{{zz{{||{{||}}}}}}}}||}}~~~~~~€~|{z{|}|}|||{z||}}|{{|||||{{xz|€„„}{z†Ž’‘Œˆ…„‚‚ƒƒ…†ƒ‚‚‚‚‚„„†…………………ƒ€zvwz|}„„‡†ˆ‰ŽŒŒ‹Š‰Š‹‹ŒŽŽ‰‡…„ƒ‚‚‚€~zyy~uicbbbablw†††‡††„}sighiieillgfdcgkrxxsnjd^WROOSX]isxxxxwwrojdcacddefebbdhjiiiiknw~~€‹“••••••••••‘Š{sppsux€„†‡‰‰ŠŠ‡ƒ€llopqstuvwwyyyyyyywwxxxxxxxxwwxxyyzz{{{{{{{{||{{||}}}}}}}}||}}}}~~~~~~€~~~~~|~|||{z{{||||||||||{{{{|…„ƒ€}yy~ƒ‹‘‘Œ‰…„„„„„……„ƒ‚ƒƒ‚„„†……†††††„ƒ€€}~‚„…‡ˆŠ‹ŽŽŒŒ‹ŠŠ‹‹Š‹Ž‰…„…„‚‚‚€}yz~|qgedecbahr„†‡‡‡‡…‚|sighhhfjiihecaadhmnljf`[XSQRU\hu|€~}zxsqnihfeefhigedddeffffhkt{|Œ”••••••••••‘‰€~~ztrrsuz‚„†‡‰‰ŠŠ‡‚llopprstvwwyyyyyyywwxxyyyyxxwwxxyy{{{{{{{{{{||||||}}}}}}}}}}}}}}~~~~~~~~€€€€~}||{zzz{{|}}|||||{z{||}„…ƒ‚|yz~‰‘Ž‰…ƒƒƒ„„„…„„‚‚ƒƒ„„†………†††††„„…‚‚€}€ƒ„…‡ŠŒŽŽŒŠŠŠŠŠŠŒŽ‡ƒƒ„†„‚‚‚€|{~{piihhdb`dn}ƒ…†……††ƒ{skiihhfhiiifddbcbddedb`\[WWX\evƒ„‚‚|{vrponjhjkmnkigfcaccccdgqx{y~‹”••••••••••‡~||xsuusu{‚†‡‡‰Š‹‹†~oooporstvwwyyyyyyywwxxzzyyxxxxyy{{{{{{{{{{{{||}}||}}}}}}}}~~}}}}~~~~}}}}~~€€€€}~||{zzz{{||||||||{{{}}}‚……ƒ}{{}~‡ŽŠ…„„„„…„………„„„„„…†„……††‡‡ˆ†„‚ƒ~}‚ƒ…†ˆ‰‹ŽŽŒŠŠŠŠŠŠ‹ŽŒ…„…ƒ‚‚‚|~{qmlljgc`akz‚„„„ƒ…‡ƒ{qjkjgggijjjgffdfaababa`]][\]coŠ‡…„„€}~ywqsqnklorsromjfbdcccbgnuyx~Š”•••••••••”†|||xqttsu|ƒ‡ˆ‡‰ŠŒ‹…~mmnoprsuvwxyyyyyyyxxxy{{yyyyzz{{{{zz{{zzzzzz||||||||||||}}}}}}}}~~}}{{}{}}~~}|}}|{zz{{{{{{||||}}|||}{|…†ƒ}|||}‚‹Ž‹‡„„„…„……‡…………„„††…††††‰‰‡…„‚{}~‚ƒ„†ˆŠ‹Ž‘ŽŽŒŠ‰‰‰‹‹‹ŒŽŠ„~€„…ƒƒƒƒƒ‚~yrqoomkf`adr~~~}‚†ƒyojljgfhjijihggecbababcbcdbaerŠŠ‡‚€~zxuuurnnsw|{xvqlfcdcddelpsu‹••––––••••”Ž„|z{wrsstw{‚†‡†ˆŠŒ‹†‚mmnoqrsuvwyyyyyyyyxxxyzzyyyyzz{{{{{{{{{{zz{{||||||||{{{{||||}}}}}}}}{{}{||}~}|}}|{zz||{{||||||}}}|}}|}€„……}}||ˆŽŽ‡„………„……‡†………„„†‡………†‡‰‰‡…„‚|}€€ƒƒ„‡ˆ‹Ž‘ŽŽŽŠ‰ŠŠ‹‹‹ŒŽ‰ƒ|ƒ…ƒƒƒƒ‚ƒƒ€~{vtturqokc`ajsrqsx}‚wnkmlhedfghhgfedbbbbaabdgkkns•—†€€|zyzzyrrv|‚‚{ulfeeeeeimpu}Š“–––••••••”Žƒ|zzvrssuy{‚††„„ˆŒ‹‡‚€mmnopqrsvwyyyyyyyyxxxyyyyyyyzz{{{{||||{{{{||||||||||{{{{||||}}}}||}}}}}{||}~~~}|}}|{zz||{{||||||||||}}}~ƒ…†ƒ~|z}ƒ‹Ž‰†……†…††‰‡‡††……††„„„†‡‰‰‡…„‚~|~€‚„ƒ†ˆŠŒŽŽŽŒ‹‹‹ŒŒŒŒˆ‚{}‚…ƒƒƒ‚‚ƒ}ytuxwtssnd`_fmjijou||vomnmjffeefgedbcbddecaafmqty–›œ‘†‚€€}|{~xvy~„†‡…‚|skjhfeefjmr|‰”••””••••”‚|{ytrssuy}„†…†‹‹‡oonoopqrvwyyyyyyyyxxxyyyyyyyzz{{{{||}}||||||||||||||{{{{||||}}}}||}}}}}{{{}~}}}|}}|{zz||{{||||||{{||}~€€ƒ…†„|z{€‡Œ‹ˆ…††‡‰ˆˆ‡†††……‡…„„„†‡‰‰‡…„‚|~€ƒ„‡ˆ‹Ž‘ŽŒ‹‹ŒŒŒŒŒˆ„||…ƒƒƒ‚}‚}vrvyusuurg`_difeehpwxsnmlkkhhfefebaabbddgebafowz~‡”œ™†„ƒ€€~}~ƒ„‚{{|‡ˆŠˆ‡xpmjgeefjkox…Ž“””””••••“Œ‚||ysrssuz~…‡…||…‹‹‡€nonopqrswxzzyyyyyyyyyzzzyyyyzz{{||||{z{{{{||||||{{{{{{{{{|||||||}}}}{{{{||||}}}}{{}}||{{||||||||{{||||~~€„†„ƒ€}z{€†‹‹‹‰†……‡‰Šˆ††††„„……………†‡‰‰ˆ†…}}€‚‚„…ˆ‰ŒŽŽŽŽ‘‘ŒŒŒŒ‹ŒŒŠ†~{€‚ƒƒƒƒ€€€{rptvsqtxule`aeedachnsplmnmjjhhdcdcccbbddfgfcdny}‚Œ–›—‘‰„…†ƒ}}ƒ‹Œ‡~†Š‹Š‰ƒ|tqnjgefhjjt‚Š•”“”••••”‹zzwssssvz€…ˆ†{z†ŠŒ†monopqrsvwxyyyyyyyyyzzzzyyyyzz{{}}}}{z{{{{||||||{{{{{{{{{|||||||||||{{{{{{|||}||{{|||||||||||||}||}}||~~~‚……ƒ€|}„ˆˆŠˆ†……†‰Šˆ‡………„„……………†‡‰‰ˆ†…}ƒƒ……ˆŠŒŽŒŒ‘’’‘‘ŽŒŒ‹ŒŒ‹ˆ€{€‚ƒ„„ƒ€~wpostqpsxwph`acdcacchllklkkjlmmheddcbddddehlmgfjq|Š™–Žˆ„‚…†„€ƒŽ˜“„‚†Š‹ŠŠ†|wtnjhgihhq€‡Ž“““”••••“Š~yyussssv{…ˆ…{|†ŠŒ†lnnooqrsvwwxyyyyyyyyzzzzyyyyzz||~~~~}{{{{{||||||{{{{zzzz{|||||||{{{{{{{{zz|||}||{{{{||||||||||}}||}}||~~€€„…ƒ€~‚†‡ˆ‡†…„…ˆŠˆ†…„„„„„…………†‡‰‰ˆ†ƒ€€ƒ„…†‰‹ŒŽŠˆŒŽ““”“’‘Ž‹‹ŒŒ‹‰€{€‚ƒ„„ƒ{tnoqsoptxztkaaddddeeegiklkklorrnhffccddeeegmtm`[ewŠ•Œ†‚€ƒ…„ƒƒ˜ž—‘ˆ„ƒ‚…Š‹ŠŠˆƒ|xsmjijggnzƒ‹‘“”••••’ˆ|yxussrsw{‚‡‡‚|‡ŒŒ†lmnooqrsuvxyyyyyyy{{zzzzyyyyzz||~~~~}|{{{{||||||{{{{zzzz{|||||||{{{{{{{{zz|||}{{{{{{|||||||||}}}||}}||~~ƒ„ƒ‚€€ƒ…‡††…ƒƒ‡‰‡…„„„„„„…………†‡‰‰ˆ†‚€€ƒ„…†‰‹Ž‹ˆˆŒŽ“”•“’‹‹ŒŒ‹Š‚z€‚ƒ„„ƒ}yqmoppootwzvlcaddfeffdeijkjikpuuokgeeeeeeedgmuo\R]v‹’†€†ƒ€‚Š–ž š•Œ„ƒ‚…Š‹ŠŠˆƒ‚}wpmkjgglv€†Ž“”••••†{xxtssrtx|‚‡‡|ŠŒ†mnnnnpqrvxyxzzyyzz{{{{{{zz{{||}}~~}||||||||{{{{{{{{zz{{z|}}|{|||||{{{zzz{{{}}{{}}{{{{||||||}}~~~~}}}}}~€‚€ƒ„ƒƒ‚‚€€„„„…‚ƒ†††„„…„„…„„„„‡‡ˆˆ†ƒ€‚ƒ‚ƒƒ„†‰ŒŽŽ‹ˆˆŠŽ’““”“‘ŽŒ‹‹‹…€€ƒ„…„€}}vnkmoooquxyuledghiidcccfggefjnvupjfefeeccdcfkmeXJWv‹„€…†‚€ˆ•ŸŸŸ™’‰…„…ˆˆ‡‡‡…€|xtqmkgjs|‰Ž‘“••–•…{xusttsuz~…††~|„ŠŒ‡‚‚nnnnnpqruwxxzzyyzz{{{{{{{{||}}}}~~}||||||||{{||||{{{{{{z||||{|||||{yyzzz{{{{{{{{{||||||{{{{}}||~~}}}}}~€‚€€‚„„„ƒƒ€€€„ƒƒ…ƒ‚……„„„„†…„„„„†††…‚‚‚ƒƒ‚ƒƒ„ˆŠŒŽŽ‹‰‰ŠŒ’“”•”‘‘Œˆ‚ƒ„†„z~|tmjlonorvyxslffhjkmhfddefedehmrroifeeecaaa_`dd^TJUn„„‚†‰„€‡•¡£ŸŸž›•Ž‰…„‡‡††‡‡‚~{wuqniipw|ƒŠ‘••–•Ž„zxtsttsuz€†ˆ„|}†ŠŽŒ‡ƒƒnnnnnpqrtvwyyyyyzz{{{{{{{{||}}}}~~}||||||||||}}||{{{{{{z|{{z{{{{{{zyyzzz{{{zz{{{{||||||{{{{||||}}}}}}}~€‚ƒ€‚„……ƒƒƒ‚„„ƒ„ƒ„„„„„„……„„„„„„ƒ‚‚‚ƒƒ„ƒƒ„†ˆ‹ŒŽ‹‹‹‹ŒŽ’“”•”’‘ŽŽ‹…‚ƒ„†„€{{yrljlmlnqvyysmhgijlonlhhggeedfikllgggfec`_]][^^ZSPWf€„ƒ…‹‡‡•ž¢¢ŸŸžž›“Žˆ„‡‡††‰‰„~zxupliotx~…‹Ž“•””Œ€wvtsttsv{‚‡ˆ‚z€ˆŒŽŒˆ„„nnnnnpqrtvwzxxyyzz{{{{{{{{||}}}}~~}||||||||}}}}}}{{||{{z|{{z{{{{{{zyyzzz{{{{{{{||||||{{{{{{{{||~}}}}}}~€‚ƒ‚ƒ††……„ƒƒƒƒƒƒ„…‚„„„„„„……„„„„„ƒ‚‚ƒƒ„‚ƒ„†‰ŒŒŽŒ‘’“”•”““ŽŽ‘‡ƒƒ„…„€zwuqllmlknqvyyslhgilnqrrmihhgfdefgiigghfeeb`^\\\\XTWZb|Œ„ƒ†ŠŠƒ‘£¢¢ŸŸž—‹ˆ‡‡‡ˆŠ‰„€€|ywsnjmru|‚‡‘••“Œwutstttw|ƒ‡†€{‚ŠŒˆ…„oonnnpqsuvwxyyyyzzzz{{|||||||}~~~~~~}}|{{{{{||}}||||{||{{{||{{{{{{{{zzzzzzzzzzzz{{{{|||||z{{||||~}||}}}~€‚ƒ„ƒ‚…‡††…ƒƒ„„ƒ„…‡‡ƒ‚„„ƒ„……„ƒ„„„„…ƒ‚€‚‚ƒ„…ƒ„…ˆ‰ŒŽŽ‘’“”””“’Ž’Œ‡„„……wspmmoonlmntyzsmkhhlpptvtnnkhfccdcdghhihgggc\YXYYWX^_cvˆ†ƒ†‡‰‰‰–Ÿ¢¡ŸŸŸžŸžš”‹‹Š‰‡‰ˆ…‚€‚ƒzyvokortz†Œ“•’‹~wutssssx€†‡„}}…ŠŽŒ‡…ƒoonnnpqsvvwxyyyyzzzz{{{{{{|||~~~~~~~~~|{{{{{||}}||||{||{{{{{{{{{{{{{zzzzzzzzzzzz{{{{|||||z{{||||~~}}}}}~€ƒ„„„ƒ€…ˆ†††ƒ‚„…ƒ„…‡‡…„„„ƒ„……„ƒ„„„„„ƒ‚€ƒƒ„„………‡‰‹ŽŽ‘’’””””“’‘‘‘’ŽŠ†„„„‚ysnkoqpnkllrxzrmjiilprwvtqpmica``acfgkmmlmolb^][[Z[adhv…ˆ‡‹ŠŠˆ™¡ žžž  žœ™”Ž‹ˆ‡†ˆˆˆ„€‚„}|zslptsw{‚ˆŽ“”‘‹}vssqsssy†‡|‡ŠŽ‰…„oonnnpqsvvwxyyyyzzzz{{{{{{||}~~~~~~~~|{{{{{||||||||{||{{{{{zzzzzzzzzzzzzzzzzzzzzz{{{{{{{yzz{{||~~}}}}}~€ƒ„…ƒ‚€€‚‡‡‡‡„‚ƒ„………‡‡‡…„„ƒ„………„„„„„ƒ‚‚‚‚ƒ……„…‡‡‰‹‘‘’’’””••”“’‘‘‘“’‰…„„zsnnpqpmiijpwxrmihimptvutrqnjda``acdgloopqrqhcbb`^_fhkvƒŠ‹ŽŒˆ’œ¢Ÿž  žœ–‰„…†ˆˆˆ…~€ƒƒ}vmqvsuw}„‹’“‘Š}ussqssuy€…†|‚‡‹ŽŽ‹†„oonnnpqsvvwxyyyyzzzz{{zzzz||~~~~~~~~~|{{{{{||{{||||{||{{{zzzzzzzzzzzzzzzzzzzzzzyyzzzzzz{yzzzz||}}|}}}}~€ƒ„…ƒ‚‚…ˆ‰‡…‚„††…‡‡‡†„„ƒ„„„…„„„„„ƒ‚‚‚…„…„„…‡ˆ‰‘‘‘‘’’’””••”““’‘‘‘‘’Ž‹†„ƒ|rnnpqplihhnwwrmhfgnrtuuusrplgcbbbcdhlnprsttnihhebdhknw‚‹ŽŒŠ•ž¤Ÿž   žŸ”Š…„…†‰‰ˆ†}€‚‚€xptxussy‰Ž’‰|srtrssv{€„…~|ƒ‰ŽŽŽ‹†„ppoonpqtvvwxxyxxyyyy{{{{{{}}~~~}|||||{{{||||}}|}zzzyyyyyxxxxzzzzzzyyzzzzzzzzyyz{zz{z{{z{||}}}~~~}€ƒ…††…‚‚‚„‡ˆ‡ƒƒ‚…††‡‡††„ƒƒ„……†…„ƒ„„ƒ‚ƒ„……ƒ……‡Š‹Ž‘‘’’‘‘‘‘’’“”•••”””’’‘‘’ŽŽŽ‰…„|spqsrpmihgnxxrkgcgossstsqpnjedbbacdhlpqrvttspnnkjjmmpyƒŽŽŒ— ¤¡ Ÿ   Ÿ Ÿ›Œƒ‚ƒ†ˆ‰ˆ‡…zy~€~€~ysx{utrv}…Š‰zttttttx|ƒ‚|€‡Ž‹†…ppoonpqtvvwxxyxxyyyy{{{{|{}}~~~~~~~}|||}|{zz}}||}}}}z{zyyyyyxxxxxxxxyyyyzzzzzzzzzzz{{{{{{{z|||~~~~~~}€‚…‡‡†‚‚‚„„†‡„‚‚‚„†††ˆ†…„ƒƒ„…………ƒƒƒ„ƒ„……„…†‰Œ‘’‘’’‘‘‘‘’’“”••••••“’““’Ž‹‡„€{qssttppmielwwqjfcgqttsttqnliecbbacfimqrsvuusqorqprrrrz‚ŽŽ™¢¤£¡   ŸŸ ž’…€ƒ†‰‰ˆ†ƒxu{~~€zv}yvruz‚ˆŽ‡zstuttux}ƒƒ}{‚‰ŽŽ‹†…ppppnpqtvvwxxyyyyyyy{{{{{}~~~~~~~}}||}|{zz}}||}}}}||zyyyyyxxxxwwxxyyyyzzzzzzzzzzz{{{{{{{z|||~~}‚…‡‡†„„ƒƒƒ„…„ƒ‚ƒ††…‡†…„ƒƒ„……„„„ƒ„„„„…………‡ŠŽ‘’’’‘’‘‘‘‘‘’“•••••–””••’‘Ž‰…zqstuurqnhejsuoieckruvutsomkgdcbcdfjloqstwvtrqrusrsuvux‹’’›¤¦¤¢¡¡¡   ˜‡€€‚†‰Šˆ†‚vpt{~€€{y€„€xuuv~…‹Œ…ystuuuv{…|…‹ŽŽŽ‘Œ†…ppqqnpqtvvwxxyzzyy{{{{{{{~€€}}}}~~}||}|{{{}}||}}}}||zyyyyyxxxxwwxxxxyyzzzzzzzz{{{|{{{{{{z|||}}~~}‚…‡‡†……ƒ„ƒƒ„……‚€ƒ††„††…„ƒƒ„……„„ƒƒ‚ƒ‚‚…†††…†‰ŒŽ‘’‘’’‘‘‘“••••––”••”’‘‹‡{rqtuutrofekstniddnsvwvurnliecbbefhlopqsuwvsrqtxwusuxuv|†Ž‘‘•ž£¥¤£¡¡¢¡ žƒ€€€†‰‹Š‡‚ulpz€€{z‚††zwtsz„ˆ‰„xtuvvuv}‚„~|ƒˆŒŽŽ’Œ†…ppoonqruwwwwwwxzzzzzz{||}~~~~~~~|}}||||||||}}}}}{zyyyywyyxxxxxxxxyyzzyyyyz{{{{{{{||{{{{||}~~~}}~~‚…ˆˆ‡‡‡…„„ƒƒ„„ƒ‚„††…†††…„„„„„„ƒƒ„‚ƒƒ„††††…‡‰Œ‘‘‘‘‘’““••–––•••’‘ŽŠ„{srxwustpgfkrrlgcentwwvuqokjfdcdfhkpqqrruvrqoqw{zxuvvtqtŠ‘•Ÿ¤¥¥£¢¢¢¡¡š‰€€€€„‰‰Š‰„uijv~|{ƒ‰ˆxvwz€†‰‚zuvvvuw|€}}†ŠŽŽŽ‘”…ƒppoonrsuvvwwwwxyzzzzz{}}~~~€~|}}||||||||}}}}|{zyyyywxxxxxxxxxxyyyyyyyyz{{{{{{{||{{{{||}~~~~~~~…ˆˆˆ‡‡†…„ƒ‚ƒ„„„„††‡†††……„„„„„ƒƒ„‚ƒƒ†††††‡ˆŠŒ‘’““••––––••“‘‘Œ‡~wuyxvuvqhfmrqljefnuxywvrpjjgfdefiosrrrrutpljou{|wuttqmpw†˜ ¥¥¥£¢¢¢¡¡•„€€€€€‡‰Š‰…zlfp|€||„ŒŠ‚zvvx|„ˆxuvvvvx{}}‚ˆ‹ŒŽ’“†„pppppqsuuuwwwwwxyyzzz{||}~}}€|}}||||||||}}}}{zzyyyywwwxxxxxxxxyyyyyyyyyz{{{{{{||{{{{||}~~~~~„ˆˆˆ‡‡‡‡…„ƒ‚‚ƒ„†ˆˆ‡†††……„„„„„ƒ‚ƒ‚ƒ„†‡†††‡‰ŒŽŽŽŽŽ‘’““••–––––•“‘‘‘‘‘‘ŽŠzwyxxwwrkiotrmjdgpvwzzwrpiiifeehmuxvtttsrnhglsy{vsttpmmtƒŽ‘™¢¥¥¥£¢¢¢¡žŽ€€€€€€…‰Š‰…~pfm{€€}{„ŒŽ‡wsu{†vtwuuvyy|z…‰‹ŒŽ’‘‹„‚ppqqqqsuuuwwwwwxxxzzz{||}~}}€€€€€}}}||||||||}}}}{zzyyyywwwxxwwxxxxyyxxyyyyyz{{{{{{||{{{{||}~~~~~~„ˆˆˆ‰ˆˆˆ‡…„ƒ‚‚†ˆŠŠ‡††………„„„„„ƒƒƒ‚„ƒ‡††‡‡ˆ‰ŽŽŽŽŽŽ‘’““••––––––“’‘‘‘“’‘„~zyxwvwrljpsrmhehqvwzyvsnjiigfeiox|xvvurplfehqwyvsrrpnlt‚Œ‘™ ¥¥¥£¢¢¢¢›‡€€€€€€€…‰Šˆ†~qglz}{„ŒŠ‚ysuz‚}ttwvvwyxyz€†‹ŽŽ“Šƒppqqprqttuxwxxvwxx{{{||}}}}}}~~~€€|}}~~||{{||}}}}{{{zzzywxxwwvvwwwyyyxxyyzzz{{{||||{{||||}}}}~~~~~€…ˆ‰‰‰ŠŒŒŠ‡…‚€„ˆŠŠ‡†††………„‚ƒƒƒƒƒ„„††‡‡ˆˆ‰‰ŽŽŽŽ‘Ž‘‘‘’“””––––••”“’’’’“’‘„~zvwxyunmpsqmhfkuwuxxtqmjiigfekq{€|wxuromhccluxutrrqnkr€‹“™¡¥¦¥¤££  •ƒ€€€€€€…‹‹ˆ‡€shky€€~z‚Ž’Œ†~wwz|uuwuvvxwy„ŠŽŽ’•ˆzppqqprqttuvuuuvwxxyyz{|}}}}}}}}~€€|}}}}||||||}}}}{{{{zzywxxwwwwwwwyyyxxyyzz{{{{||||||||}}}}}}~~~~}ƒ†‰‰‰‹ŒŒ‹‰…‚€‚†‰‰‡‡‡‡‡‡†„‚„„„ƒ„…†‡†ˆˆ‰Š‰‹ŽŒŒŽŽŽ‘‘ŽŽ‘‘’’“””––––••”“””””“““‘‘Š„}yxzzwooprqmhflvzxyxtqmjjjiihmr|}yvuronjdbluwutssrnkq}ˆŽ”š¢¦¦¥¤¤¢¡Ÿ‚€€€€€€…‡…€rgjw€~z“ˆ‚}x|€zuuvuvvxx{ƒˆŒŽŽŽ‘Œƒysppqqrsstttutvvvwxxyyz{|}}}}}}}}}~~~~~~~~}}||||}}}}}}}}{{{{zzywxxxxxxxxwyyyxxyyzzzz{{||||||||}}}}}}~~~~}‚…‰ŠŠ‹ŒŒŒŠ‡„‚‚ƒ…‡‡‡‡‡‡‡†…‚ƒƒƒƒ„††ˆˆ‰Š‹ŒŽŽ‹ŒŽŽ‘’‘Ž‘‘‘’““””––––••–”””””””“‘‘‰‚}|}|wqpqsplhfoyzxyxuojjllkkklpx{|yvurqpkedltustsssonr|†Ž”›£¦¦¥¤¥£¢œ‰‚€€€€€€€†ŽŽ†‚}qgju~€~z€“ŽŠƒ~z}€xsuvuvwyz€†Š‹ŽŽŽŒŒ…{rorrqqrsutttvuuuvwxxyy{||}}}}}||}}~~~~}}~~}}||||}}~~}}}}{{{{zzywxxyyxxyywyyyxxyyzzyy{{||||}}||}}}}}}~~~~}~…‰‹‹‹ŒŠˆ…ƒƒƒƒ†‡‡‰ˆˆˆ††‚‚„„ƒ…††ˆ‰Š‹ŒŽŽ‹‹Ž‘‘’’Ž‘’‘’“”“”•–––••–•••••••“‘‘ˆƒ€~wsqrsokhfqzzwyyuniilkllkkoswyxxursqkfelssrttttpps|‡Ž”›¤¦¦¥¤¥¤¢—ƒ€€€€€€€‡‡zphju€€~zŒ“‹„{~€xqvvuvxy|ƒ†‰Š‹ŒŒ‰‡…}snkrrqrssttstuuvvwxyyzzz{||||}}||}~~~~~}}}}}}||{{}}}}~~}}{{{z{{yxxxyyyyzzxxyyxxxxyyyyzz{{{{{{{{{|}}}}}~~~~~€†ŠŒŒŽŽŒŠ‰†„ƒ„ƒ„„…ˆˆ‰ŠŠ‰‡††„ƒƒ…†‡‰ŠŒŽŽŽŒŒŽŽ‘’“’‘’’’““““””•–––––••••••••”’’‘‘‹†„vqqrrolhgr~}yzzuqlllonnnmlnqstuwtsrnkilqsqtutrqrsz…Ž”›¢¦¦¦¤¤¥¢‘ƒ€€€€€€‚„ŒŒ…€zqlmv~}z}Š“‹†€|€}xtvvwwx}†‰‰…‡ŠŠ‰ƒ|xpkhjrrqrsstttuuvwwwxzzzzz{||||||{|||||||}}}}}}||||}}~~~~}}{{}{{{zzyyyyzzzzyxyyxxxxyyzzzz{{{{z{{{{|}}}}}~~~~}„‹ŒŒŽŽŒŠ‰ˆ†……„ƒƒ…‡ˆ‰ŠŠŠˆ‰ˆ†„„…‡ˆˆŠŽ‘“’‘‘ŽŒŒŒŽ‘’“’’‘‘’’“”“““””•–––––•••••••••””’’’Œ‡€wrqrrolhgs€|||xsooorpppokklnpqvtsspnmlnpqtutsssswƒ‹’›¢¦§§¥¥¥ Œƒ€€€€€€‚ƒ‰Š…€yqmnv||z}Š’†‚}xuvvtty€„‰‰ƒ~‚‚~vokffimqqqrsstttuuvwwwxyyyyxyzzzzzz{{{{{{{{}}}}}}||}}~~~~~~}}||}|{{zzyyyyzzzzzyyyxxxxyyzzzz{{{{z{{{{|}}}}}~~~~}ƒŠŒŒŽŒ‰ˆˆ‡……ƒƒ„†‡ˆ‹‹Šˆˆ†…„…††‡ˆ‹““‘‘‘ŒŒŒŒŽ‘‘““’’‘’’’“””““””•–––––•••••••••””““”’‰xrqrqnkgfs€}~~zurrrtrrpokjjjklpqqqqqplloqtutuussw‚‹‘š¢¥§§¥¥¤œˆ‚€€€€€€€…‡ƒ€yqmntz~}z}‰’‘‡‚€}xuvvuuz‡Š‡~wvzyrkeccejnqqqrssttuuvvwwwxzzyywxyyyyzz{{zz{{{{}}}}}}||}}~~}}}}|z{{yyzzyyzzzz{yyyxxxxyy{{zz{{{{z{{{{|}}}}}~~~}„‰ŒŒŽ‹ŠŠˆ†…„„ƒ††ˆ‹‹Šˆ†„„„†‡‡†ˆŒ“’‘‘‘‹‹ŒŒŽ’’““’’‘‘’’’“””““••––––––•••••••••••““”“‘Šxstrpnjges‚‚~~}yuttttrrqpnkijijloppppnlloqtutttsrw‹‘™¡¥¦¦¦¦¤š†‚€€€€€€€‚ƒƒ{smnsy}}z}ˆ‘‰…‚}xuvuvv{‚ˆŠ†|tpsslfcabdjnqqrsrrttttvvwwwwyyxxwwxxyzyyzzy{zzz{||}}~~}}}~~~~}~~}}{yzzzzxxxxzzzzzzzzyyyyyyz{{{||||{|||{|}}}}~~€€~~€ƒˆŒŽ‘‘ŽŒ‹‰Š‡†„„ƒ…††ˆˆ‡†…‚ƒ„†…†…ˆŒ‘’’‘‘‘‹‹ŒŽ‘‘“””’’‘’‘“““”””•””–––––••”••••”””””””“ˆ€yuutonjgdp€ƒ}|zuttuutqsvrnlhgghknnmpnmlnrutusttv|„Š˜¡¥§§¥¥¢•…€€€€€€€€€€€}vnlqvz}y{‡‘‘Ž‹…‚€{vuuuuw}…Š‹‚wokmjgedaadhmssssssttttuuvvvvxxwwwwwwxxyyyyxzzzz{||}}}}}}}~~~~}}}|zzzzzxxyyzzzzzzzzyyyyyyz{{{||||||||{|}}}}~~~~€ƒˆŒ‘’‘‹ˆˆ††††……††ˆˆ‡†„‚„………„„‰Œ‘’“‘ŽŒ‹‹ŒŽ‘‘“”•”’‘‘’‘“““””••””––––••””••••””””””•“…~zxyzuqlheq…}|yuttrrsotyxsoigfdgkkjnmllmquuvtuwz‚‡‹—Ÿ¥§§¦¥¡’„€€€€€€€€€€€€~{rnquz|x{ˆ‘’‹…‚€yvuuuvy†Š‡}tnkljjiigfhmquuttttttttttuuuuvvwwwwwwwwxxyyxzzz{|||}}|||~}}~~~~}}}|zzzzzzzyyzzzzyyzzyyyyyyz{{{||||||||{|}}}}~~~~‚‡ŒŽ‘’’‹ˆ‡††††…†††††‡†ƒ‚„………‚ƒ‰’’‘‹Œ‹ŒŽ‘““”•”’‘‘’‘“““””••––•••••”””••••”””””““’‹‚|{{~€}vpifs‚†‚}zwuuussronv}zunjgefhhilljjknquvvwx|„ˆ‹Ž–œ£¥§§¦¢„€€€€€€€€€€€€ƒ‚yrqsy{xz‡‘Š†‚~wtuuuwz‡‡yqpnmnopqpoqvxttuuttttttttuuuuvvvvwwvvvvxxxxwyzy{{||}}||{~}}~~~~}}}}{zzzzzzzzzzzzxxzzyyyyyyz{{{||||||||{|}}}}~~~~~~‡ŒŽ‘’’‘‹ˆ††‡††…‡††……‡†ƒƒ„……„ƒƒˆŽ’‘‹Œ‹ŒŽ’““”••”‘‘’‘“““””••––••••”””“••••””””•“’‡~zz‚…„|vlgs‚†€}yvuvvttrnjt~{smideeegkkiijjottuvy~†‰ŒŽ•›¡¥¦§¦¡„€€€€€€€€€‚†‰†uqrx{y{„‹‰…ƒ‚}vsuuuvy€…„{uqprqstvvvy|~ttttttttssuuuuttvvwwwwwwwwvwwwwwyy{|||}}||||}}~~~~~}}}{{{zzzzzzzzyyyyyyzzzzzz{{{{{{{{{{z{|||}~~~~~~}}|€†‹‘‘””‘‹ˆ††‡‡‡‡‡‡‡†‡…„ƒ‚…ˆ‡†…†‰ŽŽŽŽŒŒŽ’“””–•”’’‘‘’’“””––••””••””””““••”””””“‘Œƒ{}„‡‰ˆ…ult€ƒ{xuuuwutrmio|ƒyqlhcaaeghikjjnqruwy…‰Œ”š £¦¦¦ŸŽƒ€€€€€€€‚†’Œ‚xrqwzww~„„‚|vuvuuwy€„‚xqqsvvvxz|‚ƒ…ƒttttttttttuuuuttvvvvvvuuvvwwwwwwxxz{|||||||||}|}~~}}}{{{zzzzzzzzyyyyyyzzzzzz{{{{{{{{{{z{|||}~~~~~~~~}}}…‹’’‹ˆ‡‡‡‡‰ˆˆˆˆ‡ˆ…ƒ‚…‰‡‡‡ˆ‹ŽŽŽŽŒŽŽ‘“””•––•”’‘‘’’”””••••••”””“““““””“““““’Žˆ‚€~‚†‰‹‹‹ˆ‚zz‚‚zxtstuvusngkw€ƒ~xsmd__bdehkjlnorty}‚…‰Œ’™Ÿ£¦¦¦ŸŽƒ€€€€€€€‚ƒƒƒŒ”™’‡}vruurpsxwvvvx{zuvvuuxz€ƒtpsuxxy}…ˆ‰‰‡„ttssttttttuuttttuuuuuuuuvvwxxxxxxxz{{{{{|||||}|}~~}}}{{{zzzzzzzzyyyyyyzzzzzz{{{{{{{{{{z{|||}}}}}~~~~}}~€†Œ‹ˆˆˆˆ‰ŠŠŠŠŠŠˆƒ‚‚ƒ†‰‰ˆ‡Š‹ŒŒŽŽ‘“””•––—•’‘‘’’”””””””““””“““’““““’’’’“‘Œ…€‚‡ŠŠ‹ŽŒŠ………ƒ~xtstuwvsmggp}€|wodaaabcfhikmoqs{€„†‹Œ—¢¥¦¦Ÿƒ€€€€€€€‚…„ƒ˜›”‹zttqolkmjkkkptusvvuuy{€{srtvyz}‚‡ŠŒ‰ˆ…‚ttssttttuuuussttuussssuuuuwwwwwwxxyzzz{{|||||}}}~~}}}{{{zzzzzzzzyyyyyyzzzzzz{{{{{{{{{{z{|||}}}}}~~~~}}~†ŒŠŠŠŠŠŠ‹‹‹‹‹‹ˆƒ‚…ˆ‰ŠŠ‰Š‹ŽŽ‹‹‹ŒŽ‘“””•——–”’‘‘’’”””””“““““““““’““““’’’’‘ŽŠ…€‚„‰ŒŒ‹ŽŒŠ‡ˆ†…zustvwvrlfdky€‚~zpgcc`badfhilnpt|ƒ…‡‹ŒŽ•œ¢¥¦¦ „€€€€€€€ƒ‡„ƒ˜œ”ƒ|sqqmiggceeekprrvvuuz{€ztuvwz}„‰Œ‹‡…‚€ttssrsttuuuuttuuuuttstuuuvwwvvwwxxyyzz{{{{||||}}}~~~~~~~~||{{{zyyy{{zzzzzyz{zz{{{{|z{{{{{|{{||||~~}}}}}}~}‚ˆŒŽ‹ŠˆŠŠŠŠ‹Š‰Š‰†„‚ƒ†‰‹‹‹‰‹ŒŽŒ‰‰ŠŒ‘“”–––––•“’‘‘““””•”““’’““““““‘‘‘‘‘‘‘‘‘Š…ƒ„‰ŒŽŽŽŒŒŒŠˆ†€zxyxwtqlgehq{€zsigfb``afgghjnr{…‡ŒŒ”š ¤§§¡‘„€€€€ƒ…„…”“’Š‚zrmjgecba``bhmqqstuvx~€~vuvvw}‚…‰ŒŠ…‚{ttssrsttuuuuuuuuttttstuuuwwwvvwwxxyyzz{{{{||||}}}~~~~~~~~||{{{zyzz{{{{zzz{{{{{{{|||{{{{{{|{{||||~~}}}}}}}}ƒˆ‹ŒŽŽŽ‹ŠˆŠŠŠŠŠ‰ˆ‰‡„ƒƒ„‡‰ŠŠŠŠŽ‰ˆ‹’‘“”•–––––”“‘‘““””””’’‘‘’’’’’’‘‘‘‘‘‘‘‘ˆ…„‡ŒŽŽŽŽŽ‹Šˆ…~|wsmhefkuz{tpikjebbcdefghlpx~‚…Š‹‹Ž’˜ž¤¦¦ ’„‚€‚‚‚„‡…„€zumjgedca`]]`ejmqrtuvx}}zutwy~„ˆ‹Œ‰…‚{ttssrsttuuuuuuttttsssttutvvvvvwwxxyyzz{{{{||||}}}~~~~~~||{{{zy{{{{{{zz{{{|{{|||||{{{{{{|||||||~~~~}}}}}€„‰‹ŽŠŠˆŠŠŠŠ‹Šˆˆ†ƒ‚ƒ…†‡ˆˆ‰‹ŽŽŠ‰‘’‘‘““••––——•“““““““““’‘‘‘‘‘‘‘‘‘‹ˆ…‡‹ŽŽŽŽ‹‹‰‡‡ˆ†…‚zsliginuuokjmnjhggffffghlsy~‚‡Š‹Œ‘—Ÿ£¥¤ž‘†ƒƒ‚€}}|zzyxvqpjfedccb`]\_adhnpsuuxz{wvy}†ŠŒŽŽŠˆ…‚ttssrsttuuuuuuttssrrsttutvvvvvwwxxyyzz{{{{||||}}}~€€~~~~~||{{{zyyy{{{{zz{{||||}|}}}{{{{{{|}}||||~~}}}}~€€„‰ŠŽŽŒŠŠˆŠŠŠŠŠŠˆ‡†ƒ‚„‡†‡‡ˆŠŒ‘‘ŽŒ‹ŒŽ‘’’‘‘‘““••––˜˜–”““““’’““‘‘‘‘‘‘‘‘Ž‹‡…‰ŒŽŽŽŽŽŒ‹Š‰‰‹ˆ‡‡ƒypmjikqqmjjnplmmlihffgfiouz€„‰ŠŠ•¢¤¡›…‚€~||{yyxusrqplkfffdcdb`^\``bfkoruuwz{y{€„ˆ‹ŒŽŒ‰‡…‚‚ssttstttuuuuttsssssstuuvuvvvvvvvvvxxyyyz{{{{{{{|}}~~~~~}}{z{{zzyy{{zz{{z{{{||{{{|||{{{|||}}{{||~~~~}}|~~ƒ…‰‹Ž‹‰‰‰ŠŠŠŠŠŠŠ‡…‚ƒ„…„…‡ˆ‰ŒŽ’‘ŒŒŒŽ‘’‘‘‘‘’”•••——–•““’‘‘‘’’‘‘‘Ž‹‡‡ŠŽŽŽŽŽŽŽŽŒ‹‹‹‹ŠŠ‰‰‰†~xqmopnlilprqorpmifeddhmsw}†‰‰’œ¢¡š“ˆ~~}{zzzyxvuttsqolhgeeddbcdeda``adglotvz|„‰ŽŽ‰‰‰†…ƒ‚‚ssttttttuuuuttttssssttuvvvvvvvwwwwyyyyyz{{{{{{{|}}~~~~~}}|{{{zz{{{{{{{{{{{|||||||||||{}||}}{{{{~~~~}}|~‚…‡‰‹ŽŽŽŒŠ‰‰‰ŠŠŠŠŠŠˆ„ƒ‚ƒ…†…„…ˆ‰ŒŽŒŽ‘’’‘‘‘’”•••––––”“‘‘‘ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒ‰‰ŠŽŽŽŽŽŽŽŒŒ‹‹Š‰‰Šˆ†„ƒ~{yxvsqswxyz|ztpkgddfkotx|„ˆŒ˜š–Œ†{z{yxyxyyxwuttsqolhgfdcbdceggcaaadfilqwƒ‡ˆ‹ŽŒ‹‰ˆ‡†…„ƒƒrrssttttuuuuttttssssttuvvvvvwwwwxxyyyyyz{{{{{{{|}}~~~~~}}}|||{{{{{{{{||{|||||{{||||}}{}||||{{{{~~~~}}|~ƒ…ˆ‰ŠŒŽŽ‹Š‰ŠŠŠŠŠŠŠ‰†ƒ‚„†‡†††‡ŠŒŒŽ’“’‘‘’”•••––––•“ŽŽŒŒŽŽŽŽŽŽŽŽŽŽŒŠ‰ŠŒŽŽŽŽŽŽŽ‹ŠŠŠŠ‰ˆˆ†‡…ƒƒ€}{}€€‚€zvpifddgjosx{~…‰Ž‰‚}zyxzyxyyyyzzwxvusqokihdcacefhhfeccdefimv‚‡Š‹Ž‹ŠŠ‰‡†…„ƒ„qqrrttttuuuuttuussssttuvvvvvxxxxxxxxyyyz{{{{{{{|}}~~~~~}}}}}}||||{{||}}|||}||||||||}}{}||{{{{||~~~~}}|~ƒ†‰‰ŠŒŽŽ‹Š‰‹‹ŠŠŠŠŠˆ…ƒ‚„ˆ‰ˆ‡…ˆŠŒŒŒŽŽŒŒŽ’“”“‘‘”•••••–––”’‘ŽŽŒŒŒŒŒŒŒŒŒŒŒ‹Š‰ŠŒŽŒŒŽŽŽŽŽŽ‹Š‹‹ŠŠˆˆˆ‡ˆ‡‡…†ƒ„…„†…„ƒ‚{umgdcdglotwz‚…ˆˆ„~|yxyyyzzz{z{|}{{zxusqmiidcbaefiihgcdddegku€†‹ŒŒŽŽŒ‹Š‰‡†‡…„„rrssssssttutssttssrsrsttvvwwwwwwxxyyzzz{{{||zzz|}}~~~~}}}}~~}|||||||{{}|||||||{{||}}~~|}}}||||||~~~~}|~~‚„‡‰Š‹ŒŽŒ‹ŠŠŠŠ‰‰ŠŠ‰‡ƒ‚…ŠŒŠ†…‡‰‹‹ŒŒŽŽŽŽ’“’‘’“••””–•••’ŽŒ‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŠ‰Š‹ŽŽŒ‹‹‰‰ˆˆˆˆˆˆŠ‰ˆ‰ˆ‰‹‹‰ˆ……„‚|slgcdfjkmps{~~}{xxxxyxxz|}~~€‚|xutrnkhda`cgghiihfecccgmy‚‰‹ŒŽŽŒ‹‹Š‡‡‡†„„ssssssssuuutttttssrsrsuuvvwwwwxxxxxxzzzz{{||{{{|}}~~~~}}}}}}|{{{{{{{||}|||||||{{||}}~~~~~~~~||||~~~~}|}€ƒ…ˆŠŠ‹ŒŽ‹ŠŠŠŠ‰‰‰‰ˆ„€ƒ†ŠŒ‡††ˆŠŠŒŽŽ’“’‘’“”••”–•••’Œ‹ŠŠŠŠŠŠŠ‹‹‹‹‹‹‹‹‹‹‹‹Š‰‰‹ŒŒŒŒŒŒŒŒŒŒŽŽ‹‹‰‰‰ˆˆˆˆˆˆ‰ŠŠ‰‹Œ‹ŠŠ‰ˆƒ{qieefhjjmotvttvuxxyzzz}ƒ…†„……‡ˆ…zwvuqmjgcbcfhjlljigdddegny…‰ŒŒŽŽ‹‹Šˆˆ‡‡……ttttuuuuvvutttttssrstuvwwwwwxxxxxxyyyyyy{{|||||}}}~~~~}}}}}}|{{{||||}}}|||||||||||}}~~}}}}}}||||~~~~~}}‚ƒ†ˆŠŠ‹ŒŽ‹ŠŠŠŠ‰‰‡ˆ†ƒ€ƒ…‡ŠŽ‰††‡ˆŠ‹ŽŽŽŽŽŽ’“’‘‘’“”•–••••“‘Œ‹‹Š‰‰‰‰‰‰ŠŠŠŠŠŠŠŠŠŠ‹‹Š‰ˆŠ‹‹‹‹‹‹‹‹‹‹ŒŒŽŽ‹‹ŠˆˆˆˆˆˆˆŠŠŠ‹ŽŽŽŒˆxmhfghihikmopqvvxxy{|~…‰ŽŽŠ‰‹‹†zwwuromjhgeeimnnlkhfccedfo~‡ŠŒŽŽŽŒ‹ŠŠŠ‰‰‡‡ttuuuuuuvvutuuttssrsuvvwwwvvyyyywwxxxxyy{{|||||}}}~~~~}}}}}}|{{{}}}}}}}|||||||}}||}}~~{{{{{{||||~~~~}~~‚…ˆ‰ŠŠ‹ŒŽŽ‹ŠŠŠŠ‰‰ˆ‡…ƒ€€„†‡‰ŒŠ‡†‡ˆŠ‹ŽŽŽŽŽ’“’‘’““”–••••”‘‹ŠŠŠˆˆˆˆˆˆ‰‰‰‰‰‰‰‰‰‰ŠŠŠ‰ˆ‰‹‹‹‹‹‹‹‹‹‹‹‹ŽŽ‹‰ˆˆ‰‰‰‰ŠŠ‹ŒŽŽŽŒŽŽŽŒ†{rjhggiggjjlmpuvwwy|†Œ’–™–“Š„{yxxurqqnlkecimppmkjgdddediyƒŠŒŽŽŽ‹ŠŠŠ‰‰‡‡ssttuuuuuuutttttssrtuvwwwwwwxyzzyyxxyyzz{{|||||}|~~~}}}|}}||||}}}}}}||||{{}}~~}}}}}}|{{{{{||||{{{|{}€ƒ…‡‰Š‹ŒŽŠ‰‰‰‰ŠŠˆ…ƒ~‚†‡†ˆ‹Œ‹ˆ††‡‹ŽŽŽŽŽ’’“’‘‘“”””””“‘‹Šˆ‡ˆ†‡‡‡‡ˆˆ‰‰‰‰ˆˆˆˆˆ‰Šˆˆˆˆ‰‰‰‰‰‰‰‰‰‰ŠŽŽŽŽŽŽŒŒŒŠ‰‰ˆˆ‰‰‰‰‹‹ŒŽŽŽŽŽŽ‹ƒynhihiikkhhjmptsv{€Š•˜š›˜“‘’ˆyxwxxuwwtsnihkmqqnnjiecddber‰ŽŽŽŽ‹ŠŠŠ‰‰‡‡ssttuuuuuuutttttssstuvwxxxxxxyzz{{zzzzzz{{|||||}|~~~~~}|}}||||}}}}}}||||||}~~~~~}}}}}{{{{{||||{{{|{}ƒ…‡‰‹‹ŒŽŽŒŠ‰‰‰‰‰‰ˆƒ€}„‡ˆ†‰‹ŒŒŠ‡‡ˆ‹ŒŽŽŽ’’“’‘‘“”””””“‘ŒŠˆˆˆ‡‡‡††‡‡ˆˆˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‰‰‰‰‰‰‰‰‰‰ŠŒŒŽŽŽŽŒŒŒŠŠ‰ˆˆ‰‰‰‰‹‹‹ŽŽŒ‡skjihikkfegknruy‡•––˜˜–’‘Ž‡{zz|}‚}vplllnqqpomlgdddcel|‡ŽŽ‹ŠŠŠ‰‰ˆˆuuuuuuuuuuutttttsstuvvwxxxyyxyzz{{zzzzzz{{|||||}|~~~~~}|}}||||}}}}}}||||||}~~~~~}}}}}{{{{{||||{{{|}‚„‡ˆ‰‹‹ŽŽŽŽŒŠ‰‰‰‰ˆ‡†€}}€†‡ˆ‡ˆ‰‹ŒŒ‰‡ˆŠ‹ŒŒ’’“’‘‘’“”””““‘ŒŠ‰ˆ‡†…………††‡‡‡‡ˆˆˆˆˆ‰ˆ‡‡‡‡ˆˆˆˆˆˆˆˆˆ‰Š‹‹ŒŒŽŽŽŽŒŒŒŠŠ‰ŠŠ‰‰‰‰‹‹ŠŒŽ‹‰„yplihillgeehimrv‡‘““”””’‘ˆƒ‚€ƒ„‰Šˆ„{soonpqqpppnjfddccgt„ŽŽ‹ŠŠŠ‰‰ŠŠuuuuuuuuuuutttttsstuvwwxxyyyxyzz||{{zzzz{{|||||}|~~~}|}}||||}}}}}}||||}}}~~~~~}}}}}{{{{{||||{{{|~‚†‡‰Š‹ŒŽŽŽŽ‹‰‰‰‰‰ˆ†ƒ~|~‡‰ˆˆˆ‰Š‹ŒŠˆ‰‰Š‹‰Œ’’“’‘‘’“”””““‘ŒŠ‰ˆ‡†„„„„„…††††‡‡‡‡ˆ‰ˆ‡‡‡‡ˆˆˆˆˆˆˆˆˆ‰Š‹‹ŒŒŽŽŽŽŒŒŒŠŠ‰ŠŠ‰‰ŠŠŠŠ‰ŠŽŽŽ‹Š†ulihillifeffjnrz†‹’‘Šˆˆˆˆ‰‹ŽŒ†~uoopqssqqpnjgcddbenŠŽŽ‹ŠŠŠ‰‰ŠŠvvuuvvuuvvvutssstttvwwxyzyzzzz{{||{{{{zz{{zz{{}}}}~~}~||||}}}}}}}}||||}}~~~~~}||||{{{{|||||||||}€„‡‰Š‹ŽŒŠ‰‰‰‰‡ƒ|~€„Š‹Š‰ˆŠŠ‹Œ‹‰ˆˆ‰‰‰‘‘‘‘‘‘’’“‘‘‘‘’““’‘‘‘ŽŒŒŠ‰ˆ‡†„ƒƒƒ„…††††„†ˆˆˆˆˆˆ‡†‡‡ˆ‰‰ˆ‰‰‰‰‰‰ŠŠ‹ŒŒŒŒ‹Š‰‰‰‰‰‰ˆŠ‰‹ŽŒŠˆƒyojfgjmkifceghlpvy„ˆ‰ŒŒŽŽŽŒ‹‹Ž‘Šwomruwwtqpomifeedciz†Ž‘ŽŒ‹ŠŠŠŠŠŠŠuuuuvvuuvvvutssstttvxwzz{zyyzzzz||{{{{zz{{zz{{}}}}~~}~||||}}}}}}}}}}||}}}}~~~}||||{{{{|||||||||}‚…ˆŠ‹ŒŽŒŠŠ‰‰‰‡…{z‚‡‹‹Š‰ˆ‰Š‹Œ‹‰ˆˆ‰‰ŠŽ’‘‘’““’’’‘‘‘‘‘‘“’‘‘ŽŒŒŠ‰ˆ‡†„ƒƒƒ„…††……„†‡‡‡‡‡‡†………†‡ˆˆˆˆ‰‰‰‰‰‰ŠŒŒ‹ŒŒŒŒŒ‹‹Š‰‰‰‰‰‰ˆŠŠ‹ŽŠ‰†yqhgjlmlifedcefjmqvz…‡ŠŒŒŒŒŒŽŽŽ‘‘ŽŠƒxplow|}wsponkhgfecft‹ŽŽŒ‹ŠŠŠŠŠŠŠuuuuuuuuvvvutssstttvwxzz{zyyzzzz||||{{zz{{{{||}}}}~~~}||||}}}}}}}}~~||}}}}}}}}|{||{{||}}|||||||}‚…‰‹‹ŽŒ‰Š‰‰‰†‚|zzƒ‰ŒŒŠ‰ˆ‰Š‹‰ˆˆˆŠŒ‘‘‘’““’‘’‘‘‘‘‘’’ŽŒŒŠ‰ˆˆ††…„„„…††……„†‡‡‡‡‡‡†………ƒ…‡‡‡‡ˆˆˆˆˆˆŠŒ‹‹ŒŒ‹‹Œ‹ŠŠ‰‰‰‰‰‰ˆŠ‹‹ŽŽŽ‹Š†…xniijmpomecbcdehikot}‚…‰ŠŒŒŒŽŽŽ‘‘‹…{qlmu}€|xspnliigfegnz†Œ‹ŠŠŠŠŠŠŠvvuuttuuvvvutssstttuwyzz{zzz{{{{||}}{{zz{{||}}}}}}~~}||||}}}}}}}}~~||}}||||}}|{||{{{{|||||||||}€ƒ†‰‹Œ‹Š‰‰‰ˆ„~y{}†‰‹Œ‰‰ˆ‰Š‹‰ˆˆˆ‰‹Ž‘‘‘“““‘‘‘‘‘‘‘‘‘‘ŽŒŒ‹‰ˆˆ†‡†„„ƒ…††„„„†††††††…„ƒƒƒ…‡‡‡‡‡‡‡‡ˆˆ‰‹ŠŠ‹‹‹‹Œ‹ŠŠ‰‰‰‰‰‰ˆŠ‹ŒŽ‹Š‡‡†ulhhmsrogdcccdfeeiltz„ˆŒŒŒŽŽŽ‘‘’ˆ~snos{‚{tqnmkjhfghjt€ŠŽŒ‹ŠŠŠŠŠŠŠttvuttttvvvussrrsuuvwyz{|{||}}}}}}}}||{{||}}}}~~~~~~~~~~}}}}{{||}}}}}}}}}}}|}}~~}|}|||||{|||||||{~…ˆŠ‹Ž‹Š‰‰ˆ‡‚ywy}†‰ŠŒŒŠˆˆˆŠŽŒ‰‡‡ˆ‰‹Ž’’“””’‘’‘‘‘Œ‹ˆ‡ˆ‡†††……………„„……††††††…„„‚‚„‡‡‡ˆ‡‡‡‡‡ˆ‰Š‹‹‰‹‹‹Œ‹Š‰‰‰‰‰‰‰‰ŠŠŠ‹ŽŽ‹‰‡‡†…{offhprojeecbdfcadfjqy€†Š‹Ž‘’’‘Œwonrzƒƒxplkmmkhgghoy„‹ŽŽŒ‹‰‰‰‰‰‰uuvuuuuuvvvusssssuvvwyz{||||~~||}}}}||||}}}}}}~~~~~~~~~~}}}}||||}}}}}}~~~~}||~~~}||{{{{{{|||||||{~‚…ˆŠŽŒŠ‰‰‰‡„~wx|‰‹‹‹‹Š‰ˆˆŠ‰‡‡ˆŠ‹Ž’”“””’ŽŽŽŽŒ‹‰‡ˆ‡‡‡‡…†………„„……††‡‡†††„„‚‚ƒ…†‡ˆ‡‡‡‡‡ˆ‰‰‰‰‰‹‹‹‹‹Š‰‰‰‰‰‰‰ŠŠŠŠ‹ŒŽŽŽŽŒŠˆˆ‡‡ƒxlfflprokfc`aefddbdipyˆ‹ŒŒŽ‘‘‘Œƒ{snpw†„}ullnomkghgls~‡ŽŽŒ‹‰‰‰‰‰‰wwvuvvvvvvuvttsstvwwwyz{||}}~~}}}}}}}}||}}}}}}~~~~~~~~~~}}}}||||}}}}}}~~€€}|{}~~|||{{{zz{|||||||{~ƒ…‰‹ŽŽŽŒŠ‰‰ˆ†€zxz€…‹‹Œ‹‰ˆˆ‹ŽŠˆ‰Š‹ŒŽ‘’””•”’ŽŽŽŽŽŽŽŒ‹Š‰ˆ‡ˆˆ‡††………††……†††††††„„‚‚ƒ„†‡‡‡‡‡‡ˆˆˆ‰‰‰‹‹‹‹ŠŠ‰‰‰‰‰‰‰‰‰‰‰Š‹ŒŒŒ‹ŠŠ‰‰†~sgehmrspje``dhjhdceks~†‰‹‹ŒŒŽ‘‘‘Œ†~vopw€……€wmklppojhhknw„‹ŒŒ‹‰‰‰‰‰‰vvvuvvvvvvuvuutttvwwwyz{||~~}}}}}}}}~~||}}}}}}~~~~~~~~~~}}}}}}||}}}}}}~~}|{|~~||{zzzyyz{||||||{~ƒ†ŠŒŒŠ‰Šˆƒ~xx|‚ˆŽŒŒ‹Š‰‰ŒŒ‹ˆ‰Š‹ŒŽ’””–—”’ŽŽŽŽŒ‹Š‰Šˆˆ‰ˆ‡†………††‡‡††……†††„„‚‚‚„…‡‡‡‡‡‡ˆˆˆ‰‰‰‹‹‹‹ŠŠ‰‰‰‰‰‰‰ˆˆˆˆŠ‹‹‹ŒŒ‹‰ŠŠŠŠ‡ƒxkffkournhcafjmnjffir~…ˆ‹‹Ž‘‘‘Žˆ€xqpv……‚ynklprrmiiijq~‡‹Œ‹‰‰‰‰‰‰wwwwwwwwwwvvvvuutuvwwxz{}}~|}}}}||}}||}}}}}}~~~~~~~~~~}}||}}}}|}~~~~~~~~}}||}|}|{{{zyxyzz{}}|||„‡‹ŽŽ‘Ž‹‰‰ˆ‚{wz†‹ŽŽŒŒ‹Šˆ‰‹Š‰‰‰Š‹Ž’”•—˜”’ŽŽŽŽŒŒŽŽŒŒŒ‹ŠŠŠ‰ˆ‡†††……‡‡††……††††„ƒ‚~€‚„†‡‡ˆˆ‡ˆˆˆ‰‰ŠŠ‹‹‰‰‰‰ŠŠ‰‰ˆˆˆˆˆˆ‰ŠŠŠ‹‹‹‹Š‰ŠŠŠŠŠˆ€tgdglrspjedimrtroknu}†‰‹‹ŒŒŽ‘‘‘Ž‰{uqt|ƒ†…}slkptxsliijmv€‰‹‹‹Š‰ŠŠŠŠwwxxwwwwwwvvwwuuuvwwyyz|}~~|}}}}||||||}}}}}}~~~~~~~~}}||}}}}|}~~~~~~~~}}}|}|}|{{zzyxyzz{||||}€…ˆŒŒŽ‘ŽŒŠŠŠˆ„~xw}„‰ŒŒŒ‹‹ˆ‰‹ŽŠ‰‰‰ŠŒŽ‘’”•—˜–“‘‘ŽŽŽŽŒŒŒŒ‹ŒŽŽŒŒ‹ŒŠŠ‰‰ˆ‡††……‡‡††††††‡‡…„‚ƒ†‡‡ˆˆ‡ˆˆˆ‰‰‰‰ŠŠ‰‰‰‰‰‰‰‰ˆˆˆˆˆˆˆ‰‰‰ŠŠŠŠŠŠŠŠŠŠ‹Š‡}oedfmsvqjggjqx}{xy|ƒ‡ŠŒŒŒŒŽ‘‘‘Š„~uoqz‚†„vnjntyxokjijow‡‰‰‰‰ŠŠŠŠxxxxwwwwwwvvwwvvvwyy{{{|}~~~~}}||||}}}}}}}}~~~~~~~~}}~~}}}}|}~~~~~~}}~~}||{zzzyxwxyz{||||}€…‰‹ŒŽ‘Ž‹ŠŠŠ‡€zxy€‡‹ŒŒŒ‹‹ŠŠ‹Ž‘‹‰‰‰ŠŒ‘’’”•–——”’‘‘ŽŽŽŽŒŒŒŒ‹‹Œ‹‹ŠŠ‰ˆ††‡‡‡‡††††††‡‡†„ƒ€~€‚…†‡ˆˆ‡ˆˆˆ‰‰‰‰‰‰‰‰‰‰ˆˆ‰‰ˆˆˆˆˆˆˆ‰ˆˆ‰‰‰‰ŠŠŠŠŠŠŠ‹Š…wlfdgpwvqlgjow‚ƒƒ…ˆŠŽŽŽŽ‘‘‘‘Œ‡€vppx€„ƒyqklpvzuojhghnx†ˆ‰‰ŠŠŠŠyyxxwwwwwwvvxxxxvwz{|{|}}~~}}||~~}}}}}}~~~~~~€€~~}}~~}}|}€€~~~~~~}}~~}|{zzzyyxwxyz{{{||}€…‰ŒŒ‘‘‹ŠŠŠ†~xy}‚‰ŒŒŒŒŒŒ‹Š‰Š‹ŒŽ‹‰‰‰Š‘’‘“”•——•“’‘ŽŽŽŽŒ‹‹‹ŠŠŒŽŽŽŽ‹‹Š‰‡‡‡‡‡‡††††††‡‡‡…„€}„†‡ˆˆ‡ˆˆˆ‰‰ˆˆ‰‰‰‰‰‰ˆˆ‰‰ˆˆˆˆˆˆ†‡‡‡ˆˆˆˆ‰‰ŠŠŠŠ‰‹Šˆtkfcjtyvnkknt}‚†‡‹‹Œ’’““‘ŽŒ‡xpqwƒ„€yrmkmuzxskifeiq{ƒ…ˆ‰ŠŠŠŠxxwwwuwwwwwwxxxxvwz{|}}~~~~~}}~~}|||}}~~~~~~~~~~~~~~~~~}}~~~~}}}}}}}}|{{{{yyyxxxwyzz{{||†‰‹Œ‘‘‘Œ‹Šˆƒyvz†‹ŒŒ‹‹Š‰‰ŠŠˆˆ‰Œ‘‘“”•••••“’ŽŽŽŒ‹‹ŠŠ‹ŒŽŽŽŽ‹‰‰ˆˆˆ†††††††††‡„ƒ}}‚††ˆˆˆˆ‰‰‰‰‰‰ˆˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡†‡‡‡ˆˆˆˆ‰‰‰‰‰‰ŠŠŠŠ…|ricepy{vqmjnw†‹ŒŽ‘’““’‘ŽŒˆƒwppv~‚‚€|vqoouyzwoiggeis…‰‰‰‰‹‹xxwwxvxxwwwwxxxxwxyz|~}~~~~~}}~~}|||}}~~}}~~~~~~~~~~~~~}~~~~~}}}}}}}}|{{yyxxxxxxwyzz{{||‚‡ŠŒŒ‹‰†vuz€ˆŒ‹ŽŽ‹Šˆ‡‰‹ˆ‰ŠŒ’‘‘““•”•••““ŽŽŽŒ‹‹ŠŠ‹ŒŒŒŒŽŽŽŽ‹‹‰ˆˆ†††††††††‡„ƒ~||…†ˆˆˆˆ‰‰‰‰‰‰ˆˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡‡‡‡‡ˆˆˆˆˆˆ‰‰‰‰‰‰‰‰‡ƒ}qeagu{{wpikr{„‰‹Ž‘’““’‘ŽŒ‰ƒxppu}‚‚€~xttpswzztmhfcem{„‰‰‰‰ŠŠxxxxyxxxwwwwxxyywxz{|~}~~~~~}}~~}|||}}}}}}~~~~~~~~}|}}~~~}}}}}}}}|{{xxwwxwwwvxzz{{||‚‡ŠŒŽŽŒ‹ˆ…|uv|ƒ‰ŒŒŒ‹ŽŽŒŠˆ‡ˆŽŒŠŠ‹Œ’’“““”””•–•”‘ŽŒŒŒŠŠ‹ŒŒŒŽŽŽŒŒŠˆˆˆ††††††††††„‚~z|ƒ…ˆˆˆˆ‰‰‰‰‰‰ˆˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡‡‡‡‡ˆˆˆˆ‡‡ˆˆ‰‰ˆˆˆˆ‰‡„ylaaly~{skjnu~…Š‘’“”’‘ŽŒ‰„zrpt{„|xwrruy{voieccivˆ‰‰‰‰‰xxyyxwwwwwwwxxzzxyz{|~}~~~~~}}~~}|||}}||~~€€€€~~~~~~~~}|||~~~}}}}}}}}|{{xxxxwwwwvxzz{{||‚‡‹ŽŽŽŽŒ‹‡zvx€†‹ŒŒ‹ŽŽŒŠ‰‡ˆŒŽŽ‹ŒŠ‹Œ“””“““““”––•’ŽŒŒŒŠ‹Œ‹‹‹ŒŽŽŒŒŒ‹‰‰ˆˆˆˆˆ††††††„‚z|~…ˆˆˆˆ‰‰‰‰‰‰ˆˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡‡†††‡‡‡‡††‡‡‰‰ˆˆˆˆ‰‰†rc_ft}}wmjkq{ƒ‰‹‘’“•“‘ŽŒŠ…{uosz‚„‚|{vstwzwoiebbeq~‡ˆ‰‰‰‰yyzzyxxxxxwwxxyyyyy{{|~~}€€~~}}}}}}}}}}||}~€€~~~~}}}}}}}}~~~~}|||{zzyxxwuxxwwxyxz{|ƒˆ‹ŒŽŽŽ‹†}ww{ˆŒŒŒŽŽŽ‹Šˆ‰‹‹‹Œ’“”“““””••••’‘‘‘‘ŽŒ‹‹‹Š‹ŽŽŽŒ‹Š‰‰ˆˆˆˆ††…††††††ƒ|{|‚…‡‡‰‰‰‰‰‰ˆˆˆˆˆ‰‰‰‰ŠŠ‰‰‡‡††††††††††††‡‡ˆˆˆˆ‰‰ŠŠ‰†yh]]hx|{smnnt~†‹Œ’””•’ŽŒŠ†~wqry„ƒ‚€€zwsvxwqiedbem}†ˆ‰‡ˆˆzzzzyxxxxxxxyyyyzyyz{|~~}}}}}}}}}}}}}}~~~~~}}}}}}}}~~~~}|||zzzyxxxvwwwwwwxzz{~ƒˆ‹ŒŽŽŽŒ‰ƒwty}‚ˆŒŒŒŒŽŒ‹‰Š‹Ž‘ŒŒ’“”“““““••••’‘’’’‘ŽŽŽŽ‹ŒŒŠŒŽŒŠ‹Š‰ˆˆˆˆˆ††…†‡‡‡‡†„€}{|„†‡‰‰‰‰‰‰ˆˆˆˆˆˆˆ‰‰‰‰ˆˆ‡‡††††††††††‡‡‡‡ˆˆˆˆ‰‰ŠŠŠˆ€qd\akwyztpnqy‚‡ŒŽ“–••’‘ŒŠ†€xrsx}‚ƒ€‚€{tuwwtmgebel{„ˆ‰‡ˆˆzzzzyxxxxxxxyyyyzyy{{|~~}€€~~}}}}}}}}}}}~~~~~~~}}}}}}}}~~~~|}||zyyyxxwuvvvvvwxzz{~ƒˆ‹ŒŽŽŽŽ‹†uuy„‰ŒŒŒŒŒ‹Œ‹ŠŠŒŽ‘‘Ž’“”“““““””””’‘’“’‘ŽŽŽŒŒŒŒŽŒŠŠŠ‰ˆˆˆ‡‡††…†‡‡‡‡†…‚~}€ƒ…‡‰‰‰‰‰‰ˆˆˆˆˆˆˆ‰‰ˆˆˆˆ‡‡††††††‡‡‡‡‡‡‡‡ˆˆˆˆ‰‰ŠŠŠ‰†|l^\`jr{{uont~„‹‘“•—–•“‘ŒŠ†ƒzuru{€‚‚†…yvwxwqjifejx‡ˆ†‡‡zzzzyxxxxxyyzz{{{{|{{|~~}€€€€}}}}}}}}~~}~€€}}~~~~}}}}}}}}}}}}|}||zyyxxxutvvuuuvwyz{}‚ˆ‹ŒŽŽŽŽŒŒŒ‹„{sv|‚†ŠŒŒŒ‹‹‹Œ‹‹‹Œ‘‘‘ŽŽ’“”“““’’““““‘‘“’‘ŽŽŒŒ‹ŽŠŠŠ‰ˆˆˆ††††…†‡‡‡‡‡†„‚€~~€‚…‡‰‰‰‰‰‰ˆˆˆˆˆ‡‡‰‰ˆˆ‡‡‡‡††††††ˆˆˆˆ‡‡‡‡ˆˆˆˆ‰‰ŠŠŠ‹‰scZZ`ly}wrmqz‚Š“•—˜˜–“‘ŒŠ†ƒ{urtz‚‚ƒ‡‰„}xvxwslkhehv€†‡†‡‡{{yyxxxxyyyyyyzzz||||}}}}~~}}}}}}~~}}~€~~~~~~~~~~~}}}|||||||{zywxxwuuvvuuvvxyy{}‚‡ŠŒŒ‰ŠŒˆ‚xtx~ƒ‡ŠŒŒŒ‹Š‹ŒŽŽŒ‹ŒŒ’’“‘‘’“”““’’“’““‘’’‘‘‘ŽŽŒŽŒ‹‹‰ˆŠ‰‡‡††„„……†‡††‡††„€€‚‚†ˆ‰‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡‡‡†††††††‡‡ˆˆˆˆˆˆˆˆ‰‰‰ŠŠŠ‰Š‹ˆ{g\Y[ew~ytpnu~‡“”—˜—–”’‹‡„|vqsv|‚„‡‹‰wvxvsnmiefr|…†‡††{{yyxxxxyyyyyyzz{{|}}}}}}€€~~~~~~~~~~}}€~~~~~~~}}}||||||{zzzwxxwuuvvuuuvxxy{~‚‡Š‹Œ‹‰‰‰ŠŒˆ€wv{„ˆŠŒŒŒŒ‹ŒŽŽŽŒŒŽ‘’’“’‘‘’“”“““““’““ŽŽ’’‘‘‘ŽŽŽŒŒ‹Š‰ˆˆ‡‡‡‡†„„………‡††‡††„ƒ€‚‚…ˆ‰‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡‡‡†‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‰‰‰ŠŠŠ‰ŠŠƒp_WW^mx{wropx‚ŠŽ‘•—˜˜–”’ŽŒŠˆ…~wspsy€‚‡ŒŒ…~yxvtpmjfemw‚…†……{{yyxxxxyyzz{{zz{|}}}}}}}€€}}€~~~~~~~~~}}}||||||{zzywxwvuuvvuuvwwxxz}†‰‹Œ‹‰ˆˆ‰ŠŒˆ~vx}ƒ†ˆŠ‹ŒŒŒŒ‹ŽŽŽŽŒŒŽ’‘‘’’“““““’‘’’ŽŽ’’‘‘‘‘‘ŽŽŽŽŽŒ‹‹Š‰‡††‡‡‡†„„……„†††‡††……„ƒ‚‚‚„‡ˆˆˆˆˆˆˆˆ‡‡‡‡ˆˆˆˆ‡‡‡†‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‰‰‰ŠŠŠ‰Š‹Œ‰yf[VYdu}}xsos~†‘•———–”’ŽŒ‰ˆƒysmow|~€†ŒŽŠƒ{wvuqnkgfit„„„„{{yyxxxxyyzz{{zz{|||}}}}}€€~~}}€~~~~~~~~~}}}|||||||{{zwwvuuuvvuuwwwwxz}…ˆŠ‹Š‰ˆˆ‰ŠŒˆ~vx…‡ˆŠŠ‹ŒŒŒ‹ŽŽŒŒŽ‘’‘‘‘’’’““““’‘‘’’‘‘‘ŽŽŽŒ‹ŠŠ‰‡‡‡‡‡‡†„„……„…††‡†‡…„ƒƒƒ‚‚„†‡‡ˆˆˆˆˆˆ††††ˆˆˆˆ‡‡‡†‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‰‰‰ŠŠŠ‰Š‰ŒŠl^WV`s|{voq{…“–˜——–”’‹ˆ‰ƒ€yrmptz|}†‹Ž†|wvuqnkgehq}„„……
\ No newline at end of file
diff --git a/cobalt/media/test/data/bali_640x360_RGB24.rgb b/cobalt/media/test/data/bali_640x360_RGB24.rgb
deleted file mode 100644
index 99ebd1e..0000000
--- a/cobalt/media/test/data/bali_640x360_RGB24.rgb
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bbb-320x240-2video-2audio.mp4 b/cobalt/media/test/data/bbb-320x240-2video-2audio.mp4
deleted file mode 100644
index 51abce6..0000000
--- a/cobalt/media/test/data/bbb-320x240-2video-2audio.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-a_frag-cenc-key_rotation.mp4 b/cobalt/media/test/data/bear-1280x720-a_frag-cenc-key_rotation.mp4
deleted file mode 100644
index 078ce0f..0000000
--- a/cobalt/media/test/data/bear-1280x720-a_frag-cenc-key_rotation.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-a_frag-cenc.mp4 b/cobalt/media/test/data/bear-1280x720-a_frag-cenc.mp4
deleted file mode 100644
index 69f44a9..0000000
--- a/cobalt/media/test/data/bear-1280x720-a_frag-cenc.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-a_frag-cenc_clear-all.mp4 b/cobalt/media/test/data/bear-1280x720-a_frag-cenc_clear-all.mp4
deleted file mode 100644
index 7599dfe..0000000
--- a/cobalt/media/test/data/bear-1280x720-a_frag-cenc_clear-all.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4 b/cobalt/media/test/data/bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4
deleted file mode 100644
index fb38ace..0000000
--- a/cobalt/media/test/data/bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-aac_he.ts b/cobalt/media/test/data/bear-1280x720-aac_he.ts
deleted file mode 100644
index 99afced..0000000
--- a/cobalt/media/test/data/bear-1280x720-aac_he.ts
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-av_frag-initsegment-mvhd_version_0-mvhd_duration_bits_all_set.mp4 b/cobalt/media/test/data/bear-1280x720-av_frag-initsegment-mvhd_version_0-mvhd_duration_bits_all_set.mp4
deleted file mode 100644
index acf0a68..0000000
--- a/cobalt/media/test/data/bear-1280x720-av_frag-initsegment-mvhd_version_0-mvhd_duration_bits_all_set.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-av_frag.mp4 b/cobalt/media/test/data/bear-1280x720-av_frag.mp4
deleted file mode 100644
index a05e1a0..0000000
--- a/cobalt/media/test/data/bear-1280x720-av_frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-av_with-aud-nalus_frag.mp4 b/cobalt/media/test/data/bear-1280x720-av_with-aud-nalus_frag.mp4
deleted file mode 100644
index 1fa9931..0000000
--- a/cobalt/media/test/data/bear-1280x720-av_with-aud-nalus_frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-avt_subt_frag.mp4 b/cobalt/media/test/data/bear-1280x720-avt_subt_frag.mp4
deleted file mode 100644
index d4c584d..0000000
--- a/cobalt/media/test/data/bear-1280x720-avt_subt_frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-v_frag-avc3.mp4 b/cobalt/media/test/data/bear-1280x720-v_frag-avc3.mp4
deleted file mode 100644
index 25970ac..0000000
--- a/cobalt/media/test/data/bear-1280x720-v_frag-avc3.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-v_frag-cenc-key_rotation.mp4 b/cobalt/media/test/data/bear-1280x720-v_frag-cenc-key_rotation.mp4
deleted file mode 100644
index 5c3d26f..0000000
--- a/cobalt/media/test/data/bear-1280x720-v_frag-cenc-key_rotation.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-v_frag-cenc.mp4 b/cobalt/media/test/data/bear-1280x720-v_frag-cenc.mp4
deleted file mode 100644
index 11e65c0..0000000
--- a/cobalt/media/test/data/bear-1280x720-v_frag-cenc.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-v_frag-cenc_clear-all.mp4 b/cobalt/media/test/data/bear-1280x720-v_frag-cenc_clear-all.mp4
deleted file mode 100644
index c9f2f6b..0000000
--- a/cobalt/media/test/data/bear-1280x720-v_frag-cenc_clear-all.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720-zero-stsz-entry.mp4 b/cobalt/media/test/data/bear-1280x720-zero-stsz-entry.mp4
deleted file mode 100644
index 9d38659..0000000
--- a/cobalt/media/test/data/bear-1280x720-zero-stsz-entry.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720.mp4 b/cobalt/media/test/data/bear-1280x720.mp4
deleted file mode 100644
index b424a0f..0000000
--- a/cobalt/media/test/data/bear-1280x720.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720.ts b/cobalt/media/test/data/bear-1280x720.ts
deleted file mode 100644
index 8f4fee1..0000000
--- a/cobalt/media/test/data/bear-1280x720.ts
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720.webm b/cobalt/media/test/data/bear-1280x720.webm
deleted file mode 100644
index 46f6328..0000000
--- a/cobalt/media/test/data/bear-1280x720.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-1280x720_ptswraparound.ts b/cobalt/media/test/data/bear-1280x720_ptswraparound.ts
deleted file mode 100644
index 97215c3..0000000
--- a/cobalt/media/test/data/bear-1280x720_ptswraparound.ts
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x180-hi10p-vp9.webm b/cobalt/media/test/data/bear-320x180-hi10p-vp9.webm
deleted file mode 100644
index e7a531d..0000000
--- a/cobalt/media/test/data/bear-320x180-hi10p-vp9.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x180-hi10p.mp4 b/cobalt/media/test/data/bear-320x180-hi10p.mp4
deleted file mode 100644
index 725b4ac..0000000
--- a/cobalt/media/test/data/bear-320x180-hi10p.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x180-hi12p-vp9.webm b/cobalt/media/test/data/bear-320x180-hi12p-vp9.webm
deleted file mode 100644
index 5eb54ad..0000000
--- a/cobalt/media/test/data/bear-320x180-hi12p-vp9.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-16x9-aspect-av_enc-av.webm b/cobalt/media/test/data/bear-320x240-16x9-aspect-av_enc-av.webm
deleted file mode 100644
index f285f48..0000000
--- a/cobalt/media/test/data/bear-320x240-16x9-aspect-av_enc-av.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-16x9-aspect.webm b/cobalt/media/test/data/bear-320x240-16x9-aspect.webm
deleted file mode 100644
index e29e809..0000000
--- a/cobalt/media/test/data/bear-320x240-16x9-aspect.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-P444.webm b/cobalt/media/test/data/bear-320x240-P444.webm
deleted file mode 100644
index cbf2c64..0000000
--- a/cobalt/media/test/data/bear-320x240-P444.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-altref.webm b/cobalt/media/test/data/bear-320x240-altref.webm
deleted file mode 100644
index b1db07a..0000000
--- a/cobalt/media/test/data/bear-320x240-altref.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-audio-only-48khz.webm b/cobalt/media/test/data/bear-320x240-audio-only-48khz.webm
deleted file mode 100644
index 0faa380..0000000
--- a/cobalt/media/test/data/bear-320x240-audio-only-48khz.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-audio-only.webm b/cobalt/media/test/data/bear-320x240-audio-only.webm
deleted file mode 100644
index 6594754..0000000
--- a/cobalt/media/test/data/bear-320x240-audio-only.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-av_enc-a.webm b/cobalt/media/test/data/bear-320x240-av_enc-a.webm
deleted file mode 100644
index d228e53..0000000
--- a/cobalt/media/test/data/bear-320x240-av_enc-a.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-av_enc-av.webm b/cobalt/media/test/data/bear-320x240-av_enc-av.webm
deleted file mode 100644
index e027f91..0000000
--- a/cobalt/media/test/data/bear-320x240-av_enc-av.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-av_enc-av_clear-1s.webm b/cobalt/media/test/data/bear-320x240-av_enc-av_clear-1s.webm
deleted file mode 100644
index c2cd41a..0000000
--- a/cobalt/media/test/data/bear-320x240-av_enc-av_clear-1s.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-av_enc-av_clear-all.webm b/cobalt/media/test/data/bear-320x240-av_enc-av_clear-all.webm
deleted file mode 100644
index 9610e6d..0000000
--- a/cobalt/media/test/data/bear-320x240-av_enc-av_clear-all.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-av_enc-v.webm b/cobalt/media/test/data/bear-320x240-av_enc-v.webm
deleted file mode 100644
index 0aa6c63..0000000
--- a/cobalt/media/test/data/bear-320x240-av_enc-v.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-cues-in-front.webm b/cobalt/media/test/data/bear-320x240-cues-in-front.webm
deleted file mode 100644
index d15f3b2..0000000
--- a/cobalt/media/test/data/bear-320x240-cues-in-front.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-live.webm b/cobalt/media/test/data/bear-320x240-live.webm
deleted file mode 100644
index bb75b39..0000000
--- a/cobalt/media/test/data/bear-320x240-live.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-manifest.js b/cobalt/media/test/data/bear-320x240-manifest.js
deleted file mode 100644
index 9e6602a..0000000
--- a/cobalt/media/test/data/bear-320x240-manifest.js
+++ /dev/null
@@ -1,17 +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.
-{
-  duration: 2.744000,
-  type: 'video/webm; codecs="vp8, vorbis"',
-  init: { offset: 0, size: 4370},
-  media: [
-    { offset: 4370, size: 40778, timecode: 0.000000 },
-    { offset: 45148, size: 27589, timecode: 0.396000 },
-    { offset: 72737, size: 28183, timecode: 0.779000 },
-    { offset: 100920, size: 31600, timecode: 1.197000 },
-    { offset: 132520, size: 33922, timecode: 1.589000 },
-    { offset: 166442, size: 30587, timecode: 1.987000 },
-    { offset: 197029, size: 22079, timecode: 2.400000 },
-  ]
-}
diff --git a/cobalt/media/test/data/bear-320x240-multitrack.webm b/cobalt/media/test/data/bear-320x240-multitrack.webm
deleted file mode 100644
index 987b193..0000000
--- a/cobalt/media/test/data/bear-320x240-multitrack.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-opus-a_enc-a.webm b/cobalt/media/test/data/bear-320x240-opus-a_enc-a.webm
deleted file mode 100644
index 9d20e53..0000000
--- a/cobalt/media/test/data/bear-320x240-opus-a_enc-a.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-opus-av_enc-av.webm b/cobalt/media/test/data/bear-320x240-opus-av_enc-av.webm
deleted file mode 100644
index 0e07f7a..0000000
--- a/cobalt/media/test/data/bear-320x240-opus-av_enc-av.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-opus-av_enc-v.webm b/cobalt/media/test/data/bear-320x240-opus-av_enc-v.webm
deleted file mode 100644
index 678a0a0..0000000
--- a/cobalt/media/test/data/bear-320x240-opus-av_enc-v.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-v-vp9_enc-v.webm b/cobalt/media/test/data/bear-320x240-v-vp9_enc-v.webm
deleted file mode 100644
index c8f0029..0000000
--- a/cobalt/media/test/data/bear-320x240-v-vp9_enc-v.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-v_enc-v.webm b/cobalt/media/test/data/bear-320x240-v_enc-v.webm
deleted file mode 100644
index f12f9ac..0000000
--- a/cobalt/media/test/data/bear-320x240-v_enc-v.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-v_frag-hevc.mp4 b/cobalt/media/test/data/bear-320x240-v_frag-hevc.mp4
deleted file mode 100644
index 7241372..0000000
--- a/cobalt/media/test/data/bear-320x240-v_frag-hevc.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-v_frag-vp9-cenc.mp4 b/cobalt/media/test/data/bear-320x240-v_frag-vp9-cenc.mp4
deleted file mode 100644
index b34807e..0000000
--- a/cobalt/media/test/data/bear-320x240-v_frag-vp9-cenc.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-v_frag-vp9.mp4 b/cobalt/media/test/data/bear-320x240-v_frag-vp9.mp4
deleted file mode 100644
index 241240d..0000000
--- a/cobalt/media/test/data/bear-320x240-v_frag-vp9.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240-video-only.webm b/cobalt/media/test/data/bear-320x240-video-only.webm
deleted file mode 100644
index a6601f4..0000000
--- a/cobalt/media/test/data/bear-320x240-video-only.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-320x240.webm b/cobalt/media/test/data/bear-320x240.webm
deleted file mode 100644
index a1b4150..0000000
--- a/cobalt/media/test/data/bear-320x240.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-a_frag-cenc-key_rotation.mp4 b/cobalt/media/test/data/bear-640x360-a_frag-cenc-key_rotation.mp4
deleted file mode 100644
index dc4f197..0000000
--- a/cobalt/media/test/data/bear-640x360-a_frag-cenc-key_rotation.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-a_frag-cenc.mp4 b/cobalt/media/test/data/bear-640x360-a_frag-cenc.mp4
deleted file mode 100644
index 0e249c4..0000000
--- a/cobalt/media/test/data/bear-640x360-a_frag-cenc.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-a_frag.mp4 b/cobalt/media/test/data/bear-640x360-a_frag.mp4
deleted file mode 100644
index 11431b1..0000000
--- a/cobalt/media/test/data/bear-640x360-a_frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-av_enc-av.webm b/cobalt/media/test/data/bear-640x360-av_enc-av.webm
deleted file mode 100644
index 2054ae0..0000000
--- a/cobalt/media/test/data/bear-640x360-av_enc-av.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-av_frag.mp4 b/cobalt/media/test/data/bear-640x360-av_frag.mp4
deleted file mode 100644
index e5a045a..0000000
--- a/cobalt/media/test/data/bear-640x360-av_frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-manifest.js b/cobalt/media/test/data/bear-640x360-manifest.js
deleted file mode 100644
index d7787b0..0000000
--- a/cobalt/media/test/data/bear-640x360-manifest.js
+++ /dev/null
@@ -1,16 +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.
-{
-  duration: 2.740000,
-  type: 'video/webm; codecs="vp8, vorbis"',
-  init: { offset: 0, size: 4340},
-  media: [
-    { offset: 4340, size: 50950, timecode: 0.000000},
-    { offset: 55290, size: 18785, timecode: 0.527000},
-    { offset: 74075, size: 19810, timecode: 1.014000},
-    { offset: 93885, size: 21706, timecode: 1.522000},
-    { offset: 115591, size: 20249, timecode: 2.016000},
-    { offset: 135840, size: 9946, timecode: 2.515000},
-  ]
-}
diff --git a/cobalt/media/test/data/bear-640x360-non_square_pixel-with_pasp.mp4 b/cobalt/media/test/data/bear-640x360-non_square_pixel-with_pasp.mp4
deleted file mode 100644
index f3f328c..0000000
--- a/cobalt/media/test/data/bear-640x360-non_square_pixel-with_pasp.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-non_square_pixel-without_pasp.mp4 b/cobalt/media/test/data/bear-640x360-non_square_pixel-without_pasp.mp4
deleted file mode 100644
index f8bbaaf..0000000
--- a/cobalt/media/test/data/bear-640x360-non_square_pixel-without_pasp.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-v_frag-cenc-key_rotation.mp4 b/cobalt/media/test/data/bear-640x360-v_frag-cenc-key_rotation.mp4
deleted file mode 100644
index 916c64e..0000000
--- a/cobalt/media/test/data/bear-640x360-v_frag-cenc-key_rotation.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-v_frag-cenc-senc.mp4 b/cobalt/media/test/data/bear-640x360-v_frag-cenc-senc.mp4
deleted file mode 100644
index 0576198..0000000
--- a/cobalt/media/test/data/bear-640x360-v_frag-cenc-senc.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-v_frag-cenc.mp4 b/cobalt/media/test/data/bear-640x360-v_frag-cenc.mp4
deleted file mode 100644
index 1b63dd4..0000000
--- a/cobalt/media/test/data/bear-640x360-v_frag-cenc.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360-v_frag.mp4 b/cobalt/media/test/data/bear-640x360-v_frag.mp4
deleted file mode 100644
index f1d30fb..0000000
--- a/cobalt/media/test/data/bear-640x360-v_frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-640x360.webm b/cobalt/media/test/data/bear-640x360.webm
deleted file mode 100644
index 02ae36c..0000000
--- a/cobalt/media/test/data/bear-640x360.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-a_enc-a.webm b/cobalt/media/test/data/bear-a_enc-a.webm
deleted file mode 100644
index 4d87b8e..0000000
--- a/cobalt/media/test/data/bear-a_enc-a.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-ac3-only-frag.mp4 b/cobalt/media/test/data/bear-ac3-only-frag.mp4
deleted file mode 100644
index 669c407..0000000
--- a/cobalt/media/test/data/bear-ac3-only-frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-audio-10s-CBR-has-TOC.mp3 b/cobalt/media/test/data/bear-audio-10s-CBR-has-TOC.mp3
deleted file mode 100644
index a370e46..0000000
--- a/cobalt/media/test/data/bear-audio-10s-CBR-has-TOC.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-audio-10s-CBR-no-TOC.mp3 b/cobalt/media/test/data/bear-audio-10s-CBR-no-TOC.mp3
deleted file mode 100644
index ce972d8..0000000
--- a/cobalt/media/test/data/bear-audio-10s-CBR-no-TOC.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-audio-10s-VBR-has-TOC.mp3 b/cobalt/media/test/data/bear-audio-10s-VBR-has-TOC.mp3
deleted file mode 100644
index cc8ec75..0000000
--- a/cobalt/media/test/data/bear-audio-10s-VBR-has-TOC.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-audio-10s-VBR-no-TOC.mp3 b/cobalt/media/test/data/bear-audio-10s-VBR-no-TOC.mp3
deleted file mode 100644
index c3ea60a..0000000
--- a/cobalt/media/test/data/bear-audio-10s-VBR-no-TOC.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-audio-implicit-he-aac-v1.aac b/cobalt/media/test/data/bear-audio-implicit-he-aac-v1.aac
deleted file mode 100644
index 91ccdf3..0000000
--- a/cobalt/media/test/data/bear-audio-implicit-he-aac-v1.aac
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-audio-implicit-he-aac-v2.aac b/cobalt/media/test/data/bear-audio-implicit-he-aac-v2.aac
deleted file mode 100644
index bf155c1..0000000
--- a/cobalt/media/test/data/bear-audio-implicit-he-aac-v2.aac
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-audio-lc-aac.aac b/cobalt/media/test/data/bear-audio-lc-aac.aac
deleted file mode 100644
index 78467e9..0000000
--- a/cobalt/media/test/data/bear-audio-lc-aac.aac
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-audio-main-aac.aac b/cobalt/media/test/data/bear-audio-main-aac.aac
deleted file mode 100644
index 19883f7..0000000
--- a/cobalt/media/test/data/bear-audio-main-aac.aac
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-eac3-only-frag.mp4 b/cobalt/media/test/data/bear-eac3-only-frag.mp4
deleted file mode 100644
index 1530fd1..0000000
--- a/cobalt/media/test/data/bear-eac3-only-frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-hevc-frag.mp4 b/cobalt/media/test/data/bear-hevc-frag.mp4
deleted file mode 100644
index 1b85aba..0000000
--- a/cobalt/media/test/data/bear-hevc-frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-mpeg2-aac-only_frag.mp4 b/cobalt/media/test/data/bear-mpeg2-aac-only_frag.mp4
deleted file mode 100644
index 6ce731c..0000000
--- a/cobalt/media/test/data/bear-mpeg2-aac-only_frag.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-opus-end-trimming.webm b/cobalt/media/test/data/bear-opus-end-trimming.webm
deleted file mode 100644
index c198148..0000000
--- a/cobalt/media/test/data/bear-opus-end-trimming.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-opus.ogg b/cobalt/media/test/data/bear-opus.ogg
deleted file mode 100644
index b14bf54..0000000
--- a/cobalt/media/test/data/bear-opus.ogg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-opus.webm b/cobalt/media/test/data/bear-opus.webm
deleted file mode 100644
index c198148..0000000
--- a/cobalt/media/test/data/bear-opus.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp8-webvtt.webm b/cobalt/media/test/data/bear-vp8-webvtt.webm
deleted file mode 100644
index c4b4d14..0000000
--- a/cobalt/media/test/data/bear-vp8-webvtt.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp8a-odd-dimensions.webm b/cobalt/media/test/data/bear-vp8a-odd-dimensions.webm
deleted file mode 100644
index fd3ab6db..0000000
--- a/cobalt/media/test/data/bear-vp8a-odd-dimensions.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp8a.webm b/cobalt/media/test/data/bear-vp8a.webm
deleted file mode 100644
index 7d06257..0000000
--- a/cobalt/media/test/data/bear-vp8a.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp9-blockgroup.webm b/cobalt/media/test/data/bear-vp9-blockgroup.webm
deleted file mode 100644
index ecffa7d..0000000
--- a/cobalt/media/test/data/bear-vp9-blockgroup.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp9-bt709.webm b/cobalt/media/test/data/bear-vp9-bt709.webm
deleted file mode 100644
index 23f9548..0000000
--- a/cobalt/media/test/data/bear-vp9-bt709.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp9-odd-dimensions.webm b/cobalt/media/test/data/bear-vp9-odd-dimensions.webm
deleted file mode 100644
index 4d65a90..0000000
--- a/cobalt/media/test/data/bear-vp9-odd-dimensions.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp9-opus.webm b/cobalt/media/test/data/bear-vp9-opus.webm
deleted file mode 100644
index 80355cf..0000000
--- a/cobalt/media/test/data/bear-vp9-opus.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp9.ivf b/cobalt/media/test/data/bear-vp9.ivf
deleted file mode 100644
index c350eac..0000000
--- a/cobalt/media/test/data/bear-vp9.ivf
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp9.ivf.context b/cobalt/media/test/data/bear-vp9.ivf.context
deleted file mode 100644
index 9ab97db..0000000
--- a/cobalt/media/test/data/bear-vp9.ivf.context
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp9.webm b/cobalt/media/test/data/bear-vp9.webm
deleted file mode 100644
index 4f497ae..0000000
--- a/cobalt/media/test/data/bear-vp9.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp9a-odd-dimensions.webm b/cobalt/media/test/data/bear-vp9a-odd-dimensions.webm
deleted file mode 100644
index d427f56..0000000
--- a/cobalt/media/test/data/bear-vp9a-odd-dimensions.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear-vp9a.webm b/cobalt/media/test/data/bear-vp9a.webm
deleted file mode 100644
index f098687..0000000
--- a/cobalt/media/test/data/bear-vp9a.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.ac3 b/cobalt/media/test/data/bear.ac3
deleted file mode 100644
index eaf2882..0000000
--- a/cobalt/media/test/data/bear.ac3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.adts b/cobalt/media/test/data/bear.adts
deleted file mode 100644
index 268d521..0000000
--- a/cobalt/media/test/data/bear.adts
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.aiff b/cobalt/media/test/data/bear.aiff
deleted file mode 100644
index b8d2553..0000000
--- a/cobalt/media/test/data/bear.aiff
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.asf b/cobalt/media/test/data/bear.asf
deleted file mode 100644
index 1b967f7..0000000
--- a/cobalt/media/test/data/bear.asf
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.avi b/cobalt/media/test/data/bear.avi
deleted file mode 100644
index 864cf0c..0000000
--- a/cobalt/media/test/data/bear.avi
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.eac3 b/cobalt/media/test/data/bear.eac3
deleted file mode 100644
index 6161b15..0000000
--- a/cobalt/media/test/data/bear.eac3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.flac b/cobalt/media/test/data/bear.flac
deleted file mode 100644
index 1db13f9..0000000
--- a/cobalt/media/test/data/bear.flac
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.flv b/cobalt/media/test/data/bear.flv
deleted file mode 100644
index 85c6596..0000000
--- a/cobalt/media/test/data/bear.flv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.h261 b/cobalt/media/test/data/bear.h261
deleted file mode 100644
index c201363..0000000
--- a/cobalt/media/test/data/bear.h261
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.h263 b/cobalt/media/test/data/bear.h263
deleted file mode 100644
index e625bad..0000000
--- a/cobalt/media/test/data/bear.h263
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.h264 b/cobalt/media/test/data/bear.h264
deleted file mode 100644
index b0baa69..0000000
--- a/cobalt/media/test/data/bear.h264
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.h264.md5 b/cobalt/media/test/data/bear.h264.md5
deleted file mode 100644
index c5cc404..0000000
--- a/cobalt/media/test/data/bear.h264.md5
+++ /dev/null
@@ -1,7 +0,0 @@
-# --test_video_data="bear.h264:320:180:30:32:35:150:1"
-# Intel - Ivy Bridge
-1460776de36c2eab426a619fde19cf87
-# Intel - Sandy Bridge
-6451d1c35d0e3240882dcbd7831a446e
-# ARM - Exynos
-a25c9c8bd498c6be6bfee5c4127b1608
diff --git a/cobalt/media/test/data/bear.hevc b/cobalt/media/test/data/bear.hevc
deleted file mode 100644
index f2a0545..0000000
--- a/cobalt/media/test/data/bear.hevc
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.m2ts b/cobalt/media/test/data/bear.m2ts
deleted file mode 100644
index 4508dc4..0000000
--- a/cobalt/media/test/data/bear.m2ts
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.m3u8 b/cobalt/media/test/data/bear.m3u8
deleted file mode 100644
index d758d55..0000000
--- a/cobalt/media/test/data/bear.m3u8
+++ /dev/null
@@ -1,7 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:1
-#EXT-X-MEDIA-SEQUENCE:0
-#EXTINF:0.934267,
-bear0.ts
-#EXT-X-ENDLIST
diff --git a/cobalt/media/test/data/bear.mjpeg b/cobalt/media/test/data/bear.mjpeg
deleted file mode 100644
index 1a4ad2d..0000000
--- a/cobalt/media/test/data/bear.mjpeg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.mp4 b/cobalt/media/test/data/bear.mp4
deleted file mode 100644
index 3763b59..0000000
--- a/cobalt/media/test/data/bear.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.mpeg b/cobalt/media/test/data/bear.mpeg
deleted file mode 100644
index 4e51b5a..0000000
--- a/cobalt/media/test/data/bear.mpeg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.ogv b/cobalt/media/test/data/bear.ogv
deleted file mode 100644
index b2e1134..0000000
--- a/cobalt/media/test/data/bear.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.rm b/cobalt/media/test/data/bear.rm
deleted file mode 100644
index 894a150..0000000
--- a/cobalt/media/test/data/bear.rm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.swf b/cobalt/media/test/data/bear.swf
deleted file mode 100644
index f36cb36..0000000
--- a/cobalt/media/test/data/bear.swf
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear.webm b/cobalt/media/test/data/bear.webm
deleted file mode 100644
index 422df3f..0000000
--- a/cobalt/media/test/data/bear.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear0.ts b/cobalt/media/test/data/bear0.ts
deleted file mode 100644
index 8b44b67..0000000
--- a/cobalt/media/test/data/bear0.ts
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_192kHz.wav b/cobalt/media/test/data/bear_192kHz.wav
deleted file mode 100644
index 20cbb4a..0000000
--- a/cobalt/media/test/data/bear_192kHz.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_320x192_40frames.yuv b/cobalt/media/test/data/bear_320x192_40frames.yuv
deleted file mode 100644
index a2718a8..0000000
--- a/cobalt/media/test/data/bear_320x192_40frames.yuv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_3kHz.wav b/cobalt/media/test/data/bear_3kHz.wav
deleted file mode 100644
index d8d798b..0000000
--- a/cobalt/media/test/data/bear_3kHz.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_adts_in_private_stream_1.ts b/cobalt/media/test/data/bear_adts_in_private_stream_1.ts
deleted file mode 100644
index ffe0f4c..0000000
--- a/cobalt/media/test/data/bear_adts_in_private_stream_1.ts
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_alaw.wav b/cobalt/media/test/data/bear_alaw.wav
deleted file mode 100644
index ef0d3dc..0000000
--- a/cobalt/media/test/data/bear_alaw.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_audio_longer_than_video.ogv b/cobalt/media/test/data/bear_audio_longer_than_video.ogv
deleted file mode 100644
index bb75b19..0000000
--- a/cobalt/media/test/data/bear_audio_longer_than_video.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_audio_shorter_than_video.ogv b/cobalt/media/test/data/bear_audio_shorter_than_video.ogv
deleted file mode 100644
index 66e9cc9..0000000
--- a/cobalt/media/test/data/bear_audio_shorter_than_video.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_divx_mp3.avi b/cobalt/media/test/data/bear_divx_mp3.avi
deleted file mode 100644
index c6e1a31..0000000
--- a/cobalt/media/test/data/bear_divx_mp3.avi
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_gsm_ms.wav b/cobalt/media/test/data/bear_gsm_ms.wav
deleted file mode 100644
index 138e90b..0000000
--- a/cobalt/media/test/data/bear_gsm_ms.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_h264_aac.3gp b/cobalt/media/test/data/bear_h264_aac.3gp
deleted file mode 100644
index 761166b..0000000
--- a/cobalt/media/test/data/bear_h264_aac.3gp
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_mpeg4_amrnb.3gp b/cobalt/media/test/data/bear_mpeg4_amrnb.3gp
deleted file mode 100644
index ced825c..0000000
--- a/cobalt/media/test/data/bear_mpeg4_amrnb.3gp
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_mpeg4_mp3.avi b/cobalt/media/test/data/bear_mpeg4_mp3.avi
deleted file mode 100644
index 5c5be3d..0000000
--- a/cobalt/media/test/data/bear_mpeg4_mp3.avi
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_mpeg4asp_mp3.avi b/cobalt/media/test/data/bear_mpeg4asp_mp3.avi
deleted file mode 100644
index 3131e2d..0000000
--- a/cobalt/media/test/data/bear_mpeg4asp_mp3.avi
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_mulaw.wav b/cobalt/media/test/data/bear_mulaw.wav
deleted file mode 100644
index 3fd3607..0000000
--- a/cobalt/media/test/data/bear_mulaw.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_pcm.wav b/cobalt/media/test/data/bear_pcm.wav
deleted file mode 100644
index 1870eed..0000000
--- a/cobalt/media/test/data/bear_pcm.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_pcm_s16be.mov b/cobalt/media/test/data/bear_pcm_s16be.mov
deleted file mode 100644
index 7076dd8..0000000
--- a/cobalt/media/test/data/bear_pcm_s16be.mov
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_pcm_s24be.mov b/cobalt/media/test/data/bear_pcm_s24be.mov
deleted file mode 100644
index b82be8d..0000000
--- a/cobalt/media/test/data/bear_pcm_s24be.mov
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_rotate_0.mp4 b/cobalt/media/test/data/bear_rotate_0.mp4
deleted file mode 100644
index e3fb262..0000000
--- a/cobalt/media/test/data/bear_rotate_0.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_rotate_180.mp4 b/cobalt/media/test/data/bear_rotate_180.mp4
deleted file mode 100644
index ec16d2a..0000000
--- a/cobalt/media/test/data/bear_rotate_180.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_rotate_270.mp4 b/cobalt/media/test/data/bear_rotate_270.mp4
deleted file mode 100644
index 8b585b3..0000000
--- a/cobalt/media/test/data/bear_rotate_270.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_rotate_90.mp4 b/cobalt/media/test/data/bear_rotate_90.mp4
deleted file mode 100644
index c921654..0000000
--- a/cobalt/media/test/data/bear_rotate_90.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_silent.mp4 b/cobalt/media/test/data/bear_silent.mp4
deleted file mode 100644
index aaf0a9f..0000000
--- a/cobalt/media/test/data/bear_silent.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_silent.ogv b/cobalt/media/test/data/bear_silent.ogv
deleted file mode 100644
index 9233318..0000000
--- a/cobalt/media/test/data/bear_silent.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/bear_silent.webm b/cobalt/media/test/data/bear_silent.webm
deleted file mode 100644
index 85bf7d8..0000000
--- a/cobalt/media/test/data/bear_silent.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite.html b/cobalt/media/test/data/blackwhite.html
deleted file mode 100644
index 735e4ad..0000000
--- a/cobalt/media/test/data/blackwhite.html
+++ /dev/null
@@ -1,234 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <style>
-      body {
-        color: white;
-        background-color: black;
-      }
-    </style>
-  </head>
-  <body onload="main()">
-    <div id="buttons"></div>
-    <table>
-      <tr>
-        <td>Image</td>
-        <td id="video_header"></td>
-        <td>Absolute Diff</td>
-        <td>Different Pixels</td>
-      </tr>
-      <tr>
-        <td><img src="blackwhite.png"></div>
-        <td><video autoplay></video></div>
-        <td><canvas id="diff"></canvas></td>
-        <td><canvas id="mask"></canvas></td>
-      </tr>
-    </div>
-
-    <p id="result"></p>
-
-    <script>
-      function log(str) {
-        document.getElementById('result').textContent = str;
-        console.log(str);
-      }
-
-      function loadVideo(name) {
-        var videoElem = document.querySelector('video');
-        videoElem.src = 'blackwhite_' + name;
-
-        document.getElementById('video_header').textContent = name;
-        videoElem.addEventListener('ended', onVideoEnded);
-      }
-
-      function onVideoEnded(e) {
-        document.title = verifyVideo() ? 'ENDED' : 'FAILED';
-      }
-
-      function onVideoError(e) {
-        document.title = 'ERROR';
-        document.getElementById('diff').style.visibility = 'hidden';
-        document.getElementById('mask').style.visibility = 'hidden';
-        log('Error playing video: ' + e.target.error.code + '.');
-      }
-
-      function main() {
-        // Programatically create buttons for each clip for manual testing.
-        var buttonsElem = document.getElementById('buttons');
-
-        function createButton(name) {
-          var buttonElem = document.createElement('button');
-          buttonElem.textContent = name;
-          buttonElem.addEventListener('click', function() {
-            loadVideo(name);
-          });
-          buttonsElem.appendChild(buttonElem);
-        }
-
-        var VIDEOS = [
-          'yuv420p.ogv',
-          'yuv422p.ogv',
-          'yuv444p.ogv',
-          'yuv420p.webm',
-          'yuv444p.webm',
-          'yuv420p.mp4',
-          'yuv420p_rec709.mp4',
-          'yuvj420p.mp4',
-          'yuv422p.mp4',
-          'yuv444p.mp4',
-          'yuv420p.avi'
-        ];
-
-        for (var i = 0; i < VIDEOS.length; ++i) {
-          createButton(VIDEOS[i]);
-        }
-
-        // Video event handlers.
-        var videoElem = document.querySelector('video');
-        videoElem.addEventListener('error', onVideoError);
-
-        // Check if a query parameter was provided for automated tests.
-        if (window.location.search.length > 1) {
-          loadVideo(window.location.search.substr(1));
-        } else {
-          // If we're not an automated test, compute some pretty diffs.
-          document.querySelector('video').addEventListener('ended',
-                                                           computeDiffs);
-        }
-      }
-
-      function getCanvasPixels(canvas) {
-        try {
-          return canvas.getContext('2d')
-              .getImageData(0, 0, canvas.width, canvas.height)
-              .data;
-        } catch(e) {
-          var message = 'ERROR: ' + e;
-          if (e.name == 'SecurityError') {
-            message += ' Couldn\'t get image pixels, try running with ' +
-                       '--allow-file-access-from-files.';
-          }
-          log(message);
-        }
-      }
-
-      function verifyVideo() {
-        var videoElem = document.querySelector('video');
-        var offscreen = document.createElement('canvas');
-        offscreen.width = videoElem.videoWidth;
-        offscreen.height = videoElem.videoHeight;
-        offscreen.getContext('2d').drawImage(videoElem, 0, 0, offscreen.width,
-                                             offscreen.height);
-
-        videoData = getCanvasPixels(offscreen);
-        if (!videoData)
-          return false;
-
-        // Check the color of a givel pixel |x,y| in |imgData| against an
-        // expected value, |expected|, with up to |allowedError| difference.
-        function checkColor(imgData, x, y, stride, expected, allowedError) {
-          for (var i = 0; i < 3; ++i) {
-            var actual = imgData[(x + y * stride) * 4 + i];
-            if (Math.abs(actual - expected) > allowedError) {
-              log('Color didn\'t match at (' + x + ', ' + y + '). Expected: ' +
-                  expected + ', actual: ' + actual);
-              return false;
-            }
-          }
-          return true;
-        }
-
-        // Check one pixel in each quadrant (in the upper left, away from
-        // boundaries and the text, to avoid compression artifacts).
-        // Also allow a small error, for the same reason.
-
-        // TODO(mtomasz): Once code.google.com/p/libyuv/issues/detail?id=324 is
-        // fixed, the allowedError should be decreased to 1.
-        var allowedError = 2;
-
-        return checkColor(videoData, 30, 30, videoElem.videoWidth, 0xff,
-                          allowedError) &&
-               checkColor(videoData, 150, 30, videoElem.videoWidth, 0x00,
-                          allowedError) &&
-               checkColor(videoData, 30, 150, videoElem.videoWidth, 0x10,
-                          allowedError) &&
-               checkColor(videoData, 150, 150, videoElem.videoWidth, 0xef,
-                          allowedError);
-      }
-
-      // Compute a standard diff image, plus a high-contrast mask that shows
-      // each differing pixel more visibly.
-      function computeDiffs() {
-        var diffElem = document.getElementById('diff');
-        var maskElem = document.getElementById('mask');
-        var videoElem = document.querySelector('video');
-        var imgElem = document.querySelector('img');
-
-        var width = imgElem.width;
-        var height = imgElem.height;
-
-        if (videoElem.videoWidth != width || videoElem.videoHeight != height) {
-          log('ERROR: video dimensions don\'t match reference image ' +
-              'dimensions');
-          return;
-        }
-
-        // Make an offscreen canvas to dump reference image pixels into.
-        var offscreen = document.createElement('canvas');
-        offscreen.width = width;
-        offscreen.height = height;
-
-        offscreen.getContext('2d').drawImage(imgElem, 0, 0, width, height);
-        imgData = getCanvasPixels(offscreen);
-        if (!imgData)
-          return;
-
-        // Scale and clear diff canvases.
-        diffElem.width = maskElem.width = width;
-        diffElem.height = maskElem.height = height;
-        var diffCtx = diffElem.getContext('2d');
-        var maskCtx = maskElem.getContext('2d');
-        maskCtx.clearRect(0, 0, width, height);
-        diffCtx.clearRect(0, 0, width, height);
-
-        // Copy video pixels into diff.
-        diffCtx.drawImage(videoElem, 0, 0, width, height);
-
-        var diffIData = diffCtx.getImageData(0, 0, width, height);
-        var diffData = diffIData.data;
-        var maskIData = maskCtx.getImageData(0, 0, width, height);
-        var maskData = maskIData.data;
-
-        // Make diffs and collect stats.
-        var meanSquaredError = 0;
-        for (var i = 0; i < imgData.length; i += 4) {
-          var difference = 0;
-          for (var j = 0; j < 3; ++j) {
-            diffData[i + j] = Math.abs(diffData[i + j] - imgData[i + j]);
-            meanSquaredError += diffData[i + j] * diffData[i + j];
-            if (diffData[i + j] != 0) {
-              difference += diffData[i + j];
-            }
-          }
-          if (difference > 0) {
-            if (difference <= 3) {
-              // If we're only off by a bit per channel or so, use darker red.
-              maskData[i] = 128;
-            } else {
-              // Bright red to indicate a different pixel.
-              maskData[i] = 255;
-            }
-            maskData[i+3] = 255;
-          }
-        }
-
-        meanSquaredError /= width * height;
-        log('Mean squared error: ' + meanSquaredError);
-        diffCtx.putImageData(diffIData, 0, 0);
-        maskCtx.putImageData(maskIData, 0, 0);
-        document.getElementById('diff').style.visibility = 'visible';
-        document.getElementById('mask').style.visibility = 'visible';
-      }
-    </script>
-  </body>
-</html>
diff --git a/cobalt/media/test/data/blackwhite.png b/cobalt/media/test/data/blackwhite.png
deleted file mode 100644
index e7d08ac..0000000
--- a/cobalt/media/test/data/blackwhite.png
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv420p.avi b/cobalt/media/test/data/blackwhite_yuv420p.avi
deleted file mode 100644
index 14c6f8b..0000000
--- a/cobalt/media/test/data/blackwhite_yuv420p.avi
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv420p.mp4 b/cobalt/media/test/data/blackwhite_yuv420p.mp4
deleted file mode 100644
index aa6a49d..0000000
--- a/cobalt/media/test/data/blackwhite_yuv420p.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv420p.ogv b/cobalt/media/test/data/blackwhite_yuv420p.ogv
deleted file mode 100644
index e2fae13..0000000
--- a/cobalt/media/test/data/blackwhite_yuv420p.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv420p.webm b/cobalt/media/test/data/blackwhite_yuv420p.webm
deleted file mode 100644
index 9713cbb..0000000
--- a/cobalt/media/test/data/blackwhite_yuv420p.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv420p_hi10p.mp4 b/cobalt/media/test/data/blackwhite_yuv420p_hi10p.mp4
deleted file mode 100644
index c23aabb..0000000
--- a/cobalt/media/test/data/blackwhite_yuv420p_hi10p.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv420p_rec709.mp4 b/cobalt/media/test/data/blackwhite_yuv420p_rec709.mp4
deleted file mode 100644
index 46ff822..0000000
--- a/cobalt/media/test/data/blackwhite_yuv420p_rec709.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv422p.mp4 b/cobalt/media/test/data/blackwhite_yuv422p.mp4
deleted file mode 100644
index 5804d28..0000000
--- a/cobalt/media/test/data/blackwhite_yuv422p.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv422p.ogv b/cobalt/media/test/data/blackwhite_yuv422p.ogv
deleted file mode 100644
index 73a4eac..0000000
--- a/cobalt/media/test/data/blackwhite_yuv422p.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv444p.mp4 b/cobalt/media/test/data/blackwhite_yuv444p.mp4
deleted file mode 100644
index 28dfb5b..0000000
--- a/cobalt/media/test/data/blackwhite_yuv444p.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv444p.ogv b/cobalt/media/test/data/blackwhite_yuv444p.ogv
deleted file mode 100644
index ba8ee17..0000000
--- a/cobalt/media/test/data/blackwhite_yuv444p.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuv444p.webm b/cobalt/media/test/data/blackwhite_yuv444p.webm
deleted file mode 100644
index 12f3c16..0000000
--- a/cobalt/media/test/data/blackwhite_yuv444p.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blackwhite_yuvj420p.mp4 b/cobalt/media/test/data/blackwhite_yuvj420p.mp4
deleted file mode 100644
index c250d6c..0000000
--- a/cobalt/media/test/data/blackwhite_yuvj420p.mp4
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/blank-1x1.jpg b/cobalt/media/test/data/blank-1x1.jpg
deleted file mode 100644
index 57314c7..0000000
--- a/cobalt/media/test/data/blank-1x1.jpg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/butterfly-853x480.webm b/cobalt/media/test/data/butterfly-853x480.webm
deleted file mode 100644
index cf77916..0000000
--- a/cobalt/media/test/data/butterfly-853x480.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/colour.webm b/cobalt/media/test/data/colour.webm
deleted file mode 100644
index 580cb50..0000000
--- a/cobalt/media/test/data/colour.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/corrupt.mp3 b/cobalt/media/test/data/corrupt.mp3
deleted file mode 100644
index a056cb8..0000000
--- a/cobalt/media/test/data/corrupt.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/double-bear.ogv b/cobalt/media/test/data/double-bear.ogv
deleted file mode 100644
index 2acc2f7..0000000
--- a/cobalt/media/test/data/double-bear.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/double-sfx.ogg b/cobalt/media/test/data/double-sfx.ogg
deleted file mode 100644
index 0712166..0000000
--- a/cobalt/media/test/data/double-sfx.ogg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/eme_player.html b/cobalt/media/test/data/eme_player.html
deleted file mode 100644
index 3e84538..0000000
--- a/cobalt/media/test/data/eme_player.html
+++ /dev/null
@@ -1,158 +0,0 @@
-<!DOCTYPE html>
-<html lang='en-US'>
-  <head>
-    <title>EME playback test application</title>
-  </head>
-  <body style='font-family:"Lucida Console", Monaco, monospace; font-size:14px' onload="start()">
-    <i>Clearkey works only with content encrypted using bear key.</i><br><br>
-    <table>
-    <tr title='URL param mediaFile=...'>
-      <td><label for='mediaFile'>Encrypted video URL:</label></td>
-      <td><input id='mediaFile' type='text' size='64'></td>
-    </tr>
-    <tr title='URL param licenseServerURL=...'>
-      <td><label for='licenseServer'>License sever URL:</label></td>
-      <td><input id='licenseServer' type='text' size='64'></td>
-    </tr>
-    <tr title='URL param keySystem=...'>
-      <td><label for='keySystemList'>Key system:</label></td>
-      <td><select id='keySystemList'></select></td>
-    </tr>
-    <tr title='URL param mediaType=...'>
-      <td><label for='mediaTypeList'>Media type:</label></td>
-      <td><select id='mediaTypeList'></select></td>
-    </tr>
-    <tr title='URL param useMSE=1|0'>
-      <td><label for='useMSE'>Load media by:</label></td>
-      <td>
-        <select id='useMSE'>
-          <option value='true' selected='selected'>MSE</option>
-          <option value='false'>src</option>
-        </select>
-      </td>
-    </tr>
-    </table>
-    <br>
-    <button onclick='start();'>Play</button>
-    <br><br>
-    Decoded fps: <span id='decodedFPS'></span>
-    <br>
-    Dropped fps: <span id='droppedFPS'></span>
-    <br>
-    Total dropped frames: <span id='droppedFrames'></span>
-    <br><br>
-    <table>
-    <tr>
-      <td valign='top'><span id='video'></span></td>
-      <td valign='top'>
-        <label for='logs' onclick="toggleDisplay('logs');"><i>Click to toggle logs visibility (newest at top).</i><br></label>
-        <div id='logs' style='overflow: auto; height: 480px; width: 480px; white-space: nowrap; display: none'></div>
-      </td>
-    </tr>
-    </table>
-    <div></div>
-  </body>
-  <script src='eme_player_js/app_loader.js' type='text/javascript'></script>
-  <script type='text/javascript'>
-    var testConfig;
-    var emeApp;
-    var player;
-    var heartbeatCount = 0;
-
-    function initApp() {
-      testConfig = new TestConfig();
-      testConfig.loadQueryParams();
-      // Update document with test configuration values.
-      emeApp = new EMEApp(testConfig);
-      setInterval(function () {
-                      Utils.timeLog('heartbeat #' + ++heartbeatCount);
-                  }, 1000);
-    }
-
-    function onTimeUpdate(e) {
-      var video = e.target;
-      Utils.timeLog('timeupdate @ ' + video.currentTime);
-      if (video.currentTime < 1)
-        return;
-
-      // Renewal message may be fired around the start of playback; check for it
-      // after a delay to avoid timing issues.
-      if (testConfig.keySystem == EXTERNAL_CLEARKEY_RENEWAL &&
-          !video.receivedRenewalMessage) {
-        Utils.failTest('license-renewal message not received.');
-      }
-
-      Utils.timeLog('waiting for video to end.');
-      video.removeEventListener('ended', Utils.failTest);
-      Utils.installTitleEventHandler(video, 'ended');
-      video.removeEventListener('timeupdate', onTimeUpdate);
-    }
-
-    function onFirstPlayEnded(e) {
-      Utils.timeLog('First play ended.');
-      var video = e.target;
-      video.removeEventListener('ended', onFirstPlayEnded);
-      video.removeEventListener('abort', Utils.failTest);
-
-      // Reset src (to same video again).
-      PlayerUtils.setVideoSource(player);
-
-      // Play the video a second time.
-      Utils.timeLog('Playing second time.');
-      play(video, false);
-    }
-
-    function onLogEvent(e) {
-      Utils.timeLog('Event: ' + e.type);
-    }
-
-    function onVisibilityChange(e) {
-      Utils.timeLog('Event: ' + e.type + ', hidden: ' + document.hidden);
-    }
-
-    function play(video, playTwice) {
-      Utils.timeLog('Starting play, hidden: ' + document.hidden);
-      video.addEventListener('canplay', onLogEvent);
-      video.addEventListener('load', onLogEvent);
-      video.addEventListener('playing', onLogEvent);
-      video.addEventListener('play', onLogEvent);
-      video.addEventListener('canplaythrough', onLogEvent);
-      video.addEventListener('stalled', onLogEvent);
-      video.addEventListener('waiting', onLogEvent);
-      document.addEventListener('visibilitychange', onVisibilityChange);
-      Utils.resetTitleChange();
-      if (playTwice) {
-        // Wait for the first play to complete.
-        video.addEventListener('ended', onFirstPlayEnded);
-        video.play();
-        return;
-      }
-      // Ended should not fire before onTimeUpdate.
-      video.addEventListener('ended', Utils.failTest);
-      video.addEventListener('timeupdate', onTimeUpdate);
-      video.play();
-    }
-
-    function toggleDisplay(id) {
-      var element = document.getElementById(id);
-      if (!element)
-        return;
-      if (element.style['display'] != 'none')
-        element.style['display'] = 'none';
-      else
-        element.style['display'] = '';
-    }
-
-    function start() {
-      initApp();  
-      emeApp.createPlayer()
-          .then(function(p) {
-              player = p;
-              play(player.video, testConfig.playTwice);
-          }).catch(function(error) {
-              Utils.timeLog(error);
-              Utils.failTest('Unable to play video.');
-          });
-    }
-  </script>
-</html>
diff --git a/cobalt/media/test/data/eme_player_js/app_loader.js b/cobalt/media/test/data/eme_player_js/app_loader.js
deleted file mode 100644
index 790679c..0000000
--- a/cobalt/media/test/data/eme_player_js/app_loader.js
+++ /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.
-
-// Adds a Javascript source tag to the document.
-function addScriptTag(src) {
-  document.write(
-      '<script type="text/javascript" src="eme_player_js/' + src +
-      '"></script>');
-}
-
-// Load all the dependencies for the app.
-addScriptTag('globals.js');
-addScriptTag('utils.js');
-addScriptTag('test_config.js');
-addScriptTag('fps_observer.js');
-addScriptTag('media_source_utils.js');
-addScriptTag('player_utils.js');
-addScriptTag('clearkey_player.js');
-addScriptTag('widevine_player.js');
-addScriptTag('unit_test_player.js');
-addScriptTag('eme_app.js');
diff --git a/cobalt/media/test/data/eme_player_js/clearkey_player.js b/cobalt/media/test/data/eme_player_js/clearkey_player.js
deleted file mode 100644
index 369a6ab..0000000
--- a/cobalt/media/test/data/eme_player_js/clearkey_player.js
+++ /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.
-
-// ClearKeyPlayer responsible for playing media using Clear Key key system.
-function ClearKeyPlayer(video, testConfig) {
-  this.video = video;
-  this.testConfig = testConfig;
-}
-
-ClearKeyPlayer.prototype.init = function() {
-  // Returns a promise.
-  return PlayerUtils.initEMEPlayer(this);
-};
-
-ClearKeyPlayer.prototype.registerEventListeners = function() {
-  // Returns a promise.
-  return PlayerUtils.registerEMEEventListeners(this);
-};
-
-ClearKeyPlayer.prototype.onMessage = function(message) {
-  Utils.timeLog('MediaKeySession onMessage', message);
-  var keyId = Utils.extractFirstLicenseKeyId(message.message);
-  var key = Utils.getDefaultKey(this.testConfig.forceInvalidResponse);
-  var jwkSet = Utils.createJWKData(keyId, key);
-  Utils.timeLog('Calling update: ' + String.fromCharCode.apply(null, jwkSet));
-  message.target.update(jwkSet).catch(function(error) {
-    // Ignore the error if a crash is expected. This ensures that the decoder
-    // actually detects and reports the error.
-    if (this.testConfig.keySystem != 'org.chromium.externalclearkey.crash') {
-      Utils.failTest(error, EME_UPDATE_FAILED);
-    }
-  });
-};
diff --git a/cobalt/media/test/data/eme_player_js/eme_app.js b/cobalt/media/test/data/eme_player_js/eme_app.js
deleted file mode 100644
index f60b643..0000000
--- a/cobalt/media/test/data/eme_player_js/eme_app.js
+++ /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.
-
-// EMEApp is responsible for starting playback on the eme_player.html page.
-// It selects the suitable player based on key system and other test options.
-function EMEApp(testConfig) {
-  this.video_ = null;
-  this.testConfig_ = testConfig;
-  this.updateDocument(testConfig);
-}
-
-EMEApp.prototype.createPlayer = function() {
-  // Load document test configuration.
-  this.updateTestConfig();
-  if (this.video_) {
-    Utils.timeLog('Delete old video tag.');
-    this.video_.pause();
-    this.video_.remove();
-    delete(this.video_);
-  }
-
-  this.video_ = document.createElement('video');
-  this.video_.controls = true;
-  this.video_.preload = true;
-  this.video_.width = 848;
-  this.video_.height = 480;
-  var videoSpan = document.getElementById(VIDEO_ELEMENT_ID);
-  if (videoSpan)
-    videoSpan.appendChild(this.video_);
-  else
-    document.body.appendChild(this.video_);
-
-  var videoPlayer = PlayerUtils.createPlayer(this.video_, this.testConfig_);
-  if (!videoPlayer) {
-    Utils.timeLog('Cannot create a media player.');
-    return Promise.reject('Cannot create a media player.');
-  }
-
-  Utils.timeLog('Using ' + videoPlayer.constructor.name);
-  if (this.testConfig_.runFPS)
-    FPSObserver.observe(this.video_);
-
-  return videoPlayer.init().then(function(result) {
-    if (result != videoPlayer) {
-      Utils.timeLog('Media player mismatch.');
-    }
-    Utils.timeLog('Media player created.');
-    return videoPlayer;
-  });
-};
-
-EMEApp.prototype.updateDocument = function(testConfig) {
-  // Update document lists with test configuration values.
-  Utils.addOptions(KEYSYSTEM_ELEMENT_ID, KEY_SYSTEMS);
-  Utils.addOptions(MEDIA_TYPE_ELEMENT_ID, MEDIA_TYPES);
-  document.getElementById(MEDIA_FILE_ELEMENT_ID).value =
-      testConfig.mediaFile || DEFAULT_MEDIA_FILE;
-  document.getElementById(LICENSE_SERVER_ELEMENT_ID).value =
-      testConfig.licenseServerURL || DEFAULT_LICENSE_SERVER;
-  if (testConfig.keySystem)
-    Utils.ensureOptionInList(KEYSYSTEM_ELEMENT_ID, testConfig.keySystem);
-  if (testConfig.mediaType)
-    Utils.ensureOptionInList(MEDIA_TYPE_ELEMENT_ID, testConfig.mediaType);
-  document.getElementById(USE_MSE_ELEMENT_ID).value = testConfig.useMSE;
-};
-
-EMEApp.prototype.updateTestConfig = function() {
-  // Reload test configuration from document.
-  this.testConfig_.mediaFile =
-      document.getElementById(MEDIA_FILE_ELEMENT_ID).value;
-  this.testConfig_.keySystem =
-      document.getElementById(KEYSYSTEM_ELEMENT_ID).value;
-  this.testConfig_.mediaType =
-      document.getElementById(MEDIA_TYPE_ELEMENT_ID).value;
-  this.testConfig_.useMSE =
-      document.getElementById(USE_MSE_ELEMENT_ID).value == 'true';
-  this.testConfig_.licenseServerURL =
-      document.getElementById(LICENSE_SERVER_ELEMENT_ID).value;
-};
diff --git a/cobalt/media/test/data/eme_player_js/fps_observer.js b/cobalt/media/test/data/eme_player_js/fps_observer.js
deleted file mode 100644
index 8226df8..0000000
--- a/cobalt/media/test/data/eme_player_js/fps_observer.js
+++ /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.
-
-// FPSObserver observes a <video> and reports decoded FPS, dropped FPS, and
-// total dropped frames during the video playback.
-var FPSObserver = new function() {
-  this.video_ = null;
-  this.decodedFrames_ = 0;
-  this.droppedFrames_ = 0;
-  this.startTime_ = 0;
-  this.intID_ = null;
-}
-
-FPSObserver.observe = function(video) {
-  this.video_ = video;
-  var observer = this;
-  this.video_.addEventListener('playing', function() {
-    observer.onVideoPlaying();
-  });
-
-  this.video_.addEventListener('error', function() {
-    observer.endTest();
-  });
-
-  this.video_.addEventListener('ended', function() {
-    observer.endTest();
-  });
-};
-
-FPSObserver.onVideoPlaying = function() {
-  this.decodedFrames_ = 0;
-  this.droppedFrames_ = 0;
-  this.startTime_ = window.performance.now();
-  this.endTest(true);
-  var observer = this;
-  this.intID_ = window.setInterval(function() {
-      observer.calculateStats();}, 1000);
-};
-
-FPSObserver.calculateStats = function() {
-  if (this.video_.readyState <= HTMLMediaElement.HAVE_CURRENT_DATA ||
-      this.video_.paused || this.video_.ended)
-    return;
-  var currentTime = window.performance.now();
-  var deltaTime = (currentTime - this.startTime_) / 1000;
-  this.startTime_ = currentTime;
-
-  // Calculate decoded frames per sec.
-  var fps = (this.video_.webkitDecodedFrameCount - this.decodedFrames_) /
-             deltaTime;
-  this.decodedFrames_ = this.video_.webkitDecodedFrameCount;
-  fps = fps.toFixed(2);
-  decodedFPSElement.innerHTML = fps;
-
-  // Calculate dropped frames per sec.
-  fps = (this.video_.webkitDroppedFrameCount - this.droppedFrames_) / deltaTime;
-  this.droppedFrames_ = this.video_.webkitDroppedFrameCount;
-  fps = fps.toFixed(2);
-  droppedFPSElement.innerHTML = fps;
-
-  droppedFramesElement.innerHTML = this.droppedFrames_;
-};
-
-FPSObserver.endTest = function() {
-  window.clearInterval(this.intID_);
-};
diff --git a/cobalt/media/test/data/eme_player_js/globals.js b/cobalt/media/test/data/eme_player_js/globals.js
deleted file mode 100644
index 0b4c0bc..0000000
--- a/cobalt/media/test/data/eme_player_js/globals.js
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2014 The Chromium 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 global constant variables used by the application.
-
-// Renewal message header. External Clear Key implementation returns this as
-// part of renewal messages.
-var EME_RENEWAL_MESSAGE_HEADER = 'RENEWAL';
-
-// Default key used to encrypt many media files used in browser tests.
-var KEY = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
-                          0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
-
-var DEFAULT_LICENSE_SERVER = document.location.origin + '/license_server';
-
-var DEFAULT_MEDIA_FILE = 'http://shadi.kir/alcatraz/Chrome_44-enc_av.webm';
-
-// Key ID used for init data.
-var KEY_ID = '0123456789012345';
-
-// Unique strings to identify test result expectations.
-var UNIT_TEST_SUCCESS = 'UNIT_TEST_SUCCESS';
-var NOTSUPPORTEDERROR = 'NOTSUPPORTEDERROR';
-var EME_GENERATEREQUEST_FAILED = 'EME_GENERATEREQUEST_FAILED';
-var EME_SESSION_NOT_FOUND = 'EME_SESSION_NOT_FOUND';
-var EME_LOAD_FAILED = 'EME_LOAD_FAILED';
-var EME_UPDATE_FAILED = 'EME_UPDATE_FAILED';
-var EME_ERROR_EVENT = 'EME_ERROR_EVENT';
-var EME_MESSAGE_UNEXPECTED_TYPE = 'EME_MESSAGE_UNEXPECTED_TYPE';
-var EME_RENEWAL_MISSING_HEADER = 'EME_RENEWAL_MISSING_HEADER';
-
-// Headers used when running some specific unittests in the external CDM.
-var UNIT_TEST_RESULT_HEADER = 'UNIT_TEST_RESULT';
-
-// Available EME key systems to use.
-var WIDEVINE_KEYSYSTEM = 'com.widevine.alpha';
-var CLEARKEY = 'org.w3.clearkey';
-var EXTERNAL_CLEARKEY = 'org.chromium.externalclearkey';
-var EXTERNAL_CLEARKEY_RENEWAL = 'org.chromium.externalclearkey.renewal';
-var FILE_IO_TEST_KEYSYSTEM = 'org.chromium.externalclearkey.fileiotest';
-var OUTPUT_PROTECTION_TEST_KEYSYSTEM =
-    'org.chromium.externalclearkey.outputprotectiontest';
-
-// Key system name:value map to show on the document page.
-var KEY_SYSTEMS = {
-  'Widevine': WIDEVINE_KEYSYSTEM,
-  'Clearkey': CLEARKEY,
-  'External Clearkey': EXTERNAL_CLEARKEY
-};
-
-// General WebM and MP4 name:content_type map to show on the document page.
-var MEDIA_TYPES = {
-  'WebM - Audio Video': 'video/webm; codecs="vorbis, vp8"',
-  'WebM - Video Only': 'video/webm; codecs="vp8"',
-  'WebM - Audio Only': 'video/webm; codecs="vorbis"',
-  'MP4 - Video Only': 'video/mp4; codecs="avc1.4D000C"',
-  'MP4 - Audio Only': 'audio/mp4; codecs="mp4a.40.2"'
-};
-
-// Global document elements ID's.
-var VIDEO_ELEMENT_ID = 'video';
-var MEDIA_FILE_ELEMENT_ID = 'mediaFile';
-var LICENSE_SERVER_ELEMENT_ID = 'licenseServer';
-var KEYSYSTEM_ELEMENT_ID = 'keySystemList';
-var MEDIA_TYPE_ELEMENT_ID = 'mediaTypeList';
-var USE_MSE_ELEMENT_ID = 'useMSE';
-var USE_PLAY_TWICE_ELEMENT_ID = 'playTwice';
-
-// These variables get updated every second, so better to have global pointers.
-var decodedFPSElement = document.getElementById('decodedFPS');
-var droppedFPSElement = document.getElementById('droppedFPS');
-var droppedFramesElement = document.getElementById('droppedFrames');
-var docLogs = document.getElementById('logs');
diff --git a/cobalt/media/test/data/eme_player_js/media_source_utils.js b/cobalt/media/test/data/eme_player_js/media_source_utils.js
deleted file mode 100644
index 8888582..0000000
--- a/cobalt/media/test/data/eme_player_js/media_source_utils.js
+++ /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.
-
-// MediaSourceUtils provides basic functionality to load content using MSE API.
-var MediaSourceUtils = new function() {
-}
-
-MediaSourceUtils.loadMediaSourceFromTestConfig = function(testConfig,
-                                                          appendCallbackFn) {
-  return this.loadMediaSource(testConfig.mediaFile,
-                              testConfig.mediaType,
-                              appendCallbackFn);
-};
-
-MediaSourceUtils.loadMediaSource = function(mediaFiles,
-                                            mediaTypes,
-                                            appendCallbackFn) {
-  if (!mediaFiles || !mediaTypes)
-    Utils.failTest('Missing parameters in loadMediaSource().');
-
-  var mediaFiles = Utils.convertToArray(mediaFiles);
-  var mediaTypes = Utils.convertToArray(mediaTypes);
-  var totalAppended = 0;
-  function onSourceOpen(e) {
-    Utils.timeLog('onSourceOpen', e);
-    // We can load multiple media files using the same media type. However, if
-    // more than one media type is used, we expect to have a media type entry
-    // for each corresponding media file.
-    var srcBuffer = null;
-    for (var i = 0; i < mediaFiles.length; i++) {
-      if (i == 0 || mediaFiles.length == mediaTypes.length) {
-        Utils.timeLog('Creating a source buffer for type ' + mediaTypes[i]);
-        try {
-          srcBuffer = mediaSource.addSourceBuffer(mediaTypes[i]);
-        } catch (e) {
-          Utils.failTest('Exception adding source buffer: ' + e.message);
-          return;
-        }
-      }
-      doAppend(mediaFiles[i], srcBuffer);
-    }
-  }
-
-  function doAppend(mediaFile, srcBuffer) {
-    var xhr = new XMLHttpRequest();
-    xhr.open('GET', mediaFile);
-    xhr.responseType = 'arraybuffer';
-    xhr.addEventListener('load', function(e) {
-      var onUpdateEnd = function(e) {
-        Utils.timeLog('End of appending buffer from ' + mediaFile);
-        srcBuffer.removeEventListener('updateend', onUpdateEnd);
-        totalAppended++;
-        if (totalAppended == mediaFiles.length) {
-          if (appendCallbackFn)
-            appendCallbackFn(mediaSource);
-          else
-            mediaSource.endOfStream();
-        }
-      };
-      srcBuffer.addEventListener('updateend', onUpdateEnd);
-      srcBuffer.appendBuffer(new Uint8Array(e.target.response));
-    });
-    xhr.send();
-  }
-
-  var mediaSource = new MediaSource();
-  mediaSource.addEventListener('sourceopen', onSourceOpen);
-  return mediaSource;
-};
diff --git a/cobalt/media/test/data/eme_player_js/player_utils.js b/cobalt/media/test/data/eme_player_js/player_utils.js
deleted file mode 100644
index 1cffaaf..0000000
--- a/cobalt/media/test/data/eme_player_js/player_utils.js
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2014 The Chromium 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 PlayerUtils provides utility functions to binding common media events
-// to specific player functions. It also provides functions to load media source
-// base on test configurations.
-var PlayerUtils = new function() {
-}
-
-// Prepares a video element for playback by setting default event handlers
-// and source attribute.
-PlayerUtils.registerDefaultEventListeners = function(player) {
-  Utils.timeLog('Registering video event handlers.');
-  // Map from event name to event listener function name.  It is common for
-  // event listeners to be named onEventName.
-  var eventListenerMap = {
-    'encrypted': 'onEncrypted',
-  };
-  for (eventName in eventListenerMap) {
-    var eventListenerFunction = player[eventListenerMap[eventName]];
-    if (eventListenerFunction) {
-      player.video.addEventListener(eventName, function(e) {
-        player[eventListenerMap[e.type]](e);
-      });
-    }
-  }
-
-  player.video.addEventListener('error', function(error) {
-    // This most likely happens on pipeline failures (e.g. when the CDM
-    // crashes).
-    Utils.timeLog('onHTMLElementError', error);
-    Utils.failTest(error);
-  });
-};
-
-// Register the necessary event handlers needed when playing encrypted content.
-// Returns a promise that resolves to the player.
-PlayerUtils.registerEMEEventListeners = function(player) {
-  player.video.addEventListener('encrypted', function(message) {
-
-    function addMediaKeySessionListeners(mediaKeySession) {
-      mediaKeySession.addEventListener('message', function(message) {
-        player.video.receivedKeyMessage = true;
-        if (Utils.isRenewalMessage(message)) {
-          Utils.timeLog('MediaKeySession onMessage - renewal', message);
-          player.video.receivedRenewalMessage = true;
-        } else {
-          if (message.messageType != 'license-request') {
-            Utils.failTest('Unexpected message type "' + message.messageType +
-                               '" received.',
-                           EME_MESSAGE_UNEXPECTED_TYPE);
-          }
-        }
-        player.onMessage(message);
-      });
-    }
-
-    try {
-      if (player.testConfig.sessionToLoad) {
-        Utils.timeLog('Loading session: ' + player.testConfig.sessionToLoad);
-        var session =
-            message.target.mediaKeys.createSession('persistent-license');
-        addMediaKeySessionListeners(session);
-        session.load(player.testConfig.sessionToLoad)
-            .then(
-                function(result) {
-                  if (!result)
-                    Utils.failTest('Session not found.', EME_SESSION_NOT_FOUND);
-                },
-                function(error) { Utils.failTest(error, EME_LOAD_FAILED); });
-      } else {
-        Utils.timeLog('Creating new media key session for initDataType: ' +
-                      message.initDataType + ', initData: ' +
-                      Utils.getHexString(new Uint8Array(message.initData)));
-        var session = message.target.mediaKeys.createSession();
-        addMediaKeySessionListeners(session);
-        session.generateRequest(message.initDataType, message.initData)
-            .catch(function(error) {
-              // Ignore the error if a crash is expected. This ensures that
-              // the decoder actually detects and reports the error.
-              if (this.testConfig.keySystem !=
-                  'org.chromium.externalclearkey.crash') {
-                Utils.failTest(error, EME_GENERATEREQUEST_FAILED);
-              }
-            });
-      }
-    } catch (e) {
-      Utils.failTest(e);
-    }
-  });
-
-  this.registerDefaultEventListeners(player);
-  player.video.receivedKeyMessage = false;
-  Utils.timeLog('Setting video media keys: ' + player.testConfig.keySystem);
-
-  var config = {
-    audioCapabilities: [],
-    videoCapabilities: [],
-    persistentState: 'optional',
-    sessionTypes: ['temporary'],
-  };
-
-  // requestMediaKeySystemAccess() requires at least one of 'audioCapabilities'
-  // or 'videoCapabilities' to be specified. It also requires only codecs
-  // specific to the capability, so unlike MSE cannot have both audio and
-  // video codecs in the contentType.
-  if (player.testConfig.mediaType == 'video/webm; codecs="vp8"' ||
-      player.testConfig.mediaType == 'video/webm; codecs="vp9"' ||
-      player.testConfig.mediaType == 'video/mp4; codecs="avc1.4D000C"') {
-    // Video only.
-    config.videoCapabilities = [{contentType: player.testConfig.mediaType}];
-  } else if (
-      player.testConfig.mediaType == 'audio/webm; codecs="vorbis"' ||
-      player.testConfig.mediaType == 'audio/webm; codecs="opus"' ||
-      player.testConfig.mediaType == 'audio/mp4; codecs="mp4a.40.2"') {
-    // Audio only.
-    config.audioCapabilities = [{contentType: player.testConfig.mediaType}];
-  } else if (
-      player.testConfig.mediaType == 'video/webm; codecs="vorbis, vp8"') {
-    // Both audio and video codecs specified.
-    config.audioCapabilities = [{contentType: 'audio/webm; codecs="vorbis"'}];
-    config.videoCapabilities = [{contentType: 'video/webm; codecs="vp8"'}];
-  } else if (player.testConfig.mediaType == 'video/webm; codecs="opus, vp9"') {
-    // Both audio and video codecs specified.
-    config.audioCapabilities = [{contentType: 'audio/webm; codecs="opus"'}];
-    config.videoCapabilities = [{contentType: 'video/webm; codecs="vp9"'}];
-  } else {
-    // Some tests (e.g. mse_different_containers.html) specify audio and
-    // video codecs separately.
-    if (player.testConfig.videoFormat == 'ENCRYPTED_MP4' ||
-        player.testConfig.videoFormat == 'CLEAR_MP4') {
-      config.videoCapabilities =
-          [{contentType: 'video/mp4; codecs="avc1.4D000C"'}];
-    } else if (
-        player.testConfig.videoFormat == 'ENCRYPTED_WEBM' ||
-        player.testConfig.videoFormat == 'CLEAR_WEBM') {
-      config.videoCapabilities = [{contentType: 'video/webm; codecs="vp8"'}];
-    }
-    if (player.testConfig.audioFormat == 'ENCRYPTED_MP4' ||
-        player.testConfig.audioFormat == 'CLEAR_MP4') {
-      config.audioCapabilities =
-          [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}];
-    } else if (
-        player.testConfig.audioFormat == 'ENCRYPTED_WEBM' ||
-        player.testConfig.audioFormat == 'CLEAR_WEBM') {
-      config.audioCapabilities = [{contentType: 'audio/webm; codecs="vorbis"'}];
-    }
-  }
-
-  // The File IO test requires persistent state support.
-  if (player.testConfig.keySystem ==
-      'org.chromium.externalclearkey.fileiotest') {
-    config.persistentState = 'required';
-  } else if (player.testConfig.sessionToLoad) {
-    config.persistentState = 'required';
-    config.sessionTypes = ['temporary', 'persistent-license'];
-  }
-
-  return navigator
-      .requestMediaKeySystemAccess(player.testConfig.keySystem, [config])
-      .then(function(access) { return access.createMediaKeys(); })
-      .then(function(mediaKeys) {
-        return player.video.setMediaKeys(mediaKeys);
-      })
-      .then(function(result) { return player; })
-      .catch(function(error) { Utils.failTest(error, NOTSUPPORTEDERROR); });
-};
-
-PlayerUtils.setVideoSource = function(player) {
-  if (player.testConfig.useMSE) {
-    Utils.timeLog('Loading media using MSE.');
-    var mediaSource =
-        MediaSourceUtils.loadMediaSourceFromTestConfig(player.testConfig);
-    player.video.src = window.URL.createObjectURL(mediaSource);
-  } else {
-    Utils.timeLog('Loading media using src.');
-    player.video.src = player.testConfig.mediaFile;
-  }
-  Utils.timeLog('video.src has been set to ' + player.video.src);
-};
-
-// Initialize the player to play encrypted content. Returns a promise that
-// resolves to the player.
-PlayerUtils.initEMEPlayer = function(player) {
-  return player.registerEventListeners().then(function(result) {
-    PlayerUtils.setVideoSource(player);
-    Utils.timeLog('initEMEPlayer() done');
-    return player;
-  });
-};
-
-// Return the appropriate player based on test configuration.
-PlayerUtils.createPlayer = function(video, testConfig) {
-  function getPlayerType(keySystem) {
-    switch (keySystem) {
-      case WIDEVINE_KEYSYSTEM:
-        return WidevinePlayer;
-      case CLEARKEY:
-      case EXTERNAL_CLEARKEY:
-      case EXTERNAL_CLEARKEY_RENEWAL:
-        return ClearKeyPlayer;
-      case FILE_IO_TEST_KEYSYSTEM:
-      case OUTPUT_PROTECTION_TEST_KEYSYSTEM:
-        return UnitTestPlayer;
-      default:
-        Utils.timeLog(keySystem + ' is not a known key system');
-        return ClearKeyPlayer;
-    }
-  }
-  var Player = getPlayerType(testConfig.keySystem);
-  return new Player(video, testConfig);
-};
diff --git a/cobalt/media/test/data/eme_player_js/test_config.js b/cobalt/media/test/data/eme_player_js/test_config.js
deleted file mode 100644
index 07e8658..0000000
--- a/cobalt/media/test/data/eme_player_js/test_config.js
+++ /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.
-
-// Test configuration used by test page to configure the player app and other
-// test specific configurations.
-function TestConfig() {
-  this.mediaFile = null;
-  this.keySystem = null;
-  this.mediaType = null;
-  this.licenseServerURL = null;
-  this.useMSE = false;
-  this.runFPS = false;
-  this.playTwice = false;
-}
-
-TestConfig.prototype.loadQueryParams = function() {
-  // Load query parameters and set default values.
-  var r = /([^&=]+)=?([^&]*)/g;
-  // Lambda function for decoding extracted match values. Replaces '+' with
-  // space so decodeURIComponent functions properly.
-  var decodeURI = function decodeURI(s) {
-      return decodeURIComponent(s.replace(/\+/g, ' '));
-  };
-  var match;
-  while (match = r.exec(window.location.search.substring(1)))
-    this[decodeURI(match[1])] = decodeURI(match[2]);
-  this.useMSE = this.useMSE == '1' || this.useMSE == 'true';
-  this.playTwice = this.playTwice == '1' || this.playTwice == 'true';
-};
-
-TestConfig.updateDocument = function() {
-  this.loadQueryParams();
-  Utils.addOptions(KEYSYSTEM_ELEMENT_ID, KEY_SYSTEMS);
-  Utils.addOptions(MEDIA_TYPE_ELEMENT_ID, MEDIA_TYPES);
-
-  document.getElementById(MEDIA_FILE_ELEMENT_ID).value =
-      this.mediaFile || DEFAULT_MEDIA_FILE;
-
-  document.getElementById(LICENSE_SERVER_ELEMENT_ID).value =
-      this.licenseServerURL || DEFAULT_LICENSE_SERVER;
-
-  if (this.keySystem)
-    Utils.ensureOptionInList(KEYSYSTEM_ELEMENT_ID, this.keySystem);
-  if (this.mediaType)
-    Utils.ensureOptionInList(MEDIA_TYPE_ELEMENT_ID, this.mediaType);
-  document.getElementById(USE_MSE_ELEMENT_ID).value = this.useMSE;
-  document.getElementById(USE_PLAY_TWICE_ELEMENT_ID).value = this.playTwice;
-};
-
-TestConfig.init = function() {
-  // Reload test configuration from document.
-  this.mediaFile = document.getElementById(MEDIA_FILE_ELEMENT_ID).value;
-  this.keySystem = document.getElementById(KEYSYSTEM_ELEMENT_ID).value;
-  this.mediaType = document.getElementById(MEDIA_TYPE_ELEMENT_ID).value;
-  this.useMSE = document.getElementById(USE_MSE_ELEMENT_ID).value == 'true';
-  this.playTwice =
-      document.getElementById(USE_PLAY_TWICE_ELEMENT_ID).value == 'true';
-  this.licenseServerURL =
-      document.getElementById(LICENSE_SERVER_ELEMENT_ID).value;
-};
diff --git a/cobalt/media/test/data/eme_player_js/unit_test_player.js b/cobalt/media/test/data/eme_player_js/unit_test_player.js
deleted file mode 100644
index 0ac8948..0000000
--- a/cobalt/media/test/data/eme_player_js/unit_test_player.js
+++ /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.
-
-// CDM unit test player is used to run a specific test within the CDM. The test
-// result is reported via a special key message with UNIT_TEST_RESULT_HEADER
-// followed by 1 for success, and 0 for failure.
-function UnitTestPlayer(video, testConfig) {
-  this.video = video;
-  this.testConfig = testConfig;
-}
-
-UnitTestPlayer.prototype.init = function() {
-  // Returns a promise.
-  return PlayerUtils.initEMEPlayer(this);
-};
-
-UnitTestPlayer.prototype.registerEventListeners = function() {
-  // Returns a promise.
-  return PlayerUtils.registerEMEEventListeners(this);
-};
-
-handleMessage = function(message) {
-  // The test result is either '0' or '1' appended to the header.
-  var msg = Utils.convertToUint8Array(message.message);
-  if (Utils.hasPrefix(msg, UNIT_TEST_RESULT_HEADER)) {
-    if (msg.length != UNIT_TEST_RESULT_HEADER.length + 1) {
-      Utils.failTest('Unexpected CDM Unit Test message' + msg);
-      return;
-    }
-    var result_index = UNIT_TEST_RESULT_HEADER.length;
-    var success = String.fromCharCode(msg[result_index]) == 1;
-    Utils.timeLog('CDM unit test: ' + (success ? 'Success' : 'Fail'));
-    if (success)
-      Utils.setResultInTitle(UNIT_TEST_SUCCESS);
-    else
-      Utils.failTest('CDM unit test failed.');
-  }
-};
-
-UnitTestPlayer.prototype.onMessage = handleMessage;
diff --git a/cobalt/media/test/data/eme_player_js/utils.js b/cobalt/media/test/data/eme_player_js/utils.js
deleted file mode 100644
index 653677f..0000000
--- a/cobalt/media/test/data/eme_player_js/utils.js
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Utils provide logging functions and other JS functions commonly used by the
-// app and media players.
-var Utils = new function() {
-  this.titleChanged = false;
-};
-
-// Adds options to document element.
-Utils.addOptions = function(elementID, keyValueOptions, disabledOptions) {
-  disabledOptions = disabledOptions || [];
-  var selectElement = document.getElementById(elementID);
-  var keys = Object.keys(keyValueOptions);
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i];
-    var option = new Option(key, keyValueOptions[key]);
-    option.title = keyValueOptions[key];
-    if (disabledOptions.indexOf(key) >= 0)
-      option.disabled = true;
-    selectElement.options.add(option);
-  }
-};
-
-Utils.convertToArray = function(input) {
-  if (Array.isArray(input))
-    return input;
-  return [input];
-};
-
-Utils.convertToUint8Array = function(msg) {
-  if (typeof msg == 'string') {
-    var ans = new Uint8Array(msg.length);
-    for (var i = 0; i < msg.length; i++) {
-      ans[i] = msg.charCodeAt(i);
-    }
-    return ans;
-  }
-  // Assume it is an ArrayBuffer or ArrayBufferView. If it already is a
-  // Uint8Array, this will just make a copy of the view.
-  return new Uint8Array(msg);
-};
-
-Utils.createJWKData = function(keyId, key) {
-  // JWK routines copied from third_party/WebKit/LayoutTests/media/
-  //   encrypted-media/encrypted-media-utils.js
-
-  // Encodes data (Uint8Array) into base64url string. There is no '=' padding,
-  // and the characters '-' and '_' must be used instead of '+' and '/',
-  // respectively.
-  function base64urlEncode(data) {
-    var result = btoa(String.fromCharCode.apply(null, data));
-    return result.replace(/=+$/g, '').replace(/\+/g, "-").replace(/\//g, "_");
-  }
-
-  // Creates a JWK from raw key ID and key.
-  function createJWK(keyId, key) {
-    var jwk = '{"kty":"oct","alg":"A128KW","kid":"';
-    jwk += base64urlEncode(keyId);
-    jwk += '","k":"';
-    jwk += base64urlEncode(key);
-    jwk += '"}';
-    return jwk;
-  }
-
-  // Creates a JWK Set from an array of JWK(s).
-  function createJWKSet() {
-    var jwkSet = '{"keys":[';
-    for (var i = 0; i < arguments.length; i++) {
-      if (i != 0)
-        jwkSet += ',';
-      jwkSet += arguments[i];
-    }
-    jwkSet += ']}';
-    return jwkSet;
-  }
-
-  return Utils.convertToUint8Array(createJWKSet(createJWK(keyId, key)));
-};
-
-Utils.extractFirstLicenseKeyId = function(message) {
-  // Decodes data (Uint8Array) from base64url string.
-  function base64urlDecode(data) {
-    return atob(data.replace(/\-/g, "+").replace(/\_/g, "/"));
-  }
-
-  function convertToString(data) {
-    return String.fromCharCode.apply(null, Utils.convertToUint8Array(data));
-  }
-
-  try {
-    var json = JSON.parse(convertToString(message));
-    // Decode the first element of 'kids', return it as an Uint8Array.
-    return Utils.convertToUint8Array(base64urlDecode(json.kids[0]));
-  } catch (error) {
-    // Not valid JSON, so return message untouched as Uint8Array.
-    return Utils.convertToUint8Array(message);
-  }
-}
-
-Utils.documentLog = function(log, success, time) {
-  if (!docLogs)
-    return;
-  time = time || Utils.getCurrentTimeString();
-  var timeLog = '<span style="color: green">' + time + '</span>';
-  var logColor = !success ? 'red' : 'black'; // default is true.
-  log = '<span style="color: "' + logColor + '>' + log + '</span>';
-  docLogs.innerHTML = timeLog + ' - ' + log + '<br>' + docLogs.innerHTML;
-};
-
-Utils.ensureOptionInList = function(listID, option) {
-  var selectElement = document.getElementById(listID);
-  for (var i = 0; i < selectElement.length; i++) {
-    if (selectElement.options[i].value == option) {
-      selectElement.value = option;
-      return;
-    }
-  }
-  // The list does not have the option, let's add it and select it.
-  var optionElement = new Option(option, option);
-  optionElement.title = option;
-  selectElement.options.add(optionElement);
-  selectElement.value = option;
-};
-
-Utils.failTest = function(msg, newTitle) {
-  var failMessage = 'FAIL: ';
-  var title = 'FAILED';
-  // Handle exception messages;
-  if (msg.message) {
-    title = msg.name || 'Error';
-    failMessage += title + ' ' + msg.message;
-  } else if (msg instanceof Event) {
-    // Handle failing events.
-    failMessage = msg.target + '.' + msg.type;
-    title = msg.type;
-  } else {
-    failMessage += msg;
-  }
-  // Force newTitle if passed.
-  title = newTitle || title;
-  // Log failure.
-  Utils.documentLog(failMessage, false);
-  console.log(failMessage, msg);
-  Utils.setResultInTitle(title);
-};
-
-Utils.getCurrentTimeString = function() {
-  var date = new Date();
-  var hours = ('0' + date.getHours()).slice(-2);
-  var minutes = ('0' + date.getMinutes()).slice(-2);
-  var secs = ('0' + date.getSeconds()).slice(-2);
-  var milliSecs = ('00' + date.getMilliseconds()).slice(-3);
-  return hours + ':' + minutes + ':' + secs + '.' + milliSecs;
-};
-
-Utils.getDefaultKey = function(forceInvalidResponse) {
-  if (forceInvalidResponse) {
-    Utils.timeLog('Forcing invalid key data.');
-    return new Uint8Array([0xAA]);
-  }
-  return KEY;
-};
-
-Utils.getHexString = function(uintArray) {
-  var hex_str = '';
-  for (var i = 0; i < uintArray.length; i++) {
-    var hex = uintArray[i].toString(16);
-    if (hex.length == 1)
-      hex = '0' + hex;
-    hex_str += hex;
-  }
-  return hex_str;
-};
-
-Utils.hasPrefix = function(msg, prefix) {
-  var message = String.fromCharCode.apply(null, Utils.convertToUint8Array(msg));
-  return message.substring(0, prefix.length) == prefix;
-};
-
-Utils.installTitleEventHandler = function(element, event) {
-  element.addEventListener(event, function(e) {
-    Utils.setResultInTitle(e.type.toUpperCase());
-  }, false);
-};
-
-Utils.isRenewalMessage = function(message) {
-  return (message.messageType == 'license-renewal');
-};
-
-Utils.resetTitleChange = function() {
-  this.titleChanged = false;
-  document.title = '';
-};
-
-Utils.sendRequest = function(
-    requestType, responseType, message, serverURL, onResponseCallbackFn,
-    forceInvalidResponse) {
-  var requestAttemptCount = 0;
-  var REQUEST_RETRY_DELAY_MS = 3000;
-  var REQUEST_TIMEOUT_MS = 1000;
-
-  function sendRequestAttempt() {
-    // No limit on the number of retries. This will retry on failures
-    // until the test framework stops the test.
-    requestAttemptCount++;
-    var xmlhttp = new XMLHttpRequest();
-    xmlhttp.responseType = responseType;
-    xmlhttp.open(requestType, serverURL, true);
-    xmlhttp.onerror = function(e) {
-      Utils.timeLog('Request status: ' + this.statusText);
-      Utils.timeLog('FAILED: License request XHR failed with network error.');
-      Utils.timeLog('Retrying request in ' + REQUEST_RETRY_DELAY_MS + 'ms');
-      setTimeout(sendRequestAttempt, REQUEST_RETRY_DELAY_MS);
-    };
-    xmlhttp.onload = function(e) {
-      if (this.status == 200) {
-        onResponseCallbackFn(this.response);
-      } else if (this.status == 404 && serverURL == DEFAULT_LICENSE_SERVER) {
-        // If using the default license server, no page available means there
-        // is no license server configured.
-        onResponseCallbackFn(Utils.convertToUint8Array("No license."));
-      } else {
-        Utils.timeLog('Bad response status: ' + this.status);
-        Utils.timeLog('Bad response: ' + this.response);
-        Utils.timeLog('Retrying request in ' + REQUEST_RETRY_DELAY_MS + 'ms');
-        setTimeout(sendRequestAttempt, REQUEST_RETRY_DELAY_MS);
-      }
-    };
-    xmlhttp.timeout = REQUEST_TIMEOUT_MS;
-    xmlhttp.ontimeout = function(e) {
-      Utils.timeLog('Request timeout');
-      Utils.timeLog('Retrying request in ' + REQUEST_RETRY_DELAY_MS + 'ms');
-      setTimeout(sendRequestAttempt, REQUEST_RETRY_DELAY_MS);
-    }
-    Utils.timeLog('Attempt (' + requestAttemptCount +
-                  '): sending request to server: ' + serverURL);
-    xmlhttp.send(message);
-  }
-
-  if (forceInvalidResponse) {
-    Utils.timeLog('Not sending request - forcing an invalid response.');
-    return onResponseCallbackFn(Utils.convertToUint8Array("Invalid response."));
-  }
-  sendRequestAttempt();
-};
-
-Utils.setResultInTitle = function(title) {
-  // If document title is 'ENDED', then update it with new title to possibly
-  // mark a test as failure.  Otherwise, keep the first title change in place.
-  if (!this.titleChanged || document.title == 'ENDED')
-    document.title = title;
-  Utils.timeLog('Set document title to: ' + title + ', updated title: ' +
-                document.title);
-  this.titleChanged = true;
-};
-
-Utils.timeLog = function(/**/) {
-  if (arguments.length == 0)
-    return;
-  var time = Utils.getCurrentTimeString();
-  // Log to document.
-  Utils.documentLog(arguments[0], time);
-  // Log to JS console.
-  var logString = time + ' - ';
-  for (var i = 0; i < arguments.length; i++) {
-    logString += ' ' + arguments[i];
-  }
-  console.log(logString);
-};
diff --git a/cobalt/media/test/data/eme_player_js/widevine_player.js b/cobalt/media/test/data/eme_player_js/widevine_player.js
deleted file mode 100644
index d393720..0000000
--- a/cobalt/media/test/data/eme_player_js/widevine_player.js
+++ /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.
-
-// Widevine player responsible for playing media using Widevine key system.
-function WidevinePlayer(video, testConfig) {
-  this.video = video;
-  this.testConfig = testConfig;
-}
-
-WidevinePlayer.prototype.init = function() {
-  // Returns a promise.
-  return PlayerUtils.initEMEPlayer(this);
-};
-
-WidevinePlayer.prototype.registerEventListeners = function() {
-  // Returns a promise.
-  return PlayerUtils.registerEMEEventListeners(this);
-};
-
-WidevinePlayer.prototype.onMessage = function(message) {
-  Utils.timeLog('MediaKeySession onMessage', message);
-  var mediaKeySession = message.target;
-  function onSuccess(response) {
-    var key = new Uint8Array(response);
-    Utils.timeLog('Update media key session with license response.', key);
-    mediaKeySession.update(key)
-        .catch(function(error) { Utils.failTest(error, EME_UPDATE_FAILED); });
-  }
-  Utils.sendRequest('POST',
-                    'arraybuffer',
-                    Utils.convertToUint8Array(message.message),
-                    this.testConfig.licenseServerURL,
-                    onSuccess,
-                    this.testConfig.forceInvalidResponse);
-};
diff --git a/cobalt/media/test/data/encrypted_frame_size_change.html b/cobalt/media/test/data/encrypted_frame_size_change.html
deleted file mode 100644
index c6bf0ae..0000000
--- a/cobalt/media/test/data/encrypted_frame_size_change.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <body onload="load()">
-    <p>Tests decoding and rendering encrypted video element that has a changing
-      resolution.</p>
-    <video width=320 controls></video>
-    <video controls></video>
-    <script src='eme_player_js/app_loader.js' type='text/javascript'></script>
-    <script>
-      var firstVideoSeek = false;
-      var video_fixed_size = document.getElementsByTagName("video")[0];
-      var video = document.getElementsByTagName("video")[1];
-      var testConfig;
-
-      function initTestConfig() {
-        testConfig = new TestConfig();
-        testConfig.loadQueryParams();
-      }
-
-      function load() {
-        initTestConfig();
-        loadVideo(video_fixed_size).then(function() {
-          loadVideo(video);
-        });
-      }
-
-      function loadVideo(video) {
-        video.addEventListener('playing', function() {
-          // Make sure the video plays for a bit.
-          video.addEventListener('timeupdate', function() {
-            if (video.currentTime > 1.0) {
-              video.pause();
-            }
-          });
-        });
-
-        video.addEventListener('pause', function() {
-          video.addEventListener('seeked', function() {
-            if (!firstVideoSeek) {
-              Utils.timeLog('One video seeked.');
-              firstVideoSeek = true;
-              return;
-            }
-            Utils.setResultInTitle('ENDED');
-          });
-          video.currentTime = 0.5;
-        });
-
-        video.addEventListener('canplay', oncanplay);
-
-        var videoPlayer = PlayerUtils.createPlayer(video, testConfig);
-        return videoPlayer.init()
-            .then(function() { video.play(); })
-            .catch(function() { Utils.failTest('Unable to play video.'); });
-      }
-    </script>
-  </body>
-</html>
diff --git a/cobalt/media/test/data/frame_size_change-av_enc-v.webm b/cobalt/media/test/data/frame_size_change-av_enc-v.webm
deleted file mode 100644
index 200be55..0000000
--- a/cobalt/media/test/data/frame_size_change-av_enc-v.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/green-a300hz.webm b/cobalt/media/test/data/green-a300hz.webm
deleted file mode 100644
index 5ebc41b..0000000
--- a/cobalt/media/test/data/green-a300hz.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/h264-320x180-frame-0 b/cobalt/media/test/data/h264-320x180-frame-0
deleted file mode 100644
index 8f0d1c2..0000000
--- a/cobalt/media/test/data/h264-320x180-frame-0
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/h264-320x180-frame-1 b/cobalt/media/test/data/h264-320x180-frame-1
deleted file mode 100644
index bb4b702..0000000
--- a/cobalt/media/test/data/h264-320x180-frame-1
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/h264-320x180-frame-2 b/cobalt/media/test/data/h264-320x180-frame-2
deleted file mode 100644
index c485dc2..0000000
--- a/cobalt/media/test/data/h264-320x180-frame-2
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/h264-320x180-frame-3 b/cobalt/media/test/data/h264-320x180-frame-3
deleted file mode 100644
index 2578f22..0000000
--- a/cobalt/media/test/data/h264-320x180-frame-3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/icy_sfx.mp3 b/cobalt/media/test/data/icy_sfx.mp3
deleted file mode 100644
index 52fc5a9..0000000
--- a/cobalt/media/test/data/icy_sfx.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/id3_png_test.mp3 b/cobalt/media/test/data/id3_png_test.mp3
deleted file mode 100644
index 61efa2c..0000000
--- a/cobalt/media/test/data/id3_png_test.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/id3_test.mp3 b/cobalt/media/test/data/id3_test.mp3
deleted file mode 100644
index ddf43b9..0000000
--- a/cobalt/media/test/data/id3_test.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/media_source_player.html b/cobalt/media/test/data/media_source_player.html
deleted file mode 100644
index 319907c..0000000
--- a/cobalt/media/test/data/media_source_player.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Media Source Player</title>
-  </head>
-  <body onload="runTest();">
-    <video controls></video>
-    <script src='eme_player_js/app_loader.js' type='text/javascript'></script>
-    <script type="text/javascript">
-      var video = document.querySelector('video');
-
-      function onTimeUpdate() {
-        video.removeEventListener('timeupdate', onTimeUpdate);
-        video.currentTime =  0.9 * video.duration;
-      }
-
-      function onSeeked() {
-        video.removeEventListener('ended', Utils.failTest);
-        Utils.installTitleEventHandler(video, 'ended');
-      }
-
-      // For those streams whose start time is greater than
-      // kSeekToStartFudgeRoom defined in source_buffer_stream.cc, we
-      // need to skip those time range. Otherwise it won't play
-      function onLoadedMetaData() {
-        var buf = video.buffered;
-        if (buf.length > 0) {
-          video.currentTime = buf.start(0);
-        }
-      }
-
-      // The test completes after media starts playing, seeks to 0.9 of
-      // duration and fires the ended event.
-      // The test stops when an error or ended event fire unexpectedly.
-      function runTest() {
-        var testConfig = new TestConfig();
-        testConfig.loadQueryParams();
-        Utils.installTitleEventHandler(video, 'error');
-        video.addEventListener('ended', Utils.failTest);
-        video.addEventListener('seeked', onSeeked);
-        video.addEventListener('timeupdate', onTimeUpdate);
-        video.addEventListener('loadedmetadata', onLoadedMetaData);
-        var source = MediaSourceUtils.loadMediaSourceFromTestConfig(testConfig);
-        video.src = window.URL.createObjectURL(source);
-        video.play();
-      }
-    </script>
-  </body>
-</html>
diff --git a/cobalt/media/test/data/midstream_config_change.mp3 b/cobalt/media/test/data/midstream_config_change.mp3
deleted file mode 100644
index 5bf5a5d..0000000
--- a/cobalt/media/test/data/midstream_config_change.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/mse_config_change.html b/cobalt/media/test/data/mse_config_change.html
deleted file mode 100644
index 9234b65..0000000
--- a/cobalt/media/test/data/mse_config_change.html
+++ /dev/null
@@ -1,146 +0,0 @@
-<html>
-  <head>
-    <title>Test media source config changes.</title>
-  </head>
-  <body onload="runTest();">
-    <video controls></video>
-    <script src='eme_player_js/app_loader.js' type='text/javascript'></script>
-    <script type="text/javascript">
-      var testConfig;
-
-      var video = document.querySelector('video');
-      var mediaType = 'video/webm; codecs="vorbis, vp8"';
-
-      var CLEAR_MEDIA_1 = 'bear-320x240.webm';
-      var CLEAR_MEDIA_2 = 'bear-640x360.webm';
-      var ENCRYPTED_MEDIA_1 = 'bear-320x240-av_enc-av.webm';
-      var ENCRYPTED_MEDIA_2 = 'bear-640x360-av_enc-av.webm';
-
-      var MEDIA_1_WIDTH = 320;
-      var MEDIA_1_HEIGHT = 240;
-
-      var MEDIA_2_WIDTH = 640;
-      var MEDIA_2_HEIGHT = 360;
-      var MEDIA_2_LENGTH = 2.75;
-
-      // The time in secs to append the second media source.
-      var APPEND_TIME = 1;
-      // DELTA is the time after APPEND_TIME where the second video dimensions
-      // are guaranteed to take effect.
-      var DELTA = 0.1;
-      // Append MEDIA_2 source at APPEND_TIME, so expected total duration is:
-      var TOTAL_DURATION = APPEND_TIME + MEDIA_2_LENGTH;
-
-      function initTestConfig() {
-        testConfig = new TestConfig();
-        testConfig.loadQueryParams();
-      }
-
-      function appendNextSource(mediaSource) {
-        console.log('Appending next media source at ' + APPEND_TIME + 'sec.');
-        var xhr = new XMLHttpRequest();
-        var mediaFile =
-            (testConfig.runEncrypted == 1) ? ENCRYPTED_MEDIA_2 : CLEAR_MEDIA_2;
-        xhr.open("GET", mediaFile);
-        xhr.responseType = 'arraybuffer';
-        xhr.addEventListener('load', function(e) {
-          var onUpdateEnd = function(e) {
-            console.log('Second buffer append ended.');
-            srcBuffer.removeEventListener('updateend', onUpdateEnd);
-            mediaSource.endOfStream();
-            if (!mediaSource.duration ||
-                Math.abs(mediaSource.duration - TOTAL_DURATION) > DELTA) {
-              Utils.failTest('Unexpected mediaSource.duration = ' +
-                       mediaSource.duration + ', expected duration = ' +
-                       TOTAL_DURATION);
-              return;
-            }
-            video.play();
-          };
-          console.log('Appending next media source at ' + APPEND_TIME + 'sec.');
-          var srcBuffer = mediaSource.sourceBuffers[0];
-          srcBuffer.addEventListener('updateend', onUpdateEnd);
-          srcBuffer.timestampOffset = APPEND_TIME;
-          srcBuffer.appendBuffer(new Uint8Array(e.target.response));
-        });
-        xhr.send();
-      }
-
-      function onTimeUpdate() {
-        // crbug.com/246308
-        //checkVideoProperties();
-
-        // Seek to APPEND_TIME because after a seek a timeUpdate event is fired
-        // before video width and height properties get updated.
-        if (video.currentTime < APPEND_TIME - DELTA) {
-          // Seek to save test execution time (about 1 secs) and to test seek
-          // on the first buffer.
-          video.currentTime = APPEND_TIME - DELTA;
-        } else if (video.currentTime > APPEND_TIME + DELTA) {
-          // Check video duration here to guarantee that second segment has been
-          // appended and video total duration is updated.
-          // Video duration is a float value so we check it within a range.
-          if (!video.duration ||
-              Math.abs(video.duration - TOTAL_DURATION) > DELTA) {
-            Utils.failTest('Unexpected video.duration = ' + video.duration +
-                     ', expected duration = ' + TOTAL_DURATION);
-            return;
-          }
-
-          video.removeEventListener('timeupdate', onTimeUpdate);
-          video.removeEventListener('ended', Utils.failTest);
-          Utils.installTitleEventHandler(video, 'ended');
-          // Seek to save test execution time and to test seek on second buffer.
-          video.currentTime = APPEND_TIME + MEDIA_2_LENGTH * 0.9;
-        }
-      }
-
-      function checkVideoProperties() {
-        if (video.currentTime <= APPEND_TIME) {
-          if (video.videoWidth != MEDIA_1_WIDTH ||
-              video.videoHeight != MEDIA_1_HEIGHT) {
-            logVideoDimensions();
-            Utils.failTest('Unexpected dimensions for first video segment.');
-            return;
-          }
-        } else if (video.currentTime >= APPEND_TIME + DELTA) {
-          if (video.videoWidth != MEDIA_2_WIDTH ||
-              video.videoHeight != MEDIA_2_HEIGHT) {
-            logVideoDimensions();
-            Utils.failTest('Unexpected dimensions for second video segment.');
-            return;
-          }
-        }
-      }
-
-      function logVideoDimensions() {
-        console.log('video.currentTime = ' + video.currentTime +
-                    ', video dimensions = ' + video.videoWidth + 'x' +
-                    video.videoHeight + '.');
-      }
-
-      function runTest() {
-        initTestConfig();
-        testConfig.mediaFile =
-            (testConfig.runEncrypted == 1) ? ENCRYPTED_MEDIA_1 : CLEAR_MEDIA_1;
-        testConfig.mediaType = mediaType;
-        video.addEventListener('timeupdate', onTimeUpdate);
-        video.addEventListener('ended', Utils.failTest);
-        var mediaSource = MediaSourceUtils.loadMediaSourceFromTestConfig(
-            testConfig, appendNextSource);
-        if (testConfig.runEncrypted == 1) {
-          var emePlayer = PlayerUtils.createPlayer(video, testConfig);
-          emePlayer.registerEventListeners()
-              .then(function(player) {
-                video.src = window.URL.createObjectURL(mediaSource);
-              })
-              .catch(function(error) {
-                Utils.failTest('Unable to register event listeners.');
-              });
-        } else {
-          video.src = window.URL.createObjectURL(mediaSource);
-        }
-      }
-      </script>
-  </body>
-</html>
diff --git a/cobalt/media/test/data/mse_different_containers.html b/cobalt/media/test/data/mse_different_containers.html
deleted file mode 100644
index ae9c8a3..0000000
--- a/cobalt/media/test/data/mse_different_containers.html
+++ /dev/null
@@ -1,110 +0,0 @@
-<html>
-  <head>
-    <title>Test media source playback with different containers.</title>
-  </head>
-  <body onload="runTest();">
-    <video></video>
-    <script src='eme_player_js/app_loader.js' type='text/javascript'></script>
-    <script type="text/javascript">
-      // Specify possible content for clear and encrypted streams in both MP4
-      // and WEBM format. For testing we don't care if the audio matches the
-      // video or if the length of each container is the same.
-      var VIDEO_MP4_MEDIA_TYPE = 'video/mp4; codecs="avc1.4D4041"';
-      var VIDEO_WEBM_MEDIA_TYPE = 'video/webm; codecs="vp8"';
-      var VIDEO_MP4_CLEAR_FILE = 'bear-640x360-v_frag.mp4';
-      var VIDEO_WEBM_CLEAR_FILE = 'bear-320x240-video-only.webm';
-      var VIDEO_MP4_ENCRYPTED_FILE = 'bear-640x360-v_frag-cenc.mp4';
-      var VIDEO_WEBM_ENCRYPTED_FILE = 'bear-320x240-v_enc-v.webm';
-
-      var AUDIO_MP4_MEDIA_TYPE = 'audio/mp4; codecs="mp4a.40.2"';
-      var AUDIO_WEBM_MEDIA_TYPE = 'audio/webm; codecs="vorbis"';
-      var AUDIO_MP4_CLEAR_FILE = 'bear-640x360-a_frag.mp4';
-      var AUDIO_WEBM_CLEAR_FILE = 'bear-320x240-audio-only.webm';
-      var AUDIO_MP4_ENCRYPTED_FILE = 'bear-640x360-a_frag-cenc.mp4';
-      var AUDIO_WEBM_ENCRYPTED_FILE = 'bear-a_enc-a.webm';
-
-      var media_types = [];
-      var media_files = [];
-
-      // The time in secs to play the streams.
-      var PLAY_TIME_SEC = 0.1;
-
-      var video = document.querySelector('video');
-
-      function onTimeUpdate() {
-        if (video.currentTime < PLAY_TIME_SEC)
-          return;
-
-        video.removeEventListener('timeupdate', onTimeUpdate);
-        video.removeEventListener('ended', Utils.failTest);
-        Utils.installTitleEventHandler(video, 'ended');
-
-        // Seek to end to save test execution time.
-        video.currentTime = 1000;
-      }
-
-      function addVideoStream(format) {
-        if (format == 'CLEAR_MP4') {
-          media_types = media_types.concat(VIDEO_MP4_MEDIA_TYPE);
-          media_files = media_files.concat(VIDEO_MP4_CLEAR_FILE);
-        } else if (format == 'CLEAR_WEBM') {
-          media_types = media_types.concat(VIDEO_WEBM_MEDIA_TYPE);
-          media_files = media_files.concat(VIDEO_WEBM_CLEAR_FILE);
-        } else if (format == 'ENCRYPTED_MP4') {
-          media_types = media_types.concat(VIDEO_MP4_MEDIA_TYPE);
-          media_files = media_files.concat(VIDEO_MP4_ENCRYPTED_FILE);
-        } else if (format == 'ENCRYPTED_WEBM') {
-          media_types = media_types.concat(VIDEO_WEBM_MEDIA_TYPE);
-          media_files = media_files.concat(VIDEO_WEBM_ENCRYPTED_FILE);
-        } else {
-          Utils.failTest('Unrecognized video type.');
-        }
-      }
-
-      function addAudioStream(format) {
-        if (format == 'CLEAR_MP4') {
-          media_types = media_types.concat(AUDIO_MP4_MEDIA_TYPE);
-          media_files = media_files.concat(AUDIO_MP4_CLEAR_FILE);
-        } else if (format == 'CLEAR_WEBM') {
-          media_types = media_types.concat(AUDIO_WEBM_MEDIA_TYPE);
-          media_files = media_files.concat(AUDIO_WEBM_CLEAR_FILE);
-        } else if (format == 'ENCRYPTED_MP4') {
-          media_types = media_types.concat(AUDIO_MP4_MEDIA_TYPE);
-          media_files = media_files.concat(AUDIO_MP4_ENCRYPTED_FILE);
-        } else if (format == 'ENCRYPTED_WEBM') {
-          media_types = media_types.concat(AUDIO_WEBM_MEDIA_TYPE);
-          media_files = media_files.concat(AUDIO_WEBM_ENCRYPTED_FILE);
-        } else {
-          Utils.failTest('Unrecognized audio type.');
-        }
-      }
-
-      function runTest() {
-        video.addEventListener('timeupdate', onTimeUpdate);
-        video.addEventListener('ended', Utils.failTest);
-
-        var testConfig = new TestConfig();
-        testConfig.loadQueryParams();
-        addVideoStream(testConfig.videoFormat);
-        addAudioStream(testConfig.audioFormat);
-
-        var mediaSource =
-            MediaSourceUtils.loadMediaSource(media_files, media_types);
-
-        if (testConfig.runEncrypted > 0) {
-          var emePlayer = PlayerUtils.createPlayer(video, testConfig);
-          emePlayer.registerEventListeners()
-              .then(function(player) {
-                video.src = window.URL.createObjectURL(mediaSource);
-              })
-              .catch(function(error) {
-                Utils.failTest('Unable to register EME event listeners.');
-              });
-        } else {
-          video.src = window.URL.createObjectURL(mediaSource);
-        }
-        video.play();
-      }
-      </script>
-  </body>
-</html>
diff --git a/cobalt/media/test/data/multitrack-3video-2audio.webm b/cobalt/media/test/data/multitrack-3video-2audio.webm
deleted file mode 100644
index 473db88..0000000
--- a/cobalt/media/test/data/multitrack-3video-2audio.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/no_audio_video.webm b/cobalt/media/test/data/no_audio_video.webm
deleted file mode 100644
index 924c091..0000000
--- a/cobalt/media/test/data/no_audio_video.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/no_streams.webm b/cobalt/media/test/data/no_streams.webm
deleted file mode 100644
index e0bc3e8..0000000
--- a/cobalt/media/test/data/no_streams.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/nonzero-start-time.webm b/cobalt/media/test/data/nonzero-start-time.webm
deleted file mode 100644
index 9429bc8..0000000
--- a/cobalt/media/test/data/nonzero-start-time.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/npot-video.h264 b/cobalt/media/test/data/npot-video.h264
deleted file mode 100644
index ace9fa5..0000000
--- a/cobalt/media/test/data/npot-video.h264
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/npot-video.h264.md5 b/cobalt/media/test/data/npot-video.h264.md5
deleted file mode 100644
index abda9e8..0000000
--- a/cobalt/media/test/data/npot-video.h264.md5
+++ /dev/null
@@ -1,7 +0,0 @@
-# --test_video_data="npot-video.h264:300:176:901:978:35:150:1"
-# Intel - Ivy Bridge
-f8c0f13e30d1f1b6316d4fa59913ff07
-# Intel - Sandy Bridge
-4b7118b0e73ceb789d231899e2f1e380
-# ARM - Exynos
-ae857073bca6394132a3af6aafcea9f6
diff --git a/cobalt/media/test/data/opus-trimming-test.ogg b/cobalt/media/test/data/opus-trimming-test.ogg
deleted file mode 100644
index bfe9e78..0000000
--- a/cobalt/media/test/data/opus-trimming-test.ogg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/opus-trimming-test.webm b/cobalt/media/test/data/opus-trimming-test.webm
deleted file mode 100644
index e2531b0..0000000
--- a/cobalt/media/test/data/opus-trimming-test.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/opus-trimming-video-test.webm b/cobalt/media/test/data/opus-trimming-video-test.webm
deleted file mode 100644
index 044fc13..0000000
--- a/cobalt/media/test/data/opus-trimming-video-test.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/peach_pi-1280x720.jpg b/cobalt/media/test/data/peach_pi-1280x720.jpg
deleted file mode 100644
index 81bf88c..0000000
--- a/cobalt/media/test/data/peach_pi-1280x720.jpg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/pixel-1280x720.jpg b/cobalt/media/test/data/pixel-1280x720.jpg
deleted file mode 100644
index 9acc733..0000000
--- a/cobalt/media/test/data/pixel-1280x720.jpg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/player.html b/cobalt/media/test/data/player.html
deleted file mode 100644
index a1f4639..0000000
--- a/cobalt/media/test/data/player.html
+++ /dev/null
@@ -1,105 +0,0 @@
-<html>
-<body onload="RunTest();">
-<div id="player_container"></div>
-</body>
-
-<script type="text/javascript">
-// <audio> or <video> player element.
-var player;
-
-// Listen for |event| from |element|, set document.title = |event| upon event.
-function InstallTitleEventHandler(element, event) {
-  element.addEventListener(event, function(e) {
-    document.title = event.toUpperCase();
-  }, false);
-}
-
-function Failed() {
-  document.title = 'FAILED';
-  return false;
-}
-
-function SeekTestStep(e) {
-  player.removeEventListener('ended', SeekTestStep, false);
-
-  // Test completes on the next ended event.
-  InstallTitleEventHandler(player, 'ended');
-
-  player.currentTime = 0.9 * player.duration;
-  player.play();
-}
-
-function SeekTestTimeoutSetup() {
-  if (player.currentTime < 2)
-    return;
-
-  player.removeEventListener('timeupdate', SeekTestTimeoutSetup, false);
-  SeekTestStep();
-}
-
-// Uses URL query parameters to create an audio or video element using a given
-// source.  URL must be of the form:
-// "player.html?[tag]=[media_url][&loop=[true/false]]".
-//
-// Plays the media and waits for X seconds of playback or the ended event, at
-// which point the test seeks near the end of the file and resumes playback.
-// Test completes when the second ended event occurs or an error event occurs at
-// any time.
-// There is an optional loop query parameter which when set to true, will cause
-// the created media element to loop.
-function RunTest() {
-  var url_parts = window.location.href.split('?');
-  if (url_parts.length != 2)
-    return Failed();
-
-  var tag = '';
-  var media_url = '';
-  var loop = false;
-
-  var query_params = url_parts[1].split('&');
-  for (var query_param in query_params) {
-    var query_parts = query_params[query_param].split('=');
-    if (query_parts.length != 2) {
-      return Failed();
-    }
-
-    if (query_parts[0] == 'audio' || query_parts[0] == 'video') {
-      tag = query_parts[0];
-      media_url = query_parts[1];
-      continue;
-    }
-
-    if (query_parts[0] == 'loop') {
-      loop = (query_parts[1] == 'true');
-      continue;
-    }
-  }
-
-  if (tag != 'audio' && tag != 'video') {
-    return Failed();
-  }
-
-  // Create player and insert into DOM.
-  player = document.createElement(tag);
-  player.controls = true;
-  document.getElementById('player_container').appendChild(player);
-
-  player.addEventListener('loadedmetadata', function(e) {
-    document.title = '' + player.videoWidth + ' ' + player.videoHeight;
-  });
-
-  // Transition to the seek test after X seconds of playback or when the ended
-  // event occurs, whichever happens first.
-  player.addEventListener('ended', SeekTestStep, false);
-  player.addEventListener('timeupdate', SeekTestTimeoutSetup, false);
-
-  // Ensure we percolate up any error events.
-  InstallTitleEventHandler(player, 'error');
-
-  // Starts the player.
-  player.loop = loop;
-  player.src = media_url;
-  player.play();
-}
-</script>
-</html>
diff --git a/cobalt/media/test/data/rapid_video_change_test.html b/cobalt/media/test/data/rapid_video_change_test.html
deleted file mode 100644
index 81a853b..0000000
--- a/cobalt/media/test/data/rapid_video_change_test.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>HTML 5 Change H.264 Video Test</title>
-    <script>
-      var changeVideoInterval;
-      var changeVideoCounter = 0;
-
-      function changeVideo() {
-        try {
-          if (changeVideoCounter == 40) {
-            alert('40 video changes done. Test over');
-            window.clearInterval(changeVideoInterval);
-            return;
-          }
-          var video = document.getElementById('video');
-          video.pause();
-          video.src = 'bear-1280x720.mp4?counter=' +
-              changeVideoCounter.toString();
-          ++changeVideoCounter;
-          video.play();
-          video.currentTime = 1;
-        }
-
-        catch (e) {
-        }
-      }
-
-      function onLoad() {
-        var video = document.getElementById('video');
-        video.play();
-        video.currentTime = 1;
-        changeVideoInterval = setInterval(changeVideo, 200);
-      }
-    </script>
-  </head>
-  
-  <body onload='onLoad();'> <b> This test tests the case where in H.264 H/W
-   decoded videos are added and removed a number of times from the page,
-   while they are playing. <br> This should not cause the browser to hang.
-   <div id='videoDiv'>
-     <video id='video' width=320 height=240 src='bear-1280x720.mp4'
-       controls='controls'>
-     </video>
-   </div>
-  </body>
-</html>
diff --git a/cobalt/media/test/data/red-a500hz.webm b/cobalt/media/test/data/red-a500hz.webm
deleted file mode 100644
index 386317c..0000000
--- a/cobalt/media/test/data/red-a500hz.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/red-green.h264 b/cobalt/media/test/data/red-green.h264
deleted file mode 100644
index 0471eba..0000000
--- a/cobalt/media/test/data/red-green.h264
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/red-green.h264.md5 b/cobalt/media/test/data/red-green.h264.md5
deleted file mode 100644
index f4329a5..0000000
--- a/cobalt/media/test/data/red-green.h264.md5
+++ /dev/null
@@ -1,7 +0,0 @@
-# --test_video_data="red-green.h264:80:128:150:156:35:150:1"
-# Intel - Ivy Bridge
-19724227e7878c50338ed4a1d42643af
-# Intel - Sandy Bridge
-63dbd2451d00db7d92c2e46caa739b2f
-# ARM - Exynos
-635d460a4733b692d7ebc87d7da79e51
diff --git a/cobalt/media/test/data/sfx-opus-441.webm b/cobalt/media/test/data/sfx-opus-441.webm
deleted file mode 100644
index dfeabce..0000000
--- a/cobalt/media/test/data/sfx-opus-441.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx-opus.ogg b/cobalt/media/test/data/sfx-opus.ogg
deleted file mode 100644
index de884a9..0000000
--- a/cobalt/media/test/data/sfx-opus.ogg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx.adts b/cobalt/media/test/data/sfx.adts
deleted file mode 100644
index 688ddf3..0000000
--- a/cobalt/media/test/data/sfx.adts
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx.flac b/cobalt/media/test/data/sfx.flac
deleted file mode 100644
index b3e4ede..0000000
--- a/cobalt/media/test/data/sfx.flac
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx.m4a b/cobalt/media/test/data/sfx.m4a
deleted file mode 100644
index 6dc4621..0000000
--- a/cobalt/media/test/data/sfx.m4a
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx.mp3 b/cobalt/media/test/data/sfx.mp3
deleted file mode 100644
index d9eb2f3..0000000
--- a/cobalt/media/test/data/sfx.mp3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx.ogg b/cobalt/media/test/data/sfx.ogg
deleted file mode 100644
index c569c8f..0000000
--- a/cobalt/media/test/data/sfx.ogg
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx_f32le.wav b/cobalt/media/test/data/sfx_f32le.wav
deleted file mode 100644
index d5ea6a1..0000000
--- a/cobalt/media/test/data/sfx_f32le.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx_s16le.wav b/cobalt/media/test/data/sfx_s16le.wav
deleted file mode 100644
index 00bc95f..0000000
--- a/cobalt/media/test/data/sfx_s16le.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx_s24le.wav b/cobalt/media/test/data/sfx_s24le.wav
deleted file mode 100644
index d2d5d46..0000000
--- a/cobalt/media/test/data/sfx_s24le.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx_s32le.wav b/cobalt/media/test/data/sfx_s32le.wav
deleted file mode 100644
index 5f670a9..0000000
--- a/cobalt/media/test/data/sfx_s32le.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sfx_u8.wav b/cobalt/media/test/data/sfx_u8.wav
deleted file mode 100644
index f8b397c..0000000
--- a/cobalt/media/test/data/sfx_u8.wav
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/speech_16b_mono_44kHz.raw b/cobalt/media/test/data/speech_16b_mono_44kHz.raw
deleted file mode 100644
index 29f7704..0000000
--- a/cobalt/media/test/data/speech_16b_mono_44kHz.raw
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/speech_16b_mono_48kHz.raw b/cobalt/media/test/data/speech_16b_mono_48kHz.raw
deleted file mode 100644
index 3241743..0000000
--- a/cobalt/media/test/data/speech_16b_mono_48kHz.raw
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/speech_16b_stereo_44kHz.raw b/cobalt/media/test/data/speech_16b_stereo_44kHz.raw
deleted file mode 100644
index cdbb644..0000000
--- a/cobalt/media/test/data/speech_16b_stereo_44kHz.raw
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/speech_16b_stereo_48kHz.raw b/cobalt/media/test/data/speech_16b_stereo_48kHz.raw
deleted file mode 100644
index e29432e..0000000
--- a/cobalt/media/test/data/speech_16b_stereo_48kHz.raw
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/speex_audio_vorbis_video.ogv b/cobalt/media/test/data/speex_audio_vorbis_video.ogv
deleted file mode 100644
index 313eddd..0000000
--- a/cobalt/media/test/data/speex_audio_vorbis_video.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sync2.ogv b/cobalt/media/test/data/sync2.ogv
deleted file mode 100644
index 6b328a2..0000000
--- a/cobalt/media/test/data/sync2.ogv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/sync_192p_20frames.yuv b/cobalt/media/test/data/sync_192p_20frames.yuv
deleted file mode 100644
index 35c6e92..0000000
--- a/cobalt/media/test/data/sync_192p_20frames.yuv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/ten_byte_file b/cobalt/media/test/data/ten_byte_file
deleted file mode 100644
index ad47100..0000000
--- a/cobalt/media/test/data/ten_byte_file
+++ /dev/null
@@ -1 +0,0 @@
-0123456789
\ No newline at end of file
diff --git a/cobalt/media/test/data/test-25fps.h264 b/cobalt/media/test/data/test-25fps.h264
deleted file mode 100644
index b1c36d9..0000000
--- a/cobalt/media/test/data/test-25fps.h264
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/test-25fps.h264.md5 b/cobalt/media/test/data/test-25fps.h264.md5
deleted file mode 100644
index 44fd5db..0000000
--- a/cobalt/media/test/data/test-25fps.h264.md5
+++ /dev/null
@@ -1,29 +0,0 @@
-# --test_video_data="test-25fps.h264:320:240:250:258:35:150:1"
-# Intel Sandy Brige - EGL
-42e78b8ac231dc24e6db5fac2d26da7b
-# Intel - Broadwell / Haswell - EGL
-11899ca545a269b6af28116b0480c0bd
-# Intel - Ivy Bridge - EGL
-d16d0662406b9d4ebb413ed3da3896e0
-# Intel - Haswell - X11
-# Intel - Ivy Bridge - X11
-5f697b015b7af0afa7ff202905f748fa
-# Intel - Sandy Bridge - X11
-07bac7ad907bcb75004324645637a06c
-# ARM - Exynos
-04436cf1cf06b4bb6c1efd838e68257d
-# ARM - Tegra
-b55cda7d10c37104d8c49d27c2699e40
-# ARM - MediaTek
-ab9205ea7da8e00fefe1094d43542fb2
-
-# TODO(llandwerlin): Remove the following hashes when the libva-intel-driver
-# is updated.
-# Intel Haswell - EGL
-92a0c14b4c1a13ca21317d2e75f17f76
-# Intel Ivy Bridge - EGL
-75d2f70272df8687dbda32e2eddd0a00
-# Intel (various) libva-intel-driver 1.5.1 with VA_PROC_PIPELINE_FAST
-8bbc743c7ac92c2442d09e8b3fb9f4f5
-# Intel - SKL
-2ec057b15cd26d087b8df10003493085
diff --git a/cobalt/media/test/data/test-25fps.vp8 b/cobalt/media/test/data/test-25fps.vp8
deleted file mode 100644
index dc22d43..0000000
--- a/cobalt/media/test/data/test-25fps.vp8
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/test-25fps.vp8.md5 b/cobalt/media/test/data/test-25fps.vp8.md5
deleted file mode 100644
index 569fe2d..0000000
--- a/cobalt/media/test/data/test-25fps.vp8.md5
+++ /dev/null
@@ -1,15 +0,0 @@
-# ARM - Exynos
-10144053d714f6429efd266710513584
-# ARM - Tegra
-cd355b553ce7660283c52675232e9227
-# ARM - MediaTek
-6232c99cc54aeccb43aff7a7f9daa6ab
-# Intel - BDW
-bea8039e6921d930bb1c86185f62b1b0
-
-# TODO(llandwerlin): Remove the following hash when the libva-intel-driver
-# is updated.
-# Intel - BDW
-4da7ec5484a99195c2c05b5e591940f9
-#Intel -SKL
-205a4000b3fbde1f2f927c8791c2afe9
diff --git a/cobalt/media/test/data/test-25fps.vp9 b/cobalt/media/test/data/test-25fps.vp9
deleted file mode 100644
index 385d1b4..0000000
--- a/cobalt/media/test/data/test-25fps.vp9
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/test-25fps.vp9.context b/cobalt/media/test/data/test-25fps.vp9.context
deleted file mode 100644
index 8add84c..0000000
--- a/cobalt/media/test/data/test-25fps.vp9.context
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/test-25fps.vp9.md5 b/cobalt/media/test/data/test-25fps.vp9.md5
deleted file mode 100644
index fd11e37..0000000
--- a/cobalt/media/test/data/test-25fps.vp9.md5
+++ /dev/null
@@ -1,11 +0,0 @@
-# ARM - GO2001
-7daba42a115da37a463edc2fa6d2ab8e
-# ARM - MediaTek
-230eea56e171984e9da376bc267d0a62
-
-# Intel - Haswell
-9dc9c009b062f98691a6151e322c7df2
-# Intel - Broadwell
-f85e57dadd517b171109580a6ebd9b34
-#Intel - SKL
-67dd7a5db69123d325485a6ebecbd6c0
diff --git a/cobalt/media/test/data/test_key_system_instantiation.html b/cobalt/media/test/data/test_key_system_instantiation.html
deleted file mode 100644
index f4e9993..0000000
--- a/cobalt/media/test/data/test_key_system_instantiation.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<html>
-  <body>
-    <script type="text/javascript">
-      // Since promises run asynchronously, use the pages title to keep track
-      // of the result.
-      function setResultInTitle(title) {
-        if (title == "" || title == "success" ||
-            title == "Unsupported keySystem" ||
-            title == "None of the requested configurations were supported.") {
-          document.title = title;
-        } else {
-          console.log("Unexpected result: " + title);
-          document.title = "unexpected result";
-        }
-      };
-
-      // Compares 2 arrays of MediaKeySystemMediaCapability, comparing only
-      // |contentType|. This assumes the order is the same. Returns "success"
-      // if they match, an error message if they don't.
-      function verifyCapabilitiesAreEqual(actual, expected) {
-        if (actual.length != expected.length)
-          return "mismatched lengths";
-        for (var i = 0; i < actual.length; i++) {
-          // Only compare |contentType|. Other properties are ignored.
-          if (actual[i].contentType !== expected[i].contentType)
-            return actual[i].contentType + " does not match " +
-                   expected[i].contentType + " at index " + i;
-        }
-        return "success";
-      }
-
-      // Calls navigator.requestMediaKeySystemAccess() using the supplied codec
-      // lists, and then verifies the result. Sets page title when done.
-      function requestMediaKeySystemAccessAndVerifyConfiguration(
-          keySystem, initDataType, audioCodecList, videoCodecList) {
-        var configuration = {
-            initDataTypes: [initDataType],
-            audioCapabilities: [],
-            videoCapabilities: []
-        };
-        if (audioCodecList !== null) {
-          for (entry of audioCodecList) {
-            configuration.audioCapabilities.push({contentType: entry});
-          };
-        }
-        if (videoCodecList !== null) {
-          for (entry of videoCodecList) {
-            configuration.videoCapabilities.push({contentType: entry});
-          };
-        }
-        // This is using promises which will run asynchronously.
-        navigator.requestMediaKeySystemAccess(keySystem, [configuration])
-            .then(function(response) {
-              var allowedConfig = response.getConfiguration();
-              if (allowedConfig.initDataTypes.length !== 1) {
-                setResultInTitle("initDataType length mismatch");
-                return;
-              }
-              if (allowedConfig.initDataTypes[0] !== initDataType) {
-                setResultInTitle("initDataType returned " +
-                                 allowedConfig.initDataTypes[0] +
-                                 ", expected " + initDataType);
-                return;
-              }
-              if (audioCodecList !== null) {
-                var result =
-                    verifyCapabilitiesAreEqual(allowedConfig.audioCapabilities,
-                                            configuration.audioCapabilities);
-                if (result !== "success") {
-                  setResultInTitle(result);
-                  return;
-                }
-              } else if (allowedConfig.audioCapabilities.length > 0) {
-                setResultInTitle("audioCapabilities set when none expected");
-                return;
-              }
-              if (videoCodecList !== null) {
-                setResultInTitle(
-                    verifyCapabilitiesAreEqual(allowedConfig.videoCapabilities,
-                                            configuration.videoCapabilities));
-                return;
-              } else if (allowedConfig.videoCapabilities.length > 0) {
-                setResultInTitle("videoCapabilities set when none expected");
-                return;
-              }
-              setResultInTitle("success");
-            })
-            .catch(function(err) { setResultInTitle(err.message); });
-      };
-
-      function checkKeySystemWithMediaMimeType(keySystem, initDataType,
-                                               audioCodecList, videoCodecList) {
-        setResultInTitle("");
-        requestMediaKeySystemAccessAndVerifyConfiguration(
-            keySystem, initDataType, audioCodecList, videoCodecList);
-      };
-    </script>
-  </body>
-</html>
diff --git a/cobalt/media/test/data/tulip2.webm b/cobalt/media/test/data/tulip2.webm
deleted file mode 100644
index a2774f6..0000000
--- a/cobalt/media/test/data/tulip2.webm
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vorbis-extradata b/cobalt/media/test/data/vorbis-extradata
deleted file mode 100644
index 1f95309..0000000
--- a/cobalt/media/test/data/vorbis-extradata
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vorbis-packet-0 b/cobalt/media/test/data/vorbis-packet-0
deleted file mode 100644
index 0e3739c..0000000
--- a/cobalt/media/test/data/vorbis-packet-0
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vorbis-packet-1 b/cobalt/media/test/data/vorbis-packet-1
deleted file mode 100644
index 035ccdb..0000000
--- a/cobalt/media/test/data/vorbis-packet-1
+++ /dev/null
@@ -1 +0,0 @@
-ìÊRdïÊRdKL£Š8/YÏù8v'·)ê}7¢‘Õ¢‘‰“Ÿ7o
\ No newline at end of file
diff --git a/cobalt/media/test/data/vorbis-packet-2 b/cobalt/media/test/data/vorbis-packet-2
deleted file mode 100644
index a01cb5d..0000000
--- a/cobalt/media/test/data/vorbis-packet-2
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vorbis-packet-3 b/cobalt/media/test/data/vorbis-packet-3
deleted file mode 100644
index b222e7d..0000000
--- a/cobalt/media/test/data/vorbis-packet-3
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vorbis_audio_wmv_video.mkv b/cobalt/media/test/data/vorbis_audio_wmv_video.mkv
deleted file mode 100644
index 612319f..0000000
--- a/cobalt/media/test/data/vorbis_audio_wmv_video.mkv
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vp8-I-frame-160x240 b/cobalt/media/test/data/vp8-I-frame-160x240
deleted file mode 100644
index 65e4337..0000000
--- a/cobalt/media/test/data/vp8-I-frame-160x240
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vp8-I-frame-320x120 b/cobalt/media/test/data/vp8-I-frame-320x120
deleted file mode 100644
index ba4e1e2..0000000
--- a/cobalt/media/test/data/vp8-I-frame-320x120
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vp8-I-frame-320x240 b/cobalt/media/test/data/vp8-I-frame-320x240
deleted file mode 100644
index 5b7bfb9..0000000
--- a/cobalt/media/test/data/vp8-I-frame-320x240
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vp8-I-frame-320x480 b/cobalt/media/test/data/vp8-I-frame-320x480
deleted file mode 100644
index 1ed59f0..0000000
--- a/cobalt/media/test/data/vp8-I-frame-320x480
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vp8-I-frame-640x240 b/cobalt/media/test/data/vp8-I-frame-640x240
deleted file mode 100644
index 87299cc..0000000
--- a/cobalt/media/test/data/vp8-I-frame-640x240
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/vp8-corrupt-I-frame b/cobalt/media/test/data/vp8-corrupt-I-frame
deleted file mode 100644
index 23afa84..0000000
--- a/cobalt/media/test/data/vp8-corrupt-I-frame
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/webm_content_encodings b/cobalt/media/test/data/webm_content_encodings
deleted file mode 100644
index c49fed2..0000000
--- a/cobalt/media/test/data/webm_content_encodings
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/webm_ebml_element b/cobalt/media/test/data/webm_ebml_element
deleted file mode 100644
index 9f0eb1b..0000000
--- a/cobalt/media/test/data/webm_ebml_element
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/webm_info_element b/cobalt/media/test/data/webm_info_element
deleted file mode 100644
index 1097d13..0000000
--- a/cobalt/media/test/data/webm_info_element
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/webm_vorbis_track_entry b/cobalt/media/test/data/webm_vorbis_track_entry
deleted file mode 100644
index a873521..0000000
--- a/cobalt/media/test/data/webm_vorbis_track_entry
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/data/webm_vp8_track_entry b/cobalt/media/test/data/webm_vp8_track_entry
deleted file mode 100644
index f544e9d..0000000
--- a/cobalt/media/test/data/webm_vp8_track_entry
+++ /dev/null
Binary files differ
diff --git a/cobalt/media/test/vp8.dict b/cobalt/media/test/vp8.dict
deleted file mode 100644
index 4d69827..0000000
--- a/cobalt/media/test/vp8.dict
+++ /dev/null
@@ -1,10 +0,0 @@
-"DKIF"
-"\x20\x00"
-"\x00,\x11"
-"\x9d\x01*"
-"\x00\x09\x10"
-"\x00\x05\x10"
-"\x00\x0e\x10"
-"\x00\x0b\x10"
-"\x00\x04\x10"
-
diff --git a/cobalt/media_capture/get_user_media_test.cc b/cobalt/media_capture/get_user_media_test.cc
index a01532f..fee9ad3 100644
--- a/cobalt/media_capture/get_user_media_test.cc
+++ b/cobalt/media_capture/get_user_media_test.cc
@@ -23,37 +23,29 @@
 #include "cobalt/script/global_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace {
-
-std::unique_ptr<cobalt::script::EnvironmentSettings> CreateDOMSettings() {
-  cobalt::dom::DOMSettings::Options options;
-#if defined(ENABLE_FAKE_MICROPHONE)
-  options.microphone_options.enable_fake_microphone = true;
-#endif  // defined(ENABLE_FAKE_MICROPHONE)
-
-  return std::unique_ptr<cobalt::script::EnvironmentSettings>(
-      new cobalt::dom::testing::StubEnvironmentSettings(options));
-}
-
-}  // namespace.
-
 namespace cobalt {
 namespace media_capture {
 
 class GetUserMediaTest : public ::testing::Test {
  protected:
-  GetUserMediaTest()
-      : window_(CreateDOMSettings()),
-        media_devices_(new MediaDevices(
-            window_.environment_settings(),
-            window_.global_environment()->script_value_factory())) {}
+  GetUserMediaTest() {
+    cobalt::dom::DOMSettings::Options options;
+#if defined(ENABLE_FAKE_MICROPHONE)
+    options.microphone_options.enable_fake_microphone = true;
+#endif  // defined(ENABLE_FAKE_MICROPHONE)
+
+    window_.reset(new dom::testing::StubWindow(options));
+    media_devices_ =
+        new MediaDevices(window_->environment_settings(),
+                         window_->global_environment()->script_value_factory());
+  }
 
   media_stream::MicrophoneAudioSource* GetMicrophoneAudioSource() {
     return base::polymorphic_downcast<media_stream::MicrophoneAudioSource*>(
         media_devices_->audio_source_.get());
   }
 
-  dom::testing::StubWindow window_;
+  std::unique_ptr<dom::testing::StubWindow> window_;
   scoped_refptr<MediaDevices> media_devices_;
 };
 
diff --git a/cobalt/media_capture/media_capture.gyp b/cobalt/media_capture/media_capture.gyp
deleted file mode 100644
index 99b9687..0000000
--- a/cobalt/media_capture/media_capture.gyp
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'media_capture',
-      'type': 'static_library',
-      'sources': [
-        'encoders/audio_encoder.cc',
-        'encoders/audio_encoder.h',
-        'encoders/flac_audio_encoder.cc',
-        'encoders/flac_audio_encoder.h',
-        'encoders/linear16_audio_encoder.cc',
-        'encoders/linear16_audio_encoder.h',
-        'media_devices.cc',
-        'media_devices.h',
-        'media_device_info.cc',
-        'media_device_info.h',
-        'media_recorder.cc',
-        'media_recorder.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-        '<(DEPTH)/cobalt/media_stream/media_stream.gyp:media_stream',
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-      ],
-      'export_dependent_settings': [
-        # Additionally, ensure that the include directories for generated
-        # headers are put on the include directories for targets that depend
-        # on this one.
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ],
-      'conditions': [
-        ['sb_disable_microphone_idl==1', {
-          'defines': [
-            'DISABLE_MICROPHONE_IDL',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/cobalt/media_capture/media_capture_test.gyp b/cobalt/media_capture/media_capture_test.gyp
deleted file mode 100644
index 2d330ab..0000000
--- a/cobalt/media_capture/media_capture_test.gyp
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'media_capture_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'get_user_media_test.cc',
-        'media_recorder_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/dom/testing/dom_testing.gyp:dom_testing',
-        '<(DEPTH)/cobalt/media_capture/media_capture.gyp:media_capture',
-
-        # TODO: Remove the dependency below, it works around the fact that
-        #       ScriptValueFactory has non-virtual method CreatePromise().
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        # For Fake Microphone.
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'media_capture_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'media_capture_test',
-      ],
-      'variables': {
-        'executable_name': 'media_capture_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/media_capture/media_recorder.cc b/cobalt/media_capture/media_recorder.cc
index 6642bfc..11d6d86 100644
--- a/cobalt/media_capture/media_recorder.cc
+++ b/cobalt/media_capture/media_recorder.cc
@@ -17,6 +17,7 @@
 #include <algorithm>
 #include <cmath>
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
@@ -28,7 +29,6 @@
 #include "cobalt/base/tokens.h"
 #include "cobalt/dom/blob.h"
 #include "cobalt/dom/dom_exception.h"
-#include "cobalt/dom/dom_settings.h"
 #include "cobalt/media_capture/blob_event.h"
 #include "cobalt/media_capture/encoders/flac_audio_encoder.h"
 #include "cobalt/media_capture/encoders/linear16_audio_encoder.h"
@@ -37,6 +37,8 @@
 #include "cobalt/media_stream/media_stream_track.h"
 #include "cobalt/media_stream/media_track_settings.h"
 #include "cobalt/script/array_buffer.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace {
 
@@ -314,7 +316,8 @@
   DCHECK_LE(buffer_.size(), kuint32max);
 
   auto array_buffer = script::ArrayBuffer::New(
-      base::polymorphic_downcast<dom::DOMSettings*>(settings_)
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings_)
+          ->context()
           ->global_environment(),
       buffer_.data(), buffer_.size());
 
diff --git a/cobalt/media_integration_tests/_env.py b/cobalt/media_integration_tests/_env.py
deleted file mode 100644
index a289cbb..0000000
--- a/cobalt/media_integration_tests/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source  # pylint: disable=deprecated-module
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print('%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV))
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/media_integration_tests/endurance/_env.py b/cobalt/media_integration_tests/endurance/_env.py
deleted file mode 100644
index a9d83bf..0000000
--- a/cobalt/media_integration_tests/endurance/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/media_integration_tests/endurance/endurance_test.py b/cobalt/media_integration_tests/endurance/endurance_test.py
index edc6552..213ae65 100644
--- a/cobalt/media_integration_tests/endurance/endurance_test.py
+++ b/cobalt/media_integration_tests/endurance/endurance_test.py
@@ -18,7 +18,6 @@
 import random
 import time
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_app import Features, MediaSessionPlaybackState
 from cobalt.media_integration_tests.test_case import TestCase
 from cobalt.media_integration_tests.test_util import PlaybackUrls
diff --git a/cobalt/media_integration_tests/functionality/_env.py b/cobalt/media_integration_tests/functionality/_env.py
deleted file mode 100644
index a9d83bf..0000000
--- a/cobalt/media_integration_tests/functionality/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/media_integration_tests/functionality/general_playback.py b/cobalt/media_integration_tests/functionality/general_playback.py
index 6edc0ca..46d633d 100644
--- a/cobalt/media_integration_tests/functionality/general_playback.py
+++ b/cobalt/media_integration_tests/functionality/general_playback.py
@@ -15,7 +15,6 @@
 
 import logging
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_case import TestCase
 from cobalt.media_integration_tests.test_util import MimeStrings, PlaybackUrls
 
diff --git a/cobalt/media_integration_tests/functionality/live_playback.py b/cobalt/media_integration_tests/functionality/live_playback.py
index 7390116..258271b 100644
--- a/cobalt/media_integration_tests/functionality/live_playback.py
+++ b/cobalt/media_integration_tests/functionality/live_playback.py
@@ -15,7 +15,6 @@
 
 import time
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_case import TestCase
 from cobalt.media_integration_tests.test_util import PlaybackUrls
 
diff --git a/cobalt/media_integration_tests/functionality/playback_controls.py b/cobalt/media_integration_tests/functionality/playback_controls.py
index 13b1ec8..ada0bec 100644
--- a/cobalt/media_integration_tests/functionality/playback_controls.py
+++ b/cobalt/media_integration_tests/functionality/playback_controls.py
@@ -15,7 +15,6 @@
 
 import logging
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_case import TestCase
 from cobalt.media_integration_tests.test_util import PlaybackUrls
 
diff --git a/cobalt/media_integration_tests/functionality/suspend_resume.py b/cobalt/media_integration_tests/functionality/suspend_resume.py
index 5b7de5e..56952ed 100644
--- a/cobalt/media_integration_tests/functionality/suspend_resume.py
+++ b/cobalt/media_integration_tests/functionality/suspend_resume.py
@@ -16,7 +16,6 @@
 import logging
 import time
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_app import Features
 from cobalt.media_integration_tests.test_case import TestCase
 from cobalt.media_integration_tests.test_util import MimeStrings, PlaybackUrls
diff --git a/cobalt/media_integration_tests/media_integration_tests_runner.py b/cobalt/media_integration_tests/media_integration_tests_runner.py
index 7db2ab2..0c918cb 100644
--- a/cobalt/media_integration_tests/media_integration_tests_runner.py
+++ b/cobalt/media_integration_tests/media_integration_tests_runner.py
@@ -15,11 +15,11 @@
 
 Usage:
   To run all tests of a specific type:
-      "python media_integration_tests_runner.py
+      "python3 media_integration_tests_runner.py
       -p android-arm64 -c devel -w noinstall -log-level info
       --type functionality"
   To run a specific test (suspend_resume):
-      python media_integration_tests_runner.py
+      python3 media_integration_tests_runner.py
       -p android-arm64 -c devel -w noinstall -log-level info
       --type functionality --test_name suspend_resume"
 
@@ -28,11 +28,11 @@
 import argparse
 import importlib
 import logging
+import os
 import pkgutil
 import sys
 import unittest
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_app import Features
 from cobalt.media_integration_tests.test_case import SetLauncherParams, SetSupportedFeatures
 from starboard.tools import abstract_launcher
@@ -66,7 +66,7 @@
 
 
 def GetTestPackagePath(test_type):
-  if _TESTS_PATH.has_key(test_type):
+  if test_type in _TESTS_PATH:
     return _TESTS_PATH[test_type]
   return None
 
@@ -74,9 +74,12 @@
 def GetAllTestNamesInPackage(package_path):
   test_names = []
   loader = pkgutil.get_loader(package_path)
-  for sub_module in pkgutil.walk_packages([loader.filename]):
+  raw_path = loader.get_filename(package_path)
+  path = os.path.dirname(raw_path) if loader.is_package(
+      package_path) else raw_path
+  for sub_module in pkgutil.walk_packages([path]):
     _, sub_module_name, _ = sub_module
-    # Filter '_env' and '__init__'.
+    # Filter '__init__'.
     if sub_module_name[0] == '_':
       continue
     if not sub_module_name in test_names:
diff --git a/cobalt/media_integration_tests/performance/_env.py b/cobalt/media_integration_tests/performance/_env.py
deleted file mode 100644
index a9d83bf..0000000
--- a/cobalt/media_integration_tests/performance/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/media_integration_tests/performance/codec_capability.py b/cobalt/media_integration_tests/performance/codec_capability.py
index c117fd2..4178d07 100644
--- a/cobalt/media_integration_tests/performance/codec_capability.py
+++ b/cobalt/media_integration_tests/performance/codec_capability.py
@@ -15,7 +15,6 @@
 
 import logging
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_case import TestCase
 from cobalt.media_integration_tests.test_util import MimeStrings, PlaybackUrls
 
diff --git a/cobalt/media_integration_tests/performance/dropped_frames.py b/cobalt/media_integration_tests/performance/dropped_frames.py
index 89f426c..bcd0215 100644
--- a/cobalt/media_integration_tests/performance/dropped_frames.py
+++ b/cobalt/media_integration_tests/performance/dropped_frames.py
@@ -16,7 +16,6 @@
 import argparse
 import logging
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_case import TestCase
 from cobalt.media_integration_tests.test_util import MimeStrings, PlaybackUrls
 
diff --git a/cobalt/media_integration_tests/performance/start_latency.py b/cobalt/media_integration_tests/performance/start_latency.py
index 62b32f1..cb3f644 100644
--- a/cobalt/media_integration_tests/performance/start_latency.py
+++ b/cobalt/media_integration_tests/performance/start_latency.py
@@ -17,7 +17,6 @@
 import logging
 import time
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_app import AdsState
 from cobalt.media_integration_tests.test_case import TestCase
 from cobalt.media_integration_tests.test_util import MimeStrings, PlaybackUrls
diff --git a/cobalt/media_integration_tests/test_app.py b/cobalt/media_integration_tests/test_app.py
index b1fac98..a0f1b02 100644
--- a/cobalt/media_integration_tests/test_app.py
+++ b/cobalt/media_integration_tests/test_app.py
@@ -18,7 +18,6 @@
 import threading
 import time
 
-import _env  # pylint: disable=unused-import
 from cobalt.tools.automated_testing import cobalt_runner
 from cobalt.tools.automated_testing import webdriver_utils
 
@@ -41,7 +40,7 @@
   if not isinstance(query_result, dict):
     return default
 
-  if not query_result.has_key(key):
+  if key not in query_result:
     return default
 
   value = query_result[key]
@@ -330,7 +329,7 @@
       raise NotImplementedError
 
     metadata = None
-    if isinstance(query_result, dict) and query_result.has_key('metadata'):
+    if isinstance(query_result, dict) and 'metadata' in query_result:
       metadata = query_result['metadata']
 
     self.title = GetValueFromQueryResult(metadata, 'title', '')
diff --git a/cobalt/media_integration_tests/test_case.py b/cobalt/media_integration_tests/test_case.py
index 04b942a..d756418 100644
--- a/cobalt/media_integration_tests/test_case.py
+++ b/cobalt/media_integration_tests/test_case.py
@@ -16,7 +16,6 @@
 import logging
 import unittest
 
-import _env  # pylint: disable=unused-import
 from cobalt.media_integration_tests.test_app import TestApp
 
 # Global variables
@@ -57,7 +56,6 @@
 
   @staticmethod
   def IsFeatureSupported(feature):
-    global _supported_features
     return _supported_features[feature]
 
   @staticmethod
diff --git a/cobalt/media_integration_tests/test_util.py b/cobalt/media_integration_tests/test_util.py
index 6bd08d9..81b8e2a 100644
--- a/cobalt/media_integration_tests/test_util.py
+++ b/cobalt/media_integration_tests/test_util.py
@@ -15,8 +15,6 @@
 
 from collections import OrderedDict
 
-import _env  # pylint: disable=unused-import
-
 
 class MimeStrings():
   """
diff --git a/cobalt/media_session/media_session.gyp b/cobalt/media_session/media_session.gyp
deleted file mode 100644
index 42e4f55..0000000
--- a/cobalt/media_session/media_session.gyp
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'media_session',
-      'type': 'static_library',
-      'sources': [
-        'media_metadata.h',
-        'media_session.cc',
-        'media_session.h',
-        'media_session_client.cc',
-        'media_session_client.h',
-        'media_session_state.cc',
-        'media_session_state.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-      ],
-      # This target doesn't generate any headers, but it exposes generated
-      # header files (for idl dictionaries) through this module's public header
-      # files. So mark this target as a hard dependency to ensure that any
-      # dependent targets wait until this target (and its hard dependencies) are
-      # built.
-      'hard_dependency': 1,
-      'export_dependent_settings': [
-        # Additionally, ensure that the include directories for generated
-        # headers are put on the include directories for targets that depend
-        # on this one.
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ]
-    },
-  ],
-}
diff --git a/cobalt/media_session/media_session_client.cc b/cobalt/media_session/media_session_client.cc
index a5a2c3c..f62411e 100644
--- a/cobalt/media_session/media_session_client.cc
+++ b/cobalt/media_session/media_session_client.cc
@@ -37,6 +37,14 @@
 const base::TimeDelta kMaybeFreezeDelay =
     base::TimeDelta::FromMilliseconds(1500);
 
+int64_t GetPlaybackArea(const media::WebMediaPlayer* player) {
+  int width = player->GetNaturalWidth();
+  int height = player->GetNaturalHeight();
+  DCHECK_GE(width, 0);
+  DCHECK_GE(height, 0);
+  return static_cast<int64_t>(width) * height;
+}
+
 // Guess the media position state for the media session.
 void GuessMediaPositionState(MediaSessionState* session_state,
                              const media::WebMediaPlayer** guess_player,
@@ -45,8 +53,7 @@
   // media session. This isn't perfect, so it's best that the web app set the
   // media position state explicitly.
   if (*guess_player == nullptr ||
-      (*guess_player)->GetNaturalSize().GetArea() <
-          current_player->GetNaturalSize().GetArea()) {
+      GetPlaybackArea(*guess_player) < GetPlaybackArea(current_player)) {
     *guess_player = current_player;
 
     MediaPositionState position_state;
@@ -321,6 +328,12 @@
           const MediaImage& media_image(artwork.at(i));
           CobaltExtensionMediaImage ext_image;
           ext_image.src = media_image.src().c_str();
+          if (ext_image.src == nullptr) {
+            // src() is required, but Cobalt IDL parser doesn't enforce it.
+            // http://cs/cobalt/cobalt/media_session/media_image.idl?l=19
+            // https://wicg.github.io/mediasession/#dictdef-mediaimage
+            LOG(ERROR) << "Required src string for MediaImage is missing.";
+          }
           ext_image.size = media_image.sizes().c_str();
           ext_image.type = media_image.type().c_str();
           ext_artwork[i] = ext_image;
diff --git a/cobalt/media_session/media_session_test.gyp b/cobalt/media_session/media_session_test.gyp
deleted file mode 100644
index 9c2c8d7..0000000
--- a/cobalt/media_session/media_session_test.gyp
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'media_session_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'media_session_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/media_session/media_session.gyp:media_session',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'media_session_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'media_session_test',
-      ],
-      'variables': {
-        'executable_name': 'media_session_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ]
-}
-
-
diff --git a/cobalt/media_stream/media_stream.gyp b/cobalt/media_stream/media_stream.gyp
deleted file mode 100644
index da135da..0000000
--- a/cobalt/media_stream/media_stream.gyp
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'media_stream',
-      'type': 'static_library',
-      'sources': [
-        'audio_parameters.cc',
-        'audio_parameters.h',
-        'media_stream.h',
-        'media_stream_audio_deliverer.h',
-        'media_stream_audio_sink.h',
-        'media_stream_audio_source.cc',
-        'media_stream_audio_source.h',
-        'media_stream_audio_track.cc',
-        'media_stream_audio_track.h',
-        'media_stream_source.cc',
-        'media_stream_source.h',
-        'media_stream_track.h',
-        'microphone_audio_source.cc',
-        'microphone_audio_source.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-      ],
-      'export_dependent_settings': [
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ],
-    },
-  ],
-}
-
diff --git a/cobalt/media_stream/media_stream_test.gyp b/cobalt/media_stream/media_stream_test.gyp
deleted file mode 100644
index aac127c..0000000
--- a/cobalt/media_stream/media_stream_test.gyp
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'media_stream_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'audio_parameters_test.cc',
-        'media_stream_audio_source_test.cc',
-        'media_stream_audio_track_test.cc',
-        'media_stream_test.cc',
-        'testing/mock_media_stream_audio_sink.h',
-        'testing/mock_media_stream_audio_source.h',
-        'testing/mock_media_stream_audio_track.h',
-      ],
-      'dependencies': [
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/media_stream/media_stream.gyp:media_stream',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'media_stream_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'media_stream_test',
-      ],
-      'variables': {
-        'executable_name': 'media_stream_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
-
diff --git a/cobalt/network/BUILD.gn b/cobalt/network/BUILD.gn
index 4658ad4..499a31e 100644
--- a/cobalt/network/BUILD.gn
+++ b/cobalt/network/BUILD.gn
@@ -57,7 +57,7 @@
     "//url",
   ]
 
-  if (in_app_dial) {
+  if (enable_in_app_dial) {
     deps += [
       # DialService depends on http server.
       "//net:http_server",
diff --git a/cobalt/network/local_network.cc b/cobalt/network/local_network.cc
index b39878f..1fd2e2b 100644
--- a/cobalt/network/local_network.cc
+++ b/cobalt/network/local_network.cc
@@ -46,13 +46,9 @@
       return CompareNBytesOfAddress(ip, source_address, netmask,
                                     net::IPAddress::kIPv4AddressSize);
     case kSbSocketAddressTypeIpv6:
-#if SB_API_VERSION >= 12 || SB_HAS(IPV6)
-#if SB_API_VERSION >= 12
       if (SbSocketIsIpv6Supported())
-#endif
         return CompareNBytesOfAddress(ip, source_address, netmask,
                                       net::IPAddress::kIPv6AddressSize);
-#endif
     default:
       NOTREACHED() << "Invalid IP type " << ip.type;
   }
@@ -88,18 +84,14 @@
       return true;
     }
   }
-#if SB_API_VERSION >= 12
   if (!SbSocketIsIpv6Supported()) {
     return false;
   }
-#endif
-#if SB_API_VERSION >= 12 || SB_HAS(IPV6)
   if (ip.type == kSbSocketAddressTypeIpv6) {
     // Unique Local Addresses for IPv6 are _effectively_ fd00::/8.
     // See https://tools.ietf.org/html/rfc4193#section-3 for details.
     return ip.address[0] == 0xfd && ip.address[1] == 0;
   }
-#endif
 
   return false;
 }
diff --git a/cobalt/network/network.gyp b/cobalt/network/network.gyp
deleted file mode 100644
index 9b79c3a..0000000
--- a/cobalt/network/network.gyp
+++ /dev/null
@@ -1,142 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [ '../build/contents_dir.gypi' ],
-
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'network',
-      'type': 'static_library',
-      'sources': [
-        'socket_address_parser.cc',
-        'socket_address_parser.h',
-        'cookie_jar_impl.cc',
-        'cookie_jar_impl.h',
-        'job_factory_config.h',
-        'net_poster.cc',
-        'net_poster.h',
-        'local_network.cc',
-        'local_network.h',
-        'network_delegate.cc',
-        'network_delegate.h',
-        'network_event.h',
-        'network_module.cc',
-        'network_module.h',
-        'network_system.h',
-        'persistent_cookie_store.cc',
-        'persistent_cookie_store.h',
-        'proxy_config_service.h',
-        'starboard/network_system.cc',
-        'starboard/proxy_config_service.cc',
-        'switches.cc',
-        'switches.h',
-        'url_request_context.cc',
-        'url_request_context.h',
-        'url_request_context_getter.cc',
-        'url_request_context_getter.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/configuration/configuration.gyp:configuration',
-        '<(DEPTH)/cobalt/network_bridge/network_bridge.gyp:network_bridge',
-        '<(DEPTH)/cobalt/storage/storage.gyp:storage',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/cobalt/build/cobalt_build_id.gyp:cobalt_build_id',
-      ],
-      'conditions': [
-        ['in_app_dial == 1', {
-          'dependencies': [
-            # DialService depends on http server.
-            '<(DEPTH)/net/net.gyp:http_server',
-          ],
-        }],
-        ['enable_network_logging == 1', {
-          'sources': [
-            'cobalt_net_log.cc',
-            'cobalt_net_log.h',
-            'net_log_constants.cc',
-            'net_log_constants.h',
-          ],
-          'defines': [
-            'ENABLE_NETWORK_LOGGING',
-          ],
-        }],
-        ['enable_configure_request_job_factory == 1', {
-          'conditions': [
-            ['sb_evergreen == 0', {
-              'dependencies': [
-                '<@(cobalt_platform_dependencies)',
-              ],
-            }],
-          ],
-          'defines': [
-            'ENABLE_CONFIGURE_REQUEST_JOB_FACTORY',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'ENABLE_CONFIGURE_REQUEST_JOB_FACTORY',
-            ],
-          },
-        }],
-      ],
-      'export_dependent_settings': [
-        '<(DEPTH)/net/net.gyp:net',
-      ],
-      'include_dirs': [
-        # For cobalt_build_id.h
-        '<(SHARED_INTERMEDIATE_DIR)',
-      ],
-      'copies': [
-      {
-        'destination': '<(sb_static_contents_output_data_dir)/ssl',
-        'files': ['<(static_contents_source_dir)/ssl/certs/'],
-      }],
-      'all_dependent_settings': {
-        'variables': {
-          'content_deploy_subdirs': [ 'ssl/certs' ]
-        }
-      },
-    },
-    {
-      'target_name': 'network_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'local_network_test.cc',
-        'persistent_cookie_store_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'network',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'network_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'network_test',
-      ],
-      'variables': {
-        'executable_name': 'network_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/network/network_delegate.cc b/cobalt/network/network_delegate.cc
index 5fa850a..a4c1158 100644
--- a/cobalt/network/network_delegate.cc
+++ b/cobalt/network/network_delegate.cc
@@ -15,6 +15,7 @@
 #include "cobalt/network/network_delegate.h"
 
 #include <set>
+#include <utility>
 
 #include "cobalt/network/local_network.h"
 #include "cobalt/network/socket_address_parser.h"
@@ -64,12 +65,7 @@
   // This will be our host string if we are not using IPV6.
   host.append(valid_spec_cstr + parsed.host.begin,
               valid_spec_cstr + parsed.host.begin + parsed.host.len);
-#if SB_API_VERSION >= 12 || SB_HAS(IPV6)
-#if SB_API_VERSION >= 12
-  if (SbSocketIsIpv6Supported())
-#endif
-    host = url.HostNoBrackets();
-#endif
+  if (SbSocketIsIpv6Supported()) host = url.HostNoBrackets();
   if (net::HostStringIsLocalhost(host)) {
     return net::OK;
   }
diff --git a/cobalt/network/network_module.cc b/cobalt/network/network_module.cc
index dbacd7a..4eae9a8 100644
--- a/cobalt/network/network_module.cc
+++ b/cobalt/network/network_module.cc
@@ -75,6 +75,7 @@
 }
 
 std::string NetworkModule::GetUserAgent() const {
+  DCHECK(http_user_agent_settings_);
   return http_user_agent_settings_->GetUserAgent();
 }
 
diff --git a/cobalt/network/socket_address_parser.cc b/cobalt/network/socket_address_parser.cc
index 09bd538..ddfa3ca 100644
--- a/cobalt/network/socket_address_parser.cc
+++ b/cobalt/network/socket_address_parser.cc
@@ -49,17 +49,13 @@
       out_socket_address->type = kSbSocketAddressTypeIpv4;
       DCHECK_GE(sizeof(address_v4),
                 static_cast<std::size_t>(num_ipv4_components));
-      memcpy(out_socket_address->address, address_v4,
-                   num_ipv4_components);
+      memcpy(out_socket_address->address, address_v4, num_ipv4_components);
 
       return true;
     case url::CanonHostInfo::NEUTRAL:
-#if SB_API_VERSION >= 12
       if (!SbSocketIsIpv6Supported()) {
         return false;
       }
-#endif
-#if SB_API_VERSION >= 12 || SB_HAS(IPV6)
       unsigned char address_v6[net::IPAddress::kIPv6AddressSize];
       if (!url::IPv6AddressToNumber(spec, host_component, address_v6)) {
         break;
@@ -70,9 +66,6 @@
       static_assert(sizeof(address_v6) == net::IPAddress::kIPv6AddressSize, "");
       memcpy(out_socket_address->address, address_v6, sizeof(address_v6));
       return true;
-#else
-      return false;
-#endif
     case url::CanonHostInfo::BROKEN:
       break;
     case url::CanonHostInfo::IPV6:
diff --git a/cobalt/network/url_request_context.cc b/cobalt/network/url_request_context.cc
index e8cdf83..020410c 100644
--- a/cobalt/network/url_request_context.cc
+++ b/cobalt/network/url_request_context.cc
@@ -16,6 +16,8 @@
 
 #include <memory>
 #include <string>
+#include <utility>
+#include <vector>
 
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/configuration/configuration.h"
@@ -167,8 +169,24 @@
 
   storage_.set_http_network_session(
       std::make_unique<net::HttpNetworkSession>(params, context));
-  storage_.set_http_transaction_factory(std::unique_ptr<net::HttpNetworkLayer>(
-      new net::HttpNetworkLayer(storage_.http_network_session())));
+  std::vector<char> path(kSbFileMaxPath, 0);
+  if (!SbSystemGetPath(kSbSystemPathCacheDirectory, path.data(),
+                       kSbFileMaxPath)) {
+    storage_.set_http_transaction_factory(
+        std::unique_ptr<net::HttpNetworkLayer>(
+            new net::HttpNetworkLayer(storage_.http_network_session())));
+  } else {
+    // TODO: Set max size of cache in Starboard.
+    const int cache_size_mb = 24;
+    auto http_cache = std::make_unique<net::HttpCache>(
+        storage_.http_network_session(),
+        std::make_unique<net::HttpCache::DefaultBackend>(
+            net::DISK_CACHE, net::CACHE_BACKEND_COBALT,
+            base::FilePath(std::string(path.data())),
+            /* max_bytes */ 1024 * 1024 * cache_size_mb),
+        true);
+    storage_.set_http_transaction_factory(std::move(http_cache));
+  }
 
   auto* job_factory = new net::URLRequestJobFactoryImpl();
   job_factory->SetProtocolHandler(url::kDataScheme,
diff --git a/cobalt/network_bridge/network_bridge.gyp b/cobalt/network_bridge/network_bridge.gyp
deleted file mode 100644
index a2ed75d..0000000
--- a/cobalt/network_bridge/network_bridge.gyp
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'network_bridge',
-      'type': 'static_library',
-      'sources': [
-        'cookie_jar.h',
-        'net_poster.cc',
-        'net_poster.h',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/overlay_info/BUILD.gn b/cobalt/overlay_info/BUILD.gn
index b445d56..d2209fe 100644
--- a/cobalt/overlay_info/BUILD.gn
+++ b/cobalt/overlay_info/BUILD.gn
@@ -44,5 +44,4 @@
     "//cobalt/test:run_all_unittests",
     "//testing/gtest",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/cobalt/overlay_info/overlay_info.gyp b/cobalt/overlay_info/overlay_info.gyp
deleted file mode 100644
index 9aab7f5..0000000
--- a/cobalt/overlay_info/overlay_info.gyp
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'overlay_info',
-      'type': 'static_library',
-      'sources': [
-        'overlay_info_registry.cc',
-        'overlay_info_registry.h',
-        'qr_code_overlay.cc',
-        'qr_code_overlay.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-        '<(DEPTH)/cobalt/render_tree/render_tree.gyp:render_tree',
-        '<(DEPTH)/third_party/QR-Code-generator/qr_code_generator.gyp:qr_code_generator',
-      ],
-    },
-
-    {
-      'target_name': 'overlay_info_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'overlay_info_registry_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/overlay_info/overlay_info.gyp:overlay_info',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'overlay_info_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'overlay_info_test',
-      ],
-      'variables': {
-        'executable_name': 'overlay_info_test',
-      },
-      'includes': [ '../../starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/render_tree/node_visitor_test.cc b/cobalt/render_tree/node_visitor_test.cc
index 23bc5dd..184970c 100644
--- a/cobalt/render_tree/node_visitor_test.cc
+++ b/cobalt/render_tree/node_visitor_test.cc
@@ -109,15 +109,14 @@
 };
 
 class DummyBrush : public Brush {
-  void Accept(BrushVisitor* visitor) const override {
-  }
+  void Accept(BrushVisitor* visitor) const override {}
 
   base::TypeId GetTypeId() const override {
     return base::GetTypeId<DummyBrush>();
   }
 };
 
-bool SetBounds(const cobalt::math::Rect&) { return false; }
+bool SetBounds(int x, int y, int width, int height) { return false; }
 
 }  // namespace
 
diff --git a/cobalt/render_tree/punch_through_video_node.h b/cobalt/render_tree/punch_through_video_node.h
index 916f103..a172e2a 100644
--- a/cobalt/render_tree/punch_through_video_node.h
+++ b/cobalt/render_tree/punch_through_video_node.h
@@ -15,6 +15,8 @@
 #ifndef COBALT_RENDER_TREE_PUNCH_THROUGH_VIDEO_NODE_H_
 #define COBALT_RENDER_TREE_PUNCH_THROUGH_VIDEO_NODE_H_
 
+#include <utility>
+
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "cobalt/base/type_id.h"
@@ -39,7 +41,7 @@
 //          support punch out video rendering.
 class PunchThroughVideoNode : public Node {
  public:
-  typedef base::Callback<bool(const math::Rect&)> SetBoundsCB;
+  typedef base::Callback<bool(int x, int y, int width, int height)> SetBoundsCB;
 
   struct Builder {
     Builder(const Builder&) = default;
@@ -57,7 +59,8 @@
 
   // Forwarding constructor to the set of Builder constructors.
   template <typename... Args>
-  PunchThroughVideoNode(Args&&... args) : data_(std::forward<Args>(args)...) {}
+  explicit PunchThroughVideoNode(Args&&... args)
+      : data_(std::forward<Args>(args)...) {}
 
   void Accept(NodeVisitor* visitor) override;
   math::RectF GetBounds() const override;
diff --git a/cobalt/render_tree/render_tree.gyp b/cobalt/render_tree/render_tree.gyp
deleted file mode 100644
index ddced7b..0000000
--- a/cobalt/render_tree/render_tree.gyp
+++ /dev/null
@@ -1,131 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-    'sb_pedantic_warnings': 1,
-  },
-
-  'targets': [
-    # Compiles code related to the definition of the render tree.  The render
-    # tree is the output of the layout stage and the input to the rendering
-    # stage.
-    {
-      'target_name': 'render_tree',
-      'type': 'static_library',
-      'sources': [
-        'blur_filter.h',
-        'border.cc',
-        'border.h',
-        'brush.cc',
-        'brush.h',
-        'brush_visitor.h',
-        'child_iterator.h',
-        'color_rgba.h',
-        'clear_rect_node.cc',
-        'clear_rect_node.h',
-        'composition_node.cc',
-        'composition_node.h',
-        'dump_render_tree_to_string.cc',
-        'filter_node.cc',
-        'filter_node.h',
-        'font.h',
-        'font_provider.h',
-        'glyph.h',
-        'glyph_buffer.h',
-        'lottie_animation.h',
-        'image_node.cc',
-        'image_node.h',
-        'lottie_node.cc',
-        'lottie_node.h',
-        'map_to_mesh_filter.h',
-        'matrix_transform_3d_node.cc',
-        'matrix_transform_3d_node.h',
-        'matrix_transform_node.cc',
-        'matrix_transform_node.h',
-        'mesh.h',
-        'node.h',
-        'node.cc',
-        'node_visitor.h',
-        'opacity_filter.h',
-        'punch_through_video_node.cc',
-        'rect_node.cc',
-        'rect_node.h',
-        'rect_shadow_node.cc',
-        'rect_shadow_node.h',
-        'resource_provider.h',
-        'resource_provider_stub.h',
-        'rounded_corners.h',
-        'rounded_corners.cc',
-        'rounded_viewport_filter.h',
-        'shadow.h',
-        'text_node.cc',
-        'text_node.h',
-        'typeface.h',
-        'viewport_filter.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-        '<(DEPTH)/third_party/ots/ots.gyp:ots',
-      ],
-    },
-
-    # Support for describing and applying render tree animations.
-    {
-      'target_name': 'animations',
-      'type': 'static_library',
-      'sources': [
-        'animations/animate_node.cc',
-        'animations/animate_node.h',
-      ],
-      'dependencies': [
-        'render_tree',
-      ],
-    },
-
-    # Tests the render tree utility functionality.
-    {
-      'target_name': 'render_tree_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'animations/animate_node_test.cc',
-        'brush_visitor_test.cc',
-        'color_rgba_test.cc',
-        'node_visitor_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'animations',
-        'render_tree',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    # Deploys the render tree library test on a console.
-    {
-      'target_name': 'render_tree_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'render_tree_test',
-      ],
-      'variables': {
-        'executable_name': 'render_tree_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/BUILD.gn b/cobalt/renderer/BUILD.gn
index 8cf5f18..2fbc58b 100644
--- a/cobalt/renderer/BUILD.gn
+++ b/cobalt/renderer/BUILD.gn
@@ -64,6 +64,7 @@
     "//cobalt/renderer/rasterizer/skia:hardware_rasterizer",
     "//cobalt/renderer/rasterizer/skia:software_rasterizer",
     "//cobalt/system_window",
+    "//cobalt/watchdog",
     "//nb",
     "//starboard:starboard_headers_only",
   ]
@@ -125,9 +126,6 @@
   deps = [
     ":render_tree_pixel_tester",
     ":renderer",
-    ":renderer_copy_lottie_test_data",
-    ":renderer_copy_test_data",
-    ":renderer_download_lottie_test_data",
     ":renderer_headers_only",
     "//base:i18n",
     "//cobalt/base",
@@ -141,9 +139,26 @@
     "//testing/gtest",
     "//third_party/icu:icuuc",
   ]
+
+  data_deps = [
+    ":renderer_copy_lottie_test_data",
+    ":renderer_copy_test_data",
+    ":renderer_download_lottie_test_data",
+  ]
+
+  content_deps = data_deps
+  if (cobalt_font_package == "empty") {
+    content_deps += [ "//cobalt/content/fonts:copy_font_data" ]
+  } else {
+    content_deps += [
+      "//cobalt/content/fonts:copy_fonts",
+      "//cobalt/content/fonts:fonts_xml",
+    ]
+  }
 }
 
 copy("renderer_copy_test_data") {
+  install_content = true
   sources = [
     "rasterizer/testdata/2xSpeedLottieAnimationTest-expected.png",
     "rasterizer/testdata/AlmostCircleViaRoundedCorners-expected.png",
@@ -478,6 +493,8 @@
 _lottie_resource_path = "rasterizer/testdata/lottie_coverage"
 
 copy("renderer_copy_lottie_test_data") {
+  install_content = true
+
   # TODO(b/211909342): List the individual files that are to be copied.
   sources = [ _lottie_resource_path ]
   deps = [ ":renderer_download_lottie_test_data" ]
@@ -486,6 +503,8 @@
 }
 
 action("renderer_download_lottie_test_data") {
+  install_content = true
+
   script = "//tools/download_from_gcs.py"
 
   inputs = [
diff --git a/cobalt/renderer/backend/BUILD.gn b/cobalt/renderer/backend/BUILD.gn
index 92f235b..beb3ca2 100644
--- a/cobalt/renderer/backend/BUILD.gn
+++ b/cobalt/renderer/backend/BUILD.gn
@@ -38,5 +38,4 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/cobalt/renderer/backend/backend.gyp b/cobalt/renderer/backend/backend.gyp
deleted file mode 100644
index 3b012e0..0000000
--- a/cobalt/renderer/backend/backend.gyp
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'renderer_backend',
-      'type': 'static_library',
-      'sources': [
-        'graphics_context.cc',
-        'graphics_context.h',
-        'render_target.cc',
-        'render_target.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-        '<(DEPTH)/cobalt/renderer/backend/starboard/platform_backend.gyp:renderer_platform_backend',
-      ],
-      'conditions': [
-        ['enable_map_to_mesh != -1', {
-          'defines' : [
-            'ENABLE_MAP_TO_MESH=<(enable_map_to_mesh)',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'graphics_system_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'graphics_system_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/cobalt/renderer/backend/backend.gyp:renderer_backend',
-        '<(DEPTH)/cobalt/system_window/system_window.gyp:system_window',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'graphics_system_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'graphics_system_test',
-      ],
-      'variables': {
-        'executable_name': 'graphics_system_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/backend/egl/display.cc b/cobalt/renderer/backend/egl/display.cc
index bdd85f9..e9398cc 100644
--- a/cobalt/renderer/backend/egl/display.cc
+++ b/cobalt/renderer/backend/egl/display.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/backend/egl/display.h"
 
@@ -93,5 +92,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/egl/egl_backend.gyp b/cobalt/renderer/backend/egl/egl_backend.gyp
deleted file mode 100644
index 8e28967..0000000
--- a/cobalt/renderer/backend/egl/egl_backend.gyp
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'egl_backend',
-      'type': 'static_library',
-
-      'sources': [
-        'display.cc',
-        'display.h',
-        'framebuffer.h',
-        'framebuffer.cc',
-        'framebuffer_render_target.h',
-        'graphics_context.cc',
-        'graphics_context.h',
-        'graphics_system.cc',
-        'graphics_system.h',
-        'pbuffer_render_target.cc',
-        'pbuffer_render_target.h',
-        'render_target.h',
-        'resource_context.cc',
-        'resource_context.h',
-        'texture.cc',
-        'texture.h',
-        'texture_data.cc',
-        'texture_data.h',
-        'texture_data_cpu.cc',
-        'texture_data_cpu.h',
-        'texture_data_pbo.cc',
-        'texture_data_pbo.h',
-        'utils.cc',
-        'utils.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/configuration/configuration.gyp:configuration',
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/backend/egl/framebuffer.cc b/cobalt/renderer/backend/egl/framebuffer.cc
index 16a20e7..6348e81 100644
--- a/cobalt/renderer/backend/egl/framebuffer.cc
+++ b/cobalt/renderer/backend/egl/framebuffer.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/backend/egl/framebuffer.h"
 
@@ -33,10 +32,13 @@
     : graphics_context_(graphics_context), size_(size), error_(false) {
   GraphicsContextEGL::ScopedMakeCurrent scoped_make_current(graphics_context_);
 
+  SbGlEnum gl_error;
+
   // Create the framebuffer object.
   GL_CALL_SIMPLE(glGenFramebuffers(1, &framebuffer_handle_));
-  if (GL_CALL_SIMPLE(glGetError()) != GL_NO_ERROR) {
-    LOG(ERROR) << "Error creating new framebuffer.";
+  gl_error = GL_CALL_SIMPLE(glGetError());
+  if (gl_error != GL_NO_ERROR) {
+    LOG(ERROR) << "Error creating new framebuffer. Error = " << gl_error;
     error_ = true;
     return;
   }
@@ -45,8 +47,9 @@
   // Create and attach a texture for color.
   GLuint color_handle = 0;
   GL_CALL_SIMPLE(glGenTextures(1, &color_handle));
-  if (GL_CALL_SIMPLE(glGetError()) != GL_NO_ERROR) {
-    LOG(ERROR) << "Error creating new texture.";
+  gl_error = GL_CALL_SIMPLE(glGetError());
+  if (gl_error != GL_NO_ERROR) {
+    LOG(ERROR) << "Error creating new texture. Error = " << gl_error;
     error_ = true;
     GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, 0));
     GL_CALL(glDeleteFramebuffers(1, &framebuffer_handle_));
@@ -148,5 +151,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/egl/graphics_context.cc b/cobalt/renderer/backend/egl/graphics_context.cc
index 480ac6d..d46389d 100644
--- a/cobalt/renderer/backend/egl/graphics_context.cc
+++ b/cobalt/renderer/backend/egl/graphics_context.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include <algorithm>
 #include <memory>
 #include <utility>
@@ -33,8 +30,9 @@
 #include "cobalt/renderer/backend/egl/texture_data.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 
-#if defined(GLES3_SUPPORTED) && SB_API_VERSION >= 12
+#if defined(GLES3_SUPPORTED)
 #error "Support for gles3 features has been deprecated."
 #endif
 
@@ -61,9 +59,6 @@
       display_(display),
       config_(config),
       is_current_(false) {
-#if SB_API_VERSION < 12 && defined(GLES3_SUPPORTED)
-  context_ = CreateGLES3Context(display, config, resource_context->context());
-#else
   // Create an OpenGL ES 2.0 context.
   EGLint context_attrib_list[] = {
       EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE,
@@ -71,7 +66,6 @@
   context_ = EGL_CALL_SIMPLE(
       eglCreateContext(display, config, EGL_NO_CONTEXT, context_attrib_list));
   CHECK_EQ(EGL_SUCCESS, EGL_CALL_SIMPLE(eglGetError()));
-#endif
 
   // Create a dummy EGLSurface object to be assigned as the target surface
   // when we need to make OpenGL calls that do not depend on a surface (e.g.
@@ -577,5 +571,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/egl/graphics_system.cc b/cobalt/renderer/backend/egl/graphics_system.cc
index d2642a5..e23cf9c 100644
--- a/cobalt/renderer/backend/egl/graphics_system.cc
+++ b/cobalt/renderer/backend/egl/graphics_system.cc
@@ -12,19 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
+#include "cobalt/renderer/backend/egl/graphics_system.h"
 
 #include <memory>
 #include <utility>
 
-#include "cobalt/renderer/backend/egl/graphics_system.h"
-
 #include "base/debug/leak_annotations.h"
 #if defined(ENABLE_GLIMP_TRACING)
 #include "base/trace_event/trace_event.h"
 #endif
-#include "starboard/common/optional.h"
 
 #include "cobalt/configuration/configuration.h"
 #include "cobalt/renderer/backend/egl/display.h"
@@ -38,13 +34,13 @@
 #include "cobalt/renderer/egl_and_gles.h"
 
 #if defined(GLES3_SUPPORTED)
-#if SB_API_VERSION >= 12
 #error "Support for gles3 features has been deprecated."
-#endif
 #include "cobalt/renderer/backend/egl/texture_data_pbo.h"
 #else
 #include "cobalt/renderer/backend/egl/texture_data_cpu.h"
 #endif
+#include "starboard/common/optional.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
@@ -153,6 +149,7 @@
     // mesa egl drivers still leak memory.
     ANNOTATE_SCOPED_MEMORY_LEAK;
     EGL_CALL(eglInitialize(display_, NULL, NULL));
+    LOG(INFO) << "eglInitialize returned " << EGL_CALL_SIMPLE(eglGetError());
   }
 
   // Setup our configuration to support RGBA and compatibility with PBuffer
@@ -161,26 +158,19 @@
       configuration::Configuration::GetInstance()->CobaltRenderDirtyRegionOnly()
           ? EGL_WINDOW_BIT | EGL_PBUFFER_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT
           : EGL_WINDOW_BIT | EGL_PBUFFER_BIT;
-  EGLint attribute_list[] = {
-    EGL_SURFACE_TYPE,  // this must be first
-    egl_bit,
-    EGL_RED_SIZE,
-    8,
-    EGL_GREEN_SIZE,
-    8,
-    EGL_BLUE_SIZE,
-    8,
-    EGL_ALPHA_SIZE,
-    8,
-    EGL_RENDERABLE_TYPE,
-#if SB_API_VERSION < 12 && defined(GLES3_SUPPORTED)
-    EGL_OPENGL_ES3_BIT,
-#else
-    EGL_OPENGL_ES2_BIT,
-#endif  // #if SB_API_VERSION < 12 &&
-        // defined(GLES3_SUPPORTED)
-    EGL_NONE
-  };
+  EGLint attribute_list[] = {EGL_SURFACE_TYPE,  // this must be first
+                             egl_bit,
+                             EGL_RED_SIZE,
+                             8,
+                             EGL_GREEN_SIZE,
+                             8,
+                             EGL_BLUE_SIZE,
+                             8,
+                             EGL_ALPHA_SIZE,
+                             8,
+                             EGL_RENDERABLE_TYPE,
+                             EGL_OPENGL_ES2_BIT,
+                             EGL_NONE};
 
   base::Optional<ChooseConfigResult> choose_config_results =
       ChooseConfig(display_, attribute_list, system_window);
@@ -207,10 +197,6 @@
   config_ = choose_config_results->config;
   system_window_ = system_window;
   window_surface_ = choose_config_results->window_surface;
-
-#if SB_API_VERSION < 12 && defined(GLES3_SUPPORTED)
-  resource_context_.emplace(display_, config_);
-#endif
 }
 
 GraphicsSystemEGL::~GraphicsSystemEGL() {
@@ -221,6 +207,7 @@
   }
 
   EGL_CALL_SIMPLE(eglTerminate(display_));
+  LOG(INFO) << "eglTerminate returned " << EGL_CALL_SIMPLE(eglGetError());
 }
 
 std::unique_ptr<Display> GraphicsSystemEGL::CreateDisplay(
@@ -242,29 +229,20 @@
 }
 
 std::unique_ptr<GraphicsContext> GraphicsSystemEGL::CreateGraphicsContext() {
-// If GLES3 is supported, we will make use of PBOs to allocate buffers for
-// texture data and populate them on separate threads.  In order to access
-// that data from graphics contexts created through this method, we must
-// enable sharing between them and the resource context, which is why we
-// must pass it in here.
-#if SB_API_VERSION < 12 && defined(GLES3_SUPPORTED)
-  ResourceContext* resource_context = &(resource_context_.value());
-#else
+  // If GLES3 is supported, we will make use of PBOs to allocate buffers for
+  // texture data and populate them on separate threads.  In order to access
+  // that data from graphics contexts created through this method, we must
+  // enable sharing between them and the resource context, which is why we
+  // must pass it in here.
   ResourceContext* resource_context = NULL;
-#endif
   return std::unique_ptr<GraphicsContext>(
       new GraphicsContextEGL(this, display_, config_, resource_context));
 }
 
 std::unique_ptr<TextureDataEGL> GraphicsSystemEGL::AllocateTextureData(
     const math::Size& size, GLenum format) {
-#if SB_API_VERSION < 12 && defined(GLES3_SUPPORTED)
-  std::unique_ptr<TextureDataEGL> texture_data(
-      new TextureDataPBO(&(resource_context_.value()), size, format));
-#else
   std::unique_ptr<TextureDataEGL> texture_data(
       new TextureDataCPU(size, format));
-#endif
   if (texture_data->CreationError()) {
     return std::unique_ptr<TextureDataEGL>();
   } else {
@@ -275,13 +253,8 @@
 std::unique_ptr<RawTextureMemoryEGL>
 GraphicsSystemEGL::AllocateRawTextureMemory(size_t size_in_bytes,
                                             size_t alignment) {
-#if SB_API_VERSION < 12 && defined(GLES3_SUPPORTED)
-  return std::unique_ptr<RawTextureMemoryEGL>(new RawTextureMemoryPBO(
-      &(resource_context_.value()), size_in_bytes, alignment));
-#else
   return std::unique_ptr<RawTextureMemoryEGL>(
       new RawTextureMemoryCPU(size_in_bytes, alignment));
-#endif
 }
 
 math::Size GraphicsSystemEGL::GetWindowSize() const {
@@ -291,5 +264,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/egl/pbuffer_render_target.cc b/cobalt/renderer/backend/egl/pbuffer_render_target.cc
index 3247621..43c2499 100644
--- a/cobalt/renderer/backend/egl/pbuffer_render_target.cc
+++ b/cobalt/renderer/backend/egl/pbuffer_render_target.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/backend/egl/pbuffer_render_target.h"
 
@@ -29,11 +28,9 @@
                                                const math::Size& dimensions)
     : display_(display), config_(config), size_(dimensions) {
   EGLint surface_attrib_list[] = {
-      EGL_WIDTH, dimensions.width(),
-      EGL_HEIGHT, dimensions.height(),
-      EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
-      EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
-      EGL_NONE,
+      EGL_WIDTH,           dimensions.width(), EGL_HEIGHT,
+      dimensions.height(), EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
+      EGL_TEXTURE_FORMAT,  EGL_TEXTURE_RGBA,   EGL_NONE,
   };
   // When a dummy 0-area render target is requested, it will not be used as a
   // drawing target and we therefore don't require for it to be a texture.
@@ -46,16 +43,16 @@
 
   surface_ = EGL_CALL_SIMPLE(
       eglCreatePbufferSurface(display_, config_, surface_attrib_list));
-  if (EGL_CALL_SIMPLE(eglGetError()) != EGL_SUCCESS) {
+  SbEglInt32 egl_error = EGL_CALL_SIMPLE(eglGetError());
+  if (egl_error != EGL_SUCCESS) {
     surface_ = EGL_NO_SURFACE;
+    LOG(INFO) << "eglCreatePbufferSurface returned error " << egl_error;
   }
 }
 
 const math::Size& PBufferRenderTargetEGL::GetSize() const { return size_; }
 
-EGLSurface PBufferRenderTargetEGL::GetSurface() const {
-  return surface_;
-}
+EGLSurface PBufferRenderTargetEGL::GetSurface() const { return surface_; }
 
 PBufferRenderTargetEGL::~PBufferRenderTargetEGL() {
   if (surface_ != EGL_NO_SURFACE) {
@@ -66,5 +63,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/egl/resource_context.cc b/cobalt/renderer/backend/egl/resource_context.cc
index 7d1e886..a397e6d 100644
--- a/cobalt/renderer/backend/egl/resource_context.cc
+++ b/cobalt/renderer/backend/egl/resource_context.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/backend/egl/resource_context.h"
 
@@ -60,7 +59,7 @@
   function.Run();
   event->Signal();
 }
-}
+}  // namespace
 
 void ResourceContext::RunSynchronouslyWithinResourceContext(
     const base::Closure& function) {
@@ -84,8 +83,8 @@
 }
 
 void ResourceContext::ShutdownOnResourceThread() {
-  EGL_CALL(eglMakeCurrent(
-      display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+  EGL_CALL(
+      eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
 
   EGL_CALL(eglDestroySurface(display_, null_surface_));
   EGL_CALL(eglDestroyContext(display_, context_));
@@ -94,5 +93,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/egl/texture.cc b/cobalt/renderer/backend/egl/texture.cc
index a0ed040..9039377 100644
--- a/cobalt/renderer/backend/egl/texture.cc
+++ b/cobalt/renderer/backend/egl/texture.cc
@@ -12,11 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/backend/egl/texture.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/renderer/backend/egl/framebuffer_render_target.h"
@@ -27,14 +26,15 @@
 #include "cobalt/renderer/backend/egl/texture_data_cpu.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
+
 
 namespace cobalt {
 namespace renderer {
 namespace backend {
 
 namespace {
-void DoNothing() {
-}
+void DoNothing() {}
 }  // namespace
 
 TextureEGL::TextureEGL(GraphicsContextEGL* graphics_context,
@@ -70,9 +70,8 @@
       target_(target),
       delete_function_(std::move(delete_function)) {}
 
-TextureEGL::TextureEGL(
-    GraphicsContextEGL* graphics_context,
-    const scoped_refptr<RenderTargetEGL>& render_target)
+TextureEGL::TextureEGL(GraphicsContextEGL* graphics_context,
+                       const scoped_refptr<RenderTargetEGL>& render_target)
     : graphics_context_(graphics_context),
       size_(render_target->GetSize()),
       format_(GL_RGBA),
@@ -84,8 +83,8 @@
   if (render_target->GetSurface() != EGL_NO_SURFACE) {
     // This is a PBufferRenderTargetEGL. Need to bind a texture to the surface.
     const PBufferRenderTargetEGL* pbuffer_target =
-        base::polymorphic_downcast<const PBufferRenderTargetEGL*>
-            (render_target.get());
+        base::polymorphic_downcast<const PBufferRenderTargetEGL*>(
+            render_target.get());
 
     // First we create the OpenGL texture object and maintain a handle to it.
     GL_CALL(glGenTextures(1, &gl_handle_));
@@ -96,15 +95,14 @@
     // texture object, effectively allowing the PBO render target to be used
     // as a texture by referencing gl_handle_ from now on.
     EGL_CALL(eglBindTexImage(pbuffer_target->display(),
-                             pbuffer_target->GetSurface(),
-                             EGL_BACK_BUFFER));
+                             pbuffer_target->GetSurface(), EGL_BACK_BUFFER));
 
     GL_CALL(glBindTexture(GL_TEXTURE_2D, 0));
   } else {
     // This is a FramebufferRenderTargetEGL. Wrap its color texture attachment.
     const FramebufferRenderTargetEGL* framebuffer_target =
-        base::polymorphic_downcast<const FramebufferRenderTargetEGL*>
-            (render_target.get());
+        base::polymorphic_downcast<const FramebufferRenderTargetEGL*>(
+            render_target.get());
 
     const TextureEGL* color_attachment = framebuffer_target->GetColorTexture();
     format_ = color_attachment->GetFormat();
@@ -122,11 +120,10 @@
   if (source_render_target_ &&
       source_render_target_->GetSurface() != EGL_NO_SURFACE) {
     const PBufferRenderTargetEGL* pbuffer_target =
-        base::polymorphic_downcast<const PBufferRenderTargetEGL*>
-            (source_render_target_.get());
+        base::polymorphic_downcast<const PBufferRenderTargetEGL*>(
+            source_render_target_.get());
     EGL_CALL(eglReleaseTexImage(pbuffer_target->display(),
-                                pbuffer_target->GetSurface(),
-                                EGL_BACK_BUFFER));
+                                pbuffer_target->GetSurface(), EGL_BACK_BUFFER));
   }
 
   if (!delete_function_.is_null()) {
@@ -139,5 +136,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/egl/texture_data.cc b/cobalt/renderer/backend/egl/texture_data.cc
index 2c971c5..3804155 100644
--- a/cobalt/renderer/backend/egl/texture_data.cc
+++ b/cobalt/renderer/backend/egl/texture_data.cc
@@ -13,10 +13,8 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/backend/egl/texture_data.h"
-
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
 
@@ -34,5 +32,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/egl/texture_data_cpu.cc b/cobalt/renderer/backend/egl/texture_data_cpu.cc
index b25aa12..4dfbdf6 100644
--- a/cobalt/renderer/backend/egl/texture_data_cpu.cc
+++ b/cobalt/renderer/backend/egl/texture_data_cpu.cc
@@ -12,15 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/backend/egl/texture_data_cpu.h"
 
+#include <memory>
 #include "base/memory/aligned_memory.h"
 #include "cobalt/renderer/backend/egl/graphics_context.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
@@ -54,7 +53,7 @@
         base::AlignedAlloc(width_in_bytes * size.height(), 8)));
     for (int i = 0; i < size.height(); ++i) {
       memcpy(buffer_for_pitch_adjustment.get() + i * width_in_bytes,
-                   data + i * pitch_in_bytes, width_in_bytes);
+             data + i * pitch_in_bytes, width_in_bytes);
     }
     data = reinterpret_cast<uint8_t*>(buffer_for_pitch_adjustment.get());
   }
@@ -121,5 +120,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/egl/texture_data_pbo.cc b/cobalt/renderer/backend/egl/texture_data_pbo.cc
index a18e16d..916869f 100644
--- a/cobalt/renderer/backend/egl/texture_data_pbo.cc
+++ b/cobalt/renderer/backend/egl/texture_data_pbo.cc
@@ -13,9 +13,7 @@
 // limitations under the License.
 
 #if defined(GLES3_SUPPORTED)
-#if SB_API_VERSION >= 12
 #error "Support for gles3 features has been deprecated."
-#endif
 
 #include "cobalt/renderer/backend/egl/texture_data_pbo.h"
 
diff --git a/cobalt/renderer/backend/egl/texture_data_pbo.h b/cobalt/renderer/backend/egl/texture_data_pbo.h
index 8045add..fc86f88 100644
--- a/cobalt/renderer/backend/egl/texture_data_pbo.h
+++ b/cobalt/renderer/backend/egl/texture_data_pbo.h
@@ -16,9 +16,7 @@
 #define COBALT_RENDERER_BACKEND_EGL_TEXTURE_DATA_PBO_H_
 
 #if defined(GLES3_SUPPORTED)
-#if SB_API_VERSION >= 12
 #error "Support for gles3 features has been deprecated."
-#endif
 
 #include <GLES3/gl3.h>
 
diff --git a/cobalt/renderer/backend/egl/utils.cc b/cobalt/renderer/backend/egl/utils.cc
index 1a4778c..fe50838 100644
--- a/cobalt/renderer/backend/egl/utils.cc
+++ b/cobalt/renderer/backend/egl/utils.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/backend/egl/utils.h"
 
@@ -67,5 +66,3 @@
 }  // namespace backend
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/backend/graphics_context.cc b/cobalt/renderer/backend/graphics_context.cc
index 3455980..91dcb0e 100644
--- a/cobalt/renderer/backend/graphics_context.cc
+++ b/cobalt/renderer/backend/graphics_context.cc
@@ -61,7 +61,6 @@
     const GraphicsContext* graphics_context) {
   const CobaltExtensionGraphicsApi* graphics_ext =
       graphics_context ? graphics_context->graphics_extension_ : nullptr;
-#if SB_API_VERSION >= 12
 #if defined(ENABLE_MAP_TO_MESH)
 #error "ENABLE_MAP_TO_MESH is deprecated after Starboard version 12, use "
   "the Cobalt graphics extension function IsMapToMeshEnabled() instead."
@@ -73,24 +72,6 @@
   // If there is a callable gles interface, assume map to mesh is enabled, as
   // it is for most platforms.
   return SbGetGlesInterface() != nullptr;
-#else  // SB_API_VERSION >= 12
-#if defined(ENABLE_MAP_TO_MESH)
-  if (graphics_ext && graphics_ext->version >= 3) {
-    DLOG(ERROR)
-        << "ENABLE_MAP_TO_MESH and "
-           "CobaltExtensionGraphicsApi::IsMapToMeshEnabled() are both defined. "
-           "Remove 'enable_map_to_mesh' from your \"gyp_configuration.gypi\" "
-           "file in favor of using IsMapToMeshEnabled().";
-  }
-  return static_cast<bool>(ENABLE_MAP_TO_MESH);
-#endif
-
-  if (graphics_ext && graphics_ext->version >= 3) {
-    return graphics_ext->IsMapToMeshEnabled();
-  }
-
-  return false;
-#endif  // SB_API_VERSION >= 12
 }
 
 }  // namespace backend
diff --git a/cobalt/renderer/backend/starboard/default_graphics_system.cc b/cobalt/renderer/backend/starboard/default_graphics_system.cc
index dbd849d..8ce9d35 100644
--- a/cobalt/renderer/backend/starboard/default_graphics_system.cc
+++ b/cobalt/renderer/backend/starboard/default_graphics_system.cc
@@ -19,9 +19,7 @@
 
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/configuration/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 #include "cobalt/renderer/backend/egl/graphics_system.h"
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
 #include "cobalt/renderer/backend/graphics_system_stub.h"
 #include "cobalt/system_window/system_window.h"
 
@@ -31,7 +29,6 @@
 
 std::unique_ptr<GraphicsSystem> CreateDefaultGraphicsSystem(
     system_window::SystemWindow* system_window) {
-#if SB_API_VERSION >= 12
   if (std::string(configuration::Configuration::GetInstance()
                       ->CobaltRasterizerType()) == "stub") {
     return std::unique_ptr<GraphicsSystem>(new GraphicsSystemStub());
@@ -39,13 +36,6 @@
     return std::unique_ptr<GraphicsSystem>(
         new GraphicsSystemEGL(system_window));
   }
-#else  // SB_API_VERSION >= 12
-#if SB_HAS(GLES2)
-  return std::unique_ptr<GraphicsSystem>(new GraphicsSystemEGL(system_window));
-#else
-  return std::unique_ptr<GraphicsSystem>(new GraphicsSystemStub());
-#endif
-#endif  // SB_API_VERSION >= 12
 }
 
 }  // namespace backend
diff --git a/cobalt/renderer/backend/starboard/platform_backend.gyp b/cobalt/renderer/backend/starboard/platform_backend.gyp
deleted file mode 100644
index 3b9f090..0000000
--- a/cobalt/renderer/backend/starboard/platform_backend.gyp
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'renderer_platform_backend',
-      'type': 'static_library',
-
-      'dependencies': [
-        '../egl/egl_backend.gyp:egl_backend',
-      ],
-
-      'sources': [
-        'default_graphics_system.cc',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/default_options_starboard.gyp b/cobalt/renderer/default_options_starboard.gyp
deleted file mode 100644
index 9ee645d..0000000
--- a/cobalt/renderer/default_options_starboard.gyp
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-     'target_name': 'default_options',
-      'type': 'static_library',
-      'sources': [
-        '<(DEPTH)/cobalt/renderer/get_default_rasterizer_for_platform.cc',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/get_default_rasterizer_for_platform.cc b/cobalt/renderer/get_default_rasterizer_for_platform.cc
index 8e64ca7..52c0cb0 100644
--- a/cobalt/renderer/get_default_rasterizer_for_platform.cc
+++ b/cobalt/renderer/get_default_rasterizer_for_platform.cc
@@ -37,7 +37,6 @@
       new rasterizer::stub::Rasterizer());
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 std::unique_ptr<rasterizer::Rasterizer> CreateGLESSoftwareRasterizer(
     backend::GraphicsContext* graphics_context,
     const RendererModule::Options& options) {
@@ -72,8 +71,6 @@
           options.purge_skia_font_caches_on_destruction,
           options.force_deterministic_rendering));
 }
-#endif  // #if SB_API_VERSION >= 12 ||
-        // SB_HAS(GLES2)
 
 }  // namespace
 
@@ -83,7 +80,6 @@
   if (rasterizer_type == "stub") {
     return {"stub", base::Bind(&CreateStubRasterizer)};
   }
-#if SB_API_VERSION >= 12
   if (SbGetGlesInterface()) {
     if (rasterizer_type == "direct-gles") {
       return {"gles", base::Bind(&CreateGLESHardwareRasterizer)};
@@ -95,18 +91,6 @@
     SB_DCHECK(false);
     return {};
   }
-#else  // SB_API_VERSION >= 12
-#if SB_HAS(GLES2)
-  if (rasterizer_type == "direct-gles") {
-    return {"gles", base::Bind(&CreateGLESHardwareRasterizer)};
-  } else {
-    return {"skia", base::Bind(&CreateSkiaHardwareRasterizer)};
-  }
-#else
-#error "GLES2 API must be available."
-  return {"", NULL};
-#endif
-#endif  // SB_API_VERSION >= 12
 }
 
 }  // namespace renderer
diff --git a/cobalt/renderer/glimp_shaders/glsl/shaders.gypi b/cobalt/renderer/glimp_shaders/glsl/shaders.gypi
deleted file mode 100644
index a8801f8..0000000
--- a/cobalt/renderer/glimp_shaders/glsl/shaders.gypi
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file defines 'glsl_keys', which is an input to glimp's
-# map_glsl_shaders.gypi tool used to map GLSL shaders to platform-specific
-# shaders, mapping them by filename.  The 'glsl_keys' variable defined here
-# lists all GLSL shaders intended to be used by Cobalt.  Make sure that this
-# is included before including 'glimp/map_glsl_shaders.gypi'.
-
-{
-  'variables': {
-    'glsl_shaders_dir': '<(DEPTH)/cobalt/renderer/glimp_shaders/glsl',
-    'glsl_shaders_0': [
-        '<!@pymod_do_main(starboard.build.gyp_functions file_glob <(DEPTH)/cobalt/renderer/glimp_shaders/glsl/ *.glsl)'
-    ],
-    'glsl_shaders': [
-        '<!@pymod_do_main(starboard.build.gyp_functions basename <@(glsl_shaders_0) )',
-    ],
-  }
-}
diff --git a/cobalt/renderer/pipeline.cc b/cobalt/renderer/pipeline.cc
index c49e72d..ebe5e14 100644
--- a/cobalt/renderer/pipeline.cc
+++ b/cobalt/renderer/pipeline.cc
@@ -29,15 +29,12 @@
 #include "cobalt/render_tree/clear_rect_node.h"
 #include "cobalt/render_tree/composition_node.h"
 #include "cobalt/render_tree/dump_render_tree_to_string.h"
+#include "cobalt/watchdog/watchdog.h"
 #include "nb/memory_scope.h"
 #include "starboard/system.h"
 
-using cobalt::render_tree::Node;
-using cobalt::render_tree::animations::AnimateNode;
-
 namespace cobalt {
 namespace renderer {
-
 namespace {
 
 #if !defined(COBALT_MINIMUM_FRAME_TIME_IN_MILLISECONDS)
@@ -70,6 +67,15 @@
 // occur manually when the animations expire.
 const size_t kRasterizeAnimationsTimerMaxEntries = 60;
 
+// The watchdog client name used to represent Pipeline.
+const char kWatchdogName[] = "renderer";
+// The watchdog time interval in microseconds allowed between pings before
+// triggering violations.
+const int64_t kWatchdogTimeInterval = 1000000;
+// The watchdog time wait in microseconds to initially wait before triggering
+// violations.
+const int64_t kWatchdogTimeWait = 2000000;
+
 void DestructSubmissionOnMessageLoop(base::MessageLoop* message_loop,
                                      std::unique_ptr<Submission> submission) {
   TRACE_EVENT0("cobalt::renderer", "DestructSubmissionOnMessageLoop()");
@@ -183,6 +189,7 @@
       enable_fps_stdout_(options.enable_fps_stdout),
       enable_fps_overlay_(options.enable_fps_overlay),
       fps_overlay_update_pending_(false) {
+
   TRACE_EVENT0("cobalt::renderer", "Pipeline::Pipeline()");
   // The actual Pipeline can be constructed from any thread, but we want
   // rasterizer_thread_checker_ to be associated with the rasterizer thread,
@@ -202,6 +209,10 @@
 }
 
 Pipeline::~Pipeline() {
+  // Unregisters Pipeline as a watchdog client.
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog) watchdog->Unregister(std::string(kWatchdogName));
+
   TRACE_EVENT0("cobalt::renderer", "Pipeline::~Pipeline()");
 
   // First we shutdown the submission queue.  We do this as a separate step from
@@ -323,6 +334,13 @@
 
   TRACE_EVENT0("cobalt::renderer", "Pipeline::SetNewRenderTree()");
 
+  // Registers Pipeline as a watchdog client.
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog)
+    watchdog->Register(std::string(kWatchdogName),
+                       base::kApplicationStateStarted, kWatchdogTimeInterval,
+                       kWatchdogTimeWait, watchdog::PING);
+
   // If a time fence is active, save the submission to be queued only after
   // we pass the time fence.  Overwrite any existing waiting submission in this
   // case.
@@ -346,25 +364,10 @@
         graphics_context_
             ? graphics_context_->GetMinimumFrameIntervalInMilliseconds()
             : -1.0f;
-#if SB_API_VERSION >= 12 && defined(COBALT_MINIMUM_FRAME_TIME_IN_MILLISECONDS)
+#if defined(COBALT_MINIMUM_FRAME_TIME_IN_MILLISECONDS)
 #error \
     "'cobalt_minimum_frame_time_in_milliseconds' was replaced by" \
     "CobaltExtensionGraphicsApi::GetMinimumFrameIntervalInMilliseconds."
-#elif SB_API_VERSION < 12 && defined(COBALT_MINIMUM_FRAME_TIME_IN_MILLISECONDS)
-    COMPILE_ASSERT(COBALT_MINIMUM_FRAME_TIME_IN_MILLISECONDS > 0,
-                   frame_time_must_be_positive);
-    if (minimum_frame_interval_milliseconds < 0.0f) {
-      minimum_frame_interval_milliseconds =
-          COBALT_MINIMUM_FRAME_TIME_IN_MILLISECONDS;
-    } else {
-      DLOG(ERROR)
-          << "COBALT_MINIMUM_FRAME_TIME_IN_MILLISECONDS and "
-             "CobaltExtensionGraphicsApi::GetMinimumFrameIntervalInMilliseconds"
-             "are both defined."
-             "Remove the 'cobalt_minimum_frame_time_in_milliseconds' ";
-      "from ../gyp_configuration.gypi in favor of the usage of "
-      "CobaltExtensionGraphicsApi::GetMinimumFrameIntervalInMilliseconds."
-    }
 #else
     if (minimum_frame_interval_milliseconds < 0.0f) {
       minimum_frame_interval_milliseconds =
@@ -385,6 +388,10 @@
   DCHECK_CALLED_ON_VALID_THREAD(rasterizer_thread_checker_);
   TRACE_EVENT0("cobalt::renderer", "Pipeline::ClearCurrentRenderTree()");
 
+  // Unregisters Pipeline as a watchdog client.
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog) watchdog->Unregister(std::string(kWatchdogName));
+
   ResetSubmissionQueue();
   rasterize_timer_ = base::nullopt;
 }
@@ -394,6 +401,10 @@
   DCHECK_CALLED_ON_VALID_THREAD(rasterizer_thread_checker_);
   TRACE_EVENT0("cobalt::renderer", "Pipeline::RasterizeCurrentTree()");
 
+  // Pings watchdog.
+  watchdog::Watchdog* watchdog = watchdog::Watchdog::GetInstance();
+  if (watchdog) watchdog->Ping(std::string(kWatchdogName));
+
   base::TimeTicks start_rasterize_time = base::TimeTicks::Now();
   Submission submission =
       submission_queue_->GetCurrentSubmission(start_rasterize_time);
diff --git a/cobalt/renderer/rasterizer/common/common.gyp b/cobalt/renderer/rasterizer/common/common.gyp
deleted file mode 100644
index ee91655..0000000
--- a/cobalt/renderer/rasterizer/common/common.gyp
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'common',
-      'type': 'static_library',
-
-      'sources': [
-        'find_node.cc',
-        'find_node.h',
-        'offscreen_render_coordinate_mapping.cc',
-        'offscreen_render_coordinate_mapping.h',
-        'scratch_surface_cache.cc',
-        'scratch_surface_cache.h',
-        'streaming_best_fit_line.cc',
-        'streaming_best_fit_line.h',
-        'utils.h',
-        'utils.cc',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/egl/draw_callback.cc b/cobalt/renderer/rasterizer/egl/draw_callback.cc
index cdc0a77..c145dcc 100644
--- a/cobalt/renderer/rasterizer/egl/draw_callback.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_callback.cc
@@ -13,13 +13,11 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
-#include "cobalt/renderer/rasterizer/egl/draw_callback.h"
 
 #include "base/basictypes.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "cobalt/renderer/rasterizer/egl/draw_callback.h"
 #include "egl/generated_shader_impl.h"
 #include "starboard/memory.h"
 
@@ -32,8 +30,7 @@
     : rasterize_callback_(rasterize_callback) {}
 
 void DrawCallback::ExecuteUpdateVertexBuffer(
-    GraphicsState* graphics_state, ShaderProgramManager* program_manager) {
-}
+    GraphicsState* graphics_state, ShaderProgramManager* program_manager) {}
 
 void DrawCallback::ExecuteRasterize(GraphicsState* graphics_state,
                                     ShaderProgramManager* program_manager) {
@@ -50,5 +47,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_clear.cc b/cobalt/renderer/rasterizer/egl/draw_clear.cc
index 1db1e47..a80e53c 100644
--- a/cobalt/renderer/rasterizer/egl/draw_clear.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_clear.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/egl/draw_clear.h"
 
@@ -30,8 +29,7 @@
     : DrawObject(base_state), clear_color_(GetDrawColor(clear_color)) {}
 
 void DrawClear::ExecuteUpdateVertexBuffer(
-    GraphicsState* graphics_state, ShaderProgramManager* program_manager) {
-}
+    GraphicsState* graphics_state, ShaderProgramManager* program_manager) {}
 
 void DrawClear::ExecuteRasterize(GraphicsState* graphics_state,
                                  ShaderProgramManager* program_manager) {
@@ -51,5 +49,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_object.cc b/cobalt/renderer/rasterizer/egl/draw_object.cc
index 0aea266..7163025 100644
--- a/cobalt/renderer/rasterizer/egl/draw_object.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_object.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/draw_object.h"
 
 #include <algorithm>
@@ -22,6 +19,7 @@
 
 #include "cobalt/math/transform_2d.h"
 #include "cobalt/renderer/backend/egl/utils.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
@@ -269,5 +267,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_object_manager.cc b/cobalt/renderer/rasterizer/egl/draw_object_manager.cc
index 2deab92..cc62ceb 100644
--- a/cobalt/renderer/rasterizer/egl/draw_object_manager.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_object_manager.cc
@@ -12,16 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/draw_object_manager.h"
 
 #include <algorithm>
 #include <memory>
+#include <utility>
 
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
@@ -412,5 +411,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_poly_color.cc b/cobalt/renderer/rasterizer/egl/draw_poly_color.cc
index 4678814..3276f0c 100644
--- a/cobalt/renderer/rasterizer/egl/draw_poly_color.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_poly_color.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/draw_poly_color.h"
 
 #include <algorithm>
@@ -25,6 +22,7 @@
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
 #include "egl/generated_shader_impl.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
@@ -94,10 +92,9 @@
     vertex_buffer_ = graphics_state->AllocateVertexData(attributes_.size() *
                                                         sizeof(attributes_[0]));
     memcpy(vertex_buffer_, &attributes_[0],
-                 attributes_.size() * sizeof(attributes_[0]));
+           attributes_.size() * sizeof(attributes_[0]));
     index_buffer_ = graphics_state->AllocateVertexIndices(indices_.size());
-    memcpy(index_buffer_, &indices_[0],
-                 indices_.size() * sizeof(indices_[0]));
+    memcpy(index_buffer_, &indices_[0], indices_.size() * sizeof(indices_[0]));
   }
 }
 
@@ -213,5 +210,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_border.cc b/cobalt/renderer/rasterizer/egl/draw_rect_border.cc
index da21bfc..f7f3b20 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_border.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_border.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/egl/draw_rect_border.h"
 
@@ -254,5 +253,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc b/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc
index 8714013..b76320e 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_color_texture.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/egl/draw_rect_color_texture.h"
 
@@ -76,7 +75,7 @@
       "color_transform_ and color_transform_in_column_major size mismatch");
 
   memcpy(color_transform_, color_transform_in_column_major,
-               sizeof(color_transform_));
+         sizeof(color_transform_));
   graphics_state->ReserveVertexData(4 * sizeof(VertexAttributes));
 }
 
@@ -132,7 +131,7 @@
 
   for (int i = 1; i < SB_ARRAY_SIZE_INT(texcoord_clamps_); ++i) {
     memcpy(texcoord_clamps_[i], texcoord_clamps_[0],
-                 sizeof(texcoord_clamps_[0]));
+           sizeof(texcoord_clamps_[0]));
   }
   if (clamp_texcoords_) {
     // Inset 0.5-epsilon so the border texels are still sampled, but nothing
@@ -246,5 +245,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_linear_gradient.cc b/cobalt/renderer/rasterizer/egl/draw_rect_linear_gradient.cc
index fbb2cd1..d638f0e 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_linear_gradient.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_linear_gradient.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/draw_rect_linear_gradient.h"
 
 #include <algorithm>
@@ -24,6 +21,7 @@
 #include "cobalt/renderer/egl_and_gles.h"
 #include "egl/generated_shader_impl.h"
 #include "starboard/common/log.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
@@ -67,7 +65,7 @@
   vertex_buffer_ = graphics_state->AllocateVertexData(attributes_.size() *
                                                       sizeof(VertexAttributes));
   memcpy(vertex_buffer_, &attributes_[0],
-               attributes_.size() * sizeof(VertexAttributes));
+         attributes_.size() * sizeof(VertexAttributes));
 }
 
 void DrawRectLinearGradient::ExecuteRasterize(
@@ -229,5 +227,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_radial_gradient.cc b/cobalt/renderer/rasterizer/egl/draw_rect_radial_gradient.cc
index 5ffd562..cf63e70 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_radial_gradient.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_radial_gradient.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/draw_rect_radial_gradient.h"
 
 #include <algorithm>
@@ -23,6 +20,7 @@
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
 #include "egl/generated_shader_impl.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
@@ -97,7 +95,7 @@
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_.size() * sizeof(VertexAttributes));
     memcpy(vertex_buffer_, &attributes_[0],
-                 attributes_.size() * sizeof(VertexAttributes));
+           attributes_.size() * sizeof(VertexAttributes));
   }
 }
 
@@ -226,5 +224,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_shadow_blur.cc b/cobalt/renderer/rasterizer/egl/draw_rect_shadow_blur.cc
index a069e6a..03d5115 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_shadow_blur.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_shadow_blur.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/draw_rect_shadow_blur.h"
 
 #include <algorithm>
@@ -23,6 +20,7 @@
 #include "cobalt/math/transform_2d.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
@@ -156,15 +154,14 @@
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_square_.size() * sizeof(attributes_square_[0]));
     memcpy(vertex_buffer_, &attributes_square_[0],
-                 attributes_square_.size() * sizeof(attributes_square_[0]));
+           attributes_square_.size() * sizeof(attributes_square_[0]));
   } else if (attributes_round_.size() > 0) {
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_round_.size() * sizeof(attributes_round_[0]));
     memcpy(vertex_buffer_, &attributes_round_[0],
-                 attributes_round_.size() * sizeof(attributes_round_[0]));
+           attributes_round_.size() * sizeof(attributes_round_[0]));
     index_buffer_ = graphics_state->AllocateVertexIndices(indices_.size());
-    memcpy(index_buffer_, &indices_[0],
-                 indices_.size() * sizeof(indices_[0]));
+    memcpy(index_buffer_, &indices_[0], indices_.size() * sizeof(indices_[0]));
   }
 }
 
@@ -432,5 +429,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_shadow_spread.cc b/cobalt/renderer/rasterizer/egl/draw_rect_shadow_spread.cc
index 52eea1d..ce841f5 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_shadow_spread.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_shadow_spread.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/draw_rect_shadow_spread.h"
 
 #include <algorithm>
@@ -22,6 +19,7 @@
 #include "base/logging.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
@@ -82,15 +80,14 @@
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_square_.size() * sizeof(attributes_square_[0]));
     memcpy(vertex_buffer_, &attributes_square_[0],
-                 attributes_square_.size() * sizeof(attributes_square_[0]));
+           attributes_square_.size() * sizeof(attributes_square_[0]));
   } else if (attributes_round_.size() > 0) {
     vertex_buffer_ = graphics_state->AllocateVertexData(
         attributes_round_.size() * sizeof(attributes_round_[0]));
     memcpy(vertex_buffer_, &attributes_round_[0],
-                 attributes_round_.size() * sizeof(attributes_round_[0]));
+           attributes_round_.size() * sizeof(attributes_round_[0]));
     index_buffer_ = graphics_state->AllocateVertexIndices(indices_.size());
-    memcpy(index_buffer_, &indices_[0],
-                 indices_.size() * sizeof(indices_[0]));
+    memcpy(index_buffer_, &indices_[0], indices_.size() * sizeof(indices_[0]));
   }
 }
 
@@ -264,5 +261,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc b/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc
index bd530df..e16b9cc 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rect_texture.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/egl/draw_rect_texture.h"
 
@@ -69,7 +68,7 @@
       "color_transform_ and color_transform_in_column_major size mismatch");
 
   memcpy(color_transform_, color_transform_in_column_major,
-               sizeof(color_transform_));
+         sizeof(color_transform_));
   graphics_state->ReserveVertexData(4 * sizeof(VertexAttributes));
 }
 
@@ -190,5 +189,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc b/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc
index edb8b0a..aa4f2de 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rrect_color.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/egl/draw_rrect_color.h"
 
@@ -121,5 +120,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc b/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc
index 9161967..4fae2f8 100644
--- a/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc
+++ b/cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/egl/draw_rrect_color_texture.h"
 
@@ -82,7 +81,7 @@
       "color_transform_ and color_transform_in_column_major size mismatch");
 
   memcpy(color_transform_, color_transform_in_column_major,
-               sizeof(color_transform_));
+         sizeof(color_transform_));
   graphics_state->ReserveVertexData(kVertexCount * sizeof(VertexAttributes));
 
   // Extract scale from the transform and move it into the vertex attributes
@@ -163,7 +162,7 @@
 
   for (int i = 1; i < SB_ARRAY_SIZE_INT(texcoord_clamps_); ++i) {
     memcpy(texcoord_clamps_[i], texcoord_clamps_[0],
-                 sizeof(texcoord_clamps_[0]));
+           sizeof(texcoord_clamps_[0]));
   }
   if (clamp_texcoords_) {
     // Inset 0.5-epsilon so the border texels are still sampled, but nothing
@@ -281,5 +280,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/graphics_state.cc b/cobalt/renderer/rasterizer/egl/graphics_state.cc
index 9d50d54..3096deb 100644
--- a/cobalt/renderer/rasterizer/egl/graphics_state.cc
+++ b/cobalt/renderer/rasterizer/egl/graphics_state.cc
@@ -12,14 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/graphics_state.h"
 
 #include <algorithm>
 
 #include "cobalt/renderer/backend/egl/utils.h"
+#include "starboard/configuration.h"
 #include "starboard/memory.h"
 
 namespace cobalt {
@@ -457,5 +455,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/hardware_rasterizer.cc b/cobalt/renderer/rasterizer/egl/hardware_rasterizer.cc
index a3b4de7..d825651 100644
--- a/cobalt/renderer/rasterizer/egl/hardware_rasterizer.cc
+++ b/cobalt/renderer/rasterizer/egl/hardware_rasterizer.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/hardware_rasterizer.h"
 
 #include <memory>
@@ -36,10 +33,15 @@
 #include "cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.h"  // nogncheck
 #include "cobalt/renderer/rasterizer/skia/gl_format_conversions.h"
 #include "cobalt/renderer/rasterizer/skia/hardware_rasterizer.h"
+#include "starboard/configuration.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkSurface.h"
+#ifdef USE_SKIA_NEXT
+#include "third_party/skia/include/gpu/GrDirectContext.h"
+#else
 #include "third_party/skia/include/gpu/GrContext.h"
+#endif
 
 namespace cobalt {
 namespace renderer {
@@ -80,9 +82,15 @@
   void ReleaseContext() { graphics_context_->ReleaseCurrentContext(); }
 
  private:
+#ifdef USE_SKIA_NEXT
+  GrDirectContext* GetFallbackContext() {
+    return fallback_rasterizer_->GetGrContext();
+  }
+#else
   GrContext* GetFallbackContext() {
     return fallback_rasterizer_->GetGrContext();
   }
+#endif
 
   void ResetFallbackContextDuringFrame();
   void FlushFallbackOffscreenDraws();
@@ -229,12 +237,18 @@
 }
 
 void HardwareRasterizer::Impl::ResetFallbackContextDuringFrame() {
-  // Perform a minimal reset of the fallback context. Only need to invalidate
-  // states that this rasterizer pollutes.
+// Perform a minimal reset of the fallback context. Only need to invalidate
+// states that this rasterizer pollutes.
+#ifdef USE_SKIA_NEXT
+  uint32_t untouched_states =
+      kMSAAEnable_GrGLBackendState | kStencil_GrGLBackendState |
+      kPixelStore_GrGLBackendState | kFixedFunction_GrGLBackendState;
+#else
   uint32_t untouched_states =
       kMSAAEnable_GrGLBackendState | kStencil_GrGLBackendState |
       kPixelStore_GrGLBackendState | kFixedFunction_GrGLBackendState |
       kPathRendering_GrGLBackendState;
+#endif
 
   GetFallbackContext()->resetContext(~untouched_states & kAll_GrBackendState);
 }
@@ -308,8 +322,12 @@
                                            0, info);
 
   uint32_t flags = 0;
+#ifdef USE_SKIA_NEXT
+  SkSurfaceProps skia_surface_props(flags, kUnknown_SkPixelGeometry);
+#else
   SkSurfaceProps skia_surface_props(flags,
                                     SkSurfaceProps::kLegacyFontHost_InitType);
+#endif
   return SkSurface::MakeFromBackendRenderTarget(
       GetFallbackContext(), skia_render_target, kBottomLeft_GrSurfaceOrigin,
       kRGBA_8888_SkColorType, nullptr, &skia_surface_props);
@@ -359,5 +377,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/offscreen_target_manager.cc b/cobalt/renderer/rasterizer/egl/offscreen_target_manager.cc
index 9ba721f..759f43d 100644
--- a/cobalt/renderer/rasterizer/egl/offscreen_target_manager.cc
+++ b/cobalt/renderer/rasterizer/egl/offscreen_target_manager.cc
@@ -12,17 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/offscreen_target_manager.h"
 
 #include <algorithm>
 #include <memory>
 #include <unordered_map>
+#include <utility>
 #include <vector>
 
 #include "cobalt/renderer/rasterizer/egl/rect_allocator.h"
+#include "starboard/configuration.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 
 namespace cobalt {
@@ -544,5 +543,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/rasterizer.gyp b/cobalt/renderer/rasterizer/egl/rasterizer.gyp
deleted file mode 100644
index 1b07837..0000000
--- a/cobalt/renderer/rasterizer/egl/rasterizer.gyp
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'software_rasterizer',
-      'type': 'static_library',
-
-      'sources': [
-        'software_rasterizer.cc',
-        'software_rasterizer.h',
-        'textured_mesh_renderer.cc',
-        'textured_mesh_renderer.h',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/software_rasterizer.gyp:software_rasterizer',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/skia/skia.gyp:skia',
-      ],
-    },
-    {
-      'target_name': 'hardware_rasterizer',
-      'type': 'static_library',
-
-      'sources': [
-        'draw_callback.h',
-        'draw_callback.cc',
-        'draw_clear.h',
-        'draw_clear.cc',
-        'draw_object.h',
-        'draw_object.cc',
-        'draw_object_manager.h',
-        'draw_object_manager.cc',
-        'draw_poly_color.h',
-        'draw_poly_color.cc',
-        'draw_rect_border.h',
-        'draw_rect_border.cc',
-        'draw_rect_color_texture.h',
-        'draw_rect_color_texture.cc',
-        'draw_rect_linear_gradient.h',
-        'draw_rect_linear_gradient.cc',
-        'draw_rect_radial_gradient.h',
-        'draw_rect_radial_gradient.cc',
-        'draw_rect_shadow_spread.h',
-        'draw_rect_shadow_spread.cc',
-        'draw_rect_shadow_blur.h',
-        'draw_rect_shadow_blur.cc',
-        'draw_rect_texture.h',
-        'draw_rect_texture.cc',
-        'draw_rrect_color.h',
-        'draw_rrect_color.cc',
-        'draw_rrect_color_texture.h',
-        'draw_rrect_color_texture.cc',
-        'graphics_state.h',
-        'graphics_state.cc',
-        'hardware_rasterizer.cc',
-        'hardware_rasterizer.h',
-        'offscreen_target_manager.h',
-        'offscreen_target_manager.cc',
-        'rect_allocator.h',
-        'rect_allocator.cc',
-        'render_tree_node_visitor.h',
-        'render_tree_node_visitor.cc',
-        'shader_base.h',
-        'shader_base.cc',
-        'shader_program.h',
-        'shader_program.cc',
-        'shader_program_manager.h',
-        'shader_program_manager.cc',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/shaders.gyp:shaders',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/rasterizer.gyp:hardware_rasterizer',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/skia/skia.gyp:skia',
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc b/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc
index 2644baa..e259997 100644
--- a/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc
+++ b/cobalt/renderer/rasterizer/egl/render_tree_node_visitor.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/render_tree_node_visitor.h"
 
 #include <algorithm>
@@ -46,6 +43,7 @@
 #include "cobalt/renderer/rasterizer/skia/hardware_image.h"
 #include "cobalt/renderer/rasterizer/skia/image.h"              // nogncheck
 #include "cobalt/renderer/rasterizer/skia/skottie_animation.h"  // nogncheck
+#include "starboard/configuration.h"
 
 namespace cobalt {
 namespace renderer {
@@ -750,7 +748,8 @@
   const render_tree::PunchThroughVideoNode::Builder& data = video_node->data();
   math::RectF mapped_rect_float = draw_state_.transform.MapRect(data.rect);
   math::Rect mapped_rect = math::Rect::RoundFromRectF(mapped_rect_float);
-  data.set_bounds_cb.Run(mapped_rect);
+  data.set_bounds_cb.Run(mapped_rect.x(), mapped_rect.y(), mapped_rect.width(),
+                         mapped_rect.height());
 
   DCHECK_EQ(data.rect, video_node->GetBounds());
   AddClear(data.rect, kTransparentBlack);
@@ -1286,5 +1285,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/shader_base.cc b/cobalt/renderer/rasterizer/egl/shader_base.cc
index 0d0bf65..3a7e451 100644
--- a/cobalt/renderer/rasterizer/egl/shader_base.cc
+++ b/cobalt/renderer/rasterizer/egl/shader_base.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/egl/shader_base.h"
 
@@ -46,5 +45,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/shader_program.cc b/cobalt/renderer/rasterizer/egl/shader_program.cc
index baafc39..7f00d47 100644
--- a/cobalt/renderer/rasterizer/egl/shader_program.cc
+++ b/cobalt/renderer/rasterizer/egl/shader_program.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/egl/shader_program.h"
 
@@ -100,5 +99,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/shader_program_manager.cc b/cobalt/renderer/rasterizer/egl/shader_program_manager.cc
index eaf9838..dd92e02 100644
--- a/cobalt/renderer/rasterizer/egl/shader_program_manager.cc
+++ b/cobalt/renderer/rasterizer/egl/shader_program_manager.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/egl/shader_program_manager.h"
 
@@ -68,5 +67,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/shaders/generate_shader_impl.py b/cobalt/renderer/rasterizer/egl/shaders/generate_shader_impl.py
index f1f684d..b5d3ba8 100644
--- a/cobalt/renderer/rasterizer/egl/shaders/generate_shader_impl.py
+++ b/cobalt/renderer/rasterizer/egl/shaders/generate_shader_impl.py
@@ -149,7 +149,6 @@
 // Do not edit!
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "{header_filename}"
 
@@ -163,7 +162,6 @@
 }}  // namespace renderer
 }}  // namespace cobalt
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
 """
 
 
diff --git a/cobalt/renderer/rasterizer/egl/shaders/shaders.gyp b/cobalt/renderer/rasterizer/egl/shaders/shaders.gyp
deleted file mode 100644
index 4c7a349..0000000
--- a/cobalt/renderer/rasterizer/egl/shaders/shaders.gyp
+++ /dev/null
@@ -1,112 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'output_dir': '<(SHARED_INTERMEDIATE_DIR)/egl',
-    'shader_impl_header': '<(output_dir)/generated_shader_impl.h',
-    'shader_impl_source': '<(output_dir)/generated_shader_impl.cc',
-    'generate_class_script': '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/generate_shader_impl.py',
-    'shader_sources': [
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_color.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_color_blur.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_color_blur_rrects.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_color_include.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_color_texcoord.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_color_texcoord_yuv3.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_opacity_texcoord1d.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_rcorner_color.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_rcorner2_color.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_rcorner_texcoord_color.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_rcorner_texcoord_color_yuv3.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_texcoord.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/fragment_texcoord_yuv3.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/function_gaussian_integral.inc',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/function_is_outside_rcorner.inc',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/image_sampler_rgba.inc',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/image_sampler_rgba_with_clamp.inc',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/image_sampler_yuv3_with_clamp.inc',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/image_sampler_yuv3.inc',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/vertex_color.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/vertex_color_offset.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/vertex_color_texcoord.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/vertex_offset.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/vertex_offset_rcorner.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/vertex_rcorner.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/vertex_rcorner2.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/vertex_rcorner_texcoord.glsl',
-      '<(DEPTH)/cobalt/renderer/rasterizer/egl/shaders/vertex_texcoord.glsl',
-    ],
-  },
-
-  'targets': [
-    {
-      'target_name': 'generate_shader_impl',
-      'type': 'none',
-      # Because we generate a header, we must set the hard_dependency flag.
-      'hard_dependency': 1,
-      'variables': {
-        'input_shader_files_file': '<|(generate_shader_impl_inputs.tmp <@(shader_sources))',
-      },
-
-      'actions': [
-        {
-          # Parse shader files to create a header and source file which contain
-          # classes encapsulating the shader attributes, uniforms, and source.
-          'action_name': 'create_shader_classes',
-          'inputs': [
-            '<(generate_class_script)',
-            '<(input_shader_files_file)',
-            '<@(shader_sources)',
-          ],
-          'outputs': [
-            '<(shader_impl_header)',
-            '<(shader_impl_source)',
-          ],
-          'action': [
-            'python2',
-            '<(generate_class_script)',
-            '<(shader_impl_header)',
-            '<(shader_impl_source)',
-            '<(input_shader_files_file)',
-          ],
-          'message': 'Generating <(shader_impl_header) and <(shader_impl_source)',
-        },
-      ],
-    },
-    {
-      'target_name': 'shaders',
-      'type': 'static_library',
-      # We're depending on a target which generates a header file, so make sure other
-      # targets which need the header file know this.
-      'hard_dependency': 1,
-
-      'sources' : [
-        '<(shader_impl_header)',
-        '<(shader_impl_source)',
-      ],
-
-      'dependencies': [
-        'generate_shader_impl',
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-      ],
-
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(SHARED_INTERMEDIATE_DIR)',
-        ],
-      },
-    },
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/egl/software_rasterizer.cc b/cobalt/renderer/rasterizer/egl/software_rasterizer.cc
index f59fc93..92316a8 100644
--- a/cobalt/renderer/rasterizer/egl/software_rasterizer.cc
+++ b/cobalt/renderer/rasterizer/egl/software_rasterizer.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/software_rasterizer.h"
 
 #include <memory>
@@ -25,6 +22,7 @@
 #include "cobalt/renderer/backend/egl/texture.h"
 #include "cobalt/renderer/egl_and_gles.h"
 #include "cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.h"  // nogncheck
+#include "starboard/configuration.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkImageInfo.h"
@@ -107,5 +105,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc b/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc
index a1d3f9b..0393771 100644
--- a/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc
+++ b/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc
@@ -12,12 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/egl/textured_mesh_renderer.h"
 
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/strings/string_number_conversions.h"
@@ -26,6 +24,7 @@
 #include "cobalt/math/size.h"
 #include "cobalt/renderer/backend/egl/utils.h"
 #include "cobalt/renderer/egl_and_gles.h"
+#include "starboard/configuration.h"
 #include "third_party/glm/glm/gtc/type_ptr.hpp"
 
 namespace cobalt {
@@ -758,5 +757,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/pixel_test.cc b/cobalt/renderer/rasterizer/pixel_test.cc
index 775034a..20fedaf 100644
--- a/cobalt/renderer/rasterizer/pixel_test.cc
+++ b/cobalt/renderer/rasterizer/pixel_test.cc
@@ -136,7 +136,9 @@
 
 namespace {
 
-bool SetBounds(bool result, const math::Rect&) { return result; }
+bool SetBounds(bool result, int x, int y, int width, int height) {
+  return result;
+}
 
 }  // namespace
 
@@ -3964,8 +3966,6 @@
   TestTree(new ImageNode(offscreen_rendered_image));
 }
 
-#if SB_API_VERSION >= 12 || ENABLE_MAP_TO_MESH
-
 namespace {
 scoped_refptr<Mesh> CreateCubeMesh(ResourceProvider* resource_provider) {
   // Defines a cube mesh where each face faces inward.  Each face has the entire
@@ -4088,9 +4088,6 @@
   TestTree(CreateMapToMeshTestRenderTree(GetResourceProvider(), image));
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // ENABLE_MAP_TO_MESH
-
 TEST_F(PixelTest, DrawNullImage) {
   // An ImageNode with no source is legal, though it should result in nothing
   // being drawn.
diff --git a/cobalt/renderer/rasterizer/rasterizer.gyp b/cobalt/renderer/rasterizer/rasterizer.gyp
deleted file mode 100644
index 6de4e63..0000000
--- a/cobalt/renderer/rasterizer/rasterizer.gyp
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'rasterizer',
-      'type': 'none',
-
-      'dependencies': [
-        '<(DEPTH)/cobalt/renderer/rasterizer/stub/rasterizer.gyp:rasterizer',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/rasterizer.gyp:hardware_rasterizer',
-        '<(DEPTH)/cobalt/renderer/rasterizer/egl/rasterizer.gyp:software_rasterizer',
-        '<(DEPTH)/cobalt/renderer/rasterizer/egl/rasterizer.gyp:hardware_rasterizer',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/skia/common.gyp b/cobalt/renderer/rasterizer/skia/common.gyp
deleted file mode 100644
index f0c9b66..0000000
--- a/cobalt/renderer/rasterizer/skia/common.gyp
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'common',
-      'type': 'static_library',
-
-      'sources': [
-        'cobalt_skia_type_conversions.cc',
-        'cobalt_skia_type_conversions.h',
-        'font.cc',
-        'font.h',
-        'glyph_buffer.cc',
-        'glyph_buffer.h',
-        'harfbuzz_font.cc',
-        'harfbuzz_font.h',
-        'image.cc',
-        'image.h',
-        'render_tree_node_visitor.cc',
-        'render_tree_node_visitor.h',
-        'scratch_surface_cache.cc',
-        'scratch_surface_cache.h',
-        'skottie_animation.cc',
-        'skottie_animation.h',
-        'text_shaper.cc',
-        'text_shaper.h',
-        'typeface.cc',
-        'typeface.h',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/skia/skia.gyp:skia',
-        '<(DEPTH)/third_party/harfbuzz-ng/harfbuzz.gyp:harfbuzz-ng',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        '<(DEPTH)/third_party/ots/ots.gyp:ots',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/skia/gl_format_conversions.cc b/cobalt/renderer/rasterizer/skia/gl_format_conversions.cc
index c647d3a..2e71cf2 100644
--- a/cobalt/renderer/rasterizer/skia/gl_format_conversions.cc
+++ b/cobalt/renderer/rasterizer/skia/gl_format_conversions.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/rasterizer/skia/gl_format_conversions.h"
 
@@ -101,5 +100,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/skia/hardware_image.cc b/cobalt/renderer/rasterizer/skia/hardware_image.cc
index 6e1fb8e..bd9a2c3 100644
--- a/cobalt/renderer/rasterizer/skia/hardware_image.cc
+++ b/cobalt/renderer/rasterizer/skia/hardware_image.cc
@@ -12,12 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/skia/hardware_image.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
@@ -28,6 +26,7 @@
 #include "cobalt/renderer/backend/egl/texture.h"
 #include "cobalt/renderer/rasterizer/skia/cobalt_skia_type_conversions.h"
 #include "cobalt/renderer/rasterizer/skia/gl_format_conversions.h"
+#include "starboard/configuration.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkPixelRef.h"
 #include "third_party/skia/include/gpu/GrBackendSurface.h"
@@ -385,8 +384,7 @@
   if (rasterizer_task_runner_) {
     if (!rasterizer_task_runner_->BelongsToCurrentThread() ||
         !backend_image_->TryDestroy()) {
-      rasterizer_task_runner_->DeleteSoon(
-          FROM_HERE, backend_image_.release());
+      rasterizer_task_runner_->DeleteSoon(FROM_HERE, backend_image_.release());
     }
   }  // else let the scoped pointer clean it up immediately.
 }
@@ -493,5 +491,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/skia/hardware_image.h b/cobalt/renderer/rasterizer/skia/hardware_image.h
index 29e25e9..1cb4493 100644
--- a/cobalt/renderer/rasterizer/skia/hardware_image.h
+++ b/cobalt/renderer/rasterizer/skia/hardware_image.h
@@ -26,14 +26,24 @@
 #include "cobalt/renderer/backend/egl/texture.h"
 #include "cobalt/renderer/backend/egl/texture_data.h"
 #include "cobalt/renderer/rasterizer/skia/image.h"
+#ifdef USE_SKIA_NEXT
+#include "third_party/skia/include/gpu/GrDirectContext.h"
+#include "third_party/skia/include/gpu/GrTypes.h"  // included for GrMipMapped
+                                                   // alias
+#else
 #include "third_party/skia/include/gpu/GrContext.h"
 #include "third_party/skia/include/gpu/GrTexture.h"
+#endif
 
 namespace cobalt {
 namespace renderer {
 namespace rasterizer {
 namespace skia {
 
+#ifdef USE_SKIA_NEXT
+using GrContext = GrDirectContext;
+#endif
+
 // We use GL RGBA formats to indicate that a texture has 4 channels, but those
 // 4 channels may not always strictly mean red, green, blue and alpha.  This
 // enum is used to specify what format they are so that potentially different
@@ -47,11 +57,13 @@
     const scoped_refptr<backend::RenderTarget>& render_target)>
     SubmitOffscreenCallback;
 
+#ifndef USE_SKIA_NEXT
 // Wraps a Cobalt backend::TextureEGL with a Skia GrTexture, and returns the
 // Skia ref-counted GrTexture object (that takes ownership of the cobalt
 // texture).
 GrTexture* CobaltTextureToSkiaTexture(
     GrContext* gr_context, std::unique_ptr<backend::TextureEGL> cobalt_texture);
+#endif
 
 // Forwards ImageData methods on to TextureData methods.
 class HardwareImageData : public render_tree::ImageData {
@@ -92,17 +104,15 @@
 // actually contains the texture data.
 class HardwareFrontendImage : public SinglePlaneImage {
  public:
-  HardwareFrontendImage(std::unique_ptr<HardwareImageData> image_data,
-      backend::GraphicsContextEGL* cobalt_context,
-      GrContext* gr_context,
+  HardwareFrontendImage(
+      std::unique_ptr<HardwareImageData> image_data,
+      backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
       scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner);
   HardwareFrontendImage(
       const scoped_refptr<backend::ConstRawTextureMemoryEGL>&
           raw_texture_memory,
-      intptr_t offset,
-      const render_tree::ImageDataDescriptor& descriptor,
-      backend::GraphicsContextEGL* cobalt_context,
-      GrContext* gr_context,
+      intptr_t offset, const render_tree::ImageDataDescriptor& descriptor,
+      backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
       scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner);
   HardwareFrontendImage(
       std::unique_ptr<backend::TextureEGL> texture,
diff --git a/cobalt/renderer/rasterizer/skia/hardware_mesh.cc b/cobalt/renderer/rasterizer/skia/hardware_mesh.cc
index 19ad127..39d09af 100644
--- a/cobalt/renderer/rasterizer/skia/hardware_mesh.cc
+++ b/cobalt/renderer/rasterizer/skia/hardware_mesh.cc
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/skia/hardware_mesh.h"
 
 #include <memory>
+#include <utility>
 #include <vector>
 
+#include "starboard/configuration.h"
+
 namespace cobalt {
 namespace renderer {
 namespace rasterizer {
@@ -86,5 +86,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc b/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc
index db0c69c..23d3982 100644
--- a/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc
+++ b/cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc
@@ -12,9 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/skia/hardware_rasterizer.h"
 
 #include <algorithm>
@@ -35,15 +32,22 @@
 #include "cobalt/renderer/rasterizer/skia/render_tree_node_visitor.h"
 #include "cobalt/renderer/rasterizer/skia/scratch_surface_cache.h"
 #include "cobalt/renderer/rasterizer/skia/vertex_buffer_object.h"
+#include "starboard/configuration.h"
 #include "third_party/glm/glm/gtc/matrix_inverse.hpp"
 #include "third_party/glm/glm/gtx/transform.hpp"
 #include "third_party/glm/glm/mat3x3.hpp"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkSurface.h"
 #include "third_party/skia/include/gpu/GrBackendSurface.h"
+#ifdef USE_SKIA_NEXT
+#include "third_party/skia/include/gpu/GrDirectContext.h"
+#else
 #include "third_party/skia/include/gpu/GrContext.h"
+#endif
 #include "third_party/skia/include/gpu/GrContextOptions.h"
+#ifndef USE_SKIA_NEXT
 #include "third_party/skia/include/gpu/GrTexture.h"
+#endif
 #include "third_party/skia/include/gpu/gl/GrGLInterface.h"
 #include "third_party/skia/src/gpu/GrRenderTarget.h"
 #include "third_party/skia/src/gpu/GrResourceProvider.h"
@@ -153,7 +157,11 @@
 
 SkSurfaceProps GetRenderTargetSurfaceProps(bool force_deterministic_rendering) {
   uint32_t flags = 0;
+#ifdef USE_SKIA_NEXT
+  return SkSurfaceProps(flags, kUnknown_SkPixelGeometry);
+#else
   return SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType);
+#endif
 }
 
 // Takes meta-data from a Cobalt RenderTarget object and uses it to fill out
@@ -513,11 +521,17 @@
                                         model_view_projection_matrix);
   }
 
-  // Let Skia know that we've modified GL state.
+// Let Skia know that we've modified GL state.
+#ifdef USE_SKIA_NEXT
+  uint32_t untouched_states =
+      kMSAAEnable_GrGLBackendState | kStencil_GrGLBackendState |
+      kPixelStore_GrGLBackendState | kFixedFunction_GrGLBackendState;
+#else
   uint32_t untouched_states =
       kMSAAEnable_GrGLBackendState | kStencil_GrGLBackendState |
       kPixelStore_GrGLBackendState | kFixedFunction_GrGLBackendState |
       kPathRendering_GrGLBackendState;
+#endif
   gr_context_->resetContext(~untouched_states & kAll_GrBackendState);
 }
 
@@ -914,5 +928,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/skia/hardware_rasterizer.h b/cobalt/renderer/rasterizer/skia/hardware_rasterizer.h
index ff0fb7b..6ae58fb 100644
--- a/cobalt/renderer/rasterizer/skia/hardware_rasterizer.h
+++ b/cobalt/renderer/rasterizer/skia/hardware_rasterizer.h
@@ -22,7 +22,11 @@
 #include "cobalt/renderer/backend/render_target.h"
 #include "cobalt/renderer/rasterizer/rasterizer.h"
 
+#ifdef USE_SKIA_NEXT
+class GrDirectContext;
+#else
 class GrContext;
+#endif
 class SkCanvas;
 
 namespace cobalt {
@@ -76,7 +80,11 @@
       const scoped_refptr<backend::RenderTarget>& render_target);
 
   render_tree::ResourceProvider* GetResourceProvider() override;
+#ifdef USE_SKIA_NEXT
+  GrDirectContext* GetGrContext();
+#else
   GrContext* GetGrContext();
+#endif
 
   void MakeCurrent() override;
   void ReleaseContext() override;
diff --git a/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc b/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
index 0ccee82..84b5a71 100644
--- a/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
+++ b/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
@@ -12,10 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
 #include "cobalt/renderer/rasterizer/skia/hardware_resource_provider.h"
 
 #include <memory>
@@ -37,6 +33,7 @@
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h"
 #include "cobalt/renderer/rasterizer/skia/skottie_animation.h"
 #include "cobalt/renderer/rasterizer/skia/typeface.h"
+#include "starboard/configuration.h"
 #include "third_party/ots/include/opentype-sanitiser.h"
 #include "third_party/ots/include/ots-memory-stream.h"
 #include "third_party/skia/include/core/SkData.h"
@@ -206,7 +203,9 @@
       }
     } break;
     case kSbDecodeTargetFormat3Plane10BitYUVI420:
+#if SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
     case kSbDecodeTargetFormat3Plane10BitYUVI420Compact:
+#endif  // SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
     case kSbDecodeTargetFormat3PlaneYUVI420: {
       DCHECK_LT(plane, 3);
 #if defined(GL_RED_EXT)
@@ -235,9 +234,11 @@
     case kSbDecodeTargetFormat3Plane10BitYUVI420: {
       return render_tree::kMultiPlaneImageFormatYUV3Plane10BitBT2020;
     } break;
+#if SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
     case kSbDecodeTargetFormat3Plane10BitYUVI420Compact: {
       return render_tree::kMultiPlaneImageFormatYUV3Plane10BitCompactedBT2020;
     }
+#endif  // SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
     default: { NOTREACHED(); }
   }
   return render_tree::kMultiPlaneImageFormatYUV2PlaneBT709;
@@ -569,5 +570,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h b/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
index 2a7dc3d..231cdd9 100644
--- a/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
+++ b/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
@@ -26,7 +26,11 @@
 #include "cobalt/renderer/rasterizer/skia/hardware_image.h"
 #include "cobalt/renderer/rasterizer/skia/text_shaper.h"
 #include "third_party/skia/include/core/SkFontMgr.h"
+#ifdef USE_SKIA_NEXT
+#include "third_party/skia/include/gpu/GrDirectContext.h"
+#else
 #include "third_party/skia/include/gpu/GrContext.h"
+#endif
 
 namespace cobalt {
 namespace renderer {
diff --git a/cobalt/renderer/rasterizer/skia/rasterizer.gyp b/cobalt/renderer/rasterizer/skia/rasterizer.gyp
deleted file mode 100644
index 0ae2894..0000000
--- a/cobalt/renderer/rasterizer/skia/rasterizer.gyp
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'hardware_rasterizer',
-      'type': 'static_library',
-
-      'sources': [
-        'gl_format_conversions.cc',
-        'hardware_image.cc',
-        'hardware_image.h',
-        'hardware_mesh.cc',
-        'hardware_mesh.h',
-        'hardware_rasterizer.cc',
-        'hardware_rasterizer.h',
-        'hardware_resource_provider.cc',
-        'hardware_resource_provider.h',
-        'vertex_buffer_object.cc',
-        'vertex_buffer_object.h',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/renderer/rasterizer/common/common.gyp:common',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/common.gyp:common',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/skia/skia.gyp:skia',
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-        '<(DEPTH)/third_party/harfbuzz-ng/harfbuzz.gyp:harfbuzz-ng',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        '<(DEPTH)/third_party/ots/ots.gyp:ots',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc b/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
index de94c86..29dc68d 100644
--- a/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
+++ b/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
@@ -56,9 +56,15 @@
 #include "third_party/skia/include/core/SkRegion.h"
 #include "third_party/skia/include/core/SkSurface.h"
 #include "third_party/skia/include/core/SkTypeface.h"
+#ifdef USE_SKIA_NEXT
+#include "third_party/skia/include/effects/SkImageFilters.h"
+#else
 #include "third_party/skia/include/effects/SkBlurImageFilter.h"
+#endif
 #include "third_party/skia/include/effects/SkBlurMaskFilter.h"
+#ifndef USE_SKIA_NEXT
 #include "third_party/skia/include/effects/SkDropShadowImageFilter.h"
+#endif
 #include "third_party/skia/include/effects/SkGradientShader.h"
 
 // Setting this define to 1 will enable TRACE_EVENT calls to be made from
@@ -214,8 +220,12 @@
     const math::RectF& rect,
     const render_tree::RoundedCorners& rounded_corners) {
   SkPath path;
+#ifdef USE_SKIA_NEXT
+  path.addRRect(RoundedRectToSkia(rect, rounded_corners), SkPathDirection::kCW);
+#else
   path.addRRect(RoundedRectToSkia(rect, rounded_corners),
                 SkPath::kCW_Direction);
+#endif
   return path;
 }
 
@@ -246,8 +256,13 @@
     SkPaint* paint,
     const base::Optional<render_tree::BlurFilter>& blur_filter) {
   if (blur_filter && blur_filter->blur_sigma() > 0.0f) {
+#ifdef USE_SKIA_NEXT
+    sk_sp<SkImageFilter> skia_blur_filter(SkImageFilters::Blur(
+        blur_filter->blur_sigma(), blur_filter->blur_sigma(), nullptr));
+#else
     sk_sp<SkImageFilter> skia_blur_filter(SkBlurImageFilter::Make(
         blur_filter->blur_sigma(), blur_filter->blur_sigma(), nullptr));
+#endif
     paint->setImageFilter(skia_blur_filter);
   }
 }
@@ -318,9 +333,11 @@
   if (filter_node.opacity_filter) {
     paint.setARGB(filter_node.opacity_filter->opacity() * 255, 255, 255, 255);
   }
+#ifndef USE_SKIA_NEXT
   // Use nearest neighbor when filtering texture data, since the source and
   // destination rectangles should be exactly equal.
   paint.setFilterQuality(kNone_SkFilterQuality);
+#endif
 
   // We've already used the draw_state_.render_target's scale when rendering to
   // the offscreen surface, so reset the scale for now.
@@ -340,8 +357,14 @@
   SkRect source_rect =
       SkRect::MakeWH(surface_bounds.width(), surface_bounds.height());
 
+#ifdef USE_SKIA_NEXT
+  draw_state_.render_target->drawImageRect(image.get(), source_rect, dest_rect,
+                                           SkSamplingOptions(), &paint,
+                                           SkCanvas::kStrict_SrcRectConstraint);
+#else
   draw_state_.render_target->drawImageRect(image.get(), source_rect, dest_rect,
                                            &paint);
+#endif
 
   // Finally restore our parent render target's original transform for the
   // next draw call.
@@ -559,8 +582,10 @@
 SkPaint CreateSkPaintForImageRendering(
     const RenderTreeNodeVisitorDrawState& draw_state, bool is_opaque) {
   SkPaint paint;
+#ifndef USE_SKIA_NEXT
   // |kLow_SkFilterQuality| is used for bilinear interpolation of images.
   paint.setFilterQuality(kLow_SkFilterQuality);
+#endif
 
   if (!IsOpaque(draw_state.opacity)) {
     paint.setAlpha(draw_state.opacity * 255);
@@ -600,8 +625,15 @@
 
     if (image) {
       SkRect src = SkRect::MakeXYWH(x, y, width, height);
+#ifdef USE_SKIA_NEXT
+      draw_state->render_target->drawImageRect(
+          image.get(), src, CobaltRectFToSkiaRect(destination_rect),
+          SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kNone), &paint,
+          SkCanvas::kStrict_SrcRectConstraint);
+#else
       draw_state->render_target->drawImageRect(
           image, src, CobaltRectFToSkiaRect(destination_rect), &paint);
+#endif
     }
   } else {
     // Use the more general approach which allows arbitrary local texture
@@ -612,8 +644,15 @@
                                                   &skia_local_transform);
 
     if (image) {
+#ifdef USE_SKIA_NEXT
+      sk_sp<SkShader> image_shader = image->makeShader(
+          SkTileMode::kRepeat, SkTileMode::kRepeat,
+          SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kNone),
+          &skia_local_transform);
+#else
       sk_sp<SkShader> image_shader = image->makeShader(
           SkTileMode::kRepeat, SkTileMode::kRepeat, &skia_local_transform);
+#endif
 
       paint.setShader(image_shader);
 
@@ -793,7 +832,9 @@
       sk_rect_transformed.x(), sk_rect_transformed.y(),
       sk_rect_transformed.width(), sk_rect_transformed.height());
   math::Rect transformed_rect = math::Rect::RoundFromRectF(transformed_rectf);
-  punch_through_video_node->data().set_bounds_cb.Run(transformed_rect);
+  punch_through_video_node->data().set_bounds_cb.Run(
+      transformed_rect.x(), transformed_rect.y(), transformed_rect.width(),
+      transformed_rect.height());
 
   DrawClearRect(draw_state_.render_target, math_rect,
                 render_tree::ColorRGBA(0, 0, 0, 0));
@@ -1335,7 +1376,6 @@
     DCHECK_EQ(border.top.style, render_tree::kBorderStyleNone);
   }
 
-
   // Left
   if (border.left.style == render_tree::kBorderStyleSolid) {
     SkPoint left_points[4] = {top_left_outer, bottom_left_outer,   // A, C
@@ -1348,7 +1388,6 @@
     DCHECK_EQ(border.left.style, render_tree::kBorderStyleNone);
   }
 
-
   // Bottom
   if (border.bottom.style == render_tree::kBorderStyleSolid) {
     SkPoint bottom_points[4] = {bottom_left_inner, bottom_left_outer,  // G, C
@@ -1362,7 +1401,6 @@
     DCHECK_EQ(border.bottom.style, render_tree::kBorderStyleNone);
   }
 
-
   // Right
   if (border.right.style == render_tree::kBorderStyleSolid) {
     SkPoint right_points[4] = {top_right_inner, bottom_right_inner,   // F, H
@@ -1418,9 +1456,16 @@
   canvas.flush();
 
   SkPaint render_target_paint;
+#ifdef USE_SKIA_NEXT
+  bitmap.setImmutable();
+  sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+  draw_state->render_target->drawImage(
+      image, rect.x(), rect.y(), SkSamplingOptions(), &render_target_paint);
+#else
   render_target_paint.setFilterQuality(kNone_SkFilterQuality);
   draw_state->render_target->drawBitmap(bitmap, rect.x(), rect.y(),
                                         &render_target_paint);
+#endif
 }
 
 void DrawSolidRoundedRectBorder(
@@ -1739,7 +1784,9 @@
     if (blur_sigma > 0.0f) {
       sk_sp<SkMaskFilter> mf(
           SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, blur_sigma));
+#ifndef USE_SKIA_NEXT
       paint.setFilterQuality(SkFilterQuality::kHigh_SkFilterQuality);
+#endif
       paint.setMaskFilter(mf);
     }
 
diff --git a/cobalt/renderer/rasterizer/skia/skia/BUILD.gn b/cobalt/renderer/rasterizer/skia/skia/BUILD.gn
index b43ec9f..63064b8 100644
--- a/cobalt/renderer/rasterizer/skia/skia/BUILD.gn
+++ b/cobalt/renderer/rasterizer/skia/skia/BUILD.gn
@@ -44,8 +44,20 @@
   sources = skia_effects_imagefilter_sources_no_asan
   if (use_skia_next) {
     include_dirs = [ skia_include_dir ]
-    defines = [ "USE_SKIA_NEXT" ]
-    cflags_cc = [ "-Wno-c++17-extensions" ]
+    defines = [
+      "USE_SKIA_NEXT",
+      "SKIA_STRUCTURED_BINDINGS_BACKPORT",
+    ]
+    if (is_clang) {
+      if (using_old_compiler) {
+        cflags_cc = [ "-Wno-c++1z-extensions" ]
+      } else {
+        cflags_cc = [
+          "-Wno-c++17-extensions",
+          "-Wno-invalid-offsetof",
+        ]
+      }
+    }
   }
 
   # TODO(b/207398024): If this is a target we need to build, then we'll
@@ -81,8 +93,20 @@
   defines = [ "SK_BUILD_NO_OPTS" ]
 
   if (use_skia_next) {
-    defines += [ "USE_SKIA_NEXT" ]
-    cflags_cc = [ "-Wno-c++17-extensions" ]
+    defines += [
+      "USE_SKIA_NEXT",
+      "SKIA_STRUCTURED_BINDINGS_BACKPORT",
+    ]
+    if (is_clang) {
+      if (using_old_compiler) {
+        cflags_cc = [ "-Wno-c++1z-extensions" ]
+      } else {
+        cflags_cc = [
+          "-Wno-c++17-extensions",
+          "-Wno-invalid-offsetof",
+        ]
+      }
+    }
   }
 }
 
@@ -130,7 +154,6 @@
     "src/ports/SkOSFile_cobalt.h",
     "src/ports/SkStream_cobalt.cc",
     "src/ports/SkStream_cobalt.h",
-    "src/ports/SkTLS_cobalt.cc",
     "src/ports/SkTime_cobalt.cc",
     "src/ports/SkTypeface_cobalt.cc",
     "src/ports/SkTypeface_cobalt.h",
@@ -140,6 +163,10 @@
     sources += [ "src/ports/SkMemory_starboard.cc" ]
   }
 
+  if (!use_skia_next) {
+    sources += [ "src/ports/SkTLS_cobalt.cc" ]
+  }
+
   include_dirs = [ target_gen_dir ]
 
   if (use_skia_next) {
diff --git a/cobalt/renderer/rasterizer/skia/skia/config/SkUserConfig.h b/cobalt/renderer/rasterizer/skia/skia/config/SkUserConfig.h
index 7bf71c8..f3b37a2 100644
--- a/cobalt/renderer/rasterizer/skia/skia/config/SkUserConfig.h
+++ b/cobalt/renderer/rasterizer/skia/skia/config/SkUserConfig.h
@@ -14,20 +14,23 @@
  * limitations under the License.
  */
 
-#ifndef SkUserConfig_DEFINED
-#define SkUserConfig_DEFINED
+#ifndef SkUserConfig_DEFINED  // NOLINT
+#define SkUserConfig_DEFINED  // NOLINT
 
 #if defined(STARBOARD)
+#if defined(USE_SKIA_NEXT)
+#include "base/logging.h"
+#endif
 #include "starboard/configuration.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/types.h"
 #endif
 
+// clang-format off
 /*  SkTypes.h, the root of the public header files, does the following trick:
-
-    #include <SkPostConfig.h>
     #include <SkPreConfig.h>
     #include <SkUserConfig.h>
+    #include <SkPostConfig.h>
 
     SkPreConfig.h runs first, and it is responsible for initializing certain
     skia defines.
@@ -47,6 +50,7 @@
     By default, this include file will always default to having all of the flags
     commented out, so including it will have no effect.
 */
+// clang-format on
 
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -54,8 +58,8 @@
     floats or 16.16 integers (fixed). Exactly one of these two symbols must be
     defined.
 */
-//#define SK_SCALAR_IS_FLOAT
-//#define SK_SCALAR_IS_FIXED
+// #define SK_SCALAR_IS_FLOAT
+// #define SK_SCALAR_IS_FIXED
 
 
 /*  Somewhat independent of how SkScalar is implemented, Skia also wants to know
@@ -63,14 +67,14 @@
     then so muse SK_CAN_USE_FLOAT, but if scalars are fixed, SK_CAN_USE_FLOAT
     can go either way.
  */
-//#define SK_CAN_USE_FLOAT
+// #define SK_CAN_USE_FLOAT
 
 /*  For some performance-critical scalar operations, skia will optionally work
     around the standard float operators if it knows that the CPU does not have
     native support for floats. If your environment uses software floating point,
     define this flag.
  */
-//#define SK_SOFTWARE_FLOAT
+// #define SK_SOFTWARE_FLOAT
 
 
 /*  Skia has lots of debug-only code. Often this is just null checks or other
@@ -82,22 +86,22 @@
     based on the presence or absence of NDEBUG, but that decision can be changed
     here.
  */
-//#define SK_DEBUG
-//#define SK_RELEASE
+// #define SK_DEBUG
+// #define SK_RELEASE
 
 
 /*  If, in debugging mode, Skia needs to stop (presumably to invoke a debugger)
     it will call SK_CRASH(). If this is not defined it, it is defined in
     SkPostConfig.h to write to an illegal address
  */
-//#define SK_CRASH() *(int *)(uintptr_t)0 = 0
+// #define SK_CRASH() *(int *)(uintptr_t)0 = 0
 
 
 /*  preconfig will have attempted to determine the endianness of the system,
     but you can change these mutually exclusive flags here.
  */
-//#define SK_CPU_BENDIAN
-//#define SK_CPU_LENDIAN
+// #define SK_CPU_BENDIAN
+// #define SK_CPU_LENDIAN
 
 // The following defines dictate the native pixel color format of Skia surfaces.
 // Render target RGBA support is limited to either RGBA or BGRA, and must be
@@ -109,7 +113,7 @@
 // would like these formats to match.
 // Always use OpenGL byte-order (RGBA).
 
-#if defined(STARBOARD) && SB_API_VERSION >= 12
+#if defined(STARBOARD)
 const uint8_t r32_or_bendian_a32_shift =
     kSbPreferredRgbaByteOrder == SB_PREFERRED_RGBA_BYTE_ORDER_BGRA ? 16 : 0;
 
@@ -161,36 +165,36 @@
 /*  Some compilers don't support long long for 64bit integers. If yours does
     not, define this to the appropriate type.
  */
-//#define SkLONGLONG int64_t
+// #define SkLONGLONG int64_t
 
 
 /*  Some environments do not support writable globals (eek!). If yours does not,
     define this flag.
  */
-//#define SK_USE_RUNTIME_GLOBALS
+// #define SK_USE_RUNTIME_GLOBALS
 
 /*  If zlib is available and you want to support the flate compression
     algorithm (used in PDF generation), define SK_ZLIB_INCLUDE to be the
     include path.
  */
-//#define SK_ZLIB_INCLUDE <zlib.h>
+// #define SK_ZLIB_INCLUDE <zlib.h>
 #define SK_ZLIB_INCLUDE "third_party/zlib/zlib.h"
 
 /*  Define this to allow PDF scalars above 32k.  The PDF/A spec doesn't allow
     them, but modern PDF interpreters should handle them just fine.
  */
-//#define SK_ALLOW_LARGE_PDF_SCALARS
+// #define SK_ALLOW_LARGE_PDF_SCALARS
 
 /*  Define this to provide font subsetter for font subsetting when generating
     PDF documents.
  */
-//#define SK_SFNTLY_SUBSETTER "sfntly/subsetter/font_subsetter.h"
+// #define SK_SFNTLY_SUBSETTER "sfntly/subsetter/font_subsetter.h"
 
 /*  To write debug messages to a console, skia will call SkDebugf(...) following
     printf conventions (e.g. const char* format, ...). If you want to redirect
     this to something other than printf, define yours here
  */
-//#define SkDebugf(...)  MyFunction(__VA_ARGS__)
+// #define SkDebugf(...)  MyFunction(__VA_ARGS__)
 
 
 /*  If SK_DEBUG is defined, then you can optionally define SK_SUPPORT_UNITTEST
@@ -266,4 +270,19 @@
 // do not fail by running out of memory.
 #define GR_GL_CHECK_ALLOC_WITH_GET_ERROR 0
 
-#endif  // SkUserConfig_DEFINED
+// The block below is copied from Skia m79's SkPostConfig.h to preserve the
+// behavior of SK_GL being defined by default.
+#ifdef USE_SKIA_NEXT
+/**
+ * If GPU is enabled but no GPU backends are enabled then enable GL by default.
+ * Traditionally clients have relied on Skia always building with the GL backend
+ * and opting in to additional backends. TODO: Require explicit opt in for GL.
+ */
+#if SK_SUPPORT_GPU
+#if !defined(SK_GL) && !defined(SK_VULKAN) && !defined(SK_METAL)
+#define SK_GL
+#endif
+#endif
+#endif
+
+#endif  // SkUserConfig_DEFINED  NOLINT
diff --git a/cobalt/renderer/rasterizer/skia/skia/skia.gyp b/cobalt/renderer/rasterizer/skia/skia/skia.gyp
deleted file mode 100644
index 5fe1b23..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/skia.gyp
+++ /dev/null
@@ -1,88 +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.
-
-{
-  'targets': [
-    {
-      # This is the target that all Cobalt modules should depend on if they
-      # wish to use Skia.  It augments skia_library (Skia's core code) with
-      # Cobalt specific code defined in source files from skia_cobalt.gypi,
-      # such as platform-specific implementations of certain functions.
-      'target_name': 'skia',
-      'type': 'static_library',
-      'dependencies': [
-        'skia_library',
-      ],
-      'includes': [
-        'skia_cobalt.gypi',
-        'skia_common.gypi',
-      ],
-      'export_dependent_settings': [
-        'skia_library',
-      ],
-    },
-
-    {
-      # Skia's core code from the Skia repository.
-      'target_name': 'skia_library',
-      'type': 'static_library',
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        'skia_library_no_asan',
-      ],
-      'includes': [
-        'skia_common.gypi',
-        'skia_library.gypi',
-        'skia_sksl.gypi',
-      ],
-    },
-
-    {
-      # Skia's core code from the Skia repository that should be compiled
-      # without ASAN. This is done to avoid drastic slowdown in debug unit
-      # tests.
-      'target_name': 'skia_library_no_asan',
-      'type': 'static_library',
-      'includes': [
-        'skia_common.gypi',
-        '<(DEPTH)/third_party/skia/gyp/effects_imagefilters.gypi',
-      ],
-      'sources': [
-        '<@(skia_effects_imagefilter_sources_no_asan)',
-      ],
-      'target_conditions': [
-        ['use_asan==1 and cobalt_config=="debug"', {
-          'cflags!': [
-            '-fsanitize=address',
-          ],
-        }],
-      ],
-    },
-
-    {
-      # A small program imported from Chromium that tests Skia with fuzzed
-      # filters.
-      'target_name': 'filter_fuzz_stub',
-      'type': 'executable',
-      'dependencies': [
-        'skia',
-      ],
-      'sources': [
-        'test/filter_fuzz_stub/filter_fuzz_stub.cc',
-      ],
-    },
-
-    {
-      'target_name': 'filter_fuzz_stub_deploy',
-      'type': 'none',
-      'dependencies': [
-        'filter_fuzz_stub',
-      ],
-      'variables': {
-        'executable_name': 'filter_fuzz_stub',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/skia/skia/skia_cobalt.gypi b/cobalt/renderer/rasterizer/skia/skia/skia_cobalt.gypi
deleted file mode 100644
index 72ac12e..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/skia_cobalt.gypi
+++ /dev/null
@@ -1,56 +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 gypi file contains all the Cobalt-specific enhancements to Skia.
-# In component mode (shared_lib) it is folded into a single shared library with
-# the Skia files but in all other cases it is a separate library.
-{
-  'dependencies': [
-    '<(DEPTH)/base/base.gyp:base',
-    '<(DEPTH)/cobalt/base/base.gyp:base',
-    '<(DEPTH)/cobalt/configuration/configuration.gyp:configuration',
-    '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-    '<(DEPTH)/third_party/freetype2/freetype2_cobalt.gyp:freetype2',
-    '<(DEPTH)/third_party/libxml/libxml.gyp:libxml',
-    'skia_library',
-  ],
-
-  'sources': [
-    'config/SkUserConfig.h',
-    'src/google_logging.cc',
-    'src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc',
-    'src/ports/SkFontConfigParser_cobalt.cc',
-    'src/ports/SkFontConfigParser_cobalt.h',
-    'src/ports/SkFontMgr_cobalt.cc',
-    'src/ports/SkFontMgr_cobalt.h',
-    'src/ports/SkFontMgr_cobalt_factory.cc',
-    'src/ports/SkFontStyleSet_cobalt.cc',
-    'src/ports/SkFontStyleSet_cobalt.h',
-    'src/ports/SkFontUtil_cobalt.cc',
-    'src/ports/SkFontUtil_cobalt.h',
-    'src/ports/SkFreeType_cobalt.cc',
-    'src/ports/SkFreeType_cobalt.h',
-    'src/ports/SkOSFile_cobalt.cc',
-    'src/ports/SkOSFile_cobalt.h',
-    'src/ports/SkStream_cobalt.cc',
-    'src/ports/SkStream_cobalt.h',
-    'src/ports/SkTypeface_cobalt.cc',
-    'src/ports/SkTypeface_cobalt.h',
-    'src/ports/SkTLS_cobalt.cc',
-    'src/ports/SkTime_cobalt.cc',
-  ],
-
-  'include_dirs': [
-    '<(SHARED_INTERMEDIATE_DIR)',
-  ],
-
-  'conditions': [
-    ['OS=="starboard"', {
-      'sources': [
-        'src/ports/SkMemory_starboard.cc',
-      ],
-    }],
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/skia/skia/skia_common.gypi b/cobalt/renderer/rasterizer/skia/skia/skia_common.gypi
deleted file mode 100644
index 892ebab..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/skia_common.gypi
+++ /dev/null
@@ -1,91 +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 gypi file handles the removal of platform-specific files from the
-# Skia build.
-{
-  'include_dirs': [
-    '<(DEPTH)/third_party/skia',
-    'config',
-  ],
-
-  'variables': {
-    'skia_support_pdf': '0',
-    'skia_zlib_static': '1',
-
-    # These two set the paths so we can include skia/gyp/core.gypi
-    'skia_src_path': '<(DEPTH)/third_party/skia/src',
-    'skia_include_path': '<(DEPTH)/third_party/skia/include',
-    'skia_modules_path': '<(DEPTH)/third_party/skia/modules',
-
-    # This list will contain all defines that also need to be exported to
-    # dependent components.
-    'skia_export_defines': [
-      'SK_DISABLE_EFFECT_DESERIALIZATION=1',
-      'SK_SUPPORT_GPU=1',
-      'SK_USER_CONFIG_HEADER="<(DEPTH)/renderer/rasterizer/skia/skia/config/SkUserConfig.h"',
-    ],
-
-    # The |default_font_cache_limit| specifies the max size of the glyph cache,
-    # which contains path and metrics information for glyphs, before it will
-    # start purging entries. The current value matches the limit used by
-    # Android.
-    'default_font_cache_limit%': '(1*1024*1024)',
-  },
-  'dependencies': [
-    '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-  ],
-  'conditions': [
-    ['target_arch == "win"', {
-      'variables': {
-        'skia_export_defines': [
-          # Required define by Skia to take certain code paths, such
-          # as including windows.h in various places.
-          'SK_BUILD_FOR_WIN32',
-        ],
-      },
-    }],
-    ['clang == 1', {
-      'cflags': [
-        '-Wno-tautological-compare',
-      ],
-    }],
-  ],
-
-  'defines': [
-    '<@(skia_export_defines)',
-
-    # skia uses static initializers to initialize the serialization logic
-    # of its "pictures" library. This is currently not used in Cobalt; if
-    # it ever gets used the processes that use it need to call
-    # SkGraphics::Init().
-    'SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=0',
-
-    # ETC1 texture encoding is not supported in Cobalt by default.
-    'SK_IGNORE_ETC1_SUPPORT',
-
-    'SK_DEFAULT_FONT_CACHE_LIMIT=<(default_font_cache_limit)',
-
-    # Use scalar portable implementations instead of Clang/GCC vector extensions
-    # in SkVx.h, as this causes an internal compiler error for raspi-2.
-    'SKNX_NO_SIMD',
-  ],
-
-  'direct_dependent_settings': {
-    'defines': [
-      '<@(skia_export_defines)',
-    ],
-  },
-
-  # We would prefer this to be direct_dependent_settings,
-  # however we currently have no means to enforce that direct dependents
-  # re-export if they include Skia headers in their public headers.
-  'all_dependent_settings': {
-    'include_dirs': [
-      'config',
-    ],
-  },
-
-  'msvs_disabled_warnings': [4244, 4267, 4341, 4345, 4390, 4554, 4748, 4800],
-}
diff --git a/cobalt/renderer/rasterizer/skia/skia/skia_library.gypi b/cobalt/renderer/rasterizer/skia/skia/skia_library.gypi
deleted file mode 100644
index 24d8616..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/skia_library.gypi
+++ /dev/null
@@ -1,202 +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 gypi file contains the Skia library.
-#
-# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-# variables and defines should go in skia_common.gypi so they can be seen
-# by files listed here and in skia_library_opts.gypi.
-# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-{
-  'dependencies': [
-    '<(DEPTH)/third_party/freetype2/freetype2_cobalt.gyp:freetype2',
-    '<(DEPTH)/third_party/libpng/libpng.gyp:libpng',
-    '<(DEPTH)/third_party/skia/third_party/skcms/skcms.gyp:skcms',
-    '<(DEPTH)/third_party/zlib/zlib.gyp:zlib',
-    'skia_library_opts.gyp:skia_opts',
-  ],
-
-  'includes': [
-    '../../../../../third_party/skia/gyp/core.gypi',
-    '../../../../../third_party/skia/gyp/effects.gypi',
-    '../../../../../third_party/skia/gyp/effects_imagefilters.gypi',
-    '../../../../../third_party/skia/gyp/gpu.gypi',
-    '../../../../../third_party/skia/gyp/utils.gypi',
-    '../../../../../third_party/skia/modules/skottie/skottie.gypi',
-    '../../../../../third_party/skia/modules/sksg/sksg.gypi',
-    '../../../../../third_party/skia/modules/skshaper/skshaper.gypi',
-  ],
-
-  'sources': [
-    # from "core.gypi"
-    '<@(skia_core_sources)',
-    '<@(skia_pathops_sources)',
-    '<@(skia_skpicture_sources)',
-
-    '<@(skia_effects_sources)',
-    '<@(skia_effects_imagefilter_sources)',
-
-    # from "gpu.gypi"
-    '<@(skia_gpu_sources)',
-    '<@(skia_ccpr_sources)',
-    '<@(skia_nvpr_sources)',
-
-    '<@(skia_utils_sources)',
-    '<@(skia_skottie_sources)',
-    '<@(skia_sksg_sources)',
-    '<@(skia_shaper_primitive_sources)',
-
-    '<(DEPTH)/third_party/skia/src/codec/SkBmpBaseCodec.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkBmpCodec.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkBmpMaskCodec.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkBmpRLECodec.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkBmpStandardCodec.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkCodec.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkCodecImageGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkColorTable.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkGifCodec.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkMaskSwizzler.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkMasks.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkSampledCodec.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkSampler.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkStreamBuffer.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkSwizzler.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkWbmpCodec.cpp',
-    '<(DEPTH)/third_party/skia/src/images/SkImageEncoder.cpp',
-    '<(DEPTH)/third_party/skia/src/ports/SkDiscardableMemory_none.cpp',
-    '<(DEPTH)/third_party/skia/src/ports/SkImageGenerator_skia.cpp',
-    '<(DEPTH)/third_party/skia/src/sfnt/SkOTTable_name.cpp',
-    '<(DEPTH)/third_party/skia/src/sfnt/SkOTUtils.cpp',
-    '<(DEPTH)/third_party/skia/third_party/gif/SkGifImageReader.cpp',
-
-    '<(DEPTH)/third_party/skia/src/ports/SkFontHost_FreeType.cpp',
-    '<(DEPTH)/third_party/skia/src/ports/SkFontHost_FreeType_common.cpp',
-    '<(DEPTH)/third_party/skia/src/ports/SkFontHost_FreeType_common.h',
-    '<(DEPTH)/third_party/skia/src/ports/SkGlobalInitialization_default.cpp',
-  ],
-  # Exclude all unused skia files
-  'sources!': [
-    # codec
-    '<(DEPTH)/third_party/skia/src/codec/SkAndroidCodec.cpp',
-    '<(DEPTH)/third_party/skia/src/codec/SkSampledCodec.cpp',
-
-    # core
-    '<(DEPTH)/third_party/skia/src/core/SkMultiPictureDraw.cpp',
-    '<(DEPTH)/third_party/skia/src/core/SkTime.cpp',
-
-    # gpu
-    "<(DEPTH)/third_party/skia/src/gpu/gl/GrGLMakeNativeInterface_none.cpp",
-
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLMetalCodeGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLMetalCodeGenerator.h',
-
-    # utils concurrency
-    '<(DEPTH)/third_party/skia/src/utils/SkCondVar.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkCondVar.h',
-    '<(DEPTH)/third_party/skia/src/utils/SkRunnable.h',
-
-    # utils paint
-    '<(DEPTH)/third_party/skia/include/utils/SkBoundaryPatch.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkCamera.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkCanvasStateUtils.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkCubicInterval.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkCullPoints.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkDebugUtils.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkEventTracer.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkFrontBufferedStream.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkInterpolator.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkLayer.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkMeshUtils.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkNinePatch.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkParsePaint.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkParsePath.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkRandom.h',
-    '<(DEPTH)/third_party/skia/include/utils/SkWGL.h',
-
-    # utils bitmap
-    '<(DEPTH)/third_party/skia/src/utils/SkBitmapHasher.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkBitmapHasher.h',
-    '<(DEPTH)/third_party/skia/src/utils/SkBoundaryPatch.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkCamera.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkCanvasStack.h',
-    '<(DEPTH)/third_party/skia/src/utils/SkCubicInterval.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkCullPoints.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkFloatUtils.h',
-    '<(DEPTH)/third_party/skia/src/utils/SkFrontBufferedStream.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkGatherPixelRefsAndRects.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkGatherPixelRefsAndRects.h',
-    '<(DEPTH)/third_party/skia/src/utils/SkInterpolator.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkLayer.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkMD5.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkMD5.h',
-    '<(DEPTH)/third_party/skia/src/utils/SkMeshUtils.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkNinePatch.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkParseColor.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkParsePath.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkPathUtils.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkSHA1.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkSHA1.h',
-    '<(DEPTH)/third_party/skia/src/utils/SkTFitsIn.h',
-    '<(DEPTH)/third_party/skia/src/utils/SkTLogic.h',
-    '<(DEPTH)/third_party/skia/src/utils/SkThreadUtils_pthread.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkThreadUtils_pthread_linux.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkThreadUtils_pthread_mach.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkThreadUtils_pthread_other.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/SkThreadUtils_win.cpp',
-
-    # mac
-    '<(DEPTH)/third_party/skia/include/utils/mac/SkCGUtils.h',
-    '<(DEPTH)/third_party/skia/src/utils/mac/SkCreateCGImageRef.cpp',
-
-    # windows
-    '<(DEPTH)/third_party/skia/src/utils/win/SkAutoCoInitialize.h',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkAutoCoInitialize.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkDWrite.h',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkDWrite.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkDWriteFontFileStream.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkDWriteFontFileStream.h',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkDWriteGeometrySink.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkDWriteGeometrySink.h',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkHRESULT.h',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkHRESULT.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkIStream.h',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkIStream.cpp',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkTScopedComPtr.h',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkWGL.h',
-    '<(DEPTH)/third_party/skia/src/utils/win/SkWGL_win.cpp',
-  ],
-
-  'direct_dependent_settings': {
-    'include_dirs': [
-      #temporary until we can hide SkFontHost
-      '<(DEPTH)/third_party/skia',
-      '<(DEPTH)/third_party/skia/src/core',
-      '<(DEPTH)/third_party/skia/src/utils',
-
-      '<(DEPTH)/third_party/skia/include/core',
-      '<(DEPTH)/third_party/skia/include/effects',
-      '<(DEPTH)/third_party/skia/include/gpu',
-      '<(DEPTH)/third_party/skia/include/lazy',
-      '<(DEPTH)/third_party/skia/include/pathops',
-      '<(DEPTH)/third_party/skia/include/pipe',
-      '<(DEPTH)/third_party/skia/include/ports',
-      '<(DEPTH)/third_party/skia/include/private',
-      '<(DEPTH)/third_party/skia/include/utils',
-    ],
-  },
-
-  'conditions': [
-    ['target_os=="linux"', {
-      'cflags': [
-        '-Wno-deprecated-declarations',
-      ],
-    }],
-    ['OS=="starboard"', {
-      'sources!': [
-        '<(DEPTH)/third_party/skia/src/ports/SkMemory_malloc.cpp',
-      ],
-    }],
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/skia/skia/skia_library_opts.gyp b/cobalt/renderer/rasterizer/skia/skia/skia_library_opts.gyp
deleted file mode 100644
index 84b92dd..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/skia_library_opts.gyp
+++ /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.
-
-
-# This gyp file contains the platform-specific optimizations for Skia
-{
-  'targets': [
-    {
-      'target_name': 'skia_opts',
-      'type': 'none',
-      'includes': [
-        'skia_common.gypi',
-      ],
-      'include_dirs': [
-        '<(DEPTH)/third_party/skia/include/core',
-        '<(DEPTH)/third_party/skia/include/effects',
-        '<(DEPTH)/third_party/skia/src/core',
-        '<(DEPTH)/third_party/skia/src/opts',
-        '<(DEPTH)/third_party/skia/src/utils',
-      ],
-      'dependencies': [
-        'skia_opts_none',
-      ],
-    },
-    {
-      'target_name': 'skia_opts_none',
-      'type': 'static_library',
-      'includes': [
-        'skia_common.gypi',
-      ],
-      'include_dirs': [
-        '<(DEPTH)/third_party/skia/include/core',
-        '<(DEPTH)/third_party/skia/include/effects',
-        '<(DEPTH)/third_party/skia/src/core',
-        '<(DEPTH)/third_party/skia/src/utils',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/skia/skia/skia_next.gni b/cobalt/renderer/rasterizer/skia/skia/skia_next.gni
index 7c61125..054bbc1 100644
--- a/cobalt/renderer/rasterizer/skia/skia/skia_next.gni
+++ b/cobalt/renderer/rasterizer/skia/skia/skia_next.gni
@@ -12,10 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-declare_args() {
-  use_skia_next = false
-}
-
 skia_subdir = "skia"
 skia_include_dir = ""
 
diff --git a/cobalt/renderer/rasterizer/skia/skia/skia_sksl.gypi b/cobalt/renderer/rasterizer/skia/skia/skia_sksl.gypi
deleted file mode 100644
index 6b8b4da..0000000
--- a/cobalt/renderer/rasterizer/skia/skia/skia_sksl.gypi
+++ /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.
-
-
-# This gypi file contains all the Cobalt-specific enhancements to Skia.
-# In component mode (shared_lib) it is folded into a single shared library with
-# the Skia files but in all other cases it is a separate library.
-{
-  'sources': [
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLASTNode.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLByteCode.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLCFGGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLCompiler.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLCPPCodeGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLCPPUniformCTypes.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLGLSLCodeGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLHCodeGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLIRGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLLexer.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLMetalCodeGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLOutputStream.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLParser.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLPipelineStageCodeGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLSPIRVCodeGenerator.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLSectionAndParameterHelper.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLString.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/SkSLUtil.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/ir/SkSLSetting.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/ir/SkSLSymbolTable.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/ir/SkSLType.cpp',
-    '<(DEPTH)/third_party/skia/src/sksl/ir/SkSLVariableReference.cpp',
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/skia/skia/skia_sources.gni b/cobalt/renderer/rasterizer/skia/skia/skia_sources.gni
index 03a9310..23b5289 100644
--- a/cobalt/renderer/rasterizer/skia/skia/skia_sources.gni
+++ b/cobalt/renderer/rasterizer/skia/skia/skia_sources.gni
@@ -67,6 +67,10 @@
 
 # from "gpu.gni"
 combined_sources += skia_gpu_sources
+if (use_skia_next) {
+  combined_sources += skia_gl_gpu_sources
+  combined_sources += skia_shared_gpu_sources
+}
 
 combined_sources += skia_utils_sources
 combined_sources += skia_skottie_sources
@@ -128,15 +132,159 @@
 
 if (use_skia_next) {
   sksl_sources = [
+    "//third_party/$skia_subdir/include/sksl/DSLBlock.h",
+    "//third_party/$skia_subdir/include/sksl/DSLCase.h",
+    "//third_party/$skia_subdir/include/sksl/DSLCore.h",
+    "//third_party/$skia_subdir/include/sksl/DSLExpression.h",
+    "//third_party/$skia_subdir/include/sksl/DSLFunction.h",
+    "//third_party/$skia_subdir/include/sksl/DSLLayout.h",
+    "//third_party/$skia_subdir/include/sksl/DSLStatement.h",
+    "//third_party/$skia_subdir/include/sksl/DSLSymbols.h",
+    "//third_party/$skia_subdir/include/sksl/DSLType.h",
+    "//third_party/$skia_subdir/include/sksl/DSLVar.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLAnalysis.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLAnalysis.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLBuiltinTypes.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLBuiltinTypes.h",
     "//third_party/$skia_subdir/src/sksl/SkSLCompiler.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLCompiler.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLConstantFolder.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLConstantFolder.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLContext.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLContext.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLDSLParser.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLDSLParser.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLErrorReporter.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLInliner.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLInliner.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLIntrinsicMap.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLIntrinsicMap.h",
     "//third_party/$skia_subdir/src/sksl/SkSLLexer.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLLexer.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLMangler.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLMangler.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLOperators.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLOperators.h",
     "//third_party/$skia_subdir/src/sksl/SkSLOutputStream.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLOutputStream.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLPool.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLPool.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLRehydrator.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLRehydrator.h",
+    "//third_party/$skia_subdir/src/sksl/SkSLSampleUsage.cpp",
     "//third_party/$skia_subdir/src/sksl/SkSLString.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLThreadContext.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLThreadContext.h",
     "//third_party/$skia_subdir/src/sksl/SkSLUtil.cpp",
+    "//third_party/$skia_subdir/src/sksl/SkSLUtil.h",
+    "//third_party/$skia_subdir/src/sksl/analysis/SkSLCanExitWithoutReturningValue.cpp",
+    "//third_party/$skia_subdir/src/sksl/analysis/SkSLCheckProgramUnrolledSize.cpp",
+    "//third_party/$skia_subdir/src/sksl/analysis/SkSLGetLoopUnrollInfo.cpp",
+    "//third_party/$skia_subdir/src/sksl/analysis/SkSLIsConstantExpression.cpp",
+    "//third_party/$skia_subdir/src/sksl/analysis/SkSLProgramUsage.cpp",
+    "//third_party/$skia_subdir/src/sksl/analysis/SkSLSwitchCaseContainsExit.cpp",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLCodeGenerator.h",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLGLSLCodeGenerator.h",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLMetalCodeGenerator.cpp",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLMetalCodeGenerator.h",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLPipelineStageCodeGenerator.cpp",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLPipelineStageCodeGenerator.h",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLSPIRVCodeGenerator.h",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLSPIRVtoHLSL.cpp",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLSPIRVtoHLSL.h",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLVMCodeGenerator.cpp",
+    "//third_party/$skia_subdir/src/sksl/codegen/SkSLVMCodeGenerator.h",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLBlock.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLCase.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLCore.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLExpression.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLFunction.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLLayout.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLStatement.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLSymbols.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLType.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/DSLVar.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/priv/DSLFPs.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/priv/DSLFPs.h",
+    "//third_party/$skia_subdir/src/sksl/dsl/priv/DSLWriter.cpp",
+    "//third_party/$skia_subdir/src/sksl/dsl/priv/DSLWriter.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLBinaryExpression.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLBinaryExpression.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLBlock.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLBlock.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLChildCall.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLChildCall.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructor.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructor.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorArray.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorArray.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorArrayCast.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorArrayCast.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorCompound.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorCompound.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorCompoundCast.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorCompoundCast.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorDiagonalMatrix.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorDiagonalMatrix.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorMatrixResize.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorMatrixResize.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorScalarCast.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorScalarCast.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorSplat.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorSplat.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorStruct.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLConstructorStruct.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLDoStatement.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLDoStatement.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLExpressionStatement.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLExpressionStatement.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLFieldAccess.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLFieldAccess.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLForStatement.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLForStatement.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLFunctionCall.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLFunctionCall.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLFunctionDeclaration.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLFunctionDeclaration.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLFunctionDefinition.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLFunctionDefinition.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLIfStatement.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLIfStatement.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLIndexExpression.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLIndexExpression.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLModifiers.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLPostfixExpression.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLPostfixExpression.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLPrefixExpression.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLPrefixExpression.h",
     "//third_party/$skia_subdir/src/sksl/ir/SkSLSetting.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLSetting.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLSwitchStatement.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLSwitchStatement.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLSwizzle.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLSwizzle.h",
     "//third_party/$skia_subdir/src/sksl/ir/SkSLSymbolTable.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLSymbolTable.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLTernaryExpression.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLTernaryExpression.h",
     "//third_party/$skia_subdir/src/sksl/ir/SkSLType.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLType.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLTypeReference.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLTypeReference.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLVarDeclarations.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLVarDeclarations.h",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLVariable.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLVariable.h",
     "//third_party/$skia_subdir/src/sksl/ir/SkSLVariableReference.cpp",
+    "//third_party/$skia_subdir/src/sksl/ir/SkSLVariableReference.h",
+    "//third_party/$skia_subdir/src/sksl/transform/SkSLBuiltinVariableScanner.cpp",
+    "//third_party/$skia_subdir/src/sksl/transform/SkSLEliminateDeadFunctions.cpp",
+    "//third_party/$skia_subdir/src/sksl/transform/SkSLEliminateDeadGlobalVariables.cpp",
+    "//third_party/$skia_subdir/src/sksl/transform/SkSLEliminateDeadLocalVariables.cpp",
+    "//third_party/$skia_subdir/src/sksl/transform/SkSLEliminateUnreachableCode.cpp",
+    "//third_party/$skia_subdir/src/sksl/transform/SkSLTransform.h",
   ]
 } else {
   sksl_sources = [
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc
index d5dc2fa..216bba9 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 #include "cobalt/renderer/egl_and_gles.h"
 #include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h"
@@ -74,9 +73,6 @@
   REGISTER_GL_FUNCTION(GetShaderInfoLog);
   REGISTER_GL_FUNCTION(GetShaderiv);
   REGISTER_GL_FUNCTION(GetString);
-#if SB_API_VERSION < 12 && defined(GLES3_SUPPORTED)
-  REGISTER_GL_FUNCTION(GetStringi);
-#endif
   REGISTER_GL_FUNCTION(GetUniformLocation);
   REGISTER_GL_FUNCTION(IsTexture);
   REGISTER_GL_FUNCTION(LinkProgram);
@@ -149,12 +145,3 @@
 const GrGLInterface* GrGLCreateNativeInterface() {
   return GrGLAssembleInterface(NULL, &GetGLProc);
 }
-#else  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
-#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
-
-sk_sp<const GrGLInterface> GrGLMakeNativeInterface() { return nullptr; }
-
-const GrGLInterface* GrGLCreateNativeInterface() { return nullptr; }
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
index 8ada3a2..7d694af 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
@@ -67,16 +67,15 @@
       *system_font_config_directory != '\0' &&
       system_font_files_directory != NULL &&
       *system_font_files_directory != '\0' &&
-      (0 != strcmp(cobalt_font_files_directory,
-                               system_font_files_directory))) {
+      (0 != strcmp(cobalt_font_files_directory, system_font_files_directory))) {
     TRACE_EVENT0("cobalt::renderer", "LoadSystemFontFamilies");
     ParseConfigAndBuildFamilies(system_font_config_directory,
                                 system_font_files_directory,
                                 &priority_fallback_families);
   }
 
-// Load local fallback fonts if available.
-// The fonts are added in addition to the Cobalt and System fonts.
+  // Load local fallback fonts if available.
+  // The fonts are added in addition to the Cobalt and System fonts.
   const CobaltExtensionFontApi* font_extension =
       static_cast<const CobaltExtensionFontApi*>(
           SbSystemGetExtension(kCobaltExtensionFontName));
@@ -267,6 +266,13 @@
                         face_index);
 }
 
+#ifdef USE_SKIA_NEXT
+sk_sp<SkTypeface> SkFontMgr_Cobalt::onMakeFromStreamArgs(
+    std::unique_ptr<SkStreamAsset> stream, const SkFontArguments& args) const {
+  return this->makeFromStream(std::move(stream), args.getCollectionIndex());
+}
+#endif
+
 sk_sp<SkTypeface> SkFontMgr_Cobalt::onMakeFromStreamIndex(
     std::unique_ptr<SkStreamAsset> stream, int face_index) const {
   TRACE_EVENT0("cobalt::renderer", "SkFontMgr_Cobalt::onMakeFromStreamIndex()");
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
index 10f6b0c..0cb99d5 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
@@ -101,6 +101,12 @@
   sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData> data,
                                    int face_index) const override;
 
+#ifdef USE_SKIA_NEXT
+  // NOTE: This returns NULL if the typeface cannot be created.
+  sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset>,
+                                         const SkFontArguments&) const override;
+#endif
+
   // NOTE: This returns NULL if the typeface cannot be created.
   sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset> stream,
                                           int face_index) const override;
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkMemory_starboard.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkMemory_starboard.cc
index c9e7b79..ca1c03a 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkMemory_starboard.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkMemory_starboard.cc
@@ -13,7 +13,6 @@
 // limitations under the License.
 
 #include "SkMalloc.h"
-#include "SkTypes.h"
 #include "starboard/memory.h"
 #include "starboard/system.h"
 
@@ -21,8 +20,7 @@
   SkASSERT((SkDebugf(fmt "\n", __VA_ARGS__), false))
 
 static inline void sk_out_of_memory(size_t size) {
-  SK_DEBUGFAILF("sk_out_of_memory (asked for " SK_SIZE_T_SPECIFIER " bytes)",
-                size);
+  SK_DEBUGFAILF("sk_out_of_memory (asked for %zu bytes)", size);
   SbSystemBreakIntoDebugger();
 }
 
@@ -37,9 +35,7 @@
 
 void sk_abort_no_print() { SbSystemBreakIntoDebugger(); }
 
-void sk_out_of_memory(void) {
-  SbSystemBreakIntoDebugger();
-}
+void sk_out_of_memory(void) { SbSystemBreakIntoDebugger(); }
 
 void* sk_realloc_throw(void* addr, size_t size) {
   return throw_on_failure(size, SbMemoryReallocate(addr, size));
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
index a116c2c..837ce75 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
@@ -93,6 +93,17 @@
   return stream_->getLength();
 }
 
+#ifdef USE_SKIA_NEXT
+std::unique_ptr<SkFontData> SkTypeface_CobaltStream::onMakeFontData() const {
+  int index;
+  std::unique_ptr<SkStreamAsset> stream(this->onOpenStream(&index));
+  if (!stream) {
+    return nullptr;
+  }
+  return std::make_unique<SkFontData>(std::move(stream), index, nullptr, 0);
+}
+#endif
+
 SkTypeface_CobaltStreamProvider::SkTypeface_CobaltStreamProvider(
     SkFileMemoryChunkStreamProvider* stream_provider, int face_index,
     SkFontStyle style, bool is_fixed_pitch, const SkString& family_name,
@@ -132,3 +143,15 @@
       stream_provider_->OpenStream());
   return stream->getLength();
 }
+
+#ifdef USE_SKIA_NEXT
+std::unique_ptr<SkFontData> SkTypeface_CobaltStreamProvider::onMakeFontData()
+    const {
+  int index;
+  std::unique_ptr<SkStreamAsset> stream(this->onOpenStream(&index));
+  if (!stream) {
+    return nullptr;
+  }
+  return std::make_unique<SkFontData>(std::move(stream), index, nullptr, 0);
+}
+#endif
diff --git a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
index 291ff2d..f5ede9c 100644
--- a/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
+++ b/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
@@ -66,6 +66,9 @@
                            bool* serialize) const override;
 
   std::unique_ptr<SkStreamAsset> onOpenStream(int* face_index) const override;
+#ifdef USE_SKIA_NEXT
+  std::unique_ptr<SkFontData> onMakeFontData() const override;
+#endif
 
   size_t GetStreamLength() const override;
 
@@ -87,6 +90,9 @@
                            bool* serialize) const override;
 
   std::unique_ptr<SkStreamAsset> onOpenStream(int* face_index) const override;
+#ifdef USE_SKIA_NEXT
+  std::unique_ptr<SkFontData> onMakeFontData() const override;
+#endif
 
   size_t GetStreamLength() const override;
 
diff --git a/cobalt/renderer/rasterizer/skia/software_rasterizer.gyp b/cobalt/renderer/rasterizer/skia/software_rasterizer.gyp
deleted file mode 100644
index be89a66..0000000
--- a/cobalt/renderer/rasterizer/skia/software_rasterizer.gyp
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'software_rasterizer',
-      'type': 'static_library',
-
-      'sources': [
-        'software_image.cc',
-        'software_image.h',
-        'software_mesh.h',
-        'software_rasterizer.cc',
-        'software_rasterizer.h',
-        'software_resource_provider.cc',
-        'software_resource_provider.h',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/common.gyp:common',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/skia/skia.gyp:skia',
-        '<(DEPTH)/third_party/harfbuzz-ng/harfbuzz.gyp:harfbuzz-ng',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        '<(DEPTH)/third_party/ots/ots.gyp:ots',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/rasterizer/skia/vertex_buffer_object.cc b/cobalt/renderer/rasterizer/skia/vertex_buffer_object.cc
index 1a471a3..c530def 100644
--- a/cobalt/renderer/rasterizer/skia/vertex_buffer_object.cc
+++ b/cobalt/renderer/rasterizer/skia/vertex_buffer_object.cc
@@ -12,16 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "starboard/configuration.h"
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
+#include "cobalt/renderer/rasterizer/skia/vertex_buffer_object.h"
 
 #include <memory>
 #include <vector>
 
-#include "cobalt/renderer/rasterizer/skia/vertex_buffer_object.h"
-
 #include "cobalt/renderer/backend/egl/utils.h"
-
+#include "starboard/configuration.h"
 namespace cobalt {
 namespace renderer {
 namespace rasterizer {
@@ -66,5 +63,3 @@
 }  // namespace rasterizer
 }  // namespace renderer
 }  // namespace cobalt
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
diff --git a/cobalt/renderer/rasterizer/stub/rasterizer.gyp b/cobalt/renderer/rasterizer/stub/rasterizer.gyp
deleted file mode 100644
index c546626..0000000
--- a/cobalt/renderer/rasterizer/stub/rasterizer.gyp
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'rasterizer',
-      'type': 'static_library',
-
-      'sources': [
-        'rasterizer.cc',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/renderer/rasterizer/common/common.gyp:common',
-      ],
-    },
-  ],
-}
\ No newline at end of file
diff --git a/cobalt/renderer/render_tree_pixel_tester.cc b/cobalt/renderer/render_tree_pixel_tester.cc
index f617aab..4ffc338 100644
--- a/cobalt/renderer/render_tree_pixel_tester.cc
+++ b/cobalt/renderer/render_tree_pixel_tester.cc
@@ -30,7 +30,11 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkPixelRef.h"
+#ifdef USE_SKIA_NEXT
+#include "third_party/skia/include/effects/SkImageFilters.h"
+#else
 #include "third_party/skia/include/effects/SkBlurImageFilter.h"
+#endif
 
 // Avoid overriding of Windows' CreateDirectory macro.
 #undef CreateDirectory
@@ -133,13 +137,23 @@
   DCHECK(blurred_bitmap_allocated);
 
   SkPaint paint;
+#ifdef USE_SKIA_NEXT
+  sk_sp<SkImageFilter> blur_filter(SkImageFilters::Blur(sigma, sigma, nullptr));
+#else
   sk_sp<SkImageFilter> blur_filter(
       SkBlurImageFilter::Make(sigma, sigma, nullptr));
+#endif
   paint.setImageFilter(blur_filter);
 
   SkCanvas canvas(blurred_bitmap);
   canvas.clear(SkColorSetARGB(0, 0, 0, 0));
+#ifdef USE_SKIA_NEXT
+  premul_alpha_bitmap.setImmutable();
+  sk_sp<SkImage> image = SkImage::MakeFromBitmap(premul_alpha_bitmap);
+  canvas.drawImage(image, 0, 0, SkSamplingOptions(), &paint);
+#else
   canvas.drawBitmap(premul_alpha_bitmap, 0, 0, &paint);
+#endif
 
   return blurred_bitmap;
 }
diff --git a/cobalt/renderer/renderer.gyp b/cobalt/renderer/renderer.gyp
deleted file mode 100644
index 7acd97c..0000000
--- a/cobalt/renderer/renderer.gyp
+++ /dev/null
@@ -1,173 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      # This target conveniently aggregates all sub-modules required to declare
-      # and implement rasterization commands as well as display/GPU resource
-      # management and communication.  It will eventually also contain source
-      # code to help glue all of the components together.
-      'target_name': 'renderer',
-      'type': 'static_library',
-      'sources': [
-        'egl_and_gles.h',
-        'fps_overlay.cc',
-        'fps_overlay.h',
-        'gles_ext.h',
-        'pipeline.cc',
-        'pipeline.h',
-        'renderer_module.cc',
-        'renderer_module.h',
-        'renderer_module_default_options.cc',
-        'smoothed_value.cc',
-        'smoothed_value.h',
-        'submission.h',
-        'submission_queue.cc',
-        'submission_queue.h',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/content/fonts/fonts.gyp:copy_font_data',
-        '<(DEPTH)/cobalt/debug/debug.gyp:console_command_manager',
-        '<(DEPTH)/cobalt/math/math.gyp:math',
-        '<(DEPTH)/cobalt/render_tree/render_tree.gyp:animations',
-        '<(DEPTH)/cobalt/render_tree/render_tree.gyp:render_tree',
-        '<(DEPTH)/cobalt/renderer/backend/backend.gyp:renderer_backend',
-        '<(DEPTH)/cobalt/renderer/rasterizer/rasterizer.gyp:rasterizer',
-        '<(DEPTH)/cobalt/system_window/system_window.gyp:system_window',
-        '<(DEPTH)/nb/nb.gyp:nb',
-      ],
-      'conditions': [
-        ['OS=="starboard"', {
-          'dependencies': [
-            '<(default_renderer_options_dependency)',
-          ],
-        }],
-        ['cobalt_minimum_frame_time_in_milliseconds != -1', {
-          'defines': [
-            'COBALT_MINIMUM_FRAME_TIME_IN_MILLISECONDS=<(cobalt_minimum_frame_time_in_milliseconds)',
-          ],
-        }],
-      ],
-    },
-
-    {
-      # This target provides functionality for testing that rasterization
-      # results for a given render tree match up with a pre-existing
-      # "expected output" image that is stored offline as a file.
-      'target_name': 'render_tree_pixel_tester',
-      'type': 'static_library',
-      'sources': [
-        'render_tree_pixel_tester.cc',
-        'render_tree_pixel_tester.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/renderer/rasterizer/skia/skia/skia.gyp:skia',
-        '<(DEPTH)/cobalt/renderer/test/png_utils/png_utils.gyp:png_utils',
-        'renderer',
-      ],
-    },
-
-    {
-      'target_name': 'renderer_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'animations_test.cc',
-        'pipeline_test.cc',
-        'rasterizer/lottie_coverage_pixel_test.cc',
-        'rasterizer/pixel_test.cc',
-        'rasterizer/pixel_test_fixture.cc',
-        'rasterizer/pixel_test_fixture.h',
-        'rasterizer/stress_test.cc',
-        'resource_provider_test.cc',
-        'smoothed_value_test.cc',
-        'submission_queue_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        'render_tree_pixel_tester',
-        'renderer_copy_test_data',
-      ],
-      'conditions': [
-        ['enable_map_to_mesh != -1', {
-          'defines' : [
-            'ENABLE_MAP_TO_MESH=<(enable_map_to_mesh)',
-          ],
-        }],
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'renderer_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<(DEPTH)/cobalt/renderer/rasterizer/testdata',
-          '<!@pymod_do_main(starboard.build.gyp_functions file_glob_sub <(DEPTH)/cobalt/renderer/rasterizer/testdata/lottie_coverage *.json.sha1 json.sha1 json)',
-'<!@pymod_do_main(starboard.build.gyp_functions file_glob_sub <(DEPTH)/cobalt/renderer/rasterizer/testdata/lottie_coverage *.png.sha1 png.sha1 png)',
-        ],
-        'content_test_output_subdir': 'cobalt/renderer/rasterizer',
-      },
-      'actions' : [
-        {
-          'variables': {
-            'sha_dir': '<(DEPTH)/cobalt/renderer/rasterizer/testdata/lottie_coverage',
-            # GYP will remove an argument to an action that looks like a duplicate, so
-            # we change it semantically here.
-            'out_dir': '<(DEPTH)/cobalt/../cobalt/renderer/rasterizer/testdata/lottie_coverage',
-          },
-          'action_name': 'renderer_download_lottie_test_data',
-          'action': [
-            'python',
-            '<(DEPTH)/tools/download_from_gcs.py',
-            '--bucket', 'lottie-coverage-testdata',
-            '--sha1', '<(sha_dir)',
-            '--output', '<(out_dir)',
-          ],
-          'inputs': [
-            '<!@pymod_do_main(starboard.build.gyp_functions file_glob <(sha_dir) *.json.sha1)',
-            '<!@pymod_do_main(starboard.build.gyp_functions file_glob <(sha_dir) *.png.sha1)',
-          ],
-          'outputs': [
-            '<!@pymod_do_main(starboard.build.gyp_functions file_glob_sub <(DEPTH)/cobalt/renderer/rasterizer/testdata/lottie_coverage *.json.sha1 json.sha1 json)',
-            '<!@pymod_do_main(starboard.build.gyp_functions file_glob_sub <(DEPTH)/cobalt/renderer/rasterizer/testdata/lottie_coverage *.png.sha1 png.sha1 png)',
-          ],
-        },
-      ],
-      'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-    },
-
-    {
-      'target_name': 'renderer_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'renderer_test',
-      ],
-      'variables': {
-        'executable_name': 'renderer_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/renderer_module.cc b/cobalt/renderer/renderer_module.cc
index d238a08..3fc7a0f 100644
--- a/cobalt/renderer/renderer_module.cc
+++ b/cobalt/renderer/renderer_module.cc
@@ -91,15 +91,11 @@
         base::Bind(options_.create_rasterizer_function, graphics_context_.get(),
                    options_),
         display_->GetRenderTarget(), graphics_context_.get(),
-#if SB_API_VERSION < 12
-        options_.submit_even_if_render_tree_is_unchanged,
-#else
         // SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER is deprecated in
         // favor of the usage of 'CobaltExtensionGraphicsApi', use 'false' to
         // deprecate the submit_even_if_render_tree_is_unchanged.
-        false,
-#endif
-        renderer::Pipeline::kClearAccordingToPlatform, pipeline_options));
+        false, renderer::Pipeline::kClearAccordingToPlatform,
+        pipeline_options));
   }
 }
 
diff --git a/cobalt/renderer/renderer_module.h b/cobalt/renderer/renderer_module.h
index fd49ffd..e723d5b 100644
--- a/cobalt/renderer/renderer_module.h
+++ b/cobalt/renderer/renderer_module.h
@@ -78,14 +78,6 @@
     // (e.g. screenshot diff tools).
     bool force_deterministic_rendering;
 
-#if SB_API_VERSION < 12
-    // If this flag is set to true, the pipeline will not re-submit a render
-    // tree if it has not changed from the previous submission.  This can save
-    // CPU time so long as there's no problem with the fact that the display
-    // buffer will not be frequently swapped.
-    bool submit_even_if_render_tree_is_unchanged;
-#endif
-
     // If this flag is set to true, which is the default value, then all of
     // Skia's font caches are purged during destruction. These caches have
     // lifespans that are uncoupled from the resource provider's, and will not
diff --git a/cobalt/renderer/renderer_module_default_options.cc b/cobalt/renderer/renderer_module_default_options.cc
index 2658a1b..04b688c 100644
--- a/cobalt/renderer/renderer_module_default_options.cc
+++ b/cobalt/renderer/renderer_module_default_options.cc
@@ -21,14 +21,6 @@
 namespace renderer {
 
 void RendererModule::Options::SetPerPlatformDefaultOptions() {
-#if SB_API_VERSION < 12
-  // If there is no need to frequently flip the display buffer, then enable
-  // support for an optimization where the scene is not re-rasterized each frame
-  // if it has not changed from the last frame.
-  submit_even_if_render_tree_is_unchanged =
-      SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER;
-#endif
-
   create_rasterizer_function =
       GetDefaultRasterizerForPlatform().create_rasterizer_callback;
 }
diff --git a/cobalt/renderer/sandbox/BUILD.gn b/cobalt/renderer/sandbox/BUILD.gn
index ba175a0..faebec3 100644
--- a/cobalt/renderer/sandbox/BUILD.gn
+++ b/cobalt/renderer/sandbox/BUILD.gn
@@ -30,6 +30,8 @@
     "//cobalt/system_window",
     "//cobalt/trace_event",
   ]
+
+  content_deps = [ "//cobalt/renderer/test/scenes:scenes_copy_test_data" ]
 }
 
 # This target will build a sandbox application that allows for easy
@@ -47,4 +49,6 @@
     "//cobalt/system_window",
     "//cobalt/trace_event",
   ]
+
+  content_deps = [ "//cobalt/renderer/test/scenes:scenes_copy_test_data" ]
 }
diff --git a/cobalt/renderer/sandbox/sandbox.gyp b/cobalt/renderer/sandbox/sandbox.gyp
deleted file mode 100644
index 2867f2c..0000000
--- a/cobalt/renderer/sandbox/sandbox.gyp
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This is a sample sandbox application for experimenting with the Cobalt
-# render tree/renderer interface.
-
-{
-  'targets': [
-    {
-      'target_name': 'renderer_sandbox',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'renderer_sandbox_main.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/renderer/renderer.gyp:renderer',
-        '<(DEPTH)/cobalt/system_window/system_window.gyp:system_window',
-        '<(DEPTH)/cobalt/renderer/test/scenes/scenes.gyp:scenes',
-        '<(DEPTH)/cobalt/trace_event/trace_event.gyp:trace_event',
-      ],
-    },
-
-    # This target will build a sandbox application that allows for easy
-    # experimentation with the renderer interface on any platform.  This can
-    # also be useful for visually inspecting the output that the Cobalt
-    # renderer is producing.
-    {
-      'target_name': 'renderer_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'renderer_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'renderer_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-    {
-      'target_name': 'scaling_text_sandbox',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'scaling_text_sandbox_main.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/renderer/renderer.gyp:renderer',
-        '<(DEPTH)/cobalt/system_window/system_window.gyp:system_window',
-        '<(DEPTH)/cobalt/renderer/test/scenes/scenes.gyp:scenes',
-        '<(DEPTH)/cobalt/trace_event/trace_event.gyp:trace_event',
-      ],
-    },
-
-    # This target will build a sandbox application that allows for easy
-    # experimentation with the renderer's handling of text where its scale
-    # is constantly animating, which for many implementations can be a
-    # performance problem.
-    {
-      'target_name': 'scaling_text_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'scaling_text_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'scaling_text_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/renderer/test/jpeg_utils/jpeg_utils.gyp b/cobalt/renderer/test/jpeg_utils/jpeg_utils.gyp
deleted file mode 100644
index ca6a5c2..0000000
--- a/cobalt/renderer/test/jpeg_utils/jpeg_utils.gyp
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      # This target provides code that can encode a JPEG file,
-      # optimized for speed
-      'target_name': 'jpeg_utils',
-      'type': 'static_library',
-      'sources': [
-        'jpeg_encode.cc',
-        'jpeg_encode.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/third_party/libjpeg-turbo/libjpeg.gyp:libjpeg'
-      ],
-    },
-  ]
-}
\ No newline at end of file
diff --git a/cobalt/renderer/test/png_utils/png_utils.gyp b/cobalt/renderer/test/png_utils/png_utils.gyp
deleted file mode 100644
index 19b12c4..0000000
--- a/cobalt/renderer/test/png_utils/png_utils.gyp
+++ /dev/null
@@ -1,67 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      # This target provides (not production suitable) utility code for decoding
-      # and encoding PNG files.  This is useful for sandboxes and tests for
-      # quickly and easily loading in PNG files or saving PNG files as output.
-      'target_name': 'png_utils',
-      'type': 'static_library',
-      'sources': [
-        'png_decode.cc',
-        'png_decode.h',
-        'png_encode.cc',
-        'png_encode.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/render_tree/render_tree.gyp:render_tree',
-        '<(DEPTH)/third_party/libpng/libpng.gyp:libpng',
-      ],
-    },
-
-    {
-      'target_name': 'png_utils_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'png_decode_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'png_utils',
-        'png_utils_copy_test_data',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'png_utils_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          'png_benchmark_image.png',
-          'png_premultiplied_alpha_test_image.png',
-        ],
-        'content_test_output_subdir': 'test/png_utils',
-      },
-      'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-    },
-  ],
-}
diff --git a/cobalt/renderer/test/scenes/BUILD.gn b/cobalt/renderer/test/scenes/BUILD.gn
index e443ad2..4a854dc 100644
--- a/cobalt/renderer/test/scenes/BUILD.gn
+++ b/cobalt/renderer/test/scenes/BUILD.gn
@@ -48,6 +48,8 @@
 }
 
 copy("scenes_copy_test_data") {
+  install_content = true
+
   sources = [ "demo_image.png" ]
 
   outputs =
diff --git a/cobalt/renderer/test/scenes/scenes.gyp b/cobalt/renderer/test/scenes/scenes.gyp
deleted file mode 100644
index efd6f5b..0000000
--- a/cobalt/renderer/test/scenes/scenes.gyp
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This is a sample sandbox application for experimenting with the Cobalt
-# render tree/renderer interface.
-
-{
-  'targets': [
-    {
-      # Contains code to build a demonstration scene used within benchmarking
-      # code along with the sandbox application code.  Is useful in general
-      # wherever an interesting demo render_tree is required.
-      'target_name': 'scenes',
-      'type': 'static_library',
-      'sources': [
-        'all_scenes_combined_scene.cc',
-        'all_scenes_combined_scene.h',
-        'growing_rect_scene.cc',
-        'growing_rect_scene.h',
-        'image_wrap_scene.cc',
-        'image_wrap_scene.h',
-        'marquee_scene.cc',
-        'marquee_scene.h',
-        'scaling_text_scene.cc',
-        'scaling_text_scene.h',
-        'scene_helpers.cc',
-        'scene_helpers.h',
-        'spinning_sprites_scene.cc',
-        'spinning_sprites_scene.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/render_tree/render_tree.gyp:render_tree',
-        '<(DEPTH)/cobalt/renderer/test/png_utils/png_utils.gyp:png_utils',
-        '<(DEPTH)/cobalt/trace_event/trace_event.gyp:trace_event',
-        'scenes_copy_test_data',
-      ],
-    },
-    {
-      'target_name': 'scenes_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          'demo_image.png',
-        ],
-        'content_test_output_subdir': 'test/scenes',
-      },
-      'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-    },
-  ],
-}
diff --git a/cobalt/samples/simple_example/simple_example.gyp b/cobalt/samples/simple_example/simple_example.gyp
deleted file mode 100644
index 7a6226c..0000000
--- a/cobalt/samples/simple_example/simple_example.gyp
+++ /dev/null
@@ -1,129 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This is a sample GYP files that shows the common patterns that should be used
-# to create GYP files in Cobalt.
-
-{
-  'targets': [
-    # Independent components should be broken into separate and testable
-    # libraries.
-    {
-      'target_name': 'simple_example_lib',
-      'type': 'static_library',
-      'sources': [
-        'simple_example.cc',
-        'simple_example.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-      ],
-    },
-
-    # This target is responsible for copying content required to run
-    # simple_example to (PRODUCT_DIR). This target is optional and should
-    # be added only if the executable has custom content.
-    {
-      'target_name': 'simple_example_content',
-      'type': 'none',
-      # Executable specific content logic should be added here.
-      # ...
-    },
-
-    # An executable target is responsible for building the executable
-    # and also making sure that all the necessary data needed to run the
-    # executable from (PRODUCT_DIR) was copied over.
-    {
-      'target_name': 'simple_example',
-      # Using (final_executable_type) instead of executable allows us
-      # to compile the target into a library on platforms that package the
-      # native code into a bundle (ex. Android).
-      'type': '<(final_executable_type)',
-      'variables': {
-        # Override the default main thread stack size and set it to 1MB.
-        'main_thread_stack_size': 1048576,
-      },
-      'sources': [
-        'simple_example_main.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        'simple_example_content',
-        'simple_example_lib',
-      ],
-    },
-
-    # This target will build simple_example and deploy the required data
-    # (executable + content) to a platform specific location needed to run
-    # executable on the target platform.
-    {
-      'target_name': 'simple_example_deploy',
-      'type': 'none',
-      'dependencies': [
-        'simple_example',
-      ],
-      'variables': {
-        'executable_name': 'simple_example',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-    # This target will create a test for simple_example.
-    {
-      'target_name': 'simple_example_test',
-      # Using (gtest_target_type) instead of executable allows us to compile
-      # the target into a library on platforms that package the native code
-      # into a bundle (ex. Android).
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'simple_example_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'simple_example_lib',
-        'simple_example_copy_test_data',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    # This target is optional and is only needed if tests are using
-    # external data.
-    {
-      'target_name': 'simple_example_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          'testdata',
-        ],
-        'content_test_output_subdir': 'cobalt/samples',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/copy_test_data.gypi' ],
-    },
-
-    # This target will deploy the test and its data to a platform specific
-    # location needed to run the test on the target platform.
-    {
-      'target_name': 'simple_example_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'simple_example_test',
-      ],
-      'variables': {
-        'executable_name': 'simple_example_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/script/BUILD.gn b/cobalt/script/BUILD.gn
index 4746252..df196e6 100644
--- a/cobalt/script/BUILD.gn
+++ b/cobalt/script/BUILD.gn
@@ -20,6 +20,7 @@
     "callback_function.h",
     "callback_interface_traits.h",
     "data_view.h",
+    "environment_settings.cc",
     "environment_settings.h",
     "error_report.h",
     "exception_message.cc",
@@ -59,6 +60,7 @@
     "//cobalt/base",
     "//nb",
     "//starboard:starboard_headers_only",
+    "//url",
   ]
 }
 
@@ -71,6 +73,7 @@
   deps = [
     ":script",
     "//base",
+    "//cobalt/base",
   ]
 }
 
diff --git a/cobalt/script/engine.gyp b/cobalt/script/engine.gyp
deleted file mode 100644
index 9360caa..0000000
--- a/cobalt/script/engine.gyp
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      # Target that represents the JavaScript engine implementation and an
-      # interface to create a new engine instance.
-      'target_name': 'engine',
-      'type': 'static_library',
-      'sources': [
-        'javascript_engine.h',
-      ],
-      'dependencies': ['v8c/v8c.gyp:engine', ],
-    },
-    {
-      'target_name': 'engine_shell',
-      'type': 'none',
-      'dependencies': ['v8c/v8c.gyp:v8c', ],
-    },
-  ],
-}
diff --git a/cobalt/script/engine_variables.gypi b/cobalt/script/engine_variables.gypi
deleted file mode 100644
index 702841b..0000000
--- a/cobalt/script/engine_variables.gypi
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    'v8c/v8c_variables.gypi',
-  ],
-}
diff --git a/cobalt/script/environment_settings.cc b/cobalt/script/environment_settings.cc
new file mode 100644
index 0000000..de6a40c
--- /dev/null
+++ b/cobalt/script/environment_settings.cc
@@ -0,0 +1,24 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/script/environment_settings.h"
+
+namespace cobalt {
+namespace script {
+
+// static
+const base::NullDebuggerHooks EnvironmentSettings::null_debugger_hooks_;
+
+}  // namespace script
+}  // namespace cobalt
diff --git a/cobalt/script/environment_settings.h b/cobalt/script/environment_settings.h
index aa7e483..15a6dd4 100644
--- a/cobalt/script/environment_settings.h
+++ b/cobalt/script/environment_settings.h
@@ -18,22 +18,41 @@
 #include <memory>
 
 #include "base/memory/ref_counted.h"
+#include "cobalt/base/debugger_hooks.h"
+#include "url/gurl.h"
 
 namespace cobalt {
 namespace script {
 
 // Environment Settings object as described in
-// https://www.w3.org/html/wg/drafts/html/master/webappapis.html#environment-settings-object
+// https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#environment-settings-objects
 class EnvironmentSettings {
  public:
-  EnvironmentSettings() {}
+  explicit EnvironmentSettings(
+      const base::DebuggerHooks& debugger_hooks = null_debugger_hooks_)
+      : debugger_hooks_(debugger_hooks) {}
   virtual ~EnvironmentSettings() {}
 
+  // The API base URL.
+  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#api-base-url
+  void set_base_url(const GURL& url) { base_url_ = url; }
+  const GURL& base_url() const { return base_url_; }
+
+  // The API creation URL
+  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#concept-environment-creation-url
+  const GURL& creation_url() const { return base_url(); }
+
+  const base::DebuggerHooks& debugger_hooks() const { return debugger_hooks_; }
+
  protected:
   friend std::unique_ptr<EnvironmentSettings>::deleter_type;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(EnvironmentSettings);
+
+  static const base::NullDebuggerHooks null_debugger_hooks_;
+  const base::DebuggerHooks& debugger_hooks_;
+  GURL base_url_;
 };
 
 }  // namespace script
diff --git a/cobalt/script/script.gyp b/cobalt/script/script.gyp
deleted file mode 100644
index 0309e21..0000000
--- a/cobalt/script/script.gyp
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      # Interfaces for interacting with a JavaScript engine and exposing objects
-      # to bindings to JavaScript.
-      'target_name': 'script',
-      'type': 'static_library',
-      'sources': [
-        'array_buffer.h',
-        'array_buffer_view.h',
-        'call_frame.h',
-        'callback_function.h',
-        'callback_interface_traits.h',
-        'data_view.h',
-        'environment_settings.h',
-        'error_report.h',
-        'exception_message.cc',
-        'exception_message.h',
-        'execution_state.cc',
-        'execution_state.h',
-        'fake_global_environment.h',
-        'fake_script_runner.h',
-        'global_environment.h',
-        'global_object_proxy.h',
-        'javascript_engine.h',
-        'logging_exception_state.h',
-        'promise.h',
-        'property_enumerator.h',
-        'scope.h',
-        'script_debugger.h',
-        'script_exception.h',
-        'script_runner.cc',
-        'script_runner.h',
-        'script_value.h',
-        'script_value_factory.h',
-        'script_value_factory_instantiations.h',
-        'sequence.h',
-        'source_code.h',
-        'source_provider.h',
-        'stack_frame.cc',
-        'stack_frame.h',
-        'tracer.h',
-        'typed_arrays.h',
-        'union_type.h',
-        'union_type_internal.h',
-        'util/stack_trace_helpers.h',
-        'value_handle.h',
-        'wrappable.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/nb/nb.gyp:nb',
-      ]
-    },
-    {
-      'target_name': 'standalone_javascript_runner',
-      'type': 'static_library',
-      'sources': [
-        'standalone_javascript_runner.cc',
-        'standalone_javascript_runner.h',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/script/script_value_factory.h b/cobalt/script/script_value_factory.h
index a7cf532..a5d571a 100644
--- a/cobalt/script/script_value_factory.h
+++ b/cobalt/script/script_value_factory.h
@@ -15,12 +15,27 @@
 #ifndef COBALT_SCRIPT_SCRIPT_VALUE_FACTORY_H_
 #define COBALT_SCRIPT_SCRIPT_VALUE_FACTORY_H_
 
+#include <memory>
+
+#include "base/memory/ref_counted.h"
 #include "cobalt/script/array_buffer.h"
 #include "cobalt/script/promise.h"
 #include "cobalt/script/script_value.h"
+
 namespace cobalt {
 namespace script {
 
+using SequenceWrappable = Sequence<scoped_refptr<Wrappable>>;
+using PromiseSequenceWrappable = Promise<SequenceWrappable>;
+
+using PromiseWrappable = Promise<scoped_refptr<Wrappable>>;
+using HandlePromiseWrappable = Handle<PromiseWrappable>;
+using ValuePromiseWrappable = ScriptValue<PromiseWrappable>;
+
+using PromiseBool = Promise<bool>;
+using HandlePromiseBool = Handle<PromiseBool>;
+using ValuePromiseBool = ScriptValue<PromiseBool>;
+
 class ScriptValueFactory {
  public:
   using WrappablePromise = scoped_refptr<Wrappable>;
diff --git a/cobalt/script/standalone_javascript_runner.cc b/cobalt/script/standalone_javascript_runner.cc
index 8f26b36..f94e9a1 100644
--- a/cobalt/script/standalone_javascript_runner.cc
+++ b/cobalt/script/standalone_javascript_runner.cc
@@ -15,9 +15,19 @@
 #include "cobalt/script/standalone_javascript_runner.h"
 
 #include <iostream>
+#include <memory>
 #include <string>
 
+#include "base/bind.h"
 #include "base/files/file_util.h"
+#include "base/logging.h"
+#include "base/memory/ref_counted.h"
+#include "base/task_runner.h"
+#include "cobalt/base/debugger_hooks.h"
+#include "cobalt/base/source_location.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/javascript_engine.h"
 #include "cobalt/script/source_code.h"
 
 namespace cobalt {
diff --git a/cobalt/script/v8c/BUILD.gn b/cobalt/script/v8c/BUILD.gn
index de1872c..230516a 100644
--- a/cobalt/script/v8c/BUILD.gn
+++ b/cobalt/script/v8c/BUILD.gn
@@ -36,7 +36,8 @@
 }
 
 config("common_public_config") {
-  if ((current_cpu == "arm64" || current_cpu == "x64") && !is_mac) {
+  if ((current_cpu == "arm64" || current_cpu == "x64") &&
+      v8_enable_pointer_compression_override) {
     defines = [
       # enables pointer compression on 64 bit platforms for Cobalt.
       "V8_COMPRESS_POINTERS",
diff --git a/cobalt/script/v8c/conversion_helpers.cc b/cobalt/script/v8c/conversion_helpers.cc
index 4fa42e3..08931b6 100644
--- a/cobalt/script/v8c/conversion_helpers.cc
+++ b/cobalt/script/v8c/conversion_helpers.cc
@@ -56,6 +56,41 @@
                     v8::String::REPLACE_INVALID_UTF8);
 }
 
+// JSValue -> std::vector<uint8_t>
+void FromJSValue(v8::Isolate* isolate, v8::Local<v8::Value> value,
+                 int conversion_flags, ExceptionState* exception_state,
+                 std::vector<uint8_t>* out_vector) {
+  DCHECK_EQ(conversion_flags & ~kConversionFlagsString, 0)
+      << "Unexpected conversion flags found: ";
+
+  if (value->IsNull() &&
+      (conversion_flags & kConversionFlagTreatNullAsEmptyString)) {
+    *out_vector = {};
+    return;
+  }
+
+  if (value->IsUndefined() &&
+      (conversion_flags & kConversionFlagTreatUndefinedAsEmptyString)) {
+    *out_vector = {};
+    return;
+  }
+
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::MaybeLocal<v8::String> maybe_string = value->ToString(context);
+  v8::Local<v8::String> string;
+  if (!maybe_string.ToLocal(&string)) {
+    exception_state->SetSimpleException(kConvertToStringFailed);
+    return;
+  }
+
+  // Resize the output string to the UTF-8 estimated size.
+  int length = string->Utf8Length(isolate);
+
+  out_vector->resize(length);
+  DCHECK(out_vector->size() == length);
+  string->WriteOneByte(isolate, out_vector->data(), 0, length);
+}
+
 // ValueHandle -> JSValue
 void ToJSValue(v8::Isolate* isolate,
                const ValueHandleHolder* value_handle_holder,
diff --git a/cobalt/script/v8c/conversion_helpers.h b/cobalt/script/v8c/conversion_helpers.h
index b5673ea..d83c23f 100644
--- a/cobalt/script/v8c/conversion_helpers.h
+++ b/cobalt/script/v8c/conversion_helpers.h
@@ -19,6 +19,7 @@
 
 #include <limits>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/logging.h"
@@ -116,6 +117,11 @@
   *out_value = string;
 }
 
+// JSValue -> std::vector<uint8_t>
+void FromJSValue(v8::Isolate* isolate, v8::Local<v8::Value> value,
+                 int conversion_flags, ExceptionState* exception_state,
+                 std::vector<uint8_t>* out_vector);
+
 // base::Token -> JSValue
 inline void ToJSValue(v8::Isolate* isolate, const base::Token& token,
                       v8::Local<v8::Value>* out_value) {
diff --git a/cobalt/script/v8c/v8c.gyp b/cobalt/script/v8c/v8c.gyp
deleted file mode 100644
index 1a85af0..0000000
--- a/cobalt/script/v8c/v8c.gyp
+++ /dev/null
@@ -1,171 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'target_defaults': {
-    'conditions': [
-        ['(target_arch=="arm64" or target_arch=="x64") and disable_v8_pointer_compression==0', {
-          'defines': [
-            # enables pointer compression on 64 bit platforms for Cobalt.
-            'V8_COMPRESS_POINTERS',
-            'V8_31BIT_SMIS_ON_64BIT_ARCH',
-          ],
-          'all_dependent_settings': {
-            'defines': [
-                'V8_COMPRESS_POINTERS',
-                'V8_31BIT_SMIS_ON_64BIT_ARCH',
-            ],
-          },
-        }],
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'engine',
-      'type': 'static_library',
-      'sources': [
-        'algorithm_helpers.cc',
-        'algorithm_helpers.h',
-        'callback_function_conversion.h',
-        'cobalt_platform.cc',
-        'cobalt_platform.h',
-        'common_v8c_bindings_code.cc',
-        'common_v8c_bindings_code.h',
-        'conversion_helpers.cc',
-        'conversion_helpers.h',
-        'entry_scope.h',
-        'interface_data.h',
-        'isolate_fellowship.cc',
-        'isolate_fellowship.h',
-        'native_promise.h',
-        'scoped_persistent.h',
-        'stack_trace_helpers.cc',
-        'switches.cc',
-        'switches.h',
-        'type_traits.h',
-        'union_type_conversion_forward.h',
-        'union_type_conversion_impl.h',
-        'v8c_array_buffer.cc',
-        'v8c_array_buffer.h',
-        'v8c_array_buffer_view.cc',
-        'v8c_array_buffer_view.h',
-        'v8c_callback_function.h',
-        'v8c_callback_interface.cc',
-        'v8c_callback_interface.h',
-        'v8c_callback_interface_holder.h',
-        'v8c_data_view.cc',
-        'v8c_data_view.h',
-        'v8c_engine.cc',
-        'v8c_engine.h',
-        'v8c_exception_state.cc',
-        'v8c_exception_state.h',
-        'v8c_global_environment.cc',
-        'v8c_global_environment.h',
-        'v8c_heap_tracer.cc',
-        'v8c_heap_tracer.h',
-        'v8c_property_enumerator.h',
-        'v8c_script_debugger.cc',
-        'v8c_script_debugger.h',
-        'v8c_script_value_factory.cc',
-        'v8c_script_value_factory.h',
-        'v8c_source_code.cc',
-        'v8c_source_code.h',
-        'v8c_tracing_controller.cc',
-        'v8c_tracing_controller.h',
-        'v8c_typed_arrays.cc',
-        'v8c_typed_arrays.h',
-        'v8c_user_object_holder.h',
-        'v8c_value_handle.cc',
-        'v8c_value_handle.h',
-        'v8c_wrapper_handle.h',
-        'wrapper_factory.cc',
-        'wrapper_factory.h',
-        'wrapper_private.cc',
-        'wrapper_private.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/configuration/configuration.gyp:configuration',
-        '<(DEPTH)/cobalt/script/script.gyp:script',
-        '<(DEPTH)/third_party/v8/v8.gyp:v8',
-        '<(DEPTH)/third_party/v8/v8.gyp:v8_libplatform',
-        '<(DEPTH)/third_party/v8/v8.gyp:v8_base_without_compiler',
-        'embed_v8c_resources_as_header_files',
-      ],
-      'defines': [
-        'ENGINE_SUPPORTS_INT64',
-      ],
-      'all_dependent_settings': {
-        'defines': [
-          'ENGINE_SUPPORTS_INDEXED_DELETERS',
-          'ENGINE_SUPPORTS_INT64',
-        ],
-      },
-    },
-
-    {
-      # Standalone shell executable for V8 within Cobalt.
-      'target_name': 'v8c',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'v8c.cc',
-      ],
-      'dependencies': [
-        ':engine',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/script/script.gyp:standalone_javascript_runner',
-        '<(DEPTH)/third_party/v8/v8.gyp:v8',
-        '<(DEPTH)/third_party/v8/v8.gyp:v8_base_without_compiler',
-        '<(DEPTH)/third_party/v8/v8.gyp:v8_libplatform',
-      ],
-    },
-
-    {
-      # This target takes specified files and embeds them as header files for
-      # inclusion into the binary.
-      'target_name': 'embed_v8c_resources_as_header_files',
-      'type': 'none',
-      # Because we generate a header, we must set the hard_dependency flag.
-      'hard_dependency': 1,
-      'variables': {
-        'script_path': '<(DEPTH)/cobalt/build/generate_data_header.py',
-        'output_path': '<(SHARED_INTERMEDIATE_DIR)/cobalt/script/v8c/embedded_resources.h',
-      },
-      'sources': [
-        '<(DEPTH)/cobalt/fetch/embedded_scripts/fetch.js',
-        '<(DEPTH)/cobalt/streams/embedded_scripts/byte_length_queuing_strategy.js',
-        '<(DEPTH)/cobalt/streams/embedded_scripts/count_queuing_strategy.js',
-        '<(DEPTH)/cobalt/streams/embedded_scripts/readable_stream.js',
-      ],
-      'actions': [
-        {
-          'action_name': 'embed_v8c_resources_as_header_files',
-          'inputs': [
-            '<(script_path)',
-            '<@(_sources)',
-          ],
-          'outputs': [
-            '<(output_path)',
-          ],
-          'action': ['python2', '<(script_path)', 'V8cEmbeddedResources', '<(output_path)', '<@(_sources)' ],
-          'message': 'Embedding v8c resources in into header file, "<(output_path)".',
-        },
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(SHARED_INTERMEDIATE_DIR)',
-        ],
-      },
-    },
-  ],
-}
diff --git a/cobalt/script/v8c/v8c_array_buffer.cc b/cobalt/script/v8c/v8c_array_buffer.cc
index 7fe8b3a..835c320 100644
--- a/cobalt/script/v8c/v8c_array_buffer.cc
+++ b/cobalt/script/v8c/v8c_array_buffer.cc
@@ -47,6 +47,7 @@
       base::polymorphic_downcast<v8c::V8cGlobalEnvironment*>(
           global_environment);
   v8::Isolate* isolate = v8c_global_environment->isolate();
+  DCHECK(isolate);
   v8c::EntryScope entry_scope(isolate);
   v8::Local<v8::ArrayBuffer> array_buffer =
       v8::ArrayBuffer::New(isolate, byte_length);
diff --git a/cobalt/script/v8c/v8c_global_environment.cc b/cobalt/script/v8c/v8c_global_environment.cc
index 51dac48..1e790d0 100644
--- a/cobalt/script/v8c/v8c_global_environment.cc
+++ b/cobalt/script/v8c/v8c_global_environment.cc
@@ -140,6 +140,7 @@
   TRACE_EVENT0("cobalt::script", "V8cGlobalEnvironment::EvaluateScript()");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
+  DCHECK(isolate_);
   EntryScope entry_scope(isolate_);
   v8::Local<v8::Context> context = isolate_->GetCurrentContext();
   v8::TryCatch try_catch(isolate_);
diff --git a/cobalt/script/v8c/v8c_global_environment.h b/cobalt/script/v8c/v8c_global_environment.h
index 05c8b3d..c0f6a81 100644
--- a/cobalt/script/v8c/v8c_global_environment.h
+++ b/cobalt/script/v8c/v8c_global_environment.h
@@ -167,7 +167,7 @@
   static const int kIsolateDataIndex = 1;
 
   THREAD_CHECKER(thread_checker_);
-  v8::Isolate* isolate_;
+  v8::Isolate* isolate_ = nullptr;
 
   // Hold an extra reference to the global wrappable in order to properly
   // destruct.  Were we to not do this, finalizers can run in the order (e.g.)
diff --git a/cobalt/script/v8c/v8c_variables.gni b/cobalt/script/v8c/v8c_variables.gni
index d9bda0b..bcffbee 100644
--- a/cobalt/script/v8c/v8c_variables.gni
+++ b/cobalt/script/v8c/v8c_variables.gni
@@ -12,8 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Migrated from cobalt/script/v8c/v8c_variables.gypi
-####################################################
 generated_bindings_prefix = "v8c"
 
 engine_dependencies = [
diff --git a/cobalt/script/v8c/v8c_variables.gypi b/cobalt/script/v8c/v8c_variables.gypi
deleted file mode 100644
index e6fab6f..0000000
--- a/cobalt/script/v8c/v8c_variables.gypi
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'generated_bindings_prefix': 'v8c',
-    'engine_include_dirs': [],
-    'engine_dependencies': [
-      '<(DEPTH)/third_party/v8/v8.gyp:v8',
-      '<(DEPTH)/third_party/v8/v8.gyp:v8_libplatform',
-      '<(DEPTH)/net/net.gyp:net',
-    ],
-    'engine_defines': [],
-    'engine_templates_dir': [
-      '<(DEPTH)/cobalt/bindings/v8c/templates',
-    ],
-    'engine_template_files': [
-      '<(DEPTH)/cobalt/bindings/v8c/templates/callback-interface.cc.template',
-      '<(DEPTH)/cobalt/bindings/v8c/templates/callback-interface.h.template',
-      '<(DEPTH)/cobalt/bindings/v8c/templates/dictionary-conversion.cc.template',
-      '<(DEPTH)/cobalt/bindings/v8c/templates/enumeration-conversion.cc.template',
-      '<(DEPTH)/cobalt/bindings/v8c/templates/generated-types.h.template',
-      '<(DEPTH)/cobalt/bindings/v8c/templates/interface.cc.template',
-      '<(DEPTH)/cobalt/bindings/v8c/templates/interface.h.template',
-      '<(DEPTH)/cobalt/bindings/v8c/templates/macros.cc.template',
-    ],
-    'engine_bindings_scripts': [
-      '<(DEPTH)/cobalt/bindings/v8c/code_generator_v8c.py',
-      '<(DEPTH)/cobalt/bindings/v8c/idl_compiler_v8c.py',
-      '<(DEPTH)/cobalt/bindings/v8c/generate_conversion_header_v8c.py',
-    ],
-    'engine_idl_compiler':
-        '<(DEPTH)/cobalt/bindings/v8c/idl_compiler_v8c.py',
-    'engine_conversion_header_generator_script':
-        '<(DEPTH)/cobalt/bindings/v8c/generate_conversion_header_v8c.py',
-  },
-}
diff --git a/cobalt/site/docs/codelabs/cobalt_extensions/codelab.md b/cobalt/site/docs/codelabs/cobalt_extensions/codelab.md
index 76eda31..c358376 100644
--- a/cobalt/site/docs/codelabs/cobalt_extensions/codelab.md
+++ b/cobalt/site/docs/codelabs/cobalt_extensions/codelab.md
@@ -715,7 +715,7 @@
 platform and then run the executable to run the tests.
 
 ```
-$ cobalt/build/gyp_cobalt linux-x64x11
+$ cobalt/build/gn.py -p linux-x64x11
 ```
 
 ```
diff --git a/cobalt/site/docs/development/setup-android.md b/cobalt/site/docs/development/setup-android.md
index 621f5f3..c4b241a 100644
--- a/cobalt/site/docs/development/setup-android.md
+++ b/cobalt/site/docs/development/setup-android.md
@@ -39,7 +39,7 @@
     ```
 
 1.  Download and install [Android Studio](https://developer.android.com/studio/).
-1.  Run `cobalt/build/gyp_cobalt android-x86` to configure the Cobalt build,
+1.  Run `cobalt/build/gn.py -p android-x86` to configure the Cobalt build,
     which also installs the SDK and NDK. (This step will have to be repeated
     with 'android-arm' or 'android-arm64' to target those architectures.) The
     SDK and NDK will be downloaded and installed into a `starboard-toolchains`
@@ -77,7 +77,7 @@
     *   Edit "Android SDK location" and set the path to:
     `$HOME/starboard-toolchains/AndroidSdk`
       *  NOTE: We use the same SDK for the IDE and the gyp/ninja build. This
-         directory will already exist since you've already run gyp_cobalt for an
+         directory will already exist since you've already run gn gen for an
          android target, so you'll see a warning in the setup wizard that an SDK
          was detected, which is okay.
         *  Select both `Android SDK` and `Android SDK Platform` (whatever
@@ -180,7 +180,7 @@
 
 ## Building/running/debugging (Android Studio IDE)
 
-1.  Manually run `cobalt/build/gyp_cobalt android-x86` in a shell. (You should
+1.  Manually run `cobalt/build/gn.py -p android-x86` in a shell. (You should
     do this after each time you sync your repo)
 1.  From the initial setup above, you should have opened the Android Studio
     project checked in at `starboard/android/apk`.
diff --git a/cobalt/site/docs/development/setup-linux.md b/cobalt/site/docs/development/setup-linux.md
index 21d07e5..be9f564 100644
--- a/cobalt/site/docs/development/setup-linux.md
+++ b/cobalt/site/docs/development/setup-linux.md
@@ -102,18 +102,15 @@
     directory. You must specify a platform when running this command. On Ubuntu
     Linux, the canonical platform is `linux-x64x11`.
 
-    You can also use the `-C` command-line flag to specify a `build_type`.
+    You can also use the `-c` command-line flag to specify a `build_type`.
     Valid build types are `debug`, `devel`, `qa`, and `gold`. If you
     specify a build type, the command finishes sooner. Otherwise, all types
     are built.
 
     ```
-    $ cobalt/build/gyp_cobalt [-C <build_type>] <platform>
+    $ python cobalt/build/gn.py [-c <build_type>] -p <platform>
     ```
 
-    <aside class="note"><b>Important:</b> You need to rerun gyp_cobalt every
-    time a change is made to a `.gyp` file.</aside>
-
 1.  Compile the code from the `cobalt/` directory:
 
     ```
@@ -128,10 +125,7 @@
         guide, it contains a `family name` (like `linux`) and a
         `binary variant` (like `x64x11`), separated by a hyphen.
     1.  `<build_type>` is the build you are compiling. Possible values are
-        `debug`, `devel`, `qa`, and `gold`. These values are also described in
-        the Starboard porting guide under the [required file modifications](
-        /starboard/porting.html#4-make-required-file-modifications) for the
-        `gyp_configuration.gypi` file.
+        `debug`, `devel`, `qa`, and `gold`.
     1.  `<target_name>` is the name assigned to the compiled code and it is
         used to run the code compiled in this step. The most common names are
         `cobalt`, `nplb`, and `all`:
diff --git a/cobalt/site/docs/development/setup-raspi.md b/cobalt/site/docs/development/setup-raspi.md
index 8badc0a..597361b 100644
--- a/cobalt/site/docs/development/setup-raspi.md
+++ b/cobalt/site/docs/development/setup-raspi.md
@@ -83,7 +83,7 @@
     following command:
 
     ```
-    $ cobalt/build/gyp_cobalt raspi-2
+    $ cobalt/build/gn.py -p raspi-2
     ```
 
 1.  Compile the code from the `cobalt/` directory:
diff --git a/cobalt/site/docs/gen/cobalt/doc/webapi_extension.md b/cobalt/site/docs/gen/cobalt/doc/webapi_extension.md
deleted file mode 100644
index f3c7b42..0000000
--- a/cobalt/site/docs/gen/cobalt/doc/webapi_extension.md
+++ /dev/null
@@ -1,113 +0,0 @@
----
-layout: doc
-title: "Cobalt Web Extension Support"
----
-# Cobalt Web Extension Support
-
-## Deprecation
-Please note that Web Extension support is deprecated. Please use Platform
-Services (cobalt/doc/platform_services.md) instead. This is an effort to move
-away from injecting compile-time modules into the Cobalt layer in favor of
-using runtime extensions provided by the Starboard layer.
-
-## Overview
-Cobalt provides a facility for extending the JavaScript Web API.  This allows
-custom web apps running on Cobalt to make calls through a custom API to
-C++ Cobalt code defined per Starboard platform.  This can allow for closer
-integration between the web app hosted by Cobalt and the system on which that
-web app is running.
-
-The Cobalt Web Extension support will allow you to attach an instance of a
-custom class to the JavaScript `window` global object so that it can be
-referenced from a web app in JavaScript as in the following example:
-
-```
-window.myInterface.RunMyFunction()
-```
-
-## Build-level modifications
-
-In order to extend the interface, one should add the following lines to the
-`variables` section of `<platform-directory>/cobalt/configuration.gypi` (see
-Starboard's
-[Application Customization](../../starboard/doc/building.md#application-customization)
-for more information):
-
-1. `cobalt_webapi_extension_source_idl_files`
-   This should be a list of [IDL files](https://en.wikipedia.org/wiki/Web_IDL)
-   that define the collection of new interfaces introduced by your extensions.
-   One of these new interfaces can be selected to be injected into the `window`
-   element (see 3. `cobalt_webapi_extension_gyp_target` for information on how
-   to do this).  Each IDL file listed here simultaneously defines a JavaScript
-   and a C++ interface.  For each IDL file, you will be expected to also provide
-   a header file in the same directory that re-declares (in C++) the interface
-   declared in the IDL file, as well as an implementation of all the methods
-   within it (either inline in the header file or in a corresponding source
-   file).
-2. `cobalt_webapi_extension_generated_header_idl_files`
-   This is a list of all files that may result in automatic header file
-   generation that might be referenced from other C++ code.  An example of
-   this is the definition of `enum`s that may then be referenced as types in
-   a file from 1. `cobalt_webapi_extension_source_idl_files`.
-3. `cobalt_webapi_extension_gyp_target`
-   This is the gyp target that will provide the IDL interface implementations,
-   as well as any necessary auxiliary code.  It will be added as a dependency of
-   [browser/cobalt.gyp:cobalt](../browser/cobalt.gyp).  It is expected that
-   this target will implement the interface defined in
-   [browser/webapi_extension.h](../browser/webapi_extension.h), which let you
-   name the injected window property, and provide a function to instantiate it
-   (i.e. to let you select which IDL object is the "entry point").
-
-The first two lists get included by
-[cobalt/browser/browser_bindings_gen.gyp](cobalt/browser/browser_bindings_gen.gyp),
-where you can look to see many examples of existing Cobalt IDL files that define
-the Web API available through Cobalt.  For each of these, you can also
-examine their corresponding `.h` files and in most cases their `.cc` files as
-well.
-
-An example configuration for these variables is available at
-[starboard/shared/test_webapi_extension/test_webapi_extension.gypi](../../starboard/shared/test_webapi_extension/test_webapi_extension.gypi), which
-contains the following variable definitions:
-
-```
-'cobalt_webapi_extension_source_idl_files': [
-  'my_new_interface.idl'
-],
-'cobalt_webapi_extension_generated_header_idl_files': [
-  'my_new_enum.idl'
-],
-'cobalt_webapi_extension_gyp_target':
-  '<(DEPTH)/starboard/shared/test_webapi_extension/webapi_extension.gyp:cobalt_test_webapi_extension',
-```
-
-## Implementing the [webapi_extension.h](../browser/webapi_extension.h) interface
-
-As discussed above in 3. `cobalt_webapi_extension_gyp_target`, you must provide
-an implementation of the two functions declared in
-[browser/webapi_extension.h](../browser/webapi_extension.h).
-
-### `GetWebAPIExtensionObjectPropertyName()`
-You should implement `GetWebAPIExtensionObjectPropertyName()` to return the name
-of the injected `window` property.  For example, in the example from the
-beginning of this document, `window.myInterface.RunMyFunction()`, we would have
-the function return `std::string("myInterface")`.  If you return `nullopt` from
-this function, it is assumed that you do not wish to extend the web interface.
-
-Note that you should NOT name your `window` property the same as your class name
-as described in the IDL file, it will result in a name collision in the
-JavaScript environment.
-
-### `CreateWebAPIExtensionObject()`
-This function should instantiate and return the object to be accessed from
-`window`.  The object must be defined by an IDL file.
-
-## Debugging
-You may find the Cobalt debug console to be particularly useful for debugging
-IDL additions and changes.  In it, you can enter arbitrary JavaScript and then
-hit enter to execute it.  You can toggle it open by hitting either CTRL+O or
-F1, and you may have to hit the key twice to skip past the HUD mode.
-
-Here is an example of an example interface being exercised through the
-debug console:
-
-![Debug console web extension example](resources/webapi_extension_example.jpg)
diff --git a/cobalt/site/docs/gen/starboard/build/doc/migration_changes.md b/cobalt/site/docs/gen/starboard/build/doc/migration_changes.md
index 83f3dfa..d00e3d0 100644
--- a/cobalt/site/docs/gen/starboard/build/doc/migration_changes.md
+++ b/cobalt/site/docs/gen/starboard/build/doc/migration_changes.md
@@ -25,6 +25,7 @@
 `sb_evergreen_compatible` (0/1)           | `sb_is_evergreen_compatible` (true/false)            | `//starboard/build/config/base_configuration.gni`
 `sb_evergreen_compatible_libunwind` (0/1) | `sb_evergreen_compatible_use_libunwind` (true/false) | `//starboard/build/config/base_configuration.gni`
 `sb_evergreen_compatible_lite` (0/1)      | `sb_evergreen_compatible_enable_lite` (true/false)   | `//starboard/build/config/base_configuration.gni`
+`in_app_dial` (0/1)                       | `enable_in_app_dial` (true/false)                    | `//starboard/build/config/base_configuration.gni`
 `sb_disable_cpp14_audit`                  | (none)                                               |
 `sb_disable_microphone_idl`               | (none)                                               |
 `starboard_path`                          | (none)                                               |
diff --git a/cobalt/site/docs/gen/starboard/doc/crash_handlers.md b/cobalt/site/docs/gen/starboard/doc/crash_handlers.md
index 2f30683..b7bd6e2 100644
--- a/cobalt/site/docs/gen/starboard/doc/crash_handlers.md
+++ b/cobalt/site/docs/gen/starboard/doc/crash_handlers.md
@@ -36,7 +36,7 @@
 }
 ```
 
-3. Calling the `third_party::crashpad::wrapper::InstallCrashpadHandler()` hook
+3. Calling the `third_party::crashpad::wrapper::InstallCrashpadHandler(bool start_at_crash)` hook
 directly after installing system crash handlers. On linux, for example, this
 could look like:
 
@@ -48,7 +48,7 @@
   starboard::shared::signal::InstallCrashSignalHandlers();
   starboard::shared::signal::InstallSuspendSignalHandlers();
 
-  third_party::crashpad::wrapper::InstallCrashpadHandler();
+  third_party::crashpad::wrapper::InstallCrashpadHandler(true);
 
   int result = application.Run(argc, argv);
   ...
diff --git a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_overview.md b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_overview.md
index 8d770ca..0106cd5 100644
--- a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_overview.md
+++ b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_overview.md
@@ -105,8 +105,8 @@
 Cobalt Evergreen is built by a separate gyp platform using the Google toolchain:
 
 ```
-$ cobalt/build/gyp_cobalt evergreen-arm-softfp-sbversion-12
-$ ninja -C out/evergreen-arm-softfp-sbversion-12_qa cobalt
+$ cobalt/build/gn.py -p evergreen-arm-softfp -c qa
+$ ninja -C out/evergreen-arm-softfp_qa cobalt
 ```
 
 Which produces a shared library `libcobalt.so` targeted for specific
@@ -119,7 +119,7 @@
 `libcobalt.so`, and the `crashpad_handler` which handles crashes.
 
 ```
-$ cobalt/build/gyp_cobalt <partner_port_name>
+$ cobalt/build/gn.py -p <partner_port_name> -c qa
 $ ninja -C out/<partner_port_name>_qa loader_app crashpad_handler
 ```
 
@@ -272,7 +272,7 @@
 
 1. Build the `crashpad_database_util` target and deploy it onto the device.
 ```
-$ cobalt/build/gyp_cobalt <partner_port_name>
+$ cobalt/build/gn.py -p <partner_port_name> -c qa
 $ ninja -C out/<partner_port_name>_qa crashpad_database_util
 ```
 2. Remove the existing state for crashpad as it throttles uploads to 1 per hour:
diff --git a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
index 7763cc2..549fe70 100644
--- a/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
+++ b/cobalt/site/docs/gen/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
@@ -18,12 +18,12 @@
 
 ## Build the loader app (new entry point)
 $ cd cobalt/src
-$ cobalt/build/gyp_cobalt -v raspi-2-sbversion-12 -C qa
-$ ninja -C out/raspi-2-sbversion-12_qa loader_app crashpad_handler
+$ cobalt/build/gn.py -p raspi-2 -c qa
+$ ninja -C out/raspi-2_qa loader_app crashpad_handler
 
 ## Create package directory for Cobalt Evergreen
 $ export COEG_PATH=coeg
-$ cp out/raspi-2-sbversion-12_qa/loader_app $COEG_PATH
+$ cp out/raspi-2_qa/loader_app $COEG_PATH
 
 ## Create directory structure for the initial installation
 [2-slot configuration]
@@ -50,12 +50,12 @@
 ```
 ## Build Cobalt core locally
 $ cd cobalt/src
-$ cobalt/build/gyp_cobalt -v evergreen-arm-hardfp-sbversion-12 -C qa
-$ ninja -C out/evergreen-arm-hardfp-sbversion-12_qa cobalt
+$ cobalt/build/gn.py -p evergreen-arm-hardfp -c qa
+$ ninja -C out/evergreen-arm-hardfp_qa cobalt
 
 ## Copy the generated files to the package directory for Cobalt Evergreen
-$ cp -r out/evergreen-arm-hardfp-sbversion-12_qa/lib   $COEG_PATH/content/app/cobalt/
-$ cp -r out/evergreen-arm-hardfp-sbversion-12_qa/content   $COEG_PATH/content/app/cobalt/
+$ cp -r out/evergreen-arm-hardfp_qa/lib   $COEG_PATH/content/app/cobalt/
+$ cp -r out/evergreen-arm-hardfp_qa/content   $COEG_PATH/content/app/cobalt/
 
 ## Create a file named manifest.json with the following content, and put it under $COEG_PATH/content/app/cobalt/
 $ cat > $COEG_PATH/content/app/cobalt/manifest.json <<EOF
diff --git a/cobalt/site/docs/gen/starboard/doc/resources/decode_to_texture_sequence.png b/cobalt/site/docs/gen/starboard/doc/resources/decode_to_texture_sequence.png
index b2b4cb4..f047730 100644
--- a/cobalt/site/docs/gen/starboard/doc/resources/decode_to_texture_sequence.png
+++ b/cobalt/site/docs/gen/starboard/doc/resources/decode_to_texture_sequence.png
Binary files differ
diff --git a/cobalt/site/docs/gen/starboard/doc/resources/decode_to_texture_sequence.txt b/cobalt/site/docs/gen/starboard/doc/resources/decode_to_texture_sequence.txt
index ac5127b..149b404 100644
--- a/cobalt/site/docs/gen/starboard/doc/resources/decode_to_texture_sequence.txt
+++ b/cobalt/site/docs/gen/starboard/doc/resources/decode_to_texture_sequence.txt
@@ -1,10 +1,10 @@
 participant Application (e.g. Cobalt) as a [fillcolor="#ffd0d0"]
 participant Starboard as s [fillcolor="#d0d0ff"]
 
-a->s: SbPlayerOutputModeSupported(kSbPlayerOutputModeDecodeToTexture, ...)
-s-->a: returns bool
-Note over a: If SbPlayerOutputModeSupported()\nreturns true... [fillcolor="white"]
-a->s: SbPlayerCreate(..., kSbPlayerOutputModeDecodeToTexture, ...)
+a->s: SbPlayerGetPreferredOutputMode(creation_param->output_mode = kSbPlayerOutputModeDecodeToTexture, ...)
+s-->a: returns SbPlayerOutputMode
+Note over a: If SbPlayerGetPreferredOutputMode()\nreturns kSbPlayerOutputModeDecodeToTexture [fillcolor="white"]
+a->s: SbPlayerCreate(..., creation_param->output_mode = kSbPlayerOutputModeDecodeToTexture, ...)
 Note over a: Start of render loop [fillcolor="#ffffd0"]
 a->s: SbPlayerGetCurrentFrame()
 s-->a: returns SbDecodeTarget
diff --git a/cobalt/site/docs/reference/starboard/modules/11/configuration.md b/cobalt/site/docs/reference/starboard/modules/11/configuration.md
index f632f55..f3f522e 100644
--- a/cobalt/site/docs/reference/starboard/modules/11/configuration.md
+++ b/cobalt/site/docs/reference/starboard/modules/11/configuration.md
@@ -149,14 +149,7 @@
 
 ### SB_RESTRICT ###
 
-Include the platform-specific configuration. This macro is set by GYP in
-starboard_base_target.gypi and passed in on the command line for all targets and
-all configurations.After version 12, we start to use runtime constants instead
-of macros for certain platform dependent configurations. This file substitutes
-configuration macros for the corresponding runtime constants so we don't
-reference these constants when they aren't defined.Makes a pointer-typed
-parameter restricted so that the compiler can make certain optimizations because
-it knows the pointers are unique.
+Include the platform-specific configuration.
 
 ### SB_SIZE_OF(DATATYPE) ###
 
diff --git a/cobalt/site/docs/reference/starboard/modules/12/configuration.md b/cobalt/site/docs/reference/starboard/modules/12/configuration.md
index 5c351ef..038d8ff 100644
--- a/cobalt/site/docs/reference/starboard/modules/12/configuration.md
+++ b/cobalt/site/docs/reference/starboard/modules/12/configuration.md
@@ -139,11 +139,7 @@
 
 ### SB_RESTRICT ###
 
-Include the platform-specific configuration. This macro is set by GYP in
-starboard_base_target.gypi and passed in on the command line for all targets and
-all configurations.Makes a pointer-typed parameter restricted so that the
-compiler can make certain optimizations because it knows the pointers are
-unique.
+Include the platform-specific configuration.
 
 ### SB_SIZE_OF(DATATYPE) ###
 
diff --git a/cobalt/site/docs/reference/starboard/modules/13/configuration.md b/cobalt/site/docs/reference/starboard/modules/13/configuration.md
index 4b2f8db..476e313 100644
--- a/cobalt/site/docs/reference/starboard/modules/13/configuration.md
+++ b/cobalt/site/docs/reference/starboard/modules/13/configuration.md
@@ -134,12 +134,7 @@
 
 ### SB_RESTRICT ###
 
-Include the platform-specific configuration. This macro is set by GYP in
-starboard_base_target.gypi and passed in on the command line for all targets and
-all configurations.Makes a pointer-typed parameter restricted so that the
-compiler can make certain optimizations because it knows the pointers are
-unique.
-
+Include the platform-specific configuration.
 ### SB_SIZE_OF(DATATYPE) ###
 
 Determines at compile-time the size of a data type, or 0 if the data type that
diff --git a/cobalt/site/docs/reference/starboard/modules/configuration.md b/cobalt/site/docs/reference/starboard/modules/configuration.md
index 4b2f8db..3bd7067 100644
--- a/cobalt/site/docs/reference/starboard/modules/configuration.md
+++ b/cobalt/site/docs/reference/starboard/modules/configuration.md
@@ -134,11 +134,7 @@
 
 ### SB_RESTRICT ###
 
-Include the platform-specific configuration. This macro is set by GYP in
-starboard_base_target.gypi and passed in on the command line for all targets and
-all configurations.Makes a pointer-typed parameter restricted so that the
-compiler can make certain optimizations because it knows the pointers are
-unique.
+Include the platform-specific configuration.
 
 ### SB_SIZE_OF(DATATYPE) ###
 
diff --git a/cobalt/site/docs/starboard/porting.md b/cobalt/site/docs/starboard/porting.md
index c6e635a..d26b327 100644
--- a/cobalt/site/docs/starboard/porting.md
+++ b/cobalt/site/docs/starboard/porting.md
@@ -103,11 +103,11 @@
 the following files:
 
 *   `atomic_public.h`
+*   `BUILD.gn`
 *   `configuration_public.h`
-*   `gyp_configuration.gypi`
-*   `gyp_configuration.py`
-*   `starboard_platform.gyp`
-*   `thread_types_public.h`
+*   `platform_configuration/BUILD.gn`
+*   `platform_configuration/configuration.gni`
+*   `toolchain/BUILD.gn`
 
 We recommend that you copy the files from the Stub reference implementation,
 located at `starboard/stub/` to your `binary-variant` directories.
@@ -161,8 +161,8 @@
 
 ### 4. Make required file modifications
 
-To port your code, you must make the following modifications to the files
-that you copied in step 3:
+To port your code, you must add your platform to `starboard/build/platforms.py`
+then make the following modifications to the files that you copied in step 3:
 
 
 1.  **`atomic_public.h`** - Ensure that this file points at the appropriate
@@ -172,136 +172,53 @@
     ../../reference/starboard/configuration-public.html) as appropriate for
     your platform.
 
-1.  **`gyp_configuration.py`**
-    1.  Modify the `CreatePlatformConfig()` function to return the platform
-        configuration that you defined in step 1. The example below shows that
-        function as it appears in the Stub implementation and the Desktop
-        Linux port:
+1.  **`platform_configuration/BUILD.gn`**
+    1.  Update your platform command-line flags and libraries. Ensure that
+        you do not assume a particular workstation layout since that layout
+        may vary from user to user.
 
-        <pre>
-        # Stub:
-        def CreatePlatformConfig():
-          try:
-            return PlatformConfig('<b>stub</b>')
-          except RuntimeError as e:
-            logging.critical(e)
-            return None
-
-        # Desktop Linux
-        def CreatePlatformConfig():
-          try:
-            return gyp_configuration.PlatformConfig('<b>linux-x64x11</b>')
-          except RuntimeError as e:
-            logging.critical(e)
-            return None
-        </pre>
-
-        Note that the third line is the only one that is different. The
-        key difference in terms of these instructions is changing `stub`
-        to `linux-x64x11`. The Desktop Linux port also uses a shared copy
-        of `gyp_configuration.py`, which is why the rest of the line is
-        different.
-
-    1.  In the `GetVariables` function, ensure that the `clang` variable
-        is set to `1` if your toolchain uses clang:
-
-        <pre>
-        variables = super(PlatformConfig, self).GetVariables(configuration)
-        <b>variables.update({'clang': 1,})</b>
-        return variables
-        </pre>
-
-    1.  In the `GetEnvironmentVariables` function, set these dictionary values
-        to the toolchain analogs for your platform. Note that "target platform"
-        refers to the platform being targeted by the port (e.g. Android TV,
-        Raspberry Pi) and "host platform" is the workstation platform running
-        the cross-compiler to the target (e.g. desktop Linux, desktop Windows).
-        *   `CC` - the C compiler for the target platform. Example: `clang`.
-        *   `CXX` - the C++ compiler for the target platform.
-            Example: `clang++`.
-        *   `CC_HOST` - the C compiler for the host platform. Example: `clang`.
-        *   `CXX_HOST` - the C++ compiler for the host platform.
-            Example: `clang++`.
-        *   `LD_HOST` - the C++ linker for the host platform.
-            Example: `clang++`.
-        *   `ARFLAGS_HOST` - Archiver flags for the host platform. The
-            archiver is the toolchain program that creates static libraries.
-            Example: `rcs`.
-        *   `ARTHINFLAGS_HOST` - Archiver flags for the host platform for
-            creating "thin" archives, which are faster for intermediate
-            libraries that aren't for direct publishing. Example: `rcsT`.
-
-1.  **`gyp_configuration.gypi`**
-    1.  Update the value of the `default_configuration` property and the keys
-        in the `configurations` property to be
-        `<platform-configuration>_<build-type>` where:
-        1.  `<platform-configuration>` is the value that you defined in step 1.
-        1.  `<build-type>` is one of the following values:
-            *   `debug`
-            *   `devel`
-            *   `qa`
-            *   `gold`
-
-        The following snippet from the configuration file shows how these
-        properties appear in the Stub implementation. The Desktop Linux port
-        replaces the string `stub` with `linux-x64x11` everywhere that it
-        appears:
-
-        ```
-        'target_defaults': {
-          'default_configuration': 'stub_debug',
-          'configurations': {
-            'stub_debug': {
-              'inherit_from': ['debug_base'],
-            },
-            'stub_devel': {
-              'inherit_from': ['devel_base'],
-            },
-            'stub_qa': {
-              'inherit_from': ['qa_base'],
-            },
-            'stub_gold': {
-              'inherit_from': ['gold_base'],
-            },
-          }, # end of configurations
-          ...
-        }
-        ```
-
-    1.  Update the following properties in the `variables` dictionary:
-        *   `target_arch` - Identifies your architecture. Supported values
-            are `arm`, `x64`, and `x86`.
-        *   `target_os` - Set to `linux` if your platform is Linux-based.
-            Otherwise, remove this variable.
+1.  **`platform_configuration/configuration.gni`**
+    1.  Update the following variables in the file from their default in
+        `starboard/build/config/base_configuration.gni` if necessary:
         *   `gl_type` - Set to `system_gles2` if you are using the system EGL
             \+ GLES2 implementation and otherwise set the value to `none`.
-        *   `in_app_dial` - Enables (or disables) the DIAL server that runs
-            inside Cobalt. (This server only runs when Cobalt is running.)
+        *   `enable_in_app_dial` - Enables (or disables) the DIAL server that
+            runs inside Cobalt. (This server only runs when Cobalt is running.)
             The [DIAL protocol](http://www.dial-multiscreen.org/home) enables
             second-screen devices (like tablets and phones) to discover,
             launch, and interface with applications on first-screen devices
             (like televisions, set-top boxes, and Blu-ray players).
-            *   Set this value to `0` if you already have system-wide DIAL
-                support. In that case, a DIAL server running inside Cobalt would
-                be redundant.
-            *   Set this value to `1` if you want Cobalt to run a DIAL server
-                whenever it is running. That server could only be used to
-                connect with the current Cobalt application (e.g. YouTube).
+            *   Set this value to `false` if you already have system-wide DIAL
+                support. In that case, a DIAL server running inside Cobalt
+                would be redundant.
+            *   Set this value to `true` if you want Cobalt to run a DIAL
+                server whenever it is running. That server could only be used
+                to connect with the current Cobalt application (e.g. YouTube).
 
+1.  **`toolchain/BUILD.gn`**
+    1.  If your platform uses a simple clang toolchain, simply pass the path to
+        the toolchain to the `clang_toolchain` template. This template will
+        assume names for each of the tools, i.e. the `clang++` executable
+        should be at `${clang_base_path}/clang++`.
+
+        Modify the host's `toolchain_args` to pass the correct OS and CPU for
+        your host platform.
+
+        If your toolchain uses GCC or has tool names that differ from what
+        the `clang_toolchain` template assumes, use the `gcc_toolchain`
+        template (also provided in `"//build/toolchain/gcc_toolchain.gni"`).
+        To use this template, pass full paths to each of the required tools
+        (`ar`, `cc`, `cxx`, and `ld`), as well as any optional tools you want
+        to use. If your toolchain uses clang, make sure you pass
+        `is_clang = true` in `toolchain_args`.
 
     1.  Update your toolchain command-line flags and libraries. Ensure that
         you do not assume a particular workstation layout since that layout
         may vary from user to user.
 
-    1.  Update the global defines in the `target_defaults.defines` dictionary,
-        if necessary.
-
-1.  **`thread_types_public.h`** - Ensure that this file points at the
-    appropriate shared or custom implementation.
-
 ### 5. Port modules to work on your platform
 
-The `starboard_platform.gyp` file points to all of the source files included
+The `BUILD.gn` file points to all of the source files included
 in your new Starboard implementation. If you are starting with a copy of the
 Stub implementation, then that file will initially include a lot of files
 from the `starboard/shared/stub/` directory. Similarly, if you are starting
@@ -319,7 +236,7 @@
 implementations with either custom implementations or with other ported
 implementations from the `starboard/shared/` directory until you have
 gone through all of the modules. As you do, update the
-`starboard_platform.gyp` file to identify the appropriate source files.
+`BUILD.gn` file to identify the appropriate source files.
 
 Due to dependencies between modules, you will find it easier to get some
 modules to pass the NPLB tests before other modules. We recommend porting
diff --git a/cobalt/speech/sandbox/BUILD.gn b/cobalt/speech/sandbox/BUILD.gn
index bc8c99e..7a51260 100644
--- a/cobalt/speech/sandbox/BUILD.gn
+++ b/cobalt/speech/sandbox/BUILD.gn
@@ -39,4 +39,6 @@
   ]
 
   deps += cobalt_platform_dependencies
+
+  content_deps = [ "//cobalt/speech:speech_testdata" ]
 }
diff --git a/cobalt/speech/sandbox/audio_loader.cc b/cobalt/speech/sandbox/audio_loader.cc
index 3581127..da35a2c 100644
--- a/cobalt/speech/sandbox/audio_loader.cc
+++ b/cobalt/speech/sandbox/audio_loader.cc
@@ -99,7 +99,8 @@
   fetcher_factory_.reset(new loader::FetcherFactory(network_module_));
   loader_ = base::WrapUnique(new loader::Loader(
       base::Bind(&loader::FetcherFactory::CreateFetcher,
-                 base::Unretained(fetcher_factory_.get()), url),
+                 base::Unretained(fetcher_factory_.get()), url,
+                 disk_cache::kOther),
       base::Bind(&DummyDecoder::Create, base::Bind(&AudioLoader::OnLoadingDone,
                                                    base::Unretained(this))),
       base::Bind(&AudioLoader::OnLoadingError, base::Unretained(this))));
diff --git a/cobalt/speech/sandbox/sandbox.gyp b/cobalt/speech/sandbox/sandbox.gyp
deleted file mode 100644
index 25aaed0..0000000
--- a/cobalt/speech/sandbox/sandbox.gyp
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This is a sample sandbox application for experimenting with the Cobalt
-# Speech API.
-
-{
-  'targets': [
-    {
-      'target_name': 'speech_sandbox',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'audio_loader.cc',
-        'audio_loader.h',
-        'speech_sandbox.cc',
-        'speech_sandbox.h',
-        'speech_sandbox_main.cc',
-      ],
-      'dependencies': [
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/cobalt/audio/audio.gyp:audio',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/debug/debug.gyp:console_command_manager',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        '<(DEPTH)/cobalt/speech/speech.gyp:speech',
-        '<(DEPTH)/cobalt/trace_event/trace_event.gyp:trace_event',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-    },
-
-    {
-      'target_name': 'speech_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'speech_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'speech_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/speech/sandbox/speech_sandbox.cc b/cobalt/speech/sandbox/speech_sandbox.cc
index b930aa9..78e3353 100644
--- a/cobalt/speech/sandbox/speech_sandbox.cc
+++ b/cobalt/speech/sandbox/speech_sandbox.cc
@@ -76,9 +76,8 @@
 void SpeechSandbox::StartRecognition(
     const dom::DOMSettings::Options& dom_settings_options) {
   std::unique_ptr<script::EnvironmentSettings> environment_settings(
-      new dom::DOMSettings(kDOMMaxElementDepth, NULL, network_module_.get(),
-                           NULL, NULL, NULL, NULL, NULL, NULL,
-                           null_debugger_hooks_, NULL, dom_settings_options));
+      new dom::DOMSettings(null_debugger_hooks_, kDOMMaxElementDepth, NULL,
+                           NULL, NULL, NULL, NULL, dom_settings_options));
   DCHECK(environment_settings);
 
   speech_recognition_ = new SpeechRecognition(environment_settings.get());
diff --git a/cobalt/speech/speech.gyp b/cobalt/speech/speech.gyp
deleted file mode 100644
index 489ac3b..0000000
--- a/cobalt/speech/speech.gyp
+++ /dev/null
@@ -1,125 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'speech',
-      'type': 'static_library',
-      'msvs_disabled_warnings': [
-        # Dereferencing NULL pointer in generated file
-        # google_streaming_api.pb.cc.
-        6011,
-      ],
-      'sources': [
-        'audio_encoder_flac.cc',
-        'audio_encoder_flac.h',
-        'cobalt_speech_recognizer.cc',
-        'cobalt_speech_recognizer.h',
-        'endpointer_delegate.cc',
-        'endpointer_delegate.h',
-        'google_speech_service.cc',
-        'google_speech_service.h',
-        'google_streaming_api.pb.cc',
-        'google_streaming_api.pb.h',
-        'google_streaming_api.pb.proto',
-        'microphone.h',
-        'microphone_manager.cc',
-        'microphone_manager.h',
-        'speech_configuration.h',
-        'speech_recognition.cc',
-        'speech_recognition.h',
-        'speech_recognition_alternative.h',
-        'speech_recognition_config.h',
-        'speech_recognition_error.cc',
-        'speech_recognition_error.h',
-        'speech_recognition_event.cc',
-        'speech_recognition_event.h',
-        'speech_recognition_manager.cc',
-        'speech_recognition_manager.h',
-        'speech_recognition_result.cc',
-        'speech_recognition_result.h',
-        'speech_recognition_result_list.cc',
-        'speech_recognition_result_list.h',
-        'speech_recognizer.cc',
-        'speech_recognizer.h',
-        'speech_synthesis.cc',
-        'speech_synthesis.h',
-        'speech_synthesis_error_event.h',
-        'speech_synthesis_event.cc',
-        'speech_synthesis_event.h',
-        'speech_synthesis_utterance.cc',
-        'speech_synthesis_utterance.h',
-        'speech_synthesis_voice.h',
-        'starboard_speech_recognizer.cc',
-        'starboard_speech_recognizer.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/content/browser/speech/speech.gyp:speech',
-        '<(DEPTH)/third_party/flac/flac.gyp:libflac',
-        '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-      ],
-      'export_dependent_settings': [
-        # Additionally, ensure that the include directories for generated
-        # headers are put on the include directories for targets that depend
-        # on this one.
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ],
-      'include_dirs': [
-        # Get protobuf headers from the chromium tree.
-        '<(DEPTH)/third_party/protobuf/src',
-      ],
-      'conditions': [
-        ['OS=="starboard"', {
-          'sources': [
-            'microphone_starboard.cc',
-            'microphone_starboard.h',
-          ],
-        }],
-        ['OS=="starboard" and enable_fake_microphone == 1', {
-          'sources': [
-            'microphone_fake.cc',
-            'microphone_fake.h',
-            'url_fetcher_fake.cc',
-            'url_fetcher_fake.h',
-          ],
-          'dependencies': [
-            '<(DEPTH)/cobalt/audio/audio.gyp:audio',
-          ],
-          'defines': [
-            'ENABLE_FAKE_MICROPHONE',
-          ],
-          'direct_dependent_settings': {
-            'defines': [ 'ENABLE_FAKE_MICROPHONE', ],
-          },
-        }],
-        ['cobalt_copy_test_data == 1', {
-          'variables': {
-            'content_test_input_files': [
-              '<(DEPTH)/cobalt/speech/testdata/',
-            ],
-            'content_test_output_subdir': 'cobalt/speech/testdata/',
-          },
-          'includes': [ '<(DEPTH)/starboard/build/copy_test_data.gypi' ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/cobalt/speech/speech_configuration.h b/cobalt/speech/speech_configuration.h
index 5458641..6d9cd90 100644
--- a/cobalt/speech/speech_configuration.h
+++ b/cobalt/speech/speech_configuration.h
@@ -18,12 +18,10 @@
 #include "build/build_config.h"
 #include "starboard/configuration.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
 #define SB_USE_SB_MICROPHONE 1
-#endif  // SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
 
 #if SB_API_VERSION == 12 || (SB_HAS(SPEECH_RECOGNIZER) && SB_API_VERSION < 13)
 #define SB_USE_SB_SPEECH_RECOGNIZER 1
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
+#endif  // SB_API_VERSION == 12 || SB_HAS(SPEECH_RECOGNIZER)
 
 #endif  // COBALT_SPEECH_SPEECH_CONFIGURATION_H_
diff --git a/cobalt/speech/speech_recognition.cc b/cobalt/speech/speech_recognition.cc
index 8957d0a..38d60f3 100644
--- a/cobalt/speech/speech_recognition.cc
+++ b/cobalt/speech/speech_recognition.cc
@@ -16,6 +16,9 @@
 
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/dom_settings.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace cobalt {
 namespace speech {
@@ -26,13 +29,14 @@
 // max alternatives: 1.
 SpeechRecognition::SpeechRecognition(script::EnvironmentSettings* settings)
     : dom::EventTarget(settings),
-      ALLOW_THIS_IN_INITIALIZER_LIST(
-          manager_(base::polymorphic_downcast<dom::DOMSettings*>(settings)
-                       ->network_module(),
-                   base::Bind(&SpeechRecognition::OnEventAvailable,
-                              base::Unretained(this)),
-                   base::polymorphic_downcast<dom::DOMSettings*>(settings)
-                       ->microphone_options())),
+      ALLOW_THIS_IN_INITIALIZER_LIST(manager_(
+          base::polymorphic_downcast<web::EnvironmentSettings*>(settings)
+              ->context()
+              ->network_module(),
+          base::Bind(&SpeechRecognition::OnEventAvailable,
+                     base::Unretained(this)),
+          base::polymorphic_downcast<dom::DOMSettings*>(settings)
+              ->microphone_options())),
       config_("" /*lang*/, false /*continuous*/, false /*interim_results*/,
               1 /*max alternatives*/) {}
 
diff --git a/cobalt/speech/speech_synthesis.cc b/cobalt/speech/speech_synthesis.cc
index e62782f..11526dc 100644
--- a/cobalt/speech/speech_synthesis.cc
+++ b/cobalt/speech/speech_synthesis.cc
@@ -23,11 +23,7 @@
 namespace speech {
 
 bool SpeechSynthesis::SpeechSynthesisIsSupported() {
-#if SB_API_VERSION >= 12
   return SbSpeechSynthesisIsSupported();
-#else
-  return true;
-#endif
 }
 
 SpeechSynthesis::SpeechSynthesis(script::EnvironmentSettings* settings,
@@ -37,7 +33,6 @@
       log_output_(log_output),
       paused_(false),
       navigator_(navigator) {
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_SYNTHESIS)
   if (SpeechSynthesis::SpeechSynthesisIsSupported()) {
     const char* kVoiceName = "Cobalt";
     std::string voice_urn(kVoiceName);
@@ -47,7 +42,6 @@
     voices_.push_back(new SpeechSynthesisVoice(voice_urn, kVoiceName,
                                                voice_lang, false, true));
   }
-#endif
 }
 
 SpeechSynthesis::~SpeechSynthesis() {}
@@ -65,11 +59,9 @@
     (*utterance_iterator)->DispatchErrorCancelledEvent();
   }
   utterances_.clear();
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_SYNTHESIS)
   if (SpeechSynthesis::SpeechSynthesisIsSupported()) {
     SbSpeechSynthesisCancel();
   }
-#endif
 }
 
 void SpeechSynthesis::Resume() {
@@ -115,7 +107,6 @@
     return;
   }
   utterance->SignalPendingSpeak();
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_SYNTHESIS)
   if (SpeechSynthesis::SpeechSynthesisIsSupported()) {
     if (!utterance->lang().empty() &&
         utterance->lang() != navigator_->language()) {
@@ -136,7 +127,6 @@
     utterance->DispatchEndEvent();
     return;
   }
-#endif
   DispatchErrorEvent(utterance, kSpeechSynthesisErrorCodeSynthesisUnavailable);
 }
 
diff --git a/cobalt/speech/starboard_speech_recognizer.cc b/cobalt/speech/starboard_speech_recognizer.cc
index af7782d..73905c0 100644
--- a/cobalt/speech/starboard_speech_recognizer.cc
+++ b/cobalt/speech/starboard_speech_recognizer.cc
@@ -31,10 +31,8 @@
 bool StarboardSpeechRecognizer::IsSupported() {
 #if SB_API_VERSION >= 13
   return false;
-#elif SB_API_VERSION >= 12
-  return SbSpeechRecognizerIsSupported();
 #else
-  return true;
+  return SbSpeechRecognizerIsSupported();
 #endif
 }
 
diff --git a/cobalt/sso/sso.gyp b/cobalt/sso/sso.gyp
deleted file mode 100644
index f3d9d04..0000000
--- a/cobalt/sso/sso.gyp
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'sso',
-      'type': 'none',
-      'sources': [
-        'sso_interface.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/storage/storage.gyp b/cobalt/storage/storage.gyp
deleted file mode 100644
index 802e8a6..0000000
--- a/cobalt/storage/storage.gyp
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [ '../build/contents_dir.gypi' ],
-
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'storage',
-      'type': 'static_library',
-      'sources': [
-        'savegame.cc',
-        'savegame.h',
-        'savegame_thread.cc',
-        'savegame_thread.h',
-        'savegame_fake.cc',
-        'savegame_starboard.cc',
-        'storage_manager.cc',
-        'storage_manager.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/storage/store/store.gyp:memory_store',
-        '<(DEPTH)/net/net.gyp:net',
-      ],
-    },
-    {
-      'target_name': 'storage_test',
-      'type': '<(gtest_target_type)',
-      'defines': [
-        'GMOCK_NO_MOVE_MOCK',
-      ],
-      'sources': [
-        'savegame_test.cc',
-        'storage_manager_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'storage',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'storage_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'storage_test',
-      ],
-      'variables': {
-        'executable_name': 'storage_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/storage/storage_constants.gyp b/cobalt/storage/storage_constants.gyp
deleted file mode 100644
index f7a82f3..0000000
--- a/cobalt/storage/storage_constants.gyp
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'storage_constants',
-      'type': 'static_library',
-      'sources': [
-        'storage_constants.cc',
-        'storage_constants.h',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/storage/store/BUILD.gn b/cobalt/storage/store/BUILD.gn
index 852d03a..f9c895f 100644
--- a/cobalt/storage/store/BUILD.gn
+++ b/cobalt/storage/store/BUILD.gn
@@ -46,6 +46,4 @@
     "//third_party/protobuf:protobuf_lite",
     "//url",
   ]
-
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/cobalt/storage/store/store.gyp b/cobalt/storage/store/store.gyp
deleted file mode 100644
index 1cf9fc4..0000000
--- a/cobalt/storage/store/store.gyp
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'memory_store',
-      'type': 'static_library',
-      'sources': [
-        'memory_store.h',
-        'memory_store.cc',
-        'storage.pb.cc',
-        'storage.pb.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/loader/origin.gyp:origin',
-        '<(DEPTH)/cobalt/storage/storage_constants.gyp:storage_constants',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-      ],
-    },
-    {
-      'target_name': 'memory_store_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'memory_store_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'memory_store',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'memory_store_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'memory_store_test',
-      ],
-      'variables': {
-        'executable_name': 'memory_store_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/subtlecrypto/subtle_crypto.cc b/cobalt/subtlecrypto/subtle_crypto.cc
index 28bdce6..5fd6edf 100644
--- a/cobalt/subtlecrypto/subtle_crypto.cc
+++ b/cobalt/subtlecrypto/subtle_crypto.cc
@@ -12,15 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "cobalt/subtlecrypto/subtle_crypto.h"
+
 #include <algorithm>
 #include <set>
 #include <string>
 
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/dom/dom_settings.h"
-
 #include "cobalt/subtlecrypto/crypto_impl.h"
-#include "cobalt/subtlecrypto/subtle_crypto.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 
 namespace cobalt {
 namespace subtlecrypto {
@@ -79,9 +80,10 @@
 using PromiseWrappable = SubtleCrypto::PromiseWrappable;
 
 SubtleCrypto::SubtleCrypto(script::EnvironmentSettings *environment) {
-  dom::DOMSettings *dom_settings =
-      base::polymorphic_downcast<dom::DOMSettings *>(environment);
-  global_env_ = dom_settings->global_environment();
+  global_env_ =
+      base::polymorphic_downcast<web::EnvironmentSettings *>(environment)
+          ->context()
+          ->global_environment();
   script_value_factory_ = global_env_->script_value_factory();
 }
 
diff --git a/cobalt/subtlecrypto/subtlecrypto.gyp b/cobalt/subtlecrypto/subtlecrypto.gyp
deleted file mode 100644
index 240bc98..0000000
--- a/cobalt/subtlecrypto/subtlecrypto.gyp
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'crypto_impl',
-      'type': 'static_library',
-      'sources': [
-        'crypto_impl.cc',
-        'crypto_impl.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/third_party/boringssl/boringssl.gyp:crypto',
-      ]
-    },
-    {
-      'target_name': 'crypto_impl_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'crypto_impl_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'crypto_impl',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'subtlecrypto',
-      'type': 'static_library',
-      'sources': [
-        'subtle_crypto.cc',
-        'subtle_crypto.h',
-        'crypto_key.cc',
-        'crypto_key.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        'crypto_impl',
-      ],
-    },
-    {
-      'target_name': 'crypto_impl_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'crypto_impl_test',
-      ],
-      'variables': {
-        'executable_name': 'crypto_impl_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ]
-}
-
diff --git a/cobalt/system_window/input_event.h b/cobalt/system_window/input_event.h
index 2c1b161..a4d2670 100644
--- a/cobalt/system_window/input_event.h
+++ b/cobalt/system_window/input_event.h
@@ -64,13 +64,8 @@
              const math::PointF& position = math::PointF(),
              const math::PointF& delta = math::PointF(), float pressure = 0,
              const math::PointF& size = math::PointF(),
-             const math::PointF& tilt = math::PointF()
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
-                 ,
-             const std::string& input_text = "", bool is_composing = false
-#endif  // SB_API_VERSION >= 12 ||
-             // SB_HAS(ON_SCREEN_KEYBOARD)
-             )
+             const math::PointF& tilt = math::PointF(),
+             const std::string& input_text = "", bool is_composing = false)
       : timestamp_(timestamp),
         type_(type),
         device_id_(device_id),
@@ -81,15 +76,9 @@
         delta_(delta),
         pressure_(pressure),
         size_(size),
-        tilt_(tilt)
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
-        ,
+        tilt_(tilt),
         input_text_(input_text),
-        is_composing_(is_composing)
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-  {
-  }
+        is_composing_(is_composing) {}
 
   ~InputEvent() {}
 
@@ -104,11 +93,8 @@
   float pressure() const { return pressure_; }
   const math::PointF& size() const { return size_; }
   const math::PointF& tilt() const { return tilt_; }
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   const std::string& input_text() const { return input_text_; }
   bool is_composing() const { return is_composing_; }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 
   BASE_EVENT_SUBCLASS(InputEvent);
 
@@ -124,11 +110,8 @@
   float pressure_;
   math::PointF size_;
   math::PointF tilt_;
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   std::string input_text_;
   bool is_composing_;
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 };
 
 // The Starboard Event handler SbHandleEvent should call this function on
diff --git a/cobalt/system_window/system_window.cc b/cobalt/system_window/system_window.cc
index 85dbe0c..df86f86 100644
--- a/cobalt/system_window/system_window.cc
+++ b/cobalt/system_window/system_window.cc
@@ -108,6 +108,14 @@
                                       InputEvent::Type type, bool is_repeat) {
   DCHECK(event);
   DCHECK(event->data);
+  if (event == nullptr) {
+    LOG(ERROR) << "SystemWindow::DispatchInputEvent: missing event";
+    return;
+  }
+  if (event->data == nullptr) {
+    LOG(ERROR) << "SystemWindow::DispatchInputEvent: missing event data";
+    return;
+  }
   SbInputData* input_data = static_cast<SbInputData*>(event->data);
   const SbInputData& data = *input_data;
 
@@ -115,7 +123,7 @@
   SbTimeMonotonic timestamp = 0;
 #if SB_API_VERSION >= 13
   timestamp = event->timestamp;
-#else  // SB_API_VERSION >= 13
+#else   // SB_API_VERSION >= 13
   bool use_input_timestamp =
       SbSystemHasCapability(kSbSystemCapabilitySetsInputTimestamp);
   if (use_input_timestamp) {
@@ -160,7 +168,6 @@
     }
   }
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   std::unique_ptr<InputEvent> input_event(
       new InputEvent(timestamp, type, data.device_id, key_code, modifiers,
                      is_repeat, math::PointF(data.position.x, data.position.y),
@@ -169,16 +176,6 @@
                      math::PointF(data.tilt.x, data.tilt.y),
                      data.input_text ? data.input_text : "",
                      data.is_composing ? data.is_composing : false));
-#else   // SB_API_VERSION >= 12 ||
-  // SB_HAS(ON_SCREEN_KEYBOARD)
-  std::unique_ptr<InputEvent> input_event(
-      new InputEvent(timestamp, type, data.device_id, key_code, modifiers,
-                     is_repeat, math::PointF(data.position.x, data.position.y),
-                     math::PointF(data.delta.x, data.delta.y), pressure,
-                     math::PointF(data.size.x, data.size.y),
-                     math::PointF(data.tilt.x, data.tilt.y)));
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
   event_dispatcher()->DispatchEvent(
       std::unique_ptr<base::Event>(input_event.release()));
 }
@@ -263,13 +260,10 @@
       DispatchInputEvent(event, InputEvent::kKeyMove, false /* is_repeat */);
       break;
     }
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
     case kSbInputEventTypeInput: {
       DispatchInputEvent(event, InputEvent::kInput, false /* is_repeat */);
       break;
     }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
     default:
       break;
   }
diff --git a/cobalt/system_window/system_window.gyp b/cobalt/system_window/system_window.gyp
deleted file mode 100644
index 84c13b9..0000000
--- a/cobalt/system_window/system_window.gyp
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'system_window',
-      'type': 'static_library',
-      'sources': [
-        'keyboard_event.h',
-        'system_window.h',
-        'system_window.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/test/document_loader.h b/cobalt/test/document_loader.h
index dc0d948..bb6ac15 100644
--- a/cobalt/test/document_loader.h
+++ b/cobalt/test/document_loader.h
@@ -72,8 +72,7 @@
             NULL /* remote_font_cache */, NULL /* mesh_cache */,
             dom_stat_tracker_.get(), "" /* language */,
             base::kApplicationStateStarted,
-            NULL /* synchronous_loader_interrupt */,
-            NULL /* performance */) {}
+            NULL /* synchronous_loader_interrupt */, NULL /* performance */) {}
   void Load(const GURL& url) {
     // Load the document in a nested message loop.
     dom::Document::Options options(url);
@@ -83,7 +82,7 @@
     document_->AddObserver(this);
     document_loader_.reset(new loader::Loader(
         base::Bind(&loader::FetcherFactory::CreateFetcher,
-                   base::Unretained(&fetcher_factory_), url),
+                   base::Unretained(&fetcher_factory_), url, disk_cache::kHTML),
         base::Bind(&dom_parser::Parser::ParseDocumentAsync,
                    base::Unretained(dom_parser_.get()), document_,
                    base::SourceLocation(url.spec(), 1, 1)),
diff --git a/cobalt/test/run_all_unittests.cc b/cobalt/test/run_all_unittests.cc
index 0d69f0c..63cde2f 100644
--- a/cobalt/test/run_all_unittests.cc
+++ b/cobalt/test/run_all_unittests.cc
@@ -29,7 +29,6 @@
   base::PathService::RegisterProvider(&cobalt::PathProvider,
                                       cobalt::paths::PATH_COBALT_START,
                                       cobalt::paths::PATH_COBALT_END);
-
   return test_suite.Run();
 }
 }  // namespace
diff --git a/cobalt/test/test.gypi b/cobalt/test/test.gypi
deleted file mode 100644
index 9df4e38..0000000
--- a/cobalt/test/test.gypi
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'dependencies': [
-    '<(DEPTH)/base/base.gyp:test_support_base',
-    '<(DEPTH)/testing/gtest.gyp:gtest',
-  ],
-  'sources': [
-    '<(DEPTH)/cobalt/test/run_all_unittests.cc',
-  ],
-}
diff --git a/cobalt/tools/_env.py b/cobalt/tools/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/cobalt/tools/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/tools/automated_testing/_env.py b/cobalt/tools/automated_testing/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/cobalt/tools/automated_testing/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/cobalt/tools/automated_testing/cobalt_runner.py b/cobalt/tools/automated_testing/cobalt_runner.py
index 1c26ae3..efdcc06 100644
--- a/cobalt/tools/automated_testing/cobalt_runner.py
+++ b/cobalt/tools/automated_testing/cobalt_runner.py
@@ -1,3 +1,16 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 """Launches Cobalt and runs webdriver-based Cobalt tests."""
 
 from __future__ import absolute_import
@@ -8,13 +21,12 @@
 import logging
 import os
 import re
+from six.moves import _thread
 import sys
 import threading
 import time
 import traceback
-import thread
 
-import _env  # pylint: disable=unused-import
 from cobalt.tools.automated_testing import c_val_names
 from cobalt.tools.automated_testing import webdriver_utils
 from starboard.tools import abstract_launcher
@@ -116,7 +128,7 @@
     self.log_handler = log_handler
 
     if log_file:
-      self.log_file = open(log_file)
+      self.log_file = open(log_file)  # pylint: disable=consider-using-with
       logging.basicConfig(stream=self.log_file, level=logging.INFO)
     else:
       self.log_file = sys.stdout
@@ -219,7 +231,7 @@
         continue
 
       port = match.group(1)
-      logging.info('WebDriver port opened:' + port + '\n')
+      logging.info('WebDriver port opened: %s', port)
       self._StartWebdriver(port)
 
   def __enter__(self):
@@ -261,7 +273,7 @@
     try:
       self.WaitForStart()
     except KeyboardInterrupt:
-      # potentially from thread.interrupt_main(). We will treat as
+      # potentially from _thread.interrupt_main(). We will treat as
       # a timeout regardless.
 
       self.Exit(should_fail=True)
@@ -291,7 +303,7 @@
     if self.CanExecuteJavaScript():
       try:
         self.ExecuteJavaScript('window.close();')
-      except Exception:
+      except Exception:  # pylint: disable=broad-except
         wait_for_runner_thread = False
         sys.stderr.write(
             '***An exception was raised while trying to close the app:')
@@ -299,7 +311,7 @@
 
     if wait_for_runner_thread:
       self.runner_thread.join(COBALT_EXIT_TIMEOUT_SECONDS)
-    if self.runner_thread.isAlive():
+    if self.runner_thread.is_alive():
       sys.stderr.write(
           '***Runner thread still alive after sending graceful shutdown '
           'command, try again by killing app***\n')
@@ -307,7 +319,7 @@
     # Once the write end of the pipe has been closed by the launcher, the reader
     # thread will get EOF and exit.
     self.reader_thread.join(COBALT_EXIT_TIMEOUT_SECONDS)
-    if self.reader_thread.isAlive():
+    if self.reader_thread.is_alive():
       sys.stderr.write('***Reader thread still alive, exiting anyway***\n')
     try:
       self.launcher_read_pipe.close()
@@ -352,7 +364,7 @@
       if not self.should_exit.is_set():
         # If the main thread is not expecting us to exit,
         # we must interrupt it.
-        thread.interrupt_main()
+        _thread.interrupt_main()
     return 0
 
   def CanExecuteJavaScript(self):
@@ -434,7 +446,7 @@
       Underlying WebDriver exceptions
     """
     start_time = time.time()
-    while ((not self.FindElements(css_selector)) and
+    while (not self.FindElements(css_selector) and
            (time.time() - start_time < PAGE_LOAD_WAIT_SECONDS)):
       time.sleep(1)
     if expected_num:
@@ -489,7 +501,7 @@
       if retry_count >= FIND_ELEMENT_RETRY_LIMIT:
         raise TimeoutException(
             'Selenium element or window not found in {} tries'.format(
-                FIND_ELEMENT_RETRY_LIMIT))
+                retry_count))
       retry_count += 1
       try:
         elements = self.webdriver.find_elements_by_css_selector(css_selector)
@@ -504,6 +516,27 @@
               css_selector, expected_num, len(elements)))
     return elements
 
+  def WaitForActiveElement(self):
+    """Waits until there is an active element."""
+    retry_count = 0
+    while True:
+      if retry_count >= FIND_ELEMENT_RETRY_LIMIT:
+        raise TimeoutException(
+            'Selenium active element not found in {} tries'.format(retry_count))
+      retry_count += 1
+      try:
+        element = self.webdriver.switch_to.active_element
+      except (selenium_exceptions.NoSuchElementException,
+              selenium_exceptions.NoSuchWindowException,
+              selenium_exceptions.WebDriverException):
+        time.sleep(0.2)
+        continue
+      if not element:
+        time.sleep(0.2)
+        continue
+      break
+    return element
+
   def SendKeys(self, key_events):
     """Sends keys to whichever element currently has focus.
 
diff --git a/cobalt/tools/deps_substitutions.txt b/cobalt/tools/deps_substitutions.txt
deleted file mode 100644
index 7824f79..0000000
--- a/cobalt/tools/deps_substitutions.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-<(DEPTH)/starboard/examples/glclear/glclear.gyp:starboard_glclear_example	//starboard/examples/glclear
-<(DEPTH)/starboard/examples/window/window.gyp:starboard_window_example	//starboard/examples/window
diff --git a/cobalt/tools/env_test.py b/cobalt/tools/env_test.py
deleted file mode 100755
index 090dfa4..0000000
--- a/cobalt/tools/env_test.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Tests out _env."""
-
-import sys
-import unittest
-
-
-class EnvironmentTest(unittest.TestCase):
-
-  def testSysPath(self):
-    import _env  # pylint: disable=unused-variable,g-import-not-at-top
-    import cobalt.tools.paths  # pylint: disable=g-import-not-at-top
-    self.assertTrue(cobalt.tools.paths.COBALT_ROOT)
-
-  def testNoDupes(self):
-    import _env  # pylint: disable=unused-variable,g-import-not-at-top
-    visited = set()
-    deduped = [x for x in sys.path if not (x in visited or visited.add(x))]
-    self.assertItemsEqual(sys.path, deduped)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/cobalt/tools/paths.py b/cobalt/tools/paths.py
index 353918c..57cb4c3 100644
--- a/cobalt/tools/paths.py
+++ b/cobalt/tools/paths.py
@@ -17,7 +17,6 @@
 
 from os import path
 
-import _env  # pylint: disable=unused-import
 from starboard.tools import paths
 
 STARBOARD_ROOT = paths.STARBOARD_ROOT
diff --git a/cobalt/trace_event/scoped_trace_to_file.cc b/cobalt/trace_event/scoped_trace_to_file.cc
index d5d3d9d..ffbe948 100644
--- a/cobalt/trace_event/scoped_trace_to_file.cc
+++ b/cobalt/trace_event/scoped_trace_to_file.cc
@@ -28,12 +28,17 @@
 namespace cobalt {
 namespace trace_event {
 
+// static
+base::FilePath ScopedTraceToFile::filepath_to_absolute(
+    const base::FilePath& output_path_relative_to_logs) {
+  base::FilePath result;
+  base::PathService::Get(cobalt::paths::DIR_COBALT_DEBUG_OUT, &result);
+  return result.Append(output_path_relative_to_logs);
+}
+
 ScopedTraceToFile::ScopedTraceToFile(
     const base::FilePath& output_path_relative_to_logs) {
-  base::PathService::Get(cobalt::paths::DIR_COBALT_DEBUG_OUT,
-                         &absolute_output_path_);
-  absolute_output_path_ =
-      absolute_output_path_.Append(output_path_relative_to_logs);
+  absolute_output_path_ = filepath_to_absolute(output_path_relative_to_logs);
 
   DCHECK(!base::trace_event::TraceLog::GetInstance()->IsEnabled());
   base::trace_event::TraceLog::GetInstance()->SetEnabled(
diff --git a/cobalt/trace_event/scoped_trace_to_file.h b/cobalt/trace_event/scoped_trace_to_file.h
index 49c6413..d03216f 100644
--- a/cobalt/trace_event/scoped_trace_to_file.h
+++ b/cobalt/trace_event/scoped_trace_to_file.h
@@ -38,6 +38,10 @@
     return absolute_output_path_;
   }
 
+  // Returns absolute output path from relative filename
+  static base::FilePath filepath_to_absolute(
+      const base::FilePath& output_path_relative_to_logs);
+
  private:
   base::FilePath absolute_output_path_;
 };
diff --git a/cobalt/trace_event/trace_event.gyp b/cobalt/trace_event/trace_event.gyp
deleted file mode 100644
index bbb4ef7..0000000
--- a/cobalt/trace_event/trace_event.gyp
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    # Cobalt-specific support for dealing with Chromium's tracing system.
-    {
-      'target_name': 'trace_event',
-      'type': 'static_library',
-      'sources': [
-        'json_file_outputter.cc',
-        'json_file_outputter.h',
-        'scoped_trace_to_file.cc',
-        'scoped_trace_to_file.h',
-        'switches.cc',
-        'switches.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/ui_navigation/interface.cc b/cobalt/ui_navigation/interface.cc
index 326ae51..d833d7d 100644
--- a/cobalt/ui_navigation/interface.cc
+++ b/cobalt/ui_navigation/interface.cc
@@ -86,8 +86,6 @@
 
 NativeInterface InitializeInterface() {
   NativeInterface interface = {0};
-
-#if SB_API_VERSION >= 12
   SbUiNavInterface sb_ui_interface = {0};
   if (SbUiNavGetInterface(&sb_ui_interface)) {
     interface.create_item = sb_ui_interface.create_item;
@@ -114,7 +112,6 @@
 #endif
     return interface;
   }
-#endif
 
   interface.create_item = &CreateItem;
   interface.destroy_item = &DestroyItem;
diff --git a/cobalt/ui_navigation/interface.h b/cobalt/ui_navigation/interface.h
index c8b0d96..ec8b71b 100644
--- a/cobalt/ui_navigation/interface.h
+++ b/cobalt/ui_navigation/interface.h
@@ -21,8 +21,6 @@
 namespace cobalt {
 namespace ui_navigation {
 
-#if SB_API_VERSION >= 12
-
 // Alias the starboard interface. See starboard/ui_navigation.h for details.
 using NativeItem = SbUiNavItem;
 using NativeItemType = SbUiNavItemType;
@@ -34,39 +32,6 @@
 using NativeCallbacks = SbUiNavCallbacks;
 #define kNativeItemInvalid kSbUiNavItemInvalid
 
-#else
-
-// Mimic the starboard interface. See starboard/ui_navigation.h for details.
-typedef void* NativeItem;
-
-enum NativeItemType {
-  kNativeItemTypeFocus,
-  kNativeItemTypeContainer,
-};
-
-struct NativeItemDir {
-  bool is_left_to_right;
-  bool is_top_to_bottom;
-};
-
-struct NativeMatrix2x3 {
-  float m[6];
-};
-
-struct NativeMatrix4 {
-  float m[16];
-};
-
-struct NativeCallbacks {
-  void (*onblur)(NativeItem item, void* callback_context);
-  void (*onfocus)(NativeItem item, void* callback_context);
-  void (*onscroll)(NativeItem item, void* callback_context);
-};
-
-#define kNativeItemInvalid nullptr
-
-#endif  // SB_API_VERSION >= 12
-
 struct NativeInterface {
   NativeItem (*create_item)(NativeItemType type,
                             const NativeCallbacks* callbacks,
diff --git a/cobalt/ui_navigation/ui_navigation.gyp b/cobalt/ui_navigation/ui_navigation.gyp
deleted file mode 100644
index 25a993c..0000000
--- a/cobalt/ui_navigation/ui_navigation.gyp
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'ui_navigation',
-      'type': 'static_library',
-      'sources': [
-        'interface.cc',
-        'interface.h',
-        'nav_item.cc',
-        'nav_item.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-      ],
-    },
-  ],
-}
diff --git a/cobalt/updater/BUILD.gn b/cobalt/updater/BUILD.gn
index 83f69c1..b78223e 100644
--- a/cobalt/updater/BUILD.gn
+++ b/cobalt/updater/BUILD.gn
@@ -49,6 +49,7 @@
     "//starboard/common",
     "//starboard/loader_app:app_key_files",
     "//starboard/loader_app:drain_file",
+    "//third_party/lz4_lib:lz4",
     "//third_party/zlib:zip",
     "//url",
   ]
@@ -85,3 +86,15 @@
   sources = [ "noop_sandbox.cc" ]
   deps = [ "//starboard" ]
 }
+
+target(final_executable_type, "one_app_only_sandbox") {
+  sources = [ "one_app_only_sandbox.cc" ]
+  deps = [
+    "//cobalt/base",
+    "//cobalt/browser",
+    "//cobalt/browser:browser_switches",
+    "//net",
+    "//starboard",
+    "//starboard/loader_app:app_key",
+  ]
+}
diff --git a/cobalt/updater/configurator.cc b/cobalt/updater/configurator.cc
index e823bbf..2e0f98c 100644
--- a/cobalt/updater/configurator.cc
+++ b/cobalt/updater/configurator.cc
@@ -45,6 +45,11 @@
   return prop;
 }
 
+bool CompressUpdate() {
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      cobalt::browser::switches::kCompressUpdate);
+}
+
 }  // namespace
 
 namespace cobalt {
@@ -55,7 +60,7 @@
       persisted_data_(std::make_unique<update_client::PersistedData>(
           pref_service_.get(), nullptr)),
       is_channel_changed_(0),
-      unzip_factory_(base::MakeRefCounted<UnzipperFactory>()),
+      unzip_factory_(base::MakeRefCounted<UnzipperFactory>(CompressUpdate())),
       network_fetcher_factory_(
           base::MakeRefCounted<NetworkFetcherFactoryCobalt>(network_module)),
       patch_factory_(base::MakeRefCounted<PatcherFactory>()) {
diff --git a/cobalt/updater/configurator.h b/cobalt/updater/configurator.h
index b7ed9e7..54bb6c0 100644
--- a/cobalt/updater/configurator.h
+++ b/cobalt/updater/configurator.h
@@ -115,7 +115,7 @@
   std::string previous_updater_status_;
   base::Lock previous_updater_status_lock_;
   std::string user_agent_string_;
-  uint64_t min_free_space_bytes_ = 64 * 1024 * 1024;
+  uint64_t min_free_space_bytes_ = 48 * 1024 * 1024;
   base::Lock min_free_space_bytes_lock_;
 
   DISALLOW_COPY_AND_ASSIGN(Configurator);
diff --git a/cobalt/updater/one_app_only_sandbox.gyp b/cobalt/updater/one_app_only_sandbox.gyp
deleted file mode 100644
index 0d99d26..0000000
--- a/cobalt/updater/one_app_only_sandbox.gyp
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the 'License');
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an 'AS IS' BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'one_app_only_sandbox',
-      'type': '<(final_executable_type)',
-      'dependencies': [
-        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/starboard/loader_app/app_key.gyp:app_key',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'sources': [
-        'one_app_only_sandbox.cc',
-      ],
-    },
-    {
-      'target_name': 'one_app_only_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'one_app_only_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'one_app_only_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ]
-}
diff --git a/cobalt/updater/unzipper.cc b/cobalt/updater/unzipper.cc
index 1855b3a..64c837f 100644
--- a/cobalt/updater/unzipper.cc
+++ b/cobalt/updater/unzipper.cc
@@ -15,22 +15,224 @@
 #include "cobalt/updater/unzipper.h"
 
 #include <utility>
+#include <vector>
+
+#include "base/bind.h"
 #include "base/callback.h"
+#include "base/files/file.h"
 #include "base/files/file_path.h"
+#include "starboard/event.h"
+#include "starboard/memory.h"
+#include "starboard/system.h"
 #include "starboard/time.h"
+#include "third_party/lz4_lib/lz4frame.h"
 #include "third_party/zlib/google/zip.h"
+#include "third_party/zlib/google/zip_reader.h"
 
 namespace cobalt {
 namespace updater {
 
 namespace {
 
+constexpr size_t kChunkSize = 8 * 1024;
+constexpr LZ4F_preferences_t kPrefs = {
+    {LZ4F_max256KB, LZ4F_blockLinked, LZ4F_noContentChecksum, LZ4F_frame,
+     0 /* unknown content size */, 0 /* no dictID */, LZ4F_noBlockChecksum},
+    0,
+    /* compression level; 0 == default */ 0,
+    /* autoflush */ 0,
+    /* favor decompression speed */ {0, 0, 0},
+    /* reserved, must be set to 0 */};
+
+class LZ4WriterDelegate : public zip::WriterDelegate {
+ public:
+  explicit LZ4WriterDelegate(const base::FilePath& output_file_path)
+      : output_file_path_(output_file_path) {}
+
+  bool PrepareOutput() override {
+    if (!base::CreateDirectory(output_file_path_.DirName())) {
+      return false;
+    }
+
+    output_file_path_ = output_file_path_.ReplaceExtension("lz4");
+
+    LOG(INFO) << "LZ4WriterDelegate::PrepareOutput: output_file_path_="
+              << output_file_path_.value();
+    file_.Initialize(output_file_path_,
+                     base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+    if (!file_.IsValid()) {
+      LOG(ERROR) << "LZ4WriterDelegate::PrepareOutput: invalid file"
+                 << output_file_path_.value();
+      return false;
+    }
+
+    LZ4F_errorCode_t res = LZ4F_createCompressionContext(&ctx_, LZ4F_VERSION);
+    if (LZ4F_isError(res)) {
+      LOG(ERROR) << "LZ4WriterDelegate::PrepareOutput: lz4 error code= " << res;
+      return false;
+    }
+
+    out_capacity_ = LZ4F_compressBound(kChunkSize, &kPrefs);
+    LOG(INFO) << "out_capacity=" << out_capacity_;
+    out_buffer_.resize(out_capacity_);
+    if (!WriteHeader()) {
+      LOG(ERROR) << "LZ4WriterDelegate::PrepareOutput: Failed to write header";
+      return false;
+    }
+    return true;
+  }
+
+  bool WriteBytes(const char* data, int num_bytes) override {
+    LOG(INFO) << "LZ4WriterDelegate::WriteBytes: num_bytes=" << num_bytes
+              << " out_capacity=" << out_capacity_;
+    size_t compressed_size = LZ4F_compressUpdate(
+        ctx_, out_buffer_.data(), out_buffer_.size(), data, num_bytes, nullptr);
+    if (LZ4F_isError(compressed_size)) {
+      LOG(ERROR) << "LZ4WriterDelegate::WriteBytes: Compression failed: error "
+                 << (unsigned)compressed_size;
+      return false;
+    }
+
+    LOG(INFO) << "LZ4WriterDelegate::WriteBytes: Writing "
+              << (unsigned)compressed_size << " bytes "
+              << "(if zero, input data just buffered to LZ4 internal buffer)";
+    if (compressed_size !=
+        file_.WriteAtCurrentPos(out_buffer_.data(), compressed_size)) {
+      LOG(ERROR) << "LZ4WriterDelegate::WriteBytes: failed to write "
+                 << compressed_size << " bytes";
+      return false;
+    }
+    return true;
+  }
+
+  void SetTimeModified(const base::Time& time) override {
+    size_t compressed_size =
+        LZ4F_compressEnd(ctx_, out_buffer_.data(), out_buffer_.size(), nullptr);
+    if (LZ4F_isError(compressed_size)) {
+      LOG(ERROR) << "LZ4WriterDelegate::SetTimeModified: Failed to end "
+                    "compression: error "
+                 << (unsigned)compressed_size;
+      return;
+    }
+
+    LOG(INFO) << "Writing " << (unsigned)compressed_size << " bytes";
+
+    if (compressed_size !=
+        file_.WriteAtCurrentPos(out_buffer_.data(), compressed_size)) {
+      LOG(ERROR) << "LZ4WriterDelegate::SetTimeModified: failed to write "
+                 << compressed_size << " bytes";
+      return;
+    }
+
+    success_ = true;
+  }
+
+  bool IsSuccessful() override { return success_; }
+
+  ~LZ4WriterDelegate() {
+    if (ctx_) {
+      LZ4F_freeCompressionContext(ctx_);
+    }
+    file_.Close();
+  }
+
+ private:
+  bool WriteHeader() {
+    size_t header_size = LZ4F_compressBegin(ctx_, out_buffer_.data(),
+                                            out_buffer_.size(), &kPrefs);
+    if (LZ4F_isError(header_size)) {
+      LOG(ERROR) << "Failed to start compression: error "
+                 << (unsigned)header_size;
+      return false;
+    }
+    LOG(INFO) << "Header size " << (unsigned)header_size;
+    return header_size ==
+           file_.WriteAtCurrentPos(out_buffer_.data(), header_size);
+  }
+
+  base::FilePath output_file_path_;
+  base::File file_;
+  LZ4F_compressionContext_t ctx_ = nullptr;
+  std::vector<char> out_buffer_;
+  size_t out_capacity_ = 64 * 1024;
+  bool success_ = false;
+};
+
 class UnzipperImpl : public update_client::Unzipper {
  public:
-  UnzipperImpl() = default;
+  explicit UnzipperImpl(bool updater_compression)
+      : compress_update_(updater_compression) {}
 
   void Unzip(const base::FilePath& zip_path, const base::FilePath& output_path,
              UnzipCompleteCallback callback) override {
+    if (compress_update_) {
+      UnzipAndLZ4Compress(zip_path, output_path, std::move(callback));
+    } else {
+      UnzipToPath(zip_path, output_path, std::move(callback));
+    }
+  }
+
+  void UnzipAndLZ4Compress(const base::FilePath& zip_path,
+                           const base::FilePath& output_path,
+                           UnzipCompleteCallback callback) {
+    SbTimeMonotonic time_before_unzip = SbTimeGetMonotonicNow();
+
+    // Filter to unzip just libcobalt.so
+    auto filter = base::BindRepeating([](const base::FilePath& path) {
+      return (path.BaseName().value() == "libcobalt.so");
+    });
+    auto directory_creator = base::BindRepeating(
+        [](const base::FilePath& extract_dir,
+           const base::FilePath& entry_path) {
+          return base::CreateDirectory(extract_dir.Append(entry_path));
+        },
+        output_path);
+    auto writer_factory = base::BindRepeating(
+        [](const base::FilePath& extract_dir, const base::FilePath& entry_path)
+            -> std::unique_ptr<zip::WriterDelegate> {
+          return std::make_unique<LZ4WriterDelegate>(
+              extract_dir.Append(entry_path));
+        },
+        output_path);
+
+    if (!zip::UnzipWithFilterAndWriters(zip_path, writer_factory,
+                                        directory_creator, filter, true)) {
+      LOG(ERROR) << "Failed to unzip libcobalt.so";
+      std::move(callback).Run(false);
+      return;
+    } else {
+      LOG(INFO) << "Successfully unzipped and lz4 compressed libcobalt.so";
+    }
+
+    // Filter to unzip the rest of the CRX package.
+    filter = base::BindRepeating([](const base::FilePath& path) {
+      if (path.BaseName().value() == "libcobalt.so") {
+        return false;
+      }
+      return true;
+    });
+
+    if (!zip::UnzipWithFilterCallback(zip_path, output_path, filter, true)) {
+      LOG(ERROR) << "Failed to unzip the CRX package";
+      std::move(callback).Run(false);
+      return;
+    } else {
+      LOG(INFO) << "Successfully unzipped the CRX package";
+    }
+
+    std::move(callback).Run(true);
+
+    SbTimeMonotonic time_unzip_took =
+        SbTimeGetMonotonicNow() - time_before_unzip;
+    LOG(INFO) << "Unzip file path = " << zip_path;
+    LOG(INFO) << "output_path = " << output_path;
+    LOG(INFO) << "Unzip took " << time_unzip_took / kSbTimeMillisecond
+              << " milliseconds.";
+  }
+
+  void UnzipToPath(const base::FilePath& zip_path,
+                   const base::FilePath& output_path,
+                   UnzipCompleteCallback callback) {
     SbTimeMonotonic time_before_unzip = SbTimeGetMonotonicNow();
     std::move(callback).Run(zip::Unzip(zip_path, output_path));
     SbTimeMonotonic time_unzip_took =
@@ -40,14 +242,18 @@
     LOG(INFO) << "Unzip took " << time_unzip_took / kSbTimeMillisecond
               << " milliseconds.";
   }
+
+ private:
+  bool compress_update_ = false;
 };
 
 }  // namespace
 
-UnzipperFactory::UnzipperFactory() = default;
+UnzipperFactory::UnzipperFactory(bool compress_update)
+    : compress_update_(compress_update) {}
 
 std::unique_ptr<update_client::Unzipper> UnzipperFactory::Create() const {
-  return std::make_unique<UnzipperImpl>();
+  return std::make_unique<UnzipperImpl>(compress_update_);
 }
 
 UnzipperFactory::~UnzipperFactory() = default;
diff --git a/cobalt/updater/unzipper.h b/cobalt/updater/unzipper.h
index 46dfb7e..df9ecf5 100644
--- a/cobalt/updater/unzipper.h
+++ b/cobalt/updater/unzipper.h
@@ -1,6 +1,16 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 
 #ifndef COBALT_UPDATER_UNZIPPER_H_
 #define COBALT_UPDATER_UNZIPPER_H_
@@ -16,7 +26,7 @@
 
 class UnzipperFactory : public update_client::UnzipperFactory {
  public:
-  UnzipperFactory();
+  explicit UnzipperFactory(bool compress_update);
 
   std::unique_ptr<update_client::Unzipper> Create() const override;
 
@@ -24,6 +34,7 @@
   ~UnzipperFactory() override;
 
  private:
+  bool compress_update_;
   DISALLOW_COPY_AND_ASSIGN(UnzipperFactory);
 };
 
diff --git a/cobalt/updater/updater.gyp b/cobalt/updater/updater.gyp
deleted file mode 100644
index e603703..0000000
--- a/cobalt/updater/updater.gyp
+++ /dev/null
@@ -1,122 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the 'License');
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an 'AS IS' BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'updater',
-      'type': 'static_library',
-      'sources': [
-        'configurator.cc',
-        'configurator.h',
-        'network_fetcher.cc',
-        'network_fetcher.h',
-        'patcher.cc',
-        'patcher.h',
-        'prefs.cc',
-        'prefs.h',
-        'unzipper.cc',
-        'unzipper.h',
-        'updater_module.cc',
-        'updater_module.h',
-        'updater_constants.cc',
-        'updater_constants.h',
-        'utils.cc',
-        'utils.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-        '<(DEPTH)/cobalt/script/script.gyp:script',
-        '<(DEPTH)/components/prefs/prefs.gyp:prefs',
-        '<(DEPTH)/components/update_client/update_client.gyp:update_client',
-        '<(DEPTH)/starboard/loader_app/app_key_files.gyp:app_key_files',
-        '<(DEPTH)/starboard/loader_app/drain_file.gyp:drain_file',
-        '<(DEPTH)/third_party/zlib/zlib.gyp:zip',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-    },
-    {
-      'target_name': 'updater_sandbox',
-      'type': '<(final_executable_type)',
-      'dependencies': [
-        'updater',
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/debug/debug.gyp:console_command_manager',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'sources': [
-        'updater_sandbox.cc',
-        'updater.cc',
-        'updater.h',
-      ],
-    },
-    {
-      'target_name': 'updater_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'updater_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'updater_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      'target_name': 'crash_sandbox',
-      'type': '<(final_executable_type)',
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'sources': [
-        'crash_sandbox.cc',
-      ],
-    },
-    {
-      'target_name': 'crash_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'crash_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'crash_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      'target_name': 'noop_sandbox',
-      'type': '<(final_executable_type)',
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'sources': [
-        'noop_sandbox.cc',
-      ],
-    },
-    {
-      'target_name': 'noop_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'noop_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'noop_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ]
-}
diff --git a/cobalt/updater/updater_module.cc b/cobalt/updater/updater_module.cc
index a9f9e6c..dfbb14b 100644
--- a/cobalt/updater/updater_module.cc
+++ b/cobalt/updater/updater_module.cc
@@ -37,6 +37,7 @@
 #include "cobalt/updater/crash_reporter.h"
 #include "cobalt/updater/utils.h"
 #include "components/crx_file/crx_verifier.h"
+#include "components/update_client/cobalt_slot_management.h"
 #include "components/update_client/utils.h"
 #include "starboard/common/file.h"
 #include "starboard/configuration_constants.h"
@@ -44,6 +45,7 @@
 namespace {
 
 using update_client::ComponentState;
+using update_client::CobaltSlotManagement;
 
 // The SHA256 hash of the "cobalt_evergreen_public" key.
 constexpr uint8_t kCobaltPublicKeyHash[] = {
@@ -92,7 +94,8 @@
 namespace cobalt {
 namespace updater {
 
-const uint64_t kDefaultUpdateCheckDelaySeconds = 60;
+// The delay in seconds before the first update check.
+const uint64_t kDefaultUpdateCheckDelaySeconds = 15;
 
 void Observer::OnEvent(Events event, const std::string& id) {
   LOG(INFO) << "Observer::OnEvent id=" << id;
@@ -220,6 +223,17 @@
   }
 
   updater_configurator_ = nullptr;
+
+  // Cleanup drain files
+  const auto installation_manager =
+      static_cast<const CobaltExtensionInstallationManagerApi*>(
+          SbSystemGetExtension(kCobaltExtensionInstallationManagerName));
+  if (installation_manager) {
+    CobaltSlotManagement cobalt_slot_management;
+    if (cobalt_slot_management.Init(installation_manager)) {
+      cobalt_slot_management.CleanupAllDrainFiles();
+    }
+  }
   LOG(INFO) << "UpdaterModule::Finalize end";
 }
 
diff --git a/cobalt/updater/utils.cc b/cobalt/updater/utils.cc
index e5f2f2c..6c9cb3e 100644
--- a/cobalt/updater/utils.cc
+++ b/cobalt/updater/utils.cc
@@ -62,20 +62,12 @@
 #endif
 
   std::vector<char> storage_dir(kSbFileMaxPath);
-#if SB_API_VERSION >= 12
   if (!SbSystemGetPath(kSbSystemPathStorageDirectory, storage_dir.data(),
                        kSbFileMaxPath)) {
     LOG(ERROR) << "GetProductDirectoryPath: Failed to get "
                   "kSbSystemPathStorageDirectory";
     return false;
   }
-#else
-  SB_NOTREACHED() << "GetProductDirectoryPath: kSbSystemPathStorageDirectory "
-                     "is not available before "
-                     "starboard version 12";
-  return false;
-
-#endif
   base::FilePath app_data_dir(storage_dir.data());
   const auto product_data_dir =
       app_data_dir.AppendASCII(PRODUCT_FULLNAME_STRING);
diff --git a/cobalt/watchdog/BUILD.gn b/cobalt/watchdog/BUILD.gn
new file mode 100644
index 0000000..e560f78
--- /dev/null
+++ b/cobalt/watchdog/BUILD.gn
@@ -0,0 +1,22 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+static_library("watchdog") {
+  sources = [
+    "watchdog.cc",
+    "watchdog.h",
+  ]
+
+  deps = [ "//starboard/common" ]
+}
diff --git a/cobalt/watchdog/README.md b/cobalt/watchdog/README.md
new file mode 100644
index 0000000..7e250ba
--- /dev/null
+++ b/cobalt/watchdog/README.md
@@ -0,0 +1,44 @@
+# Watchdog
+
+Watchdog is Cobalt's monitoring service used to detect non-responsive events
+and trigger crashes. Similar to Android's ANRs.
+
+Watchdog behaves as a singleton which provides global access to the one
+instance of the class. The one Watchdog instance is created and deleted by
+Application which not only manages Watchdog's lifecycle, but also updates
+Watchdog's state.
+
+Watchdog works by maintaining a dictionary of registered Clients with various
+metadata including timestamps of when the Client last pinged Watchdog. Watchdog
+then has a separate thread that monitors these registered Clients by
+periodically checking if their last pinged timestamps exceed a time constraint.
+The goal is to have Watchdog as minimal as possible while effectively detecting
+non-responsive events. To that end, components to be monitored are themselves
+responsible for registering, pinging, and unregistering themselves by calling
+Watchdog functions.
+
+
+## Quick Guide to Implementing Watchdog
+
+### I. Periodic Behavior / Internal
+
+To implement periodic behavior monitoring, simply call Register() before the
+periodic behavior begins, Ping() during the periodic behavior, and Unregister()
+after the periodic behavior. Register() parameters should be adjusted
+accordingly with the time_interval often a few orders of magnitude greater than
+expected.
+
+If there is no simple place to call Register() before the period behavior
+begins, it is possible to call Register() in place of calling Ping() and to
+simply adjust the replace parameter accordingly.
+
+Watchdog implementations assume that Application has already created the one
+Watchdog instance, but implementations often expect the possibility of a
+nullptr in which case no action is taken. This is because various unit and
+black box tests do not start Cobalt with normal usage patterns.
+
+### II. Liveness check / External
+
+To implement liveness check behavior monitoring, a Javascript adapter layer
+will need to be implemented that handles the periodic pinging and callbacks
+required.
diff --git a/cobalt/watchdog/singleton.h b/cobalt/watchdog/singleton.h
new file mode 100644
index 0000000..f6008eb
--- /dev/null
+++ b/cobalt/watchdog/singleton.h
@@ -0,0 +1,82 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// A singleton that can be created and deleted which provides global access to
+// the one instance of the class.
+
+#ifndef COBALT_WATCHDOG_SINGLETON_H_
+#define COBALT_WATCHDOG_SINGLETON_H_
+
+#include "starboard/once.h"
+
+namespace cobalt {
+namespace watchdog {
+
+// Singleton helper class.
+template <typename Type>
+class Singleton {
+ protected:
+  Singleton() {}
+  static Type* s_singleton;
+
+ public:
+  // This helper class assumes that Type has a function
+  // "bool Initialize();" that returns false when
+  // initialization fails and a function "void Uninitialize();".
+
+  static Type* CreateInstance() {
+    static SbOnceControl s_once_flag = SB_ONCE_INITIALIZER;
+    struct Local {
+      static void Init() {
+        Type* singleton = new Type();
+        if (singleton && singleton->Type::Initialize()) s_singleton = singleton;
+      }
+    };
+    SbOnce(&s_once_flag, Local::Init);
+    return s_singleton;
+  }
+
+  static Type* CreateStubInstance() {
+    static SbOnceControl s_once_flag = SB_ONCE_INITIALIZER;
+    struct Local {
+      static void Init() {
+        Type* singleton = new Type();
+        if (singleton && singleton->Type::InitializeStub())
+          s_singleton = singleton;
+      }
+    };
+    SbOnce(&s_once_flag, Local::Init);
+    return s_singleton;
+  }
+
+  static Type* GetInstance() { return s_singleton; }
+
+  static void DeleteInstance() {
+    s_singleton->Type::Uninitialize();
+    delete s_singleton;
+    s_singleton = nullptr;
+  }
+
+  // Prevent copying and moving.
+  Singleton(Singleton const&) = delete;
+  Singleton& operator=(const Singleton&) = delete;
+};
+
+template <typename Type>
+Type* Singleton<Type>::s_singleton = nullptr;
+
+}  // namespace watchdog
+}  // namespace cobalt
+
+#endif  // COBALT_WATCHDOG_SINGLETON_H_
diff --git a/cobalt/watchdog/watchdog.cc b/cobalt/watchdog/watchdog.cc
new file mode 100644
index 0000000..f63558c
--- /dev/null
+++ b/cobalt/watchdog/watchdog.cc
@@ -0,0 +1,393 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <algorithm>
+#include <sstream>
+#include <utility>
+#include <vector>
+
+#include "cobalt/watchdog/watchdog.h"
+#include "starboard/common/file.h"
+#include "starboard/common/log.h"
+#include "starboard/configuration_constants.h"
+
+namespace cobalt {
+namespace watchdog {
+
+namespace {
+
+// The Watchdog violations json file names.
+const char kWatchdogCurrentViolationsJson[] = "watchdog.json";
+const char kWatchdogPreviousViolationsJson[] = "watchdog_old.json";
+// The default number of microseconds between each monitor loop.
+const int64_t kWatchdogSmallestTimeInterval = 1000000;
+// The maximum number of repeated Watchdog violations. Prevents excessive
+// Watchdog violation updates.
+const int64_t kWatchdogMaxViolations = 100;
+// The maximum number of most recent ping infos to store.
+const int64_t kWatchdogMaxPingInfos = 100;
+
+}  // namespace
+
+bool Watchdog::Initialize() {
+  SB_CHECK(SbMutexCreate(&mutex_));
+  smallest_time_interval_ = kWatchdogSmallestTimeInterval;
+
+  // Starts monitor thread.
+  is_monitoring_ = true;
+  SB_DCHECK(!SbThreadIsValid(watchdog_thread_));
+  watchdog_thread_ = SbThreadCreate(0, kSbThreadNoPriority, kSbThreadNoAffinity,
+                                    true, "Watchdog", &Watchdog::Monitor, this);
+  SB_DCHECK(SbThreadIsValid(watchdog_thread_));
+  return true;
+}
+
+bool Watchdog::InitializeStub() {
+  is_stub_ = true;
+  return true;
+}
+
+void Watchdog::Uninitialize() {
+  SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+  is_monitoring_ = false;
+  SB_CHECK(SbMutexRelease(&mutex_));
+  SbThreadJoin(watchdog_thread_, nullptr);
+}
+
+std::string Watchdog::GetWatchdogFilePaths(bool current) {
+  // Gets the current Watchdog violations file path or the previous Watchdog
+  // violations file path.
+  if (watchdog_file_ == "") {
+    // Sets Watchdog violations file paths.
+    std::vector<char> cache_dir(kSbFileMaxPath + 1, 0);
+    SbSystemGetPath(kSbSystemPathCacheDirectory, cache_dir.data(),
+                    kSbFileMaxPath);
+    watchdog_file_ = std::string(cache_dir.data()) + kSbFileSepString +
+                     std::string(kWatchdogCurrentViolationsJson);
+    SB_LOG(INFO) << "Current Watchdog violations file path: " << watchdog_file_;
+    watchdog_old_file_ = std::string(cache_dir.data()) + kSbFileSepString +
+                         std::string(kWatchdogPreviousViolationsJson);
+    SB_LOG(INFO) << "Previous Watchdog violations file path: "
+                 << watchdog_old_file_;
+    PreservePreviousWatchdogViolations();
+  }
+  if (current) return watchdog_file_;
+  return watchdog_old_file_;
+}
+
+void Watchdog::PreservePreviousWatchdogViolations() {
+  // Copies the previous Watchdog violations file containing violations since
+  // last app start, if it exists, to preserve it.
+  starboard::ScopedFile read_file(watchdog_file_.c_str(),
+                                  kSbFileOpenOnly | kSbFileRead);
+  if (read_file.IsValid()) {
+    int64_t kFileSize = read_file.GetSize();
+    std::string watchdog_content(kFileSize, '\0');
+    read_file.ReadAll(&watchdog_content[0], kFileSize);
+    starboard::ScopedFile write_file(watchdog_old_file_.c_str(),
+                                     kSbFileCreateAlways | kSbFileWrite);
+    write_file.WriteAll(&watchdog_content[0], kFileSize);
+    starboard::SbFileDeleteRecursive(watchdog_file_.c_str(), true);
+  }
+}
+
+void Watchdog::UpdateState(base::ApplicationState state) {
+  SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+  state_ = state;
+  SB_CHECK(SbMutexRelease(&mutex_));
+}
+
+void* Watchdog::Monitor(void* context) {
+  while (1) {
+    SB_CHECK(SbMutexAcquire(&(static_cast<Watchdog*>(context))->mutex_) ==
+             kSbMutexAcquired);
+
+    if (!((static_cast<Watchdog*>(context))->is_monitoring_)) {
+      SB_CHECK(SbMutexRelease(&(static_cast<Watchdog*>(context))->mutex_));
+      break;
+    }
+
+    int64_t current_time = SbTimeToPosix(SbTimeGetNow());
+    SbTimeMonotonic current_monotonic_time = SbTimeGetMonotonicNow();
+    std::string serialized_watchdog_index = "";
+
+    // Iterates through Watchdog index to monitor all registered clients.
+    bool new_watchdog_violation = false;
+    for (auto& it : static_cast<Watchdog*>(context)->watchdog_index_) {
+      // Ignores and resets clients in idle states.
+      if (static_cast<Watchdog*>(context)->state_ > it.second->monitor_state) {
+        it.second->time_registered_monotonic_microseconds =
+            current_monotonic_time;
+        it.second->time_last_pinged_microseconds = current_monotonic_time;
+        continue;
+      }
+
+      SbTimeMonotonic time_delta =
+          current_monotonic_time - it.second->time_last_pinged_microseconds;
+      SbTimeMonotonic time_wait =
+          current_monotonic_time -
+          it.second->time_registered_monotonic_microseconds;
+
+      // Watchdog violation
+      if (time_delta > it.second->time_interval_microseconds &&
+          time_wait > it.second->time_wait_microseconds) {
+        // Reset time last pinged.
+        it.second->time_last_pinged_microseconds = current_monotonic_time;
+        // Get serialized Watchdog index.
+        if (serialized_watchdog_index == "") {
+          serialized_watchdog_index =
+              static_cast<Watchdog*>(context)->GetSerializedWatchdogIndex();
+        }
+
+        // Updates Watchdog violations.
+        auto iter = (static_cast<Watchdog*>(context)->watchdog_violations_)
+                        .find(it.second->name);
+        bool already_violated =
+            iter !=
+            (static_cast<Watchdog*>(context)->watchdog_violations_).end();
+
+        if (already_violated) {
+          // Prevents excessive Watchdog violation updates.
+          if (iter->second->violation_count <= kWatchdogMaxViolations)
+            new_watchdog_violation = true;
+          iter->second->ping_infos = it.second->ping_infos;
+          iter->second->violation_time_microseconds = current_time;
+          iter->second->violation_delta_microseconds = time_delta;
+          iter->second->violation_count++;
+          iter->second->serialized_watchdog_index = serialized_watchdog_index;
+        } else {
+          new_watchdog_violation = true;
+          std::unique_ptr<Violation> violation(new Violation);
+          *violation = *(it.second);
+          violation->violation_time_microseconds = current_time;
+          violation->violation_delta_microseconds = time_delta;
+          violation->violation_count = 1;
+          violation->serialized_watchdog_index = serialized_watchdog_index;
+          (static_cast<Watchdog*>(context)->watchdog_violations_)
+              .emplace(violation->name, std::move(violation));
+        }
+      }
+    }
+    if (new_watchdog_violation) SerializeWatchdogViolations(context);
+
+    SB_CHECK(SbMutexRelease(&(static_cast<Watchdog*>(context))->mutex_));
+    SbThreadSleep(static_cast<Watchdog*>(context)->smallest_time_interval_);
+  }
+  return nullptr;
+}
+
+std::string Watchdog::GetSerializedWatchdogIndex() {
+  // Gets the current list of registered clients from the Watchdog index and
+  // returns it as a serialized json string.
+
+  // Watchdog stub
+  if (is_stub_) return "";
+
+  std::string serialized_watchdog_index = "[";
+  std::string comma = "";
+  for (auto& it : watchdog_index_) {
+    serialized_watchdog_index += (comma + "\"" + it.first + "\"");
+    comma = ", ";
+  }
+  serialized_watchdog_index += "]";
+  return serialized_watchdog_index;
+}
+
+void Watchdog::SerializeWatchdogViolations(void* context) {
+  // Writes current Watchdog violations to persistent storage as a json file.
+  std::string watchdog_json = "{\n  \"watchdog_violations\": [\n";
+  std::string comma = "";
+  for (auto& it : static_cast<Watchdog*>(context)->watchdog_violations_) {
+    std::string ping_infos = "[";
+    std::string inner_comma = "";
+    while (it.second->ping_infos.size() > 0) {
+      ping_infos += (inner_comma + "\"" + it.second->ping_infos.front() + "\"");
+      it.second->ping_infos.pop();
+      inner_comma = ", ";
+    }
+    ping_infos += "]";
+
+    std::ostringstream ss;
+    ss << comma << "    {\n"
+       << "      \"name\": \"" << it.second->name << "\",\n"
+       << "      \"description\": \"" << it.second->description << "\",\n"
+       << "      \"ping_infos\": " << ping_infos << ",\n"
+       << "      \"monitor_state\": \""
+       << std::string(GetApplicationStateString(it.second->monitor_state))
+       << "\",\n"
+       << "      \"time_interval_microseconds\": "
+       << it.second->time_interval_microseconds << ",\n"
+       << "      \"time_wait_microseconds\": "
+       << it.second->time_wait_microseconds << ",\n"
+       << "      \"time_registered_microseconds\": "
+       << it.second->time_registered_microseconds << ",\n"
+       << "      \"violation_time_microseconds\": "
+       << it.second->violation_time_microseconds << ",\n"
+       << "      \"violation_delta_microseconds\": "
+       << it.second->violation_delta_microseconds << ",\n"
+       << "      \"violation_count\": " << it.second->violation_count << ",\n"
+       << "      \"watchdog_index\": " << it.second->serialized_watchdog_index
+       << "\n"
+       << "    }";
+    watchdog_json += ss.str();
+    comma = ",\n";
+  }
+  watchdog_json += "\n  ]\n}";
+
+  SB_LOG(INFO) << "Writing Watchdog violations to: "
+               << static_cast<Watchdog*>(context)->GetWatchdogFilePaths(true);
+  SB_LOG(INFO) << watchdog_json;
+
+  starboard::ScopedFile watchdog_file(
+      (static_cast<Watchdog*>(context)->GetWatchdogFilePaths(true)).c_str(),
+      kSbFileCreateAlways | kSbFileWrite);
+  watchdog_file.WriteAll(watchdog_json.c_str(),
+                         static_cast<int>(watchdog_json.size()));
+}
+
+bool Watchdog::Register(std::string name, base::ApplicationState monitor_state,
+                        int64_t time_interval, int64_t time_wait,
+                        Replace replace) {
+  return Register(name, name, monitor_state, time_interval, time_wait, replace);
+}
+
+bool Watchdog::Register(std::string name, std::string description,
+                        base::ApplicationState monitor_state,
+                        int64_t time_interval, int64_t time_wait,
+                        Replace replace) {
+  // Watchdog stub
+  if (is_stub_) return true;
+
+  SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+
+  // If replace is PING or ALL, handles already registered cases.
+  if (replace != NONE) {
+    auto it = watchdog_index_.find(name);
+    bool already_registered = it != watchdog_index_.end();
+
+    if (already_registered) {
+      if (replace == PING) {
+        it->second->time_last_pinged_microseconds = SbTimeGetMonotonicNow();
+        SB_CHECK(SbMutexRelease(&mutex_));
+        return true;
+      }
+      if (replace == ALL) Unregister(name, false);
+    }
+  }
+
+  // Creates new Client.
+  std::unique_ptr<Client> client(new Client);
+  client->name = name;
+  client->description = description;
+  client->ping_infos = std::queue<std::string>();
+  client->monitor_state = monitor_state;
+  client->time_interval_microseconds = time_interval;
+  client->time_wait_microseconds = time_wait;
+  client->time_registered_microseconds = SbTimeToPosix(SbTimeGetNow());
+  client->time_registered_monotonic_microseconds = SbTimeGetMonotonicNow();
+  client->time_last_pinged_microseconds =
+      client->time_registered_monotonic_microseconds;
+
+  // Registers.
+  auto result = watchdog_index_.emplace(name, std::move(client));
+  // Checks for new smallest_time_interval_.
+  smallest_time_interval_ = std::min(smallest_time_interval_, time_interval);
+
+  SB_CHECK(SbMutexRelease(&mutex_));
+
+  if (result.second) {
+    SB_DLOG(INFO) << "Watchdog Registered: " << name;
+  } else {
+    SB_DLOG(ERROR) << "Watchdog Unable to Register: " << name;
+  }
+  return result.second;
+}
+
+bool Watchdog::Unregister(const std::string& name, bool lock) {
+  // Watchdog stub
+  if (is_stub_) return true;
+
+  if (lock) SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+  // Unregisters.
+  auto result = watchdog_index_.erase(name);
+  // Sets new smallest_time_interval_.
+  smallest_time_interval_ = kWatchdogSmallestTimeInterval;
+  for (auto& it : watchdog_index_) {
+    smallest_time_interval_ = std::min(smallest_time_interval_,
+                                       it.second->time_interval_microseconds);
+  }
+  if (lock) SB_CHECK(SbMutexRelease(&mutex_));
+
+  if (result) {
+    SB_DLOG(INFO) << "Watchdog Unregistered: " << name;
+  } else {
+    SB_DLOG(ERROR) << "Watchdog Unable to Unregister: " << name;
+  }
+  return result;
+}
+
+bool Watchdog::Ping(const std::string& name) { return Ping(name, ""); }
+
+bool Watchdog::Ping(const std::string& name, const std::string& info) {
+  // Watchdog stub
+  if (is_stub_) return true;
+
+  SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+  auto it = watchdog_index_.find(name);
+  bool client_exists = it != watchdog_index_.end();
+
+  if (client_exists) {
+    // Updates last ping.
+    it->second->time_last_pinged_microseconds = SbTimeGetMonotonicNow();
+    if (info != "") {
+      int64_t current_time = SbTimeToPosix(SbTimeGetNow());
+      it->second->ping_infos.push(std::to_string(current_time) + "\n" + info +
+                                  "\n");
+      if (it->second->ping_infos.size() > kWatchdogMaxPingInfos)
+        it->second->ping_infos.pop();
+    }
+  } else {
+    SB_DLOG(ERROR) << "Watchdog Unable to Ping: " << name;
+  }
+  SB_CHECK(SbMutexRelease(&mutex_));
+  return client_exists;
+}
+
+std::string Watchdog::GetWatchdogViolations(bool current) {
+  // Gets the current Watchdog violations file representing ongoing violations
+  // or gets the previous Watchdog violations file containing violations from
+  // previous app starts and since the last call (up to a limit).
+
+  // Watchdog stub
+  if (is_stub_) return "";
+
+  SB_CHECK(SbMutexAcquire(&mutex_) == kSbMutexAcquired);
+  starboard::ScopedFile read_file(GetWatchdogFilePaths(current).c_str(),
+                                  kSbFileOpenOnly | kSbFileRead);
+  if (read_file.IsValid()) {
+    int64_t kFileSize = read_file.GetSize();
+    std::string watchdog_content(kFileSize + 1, '\0');
+    read_file.ReadAll(&watchdog_content[0], kFileSize);
+    SB_CHECK(SbMutexRelease(&mutex_));
+    SB_LOG(INFO) << "Reading Watchdog violations:\n" << watchdog_content;
+    return watchdog_content;
+  } else {
+    SB_CHECK(SbMutexRelease(&mutex_));
+    SB_LOG(INFO) << "No Watchdog Violations.";
+    return "";
+  }
+}
+
+}  // namespace watchdog
+}  // namespace cobalt
diff --git a/cobalt/watchdog/watchdog.h b/cobalt/watchdog/watchdog.h
new file mode 100644
index 0000000..5b51b98
--- /dev/null
+++ b/cobalt/watchdog/watchdog.h
@@ -0,0 +1,138 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WATCHDOG_WATCHDOG_H_
+#define COBALT_WATCHDOG_WATCHDOG_H_
+
+#include <memory>
+#include <queue>
+#include <string>
+#include <unordered_map>
+
+#include "cobalt/base/application_state.h"
+#include "cobalt/watchdog/singleton.h"
+#include "starboard/mutex.h"
+#include "starboard/thread.h"
+#include "starboard/time.h"
+
+namespace cobalt {
+namespace watchdog {
+
+// Client to monitor
+typedef struct Client {
+  std::string name;
+  std::string description;
+  // List of strings optionally provided with each Ping.
+  std::queue<std::string> ping_infos;
+  // Application state to continue monitoring client up to.
+  base::ApplicationState monitor_state;
+  int64_t time_interval_microseconds;
+  int64_t time_wait_microseconds;
+  int64_t time_registered_microseconds;                    // since epoch
+  SbTimeMonotonic time_registered_monotonic_microseconds;  // since (relative)
+  SbTimeMonotonic time_last_pinged_microseconds;           // since (relative)
+} Client;
+
+// Watchdog violation
+typedef struct Violation {
+  std::string name;
+  std::string description;
+  // List of strings optionally provided with each Ping.
+  std::queue<std::string> ping_infos;
+  // Application state to continue monitoring client up to.
+  base::ApplicationState monitor_state;
+  int64_t time_interval_microseconds;
+  int64_t time_wait_microseconds;
+  int64_t time_registered_microseconds;  // since epoch
+  int64_t violation_time_microseconds;   // since epoch
+  int64_t violation_delta_microseconds;  // over time_interval
+  int64_t violation_count;
+  // Watchdog index as a serialized json string
+  std::string serialized_watchdog_index;
+
+  void operator=(const Client& c) {
+    name = c.name;
+    description = c.description;
+    ping_infos = c.ping_infos;
+    monitor_state = c.monitor_state;
+    time_interval_microseconds = c.time_wait_microseconds;
+    time_wait_microseconds = c.time_wait_microseconds;
+    time_registered_microseconds = c.time_registered_microseconds;
+  }
+} Violation;
+
+// Register behavior with previously registered clients of the same name.
+enum Replace {
+  NONE = 0,
+  PING = 1,
+  ALL = 2,
+};
+
+class Watchdog : public Singleton<Watchdog> {
+ public:
+  bool Initialize();
+  bool InitializeStub();
+  void Uninitialize();
+  void UpdateState(base::ApplicationState state);
+  bool Register(std::string name, base::ApplicationState monitor_state,
+                int64_t time_interval, int64_t time_wait = 0,
+                Replace replace = NONE);
+  bool Register(std::string name, std::string description,
+                base::ApplicationState monitor_state, int64_t time_interval,
+                int64_t time_wait = 0, Replace replace = NONE);
+  bool Unregister(const std::string& name, bool lock = true);
+  bool Ping(const std::string& name);
+  bool Ping(const std::string& name, const std::string& info);
+  std::string GetWatchdogViolations(bool current = false);
+
+ private:
+  std::string GetWatchdogFilePaths(bool current);
+  void PreservePreviousWatchdogViolations();
+  static void* Monitor(void* context);
+  std::string GetSerializedWatchdogIndex();
+  static void SerializeWatchdogViolations(void* context);
+
+  // Current Watchdog violations file path.
+  std::string watchdog_file_;
+  // Previous Watchdog violations file path.
+  std::string watchdog_old_file_;
+  // Creates a lock which ensures that each loop of monitor is atomic in that
+  // modifications to is_monitoring_, state_, smallest_time_interval_, and most
+  // importantly to the dictionaries containing Watchdog clients,
+  // watchdog_index_ and watchdog_violations_, only occur in between loops of
+  // monitor. API functions like Register(), Unregister(), Ping(), and
+  // GetWatchdogViolations() will be called by various threads and interact
+  // with these class variables.
+  SbMutex mutex_;
+  // Time interval between monitor loops.
+  int64_t smallest_time_interval_;
+  // Monitor thread.
+  SbThread watchdog_thread_;
+  // Tracks application state.
+  base::ApplicationState state_ = base::kApplicationStateStarted;
+  // Dictionary of registered Watchdog clients.
+  std::unordered_map<std::string, std::unique_ptr<Client>> watchdog_index_;
+  // Dictionary of Watchdog violations.
+  std::unordered_map<std::string, std::unique_ptr<Violation>>
+      watchdog_violations_;
+  // Flag to stub out Watchdog.
+  bool is_stub_ = false;
+  // Flag to stop monitor thread.
+  bool is_monitoring_;
+};
+
+}  // namespace watchdog
+}  // namespace cobalt
+
+#endif  // COBALT_WATCHDOG_WATCHDOG_H_
diff --git a/cobalt/web/BUILD.gn b/cobalt/web/BUILD.gn
new file mode 100644
index 0000000..ed5fb7c
--- /dev/null
+++ b/cobalt/web/BUILD.gn
@@ -0,0 +1,41 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+static_library("web") {
+  # Creates cycle with //cobalt/dom
+  check_includes = false
+
+  sources = [
+    "agent.cc",
+    "agent.h",
+    "context.h",
+    "environment_settings.h",
+    "stub_web_context.h",
+  ]
+
+  deps = [
+    "//cobalt/base",
+    "//cobalt/loader",
+    "//cobalt/script",
+    "//cobalt/script:engine",
+    "//cobalt/script/v8c:engine",
+  ]
+
+  public_deps = [
+    # Additionally, ensure that the include directories for generated
+    # headers are put on the include directories for targets that depend
+    # on this one.
+    "//cobalt/browser:generated_types",
+  ]
+}
diff --git a/cobalt/web/agent.cc b/cobalt/web/agent.cc
new file mode 100644
index 0000000..4111950
--- /dev/null
+++ b/cobalt/web/agent.cc
@@ -0,0 +1,420 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/web/agent.h"
+
+#include <map>
+#include <memory>
+#include <utility>
+
+#include "base/trace_event/trace_event.h"
+#include "cobalt/dom/blob.h"
+#include "cobalt/dom/url.h"
+#include "cobalt/loader/fetcher_factory.h"
+#include "cobalt/loader/script_loader_factory.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/error_report.h"
+#include "cobalt/script/execution_state.h"
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/javascript_engine.h"
+#include "cobalt/script/script_runner.h"
+#include "cobalt/script/wrappable.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
+#include "cobalt/worker/service_worker.h"
+#include "cobalt/worker/service_worker_object.h"
+#include "cobalt/worker/service_worker_registration.h"
+#include "cobalt/worker/service_worker_registration_object.h"
+
+namespace cobalt {
+namespace web {
+// Private Web Context implementation. Each Agent owns a single instance of
+// this class, which performs all the actual work. All functions of this class
+// must be called on the message loop of the Agent thread, so they
+// execute synchronously with respect to one another.
+namespace {
+class Impl : public Context {
+ public:
+  explicit Impl(const Agent::Options& options);
+  virtual ~Impl();
+
+  // Context
+  //
+  void set_message_loop(base::MessageLoop* message_loop) {
+    message_loop_ = message_loop;
+  }
+  base::MessageLoop* message_loop() const final { return message_loop_; }
+  void ShutDownJavaScriptEngine() final;
+  void set_fetcher_factory(loader::FetcherFactory* factory) final {
+    fetcher_factory_.reset(factory);
+  }
+  loader::FetcherFactory* fetcher_factory() const final {
+    return fetcher_factory_.get();
+  }
+  loader::ScriptLoaderFactory* script_loader_factory() const final {
+    return script_loader_factory_.get();
+  }
+  script::JavaScriptEngine* javascript_engine() const final {
+    return javascript_engine_.get();
+  }
+  script::GlobalEnvironment* global_environment() const final {
+    return global_environment_.get();
+  }
+  script::ExecutionState* execution_state() const final {
+    return execution_state_.get();
+  }
+  script::ScriptRunner* script_runner() const final {
+    return script_runner_.get();
+  }
+  dom::Blob::Registry* blob_registry() const final {
+    return blob_registry_.get();
+  }
+  network::NetworkModule* network_module() const final {
+    DCHECK(fetcher_factory_);
+    return fetcher_factory_->network_module();
+  }
+
+  const std::string& name() const final { return name_; };
+  void setup_environment_settings(
+      EnvironmentSettings* environment_settings) final {
+    environment_settings_.reset(environment_settings);
+    if (environment_settings_) environment_settings_->set_context(this);
+  }
+
+  web::EnvironmentSettings* environment_settings() const final {
+    DCHECK_EQ(environment_settings_->context(), this);
+    return environment_settings_.get();
+  }
+
+  // https://w3c.github.io/ServiceWorker/#service-worker-registration-creation
+  scoped_refptr<worker::ServiceWorkerRegistration> GetServiceWorkerRegistration(
+      worker::ServiceWorkerRegistrationObject* registration) final;
+
+ private:
+  // Injects a list of attributes into the Web Context's global object.
+  void InjectGlobalObjectAttributes(
+      const Agent::Options::InjectedGlobalObjectAttributes& attributes);
+
+  // https://w3c.github.io/ServiceWorker/#get-the-service-worker-object
+  scoped_refptr<worker::ServiceWorker> GetServiceWorker(
+      worker::ServiceWorkerObject* worker);
+
+  // Thread checker ensures all calls to the Context are made from the same
+  // thread that it is created in.
+  THREAD_CHECKER(thread_checker_);
+
+  // The message loop for the web context.
+  base::MessageLoop* message_loop_ = nullptr;
+
+  // Name of the web instance.
+  std::string name_;
+  // FetcherFactory that is used to create a fetcher according to URL.
+  std::unique_ptr<loader::FetcherFactory> fetcher_factory_;
+
+  // Todo: b/225410588 This is not used by WebModule. Should live in a
+  // better place.
+  // LoaderFactory that is used to acquire references to resources from a URL.
+  std::unique_ptr<loader::ScriptLoaderFactory> script_loader_factory_;
+
+  // JavaScript engine for the browser.
+  std::unique_ptr<script::JavaScriptEngine> javascript_engine_;
+
+  // JavaScript Global Object for the browser. There should be one per window,
+  // but since there is only one window, we can have one per browser.
+  scoped_refptr<script::GlobalEnvironment> global_environment_;
+
+  // Used by |Console| to obtain a JavaScript stack trace.
+  std::unique_ptr<script::ExecutionState> execution_state_;
+
+  // Interface for the document to execute JavaScript code.
+  std::unique_ptr<script::ScriptRunner> script_runner_;
+
+  // Object to register and retrieve Blob objects with a string key.
+  std::unique_ptr<dom::Blob::Registry> blob_registry_;
+
+  // Environment Settings object
+  std::unique_ptr<web::EnvironmentSettings> environment_settings_;
+
+  // The service worker registration object map.
+  //   https://w3c.github.io/ServiceWorker/#environment-settings-object-service-worker-registration-object-map
+  std::map<worker::ServiceWorkerRegistrationObject*,
+           scoped_refptr<worker::ServiceWorkerRegistration>>
+      service_worker_registration_object_map_;
+
+  // The service worker object map.
+  //   https://w3c.github.io/ServiceWorker/#environment-settings-object-service-worker-object-map
+  std::map<worker::ServiceWorkerObject*, scoped_refptr<worker::ServiceWorker>>
+      service_worker_object_map_;
+};
+
+Impl::Impl(const Agent::Options& options) : name_(options.name) {
+  TRACE_EVENT0("cobalt::web", "Agent::Impl::Impl()");
+  blob_registry_.reset(new dom::Blob::Registry);
+
+  fetcher_factory_.reset(new loader::FetcherFactory(
+      options.network_module, options.extra_web_file_dir,
+      dom::URL::MakeBlobResolverCallback(blob_registry_.get()),
+      options.read_cache_callback));
+  DCHECK(fetcher_factory_);
+
+  script_loader_factory_.reset(new loader::ScriptLoaderFactory(
+      options.name.c_str(), fetcher_factory_.get(), options.thread_priority));
+  DCHECK(script_loader_factory_);
+
+  javascript_engine_ =
+      script::JavaScriptEngine::CreateEngine(options.javascript_engine_options);
+  DCHECK(javascript_engine_);
+
+  global_environment_ = javascript_engine_->CreateGlobalEnvironment();
+  DCHECK(global_environment_);
+
+  global_environment_->AddRoot(blob_registry_.get());
+
+  execution_state_ =
+      script::ExecutionState::CreateExecutionState(global_environment_);
+  DCHECK(execution_state_);
+
+  script_runner_ =
+      script::ScriptRunner::CreateScriptRunner(global_environment_);
+  DCHECK(script_runner_);
+
+  // Schedule the injected global attributes to be added later, to ensure they
+  // are added after the global object is created.
+  if (!options.injected_global_object_attributes.empty()) {
+    DCHECK(base::MessageLoop::current());
+    base::MessageLoop::current()->task_runner()->PostTask(
+        FROM_HERE,
+        base::Bind(&Impl::InjectGlobalObjectAttributes, base::Unretained(this),
+                   options.injected_global_object_attributes));
+  }
+}
+
+void Impl::ShutDownJavaScriptEngine() {
+  // TODO: Disentangle shutdown of the JS engine with the various tracking and
+  // caching in the WebModule.
+  if (global_environment_) {
+    global_environment_->SetReportEvalCallback(base::Closure());
+    global_environment_->SetReportErrorCallback(
+        script::GlobalEnvironment::ReportErrorCallback());
+  }
+
+  setup_environment_settings(nullptr);
+  blob_registry_.reset();
+  script_runner_.reset();
+  execution_state_.reset();
+  global_environment_ = NULL;
+  javascript_engine_.reset();
+  fetcher_factory_.reset();
+  script_loader_factory_.reset();
+}
+
+Impl::~Impl() { ShutDownJavaScriptEngine(); }
+
+void Impl::InjectGlobalObjectAttributes(
+    const Agent::Options::InjectedGlobalObjectAttributes& attributes) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(global_environment_);
+
+  for (Agent::Options::InjectedGlobalObjectAttributes::const_iterator iter =
+           attributes.begin();
+       iter != attributes.end(); ++iter) {
+    global_environment_->Bind(iter->first,
+                              iter->second.Run(environment_settings()));
+  }
+}
+
+
+scoped_refptr<worker::ServiceWorkerRegistration>
+Impl::GetServiceWorkerRegistration(
+    worker::ServiceWorkerRegistrationObject* registration) {
+  // Algorithm for 'get the service worker registration object':
+  //   https://w3c.github.io/ServiceWorker/#get-the-service-worker-registration-object
+  scoped_refptr<worker::ServiceWorkerRegistration> worker_registration;
+  if (!registration) {
+    NOTREACHED();
+    return worker_registration;
+  }
+
+  // 1. Let objectMap be environment’s service worker registration object map.
+  // 2. If objectMap[registration] does not exist, then:
+  auto registration_lookup =
+      service_worker_registration_object_map_.find(registration);
+  if (registration_lookup == service_worker_registration_object_map_.end()) {
+    // 2.1. Let registrationObject be a new ServiceWorkerRegistration in
+    // environment’s Realm.
+    // 2.2. Set registrationObject’s service worker registration to
+    // registration.
+    // 2.3. Set registrationObject’s installing attribute to null.
+    // 2.4. Set registrationObject’s waiting attribute to null.
+    // 2.5. Set registrationObject’s active attribute to null.
+    worker_registration = new worker::ServiceWorkerRegistration(
+        environment_settings(), registration);
+
+    // 2.6. If registration’s installing worker is not null, then set
+    // registrationObject’s installing attribute to the result of getting the
+    // service worker object that represents registration’s installing worker in
+    // environment.
+    if (registration->installing_worker()) {
+      worker_registration->set_installing(
+          GetServiceWorker(registration->installing_worker()));
+    }
+
+    // 2.7. If registration’s waiting worker is not null, then set
+    // registrationObject’s waiting attribute to the result of getting the
+    // service worker object that represents registration’s waiting worker in
+    // environment.
+    if (registration->waiting_worker()) {
+      worker_registration->set_waiting(
+          GetServiceWorker(registration->waiting_worker()));
+    }
+
+    // 2.8. If registration’s active worker is not null, then set
+    // registrationObject’s active attribute to the result of getting the
+    // service worker object that represents registration’s active worker in
+    // environment.
+    if (registration->active_worker()) {
+      worker_registration->set_active(
+          GetServiceWorker(registration->active_worker()));
+    }
+
+    // 2.9. Set objectMap[registration] to registrationObject.
+    service_worker_registration_object_map_.insert(
+        std::make_pair(registration, worker_registration));
+  } else {
+    worker_registration = registration_lookup->second;
+  }
+  // 3. Return objectMap[registration].
+  return worker_registration;
+}
+
+scoped_refptr<worker::ServiceWorker> Impl::GetServiceWorker(
+    worker::ServiceWorkerObject* worker) {
+  // Algorithm for 'get the service worker object':
+  //   https://w3c.github.io/ServiceWorker/#get-the-service-worker-object
+  scoped_refptr<worker::ServiceWorker> service_worker;
+
+  // 1. Let objectMap be environment’s service worker object map.
+  // 2. If objectMap[serviceWorker] does not exist, then:
+  auto worker_lookup = service_worker_object_map_.find(worker);
+  if (worker_lookup == service_worker_object_map_.end()) {
+    // 2.1. Let serviceWorkerObj be a new ServiceWorker in environment’s Realm,
+    // and associate it with serviceWorker.
+    // 2.2. Set serviceWorkerObj’s state to serviceWorker’s state.
+    service_worker = new worker::ServiceWorker(environment_settings(), worker);
+
+    // 2.3. Set objectMap[serviceWorker] to serviceWorkerObj.
+    service_worker_object_map_.insert(std::make_pair(worker, service_worker));
+  } else {
+    service_worker = worker_lookup->second;
+  }
+
+  // 3. Return objectMap[serviceWorker].
+  return service_worker;
+}
+
+// Signals the given WaitableEvent.
+void SignalWaitableEvent(base::WaitableEvent* event) { event->Signal(); }
+}  // namespace
+
+void Agent::WillDestroyCurrentMessageLoop() { context_.reset(); }
+
+Agent::Agent(const Options& options, InitializeCallback initialize_callback,
+             DestructionObserver* destruction_observer)
+    : thread_(options.name) {
+  // Start the dedicated thread and create the internal implementation
+  // object on that thread.
+  base::Thread::Options thread_options(base::MessageLoop::TYPE_DEFAULT,
+                                       options.stack_size);
+  thread_options.priority = options.thread_priority;
+  if (!thread_.StartWithOptions(thread_options)) return;
+  DCHECK(message_loop());
+
+  message_loop()->task_runner()->PostTask(
+      FROM_HERE, base::Bind(&Agent::Initialize, base::Unretained(this), options,
+                            initialize_callback));
+
+  if (destruction_observer) {
+    message_loop()->task_runner()->PostTask(
+        FROM_HERE, base::Bind(&base::MessageLoop::AddDestructionObserver,
+                              base::Unretained(message_loop()),
+                              base::Unretained(destruction_observer)));
+  }
+  // Register as a destruction observer to shut down the Web Agent once all
+  // pending tasks have been executed and the message loop is about to be
+  // destroyed. This allows us to safely stop the thread, drain the task queue,
+  // then destroy the internal components before the message loop is reset.
+  // No posted tasks will be executed once the thread is stopped.
+  message_loop()->task_runner()->PostTask(
+      FROM_HERE,
+      base::Bind(&base::MessageLoop::AddDestructionObserver,
+                 base::Unretained(message_loop()), base::Unretained(this)));
+
+  // This works almost like a PostBlockingTask, except that any blocking that
+  // may be necessary happens when Stop() is called instead of right now.
+  message_loop()->task_runner()->PostTask(
+      FROM_HERE, base::Bind(&SignalWaitableEvent,
+                            base::Unretained(&destruction_observer_added_)));
+}
+
+Agent::~Agent() {
+  DCHECK(message_loop());
+  DCHECK(thread_.IsRunning());
+
+  // Ensure that the destruction observer got added before stopping the thread.
+  destruction_observer_added_.Wait();
+  // Stop the thread. This will cause the destruction observer to be notified.
+  thread_.Stop();
+}
+
+void Agent::Initialize(const Options& options,
+                       InitializeCallback initialize_callback) {
+  DCHECK_EQ(base::MessageLoop::current(), message_loop());
+  context_.reset(CreateContext(options, thread_.message_loop()));
+  initialize_callback.Run(context_.get());
+}
+
+Context* Agent::CreateContext(const Options& options,
+                              base::MessageLoop* message_loop) {
+  auto* context = new Impl(options);
+  context->set_message_loop(message_loop);
+  return context;
+}
+
+void Agent::WaitUntilDone() {
+  DCHECK(message_loop());
+  if (base::MessageLoop::current() != message_loop()) {
+    message_loop()->task_runner()->PostBlockingTask(
+        FROM_HERE, base::Bind(&Agent::WaitUntilDone, base::Unretained(this)));
+    return;
+  }
+  DCHECK_EQ(base::MessageLoop::current(), message_loop());
+}
+
+void Agent::RequestJavaScriptHeapStatistics(
+    const JavaScriptHeapStatisticsCallback& callback) {
+  TRACE_EVENT0("cobalt::web", "Agent::RequestJavaScriptHeapStatistics()");
+  DCHECK(message_loop());
+  if (base::MessageLoop::current() != message_loop()) {
+    message_loop()->task_runner()->PostTask(
+        FROM_HERE, base::Bind(&Agent::RequestJavaScriptHeapStatistics,
+                              base::Unretained(this), callback));
+    return;
+  }
+  script::HeapStatistics heap_statistics =
+      context_->javascript_engine()->GetHeapStatistics();
+  callback.Run(heap_statistics);
+}
+
+}  // namespace web
+}  // namespace cobalt
diff --git a/cobalt/web/agent.h b/cobalt/web/agent.h
new file mode 100644
index 0000000..3026e59
--- /dev/null
+++ b/cobalt/web/agent.h
@@ -0,0 +1,134 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WEB_AGENT_H_
+#define COBALT_WEB_AGENT_H_
+
+#include <memory>
+#include <string>
+
+#include "base/callback.h"
+#include "base/files/file_path.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/message_loop/message_loop.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/threading/thread.h"
+#include "cobalt/network/network_module.h"
+#include "cobalt/script/javascript_engine.h"
+#include "cobalt/script/wrappable.h"
+#include "cobalt/web/environment_settings.h"
+
+namespace cobalt {
+namespace web {
+
+class Agent : public base::MessageLoop::DestructionObserver {
+ public:
+  struct Options {
+    explicit Options(const std::string name) : name(name) {}
+    typedef base::Callback<scoped_refptr<script::Wrappable>(
+        script::EnvironmentSettings*)>
+        CreateObjectFunction;
+    typedef base::hash_map<std::string, CreateObjectFunction>
+        InjectedGlobalObjectAttributes;
+
+    // The name of the Web Agent.  This is useful for debugging purposes as
+    // in the case where multiple Web Agent objects exist, it can be used to
+    // differentiate which objects belong to which Web Agent.  It is used
+    // to name some CVals.
+    std::string name;
+
+    // Specifies the priority of the web agent's thread.  This is the thread
+    // that is responsible for executing JavaScript.
+    base::ThreadPriority thread_priority = base::ThreadPriority::NORMAL;
+
+    size_t stack_size = 0;
+    // injected_global_attributes contains a map of attributes to be injected
+    // into the Web Agent's window object upon construction.  This provides
+    // a mechanism to inject custom APIs into the Web Agent object.
+    InjectedGlobalObjectAttributes injected_global_object_attributes;
+
+    script::JavaScriptEngine::Options javascript_engine_options;
+
+    network::NetworkModule* network_module = nullptr;
+
+    // Optional directory to add to the search path for web files (file://).
+    base::FilePath extra_web_file_dir;
+
+    // Optional callback for fetching from cache via h5vcc-cache://.
+    base::Callback<int(const std::string&, std::unique_ptr<char[]>*)>
+        read_cache_callback;
+  };
+
+  typedef base::Callback<void(const script::HeapStatistics&)>
+      JavaScriptHeapStatisticsCallback;
+
+  typedef base::Callback<void(Context*)> InitializeCallback;
+  Agent(const Options& options, InitializeCallback initialize_callback,
+        DestructionObserver* destruction_observer = nullptr);
+  ~Agent();
+
+  static Context* CreateContext(const Options& options,
+                                base::MessageLoop* message_loop = nullptr);
+  static Context* CreateContext(const std::string& name) {
+    return CreateContext(Options(name));
+  }
+
+  Context* context() {
+    DCHECK(context_);
+    return context_.get();
+  }
+
+  // The message loop this object is running on.
+  base::MessageLoop* message_loop() const { return thread_.message_loop(); }
+
+  // Wait until all posted tasks have executed.
+  void WaitUntilDone();
+
+  // Post a task that gets the current |script::HeapStatistics| for our
+  // |JavaScriptEngine| to the web module thread, and then passes that to
+  // |callback|.  Note that |callback| will be called on the main web module
+  // thread.  It is the responsibility of |callback| to get back to its
+  // intended thread should it want to.
+  void RequestJavaScriptHeapStatistics(
+      const JavaScriptHeapStatisticsCallback& callback);
+
+  // From base::MessageLoop::DestructionObserver.
+  void WillDestroyCurrentMessageLoop() override;
+
+ private:
+  // Called by the constructor to create the private implementation object and
+  // perform any other initialization required on the dedicated thread.
+  void Initialize(const Options& options,
+                  InitializeCallback initialize_callback);
+
+  // The thread created and owned by this Web Agent.
+  // All sub-objects of this object are created on this thread, and all public
+  // member functions are re-posted to this thread if necessary.
+  base::Thread thread_;
+
+  // Interface to the web Context
+  std::unique_ptr<Context> context_;
+
+  // This event is used to signal when the destruction observers have been
+  // added to the message loop. This is then used in Stop() to ensure that
+  // processing doesn't continue until the thread is cleanly shutdown.
+  base::WaitableEvent destruction_observer_added_ = {
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      base::WaitableEvent::InitialState::NOT_SIGNALED};
+};
+
+}  // namespace web
+}  // namespace cobalt
+
+#endif  // COBALT_WEB_AGENT_H_
diff --git a/cobalt/web/context.h b/cobalt/web/context.h
new file mode 100644
index 0000000..8b5bf0e
--- /dev/null
+++ b/cobalt/web/context.h
@@ -0,0 +1,67 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WEB_CONTEXT_H_
+#define COBALT_WEB_CONTEXT_H_
+
+#include <string>
+
+#include "cobalt/dom/blob.h"
+#include "cobalt/loader/fetcher_factory.h"
+#include "cobalt/loader/script_loader_factory.h"
+#include "cobalt/network/network_module.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/execution_state.h"
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/javascript_engine.h"
+#include "cobalt/script/script_runner.h"
+#include "cobalt/web/environment_settings.h"
+#include "cobalt/worker/service_worker_registration_object.h"
+
+namespace cobalt {
+namespace worker {
+class ServiceWorkerRegistration;
+class ServiceWorkerRegistrationObject;
+}  // namespace worker
+namespace web {
+
+class Context {
+ public:
+  virtual ~Context() {}
+  virtual base::MessageLoop* message_loop() const = 0;
+  virtual void ShutDownJavaScriptEngine() = 0;
+  virtual void set_fetcher_factory(loader::FetcherFactory* factory) = 0;
+  virtual loader::FetcherFactory* fetcher_factory() const = 0;
+  virtual loader::ScriptLoaderFactory* script_loader_factory() const = 0;
+  virtual script::JavaScriptEngine* javascript_engine() const = 0;
+  virtual script::GlobalEnvironment* global_environment() const = 0;
+  virtual script::ExecutionState* execution_state() const = 0;
+  virtual script::ScriptRunner* script_runner() const = 0;
+  virtual dom::Blob::Registry* blob_registry() const = 0;
+  virtual network::NetworkModule* network_module() const = 0;
+
+  virtual const std::string& name() const = 0;
+  virtual void setup_environment_settings(EnvironmentSettings* settings) = 0;
+  virtual EnvironmentSettings* environment_settings() const = 0;
+
+  // https://w3c.github.io/ServiceWorker/#get-the-service-worker-registration-object
+  virtual scoped_refptr<worker::ServiceWorkerRegistration>
+  GetServiceWorkerRegistration(
+      worker::ServiceWorkerRegistrationObject* registration) = 0;
+};
+
+}  // namespace web
+}  // namespace cobalt
+
+#endif  // COBALT_WEB_CONTEXT_H_
diff --git a/cobalt/web/environment_settings.h b/cobalt/web/environment_settings.h
new file mode 100644
index 0000000..24f78b6
--- /dev/null
+++ b/cobalt/web/environment_settings.h
@@ -0,0 +1,56 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WEB_ENVIRONMENT_SETTINGS_H_
+#define COBALT_WEB_ENVIRONMENT_SETTINGS_H_
+
+#include <memory>
+#include <string>
+
+#include "cobalt/base/debugger_hooks.h"
+#include "cobalt/script/environment_settings.h"
+
+namespace cobalt {
+namespace web {
+
+class Context;
+
+// Environment Settings object as described in
+// https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#environment-settings-objects
+class EnvironmentSettings : public script::EnvironmentSettings {
+ public:
+  EnvironmentSettings() {}
+  explicit EnvironmentSettings(const base::DebuggerHooks& debugger_hooks)
+      : script::EnvironmentSettings(debugger_hooks) {}
+  ~EnvironmentSettings() override {}
+
+  Context* context() const {
+    DCHECK(context_);
+    return context_;
+  }
+  void set_context(Context* context) { context_ = context; }
+
+ protected:
+  friend std::unique_ptr<EnvironmentSettings>::deleter_type;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(EnvironmentSettings);
+
+  Context* context_ = nullptr;
+};
+
+}  // namespace web
+}  // namespace cobalt
+
+#endif  // COBALT_WEB_ENVIRONMENT_SETTINGS_H_
diff --git a/cobalt/web/stub_web_context.h b/cobalt/web/stub_web_context.h
new file mode 100644
index 0000000..8903fce
--- /dev/null
+++ b/cobalt/web/stub_web_context.h
@@ -0,0 +1,132 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WEB_STUB_WEB_CONTEXT_H_
+#define COBALT_WEB_STUB_WEB_CONTEXT_H_
+
+#include <memory>
+#include <string>
+
+#include "cobalt/loader/fetcher_factory.h"
+#include "cobalt/loader/script_loader_factory.h"
+#include "cobalt/network/network_module.h"
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/javascript_engine.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
+#include "url/gurl.h"
+
+namespace cobalt {
+namespace web {
+namespace test {
+
+class StubSettings : public EnvironmentSettings {
+ public:
+  explicit StubSettings(const GURL& base) { set_base_url(base); }
+
+ private:
+};
+
+class StubWebContext : public web::Context {
+ public:
+  StubWebContext() : web::Context(), name_("StubWebInstance") {
+    javascript_engine_ = script::JavaScriptEngine::CreateEngine();
+    global_environment_ = javascript_engine_->CreateGlobalEnvironment();
+  }
+  virtual ~StubWebContext() {}
+
+  // WebInstance
+  //
+  base::MessageLoop* message_loop() const final {
+    NOTREACHED();
+    return nullptr;
+  }
+  void ShutDownJavaScriptEngine() final { NOTREACHED(); }
+  void set_fetcher_factory(loader::FetcherFactory* factory) final {
+    fetcher_factory_.reset(factory);
+  }
+  loader::FetcherFactory* fetcher_factory() const final {
+    DCHECK(fetcher_factory_);
+    return fetcher_factory_.get();
+  }
+
+  loader::ScriptLoaderFactory* script_loader_factory() const final {
+    DCHECK(script_loader_factory_);
+    return script_loader_factory_.get();
+  }
+
+  script::JavaScriptEngine* javascript_engine() const final {
+    DCHECK(javascript_engine_);
+    return javascript_engine_.get();
+  }
+  script::GlobalEnvironment* global_environment() const final {
+    DCHECK(global_environment_);
+    return global_environment_.get();
+  }
+  script::ExecutionState* execution_state() const final {
+    NOTREACHED();
+    return nullptr;
+  }
+  script::ScriptRunner* script_runner() const final {
+    NOTREACHED();
+    return nullptr;
+  }
+  dom::Blob::Registry* blob_registry() const final {
+    NOTREACHED();
+    return nullptr;
+  }
+  void set_network_module(network::NetworkModule* module) {
+    network_module_.reset(module);
+  }
+  network::NetworkModule* network_module() const final {
+    DCHECK(network_module_);
+    return network_module_.get();
+  }
+
+  const std::string& name() const final { return name_; };
+  void setup_environment_settings(
+      EnvironmentSettings* environment_settings) final {
+    environment_settings_.reset(environment_settings);
+    if (environment_settings_) environment_settings_->set_context(this);
+  }
+  web::EnvironmentSettings* environment_settings() const final {
+    return environment_settings_.get();
+  }
+
+  scoped_refptr<worker::ServiceWorkerRegistration> GetServiceWorkerRegistration(
+      worker::ServiceWorkerRegistrationObject* registration) final {
+    NOTIMPLEMENTED();
+    return scoped_refptr<worker::ServiceWorkerRegistration>();
+  }
+
+  // Other
+ private:
+  // Name of the web instance.
+  const std::string name_;
+
+  std::unique_ptr<loader::FetcherFactory> fetcher_factory_;
+  std::unique_ptr<loader::ScriptLoaderFactory> script_loader_factory_;
+  std::unique_ptr<script::JavaScriptEngine> javascript_engine_;
+  scoped_refptr<script::GlobalEnvironment> global_environment_;
+
+  std::unique_ptr<network::NetworkModule> network_module_;
+  // Environment Settings object
+  std::unique_ptr<web::EnvironmentSettings> environment_settings_;
+};
+
+}  // namespace test
+}  // namespace web
+}  // namespace cobalt
+
+#endif  // COBALT_WEB_STUB_WEB_CONTEXT_H_
diff --git a/cobalt/web_animations/web_animations.gyp b/cobalt/web_animations/web_animations.gyp
deleted file mode 100644
index c350740..0000000
--- a/cobalt/web_animations/web_animations.gyp
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'web_animations',
-      'type': 'static_library',
-      'sources': [
-        'animatable.h',
-        'animation.cc',
-        'animation.h',
-        'animation_effect_read_only.h',
-        'animation_effect_timing_read_only.cc',
-        'animation_effect_timing_read_only.h',
-        'animation_set.cc',
-        'animation_set.h',
-        'animation_timeline.cc',
-        'animation_timeline.h',
-        'baked_animation_set.cc',
-        'baked_animation_set.h',
-        'keyframe.h',
-        'keyframe_effect_read_only.cc',
-        'keyframe_effect_read_only.h',
-        'timed_task_queue.cc',
-        'timed_task_queue.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/cssom/cssom.gyp:cssom',
-      ],
-    },
-
-    {
-      'target_name': 'web_animations_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'animation_test.cc',
-        'animation_effect_timing_read_only_test.cc',
-        'keyframe_effect_read_only_test.cc',
-      ],
-      'dependencies': [
-        'web_animations',
-        '<(DEPTH)/cobalt/css_parser/css_parser.gyp:css_parser',
-        '<(DEPTH)/cobalt/cssom/cssom.gyp:cssom',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'web_animations_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'web_animations_test',
-      ],
-      'variables': {
-        'executable_name': 'web_animations_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/webdriver/BUILD.gn b/cobalt/webdriver/BUILD.gn
index 2367a96..f5aee54 100644
--- a/cobalt/webdriver/BUILD.gn
+++ b/cobalt/webdriver/BUILD.gn
@@ -116,6 +116,7 @@
 }
 
 copy("webdriver_copy_test_data") {
+  install_content = true
   sources = [
     "testdata/displayed_test.html",
     "testdata/map.png",
@@ -137,7 +138,6 @@
 
   deps = [
     ":webdriver",
-    ":webdriver_copy_test_data",
     "//cobalt/base",
     "//cobalt/browser",
     "//cobalt/css_parser:css_parser",
@@ -149,4 +149,11 @@
     "//testing/gtest",
     "//third_party/devtools:devtools_all_files",
   ]
+
+  data_deps = [
+    ":copy_webdriver_data",
+    ":webdriver_copy_test_data",
+  ]
+
+  content_deps = data_deps
 }
diff --git a/cobalt/webdriver/element_driver.cc b/cobalt/webdriver/element_driver.cc
index 52abf15..0f36d4b 100644
--- a/cobalt/webdriver/element_driver.cc
+++ b/cobalt/webdriver/element_driver.cc
@@ -248,8 +248,8 @@
       return CommandResult(protocol::Response::kStaleElementReference);
     }
 
-    keyboard_event_injector_.Run(element_.get(), (*events)[i].first,
-                                 (*events)[i].second);
+    keyboard_event_injector_.Run((*events)[i].first, (*events)[i].second,
+                                 element_.get());
   }
   return CommandResult(protocol::Response::kSuccess);
 }
@@ -308,16 +308,16 @@
 
   event.set_button(0);
   event.set_buttons(0);
-  pointer_event_injector_.Run(scoped_refptr<dom::Element>(),
-                              base::Tokens::pointermove(), event);
+  pointer_event_injector_.Run(base::Tokens::pointermove(), event,
+                              scoped_refptr<dom::Element>());
   event.set_buttons(1);
   event.set_pressure(0.5f);
-  pointer_event_injector_.Run(scoped_refptr<dom::Element>(),
-                              base::Tokens::pointerdown(), event);
+  pointer_event_injector_.Run(base::Tokens::pointerdown(), event,
+                              scoped_refptr<dom::Element>());
   event.set_buttons(0);
   event.set_pressure(0.0f);
-  pointer_event_injector_.Run(scoped_refptr<dom::Element>(),
-                              base::Tokens::pointerup(), event);
+  pointer_event_injector_.Run(base::Tokens::pointerup(), event,
+                              scoped_refptr<dom::Element>());
 
   return CommandResult(protocol::Response::kSuccess);
 }
diff --git a/cobalt/webdriver/element_driver.h b/cobalt/webdriver/element_driver.h
index f4cde4b..5a29e5d 100644
--- a/cobalt/webdriver/element_driver.h
+++ b/cobalt/webdriver/element_driver.h
@@ -52,11 +52,11 @@
 // will map to a method on this class.
 class ElementDriver {
  public:
-  typedef base::Callback<void(scoped_refptr<dom::Element>, const base::Token,
-                              const dom::KeyboardEventInit&)>
+  typedef base::Callback<void(const base::Token, const dom::KeyboardEventInit&,
+                              scoped_refptr<dom::Element>)>
       KeyboardEventInjector;
-  typedef base::Callback<void(scoped_refptr<dom::Element>, const base::Token,
-                              const dom::PointerEventInit&)>
+  typedef base::Callback<void(const base::Token, const dom::PointerEventInit&,
+                              scoped_refptr<dom::Element>)>
       PointerEventInjector;
 
   ElementDriver(
diff --git a/cobalt/webdriver/webdriver.gyp b/cobalt/webdriver/webdriver.gyp
deleted file mode 100644
index 491531d..0000000
--- a/cobalt/webdriver/webdriver.gyp
+++ /dev/null
@@ -1,132 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [ '../build/contents_dir.gypi' ],
-
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-
-  'targets': [
-    {
-      'target_name': 'webdriver',
-      'type': 'static_library',
-      'conditions': [
-        ['enable_webdriver==1', {
-          'sources': [
-            'algorithms.cc',
-            'algorithms.h',
-            'dispatcher.cc',
-            'dispatcher.h',
-            'element_driver.cc',
-            'element_driver.h',
-            'keyboard.cc',
-            'keyboard.h',
-            'protocol/button.cc',
-            'protocol/button.h',
-            'protocol/capabilities.cc',
-            'protocol/capabilities.h',
-            'protocol/cookie.cc',
-            'protocol/cookie.h',
-            'protocol/element_id.cc',
-            'protocol/element_id.h',
-            'protocol/frame_id.cc',
-            'protocol/frame_id.h',
-            'protocol/keys.cc',
-            'protocol/keys.h',
-            'protocol/location.cc',
-            'protocol/location.h',
-            'protocol/log_entry.cc',
-            'protocol/log_entry.h',
-            'protocol/log_type.cc',
-            'protocol/log_type.h',
-            'protocol/moveto.cc',
-            'protocol/moveto.h',
-            'protocol/proxy.cc',
-            'protocol/proxy.h',
-            'protocol/rect.cc',
-            'protocol/rect.h',
-            'protocol/response.cc',
-            'protocol/response.h',
-            'protocol/script.cc',
-            'protocol/script.h',
-            'protocol/search_strategy.cc',
-            'protocol/search_strategy.h',
-            'protocol/server_status.cc',
-            'protocol/server_status.h',
-            'protocol/session_id.h',
-            'protocol/size.cc',
-            'protocol/size.h',
-            'protocol/window_id.cc',
-            'protocol/window_id.h',
-            'screenshot.cc',
-            'screenshot.h',
-            'script_executor.cc',
-            'script_executor.h',
-            'script_executor_params.cc',
-            'script_executor_params.h',
-            'script_executor_result.h',
-            'search.cc',
-            'search.h',
-            'server.cc',
-            'server.h',
-            'session_driver.cc',
-            'session_driver.h',
-            'web_driver_module.cc',
-            'web_driver_module.h',
-            'window_driver.cc',
-            'window_driver.h',
-            'screencast/screencast_module.cc',
-            'screencast/screencast_module.h',
-          ],
-          'dependencies': [ 'copy_webdriver_data', ],
-          'defines': [
-            'ENABLE_WEBDRIVER',
-          ],
-          'all_dependent_settings': {
-            'defines': [ 'ENABLE_WEBDRIVER', ],
-          },
-        }],
-        ['enable_webdriver==0', {
-          'sources': [
-          'stub_web_driver_module.cc'
-          ]
-        }],
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/net/net.gyp:http_server',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-      ],
-    },
-    {
-      'target_name': 'copy_webdriver_data',
-      'type': 'none',
-      'copies': [
-        {
-          'destination': '<(sb_static_contents_output_data_dir)/webdriver',
-          'files': ['content/webdriver-init.js'],
-        },
-      ],
-      'all_dependent_settings': {
-        'variables': {
-          'content_deploy_subdirs': [ 'webdriver' ]
-        }
-      },
-    },
-  ],
-}
diff --git a/cobalt/webdriver/webdriver_test.gyp b/cobalt/webdriver/webdriver_test.gyp
deleted file mode 100644
index 33c8ab8..0000000
--- a/cobalt/webdriver/webdriver_test.gyp
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-  'targets': [
-    {
-      'target_name': 'webdriver_test',
-      'type': '<(gtest_target_type)',
-      'conditions': [
-        ['enable_webdriver==1', {
-          'sources': [
-            'get_element_text_test.cc',
-            'is_displayed_test.cc',
-            'keyboard_test.cc',
-            'execute_test.cc',
-          ],
-        }],
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/browser/browser.gyp:browser',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'webdriver_copy_test_data',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'webdriver_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<(DEPTH)/cobalt/webdriver/testdata/',
-        ],
-        'content_test_output_subdir': 'cobalt/webdriver_test',
-      },
-      'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-    },
-
-    {
-      'target_name': 'webdriver_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'webdriver_test',
-      ],
-      'variables': {
-        'executable_name': 'webdriver_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ]
-}
diff --git a/cobalt/webdriver/window_driver.cc b/cobalt/webdriver/window_driver.cc
index 6a33518..da4efbd 100644
--- a/cobalt/webdriver/window_driver.cc
+++ b/cobalt/webdriver/window_driver.cc
@@ -500,8 +500,8 @@
   }
 
   for (size_t i = 0; i < events->size(); ++i) {
-    keyboard_event_injector_.Run(scoped_refptr<dom::Element>(),
-                                 (*events)[i].first, (*events)[i].second);
+    keyboard_event_injector_.Run((*events)[i].first, (*events)[i].second,
+                                 scoped_refptr<dom::Element>());
   }
   return CommandResult(protocol::Response::kSuccess);
 }
@@ -557,12 +557,12 @@
   event->set_is_primary(true);
 }
 
-void WindowDriver::InjectPointerEvent(scoped_refptr<dom::Element> element,
-                                      base::Token type,
-                                      const dom::PointerEventInit& event) {
+void WindowDriver::InjectPointerEvent(base::Token type,
+                                      const dom::PointerEventInit& event,
+                                      scoped_refptr<dom::Element> element) {
   pointer_x_ = event.screen_x();
   pointer_y_ = event.screen_y();
-  pointer_event_injector_.Run(element, type, event);
+  pointer_event_injector_.Run(type, event, element);
 }
 
 util::CommandResult<void> WindowDriver::MouseMoveToInternal(
@@ -623,8 +623,8 @@
 
   dom::PointerEventInit event;
   InitPointerEvent(&event);
-  pointer_event_injector_.Run(scoped_refptr<dom::Element>(),
-                              base::Tokens::pointermove(), event);
+  pointer_event_injector_.Run(base::Tokens::pointermove(), event,
+                              scoped_refptr<dom::Element>());
 
   return CommandResult(protocol::Response::kSuccess);
 }
@@ -642,8 +642,8 @@
 
   InitPointerEvent(&event);
 
-  pointer_event_injector_.Run(scoped_refptr<dom::Element>(),
-                              base::Tokens::pointerup(), event);
+  pointer_event_injector_.Run(base::Tokens::pointerup(), event,
+                              scoped_refptr<dom::Element>());
 }
 
 void WindowDriver::InjectMouseButtonDown(const protocol::Button& button) {
@@ -659,8 +659,8 @@
 
   InitPointerEvent(&event);
 
-  pointer_event_injector_.Run(scoped_refptr<dom::Element>(),
-                              base::Tokens::pointerdown(), event);
+  pointer_event_injector_.Run(base::Tokens::pointerdown(), event,
+                              scoped_refptr<dom::Element>());
 }
 
 util::CommandResult<void> WindowDriver::MouseButtonDownInternal(
diff --git a/cobalt/webdriver/window_driver.h b/cobalt/webdriver/window_driver.h
index dd9b121..d72f8c9 100644
--- a/cobalt/webdriver/window_driver.h
+++ b/cobalt/webdriver/window_driver.h
@@ -19,6 +19,7 @@
 
 #include <memory>
 #include <string>
+#include <unordered_map>
 #include <vector>
 
 #include "base/containers/hash_tables.h"
@@ -58,11 +59,11 @@
 // will map to a method on this class.
 class WindowDriver : private ElementMapping {
  public:
-  typedef base::Callback<void(scoped_refptr<dom::Element>, const base::Token,
-                              const dom::KeyboardEventInit&)>
+  typedef base::Callback<void(const base::Token, const dom::KeyboardEventInit&,
+                              scoped_refptr<dom::Element>)>
       KeyboardEventInjector;
-  typedef base::Callback<void(scoped_refptr<dom::Element>, const base::Token,
-                              const dom::PointerEventInit&)>
+  typedef base::Callback<void(const base::Token, const dom::PointerEventInit&,
+                              scoped_refptr<dom::Element>)>
       PointerEventInjector;
 
   typedef base::Callback<scoped_refptr<script::GlobalEnvironment>()>
@@ -146,8 +147,8 @@
 
   // Used to receive pointer positions from events injected from an
   // ElementDriver.
-  void InjectPointerEvent(scoped_refptr<dom::Element> element, base::Token type,
-                          const dom::PointerEventInit& event);
+  void InjectPointerEvent(base::Token type, const dom::PointerEventInit& event,
+                          scoped_refptr<dom::Element> element);
 
   util::CommandResult<void> MouseMoveToInternal(const protocol::Moveto& moveto);
 
diff --git a/cobalt/websocket/BUILD.gn b/cobalt/websocket/BUILD.gn
index 469ef27..28a2a84 100644
--- a/cobalt/websocket/BUILD.gn
+++ b/cobalt/websocket/BUILD.gn
@@ -70,6 +70,4 @@
   if (!is_gold) {
     deps += [ "//cobalt/debug" ]
   }
-
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/cobalt/websocket/web_socket.cc b/cobalt/websocket/web_socket.cc
index d81dcf4..768a77b 100644
--- a/cobalt/websocket/web_socket.cc
+++ b/cobalt/websocket/web_socket.cc
@@ -28,6 +28,8 @@
 #include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/window.h"
 #include "cobalt/script/global_environment.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "cobalt/websocket/close_event.h"
 #include "net/base/port_util.h"
 #include "net/base/url_util.h"
@@ -40,12 +42,12 @@
 
 typedef uint16 SerializedCloseStatusCodeType;
 
-static const std::string kComma = ",";
+static const char kComma[] = ",";
 
-bool IsURLAbsolute(cobalt::dom::DOMSettings* dom_settings,
+bool IsURLAbsolute(cobalt::web::EnvironmentSettings* settings,
                    const std::string& url) {
   // This is a requirement for calling spec()
-  DCHECK(dom_settings->base_url().is_valid());
+  DCHECK(settings->base_url().is_valid());
 
   url::RawCanonOutputT<char> whitespace_buffer;
   int relative_length;
@@ -56,7 +58,7 @@
 
   url::Component relative_component;
 
-  const std::string& base_url(dom_settings->base_url().spec());
+  const std::string& base_url(settings->base_url().spec());
   url::Parsed parsed;
 
   url::ParseStandardURL(base_url.c_str(), static_cast<int>(base_url.length()),
@@ -418,8 +420,8 @@
   if (is_text_frame) {
     response_type_code = dom::MessageEvent::kText;
   }
-  this->DispatchEvent(new dom::MessageEvent(base::Tokens::message(), settings_,
-                                            response_type_code, data));
+  this->DispatchEvent(
+      new dom::MessageEvent(base::Tokens::message(), response_type_code, data));
 }
 
 void WebSocket::OnWriteDone(uint64_t bytes_written) {
@@ -437,16 +439,17 @@
   port_ = -1;
   SetReadyState(kConnecting);
 
-  settings_ = base::polymorphic_downcast<dom::DOMSettings*>(settings);
+  settings_ = base::polymorphic_downcast<web::EnvironmentSettings*>(settings);
   if (!settings_) {
-    dom::DOMException::Raise(dom::DOMException::kNone,
-                             "Internal error: Unable to get DOM settings.",
-                             exception_state);
+    dom::DOMException::Raise(
+        dom::DOMException::kNone,
+        "Internal error: Unable to get Web Environment Settings.",
+        exception_state);
     NOTREACHED() << "Unable to get DOM settings.";
     return;
   }
 
-  if (require_network_module_ && !settings_->network_module()) {
+  if (require_network_module_ && !settings_->context()->network_module()) {
     dom::DOMException::Raise(dom::DOMException::kNone,
                              "Internal error: Unable to get network module.",
                              exception_state);
@@ -563,8 +566,11 @@
   if (!settings_) {
     return NULL;
   }
-  if (settings_->window() && settings_->window()->document()) {
-    return settings_->window()->document()->csp_delegate();
+  dom::DOMSettings* dom_settings =
+      base::polymorphic_downcast<dom::DOMSettings*>(settings_);
+  if (dom_settings && dom_settings->window() &&
+      dom_settings->window()->document()) {
+    return dom_settings->window()->document()->csp_delegate();
   } else {
     return NULL;
   }
@@ -578,8 +584,9 @@
   GURL origin_gurl = settings_->base_url().GetOrigin();
   const std::string& origin = origin_gurl.possibly_invalid_spec();
 
+  DCHECK(settings_->context());
   impl_ = base::WrapRefCounted(
-      new WebSocketImpl(settings_->network_module(), this));
+      new WebSocketImpl(settings_->context()->network_module(), this));
 
   impl_->Connect(origin, url, sub_protocols);
 }
@@ -657,7 +664,7 @@
     if (prevent_gc) {
       prevent_gc_while_listening_.reset(
           new script::GlobalEnvironment::ScopedPreventGarbageCollection(
-              settings_->global_environment(), this));
+              settings_->context()->global_environment(), this));
     } else {
       // Note: the fall through in this switch statement is on purpose.
       switch (ready_state_) {
diff --git a/cobalt/websocket/web_socket.h b/cobalt/websocket/web_socket.h
index 09de05d..70940c8 100644
--- a/cobalt/websocket/web_socket.h
+++ b/cobalt/websocket/web_socket.h
@@ -27,7 +27,6 @@
 #include "cobalt/dom/blob.h"
 #include "cobalt/dom/csp_delegate.h"
 #include "cobalt/dom/dom_exception.h"
-#include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/event_target.h"
 #include "cobalt/dom/message_event.h"
 #include "cobalt/script/array_buffer.h"
@@ -35,6 +34,7 @@
 #include "cobalt/script/environment_settings.h"
 #include "cobalt/script/global_environment.h"
 #include "cobalt/script/wrappable.h"
+#include "cobalt/web/environment_settings.h"
 #include "cobalt/websocket/web_socket_impl.h"
 
 namespace cobalt {
@@ -218,7 +218,7 @@
   std::string entry_script_origin_;
 
   bool require_network_module_;
-  dom::DOMSettings* settings_;
+  web::EnvironmentSettings* settings_;
   scoped_refptr<WebSocketImpl> impl_;
 
   std::unique_ptr<script::GlobalEnvironment::ScopedPreventGarbageCollection>
diff --git a/cobalt/websocket/web_socket_impl_test.cc b/cobalt/websocket/web_socket_impl_test.cc
index 802ab70..f6477af 100644
--- a/cobalt/websocket/web_socket_impl_test.cc
+++ b/cobalt/websocket/web_socket_impl_test.cc
@@ -14,9 +14,8 @@
 
 #include "cobalt/websocket/web_socket_impl.h"
 
-#include "cobalt/websocket/web_socket.h"
-
 #include <memory>
+#include <string>
 #include <vector>
 
 #include "base/memory/ref_counted.h"
@@ -24,11 +23,15 @@
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/dom/dom_exception.h"
 #include "cobalt/dom/dom_settings.h"
+#include "cobalt/dom/testing/stub_environment_settings.h"
 #include "cobalt/dom/window.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/script/script_exception.h"
 #include "cobalt/script/testing/mock_exception_state.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/stub_web_context.h"
 #include "cobalt/websocket/mock_websocket_channel.h"
+#include "cobalt/websocket/web_socket.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::_;
@@ -47,28 +50,13 @@
 const int kTooMuch = kDefaultSendQuotaHighWaterMark + 1;
 const int kWayTooMuch = kDefaultSendQuotaHighWaterMark * 2 + 1;
 const int k512KB = 512;
-
-class FakeSettings : public dom::DOMSettings {
- public:
-  FakeSettings()
-      : dom::DOMSettings(0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                         null_debugger_hooks_, NULL),
-        base_("https://127.0.0.1:1234") {
-    network_module_.reset(new network::NetworkModule());
-    this->set_network_module(network_module_.get());
-  }
-  const GURL& base_url() const override { return base_; }
-
-  // public members, so that they're easier for testing.
-  base::NullDebuggerHooks null_debugger_hooks_;
-  GURL base_;
-  std::unique_ptr<network::NetworkModule> network_module_;
-};
 }  // namespace
 
 class WebSocketImplTest : public ::testing::Test {
  public:
-  dom::DOMSettings* settings() const { return settings_.get(); }
+  web::EnvironmentSettings* settings() const {
+    return web_context_->environment_settings();
+  }
   void AddQuota(int quota) {
     network_task_runner_->PostBlockingTask(
         FROM_HERE,
@@ -76,16 +64,22 @@
   }
 
  protected:
-  WebSocketImplTest() : settings_(new FakeSettings()) {
+  WebSocketImplTest() : web_context_(new web::test::StubWebContext()) {
+    web_context_->set_network_module(new network::NetworkModule());
+    web_context_->setup_environment_settings(
+        new dom::testing::StubEnvironmentSettings());
+    web_context_->environment_settings()->set_base_url(
+        GURL("https://127.0.0.1:1234"));
     std::vector<std::string> sub_protocols;
     sub_protocols.push_back("chat");
-    network_task_runner_ = settings_->network_module()
+    network_task_runner_ = web_context_->network_module()
                                ->url_request_context_getter()
                                ->GetNetworkTaskRunner();
   }
 
   void SetUp() override {
-    websocket_impl_ = new WebSocketImpl(settings_->network_module(), nullptr);
+    websocket_impl_ =
+        new WebSocketImpl(web_context_->network_module(), nullptr);
     // Setting this was usually done by WebSocketImpl::Connect, but since we do
     // not do Connect for every test, we have to make sure its task runner is
     // set.
@@ -96,14 +90,14 @@
         FROM_HERE,
         base::Bind(
             [](scoped_refptr<WebSocketImpl> websocket_impl,
-               MockWebSocketChannel** mock_channel_slot,
-               dom::DOMSettings* settings) {
+               web::Context* web_context,
+               MockWebSocketChannel** mock_channel_slot) {
               *mock_channel_slot = new MockWebSocketChannel(
-                  websocket_impl.get(), settings->network_module());
+                  websocket_impl, web_context->network_module());
               websocket_impl->websocket_channel_ =
                   std::unique_ptr<net::WebSocketChannel>(*mock_channel_slot);
             },
-            websocket_impl_, &mock_channel_, settings()));
+            websocket_impl_, web_context_.get(), &mock_channel_));
   }
 
   void TearDown() override {
@@ -116,7 +110,7 @@
 
   base::test::ScopedTaskEnvironment env_;
 
-  std::unique_ptr<FakeSettings> settings_;
+  std::unique_ptr<web::test::StubWebContext> web_context_;
   scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
   scoped_refptr<WebSocketImpl> websocket_impl_;
   MockWebSocketChannel* mock_channel_;
@@ -209,9 +203,9 @@
                               _, kDefaultSendQuotaHighWaterMark))
         .Times(1)
         .WillOnce(Return(net::WebSocketChannel::CHANNEL_ALIVE));
-    EXPECT_CALL(
-        *mock_channel_,
-        MockSendFrame(true, net::WebSocketFrameHeader::kOpCodeContinuation, _, 1))
+    EXPECT_CALL(*mock_channel_,
+                MockSendFrame(
+                    true, net::WebSocketFrameHeader::kOpCodeContinuation, _, 1))
         .Times(1)
         .WillOnce(Return(net::WebSocketChannel::CHANNEL_ALIVE));
     EXPECT_CALL(*mock_channel_,
@@ -219,9 +213,10 @@
                               k512KB - 1))
         .Times(1)
         .WillOnce(Return(net::WebSocketChannel::CHANNEL_ALIVE));
-    EXPECT_CALL(*mock_channel_,
-                MockSendFrame(true, net::WebSocketFrameHeader::kOpCodeContinuation, _,
-                              kTooMuch - (k512KB - 1)))
+    EXPECT_CALL(
+        *mock_channel_,
+        MockSendFrame(true, net::WebSocketFrameHeader::kOpCodeContinuation, _,
+                      kTooMuch - (k512KB - 1)))
         .Times(1)
         .WillOnce(Return(net::WebSocketChannel::CHANNEL_ALIVE));
   }
diff --git a/cobalt/websocket/web_socket_test.cc b/cobalt/websocket/web_socket_test.cc
index c4ad82c..a130bee 100644
--- a/cobalt/websocket/web_socket_test.cc
+++ b/cobalt/websocket/web_socket_test.cc
@@ -23,9 +23,10 @@
 #include "cobalt/dom/dom_exception.h"
 #include "cobalt/dom/testing/stub_environment_settings.h"
 #include "cobalt/dom/window.h"
-#include "cobalt/network/network_module.h"
 #include "cobalt/script/script_exception.h"
 #include "cobalt/script/testing/mock_exception_state.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/stub_web_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::_;
@@ -36,38 +37,31 @@
 namespace cobalt {
 namespace websocket {
 
-namespace {
-class FakeSettings : public dom::testing::StubEnvironmentSettings {
- public:
-  FakeSettings() : base_("https://example.com") {
-    network_module_.reset(new network::NetworkModule());
-    this->set_network_module(network_module_.get());
-  }
-  const GURL& base_url() const override { return base_; }
-
-  // public members, so that they're easier for testing.
-  GURL base_;
-  std::unique_ptr<network::NetworkModule> network_module_;
-};
-}  // namespace
-
 class WebSocketTest : public ::testing::Test {
  public:
-  dom::DOMSettings* settings() const { return settings_.get(); }
+  web::EnvironmentSettings* settings() const {
+    return web_context_->environment_settings();
+  }
 
  protected:
-  WebSocketTest() : settings_(new FakeSettings()) {}
+  WebSocketTest() : web_context_(new web::test::StubWebContext()) {
+    web_context_->set_network_module(new network::NetworkModule());
+    web_context_->setup_environment_settings(
+        new dom::testing::StubEnvironmentSettings());
+    web_context_->environment_settings()->set_base_url(
+        GURL("https://example.com"));
+  }
 
   base::test::ScopedTaskEnvironment env_;
 
-  std::unique_ptr<FakeSettings> settings_;
+  std::unique_ptr<web::test::StubWebContext> web_context_;
   StrictMock<MockExceptionState> exception_state_;
 };
 
 TEST_F(WebSocketTest, BadOrigin) {
   scoped_refptr<script::ScriptException> exception;
 
-  base::polymorphic_downcast<FakeSettings*>(settings())->base_ = GURL();
+  settings()->set_base_url(GURL());
 
   EXPECT_CALL(exception_state_, SetException(_))
       .WillOnce(SaveArg<0>(&exception));
@@ -97,8 +91,7 @@
   for (std::size_t i(0); i != ARRAYSIZE_UNSAFE(origin_test_cases); ++i) {
     const OriginTestCase& test_case(origin_test_cases[i]);
     std::string new_base = test_case.input_base_url;
-    base::polymorphic_downcast<FakeSettings*>(settings())->base_ =
-        GURL(new_base);
+    settings()->set_base_url(GURL(new_base));
 
     scoped_refptr<WebSocket> ws(new WebSocket(settings(), "ws://example.com",
                                               &exception_state_, false));
diff --git a/cobalt/websocket/websocket.gyp b/cobalt/websocket/websocket.gyp
deleted file mode 100644
index 4ba8d9a..0000000
--- a/cobalt/websocket/websocket.gyp
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'websocket',
-      'type': 'static_library',
-      'sources': [
-        'buffered_amount_tracker.cc',
-        'buffered_amount_tracker.h',
-        'close_event.h',
-        'sec_web_socket_key.h',
-        'web_socket.cc',
-        'web_socket.h',
-        'cobalt_web_socket_event_handler.cc',
-        'cobalt_web_socket_event_handler.h',
-        'web_socket_impl.cc',
-        'web_socket_impl.h',
-      ],
-      'dependencies': [
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-    },
-
-    {
-      'target_name': 'websocket_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'web_socket_test.cc',
-        'mock_websocket_channel.cc',
-        'web_socket_impl_test.cc',
-      ],
-      'dependencies': [
-        'websocket',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/url/url.gyp:url',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-
-        # TODO: Remove the dependency below, it works around the fact that
-        #       ScriptValueFactory has non-virtual method CreatePromise().
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-      ],
-      'conditions': [
-        # The network gyp targets depends on 'debug' in unit test builds.
-        ['enable_debugger == 1', {
-          'dependencies': [
-            '<(DEPTH)/cobalt/debug/debug.gyp:debug',
-          ],
-        }],
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-
-    {
-      'target_name': 'websocket_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'websocket_test',
-      ],
-      'variables': {
-        'executable_name': 'websocket_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
-
diff --git a/cobalt/worker/BUILD.gn b/cobalt/worker/BUILD.gn
index 4d2336a..2cffcec 100644
--- a/cobalt/worker/BUILD.gn
+++ b/cobalt/worker/BUILD.gn
@@ -17,8 +17,31 @@
   check_includes = false
 
   sources = [
+    "abstract_worker.h",
+    "dedicated_worker.cc",
+    "dedicated_worker.h",
+    "dedicated_worker_global_scope.cc",
+    "dedicated_worker_global_scope.h",
+    "message_port.cc",
+    "message_port.h",
+    "navigation_preload_manager.cc",
+    "navigation_preload_manager.h",
+    "service_worker.cc",
+    "service_worker.h",
     "service_worker_container.cc",
     "service_worker_container.h",
+    "service_worker_jobs.cc",
+    "service_worker_jobs.h",
+    "service_worker_registration.cc",
+    "service_worker_registration.h",
+    "service_worker_registration_object.cc",
+    "service_worker_registration_object.h",
+    "worker.cc",
+    "worker.h",
+    "worker_global_scope.cc",
+    "worker_global_scope.h",
+    "worker_settings.cc",
+    "worker_settings.h",
   ]
 
   public_deps = [
diff --git a/cobalt/worker/abstract_worker.h b/cobalt/worker/abstract_worker.h
new file mode 100644
index 0000000..0c53445
--- /dev/null
+++ b/cobalt/worker/abstract_worker.h
@@ -0,0 +1,43 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_ABSTRACT_WORKER_H_
+#define COBALT_WORKER_ABSTRACT_WORKER_H_
+
+#include "cobalt/dom/event_target.h"
+#include "cobalt/dom/event_target_listener_info.h"
+#include "cobalt/script/environment_settings.h"
+
+namespace cobalt {
+namespace worker {
+
+// Implementation of Abstract Worker.
+//   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#abstractworker
+
+class AbstractWorker {
+ public:
+  virtual const dom::EventTargetListenerInfo::EventListenerScriptValue*
+  onerror() const = 0;
+  virtual void set_onerror(
+      const dom::EventTargetListenerInfo::EventListenerScriptValue&
+          event_listener) = 0;
+
+ protected:
+  virtual ~AbstractWorker() {}
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_ABSTRACT_WORKER_H_
diff --git a/cobalt/worker/abstract_worker.idl b/cobalt/worker/abstract_worker.idl
new file mode 100644
index 0000000..dc57887
--- /dev/null
+++ b/cobalt/worker/abstract_worker.idl
@@ -0,0 +1,19 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://html.spec.whatwg.org/#abstractworker
+
+[NoInterfaceObject] interface AbstractWorker {
+  attribute EventHandler onerror;
+};
diff --git a/cobalt/worker/dedicated_worker.cc b/cobalt/worker/dedicated_worker.cc
new file mode 100644
index 0000000..20e5ae3
--- /dev/null
+++ b/cobalt/worker/dedicated_worker.cc
@@ -0,0 +1,105 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/dedicated_worker.h"
+
+#include <memory>
+#include <string>
+
+#include "cobalt/browser/stack_size_constants.h"
+#include "cobalt/dom/event_target.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/worker/message_port.h"
+#include "cobalt/worker/worker.h"
+#include "cobalt/worker/worker_options.h"
+#include "url/gurl.h"
+
+namespace cobalt {
+namespace worker {
+
+namespace {
+const char kDedicatedWorkerName[] = "DedicatedWorker";
+}  // namespace
+
+DedicatedWorker::DedicatedWorker(script::EnvironmentSettings* settings,
+                                 const std::string& scriptURL)
+    : EventTarget(settings), settings_(settings), script_url_(scriptURL) {
+  Initialize();
+}
+
+DedicatedWorker::DedicatedWorker(script::EnvironmentSettings* settings,
+                                 const std::string& scriptURL,
+                                 const WorkerOptions& worker_options)
+    : EventTarget(settings),
+      settings_(settings),
+      script_url_(scriptURL),
+      worker_options_(worker_options) {
+  Initialize();
+}
+
+void DedicatedWorker::Initialize() {
+  // Algorithm for the Worker constructor.
+  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#dom-worker
+
+  // 1. The user agent may throw a "SecurityError" DOMException if the request
+  //    violates a policy decision (e.g. if the user agent is configured to
+  //    not
+  //    allow the page to start dedicated workers).
+  // 2. Let outside settings be the current settings object.
+  // 3. Parse the scriptURL argument relative to outside settings.
+  Worker::Options options(kDedicatedWorkerName);
+  const GURL& base_url = environment_settings()->base_url();
+  options.url = base_url.Resolve(script_url_);
+
+  LOG_IF(WARNING, !options.url.is_valid())
+      << script_url_ << " cannot be resolved based on " << base_url << ".";
+
+  // 4. If this fails, throw a "SyntaxError" DOMException.
+  // 5. Let worker URL be the resulting URL record.
+  options.web_options.stack_size = cobalt::browser::kWorkerStackSize;
+  options.web_options.network_module =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(settings_)
+          ->context()
+          ->network_module();
+  // 6. Let worker be a new Worker object.
+  worker_.reset(new Worker());
+  // 7. Let outside port be a new MessagePort in outside settings's Realm.
+  // 8. Associate the outside port with worker.
+  outside_port_ = new MessagePort(this, settings_);
+  // 9. Run this step in parallel:
+  //    1. Run a worker given worker, worker URL, outside settings, outside
+  //    port, and options.
+  options.outside_settings = settings_;
+  options.outside_port = outside_port_.get();
+  options.options = worker_options_;
+
+  worker_->Run(options);
+  // 10. Return worker.
+}
+
+DedicatedWorker::~DedicatedWorker() { Terminate(); }
+
+void DedicatedWorker::Terminate() {}
+
+// void postMessage(any message, object transfer);
+// -> void PostMessage(const script::ValueHandleHolder& message,
+//                     script::Sequence<script::ValueHandle*> transfer) {}
+void DedicatedWorker::PostMessage(const std::string& message) {
+  DCHECK(worker_);
+  worker_->PostMessage(message);
+}
+
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/dedicated_worker.h b/cobalt/worker/dedicated_worker.h
new file mode 100644
index 0000000..f35fc34
--- /dev/null
+++ b/cobalt/worker/dedicated_worker.h
@@ -0,0 +1,92 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_DEDICATED_WORKER_H_
+#define COBALT_WORKER_DEDICATED_WORKER_H_
+
+#include <memory>
+#include <string>
+
+#include "base/memory/scoped_refptr.h"
+#include "cobalt/dom/event_target.h"
+#include "cobalt/dom/event_target_listener_info.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/worker/abstract_worker.h"
+#include "cobalt/worker/message_port.h"
+#include "cobalt/worker/worker.h"
+#include "cobalt/worker/worker_options.h"
+
+namespace cobalt {
+namespace worker {
+
+// Implementation of Dedicated workers and the Worker interface.
+//   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#dedicated-workers-and-the-worker-interface
+class DedicatedWorker : public AbstractWorker, public dom::EventTarget {
+ public:
+  DedicatedWorker(script::EnvironmentSettings* settings,
+                  const std::string& scriptURL);
+  DedicatedWorker(script::EnvironmentSettings* settings,
+                  const std::string& scriptURL, const WorkerOptions& options);
+
+  // Web API: Worker
+  //
+  // This may help for adding support of 'object'
+  // void postMessage(any message, object transfer);
+  // -> void PostMessage(const script::ValueHandleHolder& message,
+  //                     script::Sequence<script::ValueHandle*> transfer) {}
+  void PostMessage(const std::string& message);
+
+  const EventListenerScriptValue* onmessage() const {
+    return GetAttributeEventListener(base::Tokens::message());
+  }
+  void set_onmessage(const EventListenerScriptValue& event_listener) {
+    SetAttributeEventListener(base::Tokens::message(), event_listener);
+  }
+
+  const EventListenerScriptValue* onmessageerror() const {
+    return GetAttributeEventListener(base::Tokens::messageerror());
+  }
+  void set_onmessageerror(const EventListenerScriptValue& event_listener) {
+    SetAttributeEventListener(base::Tokens::messageerror(), event_listener);
+  }
+
+  void Terminate();
+
+  // Web API: Abstract Worker
+  //
+  const EventListenerScriptValue* onerror() const override {
+    return GetAttributeEventListener(base::Tokens::error());
+  }
+  void set_onerror(const EventListenerScriptValue& event_listener) override {
+    SetAttributeEventListener(base::Tokens::error(), event_listener);
+  }
+
+  DEFINE_WRAPPABLE_TYPE(DedicatedWorker);
+
+ private:
+  ~DedicatedWorker() override;
+  void Initialize();
+  DISALLOW_COPY_AND_ASSIGN(DedicatedWorker);
+
+  script::EnvironmentSettings* settings_;
+  const std::string script_url_;
+  const WorkerOptions worker_options_;
+  scoped_refptr<MessagePort> outside_port_;
+  std::unique_ptr<Worker> worker_;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_DEDICATED_WORKER_H_
diff --git a/cobalt/worker/dedicated_worker_global_scope.cc b/cobalt/worker/dedicated_worker_global_scope.cc
new file mode 100644
index 0000000..e03ed19
--- /dev/null
+++ b/cobalt/worker/dedicated_worker_global_scope.cc
@@ -0,0 +1,77 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/dedicated_worker_global_scope.h"
+
+#include "cobalt/worker/worker_settings.h"
+
+namespace cobalt {
+namespace worker {
+DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope(
+    script::EnvironmentSettings* settings,
+    bool parent_cross_origin_isolated_capability)
+    : WorkerGlobalScope(settings), cross_origin_isolated_capability_(false) {
+  // Algorithm for 'run a worker'
+  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#run-a-worker
+  //     14.9. If is shared is false and owner's cross-origin isolated
+  //     capability is false, then set worker global scope's cross-origin
+  //     isolated capability to false.
+  if (!parent_cross_origin_isolated_capability) {
+    cross_origin_isolated_capability_ = false;
+  }
+}
+
+void DedicatedWorkerGlobalScope::Initialize() {
+  // Algorithm for 'run a worker'
+  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#run-a-worker
+  //     14.4. Initialize worker global scope's policy container given worker
+  //        global scope, response, and inside settings.
+  //     14.5. If the Run CSP initialization for a global object algorithm
+  //     returns
+  //        "Blocked" when executed upon worker global scope, set response to a
+  //        network error. [CSP]
+
+  //     14.6. If worker global scope's embedder policy's value is compatible
+  //     with
+  //        cross-origin isolation and is shared is true, then set agent's agent
+  //        cluster's cross-origin isolation mode to "logical" or "concrete".
+  //        The one chosen is implementation-defined.
+  //     No need for dedicated worker.
+
+  //     14.7. If the result of checking a global object's embedder policy with
+  //        worker global scope, outside settings, and response is false, then
+  //        set response to a network error.
+  //     14.8. Set worker global scope's cross-origin isolated capability to
+  //     true
+  //        if agent's agent cluster's cross-origin isolation mode is
+  //        "concrete".
+
+  //     14.10. If is shared is false and response's url's scheme is "data",
+  //     then
+  //         set worker global scope's cross-origin isolated capability to
+  //         false.
+  if (!Url().SchemeIs("data")) {
+    cross_origin_isolated_capability_ = false;
+  }
+}
+
+void DedicatedWorkerGlobalScope::PostMessage(const std::string& message) {
+  base::polymorphic_downcast<worker::WorkerSettings*>(environment_settings())
+      ->message_port()
+      ->PostMessage(message);
+}
+
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/dedicated_worker_global_scope.h b/cobalt/worker/dedicated_worker_global_scope.h
new file mode 100644
index 0000000..0252f27
--- /dev/null
+++ b/cobalt/worker/dedicated_worker_global_scope.h
@@ -0,0 +1,84 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_DEDICATED_WORKER_GLOBAL_SCOPE_H_
+#define COBALT_WORKER_DEDICATED_WORKER_GLOBAL_SCOPE_H_
+
+#include <string>
+
+#include "cobalt/base/tokens.h"
+#include "cobalt/dom/event_target.h"
+#include "cobalt/dom/event_target_listener_info.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/sequence.h"
+#include "cobalt/script/value_handle.h"
+#include "cobalt/script/wrappable.h"
+#include "cobalt/worker/worker_global_scope.h"
+
+namespace cobalt {
+namespace worker {
+
+// Implementation of Dedicated workers and the Worker interface.
+//   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#dedicated-workers-and-the-dedicatedworkerglobalscope-interface
+
+class DedicatedWorkerGlobalScope : public WorkerGlobalScope {
+ public:
+  explicit DedicatedWorkerGlobalScope(
+      script::EnvironmentSettings* settings,
+      bool parent_cross_origin_isolated_capability);
+
+  // Web API: DedicatedWorkerGlobalScope
+  //
+  void set_name(const std::string& name) { name_ = name; }
+  std::string name() { return name_; }
+
+  void Initialize() override;
+
+  void PostMessage(const std::string& message);
+  void Close() {}
+
+  const dom::EventTargetListenerInfo::EventListenerScriptValue* onmessage() {
+    return GetAttributeEventListener(base::Tokens::message());
+  }
+  void set_onmessage(
+      const dom::EventTargetListenerInfo::EventListenerScriptValue&
+          event_listener) {
+    SetAttributeEventListener(base::Tokens::message(), event_listener);
+  }
+  const dom::EventTargetListenerInfo::EventListenerScriptValue*
+  onmessageerror() {
+    return GetAttributeEventListener(base::Tokens::messageerror());
+  }
+  void set_onmessageerror(
+      const dom::EventTargetListenerInfo::EventListenerScriptValue&
+          event_listener) {
+    SetAttributeEventListener(base::Tokens::messageerror(), event_listener);
+  }
+
+  DEFINE_WRAPPABLE_TYPE(DedicatedWorkerGlobalScope);
+
+ protected:
+  ~DedicatedWorkerGlobalScope() override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DedicatedWorkerGlobalScope);
+  bool cross_origin_isolated_capability_;
+
+  std::string name_;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_DEDICATED_WORKER_GLOBAL_SCOPE_H_
diff --git a/cobalt/worker/dedicated_worker_global_scope.idl b/cobalt/worker/dedicated_worker_global_scope.idl
new file mode 100644
index 0000000..5f21e5f
--- /dev/null
+++ b/cobalt/worker/dedicated_worker_global_scope.idl
@@ -0,0 +1,31 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://html.spec.whatwg.org/multipage/workers.html#dedicated-workers-and-the-dedicatedworkerglobalscope-interface
+
+[Global] interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
+  [Replaceable] readonly attribute DOMString name;
+
+  void postMessage(USVString message);
+  // TODO: Support sequence<object>: b/218501774
+  // void postMessage(any message, sequence<object> transfer);
+  // TODO: Support overloads with dictionary parameter: b/218506730
+  // void postMessage(any message,
+  //                  optional StructuredSerializeOptions options = {});
+
+  void close();
+
+  attribute EventHandler onmessage;
+  attribute EventHandler onmessageerror;
+};
diff --git a/cobalt/worker/message_port.cc b/cobalt/worker/message_port.cc
new file mode 100644
index 0000000..8f77b63
--- /dev/null
+++ b/cobalt/worker/message_port.cc
@@ -0,0 +1,65 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/message_port.h"
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/message_loop/message_loop.h"
+#include "cobalt/dom/event.h"
+#include "cobalt/dom/event_target.h"
+#include "cobalt/dom/message_event.h"
+#include "cobalt/script/environment_settings.h"
+
+namespace cobalt {
+namespace worker {
+
+MessagePort::MessagePort(dom::EventTarget* event_target,
+                         script::EnvironmentSettings* settings)
+    : event_target_(event_target),
+      message_loop_(base::MessageLoop::current()),
+      settings_(settings) {}
+
+MessagePort::~MessagePort() {}
+
+void MessagePort::PostMessage(const std::string& messages) {
+  // TODO: Forward the location of the origating API call to the PostTask call.
+  if (message_loop_) {
+    //   https://html.spec.whatwg.org/multipage/workers.html#handler-worker-onmessage
+    // TODO: Update MessageEvent to support more types. (b/227665847)
+    // TODO: Remove dependency of MessageEvent on net iobuffer (b/227665847)
+    scoped_refptr<net::IOBufferWithSize> buf =
+        base::WrapRefCounted(new net::IOBufferWithSize(messages.length()));
+    memcpy(buf->data(), messages.data(), messages.length());
+    scoped_refptr<dom::MessageEvent> event(new dom::MessageEvent(
+        base::Tokens::message(), dom::MessageEvent::kText, buf));
+    message_loop_->task_runner()->PostTask(
+        FROM_HERE,
+        base::Bind(&MessagePort::DispatchEvent, base::Unretained(this), event));
+  }
+}
+
+void MessagePort::DispatchEvent(scoped_refptr<dom::MessageEvent> event) {
+  if (event_target_) event_target_->DispatchEvent(event);
+  LOG_IF(WARNING, !event_target_)
+      << "MessagePort event not dispatched because there is no EventTarget.";
+}
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/message_port.h b/cobalt/worker/message_port.h
new file mode 100644
index 0000000..0fabc1b
--- /dev/null
+++ b/cobalt/worker/message_port.h
@@ -0,0 +1,96 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_MESSAGE_PORT_H_
+#define COBALT_WORKER_MESSAGE_PORT_H_
+
+#include <string>
+
+#include "base/memory/weak_ptr.h"
+#include "base/message_loop/message_loop.h"
+#include "cobalt/base/tokens.h"
+#include "cobalt/dom/event_target.h"
+#include "cobalt/dom/event_target_listener_info.h"
+#include "cobalt/dom/message_event.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/sequence.h"
+#include "cobalt/script/value_handle.h"
+#include "cobalt/script/wrappable.h"
+
+namespace cobalt {
+namespace worker {
+
+class MessagePort : public script::Wrappable,
+                    public base::SupportsWeakPtr<MessagePort> {
+ public:
+  MessagePort(dom::EventTarget* event_target,
+              script::EnvironmentSettings* settings);
+  ~MessagePort();
+
+  // This may help for adding support of 'object'
+  // void postMessage(any message, object transfer);
+  // -> void PostMessage(const script::ValueHandleHolder& message,
+  //                     script::Sequence<script::ValueHandle*> transfer) {}
+  void PostMessage(const std::string& message);
+
+  void Start() {}
+  void Close() {}
+
+  const dom::EventTargetListenerInfo::EventListenerScriptValue* onmessage()
+      const {
+    return event_target_ ? event_target_->GetAttributeEventListener(
+                               base::Tokens::message())
+                         : nullptr;
+  }
+  void set_onmessage(
+      const dom::EventTargetListenerInfo::EventListenerScriptValue&
+          event_listener) {
+    if (event_target_)
+      event_target_->SetAttributeEventListener(base::Tokens::message(),
+                                               event_listener);
+  }
+
+  const dom::EventTargetListenerInfo::EventListenerScriptValue* onmessageerror()
+      const {
+    return event_target_ ? event_target_->GetAttributeEventListener(
+                               base::Tokens::messageerror())
+                         : nullptr;
+  }
+  void set_onmessageerror(
+      const dom::EventTargetListenerInfo::EventListenerScriptValue&
+          event_listener) {
+    if (event_target_)
+      event_target_->SetAttributeEventListener(base::Tokens::messageerror(),
+                                               event_listener);
+  }
+
+  void DispatchEvent(scoped_refptr<dom::MessageEvent> event);
+
+  DEFINE_WRAPPABLE_TYPE(MessagePort);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MessagePort);
+
+  // The event target to dispatch events to.
+  dom::EventTarget* event_target_ = nullptr;
+  // The message loop for posting event dispatches to.
+  base::MessageLoop* message_loop_ = nullptr;
+  // EnvironmentSettings of the event target.
+  script::EnvironmentSettings* settings_ = nullptr;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_MESSAGE_PORT_H_
diff --git a/cobalt/worker/message_port.idl b/cobalt/worker/message_port.idl
new file mode 100644
index 0000000..acacae8
--- /dev/null
+++ b/cobalt/worker/message_port.idl
@@ -0,0 +1,32 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://html.spec.whatwg.org/multipage/web-messaging.html#messageport
+// https://html.spec.whatwg.org/dev/web-messaging.html#message-ports
+interface MessagePort /* : EventTarget */ {
+  // [RaisesException]
+  void postMessage(USVString message);
+  // void postMessage(USVString message, sequence<USVString> transfer);
+  // TODO: Support sequence<object>: b/218501774
+  // void postMessage(any message, sequence<object> transfer);
+  // TODO: Support overloads with dictionary parameter: b/218506730
+  // void postMessage(any message, optional StructuredSerializeOptions
+  // options);
+  void start();
+  void close();
+
+  // event handlers
+  attribute EventHandler onmessage;
+  attribute EventHandler onmessageerror;
+  };
diff --git a/cobalt/worker/navigation_preload_manager.cc b/cobalt/worker/navigation_preload_manager.cc
new file mode 100644
index 0000000..d8ec15e
--- /dev/null
+++ b/cobalt/worker/navigation_preload_manager.cc
@@ -0,0 +1,76 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/navigation_preload_manager.h"
+
+#include <vector>
+
+#include "cobalt/dom/dom_exception.h"
+#include "cobalt/worker/service_worker_registration.h"
+
+namespace cobalt {
+namespace worker {
+
+NavigationPreloadManager::NavigationPreloadManager(
+    ServiceWorkerRegistration* registration,
+    script::ScriptValueFactory* script_value_factory)
+    : script_value_factory_(script_value_factory),
+      registration_(registration) {}
+
+script::Handle<script::Promise<void>> NavigationPreloadManager::Enable() {
+  return SetEnabled(true);
+}
+
+script::Handle<script::Promise<void>> NavigationPreloadManager::Disable() {
+  return SetEnabled(false);
+}
+
+script::Handle<script::Promise<void>> NavigationPreloadManager::SetHeaderValue(
+    std::vector<uint8_t> value) {
+  script::Handle<script::Promise<void>> promise =
+      script_value_factory_->CreateBasicPromise<void>();
+
+  if (registration_->active() == nullptr) {
+    promise->Reject(new dom::DOMException(dom::DOMException::kInvalidStateErr));
+    return promise;
+  }
+
+  registration_->SetNavigationPreloadHeader();
+  promise->Resolve();
+  return promise;
+}
+
+script::Handle<script::Promise<void>> NavigationPreloadManager::SetEnabled(
+    bool enable) {
+  script::Handle<script::Promise<void>> promise =
+      script_value_factory_->CreateBasicPromise<void>();
+  if (registration_->active() == nullptr) {
+    promise->Reject(new dom::DOMException(dom::DOMException::kInvalidStateErr));
+    return promise;
+  }
+  registration_->EnableNavigationPreload(enable);
+  promise->Resolve();
+  return promise;
+}
+
+script::Handle<NavigationPreloadManager::NavigationPreloadStatePromise>
+NavigationPreloadManager::GetState() {
+  // Todo: Implement getState logic
+  script::Handle<NavigationPreloadStatePromise> promise =
+      script_value_factory_->CreateInterfacePromise<NavigationPreloadState>();
+  return promise;
+}
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/navigation_preload_manager.h b/cobalt/worker/navigation_preload_manager.h
new file mode 100644
index 0000000..bbc226a
--- /dev/null
+++ b/cobalt/worker/navigation_preload_manager.h
@@ -0,0 +1,58 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_NAVIGATION_PRELOAD_MANAGER_H_
+#define COBALT_WORKER_NAVIGATION_PRELOAD_MANAGER_H_
+
+#include <memory>
+#include <vector>
+
+#include "cobalt/script/exception_state.h"
+#include "cobalt/script/promise.h"
+#include "cobalt/script/script_value.h"
+#include "cobalt/script/script_value_factory.h"
+#include "cobalt/script/wrappable.h"
+#include "cobalt/worker/navigation_preload_state.h"
+
+
+namespace cobalt {
+namespace worker {
+
+class ServiceWorkerRegistration;
+
+class NavigationPreloadManager final : public script::Wrappable {
+ public:
+  using NavigationPreloadStatePromise =
+      script::Promise<scoped_refptr<script::Wrappable>>;
+  NavigationPreloadManager(ServiceWorkerRegistration* registration,
+                           script::ScriptValueFactory* script_value_factory);
+
+  script::Handle<script::Promise<void>> Enable();
+  script::Handle<script::Promise<void>> Disable();
+  script::Handle<script::Promise<void>> SetHeaderValue(
+      std::vector<uint8_t> value);
+  script::Handle<NavigationPreloadStatePromise> GetState();
+
+  DEFINE_WRAPPABLE_TYPE(NavigationPreloadManager);
+
+ private:
+  ServiceWorkerRegistration* registration_;
+  script::Handle<script::Promise<void>> SetEnabled(bool enable);
+  script::ScriptValueFactory* script_value_factory_;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_NAVIGATION_PRELOAD_MANAGER_H_
diff --git a/cobalt/worker/navigation_preload_manager.idl b/cobalt/worker/navigation_preload_manager.idl
new file mode 100644
index 0000000..5a05303
--- /dev/null
+++ b/cobalt/worker/navigation_preload_manager.idl
@@ -0,0 +1,22 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://w3c.github.io/ServiceWorker/#navigation-preload-manager
+
+[Exposed = (Window, ServiceWorker)] interface NavigationPreloadManager {
+  Promise<void> enable();
+  Promise<void> disable();
+  Promise<void> setHeaderValue(ByteString value);
+  Promise<NavigationPreloadState> getState();
+};
diff --git a/cobalt/worker/navigation_preload_state.idl b/cobalt/worker/navigation_preload_state.idl
new file mode 100644
index 0000000..304f0f6
--- /dev/null
+++ b/cobalt/worker/navigation_preload_state.idl
@@ -0,0 +1,19 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://w3c.github.io/ServiceWorker/#navigation-preload-manager
+dictionary NavigationPreloadState {
+  boolean enabled = false;
+  ByteString headerValue;
+};
diff --git a/cobalt/worker/registration_options.idl b/cobalt/worker/registration_options.idl
new file mode 100644
index 0000000..4dc3b4c
--- /dev/null
+++ b/cobalt/worker/registration_options.idl
@@ -0,0 +1,20 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://w3c.github.io/ServiceWorker/#dictdef-registrationoptions
+dictionary RegistrationOptions {
+    USVString scope;
+    WorkerType type = "classic";
+    ServiceWorkerUpdateViaCache updateViaCache = "imports";
+};
diff --git a/cobalt/worker/service_worker.cc b/cobalt/worker/service_worker.cc
new file mode 100644
index 0000000..471d60a
--- /dev/null
+++ b/cobalt/worker/service_worker.cc
@@ -0,0 +1,29 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/service_worker.h"
+#include "cobalt/worker/service_worker_object.h"
+
+#include <memory>
+#include <utility>
+
+namespace cobalt {
+namespace worker {
+
+ServiceWorker::ServiceWorker(script::EnvironmentSettings* settings,
+                             worker::ServiceWorkerObject* worker)
+    : dom::EventTarget(settings), worker_(worker), state_(worker->state()) {}
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/service_worker.h b/cobalt/worker/service_worker.h
new file mode 100644
index 0000000..8896c73
--- /dev/null
+++ b/cobalt/worker/service_worker.h
@@ -0,0 +1,77 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_SERVICE_WORKER_H_
+#define COBALT_WORKER_SERVICE_WORKER_H_
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "cobalt/dom/event_target.h"
+#include "cobalt/dom/event_target_listener_info.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/wrappable.h"
+#include "cobalt/worker/abstract_worker.h"
+#include "cobalt/worker/service_worker_object.h"
+#include "cobalt/worker/service_worker_state.h"
+
+namespace cobalt {
+namespace worker {
+
+// The ServiceWorker interface represents a service worker within a service
+// worker client realm.
+//   https://w3c.github.io/ServiceWorker/#serviceworker-interface
+class ServiceWorker : public AbstractWorker, public dom::EventTarget {
+ public:
+  ServiceWorker(script::EnvironmentSettings* settings,
+                worker::ServiceWorkerObject* worker);
+
+  // The scriptURL getter steps are to return the
+  // service worker's serialized script url.
+  std::string script_url() const { return script_url_; }
+  ServiceWorkerState state() const { return state_; }
+
+  const EventListenerScriptValue* onstatechange() const {
+    return GetAttributeEventListener(base::Tokens::statechange());
+  }
+  void set_onstatechange(const EventListenerScriptValue& event_listener) {
+    SetAttributeEventListener(base::Tokens::statechange(), event_listener);
+  }
+
+  // Web API: Abstract Worker
+  //
+  const EventListenerScriptValue* onerror() const override {
+    return GetAttributeEventListener(base::Tokens::error());
+  }
+  void set_onerror(const EventListenerScriptValue& event_listener) override {
+    SetAttributeEventListener(base::Tokens::error(), event_listener);
+  }
+
+  DEFINE_WRAPPABLE_TYPE(ServiceWorker);
+
+ private:
+  ~ServiceWorker() override = default;
+  DISALLOW_COPY_AND_ASSIGN(ServiceWorker);
+
+  worker::ServiceWorkerObject* worker_;
+
+  const std::string script_url_;
+  ServiceWorkerState state_;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_SERVICE_WORKER_H_
diff --git a/cobalt/worker/service_worker.idl b/cobalt/worker/service_worker.idl
new file mode 100644
index 0000000..e9b73a4
--- /dev/null
+++ b/cobalt/worker/service_worker.idl
@@ -0,0 +1,30 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://w3c.github.io/ServiceWorker/#serviceworker-interface
+
+[Exposed = (Window, ServiceWorker)] interface ServiceWorker : EventTarget {
+
+  // Todo: Implement postMessage b/219986442
+  // void postMessage(any message, sequence<object> transfer);
+  // void postMessage(any message, optional PostMessageOptions options = {});
+
+  readonly attribute USVString scriptURL;
+  readonly attribute ServiceWorkerState state;
+
+  // event
+  attribute EventHandler onstatechange;
+};
+
+ServiceWorker implements AbstractWorker;
diff --git a/cobalt/worker/service_worker_container.cc b/cobalt/worker/service_worker_container.cc
index 7b47b46..22fe76f 100644
--- a/cobalt/worker/service_worker_container.cc
+++ b/cobalt/worker/service_worker_container.cc
@@ -14,19 +14,199 @@
 
 #include "cobalt/worker/service_worker_container.h"
 
+#include <string>
+#include <utility>
+
+#include "base/optional.h"
+#include "base/trace_event/trace_event.h"
+#include "cobalt/dom/dom_exception.h"
+#include "cobalt/dom/dom_settings.h"
+#include "cobalt/script/promise.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
+#include "cobalt/worker/registration_options.h"
+#include "cobalt/worker/service_worker_update_via_cache.h"
+#include "cobalt/worker/worker_type.h"
+#include "url/gurl.h"
+
 namespace cobalt {
 namespace worker {
 
 ServiceWorkerContainer::ServiceWorkerContainer(
-    script::ScriptValueFactory* script_value_factory)
-    : script_value_factory_(script_value_factory) {}
+    script::EnvironmentSettings* settings,
+    worker::ServiceWorkerJobs* service_worker_jobs)
+    : dom::EventTarget(settings) {}
 
-script::Handle<script::Promise<void>> ServiceWorkerContainer::Register() {
-  LOG(INFO) << "The service worker is registered";
-  script::Handle<script::Promise<void>> promise =
-      script_value_factory_->CreateBasicPromise<void>();
+// TODO: Implement the service worker ready algorithm. b/219972966
+script::Handle<script::PromiseWrappable> ServiceWorkerContainer::ready() {
+  // https://w3c.github.io/ServiceWorker/#navigator-service-worker-ready
+  // 1. If this's ready promise is null, then set this's ready promise to a new
+  // promise.
+  // 2. Let readyPromise be this's ready promise.
+  // 3. If readyPromise is pending, run the following substeps in parallel:
+  //    1. Let registration be the result of running Match Service Worker
+  //    Registration with this's service worker client's creation URL.
+  //    2. If registration is not null, and registration’s active worker is not
+  //    null, queue a task on readyPromise’s relevant settings object's
+  //    responsible event loop, using the DOM manipulation task source, to
+  //    resolve readyPromise with the result of getting the service worker
+  //    registration object that represents registration in readyPromise’s
+  //    relevant settings object.
+  // 4. Return readyPromise.
+  auto promise =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings())
+          ->context()
+          ->global_environment()
+          ->script_value_factory()
+          ->CreateInterfacePromise<scoped_refptr<ServiceWorkerRegistration>>();
   return promise;
 }
 
+script::Handle<script::PromiseWrappable> ServiceWorkerContainer::Register(
+    const std::string& url) {
+  RegistrationOptions options;
+  return ServiceWorkerContainer::Register(url, options);
+}
+
+script::Handle<script::PromiseWrappable> ServiceWorkerContainer::Register(
+    const std::string& url, const RegistrationOptions& options) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerContainer::Register()");
+  // https://w3c.github.io/ServiceWorker/#navigator-service-worker-register
+  // 1. Let p be a promise.
+  script::HandlePromiseWrappable promise =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings())
+          ->context()
+          ->global_environment()
+          ->script_value_factory()
+          ->CreateInterfacePromise<scoped_refptr<ServiceWorkerRegistration>>();
+  std::unique_ptr<script::ValuePromiseWrappable::Reference> promise_reference(
+      new script::ValuePromiseWrappable::Reference(this, promise));
+
+  // 2. Let client be this's service worker client.
+  web::EnvironmentSettings* client =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings());
+  // 3. Let scriptURL be the result of parsing scriptURL with this's
+  // relevant settings object’s API base URL.
+  const GURL& base_url = environment_settings()->base_url();
+  GURL script_url = base_url.Resolve(url);
+  // 4. Let scopeURL be null.
+  base::Optional<GURL> scope_url;
+  // 5. If options["scope"] exists, set scopeURL to the result of parsing
+  //    options["scope"] with this's relevant settings object’s API base URL.
+  if (options.has_scope()) {
+    scope_url = base_url.Resolve(options.scope());
+  }
+  // 6. Invoke Start Register with scopeURL, scriptURL, p, client, client’s
+  //    creation URL, options["type"], and options["updateViaCache"].
+  base::polymorphic_downcast<web::EnvironmentSettings*>(environment_settings())
+      ->context()
+      ->message_loop()
+      ->task_runner()
+      ->PostTask(
+          FROM_HERE,
+          base::BindOnce(
+              &ServiceWorkerJobs::StartRegister,
+              base::Unretained(base::polymorphic_downcast<dom::DOMSettings*>(
+                                   environment_settings())
+                                   ->service_worker_jobs()),
+              scope_url, script_url, std::move(promise_reference), client,
+              options.type(), options.update_via_cache()));
+  // 7. Return p.
+  return promise;
+}
+
+script::Handle<script::PromiseWrappable>
+ServiceWorkerContainer::GetRegistration(const std::string& url) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerContainer::GetRegistration()");
+  // https://w3c.github.io/ServiceWorker/#navigator-service-worker-getRegistration
+  // 1. Let client be this's service worker client.
+  web::EnvironmentSettings* client =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings());
+  // 2. Let clientURL be the result of parsing clientURL with this's relevant
+  //    settings object’s API base URL.
+  const GURL& base_url = environment_settings()->base_url();
+  GURL client_url = base_url.Resolve(url);
+
+  // 3. If clientURL is failure, return a promise rejected with a TypeError.
+  auto promise =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings())
+          ->context()
+          ->global_environment()
+          ->script_value_factory()
+          ->CreateInterfacePromise<scoped_refptr<ServiceWorkerRegistration>>();
+  if (client_url.is_empty()) {
+    promise->Reject(script::kTypeError);
+    return promise;
+  }
+
+  // 4. Set clientURL’s fragment to null.
+  url::Replacements<char> replacements;
+  replacements.ClearRef();
+  client_url = client_url.ReplaceComponents(replacements);
+  DCHECK(!client_url.has_ref() || client_url.ref().empty());
+
+  // 5. If the origin of clientURL is not client’s origin, return a promise
+  //    rejected with a "SecurityError" DOMException.
+  if (client_url.GetOrigin() != base_url.GetOrigin()) {
+    promise->Reject(new dom::DOMException(dom::DOMException::kSecurityErr));
+    return promise;
+  }
+
+  // 6. Let promise be a new promise.
+  // 7. Run the following substeps in parallel:
+  //    1. Let registration be the result of running Match Service Worker
+  //       Registration algorithm with clientURL as its argument.
+  // TODO handle parallelism, and add callback to resolve the promise.
+  base::polymorphic_downcast<dom::DOMSettings*>(environment_settings())
+      ->service_worker_jobs()
+      ->MatchServiceWorkerRegistration(client_url);
+  //    2. If registration is null, resolve promise with undefined and abort
+  //       these steps.
+  //    3. Resolve promise with the result of getting the service worker
+  //       registration object that represents registration in promise’s
+  //       relevant settings object.
+  // 8. Return promise.
+  return promise;
+}
+
+script::Handle<script::PromiseSequenceWrappable>
+ServiceWorkerContainer::GetRegistrations() {
+  // https://w3c.github.io/ServiceWorker/#navigator-service-worker-getRegistrations
+  // 1. Let client be this's service worker client.
+  // 2. Let promise be a new promise.
+  // 3. Run the following steps in parallel:
+  //    1. Let registrations be a new list.
+  //    2. For each scope → registration of scope to registration map:
+  //       1. If the origin of the result of parsing scope is the same as
+  //          client’s origin, then append registration to registrations.
+  //    3. Queue a task on promise’s relevant settings object's responsible
+  //       event loop, using the DOM manipulation task source, to run the
+  //       following steps:
+  //       1. Let registrationObjects be a new list.
+  //       2. For each registration of registrations:
+  //          1. Let registrationObj be the result of getting the service worker
+  //             registration object that represents registration in promise’s
+  //             relevant settings object.
+  //          2. Append registrationObj to registrationObjects.
+  //       3. Resolve promise with a new frozen array of registrationObjects in
+  //          promise’s relevant Realm.
+  // 4. Return promise.
+  auto promise = base::polymorphic_downcast<web::EnvironmentSettings*>(
+                     environment_settings())
+                     ->context()
+                     ->global_environment()
+                     ->script_value_factory()
+                     ->CreateBasicPromise<script::SequenceWrappable>();
+
+  return promise;
+}
+
+void ServiceWorkerContainer::StartMessages() {}
+
 }  // namespace worker
 }  // namespace cobalt
diff --git a/cobalt/worker/service_worker_container.h b/cobalt/worker/service_worker_container.h
index ed523f8..5092a96 100644
--- a/cobalt/worker/service_worker_container.h
+++ b/cobalt/worker/service_worker_container.h
@@ -16,26 +16,70 @@
 #define COBALT_WORKER_SERVICE_WORKER_CONTAINER_H_
 
 #include <memory>
+#include <string>
 
+#include "cobalt/dom/event_target.h"
+#include "cobalt/dom/event_target_listener_info.h"
 #include "cobalt/script/promise.h"
 #include "cobalt/script/script_value.h"
 #include "cobalt/script/script_value_factory.h"
+#include "cobalt/script/sequence.h"
 #include "cobalt/script/wrappable.h"
+#include "cobalt/worker/registration_options.h"
+#include "cobalt/worker/service_worker_jobs.h"
+#include "cobalt/worker/service_worker_registration.h"
 
 namespace cobalt {
 namespace worker {
 
-class ServiceWorkerContainer : public script::Wrappable {
+// The ServiceWorkerContainer interface represents the interface to register and
+// access service workers from a service worker client realm.
+//   https://w3c.github.io/ServiceWorker/#serviceworkercontainer-interface
+class ServiceWorkerContainer : public dom::EventTarget {
  public:
-  explicit ServiceWorkerContainer(
-      script::ScriptValueFactory* script_value_factory);
+  ServiceWorkerContainer(script::EnvironmentSettings* settings,
+                         worker::ServiceWorkerJobs* service_worker_jobs);
 
-  script::Handle<script::Promise<void>> Register();
+  scoped_refptr<ServiceWorker> controller() { return controller_; }
+  script::Handle<script::PromiseWrappable> ready();
+
+  script::Handle<script::PromiseWrappable> Register(const std::string& url);
+  script::Handle<script::PromiseWrappable> Register(
+      const std::string& url, const RegistrationOptions& options);
+  script::Handle<script::PromiseWrappable> GetRegistration(
+      const std::string& url);
+  script::Handle<script::PromiseSequenceWrappable> GetRegistrations();
+
+  void StartMessages();
+
+  const EventListenerScriptValue* oncontrollerchange() const {
+    return GetAttributeEventListener(base::Tokens::controllerchange());
+  }
+  void set_oncontrollerchange(const EventListenerScriptValue& event_listener) {
+    SetAttributeEventListener(base::Tokens::controllerchange(), event_listener);
+  }
+
+  const EventListenerScriptValue* onmessage() const {
+    return GetAttributeEventListener(base::Tokens::message());
+  }
+  void set_onmessage(const EventListenerScriptValue& event_listener) {
+    SetAttributeEventListener(base::Tokens::message(), event_listener);
+  }
+
+  const EventListenerScriptValue* onmessageerror() const {
+    return GetAttributeEventListener(base::Tokens::messageerror());
+  }
+  void set_onmessageerror(const EventListenerScriptValue& event_listener) {
+    SetAttributeEventListener(base::Tokens::messageerror(), event_listener);
+  }
 
   DEFINE_WRAPPABLE_TYPE(ServiceWorkerContainer);
 
  private:
-  script::ScriptValueFactory* script_value_factory_;
+  scoped_refptr<ServiceWorker> controller_;
+  scoped_refptr<ServiceWorker> ready_;
+
+  ~ServiceWorkerContainer() override = default;
 };
 
 }  // namespace worker
diff --git a/cobalt/worker/service_worker_container.idl b/cobalt/worker/service_worker_container.idl
index 170e226..17a22d4 100644
--- a/cobalt/worker/service_worker_container.idl
+++ b/cobalt/worker/service_worker_container.idl
@@ -14,7 +14,19 @@
 
 // https://w3c.github.io/ServiceWorker/#serviceworkercontainer-interface
 
-[Exposed=Window]
-interface ServiceWorkerContainer {
-    Promise<void> register();
+[Exposed = Window] interface ServiceWorkerContainer : EventTarget {
+  readonly attribute ServiceWorker ? controller;
+  readonly attribute Promise<ServiceWorkerRegistration> ready;
+
+  Promise<ServiceWorkerRegistration> register(
+      USVString url, optional RegistrationOptions options);
+  Promise<ServiceWorkerRegistration> getRegistration(
+      optional USVString documentURL = "");
+  Promise<sequence<ServiceWorkerRegistration>> getRegistrations();
+
+  void startMessages();
+
+  attribute EventHandler oncontrollerchange;
+  attribute EventHandler onmessage;
+  attribute EventHandler onmessageerror;
 };
diff --git a/cobalt/worker/service_worker_jobs.cc b/cobalt/worker/service_worker_jobs.cc
new file mode 100644
index 0000000..9c98b6f
--- /dev/null
+++ b/cobalt/worker/service_worker_jobs.cc
@@ -0,0 +1,772 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/service_worker_jobs.h"
+
+#include <map>
+#include <memory>
+#include <queue>
+#include <string>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/message_loop/message_loop.h"
+#include "base/synchronization/lock.h"
+#include "base/trace_event/trace_event.h"
+#include "cobalt/dom/dom_exception.h"
+#include "cobalt/network/network_module.h"
+#include "cobalt/script/promise.h"
+#include "cobalt/script/script_exception.h"
+#include "cobalt/script/script_value.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
+#include "cobalt/worker/service_worker.h"
+#include "cobalt/worker/service_worker_registration.h"
+#include "cobalt/worker/service_worker_update_via_cache.h"
+#include "cobalt/worker/worker_type.h"
+#include "net/base/url_util.h"
+#include "url/gurl.h"
+#include "url/origin.h"
+
+namespace cobalt {
+namespace worker {
+
+namespace {
+bool PathContainsEscapedSlash(const GURL& url) {
+  const std::string path = url.path();
+  return (path.find("%2f") != std::string::npos ||
+          path.find("%2F") != std::string::npos ||
+          path.find("%5c") != std::string::npos ||
+          path.find("%5C") != std::string::npos);
+}
+
+bool IsOriginPotentiallyTrustworthy(const GURL& url) {
+  // Algorithm for 'potentially trustworthy origin'.
+  //   https://w3c.github.io/webappsec-secure-contexts/#potentially-trustworthy-origin
+
+  const url::Origin origin(url::Origin::Create(url));
+  // 1. If origin is an opaque origin, return "Not Trustworthy".
+  if (origin.unique()) return false;
+
+  // 2. Assert: origin is a tuple origin.
+  DCHECK(!origin.unique());
+  DCHECK(url.is_valid());
+
+  // 3. If origin’s scheme is either "https" or "wss", return "Potentially
+  // Trustworthy".
+  if (url.SchemeIsCryptographic()) return true;
+
+  // 4. If origin’s host matches one of the CIDR notations 127.0.0.0/8 or
+  // ::1/128 [RFC4632], return "Potentially Trustworthy".
+  if (net::IsLocalhost(url)) return true;
+
+  // 5. If the user agent conforms to the name resolution rules in
+  // [let-localhost-be-localhost] and one of the following is true:
+  //    origin’s host is "localhost" or "localhost."
+  //    origin’s host ends with ".localhost" or ".localhost."
+  // then return "Potentially Trustworthy".
+  // Covered by implementation of step 4.
+
+  // 6. If origin’s scheme is "file", return "Potentially Trustworthy".
+  if (url.SchemeIsFile()) return true;
+
+  // 7. If origin’s scheme component is one which the user agent considers to be
+  // authenticated, return "Potentially Trustworthy".
+  if (url.SchemeIs("h5vcc-embedded")) return true;
+
+  // 8. If origin has been configured as a trustworthy origin, return
+  // "Potentially Trustworthy".
+
+  // 9. Return "Not Trustworthy".
+  return false;
+}
+
+// Returns the serialized URL excluding the fragment.
+std::string SerializeExcludingFragment(const GURL& url) {
+  url::Replacements<char> replacements;
+  replacements.ClearRef();
+  GURL no_fragment_url = url.ReplaceComponents(replacements);
+  DCHECK(!no_fragment_url.has_ref() || no_fragment_url.ref().empty());
+  DCHECK(!no_fragment_url.is_empty());
+  return no_fragment_url.spec();
+}
+}  // namespace
+
+ServiceWorkerJobs::ServiceWorkerJobs(network::NetworkModule* network_module,
+                                     base::MessageLoop* message_loop)
+    : network_module_(network_module), message_loop_(message_loop) {}
+
+ServiceWorkerJobs::~ServiceWorkerJobs() {}
+
+void ServiceWorkerJobs::StartRegister(
+    const base::Optional<GURL>& maybe_scope_url,
+    const GURL& script_url_with_fragment,
+    std::unique_ptr<script::ValuePromiseWrappable::Reference> promise_reference,
+    web::EnvironmentSettings* client, const WorkerType& type,
+    const ServiceWorkerUpdateViaCache& update_via_cache) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::StartRegister()");
+  // Algorithm for "Start Register":
+  //   https://w3c.github.io/ServiceWorker/#start-register-algorithm
+  // 1. If scriptURL is failure, reject promise with a TypeError and abort these
+  // steps.
+  if (script_url_with_fragment.is_empty()) {
+    promise_reference->value().Reject(script::kTypeError);
+    return;
+  }
+
+  // 2. Set scriptURL’s fragment to null.
+  url::Replacements<char> replacements;
+  replacements.ClearRef();
+  GURL script_url = script_url_with_fragment.ReplaceComponents(replacements);
+  DCHECK(!script_url.has_ref() || script_url.ref().empty());
+  DCHECK(!script_url.is_empty());
+
+  // 3. If scriptURL’s scheme is not one of "http" and "https", reject promise
+  // with a TypeError and abort these steps.
+  if (!script_url.SchemeIsHTTPOrHTTPS()) {
+    promise_reference->value().Reject(script::kTypeError);
+    return;
+  }
+
+  // 4. If any of the strings in scriptURL’s path contains either ASCII
+  // case-insensitive "%2f" or ASCII case-insensitive "%5c", reject promise with
+  // a TypeError and abort these steps.
+  if (PathContainsEscapedSlash(script_url)) {
+    promise_reference->value().Reject(script::kTypeError);
+    return;
+  }
+
+  // 5. If scopeURL is null, set scopeURL to the result of parsing the string
+  // "./" with scriptURL.
+  GURL scope_url = maybe_scope_url.value_or(script_url.Resolve("./"));
+
+  // 6. If scopeURL is failure, reject promise with a TypeError and abort these
+  // steps.
+  if (scope_url.is_empty()) {
+    promise_reference->value().Reject(script::kTypeError);
+    return;
+  }
+
+  // 7. Set scopeURL’s fragment to null.
+  scope_url = scope_url.ReplaceComponents(replacements);
+  DCHECK(!scope_url.has_ref() || scope_url.ref().empty());
+  DCHECK(!scope_url.is_empty());
+
+  // 8. If scopeURL’s scheme is not one of "http" and "https", reject promise
+  // with a TypeError and abort these steps.
+  if (!scope_url.SchemeIsHTTPOrHTTPS()) {
+    promise_reference->value().Reject(script::kTypeError);
+    return;
+  }
+
+  // 9. If any of the strings in scopeURL’s path contains either ASCII
+  // case-insensitive "%2f" or ASCII case-insensitive "%5c", reject promise with
+  // a TypeError and abort these steps.
+  if (PathContainsEscapedSlash(scope_url)) {
+    promise_reference->value().Reject(script::kTypeError);
+    return;
+  }
+
+  // 10. Let storage key be the result of running obtain a storage key given
+  // client.
+  url::Origin storage_key = url::Origin::Create(client->creation_url());
+
+  // 11. Let job be the result of running Create Job with register, storage key,
+  // scopeURL, scriptURL, promise, and client.
+  std::unique_ptr<Job> job =
+      CreateJob(kRegister, storage_key, scope_url, script_url,
+                JobPromiseType::Create(std::move(promise_reference)), client);
+  DCHECK(!promise_reference);
+
+  // 12. Set job’s worker type to workerType.
+  // Cobalt only supports 'classic' worker type.
+
+  // 13. Set job’s update via cache mode to updateViaCache.
+  job->update_via_cache = update_via_cache;
+
+  // 14. Set job’s referrer to referrer.
+  // This is the same value as set in CreateJob().
+
+  // 15. Invoke Schedule Job with job.
+  message_loop()->task_runner()->PostTask(
+      FROM_HERE, base::Bind(&ServiceWorkerJobs::ScheduleJob,
+                            base::Unretained(this), base::Passed(&job)));
+  DCHECK(!job.get());
+}
+
+void ServiceWorkerJobs::MatchServiceWorkerRegistration(const GURL& client_url) {
+  TRACE_EVENT0("cobalt::worker",
+               "ServiceWorkerJobs::MatchServiceWorkerRegistration()");
+  // TODO this need a callback to return the matching registration.
+  NOTIMPLEMENTED();
+}
+
+void ServiceWorkerJobs::PromiseErrorData::Reject(
+    std::unique_ptr<JobPromiseType> promise) const {
+  if (message_type_ != script::kNoError) {
+    promise->Reject(GetSimpleExceptionType(message_type_));
+  } else {
+    promise->Reject(new dom::DOMException(exception_code_, message_));
+  }
+}
+
+std::unique_ptr<ServiceWorkerJobs::Job> ServiceWorkerJobs::CreateJob(
+    JobType type, const url::Origin& storage_key, const GURL& scope_url,
+    const GURL& script_url, std::unique_ptr<JobPromiseType> promise,
+    web::EnvironmentSettings* client) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::CreateJob()");
+  // Algorithm for "Create Job":
+  //   https://w3c.github.io/ServiceWorker/#create-job
+  // 1. Let job be a new job.
+  // 2. Set job’s job type to jobType.
+  // 3. Set job’s storage key to storage key.
+  // 4. Set job’s scope url to scopeURL.
+  // 5. Set job’s script url to scriptURL.
+  // 6. Set job’s job promise to promise.
+  // 7. Set job’s client to client.
+  std::unique_ptr<Job> job(new Job(kRegister, storage_key, scope_url,
+                                   script_url, std::move(promise), client));
+  // 8. If client is not null, set job’s referrer to client’s creation URL.
+  if (client) {
+    job->referrer = client->creation_url();
+  }
+  // 9. Return job.
+  return job;
+}
+
+void ServiceWorkerJobs::ScheduleJob(std::unique_ptr<Job> job) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::ScheduleJob()");
+  DCHECK_EQ(base::MessageLoop::current(), message_loop());
+  DCHECK(job);
+  // Algorithm for "Schedule Job":
+  //   https://w3c.github.io/ServiceWorker/#schedule-job
+  // 1. Let jobQueue be null.
+
+  // 2. Let jobScope be job’s scope url, serialized.
+  std::string job_scope = job->scope_url.spec();
+
+  // 3. If scope to job queue map[jobScope] does not exist, set scope to job
+  // queue map[jobScope] to a new job queue.
+  if (job_queue_map_.find(job_scope) == job_queue_map_.end()) {
+    auto insertion = job_queue_map_.emplace(
+        job_scope, std::unique_ptr<JobQueue>(new JobQueue()));
+    DCHECK(insertion.second);
+  }
+
+  // 4. Set jobQueue to scope to job queue map[jobScope].
+  DCHECK(job_queue_map_.find(job_scope) != job_queue_map_.end());
+  JobQueue* job_queue = job_queue_map_.find(job_scope)->second.get();
+
+  // 5. If jobQueue is empty, then:
+  if (job_queue->empty()) {
+    // 5.1. Set job’s containing job queue to jobQueue, and enqueue job to
+    // jobQueue.
+    job->containing_job_queue = job_queue;
+    job_queue->Enqueue(std::move(job));
+
+    // 5.2. Invoke Run Job with jobQueue.
+    RunJob(job_queue);
+
+  } else {
+    // 6. Else:
+    // 6.1. Let lastJob be the element at the back of jobQueue.
+    {
+      auto last_item = job_queue->LastItem();
+      Job* last_job = last_item.first;
+
+      // 6.2. If job is equivalent to lastJob and lastJob’s job promise has not
+      // settled, append job to lastJob’s list of equivalent jobs.
+      DCHECK(last_job);
+      base::AutoLock lock(last_job->equivalent_jobs_promise_mutex);
+      if (EquivalentJobs(job.get(), last_job) && last_job->promise &&
+          last_job->promise->State() == script::PromiseState::kPending) {
+        last_job->equivalent_jobs.push_back(std::move(job));
+        return;
+      }
+    }
+
+    // 6.3. Else, set job’s containing job queue to jobQueue, and enqueue job to
+    // jobQueue.
+    job->containing_job_queue = job_queue;
+    job_queue->Enqueue(std::move(job));
+  }
+  DCHECK(!job);
+}
+
+bool ServiceWorkerJobs::EquivalentJobs(Job* one, Job* two) {
+  // Algorithm for 'Two jobs are equivalent'
+  //   https://w3c.github.io/ServiceWorker/#dfn-job-equivalent
+  DCHECK(one);
+  DCHECK(two);
+  if (!one || !two) {
+    return false;
+  }
+
+  // Two jobs are equivalent when their job type is the same and:
+  if (one->type != two->type) {
+    return false;
+  }
+
+  // For register and update jobs, their scope url, script url, worker type, and
+  // update via cache mode are the same.
+  if ((one->type == kRegister || one->type == kUpdate) &&
+      (one->scope_url == two->scope_url) &&
+      (one->script_url == two->script_url) &&
+      (one->update_via_cache == two->update_via_cache)) {
+    return true;
+  }
+
+  // For unregister jobs, their scope url is the same.
+  return (one->type == kUnregister) && (one->scope_url == two->scope_url);
+}
+
+void ServiceWorkerJobs::RunJob(JobQueue* job_queue) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::RunJob()");
+  DCHECK_EQ(base::MessageLoop::current(), message_loop());
+  // Algorithm for "Run Job":
+  //   https://w3c.github.io/ServiceWorker/#run-job-algorithm
+
+  // 1. Assert: jobQueue is not empty.
+  DCHECK(job_queue && !job_queue->empty());
+  if (!job_queue || job_queue->empty()) {
+    return;
+  }
+
+  // 2. Queue a task to run these steps:
+  message_loop()->task_runner()->PostTask(
+      FROM_HERE, base::Bind(&ServiceWorkerJobs::RunJobTask,
+                            base::Unretained(this), job_queue));
+}
+
+void ServiceWorkerJobs::RunJobTask(JobQueue* job_queue) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::RunJobTask()");
+  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  // Task for "Run Job" to run in the service worker thread.
+  //   https://w3c.github.io/ServiceWorker/#run-job-algorithm
+  DCHECK(job_queue);
+  if (!job_queue) return;
+  DCHECK(!job_queue->empty());
+
+  // 2.1 Let job be the first item in jobQueue.
+  Job* job = job_queue->FirstItem();
+
+  DCHECK(job);
+  switch (job->type) {
+    // 2.2 If job’s job type is register, run Register with job in parallel.
+    case kRegister:
+      Register(job);
+      break;
+
+    // 2.3 Else if job’s job type is update, run Update with job in parallel.
+    case kUpdate:
+      Update(job);
+      break;
+
+    // 2.4 Else if job’s job type is unregister, run Unregister with job in
+    // parallel.
+    case kUnregister:
+      Unregister(job);
+      break;
+    default:
+      NOTREACHED();
+  }
+}
+
+void ServiceWorkerJobs::Register(Job* job) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::Register()");
+  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(job);
+  // Algorithm for "Register"
+  //   https://w3c.github.io/ServiceWorker/#register-algorithm
+
+  // 1. If the result of running potentially trustworthy origin with the origin
+  // of job’s script url as the argument is Not Trusted, then:
+  if (!IsOriginPotentiallyTrustworthy(job->script_url)) {
+    // 1.1. Invoke Reject Job Promise with job and "SecurityError" DOMException.
+    RejectJobPromise(
+        job, PromiseErrorData(
+                 dom::DOMException::kSecurityErr,
+                 "Service Worker Register failed: Script URL is Not Trusted."));
+    // 1.2. Invoke Finish Job with job and abort these steps.
+    FinishJob(job);
+    return;
+  }
+
+  // 2. If job’s script url's origin and job’s referrer's origin are not same
+  // origin, then:
+  const url::Origin job_script_origin(url::Origin::Create(job->script_url));
+  const url::Origin job_referrer_origin(url::Origin::Create(job->referrer));
+  if (!job_script_origin.IsSameOriginWith(job_referrer_origin)) {
+    // 2.1. Invoke Reject Job Promise with job and "SecurityError" DOMException.
+    RejectJobPromise(
+        job, PromiseErrorData(
+                 dom::DOMException::kSecurityErr,
+                 "Service Worker Register failed: Script URL and referrer "
+                 "origin are not the same."));
+    // 2.2. Invoke Finish Job with job and abort these steps.
+    FinishJob(job);
+    return;
+  }
+
+  // 3. If job’s scope url's origin and job’s referrer's origin are not same
+  // origin, then:
+  const url::Origin job_scope_origin(url::Origin::Create(job->scope_url));
+  if (!job_scope_origin.IsSameOriginWith(job_referrer_origin)) {
+    // 3.1. Invoke Reject Job Promise with job and "SecurityError" DOMException.
+    RejectJobPromise(
+        job, PromiseErrorData(
+                 dom::DOMException::kSecurityErr,
+                 "Service Worker Register failed: Scope URL and referrer "
+                 "origin are not the same."));
+
+    // 3.2. Invoke Finish Job with job and abort these steps.
+    FinishJob(job);
+    return;
+  }
+
+  // 4. Let registration be the result of running Get Registration given job’s
+  // storage key and job’s scope url.
+  ServiceWorkerRegistrationObject* registration =
+      GetRegistration(job->storage_key, job->scope_url);
+
+  // 5. If registration is not null, then:
+  if (registration) {
+    // 5.1 Let newestWorker be the result of running the Get Newest Worker
+    // algorithm passing registration as the argument.
+    ServiceWorker* newest_worker = GetNewestWorker(registration);
+
+    // 5.2 If newestWorker is not null, job’s script url equals newestWorker’s
+    // script url, job’s worker type equals newestWorker’s type, and job’s
+    // update via cache mode's value equals registration’s update via cache
+    // mode, then:
+    if (newest_worker && job->script_url == newest_worker->script_url()) {
+      // 5.2.1 Invoke Resolve Job Promise with job and registration.
+      ResolveJobPromise(job, registration);
+
+      // 5.2.2 Invoke Finish Job with job and abort these steps.
+      FinishJob(job);
+      return;
+    }
+  } else {
+    // 6. Else:
+
+    // 6.1 Invoke Set Registration algorithm with job’s storage key, job’s scope
+    // url, and job’s update via cache mode.
+    registration = SetRegistration(job->storage_key, job->scope_url,
+                                   job->update_via_cache);
+  }
+
+  // 7. Invoke Update algorithm passing job as the argument.
+  Update(job);
+}
+
+void ServiceWorkerJobs::Update(Job* job) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::Update()");
+  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(job);
+  // Algorithm for "Update"
+  //   https://w3c.github.io/ServiceWorker/#update-algorithm
+
+  // 1. Let registration be the result of running Get Registration given job’s
+  // storage key and job’s scope url.
+  ServiceWorkerRegistrationObject* registration =
+      GetRegistration(job->storage_key, job->scope_url);
+
+  // 2. If registration is null, then:
+  if (!registration) {
+    // 2.1. Invoke Reject Job Promise with job and TypeError.
+    RejectJobPromise(job, PromiseErrorData(script::kSimpleTypeError));
+
+    // 2.2. Invoke Finish Job with job and abort these steps.
+    FinishJob(job);
+    return;
+  }
+  ResolveJobPromise(job, registration);
+  NOTIMPLEMENTED();
+}
+
+void ServiceWorkerJobs::Unregister(Job* job) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::Unregister()");
+  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  // Algorithm for "Unregister"
+  //   https://w3c.github.io/ServiceWorker/#unregister-algorithm
+  NOTIMPLEMENTED();
+}
+
+void ServiceWorkerJobs::RejectJobPromise(Job* job,
+                                         const PromiseErrorData& error_data) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::RejectJobPromise()");
+  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  // Algorithm for "Reject Job Promise"
+  //   https://w3c.github.io/ServiceWorker/#reject-job-promise
+  // 1. If job’s client is not null, queue a task, on job’s client's responsible
+  // event loop using the DOM manipulation task source, to reject job’s job
+  // promise with a new exception with errorData and a user agent-defined
+  // message, in job’s client's Realm.
+
+  auto reject_task = [](std::unique_ptr<JobPromiseType> promise,
+                        const PromiseErrorData& error_data) {
+    error_data.Reject(std::move(promise));
+  };
+
+  if (job->client) {
+    base::AutoLock lock(job->equivalent_jobs_promise_mutex);
+    job->client->context()->message_loop()->task_runner()->PostTask(
+        FROM_HERE,
+        base::Bind(reject_task, base::Passed(&job->promise), error_data));
+    // Ensure that the promise is cleared, so that equivalent jobs won't get
+    // added from this point on.
+    CHECK(!job->promise);
+  }
+  // 2. For each equivalentJob in job’s list of equivalent jobs:
+  for (auto& equivalent_job : job->equivalent_jobs) {
+    // Equivalent jobs should never have equivalent jobs of their own.
+    DCHECK(equivalent_job->equivalent_jobs.empty());
+
+    // 2.1. If equivalentJob’s client is null, continue.
+    if (equivalent_job->client) {
+      // 2.2. Queue a task, on equivalentJob’s client's responsible event loop
+      // using the DOM manipulation task source, to reject equivalentJob’s job
+      // promise with a new exception with errorData and a user agent-defined
+      // message, in equivalentJob’s client's Realm.
+      equivalent_job->client->context()
+          ->message_loop()
+          ->task_runner()
+          ->PostTask(FROM_HERE,
+                     base::BindOnce(reject_task,
+                                    base::Passed(&equivalent_job->promise),
+                                    error_data));
+      // Check that the promise is cleared.
+      CHECK(!equivalent_job->promise);
+    }
+  }
+  job->equivalent_jobs.clear();
+}
+
+void ServiceWorkerJobs::ResolveJobPromise(
+    Job* job, ServiceWorkerRegistrationObject* value) {
+  TRACE_EVENT0("cobalt::worker", "ServiceWorkerJobs::ResolveJobPromise()");
+  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  DCHECK(job);
+  DCHECK(value);
+  // Algorithm for "Resolve Job Promise".
+  //   https://w3c.github.io/ServiceWorker/#resolve-job-promise-algorithm
+
+  // 1. If job’s client is not null, queue a task, on job’s client's responsible
+  // event loop using the DOM manipulation task source, to run the following
+  // substeps:
+  if (job->client) {
+    base::AutoLock lock(job->equivalent_jobs_promise_mutex);
+    job->client->context()->message_loop()->task_runner()->PostTask(
+        FROM_HERE, base::Bind(&ServiceWorkerJobs::ResolveJobPromiseTask,
+                              base::Unretained(this), job->type,
+                              base::Passed(&job->promise), job->client, value));
+    // Ensure that the promise is cleared, so that equivalent jobs won't get
+    // added from this point on.
+    CHECK(!job->promise);
+  }
+
+  // 2. For each equivalentJob in job’s list of equivalent jobs:
+  for (auto& equivalent_job : job->equivalent_jobs) {
+    // Equivalent jobs should never have equivalent jobs of their own.
+    DCHECK(equivalent_job->equivalent_jobs.empty());
+
+    // 2.1. If equivalentJob’s client is null, continue to the next iteration of
+    // the loop.
+    if (equivalent_job->client) {
+      // 2.2. Queue a task, on equivalentJob’s client's responsible event loop
+      // using the DOM manipulation task source, to run the following substeps:
+      equivalent_job->client->context()
+          ->message_loop()
+          ->task_runner()
+          ->PostTask(FROM_HERE,
+                     base::Bind(&ServiceWorkerJobs::ResolveJobPromiseTask,
+                                base::Unretained(this), equivalent_job->type,
+                                base::Passed(&equivalent_job->promise),
+                                equivalent_job->client, value));
+      // Check that the promise is cleared.
+      CHECK(!equivalent_job->promise);
+    }
+  }
+  job->equivalent_jobs.clear();
+}
+
+void ServiceWorkerJobs::ResolveJobPromiseTask(
+    JobType type, std::unique_ptr<JobPromiseType> promise,
+    web::EnvironmentSettings* client, ServiceWorkerRegistrationObject* value) {
+  DCHECK_NE(message_loop(), base::MessageLoop::current());
+  DCHECK_EQ(base::MessageLoop::current(), client->context()->message_loop());
+  // 1.1./2.2.1. Let convertedValue be null.
+  // 1.2./2.2.2. If job’s job type is either register or update, set
+  // convertedValue to the result of getting the service worker registration
+  // object that represents value in job’s client.
+  if (type == kRegister || type == kUpdate) {
+    auto converted_value =
+        client->context()->GetServiceWorkerRegistration(value);
+    // 1.4./2.2.4.  Resolve job’s job promise with convertedValue.
+    promise->Resolve(converted_value);
+  } else {
+    DCHECK_EQ(type, kUnregister);
+    // 1.3./2.2.3. Else, set convertedValue to value, in job’s client's Realm.
+    bool converted_value = value != nullptr;
+    // 1.4./2.2.4.  Resolve job’s job promise with convertedValue.
+    promise->Resolve(converted_value);
+  }
+}
+
+// https://w3c.github.io/ServiceWorker/#finish-job-algorithm
+void ServiceWorkerJobs::FinishJob(Job* job) {
+  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+  // 1. Let jobQueue be job’s containing job queue.
+  JobQueue* job_queue = job->containing_job_queue;
+
+  // 2. Assert: the first item in jobQueue is job.
+  DCHECK_EQ(job_queue->FirstItem(), job);
+
+  // 3. Dequeue from jobQueue.
+  job_queue->Dequeue();
+
+  // 4. If jobQueue is not empty, invoke Run Job with jobQueue.
+  if (!job_queue->empty()) {
+    RunJob(job_queue);
+  }
+}
+
+ServiceWorkerRegistrationObject* ServiceWorkerJobs::GetRegistration(
+    const url::Origin& storage_key, const GURL& scope) {
+  // Algorithm for 'Get Registration':
+  //   https://w3c.github.io/ServiceWorker/#get-registration-algorithm
+  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+
+  // 1. Run the following steps atomically.
+  base::AutoLock lock(registration_map_mutex_);
+
+  // 2. Let scopeString be the empty string.
+  std::string scope_string;
+
+  // 3. If scope is not null, set scopeString to serialized scope with the
+  // exclude fragment flag set.
+  if (!scope.is_empty()) {
+    scope_string = SerializeExcludingFragment(scope);
+  }
+
+  RegistrationKey registration_key(storage_key, scope_string);
+  // 4. For each (entry storage key, entry scope) → registration of registration
+  // map:
+  for (const auto& entry : registration_map_) {
+    // 4.1. If storage key equals entry storage key and scopeString matches
+    // entry scope, then return registration.
+    if (entry.first == registration_key) {
+      return entry.second.get();
+    }
+  }
+
+  // 5. Return null.
+  return nullptr;
+}
+
+ServiceWorkerRegistrationObject* ServiceWorkerJobs::SetRegistration(
+    const url::Origin& storage_key, const GURL& scope,
+    const ServiceWorkerUpdateViaCache& update_via_cache) {
+  // Algorithm for 'Set Registration':
+  //   https://w3c.github.io/ServiceWorker/#set-registration-algorithm
+  DCHECK_EQ(message_loop(), base::MessageLoop::current());
+
+  // 1. Run the following steps atomically.
+  base::AutoLock lock(registration_map_mutex_);
+
+  // 2. Let scopeString be serialized scope with the exclude fragment flag set.
+  std::string scope_string = SerializeExcludingFragment(scope);
+
+  // 3. Let registration be a new service worker registration whose storage key
+  // is set to storage key, scope url is set to scope, and update via cache mode
+  // is set to updateViaCache.
+  ServiceWorkerRegistrationObject* registration(
+      new ServiceWorkerRegistrationObject(storage_key, scope,
+                                          update_via_cache));
+
+  // 4. Set registration map[(storage key, scopeString)] to registration.
+  RegistrationKey registration_key(storage_key, scope_string);
+  registration_map_.insert(std::make_pair(
+      registration_key,
+      std::unique_ptr<ServiceWorkerRegistrationObject>(registration)));
+
+  // 5. Return registration.
+  return registration;
+}
+
+// https://w3c.github.io/ServiceWorker/#get-newest-worker
+ServiceWorker* ServiceWorkerJobs::GetNewestWorker(
+    ServiceWorkerRegistrationObject* registration) {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+ServiceWorkerJobs::JobPromiseType::JobPromiseType(
+    std::unique_ptr<script::ValuePromiseBool::Reference> promise_reference)
+    : promise_bool_reference_(std::move(promise_reference)) {}
+ServiceWorkerJobs::JobPromiseType::JobPromiseType(
+    std::unique_ptr<script::ValuePromiseWrappable::Reference> promise_reference)
+    : promise_wrappable_reference_(std::move(promise_reference)) {}
+
+void ServiceWorkerJobs::JobPromiseType::Resolve(const bool result) {
+  DCHECK(promise_bool_reference_);
+  promise_bool_reference_->value().Resolve(result);
+}
+
+void ServiceWorkerJobs::JobPromiseType::Resolve(
+    const scoped_refptr<ServiceWorkerRegistration>& result) {
+  DCHECK(promise_wrappable_reference_);
+  promise_wrappable_reference_->value().Resolve(result);
+}
+
+void ServiceWorkerJobs::JobPromiseType::Reject(
+    script::SimpleExceptionType exception) {
+  if (promise_bool_reference_) {
+    promise_bool_reference_->value().Reject(exception);
+    return;
+  }
+  if (promise_wrappable_reference_) {
+    promise_wrappable_reference_->value().Reject(exception);
+    return;
+  }
+  NOTREACHED();
+}
+
+void ServiceWorkerJobs::JobPromiseType::Reject(
+    const scoped_refptr<script::ScriptException>& result) {
+  if (promise_bool_reference_) {
+    promise_bool_reference_->value().Reject(result);
+    return;
+  }
+  if (promise_wrappable_reference_) {
+    promise_wrappable_reference_->value().Reject(result);
+    return;
+  }
+  NOTREACHED();
+}
+
+script::PromiseState ServiceWorkerJobs::JobPromiseType::State() {
+  if (promise_bool_reference_) {
+    return promise_bool_reference_->value().State();
+  }
+  if (promise_wrappable_reference_) {
+    return promise_wrappable_reference_->value().State();
+  }
+  NOTREACHED();
+  return script::PromiseState::kPending;
+}
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/service_worker_jobs.h b/cobalt/worker/service_worker_jobs.h
new file mode 100644
index 0000000..a97b0e4
--- /dev/null
+++ b/cobalt/worker/service_worker_jobs.h
@@ -0,0 +1,268 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_SERVICE_WORKER_JOBS_H_
+#define COBALT_WORKER_SERVICE_WORKER_JOBS_H_
+
+#include <deque>
+#include <map>
+#include <memory>
+#include <queue>
+#include <string>
+#include <utility>
+
+#include "base/memory/ref_counted.h"
+#include "base/synchronization/lock.h"
+#include "base/task/sequence_manager/moveable_auto_lock.h"
+#include "cobalt/dom/dom_exception.h"
+#include "cobalt/network/network_module.h"
+#include "cobalt/script/exception_message.h"
+#include "cobalt/script/promise.h"
+#include "cobalt/script/script_value.h"
+#include "cobalt/web/environment_settings.h"
+#include "cobalt/worker/service_worker.h"
+#include "cobalt/worker/service_worker_registration.h"
+#include "cobalt/worker/service_worker_registration_object.h"
+#include "cobalt/worker/service_worker_update_via_cache.h"
+#include "cobalt/worker/worker_type.h"
+#include "url/gurl.h"
+
+namespace cobalt {
+namespace worker {
+
+// Algorithms for Service Worker Jobs.
+//   https://w3c.github.io/ServiceWorker/#algorithms
+class ServiceWorkerJobs {
+ public:
+  ServiceWorkerJobs(network::NetworkModule* network_module,
+                    base::MessageLoop* message_loop);
+  ~ServiceWorkerJobs();
+
+  base::MessageLoop* message_loop() { return message_loop_; }
+  network::NetworkModule* network_module() { return network_module_; }
+
+  // https://w3c.github.io/ServiceWorker/#start-register-algorithm
+  void StartRegister(const base::Optional<GURL>& scope_url,
+                     const GURL& script_url,
+                     std::unique_ptr<script::ValuePromiseWrappable::Reference>
+                         promise_reference,
+                     web::EnvironmentSettings* client, const WorkerType& type,
+                     const ServiceWorkerUpdateViaCache& update_via_cache);
+
+  // https://w3c.github.io/ServiceWorker/#scope-match-algorithm
+  void MatchServiceWorkerRegistration(const GURL& client_url);
+
+ private:
+  // https://w3c.github.io/ServiceWorker/#dfn-job-type
+  enum JobType { kRegister, kUpdate, kUnregister };
+
+  class JobQueue;
+
+  // This type handles the different promise variants used in jobs.
+  class JobPromiseType {
+   public:
+    // Constructors for each promise variant that can be held.
+    explicit JobPromiseType(
+        std::unique_ptr<script::ValuePromiseBool::Reference> promise_reference);
+    explicit JobPromiseType(
+        std::unique_ptr<script::ValuePromiseWrappable::Reference>
+            promise_reference);
+
+    template <typename PromiseReference>
+    static std::unique_ptr<JobPromiseType> Create(
+        PromiseReference promise_reference) {
+      return std::unique_ptr<JobPromiseType>(
+          new JobPromiseType(std::move(promise_reference)));
+    }
+
+    void Resolve(const bool result);
+    void Resolve(const scoped_refptr<ServiceWorkerRegistration>& result);
+    void Reject(script::SimpleExceptionType exception);
+    void Reject(const scoped_refptr<script::ScriptException>& result);
+
+    script::PromiseState State();
+
+   private:
+    std::unique_ptr<script::ValuePromiseBool::Reference>
+        promise_bool_reference_;
+    std::unique_ptr<script::ValuePromiseWrappable::Reference>
+        promise_wrappable_reference_;
+  };
+
+  // https://w3c.github.io/ServiceWorker/#dfn-job
+  struct Job {
+    Job(JobType type, const url::Origin& storage_key, const GURL& scope_url,
+        const GURL& script_url, std::unique_ptr<JobPromiseType> promise,
+        web::EnvironmentSettings* client)
+        : type(type),
+          storage_key(storage_key),
+          scope_url(scope_url),
+          script_url(script_url),
+          promise(std::move(promise)),
+          client(client) {}
+    ~Job() {
+      client = nullptr;
+      containing_job_queue = nullptr;
+    }
+    JobType type;
+    url::Origin storage_key;
+    GURL scope_url;
+    GURL script_url;
+    std::unique_ptr<JobPromiseType> promise;
+    web::EnvironmentSettings* client;
+    ServiceWorkerUpdateViaCache update_via_cache;
+    JobQueue* containing_job_queue = nullptr;
+    std::deque<std::unique_ptr<Job>> equivalent_jobs;
+    GURL referrer;
+
+    // This lock is for the list of equivalent jobs. It should also be held when
+    // resolving the promise.
+    base::Lock equivalent_jobs_promise_mutex;
+  };
+
+  // https://w3c.github.io/ServiceWorker/#dfn-job-queue
+  class JobQueue {
+   public:
+    bool empty() {
+      base::AutoLock lock(mutex_);
+      return jobs_.empty();
+    }
+    void Enqueue(std::unique_ptr<Job> job) {
+      base::AutoLock lock(mutex_);
+      jobs_.push(std::move(job));
+    }
+    std::unique_ptr<Job> Dequeue() {
+      base::AutoLock lock(mutex_);
+      std::unique_ptr<Job> job;
+      job.swap(jobs_.front());
+      jobs_.pop();
+      return job;
+    }
+    Job* FirstItem() {
+      base::AutoLock lock(mutex_);
+      return jobs_.empty() ? nullptr : jobs_.front().get();
+    }
+
+    // Also return a held autolock, to ensure the item remains a valid item in
+    // the queue while it's in use.
+    std::pair<Job*, base::sequence_manager::MoveableAutoLock> LastItem() {
+      base::sequence_manager::MoveableAutoLock lock(mutex_);
+      Job* job = jobs_.empty() ? nullptr : jobs_.back().get();
+      return std::pair<Job*, base::sequence_manager::MoveableAutoLock>(
+          job, std::move(lock));
+    }
+
+   private:
+    base::Lock mutex_;
+    std::queue<std::unique_ptr<Job>> jobs_;
+  };
+
+  // https://w3c.github.io/ServiceWorker/#dfn-scope-to-job-queue-map
+  using JobQueueMap = std::map<std::string, std::unique_ptr<JobQueue>>;
+
+  // Type to hold the errorData for rejection of promises.
+  class PromiseErrorData {
+   public:
+    explicit PromiseErrorData(const script::MessageType& message_type)
+        : message_type_(message_type),
+          exception_code_(dom::DOMException::kNone) {}
+    PromiseErrorData(const dom::DOMException::ExceptionCode& code,
+                     const std::string& message)
+        : message_type_(script::kNoError),
+          exception_code_(code),
+          message_(message) {}
+
+    void Reject(std::unique_ptr<JobPromiseType> promise) const;
+
+   private:
+    // Use script::MessageType because it can hold kNoError value to distinguish
+    // between simple exceptions and DOM exceptions.
+    script::MessageType message_type_;
+    const dom::DOMException::ExceptionCode exception_code_;
+    const std::string message_;
+  };
+
+
+  // https://w3c.github.io/ServiceWorker/#create-job
+  std::unique_ptr<Job> CreateJob(JobType type, const url::Origin& storage_key,
+                                 const GURL& scope_url, const GURL& script_url,
+                                 std::unique_ptr<JobPromiseType> promise,
+                                 web::EnvironmentSettings* client);
+
+  // https://w3c.github.io/ServiceWorker/#schedule-job
+  void ScheduleJob(std::unique_ptr<Job> job);
+
+  // https://w3c.github.io/ServiceWorker/#dfn-job-equivalent
+  bool EquivalentJobs(Job* one, Job* two);
+
+  // https://w3c.github.io/ServiceWorker/#run-job-algorithm
+  void RunJob(JobQueue* job_queue);
+
+  // Task for "Run Job" to run in the service worker thread.
+  void RunJobTask(JobQueue* job_queue);
+
+  // https://w3c.github.io/ServiceWorker/#register-algorithm
+  void Register(Job* job);
+
+  // https://w3c.github.io/ServiceWorker/#update-algorithm
+  void Update(Job* job);
+
+  // https://w3c.github.io/ServiceWorker/#unregister-algorithm
+  void Unregister(Job* job);
+
+  // https://w3c.github.io/ServiceWorker/#reject-job-promise
+  void RejectJobPromise(Job* job, const PromiseErrorData& error_data);
+
+  // https://w3c.github.io/ServiceWorker/#resolve-job-promise-algorithm
+  void ResolveJobPromise(Job* job, ServiceWorkerRegistrationObject* value);
+  void ResolveJobPromiseTask(JobType type,
+                             std::unique_ptr<JobPromiseType> promise,
+                             web::EnvironmentSettings* client,
+                             ServiceWorkerRegistrationObject* value);
+
+  // https://w3c.github.io/ServiceWorker/#finish-job-algorithm
+  void FinishJob(Job* job);
+
+  // https://w3c.github.io/ServiceWorker/#get-registration-algorithm
+  ServiceWorkerRegistrationObject* GetRegistration(
+      const url::Origin& storage_key, const GURL& scope);
+
+  // https://w3c.github.io/ServiceWorker/#set-registration-algorithm
+  ServiceWorkerRegistrationObject* SetRegistration(
+      const url::Origin& storage_key, const GURL& scope,
+      const ServiceWorkerUpdateViaCache& update_via_cache);
+
+  // https://w3c.github.io/ServiceWorker/#get-newest-worker
+  ServiceWorker* GetNewestWorker(ServiceWorkerRegistrationObject* registration);
+
+  network::NetworkModule* network_module_;
+  base::MessageLoop* message_loop_;
+
+  JobQueueMap job_queue_map_;
+
+  // A registration map is an ordered map where the keys are (storage key,
+  // serialized scope urls) and the values are service worker registrations.
+  //   https://w3c.github.io/ServiceWorker/#dfn-scope-to-registration-map
+  using RegistrationKey = std::pair<url::Origin, std::string>;
+  std::map<RegistrationKey, std::unique_ptr<ServiceWorkerRegistrationObject>>
+      registration_map_;
+
+  // This lock is to allow atomic operations on the registration map.
+  base::Lock registration_map_mutex_;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_SERVICE_WORKER_JOBS_H_
diff --git a/cobalt/worker/service_worker_object.cc b/cobalt/worker/service_worker_object.cc
new file mode 100644
index 0000000..aee3dc6
--- /dev/null
+++ b/cobalt/worker/service_worker_object.cc
@@ -0,0 +1,23 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/service_worker_object.h"
+
+namespace cobalt {
+namespace worker {
+
+ServiceWorkerObject::ServiceWorkerObject() {}
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/service_worker_object.h b/cobalt/worker/service_worker_object.h
new file mode 100644
index 0000000..5ca5e12
--- /dev/null
+++ b/cobalt/worker/service_worker_object.h
@@ -0,0 +1,47 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_SERVICE_WORKER_OBJECT_H_
+#define COBALT_WORKER_SERVICE_WORKER_OBJECT_H_
+
+#include "cobalt/worker/service_worker_state.h"
+#include "url/gurl.h"
+
+namespace cobalt {
+namespace worker {
+
+// This class represents the 'service worker'.
+//   https://w3c.github.io/ServiceWorker/#dfn-service-worker
+// Not to be confused with the ServiceWorker JavaScript object,  this represents
+// the service worker in the browser, independent from the JavaScript realm.
+// The lifetime of a service worker is tied to the execution lifetime of events
+// and not references held by service worker clients to the ServiceWorker
+// object. A user agent may terminate service workers at any time it has no
+// event to handle, or detects abnormal operation.
+//   https://w3c.github.io/ServiceWorker/#service-worker-lifetime
+class ServiceWorkerObject {
+ public:
+  ServiceWorkerObject();
+  ~ServiceWorkerObject() {}
+
+  ServiceWorkerState state() { return state_; }
+
+ private:
+  ServiceWorkerState state_;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_SERVICE_WORKER_OBJECT_H_
diff --git a/cobalt/worker/service_worker_registration.cc b/cobalt/worker/service_worker_registration.cc
new file mode 100644
index 0000000..0d1ebd9
--- /dev/null
+++ b/cobalt/worker/service_worker_registration.cc
@@ -0,0 +1,72 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/service_worker_registration.h"
+
+#include <utility>
+
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
+
+namespace cobalt {
+namespace worker {
+
+ServiceWorkerRegistration::ServiceWorkerRegistration(
+    script::EnvironmentSettings* settings,
+    worker::ServiceWorkerRegistrationObject* registration)
+    : dom::EventTarget(settings), registration_(registration) {}
+
+script::Handle<script::Promise<void>> ServiceWorkerRegistration::Update() {
+  // Todo: Add logic for update()
+  script::Handle<script::Promise<void>> promise =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings())
+          ->context()
+          ->global_environment()
+          ->script_value_factory()
+          ->CreateBasicPromise<void>();
+  return promise;
+}
+
+script::Handle<script::Promise<void>> ServiceWorkerRegistration::Unregister() {
+  // Todo: Add logic for unregister
+  script::Handle<script::Promise<void>> promise =
+      base::polymorphic_downcast<web::EnvironmentSettings*>(
+          environment_settings())
+          ->context()
+          ->global_environment()
+          ->script_value_factory()
+          ->CreateBasicPromise<void>();
+  return promise;
+}
+
+std::string ServiceWorkerRegistration::scope() const {
+  return registration_->scope_url().GetContent();
+}
+
+ServiceWorkerUpdateViaCache ServiceWorkerRegistration::update_via_cache()
+    const {
+  return registration_->update_via_cache_mode();
+}
+
+void ServiceWorkerRegistration::EnableNavigationPreload(bool enable) {
+  // Todo: Implement the logic for set header
+}
+
+void ServiceWorkerRegistration::SetNavigationPreloadHeader() {
+  // Todo: Implement the logic for set header
+}
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/service_worker_registration.h b/cobalt/worker/service_worker_registration.h
new file mode 100644
index 0000000..7ccfd4c
--- /dev/null
+++ b/cobalt/worker/service_worker_registration.h
@@ -0,0 +1,90 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_SERVICE_WORKER_REGISTRATION_H_
+#define COBALT_WORKER_SERVICE_WORKER_REGISTRATION_H_
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/macros.h"
+#include "cobalt/dom/event_target.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/script_value.h"
+#include "cobalt/script/script_value_factory.h"
+#include "cobalt/script/wrappable.h"
+#include "cobalt/worker/navigation_preload_manager.h"
+#include "cobalt/worker/service_worker.h"
+#include "cobalt/worker/service_worker_registration_object.h"
+#include "cobalt/worker/service_worker_state.h"
+#include "cobalt/worker/service_worker_update_via_cache.h"
+#include "url/gurl.h"
+
+namespace cobalt {
+namespace worker {
+
+// The ServiceWorkerRegistration interface represents a service worker
+// registration within a service worker client realm.
+//   https://w3c.github.io/ServiceWorker/#serviceworker-interface
+class ServiceWorkerRegistration : public dom::EventTarget {
+ public:
+  ServiceWorkerRegistration(
+      script::EnvironmentSettings* settings,
+      worker::ServiceWorkerRegistrationObject* registration);
+  ~ServiceWorkerRegistration() override = default;
+
+  void set_installing(scoped_refptr<ServiceWorker> worker) {
+    installing_ = worker;
+  }
+  scoped_refptr<ServiceWorker> installing() const { return installing_; }
+  void set_waiting(scoped_refptr<ServiceWorker> worker) { waiting_ = worker; }
+  scoped_refptr<ServiceWorker> waiting() const { return waiting_; }
+  void set_active(scoped_refptr<ServiceWorker> worker) { active_ = worker; }
+  scoped_refptr<ServiceWorker> active() const { return active_; }
+  scoped_refptr<NavigationPreloadManager> navigation_preload() {
+    return navigation_preload_;
+  }
+
+  std::string scope() const;
+  ServiceWorkerUpdateViaCache update_via_cache() const;
+
+  void EnableNavigationPreload(bool enable);
+  void SetNavigationPreloadHeader();
+
+  script::Handle<script::Promise<void>> Update();
+  script::Handle<script::Promise<void>> Unregister();
+
+  const EventListenerScriptValue* onupdatefound() const {
+    return GetAttributeEventListener(base::Tokens::updatefound());
+  }
+
+  void set_onupdatefound(const EventListenerScriptValue& event_listener) {
+    SetAttributeEventListener(base::Tokens::updatefound(), event_listener);
+  }
+
+  DEFINE_WRAPPABLE_TYPE(ServiceWorkerRegistration);
+
+ private:
+  worker::ServiceWorkerRegistrationObject* registration_;
+  scoped_refptr<ServiceWorker> installing_;
+  scoped_refptr<ServiceWorker> waiting_;
+  scoped_refptr<ServiceWorker> active_;
+  scoped_refptr<NavigationPreloadManager> navigation_preload_;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_SERVICE_WORKER_REGISTRATION_H_
diff --git a/cobalt/worker/service_worker_registration.idl b/cobalt/worker/service_worker_registration.idl
new file mode 100644
index 0000000..d0cff29
--- /dev/null
+++ b/cobalt/worker/service_worker_registration.idl
@@ -0,0 +1,31 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://w3c.github.io/ServiceWorker/#serviceworkerregistration-interface
+[
+    Exposed=(Window,ServiceWorker)
+] interface ServiceWorkerRegistration : EventTarget {
+    readonly attribute ServiceWorker? installing;
+    readonly attribute ServiceWorker? waiting;
+    readonly attribute ServiceWorker? active;
+    readonly attribute NavigationPreloadManager navigationPreload;
+
+    readonly attribute USVString scope;
+    readonly attribute ServiceWorkerUpdateViaCache updateViaCache;
+
+    Promise<ServiceWorkerRegistration> update();
+    Promise<boolean> unregister();
+
+    attribute EventHandler onupdatefound;
+};
diff --git a/cobalt/worker/service_worker_registration_object.cc b/cobalt/worker/service_worker_registration_object.cc
new file mode 100644
index 0000000..f0081ec
--- /dev/null
+++ b/cobalt/worker/service_worker_registration_object.cc
@@ -0,0 +1,32 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/service_worker_registration_object.h"
+
+#include "cobalt/worker/service_worker_update_via_cache.h"
+#include "url/gurl.h"
+#include "url/origin.h"
+
+namespace cobalt {
+namespace worker {
+
+ServiceWorkerRegistrationObject::ServiceWorkerRegistrationObject(
+    const url::Origin& storage_key, const GURL& scope_url,
+    const ServiceWorkerUpdateViaCache& update_via_cache_mode)
+    : storage_key_(storage_key),
+      scope_url_(scope_url),
+      update_via_cache_mode_(update_via_cache_mode) {}
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/service_worker_registration_object.h b/cobalt/worker/service_worker_registration_object.h
new file mode 100644
index 0000000..9980ead
--- /dev/null
+++ b/cobalt/worker/service_worker_registration_object.h
@@ -0,0 +1,63 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_SERVICE_WORKER_REGISTRATION_OBJECT_H_
+#define COBALT_WORKER_SERVICE_WORKER_REGISTRATION_OBJECT_H_
+
+#include "cobalt/worker/service_worker_object.h"
+#include "cobalt/worker/service_worker_update_via_cache.h"
+#include "url/gurl.h"
+#include "url/origin.h"
+
+namespace cobalt {
+namespace worker {
+
+// This class represents the 'service worker registration'.
+//   https://w3c.github.io/ServiceWorker/#dfn-service-worker-registration
+// Not to be confused with the ServiceWorkerRegistration JavaScript object,
+// this represents the registration of the service worker in the browser,
+// independent from the JavaScript realm. The lifetime of this object is beyond
+// that of the ServiceWorkerRegistration JavaScript object(s) that represent
+// this object in their service worker clients.
+//   https://w3c.github.io/ServiceWorker/#service-worker-registration-lifetime
+class ServiceWorkerRegistrationObject {
+ public:
+  ServiceWorkerRegistrationObject(
+      const url::Origin& storage_key, const GURL& scope_url,
+      const ServiceWorkerUpdateViaCache& update_via_cache_mode);
+  ~ServiceWorkerRegistrationObject() {}
+
+  const url::Origin& storage_key() const { return storage_key_; }
+  const GURL& scope_url() const { return scope_url_; }
+  const ServiceWorkerUpdateViaCache& update_via_cache_mode() const {
+    return update_via_cache_mode_;
+  }
+
+  ServiceWorkerObject* installing_worker() const { return installing_worker_; }
+  ServiceWorkerObject* waiting_worker() const { return waiting_worker_; }
+  ServiceWorkerObject* active_worker() const { return active_worker_; }
+
+ private:
+  const url::Origin& storage_key_;
+  const GURL& scope_url_;
+  const ServiceWorkerUpdateViaCache& update_via_cache_mode_;
+  ServiceWorkerObject* installing_worker_ = nullptr;
+  ServiceWorkerObject* waiting_worker_ = nullptr;
+  ServiceWorkerObject* active_worker_ = nullptr;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_SERVICE_WORKER_REGISTRATION_OBJECT_H_
diff --git a/cobalt/worker/service_worker_state.idl b/cobalt/worker/service_worker_state.idl
new file mode 100644
index 0000000..bb9ef67
--- /dev/null
+++ b/cobalt/worker/service_worker_state.idl
@@ -0,0 +1,24 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://w3c.github.io/ServiceWorker/#service-worker-state
+
+enum ServiceWorkerState {
+  "parsed",
+  "installing",
+  "installed",
+  "activating",
+  "activated",
+  "redundant",
+};
diff --git a/cobalt/worker/service_worker_update_via_cache.idl b/cobalt/worker/service_worker_update_via_cache.idl
new file mode 100644
index 0000000..63cf82a
--- /dev/null
+++ b/cobalt/worker/service_worker_update_via_cache.idl
@@ -0,0 +1,20 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://w3c.github.io/ServiceWorker/#enumdef-serviceworkerupdateviacache
+enum ServiceWorkerUpdateViaCache {
+    "imports",
+    "all",
+    "none"
+};
diff --git a/cobalt/worker/structured_serialize_options.idl b/cobalt/worker/structured_serialize_options.idl
new file mode 100644
index 0000000..544f3ff
--- /dev/null
+++ b/cobalt/worker/structured_serialize_options.idl
@@ -0,0 +1,4 @@
+dictionary StructuredSerializeOptions {
+  //sequence<object> transfer = [];
+  sequence<DOMString> transfer;
+};
diff --git a/cobalt/worker/testdata/google_logo.png b/cobalt/worker/testdata/google_logo.png
new file mode 100644
index 0000000..ed8fec5
--- /dev/null
+++ b/cobalt/worker/testdata/google_logo.png
Binary files differ
diff --git a/cobalt/worker/testdata/service-worker.html b/cobalt/worker/testdata/service-worker.html
deleted file mode 100644
index 45916cb..0000000
--- a/cobalt/worker/testdata/service-worker.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <script type="text/javascript">
-    // Demonstrates how the navigator.serviceWorker api can be used
-    const serviceWorker = navigator.serviceWorker;
-    serviceWorker.register().then(registration => {
-        console.log("success!");
-    }, err => {
-        console.error("Installing the worker failed!", err);
-    });
-  </script>
-</head>
-
-<body>
-</body>
-</html>
diff --git a/cobalt/worker/testdata/service_worker.html b/cobalt/worker/testdata/service_worker.html
new file mode 100644
index 0000000..abbaeca
--- /dev/null
+++ b/cobalt/worker/testdata/service_worker.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <title> Service worker test </title>
+</head>
+
+<body>
+  <h1>Service worker test</h1>
+  <section></section>
+  <script>
+    const serviceWorker = navigator.serviceWorker;
+    serviceWorker.register('/testdata/service_worker.js').then(function (registration) {
+      console.log("success!");
+      if (registration.installing) {
+        console.log('Howdy from your installing page.');
+      } else if (registration.active) {
+        console.log('Service worker is active now.');
+      }
+    }, err => {
+      console.error("Installing the worker failed!", err);
+    });
+
+    function imgLoad(url) {
+      // return a promise for an image loading
+      return new Promise(function (resolve, reject) {
+        var request = new XMLHttpRequest();
+        request.open('GET', url);
+        request.responseType = 'blob';
+
+        request.onload = function () {
+          if (request.status == 200) {
+            resolve(request.response);
+          } else {
+            reject(Error('Failed to load the image: ' + request.statusText));
+          }
+        };
+        // Send the request
+        request.send();
+      });
+    }
+
+    window.onload = function () {
+      imgLoad("google_logo.png").then(function (response) {
+        var myImage = document.createElement('img');
+        myImage.src = window.URL.createObjectURL(response);
+        document.querySelector('section').appendChild(myImage);
+      }, function (Error) {
+        console.log(Error);
+      });
+    }
+
+  </script>
+</body>
+
+</html>
diff --git a/cobalt/worker/testdata/service_worker.js b/cobalt/worker/testdata/service_worker.js
new file mode 100644
index 0000000..d92919f
--- /dev/null
+++ b/cobalt/worker/testdata/service_worker.js
@@ -0,0 +1,29 @@
+self.addEventListener('install', function (event) {
+  event.waitUntil(
+    caches.open('v1').then(function (cache) {
+      console.log("cache", cache);
+      return cache.addAll([
+        '/testdata/',
+        '/testdata/service_worker.html',
+        '/testdata/google_logo.png',
+      ]);
+    })
+  );
+});
+
+self.addEventListener('fetch', function (event) {
+  event.respondWith(caches.match(event.request).then(function (response) {
+    if (response !== undefined) {
+      return response;
+    } else {
+      return fetch(event.request).then(function (response) {
+        let responseClone = response.clone();
+
+        caches.open('v1').then(function (cache) {
+          cache.put(event.request, responseClone);
+        });
+        return response;
+      });
+    }
+  }));
+});
diff --git a/cobalt/worker/worker.cc b/cobalt/worker/worker.cc
new file mode 100644
index 0000000..faf3dc4
--- /dev/null
+++ b/cobalt/worker/worker.cc
@@ -0,0 +1,269 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/worker.h"
+
+#include <string>
+#include <utility>
+
+#include "base/message_loop/message_loop.h"
+#include "base/threading/thread.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/worker/dedicated_worker_global_scope.h"
+#include "cobalt/worker/message_port.h"
+#include "cobalt/worker/worker_global_scope.h"
+#include "cobalt/worker/worker_options.h"
+#include "cobalt/worker/worker_settings.h"
+
+namespace cobalt {
+namespace worker {
+
+namespace {
+bool PermitAnyURL(const GURL&, bool) { return true; }
+}  // namespace
+
+Worker::Worker() {}
+
+void Worker::ClearAllIntervalsAndTimeouts() {
+  // TODO
+}
+
+// Algorithm for 'run a worker'
+//   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#run-a-worker
+bool Worker::Run(const Options& options) {
+  // 1. Let is shared be true if worker is a SharedWorker object, and false
+  //    otherwise.
+  is_shared_ = options.is_shared;
+  // 2. Let owner be the relevant owner to add given outside settings.
+  // 3. Let parent worker global scope be null.
+  // 4. If owner is a WorkerGlobalScope object (i.e., we are creating a nested
+  //    dedicated worker), then set parent worker global scope to owner.
+  // 5. Let unsafeWorkerCreationTime be the unsafe shared current time.
+  // 6. Let agent be the result of obtaining a dedicated/shared worker agent
+  //    given outside settings and is shared. Run the rest of these steps in
+  //    that agent.
+  web_agent_.reset(new web::Agent(
+      options.web_options,
+      base::Bind(&Worker::Initialize, base::Unretained(this), options), this));
+  return !!message_loop();
+}
+
+void Worker::WillDestroyCurrentMessageLoop() {
+  // Destroy members that were constructed in the worker thread.
+  loader_.reset();
+  worker_global_scope_ = nullptr;
+  message_port_ = nullptr;
+  content_.reset();
+  error_.reset();
+}
+
+void Worker::Initialize(const Options& options, web::Context* context) {
+  LOG(INFO) << "Look at me, I'm running a worker thread";
+
+  // 7. Let realm execution context be the result of creating a new
+  // JavaScript realm given agent and the following customizations:
+  web_context_ = context;
+  //    . For the global object, if is shared is true, create a new
+  //      SharedWorkerGlobalScope object. Otherwise, create a new
+  //      DedicatedWorkerGlobalScope object.
+  // TODO: Actual type here should depend on derived class (e.g. dedicated,
+  // shared, service)
+  web_context_->setup_environment_settings(
+      new WorkerSettings(options.outside_port, options.url));
+  // 8. Let worker global scope be the global object of realm execution
+  //    context's Realm component.
+  scoped_refptr<DedicatedWorkerGlobalScope> dedicated_worker_global_scope =
+      new DedicatedWorkerGlobalScope(web_context_->environment_settings(),
+                                     false);
+  worker_global_scope_ = dedicated_worker_global_scope;
+  // 9. Set up a worker environment settings object with realm execution
+  //    context, outside settings, and unsafeWorkerCreationTime, and let
+  //    inside settings be the result.
+  web_context_->global_environment()->CreateGlobalObject(
+      dedicated_worker_global_scope, web_context_->environment_settings());
+
+  // 10. Set worker global scope's name to the value of options's name member.
+  dedicated_worker_global_scope->set_name(options.web_options.name);
+  // 11. Append owner to worker global scope's owner set.
+  // 12. If is shared is true, then:
+  //     1. Set worker global scope's constructor origin to outside settings's
+  //        origin.
+  //     2. Set worker global scope's constructor url to url.
+  //     3. Set worker global scope's type to the value of options's type
+  //        member.
+  //     4. Set worker global scope's credentials to the value of options's
+  //        credentials member.
+  // 13. Let destination be "sharedworker" if is shared is true, and
+  // "worker" otherwise.
+  // 14. Obtain script
+  Obtain();
+}
+
+// Fetch and Run classic script
+void Worker::Obtain() {
+  // 14. Obtain script by switching on the value of options's type member:
+  //     - "classic"
+  //         Fetch a classic worker script given url, outside settings,
+  //         destination, and inside settings.
+  //     - "module"
+  //         Fetch a module worker script graph given url, outside settings,
+  //         destination, the value of the credentials member of options, and
+  //         inside settings.
+
+  //     In both cases, to perform the fetch given request, perform the
+  //     following steps if the is top-level flag is set:
+  //     1. Set request's reserved client to inside settings.
+  //     2. Fetch request, and asynchronously wait to run the remaining steps as
+  //        part of fetch's process response for the response response.
+  const GURL& url = web_context_->environment_settings()->base_url();
+  loader::Origin origin = loader::Origin(url.GetOrigin());
+
+  // Todo: implement csp check (b/225037465)
+  csp::SecurityCallback csp_callback = base::Bind(&PermitAnyURL);
+
+  loader_ = web_context_->script_loader_factory()->CreateScriptLoader(
+      url, origin, csp_callback,
+      base::Bind(&Worker::OnContentProduced, base::Unretained(this)),
+      base::Bind(&Worker::OnLoadingComplete, base::Unretained(this)));
+}
+
+void Worker::OnContentProduced(const loader::Origin& last_url_origin,
+                               std::unique_ptr<std::string> content) {
+  DCHECK(content);
+  // 14.3. "Set worker global scope's url to response's url."
+  worker_global_scope_->set_url(
+      web_context_->environment_settings()->base_url());
+  // 14.4 - 14.10 initialize worker global scope
+  worker_global_scope_->Initialize();
+  // 14.11. Asynchronously complete the perform the fetch steps with response.
+  content_ = std::move(content);
+  OnReadyToExecute();
+}
+
+void Worker::OnLoadingComplete(const base::Optional<std::string>& error) {
+  error_ = error;
+  //     If the algorithm asynchronously completes with null or with a script
+  //     whose error to rethrow is non-null, then:
+  if (error_ || !content_) {
+    //     1. Queue a global task on the DOM manipulation task source given
+    //        worker's relevant global object to fire an event named error at
+    //        worker.
+    //     2. Run the environment discarding steps for inside settings.
+    //     3. Return.
+    return;
+  }
+  OnReadyToExecute();
+}
+
+void Worker::OnReadyToExecute() {
+  DCHECK(content_);
+  Execute(*content_, base::SourceLocation("[object Worker::RunLoop]", 1, 1));
+  content_.reset();
+}
+
+void Worker::Execute(const std::string& content,
+                     const base::SourceLocation& script_location) {
+  // 15. Associate worker with worker global scope.
+  // 16. Let inside port be a new MessagePort object in inside settings's Realm.
+  // 17. Associate inside port with worker global scope.
+  message_port_ = new MessagePort(worker_global_scope_,
+                                  web_context_->environment_settings());
+  // 18. Entangle outside port and inside port.
+  // 19. Create a new WorkerLocation object and associate it with worker global
+  //     scope.
+  // 20. Closing orphan workers: Start monitoring the worker such that no sooner
+  //     than it stops being a protected worker, and no later than it stops
+  //     being a permissible worker, worker global scope's closing flag is set
+  //     to true.
+  // 21. Suspending workers: Start monitoring the worker, such that whenever
+  //     worker global scope's closing flag is false and the worker is a
+  //     suspendable worker, the user agent suspends execution of script in that
+  //     worker until such time as either the closing flag switches to true or
+  //     the worker stops being a suspendable worker.
+  // 22. Set inside settings's execution ready flag.
+  execution_ready_.Signal();
+  // 23. If script is a classic script, then run the classic script script.
+  //     Otherwise, it is a module script; run the module script script.
+
+  bool mute_errors = false;
+  bool succeeded = false;
+  LOG(INFO) << "Script Executing \"" << content << "\".";
+  std::string retval = web_context_->script_runner()->Execute(
+      content, script_location, mute_errors, &succeeded);
+  LOG(INFO) << "Script Executed " << (succeeded ? "and" : ", but not")
+            << " succeeded: \"" << retval << "\"";
+
+  // 24. Enable outside port's port message queue.
+  // 25. If is shared is false, enable the port message queue of the worker's
+  //     implicit port.
+  // 26. If is shared is true, then queue a global task on DOM manipulation task
+  //     source given worker global scope to fire an event named connect at
+  //     worker global scope, using MessageEvent, with the data attribute
+  //     initialized to the empty string, the ports attribute initialized to a
+  //     new frozen array containing inside port, and the source attribute
+  //     initialized to inside port.
+  // 27. Enable the client message queue of the ServiceWorkerContainer object
+  //     whose associated service worker client is worker global scope's
+  //     relevant settings object.
+  // 28. Event loop: Run the responsible event loop specified by inside settings
+  //     until it is destroyed.
+  // Finalize();
+}
+
+Worker::~Worker() {
+  // 29. Clear the worker global scope's map of active timers.
+  // 30. Disentangle all the ports in the list of the worker's ports.
+  // 31. Empty worker global scope's owner set.
+  if (web_agent_) {
+    DCHECK(message_loop());
+    web_agent_->WaitUntilDone();
+    web_agent_.reset();
+  }
+}
+
+// Algorithm for 'Terminate a worker'
+//   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#terminate-a-worker
+void Worker::Terminate() {
+  // 1. Set the worker's WorkerGlobalScope object's closing flag to true.
+  // 2. If there are any tasks queued in the WorkerGlobalScope object's relevant
+  //    agent's event loop's task queues, discard them without processing them.
+  // 3. Abort the script currently running in the worker.
+  // 4. If the worker's WorkerGlobalScope object is actually a
+  //    DedicatedWorkerGlobalScope object (i.e. the worker is a dedicated
+  //    worker), then empty the port message queue of the port that the worker's
+  //    implicit port is entangled with.
+}
+
+// void postMessage(any message, object transfer);
+// -> void PostMessage(const script::ValueHandleHolder& message,
+//                     script::Sequence<script::ValueHandle*> transfer) {}
+void Worker::PostMessage(const std::string& message) {
+  DCHECK(message_loop());
+  if (base::MessageLoop::current() != message_loop()) {
+    // Block until the worker thread is ready to execute code to handle the
+    // event.
+    execution_ready_.Wait();
+    message_loop()->task_runner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(&Worker::PostMessage, base::Unretained(this), message));
+    return;
+  } else {
+    DCHECK(execution_ready_.IsSignaled());
+    DCHECK(message_port());
+    if (message_port()) message_port()->PostMessage(message);
+  }
+}
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/worker.gyp b/cobalt/worker/worker.gyp
deleted file mode 100644
index 1d3458e..0000000
--- a/cobalt/worker/worker.gyp
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'worker',
-      'type': 'static_library',
-      'sources': [
-        'service_worker_container.cc',
-        'service_worker_container.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ],
-      'export_dependent_settings': [
-        # Additionally, ensure that the include directories for generated
-        # headers are put on the include directories for targets that depend
-        # on this one.
-        '<(DEPTH)/cobalt/browser/browser_bindings_gen.gyp:generated_types',
-      ]
-    },
-  ],
-}
diff --git a/cobalt/worker/worker.h b/cobalt/worker/worker.h
new file mode 100644
index 0000000..96b9730
--- /dev/null
+++ b/cobalt/worker/worker.h
@@ -0,0 +1,131 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_WORKER_H_
+#define COBALT_WORKER_WORKER_H_
+
+#include <memory>
+#include <string>
+
+#include "base/bind.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/threading/thread.h"
+#include "cobalt/csp/content_security_policy.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/execution_state.h"
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/javascript_engine.h"
+#include "cobalt/script/script_runner.h"
+#include "cobalt/script/value_handle.h"
+#include "cobalt/script/wrappable.h"
+#include "cobalt/web/agent.h"
+#include "cobalt/web/context.h"
+#include "cobalt/worker/dedicated_worker_global_scope.h"
+#include "cobalt/worker/message_port.h"
+#include "cobalt/worker/worker_global_scope.h"
+#include "cobalt/worker/worker_options.h"
+#include "cobalt/worker/worker_settings.h"
+#include "url/gurl.h"
+
+namespace cobalt {
+namespace worker {
+
+class Worker : public base::MessageLoop::DestructionObserver {
+ public:
+  // Worker Options needed at thread run time.
+  struct Options {
+    explicit Options(const std::string& name) : web_options(name) {}
+
+    web::Agent::Options web_options;
+
+    // True if worker is a SharedWorker object, and false otherwise.
+    bool is_shared;
+
+    // Parameters from 'Run a worker' step 9.1 in the spec.
+    //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#dom-worker
+    GURL url;
+    script::EnvironmentSettings* outside_settings;
+    MessagePort* outside_port;
+    WorkerOptions options;
+  };
+
+  Worker();
+  ~Worker();
+
+  // Start the worker thread. Returns true if successful.
+  bool Run(const Options& options);
+
+  void Terminate();
+
+  void ClearAllIntervalsAndTimeouts();
+
+  MessagePort* message_port() const { return message_port_.get(); }
+
+  // The message loop this object is running on.
+  base::MessageLoop* message_loop() const { return web_agent_->message_loop(); }
+
+  void PostMessage(const std::string& message);
+
+  // From base::MessageLoop::DestructionObserver.
+  void WillDestroyCurrentMessageLoop() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Worker);
+  // Called by |Run| to perform initialization required on the dedicated
+  // thread.
+  void Initialize(const Options& options, web::Context* context);
+
+  void OnContentProduced(const loader::Origin& last_url_origin,
+                         std::unique_ptr<std::string> content);
+  void OnLoadingComplete(const base::Optional<std::string>& error);
+  void OnReadyToExecute();
+
+  void Obtain();
+  void Execute(const std::string& content,
+               const base::SourceLocation& script_location);
+
+  web::Agent* web_agent() const { return web_agent_.get(); }
+
+  // The Web Context includes the Script Agent and Realm.
+  std::unique_ptr<web::Agent> web_agent_;
+
+  web::Context* web_context_;
+
+  bool is_shared_;
+
+  scoped_refptr<WorkerGlobalScope> worker_global_scope_;
+
+  // Inner message port.
+  scoped_refptr<MessagePort> message_port_;
+
+  // The loader that is used for asynchronous loads.
+  std::unique_ptr<loader::Loader> loader_;
+
+  // Content of the script. Released after Execute is called.
+  std::unique_ptr<std::string> content_;
+
+  // If the script failed, contains the error message.
+  base::Optional<std::string> error_;
+
+  // The execution ready flag.
+  //   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#concept-environment-execution-ready-flag
+  base::WaitableEvent execution_ready_ = {
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      base::WaitableEvent::InitialState::NOT_SIGNALED};
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_WORKER_H_
diff --git a/cobalt/worker/worker.idl b/cobalt/worker/worker.idl
new file mode 100644
index 0000000..b9db12b
--- /dev/null
+++ b/cobalt/worker/worker.idl
@@ -0,0 +1,35 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://html.spec.whatwg.org/multipage/workers.html#dedicated-workers-and-the-worker-interface
+// https://html.spec.whatwg.org/dev/workers.html#workers
+
+[Exposed=Window,
+ ImplementedAs=DedicatedWorker,
+ ConstructorCallWith=EnvironmentSettings,
+ Constructor(USVString scriptURL, optional WorkerOptions options)
+]
+interface Worker : EventTarget {
+  void terminate();
+
+  void postMessage(USVString message);
+  // TODO: Support sequence<object>: b/218501774
+  // void postMessage(any message, sequence<object> transfer);
+  // TODO: Support overloads with dictionary parameter: b/218506730
+  // void postMessage(any message, optional StructuredSerializeOptions options);
+  attribute EventHandler onmessage;
+  attribute EventHandler onmessageerror;
+};
+
+Worker implements AbstractWorker;
diff --git a/cobalt/worker/worker_global_scope.cc b/cobalt/worker/worker_global_scope.cc
new file mode 100644
index 0000000..6fd52ec
--- /dev/null
+++ b/cobalt/worker/worker_global_scope.cc
@@ -0,0 +1,23 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/worker_global_scope.h"
+
+namespace cobalt {
+namespace worker {
+WorkerGlobalScope::WorkerGlobalScope(script::EnvironmentSettings* settings)
+    : EventTarget(settings) {}
+
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/worker_global_scope.h b/cobalt/worker/worker_global_scope.h
new file mode 100644
index 0000000..bfdc46f
--- /dev/null
+++ b/cobalt/worker/worker_global_scope.h
@@ -0,0 +1,100 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_WORKER_GLOBAL_SCOPE_H_
+#define COBALT_WORKER_WORKER_GLOBAL_SCOPE_H_
+
+#include <string>
+#include <vector>
+
+#include "base/memory/ref_counted.h"
+#include "cobalt/base/tokens.h"
+#include "cobalt/dom/event_target.h"
+#include "cobalt/dom/event_target_listener_info.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/sequence.h"
+#include "cobalt/script/value_handle.h"
+#include "cobalt/script/wrappable.h"
+#include "net/url_request/url_request.h"
+#include "url/gurl.h"
+
+namespace cobalt {
+namespace worker {
+
+// Implementation of the WorkerGlobalScope common interface.
+//   https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#dedicated-workers-and-the-workerglobalscope-interface
+
+class WorkerGlobalScope : public dom::EventTarget {
+ public:
+  explicit WorkerGlobalScope(script::EnvironmentSettings* settings);
+
+  // Web API: WorkerGlobalScope
+  //
+  scoped_refptr<WorkerGlobalScope> self() { return this; }
+
+  void ImportScripts(const std::vector<std::string>& urls) {}
+
+  virtual void Initialize() = 0;
+
+  void set_url(const GURL& url) { url_ = url; }
+
+  const GURL Url() const { return url_; }
+
+  const dom::EventTargetListenerInfo::EventListenerScriptValue*
+  onlanguagechange() {
+    return GetAttributeEventListener(base::Tokens::languagechange());
+  }
+  void set_onlanguagechange(
+      const dom::EventTargetListenerInfo::EventListenerScriptValue&
+          event_listener) {
+    SetAttributeEventListener(base::Tokens::languagechange(), event_listener);
+  }
+
+  const dom::EventTargetListenerInfo::EventListenerScriptValue*
+  onrejectionhandled() {
+    return GetAttributeEventListener(base::Tokens::rejectionhandled());
+  }
+  void set_onrejectionhandled(
+      const dom::EventTargetListenerInfo::EventListenerScriptValue&
+          event_listener) {
+    SetAttributeEventListener(base::Tokens::rejectionhandled(), event_listener);
+  }
+  const dom::EventTargetListenerInfo::EventListenerScriptValue*
+  onunhandledrejection() {
+    return GetAttributeEventListener(base::Tokens::unhandledrejection());
+  }
+  void set_onunhandledrejection(
+      const dom::EventTargetListenerInfo::EventListenerScriptValue&
+          event_listener) {
+    SetAttributeEventListener(base::Tokens::unhandledrejection(),
+                              event_listener);
+  }
+
+  DEFINE_WRAPPABLE_TYPE(WorkerGlobalScope);
+
+ protected:
+  virtual ~WorkerGlobalScope() {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(WorkerGlobalScope);
+
+  // WorkerGlobalScope Attribute
+  // https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#concept-workerglobalscope-url
+  GURL url_;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_WORKER_GLOBAL_SCOPE_H_
diff --git a/cobalt/worker/worker_global_scope.idl b/cobalt/worker/worker_global_scope.idl
new file mode 100644
index 0000000..63c198d
--- /dev/null
+++ b/cobalt/worker/worker_global_scope.idl
@@ -0,0 +1,32 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// https://html.spec.whatwg.org/multipage/workers.html#the-workerglobalscope-common-interface
+
+[
+  Exposed = Worker,
+  ConstructorCallWith=EnvironmentSettings
+] interface WorkerGlobalScope : EventTarget {
+  readonly attribute WorkerGlobalScope self;
+  //readonly attribute WorkerLocation location;
+  //readonly attribute WorkerNavigator navigator;
+  void importScripts(USVString... urls);
+
+  attribute OnErrorEventHandler onerror;
+  attribute EventHandler onlanguagechange;
+  attribute EventHandler onoffline;
+  attribute EventHandler ononline;
+  attribute EventHandler onrejectionhandled;
+  attribute EventHandler onunhandledrejection;
+};
diff --git a/cobalt/worker/worker_options.idl b/cobalt/worker/worker_options.idl
new file mode 100644
index 0000000..77c433a
--- /dev/null
+++ b/cobalt/worker/worker_options.idl
@@ -0,0 +1,5 @@
+dictionary WorkerOptions {
+  WorkerType type = "classic";
+  //RequestCredentials credentials = "same-origin"; // credentials is only used if type is "module"
+  DOMString name = "";
+};
diff --git a/cobalt/worker/worker_settings.cc b/cobalt/worker/worker_settings.cc
new file mode 100644
index 0000000..3a0ae01
--- /dev/null
+++ b/cobalt/worker/worker_settings.cc
@@ -0,0 +1,32 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "cobalt/worker/worker_settings.h"
+
+#include "cobalt/base/debugger_hooks.h"
+#include "cobalt/script/environment_settings.h"
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/javascript_engine.h"
+#include "url/gurl.h"
+
+namespace cobalt {
+namespace worker {
+// TODO: Only use NullDebuggerHooks if !ENABLE_DEBUGGER.
+WorkerSettings::WorkerSettings(worker::MessagePort* message_port,
+                               const GURL& base)
+    : web::EnvironmentSettings(), message_port_(message_port) {
+  set_base_url(base);
+}
+}  // namespace worker
+}  // namespace cobalt
diff --git a/cobalt/worker/worker_settings.h b/cobalt/worker/worker_settings.h
new file mode 100644
index 0000000..2c633eb
--- /dev/null
+++ b/cobalt/worker/worker_settings.h
@@ -0,0 +1,43 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef COBALT_WORKER_WORKER_SETTINGS_H_
+#define COBALT_WORKER_WORKER_SETTINGS_H_
+
+#include "cobalt/script/global_environment.h"
+#include "cobalt/script/javascript_engine.h"
+#include "cobalt/web/environment_settings.h"
+#include "cobalt/worker/message_port.h"
+
+namespace cobalt {
+namespace worker {
+
+// Worker Environment Settings object as described in
+// https://html.spec.whatwg.org/commit-snapshots/465a6b672c703054de278b0f8133eb3ad33d93f4/#script-settings-for-workers
+
+class WorkerSettings : public web::EnvironmentSettings {
+ public:
+  WorkerSettings(worker::MessagePort* message_port, const GURL& base);
+
+  worker::MessagePort* message_port() const { return message_port_; }
+
+ private:
+  // Outer message port.
+  worker::MessagePort* message_port_;
+};
+
+}  // namespace worker
+}  // namespace cobalt
+
+#endif  // COBALT_WORKER_WORKER_SETTINGS_H_
diff --git a/cobalt/worker/worker_type.idl b/cobalt/worker/worker_type.idl
new file mode 100644
index 0000000..af17f86
--- /dev/null
+++ b/cobalt/worker/worker_type.idl
@@ -0,0 +1 @@
+enum WorkerType { "classic", "module" };
diff --git a/cobalt/xhr/BUILD.gn b/cobalt/xhr/BUILD.gn
index 45c43a3..4c5532f 100644
--- a/cobalt/xhr/BUILD.gn
+++ b/cobalt/xhr/BUILD.gn
@@ -57,6 +57,7 @@
     "//cobalt/test:run_all_unittests",
     "//testing/gmock",
     "//testing/gtest",
+    "//url",
 
     # TODO: Remove the dependency below, it works around the fact that
     #       ScriptValueFactory has non-virtual method CreatePromise().
diff --git a/cobalt/xhr/xhr.gyp b/cobalt/xhr/xhr.gyp
deleted file mode 100644
index c3ebc4c..0000000
--- a/cobalt/xhr/xhr.gyp
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'xhr',
-      'type': 'static_library',
-      'sources': [
-        'url_fetcher_buffer_writer.cc',
-        'url_fetcher_buffer_writer.h',
-        'xml_http_request.cc',
-        'xml_http_request.h',
-        'xml_http_request_event_target.cc',
-        'xml_http_request_event_target.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/dom_parser/dom_parser.gyp:dom_parser',
-        '<(DEPTH)/net/net.gyp:net',
-      ],
-      'conditions': [
-        ['enable_xhr_header_filtering == 1 and sb_evergreen == 0', {
-          'sources': [
-            'xhr_modify_headers.h',
-          ],
-          'dependencies': [
-            '<@(cobalt_platform_dependencies)',
-          ],
-          'defines': [
-            'COBALT_ENABLE_XHR_HEADER_FILTERING',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'COBALT_ENABLE_XHR_HEADER_FILTERING',
-            ],
-          },
-        }],
-      ],
-    },
-    {
-      'target_name': 'xhr_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'xml_http_request_test.cc',
-      ],
-      'dependencies': [
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'xhr',
-
-        # TODO: Remove the dependency below, it works around the fact that
-        #       ScriptValueFactory has non-virtual method CreatePromise().
-        '<(DEPTH)/cobalt/script/engine.gyp:engine',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'xhr_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'xhr_test',
-      ],
-      'variables': {
-        'executable_name': 'xhr_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/cobalt/xhr/xml_http_request.cc b/cobalt/xhr/xml_http_request.cc
index 565ceb6..acacfd2 100644
--- a/cobalt/xhr/xml_http_request.cc
+++ b/cobalt/xhr/xml_http_request.cc
@@ -40,6 +40,8 @@
 #include "cobalt/loader/url_fetcher_string_writer.h"
 #include "cobalt/script/global_environment.h"
 #include "cobalt/script/javascript_engine.h"
+#include "cobalt/web/context.h"
+#include "cobalt/web/environment_settings.h"
 #include "cobalt/xhr/xhr_modify_headers.h"
 #include "nb/memory_scope.h"
 #include "net/http/http_util.h"
@@ -493,7 +495,8 @@
   // isn't kDone isn't efficient for large responses.  Fortunately this feature
   // is rarely used.
   if (state_ == kLoading) {
-    LOG(WARNING) << "Retrieving responseText while loading can be inefficient.";
+    LOG_ONCE(WARNING)
+        << "Retrieving responseText while loading can be inefficient.";
     return response_body_->GetTemporaryReferenceOfString();
   }
   return response_body_->GetReferenceOfStringAndSeal();
@@ -725,7 +728,7 @@
     std::string downloaded_data;
     response_body_->GetAndResetDataAndDownloadProgress(&downloaded_data);
     script::Handle<script::Uint8Array> data =
-        script::Uint8Array::New(settings_->global_environment(),
+        script::Uint8Array::New(settings_->context()->global_environment(),
                                 downloaded_data.data(), downloaded_data.size());
     fetch_callback_->value().Run(data);
   }
@@ -963,7 +966,8 @@
       << __FUNCTION__ << " (" << RequestErrorTypeName(request_error_type)
       << ") " << *this << std::endl
       << script::StackTraceToString(
-             settings_->global_environment()->GetStackTrace(0 /*max_frames*/));
+             settings_->context()->global_environment()->GetStackTrace(
+                 0 /*max_frames*/));
   stop_timeout_ = true;
   // Step 1
   TerminateRequest();
@@ -1039,7 +1043,7 @@
         new script::PreallocatedArrayBufferData());
     response_body_->GetAndResetData(downloaded_data.get());
     auto array_buffer = script::ArrayBuffer::New(
-        settings_->global_environment(), std::move(downloaded_data));
+        settings_->context()->global_environment(), std::move(downloaded_data));
     response_array_buffer_reference_.reset(
         new script::ScriptValue<script::ArrayBuffer>::Reference(this,
                                                                 array_buffer));
@@ -1077,9 +1081,11 @@
 
 void XMLHttpRequest::IncrementActiveRequests() {
   if (active_requests_count_ == 0) {
+    DCHECK(settings_);
+    DCHECK(settings_->context());
     prevent_gc_until_send_complete_.reset(
         new script::GlobalEnvironment::ScopedPreventGarbageCollection(
-            settings_->global_environment(), this));
+            settings_->context()->global_environment(), this));
   }
   active_requests_count_++;
 }
@@ -1111,7 +1117,7 @@
   response_array_buffer_reference_.reset();
 
   network::NetworkModule* network_module =
-      settings_->fetcher_factory()->network_module();
+      settings_->context()->fetcher_factory()->network_module();
   url_fetcher_ = net::URLFetcher::Create(request_url_, method_, this);
   ++url_fetcher_generation_;
   url_fetcher_->SetRequestContext(network_module->url_request_context_getter());
@@ -1183,8 +1189,8 @@
   }
   DLOG_IF(INFO, verbose()) << __FUNCTION__ << *this;
   if (!dopreflight) {
-    DCHECK(settings_->network_module());
-    StartURLFetcher(settings_->network_module()->max_network_delay(),
+    DCHECK(settings_->context()->network_module());
+    StartURLFetcher(settings_->context()->network_module()->max_network_delay(),
                     url_fetcher_generation_);
   }
 }
@@ -1194,8 +1200,8 @@
 }
 
 void XMLHttpRequest::CORSPreflightSuccessCallback() {
-  DCHECK(settings_->network_module());
-  StartURLFetcher(settings_->network_module()->max_network_delay(),
+  DCHECK(settings_->context()->network_module());
+  StartURLFetcher(settings_->context()->network_module()->max_network_delay(),
                   url_fetcher_generation_);
 }
 
diff --git a/cobalt/xhr/xml_http_request_test.cc b/cobalt/xhr/xml_http_request_test.cc
index 53c2613..f1e023c 100644
--- a/cobalt/xhr/xml_http_request_test.cc
+++ b/cobalt/xhr/xml_http_request_test.cc
@@ -24,6 +24,7 @@
 #include "cobalt/script/testing/fake_script_value.h"
 #include "cobalt/script/testing/mock_exception_state.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
 
 using cobalt::dom::EventListener;
 using cobalt::dom::testing::MockEventListener;
@@ -90,11 +91,7 @@
 
 class FakeSettings : public dom::testing::StubEnvironmentSettings {
  public:
-  FakeSettings() : example_("http://example.com") {}
-  const GURL& base_url() const override { return example_; }
-
- private:
-  GURL example_;
+  FakeSettings() { set_base_url(GURL("http://example.com")); }
 };
 
 class MockCspDelegate : public dom::CspDelegateInsecure {
diff --git a/components/client_update_protocol/client_update_protocol.gyp b/components/client_update_protocol/client_update_protocol.gyp
deleted file mode 100644
index b49eef7..0000000
--- a/components/client_update_protocol/client_update_protocol.gyp
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the 'License');
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an 'AS IS' BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'client_update_protocol',
-      'type': 'static_library',
-      'sources': [
-        'ecdsa.cc',
-        'ecdsa.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/crypto/crypto.gyp:crypto',
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-    },
-    {
-      'target_name': 'client_update_protocol_unittests',
-      'type': 'static_library',
-      'sources': [
-        'ecdsa_unittest.cc',
-      ],
-      'dependencies': [
-        'client_update_protocol',
-        '<(DEPTH)/crypto/crypto.gyp:crypto',
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-  ]
-}
diff --git a/components/crx_file/crx_file.gyp b/components/crx_file/crx_file.gyp
deleted file mode 100644
index bff0031..0000000
--- a/components/crx_file/crx_file.gyp
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the 'License');
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an 'AS IS' BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'crx_file',
-      'type': 'static_library',
-      'sources': [
-        'crx_file.h',
-        'crx_verifier.cc',
-        'crx_verifier.h',
-        'crx3.pb.cc',
-        'crx3.pb.h',
-        'crx3.proto',
-        'id_util.cc',
-        'id_util.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-        '<(DEPTH)/crypto/crypto.gyp:crypto',
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-    },
-    {
-      'target_name': 'crx_creator',
-      'type': 'static_library',
-      'sources': [
-        'crx_creator.cc',
-        'crx_creator.h',
-      ],
-      'dependencies': [
-        'crx_file',
-        '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-        '<(DEPTH)/crypto/crypto.gyp:crypto',
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-    },
-  ]
-}
diff --git a/components/prefs/prefs.gyp b/components/prefs/prefs.gyp
deleted file mode 100644
index 62df19c..0000000
--- a/components/prefs/prefs.gyp
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the 'License');
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an 'AS IS' BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'prefs',
-      'type': 'static_library',
-      'sources': [
-        'command_line_pref_store.cc',
-        'command_line_pref_store.h',
-        'default_pref_store.cc',
-        'default_pref_store.h',
-        'in_memory_pref_store.cc',
-        'in_memory_pref_store.h',
-        'json_pref_store.cc',
-        'json_pref_store.h',
-        'overlay_user_pref_store.cc',
-        'overlay_user_pref_store.h',
-        'persistent_pref_store.cc',
-        'persistent_pref_store.h',
-        'pref_change_registrar.cc',
-        'pref_change_registrar.h',
-        'pref_filter.h',
-        'pref_member.cc',
-        'pref_member.h',
-        'pref_notifier.h',
-        'pref_notifier_impl.cc',
-        'pref_notifier_impl.h',
-        'pref_observer.h',
-        'pref_registry.cc',
-        'pref_registry.h',
-        'pref_registry_simple.cc',
-        'pref_registry_simple.h',
-        'pref_service.cc',
-        'pref_service.h',
-        'pref_service_factory.cc',
-        'pref_service_factory.h',
-        'pref_store.cc',
-        'pref_store.h',
-        'pref_value_map.cc',
-        'pref_value_map.h',
-        'pref_value_store.cc',
-        'pref_value_store.h',
-        'prefs_export.h',
-        'scoped_user_pref_update.cc',
-        'scoped_user_pref_update.h',
-        'value_map_pref_store.cc',
-        'value_map_pref_store.h',
-        'writeable_pref_store.cc',
-        'writeable_pref_store.h',
-      ],
-     'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/base/util/values/values_util.gyp:values_util',
-      ],
-     'defines': [
-       'COMPONENTS_PREFS_IMPLEMENTATION',
-     ],
-    },
-    {
-      'target_name': 'test_support',
-      'type': 'static_library',
-      'sources': [
-        'mock_pref_change_callback.cc',
-        'mock_pref_change_callback.h',
-        'pref_store_observer_mock.cc',
-        'pref_store_observer_mock.h',
-        'testing_pref_service.cc',
-        'testing_pref_service.h',
-        'testing_pref_store.cc',
-        'testing_pref_store.h',
-      ],
-      'dependencies': [
-        'prefs',
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-  ]
-}
diff --git a/components/update_client/BUILD.gn b/components/update_client/BUILD.gn
index e2ccd9b..1a2fd5f 100644
--- a/components/update_client/BUILD.gn
+++ b/components/update_client/BUILD.gn
@@ -247,6 +247,4 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/components/update_client/cobalt_slot_management.cc b/components/update_client/cobalt_slot_management.cc
index d220b74..6abee58 100644
--- a/components/update_client/cobalt_slot_management.cc
+++ b/components/update_client/cobalt_slot_management.cc
@@ -89,11 +89,15 @@
     return false;
   }
   app_key_ = app_key;
+  initialized_ = true;
   return true;
 }
 
 bool CobaltSlotManagement::SelectSlot(base::FilePath* dir) {
-  SB_DCHECK(installation_api_);
+  SB_DCHECK(initialized_);
+  if (!initialized_) {
+    return false;
+  }
   LOG(INFO) << "CobaltSlotManagement::SelectSlot";
   int max_slots = installation_api_->GetMaxNumberInstallations();
   if (max_slots == IM_EXT_ERROR) {
@@ -125,16 +129,18 @@
     base::FilePath installation_dir(
         std::string(installation_path.begin(), installation_path.end()));
 
-    // Cleanup expired drain files.
-    DrainFileClear(installation_dir.value().c_str(), app_key_.c_str(), true);
+    // Cleanup all expired files from all apps.
+    DrainFileClearExpired(installation_dir.value().c_str());
 
     // Cleanup all drain files from the current app.
-    DrainFileRemove(installation_dir.value().c_str(), app_key_.c_str());
+    DrainFileClearForApp(installation_dir.value().c_str(), app_key_.c_str());
+
     base::Version version =
         cobalt::updater::ReadEvergreenVersion(installation_dir);
     if (!version.IsValid()) {
       LOG(INFO) << "CobaltSlotManagement::SelectSlot installed version invalid";
-      if (!DrainFileDraining(installation_dir.value().c_str(), "")) {
+      if (!DrainFileIsAnotherAppDraining(installation_dir.value().c_str(),
+                                         app_key_.c_str())) {
         LOG(INFO) << "CobaltSlotManagement::SelectSlot not draining";
         // Found empty slot.
         slot_candidate = i;
@@ -147,7 +153,8 @@
       }
     } else if ((!slot_candidate_version.IsValid() ||
                 slot_candidate_version > version)) {
-      if (!DrainFileDraining(installation_dir.value().c_str(), "")) {
+      if (!DrainFileIsAnotherAppDraining(installation_dir.value().c_str(),
+                                         app_key_.c_str())) {
         // Found a slot with older version that's not draining.
         LOG(INFO) << "CobaltSlotManagement::SelectSlot slot candidate: " << i;
         slot_candidate_version = version;
@@ -175,7 +182,10 @@
 }
 
 bool CobaltSlotManagement::ConfirmSlot(const base::FilePath& dir) {
-  SB_DCHECK(installation_api_);
+  SB_DCHECK(initialized_);
+  if (!initialized_) {
+    return false;
+  }
   LOG(INFO) << "CobaltSlotManagement::ConfirmSlot ";
   if (!DrainFileRankAndCheck(dir.value().c_str(), app_key_.c_str())) {
     LOG(INFO) << "CobaltSlotManagement::ConfirmSlot: failed to lock slot ";
@@ -198,13 +208,49 @@
   return true;
 }
 
-void CobaltSlotManagement::CleanupAllDrainFiles(const base::FilePath& dir) {
-  if (!dir.empty() && !app_key_.empty()) {
-    DrainFileRemove(dir.value().c_str(), app_key_.c_str());
+void CobaltSlotManagement::CleanupAllDrainFiles() {
+  SB_DCHECK(initialized_);
+  if (!initialized_) {
+    return;
+  }
+
+  int max_slots = installation_api_->GetMaxNumberInstallations();
+  if (max_slots == IM_EXT_ERROR) {
+    LOG(ERROR) << "CobaltSlotManagement::CleanupAllDrainFile: Failed to get "
+                  "max number of slots";
+    return;
+  }
+
+  // Iterate over all writeable installation slots.
+  for (int i = 1; i < max_slots; i++) {
+    LOG(INFO) << "CobaltSlotManagement::CleanupAllDrainFile iterating slot="
+              << i;
+    std::vector<char> installation_path(kSbFileMaxPath);
+    if (installation_api_->GetInstallationPath(i, installation_path.data(),
+                                               installation_path.size()) ==
+        IM_EXT_ERROR) {
+      LOG(ERROR) << "CobaltSlotManagement::CleanupAllDrainFile: Failed to get "
+                    "installation path for slot="
+                 << i;
+      continue;
+    }
+
+    LOG(INFO)
+        << "CobaltSlotManagement::CleanupAllDrainFile: installation_path = "
+        << installation_path.data();
+
+    base::FilePath installation_dir(
+        std::string(installation_path.begin(), installation_path.end()));
+
+    DrainFileClearForApp(installation_dir.value().c_str(), app_key_.c_str());
   }
 }
 
 int CobaltSlotManagement::GetInstallationIndex() {
+  SB_DCHECK(initialized_);
+  if (!initialized_) {
+    return false;
+  }
   return installation_index_;
 }
 
@@ -219,7 +265,7 @@
   if (!starboard::loader_app::CreateAppKeyFile(good_app_key_file_path)) {
     LOG(WARNING) << "Failed to create good app key file";
   }
-  DrainFileRemove(dir.c_str(), app_key.c_str());
+  DrainFileClearForApp(dir.c_str(), app_key.c_str());
   int ret =
       installation_api->RequestRollForwardToInstallation(installation_index);
   if (ret == IM_EXT_ERROR) {
@@ -275,18 +321,24 @@
     base::Version installed_version =
         cobalt::updater::ReadEvergreenVersion(installation_dir);
 
+    std::string good_app_key_file_path =
+        starboard::loader_app::GetGoodAppKeyFilePath(
+            installation_dir.value().c_str(), app_key);
     if (!installed_version.IsValid()) {
       LOG(WARNING) << "CobaltQuickInstallation: invalid version ";
       continue;
     } else if (slot_candidate_version < installed_version &&
                current_version < installed_version &&
-               !DrainFileDraining(installation_dir.value().c_str(), "") &&
+               !DrainFileIsAnotherAppDraining(installation_dir.value().c_str(),
+                                              app_key) &&
                !CheckBadFileExists(installation_dir.value().c_str(), app_key) &&
+               !SbFileExists(good_app_key_file_path.c_str()) &&
                starboard::loader_app::AnyGoodAppKeyFile(
                    installation_dir.value().c_str())) {
       // Found a slot with newer version than the current version that's not
       // draining, and no bad file of current app exists, and a good file
-      // exists. The final candidate is the newest version of the valid
+      // exists from a another app, but not from the current app.
+      // The final candidate is the newest version of the valid
       // candidates.
       LOG(INFO) << "CobaltQuickInstallation: slot candidate: " << i;
       slot_candidate_version = installed_version;
diff --git a/components/update_client/cobalt_slot_management.h b/components/update_client/cobalt_slot_management.h
index 167d628..8eb40c9 100644
--- a/components/update_client/cobalt_slot_management.h
+++ b/components/update_client/cobalt_slot_management.h
@@ -52,12 +52,13 @@
   int GetInstallationIndex();
 
   // Cleanup all drain files of the current app.
-  void CleanupAllDrainFiles(const base::FilePath& dir);
+  void CleanupAllDrainFiles();
 
  private:
   int installation_index_ = IM_EXT_INVALID_INDEX;
   const CobaltExtensionInstallationManagerApi* installation_api_;
   std::string app_key_;
+  bool initialized_ = false;
 };
 
 // Creates a good file and rolls forward to the installation in
diff --git a/components/update_client/cobalt_slot_management_test.cc b/components/update_client/cobalt_slot_management_test.cc
index 01aeb9a..8568c31 100644
--- a/components/update_client/cobalt_slot_management_test.cc
+++ b/components/update_client/cobalt_slot_management_test.cc
@@ -26,7 +26,6 @@
 #include "starboard/loader_app/system_get_extension_shim.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12
 namespace update_client {
 namespace {
 
@@ -113,7 +112,7 @@
   ASSERT_TRUE(cobalt_slot_management.Init(api_));
   base::FilePath dir;
   ASSERT_TRUE(cobalt_slot_management.SelectSlot(&dir));
-  ASSERT_TRUE(DrainFileDraining(dir.value().c_str(), kTestAppKey1));
+  ASSERT_TRUE(DrainFileIsAppDraining(dir.value().c_str(), kTestAppKey1));
   ASSERT_TRUE(base::EndsWith(dir.value(), "installation_1",
                              base::CompareCase::SENSITIVE));
 }
@@ -152,7 +151,7 @@
   ASSERT_TRUE(cobalt_slot_management.Init(api_));
   base::FilePath dir;
   cobalt_slot_management.SelectSlot(&dir);
-  ASSERT_TRUE(DrainFileDraining(dir.value().c_str(), kTestAppKey1));
+  ASSERT_TRUE(DrainFileIsAppDraining(dir.value().c_str(), kTestAppKey1));
   LOG(INFO) << "dir=" << dir;
 
   ASSERT_TRUE(base::EndsWith(dir.value(), "installation_2",
@@ -178,7 +177,7 @@
   ASSERT_TRUE(base::EndsWith(dir.value(), "installation_1",
                              base::CompareCase::SENSITIVE));
 
-  ASSERT_TRUE(DrainFileDraining(dir.value().c_str(), kTestAppKey1));
+  ASSERT_TRUE(DrainFileIsAppDraining(dir.value().c_str(), kTestAppKey1));
 
   ASSERT_TRUE(cobalt_slot_management.ConfirmSlot(dir));
 
@@ -186,6 +185,19 @@
   ASSERT_EQ(IM_MAX_NUM_TRIES, ImGetInstallationNumTriesLeft(1));
 }
 
+TEST_F(CobaltSlotManagementTest, CleanupAllDrainFiles) {
+  if (!storage_path_implemented_) {
+    return;
+  }
+  CobaltSlotManagement cobalt_slot_management;
+  ASSERT_TRUE(cobalt_slot_management.Init(api_));
+  base::FilePath dir;
+  ASSERT_TRUE(cobalt_slot_management.SelectSlot(&dir));
+  ASSERT_TRUE(DrainFileIsAppDraining(dir.value().c_str(), kTestAppKey1));
+  cobalt_slot_management.CleanupAllDrainFiles();
+  ASSERT_FALSE(DrainFileIsAppDraining(dir.value().c_str(), kTestAppKey1));
+}
+
 TEST_F(CobaltSlotManagementTest, CobaltFinishInstallation) {
   std::string slot_path = storage_path_;
   slot_path += kSbFileSepString;
@@ -285,4 +297,3 @@
 }  // namespace
 
 }  // namespace update_client
-#endif  // SB_API_VERSION >= 12
diff --git a/components/update_client/component.cc b/components/update_client/component.cc
index 6570995..a683d29 100644
--- a/components/update_client/component.cc
+++ b/components/update_client/component.cc
@@ -15,9 +15,6 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/post_task.h"
-#if defined(STARBOARD)
-#include "base/threading/thread_id_name_manager.h"
-#endif
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "components/update_client/action_runner.h"
@@ -85,8 +82,7 @@
     const base::FilePath& unpack_path,
     const CrxInstaller::Result& result) {
 #if defined(STARBOARD)
-    LOG(INFO) << "InstallComplete thread_name="
-              << base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread();
+    LOG(INFO) << "InstallComplete";
 #endif
   base::PostTaskWithTraits(
       FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()},
@@ -96,8 +92,7 @@
              const base::FilePath& unpack_path,
              const CrxInstaller::Result& result) {
 #if defined(STARBOARD)
-            LOG(INFO) << "Closure kicked off from InstallComplete thread_name="
-              << base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread();
+            LOG(INFO) << "Closure kicked off from InstallComplete";
 #endif
 // For Cobalt, don't delete the unpack_path, which is not a temp directory.
 // Cobalt uses a dedicated installation slot obtained from the Installation
@@ -121,6 +116,9 @@
     const std::string& public_key,
 #if defined(STARBOARD)
     const int installation_index,
+    PersistedData* metadata,
+    const std::string& id,
+    const std::string& version,
 #endif
     const std::string& fingerprint,
     scoped_refptr<CrxInstaller> installer,
@@ -128,8 +126,7 @@
   DCHECK(base::DirectoryExists(unpack_path));
 
 #if defined(STARBOARD)
-  LOG(INFO) << "InstallOnBlockingTaskRunner thread_name="
-              << base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread();
+  LOG(INFO) << "InstallOnBlockingTaskRunner";
 #endif
 
 #if !defined(STARBOARD)
@@ -170,8 +167,16 @@
       // TODO: add correct error code.
       install_error = InstallError::GENERIC_ERROR;
     } else {
-      if (!CobaltFinishInstallation(installation_api, installation_index,
+      if (CobaltFinishInstallation(installation_api, installation_index,
                                     unpack_path.value(), app_key)) {
+        // Write the version of the unpacked update package to the persisted data.
+        if (metadata != nullptr) {
+          main_task_runner->PostTask(
+              FROM_HERE, base::BindOnce(&PersistedData::SetLastInstalledVersion,
+                                        base::Unretained(metadata), id, version));
+        }
+      } else {
+
         // TODO: add correct error code.
         install_error = InstallError::GENERIC_ERROR;
       }
@@ -203,8 +208,7 @@
     InstallOnBlockingTaskRunnerCompleteCallback callback,
     const ComponentUnpacker::Result& result) {
 #if defined(STARBOARD)
-  LOG(INFO) << "UnpackCompleteOnBlockingTaskRunner thread_name="
-              << base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread();
+  LOG(INFO) << "UnpackCompleteOnBlockingTaskRunner";
   base::DeleteFile(crx_path, false);
 #else
   update_client::DeleteFileAndEmptyParentDirectory(crx_path);
@@ -220,8 +224,9 @@
           SbSystemGetExtension(kCobaltExtensionInstallationManagerName));
       if (installation_api) {
         CobaltSlotManagement cobalt_slot_management;
-        cobalt_slot_management.Init(installation_api);
-        cobalt_slot_management.CleanupAllDrainFiles(crx_path.DirName());
+        if (cobalt_slot_management.Init(installation_api)) {
+          cobalt_slot_management.CleanupAllDrainFiles();
+        }
       }
     }
 #endif
@@ -232,21 +237,15 @@
     return;
   }
 
-#if defined(STARBOARD)
-  // Write the version of the unpacked update package to the persisted data.
-  if (metadata != nullptr) {
-    main_task_runner->PostTask(
-        FROM_HERE, base::BindOnce(&PersistedData::SetLastUnpackedVersion,
-                                  base::Unretained(metadata), id, version));
-  }
-#endif
-
   base::PostTaskWithTraits(
       FROM_HERE, kTaskTraits,
       base::BindOnce(&InstallOnBlockingTaskRunner, main_task_runner,
                      result.unpack_path, result.public_key,
 #if defined(STARBOARD)
                      installation_index,
+                     metadata,
+                     id,
+                     version,
 #endif
                      fingerprint, installer, std::move(callback)));
 }
@@ -268,8 +267,7 @@
     crx_file::VerifierFormat crx_format,
     InstallOnBlockingTaskRunnerCompleteCallback callback) {
 #if defined(STARBOARD)
-  LOG(INFO) << "StartInstallOnBlockingTaskRunner thread_name="
-              << base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread();
+  LOG(INFO) << "StartInstallOnBlockingTaskRunner";
 #endif
   auto unpacker = base::MakeRefCounted<ComponentUnpacker>(
       pk_hash, crx_path, installer, std::move(unzipper_), std::move(patcher_),
@@ -723,8 +721,15 @@
   DCHECK_NE(ErrorCategory::kNone, component.error_category_);
   DCHECK_NE(0, component.error_code_);
 
+#if defined(STARBOARD)
+  // Create an event when the server response included an update, or when it's
+  // an update check error, like quick roll-forward or out of space
+  if (component.IsUpdateAvailable() ||
+      component.error_category_ == ErrorCategory::kUpdateCheck)
+#else
   // Create an event only when the server response included an update.
   if (component.IsUpdateAvailable())
+#endif
     component.AppendEvent(component.MakeEventUpdateComplete());
 
   EndState();
@@ -1030,8 +1035,7 @@
 
 void Component::StateUpdating::DoHandle() {
 #if defined(STARBOARD)
-  LOG(INFO) << "Component::StateUpdating::DoHandle() thread_name="
-              << base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread();
+  LOG(INFO) << "Component::StateUpdating::DoHandle()";
 #endif
   DCHECK(thread_checker_.CalledOnValidThread());
 
diff --git a/components/update_client/crx_downloader.cc b/components/update_client/crx_downloader.cc
index fb18952..4a7c36d 100644
--- a/components/update_client/crx_downloader.cc
+++ b/components/update_client/crx_downloader.cc
@@ -12,9 +12,6 @@
 #include "base/logging.h"
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
-#if defined(STARBOARD)
-#include "base/threading/thread_id_name_manager.h"
-#endif
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #if defined(OS_WIN)
@@ -179,8 +176,7 @@
   DCHECK_EQ(0, download_metrics.error);
   DCHECK(is_handled);
 #if defined(STARBOARD)
-  LOG(INFO) << "CrxDownloader::VerifyResponse thread_name="
-    << base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread();
+  LOG(INFO) << "CrxDownloader::VerifyResponse";
 #endif
   if (VerifyFileHash256(result.response, expected_hash_)) {
     download_metrics_.push_back(download_metrics);
diff --git a/components/update_client/persisted_data.cc b/components/update_client/persisted_data.cc
index 2928b2e..0e80750 100644
--- a/components/update_client/persisted_data.cc
+++ b/components/update_client/persisted_data.cc
@@ -81,7 +81,7 @@
 }
 
 #if defined(STARBOARD)
-std::string PersistedData::GetLastUnpackedVersion(const std::string& id) const {
+std::string PersistedData::GetLastInstalledVersion(const std::string& id) const {
   return GetString(id, "version");
 }
 std::string PersistedData::GetUpdaterChannel(const std::string& id) const {
@@ -145,7 +145,7 @@
 }
 
 #if defined(STARBOARD)
-void PersistedData::SetLastUnpackedVersion(const std::string& id,
+void PersistedData::SetLastInstalledVersion(const std::string& id,
                                            const std::string& version) {
   SetString(id, "version", version);
 }
diff --git a/components/update_client/persisted_data.h b/components/update_client/persisted_data.h
index 84efa3e..a59b92c 100644
--- a/components/update_client/persisted_data.h
+++ b/components/update_client/persisted_data.h
@@ -51,10 +51,10 @@
   int GetDateLastActive(const std::string& id) const;
 
 #if defined(STARBOARD)
-  // Returns the version of the update that was last successfully unpacked for
+  // Returns the version of the update that was last successfully installed for
   // the specified |id|. "" indicates that there is no recorded version value
   // for the |id|.
-  std::string GetLastUnpackedVersion(const std::string& id) const;
+  std::string GetLastInstalledVersion(const std::string& id) const;
 
   // Returns the updater channel that is set for the specified |id|. ""
   // indicates that there is no recorded updater channel value for the |id|.
@@ -82,9 +82,9 @@
   void SetDateLastActive(const std::vector<std::string>& ids, int datenum);
 
 #if defined(STARBOARD)
-  // Records the version of the update that is successfully unpacked for
+  // Records the version of the update that is successfully installed for
   // the specified |id|.
-  void SetLastUnpackedVersion(const std::string& id,
+  void SetLastInstalledVersion(const std::string& id,
                               const std::string& version);
 
   // Records the updater channel that is set for the specified |id|.
diff --git a/components/update_client/task_update.cc b/components/update_client/task_update.cc
index b4894b7..ea331b4 100644
--- a/components/update_client/task_update.cc
+++ b/components/update_client/task_update.cc
@@ -43,6 +43,10 @@
   DCHECK(thread_checker_.CalledOnValidThread());
 #if defined(STARBOARD)
   LOG(INFO) << "TaskUpdate::Run begin";
+  if(is_completed_) {
+    LOG(WARNING) << "TaskUpdate::Run already completed";
+    return;
+  }
 #endif
 
   if (ids_.empty()) {
diff --git a/components/update_client/update_checker.cc b/components/update_client/update_checker.cc
index d0d77a6..8c18587 100644
--- a/components/update_client/update_checker.cc
+++ b/components/update_client/update_checker.cc
@@ -21,7 +21,6 @@
 #include "base/task/post_task.h"
 #include "base/threading/thread_checker.h"
 #if defined(STARBOARD)
-#include "base/threading/thread_id_name_manager.h"
 #include "cobalt/extension/free_space.h"
 #endif
 #include "base/threading/thread_task_runner_handle.h"
@@ -168,8 +167,7 @@
 // This function runs on the blocking pool task runner.
 void UpdateCheckerImpl::ReadUpdaterStateAttributes() {
 #if defined(STARBOARD)
-  LOG(INFO) << "UpdateCheckerImpl::ReadUpdaterStateAttributes current_thread="
-    << base::ThreadIdNameManager::GetInstance()->GetNameForCurrentThread();
+  LOG(INFO) << "UpdateCheckerImpl::ReadUpdaterStateAttributes";
 #endif
 
 #if defined(OS_WIN)
@@ -246,16 +244,6 @@
       return;
     }
 
-    std::string unpacked_version =
-        GetPersistedData()->GetLastUnpackedVersion(app_id);
-    // If the version of the last unpacked update package is higher than the
-    // version of the running binary, use the former to indicate the current
-    // update version in the update check request.
-    if (!unpacked_version.empty() &&
-        base::Version(unpacked_version).CompareTo(current_version) > 0) {
-      current_version = base::Version(unpacked_version);
-    }
-
     if (CobaltQuickUpdate(installation_api, current_version)) {
       // The last parameter in UpdateCheckFailed below, which is to be passed to
       // update_check_callback_, indicates a throttling by the update server.
@@ -268,6 +256,15 @@
       return;
     }
 
+    std::string last_installed_version =
+        GetPersistedData()->GetLastInstalledVersion(app_id);
+    // If the version of the last installed update package is higher than the
+    // version of the running binary, use the former to indicate the current
+    // update version in the update check request.
+    if (!last_installed_version.empty() &&
+        base::Version(last_installed_version).CompareTo(current_version) > 0) {
+      current_version = base::Version(last_installed_version);
+    }
 // If the quick roll forward update slot candidate doesn't exist, continue
 // with update check.
 #endif
diff --git a/components/update_client/update_client.cc b/components/update_client/update_client.cc
index 4d6dfb8..9800348 100644
--- a/components/update_client/update_client.cc
+++ b/components/update_client/update_client.cc
@@ -176,6 +176,12 @@
 void UpdateClientImpl::NotifyObservers(Observer::Events event,
                                        const std::string& id) {
   DCHECK(thread_checker_.CalledOnValidThread());
+#if defined(STARBOARD)
+  if (is_stopped_) {
+    LOG(WARNING) << "UpdateClientImpl::NotifyObservers: already stopped";
+    return;
+  }
+#endif
   for (auto& observer : observer_list_)
     observer.OnEvent(event, id);
 }
diff --git a/components/update_client/update_client.gyp b/components/update_client/update_client.gyp
deleted file mode 100644
index 6a15ed0..0000000
--- a/components/update_client/update_client.gyp
+++ /dev/null
@@ -1,223 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the 'License');
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an 'AS IS' BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'update_client',
-      'type': 'static_library',
-      'sources': [
-        'action_runner.cc',
-        'action_runner.h',
-        'activity_data_service.h',
-        'cobalt_slot_management.cc',
-        'cobalt_slot_management.h',
-        'command_line_config_policy.cc',
-        'command_line_config_policy.h',
-        'component.cc',
-        'component.h',
-        'component_patcher.cc',
-        'component_patcher.h',
-        'component_patcher_operation.cc',
-        'component_patcher_operation.h',
-        'component_unpacker.cc',
-        'component_unpacker.h',
-        'configurator.h',
-        'crx_downloader.cc',
-        'crx_downloader.h',
-        'crx_update_item.h',
-        'network.cc',
-        'network.h',
-        'patcher.h',
-        'persisted_data.cc',
-        'persisted_data.h',
-        'ping_manager.cc',
-        'ping_manager.h',
-        'protocol_definition.cc',
-        'protocol_definition.h',
-        'protocol_handler.cc',
-        'protocol_handler.h',
-        'protocol_parser.cc',
-        'protocol_parser.h',
-        'protocol_parser_json.cc',
-        'protocol_parser_json.h',
-        'protocol_serializer.cc',
-        'protocol_serializer.h',
-        'protocol_serializer_json.cc',
-        'protocol_serializer_json.h',
-        'request_sender.cc',
-        'request_sender.h',
-        'task.h',
-        'task_send_uninstall_ping.cc',
-        'task_send_uninstall_ping.h',
-        'task_traits.h',
-        'task_update.cc',
-        'task_update.h',
-        'unzipper.h',
-        'update_checker.cc',
-        'update_checker.h',
-        'update_client.cc',
-        'update_client.h',
-        'update_client_errors.h',
-        'update_client_internal.h',
-        'update_engine.cc',
-        'update_engine.h',
-        'update_query_params.cc',
-        'update_query_params.h',
-        'update_query_params_delegate.cc',
-        'update_query_params_delegate.h',
-        'updater_state.cc',
-        'updater_state.h',
-        'url_fetcher_downloader.cc',
-        'url_fetcher_downloader.h',
-        'utils.cc',
-        'utils.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/components/crx_file/crx_file.gyp:crx_file',
-        '<(DEPTH)/components/client_update_protocol/client_update_protocol.gyp:client_update_protocol',
-        '<(DEPTH)/components/prefs/prefs.gyp:prefs',
-        '<(DEPTH)/crypto/crypto.gyp:crypto',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/starboard/loader_app/app_key_files.gyp:app_key_files',
-        '<(DEPTH)/starboard/loader_app/drain_file.gyp:drain_file',
-        '<(DEPTH)/third_party/libxml/libxml.gyp:libxml',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-      'defines': [
-        'LIBXML_READER_ENABLED',
-        'LIBXML_WRITER_ENABLED',
-      ],
-    },
-    {
-      'target_name': 'test_support',
-      'type': 'static_library',
-      'sources': [
-        'net/network_impl_cobalt.cc',
-        'net/network_impl_cobalt.h',
-        'net/network_cobalt.h',
-        'net/url_request_post_interceptor.cc',
-        'net/url_request_post_interceptor.h',
-        'patch/patch_impl_cobalt.cc',
-        'patch/patch_impl_cobalt.h',
-        'test_configurator.cc',
-        'test_configurator.h',
-        'unzip/unzip_impl_cobalt.cc',
-        'unzip/unzip_impl_cobalt.h',
-      ],
-      'dependencies': [
-        'update_client',
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/cobalt/loader/loader.gyp:loader',
-        '<(DEPTH)/cobalt/debug/debug.gyp:console_command_manager',
-        '<(DEPTH)/components/prefs/prefs.gyp:prefs',
-        '<(DEPTH)/net/net.gyp:net',
-        '<(DEPTH)/net/net.gyp:test_support',
-        '<(DEPTH)/cobalt/network/network.gyp:network',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/third_party/zlib/zlib.gyp:zip',
-        '<(DEPTH)/url/url.gyp:url',
-      ],
-    },
-    {
-      'target_name': 'update_client_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<(DEPTH)/components/test/data/update_client',
-        ],
-        'content_test_output_subdir' : 'components/test/data',
-      },
-      'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-    },
-    {
-      'target_name': 'update_client_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'component_unpacker_unittest.cc',
-        # TODO: enable the tests commented out
-        'crx_downloader_unittest.cc',
-        'persisted_data_unittest.cc',
-        'ping_manager_unittest.cc',
-        'protocol_parser_json_unittest.cc',
-        # 'protocol_serializer_json_unittest.cc',
-        'protocol_serializer_unittest.cc',
-        'request_sender_unittest.cc',
-        'update_checker_unittest.cc',
-        # 'update_client_unittest.cc',
-        'update_query_params_unittest.cc',
-        'updater_state_unittest.cc',
-        'utils_unittest.cc',
-        '<(DEPTH)/cobalt/updater/utils.cc',
-      ],
-      'dependencies': [
-        'update_client',
-        'test_support',
-        'update_client_test_data',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/components/prefs/prefs.gyp:prefs',
-        '<(DEPTH)/components/prefs/prefs.gyp:test_support',
-        '<(DEPTH)/components/crx_file/crx_file.gyp:crx_file',
-        '<(DEPTH)/net/net.gyp:test_support',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': [ '<(DEPTH)/cobalt/test/test.gypi' ],
-    },
-    {
-      'target_name': 'update_client_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'update_client_test',
-      ],
-      'variables': {
-        'executable_name': 'update_client_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      'target_name': 'cobalt_slot_management_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'cobalt_slot_management_test.cc',
-        '<(DEPTH)/cobalt/updater/utils.cc',
-        '<(DEPTH)/starboard/common/test_main.cc',
-        '<(DEPTH)/starboard/loader_app/system_get_extension_shim.cc',
-      ],
-      'dependencies': [
-        ':update_client',
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-        '<(DEPTH)/components/prefs/prefs.gyp:prefs',
-        '<(DEPTH)/components/prefs/prefs.gyp:test_support',
-        '<(DEPTH)/components/crx_file/crx_file.gyp:crx_file',
-        '<(DEPTH)/net/net.gyp:test_support',
-        '<(DEPTH)/starboard/loader_app/installation_manager.gyp:installation_manager',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'cobalt_slot_management_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'cobalt_slot_management_test',
-      ],
-      'variables': {
-        'executable_name': 'cobalt_slot_management_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ]
-}
diff --git a/components/update_client/url_fetcher_downloader.cc b/components/update_client/url_fetcher_downloader.cc
index 4536da6..1ae692c 100644
--- a/components/update_client/url_fetcher_downloader.cc
+++ b/components/update_client/url_fetcher_downloader.cc
@@ -194,7 +194,7 @@
 #endif
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 #if defined(STARBOARD)
-  cobalt_slot_management_.CleanupAllDrainFiles(download_dir_);
+  cobalt_slot_management_.CleanupAllDrainFiles();
 #endif
   Result result;
 #if defined(STARBOARD)
diff --git a/content/browser/speech/BUILD.gn b/content/browser/speech/BUILD.gn
index 0109760..6e5ae30 100644
--- a/content/browser/speech/BUILD.gn
+++ b/content/browser/speech/BUILD.gn
@@ -30,3 +30,18 @@
     "//cobalt/media",
   ]
 }
+
+target(gtest_target_type, "speech_test") {
+  testonly = true
+  sources = [
+    "chunked_byte_buffer_unittest.cc",
+    "endpointer/endpointer_unittest.cc",
+  ]
+  deps = [
+    ":speech",
+    "//cobalt/media",
+    "//cobalt/test:run_all_unittests",
+    "//starboard",
+    "//testing/gtest",
+  ]
+}
diff --git a/content/browser/speech/speech.gyp b/content/browser/speech/speech.gyp
deleted file mode 100644
index e562177..0000000
--- a/content/browser/speech/speech.gyp
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright 2016 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'speech',
-      'type': 'static_library',
-      'sources': [
-        'audio_buffer.cc',
-        'audio_buffer.h',
-        'chunked_byte_buffer.cc',
-        'chunked_byte_buffer.h',
-        'endpointer/endpointer.cc',
-        'endpointer/endpointer.h',
-        'endpointer/energy_endpointer.cc',
-        'endpointer/energy_endpointer.h',
-        'endpointer/energy_endpointer_params.cc',
-        'endpointer/energy_endpointer_params.h',
-      ],
-    },
-    {
-      'target_name': 'speech_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'chunked_byte_buffer_unittest.cc',
-        'endpointer/endpointer_unittest.cc',
-      ],
-      'dependencies': [
-        'speech',
-        '<(DEPTH)/base/base.gyp:test_support_base',
-        '<(DEPTH)/cobalt/media/media.gyp:media',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'includes': ['<(DEPTH)/base/test/test.gypi'],
-    },
-
-    {
-      'target_name': 'speech_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'speech_test',
-      ],
-      'variables': {
-        'executable_name': 'speech_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/crypto/BUILD.gn b/crypto/BUILD.gn
index 4c4de15..1eeebcd 100644
--- a/crypto/BUILD.gn
+++ b/crypto/BUILD.gn
@@ -188,8 +188,6 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-
-  content_deps = [ "//third_party/icu:icudata" ]
 }
 
 # This has no sources in some cases so can't be a static library.
diff --git a/crypto/crypto.gyp b/crypto/crypto.gyp
deleted file mode 100644
index 48610c6..0000000
--- a/crypto/crypto.gyp
+++ /dev/null
@@ -1,114 +0,0 @@
-{
-  'variables': {
-    'chromium_code': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'crypto',
-      'type': '<(component)',
-      'product_name': 'crcrypto',  # Avoid colliding with OpenSSL's libcrypto
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-        '<(DEPTH)/third_party/boringssl/boringssl.gyp:crypto',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'defines': [
-        'CRYPTO_IMPLEMENTATION',
-      ],
-      'msvs_disabled_warnings': [
-        4018,
-      ],
-      'sources': [
-        'aead.cc',
-        'aead.h',
-        'crypto_export.h',
-        'ec_private_key.cc',
-        'ec_private_key.h',
-        'ec_signature_creator.cc',
-        'ec_signature_creator.h',
-        'ec_signature_creator_impl.cc',
-        'ec_signature_creator_impl.h',
-        'encryptor.cc',
-        'encryptor.h',
-        'hkdf.cc',
-        'hkdf.h',
-        'hmac.cc',
-        'hmac.h',
-        'mac_security_services_lock.cc',
-        'mac_security_services_lock.h',
-
-        # TODO(brettw) these mocks should be moved to a test_support_crypto
-        # target if possible.
-        'openssl_util.cc',
-        'openssl_util.h',
-        'p224.cc',
-        'p224.h',
-        'p224_spake.cc',
-        'p224_spake.h',
-        'random.cc',
-        'random.h',
-        'rsa_private_key.cc',
-        'rsa_private_key.h',
-        'secure_hash.cc',
-        'secure_hash.h',
-        'secure_util.cc',
-        'secure_util.h',
-        'sha2.cc',
-        'sha2.h',
-        'signature_creator.cc',
-        'signature_creator.h',
-        'signature_verifier.cc',
-        'signature_verifier.h',
-        'symmetric_key.cc',
-        'symmetric_key.h',
-        'wincrypt_shim.h',
-      ],
-    },
-    {
-      'target_name': 'crypto_unittests',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'aead_unittest.cc',
-        'ec_private_key_unittest.cc',
-        'ec_signature_creator_unittest.cc',
-        'encryptor_unittest.cc',
-        'hmac_unittest.cc',
-        'p224_spake_unittest.cc',
-        'p224_unittest.cc',
-        'random_unittest.cc',
-        'rsa_private_key_unittest.cc',
-        'secure_hash_unittest.cc',
-        'sha2_unittest.cc',
-        'signature_creator_unittest.cc',
-        'signature_verifier_unittest.cc',
-        'symmetric_key_unittest.cc',
-      ],
-      'dependencies': [
-        'crypto',
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/base/base.gyp:test_support_base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': ['<(DEPTH)/base/test/test.gypi'],
-    },
-  ],
-  'conditions': [
-    ['cobalt==1', {
-      'targets': [
-        {
-          'target_name': 'crypto_unittests_deploy',
-          'type': 'none',
-          'dependencies': [
-            'crypto_unittests',
-          ],
-          'variables': {
-            'executable_name': 'crypto_unittests',
-          },
-          'includes': [ '../starboard/build/deploy.gypi' ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/docker-compose.yml b/docker-compose.yml
index 3d9b34b..0a82474 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -38,6 +38,7 @@
   NINJA_PARALLEL: ${NINJA_PARALLEL:-32}
   IS_CI: ${IS_CI:-0}
   IS_DOCKER: 1
+  PYTHONPATH: /code
 
 services:
 #### Tools
@@ -52,6 +53,16 @@
       FROM_REF: ${FROM_REF:-HEAD^1}
       TO_REF: ${TO_REF:-HEAD}
 
+  pytest:
+    build:
+      context: ./docker/pytest
+      dockerfile: Dockerfile
+    image: cobalt-build-pytest
+    volumes:
+    - ${COBALT_SRC:-.}:/code/
+    depends_on:
+      - base
+
 #### Cobalt build containers
   base:
     build:
@@ -109,18 +120,6 @@
       PLATFORM: stub
       CONFIG: ${CONFIG:-debug}
 
-  stub-gn:
-    <<: *build-common-definitions
-    build:
-      context: ./docker/linux
-      dockerfile: stub/gn/Dockerfile
-    image: cobalt-build-linux-stub-gn
-    depends_on: [ stub ]
-    environment:
-      <<: *shared-build-env
-      PLATFORM: stub
-      CONFIG: ${CONFIG:-debug}
-
   linux-x64x11:
     <<: *build-common-definitions
     build:
@@ -134,18 +133,6 @@
       CONFIG: ${CONFIG:-debug}
       TARGET: ${TARGET:-cobalt_deploy}
 
-  linux-x64x11-gn:
-    <<: *build-common-definitions
-    build:
-      context: ./docker/linux
-      dockerfile: linux-x64x11/gn/Dockerfile
-    image: cobalt-build-linux-gn
-    depends_on: [ linux-x64x11 ]
-    environment:
-      <<: *shared-build-env
-      PLATFORM: linux-x64x11
-      CONFIG: ${CONFIG:-debug}
-
   linux-x64x11-bionic:
     <<: *common-definitions
     <<: *build-volumes
@@ -204,18 +191,6 @@
       <<: *shared-build-env
       PLATFORM: android-x86
       CONFIG: ${CONFIG:-debug}
-
-  android-x86-gn:
-    <<: *build-common-definitions
-    image: cobalt-build-android-gn
-    depends_on: [ android-x86 ]
-    build:
-      context: ./docker/linux/android
-      dockerfile: ./gn/Dockerfile
-    environment:
-      <<: *shared-build-env
-      PLATFORM: android-x86
-      CONFIG: ${CONFIG:-debug}
       TARGET_CPU: ${TARGET_CPU:-x86}
 
   android-arm:
@@ -226,18 +201,6 @@
       <<: *shared-build-env
       PLATFORM: android-arm
       CONFIG: ${CONFIG:-debug}
-
-  android-arm-gn:
-    <<: *build-common-definitions
-    image: cobalt-build-android-gn
-    depends_on: [ android-arm ]
-    build:
-      context: ./docker/linux/android
-      dockerfile: ./gn/Dockerfile
-    environment:
-      <<: *shared-build-env
-      PLATFORM: android-arm
-      CONFIG: ${CONFIG:-debug}
       TARGET_CPU: ${TARGET_CPU:-arm}
 
   android-arm64:
@@ -248,18 +211,6 @@
       <<: *shared-build-env
       PLATFORM: android-arm64
       CONFIG: ${CONFIG:-debug}
-
-  android-arm64-gn:
-    <<: *build-common-definitions
-    image: cobalt-build-android-gn
-    depends_on: [ android-arm64 ]
-    build:
-      context: ./docker/linux/android
-      dockerfile: ./gn/Dockerfile
-    environment:
-      <<: *shared-build-env
-      PLATFORM: android-arm64
-      CONFIG: ${CONFIG:-debug}
       TARGET_CPU: ${TARGET_CPU:-arm64}
 
   raspi:
@@ -273,17 +224,6 @@
       PLATFORM: ${PLATFORM:-raspi-2}
       CONFIG: ${CONFIG:-debug}
 
-  raspi-gn:
-    <<: *build-common-definitions
-    build:
-      context: ./docker/linux/raspi
-      dockerfile: ./gn/Dockerfile
-    image: cobalt-build-raspi-gn
-    environment:
-      <<: *shared-build-env
-      PLATFORM: ${PLATFORM:-raspi-2}
-      CONFIG: ${CONFIG:-debug}
-
   # Define common build container for Evergreen
   build-evergreen:
     <<: *build-common-definitions
@@ -302,6 +242,7 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-x64
+      TARGET_CPU: ${TARGET_CPU:-x64}
 
   evergreen-x64-sbversion-12:
     <<: *build-common-definitions
@@ -310,6 +251,8 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-x64-sbversion-12
+      TARGET_CPU: ${TARGET_CPU:-x64}
+      SB_API_VERSION: 12
 
   evergreen-x86:
     <<: *build-common-definitions
@@ -318,6 +261,7 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-x86
+      TARGET_CPU: ${TARGET_CPU:-x86}
 
   evergreen-x86-sbversion-12:
     <<: *build-common-definitions
@@ -326,6 +270,8 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-x86-sbversion-12
+      TARGET_CPU: ${TARGET_CPU:-x86}
+      SB_API_VERSION: 12
 
   evergreen-arm64:
     <<: *build-common-definitions
@@ -334,6 +280,7 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-arm64
+      TARGET_CPU: ${TARGET_CPU:-arm64}
 
   evergreen-arm64-sbversion-12:
     <<: *build-common-definitions
@@ -342,6 +289,8 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-arm64-sbversion-12
+      TARGET_CPU: ${TARGET_CPU:-arm64}
+      SB_API_VERSION: 12
 
   evergreen-arm-hardfp:
     <<: *build-common-definitions
@@ -350,6 +299,7 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-arm-hardfp
+      TARGET_CPU: ${TARGET_CPU:-arm}
 
   evergreen-arm-hardfp-sbversion-12:
     <<: *build-common-definitions
@@ -358,6 +308,8 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-arm-hardfp-sbversion-12
+      TARGET_CPU: ${TARGET_CPU:-arm}
+      SB_API_VERSION: 12
 
   evergreen-arm-softfp:
     <<: *build-common-definitions
@@ -366,6 +318,7 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-arm-softfp
+      TARGET_CPU: ${TARGET_CPU:-arm}
 
   evergreen-arm-softfp-sbversion-12:
     <<: *build-common-definitions
@@ -374,6 +327,8 @@
     environment:
       <<: *shared-build-env
       PLATFORM: evergreen-arm-softfp-sbversion-12
+      TARGET_CPU: ${TARGET_CPU:-arm}
+      SB_API_VERSION: 12
 
   linux-x64x11-sbversion12-evergreen:
     <<: *build-common-definitions
@@ -388,6 +343,7 @@
       <<: *shared-build-env
       PLATFORM: linux-x64x11-sbversion-12
       CONFIG: ${CONFIG:-debug}
+      SB_API_VERSION: 12
 
   # Example usage of unittest:
   # 1. Build the containers for which you want to unittest
diff --git a/docker/docsite/Dockerfile b/docker/docsite/Dockerfile
index b5b4436..3ed5f9a 100644
--- a/docker/docsite/Dockerfile
+++ b/docker/docsite/Dockerfile
@@ -12,8 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-FROM gcr.io/cloud-marketplace-containers/google/ruby
+FROM ruby:2.7-buster
 
+ARG USER
 ARG UID
 ARG GID
 
@@ -26,10 +27,7 @@
 
 COPY Gemfile /app/Gemfile
 
-# Install and use the latest Ruby version, and install all of the required gems.
-RUN rbenv install 2.7.1 && rbenv global 2.7.1 \
-    && bundle install \
-    && echo "Done"
+RUN bundle install --gemfile=/app/Gemfile
 
 # We create and use a non-root user explicitly so that the generated and
 # modified files maintain the same permissions as the user that launched the
@@ -37,6 +35,6 @@
 RUN addgroup --group --gid "${GID}" defaultgroup \
     && adduser --disabled-password --gecos '' --uid "${UID}" --gid "${GID}" defaultuser
 
-USER defaultuser
+USER ${USER:-defaultuser}
 
 CMD /cobalt/third_party/repo-publishing-toolkit-local/preview-site.sh
diff --git a/docker/linux/android/Dockerfile b/docker/linux/android/Dockerfile
index eb26f78..f370c42 100644
--- a/docker/linux/android/Dockerfile
+++ b/docker/linux/android/Dockerfile
@@ -46,6 +46,7 @@
   && echo yes | ${ANDROID_SDK_ROOT}/tools/bin/sdkmanager \
       --sdk_root=${ANDROID_SDK_ROOT} \
     "build-tools;30.0.0" \
+    "build-tools;31.0.0" \
     "cmake;3.10.2.4988404" \
     "cmdline-tools;1.0" \
     "extras;android;m2repository" \
@@ -53,8 +54,9 @@
     "ndk;21.1.6352462" \
     "patcher;v4" \
     "platforms;android-30" \
+    "platforms;android-31" \
     "platform-tools" \
   && echo "Android SDK installed"
 
-CMD /code/cobalt/build/gyp_cobalt -v -C ${CONFIG} ${PLATFORM} \
-    && ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_deploy}
+CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\" target_os=\"android\" target_cpu=\"${TARGET_CPU}\"" && \
+    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_install}
diff --git a/docker/linux/android/gn/Dockerfile b/docker/linux/android/gn/Dockerfile
deleted file mode 100644
index 7c1eb41..0000000
--- a/docker/linux/android/gn/Dockerfile
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-FROM cobalt-build-android
-
-CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\" target_os=\"android\" target_cpu=\"${TARGET_CPU}\"" && \
-    ninja -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG}
diff --git a/docker/linux/base/Dockerfile b/docker/linux/base/Dockerfile
index 9cdc8f8..d0c21b3 100644
--- a/docker/linux/base/Dockerfile
+++ b/docker/linux/base/Dockerfile
@@ -27,10 +27,14 @@
         python-requests \
         python-setuptools \
         python-wheel \
+        python3-dev \
         python3-pip \
         python3-requests \
+        python3-setuptools \
         git ccache \
         curl xz-utils \
     && /opt/clean-after-apt.sh
 
+RUN python3 -m pip install --upgrade pip
+
 CMD ["/usr/bin/python","--version"]
diff --git a/docker/linux/base/build/Dockerfile b/docker/linux/base/build/Dockerfile
index 7c464bb..2a3817f 100644
--- a/docker/linux/base/build/Dockerfile
+++ b/docker/linux/base/build/Dockerfile
@@ -66,6 +66,10 @@
 # == Set up  ccache
 RUN cd /tmp && mkdir ${HOME}/ccache
 
+# == Install and set up statically linked sccache.
+ADD https://storage.googleapis.com/cobalt-docker-resources/linux/sccache /usr/local/bin/sccache
+RUN chmod +x /usr/local/bin/sccache && cd /tmp && mkdir ${HOME}/sccache
+
 # === Install pinned host Clang toolchain for all Linux-hosted builds
 ARG CLANG_VER
 
@@ -81,15 +85,5 @@
     && echo ${CLANG_VER} >> ${TC_HOME}/cr_build_revision \
     && rm clang-${CLANG_VER}.tgz
 
-#  === Install portable sccache binary
-ARG SCCACHE=sccache-dist-v0.2.15-x86_64-unknown-linux-musl.tar.gz
-RUN cd /tmp \
-    && curl -L -O https://github.com/mozilla/sccache/releases/download/v0.2.15/${SCCACHE} \
-    && tar xvzf ${SCCACHE} -C /usr/local/bin --strip-components=1 \
-    && mv /usr/local/bin/sccache-dist /usr/local/bin/sccache \
-    && chmod +x /usr/local/bin/sccache \
-    && rm -rf ${SCCACHE} \
-    && sccache --version
-
 WORKDIR /code
 CMD ["/usr/bin/python","--version"]
diff --git a/docker/linux/clang-3-9/Dockerfile b/docker/linux/clang-3-9/Dockerfile
index 45b1245..d79ccd3 100644
--- a/docker/linux/clang-3-9/Dockerfile
+++ b/docker/linux/clang-3-9/Dockerfile
@@ -20,7 +20,5 @@
     && apt install -qqy --no-install-recommends clang-3.9 \
     && /opt/clean-after-apt.sh
 
-CMD /code/cobalt/build/gyp_cobalt -v -C ${CONFIG} ${PLATFORM} && \
-    ccache -z && \
-    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_deploy} && \
-    ccache -s
+CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\" using_old_compiler=true" && \
+    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_install}
diff --git a/docker/linux/evergreen/Dockerfile b/docker/linux/evergreen/Dockerfile
index 21223d5..f03d182 100644
--- a/docker/linux/evergreen/Dockerfile
+++ b/docker/linux/evergreen/Dockerfile
@@ -23,5 +23,5 @@
         g++-multilib \
     && /opt/clean-after-apt.sh
 
-CMD /code/cobalt/build/gyp_cobalt -v -C ${CONFIG:-debug} ${PLATFORM} && \
-    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG:-debug} ${TARGET:-cobalt_deploy}
+CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG:-debug} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG:-debug}\" target_cpu=\"${TARGET_CPU}\" sb_api_version=${SB_API_VERSION:-14}" && \
+    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG:-debug} ${TARGET:-cobalt_install}
diff --git a/docker/linux/gcc-6-3/Dockerfile b/docker/linux/gcc-6-3/Dockerfile
index ad098e8..2ead07d 100644
--- a/docker/linux/gcc-6-3/Dockerfile
+++ b/docker/linux/gcc-6-3/Dockerfile
@@ -20,8 +20,5 @@
     && apt install -qqy gcc-6 g++-6 \
     && /opt/clean-after-apt.sh
 
-CMD /code/cobalt/build/gyp_cobalt -v -C ${CONFIG} ${PLATFORM} && \
-    ccache -z && \
-    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} \
-                ${TARGET:-cobalt_deploy} && \
-    ccache -s
+CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\" is_clang=false using_old_compiler=true" && \
+    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_install}
diff --git a/docker/linux/linux-x64x11/Dockerfile b/docker/linux/linux-x64x11/Dockerfile
index d58b8d9..f77957f 100644
--- a/docker/linux/linux-x64x11/Dockerfile
+++ b/docker/linux/linux-x64x11/Dockerfile
@@ -27,5 +27,7 @@
         libxi-dev \
     && /opt/clean-after-apt.sh
 
-CMD /code/cobalt/build/gyp_cobalt -v -C ${CONFIG} ${PLATFORM} && \
-    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_deploy}
+RUN python3 -m pip install "selenium==3.141.0" "Brotli==1.0.9"
+
+CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\" sb_api_version=${SB_API_VERSION:-14}" && \
+    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_install}
diff --git a/docker/linux/linux-x64x11/gn/Dockerfile b/docker/linux/linux-x64x11/gn/Dockerfile
deleted file mode 100644
index 05604af..0000000
--- a/docker/linux/linux-x64x11/gn/Dockerfile
+++ /dev/null
@@ -1,4 +0,0 @@
-FROM cobalt-build-linux
-
-CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\"" && \
-    ninja -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG}
diff --git a/docker/linux/raspi/Dockerfile b/docker/linux/raspi/Dockerfile
index 0c015f7..ad4a8e1 100644
--- a/docker/linux/raspi/Dockerfile
+++ b/docker/linux/raspi/Dockerfile
@@ -40,5 +40,5 @@
     && tar xjvf /tmp/${raspi_tools} \
     && rm /tmp/${raspi_tools}
 
-CMD /code/cobalt/build/gyp_cobalt -v -C ${CONFIG} ${PLATFORM} \
-    && ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_deploy}
+CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\" target_cpu=\"arm\" is_clang=false" && \
+    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_install}
diff --git a/docker/linux/raspi/gn/Dockerfile b/docker/linux/raspi/gn/Dockerfile
deleted file mode 100644
index bb56179..0000000
--- a/docker/linux/raspi/gn/Dockerfile
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-FROM cobalt-build-raspi
-
-CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\" target_cpu=\"arm\" is_clang=false" && \
-    ninja -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG}
diff --git a/docker/linux/stub/Dockerfile b/docker/linux/stub/Dockerfile
index 0237a7c..75d429f 100644
--- a/docker/linux/stub/Dockerfile
+++ b/docker/linux/stub/Dockerfile
@@ -28,5 +28,5 @@
         libxml2-dev \
     && /opt/clean-after-apt.sh
 
-CMD /code/cobalt/build/gyp_cobalt -v -C ${CONFIG} ${PLATFORM} && \
-    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_deploy}
+CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\"" && \
+    ninja -v -j ${NINJA_PARALLEL} -C ${OUTDIR}/${PLATFORM}_${CONFIG} ${TARGET:-cobalt_install}
diff --git a/docker/linux/stub/gn/Dockerfile b/docker/linux/stub/gn/Dockerfile
deleted file mode 100644
index 3f4df9a..0000000
--- a/docker/linux/stub/gn/Dockerfile
+++ /dev/null
@@ -1,4 +0,0 @@
-FROM cobalt-build-linux-stub
-
-CMD gn gen ${OUTDIR}/${PLATFORM}_${CONFIG} --args="target_platform=\"${PLATFORM}\" build_type=\"${CONFIG}\"" && \
-    ninja -v -C ${OUTDIR}/${PLATFORM}_${CONFIG}
diff --git a/docker/pytest/Dockerfile b/docker/pytest/Dockerfile
new file mode 100644
index 0000000..962201e
--- /dev/null
+++ b/docker/pytest/Dockerfile
@@ -0,0 +1,22 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM cobalt-base
+
+COPY requirements.txt /opt/requirements.txt
+RUN pip3 install -r /opt/requirements.txt
+
+WORKDIR /code
+
+CMD pytest
diff --git a/docker/pytest/requirements.in b/docker/pytest/requirements.in
new file mode 100644
index 0000000..c62e4d7
--- /dev/null
+++ b/docker/pytest/requirements.in
@@ -0,0 +1,4 @@
+pytest<8
+coverage<7
+requests==2.25.1
+jsonschema<5
diff --git a/docker/pytest/requirements.txt b/docker/pytest/requirements.txt
new file mode 100644
index 0000000..a93c321
--- /dev/null
+++ b/docker/pytest/requirements.txt
@@ -0,0 +1,40 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile --output-file=docker/pytest/requirements.txt docker/pytest/requirements.in
+#
+attrs==21.4.0
+    # via
+    #   jsonschema
+    #   pytest
+certifi==2021.10.8
+    # via requests
+chardet==4.0.0
+    # via requests
+coverage==6.3.2
+    # via -r docker/pytest/requirements.in
+idna==2.10
+    # via requests
+iniconfig==1.1.1
+    # via pytest
+jsonschema==4.4.0
+    # via -r docker/pytest/requirements.in
+packaging==21.3
+    # via pytest
+pluggy==1.0.0
+    # via pytest
+py==1.11.0
+    # via pytest
+pyparsing==3.0.7
+    # via packaging
+pyrsistent==0.18.1
+    # via jsonschema
+pytest==7.1.1
+    # via -r docker/pytest/requirements.in
+requests==2.25.1
+    # via -r docker/pytest/requirements.in
+tomli==2.0.1
+    # via pytest
+urllib3==1.26.9
+    # via requests
diff --git a/docker/windows/base/visualstudio2017/Dockerfile b/docker/windows/base/visualstudio2017/Dockerfile
new file mode 100644
index 0000000..865ab23
--- /dev/null
+++ b/docker/windows/base/visualstudio2017/Dockerfile
@@ -0,0 +1,52 @@
+# escape=`
+
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+ARG FROM_IMAGE
+FROM ${FROM_IMAGE}
+
+# Dockerfile for image used to install Visual Studio.
+# WARNING: Changes to this file will result in an extremely long image rebuild.
+
+SHELL ["powershell", "-ExecutionPolicy", "unrestricted", "-Command"]
+
+RUN mkdir C:\TEMP;`
+    Write-Host ('Downloading vs_buildtools.exe');`
+    Invoke-WebRequest -Uri https://aka.ms/vs/15/release/vs_buildtools.exe -OutFile C:\TEMP\vs_buildtools.exe;`
+    Write-Host ('Installing vs_buildtools.exe');`
+    Start-Process C:\TEMP\vs_buildtools.exe -Wait -NoNewWindow`
+        -ArgumentList '--quiet --wait --norestart --nocache`
+        --installPath C:\BuildTools `
+        --add Microsoft.VisualStudio.Component.VC.CoreIde `
+        --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
+        --add Microsoft.VisualStudio.Component.Windows10SDK.17763 `
+        --add Microsoft.VisualStudio.Component.VC.Tools.14.15';`
+    Write-Host ('Cleaning up vs_buildtools.exe');`
+    Remove-Item -Force -Recurse ${env:ProgramFiles(x86)}\'Microsoft Visual Studio'\Installer;`
+    Remove-Item -Force -Recurse $env:TEMP\*;`
+    Remove-Item -Force -Recurse $env:ProgramData\'Package Cache'\;`
+    Remove-Item -Force -Recurse C:\BuildTools\Common7\IDE\CommonExtensions\Microsoft\TextMate\Starterkit\Extensions;`
+    Remove-Item -Force -Recurse C:\BuildTools\VC\Tools\MSVC\14.15.26726\atlmfc;`
+    Remove-Item -Force -Recurse C:\BuildTools\VC\Tools\MSVC\14.15.26726\lib\spectre;`
+    Remove-Item C:\TEMP\vs_buildtools.exe
+
+ENV VSINSTALLDIR "C:\BuildTools"
+ENV VS_INSTALL_DIR "C:\BuildTools"
+ENV MSVC_TOOLS_VERSION "14.16.27023"
+ENV MSVC_REDIST_VERSION "14.16.27012"
+
+# TODO: remove this environment variable setting, since it is only needed for
+# manually deploying debug versions of DLLs. This can be removed in favor of a
+# dedicated deployment through gyp/ninja.
+ENV MS_WIN_VERSION="10.0.17763.0"
diff --git a/docker/windows/win32/Dockerfile b/docker/windows/win32/Dockerfile
new file mode 100644
index 0000000..b993b9e
--- /dev/null
+++ b/docker/windows/win32/Dockerfile
@@ -0,0 +1,26 @@
+# escape=`
+
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+FROM cobalt-build-win32-base
+
+SHELL ["powershell", "-ExecutionPolicy", "Unrestricted", "-Command", `
+       "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
+
+WORKDIR "C:\code"
+
+CMD python3 cobalt/build/gn.py -p $env:PLATFORM -c $env:CONFIG out/${env:PLATFORM}_${env:CONFIG};`
+    if ($?) {`
+      ninja $env:NINJA_FLAGS -C out/${env:PLATFORM}_$env:CONFIG $env:TARGET;`
+    }
diff --git a/docker/windows/win32/unittest/Dockerfile b/docker/windows/win32/unittest/Dockerfile
new file mode 100644
index 0000000..780c58c
--- /dev/null
+++ b/docker/windows/win32/unittest/Dockerfile
@@ -0,0 +1,40 @@
+# escape=`
+
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+FROM mcr.microsoft.com/windows:1809
+
+# Restore the default Windows shell for correct batch processing.
+SHELL ["cmd", "/S", "/C"]
+
+RUN powershell -ExecutionPolicy unrestricted -Command `
+    iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
+
+# Needed to extract the app launcher scripts for running tests.
+RUN choco install -f -y unzip
+
+# Install python2
+RUN choco install -f -y python2 --params '/InstallDir:C:\python2'
+RUN pip install pypiwin32
+RUN setx path "%path%;C:\Python2"
+RUN setx python2 "C:\Python2\python.exe"
+ADD ./python2.bat /python2/python2.bat
+
+# Install visual C runtime redistributables
+ADD https://aka.ms/vs/16/release/vc_redist.x64.exe C:/vcredist_x64.exe
+RUN C:/vcredist_x64.exe /install /passive /norestart /log out.txt
+
+ADD ./unittest.cmd /unittest.cmd
+
+CMD [ "/unittest.cmd", "${PLATFORM}", "${CONFIG}", "${TEST}"]
diff --git a/docker/windows/win32/unittest/python2.bat b/docker/windows/win32/unittest/python2.bat
new file mode 100644
index 0000000..9e2101e
--- /dev/null
+++ b/docker/windows/win32/unittest/python2.bat
@@ -0,0 +1,3 @@
+@echo off

+setlocal

+c:\python2\python.exe %*

diff --git a/docker/windows/win32/unittest/unittest.cmd b/docker/windows/win32/unittest/unittest.cmd
new file mode 100644
index 0000000..36b1426
--- /dev/null
+++ b/docker/windows/win32/unittest/unittest.cmd
@@ -0,0 +1,7 @@
+if "%1" == "" set "PLATFORM=win-win32"
+if "%2" == "" set "CONFIG=devel"
+if "%3" == "" set "TEST=eztime_test"
+
+cd c:\code\out\%PLATFORM%_%CONFIG%\
+unzip app_launcher.zip -d c:\app_launcher_out\
+%python2% c:\app_launcher_out\starboard\tools\testing\test_runner.py --run --platform %PLATFORM% --config %CONFIG% -o c:\code\out\%PLATFORM%_%CONFIG%
diff --git a/glimp/.gitattributes b/glimp/.gitattributes
index 0f70607..10dbe12 100644
--- a/glimp/.gitattributes
+++ b/glimp/.gitattributes
@@ -19,7 +19,6 @@
 *.y                     text eol=lf
 .clang-format           text eol=lf
 codereview.settings     text eol=lf
-gyp_cobalt              text eol=lf
 
 # Images should be treated as binary files.
 *.exe                   binary
diff --git a/glimp/BUILD.gn b/glimp/BUILD.gn
index cd7670f..d5c3a57 100644
--- a/glimp/BUILD.gn
+++ b/glimp/BUILD.gn
@@ -20,8 +20,8 @@
     # the preprocessor to assemble an include file path, so we have to do
     # the concatenation here in GYP.
     # http://stackoverflow.com/questions/29601786/c-preprocessor-building-a-path-string
-    "GLIMP_EGLPLATFORM_INCLUDE=\"../../$target_platform/eglplatform_public.h\"",
-    "GLIMP_KHRPLATFORM_INCLUDE=\"../../$target_platform/khrplatform_public.h\"",
+    "GLIMP_EGLPLATFORM_INCLUDE=\"../../../starboard/$target_platform/glimp/eglplatform_public.h\"",
+    "GLIMP_KHRPLATFORM_INCLUDE=\"../../../starboard/$target_platform/glimp/khrplatform_public.h\"",
 
     # Uncomment the define below to enable and use tracing inside glimp.
     # "ENABLE_GLIMP_TRACING",
@@ -30,12 +30,12 @@
 
 group("glimp") {
   public_configs = [ ":glimp_config" ]
-  deps = [ "//glimp/${target_platform}:glimp_platform" ]
+  deps = [ "//starboard/${target_platform}/glimp:glimp_platform" ]
 }
 
 config("glimp_common_sources_public_config") {
   configs = [ ":glimp_config" ]
-  include_dirs = [ "$target_platform/platform" ]
+  include_dirs = [ "//starboard/$target_platform/glimp/platform" ]
 }
 
 source_set("glimp_common_sources") {
diff --git a/glimp/egl/display.cc b/glimp/egl/display.cc
index f338b51..3747d9c 100644
--- a/glimp/egl/display.cc
+++ b/glimp/egl/display.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Google Inc. All Rights Reserved.
+ * Copyright 2015 The Cobalt Authors. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,10 +22,46 @@
 #include "glimp/egl/config.h"
 #include "glimp/egl/error.h"
 #include "starboard/common/log.h"
+#include "starboard/event.h"
 
 namespace glimp {
 namespace egl {
 
+// sce::Gnm::submitDone() is expected to be called once every 5 secs:
+// https://ps4.siedev.net/resources/documents/SDK/9.500/Programming-Startup_Guide/0006.html#__document_toc_00000034
+// sce::Gnm::submitDone() gets called regularly in the rasterizer thread and
+// should be called from the main thread when the app is in suspended state.
+// kSubmitDoneDelay is set to 1/60sec (same scheduling frequency as
+// the app in foreground)
+const SbTime kSubmitDoneDelay = kSbTimeSecond / 60;
+
+// Don't repeat the submitDone callback during suspension
+// until specified by eglTerminate.
+bool Display::repeat_submit_done_during_suspend = false;
+
+namespace {
+void ScheduleSubmitDoneCallback(void* context) {
+  if (Display::repeat_submit_done_during_suspend) {
+    SB_DCHECK(true) << "Suspend mode is disabled. ScheduleSubmitDoneCallback "
+                       "shouldn't be triggered.";
+    DisplayImpl::CallSubmitDone();
+    Display::RepeatSubmitDoneDuringSuspend();
+  }
+}
+}  // namespace
+
+void Display::RepeatSubmitDoneDuringSuspend() {
+  static SbEventId submit_done_repeating_callback_event = kSbEventIdInvalid;
+  if (Display::repeat_submit_done_during_suspend) {
+    submit_done_repeating_callback_event =
+        SbEventSchedule(&ScheduleSubmitDoneCallback, NULL, kSubmitDoneDelay);
+  } else {
+    if (submit_done_repeating_callback_event != kSbEventIdInvalid) {
+      SbEventCancel(submit_done_repeating_callback_event);
+    }
+  }
+}
+
 Display::Display(nb::scoped_ptr<DisplayImpl> display_impl)
     : impl_(display_impl.Pass()) {}
 
diff --git a/glimp/egl/display.h b/glimp/egl/display.h
index 8fc432d..b9333d6 100644
--- a/glimp/egl/display.h
+++ b/glimp/egl/display.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Google Inc. All Rights Reserved.
+ * Copyright 2015 The Cobalt Authors. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,6 +35,9 @@
 // upon construction.
 class Display {
  public:
+  static void RepeatSubmitDoneDuringSuspend();
+  static bool repeat_submit_done_during_suspend;
+
   // In order to create a display, it must have a platform-specific
   // implementation injected into it, where many methods will forward to.
   explicit Display(nb::scoped_ptr<DisplayImpl> display_impl);
diff --git a/glimp/egl/display_impl.h b/glimp/egl/display_impl.h
index d98efb9..caf3c3a 100644
--- a/glimp/egl/display_impl.h
+++ b/glimp/egl/display_impl.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Google Inc. All Rights Reserved.
+ * Copyright 2015 The Cobalt Authors. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -53,6 +53,9 @@
   // Creates and returns a new DisplayImpl object.
   // To be implemented by each implementing platform.
   static nb::scoped_ptr<DisplayImpl> Create(EGLNativeDisplayType display_id);
+  // This method is declared here and defined in ps4/egl/display_impl_ps4.cc
+  // and ps5/egl/display_impl_ps5.cc respectively.
+  static void CallSubmitDone();
 
   // Returns the EGL major and minor versions, if they are not NULL.
   // Called by eglInitialize():
diff --git a/glimp/entry_points/egl.cc b/glimp/entry_points/egl.cc
index 4b6d649..71ad8be 100644
--- a/glimp/entry_points/egl.cc
+++ b/glimp/entry_points/egl.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Google Inc. All Rights Reserved.
+ * Copyright 2015 The Cobalt Authors. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -197,6 +197,8 @@
   display->GetVersionInfo(major, minor);
 
   egl::SetError(EGL_SUCCESS);
+  egl::Display::repeat_submit_done_during_suspend = false;
+  egl::Display::RepeatSubmitDoneDuringSuspend();
   return true;
 }
 
@@ -264,6 +266,8 @@
   egl::DisplayRegistry::TerminateDisplay(dpy);
 
   egl::SetError(EGL_SUCCESS);
+  egl::Display::repeat_submit_done_during_suspend = true;
+  egl::Display::RepeatSubmitDoneDuringSuspend();
   return true;
 }
 
diff --git a/glimp/glimp.gyp b/glimp/glimp.gyp
deleted file mode 100644
index 4fcf214..0000000
--- a/glimp/glimp.gyp
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2015 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'glimp',
-      'type': 'none',
-
-      'dependencies': [
-        # Forward-depend on the platform-specific glimp implementation.
-        '<(DEPTH)/glimp/<(sb_target_platform)/glimp_platform.gyp:glimp_platform',
-      ],
-
-      'direct_dependent_settings': {
-        'includes': [
-          'glimp_settings.gypi',
-        ],
-      },
-    },
-  ],
-}
diff --git a/glimp/glimp_common.gypi b/glimp/glimp_common.gypi
deleted file mode 100644
index 2983b68..0000000
--- a/glimp/glimp_common.gypi
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright 2015 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'sources': [
-    'egl/attrib_map.cc',
-    'egl/attrib_map.h',
-    'egl/config.cc',
-    'egl/config.h',
-    'egl/display.cc',
-    'egl/display.h',
-    'egl/display_impl.h',
-    'egl/display_registry.cc',
-    'egl/display_registry.h',
-    'egl/error.cc',
-    'egl/error.h',
-    'egl/get_proc_address_impl.h',
-    'egl/scoped_egl_lock.cc',
-    'egl/scoped_egl_lock.h',
-    'egl/surface.cc',
-    'egl/surface.h',
-    'egl/surface_impl.h',
-    'entry_points/egl.cc',
-    'entry_points/egl_ext.cc',
-    'entry_points/gles_2_0.cc',
-    'entry_points/gles_2_0_ext.cc',
-    'entry_points/gles_3_0.cc',
-    'gles/blend_state.h',
-    'gles/buffer.cc',
-    'gles/buffer.h',
-    'gles/buffer_impl.h',
-    'gles/context.cc',
-    'gles/context.h',
-    'gles/context_impl.h',
-    'gles/convert_pixel_data.cc',
-    'gles/convert_pixel_data.h',
-    'gles/cull_face_state.h',
-    'gles/draw_mode.h',
-    'gles/draw_state.cc',
-    'gles/draw_state.h',
-    'gles/framebuffer.cc',
-    'gles/framebuffer.h',
-    'gles/index_data_type.h',
-    'gles/pixel_format.cc',
-    'gles/pixel_format.h',
-    'gles/program.cc',
-    'gles/program.h',
-    'gles/program_impl.h',
-    'gles/ref_counted_resource_map.h',
-    'gles/renderbuffer.cc',
-    'gles/renderbuffer.h',
-    'gles/resource_manager.cc',
-    'gles/resource_manager.h',
-    'gles/sampler.h',
-    'gles/shader.cc',
-    'gles/shader.h',
-    'gles/shader_impl.h',
-    'gles/texture.cc',
-    'gles/texture.h',
-    'gles/texture_impl.h',
-    'gles/uniform_info.h',
-    'gles/unique_id_generator.cc',
-    'gles/unique_id_generator.h',
-    'gles/vertex_attribute.h',
-    'shaders/glsl_shader_map_helpers.h',
-    'shaders/hash_glsl_source.cc',
-    'shaders/hash_glsl_source.h',
-  ],
-
-  'dependencies': [
-    '<(DEPTH)/glimp/tracing/tracing.gyp:tracing',
-    '<(DEPTH)/nb/nb.gyp:nb',
-  ],
-
-  'includes': [
-    'glimp_settings.gypi',
-  ],
-}
diff --git a/glimp/glimp_settings.gypi b/glimp/glimp_settings.gypi
deleted file mode 100644
index 02ea659..0000000
--- a/glimp/glimp_settings.gypi
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2016 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is included in the direct_dependent_settings from
-# glimp.gyp and in glimp_common.gypi.
-{
-  'include_dirs': [
-    '<(DEPTH)/glimp/include',
-  ],
-  'defines': [
-    # There doesn't appear to be any way to use the C preprocessor to do
-    # string concatenation with the / character. This prevents us from using
-    # the preprocessor to assemble an include file path, so we have to do
-    # the concatenation here in GYP.
-    # http://stackoverflow.com/questions/29601786/c-preprocessor-building-a-path-string
-    'GLIMP_EGLPLATFORM_INCLUDE="../../<(sb_target_platform)/eglplatform_public.h"',
-    'GLIMP_KHRPLATFORM_INCLUDE="../../<(sb_target_platform)/khrplatform_public.h"',
-    # Uncomment the define below to enable and use tracing inside glimp.
-    # 'ENABLE_GLIMP_TRACING',
-],
-}
diff --git a/glimp/shaders/generate_glsl_shader_map.py b/glimp/shaders/generate_glsl_shader_map.py
index 2f4efd1..4d1c6e2 100644
--- a/glimp/shaders/generate_glsl_shader_map.py
+++ b/glimp/shaders/generate_glsl_shader_map.py
@@ -63,14 +63,14 @@
     # representing the data in the .h file are less than 80 characters long.
     length_of_output_byte_string = 6
     max_characters_per_line = 80
-    chunk_size = max_characters_per_line / length_of_output_byte_string
+    chunk_size = int(max_characters_per_line / length_of_output_byte_string)
 
     # Convert each byte to ASCII hexadecimal form and output that to the C++
     # header file, line-by-line.
     data_definition_string = '{\n'
     for output_line_data in Chunks(file_contents, chunk_size):
       data_definition_string += (
-          ' '.join(['0x%02x,' % ord(y) for y in output_line_data]) + '\n')
+          ' '.join(['0x{0:02x},'.format(y) for y in output_line_data]) + '\n')
     data_definition_string += '};\n\n'
     return data_definition_string
 
@@ -104,7 +104,7 @@
   generate_map_function_string = (
       'inline void GenerateGLSLShaderMap(GLSLShaderHashMap* out_map) {\n')
 
-  for k, v in hash_to_shader_map.iteritems():
+  for k, v in hash_to_shader_map.items():
     input_file_variable_name = GetBasename(v)
     generate_map_function_string += (
         '  (*out_map)[%uU] = ShaderData(%s, sizeof(%s));\n' %
@@ -130,7 +130,7 @@
       'inline const char *GetShaderName(uint32_t hash_value) {\n'
       '  switch(hash_value) {\n')
 
-  for k, v in hash_to_shader_map.iteritems():
+  for k, v in hash_to_shader_map.items():
     input_file_variable_name = GetBasename(v)
     get_shader_name_function_string += ('    case %uU: return \"%s\";\n' %
                                         (k, input_file_variable_name))
@@ -286,7 +286,7 @@
   """
   hash_to_glsl_map = {}  # Used for reporting hash map collisions.
   hash_shader_map = {}
-  for k, v in glsl_to_shader_map.iteritems():
+  for k, v in glsl_to_shader_map.items():
     hashed_glsl = HashGLSLShaderFile(k)
     if hashed_glsl in hash_shader_map:
       raise Exception('Hash collision between GLSL files ' + k + ' and ' +
@@ -306,12 +306,16 @@
   with open(input_files_filename) as input_files_file:
     files = [x.strip() for x in input_files_file.readlines()]
 
-  # We filter out files that already have a full path (the case in GN).
-  return [os.path.join(input_files_dir, x) for x in files if '/' not in x]
+  for filename in files:
+    # We filter out files that already have a full path (the case in GN).
+    if '/' in filename:
+      yield filename
+    else:
+      yield os.path.join(input_files_dir, filename)
 
 
 def main(output_path, input_files_filename, input_files_dir):
-  all_shaders = GetAllShaderFiles(input_files_filename, input_files_dir)
+  all_shaders = list(GetAllShaderFiles(input_files_filename, input_files_dir))
 
   glsl_to_shader_map = AssociateGLSLFilesWithPlatformFiles(all_shaders)
 
diff --git a/glimp/tracing/tracing.gyp b/glimp/tracing/tracing.gyp
deleted file mode 100644
index f2635bd..0000000
--- a/glimp/tracing/tracing.gyp
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2016 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  # When ENABLE_GLIMP_TRACING is defined in glimp_settings.gypi, the many
-  # implementation functions that are annotated with GLIMP_TRACE_EVENT0 calls
-  # will activate and allow profiling and flow visualization within glimp.
-  #
-  # With no configuration by the client, nothing will happen, however if a
-  # client that is aware it is using glimp calls
-  # glimp::SetTraceEventImplementation(), it can customize the behavior that
-  # will occur at the start and end of each trace call.  For example, if
-  # Chromium's base trace_event library is available to that client, they may
-  # wish to call TRACE_EVENT_BEGIN0() and TRACE_EVENT_END0() at the beginning
-  # and end of traces.
-  'targets': [
-    {
-
-      'target_name': 'tracing',
-      'type': 'static_library',
-
-      'sources': [
-        'tracing.h',
-        'tracing.cc',
-      ],
-      'includes': [
-        '../glimp_settings.gypi',
-      ],
-    },
-  ],
-}
diff --git a/nb/BUILD.gn b/nb/BUILD.gn
index 6e9c036..bdcc0ef 100644
--- a/nb/BUILD.gn
+++ b/nb/BUILD.gn
@@ -105,7 +105,26 @@
       "//testing/gmock:gmock",
       "//testing/gtest",
     ]
-
-    content_deps = [ "//third_party/icu:icudata" ]
   }
 }
+
+target(gtest_target_type, "reuse_allocator_benchmark") {
+  testonly = true
+  sources = [ "reuse_allocator_benchmark.cc" ]
+  deps = [
+    ":nb",
+    ":nb_copy_test_data",
+    "//starboard",
+  ]
+}
+
+copy("nb_copy_test_data") {
+  sources = [
+    "testdata/mem_history_cobalt.txt",
+    "testdata/mem_history_gpu.txt",
+    "testdata/mem_history_main.txt",
+  ]
+  outputs = [
+    "$sb_static_contents_output_data_dir/test/nb/{{source_target_relative}}",
+  ]
+}
diff --git a/nb/nb.gyp b/nb/nb.gyp
deleted file mode 100644
index 7f266b1..0000000
--- a/nb/nb.gyp
+++ /dev/null
@@ -1,97 +0,0 @@
-# Copyright 2015 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'variables': {
-      'has_nb_platform': '<!pymod_do_main(starboard.build.gyp_functions file_exists <(sb_target_platform)/nb_platform.gyp)'
-    },
-    'nb_dependencies': [],
-    'conditions': [
-      ['has_nb_platform==1', {
-        'nb_dependencies': [
-          '<(DEPTH)/nb/<(sb_target_platform)/nb_platform.gyp:nb_platform',
-        ],
-      }],
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'nb',
-      'type': 'static_library',
-      'variables': {
-        'includes_starboard': 1,
-      },
-      'conditions': [
-        ['OS=="starboard"', {
-          'sources': [
-            'allocator.cc',
-            'allocator.h',
-            'analytics/memory_tracker.cc',
-            'analytics/memory_tracker.h',
-            'analytics/memory_tracker_impl.cc',
-            'analytics/memory_tracker_impl.h',
-            'analytics/memory_tracker_helpers.cc',
-            'analytics/memory_tracker_helpers.h',
-            'atomic.h',
-            'bit_cast.h',
-            'bidirectional_fit_reuse_allocator.h',
-            'bidirectional_fit_reuse_allocator.cc',
-            'concurrent_map.h',
-            'concurrent_ptr.h',
-            'first_fit_reuse_allocator.h',
-            'first_fit_reuse_allocator.cc',
-            'fixed_no_free_allocator.cc',
-            'fixed_no_free_allocator.h',
-            'hash.cc',
-            'hash.h',
-            'memory_pool.h',
-            'memory_scope.cc',
-            'memory_scope.h',
-            'move.h',
-            'multipart_allocator.cc',
-            'multipart_allocator.h',
-            'pointer_arithmetic.h',
-            'rect.h',
-            'ref_counted.cc',
-            'ref_counted.h',
-            'reuse_allocator_base.cc',
-            'reuse_allocator_base.h',
-            'rewindable_vector.h',
-            'starboard_memory_allocator.h',
-            'scoped_ptr.h',
-            'simple_thread.cc',
-            'simple_thread.h',
-            'simple_profiler.cc',
-            'simple_profiler.h',
-            'starboard_aligned_memory_deleter.h',
-            'std_allocator.h',
-            'string_interner.cc',
-            'string_interner.h',
-            'thread_collision_warner.cc',
-            'thread_collision_warner.h',
-            'thread_local_object.h',
-            'thread_local_boolean.h',
-            'thread_local_pointer.h',
-          ],
-          'dependencies': [
-            '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-            '<@(nb_dependencies)',
-          ],
-        }],
-      ],
-    },
-
-  ],
-}
diff --git a/nb/nb_test.gyp b/nb/nb_test.gyp
deleted file mode 100644
index 2d5b937..0000000
--- a/nb/nb_test.gyp
+++ /dev/null
@@ -1,99 +0,0 @@
-# Copyright 2019 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'nb_test',
-      'type': '<(gtest_target_type)',
-      'conditions': [
-        ['OS=="starboard"', {
-          'sources': [
-            'analytics/memory_tracker_helpers_test.cc',
-            'analytics/memory_tracker_impl_test.cc',
-            'analytics/memory_tracker_test.cc',
-            'bidirectional_fit_reuse_allocator_test.cc',
-            'concurrent_map_test.cc',
-            'concurrent_ptr_test.cc',
-            'first_fit_reuse_allocator_test.cc',
-            'fixed_no_free_allocator_test.cc',
-            'memory_scope_test.cc',
-            'multipart_allocator_test.cc',
-            'rewindable_vector_test.cc',
-            'run_all_unittests.cc',
-            'simple_profiler_test.cc',
-            'std_allocator_test.cc',
-            'string_interner_test.cc',
-            'test_thread.h',
-            'thread_local_object_test.cc',
-          ],
-          'dependencies': [
-            '<(DEPTH)/nb/nb.gyp:nb',
-            '<(DEPTH)/testing/gmock.gyp:gmock',
-            '<(DEPTH)/testing/gtest.gyp:gtest',
-            '<(DEPTH)/starboard/starboard.gyp:starboard',
-          ],
-        }]
-      ],
-    },
-    {
-      'target_name': 'nb_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'nb_test',
-      ],
-      'variables': {
-        'executable_name': 'nb_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-    {
-      'target_name': 'reuse_allocator_benchmark',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'reuse_allocator_benchmark.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/nb/nb.gyp:nb',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        'nb_copy_test_data',
-      ],
-    },
-    {
-      'target_name': 'reuse_allocator_benchmark_deploy',
-      'type': 'none',
-      'dependencies': [
-        'reuse_allocator_benchmark',
-      ],
-      'variables': {
-        'executable_name': 'reuse_allocator_benchmark',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-
-    {
-      'target_name': 'nb_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<(DEPTH)/nb/testdata/',
-        ],
-        'content_test_output_subdir': 'nb/testdata',
-      },
-      'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-    },
-
-  ],
-}
diff --git a/net/BUILD.gn b/net/BUILD.gn
index d27cb0b..c8c35f6 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -20,7 +20,7 @@
 
 config("net_public_defines") {
   defines = [
-    "HTTP_CACHE_DISABLED_FOR_STARBOARD",
+    "HTTP_CACHE_TESTING_DISABLED",
     "ENABLE_BUILT_IN_DNS",
     "QUIC_TRACE_DISABLED",
     "COBALT_QUIC46",
@@ -433,13 +433,19 @@
     # "disk_cache/cache_util.h",
     # "disk_cache/cache_util_starboard.cc",
     # "disk_cache/disk_cache.cc",
-    # "disk_cache/disk_cache.h",
+    "disk_cache/disk_cache.h",
     # "disk_cache/memory/mem_backend_impl.cc",
     # "disk_cache/memory/mem_backend_impl.h",
     # "disk_cache/memory/mem_entry_impl.cc",
     # "disk_cache/memory/mem_entry_impl.h",
-    # "disk_cache/net_log_parameters.cc",
-    # "disk_cache/net_log_parameters.h",
+    "disk_cache/cobalt/cobalt_disk_cache.cc",
+    "disk_cache/cobalt/cobalt_backend_impl.cc",
+    "disk_cache/cobalt/cobalt_backend_impl.h",
+    "disk_cache/cobalt/cobalt_entry_impl.cc",
+    "disk_cache/cobalt/cobalt_entry_impl.h",
+    "disk_cache/cobalt/resource_type.h",
+    "disk_cache/net_log_parameters.cc",
+    "disk_cache/net_log_parameters.h",
     # "disk_cache/simple/simple_backend_impl.cc",
     # "disk_cache/simple/simple_backend_impl.h",
     # "disk_cache/simple/simple_backend_version.h",
@@ -559,15 +565,14 @@
     "http/http_basic_stream.h",
     "http/http_byte_range.cc",
     "http/http_byte_range.h",
-
-    # "http/http_cache.cc",
-    # "http/http_cache.h",
-    # "http/http_cache_lookup_manager.cc",
-    # "http/http_cache_lookup_manager.h",
-    # "http/http_cache_transaction.cc",
-    # "http/http_cache_transaction.h",
-    # "http/http_cache_writers.cc",
-    # "http/http_cache_writers.h",
+    "http/http_cache.cc",
+    "http/http_cache.h",
+    "http/http_cache_lookup_manager.cc",
+    "http/http_cache_lookup_manager.h",
+    "http/http_cache_transaction.cc",
+    "http/http_cache_transaction.h",
+    "http/http_cache_writers.cc",
+    "http/http_cache_writers.h",
     "http/http_chunked_decoder.cc",
     "http/http_chunked_decoder.h",
     "http/http_content_disposition.cc",
@@ -1804,6 +1809,9 @@
 }
 
 copy("net_unittest_files") {
+  if (is_starboard) {
+    install_content = true
+  }
   sources = [
     "data/test.html",
     "data/cert_issuer_source_static_unittest/c1.pem",
@@ -2899,6 +2907,9 @@
 }
 
 copy("third_party_unittest_files") {
+  if (is_starboard) {
+    install_content = true
+  }
   sources = [
     "third_party/nist-pkits/certs/AllCertificatesanyPolicyTest11EE.crt",
     "third_party/nist-pkits/certs/AllCertificatesNoPoliciesTest2EE.crt",
@@ -3682,9 +3693,9 @@
     "http/http_basic_state_unittest.cc",
     "http/http_byte_range_unittest.cc",
 
-    # "http/http_cache_lookup_manager_unittest.cc",
-    # "http/http_cache_unittest.cc",
-    # "http/http_cache_writers_unittest.cc",
+    "http/http_cache_lookup_manager_unittest.cc",
+    "http/http_cache_unittest.cc",
+    "http/http_cache_writers_unittest.cc",
     # "url_request/view_cache_helper_unittest.cc",
     "http/http_chunked_decoder_unittest.cc",
 
@@ -3714,8 +3725,8 @@
     "http/mock_allow_http_auth_preferences.cc",
     "http/mock_allow_http_auth_preferences.h",
 
-    # "http/mock_http_cache.cc",
-    # "http/mock_http_cache.h",
+    "http/mock_http_cache.cc",
+    "http/mock_http_cache.h",
     # Main test target not enabled yet.
     # "http/transport_security_persister_unittest.cc",
     # "log/file_net_log_observer_unittest.cc",
@@ -4189,8 +4200,7 @@
   }
 
   defines = [
-    # To be removed in the future when want to enable HTTP cache.
-    "HTTP_CACHE_DISABLED_FOR_STARBOARD",
+    "HTTP_CACHE_TESTING_DISABLED",
     "GMOCK_NO_MOVE_MOCK",
   ]
 
@@ -4220,6 +4230,14 @@
     "//url",
     "//url:url_features",
   ]
+
+  if (is_starboard) {
+    content_deps = [
+      ":net_unittest_files",
+      ":third_party_unittest_files",
+      "//third_party/icu:icudata",
+    ]
+  }
 }
 
 static_library("test_support") {
diff --git a/net/base/cache_type.h b/net/base/cache_type.h
index 2399594..debae51 100644
--- a/net/base/cache_type.h
+++ b/net/base/cache_type.h
@@ -23,7 +23,10 @@
 enum BackendType {
   CACHE_BACKEND_DEFAULT,
   CACHE_BACKEND_BLOCKFILE,  // The |BackendImpl|.
-  CACHE_BACKEND_SIMPLE  // The |SimpleBackendImpl|.
+  CACHE_BACKEND_SIMPLE,     // The |SimpleBackendImpl|.
+#if defined(STARBOARD)
+  CACHE_BACKEND_COBALT      // The |CobaltBackendImpl|,
+#endif
 };
 
 }  // namespace net
diff --git a/net/cert/internal/trust_store_in_memory_starboard.cc b/net/cert/internal/trust_store_in_memory_starboard.cc
index d5538c9..53e5f79 100644
--- a/net/cert/internal/trust_store_in_memory_starboard.cc
+++ b/net/cert/internal/trust_store_in_memory_starboard.cc
@@ -77,7 +77,6 @@
     return std::unordered_set<std::string>();
   }
   std::unordered_set<std::string> trusted_certs_on_disk;
-#if SB_API_VERSION >= 12
   std::vector<char> dir_entry(kSbFileMaxName);
 
   while (SbDirectoryGetNext(sb_certs_directory, dir_entry.data(),
@@ -87,17 +86,6 @@
     }
     trusted_certs_on_disk.emplace(dir_entry.data());
   }
-#else   // SB_API_VERSION >= 12
-  SbDirectoryEntry dir_entry;
-
-  while (SbDirectoryGetNext(sb_certs_directory, &dir_entry)) {
-    if (strlen(dir_entry.name) != kCertFileNameLength) {
-      continue;
-    }
-    trusted_certs_on_disk.emplace(dir_entry.name);
-  }
-#endif  // SB_API_VERSION >= 12
-
   SbDirectoryClose(sb_certs_directory);
   return std::move(trusted_certs_on_disk);
 }
diff --git a/net/cookies/cookie_monster_unittest.cc b/net/cookies/cookie_monster_unittest.cc
index c13af89..b137fb5 100644
--- a/net/cookies/cookie_monster_unittest.cc
+++ b/net/cookies/cookie_monster_unittest.cc
@@ -510,8 +510,8 @@
     EXPECT_EQ(expected_secure, num_secure);
 
     // Validate each priority.
-    size_t expected_count[3] = {
-        expected_low_count, expected_medium_count, expected_high_count};
+    size_t expected_count[3] = {expected_low_count, expected_medium_count,
+                                expected_high_count};
     for (int i = 0; i < 3; ++i) {
       size_t num_for_priority =
           surviving_id_list[0][i].size() + surviving_id_list[1][i].size();
@@ -1049,7 +1049,7 @@
 
 TEST_F(DeferredCookieTaskTest, DeferredGetCookieList) {
   DeclareLoadedCookie(http_www_foo_.url(),
-                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                      "X=1; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                       Time::Now() + TimeDelta::FromDays(3));
 
   MockGetCookieListCallback get_cookie_list_callback;
@@ -1141,7 +1141,7 @@
 
 TEST_F(DeferredCookieTaskTest, DeferredGetAllCookies) {
   DeclareLoadedCookie(http_www_foo_.url(),
-                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                      "X=1; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                       Time::Now() + TimeDelta::FromDays(3));
 
   MockGetCookieListCallback get_cookie_list_callback;
@@ -1163,7 +1163,7 @@
 
 TEST_F(DeferredCookieTaskTest, DeferredGetAllForUrlCookies) {
   DeclareLoadedCookie(http_www_foo_.url(),
-                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                      "X=1; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                       Time::Now() + TimeDelta::FromDays(3));
 
   MockGetCookieListCallback get_cookie_list_callback;
@@ -1188,7 +1188,7 @@
 
 TEST_F(DeferredCookieTaskTest, DeferredGetAllForUrlWithOptionsCookies) {
   DeclareLoadedCookie(http_www_foo_.url(),
-                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                      "X=1; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                       Time::Now() + TimeDelta::FromDays(3));
 
   MockGetCookieListCallback get_cookie_list_callback;
@@ -1312,7 +1312,7 @@
 // being dispatched go to the end of the queue.
 TEST_F(DeferredCookieTaskTest, DeferredTaskOrder) {
   DeclareLoadedCookie(http_www_foo_.url(),
-                      "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                      "X=1; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                       Time::Now() + TimeDelta::FromDays(3));
 
   MockGetCookieListCallback get_cookie_list_callback;
@@ -1367,7 +1367,7 @@
   // Create a persistent cookie.
   EXPECT_TRUE(SetCookie(
       cm.get(), http_www_foo_.url(),
-      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-22 22:50:13 GMT"));
+      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-62 22:50:13 GMT"));
   ASSERT_EQ(1u, store->commands().size());
   EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[0].type);
 
@@ -1762,20 +1762,20 @@
   // the import.
 
   AddCookieToList(GURL("http://www.foo.com"),
-                  "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                  "X=1; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                   Time::Now() + TimeDelta::FromDays(3), &initial_cookies);
 
   AddCookieToList(GURL("http://www.foo.com"),
-                  "X=2; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                  "X=2; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                   Time::Now() + TimeDelta::FromDays(1), &initial_cookies);
 
   // ===> This one is the WINNER (biggest creation time).  <====
   AddCookieToList(GURL("http://www.foo.com"),
-                  "X=3; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                  "X=3; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                   Time::Now() + TimeDelta::FromDays(4), &initial_cookies);
 
   AddCookieToList(GURL("http://www.foo.com"),
-                  "X=4; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                  "X=4; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                   Time::Now(), &initial_cookies);
 
   // Insert 2 cookies with name "X" on path "/2", with varying creation
@@ -1783,16 +1783,16 @@
 
   // ===> This one is the WINNER (biggest creation time).  <====
   AddCookieToList(GURL("http://www.foo.com"),
-                  "X=a1; path=/2; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                  "X=a1; path=/2; expires=Mon, 18-Apr-62 22:50:14 GMT",
                   Time::Now() + TimeDelta::FromDays(9), &initial_cookies);
 
   AddCookieToList(GURL("http://www.foo.com"),
-                  "X=a2; path=/2; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                  "X=a2; path=/2; expires=Mon, 18-Apr-62 22:50:14 GMT",
                   Time::Now() + TimeDelta::FromDays(2), &initial_cookies);
 
   // Insert 1 cookie with name "Y" on path "/".
   AddCookieToList(GURL("http://www.foo.com"),
-                  "Y=a; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                  "Y=a; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                   Time::Now() + TimeDelta::FromDays(10), &initial_cookies);
 
   // Inject our initial cookies into the mock PersistentCookieStore.
@@ -2654,7 +2654,7 @@
 
   // Add a cookie.
   EXPECT_TRUE(SetCookie(cm.get(), http_www_foo_.url(),
-                        "A=B; expires=Mon, 18-Apr-22 22:50:13 GMT"));
+                        "A=B; expires=Mon, 18-Apr-62 22:50:13 GMT"));
   this->MatchCookieLines("A=B", GetCookies(cm.get(), http_www_foo_.url()));
   ASSERT_EQ(1u, store->commands().size());
   EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[0].type);
@@ -2667,13 +2667,13 @@
 
   // Add a cookie.
   EXPECT_TRUE(SetCookie(cm.get(), http_www_foo_.url(),
-                        "A=B; expires=Mon, 18-Apr-22 22:50:13 GMT"));
+                        "A=B; expires=Mon, 18-Apr-62 22:50:13 GMT"));
   this->MatchCookieLines("A=B", GetCookies(cm.get(), http_www_foo_.url()));
   ASSERT_EQ(3u, store->commands().size());
   EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[2].type);
   // Overwrite it.
   EXPECT_TRUE(SetCookie(cm.get(), http_www_foo_.url(),
-                        "A=Foo; expires=Mon, 18-Apr-22 22:50:14 GMT"));
+                        "A=Foo; expires=Mon, 18-Apr-62 22:50:14 GMT"));
   this->MatchCookieLines("A=Foo", GetCookies(cm.get(), http_www_foo_.url()));
   ASSERT_EQ(5u, store->commands().size());
   EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[3].type);
@@ -3283,12 +3283,12 @@
   // Set up a set of cookies with a duplicate.
   std::vector<std::unique_ptr<CanonicalCookie>> initial_cookies;
   AddCookieToList(GURL("http://www.foo.com"),
-                  "X=1; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                  "X=1; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                   base::Time::Now() + base::TimeDelta::FromDays(3),
                   &initial_cookies);
 
   AddCookieToList(GURL("http://www.foo.com"),
-                  "X=2; path=/; expires=Mon, 18-Apr-22 22:50:14 GMT",
+                  "X=2; path=/; expires=Mon, 18-Apr-62 22:50:14 GMT",
                   base::Time::Now() + base::TimeDelta::FromDays(1),
                   &initial_cookies);
 
diff --git a/net/cookies/cookie_store_unittest.h b/net/cookies/cookie_store_unittest.h
index 6d24c79..ed997f4 100644
--- a/net/cookies/cookie_store_unittest.h
+++ b/net/cookies/cookie_store_unittest.h
@@ -1207,7 +1207,7 @@
   // Create a persistent cookie.
   EXPECT_TRUE(this->SetCookie(
       cs, this->http_www_foo_.url(),
-      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-22 22:50:13 GMT"));
+      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-62 22:50:13 GMT"));
 
   this->MatchCookieLines("A=B",
                          this->GetCookies(cs, this->http_www_foo_.url()));
@@ -1220,7 +1220,7 @@
   // Create a persistent cookie.
   EXPECT_TRUE(this->SetCookie(
       cs, this->http_www_foo_.url(),
-      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-22 22:50:13 GMT"));
+      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-62 22:50:13 GMT"));
   this->MatchCookieLines("A=B",
                          this->GetCookies(cs, this->http_www_foo_.url()));
   // Delete it via Expires.
@@ -1233,13 +1233,13 @@
   // Create a persistent cookie.
   EXPECT_TRUE(this->SetCookie(
       cs, this->http_www_foo_.url(),
-      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-22 22:50:13 GMT"));
+      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-62 22:50:13 GMT"));
   this->MatchCookieLines("A=B",
                          this->GetCookies(cs, this->http_www_foo_.url()));
   // Check that it is not deleted with significant enough clock skew.
   base::Time server_time;
-  EXPECT_TRUE(base::Time::FromString("Sun, 17-Apr-1977 22:50:13 GMT",
-                                     &server_time));
+  EXPECT_TRUE(
+      base::Time::FromString("Sun, 17-Apr-1977 22:50:13 GMT", &server_time));
   EXPECT_TRUE(this->SetCookieWithServerTime(
       cs, this->http_www_foo_.url(),
       std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-1977 22:50:13 GMT",
@@ -1250,7 +1250,7 @@
   // Create a persistent cookie.
   EXPECT_TRUE(this->SetCookie(
       cs, this->http_www_foo_.url(),
-      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-22 22:50:13 GMT"));
+      std::string(kValidCookieLine) + "; expires=Mon, 18-Apr-62 22:50:13 GMT"));
   this->MatchCookieLines("A=B",
                          this->GetCookies(cs, this->http_www_foo_.url()));
   // Delete it via Expires, with a unix epoch of 0.
@@ -1270,7 +1270,7 @@
 
   // Set a persistent cookie.
   EXPECT_TRUE(this->SetCookie(cs, this->http_www_foo_.url(),
-                              "C=D; expires=Mon, 18-Apr-22 22:50:13 GMT"));
+                              "C=D; expires=Mon, 18-Apr-62 22:50:13 GMT"));
 
   EXPECT_EQ(2u, this->GetAllCookies(cs).size());
 
@@ -1420,12 +1420,12 @@
   // Insert a cookie "a" for path "/path1"
   EXPECT_TRUE(this->SetCookie(cs, url_foo,
                               "a=val1; path=/path1; "
-                              "expires=Mon, 18-Apr-22 22:50:13 GMT"));
+                              "expires=Mon, 18-Apr-62 22:50:13 GMT"));
 
   // Insert a cookie "b" for path "/path1"
   EXPECT_TRUE(this->SetCookie(cs, url_foo,
                               "b=val1; path=/path1; "
-                              "expires=Mon, 18-Apr-22 22:50:14 GMT"));
+                              "expires=Mon, 18-Apr-62 22:50:14 GMT"));
 
   // Insert a cookie "b" for path "/path1", that is httponly. This should
   // overwrite the non-http-only version.
@@ -1433,26 +1433,26 @@
   allow_httponly.set_include_httponly();
   EXPECT_TRUE(this->SetCookieWithOptions(cs, url_foo,
                                          "b=val2; path=/path1; httponly; "
-                                         "expires=Mon, 18-Apr-22 22:50:14 GMT",
+                                         "expires=Mon, 18-Apr-62 22:50:14 GMT",
                                          allow_httponly));
 
   // Insert a cookie "a" for path "/path1". This should overwrite.
   EXPECT_TRUE(this->SetCookie(cs, url_foo,
                               "a=val33; path=/path1; "
-                              "expires=Mon, 18-Apr-22 22:50:14 GMT"));
+                              "expires=Mon, 18-Apr-62 22:50:14 GMT"));
 
   // Insert a cookie "a" for path "/path2". This should NOT overwrite
   // cookie "a", since the path is different.
   EXPECT_TRUE(this->SetCookie(cs, url_foo,
                               "a=val9; path=/path2; "
-                              "expires=Mon, 18-Apr-22 22:50:14 GMT"));
+                              "expires=Mon, 18-Apr-62 22:50:14 GMT"));
 
   // Insert a cookie "a" for path "/path1", but this time for "chromium.org".
   // Although the name and path match, the hostnames do not, so shouldn't
   // overwrite.
   EXPECT_TRUE(this->SetCookie(cs, url_chromium,
                               "a=val99; path=/path1; "
-                              "expires=Mon, 18-Apr-22 22:50:14 GMT"));
+                              "expires=Mon, 18-Apr-62 22:50:14 GMT"));
 
   if (TypeParam::supports_http_only) {
     this->MatchCookieLines(
@@ -1654,7 +1654,7 @@
   EXPECT_TRUE(this->SetCookie(
       cs, this->http_www_foo_.url(),
       this->http_www_foo_.Format("C=D; path=/; domain=%D;"
-                                 "expires=Mon, 18-Apr-22 22:50:13 GMT")));
+                                 "expires=Mon, 18-Apr-62 22:50:13 GMT")));
   this->MatchCookieLines("A=B; C=D",
                          this->GetCookies(cs, this->http_www_foo_.url()));
   // Delete the session cookie.
diff --git a/net/disk_cache/cobalt/cobalt_backend_impl.cc b/net/disk_cache/cobalt/cobalt_backend_impl.cc
new file mode 100644
index 0000000..2835797
--- /dev/null
+++ b/net/disk_cache/cobalt/cobalt_backend_impl.cc
@@ -0,0 +1,144 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "net/disk_cache/cobalt/cobalt_backend_impl.h"
+
+#include "base/threading/sequenced_task_runner_handle.h"
+
+using base::Time;
+
+namespace disk_cache {
+
+CobaltBackendImpl::CobaltBackendImpl(net::NetLog* net_log)
+    : weak_factory_(this) {}
+
+CobaltBackendImpl::~CobaltBackendImpl() {
+  if (!post_cleanup_callback_.is_null())
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, std::move(post_cleanup_callback_));
+}
+
+// static
+std::unique_ptr<CobaltBackendImpl> CobaltBackendImpl::CreateBackend(
+    int64_t max_bytes,
+    net::NetLog* net_log) {
+  std::unique_ptr<CobaltBackendImpl> cache(
+      std::make_unique<CobaltBackendImpl>(net_log));
+  return cache;
+}
+
+void CobaltBackendImpl::SetPostCleanupCallback(base::OnceClosure cb) {
+  DCHECK(post_cleanup_callback_.is_null());
+  post_cleanup_callback_ = std::move(cb);
+}
+
+net::CacheType CobaltBackendImpl::GetCacheType() const {
+  return net::DISK_CACHE;
+}
+
+int32_t CobaltBackendImpl::GetEntryCount() const {
+  // TODO: Implement
+  return 0;
+}
+
+net::Error CobaltBackendImpl::OpenEntry(const std::string& key,
+                                        net::RequestPriority request_priority,
+                                        Entry** entry,
+                                        std::string type,
+                                        CompletionOnceCallback callback) {
+  // TODO: Implement
+  return net::ERR_FAILED;
+}
+
+net::Error CobaltBackendImpl::CreateEntry(const std::string& key,
+                                          net::RequestPriority request_priority,
+                                          Entry** entry,
+                                          CompletionOnceCallback callback) {
+  // TODO: Implement
+  return net::ERR_FAILED;
+}
+
+net::Error CobaltBackendImpl::DoomEntry(const std::string& key,
+                                        net::RequestPriority priority,
+                                        CompletionOnceCallback callback) {
+  // TODO: Implement
+  return net::OK;
+}
+
+net::Error CobaltBackendImpl::DoomAllEntries(CompletionOnceCallback callback) {
+  // TODO: Implement
+  return net::OK;
+}
+
+net::Error CobaltBackendImpl::DoomEntriesBetween(
+    Time initial_time,
+    Time end_time,
+    CompletionOnceCallback callback) {
+  // TODO: Implement
+  return net::OK;
+}
+
+net::Error CobaltBackendImpl::DoomEntriesSince(
+    Time initial_time,
+    CompletionOnceCallback callback) {
+  // TODO: Implement
+  return net::OK;
+}
+
+int64_t CobaltBackendImpl::CalculateSizeOfAllEntries(
+    Int64CompletionOnceCallback callback) {
+  // TODO: Implement
+  return 0;
+}
+
+int64_t CobaltBackendImpl::CalculateSizeOfEntriesBetween(
+    base::Time initial_time,
+    base::Time end_time,
+    Int64CompletionOnceCallback callback) {
+  // TODO: Implement
+  return 0;
+}
+
+class CobaltBackendImpl::CobaltIterator final : public Backend::Iterator {
+ public:
+  explicit CobaltIterator(base::WeakPtr<CobaltBackendImpl> backend)
+      : backend_(backend) {}
+
+  net::Error OpenNextEntry(Entry** next_entry,
+                           CompletionOnceCallback callback) override {
+    // TODO: Implement
+    return net::ERR_FAILED;
+  }
+
+ private:
+  base::WeakPtr<CobaltBackendImpl> backend_ = nullptr;
+};
+
+std::unique_ptr<Backend::Iterator> CobaltBackendImpl::CreateIterator() {
+  return std::unique_ptr<Backend::Iterator>(
+      new CobaltIterator(weak_factory_.GetWeakPtr()));
+}
+
+void CobaltBackendImpl::OnExternalCacheHit(const std::string& key) {
+  // TODO: Implement
+}
+
+size_t CobaltBackendImpl::DumpMemoryStats(
+    base::trace_event::ProcessMemoryDump* pmd,
+    const std::string& parent_absolute_name) const {
+  // TODO: Implement
+  return 0;
+}
+
+}  // namespace disk_cache
diff --git a/net/disk_cache/cobalt/cobalt_backend_impl.h b/net/disk_cache/cobalt/cobalt_backend_impl.h
new file mode 100644
index 0000000..171f952
--- /dev/null
+++ b/net/disk_cache/cobalt/cobalt_backend_impl.h
@@ -0,0 +1,85 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// See net/disk_cache/disk_cache.h for the public interface of the cache.
+
+#ifndef NET_DISK_CACHE_COBALT_COBALT_BACKEND_IMPL_H_
+#define NET_DISK_CACHE_COBALT_COBALT_BACKEND_IMPL_H_
+
+#include "net/disk_cache/disk_cache.h"
+
+namespace disk_cache {
+
+// This class implements the Backend interface. An object of this class handles
+// the operations of the cache without writing to disk.
+class NET_EXPORT_PRIVATE CobaltBackendImpl final : public Backend {
+ public:
+  explicit CobaltBackendImpl(net::NetLog* net_log);
+  ~CobaltBackendImpl() override;
+
+  static std::unique_ptr<CobaltBackendImpl> CreateBackend(int64_t max_bytes,
+                                                          net::NetLog* net_log);
+
+  // Sets a callback to be posted after we are destroyed. Should be called at
+  // most once.
+  void SetPostCleanupCallback(base::OnceClosure cb);
+
+  // Backend interface.
+  net::CacheType GetCacheType() const override;
+  int32_t GetEntryCount() const override;
+  net::Error OpenEntry(const std::string& key,
+                       net::RequestPriority request_priority,
+                       Entry** entry,
+                       std::string type,
+                       CompletionOnceCallback callback) override;
+  net::Error CreateEntry(const std::string& key,
+                         net::RequestPriority request_priority,
+                         Entry** entry,
+                         CompletionOnceCallback callback) override;
+  net::Error DoomEntry(const std::string& key,
+                       net::RequestPriority priority,
+                       CompletionOnceCallback callback) override;
+  net::Error DoomAllEntries(CompletionOnceCallback callback) override;
+  net::Error DoomEntriesBetween(base::Time initial_time,
+                                base::Time end_time,
+                                CompletionOnceCallback callback) override;
+  net::Error DoomEntriesSince(base::Time initial_time,
+                              CompletionOnceCallback callback) override;
+  int64_t CalculateSizeOfAllEntries(
+      Int64CompletionOnceCallback callback) override;
+  int64_t CalculateSizeOfEntriesBetween(
+      base::Time initial_time,
+      base::Time end_time,
+      Int64CompletionOnceCallback callback) override;
+  std::unique_ptr<Iterator> CreateIterator() override;
+  void GetStats(base::StringPairs* stats) override {}
+  void OnExternalCacheHit(const std::string& key) override;
+  size_t DumpMemoryStats(
+      base::trace_event::ProcessMemoryDump* pmd,
+      const std::string& parent_absolute_name) const override;
+
+ private:
+  class CobaltIterator;
+  friend class CobaltIterator;
+
+  base::OnceClosure post_cleanup_callback_;
+
+  base::WeakPtrFactory<CobaltBackendImpl> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(CobaltBackendImpl);
+};
+
+}  // namespace disk_cache
+
+#endif  // NET_DISK_CACHE_COBALT_COBALT_BACKEND_IMPL_H_
diff --git a/net/disk_cache/cobalt/cobalt_disk_cache.cc b/net/disk_cache/cobalt/cobalt_disk_cache.cc
new file mode 100644
index 0000000..243a69a
--- /dev/null
+++ b/net/disk_cache/cobalt/cobalt_disk_cache.cc
@@ -0,0 +1,86 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "base/metrics/field_trial.h"
+#include "net/disk_cache/cobalt/cobalt_backend_impl.h"
+
+namespace disk_cache {
+
+net::Error CreateCacheBackendImpl(net::CacheType type,
+                                  net::BackendType backend_type,
+                                  const base::FilePath& path,
+                                  int64_t max_bytes,
+                                  bool force,
+                                  net::NetLog* net_log,
+                                  std::unique_ptr<Backend>* backend,
+                                  base::OnceClosure post_cleanup_callback,
+                                  net::CompletionOnceCallback callback) {
+  DCHECK(!callback.is_null());
+
+  std::unique_ptr<CobaltBackendImpl> cobalt_backend_impl =
+      disk_cache::CobaltBackendImpl::CreateBackend(max_bytes, net_log);
+  if (cobalt_backend_impl) {
+    cobalt_backend_impl->SetPostCleanupCallback(
+        std::move(post_cleanup_callback));
+    *backend = std::move(cobalt_backend_impl);
+    return net::OK;
+  }
+
+  if (!post_cleanup_callback.is_null())
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, std::move(post_cleanup_callback));
+  return net::ERR_FAILED;
+}
+
+net::Error CreateCacheBackend(net::CacheType type,
+                              net::BackendType backend_type,
+                              const base::FilePath& path,
+                              int64_t max_bytes,
+                              bool force,
+                              net::NetLog* net_log,
+                              std::unique_ptr<Backend>* backend,
+                              net::CompletionOnceCallback callback) {
+  return CreateCacheBackendImpl(type, backend_type, path, max_bytes, force,
+                                net_log, backend, base::OnceClosure(),
+                                std::move(callback));
+}
+
+net::Error CreateCacheBackend(net::CacheType type,
+                              net::BackendType backend_type,
+                              const base::FilePath& path,
+                              int64_t max_bytes,
+                              bool force,
+                              net::NetLog* net_log,
+                              std::unique_ptr<Backend>* backend,
+                              base::OnceClosure post_cleanup_callback,
+                              net::CompletionOnceCallback callback) {
+  return CreateCacheBackendImpl(
+      type, backend_type, path, max_bytes, force, net_log, backend,
+      std::move(post_cleanup_callback), std::move(callback));
+}
+
+int64_t Backend::CalculateSizeOfEntriesBetween(
+    base::Time initial_time,
+    base::Time end_time,
+    Int64CompletionOnceCallback callback) {
+  return net::ERR_NOT_IMPLEMENTED;
+}
+
+uint8_t Backend::GetEntryInMemoryData(const std::string& key) {
+  return 0;
+}
+
+void Backend::SetEntryInMemoryData(const std::string& key, uint8_t data) {}
+
+}  // namespace disk_cache
\ No newline at end of file
diff --git a/net/disk_cache/cobalt/cobalt_entry_impl.cc b/net/disk_cache/cobalt/cobalt_entry_impl.cc
new file mode 100644
index 0000000..33bd3ae
--- /dev/null
+++ b/net/disk_cache/cobalt/cobalt_entry_impl.cc
@@ -0,0 +1,134 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "net/disk_cache/cobalt/cobalt_entry_impl.h"
+
+using base::Time;
+
+namespace disk_cache {
+
+CobaltEntryImpl::CobaltEntryImpl(base::WeakPtr<CobaltBackendImpl> backend,
+                                 const std::string& key,
+                                 net::NetLog* net_log)
+    : CobaltEntryImpl(backend,
+                      key,
+                      0,        // child_id
+                      nullptr,  // parent
+                      net_log) {}
+
+CobaltEntryImpl::CobaltEntryImpl(base::WeakPtr<CobaltBackendImpl> backend,
+                                 int child_id,
+                                 CobaltEntryImpl* parent,
+                                 net::NetLog* net_log)
+    : CobaltEntryImpl(backend,
+                      std::string(),  // key
+                      child_id,
+                      parent,
+                      net_log) {
+  (*parent_->children_)[child_id] = this;
+}
+
+CobaltEntryImpl::CobaltEntryImpl(base::WeakPtr<CobaltBackendImpl> backend,
+                                 const ::std::string& key,
+                                 int child_id,
+                                 CobaltEntryImpl* parent,
+                                 net::NetLog* net_log)
+    : key_(key),
+      parent_(parent),
+      last_modified_(Time::Now()),
+      last_used_(last_modified_) {}
+
+void CobaltEntryImpl::Doom() {
+  // TODO: Implement
+}
+
+void CobaltEntryImpl::Close() {
+  // TODO: Implement
+}
+
+std::string CobaltEntryImpl::GetKey() const {
+  // A child entry doesn't have key so this method should not be called.
+  DCHECK_EQ(PARENT_ENTRY, type());
+  return key_;
+}
+
+Time CobaltEntryImpl::GetLastUsed() const {
+  return last_used_;
+}
+
+Time CobaltEntryImpl::GetLastModified() const {
+  return last_modified_;
+}
+
+int32_t CobaltEntryImpl::GetDataSize(int index) const {
+  // TODO: Implement
+  return 0;
+}
+
+int CobaltEntryImpl::ReadData(int index,
+                              int offset,
+                              IOBuffer* buf,
+                              int buf_len,
+                              CompletionOnceCallback callback) {
+  // TODO: Implement
+  return net::ERR_FAILED;
+}
+
+int CobaltEntryImpl::WriteData(int index,
+                               int offset,
+                               IOBuffer* buf,
+                               int buf_len,
+                               CompletionOnceCallback callback,
+                               bool truncate) {
+  // TODO: Implement
+  return net::ERR_FAILED;
+}
+
+int CobaltEntryImpl::ReadSparseData(int64_t offset,
+                                    IOBuffer* buf,
+                                    int buf_len,
+                                    CompletionOnceCallback callback) {
+  // TODO: Implement
+  return net::ERR_FAILED;
+}
+
+int CobaltEntryImpl::WriteSparseData(int64_t offset,
+                                     IOBuffer* buf,
+                                     int buf_len,
+                                     CompletionOnceCallback callback) {
+  // TODO: Implement
+  return net::ERR_FAILED;
+}
+
+int CobaltEntryImpl::GetAvailableRange(int64_t offset,
+                                       int len,
+                                       int64_t* start,
+                                       CompletionOnceCallback callback) {
+  // TODO: Implement
+  return 0;
+}
+
+bool CobaltEntryImpl::CouldBeSparse() const {
+  DCHECK_EQ(PARENT_ENTRY, type());
+  return (children_.get() != nullptr);
+}
+
+net::Error CobaltEntryImpl::ReadyForSparseIO(CompletionOnceCallback callback) {
+  return net::OK;
+}
+
+void CobaltEntryImpl::SetLastUsedTimeForTest(base::Time time) {
+  last_used_ = time;
+}
+}  // namespace disk_cache
diff --git a/net/disk_cache/cobalt/cobalt_entry_impl.h b/net/disk_cache/cobalt/cobalt_entry_impl.h
new file mode 100644
index 0000000..6206040
--- /dev/null
+++ b/net/disk_cache/cobalt/cobalt_entry_impl.h
@@ -0,0 +1,105 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef NET_DISK_CACHE_COBALT_COBALT_ENTRY_IMPL_H_
+#define NET_DISK_CACHE_COBALT_COBALT_ENTRY_IMPL_H_
+
+#include "base/trace_event/memory_usage_estimator.h"
+#include "net/disk_cache/disk_cache.h"
+
+namespace disk_cache {
+
+class CobaltBackendImpl;
+
+class NET_EXPORT_PRIVATE CobaltEntryImpl final
+    : public Entry,
+      public base::LinkNode<CobaltEntryImpl> {
+ public:
+  enum EntryType {
+    PARENT_ENTRY,
+    CHILD_ENTRY,
+  };
+
+  // Constructor for parent entries.
+  CobaltEntryImpl(base::WeakPtr<CobaltBackendImpl> backend,
+                  const std::string& key,
+                  net::NetLog* net_log);
+
+  // Constructor for child entries.
+  CobaltEntryImpl(base::WeakPtr<CobaltBackendImpl> backend,
+                  int child_id,
+                  CobaltEntryImpl* parent,
+                  net::NetLog* net_log);
+
+  EntryType type() const { return parent_ ? CHILD_ENTRY : PARENT_ENTRY; }
+
+  // From disk_cache::Entry:
+  void Doom() override;
+  void Close() override;
+  std::string GetKey() const override;
+  base::Time GetLastUsed() const override;
+  base::Time GetLastModified() const override;
+  int32_t GetDataSize(int index) const override;
+  int ReadData(int index,
+               int offset,
+               IOBuffer* buf,
+               int buf_len,
+               CompletionOnceCallback callback) override;
+  int WriteData(int index,
+                int offset,
+                IOBuffer* buf,
+                int buf_len,
+                CompletionOnceCallback callback,
+                bool truncate) override;
+  int ReadSparseData(int64_t offset,
+                     IOBuffer* buf,
+                     int buf_len,
+                     CompletionOnceCallback callback) override;
+  int WriteSparseData(int64_t offset,
+                      IOBuffer* buf,
+                      int buf_len,
+                      CompletionOnceCallback callback) override;
+  int GetAvailableRange(int64_t offset,
+                        int len,
+                        int64_t* start,
+                        CompletionOnceCallback callback) override;
+  bool CouldBeSparse() const override;
+  void CancelSparseIO() override {}
+  net::Error ReadyForSparseIO(CompletionOnceCallback callback) override;
+  void SetLastUsedTimeForTest(base::Time time) override;
+
+ private:
+  CobaltEntryImpl(base::WeakPtr<CobaltBackendImpl> backend,
+                  const std::string& key,
+                  int child_id,
+                  CobaltEntryImpl* parent,
+                  net::NetLog* net_log);
+
+  using EntryMap = std::map<int, CobaltEntryImpl*>;
+
+  std::string key_;
+
+  // Pointer to the parent entry, or nullptr if this entry is a parent entry.
+  CobaltEntryImpl* parent_ = nullptr;
+  std::unique_ptr<EntryMap> children_ = nullptr;
+
+  base::Time last_modified_;
+  base::Time last_used_;
+
+  DISALLOW_COPY_AND_ASSIGN(CobaltEntryImpl);
+};
+
+}  // namespace disk_cache
+
+#endif  // NET_DISK_CACHE_COBALT_COBALT_ENTRY_IMPL_H_
diff --git a/net/disk_cache/cobalt/resource_type.h b/net/disk_cache/cobalt/resource_type.h
new file mode 100644
index 0000000..13f2518
--- /dev/null
+++ b/net/disk_cache/cobalt/resource_type.h
@@ -0,0 +1,34 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef RESOURCE_TYPE_H_
+#define RESOURCE_TYPE_H_
+
+namespace disk_cache {
+
+enum ResourceType {
+  kOther = 0,
+  kHTML = 1,
+  kCSS = 2,
+  kImage = 3,
+  kFont = 4,
+  kSplashScreen = 5,
+  kUncompiledScript = 6,
+  kCompiledScript = 7,
+  kTypeCount = 8
+};
+
+}  // namespace disk_cache
+
+#endif  // RESOURCE_TYPE_H_
diff --git a/net/disk_cache/disk_cache.h b/net/disk_cache/disk_cache.h
index 98f00cc..572bf0c 100644
--- a/net/disk_cache/disk_cache.h
+++ b/net/disk_cache/disk_cache.h
@@ -165,10 +165,18 @@
   // will be invoked when the entry is available. The pointer to receive the
   // |entry| must remain valid until the operation completes. The |priority|
   // of the entry determines its priority in the background worker pools.
+#ifdef STARBOARD
+  virtual net::Error OpenEntry(const std::string& key,
+                               net::RequestPriority priority,
+                               Entry** entry,
+                               std::string type,
+                               CompletionOnceCallback callback) = 0;
+#else
   virtual net::Error OpenEntry(const std::string& key,
                                net::RequestPriority priority,
                                Entry** entry,
                                CompletionOnceCallback callback) = 0;
+#endif
 
   // Creates a new entry. Upon success, the out param holds a pointer to an
   // Entry object representing the newly created disk cache entry. When the
diff --git a/net/disk_cache/simple/simple_index_file_starboard.cc b/net/disk_cache/simple/simple_index_file_starboard.cc
index 644d7b0..bba6cd4 100644
--- a/net/disk_cache/simple/simple_index_file_starboard.cc
+++ b/net/disk_cache/simple/simple_index_file_starboard.cc
@@ -34,7 +34,7 @@
     PLOG(ERROR) << "opendir " << cache_path.value() << ", erron: " << error;
     return false;
   }
-#if SB_API_VERSION >= 12
+
   std::vector<char> entry(kSbFileMaxName);
 
   while (true) {
@@ -44,17 +44,6 @@
     }
 
     const std::string file_name(entry.data());
-#else   // SB_API_VERSION >= 12
-  SbDirectoryEntry entry;
-
-  while (true) {
-    if (!SbDirectoryGetNext(dir, &entry)) {
-      PLOG(ERROR) << "readdir " << cache_path.value();
-      return false;
-    }
-
-    const std::string file_name(entry.name);
-#endif  // SB_API_VERSION >= 12
     if (file_name == "." || file_name == "..")
       continue;
     const base::FilePath file_path =
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index 6530795..ea19ca9 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -79,9 +79,6 @@
     std::unique_ptr<disk_cache::Backend>* backend,
     CompletionOnceCallback callback) {
   DCHECK_GE(max_bytes_, 0);
-#if defined(STARBOARD)
-  return ERR_FAILED;
-#else
 #if defined(OS_ANDROID)
   if (app_status_listener_) {
     return disk_cache::CreateCacheBackend(
@@ -92,7 +89,6 @@
   return disk_cache::CreateCacheBackend(type_, backend_type_, path_, max_bytes_,
                                         true, net_log, backend,
                                         std::move(callback));
-#endif
 }
 
 #if defined(OS_ANDROID)
@@ -781,10 +777,18 @@
 
   pending_op->writer = std::move(item);
 
+#ifdef STARBOARD
+  int rv = disk_cache_->OpenEntry(
+      key, trans->priority(), &(pending_op->disk_entry),  trans->type(),
+      base::BindOnce(&HttpCache::OnPendingOpComplete, GetWeakPtr(),
+                     pending_op));
+#else
   int rv =
       disk_cache_->OpenEntry(key, trans->priority(), &(pending_op->disk_entry),
                              base::BindOnce(&HttpCache::OnPendingOpComplete,
                                             GetWeakPtr(), pending_op));
+#endif
+
   if (rv == ERR_IO_PENDING) {
     pending_op->callback_will_delete = true;
     return rv;
diff --git a/net/http/http_cache.h b/net/http/http_cache.h
index e3f2bed..595871a 100644
--- a/net/http/http_cache.h
+++ b/net/http/http_cache.h
@@ -54,12 +54,6 @@
 
 namespace net {
 
-#ifdef HTTP_CACHE_DISABLED_FOR_STARBOARD
-
-class HttpCache {};
-
-#else
-
 class HttpNetworkSession;
 class HttpResponseInfo;
 class IOBuffer;
@@ -627,9 +621,6 @@
 
   DISALLOW_COPY_AND_ASSIGN(HttpCache);
 };
-
-#endif  // HTTP_CACHE_DISABLED_FOR_STARBOARD
-
 }  // namespace net
 
 #endif  // NET_HTTP_HTTP_CACHE_H_
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index da934ee..13123c8 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -2350,6 +2350,10 @@
 
   if (request_->extra_headers.HasHeader(HttpRequestHeaders::kRange))
     range_found = true;
+#if defined(STARBOARD)
+  if (request_->extra_headers.HasHeader(HttpRequestHeaders::kResourceType))
+    request_->extra_headers.GetHeader(HttpRequestHeaders::kResourceType, &type_);
+#endif
 
   for (size_t i = 0; i < arraysize(kSpecialHeaders); ++i) {
     if (HeaderMatches(request_->extra_headers, kSpecialHeaders[i].search)) {
diff --git a/net/http/http_cache_transaction.h b/net/http/http_cache_transaction.h
index 57063c7..1012b39 100644
--- a/net/http/http_cache_transaction.h
+++ b/net/http/http_cache_transaction.h
@@ -195,6 +195,11 @@
   // value has been set to something other than PARALLEL_WRITING_NONE.
   void MaybeSetParallelWritingPatternForMetrics(ParallelWritingPattern pattern);
 
+#if defined(STARBOARD)
+  // Returns resource type of request, if set.
+  std::string type() { return type_; }
+#endif
+
  private:
   static const size_t kNumValidationHeaders = 2;
   // Helper struct to pair a header name with its value, for
@@ -582,6 +587,10 @@
   // If extra_headers specified a "if-modified-since" or "if-none-match",
   // |external_validation_| contains the value of those headers.
   ValidationHeaders external_validation_;
+#if defined(STARBOARD)
+  // If extra_headers specified a resource type.
+  std::string type_;
+#endif
   base::WeakPtr<HttpCache> cache_;
   HttpCache::ActiveEntry* entry_;
   HttpCache::ActiveEntry* new_entry_;
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc
index 0740dc8..1ecd878 100644
--- a/net/http/http_cache_unittest.cc
+++ b/net/http/http_cache_unittest.cc
@@ -3725,6 +3725,8 @@
   EXPECT_EQ(1, cache.disk_cache()->create_count());
 }
 
+// TODO: Enable test when HTTP Caching is fully functional.
+#if !defined(STARBOARD)
 // Tests that we can doom an entry with pending transactions and delete one of
 // the pending transactions before the first one completes.
 // See http://code.google.com/p/chromium/issues/detail?id=25588
@@ -3775,6 +3777,7 @@
     ReadAndVerifyTransaction(c->trans.get(), kSimpleGET_Transaction);
   }
 }
+#endif
 
 TEST_F(HttpCacheTest, DoomDoesNotSetHints) {
   // Test that a doomed writer doesn't set in-memory index hints.
@@ -7856,6 +7859,8 @@
   RemoveMockTransaction(&kRangeGET_TransactionOK);
 }
 
+// TODO: Enable test when HTTP Caching is fully functional.
+#if !defined(HTTP_CACHE_TESTING_DISABLED) 
 // Tests that we handle large range values properly.
 TEST_F(HttpCacheTest, RangeGET_LargeValues) {
   // We need a real sparse cache for this test.
@@ -7887,6 +7892,7 @@
 
   RemoveMockTransaction(&kRangeGET_TransactionOK);
 }
+#endif
 
 // Tests that we don't crash with a range request if the disk cache was not
 // initialized properly.
diff --git a/net/http/http_request_headers.cc b/net/http/http_request_headers.cc
index 080772d..38011f4 100644
--- a/net/http/http_request_headers.cc
+++ b/net/http/http_request_headers.cc
@@ -40,6 +40,9 @@
 const char HttpRequestHeaders::kProxyConnection[] = "Proxy-Connection";
 const char HttpRequestHeaders::kRange[] = "Range";
 const char HttpRequestHeaders::kReferer[] = "Referer";
+#if defined(STARBOARD)
+const char HttpRequestHeaders::kResourceType[] = "X-Resource-Type";
+#endif
 const char HttpRequestHeaders::kSecOriginPolicy[] = "Sec-Origin-Policy";
 const char HttpRequestHeaders::kTransferEncoding[] = "Transfer-Encoding";
 const char HttpRequestHeaders::kUserAgent[] = "User-Agent";
diff --git a/net/http/http_request_headers.h b/net/http/http_request_headers.h
index 3bb9e43..17a223b 100644
--- a/net/http/http_request_headers.h
+++ b/net/http/http_request_headers.h
@@ -84,6 +84,9 @@
   static const char kProxyConnection[];
   static const char kRange[];
   static const char kReferer[];
+  #if defined(STARBOARD)
+  static const char kResourceType[];
+  #endif
   static const char kSecOriginPolicy[];
   static const char kTransferEncoding[];
   static const char kUserAgent[];
diff --git a/net/http/mock_http_cache.cc b/net/http/mock_http_cache.cc
index 7383d2b..3e90275 100644
--- a/net/http/mock_http_cache.cc
+++ b/net/http/mock_http_cache.cc
@@ -420,6 +420,7 @@
 net::Error MockDiskCache::OpenEntry(const std::string& key,
                                     net::RequestPriority request_priority,
                                     disk_cache::Entry** entry,
+                                    std::string type,
                                     CompletionOnceCallback callback) {
   DCHECK(!callback.is_null());
   if (fail_requests_)
@@ -704,7 +705,7 @@
 bool MockHttpCache::OpenBackendEntry(const std::string& key,
                                      disk_cache::Entry** entry) {
   TestCompletionCallback cb;
-  int rv = backend()->OpenEntry(key, net::HIGHEST, entry, cb.callback());
+  int rv = backend()->OpenEntry(key, net::HIGHEST, entry, "0", cb.callback());
   return (cb.GetResult(rv) == OK);
 }
 
diff --git a/net/http/mock_http_cache.h b/net/http/mock_http_cache.h
index bfd0822..70a928a 100644
--- a/net/http/mock_http_cache.h
+++ b/net/http/mock_http_cache.h
@@ -151,6 +151,7 @@
   net::Error OpenEntry(const std::string& key,
                        net::RequestPriority request_priority,
                        disk_cache::Entry** entry,
+                       std::string type,
                        CompletionOnceCallback callback) override;
   net::Error CreateEntry(const std::string& key,
                          net::RequestPriority request_priority,
diff --git a/net/log/net_log_util.cc b/net/log/net_log_util.cc
index 6134f02..716b38a 100644
--- a/net/log/net_log_util.cc
+++ b/net/log/net_log_util.cc
@@ -106,9 +106,6 @@
 // Returns the disk cache backend for |context| if there is one, or NULL.
 // Despite the name, can return an in memory "disk cache".
 disk_cache::Backend* GetDiskCacheBackend(URLRequestContext* context) {
-#ifdef HTTP_CACHE_DISABLED_FOR_STARBOARD
-  return NULL;
-#else
   if (!context->http_transaction_factory())
     return NULL;
 
@@ -117,7 +114,6 @@
     return NULL;
 
   return http_cache->GetCurrentBackend();
-#endif
 }
 
 // Returns true if |request1| was created before |request2|.
diff --git a/net/net.gyp b/net/net.gyp
deleted file mode 100644
index e791500..0000000
--- a/net/net.gyp
+++ /dev/null
@@ -1,3021 +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.
-
-{
-  'variables': {
-    'chromium_code': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'net',
-      'type': '<(component)',
-      'defines': [
-        'NET_IMPLEMENTATION',
-        'ENABLE_BUILT_IN_DNS',
-        # To be removed in the future when want to enable HTTP cache.
-        'HTTP_CACHE_DISABLED_FOR_STARBOARD',
-        'QUIC_TRACE_DISABLED',
-        'COBALT_QUIC46',
-        'COMMON_CERT_SET_DISABLED_FOR_STARBOARD',
-      ],
-      'direct_dependent_settings': {
-        'defines': [
-          'HTTP_CACHE_DISABLED_FOR_STARBOARD',
-          'ENABLE_BUILT_IN_DNS',
-          'QUIC_TRACE_DISABLED',
-          'COBALT_QUIC46',
-          'COMMON_CERT_SET_DISABLED_FOR_STARBOARD',
-        ],
-      },
-      'include_dirs': [
-        '<(SHARED_INTERMEDIATE_DIR)',
-        '../third_party/brotli/c/dec',
-        '../third_party/brotli/c/include',
-        '../third_party/protobuf/src',
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/base/base.gyp:base_i18n',
-        '<(DEPTH)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-        '<(DEPTH)/crypto/crypto.gyp:crypto',
-        '<(DEPTH)/url/url.gyp:url',
-        '<(DEPTH)/nb/nb.gyp:nb',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/third_party/boringssl/boringssl.gyp:crypto',
-        '<(DEPTH)/third_party/brotli/brotli.gyp:dec',
-        '<(DEPTH)/third_party/icu/icu.gyp:icui18n',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-        '<(DEPTH)/third_party/zlib/zlib.gyp:zlib',
-        'net_generated_registry_controlled_domains',
-        'net_nqe_proto',
-        'net_quic_proto',
-      ],
-      # net depends on some protobuf files that has to be generated beforehand.
-      'hard_dependency': 1,
-      'export_dependent_settings': [
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-      'sources': [
-        'base/address_family.cc',
-        'base/address_family.h',
-        'base/address_list.cc',
-        'base/address_list.h',
-        'base/auth.cc',
-        'base/auth.h',
-        'base/completion_callback.h',
-        'base/completion_once_callback.h',
-        'base/completion_repeating_callback.h',
-        'base/datagram_buffer.cc',
-        'base/datagram_buffer.h',
-        'base/escape.cc',
-        'base/escape.h',
-        'base/features.cc',
-        'base/features.h',
-        'base/filename_util_icu.cc',
-        'base/hash_value.cc',
-        'base/hash_value.h',
-        'base/host_port_pair.cc',
-        'base/host_port_pair.h',
-        'base/interval.h',
-        'base/interval_set.h',
-        'base/io_buffer.cc',
-        'base/io_buffer.h',
-        'base/ip_address.cc',
-        'base/ip_address.h',
-        'base/ip_endpoint.cc',
-        'base/ip_endpoint.h',
-        'base/load_timing_info.cc',
-        'base/load_timing_info.h',
-        'base/lookup_string_in_fixed_set.cc',
-        'base/lookup_string_in_fixed_set.h',
-        'base/net_error_details.h',
-        'base/net_error_list.h',
-        'base/net_errors.cc',
-        'base/net_errors.h',
-        'base/net_errors_starboard.cc',
-        'base/net_export.h',
-        'base/net_module.cc',
-        'base/net_module.h',
-        'base/net_string_util.h',
-        'base/net_string_util_icu.cc',
-        'base/network_interfaces.cc',
-        'base/network_interfaces.h',
-        'base/network_interfaces_starboard.cc',
-        'base/parse_number.cc',
-        'base/parse_number.h',
-        'base/port_util.cc',
-        'base/port_util.h',
-        'base/privacy_mode.h',
-        'base/rand_callback.h',
-        'base/registry_controlled_domains/registry_controlled_domain.cc',
-        'base/registry_controlled_domains/registry_controlled_domain.h',
-        'base/sockaddr_storage.h',
-        'base/sys_addrinfo.h',
-        'base/url_util.cc',
-        'base/url_util.h',
-        'cert/asn1_util.cc',
-        'cert/asn1_util.h',
-        'cert/cert_database.cc',
-        'cert/cert_database.h',
-        'cert/cert_status_flags.cc',
-        'cert/cert_status_flags.h',
-        'cert/cert_status_flags_list.h',
-        'cert/cert_verifier.cc',
-        'cert/cert_verifier.h',
-        'cert/cert_verify_result.cc',
-        'cert/cert_verify_result.h',
-        'cert/client_cert_verifier.h',
-        'cert/crl_set.cc',
-        'cert/crl_set.h',
-        'cert/ct_policy_enforcer.cc',
-        'cert/ct_policy_enforcer.h',
-        'cert/ct_policy_status.h',
-        'cert/ct_verifier.h',
-        'cert/ct_verify_result.cc',
-        'cert/ct_verify_result.h',
-        'cert/do_nothing_ct_verifier.cc',
-        'cert/do_nothing_ct_verifier.h',
-        'cert/internal/cert_error_id.cc',
-        'cert/internal/cert_error_id.h',
-        'cert/internal/cert_error_params.cc',
-        'cert/internal/cert_error_params.h',
-        'cert/internal/cert_errors.cc',
-        'cert/internal/cert_errors.h',
-        'cert/internal/cert_issuer_source.h',
-        'cert/internal/cert_issuer_source_aia.cc',
-        'cert/internal/cert_issuer_source_aia.h',
-        'cert/internal/cert_issuer_source_static.cc',
-        'cert/internal/cert_issuer_source_static.h',
-        'cert/internal/certificate_policies.cc',
-        'cert/internal/certificate_policies.h',
-        'cert/internal/common_cert_errors.cc',
-        'cert/internal/common_cert_errors.h',
-        'cert/internal/extended_key_usage.cc',
-        'cert/internal/extended_key_usage.h',
-        'cert/internal/general_names.cc',
-        'cert/internal/general_names.h',
-        'cert/internal/name_constraints.cc',
-        'cert/internal/name_constraints.h',
-        'cert/internal/ocsp.cc',
-        'cert/internal/ocsp.h',
-        'cert/internal/parse_certificate.cc',
-        'cert/internal/parse_certificate.h',
-        'cert/internal/parse_name.cc',
-        'cert/internal/parse_name.h',
-        'cert/internal/parsed_certificate.cc',
-        'cert/internal/parsed_certificate.h',
-        'cert/internal/path_builder.cc',
-        'cert/internal/path_builder.h',
-        'cert/internal/revocation_checker.cc',
-        'cert/internal/revocation_checker.h',
-        'cert/internal/signature_algorithm.cc',
-        'cert/internal/signature_algorithm.h',
-        'cert/internal/simple_path_builder_delegate.cc',
-        'cert/internal/simple_path_builder_delegate.h',
-        'cert/internal/trust_store.cc',
-        'cert/internal/trust_store.h',
-        'cert/internal/trust_store_collection.cc',
-        'cert/internal/trust_store_collection.h',
-        'cert/internal/trust_store_in_memory.cc',
-        'cert/internal/trust_store_in_memory.h',
-        'cert/internal/trust_store_in_memory_starboard.cc',
-        'cert/internal/trust_store_in_memory_starboard.h',
-        'cert/internal/verify_certificate_chain.cc',
-        'cert/internal/verify_certificate_chain.h',
-        'cert/internal/verify_name_match.cc',
-        'cert/internal/verify_name_match.h',
-        'cert/internal/verify_signed_data.cc',
-        'cert/internal/verify_signed_data.h',
-        'cert/ocsp_revocation_status.h',
-        'cert/ocsp_verify_result.cc',
-        'cert/ocsp_verify_result.h',
-        'cert/pem_tokenizer.cc',
-        'cert/pem_tokenizer.h',
-        'cert/sct_status_flags.cc',
-        'cert/sct_status_flags.h',
-        'cert/signed_certificate_timestamp.cc',
-        'cert/signed_certificate_timestamp.h',
-        'cert/signed_certificate_timestamp_and_status.cc',
-        'cert/signed_certificate_timestamp_and_status.h',
-        'cert/signed_tree_head.cc',
-        'cert/signed_tree_head.h',
-        'cert/symantec_certs.cc',
-        'cert/symantec_certs.h',
-        'cert/test_root_certs.cc',
-        'cert/test_root_certs.h',
-        'cert/test_root_certs_starboard.cc',
-        'cert/x509_cert_types.cc',
-        'cert/x509_cert_types.h',
-        'cert/x509_certificate.cc',
-        'cert/x509_certificate.h',
-        'cert/x509_certificate_net_log_param.cc',
-        'cert/x509_certificate_net_log_param.h',
-        'cert/x509_util.cc',
-        'cert/x509_util.h',
-        'der/encode_values.cc',
-        'der/encode_values.h',
-        'der/input.cc',
-        'der/input.h',
-        'der/parse_values.cc',
-        'der/parse_values.h',
-        'der/parser.cc',
-        'der/parser.h',
-        'der/tag.cc',
-        'der/tag.h',
-
-        # dial is a legacy Chromium component with heavy Cobalt modifications.
-        'dial/dial_http_server.cc',
-        'dial/dial_http_server.h',
-        'dial/dial_service.cc',
-        'dial/dial_service.h',
-        'dial/dial_service_handler.h',
-        'dial/dial_system_config.cc',
-        'dial/dial_system_config.h',
-        'dial/dial_system_config_starboard.cc',
-        'dial/dial_udp_server.cc',
-        'dial/dial_udp_server.h',
-        'dial/dial_udp_socket_factory.cc',
-        'dial/dial_udp_socket_factory.h',
-
-        'extras/preload_data/decoder.cc',
-        'extras/preload_data/decoder.h',
-        'http/http_auth_challenge_tokenizer.cc',
-        'http/http_auth_challenge_tokenizer.h',
-        'http/http_auth_scheme.cc',
-        'http/http_auth_scheme.h',
-        'http/http_byte_range.cc',
-        'http/http_byte_range.h',
-        'http/http_log_util.cc',
-        'http/http_log_util.h',
-        'http/http_raw_request_headers.cc',
-        'http/http_raw_request_headers.h',
-        'http/http_request_headers.cc',
-        'http/http_request_headers.h',
-        'http/http_response_headers.cc',
-        'http/http_response_headers.h',
-        'http/http_response_info.cc',
-        'http/http_response_info.h',
-        'http/http_security_headers.cc',
-        'http/http_security_headers.h',
-        'http/http_status_code_list.h',
-        'http/http_util.cc',
-        'http/http_util.h',
-        'http/http_vary_data.cc',
-        'http/http_vary_data.h',
-        'http/url_security_manager.cc',
-        'http/url_security_manager.h',
-        'http/url_security_manager_starboard.cc',
-        'http/transport_security_state.cc',
-        'http/transport_security_state.h',
-        'http/transport_security_state_source.cc',
-        'http/transport_security_state_source.h',
-        'log/net_log.cc',
-        'log/net_log.h',
-        'log/file_net_log_observer.cc',
-        'log/file_net_log_observer.h',
-        'log/net_log_capture_mode.cc',
-        'log/net_log_capture_mode.h',
-        'log/net_log_entry.cc',
-        'log/net_log_entry.h',
-        'log/net_log_event_type.h',
-        'log/net_log_event_type_list.h',
-        'log/net_log_parameters_callback.h',
-        'log/net_log_source.cc',
-        'log/net_log_source.h',
-        'log/net_log_source_type.h',
-        'log/net_log_source_type_list.h',
-        'log/net_log_with_source.cc',
-        'log/net_log_with_source.h',
-        'socket/client_socket_handle.cc',
-        'socket/client_socket_handle.h',
-        'socket/connection_attempts.h',
-        'socket/next_proto.cc',
-        'socket/next_proto.h',
-        'socket/socket.cc',
-        'socket/socket.h',
-        'socket/socket_bio_adapter.cc',
-        'socket/socket_bio_adapter.h',
-        'socket/socket_performance_watcher.h',
-        'socket/socket_performance_watcher_factory.h',
-        'socket/ssl_client_socket.cc',
-        'socket/ssl_client_socket.h',
-        'socket/ssl_client_socket_impl.cc',
-        'socket/ssl_client_socket_impl.h',
-        'socket/ssl_socket.h',
-        'socket/stream_socket.cc',
-        'socket/stream_socket.h',
-        'ssl/channel_id_service.cc',
-        'ssl/channel_id_service.h',
-        'ssl/channel_id_store.cc',
-        'ssl/channel_id_store.h',
-        'ssl/client_cert_identity.cc',
-        'ssl/client_cert_identity.h',
-        'ssl/default_channel_id_store.cc',
-        'ssl/default_channel_id_store.h',
-        'ssl/openssl_ssl_util.cc',
-        'ssl/openssl_ssl_util.h',
-        'ssl/ssl_cert_request_info.cc',
-        'ssl/ssl_cert_request_info.h',
-        'ssl/ssl_cipher_suite_names.cc',
-        'ssl/ssl_cipher_suite_names.h',
-        'ssl/ssl_client_auth_cache.cc',
-        'ssl/ssl_client_auth_cache.h',
-        'ssl/ssl_client_cert_type.h',
-        'ssl/ssl_client_session_cache.cc',
-        'ssl/ssl_client_session_cache.h',
-        'ssl/ssl_config.cc',
-        'ssl/ssl_config.h',
-        'ssl/ssl_config_service.cc',
-        'ssl/ssl_config_service.h',
-        'ssl/ssl_connection_status_flags.h',
-        'ssl/ssl_info.cc',
-        'ssl/ssl_info.h',
-        'ssl/ssl_key_logger.h',
-        'ssl/ssl_key_logger_impl.cc',
-        'ssl/ssl_key_logger_impl.h',
-        'ssl/ssl_private_key.cc',
-        'ssl/ssl_private_key.h',
-        'ssl/ssl_server_config.cc',
-        'ssl/ssl_server_config.h',
-        'third_party/quic/core/quic_error_codes.cc',
-        'third_party/quic/core/quic_error_codes.h',
-        'third_party/uri_template/uri_template.cc',
-        'third_party/uri_template/uri_template.h',
-
-        'base/arena.cc',
-        'base/arena.h',
-        'base/backoff_entry.cc',
-        'base/backoff_entry.h',
-        'base/backoff_entry_serializer.cc',
-        'base/backoff_entry_serializer.h',
-        'base/cache_type.h',
-        'base/chunked_upload_data_stream.cc',
-        'base/chunked_upload_data_stream.h',
-        'base/data_url.cc',
-        'base/data_url.h',
-        'base/directory_listing.cc',
-        'base/directory_listing.h',
-        'base/elements_upload_data_stream.cc',
-        'base/elements_upload_data_stream.h',
-        'base/expiring_cache.h',
-        'base/file_stream.cc',
-        'base/file_stream.h',
-        'base/file_stream_context.cc',
-        'base/file_stream_context.h',
-        'base/file_stream_context_starboard.cc',
-        'base/filename_util.cc',
-        'base/filename_util.h',
-        'base/filename_util_internal.cc',
-        'base/filename_util_internal.h',
-        'base/hex_utils.cc',
-        'base/hex_utils.h',
-        'base/host_mapping_rules.cc',
-        'base/host_mapping_rules.h',
-        'base/iovec.h',
-        'base/ip_pattern.cc',
-        'base/ip_pattern.h',
-        'base/layered_network_delegate.cc',
-        'base/layered_network_delegate.h',
-        'base/linked_hash_map.h',
-        'base/load_flags.h',
-        'base/load_flags_list.h',
-        'base/load_states.h',
-        'base/load_states_list.h',
-        'base/logging_network_change_observer.cc',
-        'base/logging_network_change_observer.h',
-        'base/mime_sniffer.cc',
-        'base/mime_sniffer.h',
-        'base/mime_util.cc',
-        'base/mime_util.h',
-        'base/net_info_source_list.h',
-        'base/network_activity_monitor.cc',
-        'base/network_activity_monitor.h',
-        'base/network_change_notifier.cc',
-        'base/network_change_notifier.h',
-        'base/network_change_notifier_factory.h',
-        'base/network_delegate.cc',
-        'base/network_delegate.h',
-        'base/network_delegate_impl.cc',
-        'base/network_delegate_impl.h',
-        'base/platform_mime_util.h',
-        'base/platform_mime_util_starboard.cc',
-        'base/prioritized_dispatcher.cc',
-        'base/prioritized_dispatcher.h',
-        'base/prioritized_task_runner.cc',
-        'base/prioritized_task_runner.h',
-        'base/priority_queue.h',
-        'base/proxy_delegate.h',
-        'base/proxy_server.cc',
-        'base/proxy_server.h',
-        'base/request_priority.cc',
-        'base/request_priority.h',
-        'base/static_cookie_policy.cc',
-        'base/static_cookie_policy.h',
-        'base/trace_constants.cc',
-        'base/trace_constants.h',
-        'base/upload_bytes_element_reader.cc',
-        'base/upload_bytes_element_reader.h',
-        'base/upload_data_stream.cc',
-        'base/upload_data_stream.h',
-        'base/upload_element_reader.cc',
-        'base/upload_element_reader.h',
-        'base/upload_file_element_reader.cc',
-        'base/upload_file_element_reader.h',
-        'base/upload_progress.h',
-        'cert/caching_cert_verifier.cc',
-        'cert/caching_cert_verifier.h',
-        'cert/cert_net_fetcher.cc',
-        'cert/cert_net_fetcher.h',
-        'cert/cert_verify_proc.cc',
-        'cert/cert_verify_proc.h',
-        'cert/cert_verify_proc_builtin.cc',
-        'cert/cert_verify_proc_builtin.h',
-        'cert/ct_log_response_parser.cc',
-        'cert/ct_log_response_parser.h',
-        'cert/ct_log_verifier.cc',
-        'cert/ct_log_verifier.h',
-        'cert/ct_log_verifier_util.cc',
-        'cert/ct_log_verifier_util.h',
-        'cert/ct_objects_extractor.cc',
-        'cert/ct_objects_extractor.h',
-        'cert/ct_sct_to_string.cc',
-        'cert/ct_sct_to_string.h',
-        'cert/ct_serialization.cc',
-        'cert/ct_serialization.h',
-        'cert/ct_signed_certificate_timestamp_log_param.cc',
-        'cert/ct_signed_certificate_timestamp_log_param.h',
-        'cert/ev_root_ca_metadata.cc',
-        'cert/ev_root_ca_metadata.h',
-        'cert/internal/system_trust_store.cc',
-        'cert/internal/system_trust_store.h',
-        'cert/jwk_serializer.cc',
-        'cert/jwk_serializer.h',
-        'cert/known_roots.cc',
-        'cert/known_roots.h',
-        'cert/merkle_audit_proof.cc',
-        'cert/merkle_audit_proof.h',
-        'cert/merkle_consistency_proof.cc',
-        'cert/merkle_consistency_proof.h',
-        'cert/merkle_tree_leaf.cc',
-        'cert/merkle_tree_leaf.h',
-        'cert/multi_log_ct_verifier.cc',
-        'cert/multi_log_ct_verifier.h',
-        'cert/multi_threaded_cert_verifier.cc',
-        'cert/multi_threaded_cert_verifier.h',
-        'cert/root_cert_list_generated.h',
-        'cert_net/cert_net_fetcher_impl.cc',
-        'cert_net/cert_net_fetcher_impl.h',
-        'cookies/canonical_cookie.cc',
-        'cookies/canonical_cookie.h',
-        'cookies/cookie_change_dispatcher.cc',
-        'cookies/cookie_change_dispatcher.h',
-        'cookies/cookie_constants.cc',
-        'cookies/cookie_constants.h',
-        'cookies/cookie_deletion_info.cc',
-        'cookies/cookie_deletion_info.h',
-        'cookies/cookie_monster.cc',
-        'cookies/cookie_monster.h',
-        'cookies/cookie_monster_change_dispatcher.cc',
-        'cookies/cookie_monster_change_dispatcher.h',
-        'cookies/cookie_monster_netlog_params.cc',
-        'cookies/cookie_monster_netlog_params.h',
-        'cookies/cookie_options.cc',
-        'cookies/cookie_options.h',
-        'cookies/cookie_store.cc',
-        'cookies/cookie_store.h',
-        'cookies/cookie_util.cc',
-        'cookies/cookie_util.h',
-        'cookies/parsed_cookie.cc',
-        'cookies/parsed_cookie.h',
-        # disk_cache is not supported yet. They are required for http cache.
-        # Maybe we will need it in the future.
-        # 'disk_cache/backend_cleanup_tracker.cc',
-        # 'disk_cache/backend_cleanup_tracker.h',
-        # 'disk_cache/blockfile/addr.cc',
-        # 'disk_cache/blockfile/addr.h',
-        # 'disk_cache/blockfile/backend_impl.cc',
-        # 'disk_cache/blockfile/backend_impl.h',
-        # 'disk_cache/blockfile/bitmap.cc',
-        # 'disk_cache/blockfile/bitmap.h',
-        # 'disk_cache/blockfile/block_files.cc',
-        # 'disk_cache/blockfile/block_files.h',
-        # 'disk_cache/blockfile/disk_format.cc',
-        # 'disk_cache/blockfile/disk_format.h',
-        # 'disk_cache/blockfile/disk_format_base.h',
-        # 'disk_cache/blockfile/entry_impl.cc',
-        # 'disk_cache/blockfile/entry_impl.h',
-        # 'disk_cache/blockfile/errors.h',
-        # 'disk_cache/blockfile/eviction.cc',
-        # 'disk_cache/blockfile/eviction.h',
-        # 'disk_cache/blockfile/experiments.h',
-        # 'disk_cache/blockfile/file.cc',
-        # 'disk_cache/blockfile/file.h',
-        # 'disk_cache/blockfile/file_starboard.cc',
-        # 'disk_cache/blockfile/file_block.h',
-        # 'disk_cache/blockfile/file_lock.cc',
-        # 'disk_cache/blockfile/file_lock.h',
-        # 'disk_cache/blockfile/histogram_macros.h',
-        # 'disk_cache/blockfile/in_flight_backend_io.cc',
-        # 'disk_cache/blockfile/in_flight_backend_io.h',
-        # 'disk_cache/blockfile/in_flight_io.cc',
-        # 'disk_cache/blockfile/in_flight_io.h',
-        # 'disk_cache/blockfile/mapped_file.cc',
-        # 'disk_cache/blockfile/mapped_file.h',
-        # 'disk_cache/blockfile/rankings.cc',
-        # 'disk_cache/blockfile/rankings.h',
-        # 'disk_cache/blockfile/sparse_control.cc',
-        # 'disk_cache/blockfile/sparse_control.h',
-        # 'disk_cache/blockfile/stats.cc',
-        # 'disk_cache/blockfile/stats.h',
-        # 'disk_cache/blockfile/storage_block-inl.h',
-        # 'disk_cache/blockfile/storage_block.h',
-        # 'disk_cache/blockfile/stress_support.h',
-        # 'disk_cache/blockfile/trace.cc',
-        # 'disk_cache/blockfile/trace.h',
-        # 'disk_cache/blockfile/webfonts_histogram.cc',
-        # 'disk_cache/blockfile/webfonts_histogram.h',
-        # 'disk_cache/cache_util.cc',
-        # 'disk_cache/cache_util.h',
-        # 'disk_cache/cache_util_starboard.cc',
-        # 'disk_cache/disk_cache.cc',
-        # 'disk_cache/disk_cache.h',
-        # 'disk_cache/memory/mem_backend_impl.cc',
-        # 'disk_cache/memory/mem_backend_impl.h',
-        # 'disk_cache/memory/mem_entry_impl.cc',
-        # 'disk_cache/memory/mem_entry_impl.h',
-        # 'disk_cache/net_log_parameters.cc',
-        # 'disk_cache/net_log_parameters.h',
-        # 'disk_cache/simple/simple_backend_impl.cc',
-        # 'disk_cache/simple/simple_backend_impl.h',
-        # 'disk_cache/simple/simple_backend_version.h',
-        # 'disk_cache/simple/simple_entry_format.cc',
-        # 'disk_cache/simple/simple_entry_format.h',
-        # 'disk_cache/simple/simple_entry_format_history.h',
-        # 'disk_cache/simple/simple_entry_impl.cc',
-        # 'disk_cache/simple/simple_entry_impl.h',
-        # 'disk_cache/simple/simple_entry_operation.cc',
-        # 'disk_cache/simple/simple_entry_operation.h',
-        # 'disk_cache/simple/simple_file_tracker.cc',
-        # 'disk_cache/simple/simple_file_tracker.h',
-        # 'disk_cache/simple/simple_histogram_macros.h',
-        # 'disk_cache/simple/simple_index.cc',
-        # 'disk_cache/simple/simple_index.h',
-        # 'disk_cache/simple/simple_index_delegate.h',
-        # 'disk_cache/simple/simple_index_file.cc',
-        # 'disk_cache/simple/simple_index_file.h',
-        # 'disk_cache/simple/simple_index_file_starboard.cc',
-        # 'disk_cache/simple/simple_net_log_parameters.cc',
-        # 'disk_cache/simple/simple_net_log_parameters.h',
-        # 'disk_cache/simple/simple_synchronous_entry.cc',
-        # 'disk_cache/simple/simple_synchronous_entry.h',
-        # 'disk_cache/simple/simple_util.cc',
-        # 'disk_cache/simple/simple_util.h',
-        # 'disk_cache/simple/simple_util_starboard.cc',
-        # 'disk_cache/simple/simple_version_upgrade.cc',
-        # 'disk_cache/simple/simple_version_upgrade.h',
-        'dns/dns_util.cc',
-        'dns/dns_util.h',
-        'dns/address_sorter.h',
-        'dns/dns_config.cc',
-        'dns/dns_config.h',
-        'dns/host_resolver_mdns_task.cc',
-        'dns/host_resolver_mdns_task.h',
-        'dns/host_resolver_source.h',
-        'dns/address_sorter.h',
-        'dns/address_sorter_starboard.cc',
-        'dns/dns_client.cc',
-        'dns/dns_client.h',
-        'dns/dns_config_service.cc',
-        'dns/dns_config_service.h',
-        'dns/dns_hosts.cc',
-        'dns/dns_hosts.h',
-        'dns/dns_protocol.h',
-        'dns/dns_query.cc',
-        'dns/dns_query.h',
-        'dns/dns_reloader.cc',
-        'dns/dns_reloader.h',
-        'dns/dns_response.cc',
-        'dns/dns_response.h',
-        'dns/dns_session.cc',
-        'dns/dns_session.h',
-        'dns/dns_socket_pool.cc',
-        'dns/dns_socket_pool.h',
-        'dns/dns_transaction.cc',
-        'dns/dns_transaction.h',
-        'dns/host_cache.cc',
-        'dns/host_cache.h',
-        'dns/host_resolver.cc',
-        'dns/host_resolver.h',
-        'dns/host_resolver_impl.cc',
-        'dns/host_resolver_impl.h',
-        'dns/host_resolver_proc.cc',
-        'dns/host_resolver_proc.h',
-        'dns/mapped_host_resolver.cc',
-        'dns/mapped_host_resolver.h',
-        'dns/mdns_cache.cc',
-        'dns/mdns_cache.h',
-        'dns/mdns_client.cc',
-        'dns/mdns_client.h',
-        'dns/mdns_client_impl.cc',
-        'dns/mdns_client_impl.h',
-        'dns/record_parsed.cc',
-        'dns/record_parsed.h',
-        'dns/record_rdata.cc',
-        'dns/record_rdata.h',
-        'dns/serial_worker.cc',
-        'dns/serial_worker.h',
-        'filter/brotli_source_stream.cc',
-        'filter/brotli_source_stream.h',
-        # 'filter/brotli_source_stream_fuzzer.cc',
-        'filter/filter_source_stream.cc',
-        'filter/filter_source_stream.h',
-        'filter/gzip_header.cc',
-        'filter/gzip_header.h',
-        'filter/gzip_source_stream.cc',
-        'filter/gzip_source_stream.h',
-        'filter/source_stream.cc',
-        'filter/source_stream.h',
-        'filter/source_stream_type_list.h',
-        'http/bidirectional_stream.cc',
-        'http/bidirectional_stream.h',
-        'http/bidirectional_stream_impl.cc',
-        'http/bidirectional_stream_impl.h',
-        'http/bidirectional_stream_request_info.cc',
-        'http/bidirectional_stream_request_info.h',
-        'http/broken_alternative_services.cc',
-        'http/broken_alternative_services.h',
-        'http/failing_http_transaction_factory.cc',
-        'http/failing_http_transaction_factory.h',
-        'http/http_auth.cc',
-        'http/http_auth.h',
-        'http/http_auth_cache.cc',
-        'http/http_auth_cache.h',
-        'http/http_auth_controller.cc',
-        'http/http_auth_controller.h',
-        'http/http_auth_filter.cc',
-        'http/http_auth_filter.h',
-        'http/http_auth_handler.cc',
-        'http/http_auth_handler.h',
-        'http/http_auth_handler_basic.cc',
-        'http/http_auth_handler_basic.h',
-        'http/http_auth_handler_digest.cc',
-        'http/http_auth_handler_digest.h',
-        'http/http_auth_handler_factory.cc',
-        'http/http_auth_handler_factory.h',
-        # Disabled due to dependency on gssapi.
-        # 'http/http_auth_gssapi_starboard.cc',
-        # 'http/http_auth_gssapi_starboard.h',
-        # 'http/http_auth_handler_negotiate.cc',
-        # 'http/http_auth_handler_negotiate.h',
-        'http/http_auth_handler_ntlm.cc',
-        'http/http_auth_handler_ntlm.h',
-        'http/http_auth_handler_ntlm_portable.cc',
-        'http/http_auth_multi_round_parse.cc',
-        'http/http_auth_multi_round_parse.h',
-        'http/http_auth_preferences.cc',
-        'http/http_auth_preferences.h',
-        'http/http_basic_state.cc',
-        'http/http_basic_state.h',
-        'http/http_basic_stream.cc',
-        'http/http_basic_stream.h',
-        # 'http/http_cache.cc',
-        # 'http/http_cache.h',
-        # 'http/http_cache_lookup_manager.cc',
-        # 'http/http_cache_lookup_manager.h',
-        # 'http/http_cache_transaction.cc',
-        # 'http/http_cache_transaction.h',
-        # 'http/http_cache_writers.cc',
-        # 'http/http_cache_writers.h',
-        'http/http_chunked_decoder.cc',
-        'http/http_chunked_decoder.h',
-        'http/http_content_disposition.cc',
-        'http/http_content_disposition.h',
-        'http/http_network_layer.cc',
-        'http/http_network_layer.h',
-        'http/http_network_session.cc',
-        'http/http_network_session.h',
-        'http/http_network_session_peer.cc',
-        'http/http_network_session_peer.h',
-        'http/http_network_transaction.cc',
-        'http/http_network_transaction.h',
-        'http/http_proxy_client_socket.cc',
-        'http/http_proxy_client_socket.h',
-        'http/http_proxy_client_socket_pool.cc',
-        'http/http_proxy_client_socket_pool.h',
-        'http/http_proxy_client_socket_wrapper.cc',
-        'http/http_proxy_client_socket_wrapper.h',
-        'http/http_request_info.cc',
-        'http/http_request_info.h',
-        'http/http_response_body_drainer.cc',
-        'http/http_response_body_drainer.h',
-        'http/http_server_properties.cc',
-        'http/http_server_properties.h',
-        'http/http_server_properties_impl.cc',
-        'http/http_server_properties_impl.h',
-        'http/http_server_properties_manager.cc',
-        'http/http_server_properties_manager.h',
-        'http/http_status_code.cc',
-        'http/http_status_code.h',
-        'http/http_stream.h',
-        'http/http_stream_factory.cc',
-        'http/http_stream_factory.h',
-        'http/http_stream_factory_job.cc',
-        'http/http_stream_factory_job.h',
-        'http/http_stream_factory_job_controller.cc',
-        'http/http_stream_factory_job_controller.h',
-        'http/http_stream_parser.cc',
-        'http/http_stream_parser.h',
-        'http/http_stream_request.cc',
-        'http/http_stream_request.h',
-        'http/http_transaction.h',
-        'http/http_transaction_factory.h',
-        'http/http_version.h',
-        'http/partial_data.cc',
-        'http/partial_data.h',
-        'http/proxy_client_socket.cc',
-        'http/proxy_client_socket.h',
-        'http/proxy_connect_redirect_http_stream.cc',
-        'http/proxy_connect_redirect_http_stream.h',
-        'http/proxy_fallback.cc',
-        'http/proxy_fallback.h',
-        'http/url_security_manager.cc',
-        'http/url_security_manager.h',
-        'http2/platform/impl/http2_arraysize_impl.h',
-        'http2/platform/impl/http2_bug_tracker_impl.h',
-        'http2/platform/impl/http2_containers_impl.h',
-        'http2/platform/impl/http2_estimate_memory_usage_impl.h',
-        'http2/platform/impl/http2_export_impl.h',
-        'http2/platform/impl/http2_flag_utils_impl.h',
-        'http2/platform/impl/http2_flags_impl.cc',
-        'http2/platform/impl/http2_flags_impl.h',
-        'http2/platform/impl/http2_macros_impl.h',
-        'http2/platform/impl/http2_optional_impl.h',
-        'http2/platform/impl/http2_ptr_util_impl.h',
-        'http2/platform/impl/http2_reconstruct_object_impl.h',
-        'http2/platform/impl/http2_string_impl.h',
-        'http2/platform/impl/http2_string_piece_impl.h',
-        'http2/platform/impl/http2_string_utils_impl.h',
-        'log/net_log_util.cc',
-        'log/net_log_util.h',
-        'log/trace_net_log_observer.cc',
-        'log/trace_net_log_observer.h',
-        'nqe/cached_network_quality.cc',
-        'nqe/cached_network_quality.h',
-        'nqe/effective_connection_type.cc',
-        'nqe/effective_connection_type.h',
-        'nqe/effective_connection_type_observer.h',
-        'nqe/event_creator.cc',
-        'nqe/event_creator.h',
-        'nqe/network_id.cc',
-        'nqe/network_id.h',
-        'nqe/network_qualities_prefs_manager.cc',
-        'nqe/network_qualities_prefs_manager.h',
-        'nqe/network_quality.cc',
-        'nqe/network_quality.h',
-        'nqe/network_quality_estimator.cc',
-        'nqe/network_quality_estimator.h',
-        'nqe/network_quality_estimator_params.cc',
-        'nqe/network_quality_estimator_params.h',
-        'nqe/network_quality_estimator_util.cc',
-        'nqe/network_quality_estimator_util.h',
-        'nqe/network_quality_observation.cc',
-        'nqe/network_quality_observation.h',
-        'nqe/network_quality_observation_source.cc',
-        'nqe/network_quality_observation_source.h',
-        'nqe/network_quality_provider.cc',
-        'nqe/network_quality_provider.h',
-        'nqe/network_quality_store.cc',
-        'nqe/network_quality_store.h',
-        'nqe/observation_buffer.cc',
-        'nqe/observation_buffer.h',
-        'nqe/rtt_throughput_estimates_observer.h',
-        'nqe/socket_watcher.cc',
-        'nqe/socket_watcher.h',
-        'nqe/socket_watcher_factory.cc',
-        'nqe/socket_watcher_factory.h',
-        'nqe/throughput_analyzer.cc',
-        'nqe/throughput_analyzer.h',
-        'nqe/weighted_observation.h',
-        'ntlm/ntlm.cc',
-        'ntlm/ntlm.h',
-        'ntlm/ntlm_buffer_reader.cc',
-        'ntlm/ntlm_buffer_reader.h',
-        'ntlm/ntlm_buffer_writer.cc',
-        'ntlm/ntlm_buffer_writer.h',
-        'ntlm/ntlm_client.cc',
-        'ntlm/ntlm_client.h',
-        'ntlm/ntlm_constants.cc',
-        'ntlm/ntlm_constants.h',
-        'proxy_resolution/dhcp_pac_file_fetcher.cc',
-        'proxy_resolution/dhcp_pac_file_fetcher.h',
-        'proxy_resolution/dhcp_pac_file_fetcher_factory.cc',
-        'proxy_resolution/dhcp_pac_file_fetcher_factory.h',
-        'proxy_resolution/multi_threaded_proxy_resolver.cc',
-        'proxy_resolution/multi_threaded_proxy_resolver.h',
-        'proxy_resolution/network_delegate_error_observer.cc',
-        'proxy_resolution/network_delegate_error_observer.h',
-        'proxy_resolution/pac_file_data.cc',
-        'proxy_resolution/pac_file_data.h',
-        'proxy_resolution/pac_file_decider.cc',
-        'proxy_resolution/pac_file_decider.h',
-        'proxy_resolution/pac_file_fetcher.h',
-        'proxy_resolution/pac_file_fetcher_impl.cc',
-        'proxy_resolution/pac_file_fetcher_impl.h',
-        'proxy_resolution/pac_js_library.h',
-        'proxy_resolution/polling_proxy_config_service.cc',
-        'proxy_resolution/polling_proxy_config_service.h',
-        'proxy_resolution/proxy_bypass_rules.cc',
-        'proxy_resolution/proxy_bypass_rules.h',
-        'proxy_resolution/proxy_config.cc',
-        'proxy_resolution/proxy_config.h',
-        'proxy_resolution/proxy_config_service.h',
-        'proxy_resolution/proxy_config_with_annotation.cc',
-        'proxy_resolution/proxy_config_with_annotation.h',
-        'proxy_resolution/proxy_info.cc',
-        'proxy_resolution/proxy_info.h',
-        'proxy_resolution/proxy_list.cc',
-        'proxy_resolution/proxy_list.h',
-        'proxy_resolution/proxy_config_service_fixed.cc',
-        'proxy_resolution/proxy_config_service_fixed.h',
-        'proxy_resolution/proxy_resolution_service.cc',
-        'proxy_resolution/proxy_resolution_service.h',
-        'proxy_resolution/proxy_resolver.h',
-        'proxy_resolution/proxy_resolver_error_observer.h',
-        'proxy_resolution/proxy_resolver_factory.cc',
-        'proxy_resolution/proxy_resolver_factory.h',
-
-        # We do not need this flavor of resolver yet
-        # 'proxy_resolution/proxy_resolver_v8_tracing.cc',
-        # 'proxy_resolution/proxy_resolver_v8_tracing.h',
-        # 'proxy_resolution/proxy_resolver_v8_tracing_wrapper.cc',
-        # 'proxy_resolution/proxy_resolver_v8_tracing_wrapper.h',
-        'proxy_resolution/proxy_retry_info.h',
-
-        'quic/bidirectional_stream_quic_impl.cc',
-        'quic/bidirectional_stream_quic_impl.h',
-        'quic/crypto/channel_id_chromium.cc',
-        'quic/crypto/channel_id_chromium.h',
-        'quic/crypto/proof_source_chromium.cc',
-        'quic/crypto/proof_source_chromium.h',
-        'quic/crypto/proof_verifier_chromium.cc',
-        'quic/crypto/proof_verifier_chromium.h',
-        'quic/network_connection.cc',
-        'quic/network_connection.h',
-        'quic/properties_based_quic_server_info.cc',
-        'quic/properties_based_quic_server_info.h',
-        'quic/quic_address_mismatch.cc',
-        'quic/quic_address_mismatch.h',
-        'quic/quic_chromium_alarm_factory.cc',
-        'quic/quic_chromium_alarm_factory.h',
-        'quic/quic_chromium_client_session.cc',
-        'quic/quic_chromium_client_session.h',
-        'quic/quic_chromium_client_stream.cc',
-        'quic/quic_chromium_client_stream.h',
-        'quic/quic_chromium_connection_helper.cc',
-        'quic/quic_chromium_connection_helper.h',
-        'quic/quic_chromium_packet_reader.cc',
-        'quic/quic_chromium_packet_reader.h',
-        'quic/quic_chromium_packet_writer.cc',
-        'quic/quic_chromium_packet_writer.h',
-        'quic/quic_clock_skew_detector.cc',
-        'quic/quic_clock_skew_detector.h',
-        'quic/quic_connection_logger.cc',
-        'quic/quic_connection_logger.h',
-        'quic/quic_connectivity_probing_manager.cc',
-        'quic/quic_connectivity_probing_manager.h',
-        'quic/quic_crypto_client_stream_factory.cc',
-        'quic/quic_crypto_client_stream_factory.h',
-        'quic/quic_flags_list.h',
-        'quic/quic_http_stream.cc',
-        'quic/quic_http_stream.h',
-        'quic/quic_http_utils.cc',
-        'quic/quic_http_utils.h',
-        'quic/quic_proxy_client_socket.cc',
-        'quic/quic_proxy_client_socket.h',
-        'quic/quic_server_info.cc',
-        'quic/quic_server_info.h',
-        'quic/quic_session_key.cc',
-        'quic/quic_session_key.h',
-        'quic/quic_stream_factory.cc',
-        'quic/quic_stream_factory.h',
-        'quic/quic_utils_chromium.cc',
-        'quic/quic_utils_chromium.h',
-        'socket/client_socket_factory.cc',
-        'socket/client_socket_factory.h',
-        'socket/client_socket_pool.cc',
-        'socket/client_socket_pool.h',
-        'socket/client_socket_pool_base.cc',
-        'socket/client_socket_pool_base.h',
-        'socket/client_socket_pool_manager.cc',
-        'socket/client_socket_pool_manager.h',
-        'socket/client_socket_pool_manager_impl.cc',
-        'socket/client_socket_pool_manager_impl.h',
-        'socket/datagram_client_socket.h',
-        'socket/datagram_server_socket.h',
-        'socket/datagram_socket.h',
-        'socket/diff_serv_code_point.h',
-        'socket/server_socket.cc',
-        'socket/server_socket.h',
-        'socket/socket_descriptor.h',
-        'socket/socket_net_log_params.cc',
-        'socket/socket_net_log_params.h',
-        'socket/socket_options.cc',
-        'socket/socket_options.h',
-        'socket/socket_tag.cc',
-        'socket/socket_tag.h',
-        'socket/socks5_client_socket.cc',
-        'socket/socks5_client_socket.h',
-        'socket/socks_client_socket.cc',
-        'socket/socks_client_socket.h',
-        'socket/socks_client_socket_pool.cc',
-        'socket/socks_client_socket_pool.h',
-        'socket/ssl_client_socket_pool.cc',
-        'socket/ssl_client_socket_pool.h',
-        'socket/ssl_server_socket.h',
-        'socket/ssl_server_socket_impl.cc',
-        'socket/ssl_server_socket_impl.h',
-        'socket/tcp_client_socket.cc',
-        'socket/tcp_client_socket.h',
-        'socket/tcp_server_socket.cc',
-        'socket/tcp_server_socket.h',
-        'socket/tcp_socket.h',
-        'socket/tcp_socket_starboard.cc',
-        'socket/tcp_socket_starboard.h',
-        'socket/transport_client_socket.cc',
-        'socket/transport_client_socket.h',
-        'socket/transport_client_socket_pool.cc',
-        'socket/transport_client_socket_pool.h',
-        'socket/udp_client_socket.cc',
-        'socket/udp_client_socket.h',
-        'socket/udp_net_log_parameters.cc',
-        'socket/udp_net_log_parameters.h',
-        'socket/udp_server_socket.cc',
-        'socket/udp_server_socket.h',
-        'socket/udp_socket.h',
-        'socket/udp_socket_starboard.cc',
-        'socket/udp_socket_starboard.h',
-        'socket/websocket_endpoint_lock_manager.cc',
-        'socket/websocket_endpoint_lock_manager.h',
-        'socket/websocket_transport_client_socket_pool.cc',
-        'socket/websocket_transport_client_socket_pool.h',
-        'socket/websocket_transport_connect_sub_job.cc',
-        'socket/websocket_transport_connect_sub_job.h',
-        'spdy/bidirectional_stream_spdy_impl.cc',
-        'spdy/bidirectional_stream_spdy_impl.h',
-        'spdy/buffered_spdy_framer.cc',
-        'spdy/buffered_spdy_framer.h',
-        'spdy/header_coalescer.cc',
-        'spdy/header_coalescer.h',
-        'spdy/http2_priority_dependencies.cc',
-        'spdy/http2_priority_dependencies.h',
-        'spdy/http2_push_promise_index.cc',
-        'spdy/http2_push_promise_index.h',
-        'spdy/multiplexed_http_stream.cc',
-        'spdy/multiplexed_http_stream.h',
-        'spdy/multiplexed_session.cc',
-        'spdy/multiplexed_session.h',
-        'spdy/platform/impl/spdy_arraysize_impl.h',
-        'spdy/platform/impl/spdy_bug_tracker_impl.h',
-        'spdy/platform/impl/spdy_containers_impl.h',
-        'spdy/platform/impl/spdy_endianness_util_impl.h',
-        'spdy/platform/impl/spdy_estimate_memory_usage_impl.h',
-        'spdy/platform/impl/spdy_export_impl.h',
-        'spdy/platform/impl/spdy_flags_impl.cc',
-        'spdy/platform/impl/spdy_flags_impl.h',
-        'spdy/platform/impl/spdy_macros_impl.h',
-        'spdy/platform/impl/spdy_mem_slice_impl.cc',
-        'spdy/platform/impl/spdy_mem_slice_impl.h',
-        'spdy/platform/impl/spdy_ptr_util_impl.h',
-        'spdy/platform/impl/spdy_string_impl.h',
-        'spdy/platform/impl/spdy_string_piece_impl.h',
-        'spdy/platform/impl/spdy_string_utils_impl.cc',
-        'spdy/platform/impl/spdy_string_utils_impl.h',
-        'spdy/platform/impl/spdy_test_utils_prod_impl.h',
-        'spdy/platform/impl/spdy_unsafe_arena_impl.cc',
-        'spdy/platform/impl/spdy_unsafe_arena_impl.h',
-        'spdy/server_push_delegate.h',
-        'spdy/spdy_buffer.cc',
-        'spdy/spdy_buffer.h',
-        'spdy/spdy_buffer_producer.cc',
-        'spdy/spdy_buffer_producer.h',
-        'spdy/spdy_http_stream.cc',
-        'spdy/spdy_http_stream.h',
-        'spdy/spdy_http_utils.cc',
-        'spdy/spdy_http_utils.h',
-        'spdy/spdy_log_util.cc',
-        'spdy/spdy_log_util.h',
-        'spdy/spdy_proxy_client_socket.cc',
-        'spdy/spdy_proxy_client_socket.h',
-        'spdy/spdy_read_queue.cc',
-        'spdy/spdy_read_queue.h',
-        'spdy/spdy_session.cc',
-        'spdy/spdy_session.h',
-        'spdy/spdy_session_key.cc',
-        'spdy/spdy_session_key.h',
-        'spdy/spdy_session_pool.cc',
-        'spdy/spdy_session_pool.h',
-        'spdy/spdy_stream.cc',
-        'spdy/spdy_stream.h',
-        'spdy/spdy_write_queue.cc',
-        'spdy/spdy_write_queue.h',
-        'ssl/client_cert_store.h',
-        'ssl/ssl_config_service_defaults.cc',
-        'ssl/ssl_config_service_defaults.h',
-        'ssl/ssl_platform_key_util.cc',
-        'ssl/ssl_platform_key_util.h',
-        'ssl/threaded_ssl_private_key.cc',
-        'ssl/threaded_ssl_private_key.h',
-        'third_party/quic/core/congestion_control/bandwidth_sampler.cc',
-        'third_party/quic/core/congestion_control/bandwidth_sampler.h',
-        'third_party/quic/core/congestion_control/bbr_sender.cc',
-        'third_party/quic/core/congestion_control/bbr_sender.h',
-        'third_party/quic/core/congestion_control/cubic_bytes.cc',
-        'third_party/quic/core/congestion_control/cubic_bytes.h',
-        'third_party/quic/core/congestion_control/general_loss_algorithm.cc',
-        'third_party/quic/core/congestion_control/general_loss_algorithm.h',
-        'third_party/quic/core/congestion_control/hybrid_slow_start.cc',
-        'third_party/quic/core/congestion_control/hybrid_slow_start.h',
-        'third_party/quic/core/congestion_control/loss_detection_interface.h',
-        'third_party/quic/core/congestion_control/pacing_sender.cc',
-        'third_party/quic/core/congestion_control/pacing_sender.h',
-        'third_party/quic/core/congestion_control/prr_sender.cc',
-        'third_party/quic/core/congestion_control/prr_sender.h',
-        'third_party/quic/core/congestion_control/rtt_stats.cc',
-        'third_party/quic/core/congestion_control/rtt_stats.h',
-        'third_party/quic/core/congestion_control/send_algorithm_interface.cc',
-        'third_party/quic/core/congestion_control/send_algorithm_interface.h',
-        'third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.cc',
-        'third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.h',
-        'third_party/quic/core/congestion_control/uber_loss_algorithm.cc',
-        'third_party/quic/core/congestion_control/uber_loss_algorithm.h',
-        'third_party/quic/core/congestion_control/windowed_filter.h',
-        'third_party/quic/core/crypto/aead_base_decrypter.cc',
-        'third_party/quic/core/crypto/aead_base_decrypter.h',
-        'third_party/quic/core/crypto/aead_base_encrypter.cc',
-        'third_party/quic/core/crypto/aead_base_encrypter.h',
-        'third_party/quic/core/crypto/aes_128_gcm_12_decrypter.cc',
-        'third_party/quic/core/crypto/aes_128_gcm_12_decrypter.h',
-        'third_party/quic/core/crypto/aes_128_gcm_12_encrypter.cc',
-        'third_party/quic/core/crypto/aes_128_gcm_12_encrypter.h',
-        'third_party/quic/core/crypto/aes_128_gcm_decrypter.cc',
-        'third_party/quic/core/crypto/aes_128_gcm_decrypter.h',
-        'third_party/quic/core/crypto/aes_128_gcm_encrypter.cc',
-        'third_party/quic/core/crypto/aes_128_gcm_encrypter.h',
-        'third_party/quic/core/crypto/aes_256_gcm_decrypter.cc',
-        'third_party/quic/core/crypto/aes_256_gcm_decrypter.h',
-        'third_party/quic/core/crypto/aes_256_gcm_encrypter.cc',
-        'third_party/quic/core/crypto/aes_256_gcm_encrypter.h',
-        'third_party/quic/core/crypto/cert_compressor.cc',
-        'third_party/quic/core/crypto/cert_compressor.h',
-        'third_party/quic/core/crypto/chacha20_poly1305_decrypter.cc',
-        'third_party/quic/core/crypto/chacha20_poly1305_decrypter.h',
-        'third_party/quic/core/crypto/chacha20_poly1305_encrypter.cc',
-        'third_party/quic/core/crypto/chacha20_poly1305_encrypter.h',
-        'third_party/quic/core/crypto/chacha20_poly1305_tls_decrypter.cc',
-        'third_party/quic/core/crypto/chacha20_poly1305_tls_decrypter.h',
-        'third_party/quic/core/crypto/chacha20_poly1305_tls_encrypter.cc',
-        'third_party/quic/core/crypto/chacha20_poly1305_tls_encrypter.h',
-        'third_party/quic/core/crypto/channel_id.cc',
-        'third_party/quic/core/crypto/channel_id.h',
-        'third_party/quic/core/crypto/common_cert_set.cc',
-        'third_party/quic/core/crypto/common_cert_set.h',
-        'third_party/quic/core/crypto/crypto_framer.cc',
-        'third_party/quic/core/crypto/crypto_framer.h',
-        'third_party/quic/core/crypto/crypto_handshake.cc',
-        'third_party/quic/core/crypto/crypto_handshake.h',
-        'third_party/quic/core/crypto/crypto_handshake_message.cc',
-        'third_party/quic/core/crypto/crypto_handshake_message.h',
-        'third_party/quic/core/crypto/crypto_message_parser.h',
-        'third_party/quic/core/crypto/crypto_protocol.h',
-        'third_party/quic/core/crypto/crypto_secret_boxer.cc',
-        'third_party/quic/core/crypto/crypto_secret_boxer.h',
-        'third_party/quic/core/crypto/crypto_utils.cc',
-        'third_party/quic/core/crypto/crypto_utils.h',
-        'third_party/quic/core/crypto/curve25519_key_exchange.cc',
-        'third_party/quic/core/crypto/curve25519_key_exchange.h',
-        'third_party/quic/core/crypto/key_exchange.h',
-        'third_party/quic/core/crypto/null_decrypter.cc',
-        'third_party/quic/core/crypto/null_decrypter.h',
-        'third_party/quic/core/crypto/null_encrypter.cc',
-        'third_party/quic/core/crypto/null_encrypter.h',
-        'third_party/quic/core/crypto/p256_key_exchange.cc',
-        'third_party/quic/core/crypto/p256_key_exchange.h',
-        'third_party/quic/core/crypto/proof_source.cc',
-        'third_party/quic/core/crypto/proof_source.h',
-        'third_party/quic/core/crypto/proof_verifier.h',
-        'third_party/quic/core/crypto/quic_compressed_certs_cache.cc',
-        'third_party/quic/core/crypto/quic_compressed_certs_cache.h',
-        'third_party/quic/core/crypto/quic_crypter.h',
-        'third_party/quic/core/crypto/quic_crypto_client_config.cc',
-        'third_party/quic/core/crypto/quic_crypto_client_config.h',
-        'third_party/quic/core/crypto/quic_crypto_proof.cc',
-        'third_party/quic/core/crypto/quic_crypto_proof.h',
-        'third_party/quic/core/crypto/quic_crypto_server_config.cc',
-        'third_party/quic/core/crypto/quic_crypto_server_config.h',
-        'third_party/quic/core/crypto/quic_decrypter.cc',
-        'third_party/quic/core/crypto/quic_decrypter.h',
-        'third_party/quic/core/crypto/quic_encrypter.cc',
-        'third_party/quic/core/crypto/quic_encrypter.h',
-        'third_party/quic/core/crypto/quic_hkdf.cc',
-        'third_party/quic/core/crypto/quic_hkdf.h',
-        'third_party/quic/core/crypto/quic_random.cc',
-        'third_party/quic/core/crypto/quic_random.h',
-        'third_party/quic/core/crypto/transport_parameters.cc',
-        'third_party/quic/core/crypto/transport_parameters.h',
-        'third_party/quic/core/frames/quic_ack_frame.cc',
-        'third_party/quic/core/frames/quic_ack_frame.h',
-        'third_party/quic/core/frames/quic_application_close_frame.cc',
-        'third_party/quic/core/frames/quic_application_close_frame.h',
-        'third_party/quic/core/frames/quic_blocked_frame.cc',
-        'third_party/quic/core/frames/quic_blocked_frame.h',
-        'third_party/quic/core/frames/quic_connection_close_frame.cc',
-        'third_party/quic/core/frames/quic_connection_close_frame.h',
-        'third_party/quic/core/frames/quic_crypto_frame.cc',
-        'third_party/quic/core/frames/quic_crypto_frame.h',
-        'third_party/quic/core/frames/quic_frame.cc',
-        'third_party/quic/core/frames/quic_frame.h',
-        'third_party/quic/core/frames/quic_goaway_frame.cc',
-        'third_party/quic/core/frames/quic_goaway_frame.h',
-        'third_party/quic/core/frames/quic_inlined_frame.h',
-        'third_party/quic/core/frames/quic_max_stream_id_frame.cc',
-        'third_party/quic/core/frames/quic_max_stream_id_frame.h',
-        'third_party/quic/core/frames/quic_message_frame.cc',
-        'third_party/quic/core/frames/quic_message_frame.h',
-        'third_party/quic/core/frames/quic_mtu_discovery_frame.h',
-        'third_party/quic/core/frames/quic_new_connection_id_frame.cc',
-        'third_party/quic/core/frames/quic_new_connection_id_frame.h',
-        'third_party/quic/core/frames/quic_new_token_frame.cc',
-        'third_party/quic/core/frames/quic_new_token_frame.h',
-        'third_party/quic/core/frames/quic_padding_frame.cc',
-        'third_party/quic/core/frames/quic_padding_frame.h',
-        'third_party/quic/core/frames/quic_path_challenge_frame.cc',
-        'third_party/quic/core/frames/quic_path_challenge_frame.h',
-        'third_party/quic/core/frames/quic_path_response_frame.cc',
-        'third_party/quic/core/frames/quic_path_response_frame.h',
-        'third_party/quic/core/frames/quic_ping_frame.cc',
-        'third_party/quic/core/frames/quic_ping_frame.h',
-        'third_party/quic/core/frames/quic_retire_connection_id_frame.cc',
-        'third_party/quic/core/frames/quic_retire_connection_id_frame.h',
-        'third_party/quic/core/frames/quic_rst_stream_frame.cc',
-        'third_party/quic/core/frames/quic_rst_stream_frame.h',
-        'third_party/quic/core/frames/quic_stop_sending_frame.cc',
-        'third_party/quic/core/frames/quic_stop_sending_frame.h',
-        'third_party/quic/core/frames/quic_stop_waiting_frame.cc',
-        'third_party/quic/core/frames/quic_stop_waiting_frame.h',
-        'third_party/quic/core/frames/quic_stream_frame.cc',
-        'third_party/quic/core/frames/quic_stream_frame.h',
-        'third_party/quic/core/frames/quic_stream_id_blocked_frame.cc',
-        'third_party/quic/core/frames/quic_stream_id_blocked_frame.h',
-        'third_party/quic/core/frames/quic_window_update_frame.cc',
-        'third_party/quic/core/frames/quic_window_update_frame.h',
-        'third_party/quic/core/http/http_decoder.cc',
-        'third_party/quic/core/http/http_decoder.h',
-        'third_party/quic/core/http/http_encoder.cc',
-        'third_party/quic/core/http/http_encoder.h',
-        'third_party/quic/core/http/http_frames.h',
-        'third_party/quic/core/http/quic_client_promised_info.cc',
-        'third_party/quic/core/http/quic_client_promised_info.h',
-        'third_party/quic/core/http/quic_client_push_promise_index.cc',
-        'third_party/quic/core/http/quic_client_push_promise_index.h',
-        'third_party/quic/core/http/quic_header_list.cc',
-        'third_party/quic/core/http/quic_header_list.h',
-        'third_party/quic/core/http/quic_headers_stream.cc',
-        'third_party/quic/core/http/quic_headers_stream.h',
-        'third_party/quic/core/http/quic_server_session_base.cc',
-        'third_party/quic/core/http/quic_server_session_base.h',
-        'third_party/quic/core/http/quic_spdy_client_stream.cc',
-        'third_party/quic/core/http/quic_spdy_client_stream.h',
-        'third_party/quic/core/http/quic_spdy_client_session.cc',
-        'third_party/quic/core/http/quic_spdy_client_session.h',
-        'third_party/quic/core/http/quic_spdy_client_session_base.cc',
-        'third_party/quic/core/http/quic_spdy_client_session_base.h',
-        'third_party/quic/core/http/quic_spdy_session.cc',
-        'third_party/quic/core/http/quic_spdy_session.h',
-        'third_party/quic/core/http/quic_spdy_stream.cc',
-        'third_party/quic/core/http/quic_spdy_stream.h',
-        'third_party/quic/core/http/quic_spdy_stream_body_buffer.cc',
-        'third_party/quic/core/http/quic_spdy_stream_body_buffer.h',
-        'third_party/quic/core/http/spdy_utils.cc',
-        'third_party/quic/core/http/spdy_utils.h',
-        'third_party/quic/core/legacy_quic_stream_id_manager.cc',
-        'third_party/quic/core/legacy_quic_stream_id_manager.h',
-        'third_party/quic/core/packet_number_indexed_queue.h',
-        'third_party/quic/core/qpack/qpack_constants.cc',
-        'third_party/quic/core/qpack/qpack_constants.h',
-        'third_party/quic/core/qpack/qpack_decoded_headers_accumulator.cc',
-        'third_party/quic/core/qpack/qpack_decoded_headers_accumulator.h',
-        'third_party/quic/core/qpack/qpack_decoder.cc',
-        'third_party/quic/core/qpack/qpack_decoder.h',
-        'third_party/quic/core/qpack/qpack_decoder_stream_receiver.cc',
-        'third_party/quic/core/qpack/qpack_decoder_stream_receiver.h',
-        'third_party/quic/core/qpack/qpack_decoder_stream_sender.cc',
-        'third_party/quic/core/qpack/qpack_decoder_stream_sender.h',
-        'third_party/quic/core/qpack/qpack_encoder.cc',
-        'third_party/quic/core/qpack/qpack_encoder.h',
-        'third_party/quic/core/qpack/qpack_encoder_stream_receiver.cc',
-        'third_party/quic/core/qpack/qpack_encoder_stream_receiver.h',
-        'third_party/quic/core/qpack/qpack_encoder_stream_sender.cc',
-        'third_party/quic/core/qpack/qpack_encoder_stream_sender.h',
-        'third_party/quic/core/qpack/qpack_header_table.cc',
-        'third_party/quic/core/qpack/qpack_header_table.h',
-        'third_party/quic/core/qpack/qpack_instruction_decoder.cc',
-        'third_party/quic/core/qpack/qpack_instruction_decoder.h',
-        'third_party/quic/core/qpack/qpack_instruction_encoder.cc',
-        'third_party/quic/core/qpack/qpack_instruction_encoder.h',
-        'third_party/quic/core/qpack/qpack_progressive_decoder.cc',
-        'third_party/quic/core/qpack/qpack_progressive_decoder.h',
-        'third_party/quic/core/qpack/qpack_progressive_encoder.cc',
-        'third_party/quic/core/qpack/qpack_progressive_encoder.h',
-        'third_party/quic/core/qpack/qpack_static_table.cc',
-        'third_party/quic/core/qpack/qpack_static_table.h',
-        'third_party/quic/core/quic_ack_listener_interface.cc',
-        'third_party/quic/core/quic_ack_listener_interface.h',
-        'third_party/quic/core/quic_alarm.cc',
-        'third_party/quic/core/quic_alarm.h',
-        'third_party/quic/core/quic_alarm_factory.h',
-        'third_party/quic/core/quic_arena_scoped_ptr.h',
-        'third_party/quic/core/quic_bandwidth.cc',
-        'third_party/quic/core/quic_bandwidth.h',
-        'third_party/quic/core/quic_blocked_writer_interface.h',
-        'third_party/quic/core/quic_buffer_allocator.cc',
-        'third_party/quic/core/quic_buffer_allocator.h',
-        'third_party/quic/core/quic_buffered_packet_store.cc',
-        'third_party/quic/core/quic_buffered_packet_store.h',
-        'third_party/quic/core/quic_config.cc',
-        'third_party/quic/core/quic_config.h',
-        'third_party/quic/core/quic_connection.cc',
-        'third_party/quic/core/quic_connection.h',
-        'third_party/quic/core/quic_connection_close_delegate_interface.h',
-        'third_party/quic/core/quic_connection_id.cc',
-        'third_party/quic/core/quic_connection_id.h',
-        'third_party/quic/core/quic_connection_stats.cc',
-        'third_party/quic/core/quic_connection_stats.h',
-        'third_party/quic/core/quic_constants.cc',
-        'third_party/quic/core/quic_constants.h',
-        'third_party/quic/core/quic_control_frame_manager.cc',
-        'third_party/quic/core/quic_control_frame_manager.h',
-        'third_party/quic/core/quic_crypto_client_handshaker.cc',
-        'third_party/quic/core/quic_crypto_client_handshaker.h',
-        'third_party/quic/core/quic_crypto_client_stream.cc',
-        'third_party/quic/core/quic_crypto_client_stream.h',
-        'third_party/quic/core/quic_crypto_handshaker.cc',
-        'third_party/quic/core/quic_crypto_handshaker.h',
-        'third_party/quic/core/quic_crypto_server_handshaker.cc',
-        'third_party/quic/core/quic_crypto_server_handshaker.h',
-        'third_party/quic/core/quic_crypto_server_stream.cc',
-        'third_party/quic/core/quic_crypto_server_stream.h',
-        'third_party/quic/core/quic_crypto_stream.cc',
-        'third_party/quic/core/quic_crypto_stream.h',
-        'third_party/quic/core/quic_data_reader.cc',
-        'third_party/quic/core/quic_data_reader.h',
-        'third_party/quic/core/quic_data_writer.cc',
-        'third_party/quic/core/quic_data_writer.h',
-        'third_party/quic/core/quic_flow_controller.cc',
-        'third_party/quic/core/quic_flow_controller.h',
-        'third_party/quic/core/quic_framer.cc',
-        'third_party/quic/core/quic_framer.h',
-        'third_party/quic/core/quic_interval.h',
-        'third_party/quic/core/quic_interval_set.h',
-        'third_party/quic/core/quic_lru_cache.h',
-        'third_party/quic/core/quic_one_block_arena.h',
-        'third_party/quic/core/quic_packet_creator.cc',
-        'third_party/quic/core/quic_packet_creator.h',
-        'third_party/quic/core/quic_packet_generator.cc',
-        'third_party/quic/core/quic_packet_generator.h',
-        'third_party/quic/core/quic_packet_number.cc',
-        'third_party/quic/core/quic_packet_number.h',
-        'third_party/quic/core/quic_packet_writer.h',
-        'third_party/quic/core/quic_packets.cc',
-        'third_party/quic/core/quic_packets.h',
-        'third_party/quic/core/quic_pending_retransmission.h',
-        'third_party/quic/core/quic_received_packet_manager.cc',
-        'third_party/quic/core/quic_received_packet_manager.h',
-        'third_party/quic/core/quic_sent_packet_manager.cc',
-        'third_party/quic/core/quic_sent_packet_manager.h',
-        'third_party/quic/core/quic_server_id.cc',
-        'third_party/quic/core/quic_server_id.h',
-        'third_party/quic/core/quic_session.cc',
-        'third_party/quic/core/quic_session.h',
-        'third_party/quic/core/quic_simple_buffer_allocator.cc',
-        'third_party/quic/core/quic_simple_buffer_allocator.h',
-        'third_party/quic/core/quic_socket_address_coder.cc',
-        'third_party/quic/core/quic_socket_address_coder.h',
-        'third_party/quic/core/quic_stream.cc',
-        'third_party/quic/core/quic_stream.h',
-        'third_party/quic/core/quic_stream_frame_data_producer.h',
-        'third_party/quic/core/quic_stream_id_manager.cc',
-        'third_party/quic/core/quic_stream_id_manager.h',
-        'third_party/quic/core/quic_stream_send_buffer.cc',
-        'third_party/quic/core/quic_stream_send_buffer.h',
-        'third_party/quic/core/quic_stream_sequencer.cc',
-        'third_party/quic/core/quic_stream_sequencer.h',
-        'third_party/quic/core/quic_stream_sequencer_buffer.cc',
-        'third_party/quic/core/quic_stream_sequencer_buffer.h',
-        'third_party/quic/core/quic_sustained_bandwidth_recorder.cc',
-        'third_party/quic/core/quic_sustained_bandwidth_recorder.h',
-        'third_party/quic/core/quic_tag.cc',
-        'third_party/quic/core/quic_tag.h',
-        'third_party/quic/core/quic_time.cc',
-        'third_party/quic/core/quic_time.h',
-        'third_party/quic/core/quic_transmission_info.cc',
-        'third_party/quic/core/quic_transmission_info.h',
-        'third_party/quic/core/quic_types.cc',
-        'third_party/quic/core/quic_types.h',
-        'third_party/quic/core/quic_unacked_packet_map.cc',
-        'third_party/quic/core/quic_unacked_packet_map.h',
-        'third_party/quic/core/quic_utils.cc',
-        'third_party/quic/core/quic_utils.h',
-        'third_party/quic/core/quic_version_manager.cc',
-        'third_party/quic/core/quic_version_manager.h',
-        'third_party/quic/core/quic_versions.cc',
-        'third_party/quic/core/quic_versions.h',
-        'third_party/quic/core/quic_write_blocked_list.cc',
-        'third_party/quic/core/quic_write_blocked_list.h',
-        'third_party/quic/core/tls_client_handshaker.cc',
-        'third_party/quic/core/tls_client_handshaker.h',
-        'third_party/quic/core/tls_handshaker.cc',
-        'third_party/quic/core/tls_handshaker.h',
-        'third_party/quic/core/tls_server_handshaker.cc',
-        'third_party/quic/core/tls_server_handshaker.h',
-        'third_party/quic/core/uber_quic_stream_id_manager.cc',
-        'third_party/quic/core/uber_quic_stream_id_manager.h',
-        'third_party/quic/platform/api/quic_aligned.h',
-        'third_party/quic/platform/api/quic_arraysize.h',
-        'third_party/quic/platform/api/quic_bug_tracker.h',
-        'third_party/quic/platform/api/quic_cert_utils.h',
-        'third_party/quic/platform/api/quic_client_stats.h',
-        'third_party/quic/platform/api/quic_clock.cc',
-        'third_party/quic/platform/api/quic_clock.h',
-        'third_party/quic/platform/api/quic_containers.h',
-        'third_party/quic/platform/api/quic_endian.h',
-        'third_party/quic/platform/api/quic_error_code_wrappers.h',
-        'third_party/quic/platform/api/quic_estimate_memory_usage.h',
-        'third_party/quic/platform/api/quic_export.h',
-        'third_party/quic/platform/api/quic_exported_stats.h',
-        'third_party/quic/platform/api/quic_fallthrough.h',
-        'third_party/quic/platform/api/quic_file_utils.cc',
-        'third_party/quic/platform/api/quic_file_utils.h',
-        'third_party/quic/platform/api/quic_flag_utils.h',
-        'third_party/quic/platform/api/quic_flags.h',
-        'third_party/quic/platform/api/quic_hostname_utils.cc',
-        'third_party/quic/platform/api/quic_hostname_utils.h',
-        'third_party/quic/platform/api/quic_iovec.h',
-        'third_party/quic/platform/api/quic_ip_address.cc',
-        'third_party/quic/platform/api/quic_ip_address.h',
-        'third_party/quic/platform/api/quic_ip_address_family.h',
-        'third_party/quic/platform/api/quic_logging.h',
-        'third_party/quic/platform/api/quic_macros.h',
-        'third_party/quic/platform/api/quic_map_util.h',
-        'third_party/quic/platform/api/quic_mem_slice.h',
-        'third_party/quic/platform/api/quic_mem_slice_span.h',
-        'third_party/quic/platform/api/quic_mem_slice_storage.h',
-        'third_party/quic/platform/api/quic_mutex.cc',
-        'third_party/quic/platform/api/quic_mutex.h',
-        'third_party/quic/platform/api/quic_pcc_sender.h',
-        'third_party/quic/platform/api/quic_prefetch.h',
-        'third_party/quic/platform/api/quic_ptr_util.h',
-        'third_party/quic/platform/api/quic_reference_counted.h',
-        'third_party/quic/platform/api/quic_server_stats.h',
-        'third_party/quic/platform/api/quic_singleton.h',
-        'third_party/quic/platform/api/quic_sleep.h',
-        'third_party/quic/platform/api/quic_socket_address.cc',
-        'third_party/quic/platform/api/quic_socket_address.h',
-        'third_party/quic/platform/api/quic_stack_trace.h',
-        'third_party/quic/platform/api/quic_str_cat.h',
-        'third_party/quic/platform/api/quic_string.h',
-        'third_party/quic/platform/api/quic_string_piece.h',
-        'third_party/quic/platform/api/quic_text_utils.h',
-        'third_party/quic/platform/impl/quic_aligned_impl.h',
-        'third_party/quic/platform/impl/quic_arraysize_impl.h',
-        'third_party/quic/platform/impl/quic_bug_tracker_impl.h',
-        'third_party/quic/platform/impl/quic_cert_utils_impl.h',
-        'third_party/quic/platform/impl/quic_chromium_clock.cc',
-        'third_party/quic/platform/impl/quic_chromium_clock.h',
-        'third_party/quic/platform/impl/quic_client_stats_impl.h',
-        'third_party/quic/platform/impl/quic_containers_impl.h',
-        'third_party/quic/platform/impl/quic_endian_impl.h',
-        'third_party/quic/platform/impl/quic_error_code_wrappers_impl.h',
-        'third_party/quic/platform/impl/quic_estimate_memory_usage_impl.h',
-        'third_party/quic/platform/impl/quic_export_impl.h',
-        'third_party/quic/platform/impl/quic_fallthrough_impl.h',
-        'third_party/quic/platform/impl/quic_file_utils_impl.h',
-        'third_party/quic/platform/impl/quic_flag_utils_impl.h',
-        'third_party/quic/platform/impl/quic_flags_impl.cc',
-        'third_party/quic/platform/impl/quic_flags_impl.h',
-        'third_party/quic/platform/impl/quic_hostname_utils_impl.cc',
-        'third_party/quic/platform/impl/quic_hostname_utils_impl.h',
-        'third_party/quic/platform/impl/quic_iovec_impl.h',
-        'third_party/quic/platform/impl/quic_ip_address_impl.cc',
-        'third_party/quic/platform/impl/quic_ip_address_impl.h',
-        'third_party/quic/platform/impl/quic_logging_impl.h',
-        'third_party/quic/platform/impl/quic_macros_impl.h',
-        'third_party/quic/platform/impl/quic_map_util_impl.h',
-        'third_party/quic/platform/impl/quic_mem_slice_impl.cc',
-        'third_party/quic/platform/impl/quic_mem_slice_impl.h',
-        'third_party/quic/platform/impl/quic_mem_slice_span_impl.cc',
-        'third_party/quic/platform/impl/quic_mem_slice_span_impl.h',
-        'third_party/quic/platform/impl/quic_mem_slice_storage_impl.cc',
-        'third_party/quic/platform/impl/quic_mem_slice_storage_impl.h',
-        'third_party/quic/platform/impl/quic_mutex_impl.cc',
-        'third_party/quic/platform/impl/quic_mutex_impl.h',
-        'third_party/quic/platform/impl/quic_pcc_sender_impl.h',
-        'third_party/quic/platform/impl/quic_prefetch_impl.h',
-        'third_party/quic/platform/impl/quic_ptr_util_impl.h',
-        'third_party/quic/platform/impl/quic_reference_counted_impl.h',
-        'third_party/quic/platform/impl/quic_server_stats_impl.h',
-        'third_party/quic/platform/impl/quic_singleton_impl.h',
-        'third_party/quic/platform/impl/quic_sleep_impl.h',
-        'third_party/quic/platform/impl/quic_socket_address_impl.cc',
-        'third_party/quic/platform/impl/quic_socket_address_impl.h',
-        'third_party/quic/platform/impl/quic_stack_trace_impl.h',
-        'third_party/quic/platform/impl/quic_str_cat_impl.h',
-        'third_party/quic/platform/impl/quic_string_impl.h',
-        'third_party/quic/platform/impl/quic_string_piece_impl.h',
-        'third_party/quic/platform/impl/quic_text_utils_impl.h',
-        'third_party/quiche/src/http2/decoder/decode_buffer.cc',
-        'third_party/quiche/src/http2/decoder/decode_buffer.h',
-        'third_party/quiche/src/http2/decoder/decode_http2_structures.cc',
-        'third_party/quiche/src/http2/decoder/decode_http2_structures.h',
-        'third_party/quiche/src/http2/decoder/decode_status.cc',
-        'third_party/quiche/src/http2/decoder/decode_status.h',
-        'third_party/quiche/src/http2/decoder/frame_decoder_state.cc',
-        'third_party/quiche/src/http2/decoder/frame_decoder_state.h',
-        'third_party/quiche/src/http2/decoder/http2_frame_decoder.cc',
-        'third_party/quiche/src/http2/decoder/http2_frame_decoder.h',
-        'third_party/quiche/src/http2/decoder/http2_frame_decoder_listener.cc',
-        'third_party/quiche/src/http2/decoder/http2_frame_decoder_listener.h',
-        'third_party/quiche/src/http2/decoder/http2_structure_decoder.cc',
-        'third_party/quiche/src/http2/decoder/http2_structure_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/altsvc_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/altsvc_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/continuation_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/continuation_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/data_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/data_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/goaway_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/goaway_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/headers_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/headers_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/ping_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/ping_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/priority_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/priority_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/push_promise_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/push_promise_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/rst_stream_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/rst_stream_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/settings_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/settings_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/unknown_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/unknown_payload_decoder.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/window_update_payload_decoder.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/window_update_payload_decoder.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_block_decoder.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_block_decoder.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_listener.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_listener.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_state.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_state.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_string_buffer.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_string_buffer.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_tables.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_tables.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_decoder.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_decoder.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_decoder_listener.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_decoder_listener.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_type_decoder.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_type_decoder.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_string_decoder.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_string_decoder.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_string_decoder_listener.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_string_decoder_listener.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_whole_entry_buffer.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_whole_entry_buffer.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_whole_entry_listener.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_whole_entry_listener.h',
-        'third_party/quiche/src/http2/hpack/hpack_static_table_entries.inc',
-        'third_party/quiche/src/http2/hpack/hpack_string.cc',
-        'third_party/quiche/src/http2/hpack/hpack_string.h',
-        'third_party/quiche/src/http2/hpack/http2_hpack_constants.cc',
-        'third_party/quiche/src/http2/hpack/http2_hpack_constants.h',
-        'third_party/quiche/src/http2/hpack/huffman/hpack_huffman_decoder.cc',
-        'third_party/quiche/src/http2/hpack/huffman/hpack_huffman_decoder.h',
-        'third_party/quiche/src/http2/hpack/huffman/hpack_huffman_encoder.cc',
-        'third_party/quiche/src/http2/hpack/huffman/hpack_huffman_encoder.h',
-        'third_party/quiche/src/http2/hpack/huffman/huffman_spec_tables.cc',
-        'third_party/quiche/src/http2/hpack/huffman/huffman_spec_tables.h',
-        'third_party/quiche/src/http2/hpack/varint/hpack_varint_decoder.cc',
-        'third_party/quiche/src/http2/hpack/varint/hpack_varint_decoder.h',
-        'third_party/quiche/src/http2/hpack/varint/hpack_varint_encoder.cc',
-        'third_party/quiche/src/http2/hpack/varint/hpack_varint_encoder.h',
-        'third_party/quiche/src/http2/http2_constants.cc',
-        'third_party/quiche/src/http2/http2_constants.h',
-        'third_party/quiche/src/http2/http2_structures.cc',
-        'third_party/quiche/src/http2/http2_structures.h',
-        'third_party/quiche/src/http2/platform/api/http2_arraysize.h',
-        'third_party/quiche/src/http2/platform/api/http2_bug_tracker.h',
-        'third_party/quiche/src/http2/platform/api/http2_export.h',
-        'third_party/quiche/src/http2/platform/api/http2_flag_utils.h',
-        'third_party/quiche/src/http2/platform/api/http2_flags.h',
-        'third_party/quiche/src/http2/platform/api/http2_optional.h',
-        'third_party/quiche/src/http2/platform/api/http2_ptr_util.h',
-        'third_party/quiche/src/http2/platform/api/http2_reconstruct_object.h',
-        'third_party/quiche/src/http2/platform/api/http2_string.h',
-        'third_party/quiche/src/http2/platform/api/http2_string_piece.h',
-        'third_party/quiche/src/http2/platform/api/http2_string_utils.h',
-        'third_party/quiche/src/spdy/core/hpack/hpack_constants.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_constants.h',
-        'third_party/quiche/src/spdy/core/hpack/hpack_decoder_adapter.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_decoder_adapter.h',
-        'third_party/quiche/src/spdy/core/hpack/hpack_encoder.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_encoder.h',
-        'third_party/quiche/src/spdy/core/hpack/hpack_entry.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_entry.h',
-        'third_party/quiche/src/spdy/core/hpack/hpack_header_table.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_header_table.h',
-        'third_party/quiche/src/spdy/core/hpack/hpack_huffman_table.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_huffman_table.h',
-        'third_party/quiche/src/spdy/core/hpack/hpack_output_stream.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_output_stream.h',
-        'third_party/quiche/src/spdy/core/hpack/hpack_static_table.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_static_table.h',
-        'third_party/quiche/src/spdy/core/http2_frame_decoder_adapter.cc',
-        'third_party/quiche/src/spdy/core/http2_frame_decoder_adapter.h',
-        'third_party/quiche/src/spdy/core/priority_write_scheduler.h',
-        'third_party/quiche/src/spdy/core/spdy_alt_svc_wire_format.cc',
-        'third_party/quiche/src/spdy/core/spdy_alt_svc_wire_format.h',
-        'third_party/quiche/src/spdy/core/spdy_bitmasks.h',
-        'third_party/quiche/src/spdy/core/spdy_frame_builder.cc',
-        'third_party/quiche/src/spdy/core/spdy_frame_builder.h',
-        'third_party/quiche/src/spdy/core/spdy_frame_reader.cc',
-        'third_party/quiche/src/spdy/core/spdy_frame_reader.h',
-        'third_party/quiche/src/spdy/core/spdy_framer.cc',
-        'third_party/quiche/src/spdy/core/spdy_framer.h',
-        'third_party/quiche/src/spdy/core/spdy_header_block.cc',
-        'third_party/quiche/src/spdy/core/spdy_header_block.h',
-        'third_party/quiche/src/spdy/core/spdy_headers_handler_interface.h',
-        'third_party/quiche/src/spdy/core/spdy_pinnable_buffer_piece.cc',
-        'third_party/quiche/src/spdy/core/spdy_pinnable_buffer_piece.h',
-        'third_party/quiche/src/spdy/core/spdy_prefixed_buffer_reader.cc',
-        'third_party/quiche/src/spdy/core/spdy_prefixed_buffer_reader.h',
-        'third_party/quiche/src/spdy/core/spdy_protocol.cc',
-        'third_party/quiche/src/spdy/core/spdy_protocol.h',
-        'third_party/quiche/src/spdy/core/write_scheduler.h',
-        'third_party/quiche/src/spdy/core/zero_copy_output_buffer.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_arraysize.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_bug_tracker.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_containers.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_endianness_util.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_estimate_memory_usage.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_export.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_flags.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_macros.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_mem_slice.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_ptr_util.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_string.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_string_piece.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_string_utils.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_test_utils_prod.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_unsafe_arena.h',
-        'url_request/data_protocol_handler.cc',
-        'url_request/data_protocol_handler.h',
-        'url_request/http_user_agent_settings.h',
-        'url_request/redirect_info.cc',
-        'url_request/redirect_info.h',
-        'url_request/redirect_util.cc',
-        'url_request/redirect_util.h',
-        'url_request/report_sender.cc',
-        'url_request/report_sender.h',
-        'url_request/static_http_user_agent_settings.cc',
-        'url_request/static_http_user_agent_settings.h',
-        'url_request/url_fetcher.cc',
-        'url_request/url_fetcher.h',
-        'url_request/url_fetcher_core.cc',
-        'url_request/url_fetcher_core.h',
-        'url_request/url_fetcher_delegate.cc',
-        'url_request/url_fetcher_delegate.h',
-        'url_request/url_fetcher_factory.h',
-        'url_request/url_fetcher_impl.cc',
-        'url_request/url_fetcher_impl.h',
-        'url_request/url_fetcher_response_writer.cc',
-        'url_request/url_fetcher_response_writer.h',
-        'url_request/url_range_request_job.cc',
-        'url_request/url_range_request_job.h',
-        'url_request/url_request.cc',
-        'url_request/url_request.h',
-        'url_request/url_request_context.cc',
-        'url_request/url_request_context.h',
-        'url_request/url_request_context_builder.cc',
-        'url_request/url_request_context_builder.h',
-        'url_request/url_request_context_getter.cc',
-        'url_request/url_request_context_getter.h',
-        'url_request/url_request_context_getter_observer.h',
-        'url_request/url_request_context_storage.cc',
-        'url_request/url_request_context_storage.h',
-        'url_request/url_request_data_job.cc',
-        'url_request/url_request_data_job.h',
-        'url_request/url_request_error_job.cc',
-        'url_request/url_request_error_job.h',
-        'url_request/url_request_filter.cc',
-        'url_request/url_request_filter.h',
-        'url_request/url_request_http_job.cc',
-        'url_request/url_request_http_job.h',
-        'url_request/url_request_http_job_histogram.h',
-        'url_request/url_request_intercepting_job_factory.cc',
-        'url_request/url_request_intercepting_job_factory.h',
-        'url_request/url_request_interceptor.cc',
-        'url_request/url_request_interceptor.h',
-        'url_request/url_request_job.cc',
-        'url_request/url_request_job.h',
-        'url_request/url_request_job_factory.cc',
-        'url_request/url_request_job_factory.h',
-        'url_request/url_request_job_factory_impl.cc',
-        'url_request/url_request_job_factory_impl.h',
-        'url_request/url_request_job_manager.cc',
-        'url_request/url_request_job_manager.h',
-        'url_request/url_request_netlog_params.cc',
-        'url_request/url_request_netlog_params.h',
-        'url_request/url_request_redirect_job.cc',
-        'url_request/url_request_redirect_job.h',
-        'url_request/url_request_simple_job.cc',
-        'url_request/url_request_simple_job.h',
-        'url_request/url_request_status.cc',
-        'url_request/url_request_status.h',
-        'url_request/url_request_throttler_entry.cc',
-        'url_request/url_request_throttler_entry.h',
-        'url_request/url_request_throttler_entry_interface.h',
-        'url_request/url_request_throttler_manager.cc',
-        'url_request/url_request_throttler_manager.h',
-        # 'url_request/view_cache_helper.cc',
-        # 'url_request/view_cache_helper.h',
-        'url_request/websocket_handshake_userdata_key.cc',
-        'url_request/websocket_handshake_userdata_key.h',
-
-        # Add the websockets source files as well.
-        'websockets/websocket_basic_handshake_stream.cc',
-        'websockets/websocket_basic_handshake_stream.h',
-        'websockets/websocket_basic_stream.cc',
-        'websockets/websocket_basic_stream.h',
-        'websockets/websocket_basic_stream_adapters.cc',
-        'websockets/websocket_basic_stream_adapters.h',
-        'websockets/websocket_channel.cc',
-        'websockets/websocket_channel.h',
-        'websockets/websocket_deflate_parameters.cc',
-        'websockets/websocket_deflate_parameters.h',
-        'websockets/websocket_deflate_predictor.h',
-        'websockets/websocket_deflate_predictor_impl.cc',
-        'websockets/websocket_deflate_predictor_impl.h',
-        'websockets/websocket_deflate_stream.cc',
-        'websockets/websocket_deflate_stream.h',
-        'websockets/websocket_deflater.cc',
-        'websockets/websocket_deflater.h',
-        'websockets/websocket_errors.cc',
-        'websockets/websocket_errors.h',
-        'websockets/websocket_event_interface.h',
-        'websockets/websocket_extension.cc',
-        'websockets/websocket_extension.h',
-        'websockets/websocket_extension_parser.cc',
-        'websockets/websocket_extension_parser.h',
-        'websockets/websocket_frame.cc',
-        'websockets/websocket_frame.h',
-        'websockets/websocket_frame_parser.cc',
-        'websockets/websocket_frame_parser.h',
-        'websockets/websocket_handshake_challenge.cc',
-        'websockets/websocket_handshake_challenge.h',
-        'websockets/websocket_handshake_constants.cc',
-        'websockets/websocket_handshake_constants.h',
-        'websockets/websocket_handshake_request_info.cc',
-        'websockets/websocket_handshake_request_info.h',
-        'websockets/websocket_handshake_response_info.cc',
-        'websockets/websocket_handshake_response_info.h',
-        'websockets/websocket_handshake_stream_base.cc',
-        'websockets/websocket_handshake_stream_base.h',
-        'websockets/websocket_handshake_stream_create_helper.cc',
-        'websockets/websocket_handshake_stream_create_helper.h',
-        'websockets/websocket_http2_handshake_stream.cc',
-        'websockets/websocket_http2_handshake_stream.h',
-        'websockets/websocket_inflater.cc',
-        'websockets/websocket_inflater.h',
-        'websockets/websocket_stream.cc',
-        'websockets/websocket_stream.h',
-
-        # Add the network reporting source files as well.
-        'network_error_logging/network_error_logging_service.cc',
-        'network_error_logging/network_error_logging_service.h',
-        'reporting/json_parser_delegate.cc',
-        'reporting/json_parser_delegate.h',
-        'reporting/reporting_browsing_data_remover.cc',
-        'reporting/reporting_browsing_data_remover.h',
-        'reporting/reporting_cache.cc',
-        'reporting/reporting_cache.h',
-        'reporting/reporting_client.cc',
-        'reporting/reporting_client.h',
-        'reporting/reporting_context.cc',
-        'reporting/reporting_context.h',
-        'reporting/reporting_delegate.cc',
-        'reporting/reporting_delegate.h',
-        'reporting/reporting_delivery_agent.cc',
-        'reporting/reporting_delivery_agent.h',
-        'reporting/reporting_endpoint_manager.cc',
-        'reporting/reporting_endpoint_manager.h',
-        'reporting/reporting_garbage_collector.cc',
-        'reporting/reporting_garbage_collector.h',
-        'reporting/reporting_header_parser.cc',
-        'reporting/reporting_header_parser.h',
-        'reporting/reporting_network_change_observer.cc',
-        'reporting/reporting_network_change_observer.h',
-        'reporting/reporting_observer.cc',
-        'reporting/reporting_observer.h',
-        'reporting/reporting_policy.cc',
-        'reporting/reporting_policy.h',
-        'reporting/reporting_report.cc',
-        'reporting/reporting_report.h',
-        'reporting/reporting_service.cc',
-        'reporting/reporting_service.h',
-        'reporting/reporting_uploader.cc',
-        'reporting/reporting_uploader.h',
-        'network_error_logging/network_error_logging_delegate.cc',
-        'network_error_logging/network_error_logging_delegate.h',
-      ],
-    },
-
-    {
-      'target_name': 'net_nqe_proto',
-      'type': 'static_library',
-      'hard_dependency': 1,
-
-      'sources': ['nqe/proto/network_id_proto.proto'],
-      'variables': {
-        'cc_generator_options': 'dllexport_decl=NET_EXPORT_PRIVATE:',
-        'cc_include': 'net/base/net_export.h',
-
-        'proto_in_dir': 'nqe/proto',
-        'proto_out_dir': 'net/nqe/proto',
-      },
-      'includes': ['<(DEPTH)/build_gyp/protoc.gypi'],
-    },
-    {
-      'target_name': 'net_quic_proto',
-      'type': 'static_library',
-      'hard_dependency': 1,
-
-      'sources': [
-        'third_party/quic/core/proto/cached_network_parameters.proto',
-        'third_party/quic/core/proto/source_address_token.proto',
-        'third_party/quic/core/proto/crypto_server_config.proto',
-      ],
-      'defines': [
-        'NET_IMPLEMENTATION',
-      ],
-      'variables': {
-        'cc_generator_options': 'dllexport_decl=NET_EXPORT_PRIVATE:',
-        'cc_include': 'net/base/net_export.h',
-
-        'proto_in_dir': 'third_party/quic/core/proto/',
-        'proto_out_dir': 'net/third_party/quic/core/proto/',
-      },
-      'includes': ['<(DEPTH)/build_gyp/protoc.gypi'],
-
-      'all_dependent_settings': {
-        'include_dirs': [
-          '<(DEPTH)/third_party/protobuf/src',
-        ]
-      },
-    },
-
-    {
-      'target_name': 'net_generated_registry_controlled_domains',
-      'type': 'none',
-      'hard_dependency': 1,
-
-      'variables': {
-        'data_dir': '<(DEPTH)/net/base/registry_controlled_domains',
-        'output_dir':
-            '<(SHARED_INTERMEDIATE_DIR)/net/base/registry_controlled_domains',
-        'script_path': '<(DEPTH)/net/tools/dafsa/make_dafsa.py',
-        'gperf_files': [
-          '<(data_dir)/effective_tld_names.gperf',
-          '<(data_dir)/effective_tld_names_unittest1.gperf',
-          '<(data_dir)/effective_tld_names_unittest2.gperf',
-          '<(data_dir)/effective_tld_names_unittest3.gperf',
-          '<(data_dir)/effective_tld_names_unittest4.gperf',
-          '<(data_dir)/effective_tld_names_unittest5.gperf',
-          '<(data_dir)/effective_tld_names_unittest6.gperf',
-        ],
-      },
-      'sources': [
-        '<(script_path)',
-        '<@(gperf_files)',
-      ],
-      'rules': [
-        {
-          'rule_name': 'build_registry_controlled_domains',
-          'extension': 'gperf',
-          'inputs': [
-            '<(data_dir)/<(RULE_INPUT_ROOT).gperf',
-          ],
-          'outputs': [
-            '<(output_dir)/<(RULE_INPUT_ROOT)-inc.cc',
-          ],
-          'action': [
-            'python2',
-            '<(script_path)',
-            '<(data_dir)/<(RULE_INPUT_ROOT).gperf',
-            '<(output_dir)/<(RULE_INPUT_ROOT)-inc.cc',
-          ],
-          'message': 'Build net registry controlled domains data.',
-        },
-      ],
-    },
-
-    {
-      'target_name': 'net_unittests',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'base/address_family_unittest.cc',
-        'base/address_list_unittest.cc',
-        'base/arena_unittest.cc',
-        'base/backoff_entry_serializer_unittest.cc',
-        'base/backoff_entry_unittest.cc',
-        'base/chunked_upload_data_stream_unittest.cc',
-        'base/data_url_unittest.cc',
-        'base/datagram_buffer_unittest.cc',
-        'base/directory_listing_unittest.cc',
-        'base/elements_upload_data_stream_unittest.cc',
-        'base/escape_unittest.cc',
-        'base/expiring_cache_unittest.cc',
-        'base/file_stream_unittest.cc',
-        'base/filename_util_unittest.cc',
-        'base/hex_utils_test.cc',
-        'base/host_mapping_rules_unittest.cc',
-        'base/host_port_pair_unittest.cc',
-        'base/interval_set_test.cc',
-        'base/interval_test.cc',
-        'base/ip_address_unittest.cc',
-        'base/ip_endpoint_unittest.cc',
-        'base/ip_pattern_unittest.cc',
-        'base/layered_network_delegate_unittest.cc',
-        'base/lookup_string_in_fixed_set_unittest.cc',
-        'base/mime_sniffer_unittest.cc',
-        'base/mime_util_unittest.cc',
-        'base/net_string_util_unittest.cc',
-        'base/network_activity_monitor_unittest.cc',
-        'base/network_change_notifier_unittest.cc',
-        'base/parse_number_unittest.cc',
-        'base/port_util_unittest.cc',
-        'base/prioritized_dispatcher_unittest.cc',
-        'base/prioritized_task_runner_unittest.cc',
-        'base/priority_queue_unittest.cc',
-        'base/registry_controlled_domains/registry_controlled_domain_unittest.cc',
-        'base/static_cookie_policy_unittest.cc',
-        'base/test_completion_callback_unittest.cc',
-        'base/upload_bytes_element_reader_unittest.cc',
-        'base/upload_file_element_reader_unittest.cc',
-        'base/url_util_unittest.cc',
-        'cert/caching_cert_verifier_unittest.cc',
-        'cert/cert_verifier_unittest.cc',
-        'cert/cert_verify_proc_unittest.cc',
-        'cert/crl_set_unittest.cc',
-        'cert/ct_log_response_parser_unittest.cc',
-        'cert/ct_log_verifier_unittest.cc',
-        'cert/ct_objects_extractor_unittest.cc',
-        'cert/ct_serialization_unittest.cc',
-        'cert/ev_root_ca_metadata_unittest.cc',
-        'cert/internal/cert_issuer_source_aia_unittest.cc',
-        'cert/internal/cert_issuer_source_static_unittest.cc',
-        'cert/internal/cert_issuer_source_sync_unittest.h',
-        'cert/internal/certificate_policies_unittest.cc',
-        'cert/internal/extended_key_usage_unittest.cc',
-        # 'cert/x509_util_nss_unittest.cc',
-        'cert/internal/general_names_unittest.cc',
-        'cert/internal/name_constraints_unittest.cc',
-        'cert/internal/nist_pkits_unittest.cc',
-        'cert/internal/nist_pkits_unittest.h',
-        'cert/internal/ocsp_unittest.cc',
-        'cert/internal/parse_certificate_unittest.cc',
-        # <certt.h> not found.
-        # 'cert_net/nss_ocsp_unittest.cc',
-        'cert/internal/parse_name_unittest.cc',
-        'cert/internal/parsed_certificate_unittest.cc',
-        # <cert.h> not found.
-        # 'cert/nss_cert_database_unittest.cc',
-        'cert/internal/path_builder_pkits_unittest.cc',
-        'cert/internal/path_builder_unittest.cc',
-        'cert/internal/path_builder_verify_certificate_chain_unittest.cc',
-        'cert/internal/revocation_checker_unittest.cc',
-        'cert/internal/signature_algorithm_unittest.cc',
-        'cert/internal/simple_path_builder_delegate_unittest.cc',
-        'cert/internal/test_helpers.cc',
-        'cert/internal/test_helpers.h',
-        'cert/internal/trust_store_collection_unittest.cc',
-        # 'cert/internal/trust_store_nss_unittest.cc',
-        'cert/internal/verify_certificate_chain_pkits_unittest.cc',
-        'cert/internal/verify_certificate_chain_typed_unittest.h',
-        'cert/internal/verify_certificate_chain_unittest.cc',
-        'cert/internal/verify_name_match_unittest.cc',
-        'cert/internal/verify_signed_data_unittest.cc',
-        'cert/jwk_serializer_unittest.cc',
-        'cert/known_roots_unittest.cc',
-        'cert/merkle_audit_proof_unittest.cc',
-        'cert/merkle_tree_leaf_unittest.cc',
-        'cert/multi_threaded_cert_verifier_unittest.cc',
-        'cert/pem_tokenizer_unittest.cc',
-        'cert/signed_certificate_timestamp_unittest.cc',
-        'cert/symantec_certs_unittest.cc',
-        'cert/test_root_certs_unittest.cc',
-        'cert/x509_cert_types_unittest.cc',
-        'cert/x509_certificate_unittest.cc',
-        'cert/x509_util_unittest.cc',
-        'cert_net/cert_net_fetcher_impl_unittest.cc',
-        'dns/dns_config_service_unittest.cc',
-        'dns/dns_config_service_win_unittest.cc',
-        'dns/dns_hosts_unittest.cc',
-        'dns/dns_query_unittest.cc',
-        'dns/dns_response_unittest.cc',
-        'dns/dns_session_unittest.cc',
-        'dns/dns_socket_pool_unittest.cc',
-        'dns/dns_transaction_unittest.cc',
-        'dns/dns_util_unittest.cc',
-        'dns/host_cache_unittest.cc',
-        'dns/host_resolver_impl_unittest.cc',
-        'dns/mapped_host_resolver_unittest.cc',
-        'dns/record_parsed_unittest.cc',
-        'dns/record_rdata_unittest.cc',
-        'dns/serial_worker_unittest.cc',
-        'cookies/canonical_cookie_unittest.cc',
-        'cookies/cookie_constants_unittest.cc',
-        'cookies/cookie_monster_unittest.cc',
-        'cookies/cookie_deletion_info_unittest.cc',
-        'cookies/cookie_util_unittest.cc',
-        'cookies/parsed_cookie_unittest.cc',
-        'der/encode_values_unittest.cc',
-        'der/input_unittest.cc',
-        'der/parse_values_unittest.cc',
-        'der/parser_unittest.cc',
-
-        # dial is a legacy component we kept from old Chromium net.
-        'dial/dial_http_server_unittest.cc',
-        'dial/dial_service_unittest.cc',
-        'dial/dial_test_helpers.h',
-        'dial/dial_udp_server_unittests.cc',
-
-        # disk_cache component is disabled because only http cache depends on
-        # it and Cobalt does not support http cache yet.
-        # 'disk_cache/backend_cleanup_tracker_unittest.cc',
-        # 'disk_cache/backend_unittest.cc',
-        # 'disk_cache/blockfile/addr_unittest.cc',
-        # 'disk_cache/blockfile/bitmap_unittest.cc',
-        # 'disk_cache/blockfile/block_files_unittest.cc',
-        # 'disk_cache/blockfile/mapped_file_unittest.cc',
-        # 'disk_cache/blockfile/stats_unittest.cc',
-        # 'disk_cache/blockfile/storage_block_unittest.cc',
-        # 'disk_cache/cache_util_unittest.cc',
-        # 'disk_cache/entry_unittest.cc',
-        # 'disk_cache/simple/simple_file_tracker_unittest.cc',
-        # 'disk_cache/simple/simple_index_file_unittest.cc',
-        # 'disk_cache/simple/simple_index_unittest.cc',
-        # 'disk_cache/simple/simple_test_util.cc',
-        # 'disk_cache/simple/simple_test_util.h',
-        # 'disk_cache/simple/simple_util_unittest.cc',
-        # 'disk_cache/simple/simple_version_upgrade_unittest.cc',
-
-        # # Cobalt probably don't need these.
-        # # 'extras/sqlite/sqlite_channel_id_store_unittest.cc',
-        # # 'extras/sqlite/sqlite_persistent_cookie_store_unittest.cc',
-
-        'filter/brotli_source_stream_unittest.cc',
-        'filter/filter_source_stream_unittest.cc',
-        'filter/gzip_source_stream_unittest.cc',
-
-        # Cobalt does not support ftp.
-        # 'ftp/ftp_auth_cache_unittest.cc',
-        # 'ftp/ftp_ctrl_response_buffer_unittest.cc',
-        # 'ftp/ftp_directory_listing_parser_ls_unittest.cc',
-        # 'ftp/ftp_directory_listing_parser_unittest.cc',
-        # 'ftp/ftp_directory_listing_parser_unittest.h',
-        # 'ftp/ftp_directory_listing_parser_vms_unittest.cc',
-        # 'ftp/ftp_directory_listing_parser_windows_unittest.cc',
-        # 'ftp/ftp_network_transaction_unittest.cc',
-        # 'ftp/ftp_util_unittest.cc',
-
-        'http/bidirectional_stream_unittest.cc',
-        'http/broken_alternative_services_unittest.cc',
-        'http/http_auth_cache_unittest.cc',
-        'http/http_auth_challenge_tokenizer_unittest.cc',
-        'http/http_auth_controller_unittest.cc',
-        'http/http_auth_filter_unittest.cc',
-        'http/http_auth_handler_basic_unittest.cc',
-        'http/http_auth_handler_digest_unittest.cc',
-        'http/http_auth_handler_factory_unittest.cc',
-        'http/http_auth_handler_mock.cc',
-        'http/http_auth_handler_mock.h',
-        # Cobalt does not support Kerberos(gssapi) yet.
-        # 'http/http_auth_handler_negotiate_unittest.cc',
-        'http/http_auth_handler_ntlm_portable_unittest.cc',
-        'http/http_auth_handler_unittest.cc',
-        'http/http_auth_multi_round_parse_unittest.cc',
-        'http/http_auth_preferences_unittest.cc',
-        'http/http_auth_sspi_win_unittest.cc',
-        'http/http_auth_unittest.cc',
-        'http/http_basic_state_unittest.cc',
-        'http/http_byte_range_unittest.cc',
-        # 'http/http_cache_lookup_manager_unittest.cc',
-        # 'http/http_cache_unittest.cc',
-        # 'http/http_cache_writers_unittest.cc',
-        # 'url_request/view_cache_helper_unittest.cc',
-        'http/http_chunked_decoder_unittest.cc',
-
-        # Known ICU issue.
-        # 'http/http_content_disposition_unittest.cc',
-        'http/http_log_util_unittest.cc',
-        'http/http_network_layer_unittest.cc',
-        'http/http_network_transaction_ssl_unittest.cc',
-        'http/http_network_transaction_unittest.cc',
-        'http/http_proxy_client_socket_pool_unittest.cc',
-        'http/http_proxy_client_socket_unittest.cc',
-        'http/http_proxy_client_socket_wrapper_unittest.cc',
-        'http/http_request_headers_unittest.cc',
-        'http/http_response_body_drainer_unittest.cc',
-        'http/http_response_headers_unittest.cc',
-        'http/http_response_info_unittest.cc',
-        'http/http_security_headers_unittest.cc',
-        'http/http_server_properties_impl_unittest.cc',
-        'http/http_server_properties_manager_unittest.cc',
-        'http/http_status_code_unittest.cc',
-        'http/http_stream_factory_unittest.cc',
-        'http/http_stream_factory_job_controller_unittest.cc',
-        'http/http_stream_parser_unittest.cc',
-        'http/http_stream_request_unittest.cc',
-        'http/http_util_unittest.cc',
-        'http/http_vary_data_unittest.cc',
-        'http/mock_allow_http_auth_preferences.cc',
-        'http/mock_allow_http_auth_preferences.h',
-        # 'http/mock_http_cache.cc',
-        # 'http/mock_http_cache.h',
-        # Main test target not enabled yet.
-        # 'http/transport_security_persister_unittest.cc',
-        # 'log/file_net_log_observer_unittest.cc',
-        'http/transport_security_state_unittest.cc',
-        'http/url_security_manager_unittest.cc',
-        'log/net_log_capture_mode_unittest.cc',
-        'log/net_log_unittest.cc',
-        'log/net_log_util_unittest.cc',
-        'log/trace_net_log_observer_unittest.cc',
-        'nqe/effective_connection_type_unittest.cc',
-        'nqe/event_creator_unittest.cc',
-        'nqe/network_id_unittest.cc',
-        'nqe/network_qualities_prefs_manager_unittest.cc',
-        'nqe/network_quality_estimator_params_unittest.cc',
-        'nqe/network_quality_estimator_unittest.cc',
-        'nqe/network_quality_estimator_util_unittest.cc',
-        'nqe/network_quality_store_unittest.cc',
-        'nqe/observation_buffer_unittest.cc',
-        'nqe/socket_watcher_unittest.cc',
-        'nqe/throughput_analyzer_unittest.cc',
-        'ntlm/ntlm_buffer_reader_unittest.cc',
-        'ntlm/ntlm_buffer_writer_unittest.cc',
-        'ntlm/ntlm_client_unittest.cc',
-        'ntlm/ntlm_test_data.h',
-        'ntlm/ntlm_unittest.cc',
-        # 'http/http_auth_gssapi_starboard_unittest.cc',
-        'proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc',
-        'proxy_resolution/dhcp_pac_file_fetcher_factory_unittest.cc',
-        'proxy_resolution/dhcp_pac_file_fetcher_win_unittest.cc',
-        # mojo not used.
-        # 'proxy_resolution/mojo_proxy_resolver_v8_tracing_bindings_unittest.cc',
-        'proxy_resolution/multi_threaded_proxy_resolver_unittest.cc',
-        'proxy_resolution/network_delegate_error_observer_unittest.cc',
-        'proxy_resolution/pac_file_decider_unittest.cc',
-        'proxy_resolution/pac_file_fetcher_impl_unittest.cc',
-        'proxy_resolution/proxy_bypass_rules_unittest.cc',
-        'proxy_resolution/proxy_config_unittest.cc',
-        'proxy_resolution/proxy_info_unittest.cc',
-        'proxy_resolution/proxy_list_unittest.cc',
-        'proxy_resolution/proxy_resolution_service_unittest.cc',
-        'proxy_resolution/proxy_server_unittest.cc',
-        # not useful to us.
-        # 'proxy_resolution/proxy_resolver_v8_tracing_unittest.cc',
-        # 'proxy_resolution/proxy_resolver_v8_tracing_wrapper_unittest.cc',
-        # 'proxy_resolution/proxy_resolver_v8_unittest.cc',
-        'quic/bidirectional_stream_quic_impl_unittest.cc',
-        'quic/crypto/proof_test_chromium.cc',
-        'quic/crypto/proof_verifier_chromium_test.cc',
-        'quic/network_connection_unittest.cc',
-        'quic/properties_based_quic_server_info_test.cc',
-        'quic/quic_address_mismatch_test.cc',
-        'quic/quic_chromium_alarm_factory_test.cc',
-        'quic/quic_chromium_client_session_peer.cc',
-        'quic/quic_chromium_client_session_peer.h',
-        'quic/quic_chromium_client_session_test.cc',
-        'quic/quic_chromium_client_stream_test.cc',
-        'quic/quic_chromium_connection_helper_test.cc',
-        'quic/quic_clock_skew_detector_test.cc',
-        'quic/quic_connectivity_probing_manager_test.cc',
-        'quic/quic_end_to_end_unittest.cc',
-        'quic/quic_http_stream_test.cc',
-        'quic/quic_http_utils_test.cc',
-        'quic/quic_network_transaction_unittest.cc',
-        'quic/quic_proxy_client_socket_unittest.cc',
-        'quic/quic_stream_factory_peer.cc',
-        'quic/quic_stream_factory_peer.h',
-        'quic/quic_stream_factory_test.cc',
-        'quic/quic_utils_chromium_test.cc',
-        'socket/client_socket_pool_base_unittest.cc',
-        'socket/mock_client_socket_pool_manager.cc',
-        'socket/mock_client_socket_pool_manager.h',
-        'socket/sequenced_socket_data_unittest.cc',
-        'socket/socket_bio_adapter_unittest.cc',
-        'socket/socket_tag_unittest.cc',
-        'socket/socks5_client_socket_unittest.cc',
-        'socket/socks_client_socket_pool_unittest.cc',
-        'socket/socks_client_socket_unittest.cc',
-        'socket/ssl_client_socket_pool_unittest.cc',
-        'socket/ssl_client_socket_unittest.cc',
-        'socket/ssl_server_socket_unittest.cc',
-        'socket/tcp_client_socket_unittest.cc',
-        'socket/tcp_server_socket_unittest.cc',
-        'socket/tcp_socket_unittest.cc',
-        'socket/transport_client_socket_pool_test_util.cc',
-        'socket/transport_client_socket_pool_test_util.h',
-        'socket/transport_client_socket_pool_unittest.cc',
-        'socket/transport_client_socket_unittest.cc',
-        'socket/udp_socket_unittest.cc',
-        'socket/websocket_endpoint_lock_manager_unittest.cc',
-        'socket/websocket_transport_client_socket_pool_unittest.cc',
-        'spdy/bidirectional_stream_spdy_impl_unittest.cc',
-        'spdy/buffered_spdy_framer_unittest.cc',
-        'spdy/header_coalescer_test.cc',
-        'spdy/http2_priority_dependencies_unittest.cc',
-        'spdy/http2_push_promise_index_test.cc',
-        'spdy/spdy_buffer_unittest.cc',
-        'spdy/spdy_http_stream_unittest.cc',
-        'spdy/spdy_http_utils_unittest.cc',
-        'spdy/spdy_log_util_unittest.cc',
-        'spdy/spdy_network_transaction_unittest.cc',
-        'spdy/spdy_proxy_client_socket_unittest.cc',
-        'spdy/spdy_read_queue_unittest.cc',
-        'spdy/spdy_session_pool_unittest.cc',
-        'spdy/spdy_session_unittest.cc',
-        'spdy/spdy_stream_unittest.cc',
-        'spdy/spdy_write_queue_unittest.cc',
-        'ssl/channel_id_service_unittest.cc',
-        'ssl/client_cert_identity_unittest.cc',
-        'ssl/client_cert_store_unittest-inl.h',
-        'ssl/default_channel_id_store_unittest.cc',
-        'ssl/ssl_cipher_suite_names_unittest.cc',
-        'ssl/ssl_client_auth_cache_unittest.cc',
-        'ssl/ssl_client_session_cache_unittest.cc',
-        'ssl/ssl_config_service_unittest.cc',
-        'ssl/ssl_config_unittest.cc',
-        'ssl/ssl_connection_status_flags_unittest.cc',
-        'ssl/ssl_platform_key_util_unittest.cc',
-        'ssl/ssl_platform_key_win_unittest.cc',
-        'test/embedded_test_server/embedded_test_server_unittest.cc',
-        'test/embedded_test_server/http_request_unittest.cc',
-        'test/embedded_test_server/http_response_unittest.cc',
-        'test/run_all_unittests.cc',
-        'test/tcp_socket_proxy_unittest.cc',
-
-        'third_party/nist-pkits/pkits_testcases-inl.h',
-        'third_party/quic/core/congestion_control/bandwidth_sampler_test.cc',
-        'third_party/quic/core/congestion_control/bbr_sender_test.cc',
-        'third_party/quic/core/congestion_control/cubic_bytes_test.cc',
-        'third_party/quic/core/congestion_control/general_loss_algorithm_test.cc',
-        'third_party/quic/core/congestion_control/hybrid_slow_start_test.cc',
-        'third_party/quic/core/congestion_control/pacing_sender_test.cc',
-        'third_party/quic/core/congestion_control/prr_sender_test.cc',
-        'third_party/quic/core/congestion_control/rtt_stats_test.cc',
-        'third_party/quic/core/congestion_control/send_algorithm_test.cc',
-        'third_party/quic/core/congestion_control/uber_loss_algorithm_test.cc',
-        'third_party/quic/core/congestion_control/windowed_filter_test.cc',
-        'third_party/quic/core/crypto/aes_128_gcm_12_decrypter_test.cc',
-        'third_party/quic/core/crypto/aes_128_gcm_12_encrypter_test.cc',
-        'third_party/quic/core/crypto/aes_128_gcm_decrypter_test.cc',
-        'third_party/quic/core/crypto/aes_128_gcm_encrypter_test.cc',
-        'third_party/quic/core/crypto/aes_256_gcm_decrypter_test.cc',
-        'third_party/quic/core/crypto/aes_256_gcm_encrypter_test.cc',
-        'third_party/quic/core/crypto/cert_compressor_test.cc',
-        'third_party/quic/core/crypto/chacha20_poly1305_decrypter_test.cc',
-        'third_party/quic/core/crypto/chacha20_poly1305_encrypter_test.cc',
-        'third_party/quic/core/crypto/chacha20_poly1305_tls_decrypter_test.cc',
-        'third_party/quic/core/crypto/chacha20_poly1305_tls_encrypter_test.cc',
-        'third_party/quic/core/crypto/channel_id_test.cc',
-        # 'third_party/quic/core/crypto/common_cert_set_test.cc',
-        'third_party/quic/core/crypto/crypto_framer_test.cc',
-        'third_party/quic/core/crypto/crypto_handshake_message_test.cc',
-        'third_party/quic/core/crypto/crypto_secret_boxer_test.cc',
-        'third_party/quic/core/crypto/crypto_server_test.cc',
-        'third_party/quic/core/crypto/crypto_utils_test.cc',
-        'third_party/quic/core/crypto/curve25519_key_exchange_test.cc',
-        'third_party/quic/core/crypto/null_decrypter_test.cc',
-        'third_party/quic/core/crypto/null_encrypter_test.cc',
-        'third_party/quic/core/crypto/p256_key_exchange_test.cc',
-        'third_party/quic/core/crypto/quic_compressed_certs_cache_test.cc',
-        'third_party/quic/core/crypto/quic_crypto_client_config_test.cc',
-        'third_party/quic/core/crypto/quic_crypto_server_config_test.cc',
-        'third_party/quic/core/crypto/quic_hkdf_test.cc',
-        'third_party/quic/core/crypto/quic_random_test.cc',
-        'third_party/quic/core/crypto/transport_parameters_test.cc',
-        'third_party/quic/core/frames/quic_frames_test.cc',
-        'third_party/quic/core/http/http_decoder_test.cc',
-        'third_party/quic/core/http/http_encoder_test.cc',
-        'third_party/quic/core/http/quic_client_promised_info_test.cc',
-        'third_party/quic/core/http/quic_client_push_promise_index_test.cc',
-        'third_party/quic/core/http/quic_header_list_test.cc',
-        'third_party/quic/core/http/quic_headers_stream_test.cc',
-        'third_party/quic/core/http/quic_server_session_base_test.cc',
-        'third_party/quic/core/http/quic_spdy_session_test.cc',
-        'third_party/quic/core/http/quic_spdy_stream_body_buffer_test.cc',
-        'third_party/quic/core/http/quic_spdy_stream_test.cc',
-        'third_party/quic/core/http/spdy_utils_test.cc',
-        'third_party/quic/core/legacy_quic_stream_id_manager_test.cc',
-        'third_party/quic/core/packet_number_indexed_queue_test.cc',
-        'third_party/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc',
-        'third_party/quic/core/qpack/qpack_decoder_stream_receiver_test.cc',
-        'third_party/quic/core/qpack/qpack_decoder_stream_sender_test.cc',
-        'third_party/quic/core/qpack/qpack_decoder_test.cc',
-        'third_party/quic/core/qpack/qpack_encoder_stream_receiver_test.cc',
-        'third_party/quic/core/qpack/qpack_encoder_stream_sender_test.cc',
-        'third_party/quic/core/qpack/qpack_encoder_test.cc',
-        'third_party/quic/core/qpack/qpack_header_table_test.cc',
-        'third_party/quic/core/qpack/qpack_instruction_decoder_test.cc',
-        'third_party/quic/core/qpack/qpack_instruction_encoder_test.cc',
-        'third_party/quic/core/qpack/qpack_progressive_decoder_test.cc',
-        'third_party/quic/core/qpack/qpack_round_trip_test.cc',
-        'third_party/quic/core/qpack/qpack_static_table_test.cc',
-        'third_party/quic/core/quic_alarm_test.cc',
-        'third_party/quic/core/quic_arena_scoped_ptr_test.cc',
-        'third_party/quic/core/quic_bandwidth_test.cc',
-        'third_party/quic/core/quic_buffered_packet_store_test.cc',
-        'third_party/quic/core/quic_config_test.cc',
-        'third_party/quic/core/quic_connection_id_test.cc',
-        'third_party/quic/core/quic_connection_test.cc',
-        'third_party/quic/core/quic_control_frame_manager_test.cc',
-        'third_party/quic/core/quic_crypto_client_handshaker_test.cc',
-        'third_party/quic/core/quic_crypto_client_stream_test.cc',
-        'third_party/quic/core/quic_crypto_server_stream_test.cc',
-        'third_party/quic/core/quic_crypto_stream_test.cc',
-        'third_party/quic/core/quic_data_writer_test.cc',
-        'third_party/quic/core/quic_dispatcher_test.cc',
-        'third_party/quic/core/quic_error_codes_test.cc',
-        'third_party/quic/core/quic_flow_controller_test.cc',
-        'third_party/quic/core/quic_framer_test.cc',
-        'third_party/quic/core/quic_ietf_framer_test.cc',
-        'third_party/quic/core/quic_interval_set_test.cc',
-        'third_party/quic/core/quic_interval_test.cc',
-        'third_party/quic/core/quic_lru_cache_test.cc',
-        'third_party/quic/core/quic_one_block_arena_test.cc',
-        'third_party/quic/core/quic_packet_creator_test.cc',
-        'third_party/quic/core/quic_packet_generator_test.cc',
-        'third_party/quic/core/quic_packet_number_test.cc',
-        'third_party/quic/core/quic_received_packet_manager_test.cc',
-        'third_party/quic/core/quic_sent_packet_manager_test.cc',
-        'third_party/quic/core/quic_server_id_test.cc',
-        'third_party/quic/core/quic_session_test.cc',
-        'third_party/quic/core/quic_simple_buffer_allocator_test.cc',
-        'third_party/quic/core/quic_socket_address_coder_test.cc',
-        'third_party/quic/core/quic_stream_id_manager_test.cc',
-        'third_party/quic/core/quic_stream_send_buffer_test.cc',
-        'third_party/quic/core/quic_stream_sequencer_buffer_test.cc',
-        'third_party/quic/core/quic_stream_sequencer_test.cc',
-        'third_party/quic/core/quic_stream_test.cc',
-        'third_party/quic/core/quic_sustained_bandwidth_recorder_test.cc',
-        'third_party/quic/core/quic_tag_test.cc',
-        'third_party/quic/core/quic_time_test.cc',
-        'third_party/quic/core/quic_time_wait_list_manager_test.cc',
-        # TraceVisitor is not supported yet.
-        # 'third_party/quic/core/quic_trace_visitor_test.cc',
-        'third_party/quic/core/quic_unacked_packet_map_test.cc',
-        'third_party/quic/core/quic_utils_test.cc',
-        'third_party/quic/core/quic_version_manager_test.cc',
-        'third_party/quic/core/quic_versions_test.cc',
-        'third_party/quic/core/quic_write_blocked_list_test.cc',
-        'third_party/quic/core/tls_handshaker_test.cc',
-        'third_party/quic/core/uber_quic_stream_id_manager_test.cc',
-        'third_party/quic/platform/api/quic_containers_test.cc',
-        'third_party/quic/platform/api/quic_endian_test.cc',
-        'third_party/quic/platform/api/quic_hostname_utils_test.cc',
-        'third_party/quic/platform/api/quic_mem_slice_span_test.cc',
-        'third_party/quic/platform/api/quic_mem_slice_storage_test.cc',
-        'third_party/quic/platform/api/quic_mem_slice_test.cc',
-        'third_party/quic/platform/api/quic_reference_counted_test.cc',
-        'third_party/quic/platform/api/quic_singleton_test.cc',
-        'third_party/quic/platform/api/quic_str_cat_test.cc',
-        'third_party/quic/platform/api/quic_text_utils_test.cc',
-        'third_party/quic/platform/impl/quic_chromium_clock_test.cc',
-        'third_party/quic/platform/impl/quic_uint128_impl_unittest.cc',
-        'third_party/quic/test_tools/crypto_test_utils_test.cc',
-        'third_party/quic/test_tools/mock_quic_time_wait_list_manager.cc',
-        'third_party/quic/test_tools/mock_quic_time_wait_list_manager.h',
-        'third_party/quic/test_tools/quic_test_utils_test.cc',
-        'third_party/quic/test_tools/simple_session_notifier_test.cc',
-        'third_party/quic/test_tools/simulator/quic_endpoint_test.cc',
-        'third_party/quic/test_tools/simulator/simulator_test.cc',
-        'third_party/quiche/src/http2/decoder/decode_buffer_test.cc',
-        'third_party/quiche/src/http2/decoder/decode_http2_structures_test.cc',
-        'third_party/quiche/src/http2/decoder/frame_decoder_state_test_util.cc',
-        'third_party/quiche/src/http2/decoder/frame_decoder_state_test_util.h',
-        'third_party/quiche/src/http2/decoder/http2_frame_decoder_listener_test_util.cc',
-        'third_party/quiche/src/http2/decoder/http2_frame_decoder_listener_test_util.h',
-        'third_party/quiche/src/http2/decoder/http2_frame_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/http2_structure_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/http2_structure_decoder_test_util.cc',
-        'third_party/quiche/src/http2/decoder/http2_structure_decoder_test_util.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/altsvc_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/continuation_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/data_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/goaway_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/headers_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/payload_decoder_base_test_util.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/payload_decoder_base_test_util.h',
-        'third_party/quiche/src/http2/decoder/payload_decoders/ping_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/priority_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/push_promise_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/rst_stream_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/settings_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/unknown_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/decoder/payload_decoders/window_update_payload_decoder_test.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_block_collector.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_block_collector.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_block_decoder_test.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_state_test.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_string_buffer_test.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_tables_test.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_decoder_test.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_collector.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_collector.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_decoder_test.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_entry_type_decoder_test.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_string_collector.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_string_collector.h',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_string_decoder_test.cc',
-        'third_party/quiche/src/http2/hpack/decoder/hpack_whole_entry_buffer_test.cc',
-        'third_party/quiche/src/http2/hpack/hpack_string_test.cc',
-        'third_party/quiche/src/http2/hpack/http2_hpack_constants_test.cc',
-        'third_party/quiche/src/http2/hpack/huffman/hpack_huffman_decoder_test.cc',
-        'third_party/quiche/src/http2/hpack/huffman/hpack_huffman_encoder_test.cc',
-        'third_party/quiche/src/http2/hpack/huffman/hpack_huffman_transcoder_test.cc',
-        'third_party/quiche/src/http2/hpack/tools/hpack_block_builder.cc',
-        'third_party/quiche/src/http2/hpack/tools/hpack_block_builder.h',
-        'third_party/quiche/src/http2/hpack/tools/hpack_block_builder_test.cc',
-        'third_party/quiche/src/http2/hpack/tools/hpack_example.cc',
-        'third_party/quiche/src/http2/hpack/tools/hpack_example.h',
-        'third_party/quiche/src/http2/hpack/varint/hpack_varint_decoder_test.cc',
-        'third_party/quiche/src/http2/hpack/varint/hpack_varint_encoder_test.cc',
-        'third_party/quiche/src/http2/hpack/varint/hpack_varint_round_trip_test.cc',
-        'third_party/quiche/src/http2/http2_constants_test.cc',
-        'third_party/quiche/src/http2/http2_constants_test_util.cc',
-        'third_party/quiche/src/http2/http2_constants_test_util.h',
-        'third_party/quiche/src/http2/http2_structures_test.cc',
-        'third_party/quiche/src/http2/http2_structures_test_util.cc',
-        'third_party/quiche/src/http2/http2_structures_test_util.h',
-        'third_party/quiche/src/http2/platform/api/http2_mock_log.h',
-        'third_party/quiche/src/http2/platform/api/http2_string_utils_test.cc',
-        'third_party/quiche/src/http2/platform/api/http2_test_helpers.h',
-        'third_party/quiche/src/http2/test_tools/frame_parts.cc',
-        'third_party/quiche/src/http2/test_tools/frame_parts.h',
-        'third_party/quiche/src/http2/test_tools/frame_parts_collector.cc',
-        'third_party/quiche/src/http2/test_tools/frame_parts_collector.h',
-        'third_party/quiche/src/http2/test_tools/frame_parts_collector_listener.cc',
-        'third_party/quiche/src/http2/test_tools/frame_parts_collector_listener.h',
-        'third_party/quiche/src/http2/test_tools/http2_random.cc',
-        'third_party/quiche/src/http2/test_tools/http2_random.h',
-        'third_party/quiche/src/http2/test_tools/http2_random_test.cc',
-        'third_party/quiche/src/http2/tools/http2_frame_builder.cc',
-        'third_party/quiche/src/http2/tools/http2_frame_builder.h',
-        'third_party/quiche/src/http2/tools/random_decoder_test.cc',
-        'third_party/quiche/src/http2/tools/random_decoder_test.h',
-        'third_party/quiche/src/http2/tools/random_util.cc',
-        'third_party/quiche/src/http2/tools/random_util.h',
-        'third_party/quiche/src/spdy/core/array_output_buffer.cc',
-        'third_party/quiche/src/spdy/core/array_output_buffer.h',
-        'third_party/quiche/src/spdy/core/array_output_buffer_test.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_decoder_adapter_test.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_encoder_test.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_entry_test.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_header_table_test.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_huffman_table_test.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_output_stream_test.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_round_trip_test.cc',
-        'third_party/quiche/src/spdy/core/hpack/hpack_static_table_test.cc',
-        'third_party/quiche/src/spdy/core/mock_spdy_framer_visitor.cc',
-        'third_party/quiche/src/spdy/core/mock_spdy_framer_visitor.h',
-        'third_party/quiche/src/spdy/core/priority_write_scheduler_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_alt_svc_wire_format_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_deframer_visitor.cc',
-        'third_party/quiche/src/spdy/core/spdy_deframer_visitor.h',
-        'third_party/quiche/src/spdy/core/spdy_deframer_visitor_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_frame_builder_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_frame_reader_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_framer_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_header_block_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_no_op_visitor.cc',
-        'third_party/quiche/src/spdy/core/spdy_no_op_visitor.h',
-        'third_party/quiche/src/spdy/core/spdy_pinnable_buffer_piece_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_prefixed_buffer_reader_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_protocol_test.cc',
-        'third_party/quiche/src/spdy/core/spdy_protocol_test_utils.cc',
-        'third_party/quiche/src/spdy/core/spdy_protocol_test_utils.h',
-        'third_party/quiche/src/spdy/core/spdy_test_utils.cc',
-        'third_party/quiche/src/spdy/core/spdy_test_utils.h',
-        'third_party/quiche/src/spdy/platform/api/spdy_mem_slice_test.cc',
-        'third_party/quiche/src/spdy/platform/api/spdy_string_utils_test.cc',
-        'third_party/quiche/src/spdy/platform/api/spdy_test_helpers.h',
-        'tools/content_decoder_tool/content_decoder_tool.cc',
-        'tools/content_decoder_tool/content_decoder_tool.h',
-        'tools/content_decoder_tool/content_decoder_tool_unittest.cc',
-        'tools/quic/quic_simple_client_test.cc',
-        # 'tools/tld_cleanup/tld_cleanup_util_unittest.cc',
-        'url_request/redirect_info_unittest.cc',
-        'url_request/redirect_util_unittest.cc',
-        'url_request/report_sender_unittest.cc',
-        'url_request/url_fetcher_impl_unittest.cc',
-        'url_request/url_fetcher_response_writer_unittest.cc',
-        'url_request/url_request_context_builder_unittest.cc',
-        'url_request/url_request_context_unittest.cc',
-        'url_request/url_request_data_job_unittest.cc',
-        # Cobalt handles File Job itself.
-        # 'url_request/url_request_file_job_unittest.cc',
-        'url_request/url_request_filter_unittest.cc',
-
-        # ftp not supported by Cobalt.
-        # 'url_request/url_request_file_dir_job_unittest.cc',
-        # 'url_request/url_request_ftp_job_unittest.cc',
-
-        'url_request/url_request_http_job_unittest.cc',
-        'url_request/url_request_job_factory_impl_unittest.cc',
-        'url_request/url_request_job_unittest.cc',
-        'url_request/url_request_quic_unittest.cc',
-        'url_request/url_request_simple_job_unittest.cc',
-        'url_request/url_request_throttler_simulation_unittest.cc',
-        'url_request/url_request_throttler_test_support.cc',
-        'url_request/url_request_throttler_test_support.h',
-        'url_request/url_request_throttler_unittest.cc',
-        'url_request/url_request_unittest.cc',
-
-        # Also include unittests for websockets.
-        'server/http_connection_unittest.cc',
-        'server/http_server_response_info_unittest.cc',
-        'server/http_server_unittest.cc',
-        'server/web_socket_encoder_unittest.cc',
-
-        'websockets/websocket_basic_handshake_stream_test.cc',
-        'websockets/websocket_basic_stream_adapters_test.cc',
-        'websockets/websocket_basic_stream_test.cc',
-        'websockets/websocket_channel_test.cc',
-        'websockets/websocket_deflate_parameters_test.cc',
-        'websockets/websocket_deflate_predictor_impl_test.cc',
-        'websockets/websocket_deflate_stream_test.cc',
-        'websockets/websocket_deflater_test.cc',
-
-        # Uses the unsupported SpawnedWebServer.
-        #'websockets/websocket_end_to_end_test.cc',
-
-        'websockets/websocket_errors_test.cc',
-        'websockets/websocket_extension_parser_test.cc',
-        'websockets/websocket_extension_test.cc',
-        'websockets/websocket_frame_parser_test.cc',
-        'websockets/websocket_frame_test.cc',
-        'websockets/websocket_handshake_challenge_test.cc',
-        'websockets/websocket_handshake_stream_create_helper_test.cc',
-        'websockets/websocket_inflater_test.cc',
-        'websockets/websocket_stream_cookie_test.cc',
-        'websockets/websocket_stream_create_test_base.cc',
-        'websockets/websocket_stream_create_test_base.h',
-        'websockets/websocket_stream_test.cc',
-        'websockets/websocket_test_util.cc',
-        'websockets/websocket_test_util.h',
-
-        # Also include unittests for network reporting.
-        'reporting/reporting_browsing_data_remover_unittest.cc',
-        'reporting/reporting_cache_unittest.cc',
-        'reporting/reporting_delivery_agent_unittest.cc',
-        'reporting/reporting_endpoint_manager_unittest.cc',
-        'reporting/reporting_garbage_collector_unittest.cc',
-        'reporting/reporting_header_parser_unittest.cc',
-        'reporting/reporting_network_change_observer_unittest.cc',
-        'reporting/reporting_service_unittest.cc',
-      ],
-
-      'sources/': [
-        # TODO: Resurrect these seemingly valid tests.
-        ['exclude', 'tcp_server_socket_unittest'],
-        ['exclude', 'tcp_client_socket_unittest'],
-        ['exclude', 'udp_socket_unittest'],
-
-        # TODO: Delete or remove failing tests below here. ---------------
-
-        # These tests don't compile or link
-
-        # This test requires the use of an external python test server that we
-        # do not support on Cobalt or Starboard.
-        ['exclude', 'ssl_client_socket_unittest'],
-
-        # These tests hang/crash/assert
-        ['exclude', 'backend_unittest'],  # ref-counting problems
-        ['exclude', 'block_files_unittest'],  # test data is little-endian
-        ['exclude', 'entry_unittest'],
-        ['exclude', 'cert_verify_proc_unittest'],
-
-        ############### ALL TESTS BELOW ARE PERMANENTLY EXCLUDED ###############
-        ['exclude', 'address_sorter_unittest'],  # at time of exclusion, address sorting only happens when IPv6 is enabled
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/base/base.gyp:base_i18n',
-        '<(DEPTH)/base/base.gyp:test_support_base',
-        '<(DEPTH)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-        '<(DEPTH)/crypto/crypto.gyp:crypto',
-        '<(DEPTH)/url/url.gyp:url',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/third_party/zlib/zlib.gyp:zlib',
-        '<(DEPTH)/third_party/boringssl/boringssl.gyp:crypto',
-        'net_copy_test_data',
-        'third_party_copy_test_data',
-        'http_server',  # This is needed by dial_http_server in net
-        'net',
-        'test_support',
-        'quic_test_tools',
-        'net_nqe_proto',
-        'net_quic_proto',
-      ],
-      'include_dirs': [
-        '<(SHARED_INTERMEDIATE_DIR)',
-      ],
-      'defines': [
-        # To be removed in the future when want to enable HTTP cache.
-        'HTTP_CACHE_DISABLED_FOR_STARBOARD',
-        'GMOCK_NO_MOVE_MOCK',
-        'BASE_DONT_ENFORCE_THREAD_NAME_LENGTH',
-      ],
-      'cflags': [
-        # Avoid compiler errors due to conversion from "0x00" to char on Android.
-        '-Wno-narrowing',
-      ],
-    },
-    {
-      'target_name': 'net_copy_test_data',
-      'type': 'none',
-      'conditions': [
-        ['cobalt_copy_test_data == 1', {
-          'variables': {
-            'content_test_input_files': [
-              '<(DEPTH)/net/data',
-            ],
-            'content_test_output_subdir': 'net',
-          },
-          'includes': [ '../starboard/build/copy_test_data.gypi' ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'third_party_copy_test_data',
-      'type': 'none',
-      'conditions': [
-        ['cobalt_copy_test_data == 1', {
-          'variables': {
-            'content_test_input_files': [
-              '<(DEPTH)/net/third_party/nist-pkits/certs',
-              '<(DEPTH)/net/third_party/nist-pkits/crls',
-            ],
-            'content_test_output_subdir': 'net/third_party/nist-pkits',
-          },
-          'includes': [ '../starboard/build/copy_test_data.gypi' ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'test_support',
-      'type': 'static_library',
-      'defines': [
-        'GMOCK_NO_MOVE_MOCK',
-        'BASE_DONT_ENFORCE_THREAD_NAME_LENGTH',
-      ],
-      'sources': [
-        # 'disk_cache/disk_cache_test_base.cc',
-        # 'disk_cache/disk_cache_test_base.h',
-        # 'disk_cache/disk_cache_test_util.cc',
-        # 'disk_cache/disk_cache_test_util.h',
-
-        'quic/quic_test_packet_maker.cc',
-        'quic/quic_test_packet_maker.h',
-        'base/test_data_stream.cc',
-        'base/test_data_stream.h',
-        'spdy/spdy_session_test_util.cc',
-        'spdy/spdy_session_test_util.h',
-        'spdy/spdy_stream_test_util.cc',
-        'spdy/spdy_stream_test_util.h',
-        'url_request/file_protocol_handler.cc',
-        'url_request/file_protocol_handler.h',
-        'url_request/url_request_file_dir_job.cc',
-        'url_request/url_request_file_dir_job.h',
-        'url_request/url_request_file_job.cc',
-        'url_request/url_request_file_job.h',
-
-        # Kerberos(gssapi) not supported yet.
-        # 'http/mock_gssapi_library_starboard.cc',
-        # 'http/mock_gssapi_library_starboard.h',
-
-        'base/load_timing_info_test_util.cc',
-        'base/load_timing_info_test_util.h',
-        'base/mock_file_stream.cc',
-        'base/mock_file_stream.h',
-        'base/mock_network_change_notifier.cc',
-        'base/mock_network_change_notifier.h',
-        'base/test_completion_callback.cc',
-        'base/test_completion_callback.h',
-        'base/test_proxy_delegate.cc',
-        'base/test_proxy_delegate.h',
-        'cert/mock_cert_verifier.cc',
-        'cert/mock_cert_verifier.h',
-        'cert/mock_client_cert_verifier.cc',
-        'cert/mock_client_cert_verifier.h',
-        'cookies/canonical_cookie_test_helpers.h',
-        'cookies/cookie_change_dispatcher_test_helpers.cc',
-        'cookies/cookie_change_dispatcher_test_helpers.h',
-        'cookies/cookie_monster_store_test.cc',
-        'cookies/cookie_monster_store_test.h',
-        'cookies/cookie_store_change_unittest.h',
-        'cookies/cookie_store_test_callbacks.cc',
-        'cookies/cookie_store_test_callbacks.h',
-        'cookies/cookie_store_test_helpers.cc',
-        'cookies/cookie_store_test_helpers.h',
-        'cookies/cookie_store_unittest.h',
-        'dns/dns_test_util.cc',
-        'dns/dns_test_util.h',
-        'dns/mock_host_resolver.cc',
-        'dns/mock_host_resolver.h',
-        'dns/mock_mdns_client.cc',
-        'dns/mock_mdns_client.h',
-        'dns/mock_mdns_socket_factory.cc',
-        'dns/mock_mdns_socket_factory.h',
-        'filter/filter_source_stream_test_util.cc',
-        'filter/filter_source_stream_test_util.h',
-        'filter/mock_source_stream.cc',
-        'filter/mock_source_stream.h',
-        'http/http_stream_factory_test_util.cc',
-        'http/http_stream_factory_test_util.h',
-        'http/http_transaction_test_util.cc',
-        'http/http_transaction_test_util.h',
-        'http/transport_security_state_test_util.cc',
-        'http/transport_security_state_test_util.h',
-        'log/test_net_log.cc',
-        'log/test_net_log.h',
-        'log/test_net_log_entry.cc',
-        'log/test_net_log_entry.h',
-        'log/test_net_log_util.cc',
-        'log/test_net_log_util.h',
-        'nqe/network_quality_estimator_test_util.cc',
-        'nqe/network_quality_estimator_test_util.h',
-        'proxy_resolution/mock_pac_file_fetcher.cc',
-        'proxy_resolution/mock_pac_file_fetcher.h',
-        'proxy_resolution/mock_proxy_resolver.cc',
-        'proxy_resolution/mock_proxy_resolver.h',
-        'proxy_resolution/proxy_config_service_common_unittest.cc',
-        'proxy_resolution/proxy_config_service_common_unittest.h',
-        'quic/mock_quic_data.cc',
-        'quic/mock_quic_data.h',
-        'reporting/reporting_test_util.cc',
-        'reporting/reporting_test_util.h',
-        'socket/socket_test_util.cc',
-        'socket/socket_test_util.h',
-        'spdy/spdy_test_util_common.cc',
-        'spdy/spdy_test_util_common.h',
-        'ssl/client_cert_identity_test_util.cc',
-        'ssl/client_cert_identity_test_util.h',
-        'ssl/ssl_private_key_test_util.cc',
-        'ssl/ssl_private_key_test_util.h',
-        'ssl/test_ssl_private_key.cc',
-        'ssl/test_ssl_private_key.h',
-        'test/cert_test_util.cc',
-        'test/cert_test_util.h',
-        'test/channel_id_test_util.cc',
-        'test/channel_id_test_util.h',
-        'test/ct_test_util.cc',
-        'test/ct_test_util.h',
-        'test/embedded_test_server/controllable_http_response.cc',
-        'test/embedded_test_server/controllable_http_response.h',
-        'test/embedded_test_server/default_handlers.cc',
-        'test/embedded_test_server/default_handlers.h',
-        'test/embedded_test_server/embedded_test_server.cc',
-        'test/embedded_test_server/embedded_test_server.h',
-        'test/embedded_test_server/embedded_test_server_connection_listener.h',
-        'test/embedded_test_server/http_connection.cc',
-        'test/embedded_test_server/http_connection.h',
-        'test/embedded_test_server/http_request.cc',
-        'test/embedded_test_server/http_request.h',
-        'test/embedded_test_server/http_response.cc',
-        'test/embedded_test_server/http_response.h',
-        'test/embedded_test_server/request_handler_util.cc',
-        'test/embedded_test_server/request_handler_util.h',
-        'test/embedded_test_server/simple_connection_listener.cc',
-        'test/embedded_test_server/simple_connection_listener.h',
-        'test/event_waiter.h',
-        'test/gtest_util.h',
-        'test/net_test_suite.cc',
-        'test/net_test_suite.h',
-        'test/quic_simple_test_server.cc',
-        'test/quic_simple_test_server.h',
-        'test/scoped_disable_exit_on_dfatal.cc',
-        'test/scoped_disable_exit_on_dfatal.h',
-        'test/tcp_socket_proxy.cc',
-        'test/tcp_socket_proxy.h',
-        'test/test_certificate_data.h',
-        'test/test_data_directory.cc',
-        'test/test_data_directory.h',
-        'test/test_with_scoped_task_environment.h',
-        'test/url_request/ssl_certificate_error_job.cc',
-        'test/url_request/ssl_certificate_error_job.h',
-        'test/url_request/url_request_failed_job.cc',
-        'test/url_request/url_request_failed_job.h',
-        'test/url_request/url_request_hanging_read_job.cc',
-        'test/url_request/url_request_hanging_read_job.h',
-        'test/url_request/url_request_mock_data_job.cc',
-        'test/url_request/url_request_mock_data_job.h',
-        'test/url_request/url_request_slow_download_job.cc',
-        'test/url_request/url_request_slow_download_job.h',
-        'url_request/test_url_fetcher_factory.cc',
-        'url_request/test_url_fetcher_factory.h',
-        'url_request/test_url_request_interceptor.cc',
-        'url_request/test_url_request_interceptor.h',
-        'url_request/url_request_test_job.cc',
-        'url_request/url_request_test_job.h',
-        'url_request/url_request_test_util.cc',
-        'url_request/url_request_test_util.h',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/base/base.gyp:test_support_base',
-        '<(DEPTH)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-        '<(DEPTH)/crypto/crypto.gyp:crypto',
-        '<(DEPTH)/url/url.gyp:url',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/third_party/zlib/zlib.gyp:zlib',
-        'net',
-        'net_nqe_proto',
-        'net_quic_proto',
-      ],
-    },
-    {
-      # This component is called the same name in Chromium's GN files.
-      'target_name': 'quic_test_tools',
-      'type': 'static_library',
-      'defines': [
-        'GMOCK_NO_MOVE_MOCK',
-      ],
-      'sources': [
-        'tools/quic/quic_simple_client.cc',
-        'tools/quic/quic_simple_client.h',
-        'tools/quic/quic_simple_server_session_helper.cc',
-        'tools/quic/quic_simple_server_session_helper.h',
-        'quic/crypto_test_utils_chromium.cc',
-        'quic/mock_crypto_client_stream.cc',
-        'quic/mock_crypto_client_stream.h',
-        'quic/mock_crypto_client_stream_factory.cc',
-        'quic/mock_crypto_client_stream_factory.h',
-        'quic/mock_decrypter.cc',
-        'quic/mock_decrypter.h',
-        'quic/mock_encrypter.cc',
-        'quic/mock_encrypter.h',
-        'quic/test_task_runner.cc',
-        'quic/test_task_runner.h',
-        # Requires quic_trace third-party library. Not yet supported.
-        # 'third_party/quic/core/quic_trace_visitor.cc',
-        # 'third_party/quic/core/quic_trace_visitor.h',
-        'third_party/quic/platform/api/quic_expect_bug.h',
-        'third_party/quic/platform/api/quic_mock_log.h',
-        'third_party/quic/platform/api/quic_test.h',
-        'third_party/quic/platform/api/quic_test_loopback.cc',
-        'third_party/quic/platform/api/quic_test_loopback.h',
-        'third_party/quic/platform/api/quic_test_mem_slice_vector.h',
-        # Not used yet.
-        # 'third_party/quic/platform/api/quic_test_output.h',
-        # 'third_party/quic/platform/impl/quic_test_output_impl.cc',
-        # 'third_party/quic/platform/impl/quic_test_output_impl.h',
-        'third_party/quic/platform/impl/quic_expect_bug_impl.h',
-        'third_party/quic/platform/impl/quic_mock_log_impl.h',
-        'third_party/quic/core/qpack/qpack_encoder_test_utils.cc',
-        'third_party/quic/core/qpack/qpack_encoder_test_utils.h',
-        'third_party/quic/platform/impl/quic_test_impl.cc',
-        'third_party/quic/platform/impl/quic_test_impl.h',
-        'third_party/quic/platform/impl/quic_test_loopback_impl.cc',
-        'third_party/quic/platform/impl/quic_test_loopback_impl.h',
-        'third_party/quic/platform/impl/quic_test_mem_slice_vector_impl.cc',
-        'third_party/quic/platform/impl/quic_test_mem_slice_vector_impl.h',
-        'third_party/quic/quartc/counting_packet_filter.h',
-        'third_party/quic/test_tools/crypto_test_utils.cc',
-        'third_party/quic/test_tools/crypto_test_utils.h',
-        'third_party/quic/test_tools/failing_proof_source.cc',
-        'third_party/quic/test_tools/failing_proof_source.h',
-        'third_party/quic/test_tools/fake_proof_source.cc',
-        'third_party/quic/test_tools/fake_proof_source.h',
-        'third_party/quic/test_tools/mock_clock.cc',
-        'third_party/quic/test_tools/mock_clock.h',
-        'third_party/quic/test_tools/mock_quic_client_promised_info.cc',
-        'third_party/quic/test_tools/mock_quic_client_promised_info.h',
-        'third_party/quic/core/qpack/qpack_decoder_test_utils.cc',
-        'third_party/quic/core/qpack/qpack_decoder_test_utils.h',
-        'third_party/quic/test_tools/mock_quic_dispatcher.cc',
-        'third_party/quic/test_tools/mock_quic_dispatcher.h',
-        'third_party/quic/test_tools/mock_quic_session_visitor.cc',
-        'third_party/quic/test_tools/mock_quic_session_visitor.h',
-        'third_party/quic/test_tools/mock_quic_spdy_client_stream.cc',
-        'third_party/quic/test_tools/mock_quic_spdy_client_stream.h',
-        'third_party/quic/test_tools/mock_random.cc',
-        'third_party/quic/test_tools/mock_random.h',
-        'third_party/quic/test_tools/quic_buffered_packet_store_peer.cc',
-        'third_party/quic/test_tools/quic_buffered_packet_store_peer.h',
-        'third_party/quic/test_tools/quic_client_promised_info_peer.cc',
-        'third_party/quic/test_tools/quic_client_promised_info_peer.h',
-        'third_party/quic/test_tools/quic_config_peer.cc',
-        'third_party/quic/test_tools/quic_config_peer.h',
-        'third_party/quic/test_tools/quic_connection_peer.cc',
-        'third_party/quic/test_tools/quic_connection_peer.h',
-        'third_party/quic/test_tools/quic_crypto_server_config_peer.cc',
-        'third_party/quic/test_tools/quic_crypto_server_config_peer.h',
-        'third_party/quic/test_tools/quic_dispatcher_peer.cc',
-        'third_party/quic/test_tools/quic_dispatcher_peer.h',
-        'third_party/quic/core/qpack/qpack_test_utils.cc',
-        'third_party/quic/core/qpack/qpack_test_utils.h',
-        'third_party/quic/test_tools/quic_flow_controller_peer.cc',
-        'third_party/quic/test_tools/quic_flow_controller_peer.h',
-        'third_party/quic/test_tools/quic_framer_peer.cc',
-        'third_party/quic/test_tools/quic_framer_peer.h',
-        'third_party/quic/test_tools/quic_packet_creator_peer.cc',
-        'third_party/quic/test_tools/quic_packet_creator_peer.h',
-        'third_party/quic/test_tools/quic_packet_generator_peer.cc',
-        'third_party/quic/test_tools/quic_packet_generator_peer.h',
-        'third_party/quic/test_tools/quic_sent_packet_manager_peer.cc',
-        'third_party/quic/test_tools/quic_sent_packet_manager_peer.h',
-        'third_party/quic/test_tools/quic_server_session_base_peer.h',
-        'third_party/quic/test_tools/quic_session_peer.cc',
-        'third_party/quic/test_tools/quic_session_peer.h',
-        'third_party/quic/test_tools/quic_spdy_session_peer.cc',
-        'third_party/quic/test_tools/quic_spdy_session_peer.h',
-        'third_party/quic/test_tools/quic_spdy_stream_peer.cc',
-        'third_party/quic/test_tools/quic_spdy_stream_peer.h',
-        'third_party/quic/test_tools/quic_stream_peer.cc',
-        'third_party/quic/test_tools/quic_stream_peer.h',
-        'third_party/quic/test_tools/quic_stream_send_buffer_peer.cc',
-        'third_party/quic/test_tools/quic_stream_send_buffer_peer.h',
-        'third_party/quic/test_tools/quic_stream_sequencer_buffer_peer.cc',
-        'third_party/quic/test_tools/quic_stream_sequencer_buffer_peer.h',
-        'third_party/quic/test_tools/quic_stream_sequencer_peer.cc',
-        'third_party/quic/test_tools/quic_stream_sequencer_peer.h',
-        'third_party/quic/test_tools/quic_sustained_bandwidth_recorder_peer.cc',
-        'third_party/quic/test_tools/quic_sustained_bandwidth_recorder_peer.h',
-        'third_party/quic/test_tools/quic_test_utils.cc',
-        'third_party/quic/test_tools/quic_test_utils.h',
-        "third_party/quic/core/quic_time_wait_list_manager.cc",
-        "third_party/quic/core/quic_time_wait_list_manager.h",
-        'third_party/quic/test_tools/quic_time_wait_list_manager_peer.cc',
-        'third_party/quic/test_tools/quic_unacked_packet_map_peer.cc',
-        'third_party/quic/test_tools/quic_unacked_packet_map_peer.h',
-        'third_party/quic/tools/quic_memory_cache_backend.cc',
-        'third_party/quic/tools/quic_memory_cache_backend.h',
-        "third_party/quic/tools/quic_simple_client_session.cc",
-        "third_party/quic/tools/quic_simple_client_session.h",
-        "third_party/quic/tools/quic_simple_client_stream.cc",
-        "third_party/quic/tools/quic_simple_client_stream.h",
-        'third_party/quic/test_tools/quic_time_wait_list_manager_peer.h',
-        'third_party/quic/test_tools/rtt_stats_peer.cc',
-        'third_party/quic/test_tools/rtt_stats_peer.h',
-        'third_party/quic/test_tools/simple_data_producer.cc',
-        'third_party/quic/test_tools/simple_data_producer.h',
-        'third_party/quic/test_tools/simple_quic_framer.cc',
-        'third_party/quic/test_tools/simple_quic_framer.h',
-        'third_party/quic/test_tools/simple_session_notifier.cc',
-        'third_party/quic/test_tools/simple_session_notifier.h',
-        'third_party/quic/test_tools/simulator/actor.cc',
-        'third_party/quic/test_tools/simulator/actor.h',
-        'third_party/quic/test_tools/simulator/alarm_factory.cc',
-        'third_party/quic/test_tools/simulator/alarm_factory.h',
-        'third_party/quic/test_tools/simulator/link.cc',
-        'third_party/quic/test_tools/simulator/link.h',
-        'third_party/quic/test_tools/simulator/packet_filter.cc',
-        'third_party/quic/test_tools/simulator/packet_filter.h',
-        'third_party/quic/test_tools/simulator/port.cc',
-        'third_party/quic/test_tools/simulator/port.h',
-        'third_party/quic/test_tools/simulator/queue.cc',
-        'third_party/quic/test_tools/simulator/queue.h',
-        'third_party/quic/test_tools/simulator/quic_endpoint.cc',
-        'third_party/quic/test_tools/simulator/quic_endpoint.h',
-        'third_party/quic/test_tools/simulator/simulator.cc',
-        'third_party/quic/test_tools/simulator/simulator.h',
-        'third_party/quic/test_tools/simulator/switch.cc',
-        'third_party/quic/test_tools/simulator/switch.h',
-        'third_party/quic/test_tools/simulator/traffic_policer.cc',
-        'third_party/quic/test_tools/simulator/traffic_policer.h',
-        'third_party/quic/tools/quic_backend_response.cc',
-        'third_party/quic/tools/quic_backend_response.h',
-        'third_party/quic/tools/quic_client_base.cc',
-        'third_party/quic/tools/quic_client_base.h',
-        'third_party/quic/tools/quic_simple_crypto_server_stream_helper.cc',
-        'third_party/quic/tools/quic_simple_crypto_server_stream_helper.h',
-        'third_party/quic/tools/quic_simple_dispatcher.cc',
-        'third_party/quic/tools/quic_simple_dispatcher.h',
-        'third_party/quic/tools/quic_simple_server_session.cc',
-        'third_party/quic/tools/quic_simple_server_session.h',
-        'third_party/quic/tools/quic_simple_server_stream.cc',
-        'third_party/quic/tools/quic_simple_server_stream.h',
-        "third_party/quic/tools/quic_url.cc",
-        "third_party/quic/tools/quic_url.h",
-        'third_party/quic/tools/quic_tcp_like_trace_converter.cc',
-        'third_party/quic/tools/quic_tcp_like_trace_converter.h',
-        'third_party/quic/tools/quic_tcp_like_trace_converter_test.cc',
-        'third_party/quic/tools/quic_spdy_client_base.cc',
-        'third_party/quic/tools/quic_spdy_client_base.h',
-        'tools/quic/quic_client_message_loop_network_helper.cc',
-        'tools/quic/quic_client_message_loop_network_helper.h',
-        'tools/quic/quic_simple_server.cc',
-        'tools/quic/quic_simple_server.h',
-        'tools/quic/quic_simple_server_packet_writer.cc',
-        'tools/quic/quic_simple_server_packet_writer.h',
-
-        "third_party/quic/core/chlo_extractor.cc",
-        "third_party/quic/core/chlo_extractor.h",
-        "third_party/quic/core/http/quic_spdy_server_stream_base.cc",
-        "third_party/quic/core/http/quic_spdy_server_stream_base.h",
-        "third_party/quic/core/quic_dispatcher.cc",
-        "third_party/quic/core/quic_dispatcher.h",
-        "third_party/quic/core/quic_packet_writer_wrapper.cc",
-        "third_party/quic/core/quic_packet_writer_wrapper.h",
-        "third_party/quic/core/quic_process_packet_interface.h",
-        "third_party/quic/core/stateless_rejector.cc",
-        "third_party/quic/core/stateless_rejector.h",
-        'http2/platform/impl/http2_test_helpers_impl.cc',
-        "tools/quic/quic_http_proxy_backend.cc",
-        "tools/quic/quic_http_proxy_backend.h",
-        "tools/quic/quic_http_proxy_backend_stream.cc",
-        "tools/quic/quic_http_proxy_backend_stream.h",
-        "tools/quic/synchronous_host_resolver.cc",
-        "tools/quic/synchronous_host_resolver.h",
-      ],
-      'dependencies': [
-        'net',
-        '<(DEPTH)/third_party/boringssl/boringssl.gyp:crypto',
-        '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'test_support',
-        'net_nqe_proto',
-        'net_quic_proto',
-      ],
-    },
-    {
-      'target_name': 'http_server',
-      'type': 'static_library',
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        'net',
-      ],
-      'sources': [
-        'server/http_connection.cc',
-        'server/http_connection.h',
-        'server/http_server.cc',
-        'server/http_server.h',
-        'server/http_server_request_info.cc',
-        'server/http_server_request_info.h',
-        'server/http_server_response_info.cc',
-        'server/http_server_response_info.h',
-        'server/web_socket.cc',
-        'server/web_socket.h',
-        'server/web_socket_encoder.cc',
-        'server/web_socket_encoder.h',
-      ],
-    },
-    # {
-    #   'target_name': 'simple_quic_tools',
-    #   'type': 'static_library',
-    #   'dependencies': [
-    #     'net',
-    #     '<(DEPTH)/base/base.gyp:base',
-    #     '<(DEPTH)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-    #     '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-    #     '<(DEPTH)/url/url.gyp:url',
-    #   ],
-    #   'sources': [
-    #   ],
-    # },
-    {
-      'target_name': 'net_unittests_deploy',
-      'type': 'none',
-      'dependencies': [
-        'net_unittests',
-      ],
-      'variables': {
-        'executable_name': 'net_unittests',
-      },
-      'includes': [ '../starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/net/url_request/url_request_context.cc b/net/url_request/url_request_context.cc
index 22f15bd..ad1f0b0 100644
--- a/net/url_request/url_request_context.cc
+++ b/net/url_request/url_request_context.cc
@@ -174,11 +174,9 @@
     HttpNetworkSession* network_session = transaction_factory->GetSession();
     if (network_session)
       network_session->DumpMemoryStats(pmd, dump->absolute_name());
-#ifndef HTTP_CACHE_DISABLED_FOR_STARBOARD
     HttpCache* http_cache = transaction_factory->GetCache();
     if (http_cache)
       http_cache->DumpMemoryStats(pmd, dump->absolute_name());
-#endif
   }
   if (cookie_store_) {
     cookie_store_->DumpMemoryStats(pmd, dump->absolute_name());
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
index 85f4722..c604d4f 100644
--- a/net/url_request/url_request_context_builder.cc
+++ b/net/url_request/url_request_context_builder.cc
@@ -587,7 +587,6 @@
         std::make_unique<HttpNetworkLayer>(storage->http_network_session());
   }
 
-#ifndef HTTP_CACHE_DISABLED_FOR_STARBOARD
   if (http_cache_enabled_) {
     std::unique_ptr<HttpCache::BackendFactory> http_cache_backend;
     if (http_cache_params_.type != HttpCacheParams::IN_MEMORY) {
@@ -624,7 +623,6 @@
         new HttpCache(std::move(http_transaction_factory),
                       std::move(http_cache_backend), true));
   }
-#endif  // HTTP_CACHE_DISABLED_FOR_STARBOARD
   storage->set_http_transaction_factory(std::move(http_transaction_factory));
 
   URLRequestJobFactoryImpl* job_factory = new URLRequestJobFactoryImpl;
diff --git a/net/url_request/url_request_http_job_unittest.cc b/net/url_request/url_request_http_job_unittest.cc
index 259883c..7a4afdd 100644
--- a/net/url_request/url_request_http_job_unittest.cc
+++ b/net/url_request/url_request_http_job_unittest.cc
@@ -282,7 +282,6 @@
   // When request fails due to proxy connection errors, the proxy server should
   // still be set on the |request|.
   EXPECT_EQ(proxy_server, request->proxy_server());
-#ifndef HTTP_CACHE_DISABLED_FOR_STARBOARD
   // This bool is set by HttpNetworkTransaction but not by HTTPCacheTransaction.
   // If Cobalt use HTTPNetworkLayer instead of HTTPCache as the transaction
   // factory, the behavior is then different in this case.
@@ -292,7 +291,6 @@
   // But since the request fails here, was_fetched_via_proxy is meaningless and
   // unimportant.
   EXPECT_FALSE(request->was_fetched_via_proxy());
-#endif
   EXPECT_EQ(0, request->received_response_content_length());
   EXPECT_EQ(CountWriteBytes(writes), request->GetTotalSentBytes());
   EXPECT_EQ(0, request->GetTotalReceivedBytes());
@@ -491,7 +489,7 @@
             network_delegate_.total_network_bytes_received());
 }
 
-#if !defined(HTTP_CACHE_DISABLED_FOR_STARBOARD)
+#if !defined(HTTP_CACHE_TESTING_DISABLED)
 TEST_F(URLRequestHttpJobWithMockSocketsTest, TestSuccessfulCachedHeadRequest) {
   // Cache the response.
   {
diff --git a/net/url_request/url_request_quic_unittest.cc b/net/url_request/url_request_quic_unittest.cc
index eb4b7ca..46e75a5 100644
--- a/net/url_request/url_request_quic_unittest.cc
+++ b/net/url_request/url_request_quic_unittest.cc
@@ -269,7 +269,7 @@
   EXPECT_EQ(kHelloBodyValue, delegate.data_received());
 }
 
-#if !defined(HTTP_CACHE_DISABLED_FOR_STARBOARD)
+#if !defined(HTTP_CACHE_TESTING_DISABLED)
 TEST_F(URLRequestQuicTest, CancelPushIfCached_SomeCached) {
   Init();
 
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 5a489ef..3f9f7ef 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -7936,7 +7936,7 @@
   EXPECT_EQ(0, d.received_redirect_count());
 }
 
-#if !defined(HTTP_CACHE_DISABLED_FOR_STARBOARD)
+#if !defined(HTTP_CACHE_TESTING_DISABLED)
 // Make sure redirects are cached, despite not reading their bodies.
 TEST_F(URLRequestTestHTTP, CacheRedirect) {
   ASSERT_TRUE(http_test_server()->Start());
@@ -8398,7 +8398,7 @@
   }
 }
 
-#if !defined(HTTP_CACHE_DISABLED_FOR_STARBOARD)
+#if !defined(HTTP_CACHE_TESTING_DISABLED)
 TEST_F(URLRequestTestHTTP, VaryHeader) {
   ASSERT_TRUE(http_test_server()->Start());
 
@@ -8561,7 +8561,7 @@
   }
 }
 
-#if !defined(HTTP_CACHE_DISABLED_FOR_STARBOARD)
+#if !defined(HTTP_CACHE_TESTING_DISABLED)
 // Tests that load timing works as expected with auth and the cache.
 TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) {
   ASSERT_TRUE(http_test_server()->Start());
@@ -9151,18 +9151,12 @@
       default_context().http_transaction_factory()->GetSession()));
   network_layer->OnSuspend();
 
-#ifndef HTTP_CACHE_DISABLED_FOR_STARBOARD
   HttpCache http_cache(std::move(network_layer),
                        HttpCache::DefaultBackend::InMemory(0),
                        false /* is_main_cache */);
-#endif
 
   TestURLRequestContext context(true);
-#ifdef HTTP_CACHE_DISABLED_FOR_STARBOARD
-  context.set_http_transaction_factory(network_layer.get());
-#else
   context.set_http_transaction_factory(&http_cache);
-#endif
   context.Init();
 
   TestDelegate d;
@@ -9255,7 +9249,7 @@
   EXPECT_TRUE(req->response_info().network_accessed);
 }
 
-#if !defined(HTTP_CACHE_DISABLED_FOR_STARBOARD)
+#if !defined(HTTP_CACHE_TESTING_DISABLED)
 TEST_F(URLRequestTestHTTP, NetworkAccessedClearOnCachedResponse) {
   ASSERT_TRUE(http_test_server()->Start());
 
@@ -12343,7 +12337,7 @@
     EXPECT_EQ("GET /cachetime HTTP/1.1\r\n", raw_req_headers.request_line());
     EXPECT_EQ(raw_resp_headers.get(), r->response_headers());
   }
-#if !defined(HTTP_CACHE_DISABLED_FOR_STARBOARD)
+#if !defined(HTTP_CACHE_TESTING_DISABLED)
   {
     std::unique_ptr<URLRequest> r(context.CreateRequest(
         url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -12490,7 +12484,7 @@
   EXPECT_FALSE(r2->is_pending());
   ASSERT_EQ(raw_req_headers.size(), 3u);
   ASSERT_EQ(raw_resp_headers.size(), 3u);
-#if !defined(HTTP_CACHE_DISABLED_FOR_STARBOARD)
+#if !defined(HTTP_CACHE_TESTING_DISABLED)
   // Google for the "If-None-Match" request header to see its relation to
   // HTTP cache.
   EXPECT_TRUE(raw_req_headers[2]->FindHeaderForTest("If-None-Match", &value));
diff --git a/precommit_hooks/gcheckstyle_wrapper.py b/precommit_hooks/gcheckstyle_wrapper.py
index 3d25352..42f8675 100755
--- a/precommit_hooks/gcheckstyle_wrapper.py
+++ b/precommit_hooks/gcheckstyle_wrapper.py
@@ -26,6 +26,9 @@
   gcheckstyle_args = sys.argv[1:]
   try:
     sys.exit(subprocess.call([checkstyle_path] + gcheckstyle_args))
-  except OSError:
+  except FileNotFoundError:
     print('Checkstyle not found, skipping.')
     sys.exit(0)
+  except OSError as e:
+    print('You may need to run gcert.')
+    raise e
diff --git a/requirements.txt b/requirements.txt
index ecfd514..35a4036 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,3 +3,4 @@
 pylint<3
 yapf<1
 requests==2.25.1
+jsonschema<5
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..855b071
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,24 @@
+[metadata]
+name = cobalt
+
+[tool:pytest]
+norecursedirs=
+  .*
+  build
+  cobalt/bindings
+  cobalt/black_box_tests/tests
+  cobalt/media_integration_tests
+  out
+  testing/android
+  testing/gtest
+  testing/gmock
+  third_party
+  tools/idl_parser
+  tools/lbshell/coverage
+
+# Ignore non-test files with test_* names that pytest would otherwise pick up.
+addopts=
+  --ignore-glob=**/test_filters.py
+  --ignore-glob=**/test_filter.py
+  --ignore-glob=**/test_runner.py
+  --ignore-glob=**/test_env.py
diff --git a/starboard/BUILD.gn b/starboard/BUILD.gn
index eefbcc9..741b336 100644
--- a/starboard/BUILD.gn
+++ b/starboard/BUILD.gn
@@ -150,7 +150,6 @@
     "string.h",
     "system.h",
     "thread.h",
-    "thread_types.h",
     "time.h",
     "time_zone.h",
     "types.h",
@@ -175,7 +174,5 @@
       ":starboard",
       "//testing/gmock",
     ]
-
-    content_deps = [ "//third_party/icu:icudata" ]
   }
 }
diff --git a/starboard/CHANGELOG.md b/starboard/CHANGELOG.md
index 450d514..0dfdc47 100644
--- a/starboard/CHANGELOG.md
+++ b/starboard/CHANGELOG.md
@@ -14,6 +14,16 @@
 can be found in the comments of the "Experimental Feature Defines" section of
 [configuration.h](configuration.h).
 
+### Deprecate the usage of SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT.
+The improvements on player creation and output mode query (like
+`SbPlayerCreationParam` and `SbPlayerGetPreferredOutputMode()`) are always
+enabled.  This change also deprecates `SbPlayerOutputModeSupported()`.
+
+### Deprecate the usage of SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT
+The extra parameters (like `profile` and `level`) on `SbMediaIsVideoSupported()`
+are always enabled.  This change also deprecated
+`SbMediaIsTransferCharacteristicsSupported()`.
+
 ## Version 13
 ### Changed lifecycle events to add support for a concealed state.
 
@@ -276,12 +286,6 @@
 A platform will define the extern constants declared in
 "starboard/configuration_constants.h". The definitions are done in
 "starboard/<PLATFORM_PATH>/configuration_constants.cc".
-
-The exact mapping between macros and extern variables can be found in
-"starboard/shared/starboard/configuration_constants_compatibility_defines.h"
-though the naming scheme is very nearly the same: the old SB_FOO macro will
-always become the constant kSbFoo.
-
 ### Improve player creation and output mode query.
 
 1. Introduce the new type SbPlayerCreationParam that holds the common
diff --git a/starboard/README.md b/starboard/README.md
index b8bc3fb..a9ea41f 100644
--- a/starboard/README.md
+++ b/starboard/README.md
@@ -7,28 +7,26 @@
 
 ## GN Migration Notice
 
-Cobalt and Starboard are currently migrating from the GYP build system to the GN
-build system. This readme contains instructions for both systems. As of now, GN
-is not ready for general use for Cobalt/Starboard. If you are not a core Cobalt
-developer, you should probably ignore the sections titled "GN Instructions" for
-now.
+Cobalt and Starboard have been migrated from the GYP build system to the GN
+build system. This readme only contains instructions for GN, as GYP is no
+longer supported.
 
 
 ## Documentation
 
-See [`src/starboard/doc`](doc) for more detailed documentation.
+See [`starboard/doc`](doc) for more detailed documentation.
 
 
 ## Interesting Source Locations
 
-All source locations are specified relative to `src/starboard/` (this directory).
+All source locations are specified relative to `starboard/` (this directory).
 
   * [`.`](.) - This is the root directory for the Starboard project, and
     contains all the public headers that Starboard defines.
   * [`examples/`](examples) - Example code demonstrating various aspects of
     Starboard API usage.
   * [`stub/`](stub) - The home of the Stub Starboard implementation. This
-    contains a `starboard_platform.gyp` file that defines a library with all the
+    contains a `BUILD.gn` file that defines a library with all the
     source files needed to provide a complete linkable Starboard implementation.
   * [`nplb/`](nplb) - "No Platform Left Behind," Starboard's platform
     verification test suite.
@@ -74,7 +72,7 @@
 
 To be perfectly compatible with the Cobalt source tree layout, any code that is
 written by a party that isn't the Cobalt team should be in the
-`src/third_party/` directory. The choice is up to you, but we recommend that you
+`third_party/` directory. The choice is up to you, but we recommend that you
 follow this practice, even if, as we expect to be common, you do not plan on
 sharing your Starboard implementation with anyone.
 
@@ -85,80 +83,60 @@
 
 We recommend that you place your code here in the source tree:
 
-    src/third_party/starboard/<family-name>/
+    third_party/starboard/<family-name>/
 
 With subdirectories:
 
   * `shared/` - For code shared between architectures within a product family.
   * `<binary-variant>/` - For any code that is specific to a specific binary
-    variant. Each one of these must at least have `configuration_public.h`,
-    `atomic_public.h`, `thread_types_public.h`, `gyp_configuration.py`,
-    `gyp_configuration.gypi`, and `starboard_platform.gyp` files.
+    variant. Each one of these must at least have `BUILD.gn`,
+    `configuration_public.h`, `atomic_public.h`,
+    `platform_configuration/BUILD.gn`,
+    `platform_configuration/configuration.gni`, and `toolchain/BUILD.gn` files.
 
 In the BobCo's BobBox example, we would see something like:
 
-  * `src/third_party/starboard/bobbox/`
+  * `third_party/starboard/bobbox/`
       * `shared/`
       * `armeb/`
+          * `platform_configuration/`
+            * `BUILD.gn`
+            * `configuration.gni`
+          * `toolchain/`
+            * `BUILD.gn`
           * `atomic_public.h`
+          * `BUILD.gn`
           * `configuration_public.h`
-          * `gyp_configuration.gypi`
-          * `gyp_configuration.py`
-          * `starboard_platform.gyp`
-          * `thread_types_public.h`
       * `armel/`
+          * `platform_configuration/`
+            * `BUILD.gn`
+            * `configuration.gni`
+          * `toolchain/`
+            * `BUILD.gn`
           * `atomic_public.h`
+          * `BUILD.gn`
           * `configuration_public.h`
-          * `gyp_configuration.gypi`
-          * `gyp_configuration.py`
-          * `starboard_platform.gyp`
-          * `thread_types_public.h`
 
 And so on.
 
-#### GN Instructions
-
-Each `<binary-variant>/` directory must have at least `configuration_public.h`,
-`atomic_public.h`, `thread_types_public.h`, `BUILD.gn`, `configuration.gni`,
-and `buildconfig.gni`.
-
-In the BobCo's BobBox example, we would see a directory tree like:
-
-  * `src/third_party/starboard/bobbox/`
-      * `shared/`
-      * `armeb/`
-          * `buildconfig.gni`
-          * `configuration.gni`
-          * `atomic_public.h`
-          * `BUILD.gn`
-          * `configuration_public.h`
-          * `thread_types_public.h`
-      * `armel/`
-          * `buildconfig.gni`
-          * `configuration.gni`
-          * `atomic_public.h`
-          * `BUILD.gn`
-          * `configuration_public.h`
-          * `thread_types_public.h`
-
 
 ### III. Base Your Port on a Reference Port
 
 You can start off by copying files from a reference port to your port's
 location. Currently these reference ports include:
 
-  * `src/starboard/stub`
-  * `src/starboard/linux`
-  * `src/starboard/raspi`
+  * `starboard/stub`
+  * `starboard/linux`
+  * `starboard/raspi`
 
-The `starboard_platform.gyp` contains absolute paths, so the paths will still be
+The platform's `BUILD.gn` contains absolute paths, so the paths will still be
 valid if you copy it to a new directory. You can then incrementally replace
 files with new implementations as necessary.
 
 The cleanest, simplest starting point is from the Stub reference
 implementation. Nothing will work, but you should be able to compile and link it
 with your toolchain. You can then replace stub implementations with
-implementations from `src/starboard/shared` or your own custom implementations
+implementations from `starboard/shared` or your own custom implementations
 module-by-module, until you have gone through all modules.
 
 You may also choose to copy either the Desktop Linux or Raspberry Pi ports and
@@ -166,142 +144,80 @@
 
 For example, for `bobbox-armel`, you might do:
 
-    mkdir -p src/third_party/starboard/bobbox
-    cp -R src/starboard/stub src/third_party/starboard/bobbox/armel
+    mkdir -p third_party/starboard/bobbox
+    cp -R starboard/stub third_party/starboard/bobbox/armel
 
 Modify the files in `<binary-variant>/` as appropriate (you will probably be
 coming back to these files a lot).
 
-Update `<binary-variant>/starboard_platform.gyp` to point at all the source
-files that you want to build as your new Starboard implementation. The
-`'<(DEPTH)'` expression in GYP expands to enough `../`s to take you to the
-`src/` directory of your source tree. Otherwise, files are assumed to be
-relative to the directory the `.gyp` or `.gypi` file is in.
-
-In order to use a new platform configuration in a build, you need to ensure that
-you have a `gyp_configuration.py`, `gyp_configuration.gypi`, and
-`starboard_platform.gyp` in their own directory for each binary variant, plus
-the header files `configuration_public.h`, `atomic_public.h`, and
-`thread_types_public.h`. `gyp_cobalt` will scan your directories for these
-files, and then calculate a port name based on the directories between
-`src/third_party/starboard` and your `gyp_configuration.*` files. (e.g. for
-`src/third_party/starboard/bobbox/armeb/gyp_configuration.py`, it would choose
-the platform configuration name `bobbox-armeb`.)
-
-#### GN Instructions
-
 Update `<binary-variant>/BUILD.gn` to point at all the source files that you
 want to build as your new Starboard implementation. The `//` expression in GN
-refers to the `src/` directory of your source tree. Otherwise, files are assumed
-to be relative to the directory the `BUILD.gn` or `.gni` file is in. The
-`BUILD.gn` file contains absolute paths, so the paths will still be valid if you
-copy it to a new directory. You can then incrementally replace files with new
-implementations as necessary.
+refers to the top-level directory of your source tree. Otherwise, files are
+assumed to be relative to the directory the `BUILD.gn` or `.gni` file is in.
+The `BUILD.gn` file contains absolute paths, so the paths will still be valid
+if you copy it to a new directory. You can then incrementally replace files
+with new implementations as necessary.
 
 In order to use a new platform configuration in a build, you need to ensure that
-you have a `BUILD.gn`, `configuration.gni`, and `buildconfig.gni` in their
-own directory for each binary variant, plus the header files
-`configuration_public.h`, `atomic_public.h`, and `thread_types_public.h`. The GN
-build will scan your directories for these files, and then calculate a port name
-based on the directories between `src/third_party/starboard` and your
-`configuration.gni` files. (e.g. for
-`src/third_party/starboard/bobbox/armeb/configuration.gni`, it would choose the
-platform configuration name `bobbox-armeb`.)
+you have a `BUILD.gn`, `toolchain/BUILD.gn`,
+`platform_configuration/configuration.gni`, and
+`platform_configuration/BUILD.gn` in their own directory for each binary
+variant, plus the header files `configuration_public.h` and `atomic_public.h`.
+You must add your platform name to `starboard/build/platforms.py` along with
+the path to the port to be able to build it.
 
 
 ### IV. A New Port, Step-by-Step
 
-  1. Recursively copy `src/starboard/stub` to
-     `src/third_party/starboard/<family-name>/<binary-variant>`.  You may also
+  1. Recursively copy `starboard/stub` to
+     `third_party/starboard/<family-name>/<binary-variant>`.  You may also
      consider copying from another reference platform, like `raspi-2` or
      `linux-x64x11`.
-  1. In `gyp_configuration.py`
-      1. In the `CreatePlatformConfig()` function, pass your
-         `<platform-configuration>` as the parameter to the PlatformConfig
-         constructor, like `return PlatformConfig('bobbox-armeb')`.
-      1. In `GetVariables`
-          1. Set `'clang': 1` if your toolchain is clang.
-          1. Delete other variables in that function that are not needed for
-             your platform.
-      1. In `GetEnvironmentVariables`, set the dictionary values to point to the
-         toolchain analogs for the toolchain for your platform.
-  1. In `gyp_configuration.gypi`
-      1. Update the names of the configurations and the default_configuration to
-         be `<platform-configuration>_<build-type>` for your platform
-         configuration name, where `<build-type>` is one of `debug`, `devel`,
-         `qa`, `gold`.
-      1. Update your platform variables.
-          1. Set `'target_arch'` to your architecture: `'arm'`,
-             `'x64'`, `'x86'`
-          1. Set `'target_os': 'linux'` if your platform is Linux-based.
-          1. Set `'gl_type': 'system_gles2'` if you are using the system EGL +
-             GLES2 implementation.
-          1. Set `'in_app_dial'` to `1` or `0`. This enables or disables the
-             DIAL server that runs inside Cobalt, only when Cobalt is
-             running. You do not want in-app DIAL if you already have
-             system-wide DIAL support.
+  1. Add your platform and path to `starboard/build/platforms.py`.
+  1. In `platform_configuration/configuration.gni`
+      1. Delete variables in the file that are not needed for your platform.
+      1. Set `gl_type` to the appropriate value if it is not the default
+         `system_gles2`.
+      1. Set `enable_in_app_dial` to `true` or `false`. This enables or
+         disables the DIAL server that runs inside Cobalt, only when Cobalt is
+         running. You do not want in-app DIAL if you already have system-wide
+         DIAL support.
+  1. In `platform_configuration/BUILD.gn`
       1. Update your toolchain command-line flags and libraries. Make sure you
          don't assume a particular workstation layout, as it is likely to be
          different for someone else.
-      1. Update the global defines in `'target_defaults'.'defines'`, if
-         necessary.
+  1. In `toolchain/BUILD.gn`
+      1. Either use the `clang_toolchain` template and pass the base path to
+         your toolchain, or use the `gcc_toolchain` and pass the full path to
+         each tool you use.
+      1. Set `is_clang = true` in `toolchain_args` in `gcc_toolchain` if the
+         toolchain uses clang.
   1. Go through `configuration_public.h` and adjust all the configuration values
      as appropriate for your platform.
-  1. Update `starboard_platform.gyp` to point at all the source files you want
-     to build as part of your new Starboard implementation (as mentioned above).
-  1. Update `atomic_public.h` and `thread_types_public.h` as necessary to point
+  1. Update `BUILD.gn` to point at all the source files you want to build as
+     part of your new Starboard implementation (as mentioned above).
+  1. Update `atomic_public.h` as necessary to point
      at the appropriate shared or custom implementations.
 
+If you want to use `cobalt/build/gn.py`, you'll also need a
+`third_party/starboard/<family-name>/<binary-variant>/args.gn` file. This
+should contain the gn arguments necessary to build your platform. Pay
+particular attention to `target_platform`, `target_os`, `target_cpu`, and
+`is_clang`. The defaults for each can be found in
+`starboard/build/config/BUILDCONFIG.gn`. If you don't care about using `gn.py`,
+all of these arguments can be passed using `gn args` or `gn gen` with `--args`.
+For example, the first command below might instead look like
+`gn gen out/bobbox-armeb_debug --args='target_platform="bobbox-armeb" build_type="debug"'`.
 
-You should now be able to run gyp with your new port. From your `src/` directory:
+You should now be able to run GN with your new port. From your the top level
+directory:
 
-    $ cobalt/build/gyp_cobalt -C debug bobbox-armeb
+    $ python cobalt/build/gn.py -c debug -p bobbox-armeb
     $ ninja -C out/bobbox-armeb_debug nplb
 
 This will attempt to build the "No Platform Left Behind" test suite with your
 new Starboard implementation, and you are ready to start porting!
 
-#### GN Instructions
-
-Follow the above list, except:
-
-  1. Ignore the steps about `gyp_configuration.py` and `gyp_configuration.gypi`.
-  1. Update `BUILD.gn` instead of `starboard_platform.gyp`.
-  1. Also in `BUILD.gn`:
-      1. Update your toolchain command-line flags and libraries, for all
-         configurations as well as for each individual configuration.
-      1. Implement generic compiler configs such as `sb_pedantic_warnings`
-         and `rtti`.
-      1. If you're not using a predefined toolchain, define one.
-  1. In `buildconfig.gni`:
-      1. If your platform is Linux-based, set `target_os_ = "linux"`.
-      1. Set `target_cpu_` to your target architecture (e.g. `arm`,
-         `x64`, `x86`).
-      1. Set the target and host toolchains. If you defined a target
-         toolchain in `BUILD.gn`, you'll want to set it to that.
-  1. In `configuration.gni`, set platform-specific defaults for any
-     variables that should be overridden for your Starboard platform.  You
-     can find a list of such variables at `//cobalt/build/config/base.gni`
-     and `//starboard/build/config/base.gni`.
-
-
-You should now be able to run GN with your new port. From your `src/` directory:
-
-    $ gn args out/bobbox-armeb_debug
-
-An editor will open up. Type into the editor:
-
-    cobalt_config = "debug"
-    target_platform = "bobbox-armeb"
-
-Save and close the editor. Then run
-
-    $ ninja -C out/bobbox-armeb_debug nplb
-
-This will attempt to build the "No Platform Left Behind" test suite with your
-new Starboard implementation, and you are ready to start porting!
-
-
 ## Suggested Implementation Order
 
 When bringing up a new Starboard platform, it is suggested that you try to get
diff --git a/starboard/_env.py b/starboard/_env.py
deleted file mode 100644
index 332eabc..0000000
--- a/starboard/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source  # pylint: disable=deprecated-module
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print('%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV))
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/accessibility.h b/starboard/accessibility.h
index 470dd65..4a5c2ba 100644
--- a/starboard/accessibility.h
+++ b/starboard/accessibility.h
@@ -63,7 +63,6 @@
 SB_EXPORT bool SbAccessibilityGetDisplaySettings(
     SbAccessibilityDisplaySettings* out_settings);
 
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 // Enum for possible closed captioning character edge styles.
 typedef enum SbAccessibilityCaptionCharacterEdgeStyle {
   kSbAccessibilityCaptionCharacterEdgeStyleNone,
@@ -224,8 +223,6 @@
 //    or off (false).
 SB_EXPORT bool SbAccessibilitySetCaptionsEnabled(bool enabled);
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
-
 #ifdef __cplusplus
 }  // extern "C"
 #endif
diff --git a/starboard/android/apk/BUILD.gn b/starboard/android/apk/BUILD.gn
deleted file mode 100644
index cd95c13..0000000
--- a/starboard/android/apk/BUILD.gn
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-action("apk_sources") {
-  script = "//starboard/build/touch.py"
-  sources = [ "cobalt-gradle.sh" ]
-  outputs = [ "$root_out_dir/gradle/apk_sources.stamp" ]
-  args = rebase_path(outputs, root_build_dir)
-}
diff --git a/starboard/android/apk/apk.gyp b/starboard/android/apk/apk.gyp
deleted file mode 100644
index 26e8f54..0000000
--- a/starboard/android/apk/apk.gyp
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'targets': [
-    {
-      # This target generates a stamp file that the platform deploy action can
-      # depend on to re-run the Gradle build only when any file that's checked
-      # into git within the 'apk' directory changes.
-      'target_name': 'apk_sources',
-      'type': 'none',
-      'actions': [
-        {
-          'action_name': 'apk_sources',
-          'inputs': [ '<!@(git -C <(DEPTH)/starboard/android/apk ls-files)' ],
-          'outputs': [ '<(PRODUCT_DIR)/gradle/apk_sources.stamp' ],
-          'action': [ 'touch', '<@(_outputs)' ],
-        }
-      ]
-    }
-  ]
-}
diff --git a/starboard/android/apk/apk_sources.gni b/starboard/android/apk/apk_sources.gni
new file mode 100644
index 0000000..e0378ea
--- /dev/null
+++ b/starboard/android/apk/apk_sources.gni
@@ -0,0 +1,63 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# The java files that are compiled and packaged into the Cobalt apk.
+# This list is only used to tell GN which files are included. Gradle will
+# package all files under //starboard/android/apk/app.
+apk_sources = [
+  "//starboard/android/apk/app/src/app/java/dev/cobalt/app/CobaltApplication.java",
+  "//starboard/android/apk/app/src/app/java/dev/cobalt/app/MainActivity.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/account/AccessToken.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/account/NoopUserAuthorizer.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/account/UserAuthorizer.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/account/UserAuthorizerImpl.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/AudioPermissionRequester.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltA11yHelper.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltHttpHelper.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltService.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltSystemConfigChangeReceiver.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltTextToSpeechHelper.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/ErrorDialog.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardEditor.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardInputConnection.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/NetworkStatus.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/PlatformError.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/ResourceOverlay.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/libraries/services/clientloginfo/ClientLogInfo.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/libraries/services/clientloginfo/ClientLogInfoModule.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/ArtworkLoader.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioOutputManager.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/AudioTrackBridge.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/CaptionSettings.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/CobaltMediaSession.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/Log.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecUtil.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaImage.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoFrameReleaseTimeHelper.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoSurfaceTexture.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoSurfaceView.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/storage/CobaltStorageLoader.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/storage/StorageProto.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/util/DisplayUtil.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/util/Holder.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/util/IsEmulator.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/util/Log.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/util/SystemPropertiesHelper.java",
+  "//starboard/android/apk/app/src/main/java/dev/cobalt/util/UsedByNative.java",
+]
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java
index d9082da..a858ea3 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java
@@ -25,6 +25,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.util.Pair;
+import android.view.View;
 import android.view.ViewGroup.LayoutParams;
 import android.view.ViewParent;
 import android.widget.FrameLayout;
@@ -33,7 +34,6 @@
 import dev.cobalt.util.DisplayUtil;
 import dev.cobalt.util.Log;
 import dev.cobalt.util.UsedByNative;
-import java.security.Timestamp;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -143,6 +143,10 @@
     if (VideoSurfaceView.getCurrentSurface() != null) {
       forceCreateNewVideoSurfaceView = true;
     }
+
+    // Set the SurfaceView to fullscreen.
+    View rootView = getWindow().getDecorView();
+    setVideoSurfaceBounds(0, 0, rootView.getWidth(), rootView.getHeight());
   }
 
   @Override
@@ -298,6 +302,10 @@
   }
 
   public void setVideoSurfaceBounds(final int x, final int y, final int width, final int height) {
+    if (width == 0 || height == 0) {
+      // The SurfaceView should be covered by our UI layer in this case.
+      return;
+    }
     runOnUiThread(
         new Runnable() {
           @Override
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/ResourceOverlay.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/ResourceOverlay.java
new file mode 100644
index 0000000..f14abec
--- /dev/null
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/ResourceOverlay.java
@@ -0,0 +1,40 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package dev.cobalt.coat;
+
+import android.content.Context;
+import dev.cobalt.util.UsedByNative;
+
+/**
+ * A class for managing the resource overlays of Cobalt. Client can turn on certain feature by
+ * setting the resource overlay.
+ */
+public class ResourceOverlay {
+  // To facilitate maintenance, these member names should match what is in the
+  // resource XML file.
+  @SuppressWarnings("MemberName")
+  @UsedByNative
+  public final boolean supports_spherical_videos;
+
+  public final int max_video_buffer_budget;
+
+  public ResourceOverlay(Context context) {
+    // Load the values for all Overlay variables.
+    this.supports_spherical_videos =
+        context.getResources().getBoolean(R.bool.supports_spherical_videos);
+    this.max_video_buffer_budget =
+        context.getResources().getInteger(R.integer.max_video_buffer_budget);
+  }
+}
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java
index 408ada0..62165b2 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java
@@ -32,6 +32,7 @@
 import android.net.NetworkCapabilities;
 import android.os.Build;
 import android.os.Build.VERSION;
+import android.util.Pair;
 import android.util.Size;
 import android.util.SizeF;
 import android.view.Display;
@@ -51,8 +52,16 @@
 import dev.cobalt.util.Log;
 import dev.cobalt.util.UsedByNative;
 import java.lang.reflect.Method;
+import java.net.InterfaceAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Calendar;
+import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Locale;
+import java.util.Set;
+import java.util.TimeZone;
 
 /** Implementation of the required JNI methods called by the Starboard C++ code. */
 public class StarboardBridge {
@@ -72,6 +81,7 @@
   private AudioPermissionRequester audioPermissionRequester;
   private KeyboardEditor keyboardEditor;
   private NetworkStatus networkStatus;
+  private ResourceOverlay resourceOverlay;
 
   static {
     // Even though NativeActivity already loads our library from C++,
@@ -97,8 +107,13 @@
   private final HashMap<String, CobaltService.Factory> cobaltServiceFactories = new HashMap<>();
   private final HashMap<String, CobaltService> cobaltServices = new HashMap<>();
 
+  private static final TimeZone DEFAULT_TIME_ZONE = TimeZone.getTimeZone("America/Los_Angeles");
   private final long timeNanosecondsPerMicrosecond = 1000;
 
+  private Set<Integer> supportedHdrTypesSet = new HashSet<Integer>();
+  private long supportedHdrTypesSetUpdatedAt = 0;
+  private final long supportedHdrTypesCacheTtlMs = 1000;
+
   public StarboardBridge(
       Context appContext,
       Holder<Activity> activityHolder,
@@ -124,6 +139,7 @@
         new CobaltMediaSession(appContext, activityHolder, audioOutputManager);
     this.audioPermissionRequester = new AudioPermissionRequester(appContext, activityHolder);
     this.networkStatus = new NetworkStatus(appContext);
+    this.resourceOverlay = new ResourceOverlay(appContext);
   }
 
   private native boolean nativeInitialize();
@@ -357,13 +373,68 @@
     return appContext.getCacheDir().getAbsolutePath();
   }
 
+  /**
+   * Returns non-loopback network interface address and its netmask, or null if none.
+   *
+   * <p>A Java function to help implement Starboard's SbSocketGetLocalInterfaceAddress.
+   */
+  @SuppressWarnings("unused")
+  @UsedByNative
+  Pair<byte[], byte[]> getLocalInterfaceAddressAndNetmask(boolean wantIPv6) {
+    try {
+      Enumeration<NetworkInterface> it = NetworkInterface.getNetworkInterfaces();
+
+      while (it.hasMoreElements()) {
+        NetworkInterface ni = it.nextElement();
+        if (ni.isLoopback()) {
+          continue;
+        }
+        if (!ni.isUp()) {
+          continue;
+        }
+        if (ni.isPointToPoint()) {
+          continue;
+        }
+
+        for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
+          byte[] address = ia.getAddress().getAddress();
+          boolean isIPv6 = (address.length > 4);
+          if (isIPv6 == wantIPv6) {
+            // Convert the network prefix length to a network mask.
+            int prefix = ia.getNetworkPrefixLength();
+            byte[] netmask = new byte[address.length];
+            for (int i = 0; i < netmask.length; i++) {
+              if (prefix == 0) {
+                netmask[i] = 0;
+              } else if (prefix >= 8) {
+                netmask[i] = (byte) 0xFF;
+                prefix -= 8;
+              } else {
+                netmask[i] = (byte) (0xFF << (8 - prefix));
+                prefix = 0;
+              }
+            }
+            return new Pair<>(address, netmask);
+          }
+        }
+      }
+    } catch (SocketException ex) {
+      // TODO should we have a logging story that strips logs for production?
+      Log.w(TAG, "sbSocketGetLocalInterfaceAddress exception", ex);
+      return null;
+    }
+    return null;
+  }
+
   @SuppressWarnings("unused")
   @UsedByNative
   CobaltTextToSpeechHelper getTextToSpeechHelper() {
     return ttsHelper;
   }
 
-  /** @return A new CaptionSettings object with the current system caption settings. */
+  /**
+   * @return A new CaptionSettings object with the current system caption settings.
+   */
   @SuppressWarnings("unused")
   @UsedByNative
   CaptionSettings getCaptionSettings() {
@@ -381,6 +452,18 @@
 
   @SuppressWarnings("unused")
   @UsedByNative
+  String getTimeZoneId() {
+    Locale locale = Locale.getDefault();
+    Calendar calendar = Calendar.getInstance(locale);
+    TimeZone timeZone = DEFAULT_TIME_ZONE;
+    if (calendar != null) {
+      timeZone = calendar.getTimeZone();
+    }
+    return timeZone.getID();
+  }
+
+  @SuppressWarnings("unused")
+  @UsedByNative
   SizeF getDisplayDpi() {
     return DisplayUtil.getDisplayDpi();
   }
@@ -391,6 +474,12 @@
     return DisplayUtil.getSystemDisplaySize();
   }
 
+  @SuppressWarnings("unused")
+  @UsedByNative
+  public ResourceOverlay getResourceOverlay() {
+    return resourceOverlay;
+  }
+
   @Nullable
   private static String getSystemProperty(String name) {
     try {
@@ -486,7 +575,9 @@
     return audioManager.isMicrophoneMute();
   }
 
-  /** @return true if we have an active network connection and it's on an wireless network. */
+  /**
+   * @return true if we have an active network connection and it's on an wireless network.
+   */
   @SuppressWarnings("unused")
   @UsedByNative
   boolean isCurrentNetworkWireless() {
@@ -640,6 +731,36 @@
     }
   }
 
+  long supportedHdrTypesSetUpdatedAtNs;
+
+  private void refreshHdrTypesCacheIfNecessary() {
+    if (System.currentTimeMillis() - supportedHdrTypesSetUpdatedAt < supportedHdrTypesCacheTtlMs) {
+      // Cache is up to date.
+      return;
+    }
+    supportedHdrTypesSet.clear();
+    supportedHdrTypesSetUpdatedAt = System.currentTimeMillis();
+
+    Display defaultDisplay = DisplayUtil.getDefaultDisplay();
+    if (defaultDisplay == null) {
+      return;
+    }
+
+    Display.HdrCapabilities hdrCapabilities = defaultDisplay.getHdrCapabilities();
+    if (hdrCapabilities == null) {
+      return;
+    }
+
+    int[] supportedHdrTypes = hdrCapabilities.getSupportedHdrTypes();
+    if (supportedHdrTypes == null) {
+      return;
+    }
+
+    for (int supportedType : supportedHdrTypes) {
+      supportedHdrTypesSet.add(supportedType);
+    }
+  }
+
   /**
    * Check if hdrType is supported by the current default display. See
    * https://developer.android.com/reference/android/view/Display.HdrCapabilities.html for valid
@@ -653,27 +774,10 @@
       return false;
     }
 
-    Display defaultDisplay = DisplayUtil.getDefaultDisplay();
-    if (defaultDisplay == null) {
-      return false;
+    synchronized (this) {
+      refreshHdrTypesCacheIfNecessary();
+      return supportedHdrTypesSet.contains(hdrType);
     }
-
-    Display.HdrCapabilities hdrCapabilities = defaultDisplay.getHdrCapabilities();
-    if (hdrCapabilities == null) {
-      return false;
-    }
-
-    int[] supportedHdrTypes = hdrCapabilities.getSupportedHdrTypes();
-    if (supportedHdrTypes == null) {
-      return false;
-    }
-
-    for (int supportedType : supportedHdrTypes) {
-      if (supportedType == hdrType) {
-        return true;
-      }
-    }
-    return false;
   }
 
   /** Return the CobaltMediaSession. */
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
index 4dd5674..9012df2 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java
@@ -588,6 +588,7 @@
       String mime,
       boolean mustSupportSecure,
       boolean mustSupportSoftwareCodec,
+      boolean forceImprovedSupportCheck,
       int width,
       int height,
       int fps,
@@ -609,10 +610,12 @@
             mustSupportHdr,
             mustSupportSoftwareCodec,
             mustSupportTunneled,
-            0,
-            0,
-            0,
-            0);
+            forceImprovedSupportCheck,
+            -1 /* decoderCacheTtlMs */,
+            0 /* frameWidth */,
+            0 /* frameHeight */,
+            0 /* bitrate */,
+            0 /* fps */);
     if (findVideoDecoderResult.name.equals("") && mustSupportHdr) {
       // On second pass, forget HDR.
       findVideoDecoderResult =
@@ -622,10 +625,12 @@
               false /* mustSupportHdr */,
               mustSupportSoftwareCodec,
               mustSupportTunneled,
-              0,
-              0,
-              0,
-              0);
+              forceImprovedSupportCheck,
+              -1 /* decoderCacheTtlMs */,
+              0 /* frameWidth */,
+              0 /* frameHeight */,
+              0 /* bitrate */,
+              0 /* fps */);
     }
     try {
       String decoderName = findVideoDecoderResult.name;
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecUtil.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecUtil.java
index e2632dd..bd1461e 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecUtil.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecUtil.java
@@ -43,7 +43,6 @@
   private static final Map<String, Set<String>> vp9AllowList = new HashMap<>();
   // An allow list of software codec names that can be used.
   private static final Set<String> softwareCodecAllowList = new HashSet<>();
-
   // Whether we should report vp9 codecs as supported or not.  Will be set
   // based on whether vp9AllowList contains our brand/model.  If this is set
   // to true, then videoCodecDenyList will be ignored.
@@ -397,6 +396,8 @@
       boolean mustSupportSecure,
       boolean mustSupportHdr,
       boolean mustSupportTunnelMode,
+      boolean forceImprovedSupportCheck,
+      int decoderCacheTtlMs,
       int frameWidth,
       int frameHeight,
       int bitrate,
@@ -408,12 +409,13 @@
             mustSupportHdr,
             false /* mustSupportSoftwareCodec */,
             mustSupportTunnelMode,
+            forceImprovedSupportCheck,
+            decoderCacheTtlMs,
             frameWidth,
             frameHeight,
             bitrate,
             fps);
-    return !findVideoDecoderResult.name.equals("")
-        && (!mustSupportHdr || isHdrCapableVideoDecoder(mimeType, findVideoDecoderResult));
+    return !findVideoDecoderResult.name.isEmpty();
   }
 
   /**
@@ -427,13 +429,9 @@
     return !findAudioDecoder(mimeType, bitrate, mustSupportTunnelMode).equals("");
   }
 
-  /**
-   * Determine whether the system has a decoder capable of playing HDR. Currently VP9 and AV1 are
-   * HDR supported codecs
-   */
-  @SuppressWarnings("unused")
-  @UsedByNative
-  public static boolean hasHdrCapableVideoDecoder(String mimeType) {
+  /** Determine whether findVideoDecoderResult is capable of playing HDR. */
+  public static boolean isHdrCapableVideoDecoder(
+      String mimeType, FindVideoDecoderResult findVideoDecoderResult) {
     // VP9Profile* values were not added until API level 24.  See
     // https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel.html.
     if (Build.VERSION.SDK_INT < 24) {
@@ -445,14 +443,6 @@
       return false;
     }
 
-    FindVideoDecoderResult findVideoDecoderResult =
-        findVideoDecoder(mimeType, false, true, false, false, 0, 0, 0, 0);
-    return isHdrCapableVideoDecoder(mimeType, findVideoDecoderResult);
-  }
-
-  /** Determine whether findVideoDecoderResult is capable of playing HDR */
-  public static boolean isHdrCapableVideoDecoder(
-      String mimeType, FindVideoDecoderResult findVideoDecoderResult) {
     CodecCapabilities codecCapabilities = findVideoDecoderResult.codecCapabilities;
     if (codecCapabilities == null) {
       return false;
@@ -478,8 +468,11 @@
   }
 
   /**
-   * The same as hasVideoDecoderFor, only return the name of the video decoder if it is found, and
-   * "" otherwise.
+   * The same as hasVideoDecoderFor, returns a FindVideoDecoderResult constructed from the video
+   * decoder if it is found, or an empty instance otherwise.
+   *
+   * <p>NOTE: This code path is called repeatedly by the player to determine the decoding
+   * capabilities of the device. To ensure speedy playback the code below should be kept performant.
    */
   public static FindVideoDecoderResult findVideoDecoder(
       String mimeType,
@@ -487,16 +480,18 @@
       boolean mustSupportHdr,
       boolean mustSupportSoftwareCodec,
       boolean mustSupportTunnelMode,
+      boolean forceImprovedSupportCheck,
+      int decoderCacheTtlMs,
       int frameWidth,
       int frameHeight,
       int bitrate,
       int fps) {
-    Log.v(
-        TAG,
+    String decoderInfo =
         String.format(
-            "Searching for video decoder with parameters mimeType: %s, secure: %b, frameWidth: %d,"
-                + " frameHeight: %d, bitrate: %d, fps: %d, mustSupportHdr: %b,"
-                + " mustSupportSoftwareCodec: %b, mustSupportTunnelMode: %b",
+            "Searching for video decoder with parameters mimeType: %s, secure: %b, frameWidth:"
+                + " %d, frameHeight: %d, bitrate: %d, fps: %d, mustSupportHdr: %b,"
+                + " mustSupportSoftwareCodec: %b, mustSupportTunnelMode: %b,"
+                + " forceImprovedSupportCheck: %b",
             mimeType,
             mustSupportSecure,
             frameWidth,
@@ -505,195 +500,182 @@
             fps,
             mustSupportHdr,
             mustSupportSoftwareCodec,
-            mustSupportTunnelMode));
-    Log.v(
-        TAG,
+            mustSupportTunnelMode,
+            forceImprovedSupportCheck);
+    Log.v(TAG, decoderInfo);
+    String deviceInfo =
         String.format(
             "brand: %s, model: %s, version: %s, API level: %d, isVp9AllowListed: %b",
             Build.BRAND,
             Build.MODEL,
             Build.VERSION.RELEASE,
             Build.VERSION.SDK_INT,
-            isVp9AllowListed));
+            isVp9AllowListed);
+    Log.v(TAG, deviceInfo);
 
-    // Note: MediaCodecList is sorted by the framework such that the best decoders come first.
-    for (MediaCodecInfo info : new MediaCodecList(MediaCodecList.ALL_CODECS).getCodecInfos()) {
-      if (info.isEncoder()) {
+    for (VideoDecoderCache.CachedDecoder decoder :
+        VideoDecoderCache.getCachedDecoders(mimeType, decoderCacheTtlMs)) {
+      String name = decoder.info.getName();
+      if (mustSupportSoftwareCodec && !softwareCodecAllowList.contains(name)) {
+        Log.v(TAG, "Rejecting " + name + ", reason: require software codec");
         continue;
       }
-      for (String supportedType : info.getSupportedTypes()) {
-        if (!supportedType.equalsIgnoreCase(mimeType)) {
+      if (!isVp9AllowListed && videoCodecDenyList.contains(name)) {
+        Log.v(TAG, "Rejecting " + name + ", reason: codec is on deny list");
+        continue;
+      }
+
+      // MediaCodecList is supposed to feed us names of decoders that do NOT end in ".secure".  We
+      // are then supposed to check if FEATURE_SecurePlayback is supported, and if it is and we
+      // want a secure codec, we append ".secure" ourselves, and then pass that to
+      // MediaCodec.createDecoderByName.  Some devices, do not follow this spec, and show us
+      // decoders that end in ".secure".  Empirically, FEATURE_SecurePlayback has still been
+      // correct when this happens.
+      if (name.endsWith(SECURE_DECODER_SUFFIX)) {
+        // If we don't want a secure decoder, then don't bother messing around with this thing.
+        if (!mustSupportSecure) {
+          Log.v(TAG, "Rejecting " + name + ", reason: want !secure decoder and ends with .secure");
           continue;
         }
-        String name = info.getName();
-        if (mustSupportSoftwareCodec && !softwareCodecAllowList.contains(name)) {
-          Log.v(TAG, String.format("Rejecting %s, reason: require software codec", name));
-          continue;
+        // If we want a secure decoder, then make sure the version without ".secure" isn't
+        // denylisted.
+        String nameWithoutSecureSuffix =
+            name.substring(0, name.length() - SECURE_DECODER_SUFFIX.length());
+        if (!isVp9AllowListed && videoCodecDenyList.contains(nameWithoutSecureSuffix)) {
+          Log.v(TAG, "Rejecting " + name + ", reason: denylisted secure decoder");
         }
-        if (!isVp9AllowListed && videoCodecDenyList.contains(name)) {
-          Log.v(TAG, String.format("Rejecting %s, reason: codec is on deny list", name));
-          continue;
-        }
-        // MediaCodecList is supposed to feed us names of decoders that do NOT end in ".secure".  We
-        // are then supposed to check if FEATURE_SecurePlayback is supported, and it if is and we
-        // want a secure codec, we append ".secure" ourselves, and then pass that to
-        // MediaCodec.createDecoderByName.  Some devices, do not follow this spec, and show us
-        // decoders that end in ".secure".  Empirically, FEATURE_SecurePlayback has still been
-        // correct when this happens.
-        if (name.endsWith(SECURE_DECODER_SUFFIX)) {
-          // If we don't want a secure decoder, then don't bother messing around with this thing.
-          if (!mustSupportSecure) {
-            String format = "Rejecting %s, reason: want !secure decoder and ends with .secure";
-            Log.v(TAG, String.format(format, name));
+      }
+
+      boolean requiresSecurePlayback =
+          decoder.codecCapabilities.isFeatureRequired(
+              MediaCodecInfo.CodecCapabilities.FEATURE_SecurePlayback);
+      boolean supportsSecurePlayback =
+          decoder.codecCapabilities.isFeatureSupported(
+              MediaCodecInfo.CodecCapabilities.FEATURE_SecurePlayback);
+      if (mustSupportSecure && supportsSecurePlayback
+          || !mustSupportSecure && requiresSecurePlayback) {
+        String message =
+            String.format(
+                "Rejecting %s, reason: secure decoder requested: %b, "
+                    + "codec FEATURE_SecurePlayback supported: %b, required: %b",
+                name, mustSupportSecure, supportsSecurePlayback, requiresSecurePlayback);
+        Log.v(TAG, message);
+        continue;
+      }
+
+      boolean requiresTunneledPlayback =
+          decoder.codecCapabilities.isFeatureRequired(
+              MediaCodecInfo.CodecCapabilities.FEATURE_TunneledPlayback);
+      boolean supportsTunneledPlayback =
+          decoder.codecCapabilities.isFeatureSupported(
+              MediaCodecInfo.CodecCapabilities.FEATURE_TunneledPlayback);
+      if (mustSupportTunnelMode && !supportsTunneledPlayback
+          || !mustSupportTunnelMode && requiresTunneledPlayback) {
+        String message =
+            String.format(
+                "Rejecting %s, reason: tunneled playback requested: %b, "
+                    + "codec FEATURE_TunneledPlayback supported: %b, required: %b",
+                name, mustSupportTunnelMode, supportsTunneledPlayback, requiresTunneledPlayback);
+        Log.v(TAG, message);
+        continue;
+      }
+
+      // VideoCapabilities is not implemented correctly on this device.
+      if (Build.VERSION.SDK_INT < 23
+          && Build.MODEL.equals("MIBOX3")
+          && name.equals("OMX.amlogic.vp9.decoder.awesome")
+          && (frameWidth > 1920 || frameHeight > 1080)) {
+        Log.v(TAG, "Skipping >1080p OMX.amlogic.vp9.decoder.awesome on mibox.");
+        continue;
+      }
+
+      VideoCapabilities videoCapabilities = decoder.videoCapabilities;
+      Range<Integer> supportedWidths = decoder.supportedWidths;
+      Range<Integer> supportedHeights = decoder.supportedHeights;
+
+      // Enable the improved support check based on more specific APIs, like isSizeSupported() or
+      // areSizeAndRateSupported(), for 8k content. These APIs are theoretically more accurate,
+      // but we are unsure about their level of support on various Android TV platforms.
+      final boolean enableImprovedSupportCheck =
+          forceImprovedSupportCheck || (frameWidth > 3840 || frameHeight > 2160);
+      if (enableImprovedSupportCheck) {
+        if (frameWidth != 0 && frameHeight != 0) {
+          if (!videoCapabilities.isSizeSupported(frameWidth, frameHeight)) {
+            String format = "Rejecting %s, reason: width %s is not compatible with height %d";
+            Log.v(TAG, String.format(format, name, frameWidth, frameHeight));
             continue;
           }
-          // If we want a secure decoder, then make sure the version without ".secure" isn't
-          // denylisted.
-          String nameWithoutSecureSuffix =
-              name.substring(0, name.length() - SECURE_DECODER_SUFFIX.length());
-          if (!isVp9AllowListed && videoCodecDenyList.contains(nameWithoutSecureSuffix)) {
-            String format = "Rejecting %s, reason: offpsec denylisted secure decoder";
-            Log.v(TAG, String.format(format, name));
-            continue;
-          }
-        }
-
-        CodecCapabilities codecCapabilities = info.getCapabilitiesForType(supportedType);
-        boolean requiresSecurePlayback =
-            codecCapabilities.isFeatureRequired(
-                MediaCodecInfo.CodecCapabilities.FEATURE_SecurePlayback);
-        boolean supportsSecurePlayback =
-            codecCapabilities.isFeatureSupported(
-                MediaCodecInfo.CodecCapabilities.FEATURE_SecurePlayback);
-        if (mustSupportSecure && !supportsSecurePlayback
-            || !mustSupportSecure && requiresSecurePlayback) {
-          String message =
-              String.format(
-                  "Rejecting %s, reason: secure decoder requested: %b, "
-                      + "codec FEATURE_SecurePlayback supported: %b, required: %b",
-                  name, mustSupportSecure, supportsSecurePlayback, requiresSecurePlayback);
-          Log.v(TAG, message);
-          continue;
-        }
-
-        boolean requiresTunneledPlayback =
-            codecCapabilities.isFeatureRequired(
-                MediaCodecInfo.CodecCapabilities.FEATURE_TunneledPlayback);
-        boolean supportsTunneledPlayback =
-            codecCapabilities.isFeatureSupported(
-                MediaCodecInfo.CodecCapabilities.FEATURE_TunneledPlayback);
-        if (mustSupportTunnelMode && !supportsTunneledPlayback
-            || !mustSupportTunnelMode && requiresTunneledPlayback) {
-          String message =
-              String.format(
-                  "Rejecting %s, reason: tunneled playback requested: %b, "
-                      + "codec FEATURE_TunneledPlayback supported: %b, required: %b",
-                  name, mustSupportTunnelMode, supportsTunneledPlayback, requiresTunneledPlayback);
-          Log.v(TAG, message);
-          continue;
-        }
-
-        // VideoCapabilities is not implemented correctly on this device.
-        if (Build.VERSION.SDK_INT < 23
-            && Build.MODEL.equals("MIBOX3")
-            && name.equals("OMX.amlogic.vp9.decoder.awesome")
-            && (frameWidth > 1920 || frameHeight > 1080)) {
-          Log.v(TAG, "Skipping >1080p OMX.amlogic.vp9.decoder.awesome on mibox.");
-          continue;
-        }
-
-        VideoCapabilities videoCapabilities = codecCapabilities.getVideoCapabilities();
-        Range<Integer> supportedWidths = videoCapabilities.getSupportedWidths();
-        Range<Integer> supportedHeights = videoCapabilities.getSupportedHeights();
-
-        // Enable the improved support check based on more specific APIs, like isSizeSupported() or
-        // areSizeAndRateSupported(), for 8k content. These APIs are theoretically more accurate,
-        // but we are unsure about their level of support on various Android TV platforms.
-        final boolean enableImprovedCheck = frameWidth > 3840 || frameHeight > 2160;
-        if (enableImprovedCheck) {
-          if (frameWidth != 0 && frameHeight != 0) {
-            if (!videoCapabilities.isSizeSupported(frameWidth, frameHeight)) {
-              String format = "Rejecting %s, reason: width %s is not compatible with height %d";
-              Log.v(TAG, String.format(format, name, frameWidth, frameHeight));
-              continue;
-            }
-          } else if (frameWidth != 0) {
-            if (!supportedWidths.contains(frameWidth)) {
-              String format = "Rejecting %s, reason: supported widths %s does not contain %d";
-              Log.v(TAG, String.format(format, name, supportedWidths.toString(), frameWidth));
-              continue;
-            }
-          } else if (frameHeight != 0) {
-            if (!supportedHeights.contains(frameHeight)) {
-              String format = "Rejecting %s, reason: supported heights %s does not contain %d";
-              Log.v(TAG, String.format(format, name, supportedHeights.toString(), frameHeight));
-              continue;
-            }
-          }
-        } else {
-          if (frameWidth != 0 && !supportedWidths.contains(frameWidth)) {
+        } else if (frameWidth != 0) {
+          if (!supportedWidths.contains(frameWidth)) {
             String format = "Rejecting %s, reason: supported widths %s does not contain %d";
             Log.v(TAG, String.format(format, name, supportedWidths.toString(), frameWidth));
             continue;
           }
-          if (frameHeight != 0 && !supportedHeights.contains(frameHeight)) {
+        } else if (frameHeight != 0) {
+          if (!supportedHeights.contains(frameHeight)) {
             String format = "Rejecting %s, reason: supported heights %s does not contain %d";
             Log.v(TAG, String.format(format, name, supportedHeights.toString(), frameHeight));
             continue;
           }
         }
-
-        Range<Integer> bitrates = videoCapabilities.getBitrateRange();
-        if (bitrate != 0 && !bitrates.contains(bitrate)) {
-          String format = "Rejecting %s, reason: bitrate range %s does not contain %d";
-          Log.v(TAG, String.format(format, name, bitrates.toString(), bitrate));
+      } else {
+        if (frameWidth != 0 && !supportedWidths.contains(frameWidth)) {
+          String format = "Rejecting %s, reason: supported widths %s does not contain %d";
+          Log.v(TAG, String.format(format, name, supportedWidths.toString(), frameWidth));
           continue;
         }
+        if (frameHeight != 0 && !supportedHeights.contains(frameHeight)) {
+          String format = "Rejecting %s, reason: supported heights %s does not contain %d";
+          Log.v(TAG, String.format(format, name, supportedHeights.toString(), frameHeight));
+          continue;
+        }
+      }
 
-        Range<Integer> supportedFrameRates = videoCapabilities.getSupportedFrameRates();
-        if (enableImprovedCheck) {
-          if (fps != 0) {
-            if (frameHeight != 0 && frameWidth != 0) {
-              if (!videoCapabilities.areSizeAndRateSupported(frameWidth, frameHeight, fps)) {
-                String format =
-                    "Rejecting %s, reason: supported frame rates %s does not contain %d";
-                Log.v(TAG, String.format(format, name, supportedFrameRates.toString(), fps));
-                continue;
-              }
-            } else {
-              // At least one of frameHeight or frameWidth is 0
-              if (!supportedFrameRates.contains(fps)) {
-                String format =
-                    "Rejecting %s, reason: supported frame rates %s does not contain %d";
-                Log.v(TAG, String.format(format, name, supportedFrameRates.toString(), fps));
-                continue;
-              }
+      Range<Integer> bitrates = videoCapabilities.getBitrateRange();
+      if (bitrate != 0 && !bitrates.contains(bitrate)) {
+        String format = "Rejecting %s, reason: bitrate range %s does not contain %d";
+        Log.v(TAG, String.format(format, name, bitrates.toString(), bitrate));
+        continue;
+      }
+
+      Range<Integer> supportedFrameRates = videoCapabilities.getSupportedFrameRates();
+      if (enableImprovedSupportCheck) {
+        if (fps != 0) {
+          if (frameHeight != 0 && frameWidth != 0) {
+            if (!videoCapabilities.areSizeAndRateSupported(frameWidth, frameHeight, fps)) {
+              String format = "Rejecting %s, reason: supported frame rates %s does not contain %d";
+              Log.v(TAG, String.format(format, name, supportedFrameRates.toString(), fps));
+              continue;
+            }
+          } else {
+            // At least one of frameHeight or frameWidth is 0
+            if (!supportedFrameRates.contains(fps)) {
+              String format = "Rejecting %s, reason: supported frame rates %s does not contain %d";
+              Log.v(TAG, String.format(format, name, supportedFrameRates.toString(), fps));
+              continue;
             }
           }
-        } else {
-          if (fps != 0 && !supportedFrameRates.contains(fps)) {
-            Log.v(
-                TAG,
-                String.format(
-                    "Rejecting %s, reason: supported frame rates %s does not contain %d",
-                    name, supportedFrameRates.toString(), fps));
-            continue;
-          }
         }
-
-        String resultName =
-            (mustSupportSecure && !name.endsWith(SECURE_DECODER_SUFFIX))
-                ? (name + SECURE_DECODER_SUFFIX)
-                : name;
-        FindVideoDecoderResult findVideoDecoderResult =
-            new FindVideoDecoderResult(resultName, videoCapabilities, codecCapabilities);
-        if (mustSupportHdr && !isHdrCapableVideoDecoder(mimeType, findVideoDecoderResult)) {
-          Log.v(TAG, String.format("Rejecting %s, reason: codec does not support HDR", name));
+      } else {
+        if (fps != 0 && !supportedFrameRates.contains(fps)) {
+          String format = "Rejecting %s, reason: supported frame rates %s does not contain %d";
+          Log.v(TAG, String.format(format, name, supportedFrameRates.toString(), fps));
           continue;
         }
-        Log.v(TAG, String.format("Found suitable decoder, %s", name));
-        return findVideoDecoderResult;
       }
+
+      String resultName =
+          (mustSupportSecure && !name.endsWith(SECURE_DECODER_SUFFIX))
+              ? (name + SECURE_DECODER_SUFFIX)
+              : name;
+      FindVideoDecoderResult findVideoDecoderResult =
+          new FindVideoDecoderResult(resultName, videoCapabilities, decoder.codecCapabilities);
+      if (mustSupportHdr && !isHdrCapableVideoDecoder(mimeType, findVideoDecoderResult)) {
+        Log.v(TAG, "Rejecting " + name + ", reason: codec does not support HDR");
+        continue;
+      }
+      Log.v(TAG, "Found suitable decoder, " + name);
+      return findVideoDecoderResult;
     }
     return new FindVideoDecoderResult("", null, null);
   }
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java
index abb56c8..c6db123 100644
--- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaDrmBridge.java
@@ -76,6 +76,14 @@
   @SuppressWarnings("deprecation")
   private static final int MEDIA_DRM_EVENT_KEY_EXPIRED = MediaDrm.EVENT_KEY_EXPIRED;
 
+  // Deprecated in API 23, but we still log it on earlier devices.
+  @SuppressWarnings("deprecation")
+  private static final int MEDIA_DRM_EVENT_PROVISION_REQUIRED = MediaDrm.EVENT_PROVISION_REQUIRED;
+
+  // Added in API 23.
+  private static final int MEDIA_DRM_EVENT_SESSION_RECLAIMED =
+      Build.VERSION.SDK_INT >= 23 ? MediaDrm.EVENT_SESSION_RECLAIMED : 5;
+
   private MediaDrm mMediaDrm;
   private long mNativeMediaDrmBridge;
   private UUID mSchemeUUID;
@@ -400,47 +408,48 @@
                   String.format("EventListener: Invalid session %s", bytesToHexString(sessionId)));
               return;
             }
-            switch (event) {
-              case MediaDrm.EVENT_KEY_REQUIRED:
-                Log.d(TAG, "MediaDrm.EVENT_KEY_REQUIRED");
-                String mime = mSessionIds.get(ByteBuffer.wrap(sessionId));
-                MediaDrm.KeyRequest request = null;
-                try {
-                  request = getKeyRequest(sessionId, data, mime);
-                } catch (NotProvisionedException e) {
-                  Log.e(TAG, "Device not provisioned", e);
-                  if (!attemptProvisioning()) {
-                    Log.e(TAG, "Failed to provision device when responding to EVENT_KEY_REQUIRED");
-                    return;
-                  }
-                  // If we supposedly successfully provisioned ourselves, then try to create a
-                  // request again.
-                  try {
-                    request = getKeyRequest(sessionId, data, mime);
-                  } catch (NotProvisionedException e2) {
-                    Log.e(
-                        TAG,
-                        "Device still not provisioned after supposedly successful provisioning",
-                        e2);
-                    return;
-                  }
-                }
-                if (request != null) {
-                  onSessionMessage(SB_DRM_TICKET_INVALID, sessionId, request);
-                } else {
-                  Log.e(TAG, "EventListener: getKeyRequest failed.");
+
+            if (event == MediaDrm.EVENT_KEY_REQUIRED) {
+              Log.d(TAG, "MediaDrm.EVENT_KEY_REQUIRED");
+              String mime = mSessionIds.get(ByteBuffer.wrap(sessionId));
+              MediaDrm.KeyRequest request = null;
+              try {
+                request = getKeyRequest(sessionId, data, mime);
+              } catch (NotProvisionedException e) {
+                Log.e(TAG, "Device not provisioned", e);
+                if (!attemptProvisioning()) {
+                  Log.e(TAG, "Failed to provision device when responding to EVENT_KEY_REQUIRED");
                   return;
                 }
-                break;
-              case MEDIA_DRM_EVENT_KEY_EXPIRED:
-                Log.d(TAG, "MediaDrm.EVENT_KEY_EXPIRED");
-                break;
-              case MediaDrm.EVENT_VENDOR_DEFINED:
-                Log.d(TAG, "MediaDrm.EVENT_VENDOR_DEFINED");
-                break;
-              default:
-                Log.e(TAG, "Invalid DRM event " + event);
+                // If we supposedly successfully provisioned ourselves, then try to create a
+                // request again.
+                try {
+                  request = getKeyRequest(sessionId, data, mime);
+                } catch (NotProvisionedException e2) {
+                  Log.e(
+                      TAG,
+                      "Device still not provisioned after supposedly successful provisioning",
+                      e2);
+                  return;
+                }
+              }
+              if (request != null) {
+                onSessionMessage(SB_DRM_TICKET_INVALID, sessionId, request);
+              } else {
+                Log.e(TAG, "EventListener: getKeyRequest failed.");
                 return;
+              }
+            } else if (event == MEDIA_DRM_EVENT_KEY_EXPIRED) {
+              Log.d(TAG, "MediaDrm.EVENT_KEY_EXPIRED");
+            } else if (event == MediaDrm.EVENT_VENDOR_DEFINED) {
+              Log.d(TAG, "MediaDrm.EVENT_VENDOR_DEFINED");
+            } else if (event == MEDIA_DRM_EVENT_PROVISION_REQUIRED) {
+              Log.d(TAG, "MediaDrm.EVENT_PROVISION_REQUIRED");
+            } else if (event == MEDIA_DRM_EVENT_SESSION_RECLAIMED) {
+              Log.d(TAG, "MediaDrm.EVENT_SESSION_RECLAIMED");
+            } else {
+              Log.e(TAG, "Invalid DRM event " + event);
+              return;
             }
           }
         });
diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoDecoderCache.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoDecoderCache.java
new file mode 100644
index 0000000..fe17de3
--- /dev/null
+++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/VideoDecoderCache.java
@@ -0,0 +1,106 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package dev.cobalt.media;
+
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.VideoCapabilities;
+import android.media.MediaCodecList;
+import android.util.Range;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Cache manager for maintaining a video decoder cache. Threadsafe. */
+public class VideoDecoderCache {
+  /**
+   * Cache entry in VideoDecoderCache. Cached expensive API calls that are repeatedly made while the
+   * H5 player determines codec support.
+   */
+  public static class CachedDecoder {
+    CachedDecoder(MediaCodecInfo info, CodecCapabilities codecCapabilities, String mimeType) {
+      this.info = info;
+      this.mimeType = mimeType;
+      this.codecCapabilities = codecCapabilities;
+      this.videoCapabilities = codecCapabilities.getVideoCapabilities();
+      this.supportedWidths = videoCapabilities.getSupportedWidths();
+      this.supportedHeights = videoCapabilities.getSupportedHeights();
+      this.bitrateRange = videoCapabilities.getBitrateRange();
+    }
+
+    public MediaCodecInfo info;
+    public String mimeType;
+    public CodecCapabilities codecCapabilities;
+    public VideoCapabilities videoCapabilities;
+    public Range<Integer> supportedWidths;
+    public Range<Integer> supportedHeights;
+    public Range<Integer> bitrateRange;
+  }
+
+  private static final int DEFAULT_CACHE_TTL_MILLIS = 1000;
+
+  private static Map<String, List<CachedDecoder>> cache = new HashMap<>();
+  private static long lastCacheUpdateAt = 0;
+
+  private static synchronized boolean isExpired(int cacheTtlOverride) {
+    long cacheTtl = cacheTtlOverride >= 0 ? cacheTtlOverride : DEFAULT_CACHE_TTL_MILLIS;
+    return System.currentTimeMillis() - lastCacheUpdateAt >= cacheTtl;
+  }
+
+  private static void refreshDecoders() {
+    cache.clear();
+    // Note: MediaCodecList is sorted by the framework such that the best decoders come first.
+    // This order is maintained in the cache.
+    for (MediaCodecInfo codecInfo : new MediaCodecList(MediaCodecList.ALL_CODECS).getCodecInfos()) {
+      // Don't cache encoders.
+      if (codecInfo.isEncoder()) {
+        continue;
+      }
+      for (String mimeType : codecInfo.getSupportedTypes()) {
+        CodecCapabilities codecCapabilities = codecInfo.getCapabilitiesForType(mimeType);
+        // Don't cache decoders that can't do video.
+        if (codecCapabilities.getVideoCapabilities() == null) {
+          continue;
+        }
+        List<CachedDecoder> decoders = cache.get(mimeType);
+        if (decoders == null) {
+          decoders = new ArrayList<>();
+          cache.put(mimeType, decoders);
+        }
+        decoders.add(new CachedDecoder(codecInfo, codecCapabilities, mimeType));
+      }
+    }
+    lastCacheUpdateAt = System.currentTimeMillis();
+  }
+
+  /**
+   * Returns a list of decoders that are cabable of decoding the media denoted by {@code mimeType}.
+   *
+   * @param mimeType The mime type the returned decoders should be able to decode.
+   * @param cacheTtlOverride Overrides the default cache TTL if passed a non-negative number. 0
+   *     disables the cache entirely.
+   * @return A list of decoders.
+   */
+  static List<CachedDecoder> getCachedDecoders(String mimeType, int cacheTtlOverride) {
+    synchronized (cache) {
+      if (isExpired(cacheTtlOverride)) {
+        refreshDecoders();
+      }
+      return cache.getOrDefault(mimeType, Collections.<CachedDecoder>emptyList());
+    }
+  }
+}
diff --git a/starboard/android/apk/app/src/main/res/values/overlayable.xml b/starboard/android/apk/app/src/main/res/values/overlayable.xml
new file mode 100644
index 0000000..ec87d0c
--- /dev/null
+++ b/starboard/android/apk/app/src/main/res/values/overlayable.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Cobalt Authors. All Rights Reserved.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<resources xmlns:tools="http://schemas.android.com/tools"
+           tools:ignore="DuplicateDefinition">
+  <overlayable name="CobaltOverlay">
+    <policy type="vendor|product|system">
+      <!-- This flag indicates whether 360 videos can be played. -->
+      <item type="bool" name="supports_spherical_videos" />
+      <!--
+        When set, the return value of SbMediaGetVideoBufferBudget() is capped
+        to this value in MB. Set to 0 to use default values.
+      -->
+      <item type="integer" name="max_video_buffer_budget" />
+    </policy>
+  </overlayable>
+</resources>
diff --git a/starboard/android/apk/app/src/main/res/values/rro_variables.xml b/starboard/android/apk/app/src/main/res/values/rro_variables.xml
new file mode 100644
index 0000000..f97a99c
--- /dev/null
+++ b/starboard/android/apk/app/src/main/res/values/rro_variables.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Cobalt Authors. All Rights Reserved.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<resources xmlns:tools="http://schemas.android.com/tools">
+  <!-- This flag indicates whether 360 videos can be played. -->
+  <bool name="supports_spherical_videos" tools:ignore="DuplicateDefinition">true</bool>
+  <!--
+    When set, the return value of SbMediaGetVideoBufferBudget() is capped to
+    this value in MB. Set to 0 to use default values.
+  -->
+  <integer name="max_video_buffer_budget"
+           tools:ignore="DuplicateDefinition">0</integer>
+</resources>
diff --git a/starboard/android/arm/gyp_configuration.gypi b/starboard/android/arm/gyp_configuration.gypi
deleted file mode 100644
index 4a8ef2d..0000000
--- a/starboard/android/arm/gyp_configuration.gypi
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'arm_version': 7,
-    'armv7': 1,
-    'arm_thumb': 0,
-    'arm_neon': 0,
-    'arm_fpu': 'vfpv3-d16',
-    'compiler_flags': [
-      '-march=armv7-a',
-    ],
-    'linker_flags': [
-      # Mimic build/cmake/android.toolchain.cmake in the Android NDK.
-      '-Wl,--exclude-libs,libunwind.a',
-    ]
-  },
-
-  'target_defaults': {
-    'default_configuration': 'android-arm_debug',
-    'configurations': {
-      'android-arm_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'android-arm_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'android-arm_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'android-arm_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '../shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/android/arm/gyp_configuration.py b/starboard/android/arm/gyp_configuration.py
index 0fcdd2a..6a9f0cf 100644
--- a/starboard/android/arm/gyp_configuration.py
+++ b/starboard/android/arm/gyp_configuration.py
@@ -17,7 +17,4 @@
 
 
 def CreatePlatformConfig():
-  return shared_configuration.AndroidConfiguration(
-      'android-arm',
-      'armeabi-v7a',
-      sabi_json_path='starboard/sabi/arm/softfp/sabi-v{sb_api_version}.json')
+  return shared_configuration.AndroidConfiguration('android-arm')
diff --git a/starboard/android/arm/starboard_platform.gyp b/starboard/android/arm/starboard_platform.gyp
deleted file mode 100644
index 5110292..0000000
--- a/starboard/android/arm/starboard_platform.gyp
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [ '../shared/starboard_platform.gypi' ],
-}
diff --git a/starboard/android/arm/starboard_platform_tests.gyp b/starboard/android/arm/starboard_platform_tests.gyp
deleted file mode 100644
index 58cd108..0000000
--- a/starboard/android/arm/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [ '../shared/starboard_platform_tests.gypi' ],
-}
diff --git a/starboard/android/arm/thread_types_public.h b/starboard/android/arm/thread_types_public.h
deleted file mode 100644
index 0b84b59..0000000
--- a/starboard/android/arm/thread_types_public.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/android/shared/thread_types_public.h"
diff --git a/starboard/linux/x64x11/sbversion/__init__.py b/starboard/android/arm64/cobalt/__init__.py
similarity index 100%
copy from starboard/linux/x64x11/sbversion/__init__.py
copy to starboard/android/arm64/cobalt/__init__.py
diff --git a/starboard/android/arm64/cobalt/configuration.py b/starboard/android/arm64/cobalt/configuration.py
new file mode 100644
index 0000000..63995c0
--- /dev/null
+++ b/starboard/android/arm64/cobalt/configuration.py
@@ -0,0 +1,36 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard Android arm64 Cobalt configuration."""
+
+from starboard.android.shared.cobalt import configuration
+from starboard.tools.testing import test_filter
+
+
+class CobaltAndroidARM64Configuration(configuration.CobaltAndroidConfiguration):
+  """Starboard Android arm64 Cobalt configuration."""
+
+  def GetTestFilters(self):
+    filters = super(CobaltAndroidARM64Configuration, self).GetTestFilters()
+    for target, tests in self.__FILTERED_TESTS.items():
+      filters.extend(test_filter.TestFilter(target, test) for test in tests)
+    return filters
+
+  # pylint:disable=line-too-long
+  # A map of failing or crashing tests per target
+  __FILTERED_TESTS = {  # pylint: disable=invalid-name
+      'net_unittests': [
+          # NetlinkConnection::SendRequest() fails, send() failed, errno=13.
+          'DialHttpServerTest.*',
+      ],
+  }
diff --git a/starboard/android/arm64/gyp_configuration.gypi b/starboard/android/arm64/gyp_configuration.gypi
deleted file mode 100644
index 1d30080..0000000
--- a/starboard/android/arm64/gyp_configuration.gypi
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'arm_version': 8,
-    'armv7': 0,
-    'arm_thumb': 0,
-    'arm_neon': 0,
-    'arm_fpu': 'vfpv3-d16',
-  },
-
-  'target_defaults': {
-    'default_configuration': 'android-arm64_debug',
-    'configurations': {
-      'android-arm64_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'android-arm64_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'android-arm64_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'android-arm64_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '../shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/android/arm64/gyp_configuration.py b/starboard/android/arm64/gyp_configuration.py
index 2e21425..d64251d 100644
--- a/starboard/android/arm64/gyp_configuration.py
+++ b/starboard/android/arm64/gyp_configuration.py
@@ -17,7 +17,4 @@
 
 
 def CreatePlatformConfig():
-  return shared_configuration.AndroidConfiguration(
-      'android-arm64',
-      'arm64-v8a',
-      sabi_json_path='starboard/sabi/arm64/sabi-v{sb_api_version}.json')
+  return shared_configuration.AndroidConfiguration('android-arm64')
diff --git a/starboard/android/arm64/starboard_platform.gyp b/starboard/android/arm64/starboard_platform.gyp
deleted file mode 100644
index 5110292..0000000
--- a/starboard/android/arm64/starboard_platform.gyp
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [ '../shared/starboard_platform.gypi' ],
-}
diff --git a/starboard/android/arm64/starboard_platform_tests.gyp b/starboard/android/arm64/starboard_platform_tests.gyp
deleted file mode 100644
index 58cd108..0000000
--- a/starboard/android/arm64/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [ '../shared/starboard_platform_tests.gypi' ],
-}
diff --git a/starboard/android/arm64/test_filters.py b/starboard/android/arm64/test_filters.py
index e0454ca..3b301de 100644
--- a/starboard/android/arm64/test_filters.py
+++ b/starboard/android/arm64/test_filters.py
@@ -14,6 +14,22 @@
 """Starboard Android ARM-64 Platform Test Filters."""
 
 from starboard.android.shared import test_filters as shared_test_filters
+from starboard.tools.testing import test_filter
+
+# pylint:disable=line-too-long
+# A map of failing or crashing tests per target.
+_FILTERED_TESTS = {
+    'nplb': [
+        # NetlinkConnection::SendRequest() fails, send() failed, errno=13.
+        'SbSocketBindTest.SunnyDayLocalInterface',
+        'SbSocketGetInterfaceAddressTest.SunnyDay',
+        'SbSocketGetInterfaceAddressTest.SunnyDayNullDestination',
+        'SbSocketGetLocalAddressTest.SunnyDayBoundSpecified',
+        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDayDestination/*',
+        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceForDestination/*',
+        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceNotLoopback/*',
+    ],
+}
 
 
 def CreateTestFilters():
@@ -25,4 +41,6 @@
 
   def GetTestFilters(self):
     filters = super(AndroidArm64TestFilters, self).GetTestFilters()
+    for target, tests in _FILTERED_TESTS.items():
+      filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
diff --git a/starboard/android/arm64/thread_types_public.h b/starboard/android/arm64/thread_types_public.h
deleted file mode 100644
index 0b84b59..0000000
--- a/starboard/android/arm64/thread_types_public.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/android/shared/thread_types_public.h"
diff --git a/starboard/android/arm64/vulkan/gyp_configuration.gypi b/starboard/android/arm64/vulkan/gyp_configuration.gypi
deleted file mode 100644
index 54e206a..0000000
--- a/starboard/android/arm64/vulkan/gyp_configuration.gypi
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'arm_version': 8,
-    'armv7': 0,
-    'arm_thumb': 0,
-    'arm_neon': 0,
-    'arm_fpu': 'vfpv3-d16',
-
-    'enable_vulkan': 1,
-
-    'platform_libraries': [
-      '-lc++_shared',
-      '-lEGL_angle',
-      '-lGLESv2_angle',
-      '-lGLESv1_CM_angle',
-      '-lfeature_support_angle',
-      '-lOpenSLES',
-      '-landroid',
-      '-llog',
-      '-lmediandk',
-    ],
-
-    'linker_flags': [
-      '-Wl',
-      '--verbose',
-      '-Llib',
-    ],
-  },
-
-  'target_defaults': {
-    'default_configuration': 'android-arm64-vulkan_debug',
-    'configurations': {
-      'android-arm64-vulkan_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'android-arm64-vulkan_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'android-arm64-vulkan_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'android-arm64-vulkan_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '<(DEPTH)/starboard/android/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/android/arm64/vulkan/gyp_configuration.py b/starboard/android/arm64/vulkan/gyp_configuration.py
index 1c1df77..3d39bfb 100644
--- a/starboard/android/arm64/vulkan/gyp_configuration.py
+++ b/starboard/android/arm64/vulkan/gyp_configuration.py
@@ -17,7 +17,4 @@
 
 
 def CreatePlatformConfig():
-  return shared_configuration.AndroidConfiguration(
-      'android-arm64-vulkan',
-      'arm64-v8a',
-      sabi_json_path='starboard/sabi/arm64/sabi-v{sb_api_version}.json')
+  return shared_configuration.AndroidConfiguration('android-arm64-vulkan')
diff --git a/starboard/android/arm64/vulkan/starboard_platform.gyp b/starboard/android/arm64/vulkan/starboard_platform.gyp
deleted file mode 100644
index d605723..0000000
--- a/starboard/android/arm64/vulkan/starboard_platform.gyp
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '<(DEPTH)/starboard/android/shared/starboard_platform.gypi',
-  ],
-}
diff --git a/starboard/android/arm64/vulkan/starboard_platform_tests.gyp b/starboard/android/arm64/vulkan/starboard_platform_tests.gyp
deleted file mode 100644
index ab226cd..0000000
--- a/starboard/android/arm64/vulkan/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '<(DEPTH)/starboard/android/shared/starboard_platform_tests.gypi',
-  ],
-}
diff --git a/starboard/android/arm64/vulkan/thread_types_public.h b/starboard/android/arm64/vulkan/thread_types_public.h
deleted file mode 100644
index 6d980f7..0000000
--- a/starboard/android/arm64/vulkan/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2020 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_ANDROID_ARM64_VULKAN_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_ANDROID_ARM64_VULKAN_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/android/shared/thread_types_public.h"
-
-#endif  // STARBOARD_ANDROID_ARM64_VULKAN_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/android/examples/overlays/AndroidManifest.xml b/starboard/android/examples/overlays/AndroidManifest.xml
new file mode 100644
index 0000000..a88fe39
--- /dev/null
+++ b/starboard/android/examples/overlays/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Cobalt Authors. All Rights Reserved.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+  package="dev.cobalt.coat.rro">
+
+  <application android:hasCode="false" />
+  <overlay android:targetPackage="dev.cobalt.coat"
+           android:targetName="CobaltOverlay"
+           android:resourcesMap="@xml/overlays"/>
+</manifest>
diff --git a/starboard/android/examples/overlays/res/xml/overlays.xml b/starboard/android/examples/overlays/res/xml/overlays.xml
new file mode 100644
index 0000000..7670021
--- /dev/null
+++ b/starboard/android/examples/overlays/res/xml/overlays.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Cobalt Authors. All Rights Reserved.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<overlay>
+  <!-- This flag indicates whether 360 videos can be played. -->
+  <item target="bool/supports_spherical_videos" value="true" />
+  <!--
+    When set, the return value of SbMediaGetVideoBufferBudget() is capped to
+    this value in MB. Set to 0 to use default values.
+  -->
+  <item target="integer/max_video_buffer_budget" value="0" />
+</overlay>
diff --git a/starboard/android/shared/BUILD.gn b/starboard/android/shared/BUILD.gn
index d2ac6c2..599bd7d 100644
--- a/starboard/android/shared/BUILD.gn
+++ b/starboard/android/shared/BUILD.gn
@@ -17,16 +17,9 @@
 import("//starboard/shared/starboard/player/buildfiles.gni")
 import("//starboard/shared/starboard/player/player_tests.gni")
 
-config("starboard_platform_config") {
-  include_dirs = [ "bionic" ]
-}
-
 static_library("starboard_platform") {
   sources = [
     "$target_gen_dir/ndk-sources/cpu-features.c",
-    "//starboard/shared/dlmalloc/memory_map.cc",
-    "//starboard/shared/dlmalloc/memory_protect.cc",
-    "//starboard/shared/dlmalloc/memory_unmap.cc",
     "//starboard/shared/egl/system_egl.cc",
     "//starboard/shared/gcc/atomic_gcc_public.h",
     "//starboard/shared/gles/gl_call.h",
@@ -80,8 +73,6 @@
     "//starboard/shared/linux/byte_swap.cc",
     "//starboard/shared/linux/cpu_features_get.cc",
     "//starboard/shared/linux/memory_get_stack_bounds.cc",
-    "//starboard/shared/linux/page_internal.cc",
-    "//starboard/shared/linux/socket_get_interface_address.cc",
     "//starboard/shared/linux/system_get_random_data.cc",
     "//starboard/shared/linux/system_get_total_cpu_memory.cc",
     "//starboard/shared/linux/system_get_used_cpu_memory.cc",
@@ -97,6 +88,7 @@
     "//starboard/shared/opus/opus_audio_decoder.cc",
     "//starboard/shared/opus/opus_audio_decoder.h",
     "//starboard/shared/posix/directory_create.cc",
+    "//starboard/shared/posix/environment.cc",
     "//starboard/shared/posix/file_atomic_replace.cc",
     "//starboard/shared/posix/impl/file_can_open.h",
     "//starboard/shared/posix/impl/file_close.h",
@@ -112,6 +104,10 @@
     "//starboard/shared/posix/memory_allocate_aligned_unchecked.cc",
     "//starboard/shared/posix/memory_flush.cc",
     "//starboard/shared/posix/memory_free_aligned.cc",
+    "//starboard/shared/posix/memory_map.cc",
+    "//starboard/shared/posix/memory_protect.cc",
+    "//starboard/shared/posix/memory_unmap.cc",
+    "//starboard/shared/posix/page_internal.cc",
     "//starboard/shared/posix/set_non_blocking_internal.cc",
     "//starboard/shared/posix/socket_accept.cc",
     "//starboard/shared/posix/socket_bind.cc",
@@ -177,7 +173,6 @@
     "//starboard/shared/pthread/thread_join.cc",
     "//starboard/shared/pthread/thread_set_local_value.cc",
     "//starboard/shared/pthread/thread_yield.cc",
-    "//starboard/shared/pthread/types_public.h",
     "//starboard/shared/signal/crash_signals.h",
     "//starboard/shared/signal/crash_signals_sigaction.cc",
     "//starboard/shared/signal/suspend_signals.cc",
@@ -224,7 +219,6 @@
     "//starboard/shared/starboard/media/media_get_buffer_padding.cc",
     "//starboard/shared/starboard/media/media_get_buffer_storage_type.cc",
     "//starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc",
-    "//starboard/shared/starboard/media/media_get_video_buffer_budget.cc",
     "//starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc",
     "//starboard/shared/starboard/media/mime_type.cc",
     "//starboard/shared/starboard/media/mime_type.h",
@@ -249,12 +243,6 @@
     "//starboard/shared/starboard/system_supports_resume.cc",
     "//starboard/shared/starboard/thread_checker.h",
     "//starboard/shared/starboard/window_set_default_options.cc",
-    "//starboard/shared/stub/cryptography_create_transformer.cc",
-    "//starboard/shared/stub/cryptography_destroy_transformer.cc",
-    "//starboard/shared/stub/cryptography_get_tag.cc",
-    "//starboard/shared/stub/cryptography_set_authenticated_data.cc",
-    "//starboard/shared/stub/cryptography_set_initialization_vector.cc",
-    "//starboard/shared/stub/cryptography_transform.cc",
     "//starboard/shared/stub/image_decode.cc",
     "//starboard/shared/stub/image_is_decode_supported.cc",
     "//starboard/shared/stub/media_set_audio_write_duration.cc",
@@ -299,13 +287,6 @@
     "audio_track_audio_sink_type.h",
     "audio_track_bridge.cc",
     "audio_track_bridge.h",
-    "bionic/bionic_netlink.cpp",
-    "bionic/bionic_netlink.h",
-    "bionic/ifaddrs.cpp",
-    "bionic/ifaddrs.h",
-    "bionic/net_if.cpp",
-    "bionic/private/ErrnoRestorer.h",
-    "bionic/private/bionic_macros.h",
     "configuration.cc",
     "configuration.h",
     "configuration_constants.cc",
@@ -338,6 +319,8 @@
     "file_truncate.cc",
     "file_write.cc",
     "get_home_directory.cc",
+    "graphics.cc",
+    "graphics.h",
     "input_events_generator.cc",
     "input_events_generator.h",
     "jni_env_ext.cc",
@@ -360,6 +343,7 @@
     "media_get_audio_output_count.cc",
     "media_get_initial_buffer_capacity.cc",
     "media_get_max_buffer_capacity.cc",
+    "media_get_video_buffer_budget.cc",
     "media_is_audio_supported.cc",
     "media_is_buffer_pool_allocate_on_demand.cc",
     "media_is_video_supported.cc",
@@ -373,6 +357,7 @@
     "player_set_bounds.cc",
     "player_set_playback_rate.cc",
     "sanitizer_options.cc",
+    "socket_get_interface_address.cc",
     "speech_synthesis_cancel.cc",
     "speech_synthesis_internal.cc",
     "speech_synthesis_is_supported.cc",
@@ -394,7 +379,6 @@
     "thread_create.cc",
     "thread_create_priority.cc",
     "thread_get_name.cc",
-    "thread_types_public.h",
     "time_zone_get_name.cc",
     "trace_util.h",
     "video_decoder.cc",
@@ -433,10 +417,7 @@
     "//starboard/shared/starboard/player/player_set_playback_rate.cc",
   ]
 
-  configs += [
-    ":starboard_platform_config",
-    "//starboard/build/config:starboard_implementation",
-  ]
+  configs += [ "//starboard/build/config:starboard_implementation" ]
 
   public_deps = [
     ":ndk_sources",
diff --git a/starboard/android/shared/application_android.cc b/starboard/android/shared/application_android.cc
index f2986e7..b2eecf4 100644
--- a/starboard/android/shared/application_android.cc
+++ b/starboard/android/shared/application_android.cc
@@ -116,9 +116,20 @@
   keyboard_inject_writefd_ = pipefd[1];
   ALooper_addFd(looper_, keyboard_inject_readfd_, kLooperIdKeyboardInject,
                 ALOOPER_EVENT_INPUT, NULL, NULL);
+
+  JniEnvExt* env = JniEnvExt::Get();
+  jobject local_ref = env->CallStarboardObjectMethodOrAbort(
+      "getResourceOverlay", "()Ldev/cobalt/coat/ResourceOverlay;");
+  resource_overlay_ = env->ConvertLocalRefToGlobalRef(local_ref);
 }
 
 ApplicationAndroid::~ApplicationAndroid() {
+  // Release the global reference.
+  if (resource_overlay_) {
+    JniEnvExt* env = JniEnvExt::Get();
+    env->DeleteGlobalRef(resource_overlay_);
+    resource_overlay_ = nullptr;
+  }
   ALooper_removeFd(looper_, android_command_readfd_);
   close(android_command_readfd_);
   close(android_command_writefd_);
@@ -479,17 +490,9 @@
 Java_dev_cobalt_coat_KeyboardInputConnection_nativeHasOnScreenKeyboard(
     JniEnvExt* env,
     jobject unused_this) {
-#if SB_API_VERSION >= 12
   return SbWindowOnScreenKeyboardIsSupported() ? JNI_TRUE : JNI_FALSE;
-#elif SB_HAS(ON_SCREEN_KEYBOARD)
-  return JNI_TRUE;
-#else
-  return JNI_FALSE;
-#endif
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
-
 void ApplicationAndroid::SbWindowShowOnScreenKeyboard(SbWindow window,
                                                       const char* input_text,
                                                       int ticket) {
@@ -581,9 +584,6 @@
   return;
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-
 bool ApplicationAndroid::OnSearchRequested() {
   for (int i = 0; i < 2; i++) {
     SbInputData* data = new SbInputData();
@@ -681,6 +681,44 @@
   ApplicationAndroid::Get()->SendDateTimeConfigurationChangedEvent();
 }
 
+int ApplicationAndroid::GetOverlayedIntValue(const char* var_name) {
+  ScopedLock lock(overlay_mutex_);
+  if (overlayed_int_variables_.find(var_name) !=
+      overlayed_int_variables_.end()) {
+    return overlayed_int_variables_[var_name];
+  }
+  JniEnvExt* env = JniEnvExt::Get();
+  jint value = env->GetIntFieldOrAbort(resource_overlay_, var_name, "I");
+  overlayed_int_variables_[var_name] = value;
+  return value;
+}
+
+std::string ApplicationAndroid::GetOverlayedStringValue(const char* var_name) {
+  ScopedLock lock(overlay_mutex_);
+  if (overlayed_string_variables_.find(var_name) !=
+      overlayed_string_variables_.end()) {
+    return overlayed_string_variables_[var_name];
+  }
+  JniEnvExt* env = JniEnvExt::Get();
+  std::string value = env->GetStringStandardUTFOrAbort(
+      env->GetStringFieldOrAbort(resource_overlay_, var_name));
+  overlayed_string_variables_[var_name] = value;
+  return value;
+}
+
+bool ApplicationAndroid::GetOverlayedBoolValue(const char* var_name) {
+  ScopedLock lock(overlay_mutex_);
+  if (overlayed_bool_variables_.find(var_name) !=
+      overlayed_bool_variables_.end()) {
+    return overlayed_bool_variables_[var_name];
+  }
+  JniEnvExt* env = JniEnvExt::Get();
+  jboolean value =
+      env->GetBooleanFieldOrAbort(resource_overlay_, var_name, "Z");
+  overlayed_bool_variables_[var_name] = value;
+  return value;
+}
+
 }  // namespace shared
 }  // namespace android
 }  // namespace starboard
diff --git a/starboard/android/shared/application_android.h b/starboard/android/shared/application_android.h
index a1c92a6..2d147eb 100644
--- a/starboard/android/shared/application_android.h
+++ b/starboard/android/shared/application_android.h
@@ -18,6 +18,7 @@
 #include <android/looper.h>
 #include <android/native_window.h>
 #include <string>
+#include <unordered_map>
 #include <vector>
 
 #include "starboard/android/shared/input_events_generator.h"
@@ -96,6 +97,14 @@
 
   void SendDateTimeConfigurationChangedEvent();
 
+  // Methods to get the Runtime Resource Overlay variables.
+  // All RRO variables which can be retrieved here must be defined
+  // in res/values/rro_variables.xml and be loaded in
+  // dev/cobalt/coat/ResourceOverlay.java.
+  int GetOverlayedIntValue(const char* var_name);
+  std::string GetOverlayedStringValue(const char* var_name);
+  bool GetOverlayedBoolValue(const char* var_name);
+
   // Methods to start/stop Media playback service.
   void StartMediaPlaybackService();
   void StopMediaPlaybackService();
@@ -139,6 +148,13 @@
 
   bool last_is_accessibility_high_contrast_text_enabled_;
 
+  jobject resource_overlay_;
+
+  Mutex overlay_mutex_;
+  std::unordered_map<std::string, bool> overlayed_bool_variables_;
+  std::unordered_map<std::string, int> overlayed_int_variables_;
+  std::unordered_map<std::string, std::string> overlayed_string_variables_;
+
   // Methods to process pipes attached to the Looper.
   void ProcessAndroidCommand();
   void ProcessAndroidInput();
diff --git a/starboard/android/shared/bionic/README.md b/starboard/android/shared/bionic/README.md
deleted file mode 100644
index f54cfe7..0000000
--- a/starboard/android/shared/bionic/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-This is a partial fork of the Android bionic C library, taken from:
-
-https://android.googlesource.com/platform/bionic/+/5e62b34c0d6fa545b487b9b64fb4a04a0589bc13/libc
-
-
-The purpose is to build into the Android Starboard port necesary parts of bionic
-that are not available on all versions of Android that we support, including:
-
-* `ifaddrs` (and its dependencies) - Used by `SbSocketGetInterfaceAddress`, but
-  not available until API 24.
-
diff --git a/starboard/android/shared/bionic/bionic_netlink.cpp b/starboard/android/shared/bionic/bionic_netlink.cpp
deleted file mode 100644
index f2449dc..0000000
--- a/starboard/android/shared/bionic/bionic_netlink.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "bionic_netlink.h"
-
-#include <errno.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/socket.h>
-#include <unistd.h>
-
-#include "private/ErrnoRestorer.h"
-
-NetlinkConnection::NetlinkConnection() {
-  fd_ = -1;
-
-  // The kernel keeps packets under 8KiB (NLMSG_GOODSIZE),
-  // but that's a bit too large to go on the stack.
-  size_ = 8192;
-  data_ = new char[size_];
-}
-
-NetlinkConnection::~NetlinkConnection() {
-  ErrnoRestorer errno_restorer;
-  if (fd_ != -1) close(fd_);
-  delete[] data_;
-}
-
-bool NetlinkConnection::SendRequest(int type) {
-  // Rather than force all callers to check for the unlikely event of being
-  // unable to allocate 8KiB, check here.
-  if (data_ == nullptr) return false;
-
-  // Did we open a netlink socket yet?
-  if (fd_ == -1) {
-    fd_ = socket(PF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE);
-    if (fd_ == -1) return false;
-  }
-
-  // Construct and send the message.
-  struct NetlinkMessage {
-    nlmsghdr hdr;
-    rtgenmsg msg;
-  } request;
-  memset(&request, 0, sizeof(request));
-  request.hdr.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
-  request.hdr.nlmsg_type = type;
-  request.hdr.nlmsg_len = sizeof(request);
-  request.msg.rtgen_family = AF_UNSPEC; // All families.
-  return (TEMP_FAILURE_RETRY(send(fd_, &request, sizeof(request), 0)) == sizeof(request));
-}
-
-bool NetlinkConnection::ReadResponses(void callback(void*, nlmsghdr*), void* context) {
-  // Read through all the responses, handing interesting ones to the callback.
-  ssize_t bytes_read;
-  while ((bytes_read = TEMP_FAILURE_RETRY(recv(fd_, data_, size_, 0))) > 0) {
-    nlmsghdr* hdr = reinterpret_cast<nlmsghdr*>(data_);
-    for (; NLMSG_OK(hdr, static_cast<size_t>(bytes_read)); hdr = NLMSG_NEXT(hdr, bytes_read)) {
-      if (hdr->nlmsg_type == NLMSG_DONE) return true;
-      if (hdr->nlmsg_type == NLMSG_ERROR) {
-        nlmsgerr* err = reinterpret_cast<nlmsgerr*>(NLMSG_DATA(hdr));
-        errno = (hdr->nlmsg_len >= NLMSG_LENGTH(sizeof(nlmsgerr))) ? -err->error : EIO;
-        return false;
-      }
-      callback(context, hdr);
-    }
-  }
-
-  // We only get here if recv fails before we see a NLMSG_DONE.
-  return false;
-}
diff --git a/starboard/android/shared/bionic/bionic_netlink.h b/starboard/android/shared/bionic/bionic_netlink.h
deleted file mode 100644
index a21200e..0000000
--- a/starboard/android/shared/bionic/bionic_netlink.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- * 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.
- *
- * 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.
- */
-
-#pragma once
-
-#include <sys/types.h>
-
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-
-struct nlmsghdr;
-
-class NetlinkConnection {
- public:
-  NetlinkConnection();
-  ~NetlinkConnection();
-
-  bool SendRequest(int type);
-  bool ReadResponses(void callback(void*, nlmsghdr*), void* context);
-
- private:
-  int fd_;
-  char* data_;
-  size_t size_;
-};
diff --git a/starboard/android/shared/bionic/ifaddrs.cpp b/starboard/android/shared/bionic/ifaddrs.cpp
deleted file mode 100644
index f5b080c..0000000
--- a/starboard/android/shared/bionic/ifaddrs.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <ifaddrs.h>
-
-#include <errno.h>
-#include <linux/if_packet.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "private/ErrnoRestorer.h"
-
-#include "bionic_netlink.h"
-
-// The public ifaddrs struct is full of pointers. Rather than track several
-// different allocations, we use a maximally-sized structure with the public
-// part at offset 0, and pointers into its hidden tail.
-struct ifaddrs_storage {
-  // Must come first, so that `ifaddrs_storage` is-a `ifaddrs`.
-  ifaddrs ifa;
-
-  // The interface index, so we can match RTM_NEWADDR messages with
-  // earlier RTM_NEWLINK messages (to copy the interface flags).
-  int interface_index;
-
-  // Storage for the pointers in `ifa`.
-  sockaddr_storage addr;
-  sockaddr_storage netmask;
-  sockaddr_storage ifa_ifu;
-  char name[IFNAMSIZ + 1];
-
-  explicit ifaddrs_storage(ifaddrs** list) {
-    memset(this, 0, sizeof(*this));
-
-    // push_front onto `list`.
-    ifa.ifa_next = *list;
-    *list = reinterpret_cast<ifaddrs*>(this);
-  }
-
-  void SetAddress(int family, const void* data, size_t byteCount) {
-    // The kernel currently uses the order IFA_ADDRESS, IFA_LOCAL, IFA_BROADCAST
-    // in inet_fill_ifaddr, but let's not assume that will always be true...
-    if (ifa.ifa_addr == nullptr) {
-      // This is an IFA_ADDRESS and haven't seen an IFA_LOCAL yet, so assume this is the
-      // local address. SetLocalAddress will fix things if we later see an IFA_LOCAL.
-      ifa.ifa_addr = CopyAddress(family, data, byteCount, &addr);
-    } else {
-      // We already saw an IFA_LOCAL, which implies this is a destination address.
-      ifa.ifa_dstaddr = CopyAddress(family, data, byteCount, &ifa_ifu);
-    }
-  }
-
-  void SetBroadcastAddress(int family, const void* data, size_t byteCount) {
-    // ifa_broadaddr and ifa_dstaddr overlap in a union. Unfortunately, it's possible
-    // to have an interface with both. Keeping the last thing the kernel gives us seems
-    // to be glibc 2.19's behavior too, so our choice is being source compatible with
-    // badly-written code that assumes ifa_broadaddr and ifa_dstaddr are interchangeable
-    // or supporting interfaces with both addresses configured. My assumption is that
-    // bad code is more common than weird network interfaces...
-    ifa.ifa_broadaddr = CopyAddress(family, data, byteCount, &ifa_ifu);
-  }
-
-  void SetLocalAddress(int family, const void* data, size_t byteCount) {
-    // The kernel source says "for point-to-point IFA_ADDRESS is DESTINATION address,
-    // local address is supplied in IFA_LOCAL attribute".
-    //   -- http://lxr.free-electrons.com/source/include/uapi/linux/if_addr.h#L17
-
-    // So copy any existing IFA_ADDRESS into ifa_dstaddr...
-    if (ifa.ifa_addr != nullptr) {
-      ifa.ifa_dstaddr = reinterpret_cast<sockaddr*>(memcpy(&ifa_ifu, &addr, sizeof(addr)));
-    }
-    // ...and then put this IFA_LOCAL into ifa_addr.
-    ifa.ifa_addr = CopyAddress(family, data, byteCount, &addr);
-  }
-
-  // Netlink gives us the prefix length as a bit count. We need to turn
-  // that into a BSD-compatible netmask represented by a sockaddr*.
-  void SetNetmask(int family, size_t prefix_length) {
-    // ...and work out the netmask from the prefix length.
-    netmask.ss_family = family;
-    uint8_t* dst = SockaddrBytes(family, &netmask);
-    memset(dst, 0xff, prefix_length / 8);
-    if ((prefix_length % 8) != 0) {
-      dst[prefix_length/8] = (0xff << (8 - (prefix_length % 8)));
-    }
-    ifa.ifa_netmask = reinterpret_cast<sockaddr*>(&netmask);
-  }
-
-  void SetPacketAttributes(int ifindex, unsigned short hatype, unsigned char halen) {
-    sockaddr_ll* sll = reinterpret_cast<sockaddr_ll*>(&addr);
-    sll->sll_ifindex = ifindex;
-    sll->sll_hatype = hatype;
-    sll->sll_halen = halen;
-  }
-
- private:
-  sockaddr* CopyAddress(int family, const void* data, size_t byteCount, sockaddr_storage* ss) {
-    // Netlink gives us the address family in the header, and the
-    // sockaddr_in or sockaddr_in6 bytes as the payload. We need to
-    // stitch the two bits together into the sockaddr that's part of
-    // our portable interface.
-    ss->ss_family = family;
-    memcpy(SockaddrBytes(family, ss), data, byteCount);
-
-    // For IPv6 we might also have to set the scope id.
-    if (family == AF_INET6 && (IN6_IS_ADDR_LINKLOCAL(data) || IN6_IS_ADDR_MC_LINKLOCAL(data))) {
-      reinterpret_cast<sockaddr_in6*>(ss)->sin6_scope_id = interface_index;
-    }
-
-    return reinterpret_cast<sockaddr*>(ss);
-  }
-
-  // Returns a pointer to the first byte in the address data (which is
-  // stored in network byte order).
-  uint8_t* SockaddrBytes(int family, sockaddr_storage* ss) {
-    if (family == AF_INET) {
-      sockaddr_in* ss4 = reinterpret_cast<sockaddr_in*>(ss);
-      return reinterpret_cast<uint8_t*>(&ss4->sin_addr);
-    } else if (family == AF_INET6) {
-      sockaddr_in6* ss6 = reinterpret_cast<sockaddr_in6*>(ss);
-      return reinterpret_cast<uint8_t*>(&ss6->sin6_addr);
-    } else if (family == AF_PACKET) {
-      sockaddr_ll* sll = reinterpret_cast<sockaddr_ll*>(ss);
-      return reinterpret_cast<uint8_t*>(&sll->sll_addr);
-    }
-    return nullptr;
-  }
-};
-
-static void __getifaddrs_callback(void* context, nlmsghdr* hdr) {
-  ifaddrs** out = reinterpret_cast<ifaddrs**>(context);
-
-  if (hdr->nlmsg_type == RTM_NEWLINK) {
-    ifinfomsg* ifi = reinterpret_cast<ifinfomsg*>(NLMSG_DATA(hdr));
-
-    // Create a new ifaddr entry, and set the interface index and flags.
-    ifaddrs_storage* new_addr = new ifaddrs_storage(out);
-    new_addr->interface_index = ifi->ifi_index;
-    new_addr->ifa.ifa_flags = ifi->ifi_flags;
-
-    // Go through the various bits of information and find the name.
-    rtattr* rta = IFLA_RTA(ifi);
-    size_t rta_len = IFLA_PAYLOAD(hdr);
-    while (RTA_OK(rta, rta_len)) {
-      if (rta->rta_type == IFLA_ADDRESS) {
-          if (RTA_PAYLOAD(rta) < sizeof(new_addr->addr)) {
-            new_addr->SetAddress(AF_PACKET, RTA_DATA(rta), RTA_PAYLOAD(rta));
-            new_addr->SetPacketAttributes(ifi->ifi_index, ifi->ifi_type, RTA_PAYLOAD(rta));
-          }
-      } else if (rta->rta_type == IFLA_BROADCAST) {
-          if (RTA_PAYLOAD(rta) < sizeof(new_addr->ifa_ifu)) {
-            new_addr->SetBroadcastAddress(AF_PACKET, RTA_DATA(rta), RTA_PAYLOAD(rta));
-            new_addr->SetPacketAttributes(ifi->ifi_index, ifi->ifi_type, RTA_PAYLOAD(rta));
-          }
-      } else if (rta->rta_type == IFLA_IFNAME) {
-          if (RTA_PAYLOAD(rta) < sizeof(new_addr->name)) {
-            memcpy(new_addr->name, RTA_DATA(rta), RTA_PAYLOAD(rta));
-            new_addr->ifa.ifa_name = new_addr->name;
-          }
-      }
-      rta = RTA_NEXT(rta, rta_len);
-    }
-  } else if (hdr->nlmsg_type == RTM_NEWADDR) {
-    ifaddrmsg* msg = reinterpret_cast<ifaddrmsg*>(NLMSG_DATA(hdr));
-
-    // We should already know about this from an RTM_NEWLINK message.
-    const ifaddrs_storage* addr = reinterpret_cast<const ifaddrs_storage*>(*out);
-    while (addr != nullptr && addr->interface_index != static_cast<int>(msg->ifa_index)) {
-      addr = reinterpret_cast<const ifaddrs_storage*>(addr->ifa.ifa_next);
-    }
-    // If this is an unknown interface, ignore whatever we're being told about it.
-    if (addr == nullptr) return;
-
-    // Create a new ifaddr entry and copy what we already know.
-    ifaddrs_storage* new_addr = new ifaddrs_storage(out);
-    // We can just copy the name rather than look for IFA_LABEL.
-    strcpy(new_addr->name, addr->name);
-    new_addr->ifa.ifa_name = new_addr->name;
-    new_addr->ifa.ifa_flags = addr->ifa.ifa_flags;
-    new_addr->interface_index = addr->interface_index;
-
-    // Go through the various bits of information and find the address
-    // and any broadcast/destination address.
-    rtattr* rta = IFA_RTA(msg);
-    size_t rta_len = IFA_PAYLOAD(hdr);
-    while (RTA_OK(rta, rta_len)) {
-      if (rta->rta_type == IFA_ADDRESS) {
-        if (msg->ifa_family == AF_INET || msg->ifa_family == AF_INET6) {
-          new_addr->SetAddress(msg->ifa_family, RTA_DATA(rta), RTA_PAYLOAD(rta));
-          new_addr->SetNetmask(msg->ifa_family, msg->ifa_prefixlen);
-        }
-      } else if (rta->rta_type == IFA_BROADCAST) {
-        if (msg->ifa_family == AF_INET) {
-          new_addr->SetBroadcastAddress(msg->ifa_family, RTA_DATA(rta), RTA_PAYLOAD(rta));
-        }
-      } else if (rta->rta_type == IFA_LOCAL) {
-        if (msg->ifa_family == AF_INET || msg->ifa_family == AF_INET6) {
-          new_addr->SetLocalAddress(msg->ifa_family, RTA_DATA(rta), RTA_PAYLOAD(rta));
-        }
-      }
-      rta = RTA_NEXT(rta, rta_len);
-    }
-  }
-}
-
-int getifaddrs(ifaddrs** out) {
-  // We construct the result directly into `out`, so terminate the list.
-  *out = nullptr;
-
-  // Open the netlink socket and ask for all the links and addresses.
-  NetlinkConnection nc;
-  bool okay = nc.SendRequest(RTM_GETLINK) && nc.ReadResponses(__getifaddrs_callback, out) &&
-              nc.SendRequest(RTM_GETADDR) && nc.ReadResponses(__getifaddrs_callback, out);
-  if (!okay) {
-    freeifaddrs(*out);
-    // Ensure that callers crash if they forget to check for success.
-    *out = nullptr;
-    return -1;
-  }
-
-  return 0;
-}
-
-void freeifaddrs(ifaddrs* list) {
-  while (list != nullptr) {
-    ifaddrs* current = list;
-    list = list->ifa_next;
-    free(current);
-  }
-}
diff --git a/starboard/android/shared/bionic/ifaddrs.h b/starboard/android/shared/bionic/ifaddrs.h
deleted file mode 100644
index 9eaabbd..0000000
--- a/starboard/android/shared/bionic/ifaddrs.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- * 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.
- *
- * 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.
- */
-
-#pragma once
-
-/**
- * @file ifaddrs.h
- * @brief Access to network interface addresses.
- */
-
-#include <sys/cdefs.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-
-__BEGIN_DECLS
-
-/**
- * Returned by getifaddrs() and freed by freeifaddrs().
- */
-struct ifaddrs {
-  /** Pointer to the next element in the linked list. */
-  struct ifaddrs* ifa_next;
-
-  /** Interface name. */
-  char* ifa_name;
-  /** Interface flags (like `SIOCGIFFLAGS`). */
-  unsigned int ifa_flags;
-  /** Interface address. */
-  struct sockaddr* ifa_addr;
-  /** Interface netmask. */
-  struct sockaddr* ifa_netmask;
-
-  union {
-    /** Interface broadcast address (if IFF_BROADCAST is set). */
-    struct sockaddr* ifu_broadaddr;
-    /** Interface destination address (if IFF_POINTOPOINT is set). */
-    struct sockaddr* ifu_dstaddr;
-  } ifa_ifu;
-
-  /** Unused. */
-  void* ifa_data;
-};
-
-/** Synonym for `ifa_ifu.ifu_broadaddr` in `struct ifaddrs`. */
-#define ifa_broadaddr ifa_ifu.ifu_broadaddr
-/** Synonym for `ifa_ifu.ifu_dstaddr` in `struct ifaddrs`. */
-#define ifa_dstaddr ifa_ifu.ifu_dstaddr
-
-/**
- * [getifaddrs(3)](http://man7.org/linux/man-pages/man3/getifaddrs.3.html) creates a linked list
- * of `struct ifaddrs`. The list must be freed by freeifaddrs().
- *
- * Returns 0 and stores the list in `*__list_ptr` on success,
- * and returns -1 and sets `errno` on failure.
- *
- * Available since API level 24.
- */
-int getifaddrs(struct ifaddrs** __list_ptr) __INTRODUCED_IN(24);
-
-/**
- * [freeifaddrs(3)](http://man7.org/linux/man-pages/man3/freeifaddrs.3.html) frees a linked list
- * of `struct ifaddrs` returned by getifaddrs().
- *
- * Available since API level 24.
- */
-void freeifaddrs(struct ifaddrs* __ptr) __INTRODUCED_IN(24);
-
-__END_DECLS
diff --git a/starboard/android/shared/bionic/net_if.cpp b/starboard/android/shared/bionic/net_if.cpp
deleted file mode 100644
index db9c9ea..0000000
--- a/starboard/android/shared/bionic/net_if.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <net/if.h>
-
-#include <errno.h>
-#include <ifaddrs.h>
-#include <linux/if_packet.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-#include <linux/sockios.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <unistd.h>
-
-#include "private/ErrnoRestorer.h"
-
-#include "bionic_netlink.h"
-
-char* if_indextoname(unsigned ifindex, char* ifname) {
-  int s = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC, 0);
-  if (s == -1) return nullptr;
-
-  struct ifreq ifr;
-  memset(&ifr, 0, sizeof(ifr));
-  ifr.ifr_ifindex = ifindex;
-
-  int rc = ioctl(s, SIOCGIFNAME, &ifr);
-  ErrnoRestorer errno_restorer;
-  close(s);
-  return (rc == -1) ? nullptr : strncpy(ifname, ifr.ifr_name, IFNAMSIZ);
-}
-
-unsigned if_nametoindex(const char* ifname) {
-  int s = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC, 0);
-  if (s == -1) return 0;
-
-  struct ifreq ifr;
-  memset(&ifr, 0, sizeof(ifr));
-  strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-  ifr.ifr_name[IFNAMSIZ - 1] = 0;
-
-  int rc = ioctl(s, SIOCGIFINDEX, &ifr);
-  ErrnoRestorer errno_restorer;
-  close(s);
-  return (rc == -1) ? 0 : ifr.ifr_ifindex;
-}
-
-struct if_list {
-  if_list* next;
-  struct if_nameindex data;
-
-  explicit if_list(if_list** list) {
-    // push_front onto `list`.
-    next = *list;
-    *list = this;
-  }
-
-  static void Free(if_list* list, bool names_too) {
-    while (list) {
-      if_list* it = list;
-      list = it->next;
-      if (names_too) free(it->data.if_name);
-      free(it);
-    }
-  }
-};
-
-static void __if_nameindex_callback(void* context, nlmsghdr* hdr) {
-  if_list** list = reinterpret_cast<if_list**>(context);
-  if (hdr->nlmsg_type == RTM_NEWLINK) {
-    ifinfomsg* ifi = reinterpret_cast<ifinfomsg*>(NLMSG_DATA(hdr));
-
-    // Create a new entry and set the interface index.
-    if_list* new_link = new if_list(list);
-    new_link->data.if_index = ifi->ifi_index;
-
-    // Go through the various bits of information and find the name.
-    rtattr* rta = IFLA_RTA(ifi);
-    size_t rta_len = IFLA_PAYLOAD(hdr);
-    while (RTA_OK(rta, rta_len)) {
-      if (rta->rta_type == IFLA_IFNAME) {
-        new_link->data.if_name = strndup(reinterpret_cast<char*>(RTA_DATA(rta)), RTA_PAYLOAD(rta));
-      }
-      rta = RTA_NEXT(rta, rta_len);
-    }
-  }
-}
-
-struct if_nameindex* if_nameindex() {
-  if_list* list = nullptr;
-
-  // Open the netlink socket and ask for all the links;
-  NetlinkConnection nc;
-  bool okay = nc.SendRequest(RTM_GETLINK) && nc.ReadResponses(__if_nameindex_callback, &list);
-  if (!okay) {
-    if_list::Free(list, true);
-    return nullptr;
-  }
-
-  // Count the interfaces.
-  size_t interface_count = 0;
-  for (if_list* it = list; it != nullptr; it = it->next) {
-    ++interface_count;
-  }
-
-  // Build the array POSIX requires us to return.
-  struct if_nameindex* result = new struct if_nameindex[interface_count + 1];
-  if (result) {
-    struct if_nameindex* out = result;
-    for (if_list* it = list; it != nullptr; it = it->next) {
-      out->if_index = it->data.if_index;
-      out->if_name = it->data.if_name;
-      ++out;
-    }
-    out->if_index = 0;
-    out->if_name = nullptr;
-  }
-
-  // Free temporary storage.
-  if_list::Free(list, false);
-
-  return result;
-}
-
-void if_freenameindex(struct if_nameindex* array) {
-  if (array == nullptr) return;
-
-  struct if_nameindex* ptr = array;
-  while (ptr->if_index != 0 || ptr->if_name != nullptr) {
-    free(ptr->if_name);
-    ++ptr;
-  }
-
-  delete[] array;
-}
diff --git a/starboard/android/shared/bionic/private/ErrnoRestorer.h b/starboard/android/shared/bionic/private/ErrnoRestorer.h
deleted file mode 100644
index 52e115a..0000000
--- a/starboard/android/shared/bionic/private/ErrnoRestorer.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#pragma once
-
-#include <errno.h>
-
-#include "bionic_macros.h"
-
-class ErrnoRestorer {
- public:
-  explicit ErrnoRestorer() : saved_errno_(errno) {
-  }
-
-  ~ErrnoRestorer() {
-    errno = saved_errno_;
-  }
-
-  void override(int new_errno) {
-    saved_errno_ = new_errno;
-  }
-
- private:
-  int saved_errno_;
-
-  BIONIC_DISALLOW_COPY_AND_ASSIGN(ErrnoRestorer);
-};
diff --git a/starboard/android/shared/bionic/private/bionic_macros.h b/starboard/android/shared/bionic/private/bionic_macros.h
deleted file mode 100644
index 4800e3a..0000000
--- a/starboard/android/shared/bionic/private/bionic_macros.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#pragma once
-
-#include <stdint.h>
-
-#define BIONIC_DISALLOW_COPY_AND_ASSIGN(TypeName) \
-  TypeName(const TypeName&) = delete;             \
-  void operator=(const TypeName&) = delete
-
-#define BIONIC_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
-  TypeName() = delete;                                  \
-  BIONIC_DISALLOW_COPY_AND_ASSIGN(TypeName)
-
-#define BIONIC_ROUND_UP_POWER_OF_2(value) \
-  ((sizeof(value) == 8) \
-    ? (1UL << (64 - __builtin_clzl(static_cast<unsigned long>(value)))) \
-    : (1UL << (32 - __builtin_clz(static_cast<unsigned int>(value)))))
-
-static constexpr uintptr_t align_down(uintptr_t p, size_t align) {
-  return p & ~(align - 1);
-}
-
-static constexpr uintptr_t align_up(uintptr_t p, size_t align) {
-  return (p + align - 1) & ~(align - 1);
-}
-
-template <typename T>
-static inline T* align_down(T* p, size_t align) {
-  return reinterpret_cast<T*>(align_down(reinterpret_cast<uintptr_t>(p), align));
-}
-
-template <typename T>
-static inline T* align_up(T* p, size_t align) {
-  return reinterpret_cast<T*>(align_up(reinterpret_cast<uintptr_t>(p), align));
-}
-
-#if defined(__arm__)
-// Do not emit anything for arm, clang does not allow emiting an arm unwind
-// directive.
-// #define BIONIC_STOP_UNWIND asm volatile(".cantunwind")
-#define BIONIC_STOP_UNWIND
-#elif defined(__aarch64__)
-#define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined x30")
-#elif defined(__i386__)
-#define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined \%eip")
-#elif defined(__x86_64__)
-#define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined \%rip")
-#elif defined (__mips__)
-#define BIONIC_STOP_UNWIND asm volatile(".cfi_undefined $ra")
-#endif
-
-// The arraysize(arr) macro returns the # of elements in an array arr.
-// The expression is a compile-time constant, and therefore can be
-// used in defining new arrays, for example.  If you use arraysize on
-// a pointer by mistake, you will get a compile-time error.
-//
-// One caveat is that arraysize() doesn't accept any array of an
-// anonymous type or a type defined inside a function.
-//
-// This template function declaration is used in defining arraysize.
-// Note that the function doesn't need an implementation, as we only
-// use its type.
-template <typename T, size_t N>
-char (&ArraySizeHelper(T (&array)[N]))[N];  // NOLINT(readability/casting)
-
-#define arraysize(array) (sizeof(ArraySizeHelper(array)))
-
-// Used to inform clang's -Wimplicit-fallthrough that a fallthrough is intended. There's no way to
-// silence (or enable, apparently) -Wimplicit-fallthrough in C yet.
-#ifdef __cplusplus
-#define __BIONIC_FALLTHROUGH [[clang::fallthrough]]
-#else
-#define __BIONIC_FALLTHROUGH
-#endif
diff --git a/starboard/android/shared/cobalt/cobalt_platform.gyp b/starboard/android/shared/cobalt/cobalt_platform.gyp
deleted file mode 100644
index 2d4ba5b..0000000
--- a/starboard/android/shared/cobalt/cobalt_platform.gyp
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'cobalt_platform',
-      'type': 'static_library',
-      'sources': [
-        'android_user_authorizer.h',
-        'android_user_authorizer.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/cobalt/base/base.gyp:base',
-      ],
-    }
-  ],
-}
diff --git a/starboard/android/shared/cobalt/configuration.gypi b/starboard/android/shared/cobalt/configuration.gypi
deleted file mode 100644
index c9cdba0..0000000
--- a/starboard/android/shared/cobalt/configuration.gypi
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Cobalt-on-Android-specific configuration for Starboard.
-
-{
-  'variables': {
-    'in_app_dial': 0,
-
-    'enable_account_manager': 1,
-
-    # The 'android_system' font package installs only minimal fonts, with a
-    # fonts.xml referencing the superset of font files we expect to find on any
-    # Android platform. The Android SbFileOpen implementation falls back to
-    # system fonts when it can't find the font file in the cobalt content.
-    'cobalt_font_package': 'android_system',
-
-    # Platform-specific implementations to compile into cobalt.
-    'cobalt_platform_dependencies': [
-      '<(DEPTH)/starboard/android/shared/cobalt/cobalt_platform.gyp:cobalt_platform',
-    ],
-  },
-}
diff --git a/starboard/android/shared/cobalt/configuration.py b/starboard/android/shared/cobalt/configuration.py
index 7cc5299..c606d82 100644
--- a/starboard/android/shared/cobalt/configuration.py
+++ b/starboard/android/shared/cobalt/configuration.py
@@ -13,8 +13,6 @@
 # limitations under the License.
 """Starboard Android Cobalt shared configuration."""
 
-import os
-
 from cobalt.build import cobalt_configuration
 from starboard.tools.testing import test_filter
 
@@ -22,26 +20,12 @@
 class CobaltAndroidConfiguration(cobalt_configuration.CobaltConfiguration):
   """Starboard Android Cobalt shared configuration."""
 
-  def GetPostIncludes(self):
-    # If there isn't a configuration.gypi found in the usual place, we'll
-    # supplement with our shared implementation.
-    includes = super(CobaltAndroidConfiguration, self).GetPostIncludes()
-    for include in includes:
-      if os.path.basename(include) == 'configuration.gypi':
-        return includes
-
-    shared_gypi_path = os.path.join(
-        os.path.dirname(__file__), 'configuration.gypi')
-    if os.path.isfile(shared_gypi_path):
-      includes.append(shared_gypi_path)
-    return includes
-
   def WebdriverBenchmarksEnabled(self):
     return True
 
   def GetTestFilters(self):
     filters = super(CobaltAndroidConfiguration, self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
+    for target, tests in self.__FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
 
@@ -72,7 +56,7 @@
     return filters
 
   # A map of failing or crashing tests per target.
-  __FILTERED_TESTS = {
+  __FILTERED_TESTS = {  # pylint: disable=invalid-name
       'layout_tests': [
           # Android relies of system fonts and some older Android builds do not
           # have the update (Emoji 11.0) NotoColorEmoji.ttf installed.
@@ -80,6 +64,11 @@
       ],
       'crypto_unittests': ['P224.*'],
       'renderer_test': [
+          # TODO(b/215739322): Using the android fonts breaks these tests. They
+          # make use of fonts that are not bundled on Android.
+          'PixelTest.SimpleTextInRed40PtChineseFont',
+          'PixelTest.SimpleTextInRed40PtThaiFont',
+
           # Instead of returning an error when allocating too much texture
           # memory, Android instead just terminates the process.  Since this
           # test explicitly tries to allocate too much texture memory, we cannot
diff --git a/starboard/android/shared/download_sdk.sh b/starboard/android/shared/download_sdk.sh
new file mode 100755
index 0000000..d968f8b
--- /dev/null
+++ b/starboard/android/shared/download_sdk.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e
+
+TOOLS_VERSION="${1:-6200805}"
+TOOLS_FILENAME="commandlinetools-linux-${TOOLS_VERSION}_latest.zip"
+BASE_URL="https://dl.google.com/android/repository"
+ANDROID_SDK_ROOT="${ANDROID_HOME:-${HOME}/starboard-toolchains/AndroidSdk}"
+SDK_MANAGER_TOOL="${ANDROID_SDK_ROOT}/cmdline-tools/1.0/bin/sdkmanager"
+CURRENT_WORKING_DIRECTORY="${PWD}"
+
+if [ ! -f "${SDK_MANAGER_TOOL}" ]; then
+  echo "Downloading the SDK..."
+
+  rm -rf "${ANDROID_SDK_ROOT}"
+
+  cd /tmp
+  mkdir -p ${ANDROID_SDK_ROOT}
+  curl --silent -O -J  ${BASE_URL}/${TOOLS_FILENAME}
+  unzip ${TOOLS_FILENAME} -d ${ANDROID_SDK_ROOT}
+  rm ${TOOLS_FILENAME}
+  mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools
+  mv ${ANDROID_SDK_ROOT}/tools ${ANDROID_SDK_ROOT}/cmdline-tools/1.0
+  echo "Android SDK installed."
+fi
+
+cd "${CURRENT_WORKING_DIRECTORY}"
+
+echo "Updating the SDK..."
+
+# Update the installation
+${SDK_MANAGER_TOOL} --sdk_root=${ANDROID_SDK_ROOT} \
+    "build-tools;30.0.0" \
+    "cmake;3.10.2.4988404" \
+    "cmdline-tools;1.0" \
+    "extras;android;m2repository" \
+    "extras;google;m2repository" \
+    "ndk;21.1.6352462" \
+    "patcher;v4" \
+    "platforms;android-30" \
+    "platform-tools"
+
+echo "Android SDK updated."
diff --git a/starboard/android/shared/graphics.cc b/starboard/android/shared/graphics.cc
new file mode 100644
index 0000000..5ceed59
--- /dev/null
+++ b/starboard/android/shared/graphics.cc
@@ -0,0 +1,59 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/android/shared/graphics.h"
+
+#include "starboard/common/log.h"
+
+#include "cobalt/extension/graphics.h"
+#include "starboard/android/shared/application_android.h"
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+namespace {
+
+float GetMaximumFrameIntervalInMilliseconds() {
+  return -1.0f;
+}
+
+float GetMinimumFrameIntervalInMilliseconds() {
+  return 16.0f;
+}
+
+bool IsMapToMeshEnabled() {
+  bool supports_spherical_videos =
+      starboard::android::shared::ApplicationAndroid::Get()
+          ->GetOverlayedBoolValue("supports_spherical_videos");
+  return supports_spherical_videos;
+}
+
+const CobaltExtensionGraphicsApi kGraphicsApi = {
+    kCobaltExtensionGraphicsName,
+    3,
+    &GetMaximumFrameIntervalInMilliseconds,
+    &GetMinimumFrameIntervalInMilliseconds,
+    &IsMapToMeshEnabled,
+};
+
+}  // namespace
+
+const void* GetGraphicsApi() {
+  return &kGraphicsApi;
+}
+
+}  // namespace shared
+}  // namespace android
+}  // namespace starboard
diff --git a/starboard/android/shared/graphics.h b/starboard/android/shared/graphics.h
new file mode 100644
index 0000000..34b3447
--- /dev/null
+++ b/starboard/android/shared/graphics.h
@@ -0,0 +1,28 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_ANDROID_SHARED_GRAPHICS_H_
+#define STARBOARD_ANDROID_SHARED_GRAPHICS_H_
+
+namespace starboard {
+namespace android {
+namespace shared {
+
+const void* GetGraphicsApi();
+
+}  // namespace shared
+}  // namespace android
+}  // namespace starboard
+
+#endif  // STARBOARD_ANDROID_SHARED_GRAPHICS_H_
diff --git a/starboard/android/shared/gyp_configuration.gypi b/starboard/android/shared/gyp_configuration.gypi
deleted file mode 100644
index 01b65db..0000000
--- a/starboard/android/shared/gyp_configuration.gypi
+++ /dev/null
@@ -1,164 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Platform specific configuration for Android on Starboard.  Automatically
-# included by gyp_cobalt in all .gyp files by Cobalt together with base.gypi.
-#
-{
-  'variables': {
-    'target_os': 'android',
-    'final_executable_type': 'shared_library',
-    'gtest_target_type': 'shared_library',
-    'sb_widevine_platform': 'android',
-    'sb_enable_benchmark': 1,
-    'cobalt_licenses_platform': 'android',
-
-    'gl_type': 'system_gles2',
-    'enable_remote_debugging': 0,
-
-    'enable_vulkan%': 0,
-
-    'linker_flags': [
-      # The NDK default "ld" is actually the gold linker for all architectures
-      # except arm64 (aarch64) where it's the bfd linker. Don't use either of
-      # those, rather use lld everywhere. See release notes for NDK 19:
-      # https://developer.android.com/ndk/downloads/revision_history
-      '-fuse-ld=lld',
-    ],
-
-    # Define platform specific compiler and linker flags.
-    # Refer to base.gypi for a list of all available variables.
-    'compiler_flags_host': [
-      '-O2',
-    ],
-    'compiler_flags_debug': [
-      '-frtti',
-      '-O0',
-    ],
-    'compiler_flags_devel': [
-      '-frtti',
-      '-O2',
-    ],
-    'compiler_flags_qa': [
-      '-fno-rtti',
-      '-gline-tables-only',
-    ],
-    'compiler_flags_qa_size': [
-      '-Os',
-    ],
-    'compiler_flags_qa_speed': [
-      '-O2',
-    ],
-    'compiler_flags_gold': [
-      '-fno-rtti',
-      '-gline-tables-only',
-    ],
-    'compiler_flags_gold_size': [
-      '-Os',
-    ],
-    'compiler_flags_gold_speed': [
-      '-O2',
-    ],
-    'platform_libraries': [
-      '-lEGL',
-      '-lGLESv2',
-      '-lOpenSLES',
-      '-landroid',
-      '-llog',
-      '-lmediandk',
-    ],
-    'conditions': [
-      ['cobalt_fastbuild==0', {
-        'compiler_flags_debug': [
-          '-g',
-        ],
-        'compiler_flags_devel': [
-          '-g',
-        ],
-        'compiler_flags_qa': [
-          '-gline-tables-only',
-        ],
-        'compiler_flags_gold': [
-          '-gline-tables-only',
-        ],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'target_conditions': [
-      ['sb_pedantic_warnings==1', {
-        'cflags': [
-          '-Wall',
-          '-Wextra',
-          '-Wunreachable-code',
-          # Don't get pedantic about warnings from base macros. These must be
-          # disabled after the -Wall above, so this has to be done here rather
-          # than in the platform's target toolchain.
-          # TODO: Rebase base and use static_assert instead of COMPILE_ASSERT
-          '-Wno-unused-local-typedef',  # COMPILE_ASSERT
-          '-Wno-missing-field-initializers',  # LAZY_INSTANCE_INITIALIZER
-          # It's OK not to use some input parameters. Note that the order
-          # matters: Wall implies Wunused-parameter and Wno-unused-parameter
-          # has no effect if specified before Wall.
-          '-Wno-unused-parameter',
-        ],
-      }],
-      ['_type=="executable"', {
-        # Android Lollipop+ requires relocatable executables.
-        'cflags': [
-          '-fPIE',
-        ],
-        'ldflags': [
-          '-pie',
-        ],
-      },{
-        # Android requires relocatable shared libraries.
-        'cflags': [
-          '-fPIC',
-        ],
-      }],
-      ['use_asan==1', {
-        'cflags': [
-          '-fsanitize=address',
-          '-fno-omit-frame-pointer',
-        ],
-        'ldflags': [
-          '-fsanitize=address',
-          # Force linking of the helpers in sanitizer_options.cc
-          '-Wl,-u_sanitizer_options_link_helper',
-        ],
-        'defines': [
-          'ADDRESS_SANITIZER',
-        ],
-      }],
-      ['use_tsan==1', {
-        'cflags': [
-          '-fsanitize=thread',
-          '-fno-omit-frame-pointer',
-        ],
-        'ldflags': [
-          '-fsanitize=thread',
-        ],
-        'defines': [
-          'THREAD_SANITIZER',
-        ],
-      }],
-    ],
-  }, # end of target_defaults
-
-  'includes': [
-    '<(DEPTH)/starboard/sabi/sabi.gypi',
-  ],
-}
diff --git a/starboard/android/shared/gyp_configuration.py b/starboard/android/shared/gyp_configuration.py
index 83e55d2..54f1a6e 100644
--- a/starboard/android/shared/gyp_configuration.py
+++ b/starboard/android/shared/gyp_configuration.py
@@ -17,318 +17,24 @@
 
 import imp  # pylint: disable=deprecated-module
 import os
-import subprocess
 
-from starboard.android.shared import sdk_utils
-from starboard.build import clang as clang_build
 from starboard.build.platform_configuration import PlatformConfiguration
-from starboard.tools import build
-from starboard.tools.testing import test_filter
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import touch
-
-_APK_DIR = os.path.join(os.path.dirname(__file__), os.path.pardir, 'apk')
-_APK_BUILD_ID_FILE = os.path.join(_APK_DIR, 'build.id')
-_COBALT_GRADLE = os.path.join(_APK_DIR, 'cobalt-gradle.sh')
-
-# The API level of NDK tools to use. This should be the minimum API level on
-# which the app is expected to run. If some feature from a newer NDK level is
-# needed, this may be increased with caution.
-# https://developer.android.com/ndk/guides/stable_apis.html
-#
-# Using 24 will lead to missing symbols on API 23 devices.
-# https://github.com/android-ndk/ndk/issues/126
-_ANDROID_NDK_API_LEVEL = '21'
-
-# Maps the Android ABI to the clang & ar executable names.
-_ABI_TOOL_NAMES = {
-    'x86': ('i686-linux-android{}-clang'.format(_ANDROID_NDK_API_LEVEL),
-            'i686-linux-android-ar'),
-    'x86_64': ('x86_64-linux-android{}-clang'.format(_ANDROID_NDK_API_LEVEL),
-               'x86_64-linux-android-ar'),
-    'armeabi':
-        ('armv7a-linux-androideabi{}-clang'.format(_ANDROID_NDK_API_LEVEL),
-         'armv7a-linux-androideabi-ar'),
-    'armeabi-v7a':
-        ('armv7a-linux-androideabi{}-clang'.format(_ANDROID_NDK_API_LEVEL),
-         'arm-linux-androideabi-ar'),
-    'arm64-v8a':
-        ('aarch64-linux-android{}-clang'.format(_ANDROID_NDK_API_LEVEL),
-         'aarch64-linux-android-ar'),
-}
 
 
 class AndroidConfiguration(PlatformConfiguration):
   """Starboard Android platform configuration."""
 
-  # TODO: make ASAN work with NDK tools and enable it by default
-  def __init__(self,
-               platform,
-               android_abi,
-               asan_enabled_by_default=False,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(AndroidConfiguration, self).__init__(platform,
-                                               asan_enabled_by_default)
-    self._target_toolchain = None
-    self._host_toolchain = None
-
+  def __init__(self, platform):
+    super(AndroidConfiguration, self).__init__(platform)
     self.AppendApplicationConfigurationPath(os.path.dirname(__file__))
 
-    self.android_abi = android_abi
-    self.sabi_json_path = sabi_json_path
-
-    self.android_home = sdk_utils.GetSdkPath()
-    self.android_ndk_home = sdk_utils.GetNdkPath()
-
-    print('Using Android SDK at {}'.format(self.android_home))
-    print('Using Android NDK at {}'.format(self.android_ndk_home))
-
-  def GetBuildFormat(self):
-    """Returns the desired build format."""
-    # The comma means that ninja and qtcreator_ninja will be chained and use the
-    # same input information so that .gyp files will only have to be parsed
-    # once.
-    return 'ninja,qtcreator_ninja'
-
-  def GetVariables(self, configuration):
-    variables = super(AndroidConfiguration, self).GetVariables(
-        configuration, use_clang=1)
-    variables.update({
-        'ANDROID_HOME':
-            self.android_home,
-        'NDK_HOME':
-            self.android_ndk_home,
-        'ANDROID_ABI':
-            self.android_abi,
-        'include_path_platform_deploy_gypi':
-            'starboard/android/shared/platform_deploy.gypi',
-    })
-    return variables
-
   def GetDeployPathPatterns(self):
     # example src/out/android-arm64/devel/cobalt.apk
     return ['*.apk']
 
-  def GetGeneratorVariables(self, config_name):
-    _ = config_name
-    generator_variables = {
-        'qtcreator_session_name_prefix': 'cobalt',
-    }
-    return generator_variables
-
-  def SetupPlatformTools(self, build_number):
-    sdk_utils.InstallSdkIfNeeded()
-    subprocess.call([_COBALT_GRADLE, '--reset'])
-    with open(_APK_BUILD_ID_FILE, 'w') as build_id_file:
-      build_id_file.write('{}'.format(build_number))
-
-  def GetEnvironmentVariables(self):
-    env_variables = {}
-
-    # Android builds tend to consume significantly more memory than the
-    # default settings permit, so cap this at 1 in order to avoid build
-    # issues.  Without this, 32GB machines end up getting automatically
-    # configured to run 5 at a time, which can be too much for at least
-    # android-arm64_debug.
-    # TODO: Eventually replace this with something more robust, like an
-    #       implementation of the abstract toolchain for Android.
-    env_variables.update({'GYP_LINK_CONCURRENCY': '1'})
-
-    return env_variables
-
-  def GetTargetToolchain(self, **kwargs):
-    if not self._target_toolchain:
-      tool_prefix = os.path.join(sdk_utils.GetNdkPath(), 'toolchains', 'llvm',
-                                 'prebuilt', 'linux-x86_64', 'bin', '')
-      cc_path = self.build_accelerator + ' ' + tool_prefix + _ABI_TOOL_NAMES[
-          self.android_abi][0]
-      cxx_path = cc_path + '++'
-      ar_path = tool_prefix + _ABI_TOOL_NAMES[self.android_abi][1]
-      clang_flags = [
-          # libwebp uses the cpufeatures library to detect ARM NEON support
-          '-I{}/sources/android/cpufeatures'.format(self.android_ndk_home),
-
-          # Mimic build/cmake/android.toolchain.cmake in the Android NDK.
-          '-ffunction-sections',
-          '-funwind-tables',
-          '-fstack-protector-strong',
-          '-no-canonical-prefixes',
-
-          # Other flags
-          '-fsigned-char',
-          '-fno-limit-debug-info',
-          '-fno-exceptions',
-          '-fcolor-diagnostics',
-          '-fno-strict-aliasing',  # See http://crbug.com/32204
-
-          # Default visibility is hidden to enable dead stripping.
-          '-fvisibility=hidden',
-          # Any warning will stop the build.
-          '-Werror',
-
-          # Disable errors for the warning till the Android NDK r19 is fixed.
-          # The warning is trigger when compiling .c files and complains for
-          # '-stdlib=libc++' which is added by the NDK.
-          '-Wno-error=unused-command-line-argument',
-
-          # Don't warn about register variables (in base and net)
-          '-Wno-deprecated-register',
-          # Don't warn about deprecated ICU methods (in googleurl and net)
-          '-Wno-deprecated-declarations',
-          # Skia doesn't use overrides.
-          '-Wno-inconsistent-missing-override',
-          # shifting a negative signed value is undefined
-          '-Wno-shift-negative-value',
-          # Don't warn for implicit sign conversions. (in v8 and protobuf)
-          '-Wno-sign-conversion',
-      ]
-      clang_defines = [
-          # Enable compile-time decisions based on the ABI
-          'ANDROID_ABI={}'.format(self.android_abi),
-          # -DANDROID is an argument to some ifdefs in the NDK's eglplatform.h
-          'ANDROID',
-          # Cobalt on Linux flag
-          'COBALT_LINUX',
-          # So that we get the PRI* macros from inttypes.h
-          '__STDC_FORMAT_MACROS',
-          # Enable GNU extensions to get prototypes like ffsl.
-          '_GNU_SOURCE=1',
-          # Undefining __linux__ causes the system headers to make wrong
-          # assumptions about which C-library is used on the platform.
-          '__BIONIC__',
-          # Undefining __linux__ leaves libc++ without a threads implementation.
-          # TODO: See if there's a way to make libcpp threading use Starboard.
-          '_LIBCPP_HAS_THREAD_API_PTHREAD',
-      ]
-      linker_flags = [
-          # Use the static LLVM libc++.
-          '-static-libstdc++',
-
-          # Mimic build/cmake/android.toolchain.cmake in the Android NDK, but
-          # force build-id to sha1, so that older lldb versions can still find
-          # debugsymbols, see https://github.com/android-ndk/ndk/issues/885
-          '-Wl,--build-id=sha1',
-          '-Wl,--warn-shared-textrel',
-          '-Wl,--fatal-warnings',
-          '-Wl,--gc-sections',
-          '-Wl,-z,nocopyreloc',
-
-          # Wrapper synchronizes punch-out video bounds with the UI frame.
-          '-Wl,--wrap=eglSwapBuffers',
-      ]
-      self._target_toolchain = [
-          clang.CCompiler(
-              path=cc_path, defines=clang_defines, extra_flags=clang_flags),
-          clang.CxxCompiler(
-              path=cxx_path,
-              defines=clang_defines,
-              extra_flags=clang_flags + [
-                  '-std=c++14',
-              ]),
-          clang.AssemblerWithCPreprocessor(
-              path=cc_path, defines=clang_defines, extra_flags=clang_flags),
-          ar.StaticThinLinker(path=ar_path),
-          ar.StaticLinker(path=ar_path),
-          clangxx.SharedLibraryLinker(path=cxx_path, extra_flags=linker_flags),
-          clangxx.ExecutableLinker(path=cxx_path, extra_flags=linker_flags),
-      ]
-    return self._target_toolchain
-
-  def GetHostToolchain(self, **kwargs):
-    if not self._host_toolchain:
-      if not hasattr(self, 'host_compiler_environment'):
-        self.host_compiler_environment = build.GetHostCompilerEnvironment(
-            clang_build.GetClangSpecification(), self.build_accelerator)
-      cc_path = self.host_compiler_environment['CC_host']
-      cxx_path = self.host_compiler_environment['CXX_host']
-      self._host_toolchain = [
-          clang.CCompiler(path=cc_path),
-          clang.CxxCompiler(path=cxx_path),
-          clang.AssemblerWithCPreprocessor(path=cc_path),
-          ar.StaticThinLinker(),
-          ar.StaticLinker(),
-          clangxx.ExecutableLinker(path=cxx_path),
-          clangxx.SharedLibraryLinker(path=cxx_path),
-          cp.Copy(),
-          touch.Stamp(),
-          bash.Shell(),
-      ]
-    return self._host_toolchain
-
   def GetLauncher(self):
     """Gets the module used to launch applications on this platform."""
     module_path = os.path.abspath(
         os.path.join(os.path.dirname(__file__), 'launcher.py'))
     launcher_module = imp.load_source('launcher', module_path)
     return launcher_module
-
-  def GetTestFilters(self):
-    filters = super(AndroidConfiguration, self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
-      filters.extend(test_filter.TestFilter(target, test) for test in tests)
-    return filters
-
-  # A map of failing or crashing tests per target.
-  __FILTERED_TESTS = {  # pylint: disable=invalid-name
-      'player_filter_tests': [
-          # GetMaxNumberOfCachedFrames() on Android is device dependent,
-          # and Android doesn't provide an API to get it. So, this function
-          # doesn't make sense on Android. But HoldFramesUntilFull tests depend
-          # on this number strictly.
-          'VideoDecoderTests/VideoDecoderTest.HoldFramesUntilFull/*',
-
-          # Currently, invalid input tests are not supported.
-          'VideoDecoderTests/VideoDecoderTest.SingleInvalidInput/*',
-          'VideoDecoderTests/VideoDecoderTest'
-          '.MultipleValidInputsAfterInvalidKeyFrame/*',
-          'VideoDecoderTests/VideoDecoderTest.MultipleInvalidInput/*',
-
-          # Android currently does not support multi-video playback, which
-          # the following tests depend upon.
-          'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/*',
-
-          # The video pipeline will hang if it doesn't receive any input.
-          'PlayerComponentsTests/PlayerComponentsTest.EOSWithoutInput/*',
-
-          # The e/eac3 audio time reporting during pause will be revisitied.
-          'PlayerComponentsTests/PlayerComponentsTest.Pause/15',
-      ],
-      'nplb': [
-          # This test is failing because localhost is not defined for IPv6 in
-          # /etc/hosts.
-          'SbSocketAddressTypes/SbSocketResolveTest.Localhost/1',
-
-          # These tests are taking longer due to interop on android. Work is
-          # underway to investigate whether this is acceptable.
-          'SbMediaCanPlayMimeAndKeySystem.ValidatePerformance',
-          'SbMediaConfigurationTest.ValidatePerformance',
-
-          # SbDirectory has problems with empty Asset dirs.
-          'SbDirectoryCanOpenTest.SunnyDayStaticContent',
-          'SbDirectoryGetNextTest.SunnyDayStaticContent',
-          'SbDirectoryOpenTest.SunnyDayStaticContent',
-          'SbFileGetPathInfoTest.WorksOnStaticContentDirectories',
-
-          # These tests are disabled due to not receiving the kEndOfStream
-          # player state update within the specified timeout.
-          'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.NoInput/*',
-
-          # Android does not use SbDrmSessionClosedFunc, which these tests
-          # depend on.
-          'SbDrmSessionTest.SunnyDay',
-          'SbDrmSessionTest.CloseDrmSessionBeforeUpdateSession',
-
-          # This test is failing because Android calls the
-          # SbDrmSessionUpdateRequestFunc with SbDrmStatus::kSbDrmStatusSuccess
-          # when invalid initialization data is passed to
-          # SbDrmGenerateSessionUpdateRequest().
-          'SbDrmSessionTest.InvalidSessionUpdateRequestParams',
-      ],
-  }
-
-  def GetPathToSabiJsonFile(self):
-    return self.sabi_json_path
diff --git a/starboard/android/shared/install_target.gni b/starboard/android/shared/install_target.gni
index aef5ff2..0a635e1 100644
--- a/starboard/android/shared/install_target.gni
+++ b/starboard/android/shared/install_target.gni
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import("//starboard/android/apk/apk_sources.gni")
 import("//starboard/android/shared/toolchain/toolchain.gni")
 import("//starboard/build/config/install.gni")
 
@@ -24,13 +25,10 @@
     forward_variables_from(invoker, [ "testonly" ])
 
     deps = invoker.deps
-    deps += [
-      ":$installable_target_name",
-      "//starboard/android/apk:apk_sources",
-    ]
+    deps += [ ":$installable_target_name" ]
 
     target_output = "$root_out_dir/lib${installable_target_name}.so"
-    gradle_content_dir = "$sb_install_output_dir/$sb_install_content_subdir"
+    gradle_content_dir = "$sb_install_output_dir/$installable_target_name/$sb_install_content_subdir"
     gradle_files_dir = "$root_out_dir/gradle/$installable_target_name"
     if (is_gold) {
       gradle_build_type = "release"
@@ -38,10 +36,13 @@
       gradle_build_type = build_type
     }
 
+    bash_script = "//starboard/android/apk/cobalt-gradle.sh"
+
     sources = [
-      "$root_out_dir/gradle/apk_sources.stamp",
+      bash_script,
       target_output,
     ]
+    sources += apk_sources
 
     outputs = [ "$root_out_dir/${installable_target_name}.apk" ]
 
@@ -53,14 +54,12 @@
     cobalt_library_dir = rebase_path(root_out_dir)
 
     script = "//starboard/build/run_bash.py"
-    bash_script =
-        rebase_path("//starboard/android/apk/cobalt-gradle.sh", root_build_dir)
     args = [
-      bash_script,
+      rebase_path(bash_script, root_build_dir),
       "--sdk",
       android_sdk_path,
       "--cache",
-      rebase_path(root_build_dir),
+      rebase_path("$root_build_dir/gradle/$installable_target_name/cache"),
       "--project-dir",
       cobalt_project_dir,
       "-P",
diff --git a/starboard/android/shared/launcher.py b/starboard/android/shared/launcher.py
index 0175159..d7b2214 100644
--- a/starboard/android/shared/launcher.py
+++ b/starboard/android/shared/launcher.py
@@ -22,11 +22,9 @@
 import sys
 import threading
 import time
-import Queue
+from six.moves import queue
 
-import _env  # pylint: disable=unused-import,g-bad-import-order
-
-from starboard.android.shared import sdk_utils
+from starboard.android.shared.sdk_utils import SDK_PATH
 from starboard.tools import abstract_launcher
 
 _APP_PACKAGE_NAME = 'dev.cobalt.coat'
@@ -138,7 +136,7 @@
       # Use default adb binary from path.
       self.adb = 'adb'
     else:
-      self.adb = os.path.join(sdk_utils.GetSdkPath(), 'platform-tools', 'adb')
+      self.adb = os.path.join(SDK_PATH, 'platform-tools', 'adb')
 
     self.adb_builder = AdbCommandBuilder(self.adb)
 
@@ -303,7 +301,7 @@
         self._CheckCallAdb('shell', 'pm', 'grant', _APP_PACKAGE_NAME,
                            permission)
 
-    done_queue = Queue.Queue()
+    done_queue = queue.Queue()
     am_monitor = AdbAmMonitorWatcher(self, done_queue)
 
     # Increases the size of the logcat buffer.  Without this, the log buffer
@@ -327,6 +325,7 @@
 
     # Actually running executable
     run_timer = StepTimer('running executable')
+    app_crashed = False
     try:
       args = ['shell', 'am', 'start']
       command_line_params = [
@@ -347,7 +346,6 @@
 
       run_loop = abstract_launcher.ARG_DRYRUN not in self.launcher_args
 
-      app_crashed = False
       while run_loop:
         if not done_queue.empty():
           done_queue_code = done_queue.get_nowait()
diff --git a/starboard/android/shared/media_codec_bridge.cc b/starboard/android/shared/media_codec_bridge.cc
index 57acdad..d663f08 100644
--- a/starboard/android/shared/media_codec_bridge.cc
+++ b/starboard/android/shared/media_codec_bridge.cc
@@ -207,6 +207,7 @@
     bool require_software_codec,
     int tunnel_mode_audio_session_id,
     bool force_big_endian_hdr_metadata,
+    bool force_improved_support_check,
     std::string* error_message) {
   SB_DCHECK(error_message);
 
@@ -256,16 +257,16 @@
       new MediaCodecBridge(handler));
   env->CallStaticVoidMethodOrAbort(
       "dev/cobalt/media/MediaCodecBridge", "createVideoMediaCodecBridge",
-      "(JLjava/lang/String;ZZIIILandroid/view/Surface;"
+      "(JLjava/lang/String;ZZZIIILandroid/view/Surface;"
       "Landroid/media/MediaCrypto;"
       "Ldev/cobalt/media/MediaCodecBridge$ColorInfo;"
       "I"
       "Ldev/cobalt/media/MediaCodecBridge$CreateMediaCodecBridgeResult;)"
       "V",
       reinterpret_cast<jlong>(native_media_codec_bridge.get()), j_mime.Get(),
-      !!j_media_crypto, require_software_codec, width, height, fps, j_surface,
-      j_media_crypto, j_color_info.Get(), tunnel_mode_audio_session_id,
-      j_create_media_codec_bridge_result.Get());
+      !!j_media_crypto, require_software_codec, force_improved_support_check,
+      width, height, fps, j_surface, j_media_crypto, j_color_info.Get(),
+      tunnel_mode_audio_session_id, j_create_media_codec_bridge_result.Get());
 
   jobject j_media_codec_bridge = env->CallObjectMethodOrAbort(
       j_create_media_codec_bridge_result.Get(), "mediaCodecBridge",
diff --git a/starboard/android/shared/media_codec_bridge.h b/starboard/android/shared/media_codec_bridge.h
index 60a6487..77b9c7a 100644
--- a/starboard/android/shared/media_codec_bridge.h
+++ b/starboard/android/shared/media_codec_bridge.h
@@ -113,6 +113,7 @@
       bool require_software_codec,
       int tunnel_mode_audio_session_id,
       bool force_big_endian_hdr_metadata,
+      bool force_improved_support_check,
       std::string* error_message);
 
   ~MediaCodecBridge();
diff --git a/starboard/android/shared/media_decoder.cc b/starboard/android/shared/media_decoder.cc
index 44095f7..66bd437 100644
--- a/starboard/android/shared/media_decoder.cc
+++ b/starboard/android/shared/media_decoder.cc
@@ -117,6 +117,7 @@
                            const FrameRenderedCB& frame_rendered_cb,
                            int tunnel_mode_audio_session_id,
                            bool force_big_endian_hdr_metadata,
+                           bool force_improved_support_check,
                            std::string* error_message)
     : media_type_(kSbMediaTypeVideo),
       host_(host),
@@ -131,7 +132,8 @@
   media_codec_bridge_ = MediaCodecBridge::CreateVideoMediaCodecBridge(
       video_codec, width, height, fps, this, j_output_surface, j_media_crypto,
       color_metadata, require_software_codec, tunnel_mode_audio_session_id,
-      force_big_endian_hdr_metadata, error_message);
+      force_big_endian_hdr_metadata, force_improved_support_check,
+      error_message);
   if (!media_codec_bridge_) {
     SB_LOG(ERROR) << "Failed to create video media codec bridge with error: "
                   << *error_message;
diff --git a/starboard/android/shared/media_decoder.h b/starboard/android/shared/media_decoder.h
index 423d6ac..dbe73fc 100644
--- a/starboard/android/shared/media_decoder.h
+++ b/starboard/android/shared/media_decoder.h
@@ -89,6 +89,7 @@
                const FrameRenderedCB& frame_rendered_cb,
                int tunnel_mode_audio_session_id,
                bool force_big_endian_hdr_metadata,
+               bool force_improved_support_check,
                std::string* error_message);
   ~MediaDecoder();
 
diff --git a/starboard/android/shared/media_get_video_buffer_budget.cc b/starboard/android/shared/media_get_video_buffer_budget.cc
new file mode 100644
index 0000000..48f6656
--- /dev/null
+++ b/starboard/android/shared/media_get_video_buffer_budget.cc
@@ -0,0 +1,68 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <algorithm>
+
+#include "starboard/android/shared/application_android.h"
+#include "starboard/common/log.h"
+#include "starboard/media.h"
+
+int SbMediaGetVideoBufferBudget(SbMediaVideoCodec codec,
+                                int resolution_width,
+                                int resolution_height,
+                                int bits_per_pixel) {
+  constexpr int kMaxVideoBufferBudget = 300 * 1024 * 1024;
+  auto get_overlayed_video_buffer_budget = []() {
+    int buffer_budget = starboard::android::shared::ApplicationAndroid::Get()
+                            ->GetOverlayedIntValue("max_video_buffer_budget");
+    if (buffer_budget == 0) {
+      return kMaxVideoBufferBudget;
+    }
+    SB_LOG(INFO) << "RRO \"max_video_buffer_budget\" is set to "
+                 << buffer_budget << " MB.";
+    return buffer_budget * 1024 * 1024;
+  };
+
+  static const int overlayed_video_buffer_budget =
+      get_overlayed_video_buffer_budget();
+
+  int video_buffer_budget = 0;
+  if ((resolution_width <= 1920 && resolution_height <= 1080) ||
+      resolution_width == kSbMediaVideoResolutionDimensionInvalid ||
+      resolution_height == kSbMediaVideoResolutionDimensionInvalid) {
+    // Specifies the maximum amount of memory used by video buffers of media
+    // source before triggering a garbage collection when the video resolution
+    // is lower than 1080p (1920x1080).
+    video_buffer_budget = 30 * 1024 * 1024;
+  } else if (resolution_width <= 3840 && resolution_height <= 2160) {
+    if (bits_per_pixel <= 8) {
+      // Specifies the maximum amount of memory used by video buffers of media
+      // source before triggering a garbage collection when the video resolution
+      // is lower than 4k (3840x2160) and bit per pixel is lower than 8.
+      video_buffer_budget = 100 * 1024 * 1024;
+    } else {
+      // Specifies the maximum amount of memory used by video buffers of media
+      // source before triggering a garbage collection when video resolution is
+      // lower than 4k (3840x2160) and bit per pixel is greater than 8.
+      video_buffer_budget = 160 * 1024 * 1024;
+    }
+  } else {
+    // Specifies the maximum amount of memory used by video buffers of media
+    // source before triggering a garbage collection when the video resolution
+    // is lower than 8k (7680x4320).
+    video_buffer_budget = kMaxVideoBufferBudget;
+  }
+
+  return std::min(video_buffer_budget, overlayed_video_buffer_budget);
+}
diff --git a/starboard/android/shared/media_is_video_supported.cc b/starboard/android/shared/media_is_video_supported.cc
index d4e8a48..ff0acdf 100644
--- a/starboard/android/shared/media_is_video_supported.cc
+++ b/starboard/android/shared/media_is_video_supported.cc
@@ -35,24 +35,7 @@
 const jint HDR_TYPE_HDR10 = 2;
 const jint HDR_TYPE_HLG = 3;
 
-bool IsHDRTransferCharacteristicsSupported(SbMediaVideoCodec video_codec,
-                                           SbMediaTransferId transfer_id) {
-  const char* mime = SupportedVideoCodecToMimeType(video_codec);
-  if (!mime) {
-    return false;
-  }
-  JniEnvExt* env = JniEnvExt::Get();
-  ScopedLocalJavaRef<jstring> j_mime(env->NewStringStandardUTFOrAbort(mime));
-
-  // An HDR capable VP9 or AV1 decoder is needed to handle HDR at all.
-  bool has_hdr_capable_decoder =
-      JniEnvExt::Get()->CallStaticBooleanMethodOrAbort(
-          "dev/cobalt/media/MediaCodecUtil", "hasHdrCapableVideoDecoder",
-          "(Ljava/lang/String;)Z", j_mime.Get()) == JNI_TRUE;
-  if (!has_hdr_capable_decoder) {
-    return false;
-  }
-
+bool IsHDRTransferCharacteristicsSupported(SbMediaTransferId transfer_id) {
   jint hdr_type;
   if (transfer_id == kSbMediaTransferIdSmpteSt2084) {
     hdr_type = HDR_TYPE_HDR10;
@@ -83,18 +66,14 @@
                              int64_t bitrate,
                              int fps,
                              bool decode_to_texture_required) {
-  if (!IsSDRVideo(bit_depth, primary_id, transfer_id, matrix_id)) {
-    if (!IsHDRTransferCharacteristicsSupported(video_codec, transfer_id)) {
-      return false;
-    }
+  const bool must_support_hdr =
+      !IsSDRVideo(bit_depth, primary_id, transfer_id, matrix_id);
+  if (must_support_hdr && !IsHDRTransferCharacteristicsSupported(transfer_id)) {
+    return false;
   }
   // While not necessarily true, for now we assume that all Android devices
   // can play decode-to-texture video just as well as normal video.
 
-  const char* mime = SupportedVideoCodecToMimeType(video_codec);
-  if (!mime) {
-    return false;
-  }
   // Check extended parameters for correctness and return false if any invalid
   // invalid params are found.
   MimeType mime_type(content_type);
@@ -104,6 +83,13 @@
     mime_type.RegisterBoolParameter("tunnelmode");
     // Override endianness on HDR Info header. Defaults to little.
     mime_type.RegisterStringParameter("hdrinfoendianness", "big|little");
+    // Forces the use of specific Android APIs (isSizeSupported() and
+    // areSizeAndRateSupported()) to determine format support.
+    mime_type.RegisterBoolParameter("forceimprovedsupportcheck");
+    // Override the default decoder cache TTL to the specified value.
+    // The cache will be disabled if the value is non-positive.
+    // TODO(b/227356434): RegisterIntParameter requires API review.
+    // mime_type.RegisterIntParameter("decoder_cache_ttl_ms");
 
     if (!mime_type.is_valid()) {
       return false;
@@ -118,20 +104,28 @@
     return false;
   }
 
+  const char* mime = SupportedVideoCodecToMimeType(video_codec);
+  if (!mime) {
+    return false;
+  }
   JniEnvExt* env = JniEnvExt::Get();
   ScopedLocalJavaRef<jstring> j_mime(env->NewStringStandardUTFOrAbort(mime));
-  const bool must_support_hdr = (transfer_id != kSbMediaTransferIdBt709 &&
-                                 transfer_id != kSbMediaTransferIdUnspecified);
 
   // We assume that if a device supports a format for clear playback, it will
   // also support it for encrypted playback. However, some devices require
   // tunneled playback to be encrypted, so we must align the tunnel mode
   // requirement with the secure playback requirement.
   const bool require_secure_playback = must_support_tunnel_mode;
+  const bool force_improved_support_check =
+      mime_type.GetParamBoolValue("forceimprovedsupportcheck", true);
+  const int decoder_cache_ttl_ms =
+      mime_type.GetParamIntValue("decoder_cache_ttl_ms", -1);
+
   return env->CallStaticBooleanMethodOrAbort(
              "dev/cobalt/media/MediaCodecUtil", "hasVideoDecoderFor",
-             "(Ljava/lang/String;ZZZIIII)Z", j_mime.Get(),
+             "(Ljava/lang/String;ZZZZIIIII)Z", j_mime.Get(),
              require_secure_playback, must_support_hdr,
-             must_support_tunnel_mode, frame_width, frame_height,
+             must_support_tunnel_mode, force_improved_support_check,
+             decoder_cache_ttl_ms, frame_width, frame_height,
              static_cast<jint>(bitrate), fps) == JNI_TRUE;
 }
diff --git a/starboard/android/shared/platform_configuration/configuration.gni b/starboard/android/shared/platform_configuration/configuration.gni
index 4eebd62..65ebd08 100644
--- a/starboard/android/shared/platform_configuration/configuration.gni
+++ b/starboard/android/shared/platform_configuration/configuration.gni
@@ -48,3 +48,7 @@
 
 cobalt_platform_dependencies =
     [ "//starboard/android/shared/cobalt:cobalt_platform" ]
+
+cobalt_font_package = "android_system"
+
+separate_install_targets_for_bundling = true
diff --git a/starboard/android/shared/platform_deploy.gypi b/starboard/android/shared/platform_deploy.gypi
deleted file mode 100644
index a95dde2..0000000
--- a/starboard/android/shared/platform_deploy.gypi
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'variables': {
-    'GRADLE_BUILD_TYPE': '<(cobalt_config)',
-    'GRADLE_FILES_DIR': '<(PRODUCT_DIR)/gradle/<(executable_name)',
-    'executable_file': '<(PRODUCT_DIR)/lib/lib<(executable_name).so',
-    'apk': '<(PRODUCT_DIR)/<(executable_name).apk',
-  },
-  'conditions': [
-    [ 'cobalt_config == "gold"', {
-      'variables': {
-        # Android Gradle wants a "release" build type, so use that for "gold".
-        'GRADLE_BUILD_TYPE': 'release'
-      }
-    }]
-  ],
-  'dependencies': [ '<(DEPTH)/starboard/android/apk/apk.gyp:apk_sources' ],
-  'includes': [ '<(DEPTH)/starboard/build/collect_deploy_content.gypi' ],
-  'actions': [
-    {
-      'action_name': 'build_apk',
-      'inputs': [
-        '<(executable_file)',
-        '<(PRODUCT_DIR)/gradle/apk_sources.stamp',
-        '<(content_deploy_stamp_file)',
-      ],
-      'outputs': [ '<(apk)' ],
-      'action': [
-        '<(DEPTH)/starboard/android/apk/cobalt-gradle.sh',
-        '--sdk', '<(ANDROID_HOME)',
-        '--cache', '$${PWD}/<(GRADLE_FILES_DIR)/cache',
-        '--project-dir', '$${PWD}/<(DEPTH)/starboard/android/apk/',
-        '-P', 'cobaltBuildAbi=<(ANDROID_ABI)',
-        '-P', 'cobaltDeployApk=$${PWD}/<(apk)',
-        '-P', 'cobaltContentDir=$${PWD}/<(content_deploy_dir)',
-        '-P', 'cobaltGradleDir=$${PWD}/<(GRADLE_FILES_DIR)',
-        '-P', 'cobaltProductDir=$${PWD}/<(PRODUCT_DIR)',
-        '-P', 'cobaltLibraryDir=$${PWD}/<(PRODUCT_DIR)/lib',
-        '-P', 'cobaltTarget=<(executable_name)',
-        '-P', 'enableVulkan=<(enable_vulkan)',
-        'assembleCobalt_<(GRADLE_BUILD_TYPE)',
-      ],
-      'message': 'Build APK: <(apk)',
-    },
-    {
-      # Clean the gradle directory to conserve space after we have the APK
-      'action_name': 'delete_gradle_dir',
-      'inputs': [ '<(apk)' ],
-      'outputs': [ '<(GRADLE_FILES_DIR).deleted.stamp' ],
-      'action': [
-        'sh', '-c',
-        'rm -rf <(GRADLE_FILES_DIR) && touch <(GRADLE_FILES_DIR).deleted.stamp',
-      ],
-      'message': 'Cleanup Gradle: <(executable_name)',
-    },
-  ],
-}
diff --git a/starboard/android/shared/player_components_factory.h b/starboard/android/shared/player_components_factory.h
index e129b0f..3b683fb 100644
--- a/starboard/android/shared/player_components_factory.h
+++ b/starboard/android/shared/player_components_factory.h
@@ -64,6 +64,10 @@
 // TODO: Allow this to be configured per playback at run time from the web app.
 constexpr bool kForceSecurePipelineInTunnelModeWhenRequired = true;
 
+// Forces video surface to reset after tunnel mode playbacks. This prevents
+// video distortion on some platforms.
+constexpr bool kForceResetSurfaceUnderTunnelMode = true;
+
 // This class allows us to force int16 sample type when tunnel mode is enabled.
 class AudioRendererSinkAndroid : public ::starboard::shared::starboard::player::
                                      filter::AudioRendererSinkImpl {
@@ -158,6 +162,7 @@
 //       into .cc file.
 class PlayerComponentsFactory : public starboard::shared::starboard::player::
                                     filter::PlayerComponents::Factory {
+  typedef starboard::shared::starboard::media::MimeType MimeType;
   typedef starboard::shared::opus::OpusAudioDecoder OpusAudioDecoder;
   typedef starboard::shared::starboard::player::filter::AdaptiveAudioDecoder
       AdaptiveAudioDecoder;
@@ -192,7 +197,6 @@
   scoped_ptr<PlayerComponents> CreateComponents(
       const CreationParameters& creation_parameters,
       std::string* error_message) override {
-    using starboard::shared::starboard::media::MimeType;
     SB_DCHECK(error_message);
 
     if (creation_parameters.audio_codec() != kSbMediaAudioCodecAc3 &&
@@ -240,9 +244,20 @@
       constexpr int kTunnelModeAudioSessionId = -1;
       constexpr bool kForceSecurePipelineUnderTunnelMode = false;
 
-      scoped_ptr<VideoDecoder> video_decoder = CreateVideoDecoder(
-          creation_parameters, kTunnelModeAudioSessionId,
-          kForceSecurePipelineUnderTunnelMode, error_message);
+      MimeType video_mime_type(creation_parameters.video_mime());
+      video_mime_type.RegisterBoolParameter("forceimprovedsupportcheck");
+      if (!video_mime_type.is_valid()) {
+        return scoped_ptr<PlayerComponents>();
+      }
+      const bool force_improved_support_check =
+          video_mime_type.GetParamBoolValue("forceimprovedsupportcheck", true);
+      SB_LOG_IF(INFO, !force_improved_support_check)
+          << "Improved support check is disabled for queries under 4K.";
+
+      scoped_ptr<VideoDecoder> video_decoder =
+          CreateVideoDecoder(creation_parameters, kTunnelModeAudioSessionId,
+                             kForceSecurePipelineUnderTunnelMode,
+                             force_improved_support_check, error_message);
       if (video_decoder) {
         using starboard::shared::starboard::player::filter::VideoRendererImpl;
 
@@ -270,7 +285,6 @@
       scoped_ptr<VideoRenderAlgorithmBase>* video_render_algorithm,
       scoped_refptr<VideoRendererSink>* video_renderer_sink,
       std::string* error_message) override {
-    using starboard::shared::starboard::media::MimeType;
     SB_DCHECK(error_message);
 
     const char* audio_mime =
@@ -299,6 +313,7 @@
     if (creation_parameters.video_codec() != kSbMediaVideoCodecNone &&
         strlen(creation_parameters.video_mime()) > 0) {
       video_mime_type.RegisterBoolParameter("tunnelmode");
+      video_mime_type.RegisterBoolParameter("forceimprovedsupportcheck");
 
       if (!video_mime_type.is_valid()) {
         *error_message =
@@ -340,17 +355,26 @@
       enable_tunnel_mode = true;
     }
 
+    const bool force_improved_support_check =
+        video_mime_type.GetParamBoolValue("forceimprovedsupportcheck", true);
+    SB_LOG_IF(INFO, !force_improved_support_check)
+        << "Improved support check is disabled for queries under 4K.";
     bool force_secure_pipeline_under_tunnel_mode = false;
     if (enable_tunnel_mode &&
         IsTunnelModeSupported(creation_parameters,
-                              &force_secure_pipeline_under_tunnel_mode)) {
-      tunnel_mode_audio_session_id =
-          GenerateAudioSessionId(creation_parameters);
+                              &force_secure_pipeline_under_tunnel_mode,
+                              force_improved_support_check)) {
+      tunnel_mode_audio_session_id = GenerateAudioSessionId(
+          creation_parameters, force_improved_support_check);
     }
 
     if (tunnel_mode_audio_session_id == -1) {
       SB_LOG(INFO) << "Create non-tunnel mode pipeline.";
     } else {
+      SB_LOG_IF(INFO, !kForceResetSurfaceUnderTunnelMode)
+          << "`kForceResetSurfaceUnderTunnelMode` is set to false, the video "
+             "surface will not be forced to reset after "
+             "tunneled playback.";
       SB_LOG(INFO) << "Create tunnel mode pipeline with audio session id "
                    << tunnel_mode_audio_session_id << '.';
     }
@@ -423,9 +447,10 @@
         force_secure_pipeline_under_tunnel_mode = false;
       }
 
-      scoped_ptr<VideoDecoder> video_decoder_impl = CreateVideoDecoder(
-          creation_parameters, tunnel_mode_audio_session_id,
-          force_secure_pipeline_under_tunnel_mode, error_message);
+      scoped_ptr<VideoDecoder> video_decoder_impl =
+          CreateVideoDecoder(creation_parameters, tunnel_mode_audio_session_id,
+                             force_secure_pipeline_under_tunnel_mode,
+                             force_improved_support_check, error_message);
       if (video_decoder_impl) {
         *video_render_algorithm = video_decoder_impl->GetRenderAlgorithm();
         *video_renderer_sink = video_decoder_impl->GetSink();
@@ -469,8 +494,8 @@
       const CreationParameters& creation_parameters,
       int tunnel_mode_audio_session_id,
       bool force_secure_pipeline_under_tunnel_mode,
+      bool force_improved_support_check,
       std::string* error_message) {
-    using starboard::shared::starboard::media::MimeType;
     // Use mime param to determine endianness of HDR metadata. If param is
     // missing or invalid it defaults to Little Endian.
     MimeType video_mime_type(creation_parameters.video_mime());
@@ -491,7 +516,8 @@
         creation_parameters.decode_target_graphics_context_provider(),
         creation_parameters.max_video_capabilities(),
         tunnel_mode_audio_session_id, force_secure_pipeline_under_tunnel_mode,
-        force_big_endian_hdr_metadata, error_message));
+        kForceResetSurfaceUnderTunnelMode, force_big_endian_hdr_metadata,
+        force_improved_support_check, error_message));
     if (creation_parameters.video_codec() == kSbMediaVideoCodecAv1 ||
         video_decoder->is_decoder_created()) {
       return video_decoder.Pass();
@@ -502,7 +528,8 @@
   }
 
   bool IsTunnelModeSupported(const CreationParameters& creation_parameters,
-                             bool* force_secure_pipeline_under_tunnel_mode) {
+                             bool* force_secure_pipeline_under_tunnel_mode,
+                             const bool force_improved_support_check) {
     SB_DCHECK(force_secure_pipeline_under_tunnel_mode);
     *force_secure_pipeline_under_tunnel_mode = false;
 
@@ -546,8 +573,8 @@
     bool is_encrypted = !!j_media_crypto;
     if (env->CallStaticBooleanMethodOrAbort(
             "dev/cobalt/media/MediaCodecUtil", "hasVideoDecoderFor",
-            "(Ljava/lang/String;ZZZIIII)Z", j_mime.Get(), is_encrypted, false,
-            true, 0, 0, 0, 0) == JNI_TRUE) {
+            "(Ljava/lang/String;ZZZZIIII)Z", j_mime.Get(), is_encrypted, false,
+            true, force_improved_support_check, 0, 0, 0, 0) == JNI_TRUE) {
       return true;
     }
 
@@ -556,8 +583,9 @@
       auto support_tunnel_mode_under_secure_pipeline =
           env->CallStaticBooleanMethodOrAbort(
               "dev/cobalt/media/MediaCodecUtil", "hasVideoDecoderFor",
-              "(Ljava/lang/String;ZZZIIII)Z", j_mime.Get(), kIsEncrypted, false,
-              true, 0, 0, 0, 0) == JNI_TRUE;
+              "(Ljava/lang/String;ZZZZIIII)Z", j_mime.Get(), kIsEncrypted,
+              false, true, force_improved_support_check, 0, 0, 0,
+              0) == JNI_TRUE;
       if (support_tunnel_mode_under_secure_pipeline) {
         *force_secure_pipeline_under_tunnel_mode = true;
         return true;
@@ -569,10 +597,12 @@
     return false;
   }
 
-  int GenerateAudioSessionId(const CreationParameters& creation_parameters) {
+  int GenerateAudioSessionId(const CreationParameters& creation_parameters,
+                             const bool force_improved_support_check) {
     bool force_secure_pipeline_under_tunnel_mode = false;
     SB_DCHECK(IsTunnelModeSupported(creation_parameters,
-                                    &force_secure_pipeline_under_tunnel_mode));
+                                    &force_secure_pipeline_under_tunnel_mode,
+                                    force_improved_support_check));
 
     JniEnvExt* env = JniEnvExt::Get();
     ScopedLocalJavaRef<jobject> j_audio_output_manager(
diff --git a/starboard/android/shared/player_get_preferred_output_mode.cc b/starboard/android/shared/player_get_preferred_output_mode.cc
index 95d6728..66df1e6 100644
--- a/starboard/android/shared/player_get_preferred_output_mode.cc
+++ b/starboard/android/shared/player_get_preferred_output_mode.cc
@@ -20,8 +20,6 @@
 #include "starboard/shared/starboard/player/filter/video_decoder_internal.h"
 #include "starboard/string.h"
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 SbPlayerOutputMode SbPlayerGetPreferredOutputMode(
     const SbPlayerCreationParam* creation_param) {
   using starboard::shared::starboard::player::filter::VideoDecoder;
@@ -90,5 +88,3 @@
                   << ") is not supported";
   return kSbPlayerOutputModeInvalid;
 }
-
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
diff --git a/starboard/android/shared/sdk_utils.py b/starboard/android/shared/sdk_utils.py
index 237e5c7..22d7bbc 100644
--- a/starboard/android/shared/sdk_utils.py
+++ b/starboard/android/shared/sdk_utils.py
@@ -1,5 +1,3 @@
-# Lint as: python2
-
 # Copyright 2016 The Cobalt Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,56 +13,14 @@
 # limitations under the License.
 """Utilities to use the toolchain from the Android NDK."""
 
-import errno
-import fcntl
-import logging
 import os
-import re
-import shutil
-import subprocess
-import sys
-import time
-import zipfile
-import requests
-
 from starboard.tools import build
 
-# pylint: disable=consider-using-with
-
 # Which version of the Android NDK and CMake to install and build with.
 # Note that build.gradle parses these out of this file too.
 _NDK_VERSION = '21.1.6352462'
 _CMAKE_VERSION = '3.10.2.4988404'
 
-# Packages to install in the Android SDK.
-# Get available packages from "sdkmanager --list --verbose"
-_ANDROID_SDK_PACKAGES = [
-    'build-tools;30.0.0',
-    'cmake;' + _CMAKE_VERSION,
-    'cmdline-tools;1.0',
-    'emulator',
-    'extras;android;m2repository',
-    'extras;google;m2repository',
-    'ndk;' + _NDK_VERSION,
-    'patcher;v4',
-    'platforms;android-30',
-    'platform-tools',
-]
-
-# Seconds to sleep before writing "y" for android sdk update license prompt.
-_SDK_LICENSE_PROMPT_SLEEP_SECONDS = 5
-
-# Location from which to download the SDK command-line tools
-# see https://developer.android.com/studio/index.html#command-tools
-_SDK_URL = ('https://dl.google.com/android/repository/'
-            'commandlinetools-linux-6200805_latest.zip')
-
-# Location from which to download the Android NDK.
-# see https://developer.android.com/ndk/downloads (perhaps in "NDK archives")
-_NDK_ZIP_REVISION = 'android-ndk-r20b'
-_NDK_ZIP_FILE = _NDK_ZIP_REVISION + '-linux-x86_64.zip'
-_NDK_URL = 'https://dl.google.com/android/repository/' + _NDK_ZIP_FILE
-
 _STARBOARD_TOOLCHAINS_DIR = build.GetToolchainsDir()
 
 # The path to the Android SDK, if placed inside of starboard-toolchains.
@@ -73,204 +29,6 @@
 
 _ANDROID_HOME = os.environ.get('ANDROID_HOME')
 if _ANDROID_HOME:
-  _SDK_PATH = _ANDROID_HOME
+  SDK_PATH = _ANDROID_HOME
 else:
-  _SDK_PATH = _STARBOARD_TOOLCHAINS_SDK_DIR
-
-_NDK_PATH = os.path.join(_SDK_PATH, 'ndk', _NDK_VERSION)
-
-_SDKMANAGER_TOOL = os.path.join(_SDK_PATH, 'cmdline-tools', '1.0', 'bin',
-                                'sdkmanager')
-
-
-def GetNdkPath():
-  return _NDK_PATH
-
-
-def GetSdkPath():
-  return _SDK_PATH
-
-
-def _DownloadAndUnzipFile(url, destination_path):
-  """Download a zip file from a url and uncompress it."""
-  shutil.rmtree(destination_path, ignore_errors=True)
-  try:
-    os.makedirs(destination_path)
-  except OSError as e:
-    if e.errno != errno.EEXIST:
-      raise
-  dl_file = os.path.join(destination_path, 'tmp.zip')
-  request = requests.get(url, allow_redirects=True)
-  open(dl_file, 'wb').write(request.content)
-  _UnzipFile(dl_file, destination_path)
-
-
-def _UnzipFile(zip_path, dest_path):
-  """Extract all files and restore permissions from a zip file."""
-  zip_file = zipfile.ZipFile(zip_path)
-  for info in zip_file.infolist():
-    zip_file.extract(info.filename, dest_path)
-    os.chmod(os.path.join(dest_path, info.filename), info.external_attr >> 16)
-
-
-def InstallSdkIfNeeded():
-  """Download the SDK and NDK if not already available."""
-  # Hold an exclusive advisory lock on the _STARBOARD_TOOLCHAINS_DIR, to
-  # prevent issues with modification for multiple variants.
-  try:
-    toolchains_dir_fd = os.open(_STARBOARD_TOOLCHAINS_DIR, os.O_RDONLY)
-    fcntl.flock(toolchains_dir_fd, fcntl.LOCK_EX)
-
-    if os.environ.get('ANDROID_NDK_HOME'):
-      logging.warning('Warning: ANDROID_NDK_HOME is deprecated and ignored.')
-
-    if _ANDROID_HOME:
-      if not os.access(_SDKMANAGER_TOOL, os.X_OK):
-        logging.error('Error: ANDROID_HOME is set but SDK is not present.')
-        sys.exit(1)
-      logging.warning('Warning: Using Android SDK in ANDROID_HOME,'
-                      ' which is not automatically updated.\n'
-                      '         The following package versions are installed:')
-      installed_packages = _GetInstalledSdkPackages()
-      for package in _ANDROID_SDK_PACKAGES:
-        version = installed_packages.get(package, '< NOT INSTALLED >')
-        msg = '  {:30} : {}'.format(package, version)
-        logging.warning(msg)
-
-      if not os.path.exists(GetNdkPath()):
-        logging.error('Error: ANDROID_HOME is is missing NDK %s.', _NDK_VERSION)
-        sys.exit(1)
-
-      # pylint: disable=undefined-variable
-      reply = raw_input(
-          'Do you want to continue using your custom Android tools? [y/N]')
-      if reply.upper() != 'Y':
-        sys.exit(1)
-    else:
-      logging.warning('Checking Android SDK.')
-      _DownloadInstallOrUpdateSdk()
-  finally:
-    fcntl.flock(toolchains_dir_fd, fcntl.LOCK_UN)
-    os.close(toolchains_dir_fd)
-
-
-def _GetInstalledSdkPackages():
-  """Returns a map of installed package name to package version."""
-  # We detect and parse either new-style or old-style output from sdkmanager:
-  #
-  # [new-style]
-  # Installed packages:
-  # --------------------------------------
-  # build-tools;25.0.2
-  #     Description:        Android SDK Build-Tools 25.0.2
-  #     Version:            25.0.2
-  #     Installed Location: <abs path>
-  # ...
-  #
-  # [old-style]
-  # Installed packages:
-  #   Path               | Version | Description                    | Location
-  #   -------            | ------- | -------                        | -------
-  #   build-tools;25.0.2 | 25.0.2  | Android SDK Build-Tools 25.0.2 | <rel path>
-  # ...
-  section_re = re.compile(r'^[A-Z][^:]*:$')
-  version_re = re.compile(r'^\s+Version:\s+(\S+)')
-
-  p = subprocess.Popen([_SDKMANAGER_TOOL, '--list', '--verbose'],
-                       stdout=subprocess.PIPE)
-
-  installed_package_versions = {}
-  new_style = False
-  old_style = False
-  for line in iter(p.stdout.readline, ''):
-    # Throw away loading progress indicators up to the last CR.
-    line = line.split('\r')[-1]
-    if section_re.match(line):
-      if new_style or old_style:
-        # We left the new/old style installed packages section
-        break
-      if line.startswith('Installed'):
-        # Read the header of this section to determine new/old style
-        line = p.stdout.readline().strip()
-        new_style = line.startswith('----')
-        old_style = line.startswith('Path')
-        if old_style:
-          line = p.stdout.readline().strip()
-        if not line.startswith('----'):
-          logging.error('Error: Unexpected SDK package listing format')
-      continue
-
-    # We're in the installed packages section, and it's new-style
-    if new_style:
-      if not line.startswith(' '):
-        pkg_name = line.strip()
-      else:
-        m = version_re.match(line)
-        if m:
-          installed_package_versions[pkg_name] = m.group(1)
-
-    # We're in the installed packages section, and it's old-style
-    elif old_style:
-      fields = [f.strip() for f in line.split('|', 2)]
-      if len(fields) >= 2:
-        installed_package_versions[fields[0]] = fields[1]
-
-  # Discard the rest of the output
-  p.communicate()
-  return installed_package_versions
-
-
-def _IsUnattended():
-  return 'BUILDBOT_BUILDERNAME' in os.environ or 'IS_DOCKER' in os.environ
-
-
-def _DownloadInstallOrUpdateSdk():
-  """Downloads (if necessary) and installs/updates the Android SDK."""
-
-  # If we can't access the "sdkmanager" tool, we need to download the SDK
-  if not os.access(_SDKMANAGER_TOOL, os.X_OK):
-    if os.getenv('IS_CI', '') == '1':
-      raise Exception('Dynamic toolchain downloads are disabled in CI')
-
-    logging.warning('Downloading Android SDK to %s',
-                    _STARBOARD_TOOLCHAINS_SDK_DIR)
-    if os.path.exists(_STARBOARD_TOOLCHAINS_SDK_DIR):
-      shutil.rmtree(_STARBOARD_TOOLCHAINS_SDK_DIR)
-    _DownloadAndUnzipFile(_SDK_URL, _STARBOARD_TOOLCHAINS_SDK_DIR)
-    # TODO: Remove this workaround for sdkmanager incorrectly picking up the
-    # "tools" directory from the ZIP as the name of its component.
-    # https://issuetracker.google.com/issues/67495440#comment32
-    # https://issuetracker.google.com/issues/150943631
-    if not os.access(_SDKMANAGER_TOOL, os.X_OK):
-      old_tools_dir = os.path.join(_STARBOARD_TOOLCHAINS_SDK_DIR, 'tools')
-      new_tools_dir = os.path.join(_STARBOARD_TOOLCHAINS_SDK_DIR,
-                                   'cmdline-tools', '1.0')
-      os.mkdir(os.path.dirname(new_tools_dir))
-      os.rename(old_tools_dir, new_tools_dir)
-    if not os.access(_SDKMANAGER_TOOL, os.X_OK):
-      logging.error('SDK download failed.')
-      sys.exit(1)
-
-  # Run the "sdkmanager" command with the appropriate packages
-
-  if _IsUnattended():
-    stdin = subprocess.PIPE
-  else:
-    stdin = sys.stdin
-
-  p = subprocess.Popen(
-      [_SDKMANAGER_TOOL, '--verbose'] + _ANDROID_SDK_PACKAGES, stdin=stdin)
-
-  if _IsUnattended():
-    try:
-      # Accept "Terms and Conditions" (android-sdk-license)
-      time.sleep(_SDK_LICENSE_PROMPT_SLEEP_SECONDS)
-      p.stdin.write('y\n')
-    except IOError:
-      logging.warning('There were no SDK licenses to accept.')
-
-  p.wait()
-  if p.returncode:
-    raise RuntimeError(
-        '\nFailed to install packages with sdkmanager. Exit status = %d' %
-        p.returncode)
+  SDK_PATH = _STARBOARD_TOOLCHAINS_SDK_DIR
diff --git a/starboard/android/shared/socket_get_interface_address.cc b/starboard/android/shared/socket_get_interface_address.cc
new file mode 100644
index 0000000..ce871bd
--- /dev/null
+++ b/starboard/android/shared/socket_get_interface_address.cc
@@ -0,0 +1,82 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/android/shared/jni_env_ext.h"
+#include "starboard/log.h"
+#include "starboard/memory.h"
+#include "starboard/socket.h"
+
+using starboard::android::shared::JniEnvExt;
+
+namespace {
+
+const size_t kDefaultPrefixLength = 8;
+const int kIPv6AddressSize = 16;
+
+bool CopySocketAddress(jbyteArray array, SbSocketAddress* out_address) {
+  JniEnvExt* env = JniEnvExt::Get();
+  if (array == nullptr) {
+    return false;
+  }
+  if (out_address == nullptr) {
+    SB_LOG(ERROR) << "SbSocketGetInterfaceAddress NULL out_address";
+    return false;
+  }
+  jint size = env->GetArrayLength(array);
+  if (size > sizeof(out_address->address)) {
+    SB_LOG(ERROR) << "SbSocketGetInterfaceAddress address too long";
+    return false;
+  }
+  out_address->type =
+      (size == 4) ? kSbSocketAddressTypeIpv4 : kSbSocketAddressTypeIpv6;
+  jbyte* bytes = env->GetByteArrayElements(array, NULL);
+  SB_CHECK(bytes) << "GetByteArrayElements failed";
+  memcpy(out_address->address, bytes, size);
+  env->ReleaseByteArrayElements(array, bytes, JNI_ABORT);
+  return true;
+}
+}  // namespace
+
+bool SbSocketGetInterfaceAddress(const SbSocketAddress* const destination,
+                                 SbSocketAddress* out_source_address,
+                                 SbSocketAddress* out_netmask) {
+  if (out_source_address == nullptr) {
+    return false;
+  }
+
+  memset(out_source_address->address, 0, sizeof(out_source_address->address));
+
+  out_source_address->port = 0;
+
+  JniEnvExt* env = JniEnvExt::Get();
+
+  jboolean want_ipv6 =
+      (destination != nullptr && destination->type == kSbSocketAddressTypeIpv6);
+  jobject pair = (jbyteArray)env->CallStarboardObjectMethodOrAbort(
+      "getLocalInterfaceAddressAndNetmask", "(Z)Landroid/util/Pair;",
+      want_ipv6);
+
+  jobject field;
+  field = env->GetObjectFieldOrAbort(pair, "first", "Ljava/lang/Object;");
+  if (!CopySocketAddress(static_cast<jbyteArray>(field), out_source_address)) {
+    return false;
+  }
+  field = env->GetObjectFieldOrAbort(pair, "second", "Ljava/lang/Object;");
+  if (out_netmask &&
+      !CopySocketAddress(static_cast<jbyteArray>(field), out_netmask)) {
+    return false;
+  }
+
+  return true;
+}
diff --git a/starboard/android/shared/speech_synthesis_is_supported.cc b/starboard/android/shared/speech_synthesis_is_supported.cc
index ee7f1be..dfba33e 100644
--- a/starboard/android/shared/speech_synthesis_is_supported.cc
+++ b/starboard/android/shared/speech_synthesis_is_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/speech_synthesis.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbSpeechSynthesisIsSupported() {
   return true;
 }
-
-#endif
diff --git a/starboard/android/shared/starboard_platform.gypi b/starboard/android/shared/starboard_platform.gypi
deleted file mode 100644
index 94eefcd..0000000
--- a/starboard/android/shared/starboard_platform.gypi
+++ /dev/null
@@ -1,500 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'variables': {
-    'has_input_events_filter' : '<!pymod_do_main(starboard.build.gyp_functions file_exists <(DEPTH)/starboard/android/shared/internal/input_events_filter.cc)',
-    'has_drm_system_extension%': '<!pymod_do_main(starboard.build.gyp_functions file_exists <(DEPTH)/starboard/android/shared/drm_system_extension/drm_system_extension.gyp)',
-  },
-  'includes': [
-    '<(DEPTH)/starboard/shared/starboard/player/filter/player_filter.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'starboard_base_symbolize',
-      'type': 'static_library',
-      'sources': [
-        '<(DEPTH)/base/third_party/symbolize/demangle.cc',
-        '<(DEPTH)/base/third_party/symbolize/symbolize.cc',
-      ],
-    },
-    # Copy sources that we compile from the NDK so that we can reference them
-    # by a relative path. Otherwise, without GYP pathname relativization
-    # different configuration builds would clobber each other since they'd all
-    # generate their .o at the same path in the NDK sources directory.
-    {
-      'target_name': 'ndk_sources',
-      'type': 'none',
-      'copies': [{
-        'destination': '<(SHARED_INTERMEDIATE_DIR)/ndk-sources/',
-        'files': [
-          '<(NDK_HOME)/sources/android/cpufeatures/cpu-features.c',
-        ],
-      }],
-    },
-    {
-      'target_name': 'starboard_platform',
-      'type': 'static_library',
-      'include_dirs': [
-        '<(DEPTH)/starboard/android/shared/bionic',
-      ],
-      'includes': [
-        '<(DEPTH)/starboard/shared/starboard/player/common_player_sources.gypi',
-      ],
-      'sources': [
-        '<@(common_player_sources)',
-        '<@(filter_based_player_sources)',
-        'accessibility_get_caption_settings.cc',
-        'accessibility_get_display_settings.cc',
-        'accessibility_get_text_to_speech_settings.cc',
-        'accessibility_set_captions_enabled.cc',
-        'android_main.cc',
-        'android_media_session_client.cc',
-        'application_android.cc',
-        'application_android.h',
-        'atomic_public.h',
-        'audio_decoder.cc',
-        'audio_decoder.h',
-        'audio_decoder_passthrough.h',
-        'audio_renderer_passthrough.cc',
-        'audio_renderer_passthrough.h',
-        'audio_sink_get_max_channels.cc',
-        'audio_sink_get_min_buffer_size_in_frames.cc',
-        'audio_sink_min_required_frames_tester.cc',
-        'audio_sink_min_required_frames_tester.h',
-        'audio_sink_get_nearest_supported_sample_frequency.cc',
-        'audio_sink_is_audio_frame_storage_type_supported.cc',
-        'audio_sink_is_audio_sample_type_supported.cc',
-        'audio_track_audio_sink_type.cc',
-        'audio_track_audio_sink_type.h',
-        'audio_track_bridge.cc',
-        'audio_track_bridge.h',
-        'bionic/bionic_netlink.cpp',
-        'bionic/bionic_netlink.h',
-        'bionic/ifaddrs.cpp',
-        'bionic/ifaddrs.h',
-        'bionic/net_if.cpp',
-        'bionic/private/bionic_macros.h',
-        'bionic/private/ErrnoRestorer.h',
-        'configuration.cc',
-        'configuration.h',
-        'configuration_public.h',
-        'configuration_constants.cc',
-        'decode_target_create.cc',
-        'decode_target_create.h',
-        'decode_target_get_info.cc',
-        'decode_target_internal.cc',
-        'decode_target_internal.h',
-        'decode_target_release.cc',
-        'directory_close.cc',
-        'directory_get_next.cc',
-        'directory_internal.h',
-        'directory_open.cc',
-        'drm_system.cc',
-        'drm_system.h',
-        'egl_swap_buffers.cc',
-        'file_can_open.cc',
-        'file_close.cc',
-        'file_delete.cc',
-        'file_exists.cc',
-        'file_flush.cc',
-        'file_get_info.cc',
-        'file_get_path_info.cc',
-        'file_internal.cc',
-        'file_internal.h',
-        'file_open.cc',
-        'file_read.cc',
-        'file_seek.cc',
-        'file_truncate.cc',
-        'file_write.cc',
-        'get_home_directory.cc',
-        'input_events_generator.cc',
-        'input_events_generator.h',
-        'jni_env_ext.cc',
-        'jni_env_ext.h',
-        'jni_utils.h',
-        'log.cc',
-        'log_flush.cc',
-        'log_format.cc',
-        'log_internal.cc',
-        'log_internal.h',
-        'log_is_tty.cc',
-        'log_raw.cc',
-        'main.cc',
-        'media_codec_bridge.cc',
-        'media_codec_bridge.h',
-        'media_common.h',
-        'media_decoder.cc',
-        'media_decoder.h',
-        'media_get_audio_configuration.cc',
-        'media_get_audio_output_count.cc',
-        'media_get_initial_buffer_capacity.cc',
-        'media_get_max_buffer_capacity.cc',
-        'media_is_audio_supported.cc',
-        'media_is_buffer_pool_allocate_on_demand.cc',
-        'media_is_video_supported.cc',
-        'network_status_impl.cc',
-        'microphone_impl.cc',
-        'player_components_factory.h',
-        'player_create.cc',
-        'player_destroy.cc',
-        'player_get_preferred_output_mode.cc',
-        'player_set_bounds.cc',
-        'player_set_playback_rate.cc',
-        'sanitizer_options.cc',
-        'speech_synthesis_cancel.cc',
-        'speech_synthesis_internal.cc',
-        'speech_synthesis_is_supported.cc',
-        'speech_synthesis_speak.cc',
-        'system_get_connection_type.cc',
-        'system_get_device_type.cc',
-        'system_get_locale_id.cc',
-        'system_get_path.cc',
-        'system_get_property.cc',
-        'system_get_stack.cc',
-        'system_has_capability.cc',
-        'system_network_is_disconnected.cc',
-        'system_platform_error.cc',
-        'system_request_conceal.cc',
-        'system_request_freeze_no_freezedone_callback.cc',
-        'system_request_stop.cc',
-        'system_request_suspend.cc',
-        'thread_create.cc',
-        'thread_create_priority.cc',
-        'thread_get_name.cc',
-        'thread_types_public.h',
-        'time_zone_get_name.cc',
-        'trace_util.h',
-        'video_decoder.cc',
-        'video_decoder.h',
-        'video_frame_tracker.cc',
-        'video_frame_tracker.h',
-        'video_render_algorithm.cc',
-        'video_render_algorithm.h',
-        'video_window.cc',
-        'video_window.h',
-        'window_create.cc',
-        'window_destroy.cc',
-        'window_get_diagonal_size_in_inches.cc',
-        'window_get_platform_handle.cc',
-        'window_get_size.cc',
-        'window_internal.h',
-        '<(SHARED_INTERMEDIATE_DIR)/ndk-sources/cpu-features.c',
-        '<(DEPTH)/starboard/android/shared/platform_service.cc',
-        '<(DEPTH)/starboard/android/shared/system_get_extensions.cc',
-        '<(DEPTH)/starboard/android/shared/window_blur_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/android/shared/window_focus_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/android/shared/window_get_on_screen_keyboard_bounding_rect.cc',
-        '<(DEPTH)/starboard/android/shared/window_hide_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/android/shared/window_is_on_screen_keyboard_shown.cc',
-        '<(DEPTH)/starboard/android/shared/window_on_screen_keyboard_is_supported.cc',
-        '<(DEPTH)/starboard/android/shared/window_on_screen_keyboard_suggestions_supported.cc',
-        '<(DEPTH)/starboard/android/shared/window_set_on_screen_keyboard_keep_focus.cc',
-        '<(DEPTH)/starboard/android/shared/window_show_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/android/shared/window_update_on_screen_keyboard_suggestions.cc',
-        '<(DEPTH)/starboard/shared/dlmalloc/memory_map.cc',
-        '<(DEPTH)/starboard/shared/dlmalloc/memory_protect.cc',
-        '<(DEPTH)/starboard/shared/dlmalloc/memory_unmap.cc',
-        '<(DEPTH)/starboard/shared/egl/system_egl.cc',
-        '<(DEPTH)/starboard/shared/gcc/atomic_gcc_public.h',
-        '<(DEPTH)/starboard/shared/gles/gl_call.h',
-        '<(DEPTH)/starboard/shared/gles/system_gles2.cc',
-        '<(DEPTH)/starboard/shared/internal_only.h',
-        '<(DEPTH)/starboard/shared/iso/character_is_alphanumeric.cc',
-        '<(DEPTH)/starboard/shared/iso/character_is_digit.cc',
-        '<(DEPTH)/starboard/shared/iso/character_is_hex_digit.cc',
-        '<(DEPTH)/starboard/shared/iso/character_is_space.cc',
-        '<(DEPTH)/starboard/shared/iso/character_is_upper.cc',
-        '<(DEPTH)/starboard/shared/iso/character_to_lower.cc',
-        '<(DEPTH)/starboard/shared/iso/character_to_upper.cc',
-        '<(DEPTH)/starboard/shared/iso/double_absolute.cc',
-        '<(DEPTH)/starboard/shared/iso/double_exponent.cc',
-        '<(DEPTH)/starboard/shared/iso/double_floor.cc',
-        '<(DEPTH)/starboard/shared/iso/double_is_finite.cc',
-        '<(DEPTH)/starboard/shared/iso/double_is_nan.cc',
-        '<(DEPTH)/starboard/shared/iso/impl/directory_close.h',
-        '<(DEPTH)/starboard/shared/iso/impl/directory_get_next.h',
-        '<(DEPTH)/starboard/shared/iso/impl/directory_open.h',
-        '<(DEPTH)/starboard/shared/iso/memory_allocate_unchecked.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_compare.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_copy.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_find_byte.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_free.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_move.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_reallocate_unchecked.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_set.cc',
-        '<(DEPTH)/starboard/shared/iso/string_compare.cc',
-        '<(DEPTH)/starboard/shared/iso/string_compare_all.cc',
-        '<(DEPTH)/starboard/shared/iso/string_find_character.cc',
-        '<(DEPTH)/starboard/shared/iso/string_find_last_character.cc',
-        '<(DEPTH)/starboard/shared/iso/string_find_string.cc',
-        '<(DEPTH)/starboard/shared/iso/string_get_length.cc',
-        '<(DEPTH)/starboard/shared/iso/string_get_length_wide.cc',
-        '<(DEPTH)/starboard/shared/iso/string_parse_double.cc',
-        '<(DEPTH)/starboard/shared/iso/string_parse_signed_integer.cc',
-        '<(DEPTH)/starboard/shared/iso/string_parse_uint64.cc',
-        '<(DEPTH)/starboard/shared/iso/string_parse_unsigned_integer.cc',
-        '<(DEPTH)/starboard/shared/iso/string_scan.cc',
-        '<(DEPTH)/starboard/shared/iso/system_binary_search.cc',
-        '<(DEPTH)/starboard/shared/iso/system_sort.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_add.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_create.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_destroy.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_internal.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_remove.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_wait.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_wait_timed.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_wake_up.cc',
-        '<(DEPTH)/starboard/shared/linux/byte_swap.cc',
-        '<(DEPTH)/starboard/shared/linux/memory_get_stack_bounds.cc',
-        '<(DEPTH)/starboard/shared/linux/page_internal.cc',
-        '<(DEPTH)/starboard/shared/linux/socket_get_interface_address.cc',
-        '<(DEPTH)/starboard/shared/linux/system_get_random_data.cc',
-        '<(DEPTH)/starboard/shared/linux/system_get_total_cpu_memory.cc',
-        '<(DEPTH)/starboard/shared/linux/system_get_used_cpu_memory.cc',
-        '<(DEPTH)/starboard/shared/linux/system_is_debugger_attached.cc',
-        '<(DEPTH)/starboard/shared/linux/system_symbolize.cc',
-        '<(DEPTH)/starboard/shared/linux/thread_get_id.cc',
-        '<(DEPTH)/starboard/shared/linux/thread_set_name.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_get_current.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_get_property.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_get_signed_in.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_internal.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_internal.h',
-        '<(DEPTH)/starboard/shared/opus/opus_audio_decoder.cc',
-        '<(DEPTH)/starboard/shared/opus/opus_audio_decoder.h',
-        '<(DEPTH)/starboard/shared/posix/directory_create.cc',
-        '<(DEPTH)/starboard/shared/posix/file_atomic_replace.cc',
-        '<(DEPTH)/starboard/shared/posix/impl/file_can_open.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_close.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_delete.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_flush.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_get_info.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_get_path_info.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_open.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_read.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_seek.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_truncate.h',
-        '<(DEPTH)/starboard/shared/posix/impl/file_write.h',
-        '<(DEPTH)/starboard/shared/posix/memory_allocate_aligned_unchecked.cc',
-        '<(DEPTH)/starboard/shared/posix/memory_flush.cc',
-        '<(DEPTH)/starboard/shared/posix/memory_free_aligned.cc',
-        '<(DEPTH)/starboard/shared/posix/set_non_blocking_internal.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_accept.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_bind.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_clear_last_error.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_connect.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_create.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_destroy.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_free_resolution.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_get_last_error.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_get_local_address.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_internal.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_is_connected.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_is_connected_and_idle.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_is_ipv6_supported.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_join_multicast_group.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_listen.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_receive_from.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_resolve.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_send_to.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_broadcast.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_receive_buffer_size.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_reuse_address.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_send_buffer_size.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_tcp_keep_alive.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_tcp_no_delay.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_tcp_window_scaling.cc',
-        '<(DEPTH)/starboard/shared/posix/storage_write_record.cc',
-        '<(DEPTH)/starboard/shared/posix/string_compare_no_case.cc',
-        '<(DEPTH)/starboard/shared/posix/string_compare_no_case_n.cc',
-        '<(DEPTH)/starboard/shared/posix/string_compare_wide.cc',
-        '<(DEPTH)/starboard/shared/posix/string_format.cc',
-        '<(DEPTH)/starboard/shared/posix/string_format_wide.cc',
-        '<(DEPTH)/starboard/shared/posix/system_break_into_debugger.cc',
-        '<(DEPTH)/starboard/shared/posix/system_clear_last_error.cc',
-        '<(DEPTH)/starboard/shared/posix/system_get_error_string.cc',
-        '<(DEPTH)/starboard/shared/posix/system_get_last_error.cc',
-        '<(DEPTH)/starboard/shared/posix/system_get_number_of_processors.cc',
-        '<(DEPTH)/starboard/shared/posix/thread_sleep.cc',
-        '<(DEPTH)/starboard/shared/posix/time_get_monotonic_now.cc',
-        '<(DEPTH)/starboard/shared/posix/time_get_monotonic_thread_now.cc',
-        '<(DEPTH)/starboard/shared/posix/time_get_now.cc',
-        '<(DEPTH)/starboard/shared/posix/time_is_time_thread_now_supported.cc',
-        '<(DEPTH)/starboard/shared/posix/time_zone_get_current.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_broadcast.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_create.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_destroy.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_signal.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_wait.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_wait_timed.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_acquire.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_acquire_try.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_create.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_destroy.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_release.cc',
-        '<(DEPTH)/starboard/shared/pthread/once.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_create_local_key.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_create_priority.h',
-        '<(DEPTH)/starboard/shared/pthread/thread_destroy_local_key.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_detach.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_get_current.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_get_local_value.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_is_equal.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_join.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_set_local_value.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_yield.cc',
-        '<(DEPTH)/starboard/shared/pthread/types_public.h',
-        '<(DEPTH)/starboard/shared/signal/crash_signals.h',
-        '<(DEPTH)/starboard/shared/signal/crash_signals_sigaction.cc',
-        '<(DEPTH)/starboard/shared/signal/suspend_signals.cc',
-        '<(DEPTH)/starboard/shared/signal/suspend_signals.h',
-        '<(DEPTH)/starboard/shared/starboard/application.cc',
-        '<(DEPTH)/starboard/shared/starboard/application.h',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_create.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_destroy.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_internal.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_internal.h',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_valid.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/stub_audio_sink_type.h',
-        '<(DEPTH)/starboard/shared/starboard/command_line.cc',
-        '<(DEPTH)/starboard/shared/starboard/command_line.h',
-        '<(DEPTH)/starboard/shared/starboard/directory_can_open.cc',
-        '<(DEPTH)/starboard/shared/starboard/drm/drm_close_session.cc',
-        '<(DEPTH)/starboard/shared/starboard/drm/drm_destroy_system.cc',
-        '<(DEPTH)/starboard/shared/starboard/drm/drm_generate_session_update_request.cc',
-        '<(DEPTH)/starboard/shared/starboard/drm/drm_get_metrics.cc',
-        '<(DEPTH)/starboard/shared/starboard/drm/drm_is_server_certificate_updatable.cc',
-        '<(DEPTH)/starboard/shared/starboard/drm/drm_system_internal.h',
-        '<(DEPTH)/starboard/shared/starboard/drm/drm_update_server_certificate.cc',
-        '<(DEPTH)/starboard/shared/starboard/drm/drm_update_session.cc',
-        '<(DEPTH)/starboard/shared/starboard/event_cancel.cc',
-        '<(DEPTH)/starboard/shared/starboard/event_schedule.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_atomic_replace_write_file.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_atomic_replace_write_file.h',
-        '<(DEPTH)/starboard/shared/starboard/file_mode_string_to_flags.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_close_record.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_delete_record.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_get_record_size.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_open_record.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_read_record.cc',
-        '<(DEPTH)/starboard/shared/starboard/log_mutex.cc',
-        '<(DEPTH)/starboard/shared/starboard/log_mutex.h',
-        '<(DEPTH)/starboard/shared/starboard/log_raw_dump_stack.cc',
-        '<(DEPTH)/starboard/shared/starboard/log_raw_format.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_buffer_budget.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_alignment.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_allocation_unit.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_garbage_collection_duration_threshold.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_padding.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_storage_type.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_video_buffer_budget.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/mime_type.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/mime_type.h',
-        '<(DEPTH)/starboard/shared/starboard/microphone/microphone_close.cc',
-        '<(DEPTH)/starboard/shared/starboard/microphone/microphone_create.cc',
-        '<(DEPTH)/starboard/shared/starboard/microphone/microphone_destroy.cc',
-        '<(DEPTH)/starboard/shared/starboard/microphone/microphone_get_available.cc',
-        '<(DEPTH)/starboard/shared/starboard/microphone/microphone_internal.h',
-        '<(DEPTH)/starboard/shared/starboard/microphone/microphone_is_sample_rate_supported.cc',
-        '<(DEPTH)/starboard/shared/starboard/microphone/microphone_open.cc',
-        '<(DEPTH)/starboard/shared/starboard/microphone/microphone_read.cc',
-        '<(DEPTH)/starboard/shared/starboard/memory.cc',
-        '<(DEPTH)/starboard/shared/starboard/new.cc',
-        '<(DEPTH)/starboard/shared/starboard/queue_application.cc',
-        '<(DEPTH)/starboard/shared/starboard/queue_application.h',
-        '<(DEPTH)/starboard/shared/starboard/string_concat.cc',
-        '<(DEPTH)/starboard/shared/starboard/string_concat_wide.cc',
-        '<(DEPTH)/starboard/shared/starboard/string_copy.cc',
-        '<(DEPTH)/starboard/shared/starboard/string_copy_wide.cc',
-        '<(DEPTH)/starboard/shared/starboard/string_duplicate.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_get_random_uint64.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_supports_resume.cc',
-        '<(DEPTH)/starboard/shared/starboard/thread_checker.h',
-        '<(DEPTH)/starboard/shared/starboard/window_set_default_options.cc',
-        '<(DEPTH)/starboard/shared/linux/cpu_features_get.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_create_transformer.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_destroy_transformer.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_get_tag.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_set_authenticated_data.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_set_initialization_vector.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_transform.cc',
-        '<(DEPTH)/starboard/shared/stub/image_decode.cc',
-        '<(DEPTH)/starboard/shared/stub/image_is_decode_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/media_set_audio_write_duration.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
-        '<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_blur.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_focus.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_pause.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_reveal.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_unpause.cc',
-        '<(DEPTH)/starboard/shared/stub/system_sign_with_certification_secret_key.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_context_get_pointer.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_create.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_freeze.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_thaw.cc',
-        '<(DEPTH)/starboard/shared/stub/ui_nav_get_interface.cc',
-      ],
-      'sources!': [
-        # Exclude these files from common_player_sources, because they are not used by android
-        '<(DEPTH)/starboard/shared/starboard/player/player_create.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/player_destroy.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/player_get_preferred_output_mode_prefer_punchout.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/player_set_bounds.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/player_set_playback_rate.cc',
-      ],
-      'defines': [
-        # This must be defined when building Starboard, and must not when
-        # building Starboard client code.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/common/common.gyp:common',
-        '<(DEPTH)/starboard/shared/starboard/media/media.gyp:media_util',
-        '<(DEPTH)/third_party/libevent/libevent.gyp:libevent',
-        '<(DEPTH)/third_party/opus/opus.gyp:opus',
-        'starboard_base_symbolize',
-      ],
-      'conditions': [
-        ['has_input_events_filter==1', {
-          'sources': [
-            'internal/input_events_filter.cc',
-            'internal/input_events_filter.h',
-          ],
-          'defines': [
-            'STARBOARD_INPUT_EVENTS_FILTER',
-          ],
-        }],
-        ['has_drm_system_extension==1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/android/shared/drm_system_extension/drm_system_extension.gyp:drm_system_extension',
-          ],
-        }, {
-          'sources': [
-            'drm_create_system.cc',
-            'media_is_supported.cc',
-            'player_components_factory.cc',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/starboard/android/shared/starboard_platform_tests.gypi b/starboard/android/shared/starboard_platform_tests.gypi
deleted file mode 100644
index 0b44440..0000000
--- a/starboard/android/shared/starboard_platform_tests.gypi
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'targets': [
-    {
-      'target_name': 'starboard_platform_tests',
-      'type': '<(gtest_target_type)',
-      'includes': [
-        '<(DEPTH)/starboard/shared/starboard/media/media_tests.gypi',
-        '<(DEPTH)/starboard/shared/starboard/player/player_tests.gypi',
-      ],
-      'sources': [
-        '<(DEPTH)/starboard/common/test_main.cc',
-        '<@(media_tests_sources)',
-        'jni_env_ext_test.cc',
-        'model_year_test.cc',
-        'video_frame_tracker_test.cc',
-      ],
-      'defines': [
-        # This allows the tests to include internal only header files.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'starboard_platform_tests_deploy',
-      'type': 'none',
-      'dependencies': [
-        '<(DEPTH)/<(starboard_path)/starboard_platform_tests.gyp:starboard_platform_tests',
-      ],
-      'variables': {
-        'executable_name': 'starboard_platform_tests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/android/shared/system_get_extensions.cc b/starboard/android/shared/system_get_extensions.cc
index 7e661ed..9d817f1 100644
--- a/starboard/android/shared/system_get_extensions.cc
+++ b/starboard/android/shared/system_get_extensions.cc
@@ -15,10 +15,12 @@
 #include "starboard/system.h"
 
 #include "cobalt/extension/configuration.h"
+#include "cobalt/extension/graphics.h"
 #include "cobalt/extension/media_session.h"
 #include "cobalt/extension/platform_service.h"
 #include "starboard/android/shared/android_media_session_client.h"
 #include "starboard/android/shared/configuration.h"
+#include "starboard/android/shared/graphics.h"
 #include "starboard/android/shared/platform_service.h"
 #include "starboard/common/log.h"
 #include "starboard/common/string.h"
@@ -33,5 +35,8 @@
   if (strcmp(name, kCobaltExtensionMediaSessionName) == 0) {
     return starboard::android::shared::GetMediaSessionApi();
   }
+  if (strcmp(name, kCobaltExtensionGraphicsName) == 0) {
+    return starboard::android::shared::GetGraphicsApi();
+  }
   return NULL;
 }
diff --git a/starboard/android/shared/system_get_path.cc b/starboard/android/shared/system_get_path.cc
index a6f157c..a290a56 100644
--- a/starboard/android/shared/system_get_path.cc
+++ b/starboard/android/shared/system_get_path.cc
@@ -79,10 +79,12 @@
       break;
     }
 
+#if SB_API_VERSION < SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED
     case kSbSystemPathTestOutputDirectory: {
       return SbSystemGetPath(kSbSystemPathDebugOutputDirectory, out_path,
                              path_size);
     }
+#endif
 
     // We return the library directory as the "executable" since:
     // a) Unlike the .so itself, it has a valid timestamp of the app install.
diff --git a/starboard/android/shared/system_get_property.cc b/starboard/android/shared/system_get_property.cc
index 9d17a69..b08528f 100644
--- a/starboard/android/shared/system_get_property.cc
+++ b/starboard/android/shared/system_get_property.cc
@@ -121,11 +121,7 @@
       return CopyStringAndTestIfSuccess(out_value, value_length, year.c_str());
     }
 
-#if SB_API_VERSION >= 12
     case kSbSystemPropertySystemIntegratorName:
-#else
-    case kSbSystemPropertyOriginalDesignManufacturerName:
-#endif
       return GetAndroidSystemProperty("ro.product.manufacturer", out_value,
                                       value_length, kUnknownValue);
 
diff --git a/starboard/android/shared/test_filters.py b/starboard/android/shared/test_filters.py
index c3d38ef..ff82758 100644
--- a/starboard/android/shared/test_filters.py
+++ b/starboard/android/shared/test_filters.py
@@ -15,70 +15,70 @@
 
 from starboard.tools.testing import test_filter
 
+# A map of failing or crashing tests per target.
+_FILTERED_TESTS = {
+    'player_filter_tests': [
+        # GetMaxNumberOfCachedFrames() on Android is device dependent,
+        # and Android doesn't provide an API to get it. So, this function
+        # doesn't make sense on Android. But HoldFramesUntilFull tests depend
+        # on this number strictly.
+        'VideoDecoderTests/VideoDecoderTest.HoldFramesUntilFull/*',
+
+        # Currently, invalid input tests are not supported.
+        'VideoDecoderTests/VideoDecoderTest.SingleInvalidInput/*',
+        ('VideoDecoderTests/VideoDecoderTest'
+         '.MultipleValidInputsAfterInvalidKeyFrame/*'),
+        'VideoDecoderTests/VideoDecoderTest.MultipleInvalidInput/*',
+
+        # Android currently does not support multi-video playback, which
+        # the following tests depend upon.
+        'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/*',
+
+        # The video pipeline will hang if it doesn't receive any input.
+        'PlayerComponentsTests/PlayerComponentsTest.EOSWithoutInput/*',
+
+        # The e/eac3 audio time reporting during pause will be revisitied.
+        'PlayerComponentsTests/PlayerComponentsTest.Pause/15',
+    ],
+    'nplb': [
+        # This test is failing because localhost is not defined for IPv6 in
+        # /etc/hosts.
+        'SbSocketAddressTypes/SbSocketResolveTest.Localhost/1',
+
+        # These tests are taking longer due to interop on android. Work is
+        # underway to investigate whether this is acceptable.
+        'SbMediaCanPlayMimeAndKeySystem.ValidatePerformance',
+        'SbMediaConfigurationTest.ValidatePerformance',
+
+        # SbDirectory has problems with empty Asset dirs.
+        'SbDirectoryCanOpenTest.SunnyDayStaticContent',
+        'SbDirectoryGetNextTest.SunnyDayStaticContent',
+        'SbDirectoryOpenTest.SunnyDayStaticContent',
+        'SbFileGetPathInfoTest.WorksOnStaticContentDirectories',
+
+        # These tests are disabled due to not receiving the kEndOfStream
+        # player state update within the specified timeout.
+        'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.NoInput/*',
+
+        # Android does not use SbDrmSessionClosedFunc, which these tests
+        # depend on.
+        'SbDrmSessionTest.SunnyDay',
+        'SbDrmSessionTest.CloseDrmSessionBeforeUpdateSession',
+
+        # This test is failing because Android calls the
+        # SbDrmSessionUpdateRequestFunc with SbDrmStatus::kSbDrmStatusSuccess
+        # when invalid initialization data is passed to
+        # SbDrmGenerateSessionUpdateRequest().
+        'SbDrmSessionTest.InvalidSessionUpdateRequestParams',
+    ],
+}
+
 
 class TestFilters(object):
   """Starboard Android platform test filters."""
 
   def GetTestFilters(self):
     filters = []
-    for target, tests in self._FILTERED_TESTS.iteritems():
+    for target, tests in _FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
-
-  # A map of failing or crashing tests per target.
-  _FILTERED_TESTS = {
-      'player_filter_tests': [
-          # GetMaxNumberOfCachedFrames() on Android is device dependent,
-          # and Android doesn't provide an API to get it. So, this function
-          # doesn't make sense on Android. But HoldFramesUntilFull tests depend
-          # on this number strictly.
-          'VideoDecoderTests/VideoDecoderTest.HoldFramesUntilFull/*',
-
-          # Currently, invalid input tests are not supported.
-          'VideoDecoderTests/VideoDecoderTest.SingleInvalidInput/*',
-          'VideoDecoderTests/VideoDecoderTest'
-          '.MultipleValidInputsAfterInvalidKeyFrame/*',
-          'VideoDecoderTests/VideoDecoderTest.MultipleInvalidInput/*',
-
-          # Android currently does not support multi-video playback, which
-          # the following tests depend upon.
-          'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/*',
-
-          # The video pipeline will hang if it doesn't receive any input.
-          'PlayerComponentsTests/PlayerComponentsTest.EOSWithoutInput/*',
-
-          # The e/eac3 audio time reporting during pause will be revisitied.
-          'PlayerComponentsTests/PlayerComponentsTest.Pause/15',
-      ],
-      'nplb': [
-          # This test is failing because localhost is not defined for IPv6 in
-          # /etc/hosts.
-          'SbSocketAddressTypes/SbSocketResolveTest.Localhost/1',
-
-          # These tests are taking longer due to interop on android. Work is
-          # underway to investigate whether this is acceptable.
-          'SbMediaCanPlayMimeAndKeySystem.ValidatePerformance',
-          'SbMediaConfigurationTest.ValidatePerformance',
-
-          # SbDirectory has problems with empty Asset dirs.
-          'SbDirectoryCanOpenTest.SunnyDayStaticContent',
-          'SbDirectoryGetNextTest.SunnyDayStaticContent',
-          'SbDirectoryOpenTest.SunnyDayStaticContent',
-          'SbFileGetPathInfoTest.WorksOnStaticContentDirectories',
-
-          # These tests are disabled due to not receiving the kEndOfStream
-          # player state update within the specified timeout.
-          'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.NoInput/*',
-
-          # Android does not use SbDrmSessionClosedFunc, which these tests
-          # depend on.
-          'SbDrmSessionTest.SunnyDay',
-          'SbDrmSessionTest.CloseDrmSessionBeforeUpdateSession',
-
-          # This test is failing because Android calls the
-          # SbDrmSessionUpdateRequestFunc with SbDrmStatus::kSbDrmStatusSuccess
-          # when invalid initialization data is passed to
-          # SbDrmGenerateSessionUpdateRequest().
-          'SbDrmSessionTest.InvalidSessionUpdateRequestParams',
-      ],
-  }
diff --git a/starboard/android/shared/thread_create.cc b/starboard/android/shared/thread_create.cc
index 28e77db..5f69a16 100644
--- a/starboard/android/shared/thread_create.cc
+++ b/starboard/android/shared/thread_create.cc
@@ -30,11 +30,6 @@
 namespace shared {
 namespace pthread {
 
-#if SB_API_VERSION < 12 && !SB_HAS(THREAD_PRIORITY_SUPPORT)
-// Default implementation without thread priority support
-void ThreadSetPriority(SbThreadPriority priority) {}
-#endif
-
 void PreThreadRun() {}
 
 void PostThreadRun() {
diff --git a/starboard/android/shared/thread_create_priority.cc b/starboard/android/shared/thread_create_priority.cc
index ee9979b..511bb04 100644
--- a/starboard/android/shared/thread_create_priority.cc
+++ b/starboard/android/shared/thread_create_priority.cc
@@ -23,8 +23,6 @@
 namespace shared {
 namespace pthread {
 
-#if SB_API_VERSION >= 12 || SB_HAS(THREAD_PRIORITY_SUPPORT)
-
 void SetNiceValue(int nice) {
   int result = setpriority(PRIO_PROCESS, 0, nice);
   if (result != 0) {
@@ -64,8 +62,6 @@
   }
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(THREAD_PRIORITY_SUPPORT)
 }  // namespace pthread
 }  // namespace shared
 }  // namespace starboard
diff --git a/starboard/android/shared/thread_types_public.h b/starboard/android/shared/thread_types_public.h
deleted file mode 100644
index 266f513..0000000
--- a/starboard/android/shared/thread_types_public.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Includes threading primitive types and initializers.
-
-#ifndef STARBOARD_ANDROID_SHARED_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_ANDROID_SHARED_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/shared/pthread/types_public.h"
-
-#endif  // STARBOARD_ANDROID_SHARED_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/android/shared/time_zone_get_name.cc b/starboard/android/shared/time_zone_get_name.cc
index b2b6c41..f058c09 100644
--- a/starboard/android/shared/time_zone_get_name.cc
+++ b/starboard/android/shared/time_zone_get_name.cc
@@ -16,8 +16,21 @@
 
 #include <time.h>
 
-const char* SbTimeZoneGetName() {
-  // Note tzset() is called in ApplicationAndroid::Initialize()
+#include "starboard/android/shared/jni_env_ext.h"
+#include "starboard/android/shared/jni_utils.h"
 
-  return tzname[0];
+using starboard::android::shared::JniEnvExt;
+using starboard::android::shared::ScopedLocalJavaRef;
+
+const char* SbTimeZoneGetName() {
+  static char s_time_zone_id[64];
+  // Note tzset() is called in ApplicationAndroid::Initialize()
+  JniEnvExt* env = JniEnvExt::Get();
+  ScopedLocalJavaRef<jstring> result(env->CallStarboardObjectMethodOrAbort(
+      "getTimeZoneId", "()Ljava/lang/String;"));
+  std::string time_zone_id = env->GetStringStandardUTFOrAbort(result.Get());
+  time_zone_id.push_back('\0');
+  strncpy(s_time_zone_id, time_zone_id.c_str(), sizeof(s_time_zone_id));
+  s_time_zone_id[sizeof(s_time_zone_id) - 1] = 0;
+  return s_time_zone_id;
 }
diff --git a/starboard/android/shared/video_decoder.cc b/starboard/android/shared/video_decoder.cc
index 775496c..5078989 100644
--- a/starboard/android/shared/video_decoder.cc
+++ b/starboard/android/shared/video_decoder.cc
@@ -218,7 +218,9 @@
                            const char* max_video_capabilities,
                            int tunnel_mode_audio_session_id,
                            bool force_secure_pipeline_under_tunnel_mode,
+                           bool force_reset_surface_under_tunnel_mode,
                            bool force_big_endian_hdr_metadata,
+                           bool force_improved_support_check,
                            std::string* error_message)
     : video_codec_(video_codec),
       drm_system_(static_cast<DrmSystem*>(drm_system)),
@@ -226,11 +228,14 @@
       decode_target_graphics_context_provider_(
           decode_target_graphics_context_provider),
       tunnel_mode_audio_session_id_(tunnel_mode_audio_session_id),
+      force_reset_surface_under_tunnel_mode_(
+          force_reset_surface_under_tunnel_mode),
       has_new_texture_available_(false),
       surface_condition_variable_(surface_destroy_mutex_),
       require_software_codec_(max_video_capabilities &&
                               strlen(max_video_capabilities) > 0),
-      force_big_endian_hdr_metadata_(force_big_endian_hdr_metadata) {
+      force_big_endian_hdr_metadata_(force_big_endian_hdr_metadata),
+      force_improved_support_check_(force_improved_support_check) {
   SB_DCHECK(error_message);
 
   if (tunnel_mode_audio_session_id != -1) {
@@ -264,7 +269,11 @@
 
 VideoDecoder::~VideoDecoder() {
   TeardownCodec();
-  ClearVideoWindow();
+  if (tunnel_mode_audio_session_id_ != -1) {
+    ClearVideoWindow(force_reset_surface_under_tunnel_mode_);
+  } else {
+    ClearVideoWindow(false);
+  }
 
   if (!require_software_codec_) {
     number_of_hardware_decoders_--;
@@ -559,7 +568,7 @@
       require_software_codec_,
       std::bind(&VideoDecoder::OnTunnelModeFrameRendered, this, _1),
       tunnel_mode_audio_session_id_, force_big_endian_hdr_metadata_,
-      error_message));
+      force_improved_support_check_, error_message));
   if (media_decoder_->is_valid()) {
     if (error_cb_) {
       media_decoder_->Initialize(
diff --git a/starboard/android/shared/video_decoder.h b/starboard/android/shared/video_decoder.h
index cc5dc1e..7859aa2 100644
--- a/starboard/android/shared/video_decoder.h
+++ b/starboard/android/shared/video_decoder.h
@@ -67,7 +67,9 @@
                const char* max_video_capabilities,
                int tunnel_mode_audio_session_id,
                bool force_secure_pipeline_under_tunnel_mode,
+               bool force_reset_surface_under_tunnel_mode,
                bool force_big_endian_hdr_metadata,
+               bool force_improved_support_check,
                std::string* error_message);
   ~VideoDecoder() override;
 
@@ -136,10 +138,18 @@
   // the main player and SW decoder for sub players.
   const bool require_software_codec_;
 
+  // Forces the use of specific Android APIs (isSizeSupported() and
+  // areSizeAndRateSupported()) to determine format support.
+  const bool force_improved_support_check_;
+
   // Force endianness of HDR Metadata.
   const bool force_big_endian_hdr_metadata_;
 
   const int tunnel_mode_audio_session_id_ = -1;
+
+  // Force resetting the video surface after tunnel mode playback, which
+  // prevents video distortion on some devices.
+  const bool force_reset_surface_under_tunnel_mode_;
   // On some platforms tunnel mode is only supported in the secure pipeline.  So
   // we create a dummy drm system to force the video playing in secure pipeline
   // to enable tunnel mode.
diff --git a/starboard/android/shared/video_window.cc b/starboard/android/shared/video_window.cc
index 88b7037..81d898d 100644
--- a/starboard/android/shared/video_window.cc
+++ b/starboard/android/shared/video_window.cc
@@ -14,10 +14,10 @@
 
 #include "starboard/android/shared/video_window.h"
 
-#include <android/native_window.h>
-#include <android/native_window_jni.h>
 #include <EGL/egl.h>
 #include <GLES2/gl2.h>
+#include <android/native_window.h>
+#include <android/native_window_jni.h>
 #include <jni.h>
 
 #include "starboard/android/shared/jni_env_ext.h"
@@ -45,6 +45,87 @@
 // vertical video.
 bool g_reset_surface_on_clear_window = false;
 
+void ClearNativeWindow(ANativeWindow* native_window) {
+  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+  eglInitialize(display, NULL, NULL);
+  if (display == EGL_NO_DISPLAY) {
+    SB_DLOG(ERROR) << "Found no EGL display in ClearVideoWindow";
+    return;
+  }
+
+  const EGLint kAttributeList[] = {
+      EGL_RED_SIZE,
+      8,
+      EGL_GREEN_SIZE,
+      8,
+      EGL_BLUE_SIZE,
+      8,
+      EGL_ALPHA_SIZE,
+      8,
+      EGL_RENDERABLE_TYPE,
+      EGL_OPENGL_ES2_BIT,
+      EGL_NONE,
+      0,
+      EGL_NONE,
+  };
+
+  // First, query how many configs match the given attribute list.
+  EGLint num_configs = 0;
+  EGL_CALL(eglChooseConfig(display, kAttributeList, NULL, 0, &num_configs));
+  SB_DCHECK(num_configs != 0);
+
+  // Allocate space to receive the matching configs and retrieve them.
+  EGLConfig* configs = new EGLConfig[num_configs];
+  EGL_CALL(eglChooseConfig(display, kAttributeList, configs, num_configs,
+                           &num_configs));
+
+  EGLNativeWindowType egl_native_window =
+      static_cast<EGLNativeWindowType>(native_window);
+  EGLConfig config;
+
+  // Find the first config that successfully allow a window surface to be
+  // created.
+  EGLSurface surface;
+  for (int config_number = 0; config_number < num_configs; ++config_number) {
+    config = configs[config_number];
+    surface = eglCreateWindowSurface(display, config, egl_native_window, NULL);
+    if (eglGetError() == EGL_SUCCESS)
+      break;
+  }
+  if (surface == EGL_NO_SURFACE) {
+    SB_DLOG(ERROR) << "Found no EGL surface in ClearVideoWindow";
+    return;
+  }
+  SB_DCHECK(surface != EGL_NO_SURFACE);
+
+  delete[] configs;
+
+  // Create an OpenGL ES 2.0 context.
+  EGLContext context = EGL_NO_CONTEXT;
+  EGLint context_attrib_list[] = {
+      EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE,
+  };
+  context =
+      eglCreateContext(display, config, EGL_NO_CONTEXT, context_attrib_list);
+  SB_DCHECK(eglGetError() == EGL_SUCCESS);
+  SB_DCHECK(context != EGL_NO_CONTEXT);
+
+  /* connect the context to the surface */
+  EGL_CALL(eglMakeCurrent(display, surface, surface, context));
+
+  GL_CALL(glClearColor(0, 0, 0, 1));
+  GL_CALL(glClear(GL_COLOR_BUFFER_BIT));
+  GL_CALL(glFlush());
+  EGL_CALL(eglSwapBuffers(display, surface));
+
+  // Cleanup all used resources.
+  EGL_CALL(
+      eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+  EGL_CALL(eglDestroyContext(display, context));
+  EGL_CALL(eglDestroySurface(display, surface));
+  EGL_CALL(eglTerminate(display));
+}
+
 }  // namespace
 
 extern "C" SB_EXPORT_PLATFORM void
@@ -68,6 +149,7 @@
   if (surface) {
     g_j_video_surface = env->NewGlobalRef(surface);
     g_native_video_window = ANativeWindow_fromSurface(env, surface);
+    ClearNativeWindow(g_native_video_window);
   }
 }
 
@@ -118,7 +200,7 @@
   }
 }
 
-void VideoSurfaceHolder::ClearVideoWindow() {
+void VideoSurfaceHolder::ClearVideoWindow(bool force_reset_surface) {
   // Lock *GetViewSurfaceMutex() here, to avoid releasing g_native_video_window
   // during painting.
   ScopedLock lock(*GetViewSurfaceMutex());
@@ -128,7 +210,11 @@
     return;
   }
 
-  if (g_reset_surface_on_clear_window) {
+  if (force_reset_surface) {
+    JniEnvExt::Get()->CallStarboardVoidMethodOrAbort("resetVideoSurface",
+                                                     "()V");
+    return;
+  } else if (g_reset_surface_on_clear_window) {
     int width = ANativeWindow_getWidth(g_native_video_window);
     int height = ANativeWindow_getHeight(g_native_video_window);
     if (width <= height) {
@@ -138,84 +224,7 @@
     }
   }
 
-  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-  eglInitialize(display, NULL, NULL);
-  if (display == EGL_NO_DISPLAY) {
-    SB_DLOG(ERROR) << "Found no EGL display in ClearVideoWindow";
-    return;
-  }
-
-  const EGLint kAttributeList[] = {
-      EGL_RED_SIZE,
-      8,
-      EGL_GREEN_SIZE,
-      8,
-      EGL_BLUE_SIZE,
-      8,
-      EGL_ALPHA_SIZE,
-      8,
-      EGL_RENDERABLE_TYPE,
-      EGL_OPENGL_ES2_BIT,
-      EGL_NONE,
-      0,
-      EGL_NONE,
-  };
-
-  // First, query how many configs match the given attribute list.
-  EGLint num_configs = 0;
-  EGL_CALL(eglChooseConfig(display, kAttributeList, NULL, 0, &num_configs));
-  SB_DCHECK(num_configs != 0);
-
-  // Allocate space to receive the matching configs and retrieve them.
-  EGLConfig* configs = new EGLConfig[num_configs];
-  EGL_CALL(eglChooseConfig(display, kAttributeList, configs, num_configs,
-                           &num_configs));
-
-  EGLNativeWindowType native_window =
-      static_cast<EGLNativeWindowType>(g_native_video_window);
-  EGLConfig config;
-
-  // Find the first config that successfully allow a window surface to be
-  // created.
-  EGLSurface surface;
-  for (int config_number = 0; config_number < num_configs; ++config_number) {
-    config = configs[config_number];
-    surface = eglCreateWindowSurface(display, config, native_window, NULL);
-    if (eglGetError() == EGL_SUCCESS)
-      break;
-  }
-  if (surface == EGL_NO_SURFACE) {
-    SB_DLOG(ERROR) << "Found no EGL surface in ClearVideoWindow";
-    return;
-  }
-  SB_DCHECK(surface != EGL_NO_SURFACE);
-
-  delete[] configs;
-
-  // Create an OpenGL ES 2.0 context.
-  EGLContext context = EGL_NO_CONTEXT;
-  EGLint context_attrib_list[] = {
-      EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE,
-  };
-  context =
-      eglCreateContext(display, config, EGL_NO_CONTEXT, context_attrib_list);
-  SB_DCHECK(eglGetError() == EGL_SUCCESS);
-  SB_DCHECK(context != EGL_NO_CONTEXT);
-
-  /* connect the context to the surface */
-  EGL_CALL(eglMakeCurrent(display, surface, surface, context));
-
-  GL_CALL(glClearColor(0, 0, 0, 1));
-  GL_CALL(glClear(GL_COLOR_BUFFER_BIT));
-  GL_CALL(glFlush());
-  EGL_CALL(eglSwapBuffers(display, surface));
-
-  // Cleanup all used resources.
-  EGL_CALL(
-      eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
-  EGL_CALL(eglDestroyContext(display, context));
-  EGL_CALL(eglDestroySurface(display, surface));
-  EGL_CALL(eglTerminate(display));
+  ClearNativeWindow(g_native_video_window);
 }
 
 }  // namespace shared
diff --git a/starboard/android/shared/video_window.h b/starboard/android/shared/video_window.h
index 17db407..4196cb9 100644
--- a/starboard/android/shared/video_window.h
+++ b/starboard/android/shared/video_window.h
@@ -48,7 +48,7 @@
   bool GetVideoWindowSize(int* width, int* height);
 
   // Clear the video window by painting it Black.
-  void ClearVideoWindow();
+  void ClearVideoWindow(bool force_reset_surface);
 };
 
 }  // namespace shared
diff --git a/starboard/android/shared/window_blur_on_screen_keyboard.cc b/starboard/android/shared/window_blur_on_screen_keyboard.cc
index dd2048f..83696bf 100644
--- a/starboard/android/shared/window_blur_on_screen_keyboard.cc
+++ b/starboard/android/shared/window_blur_on_screen_keyboard.cc
@@ -14,10 +14,7 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void SbWindowBlurOnScreenKeyboard(SbWindow window, int ticket) {
   // Stub.
   return;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/android/shared/window_focus_on_screen_keyboard.cc b/starboard/android/shared/window_focus_on_screen_keyboard.cc
index 8ffdaba..bbcb7a3 100644
--- a/starboard/android/shared/window_focus_on_screen_keyboard.cc
+++ b/starboard/android/shared/window_focus_on_screen_keyboard.cc
@@ -14,10 +14,7 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket) {
   // Stub.
   return;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/android/shared/window_get_on_screen_keyboard_bounding_rect.cc b/starboard/android/shared/window_get_on_screen_keyboard_bounding_rect.cc
index b793f5b..38b3536 100644
--- a/starboard/android/shared/window_get_on_screen_keyboard_bounding_rect.cc
+++ b/starboard/android/shared/window_get_on_screen_keyboard_bounding_rect.cc
@@ -14,11 +14,8 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 bool SbWindowGetOnScreenKeyboardBoundingRect(SbWindow window,
                                              SbWindowRect* bounding_rect) {
   // Stub.
   return true;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/android/shared/window_hide_on_screen_keyboard.cc b/starboard/android/shared/window_hide_on_screen_keyboard.cc
index 7cf008c..642060e 100644
--- a/starboard/android/shared/window_hide_on_screen_keyboard.cc
+++ b/starboard/android/shared/window_hide_on_screen_keyboard.cc
@@ -16,11 +16,8 @@
 
 #include "starboard/android/shared/application_android.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket) {
   starboard::android::shared::ApplicationAndroid::Get()
       ->SbWindowHideOnScreenKeyboard(window, ticket);
   return;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/android/shared/window_is_on_screen_keyboard_shown.cc b/starboard/android/shared/window_is_on_screen_keyboard_shown.cc
index 71ac1a0..c7749a3 100644
--- a/starboard/android/shared/window_is_on_screen_keyboard_shown.cc
+++ b/starboard/android/shared/window_is_on_screen_keyboard_shown.cc
@@ -20,7 +20,6 @@
 using starboard::android::shared::JniEnvExt;
 using starboard::android::shared::ScopedLocalJavaRef;
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 bool SbWindowIsOnScreenKeyboardShown(SbWindow window) {
   JniEnvExt* env = JniEnvExt::Get();
 
@@ -31,5 +30,3 @@
       j_keyboard_editor.Get(), "isKeyboardShowing", "()Z");
   return is_keyboard_shown;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/android/shared/window_on_screen_keyboard_is_supported.cc b/starboard/android/shared/window_on_screen_keyboard_is_supported.cc
index ab63af8..5388180 100644
--- a/starboard/android/shared/window_on_screen_keyboard_is_supported.cc
+++ b/starboard/android/shared/window_on_screen_keyboard_is_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbWindowOnScreenKeyboardIsSupported() {
   return false;
 }
-
-#endif
diff --git a/starboard/android/shared/window_on_screen_keyboard_suggestions_supported.cc b/starboard/android/shared/window_on_screen_keyboard_suggestions_supported.cc
index 050a2f8..541aa6a 100644
--- a/starboard/android/shared/window_on_screen_keyboard_suggestions_supported.cc
+++ b/starboard/android/shared/window_on_screen_keyboard_suggestions_supported.cc
@@ -14,9 +14,6 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window) {
   return true;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/android/shared/window_set_on_screen_keyboard_keep_focus.cc b/starboard/android/shared/window_set_on_screen_keyboard_keep_focus.cc
index c940aad..a216937 100644
--- a/starboard/android/shared/window_set_on_screen_keyboard_keep_focus.cc
+++ b/starboard/android/shared/window_set_on_screen_keyboard_keep_focus.cc
@@ -18,7 +18,6 @@
 
 using starboard::android::shared::JniEnvExt;
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void SbWindowSetOnScreenKeyboardKeepFocus(SbWindow window, bool keep_focus) {
   JniEnvExt* env = JniEnvExt::Get();
   jobject j_keyboard_editor = env->CallStarboardObjectMethodOrAbort(
@@ -27,5 +26,3 @@
                              keep_focus);
   return;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/android/shared/window_show_on_screen_keyboard.cc b/starboard/android/shared/window_show_on_screen_keyboard.cc
index a9f73fa..bd378a0 100644
--- a/starboard/android/shared/window_show_on_screen_keyboard.cc
+++ b/starboard/android/shared/window_show_on_screen_keyboard.cc
@@ -16,7 +16,6 @@
 
 #include "starboard/android/shared/application_android.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void SbWindowShowOnScreenKeyboard(SbWindow window,
                                   const char* input_text,
                                   int ticket) {
@@ -24,5 +23,3 @@
       ->SbWindowShowOnScreenKeyboard(window, input_text, ticket);
   return;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/android/shared/window_update_on_screen_keyboard_suggestions.cc b/starboard/android/shared/window_update_on_screen_keyboard_suggestions.cc
index 217c5ae..44bad14 100644
--- a/starboard/android/shared/window_update_on_screen_keyboard_suggestions.cc
+++ b/starboard/android/shared/window_update_on_screen_keyboard_suggestions.cc
@@ -16,7 +16,6 @@
 
 #include "starboard/android/shared/application_android.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window,
                                                const char* suggestions[],
                                                int num_suggestions,
@@ -30,5 +29,3 @@
                                                   ticket);
   return;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/android/x86/cobalt/configuration.py b/starboard/android/x86/cobalt/configuration.py
index fc54ba9..cf3a881 100644
--- a/starboard/android/x86/cobalt/configuration.py
+++ b/starboard/android/x86/cobalt/configuration.py
@@ -22,7 +22,7 @@
 
   def GetTestFilters(self):
     filters = super(CobaltAndroidX86Configuration, self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
+    for target, tests in self.__FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
 
@@ -32,24 +32,22 @@
           test_filter.FILTER_ALL
       ],
       'layout_tests': [  # Old Android versions don't have matching fonts
-          'CSS3FontsLayoutTests/Layout.Test'
-          '/5_2_use_first_available_listed_font_family',
-          'CSS3FontsLayoutTests/Layout.Test'
-          '/5_2_use_specified_font_family_if_available',
-          'CSS3FontsLayoutTests/Layout.Test'
-          '/5_2_use_system_fallback_if_no_matching_family_is_found*',
-          'CSS3FontsLayoutTests/Layout.Test'
-          '/synthetic_bolding_should_not_occur_on_bold_font',
-          'CSS3FontsLayoutTests/Layout.Test'
-          '/synthetic_bolding_should_occur_on_non_bold_font',
+          ('CSS3FontsLayoutTests/Layout.Test'
+           '/5_2_use_first_available_listed_font_family'),
+          ('CSS3FontsLayoutTests/Layout.Test'
+           '/5_2_use_specified_font_family_if_available'),
+          ('CSS3FontsLayoutTests/Layout.Test'
+           '/5_2_use_system_fallback_if_no_matching_family_is_found*'),
+          ('CSS3FontsLayoutTests/Layout.Test'
+           '/synthetic_bolding_should_not_occur_on_bold_font'),
+          ('CSS3FontsLayoutTests/Layout.Test'
+           '/synthetic_bolding_should_occur_on_non_bold_font'),
       ],
       'net_unittests': [  # Net tests are very unstable on Android L
           test_filter.FILTER_ALL
       ],
       'renderer_test': [
           'LottieCoveragePixelTest*skottie_matte_blendmode_json',
-          'PixelTest.SimpleTextInRed40PtChineseFont',
-          'PixelTest.SimpleTextInRed40PtThaiFont',
           'PixelTest.YUV422UYVYImageScaledUpSupport',
           'PixelTest.YUV422UYVYImageScaledAndTranslated',
       ],
diff --git a/starboard/android/x86/gyp_configuration.gypi b/starboard/android/x86/gyp_configuration.gypi
deleted file mode 100644
index a339ae6..0000000
--- a/starboard/android/x86/gyp_configuration.gypi
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    # Android x86 does not support the instruction set required by SSE4, while
-    # Opus still tries to build all SSE code in for run time selection, causing
-    # build errors. Exclude all SSE-related code.
-    'sb_disable_opus_sse': 1,
-  },
-
-  'target_defaults': {
-    'default_configuration': 'android-x86_debug',
-    'configurations': {
-      'android-x86_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'android-x86_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'android-x86_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'android-x86_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '../shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/android/x86/gyp_configuration.py b/starboard/android/x86/gyp_configuration.py
index 10bd752..a781f3b 100644
--- a/starboard/android/x86/gyp_configuration.py
+++ b/starboard/android/x86/gyp_configuration.py
@@ -14,44 +14,7 @@
 """Starboard Android x86 platform build configuration."""
 
 from starboard.android.shared import gyp_configuration as shared_configuration
-from starboard.tools.testing import test_filter
 
 
 def CreatePlatformConfig():
-  return Androidx86Configuration(
-      'android-x86',
-      'x86',
-      sabi_json_path='starboard/sabi/x86/sabi-v{sb_api_version}.json')
-
-
-class Androidx86Configuration(shared_configuration.AndroidConfiguration):
-
-  def GetTestFilters(self):
-    filters = super(Androidx86Configuration, self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
-      filters.extend(test_filter.TestFilter(target, test) for test in tests)
-    return filters
-
-  # A map of failing or crashing tests per target
-  __FILTERED_TESTS = {  # pylint: disable=invalid-name
-      'nplb': [
-          'SbAccessibilityTest.CallSetCaptionsEnabled',
-          'SbAccessibilityTest.GetCaptionSettingsReturnIsValid',
-          'SbAudioSinkTest.*',
-          'SbMediaCanPlayMimeAndKeySystem.*',
-          'SbMicrophoneCloseTest.*',
-          'SbMicrophoneOpenTest.*',
-          'SbMicrophoneReadTest.*',
-          'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.*',
-          'SbMediaSetAudioWriteDurationTests/SbMediaSetAudioWriteDurationTest'
-          '.WriteContinuedLimitedInput/*',
-          'SbMediaSetAudioWriteDurationTests/SbMediaSetAudioWriteDurationTest'
-          '.WriteLimitedInput/*',
-      ],
-      'player_filter_tests': [
-          'AudioDecoderTests/*',
-          'VideoDecoderTests/*',
-
-          'PlayerComponentsTests/*',
-      ],
-  }
+  return shared_configuration.AndroidConfiguration('android-x86')
diff --git a/starboard/android/x86/starboard_platform.gyp b/starboard/android/x86/starboard_platform.gyp
deleted file mode 100644
index 7e4cdc2..0000000
--- a/starboard/android/x86/starboard_platform.gyp
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [ '../shared/starboard_platform.gypi' ],
-}
diff --git a/starboard/android/x86/starboard_platform_tests.gyp b/starboard/android/x86/starboard_platform_tests.gyp
deleted file mode 100644
index f7f55a3..0000000
--- a/starboard/android/x86/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [ '../shared/starboard_platform_tests.gypi' ],
-}
diff --git a/starboard/android/x86/test_filters.py b/starboard/android/x86/test_filters.py
index a510516..c33e6cf 100644
--- a/starboard/android/x86/test_filters.py
+++ b/starboard/android/x86/test_filters.py
@@ -16,6 +16,29 @@
 from starboard.android.shared import test_filters as shared_test_filters
 from starboard.tools.testing import test_filter
 
+# A map of failing or crashing tests per target
+_FILTERED_TESTS = {
+    'nplb': [
+        'SbAccessibilityTest.CallSetCaptionsEnabled',
+        'SbAccessibilityTest.GetCaptionSettingsReturnIsValid',
+        'SbAudioSinkTest.*',
+        'SbMediaCanPlayMimeAndKeySystem.*',
+        'SbMicrophoneCloseTest.*',
+        'SbMicrophoneOpenTest.*',
+        'SbMicrophoneReadTest.*',
+        'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.*',
+        ('SbMediaSetAudioWriteDurationTests/SbMediaSetAudioWriteDurationTest'
+         '.WriteContinuedLimitedInput/*'),
+        ('SbMediaSetAudioWriteDurationTests/SbMediaSetAudioWriteDurationTest'
+         '.WriteLimitedInput/*'),
+    ],
+    'player_filter_tests': [
+        'AudioDecoderTests/*',
+        'VideoDecoderTests/*',
+        'PlayerComponentsTests/*',
+    ],
+}
+
 
 def CreateTestFilters():
   return AndroidX86TestFilters()
@@ -26,29 +49,6 @@
 
   def GetTestFilters(self):
     filters = super(AndroidX86TestFilters, self).GetTestFilters()
-    for target, tests in self._FILTERED_TESTS.iteritems():
+    for target, tests in _FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
-
-  # A map of failing or crashing tests per target
-  _FILTERED_TESTS = {
-      'nplb': [
-          'SbAccessibilityTest.CallSetCaptionsEnabled',
-          'SbAccessibilityTest.GetCaptionSettingsReturnIsValid',
-          'SbAudioSinkTest.*',
-          'SbMediaCanPlayMimeAndKeySystem.*',
-          'SbMicrophoneCloseTest.*',
-          'SbMicrophoneOpenTest.*',
-          'SbMicrophoneReadTest.*',
-          'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.*',
-          'SbMediaSetAudioWriteDurationTests/SbMediaSetAudioWriteDurationTest'
-          '.WriteContinuedLimitedInput/*',
-          'SbMediaSetAudioWriteDurationTests/SbMediaSetAudioWriteDurationTest'
-          '.WriteLimitedInput/*',
-      ],
-      'player_filter_tests': [
-          'AudioDecoderTests/*',
-          'VideoDecoderTests/*',
-          'PlayerComponentsTests/*',
-      ],
-  }
diff --git a/starboard/android/x86/thread_types_public.h b/starboard/android/x86/thread_types_public.h
deleted file mode 100644
index 1416655..0000000
--- a/starboard/android/x86/thread_types_public.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/android/shared/thread_types_public.h"
diff --git a/starboard/audio_sink.h b/starboard/audio_sink.h
index ae5d9d7..7d6c794 100644
--- a/starboard/audio_sink.h
+++ b/starboard/audio_sink.h
@@ -63,17 +63,8 @@
 
 // Callback used to report frames consumed.  The consumed frames will be
 // removed from the source frame buffer to free space for new audio frames.
-#if SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 typedef void (*SbAudioSinkConsumeFramesFunc)(int frames_consumed,
                                              void* context);
-#else   // SB_API_VERSION >=  12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-// When |frames_consumed| is updated asynchnously and the last time that it has
-// been updated is known, it can be passed in |frames_consumed_at| so the audio
-// time calculating can be more accurate.
-typedef void (*SbAudioSinkConsumeFramesFunc)(int frames_consumed,
-                                             SbTime frames_consumed_at,
-                                             void* context);
-#endif  // SB_API_VERSION >=  12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 
 // Well-defined value for an invalid audio sink.
 #define kSbAudioSinkInvalid ((SbAudioSink)NULL)
diff --git a/starboard/benchmark/benchmark.gyp b/starboard/benchmark/benchmark.gyp
deleted file mode 100644
index 3e626a2..0000000
--- a/starboard/benchmark/benchmark.gyp
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'benchmark',
-      'type': '<(final_executable_type)',
-      'defines': [
-        # This allows the benchmarks to include internal only header files.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'sources': [
-        '<(DEPTH)/starboard/benchmark/memory_benchmark.cc',
-        '<(DEPTH)/starboard/benchmark/thread_benchmark.cc',
-        '<(DEPTH)/starboard/common/benchmark_main.cc',
-      ],
-      'dependencies': [
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/third_party/google_benchmark/google_benchmark.gyp:google_benchmark',
-      ],
-    },
-    {
-      'target_name': 'benchmark_deploy',
-      'type': 'none',
-      'dependencies': [
-        'benchmark',
-      ],
-      'variables': {
-        'executable_name': 'benchmark',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/build/_env.py b/starboard/build/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/starboard/build/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/build/base_configuration.gypi b/starboard/build/base_configuration.gypi
deleted file mode 100644
index aa28f83..0000000
--- a/starboard/build/base_configuration.gypi
+++ /dev/null
@@ -1,436 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#####################################################################
-# If you modify this file, PLEASE REMEMBER TO UPDATE
-# //starboard/build/config/base.gni AS WELL
-#####################################################################
-
-# This contains the defaults and documentation for all Starboard-defined GYP
-# variables. Applications that build on top of Starboard are likely to have
-# their own base configuration, as well.
-#
-# starboard/build/gyp_runner includes this file automatically in all .gyp files
-# that it processes.
-
-{
-  'variables': {
-    # We need to define some variables inside of an inner 'variables' scope
-    # so that they can be referenced by other outer variables here.  Also, it
-    # allows for the specification of default values that get referenced by
-    # a top level scope.
-    'variables': {
-      'sb_enable_lib%': 0,
-      # TODO: Remove the "data" subdirectory.
-      'sb_static_contents_output_data_dir%': '<(PRODUCT_DIR)/content/data',
-      'sb_deploy_output_dir%': '<(PRODUCT_DIR)/deploy',
-      'sb_evergreen_compatible%': 0,
-      'sb_evergreen_compatible_libunwind%': 0,
-      'sb_evergreen_compatible_lite%': 0,
-    },
-
-    # Enables the yasm compiler to be used to compile .asm files.
-    'yasm_exists%': 0,
-
-    # Where yasm can be found on the target device.
-    'path_to_yasm%': "yasm",
-
-    # The Starboard API version of the current build configuration. The default
-    # value is meant to be overridden by a Starboard ABI file.
-    'sb_api_version%': 0,
-
-    # Enabling this variable enables pedantic levels of warnings for the current
-    # toolchain.
-    'sb_pedantic_warnings%': 0,
-
-    # Enables embedding Cobalt as a shared library within another app. This
-    # requires a 'lib' starboard implementation for the corresponding platform.
-    'sb_enable_lib%': '<(sb_enable_lib)',
-
-    # Disables an NPLB audit of C++17 support.
-    'sb_disable_cpp17_audit': 0,
-
-    # When this is set to true, the web bindings for the microphone
-    # are disabled
-    'sb_disable_microphone_idl%': 0,
-
-    # Directory path to static contents' data.
-    'sb_static_contents_output_data_dir%': '<(sb_static_contents_output_data_dir)',
-
-    # Top-level directory for staging deploy build output. Platform deploy
-    # actions should use <(target_deploy_dir) defined in deploy.gypi to place
-    # artifacts for each deploy target in its own subdirectoy.
-    'sb_deploy_output_dir%': '<(sb_deploy_output_dir)',
-
-    # Contains the name of the hosting OS. The value is defined by the gyp
-    # wrapper script.
-    'host_os%': 'win',
-
-    # The target platform id as a string, like 'linux-x64x11', 'win32', etc..
-    'sb_target_platform': '',
-
-    # Whether this is an evergreen build.
-    'sb_evergreen': 0,
-
-    # Whether this is an evergreen compatible platform. A compatible platform
-    # can run the elf_loader and launch the evergreen build.
-    'sb_evergreen_compatible%': '<(sb_evergreen_compatible)',
-
-    # Whether to use the libunwind library on evergreen compatible platform.
-    'sb_evergreen_compatible_libunwind%': '<(sb_evergreen_compatible_libunwind)',
-
-    # Whether to adopt Evergreen Lite on the evergreen compatible platform.
-    'sb_evergreen_compatible_lite%': '<(sb_evergreen_compatible_lite)',
-
-    # The operating system of the target, separate from the target_arch. In many
-    # cases, an 'unknown' value is fine, but, if set to 'linux', then we can
-    # assume some things, and it'll save us some configuration time.
-    'target_os%': 'unknown',
-
-    # The variables allow changing the target type on platforms where the
-    # native code may require an additional packaging step (ex. Android).
-    'gtest_target_type%': 'executable',
-    'final_executable_type%': 'executable',
-
-    # Halt execution on failure to allocate memory.
-    'abort_on_allocation_failure%': 1,
-
-    # The relative path from src/ to the directory containing the
-    # starboard_platform.gyp file.  It is currently set to
-    # 'starboard/<(target_arch)' to make semi-starboard platforms work.
-    # TODO: Set the default value to '' once all semi-starboard platforms are
-    # moved to starboard.
-    'starboard_path%': 'starboard/<(target_arch)',
-
-    # The source of EGL and GLES headers and libraries.
-    # Valid values (case and everything sensitive!):
-    #   'none'   - No EGL + GLES implementation is available on this platform.
-    #   'system_gles3' - Deprecated. Use system_gles2 instead.
-    #                    Use the system implementation of EGL + GLES3. The
-    #                    headers and libraries must be on the system include and
-    #                    link paths.
-    #   'system_gles2' - Use the system implementation of EGL + GLES2. The
-    #                    headers and libraries must be on the system include and
-    #                    link paths.
-    #   'glimp'  - Cobalt's own EGL + GLES2 implementation. This requires a
-    #              valid Glimp implementation for the platform.
-    #   'angle'  - A DirectX-to-OpenGL adaptation layer. This requires a valid
-    #              ANGLE implementation for the platform.
-    # Choosing an unsupported value will result in a GYP error:
-    #   "cobalt/renderer/egl_and_gles/egl_and_gles_<gl_type>.gyp not found"
-    'gl_type%': 'system_gles2',
-
-    # Temporary indicator for Tizen - should eventually move to feature defines.
-    'tizen_os%': 0,
-
-    # The event polling mechanism available on this platform to support libevent.
-    # Platforms may redefine to 'poll' if necessary.
-    # Other mechanisms, e.g. devpoll, kqueue, select, are not yet supported.
-    'sb_libevent_method%': 'epoll',
-
-    # Used to indicate that the player is filter based.
-    'sb_filter_based_player%': 1,
-
-    # Used to enable benchmarks.
-    'sb_enable_benchmark%': 0,
-
-    # This variable dictates whether a given gyp target should be compiled with
-    # optimization flags for size vs. speed.
-    'optimize_target_for_speed%': 0,
-
-    # Compiler configuration.
-
-    # The following variables are used to specify compiler and linker
-    # flags by build configuration. Platform specific .gypi includes and
-    # .gyp targets can use them to add additional flags.
-
-    'compiler_flags%': [],
-    'linker_flags%': [],
-
-    # TODO: Replace linker_flags_(config) with linker_shared_flags_(config)
-    # and linker_executable_flags_(config) to distinguish the flags for
-    # SharedLibraryLinker and ExecutableLinker.
-    'compiler_flags_debug%': [],
-    'compiler_flags_c_debug%': [],
-    'compiler_flags_cc_debug%': [],
-    'linker_flags_debug%': [],
-    'defines_debug%': [],
-
-    'compiler_flags_devel%': [],
-    'compiler_flags_c_devel%': [],
-    'compiler_flags_cc_devel%': [],
-    'linker_flags_devel%': [],
-    'defines_devel%': [],
-
-    # For qa and gold configs, different compiler flags may be specified for
-    # gyp targets that should be built for size than for speed. Targets which
-    # specify 'optimize_target_for_speed == 1', will compile with flags:
-    #   ['compiler_flags_*<config>', 'compiler_flags_*<config>_speed'].
-    # Otherwise, targets will use compiler flags:
-    #   ['compiler_flags_*<config>', 'compiler_flags_*<config>_size'].
-    # Platforms may decide to use the same optimization flags for both
-    # target types by leaving the '*_size' and '*_speed' variables empty.
-    'compiler_flags_qa%': [],
-    'compiler_flags_qa_size%': [],
-    'compiler_flags_qa_speed%': [],
-    'compiler_flags_c_qa%': [],
-    'compiler_flags_c_qa_size%': [],
-    'compiler_flags_c_qa_speed%': [],
-    'compiler_flags_cc_qa%': [],
-    'compiler_flags_cc_qa_size%': [],
-    'compiler_flags_cc_qa_speed%': [],
-    'linker_flags_qa%': [],
-    'defines_qa%': [],
-
-    'compiler_flags_gold%': [],
-    'compiler_flags_gold_size%': [],
-    'compiler_flags_gold_speed%': [],
-    'compiler_flags_c_gold%': [],
-    'compiler_flags_c_gold_size%': [],
-    'compiler_flags_c_gold_speed%': [],
-    'compiler_flags_cc_gold%': [],
-    'compiler_flags_cc_gold_size%': [],
-    'compiler_flags_cc_gold_speed%': [],
-    'linker_flags_gold%': [],
-    'defines_gold%': [],
-
-    'compiler_flags_host%': [],
-    'compiler_flags_c_host%': [],
-    'defines_host%': [],
-
-    'platform_libraries%': [],
-
-    # TODO: Remove these compatibility variables from Starboard.
-
-    # List of platform-specific targets that get compiled into cobalt.
-    'cobalt_platform_dependencies%': [],
-
-    'conditions': [
-      ['host_os=="linux"', {
-        'conditions': [
-          ['target_arch=="arm" or target_arch=="x86"', {
-            # All the 32 bit CPU architectures v8 supports.
-            'compiler_flags_cc_host%': [
-              '-m32',
-              '--std=gnu++14',
-            ],
-            'compiler_flags_host': [
-              '-m32',
-            ],
-            'compiler_flags_host': [
-              '-m32',
-            ],
-            'linker_flags_host%': [
-              '-target', 'i386-unknown-linux-gnu',
-              '-pthread',
-              '-latomic',
-            ],
-          }, {
-            'compiler_flags_cc_host%': [
-              '--std=gnu++14',
-            ],
-            'linker_flags_host%': [
-            '-pthread',
-            ],
-          }],
-        ],
-      }, {
-        'compiler_flags_cc_host%': [],
-        'linker_flags_host%': [],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'variables': {
-      # The condition that operates on sb_pedantic_warnings is in a
-      # target_conditions section, and will not have access to the default
-      # fallback value of sb_pedantic_warnings at the top of this file,
-      # or to the sb_pedantic_warnings variable placed at the root
-      # variables scope of .gyp files, because those variables are not set at
-      # target scope.  As a workaround, if sb_pedantic_warnings is not
-      # set at target scope, define it in target scope to contain whatever
-      # value it has during early variable expansion. That's enough to make
-      # it available during target conditional processing.
-      'sb_pedantic_warnings%': '<(sb_pedantic_warnings)',
-
-      # This workaround is used to surface the default setting for the variable
-      # 'optimize_target_for_speed' if the gyp target does not explicitly set
-      # it.
-      'optimize_target_for_speed%': '<(optimize_target_for_speed)',
-    },
-    'cflags': [ '<@(compiler_flags)' ],
-    'ldflags': [ '<@(linker_flags)' ],
-    'cflags_host': [ '<@(compiler_flags_host)', ],
-    'cflags_c_host': [ '<@(compiler_flags_c_host)', ],
-    'cflags_cc_host': [ '<@(compiler_flags_cc_host)', ],
-    'ldflags_host': [ '<@(linker_flags_host)' ],
-
-    # Allows any source file to include files relative to the source tree.
-    'include_dirs': [ '<(DEPTH)' ],
-    'libraries': [ '<@(platform_libraries)' ],
-
-    'conditions': [
-      ['final_executable_type=="shared_library"', {
-        'target_conditions': [
-          ['_toolset=="target"', {
-            'defines': [
-              # Rewrite main() functions into StarboardMain. TODO: This is a
-              # hack, it would be better to be more surgical, here.
-              'main=StarboardMain',
-            ],
-            'cflags': [
-              # To link into a shared library on Linux and similar platforms,
-              # the compiler must be told to generate Position Independent Code.
-              # This appears to cause errors when linking the code statically,
-              # however.
-              '-fPIC',
-            ],
-          }],
-        ],
-      }],
-      ['OS == "starboard"', {
-        'target_conditions': [
-          ['_toolset=="target"', {
-            # Keeps common Starboard target changes in the starboard project.
-            'includes': [
-              '../../starboard/starboard_base_target.gypi',
-            ],
-          }],
-        ],
-      }],  # OS == "starboard"
-    ],
-
-    # TODO: Revisit and remove unused configurations.
-    'configurations': {
-      'debug_base': {
-        'abstract': 1,
-        # no optimization, include symbols:
-        'cflags': [ '<@(compiler_flags_debug)' ],
-        'cflags_c': [ '<@(compiler_flags_c_debug)' ],
-        'cflags_cc': [ '<@(compiler_flags_cc_debug)' ],
-        'ldflags': [ '<@(linker_flags_debug)' ],
-        'defines': [
-          '<@(defines_debug)',
-          'STARBOARD_BUILD_TYPE_DEBUG',
-          '_DEBUG',
-        ],
-      }, # end of debug_base
-      'devel_base': {
-        'abstract': 1,
-        # optimize, include symbols:
-        'cflags': [ '<@(compiler_flags_devel)' ],
-        'cflags_c': [ '<@(compiler_flags_c_devel)' ],
-        'cflags_cc': [ '<@(compiler_flags_cc_devel)' ],
-        'ldflags': [ '<@(linker_flags_devel)' ],
-        'defines': [
-          '<@(defines_devel)',
-          'STARBOARD_BUILD_TYPE_DEVEL',
-          '_DEBUG',
-        ],
-      }, # end of devel_base
-      'qa_base': {
-        'abstract': 1,
-        # optimize:
-        'target_conditions': [
-          ['optimize_target_for_speed==1', {
-            'cflags': [
-              '<@(compiler_flags_qa)',
-              '<@(compiler_flags_qa_speed)',
-            ],
-            'cflags_c': [
-              '<@(compiler_flags_c_qa)',
-              '<@(compiler_flags_c_qa_speed)',
-            ],
-            'cflags_cc': [
-              '<@(compiler_flags_cc_qa)',
-              '<@(compiler_flags_cc_qa_speed)',
-            ],
-          }, {
-            'cflags': [
-              '<@(compiler_flags_qa)',
-              '<@(compiler_flags_qa_size)',
-            ],
-            'cflags_c': [
-              '<@(compiler_flags_c_qa)',
-              '<@(compiler_flags_c_qa_size)',
-            ],
-            'cflags_cc': [
-              '<@(compiler_flags_cc_qa)',
-              '<@(compiler_flags_cc_qa_size)',
-            ],
-          }]
-        ],
-        'ldflags': [ '<@(linker_flags_qa)' ],
-        'defines': [
-          '<@(defines_qa)',
-          'STARBOARD_BUILD_TYPE_QA',
-          'NDEBUG',
-        ],
-      }, # end of devel_base
-      'gold_base': {
-        'abstract': 1,
-        # optimize:
-        'target_conditions': [
-          ['optimize_target_for_speed==1', {
-            'cflags': [
-              '<@(compiler_flags_gold)',
-              '<@(compiler_flags_gold_speed)',
-            ],
-            'cflags_c': [
-              '<@(compiler_flags_c_gold)',
-              '<@(compiler_flags_c_gold_speed)',
-            ],
-            'cflags_cc': [
-              '<@(compiler_flags_cc_gold)',
-              '<@(compiler_flags_cc_gold_speed)',
-            ],
-          }, {
-            'cflags': [
-              '<@(compiler_flags_gold)',
-              '<@(compiler_flags_gold_size)',
-            ],
-            'cflags_c': [
-              '<@(compiler_flags_c_gold)',
-              '<@(compiler_flags_c_gold_size)',
-            ],
-            'cflags_cc': [
-              '<@(compiler_flags_cc_gold)',
-              '<@(compiler_flags_cc_gold_size)',
-            ],
-          }]
-        ],
-        'ldflags': [ '<@(linker_flags_gold)' ],
-        'defines': [
-          '<@(defines_gold)',
-          'STARBOARD_BUILD_TYPE_GOLD',
-          'NDEBUG',
-        ],
-      }, # end of gold_base
-    }, # end of configurations
-  }, # end of target_defaults
-
-  'conditions': [
-    ['cobalt_config != "gold"', {
-      'variables' : {
-        'sb_allows_memory_tracking': 1,
-      },
-    },
-    {
-      'variables' : {
-        'sb_allows_memory_tracking': 0,
-      },
-    }],
-  ],
-}
diff --git a/starboard/build/clang.py b/starboard/build/clang.py
index 5e35ed0..59f64fc 100644
--- a/starboard/build/clang.py
+++ b/starboard/build/clang.py
@@ -13,7 +13,6 @@
 # limitations under the License.
 """Canonical location for the Clang specification."""
 
-import _env  # pylint: disable=unused-import
 from starboard.tools.build import ClangSpecification
 
 
diff --git a/starboard/build/collect_deploy_content.gypi b/starboard/build/collect_deploy_content.gypi
deleted file mode 100644
index 65953f5..0000000
--- a/starboard/build/collect_deploy_content.gypi
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is meant to be included into a platform deploy gypi to provide an
-# action to collect static content that should be deployed with a given target.
-#
-# The action builds a symlink farm in the content/deploy/<executable_name>
-# directory, pointing to the subset of data in content/data that was populated
-# by some dependency of the target being deployed.
-{
-  'variables': {
-    # Root of the content tree that should be deployed with a given target.
-    'content_deploy_dir': '<(target_deploy_dir)/content',
-
-    # Stamp file that will be updated after the content symlink farm is built.
-    'content_deploy_stamp_file': '<(content_deploy_dir).stamp',
-
-    # This is a list of relative paths within both input_dir and output_dir,
-    # and is named such that GYP does not relativize it. Values are merged in
-    # from the all_dependent_settings blocks of gypi files that copy static data
-    # into content/data.
-    'content_deploy_subdirs': [],
-
-    # Some platforms will symlink to a folder containing relative symlinks,
-    # and this will cause an invalid path. To get around this these platforms
-    # should set |content_deploy_use_absolute_symlinks| to 1.
-    'content_deploy_use_absolute_symlinks%': 0,
-
-    # Some platforms can only support a limited depth of directory
-    # structure, and this allows the depth of deploy content to be
-    # checked not to exceed that.
-    'content_deploy_max_depth%': 0,
-
-    # Implementation detail to add conditional args.
-    'collect_deploy_content_extra_args': [],
-  },
-  'conditions': [
-    ['content_deploy_use_absolute_symlinks == 1', {
-      'variables': {
-        'collect_deploy_content_extra_args': [ '--use_absolute_symlinks' ],
-      }
-    }],
-    ['cobalt_docker_build == 1 and host_os == "win" and cobalt_fastbuild != 1', {
-      'variables': {
-        'collect_deploy_content_extra_args': [ '--copy_override' ],
-      }
-    }],
-  ],
-  'actions': [{
-    'action_name': 'collect_deploy_content',
-    'variables': {
-      'input_dir': '<(sb_static_contents_output_data_dir)',
-      'output_dir': '<(content_deploy_dir)',
-    },
-    # Re-collect the content whenever the executable is rebuilt, but wait until
-    # cleaning the deploy dir is done.
-    'inputs': [
-        '<(executable_file)',
-        '<(target_deploy_stamp_file)',
-    ],
-    'outputs': [ '<(content_deploy_stamp_file)' ],
-    'action': [
-      'python2',
-      '<(DEPTH)/starboard/build/collect_deploy_content.py',
-      '-i', '<(input_dir)',
-      '-o', '<(output_dir)',
-      '-s', '<(content_deploy_stamp_file)',
-      '--max_depth', '<(content_deploy_max_depth)',
-      '<@(collect_deploy_content_extra_args)',
-      '>@(content_deploy_subdirs)',
-    ],
-    'message': 'Collect content: <(content_deploy_dir)',
-  }],
-}
diff --git a/starboard/build/collect_deploy_content.py b/starboard/build/collect_deploy_content.py
index 3b4ce71..b2f7b10 100755
--- a/starboard/build/collect_deploy_content.py
+++ b/starboard/build/collect_deploy_content.py
@@ -20,7 +20,6 @@
 import shutil
 import sys
 
-import _env  # pylint: disable=unused-import
 from starboard.tools import port_symlink
 from starboard.tools import log_level
 
diff --git a/starboard/build/config/BUILD.gn b/starboard/build/config/BUILD.gn
index 3f585bf..aa06b1d 100644
--- a/starboard/build/config/BUILD.gn
+++ b/starboard/build/config/BUILD.gn
@@ -22,6 +22,7 @@
       "STARBOARD_BUILD_TYPE_DEBUG",
       "COBALT_BUILD_TYPE_DEBUG",
       "_DEBUG",
+      "COBALT_LOGGING_ENABLED",
     ]
   }
 
@@ -30,6 +31,7 @@
       "STARBOARD_BUILD_TYPE_DEVEL",
       "COBALT_BUILD_TYPE_DEVEL",
       "_DEBUG",
+      "COBALT_LOGGING_ENABLED",
     ]
   }
 
@@ -46,8 +48,15 @@
       "STARBOARD_BUILD_TYPE_GOLD",
       "COBALT_BUILD_TYPE_GOLD",
       "NDEBUG",
+      "OFFICIAL_BUILD",
+      "TRACING_DISABLED",
+      "COBALT_FORCE_CSP",
     ]
   }
+
+  if (enable_in_app_dial) {
+    defines += [ "DIAL_SERVER" ]
+  }
 }
 
 config("host") {
@@ -114,6 +123,7 @@
         "ENABLE_DEBUGGER",
         "ENABLE_DEBUG_COMMAND_LINE_SWITCHES",
         "ENABLE_TEST_RUNNER",
+        "ENABLE_IGNORE_CERTIFICATE_ERRORS",
       ]
     }
 
@@ -148,7 +158,6 @@
     defines += [
       "STARBOARD_ATOMIC_INCLUDE=\"$starboard_path/atomic_public.h\"",
       "STARBOARD_CONFIGURATION_INCLUDE=\"$starboard_path/configuration_public.h\"",
-      "STARBOARD_THREAD_TYPES_INCLUDE=\"$starboard_path/thread_types_public.h\"",
     ]
   }
 }
diff --git a/starboard/build/config/BUILDCONFIG.gn b/starboard/build/config/BUILDCONFIG.gn
index 9e10f5d..41086c5 100644
--- a/starboard/build/config/BUILDCONFIG.gn
+++ b/starboard/build/config/BUILDCONFIG.gn
@@ -20,8 +20,6 @@
 
   build_type = "devel"
 
-  target_platform = "stub"
-
   is_starboard = true
 
   cobalt_fastbuild = getenv("IS_CI") == "1"
@@ -29,6 +27,8 @@
   is_internal_build = getenv("COBALT_USE_INTERNAL_BUILD") == "1"
 
   is_docker_build = getenv("IS_DOCKER") == "1"
+
+  using_old_compiler = false
 }
 
 is_debug = build_type == "debug"
@@ -67,14 +67,10 @@
 
 # Get the path to the starboard implementation and include its GN
 # configuration.
-starboard_path = exec_script("//starboard/build/platforms.py",
-                             [ target_platform ],
-                             "trim string")
-assert(defined(starboard_path),
-       "Please add your platform to starboard/build/platforms.py")
+import("//starboard/build/platform_path.gni")
 host_toolchain = "//$starboard_path/toolchain:host"
-_default_toolchain = "//$starboard_path/toolchain:target"
-set_default_toolchain(_default_toolchain)
+target_toolchain = "//$starboard_path/toolchain:target"
+set_default_toolchain(target_toolchain)
 
 import("//$starboard_path/platform_configuration/configuration.gni")
 import("//starboard/build/config/build_assertions.gni")
@@ -84,7 +80,7 @@
 }
 
 _use_asan_default = (is_debug || is_devel) && (is_linux || is_mac) &&
-                    is_clang && !sb_is_evergreen
+                    is_clang && !sb_is_evergreen && !using_old_compiler
 declare_args() {
   use_asan = (_use_asan_default || getenv("USE_ASAN") == 1) && !use_tsan
 }
@@ -224,18 +220,24 @@
       outputs = []
       foreach(source, sources) {
         output_path = install_content_dir + "/" +
-                      rebase_path(source, "$sb_static_contents_output_data_dir")
+                      rebase_path(source, sb_static_contents_output_data_dir)
         outputs += [ output_path ]
       }
 
+      # Write the file list to a unique temp file to avoid blowing out the
+      # command line length limit.
+      files_list = "$root_gen_dir/${target_name}_files.tmp"
+      write_file(files_list, rebase_path(sources, root_build_dir))
+
       script = "//starboard/build/copy_install_content.py"
       args = [
         "--output_dir",
         rebase_path(install_content_dir, root_build_dir),
         "--base_dir",
         rebase_path(sb_static_contents_output_data_dir, root_build_dir),
+        "--files_list",
+        rebase_path(files_list, root_build_dir),
       ]
-      args += rebase_path(sources, root_build_dir)
     }
   }
 }
@@ -272,21 +274,76 @@
                            ])
   }
 
-  if (!defined(invoker.install_target) || invoker.install_target) {
+  if (current_toolchain == default_toolchain &&
+      (!defined(invoker.install_target) || invoker.install_target)) {
     executable_target_name = target_name
+
+    content_deps = []
+    if (defined(invoker.content_deps)) {
+      content_deps += invoker.content_deps
+    }
+    if (defined(platform_i18n_config_path)) {
+      content_deps += [ platform_i18n_config_path ]
+    }
+
+    if (separate_install_targets_for_bundling) {
+      bundle_deps = []
+      foreach(content_dep, content_deps) {
+        bundle_deps += [ "${content_dep}_install_content" ]
+      }
+
+      # TODO(b/220024845): Make this much better.
+      action("${executable_target_name}_bundle_content") {
+        forward_variables_from(invoker, [ "testonly" ])
+
+        deps = [ ":$executable_target_name" ]
+        deps += bundle_deps
+
+        sources = []
+        foreach(bundle_dep, bundle_deps) {
+          # Split the target path and name. E.g. //path/to:target -> [ "//path/to", "target" ].
+          target_path_and_name = string_split(bundle_dep, ":")
+
+          # The content_dep target will place its file under the root gen dir.
+          content_dep_list_file = string_join("/",
+                                              [
+                                                root_gen_dir,
+                                                target_path_and_name[1],
+                                              ])
+          target_path_and_name = []
+
+          sources += [ "${content_dep_list_file}_files.tmp" ]
+        }
+
+        bundle_content_dir = "$sb_install_output_dir/$executable_target_name/$sb_install_content_subdir"
+
+        # TODO(b/220024845): We don't have the list of output files.
+        outputs = [ bundle_content_dir ]
+
+        script = "//starboard/build/copy_bundle_content.py"
+        args = [
+          "--output_dir",
+          rebase_path(bundle_content_dir, root_build_dir),
+          "--base_dir",
+          rebase_path(sb_static_contents_output_data_dir, root_build_dir),
+        ]
+        args += rebase_path(sources, root_build_dir)
+      }
+    }
+
     install_target(target_name + "_install") {
       forward_variables_from(invoker, [ "testonly" ])
       installable_target_name = executable_target_name
       type = "executable"
+      deps = []
       if (defined(invoker.deps)) {
-        deps = invoker.deps
-      } else {
-        deps = []
+        deps += invoker.deps
       }
-      if (defined(invoker.content_deps)) {
-        foreach(content_dep, invoker.content_deps) {
-          deps += [ "${content_dep}_install_content" ]
-        }
+      if (separate_install_targets_for_bundling) {
+        deps += [ ":${executable_target_name}_bundle_content" ]
+      }
+      foreach(content_dep, content_deps) {
+        deps += [ "${content_dep}_install_content" ]
       }
     }
   }
@@ -303,21 +360,76 @@
                            ])
   }
 
-  if (!defined(invoker.install_target) || invoker.install_target) {
+  if (current_toolchain == default_toolchain &&
+      (!defined(invoker.install_target) || invoker.install_target)) {
     shared_library_target_name = target_name
+
+    content_deps = []
+    if (defined(invoker.content_deps)) {
+      content_deps += invoker.content_deps
+    }
+    if (defined(platform_i18n_config_path)) {
+      content_deps += [ platform_i18n_config_path ]
+    }
+
+    if (separate_install_targets_for_bundling) {
+      bundle_deps = []
+      foreach(content_dep, content_deps) {
+        bundle_deps += [ "${content_dep}_install_content" ]
+      }
+
+      # TODO(b/220024845): Make this much better.
+      action("${shared_library_target_name}_bundle_content") {
+        forward_variables_from(invoker, [ "testonly" ])
+
+        deps = [ ":$shared_library_target_name" ]
+        deps += bundle_deps
+
+        sources = []
+        foreach(bundle_dep, bundle_deps) {
+          # Split the target path and name. E.g. //path/to:target -> [ "//path/to", "target" ].
+          target_path_and_name = string_split(bundle_dep, ":")
+
+          # The content_dep target will place its file under the root gen dir.
+          content_dep_list_file = string_join("/",
+                                              [
+                                                root_gen_dir,
+                                                target_path_and_name[1],
+                                              ])
+          target_path_and_name = []
+
+          sources += [ "${content_dep_list_file}_files.tmp" ]
+        }
+
+        bundle_content_dir = "$sb_install_output_dir/$shared_library_target_name/$sb_install_content_subdir"
+
+        # TODO(b/220024845): We don't have the list of output files.
+        outputs = [ bundle_content_dir ]
+
+        script = "//starboard/build/copy_bundle_content.py"
+        args = [
+          "--output_dir",
+          rebase_path(bundle_content_dir, root_build_dir),
+          "--base_dir",
+          rebase_path(sb_static_contents_output_data_dir, root_build_dir),
+        ]
+        args += rebase_path(sources, root_build_dir)
+      }
+    }
+
     install_target(target_name + "_install") {
       forward_variables_from(invoker, [ "testonly" ])
       installable_target_name = shared_library_target_name
       type = "shared_library"
+      deps = []
       if (defined(invoker.deps)) {
-        deps = invoker.deps
-      } else {
-        deps = []
+        deps += invoker.deps
       }
-      if (defined(invoker.content_deps)) {
-        foreach(content_dep, invoker.content_deps) {
-          deps += [ "${content_dep}_install_content" ]
-        }
+      if (separate_install_targets_for_bundling) {
+        deps += [ ":${shared_library_target_name}_bundle_content" ]
+      }
+      foreach(content_dep, content_deps) {
+        deps += [ "${content_dep}_install_content" ]
       }
     }
   }
diff --git a/starboard/build/config/base_configuration.gni b/starboard/build/config/base_configuration.gni
index a789330..fdf5cf5 100644
--- a/starboard/build/config/base_configuration.gni
+++ b/starboard/build/config/base_configuration.gni
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import("//build/config/clang/clang.gni")
 import("//cobalt/content/fonts/font_configuration.gni")
 import("//starboard/build/config/enable_vr.gni")
 
@@ -97,22 +98,19 @@
   source_set_configs = []
   loadable_module_configs = []
 
-  # Whether or not to build drm test suites.
-  has_drm_support = true
-
   # Enables optimizations on SSE compatible platforms.
   sb_enable_opus_sse = true
 
   # Enables or disables the DIAL server that runs inside Cobalt.
   # Note: Only enable if there's no system-wide DIAL support.
-  in_app_dial = false
+  enable_in_app_dial = false
 
   # Override this value to adjust the default rasterizer setting for your
   # platform.
   default_renderer_options_dependency = "//cobalt/renderer:default_options"
 
   # A symbolizer path for ASAN can be added to allow translation of callstacks.
-  asan_symbolizer_path = ""
+  asan_symbolizer_path = "$clang_base_path/bin/llvm-symbolizer"
 
   # Sub-directory to copy license file to.
   cobalt_licenses_platform = "default"
@@ -130,8 +128,24 @@
   # List of platform-specific targets that get compiled into cobalt.
   cobalt_platform_dependencies = []
 
+  # Some compiler can not compile with raw assembly(.S files) and v8
+  # converts asm to inline assembly for these platforms.
+  cobalt_v8_emit_builtins_as_inline_asm = false
+
+  # Set to true to enable pointer compression for v8.
+  v8_enable_pointer_compression_override = true
+
   # Whether or not to link with thin archives.
   use_thin_archive = true
 
   sb_use_no_rtti = false
+
+  # Set to true to separate install target directories.
+  separate_install_targets_for_bundling = false
+
+  # Enables an NPLB audit of C++17 support.
+  sb_enable_cpp17_audit = true
+
+  # Set to true to use Skia m97.
+  use_skia_next = false
 }
diff --git a/starboard/build/config/install.gni b/starboard/build/config/install.gni
index 5c64ac2..9ef3f3d 100644
--- a/starboard/build/config/install.gni
+++ b/starboard/build/config/install.gni
@@ -13,8 +13,8 @@
 # limitations under the License.
 
 declare_args() {
-  # Top-level directory for staging deploy build output. Platform deploy
-  # actions should use <(target_deploy_dir) defined in deploy.gypi to place
+  # Top-level directory for staging deploy build output. Platform install
+  # actions should use ${sb_install_output_dir} defined in this file to place
   # artifacts for each deploy target in its own subdirectoy.
   sb_install_output_dir = "$root_out_dir/install"
 
@@ -22,6 +22,13 @@
   sb_install_content_subdir = ""
 }
 
+# TODO(b/218889313): `content` is hardcoded on linux/raspi. Override the default
+# content subdir until this is fixed
+platform_split = string_split(target_platform, "-")
+if (platform_split[0] == "raspi") {
+  sb_install_content_subdir = "content"
+}
+
 if (sb_install_content_subdir == "") {
   sb_install_content_subdir = "usr/share/cobalt"
 }
diff --git a/starboard/build/config/sabi/BUILD.gn b/starboard/build/config/sabi/BUILD.gn
index 96b4185..bc43522 100644
--- a/starboard/build/config/sabi/BUILD.gn
+++ b/starboard/build/config/sabi/BUILD.gn
@@ -17,26 +17,12 @@
   sabi_variables = sabi_json.variables
   forward_variables_from(sabi_variables, "*")
 
-  arch_uppercase = exec_script("//starboard/build/gyp_functions.py",
-                               [
-                                 "str_upper",
-                                 target_arch,
-                               ],
-                               "trim string")
+  arch_uppercase =
+      exec_script("uppercase_string.py", [ target_arch ], "trim string")
   calling_convention_uppercase =
-      exec_script("//starboard/build/gyp_functions.py",
-                  [
-                    "str_upper",
-                    calling_convention,
-                  ],
-                  "trim string")
+      exec_script("uppercase_string.py", [ calling_convention ], "trim string")
   floating_point_abi_uppercase =
-      exec_script("//starboard/build/gyp_functions.py",
-                  [
-                    "str_upper",
-                    floating_point_abi,
-                  ],
-                  "trim string")
+      exec_script("uppercase_string.py", [ floating_point_abi ], "trim string")
 
   sabi_id = exec_script("//starboard/sabi/generate_sabi_id.py",
                         [
diff --git a/starboard/build/config/sabi/uppercase_string.py b/starboard/build/config/sabi/uppercase_string.py
new file mode 100644
index 0000000..36e6793
--- /dev/null
+++ b/starboard/build/config/sabi/uppercase_string.py
@@ -0,0 +1,18 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Utility script to convert strings to uppercase."""
+
+import sys
+
+print(' '.join(sys.argv[1:]).upper())
diff --git a/starboard/build/convert_i18n_data.gni b/starboard/build/convert_i18n_data.gni
index 68a1300..66fce8f 100644
--- a/starboard/build/convert_i18n_data.gni
+++ b/starboard/build/convert_i18n_data.gni
@@ -18,6 +18,7 @@
 
 template("convert_i18n_data") {
   action_foreach(target_name) {
+    forward_variables_from(invoker, [ "install_content" ])
     script = "//starboard/build/convert_i18n_data.py"
 
     sources = invoker.xlb_files
diff --git a/starboard/build/convert_i18n_data.gypi b/starboard/build/convert_i18n_data.gypi
deleted file mode 100644
index 5827abc..0000000
--- a/starboard/build/convert_i18n_data.gypi
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is meant to be included into an action to convert a set of XLB files
-# into files of a simpler format (e.g. CSV) in the product directory, e.g.
-# e.g. out/stub_debug/content/data/i18n.
-#
-# To use this, define the variable xlb_files and include this file.
-#  'variables': {
-#    'xlb_files':
-#      '<!(find <(DEPTH)/cobalt/content/i18n/platform/linux/*.xlb)',
-#  },
-#
-# Meaning of the variables:
-#   xlb_files: list of paths to XLB files; directories are not expanded.
-
-{
-  'variables': {
-    'output_dir': '<(sb_static_contents_output_data_dir)/i18n'
-  },
-  'targets': [
-    {
-      'target_name': 'convert_i18n_data',
-      'type': 'none',
-      'actions': [
-        {
-          'action_name': 'convert_i18n_data',
-          'inputs': [
-            '<!@pymod_do_main(starboard.build.convert_i18n_data -o <@(output_dir) --inputs <@(xlb_files))',
-          ],
-          'outputs': [
-            '<!@pymod_do_main(starboard.build.convert_i18n_data -o <@(output_dir) --outputs <@(xlb_files))',
-          ],
-          'action': [
-            'python2',
-            '<(DEPTH)/starboard/build/convert_i18n_data.py',
-            '-o', '<@(output_dir)',
-            '<@(xlb_files)',
-          ],
-        },
-      ],
-      # Makes collect_deploy_content aware of the directory so that all binaries
-      # depending on this target will then transitively include i18n.
-      'all_dependent_settings': {
-        'variables': {
-          'content_deploy_subdirs': [ 'i18n' ]
-        }
-      }
-    },
-  ],
-}
diff --git a/starboard/build/copy_bundle_content.py b/starboard/build/copy_bundle_content.py
new file mode 100644
index 0000000..859dd08
--- /dev/null
+++ b/starboard/build/copy_bundle_content.py
@@ -0,0 +1,87 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# TODO(b/216341587): Refactor install_content to get rid of this file.
+
+# This file is loosely based on starboard/build/copy_data.py
+"""Copies all input files to the output directory.
+
+The folder structure of the input files is maintained in the output relative
+to the 'base_dir' parameter.
+"""
+
+import argparse
+import os
+import shutil
+
+
+class InvalidArgumentException(Exception):
+  pass
+
+
+def copy_files(files_to_copy, base_dir, output_dir):
+  if not os.path.exists(output_dir):
+    os.makedirs(output_dir)
+
+  for path in files_to_copy:
+    # In certain cases, files would fail to open on windows if relative paths
+    # were provided.  Using absolute paths fixes this.
+    filename = os.path.abspath(path)
+
+    # Get the path of the file relative to the source base_dir.
+    rel_path = os.path.relpath(path, base_dir)
+    output_dir = os.path.abspath(output_dir)
+    # Use rel_path to preserve the input folder structure in the output.
+    output_filename = os.path.abspath(os.path.join(output_dir, rel_path))
+
+    # In cases where a directory has turned into a file or vice versa, delete it
+    # before copying it below.
+    if os.path.exists(output_dir) and not os.path.isdir(output_dir):
+      os.remove(output_dir)
+    if os.path.exists(output_filename) and os.path.isdir(output_filename):
+      shutil.rmtree(output_filename)
+
+    if not os.path.exists(os.path.dirname(output_filename)):
+      os.makedirs(os.path.dirname(output_filename))
+
+    if os.path.isfile(filename):
+      shutil.copy(filename, output_filename)
+    else:
+      # TODO(b/211909342): Remove this branch once lottie files are listed.
+      shutil.copytree(filename, output_filename)
+
+
+if __name__ == '__main__':
+  parser = argparse.ArgumentParser()
+  parser.add_argument(
+      '--output_dir', dest='output_dir', required=True, help='output directory')
+  parser.add_argument(
+      '--base_dir',
+      dest='base_dir',
+      required=True,
+      help='source base directory')
+  parser.add_argument(
+      'input_paths',
+      metavar='path',
+      nargs='*',
+      help='path to a file containing the list of files to copy')
+  options = parser.parse_args()
+
+  # Load file names from the files containing the list of file names.
+  file_names = []
+  for input_path in options.input_paths:
+    with open(input_path.strip()) as files_list:
+      file_names.extend([line.strip() for line in files_list])
+
+  copy_files(file_names, options.base_dir, options.output_dir)
diff --git a/starboard/build/copy_install_content.py b/starboard/build/copy_install_content.py
index d63e884..767079b 100644
--- a/starboard/build/copy_install_content.py
+++ b/starboard/build/copy_install_content.py
@@ -33,8 +33,9 @@
 def copy_files(files_to_copy, base_dir, output_dir):
   for path in files_to_copy:
     # All input paths must point at files.
-    if not os.path.isfile(path):
-      raise InvalidArgumentException(path + ' is not a file.')
+    # TODO(b/211909342): Re-enable once lottie test files are listed.
+    # if not os.path.isfile(path):
+    #   raise InvalidArgumentException(path + ' is not a file.')
 
     # Get the path of the file relative to the source base_dir.
     rel_path = os.path.relpath(path, base_dir)
@@ -55,7 +56,11 @@
     if not os.path.exists(output_dir):
       os.makedirs(output_dir)
 
-    shutil.copy(filename, output_filename)
+    if os.path.isfile(filename):
+      shutil.copy(filename, output_filename)
+    else:
+      # TODO(b/211909342): Remove this branch once lottie files are listed.
+      shutil.copytree(filename, output_filename)
 
 
 if __name__ == '__main__':
@@ -68,7 +73,15 @@
       required=True,
       help='source base directory')
   parser.add_argument(
-      'input_paths', metavar='path', nargs='+', help='path to an input file')
+      '--files_list',
+      dest='files_list',
+      required=True,
+      help='path to file containing list of input files')
   options = parser.parse_args()
 
-  copy_files(options.input_paths, options.base_dir, options.output_dir)
+  # Load file names from the file containing the list of file names.
+  # The file name list must be passed in a file to due to command line limits.
+  with open(options.files_list) as input_file:
+    file_names = [line.strip() for line in input_file]
+
+  copy_files(file_names, options.base_dir, options.output_dir)
diff --git a/starboard/build/copy_test_data.gypi b/starboard/build/copy_test_data.gypi
deleted file mode 100644
index 7432f8b..0000000
--- a/starboard/build/copy_test_data.gypi
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is meant to be included into a target to add an action
-# that copies test data files into the DIR_TEST_DATA directory,
-# e.g. out/linux-x64x11_devel/content/data/test/.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'target_name_copy_test_data',
-#   'type': 'none',
-#   'variables': {
-#     'content_test_input_files': [
-#       'path/to/datafile.txt',     # The file will be copied.
-#       'path/to/data/directory',   # The directory and its content will be copied.
-#       'path/to/data/directory/',  # The directory's content will be copied.
-#     ],
-#     'content_test_output_subdir' : 'path/to/output/directory',
-#   },
-#   'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-# },
-#
-# Meaning of the variables:
-#   content_test_input_files: list:
-#       Paths to data files or directories. When an item is a directory,
-#       without the final "/", the directory (along with the content) will be
-#       copied, otherwise only the content will be copied.
-#
-#   content_test_output_subdir: string:
-#       Directory within the test directory that all input files will be
-#       copied to. Generally, this should be the directory of the gypi file
-#       containing the target (e.g. it should be "base" for the target in
-#       base/base.gyp).
-#
-# It's recommended that content_test_input_files and content_test_output_subdir
-# have similar paths, so the directory structure in data/test/ will reflect
-# that in the source folder.
-
-{
-  'actions': [
-    {
-      'action_name': 'copy_test',
-      'inputs': [
-        '<!@pymod_do_main(starboard.build.copy_data --inputs <(content_test_input_files))',
-      ],
-      'outputs': [
-        '<!@pymod_do_main(starboard.build.copy_data -o <(sb_static_contents_output_data_dir)/test/<(content_test_output_subdir) --outputs <(content_test_input_files))',
-      ],
-      'action': [
-        'python2',
-        '<(DEPTH)/starboard/build/copy_data.py',
-        '-o', '<(sb_static_contents_output_data_dir)/test/<(content_test_output_subdir)',
-        '<@(content_test_input_files)',
-      ],
-    },
-  ],
-  'all_dependent_settings': {
-    'variables': {
-      'content_deploy_subdirs': [ 'test/<(content_test_output_subdir)' ]
-    }
-  },
-}
diff --git a/starboard/build/default_no_deploy.gypi b/starboard/build/default_no_deploy.gypi
deleted file mode 100644
index a0b2873..0000000
--- a/starboard/build/default_no_deploy.gypi
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is meant to be included into a target to provide a rule
-# to deploy a target on a target platform.
-#
-# The platform_deploy target should be defined in
-# starboard/<port_path>/platform_deploy.gyp. This target should perform
-# any per-executable logic that is specific to the platform. For example,
-# copying per-executable metadata files to the output directory.
-
-{
-  # This space intentionally left blank.
-}
diff --git a/starboard/build/deploy.gypi b/starboard/build/deploy.gypi
deleted file mode 100644
index 5b72b81..0000000
--- a/starboard/build/deploy.gypi
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is meant to be included into a target to provide a rule
-# to deploy a target on a target platform.
-#
-# A platform's starboard/<port_path>/platform_deploy.gypi should perform any
-# per-executable logic that is specific to the platform. For example, copying
-# per-executable metadata files to the output directory.
-#
-# To use this, create a gyp target with the following form:
-# 'targets': [
-#    {
-#      'target_name': 'target_deploy',
-#      'type': 'none',
-#      'dependencies': [
-#        'target',
-#      ],
-#      'variables': {
-#        'executable_name': 'target',
-#      },
-#      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-#    },
-#    ...
-#
-# For example:
-#  'targets': [
-#    {
-#      'target_name': 'nplb',
-#      'type': '<(gtest_target_type)',
-#      'sources': [...]
-#    }
-#    {
-#      'target_name': 'nplb_deploy',
-#      'type': 'none',
-#      'dependencies': [
-#        'nplb',
-#      ],
-#      'variables': {
-#        'executable_name': 'nplb',
-#      },
-#      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-#    },
-
-{
-
-  'variables' : {
-    # Flag that will instruct gyp to create a special target in IDEs such as
-    # Visual Studio that can be used for launching a target.
-    'ide_deploy_target': 1,
-
-    'variables': {
-        # Directory in which the platform deploy action should stage its results
-        # to to separate them from other targets.
-        'target_deploy_dir%': '<(sb_deploy_output_dir)/<(executable_name)',
-    },
-
-    'target_deploy_dir%': '<(target_deploy_dir)',
-
-    # Stamp file that will be updated after the deploy dir is created/cleaned.
-    'target_deploy_stamp_file': '<(target_deploy_dir).stamp',
-
-    'make_dirs': '<(DEPTH)/starboard/build/make_dirs.py',
-  },
-
-  'actions': [
-    {
-      'action_name': 'clean_deploy_dir',
-      'message': 'Clean deploy dir: <(target_deploy_dir)',
-      'inputs': [
-        '<(make_dirs)',
-      ],
-      'outputs': [
-        '<(target_deploy_stamp_file)',
-      ],
-      'action': [
-        'python2',
-        '<(make_dirs)',
-        '--clean',
-        '--stamp=<(target_deploy_stamp_file)',
-        '<(target_deploy_dir)',
-      ],
-    },
-  ],
-
-  # Include the platform specific gypi file include. Note that the
-  # expanded value will default to
-  # "starboard/build/default_no_deploy.gypi"
-  'includes': [ '<(DEPTH)/<(include_path_platform_deploy_gypi)' ],
-}
diff --git a/starboard/build/echo.py b/starboard/build/echo.py
new file mode 100644
index 0000000..dc7b5f0
--- /dev/null
+++ b/starboard/build/echo.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+#
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""A module that provides platform-agnostic echo functionality with python."""
+
+import sys
+
+print(' '.join(sys.argv[1:]))
diff --git a/starboard/build/gyp b/starboard/build/gyp
deleted file mode 100755
index 8866c17..0000000
--- a/starboard/build/gyp
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/python
-
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Wrapper to generate build files from .gyp files."""
-
-import argparse
-import logging
-import os
-import sys
-import textwrap
-
-import _env  # pylint: disable=unused-import
-from starboard.build.gyp_runner import GypRunner
-from starboard.tools import build
-from starboard.tools import command_line
-from starboard.tools import config
-from starboard.tools import log_level
-from starboard.tools import paths
-from starboard.tools import platform
-
-# Return values used by main().
-RETVAL_SUCCESS = 0
-RETVAL_ERROR = 1
-
-
-def _ListAsString(items):
-  return ', '.join('"%s"' % x for x in items)
-
-
-def _ParseCommandLineArguments(argv):
-  """Parses command line arguments."""
-
-  parser = argparse.ArgumentParser(
-      formatter_class=argparse.RawDescriptionHelpFormatter,
-      description=textwrap.dedent(__doc__))
-
-  default_config, default_platform = build.GetDefaultConfigAndPlatform()
-  parser.add_argument('-c', '--config', dest='build_configs', metavar='CONFIG',
-                      action='append',
-                      choices=config.GetAll(),
-                      default=([default_config] if default_config
-                               else config.GetAll()),
-                      help='Specifies build configurations. Supported '
-                      'configurations are %s. Can be specified multiple '
-                      'times. Creates all configurations if nothing is '
-                      'given.' % _ListAsString(config.GetAll()))
-  parser.add_argument('-p', '--platform', choices=platform.GetAll(),
-                      metavar='platform',
-                      default=default_platform,
-                      required=not default_platform,
-                      help='Target platform. Supported platforms are: %s.' % (
-                          _ListAsString(platform.GetAll())))
-
-  gyp_debug_options = build.GypDebugOptions()
-  parser.add_argument('-d', '--debug', dest='debug', metavar='DEBUGMODE',
-                      action='append', default=[],
-                      choices=gyp_debug_options + ['all'],
-                      help='Turn on a debugging mode for debugging GYP. '
-                      'Supported modes are %s or "all" for all of '
-                      'them.' % _ListAsString(gyp_debug_options))
-
-  parser.add_argument('--check', action='store_true',
-                      help='Check format of gyp files.')
-  parser.add_argument('-v', '--verbose', action='store_true',
-                      help='Enables verbose logging. For more control over the '
-                      "logging level use '--log_level' instead.")
-  parser.add_argument('-a', '--application',
-                      metavar='application',
-                      default='cobalt',
-                      required=False,
-                      help='The application being built, if any.')
-  parser.add_argument('build_file', nargs='?',
-                      default=None,
-                      help='Root GYP build file. Default: starboard_all.gyp')
-
-  command_line.AddLoggingArguments(parser, default='warning')
-
-  return parser.parse_args(argv)
-
-
-def main(argv):
-  options = _ParseCommandLineArguments(argv)
-
-  log_level.InitializeLogging(options)
-
-  if os.environ.get('GYP_DEFINES'):
-    logging.error('GYP_DEFINES environment variable is not supported.')
-    return RETVAL_ERROR
-
-  try:
-    gyp_runner = GypRunner(options)
-  except RuntimeError as e:
-    logging.exception('Failed to construct GypRunner.')
-    return RETVAL_ERROR
-
-  gyp_return = gyp_runner.BuildConfigs()
-  if gyp_return:
-    logging.error('Gyp failed with error code %d.', gyp_return)
-    return gyp_return
-
-  logging.info('Done.')
-  return RETVAL_SUCCESS
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/starboard/build/gyp_functions.py b/starboard/build/gyp_functions.py
deleted file mode 100644
index 4374209..0000000
--- a/starboard/build/gyp_functions.py
+++ /dev/null
@@ -1,184 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Gyp extensions, called with pymod_do_main."""
-import argparse
-import glob
-import logging
-import os
-import stat
-import sys
-
-
-# lifted from standard lib webbrowser.py
-def isexecutable(cmd):
-  """Returns whether the input file is an executable."""
-  if sys.platform[:3] == 'win':
-    extensions = ('.exe', '.bat', '.cmd')
-    cmd = cmd.lower()
-    if cmd.endswith(extensions) and os.path.isfile(cmd):
-      return cmd
-    for ext in extensions:
-      if os.path.isfile(cmd + ext):
-        return cmd + ext
-  else:
-    if os.path.isfile(cmd):
-      mode = os.stat(cmd)[stat.ST_MODE]
-      if mode & (stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH):
-        return cmd
-
-
-class ExtensionCommandParser(argparse.ArgumentParser):
-  """Helper class for parsing arguments to extended gyp functions."""
-
-  def __init__(self, list_args):
-    argparse.ArgumentParser.__init__(self)
-    for arg in list_args:
-      self.add_argument(arg)
-
-  def error(self, message):
-    print('Parse error in gyp_functions.py:' + message)
-    raise NotImplementedError('Parse error:' + message)
-
-
-class Extensions(object):
-  """Container class for extended functionality for gyp.
-
-  Supports operations such as:
-    - file globbing
-    - checking file or directory existence
-    - string manipulations
-    - retrieving environment variables
-    - searching PATH and PYTHONPATH for programs.
-  """
-
-  def __init__(self, argv):
-    parser = argparse.ArgumentParser()
-    all_cmds = [x for x in dir(self) if not x.startswith('_')]
-    parser.add_argument('command', help='Command to run', choices=all_cmds)
-    args = parser.parse_args(argv[0:1])
-    self.argv = argv[1:]
-    self.command = args.command
-
-  def call(self):
-    return getattr(self, self.command)()
-
-  def wrap_windows_path(self):
-    """Fixup a windows-style path by dealing with separators and spaces."""
-    path = os.path.normpath('/'.join(self.argv))
-    ret = path.replace(os.sep, '/')
-    ret = '"' + ret.strip() + '"'
-    return ret
-
-  def file_glob(self):
-    """Glob files in dir, with pattern glob."""
-    args = ExtensionCommandParser(['dir', 'pattern']).parse_args(self.argv)
-    path = os.path.normpath(os.path.join(args.dir, args.pattern))
-    ret = ''
-    for f in glob.iglob(path):
-      ret += f.replace(os.sep, '/') + ' '
-    return ret.strip()
-
-  def basename(self):
-    """Basename of list of files"""
-    parser = ExtensionCommandParser([])
-    parser.add_argument('input_list', nargs='*')
-    args = parser.parse_args(self.argv)
-    ret = [os.path.basename(x) for x in args.input_list]
-    return ' '.join(ret)
-
-  def replace_in_list(self):
-    """String replace in a list of arguments"""
-    parser = ExtensionCommandParser(['old', 'new'])
-    parser.add_argument('input_list', nargs='*')
-    args = parser.parse_args(self.argv)
-    inp = args.input_list
-    return ' '.join([x.replace(args.old, args.new) for x in inp])
-
-  def file_glob_sub(self):
-    """Glob files, but return filenames with string replace from->to applied."""
-    args = ExtensionCommandParser(
-        ['dir', 'pattern', 'from_string', 'to_string']).parse_args(self.argv)
-    path = os.path.normpath(os.path.join(args.dir, args.pattern))
-    ret = ''
-    for f in glob.iglob(path):
-      ret += f.replace(os.sep, '/').replace(args.from_string,
-                                            args.to_string) + ' '
-    return ret.strip()
-
-  def file_exists(self):
-    """Checks if a file exists, returning a string '1' if so, or '0'."""
-    args = ExtensionCommandParser(['file']).parse_args(self.argv)
-    filepath = args.file.replace(os.sep, '/')
-    ret = os.path.isfile(filepath)
-    return str(int(ret))
-
-  def dir_exists(self):
-    """Checks if a directory exists, returning a string 'True' or 'False'."""
-    args = ExtensionCommandParser(['dir']).parse_args(self.argv)
-    return str(os.path.isdir(args.dir))
-
-  def str_upper(self):
-    """Converts an input string to upper case."""
-    if self.argv:
-      args = ExtensionCommandParser(['str']).parse_args(self.argv)
-      return args.str.upper()
-    return ''
-
-  def find_program(self):
-    """Searches for the input program name (.exe, .cmd or .bat)."""
-    args = ExtensionCommandParser(['program']).parse_args(self.argv)
-    paths_to_check = []
-    # Collect all paths in PYTHONPATH.
-    for i in sys.path:
-      paths_to_check.append(i.replace(os.sep, '/'))
-    # Then collect all paths in PATH.
-    for i in os.environ['PATH'].split(os.pathsep):
-      paths_to_check.append(i.replace(os.sep, '/'))
-    # Check all the collected paths for the program.
-    for path in paths_to_check:
-      exe = os.path.join(path, args.program)
-      prog = isexecutable(exe)
-      if prog:
-        return prog.replace(os.sep, '/')
-    # If not in PYTHONPATH and PATH, check upwards until root.
-    # Note: This is a rare case.
-    root_dir = os.path.dirname(os.path.abspath(__file__))
-    previous_dir = os.path.abspath(__file__)
-    while root_dir and root_dir != previous_dir:
-      exe = os.path.join(root_dir, args.program)
-      prog = isexecutable(exe)
-      if prog:
-        return prog.replace(os.sep, '/')
-      previous_dir = root_dir
-      root_dir = os.path.dirname(root_dir)
-    logging.error('Failed to find program "{}".'.format(args.program))
-    return None
-
-  def getenv(self):
-    """Gets the stored value of an environment variable."""
-    args = ExtensionCommandParser(['var']).parse_args(self.argv)
-    value = os.getenv(args.var)
-    if value is not None:
-      return value.strip()
-    return ''
-
-
-def DoMain(argv):  # pylint: disable=invalid-name
-  """Script main function."""
-  return Extensions(argv).call()
-
-
-if __name__ == '__main__':
-  print(DoMain(sys.argv[1:]))
-  sys.exit(0)
diff --git a/starboard/build/gyp_runner.py b/starboard/build/gyp_runner.py
deleted file mode 100644
index 3fa8ff7..0000000
--- a/starboard/build/gyp_runner.py
+++ /dev/null
@@ -1,236 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Wrapper to generate build files from .gyp files."""
-
-import logging
-import os
-import shlex
-import sys
-
-import _env  # pylint: disable=unused-import
-from starboard.tools import build
-from starboard.tools import paths
-from starboard.tools import platform
-
-
-def _Dedupe(sequence):
-  visited = set()
-  return [x for x in sequence if not (x in visited or visited.add(x))]
-
-
-def _GetHostOS():
-  """Returns the name of the hosting OS."""
-  host_os_names = {
-      'linux2': 'linux',
-      'linux3': 'linux',
-      'darwin': 'mac',
-      'win32': 'win',
-  }
-
-  if sys.platform not in host_os_names:
-    if sys.platform == 'cygwin':
-      logging.error('There may be several incompatibilities when trying to '
-                    'build from within cygwin. When using a bash shell is '
-                    'preferred, consider using msysgit instead (see '
-                    'https://msysgit.github.io).')
-    raise RuntimeError('Unsupported platform: %s' % sys.platform)
-
-  return host_os_names[sys.platform]
-
-
-def _AppendIncludes(includes, args):
-  for include in includes:
-    args.append('-I{}'.format(include))
-
-
-def _AppendVariables(variables, args):
-  for var in variables:
-    args.append('-D{}={}'.format(var, variables[var]))
-
-
-def _AppendGeneratorVariables(variables, args):
-  for var in variables:
-    args.append('-G{}={}'.format(var, variables[var]))
-
-
-class GypRunner(object):
-  """Responsible for running GYP."""
-
-  def __init__(self, options):
-    options.build_configs = _Dedupe(options.build_configs)
-    self.options = options
-    self.common_args = []
-    self.platform_configuration = build.GetPlatformConfig(options.platform)
-    if not self.platform_configuration:
-      raise RuntimeError('Unable to load PlatformConfiguration.')
-
-    env_vars = self.platform_configuration.GetEnvironmentVariables()
-    self.app_configuration = (
-        self.platform_configuration.GetApplicationConfiguration(
-            options.application))
-
-    if not self.app_configuration:
-      raise RuntimeError('Unable to load an ApplicationConfiguration.')
-
-    self.platform_configuration.SetupPlatformTools(options.build_number)
-
-    app_env_vars = self.app_configuration.GetEnvironmentVariables()
-    if app_env_vars:
-      env_vars.update(app_env_vars)
-    os.environ.update(env_vars)
-    self._MakeCommonArguments()
-
-  def BuildConfigs(self):
-    """Builds all configs specified in the options."""
-    if not self.options.build_configs:
-      raise RuntimeError('No build config types specified.')
-
-    for config_name in self.options.build_configs:
-      logging.info('Building config: %s', config_name)
-      result = self.BuildConfig(config_name)
-      if result:
-        return result
-    return 0
-
-  def BuildConfig(self, config_name):
-    """Builds the GYP file for a given config."""
-
-    # Make a copy of the common arguments.
-    args = self.common_args[:]
-
-    logging.info('Build Number: %d', self.options.build_number)
-    build_variables = {
-        'BUILD_NUMBER': self.options.build_number,
-    }
-    _AppendVariables(build_variables, args)
-
-    configuration_variables = {
-        # Default deploy script. Certain platforms may choose to change this.
-        'include_path_platform_deploy_gypi':
-            'starboard/build/default_no_deploy.gypi'
-    }
-    configuration_variables.update(
-        self.platform_configuration.GetVariables(config_name))
-    app_variables = self.app_configuration.GetVariables(config_name)
-    if app_variables:
-      configuration_variables.update(app_variables)
-    _AppendVariables(configuration_variables, args)
-
-    # Add the symbolizer path for ASAN to allow translation of callstacks.
-    asan_symbolizer_path = ''
-    if configuration_variables.get('use_asan', 0) == 1:
-      compiler_commandline = shlex.split(os.environ.get('CC', ''))
-      for path in compiler_commandline:
-        if os.path.isfile(path):
-          test_path = os.path.join(os.path.dirname(path), 'llvm-symbolizer')
-          if os.path.isfile(test_path):
-            asan_symbolizer_path = test_path
-            break
-    asan_variables = {
-        'asan_symbolizer_path': asan_symbolizer_path,
-    }
-    _AppendVariables(asan_variables, args)
-
-    # Add config specific generator variables.
-    generator_config = '{}_{}'.format(self.options.platform, config_name)
-
-    generator_variables = {
-        'config': generator_config,
-    }
-    generator_variables.update(
-        self.platform_configuration.GetGeneratorVariables(config_name))
-    app_generator_variables = (
-        self.app_configuration.GetGeneratorVariables(config_name))
-    if app_generator_variables:
-      generator_variables.update(app_generator_variables)
-    _AppendGeneratorVariables(generator_variables, args)
-
-    build_file = self.options.build_file
-    if not build_file:
-      build_file = self.app_configuration.GetDefaultTargetBuildFile()
-
-    if not build_file:
-      build_file = self.platform_configuration.GetDefaultTargetBuildFile()
-
-    if not build_file:
-      raise RuntimeError('Unable to determine target GYP file.')
-
-    # That target build file goes last.
-    args.append(build_file)
-    logging.debug('GYP arguments: %s', args)
-    return build.GetGyp().main(args)
-
-  def _MakeCommonArguments(self):
-    """Makes a list of GYP arguments that are common to all configurations."""
-
-    platform_name = self.platform_configuration.GetName()
-    if not platform.IsValid(platform_name):
-      raise RuntimeError('Invalid platform: %s' % platform_name)
-
-    source_tree_dir = paths.REPOSITORY_ROOT
-    self.common_args = [
-        # Set the build format.
-        '--format={}-{}'.format(self.platform_configuration.GetBuildFormat(),
-                                platform_name),
-
-        # Set the depth argument to the top level directory. This will define
-        # the DEPTH variable which is the relative path between the directory
-        # containing the processed build file and the top level directory.
-        '--depth={}'.format(source_tree_dir),
-
-        # Set the top of the source tree.
-        '--toplevel-dir={}'.format(source_tree_dir),
-    ]
-
-    # Pass through the debug options.
-    for debug in self.options.debug:
-      self.common_args.append('--debug=%s' % debug)
-
-    if self.options.check:
-      self.common_args.append('--check')
-
-    # Append common GYP variables.
-    common_variables = {
-        'OS': 'starboard',
-        'CC_HOST': os.environ.get('CC_HOST', os.environ.get('CC', '')),
-        'host_os': _GetHostOS(),
-        'starboard_path': os.path.relpath(platform.Get(platform_name).path,
-                                          source_tree_dir),
-        'starboard_platform_name': platform_name,
-    }
-
-    _AppendVariables(common_variables, self.common_args)
-
-    # Append generator variables.
-    generator_variables = {
-        # Set the output folder name; affects all generators but MSVS.
-        'output_dir': 'out',
-    }
-    _AppendGeneratorVariables(generator_variables, self.common_args)
-
-    # Append GYPI includes which will be included by GYP before any processed
-    # build file.
-    gyp_includes = [
-        os.path.join(paths.REPOSITORY_ROOT, 'starboard', 'build',
-                     'base_configuration.gypi'),
-
-        # TODO: Remove dependency on common.gypi by moving the required bits
-        # into base_configuration.gypi.
-        os.path.join(paths.REPOSITORY_ROOT, 'build_gyp', 'common.gypi'),
-    ]
-    gyp_includes.extend(self.platform_configuration.GetIncludes())
-    if self.app_configuration:
-      gyp_includes[:0] = self.app_configuration.GetPreIncludes()
-      gyp_includes.extend(self.app_configuration.GetPostIncludes())
-    _AppendIncludes(gyp_includes, self.common_args)
diff --git a/starboard/build/make_dirs.py b/starboard/build/make_dirs.py
index f777c03..6fb268e 100755
--- a/starboard/build/make_dirs.py
+++ b/starboard/build/make_dirs.py
@@ -18,18 +18,19 @@
 import os
 import sys
 
-import _env  # pylint: disable=unused-import, relative-import
 from starboard.tools import port_symlink
 
 
 def main():
   parser = argparse.ArgumentParser(description=__doc__)
   parser.add_argument(
-      '-c', '--clean',
+      '-c',
+      '--clean',
       action='store_true',
       help='Delete the contents of any existing directory.')
   parser.add_argument(
-      '-s', '--stamp_file',
+      '-s',
+      '--stamp_file',
       type=str,
       help='Path to the stamp file to touch after making the directory.')
   parser.add_argument('directory', help='Path to the directory to be created.')
@@ -42,7 +43,7 @@
     os.makedirs(arguments.directory)
 
   if arguments.stamp_file:
-    open(arguments.stamp_file, 'a').close()
+    open(arguments.stamp_file, 'a').close()  # pylint: disable=consider-using-with
 
 
 if __name__ == '__main__':
diff --git a/starboard/build/platform_configuration.py b/starboard/build/platform_configuration.py
index a365436..cbd3273 100644
--- a/starboard/build/platform_configuration.py
+++ b/starboard/build/platform_configuration.py
@@ -18,15 +18,8 @@
 import logging
 import os
 
-import _env  # pylint: disable=unused-import, relative-import
 from starboard.build.application_configuration import ApplicationConfiguration
-from starboard.optional import get_optional_tests
-from starboard.sabi import sabi
-from starboard.tools import cache
-from starboard.tools import environment
-from starboard.tools import paths
-from starboard.tools import platform
-from starboard.tools.config import Config
+import starboard_configuration  # Should be at root of source tree
 
 
 def _GetApplicationConfigurationClass(application_path):
@@ -58,35 +51,11 @@
   Should be derived by platform specific configurations.
   """
 
-  def __init__(self,
-               platform_name,
-               asan_enabled_by_default=False,
-               directory=None):
+  def __init__(self, platform_name):
     self._platform_name = platform_name
-    self._asan_default = 1 if asan_enabled_by_default else 0
-    if directory:
-      self._directory = directory
-    else:
-      self._directory = os.path.realpath(os.path.dirname(__file__))
+    self._directory = os.path.realpath(os.path.dirname(__file__))
     self._application_configuration = None
     self._application_configuration_search_path = [self._directory]
-    # Default build accelerator is ccache.
-    self.build_accelerator = self.GetBuildAccelerator(cache.Accelerator.CCACHE)
-
-  def GetBuildAccelerator(self, accelerator):
-    """Returns the build accelerator name."""
-    build_accelerator = cache.Cache(accelerator)
-    name = build_accelerator.GetName()
-    if build_accelerator.Use():
-      logging.info('Using %s build accelerator.', name)
-      return name
-    else:
-      logging.info('Not using %s build accelerator.', name)
-      return ''
-
-  def GetBuildFormat(self):
-    """Returns the desired build format."""
-    return 'ninja'
 
   def GetName(self):
     """Returns the platform name."""
@@ -143,7 +112,8 @@
           break
 
       if not configuration_class:
-        configuration_class = environment.GetApplicationClass(application_name)
+        configuration_class = starboard_configuration.APPLICATIONS.get(
+            application_name)
         if configuration_class:
           logging.info('Using default ApplicationConfiguration for %s.',
                        application_name)
@@ -158,167 +128,6 @@
     assert self._application_configuration
     return self._application_configuration
 
-  def SetupPlatformTools(self, build_number):
-    """Install tools, SDKs, etc.
-
-    needed to build for the platform.
-
-    Installs tools needed to build for this platform, possibly downloading
-    and/or interacting with the user to do so. Raises a RuntimeError if the
-    tools can't be installed or something is wrong that will prevent building.
-
-    Args:
-      build_number: The number identifying this build, generated at GYP time.
-    """
-    pass
-
-  def GetIncludes(self):
-    """Get a list of absolute paths to gypi files to include in order.
-
-    These files will be included by GYP before any processed .gyp file. The
-    application may add more gypi files to be processed before or after the
-    files specified by this function.
-
-    Returns:
-      An ordered list containing absolute paths to .gypi files.
-    """
-    platform_info = platform.Get(self.GetName())
-    if not platform_info:
-      return []
-
-    return [os.path.join(platform_info.path, 'gyp_configuration.gypi')]
-
-  def GetEnvironmentVariables(self):
-    """Get a Mapping of environment variable overrides.
-
-    The environment variables returned by this function are set before calling
-    GYP and can be used to manipulate the GYP behavior. They will override any
-    environment variables of the same name in the calling environment, or any
-    that are set by default. They may be overridden further by the application
-    configuration.
-
-    Returns:
-      A dictionary containing environment variables.
-    """
-    return {}
-
-  def GetVariables(self, config_name, use_clang=0):
-    """Get a Mapping of GYP variable overrides.
-
-    Get a Mapping of GYP variable names to values. Any defined values will
-    override any values defined by default, but can themselves by overridden by
-    the application configuration. GYP files can then have conditionals that
-    check the values of these variables.
-
-    Args:
-      config_name: The name of the starboard.tools.config build type.
-      use_clang: Whether the toolchain is a flavor of Clang.
-
-    Raises:
-      RuntimeError: When given conflicting configuration input.
-
-    Returns:
-      A Mapping of GYP variables to be merged into the global Mapping provided
-      to GYP.
-    """
-    use_asan = 0
-    use_tsan = 0
-    use_source_code_coverage = 0
-
-    if use_clang:
-      # Enable source coverage instrumentation if USE_SOURCE_CODE_COVERAGE
-      # was set to 1 in the environment.
-      use_source_code_coverage = int(
-          os.environ.get('USE_SOURCE_CODE_COVERAGE', 0))
-
-      # Enable TSAN if USE_TSAN was set to 1 in the environment, unless
-      # use_source_code_coverage is set.
-      use_tsan = int(os.environ.get('USE_TSAN',
-                                    0)) if not use_source_code_coverage else 0
-
-      # Enable ASAN by default for debug and devel builds only if neither
-      # use_tsan nor use_source_code_coverage is set.
-      use_asan_default = self._asan_default if (
-          not use_tsan and not use_source_code_coverage and
-          config_name in (Config.DEBUG, Config.DEVEL)) else 0
-      use_asan = int(os.environ.get('USE_ASAN', use_asan_default))
-    if use_asan == 1 and use_tsan == 1:
-      raise RuntimeError('ASAN and TSAN are mutually exclusive')
-
-    if use_source_code_coverage:
-      logging.info('Using Source-Based Code Coverage')
-
-    if use_asan:
-      logging.info('Using Address Sanitizer')
-
-    if use_tsan:
-      logging.info('Using Thread Sanitizer')
-
-    variables = {
-        'clang':
-            use_clang,
-
-        # Whether to build with clang's Source Based Code Coverage
-        # instrumentation.
-        # See https://clang.llvm.org/docs/SourceBasedCodeCoverage.html
-        'use_source_code_coverage':
-            use_source_code_coverage,
-
-        # Whether to build with clang's Address Sanitizer instrumentation.
-        'use_asan':
-            use_asan,
-        # Whether to build with clang's Thread Sanitizer instrumentation.
-        'use_tsan':
-            use_tsan,
-
-        # If the path to the Starboard ABI file is able to be formatted, it will
-        # be using the experimental Starboard API version of the file, i.e.
-        # |sabi.SB_API_VERSION|. Otherwise, the value provided is just assumed
-        # to be a complete path to a Starboard ABI file.
-        'sabi_json_path':
-            self.GetPathToSabiJsonFile().format(
-                sb_api_version=sabi.SB_API_VERSION),
-
-        # TODO: Remove these compatibility variables.
-        'cobalt_config':
-            config_name,
-        'cobalt_fastbuild':
-            0,
-        'enable_vr':
-            0,
-    }
-    return variables
-
-  def GetGeneratorVariables(self, config_name):
-    """Get a Mapping of generator variable overrides.
-
-    Args:
-      config_name: The name of the starboard.tools.config build type.
-
-    Returns:
-      A Mapping of generator variable names and values.
-    """
-    del config_name
-    return {}
-
-  def GetToolchain(self):
-    """Returns the instance of the toolchain implementation class."""
-    return None
-
-  def GetTargetToolchain(self, **kwargs):
-    """Returns a list of target tools."""
-    # TODO: If this method throws |NotImplementedError|, GYP will fall back to
-    #       the legacy toolchain. Once all platforms are migrated to the
-    #       abstract toolchain, this method should be made |@abstractmethod|.
-    raise NotImplementedError()
-
-  def GetHostToolchain(self, **kwargs):
-    """Returns a list of host tools."""
-    # TODO: If this method throws |NotImplementedError|, GYP will fall back to
-    #       the legacy toolchain. Once all platforms are migrated to the
-    #       abstract toolchain, this method should be made |@abstractmethod|.
-    raise NotImplementedError()
-
   def GetLauncherPath(self):
     """Gets the path to the launcher module for this platform."""
     return self.GetDirectory()
@@ -338,14 +147,6 @@
     """Gets a dict of environment variables needed by unit test binaries."""
     return {}
 
-  def GetTestFilters(self):
-    """Gets all tests to be excluded from a unit test run.
-
-    Returns:
-      A list of initialized starboard.tools.testing.TestFilter objects.
-    """
-    return []
-
   def GetDeployPathPatterns(self):
     """Gets deployment paths patterns for files to be included for deployment.
 
@@ -358,29 +159,13 @@
     """
     raise NotImplementedError()
 
-  def GetPathToSabiJsonFile(self):
-    """Gets the path to the JSON file with Starboard ABI information for the
-       build.
-
-    Examples:
-        'starboard/sabi/arm64/sabi-v12.json'
-        'starboard/sabi/arm64/sabi-v{sb_api_version}.json'
-
-    Returns:
-      A string path to the appropriate Starboard ABI JSON file. This path can
-      either be a complete path, or be capable of being formatted with an
-      integer representing the desired Starboard API version. This file is
-      required for a variety of definitions and variables pertaining to the ABI.
-    """
-    return 'starboard/sabi/default/sabi.json'
-
   def GetTestTargets(self):
     """Gets all tests to be run in a unit test run.
 
     Returns:
       A list of strings of test target names.
     """
-    tests = [
+    return [
         'app_key_files_test',
         'app_key_test',
         'drain_file_test',
@@ -391,9 +176,3 @@
         'slot_management_test',
         'starboard_platform_tests',
     ]
-    tests.extend(get_optional_tests.GetOptionalTestTargets())
-    return tests
-
-  def GetDefaultTargetBuildFile(self):
-    """Gets the build file to build by default."""
-    return os.path.join(paths.STARBOARD_ROOT, 'starboard_all.gyp')
diff --git a/starboard/build/platform_path.gni b/starboard/build/platform_path.gni
new file mode 100644
index 0000000..c7ea413
--- /dev/null
+++ b/starboard/build/platform_path.gni
@@ -0,0 +1,30 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+declare_args() {
+  starboard_path = ""
+}
+
+if (starboard_path == "") {
+  declare_args() {
+    target_platform = "stub"
+  }
+
+  starboard_path = exec_script("//starboard/build/platforms.py",
+                               [ target_platform ],
+                               "trim string")
+}
+
+assert(defined(starboard_path),
+       "Please add your platform to starboard/build/platforms.py")
diff --git a/starboard/build/platforms.py b/starboard/build/platforms.py
index d090c56..2abbaf4 100644
--- a/starboard/build/platforms.py
+++ b/starboard/build/platforms.py
@@ -18,12 +18,18 @@
 
 import sys
 
+try:
+  from starboard.build.internal.internal_platforms import INTERNAL_PLATFORMS
+except ImportError:
+  INTERNAL_PLATFORMS = {}
+
 PLATFORMS = {
     'stub': 'starboard/stub',
     'linux-x64x11': 'starboard/linux/x64x11',
     'linux-x64x11-egl': 'starboard/linux/x64x11/egl',
+    'linux-x64x11-gcc-6-3': 'starboard/linux/x64x11/gcc/6.3',
     'linux-x64x11-skia': 'starboard/linux/x64x11/skia',
-    'linux-x64x11-clang-crosstool': 'starboard/linux/x64x11/clang/crosstool',
+    'linux-x64x11-clang-3-9': 'starboard/linux/x64x11/clang/3.9',
     'android-arm': 'starboard/android/arm',
     'android-arm64': 'starboard/android/arm64',
     'android-arm64-vulkan': 'starboard/android/arm64/vulkan',
@@ -31,9 +37,12 @@
     'raspi-2': 'starboard/raspi/2',
     'raspi-2-skia': 'starboard/raspi/2/skia',
     'evergreen-x64': 'starboard/evergreen/x64',
+    'evergreen-x86': 'starboard/evergreen/x86',
     'evergreen-arm-hardfp': 'starboard/evergreen/arm/hardfp',
     'evergreen-arm-softfp': 'starboard/evergreen/arm/softfp',
+    'evergreen-arm64': 'starboard/evergreen/arm64',
 }
+PLATFORMS.update(INTERNAL_PLATFORMS)
 
 if __name__ == '__main__':
   if len(sys.argv) != 2:
diff --git a/starboard/build/run_bash.py b/starboard/build/run_bash.py
index e734063..a548413 100644
--- a/starboard/build/run_bash.py
+++ b/starboard/build/run_bash.py
@@ -25,10 +25,11 @@
 import sys
 
 if __name__ == '__main__':
-  logging_format = '[%(levelname)s:%(filename)s:%(lineno)s] %(message)s'
-  logging.basicConfig(
-      level=logging.INFO, format=logging_format, datefmt='%H:%M:%S')
-  logging.warning('Calling a bash process during GN build. '
-                  'Avoid doing this whenever possible.')
-
+  if sys.argv[1] == 'python2':
+    logging_format = '[%(levelname)s:%(filename)s:%(lineno)s] %(message)s'
+    logging.basicConfig(
+        level=logging.INFO, format=logging_format, datefmt='%H:%M:%S')
+    logging.warning('Calling a bash process that just invokes python2 during '
+                    'GN build. Please avoid doing this whenever possible and '
+                    'see b/219602840 for more context.')
   sys.exit(subprocess.call(sys.argv[1:]))
diff --git a/starboard/build/toolchain/_env.py b/starboard/build/toolchain/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/starboard/build/toolchain/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/build/toolchain/get_clang_base_path.py b/starboard/build/toolchain/get_clang_base_path.py
index 66b98ec..092ba5d 100755
--- a/starboard/build/toolchain/get_clang_base_path.py
+++ b/starboard/build/toolchain/get_clang_base_path.py
@@ -17,13 +17,12 @@
 If Clang is not present, it will be downloaded.
 """
 
-import _env  # pylint: disable=unused-import
 from starboard.build import clang
 from starboard.tools import build
 
 
 def main():
-  print build.EnsureClangAvailable(clang.GetClangSpecification())
+  print(build.EnsureClangAvailable(clang.GetClangSpecification()))
 
 
 if __name__ == '__main__':
diff --git a/starboard/build/touch.py b/starboard/build/touch.py
deleted file mode 100644
index 787e6a4..0000000
--- a/starboard/build/touch.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Allows to use POSIX touch as a stamp tool."""
-
-import os
-import sys
-
-"""Cross-platform touch."""
-
-for fname in sys.argv[1:]:
-  if os.path.exists(fname):
-    os.utime(fname, None)
-  else:
-    open(fname, 'w').close()
diff --git a/starboard/client_porting/cwrappers/BUILD.gn b/starboard/client_porting/cwrappers/BUILD.gn
index 4594e64..b73f43b 100644
--- a/starboard/client_porting/cwrappers/BUILD.gn
+++ b/starboard/client_porting/cwrappers/BUILD.gn
@@ -29,5 +29,4 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/starboard/client_porting/cwrappers/cwrappers.gyp b/starboard/client_porting/cwrappers/cwrappers.gyp
deleted file mode 100644
index 793b501..0000000
--- a/starboard/client_porting/cwrappers/cwrappers.gyp
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'cwrappers',
-      'type': 'static_library',
-      'sources': [
-        'pow_wrapper.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-      ],
-    },
-  ],
-}
diff --git a/starboard/client_porting/cwrappers/cwrappers_test.gyp b/starboard/client_porting/cwrappers/cwrappers_test.gyp
deleted file mode 100644
index 5dad02f..0000000
--- a/starboard/client_porting/cwrappers/cwrappers_test.gyp
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'cwrappers_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'pow_wrapper_test.cc',
-        '<(DEPTH)/starboard/common/test_main.cc',
-      ],
-      'dependencies': [
-         '<(DEPTH)/starboard/client_porting/cwrappers/cwrappers.gyp:cwrappers',
-         '<(DEPTH)/testing/gmock.gyp:gmock',
-         '<(DEPTH)/testing/gtest.gyp:gtest',
-         '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'cwrappers_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'cwrappers_test',
-      ],
-      'variables': {
-        'executable_name': 'cwrappers_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/client_porting/eztime/eztime.gyp b/starboard/client_porting/eztime/eztime.gyp
deleted file mode 100644
index 65f686e..0000000
--- a/starboard/client_porting/eztime/eztime.gyp
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'eztime',
-      'type': 'static_library',
-      'sources': [
-        'eztime.cc',
-        'eztime.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-        '<(DEPTH)/starboard/client_porting/icu_init/icu_init.gyp:icu_init',
-        '<(DEPTH)/third_party/icu/icu.gyp:icui18n',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-      ],
-    },
-  ],
-}
diff --git a/starboard/client_porting/eztime/eztime_test.gyp b/starboard/client_porting/eztime/eztime_test.gyp
deleted file mode 100644
index 852754c..0000000
--- a/starboard/client_porting/eztime/eztime_test.gyp
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'eztime_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        '<(DEPTH)/starboard/common/test_main.cc',
-        'test_constants.h',
-        'eztime_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/client_porting/eztime/eztime.gyp:eztime',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'eztime_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'eztime_test',
-      ],
-      'variables': {
-        'executable_name': 'eztime_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/client_porting/icu_init/icu_init.gyp b/starboard/client_porting/icu_init/icu_init.gyp
deleted file mode 100644
index 1976e5e..0000000
--- a/starboard/client_porting/icu_init/icu_init.gyp
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'icu_init',
-      'type': 'static_library',
-      'sources': [
-        'icu_init.cc',
-        'icu_init.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-        '<(DEPTH)/third_party/icu/icu.gyp:icui18n',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-      ],
-    },
-  ],
-}
diff --git a/starboard/client_porting/poem/BUILD.gn b/starboard/client_porting/poem/BUILD.gn
index a95274d..eb23fef 100644
--- a/starboard/client_porting/poem/BUILD.gn
+++ b/starboard/client_porting/poem/BUILD.gn
@@ -25,6 +25,4 @@
     "//starboard",
     "//testing/gtest",
   ]
-
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/starboard/client_porting/poem/poem.gyp b/starboard/client_porting/poem/poem.gyp
deleted file mode 100644
index 3859a65..0000000
--- a/starboard/client_porting/poem/poem.gyp
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'poem_unittests',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'include_all.c',
-        'main.cc',
-        'string_poem_test.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'poem_unittests_deploy',
-      'type': 'none',
-      'dependencies': [
-        'poem_unittests',
-      ],
-      'variables': {
-        'executable_name': 'poem_unittests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/common/BUILD.gn b/starboard/common/BUILD.gn
index ab4f53d..439c12b 100644
--- a/starboard/common/BUILD.gn
+++ b/starboard/common/BUILD.gn
@@ -96,5 +96,4 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/starboard/common/common.gyp b/starboard/common/common.gyp
deleted file mode 100644
index 33bdb6f..0000000
--- a/starboard/common/common.gyp
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# The "common" target contains facilities provided by Starboard that are common
-# to all platforms.
-
-{
-  'targets': [
-    {
-      'target_name': 'common',
-      'type': 'static_library',
-      'variables': {
-        'includes_starboard': 1,
-      },
-      'sources': [
-        'byte_swap.h',
-        'common.cc',
-        'condition_variable.cc',
-        'condition_variable.h',
-        'configuration_defaults.cc',
-        'configuration_defaults.h',
-        'file.cc',
-        'file.h',
-        'flat_map.h',
-        'locked_ptr.h',
-        'log.cc',
-        'log.h',
-        'media.cc',
-        'media.h',
-        'move.h',
-        'murmurhash2.cc',
-        'murmurhash2.h',
-        'mutex.cc',
-        'mutex.h',
-        'new.cc',
-        'optional.cc',
-        'optional.h',
-        'queue.h',
-        'recursive_mutex.cc',
-        'recursive_mutex.h',
-        'ref_counted.cc',
-        'ref_counted.h',
-        'reset_and_return.h',
-        'rwlock.cc',
-        'rwlock.h',
-        'scoped_ptr.h',
-        'semaphore.cc',
-        'semaphore.h',
-        'socket.cc',
-        'socket.h',
-        'spin_lock.cc',
-        'spin_lock.h',
-        'state_machine.cc',
-        'state_machine.h',
-        'storage.cc',
-        'storage.h',
-        'string.h',
-        'thread_collision_warner.cc',
-        'thread_collision_warner.h',
-        'thread.cc',
-        'thread.h',
-
-        'experimental/concurrency_debug.cc',
-        'experimental/concurrency_debug.h',
-
-        '<(DEPTH)/starboard/shared/media_session/playback_state.cc',
-        '<(DEPTH)/starboard/shared/media_session/playback_state.h',
-      ],
-    },
-  ],
-}
diff --git a/starboard/common/common_test.gyp b/starboard/common/common_test.gyp
deleted file mode 100644
index 06d9b47..0000000
--- a/starboard/common/common_test.gyp
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'common_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'memory_test.cc',
-        'socket_test.cc',
-        '<(DEPTH)/starboard/common/test_main.cc',
-      ],
-      'dependencies': [
-         '<(DEPTH)/starboard/common/common.gyp:common',
-         '<(DEPTH)/starboard/starboard.gyp:starboard',
-         '<(DEPTH)/testing/gmock.gyp:gmock',
-         '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'common_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'common_test',
-      ],
-      'variables': {
-        'executable_name': 'common_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/common/condition_variable.cc b/starboard/common/condition_variable.cc
index 97b6ac9..4d9f8ea 100644
--- a/starboard/common/condition_variable.cc
+++ b/starboard/common/condition_variable.cc
@@ -14,8 +14,6 @@
 
 #include "starboard/common/condition_variable.h"
 
-#include "starboard/thread_types.h"
-
 namespace starboard {
 
 ConditionVariable::ConditionVariable(const Mutex& mutex)
diff --git a/starboard/common/file.cc b/starboard/common/file.cc
index c12b398..ea2955a 100644
--- a/starboard/common/file.cc
+++ b/starboard/common/file.cc
@@ -55,31 +55,16 @@
 
   SbFileInfo info;
 
-#if SB_API_VERSION >= 12
   std::vector<char> entry(kSbFileMaxName);
 
   while (SbDirectoryGetNext(dir, entry.data(), kSbFileMaxName)) {
-    if (!strcmp(entry.data(), ".") ||
-        !strcmp(entry.data(), "..")) {
+    if (!strcmp(entry.data(), ".") || !strcmp(entry.data(), "..")) {
       continue;
     }
 
     std::string abspath(path);
     abspath.append(kSbFileSepString);
     abspath.append(entry.data());
-#else
-  SbDirectoryEntry entry;
-
-  while (SbDirectoryGetNext(dir, &entry)) {
-    if (!strcmp(entry.name, ".") ||
-        !strcmp(entry.name, "..")) {
-      continue;
-    }
-
-    std::string abspath(path);
-    abspath.append(kSbFileSepString);
-    abspath.append(entry.name);
-#endif
 
     if (!SbFileDeleteRecursive(abspath.data(), false)) {
       DirectoryCloseLogFailure(path, dir);
diff --git a/starboard/common/log.cc b/starboard/common/log.cc
index c0e4307..02cf3ad 100644
--- a/starboard/common/log.cc
+++ b/starboard/common/log.cc
@@ -167,9 +167,10 @@
   if (last_slash_pos != std::string::npos) {
     filename.erase(0, last_slash_pos + 1);
   }
-
+  char name[128] = {0};
+  SbThreadGetName(name, SB_ARRAY_SIZE_INT(name));
   stream_ << '[';
-  stream_ << SbThreadGetId() << ':';
+  stream_ << name << '/' << SbThreadGetId() << ':';
   EzTimeValue time_value;
   EzTimeValueGetNow(&time_value, NULL);
   EzTimeT t = time_value.tv_sec;
diff --git a/starboard/common/log.h b/starboard/common/log.h
index 9438a17..48f7596 100644
--- a/starboard/common/log.h
+++ b/starboard/common/log.h
@@ -157,7 +157,7 @@
 #endif  // SB_LOGGING_IS_OFFICIAL_BUILD
 
 #if SB_LOGGING_IS_OFFICIAL_BUILD || \
-    (defined(NDEBUG) && !defined(__LB_SHELL__FORCE_LOGGING__))
+    (defined(NDEBUG) && !defined(COBALT_LOGGING_ENABLED))
 #define SB_DLOG_IS_ON(severity) false
 #define SB_DLOG_IF(severity, condition) SB_EAT_STREAM_PARAMETERS
 #else
diff --git a/starboard/common/media.cc b/starboard/common/media.cc
index dbd1782..fe378da 100644
--- a/starboard/common/media.cc
+++ b/starboard/common/media.cc
@@ -28,7 +28,6 @@
       return "none";
     case kSbMediaAudioCodecAac:
       return "aac";
-#if SB_API_VERSION >= 12 || SB_HAS(AC3_AUDIO)
     case kSbMediaAudioCodecAc3:
       if (!kSbHasAc3Audio) {
         SB_NOTREACHED() << "AC3 audio is not enabled on this platform. To "
@@ -43,8 +42,6 @@
         return "invalid";
       }
       return "ec3";
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(AC3_AUDIO)
     case kSbMediaAudioCodecOpus:
       return "opus";
     case kSbMediaAudioCodecVorbis:
@@ -267,19 +264,21 @@
   if (sample_info.codec == kSbMediaVideoCodecNone) {
     return os;
   }
+
   os << "codec: " << GetMediaVideoCodecName(sample_info.codec) << ", ";
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   os << "mime: " << (sample_info.mime ? sample_info.mime : "<null>")
      << ", max video capabilities: "
      << (sample_info.max_video_capabilities ? sample_info.max_video_capabilities
                                             : "<null>")
      << ", ";
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+
   if (sample_info.is_key_frame) {
     os << "key frame, ";
   }
+
   os << sample_info.frame_width << 'x' << sample_info.frame_height << ' ';
   os << '(' << sample_info.color_metadata << ')';
+
   return os;
 }
 
@@ -291,10 +290,9 @@
   if (sample_info.codec == kSbMediaAudioCodecNone) {
     return os;
   }
+
   os << "codec: " << GetMediaAudioCodecName(sample_info.codec) << ", ";
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   os << "mime: " << (sample_info.mime ? sample_info.mime : "<null>");
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   os << "channels: " << sample_info.number_of_channels
      << ", sample rate: " << sample_info.samples_per_second
      << ", config: " << sample_info.audio_specific_config_size << " bytes, "
@@ -305,5 +303,6 @@
                      16),
             " ")
      << (sample_info.audio_specific_config_size > 16 ? " ...]" : " ]");
+
   return os;
 }
diff --git a/starboard/common/mutex.h b/starboard/common/mutex.h
index 6012c55..af6bd2e 100644
--- a/starboard/common/mutex.h
+++ b/starboard/common/mutex.h
@@ -19,7 +19,6 @@
 #define STARBOARD_COMMON_MUTEX_H_
 
 #include "starboard/mutex.h"
-#include "starboard/thread_types.h"
 
 namespace starboard {
 
diff --git a/starboard/condition_variable.h b/starboard/condition_variable.h
index fc4c9c8..dea9897 100644
--- a/starboard/condition_variable.h
+++ b/starboard/condition_variable.h
@@ -21,7 +21,6 @@
 
 #include "starboard/export.h"
 #include "starboard/mutex.h"
-#include "starboard/thread_types.h"
 #include "starboard/time.h"
 #include "starboard/types.h"
 
@@ -29,8 +28,6 @@
 extern "C" {
 #endif
 
-#if SB_API_VERSION >= 12
-
 // Max size of the SbConditionVariable type.
 #define SB_CONDITION_VARIABLE_MAX_SIZE 80
 
@@ -54,8 +51,6 @@
   { 0 }
 #endif
 
-#endif  // SB_API_VERSION >= 12
-
 // Enumeration of possible results from waiting on a condvar.
 typedef enum SbConditionVariableResult {
   // The wait completed because the condition variable was signaled.
diff --git a/starboard/configuration.h b/starboard/configuration.h
index 5eea69c..4d0095a 100644
--- a/starboard/configuration.h
+++ b/starboard/configuration.h
@@ -35,7 +35,7 @@
 
 // The minimum API version allowed by this version of the Starboard headers,
 // inclusive.
-#define SB_MINIMUM_API_VERSION 11
+#define SB_MINIMUM_API_VERSION 12
 
 // The maximum API version allowed by this version of the Starboard headers,
 // inclusive.
@@ -65,6 +65,16 @@
 //   //   exposes functionality for my new feature.
 //   #define SB_MY_EXPERIMENTAL_FEATURE_VERSION SB_EXPERIMENTAL_API_VERSION
 
+// Introduce a new format kSbDecodeTargetFormat3Plane10BitYUVI420Compact.
+//   A decoder target format consisting of 10bit Y, U, and V planes.
+#define SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION \
+  SB_EXPERIMENTAL_API_VERSION
+
+#define SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED \
+  SB_EXPERIMENTAL_API_VERSION
+
+#define SB_SYSTEM_DEVICE_PROJECTOR_ADDED SB_EXPERIMENTAL_API_VERSION
+
 // --- Release Candidate Feature Defines -------------------------------------
 
 // --- Common Detected Features ----------------------------------------------
@@ -163,19 +173,11 @@
 
 // --- Platform Configuration ------------------------------------------------
 
-// Include the platform-specific configuration. This macro is set by GYP in
-// starboard_base_target.gypi and passed in on the command line for all targets
-// and all configurations.
+// Include the platform-specific configuration. This macro is set by GN in
+// starboard/build/config/BUILD.gn and passed in on the command line for all
+// targets and all configurations.
 #include STARBOARD_CONFIGURATION_INCLUDE
 
-#if SB_API_VERSION < 12
-// After version 12, we start to use runtime constants
-// instead of macros for certain platform dependent configurations. This file
-// substitutes configuration macros for the corresponding runtime constants so
-// we don't reference these constants when they aren't defined.
-#include "starboard/shared/starboard/configuration_constants_compatibility_defines.h"
-#endif  // SB_API_VERSION < 12
-
 // --- Overridable Helper Macros ---------------------------------------------
 
 // The following macros can be overridden in STARBOARD_CONFIGURATION_INCLUDE
@@ -375,50 +377,11 @@
 #error "Your platform must be exactly one of { 32-bit, 64-bit }."
 #endif
 
-#if SB_API_VERSION >= 12
-
 #if !SB_IS(BIG_ENDIAN) && !SB_IS(LITTLE_ENDIAN) || \
     (SB_IS(BIG_ENDIAN) == SB_IS(LITTLE_ENDIAN))
 #error "Your platform's endianness must be defined as big or little."
 #endif
 
-#else  // SB_API_VERSION < 12
-
-#if SB_IS(ARCH_X86) && SB_IS(64_BIT)
-#undef SB_IS_ARCH_X86
-#define SB_IS_ARCH_X64 1
-#endif  // SB_IS(ARCH_X86) && SB_IS(64_BIT)
-
-#if SB_IS(ARCH_ARM) && SB_IS(64_BIT)
-#undef SB_IS_ARCH_ARM
-#define SB_IS_ARCH_ARM64 1
-#endif  // SB_IS(ARCH_ARM) && SB_IS(64_BIT)
-
-#if SB_HAS(32_BIT_LONG)
-#define SB_SIZE_OF_LONG 4
-#elif SB_HAS(64_BIT_LONG)
-#define SB_SIZE_OF_LONG 8
-#endif  // SB_HAS(32_BIT_LONG)
-
-#if SB_HAS(32_BIT_POINTERS)
-#define SB_SIZE_OF_POINTER 4
-#elif SB_HAS(64_BIT_POINTERS)
-#define SB_SIZE_OF_POINTER 8
-#endif  // SB_HAS(32_BIT_POINTER)
-
-SB_COMPILE_ASSERT(sizeof(long) == SB_SIZE_OF_LONG,  // NOLINT(runtime/int)
-                  SB_SIZE_OF_LONG_is_inconsistent_with_sizeof_long);
-
-#if !defined(SB_IS_BIG_ENDIAN)
-#error "Your platform must define SB_IS_BIG_ENDIAN."
-#endif
-
-#if defined(SB_IS_LITTLE_ENDIAN)
-#error "SB_IS_LITTLE_ENDIAN is set based on SB_IS_BIG_ENDIAN."
-#endif
-
-#endif  // SB_API_VERSION >= 12
-
 #if (SB_SIZE_OF(POINTER) != 4) && (SB_SIZE_OF(POINTER) != 8)
 #error "Your platform's pointer sizes must be either 32 bit or 64 bit."
 #endif
@@ -473,8 +436,6 @@
 
 #endif  // !SB_HAS(STD_UNORDERED_HASH)
 
-#if SB_API_VERSION >= 12
-
 #if defined(SB_DEFAULT_MMAP_THRESHOLD)
 #error \
     "SB_DEFAULT_MMAP_THRESHOLD should not be defined in Starboard " \
@@ -664,94 +625,6 @@
 "starboard/<PLATFORM_PATH>/configuration_constants.cc."
 #endif
 
-#else  // SB_API_VERSION >= 12
-
-#if !defined(SB_FILE_MAX_NAME) || SB_FILE_MAX_NAME < 2
-#error "Your platform must define SB_FILE_MAX_NAME > 1."
-#endif
-
-#if !defined(SB_FILE_MAX_PATH) || SB_FILE_MAX_PATH < 2
-#error "Your platform must define SB_FILE_MAX_PATH > 1."
-#endif
-
-#if !defined(SB_HAS_AC3_AUDIO)
-#define SB_HAS_AC3_AUDIO 1
-#elif !SB_HAS(AC3_AUDIO)
-#error "SB_HAS_AC3_AUDIO is required in this API version."
-#endif
-
-#if SB_API_VERSION >= 12
-#if defined(SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING)
-#error "SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING has been deprecated."
-#endif  // defined(SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING)
-#endif
-
-#if !defined(SB_HAS_THREAD_PRIORITY_SUPPORT)
-#error "Your platform must define SB_HAS_THREAD_PRIORITY_SUPPORT."
-#endif
-
-#if !defined(SB_MAX_THREADS)
-#error "Your platform must define SB_MAX_THREADS."
-#endif
-
-#if !defined(SB_MAX_THREAD_LOCAL_KEYS)
-#error "Your platform must define SB_MAX_THREAD_LOCAL_KEYS."
-#endif
-
-#if !defined(SB_FILE_ALT_SEP_CHAR)
-#error "Your platform must define SB_FILE_ALT_SEP_CHAR."
-#endif
-
-#if !defined(SB_FILE_ALT_SEP_STRING)
-#error "Your platform must define SB_FILE_ALT_SEP_STRING."
-#endif
-
-#if !defined(SB_FILE_SEP_CHAR)
-#error "Your platform must define SB_FILE_SEP_CHAR."
-#endif
-
-#if !defined(SB_FILE_SEP_STRING)
-#error "Your platform must define SB_FILE_SEP_STRING."
-#endif
-
-#if !defined(SB_MAX_THREAD_NAME_LENGTH)
-#error "Your platform must define SB_MAX_THREAD_NAME_LENGTH."
-#endif
-
-#if !defined(SB_PATH_SEP_CHAR)
-#error "Your platform must define SB_PATH_SEP_CHAR."
-#endif
-
-#if !defined(SB_PATH_SEP_STRING)
-#error "Your platform must define SB_PATH_SEP_STRING."
-#endif
-
-#if !defined(SB_PREFERRED_RGBA_BYTE_ORDER)
-// Legal values for SB_PREFERRED_RGBA_BYTE_ORDER are defined in this file above
-// as SB_PREFERRED_RGBA_BYTE_ORDER_*.
-// If your platform uses GLES, you should set this to
-// SB_PREFERRED_RGBA_BYTE_ORDER_RGBA.
-#error "Your platform must define SB_PREFERRED_RGBA_BYTE_ORDER."
-#endif
-
-#if SB_PREFERRED_RGBA_BYTE_ORDER != SB_PREFERRED_RGBA_BYTE_ORDER_RGBA && \
-    SB_PREFERRED_RGBA_BYTE_ORDER != SB_PREFERRED_RGBA_BYTE_ORDER_BGRA && \
-    SB_PREFERRED_RGBA_BYTE_ORDER != SB_PREFERRED_RGBA_BYTE_ORDER_ARGB
-#error "SB_PREFERRED_RGBA_BYTE_ORDER has been assigned an invalid value."
-#endif
-
-#endif  // SB_API_VERSION >= 12
-
-#if (SB_API_VERSION < 12 && !defined(SB_HAS_MICROPHONE))
-#error \
-    "Your platform must define SB_HAS_MICROPHONE in API versions 11 or earlier."
-#endif
-
-#if SB_API_VERSION < 12 && !defined(SB_HAS_TIME_THREAD_NOW)
-#error \
-    "Your platform must define SB_HAS_TIME_THREAD_NOW in API versions 3 to 11."
-#endif
-
 #if defined(SB_IS_PLAYER_COMPOSITED) || defined(SB_IS_PLAYER_PUNCHED_OUT) || \
     defined(SB_IS_PLAYER_PRODUCING_TEXTURE)
 #error "New versions of Starboard specify player output mode at runtime."
@@ -765,28 +638,11 @@
 #error "Your platform must define SB_HAS_NV12_TEXTURE_SUPPORT."
 #endif
 
-#if SB_API_VERSION >= 12
 #if defined(SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER)
 #error "SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER is deprecated."
 #error "Use `CobaltExtensionGraphicsApi` instead."
 #error "See [`CobaltExtensionGraphicsApi`](../extension/graphics.h)."
 #endif
-#else
-#if !defined(SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER)
-#error "Your platform must define SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER."
-#endif
-#endif
-
-#if SB_API_VERSION >= 12
-#if defined(COBALT_MAX_CPU_USAGE_IN_BYTES)
-#error "|max_cobalt_cpu_usage| is deprecated "
-#error "SbSystemGetTotalCPUMemory() instead."
-#endif
-#if defined(COBALT_MAX_GPU_USAGE_IN_BYTES)
-#error "|max_cobalt_gpu_usage| is deprecated. "
-#error "Implement SbSystemGetTotalGPUMemory() instead."
-#endif
-#endif  // SB_API_VERSION >= 12
 
 #if defined(COBALT_MEDIA_BUFFER_NON_VIDEO_BUDGET)
 #error "COBALT_MEDIA_BUFFER_NON_VIDEO_BUDGET is deprecated."
@@ -883,24 +739,16 @@
 #error "SB_HAS_AUDIOLESS_VIDEO is deprecated."
 #endif  // defined(SB_HAS_AUDIOLESS_VIDEO)
 
-#if !defined(SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-#define SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT 1
-#elif !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
+#if defined(SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
 #error \
-    "SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT is required in this API " \
-        "version."
-#endif
+    "SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT should not be defined for " \
+           "API version >= 12."
+#endif  // defined(SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
 
 #if defined(SB_HAS_DRM_SESSION_CLOSED)
 #error "SB_HAS_DRM_SESSION_CLOSED should not be defined for API version >= 10."
 #endif  // defined(SB_HAS_DRM_SESSION_CLOSED)
 
-#if SB_API_VERSION < 12
-#if !defined(SB_HAS_ON_SCREEN_KEYBOARD)
-#error "Your platform must define SB_HAS_ON_SCREEN_KEYBOARD."
-#endif  // !defined(SB_HAS_ON_SCREEN_KEYBOARD)
-#endif  // SB_API_VERSION < 12
-
 #if defined(SB_HAS_PLAYER_FILTER_TESTS)
 #error "SB_HAS_PLAYER_FILTER_TESTS should not be defined in API versions >= 10."
 #endif  // defined(SB_HAS_PLAYER_FILTER_TESTS)
@@ -911,50 +759,20 @@
        ">= 10."
 #endif  // defined(SB_HAS_PLAYER_ERROR_MESSAGE)
 
-#if SB_API_VERSION >= 12
-#if !defined(SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-#define SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT 1
-#elif !SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+#if defined(SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 #error \
-    "SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT is required in" \
-    " this API version."
-#endif
-#endif  // SB_API_VERSION >= 12
+    "SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT should not be " \
+        "defined in API versions >= 12."
+#endif  // defined(SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
-#if SB_API_VERSION >= 12 && SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
+#if SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
 #error \
     "SB_HAS_QUIRK_SEEK_TO_KEYFRAME is deprecated in Starboard 12 or later." \
          " Please see configuration-public.md for more details."
-#endif  // SB_API_VERSION >= 12 && SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
-
-#if SB_API_VERSION >= SB_EXPERIMENTAL_API_VERSION
-#if !defined(SB_HAS_COMPACT_10BITS_FRAME)
-#define SB_HAS_COMPACT_10BITS_FRAME 1
-#elif !SB_HAS(SB_HAS_COMPACT_10BITS_FRAME)
-#error "SB_HAS_COMPACT_10BITS_FRAME is required in this API version."
-#endif
-#endif  // SB_API_VERSION >= SB_EXPERIMENTAL_API_VERSION
-#if SB_HAS(SB_HAS_COMPACT_10BITS_FRAME)
-#if SB_API_VERSION < SB_EXPERIMENTAL_API_VERSION
-#error \
-    "SB_HAS(SB_HAS_COMPACT_10BITS_FRAME) requires " \
-     "SB_API_VERSION SB_EXPERIMENTAL_API_VERSION or later."
-#endif  // SB_API_VERSION < SB_EXPERIMENTAL_API_VERSION
-#endif  // SB_HAS(SB_HAS_COMPACT_10BITS_FRAME)
+#endif  // SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
 
 // --- Derived Configuration -------------------------------------------------
 
-#if SB_API_VERSION < 12
-
-// Whether the current platform is little endian.
-#if SB_IS(BIG_ENDIAN)
-#define SB_IS_LITTLE_ENDIAN 0
-#else
-#define SB_IS_LITTLE_ENDIAN 1
-#endif
-
-#endif  // SB_API_VERSION < 12
-
 // Whether the current platform has 64-bit atomic operations.
 #if SB_IS(64_BIT)
 #define SB_HAS_64_BIT_ATOMICS 1
diff --git a/starboard/configuration_constants.h b/starboard/configuration_constants.h
index 63ed478..5273c31 100644
--- a/starboard/configuration_constants.h
+++ b/starboard/configuration_constants.h
@@ -23,8 +23,6 @@
 
 #include "starboard/types.h"
 
-#if SB_API_VERSION >= 12
-
 // Determines the threshold of allocation size that should be done with mmap
 // (if available), rather than allocated within the core heap.
 extern const size_t kSbDefaultMmapThreshold;
@@ -145,6 +143,4 @@
 // The maximum number of users that can be signed in at the same time.
 extern const uint32_t kSbUserMaxSignedIn;
 
-#endif  // SB_API_VERSION >= 12
-
 #endif  // STARBOARD_CONFIGURATION_CONSTANTS_H_
diff --git a/starboard/contrib/linux/stadia/main.cc b/starboard/contrib/linux/stadia/main.cc
index 61c90a1..ae44e9f 100644
--- a/starboard/contrib/linux/stadia/main.cc
+++ b/starboard/contrib/linux/stadia/main.cc
@@ -19,6 +19,10 @@
 #include "starboard/shared/signal/crash_signals.h"
 #include "starboard/shared/signal/suspend_signals.h"
 #include "starboard/shared/starboard/link_receiver.h"
+#if SB_IS(EVERGREEN_COMPATIBLE)
+#include "starboard/shared/starboard/command_line.h"
+#include "starboard/shared/starboard/starboard_switches.h"
+#endif
 
 #include "third_party/crashpad/wrapper/wrapper.h"
 
@@ -28,7 +32,12 @@
   starboard::shared::signal::InstallSuspendSignalHandlers();
 
 #if SB_IS(EVERGREEN_COMPATIBLE)
-  third_party::crashpad::wrapper::InstallCrashpadHandler();
+  if (starboard::shared::starboard::CommandLine(argc, argv)
+          .HasSwitch(starboard::shared::starboard::kStartHandlerAtCrash)) {
+    third_party::crashpad::wrapper::InstallCrashpadHandler(true);
+  } else {
+    third_party::crashpad::wrapper::InstallCrashpadHandler(false);
+  }
 #endif
 
 #if SB_HAS_QUIRK(BACKTRACE_DLOPEN_BUG)
diff --git a/starboard/contrib/linux/stadia/thread_types_public.h b/starboard/contrib/linux/stadia/thread_types_public.h
deleted file mode 100644
index 44599a0..0000000
--- a/starboard/contrib/linux/stadia/thread_types_public.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file is meant to live under starboard/linux/stadia/ (see ../README.md),
-// so we disable the header guard check.
-// NOLINT(build/header_guard)
-
-#ifndef STARBOARD_LINUX_STADIA_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_STADIA_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/linux/shared/thread_types_public.h"
-
-#endif  // STARBOARD_LINUX_STADIA_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/cpu_features.h b/starboard/cpu_features.h
index d52749f..fbcbafe 100644
--- a/starboard/cpu_features.h
+++ b/starboard/cpu_features.h
@@ -194,10 +194,8 @@
 
   // SSE3 extensions.
   bool has_sse3;
-#if SB_API_VERSION >= 12
   // PCLMULQDQ instruction.
   bool has_pclmulqdq;
-#endif  // SB_API_VERSION >= 12
   // Supplemental SSE3 extensions.
   bool has_ssse3;
   // SSE-4.1 extensions.
diff --git a/starboard/cryptography.h b/starboard/cryptography.h
deleted file mode 100644
index 32e3aac..0000000
--- a/starboard/cryptography.h
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Module Overview: Starboard Cryptography module
-//
-// Hardware-accelerated cryptography. Platforms should **only** implement this
-// when there are **hardware-accelerated** cryptography facilities. Applications
-// must fall back to platform-independent CPU-based algorithms if the cipher
-// algorithm isn't supported in hardware.
-//
-// # Tips for Porters
-//
-// You should implement cipher algorithms in this descending order of priority
-// to maximize usage for SSL.
-//
-//   1. GCM - The preferred block cipher mode for OpenSSL, mainly due to speed.
-//   2. CTR - This can be used internally with GCM, as long as the CTR
-//            implementation only uses the last 4 bytes of the IV for the
-//            counter. (i.e. 96-bit IV, 32-bit counter)
-//   3. ECB - This can be used (with a null IV) with any of the other cipher
-//            block modes to accelerate the core AES algorithm if none of the
-//            streaming modes can be accelerated.
-//   4. CBC - GCM is always preferred if the server and client both support
-//            it. If not, they will generally negotiate down to AES-CBC. If this
-//            happens, and CBC is supported by SbCryptography, then it will be
-//            accelerated appropriately. But, most servers should support GCM,
-//            so it is not likely to come up much, which is why it is the lowest
-//            priority.
-//
-// Further reading on block cipher modes:
-//
-// https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
-//
-// https://crbug.com/442572
-//
-// https://crypto.stackexchange.com/questions/10775/practical-disadvantages-of-gcm-mode-encryption
-//
-
-#ifndef STARBOARD_CRYPTOGRAPHY_H_
-#define STARBOARD_CRYPTOGRAPHY_H_
-
-#include "starboard/configuration.h"
-#include "starboard/export.h"
-#include "starboard/types.h"
-
-#if SB_API_VERSION >= 12
-#error "Starboard Crypto API is deprecated"
-#else
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// String literal for the AES symmetric block cipher.
-// https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
-#define kSbCryptographyAlgorithmAes "aes"
-
-// The direction of a cryptographic transformation.
-typedef enum SbCryptographyDirection {
-  // Cryptographic transformations that encode/encrypt data into a
-  // target format.
-  kSbCryptographyDirectionEncode,
-
-  // Cryptographic transformations that decode/decrypt data into
-  // its original form.
-  kSbCryptographyDirectionDecode,
-} SbCryptographyDirection;
-
-// The method of chaining encrypted blocks in a sequence.
-// https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
-typedef enum SbCryptographyBlockCipherMode {
-  // Cipher Block Chaining mode.
-  kSbCryptographyBlockCipherModeCbc,
-
-  // Cipher Feedback mode.
-  kSbCryptographyBlockCipherModeCfb,
-
-  // Counter mode: A nonce is combined with an increasing counter.
-  kSbCryptographyBlockCipherModeCtr,
-
-  // Electronic Code Book mode: No chaining.
-  kSbCryptographyBlockCipherModeEcb,
-
-  // Output Feedback mode.
-  kSbCryptographyBlockCipherModeOfb,
-
-  // Galois/Counter Mode.
-  kSbCryptographyBlockCipherModeGcm,
-} SbCryptographyBlockCipherMode;
-
-// Private structure representing a cryptographic transformer
-// configuration and state.
-typedef struct SbCryptographyTransformerPrivate
-    SbCryptographyTransformerPrivate;
-
-// A handle to a cryptographic transformer.
-typedef SbCryptographyTransformerPrivate* SbCryptographyTransformer;
-
-// Well-defined value for an invalid transformer.
-#define kSbCryptographyInvalidTransformer ((SbCryptographyTransformer)NULL)
-
-// Returns whether the given transformer handle is valid.
-static SB_C_INLINE bool SbCryptographyIsTransformerValid(
-    SbCryptographyTransformer transformer) {
-  return transformer != kSbCryptographyInvalidTransformer;
-}
-
-// Creates an SbCryptographyTransformer with the given initialization
-// data. It can then be used to transform a series of data blocks.
-// Returns kSbCryptographyInvalidTransformer if the algorithm isn't
-// supported, or if the parameters are not compatible with the
-// algorithm.
-//
-// An SbCryptographyTransformer contains all state to start decrypting
-// a sequence of cipher blocks according to the cipher block mode. It
-// is not thread-safe, but implementations must allow different
-// SbCryptographyTransformer instances to operate on different threads.
-//
-// All parameters must not be assumed to live longer than the call to
-// this function. They must be copied by the implementation to be
-// retained.
-//
-// This function determines success mainly based on whether the combination of
-// |algorithm|, |direction|, |block_size_bits|, and |mode| is supported and
-// whether all the sizes passed in are sufficient for the selected
-// parameters. In particular, this function cannot verify that the key and IV
-// used were correct for the ciphertext, were it to be used in the decode
-// direction. The caller must make that verification.
-//
-// For example, to decrypt AES-128-CTR:
-//   SbCryptographyCreateTransformer(kSbCryptographyAlgorithmAes, 128,
-//                                   kSbCryptographyDirectionDecode,
-//                                   kSbCryptographyBlockCipherModeCtr,
-//                                   ...);
-//
-// |algorithm|: A string that represents the cipher algorithm.
-// |block_size_bits|: The block size variant of the algorithm to use, in bits.
-// |direction|: The direction in which to transform the data.
-// |mode|: The block cipher mode to use.
-// |initialization_vector|: The Initialization Vector (IV) to use. May be NULL
-// for block cipher modes that don't use it, or don't set it at init time.
-// |initialization_vector_size|: The size, in bytes, of the IV.
-// |key|: The key to use for this transformation.
-// |key_size|: The size, in bytes, of the key.
-//
-// presubmit: allow sb_export mismatch
-SB_EXPORT SbCryptographyTransformer
-SbCryptographyCreateTransformer(const char* algorithm,
-                                int block_size_bits,
-                                SbCryptographyDirection direction,
-                                SbCryptographyBlockCipherMode mode,
-                                const void* initialization_vector,
-                                int initialization_vector_size,
-                                const void* key,
-                                int key_size);
-
-// Destroys the given |transformer| instance.
-//
-// presubmit: allow sb_export mismatch
-SB_EXPORT void SbCryptographyDestroyTransformer(
-    SbCryptographyTransformer transformer);
-
-// Transforms one or more |block_size_bits|-sized blocks of |in_data|, with the
-// given |transformer|, placing the result in |out_data|. Returns the number of
-// bytes that were written to |out_data|, unless there was an error, in which
-// case it will return a negative number.
-//
-// |transformer|: A transformer initialized with an algorithm, IV, cipherkey,
-// and so on.
-// |in_data|: The data to be transformed.
-// |in_data_size|: The size of the data to be transformed, in bytes. Must be a
-// multiple of the transformer's |block-size_bits|, or an error will be
-// returned.
-// |out_data|: A buffer where the transformed data should be placed. Must have
-// at least capacity for |in_data_size| bytes. May point to the same memory as
-// |in_data|.
-//
-// presubmit: allow sb_export mismatch
-SB_EXPORT int SbCryptographyTransform(
-    SbCryptographyTransformer transformer,
-    const void* in_data,
-    int in_data_size,
-    void* out_data);
-
-// Sets the initialization vector (IV) for a transformer, replacing the
-// internally-set IV. The block cipher mode algorithm will update the IV
-// appropriately after every block, so this is not necessary unless the stream
-// is discontiguous in some way. This happens with AES-GCM in TLS.
-//
-// presubmit: allow sb_export mismatch
-SB_EXPORT void SbCryptographySetInitializationVector(
-    SbCryptographyTransformer transformer,
-    const void* initialization_vector,
-    int initialization_vector_size);
-
-// Sets additional authenticated data (AAD) for a transformer, for chaining
-// modes that support it (GCM). Returns whether the data was successfully
-// set. This can fail if the chaining mode doesn't support AAD, if the
-// parameters are invalid, or if the internal state is invalid for setting AAD.
-//
-// presubmit: allow sb_export mismatch
-SB_EXPORT bool SbCryptographySetAuthenticatedData(
-    SbCryptographyTransformer transformer,
-    const void* data,
-    int data_size);
-
-// Calculates the authenticator tag for a transformer and places up to
-// |out_tag_size| bytes of it in |out_tag|. Returns whether it was able to get
-// the tag, which mainly has to do with whether it is compatible with the
-// current block cipher mode.
-//
-// presubmit: allow sb_export mismatch
-SB_EXPORT bool SbCryptographyGetTag(
-    SbCryptographyTransformer transformer,
-    void* out_tag,
-    int out_tag_size);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // SB_API_VERSION >= 12
-
-#endif  // STARBOARD_CRYPTOGRAPHY_H_
diff --git a/starboard/decode_target.h b/starboard/decode_target.h
index e8183f9..9d24eff 100644
--- a/starboard/decode_target.h
+++ b/starboard/decode_target.h
@@ -134,10 +134,12 @@
   // order. Each pixel is stored in 16 bits.
   kSbDecodeTargetFormat3Plane10BitYUVI420,
 
+#if SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
   // A decoder target format consisting of 10bit Y, U, and V planes, in that
   // order. The plane data is stored in a compact format. Every three 10-bit
   // pixels are packed into 32 bits.
   kSbDecodeTargetFormat3Plane10BitYUVI420Compact,
+#endif  // SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
 
   // A decoder target format consisting of a single plane with pixels laid out
   // in the format UYVY.  Since there are two Y values per sample, but only one
@@ -175,7 +177,6 @@
   kSbDecodeTargetPlaneV = 2,
 } SbDecodeTargetPlane;
 
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
 struct SbDecodeTargetGraphicsContextProvider;
 
 // Signature for a Starboard implementation function that is to be run by a
@@ -191,7 +192,6 @@
     struct SbDecodeTargetGraphicsContextProvider* graphics_context_provider,
     SbDecodeTargetGlesContextRunnerTarget target_function,
     void* target_function_context);
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
 
 // In general, the SbDecodeTargetGraphicsContextProvider structure provides
 // information about the graphics context that will be used to render
@@ -201,7 +201,6 @@
 // should be provided to all Starboard functions that might create
 // SbDecodeTargets (e.g. SbImageDecode()).
 typedef struct SbDecodeTargetGraphicsContextProvider {
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
   // A reference to the EGLDisplay object that hosts the EGLContext that will
   // be used to render any produced SbDecodeTargets.  Note that it has the
   // type |void*| in order to avoid #including the EGL header files here.
@@ -220,7 +219,6 @@
   // Context data that is to be passed in to |gles_context_runner| when it is
   // invoked.
   void* gles_context_runner_context;
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
 } SbDecodeTargetGraphicsContextProvider;
 
 // Defines a rectangular content region within a SbDecodeTargetInfoPlane
@@ -239,7 +237,6 @@
 
 // Defines an image plane within a SbDecodeTargetInfo object.
 typedef struct SbDecodeTargetInfoPlane {
-#if SB_API_VERSION >= 12 || SB_HAS(GLES2)
   // A handle to the GL texture that can be used for rendering.
   uint32_t texture;
 
@@ -255,8 +252,6 @@
   // Ignored for other plane types.
   uint32_t gl_texture_format;
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(GLES2)
-
   // The width of the texture/surface for this particular plane.
   int width;
   // The height of the texture/surface for this particular plane.
@@ -329,7 +324,9 @@
     case kSbDecodeTargetFormat2PlaneYUVNV12:
       return 2;
     case kSbDecodeTargetFormat3Plane10BitYUVI420:
+#if SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
     case kSbDecodeTargetFormat3Plane10BitYUVI420Compact:
+#endif  // SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
     case kSbDecodeTargetFormat3PlaneYUVI420:
       return 3;
     default:
diff --git a/starboard/directory.h b/starboard/directory.h
index 65be54f..0871201 100644
--- a/starboard/directory.h
+++ b/starboard/directory.h
@@ -34,14 +34,6 @@
 // A handle to an open directory stream.
 typedef struct SbDirectoryPrivate* SbDirectory;
 
-#if SB_API_VERSION < 12
-// Represents a directory entry.
-typedef struct SbDirectoryEntry {
-  // The name of this directory entry.
-  char name[SB_FILE_MAX_NAME];
-} SbDirectoryEntry;
-#endif  // SB_API_VERSION < 12
-
 // Well-defined value for an invalid directory stream handle.
 #define kSbDirectoryInvalid ((SbDirectory)NULL)
 
@@ -66,7 +58,6 @@
 // |directory|: The directory stream handle to close.
 SB_EXPORT bool SbDirectoryClose(SbDirectory directory);
 
-#if SB_API_VERSION >= 12
 // Populates |out_entry| with the next entry in the specified directory stream,
 // and moves the stream forward by one entry.
 //
@@ -87,22 +78,6 @@
 SB_EXPORT bool SbDirectoryGetNext(SbDirectory directory,
                                   char* out_entry,
                                   size_t out_entry_size);
-#else   // SB_API_VERSION >= 12
-// Populates |out_entry| with the next entry in the specified directory stream,
-// and moves the stream forward by one entry.
-//
-// Platforms may, but are not required to, return |.| (referring to the
-// directory itself) and/or |..| (referring to the directory's parent directory)
-// as entries in the directory stream.
-//
-// This function returns |true| if there was a next directory, and |false|
-// at the end of the directory stream.
-//
-// |directory|: The directory stream from which to retrieve the next directory.
-// |out_entry|: The variable to be populated with the next directory entry.
-SB_EXPORT bool SbDirectoryGetNext(SbDirectory directory,
-                                  SbDirectoryEntry* out_entry);
-#endif  // SB_API_VERSION >= 12
 
 // Indicates whether SbDirectoryOpen is allowed for the given |path|.
 //
diff --git a/starboard/doc/c99.md b/starboard/doc/c99.md
index 769ad3e..88c41b7 100644
--- a/starboard/doc/c99.md
+++ b/starboard/doc/c99.md
@@ -15,7 +15,7 @@
 [starboard/client_porting](../../starboard/client_porting) directory many
 non-Evergreen platforms still have a lot of direct system dependencies. These
 dependencies do not exist for Evergreen platforms as Cobalt is statically
-linked with the [musl](../../third_party/musl/musl.gyp) libc library.
+linked with the [musl](../../third_party/musl/BUILD.gn) libc library.
 
 3. Starting with Starboard 13 a limited set of C99 symbols will be allowed.
 This set will expand gradually while the corresponding Starboard APIs will be
diff --git a/starboard/doc/crash_handlers.md b/starboard/doc/crash_handlers.md
index 8aa11d8..0863bf1 100644
--- a/starboard/doc/crash_handlers.md
+++ b/starboard/doc/crash_handlers.md
@@ -32,7 +32,7 @@
 }
 ```
 
-3. Calling the `third_party::crashpad::wrapper::InstallCrashpadHandler()` hook
+3. Calling the `third_party::crashpad::wrapper::InstallCrashpadHandler(bool start_at_crash)` hook
 directly after installing system crash handlers. On linux, for example, this
 could look like:
 
@@ -44,7 +44,7 @@
   starboard::shared::signal::InstallCrashSignalHandlers();
   starboard::shared::signal::InstallSuspendSignalHandlers();
 
-  third_party::crashpad::wrapper::InstallCrashpadHandler();
+  third_party::crashpad::wrapper::InstallCrashpadHandler(true);
 
   int result = application.Run(argc, argv);
   ...
diff --git a/starboard/doc/evergreen/cobalt_evergreen_overview.md b/starboard/doc/evergreen/cobalt_evergreen_overview.md
index 001f324..cc21fa2 100644
--- a/starboard/doc/evergreen/cobalt_evergreen_overview.md
+++ b/starboard/doc/evergreen/cobalt_evergreen_overview.md
@@ -101,8 +101,8 @@
 Cobalt Evergreen is built by a separate gyp platform using the Google toolchain:
 
 ```
-$ cobalt/build/gyp_cobalt evergreen-arm-softfp-sbversion-12
-$ ninja -C out/evergreen-arm-softfp-sbversion-12_qa cobalt
+$ cobalt/build/gn.py -p evergreen-arm-softfp -c qa
+$ ninja -C out/evergreen-arm-softfp_qa cobalt
 ```
 
 Which produces a shared library `libcobalt.so` targeted for specific
@@ -115,7 +115,7 @@
 `libcobalt.so`, and the `crashpad_handler` which handles crashes.
 
 ```
-$ cobalt/build/gyp_cobalt <partner_port_name>
+$ cobalt/build/gn.py -p <partner_port_name> -c qa
 $ ninja -C out/<partner_port_name>_qa loader_app crashpad_handler
 ```
 
@@ -257,9 +257,9 @@
 `nplb_evergreen_compat_tests`. These tests ensure that the platform is
 configured appropriately for Evergreen.
 
-To enable the test, set the `sb_evergreen_compatible gyp` variable to 1 in the
-`gyp_configuration.gypi`. For more details please take a look at the Raspberry
-Pi 2 gyp files.
+To enable the test, set the `sb_is_evergreen_compatible` GN variable to `true`
+in the platform's `configuration.gni`. For more details please take a look at
+the Raspberry Pi 2 GN files.
 
 There is a reference implementation available for Raspberry Pi 2 with
 instructions available [here](cobalt_evergreen_reference_port_raspi2.md).
@@ -268,7 +268,7 @@
 
 1. Build the `crashpad_database_util` target and deploy it onto the device.
 ```
-$ cobalt/build/gyp_cobalt <partner_port_name>
+$ cobalt/build/gn.py -p <partner_port_name> -c qa
 $ ninja -C out/<partner_port_name>_qa crashpad_database_util
 ```
 2. Remove the existing state for crashpad as it throttles uploads to 1 per hour:
diff --git a/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md b/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
index a9fec25..bc254cf 100644
--- a/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
+++ b/starboard/doc/evergreen/cobalt_evergreen_reference_port_raspi2.md
@@ -14,12 +14,12 @@
 
 ## Build the loader app (new entry point)
 $ cd cobalt/src
-$ cobalt/build/gyp_cobalt -v raspi-2-sbversion-12 -C qa
-$ ninja -C out/raspi-2-sbversion-12_qa loader_app crashpad_handler
+$ cobalt/build/gn.py -p raspi-2 -c qa
+$ ninja -C out/raspi-2_qa loader_app crashpad_handler
 
 ## Create package directory for Cobalt Evergreen
 $ export COEG_PATH=coeg
-$ cp out/raspi-2-sbversion-12_qa/loader_app $COEG_PATH
+$ cp out/raspi-2_qa/loader_app $COEG_PATH
 
 ## Create directory structure for the initial installation
 [2-slot configuration]
@@ -46,12 +46,12 @@
 ```
 ## Build Cobalt core locally
 $ cd cobalt/src
-$ cobalt/build/gyp_cobalt -v evergreen-arm-hardfp-sbversion-12 -C qa
-$ ninja -C out/evergreen-arm-hardfp-sbversion-12_qa cobalt
+$ cobalt/build/gn.py -p evergreen-arm-hardfp -c qa
+$ ninja -C out/evergreen-arm-hardfp_qa cobalt
 
 ## Copy the generated files to the package directory for Cobalt Evergreen
-$ cp -r out/evergreen-arm-hardfp-sbversion-12_qa/lib   $COEG_PATH/content/app/cobalt/
-$ cp -r out/evergreen-arm-hardfp-sbversion-12_qa/content   $COEG_PATH/content/app/cobalt/
+$ cp -r out/evergreen-arm-hardfp_qa/lib   $COEG_PATH/content/app/cobalt/
+$ cp -r out/evergreen-arm-hardfp_qa/content   $COEG_PATH/content/app/cobalt/
 
 ## Create a file named manifest.json with the following content, and put it under $COEG_PATH/content/app/cobalt/
 $ cat > $COEG_PATH/content/app/cobalt/manifest.json <<EOF
diff --git a/starboard/doc/howto_decode_to_texture.md b/starboard/doc/howto_decode_to_texture.md
index 993d50a..cf4813a 100644
--- a/starboard/doc/howto_decode_to_texture.md
+++ b/starboard/doc/howto_decode_to_texture.md
@@ -22,7 +22,7 @@
 From [`starboard/player.h`](../player.h),
 
 * `SbPlayerCreate()`
-* `SbPlayerOutputModeSupported()`
+* `SbPlayerGetPreferredOutputMode()`
 * `SbPlayerGetCurrentFrame()`
 
 From [`starboard/decode_target.h`](../decode_target.h),
@@ -43,17 +43,20 @@
 ![Decode-to-texture sequence diagram](resources/decode_to_texture_sequence.png)
 
 1. An application with the desire to make use of decode-to-texture will first
-   call `SbPlayerOutputModeSupported()`, passing in
-   `kSbPlayerOutputModeDecodeToTexture` for its `output_mode` parameter.  If
-   the function returns false, the application learns that decode-to-texture
-   is not supported by the platform and it will not continue with a
-   decode-to-texture flow.
+   call `SbPlayerGetPreferredOutputMode()`, passing in
+   `kSbPlayerOutputModeDecodeToTexture` for its `creation_param->output_mode`
+   parameter.  If the function doesn't return
+   `kSbPlayerOutputModeDecodeToTexture`, the application learns that
+   decode-to-texture is not supported by the platform and it will not continue
+   with a decode-to-texture flow.
 
-2. If `SbPlayerOutputModeSupported()` returns true, the application will call
+2. If `SbPlayerGetPreferredOutputMode()` returns
+   `kSbPlayerOutputModeDecodeToTexture`, the application will call
    `SbPlayerCreate()`, passing in `kSbPlayerOutputModeDecodeToTexture` for
-   the `output_mode` parameter, and also providing a valid `provider`
-   parameter (more on this later).  At this point, the Starboard platform is
-   expected to have created a player with the decode-to-texture output mode.
+   the `creation_param->output_mode` parameter, and also providing a valid
+   `provider` parameter (more on this later).  At this point, the Starboard
+   platform is expected to have created a player with the decode-to-texture
+    output mode.
 
 3. Once the player is started and playback has begun, the application's
    renderer thread (this may be a different thread than the one that called
diff --git a/starboard/doc/resources/decode_to_texture_sequence.png b/starboard/doc/resources/decode_to_texture_sequence.png
index b2b4cb4..f047730 100644
--- a/starboard/doc/resources/decode_to_texture_sequence.png
+++ b/starboard/doc/resources/decode_to_texture_sequence.png
Binary files differ
diff --git a/starboard/doc/resources/decode_to_texture_sequence.txt b/starboard/doc/resources/decode_to_texture_sequence.txt
index ac5127b..149b404 100644
--- a/starboard/doc/resources/decode_to_texture_sequence.txt
+++ b/starboard/doc/resources/decode_to_texture_sequence.txt
@@ -1,10 +1,10 @@
 participant Application (e.g. Cobalt) as a [fillcolor="#ffd0d0"]
 participant Starboard as s [fillcolor="#d0d0ff"]
 
-a->s: SbPlayerOutputModeSupported(kSbPlayerOutputModeDecodeToTexture, ...)
-s-->a: returns bool
-Note over a: If SbPlayerOutputModeSupported()\nreturns true... [fillcolor="white"]
-a->s: SbPlayerCreate(..., kSbPlayerOutputModeDecodeToTexture, ...)
+a->s: SbPlayerGetPreferredOutputMode(creation_param->output_mode = kSbPlayerOutputModeDecodeToTexture, ...)
+s-->a: returns SbPlayerOutputMode
+Note over a: If SbPlayerGetPreferredOutputMode()\nreturns kSbPlayerOutputModeDecodeToTexture [fillcolor="white"]
+a->s: SbPlayerCreate(..., creation_param->output_mode = kSbPlayerOutputModeDecodeToTexture, ...)
 Note over a: Start of render loop [fillcolor="#ffffd0"]
 a->s: SbPlayerGetCurrentFrame()
 s-->a: returns SbDecodeTarget
diff --git a/starboard/doc/starboard_abi.md b/starboard/doc/starboard_abi.md
index bd0d309..a6d6959 100644
--- a/starboard/doc/starboard_abi.md
+++ b/starboard/doc/starboard_abi.md
@@ -39,21 +39,20 @@
 [//starboard/sabi](../sabi)
 for examples). Starboard ABI files are JSON, and should all contain identical
 keys with the values being appropriate for the architecture. Each platform must
-override the new
-[GetPathToSabiJsonFile](../build/platform_configuration.py##339)
-method in its platform configuration to return the path to the desired Starboard
-ABI file (e.g.
-[//starboard/linux/shared/gyp\_configuration.py](../linux/shared/gyp_configuration.py)).
+set the `sabi_path` GN variables in its
+`platform_configuration/configuration.gni` file to return the path to the
+desired Starboard ABI file (e.g.
+[//starboard/linux/x64x11/shared/platform_configuration/configuration.gni](../linux/x64x11/shared/platform_configuration/configuration.gni)).
 By default, an empty and invalid Starboard ABI file is provided.
 
-Additionally, all platforms must include the
-[sabi.gypi](../sabi/sabi.gypi)
-in their build configuration. This file will consume the specified Starboard ABI
-file, resulting in the creation of a set of GYP variables and preprocessor
+Additionally, all platforms must include the `//starboard/build/config/sabi`
+config from [sabi/BUILD.gn](../build/config/sabi/BUILD.gn)
+in their platform configs. This file will consume the specified Starboard ABI
+file, resulting in the creation of a set of GN variables and preprocessor
 macros. The preprocessor macros are passed directly to the compiler and replace
 the macros you might be familiar with, such as `SB_HAS_32_BIT_LONG`.
 
-The newly defined GYP variables need to be transformed into toolchain specific
+The newly defined GN variables need to be transformed into toolchain specific
 flags; these flags are what actually makes the build result in a binary for the
 desired architecture. These flags will, in most cases, be identical to the flags
 already being used for building.
@@ -64,7 +63,7 @@
 
 ### Post-Starboard ABI File Cleanup
 
-A number of GYP variables and preprocessor macros should no longer be defined
+A number of GN variables and preprocessor macros should no longer be defined
 directly, and instead the Starboard ABI file will be used to define them. These
 definitions need to be removed.
 
@@ -79,10 +78,6 @@
 *   `SB_HAS_32_BIT_POINTERS`
 *   `SB_HAS_64_BIT_POINTERS`
 
-From `gyp_configuration.gypi`:
-
-*   `target_arch`
-
 ## FAQ
 
 ### What Starboard ABI files are provided?
diff --git a/starboard/drm.h b/starboard/drm.h
index 13d47bd..6eb68d0 100644
--- a/starboard/drm.h
+++ b/starboard/drm.h
@@ -83,8 +83,6 @@
   int identifier_size;
 } SbDrmKeyId;
 
-#if SB_API_VERSION >= 12
-
 // Encryption scheme of the input sample, as defined in ISO/IEC 23001 part 7.
 typedef enum SbDrmEncryptionScheme {
   kSbDrmEncryptionSchemeAesCtr,
@@ -97,17 +95,13 @@
   uint32_t skip_byte_block;
 } SbDrmEncryptionPattern;
 
-#endif  // SB_API_VERSION >= 12
-
 // All the optional information needed per sample for encrypted samples.
 typedef struct SbDrmSampleInfo {
-#if SB_API_VERSION >= 12
   // The encryption scheme of this sample.
   SbDrmEncryptionScheme encryption_scheme;
 
   // The encryption pattern of this sample.
   SbDrmEncryptionPattern encryption_pattern;
-#endif  // SB_API_VERSION >= 12
 
   // The Initialization Vector needed to decrypt this sample.
   uint8_t initialization_vector[16];
@@ -365,7 +359,6 @@
                                             const void* certificate,
                                             int certificate_size);
 
-#if SB_API_VERSION >= 12
 // Get the metrics of the underlying drm system.
 //
 // When it is called on an implementation that supports drm system metrics, it
@@ -388,7 +381,6 @@
 //
 // The caller will never set |size| to NULL.
 SB_EXPORT const void* SbDrmGetMetrics(SbDrmSystem drm_system, int* size);
-#endif  // SB_API_VERSION >= 12
 
 // Destroys |drm_system|, which implicitly removes all keys installed in it and
 // invalidates all outstanding session update requests. A DRM system cannot be
diff --git a/starboard/egl_and_gles/egl_and_gles.gyp b/starboard/egl_and_gles/egl_and_gles.gyp
deleted file mode 100644
index dff7d52..0000000
--- a/starboard/egl_and_gles/egl_and_gles.gyp
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# The egl_and_gles.gyp:egl_and_gles gyp target can be depended upon in order to
-# depend on a platform-specific implementation of EGL/GLES, whether that
-# ultimately ends up being Angle on Windows, system libraries on Linux, or a
-# custom implementation of EGL/GLES on an exotic platform. Depending on this
-# target will set dependent settings to have the EGL and GLES system headers in
-# their include directories.
-#
-# This decision is predicated on the value of the |gl_type| gyp variable defined
-# in the gyp_configuration.gypi for the current platform.
-{
-  'targets': [
-    {
-      'variables': {
-        'implementation_target': '<(DEPTH)/starboard/egl_and_gles/egl_and_gles_<(gl_type).gyp:egl_and_gles_implementation',
-      },
-
-      'target_name': 'egl_and_gles',
-      'type': 'none',
-
-      'dependencies': [
-        '<(implementation_target)',
-      ],
-      'export_dependent_settings': [
-        '<(implementation_target)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/egl_and_gles/egl_and_gles_angle.gyp b/starboard/egl_and_gles/egl_and_gles_angle.gyp
deleted file mode 100644
index 8699bae..0000000
--- a/starboard/egl_and_gles/egl_and_gles_angle.gyp
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'enable_d3d11_feature_level_11%': 0,
-  },
-  'targets': [
-    {
-      'target_name': 'egl_and_gles_implementation',
-      'type': 'none',
-
-      'dependencies': [
-        '<(DEPTH)/third_party/angle/angle.gyp:libEGL',
-        '<(DEPTH)/third_party/angle/angle.gyp:libGLESv2',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(DEPTH)/third_party/angle/include',
-        ],
-      },
-      'conditions': [
-        # ANGLE supports GLES3 on Windows only if DirectX11 feature level 11 is
-        # supported.
-        ['target_os=="win" and enable_d3d11_feature_level_11==1', {
-          'direct_dependent_settings': {
-            'defines': [
-              'GL_GLEXT_PROTOTYPES',
-            ],
-          },
-        }]
-      ]
-    },
-  ],
-}
diff --git a/starboard/egl_and_gles/egl_and_gles_glimp.gyp b/starboard/egl_and_gles/egl_and_gles_glimp.gyp
deleted file mode 100644
index 4e9cd79..0000000
--- a/starboard/egl_and_gles/egl_and_gles_glimp.gyp
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'egl_and_gles_implementation',
-      'type': 'none',
-
-      'dependencies': [
-        '<(DEPTH)/glimp/glimp.gyp:glimp',
-      ],
-      'export_dependent_settings': [
-        '<(DEPTH)/glimp/glimp.gyp:glimp',
-      ],
-      'direct_dependent_settings': {
-        'defines': [
-          'GL_GLEXT_PROTOTYPES',
-        ],
-      },
-      'conditions': [
-        ['enable_vr==1', {
-          'dependencies': [
-            '<(DEPTH)/glimp/<(sb_target_platform)/glimp_platform.gyp:glimp_platform',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/starboard/egl_and_gles/egl_and_gles_system_gles2.gyp b/starboard/egl_and_gles/egl_and_gles_system_gles2.gyp
deleted file mode 100644
index 8cdd0ab..0000000
--- a/starboard/egl_and_gles/egl_and_gles_system_gles2.gyp
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'egl_and_gles_implementation',
-      'type': 'none',
-
-      # Use the system-provided implementation of GLES2.
-    },
-  ],
-}
diff --git a/starboard/egl_and_gles/egl_and_gles_system_gles3.gyp b/starboard/egl_and_gles/egl_and_gles_system_gles3.gyp
deleted file mode 100644
index 01ddbca..0000000
--- a/starboard/egl_and_gles/egl_and_gles_system_gles3.gyp
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      # Though we support as a valid gl_type option, it will use neither GLES3
-      # features nor GLES3 egl context currently.
-      'target_name': 'egl_and_gles_implementation',
-      'type': 'none',
-    },
-  ],
-}
diff --git a/starboard/elf_loader/BUILD.gn b/starboard/elf_loader/BUILD.gn
index 34182c3..4c705b8 100644
--- a/starboard/elf_loader/BUILD.gn
+++ b/starboard/elf_loader/BUILD.gn
@@ -121,8 +121,8 @@
     # To properly function the system loader requires the starboard
     # symbols to be exported from the binary.
     # To allow symbols to be exported remove the '-fvisibility=hidden' flag
-    # from your compiler_flags.gypi. For Linux this would be:
-    #   starboard/linux/shared/compiler_flags.gypi
+    # from your BUILD.gn. For Linux this would be:
+    #   starboard/linux/shared/platform_configuration/BUILD.gn
     # Example run:
     # export LD_LIBRARY_PATH=.
     # ./elf_loader_sys_sandbox --evergreen_library=app/cobalt/lib/libcobalt.so --evergreen_content=app/cobalt/content
@@ -175,10 +175,8 @@
 
     # TODO: Remove this dependency once MediaSession is migrated to use CobaltExtensions.
     deps += cobalt_platform_dependencies
-    content_deps = [
-      ":copy_elf_loader_testdata",
-      "//third_party/icu:icudata",
-    ]
+
+    content_deps = [ ":copy_elf_loader_testdata" ]
   }
 }
 
diff --git a/starboard/elf_loader/dynamic_section_test.cc b/starboard/elf_loader/dynamic_section_test.cc
index 258a417..e196d8d 100644
--- a/starboard/elf_loader/dynamic_section_test.cc
+++ b/starboard/elf_loader/dynamic_section_test.cc
@@ -18,8 +18,7 @@
 #include "starboard/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12 && (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && \
-    SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
 
 namespace starboard {
 namespace elf_loader {
@@ -202,5 +201,4 @@
 }  // namespace
 }  // namespace elf_loader
 }  // namespace starboard
-#endif  // SB_API_VERSION >= 12 && (SB_API_VERSION >= 12
-        // || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
+#endif  // SB_CAN(MAP_EXECUTABLE_MEMORY)
diff --git a/starboard/elf_loader/elf_header_test.cc b/starboard/elf_loader/elf_header_test.cc
index cb03d42..5719dc8 100644
--- a/starboard/elf_loader/elf_header_test.cc
+++ b/starboard/elf_loader/elf_header_test.cc
@@ -21,8 +21,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12 && (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && \
-    SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
 namespace starboard {
 namespace elf_loader {
 
@@ -133,5 +132,4 @@
 }  // namespace
 }  // namespace elf_loader
 }  // namespace starboard
-#endif  // SB_API_VERSION >= 12 && (SB_API_VERSION >= 12
-        // || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
+#endif  // SB_CAN(MAP_EXECUTABLE_MEMORY)
diff --git a/starboard/elf_loader/elf_loader.cc b/starboard/elf_loader/elf_loader.cc
index f75f0f7..adebc1b 100644
--- a/starboard/elf_loader/elf_loader.cc
+++ b/starboard/elf_loader/elf_loader.cc
@@ -59,7 +59,9 @@
 bool ElfLoader::Load(const std::string& library_path,
                      const std::string& content_path,
                      bool is_relative_path,
-                     const void* (*custom_get_extension)(const char* name)) {
+                     const void* (*custom_get_extension)(const char* name),
+                     bool use_compression,
+                     bool use_memory_mapped_file) {
   if (is_relative_path) {
     library_path_ = MakeRelativeToContentPath(library_path);
     content_path_ = MakeRelativeToContentPath(content_path);
@@ -76,7 +78,8 @@
                           custom_get_extension);
   SB_LOG(INFO) << "evergreen_config: content_path=" << content_path_;
   SbTime start_time = SbTimeGetMonotonicNow();
-  bool res = impl_->Load(library_path_.c_str(), custom_get_extension);
+  bool res = impl_->Load(library_path_.c_str(), use_compression,
+                         use_memory_mapped_file);
   SbTime end_time = SbTimeGetMonotonicNow();
   SB_LOG(INFO) << "Loading took: "
                << (end_time - start_time) / kSbTimeMillisecond << " ms";
diff --git a/starboard/elf_loader/elf_loader.gyp b/starboard/elf_loader/elf_loader.gyp
deleted file mode 100644
index b93ed1d..0000000
--- a/starboard/elf_loader/elf_loader.gyp
+++ /dev/null
@@ -1,209 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'common_elf_loader_sources': [
-        'elf_header.h',
-        'elf_header.cc',
-        'elf_hash_table.h',
-        'elf_hash_table.cc',
-        'elf_loader.h',
-        'elf_loader.cc',
-        'elf_loader_constants.h',
-        'elf_loader_constants.cc',
-        'exported_symbols.cc',
-        'file.h',
-        'file_impl.h',
-        'file_impl.cc',
-        'lz4_file_impl.h',
-        'lz4_file_impl.cc',
-        'gnu_hash_table.h',
-        'gnu_hash_table.cc',
-        'dynamic_section.h',
-        'dynamic_section.cc',
-        'program_table.h',
-        'program_table.cc',
-        'relocations.h',
-        'relocations.cc',
-    ],
-    'elf_loader_impl_sources': [
-        'elf_loader_impl.h',
-        'elf_loader_impl.cc',
-    ],
-    'elf_loader_sys_sources': [
-        'elf_loader_sys_impl.h',
-        'elf_loader_sys_impl.cc',
-    ]
-  },
-  'targets': [
-    {
-      'target_name': 'elf_loader',
-      'type': 'static_library',
-      'include_dirs': [
-        'src/include',
-        'src/src/',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/elf_loader/evergreen_config.gyp:evergreen_config',
-        '<(DEPTH)/starboard/elf_loader/evergreen_info.gyp:evergreen_info',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/third_party/lz4_lib/lz4.gyp:lz4',
-      ],
-      'sources': [
-        '<@(common_elf_loader_sources)',
-        '<@(elf_loader_impl_sources)',
-      ],
-    },
-    {
-      # System loader based on dlopen/dlsym.
-      # Should be used only for debugging/troubleshooting.
-      'target_name': 'elf_loader_sys',
-      'type': 'static_library',
-      'include_dirs': [
-        'src/include',
-        'src/src/',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/elf_loader/evergreen_config.gyp:evergreen_config',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'sources': [
-        '<@(common_elf_loader_sources)',
-        '<@(elf_loader_sys_sources)',
-      ],
-      'conditions': [
-        ['sb_evergreen_compatible == 1', {
-          'dependencies': [
-            '<(DEPTH)/third_party/crashpad/wrapper/wrapper.gyp:crashpad_wrapper',
-          ],
-        }, {
-          'dependencies': [
-            '<(DEPTH)/third_party/crashpad/wrapper/wrapper.gyp:crashpad_wrapper_stub',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'elf_loader_sandbox',
-      'type': '<(final_executable_type)',
-      'include_dirs': [
-        'src/include',
-        'src/src/',
-      ],
-      'dependencies': [
-        'elf_loader',
-        '<(DEPTH)/cobalt/content/fonts/fonts.gyp:copy_font_data',
-        '<(DEPTH)/starboard/elf_loader/sabi_string.gyp:sabi_string',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        # TODO: Remove this dependency once MediaSession is migrated to use CobaltExtensions.
-        '<@(cobalt_platform_dependencies)',
-      ],
-      'sources': [
-        'sandbox.cc',
-      ],
-    },
-    {
-      'target_name': 'elf_loader_sandbox_deploy',
-      'type': 'none',
-      'dependencies': [
-        'elf_loader_sandbox',
-      ],
-      'variables': {
-        'executable_name': 'elf_loader_sandbox',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      # To properly function the system loader requires the starboard
-      # symbols to be exported from the binary.
-      # To allow symbols to be exported remove the '-fvisibility=hidden' flag
-      # from your compiler_flags.gypi. For Linux this would be:
-      #   starboard/linux/shared/compiler_flags.gypi
-      # Example run:
-      # export LD_LIBRARY_PATH=.
-      # ./elf_loader_sys_sandbox --evergreen_library=app/cobalt/lib/libcobalt.so --evergreen_content=app/cobalt/content
-      'target_name': 'elf_loader_sys_sandbox',
-      'type': '<(final_executable_type)',
-      'include_dirs': [
-        'src/include',
-        'src/src/',
-      ],
-      'dependencies': [
-        'elf_loader_sys',
-        '<(DEPTH)/starboard/elf_loader/sabi_string.gyp:sabi_string',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'sources': [
-        'sandbox.cc',
-      ],
-      'ldflags': [
-        '-Wl,--dynamic-list=<(DEPTH)/starboard/starboard.syms',
-        '-ldl' ,
-      ],
-    },
-    {
-      'target_name': 'elf_loader_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        '<(DEPTH)/starboard/common/test_main.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        # TODO: Remove this dependency once MediaSession is migrated to use CobaltExtensions.
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'conditions': [
-        ['target_arch in ["x86", "x64", "arm", "arm64"] ', {
-          'sources': [
-            'dynamic_section_test.cc',
-            'elf_loader_test.cc',
-            'elf_header_test.cc',
-            'lz4_file_impl_test.cc',
-            'program_table_test.cc',
-            'relocations_test.cc',
-          ],
-          'dependencies': [
-            'copy_elf_loader_testdata',
-            'elf_loader',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'elf_loader_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'elf_loader_test',
-      ],
-      'variables': {
-        'executable_name': 'elf_loader_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      'target_name': 'copy_elf_loader_testdata',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<(DEPTH)/starboard/elf_loader/testdata/',
-        ],
-        'content_test_output_subdir': 'starboard/elf_loader/testdata',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/copy_test_data.gypi' ],
-    },
-  ]
-}
diff --git a/starboard/elf_loader/elf_loader.h b/starboard/elf_loader/elf_loader.h
index 587c7a6..f8f9e26 100644
--- a/starboard/elf_loader/elf_loader.h
+++ b/starboard/elf_loader/elf_loader.h
@@ -38,11 +38,15 @@
   // Loads the shared library. Returns false if |library_path| or |content_path|
   // is empty, or if the library could not be loaded.
   // An optional |custom_get_extension| function pointer can be passed in order
-  // to override the |SbSystemGetExtension| function.
+  // to override the |SbSystemGetExtension| function. The flags
+  // |use_compression| and |use_memory_mapped_file| are not compatible so only
+  // one of those can be turned on.
   bool Load(const std::string& library_path,
             const std::string& content_path,
             bool is_relative_path,
-            const void* (*custom_get_extension)(const char* name) = NULL);
+            const void* (*custom_get_extension)(const char* name) = NULL,
+            bool use_compression = false,
+            bool use_memory_mapped_file = false);
 
   // Looks up the symbol address in the
   // shared library.
diff --git a/starboard/elf_loader/elf_loader_impl.cc b/starboard/elf_loader/elf_loader_impl.cc
index cf392a9..fc7c635 100644
--- a/starboard/elf_loader/elf_loader_impl.cc
+++ b/starboard/elf_loader/elf_loader_impl.cc
@@ -40,17 +40,21 @@
 }  // namespace
 
 ElfLoaderImpl::ElfLoaderImpl() {
-#if SB_API_VERSION < 12 || !(SB_API_VERSION >= 12 || SB_HAS(MMAP)) || \
-    !SB_CAN(MAP_EXECUTABLE_MEMORY)
-  SB_CHECK(false) << "The elf_loader requires SB_API_VERSION >= 12 with "
+#if !SB_CAN(MAP_EXECUTABLE_MEMORY)
+  SB_CHECK(false) << "The elf_loader requires "
                      "executable memory map support!";
 #endif
 }
 
-bool ElfLoaderImpl::Load(
-    const char* name,
-    const void* (*custom_get_extension)(const char* name)) {
-  if (EndsWith(name, kCompressionSuffix)) {
+bool ElfLoaderImpl::Load(const char* name,
+                         bool use_compression,
+                         bool use_memory_mapped_files) {
+  if (use_compression && use_memory_mapped_files) {
+    SB_LOG(ERROR) << "Loading " << name
+                  << " Compression is not supported with memory mapped files.";
+    return false;
+  }
+  if (use_compression && EndsWith(name, kCompressionSuffix)) {
     elf_file_.reset(new LZ4FileImpl());
     SB_LOG(INFO) << "Loading " << name << " using compression";
   } else {
@@ -67,13 +71,18 @@
 
   SB_DLOG(INFO) << "Loaded ELF header";
 
-  const auto* memory_mapped_file_extension =
-      reinterpret_cast<const CobaltExtensionMemoryMappedFileApi*>(
-          SbSystemGetExtension(kCobaltExtensionMemoryMappedFileName));
-  if (memory_mapped_file_extension &&
-      strcmp(memory_mapped_file_extension->name,
-             kCobaltExtensionMemoryMappedFileName) == 0 &&
-      memory_mapped_file_extension->version >= 1) {
+  if (use_memory_mapped_files) {
+    const auto* memory_mapped_file_extension =
+        reinterpret_cast<const CobaltExtensionMemoryMappedFileApi*>(
+            SbSystemGetExtension(kCobaltExtensionMemoryMappedFileName));
+
+    if (!memory_mapped_file_extension ||
+        strcmp(memory_mapped_file_extension->name,
+               kCobaltExtensionMemoryMappedFileName) != 0 ||
+        memory_mapped_file_extension->version < 1) {
+      SB_LOG(ERROR) << "CobaltExtensionMemoryMappedFileApi not implemented";
+      return false;
+    }
     program_table_.reset(new ProgramTable(memory_mapped_file_extension));
   } else {
     program_table_.reset(new ProgramTable(nullptr));
@@ -114,7 +123,7 @@
   }
   SB_DLOG(INFO) << "Initialized dynamic section";
 
-  exported_symbols_.reset(new ExportedSymbols(custom_get_extension));
+  exported_symbols_.reset(new ExportedSymbols());
   relocations_.reset(new Relocations(program_table_->GetBaseMemoryAddress(),
                                      dynamic_section_.get(),
                                      exported_symbols_.get()));
@@ -138,14 +147,12 @@
   }
 
   if (relocations_->HasTextRelocations()) {
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
     // Restores the memory protection to its original state.
     if (program_table_->AdjustMemoryProtectionOfReadOnlySegments(
             kSbMemoryMapProtectReserved) < 0) {
       SB_LOG(ERROR) << "Unable to restore segment protection";
       return false;
     }
-#endif
   }
 
   SB_DLOG(INFO) << "Applied relocations";
diff --git a/starboard/elf_loader/elf_loader_impl.h b/starboard/elf_loader/elf_loader_impl.h
index 84c43c7..02ee7a3 100644
--- a/starboard/elf_loader/elf_loader_impl.h
+++ b/starboard/elf_loader/elf_loader_impl.h
@@ -34,7 +34,8 @@
  public:
   ElfLoaderImpl();
   bool Load(const char* file_name,
-            const void* (*custom_get_extension)(const char* name));
+            bool use_compression,
+            bool use_memory_mapped_file);
   void* LookupSymbol(const char* symbol);
   ~ElfLoaderImpl();
 
diff --git a/starboard/elf_loader/elf_loader_sys_impl.cc b/starboard/elf_loader/elf_loader_sys_impl.cc
index fd1c0a2..a64234a 100644
--- a/starboard/elf_loader/elf_loader_sys_impl.cc
+++ b/starboard/elf_loader/elf_loader_sys_impl.cc
@@ -24,9 +24,9 @@
 
 ElfLoaderImpl::ElfLoaderImpl() {}
 
-bool ElfLoaderImpl::Load(
-    const char* name,
-    const void* (*custom_get_extension)(const char* name)) {
+bool ElfLoaderImpl::Load(const char* name,
+                         bool use_compression,
+                         bool use_memory_mapped_file) {
   SB_LOG(INFO) << "Loading: " << name;
 
   // Creating the instance forces the binary to keep all the symbols.
diff --git a/starboard/elf_loader/elf_loader_sys_impl.h b/starboard/elf_loader/elf_loader_sys_impl.h
index 7f148a5..b004a54 100644
--- a/starboard/elf_loader/elf_loader_sys_impl.h
+++ b/starboard/elf_loader/elf_loader_sys_impl.h
@@ -25,7 +25,8 @@
  public:
   ElfLoaderImpl();
   bool Load(const char* file_name,
-            const void* (*custom_get_extension)(const char* name) = NULL);
+            bool use_compression = false,
+            bool use_memory_mapped_file = false);
   void* LookupSymbol(const char* symbol);
   ~ElfLoaderImpl();
 
diff --git a/starboard/elf_loader/elf_loader_test.cc b/starboard/elf_loader/elf_loader_test.cc
index 303d0ff..af58b3c 100644
--- a/starboard/elf_loader/elf_loader_test.cc
+++ b/starboard/elf_loader/elf_loader_test.cc
@@ -17,14 +17,13 @@
 #include "starboard/common/scoped_ptr.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12 && (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && \
-    SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
 namespace starboard {
 namespace elf_loader {
 
 namespace {
 
-// TODO: implement using real shared library fro the file system.
+// TODO: implement using real shared library for the file system.
 class ElfLoaderTest : public ::testing::Test {
  protected:
   ElfLoaderTest() {}
@@ -38,5 +37,4 @@
 }  // namespace
 }  // namespace elf_loader
 }  // namespace starboard
-#endif  // SB_API_VERSION >= 12 && (SB_API_VERSION >= 12
-        // || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
+#endif  // SB_CAN(MAP_EXECUTABLE_MEMORY)
diff --git a/starboard/elf_loader/evergreen_config.gyp b/starboard/elf_loader/evergreen_config.gyp
deleted file mode 100644
index 19f3950..0000000
--- a/starboard/elf_loader/evergreen_config.gyp
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'evergreen_config',
-      'type': 'static_library',
-      'sources': [
-        'evergreen_config.h',
-        'evergreen_config.cc',
-      ],
-    },
-  ],
-}
diff --git a/starboard/elf_loader/evergreen_info.gyp b/starboard/elf_loader/evergreen_info.gyp
deleted file mode 100644
index 03a14ac..0000000
--- a/starboard/elf_loader/evergreen_info.gyp
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'evergreen_info',
-      'type': 'static_library',
-      'sources': [
-        'evergreen_info.h',
-        'evergreen_info.cc',
-      ],
-    },
-  ],
-}
diff --git a/starboard/elf_loader/exported_symbols.cc b/starboard/elf_loader/exported_symbols.cc
index 111f5f0..612c47b 100644
--- a/starboard/elf_loader/exported_symbols.cc
+++ b/starboard/elf_loader/exported_symbols.cc
@@ -59,8 +59,7 @@
 namespace starboard {
 namespace elf_loader {
 
-ExportedSymbols::ExportedSymbols(
-    const void* (*custom_get_extension)(const char* name)) {
+ExportedSymbols::ExportedSymbols() {
   REGISTER_SYMBOL(SbAccessibilityGetDisplaySettings);
   REGISTER_SYMBOL(SbAccessibilityGetTextToSpeechSettings);
   REGISTER_SYMBOL(SbAudioSinkCreate);
@@ -109,9 +108,7 @@
   REGISTER_SYMBOL(SbDrmCreateSystem);
   REGISTER_SYMBOL(SbDrmDestroySystem);
   REGISTER_SYMBOL(SbDrmGenerateSessionUpdateRequest);
-#if SB_API_VERSION >= 12
   REGISTER_SYMBOL(SbDrmGetMetrics);
-#endif  // SB_API_VERSION >= 12
   REGISTER_SYMBOL(SbDrmUpdateSession);
   REGISTER_SYMBOL(SbEventCancel);
   REGISTER_SYMBOL(SbEventSchedule);
@@ -320,32 +317,17 @@
   REGISTER_SYMBOL(SbSystemGetPath);
   REGISTER_SYMBOL(SbGetEglInterface);
   REGISTER_SYMBOL(SbGetGlesInterface);
-
-#if SB_API_VERSION >= 12
   REGISTER_SYMBOL(SbFileAtomicReplace);
-#endif  // SB_API_VERSION >= 12
 
 #if SB_CAN(MAP_EXECUTABLE_MEMORY)
   REGISTER_SYMBOL(SbMemoryFlush);
 #endif  // SB_CAN(MAP_EXECUTABLE_MEMORY)
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   REGISTER_SYMBOL(SbPlayerGetPreferredOutputMode);
-#else
-  REGISTER_SYMBOL(SbPlayerOutputModeSupported);
-#endif
-
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
   REGISTER_SYMBOL(SbMemoryMap);
   REGISTER_SYMBOL(SbMemoryUnmap);
   REGISTER_SYMBOL(SbMemoryProtect);
-#endif  // SB_HAS(MMAP)
-
-#if SB_API_VERSION >= 12
   REGISTER_SYMBOL(SbUiNavGetInterface);
-#endif  // SB_API_VERSION >= 12
-
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   REGISTER_SYMBOL(SbWindowBlurOnScreenKeyboard);
   REGISTER_SYMBOL(SbWindowFocusOnScreenKeyboard);
   REGISTER_SYMBOL(SbWindowGetOnScreenKeyboardBoundingRect);
@@ -355,19 +337,9 @@
   REGISTER_SYMBOL(SbWindowShowOnScreenKeyboard);
   REGISTER_SYMBOL(SbWindowOnScreenKeyboardSuggestionsSupported);
   REGISTER_SYMBOL(SbWindowUpdateOnScreenKeyboardSuggestions);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-
-#if SB_API_VERSION >= 12
   REGISTER_SYMBOL(SbWindowOnScreenKeyboardIsSupported);
-#endif  // SB_API_VERSION >= 12
-
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   REGISTER_SYMBOL(SbAccessibilityGetCaptionSettings);
   REGISTER_SYMBOL(SbAccessibilitySetCaptionsEnabled);
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
-
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
   REGISTER_SYMBOL(SbMicrophoneClose);
   REGISTER_SYMBOL(SbMicrophoneCreate);
   REGISTER_SYMBOL(SbMicrophoneDestroy);
@@ -375,44 +347,22 @@
   REGISTER_SYMBOL(SbMicrophoneIsSampleRateSupported);
   REGISTER_SYMBOL(SbMicrophoneOpen);
   REGISTER_SYMBOL(SbMicrophoneRead);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
-#if SB_API_VERSION >= 12
   REGISTER_SYMBOL(SbSocketIsIpv6Supported);
-#endif
-
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_SYNTHESIS)
   REGISTER_SYMBOL(SbSpeechSynthesisCancel);
   REGISTER_SYMBOL(SbSpeechSynthesisSpeak);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(SPEECH_SYNTHESIS)
-
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
   REGISTER_SYMBOL(SbTimeGetMonotonicThreadNow);
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(TIME_THREAD_NOW)
-
 #if SB_API_VERSION == 12
   REGISTER_SYMBOL(SbSpeechRecognizerIsSupported);
 #endif
-#if SB_API_VERSION == 12 || (SB_API_VERSION < 12 && SB_HAS(SPEECH_RECOGNIZER))
+#if SB_API_VERSION == 12
   REGISTER_SYMBOL(SbSpeechRecognizerCreate);
   REGISTER_SYMBOL(SbSpeechRecognizerDestroy);
   REGISTER_SYMBOL(SbSpeechRecognizerStart);
   REGISTER_SYMBOL(SbSpeechRecognizerStop);
   REGISTER_SYMBOL(SbSpeechRecognizerCancel);
-#endif  // SB_API_VERSION >= 12 ||
-        // (SB_API_VERSION < 12 && SB_HAS(SPEECH_RECOGNIZER))
-
-#if SB_API_VERSION >= 12
+#endif  // SB_API_VERSION == 12
   REGISTER_SYMBOL(SbSpeechSynthesisIsSupported);
-#endif
-
-#if SB_API_VERSION >= 12
   REGISTER_SYMBOL(SbTimeIsTimeThreadNowSupported);
-#endif
-
   REGISTER_SYMBOL(SbDrmIsServerCertificateUpdatable);
   REGISTER_SYMBOL(SbDrmUpdateServerCertificate);
   REGISTER_SYMBOL(SbMediaGetAudioBufferBudget);
@@ -444,8 +394,6 @@
   REGISTER_SYMBOL(SbThreadSamplerIsSupported);
   REGISTER_SYMBOL(SbThreadSamplerThaw);
   REGISTER_SYMBOL(SbWindowGetDiagonalSizeInInches);
-
-#if SB_API_VERSION >= 12
   REGISTER_SYMBOL(kSbDefaultMmapThreshold);
   REGISTER_SYMBOL(kSbFileMaxName);
   REGISTER_SYMBOL(kSbFileMaxOpen);
@@ -471,8 +419,6 @@
   REGISTER_SYMBOL(kSbPathSepString);
   REGISTER_SYMBOL(kSbPreferredRgbaByteOrder);
   REGISTER_SYMBOL(kSbUserMaxSignedIn);
-#endif  // SB_API_VERSION >= 12
-
 #if SB_API_VERSION >= 13
   REGISTER_SYMBOL(SbSystemNetworkIsDisconnected);
 #endif  // SB_API_VERSION >= 13
diff --git a/starboard/elf_loader/exported_symbols.h b/starboard/elf_loader/exported_symbols.h
index e246214..d385e1d 100644
--- a/starboard/elf_loader/exported_symbols.h
+++ b/starboard/elf_loader/exported_symbols.h
@@ -32,10 +32,7 @@
 // outside of the set represented in this class.
 class ExportedSymbols {
  public:
-  // An optional |custom_get_extension| function pointer can be passed in order
-  // to override the |SbSystemGetExtension| function.
-  explicit ExportedSymbols(
-      const void* (*custom_get_extension)(const char* name) = NULL);
+  ExportedSymbols();
   const void* Lookup(const char* name);
 
  private:
diff --git a/starboard/elf_loader/program_table.cc b/starboard/elf_loader/program_table.cc
index 61d823c..824a68f 100644
--- a/starboard/elf_loader/program_table.cc
+++ b/starboard/elf_loader/program_table.cc
@@ -80,7 +80,7 @@
   SB_DLOG(INFO) << "page_max - page_min=" << page_max - page_min;
 
   if (memory_mapped_file_extension_) {
-    SB_DLOG(INFO) << "Memory mapped file for the program header";
+    SB_LOG(INFO) << "Using memory mapped file for the program header";
     phdr_mmap_ = memory_mapped_file_extension_->MemoryMapFile(
         NULL, elf_file->GetName().c_str(), kSbMemoryMapProtectRead, page_min,
         phdr_size_);
@@ -91,7 +91,6 @@
 
     SB_DLOG(INFO) << "Allocated address=" << phdr_mmap_;
   } else {
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
     phdr_mmap_ =
         SbMemoryMap(phdr_size_, kSbMemoryMapProtectWrite, "program_header");
     if (!phdr_mmap_) {
@@ -100,16 +99,12 @@
     }
 
     SB_DLOG(INFO) << "Allocated address=" << phdr_mmap_;
-#else
-    SB_CHECK(false);
-#endif
     if (!elf_file->ReadFromOffset(page_min, reinterpret_cast<char*>(phdr_mmap_),
                                   phdr_size_)) {
       SB_LOG(ERROR) << "Failed to read program header from file offset: "
                     << page_min;
       return false;
     }
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
     bool mp_result =
         SbMemoryProtect(phdr_mmap_, phdr_size_, kSbMemoryMapProtectRead);
     SB_DLOG(INFO) << "mp_result=" << mp_result;
@@ -117,9 +112,6 @@
       SB_LOG(ERROR) << "Failed to protect program header";
       return false;
     }
-#else
-    SB_CHECK(false);
-#endif
   }
 
   phdr_table_ = reinterpret_cast<Phdr*>(reinterpret_cast<char*>(phdr_mmap_) +
@@ -195,7 +187,7 @@
                   << " file_length=" << file_length << " seg_page_start=0x"
                   << std::hex << seg_page_start;
 
-#if (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
     if (file_length != 0) {
       const int prot_flags = PFLAGS_TO_PROT(phdr->p_flags);
       SB_DLOG(INFO) << "segment prot_flags=" << std::hex << prot_flags;
@@ -258,7 +250,7 @@
     // between them. This is done by using a private anonymous
     // map for all extra pages.
     if (seg_page_end > seg_file_end) {
-#if (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
       bool mprotect_fix = SbMemoryProtect(reinterpret_cast<void*>(seg_file_end),
                                           seg_page_end - seg_file_end,
                                           kSbMemoryMapProtectWrite);
@@ -273,7 +265,7 @@
 
       memset(reinterpret_cast<void*>(seg_file_end), 0,
              seg_page_end - seg_file_end);
-#if (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
       SbMemoryProtect(reinterpret_cast<void*>(seg_file_end),
                       seg_page_end - seg_file_end,
                       PFLAGS_TO_PROT(phdr->p_flags));
@@ -367,7 +359,7 @@
     Addr seg_page_start = PAGE_START(phdr->p_vaddr) + base_memory_address_;
     Addr seg_page_end =
         PAGE_END(phdr->p_vaddr + phdr->p_memsz) + base_memory_address_;
-#if (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
     int ret = SbMemoryProtect(reinterpret_cast<void*>(seg_page_start),
                               seg_page_end - seg_page_start,
                               PFLAGS_TO_PROT(phdr->p_flags) | extra_prot_flags);
@@ -390,7 +382,6 @@
 
   SB_DLOG(INFO) << "Load size=" << load_size_;
 
-#if (SB_API_VERSION >= 12 || SB_HAS(MMAP))
   load_start_ =
       SbMemoryMap(load_size_, kSbMemoryMapProtectReserved, "reserved_mem");
   if (load_start_ == MAP_FAILED) {
@@ -398,9 +389,6 @@
                   << " bytes of address space";
     return false;
   }
-#else
-  SB_CHECK(false);
-#endif
   base_memory_address_ = reinterpret_cast<Addr>(load_start_);
   SB_LOG(INFO) << "Load start=" << std::hex << load_start_
                << " base_memory_address=0x" << base_memory_address_;
@@ -432,16 +420,12 @@
 
 ProgramTable::~ProgramTable() {
   SetEvergreenInfo(NULL);
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
   if (load_start_) {
     SbMemoryUnmap(load_start_, load_size_);
   }
   if (phdr_mmap_) {
     SbMemoryUnmap(phdr_mmap_, phdr_size_);
   }
-#else
-  SB_CHECK(false);
-#endif
 }
 
 }  // namespace elf_loader
diff --git a/starboard/elf_loader/program_table_test.cc b/starboard/elf_loader/program_table_test.cc
index 3a23711..b8c5c1b 100644
--- a/starboard/elf_loader/program_table_test.cc
+++ b/starboard/elf_loader/program_table_test.cc
@@ -22,8 +22,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12 && (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && \
-    SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
 namespace starboard {
 namespace elf_loader {
 
@@ -190,5 +189,4 @@
 }  // namespace
 }  // namespace elf_loader
 }  // namespace starboard
-#endif  // SB_API_VERSION >= 12 && (SB_API_VERSION >= 12
-        // || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
+#endif  // SB_CAN(MAP_EXECUTABLE_MEMORY)
diff --git a/starboard/elf_loader/relocations_test.cc b/starboard/elf_loader/relocations_test.cc
index 71d0d12..ef68406 100644
--- a/starboard/elf_loader/relocations_test.cc
+++ b/starboard/elf_loader/relocations_test.cc
@@ -20,8 +20,7 @@
 #include "starboard/string.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12 && (SB_API_VERSION >= 12 || SB_HAS(MMAP)) && \
-    SB_CAN(MAP_EXECUTABLE_MEMORY)
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
 namespace starboard {
 namespace elf_loader {
 
@@ -383,5 +382,4 @@
 }  // namespace
 }  // namespace elf_loader
 }  // namespace starboard
-#endif  // SB_API_VERSION >= 12 && (SB_API_VERSION >= 12
-        // || SB_HAS(MMAP)) && SB_CAN(MAP_EXECUTABLE_MEMORY)
+#endif  // SB_CAN(MAP_EXECUTABLE_MEMORY)
diff --git a/starboard/elf_loader/sabi_string.cc b/starboard/elf_loader/sabi_string.cc
index d80ebf5..2204160 100644
--- a/starboard/elf_loader/sabi_string.cc
+++ b/starboard/elf_loader/sabi_string.cc
@@ -22,17 +22,12 @@
 extern "C" {
 
 const char* GetEvergreenSabiString() {
-#if SB_API_VERSION >= 12
   return SB_SABI_JSON_ID;
-#else
-  return NULL;
-#endif  // SB_API_VERSION >= 12
 }
 
 }  // extern "C"
 
 bool CheckSabi(const char* (*sabi_function)()) {
-#if SB_API_VERSION >= 12
   if (!sabi_function) {
     SB_LOG(ERROR) << "Missing sabi_function";
     return false;
@@ -44,7 +39,4 @@
     return false;
   }
   return true;
-#else
-  return false;
-#endif  // SB_API_VERSION >= 12
 }
diff --git a/starboard/elf_loader/sabi_string.gyp b/starboard/elf_loader/sabi_string.gyp
deleted file mode 100644
index a39390e..0000000
--- a/starboard/elf_loader/sabi_string.gyp
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'sabi_string',
-      'type': 'static_library',
-      'sources': [
-        'sabi_string.cc',
-        'sabi_string.h',
-      ],
-    },
-  ],
-}
diff --git a/starboard/elf_loader/sandbox.cc b/starboard/elf_loader/sandbox.cc
index 9f4e044..019309f 100644
--- a/starboard/elf_loader/sandbox.cc
+++ b/starboard/elf_loader/sandbox.cc
@@ -24,7 +24,6 @@
 #include "starboard/mutex.h"
 #include "starboard/shared/starboard/command_line.h"
 #include "starboard/string.h"
-#include "starboard/thread_types.h"
 #include "third_party/crashpad/wrapper/annotations.h"
 #include "third_party/crashpad/wrapper/wrapper.h"
 
diff --git a/starboard/event.h b/starboard/event.h
index 029e629..9d6e367 100644
--- a/starboard/event.h
+++ b/starboard/event.h
@@ -370,7 +370,6 @@
   // SbEventWindowSizeChangedData.
   kSbEventTypeWindowSizeChanged,
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   // The platform has shown the on screen keyboard. This event is triggered by
   // the system or by the application's OnScreenKeyboard show method. The event
   // has int data representing a ticket. The ticket is used by the application
@@ -417,24 +416,18 @@
   // ticket value kSbEventOnScreenKeyboardInvalidTicket.
   kSbEventTypeOnScreenKeyboardSuggestionsUpdated,
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
   // One or more of the fields returned by SbAccessibilityGetCaptionSettings
   // has changed.
   kSbEventTypeAccessibilityCaptionSettingsChanged,
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 
 // clang-format off
 
-#if SB_API_VERSION >= 12
   // The platform's text-to-speech settings have changed.
 #if SB_API_VERSION >= 13
   kSbEventTypeAccessibilityTextToSpeechSettingsChanged,
 #else
   kSbEventTypeAccessiblityTextToSpeechSettingsChanged,
 #endif  // SB_API_VERSION >= 13
-#endif  // SB_API_VERSION >= 12
 
 // clang-format on
 
@@ -452,7 +445,7 @@
   // the device is just connected to the internet. This event is used
   // to implement window.ononline DOM event.
   kSbEventTypeOsNetworkConnected,
-#endif  // SB_API_VERSION >= SB_EXPERIMENTAL_API_VERSION
+#endif  // SB_API_VERSION >= 13
 
 #if SB_API_VERSION >= 13
   // The platform has detected a date and/or time configuration change (such
diff --git a/starboard/evergreen/arm/hardfp/configuration_public.h b/starboard/evergreen/arm/hardfp/configuration_public.h
index 2120d33..d7aa206 100644
--- a/starboard/evergreen/arm/hardfp/configuration_public.h
+++ b/starboard/evergreen/arm/hardfp/configuration_public.h
@@ -127,12 +127,6 @@
 
 // --- Memory Configuration --------------------------------------------------
 
-// Whether this platform has and should use an MMAP function to map physical
-// memory to the virtual address space.
-#if SB_API_VERSION < 12
-#define SB_HAS_MMAP 1
-#endif
-
 // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
 // required for platforms that want to JIT.
 #define SB_CAN_MAP_EXECUTABLE_MEMORY 1
diff --git a/starboard/evergreen/arm/hardfp/gyp_configuration.gypi b/starboard/evergreen/arm/hardfp/gyp_configuration.gypi
deleted file mode 100644
index 4ba76c1..0000000
--- a/starboard/evergreen/arm/hardfp/gyp_configuration.gypi
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'sb_target_platform': 'evergreen-arm-hardfp',
-  },
-  'target_defaults': {
-    'default_configuration': 'evergreen-arm-hardfp_debug',
-    'configurations': {
-      'evergreen-arm-hardfp_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-arm-hardfp_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-arm-hardfp_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-arm-hardfp_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/arm/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm/hardfp/gyp_configuration.py b/starboard/evergreen/arm/hardfp/gyp_configuration.py
index db3e2cb..9f61101 100644
--- a/starboard/evergreen/arm/hardfp/gyp_configuration.py
+++ b/starboard/evergreen/arm/hardfp/gyp_configuration.py
@@ -20,6 +20,4 @@
 
 
 def CreatePlatformConfig():
-  return parent_configuration.EvergreenArmConfiguration(
-      'evergreen-arm-hardfp',
-      sabi_json_path='starboard/sabi/arm/hardfp/sabi-v{sb_api_version}.json')
+  return parent_configuration.EvergreenArmConfiguration('evergreen-arm-hardfp')
diff --git a/starboard/evergreen/arm/hardfp/platform_configuration/configuration.gni b/starboard/evergreen/arm/hardfp/platform_configuration/configuration.gni
index b9758e2..02e7644 100644
--- a/starboard/evergreen/arm/hardfp/platform_configuration/configuration.gni
+++ b/starboard/evergreen/arm/hardfp/platform_configuration/configuration.gni
@@ -15,3 +15,4 @@
 import("//starboard/evergreen/shared/platform_configuration/configuration.gni")
 
 sabi_path = "//starboard/sabi/arm/hardfp/sabi-v$sb_api_version.json"
+install_target_path = "//starboard/evergreen/arm/shared/install_target.gni"
diff --git a/starboard/evergreen/arm/hardfp/sbversion/12/atomic_public.h b/starboard/evergreen/arm/hardfp/sbversion/12/atomic_public.h
deleted file mode 100644
index 7f66416..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/12/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_12_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_12_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/arm/hardfp/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_12_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/arm/hardfp/sbversion/12/configuration_public.h b/starboard/evergreen/arm/hardfp/sbversion/12/configuration_public.h
deleted file mode 100644
index 4be69b0..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/12/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for X86_64. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/arm/hardfp/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_12_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/arm/hardfp/sbversion/12/gyp_configuration.gypi b/starboard/evergreen/arm/hardfp/sbversion/12/gyp_configuration.gypi
deleted file mode 100644
index 0c67bd5..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/12/gyp_configuration.gypi
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'sb_target_platform': 'evergreen-arm-hardfp',
-  },
-  'target_defaults': {
-    'default_configuration': 'evergreen-arm-hardfp-sbversion-12_debug',
-    'configurations': {
-      'evergreen-arm-hardfp-sbversion-12_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-arm-hardfp-sbversion-12_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-arm-hardfp-sbversion-12_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-arm-hardfp-sbversion-12_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/arm/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm/hardfp/sbversion/12/gyp_configuration.py b/starboard/evergreen/arm/hardfp/sbversion/12/gyp_configuration.py
deleted file mode 100644
index 6097401..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/12/gyp_configuration.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-"""Starboard evergreen-arm-hardfp platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.arm.shared import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenArmConfiguration(
-      'evergreen-arm-hardfp-sbversion-12',
-      sabi_json_path='starboard/sabi/arm/hardfp/sabi-v12.json')
diff --git a/starboard/evergreen/arm/hardfp/sbversion/12/starboard_platform.gyp b/starboard/evergreen/arm/hardfp/sbversion/12/starboard_platform.gyp
deleted file mode 100644
index 29566d2..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/12/starboard_platform.gyp
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/arm/hardfp/starboard_platform.gyp',
-  ],
-}
-
diff --git a/starboard/evergreen/arm/hardfp/sbversion/12/test_filters.py b/starboard/evergreen/arm/hardfp/sbversion/12/test_filters.py
deleted file mode 100644
index f1521c8..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/12/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen ARM Hard FP Platform Test Filters."""
-
-from starboard.evergreen.arm.hardfp import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.EvergreenArmHardFPTestFilters()
diff --git a/starboard/evergreen/arm/hardfp/sbversion/12/thread_types_public.h b/starboard/evergreen/arm/hardfp/sbversion/12/thread_types_public.h
deleted file mode 100644
index 903d6bd..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/12/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/arm/hardfp/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/arm/hardfp/sbversion/13/atomic_public.h b/starboard/evergreen/arm/hardfp/sbversion/13/atomic_public.h
deleted file mode 100644
index af45085..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/13/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/arm/hardfp/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/arm/hardfp/sbversion/13/configuration_public.h b/starboard/evergreen/arm/hardfp/sbversion/13/configuration_public.h
deleted file mode 100644
index 3287655..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/13/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for X86_64. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/arm/hardfp/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.gypi b/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.gypi
deleted file mode 100644
index 64ff1ab..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.gypi
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'sb_target_platform': 'evergreen-arm-hardfp',
-  },
-  'target_defaults': {
-    'default_configuration': 'evergreen-arm-hardfp-sbversion-13_debug',
-    'configurations': {
-      'evergreen-arm-hardfp-sbversion-13_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-arm-hardfp-sbversion-13_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-arm-hardfp-sbversion-13_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-arm-hardfp-sbversion-13_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/arm/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.py b/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.py
deleted file mode 100644
index 3cfa91a..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/13/gyp_configuration.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-"""Starboard evergreen-arm-hardfp platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.arm.shared import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenArmConfiguration(
-      'evergreen-arm-hardfp-sbversion-13',
-      sabi_json_path='starboard/sabi/arm/hardfp/sabi-v13.json')
diff --git a/starboard/evergreen/arm/hardfp/sbversion/13/starboard_platform.gyp b/starboard/evergreen/arm/hardfp/sbversion/13/starboard_platform.gyp
deleted file mode 100644
index b7ff227..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/13/starboard_platform.gyp
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/arm/hardfp/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/arm/hardfp/sbversion/13/test_filters.py b/starboard/evergreen/arm/hardfp/sbversion/13/test_filters.py
deleted file mode 100644
index f1521c8..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/13/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen ARM Hard FP Platform Test Filters."""
-
-from starboard.evergreen.arm.hardfp import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.EvergreenArmHardFPTestFilters()
diff --git a/starboard/evergreen/arm/hardfp/sbversion/13/thread_types_public.h b/starboard/evergreen/arm/hardfp/sbversion/13/thread_types_public.h
deleted file mode 100644
index e83e2b5..0000000
--- a/starboard/evergreen/arm/hardfp/sbversion/13/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/arm/hardfp/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/arm/hardfp/starboard_platform.gyp b/starboard/evergreen/arm/hardfp/starboard_platform.gyp
deleted file mode 100644
index 8787f61..0000000
--- a/starboard/evergreen/arm/hardfp/starboard_platform.gyp
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/shared/starboard_platform.gyp',
-  ],
-}
-
diff --git a/starboard/evergreen/arm/hardfp/thread_types_public.h b/starboard/evergreen/arm/hardfp/thread_types_public.h
deleted file mode 100644
index fda18eb..0000000
--- a/starboard/evergreen/arm/hardfp/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_ARM_HARDFP_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_HARDFP_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/shared/pthread/types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_HARDFP_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/arm/hardfp/toolchain/BUILD.gn b/starboard/evergreen/arm/hardfp/toolchain/BUILD.gn
index ac87933..2673ab2 100644
--- a/starboard/evergreen/arm/hardfp/toolchain/BUILD.gn
+++ b/starboard/evergreen/arm/hardfp/toolchain/BUILD.gn
@@ -14,7 +14,7 @@
 
 import("//build/config/clang/clang.gni")
 import("//build/toolchain/gcc_toolchain.gni")
-import("//starboard/evergreen/arm/shared/toolchain/toolchain.gni")
+import("//starboard/evergreen/shared/toolchain/toolchain.gni")
 
 clang_toolchain("host") {
   clang_base_path = clang_base_path
@@ -26,14 +26,16 @@
 }
 
 gcc_toolchain("target") {
-  cc = evergreen_arm_target_cc
-  cxx = evergreen_arm_target_cxx
-  ld = evergreen_arm_target_ld
-  ar = evergreen_arm_target_ar
-  nm = evergreen_arm_target_nm
-  extra_ldflags = evergreen_arm_target_extra_ldflags
+  cc = evergreen_target_cc
+  cxx = evergreen_target_cxx
+  ld = evergreen_target_ld
+  ar = evergreen_target_ar
+  nm = evergreen_target_nm
+
+  evergreen_target_extra_ldflags += [ "-m armelf" ]
+  extra_ldflags = string_join(" ", evergreen_target_extra_ldflags)
 
   toolchain_args = {
-    is_clang = false
+    is_clang = true
   }
 }
diff --git a/starboard/evergreen/arm/shared/cobalt/configuration.gypi b/starboard/evergreen/arm/shared/cobalt/configuration.gypi
deleted file mode 100644
index 89aca9a..0000000
--- a/starboard/evergreen/arm/shared/cobalt/configuration.gypi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Cobalt Evergreen ARM specific configuration.
-
-{
-  'variables': {
-    'in_app_dial%': 0,
-  }, # end of variables
-}
diff --git a/starboard/evergreen/arm/shared/cobalt/configuration.py b/starboard/evergreen/arm/shared/cobalt/configuration.py
index c2776d3..721b265 100644
--- a/starboard/evergreen/arm/shared/cobalt/configuration.py
+++ b/starboard/evergreen/arm/shared/cobalt/configuration.py
@@ -13,8 +13,6 @@
 # limitations under the License.
 """Starboard Cobalt Evergreen ARM configuration."""
 
-import os
-
 from cobalt.build import cobalt_configuration
 from starboard.tools.testing import test_filter
 
@@ -22,26 +20,12 @@
 class CobaltARMConfiguration(cobalt_configuration.CobaltConfiguration):
   """Starboard Cobalt Evergreen ARM configuration."""
 
-  def __init__(self, platform_configuration, application_name,
-               application_directory):
+  def __init__(  # pylint:disable=useless-super-delegation
+      self, platform_configuration, application_name, application_directory):
     super(CobaltARMConfiguration,
           self).__init__(platform_configuration, application_name,
                          application_directory)
 
-  def GetPostIncludes(self):
-    # If there isn't a configuration.gypi found in the usual place, we'll
-    # supplement with our shared implementation.
-    includes = super(CobaltARMConfiguration, self).GetPostIncludes()
-    for include in includes:
-      if os.path.basename(include) == 'configuration.gypi':
-        return includes
-
-    shared_gypi_path = os.path.join(
-        os.path.dirname(__file__), 'configuration.gypi')
-    if os.path.isfile(shared_gypi_path):
-      includes.append(shared_gypi_path)
-    return includes
-
   def WebdriverBenchmarksEnabled(self):
     return True
 
diff --git a/starboard/evergreen/arm/shared/gyp_configuration.gypi b/starboard/evergreen/arm/shared/gyp_configuration.gypi
deleted file mode 100644
index 4192b6c..0000000
--- a/starboard/evergreen/arm/shared/gyp_configuration.gypi
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/arm',
-
-      # Force char to be signed.
-      '-fsigned-char',
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-
-    'linker_flags': [
-      '-fuse-ld=lld',
-    ],
-  },
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm/shared/gyp_configuration.py b/starboard/evergreen/arm/shared/gyp_configuration.py
index d347240..6d44f50 100644
--- a/starboard/evergreen/arm/shared/gyp_configuration.py
+++ b/starboard/evergreen/arm/shared/gyp_configuration.py
@@ -15,84 +15,17 @@
 
 import os.path
 
-from starboard.build import clang as clang_build
 from starboard.evergreen.shared import gyp_configuration as shared_configuration
-from starboard.tools.testing import test_filter
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import evergreen_linker
-from starboard.tools.toolchain import touch
 
 
 class EvergreenArmConfiguration(shared_configuration.EvergreenConfiguration):
   """Starboard Evergreen ARM platform configuration."""
 
-  def __init__(self,
-               platform='evergreen-arm',
-               asan_enabled_by_default=False,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(EvergreenArmConfiguration, self).__init__(platform,
-                                                    asan_enabled_by_default,
-                                                    sabi_json_path)
+  def __init__(self, platform):
+    super(EvergreenArmConfiguration, self).__init__(platform)
 
     self.AppendApplicationConfigurationPath(os.path.dirname(__file__))
 
-  def GetTargetToolchain(self, **kwargs):
-    return self.GetHostToolchain(**kwargs)
-
-  def GetHostToolchain(self, **kwargs):
-    if not hasattr(self, '_host_toolchain'):
-      env_variables = self.GetEnvironmentVariables()
-      cc_path = env_variables['CC_host']
-      cxx_path = env_variables['CXX_host']
-
-      # Takes the provided value of CXX_HOST with a prepended 'ccache' and an
-      # appended 'bin/clang++' and strips them off, leaving us with an absolute
-      # path to the root directory of our toolchain.
-      begin_path_index = cxx_path.find('/')
-      end_path_index = cxx_path.rfind('/', 0, cxx_path.rfind('/')) + 1
-      cxx_path_root = cxx_path[begin_path_index:end_path_index]
-
-      self._host_toolchain = [
-          clang.CCompiler(path=cc_path),
-          clang.CxxCompiler(path=cxx_path),
-          clang.AssemblerWithCPreprocessor(path=cc_path),
-          ar.StaticThinLinker(),
-          ar.StaticLinker(),
-          clangxx.ExecutableLinker(path=cxx_path),
-          evergreen_linker.SharedLibraryLinker(
-              path=cxx_path_root, extra_flags=['-m armelf']),
-          cp.Copy(),
-          touch.Stamp(),
-          bash.Shell(),
-      ]
-    return self._host_toolchain
-
-  def GetTestFilters(self):
-    filters = super(EvergreenArmConfiguration, self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
-      filters.extend(test_filter.TestFilter(target, test) for test in tests)
-    return filters
-
-  def GetVariables(self, configuration):
-    variables = super(EvergreenArmConfiguration,
-                      self).GetVariables(configuration)
-    variables.update({
-        'include_path_platform_deploy_gypi':
-            'starboard/evergreen/arm/shared/platform_deploy.gypi',
-    })
-    return variables
-
-  __FILTERED_TESTS = {  # pylint: disable=invalid-name
-      'nplb': ['SbSystemGetStackTest.SunnyDayStackDirection',
-               'SbSystemGetStackTest.SunnyDay',
-               'SbSystemGetStackTest.SunnyDayShortStack',
-               'SbSystemSymbolizeTest.SunnyDay'],
-  }
-
 
 def CreatePlatformConfig():
-  return EvergreenArmConfiguration()
+  return EvergreenArmConfiguration('evergreen-arm')
diff --git a/starboard/evergreen/arm/shared/install_target.gni b/starboard/evergreen/arm/shared/install_target.gni
new file mode 100644
index 0000000..c111ebf
--- /dev/null
+++ b/starboard/evergreen/arm/shared/install_target.gni
@@ -0,0 +1,23 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/evergreen/arm/shared/toolchain/strip.gni")
+import("//starboard/evergreen/shared/strip_install_target.gni")
+
+template("install_target") {
+  strip_install_target(target_name) {
+    forward_variables_from(invoker, "*")
+    strip_executable = strip_executable
+  }
+}
diff --git a/starboard/evergreen/arm/shared/platform_deploy.gypi b/starboard/evergreen/arm/shared/platform_deploy.gypi
deleted file mode 100644
index fef9168..0000000
--- a/starboard/evergreen/arm/shared/platform_deploy.gypi
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'deploy_executable_file': '<(target_deploy_dir)/lib/lib<(executable_name).so',
-    'executable_file': '<(PRODUCT_DIR)/lib/lib<(executable_name).so',
-  },
-  'includes': [ '<(DEPTH)/starboard/build/collect_deploy_content.gypi' ],
-  'actions': [
-    {
-      'action_name': 'deploy_executable',
-      'message': 'Strip executable: <(deploy_executable_file)',
-      'inputs': [
-        '<(executable_file)',
-        '<(content_deploy_stamp_file)',
-      ],
-      'outputs': [ '<(deploy_executable_file)' ],
-      'action': [
-        'arm-linux-gnueabi-strip',
-        '-o', '<(deploy_executable_file)',
-        '<(executable_file)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/evergreen/arm/shared/test_filters.py b/starboard/evergreen/arm/shared/test_filters.py
index 00d578a..a038da0 100644
--- a/starboard/evergreen/arm/shared/test_filters.py
+++ b/starboard/evergreen/arm/shared/test_filters.py
@@ -16,6 +16,15 @@
 from starboard.evergreen.shared import test_filters as shared_test_filters
 from starboard.tools.testing import test_filter
 
+_FILTERED_TESTS = {
+    'nplb': [
+        'SbSystemGetStackTest.SunnyDayStackDirection',
+        'SbSystemGetStackTest.SunnyDay',
+        'SbSystemGetStackTest.SunnyDayShortStack',
+        'SbSystemSymbolizeTest.SunnyDay'
+    ],
+}
+
 
 def CreateTestFilters():
   return EvergreenArmTestFilters()
@@ -26,15 +35,6 @@
 
   def GetTestFilters(self):
     filters = super(EvergreenArmTestFilters, self).GetTestFilters()
-    for target, tests in self._FILTERED_TESTS.iteritems():
+    for target, tests in _FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
-
-  _FILTERED_TESTS = {
-      'nplb': [
-          'SbSystemGetStackTest.SunnyDayStackDirection',
-          'SbSystemGetStackTest.SunnyDay',
-          'SbSystemGetStackTest.SunnyDayShortStack',
-          'SbSystemSymbolizeTest.SunnyDay'
-      ],
-  }
diff --git a/starboard/evergreen/arm/shared/toolchain/strip.gni b/starboard/evergreen/arm/shared/toolchain/strip.gni
new file mode 100644
index 0000000..a216322
--- /dev/null
+++ b/starboard/evergreen/arm/shared/toolchain/strip.gni
@@ -0,0 +1,15 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+strip_executable = "arm-linux-gnueabi-strip"
diff --git a/starboard/evergreen/arm/shared/toolchain/toolchain.gni b/starboard/evergreen/arm/shared/toolchain/toolchain.gni
deleted file mode 100644
index 6fa7de4..0000000
--- a/starboard/evergreen/arm/shared/toolchain/toolchain.gni
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import("//build/config/clang/clang.gni")
-
-prefix = rebase_path("$clang_base_path/bin", root_build_dir)
-evergreen_arm_target_cc = "$prefix/clang"
-evergreen_arm_target_cxx = "$prefix/clang++"
-evergreen_arm_target_ld = "$prefix/ld.lld"
-evergreen_arm_target_ar = "${prefix}/llvm-ar"
-evergreen_arm_target_nm = "nm"
-
-# TODO(b/206642994): see if any of these flags, migrated from
-# starboard/tools/toolchain/evergreen_linker.py, can be removed.
-extra_ldflags_list = [
-  "--build-id",
-  "--gc-sections",
-  "-X",
-  "-v",
-  "-eh-frame-hdr",
-  "--fini=__cxa_finalize",
-  "-m armelf",
-  "-shared",
-  "-L$clang_base_path",
-  "-L/usr/lib",
-  "-L/lib",
-  "-nostdlib",
-  "--whole-archive",
-  "--no-whole-archive",
-  "-u GetEvergreenSabiString",
-]
-evergreen_arm_target_extra_ldflags = string_join(" ", extra_ldflags_list)
diff --git a/starboard/evergreen/arm/softfp/configuration_public.h b/starboard/evergreen/arm/softfp/configuration_public.h
index b86b925..dea0581 100644
--- a/starboard/evergreen/arm/softfp/configuration_public.h
+++ b/starboard/evergreen/arm/softfp/configuration_public.h
@@ -130,12 +130,6 @@
 
 // --- Memory Configuration --------------------------------------------------
 
-// Whether this platform has and should use an MMAP function to map physical
-// memory to the virtual address space.
-#if SB_API_VERSION < 12
-#define SB_HAS_MMAP 1
-#endif
-
 // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
 // required for platforms that want to JIT.
 #define SB_CAN_MAP_EXECUTABLE_MEMORY 1
diff --git a/starboard/evergreen/arm/softfp/gyp_configuration.gypi b/starboard/evergreen/arm/softfp/gyp_configuration.gypi
deleted file mode 100644
index cd963f7..0000000
--- a/starboard/evergreen/arm/softfp/gyp_configuration.gypi
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'sb_target_platform': 'evergreen-arm-softfp',
-  },
-  'target_defaults': {
-    'default_configuration': 'evergreen-arm-softfp_debug',
-    'configurations': {
-      'evergreen-arm-softfp_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-arm-softfp_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-arm-softfp_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-arm-softfp_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/arm/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm/softfp/gyp_configuration.py b/starboard/evergreen/arm/softfp/gyp_configuration.py
index 46418c1..c673f49 100644
--- a/starboard/evergreen/arm/softfp/gyp_configuration.py
+++ b/starboard/evergreen/arm/softfp/gyp_configuration.py
@@ -20,6 +20,4 @@
 
 
 def CreatePlatformConfig():
-  return parent_configuration.EvergreenArmConfiguration(
-      'evergreen-arm-softfp',
-      sabi_json_path='starboard/sabi/arm/softfp/sabi-v{sb_api_version}.json')
+  return parent_configuration.EvergreenArmConfiguration('evergreen-arm-softfp')
diff --git a/starboard/evergreen/arm/softfp/platform_configuration/configuration.gni b/starboard/evergreen/arm/softfp/platform_configuration/configuration.gni
index 98e1fe6..a192a70 100644
--- a/starboard/evergreen/arm/softfp/platform_configuration/configuration.gni
+++ b/starboard/evergreen/arm/softfp/platform_configuration/configuration.gni
@@ -15,3 +15,4 @@
 import("//starboard/evergreen/shared/platform_configuration/configuration.gni")
 
 sabi_path = "//starboard/sabi/arm/softfp/sabi-v$sb_api_version.json"
+install_target_path = "//starboard/evergreen/arm/shared/install_target.gni"
diff --git a/starboard/evergreen/arm/softfp/sbversion/12/atomic_public.h b/starboard/evergreen/arm/softfp/sbversion/12/atomic_public.h
deleted file mode 100644
index d11da25..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/12/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_12_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_12_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/arm/softfp/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_12_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/arm/softfp/sbversion/12/configuration_public.h b/starboard/evergreen/arm/softfp/sbversion/12/configuration_public.h
deleted file mode 100644
index e4f45f4..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/12/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for X86_64. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/arm/softfp/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_12_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/arm/softfp/sbversion/12/gyp_configuration.gypi b/starboard/evergreen/arm/softfp/sbversion/12/gyp_configuration.gypi
deleted file mode 100644
index d31f2b7..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/12/gyp_configuration.gypi
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'sb_target_platform': 'evergreen-arm-softfp',
-  },
-  'target_defaults': {
-    'default_configuration': 'evergreen-arm-softfp-sbversion-12_debug',
-    'configurations': {
-      'evergreen-arm-softfp-sbversion-12_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-arm-softfp-sbversion-12_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-arm-softfp-sbversion-12_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-arm-softfp-sbversion-12_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/arm/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm/softfp/sbversion/12/gyp_configuration.py b/starboard/evergreen/arm/softfp/sbversion/12/gyp_configuration.py
deleted file mode 100644
index f5d1aff..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/12/gyp_configuration.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-"""Starboard evergreen-arm-softfp platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.arm.shared import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenArmConfiguration(
-      'evergreen-arm-softfp-sbversion-12',
-      sabi_json_path='starboard/sabi/arm/softfp/sabi-v12.json')
diff --git a/starboard/evergreen/arm/softfp/sbversion/12/starboard_platform.gyp b/starboard/evergreen/arm/softfp/sbversion/12/starboard_platform.gyp
deleted file mode 100644
index b4aa959..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/12/starboard_platform.gyp
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/arm/softfp/starboard_platform.gyp',
-  ],
-}
-
diff --git a/starboard/evergreen/arm/softfp/sbversion/12/test_filters.py b/starboard/evergreen/arm/softfp/sbversion/12/test_filters.py
deleted file mode 100644
index 9287f67..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/12/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen ARM Soft FP Platform Test Filters."""
-
-from starboard.evergreen.arm.softfp import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.EvergreenArmSoftFPTestFilters()
diff --git a/starboard/evergreen/arm/softfp/sbversion/12/thread_types_public.h b/starboard/evergreen/arm/softfp/sbversion/12/thread_types_public.h
deleted file mode 100644
index ac72552..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/12/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/arm/softfp/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/arm/softfp/sbversion/13/atomic_public.h b/starboard/evergreen/arm/softfp/sbversion/13/atomic_public.h
deleted file mode 100644
index b67fc64..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/13/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/arm/softfp/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/arm/softfp/sbversion/13/configuration_public.h b/starboard/evergreen/arm/softfp/sbversion/13/configuration_public.h
deleted file mode 100644
index d717491..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/13/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for X86_64. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/arm/softfp/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.gypi b/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.gypi
deleted file mode 100644
index 8ecb4de..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.gypi
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'sb_target_platform': 'evergreen-arm-softfp',
-  },
-  'target_defaults': {
-    'default_configuration': 'evergreen-arm-softfp-sbversion-13_debug',
-    'configurations': {
-      'evergreen-arm-softfp-sbversion-13_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-arm-softfp-sbversion-13_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-arm-softfp-sbversion-13_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-arm-softfp-sbversion-13_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/arm/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.py b/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.py
deleted file mode 100644
index 6bfdced..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/13/gyp_configuration.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-"""Starboard evergreen-arm-softfp platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.arm.shared import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenArmConfiguration(
-      'evergreen-arm-softfp-sbversion-13',
-      sabi_json_path='starboard/sabi/arm/softfp/sabi-v13.json')
diff --git a/starboard/evergreen/arm/softfp/sbversion/13/starboard_platform.gyp b/starboard/evergreen/arm/softfp/sbversion/13/starboard_platform.gyp
deleted file mode 100644
index 5abba9c..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/13/starboard_platform.gyp
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/arm/softfp/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/arm/softfp/sbversion/13/test_filters.py b/starboard/evergreen/arm/softfp/sbversion/13/test_filters.py
deleted file mode 100644
index 9287f67..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/13/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen ARM Soft FP Platform Test Filters."""
-
-from starboard.evergreen.arm.softfp import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.EvergreenArmSoftFPTestFilters()
diff --git a/starboard/evergreen/arm/softfp/sbversion/13/thread_types_public.h b/starboard/evergreen/arm/softfp/sbversion/13/thread_types_public.h
deleted file mode 100644
index 555151a..0000000
--- a/starboard/evergreen/arm/softfp/sbversion/13/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/arm/softfp/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/arm/softfp/starboard_platform.gyp b/starboard/evergreen/arm/softfp/starboard_platform.gyp
deleted file mode 100644
index 8787f61..0000000
--- a/starboard/evergreen/arm/softfp/starboard_platform.gyp
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/shared/starboard_platform.gyp',
-  ],
-}
-
diff --git a/starboard/evergreen/arm/softfp/thread_types_public.h b/starboard/evergreen/arm/softfp/thread_types_public.h
deleted file mode 100644
index d739119..0000000
--- a/starboard/evergreen/arm/softfp/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM_SOFTFP_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/shared/pthread/types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM_SOFTFP_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/arm/softfp/toolchain/BUILD.gn b/starboard/evergreen/arm/softfp/toolchain/BUILD.gn
index ac87933..2673ab2 100644
--- a/starboard/evergreen/arm/softfp/toolchain/BUILD.gn
+++ b/starboard/evergreen/arm/softfp/toolchain/BUILD.gn
@@ -14,7 +14,7 @@
 
 import("//build/config/clang/clang.gni")
 import("//build/toolchain/gcc_toolchain.gni")
-import("//starboard/evergreen/arm/shared/toolchain/toolchain.gni")
+import("//starboard/evergreen/shared/toolchain/toolchain.gni")
 
 clang_toolchain("host") {
   clang_base_path = clang_base_path
@@ -26,14 +26,16 @@
 }
 
 gcc_toolchain("target") {
-  cc = evergreen_arm_target_cc
-  cxx = evergreen_arm_target_cxx
-  ld = evergreen_arm_target_ld
-  ar = evergreen_arm_target_ar
-  nm = evergreen_arm_target_nm
-  extra_ldflags = evergreen_arm_target_extra_ldflags
+  cc = evergreen_target_cc
+  cxx = evergreen_target_cxx
+  ld = evergreen_target_ld
+  ar = evergreen_target_ar
+  nm = evergreen_target_nm
+
+  evergreen_target_extra_ldflags += [ "-m armelf" ]
+  extra_ldflags = string_join(" ", evergreen_target_extra_ldflags)
 
   toolchain_args = {
-    is_clang = false
+    is_clang = true
   }
 }
diff --git a/starboard/evergreen/arm64/args.gn b/starboard/evergreen/arm64/args.gn
new file mode 100644
index 0000000..4953927
--- /dev/null
+++ b/starboard/evergreen/arm64/args.gn
@@ -0,0 +1,17 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+target_platform = "evergreen-arm64"
+target_cpu = "arm64"
+target_os = "linux"
diff --git a/starboard/evergreen/arm64/configuration_public.h b/starboard/evergreen/arm64/configuration_public.h
index 8bc25ec..6e570ed 100644
--- a/starboard/evergreen/arm64/configuration_public.h
+++ b/starboard/evergreen/arm64/configuration_public.h
@@ -134,12 +134,6 @@
 // required for platforms that want to JIT.
 #define SB_CAN_MAP_EXECUTABLE_MEMORY 1
 
-// Whether this platform has and should use an MMAP function to map physical
-// memory to the virtual address space.
-#if SB_API_VERSION < 12
-#define SB_HAS_MMAP 1
-#endif
-
 // --- Network Configuration -------------------------------------------------
 
 // Specifies whether this platform supports IPV6.
diff --git a/starboard/evergreen/arm64/gyp_configuration.gypi b/starboard/evergreen/arm64/gyp_configuration.gypi
deleted file mode 100644
index f8843b2..0000000
--- a/starboard/evergreen/arm64/gyp_configuration.gypi
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-    'sb_target_platform': 'evergreen-arm64',
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/aarch64',
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-  },
-
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'default_configuration': 'evergreen-arm64_debug',
-    'configurations': {
-      'evergreen-arm64_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-arm64_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-arm64_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-arm64_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm64/gyp_configuration.py b/starboard/evergreen/arm64/gyp_configuration.py
index e8b282a..18f02cb 100644
--- a/starboard/evergreen/arm64/gyp_configuration.py
+++ b/starboard/evergreen/arm64/gyp_configuration.py
@@ -13,74 +13,13 @@
 # limitations under the License.
 """Starboard evergreen-arm64 platform configuration for gyp_cobalt."""
 
-from starboard.build import clang as clang_build
 from starboard.evergreen.shared import gyp_configuration as shared_configuration
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import evergreen_linker
-from starboard.tools.toolchain import touch
 
 
 class EvergreenArm64Configuration(shared_configuration.EvergreenConfiguration):
   """Starboard Evergreen 64-bit ARM platform configuration."""
-
-  def __init__(self,
-               platform='evergreen-arm64',
-               asan_enabled_by_default=False,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    # pylint: disable=useless-super-delegation
-    super(EvergreenArm64Configuration, self).__init__(platform,
-                                                      asan_enabled_by_default,
-                                                      sabi_json_path)
-
-  def GetTargetToolchain(self, **kwargs):
-    return self.GetHostToolchain(**kwargs)
-
-  def GetHostToolchain(self, **kwargs):
-    if not hasattr(self, '_host_toolchain'):
-      env_variables = self.GetEnvironmentVariables()
-      cc_path = env_variables['CC_host']
-      cxx_path = env_variables['CXX_host']
-
-      # Takes the provided value of CXX_HOST with a prepended 'ccache' and an
-      # appended 'bin/clang++' and strips them off, leaving us with an absolute
-      # path to the root directory of our toolchain.
-      begin_path_index = cxx_path.find('/')
-      end_path_index = cxx_path.rfind('/', 0, cxx_path.rfind('/')) + 1
-      cxx_path_root = cxx_path[begin_path_index:end_path_index]
-
-      self._host_toolchain = [
-          clang.CCompiler(path=cc_path),
-          clang.CxxCompiler(path=cxx_path),
-          clang.AssemblerWithCPreprocessor(path=cc_path),
-          ar.StaticThinLinker(),
-          ar.StaticLinker(),
-          clangxx.ExecutableLinker(path=cxx_path),
-          evergreen_linker.SharedLibraryLinker(
-              path=cxx_path_root, extra_flags=['-m aarch64elf']),
-          cp.Copy(),
-          touch.Stamp(),
-          bash.Shell(),
-      ]
-    return self._host_toolchain
-
-  def GetTestFilters(self):
-    # pylint: disable=useless-super-delegation
-    return super(EvergreenArm64Configuration, self).GetTestFilters()
-
-  def GetVariables(self, configuration):
-    variables = super(EvergreenArm64Configuration,
-                      self).GetVariables(configuration)
-    variables.update({
-        'include_path_platform_deploy_gypi':
-            'starboard/evergreen/arm64/platform_deploy.gypi',
-    })
-    return variables
+  pass
 
 
 def CreatePlatformConfig():
-  return EvergreenArm64Configuration(
-      sabi_json_path='starboard/sabi/arm64/sabi-v{sb_api_version}.json')
+  return EvergreenArm64Configuration('evergreen-arm64')
diff --git a/starboard/evergreen/arm64/install_target.gni b/starboard/evergreen/arm64/install_target.gni
new file mode 100644
index 0000000..d965329
--- /dev/null
+++ b/starboard/evergreen/arm64/install_target.gni
@@ -0,0 +1,23 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/evergreen/arm64/toolchain/strip.gni")
+import("//starboard/evergreen/shared/strip_install_target.gni")
+
+template("install_target") {
+  strip_install_target(target_name) {
+    forward_variables_from(invoker, "*")
+    strip_executable = strip_executable
+  }
+}
diff --git a/starboard/evergreen/arm64/platform_configuration/BUILD.gn b/starboard/evergreen/arm64/platform_configuration/BUILD.gn
new file mode 100644
index 0000000..88bd7e6
--- /dev/null
+++ b/starboard/evergreen/arm64/platform_configuration/BUILD.gn
@@ -0,0 +1,40 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+config("sabi_flags") {
+  cflags = [
+    "-march=arm64v8a",
+    "-target",
+    "arm64v8a-unknown-unknown-elf",
+
+    # char is unsigned by default for arm64.
+    "-fsigned-char",
+  ]
+}
+
+config("platform_configuration") {
+  configs = [ "//starboard/build/config/sabi" ]
+
+  if (current_toolchain == default_toolchain) {
+    configs += [
+      ":sabi_flags",
+      "//starboard/evergreen/shared/platform_configuration",
+    ]
+
+    cflags = [ "-isystem" +
+               rebase_path("//third_party/musl/arch/aarch64", root_build_dir) ]
+  } else {
+    cflags = [ "-O2" ]
+  }
+}
diff --git a/starboard/evergreen/arm64/platform_configuration/configuration.gni b/starboard/evergreen/arm64/platform_configuration/configuration.gni
new file mode 100644
index 0000000..d26243c
--- /dev/null
+++ b/starboard/evergreen/arm64/platform_configuration/configuration.gni
@@ -0,0 +1,19 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/evergreen/shared/platform_configuration/configuration.gni")
+
+sabi_path = "//starboard/sabi/arm64/sabi-v$sb_api_version.json"
+arm_version = 8
+install_target_path = "//starboard/evergreen/arm64/install_target.gni"
diff --git a/starboard/evergreen/arm64/platform_deploy.gypi b/starboard/evergreen/arm64/platform_deploy.gypi
deleted file mode 100644
index f32c77f..0000000
--- a/starboard/evergreen/arm64/platform_deploy.gypi
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'deploy_executable_file': '<(target_deploy_dir)/lib/lib<(executable_name).so',
-    'executable_file': '<(PRODUCT_DIR)/lib/lib<(executable_name).so',
-  },
-  'includes': [ '<(DEPTH)/starboard/build/collect_deploy_content.gypi' ],
-  'actions': [
-    {
-      'action_name': 'deploy_executable',
-      'message': 'Strip executable: <(deploy_executable_file)',
-      'inputs': [
-        '<(executable_file)',
-        '<(content_deploy_stamp_file)',
-      ],
-      'outputs': [ '<(deploy_executable_file)' ],
-      'action': [
-        'aarch64-linux-gnu-strip',
-        '-o', '<(deploy_executable_file)',
-        '<(executable_file)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/evergreen/arm64/sbversion/12/atomic_public.h b/starboard/evergreen/arm64/sbversion/12/atomic_public.h
deleted file mode 100644
index 2604b7e..0000000
--- a/starboard/evergreen/arm64/sbversion/12/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_ARM64_SBVERSION_12_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM64_SBVERSION_12_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/arm64/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM64_SBVERSION_12_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/arm64/sbversion/12/configuration_public.h b/starboard/evergreen/arm64/sbversion/12/configuration_public.h
deleted file mode 100644
index 4ff33d9..0000000
--- a/starboard/evergreen/arm64/sbversion/12/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for X86_64. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_ARM64_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM64_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/arm64/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM64_SBVERSION_12_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/arm64/sbversion/12/gyp_configuration.gypi b/starboard/evergreen/arm64/sbversion/12/gyp_configuration.gypi
deleted file mode 100644
index 5460de1..0000000
--- a/starboard/evergreen/arm64/sbversion/12/gyp_configuration.gypi
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-    'sb_target_platform': 'evergreen-arm64',
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/aarch64',
-    ],
-  },
-
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'default_configuration': 'evergreen-arm64-sbversion-12_debug',
-    'configurations': {
-      'evergreen-arm64-sbversion-12_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-arm64-sbversion-12_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-arm64-sbversion-12_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-arm64-sbversion-12_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm64/sbversion/12/gyp_configuration.py b/starboard/evergreen/arm64/sbversion/12/gyp_configuration.py
deleted file mode 100644
index d2a4708..0000000
--- a/starboard/evergreen/arm64/sbversion/12/gyp_configuration.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard evergreen-arm64 platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.arm64 import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenArm64Configuration(
-      'evergreen-arm64-sbversion-12',
-      sabi_json_path='starboard/sabi/arm64/sabi-v12.json')
diff --git a/starboard/evergreen/arm64/sbversion/12/starboard_platform.gyp b/starboard/evergreen/arm64/sbversion/12/starboard_platform.gyp
deleted file mode 100644
index 6b4361f..0000000
--- a/starboard/evergreen/arm64/sbversion/12/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/arm64/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/arm64/sbversion/12/test_filters.py b/starboard/evergreen/arm64/sbversion/12/test_filters.py
deleted file mode 100644
index 37accf0..0000000
--- a/starboard/evergreen/arm64/sbversion/12/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen ARM64 Platform Test Filters."""
-
-from starboard.evergreen.arm64 import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.EvergreenArm64TestFilters
diff --git a/starboard/evergreen/arm64/sbversion/12/thread_types_public.h b/starboard/evergreen/arm64/sbversion/12/thread_types_public.h
deleted file mode 100644
index 14e88b4..0000000
--- a/starboard/evergreen/arm64/sbversion/12/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_ARM64_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM64_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/arm64/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM64_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/arm64/sbversion/13/atomic_public.h b/starboard/evergreen/arm64/sbversion/13/atomic_public.h
deleted file mode 100644
index e67d7af..0000000
--- a/starboard/evergreen/arm64/sbversion/13/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_ARM64_SBVERSION_13_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM64_SBVERSION_13_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/arm64/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM64_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/arm64/sbversion/13/configuration_public.h b/starboard/evergreen/arm64/sbversion/13/configuration_public.h
deleted file mode 100644
index 10bd72d..0000000
--- a/starboard/evergreen/arm64/sbversion/13/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for X86_64. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_ARM64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/arm64/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/arm64/sbversion/13/gyp_configuration.gypi b/starboard/evergreen/arm64/sbversion/13/gyp_configuration.gypi
deleted file mode 100644
index b7e7007..0000000
--- a/starboard/evergreen/arm64/sbversion/13/gyp_configuration.gypi
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-    'sb_target_platform': 'evergreen-arm64',
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/aarch64',
-    ],
-  },
-
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'default_configuration': 'evergreen-arm64-sbversion-13_debug',
-    'configurations': {
-      'evergreen-arm64-sbversion-13_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-arm64-sbversion-13_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-arm64-sbversion-13_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-arm64-sbversion-13_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/evergreen/arm64/sbversion/13/gyp_configuration.py b/starboard/evergreen/arm64/sbversion/13/gyp_configuration.py
deleted file mode 100644
index 6fc96e2..0000000
--- a/starboard/evergreen/arm64/sbversion/13/gyp_configuration.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard evergreen-arm64 platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.arm64 import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenArm64Configuration(
-      'evergreen-arm64-sbversion-13',
-      sabi_json_path='starboard/sabi/arm64/sabi-v13.json')
diff --git a/starboard/evergreen/arm64/sbversion/13/starboard_platform.gyp b/starboard/evergreen/arm64/sbversion/13/starboard_platform.gyp
deleted file mode 100644
index fbeb29d..0000000
--- a/starboard/evergreen/arm64/sbversion/13/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/arm64/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/arm64/sbversion/13/test_filters.py b/starboard/evergreen/arm64/sbversion/13/test_filters.py
deleted file mode 100644
index a58ce9a..0000000
--- a/starboard/evergreen/arm64/sbversion/13/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen ARM64 Platform Test Filters."""
-
-from starboard.evergreen.arm64 import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.EvergreenArm64TestFilters()
diff --git a/starboard/evergreen/arm64/sbversion/13/thread_types_public.h b/starboard/evergreen/arm64/sbversion/13/thread_types_public.h
deleted file mode 100644
index 313f24a..0000000
--- a/starboard/evergreen/arm64/sbversion/13/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_ARM64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/arm64/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/arm64/starboard_platform.gyp b/starboard/evergreen/arm64/starboard_platform.gyp
deleted file mode 100644
index 8fa33ef..0000000
--- a/starboard/evergreen/arm64/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/shared/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/arm64/thread_types_public.h b/starboard/evergreen/arm64/thread_types_public.h
deleted file mode 100644
index c156579..0000000
--- a/starboard/evergreen/arm64/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_ARM64_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_ARM64_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/shared/pthread/types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_ARM64_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/arm64/toolchain/BUILD.gn b/starboard/evergreen/arm64/toolchain/BUILD.gn
new file mode 100644
index 0000000..f571c39
--- /dev/null
+++ b/starboard/evergreen/arm64/toolchain/BUILD.gn
@@ -0,0 +1,41 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/clang/clang.gni")
+import("//build/toolchain/gcc_toolchain.gni")
+import("//starboard/evergreen/shared/toolchain/toolchain.gni")
+
+clang_toolchain("host") {
+  clang_base_path = clang_base_path
+
+  toolchain_args = {
+    current_os = "linux"
+    current_cpu = "x64"
+  }
+}
+
+gcc_toolchain("target") {
+  cc = evergreen_target_cc
+  cxx = evergreen_target_cxx
+  ld = evergreen_target_ld
+  ar = evergreen_target_ar
+  nm = evergreen_target_nm
+
+  evergreen_target_extra_ldflags += [ "-m aarch64elf" ]
+  extra_ldflags = string_join(" ", evergreen_target_extra_ldflags)
+
+  toolchain_args = {
+    is_clang = true
+  }
+}
diff --git a/starboard/evergreen/arm64/toolchain/strip.gni b/starboard/evergreen/arm64/toolchain/strip.gni
new file mode 100644
index 0000000..b054fec
--- /dev/null
+++ b/starboard/evergreen/arm64/toolchain/strip.gni
@@ -0,0 +1,15 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+strip_executable = "aarch64-linux-gnu-strip"
diff --git a/starboard/evergreen/sabi/sabi_flags.gypi b/starboard/evergreen/sabi/sabi_flags.gypi
deleted file mode 100644
index 160ef7f..0000000
--- a/starboard/evergreen/sabi/sabi_flags.gypi
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Starboard Application Binary Interface
-#
-# This file translates the set of ABI variables, which should be overridden by
-# each platform, into platform-specific sets of compiler flags.
-
-{
-  'variables': {
-    'conditions': [
-      # arm
-      ['target_arch=="arm"', {
-        'compiler_flags': [
-          '-march=arm<(target_arch_sub)',
-        ],
-        'conditions': [
-          ['floating_point_abi=="soft"', {
-            'compiler_flags': [
-              '-mfloat-abi=soft',
-            ],
-          }, {
-            'compiler_flags': [
-              '-mfloat-abi=<(floating_point_abi)',
-              '-mfpu=<(floating_point_fpu)',
-            ],
-          }],
-          ['floating_point_abi=="hard"', {
-            'compiler_flags': [
-              '-target', 'arm<(target_arch_sub)-none-eabihf',
-            ],
-          }, {
-            'compiler_flags': [
-              '-target', 'arm<(target_arch_sub)-none-eabi',
-            ],
-          }],
-        ],
-      }],
-      # arm64
-      ['target_arch=="arm64"', {
-        'compiler_flags': [
-          '-march=arm64<(target_arch_sub)',
-          '-target', 'arm64<(target_arch_sub)-unknown-unknown-elf',
-
-          # There is no software floating point support for arm64 / aarch64
-          # architectures. Thus, -mfloat-abi and -mfpu would simply be ignored.
-
-          # char is unsigned by default for arm64.
-          '-fsigned-char',
-        ],
-      }],
-      # x86
-      ['target_arch=="x86"', {
-        'compiler_flags': [
-          '-march=i686',
-          '-target', 'i686-unknown-unknown-elf',
-        ],
-      }],
-      # x64
-      ['target_arch=="x64"', {
-        'compiler_flags': [
-          '-march=x86-64',
-          '-target', 'x86_64-unknown-linux-elf',
-        ],
-      }],
-    ],
-  },
-}
-
diff --git a/starboard/evergreen/sabi/sbversion/12/sabi_flags.gypi b/starboard/evergreen/sabi/sbversion/12/sabi_flags.gypi
deleted file mode 100644
index 160ef7f..0000000
--- a/starboard/evergreen/sabi/sbversion/12/sabi_flags.gypi
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Starboard Application Binary Interface
-#
-# This file translates the set of ABI variables, which should be overridden by
-# each platform, into platform-specific sets of compiler flags.
-
-{
-  'variables': {
-    'conditions': [
-      # arm
-      ['target_arch=="arm"', {
-        'compiler_flags': [
-          '-march=arm<(target_arch_sub)',
-        ],
-        'conditions': [
-          ['floating_point_abi=="soft"', {
-            'compiler_flags': [
-              '-mfloat-abi=soft',
-            ],
-          }, {
-            'compiler_flags': [
-              '-mfloat-abi=<(floating_point_abi)',
-              '-mfpu=<(floating_point_fpu)',
-            ],
-          }],
-          ['floating_point_abi=="hard"', {
-            'compiler_flags': [
-              '-target', 'arm<(target_arch_sub)-none-eabihf',
-            ],
-          }, {
-            'compiler_flags': [
-              '-target', 'arm<(target_arch_sub)-none-eabi',
-            ],
-          }],
-        ],
-      }],
-      # arm64
-      ['target_arch=="arm64"', {
-        'compiler_flags': [
-          '-march=arm64<(target_arch_sub)',
-          '-target', 'arm64<(target_arch_sub)-unknown-unknown-elf',
-
-          # There is no software floating point support for arm64 / aarch64
-          # architectures. Thus, -mfloat-abi and -mfpu would simply be ignored.
-
-          # char is unsigned by default for arm64.
-          '-fsigned-char',
-        ],
-      }],
-      # x86
-      ['target_arch=="x86"', {
-        'compiler_flags': [
-          '-march=i686',
-          '-target', 'i686-unknown-unknown-elf',
-        ],
-      }],
-      # x64
-      ['target_arch=="x64"', {
-        'compiler_flags': [
-          '-march=x86-64',
-          '-target', 'x86_64-unknown-linux-elf',
-        ],
-      }],
-    ],
-  },
-}
-
diff --git a/starboard/evergreen/shared/compiler_flags.gypi b/starboard/evergreen/shared/compiler_flags.gypi
deleted file mode 100644
index c36ef4b..0000000
--- a/starboard/evergreen/shared/compiler_flags.gypi
+++ /dev/null
@@ -1,189 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Platform specific compiler flags for Evergreen. Included from
-# gyp_configuration.gypi.
-
-{
-  'variables': {
-    'compiler_flags_host': [
-      '-O2',
-    ],
-    'compiler_flags_debug': [
-      '-frtti',
-      '-O0',
-    ],
-    'compiler_flags_devel': [
-      '-frtti',
-      '-O2',
-    ],
-    'compiler_flags_qa': [
-      '-fno-rtti',
-      '-gline-tables-only',
-    ],
-    'compiler_flags_qa_size': [
-      '-Os',
-    ],
-    'compiler_flags_qa_speed': [
-      '-O2',
-    ],
-    'compiler_flags_gold': [
-      '-fno-rtti',
-      '-gline-tables-only',
-    ],
-    'compiler_flags_gold_size': [
-      '-Os',
-    ],
-    'compiler_flags_gold_speed': [
-      '-O2',
-    ],
-    'conditions': [
-      ['clang==1', {
-        'linker_flags': [
-          '-fuse-ld=lld',
-          '-nostdlib',
-        ],
-        'common_clang_flags': [
-          '-fcolor-diagnostics',
-          # Default visibility to hidden, to enable dead stripping.
-          '-fvisibility=hidden',
-          # Warns on switches on enums that cover all enum values but
-          # also contain a default: branch. Chrome is full of that.
-          '-Wno-covered-switch-default',
-          # protobuf uses hash_map.
-          '-Wno-deprecated',
-          '-fno-exceptions',
-          # Enable unwind tables used by libunwind for stack traces.
-          '-funwind-tables',
-          # Disable usage of frame pointers.
-          '-fomit-frame-pointer',
-          # Don't warn about the "struct foo f = {0};" initialization pattern.
-          '-Wno-missing-field-initializers',
-          # Do not warn for implicit sign conversions.
-          '-Wno-sign-conversion',
-          '-fno-strict-aliasing',  # See http://crbug.com/32204
-          '-Wno-unnamed-type-template-args',
-          # Triggered by the COMPILE_ASSERT macro.
-          '-Wno-unused-local-typedef',
-          # Do not warn if a function or variable cannot be implicitly
-          # instantiated.
-          '-Wno-undefined-var-template',
-          # Do not warn about an implicit exception spec mismatch.
-          '-Wno-implicit-exception-spec-mismatch',
-          # It's OK not to use some input parameters.
-          '-Wno-unused-parameter',
-          '-Wno-conversion',
-          '-Wno-bitwise-op-parentheses',
-          '-Wno-shift-op-parentheses',
-          '-Wno-shorten-64-to-32',
-          '-fno-use-cxa-atexit',
-        ],
-      }],
-      ['cobalt_fastbuild==0', {
-        'compiler_flags_debug': [
-          '-g',
-        ],
-        'compiler_flags_devel': [
-          '-g',
-        ],
-        'compiler_flags_qa': [
-          '-gline-tables-only',
-        ],
-        'compiler_flags_gold': [
-          '-gline-tables-only',
-        ],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'defines': [
-      # By default, <EGL/eglplatform.h> pulls in some X11 headers that have some
-      # nasty macros (|Status|, for example) that conflict with Chromium base.
-      'MESA_EGL_NO_X11_HEADERS'
-    ],
-    'cflags': [
-      '-fPIC',
-      '-nostdlibinc',
-      '-isystem<(cobalt_repo_root)/third_party/llvm-project/libcxxabi/include',
-      '-isystem<(cobalt_repo_root)/third_party/llvm-project/libunwind/include',
-      '-isystem<(cobalt_repo_root)/third_party/llvm-project/libcxx/include',
-      '-isystem<(cobalt_repo_root)/third_party/musl/include',
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/generic',
-    ],
-    'cflags_cc': [
-      '-nostdinc++',
-      '-std=c++14',
-    ],
-    'target_conditions': [
-      ['sb_pedantic_warnings==1', {
-        'cflags': [
-          '-Wall',
-          '-Wextra',
-          '-Wunreachable-code',
-          '<@(common_clang_flags)',
-        ],
-      },{
-        'cflags': [
-          '<@(common_clang_flags)',
-          # 'this' pointer cannot be NULL...pointer may be assumed
-          # to always convert to true.
-          '-Wno-undefined-bool-conversion',
-          # Skia doesn't use overrides.
-          '-Wno-inconsistent-missing-override',
-          # Do not warn for implicit type conversions that may change a value.
-          '-Wno-conversion',
-          # shifting a negative signed value is undefined
-          '-Wno-shift-negative-value',
-          # Width of bit-field exceeds width of its type- value will be truncated
-          '-Wno-bitfield-width',
-          '-Wno-undefined-var-template',
-        ],
-      }],
-      ['use_asan==1', {
-        'cflags': [
-          '-fsanitize=address',
-          '-fno-omit-frame-pointer',
-        ],
-        'ldflags': [
-          '-fsanitize=address',
-          # Force linking of the helpers in sanitizer_options.cc
-          '-Wl,-u_sanitizer_options_link_helper',
-        ],
-        'defines': [
-          'ADDRESS_SANITIZER',
-        ],
-        'conditions': [
-          ['asan_symbolizer_path!=""', {
-            'defines': [
-              'ASAN_SYMBOLIZER_PATH="<@(asan_symbolizer_path)"',
-            ],
-          }],
-        ],
-      }],
-      ['use_tsan==1', {
-        'cflags': [
-          '-fsanitize=thread',
-          '-fno-omit-frame-pointer',
-        ],
-        'ldflags': [
-          '-fsanitize=thread',
-        ],
-        'defines': [
-          'THREAD_SANITIZER',
-        ],
-      }],
-    ],
-  }, # end of target_defaults
-}
diff --git a/starboard/evergreen/shared/gyp_configuration.gypi b/starboard/evergreen/shared/gyp_configuration.gypi
deleted file mode 100644
index dc8fbed..0000000
--- a/starboard/evergreen/shared/gyp_configuration.gypi
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'sb_evergreen': 1,
-    'sb_speech_supported': 0,
-
-    'enable_vr': 0,
-    'default_renderer_options_dependency': '<(DEPTH)/cobalt/renderer/default_options_starboard.gyp:default_options',
-
-    'cobalt_font_package': 'empty',
-
-    # Override that omits the "data" subdirectory.
-    # TODO: Remove when omitted for all platforms in base_configuration.gypi.
-    'sb_static_contents_output_data_dir': '<(PRODUCT_DIR)/content',
-
-    'final_executable_type': 'shared_library',
-    'gtest_target_type': 'shared_library',
-  },
-  'target_defaults': {
-    'defines' : [
-      '_LIBCPP_HAS_MUSL_LIBC',
-      '__STDC_FORMAT_MACROS', # so that we get PRI*
-
-      # File format of the shared object we will generate.
-      '__ELF__',
-
-      # Use scalar portable implementations instead of Clang/GCC vector
-      # extensions in SkVx.h.
-      'SKNX_NO_SIMD',
-    ],
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/sabi/sabi_flags.gypi',
-    '<(DEPTH)/starboard/sabi/sabi.gypi',
-  ],
-}
diff --git a/starboard/evergreen/shared/gyp_configuration.py b/starboard/evergreen/shared/gyp_configuration.py
index 4d92efe..0cc51a6 100644
--- a/starboard/evergreen/shared/gyp_configuration.py
+++ b/starboard/evergreen/shared/gyp_configuration.py
@@ -15,88 +15,16 @@
 
 import os
 
-from starboard.build import clang
 from starboard.build import platform_configuration
-from starboard.tools import build
-from starboard.tools import paths
-from starboard.tools.testing import test_filter
 
 
 class EvergreenConfiguration(platform_configuration.PlatformConfiguration):
   """Starboard Evergreen platform configuration."""
 
-  def __init__(self,
-               platform,
-               asan_enabled_by_default=True,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(EvergreenConfiguration, self).__init__(platform,
-                                                 asan_enabled_by_default)
-
-    self.sabi_json_path = sabi_json_path
-
-  def GetBuildFormat(self):
-    """Returns the desired build format."""
-    # The comma means that ninja and qtcreator_ninja will be chained and use the
-    # same input information so that .gyp files will only have to be parsed
-    # once.
-    return 'ninja,qtcreator_ninja'
-
-  def GetVariables(self, config_name):
-    variables = super(EvergreenConfiguration, self).GetVariables(
-        config_name, use_clang=1)
-    variables.update({
-        'cobalt_repo_root':
-            paths.REPOSITORY_ROOT,
-        'include_path_platform_deploy_gypi':
-            'starboard/evergreen/shared/platform_deploy.gypi',
-    })
-    return variables
-
   def GetLauncherPath(self):
     """Gets the path to the launcher module for this platform."""
     return os.path.dirname(__file__)
 
-  def GetGeneratorVariables(self, config_name):
-    del config_name
-    generator_variables = {
-        'qtcreator_session_name_prefix': 'cobalt',
-    }
-    return generator_variables
-
-  def GetEnvironmentVariables(self):
-    if not hasattr(self, '_host_compiler_environment'):
-      self._host_compiler_environment = build.GetHostCompilerEnvironment(
-          clang.GetClangSpecification(), self.build_accelerator)
-
-    env_variables = self._host_compiler_environment
-    env_variables.update({
-        'CC': self._host_compiler_environment['CC_host'],
-        'CXX': self._host_compiler_environment['CXX_host'],
-    })
-    return env_variables
-
-  def GetPathToSabiJsonFile(self):
-    return self.sabi_json_path
-
-  def GetTestFilters(self):
-    filters = super(EvergreenConfiguration, self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
-      filters.extend(test_filter.TestFilter(target, test) for test in tests)
-    return filters
-
-  __FILTERED_TESTS = {  # pylint: disable=invalid-name
-      'nplb': ['MemoryReportingTest.CapturesOperatorDeleteNothrow',
-               'SbAudioSinkTest.*',
-               'SbDrmTest.AnySupportedKeySystems'],
-
-      # player_filter_tests test the platform's Starboard implementation of
-      # the filter-based player, which is not exposed through the Starboard
-      # interface. Since Evergreen has no visibility of the platform's
-      # specific Starboard implementation, rely on the platform to test this
-      # directly instead.
-      'player_filter_tests': [test_filter.FILTER_ALL],
-  }
-
   def GetTestTargets(self):
     tests = super(EvergreenConfiguration, self).GetTestTargets()
     tests.append('cobalt_slot_management_test')
diff --git a/starboard/evergreen/shared/launcher.py b/starboard/evergreen/shared/launcher.py
index 7e621a2..c8bf2d5 100644
--- a/starboard/evergreen/shared/launcher.py
+++ b/starboard/evergreen/shared/launcher.py
@@ -17,7 +17,6 @@
 import os
 import shutil
 
-import _env  # pylint: disable=unused-import
 from starboard.tools import abstract_launcher
 from starboard.tools import paths
 from starboard.tools import port_symlink
@@ -163,11 +162,15 @@
     os.makedirs(self.staging_directory)
 
     if os.path.exists(os.path.join(self.loader_out_directory, 'install')):
-      self._StageTargetsAndContentsGn()
+      # TODO: Make the Linux launcher run from the install_directory
+      if 'linux' in self.loader_platform:
+        self._StageTargetsAndContentsGnLinux()
+      else:
+        self._StageTargetsAndContentsGnRaspi()
     else:
       self._StageTargetsAndContentsGyp()
 
-  def _StageTargetsAndContentsGn(self):
+  def _StageTargetsAndContentsGnLinux(self):
     content_subdir = os.path.join('usr', 'share', 'cobalt')
 
     # Copy loader content and binaries
@@ -202,6 +205,58 @@
     os.makedirs(os.path.join(target_staging_dir, 'lib'))
     shutil.copy(target_binary_src, target_binary_dst)
 
+  def _StageTargetsAndContentsGnRaspi(self):
+    # TODO(b/218889313): `content` is hardcoded on raspi and must be in the same
+    # directory as the binaries.
+    if 'raspi' in self.loader_platform:
+      content_subdir = 'content'
+      bin_subdir = ''
+    else:
+      content_subdir = os.path.join('usr', 'share', 'cobalt')
+      bin_subdir = 'bin'
+
+    # Copy loader content and binaries to
+    loader_install_path = os.path.join(self.loader_out_directory, 'install')
+    # raspi is a packaged platform and the loader target is the staging target.
+    staging_directory_loader = os.path.join(self.staging_directory, 'install',
+                                            self.loader_target)
+
+    loader_content_src = os.path.join(loader_install_path, content_subdir)
+    loader_content_dst = os.path.join(staging_directory_loader, 'content')
+    shutil.copytree(loader_content_src, loader_content_dst)
+
+    loader_binary_src = os.path.join(loader_install_path, bin_subdir)
+    loader_target_src = os.path.join(loader_binary_src, self.loader_target,
+                                     self.loader_target)
+    loader_target_dst = os.path.join(staging_directory_loader,
+                                     self.loader_target)
+    shutil.copy(loader_target_src, loader_target_dst)
+
+    crashpad_target_src = os.path.join(loader_binary_src, _CRASHPAD_TARGET,
+                                       _CRASHPAD_TARGET)
+    crashpad_target_dst = os.path.join(staging_directory_loader,
+                                       _CRASHPAD_TARGET)
+    os.makedirs(crashpad_target_dst)
+    shutil.copy(crashpad_target_src, crashpad_target_dst)
+
+    # Copy target content and binary
+    target_install_path = os.path.join(self.out_directory, 'install')
+    target_staging_dir = os.path.join(staging_directory_loader, 'content',
+                                      'app', self.target_name)
+    os.makedirs(target_staging_dir)
+
+    # TODO(b/218889313): Reset the content path for the evergreen artifacts.
+    content_subdir = os.path.join('usr', 'share', 'cobalt')
+    target_content_src = os.path.join(target_install_path, content_subdir)
+    target_content_dst = os.path.join(target_staging_dir, 'content')
+    shutil.copytree(target_content_src, target_content_dst)
+
+    shlib_name = 'lib{}.so'.format(self.target_name)
+    target_binary_src = os.path.join(target_install_path, 'lib', shlib_name)
+    target_binary_dst = os.path.join(target_staging_dir, 'lib', shlib_name)
+    os.makedirs(os.path.join(target_staging_dir, 'lib'))
+    shutil.copy(target_binary_src, target_binary_dst)
+
   def _StageTargetsAndContentsGyp(self):
     # <outpath>/deploy/elf_loader_sandbox
     staging_directory_loader = os.path.join(self.staging_directory, 'deploy',
diff --git a/starboard/evergreen/shared/platform_deploy.gypi b/starboard/evergreen/shared/platform_deploy.gypi
deleted file mode 100644
index e1a3d29..0000000
--- a/starboard/evergreen/shared/platform_deploy.gypi
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'deploy_executable_file': '<(target_deploy_dir)/lib/lib<(executable_name).so',
-    'executable_file': '<(PRODUCT_DIR)/lib/lib<(executable_name).so',
-  },
-  'includes': [
-    '<(DEPTH)/starboard/build/collect_deploy_content.gypi',
-  ],
-  'actions': [
-    {
-      'action_name': 'deploy_executable',
-      'message': 'Deploy <(deploy_executable_file)',
-      'inputs': [
-        '<(content_deploy_stamp_file)',
-        '<(executable_file)',
-      ],
-      'outputs': [ '<(deploy_executable_file)' ],
-      'action': [
-        'python2',
-        '<(DEPTH)/starboard/tools/port_symlink.py',
-        '-f',
-        '-r',
-        '--link',
-        '<(executable_file)',
-        '<(deploy_executable_file)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/evergreen/shared/starboard_platform.gyp b/starboard/evergreen/shared/starboard_platform.gyp
deleted file mode 100644
index 5b6a143..0000000
--- a/starboard/evergreen/shared/starboard_platform.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is intentionally left empty. Each platform directory must have a
-# starboard_platform.gyp file to be considered a valid platform, but Evergreen
-# platforms aren't typical platforms and simply provide a Starboard interface,
-# rather than full implementation, for Cobalt.
diff --git a/starboard/evergreen/shared/test_filters.py b/starboard/evergreen/shared/test_filters.py
index c5a6592..b159524 100644
--- a/starboard/evergreen/shared/test_filters.py
+++ b/starboard/evergreen/shared/test_filters.py
@@ -15,26 +15,26 @@
 
 from starboard.tools.testing import test_filter
 
+_FILTERED_TESTS = {
+    'nplb': [
+        'MemoryReportingTest.CapturesOperatorDeleteNothrow',
+        'SbAudioSinkTest.*', 'SbDrmTest.AnySupportedKeySystems'
+    ],
+
+    # player_filter_tests test the platform's Starboard implementation of
+    # the filter-based player, which is not exposed through the Starboard
+    # interface. Since Evergreen has no visibility of the platform's
+    # specific Starboard implementation, rely on the platform to test this
+    # directly instead.
+    'player_filter_tests': [test_filter.FILTER_ALL],
+}
+
 
 class TestFilters(object):
   """Starboard Evergreen platform test filters."""
 
   def GetTestFilters(self):
     filters = []
-    for target, tests in self._FILTERED_TESTS.iteritems():
+    for target, tests in _FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
-
-  _FILTERED_TESTS = {
-      'nplb': [
-          'MemoryReportingTest.CapturesOperatorDeleteNothrow',
-          'SbAudioSinkTest.*', 'SbDrmTest.AnySupportedKeySystems'
-      ],
-
-      # player_filter_tests test the platform's Starboard implementation of
-      # the filter-based player, which is not exposed through the Starboard
-      # interface. Since Evergreen has no visibility of the platform's
-      # specific Starboard implementation, rely on the platform to test this
-      # directly instead.
-      'player_filter_tests': [test_filter.FILTER_ALL],
-  }
diff --git a/starboard/evergreen/shared/toolchain/toolchain.gni b/starboard/evergreen/shared/toolchain/toolchain.gni
new file mode 100644
index 0000000..6952a87
--- /dev/null
+++ b/starboard/evergreen/shared/toolchain/toolchain.gni
@@ -0,0 +1,41 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/clang/clang.gni")
+
+prefix = rebase_path("$clang_base_path/bin", root_build_dir)
+evergreen_target_cc = "$prefix/clang"
+evergreen_target_cxx = "$prefix/clang++"
+evergreen_target_ld = "$prefix/ld.lld"
+evergreen_target_ar = "${prefix}/llvm-ar"
+evergreen_target_nm = "nm"
+
+# TODO(b/206642994): see if any of these flags, migrated from
+# starboard/tools/toolchain/evergreen_linker.py, can be removed.
+evergreen_target_extra_ldflags = [
+  "--build-id",
+  "--gc-sections",
+  "-X",
+  "-v",
+  "-eh-frame-hdr",
+  "--fini=__cxa_finalize",
+  "-shared",
+  "-L$clang_base_path",
+  "-L/usr/lib",
+  "-L/lib",
+  "-nostdlib",
+  "--whole-archive",
+  "--no-whole-archive",
+  "-u GetEvergreenSabiString",
+]
diff --git a/starboard/evergreen/testing/linux/deploy_cobalt.sh b/starboard/evergreen/testing/linux/deploy_cobalt.sh
index 28a5db6..6dc6e59 100755
--- a/starboard/evergreen/testing/linux/deploy_cobalt.sh
+++ b/starboard/evergreen/testing/linux/deploy_cobalt.sh
@@ -20,11 +20,20 @@
     exit 1
   fi
 
-  echo " Checking '${OUT}'"
+  declare staging_dir=""
+  if [[ -e "${OUT}/deploy/loader_app" ]]; then
+    # Expected after launcher is run for a GYP build.
+    staging_dir="${OUT}/deploy/loader_app"
+  else
+    # Expected after launcher is run for a GN build.
+    staging_dir="${OUT}"
+  fi
 
-  PATHS=("${OUT}/deploy/loader_app/loader_app"                          \
-         "${OUT}/deploy/loader_app/content/app/cobalt/lib/libcobalt.so" \
-         "${OUT}/deploy/loader_app/content/app/cobalt/content/")
+  echo " Checking '${staging_dir}'"
+
+  PATHS=("${staging_dir}/loader_app"                          \
+         "${staging_dir}/content/app/cobalt/lib/libcobalt.so" \
+         "${staging_dir}/content/app/cobalt/content/")
 
   for file in "${PATHS[@]}"; do
     if [[ ! -e "${file}" ]]; then
@@ -33,15 +42,15 @@
     fi
   done
 
-  echo " Required files were found within '${OUT}'"
+  echo " Required files were found within '${staging_dir}'"
 
   echo " Deploying Cobalt on local device"
 
   echo " Generating HTML test directory"
-  eval "mkdir -p ${OUT}/deploy/loader_app/content/app/cobalt/content/web/tests/" 1> /dev/null
+  eval "mkdir -p ${staging_dir}/content/app/cobalt/content/web/tests/" 1> /dev/null
 
   echo " Copying HTML test files to HTML test directory"
-  eval "cp ${1}/../tests/*.html ${OUT}/deploy/loader_app/content/app/cobalt/content/web/tests/" 1> /dev/null
+  eval "cp ${1}/../tests/*.html ${staging_dir}/content/app/cobalt/content/web/tests/" 1> /dev/null
 
   clear_storage
 
diff --git a/starboard/evergreen/testing/raspi/clear_storage.sh b/starboard/evergreen/testing/raspi/clear_storage.sh
index 4ddaa4f..f3fbba4 100755
--- a/starboard/evergreen/testing/raspi/clear_storage.sh
+++ b/starboard/evergreen/testing/raspi/clear_storage.sh
@@ -16,6 +16,5 @@
 
 function clear_storage() {
   echo " Clearing Cobalt storage"
-  eval "${SSH}\"find ${STORAGE_DIR}/ -mindepth 1 -maxdepth 1 ! -name 'icu' -exec rm -rf {} +\"" 1> /dev/null
+  eval "${SSH}\"find ${STORAGE_DIR}/ -mindepth 1 -maxdepth 1 \! -name 'icu' -exec rm -rf {} +\"" 1> /dev/null
 }
-
diff --git a/starboard/evergreen/testing/raspi/deploy_cobalt.sh b/starboard/evergreen/testing/raspi/deploy_cobalt.sh
index 6b1b83d..8fdbc22 100755
--- a/starboard/evergreen/testing/raspi/deploy_cobalt.sh
+++ b/starboard/evergreen/testing/raspi/deploy_cobalt.sh
@@ -20,11 +20,20 @@
     exit 1
   fi
 
-  echo " Checking '${OUT}'"
+  declare staging_dir=""
+  if [[ -e "${OUT}/deploy/loader_app" ]]; then
+    # Expected after launcher is run for a GYP build.
+    staging_dir="${OUT}/deploy/loader_app"
+  else
+    # Expected after launcher is run for a GN build.
+    staging_dir="${OUT}/install/loader_app"
+  fi
 
-  PATHS=("${OUT}/deploy/loader_app/loader_app"                          \
-         "${OUT}/deploy/loader_app/content/app/cobalt/lib/libcobalt.so" \
-         "${OUT}/deploy/loader_app/content/app/cobalt/content/")
+  echo " Checking '${staging_dir}'"
+
+  PATHS=("${staging_dir}/loader_app"                          \
+         "${staging_dir}/content/app/cobalt/lib/libcobalt.so" \
+         "${staging_dir}/content/app/cobalt/content/")
 
   for file in "${PATHS[@]}"; do
     if [[ ! -e "${file}" ]]; then
@@ -38,32 +47,34 @@
   echo " Deploying to the Raspberry Pi 2 at ${RASPI_ADDR}"
 
   echo " Regenerating Cobalt-on-Evergreen directory"
-  eval "${SSH} rm -rf /home/pi/coeg/" 1> /dev/null
-  eval "${SSH} mkdir /home/pi/coeg/" 1> /dev/null
+  eval "${SSH} \"rm -rf /home/pi/coeg/\""
+  eval "${SSH} \"mkdir /home/pi/coeg/\""
 
   echo " Copying loader_app to Cobalt-on-Evergreen directory"
-  eval "${SCP} ${OUT}/deploy/loader_app/loader_app pi@${RASPI_ADDR}:/home/pi/coeg/" 1> /dev/null
+  eval "${SCP} \"${staging_dir}/loader_app pi@${RASPI_ADDR}:/home/pi/coeg/\""
 
   echo " Copying crashpad_handler to Cobalt-on-Evergreen directory"
-  eval "${SCP} ${OUT}/deploy/loader_app/crashpad_handler pi@${RASPI_ADDR}:/home/pi/coeg/" 1> /dev/null
+  eval "${SCP} \"${staging_dir}/crashpad_handler pi@${RASPI_ADDR}:/home/pi/coeg/\""
 
   echo " Regenerating system image directory"
-  eval "${SSH} mkdir -p /home/pi/coeg/content/app/cobalt/lib" 1> /dev/null
+  eval "${SSH} \"mkdir -p /home/pi/coeg/content/app/cobalt/lib\""
 
   echo " Copying cobalt to system image directory"
-  eval "${SCP} ${OUT}/deploy/loader_app/content/app/cobalt/lib/libcobalt.so pi@${RASPI_ADDR}:/home/pi/coeg/content/app/cobalt/lib/" 1> /dev/null
+  eval "${SCP} \"${staging_dir}/content/app/cobalt/lib/libcobalt.so pi@${RASPI_ADDR}:/home/pi/coeg/content/app/cobalt/lib/\""
 
   echo " Copying content to system image directory"
-  eval "${SCP} -r ${OUT}/deploy/loader_app/content/app/cobalt/content/ pi@${RASPI_ADDR}:/home/pi/coeg/content/app/cobalt/" 1> /dev/null
+  eval "${SCP} \"-r ${staging_dir}/content/app/cobalt/content/ pi@${RASPI_ADDR}:/home/pi/coeg/content/app/cobalt/\""
 
   echo " Copying fonts to system content directory"
-  eval "${SCP} -r ${OUT}/content/fonts/ pi@${RASPI_ADDR}:/home/pi/coeg/content/" 1> /dev/null
+  eval "${SCP} \"-r ${staging_dir}/content/fonts/ pi@${RASPI_ADDR}:/home/pi/coeg/content/\""
 
   echo " Generating HTML test directory"
-  eval "${SSH} mkdir -p /home/pi/coeg/content/app/cobalt/content/web/tests/" 1> /dev/null
+  eval "${SSH} \"mkdir -p /home/pi/coeg/content/app/cobalt/content/web/tests/\""
 
   echo " Copying HTML test files to HTML test directory"
-  eval "${SCP} ${1}/../tests/*.html pi@${RASPI_ADDR}:/home/pi/coeg/content/app/cobalt/content/web/tests/" 1> /dev/null
+  eval "${SCP} \"${1}/../tests/empty.html pi@${RASPI_ADDR}:/home/pi/coeg/content/app/cobalt/content/web/tests/\""
+  eval "${SCP} \"${1}/../tests/test.html pi@${RASPI_ADDR}:/home/pi/coeg/content/app/cobalt/content/web/tests/\""
+  eval "${SCP} \"${1}/../tests/tseries.html pi@${RASPI_ADDR}:/home/pi/coeg/content/app/cobalt/content/web/tests/\""
 
   echo " Successfully deployed!"
 }
diff --git a/starboard/evergreen/testing/raspi/secure_communication.sh b/starboard/evergreen/testing/raspi/secure_communication.sh
new file mode 100755
index 0000000..ea332b1
--- /dev/null
+++ b/starboard/evergreen/testing/raspi/secure_communication.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+#
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# TODO(b/171314488): consider allowing username and password to be passed as
+# arguments to run_all_tests.sh.
+RASPI_USERNAME="pi"
+RASPI_PASSWORD="raspberry"
+
+# The longest timeout for cycling Cobalt is 300 seconds. 360 seconds is used for
+# the expect timeout to allow Cobalt to be cycled, with a one minute cushion.
+EXPECT_TIMEOUT="360"
+
+function ssh_with_password() {
+  expect -c "spawn -noecho ssh ${RASPI_USERNAME}@${RASPI_ADDR} \"$@\"; log_user 0; expect \"password\"; log_user 1; send \"${RASPI_PASSWORD}\\r\"; set timeout ${EXPECT_TIMEOUT};  expect \"eof\""
+}
+
+function scp_with_password() {
+  expect -c "spawn scp $@; expect \"password\"; send \"${RASPI_PASSWORD}\\r\"; interact"
+}
+
+function ssh_with_key() {
+  eval "ssh -i ${KEYPATH} pi@${RASPI_ADDR} \"$@\""
+}
+
+function scp_with_key() {
+  eval "scp -i ${KEYPATH} $@"
+}
diff --git a/starboard/evergreen/testing/raspi/setup.sh b/starboard/evergreen/testing/raspi/setup.sh
index 3f484de..62c65aa 100755
--- a/starboard/evergreen/testing/raspi/setup.sh
+++ b/starboard/evergreen/testing/raspi/setup.sh
@@ -16,6 +16,7 @@
 
 source $1/../pprint.sh
 source $1/run_command.sh
+source $1/secure_communication.sh
 
 CACHE_DIR="/home/pi/.cache/cobalt"
 CONTENT="/home/pi/coeg/content/app/cobalt/content"
@@ -37,18 +38,30 @@
   exit 1
 fi
 
-KEYPATH="${HOME}/.ssh/raspi"
-
-if [[ ! -f "${KEYPATH}" ]]; then
-  ssh-keygen -t rsa -q -f "${KEYPATH}" -N "" 1> /dev/null
-  ssh-copy-id -i "${KEYPATH}.pub" pi@"${RASPI_ADDR}" 1> /dev/null
-  echo " Generated SSH key-pair for Raspberry Pi 2 at ${KEYPATH}"
-else
-  echo " Re-using existing SSH key-pair for Raspberry Pi 2 at ${KEYPATH}"
+declare auth_methods=("public-key" "password")
+if [[ ! "${auth_methods[@]}" =~ "${AUTH_METHOD}" ]] ; then
+  log "error" "The authentication method for connecting to the Raspberry Pi 2 must be one of: ${auth_methods[*]}"
+  exit 1
 fi
+echo " Using ${AUTH_METHOD} authentication with remote Raspberry Pi 2"
 
-SSH="ssh -i ${KEYPATH} pi@${RASPI_ADDR} "
-SCP="scp -i ${KEYPATH} "
+if [[ "${AUTH_METHOD}" == "password" ]]; then
+  SSH="ssh_with_password "
+  SCP="scp_with_password "
+else
+  KEYPATH="${HOME}/.ssh/raspi"
+
+  if [[ ! -f "${KEYPATH}" ]]; then
+    ssh-keygen -t rsa -q -f "${KEYPATH}" -N "" 1> /dev/null
+    ssh-copy-id -i "${KEYPATH}.pub" pi@"${RASPI_ADDR}" 1> /dev/null
+    echo " Generated SSH key-pair for Raspberry Pi 2 at ${KEYPATH}"
+  else
+    echo " Re-using existing SSH key-pair for Raspberry Pi 2 at ${KEYPATH}"
+  fi
+
+  SSH="ssh_with_key "
+  SCP="scp_with_key "
+fi
 
 echo " Targeting the Raspberry Pi 2 at ${RASPI_ADDR}"
 
diff --git a/starboard/evergreen/testing/raspi/start_cobalt.sh b/starboard/evergreen/testing/raspi/start_cobalt.sh
index f64e0da..d56331b 100755
--- a/starboard/evergreen/testing/raspi/start_cobalt.sh
+++ b/starboard/evergreen/testing/raspi/start_cobalt.sh
@@ -53,15 +53,15 @@
   # loader app. This approach enables the local machine to obtain the loader
   # app's process ID without interfering with its stdout/stderr, which must be
   # piped to tee.
-  declare store_pid_cmd="echo \\$\\$ > ${pid_storage_path}"
+  declare store_pid_cmd="echo \\\\$\\\\$ > ${pid_storage_path}"
   declare replace_with_loader_cmd="exec /home/pi/coeg/loader_app --url=\"\"${URL}\"\" ${ARGS}"
   eval "${SSH}\"${store_pid_cmd};${replace_with_loader_cmd}\" 2>&1 | tee \"${LOG_PATH}/${LOG}\"" &
 
   # The device's filesystem is polled to avoid a race condition since the
   # previous eval command is necessarily run in the background.
-  eval "${SSH}\"while [[ ! -f ${pid_storage_path} ]] ; do sleep 1 ; done\""
+  eval "${SSH}\"while \[\[ \! -f ${pid_storage_path} \]\] \; do sleep 1 \; done\""
 
-  loader_pid_ref=$(eval "${SSH}\"cat ${pid_storage_path}\"")
+  loader_pid_ref=$(eval "${SSH}\"cat ${pid_storage_path}\"" | tr -d '[:space:]')
 
   delete_file "${pid_storage_path}"
 
diff --git a/starboard/evergreen/testing/run_all_tests.sh b/starboard/evergreen/testing/run_all_tests.sh
index 0d77b64..8317a55 100755
--- a/starboard/evergreen/testing/run_all_tests.sh
+++ b/starboard/evergreen/testing/run_all_tests.sh
@@ -19,7 +19,19 @@
 # availability of "find", "grep", "ln", "mv", and "rm".
 
 DIR="$(dirname "${0}")"
-DEVICE_ID="${2}"
+
+AUTH_METHOD="public-key"
+while getopts "d:a:" o; do
+    case "${o}" in
+        d)
+            DEVICE_ID=${OPTARG}
+            ;;
+        a)
+            AUTH_METHOD=${OPTARG}
+            ;;
+    esac
+done
+shift $((OPTIND-1))
 
 if [[ ! -f "${DIR}/setup.sh" ]]; then
   echo "The script 'setup.sh' is required"
diff --git a/starboard/evergreen/testing/setup.sh b/starboard/evergreen/testing/setup.sh
index 4bef02a..57bdbc4 100755
--- a/starboard/evergreen/testing/setup.sh
+++ b/starboard/evergreen/testing/setup.sh
@@ -26,17 +26,17 @@
 
 log "info" " [==========] Preparing Cobalt."
 
-if [[ $# -lt 1 ]]; then
+if [[ -z ${1} ]]; then
   log "error" "A platform must be provided"
   exit 1
 fi
 
 PLATFORMS=("linux" "raspi")
-
 if [[ ! "${PLATFORMS[@]}" =~ "${1}" ]] && [[ ! -d "${DIR}/${1}" ]]; then
   log "error" "The platform provided must be one of the following: ${PLATFORMS[*]}"
   exit 1
 fi
+PLATFORM="${1}"
 
 # List of all required scripts.
 SCRIPTS=("${DIR}/shared/app_key.sh"           \
@@ -48,17 +48,17 @@
 
          # Each of the following scripts must be provided for the targeted
          # platform. The script 'setup.sh' must be source'd first.
-         "${DIR}/${1}/setup.sh"               \
+         "${DIR}/${PLATFORM}/setup.sh"               \
 
-         "${DIR}/${1}/clean_up.sh"            \
-         "${DIR}/${1}/clear_storage.sh"       \
-         "${DIR}/${1}/create_file.sh"         \
-         "${DIR}/${1}/delete_file.sh"         \
-         "${DIR}/${1}/deploy_cobalt.sh"       \
-         "${DIR}/${1}/run_command.sh"         \
-         "${DIR}/${1}/start_cobalt.sh"        \
-         "${DIR}/${1}/stop_cobalt.sh"         \
-         "${DIR}/${1}/stop_process.sh")
+         "${DIR}/${PLATFORM}/clean_up.sh"            \
+         "${DIR}/${PLATFORM}/clear_storage.sh"       \
+         "${DIR}/${PLATFORM}/create_file.sh"         \
+         "${DIR}/${PLATFORM}/delete_file.sh"         \
+         "${DIR}/${PLATFORM}/deploy_cobalt.sh"       \
+         "${DIR}/${PLATFORM}/run_command.sh"         \
+         "${DIR}/${PLATFORM}/start_cobalt.sh"        \
+         "${DIR}/${PLATFORM}/stop_cobalt.sh"         \
+         "${DIR}/${PLATFORM}/stop_process.sh")
 
 for script in "${SCRIPTS[@]}"; do
   if [[ ! -f "${script}" ]]; then
@@ -66,5 +66,5 @@
     exit 1
   fi
 
-  source $script "${DIR}/${1}"
+  source $script "${DIR}/${PLATFORM}"
 done
diff --git a/starboard/evergreen/testing/shared/cycle_cobalt.sh b/starboard/evergreen/testing/shared/cycle_cobalt.sh
index 50e884a..c067862 100755
--- a/starboard/evergreen/testing/shared/cycle_cobalt.sh
+++ b/starboard/evergreen/testing/shared/cycle_cobalt.sh
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-TIMEOUT=150
+TIMEOUT=200
 
 # Watches Cobalt's logs.
 #
diff --git a/starboard/evergreen/testing/tests/clean_drain_file_on_suspend_test.sh b/starboard/evergreen/testing/tests/clean_drain_file_on_suspend_test.sh
new file mode 100755
index 0000000..be0e547
--- /dev/null
+++ b/starboard/evergreen/testing/tests/clean_drain_file_on_suspend_test.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+#
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Unset the previous test's name and runner function.
+unset TEST_NAME
+unset TEST_FILE
+unset -f run_test
+
+TEST_NAME="CleanDrainFilesOnSuspend"
+TEST_FILE="test.html"
+
+function run_test() {
+  clear_storage
+
+  LOG="${TEST_NAME}.0.log"
+  start_cobalt "file:///tests/${TEST_FILE}?channel=test" "${LOG}" LOADER --update_check_delay_seconds=1
+
+  VAR=1
+
+  for i in {1..5}
+  do
+    log "info" "${TEST_NAME} #${VAR}"
+    sleep ${VAR}
+
+    # suspend
+    kill -s USR1 "${LOADER}"
+    if [[ $? -ne 0 ]]; then
+      log "warning" "Failed to suspend"
+      break
+    fi
+
+    sleep 5
+
+    if ls ${STORAGE_DIR}/installation_?/d_* 1> /dev/null 2>&1; then
+      echo "drain file wasn't cleaned up ."
+      return 1
+    fi
+
+    # resume
+    kill -s CONT "${LOADER}"
+    if [[ $? -ne 0 ]]; then
+      log "warning" "Failed to resume"
+      break
+    fi
+
+    let "VAR=${VAR}+1"
+  done
+  return 0
+
+}
diff --git a/starboard/evergreen/testing/tests/evergreen_lite_test.sh b/starboard/evergreen/testing/tests/evergreen_lite_test.sh
index 42d37a3..106b145 100755
--- a/starboard/evergreen/testing/tests/evergreen_lite_test.sh
+++ b/starboard/evergreen/testing/tests/evergreen_lite_test.sh
@@ -46,5 +46,11 @@
     return 1
   fi
 
+  cycle_cobalt "file:///tests/${TEST_FILE}?channel=test" "${TEST_NAME}.2.log" "Loaded WebModule" "--evergreen_lite"
+
+  if [[ $? -ne 0 ]]; then
+    log "error" "Failed to run system installation"
+    return 1
+  fi
   return 0
 }
diff --git a/starboard/evergreen/testing/tests/use_mmap_file_test.sh b/starboard/evergreen/testing/tests/use_mmap_file_test.sh
new file mode 100644
index 0000000..66b53f1
--- /dev/null
+++ b/starboard/evergreen/testing/tests/use_mmap_file_test.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+#
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Unset the previous test's name and runner function.
+unset TEST_NAME
+unset TEST_FILE
+unset -f run_test
+
+TEST_NAME="UseMemoryMappedFile"
+TEST_FILE="test.html"
+
+function run_test() {
+  if [[ "${PLATFORM}" == "raspi" ]]; then
+    echo " MemoryMappedFile extension not implemented for raspi, skipping"
+    return 2
+  fi
+
+  clear_storage
+
+  cycle_cobalt "file:///tests/${TEST_FILE}?channel=test" "${TEST_NAME}.2.log" "Using memory mapped file for the program header" "--loader_use_mmap_file"
+
+  if [[ $? -ne 0 ]]; then
+    log "error" "Failed to run system installation"
+    return 1
+  fi
+
+  cycle_cobalt "file:///tests/${TEST_FILE}?channel=test" "${TEST_NAME}.2.log" "Using memory mapped file for the program header" "--loader_use_mmap_file --evergreen_lite"
+
+  if [[ $? -ne 0 ]]; then
+    log "error" "Failed to run system installation"
+    return 1
+  fi
+  return 0
+}
diff --git a/starboard/evergreen/x64/cobalt/configuration.gypi b/starboard/evergreen/x64/cobalt/configuration.gypi
deleted file mode 100644
index 5fcbf9f..0000000
--- a/starboard/evergreen/x64/cobalt/configuration.gypi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Cobalt Evergreen x86_64 specific configuration.
-
-{
-  'variables': {
-    'in_app_dial%': 1,
-  }, # end of variables
-}
diff --git a/starboard/evergreen/x64/cobalt/configuration.py b/starboard/evergreen/x64/cobalt/configuration.py
index e24e3cf..61eac37 100644
--- a/starboard/evergreen/x64/cobalt/configuration.py
+++ b/starboard/evergreen/x64/cobalt/configuration.py
@@ -13,8 +13,6 @@
 # limitations under the License.
 """Starboard Cobalt Evergreen x64 configuration."""
 
-import os
-
 from cobalt.build import cobalt_configuration
 from starboard.tools.testing import test_filter
 
@@ -22,32 +20,12 @@
 class CobaltX64Configuration(cobalt_configuration.CobaltConfiguration):
   """Starboard Cobalt Evergreen x64 configuration."""
 
-  def __init__(self, platform_configuration, application_name,
-               application_directory):
-    super(CobaltX64Configuration,
-          self).__init__(platform_configuration, application_name,
-                         application_directory)
-
-  def GetPostIncludes(self):
-    # If there isn't a configuration.gypi found in the usual place, we'll
-    # supplement with our shared implementation.
-    includes = super(CobaltX64Configuration, self).GetPostIncludes()
-    for include in includes:
-      if os.path.basename(include) == 'configuration.gypi':
-        return includes
-
-    shared_gypi_path = os.path.join(
-        os.path.dirname(__file__), 'configuration.gypi')
-    if os.path.isfile(shared_gypi_path):
-      includes.append(shared_gypi_path)
-    return includes
-
   def WebdriverBenchmarksEnabled(self):
     return True
 
   def GetTestFilters(self):
     filters = super(CobaltX64Configuration, self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
+    for target, tests in self.__FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
 
@@ -64,4 +42,4 @@
         }
     }
 
-  __FILTERED_TESTS = {}
+  __FILTERED_TESTS = {}  # pylint: disable=invalid-name
diff --git a/starboard/evergreen/x64/configuration_public.h b/starboard/evergreen/x64/configuration_public.h
index 83cc234..3430685 100644
--- a/starboard/evergreen/x64/configuration_public.h
+++ b/starboard/evergreen/x64/configuration_public.h
@@ -127,12 +127,6 @@
 
 // --- Memory Configuration --------------------------------------------------
 
-// Whether this platform has and should use an MMAP function to map physical
-// memory to the virtual address space.
-#if SB_API_VERSION < 12
-#define SB_HAS_MMAP 1
-#endif
-
 // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
 // required for platforms that want to JIT.
 #define SB_CAN_MAP_EXECUTABLE_MEMORY 1
diff --git a/starboard/evergreen/x64/gyp_configuration.gypi b/starboard/evergreen/x64/gyp_configuration.gypi
deleted file mode 100644
index a9f3eaa..0000000
--- a/starboard/evergreen/x64/gyp_configuration.gypi
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-    'sb_target_platform': 'evergreen-x64',
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/x86_64',
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-  },
-
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'default_configuration': 'evergreen-x64_debug',
-    'configurations': {
-      'evergreen-x64_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-x64_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-x64_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-x64_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-  ],
-}
diff --git a/starboard/evergreen/x64/gyp_configuration.py b/starboard/evergreen/x64/gyp_configuration.py
index dbb32d6..39cec68 100644
--- a/starboard/evergreen/x64/gyp_configuration.py
+++ b/starboard/evergreen/x64/gyp_configuration.py
@@ -15,91 +15,17 @@
 
 import os.path
 
-from starboard.build import clang as clang_build
 from starboard.evergreen.shared import gyp_configuration as shared_configuration
-from starboard.tools import paths
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import evergreen_linker
-from starboard.tools.toolchain import touch
 
 
 class EvergreenX64Configuration(shared_configuration.EvergreenConfiguration):
   """Starboard Evergreen x64 platform configuration."""
 
-  def __init__(self,
-               platform='evergreen-x64',
-               asan_enabled_by_default=False,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(EvergreenX64Configuration, self).__init__(platform,
-                                                    asan_enabled_by_default,
-                                                    sabi_json_path)
+  def __init__(self, platform):
+    super(EvergreenX64Configuration, self).__init__(platform)
 
     self.AppendApplicationConfigurationPath(os.path.dirname(__file__))
 
-  def GetTargetToolchain(self, **kwargs):
-    return self.GetHostToolchain(**kwargs)
-
-  def GetHostToolchain(self, **kwargs):
-    if not hasattr(self, '_host_toolchain'):
-      env_variables = self.GetEnvironmentVariables()
-      cc_path = env_variables['CC_host']
-      cxx_path = env_variables['CXX_host']
-
-      # Takes the provided value of CXX_HOST with a prepended 'ccache' and an
-      # appended 'bin/clang++' and strips them off, leaving us with an absolute
-      # path to the root directory of our toolchain.
-      begin_path_index = cxx_path.find('/')
-      end_path_index = cxx_path.rfind('/', 0, cxx_path.rfind('/')) + 1
-      cxx_path_root = cxx_path[begin_path_index:end_path_index]
-
-      self._host_toolchain = [
-          clang.CCompiler(path=cc_path),
-          clang.CxxCompiler(path=cxx_path),
-          clang.AssemblerWithCPreprocessor(path=cc_path),
-          ar.StaticThinLinker(),
-          ar.StaticLinker(),
-          clangxx.ExecutableLinker(path=cxx_path),
-          evergreen_linker.SharedLibraryLinker(
-              path=cxx_path_root, extra_flags=['-m elf_x86_64']),
-          cp.Copy(),
-          touch.Stamp(),
-          bash.Shell(),
-      ]
-    return self._host_toolchain
-
-  def GetTestFilters(self):
-    filters = super(EvergreenX64Configuration, self).GetTestFilters()
-    # Remove the exclusion filter on SbDrmTest.AnySupportedKeySystems.
-    # Generally, children of linux/shared do not support widevine, but children
-    # of linux/x64x11 do, if the content decryption module is present.
-
-    has_cdm = os.path.isfile(
-        os.path.join(paths.REPOSITORY_ROOT, 'third_party', 'cdm', 'cdm',
-                     'include', 'content_decryption_module.h'))
-
-    if not has_cdm:
-      return filters
-
-    for test_filter in filters:
-      if (test_filter.target_name == 'nplb' and
-          test_filter.test_name == 'SbDrmTest.AnySupportedKeySystems'):
-        filters.remove(test_filter)
-    return filters
-
-  def GetVariables(self, configuration):
-    variables = super(EvergreenX64Configuration,
-                      self).GetVariables(configuration)
-    variables.update({
-        'include_path_platform_deploy_gypi':
-            'starboard/evergreen/x64/platform_deploy.gypi',
-    })
-    return variables
-
 
 def CreatePlatformConfig():
-  return EvergreenX64Configuration(
-      sabi_json_path='starboard/sabi/x64/sysv/sabi-v{sb_api_version}.json')
+  return EvergreenX64Configuration('evergreen-x64')
diff --git a/starboard/evergreen/x64/platform_configuration/BUILD.gn b/starboard/evergreen/x64/platform_configuration/BUILD.gn
index f07413a..658a9ac 100644
--- a/starboard/evergreen/x64/platform_configuration/BUILD.gn
+++ b/starboard/evergreen/x64/platform_configuration/BUILD.gn
@@ -31,10 +31,6 @@
 
     cflags = [ "-isystem" +
                rebase_path("//third_party/musl/arch/x86_64", root_build_dir) ]
-
-    if (is_clang) {
-      ldflags = [ "-fuse-ld=lld" ]
-    }
   } else {
     cflags = [ "-O2" ]
   }
diff --git a/starboard/evergreen/x64/platform_configuration/configuration.gni b/starboard/evergreen/x64/platform_configuration/configuration.gni
index 3d2eb48..c97a407 100644
--- a/starboard/evergreen/x64/platform_configuration/configuration.gni
+++ b/starboard/evergreen/x64/platform_configuration/configuration.gni
@@ -17,3 +17,5 @@
 sabi_path = "//starboard/sabi/x64/sysv/sabi-v$sb_api_version.json"
 
 install_target_path = "//starboard/evergreen/x64/install_target.gni"
+
+enable_in_app_dial = true
diff --git a/starboard/evergreen/x64/platform_deploy.gypi b/starboard/evergreen/x64/platform_deploy.gypi
deleted file mode 100644
index f2524b5..0000000
--- a/starboard/evergreen/x64/platform_deploy.gypi
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'deploy_executable_file': '<(target_deploy_dir)/lib/lib<(executable_name).so',
-    'executable_file': '<(PRODUCT_DIR)/lib/lib<(executable_name).so',
-  },
-  'includes': [ '<(DEPTH)/starboard/build/collect_deploy_content.gypi' ],
-  'actions': [
-    {
-      'action_name': 'deploy_executable',
-      'message': 'Strip executable: <(deploy_executable_file)',
-      'inputs': [
-        '<(executable_file)',
-        '<(content_deploy_stamp_file)',
-      ],
-      'outputs': [ '<(deploy_executable_file)' ],
-      'action': [
-        'strip',
-        '-o', '<(deploy_executable_file)',
-        '<(executable_file)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/evergreen/x64/sbversion/12/atomic_public.h b/starboard/evergreen/x64/sbversion/12/atomic_public.h
deleted file mode 100644
index 64e82a1..0000000
--- a/starboard/evergreen/x64/sbversion/12/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_X64_SBVERSION_12_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X64_SBVERSION_12_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/x64/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X64_SBVERSION_12_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/x64/sbversion/12/configuration_public.h b/starboard/evergreen/x64/sbversion/12/configuration_public.h
deleted file mode 100644
index 2c411d7..0000000
--- a/starboard/evergreen/x64/sbversion/12/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for x64. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_X64_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X64_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/x64/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X64_SBVERSION_12_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/x64/sbversion/12/gyp_configuration.gypi b/starboard/evergreen/x64/sbversion/12/gyp_configuration.gypi
deleted file mode 100644
index fa4e5a1..0000000
--- a/starboard/evergreen/x64/sbversion/12/gyp_configuration.gypi
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-    'sb_target_platform': 'evergreen-x64',
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/x86_64',
-    ],
-  },
-
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'default_configuration': 'evergreen-x64-sbversion-12_debug',
-    'configurations': {
-      'evergreen-x64-sbversion-12_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-x64-sbversion-12_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-x64-sbversion-12_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-x64-sbversion-12_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-  ],
-}
diff --git a/starboard/evergreen/x64/sbversion/12/gyp_configuration.py b/starboard/evergreen/x64/sbversion/12/gyp_configuration.py
deleted file mode 100644
index f03e574..0000000
--- a/starboard/evergreen/x64/sbversion/12/gyp_configuration.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard evergreen-x64 platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.x64 import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenX64Configuration(
-      'evergreen-x64-sbversion-12',
-      sabi_json_path='starboard/sabi/x64/sysv/sabi-v12.json')
diff --git a/starboard/evergreen/x64/sbversion/12/starboard_platform.gyp b/starboard/evergreen/x64/sbversion/12/starboard_platform.gyp
deleted file mode 100644
index ad9035d..0000000
--- a/starboard/evergreen/x64/sbversion/12/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/x64/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/x64/sbversion/12/test_filters.py b/starboard/evergreen/x64/sbversion/12/test_filters.py
deleted file mode 100644
index a56490a..0000000
--- a/starboard/evergreen/x64/sbversion/12/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen X64 Platform Test Filters."""
-
-from starboard.evergreen.x64 import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  parent_test_filters.EvergreenX64TestFilters()
diff --git a/starboard/evergreen/x64/sbversion/12/thread_types_public.h b/starboard/evergreen/x64/sbversion/12/thread_types_public.h
deleted file mode 100644
index 2695e58..0000000
--- a/starboard/evergreen/x64/sbversion/12/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_X64_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X64_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/x64/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X64_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/x64/sbversion/13/atomic_public.h b/starboard/evergreen/x64/sbversion/13/atomic_public.h
deleted file mode 100644
index f7a23d3..0000000
--- a/starboard/evergreen/x64/sbversion/13/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_X64_SBVERSION_13_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X64_SBVERSION_13_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/x64/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X64_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/x64/sbversion/13/configuration_public.h b/starboard/evergreen/x64/sbversion/13/configuration_public.h
deleted file mode 100644
index feb9e8d..0000000
--- a/starboard/evergreen/x64/sbversion/13/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for x64. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_X64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/x64/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X64_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/x64/sbversion/13/gyp_configuration.gypi b/starboard/evergreen/x64/sbversion/13/gyp_configuration.gypi
deleted file mode 100644
index 46858d1..0000000
--- a/starboard/evergreen/x64/sbversion/13/gyp_configuration.gypi
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-    'sb_target_platform': 'evergreen-x64',
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/x86_64',
-    ],
-  },
-
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'default_configuration': 'evergreen-x64-sbversion-13_debug',
-    'configurations': {
-      'evergreen-x64-sbversion-13_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-x64-sbversion-13_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-x64-sbversion-13_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-x64-sbversion-13_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-  ],
-}
diff --git a/starboard/evergreen/x64/sbversion/13/gyp_configuration.py b/starboard/evergreen/x64/sbversion/13/gyp_configuration.py
deleted file mode 100644
index 8e8a2dc..0000000
--- a/starboard/evergreen/x64/sbversion/13/gyp_configuration.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard evergreen-x64 platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.x64 import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenX64Configuration(
-      'evergreen-x64-sbversion-13',
-      sabi_json_path='starboard/sabi/x64/sysv/sabi-v13.json')
diff --git a/starboard/evergreen/x64/sbversion/13/starboard_platform.gyp b/starboard/evergreen/x64/sbversion/13/starboard_platform.gyp
deleted file mode 100644
index 87190b6..0000000
--- a/starboard/evergreen/x64/sbversion/13/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/x64/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/x64/sbversion/13/test_filters.py b/starboard/evergreen/x64/sbversion/13/test_filters.py
deleted file mode 100644
index 53b30f2..0000000
--- a/starboard/evergreen/x64/sbversion/13/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen X64 Platform Test Filters."""
-
-from starboard.evergreen.x64 import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.EvergreenX64TestFilters()
diff --git a/starboard/evergreen/x64/sbversion/13/thread_types_public.h b/starboard/evergreen/x64/sbversion/13/thread_types_public.h
deleted file mode 100644
index e9d5399..0000000
--- a/starboard/evergreen/x64/sbversion/13/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_X64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/x64/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X64_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/x64/starboard_platform.gyp b/starboard/evergreen/x64/starboard_platform.gyp
deleted file mode 100644
index 8fa33ef..0000000
--- a/starboard/evergreen/x64/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/shared/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/x64/test_filters.py b/starboard/evergreen/x64/test_filters.py
index f4e36d7..3f11560 100644
--- a/starboard/evergreen/x64/test_filters.py
+++ b/starboard/evergreen/x64/test_filters.py
@@ -39,8 +39,10 @@
     if not has_cdm:
       return filters
 
+    test_filters = []
     for test_filter in filters:
       if (test_filter.target_name == 'nplb' and
           test_filter.test_name == 'SbDrmTest.AnySupportedKeySystems'):
-        filters.remove(test_filter)
-    return filters
+        continue
+      test_filters.append(test_filter)
+    return test_filters
diff --git a/starboard/evergreen/x64/thread_types_public.h b/starboard/evergreen/x64/thread_types_public.h
deleted file mode 100644
index e420a58..0000000
--- a/starboard/evergreen/x64/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_X64_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X64_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/shared/pthread/types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X64_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/x64/toolchain/BUILD.gn b/starboard/evergreen/x64/toolchain/BUILD.gn
index be6fcbb..6fedf62 100644
--- a/starboard/evergreen/x64/toolchain/BUILD.gn
+++ b/starboard/evergreen/x64/toolchain/BUILD.gn
@@ -14,13 +14,23 @@
 
 import("//build/config/clang/clang.gni")
 import("//build/toolchain/gcc_toolchain.gni")
+import("//starboard/evergreen/shared/toolchain/toolchain.gni")
 
 clang_toolchain("host") {
   clang_base_path = clang_base_path
 }
 
-clang_toolchain("target") {
-  clang_base_path = clang_base_path
-  # TODO: additional work is likely needed to configure the linker for
-  # evergreen (see //starboard/tools/toolchain/evergreen_linker.py).
+gcc_toolchain("target") {
+  cc = evergreen_target_cc
+  cxx = evergreen_target_cxx
+  ld = evergreen_target_ld
+  ar = evergreen_target_ar
+  nm = evergreen_target_nm
+
+  evergreen_target_extra_ldflags += [ "-m elf_x86_64" ]
+  extra_ldflags = string_join(" ", evergreen_target_extra_ldflags)
+
+  toolchain_args = {
+    is_clang = true
+  }
 }
diff --git a/starboard/evergreen/x86/args.gn b/starboard/evergreen/x86/args.gn
new file mode 100644
index 0000000..e8b5ecb
--- /dev/null
+++ b/starboard/evergreen/x86/args.gn
@@ -0,0 +1,17 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+target_platform = "evergreen-x86"
+target_os = "linux"
+target_cpu = "x86"
diff --git a/starboard/evergreen/x86/gyp_configuration.gypi b/starboard/evergreen/x86/gyp_configuration.gypi
deleted file mode 100644
index 58ebaca..0000000
--- a/starboard/evergreen/x86/gyp_configuration.gypi
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-    'sb_target_platform': 'evergreen-x86',
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/i386',
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-  },
-
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'default_configuration': 'evergreen-x86_debug',
-    'configurations': {
-      'evergreen-x86_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-x86_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-x86_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-x86_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-  ],
-}
diff --git a/starboard/evergreen/x86/gyp_configuration.py b/starboard/evergreen/x86/gyp_configuration.py
index 441c4e3..a9c5e45 100644
--- a/starboard/evergreen/x86/gyp_configuration.py
+++ b/starboard/evergreen/x86/gyp_configuration.py
@@ -13,83 +13,13 @@
 # limitations under the License.
 """Starboard evergreen-x86 platform configuration for gyp_cobalt."""
 
-import os.path
-
-from starboard.build import clang as clang_build
 from starboard.evergreen.shared import gyp_configuration as shared_configuration
-from starboard.tools import paths
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import evergreen_linker
-from starboard.tools.toolchain import touch
 
 
 class EvergreenX86Configuration(shared_configuration.EvergreenConfiguration):
   """Starboard Evergreen x86 platform configuration."""
-
-  def __init__(self,
-               platform='evergreen-x86',
-               asan_enabled_by_default=False,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    # pylint: disable=useless-super-delegation
-    super(EvergreenX86Configuration, self).__init__(platform,
-                                                    asan_enabled_by_default,
-                                                    sabi_json_path)
-
-  def GetTargetToolchain(self, **kwargs):
-    return self.GetHostToolchain(**kwargs)
-
-  def GetHostToolchain(self, **kwargs):
-    if not hasattr(self, '_host_toolchain'):
-      env_variables = self.GetEnvironmentVariables()
-      cc_path = env_variables['CC_host']
-      cxx_path = env_variables['CXX_host']
-
-      # Takes the provided value of CXX_HOST with a prepended 'ccache' and an
-      # appended 'bin/clang++' and strips them off, leaving us with an absolute
-      # path to the root directory of our toolchain.
-      begin_path_index = cxx_path.find('/')
-      end_path_index = cxx_path.rfind('/', 0, cxx_path.rfind('/')) + 1
-      cxx_path_root = cxx_path[begin_path_index:end_path_index]
-
-      self._host_toolchain = [
-          clang.CCompiler(path=cc_path),
-          clang.CxxCompiler(path=cxx_path),
-          clang.AssemblerWithCPreprocessor(path=cc_path),
-          ar.StaticThinLinker(),
-          ar.StaticLinker(),
-          clangxx.ExecutableLinker(path=cxx_path),
-          evergreen_linker.SharedLibraryLinker(
-              path=cxx_path_root, extra_flags=['-m elf_i686']),
-          cp.Copy(),
-          touch.Stamp(),
-          bash.Shell(),
-      ]
-    return self._host_toolchain
-
-  def GetTestFilters(self):
-    filters = super(EvergreenX86Configuration, self).GetTestFilters()
-    # Remove the exclusion filter on SbDrmTest.AnySupportedKeySystems.
-    # Generally, children of linux/shared do not support widevine, but children
-    # of linux/x64x11 do, if the content decryption module is present.
-
-    has_cdm = os.path.isfile(
-        os.path.join(paths.REPOSITORY_ROOT, 'third_party', 'cdm', 'cdm',
-                     'include', 'content_decryption_module.h'))
-
-    if not has_cdm:
-      return filters
-
-    for test_filter in filters:
-      if (test_filter.target_name == 'nplb' and
-          test_filter.test_name == 'SbDrmTest.AnySupportedKeySystems'):
-        filters.remove(test_filter)
-    return filters
+  pass
 
 
 def CreatePlatformConfig():
-  return EvergreenX86Configuration(
-      sabi_json_path='starboard/sabi/x86/sabi-v{sb_api_version}.json')
+  return EvergreenX86Configuration('evergreen-x86')
diff --git a/starboard/evergreen/x86/install_target.gni b/starboard/evergreen/x86/install_target.gni
new file mode 100644
index 0000000..f6b12ba
--- /dev/null
+++ b/starboard/evergreen/x86/install_target.gni
@@ -0,0 +1,23 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/evergreen/shared/strip_install_target.gni")
+import("//starboard/evergreen/x86/toolchain/strip.gni")
+
+template("install_target") {
+  strip_install_target(target_name) {
+    forward_variables_from(invoker, "*")
+    strip_executable = strip_executable
+  }
+}
diff --git a/starboard/evergreen/x86/platform_configuration/BUILD.gn b/starboard/evergreen/x86/platform_configuration/BUILD.gn
new file mode 100644
index 0000000..91f6dd4
--- /dev/null
+++ b/starboard/evergreen/x86/platform_configuration/BUILD.gn
@@ -0,0 +1,37 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+config("sabi_flags") {
+  cflags = [
+    "-march=i686",
+    "-target",
+    "i686-unknown-unknown-elf",
+  ]
+}
+
+config("platform_configuration") {
+  configs = [ "//starboard/build/config/sabi" ]
+
+  if (current_toolchain == default_toolchain) {
+    configs += [
+      ":sabi_flags",
+      "//starboard/evergreen/shared/platform_configuration",
+    ]
+
+    cflags = [ "-isystem" +
+               rebase_path("//third_party/musl/arch/i386", root_build_dir) ]
+  } else {
+    cflags = [ "-O2" ]
+  }
+}
diff --git a/starboard/evergreen/x86/platform_configuration/configuration.gni b/starboard/evergreen/x86/platform_configuration/configuration.gni
new file mode 100644
index 0000000..1a31d38
--- /dev/null
+++ b/starboard/evergreen/x86/platform_configuration/configuration.gni
@@ -0,0 +1,18 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/evergreen/shared/platform_configuration/configuration.gni")
+
+sabi_path = "//starboard/sabi/x86/sabi-v$sb_api_version.json"
+install_target_path = "//starboard/evergreen/x86/install_target.gni"
diff --git a/starboard/evergreen/x86/sbversion/12/atomic_public.h b/starboard/evergreen/x86/sbversion/12/atomic_public.h
deleted file mode 100644
index 216d7b6..0000000
--- a/starboard/evergreen/x86/sbversion/12/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_X86_SBVERSION_12_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X86_SBVERSION_12_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/x86/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X86_SBVERSION_12_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/x86/sbversion/12/configuration_public.h b/starboard/evergreen/x86/sbversion/12/configuration_public.h
deleted file mode 100644
index a8dfb83..0000000
--- a/starboard/evergreen/x86/sbversion/12/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for x86. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_X86_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X86_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/x86/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X86_SBVERSION_12_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/x86/sbversion/12/gyp_configuration.gypi b/starboard/evergreen/x86/sbversion/12/gyp_configuration.gypi
deleted file mode 100644
index 9c5fb14..0000000
--- a/starboard/evergreen/x86/sbversion/12/gyp_configuration.gypi
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-    'sb_target_platform': 'evergreen-x86',
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/i386',
-    ],
-  },
-
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'default_configuration': 'evergreen-x86-sbversion-12_debug',
-    'configurations': {
-      'evergreen-x86-sbversion-12_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-x86-sbversion-12_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-x86-sbversion-12_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-x86-sbversion-12_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-  ],
-}
diff --git a/starboard/evergreen/x86/sbversion/12/gyp_configuration.py b/starboard/evergreen/x86/sbversion/12/gyp_configuration.py
deleted file mode 100644
index 4de44be..0000000
--- a/starboard/evergreen/x86/sbversion/12/gyp_configuration.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard evergreen-x86 platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.x86 import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenX86Configuration(
-      'evergreen-x86-sbversion-12',
-      sabi_json_path='starboard/sabi/x86/sabi-v12.json')
diff --git a/starboard/evergreen/x86/sbversion/12/starboard_platform.gyp b/starboard/evergreen/x86/sbversion/12/starboard_platform.gyp
deleted file mode 100644
index 8fa33ef..0000000
--- a/starboard/evergreen/x86/sbversion/12/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/shared/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/x86/sbversion/12/test_filters.py b/starboard/evergreen/x86/sbversion/12/test_filters.py
deleted file mode 100644
index 19fc15e..0000000
--- a/starboard/evergreen/x86/sbversion/12/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen X86 Platform Test Filters."""
-
-from starboard.evergreen.x86 import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.EvergreenX64TestFilters()
diff --git a/starboard/evergreen/x86/sbversion/12/thread_types_public.h b/starboard/evergreen/x86/sbversion/12/thread_types_public.h
deleted file mode 100644
index bca9e4d..0000000
--- a/starboard/evergreen/x86/sbversion/12/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_X86_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X86_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/x86/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X86_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/x86/sbversion/13/atomic_public.h b/starboard/evergreen/x86/sbversion/13/atomic_public.h
deleted file mode 100644
index 95735e6..0000000
--- a/starboard/evergreen/x86/sbversion/13/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_EVERGREEN_X86_SBVERSION_13_ATOMIC_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X86_SBVERSION_13_ATOMIC_PUBLIC_H_
-
-#include "starboard/evergreen/x86/atomic_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X86_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/starboard/evergreen/x86/sbversion/13/configuration_public.h b/starboard/evergreen/x86/sbversion/13/configuration_public.h
deleted file mode 100644
index 0295a19..0000000
--- a/starboard/evergreen/x86/sbversion/13/configuration_public.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for x86. Other devices will have
-// specific Starboard implementations.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_EVERGREEN_X86_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X86_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-
-#include "starboard/evergreen/x86/configuration_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X86_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/evergreen/x86/sbversion/13/gyp_configuration.gypi b/starboard/evergreen/x86/sbversion/13/gyp_configuration.gypi
deleted file mode 100644
index c8fcb60..0000000
--- a/starboard/evergreen/x86/sbversion/13/gyp_configuration.gypi
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'variables': {
-    'yasm_exists': 1,
-    'sb_target_platform': 'evergreen-x86',
-
-    'compiler_flags': [
-      '-isystem<(cobalt_repo_root)/third_party/musl/arch/i386',
-    ],
-  },
-
-  'target_defaults': {
-    'defines' : [
-      # Ensure that the Starboardized __external_threading file is included.
-      '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-      # Ensure that only the forward declarations and type definitions are included
-      # in __external_threading.
-      '_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL',
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'default_configuration': 'evergreen-x86-sbversion-13_debug',
-    'configurations': {
-      'evergreen-x86-sbversion-13_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'evergreen-x86-sbversion-13_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'evergreen-x86-sbversion-13_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'evergreen-x86-sbversion-13_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-  'includes': [
-    '<(DEPTH)/starboard/evergreen/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/evergreen/shared/compiler_flags.gypi',
-  ],
-}
diff --git a/starboard/evergreen/x86/sbversion/13/gyp_configuration.py b/starboard/evergreen/x86/sbversion/13/gyp_configuration.py
deleted file mode 100644
index 6837487..0000000
--- a/starboard/evergreen/x86/sbversion/13/gyp_configuration.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard evergreen-x86 platform configuration for gyp_cobalt."""
-
-from starboard.evergreen.x86 import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.EvergreenX86Configuration(
-      'evergreen-x86-sbversion-13',
-      sabi_json_path='starboard/sabi/x86/sabi-v13.json')
diff --git a/starboard/evergreen/x86/sbversion/13/starboard_platform.gyp b/starboard/evergreen/x86/sbversion/13/starboard_platform.gyp
deleted file mode 100644
index 1ba29f7..0000000
--- a/starboard/evergreen/x86/sbversion/13/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/shared/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/x86/sbversion/13/test_filters.py b/starboard/evergreen/x86/sbversion/13/test_filters.py
deleted file mode 100644
index 19fc15e..0000000
--- a/starboard/evergreen/x86/sbversion/13/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Evergreen X86 Platform Test Filters."""
-
-from starboard.evergreen.x86 import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.EvergreenX64TestFilters()
diff --git a/starboard/evergreen/x86/sbversion/13/thread_types_public.h b/starboard/evergreen/x86/sbversion/13/thread_types_public.h
deleted file mode 100644
index b7cd8e3..0000000
--- a/starboard/evergreen/x86/sbversion/13/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_X86_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X86_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/evergreen/x86/thread_types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X86_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/x86/starboard_platform.gyp b/starboard/evergreen/x86/starboard_platform.gyp
deleted file mode 100644
index 8fa33ef..0000000
--- a/starboard/evergreen/x86/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/evergreen/shared/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/evergreen/x86/test_filters.py b/starboard/evergreen/x86/test_filters.py
index f8e9450..cb55d29 100644
--- a/starboard/evergreen/x86/test_filters.py
+++ b/starboard/evergreen/x86/test_filters.py
@@ -39,8 +39,10 @@
     if not has_cdm:
       return filters
 
+    test_filters = []
     for test_filter in filters:
       if (test_filter.target_name == 'nplb' and
           test_filter.test_name == 'SbDrmTest.AnySupportedKeySystems'):
-        filters.remove(test_filter)
-    return filters
+        continue
+      test_filters.append(test_filter)
+    return test_filters
diff --git a/starboard/evergreen/x86/thread_types_public.h b/starboard/evergreen/x86/thread_types_public.h
deleted file mode 100644
index 261f06a..0000000
--- a/starboard/evergreen/x86/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_EVERGREEN_X86_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_EVERGREEN_X86_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/shared/pthread/types_public.h"
-
-#endif  // STARBOARD_EVERGREEN_X86_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/evergreen/x86/toolchain/BUILD.gn b/starboard/evergreen/x86/toolchain/BUILD.gn
new file mode 100644
index 0000000..e444b05
--- /dev/null
+++ b/starboard/evergreen/x86/toolchain/BUILD.gn
@@ -0,0 +1,35 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/clang/clang.gni")
+import("//build/toolchain/gcc_toolchain.gni")
+import("//starboard/evergreen/shared/toolchain/toolchain.gni")
+
+clang_toolchain("host") {
+  clang_base_path = clang_base_path
+}
+
+gcc_toolchain("target") {
+  cc = evergreen_target_cc
+  cxx = evergreen_target_cxx
+  ld = evergreen_target_ld
+  ar = evergreen_target_ar
+  nm = evergreen_target_nm
+
+  extra_ldflags = string_join(" ", evergreen_target_extra_ldflags)
+
+  toolchain_args = {
+    is_clang = true
+  }
+}
diff --git a/starboard/evergreen/x86/toolchain/strip.gni b/starboard/evergreen/x86/toolchain/strip.gni
new file mode 100644
index 0000000..fc1f4ee
--- /dev/null
+++ b/starboard/evergreen/x86/toolchain/strip.gni
@@ -0,0 +1,15 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+strip_executable = "strip"
diff --git a/starboard/examples/examples.gyp b/starboard/examples/examples.gyp
deleted file mode 100644
index 8975678..0000000
--- a/starboard/examples/examples.gyp
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'examples',
-      'type': 'none',
-      'dependencies': [
-        '<(DEPTH)/starboard/examples/window/window.gyp:starboard_window_example',
-      ],
-      'conditions': [
-        ['gl_type != "none"', {
-          'dependencies': [
-            '<(DEPTH)/starboard/examples/glclear/glclear.gyp:starboard_glclear_example',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/starboard/examples/glclear/glclear.gyp b/starboard/examples/glclear/glclear.gyp
deleted file mode 100644
index bb814f63..0000000
--- a/starboard/examples/glclear/glclear.gyp
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'starboard_glclear_example',
-      'type': '<(final_executable_type)',
-      'conditions': [
-        ['sb_evergreen != 1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/egl_and_gles/egl_and_gles.gyp:egl_and_gles',
-          ],
-        }],
-      ],
-      'sources': [
-        'main.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'starboard_glclear_example_deploy',
-      'type': 'none',
-      'dependencies': [
-        'starboard_glclear_example',
-      ],
-      'variables': {
-        'executable_name': 'starboard_glclear_example',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/examples/glclear/main.cc b/starboard/examples/glclear/main.cc
index fcc5436..2a4e361 100644
--- a/starboard/examples/glclear/main.cc
+++ b/starboard/examples/glclear/main.cc
@@ -155,11 +155,7 @@
   SbEglInt32 context_attrib_list[] = {
       SB_EGL_CONTEXT_CLIENT_VERSION, 3, SB_EGL_NONE,
   };
-#if SB_API_VERSION < 12 && defined(GLES3_SUPPORTED)
-  // Attempt to create an OpenGL ES 3.0 context.
-  context_ = EGL_CALL_SIMPLE(eglCreateContext(
-      display_, config, SB_EGL_NO_CONTEXT, context_attrib_list));
-#endif
+
   if (context_ == SB_EGL_NO_CONTEXT) {
     // Create an OpenGL ES 2.0 context.
     context_attrib_list[1] = 2;
diff --git a/starboard/examples/window/window.gyp b/starboard/examples/window/window.gyp
deleted file mode 100644
index 3a8a282..0000000
--- a/starboard/examples/window/window.gyp
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'starboard_window_example',
-      'type': '<(final_executable_type)',
-      'sources': [
-        'main.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'starboard_window_example_deploy',
-      'type': 'none',
-      'dependencies': [
-        'starboard_window_example',
-      ],
-      'variables': {
-        'executable_name': 'starboard_window_example',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/file.h b/starboard/file.h
index 9cb71d6..4448f5f 100644
--- a/starboard/file.h
+++ b/starboard/file.h
@@ -155,8 +155,6 @@
 // |file|: The absolute path of the file to be closed.
 SB_EXPORT bool SbFileClose(SbFile file);
 
-#if SB_API_VERSION >= 12
-
 // Replaces the content of the file at |path| with |data|. Returns whether the
 // contents of the file were replaced. The replacement of the content is an
 // atomic operation. The file will either have all of the data, or none.
@@ -168,8 +166,6 @@
                                    const char* data,
                                    int64_t data_size);
 
-#endif  // SB_API_VERSION >= 12
-
 // Changes the current read/write position in |file|. The return value
 // identifies the resultant current read/write position in the file (relative
 // to the start) or |-1| in case of an error. This function might not support
diff --git a/starboard/input.h b/starboard/input.h
index c5b6378..fc8d5f2 100644
--- a/starboard/input.h
+++ b/starboard/input.h
@@ -70,13 +70,10 @@
   // Produces |Move|, |Press|, and |Unpress| events.
   kSbInputDeviceTypeTouchPad,
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   // Keyboard input from an on screen keyboard.
   //
   // Produces |Input| events.
   kSbInputDeviceTypeOnScreenKeyboard,
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 } SbInputDeviceType;
 
 // The action that an input event represents.
@@ -100,11 +97,8 @@
   // Wheel movement. Provides relative movements of the |Mouse| wheel.
   kSbInputEventTypeWheel,
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
   // https://w3c.github.io/uievents/#event-type-input
   kSbInputEventTypeInput,
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
 } SbInputEventType;
 
 // A 2-dimensional vector used to represent points and motion vectors.
@@ -181,13 +175,12 @@
   // towards the user (y). Use (NaN, NaN) for devices that do not report tilt.
   // This value is used for input events with device type mouse or touch screen.
   SbInputVector tilt;
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
+
   // The text to input for events of type |Input|.
   const char* input_text;
 
   // Set to true if the input event is part of a composition event.
   bool is_composing;
-#endif
 } SbInputData;
 
 #ifdef __cplusplus
diff --git a/starboard/linux/shared/BUILD.gn b/starboard/linux/shared/BUILD.gn
index 73e2a93..8e4a107 100644
--- a/starboard/linux/shared/BUILD.gn
+++ b/starboard/linux/shared/BUILD.gn
@@ -83,9 +83,6 @@
     "//starboard/shared/alsa/alsa_util.cc",
     "//starboard/shared/alsa/alsa_util.h",
     "//starboard/shared/deviceauth/deviceauth_internal.cc",
-    "//starboard/shared/dlmalloc/memory_map.cc",
-    "//starboard/shared/dlmalloc/memory_protect.cc",
-    "//starboard/shared/dlmalloc/memory_unmap.cc",
     "//starboard/shared/egl/system_egl.cc",
     "//starboard/shared/gcc/atomic_gcc_public.h",
     "//starboard/shared/gles/system_gles2.cc",
@@ -148,7 +145,6 @@
     "//starboard/shared/linux/dev_input/dev_input.h",
     "//starboard/shared/linux/get_home_directory.cc",
     "//starboard/shared/linux/memory_get_stack_bounds.cc",
-    "//starboard/shared/linux/page_internal.cc",
     "//starboard/shared/linux/socket_get_interface_address.cc",
     "//starboard/shared/linux/system_get_random_data.cc",
     "//starboard/shared/linux/system_get_stack.cc",
@@ -167,6 +163,7 @@
     "//starboard/shared/opus/opus_audio_decoder.cc",
     "//starboard/shared/opus/opus_audio_decoder.h",
     "//starboard/shared/posix/directory_create.cc",
+    "//starboard/shared/posix/environment.cc",
     "//starboard/shared/posix/file_atomic_replace.cc",
     "//starboard/shared/posix/file_can_open.cc",
     "//starboard/shared/posix/file_close.cc",
@@ -190,8 +187,12 @@
     "//starboard/shared/posix/memory_allocate_aligned_unchecked.cc",
     "//starboard/shared/posix/memory_flush.cc",
     "//starboard/shared/posix/memory_free_aligned.cc",
+    "//starboard/shared/posix/memory_map.cc",
     "//starboard/shared/posix/memory_mapped_file.cc",
     "//starboard/shared/posix/memory_mapped_file.h",
+    "//starboard/shared/posix/memory_protect.cc",
+    "//starboard/shared/posix/memory_unmap.cc",
+    "//starboard/shared/posix/page_internal.cc",
     "//starboard/shared/posix/set_non_blocking_internal.cc",
     "//starboard/shared/posix/socket_accept.cc",
     "//starboard/shared/posix/socket_bind.cc",
@@ -330,12 +331,12 @@
     "//starboard/shared/starboard/media/media_get_video_buffer_budget.cc",
     "//starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc",
     "//starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc",
-    "//starboard/shared/starboard/media/media_is_transfer_characteristics_supported.cc",
     "//starboard/shared/starboard/media/mime_type.cc",
     "//starboard/shared/starboard/media/mime_type.h",
     "//starboard/shared/starboard/memory.cc",
-    "//starboard/shared/starboard/player/player_output_mode_supported.cc",
     "//starboard/shared/starboard/queue_application.cc",
+    "//starboard/shared/starboard/starboard_switches.cc",
+    "//starboard/shared/starboard/starboard_switches.h",
     "//starboard/shared/starboard/string_concat.cc",
     "//starboard/shared/starboard/string_concat_wide.cc",
     "//starboard/shared/starboard/string_copy.cc",
@@ -354,15 +355,7 @@
     "//starboard/shared/stub/accessibility_get_display_settings.cc",
     "//starboard/shared/stub/accessibility_get_text_to_speech_settings.cc",
     "//starboard/shared/stub/accessibility_set_captions_enabled.cc",
-    "//starboard/shared/stub/cryptography_create_transformer.cc",
-    "//starboard/shared/stub/cryptography_destroy_transformer.cc",
-    "//starboard/shared/stub/cryptography_get_tag.cc",
-    "//starboard/shared/stub/cryptography_set_authenticated_data.cc",
-    "//starboard/shared/stub/cryptography_set_initialization_vector.cc",
-    "//starboard/shared/stub/cryptography_transform.cc",
-    "//starboard/shared/stub/media_is_output_protected.cc",
     "//starboard/shared/stub/media_set_audio_write_duration.cc",
-    "//starboard/shared/stub/media_set_output_protection.cc",
     "//starboard/shared/stub/microphone_close.cc",
     "//starboard/shared/stub/microphone_create.cc",
     "//starboard/shared/stub/microphone_destroy.cc",
diff --git a/starboard/linux/shared/cobalt/configuration.gypi b/starboard/linux/shared/cobalt/configuration.gypi
deleted file mode 100644
index a93dc98..0000000
--- a/starboard/linux/shared/cobalt/configuration.gypi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Cobalt-on-Linux-specific configuration.
-
-{
-  'variables': {
-    'in_app_dial%': 1,
-  }, # end of variables
-}
diff --git a/starboard/linux/shared/cobalt/configuration.py b/starboard/linux/shared/cobalt/configuration.py
index ce31306..72532e9 100644
--- a/starboard/linux/shared/cobalt/configuration.py
+++ b/starboard/linux/shared/cobalt/configuration.py
@@ -13,8 +13,6 @@
 # limitations under the License.
 """Starboard Linux Cobalt shared configuration."""
 
-import os
-
 from cobalt.build import cobalt_configuration
 from starboard.tools.testing import test_filter
 
@@ -22,24 +20,11 @@
 class CobaltLinuxConfiguration(cobalt_configuration.CobaltConfiguration):
   """Starboard Linux Cobalt shared configuration."""
 
-  def __init__(self, platform_configuration, application_name,
-               application_directory):
-    super(CobaltLinuxConfiguration, self).__init__(
-        platform_configuration, application_name, application_directory)
-
-  def GetPostIncludes(self):
-    # If there isn't a configuration.gypi found in the usual place, we'll
-    # supplement with our shared implementation.
-    includes = super(CobaltLinuxConfiguration, self).GetPostIncludes()
-    for include in includes:
-      if os.path.basename(include) == 'configuration.gypi':
-        return includes
-
-    shared_gypi_path = os.path.join(os.path.dirname(__file__),
-                                    'configuration.gypi')
-    if os.path.isfile(shared_gypi_path):
-      includes.append(shared_gypi_path)
-    return includes
+  def __init__(  # pylint:disable=useless-super-delegation
+      self, platform_configuration, application_name, application_directory):
+    super(CobaltLinuxConfiguration,
+          self).__init__(platform_configuration, application_name,
+                         application_directory)
 
   def WebdriverBenchmarksEnabled(self):
     return True
@@ -58,7 +43,7 @@
             'debug'),
         test_filter.TestFilter(
             'web_platform_tests',
-            'streams/WebPlatformTest.Run/streams_readable_streams_templated_html',
+            'streams/WebPlatformTest.Run/streams_readable_streams_templated_html',  # pylint:disable=line-too-long
             'debug'),
         test_filter.TestFilter(
             'web_platform_tests',
@@ -68,7 +53,13 @@
 
   def GetTestEnvVariables(self):
     return {
-        'base_unittests': {'ASAN_OPTIONS': 'detect_leaks=0'},
-        'crypto_unittests': {'ASAN_OPTIONS': 'detect_leaks=0'},
-        'net_unittests': {'ASAN_OPTIONS': 'detect_leaks=0'}
+        'base_unittests': {
+            'ASAN_OPTIONS': 'detect_leaks=0'
+        },
+        'crypto_unittests': {
+            'ASAN_OPTIONS': 'detect_leaks=0'
+        },
+        'net_unittests': {
+            'ASAN_OPTIONS': 'detect_leaks=0'
+        }
     }
diff --git a/starboard/linux/shared/compiler_flags.gypi b/starboard/linux/shared/compiler_flags.gypi
deleted file mode 100644
index 82e4bea..0000000
--- a/starboard/linux/shared/compiler_flags.gypi
+++ /dev/null
@@ -1,213 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Platform specific compiler flags for Linux on Starboard. Included from
-# gyp_configuration.gypi.
-#
-{
-  'variables': {
-    'compiler_flags_host': [
-      '-O2',
-    ],
-    'linker_flags': [
-    ],
-    'compiler_flags_debug': [
-      '-frtti',
-      '-O0',
-    ],
-    'compiler_flags_devel': [
-      '-frtti',
-      '-O2',
-    ],
-    'compiler_flags_qa': [
-      '-fno-rtti',
-      '-gline-tables-only',
-    ],
-    'compiler_flags_qa_size': [
-      '-Os',
-      # Compile symbols in separate sections
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-    'compiler_flags_qa_speed': [
-      '-O2',
-      # Compile symbols in separate sections
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-    'compiler_flags_gold': [
-      '-fno-rtti',
-      '-gline-tables-only',
-    ],
-    'compiler_flags_gold_size': [
-      '-Os',
-      # Compile symbols in separate sections
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-    'compiler_flags_gold_speed': [
-      '-O2',
-      # Compile symbols in separate sections
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-    'conditions': [
-      ['clang==1', {
-        'linker_flags': [
-          '-fuse-ld=lld',
-        ],
-        'common_clang_flags': [
-          '-Werror',
-          '-fcolor-diagnostics',
-          # Default visibility to hidden, to enable dead stripping.
-          '-fvisibility=hidden',
-          # Warn for implicit type conversions that may change a value.
-          '-Wconversion',
-          # Warns on switches on enums that cover all enum values but
-          # also contain a default: branch. Chrome is full of that.
-          '-Wno-covered-switch-default',
-          # protobuf uses hash_map.
-          '-Wno-deprecated',
-          '-fno-exceptions',
-          # Don't warn about the "struct foo f = {0};" initialization pattern.
-          '-Wno-missing-field-initializers',
-          # Do not warn for implicit sign conversions.
-          '-Wno-sign-conversion',
-          '-fno-strict-aliasing',  # See http://crbug.com/32204
-          '-Wno-unnamed-type-template-args',
-          # Triggered by the COMPILE_ASSERT macro.
-          '-Wno-unused-local-typedef',
-          # Do not warn if a function or variable cannot be implicitly
-          # instantiated.
-          '-Wno-undefined-var-template',
-          # Do not warn about an implicit exception spec mismatch.
-          '-Wno-implicit-exception-spec-mismatch',
-          # It's OK not to use some input parameters.
-          '-Wno-unused-parameter',
-        ],
-      }],
-      ['cobalt_fastbuild==0', {
-        'compiler_flags_debug': [
-          '-g',
-        ],
-        'compiler_flags_devel': [
-          '-g',
-        ],
-        'compiler_flags_qa': [
-          '-gline-tables-only',
-        ],
-        'compiler_flags_gold': [
-          '-gline-tables-only',
-        ],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'defines': [
-      # By default, <EGL/eglplatform.h> pulls in some X11 headers that have some
-      # nasty macros (|Status|, for example) that conflict with Chromium base.
-      'MESA_EGL_NO_X11_HEADERS'
-    ],
-    'cflags_c': [
-      # Limit to C99. This allows Linux to be a canary build for any
-      # C11 features that are not supported on some platforms' compilers.
-      '-std=c99',
-    ],
-    'cflags_cc': [
-      '-std=gnu++14',
-    ],
-    'ldflags': [
-      '-Wl,-rpath=$ORIGIN/lib',
-      # Cleanup unused sections
-      '-Wl,-gc-sections',
-    ],
-    'target_conditions': [
-      ['sb_pedantic_warnings==1', {
-        'cflags': [
-          '-Wall',
-          '-Wextra',
-          '-Wunreachable-code',
-          '<@(common_clang_flags)',
-        ],
-      },{
-        'cflags': [
-          '<@(common_clang_flags)',
-          # 'this' pointer cannot be NULL...pointer may be assumed
-          # to always convert to true.
-          '-Wno-undefined-bool-conversion',
-          # Skia doesn't use overrides.
-          '-Wno-inconsistent-missing-override',
-          # Do not warn for implicit type conversions that may change a value.
-          '-Wno-conversion',
-          # shifting a negative signed value is undefined
-          '-Wno-shift-negative-value',
-          # Width of bit-field exceeds width of its type- value will be truncated
-          '-Wno-bitfield-width',
-          '-Wno-undefined-var-template',
-        ],
-      }],
-      ['use_source_code_coverage==1', {
-        'cflags': [
-          # Enable Source Based Code Coverage instrumentation.
-          # See https://clang.llvm.org/docs/SourceBasedCodeCoverage.html
-          '-fprofile-instr-generate',
-          '-fcoverage-mapping',
-        ],
-        'ldflags': [
-          # Enable Source Based Code Coverage instrumentation.
-          # See https://clang.llvm.org/docs/SourceBasedCodeCoverage.html
-          '-fprofile-instr-generate',
-          '-fcoverage-mapping',
-        ],
-        'defines': [
-          'USE_SOURCE_CODE_COVERAGE',
-        ],
-      }],
-      ['use_asan==1', {
-        'cflags': [
-          '-fsanitize=address',
-          '-fno-omit-frame-pointer',
-        ],
-        'ldflags': [
-          '-fsanitize=address',
-          # Force linking of the helpers in sanitizer_options.cc
-          '-Wl,-u_sanitizer_options_link_helper',
-        ],
-        'defines': [
-          'ADDRESS_SANITIZER',
-        ],
-        'conditions': [
-          ['asan_symbolizer_path!=""', {
-            'defines': [
-              'ASAN_SYMBOLIZER_PATH="<@(asan_symbolizer_path)"',
-            ],
-          }],
-        ],
-      }],
-      ['use_tsan==1', {
-        'cflags': [
-          '-fsanitize=thread',
-          '-fno-omit-frame-pointer',
-        ],
-        'ldflags': [
-          '-fsanitize=thread',
-        ],
-        'defines': [
-          'THREAD_SANITIZER',
-        ],
-      }],
-    ],
-  }, # end of target_defaults
-}
diff --git a/starboard/linux/shared/configuration_constants.cc b/starboard/linux/shared/configuration_constants.cc
index c8e58c2..5210e79 100644
--- a/starboard/linux/shared/configuration_constants.cc
+++ b/starboard/linux/shared/configuration_constants.cc
@@ -16,9 +16,7 @@
 
 #include "starboard/configuration_constants.h"
 
-#if SB_API_VERSION >= 12
-
-// Determines the threshhold of allocation size that should be done with mmap
+// Determines the threshold of allocation size that should be done with mmap
 // (if available), rather than allocated within the core heap.
 const size_t kSbDefaultMmapThreshold = 256 * 1024U;
 
@@ -129,5 +127,3 @@
 
 // The maximum number of users that can be signed in at the same time.
 const uint32_t kSbUserMaxSignedIn = 1;
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/linux/shared/configuration_public.h b/starboard/linux/shared/configuration_public.h
index 3d24e71..d2b4732 100644
--- a/starboard/linux/shared/configuration_public.h
+++ b/starboard/linux/shared/configuration_public.h
@@ -104,191 +104,24 @@
 // The location to include hash_set on this platform.
 #define SB_HASH_SET_INCLUDE <ext/hash_set>
 
-// --- Filesystem Configuration ----------------------------------------------
-
-#if SB_API_VERSION < 12
-// The current platform's maximum length of the name of a single directory
-// entry, not including the absolute path.
-#define SB_FILE_MAX_NAME 64
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The current platform's maximum length of an absolute path.
-#define SB_FILE_MAX_PATH 4096
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The current platform's maximum number of files that can be opened at the
-// same time by one process.
-#define SB_FILE_MAX_OPEN 256
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The current platform's file path component separator character. This is the
-// character that appears after a directory in a file path. For example, the
-// absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path
-// component separator character.
-#define SB_FILE_SEP_CHAR '/'
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The current platform's alternate file path component separator character.
-// This is like SB_FILE_SEP_CHAR, except if your platform supports an alternate
-// character, then you can place that here. For example, on windows machines,
-// the primary separator character is probably '\', but the alternate is '/'.
-#define SB_FILE_ALT_SEP_CHAR '/'
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The current platform's search path component separator character. When
-// specifying an ordered list of absolute paths of directories to search for a
-// given reason, this is the character that appears between entries. For
-// example, the search path of "/etc/search/first:/etc/search/second" uses ':'
-// as a search path component separator character.
-#define SB_PATH_SEP_CHAR ':'
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The string form of SB_FILE_SEP_CHAR.
-#define SB_FILE_SEP_STRING "/"
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The string form of SB_FILE_ALT_SEP_CHAR.
-#define SB_FILE_ALT_SEP_STRING "/"
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The string form of SB_PATH_SEP_CHAR.
-#define SB_PATH_SEP_STRING ":"
-#endif  // SB_API_VERSION < 12
-
 // --- Graphics Configuration ------------------------------------------------
 
-#if SB_API_VERSION < 12
-// Specifies the preferred byte order of color channels in a pixel. Refer to
-// starboard/configuration.h for the possible values. EGL/GLES platforms should
-// generally prefer a byte order of RGBA, regardless of endianness.
-#define SB_PREFERRED_RGBA_BYTE_ORDER SB_PREFERRED_RGBA_BYTE_ORDER_RGBA
-#endif  // SB_API_VERSION < 12
-
 // Indicates whether or not the given platform supports bilinear filtering.
 // This can be checked to enable/disable renderer tests that verify that this is
 // working properly.
 #define SB_HAS_BILINEAR_FILTERING_SUPPORT 1
 
-#if SB_API_VERSION < 12
-// Whether the current platform should frequently flip their display buffer.
-// If this is not required (e.g. SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER is set
-// to 0), then optimizations where the display buffer is not flipped if the
-// scene hasn't changed are enabled.
-#define SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER 0
-#endif
 // --- I/O Configuration -----------------------------------------------------
 
 // Whether the current platform has speech synthesis.
 #define SB_HAS_SPEECH_SYNTHESIS 0
 
-// --- Media Configuration ---------------------------------------------------
-
-#if SB_API_VERSION < 12
-// Allow ac3 and ec3 support
-#define SB_HAS_AC3_AUDIO 1
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// Specifies whether this platform updates audio frames asynchronously.  In such
-// case an extra parameter will be added to |SbAudioSinkConsumeFramesFunc| to
-// indicate the absolute time that the consumed audio frames are reported.
-// Check document for |SbAudioSinkConsumeFramesFunc| in audio_sink.h for more
-// details.
-#define SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING 0
-#endif  // SB_API_VERSION <  12
-
-#if SB_API_VERSION < 12
-// The maximum audio bitrate the platform can decode.  The following value
-// equals to 5M bytes per seconds which is more than enough for compressed
-// audio.
-#define SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND (40 * 1024 * 1024)
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The maximum video bitrate the platform can decode.  The following value
-// equals to 25M bytes per seconds which is more than enough for compressed
-// video.
-#define SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND (200 * 1024 * 1024)
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// Specifies whether this platform has webm/vp9 support.  This should be set to
-// non-zero on platforms with webm/vp9 support.
-#define SB_HAS_MEDIA_WEBM_VP9_SUPPORT 0
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// Specifies the stack size for threads created inside media stack.  Set to 0 to
-// use the default thread stack size.  Set to non-zero to explicitly set the
-// stack size for media stack threads.
-#define SB_MEDIA_THREAD_STACK_SIZE 0U
-#endif  // SB_API_VERSION < 12
-
 // --- Decoder-only Params ---
 
-#if SB_API_VERSION < 12
-// Specifies how media buffers must be aligned on this platform as some
-// decoders may have special requirement on the alignment of buffers being
-// decoded.
-#define SB_MEDIA_BUFFER_ALIGNMENT 128U
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// Specifies how video frame buffers must be aligned on this platform.
-#define SB_MEDIA_VIDEO_FRAME_ALIGNMENT 256U
-#endif  // SB_API_VERSION < 12
-
-// --- Memory Configuration --------------------------------------------------
-
-#if SB_API_VERSION < 12
-// The memory page size, which controls the size of chunks on memory that
-// allocators deal with, and the alignment of those chunks. This doesn't have to
-// be the hardware-defined physical page size, but it should be a multiple of
-// it.
-#define SB_MEMORY_PAGE_SIZE 4096
-#endif  // SB_API_VERSION < 12
-
-// Whether this platform has and should use an MMAP function to map physical
-// memory to the virtual address space.
-#if SB_API_VERSION < 12
-#define SB_HAS_MMAP 1
-#endif
-
 // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
 // required for platforms that want to JIT.
 #define SB_CAN_MAP_EXECUTABLE_MEMORY 1
 
-#if SB_API_VERSION < 12
-// Specifies the alignment for IO Buffers, in bytes. Some low-level network APIs
-// may require buffers to have a specific alignment, and this is the place to
-// specify that.
-#define SB_NETWORK_IO_BUFFER_ALIGNMENT 16
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// Determines the alignment that allocations should have on this platform.
-#define SB_MALLOC_ALIGNMENT ((size_t)16U)
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// Determines the threshold of allocation size that should be done with mmap
-// (if available), rather than allocated within the core heap.
-#define SB_DEFAULT_MMAP_THRESHOLD ((size_t)(256 * 1024U))
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// Defines the path where memory debugging logs should be written to.
-#define SB_MEMORY_LOG_PATH "/tmp/starboard"
-#endif  // SB_API_VERSION < 12
-
 // --- Network Configuration -------------------------------------------------
 
 // Specifies whether this platform supports IPV6.
@@ -297,56 +130,6 @@
 // Specifies whether this platform supports pipe.
 #define SB_HAS_PIPE 1
 
-// --- Thread Configuration --------------------------------------------------
-
-#if SB_API_VERSION < 12
-// On default Linux desktop, you must be a superuser in order to set real time
-// scheduling on threads.
-#define SB_HAS_THREAD_PRIORITY_SUPPORT 0
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// Defines the maximum number of simultaneous threads for this platform. Some
-// platforms require sharing thread handles with other kinds of system handles,
-// like mutexes, so we want to keep this manageable.
-#define SB_MAX_THREADS 90
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The maximum number of thread local storage keys supported by this platform.
-#define SB_MAX_THREAD_LOCAL_KEYS 512
-#endif  // SB_API_VERSION < 12
-
-#if SB_API_VERSION < 12
-// The maximum length of the name for a thread, including the NULL-terminator.
-#define SB_MAX_THREAD_NAME_LENGTH 16
-#endif  // SB_API_VERSION < 12
-
-// --- Tuneable Parameters ---------------------------------------------------
-
-#if SB_API_VERSION < 12
-// Specifies the network receive buffer size in bytes, set via
-// SbSocketSetReceiveBufferSize().
-//
-// Setting this to 0 indicates that SbSocketSetReceiveBufferSize() should
-// not be called. Use this for OSs (such as Linux) where receive buffer
-// auto-tuning is better.
-//
-// On some platforms, this may affect max TCP window size which may
-// dramatically affect throughput in the presence of latency.
-//
-// If your platform does not have a good TCP auto-tuning mechanism,
-// a setting of (128 * 1024) here is recommended.
-#define SB_NETWORK_RECEIVE_BUFFER_SIZE (0)
-#endif  // SB_API_VERSION < 12
-
-// --- User Configuration ----------------------------------------------------
-
-#if SB_API_VERSION < 12
-// The maximum number of users that can be signed in at the same time.
-#define SB_USER_MAX_SIGNED_IN 1
-#endif  // SB_API_VERSION < 12
-
 // --- Timing API ------------------------------------------------------------
 
 // Whether this platform has an API to retrieve how long the current thread
diff --git a/starboard/linux/shared/enable_glx_via_angle.gypi b/starboard/linux/shared/enable_glx_via_angle.gypi
deleted file mode 100644
index 661e451..0000000
--- a/starboard/linux/shared/enable_glx_via_angle.gypi
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  # Angle configuration for translating EGL/GLES -> GLX/OpenGL.
-  'variables': {
-    # Sets the default value of 'gl_type' to angle, so that other Linux
-    # configurations could override it.
-    'gl_type%': 'angle',
-    'angle_build_winrt': 0,
-    'angle_enable_gl': 1,
-    'angle_enable_d3d11': 0,
-    'angle_link_glx': 0,
-    'angle_use_glx': 1,
-    'angle_platform_linux': 1,
-    'angle_platform_posix': 1,
-  },
-}
diff --git a/starboard/linux/shared/gyp_configuration.gypi b/starboard/linux/shared/gyp_configuration.gypi
deleted file mode 100644
index a41979c..0000000
--- a/starboard/linux/shared/gyp_configuration.gypi
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Platform specific configuration for Linux on Starboard.  Automatically
-# included by gyp_cobalt in all .gyp files by Cobalt together with base.gypi.
-#
-{
-  'variables': {
-    # Override that omits the "data" subdirectory.
-    # TODO: Remove when omitted for all platforms in base_configuration.gypi.
-    'sb_static_contents_output_data_dir': '<(PRODUCT_DIR)/content',
-
-    'target_os': 'linux',
-    'yasm_exists': 1,
-    'sb_widevine_platform' : 'linux',
-    'sb_disable_opus_sse': 1,
-    'sb_enable_benchmark': 1,
-
-    'platform_libraries': [
-      '-lasound',
-      '-ldl',
-      '-lpthread',
-      '-lrt',
-    ],
-
-    'conditions': [
-      ['sb_evergreen != 1', {
-        # TODO: allow starboard_platform to use system libc/libc++ in the
-        # future. For now, if this flags is enabled, a warning emerge saying
-        # it's unused anyway.
-        'linker_flags': [
-          '-static-libstdc++',
-        ],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'defines': [
-      # Cobalt on Linux flag
-      'COBALT_LINUX',
-      '__STDC_FORMAT_MACROS', # so that we get PRI*
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'conditions': [
-      ['cobalt_config == "debug"', {
-        'defines': [
-          # Enable debug mode for the C++ standard library.
-          # https://gcc.gnu.org/onlinedocs/libstdc%2B%2B/manual/debug_mode_using.html
-          # https://libcxx.llvm.org/docs/DesignDocs/DebugMode.html
-          '_GLIBCXX_DEBUG',
-          '_LIBCPP_DEBUG=1',
-        ],
-      }],
-      ['cobalt_config == "devel"', {
-        'defines': [
-          # Enable debug mode for the C++ standard library.
-          # https://gcc.gnu.org/onlinedocs/libstdc%2B%2B/manual/debug_mode_using.html
-          # https://libcxx.llvm.org/docs/DesignDocs/DebugMode.html
-          '_GLIBCXX_DEBUG',
-          '_LIBCPP_DEBUG=0',
-        ],
-      }],
-    ],
-  }, # end of target_defaults
-}
diff --git a/starboard/linux/shared/gyp_configuration.py b/starboard/linux/shared/gyp_configuration.py
index 109b328..7327f3b 100644
--- a/starboard/linux/shared/gyp_configuration.py
+++ b/starboard/linux/shared/gyp_configuration.py
@@ -15,64 +15,20 @@
 
 import os
 
-from starboard.build import clang
 from starboard.build import platform_configuration
-from starboard.tools import build
-from starboard.tools import paths
-from starboard.tools.testing import test_filter
 
 
 class LinuxConfiguration(platform_configuration.PlatformConfiguration):
   """Starboard Linux platform configuration."""
 
-  def __init__(self,
-               platform,
-               asan_enabled_by_default=True,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(LinuxConfiguration, self).__init__(platform, asan_enabled_by_default)
-
-    self.sabi_json_path = sabi_json_path
+  def __init__(self, platform):
+    super(LinuxConfiguration, self).__init__(platform)
     self.AppendApplicationConfigurationPath(os.path.dirname(__file__))
 
-  def GetBuildFormat(self):
-    """Returns the desired build format."""
-    # The comma means that ninja and qtcreator_ninja will be chained and use the
-    # same input information so that .gyp files will only have to be parsed
-    # once.
-    return 'ninja,qtcreator_ninja'
-
-  def GetVariables(self, config_name):
-    variables = super(LinuxConfiguration, self).GetVariables(
-        config_name, use_clang=1)
-    variables.update({
-        'include_path_platform_deploy_gypi':
-            'starboard/linux/shared/platform_deploy.gypi',
-    })
-    return variables
-
   def GetLauncherPath(self):
     """Gets the path to the launcher module for this platform."""
     return os.path.dirname(__file__)
 
-  def GetGeneratorVariables(self, config_name):
-    del config_name
-    generator_variables = {
-        'qtcreator_session_name_prefix': 'cobalt',
-    }
-    return generator_variables
-
-  def GetEnvironmentVariables(self):
-    if not hasattr(self, '_host_compiler_environment'):
-      self._host_compiler_environment = build.GetHostCompilerEnvironment(
-          clang.GetClangSpecification(), self.build_accelerator)
-
-    env_variables = self._host_compiler_environment
-    env_variables.update({
-        'CC': self._host_compiler_environment['CC_host'],
-        'CXX': self._host_compiler_environment['CXX_host'],
-    })
-    return env_variables
-
   def GetTestEnvVariables(self):
     # Due to fragile nature of dynamic TLS tracking, in particular LSAN reliance
     # on GLIBC private APIs, tracking TLS leaks is unstable and can trigger
@@ -84,66 +40,3 @@
     # be printed at test shutdown, and env var LSAN_OPTIONS=verbosity=2 would
     # further point to 'Scanning DTLS range ..' prior to crash.
     return {'ASAN_OPTIONS': 'intercept_tls_get_addr=0'}
-
-  def GetTestFilters(self):
-    filters = super(LinuxConfiguration, self).GetTestFilters()
-
-    has_cdm = os.path.isfile(
-        os.path.join(paths.REPOSITORY_ROOT, 'third_party', 'ce_cdm', 'cdm',
-                     'include', 'cdm.h'))
-
-    for target, tests in self.__FILTERED_TESTS.iteritems():
-      filters.extend(test_filter.TestFilter(target, test) for test in tests)
-
-    if has_cdm:
-      return filters
-
-    # Filter the drm related tests, as ce_cdm is not present.
-    for target, tests in self.__DRM_RELATED_TESTS.iteritems():
-      filters.extend(test_filter.TestFilter(target, test) for test in tests)
-    return filters
-
-  def GetPathToSabiJsonFile(self):
-    return self.sabi_json_path
-
-  __DRM_RELATED_TESTS = {  # pylint: disable=invalid-name
-      'nplb': [
-          'SbDrmTest.AnySupportedKeySystems',
-          'SbMediaCanPlayMimeAndKeySystem.AnySupportedKeySystems',
-      ],
-  }
-
-  # pylint: disable=line-too-long
-  __FILTERED_TESTS = {  # pylint: disable=invalid-name
-      'player_filter_tests': [
-          # libdav1d crashes when fed invalid data
-          'VideoDecoderTests/VideoDecoderTest.*Invalid*',
-      ],
-  }
-  __FILTERED_TESTS['nplb'] = []
-  # Conditionally disables tests that require ipv6
-  if os.getenv('IPV6_AVAILABLE', '1') == '0':
-    __FILTERED_TESTS['nplb'].extend([
-        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDayDestination/1',
-        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceForDestination/1',
-        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceNotLoopback/1',
-    ])
-  # TODO: Re-enable once tests or infra fixed.
-  __FILTERED_TESTS['nplb'].extend([
-      'SbSocketAddressTypes/SbSocketBindTest.RainyDayBadInterface/1',
-      'SbSocketAddressTypes/PairSbSocketGetLocalAddressTest.SunnyDayConnected/1',
-      'SbSocketAddressTypes/PairSbSocketIsConnectedAndIdleTest.SunnyDay/1',
-      'SbSocketAddressTypes/PairSbSocketIsConnectedTest.SunnyDay/1',
-      'SbSocketAddressTypes/PairSbSocketReceiveFromTest.SunnyDay/1',
-      'SbSocketAddressTypes/SbSocketResolveTest.Localhost/1',
-      'SbSocketAddressTypes/SbSocketResolveTest.SunnyDayFiltered/1',
-      'SbSocketAddressTypes/PairSbSocketSendToTest.RainyDaySendToClosedSocket/1',
-      'SbSocketAddressTypes/PairSbSocketSendToTest.RainyDaySendToSocketUntilBlocking/1',
-      'SbSocketAddressTypes/PairSbSocketSendToTest.RainyDaySendToSocketConnectionReset/1',
-      'SbSocketAddressTypes/PairSbSocketWaiterWaitTest.SunnyDay/1',
-      'SbSocketAddressTypes/PairSbSocketWaiterWaitTest.SunnyDayAlreadyReady/1',
-      'SbSocketAddressTypes/PairSbSocketWaiterWaitTimedTest.SunnyDay/1',
-      'SbSocketAddressTypes/PairSbSocketWrapperTest.SunnyDay/1',
-  ])
-
-  # pylint: enable=line-too-long
diff --git a/starboard/linux/shared/launcher.py b/starboard/linux/shared/launcher.py
index 0921d1a..867ada8 100644
--- a/starboard/linux/shared/launcher.py
+++ b/starboard/linux/shared/launcher.py
@@ -23,7 +23,6 @@
 import time
 import traceback
 
-import _env  # pylint: disable=unused-import
 from starboard.tools import abstract_launcher
 from starboard.tools import send_link
 
@@ -37,7 +36,7 @@
     pid: process id of specified cobalt instance.
   """
   output = subprocess.check_output(["ps -o state= -p {}".format(pid)],
-                                   shell=True)
+                                   shell=True).decode()
   return output
 
 
diff --git a/starboard/linux/shared/libraries.gypi b/starboard/linux/shared/libraries.gypi
deleted file mode 100644
index 55f16ba..0000000
--- a/starboard/linux/shared/libraries.gypi
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    # Hook into the swap buffers call to facilitate synchronization of the
-    # OpenGL output with the punch-through video layer.
-    'linker_flags': [
-      '-Wl,--wrap=eglSwapBuffers',
-    ],
-
-    'platform_libraries': [
-      '-lX11',
-      '-lXcomposite',
-      '-lXrender',
-    ],
-  },
-
-  'includes': [
-    'enable_glx_via_angle.gypi',
-  ],
-}
diff --git a/starboard/linux/shared/media_is_audio_supported.cc b/starboard/linux/shared/media_is_audio_supported.cc
index 8054684..1780684 100644
--- a/starboard/linux/shared/media_is_audio_supported.cc
+++ b/starboard/linux/shared/media_is_audio_supported.cc
@@ -20,16 +20,12 @@
 #include "starboard/media.h"
 
 bool SbMediaIsAudioSupported(SbMediaAudioCodec audio_codec,
-#if SB_API_VERSION >= 12
                              const char* content_type,
-#endif  // SB_API_VERSION >= 12
                              int64_t bitrate) {
-#if SB_API_VERSION >= 12
   if (!content_type) {
     SB_LOG(WARNING) << "|content_type| cannot be nullptr.";
     return false;
   }
-#endif  // SB_API_VERSION >= 12
 
   if (audio_codec == kSbMediaAudioCodecAac) {
     return bitrate <= kSbMediaMaxAudioBitrateInBitsPerSecond;
@@ -39,15 +35,12 @@
     return bitrate <= kSbMediaMaxAudioBitrateInBitsPerSecond;
   }
 
-#if SB_API_VERSION >= 12 || defined(SB_HAS_AC3_AUDIO)
   if (kSbHasAc3Audio) {
     if (audio_codec == kSbMediaAudioCodecAc3 ||
         audio_codec == kSbMediaAudioCodecEac3) {
       return bitrate <= kSbMediaMaxAudioBitrateInBitsPerSecond;
     }
   }
-#endif  // SB_API_VERSION >= 12 ||
-        // defined(SB_HAS_AC3_AUDIO)
 
   return false;
 }
diff --git a/starboard/linux/shared/media_is_video_supported.cc b/starboard/linux/shared/media_is_video_supported.cc
index 423fb77..98ccacd 100644
--- a/starboard/linux/shared/media_is_video_supported.cc
+++ b/starboard/linux/shared/media_is_video_supported.cc
@@ -26,30 +26,22 @@
 using starboard::shared::starboard::media::IsSDRVideo;
 
 bool SbMediaIsVideoSupported(SbMediaVideoCodec video_codec,
-#if SB_API_VERSION >= 12
                              const char* content_type,
-#endif  // SB_API_VERSION >= 12
-#if SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
                              int profile,
                              int level,
                              int bit_depth,
                              SbMediaPrimaryId primary_id,
                              SbMediaTransferId transfer_id,
                              SbMediaMatrixId matrix_id,
-#endif  // SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
                              int frame_width,
                              int frame_height,
                              int64_t bitrate,
                              int fps,
                              bool decode_to_texture_required) {
-#if SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-
-#if SB_API_VERSION >= 12
   if (!content_type) {
     SB_LOG(WARNING) << "|content_type| cannot be nullptr.";
     return false;
   }
-#endif  // SB_API_VERSION >= 12
 
   if (!IsSDRVideo(bit_depth, primary_id, transfer_id, matrix_id)) {
     if (bit_depth != 10 && bit_depth != 12) {
@@ -61,7 +53,6 @@
       return false;
     }
   }
-#endif  // SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
 
   if (decode_to_texture_required) {
     bool has_gles_support = SbGetGlesInterface();
diff --git a/starboard/linux/shared/platform_configuration/BUILD.gn b/starboard/linux/shared/platform_configuration/BUILD.gn
index d221e63..3c53330 100644
--- a/starboard/linux/shared/platform_configuration/BUILD.gn
+++ b/starboard/linux/shared/platform_configuration/BUILD.gn
@@ -157,23 +157,26 @@
 }
 
 config("speed") {
-  cflags = [
-    "-O2",
+  cflags = [ "-O2" ]
 
-    # Compile symbols in separate sections
-    "-ffunction-sections",
-    "-fdata-sections",
-  ]
+  if (is_qa || is_gold) {
+    cflags += [
+      # Compile symbols in separate sections
+      "-ffunction-sections",
+      "-fdata-sections",
+    ]
+  }
 }
 
 config("size") {
-  cflags = [
-    "-Os",
-
-    # Compile symbols in separate sections
-    "-ffunction-sections",
-    "-fdata-sections",
-  ]
+  cflags = [ "-Os" ]
+  if (is_qa || is_gold) {
+    cflags += [
+      # Compile symbols in separate sections
+      "-ffunction-sections",
+      "-fdata-sections",
+    ]
+  }
 }
 
 config("pedantic_warnings") {
diff --git a/starboard/linux/shared/platform_configuration/configuration.gni b/starboard/linux/shared/platform_configuration/configuration.gni
index aaceac5..ef6eba3 100644
--- a/starboard/linux/shared/platform_configuration/configuration.gni
+++ b/starboard/linux/shared/platform_configuration/configuration.gni
@@ -34,7 +34,6 @@
 
 sb_widevine_platform = "linux"
 
-has_drm_support = is_internal_build
 platform_tests_path = "//starboard/linux/shared:starboard_platform_tests"
 
-in_app_dial = true
+enable_in_app_dial = true
diff --git a/starboard/linux/shared/platform_deploy.gypi b/starboard/linux/shared/platform_deploy.gypi
deleted file mode 100644
index 0bbac50..0000000
--- a/starboard/linux/shared/platform_deploy.gypi
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'variables': {
-    'executable_file': '<(PRODUCT_DIR)/<(executable_name)',
-    'deploy_executable_file': '<(target_deploy_dir)/<(executable_name)',
-  },
-  'includes': [ '<(DEPTH)/starboard/build/collect_deploy_content.gypi' ],
-  'actions': [
-    {
-      'action_name': 'deploy_executable',
-      'message': 'Link deploy executable: <(deploy_executable_file)',
-      'inputs': [
-        '<(executable_file)',
-        '<(content_deploy_stamp_file)',
-      ],
-      'outputs': [ '<(deploy_executable_file)' ],
-      'action': [
-        'ln',
-        '-sf',
-        '$$(realpath --relative-to=<(target_deploy_dir) <(executable_file))',
-        '<(deploy_executable_file)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/linux/shared/soft_mic_platform_service.cc b/starboard/linux/shared/soft_mic_platform_service.cc
index 6d96f88..15fe440 100644
--- a/starboard/linux/shared/soft_mic_platform_service.cc
+++ b/starboard/linux/shared/soft_mic_platform_service.cc
@@ -48,7 +48,6 @@
 
 bool Has(const char* name) {
   // Check if platform has service name.
-  SB_LOG(INFO) << "Has(): " << name;
   return strcmp(name, "com.google.youtube.tv.SoftMic") == 0;
 }
 
diff --git a/starboard/linux/shared/starboard_base_symbolize.gyp b/starboard/linux/shared/starboard_base_symbolize.gyp
deleted file mode 100644
index 41bb3c1..0000000
--- a/starboard/linux/shared/starboard_base_symbolize.gyp
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'targets': [
-    {
-      'target_name': 'starboard_base_symbolize',
-      'type': 'static_library',
-      'sources': [
-        '<(DEPTH)/base/third_party/symbolize/demangle.cc',
-        '<(DEPTH)/base/third_party/symbolize/symbolize.cc',
-      ],
-      'conditions': [
-        ['sb_evergreen_compatible == 1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/elf_loader/evergreen_info.gyp:evergreen_info',
-          ],},
-        ],
-      ],
-    },
-  ],
-}
diff --git a/starboard/linux/shared/starboard_platform.gypi b/starboard/linux/shared/starboard_platform.gypi
deleted file mode 100644
index 9c3bec7..0000000
--- a/starboard/linux/shared/starboard_platform.gypi
+++ /dev/null
@@ -1,446 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/shared/starboard/player/filter/player_filter.gypi',
-  ],
-  'variables': {
-    'variables': {
-      'has_cdm%': '<!pymod_do_main(starboard.build.gyp_functions file_exists <(DEPTH)/third_party/ce_cdm/cdm/include/cdm.h)',
-    },
-    # This has_cdm gets exported to gyp files that include this one.
-    'has_cdm%': '<(has_cdm)',
-    'starboard_platform_sources': [
-      '<@(filter_based_player_sources)',
-      '<(DEPTH)/starboard/linux/shared/atomic_public.h',
-      '<(DEPTH)/starboard/linux/shared/audio_sink_type_dispatcher.cc',
-      '<(DEPTH)/starboard/linux/shared/configuration_constants.cc',
-      '<(DEPTH)/starboard/linux/shared/configuration_public.h',
-      '<(DEPTH)/starboard/linux/shared/configuration.cc',
-      '<(DEPTH)/starboard/linux/shared/configuration.h',
-      '<(DEPTH)/starboard/linux/shared/decode_target_get_info.cc',
-      '<(DEPTH)/starboard/linux/shared/decode_target_internal.cc',
-      '<(DEPTH)/starboard/linux/shared/decode_target_internal.h',
-      '<(DEPTH)/starboard/linux/shared/decode_target_release.cc',
-      '<(DEPTH)/starboard/linux/shared/media_is_audio_supported.cc',
-      '<(DEPTH)/starboard/linux/shared/media_is_video_supported.cc',
-      '<(DEPTH)/starboard/linux/shared/netlink.cc',
-      '<(DEPTH)/starboard/linux/shared/netlink.h',
-      '<(DEPTH)/starboard/linux/shared/player_components_factory.cc',
-      '<(DEPTH)/starboard/linux/shared/routes.cc',
-      '<(DEPTH)/starboard/linux/shared/routes.h',
-      '<(DEPTH)/starboard/linux/shared/soft_mic_platform_service.cc',
-      '<(DEPTH)/starboard/linux/shared/soft_mic_platform_service.h',
-      '<(DEPTH)/starboard/linux/shared/system_get_connection_type.cc',
-      '<(DEPTH)/starboard/linux/shared/system_get_device_type.cc',
-      '<(DEPTH)/starboard/linux/shared/system_get_extensions.cc',
-      '<(DEPTH)/starboard/linux/shared/system_get_path.cc',
-      '<(DEPTH)/starboard/linux/shared/system_has_capability.cc',
-      '<(DEPTH)/starboard/shared/alsa/alsa_audio_sink_type.cc',
-      '<(DEPTH)/starboard/shared/alsa/alsa_audio_sink_type.h',
-      '<(DEPTH)/starboard/shared/alsa/alsa_util.cc',
-      '<(DEPTH)/starboard/shared/alsa/alsa_util.h',
-      '<(DEPTH)/starboard/shared/deviceauth/deviceauth_internal.cc',
-      '<(DEPTH)/starboard/shared/dlmalloc/memory_map.cc',
-      '<(DEPTH)/starboard/shared/dlmalloc/memory_protect.cc',
-      '<(DEPTH)/starboard/shared/dlmalloc/memory_unmap.cc',
-      '<(DEPTH)/starboard/shared/egl/system_egl.cc',
-      '<(DEPTH)/starboard/shared/gcc/atomic_gcc_public.h',
-      '<(DEPTH)/starboard/shared/gles/system_gles2.cc',
-      '<(DEPTH)/starboard/shared/iso/character_is_alphanumeric.cc',
-      '<(DEPTH)/starboard/shared/iso/character_is_digit.cc',
-      '<(DEPTH)/starboard/shared/iso/character_is_hex_digit.cc',
-      '<(DEPTH)/starboard/shared/iso/character_is_space.cc',
-      '<(DEPTH)/starboard/shared/iso/character_is_upper.cc',
-      '<(DEPTH)/starboard/shared/iso/character_to_lower.cc',
-      '<(DEPTH)/starboard/shared/iso/character_to_upper.cc',
-      '<(DEPTH)/starboard/shared/iso/directory_close.cc',
-      '<(DEPTH)/starboard/shared/iso/directory_get_next.cc',
-      '<(DEPTH)/starboard/shared/iso/directory_open.cc',
-      '<(DEPTH)/starboard/shared/iso/double_absolute.cc',
-      '<(DEPTH)/starboard/shared/iso/double_exponent.cc',
-      '<(DEPTH)/starboard/shared/iso/double_floor.cc',
-      '<(DEPTH)/starboard/shared/iso/double_is_finite.cc',
-      '<(DEPTH)/starboard/shared/iso/double_is_nan.cc',
-      '<(DEPTH)/starboard/shared/iso/memory_allocate_unchecked.cc',
-      '<(DEPTH)/starboard/shared/iso/memory_compare.cc',
-      '<(DEPTH)/starboard/shared/iso/memory_copy.cc',
-      '<(DEPTH)/starboard/shared/iso/memory_find_byte.cc',
-      '<(DEPTH)/starboard/shared/iso/memory_free.cc',
-      '<(DEPTH)/starboard/shared/iso/memory_move.cc',
-      '<(DEPTH)/starboard/shared/iso/memory_reallocate_unchecked.cc',
-      '<(DEPTH)/starboard/shared/iso/memory_set.cc',
-      '<(DEPTH)/starboard/shared/iso/string_compare_all.cc',
-      '<(DEPTH)/starboard/shared/iso/string_compare.cc',
-      '<(DEPTH)/starboard/shared/iso/string_find_character.cc',
-      '<(DEPTH)/starboard/shared/iso/string_find_last_character.cc',
-      '<(DEPTH)/starboard/shared/iso/string_find_string.cc',
-      '<(DEPTH)/starboard/shared/iso/string_get_length_wide.cc',
-      '<(DEPTH)/starboard/shared/iso/string_get_length.cc',
-      '<(DEPTH)/starboard/shared/iso/string_parse_double.cc',
-      '<(DEPTH)/starboard/shared/iso/string_parse_signed_integer.cc',
-      '<(DEPTH)/starboard/shared/iso/string_parse_uint64.cc',
-      '<(DEPTH)/starboard/shared/iso/string_parse_unsigned_integer.cc',
-      '<(DEPTH)/starboard/shared/iso/string_scan.cc',
-      '<(DEPTH)/starboard/shared/iso/system_binary_search.cc',
-      '<(DEPTH)/starboard/shared/iso/system_sort.cc',
-      '<(DEPTH)/starboard/shared/libdav1d/dav1d_video_decoder.cc',
-      '<(DEPTH)/starboard/shared/libdav1d/dav1d_video_decoder.h',
-      '<(DEPTH)/starboard/shared/libde265/de265_library_loader.cc',
-      '<(DEPTH)/starboard/shared/libde265/de265_library_loader.h',
-      '<(DEPTH)/starboard/shared/libde265/de265_video_decoder.cc',
-      '<(DEPTH)/starboard/shared/libde265/de265_video_decoder.h',
-      '<(DEPTH)/starboard/shared/libevent/socket_waiter_add.cc',
-      '<(DEPTH)/starboard/shared/libevent/socket_waiter_create.cc',
-      '<(DEPTH)/starboard/shared/libevent/socket_waiter_destroy.cc',
-      '<(DEPTH)/starboard/shared/libevent/socket_waiter_internal.cc',
-      '<(DEPTH)/starboard/shared/libevent/socket_waiter_remove.cc',
-      '<(DEPTH)/starboard/shared/libevent/socket_waiter_wait_timed.cc',
-      '<(DEPTH)/starboard/shared/libevent/socket_waiter_wait.cc',
-      '<(DEPTH)/starboard/shared/libevent/socket_waiter_wake_up.cc',
-      '<(DEPTH)/starboard/shared/libvpx/vpx_video_decoder.cc',
-      '<(DEPTH)/starboard/shared/libvpx/vpx_video_decoder.h',
-      '<(DEPTH)/starboard/shared/linux/byte_swap.cc',
-      '<(DEPTH)/starboard/shared/linux/cpu_features_get.cc',
-      '<(DEPTH)/starboard/shared/linux/dev_input/dev_input.cc',
-      '<(DEPTH)/starboard/shared/linux/dev_input/dev_input.h',
-      '<(DEPTH)/starboard/shared/linux/get_home_directory.cc',
-      '<(DEPTH)/starboard/shared/linux/memory_get_stack_bounds.cc',
-      '<(DEPTH)/starboard/shared/linux/page_internal.cc',
-      '<(DEPTH)/starboard/shared/linux/socket_get_interface_address.cc',
-      '<(DEPTH)/starboard/shared/linux/system_get_random_data.cc',
-      '<(DEPTH)/starboard/shared/linux/system_get_stack.cc',
-      '<(DEPTH)/starboard/shared/linux/system_get_total_cpu_memory.cc',
-      '<(DEPTH)/starboard/shared/linux/system_get_used_cpu_memory.cc',
-      '<(DEPTH)/starboard/shared/linux/system_is_debugger_attached.cc',
-      '<(DEPTH)/starboard/shared/linux/system_network_status.cc',
-      '<(DEPTH)/starboard/shared/linux/system_symbolize.cc',
-      '<(DEPTH)/starboard/shared/linux/thread_get_id.cc',
-      '<(DEPTH)/starboard/shared/linux/thread_get_name.cc',
-      '<(DEPTH)/starboard/shared/linux/thread_set_name.cc',
-      '<(DEPTH)/starboard/shared/nouser/user_get_current.cc',
-      '<(DEPTH)/starboard/shared/nouser/user_get_property.cc',
-      '<(DEPTH)/starboard/shared/nouser/user_get_signed_in.cc',
-      '<(DEPTH)/starboard/shared/nouser/user_internal.cc',
-      '<(DEPTH)/starboard/shared/opus/opus_audio_decoder.cc',
-      '<(DEPTH)/starboard/shared/opus/opus_audio_decoder.h',
-      '<(DEPTH)/starboard/shared/posix/directory_create.cc',
-      '<(DEPTH)/starboard/shared/posix/file_atomic_replace.cc',
-      '<(DEPTH)/starboard/shared/posix/file_can_open.cc',
-      '<(DEPTH)/starboard/shared/posix/file_close.cc',
-      '<(DEPTH)/starboard/shared/posix/file_delete.cc',
-      '<(DEPTH)/starboard/shared/posix/file_exists.cc',
-      '<(DEPTH)/starboard/shared/posix/file_flush.cc',
-      '<(DEPTH)/starboard/shared/posix/file_get_info.cc',
-      '<(DEPTH)/starboard/shared/posix/file_get_path_info.cc',
-      '<(DEPTH)/starboard/shared/posix/file_open.cc',
-      '<(DEPTH)/starboard/shared/posix/file_read.cc',
-      '<(DEPTH)/starboard/shared/posix/file_seek.cc',
-      '<(DEPTH)/starboard/shared/posix/file_truncate.cc',
-      '<(DEPTH)/starboard/shared/posix/file_write.cc',
-      '<(DEPTH)/starboard/shared/posix/free_space.cc',
-      '<(DEPTH)/starboard/shared/posix/free_space.h',
-      '<(DEPTH)/starboard/shared/posix/log_flush.cc',
-      '<(DEPTH)/starboard/shared/posix/log_format.cc',
-      '<(DEPTH)/starboard/shared/posix/log_is_tty.cc',
-      '<(DEPTH)/starboard/shared/posix/log_raw.cc',
-      '<(DEPTH)/starboard/shared/posix/log.cc',
-      '<(DEPTH)/starboard/shared/posix/memory_allocate_aligned_unchecked.cc',
-      '<(DEPTH)/starboard/shared/posix/memory_flush.cc',
-      '<(DEPTH)/starboard/shared/posix/memory_free_aligned.cc',
-      '<(DEPTH)/starboard/shared/posix/memory_mapped_file.cc',
-      '<(DEPTH)/starboard/shared/posix/memory_mapped_file.h',
-      '<(DEPTH)/starboard/shared/posix/set_non_blocking_internal.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_accept.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_bind.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_clear_last_error.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_connect.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_create.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_destroy.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_free_resolution.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_get_last_error.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_get_local_address.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_internal.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_is_connected_and_idle.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_is_connected.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_is_ipv6_supported.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_join_multicast_group.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_listen.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_receive_from.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_resolve.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_send_to.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_set_broadcast.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_set_receive_buffer_size.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_set_reuse_address.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_set_send_buffer_size.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_set_tcp_keep_alive.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_set_tcp_no_delay.cc',
-      '<(DEPTH)/starboard/shared/posix/socket_set_tcp_window_scaling.cc',
-      '<(DEPTH)/starboard/shared/posix/storage_write_record.cc',
-      '<(DEPTH)/starboard/shared/posix/string_compare_no_case_n.cc',
-      '<(DEPTH)/starboard/shared/posix/string_compare_no_case.cc',
-      '<(DEPTH)/starboard/shared/posix/string_compare_wide.cc',
-      '<(DEPTH)/starboard/shared/posix/string_format_wide.cc',
-      '<(DEPTH)/starboard/shared/posix/string_format.cc',
-      '<(DEPTH)/starboard/shared/posix/system_break_into_debugger.cc',
-      '<(DEPTH)/starboard/shared/posix/system_clear_last_error.cc',
-      '<(DEPTH)/starboard/shared/posix/system_get_error_string.cc',
-      '<(DEPTH)/starboard/shared/posix/system_get_last_error.cc',
-      '<(DEPTH)/starboard/shared/posix/system_get_locale_id.cc',
-      '<(DEPTH)/starboard/shared/posix/system_get_number_of_processors.cc',
-      '<(DEPTH)/starboard/shared/posix/thread_sleep.cc',
-      '<(DEPTH)/starboard/shared/posix/time_get_monotonic_now.cc',
-      '<(DEPTH)/starboard/shared/posix/time_get_monotonic_thread_now.cc',
-      '<(DEPTH)/starboard/shared/posix/time_get_now.cc',
-      '<(DEPTH)/starboard/shared/posix/time_is_time_thread_now_supported.cc',
-      '<(DEPTH)/starboard/shared/posix/time_zone_get_current.cc',
-      '<(DEPTH)/starboard/shared/posix/time_zone_get_name.cc',
-      '<(DEPTH)/starboard/shared/pthread/condition_variable_broadcast.cc',
-      '<(DEPTH)/starboard/shared/pthread/condition_variable_create.cc',
-      '<(DEPTH)/starboard/shared/pthread/condition_variable_destroy.cc',
-      '<(DEPTH)/starboard/shared/pthread/condition_variable_signal.cc',
-      '<(DEPTH)/starboard/shared/pthread/condition_variable_wait_timed.cc',
-      '<(DEPTH)/starboard/shared/pthread/condition_variable_wait.cc',
-      '<(DEPTH)/starboard/shared/pthread/mutex_acquire_try.cc',
-      '<(DEPTH)/starboard/shared/pthread/mutex_acquire.cc',
-      '<(DEPTH)/starboard/shared/pthread/mutex_create.cc',
-      '<(DEPTH)/starboard/shared/pthread/mutex_destroy.cc',
-      '<(DEPTH)/starboard/shared/pthread/mutex_release.cc',
-      '<(DEPTH)/starboard/shared/pthread/once.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_context_get_pointer.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_context_internal.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_context_internal.h',
-      '<(DEPTH)/starboard/shared/pthread/thread_create_local_key.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_create_priority.h',
-      '<(DEPTH)/starboard/shared/pthread/thread_create.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_destroy_local_key.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_detach.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_get_current.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_get_local_value.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_is_equal.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_join.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_sampler_create.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_sampler_destroy.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_sampler_freeze.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_sampler_internal.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_sampler_internal.h',
-      '<(DEPTH)/starboard/shared/pthread/thread_sampler_is_supported.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_sampler_thaw.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_set_local_value.cc',
-      '<(DEPTH)/starboard/shared/pthread/thread_yield.cc',
-      '<(DEPTH)/starboard/shared/pulse/pulse_audio_sink_type.cc',
-      '<(DEPTH)/starboard/shared/pulse/pulse_audio_sink_type.h',
-      '<(DEPTH)/starboard/shared/pulse/pulse_dynamic_load_dispatcher.cc',
-      '<(DEPTH)/starboard/shared/pulse/pulse_dynamic_load_dispatcher.h',
-      '<(DEPTH)/starboard/shared/signal/crash_signals_sigaction.cc',
-      '<(DEPTH)/starboard/shared/signal/crash_signals.h',
-      '<(DEPTH)/starboard/shared/signal/debug_signals.cc',
-      '<(DEPTH)/starboard/shared/signal/debug_signals.h',
-      '<(DEPTH)/starboard/shared/signal/suspend_signals.cc',
-      '<(DEPTH)/starboard/shared/signal/suspend_signals.h',
-      '<(DEPTH)/starboard/shared/signal/system_request_conceal.cc',
-      '<(DEPTH)/starboard/shared/signal/system_request_freeze.cc',
-      '<(DEPTH)/starboard/shared/signal/system_request_suspend.cc',
-      '<(DEPTH)/starboard/shared/starboard/application.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_create.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_destroy.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_max_channels_5_1.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_min_buffer_size_in_frames.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_nearest_supported_sample_frequency.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_internal.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_audio_frame_storage_type_supported_interleaved_only.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_audio_sample_type_supported_float32_only.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_valid.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc',
-      '<(DEPTH)/starboard/shared/starboard/audio_sink/stub_audio_sink_type.h',
-      '<(DEPTH)/starboard/shared/starboard/command_line.cc',
-      '<(DEPTH)/starboard/shared/starboard/command_line.h',
-      '<(DEPTH)/starboard/shared/starboard/crash_handler.cc',
-      '<(DEPTH)/starboard/shared/starboard/crash_handler.h',
-      '<(DEPTH)/starboard/shared/starboard/directory_can_open.cc',
-      '<(DEPTH)/starboard/shared/starboard/event_cancel.cc',
-      '<(DEPTH)/starboard/shared/starboard/event_schedule.cc',
-      '<(DEPTH)/starboard/shared/starboard/file_atomic_replace_write_file.cc',
-      '<(DEPTH)/starboard/shared/starboard/file_atomic_replace_write_file.h',
-      '<(DEPTH)/starboard/shared/starboard/file_mode_string_to_flags.cc',
-      '<(DEPTH)/starboard/shared/starboard/file_storage/storage_close_record.cc',
-      '<(DEPTH)/starboard/shared/starboard/file_storage/storage_delete_record.cc',
-      '<(DEPTH)/starboard/shared/starboard/file_storage/storage_get_record_size.cc',
-      '<(DEPTH)/starboard/shared/starboard/file_storage/storage_open_record.cc',
-      '<(DEPTH)/starboard/shared/starboard/file_storage/storage_read_record.cc',
-      '<(DEPTH)/starboard/shared/starboard/log_mutex.cc',
-      '<(DEPTH)/starboard/shared/starboard/log_mutex.h',
-      '<(DEPTH)/starboard/shared/starboard/log_raw_dump_stack.cc',
-      '<(DEPTH)/starboard/shared/starboard/log_raw_format.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_buffer_budget.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_configuration_5_1.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_output_count_single_audio_output.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_alignment.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_allocation_unit.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_garbage_collection_duration_threshold.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_padding.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_storage_type.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_initial_buffer_capacity.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_max_buffer_capacity.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_get_video_buffer_budget.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/media_is_transfer_characteristics_supported.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/mime_type.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/mime_type.h',
-      '<(DEPTH)/starboard/shared/starboard/memory.cc',
-      '<(DEPTH)/starboard/shared/starboard/new.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_output_mode_supported.cc',
-      '<(DEPTH)/starboard/shared/starboard/queue_application.cc',
-      '<(DEPTH)/starboard/shared/starboard/string_concat_wide.cc',
-      '<(DEPTH)/starboard/shared/starboard/string_concat.cc',
-      '<(DEPTH)/starboard/shared/starboard/string_copy_wide.cc',
-      '<(DEPTH)/starboard/shared/starboard/string_copy.cc',
-      '<(DEPTH)/starboard/shared/starboard/string_duplicate.cc',
-      '<(DEPTH)/starboard/shared/starboard/system_get_random_uint64.cc',
-      '<(DEPTH)/starboard/shared/starboard/system_request_blur.cc',
-      '<(DEPTH)/starboard/shared/starboard/system_request_focus.cc',
-      '<(DEPTH)/starboard/shared/starboard/system_request_pause.cc',
-      '<(DEPTH)/starboard/shared/starboard/system_request_reveal.cc',
-      '<(DEPTH)/starboard/shared/starboard/system_request_stop.cc',
-      '<(DEPTH)/starboard/shared/starboard/system_request_unpause.cc',
-      '<(DEPTH)/starboard/shared/starboard/system_supports_resume.cc',
-      '<(DEPTH)/starboard/shared/starboard/window_set_default_options.cc',
-      '<(DEPTH)/starboard/shared/stub/accessibility_get_caption_settings.cc',
-      '<(DEPTH)/starboard/shared/stub/accessibility_get_display_settings.cc',
-      '<(DEPTH)/starboard/shared/stub/accessibility_get_text_to_speech_settings.cc',
-      '<(DEPTH)/starboard/shared/stub/accessibility_set_captions_enabled.cc',
-      '<(DEPTH)/starboard/shared/stub/cryptography_create_transformer.cc',
-      '<(DEPTH)/starboard/shared/stub/cryptography_destroy_transformer.cc',
-      '<(DEPTH)/starboard/shared/stub/cryptography_get_tag.cc',
-      '<(DEPTH)/starboard/shared/stub/cryptography_set_authenticated_data.cc',
-      '<(DEPTH)/starboard/shared/stub/cryptography_set_initialization_vector.cc',
-      '<(DEPTH)/starboard/shared/stub/cryptography_transform.cc',
-      '<(DEPTH)/starboard/shared/stub/image_decode.cc',
-      '<(DEPTH)/starboard/shared/stub/image_is_decode_supported.cc',
-      '<(DEPTH)/starboard/shared/stub/media_is_output_protected.cc',
-      '<(DEPTH)/starboard/shared/stub/media_set_audio_write_duration.cc',
-      '<(DEPTH)/starboard/shared/stub/media_set_output_protection.cc',
-      '<(DEPTH)/starboard/shared/stub/microphone_close.cc',
-      '<(DEPTH)/starboard/shared/stub/microphone_create.cc',
-      '<(DEPTH)/starboard/shared/stub/microphone_destroy.cc',
-      '<(DEPTH)/starboard/shared/stub/microphone_get_available.cc',
-      '<(DEPTH)/starboard/shared/stub/microphone_is_sample_rate_supported.cc',
-      '<(DEPTH)/starboard/shared/stub/microphone_open.cc',
-      '<(DEPTH)/starboard/shared/stub/microphone_read.cc',
-      '<(DEPTH)/starboard/shared/stub/speech_synthesis_cancel.cc',
-      '<(DEPTH)/starboard/shared/stub/speech_synthesis_is_supported.cc',
-      '<(DEPTH)/starboard/shared/stub/speech_synthesis_speak.cc',
-      '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc',
-      '<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
-      '<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
-      '<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
-      '<(DEPTH)/starboard/shared/stub/system_sign_with_certification_secret_key.cc',
-      '<(DEPTH)/starboard/shared/stub/thread_create_priority.cc',
-      '<(DEPTH)/starboard/shared/stub/ui_nav_get_interface.cc',
-      '<(DEPTH)/starboard/shared/stub/window_blur_on_screen_keyboard.cc',
-      '<(DEPTH)/starboard/shared/stub/window_focus_on_screen_keyboard.cc',
-      '<(DEPTH)/starboard/shared/stub/window_get_diagonal_size_in_inches.cc',
-      '<(DEPTH)/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc',
-      '<(DEPTH)/starboard/shared/stub/window_hide_on_screen_keyboard.cc',
-      '<(DEPTH)/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc',
-      '<(DEPTH)/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc',
-      '<(DEPTH)/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc',
-      '<(DEPTH)/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc',
-      '<(DEPTH)/starboard/shared/stub/window_show_on_screen_keyboard.cc',
-      '<(DEPTH)/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc',
-
-    ],
-    'starboard_platform_dependencies': [
-      '<(DEPTH)/starboard/common/common.gyp:common',
-      '<(DEPTH)/starboard/linux/shared/starboard_base_symbolize.gyp:starboard_base_symbolize',
-      '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg.gyp:ffmpeg_dynamic_load',
-      '<(DEPTH)/starboard/shared/starboard/media/media.gyp:media_util',
-      '<(DEPTH)/starboard/shared/starboard/player/player.gyp:player',
-      '<(DEPTH)/third_party/boringssl/boringssl.gyp:crypto',
-      '<(DEPTH)/third_party/de265_includes/de265_includes.gyp:de265',
-      '<(DEPTH)/third_party/libevent/libevent.gyp:libevent',
-      '<(DEPTH)/third_party/opus/opus.gyp:opus',
-      '<(DEPTH)/third_party/pulseaudio_includes/pulseaudio_includes.gyp:pulseaudio',
-    ],
-    'conditions': [
-      ['has_cdm==1', {
-        'starboard_platform_dependencies': [
-          '<(DEPTH)/starboard/shared/widevine/widevine3.gyp:oemcrypto',
-          '<(DEPTH)/starboard/shared/widevine/widevine3.gyp:widevine_ce_cdm_static',
-        ],
-        'starboard_platform_sources': [
-          '<(DEPTH)/starboard/linux/shared/drm_create_system.cc',
-          '<(DEPTH)/starboard/linux/shared/internal/oemcrypto_engine_device_properties_linux.cc',
-
-          '<(DEPTH)/starboard/shared/starboard/drm/drm_close_session.cc',
-          '<(DEPTH)/starboard/shared/starboard/drm/drm_destroy_system.cc',
-          '<(DEPTH)/starboard/shared/starboard/drm/drm_generate_session_update_request.cc',
-          '<(DEPTH)/starboard/shared/starboard/drm/drm_get_metrics.cc',
-          '<(DEPTH)/starboard/shared/starboard/drm/drm_is_server_certificate_updatable.cc',
-          '<(DEPTH)/starboard/shared/starboard/drm/drm_system_internal.h',
-          '<(DEPTH)/starboard/shared/starboard/drm/drm_update_server_certificate.cc',
-          '<(DEPTH)/starboard/shared/starboard/drm/drm_update_session.cc',
-
-          '<(DEPTH)/starboard/shared/widevine/drm_system_widevine.cc',
-          '<(DEPTH)/starboard/shared/widevine/drm_system_widevine.h',
-          '<(DEPTH)/starboard/shared/widevine/media_is_supported.cc',
-          '<(DEPTH)/starboard/shared/widevine/widevine_storage.cc',
-          '<(DEPTH)/starboard/shared/widevine/widevine_storage.h',
-          '<(DEPTH)/starboard/shared/widevine/widevine_timer.cc',
-          '<(DEPTH)/starboard/shared/widevine/widevine_timer.h',
-        ],
-      }, {
-        'starboard_platform_sources': [
-          '<(DEPTH)/starboard/shared/stub/media_is_supported.cc',
-          '<(DEPTH)/starboard/shared/stub/drm_close_session.cc',
-          '<(DEPTH)/starboard/shared/stub/drm_create_system.cc',
-          '<(DEPTH)/starboard/shared/stub/drm_destroy_system.cc',
-          '<(DEPTH)/starboard/shared/stub/drm_generate_session_update_request.cc',
-          '<(DEPTH)/starboard/shared/stub/drm_get_metrics.cc',
-          '<(DEPTH)/starboard/shared/stub/drm_is_server_certificate_updatable.cc',
-          '<(DEPTH)/starboard/shared/stub/drm_update_server_certificate.cc',
-          '<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
-        ],
-      }],
-      ['sb_evergreen_compatible == 1', {
-        'starboard_platform_dependencies': [
-          '<(DEPTH)/starboard/elf_loader/evergreen_config.gyp:evergreen_config',
-       ]},
-      ],
-      ['sb_evergreen_compatible == 1' and 'sb_evergreen_compatible_lite != 1', {
-        'starboard_platform_dependencies': [
-          '<(DEPTH)/starboard/loader_app/pending_restart.gyp:pending_restart',
-       ]},
-      ],
-      ['sb_evergreen_compatible_libunwind == 1', {
-        'starboard_platform_dependencies': [
-          '<(DEPTH)/third_party/llvm-project/libunwind/libunwind.gyp:unwind_starboard',
-       ]},
-      ],
-    ],
-  },
-  'conditions': [
-    ['gl_type != "none"', {
-      'target_defaults': {
-        'include_dirs': [
-          '<(DEPTH)/third_party/khronos',
-        ],
-      }
-    }]
-  ],
-}
diff --git a/starboard/linux/shared/starboard_platform_tests.gypi b/starboard/linux/shared/starboard_platform_tests.gypi
deleted file mode 100644
index 53e9370..0000000
--- a/starboard/linux/shared/starboard_platform_tests.gypi
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'targets': [
-    {
-      'target_name': 'starboard_platform_tests',
-      'type': '<(gtest_target_type)',
-      'includes': [
-        '<(DEPTH)/starboard/shared/starboard/media/media_tests.gypi',
-        '<(DEPTH)/starboard/shared/starboard/player/player_tests.gypi',
-      ],
-      'sources': [
-        '<(DEPTH)/starboard/common/test_main.cc',
-        '<@(media_tests_sources)',
-        '<@(player_tests_sources)',
-      ],
-      'defines': [
-        # This allows the tests to include internal only header files.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'starboard_platform_tests_deploy',
-      'type': 'none',
-      'dependencies': [
-        '<(DEPTH)/<(starboard_path)/starboard_platform_tests.gyp:starboard_platform_tests',
-      ],
-      'variables': {
-        'executable_name': 'starboard_platform_tests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/linux/shared/system_get_path.cc b/starboard/linux/shared/system_get_path.cc
index f32a68a..1f73113 100644
--- a/starboard/linux/shared/system_get_path.cc
+++ b/starboard/linux/shared/system_get_path.cc
@@ -123,8 +123,7 @@
     return false;
   }
 
-  char* last_slash =
-      const_cast<char *>(strrchr(out_path, '/'));
+  char* last_slash = const_cast<char*>(strrchr(out_path, '/'));
   if (!last_slash) {
     return false;
   }
@@ -228,9 +227,11 @@
       SbDirectoryCreate(path.data());
       break;
 
+#if SB_API_VERSION < SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED
     case kSbSystemPathTestOutputDirectory:
       return SbSystemGetPath(kSbSystemPathDebugOutputDirectory, out_path,
                              path_size);
+#endif  // #if SB_API_VERSION < SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED
 
     case kSbSystemPathExecutableFile:
       return GetExecutablePath(out_path, path_size);
@@ -249,17 +250,14 @@
       return false;
 #endif
 
-#if SB_API_VERSION >= 12
     case kSbSystemPathStorageDirectory:
       if (!GetStorageDirectory(path.data(), kPathSize)) {
         return false;
       }
       break;
-#endif
 
     default:
-      SB_NOTIMPLEMENTED() << "SbSystemGetPath not implemented for "
-                          << path_id;
+      SB_NOTIMPLEMENTED() << "SbSystemGetPath not implemented for " << path_id;
       return false;
   }
 
diff --git a/starboard/linux/shared/test_filters.py b/starboard/linux/shared/test_filters.py
index 7f0d6ea..9592f73 100644
--- a/starboard/linux/shared/test_filters.py
+++ b/starboard/linux/shared/test_filters.py
@@ -19,6 +19,42 @@
 from starboard.tools.testing import test_filter
 
 
+# pylint: disable=line-too-long
+_FILTERED_TESTS = {
+    'player_filter_tests': [
+        # libdav1d crashes when fed invalid data
+        'VideoDecoderTests/VideoDecoderTest.*Invalid*',
+    ],
+}
+_FILTERED_TESTS['nplb'] = []
+# Conditionally disables tests that require ipv6
+if os.getenv('IPV6_AVAILABLE', '1') == '0':
+  _FILTERED_TESTS['nplb'].extend([
+      'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDayDestination/1',
+      'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceForDestination/1',
+      'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceNotLoopback/1',
+  ])
+# TODO: Re-enable once tests or infra fixed.
+_FILTERED_TESTS['nplb'].extend([
+    'SbSocketAddressTypes/SbSocketBindTest.RainyDayBadInterface/1',
+    'SbSocketAddressTypes/PairSbSocketGetLocalAddressTest.SunnyDayConnected/1',
+    'SbSocketAddressTypes/PairSbSocketIsConnectedAndIdleTest.SunnyDay/1',
+    'SbSocketAddressTypes/PairSbSocketIsConnectedTest.SunnyDay/1',
+    'SbSocketAddressTypes/PairSbSocketReceiveFromTest.SunnyDay/1',
+    'SbSocketAddressTypes/SbSocketResolveTest.Localhost/1',
+    'SbSocketAddressTypes/SbSocketResolveTest.SunnyDayFiltered/1',
+    'SbSocketAddressTypes/PairSbSocketSendToTest.RainyDaySendToClosedSocket/1',
+    'SbSocketAddressTypes/PairSbSocketSendToTest.RainyDaySendToSocketUntilBlocking/1',
+    'SbSocketAddressTypes/PairSbSocketSendToTest.RainyDaySendToSocketConnectionReset/1',
+    'SbSocketAddressTypes/PairSbSocketWaiterWaitTest.SunnyDay/1',
+    'SbSocketAddressTypes/PairSbSocketWaiterWaitTest.SunnyDayAlreadyReady/1',
+    'SbSocketAddressTypes/PairSbSocketWaiterWaitTimedTest.SunnyDay/1',
+    'SbSocketAddressTypes/PairSbSocketWrapperTest.SunnyDay/1',
+])
+
+# pylint: enable=line-too-long
+
+
 class TestFilters(object):
   """Starboard Linux platform test filters."""
 
@@ -29,14 +65,14 @@
         os.path.join(paths.REPOSITORY_ROOT, 'third_party', 'ce_cdm', 'cdm',
                      'include', 'cdm.h'))
 
-    for target, tests in self._FILTERED_TESTS.iteritems():
+    for target, tests in _FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
 
     if has_cdm:
       return filters
 
     # Filter the drm related tests, as ce_cdm is not present.
-    for target, tests in self._DRM_RELATED_TESTS.iteritems():
+    for target, tests in self._DRM_RELATED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
 
@@ -47,41 +83,6 @@
       ],
   }
 
-  # pylint: disable=line-too-long
-  _FILTERED_TESTS = {
-      'player_filter_tests': [
-          # libdav1d crashes when fed invalid data
-          'VideoDecoderTests/VideoDecoderTest.*Invalid*',
-      ],
-  }
-  _FILTERED_TESTS['nplb'] = []
-  # Conditionally disables tests that require ipv6
-  if os.getenv('IPV6_AVAILABLE', '1') == '0':
-    _FILTERED_TESTS['nplb'].extend([
-        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDayDestination/1',
-        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceForDestination/1',
-        'SbSocketAddressTypes/SbSocketGetInterfaceAddressTest.SunnyDaySourceNotLoopback/1',
-    ])
-  # TODO: Re-enable once tests or infra fixed.
-  _FILTERED_TESTS['nplb'].extend([
-      'SbSocketAddressTypes/SbSocketBindTest.RainyDayBadInterface/1',
-      'SbSocketAddressTypes/PairSbSocketGetLocalAddressTest.SunnyDayConnected/1',
-      'SbSocketAddressTypes/PairSbSocketIsConnectedAndIdleTest.SunnyDay/1',
-      'SbSocketAddressTypes/PairSbSocketIsConnectedTest.SunnyDay/1',
-      'SbSocketAddressTypes/PairSbSocketReceiveFromTest.SunnyDay/1',
-      'SbSocketAddressTypes/SbSocketResolveTest.Localhost/1',
-      'SbSocketAddressTypes/SbSocketResolveTest.SunnyDayFiltered/1',
-      'SbSocketAddressTypes/PairSbSocketSendToTest.RainyDaySendToClosedSocket/1',
-      'SbSocketAddressTypes/PairSbSocketSendToTest.RainyDaySendToSocketUntilBlocking/1',
-      'SbSocketAddressTypes/PairSbSocketSendToTest.RainyDaySendToSocketConnectionReset/1',
-      'SbSocketAddressTypes/PairSbSocketWaiterWaitTest.SunnyDay/1',
-      'SbSocketAddressTypes/PairSbSocketWaiterWaitTest.SunnyDayAlreadyReady/1',
-      'SbSocketAddressTypes/PairSbSocketWaiterWaitTimedTest.SunnyDay/1',
-      'SbSocketAddressTypes/PairSbSocketWrapperTest.SunnyDay/1',
-  ])
-
-  # pylint: enable=line-too-long
-
 
 def CreateTestFilters():
   return TestFilters()
diff --git a/starboard/linux/shared/thread_types_public.h b/starboard/linux/shared/thread_types_public.h
deleted file mode 100644
index 03e432f..0000000
--- a/starboard/linux/shared/thread_types_public.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Includes threading primitive types and initializers.
-
-#ifndef STARBOARD_LINUX_SHARED_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_SHARED_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/shared/pthread/types_public.h"
-
-#endif  // STARBOARD_LINUX_SHARED_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/linux/x64x11/clang/3.9/BUILD.gn b/starboard/linux/x64x11/clang/3.9/BUILD.gn
new file mode 100644
index 0000000..ba56f59
--- /dev/null
+++ b/starboard/linux/x64x11/clang/3.9/BUILD.gn
@@ -0,0 +1,26 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+static_library("starboard_platform") {
+  check_includes = false
+
+  sources = [ "//starboard/linux/x64x11/main.cc" ]
+
+  public_deps = [
+    "//starboard/linux/x64x11/shared:starboard_platform",
+    "//starboard/shared/starboard/player:video_dmp",
+  ]
+
+  configs += [ "//starboard/build/config:starboard_implementation" ]
+}
diff --git a/starboard/linux/x64x11/clang/3.9/args.gn b/starboard/linux/x64x11/clang/3.9/args.gn
new file mode 100644
index 0000000..7473f4a
--- /dev/null
+++ b/starboard/linux/x64x11/clang/3.9/args.gn
@@ -0,0 +1,18 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+target_platform = "linux-x64x11-clang-3-9"
+target_os = "linux"
+target_cpu = "x64"
+using_old_compiler = true
diff --git a/starboard/linux/x64x11/clang/3.9/cobalt/configuration.py b/starboard/linux/x64x11/clang/3.9/cobalt/configuration.py
index 60bfdab..6316401 100644
--- a/starboard/linux/x64x11/clang/3.9/cobalt/configuration.py
+++ b/starboard/linux/x64x11/clang/3.9/cobalt/configuration.py
@@ -13,8 +13,6 @@
 # limitations under the License.
 """Starboard Linux x64x11 Clang 3.9 Cobalt configuration."""
 
-import os
-
 from starboard.linux.shared.cobalt import configuration as shared_configuration
 from starboard.tools.testing import test_filter
 
@@ -26,13 +24,21 @@
   def GetTestFilters(self):
     filters = super(CobaltLinuxX64X11Clang39Configuration,
                     self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
+    for target, tests in self.__FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
 
   # A map of failing or crashing tests per target.
-  __FILTERED_TESTS = {
+  __FILTERED_TESTS = {  # pylint: disable=invalid-name
       'zip_unittests': [
           'ZipReaderTest.ExtractToFileAsync_RegularFile',
       ],
+      # Tracked by b/226999079.
+      'renderer_test': [
+          'LottieCoveragePixelTest*skottie_linear_wipe_effect_json',
+          'LottieCoveragePixelTest*skottie_matte_blendmode_json',
+          'LottieCoveragePixelTest*skottie_shift_channels_effect_json',
+          'LottieCoveragePixelTest*skottie_3d_2planes_json',
+          'LottieCoveragePixelTest*skottie_venetianblinds_effect_json',
+      ],
   }
diff --git a/starboard/linux/x64x11/clang/3.9/compiler_flags.gypi b/starboard/linux/x64x11/clang/3.9/compiler_flags.gypi
deleted file mode 100644
index 6e5255e..0000000
--- a/starboard/linux/x64x11/clang/3.9/compiler_flags.gypi
+++ /dev/null
@@ -1,183 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Platform specific compiler flags for Linux on Starboard. Included from
-# gyp_configuration.gypi.
-#
-{
-  'variables': {
-    'compiler_flags_host': [
-      '-O2',
-    ],
-    'linker_flags': [
-    ],
-    'compiler_flags_debug': [
-      '-frtti',
-      '-O0',
-    ],
-    'compiler_flags_devel': [
-      '-frtti',
-      '-O2',
-    ],
-    'compiler_flags_qa': [
-      '-fno-rtti',
-      '-O2',
-      '-gline-tables-only',
-    ],
-    'compiler_flags_gold': [
-      '-fno-rtti',
-      '-gline-tables-only',
-    ],
-    'compiler_flags_gold_size': [
-      '-Os',
-    ],
-    'compiler_flags_gold_speed': [
-      '-O2',
-    ],
-    'conditions': [
-      ['clang==1', {
-        'common_clang_flags': [
-          '-Werror',
-          '-fcolor-diagnostics',
-          # Default visibility to hidden, to enable dead stripping.
-          '-fvisibility=hidden',
-          # Warn for implicit type conversions that may change a value.
-          '-Wconversion',
-          # Warns on switches on enums that cover all enum values but
-          # also contain a default: branch. Chrome is full of that.
-          '-Wno-covered-switch-default',
-          # protobuf uses hash_map.
-          '-Wno-deprecated',
-          '-fno-exceptions',
-          # Don't warn about the "struct foo f = {0};" initialization pattern.
-          '-Wno-missing-field-initializers',
-          '-fno-strict-aliasing',  # See http://crbug.com/32204
-          # Don't warn for invalid access to non-static data member of NULL object.
-          '-Wno-invalid-offsetof',
-          # Suppress 'implicit conversion changes signedness'
-          '-Wno-sign-conversion',
-          # shifting a negative signed value is undefined
-          '-Wno-shift-sign-overflow',
-          # Suppress "comparison may be assumed to always evaluate to false"
-          '-Wno-tautological-undefined-compare',
-          # Suppress "comparison of unsigned enum expression < 0 is always false"
-          '-Wno-tautological-compare',
-          # Suppress "[type1] has C-linkage specified, but returns user-defined type [type2] which is incompatible with C"
-          '-Wno-return-type-c-linkage',
-          '-Wno-array-bounds',
-          # Suppress "template argument uses unnamed type"
-          '-Wno-unnamed-type-template-args',
-          # 'this' pointer cannot be NULL...pointer may be assumed
-          # to always convert to true.
-          '-Wno-undefined-bool-conversion',
-          # Skia doesn't use overrides.
-          '-Wno-inconsistent-missing-override',
-          # Triggered by the COMPILE_ASSERT macro.
-          '-Wno-unused-local-typedef',
-          # Suppress "'&&' within '||'"
-          '-Wno-logical-op-parentheses',
-          '-Wno-unused-parameter',
-          # Suppress warnings about unknown pragmas.
-          '-Wno-unknown-pragmas',
-          # Suppress warnings about equality checks within double parentheses.
-          '-Wno-parentheses-equality',
-          # Suppress warnings about unreachable code due to constexpr conditions
-          '-Wno-unreachable-code',
-          # Suppress warnings about values being written but not read before the next write.
-          '-Wno-unused-value',
-          # Suppress warnings related to unused compilation flags in clang.
-          '-Wno-unused-command-line-argument',
-          # Suppress warnings in libjpeg
-          '-Wno-shift-negative-value',
-        ],
-      }],
-      ['cobalt_fastbuild==0', {
-        'compiler_flags_debug': [
-          '-g',
-        ],
-        'compiler_flags_devel': [
-          '-g',
-        ],
-        'compiler_flags_qa': [
-          '-gline-tables-only',
-        ],
-        'compiler_flags_gold': [
-          '-gline-tables-only',
-        ],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'cflags_c': [
-      # Limit to C99. This allows Linux to be a canary build for any
-      # C11 features that are not supported on some platforms' compilers.
-      '-std=c99',
-    ],
-    'cflags_cc': [
-      '-std=c++14',
-    ],
-    'target_conditions': [
-      ['sb_pedantic_warnings==1', {
-        'cflags': [
-          '-Wall',
-          '-Wextra',
-          '-Wunreachable-code',
-          '<@(common_clang_flags)',
-        ],
-      },{
-        'cflags': [
-          '<@(common_clang_flags)',
-          # 'this' pointer cannot be NULL...pointer may be assumed
-          # to always convert to true.
-          '-Wno-undefined-bool-conversion',
-          # Skia doesn't use overrides.
-          '-Wno-inconsistent-missing-override',
-          # Do not warn about unused function params.
-          '-Wno-unused-parameter',
-          # Do not warn for implicit type conversions that may change a value.
-          '-Wno-conversion',
-          # Do not warn about an implicit exception spec mismatch.
-          '-Wno-implicit-exception-spec-mismatch',
-        ],
-      }],
-      ['use_asan==1', {
-        'cflags': [
-          '-fsanitize=address',
-          '-fno-omit-frame-pointer',
-        ],
-        'ldflags': [
-          '-fsanitize=address',
-          # Force linking of the helpers in sanitizer_options.cc
-          '-Wl,-u_sanitizer_options_link_helper',
-        ],
-        'defines': [
-          'ADDRESS_SANITIZER',
-        ],
-      }],
-      ['use_tsan==1', {
-        'cflags': [
-          '-fsanitize=thread',
-          '-fno-omit-frame-pointer',
-        ],
-        'ldflags': [
-          '-fsanitize=thread',
-        ],
-        'defines': [
-          'THREAD_SANITIZER',
-        ],
-      }],
-    ],
-  }, # end of target_defaults
-}
diff --git a/starboard/linux/x64x11/clang/3.9/gyp_configuration.gypi b/starboard/linux/x64x11/clang/3.9/gyp_configuration.gypi
deleted file mode 100644
index b5d5811..0000000
--- a/starboard/linux/x64x11/clang/3.9/gyp_configuration.gypi
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_target_platform': 'linux-x64x11-clang-3-9',
-    'cobalt_v8_emit_builtins_as_inline_asm': 1,
-    # Required C++17 features are available in Clang-4.0 and newer
-    'sb_disable_cpp17_audit': 1,
-  },
-
-  'target_defaults': {
-    'default_configuration': 'linux-x64x11-clang-3-9_debug',
-    'configurations': {
-      'linux-x64x11-clang-3-9_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'linux-x64x11-clang-3-9_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'linux-x64x11-clang-3-9_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'linux-x64x11-clang-3-9_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    'compiler_flags.gypi',
-    '../gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/clang/3.9/gyp_configuration.py b/starboard/linux/x64x11/clang/3.9/gyp_configuration.py
index 40979bb..1bbb303 100644
--- a/starboard/linux/x64x11/clang/3.9/gyp_configuration.py
+++ b/starboard/linux/x64x11/clang/3.9/gyp_configuration.py
@@ -14,96 +14,18 @@
 """Starboard Linux X64 X11 Clang 3.9 platform configuration."""
 
 import logging
-import os
-import subprocess
 
 from starboard.linux.shared import gyp_configuration as shared_configuration
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import touch
 
 
 class LinuxX64X11Clang39Configuration(shared_configuration.LinuxConfiguration):
   """Starboard Linux X64 X11 Clang 3.9 platform configuration."""
-
-  def __init__(self,
-               platform='linux-x64x11-clang-3-9',
-               asan_enabled_by_default=False,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(LinuxX64X11Clang39Configuration,
-          self).__init__(platform, asan_enabled_by_default, sabi_json_path)
-
-    self.toolchain_dir = '/usr/lib/llvm-3.9'
-
-  def SetupPlatformTools(self, build_number):
-    ret = subprocess.call('/usr/bin/clang-3.9 --version', shell=True)
-    if ret != 0:
-      raise Exception('clang-3.9 is not installed.')
-
-  def GetEnvironmentVariables(self):
-    toolchain_bin_dir = os.path.join(self.toolchain_dir, 'bin')
-
-    env_variables = super(LinuxX64X11Clang39Configuration,
-                          self).GetEnvironmentVariables()
-    env_variables.update({
-        'CC':
-            self.build_accelerator + ' ' +
-            os.path.join(toolchain_bin_dir, 'clang'),
-        'CXX':
-            self.build_accelerator + ' ' +
-            os.path.join(toolchain_bin_dir, 'clang++'),
-    })
-    return env_variables
-
-  def GetVariables(self, config_name):
-    variables = super(LinuxX64X11Clang39Configuration,
-                      self).GetVariables(config_name)
-    return variables
-
-  def GetTargetToolchain(self, **kwargs):
-    environment_variables = self.GetEnvironmentVariables()
-    cc_path = environment_variables['CC']
-    cxx_path = environment_variables['CXX']
-
-    return [
-        clang.CCompiler(path=cc_path),
-        clang.CxxCompiler(path=cxx_path),
-        clang.AssemblerWithCPreprocessor(path=cc_path),
-        ar.StaticThinLinker(),
-        ar.StaticLinker(),
-        clangxx.ExecutableLinker(path=cxx_path, write_group=True),
-        clangxx.SharedLibraryLinker(path=cxx_path),
-        cp.Copy(),
-        touch.Stamp(),
-        bash.Shell(),
-    ]
-
-  def GetHostToolchain(self, **kwargs):
-    environment_variables = self.GetEnvironmentVariables()
-    cc_path = environment_variables['CC_host']
-    cxx_path = environment_variables['CXX_host']
-
-    return [
-        clang.CCompiler(path=cc_path),
-        clang.CxxCompiler(path=cxx_path),
-        clang.AssemblerWithCPreprocessor(path=cc_path),
-        ar.StaticThinLinker(),
-        ar.StaticLinker(),
-        clangxx.ExecutableLinker(path=cxx_path, write_group=True),
-        clangxx.SharedLibraryLinker(path=cxx_path),
-        cp.Copy(),
-        touch.Stamp(),
-        bash.Shell(),
-    ]
+  pass
 
 
 def CreatePlatformConfig():
   try:
-    return LinuxX64X11Clang39Configuration(
-        sabi_json_path='starboard/sabi/x64/sysv/sabi-v{sb_api_version}.json')
+    return LinuxX64X11Clang39Configuration('linux-x64x11-clang-3-9')
   except RuntimeError as e:
     logging.critical(e)
     return None
diff --git a/starboard/linux/x64x11/clang/3.9/platform_configuration/BUILD.gn b/starboard/linux/x64x11/clang/3.9/platform_configuration/BUILD.gn
new file mode 100644
index 0000000..855eed2
--- /dev/null
+++ b/starboard/linux/x64x11/clang/3.9/platform_configuration/BUILD.gn
@@ -0,0 +1,193 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+config("compiler_flags") {
+  cflags = []
+  cflags_c = []
+  cflags_cc = []
+  ldflags = []
+  defines = []
+
+  cflags += [
+    "-Werror",
+    "-fcolor-diagnostics",
+
+    # Default visibility to hidden, to enable dead stripping.
+    "-fvisibility=hidden",
+
+    # Warn for implicit type conversions that may change a value.
+    "-Wconversion",
+
+    # Warns on switches on enums that cover all enum values but
+    # also contain a default: branch. Chrome is full of that.
+    "-Wno-covered-switch-default",
+
+    # protobuf uses hash_map.
+    "-Wno-deprecated",
+    "-fno-exceptions",
+
+    # Don't warn about the "struct foo f = {0};" initialization pattern.
+    "-Wno-missing-field-initializers",
+    "-fno-strict-aliasing",  # See http://crbug.com/32204
+
+    # Don't warn for invalid access to non-static data member of NULL object.
+    "-Wno-invalid-offsetof",
+
+    # Suppress 'implicit conversion changes signedness"
+    "-Wno-sign-conversion",
+
+    # shifting a negative signed value is undefined
+    "-Wno-shift-sign-overflow",
+
+    # Suppress "comparison may be assumed to always evaluate to false"
+    "-Wno-tautological-undefined-compare",
+
+    # Suppress "comparison of unsigned enum expression < 0 is always false"
+    "-Wno-tautological-compare",
+
+    # Suppress "[type1] has C-linkage specified, but returns user-defined type [type2] which is incompatible with C"
+    "-Wno-return-type-c-linkage",
+    "-Wno-array-bounds",
+
+    # Suppress "template argument uses unnamed type"
+    "-Wno-unnamed-type-template-args",
+
+    # 'this' pointer cannot be NULL...pointer may be assumed
+    # to always convert to true.
+    "-Wno-undefined-bool-conversion",
+
+    # Skia doesn't use overrides.
+    "-Wno-inconsistent-missing-override",
+
+    # Triggered by the COMPILE_ASSERT macro.
+    "-Wno-unused-local-typedef",
+
+    # Suppress "'&&' within '||'"
+    "-Wno-logical-op-parentheses",
+    "-Wno-unused-parameter",
+
+    # Suppress warnings about unknown pragmas.
+    "-Wno-unknown-pragmas",
+
+    # Suppress warnings about equality checks within double parentheses.
+    "-Wno-parentheses-equality",
+
+    # Suppress warnings about unreachable code due to constexpr conditions
+    "-Wno-unreachable-code",
+
+    # Suppress warnings about values being written but not read before the next write.
+    "-Wno-unused-value",
+
+    # Suppress warnings related to unused compilation flags in clang.
+    "-Wno-unused-command-line-argument",
+
+    # Suppress warnings in libjpeg
+    "-Wno-shift-negative-value",
+  ]
+
+  cflags_c += [
+    # Limit to C99. This allows Linux to be a canary build for any
+    # C11 features that are not supported on some platforms' compilers.
+    "-std=c99",
+  ]
+
+  cflags_cc += [ "-std=c++14" ]
+
+  if (is_debug) {
+    cflags += [
+      "-frtti",
+      "-O0",
+    ]
+  } else if (is_devel) {
+    cflags += [
+      "-frtti",
+      "-O2",
+    ]
+  } else if (is_qa) {
+    cflags += [
+      "-fno-rtti",
+      "-O2",
+      "-gline-tables-only",
+    ]
+  } else {
+    cflags += [
+      "-fno-rtti",
+      "-gline-tables-only",
+    ]
+  }
+
+  if (!cobalt_fastbuild) {
+    if (is_debug || is_devel) {
+      cflags += [ "-g" ]
+    } else {
+      cflags += [ "-gline-tables-only" ]
+    }
+  }
+
+  if (use_asan) {
+    cflags += [
+      "-fsanitize=address",
+      "-fno-omit-frame-pointer",
+    ]
+    ldflags += [
+      "-fsanitize=address",
+
+      # Force linking of the helpers in sanitizer_options.cc
+      "-Wl,-u_sanitizer_options_link_helper",
+    ]
+    defines += [ "ADDRESS_SANITIZER" ]
+  }
+
+  if (use_tsan) {
+    cflags += [
+      "-fsanitize=thread",
+      "-fno-omit-frame-pointer",
+    ]
+    ldflags += [ "-fsanitize=thread" ]
+    defines += [ "THREAD_SANITIZER" ]
+  }
+}
+
+config("no_pedantic_warnings") {
+  cflags = [
+    # 'this' pointer cannot be NULL...pointer may be assumed
+    # to always convert to true.
+    "-Wno-undefined-bool-conversion",
+
+    # Skia doesn't use overrides.
+    "-Wno-inconsistent-missing-override",
+
+    # Do not warn about unused function params.
+    "-Wno-unused-parameter",
+
+    # Do not warn for implicit type conversions that may change a value.
+    "-Wno-conversion",
+
+    # Do not warn about an implicit exception spec mismatch.
+    "-Wno-implicit-exception-spec-mismatch",
+  ]
+}
+
+config("platform_configuration") {
+  if (current_toolchain == default_toolchain) {
+    configs = [
+      "//starboard/linux/shared/platform_configuration",
+      "//starboard/linux/x64x11/shared/platform_configuration:libraries",
+      "//starboard/build/config/sabi",
+      ":compiler_flags",
+    ]
+  } else {
+    cflags = [ "-O2" ]
+  }
+}
diff --git a/starboard/linux/x64x11/clang/3.9/platform_configuration/configuration.gni b/starboard/linux/x64x11/clang/3.9/platform_configuration/configuration.gni
new file mode 100644
index 0000000..e7046db
--- /dev/null
+++ b/starboard/linux/x64x11/clang/3.9/platform_configuration/configuration.gni
@@ -0,0 +1,49 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/build/config/base_configuration.gni")
+
+yasm_exists = true
+
+sb_static_contents_output_data_dir = "$root_out_dir/content"
+
+sb_enable_benchmark = true
+
+install_target_path = "//starboard/build/install/install_target.gni"
+
+sb_enable_opus_sse = false
+
+speed_config_path = "//starboard/linux/shared/platform_configuration:speed"
+size_config_path = "//starboard/linux/shared/platform_configuration:size"
+
+pedantic_warnings_config_path =
+    "//starboard/linux/shared/platform_configuration:pedantic_warnings"
+no_pedantic_warnings_config_path = "//starboard/linux/x64x11/clang/3.9/platform_configuration:no_pedantic_warnings"
+
+sb_widevine_platform = "linux"
+
+platform_tests_path = "//starboard/linux/shared:starboard_platform_tests"
+
+enable_in_app_dial = true
+
+sabi_path = "//starboard/sabi/x64/sysv/sabi-v$sb_api_version.json"
+
+gl_type = "angle"
+sb_angle_enable_gl = true
+
+cobalt_v8_emit_builtins_as_inline_asm = true
+
+sb_enable_cpp17_audit = false
+
+use_skia_next = true
diff --git a/starboard/linux/x64x11/clang/3.9/starboard_platform.gyp b/starboard/linux/x64x11/clang/3.9/starboard_platform.gyp
deleted file mode 100644
index 3d68745..0000000
--- a/starboard/linux/x64x11/clang/3.9/starboard_platform.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '../starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/linux/x64x11/clang/3.9/starboard_platform_tests.gyp b/starboard/linux/x64x11/clang/3.9/starboard_platform_tests.gyp
deleted file mode 100644
index 0ea8622..0000000
--- a/starboard/linux/x64x11/clang/3.9/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/starboard_platform_tests.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/clang/3.9/thread_types_public.h b/starboard/linux/x64x11/clang/3.9/thread_types_public.h
deleted file mode 100644
index 71fd470..0000000
--- a/starboard/linux/x64x11/clang/3.9/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_LINUX_X64X11_CLANG_3_9_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_CLANG_3_9_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/linux/x64x11/thread_types_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_CLANG_3_9_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/linux/x64x11/clang/3.9/toolchain/BUILD.gn b/starboard/linux/x64x11/clang/3.9/toolchain/BUILD.gn
new file mode 100644
index 0000000..420bc6f
--- /dev/null
+++ b/starboard/linux/x64x11/clang/3.9/toolchain/BUILD.gn
@@ -0,0 +1,38 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/clang/clang.gni")
+import("//starboard/shared/toolchain/overridable_gcc_toolchain.gni")
+
+_target_llvm_3_9_bin_dir = "/usr/lib/llvm-3.9/bin"
+
+overridable_clang_toolchain("host") {
+  clang_base_path = clang_base_path
+
+  toolchain_args = {
+    target_os = "linux"
+    target_cpu = "x64"
+  }
+}
+
+overridable_gcc_toolchain("target") {
+  cc = "${_target_llvm_3_9_bin_dir}/clang"
+  cxx = "${_target_llvm_3_9_bin_dir}/clang++"
+  ld = cxx
+  ar = "ar"
+
+  toolchain_args = {
+    is_clang = true
+  }
+}
diff --git a/starboard/linux/x64x11/clang/gyp_configuration.gypi b/starboard/linux/x64x11/clang/gyp_configuration.gypi
deleted file mode 100644
index 73165bf..0000000
--- a/starboard/linux/x64x11/clang/gyp_configuration.gypi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/linux/x64x11/shared/libraries.gypi',
-    '<(DEPTH)/starboard/sabi/sabi.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/clang/starboard_platform.gyp b/starboard/linux/x64x11/clang/starboard_platform.gyp
deleted file mode 100644
index 665c74c..0000000
--- a/starboard/linux/x64x11/clang/starboard_platform.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '../shared/starboard_platform_target.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/clang/starboard_platform_tests.gyp b/starboard/linux/x64x11/clang/starboard_platform_tests.gyp
deleted file mode 100644
index 0ea8622..0000000
--- a/starboard/linux/x64x11/clang/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/starboard_platform_tests.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/cobalt/configuration.gypi b/starboard/linux/x64x11/cobalt/configuration.gypi
deleted file mode 100644
index d2a0334..0000000
--- a/starboard/linux/x64x11/cobalt/configuration.gypi
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../../shared/cobalt/configuration.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/configuration_public.h b/starboard/linux/x64x11/configuration_public.h
index 01330e3..6f7b0ab 100644
--- a/starboard/linux/x64x11/configuration_public.h
+++ b/starboard/linux/x64x11/configuration_public.h
@@ -45,12 +45,6 @@
 // Include the Linux configuration that's common between all Desktop Linuxes.
 #include "starboard/linux/shared/configuration_public.h"
 
-// Starboard API versions 11 and earlier must define this variable, and have
-// microphone supported.
-#if SB_API_VERSION < 12
-#define SB_HAS_MICROPHONE 1
-#endif  // SB_API_VERSION < 12
-
 // Whether the current platform implements the on screen keyboard interface.
 #define SB_HAS_ON_SCREEN_KEYBOARD 0
 
diff --git a/starboard/linux/x64x11/egl/gyp_configuration.gypi b/starboard/linux/x64x11/egl/gyp_configuration.gypi
deleted file mode 100644
index 6f1e567..0000000
--- a/starboard/linux/x64x11/egl/gyp_configuration.gypi
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'target_defaults': {
-    'default_configuration': 'linux-x64x11-egl_debug',
-    'configurations': {
-      'linux-x64x11-egl_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'linux-x64x11-egl_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'linux-x64x11-egl_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'linux-x64x11-egl_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '../gyp_configuration.gypi',
-  ],
-
-  'variables': {
-    'gl_type': 'system_gles2',
-
-    'platform_libraries': [
-      '-lEGL',
-      '-lGLESv2',
-    ],
-  },
-}
diff --git a/starboard/linux/x64x11/egl/gyp_configuration.py b/starboard/linux/x64x11/egl/gyp_configuration.py
index a617e7f..521ef26 100644
--- a/starboard/linux/x64x11/egl/gyp_configuration.py
+++ b/starboard/linux/x64x11/egl/gyp_configuration.py
@@ -17,6 +17,4 @@
 
 
 def CreatePlatformConfig():
-  return linux_configuration.LinuxX64X11Configuration(
-      'linux-x64x11-egl',
-      sabi_json_path='starboard/sabi/x64/sysv/sabi-v{sb_api_version}.json')
+  return linux_configuration.LinuxX64X11Configuration('linux-x64x11-egl')
diff --git a/starboard/linux/x64x11/egl/starboard_platform.gyp b/starboard/linux/x64x11/egl/starboard_platform.gyp
deleted file mode 100644
index 82c4436..0000000
--- a/starboard/linux/x64x11/egl/starboard_platform.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '../shared/starboard_platform_target.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/egl/starboard_platform_tests.gyp b/starboard/linux/x64x11/egl/starboard_platform_tests.gyp
deleted file mode 100644
index 0ea8622..0000000
--- a/starboard/linux/x64x11/egl/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/starboard_platform_tests.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/egl/thread_types_public.h b/starboard/linux/x64x11/egl/thread_types_public.h
deleted file mode 100644
index 73c7c47..0000000
--- a/starboard/linux/x64x11/egl/thread_types_public.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Includes threading primitive types and initializers.
-
-#ifndef STARBOARD_LINUX_X64X11_EGL_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_EGL_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/linux/x64x11/thread_types_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_EGL_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/linux/x64x11/gcc/6.3/BUILD.gn b/starboard/linux/x64x11/gcc/6.3/BUILD.gn
new file mode 100644
index 0000000..ba56f59
--- /dev/null
+++ b/starboard/linux/x64x11/gcc/6.3/BUILD.gn
@@ -0,0 +1,26 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+static_library("starboard_platform") {
+  check_includes = false
+
+  sources = [ "//starboard/linux/x64x11/main.cc" ]
+
+  public_deps = [
+    "//starboard/linux/x64x11/shared:starboard_platform",
+    "//starboard/shared/starboard/player:video_dmp",
+  ]
+
+  configs += [ "//starboard/build/config:starboard_implementation" ]
+}
diff --git a/starboard/linux/x64x11/gcc/6.3/args.gn b/starboard/linux/x64x11/gcc/6.3/args.gn
new file mode 100644
index 0000000..879e5db
--- /dev/null
+++ b/starboard/linux/x64x11/gcc/6.3/args.gn
@@ -0,0 +1,19 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+target_platform = "linux-x64x11-gcc-6-3"
+target_os = "linux"
+target_cpu = "x64"
+is_clang = false
+using_old_compiler = true
diff --git a/starboard/linux/x64x11/gcc/6.3/cobalt/configuration.py b/starboard/linux/x64x11/gcc/6.3/cobalt/configuration.py
new file mode 100644
index 0000000..f1ba8bb
--- /dev/null
+++ b/starboard/linux/x64x11/gcc/6.3/cobalt/configuration.py
@@ -0,0 +1,35 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard Linux x64x11 GCC 6.3 Cobalt configuration."""
+
+from starboard.linux.shared.cobalt import configuration as shared_configuration
+from starboard.tools.testing import test_filter
+
+
+class CobaltLinuxX64X11Gcc63Configuration(
+    shared_configuration.CobaltLinuxConfiguration):
+  """Starboard Linux x64x11 GCC 6.3 Cobalt configuration."""
+
+  def GetTestFilters(self):
+    filters = super(CobaltLinuxX64X11Gcc63Configuration, self).GetTestFilters()
+    for target, tests in self.__FILTERED_TESTS.items():
+      filters.extend(test_filter.TestFilter(target, test) for test in tests)
+    return filters
+
+  # A map of failing or crashing tests per target.
+  __FILTERED_TESTS = {  # pylint: disable=invalid-name
+      'zip_unittests': [
+          'ZipReaderTest.ExtractToFileAsync_RegularFile',
+      ],
+  }
diff --git a/starboard/linux/x64x11/gcc/6.3/compiler_flags.gypi b/starboard/linux/x64x11/gcc/6.3/compiler_flags.gypi
deleted file mode 100644
index dd09dea..0000000
--- a/starboard/linux/x64x11/gcc/6.3/compiler_flags.gypi
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Platform specific compiler flags for Linux on Starboard. Included from
-# gyp_configuration.gypi.
-#
-{
-  'variables': {
-    'compiler_flags_host': [
-      '-O2',
-    ],
-    'linker_flags': [
-      '-Wl,-rpath=<@(toolchain_lib_path)',
-    ],
-    'compiler_flags_cc_debug': [
-      '-frtti',
-    ],
-    'compiler_flags_debug': [
-      '-O0',
-    ],
-    'compiler_flags_cc_devel': [
-      '-frtti',
-    ],
-    'compiler_flags_devel': [
-      '-O2',
-    ],
-    'compiler_flags_cc_qa': [
-      '-fno-rtti',
-    ],
-    'compiler_flags_qa': [
-      '-O2',
-    ],
-    'compiler_flags_cc_gold': [
-      '-fno-rtti',
-    ],
-    'compiler_flags_gold_size': [
-      '-Os',
-    ],
-    'compiler_flags_gold_speed': [
-      '-O2',
-    ],
-    'common_compiler_flags': [
-      # Default visibility to hidden, to enable dead stripping.
-      '-fvisibility=hidden',
-      # protobuf uses hash_map.
-      '-fno-exceptions',
-      # Don't warn about the "struct foo f = {0};" initialization pattern.
-      '-Wno-missing-field-initializers',
-      '-fno-strict-aliasing',  # See http://crbug.com/32204
-      # Don't warn about any conversions.
-      '-Wno-conversion',
-      # Don't warn about unreachable code. See
-      # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46158
-      '-Wno-unreachable-code',
-      '-Wno-deprecated-declarations',
-      # Disable warning:
-      # 'comparison is always true due to limited range of data type'
-      '-Wno-extra',
-      # Don't warn about inlining
-      '-Wno-inline',
-      # Disable warning: 'typedef locally defined but not used'.
-      '-Wno-unused-local-typedefs',
-      # Disable warning: 'narrowing conversion'
-      '-Wno-narrowing',
-      # Do not remove null this checks.
-      '-fno-delete-null-pointer-checks',
-      # Do not warn about unused function params.
-      '-Wno-unused-parameter',
-      # Do not warn about multi-character character constant values.
-      '-Wno-multichar',
-      # Do not warn for ignoring return value declared with attribute warn_unused_result.
-      '-Wno-unused-result',
-      # Do now warn for unknown pragmas.
-      '-Wno-unknown-pragmas',
-    ],
-    'conditions': [
-      ['cobalt_fastbuild==0', {
-        'compiler_flags_debug': [
-          '-g',
-        ],
-        'compiler_flags_devel': [
-          '-g',
-        ],
-        'compiler_flags_qa': [
-        ],
-        'compiler_flags_gold': [
-        ],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'cflags_c': [
-      # Limit to C99. This allows Linux to be a canary build for any
-      # C11 features that are not supported on some platforms' compilers.
-      '-std=c99',
-    ],
-    'cflags_cc': [
-      '-std=gnu++14',
-      # Don't warn for invalid access to non-static data member of NULL object.
-      '-Wno-invalid-offsetof',
-      # Don't warn about deprecated use
-      '-Wno-deprecated',
-    ],
-    'target_conditions': [
-      ['sb_pedantic_warnings==1', {
-        'cflags': [
-          '-Wall',
-          '-Wextra',
-          '<@(common_compiler_flags)',
-        ],
-      },{
-        'cflags': [
-          '<@(common_compiler_flags)',
-        ],
-      }],
-    ],
-  }, # end of target_defaults
-}
diff --git a/starboard/linux/x64x11/gcc/6.3/download_gcc.sh b/starboard/linux/x64x11/gcc/6.3/download_gcc.sh
deleted file mode 100755
index efdd807..0000000
--- a/starboard/linux/x64x11/gcc/6.3/download_gcc.sh
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/bin/bash
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This script downloads and compiles gcc version 6.3.0.
-
-set -e
-
-toolchain_name="gcc"
-version="6.3.0"
-toolchain_folder="x86_64-linux-gnu-${toolchain_name}-${version}"
-
-binary_path="gcc/bin/g++"
-build_duration="about 40 minutes"
-
-scriptfolder=$(dirname $(realpath $0))
-cd ${scriptfolder}
-source ../../toolchain_paths.sh
-
-(
-  # Download gcc
-  if [ ! -e gcc-${version}/"README" ]; then
-    file="gcc-${version}.tar.bz2"
-    wget -c http://ftpmirror.gnu.org/gcc/gcc-${version}/${file}
-    wget -c http://ftpmirror.gnu.org/gcc/gcc-${version}/${file}.sig
-    wget -c http://ftp.gnu.org/gnu/gnu-keyring.gpg
-    signature_invalid=`gpg --verify --no-default-keyring --keyring ./gnu-keyring.gpg ${file}.sig`
-    if [ $signature_invalid ]; then
-      echo "Invalid signature for " $file
-      exit 1
-    fi
-    echo "f06ae7f3f790fbf0f018f6d40e844451e6bc3b7bc96e128e63b09825c1f8b29f  gcc-6.3.0.tar.bz2" | sha256sum -c || (
-      echo "Invalid Checksum for " $file
-      exit 1
-    )
-    rm -rf gcc-${version}
-    tar -xjf ${file}
-    cd gcc-${version}
-
-    if [ -f ./contrib/download_prerequisites ]; then
-      ./contrib/download_prerequisites
-    fi
-
-    cat <<EOF  | sha256sum -c || ( echo "Invalid Checksum for prerequisites"; exit 1 )
-c7e75a08a8d49d2082e4caee1591a05d11b9d5627514e678f02d66a124bcf2ba  mpfr-2.4.2.tar.bz2
-936162c0312886c21581002b79932829aa048cfaf9937c6265aeaa14f1cd1775  gmp-4.3.2.tar.bz2
-e664603757251fd8a352848276497a4c79b7f8b21fd8aedd5cc0598a38fee3e4  mpc-0.8.1.tar.gz
-8ceebbf4d9a81afa2b4449113cee4b7cb14a687d7a549a963deb5e2a41458b6b  isl-0.15.tar.bz2
-EOF
-    cd ${toolchain_path}
-  fi
-
-  # Patches for compiling with gcc 7.2
-  patch -p1 <${scriptfolder}/ucontext.diff
-  patch -p1 <${scriptfolder}/nosanitizer.diff
-
-  # Create clean build folder for gcc
-  rm -rf gcc gcc-${version}-build
-  mkdir gcc-${version}-build
-  cd gcc-${version}-build
-
-  export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu
-  export CPLUS_INCLUDE_PATH=/usr/include/x86_64-linux-gnu
-
-  gcc_install_folder=$(realpath ${PWD}/"..")/"gcc"
-  # Configure gcc for installation into ${gcc_install_folder}
-  ${toolchain_path}/gcc-${version}/configure \
-    --prefix=${gcc_install_folder} \
-    --disable-multilib \
-    --enable-languages="c,c++"
-
-  # Build and 'install' gcc
-  make -j"$(nproc)" && make install-strip
-  cd ${toolchain_path}
-
-  ls -l ${toolchain_binary}
-  ${toolchain_binary} --version
-) >${logfile} 2>&1
diff --git a/starboard/linux/x64x11/gcc/6.3/gyp_configuration.gypi b/starboard/linux/x64x11/gcc/6.3/gyp_configuration.gypi
deleted file mode 100644
index 0f36749..0000000
--- a/starboard/linux/x64x11/gcc/6.3/gyp_configuration.gypi
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables' : {
-    # Required C++17 features are available in GCC-7 and newer
-    'sb_disable_cpp17_audit': 1,
-  },
-  'target_defaults': {
-    'default_configuration': 'linux-x64x11-gcc-6-3_debug',
-    'configurations': {
-      'linux-x64x11-gcc-6-3_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'linux-x64x11-gcc-6-3_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'linux-x64x11-gcc-6-3_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'linux-x64x11-gcc-6-3_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    'compiler_flags.gypi',
-    '../gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/gcc/6.3/gyp_configuration.py b/starboard/linux/x64x11/gcc/6.3/gyp_configuration.py
index 9540403..4fcd21c 100644
--- a/starboard/linux/x64x11/gcc/6.3/gyp_configuration.py
+++ b/starboard/linux/x64x11/gcc/6.3/gyp_configuration.py
@@ -13,115 +13,13 @@
 # limitations under the License.
 """Starboard Linux X64 X11 gcc 6.3 platform configuration for gyp_cobalt."""
 
-import os
-
 from starboard.linux.shared import gyp_configuration as shared_configuration
-from starboard.tools.testing import test_filter
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import touch
-
-# Directory for GCC 6.3 if it is installed as a system dependency.
-_DEFAULT_GCC_6_3_BIN_DIR = '/usr/bin'
-_DEFAULT_GCC_6_3_LIB_DIR = '/usr/lib/gcc/x86_64-linux-gnu/6'
 
 
 class LinuxX64X11Gcc63Configuration(shared_configuration.LinuxConfiguration):
   """Starboard Linux platform configuration."""
-
-  def __init__(self,
-               platform='linux-x64x11-gcc-6-3',
-               asan_enabled_by_default=False,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(LinuxX64X11Gcc63Configuration,
-          self).__init__(platform, asan_enabled_by_default, sabi_json_path)
-    self.toolchain_bin_dir = _DEFAULT_GCC_6_3_BIN_DIR
-    self.toolchain_lib_dir = _DEFAULT_GCC_6_3_LIB_DIR
-
-  def SetupPlatformTools(self, build_number):  # pylint: disable=unused-argument
-    if not (os.path.exists(os.path.join(self.toolchain_bin_dir, 'g++-6')) and
-            os.path.exists(os.path.join(self.toolchain_bin_dir, 'gcc-6'))):
-      raise RuntimeError('GCC 6.3 dependency is not present on this system.')
-
-  def GetVariables(self, config_name):
-    variables = super(LinuxX64X11Gcc63Configuration,
-                      self).GetVariables(config_name)
-    variables.update({
-        'clang': 0,
-    })
-    variables.update({
-        'toolchain_lib_path': self.toolchain_lib_dir,
-    })
-    return variables
-
-  def GetEnvironmentVariables(self):
-    env_variables = {
-        'CC':
-            self.build_accelerator + ' ' +
-            os.path.join(self.toolchain_bin_dir, 'gcc-6'),
-        'CXX':
-            self.build_accelerator + ' ' +
-            os.path.join(self.toolchain_bin_dir, 'g++-6'),
-        'CC_HOST':
-            self.build_accelerator + ' ' +
-            os.path.join(self.toolchain_bin_dir, 'gcc-6'),
-        'CXX_HOST':
-            self.build_accelerator + ' ' +
-            os.path.join(self.toolchain_bin_dir, 'g++-6'),
-    }
-    return env_variables
-
-  def GetTargetToolchain(self, **kwargs):  # pylint: disable=unused-argument
-    environment_variables = self.GetEnvironmentVariables()
-    cc_path = environment_variables['CC']
-    cxx_path = environment_variables['CXX']
-
-    return [
-        clang.CCompiler(path=cc_path),
-        clang.CxxCompiler(path=cxx_path),
-        clang.AssemblerWithCPreprocessor(path=cc_path),
-        ar.StaticThinLinker(),
-        ar.StaticLinker(),
-        clangxx.ExecutableLinker(path=cxx_path, write_group=True),
-        clangxx.SharedLibraryLinker(path=cxx_path),
-        cp.Copy(),
-        touch.Stamp(),
-        bash.Shell(),
-    ]
-
-  def GetHostToolchain(self, **kwargs):  # pylint: disable=unused-argument
-    environment_variables = self.GetEnvironmentVariables()
-    cc_path = environment_variables['CC_HOST']
-    cxx_path = environment_variables['CXX_HOST']
-
-    return [
-        clang.CCompiler(path=cc_path),
-        clang.CxxCompiler(path=cxx_path),
-        clang.AssemblerWithCPreprocessor(path=cc_path),
-        ar.StaticThinLinker(),
-        ar.StaticLinker(),
-        clangxx.ExecutableLinker(path=cxx_path, write_group=True),
-        clangxx.SharedLibraryLinker(path=cxx_path),
-        cp.Copy(),
-        touch.Stamp(),
-        bash.Shell(),
-    ]
-
-  def GetTestFilters(self):
-    filters = super(LinuxX64X11Gcc63Configuration, self).GetTestFilters()
-    for target, tests in self._FILTERED_TESTS.iteritems():
-      filters.extend(test_filter.TestFilter(target, test) for test in tests)
-    return filters
-
-  _FILTERED_TESTS = {
-      # TODO(b/206117361): Re-enable starboard_platform_tests once fixed.
-      'starboard_platform_tests': ['JobQueueTest.JobsAreMovedAndNotCopied',],
-  }
+  pass
 
 
 def CreatePlatformConfig():
-  return LinuxX64X11Gcc63Configuration(
-      sabi_json_path='starboard/sabi/x64/sysv/sabi-v{sb_api_version}.json')
+  return LinuxX64X11Gcc63Configuration('linux-x64x11-gcc-6-3')
diff --git a/starboard/linux/x64x11/gcc/6.3/platform_configuration/BUILD.gn b/starboard/linux/x64x11/gcc/6.3/platform_configuration/BUILD.gn
new file mode 100644
index 0000000..45767b2
--- /dev/null
+++ b/starboard/linux/x64x11/gcc/6.3/platform_configuration/BUILD.gn
@@ -0,0 +1,112 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+config("compiler_flags") {
+  cflags = []
+  cflags_c = []
+  cflags_cc = []
+  ldflags = []
+
+  # from common_compiler_flags
+  cflags += [
+    # Default visibility to hidden, to enable dead stripping.
+    "-fvisibility=hidden",
+
+    # protobuf uses hash_map.
+    "-fno-exceptions",
+
+    # Don't warn about the "struct foo f = {0};" initialization pattern.
+    "-Wno-missing-field-initializers",
+    "-fno-strict-aliasing",  # See http://crbug.com/32204
+
+    # Don't warn about any conversions.
+    "-Wno-conversion",
+
+    # Don't warn about unreachable code. See
+    # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46158
+    "-Wno-unreachable-code",
+    "-Wno-deprecated-declarations",
+
+    # Disable warning:
+    # 'comparison is always true due to limited range of data type'
+    "-Wno-extra",
+
+    # Don't warn about inlining
+    "-Wno-inline",
+
+    # Disable warning: 'typedef locally defined but not used'.
+    "-Wno-unused-local-typedefs",
+
+    # Disable warning: 'narrowing conversion'
+    "-Wno-narrowing",
+
+    # Do not remove null this checks.
+    "-fno-delete-null-pointer-checks",
+
+    # Do not warn about unused function params.
+    "-Wno-unused-parameter",
+
+    # Do not warn about multi-character character constant values.
+    "-Wno-multichar",
+
+    # Do not warn for ignoring return value declared with attribute warn_unused_result.
+    "-Wno-unused-result",
+
+    # Do now warn for unknown pragmas.
+    "-Wno-unknown-pragmas",
+  ]
+
+  ldflags += [ "-Wl,-rpath=/usr/lib/gcc/x86_64-linux-gnu/6" ]
+
+  cflags_c += [
+    # Limit to C99. This allows Linux to be a canary build for any
+    # C11 features that are not supported on some platforms' compilers.
+    "-std=c99",
+  ]
+
+  cflags_cc += [
+    "-std=gnu++14",
+
+    # Don't warn for invalid access to non-static data member of NULL object.
+    "-Wno-invalid-offsetof",
+
+    # Don't warn about deprecated use
+    "-Wno-deprecated",
+  ]
+
+  if (is_debug) {
+    cflags += [ "-O0" ]
+  } else if (is_devel) {
+    cflags += [ "-O2" ]
+  } else if (is_qa) {
+    cflags += [ "-O2" ]
+  }
+
+  if (!cobalt_fastbuild && (is_debug || is_devel)) {
+    cflags += [ "-g" ]
+  }
+}
+
+config("platform_configuration") {
+  if (current_toolchain == default_toolchain) {
+    configs = [
+      "//starboard/linux/shared/platform_configuration",
+      "//starboard/linux/x64x11/shared/platform_configuration:libraries",
+      "//starboard/build/config/sabi",
+      ":compiler_flags",
+    ]
+  } else {
+    cflags = [ "-O2" ]
+  }
+}
diff --git a/starboard/linux/x64x11/gcc/6.3/platform_configuration/configuration.gni b/starboard/linux/x64x11/gcc/6.3/platform_configuration/configuration.gni
new file mode 100644
index 0000000..ddb3a33
--- /dev/null
+++ b/starboard/linux/x64x11/gcc/6.3/platform_configuration/configuration.gni
@@ -0,0 +1,21 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/linux/shared/platform_configuration/configuration.gni")
+
+sabi_path = "//starboard/sabi/x64/sysv/sabi-v$sb_api_version.json"
+gl_type = "angle"
+sb_angle_enable_gl = true
+
+sb_enable_cpp17_audit = false
diff --git a/starboard/linux/x64x11/gcc/6.3/starboard_platform.gyp b/starboard/linux/x64x11/gcc/6.3/starboard_platform.gyp
deleted file mode 100644
index 3d68745..0000000
--- a/starboard/linux/x64x11/gcc/6.3/starboard_platform.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '../starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/linux/x64x11/gcc/6.3/starboard_platform_tests.gyp b/starboard/linux/x64x11/gcc/6.3/starboard_platform_tests.gyp
deleted file mode 100644
index 0ea8622..0000000
--- a/starboard/linux/x64x11/gcc/6.3/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/starboard_platform_tests.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/gcc/6.3/test_filters.py b/starboard/linux/x64x11/gcc/6.3/test_filters.py
index 5f24171..89d3c08 100644
--- a/starboard/linux/x64x11/gcc/6.3/test_filters.py
+++ b/starboard/linux/x64x11/gcc/6.3/test_filters.py
@@ -16,6 +16,11 @@
 from starboard.linux.shared import test_filters as shared_test_filters
 from starboard.tools.testing import test_filter
 
+_FILTERED_TESTS = {
+    # TODO(b/206117361): Re-enable starboard_platform_tests once fixed.
+    'starboard_platform_tests': ['JobQueueTest.JobsAreMovedAndNotCopied',],
+}
+
 
 def CreateTestFilters():
   return LinuxX64X11Gcc63TestFilters()
@@ -26,11 +31,6 @@
 
   def GetTestFilters(self):
     filters = super(LinuxX64X11Gcc63TestFilters, self).GetTestFilters()
-    for target, tests in self._FILTERED_TESTS.iteritems():
+    for target, tests in _FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
-
-  _FILTERED_TESTS = {
-      # TODO(b/206117361): Re-enable starboard_platform_tests once fixed.
-      'starboard_platform_tests': ['JobQueueTest.JobsAreMovedAndNotCopied',],
-  }
diff --git a/starboard/linux/x64x11/gcc/6.3/thread_types_public.h b/starboard/linux/x64x11/gcc/6.3/thread_types_public.h
deleted file mode 100644
index 956d161..0000000
--- a/starboard/linux/x64x11/gcc/6.3/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_LINUX_X64X11_GCC_6_3_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_GCC_6_3_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/linux/x64x11/thread_types_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_GCC_6_3_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/linux/x64x11/gcc/gyp_configuration.gypi b/starboard/linux/x64x11/gcc/gyp_configuration.gypi
deleted file mode 100644
index 73165bf..0000000
--- a/starboard/linux/x64x11/gcc/gyp_configuration.gypi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/linux/x64x11/shared/libraries.gypi',
-    '<(DEPTH)/starboard/sabi/sabi.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/gcc/starboard_platform.gyp b/starboard/linux/x64x11/gcc/starboard_platform.gyp
deleted file mode 100644
index 665c74c..0000000
--- a/starboard/linux/x64x11/gcc/starboard_platform.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '../shared/starboard_platform_target.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/gcc/starboard_platform_tests.gyp b/starboard/linux/x64x11/gcc/starboard_platform_tests.gyp
deleted file mode 100644
index 0ea8622..0000000
--- a/starboard/linux/x64x11/gcc/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/starboard_platform_tests.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/gyp_configuration.gypi b/starboard/linux/x64x11/gyp_configuration.gypi
deleted file mode 100644
index fe55e07..0000000
--- a/starboard/linux/x64x11/gyp_configuration.gypi
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'variables': {
-      'sb_evergreen_compatible': 1,
-      'sb_evergreen_compatible_libunwind': 1,
-    }
-  },
-  'target_defaults': {
-    'default_configuration': 'linux-x64x11_debug',
-    'configurations': {
-      'linux-x64x11_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'linux-x64x11_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'linux-x64x11_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'linux-x64x11_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '<(DEPTH)/starboard/linux/x64x11/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/sabi/sabi.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/gyp_configuration.py b/starboard/linux/x64x11/gyp_configuration.py
index 5f8069a..7df7585 100644
--- a/starboard/linux/x64x11/gyp_configuration.py
+++ b/starboard/linux/x64x11/gyp_configuration.py
@@ -14,46 +14,12 @@
 """Starboard Linux X64 X11 platform configuration."""
 
 from starboard.linux.shared import gyp_configuration as shared_configuration
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import touch
 
 
 class LinuxX64X11Configuration(shared_configuration.LinuxConfiguration):
   """Starboard Linux X64 X11 platform configuration."""
-
-  def __init__(self,
-               platform='linux-x64x11',
-               asan_enabled_by_default=True,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(LinuxX64X11Configuration,
-          self).__init__(platform, asan_enabled_by_default, sabi_json_path)
-
-  def GetTargetToolchain(self, **kwargs):
-    return self.GetHostToolchain(**kwargs)
-
-  def GetHostToolchain(self, **kwargs):
-    environment_variables = self.GetEnvironmentVariables()
-    cc_path = environment_variables['CC']
-    cxx_path = environment_variables['CXX']
-
-    return [
-        clang.CCompiler(path=cc_path),
-        clang.CxxCompiler(path=cxx_path),
-        clang.AssemblerWithCPreprocessor(path=cc_path),
-        ar.StaticThinLinker(),
-        ar.StaticLinker(),
-        clangxx.ExecutableLinker(path=cxx_path),
-        clangxx.SharedLibraryLinker(path=cxx_path),
-        cp.Copy(),
-        touch.Stamp(),
-        bash.Shell(),
-    ]
+  pass
 
 
 def CreatePlatformConfig():
-  return LinuxX64X11Configuration(
-      sabi_json_path='starboard/sabi/x64/sysv/sabi-v{sb_api_version}.json')
+  return LinuxX64X11Configuration('linux-x64x11')
diff --git a/starboard/linux/x64x11/main.cc b/starboard/linux/x64x11/main.cc
index cf076af..d2bb68a 100644
--- a/starboard/linux/x64x11/main.cc
+++ b/starboard/linux/x64x11/main.cc
@@ -18,6 +18,10 @@
 #include "starboard/shared/signal/crash_signals.h"
 #include "starboard/shared/signal/debug_signals.h"
 #include "starboard/shared/signal/suspend_signals.h"
+#if SB_IS(EVERGREEN_COMPATIBLE)
+#include "starboard/shared/starboard/command_line.h"
+#include "starboard/shared/starboard/starboard_switches.h"
+#endif
 #include "starboard/shared/starboard/link_receiver.h"
 #include "starboard/shared/x11/application_x11.h"
 
@@ -30,7 +34,12 @@
   starboard::shared::signal::InstallSuspendSignalHandlers();
 
 #if SB_IS(EVERGREEN_COMPATIBLE)
-  third_party::crashpad::wrapper::InstallCrashpadHandler();
+  if (starboard::shared::starboard::CommandLine(argc, argv)
+          .HasSwitch(starboard::shared::starboard::kStartHandlerAtCrash)) {
+    third_party::crashpad::wrapper::InstallCrashpadHandler(true);
+  } else {
+    third_party::crashpad::wrapper::InstallCrashpadHandler(false);
+  }
 #endif
 
 #if SB_HAS_QUIRK(BACKTRACE_DLOPEN_BUG)
diff --git a/starboard/linux/x64x11/sbversion/11/atomic_public.h b/starboard/linux/x64x11/sbversion/11/atomic_public.h
deleted file mode 100644
index 18a461d..0000000
--- a/starboard/linux/x64x11/sbversion/11/atomic_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_LINUX_X64X11_SBVERSION_11_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SBVERSION_11_ATOMIC_PUBLIC_H_
-
-#include "starboard/linux/x64x11/atomic_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_SBVERSION_11_ATOMIC_PUBLIC_H_
diff --git a/starboard/linux/x64x11/sbversion/11/configuration_public.h b/starboard/linux/x64x11/sbversion/11/configuration_public.h
deleted file mode 100644
index fc32b78..0000000
--- a/starboard/linux/x64x11/sbversion/11/configuration_public.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_LINUX_X64X11_SBVERSION_11_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SBVERSION_11_CONFIGURATION_PUBLIC_H_
-
-#undef SB_API_VERSION
-#define SB_API_VERSION 11
-
-// --- Architecture Configuration --------------------------------------------
-
-// Whether the current platform is big endian. SB_IS_LITTLE_ENDIAN will be
-// automatically set based on this.
-#define SB_IS_BIG_ENDIAN 0
-
-// Whether the current platform is an ARM architecture.
-#define SB_IS_ARCH_ARM 0
-
-// Whether the current platform is a MIPS architecture.
-#define SB_IS_ARCH_MIPS 0
-
-// Whether the current platform is a PPC architecture.
-#define SB_IS_ARCH_PPC 0
-
-// Whether the current platform is an x86 architecture.
-#define SB_IS_ARCH_X86 1
-
-// Whether the current platform is a 32-bit architecture.
-#define SB_IS_32_BIT 0
-
-// Whether the current platform is a 64-bit architecture.
-#define SB_IS_64_BIT 1
-
-// Whether the current platform's pointers are 32-bit.
-// Whether the current platform's longs are 32-bit.
-#define SB_HAS_32_BIT_POINTERS 0
-#define SB_HAS_32_BIT_LONG 0
-
-// Whether the current platform's pointers are 64-bit.
-// Whether the current platform's longs are 64-bit.
-#define SB_HAS_64_BIT_POINTERS 1
-#define SB_HAS_64_BIT_LONG 1
-
-// Configuration parameters that allow the application to make some general
-// compile-time decisions with respect to the the number of cores likely to be
-// available on this platform. For a definitive measure, the application should
-// still call SbSystemGetNumberOfProcessors at runtime.
-
-// Whether the current platform's thread scheduler will automatically balance
-// threads between cores, as opposed to systems where threads will only ever run
-// on the specifically pinned core.
-#define SB_HAS_CROSS_CORE_SCHEDULER 1
-
-// --- Graphics Configuration ------------------------------------------------
-
-// Indicates whether or not the given platform supports rendering of NV12
-// textures. These textures typically originate from video decoders.
-#define SB_HAS_NV12_TEXTURE_SUPPORT 1
-
-// --- Shared Configuration and Overrides ------------------------------------
-
-// Include the Linux configuration that's common between all Desktop Linuxes.
-#include "starboard/linux/shared/configuration_public.h"
-
-// Starboard API versions 11 and earlier must define this variable, and have
-// microphone supported.
-#define SB_HAS_MICROPHONE 1
-
-// Whether the current platform implements the on screen keyboard interface.
-#define SB_HAS_ON_SCREEN_KEYBOARD 0
-
-// Whether the current platform has speech synthesis.
-#undef SB_HAS_SPEECH_SYNTHESIS
-#define SB_HAS_SPEECH_SYNTHESIS 0
-
-#endif  // STARBOARD_LINUX_X64X11_SBVERSION_11_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/linux/x64x11/sbversion/11/gyp_configuration.gypi b/starboard/linux/x64x11/sbversion/11/gyp_configuration.gypi
deleted file mode 100644
index 727d68e..0000000
--- a/starboard/linux/x64x11/sbversion/11/gyp_configuration.gypi
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'target_defaults': {
-    'default_configuration': 'linux-x64x11-sbversion-11_debug',
-    'configurations': {
-      'linux-x64x11-sbversion-11_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'linux-x64x11-sbversion-11_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'linux-x64x11-sbversion-11_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'linux-x64x11-sbversion-11_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'variables': {
-    'enable_map_to_mesh': 1,
-  },
-
-  'includes': [
-    '<(DEPTH)/starboard/linux/x64x11/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/sbversion/11/gyp_configuration.py b/starboard/linux/x64x11/sbversion/11/gyp_configuration.py
deleted file mode 100644
index 04f82ee..0000000
--- a/starboard/linux/x64x11/sbversion/11/gyp_configuration.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-from starboard.linux.x64x11 import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.LinuxX64X11Configuration(
-      'linux-x64x11-sbversion-11')
diff --git a/starboard/linux/x64x11/sbversion/11/starboard_platform.gyp b/starboard/linux/x64x11/sbversion/11/starboard_platform.gyp
deleted file mode 100644
index 6ef1aec..0000000
--- a/starboard/linux/x64x11/sbversion/11/starboard_platform.gyp
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/linux/x64x11/starboard_platform.gyp',
-  ],
-  'variables': {
-      'starboard_platform_sources': [
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_cancel.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_create.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_start.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_stop.cc',
-      ],
-  }
-}
diff --git a/starboard/linux/x64x11/sbversion/11/starboard_platform_tests.gyp b/starboard/linux/x64x11/sbversion/11/starboard_platform_tests.gyp
deleted file mode 100644
index 533c7b3..0000000
--- a/starboard/linux/x64x11/sbversion/11/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file was initially generated by starboard/tools/create_derived_build.py,
-# though it may have been modified since its creation.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/linux/x64x11/starboard_platform_tests.gyp',
-  ],
-}
diff --git a/starboard/linux/x64x11/sbversion/11/test_filters.py b/starboard/linux/x64x11/sbversion/11/test_filters.py
deleted file mode 100644
index c6f1e2d..0000000
--- a/starboard/linux/x64x11/sbversion/11/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Linux X64 X11 Platform Test Filters."""
-
-from starboard.linux.x64x11 import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.LinuxX64X11TestFilters()
diff --git a/starboard/linux/x64x11/sbversion/11/thread_types_public.h b/starboard/linux/x64x11/sbversion/11/thread_types_public.h
deleted file mode 100644
index 6a573cc..0000000
--- a/starboard/linux/x64x11/sbversion/11/thread_types_public.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file was initially generated by starboard/tools/create_derived_build.py,
-// though it may have been modified since its creation.
-
-#ifndef STARBOARD_LINUX_X64X11_SBVERSION_11_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SBVERSION_11_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/linux/x64x11/thread_types_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_SBVERSION_11_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/linux/x64x11/sbversion/12/atomic_public.h b/starboard/linux/x64x11/sbversion/12/atomic_public.h
deleted file mode 100644
index b6110e0..0000000
--- a/starboard/linux/x64x11/sbversion/12/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_LINUX_X64X11_SBVERSION_12_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SBVERSION_12_ATOMIC_PUBLIC_H_
-
-#include "starboard/linux/x64x11/atomic_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_SBVERSION_12_ATOMIC_PUBLIC_H_
diff --git a/starboard/linux/x64x11/sbversion/12/configuration_public.h b/starboard/linux/x64x11/sbversion/12/configuration_public.h
deleted file mode 100644
index e9d00ac..0000000
--- a/starboard/linux/x64x11/sbversion/12/configuration_public.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for Desktop x64 Linux. Other devices will have
-// specific Starboard implementations, even if they ultimately are running some
-// version of Linux.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_LINUX_X64X11_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-
-// --- Graphics Configuration ------------------------------------------------
-
-// Indicates whether or not the given platform supports rendering of NV12
-// textures. These textures typically originate from video decoders.
-#define SB_HAS_NV12_TEXTURE_SUPPORT 1
-
-// --- Shared Configuration and Overrides ------------------------------------
-
-// Include the Linux configuration that's common between all Desktop Linuxes.
-#include "starboard/linux/shared/configuration_public.h"
-
-// Whether the current platform implements the on screen keyboard interface.
-#define SB_HAS_ON_SCREEN_KEYBOARD 0
-
-// Whether the current platform has speech synthesis.
-#undef SB_HAS_SPEECH_SYNTHESIS
-#define SB_HAS_SPEECH_SYNTHESIS 0
-
-#endif  // STARBOARD_LINUX_X64X11_SBVERSION_12_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/linux/x64x11/sbversion/12/gyp_configuration.gypi b/starboard/linux/x64x11/sbversion/12/gyp_configuration.gypi
deleted file mode 100644
index a72c2f1..0000000
--- a/starboard/linux/x64x11/sbversion/12/gyp_configuration.gypi
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'variables': {
-      'sb_evergreen_compatible': 1,
-      'sb_evergreen_compatible_libunwind': 1,
-    }
-  },
-  'target_defaults': {
-    'default_configuration': 'linux-x64x11-sbversion-12_debug',
-    'configurations': {
-      'linux-x64x11-sbversion-12_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'linux-x64x11-sbversion-12_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'linux-x64x11-sbversion-12_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'linux-x64x11-sbversion-12_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '<(DEPTH)/starboard/linux/x64x11/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/sabi/sabi.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/sbversion/12/gyp_configuration.py b/starboard/linux/x64x11/sbversion/12/gyp_configuration.py
deleted file mode 100644
index a85e677..0000000
--- a/starboard/linux/x64x11/sbversion/12/gyp_configuration.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Linux X64 X11 platform configuration."""
-
-from starboard.linux.x64x11 import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.LinuxX64X11Configuration(
-      'linux-x64x11-sbversion-12',
-      sabi_json_path='starboard/sabi/x64/sysv/sabi-v12.json')
diff --git a/starboard/linux/x64x11/sbversion/12/starboard_platform.gyp b/starboard/linux/x64x11/sbversion/12/starboard_platform.gyp
deleted file mode 100644
index e5908a1..0000000
--- a/starboard/linux/x64x11/sbversion/12/starboard_platform.gyp
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Note, that despite the file extension ".gyp", this file is included by several
-# platform variants of linux-x64x11, like a ".gypi" file, since those platforms
-# have no need to modify this code.
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/linux/x64x11/starboard_platform.gyp',
-  ],
-  'variables': {
-      'starboard_platform_sources': [
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_cancel.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_create.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_start.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_stop.cc',
-      ],
-  },
-}
diff --git a/starboard/linux/x64x11/sbversion/12/starboard_platform_tests.gyp b/starboard/linux/x64x11/sbversion/12/starboard_platform_tests.gyp
deleted file mode 100644
index 29448ac..0000000
--- a/starboard/linux/x64x11/sbversion/12/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/linux/x64x11/starboard_platform_tests.gyp',
-  ],
-}
diff --git a/starboard/linux/x64x11/sbversion/12/test_filters.py b/starboard/linux/x64x11/sbversion/12/test_filters.py
deleted file mode 100644
index c6f1e2d..0000000
--- a/starboard/linux/x64x11/sbversion/12/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Linux X64 X11 Platform Test Filters."""
-
-from starboard.linux.x64x11 import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.LinuxX64X11TestFilters()
diff --git a/starboard/linux/x64x11/sbversion/12/thread_types_public.h b/starboard/linux/x64x11/sbversion/12/thread_types_public.h
deleted file mode 100644
index 0d4b065..0000000
--- a/starboard/linux/x64x11/sbversion/12/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_LINUX_X64X11_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/linux/x64x11/thread_types_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/linux/x64x11/sbversion/13/atomic_public.h b/starboard/linux/x64x11/sbversion/13/atomic_public.h
deleted file mode 100644
index d85cdb8..0000000
--- a/starboard/linux/x64x11/sbversion/13/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_LINUX_X64X11_SBVERSION_13_ATOMIC_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SBVERSION_13_ATOMIC_PUBLIC_H_
-
-#include "starboard/linux/x64x11/atomic_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/starboard/linux/x64x11/sbversion/13/configuration_public.h b/starboard/linux/x64x11/sbversion/13/configuration_public.h
deleted file mode 100644
index d6b543f..0000000
--- a/starboard/linux/x64x11/sbversion/13/configuration_public.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for Desktop x64 Linux. Other devices will have
-// specific Starboard implementations, even if they ultimately are running some
-// version of Linux.
-
-// Other source files should never include this header directly, but should
-// include the generic "starboard/configuration.h" instead.
-
-#ifndef STARBOARD_LINUX_X64X11_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-
-// --- Graphics Configuration ------------------------------------------------
-
-// Indicates whether or not the given platform supports rendering of NV12
-// textures. These textures typically originate from video decoders.
-#define SB_HAS_NV12_TEXTURE_SUPPORT 1
-
-// --- Shared Configuration and Overrides ------------------------------------
-
-// Include the Linux configuration that's common between all Desktop Linuxes.
-#include "starboard/linux/shared/configuration_public.h"
-
-// Whether the current platform implements the on screen keyboard interface.
-#define SB_HAS_ON_SCREEN_KEYBOARD 0
-
-// Whether the current platform has speech synthesis.
-#undef SB_HAS_SPEECH_SYNTHESIS
-#define SB_HAS_SPEECH_SYNTHESIS 0
-
-#endif  // STARBOARD_LINUX_X64X11_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/linux/x64x11/sbversion/13/gyp_configuration.gypi b/starboard/linux/x64x11/sbversion/13/gyp_configuration.gypi
deleted file mode 100644
index 045aa06..0000000
--- a/starboard/linux/x64x11/sbversion/13/gyp_configuration.gypi
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'variables': {
-      'sb_evergreen_compatible': 1,
-      'sb_evergreen_compatible_libunwind': 1,
-    }
-  },
-  'target_defaults': {
-    'default_configuration': 'linux-x64x11-sbversion-13_debug',
-    'configurations': {
-      'linux-x64x11-sbversion-13_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'linux-x64x11-sbversion-13_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'linux-x64x11-sbversion-13_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'linux-x64x11-sbversion-13_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '<(DEPTH)/starboard/linux/x64x11/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/sabi/sabi.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/sbversion/13/gyp_configuration.py b/starboard/linux/x64x11/sbversion/13/gyp_configuration.py
deleted file mode 100644
index 6100f32..0000000
--- a/starboard/linux/x64x11/sbversion/13/gyp_configuration.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Linux X64 X11 platform configuration."""
-
-from starboard.linux.x64x11 import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.LinuxX64X11Configuration(
-      'linux-x64x11-sbversion-13',
-      sabi_json_path='starboard/sabi/x64/sysv/sabi-v13.json')
diff --git a/starboard/linux/x64x11/sbversion/13/starboard_platform.gyp b/starboard/linux/x64x11/sbversion/13/starboard_platform.gyp
deleted file mode 100644
index 8623c13..0000000
--- a/starboard/linux/x64x11/sbversion/13/starboard_platform.gyp
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Note, that despite the file extension ".gyp", this file is included by several
-# platform variants of linux-x64x11, like a ".gypi" file, since those platforms
-# have no need to modify this code.
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/linux/x64x11/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/linux/x64x11/sbversion/13/starboard_platform_tests.gyp b/starboard/linux/x64x11/sbversion/13/starboard_platform_tests.gyp
deleted file mode 100644
index 96f005e..0000000
--- a/starboard/linux/x64x11/sbversion/13/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/linux/x64x11/starboard_platform_tests.gyp',
-  ],
-}
diff --git a/starboard/linux/x64x11/sbversion/13/test_filters.py b/starboard/linux/x64x11/sbversion/13/test_filters.py
deleted file mode 100644
index c6f1e2d..0000000
--- a/starboard/linux/x64x11/sbversion/13/test_filters.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Linux X64 X11 Platform Test Filters."""
-
-from starboard.linux.x64x11 import test_filters as parent_test_filters
-
-
-def CreateTestFilters():
-  return parent_test_filters.LinuxX64X11TestFilters()
diff --git a/starboard/linux/x64x11/sbversion/13/thread_types_public.h b/starboard/linux/x64x11/sbversion/13/thread_types_public.h
deleted file mode 100644
index 02676e6..0000000
--- a/starboard/linux/x64x11/sbversion/13/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_LINUX_X64X11_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/linux/x64x11/thread_types_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/linux/x64x11/shared/gyp_configuration.gypi b/starboard/linux/x64x11/shared/gyp_configuration.gypi
deleted file mode 100644
index e1bc736..0000000
--- a/starboard/linux/x64x11/shared/gyp_configuration.gypi
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2014 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/compiler_flags.gypi',
-    '<(DEPTH)/starboard/linux/shared/enable_glx_via_angle.gypi',
-    '<(DEPTH)/starboard/linux/shared/gyp_configuration.gypi',
-    '<(DEPTH)/starboard/linux/x64x11/shared/libraries.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/shared/libraries.gypi b/starboard/linux/x64x11/shared/libraries.gypi
deleted file mode 100644
index 4fd2773..0000000
--- a/starboard/linux/x64x11/shared/libraries.gypi
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'platform_libraries': [
-      '../../third_party/libdav1d/platforms/linux-x64/libdav1d.a',
-      '../../third_party/libvpx/platforms/linux-x64/libvpx.a',
-    ],
-  },
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/libraries.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/shared/starboard_platform.gypi b/starboard/linux/x64x11/shared/starboard_platform.gypi
deleted file mode 100644
index a635975..0000000
--- a/starboard/linux/x64x11/shared/starboard_platform.gypi
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': ['../../shared/starboard_platform.gypi'],
-
-  'variables': {
-    'starboard_platform_sources': [
-      '<(DEPTH)/starboard/linux/x64x11/main.cc',
-      '<(DEPTH)/starboard/linux/x64x11/sanitizer_options.cc',
-      '<(DEPTH)/starboard/linux/x64x11/system_get_property.cc',
-      '<(DEPTH)/starboard/linux/x64x11/system_get_property_impl.cc',
-      '<(DEPTH)/starboard/shared/libjpeg/image_decode.cc',
-      '<(DEPTH)/starboard/shared/libjpeg/image_is_decode_supported.cc',
-      '<(DEPTH)/starboard/shared/libjpeg/jpeg_image_decoder.cc',
-      '<(DEPTH)/starboard/shared/libjpeg/jpeg_image_decoder.h',
-      '<(DEPTH)/starboard/shared/starboard/link_receiver.cc',
-      '<(DEPTH)/starboard/shared/x11/application_x11.cc',
-      '<(DEPTH)/starboard/shared/x11/egl_swap_buffers.cc',
-      '<(DEPTH)/starboard/shared/x11/player_set_bounds.cc',
-      '<(DEPTH)/starboard/shared/x11/window_create.cc',
-      '<(DEPTH)/starboard/shared/x11/window_destroy.cc',
-      '<(DEPTH)/starboard/shared/x11/window_get_platform_handle.cc',
-      '<(DEPTH)/starboard/shared/x11/window_get_size.cc',
-      '<(DEPTH)/starboard/shared/x11/window_internal.cc',
-    ],
-
-    'starboard_platform_dependencies': [
-      '<(DEPTH)/starboard/egl_and_gles/egl_and_gles.gyp:egl_and_gles',
-      '<(DEPTH)/third_party/libjpeg-turbo/libjpeg.gyp:libjpeg',
-    ],
-
-    # Exclude shared implementations specified by the included .gypi if this
-    # file already specifies a platform-specific version.
-    'starboard_platform_sources!': [
-      '<(DEPTH)/starboard/shared/starboard/player/player_set_bounds.cc',
-      '<(DEPTH)/starboard/shared/stub/image_decode.cc',
-      '<(DEPTH)/starboard/shared/stub/image_is_decode_supported.cc',
-    ],
-
-    'variables': {
-      'has_private_system_properties%': '<!(test -e <(DEPTH)/starboard/keyboxes/linux/system_properties.cc && echo 1 || echo 0)',
-    },
-    # This has_private_system_properties gets exported to gyp files that include this one.
-    'has_private_system_properties%': '<(has_private_system_properties)',
-    'conditions': [
-      ['has_private_system_properties==1', {
-        'starboard_platform_sources': [
-          '<(DEPTH)/starboard/keyboxes/linux/system_properties.cc',
-        ],
-      }, {
-        'starboard_platform_sources': [
-          '<(DEPTH)/starboard/linux/x64x11/public_system_properties.cc',
-        ],
-      }],
-    ],
-  },
-}
diff --git a/starboard/linux/x64x11/shared/starboard_platform_target.gypi b/starboard/linux/x64x11/shared/starboard_platform_target.gypi
deleted file mode 100644
index 033387e..0000000
--- a/starboard/linux/x64x11/shared/starboard_platform_target.gypi
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    'starboard_platform.gypi'
-  ],
-  'targets': [
-    {
-      'target_name': 'starboard_platform',
-      'type': 'static_library',
-
-      'sources': [
-        '<@(starboard_platform_sources)',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_common.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_common.h',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_writer.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_writer.h',
-      ],
-      'defines': [
-        'SB_PLAYER_ENABLE_VIDEO_DUMPER',
-        # This must be defined when building Starboard, and must not when
-        # building Starboard client code.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        '<@(starboard_platform_dependencies)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/linux/x64x11/skia/cobalt/configuration.py b/starboard/linux/x64x11/skia/cobalt/configuration.py
index feee8a0..32f4907 100644
--- a/starboard/linux/x64x11/skia/cobalt/configuration.py
+++ b/starboard/linux/x64x11/skia/cobalt/configuration.py
@@ -13,8 +13,6 @@
 # limitations under the License.
 """Starboard Linux x64x11 Skia Cobalt configuration."""
 
-import os
-
 from starboard.linux.shared.cobalt import configuration as shared_configuration
 from starboard.tools.testing import test_filter
 
@@ -25,12 +23,19 @@
 
   def GetTestFilters(self):
     filters = super(CobaltLinuxX64X11SkiaConfiguration, self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
+    for target, tests in self.__FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
 
   # A map of failing or crashing tests per target.
-  __FILTERED_TESTS = {
-      # Tracked by b/181270083
-      'renderer_test': ['PixelTest.RectWithRoundedCornersOnSolidColor',],
+  __FILTERED_TESTS = {  # pylint: disable=invalid-name
+      # Tracked by b/181270083, b/226999079.
+      'renderer_test': [
+          'PixelTest.RectWithRoundedCornersOnSolidColor',
+          'LottieCoveragePixelTest*skottie_linear_wipe_effect_json',
+          'LottieCoveragePixelTest*skottie_matte_blendmode_json',
+          'LottieCoveragePixelTest*skottie_shift_channels_effect_json',
+          'LottieCoveragePixelTest*skottie_3d_2planes_json',
+          'LottieCoveragePixelTest*skottie_venetianblinds_effect_json',
+      ],
   }
diff --git a/starboard/linux/x64x11/skia/gyp_configuration.gypi b/starboard/linux/x64x11/skia/gyp_configuration.gypi
deleted file mode 100644
index 51a2f3a..0000000
--- a/starboard/linux/x64x11/skia/gyp_configuration.gypi
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'target_defaults': {
-    'default_configuration': 'linux-x64x11-skia_debug',
-    'configurations': {
-      'linux-x64x11-skia_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'linux-x64x11-skia_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'linux-x64x11-skia_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'linux-x64x11-skia_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '../gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/skia/gyp_configuration.py b/starboard/linux/x64x11/skia/gyp_configuration.py
index 3964e75..557ec65 100644
--- a/starboard/linux/x64x11/skia/gyp_configuration.py
+++ b/starboard/linux/x64x11/skia/gyp_configuration.py
@@ -17,6 +17,4 @@
 
 
 def CreatePlatformConfig():
-  return linux_configuration.LinuxX64X11Configuration(
-      'linux-x64x11-skia',
-      sabi_json_path='starboard/sabi/x64/sysv/sabi-v{sb_api_version}.json')
+  return linux_configuration.LinuxX64X11Configuration('linux-x64x11-skia')
diff --git a/starboard/linux/x64x11/skia/platform_configuration/configuration.gni b/starboard/linux/x64x11/skia/platform_configuration/configuration.gni
index b95a6d5..6d451f3 100644
--- a/starboard/linux/x64x11/skia/platform_configuration/configuration.gni
+++ b/starboard/linux/x64x11/skia/platform_configuration/configuration.gni
@@ -13,3 +13,5 @@
 # limitations under the License.
 
 import("//starboard/linux/x64x11/platform_configuration/configuration.gni")
+
+use_skia_next = true
diff --git a/starboard/linux/x64x11/skia/starboard_platform.gyp b/starboard/linux/x64x11/skia/starboard_platform.gyp
deleted file mode 100644
index a026091..0000000
--- a/starboard/linux/x64x11/skia/starboard_platform.gyp
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '../shared/starboard_platform_target.gypi',
-  ],
-  'target_defaults': {
-    'sources': [
-      '<(DEPTH)/starboard/linux/x64x11/skia/configuration.cc',
-      '<(DEPTH)/starboard/linux/x64x11/skia/configuration.h',
-      '<(DEPTH)/starboard/linux/x64x11/skia/system_get_extensions.cc',
-    ],
-    'sources!': [
-      '<(DEPTH)/starboard/linux/shared/configuration.cc',
-      '<(DEPTH)/starboard/linux/shared/configuration.h',
-      '<(DEPTH)/starboard/linux/shared/system_get_extensions.cc',
-    ],
-  },
-}
diff --git a/starboard/linux/x64x11/skia/starboard_platform_tests.gyp b/starboard/linux/x64x11/skia/starboard_platform_tests.gyp
deleted file mode 100644
index 0ea8622..0000000
--- a/starboard/linux/x64x11/skia/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/starboard_platform_tests.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/skia/thread_types_public.h b/starboard/linux/x64x11/skia/thread_types_public.h
deleted file mode 100644
index 74cad05..0000000
--- a/starboard/linux/x64x11/skia/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_LINUX_X64X11_SKIA_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_SKIA_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/linux/shared/thread_types_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_SKIA_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/linux/x64x11/starboard_platform.gyp b/starboard/linux/x64x11/starboard_platform.gyp
deleted file mode 100644
index e1c91a2..0000000
--- a/starboard/linux/x64x11/starboard_platform.gyp
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Note, that despite the file extension ".gyp", this file is included by several
-# platform variants of linux-x64x11, like a ".gypi" file, since those platforms
-# have no need to modify this code.
-{
-  'includes': [
-    './shared/starboard_platform_target.gypi'
-  ],
-}
diff --git a/starboard/linux/x64x11/starboard_platform_tests.gyp b/starboard/linux/x64x11/starboard_platform_tests.gyp
deleted file mode 100644
index 0ea8622..0000000
--- a/starboard/linux/x64x11/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/linux/shared/starboard_platform_tests.gypi',
-  ],
-}
diff --git a/starboard/linux/x64x11/system_get_property_impl.cc b/starboard/linux/x64x11/system_get_property_impl.cc
index f08fa2c..416d1b0 100644
--- a/starboard/linux/x64x11/system_get_property_impl.cc
+++ b/starboard/linux/x64x11/system_get_property_impl.cc
@@ -26,12 +26,7 @@
 const char kFriendlyName[] = "Linux Desktop";
 const char kModelName[] = "ModelName";
 const char kPlatformName[] = "X11; Linux x86_64";
-
-#if SB_API_VERSION >= 12
 const char kSystemIntegratorName[] = "SystemIntegratorName";
-#else
-const char kOriginalDesignManufacturerName[] = "OriginalDesignManufacturerName";
-#endif
 
 #if SB_API_VERSION >= 13
 const char kModelYear[] = "2022";
@@ -93,15 +88,9 @@
       return CopyStringAndTestIfSuccess(out_value, value_length, kModelYear);
     case kSbSystemPropertyPlatformName:
       return CopyStringAndTestIfSuccess(out_value, value_length, kPlatformName);
-#if SB_API_VERSION >= 12
     case kSbSystemPropertySystemIntegratorName:
       return CopyStringAndTestIfSuccess(out_value, value_length,
                                         kSystemIntegratorName);
-#else
-    case kSbSystemPropertyOriginalDesignManufacturerName:
-      return CopyStringAndTestIfSuccess(out_value, value_length,
-                                        kOriginalDesignManufacturerName);
-#endif
     case kSbSystemPropertySpeechApiKey:
     case kSbSystemPropertyUserAgentAuxField:
       return false;
diff --git a/starboard/linux/x64x11/thread_types_public.h b/starboard/linux/x64x11/thread_types_public.h
deleted file mode 100644
index 5a256de..0000000
--- a/starboard/linux/x64x11/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_LINUX_X64X11_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_LINUX_X64X11_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/linux/shared/thread_types_public.h"
-
-#endif  // STARBOARD_LINUX_X64X11_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/linux/x64x11/toolchain_paths.sh b/starboard/linux/x64x11/toolchain_paths.sh
deleted file mode 100644
index 0d54c1d..0000000
--- a/starboard/linux/x64x11/toolchain_paths.sh
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/bash
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This script configures, verifies, and prepares toolchain paths.
-# This script is sourced from download_gcc.sh and download_clang.sh
-
-set -e
-
-script_dir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
-root="$(readlink -f "${script_dir}/../../..")"
-
-canonical_path="$(python "${root}/starboard/tools/get_toolchains_path.py")"
-base_path="${COBALT_TOOLCHAINS_DIR:=${canonical_path}}"
-toolchain_path="${base_path}/${toolchain_folder}"
-toolchain_binary="${toolchain_path}/${binary_path}"
-toolchain_symlink_path="${toolchain_path}/${symlink_path}"
-
-if [ -x "${toolchain_binary}" ]; then
-  # The toolchain binary already exist.
-  1>&2 echo "${toolchain_name} ${version} already available."
-
-  # If a symlink_path is set, then also verify that the
-  # toolchain_symlink_path actually is a symbolic link.
-  if [ -n "${symlink_path}" -a ! -L "${toolchain_symlink_path}" ]; then
-    1>&2 echo "${toolchain_symlink_path} is not a symbolic link, toolchain will be reinitialized."
-  else
-    exit 0
-  fi
-fi
-
-if [ -d "${toolchain_path}" ]; then
-  cat <<EOF 1>&2
-  WARNING: ${toolchain_name} ${version} folder ${toolchain_path}
-  already exists, but it does not contain a binary.  Perhaps a previous download
-  was interrupted or failed?
-EOF
-  rm -rf "${toolchain_path}"
-fi
-
-mkdir -p "${toolchain_path}"
-cd "${toolchain_path}"
-
-logfile="${toolchain_path}/build_log.txt"
-
-cat <<EOF 1>&2
-Downloading and compiling ${toolchain_name} version ${version} into ${toolchain_path}
-Log file can be found at ${logfile}
-This may take ${build_duration}
-EOF
diff --git a/starboard/loader_app/BUILD.gn b/starboard/loader_app/BUILD.gn
index 3d11846..951827f 100644
--- a/starboard/loader_app/BUILD.gn
+++ b/starboard/loader_app/BUILD.gn
@@ -24,6 +24,7 @@
   public_deps = [
     ":app_key",
     ":installation_manager",
+    ":memory_tracker_thread",
     ":slot_management",
     "//starboard",
     "//starboard/elf_loader:evergreen_info",
@@ -91,7 +92,6 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
 
 static_library("app_key") {
@@ -118,7 +118,6 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
 
 static_library("drain_file") {
@@ -142,7 +141,6 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
 
 static_library("installation_store_proto") {
@@ -189,7 +187,6 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
 
 static_library("slot_management") {
@@ -239,3 +236,15 @@
 
   public_deps = [ "//starboard:starboard_headers_only" ]
 }
+
+static_library("memory_tracker_thread") {
+  sources = [
+    "memory_tracker_thread.cc",
+    "memory_tracker_thread.h",
+  ]
+
+  deps = [
+    "//starboard:starboard_headers_only",
+    "//starboard/common",
+  ]
+}
diff --git a/starboard/loader_app/app_key.gyp b/starboard/loader_app/app_key.gyp
deleted file mode 100644
index 316b6b5..0000000
--- a/starboard/loader_app/app_key.gyp
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'app_key',
-      'type': 'static_library',
-      'sources': [
-        'app_key.cc',
-        'app_key.h',
-        'app_key_internal.cc',
-        'app_key_internal.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/third_party/modp_b64/modp_b64.gyp:modp_b64',
-      ],
-    },
-    {
-      'target_name': 'app_key_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'app_key_test.cc',
-        '<(DEPTH)/starboard/common/test_main.cc',
-      ],
-      'dependencies': [
-         ':app_key',
-         '<(DEPTH)/testing/gmock.gyp:gmock',
-         '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'app_key_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'app_key_test',
-      ],
-      'variables': {
-        'executable_name': 'app_key_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/loader_app/app_key_files.cc b/starboard/loader_app/app_key_files.cc
index 1b204a6..fcab813 100644
--- a/starboard/loader_app/app_key_files.cc
+++ b/starboard/loader_app/app_key_files.cc
@@ -91,7 +91,6 @@
   }
 
   bool found = false;
-#if SB_API_VERSION >= 12
   std::vector<char> filename(kSbFileMaxName);
   while (SbDirectoryGetNext(directory, filename.data(), filename.size())) {
     if (!strncmp(kFilePrefix, filename.data(), sizeof(kFilePrefix) - 1) &&
@@ -100,17 +99,6 @@
       break;
     }
   }
-#else
-  SbDirectoryEntry entry;
-  while (SbDirectoryGetNext(directory, &entry)) {
-    if (!strncmp(kFilePrefix, entry.name, sizeof(kFilePrefix) - 1) &&
-        EndsWith(entry.name, kGoodFileSuffix)) {
-      found = true;
-      break;
-    }
-  }
-#endif
-
   SbDirectoryClose(directory);
   return found;
 }
diff --git a/starboard/loader_app/app_key_files.gyp b/starboard/loader_app/app_key_files.gyp
deleted file mode 100644
index 48297b1..0000000
--- a/starboard/loader_app/app_key_files.gyp
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'app_key_files',
-      'type': 'static_library',
-      'sources': [
-        'app_key_files.h',
-        'app_key_files.cc',
-       ],
-      'dependencies' : [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'app_key_files_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'app_key_files_test.cc',
-        '<(DEPTH)/starboard/common/test_main.cc',
-      ],
-      'dependencies': [
-         ':app_key_files',
-         '<(DEPTH)/testing/gmock.gyp:gmock',
-         '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'app_key_files_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'app_key_files_test',
-      ],
-      'variables': {
-        'executable_name': 'app_key_files_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/loader_app/drain_file.cc b/starboard/loader_app/drain_file.cc
index b2a5e50..c84d7ac 100644
--- a/starboard/loader_app/drain_file.cc
+++ b/starboard/loader_app/drain_file.cc
@@ -80,7 +80,6 @@
 
   std::vector<std::string> filenames;
 
-#if SB_API_VERSION >= 12
   std::vector<char> filename(kSbFileMaxName);
 
   while (SbDirectoryGetNext(slot, filename.data(), filename.size())) {
@@ -89,17 +88,6 @@
     if (!strncmp(prefix.data(), filename.data(), prefix.size()))
       filenames.push_back(std::string(filename.data()));
   }
-#else
-  SbDirectoryEntry entry;
-
-  while (SbDirectoryGetNext(slot, &entry)) {
-    if (!strcmp(entry.name, ".") || !strcmp(entry.name, ".."))
-      continue;
-    if (!strncmp(prefix.data(), entry.name, prefix.size()))
-      filenames.push_back(std::string(entry.name));
-  }
-#endif
-
   SbDirectoryClose(slot);
   return filenames;
 }
@@ -195,7 +183,23 @@
   return !strcmp(ranking_app_key.data(), app_key);
 }
 
-bool Remove(const char* dir, const char* app_key) {
+void ClearExpired(const char* dir) {
+  SB_DCHECK(dir);
+  std::vector<std::string> filenames = FindAllWithPrefix(dir, kDrainFilePrefix);
+
+  for (const auto& filename : filenames) {
+    if (!IsExpired(filename)) {
+      continue;
+    }
+    const std::string path = dir + std::string(kSbFileSepString) + filename;
+    if (!SbFileDelete(path.c_str())) {
+      SB_LOG(ERROR) << "Failed to remove expired drain file at '" << path
+                    << "'";
+    }
+  }
+}
+
+void ClearForApp(const char* dir, const char* app_key) {
   SB_DCHECK(dir);
   SB_DCHECK(app_key);
 
@@ -205,29 +209,9 @@
 
   for (const auto& filename : filenames) {
     const std::string path = dir + std::string(kSbFileSepString) + filename;
-
-    if (!SbFileDelete(path.c_str()))
-      return false;
-  }
-  return true;
-}
-
-void Clear(const char* dir, const char* app_key, bool expired) {
-  SB_DCHECK(dir);
-
-  std::vector<std::string> filenames = FindAllWithPrefix(dir, kDrainFilePrefix);
-
-  for (const auto& filename : filenames) {
-    if (expired && !IsExpired(filename))
-      continue;
-    if (app_key && (filename.find(app_key) != std::string::npos))
-      continue;
-
-    const std::string path = dir + std::string(kSbFileSepString) + filename;
-
-    if (!SbFileDelete(path.c_str()))
-      SB_LOG(ERROR) << "Failed to remove expired drain file at '" << filename
-                    << "'";
+    if (!SbFileDelete(path.c_str())) {
+      SB_LOG(ERROR) << "Failed to remove drain file at '" << path << "'";
+    }
   }
 }
 
@@ -250,13 +234,13 @@
   }
 }
 
-bool Draining(const char* dir, const char* app_key) {
+bool IsAppDraining(const char* dir, const char* app_key) {
   SB_DCHECK(dir);
+  SB_DCHECK(app_key);
+  SB_DCHECK(strlen(app_key));
 
   std::string prefix(kDrainFilePrefix);
-
-  if (app_key)
-    prefix.append(app_key);
+  prefix.append(app_key);
 
   const std::vector<std::string> filenames =
       FindAllWithPrefix(dir, prefix.c_str());
@@ -268,6 +252,23 @@
   return false;
 }
 
+bool IsAnotherAppDraining(const char* dir, const char* app_key) {
+  SB_DCHECK(dir);
+  SB_DCHECK(app_key);
+  SB_DCHECK(strlen(app_key));
+  std::vector<std::string> filenames = FindAllWithPrefix(dir, kDrainFilePrefix);
+
+  for (const auto& filename : filenames) {
+    if ((filename.find(app_key) != std::string::npos)) {
+      continue;
+    }
+    if (!IsExpired(filename)) {
+      return true;
+    }
+  }
+  return false;
+}
+
 }  // namespace drain_file
 }  // namespace loader_app
 }  // namespace starboard
@@ -284,20 +285,24 @@
   return starboard::loader_app::drain_file::RankAndCheck(dir, app_key);
 }
 
-bool DrainFileRemove(const char* dir, const char* app_key) {
-  return starboard::loader_app::drain_file::Remove(dir, app_key);
+void DrainFileClearExpired(const char* dir) {
+  starboard::loader_app::drain_file::ClearExpired(dir);
 }
 
-void DrainFileClear(const char* dir, const char* app_key, bool expired) {
-  starboard::loader_app::drain_file::Clear(dir, app_key, expired);
+void DrainFileClearForApp(const char* dir, const char* app_key) {
+  starboard::loader_app::drain_file::ClearForApp(dir, app_key);
 }
 
 void DrainFilePrepareDirectory(const char* dir, const char* app_key) {
   starboard::loader_app::drain_file::PrepareDirectory(dir, app_key);
 }
 
-bool DrainFileDraining(const char* dir, const char* app_key) {
-  return starboard::loader_app::drain_file::Draining(dir, app_key);
+bool DrainFileIsAppDraining(const char* dir, const char* app_key) {
+  return starboard::loader_app::drain_file::IsAppDraining(dir, app_key);
+}
+
+bool DrainFileIsAnotherAppDraining(const char* dir, const char* app_key) {
+  return starboard::loader_app::drain_file::IsAnotherAppDraining(dir, app_key);
 }
 
 #ifdef __cplusplus
diff --git a/starboard/loader_app/drain_file.gyp b/starboard/loader_app/drain_file.gyp
deleted file mode 100644
index 454afd1..0000000
--- a/starboard/loader_app/drain_file.gyp
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'drain_file',
-      'type': 'static_library',
-      'sources': [
-        'drain_file.cc',
-        'drain_file.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/common/common.gyp:common',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'drain_file_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'drain_file_helper.cc',
-        'drain_file_helper.h',
-        'drain_file_test.cc',
-        '<(DEPTH)/starboard/common/test_main.cc',
-      ],
-      'dependencies': [
-         ':drain_file',
-         '<(DEPTH)/testing/gmock.gyp:gmock',
-         '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'drain_file_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'drain_file_test',
-      ],
-      'variables': {
-        'executable_name': 'drain_file_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/loader_app/drain_file.h b/starboard/loader_app/drain_file.h
index 92a9dba..11d72a5 100644
--- a/starboard/loader_app/drain_file.h
+++ b/starboard/loader_app/drain_file.h
@@ -42,24 +42,23 @@
 // match, otherwise |false|.
 bool DrainFileRankAndCheck(const char* dir, const char* app_key);
 
-// Removed the drain files in |dir| whose app key matches |app_key|. Returns
-// |true| if no files were found, or they were removed, otherwise returns
-// |false|.
-bool DrainFileRemove(const char* dir, const char* app_key);
+// Clears all expired drain files in |dir| for all apps.
+void DrainFileClearExpired(const char* dir);
 
-// Clears the drain files in |dir|. If |app_key| is provided, all drain files
-// with matching app keys are ignored. If |expired| is |true|, all non-expired
-// drain files are ignored.
-void DrainFileClear(const char* dir, const char* app_key, bool expired);
+// Clears the drain files in |dir| with an app key matching |app_key|.
+void DrainFileClearForApp(const char* dir, const char* app_key);
 
 // Clears all files and directories in |dir| except for the drain file with an
 // app key matching |app_key|.
 void DrainFilePrepareDirectory(const char* dir, const char* app_key);
 
-// Checks whether a non-expired drain file exists in |dir|. If |app_key| is
-// provided, only drain files with a matching |app_key| are considered. Returns
-// |true| if there is, otherwise |false|.
-bool DrainFileDraining(const char* dir, const char* app_key);
+// Checks whether a non-expired drain file exists in |dir| for an app
+// with key |app_key|.
+bool DrainFileIsAppDraining(const char* dir, const char* app_key);
+
+// Checks whether a non-expired drain file exists in |dir| for an app
+// with key different from |app_key|.
+bool DrainFileIsAnotherAppDraining(const char* dir, const char* app_key);
 
 #ifdef __cplusplus
 }  // extern "C"
diff --git a/starboard/loader_app/drain_file_test.cc b/starboard/loader_app/drain_file_test.cc
index 35ae7cd..bf0863c 100644
--- a/starboard/loader_app/drain_file_test.cc
+++ b/starboard/loader_app/drain_file_test.cc
@@ -36,29 +36,20 @@
 
 class DrainFileTest : public ::testing::Test {
  protected:
-  // This function is used to set the temporary directory used for testing once,
-  // and to create a subdir in this test directory, once for all test cases.
-  static void SetUpTestCase() {
-    std::vector<char> path(kSbFileMaxPath, 0);
-
-    ASSERT_TRUE(
-        SbSystemGetPath(kSbSystemPathTempDirectory, path.data(), path.size()));
-
-    dir_.assign(path.data());
+  void SetUp() override {
+    temp_dir_.resize(kSbFileMaxPath);
+    ASSERT_TRUE(SbSystemGetPath(kSbSystemPathTempDirectory, temp_dir_.data(),
+                                temp_dir_.size()));
   }
 
-  void TearDown() override {
-    DrainFileClear(GetTempDir(), NULL, false);
-  }
+  void TearDown() override { DrainFileClearForApp(GetTempDir(), ""); }
 
-  const char* GetTempDir() const { return dir_.c_str(); }
+  const char* GetTempDir() const { return temp_dir_.data(); }
 
  private:
-  static std::string dir_;
+  std::vector<char> temp_dir_;
 };
 
-std::string DrainFileTest::dir_ = "";
-
 // Typical drain file usage.
 TEST_F(DrainFileTest, SunnyDay) {
   EXPECT_TRUE(DrainFileTryDrain(GetTempDir(), kAppKeyOne));
@@ -71,9 +62,9 @@
   ScopedDrainFile stale(GetTempDir(), kAppKeyOne,
                         SbTimeGetNow() - kDrainFileMaximumAge);
 
-  EXPECT_FALSE(DrainFileDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_FALSE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
   EXPECT_TRUE(DrainFileTryDrain(GetTempDir(), kAppKeyOne));
-  EXPECT_TRUE(DrainFileDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_TRUE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
 }
 
 // Previously created drain file should be reused if it has not expired.
@@ -85,56 +76,74 @@
 // Draining status should return whether or not the file exists and has not yet
 // expired.
 TEST_F(DrainFileTest, SunnyDayDraining) {
-  EXPECT_FALSE(DrainFileDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_FALSE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
   EXPECT_TRUE(DrainFileTryDrain(GetTempDir(), kAppKeyOne));
-  EXPECT_TRUE(DrainFileDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_TRUE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
 
-  DrainFileClear(GetTempDir(), NULL, false);
+  DrainFileClearForApp(GetTempDir(), kAppKeyOne);
 
-  EXPECT_FALSE(DrainFileDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_FALSE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
+}
+
+// Check if another app is draining.
+TEST_F(DrainFileTest, SunnyDayAnotherAppDraining) {
+  EXPECT_FALSE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_FALSE(DrainFileIsAppDraining(GetTempDir(), kAppKeyTwo));
+  EXPECT_FALSE(DrainFileIsAnotherAppDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_FALSE(DrainFileIsAnotherAppDraining(GetTempDir(), kAppKeyTwo));
+
+  EXPECT_TRUE(DrainFileTryDrain(GetTempDir(), kAppKeyOne));
+  EXPECT_TRUE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_TRUE(DrainFileIsAnotherAppDraining(GetTempDir(), kAppKeyTwo));
+
+  DrainFileClearForApp(GetTempDir(), kAppKeyOne);
+  EXPECT_FALSE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_FALSE(DrainFileIsAnotherAppDraining(GetTempDir(), kAppKeyTwo));
 }
 
 // Remove an existing drain file.
 TEST_F(DrainFileTest, SunnyDayRemove) {
   EXPECT_TRUE(DrainFileTryDrain(GetTempDir(), kAppKeyOne));
-  EXPECT_TRUE(DrainFileDraining(GetTempDir(), kAppKeyOne));
-  EXPECT_TRUE(DrainFileRemove(GetTempDir(), kAppKeyOne));
-  EXPECT_FALSE(DrainFileDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_TRUE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
+  DrainFileClearForApp(GetTempDir(), kAppKeyOne);
+  EXPECT_FALSE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
 }
 
-// Try to remove a drain file that does not exist.
-TEST_F(DrainFileTest, SunnyDayRemoveNonexistentDrainFile) {
-  EXPECT_FALSE(DrainFileDraining(GetTempDir(), kAppKeyOne));
-  EXPECT_TRUE(DrainFileRemove(GetTempDir(), kAppKeyOne));
-}
-
-// When clearing drain files it should be possible to provide a file to ignore,
-// and it should be possible to only clear expire files if desired.
-TEST_F(DrainFileTest, SunnyDayClear) {
+// Clear only expired drain files.
+TEST_F(DrainFileTest, SunnyDayClearExpired) {
   EXPECT_TRUE(DrainFileTryDrain(GetTempDir(), kAppKeyOne));
 
   ScopedDrainFile valid_file(GetTempDir(), kAppKeyTwo, SbTimeGetNow());
   ScopedDrainFile stale_file(GetTempDir(), kAppKeyThree,
                              SbTimeGetNow() - kDrainFileMaximumAge);
 
-  EXPECT_TRUE(DrainFileDraining(GetTempDir(), kAppKeyOne));
-  EXPECT_TRUE(DrainFileDraining(GetTempDir(), kAppKeyTwo));
+  EXPECT_TRUE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_TRUE(DrainFileIsAppDraining(GetTempDir(), kAppKeyTwo));
   EXPECT_TRUE(SbFileExists(stale_file.path().c_str()));
 
-  DrainFileClear(GetTempDir(), kAppKeyOne, true);
+  DrainFileClearExpired(GetTempDir());
 
-  EXPECT_TRUE(DrainFileDraining(GetTempDir(), kAppKeyOne));
-  EXPECT_TRUE(DrainFileDraining(GetTempDir(), kAppKeyTwo));
   EXPECT_FALSE(SbFileExists(stale_file.path().c_str()));
+}
 
-  DrainFileClear(GetTempDir(), kAppKeyOne, false);
+// Clearing drain files for an app.
+TEST_F(DrainFileTest, SunnyDayClearForApp) {
+  EXPECT_TRUE(DrainFileTryDrain(GetTempDir(), kAppKeyOne));
 
-  EXPECT_TRUE(DrainFileDraining(GetTempDir(), kAppKeyOne));
-  EXPECT_FALSE(DrainFileDraining(GetTempDir(), kAppKeyTwo));
+  ScopedDrainFile valid_file(GetTempDir(), kAppKeyTwo, SbTimeGetNow());
+  ScopedDrainFile stale_file(GetTempDir(), kAppKeyThree,
+                             SbTimeGetNow() - kDrainFileMaximumAge);
 
-  DrainFileClear(GetTempDir(), NULL, false);
+  EXPECT_TRUE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_TRUE(DrainFileIsAppDraining(GetTempDir(), kAppKeyTwo));
+  EXPECT_TRUE(SbFileExists(stale_file.path().c_str()));
 
-  EXPECT_FALSE(DrainFileDraining(GetTempDir(), kAppKeyOne));
+  // clean all drain files for an app
+  DrainFileClearForApp(GetTempDir(), kAppKeyOne);
+
+  EXPECT_FALSE(DrainFileIsAppDraining(GetTempDir(), kAppKeyOne));
+  EXPECT_TRUE(DrainFileIsAppDraining(GetTempDir(), kAppKeyTwo));
+  EXPECT_TRUE(SbFileExists(stale_file.path().c_str()));
 }
 
 // Ranking drain files should first be done by timestamp, with the app key being
diff --git a/starboard/loader_app/installation_manager.cc b/starboard/loader_app/installation_manager.cc
index bb9601f..6228d9e 100644
--- a/starboard/loader_app/installation_manager.cc
+++ b/starboard/loader_app/installation_manager.cc
@@ -595,7 +595,6 @@
   installation_store_.SerializeToArray(buf.data(),
                                        installation_store_.ByteSize());
 
-#if SB_API_VERSION >= 12
   if (!SbFileAtomicReplace(store_path_.c_str(), buf.data(),
                            installation_store_.ByteSize())) {
     SB_LOG(ERROR)
@@ -605,31 +604,17 @@
   }
   SB_DLOG(INFO) << "SaveInstallationStore successful";
   return true;
-
-#else
-  SB_NOTREACHED()
-      << "SbFileAtomicReplace is not available before starboard version 12";
-  return false;
-#endif
 }
 
 bool InstallationManager::InitInstallationStorePath() {
   std::vector<char> storage_dir(kSbFileMaxPath);
-#if SB_API_VERSION >= 12
+
   if (!SbSystemGetPath(kSbSystemPathStorageDirectory, storage_dir.data(),
                        kSbFileMaxPath)) {
     SB_LOG(ERROR) << "InitInstallationStorePath: Failed to get "
                      "kSbSystemPathStorageDirectory";
     return false;
   }
-#else
-  SB_NOTREACHED() << "InitInstallationStorePath: kSbSystemPathStorageDirectory "
-                     "is not available before "
-                     "starboard version "
-                  << 12;
-  return false;
-
-#endif
   storage_dir_ = storage_dir.data();
   store_path_ = storage_dir.data();
   store_path_ += kSbFileSepString;
diff --git a/starboard/loader_app/installation_manager.gyp b/starboard/loader_app/installation_manager.gyp
deleted file mode 100644
index fb547c5..0000000
--- a/starboard/loader_app/installation_manager.gyp
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'installation_store_proto',
-      'type': 'static_library',
-      'sources': [
-        'installation_store.pb.cc',
-        'installation_store_store.pb.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-      ],
-    },
-    {
-      'target_name': 'installation_manager',
-      'type': 'static_library',
-      'sources': [
-        'installation_manager.cc',
-        'installation_manager.h',
-      ],
-      'dependencies': [
-        ':installation_store_proto',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'conditions': [
-        ['sb_evergreen_compatible_lite != 1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/loader_app/pending_restart.gyp:pending_restart',
-          ],},
-        ],
-      ],
-      'include_dirs': [
-        # Get protobuf headers from the chromium tree.
-        '<(DEPTH)/third_party/protobuf/src',
-      ],
-    },
-    {
-      'target_name': 'installation_manager_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'installation_manager_test.cc',
-        '<(DEPTH)/starboard/common/test_main.cc',
-      ],
-      'conditions': [
-        ['sb_evergreen_compatible_lite != 1', {
-          'sources': [
-            'pending_restart_test.cc',
-          ],},
-        ],
-      ],
-      'dependencies': [
-         ':installation_manager',
-         '<(DEPTH)/testing/gmock.gyp:gmock',
-         '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'installation_manager_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'installation_manager_test',
-      ],
-      'variables': {
-        'executable_name': 'installation_manager_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/loader_app/installation_manager_test.cc b/starboard/loader_app/installation_manager_test.cc
index 2d558f7..b7e6cad 100644
--- a/starboard/loader_app/installation_manager_test.cc
+++ b/starboard/loader_app/installation_manager_test.cc
@@ -172,7 +172,7 @@
     ImUninitialize();
     SbDirectory dir = SbDirectoryOpen(storage_path_.c_str(), NULL);
     std::vector<std::string> dir_;
-#if SB_API_VERSION >= 12
+
     std::vector<char> dir_entry(kSbFileMaxName);
 
     while (SbDirectoryGetNext(dir, dir_entry.data(), dir_entry.size())) {
@@ -181,16 +181,7 @@
       full_path += dir_entry.data();
       SbFileDelete(full_path.c_str());
     }
-#else   // SB_API_VERSION >= 12
-    SbDirectoryEntry dir_entry;
 
-    while (SbDirectoryGetNext(dir, &dir_entry)) {
-      std::string full_path = storage_path_;
-      full_path += kSbFileSepString;
-      full_path += dir_entry.name;
-      SbFileDelete(full_path.c_str());
-    }
-#endif  // SB_API_VERSION >= 12
     SbDirectoryClose(dir);
     SbFileDelete(storage_path_.c_str());
   }
diff --git a/starboard/loader_app/loader_app.cc b/starboard/loader_app/loader_app.cc
index 2fdce8f..ea977f2 100644
--- a/starboard/loader_app/loader_app.cc
+++ b/starboard/loader_app/loader_app.cc
@@ -27,13 +27,13 @@
 #include "starboard/file.h"
 #include "starboard/loader_app/app_key.h"
 #include "starboard/loader_app/loader_app_switches.h"
+#include "starboard/loader_app/memory_tracker_thread.h"
 #include "starboard/loader_app/slot_management.h"
 #include "starboard/loader_app/system_get_extension_shim.h"
 #include "starboard/memory.h"
 #include "starboard/mutex.h"
 #include "starboard/shared/starboard/command_line.h"
 #include "starboard/string.h"
-#include "starboard/thread_types.h"
 #include "third_party/crashpad/wrapper/annotations.h"
 #include "third_party/crashpad/wrapper/wrapper.h"
 
@@ -45,6 +45,9 @@
 // Relative path to the Cobalt's system image library.
 const char kSystemImageLibraryPath[] = "app/cobalt/lib/libcobalt.so";
 
+// Relative path to the compressed Cobalt's system image library.
+const char kSystemImageCompressedLibraryPath[] = "app/cobalt/lib/libcobalt.lz4";
+
 // Cobalt default URL.
 const char kCobaltDefaultUrl[] = "https://www.youtube.com/tv";
 
@@ -58,9 +61,12 @@
 class CobaltLibraryLoader : public starboard::loader_app::LibraryLoader {
  public:
   virtual bool Load(const std::string& library_path,
-                    const std::string& content_path) {
+                    const std::string& content_path,
+                    bool use_compression,
+                    bool use_memory_mapped_file) {
     return g_elf_loader.Load(library_path, content_path, false,
-                             &starboard::loader_app::SbSystemGetExtensionShim);
+                             &starboard::loader_app::SbSystemGetExtensionShim,
+                             use_compression, use_memory_mapped_file);
   }
   virtual void* Resolve(const std::string& symbol) {
     return g_elf_loader.LookupSymbol(symbol.c_str());
@@ -79,7 +85,13 @@
   return true;
 }
 
-void LoadLibraryAndInitialize(const std::string& alternative_content_path) {
+void LoadLibraryAndInitialize(const std::string& alternative_content_path,
+                              bool use_compression,
+                              bool use_memory_mapped_file) {
+  if (use_compression && use_memory_mapped_file) {
+    SB_LOG(ERROR) << "Using both compression and mmap files is not supported";
+    return;
+  }
   std::string content_dir;
   if (!GetContentDir(&content_dir)) {
     SB_LOG(ERROR) << "Failed to get the content dir";
@@ -95,13 +107,15 @@
   }
   std::string library_path = content_dir;
   library_path += kSbFileSepString;
-  library_path += kSystemImageLibraryPath;
-  if (!SbFileExists(library_path.c_str())) {
-    // Try the compressed path if the binary doesn't exits.
-    library_path += starboard::elf_loader::kCompressionSuffix;
+
+  if (use_compression) {
+    library_path += kSystemImageCompressedLibraryPath;
+  } else {
+    library_path += kSystemImageLibraryPath;
   }
 
-  if (!g_elf_loader.Load(library_path, content_path, false)) {
+  if (!g_elf_loader.Load(library_path, content_path, false, nullptr,
+                         use_compression, use_memory_mapped_file)) {
     SB_NOTREACHED() << "Failed to load library at '"
                     << g_elf_loader.GetLibraryPath() << "'.";
     return;
@@ -177,20 +191,40 @@
         command_line.HasSwitch(starboard::loader_app::kEvergreenLite);
     SB_LOG(INFO) << "is_evergreen_lite=" << is_evergreen_lite;
 
-#if SB_API_VERSION >= 12
     if (command_line.HasSwitch(starboard::loader_app::kShowSABI)) {
       std::string sabi = "SABI=";
       sabi += SB_SABI_JSON_ID;
       SbLogRaw(sabi.c_str());
     }
-#endif
 
     std::string alternative_content =
         command_line.GetSwitchValue(starboard::loader_app::kContent);
     SB_LOG(INFO) << "alternative_content=" << alternative_content;
 
+    bool use_compression =
+        command_line.HasSwitch(starboard::loader_app::kLoaderUseCompression);
+
+    bool use_memory_mapped_file = command_line.HasSwitch(
+        starboard::loader_app::kLoaderUseMemoryMappedFile);
+    SB_LOG(INFO) << "loader_app: use_compression=" << use_compression
+                 << " use_memory_mapped_file=" << use_memory_mapped_file;
+
+    if (command_line.HasSwitch(starboard::loader_app::kLoaderTrackMemory)) {
+      std::string period = command_line.GetSwitchValue(
+          starboard::loader_app::kLoaderTrackMemory);
+      if (period.empty()) {
+        static starboard::loader_app::MemoryTrackerThread memory_tracker_thread;
+        memory_tracker_thread.Start();
+      } else {
+        static starboard::loader_app::MemoryTrackerThread memory_tracker_thread(
+            atoi(period.c_str()));
+        memory_tracker_thread.Start();
+      }
+    }
+
     if (is_evergreen_lite) {
-      LoadLibraryAndInitialize(alternative_content);
+      LoadLibraryAndInitialize(alternative_content, use_compression,
+                               use_memory_mapped_file);
     } else {
       std::string url =
           command_line.GetSwitchValue(starboard::loader_app::kURL);
@@ -202,7 +236,8 @@
 
       g_sb_event_func = reinterpret_cast<void (*)(const SbEvent*)>(
           starboard::loader_app::LoadSlotManagedLibrary(
-              app_key, alternative_content, &g_cobalt_library_loader));
+              app_key, alternative_content, &g_cobalt_library_loader,
+              use_compression, use_memory_mapped_file));
     }
     SB_CHECK(g_sb_event_func);
   }
diff --git a/starboard/loader_app/loader_app.gyp b/starboard/loader_app/loader_app.gyp
deleted file mode 100644
index 89f7121..0000000
--- a/starboard/loader_app/loader_app.gyp
+++ /dev/null
@@ -1,107 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'common_loader_app_sources': [
-      'loader_app.cc',
-      'loader_app_switches.h',
-      'loader_app_switches.cc',
-      'system_get_extension_shim.h',
-      'system_get_extension_shim.cc',
-    ],
-    'common_loader_app_dependencies': [
-      '<(DEPTH)/starboard/elf_loader/sabi_string.gyp:sabi_string',
-      '<(DEPTH)/starboard/loader_app/app_key.gyp:app_key',
-      '<(DEPTH)/starboard/loader_app/installation_manager.gyp:installation_manager',
-      '<(DEPTH)/starboard/loader_app/slot_management.gyp:slot_management',
-      '<(DEPTH)/starboard/starboard.gyp:starboard',
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'loader_app',
-      'type': '<(final_executable_type)',
-      'conditions': [
-        ['target_arch in ["x86", "x64", "arm", "arm64"] ', {
-          'sources': [
-            '<@(common_loader_app_sources)',
-          ],
-          'dependencies': [
-            '<(DEPTH)/cobalt/content/fonts/fonts.gyp:copy_font_data',
-            '<(DEPTH)/starboard/elf_loader/elf_loader.gyp:elf_loader',
-            '<@(common_loader_app_dependencies)',
-            # TODO: Remove this dependency once MediaSession is migrated to use CobaltExtensions.
-            '<@(cobalt_platform_dependencies)',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'loader_app_deploy',
-      'type': 'none',
-      'dependencies': [
-        'loader_app',
-      ],
-      'variables': {
-        'executable_name': 'loader_app',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      'target_name': 'loader_app_sys',
-      'type': '<(final_executable_type)',
-      'conditions': [
-        ['target_arch in ["x86", "x64", "arm", "arm64"] ', {
-          'sources': [
-            '<@(common_loader_app_sources)',
-          ],
-          'dependencies': [
-            '<(DEPTH)/starboard/elf_loader/elf_loader.gyp:elf_loader_sys',
-            '<@(common_loader_app_dependencies)',
-            # TODO: Remove this dependency once MediaSession is migrated to use CobaltExtensions.
-            '<@(cobalt_platform_dependencies)',
-          ],
-          'ldflags': [
-            '-Wl,--dynamic-list=<(DEPTH)/starboard/starboard.syms',
-            '-ldl' ,
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'loader_app_sys_deploy',
-      'type': 'none',
-      'dependencies': [
-        'loader_app',
-      ],
-      'variables': {
-        'executable_name': 'loader_app_sys',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      'target_name': 'loader_app_tests_deploy',
-      'type': 'none',
-      'dependencies': [
-        'loader_app',
-        '<(DEPTH)/starboard/loader_app/app_key.gyp:app_key_test_deploy',
-        '<(DEPTH)/starboard/loader_app/app_key_files.gyp:app_key_files_test_deploy',
-        '<(DEPTH)/starboard/loader_app/drain_file.gyp:drain_file_test_deploy',
-        '<(DEPTH)/starboard/loader_app/installation_manager.gyp:installation_manager_test_deploy',
-        '<(DEPTH)/starboard/loader_app/slot_management.gyp:slot_management_test_deploy',
-      ],
-    },
-  ],
-}
diff --git a/starboard/loader_app/loader_app_switches.cc b/starboard/loader_app/loader_app_switches.cc
index 7758dea..e094721 100644
--- a/starboard/loader_app/loader_app_switches.cc
+++ b/starboard/loader_app/loader_app_switches.cc
@@ -22,6 +22,9 @@
 const char kEvergreenLite[] = "evergreen_lite";
 const char kLoaderAppVersion[] = "loader_app_version";
 const char kShowSABI[] = "show_sabi";
+const char kLoaderUseCompression[] = "loader_use_compression";
+const char kLoaderUseMemoryMappedFile[] = "loader_use_mmap_file";
+const char kLoaderTrackMemory[] = "loader_track_memory";
 
 }  // namespace loader_app
 }  // namespace starboard
diff --git a/starboard/loader_app/loader_app_switches.h b/starboard/loader_app/loader_app_switches.h
index 22030c5..1ddb2ff 100644
--- a/starboard/loader_app/loader_app_switches.h
+++ b/starboard/loader_app/loader_app_switches.h
@@ -38,6 +38,14 @@
 // Print the loader_app Starboard ABI string on the command line.
 extern const char kShowSABI[];
 
+// The elf loader should use compression.
+extern const char kLoaderUseCompression[];
+
+// The elf loader should use a Memory Mapped file.
+extern const char kLoaderUseMemoryMappedFile[];
+
+// The loader app should query for and log its memory usage.
+extern const char kLoaderTrackMemory[];
 }  // namespace loader_app
 }  // namespace starboard
 
diff --git a/starboard/loader_app/memory_tracker_thread.cc b/starboard/loader_app/memory_tracker_thread.cc
new file mode 100644
index 0000000..d2c3781
--- /dev/null
+++ b/starboard/loader_app/memory_tracker_thread.cc
@@ -0,0 +1,44 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/loader_app/memory_tracker_thread.h"
+
+namespace starboard {
+namespace loader_app {
+
+MemoryTrackerThread::MemoryTrackerThread(int period_in_millis)
+    : Thread("MemoryTrackerTh"), period_in_millis_(period_in_millis) {}
+
+MemoryTrackerThread::~MemoryTrackerThread() {
+  SB_LOG(INFO) << "Used max of " << max_used_cpu_memory_
+               << " bytes of CPU memory";
+  Join();
+}
+
+void MemoryTrackerThread::Run() {
+  int64_t used_cpu_memory = 0;
+  while (!join_called()) {
+    used_cpu_memory = SbSystemGetUsedCPUMemory();
+    SB_LOG(INFO) << "Using " << used_cpu_memory << " of "
+                 << SbSystemGetTotalCPUMemory() << " bytes of available "
+                 << "CPU Memory";
+    if (used_cpu_memory > max_used_cpu_memory_) {
+      max_used_cpu_memory_ = used_cpu_memory;
+    }
+    SleepMilliseconds(period_in_millis_);
+  }
+}
+
+}  // namespace loader_app
+}  // namespace starboard
diff --git a/starboard/loader_app/memory_tracker_thread.h b/starboard/loader_app/memory_tracker_thread.h
new file mode 100644
index 0000000..bce8bc9
--- /dev/null
+++ b/starboard/loader_app/memory_tracker_thread.h
@@ -0,0 +1,40 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_LOADER_APP_MEMORY_TRACKER_THREAD_H_
+#define STARBOARD_LOADER_APP_MEMORY_TRACKER_THREAD_H_
+
+#include "starboard/common/thread.h"
+#include "starboard/types.h"
+
+namespace starboard {
+namespace loader_app {
+
+// Periodically queries for and logs process memory usage when enabled.
+class MemoryTrackerThread : public starboard::Thread {
+ public:
+  explicit MemoryTrackerThread(int period_in_millis = 100);
+  ~MemoryTrackerThread();
+
+ private:
+  void Run() override;
+
+  const int period_in_millis_;
+  int64_t max_used_cpu_memory_ = 0;
+};
+
+}  // namespace loader_app
+}  // namespace starboard
+
+#endif  // STARBOARD_LOADER_APP_MEMORY_TRACKER_THREAD_H_
diff --git a/starboard/loader_app/pending_restart.gyp b/starboard/loader_app/pending_restart.gyp
deleted file mode 100644
index 090e61d..0000000
--- a/starboard/loader_app/pending_restart.gyp
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'pending_restart',
-      'type': 'static_library',
-      'sources': [
-        'pending_restart.h',
-        'pending_restart.cc',
-       ],
-    },
-  ],
-}
diff --git a/starboard/loader_app/slot_management.cc b/starboard/loader_app/slot_management.cc
index 0d8cf3f..b834f07 100644
--- a/starboard/loader_app/slot_management.cc
+++ b/starboard/loader_app/slot_management.cc
@@ -43,33 +43,41 @@
 // Filename for the Cobalt binary.
 const char kCobaltLibraryName[] = "libcobalt.so";
 
+// Filename for the compressed Cobalt binary.
+const char kCompressedCobaltLibraryName[] = "libcobalt.lz4";
+
 // Relative path for the content directory of
 // the Cobalt installation.
 const char kCobaltContentPath[] = "content";
 
 }  // namespace
 
-int RevertBack(int current_installation, const std::string& app_key) {
+int RevertBack(int current_installation,
+               const std::string& app_key,
+               bool mark_bad) {
   SB_LOG(INFO) << "RevertBack current_installation=" << current_installation;
   SB_DCHECK(current_installation != 0);
-  std::vector<char> installation_path(kSbFileMaxPath);
-  if (ImGetInstallationPath(current_installation, installation_path.data(),
-                            kSbFileMaxPath) != IM_ERROR) {
-    std::string bad_app_key_file_path =
-        starboard::loader_app::GetBadAppKeyFilePath(installation_path.data(),
-                                                    app_key);
-    if (bad_app_key_file_path.empty()) {
-      SB_LOG(WARNING) << "Failed to get bad app key file path for path="
-                      << installation_path.data() << " and app_key=" << app_key;
-    } else {
-      if (!starboard::loader_app::CreateAppKeyFile(bad_app_key_file_path)) {
-        SB_LOG(WARNING) << "Failed to create bad app key file: "
-                        << bad_app_key_file_path;
+  if (mark_bad) {
+    std::vector<char> installation_path(kSbFileMaxPath);
+    if (ImGetInstallationPath(current_installation, installation_path.data(),
+                              kSbFileMaxPath) != IM_ERROR) {
+      std::string bad_app_key_file_path =
+          starboard::loader_app::GetBadAppKeyFilePath(installation_path.data(),
+                                                      app_key);
+      if (bad_app_key_file_path.empty()) {
+        SB_LOG(WARNING) << "Failed to get bad app key file path for path="
+                        << installation_path.data()
+                        << " and app_key=" << app_key;
+      } else {
+        if (!starboard::loader_app::CreateAppKeyFile(bad_app_key_file_path)) {
+          SB_LOG(WARNING) << "Failed to create bad app key file: "
+                          << bad_app_key_file_path;
+        }
       }
+    } else {
+      SB_LOG(WARNING) << "Failed to get installation path for index: "
+                      << current_installation;
     }
-  } else {
-    SB_LOG(WARNING) << "Failed to get installation path for index: "
-                    << current_installation;
   }
   current_installation = ImRevertToSuccessfulInstallation();
   return current_installation;
@@ -124,7 +132,13 @@
 
 void* LoadSlotManagedLibrary(const std::string& app_key,
                              const std::string& alternative_content_path,
-                             LibraryLoader* library_loader) {
+                             LibraryLoader* library_loader,
+                             bool use_compression,
+                             bool use_memory_mapped_file) {
+  if (use_compression && use_memory_mapped_file) {
+    SB_LOG(ERROR) << "Using both compression and mmap files is not supported";
+    return NULL;
+  }
   // Initialize the Installation Manager.
   SB_CHECK(ImInitialize(kMaxNumInstallations, app_key.c_str()) == IM_SUCCESS)
       << "Abort. Failed to initialize Installation Manager";
@@ -150,7 +164,8 @@
         // discard the image and auto rollback, but only if
         // the current image is not the system image.
         if (current_installation != 0) {
-          current_installation = RevertBack(current_installation, app_key);
+          current_installation =
+              RevertBack(current_installation, app_key, true /* mark_bad */);
         }
       }
     }
@@ -167,7 +182,8 @@
       // Hard failure. Discard the image and auto rollback, but only if
       // the current image is not the system image.
       if (current_installation != 0) {
-        current_installation = RevertBack(current_installation, app_key);
+        current_installation =
+            RevertBack(current_installation, app_key, true /* mark_bad */);
         continue;
       } else {
         // The system image at index 0 failed.
@@ -178,41 +194,49 @@
     SB_DLOG(INFO) << "installation_path=" << installation_path.data();
 
     if (current_installation != 0) {
-      // Cleanup expired drain files
-      DrainFileClear(installation_path.data(), app_key.c_str(), true);
+      // Cleanup all expired files from all apps.
+      DrainFileClearExpired(installation_path.data());
+
+      // Cleanup all drain files from the current app.
+      DrainFileClearForApp(installation_path.data(), app_key.c_str());
 
       // Check for bad file.
       if (CheckBadFileExists(installation_path.data(), app_key.c_str())) {
         SB_LOG(INFO) << "Bad app key file";
-        current_installation = RevertBack(current_installation, app_key);
+        current_installation =
+            RevertBack(current_installation, app_key, true /* mark_bad */);
         continue;
       }
       // If the current installation is in use by an updater roll back.
-      if (DrainFileDraining(installation_path.data(), "")) {
+      if (DrainFileIsAnotherAppDraining(installation_path.data(),
+                                        app_key.c_str())) {
         SB_LOG(INFO) << "Active slot draining";
-        current_installation = RevertBack(current_installation, app_key);
+        current_installation =
+            RevertBack(current_installation, app_key, false /* mark_bad */);
         continue;
       }
       // Adopt installation performed from different app.
       if (!AdoptInstallation(current_installation, installation_path.data(),
                              app_key.c_str())) {
         SB_LOG(INFO) << "Unable to adopt installation";
-        current_installation = RevertBack(current_installation, app_key);
+        current_installation =
+            RevertBack(current_installation, app_key, true /* mark_bad */);
         continue;
       }
     }
 
     // installation_n/lib/libcobalt.so
     std::vector<char> lib_path(kSbFileMaxPath);
+    std::string library_name;
+    if (use_compression) {
+      library_name = kCompressedCobaltLibraryName;
+    } else {
+      library_name = kCobaltLibraryName;
+    }
     SbStringFormatF(lib_path.data(), kSbFileMaxPath, "%s%s%s%s%s",
                     installation_path.data(), kSbFileSepString,
-                    kCobaltLibraryPath, kSbFileSepString, kCobaltLibraryName);
-    if (!SbFileExists(lib_path.data())) {
-      // Try the compressed path if the binary doesn't exits.
-      starboard::strlcat(lib_path.data(),
-                         starboard::elf_loader::kCompressionSuffix,
-                         kSbFileMaxPath);
-    }
+                    kCobaltLibraryPath, kSbFileSepString, library_name.c_str());
+
     SB_LOG(INFO) << "lib_path=" << lib_path.data();
 
     std::string content;
@@ -229,13 +253,15 @@
 
     SB_LOG(INFO) << "content=" << content;
 
-    if (!library_loader->Load(lib_path.data(), content.c_str())) {
+    if (!library_loader->Load(lib_path.data(), content.c_str(), use_compression,
+                              use_memory_mapped_file)) {
       SB_LOG(WARNING) << "Failed to load Cobalt!";
 
       // Hard failure. Discard the image and auto rollback, but only if
       // the current image is not the system image.
       if (current_installation != 0) {
-        current_installation = RevertBack(current_installation, app_key);
+        current_installation =
+            RevertBack(current_installation, app_key, true /* mark_bad */);
         continue;
       } else {
         // The system image at index 0 failed.
@@ -261,7 +287,8 @@
       // Hard failure. Discard the image and auto rollback, but only if
       // the current image is not the system image.
       if (current_installation != 0) {
-        current_installation = RevertBack(current_installation, app_key);
+        current_installation =
+            RevertBack(current_installation, app_key, true /* mark_bad */);
         continue;
       } else {
         // The system image at index 0 failed.
@@ -294,7 +321,8 @@
       // Hard failure. Discard the image and auto rollback, but only if
       // the current image is not the system image.
       if (current_installation != 0) {
-        current_installation = RevertBack(current_installation, app_key);
+        current_installation =
+            RevertBack(current_installation, app_key, true /* mark_bad */);
         continue;
       } else {
         // The system image at index 0 failed.
diff --git a/starboard/loader_app/slot_management.gyp b/starboard/loader_app/slot_management.gyp
deleted file mode 100644
index 7f562e2..0000000
--- a/starboard/loader_app/slot_management.gyp
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'slot_management',
-      'type': 'static_library',
-      'sources': [
-        'slot_management.cc',
-        'slot_management.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/elf_loader/sabi_string.gyp:sabi_string',
-        '<(DEPTH)/starboard/elf_loader/elf_loader.gyp:elf_loader',
-        '<(DEPTH)/starboard/loader_app/app_key_files.gyp:app_key_files',
-        '<(DEPTH)/starboard/loader_app/drain_file.gyp:drain_file',
-        '<(DEPTH)/starboard/loader_app/installation_manager.gyp:installation_manager',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'slot_management_test',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'slot_management_test.cc',
-        '<(DEPTH)/starboard/common/test_main.cc',
-      ],
-      'dependencies': [
-         ':slot_management',
-         '<(DEPTH)/testing/gmock.gyp:gmock',
-         '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'slot_management_test_deploy',
-      'type': 'none',
-      'dependencies': [
-        'slot_management_test',
-      ],
-      'variables': {
-        'executable_name': 'slot_management_test',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/loader_app/slot_management.h b/starboard/loader_app/slot_management.h
index 319cec9..b5a2237 100644
--- a/starboard/loader_app/slot_management.h
+++ b/starboard/loader_app/slot_management.h
@@ -26,9 +26,14 @@
   virtual ~LibraryLoader() {}
 
   // Load the library with the provided full path to |library_path| and
-  // |content_path|.
+  // |content_path|. If |use_compression| is true the library is assumed
+  // to be compressed. If |use_memory_mapped_file| is true the library
+  // would be loaded as a memory mapped file. The |use_compression| and
+  // |use_memory_mapped_file|  are not compatible and can't be both enabled.
   virtual bool Load(const std::string& library_path,
-                    const std::string& content_path) = 0;
+                    const std::string& content_path,
+                    bool use_compression,
+                    bool use_memory_mapped_file) = 0;
 
   // Resolve a symbol by name.
   virtual void* Resolve(const std::string& symbol) = 0;
@@ -39,10 +44,16 @@
 // The actual loading from the slot is performed by the |library_loader|.
 // An alternative content can be used by specifying non-empty
 // |alternative_content_path| with the full path to the content.
+// If |use_compression| is true the library is assumed
+// to be compressed. If |use_memory_mapped_file| is true the library
+// would be loaded as a memory mapped file. The |use_compression| and
+// |use_memory_mapped_file|  are not compatible and can't be both enabled.
 // Returns a pointer to the |SbEventHandle| symbol in the library.
 void* LoadSlotManagedLibrary(const std::string& app_key,
                              const std::string& alternative_content_path,
-                             LibraryLoader* library_loader);
+                             LibraryLoader* library_loader,
+                             bool use_compression,
+                             bool use_memory_mapped_file);
 
 }  // namespace loader_app
 }  // namespace starboard
diff --git a/starboard/loader_app/slot_management_test.cc b/starboard/loader_app/slot_management_test.cc
index 9f63b1a..1ed55d2 100644
--- a/starboard/loader_app/slot_management_test.cc
+++ b/starboard/loader_app/slot_management_test.cc
@@ -48,25 +48,23 @@
 
 class MockLibraryLoader : public LibraryLoader {
  public:
-  MOCK_METHOD2(Load,
+  MOCK_METHOD4(Load,
                bool(const std::string& library_path,
-                    const std::string& content_path));
+                    const std::string& content_path,
+                    bool use_compression,
+                    bool use_memory_mapped_file));
   MOCK_METHOD1(Resolve, void*(const std::string& symbol));
 };
 
-class SlotManagementTest : public testing::Test {
+class SlotManagementTest : public testing::TestWithParam<bool> {
  protected:
   virtual void SetUp() {
     slot_0_libcobalt_path_ =
-        CreatePath({"content", "app", "cobalt", "lib", "libcobalt.so.lz4"});
+        CreatePath({"content", "app", "cobalt", "lib", "libcobalt"});
     slot_0_content_path_ = CreatePath({"content", "app", "cobalt", "content"});
-
-    slot_1_libcobalt_path_ =
-        CreatePath({"installation_1", "lib", "libcobalt.so.lz4"});
+    slot_1_libcobalt_path_ = CreatePath({"installation_1", "lib", "libcobalt"});
     slot_1_content_path_ = CreatePath({"installation_1", "content"});
-
-    slot_2_libcobalt_path_ =
-        CreatePath({"installation_2", "lib", "libcobalt.so.lz4"});
+    slot_2_libcobalt_path_ = CreatePath({"installation_2", "lib", "libcobalt"});
     slot_2_content_path_ = CreatePath({"installation_2", "content"});
 
     std::vector<char> buf(kSbFileMaxPath);
@@ -74,6 +72,14 @@
                                                 buf.data(), kSbFileMaxPath);
   }
 
+  void AddFileExtension(std::string& path) {
+    if (GetParam()) {
+      path += ".lz4";
+    } else {
+      path += ".so";
+    }
+  }
+
   std::string CreatePath(std::initializer_list<std::string> path_elements) {
     std::string result;
     for (const std::string& path : path_elements) {
@@ -135,10 +141,14 @@
   }
 
   void VerifyLoad(const std::string& lib, const std::string& content) {
+    bool use_compression = GetParam();
     MockLibraryLoader library_loader;
 
+    std::string full_lib_path = lib;
+    AddFileExtension(full_lib_path);
     EXPECT_CALL(library_loader,
-                Load(testing::EndsWith(lib), testing::EndsWith(content)))
+                Load(testing::EndsWith(full_lib_path),
+                     testing::EndsWith(content), use_compression, false))
         .Times(1)
         .WillOnce(testing::Return(true));
     EXPECT_CALL(library_loader, Resolve("GetEvergreenSabiString"))
@@ -153,7 +163,8 @@
         .Times(1)
         .WillOnce(testing::Return(reinterpret_cast<void*>(&SbEventFake)));
     ASSERT_EQ(&SbEventFake,
-              LoadSlotManagedLibrary(kTestAppKey, "", &library_loader));
+              LoadSlotManagedLibrary(kTestAppKey, "", &library_loader,
+                                     use_compression, false));
   }
 
  protected:
@@ -166,7 +177,7 @@
   bool storage_path_implemented_;
 };
 
-TEST_F(SlotManagementTest, SystemSlot) {
+TEST_P(SlotManagementTest, SystemSlot) {
   if (!storage_path_implemented_) {
     return;
   }
@@ -178,7 +189,7 @@
   VerifyBadFile(0, kTestAppKey, false);
 }
 
-TEST_F(SlotManagementTest, AdoptSlot) {
+TEST_P(SlotManagementTest, AdoptSlot) {
   if (!storage_path_implemented_) {
     return;
   }
@@ -196,7 +207,7 @@
   VerifyBadFile(1, kTestAppKey, false);
 }
 
-TEST_F(SlotManagementTest, GoodSlot) {
+TEST_P(SlotManagementTest, GoodSlot) {
   if (!storage_path_implemented_) {
     return;
   }
@@ -213,7 +224,7 @@
   VerifyBadFile(2, kTestAppKey, false);
 }
 
-TEST_F(SlotManagementTest, NotAdoptSlot) {
+TEST_P(SlotManagementTest, NotAdoptSlot) {
   if (!storage_path_implemented_) {
     return;
   }
@@ -230,7 +241,7 @@
   VerifyBadFile(2, kTestAppKey, true);
 }
 
-TEST_F(SlotManagementTest, BadSlot) {
+TEST_P(SlotManagementTest, BadSlot) {
   if (!storage_path_implemented_) {
     return;
   }
@@ -245,7 +256,7 @@
   VerifyGoodFile(1, kTestAppKey, false);
 }
 
-TEST_F(SlotManagementTest, DrainingSlot) {
+TEST_P(SlotManagementTest, DrainingSlot) {
   if (!storage_path_implemented_) {
     return;
   }
@@ -258,10 +269,10 @@
   ImUninitialize();
   VerifyLoad(slot_0_libcobalt_path_, slot_0_content_path_);
   VerifyGoodFile(1, kTestAppKey, false);
-  VerifyBadFile(1, kTestAppKey, true);
+  VerifyBadFile(1, kTestAppKey, false);
 }
 
-TEST_F(SlotManagementTest, AlternativeContent) {
+TEST_P(SlotManagementTest, AlternativeContent) {
   if (!storage_path_implemented_) {
     return;
   }
@@ -274,8 +285,11 @@
 
   MockLibraryLoader library_loader;
 
-  EXPECT_CALL(library_loader, Load(testing::EndsWith(slot_0_libcobalt_path_),
-                                   testing::EndsWith("/foo")))
+  std::string full_lib_path = slot_0_libcobalt_path_;
+  AddFileExtension(full_lib_path);
+  EXPECT_CALL(library_loader,
+              Load(testing::EndsWith(full_lib_path), testing::EndsWith("/foo"),
+                   GetParam(), false))
       .Times(1)
       .WillOnce(testing::Return(true));
   EXPECT_CALL(library_loader, Resolve("GetEvergreenSabiString"))
@@ -291,10 +305,11 @@
       .Times(1)
       .WillOnce(testing::Return(reinterpret_cast<void*>(&SbEventFake)));
   ASSERT_EQ(&SbEventFake,
-            LoadSlotManagedLibrary(kTestAppKey, "/foo", &library_loader));
+            LoadSlotManagedLibrary(kTestAppKey, "/foo", &library_loader,
+                                   GetParam(), false));
 }
 
-TEST_F(SlotManagementTest, BadSabi) {
+TEST_P(SlotManagementTest, BadSabi) {
   if (!storage_path_implemented_) {
     return;
   }
@@ -314,8 +329,11 @@
 
   MockLibraryLoader library_loader;
 
-  EXPECT_CALL(library_loader, Load(testing::EndsWith(slot_2_libcobalt_path_),
-                                   testing::EndsWith(slot_2_content_path_)))
+  std::string slot2_libcobalt_full = slot_2_libcobalt_path_;
+  AddFileExtension(slot2_libcobalt_full);
+  EXPECT_CALL(library_loader,
+              Load(testing::EndsWith(slot2_libcobalt_full),
+                   testing::EndsWith(slot_2_content_path_), GetParam(), false))
       .Times(1)
       .WillOnce(testing::Return(true));
 
@@ -326,8 +344,11 @@
       .WillOnce(
           testing::Return(reinterpret_cast<void*>(&GetEvergreenSabiString)));
 
-  EXPECT_CALL(library_loader, Load(testing::EndsWith(slot_1_libcobalt_path_),
-                                   testing::EndsWith(slot_1_content_path_)))
+  std::string slot1_libcobalt_full = slot_1_libcobalt_path_;
+  AddFileExtension(slot1_libcobalt_full);
+  EXPECT_CALL(library_loader,
+              Load(testing::EndsWith(slot1_libcobalt_full),
+                   testing::EndsWith(slot_1_content_path_), GetParam(), false))
       .Times(1)
       .WillOnce(testing::Return(true));
 
@@ -341,9 +362,14 @@
       .WillOnce(testing::Return(reinterpret_cast<void*>(&SbEventFake)));
 
   ASSERT_EQ(&SbEventFake,
-            LoadSlotManagedLibrary(kTestAppKey, "", &library_loader));
+            LoadSlotManagedLibrary(kTestAppKey, "", &library_loader, GetParam(),
+                                   false));
 }
 
+INSTANTIATE_TEST_CASE_P(SlotManagementTests,
+                        SlotManagementTest,
+                        ::testing::Bool());
+
 }  // namespace
 }  // namespace loader_app
 }  // namespace starboard
diff --git a/starboard/media.h b/starboard/media.h
index aff144f..1655696 100644
--- a/starboard/media.h
+++ b/starboard/media.h
@@ -376,7 +376,6 @@
   // The video codec of this sample.
   SbMediaVideoCodec codec;
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   // The mime of the video stream when |codec| isn't kSbMediaVideoCodecNone.  It
   // may point to an empty string if the mime is not available, and it can only
   // be set to NULL when |codec| is kSbMediaVideoCodecNone.
@@ -393,7 +392,6 @@
   // When the maximums are unknown, this will be set to an empty string.  It can
   // only be set to NULL when |codec| is kSbMediaVideoCodecNone.
   const char* max_video_capabilities;
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
   // Indicates whether the associated sample is a key frame (I-frame). Video key
   // frames must always start with SPS and PPS NAL units.
@@ -454,12 +452,10 @@
   // The audio codec of this sample.
   SbMediaAudioCodec codec;
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   // The mime of the audio stream when |codec| isn't kSbMediaAudioCodecNone.  It
   // may point to an empty string if the mime is not available, and it can only
   // be set to NULL when |codec| is kSbMediaAudioCodecNone.
   const char* mime;
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
   // The waveform-audio format type code.
   uint16_t format_tag;
@@ -576,28 +572,6 @@
     int output_index,
     SbMediaAudioConfiguration* out_configuration);
 
-#if SB_API_VERSION < 12
-// Indicates whether output copy protection is currently enabled on all capable
-// outputs. If |true|, then non-protection-capable outputs are expected to be
-// blanked.
-//
-// presubmit: allow sb_export mismatch
-SB_EXPORT bool SbMediaIsOutputProtected();
-
-// Enables or disables output copy protection on all capable outputs. If
-// enabled, then non-protection-capable outputs are expected to be blanked.
-//
-// The return value indicates whether the operation was successful, and the
-// function returns a success even if the call is redundant in that it doesn't
-// change the current value.
-//
-// |enabled|: Indicates whether output protection is enabled (|true|) or
-//   disabled.
-//
-// presubmit: allow sb_export mismatch
-SB_EXPORT bool SbMediaSetOutputProtection(bool enabled);
-#endif  // SB_API_VERSION < 12
-
 // Value used when a video's resolution is not known.
 #define kSbMediaVideoResolutionDimensionInvalid 0
 // Value used when a video's bits per pixel is not known.
diff --git a/starboard/memory.h b/starboard/memory.h
index 1c537b9..d39fd35 100644
--- a/starboard/memory.h
+++ b/starboard/memory.h
@@ -39,14 +39,14 @@
 #ifndef STARBOARD_MEMORY_H_
 #define STARBOARD_MEMORY_H_
 
+#include <string.h>
+
 #include "starboard/configuration.h"
 #include "starboard/configuration_constants.h"
 #include "starboard/export.h"
 #include "starboard/system.h"
 #include "starboard/types.h"
 
-#include <string.h>
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -166,8 +166,7 @@
 // provided by Starboard ports.
 //
 // DO NOT CALL. Call SbMemoryAllocate(...) instead.
-SB_DEPRECATED_EXTERNAL(
-    SB_EXPORT void* SbMemoryAllocateUnchecked(size_t size));
+SB_DEPRECATED_EXTERNAL(SB_EXPORT void* SbMemoryAllocateUnchecked(size_t size));
 
 // This is the implementation of SbMemoryReallocate that must be
 // provided by Starboard ports.
@@ -188,17 +187,14 @@
 // Starboard ports.
 //
 // DO NOT CALL. Call SbMemoryDeallocate(...) instead.
-SB_DEPRECATED_EXTERNAL(
-    SB_EXPORT void SbMemoryFree(void* memory));
+SB_DEPRECATED_EXTERNAL(SB_EXPORT void SbMemoryFree(void* memory));
 
 // This is the implementation of SbMemoryFreeAligned that must be provided by
 // Starboard ports.
 //
 // DO NOT CALL. Call SbMemoryDeallocateAligned(...) instead.
-SB_DEPRECATED_EXTERNAL(
-    SB_EXPORT void SbMemoryFreeAligned(void* memory));
+SB_DEPRECATED_EXTERNAL(SB_EXPORT void SbMemoryFreeAligned(void* memory));
 
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
 // Allocates |size_bytes| worth of physical memory pages and maps them into
 // an available virtual region. This function returns |SB_MEMORY_MAP_FAILED|
 // on failure. |NULL| is a valid return value.
@@ -238,7 +234,6 @@
 // memory that has been written to and might be executed in the future.
 SB_EXPORT void SbMemoryFlush(void* virtual_address, int64_t size_bytes);
 #endif
-#endif  // SB_API_VERSION >= 12 || SB_HAS(MMAP)
 
 // Gets the stack bounds for the current thread.
 //
@@ -347,15 +342,14 @@
 // allocation failure.
 //
 // DO NOT CALL. Call SbMemoryAllocate(...) instead.
-SB_DEPRECATED_EXTERNAL(
-    SB_EXPORT void* SbMemoryAllocateChecked(size_t size));
+SB_DEPRECATED_EXTERNAL(SB_EXPORT void* SbMemoryAllocateChecked(size_t size));
 
 // Same as SbMemoryReallocateUnchecked, but will abort() in the case of an
 // allocation failure.
 //
 // DO NOT CALL. Call SbMemoryReallocate(...) instead.
-SB_DEPRECATED_EXTERNAL(
-    SB_EXPORT void* SbMemoryReallocateChecked(void* memory, size_t size));
+SB_DEPRECATED_EXTERNAL(SB_EXPORT void* SbMemoryReallocateChecked(void* memory,
+                                                                 size_t size));
 
 // Same as SbMemoryAllocateAlignedUnchecked, but will abort() in the case of an
 // allocation failure.
diff --git a/starboard/microphone.h b/starboard/microphone.h
index d382c2a..1649fda 100644
--- a/starboard/microphone.h
+++ b/starboard/microphone.h
@@ -43,8 +43,6 @@
 #include "starboard/export.h"
 #include "starboard/types.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
-
 #define kSbMicrophoneLabelSize 256
 
 #ifdef __cplusplus
@@ -201,7 +199,4 @@
 }  // extern "C"
 #endif
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
 #endif  // STARBOARD_MICROPHONE_H_
diff --git a/starboard/mutex.h b/starboard/mutex.h
index 5f26df9..0abc610 100644
--- a/starboard/mutex.h
+++ b/starboard/mutex.h
@@ -23,14 +23,11 @@
 #include "starboard/configuration.h"
 #include "starboard/export.h"
 #include "starboard/thread.h"
-#include "starboard/thread_types.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#if SB_API_VERSION >= 12
-
 // Max size of the SbMutex type.
 #define SB_MUTEX_MAX_SIZE 80
 
@@ -54,8 +51,6 @@
   { 0 }
 #endif
 
-#endif  // SB_API_VERSION >= 12
-
 // Enumeration of possible results from acquiring a mutex.
 typedef enum SbMutexResult {
   // The mutex was acquired successfully.
@@ -82,17 +77,10 @@
 // |out_mutex|: The handle to the newly created mutex.
 SB_EXPORT bool SbMutexCreate(SbMutex* out_mutex);
 
-#if SB_API_VERSION >= 12
 // Destroys a mutex. The return value indicates whether the destruction was
 // successful. Destroying a locked mutex results in undefined behavior.
 //
 // |mutex|: The mutex to be invalidated.
-#else   // SB_API_VERSION >= 12
-// Destroys a mutex. The return value indicates whether the destruction was
-// successful.
-//
-// |mutex|: The mutex to be invalidated.
-#endif  // SB_API_VERSION >= 12
 SB_EXPORT bool SbMutexDestroy(SbMutex* mutex);
 
 // Acquires |mutex|, blocking indefinitely. The return value identifies
@@ -102,19 +90,11 @@
 // |mutex|: The mutex to be acquired.
 SB_EXPORT SbMutexResult SbMutexAcquire(SbMutex* mutex);
 
-#if SB_API_VERSION >= 12
 // Acquires |mutex|, without blocking. The return value identifies
 // the acquisition result. SbMutexes are not reentrant, so a recursive
 // acquisition has undefined behavior.
 //
 // |mutex|: The mutex to be acquired.
-#else   // SB_API_VERSION >= 12
-// Acquires |mutex|, without blocking. The return value identifies
-// the acquisition result. SbMutexes are not reentrant, so a recursive
-// acquisition always fails.
-//
-// |mutex|: The mutex to be acquired.
-#endif  // SB_API_VERSION >= 12
 SB_EXPORT SbMutexResult SbMutexAcquireTry(SbMutex* mutex);
 
 // Releases |mutex| held by the current thread. The return value indicates
diff --git a/starboard/nplb/BUILD.gn b/starboard/nplb/BUILD.gn
index a8c6697..c96b0d5 100644
--- a/starboard/nplb/BUILD.gn
+++ b/starboard/nplb/BUILD.gn
@@ -56,11 +56,6 @@
     "condition_variable_wait_timed_test.cc",
     "configuration_test.cc",
     "cpu_features_get_test.cc",
-    "cryptography_create_transformer_test.cc",
-    "cryptography_helpers.cc",
-    "cryptography_helpers.h",
-    "cryptography_transform_gcm_test.cc",
-    "cryptography_transform_test.cc",
     "directory_can_open_test.cc",
     "directory_close_test.cc",
     "directory_create_test.cc",
@@ -109,7 +104,9 @@
 
     # TODO: Separate functions tested by media buffer test into multiple
     # files.
+    "drm_create_system_test.cc",
     "media_buffer_test.cc",
+    "media_can_play_mime_and_key_system_test.cc",
     "media_configuration_test.cc",
     "memory_align_to_page_size_test.cc",
     "memory_allocate_aligned_test.cc",
@@ -144,7 +141,6 @@
     "player_creation_param_helpers.cc",
     "player_creation_param_helpers.h",
     "player_get_preferred_output_mode_test.cc",
-    "player_output_mode_supported_test.cc",
     "player_test_util.cc",
     "player_test_util.h",
     "player_write_sample_test.cc",
@@ -263,26 +259,34 @@
     "window_get_size_test.cc",
   ]
 
-  if (has_drm_support) {
-    sources += [
-      "drm_create_system_test.cc",
-      "media_can_play_mime_and_key_system_test.cc",
-    ]
-  }
+  configs += [
+    "//build/config/compiler:exceptions",
+    "//starboard/build/config:starboard_implementation",
+  ]
+  configs -= [ "//build/config/compiler:no_exceptions" ]
 
-  deps = cobalt_platform_dependencies
+  deps = [
+    "//starboard",
+    "//starboard/common",
+    "//starboard/nplb/compiler_compliance:cpp14_supported",
+    "//starboard/shared/starboard/media:media_util",
+    "//starboard/shared/starboard/player:video_dmp",
+    "//testing/gmock",
+  ]
+
+  deps += cobalt_platform_dependencies
 
   if (is_internal_build) {
     deps += [ "//starboard/private/nplb:nplb_private" ]
   }
 
-  public_deps = [
-    "//starboard",
-    "//starboard/common",
-    "//starboard/shared/starboard/media:media_util",
-    "//starboard/shared/starboard/player:video_dmp",
-    "//testing/gmock",
-  ]
+  if (gl_type != "none") {
+    deps += [ "//starboard/egl_and_gles" ]
+  }
+
+  if (sb_enable_cpp17_audit) {
+    deps += [ "//starboard/nplb/compiler_compliance:cpp17_supported" ]
+  }
 
   data_deps = [
     "//starboard/nplb/testdata/file_tests:nplb_file_tests_data",
@@ -294,14 +298,4 @@
     "//starboard/shared/starboard/player:player_download_test_data",
     "//third_party/icu:icudata",
   ]
-
-  if (gl_type != "none") {
-    public_deps += [ "//starboard/egl_and_gles" ]
-  }
-
-  configs += [
-    "//build/config/compiler:exceptions",
-    "//starboard/build/config:starboard_implementation",
-  ]
-  configs -= [ "//build/config/compiler:no_exceptions" ]
 }
diff --git a/starboard/nplb/accessibility_test.cc b/starboard/nplb/accessibility_test.cc
index 01d6a26..67749e7 100644
--- a/starboard/nplb/accessibility_test.cc
+++ b/starboard/nplb/accessibility_test.cc
@@ -48,7 +48,6 @@
   EXPECT_FALSE(SbAccessibilityGetDisplaySettings(NULL));
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 TEST(SbAccessibilityTest, CallGetCaptionSettingsWithInvalidArgument) {
   // |settings| should be zero-initialized.
   const int kInvalidValue = 0xFE;
@@ -89,36 +88,29 @@
               kSbAccessibilityCaptionCharacterEdgeStyleDropShadow);
   }
 
-  if (settings.font_color_state !=
-      kSbAccessibilityCaptionStateUnsupported) {
+  if (settings.font_color_state != kSbAccessibilityCaptionStateUnsupported) {
     EXPECT_GE(settings.font_color, kSbAccessibilityCaptionColorBlue);
     EXPECT_LE(settings.font_color, kSbAccessibilityCaptionColorYellow);
   }
 
-  if (settings.font_family_state !=
-      kSbAccessibilityCaptionStateUnsupported) {
-    EXPECT_GE(settings.font_family,
-              kSbAccessibilityCaptionFontFamilyCasual);
+  if (settings.font_family_state != kSbAccessibilityCaptionStateUnsupported) {
+    EXPECT_GE(settings.font_family, kSbAccessibilityCaptionFontFamilyCasual);
     EXPECT_LE(settings.font_family,
               kSbAccessibilityCaptionFontFamilySmallCapitals);
   }
 
-  if (settings.font_opacity_state !=
-      kSbAccessibilityCaptionStateUnsupported) {
-    EXPECT_GE(settings.font_opacity,
-              kSbAccessibilityCaptionOpacityPercentage0);
+  if (settings.font_opacity_state != kSbAccessibilityCaptionStateUnsupported) {
+    EXPECT_GE(settings.font_opacity, kSbAccessibilityCaptionOpacityPercentage0);
     EXPECT_LE(settings.font_opacity,
               kSbAccessibilityCaptionOpacityPercentage100);
   }
 
-  if (settings.font_size_state !=
-      kSbAccessibilityCaptionStateUnsupported) {
+  if (settings.font_size_state != kSbAccessibilityCaptionStateUnsupported) {
     EXPECT_GE(settings.font_size, kSbAccessibilityCaptionFontSizePercentage25);
     EXPECT_LE(settings.font_size, kSbAccessibilityCaptionFontSizePercentage300);
   }
 
-  if (settings.window_color_state !=
-      kSbAccessibilityCaptionStateUnsupported) {
+  if (settings.window_color_state != kSbAccessibilityCaptionStateUnsupported) {
     EXPECT_GE(settings.window_color, kSbAccessibilityCaptionColorBlue);
     EXPECT_LE(settings.window_color, kSbAccessibilityCaptionColorYellow);
   }
@@ -156,7 +148,6 @@
     EXPECT_EQ(settings.is_enabled, settings3.is_enabled);
   }
 }
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 
 }  // namespace
 }  // namespace nplb
diff --git a/starboard/nplb/audio_sink_create_test.cc b/starboard/nplb/audio_sink_create_test.cc
index 9f61744..eeec5ef 100644
--- a/starboard/nplb/audio_sink_create_test.cc
+++ b/starboard/nplb/audio_sink_create_test.cc
@@ -35,14 +35,7 @@
   *is_eos_reached = false;
 }
 
-#if SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 void ConsumeFramesFuncStub(int frames_consumed, void* context) {}
-#else   // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-void ConsumeFramesFuncStub(int frames_consumed,
-                           SbTime frames_consumed_at,
-                           void* context) {}
-#endif  // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-
 }  // namespace
 
 TEST(SbAudioSinkCreateTest, SunnyDay) {
diff --git a/starboard/nplb/audio_sink_helpers.cc b/starboard/nplb/audio_sink_helpers.cc
index 5401913..712742d 100644
--- a/starboard/nplb/audio_sink_helpers.cc
+++ b/starboard/nplb/audio_sink_helpers.cc
@@ -207,21 +207,11 @@
   condition_variable_.Signal();
 }
 
-#if SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 void AudioSinkTestEnvironment::OnConsumeFrames(int frames_consumed) {
   ScopedLock lock(mutex_);
   frames_consumed_ += frames_consumed;
   condition_variable_.Signal();
 }
-#else   // SB_API_VERSION >= 12 ||!SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-void AudioSinkTestEnvironment::OnConsumeFrames(int frames_consumed,
-                                               SbTime frames_consumed_at) {
-  SB_DCHECK(frames_consumed_at <= SbTimeGetMonotonicNow());
-  ScopedLock lock(mutex_);
-  frames_consumed_ += frames_consumed;
-  condition_variable_.Signal();
-}
-#endif  // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 
 // static
 void AudioSinkTestEnvironment::UpdateSourceStatusFunc(int* frames_in_buffer,
@@ -235,7 +225,6 @@
                                     is_playing, is_eos_reached);
 }
 
-#if SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 // static
 void AudioSinkTestEnvironment::ConsumeFramesFunc(int frames_consumed,
                                                  void* context) {
@@ -243,17 +232,6 @@
       reinterpret_cast<AudioSinkTestEnvironment*>(context);
   environment->OnConsumeFrames(frames_consumed);
 }
-#else   // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-// static
-void AudioSinkTestEnvironment::ConsumeFramesFunc(int frames_consumed,
-                                                 SbTime frames_consumed_at,
-                                                 void* context) {
-  AudioSinkTestEnvironment* environment =
-      reinterpret_cast<AudioSinkTestEnvironment*>(context);
-  frames_consumed_at = SbTimeGetMonotonicNow();
-  environment->OnConsumeFrames(frames_consumed, frames_consumed_at);
-}
-#endif  // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/audio_sink_helpers.h b/starboard/nplb/audio_sink_helpers.h
index 644d21a..24c5da0 100644
--- a/starboard/nplb/audio_sink_helpers.h
+++ b/starboard/nplb/audio_sink_helpers.h
@@ -95,25 +95,14 @@
                             int* offset_in_frames,
                             bool* is_playing,
                             bool* is_eos_reached);
-#if SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
   void OnConsumeFrames(int frames_consumed);
-#else   // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-  void OnConsumeFrames(int frames_consumed, SbTime frames_consumed_at);
-#endif  // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-
   static void UpdateSourceStatusFunc(int* frames_in_buffer,
                                      int* offset_in_frames,
                                      bool* is_playing,
                                      bool* is_eos_reached,
                                      void* context);
 
-#if SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
   static void ConsumeFramesFunc(int frames_consumed, void* context);
-#else   // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-  static void ConsumeFramesFunc(int frames_consumed,
-                                SbTime frames_consumed_at,
-                                void* context);
-#endif  // SB_API_VERSION >= 12 || !SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
 
   SbAudioSink sink_;
 
diff --git a/starboard/nplb/compiler_compliance/BUILD.gn b/starboard/nplb/compiler_compliance/BUILD.gn
new file mode 100644
index 0000000..58f1dd1
--- /dev/null
+++ b/starboard/nplb/compiler_compliance/BUILD.gn
@@ -0,0 +1,42 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+static_library("cpp14_supported") {
+  sources = [
+    "cpp14_constexpr.cc",
+    "cpp14_initialization.cc",
+  ]
+  cflags_cc = [ "-std=c++14" ]
+  deps = [ "//starboard" ]
+}
+
+if (sb_enable_cpp17_audit) {
+  static_library("cpp17_supported") {
+    sources = [ "cpp17_support.cc" ]
+    deps = [
+      ":cpp17_supported_config_shim",
+      "//starboard",
+    ]
+  }
+
+  # We do this to ensure the -std=c++17 flag is added after any other -std flag
+  # so it overrides any other one.
+  group("cpp17_supported_config_shim") {
+    public_configs = [ ":cpp17_supported_config" ]
+  }
+
+  config("cpp17_supported_config") {
+    cflags_cc = [ "-std=c++17" ]
+  }
+}
diff --git a/starboard/nplb/compiler_compliance/compiler_compliance.gyp b/starboard/nplb/compiler_compliance/compiler_compliance.gyp
deleted file mode 100644
index 88cea25..0000000
--- a/starboard/nplb/compiler_compliance/compiler_compliance.gyp
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'cpp14_supported',
-      'type': 'static_library',
-      'cflags_cc': [
-        '-std=c++14',
-      ],
-      'sources': [
-        'cpp14_constexpr.cc',
-        'cpp14_initialization.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'cpp17_supported',
-      'type': 'static_library',
-      'cflags_cc': [
-        '-std=c++17',
-      ],
-      'sources': [
-        'cpp17_support.cc',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
-}
diff --git a/starboard/nplb/cpu_features_get_test.cc b/starboard/nplb/cpu_features_get_test.cc
index 8b387e3..45bf211 100644
--- a/starboard/nplb/cpu_features_get_test.cc
+++ b/starboard/nplb/cpu_features_get_test.cc
@@ -68,9 +68,7 @@
   EXPECT_EQ(false, features.x86.has_sse2);
   EXPECT_EQ(false, features.x86.has_tsc);
   EXPECT_EQ(false, features.x86.has_sse3);
-#if SB_API_VERSION >= 12
   EXPECT_EQ(false, features.x86.has_pclmulqdq);
-#endif  // SB_API_VERSION >= 12
   EXPECT_EQ(false, features.x86.has_ssse3);
   EXPECT_EQ(false, features.x86.has_sse41);
   EXPECT_EQ(false, features.x86.has_sse42);
diff --git a/starboard/nplb/cryptography_create_transformer_test.cc b/starboard/nplb/cryptography_create_transformer_test.cc
deleted file mode 100644
index 1bf579f..0000000
--- a/starboard/nplb/cryptography_create_transformer_test.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace starboard {
-namespace nplb {
-namespace {
-
-const int kBlockSizeBits = 128;
-const int kBlockSizeBytes = kBlockSizeBits / 8;
-
-TEST(SbCryptographyCreateTransformer, SunnyDay) {
-  char initialization_vector[kBlockSizeBytes] = {0};
-  char key[kBlockSizeBytes] = {0};
-
-  // Try to create a transformer for the most likely algorithm to be supported:
-  // AES-128-CBC
-  SbCryptographyTransformer transformer = SbCryptographyCreateTransformer(
-      kSbCryptographyAlgorithmAes, kBlockSizeBits,
-      kSbCryptographyDirectionDecode, kSbCryptographyBlockCipherModeCbc,
-      initialization_vector, kBlockSizeBytes, key, kBlockSizeBytes);
-
-  if (!SbCryptographyIsTransformerValid(transformer)) {
-    // Test over if there's no implementation.
-    return;
-  }
-
-  // TODO: Validate implementation.
-  SbCryptographyDestroyTransformer(transformer);
-}
-
-}  // namespace
-}  // namespace nplb
-}  // namespace starboard
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/nplb/cryptography_helpers.cc b/starboard/nplb/cryptography_helpers.cc
deleted file mode 100644
index d8c8a38..0000000
--- a/starboard/nplb/cryptography_helpers.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    openssl-core@openssl.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED 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 OpenSSL PROJECT OR
- * ITS 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.
- * ==================================================================== */
-
-// Modifications Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/nplb/cryptography_helpers.h"
-
-#include <string>
-
-#include "starboard/common/log.h"
-#include "starboard/common/scoped_ptr.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace starboard {
-namespace nplb {
-
-namespace {
-int FromHex(uint8_t* out, char in) {
-  if (in >= '0' && in <= '9') {
-    *out = in - '0';
-    return 1;
-  }
-  if (in >= 'a' && in <= 'f') {
-    *out = in - 'a' + 10;
-    return 1;
-  }
-  if (in >= 'A' && in <= 'F') {
-    *out = in - 'A' + 10;
-    return 1;
-  }
-
-  return 0;
-}
-}  // namespace
-
-void DecodeHex(scoped_array<uint8_t>* out,
-               int* out_len,
-               const char* in,
-               int test_num,
-               const char* description) {
-  if (in == NULL) {
-    out->reset();
-    *out_len = 0;
-    return;
-  }
-
-  size_t len = strlen(in);
-  if (len & 1) {
-    ADD_FAILURE() << description << ": Odd length.";
-    return;
-  }
-
-  scoped_array<uint8_t> buf(new uint8_t[len / 2]);
-  if (!buf) {
-    ADD_FAILURE() << description << ": Memory fail.";
-    return;
-  }
-
-  for (size_t i = 0; i < len; i += 2) {
-    uint8_t v, v2;
-    bool result = FromHex(&v, in[i]) && FromHex(&v2, in[i + 1]);
-    if (!result) {
-      ADD_FAILURE() << description << ": Invalid character at " << i << ".";
-      continue;
-    }
-
-    buf[i / 2] = (v << 4) | v2;
-  }
-
-  *out = buf.Pass();
-  *out_len = static_cast<int>(len / 2);
-}
-
-std::string HexDump(const void* in, int len) {
-  const uint8_t* data = reinterpret_cast<const uint8_t*>(in);
-
-  std::string result;
-  for (size_t i = 0; i < len; i++) {
-    char hex[3] = {0};
-    SbStringFormatF(hex, 3, "%02x", data[i]);
-    result += hex;
-  }
-
-  return result;
-}
-
-}  // namespace nplb
-}  // namespace starboard
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/nplb/cryptography_helpers.h b/starboard/nplb/cryptography_helpers.h
deleted file mode 100644
index 49b93c7..0000000
--- a/starboard/nplb/cryptography_helpers.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    openssl-core@openssl.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED 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 OpenSSL PROJECT OR
- * ITS 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.
- * ==================================================================== */
-
-// Modifications Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_NPLB_CRYPTOGRAPHY_HELPERS_H_
-#define STARBOARD_NPLB_CRYPTOGRAPHY_HELPERS_H_
-
-#include <string>
-
-#include "starboard/common/log.h"
-#include "starboard/common/scoped_ptr.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace starboard {
-namespace nplb {
-
-void DecodeHex(scoped_array<uint8_t>* out,
-               int* out_len,
-               const char* in,
-               int test_num,
-               const char* description);
-std::string HexDump(const void* in, int len);
-
-}  // namespace nplb
-}  // namespace starboard
-
-#endif  // STARBOARD_NPLB_CRYPTOGRAPHY_HELPERS_H_
diff --git a/starboard/nplb/cryptography_transform_gcm_test.cc b/starboard/nplb/cryptography_transform_gcm_test.cc
deleted file mode 100644
index 6858eca..0000000
--- a/starboard/nplb/cryptography_transform_gcm_test.cc
+++ /dev/null
@@ -1,451 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    openssl-core@openssl.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED 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 OpenSSL PROJECT OR
- * ITS 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.
- * ==================================================================== */
-
-// Modifications Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This test is adapted from BoringSSL's crypto/fipsmodule/modes/gcm_test.cc
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-#include "starboard/common/log.h"
-#include "starboard/common/scoped_ptr.h"
-#include "starboard/nplb/cryptography_helpers.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::NotNull;
-
-namespace starboard {
-namespace nplb {
-namespace {
-
-const int kBlockSizeBits = 128;
-const int kBlockSizeBytes = kBlockSizeBits / 8;
-
-struct test_case {
-  const char *key;
-  const char *plaintext;
-  const char *additional_data;
-  const char *nonce;
-  const char *ciphertext;
-  const char *tag;
-};
-
-const struct test_case test_cases[] = {
-  {
-    "00000000000000000000000000000000",
-    NULL,
-    NULL,
-    "000000000000000000000000",
-    NULL,
-    "58e2fccefa7e3061367f1d57a4e7455a",
-  },
-  {
-    "00000000000000000000000000000000",
-    "00000000000000000000000000000000",
-    NULL,
-    "000000000000000000000000",
-    "0388dace60b6a392f328c2b971b2fe78",
-    "ab6e47d42cec13bdf53a67b21257bddf",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255",
-    NULL,
-    "cafebabefacedbaddecaf888",
-    "42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b254"
-    "66931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985",
-    "4d5c2af327cd64a62cf35abd2ba6fab4",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "cafebabefacedbaddecaf888",
-    "42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b254"
-    "66931c7d8f6a5aac84aa051ba30b396a0aac973d58e091",
-    "5bc94fbc3221a5db94fae95ae7121a47",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "cafebabefacedbad",
-    "61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e4"
-    "9f24b22b097544d4896b424989b5e1ebac0f07c23f4598",
-    "3612d2e79e3b0785561be14aaca2fccb",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156"
-    "809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b",
-    "8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fb"
-    "a43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5",
-    "619cc5aefffe0bfa462af43c1699d050",
-  },
-  {
-    "000000000000000000000000000000000000000000000000",
-    NULL,
-    NULL,
-    "000000000000000000000000",
-    NULL,
-    "cd33b28ac773f74ba00ed1f312572435",
-  },
-  {
-    "000000000000000000000000000000000000000000000000",
-    "00000000000000000000000000000000",
-    NULL,
-    "000000000000000000000000",
-    "98e7247c07f0fe411c267e4384b0f600",
-    "2ff58d80033927ab8ef4d4587514f0fb",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308feffe9928665731c",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255",
-    NULL,
-    "cafebabefacedbaddecaf888",
-    "3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c1"
-    "44c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256",
-    "9924a7c8587336bfb118024db8674a14",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308feffe9928665731c",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "cafebabefacedbaddecaf888",
-    "3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c1"
-    "44c525ac619d18c84a3f4718e2448b2fe324d9ccda2710",
-    "2519498e80f1478f37ba55bd6d27618c",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308feffe9928665731c",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "cafebabefacedbad",
-    "0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a"
-    "471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7",
-    "65dcc57fcf623a24094fcca40d3533f8",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308feffe9928665731c",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "cafebabefacedbad",
-    "0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a"
-    "471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7",
-    "65dcc57fcf623a24094fcca40d3533f8",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308feffe9928665731c",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156"
-    "809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b",
-    "d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af"
-    "34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b",
-    "dcf566ff291c25bbb8568fc3d376a6d9",
-  },
-  {
-    "0000000000000000000000000000000000000000000000000000000000000000",
-    NULL,
-    NULL,
-    "000000000000000000000000",
-    NULL,
-    "530f8afbc74536b9a963b4f1c4cb738b",
-  },
-  {
-    "0000000000000000000000000000000000000000000000000000000000000000",
-    "00000000000000000000000000000000",
-    NULL,
-    "000000000000000000000000",
-    "cea7403d4d606b6e074ec5d3baf39d18",
-    "d0d1c8a799996bf0265b98b5d48ab919",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255",
-    NULL,
-    "cafebabefacedbaddecaf888",
-    "522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e4859"
-    "0dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad",
-    "b094dac5d93471bdec1a502270e3cc6c",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "cafebabefacedbaddecaf888",
-    "522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e4859"
-    "0dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662",
-    "76fc6ece0f4e1768cddf8853bb2d551b",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "cafebabefacedbad",
-    "c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d339"
-    "34a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f",
-    "3a337dbf46a792c45e454913fe2ea8f2",
-  },
-  {
-    "feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308",
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b39",
-    "feedfacedeadbeeffeedfacedeadbeefabaddad2",
-    "9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156"
-    "809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b",
-    "5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780"
-    "f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f",
-    "a44a8266ee1c8eb0c8b5d4cf5ae9f19a",
-  },
-  {
-    "00000000000000000000000000000000",
-    NULL,
-    "d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c9595"
-    "6809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255522dc1f099567d07f47f"
-    "37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b10568288"
-    "38c5f61e6393ba7a0abcc9f662898015ad",
-    "000000000000000000000000",
-    NULL,
-    "5fea793a2d6f974d37e68e0cb8ff9492",
-  },
-  {
-    "00000000000000000000000000000000",
-    "00000000000000000000000000000000000000000000000000000000000000000000000000"
-    "00000000000000000000000000000000000000000000000000000000000000000000000000"
-    "00000000000000000000000000000000000000000000000000000000000000000000000000"
-    "00000000000000000000000000000000000000000000000000000000000000000000000000"
-    "00000000000000000000000000000000000000000000000000000000000000000000000000"
-    "00000000000000000000000000000000000000000000000000000000000000000000000000"
-    "00000000000000000000000000000000000000000000000000000000000000000000000000"
-    "0000000000000000000000000000000000000000000000000000000000",
-    NULL,
-    /* This nonce results in 0xfff in counter LSB. */
-    "ffffffff000000000000000000000000000000000000000000000000000000000000000000"
-    "000000000000000000000000000000000000000000000000000000",
-    "56b3373ca9ef6e4a2b64fe1e9a17b61425f10d47a75a5fce13efc6bc784af24f4141bdd48c"
-    "f7c770887afd573cca5418a9aeffcd7c5ceddfc6a78397b9a85b499da558257267caab2ad0"
-    "b23ca476a53cb17fb41c4b8b475cb4f3f7165094c229c9e8c4dc0a2a5ff1903e5015112213"
-    "76a1cdb8364c5061a20cae74bc4acd76ceb0abc9fd3217ef9f8c90be402ddf6d8697f4f880"
-    "dff15bfb7a6b28241ec8fe183c2d59e3f9dfff653c7126f0acb9e64211f42bae12af462b10"
-    "70bef1ab5e3606872ca10dee15b3249b1a1b958f23134c4bccb7d03200bce420a2f8eb66dc"
-    "f3644d1423c1b5699003c13ecef4bf38a3b60eedc34033bac1902783dc6d89e2e774188a43"
-    "9c7ebcc0672dbda4ddcfb2794613b0be41315ef778708a70ee7d75165c",
-    "8b307f6b33286d0ab026a9ed3fe1e85f",
-  },
-};
-
-class Gcm
-    : public ::testing::TestWithParam<int> {
- public:
-  int GetTestCase() { return GetParam(); }
-};
-
-TEST_P(Gcm, TestCase) {
-  int test_num = GetTestCase();
-  const struct test_case *test = &test_cases[test_num];
-
-  int key_len;
-  scoped_array<uint8_t> key;
-  int plaintext_len;
-  scoped_array<uint8_t> plaintext;
-  int additional_data_len;
-  scoped_array<uint8_t> additional_data;
-  int nonce_len;
-  scoped_array<uint8_t> nonce;
-  int ciphertext_len;
-  scoped_array<uint8_t> ciphertext;
-  int tag_len;
-  scoped_array<uint8_t> tag;
-  scoped_array<uint8_t> out;
-
-  DecodeHex(&key, &key_len, test->key, test_num, "key");
-  DecodeHex(&plaintext, &plaintext_len, test->plaintext, test_num,
-             "plaintext");
-  DecodeHex(&additional_data, &additional_data_len,
-             test->additional_data, test_num, "additional_data");
-  DecodeHex(&nonce, &nonce_len, test->nonce, test_num, "nonce");
-  DecodeHex(&ciphertext, &ciphertext_len, test->ciphertext, test_num,
-             "ciphertext");
-  DecodeHex(&tag, &tag_len, test->tag, test_num, "tag");
-
-  if (plaintext_len != ciphertext_len) {
-    FAIL() << "Plaintext and ciphertext have differing lengths.";
-  }
-
-  if (key_len != 16 && key_len != 24 && key_len != 32) {
-    FAIL() << "Bad key length.";
-  }
-
-  if (tag_len != 16) {
-    FAIL() << "Bad tag length.";
-  }
-
-  out.reset(new uint8_t[plaintext_len]);
-  if (plaintext_len != 0 && out == NULL) {
-    FAIL() << "Out of memory.";
-  }
-
-  // Test encryption.
-
-  // Try to create a transformer for GCM.
-  SbCryptographyTransformer encrypter = SbCryptographyCreateTransformer(
-      kSbCryptographyAlgorithmAes, kBlockSizeBits,
-      kSbCryptographyDirectionEncode, kSbCryptographyBlockCipherModeGcm,
-      NULL, 0, key.get(), key_len);
-
-  if (!SbCryptographyIsTransformerValid(encrypter)) {
-    // Test over (but no failure) if there's no implementation.
-    return;
-  }
-
-  SbCryptographySetInitializationVector(encrypter, nonce.get(), nonce_len);
-  memset(out.get(), 0, plaintext_len);
-  if (additional_data) {
-    SbCryptographySetAuthenticatedData(encrypter, additional_data.get(),
-                                       additional_data_len);
-  }
-
-  if (plaintext) {
-    EXPECT_EQ(plaintext_len,
-              SbCryptographyTransform(encrypter, plaintext.get(), plaintext_len,
-                                      out.get()));
-  }
-
-  scoped_array<uint8_t> actual_tag(new uint8_t[tag_len]);
-  memset(actual_tag.get(), 0, tag_len);
-  SbCryptographyGetTag(encrypter, actual_tag.get(), tag_len);
-  if (tag) {
-    EXPECT_STREQ(HexDump(tag.get(), tag_len).c_str(),
-                 HexDump(actual_tag.get(), tag_len).c_str());
-  }
-
-  if (ciphertext) {
-    EXPECT_STREQ(HexDump(ciphertext.get(), plaintext_len).c_str(),
-                 HexDump(out.get(), plaintext_len).c_str());
-  }
-
-  SbCryptographyDestroyTransformer(encrypter);
-
-  // Test decryption.
-
-  SbCryptographyTransformer decrypter = SbCryptographyCreateTransformer(
-      kSbCryptographyAlgorithmAes, kBlockSizeBits,
-      kSbCryptographyDirectionDecode, kSbCryptographyBlockCipherModeGcm,
-      NULL, 0, key.get(), key_len);
-  ASSERT_THAT(decrypter, NotNull());
-
-  SbCryptographySetInitializationVector(decrypter, nonce.get(), nonce_len);
-  memset(out.get(), 0, plaintext_len);
-  if (additional_data) {
-    SbCryptographySetAuthenticatedData(decrypter, additional_data.get(),
-                                       additional_data_len);
-  }
-
-  if (ciphertext) {
-    EXPECT_EQ(plaintext_len,
-              SbCryptographyTransform(decrypter, ciphertext.get(),
-                                      plaintext_len, out.get()));
-  }
-
-  actual_tag.reset(new uint8_t[tag_len]);
-  memset(actual_tag.get(), 0, tag_len);
-  SbCryptographyGetTag(decrypter, actual_tag.get(), tag_len);
-  if (tag) {
-    EXPECT_STREQ(HexDump(tag.get(), tag_len).c_str(),
-                 HexDump(actual_tag.get(), tag_len).c_str());
-  }
-
-  if (plaintext) {
-    EXPECT_STREQ(HexDump(plaintext.get(), plaintext_len).c_str(),
-                 HexDump(out.get(), plaintext_len).c_str());
-  }
-  SbCryptographyDestroyTransformer(decrypter);
-}
-
-INSTANTIATE_TEST_CASE_P(
-    SbCryptographyTransform,
-    Gcm,
-    ::testing::Range(0, SB_ARRAY_SIZE_INT(test_cases)));
-
-}  // namespace
-}  // namespace nplb
-}  // namespace starboard
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/nplb/cryptography_transform_test.cc b/starboard/nplb/cryptography_transform_test.cc
deleted file mode 100644
index 0d16d4f..0000000
--- a/starboard/nplb/cryptography_transform_test.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-#include "starboard/common/log.h"
-#include "starboard/common/scoped_ptr.h"
-#include "starboard/nplb/cryptography_helpers.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace starboard {
-namespace nplb {
-namespace {
-
-class Aes : public ::testing::TestWithParam<SbCryptographyBlockCipherMode> {
- protected:
-  SbCryptographyBlockCipherMode GetMode() { return GetParam(); }
-
-  bool ShouldSetIvAtInitialization() {
-    return GetIvMode() == kIvModeSetAtInitialization ||
-           GetIvMode() == kIvModeSetAnyTime;
-  }
-
-  bool ShouldSetIvAfterInitialization() {
-    return GetIvMode() == kIvModeSetAfterInitialization ||
-           GetIvMode() == kIvModeSetAnyTime;
-  }
-
-  bool ShouldSetAuthenticatedData() {
-    switch (GetMode()) {
-      case kSbCryptographyBlockCipherModeGcm:
-        return true;
-      case kSbCryptographyBlockCipherModeEcb:
-      case kSbCryptographyBlockCipherModeCtr:
-      case kSbCryptographyBlockCipherModeCbc:
-      case kSbCryptographyBlockCipherModeCfb:
-      case kSbCryptographyBlockCipherModeOfb:
-        return false;
-      default:
-        ADD_FAILURE() << "Unrecognized SbCryptographyBlockCipherMode "
-                      << GetMode();
-        return false;
-    }
-  }
-
-  const char* GetExpectedEncryptedValueHex() {
-    switch (GetMode()) {
-      case kSbCryptographyBlockCipherModeGcm:
-        return "6a7b6e871f851db21a29f6aef579cfb77238d34b2f099404f20bb44c6b2d4d2"
-               "0a2788f8ffc0a36eba4cd8e69ee95e973b5eb52d1e218ee991ccc0ee1ba2fa7"
-               "d1dc83a5d2e3c317e5637b67c2524bd073ec6fe547edf6044111e2e16c239ed"
-               "e845d4b7b235f24fbdb2673dbdd1c5d5c46d7b69059ff4b1566b01bec4f4ca6"
-               "a4c500";
-
-      case kSbCryptographyBlockCipherModeEcb:
-        return "36aa40499dccc9f25bb3c1abcf4b73cf5993dc6127c534e7491a31a54f09bc4"
-               "8e9fc157e380ca1457dedac9147e158be1c8eba2ec679d6bdc54cb2878cd2ab"
-               "6736aa40499dccc9f25bb3c1abcf4b73cf5993dc6127c534e7491a31a54f09b"
-               "c48e9fc157e380ca1457dedac9147e158beae602e043e0572ed2f71acf5438c"
-               "e78200";
-
-      case kSbCryptographyBlockCipherModeCtr:
-        return "f32f8a813cea30e0f4c6e2efeab52ab92976cc06fa5f69409c3358ef2f3782d"
-               "daff201f56acd9b61fea4c3e4739deab176ad764da16d1248d59337962c7ab0"
-               "f2cd4c292ed34ae4125d8fb142344b2d2fc4ff533b80f5e8e311cde700ceaed"
-               "a613c6f27f72a0602e6e4891e6b4f5a0a64e795998a40544d88363d124d5294"
-               "c91700";
-
-      case kSbCryptographyBlockCipherModeCbc:
-        return "eaa929d637cde55115d43257e920ff8d39d1dec8240255a5db79a0cf79501a1"
-               "4bc62c4d16fc45dd7fa9d15b3346a74301260dfeb96e22259787344d7e47047"
-               "3eb4187eeac16a74afd1c5fdc67fb145cc494667ea4b16dccc83cc1cc1b2c36"
-               "2f2a03e90d6c3a9adbf53c4cb8e4987719928ef7c47c4403f0cfe5a0ff77325"
-               "6eaa00";
-
-      case kSbCryptographyBlockCipherModeCfb:
-      case kSbCryptographyBlockCipherModeOfb:
-        ADD_FAILURE() << "Unsupported SbCryptographyBlockCipherMode "
-                      << GetMode();
-        return "";
-      default:
-        ADD_FAILURE() << "Unrecognized SbCryptographyBlockCipherMode "
-                      << GetMode();
-        return "";
-    }
-  }
-
- private:
-  enum IvMode {
-    kIvModeNotUsed,
-    kIvModeSetAtInitialization,
-    kIvModeSetAfterInitialization,
-    kIvModeSetAnyTime,
-  };
-
-  IvMode GetIvMode() {
-    switch (GetMode()) {
-      case kSbCryptographyBlockCipherModeEcb:
-        return kIvModeNotUsed;
-      case kSbCryptographyBlockCipherModeGcm:
-        return kIvModeSetAfterInitialization;
-      case kSbCryptographyBlockCipherModeCtr:
-        return kIvModeSetAnyTime;
-      case kSbCryptographyBlockCipherModeCbc:
-      case kSbCryptographyBlockCipherModeCfb:
-      case kSbCryptographyBlockCipherModeOfb:
-        return kIvModeSetAtInitialization;
-      default:
-        ADD_FAILURE() << "Unrecognized SbCryptographyBlockCipherMode "
-                      << GetMode();
-        return kIvModeNotUsed;
-    }
-  }
-};
-
-const int kBlockSizeBits = 128;
-const int kBlockSizeBytes = kBlockSizeBits / 8;
-
-const char kClearText[] =
-    "This test text is designed to be a multiple of 128 bits, huzzah-"
-    "This test text is designed to be a multiple of 128 bits, huzzah!";
-const char kAdditionalDataString[] = "000000000000000000000000";
-const char kInitializationVector[kBlockSizeBytes + 1] = "0123456789ABCDEF";
-const char kKey[kBlockSizeBytes + 1] = "Rijndael";
-
-TEST_P(Aes, SunnyDayIdentity) {
-  SbCryptographyBlockCipherMode mode = GetMode();
-
-  SbCryptographyTransformer encrypter = SbCryptographyCreateTransformer(
-      kSbCryptographyAlgorithmAes, kBlockSizeBits,
-      kSbCryptographyDirectionEncode, mode,
-      ShouldSetIvAtInitialization() ? kInitializationVector : NULL,
-      ShouldSetIvAtInitialization() ? kBlockSizeBytes : 0, kKey,
-      kBlockSizeBytes);
-
-  if (!SbCryptographyIsTransformerValid(encrypter)) {
-    SB_LOG(WARNING) << "Skipping test, as there is no implementation.";
-    // Test over if there's no implementation.
-    return;
-  }
-
-  if (ShouldSetIvAfterInitialization()) {
-    SbCryptographySetInitializationVector(encrypter, kInitializationVector,
-                                          kBlockSizeBytes);
-  }
-
-  if (ShouldSetAuthenticatedData()) {
-    scoped_array<uint8_t> aad;
-    int aad_len = 0;
-    DecodeHex(&aad, &aad_len, kAdditionalDataString, GetMode(), "aad");
-    SbCryptographySetAuthenticatedData(encrypter, aad.get(), aad_len);
-  }
-
-  const int kInputSize = static_cast<int>(strlen(kClearText));
-  const int kBufferSize = static_cast<int>(sizeof(kClearText));
-  char* cipher_text = new char[kBufferSize];
-  memset(cipher_text, 0, kBufferSize);
-  int count =
-      SbCryptographyTransform(encrypter, kClearText, kInputSize, cipher_text);
-  EXPECT_EQ(kInputSize, count);
-  EXPECT_NE(0, strncmp(kClearText, cipher_text, kBufferSize));
-
-  EXPECT_STREQ(GetExpectedEncryptedValueHex(),
-               HexDump(cipher_text, kBufferSize).c_str());
-
-  SbCryptographyTransformer decrypter = SbCryptographyCreateTransformer(
-      kSbCryptographyAlgorithmAes, kBlockSizeBits,
-      kSbCryptographyDirectionDecode, mode,
-      ShouldSetIvAtInitialization() ? kInitializationVector : NULL,
-      ShouldSetIvAtInitialization() ? kBlockSizeBytes : 0, kKey,
-      kBlockSizeBytes);
-
-  ASSERT_TRUE(SbCryptographyIsTransformerValid(decrypter))
-      << "Cryptographic support for a set of parameters must be symmetrical.";
-
-  if (ShouldSetIvAfterInitialization()) {
-    SbCryptographySetInitializationVector(decrypter, kInitializationVector,
-                                          kBlockSizeBytes);
-  }
-
-  if (ShouldSetAuthenticatedData()) {
-    scoped_array<uint8_t> aad;
-    int aad_len = 0;
-    DecodeHex(&aad, &aad_len, kAdditionalDataString, GetMode(), "aad");
-    SbCryptographySetAuthenticatedData(decrypter, aad.get(), aad_len);
-  }
-
-  char* decrypted_text = new char[kBufferSize];
-  memset(decrypted_text, 0, kBufferSize);
-  count = SbCryptographyTransform(decrypter, cipher_text, kInputSize,
-                                  decrypted_text);
-
-  EXPECT_EQ(kInputSize, count);
-  EXPECT_EQ(kInputSize, strlen(decrypted_text));
-  EXPECT_STREQ(kClearText, decrypted_text);
-
-  delete[] decrypted_text;
-  delete[] cipher_text;
-  SbCryptographyDestroyTransformer(decrypter);
-  SbCryptographyDestroyTransformer(encrypter);
-}
-
-INSTANTIATE_TEST_CASE_P(SbCryptographyTransform,
-                        Aes,
-                        ::testing::Values(kSbCryptographyBlockCipherModeCbc,
-                                          kSbCryptographyBlockCipherModeCfb,
-                                          kSbCryptographyBlockCipherModeCtr,
-                                          kSbCryptographyBlockCipherModeEcb,
-                                          kSbCryptographyBlockCipherModeOfb,
-                                          kSbCryptographyBlockCipherModeGcm));
-
-}  // namespace
-}  // namespace nplb
-}  // namespace starboard
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/nplb/directory_get_next_test.cc b/starboard/nplb/directory_get_next_test.cc
index 576e50d..ea3a74f 100644
--- a/starboard/nplb/directory_get_next_test.cc
+++ b/starboard/nplb/directory_get_next_test.cc
@@ -51,19 +51,11 @@
 
   StringSet names_to_find(names);
   while (true) {
-#if SB_API_VERSION >= 12
     std::vector<char> entry(kSbFileMaxName, 0);
     if (!SbDirectoryGetNext(directory, entry.data(), entry.size())) {
       break;
     }
     const char* entry_name = entry.data();
-#else   // SB_API_VERSION >= 12
-    SbDirectoryEntry entry = {0};
-    if (!SbDirectoryGetNext(directory, &entry)) {
-      break;
-    }
-    const char* entry_name = entry.name;
-#endif  // SB_API_VERSION >= 12
 
     // SbDirectoryEntry just contains the last component of the absolute path to
     // the file, but ScopedRandomFile::filename() returns the full path.
@@ -117,19 +109,11 @@
 
     // Iterate all entries in this directory.
     while (true) {
-#if SB_API_VERSION >= 12
       std::vector<char> entry(kSbFileMaxName, 0);
       if (!SbDirectoryGetNext(directory, entry.data(), entry.size())) {
         break;
       }
       std::string entry_name = entry.data();
-#else   // SB_API_VERSION >= 12
-      SbDirectoryEntry entry = {0};
-      if (!SbDirectoryGetNext(directory, &entry)) {
-        break;
-      }
-      std::string entry_name = entry.name;
-#endif  // SB_API_VERSION >= 12
 
       // Accept and ignore '.' and '..' directories.
       if (entry_name == "." || entry_name == "..") {
@@ -165,14 +149,9 @@
 }
 
 TEST(SbDirectoryGetNextTest, FailureInvalidSbDirectory) {
-#if SB_API_VERSION >= 12
   std::vector<char> entry(kSbFileMaxName, 0);
   EXPECT_FALSE(
       SbDirectoryGetNext(kSbDirectoryInvalid, entry.data(), entry.size()));
-#else   // SB_API_VERSION >= 12
-  SbDirectoryEntry entry = {0};
-  EXPECT_FALSE(SbDirectoryGetNext(kSbDirectoryInvalid, &entry));
-#endif  // SB_API_VERSION >= 12
 }
 
 TEST(SbDirectoryGetNextTest, FailureNullEntry) {
@@ -187,23 +166,14 @@
   SbDirectory directory = SbDirectoryOpen(path.c_str(), &error);
   EXPECT_TRUE(SbDirectoryIsValid(directory));
   EXPECT_EQ(kSbFileOk, error);
-#if SB_API_VERSION >= 12
   EXPECT_FALSE(SbDirectoryGetNext(directory, NULL, kSbFileMaxName));
-#else  // SB_API_VERSION >= 12
-  EXPECT_FALSE(SbDirectoryGetNext(directory, NULL));
-#endif  // SB_API_VERSION >= 12
   EXPECT_TRUE(SbDirectoryClose(directory));
 }
 
 TEST(SbDirectoryGetNextTest, FailureInvalidAndNull) {
-#if SB_API_VERSION >= 12
   EXPECT_FALSE(SbDirectoryGetNext(kSbDirectoryInvalid, NULL, kSbFileMaxName));
-#else   // SB_API_VERSION >= 12
-  EXPECT_FALSE(SbDirectoryGetNext(kSbDirectoryInvalid, NULL));
-#endif  // SB_API_VERSION >= 12
 }
 
-#if SB_API_VERSION >= 12
 TEST(SbDirectoryGetNextTest, FailureOnInsufficientSize) {
   ScopedRandomFile file;
   std::string directory_name = file.filename();
@@ -227,7 +197,6 @@
 
   EXPECT_TRUE(SbDirectoryClose(directory));
 }
-#endif  // SB_API_VERSION >= 12
 
 }  // namespace
 }  // namespace nplb
diff --git a/starboard/nplb/drm_get_metrics_test.cc b/starboard/nplb/drm_get_metrics_test.cc
index a26dd15..484c1bc 100644
--- a/starboard/nplb/drm_get_metrics_test.cc
+++ b/starboard/nplb/drm_get_metrics_test.cc
@@ -18,8 +18,6 @@
 #include "starboard/nplb/drm_helpers.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12
-
 namespace starboard {
 namespace nplb {
 namespace {
@@ -59,5 +57,3 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/nplb/extern_c_test.cc b/starboard/nplb/extern_c_test.cc
index f295f50..55bd198 100644
--- a/starboard/nplb/extern_c_test.cc
+++ b/starboard/nplb/extern_c_test.cc
@@ -23,9 +23,6 @@
 #include "starboard/condition_variable.h"
 #include "starboard/configuration.h"
 #include "starboard/cpu_features.h"
-#if SB_API_VERSION < 12
-#include "starboard/cryptography.h"
-#endif
 #include "starboard/decode_target.h"
 #include "starboard/directory.h"
 #include "starboard/double.h"
@@ -53,7 +50,6 @@
 #include "starboard/string.h"
 #include "starboard/system.h"
 #include "starboard/thread.h"
-#include "starboard/thread_types.h"
 #include "starboard/time.h"
 #include "starboard/time_zone.h"
 #include "starboard/types.h"
diff --git a/starboard/nplb/file_atomic_replace_test.cc b/starboard/nplb/file_atomic_replace_test.cc
index dff2499..7c99afe 100644
--- a/starboard/nplb/file_atomic_replace_test.cc
+++ b/starboard/nplb/file_atomic_replace_test.cc
@@ -16,8 +16,6 @@
 #include "starboard/nplb/file_helpers.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12
-
 namespace starboard {
 namespace nplb {
 namespace {
@@ -97,5 +95,3 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/nplb/flat_map_test.cc b/starboard/nplb/flat_map_test.cc
index 34170b2..6f35240 100644
--- a/starboard/nplb/flat_map_test.cc
+++ b/starboard/nplb/flat_map_test.cc
@@ -90,12 +90,8 @@
 }
 
 SbTimeMonotonic GetThreadTimeMonotonicNow() {
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
-#if SB_API_VERSION >= 12
   if (SbTimeIsTimeThreadNowSupported())
-#endif
     return SbTimeGetMonotonicThreadNow();
-#endif
   return SbTimeGetMonotonicNow();
 }
 
diff --git a/starboard/nplb/include_all.c b/starboard/nplb/include_all.c
index bb3e30e..5bea2e8 100644
--- a/starboard/nplb/include_all.c
+++ b/starboard/nplb/include_all.c
@@ -22,9 +22,6 @@
 #include "starboard/condition_variable.h"
 #include "starboard/configuration.h"
 #include "starboard/cpu_features.h"
-#if SB_API_VERSION < 12
-#include "starboard/cryptography.h"
-#endif
 #include "starboard/decode_target.h"
 #include "starboard/directory.h"
 #include "starboard/double.h"
@@ -52,7 +49,6 @@
 #include "starboard/string.h"
 #include "starboard/system.h"
 #include "starboard/thread.h"
-#include "starboard/thread_types.h"
 #include "starboard/time.h"
 #include "starboard/time_zone.h"
 #include "starboard/types.h"
diff --git a/starboard/nplb/media_can_play_mime_and_key_system_test.cc b/starboard/nplb/media_can_play_mime_and_key_system_test.cc
index 81f85e2..beea8ac 100644
--- a/starboard/nplb/media_can_play_mime_and_key_system_test.cc
+++ b/starboard/nplb/media_can_play_mime_and_key_system_test.cc
@@ -73,9 +73,7 @@
   // Opus
   result = SbMediaCanPlayMimeAndKeySystem(
       "audio/webm; codecs=\"opus\"; channels=2", "");
-#if SB_API_VERSION >= 12
   ASSERT_EQ(result, kSbMediaSupportTypeProbably);
-#endif  // SB_API_VERSION >= 12
 }
 
 TEST(SbMediaCanPlayMimeAndKeySystem, Invalid) {
diff --git a/starboard/nplb/media_set_audio_write_duration_test.cc b/starboard/nplb/media_set_audio_write_duration_test.cc
index 33966bc..237fe58 100644
--- a/starboard/nplb/media_set_audio_write_duration_test.cc
+++ b/starboard/nplb/media_set_audio_write_duration_test.cc
@@ -112,7 +112,6 @@
         dmp_reader_.GetPlayerSampleInfo(kSbMediaTypeAudio, 0).timestamp;
     first_input_timestamp_ = last_input_timestamp_;
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     SbPlayerCreationParam creation_param = CreatePlayerCreationParam(
         audio_sample_info.codec, kSbMediaVideoCodecNone);
     creation_param.audio_sample_info = audio_sample_info;
@@ -125,22 +124,6 @@
         DummyDeallocateSampleFunc, DecoderStatusFunc, PlayerStatusFunc,
         DummyErrorFunc, this /* context */,
         fake_graphics_context_provider_.decoder_target_provider());
-#else   // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-    SbPlayerOutputMode output_mode = kSbPlayerOutputModeDecodeToTexture;
-
-    if (!SbPlayerOutputModeSupported(output_mode, kSbMediaVideoCodecNone,
-                                     kSbDrmSystemInvalid)) {
-      output_mode = kSbPlayerOutputModePunchOut;
-    }
-
-    SbPlayer player = SbPlayerCreate(
-        fake_graphics_context_provider_.window(), kSbMediaVideoCodecNone,
-        kAudioCodec, kSbDrmSystemInvalid, &audio_sample_info,
-        NULL /* max_video_capabilities */,
-        DummyDeallocateSampleFunc, DecoderStatusFunc, PlayerStatusFunc,
-        DummyErrorFunc, this /* context */, output_mode,
-        fake_graphics_context_provider_.decoder_target_provider());
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
     EXPECT_TRUE(SbPlayerIsValid(player));
     return player;
@@ -279,9 +262,7 @@
     const SbMediaAudioSampleInfo* audio_sample_info =
         &dmp_reader.audio_sample_info();
     if (SbMediaIsAudioSupported(dmp_reader.audio_codec(),
-#if SB_API_VERSION >= 12
                                 "",  // content_type
-#endif // SB_API_VERSION >= 12
                                 dmp_reader.audio_bitrate())) {
       test_params.push_back(filename);
     }
diff --git a/starboard/nplb/memory_map_test.cc b/starboard/nplb/memory_map_test.cc
index 3c401f4..10d2b9b 100644
--- a/starboard/nplb/memory_map_test.cc
+++ b/starboard/nplb/memory_map_test.cc
@@ -23,7 +23,6 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
 const size_t kSize = kSbMemoryPageSize * 8;
 const void* kFailed = SB_MEMORY_MAP_FAILED;
 
@@ -292,8 +291,6 @@
   }
 }
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(MMAP)
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/memory_reporter_test.cc b/starboard/nplb/memory_reporter_test.cc
index 6dde02b..8b2604a 100644
--- a/starboard/nplb/memory_reporter_test.cc
+++ b/starboard/nplb/memory_reporter_test.cc
@@ -40,53 +40,59 @@
     prev_val = GetMemoryTrackingEnabled_ThreadLocal();
     SetMemoryTrackingEnabled_ThreadLocal(false);
   }
-  ~NoMemTracking() {
-    SetMemoryTrackingEnabled_ThreadLocal(prev_val);
-  }
+  ~NoMemTracking() { SetMemoryTrackingEnabled_ThreadLocal(prev_val); }
 };
 
 // EXPECT_XXX and ASSERT_XXX allocate memory, a big no-no when
 // for unit testing allocations. These overrides disable memory
 // tracking for the duration of the EXPECT and ASSERT operations.
-#define EXPECT_EQ_NO_TRACKING(A, B)                \
-{ NoMemTracking no_memory_tracking_in_this_scope;  \
-  EXPECT_EQ(A, B);                                 \
-}
+#define EXPECT_EQ_NO_TRACKING(A, B)                 \
+  {                                                 \
+    NoMemTracking no_memory_tracking_in_this_scope; \
+    EXPECT_EQ(A, B);                                \
+  }
 
-#define EXPECT_NE_NO_TRACKING(A, B)                \
-{ NoMemTracking no_memory_tracking_in_this_scope;  \
-  EXPECT_NE(A, B);                                 \
-}
+#define EXPECT_NE_NO_TRACKING(A, B)                 \
+  {                                                 \
+    NoMemTracking no_memory_tracking_in_this_scope; \
+    EXPECT_NE(A, B);                                \
+  }
 
-#define EXPECT_TRUE_NO_TRACKING(A)                 \
-{ NoMemTracking no_memory_tracking_in_this_scope;  \
-  EXPECT_TRUE(A);                                  \
-}
+#define EXPECT_TRUE_NO_TRACKING(A)                  \
+  {                                                 \
+    NoMemTracking no_memory_tracking_in_this_scope; \
+    EXPECT_TRUE(A);                                 \
+  }
 
-#define EXPECT_FALSE_NO_TRACKING(A)                \
-{ NoMemTracking no_memory_tracking_in_this_scope;  \
-  EXPECT_FALSE(A);                                 \
-}
+#define EXPECT_FALSE_NO_TRACKING(A)                 \
+  {                                                 \
+    NoMemTracking no_memory_tracking_in_this_scope; \
+    EXPECT_FALSE(A);                                \
+  }
 
-#define ASSERT_EQ_NO_TRACKING(A, B)                \
-{ NoMemTracking no_memory_tracking_in_this_scope;  \
-  ASSERT_EQ(A, B);                                 \
-}
+#define ASSERT_EQ_NO_TRACKING(A, B)                 \
+  {                                                 \
+    NoMemTracking no_memory_tracking_in_this_scope; \
+    ASSERT_EQ(A, B);                                \
+  }
 
-#define ASSERT_NE_NO_TRACKING(A, B)                \
-{ NoMemTracking no_memory_tracking_in_this_scope;  \
-  ASSERT_NE(A, B);                                 \
-}
+#define ASSERT_NE_NO_TRACKING(A, B)                 \
+  {                                                 \
+    NoMemTracking no_memory_tracking_in_this_scope; \
+    ASSERT_NE(A, B);                                \
+  }
 
-#define ASSERT_TRUE_NO_TRACKING(A)                 \
-{ NoMemTracking no_memory_tracking_in_this_scope;  \
-  ASSERT_TRUE(A);                                  \
-}
+#define ASSERT_TRUE_NO_TRACKING(A)                  \
+  {                                                 \
+    NoMemTracking no_memory_tracking_in_this_scope; \
+    ASSERT_TRUE(A);                                 \
+  }
 
-#define ASSERT_FALSE_NO_TRACKING(A)                \
-{ NoMemTracking no_memory_tracking_in_this_scope;  \
-  ASSERT_FALSE(A);                                 \
-}
+#define ASSERT_FALSE_NO_TRACKING(A)                 \
+  {                                                 \
+    NoMemTracking no_memory_tracking_in_this_scope; \
+    ASSERT_FALSE(A);                                \
+  }
 
 // A structure that cannot be allocated because it throws an exception in its
 // constructor. This is needed to test the std::nothrow version of delete since
@@ -104,9 +110,7 @@
  public:
   TestMemReporter() { Construct(); }
 
-  SbMemoryReporter* memory_reporter() {
-    return &memory_reporter_;
-  }
+  SbMemoryReporter* memory_reporter() { return &memory_reporter_; }
 
   // Removes this object from listening to allocations.
   void RemoveGlobalHooks() {
@@ -131,18 +135,10 @@
     last_mem_unmap_ = NULL;
   }
 
-  const void* last_allocation() const {
-    return last_allocation_;
-  }
-  const void* last_deallocation() const {
-    return last_deallocation_;
-  }
-  const void* last_mem_map() const {
-    return last_mem_map_;
-  }
-  const void* last_mem_unmap() const {
-    return last_mem_unmap_;
-  }
+  const void* last_allocation() const { return last_allocation_; }
+  const void* last_deallocation() const { return last_deallocation_; }
+  const void* last_mem_map() const { return last_mem_map_; }
+  const void* last_mem_unmap() const { return last_mem_unmap_; }
 
  private:
   // Boilerplate to delegate static function callbacks to the class instance.
@@ -167,9 +163,7 @@
   }
 
   static SbMemoryReporter CreateSbMemoryReporter(TestMemReporter* context) {
-    SbMemoryReporter cb = { OnMalloc, OnDealloc,
-                            OnMapMem, SbUnMapMem,
-                            context };
+    SbMemoryReporter cb = {OnMalloc, OnDealloc, OnMapMem, SbUnMapMem, context};
     return cb;
   }
 
@@ -248,9 +242,7 @@
   }
 
   // Global Teardown after last test has run it's course.
-  static void TearDownTestCase() {
-    s_test_alloc_tracker_->RemoveGlobalHooks();
-  }
+  static void TearDownTestCase() { s_test_alloc_tracker_->RemoveGlobalHooks(); }
 
   // Per test setup.
   virtual void SetUp() {
@@ -336,7 +328,6 @@
   EXPECT_EQ_NO_TRACKING(mem_reporter()->number_allocs(), 0);
 }
 
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
 // Tests the assumption that the SbMemoryMap and SbMemoryUnmap
 // will report memory allocations.
 TEST_F(MemoryReportingTest, CapturesMemMapUnmap) {
@@ -359,7 +350,6 @@
   // Call Clear() explicitly before TearDown() checks number_allocs_;
   mem_reporter()->Clear();
 }
-#endif  // SB_API_VERSION >= 12 || SB_HAS(MMAP)
 
 // Tests the assumption that the operator new/delete will report
 // memory allocations.
@@ -372,8 +362,7 @@
   int* my_int = new int();
   EXPECT_TRUE_NO_TRACKING(mem_reporter()->number_allocs() == 1);
 
-  bool is_last_allocation =
-      my_int == mem_reporter()->last_allocation();
+  bool is_last_allocation = my_int == mem_reporter()->last_allocation();
 
   EXPECT_TRUE_NO_TRACKING(is_last_allocation);
 
@@ -395,8 +384,7 @@
   int* my_int = new (std::nothrow) int();
   EXPECT_EQ_NO_TRACKING(1, mem_reporter()->number_allocs());
 
-  bool is_last_allocation =
-      my_int == mem_reporter()->last_allocation();
+  bool is_last_allocation = my_int == mem_reporter()->last_allocation();
 
   EXPECT_TRUE_NO_TRACKING(is_last_allocation);
 
@@ -508,17 +496,11 @@
     slot_ = SbThreadCreateLocalKey(NULL);
   }
 
-  ~ThreadLocalBool() {
-    SbThreadDestroyLocalKey(slot_);
-  }
+  ~ThreadLocalBool() { SbThreadDestroyLocalKey(slot_); }
 
-  void SetEnabled(bool value) {
-    SetEnabledThreadLocal(value);
-  }
+  void SetEnabled(bool value) { SetEnabledThreadLocal(value); }
 
-  bool Enabled() const {
-    return GetEnabledThreadLocal();
-  }
+  bool Enabled() const { return GetEnabledThreadLocal(); }
 
  private:
   void SetEnabledThreadLocal(bool value) {
diff --git a/starboard/nplb/microphone_close_test.cc b/starboard/nplb/microphone_close_test.cc
index 5b05853..346295e 100644
--- a/starboard/nplb/microphone_close_test.cc
+++ b/starboard/nplb/microphone_close_test.cc
@@ -20,8 +20,6 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
-
 TEST(SbMicrophoneCloseTest, SunnyDayCloseAreCalledMultipleTimes) {
   SbMicrophoneInfo info_array[kMaxNumberOfMicrophone];
   int available_info_array =
@@ -74,9 +72,6 @@
   EXPECT_FALSE(success);
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/microphone_create_test.cc b/starboard/nplb/microphone_create_test.cc
index 2e6aaa7..2cf2c25 100644
--- a/starboard/nplb/microphone_create_test.cc
+++ b/starboard/nplb/microphone_create_test.cc
@@ -21,8 +21,6 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
-
 TEST(SbMicrophoneCreateTest, SunnyDayOnlyOneMicrophone) {
   SbMicrophoneInfo info_array[kMaxNumberOfMicrophone];
   int available_microphones =
@@ -175,17 +173,13 @@
     // This should wrap around to a negative value due to int
     // narrowing.
     int kBufferSize = static_cast<int>(kBufferSize64);
-    SbMicrophone microphone =
-        SbMicrophoneCreate(info_array[0].id, info_array[0].max_sample_rate_hz,
-                           kBufferSize);
+    SbMicrophone microphone = SbMicrophoneCreate(
+        info_array[0].id, info_array[0].max_sample_rate_hz, kBufferSize);
     EXPECT_FALSE(SbMicrophoneIsValid(microphone));
     SbMicrophoneDestroy(microphone);
   }
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/microphone_destroy_test.cc b/starboard/nplb/microphone_destroy_test.cc
index 12456ce..5b9b805 100644
--- a/starboard/nplb/microphone_destroy_test.cc
+++ b/starboard/nplb/microphone_destroy_test.cc
@@ -19,15 +19,10 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
-
 TEST(SbMicrophoneDestroyTest, DestroyInvalidMicrophone) {
   SbMicrophoneDestroy(kSbMicrophoneInvalid);
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/microphone_get_available_test.cc b/starboard/nplb/microphone_get_available_test.cc
index a77af97..f6fb790 100644
--- a/starboard/nplb/microphone_get_available_test.cc
+++ b/starboard/nplb/microphone_get_available_test.cc
@@ -20,8 +20,6 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
-
 TEST(SbMicrophoneGetAvailableTest, SunnyDay) {
   SbMicrophoneInfo info_array[kMaxNumberOfMicrophone];
   int available_microphones =
@@ -54,8 +52,8 @@
   }
 }
 
-template<std::size_t N>
-bool IsNullTerminated(const char(&str)[N]) {
+template <std::size_t N>
+bool IsNullTerminated(const char (&str)[N]) {
   for (size_t i = 0; i < N; ++i) {
     if (str[i] == '\0') {
       return true;
@@ -85,9 +83,6 @@
   }
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/microphone_helpers.h b/starboard/nplb/microphone_helpers.h
index 807beb2..8435016 100644
--- a/starboard/nplb/microphone_helpers.h
+++ b/starboard/nplb/microphone_helpers.h
@@ -17,8 +17,6 @@
 
 #include "starboard/microphone.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
-
 namespace starboard {
 namespace nplb {
 const int kMaxNumberOfMicrophone = 20;
@@ -27,7 +25,4 @@
 }  // namespace nplb
 }  // namespace starboard
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
 #endif  // STARBOARD_NPLB_MICROPHONE_HELPERS_H_
diff --git a/starboard/nplb/microphone_is_sample_rate_supported_test.cc b/starboard/nplb/microphone_is_sample_rate_supported_test.cc
index 804bdc6..42ee6c5 100644
--- a/starboard/nplb/microphone_is_sample_rate_supported_test.cc
+++ b/starboard/nplb/microphone_is_sample_rate_supported_test.cc
@@ -20,8 +20,6 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
-
 TEST(SbMicrophoneIsSampleRateSupportedTest, SunnyDay) {
   SbMicrophoneInfo info_array[kMaxNumberOfMicrophone];
   int available_microphones =
@@ -50,9 +48,6 @@
                                                  kNormallyUsedSampleRateInHz));
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/microphone_open_test.cc b/starboard/nplb/microphone_open_test.cc
index e66d12b..7b529bb 100644
--- a/starboard/nplb/microphone_open_test.cc
+++ b/starboard/nplb/microphone_open_test.cc
@@ -20,8 +20,6 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
-
 TEST(SbMicrophoneOpenTest, SunnyDay) {
   SbMicrophoneInfo info_array[kMaxNumberOfMicrophone];
   int available_microphones =
@@ -93,9 +91,6 @@
   EXPECT_FALSE(success);
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/microphone_read_test.cc b/starboard/nplb/microphone_read_test.cc
index 548d229..6a6991c 100644
--- a/starboard/nplb/microphone_read_test.cc
+++ b/starboard/nplb/microphone_read_test.cc
@@ -21,8 +21,6 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12 || SB_HAS(MICROPHONE)
-
 TEST(SbMicrophoneReadTest, SunnyDay) {
   SbMicrophoneInfo info_array[kMaxNumberOfMicrophone];
   int available_microphones =
@@ -236,9 +234,6 @@
   EXPECT_LT(read_bytes, 0);
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(MICROPHONE)
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/mutex_acquire_try_test.cc b/starboard/nplb/mutex_acquire_try_test.cc
index e38e897..4c4b471 100644
--- a/starboard/nplb/mutex_acquire_try_test.cc
+++ b/starboard/nplb/mutex_acquire_try_test.cc
@@ -16,16 +16,13 @@
 #include "starboard/mutex.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12
 #include "starboard/nplb/thread_helpers.h"
 #include "starboard/thread.h"
-#endif  // SB_API_VERSION >= 12
 
 namespace starboard {
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12
 struct TestContext {
   explicit TestContext(SbMutex* mutex) : was_locked_(false), mutex_(mutex) {}
   bool was_locked_;
@@ -38,7 +35,6 @@
       (SbMutexAcquireTry(context->mutex_) == kSbMutexAcquired);
   return NULL;
 }
-#endif  // SB_API_VERSION >= 12
 
 TEST(SbMutexAcquireTryTest, SunnyDayUncontended) {
   SbMutex mutex;
@@ -66,7 +62,6 @@
   EXPECT_EQ(result, kSbMutexAcquired);
   EXPECT_TRUE(SbMutexIsSuccess(result));
 
-#if SB_API_VERSION >= 12
   TestContext context(&mutex);
   SbThread thread =
       SbThreadCreate(0, kSbThreadNoPriority, kSbThreadNoAffinity, true,
@@ -75,12 +70,6 @@
   EXPECT_TRUE(SbThreadIsValid(thread));
   EXPECT_TRUE(SbThreadJoin(thread, NULL));
   EXPECT_FALSE(context.was_locked_);
-#else   // SB_API_VERSION >= 12
-  result = SbMutexAcquireTry(&mutex);
-  EXPECT_EQ(result, kSbMutexBusy);
-  EXPECT_FALSE(SbMutexIsSuccess(result));
-#endif  // SB_API_VERSION >= 12
-
   EXPECT_TRUE(SbMutexRelease(&mutex));
   EXPECT_TRUE(SbMutexDestroy(&mutex));
 }
diff --git a/starboard/nplb/mutex_create_test.cc b/starboard/nplb/mutex_create_test.cc
index f52ba08..68c96f3 100644
--- a/starboard/nplb/mutex_create_test.cc
+++ b/starboard/nplb/mutex_create_test.cc
@@ -16,10 +16,8 @@
 #include "starboard/mutex.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12
 #include "starboard/condition_variable.h"
 #include "starboard/once.h"
-#endif  // SB_API_VERSION >= 12
 
 namespace starboard {
 namespace nplb {
@@ -49,13 +47,13 @@
 }
 
 TEST(SbMutexCreateTest, SunnyDayABunchAtOnce) {
-  SbMutex mutices[kABunch];
+  SbMutex mutexes[kABunch];
   for (int i = 0; i < kABunch; ++i) {
-    EXPECT_TRUE(SbMutexCreate(&mutices[i]));
+    EXPECT_TRUE(SbMutexCreate(&mutexes[i]));
   }
 
   for (int i = 0; i < kABunch; ++i) {
-    EXPECT_TRUE(SbMutexDestroy(&mutices[i]));
+    EXPECT_TRUE(SbMutexDestroy(&mutexes[i]));
   }
 }
 
diff --git a/starboard/nplb/mutex_destroy_test.cc b/starboard/nplb/mutex_destroy_test.cc
index 5df8a3a..96fa120 100644
--- a/starboard/nplb/mutex_destroy_test.cc
+++ b/starboard/nplb/mutex_destroy_test.cc
@@ -27,24 +27,8 @@
   EXPECT_TRUE(SbMutexDestroy(&mutex));
 }
 
-#if SB_API_VERSION >= 12
 // Destroying a mutex that has already been destroyed is undefined behavior
 // and cannot be tested.
-#else   // SB_API_VERSION >= 12
-TEST(SbMutexDestroyTest, RainyDayDestroyHeld) {
-  SbMutex mutex;
-  EXPECT_TRUE(SbMutexCreate(&mutex));
-
-  SbMutexResult result = SbMutexAcquire(&mutex);
-  EXPECT_EQ(result, kSbMutexAcquired);
-  EXPECT_TRUE(SbMutexIsSuccess(result));
-
-  EXPECT_FALSE(SbMutexDestroy(&mutex));
-  EXPECT_TRUE(SbMutexRelease(&mutex));
-  EXPECT_TRUE(SbMutexDestroy(&mutex));
-}
-#endif  // SB_API_VERSION >= 12
-
 TEST(SbMutexDestroyTest, RainyDayNull) {
   EXPECT_FALSE(SbMutexDestroy(NULL));
 }
diff --git a/starboard/nplb/nplb.gyp b/starboard/nplb/nplb.gyp
deleted file mode 100644
index 3d9fe68..0000000
--- a/starboard/nplb/nplb.gyp
+++ /dev/null
@@ -1,346 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# NPLB is "No Platform Left Behind," the certification test suite for Starboard
-# implementations.
-
-{
-  'targets': [
-    {
-      'msvs_disabled_warnings': [4100, 4189, 4456],
-      'target_name': 'nplb',
-      'type': '<(gtest_target_type)',
-      # Enable exceptions to test nothrow delete operator.
-      'cflags_cc!': ['-fno-exceptions' ],
-      'cflags_cc': ['-fexceptions' ],
-      'msvs_settings': {
-          'VCCLCompilerTool': {
-              'AdditionalOptions': [
-                  '/EHsc',  # C++ exceptions
-              ],
-          },
-      },
-      'defines': [
-        # This allows the tests to include internal only header files.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'sources': [
-        '<(DEPTH)/starboard/common/test_main.cc',
-        '<(DEPTH)/starboard/testing/fake_graphics_context_provider.cc',
-        '<(DEPTH)/starboard/testing/fake_graphics_context_provider.h',
-        'accessibility_test.cc',
-        'align_test.cc',
-        'atomic_base_test.cc',
-        'atomic_test.cc',
-        'audio_sink_create_test.cc',
-        'audio_sink_destroy_test.cc',
-        'audio_sink_get_max_channels_test.cc',
-        'audio_sink_get_min_buffer_size_in_frames_test.cc',
-        'audio_sink_get_nearest_supported_sample_frequency_test.cc',
-        'audio_sink_helpers.cc',
-        'audio_sink_helpers.h',
-        'audio_sink_is_audio_frame_storage_type_supported_test.cc',
-        'audio_sink_is_audio_sample_type_supported_test.cc',
-        'audio_sink_test.cc',
-        'byte_swap_test.cc',
-        'char_is_signed_test.cc',
-        'character_is_alphanumeric_test.cc',
-        'character_is_digit_test.cc',
-        'character_is_hex_digit_test.cc',
-        'character_is_space_test.cc',
-        'character_is_upper_test.cc',
-        'character_to_lower_test.cc',
-        'character_to_upper_test.cc',
-        'condition_variable_broadcast_test.cc',
-        'condition_variable_create_test.cc',
-        'condition_variable_destroy_test.cc',
-        'condition_variable_signal_test.cc',
-        'condition_variable_wait_test.cc',
-        'condition_variable_wait_timed_test.cc',
-        'configuration_test.cc',
-        'cpu_features_get_test.cc',
-        'cryptography_create_transformer_test.cc',
-        'cryptography_helpers.cc',
-        'cryptography_helpers.h',
-        'cryptography_transform_test.cc',
-        'cryptography_transform_gcm_test.cc',
-        'directory_can_open_test.cc',
-        'directory_close_test.cc',
-        'directory_create_test.cc',
-        'directory_get_next_test.cc',
-        'directory_open_test.cc',
-        'double_absolute_test.cc',
-        'double_exponent_test.cc',
-        'double_floor_test.cc',
-        'double_is_finite_test.cc',
-        'double_is_nan_test.cc',
-        'drm_create_system_test.cc',
-        'drm_get_metrics_test.cc',
-        'drm_helpers.cc',
-        'drm_helpers.h',
-        'drm_is_server_certificate_updatable_test.cc',
-        'drm_session_test.cc',
-        'drm_update_server_certificate_test.cc',
-        'egl_test.cc',
-        'extern_c_test.cc',
-        'file_atomic_replace_test.cc',
-        'file_can_open_test.cc',
-        'file_close_test.cc',
-        'file_delete_recursive_test.cc',
-        'file_delete_test.cc',
-        'file_get_info_test.cc',
-        'file_get_path_info_test.cc',
-        'file_helpers.cc',
-        'file_mode_string_to_flags_test.cc',
-        'file_open_test.cc',
-        'file_read_test.cc',
-        'file_read_write_all_test.cc',
-        'file_seek_test.cc',
-        'file_truncate_test.cc',
-        'file_write_test.cc',
-        'flat_map_test.cc',
-        'gles_test.cc',
-        'murmurhash2_test.cc',
-        'image_test.cc',
-        'include_all.c',
-        'include_all_too.c',
-        'key_test.cc',
-        'log_flush_test.cc',
-        'log_format_test.cc',
-        'log_is_tty_test.cc',
-        'log_raw_dump_stack_test.cc',
-        'log_raw_test.cc',
-        'log_test.cc',
-        # TODO: Separate functions tested by media buffer test into multiple
-        # files.
-        'media_buffer_test.cc',
-        'media_can_play_mime_and_key_system_test.cc',
-        'media_can_play_mime_and_key_system_test_helpers.h',
-        'media_configuration_test.cc',
-        'memory_align_to_page_size_test.cc',
-        'memory_allocate_aligned_test.cc',
-        'memory_allocate_test.cc',
-        'memory_compare_test.cc',
-        'memory_copy_test.cc',
-        'memory_deallocate_aligned_test.cc',
-        'memory_deallocate_test.cc',
-        'memory_find_byte_test.cc',
-        'memory_get_stack_bounds_test.cc',
-        'memory_is_zero_test.cc',
-        'memory_map_test.cc',
-        'memory_move_test.cc',
-        'memory_reallocate_test.cc',
-        'memory_reporter_test.cc',
-        'memory_set_test.cc',
-        'microphone_close_test.cc',
-        'microphone_create_test.cc',
-        'microphone_destroy_test.cc',
-        'microphone_get_available_test.cc',
-        'microphone_is_sample_rate_supported_test.cc',
-        'microphone_open_test.cc',
-        'microphone_read_test.cc',
-        'mutex_acquire_test.cc',
-        'mutex_acquire_try_test.cc',
-        'mutex_create_test.cc',
-        'mutex_destroy_test.cc',
-        'once_test.cc',
-        'optional_test.cc',
-        'player_create_test.cc',
-        'player_creation_param_helpers.cc',
-        'player_creation_param_helpers.h',
-        'player_get_preferred_output_mode_test.cc',
-        'player_output_mode_supported_test.cc',
-        'player_test_util.cc',
-        'player_test_util.h',
-        'player_write_sample_test.cc',
-        'random_helpers.cc',
-        'recursive_mutex_test.cc',
-        'rwlock_test.cc',
-        'semaphore_test.cc',
-        'socket_accept_test.cc',
-        'socket_bind_test.cc',
-        'socket_clear_last_error_test.cc',
-        'socket_connect_test.cc',
-        'socket_create_test.cc',
-        'socket_destroy_test.cc',
-        'socket_get_interface_address_test.cc',
-        'socket_get_last_error_test.cc',
-        'socket_get_local_address_test.cc',
-        'socket_helpers.cc',
-        'socket_is_connected_and_idle_test.cc',
-        'socket_is_connected_test.cc',
-        'socket_join_multicast_group_test.cc',
-        'socket_listen_test.cc',
-        'socket_receive_from_test.cc',
-        'socket_resolve_test.cc',
-        'socket_send_to_test.cc',
-        'socket_set_options_test.cc',
-        'socket_waiter_add_test.cc',
-        'socket_waiter_create_test.cc',
-        'socket_waiter_destroy_test.cc',
-        'socket_waiter_remove_test.cc',
-        'socket_waiter_wait_test.cc',
-        'socket_waiter_wait_timed_test.cc',
-        'socket_waiter_wake_up_test.cc',
-        'socket_wrapper_test.cc',
-        'speech_synthesis_basic_test.cc',
-        'state_machine_test.cc',
-        'storage_close_record_test.cc',
-        'storage_delete_record_test.cc',
-        'storage_get_record_size_test.cc',
-        'storage_open_record_test.cc',
-        'storage_read_record_test.cc',
-        'storage_write_record_test.cc',
-        'string_compare_all_test.cc',
-        'string_compare_no_case_n_test.cc',
-        'string_compare_no_case_test.cc',
-        'string_compare_test.cc',
-        'string_compare_wide_test.cc',
-        'string_concat_test.cc',
-        'string_concat_wide_test.cc',
-        'string_copy_test.cc',
-        'string_copy_wide_test.cc',
-        'string_duplicate_test.cc',
-        'string_find_character_test.cc',
-        'string_find_last_character_test.cc',
-        'string_find_string_test.cc',
-        'string_format_test.cc',
-        'string_format_wide_test.cc',
-        'string_parse_double_test.cc',
-        'string_parse_signed_integer_test.cc',
-        'string_parse_uint64_test.cc',
-        'string_parse_unsigned_integer_test.cc',
-        'string_scan_test.cc',
-        'system_binary_search_test.cc',
-        'system_clear_last_error_test.cc',
-        'system_get_error_string_test.cc',
-        'system_get_connection_type_test.cc',
-        'system_get_extension_test.cc',
-        'system_get_last_error_test.cc',
-        'system_get_locale_id_test.cc',
-        'system_get_number_of_processors_test.cc',
-        'system_get_path_test.cc',
-        'system_get_property_test.cc',
-        'system_get_random_data_test.cc',
-        'system_get_random_uint64_test.cc',
-        'system_get_stack_test.cc',
-        'system_get_total_cpu_memory_test.cc',
-        'system_get_total_gpu_memory_test.cc',
-        'system_get_used_cpu_memory_test.cc',
-        'system_get_used_gpu_memory_test.cc',
-        'system_has_capability_test.cc',
-        'system_hide_splash_screen_test.cc',
-        'system_is_debugger_attached_test.cc',
-        'system_network_status_test.cc',
-        'system_sort_test.cc',
-        'system_sign_with_certification_secret_key_test.cc',
-        'system_symbolize_test.cc',
-        'thread_create_test.cc',
-        'thread_detach_test.cc',
-        'thread_get_current_test.cc',
-        'thread_get_id_test.cc',
-        'thread_get_name_test.cc',
-        'thread_helpers.cc',
-        'thread_is_equal_test.cc',
-        'thread_join_test.cc',
-        'thread_local_value_test.cc',
-        'thread_sampler_test.cc',
-        'thread_set_name_test.cc',
-        'thread_sleep_test.cc',
-        'thread_test.cc',
-        'thread_yield_test.cc',
-        'time_get_monotonic_now_test.cc',
-        'time_get_now_test.cc',
-        'time_narrow_test.cc',
-        'time_zone_get_current_test.cc',
-        'time_zone_get_name_test.cc',
-        'ui_navigation_test.cc',
-        'undefined_behavior_test.cc',
-        'unsafe_math_test.cc',
-        'url_player_create_test.cc',
-        'user_get_current_test.cc',
-        'user_get_property_test.cc',
-        'user_get_signed_in_test.cc',
-        'window_create_test.cc',
-        'window_destroy_test.cc',
-        'window_get_diagonal_size_in_inches_test.cc',
-        'window_get_platform_handle_test.cc',
-        'window_get_size_test.cc',
-        '<@(sabi_sources)',
-        # Include private c headers, if present.
-        '<!@pymod_do_main(starboard.build.gyp_functions file_glob <(DEPTH)/starboard/private/nplb/ include_all_private.c)',
-        # Include private tests, if present.
-        '<!@pymod_do_main(starboard.build.gyp_functions file_glob <(DEPTH)/starboard/private/nplb/ *_test.cc)',
-      ],
-      'dependencies': [
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/starboard/common/common.gyp:common',
-        '<(DEPTH)/starboard/nplb/compiler_compliance/compiler_compliance.gyp:cpp14_supported',
-        '<(DEPTH)/starboard/shared/starboard/media/media.gyp:media_util',
-        '<(DEPTH)/starboard/shared/starboard/player/player.gyp:player_copy_test_data',
-        '<(DEPTH)/starboard/shared/starboard/player/player.gyp:video_dmp',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        'copy_nplb_file_tests_data',
-      ],
-      'conditions': [
-        ['sb_evergreen != 1', {
-          'sources': [
-            # Segfaults or causes unresolved symbols for Cobalt Evergreen.
-            'media_set_audio_write_duration_test.cc',
-          ],
-        }],
-        ['sb_disable_cpp17_audit == 0', {
-          'dependencies': [
-            '<(DEPTH)/starboard/nplb/compiler_compliance/compiler_compliance.gyp:cpp17_supported',
-          ],
-        }],
-        ['gl_type != "none"', {
-          'dependencies': [
-             # This is needed because SbPlayerTest depends on
-             # FakeGraphicsContextProvider which depends on EGL and GLES.
-            '<(DEPTH)/starboard/egl_and_gles/egl_and_gles.gyp:egl_and_gles',
-          ],
-        }],
-      ],
-      'includes': [ '<(DEPTH)/starboard/nplb/sabi/sabi.gypi' ],
-    },
-    {
-      'target_name': 'copy_nplb_file_tests_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<(DEPTH)/starboard/nplb/testdata/file_tests/dir_with_files',
-          '<(DEPTH)/starboard/nplb/testdata/file_tests/dir_with_only_subdir',
-          '<(DEPTH)/starboard/nplb/testdata/file_tests/file01',
-          '<(DEPTH)/starboard/nplb/testdata/file_tests/file_with_long_name_and_contents_for_seek_testing_1234567890',
-        ],
-        'content_test_output_subdir': 'starboard/nplb/file_tests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/copy_test_data.gypi' ],
-    },
-    {
-      'target_name': 'nplb_deploy',
-      'type': 'none',
-      'dependencies': [
-        'nplb',
-      ],
-      'variables': {
-        'executable_name': 'nplb',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/nplb/nplb_evergreen_compat_tests/checks.h b/starboard/nplb/nplb_evergreen_compat_tests/checks.h
index d197064..042e5c1 100644
--- a/starboard/nplb/nplb_evergreen_compat_tests/checks.h
+++ b/starboard/nplb/nplb_evergreen_compat_tests/checks.h
@@ -19,20 +19,6 @@
 
 #if SB_IS(EVERGREEN_COMPATIBLE)
 
-#if SB_API_VERSION < 12
-#error "Evergreen requires starboard version 12 or higher!"
-#endif
-
-#if SB_API_VERSION < 12 && !SB_IS(EVERGREEN_COMPATIBLE_LITE)
-#error \
-    "Evergreen requires support for the kSbSystemPathStorageDirectory" \
-    " system property!"
-#endif
-
-#if SB_API_VERSION < 12
-#error "Evergreen requires memory mapping!"
-#endif
-
 #if !SB_CAN(MAP_EXECUTABLE_MEMORY)
 #error "Evergreen requires executable memory support!"
 #endif
diff --git a/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp b/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp
deleted file mode 100644
index 1f2b9a73..0000000
--- a/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'nplb_evergreen_compat_tests',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'checks.h',
-        'crashpad_config_test.cc',
-        'executable_memory_test.cc',
-        'fonts_test.cc',
-        'sabi_test.cc',
-        '<(DEPTH)/starboard/common/test_main.cc',
-      ],
-      'conditions': [
-        ['sb_evergreen_compatible_lite!=1', {
-          'sources': [
-            'icu_test.cc',
-            'max_file_name_test.cc',
-            'storage_test.cc',
-          ],
-        }],
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'nplb_evergreen_compat_tests_deploy',
-      'type': 'none',
-      'dependencies': [
-        'nplb_evergreen_compat_tests',
-      ],
-      'variables': {
-        'executable_name': 'nplb_evergreen_compat_tests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/nplb/once_test.cc b/starboard/nplb/once_test.cc
index 90e56ed..62f7363 100644
--- a/starboard/nplb/once_test.cc
+++ b/starboard/nplb/once_test.cc
@@ -18,7 +18,6 @@
 #include "starboard/configuration_constants.h"
 #include "starboard/nplb/thread_helpers.h"
 #include "starboard/thread.h"
-#include "starboard/thread_types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace starboard {
diff --git a/starboard/nplb/player_creation_param_helpers.cc b/starboard/nplb/player_creation_param_helpers.cc
index 26c6c0f..65eddde 100644
--- a/starboard/nplb/player_creation_param_helpers.cc
+++ b/starboard/nplb/player_creation_param_helpers.cc
@@ -23,10 +23,7 @@
   SbMediaAudioSampleInfo audio_sample_info = {};
 
   audio_sample_info.codec = codec;
-
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   audio_sample_info.mime = "";
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
   switch (codec) {
     case kSbMediaAudioCodecNone:
@@ -106,11 +103,8 @@
 
   video_sample_info.codec = codec;
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   video_sample_info.mime = "";
   video_sample_info.max_video_capabilities = "";
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
   video_sample_info.color_metadata.primaries = kSbMediaPrimaryIdBt709;
   video_sample_info.color_metadata.transfer = kSbMediaTransferIdBt709;
   video_sample_info.color_metadata.matrix = kSbMediaMatrixIdBt709;
@@ -122,8 +116,6 @@
   return video_sample_info;
 }
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 SbPlayerCreationParam CreatePlayerCreationParam(SbMediaAudioCodec audio_codec,
                                                 SbMediaVideoCodec video_codec) {
   SbPlayerCreationParam creation_param = {};
@@ -136,7 +128,5 @@
   return creation_param;
 }
 
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/player_creation_param_helpers.h b/starboard/nplb/player_creation_param_helpers.h
index 8cb327d..50755bf 100644
--- a/starboard/nplb/player_creation_param_helpers.h
+++ b/starboard/nplb/player_creation_param_helpers.h
@@ -25,11 +25,8 @@
 
 SbMediaAudioSampleInfo CreateAudioSampleInfo(SbMediaAudioCodec codec);
 SbMediaVideoSampleInfo CreateVideoSampleInfo(SbMediaVideoCodec codec);
-
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 SbPlayerCreationParam CreatePlayerCreationParam(SbMediaAudioCodec audio_codec,
                                                 SbMediaVideoCodec video_codec);
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/player_get_preferred_output_mode_test.cc b/starboard/nplb/player_get_preferred_output_mode_test.cc
index 83730a2..40f68f5 100644
--- a/starboard/nplb/player_get_preferred_output_mode_test.cc
+++ b/starboard/nplb/player_get_preferred_output_mode_test.cc
@@ -18,8 +18,6 @@
 #include "starboard/nplb/player_creation_param_helpers.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 namespace starboard {
 namespace nplb {
 namespace {
@@ -51,15 +49,9 @@
       kSbMediaAudioCodecEac3, kSbMediaAudioCodecOpus, kSbMediaAudioCodecVorbis,
   };
   const SbMediaVideoCodec kVideoCodecs[] = {
-    kSbMediaVideoCodecNone,
-    kSbMediaVideoCodecH264,
-    kSbMediaVideoCodecH265,
-    kSbMediaVideoCodecMpeg2,
-    kSbMediaVideoCodecTheora,
-    kSbMediaVideoCodecVc1,
-    kSbMediaVideoCodecAv1,
-    kSbMediaVideoCodecVp8,
-    kSbMediaVideoCodecVp9,
+      kSbMediaVideoCodecNone,  kSbMediaVideoCodecH264,   kSbMediaVideoCodecH265,
+      kSbMediaVideoCodecMpeg2, kSbMediaVideoCodecTheora, kSbMediaVideoCodecVc1,
+      kSbMediaVideoCodecAv1,   kSbMediaVideoCodecVp8,    kSbMediaVideoCodecVp9,
   };
   const SbPlayerOutputMode kOutputModes[] = {
       kSbPlayerOutputModeDecodeToTexture, kSbPlayerOutputModePunchOut,
@@ -81,5 +73,3 @@
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
-
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
diff --git a/starboard/nplb/player_output_mode_supported_test.cc b/starboard/nplb/player_output_mode_supported_test.cc
deleted file mode 100644
index d4e77f2..0000000
--- a/starboard/nplb/player_output_mode_supported_test.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/player.h"
-
-#include "starboard/window.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace starboard {
-namespace nplb {
-namespace {
-
-#if !SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-TEST(SbPlayerOutputModeSupportedTest, SunnyDay) {
-  SbMediaVideoCodec kVideoCodec = kSbMediaVideoCodecH264;
-  SbDrmSystem kDrmSystem = kSbDrmSystemInvalid;
-
-  // We should support either decode-to-texture or punch-out mode.
-  SbPlayerOutputMode output_mode = kSbPlayerOutputModeInvalid;
-  if (SbPlayerOutputModeSupported(kSbPlayerOutputModeDecodeToTexture,
-                                  kVideoCodec, kDrmSystem)) {
-    output_mode = kSbPlayerOutputModeDecodeToTexture;
-  } else if (SbPlayerOutputModeSupported(kSbPlayerOutputModePunchOut,
-                                         kVideoCodec, kDrmSystem)) {
-    output_mode = kSbPlayerOutputModePunchOut;
-  }
-  ASSERT_NE(kSbPlayerOutputModeInvalid, output_mode);
-}
-
-TEST(SbPlayerOutputModeSupportedTest, RainyDayInvalid) {
-  SbMediaVideoCodec kVideoCodec = kSbMediaVideoCodecH264;
-  SbDrmSystem kDrmSystem = kSbDrmSystemInvalid;
-
-  bool result = SbPlayerOutputModeSupported(kSbPlayerOutputModeInvalid,
-                                            kVideoCodec, kDrmSystem);
-  EXPECT_FALSE(result);
-}
-
-#endif  // !SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-}  // namespace
-}  // namespace nplb
-}  // namespace starboard
diff --git a/starboard/nplb/player_test_util.cc b/starboard/nplb/player_test_util.cc
index ddcacf1..8c06675 100644
--- a/starboard/nplb/player_test_util.cc
+++ b/starboard/nplb/player_test_util.cc
@@ -151,8 +151,6 @@
     void* context,
     SbPlayerOutputMode output_mode,
     SbDecodeTargetGraphicsContextProvider* context_provider) {
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
   if (audio_sample_info) {
     SB_CHECK(audio_sample_info->codec == audio_codec);
   } else {
@@ -172,30 +170,15 @@
   return SbPlayerCreate(window, &creation_param, sample_deallocate_func,
                         decoder_status_func, player_status_func,
                         player_error_func, context, context_provider);
-
-#else  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-  return SbPlayerCreate(window, video_codec, audio_codec, kSbDrmSystemInvalid,
-                        audio_sample_info, max_video_capabilities,
-                        sample_deallocate_func, decoder_status_func,
-                        player_status_func, player_error_func, context,
-                        output_mode, context_provider);
-
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 }
 
 bool IsOutputModeSupported(SbPlayerOutputMode output_mode,
                            SbMediaAudioCodec audio_codec,
                            SbMediaVideoCodec video_codec) {
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   SbPlayerCreationParam creation_param =
       CreatePlayerCreationParam(audio_codec, video_codec);
   creation_param.output_mode = output_mode;
   return SbPlayerGetPreferredOutputMode(&creation_param) == output_mode;
-#else   // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-  return SbPlayerOutputModeSupported(output_mode, video_codec,
-                                     kSbDrmSystemInvalid);
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 }
 
 }  // namespace nplb
diff --git a/starboard/nplb/player_write_sample_test.cc b/starboard/nplb/player_write_sample_test.cc
index 0a5d6fd..f80bb0e 100644
--- a/starboard/nplb/player_write_sample_test.cc
+++ b/starboard/nplb/player_write_sample_test.cc
@@ -296,9 +296,7 @@
   fake_graphics_context_provider_.RunOnGlesContextThread([&]() {
     ASSERT_TRUE(SbPlayerIsValid(player_));
     if (output_mode_ != kSbPlayerOutputModeDecodeToTexture) {
-#if SB_API_VERSION >= 12
       ASSERT_EQ(SbPlayerGetCurrentFrame(player_), kSbDecodeTargetInvalid);
-#endif  // SB_API_VERSION >= 12
       return;
     }
     ASSERT_EQ(output_mode_, kSbPlayerOutputModeDecodeToTexture);
@@ -318,13 +316,6 @@
     case kSbPlayerDecoderStateNeedsData:
       callback_event_queue_.Put(CallbackEvent(player, state, ticket));
       break;
-#if SB_API_VERSION < 12
-    // Note: we do not add these events to the queue since these states are not
-    // used in Cobalt and are being deprecated.
-    case kSbPlayerDecoderStateBufferFull:
-    case kSbPlayerDecoderStateDestroyed:
-      break;
-#endif  // SB_API_VERSION < 12
   }
 }
 
diff --git a/starboard/nplb/sabi/alignment_test.cc b/starboard/nplb/sabi/alignment_test.cc
index d438d2e..c569298 100644
--- a/starboard/nplb/sabi/alignment_test.cc
+++ b/starboard/nplb/sabi/alignment_test.cc
@@ -14,8 +14,6 @@
 
 #include "starboard/configuration.h"
 
-#if SB_API_VERSION >= 12
-
 namespace starboard {
 namespace sabi {
 namespace {
@@ -23,8 +21,9 @@
 SB_COMPILE_ASSERT(SB_ALIGNOF(char) == SB_ALIGNMENT_OF_CHAR,
                   SB_ALIGNMENT_OF_CHAR_is_inconsistent_with_SB_ALIGNOF_char);
 
-SB_COMPILE_ASSERT(SB_ALIGNOF(double) == SB_ALIGNMENT_OF_DOUBLE,
-                  SB_ALIGNMENT_OF_DOUBLE_is_inconsistent_with_SB_ALIGNOF_double);
+SB_COMPILE_ASSERT(
+    SB_ALIGNOF(double) == SB_ALIGNMENT_OF_DOUBLE,
+    SB_ALIGNMENT_OF_DOUBLE_is_inconsistent_with_SB_ALIGNOF_double);
 
 SB_COMPILE_ASSERT(SB_ALIGNOF(float) == SB_ALIGNMENT_OF_FLOAT,
                   SB_ALIGNMENT_OF_FLOAT_is_inconsistent_with_SB_ALIGNOF_float);
@@ -32,20 +31,22 @@
 SB_COMPILE_ASSERT(SB_ALIGNOF(int) == SB_ALIGNMENT_OF_INT,
                   SB_ALIGNMENT_OF_INT_is_inconsistent_with_SB_ALIGNOF_int);
 
-SB_COMPILE_ASSERT(SB_ALIGNOF(int*) == SB_ALIGNMENT_OF_POINTER,
-                  SB_ALIGNMENT_OF_POINTER_is_inconsistent_with_SB_ALIGNOF_pointer);
+SB_COMPILE_ASSERT(
+    SB_ALIGNOF(int*) == SB_ALIGNMENT_OF_POINTER,
+    SB_ALIGNMENT_OF_POINTER_is_inconsistent_with_SB_ALIGNOF_pointer);
 
-SB_COMPILE_ASSERT(SB_ALIGNOF(long) == SB_ALIGNMENT_OF_LONG,  // NOLINT(runtime/int)
+SB_COMPILE_ASSERT(SB_ALIGNOF(long) ==        // NOLINT(runtime/int)
+                      SB_ALIGNMENT_OF_LONG,  // NOLINT(runtime/int)
                   SB_ALIGNMENT_OF_LONG_is_inconsistent_with_SB_ALIGNOF_long);
 
-SB_COMPILE_ASSERT(SB_ALIGNOF(long long) == SB_ALIGNMENT_OF_LLONG,  // NOLINT(runtime/int)
-                  SB_ALIGNMENT_OF_LLONG_is_inconsistent_with_SB_ALIGNOF_long_long);
+SB_COMPILE_ASSERT(
+    SB_ALIGNOF(long long) == SB_ALIGNMENT_OF_LLONG,  // NOLINT(runtime/int)
+    SB_ALIGNMENT_OF_LLONG_is_inconsistent_with_SB_ALIGNOF_long_long);
 
-SB_COMPILE_ASSERT(SB_ALIGNOF(short) == SB_ALIGNMENT_OF_SHORT,  // NOLINT(runtime/int)
+SB_COMPILE_ASSERT(SB_ALIGNOF(short) ==        // NOLINT(runtime/int)
+                      SB_ALIGNMENT_OF_SHORT,  // NOLINT(runtime/int)
                   SB_ALIGNMENT_OF_SHORT_is_inconsistent_with_SB_ALIGNOF_short);
 
 }  // namespace
 }  // namespace sabi
 }  // namespace starboard
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/nplb/sabi/endianness_test.cc b/starboard/nplb/sabi/endianness_test.cc
index 59e692c..3abe275 100644
--- a/starboard/nplb/sabi/endianness_test.cc
+++ b/starboard/nplb/sabi/endianness_test.cc
@@ -15,8 +15,6 @@
 #include "starboard/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12
-
 namespace starboard {
 namespace sabi {
 namespace {
@@ -25,7 +23,7 @@
 
 #if SB_IS(BIG_ENDIAN)
 static constexpr uint8_t kBytes[] = {0xC0, 0xBA, 0x17, 0x21};
-#else  // !SB_IS(BIG_ENDIAN)
+#else   // !SB_IS(BIG_ENDIAN)
 static constexpr uint8_t kBytes[] = {0x21, 0x17, 0xBA, 0xC0};
 #endif  // SB_IS(BIG_ENDIAN)
 
@@ -39,5 +37,3 @@
 
 }  // namespace sabi
 }  // namespace starboard
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/nplb/sabi/sabi.gypi b/starboard/nplb/sabi/sabi.gypi
deleted file mode 100644
index 19c69ed..0000000
--- a/starboard/nplb/sabi/sabi.gypi
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sabi_sources': [
-      '<(DEPTH)/starboard/nplb/sabi/alignment_test.cc',
-      '<(DEPTH)/starboard/nplb/sabi/endianness_test.cc',
-      '<(DEPTH)/starboard/nplb/sabi/signedness_and_size_of_enum_test.cc',
-      '<(DEPTH)/starboard/nplb/sabi/signedness_of_char_test.cc',
-      '<(DEPTH)/starboard/nplb/sabi/size_test.cc',
-      '<(DEPTH)/starboard/nplb/sabi/struct_alignment_test.cc',
-    ],
-  },
-}
diff --git a/starboard/nplb/sabi/signedness_and_size_of_enum_test.cc b/starboard/nplb/sabi/signedness_and_size_of_enum_test.cc
index dc23761..9b60c15 100644
--- a/starboard/nplb/sabi/signedness_and_size_of_enum_test.cc
+++ b/starboard/nplb/sabi/signedness_and_size_of_enum_test.cc
@@ -14,8 +14,6 @@
 
 #include "starboard/configuration.h"
 
-#if SB_API_VERSION >= 12
-
 namespace starboard {
 namespace sabi {
 namespace {
@@ -33,5 +31,3 @@
 }  // namespace
 }  // namespace sabi
 }  // namespace starboard
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/nplb/sabi/signedness_of_char_test.cc b/starboard/nplb/sabi/signedness_of_char_test.cc
index 97ffe23..086f503 100644
--- a/starboard/nplb/sabi/signedness_of_char_test.cc
+++ b/starboard/nplb/sabi/signedness_of_char_test.cc
@@ -14,17 +14,14 @@
 
 #include "starboard/configuration.h"
 
-#if SB_API_VERSION >= 12
-
 namespace starboard {
 namespace sabi {
 namespace {
 
-SB_COMPILE_ASSERT((static_cast<char>(-1) < 0) == SB_HAS_SIGNED_CHAR,  // NOLINT(readability/casting)
+SB_COMPILE_ASSERT((static_cast<char>(-1) < 0) ==
+                      SB_HAS_SIGNED_CHAR,  // NOLINT(readability/casting)
                   SB_HAS_SIGNED_CHAR_is_inconsistent_with_sign_of_char);
 
 }  // namespace
 }  // namespace sabi
 }  // namespace starboard
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/nplb/sabi/size_test.cc b/starboard/nplb/sabi/size_test.cc
index 2876999..bf0716b 100644
--- a/starboard/nplb/sabi/size_test.cc
+++ b/starboard/nplb/sabi/size_test.cc
@@ -14,8 +14,6 @@
 
 #include "starboard/configuration.h"
 
-#if SB_API_VERSION >= 12
-
 namespace starboard {
 namespace sabi {
 namespace {
@@ -47,5 +45,3 @@
 }  // namespace
 }  // namespace sabi
 }  // namespace starboard
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/nplb/sabi/struct_alignment_test.cc b/starboard/nplb/sabi/struct_alignment_test.cc
index 81ff373..74fba69 100644
--- a/starboard/nplb/sabi/struct_alignment_test.cc
+++ b/starboard/nplb/sabi/struct_alignment_test.cc
@@ -17,12 +17,10 @@
 #include "starboard/configuration.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if SB_API_VERSION >= 12
-
 // 8-byte integers make structs 4-byte aligned on x86.
 #if SB_IS(ARCH_X86)
 #define ALIGNMENT_8_BYTE_INT 4
-#else   // !SB_IS(ARCH_X86)
+#else  // !SB_IS(ARCH_X86)
 #define ALIGNMENT_8_BYTE_INT 8
 #endif  // SB_IS(ARCH_X86)
 
@@ -30,7 +28,7 @@
 namespace sabi {
 namespace {
 
-static const int8_t kInt8   = 0x74;
+static const int8_t kInt8 = 0x74;
 static const int16_t kInt16 = 0x2DEF;
 static const int32_t kInt32 = 0x35C7ADD2;
 static const int64_t kInt64 = 0x16FE0870D4784352;
@@ -153,7 +151,7 @@
 }
 
 TEST(SbSabiStructAlignmentTest, NestedUnion) {
-  const Struct4 struct4 = { kInt8, kInt32, kInt8 };
+  const Struct4 struct4 = {kInt8, kInt32, kInt8};
   const int8_t* base = reinterpret_cast<const int8_t*>(&struct4);
 
   EXPECT_EQ(kInt8, *base);
@@ -165,5 +163,3 @@
 }  // namespace starboard
 
 #undef ALIGNMENT_8_BYTE_INT
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/nplb/socket_get_interface_address_test.cc b/starboard/nplb/socket_get_interface_address_test.cc
index 6ea2e81..9a01488 100644
--- a/starboard/nplb/socket_get_interface_address_test.cc
+++ b/starboard/nplb/socket_get_interface_address_test.cc
@@ -126,7 +126,6 @@
   SbSocketGetInterfaceAddress(&destination_address, &source, &netmask);
 
   EXPECT_EQ(GetAddressType(), source.type);
-  EXPECT_NE(0, source.port);
   // A netmask that starts with 0 is likely incorrect.
   EXPECT_TRUE(netmask.address[0] & 0x80);
   EXPECT_EQ(GetAddressType(), netmask.type);
diff --git a/starboard/nplb/speech_recognizer_cancel_test.cc b/starboard/nplb/speech_recognizer_cancel_test.cc
index f92f4af..5d5204b 100644
--- a/starboard/nplb/speech_recognizer_cancel_test.cc
+++ b/starboard/nplb/speech_recognizer_cancel_test.cc
@@ -20,8 +20,6 @@
 namespace starboard {
 namespace nplb {
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 TEST_F(SpeechRecognizerTest, CancelTestSunnyDay) {
   if (SkipLocale())
     return;
@@ -73,7 +71,5 @@
   SbSpeechRecognizerCancel(kSbSpeechRecognizerInvalid);
 }
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/speech_recognizer_create_test.cc b/starboard/nplb/speech_recognizer_create_test.cc
index 34555e3..52c5af6 100644
--- a/starboard/nplb/speech_recognizer_create_test.cc
+++ b/starboard/nplb/speech_recognizer_create_test.cc
@@ -19,8 +19,6 @@
 namespace starboard {
 namespace nplb {
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 TEST_F(SpeechRecognizerTest, CreateTestSunnyDay) {
   if (SkipLocale())
     return;
@@ -29,7 +27,5 @@
   SbSpeechRecognizerDestroy(recognizer);
 }
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/speech_recognizer_destroy_test.cc b/starboard/nplb/speech_recognizer_destroy_test.cc
index 18d95a1..94c94c9 100644
--- a/starboard/nplb/speech_recognizer_destroy_test.cc
+++ b/starboard/nplb/speech_recognizer_destroy_test.cc
@@ -19,8 +19,6 @@
 namespace starboard {
 namespace nplb {
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 TEST_F(SpeechRecognizerTest, DestroyInvalidSpeechRecognizer) {
   if (SkipLocale())
     return;
@@ -37,7 +35,5 @@
   SbSpeechRecognizerDestroy(recognizer);
 }
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/speech_recognizer_helper.h b/starboard/nplb/speech_recognizer_helper.h
index 09b326d..d4e04e8 100644
--- a/starboard/nplb/speech_recognizer_helper.h
+++ b/starboard/nplb/speech_recognizer_helper.h
@@ -25,8 +25,6 @@
 namespace starboard {
 namespace nplb {
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 class SpeechRecognizerTest : public ::testing::Test {
  public:
   SpeechRecognizerTest() : handler_() {
@@ -43,9 +41,7 @@
                         int results_size,
                         bool is_final) {}
 
-  SbSpeechRecognizerHandler* handler() {
-    return &handler_;
-  }
+  SbSpeechRecognizerHandler* handler() { return &handler_; }
 
  protected:
   bool isTestFixtureSupported;
@@ -53,11 +49,7 @@
     // We include all API tests at compile time after Starboard version 12, so
     // we must do a runtime check to determine whether or not that API (and
     // thus the test fixture) is supported.
-#if SB_API_VERSION >= 12
     isTestFixtureSupported = SbSpeechRecognizerIsSupported();
-#else
-    isTestFixtureSupported = true;
-#endif
   }
 
   // TODO: Use GTEST_SKIP in |SetUp| when we have a newer version of gtest.
@@ -82,8 +74,6 @@
   SbSpeechRecognizerHandler handler_;
 };
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 }  // namespace nplb
 }  // namespace starboard
 
diff --git a/starboard/nplb/speech_recognizer_start_test.cc b/starboard/nplb/speech_recognizer_start_test.cc
index 747abbb..1d5c117 100644
--- a/starboard/nplb/speech_recognizer_start_test.cc
+++ b/starboard/nplb/speech_recognizer_start_test.cc
@@ -19,8 +19,6 @@
 namespace starboard {
 namespace nplb {
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 TEST_F(SpeechRecognizerTest, StartTestSunnyDay) {
   if (SkipLocale())
     return;
@@ -113,7 +111,5 @@
   EXPECT_FALSE(success);
 }
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/speech_recognizer_stop_test.cc b/starboard/nplb/speech_recognizer_stop_test.cc
index 796bad0..58cfb3e 100644
--- a/starboard/nplb/speech_recognizer_stop_test.cc
+++ b/starboard/nplb/speech_recognizer_stop_test.cc
@@ -19,8 +19,6 @@
 namespace starboard {
 namespace nplb {
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 TEST_F(SpeechRecognizerTest, StopIsCalledMultipleTimes) {
   if (SkipLocale())
     return;
@@ -39,7 +37,5 @@
   SbSpeechRecognizerDestroy(recognizer);
 }
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/speech_synthesis_basic_test.cc b/starboard/nplb/speech_synthesis_basic_test.cc
index e99e060..aadf06f 100644
--- a/starboard/nplb/speech_synthesis_basic_test.cc
+++ b/starboard/nplb/speech_synthesis_basic_test.cc
@@ -19,22 +19,15 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_SYNTHESIS)
-
 TEST(SbSpeechSynthesisBasicTest, Basic) {
-#if SB_API_VERSION >= 12
   if (!SbSpeechSynthesisIsSupported()) {
     SB_LOG(INFO) << "Speech synthesis not supported. Test skipped.";
     return;
   }
-#endif
   SbSpeechSynthesisSpeak("Hello");
   SbSpeechSynthesisCancel();
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(SPEECH_SYNTHESIS)
-
 }  // namespace
 }  // namespace nplb
 }  // namespace starboard
diff --git a/starboard/nplb/system_get_path_test.cc b/starboard/nplb/system_get_path_test.cc
index 44138ac..7167746 100644
--- a/starboard/nplb/system_get_path_test.cc
+++ b/starboard/nplb/system_get_path_test.cc
@@ -94,7 +94,9 @@
 TEST(SbSystemGetPathTest, DoesNotBlowUpForDefinedIds) {
   BasicTest(kSbSystemPathDebugOutputDirectory, false, false, __LINE__);
   BasicTest(kSbSystemPathTempDirectory, false, false, __LINE__);
+#if SB_API_VERSION < SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED
   BasicTest(kSbSystemPathTestOutputDirectory, false, false, __LINE__);
+#endif  // #if SB_API_VERSION < SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED
   BasicTest(kSbSystemPathCacheDirectory, false, false, __LINE__);
   BasicTest(kSbSystemPathFontDirectory, false, false, __LINE__);
   BasicTest(kSbSystemPathFontConfigurationDirectory, false, false, __LINE__);
@@ -103,7 +105,9 @@
 TEST(SbSystemGetPathTest, DoesNotTouchOutputBufferOnFailureForDefinedIds) {
   UnmodifiedOnFailureTest(kSbSystemPathDebugOutputDirectory, __LINE__);
   UnmodifiedOnFailureTest(kSbSystemPathTempDirectory, __LINE__);
+#if SB_API_VERSION < SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED
   UnmodifiedOnFailureTest(kSbSystemPathTestOutputDirectory, __LINE__);
+#endif  // #if SB_API_VERSION < SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED
   UnmodifiedOnFailureTest(kSbSystemPathCacheDirectory, __LINE__);
   UnmodifiedOnFailureTest(kSbSystemPathFontDirectory, __LINE__);
   UnmodifiedOnFailureTest(kSbSystemPathFontConfigurationDirectory, __LINE__);
diff --git a/starboard/nplb/system_get_property_test.cc b/starboard/nplb/system_get_property_test.cc
index 7f55fc9..55e559f 100644
--- a/starboard/nplb/system_get_property_test.cc
+++ b/starboard/nplb/system_get_property_test.cc
@@ -81,12 +81,7 @@
 
   BasicTest(kSbSystemPropertyChipsetModelNumber, false, true, __LINE__);
   BasicTest(kSbSystemPropertyFirmwareVersion, false, true, __LINE__);
-#if SB_API_VERSION >= 12
   BasicTest(kSbSystemPropertySystemIntegratorName, false, true, __LINE__);
-#else
-  BasicTest(kSbSystemPropertyOriginalDesignManufacturerName,
-            false, true, __LINE__);
-#endif
   BasicTest(kSbSystemPropertySpeechApiKey, false, true, __LINE__);
 
   if (IsCEDevice(SbSystemGetDeviceType())) {
@@ -126,12 +121,7 @@
   UnmodifiedOnFailureTest(kSbSystemPropertyBrandName, __LINE__);
   UnmodifiedOnFailureTest(kSbSystemPropertyModelName, __LINE__);
   UnmodifiedOnFailureTest(kSbSystemPropertyModelYear, __LINE__);
-#if SB_API_VERSION >= 12
   UnmodifiedOnFailureTest(kSbSystemPropertySystemIntegratorName, __LINE__);
-#else
-  UnmodifiedOnFailureTest(kSbSystemPropertyOriginalDesignManufacturerName,
-                          __LINE__);
-#endif
   UnmodifiedOnFailureTest(kSbSystemPropertyPlatformName, __LINE__);
   UnmodifiedOnFailureTest(kSbSystemPropertySpeechApiKey, __LINE__);
   UnmodifiedOnFailureTest(kSbSystemPropertyUserAgentAuxField, __LINE__);
@@ -149,18 +139,14 @@
   }
 
   SbSystemPropertyId enum_values[] = {
-    kSbSystemPropertyChipsetModelNumber,
-    kSbSystemPropertyFirmwareVersion,
-    kSbSystemPropertyFriendlyName,
-    kSbSystemPropertyManufacturerName,
-    kSbSystemPropertyModelName,
-    kSbSystemPropertyModelYear,
-#if SB_API_VERSION >= 12
-    kSbSystemPropertySystemIntegratorName,
-#else
-    kSbSystemPropertyOriginalDesignManufacturerName,
-#endif
-    kSbSystemPropertyPlatformName,
+      kSbSystemPropertyChipsetModelNumber,
+      kSbSystemPropertyFirmwareVersion,
+      kSbSystemPropertyFriendlyName,
+      kSbSystemPropertyManufacturerName,
+      kSbSystemPropertyModelName,
+      kSbSystemPropertyModelYear,
+      kSbSystemPropertySystemIntegratorName,
+      kSbSystemPropertyPlatformName,
   };
 
   for (SbSystemPropertyId val : enum_values) {
diff --git a/starboard/nplb/ui_navigation_test.cc b/starboard/nplb/ui_navigation_test.cc
index 329255b..62a4469 100644
--- a/starboard/nplb/ui_navigation_test.cc
+++ b/starboard/nplb/ui_navigation_test.cc
@@ -19,16 +19,12 @@
 namespace nplb {
 namespace {
 
-#if SB_API_VERSION >= 12
-
 // This verifies that the UI navigation API is not implemented.
 TEST(UiNavigationTest, GetInterface) {
   SbUiNavInterface interface;
   EXPECT_FALSE(SbUiNavGetInterface(&interface));
 }
 
-#endif  // SB_API_VERSION >= 12
-
 }  // namespace.
 }  // namespace nplb.
 }  // namespace starboard.
diff --git a/starboard/once.h b/starboard/once.h
index beaacb0..ad8c274 100644
--- a/starboard/once.h
+++ b/starboard/once.h
@@ -21,15 +21,12 @@
 #define STARBOARD_ONCE_H_
 
 #include "starboard/export.h"
-#include "starboard/thread_types.h"
 #include "starboard/types.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#if SB_API_VERSION >= 12
-
 // Max size of the SbOnceControl type.
 #define SB_ONCE_MAX_SIZE 64
 
@@ -53,8 +50,6 @@
   { 0 }
 #endif
 
-#endif  // SB_API_VERSION >= 12
-
 // Function pointer type for methods that can be called via the SbOnce() system.
 typedef void (*SbOnceInitRoutine)(void);
 
@@ -81,18 +76,16 @@
 //   MyClass* instance = GetOrCreateMyClass();
 //   MyClass* instance2 = GetOrCreateMyClass();
 //   DCHECK_EQ(instance, instance2);
-#define SB_ONCE_INITIALIZE_FUNCTION(Type, FunctionName)    \
-Type* FunctionName() {                                     \
-  static SbOnceControl s_once_flag = SB_ONCE_INITIALIZER;  \
-  static Type* s_singleton = NULL;                         \
-  struct Local {                                           \
-    static void Init() {                                   \
-      s_singleton = new Type();                            \
-    }                                                      \
-  };                                                       \
-  SbOnce(&s_once_flag, Local::Init);                       \
-  return s_singleton;                                      \
-}
+#define SB_ONCE_INITIALIZE_FUNCTION(Type, FunctionName)     \
+  Type* FunctionName() {                                    \
+    static SbOnceControl s_once_flag = SB_ONCE_INITIALIZER; \
+    static Type* s_singleton = NULL;                        \
+    struct Local {                                          \
+      static void Init() { s_singleton = new Type(); }      \
+    };                                                      \
+    SbOnce(&s_once_flag, Local::Init);                      \
+    return s_singleton;                                     \
+  }
 #endif  // __cplusplus
 
 #ifdef __cplusplus
diff --git a/starboard/optional/_env.py b/starboard/optional/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/starboard/optional/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/optional/get_optional_tests.py b/starboard/optional/get_optional_tests.py
deleted file mode 100644
index 678abae..0000000
--- a/starboard/optional/get_optional_tests.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Returns optional test targets for use in GYP or Python."""
-
-import _env  # pylint: disable=unused-import
-
-import argparse
-import os
-import posixpath
-import sys
-
-from starboard.tools import paths
-
-
-def _Posixify(path):
-  """Returns a normalized, POSIX-ified version of |path|.
-
-  When providing dependencies in GYP the paths must be POSIX paths. This
-  function normalizes |path|, and replaces the path separators with the POSIX
-  path separator.
-
-  Args:
-    path: The path to turn into a normalized, POSIX path.
-
-  Returns:
-    A normalized, POSIX path.
-  """
-  return os.path.normpath(path).replace(os.path.sep, posixpath.sep)
-
-
-def GetOptionalTestTargets(as_gyp_dependencies=False, depth=''):
-  """Returns optional test targets for use in GYP or Python.
-
-  This function will try to import optional test targets, and fail gracefully if
-  they cannot be imported.
-
-  When the test targets should be returned in a GYP-friendly format we need to
-  ensure that the paths are POSIX paths, and that they are concatenated into a
-  single string, delimited by newlines.
-
-  Args:
-    as_gyp_dependencies: Whether or not the test targets should be returned in a
-      GYP-friendly format.
-    depth: The <(DEPTH) of GYP, i.e. the path to prepend to each test target
-      when |as_gyp_dependencies| is |True|.
-
-  Returns:
-    When |as_gyp_dependencies| is |True|, a string of concatenated paths to test
-    targets, otherwise a list of test targets. On failure, either an empty
-    string or an empty list.
-  """
-  try:
-    # pylint: disable=g-import-not-at-top
-    from starboard.optional.internal import test_targets
-    if as_gyp_dependencies:
-      return '\n'.join([
-          _Posixify(os.path.join(depth, path))
-          for path in test_targets.TEST_TARGET_GYP_DEPENDENCIES
-      ])
-    return test_targets.TEST_TARGET_NAMES
-  except ImportError:
-    pass
-  return '' if as_gyp_dependencies else []
-
-
-def DoMain(argv=None):
-  """Function to allow the use of this script from GYP's pymod_do_main."""
-  arg_parser = argparse.ArgumentParser()
-  arg_parser.add_argument(
-      '-g',
-      '--as-gyp-dependencies',
-      action='store_true',
-      default=False,
-      help='Whether or not to return the test targets in a GYP-friendly format.'
-  )
-  arg_parser.add_argument(
-      '-d',
-      '--depth',
-      default='',
-      help='The <(DEPTH) of GYP, i.e. the path to prepend to each test target.')
-  args, _ = arg_parser.parse_known_args(argv)
-
-  if args.as_gyp_dependencies != bool(args.depth):
-    arg_parser.error('You must specify both --as-gyp-dependencies and --depth.')
-  return GetOptionalTestTargets(args.as_gyp_dependencies, args.depth)
-
-
-def main():
-  print(DoMain())
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/starboard/player.h b/starboard/player.h
index 4919c43..cde4c7a 100644
--- a/starboard/player.h
+++ b/starboard/player.h
@@ -38,15 +38,6 @@
 typedef enum SbPlayerDecoderState {
   // The decoder is asking for one more sample.
   kSbPlayerDecoderStateNeedsData,
-
-#if SB_API_VERSION < 12
-  // The decoder is not ready for any more samples, so do not send them.  Note
-  // that this enum value has been deprecated and the SbPlayer implementation
-  // should no longer use this value.
-  kSbPlayerDecoderStateBufferFull,
-  // The player has been destroyed, and will send no more callbacks.
-  kSbPlayerDecoderStateDestroyed,
-#endif  // SB_API_VERSION < 12
 } SbPlayerDecoderState;
 
 // An indicator of the general playback state.
@@ -106,8 +97,6 @@
   kSbPlayerOutputModeInvalid,
 } SbPlayerOutputMode;
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 // The playback related parameters to pass into SbPlayerCreate() and
 // SbPlayerGetPreferredOutputMode().
 typedef struct SbPlayerCreationParam {
@@ -132,8 +121,6 @@
   SbPlayerOutputMode output_mode;
 } SbPlayerCreationParam;
 
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 // Identify the type of side data accompanied with |SbPlayerSampleInfo|, as side
 // data may come from multiple sources.
 typedef enum SbPlayerSampleSideDataType {
@@ -400,8 +387,6 @@
 // |decoder_status_func|, |player_status_func|, or |player_error_func| if it
 // applies), then |kSbPlayerInvalid| must be returned.
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 SB_EXPORT SbPlayer
 SbPlayerCreate(SbWindow window,
                const SbPlayerCreationParam* creation_param,
@@ -412,26 +397,6 @@
                void* context,
                SbDecodeTargetGraphicsContextProvider* context_provider);
 
-#else  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-SB_EXPORT SbPlayer
-SbPlayerCreate(SbWindow window,
-               SbMediaVideoCodec video_codec,
-               SbMediaAudioCodec audio_codec,
-               SbDrmSystem drm_system,
-               const SbMediaAudioSampleInfo* audio_sample_info,
-               const char* max_video_capabilities,
-               SbPlayerDeallocateSampleFunc sample_deallocate_func,
-               SbPlayerDecoderStatusFunc decoder_status_func,
-               SbPlayerStatusFunc player_status_func,
-               SbPlayerErrorFunc player_error_func,
-               void* context,
-               SbPlayerOutputMode output_mode,
-               SbDecodeTargetGraphicsContextProvider* context_provider);
-
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 // Returns the preferred output mode of the implementation when a video
 // described by |creation_param| is played.  It is assumed that it is okay to
 // call SbPlayerCreate() with the same video described by |creation_param|,
@@ -452,15 +417,6 @@
 SB_EXPORT SbPlayerOutputMode
 SbPlayerGetPreferredOutputMode(const SbPlayerCreationParam* creation_param);
 
-#else   // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-// Returns true if the given player output mode is supported by the platform.
-// If this function returns true, it is okay to call SbPlayerCreate() with
-// the given |output_mode|.
-SB_EXPORT bool SbPlayerOutputModeSupported(SbPlayerOutputMode output_mode,
-                                           SbMediaVideoCodec codec,
-                                           SbDrmSystem drm_system);
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 // Destroys |player|, freeing all associated resources.
 //  * Upon calling this method, there should be one call to the player status
 //    callback (i.e. |player_status_func| used in the creation of the player)
diff --git a/starboard/raspi/2/architecture.gypi b/starboard/raspi/2/architecture.gypi
deleted file mode 100644
index 586370c..0000000
--- a/starboard/raspi/2/architecture.gypi
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    # RasPi 2 is ARMv7
-    'arm_version': 7,
-    'armv7': 1,
-    'arm_fpu': 'neon-vfpv4',
-    'arm_neon': 1,
-    'arm_float_abi': 'hard',
-
-    'compiler_flags': [
-      # Optimize for Raspberry Pi 2 chips.
-      '-march=armv7-a',
-      '-mfloat-abi=hard',
-      '-mfpu=neon-vfpv4',
-      '-mcpu=cortex-a8',
-      '-mtune=cortex-a8',
-    ],
-  },
-}
diff --git a/starboard/raspi/2/gyp_configuration.gypi b/starboard/raspi/2/gyp_configuration.gypi
deleted file mode 100644
index 1b5f785..0000000
--- a/starboard/raspi/2/gyp_configuration.gypi
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'variables': {
-      'sb_evergreen_compatible': 1,
-      'sb_evergreen_compatible_libunwind': 1,
-    },
-  },
-
-  'target_defaults': {
-    'default_configuration': 'raspi-2_debug',
-    'configurations': {
-      'raspi-2_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'raspi-2_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'raspi-2_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'raspi-2_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    'architecture.gypi',
-    '../shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/raspi/2/gyp_configuration.py b/starboard/raspi/2/gyp_configuration.py
index 5f5b245..d23fa58 100644
--- a/starboard/raspi/2/gyp_configuration.py
+++ b/starboard/raspi/2/gyp_configuration.py
@@ -18,19 +18,8 @@
 
 class Raspi2PlatformConfig(shared_configuration.RaspiPlatformConfig):
   """Starboard raspi-2 platform configuration."""
-
-  def __init__(self,
-               platform,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
-    super(Raspi2PlatformConfig, self).__init__(
-        platform, sabi_json_path=sabi_json_path)
-
-  def GetVariables(self, configuration):
-    variables = super(Raspi2PlatformConfig, self).GetVariables(configuration)
-    return variables
+  pass
 
 
 def CreatePlatformConfig():
-  return Raspi2PlatformConfig(
-      'raspi-2',
-      sabi_json_path='starboard/sabi/arm/hardfp/sabi-v{sb_api_version}.json')
+  return Raspi2PlatformConfig('raspi-2')
diff --git a/starboard/raspi/2/platform_configuration/configuration.gni b/starboard/raspi/2/platform_configuration/configuration.gni
index 77ec5a9..3b23661 100644
--- a/starboard/raspi/2/platform_configuration/configuration.gni
+++ b/starboard/raspi/2/platform_configuration/configuration.gni
@@ -18,3 +18,5 @@
 
 sb_evergreen_compatible_use_libunwind = true
 sb_is_evergreen_compatible = true
+
+separate_install_targets_for_bundling = true
diff --git a/starboard/raspi/2/sbversion/12/atomic_public.h b/starboard/raspi/2/sbversion/12/atomic_public.h
deleted file mode 100644
index 59ac9b3..0000000
--- a/starboard/raspi/2/sbversion/12/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_RASPI_2_SBVERSION_12_ATOMIC_PUBLIC_H_
-#define STARBOARD_RASPI_2_SBVERSION_12_ATOMIC_PUBLIC_H_
-
-#include "starboard/raspi/2/atomic_public.h"
-
-#endif  // STARBOARD_RASPI_2_SBVERSION_12_ATOMIC_PUBLIC_H_
diff --git a/starboard/raspi/2/sbversion/12/configuration_public.h b/starboard/raspi/2/sbversion/12/configuration_public.h
deleted file mode 100644
index a1a55da..0000000
--- a/starboard/raspi/2/sbversion/12/configuration_public.h
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for Raspberry PI 2 Raspbian.
-
-#ifndef STARBOARD_RASPI_2_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_RASPI_2_SBVERSION_12_CONFIGURATION_PUBLIC_H_
-
-// Configuration parameters that allow the application to make some general
-// compile-time decisions with respect to the the number of cores likely to be
-// available on this platform. For a definitive measure, the application should
-// still call SbSystemGetNumberOfProcessors at runtime.
-
-// --- System Header Configuration -------------------------------------------
-
-// Any system headers listed here that are not provided by the platform will be
-// emulated in starboard/types.h.
-
-// Whether the current platform provides the standard header sys/types.h.
-#define SB_HAS_SYS_TYPES_H 1
-
-// Whether the current platform provides ssize_t.
-#define SB_HAS_SSIZE_T 1
-
-// Type detection for wchar_t.
-#if defined(__WCHAR_MAX__) && \
-    (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff)
-#define SB_IS_WCHAR_T_UTF32 1
-#elif defined(__WCHAR_MAX__) && \
-    (__WCHAR_MAX__ == 0x7fff || __WCHAR_MAX__ == 0xffff)
-#define SB_IS_WCHAR_T_UTF16 1
-#endif
-
-// Chrome has an exclusion for iOS here, we should too when we support iOS.
-#define SB_IS_WCHAR_T_UNSIGNED 1
-
-// --- Attribute Configuration -----------------------------------------------
-
-// The platform's annotation for forcing a C function to be inlined.
-#define SB_C_FORCE_INLINE __inline__ __attribute__((always_inline))
-
-// The platform's annotation for marking a C function as suggested to be
-// inlined.
-#define SB_C_INLINE inline
-
-// The platform's annotation for marking a C function as forcibly not
-// inlined.
-#define SB_C_NOINLINE __attribute__((noinline))
-
-// The platform's annotation for marking a symbol as exported outside of the
-// current shared library.
-#define SB_EXPORT_PLATFORM __attribute__((visibility("default")))
-
-// The platform's annotation for marking a symbol as imported from outside of
-// the current linking unit.
-#define SB_IMPORT_PLATFORM
-
-// --- Extensions Configuration ----------------------------------------------
-
-// Do not use <unordered_map> and <unordered_set> for the hash table types.
-#define SB_HAS_STD_UNORDERED_HASH 0
-
-// GCC/Clang doesn't define a long long hash function, except for Android and
-// Game consoles.
-#define SB_HAS_LONG_LONG_HASH 0
-
-// GCC/Clang doesn't define a string hash function, except for Game Consoles.
-#define SB_HAS_STRING_HASH 0
-
-// Desktop Linux needs a using statement for the hash functions.
-#define SB_HAS_HASH_USING 0
-
-// Set this to 1 if hash functions for custom types can be defined as a
-// hash_value() function. Otherwise, they need to be placed inside a
-// partially-specified hash struct template with an operator().
-#define SB_HAS_HASH_VALUE 0
-
-// Set this to 1 if use of hash_map or hash_set causes a deprecation warning
-// (which then breaks the build).
-#define SB_HAS_HASH_WARNING 1
-
-// The location to include hash_map on this platform.
-#define SB_HASH_MAP_INCLUDE <ext/hash_map>
-
-// C++'s hash_map and hash_set are often found in different namespaces depending
-// on the compiler.
-#define SB_HASH_NAMESPACE __gnu_cxx
-
-// The location to include hash_set on this platform.
-#define SB_HASH_SET_INCLUDE <ext/hash_set>
-
-// Define this to how this platform copies varargs blocks.
-#define SB_VA_COPY(dest, source) va_copy(dest, source)
-
-// --- Graphics Configuration ------------------------------------------------
-
-// Indicates whether or not the given platform supports bilinear filtering.
-// This can be checked to enable/disable renderer tests that verify that this is
-// working properly.
-#define SB_HAS_BILINEAR_FILTERING_SUPPORT 1
-
-// Indicates whether or not the given platform supports rendering of NV12
-// textures. These textures typically originate from video decoders.
-#define SB_HAS_NV12_TEXTURE_SUPPORT 1
-
-// --- I/O Configuration -----------------------------------------------------
-
-// Whether the current platform implements the on screen keyboard interface.
-#define SB_HAS_ON_SCREEN_KEYBOARD 0
-
-// Whether the current platform has speech recognizer.
-#define SB_HAS_SPEECH_RECOGNIZER 0
-
-// Whether the current platform has speech synthesis.
-#define SB_HAS_SPEECH_SYNTHESIS 0
-
-// --- Memory Configuration --------------------------------------------------
-
-// Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
-// required for platforms that want to JIT.
-#define SB_CAN_MAP_EXECUTABLE_MEMORY 1
-
-// --- Network Configuration -------------------------------------------------
-
-// Specifies whether this platform supports IPV6.
-#define SB_HAS_IPV6 1
-
-// Specifies whether this platform supports pipe.
-#define SB_HAS_PIPE 1
-
-// --- Timing API ------------------------------------------------------------
-
-// Whether this platform has an API to retrieve how long the current thread
-// has spent in the executing state.
-#define SB_HAS_TIME_THREAD_NOW 1
-
-// --- Platform Specific Audits ----------------------------------------------
-
-#if !defined(__GNUC__)
-#error "RasPi builds need a GCC-like compiler (for the moment)."
-#endif
-
-// --- Platform Specific Quirks ----------------------------------------------
-
-// The Raspberry Pi does not apparently align fields in a heap-allocated struct
-// by over 16 bytes.
-#define SB_HAS_QUIRK_DOES_NOT_ALIGN_FIELDS_IN_HEAP_OVER_16_BYTES 1
-
-// The Raspberry Pi does not apparently align stack variables by over 16 bytes.
-#define SB_HAS_QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES 1
-
-#endif  // STARBOARD_RASPI_2_SBVERSION_12_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/raspi/2/sbversion/12/gyp_configuration.gypi b/starboard/raspi/2/sbversion/12/gyp_configuration.gypi
deleted file mode 100644
index 64d6a77..0000000
--- a/starboard/raspi/2/sbversion/12/gyp_configuration.gypi
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'variables': {
-      'sb_evergreen_compatible': 1,
-      'sb_evergreen_compatible_libunwind': 1,
-    },
-  },
-
-  'target_defaults': {
-    'default_configuration': 'raspi-2-sbversion-12_debug',
-    'configurations': {
-      'raspi-2-sbversion-12_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'raspi-2-sbversion-12_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'raspi-2-sbversion-12_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'raspi-2-sbversion-12_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '<(DEPTH)/starboard/raspi/2/architecture.gypi',
-    '<(DEPTH)/starboard/raspi/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/raspi/2/sbversion/12/gyp_configuration.py b/starboard/raspi/2/sbversion/12/gyp_configuration.py
deleted file mode 100644
index 995e684..0000000
--- a/starboard/raspi/2/sbversion/12/gyp_configuration.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Raspberry Pi 2 platform configuration."""
-
-import importlib
-
-# Dynamically imported to get around the number in the path.
-_PARENT_CONFIGURATION = importlib.import_module(
-    'starboard.raspi.2.gyp_configuration')
-
-
-def CreatePlatformConfig():
-  return _PARENT_CONFIGURATION.Raspi2PlatformConfig(
-      'raspi-2-sbversion-12',
-      sabi_json_path='starboard/sabi/arm/hardfp/sabi-v12.json')
diff --git a/starboard/raspi/2/sbversion/12/starboard_platform.gyp b/starboard/raspi/2/sbversion/12/starboard_platform.gyp
deleted file mode 100644
index 0a1da3c..0000000
--- a/starboard/raspi/2/sbversion/12/starboard_platform.gyp
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/raspi/2/starboard_platform.gyp',
-  ],
-  'variables': {
-      'starboard_platform_sources': [
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_cancel.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_create.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_start.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_recognizer_stop.cc',
-      ],
-  },
-}
diff --git a/starboard/raspi/2/sbversion/12/test_filters.py b/starboard/raspi/2/sbversion/12/test_filters.py
deleted file mode 100644
index d83e77e..0000000
--- a/starboard/raspi/2/sbversion/12/test_filters.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Raspberry Pi 2 Platform Test Filters."""
-
-import importlib
-
-# Dynamically imported to get around the number in the path.
-_PARENT_TEST_FILTERS = importlib.import_module('starboard.raspi.2.test_filters')
-
-
-def CreateTestFilters():
-  return _PARENT_TEST_FILTERS.Raspi2TestFilters()
diff --git a/starboard/raspi/2/sbversion/12/thread_types_public.h b/starboard/raspi/2/sbversion/12/thread_types_public.h
deleted file mode 100644
index 39e27a5..0000000
--- a/starboard/raspi/2/sbversion/12/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_RASPI_2_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_RASPI_2_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/raspi/2/thread_types_public.h"
-
-#endif  // STARBOARD_RASPI_2_SBVERSION_12_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/raspi/2/sbversion/13/atomic_public.h b/starboard/raspi/2/sbversion/13/atomic_public.h
deleted file mode 100644
index 27e44ca..0000000
--- a/starboard/raspi/2/sbversion/13/atomic_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_RASPI_2_SBVERSION_13_ATOMIC_PUBLIC_H_
-#define STARBOARD_RASPI_2_SBVERSION_13_ATOMIC_PUBLIC_H_
-
-#include "starboard/raspi/2/atomic_public.h"
-
-#endif  // STARBOARD_RASPI_2_SBVERSION_13_ATOMIC_PUBLIC_H_
diff --git a/starboard/raspi/2/sbversion/13/configuration_public.h b/starboard/raspi/2/sbversion/13/configuration_public.h
deleted file mode 100644
index a6fa8a0..0000000
--- a/starboard/raspi/2/sbversion/13/configuration_public.h
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The Starboard configuration for Raspberry PI 2 Raspbian.
-
-#ifndef STARBOARD_RASPI_2_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-#define STARBOARD_RASPI_2_SBVERSION_13_CONFIGURATION_PUBLIC_H_
-
-// --- System Header Configuration -------------------------------------------
-
-// Any system headers listed here that are not provided by the platform will be
-// emulated in starboard/types.h.
-
-// Whether the current platform provides the standard header sys/types.h.
-#define SB_HAS_SYS_TYPES_H 1
-
-// Whether the current platform provides ssize_t.
-#define SB_HAS_SSIZE_T 1
-
-// Type detection for wchar_t.
-#define SB_IS_WCHAR_T_UTF32 1
-
-// Chrome has an exclusion for iOS here, we should too when we support iOS.
-#define SB_IS_WCHAR_T_UNSIGNED 1
-
-// --- Attribute Configuration -----------------------------------------------
-
-// The platform's annotation for forcing a C function to be inlined.
-#define SB_C_FORCE_INLINE __inline__ __attribute__((always_inline))
-
-// The platform's annotation for marking a C function as suggested to be
-// inlined.
-#define SB_C_INLINE inline
-
-// The platform's annotation for marking a C function as forcibly not
-// inlined.
-#define SB_C_NOINLINE __attribute__((noinline))
-
-// The platform's annotation for marking a symbol as exported outside of the
-// current shared library.
-#define SB_EXPORT_PLATFORM __attribute__((visibility("default")))
-
-// The platform's annotation for marking a symbol as imported from outside of
-// the current linking unit.
-#define SB_IMPORT_PLATFORM
-
-// --- Extensions Configuration ----------------------------------------------
-
-// Do not use <unordered_map> and <unordered_set> for the hash table types.
-#define SB_HAS_STD_UNORDERED_HASH 0
-
-// GCC/Clang doesn't define a long long hash function, except for Android and
-// Game consoles.
-#define SB_HAS_LONG_LONG_HASH 0
-
-// GCC/Clang doesn't define a string hash function, except for Game Consoles.
-#define SB_HAS_STRING_HASH 0
-
-// Desktop Linux needs a using statement for the hash functions.
-#define SB_HAS_HASH_USING 0
-
-// Set this to 1 if hash functions for custom types can be defined as a
-// hash_value() function. Otherwise, they need to be placed inside a
-// partially-specified hash struct template with an operator().
-#define SB_HAS_HASH_VALUE 0
-
-// Set this to 1 if use of hash_map or hash_set causes a deprecation warning
-// (which then breaks the build).
-#define SB_HAS_HASH_WARNING 1
-
-// The location to include hash_map on this platform.
-#define SB_HASH_MAP_INCLUDE <ext/hash_map>
-
-// C++'s hash_map and hash_set are often found in different namespaces depending
-// on the compiler.
-#define SB_HASH_NAMESPACE __gnu_cxx
-
-// The location to include hash_set on this platform.
-#define SB_HASH_SET_INCLUDE <ext/hash_set>
-
-// --- Graphics Configuration ------------------------------------------------
-
-// Indicates whether or not the given platform supports bilinear filtering.
-// This can be checked to enable/disable renderer tests that verify that this is
-// working properly.
-#define SB_HAS_BILINEAR_FILTERING_SUPPORT 1
-
-// Indicates whether or not the given platform supports rendering of NV12
-// textures. These textures typically originate from video decoders.
-#define SB_HAS_NV12_TEXTURE_SUPPORT 1
-
-// --- I/O Configuration -----------------------------------------------------
-
-// Whether the current platform implements the on screen keyboard interface.
-#define SB_HAS_ON_SCREEN_KEYBOARD 0
-
-// Whether the current platform has speech recognizer.
-#define SB_HAS_SPEECH_RECOGNIZER 0
-
-// Whether the current platform has speech synthesis.
-#define SB_HAS_SPEECH_SYNTHESIS 0
-
-// --- Memory Configuration --------------------------------------------------
-
-// Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
-// required for platforms that want to JIT.
-#define SB_CAN_MAP_EXECUTABLE_MEMORY 1
-
-// --- Network Configuration -------------------------------------------------
-
-// Specifies whether this platform supports IPV6.
-#define SB_HAS_IPV6 1
-
-// Specifies whether this platform supports pipe.
-#define SB_HAS_PIPE 1
-
-// --- Timing API ------------------------------------------------------------
-
-// Whether this platform has an API to retrieve how long the current thread
-// has spent in the executing state.
-#define SB_HAS_TIME_THREAD_NOW 1
-
-// --- Platform Specific Audits ----------------------------------------------
-
-#if !defined(__GNUC__)
-#error "RasPi builds need a GCC-like compiler (for the moment)."
-#endif
-
-#endif  // STARBOARD_RASPI_2_SBVERSION_13_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/raspi/2/sbversion/13/gyp_configuration.gypi b/starboard/raspi/2/sbversion/13/gyp_configuration.gypi
deleted file mode 100644
index 535a1de..0000000
--- a/starboard/raspi/2/sbversion/13/gyp_configuration.gypi
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'variables': {
-      'sb_evergreen_compatible': 1,
-      'sb_evergreen_compatible_libunwind': 1,
-    },
-  },
-
-  'target_defaults': {
-    'default_configuration': 'raspi-2-sbversion-13_debug',
-    'configurations': {
-      'raspi-2-sbversion-13_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'raspi-2-sbversion-13_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'raspi-2-sbversion-13_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'raspi-2-sbversion-13_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '<(DEPTH)/starboard/raspi/2/architecture.gypi',
-    '<(DEPTH)/starboard/raspi/shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/raspi/2/sbversion/13/gyp_configuration.py b/starboard/raspi/2/sbversion/13/gyp_configuration.py
deleted file mode 100644
index b4bafff..0000000
--- a/starboard/raspi/2/sbversion/13/gyp_configuration.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Raspberry Pi 2 platform configuration."""
-
-import importlib
-
-# Dynamically imported to get around the number in the path.
-_PARENT_CONFIGURATION = importlib.import_module(
-    'starboard.raspi.2.gyp_configuration')
-
-
-def CreatePlatformConfig():
-  return _PARENT_CONFIGURATION.Raspi2PlatformConfig(
-      'raspi-2-sbversion-13',
-      sabi_json_path='starboard/sabi/arm/hardfp/sabi-v13.json')
diff --git a/starboard/raspi/2/sbversion/13/starboard_platform.gyp b/starboard/raspi/2/sbversion/13/starboard_platform.gyp
deleted file mode 100644
index 039b4c6..0000000
--- a/starboard/raspi/2/sbversion/13/starboard_platform.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/starboard/raspi/2/starboard_platform.gyp',
-  ],
-}
diff --git a/starboard/raspi/2/sbversion/13/test_filters.py b/starboard/raspi/2/sbversion/13/test_filters.py
deleted file mode 100644
index d83e77e..0000000
--- a/starboard/raspi/2/sbversion/13/test_filters.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2022 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Starboard Raspberry Pi 2 Platform Test Filters."""
-
-import importlib
-
-# Dynamically imported to get around the number in the path.
-_PARENT_TEST_FILTERS = importlib.import_module('starboard.raspi.2.test_filters')
-
-
-def CreateTestFilters():
-  return _PARENT_TEST_FILTERS.Raspi2TestFilters()
diff --git a/starboard/raspi/2/sbversion/13/thread_types_public.h b/starboard/raspi/2/sbversion/13/thread_types_public.h
deleted file mode 100644
index 021ba44..0000000
--- a/starboard/raspi/2/sbversion/13/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2021 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_RASPI_2_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_RASPI_2_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/raspi/2/thread_types_public.h"
-
-#endif  // STARBOARD_RASPI_2_SBVERSION_13_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/raspi/2/skia/gyp_configuration.gypi b/starboard/raspi/2/skia/gyp_configuration.gypi
deleted file mode 100644
index 62f6615..0000000
--- a/starboard/raspi/2/skia/gyp_configuration.gypi
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'target_defaults': {
-    'default_configuration': 'raspi-2-skia_debug',
-    'configurations': {
-      'raspi-2-skia_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'raspi-2-skia_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'raspi-2-skia_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'raspi-2-skia_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-  },
-
-  'includes': [
-    '../architecture.gypi',
-    '../../shared/gyp_configuration.gypi',
-  ],
-}
diff --git a/starboard/raspi/2/skia/gyp_configuration.py b/starboard/raspi/2/skia/gyp_configuration.py
index ba8654c..61f2953 100644
--- a/starboard/raspi/2/skia/gyp_configuration.py
+++ b/starboard/raspi/2/skia/gyp_configuration.py
@@ -21,6 +21,4 @@
 
 
 def CreatePlatformConfig():
-  return Raspi2PlatformConfig(
-      'raspi-2-skia',
-      sabi_json_path='starboard/sabi/arm/hardfp/sabi-v{sb_api_version}.json')
+  return Raspi2PlatformConfig('raspi-2-skia')
diff --git a/starboard/raspi/2/skia/starboard_platform.gyp b/starboard/raspi/2/skia/starboard_platform.gyp
deleted file mode 100644
index 8057cd1..0000000
--- a/starboard/raspi/2/skia/starboard_platform.gyp
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '../../shared/starboard_platform.gypi',
-  ],
-  'target_defaults': {
-    'sources': [
-      '<(DEPTH)/starboard/raspi/2/skia/configuration.cc',
-      '<(DEPTH)/starboard/raspi/2/skia/configuration.h',
-      '<(DEPTH)/starboard/raspi/2/skia/system_get_extensions.cc',
-    ],
-    'sources!': [
-      '<(DEPTH)/starboard/raspi/shared/configuration.cc',
-      '<(DEPTH)/starboard/raspi/shared/configuration.h',
-      '<(DEPTH)/starboard/raspi/shared/system_get_extensions.cc',
-    ],
-  },
-}
diff --git a/starboard/raspi/2/skia/thread_types_public.h b/starboard/raspi/2/skia/thread_types_public.h
deleted file mode 100644
index a07bc9b..0000000
--- a/starboard/raspi/2/skia/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_RASPI_2_SKIA_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_RASPI_2_SKIA_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/raspi/2/thread_types_public.h"
-
-#endif  // STARBOARD_RASPI_2_SKIA_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/raspi/2/starboard_platform.gyp b/starboard/raspi/2/starboard_platform.gyp
deleted file mode 100644
index 021af7c..0000000
--- a/starboard/raspi/2/starboard_platform.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '../shared/starboard_platform.gypi',
-  ],
-}
diff --git a/starboard/raspi/2/starboard_platform_tests.gyp b/starboard/raspi/2/starboard_platform_tests.gyp
deleted file mode 100644
index f01ba52..0000000
--- a/starboard/raspi/2/starboard_platform_tests.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/raspi/shared/starboard_platform_tests.gypi',
-  ],
-}
diff --git a/starboard/raspi/2/thread_types_public.h b/starboard/raspi/2/thread_types_public.h
deleted file mode 100644
index 81203c7..0000000
--- a/starboard/raspi/2/thread_types_public.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_RASPI_2_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_RASPI_2_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/raspi/shared/thread_types_public.h"
-
-#endif  // STARBOARD_RASPI_2_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/raspi/shared/BUILD.gn b/starboard/raspi/shared/BUILD.gn
index 70d60ff..a5653f3 100644
--- a/starboard/raspi/shared/BUILD.gn
+++ b/starboard/raspi/shared/BUILD.gn
@@ -80,9 +80,6 @@
     "//starboard/shared/alsa/alsa_audio_sink_type.h",
     "//starboard/shared/alsa/alsa_util.cc",
     "//starboard/shared/alsa/alsa_util.h",
-    "//starboard/shared/dlmalloc/memory_map.cc",
-    "//starboard/shared/dlmalloc/memory_protect.cc",
-    "//starboard/shared/dlmalloc/memory_unmap.cc",
     "//starboard/shared/egl/system_egl.cc",
     "//starboard/shared/gcc/atomic_gcc_public.h",
     "//starboard/shared/iso/character_is_alphanumeric.cc",
@@ -135,7 +132,6 @@
     "//starboard/shared/linux/dev_input/dev_input.cc",
     "//starboard/shared/linux/get_home_directory.cc",
     "//starboard/shared/linux/memory_get_stack_bounds.cc",
-    "//starboard/shared/linux/page_internal.cc",
     "//starboard/shared/linux/socket_get_interface_address.cc",
     "//starboard/shared/linux/system_get_random_data.cc",
     "//starboard/shared/linux/system_get_stack.cc",
@@ -153,6 +149,7 @@
     "//starboard/shared/opus/opus_audio_decoder.cc",
     "//starboard/shared/opus/opus_audio_decoder.h",
     "//starboard/shared/posix/directory_create.cc",
+    "//starboard/shared/posix/environment.cc",
     "//starboard/shared/posix/file_atomic_replace.cc",
     "//starboard/shared/posix/file_can_open.cc",
     "//starboard/shared/posix/file_close.cc",
@@ -174,6 +171,10 @@
     "//starboard/shared/posix/memory_allocate_aligned_unchecked.cc",
     "//starboard/shared/posix/memory_flush.cc",
     "//starboard/shared/posix/memory_free_aligned.cc",
+    "//starboard/shared/posix/memory_map.cc",
+    "//starboard/shared/posix/memory_protect.cc",
+    "//starboard/shared/posix/memory_unmap.cc",
+    "//starboard/shared/posix/page_internal.cc",
     "//starboard/shared/posix/set_non_blocking_internal.cc",
     "//starboard/shared/posix/socket_accept.cc",
     "//starboard/shared/posix/socket_bind.cc",
@@ -309,12 +310,13 @@
     "//starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc",
     "//starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc",
     "//starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc",
-    "//starboard/shared/starboard/media/media_is_transfer_characteristics_supported.cc",
     "//starboard/shared/starboard/media/mime_type.cc",
     "//starboard/shared/starboard/media/mime_type.h",
     "//starboard/shared/starboard/memory.cc",
     "//starboard/shared/starboard/new.cc",
     "//starboard/shared/starboard/queue_application.cc",
+    "//starboard/shared/starboard/starboard_switches.cc",
+    "//starboard/shared/starboard/starboard_switches.h",
     "//starboard/shared/starboard/string_concat.cc",
     "//starboard/shared/starboard/string_concat_wide.cc",
     "//starboard/shared/starboard/string_copy.cc",
@@ -333,12 +335,6 @@
     "//starboard/shared/stub/accessibility_get_display_settings.cc",
     "//starboard/shared/stub/accessibility_get_text_to_speech_settings.cc",
     "//starboard/shared/stub/accessibility_set_captions_enabled.cc",
-    "//starboard/shared/stub/cryptography_create_transformer.cc",
-    "//starboard/shared/stub/cryptography_destroy_transformer.cc",
-    "//starboard/shared/stub/cryptography_get_tag.cc",
-    "//starboard/shared/stub/cryptography_set_authenticated_data.cc",
-    "//starboard/shared/stub/cryptography_set_initialization_vector.cc",
-    "//starboard/shared/stub/cryptography_transform.cc",
     "//starboard/shared/stub/drm_close_session.cc",
     "//starboard/shared/stub/drm_create_system.cc",
     "//starboard/shared/stub/drm_destroy_system.cc",
@@ -397,7 +393,7 @@
   public_deps = [
     ":starboard_base_symbolize",
     "//starboard:starboard_headers_only",
-    "//starboard/common/",
+    "//starboard/common",
     "//starboard/shared/ffmpeg:ffmpeg_linked",
     "//starboard/shared/starboard/media:media_util",
     "//starboard/shared/starboard/player/filter:filter_based_player_sources",
diff --git a/starboard/raspi/shared/cobalt/configuration.gypi b/starboard/raspi/shared/cobalt/configuration.gypi
deleted file mode 100644
index bec52cf..0000000
--- a/starboard/raspi/shared/cobalt/configuration.gypi
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Cobalt-on-Linux-specific configuration.
-
-{
-  'variables': {
-    'in_app_dial%': 0,
-  }, # end of variables
-}
diff --git a/starboard/raspi/shared/cobalt/configuration.py b/starboard/raspi/shared/cobalt/configuration.py
index 7ecac48..5aa7ae2 100644
--- a/starboard/raspi/shared/cobalt/configuration.py
+++ b/starboard/raspi/shared/cobalt/configuration.py
@@ -13,8 +13,6 @@
 # limitations under the License.
 """Starboard Raspberry Pi shared Cobalt configuration."""
 
-import os
-
 from cobalt.build import cobalt_configuration
 from starboard.tools.testing import test_filter
 
@@ -22,20 +20,6 @@
 class CobaltRaspiConfiguration(cobalt_configuration.CobaltConfiguration):
   """Starboard Raspberry Pi shared Cobalt configuration."""
 
-  def GetPostIncludes(self):
-    # If there isn't a configuration.gypi found in the usual place, we'll
-    # supplement with our shared implementation.
-    includes = super(CobaltRaspiConfiguration, self).GetPostIncludes()
-    for include in includes:
-      if os.path.basename(include) == 'configuration.gypi':
-        return includes
-
-    shared_gypi_path = os.path.join(
-        os.path.dirname(__file__), 'configuration.gypi')
-    if os.path.isfile(shared_gypi_path):
-      includes.append(shared_gypi_path)
-    return includes
-
   def WebdriverBenchmarksEnabled(self):
     return True
 
diff --git a/starboard/raspi/shared/configuration_public.h b/starboard/raspi/shared/configuration_public.h
index e10b7f5..3c9ed64 100644
--- a/starboard/raspi/shared/configuration_public.h
+++ b/starboard/raspi/shared/configuration_public.h
@@ -123,12 +123,6 @@
 
 // --- Memory Configuration --------------------------------------------------
 
-// Whether this platform has and should use an MMAP function to map physical
-// memory to the virtual address space.
-#if SB_API_VERSION < 12
-#define SB_HAS_MMAP 1
-#endif
-
 // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
 // required for platforms that want to JIT.
 #define SB_CAN_MAP_EXECUTABLE_MEMORY 1
diff --git a/starboard/raspi/shared/gyp_configuration.gypi b/starboard/raspi/shared/gyp_configuration.gypi
deleted file mode 100644
index c73f317..0000000
--- a/starboard/raspi/shared/gyp_configuration.gypi
+++ /dev/null
@@ -1,209 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    # Override that omits the "data" subdirectory.
-    # TODO: Remove when omitted for all platforms in base_configuration.gypi.
-    'sb_static_contents_output_data_dir': '<(PRODUCT_DIR)/content',
-
-    'target_os': 'linux',
-
-    'sysroot%': '/',
-    'gl_type': 'system_gles2',
-
-    # Define platform specific compiler and linker flags.
-    # Refer to base.gypi for a list of all available variables.
-    'compiler_flags_host': [
-      '-O2',
-    ],
-    'compiler_flags': [
-      # Force char to be signed.
-      '-fsigned-char',
-
-      # Disable strict aliasing.
-      '-fno-strict-aliasing',
-
-      # Allow Skia's SkVx.h to convert between vectors of different element
-      # types or number of subparts.
-      '-flax-vector-conversions',
-
-      # To support large files
-      '-D_FILE_OFFSET_BITS=64',
-
-      # Suppress some warnings that will be hard to fix.
-      '-Wno-unused-local-typedefs',
-      '-Wno-unused-result',
-      '-Wno-unused-function',
-      '-Wno-deprecated-declarations',
-      '-Wno-missing-field-initializers',
-      '-Wno-extra',
-      '-Wno-comment',  # Talk to my lawyer.
-      '-Wno-narrowing',
-      '-Wno-unknown-pragmas',
-      '-Wno-type-limits',  # TODO: We should actually look into these.
-      # It's OK not to use some input parameters. Note that the order
-      # matters: Wall implies Wunused-parameter and Wno-unused-parameter
-      # has no effect if specified before Wall.
-      '-Wno-unused-parameter',
-
-      # Specify the sysroot with all your include dependencies.
-      '--sysroot=<(sysroot)',
-
-      # This is a quirk of Raspbian, these are required to include any
-      # GL-related headers.
-      '-I<(sysroot)/opt/vc/include',
-      '-I<(sysroot)/opt/vc/include/interface/vcos/pthreads',
-      '-I<(sysroot)/opt/vc/include/interface/vmcs_host/linux',
-      '-I<(sysroot)/usr/include/arm-linux-gnueabihf',
-    ],
-    'linker_flags': [
-      '--sysroot=<(sysroot)',
-      # This is a quirk of Raspbian, these are required to link any GL-related
-      # libraries.
-      '-L<(sysroot)/opt/vc/lib',
-      '-Wl,-rpath=<(sysroot)/opt/vc/lib',
-      '-L<(sysroot)/usr/lib/arm-linux-gnueabihf',
-      '-Wl,-rpath=<(sysroot)/usr/lib/arm-linux-gnueabihf',
-      '-L<(sysroot)/lib/arm-linux-gnueabihf',
-      '-Wl,-rpath=<(sysroot)/lib/arm-linux-gnueabihf',
-      # Cleanup unused sections
-      '-Wl,-gc-sections',
-      '-Wl,--unresolved-symbols=ignore-in-shared-libs',
-    ],
-    'compiler_flags_debug': [
-      '-O0',
-    ],
-    'compiler_flags_cc_debug': [
-      '-frtti',
-    ],
-    'compiler_flags_devel': [
-      '-O2',
-    ],
-    'compiler_flags_cc_devel': [
-      '-frtti',
-    ],
-    'compiler_flags_qa': [
-      '-Wno-unused-but-set-variable',
-    ],
-    'compiler_flags_qa_size': [
-      '-Os',
-      # Compile symbols in separate sections
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-    'compiler_flags_qa_speed': [
-      '-O2',
-      # Compile symbols in separate sections
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-    'compiler_flags_cc_qa': [
-      '-fno-rtti',
-    ],
-    'compiler_flags_gold': [
-      '-Wno-unused-but-set-variable',
-    ],
-    'compiler_flags_gold_size': [
-      '-Os',
-      # Compile symbols in separate sections
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-    'compiler_flags_gold_speed': [
-      '-O2',
-      # Compile symbols in separate sections
-      '-ffunction-sections',
-      '-fdata-sections',
-    ],
-    'compiler_flags_cc_gold': [
-      '-fno-rtti',
-    ],
-    'platform_libraries': [
-      '-lasound',
-      '-lavcodec',
-      '-lavformat',
-      '-lavutil',
-      '-l:libpthread.so.0',
-      '-lpthread',
-      '-lrt',
-      '-lopenmaxil',
-      '-lbcm_host',
-      '-lvcos',
-      '-lvchiq_arm',
-      '-lbrcmGLESv2',
-      '-lbrcmEGL',
-      # Static libs must be last, to avoid __dlopen linker errors
-      '-lEGL_static',
-      '-lGLESv2_static',
-    ],
-    'conditions': [
-      ['cobalt_fastbuild==0', {
-        'compiler_flags_debug': [
-          '-g',
-        ],
-        'compiler_flags_devel': [
-          '-g',
-        ],
-        'compiler_flags_qa': [
-        ],
-        'compiler_flags_gold': [
-        ],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'defines': [
-      # Cobalt on Linux flag
-      'COBALT_LINUX',
-      '__STDC_FORMAT_MACROS', # so that we get PRI*
-      # Enable GNU extensions to get prototypes like ffsl.
-      '_GNU_SOURCE=1',
-    ],
-    'cflags_c': [
-      '-std=c11',
-    ],
-    'cflags_cc': [
-      '-std=gnu++14',
-      '-Wno-literal-suffix',
-    ],
-    'target_conditions': [
-      ['sb_pedantic_warnings==1', {
-        'cflags': [
-          '-Wall',
-          '-Wextra',
-          '-Wunreachable-code',
-          # Raspi toolchain is based off an old version of gcc, which
-          # falsely flags some code.  That same code does not warn with gcc 6.3.
-          # This decision should be revisited after raspi toolchain is upgraded.
-          '-Wno-maybe-uninitialized',
-          # Turn warnings into errors.
-          '-Werror',
-          '-Wno-expansion-to-defined',
-          '-Wno-implicit-fallthrough',
-        ],
-      },{
-        'cflags': [
-          # Do not warn for implicit type conversions that may change a value.
-          '-Wno-conversion',
-        ],
-      }],
-    ],
-  }, # end of target_defaults
-
-  'includes': [
-    '<(DEPTH)/starboard/sabi/sabi.gypi',
-  ],
-}
diff --git a/starboard/raspi/shared/gyp_configuration.py b/starboard/raspi/shared/gyp_configuration.py
index f6842fe..a2cebd8 100644
--- a/starboard/raspi/shared/gyp_configuration.py
+++ b/starboard/raspi/shared/gyp_configuration.py
@@ -15,172 +15,16 @@
 
 import os
 
-from starboard.build import clang as clang_specification
 from starboard.build import platform_configuration
-from starboard.tools import build
-from starboard.tools.testing import test_filter
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import touch
-
-# Use a bogus path instead of None so that anything based on $RASPI_HOME won't
-# inadvertently end up pointing to something in the root directory, and this
-# will show up in an error message when that fails.
-_UNDEFINED_RASPI_HOME = '/UNDEFINED/RASPI_HOME'
 
 
 class RaspiPlatformConfig(platform_configuration.PlatformConfiguration):
   """Starboard Raspberry Pi platform configuration."""
 
-  def __init__(self,
-               platform,
-               sabi_json_path='starboard/sabi/default/sabi.json'):
+  def __init__(self, platform):
     super(RaspiPlatformConfig, self).__init__(platform)
-
-    self.sabi_json_path = sabi_json_path
     self.AppendApplicationConfigurationPath(os.path.dirname(__file__))
-    self.raspi_home = os.environ.get('RASPI_HOME', _UNDEFINED_RASPI_HOME)
-    self.sysroot = os.path.realpath(os.path.join(self.raspi_home, 'busterroot'))
-
-  def GetBuildFormat(self):
-    """Returns the desired build format."""
-    # The comma means that ninja and qtcreator_ninja will be chained and use the
-    # same input information so that .gyp files will only have to be parsed
-    # once.
-    return 'ninja,qtcreator_ninja'
-
-  def GetVariables(self, configuration):
-    variables = super(RaspiPlatformConfig, self).GetVariables(configuration)
-    variables.update({
-        'clang':
-            0,
-        'sysroot':
-            self.sysroot,
-        'include_path_platform_deploy_gypi':
-            'starboard/raspi/shared/platform_deploy.gypi',
-        'STRIP':
-            os.environ.get('STRIP')
-    })
-
-    return variables
-
-  def GetEnvironmentVariables(self):
-    if not hasattr(self, 'host_compiler_environment'):
-      self.host_compiler_environment = build.GetHostCompilerEnvironment(
-          clang_specification.GetClangSpecification(), self.build_accelerator)
-
-    toolchain = os.path.realpath(
-        os.path.join(
-            self.raspi_home, 'tools/arm-bcm2708/'
-            'gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf'))
-    toolchain_bin_dir = os.path.join(toolchain, 'bin')
-
-    env_variables = self.host_compiler_environment
-    env_variables.update({
-        'CC':
-            self.build_accelerator + ' ' +
-            os.path.join(toolchain_bin_dir, 'arm-linux-gnueabihf-gcc'),
-        'CXX':
-            self.build_accelerator + ' ' +
-            os.path.join(toolchain_bin_dir, 'arm-linux-gnueabihf-g++'),
-        'STRIP':
-            os.path.join(toolchain_bin_dir, 'arm-linux-gnueabihf-strip'),
-    })
-    return env_variables
-
-  def SetupPlatformTools(self, build_number):
-    # Nothing to setup, but validate that RASPI_HOME is correct.
-    if self.raspi_home == _UNDEFINED_RASPI_HOME:
-      raise RuntimeError('RasPi builds require the "RASPI_HOME" '
-                         'environment variable to be set.')
-    if not os.path.isdir(self.sysroot):
-      raise RuntimeError('RasPi builds require $RASPI_HOME/busterroot '
-                         'to be a valid directory.')
-
-  def GetTargetToolchain(self, **kwargs):
-    environment_variables = self.GetEnvironmentVariables()
-    cc_path = environment_variables['CC']
-    cxx_path = environment_variables['CXX']
-
-    return [
-        clang.CCompiler(path=cc_path),
-        clang.CxxCompiler(path=cxx_path),
-        clang.AssemblerWithCPreprocessor(path=cc_path),
-        ar.StaticThinLinker(),
-        ar.StaticLinker(),
-        clangxx.ExecutableLinker(path=cxx_path, write_group=True),
-        clangxx.SharedLibraryLinker(path=cxx_path),
-        cp.Copy(),
-        touch.Stamp(),
-        bash.Shell(),
-    ]
-
-  def GetHostToolchain(self, **kwargs):
-    environment_variables = self.GetEnvironmentVariables()
-    cc_path = environment_variables['CC_host']
-    cxx_path = environment_variables['CXX_host']
-
-    return [
-        clang.CCompiler(path=cc_path),
-        clang.CxxCompiler(path=cxx_path),
-        clang.AssemblerWithCPreprocessor(path=cc_path),
-        ar.StaticThinLinker(),
-        ar.StaticLinker(),
-        clangxx.ExecutableLinker(path=cxx_path, write_group=True),
-        clangxx.SharedLibraryLinker(path=cxx_path),
-        cp.Copy(),
-        touch.Stamp(),
-        bash.Shell(),
-    ]
 
   def GetLauncherPath(self):
     """Gets the path to the launcher module for this platform."""
     return os.path.dirname(__file__)
-
-  def GetGeneratorVariables(self, config_name):
-    del config_name
-    generator_variables = {
-        'qtcreator_session_name_prefix': 'cobalt',
-    }
-    return generator_variables
-
-  def GetTestFilters(self):
-    filters = super(RaspiPlatformConfig, self).GetTestFilters()
-    for target, tests in self.__FILTERED_TESTS.iteritems():
-      filters.extend(test_filter.TestFilter(target, test) for test in tests)
-    return filters
-
-  __FILTERED_TESTS = {  # pylint: disable=invalid-name
-      'nplb': [
-          'SbAudioSinkTest.*',
-
-          # Permanently filter out drm system related tests as raspi doesn't
-          # support any drm systems and there is no plan to implement such
-          # support.
-          'SbDrmTest.AnySupportedKeySystems',
-          'SbMediaCanPlayMimeAndKeySystem.AnySupportedKeySystems',
-          'SbMediaCanPlayMimeAndKeySystem.KeySystemWithAttributes',
-          'SbMediaCanPlayMimeAndKeySystem.MinimumSupport',
-
-          'SbMediaSetAudioWriteDurationTests/*',
-          'SbPlayerWriteSampleTests*',
-          'SbUndefinedBehaviorTest.CallThisPointerIsNullRainyDay',
-          'SbSystemGetPropertyTest.FLAKY_ReturnsRequired',
-      ],
-      'player_filter_tests': [
-          # The implementations for the raspberry pi (0 and 2) are incomplete
-          # and not meant to be a reference implementation. As such we will
-          # not repair these failing tests for now.
-          'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/0',
-          'VideoDecoderTests/VideoDecoderTest.MultipleResets/0',
-          # Filter failed tests.
-          'PlayerComponentsTests/PlayerComponentsTest.*',
-
-      ],
-  }
-
-  def GetPathToSabiJsonFile(self):
-    return self.sabi_json_path
diff --git a/starboard/raspi/shared/install_target.gni b/starboard/raspi/shared/install_target.gni
index 4c42ce1..90ac725 100644
--- a/starboard/raspi/shared/install_target.gni
+++ b/starboard/raspi/shared/install_target.gni
@@ -16,8 +16,12 @@
 template("install_target") {
   installable_target_name = invoker.installable_target_name
 
+  # TODO(b/218889313): raspi relies on install_content being adjacent to the
+  # executable. In order to make tests pass we need to overload the install
+  # subdir and install content subdir.
   if (invoker.type == "executable") {
-    install_subdir = "bin"
+    # install_subdir = "bin"
+    install_subdir = ""
     source_name = installable_target_name
   } else if (invoker.type == "shared_library") {
     install_subdir = "lib"
@@ -40,7 +44,7 @@
     deps = invoker.deps
     deps += [ ":$installable_target_name" ]
 
-    outputs = [ "$sb_install_output_dir/$install_subdir/$source_name" ]
+    outputs = [ "$sb_install_output_dir/$install_subdir/$installable_target_name/$source_name" ]
 
     args = [
       rebase_path(strip_executable, root_build_dir),
diff --git a/starboard/raspi/shared/launcher.py b/starboard/raspi/shared/launcher.py
index bee7f90..4076997 100644
--- a/starboard/raspi/shared/launcher.py
+++ b/starboard/raspi/shared/launcher.py
@@ -19,11 +19,11 @@
 import os
 import re
 import signal
+import six
 import sys
 import threading
 import time
 
-import _env  # pylint: disable=unused-import
 import pexpect
 from starboard.tools import abstract_launcher
 
@@ -44,7 +44,7 @@
 # First call returns True, otherwise return false.
 def FirstRun():
   v = globals()
-  if not v.has_key('first_run'):
+  if 'first_run' not in v:
     v['first_run'] = False
     return True
   return False
@@ -107,7 +107,9 @@
   def _InitPexpectCommands(self):
     """Initializes all of the pexpect commands needed for running the test."""
 
-    test_dir = os.path.join(self.out_directory, 'install', 'bin')
+    # TODO(b/218889313): This should reference the bin/ subdir when that's
+    # used.
+    test_dir = os.path.join(self.out_directory, 'install', self.target_name)
     # TODO(b/216356058): Delete this conditional that's just for GYP.
     if not os.path.isdir(test_dir):
       test_dir = os.path.join(self.out_directory, 'deploy', self.target_name)
@@ -125,7 +127,7 @@
     raspi_test_path = os.path.join(raspi_test_dir, test_file)
 
     # rsync command setup
-    options = '-avzLh'
+    options = '-avzLhc'
     source = test_dir + '/'
     destination = '{}:~/{}/'.format(raspi_user_hostname, raspi_test_dir)
     self.rsync_command = 'rsync ' + options + ' ' + source + ' ' + \
@@ -164,8 +166,9 @@
     """
 
     logging.info('executing: %s', command)
+    kwargs = {} if six.PY2 else {'encoding': 'utf-8'}
     self.pexpect_process = pexpect.spawn(
-        command, timeout=Launcher._PEXPECT_TIMEOUT)
+        command, timeout=Launcher._PEXPECT_TIMEOUT, **kwargs)
     # Let pexpect output directly to our output stream
     self.pexpect_process.logfile_read = self.output_file
     retry_count = 0
diff --git a/starboard/raspi/shared/main.cc b/starboard/raspi/shared/main.cc
index dfd20d5..d935df8 100644
--- a/starboard/raspi/shared/main.cc
+++ b/starboard/raspi/shared/main.cc
@@ -20,6 +20,10 @@
 #include "starboard/shared/signal/crash_signals.h"
 #include "starboard/shared/signal/debug_signals.h"
 #include "starboard/shared/signal/suspend_signals.h"
+#if SB_IS(EVERGREEN_COMPATIBLE)
+#include "starboard/shared/starboard/command_line.h"
+#include "starboard/shared/starboard/starboard_switches.h"
+#endif
 
 #include "third_party/crashpad/wrapper/wrapper.h"
 
@@ -33,7 +37,12 @@
   starboard::shared::signal::InstallSuspendSignalHandlers();
 
 #if SB_IS(EVERGREEN_COMPATIBLE)
-  third_party::crashpad::wrapper::InstallCrashpadHandler();
+  if (starboard::shared::starboard::CommandLine(argc, argv)
+          .HasSwitch(starboard::shared::starboard::kStartHandlerAtCrash)) {
+    third_party::crashpad::wrapper::InstallCrashpadHandler(true);
+  } else {
+    third_party::crashpad::wrapper::InstallCrashpadHandler(false);
+  }
 #endif
   starboard::raspi::shared::ApplicationDispmanx application;
   int result = application.Run(argc, argv);
diff --git a/starboard/raspi/shared/platform_configuration/BUILD.gn b/starboard/raspi/shared/platform_configuration/BUILD.gn
index f3d2403..fff6fe8 100644
--- a/starboard/raspi/shared/platform_configuration/BUILD.gn
+++ b/starboard/raspi/shared/platform_configuration/BUILD.gn
@@ -24,10 +24,6 @@
   ldflags = []
 
   defines += [
-    # By default, <EGL/eglplatform.h> pulls in some X11 headers that have some
-    # nasty macros (|Status|, for example) that conflict with Chromium base.
-    "MESA_EGL_NO_X11_HEADERS",
-
     # Cobalt on Linux flag
     "COBALT_LINUX",
     "__STDC_FORMAT_MACROS",  # so that we get PRI*
@@ -152,23 +148,27 @@
 }
 
 config("speed") {
-  cflags = [
-    "-O2",
+  cflags = [ "-O2" ]
 
-    # Compile symbols in separate sections
-    "-ffunction-sections",
-    "-fdata-sections",
-  ]
+  if (is_qa || is_gold) {
+    cflags += [
+      # Compile symbols in separate sections
+      "-ffunction-sections",
+      "-fdata-sections",
+    ]
+  }
 }
 
 config("size") {
-  cflags = [
-    "-Os",
+  cflags = [ "-Os" ]
 
-    # Compile symbols in separate sections
-    "-ffunction-sections",
-    "-fdata-sections",
-  ]
+  if (is_qa || is_gold) {
+    cflags += [
+      # Compile symbols in separate sections
+      "-ffunction-sections",
+      "-fdata-sections",
+    ]
+  }
 }
 
 config("pedantic_warnings") {
diff --git a/starboard/raspi/shared/platform_configuration/configuration.gni b/starboard/raspi/shared/platform_configuration/configuration.gni
index b55c36f..4a94871 100644
--- a/starboard/raspi/shared/platform_configuration/configuration.gni
+++ b/starboard/raspi/shared/platform_configuration/configuration.gni
@@ -15,7 +15,6 @@
 import("//starboard/build/config/base_configuration.gni")
 
 arm_float_abi = "hard"
-has_drm_support = false
 
 sb_static_contents_output_data_dir = "$root_out_dir/content"
 
@@ -28,3 +27,9 @@
 platform_tests_path = "//starboard/raspi/shared:starboard_platform_tests"
 
 install_target_path = "//starboard/raspi/shared/install_target.gni"
+
+speed_config_path = "//starboard/raspi/shared/platform_configuration:speed"
+size_config_path = "//starboard/raspi/shared/platform_configuration:size"
+
+# TODO(b/219073252): Enable -fno-exceptions and don't mix it with -fexceptions.
+enable_exceptions_override = true
diff --git a/starboard/raspi/shared/platform_deploy.gypi b/starboard/raspi/shared/platform_deploy.gypi
deleted file mode 100644
index 098a22c..0000000
--- a/starboard/raspi/shared/platform_deploy.gypi
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'variables': {
-    'executable_file': '<(PRODUCT_DIR)/<(executable_name)',
-    'deploy_executable_file': '<(target_deploy_dir)/<(executable_name)',
-  },
-  'includes': [ '<(DEPTH)/starboard/build/collect_deploy_content.gypi' ],
-  'actions': [
-    {
-      'action_name': 'deploy_executable',
-      'message': 'Strip executable: <(deploy_executable_file)',
-      'inputs': [
-        '<(executable_file)',
-        '<(content_deploy_stamp_file)',
-      ],
-      'outputs': [ '<(deploy_executable_file)' ],
-      'action': [
-        '<(STRIP)',
-        '-o', '<(deploy_executable_file)',
-        '<(executable_file)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/raspi/shared/starboard_platform.gypi b/starboard/raspi/shared/starboard_platform.gypi
deleted file mode 100644
index eae5092..0000000
--- a/starboard/raspi/shared/starboard_platform.gypi
+++ /dev/null
@@ -1,443 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    '<(DEPTH)/starboard/shared/starboard/player/filter/player_filter.gypi',
-  ],
-  'variables': {
-    'sb_pedantic_warnings': 1,
-    'starboard_platform_sources%': [],
-  },
-  'targets': [
-    {
-      'target_name': 'starboard_base_symbolize',
-      'type': 'static_library',
-      'sources': [
-        '<(DEPTH)/base/third_party/symbolize/demangle.cc',
-        '<(DEPTH)/base/third_party/symbolize/symbolize.cc',
-      ],
-      'cflags': [
-        # TODO: examine/upgrade code to see if these can be removed.
-        # Preliminary investigation suggests that a rebase of the library
-        # will get rid of some or all of the warnings.
-        '-Wno-sign-compare',
-        '-Wno-unused-parameter',
-      ],
-    },
-    {
-      'target_name': 'starboard_platform',
-      'type': 'static_library',
-      'sources': [
-        '<@(starboard_platform_sources)',
-        '<@(filter_based_player_sources)',
-        '<(DEPTH)/starboard/linux/shared/atomic_public.h',
-        '<(DEPTH)/starboard/linux/shared/configuration_constants.cc',
-        '<(DEPTH)/starboard/linux/shared/configuration_public.h',
-        '<(DEPTH)/starboard/linux/shared/netlink.cc',
-        '<(DEPTH)/starboard/linux/shared/netlink.h',
-        '<(DEPTH)/starboard/linux/shared/routes.cc',
-        '<(DEPTH)/starboard/linux/shared/routes.h',
-        '<(DEPTH)/starboard/linux/shared/system_get_connection_type.cc',
-        '<(DEPTH)/starboard/linux/shared/system_get_path.cc',
-        '<(DEPTH)/starboard/linux/shared/system_has_capability.cc',
-        '<(DEPTH)/starboard/raspi/shared/application_dispmanx.cc',
-        '<(DEPTH)/starboard/raspi/shared/audio_sink_type_dispatcher.cc',
-        '<(DEPTH)/starboard/raspi/shared/configuration.cc',
-        '<(DEPTH)/starboard/raspi/shared/configuration.h',
-        '<(DEPTH)/starboard/raspi/shared/dispmanx_util.cc',
-        '<(DEPTH)/starboard/raspi/shared/dispmanx_util.h',
-        '<(DEPTH)/starboard/raspi/shared/graphics.cc',
-        '<(DEPTH)/starboard/raspi/shared/graphics.h',
-        '<(DEPTH)/starboard/raspi/shared/main.cc',
-        '<(DEPTH)/starboard/raspi/shared/media_is_video_supported.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/decode_target_create.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/decode_target_create.h',
-        '<(DEPTH)/starboard/raspi/shared/open_max/decode_target_get_info.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/decode_target_internal.h',
-        '<(DEPTH)/starboard/raspi/shared/open_max/decode_target_release.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/dispmanx_resource_pool.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/dispmanx_resource_pool.h',
-        '<(DEPTH)/starboard/raspi/shared/open_max/image_decode.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/image_is_decode_supported.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_component_base.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_component_base.h',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_component.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_component.h',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_egl_render_component.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_egl_render_component.h',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_image_decode_component.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_image_decode_component.h',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_video_decode_component.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/open_max_video_decode_component.h',
-        '<(DEPTH)/starboard/raspi/shared/open_max/video_decoder.cc',
-        '<(DEPTH)/starboard/raspi/shared/open_max/video_decoder.h',
-        '<(DEPTH)/starboard/raspi/shared/player_components_factory.cc',
-        '<(DEPTH)/starboard/raspi/shared/system_get_device_type.cc',
-        '<(DEPTH)/starboard/raspi/shared/system_get_extensions.cc',
-        '<(DEPTH)/starboard/raspi/shared/system_get_property.cc',
-        '<(DEPTH)/starboard/raspi/shared/system_gles2.cc',
-        '<(DEPTH)/starboard/raspi/shared/thread_create_priority.cc',
-        '<(DEPTH)/starboard/raspi/shared/video_renderer_sink_impl.cc',
-        '<(DEPTH)/starboard/raspi/shared/video_renderer_sink_impl.h',
-        '<(DEPTH)/starboard/raspi/shared/window_create.cc',
-        '<(DEPTH)/starboard/raspi/shared/window_destroy.cc',
-        '<(DEPTH)/starboard/raspi/shared/window_get_platform_handle.cc',
-        '<(DEPTH)/starboard/raspi/shared/window_get_size.cc',
-        '<(DEPTH)/starboard/raspi/shared/window_internal.cc',
-        '<(DEPTH)/starboard/shared/alsa/alsa_audio_sink_type.cc',
-        '<(DEPTH)/starboard/shared/alsa/alsa_audio_sink_type.h',
-        '<(DEPTH)/starboard/shared/alsa/alsa_util.cc',
-        '<(DEPTH)/starboard/shared/alsa/alsa_util.h',
-        '<(DEPTH)/starboard/shared/dlmalloc/memory_map.cc',
-        '<(DEPTH)/starboard/shared/dlmalloc/memory_protect.cc',
-        '<(DEPTH)/starboard/shared/dlmalloc/memory_unmap.cc',
-        '<(DEPTH)/starboard/shared/egl/system_egl.cc',
-        '<(DEPTH)/starboard/shared/gcc/atomic_gcc.h',
-        '<(DEPTH)/starboard/shared/iso/character_is_alphanumeric.cc',
-        '<(DEPTH)/starboard/shared/iso/character_is_digit.cc',
-        '<(DEPTH)/starboard/shared/iso/character_is_hex_digit.cc',
-        '<(DEPTH)/starboard/shared/iso/character_is_space.cc',
-        '<(DEPTH)/starboard/shared/iso/character_is_upper.cc',
-        '<(DEPTH)/starboard/shared/iso/character_to_lower.cc',
-        '<(DEPTH)/starboard/shared/iso/character_to_upper.cc',
-        '<(DEPTH)/starboard/shared/iso/directory_close.cc',
-        '<(DEPTH)/starboard/shared/iso/directory_get_next.cc',
-        '<(DEPTH)/starboard/shared/iso/directory_open.cc',
-        '<(DEPTH)/starboard/shared/iso/double_absolute.cc',
-        '<(DEPTH)/starboard/shared/iso/double_exponent.cc',
-        '<(DEPTH)/starboard/shared/iso/double_floor.cc',
-        '<(DEPTH)/starboard/shared/iso/double_is_finite.cc',
-        '<(DEPTH)/starboard/shared/iso/double_is_nan.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_allocate_unchecked.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_compare.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_copy.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_find_byte.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_free.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_move.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_reallocate_unchecked.cc',
-        '<(DEPTH)/starboard/shared/iso/memory_set.cc',
-        '<(DEPTH)/starboard/shared/iso/string_compare_all.cc',
-        '<(DEPTH)/starboard/shared/iso/string_compare.cc',
-        '<(DEPTH)/starboard/shared/iso/string_find_character.cc',
-        '<(DEPTH)/starboard/shared/iso/string_find_last_character.cc',
-        '<(DEPTH)/starboard/shared/iso/string_find_string.cc',
-        '<(DEPTH)/starboard/shared/iso/string_get_length_wide.cc',
-        '<(DEPTH)/starboard/shared/iso/string_get_length.cc',
-        '<(DEPTH)/starboard/shared/iso/string_parse_double.cc',
-        '<(DEPTH)/starboard/shared/iso/string_parse_signed_integer.cc',
-        '<(DEPTH)/starboard/shared/iso/string_parse_uint64.cc',
-        '<(DEPTH)/starboard/shared/iso/string_parse_unsigned_integer.cc',
-        '<(DEPTH)/starboard/shared/iso/string_scan.cc',
-        '<(DEPTH)/starboard/shared/iso/system_binary_search.cc',
-        '<(DEPTH)/starboard/shared/iso/system_sort.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_add.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_create.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_destroy.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_internal.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_remove.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_wait_timed.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_wait.cc',
-        '<(DEPTH)/starboard/shared/libevent/socket_waiter_wake_up.cc',
-        '<(DEPTH)/starboard/shared/linux/byte_swap.cc',
-        '<(DEPTH)/starboard/shared/linux/cpu_features_get.cc',
-        '<(DEPTH)/starboard/shared/linux/dev_input/dev_input.cc',
-        '<(DEPTH)/starboard/shared/linux/get_home_directory.cc',
-        '<(DEPTH)/starboard/shared/linux/memory_get_stack_bounds.cc',
-        '<(DEPTH)/starboard/shared/linux/page_internal.cc',
-        '<(DEPTH)/starboard/shared/linux/socket_get_interface_address.cc',
-        '<(DEPTH)/starboard/shared/linux/system_get_random_data.cc',
-        '<(DEPTH)/starboard/shared/linux/system_get_stack.cc',
-        '<(DEPTH)/starboard/shared/linux/system_get_total_cpu_memory.cc',
-        '<(DEPTH)/starboard/shared/linux/system_get_used_cpu_memory.cc',
-        '<(DEPTH)/starboard/shared/linux/system_get_used_cpu_memory.cc',
-        '<(DEPTH)/starboard/shared/linux/system_is_debugger_attached.cc',
-        '<(DEPTH)/starboard/shared/linux/system_symbolize.cc',
-        '<(DEPTH)/starboard/shared/linux/thread_get_id.cc',
-        '<(DEPTH)/starboard/shared/linux/thread_get_name.cc',
-        '<(DEPTH)/starboard/shared/linux/thread_set_name.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_get_current.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_get_property.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_get_signed_in.cc',
-        '<(DEPTH)/starboard/shared/nouser/user_internal.cc',
-        '<(DEPTH)/starboard/shared/opus/opus_audio_decoder.cc',
-        '<(DEPTH)/starboard/shared/opus/opus_audio_decoder.h',
-        '<(DEPTH)/starboard/shared/posix/directory_create.cc',
-        '<(DEPTH)/starboard/shared/posix/file_atomic_replace.cc',
-        '<(DEPTH)/starboard/shared/posix/file_can_open.cc',
-        '<(DEPTH)/starboard/shared/posix/file_close.cc',
-        '<(DEPTH)/starboard/shared/posix/file_delete.cc',
-        '<(DEPTH)/starboard/shared/posix/file_exists.cc',
-        '<(DEPTH)/starboard/shared/posix/file_flush.cc',
-        '<(DEPTH)/starboard/shared/posix/file_get_info.cc',
-        '<(DEPTH)/starboard/shared/posix/file_get_path_info.cc',
-        '<(DEPTH)/starboard/shared/posix/file_open.cc',
-        '<(DEPTH)/starboard/shared/posix/file_read.cc',
-        '<(DEPTH)/starboard/shared/posix/file_seek.cc',
-        '<(DEPTH)/starboard/shared/posix/file_truncate.cc',
-        '<(DEPTH)/starboard/shared/posix/file_write.cc',
-        '<(DEPTH)/starboard/shared/posix/log_flush.cc',
-        '<(DEPTH)/starboard/shared/posix/log_format.cc',
-        '<(DEPTH)/starboard/shared/posix/log_is_tty.cc',
-        '<(DEPTH)/starboard/shared/posix/log_raw.cc',
-        '<(DEPTH)/starboard/shared/posix/log.cc',
-        '<(DEPTH)/starboard/shared/posix/memory_allocate_aligned_unchecked.cc',
-        '<(DEPTH)/starboard/shared/posix/memory_flush.cc',
-        '<(DEPTH)/starboard/shared/posix/memory_free_aligned.cc',
-        '<(DEPTH)/starboard/shared/posix/set_non_blocking_internal.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_accept.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_bind.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_clear_last_error.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_connect.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_create.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_destroy.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_free_resolution.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_get_last_error.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_get_local_address.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_internal.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_is_connected_and_idle.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_is_connected.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_is_ipv6_supported.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_join_multicast_group.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_listen.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_receive_from.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_resolve.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_send_to.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_broadcast.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_receive_buffer_size.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_reuse_address.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_send_buffer_size.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_tcp_keep_alive.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_tcp_no_delay.cc',
-        '<(DEPTH)/starboard/shared/posix/socket_set_tcp_window_scaling.cc',
-        '<(DEPTH)/starboard/shared/posix/storage_write_record.cc',
-        '<(DEPTH)/starboard/shared/posix/string_compare_no_case_n.cc',
-        '<(DEPTH)/starboard/shared/posix/string_compare_no_case.cc',
-        '<(DEPTH)/starboard/shared/posix/string_compare_wide.cc',
-        '<(DEPTH)/starboard/shared/posix/string_format_wide.cc',
-        '<(DEPTH)/starboard/shared/posix/string_format.cc',
-        '<(DEPTH)/starboard/shared/posix/system_break_into_debugger.cc',
-        '<(DEPTH)/starboard/shared/posix/system_clear_last_error.cc',
-        '<(DEPTH)/starboard/shared/posix/system_get_error_string.cc',
-        '<(DEPTH)/starboard/shared/posix/system_get_last_error.cc',
-        '<(DEPTH)/starboard/shared/posix/system_get_locale_id.cc',
-        '<(DEPTH)/starboard/shared/posix/system_get_number_of_processors.cc',
-        '<(DEPTH)/starboard/shared/posix/thread_sleep.cc',
-        '<(DEPTH)/starboard/shared/posix/time_get_monotonic_now.cc',
-        '<(DEPTH)/starboard/shared/posix/time_get_monotonic_thread_now.cc',
-        '<(DEPTH)/starboard/shared/posix/time_get_now.cc',
-        '<(DEPTH)/starboard/shared/posix/time_is_time_thread_now_supported.cc',
-        '<(DEPTH)/starboard/shared/posix/time_zone_get_current.cc',
-        '<(DEPTH)/starboard/shared/posix/time_zone_get_name.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_broadcast.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_create.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_destroy.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_signal.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_wait_timed.cc',
-        '<(DEPTH)/starboard/shared/pthread/condition_variable_wait.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_acquire_try.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_acquire.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_create.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_destroy.cc',
-        '<(DEPTH)/starboard/shared/pthread/mutex_release.cc',
-        '<(DEPTH)/starboard/shared/pthread/once.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_context_get_pointer.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_context_internal.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_context_internal.h',
-        '<(DEPTH)/starboard/shared/pthread/thread_create_local_key.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_create_priority.h',
-        '<(DEPTH)/starboard/shared/pthread/thread_create.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_destroy_local_key.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_detach.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_get_current.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_get_local_value.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_is_equal.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_join.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_sampler_create.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_sampler_destroy.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_sampler_freeze.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_sampler_internal.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_sampler_internal.h',
-        '<(DEPTH)/starboard/shared/pthread/thread_sampler_is_supported.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_sampler_thaw.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_set_local_value.cc',
-        '<(DEPTH)/starboard/shared/pthread/thread_yield.cc',
-        '<(DEPTH)/starboard/shared/signal/crash_signals.cc',
-        '<(DEPTH)/starboard/shared/signal/crash_signals.h',
-        '<(DEPTH)/starboard/shared/signal/debug_signals.cc',
-        '<(DEPTH)/starboard/shared/signal/debug_signals.h',
-        '<(DEPTH)/starboard/shared/signal/suspend_signals.cc',
-        '<(DEPTH)/starboard/shared/signal/suspend_signals.h',
-        '<(DEPTH)/starboard/shared/signal/system_request_conceal.cc',
-        '<(DEPTH)/starboard/shared/signal/system_request_freeze.cc',
-        '<(DEPTH)/starboard/shared/signal/system_request_suspend.cc',
-        '<(DEPTH)/starboard/shared/starboard/application.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_create.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_destroy.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_max_channels_5_1.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_min_buffer_size_in_frames.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_get_nearest_supported_sample_frequency.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_internal.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_internal.h',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_audio_frame_storage_type_supported_interleaved_only.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_audio_sample_type_supported_float32_only.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/audio_sink_is_valid.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc',
-        '<(DEPTH)/starboard/shared/starboard/audio_sink/stub_audio_sink_type.h',
-        '<(DEPTH)/starboard/shared/starboard/command_line.cc',
-        '<(DEPTH)/starboard/shared/starboard/command_line.h',
-        '<(DEPTH)/starboard/shared/starboard/crash_handler.cc',
-        '<(DEPTH)/starboard/shared/starboard/crash_handler.h',
-        '<(DEPTH)/starboard/shared/starboard/directory_can_open.cc',
-        '<(DEPTH)/starboard/shared/starboard/event_cancel.cc',
-        '<(DEPTH)/starboard/shared/starboard/event_schedule.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_atomic_replace_write_file.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_atomic_replace_write_file.h',
-        '<(DEPTH)/starboard/shared/starboard/file_mode_string_to_flags.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_close_record.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_delete_record.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_get_record_size.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_open_record.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_storage/storage_read_record.cc',
-        '<(DEPTH)/starboard/shared/starboard/log_mutex.cc',
-        '<(DEPTH)/starboard/shared/starboard/log_mutex.h',
-        '<(DEPTH)/starboard/shared/starboard/log_raw_dump_stack.cc',
-        '<(DEPTH)/starboard/shared/starboard/log_raw_format.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_buffer_budget.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_configuration_5_1.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_audio_output_count_single_audio_output.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_alignment.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_allocation_unit.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_garbage_collection_duration_threshold.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_padding.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_buffer_storage_type.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_initial_buffer_capacity.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_max_buffer_capacity.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_get_video_buffer_budget.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_is_transfer_characteristics_supported.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/mime_type.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/mime_type.h',
-        '<(DEPTH)/starboard/shared/starboard/memory.cc',
-        '<(DEPTH)/starboard/shared/starboard/new.cc',
-        '<(DEPTH)/starboard/shared/starboard/queue_application.cc',
-        '<(DEPTH)/starboard/shared/starboard/string_concat_wide.cc',
-        '<(DEPTH)/starboard/shared/starboard/string_concat.cc',
-        '<(DEPTH)/starboard/shared/starboard/string_copy_wide.cc',
-        '<(DEPTH)/starboard/shared/starboard/string_copy.cc',
-        '<(DEPTH)/starboard/shared/starboard/string_duplicate.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_get_random_uint64.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_request_blur.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_request_focus.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_request_pause.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_request_reveal.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_request_stop.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_request_unpause.cc',
-        '<(DEPTH)/starboard/shared/starboard/system_supports_resume.cc',
-        '<(DEPTH)/starboard/shared/starboard/window_set_default_options.cc',
-        '<(DEPTH)/starboard/shared/stub/accessibility_get_caption_settings.cc',
-        '<(DEPTH)/starboard/shared/stub/accessibility_get_display_settings.cc',
-        '<(DEPTH)/starboard/shared/stub/accessibility_get_text_to_speech_settings.cc',
-        '<(DEPTH)/starboard/shared/stub/accessibility_set_captions_enabled.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_create_transformer.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_destroy_transformer.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_get_tag.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_set_authenticated_data.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_set_initialization_vector.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_transform.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_close_session.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_create_system.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_destroy_system.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_generate_session_update_request.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_get_metrics.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_is_server_certificate_updatable.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_update_server_certificate.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
-        '<(DEPTH)/starboard/shared/stub/media_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/media_set_audio_write_duration.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_close.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_create.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_get_available.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_is_sample_rate_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_open.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_read.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_synthesis_cancel.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_synthesis_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_synthesis_speak.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
-        '<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
-        '<(DEPTH)/starboard/shared/stub/system_network_is_disconnected.cc',
-        '<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
-        '<(DEPTH)/starboard/shared/stub/system_sign_with_certification_secret_key.cc',
-        '<(DEPTH)/starboard/shared/stub/ui_nav_get_interface.cc',
-        '<(DEPTH)/starboard/shared/stub/window_blur_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/shared/stub/window_focus_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/shared/stub/window_get_diagonal_size_in_inches.cc',
-        '<(DEPTH)/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc',
-        '<(DEPTH)/starboard/shared/stub/window_hide_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc',
-        '<(DEPTH)/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc',
-        '<(DEPTH)/starboard/shared/stub/window_show_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc',
-      ],
-      'defines': [
-        # This must be defined when building Starboard, and must not when
-        # building Starboard client code.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/common/common.gyp:common',
-        '<(DEPTH)/third_party/libevent/libevent.gyp:libevent',
-        '<(DEPTH)/third_party/opus/opus.gyp:opus',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg.gyp:ffmpeg_linked',
-        '<(DEPTH)/starboard/shared/starboard/media/media.gyp:media_util',
-        '<(DEPTH)/starboard/shared/starboard/player/player.gyp:player',
-        'starboard_base_symbolize',
-      ],
-      'conditions': [
-        ['sb_evergreen_compatible == 1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/elf_loader/evergreen_config.gyp:evergreen_config',
-          ],},
-        ],
-        ['sb_evergreen_compatible == 1' and 'sb_evergreen_compatible_lite != 1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/loader_app/pending_restart.gyp:pending_restart',
-          ],},
-        ],
-        ['sb_evergreen_compatible_libunwind == 1', {
-          'dependencies': [
-            '<(DEPTH)/third_party/llvm-project/libunwind/libunwind.gyp:unwind_starboard',
-          ],},
-        ],
-      ],
-      'cflags': [
-        # Generated by Audio Renderer and Audio Sink implementations.
-        '-Wno-reorder',
-        # Generated by code in the raspi/shared/open_max.
-        '-Wno-sign-compare',
-        # Generated by many starboard implementation files.
-        '-Wno-unused-parameter',
-        '-Wno-unused-variable',
-      ],
-    },
-  ],
-}
diff --git a/starboard/raspi/shared/starboard_platform_tests.gypi b/starboard/raspi/shared/starboard_platform_tests.gypi
deleted file mode 100644
index 782c7cf..0000000
--- a/starboard/raspi/shared/starboard_platform_tests.gypi
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'targets': [
-    {
-      'target_name': 'starboard_platform_tests',
-      'type': '<(gtest_target_type)',
-      'includes': [
-        '<(DEPTH)/starboard/shared/starboard/player/player_tests.gypi',
-      ],
-      'sources': [
-        '<(DEPTH)/starboard/common/test_main.cc',
-        '<@(player_tests_sources)',
-      ],
-      'defines': [
-        # This allows the tests to include internal only header files.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'starboard_platform_tests_deploy',
-      'type': 'none',
-      'dependencies': [
-        '<(DEPTH)/<(starboard_path)/starboard_platform_tests.gyp:starboard_platform_tests',
-      ],
-      'variables': {
-        'executable_name': 'starboard_platform_tests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/raspi/shared/system_get_property.cc b/starboard/raspi/shared/system_get_property.cc
index 3cddd0f..b94692b 100644
--- a/starboard/raspi/shared/system_get_property.cc
+++ b/starboard/raspi/shared/system_get_property.cc
@@ -32,7 +32,7 @@
 const char* kFriendlyName = "Raspberry Pi";
 
 // Read device model from /proc/device-tree/model
-const char* GetModelName() {
+std::string GetModelName() {
   const char* file_path = "/proc/device-tree/model";
   // Size of the raw data
   size_t file_data_size;
@@ -105,7 +105,7 @@
   // Trim trailing spaces
   size_t end = model_name.find_last_not_of(" \t");
   if (end != std::string::npos) {
-    return model_name.substr(0, end + 1).c_str();
+    return model_name.substr(0, end + 1);
   } else {
     return "";
   }
@@ -135,16 +135,12 @@
 
     case kSbSystemPropertyModelName:
       return CopyStringAndTestIfSuccess(out_value, value_length,
-                                        GetModelName());
+                                        GetModelName().c_str());
 
     case kSbSystemPropertyChipsetModelNumber:
     case kSbSystemPropertyFirmwareVersion:
     case kSbSystemPropertyModelYear:
-#if SB_API_VERSION >= 12
     case kSbSystemPropertySystemIntegratorName:
-#else
-    case kSbSystemPropertyOriginalDesignManufacturerName:
-#endif
     case kSbSystemPropertySpeechApiKey:
       return false;
 
diff --git a/starboard/raspi/shared/test_filters.py b/starboard/raspi/shared/test_filters.py
index aeaed61..da172ec 100644
--- a/starboard/raspi/shared/test_filters.py
+++ b/starboard/raspi/shared/test_filters.py
@@ -15,43 +15,43 @@
 
 from starboard.tools.testing import test_filter
 
+_FILTERED_TESTS = {
+    'nplb': [
+        'SbAudioSinkTest.*',
+
+        # Permanently filter out drm system related tests as raspi doesn't
+        # support any drm systems and there is no plan to implement such
+        # support.
+        'SbDrmTest.AnySupportedKeySystems',
+        'SbMediaCanPlayMimeAndKeySystem.AnySupportedKeySystems',
+        'SbMediaCanPlayMimeAndKeySystem.KeySystemWithAttributes',
+        'SbMediaCanPlayMimeAndKeySystem.MinimumSupport',
+        'SbMediaSetAudioWriteDurationTests/*',
+        'SbPlayerWriteSampleTests*',
+        'SbUndefinedBehaviorTest.CallThisPointerIsNullRainyDay',
+        'SbSystemGetPropertyTest.FLAKY_ReturnsRequired',
+    ],
+    'player_filter_tests': [
+        # The implementations for the raspberry pi (0 and 2) are incomplete
+        # and not meant to be a reference implementation. As such we will
+        # not repair these failing tests for now.
+        'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/0',
+        'VideoDecoderTests/VideoDecoderTest.MultipleResets/0',
+        # Filter failed tests.
+        'PlayerComponentsTests/PlayerComponentsTest.*',
+    ],
+}
+
 
 class TestFilters(object):
   """Starboard Raspberry Pi platform test filters."""
 
   def GetTestFilters(self):
     filters = []
-    for target, tests in self._FILTERED_TESTS.iteritems():
+    for target, tests in _FILTERED_TESTS.items():
       filters.extend(test_filter.TestFilter(target, test) for test in tests)
     return filters
 
-  _FILTERED_TESTS = {
-      'nplb': [
-          'SbAudioSinkTest.*',
-
-          # Permanently filter out drm system related tests as raspi doesn't
-          # support any drm systems and there is no plan to implement such
-          # support.
-          'SbDrmTest.AnySupportedKeySystems',
-          'SbMediaCanPlayMimeAndKeySystem.AnySupportedKeySystems',
-          'SbMediaCanPlayMimeAndKeySystem.KeySystemWithAttributes',
-          'SbMediaCanPlayMimeAndKeySystem.MinimumSupport',
-          'SbMediaSetAudioWriteDurationTests/*',
-          'SbPlayerWriteSampleTests*',
-          'SbUndefinedBehaviorTest.CallThisPointerIsNullRainyDay',
-          'SbSystemGetPropertyTest.FLAKY_ReturnsRequired',
-      ],
-      'player_filter_tests': [
-          # The implementations for the raspberry pi (0 and 2) are incomplete
-          # and not meant to be a reference implementation. As such we will
-          # not repair these failing tests for now.
-          'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/0',
-          'VideoDecoderTests/VideoDecoderTest.MultipleResets/0',
-          # Filter failed tests.
-          'PlayerComponentsTests/PlayerComponentsTest.*',
-      ],
-  }
-
 
 def CreateTestFilters():
   return TestFilters()
diff --git a/starboard/raspi/shared/thread_create_priority.cc b/starboard/raspi/shared/thread_create_priority.cc
index 6fcdb96..2682401 100644
--- a/starboard/raspi/shared/thread_create_priority.cc
+++ b/starboard/raspi/shared/thread_create_priority.cc
@@ -23,7 +23,6 @@
 namespace shared {
 namespace pthread {
 
-#if SB_API_VERSION >= 12 || SB_HAS(THREAD_PRIORITY_SUPPORT)
 // This is the maximum priority that will be passed to SetRoundRobinScheduler().
 const int kMaxRoundRobinPriority = 2;
 
@@ -37,7 +36,8 @@
 //   @pi soft rtprio 99
 //   @pi hard nice -20
 //   @pi soft nice -20
-const char kSchedulerErrorMessage[] = "Unable to set scheduler. Please update "
+const char kSchedulerErrorMessage[] =
+    "Unable to set scheduler. Please update "
     "limits.conf to set 'rtprio' limit to 99 and 'nice' limit to -20.";
 
 // Note that use of sched_setscheduler() has been found to be more reliably
@@ -77,7 +77,7 @@
     SB_LOG(ERROR) << "Unable to use real-time round-robin scheduler because "
                   << "the maximum real-time scheduling priority is too low ("
                   << rlimit_rtprio.rlim_cur << " < " << max_used_priority
-                  <<"). Update setting using `ulimit -r` or limits.conf file.";
+                  << "). Update setting using `ulimit -r` or limits.conf file.";
     SetOtherScheduler();
     return;
   }
@@ -92,9 +92,8 @@
   }
 
   struct sched_param thread_sched_param;
-  thread_sched_param.sched_priority =
-      std::min(min_priority + priority,
-               static_cast<int>(rlimit_rtprio.rlim_cur));
+  thread_sched_param.sched_priority = std::min(
+      min_priority + priority, static_cast<int>(rlimit_rtprio.rlim_cur));
   int result = sched_setscheduler(0, SCHED_RR, &thread_sched_param);
   SB_CHECK(result == 0) << kSchedulerErrorMessage;
 }
@@ -130,9 +129,6 @@
   }
 }
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(THREAD_PRIORITY_SUPPORT)
-
 }  // namespace pthread
 }  // namespace shared
 }  // namespace starboard
diff --git a/starboard/raspi/shared/thread_types_public.h b/starboard/raspi/shared/thread_types_public.h
deleted file mode 100644
index b4cfe7f..0000000
--- a/starboard/raspi/shared/thread_types_public.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Includes threading primitive types and initializers.
-
-#ifndef STARBOARD_RASPI_SHARED_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_RASPI_SHARED_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/shared/pthread/types_public.h"
-
-#endif  // STARBOARD_RASPI_SHARED_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/sabi/_env.py b/starboard/sabi/_env.py
deleted file mode 100644
index 332eabc..0000000
--- a/starboard/sabi/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source  # pylint: disable=deprecated-module
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print('%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV))
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/sabi/omaha_request.py b/starboard/sabi/omaha_request.py
index 2af9202..298b28d 100644
--- a/starboard/sabi/omaha_request.py
+++ b/starboard/sabi/omaha_request.py
@@ -15,12 +15,10 @@
 # limitations under the License.
 """Posts an Evergreen update check against Omaha backends."""
 
-import _env  # pylint: disable=unused-import
-
 import argparse
 import sys
 import requests
-import json as simplejson
+import json
 
 from starboard.sabi import generate_sabi_id
 
@@ -50,14 +48,11 @@
             'updatecheck': {},
         }],
         'arch': '',
-        'chipset': '',
         'dedup': 'cr',
-        'firmware': '',
         'hw': {},
         'jsengine': 'v8/8.8.278.8-jit',
         'lang': 'en_US',
         'manufacturer': '',
-        'model': '',
         'nacl_arch': '',
         'os': {
             'arch': '',
@@ -69,9 +64,6 @@
         'requestid': '',
         'sessionid': '',
         'uastring': '',
-        'updaterchannelchanged': 'False',
-        'updaterversion': '21',
-        'year': ''
     }
 }
 
@@ -91,6 +83,32 @@
       help='Which channel to use.',
   )
   arg_parser.add_argument(
+      '-d',
+      '--channel_changed',
+      action='store_true',
+      default=False,
+      help='Whether this is a request from changing channels.',
+  )
+  arg_parser.add_argument(
+      '-i',
+      '--chipset',
+      default='',
+      help='Which device chipset to use.',
+  )
+  arg_parser.add_argument(
+      '-m',
+      '--model',
+      default='',
+      help='Which device model to use.',
+  )
+  arg_parser.add_argument(
+      '-p',
+      '--print_request',
+      action='store_true',
+      default=False,
+      help='Print the request sent to Omaha, including the server used.',
+  )
+  arg_parser.add_argument(
       '-q',
       '--qa',
       action='store_true',
@@ -98,32 +116,57 @@
       help='Whether to use the Omaha QA backend.',
   )
   arg_parser.add_argument(
+      '-r',
+      '--firmware',
+      default='',
+      help='Which device firmware to use.',
+  )
+  arg_parser.add_argument(
       '-s',
       '--sbversion',
       default='12',
       help='Which Starboard API version to use.',
   )
   arg_parser.add_argument(
+      '-u',
+      '--updater_version',
+      default='21',
+      help='Which Cobalt (updater) version to use. e.g. 21, 22',
+  )
+  arg_parser.add_argument(
       '-v',
       '--version',
       default='1.0.0',
       help='Which Evergreen version to use.',
   )
+  arg_parser.add_argument(
+      '-y',
+      '--year',
+      default='2022',
+      help='Which device year to use.',
+  )
   args, _ = arg_parser.parse_known_args()
 
   _REQUEST['request']['SABI'] = generate_sabi_id.DoMain()
   _REQUEST['request']['brand'] = args.brand
+  _REQUEST['request']['chipset'] = args.chipset
+  _REQUEST['request']['firmware'] = args.firmware
+  _REQUEST['request']['model'] = args.model
   _REQUEST['request']['updaterchannel'] = args.channel
+  _REQUEST['request']['updaterchannelchanged'] = args.channel_changed
   _REQUEST['request']['sbversion'] = args.sbversion
+  _REQUEST['request']['updaterversion'] = args.updater_version
+  _REQUEST['request']['year'] = args.year
   _REQUEST['request']['app'][0]['version'] = args.version
 
-  print('Querying: [[ {} ]]'.format(_ENDPOINT_QA if args.qa else _ENDPOINT))
-  print('Request:  [[ {} ]]'.format(simplejson.dumps(_REQUEST)))
+  if args.print_request:
+    print('Querying server: {}'.format(_ENDPOINT_QA if args.qa else _ENDPOINT))
+    print('Sending request: {}'.format(json.dumps(_REQUEST)))
 
   print(
       requests.post(
           _ENDPOINT_QA if args.qa else _ENDPOINT,
-          data=simplejson.dumps(_REQUEST),
+          data=json.dumps(_REQUEST),
           headers=_HEADERS).text)
 
   return 0
diff --git a/starboard/sabi/sabi.gypi b/starboard/sabi/sabi.gypi
deleted file mode 100644
index cc7a2c2..0000000
--- a/starboard/sabi/sabi.gypi
+++ /dev/null
@@ -1,133 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Starboard Application Binary Interface
-#
-# This file is [mostly] platform-agnostic and translates the set of ABI
-# variables, which should be overridden by each Evergreen platform, into build
-# time defines.
-
-{
-  'variables': {
-    # Default ABI variables
-    'sb_api_version%': 0,
-    'target_arch%': '',
-    'target_arch_sub%': '',
-    'word_size%': 0,
-    'endianness%': '',
-    'calling_convention%': '',
-    'floating_point_abi%': '',
-    'floating_point_fpu%': '',
-    'signedness_of_char%': '',
-    'signedness_of_enum%': '',
-    'alignment_char%':    0,
-    'alignment_double%':  0,
-    'alignment_float%':   0,
-    'alignment_int%':     0,
-    'alignment_llong%':   0,
-    'alignment_long%':    0,
-    'alignment_pointer%': 0,
-    'alignment_short%':   0,
-    'size_of_char%':    0,
-    'size_of_enum%':    0,
-    'size_of_double%':  0,
-    'size_of_float%':   0,
-    'size_of_int%':     0,
-    'size_of_llong%':   0,
-    'size_of_long%':    0,
-    'size_of_pointer%': 0,
-    'size_of_short%':   0,
-
-    # arm and arm64
-    'conditions': [
-      ['target_arch=="arm" or target_arch=="arm64"', {
-        'arm_float_abi': '<(floating_point_abi)',
-        'arm_fpu': '<(floating_point_fpu)',
-
-        'conditions': [
-          ['target_arch_sub=="v7a"', {
-            'arm_version': 7,
-            'armv7': 1,
-          }],
-          ['target_arch_sub=="v8a"', {
-            'arm_version': 8,
-            'armv7': 0,
-          }],
-        ],
-      }],
-    ],
-  },
-  'target_defaults': {
-    'defines': [
-      'SB_SABI_JSON_ID=R"(<!pymod_do_main(starboard.sabi.generate_sabi_id -f <(DEPTH)/<(sabi_json_path)))"',
-
-      'SB_API_VERSION=<(sb_api_version)',
-
-      'SB_SABI_TARGET_ARCH="<(target_arch)"',
-      'SB_SABI_WORD_SIZE="<(word_size)"',
-
-      # Inlined Python used to capitalize the variable values.
-      'SB_IS_ARCH_<!pymod_do_main(starboard.build.gyp_functions str_upper <(target_arch))=1',
-      'SB_HAS_<!pymod_do_main(starboard.build.gyp_functions str_upper <(calling_convention))_CALLING=1',
-      'SB_HAS_<!pymod_do_main(starboard.build.gyp_functions str_upper <(floating_point_abi))_FLOATS=1',
-
-      'SB_IS_<(word_size)_BIT=1',
-      'SB_ALIGNMENT_OF_CHAR=<(alignment_char)',
-      'SB_ALIGNMENT_OF_DOUBLE=<(alignment_double)',
-      'SB_ALIGNMENT_OF_FLOAT=<(alignment_float)',
-      'SB_ALIGNMENT_OF_INT=<(alignment_int)',
-      'SB_ALIGNMENT_OF_LLONG=<(alignment_llong)',
-      'SB_ALIGNMENT_OF_LONG=<(alignment_long)',
-      'SB_ALIGNMENT_OF_POINTER=<(alignment_pointer)',
-      'SB_ALIGNMENT_OF_SHORT=<(alignment_short)',
-      'SB_SIZE_OF_CHAR=<(size_of_char)',
-      'SB_SIZE_OF_ENUM=<(size_of_enum)',
-      'SB_SIZE_OF_DOUBLE=<(size_of_double)',
-      'SB_SIZE_OF_FLOAT=<(size_of_float)',
-      'SB_SIZE_OF_INT=<(size_of_int)',
-      'SB_SIZE_OF_LONG=<(size_of_long)',
-      'SB_SIZE_OF_LLONG=<(size_of_llong)',
-      'SB_SIZE_OF_POINTER=<(size_of_pointer)',
-      'SB_SIZE_OF_SHORT=<(size_of_short)',
-    ],
-    'conditions': [
-      ['endianness=="little"', {
-        'defines': [
-          'SB_IS_BIG_ENDIAN=0',
-          'SB_IS_LITTLE_ENDIAN=1',
-        ],
-      }, {
-        'defines': [
-          'SB_IS_BIG_ENDIAN=1',
-          'SB_IS_LITTLE_ENDIAN=0',
-        ],
-      }],
-      ['signedness_of_char=="signed"', {
-        'defines': ['SB_HAS_SIGNED_CHAR=1'],
-      }, {
-        'defines': ['SB_HAS_SIGNED_CHAR=0'],
-      }],
-      ['signedness_of_enum=="signed"', {
-        'defines': ['SB_HAS_SIGNED_ENUM=1'],
-      }, {
-        'defines': ['SB_HAS_SIGNED_ENUM=0'],
-      }],
-    ],
-  },
-  'includes': [
-    # This JSON file also happens to be valid GYP configuration language so we
-    # include it here. Slightly hacky, highly effective.
-    '<(DEPTH)/<(sabi_json_path)',
-  ],
-}
diff --git a/starboard/shared/_env.py b/starboard/shared/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/starboard/shared/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/shared/alsa/alsa_audio_sink_type.cc b/starboard/shared/alsa/alsa_audio_sink_type.cc
index 7d0048d..fdd0bfb 100644
--- a/starboard/shared/alsa/alsa_audio_sink_type.cc
+++ b/starboard/shared/alsa/alsa_audio_sink_type.cc
@@ -191,7 +191,7 @@
   SB_DCHECK(SbAudioSinkIsAudioSampleTypeSupported(sample_type_));
 
   memset(silence_frames_, 0,
-              channels * kFramesPerRequest * GetSampleSize(sample_type));
+         channels * kFramesPerRequest * GetSampleSize(sample_type));
 
   ScopedLock lock(mutex_);
   audio_out_thread_ =
@@ -385,7 +385,7 @@
       source_addr += static_cast<int>(offset_in_frames + source_frames) %
                      frames_per_channel_ * bytes_per_frame;
       memcpy(&resample_buffer_[0] + bytes_per_frame * target_frames,
-                   source_addr, bytes_per_frame);
+             source_addr, bytes_per_frame);
       ++target_frames;
       source_frames += playback_rate;
     }
@@ -408,9 +408,7 @@
       int frames_per_channel,
       SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
       SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
       SbAudioSinkPrivate::ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
       void* context) override;
 
   bool IsValid(SbAudioSink audio_sink) override {
@@ -435,9 +433,7 @@
     int frames_per_channel,
     SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
     SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
     SbAudioSinkPrivate::ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
     void* context) {
   AlsaAudioSink* audio_sink = new AlsaAudioSink(
       this, channels, sampling_frequency_hz, audio_sample_type, frame_buffers,
diff --git a/starboard/shared/dlmalloc/memory_map.cc b/starboard/shared/dlmalloc/memory_map.cc
deleted file mode 100644
index d8867d9..0000000
--- a/starboard/shared/dlmalloc/memory_map.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/memory.h"
-#include "starboard/shared/starboard/memory_reporter_internal.h"
-#include "starboard/shared/dlmalloc/page_internal.h"
-
-void* SbMemoryMap(int64_t size_bytes, int flags, const char* name) {
-  void* memory = SbPageMap(size_bytes, flags, name);
-  SbMemoryReporterReportMappedMemory(memory, size_bytes);
-  return memory;
-}
diff --git a/starboard/shared/dlmalloc/memory_protect.cc b/starboard/shared/dlmalloc/memory_protect.cc
deleted file mode 100644
index 91a4c59..0000000
--- a/starboard/shared/dlmalloc/memory_protect.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-#include "starboard/memory.h"
-#include "starboard/shared/dlmalloc/page_internal.h"
-
-bool SbMemoryProtect(void* virtual_address, int64_t size_bytes, int flags) {
-  return SbPageProtect(virtual_address, size_bytes, flags);
-}
diff --git a/starboard/shared/dlmalloc/memory_unmap.cc b/starboard/shared/dlmalloc/memory_unmap.cc
deleted file mode 100644
index f5be0a6..0000000
--- a/starboard/shared/dlmalloc/memory_unmap.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/memory.h"
-#include "starboard/shared/starboard/memory_reporter_internal.h"
-#include "starboard/shared/dlmalloc/page_internal.h"
-
-bool SbMemoryUnmap(void* virtual_address, int64_t size_bytes) {
-  SbMemoryReporterReportUnmappedMemory(virtual_address, size_bytes);
-  return SbPageUnmap(virtual_address, size_bytes);
-}
diff --git a/starboard/shared/dlmalloc/page_internal.h b/starboard/shared/dlmalloc/page_internal.h
deleted file mode 100644
index e26d509..0000000
--- a/starboard/shared/dlmalloc/page_internal.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This internal header defines a cross-platform interface for implementing
-// virtual memory management. A platform must implement this if it wants to use
-// dlmalloc.
-
-#ifndef STARBOARD_SHARED_DLMALLOC_PAGE_INTERNAL_H_
-#define STARBOARD_SHARED_DLMALLOC_PAGE_INTERNAL_H_
-
-#include "starboard/memory.h"
-#include "starboard/shared/internal_only.h"
-#include "starboard/types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
-// Allocates |size_bytes| worth of physical memory pages and maps them into an
-// available virtual region. On some platforms, |name| appears in the debugger
-// and can be up to 32 bytes. Returns SB_MEMORY_MAP_FAILED on failure, as NULL
-// is a valid return value.
-void* SbPageMap(size_t size_bytes, int flags, const char* name);
-
-// Same as SbMap() but "untracked" means size will not be reflected in
-// SbGetMappedBytes(). This should only be called by dlmalloc so that memory
-// allocated by dlmalloc isn't counted twice.
-void* SbPageMapUntracked(size_t size_bytes, int flags, const char* name);
-
-// Memory maps a file to the specified |addr| starting with |file_offset| and
-// mapping |size| bytes. The |addr| should be reserved before calling. If
-// NULL |addr| is passed a new memory block would be allocated and the address
-// returned. The file_offset must be a multiple of |kSbMemoryPageSize|.
-// On error returns NULL.
-void* SbPageMapFile(void* addr,
-                    const char* path,
-                    SbMemoryMapFlags flags,
-                    int64_t file_offset,
-                    int64_t size);
-
-// Unmap |size_bytes| of physical pages starting from |virtual_address|,
-// returning true on success. After this, [virtual_address, virtual_address +
-// size_bytes) will not be read/writable. SbUnmap() can unmap multiple
-// contiguous regions that were mapped with separate calls to
-// SbPageMap(). E.g. if one call to SbPageMap(0x1000) returns (void*)0xA000 and
-// another call to SbPageMap(0x1000) returns (void*)0xB000, SbPageUnmap(0xA000,
-// 0x2000) should free both.
-bool SbPageUnmap(void* virtual_address, size_t size_bytes);
-
-// Same as SbUnmap(), but should be used only by dlmalloc to unmap pages
-// allocated via MapUntracked().
-bool SbPageUnmapUntracked(void* virtual_address, size_t size_bytes);
-
-// Change the protection of |size_bytes| of physical pages, starting from
-// |virtual_address|, to |flags|, returning |true| on success.
-bool SbPageProtect(void* virtual_address, int64_t size_bytes, int flags);
-#endif  // SB_API_VERSION >= 12 || SB_HAS(MMAP)
-
-// Returns the total amount, in bytes, of physical memory available. Should
-// always be a multiple of kSbMemoryPageSize.
-size_t SbPageGetTotalPhysicalMemoryBytes();
-
-// Returns the amount, in bytes, of physical memory that hasn't yet been mapped.
-// Should always be a multiple of the platform's physical page size.
-int64_t SbPageGetUnallocatedPhysicalMemoryBytes();
-
-// Returns the total amount, in bytes, currently allocated via Map().  Should
-// always be a multiple of kSbMemoryPageSize.
-size_t SbPageGetMappedBytes();
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // STARBOARD_SHARED_DLMALLOC_PAGE_INTERNAL_H_
diff --git a/starboard/shared/environment.h b/starboard/shared/environment.h
new file mode 100644
index 0000000..ae6f614
--- /dev/null
+++ b/starboard/shared/environment.h
@@ -0,0 +1,31 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Module Overview: Starboard Byte Swap module C++ convenience layer
+//
+// Implements convenient templated wrappers around the core Starboard Byte Swap
+// module. These functions are used to deal with endianness when performing I/O.
+
+#ifndef STARBOARD_SHARED_ENVIRONMENT_H_
+#define STARBOARD_SHARED_ENVIRONMENT_H_
+
+#include <string>
+
+namespace starboard {
+
+std::string GetEnvironment(std::string name);
+
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_ENVIRONMENT_H_
diff --git a/starboard/shared/ffmpeg/ffmpeg.gyp b/starboard/shared/ffmpeg/ffmpeg.gyp
deleted file mode 100644
index 05416b2..0000000
--- a/starboard/shared/ffmpeg/ffmpeg.gyp
+++ /dev/null
@@ -1,97 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'target_defaults': {
-      'defines': [
-        'STARBOARD_IMPLEMENTATION',
-      ],
-  },
-  'variables': {
-    'ffmpeg_specialization_sources': [
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.h',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_common.h',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_video_decoder_impl.cc',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_video_decoder_impl.h',
-    ],
-    'ffmpeg_dispatch_sources': [
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_audio_decoder.h',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_dispatch.cc',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_dispatch.h',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_video_decoder.h',
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'libav.54.35.1',
-      'type': '<(library)',
-      'sources': [ '<@(ffmpeg_specialization_sources)' ],
-      'dependencies': [
-        '<(DEPTH)/third_party/ffmpeg_includes/ffmpeg_includes.gyp:libav.54.35.1',
-      ],
-    },
-    {
-      'target_name': 'libav.56.1.0',
-      'type': '<(library)',
-      'sources': [ '<@(ffmpeg_specialization_sources)' ],
-      'dependencies': [
-        '<(DEPTH)/third_party/ffmpeg_includes/ffmpeg_includes.gyp:libav.56.1.0',
-      ],
-    },
-    {
-      'target_name': 'ffmpeg.57.107.100',
-      'type': '<(library)',
-      'sources': [ '<@(ffmpeg_specialization_sources)' ],
-      'dependencies': [
-        '<(DEPTH)/third_party/ffmpeg_includes/ffmpeg_includes.gyp:ffmpeg.57.107.100',
-      ],
-    },
-    {
-      'target_name': 'ffmpeg.58.35.100',
-      'type': '<(library)',
-      'sources': [ '<@(ffmpeg_specialization_sources)' ],
-      'dependencies': [
-        '<(DEPTH)/third_party/ffmpeg_includes/ffmpeg_includes.gyp:ffmpeg.58.35.100',
-      ],
-    },
-    {
-      'target_name': 'ffmpeg_dynamic_load',
-      'type': '<(library)',
-      'sources': [
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_dynamic_load_audio_decoder_impl.cc',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_dynamic_load_dispatch_impl.cc',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_dynamic_load_video_decoder_impl.cc',
-        '<@(ffmpeg_dispatch_sources)',
-      ],
-      'dependencies': [
-        'ffmpeg.58.35.100',
-        'ffmpeg.57.107.100',
-        'libav.54.35.1',
-        'libav.56.1.0',
-      ],
-    },
-    {
-      'target_name': 'ffmpeg_linked',
-      'type': '<(library)',
-      'sources': [
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_linked_audio_decoder_impl.cc',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_linked_dispatch_impl.cc',
-        '<(DEPTH)/starboard/shared/ffmpeg/ffmpeg_linked_video_decoder_impl.cc',
-        '<@(ffmpeg_dispatch_sources)',
-        '<@(ffmpeg_specialization_sources)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc b/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc
index f4cb327..34d66fd 100644
--- a/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc
+++ b/starboard/shared/ffmpeg/ffmpeg_audio_decoder_impl.cc
@@ -40,13 +40,10 @@
   switch (audio_codec) {
     case kSbMediaAudioCodecAac:
       return AV_CODEC_ID_AAC;
-#if SB_API_VERSION >= 12 || SB_HAS(AC3_AUDIO)
     case kSbMediaAudioCodecAc3:
       return kSbHasAc3Audio ? AV_CODEC_ID_AC3 : AV_CODEC_ID_NONE;
     case kSbMediaAudioCodecEac3:
       return kSbHasAc3Audio ? AV_CODEC_ID_EAC3 : AV_CODEC_ID_NONE;
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(AC3_AUDIO)
     case kSbMediaAudioCodecOpus:
       return AV_CODEC_ID_OPUS;
     default:
@@ -160,14 +157,14 @@
             starboard::media::GetBytesPerSample(GetSampleType()));
     if (GetStorageType() == kSbMediaAudioFrameStorageTypeInterleaved) {
       memcpy(decoded_audio->buffer(), *av_frame_->extended_data,
-                   decoded_audio->size());
+             decoded_audio->size());
     } else {
       SB_DCHECK(GetStorageType() == kSbMediaAudioFrameStorageTypePlanar);
       const int per_channel_size_in_bytes =
           decoded_audio->size() / decoded_audio->channels();
       for (int i = 0; i < decoded_audio->channels(); ++i) {
         memcpy(decoded_audio->buffer() + per_channel_size_in_bytes * i,
-                     av_frame_->extended_data[i], per_channel_size_in_bytes);
+               av_frame_->extended_data[i], per_channel_size_in_bytes);
       }
     }
     decoded_audios_.push(decoded_audio);
@@ -285,11 +282,10 @@
     codec_context_->extradata = static_cast<uint8_t*>(ffmpeg_->av_malloc(
         codec_context_->extradata_size + kAvInputBufferPaddingSize));
     SB_DCHECK(codec_context_->extradata);
-    memcpy(codec_context_->extradata,
-                 audio_sample_info_.audio_specific_config,
-                 codec_context_->extradata_size);
+    memcpy(codec_context_->extradata, audio_sample_info_.audio_specific_config,
+           codec_context_->extradata_size);
     memset(codec_context_->extradata + codec_context_->extradata_size, 0,
-                kAvInputBufferPaddingSize);
+           kAvInputBufferPaddingSize);
   }
 
   AVCodec* codec = ffmpeg_->avcodec_find_decoder(codec_context_->codec_id);
diff --git a/starboard/shared/iso/directory_get_next.cc b/starboard/shared/iso/directory_get_next.cc
index 3422b26..b31f1d9 100644
--- a/starboard/shared/iso/directory_get_next.cc
+++ b/starboard/shared/iso/directory_get_next.cc
@@ -16,16 +16,9 @@
 
 #include "starboard/shared/iso/impl/directory_get_next.h"
 
-#if SB_API_VERSION >= 12
 bool SbDirectoryGetNext(SbDirectory directory,
                         char* out_entry,
                         size_t out_entry_size) {
   return ::starboard::shared::iso::impl::SbDirectoryGetNext(
       directory, out_entry, out_entry_size);
 }
-#else   // SB_API_VERSION >= 12
-bool SbDirectoryGetNext(SbDirectory directory, SbDirectoryEntry* out_entry) {
-  return ::starboard::shared::iso::impl::SbDirectoryGetNext(directory,
-                                                            out_entry);
-}
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/shared/iso/impl/directory_get_next.h b/starboard/shared/iso/impl/directory_get_next.h
index 21e6847..7918c26 100644
--- a/starboard/shared/iso/impl/directory_get_next.h
+++ b/starboard/shared/iso/impl/directory_get_next.h
@@ -33,15 +33,12 @@
 namespace impl {
 
 bool SbDirectoryGetNext(SbDirectory directory,
-#if SB_API_VERSION >= 12
                         char* out_entry,
                         size_t out_entry_size) {
   if (out_entry_size < kSbFileMaxName) {
     return false;
   }
-#else  // SB_API_VERSION >= 12
-                        SbDirectoryEntry* out_entry) {
-#endif  // SB_API_VERSION >= 12
+
   if (!directory || !directory->directory || !out_entry) {
     return false;
   }
@@ -53,13 +50,7 @@
     return false;
   }
 
-#if SB_API_VERSION >= 12
   starboard::strlcpy(out_entry, dirent->d_name, out_entry_size);
-#else   // SB_API_VERSION >= 12
-  SbStringCopy(out_entry->name, dirent->d_name,
-               SB_ARRAY_SIZE_INT(out_entry->name));
-#endif  // SB_API_VERSION >= 12
-
   return true;
 }
 
diff --git a/starboard/shared/libjpeg/jpeg_image_decoder.cc b/starboard/shared/libjpeg/jpeg_image_decoder.cc
index 5a24097..d81a735 100644
--- a/starboard/shared/libjpeg/jpeg_image_decoder.cc
+++ b/starboard/shared/libjpeg/jpeg_image_decoder.cc
@@ -165,7 +165,9 @@
       case kSbDecodeTargetFormat2PlaneYUVNV12:
       case kSbDecodeTargetFormat3PlaneYUVI420:
       case kSbDecodeTargetFormat3Plane10BitYUVI420:
+#if SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
       case kSbDecodeTargetFormat3Plane10BitYUVI420Compact:
+#endif  // SB_API_VERSION >= SB_DECODE_TARGET_FORMAT_YUVI420_COMPACT_API_VERSION
       case kSbDecodeTargetFormat1PlaneUYVY:
       case kSbDecodeTargetFormatInvalid:
         SB_NOTREACHED();
diff --git a/starboard/shared/linux/cpu_features_get.cc b/starboard/shared/linux/cpu_features_get.cc
index 3f5b98b..d7466cc 100644
--- a/starboard/shared/linux/cpu_features_get.cc
+++ b/starboard/shared/linux/cpu_features_get.cc
@@ -652,9 +652,7 @@
     features->x86.has_tsc = (cpuid_info[3] & (1 << 4)) != 0;
 
     features->x86.has_sse3 = (cpuid_info[2] & (1 << 0)) != 0;
-#if SB_API_VERSION >= 12
     features->x86.has_pclmulqdq = (cpuid_info[2] & (1 << 1)) != 0;
-#endif  // SB_API_VERSION >= 12
     features->x86.has_ssse3 = (cpuid_info[2] & (1 << 9)) != 0;
     features->x86.has_sse41 = (cpuid_info[2] & (1 << 19)) != 0;
     features->x86.has_sse42 = (cpuid_info[2] & (1 << 20)) != 0;
diff --git a/starboard/shared/linux/dev_input/dev_input.cc b/starboard/shared/linux/dev_input/dev_input.cc
index a984377..4a0b580 100644
--- a/starboard/shared/linux/dev_input/dev_input.cc
+++ b/starboard/shared/linux/dev_input/dev_input.cc
@@ -28,6 +28,7 @@
 #include <memory>
 #include <string>
 #include <unordered_map>
+#include <utility>
 #include <vector>
 
 #include "starboard/common/log.h"
@@ -769,7 +770,6 @@
   }
 
   while (true) {
-#if SB_API_VERSION >= 12
     std::vector<char> entry(kSbFileMaxName);
 
     if (!SbDirectoryGetNext(directory, entry.data(), kSbFileMaxName)) {
@@ -779,17 +779,6 @@
     std::string path = kDevicePath;
     path += "/";
     path += entry.data();
-#else   // SB_API_VERSION >= 12
-    SbDirectoryEntry entry;
-
-    if (!SbDirectoryGetNext(directory, &entry)) {
-      break;
-    }
-
-    std::string path = kDevicePath;
-    path += "/";
-    path += entry.name;
-#endif  // SB_API_VERSION >= 12
 
     if (SbDirectoryCanOpen(path.c_str())) {
       // This is a subdirectory. Skip.
diff --git a/starboard/shared/linux/page_internal.cc b/starboard/shared/linux/page_internal.cc
deleted file mode 100644
index e708839..0000000
--- a/starboard/shared/linux/page_internal.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Adapted from:
-// lbshell/src/platform/linux/posix_emulation/lb_shell/lb_memory_pages_linux.cc
-
-#include "starboard/shared/dlmalloc/page_internal.h"
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-#include "starboard/atomic.h"
-#include "starboard/common/log.h"
-#include "starboard/common/memory.h"
-#include "starboard/configuration_constants.h"
-#include "starboard/memory.h"
-
-namespace {
-
-int32_t s_tracked_page_count = 0;
-
-int32_t GetPageCount(size_t byte_count) {
-  return static_cast<int32_t>(
-      starboard::common::MemoryAlignToPageSize(byte_count) / kSbMemoryPageSize);
-}
-
-int SbMemoryMapFlagsToMmapProtect(int sb_flags) {
-  bool flag_set = false;
-  int mmap_protect = 0;
-  if (sb_flags == kSbMemoryMapProtectReserved) {
-    return PROT_NONE;
-  }
-  if (sb_flags & kSbMemoryMapProtectRead) {
-    mmap_protect |= PROT_READ;
-    flag_set = true;
-  }
-  if (sb_flags & kSbMemoryMapProtectWrite) {
-    mmap_protect |= PROT_WRITE;
-    flag_set = true;
-  }
-#if SB_CAN(MAP_EXECUTABLE_MEMORY)
-  if (sb_flags & kSbMemoryMapProtectExec) {
-    mmap_protect |= PROT_EXEC;
-    flag_set = true;
-  }
-#endif
-  if (!flag_set) {
-    mmap_protect = PROT_NONE;
-  }
-  return mmap_protect;
-}
-
-}  // namespace
-
-void* SbPageMap(size_t size_bytes, int flags, const char* unused_name) {
-  void* ret = SbPageMapUntracked(size_bytes, flags, NULL);
-  if (ret != SB_MEMORY_MAP_FAILED) {
-    SbAtomicNoBarrier_Increment(&s_tracked_page_count,
-                                GetPageCount(size_bytes));
-  }
-  return ret;
-}
-
-void* SbPageMapUntracked(size_t size_bytes,
-                         int flags,
-                         const char* unused_name) {
-#if SB_CAN(MAP_EXECUTABLE_MEMORY)
-  if (flags & kSbMemoryMapProtectExec) {
-    // Cobalt does not allow mapping executable memory directly.
-    return SB_MEMORY_MAP_FAILED;
-  }
-#endif
-  int mmap_protect = SbMemoryMapFlagsToMmapProtect(flags);
-  void* mem = mmap(0, size_bytes, mmap_protect, MAP_PRIVATE | MAP_ANON, -1, 0);
-  return mem;
-}
-
-void* SbPageMapFile(void* addr,
-                    const char* path,
-                    SbMemoryMapFlags flags,
-                    int64_t file_offset,
-                    int64_t size) {
-  int fd = open(path, O_RDONLY);
-  if (fd == -1) {
-    return nullptr;
-  }
-
-  void* p = nullptr;
-  if (addr != nullptr) {
-    p = mmap(addr, size, SbMemoryMapFlagsToMmapProtect(flags),
-             MAP_PRIVATE | MAP_FIXED, fd, file_offset);
-    if (p == MAP_FAILED) {
-      close(fd);
-      return nullptr;
-    }
-  } else {
-    p = mmap(addr, size, SbMemoryMapFlagsToMmapProtect(flags), MAP_PRIVATE, fd,
-             file_offset);
-    if (p == MAP_FAILED) {
-      close(fd);
-      return nullptr;
-    }
-  }
-  // It is OK to close the file descriptor as the memory
-  // mapping keeps the file open.
-  close(fd);
-  return p;
-}
-
-bool SbPageUnmap(void* ptr, size_t size_bytes) {
-  SbAtomicNoBarrier_Increment(&s_tracked_page_count, -GetPageCount(size_bytes));
-  return SbPageUnmapUntracked(ptr, size_bytes);
-}
-
-bool SbPageUnmapUntracked(void* ptr, size_t size_bytes) {
-  return munmap(ptr, size_bytes) == 0;
-}
-
-bool SbPageProtect(void* virtual_address, int64_t size_bytes, int flags) {
-  int mmap_protect = SbMemoryMapFlagsToMmapProtect(flags);
-  return mprotect(virtual_address, size_bytes, mmap_protect) == 0;
-}
-
-size_t SbPageGetTotalPhysicalMemoryBytes() {
-  // Limit ourselves to remain similar to more constrained platforms.
-  return 1024U * 1024 * 1024;
-}
-
-int64_t SbPageGetUnallocatedPhysicalMemoryBytes() {
-  // Computes unallocated memory as the total system memory (our fake 1GB limit)
-  // minus the # of resident pages.
-
-  // statm provides info about our memory usage.
-  // Columns are: size, resident, share, text, lib, data, and dt.
-  // Just consider "resident" pages for our purposes.
-  const char* kStatmPath = "/proc/self/statm";
-  FILE* f = fopen(kStatmPath, "r");
-  if (!f) {
-    SB_DLOG(FATAL) << "Failed to open " << kStatmPath;
-    return 0;
-  }
-  size_t program_size = 0;
-  size_t resident = 0;
-
-  fscanf(f, "%zu %zu", &program_size, &resident);
-  fclose(f);
-  return SbPageGetTotalPhysicalMemoryBytes() - resident * kSbMemoryPageSize;
-}
-
-size_t SbPageGetMappedBytes() {
-  return static_cast<size_t>(SbAtomicNoBarrier_Load(&s_tracked_page_count) *
-                             kSbMemoryPageSize);
-}
diff --git a/starboard/shared/posix/environment.cc b/starboard/shared/posix/environment.cc
new file mode 100644
index 0000000..358b104
--- /dev/null
+++ b/starboard/shared/posix/environment.cc
@@ -0,0 +1,28 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stdlib.h>
+
+#include "starboard/shared/environment.h"
+
+namespace starboard {
+
+std::string GetEnvironment(std::string name) {
+  const char* environment_string = getenv(name.c_str());
+  if (environment_string != nullptr)
+    return std::string(environment_string);
+  return "";
+}
+
+}  // namespace starboard
diff --git a/starboard/shared/posix/file_atomic_replace.cc b/starboard/shared/posix/file_atomic_replace.cc
index b452f84..0b68518 100644
--- a/starboard/shared/posix/file_atomic_replace.cc
+++ b/starboard/shared/posix/file_atomic_replace.cc
@@ -22,8 +22,6 @@
 #include "starboard/configuration_constants.h"
 #include "starboard/shared/starboard/file_atomic_replace_write_file.h"
 
-#if SB_API_VERSION >= 12
-
 namespace {
 
 const char kTempFileSuffix[] = ".temp";
@@ -55,5 +53,3 @@
   }
   return true;
 }
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/shared/posix/memory_map.cc b/starboard/shared/posix/memory_map.cc
new file mode 100644
index 0000000..41b2d5c
--- /dev/null
+++ b/starboard/shared/posix/memory_map.cc
@@ -0,0 +1,23 @@
+// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+#include "starboard/shared/posix/page_internal.h"
+#include "starboard/shared/starboard/memory_reporter_internal.h"
+
+void* SbMemoryMap(int64_t size_bytes, int flags, const char* name) {
+  void* memory = SbPageMap(size_bytes, flags, name);
+  SbMemoryReporterReportMappedMemory(memory, size_bytes);
+  return memory;
+}
diff --git a/starboard/shared/posix/memory_mapped_file.cc b/starboard/shared/posix/memory_mapped_file.cc
index d9a3dfb..c10bc8c 100644
--- a/starboard/shared/posix/memory_mapped_file.cc
+++ b/starboard/shared/posix/memory_mapped_file.cc
@@ -16,7 +16,7 @@
 
 #include "cobalt/extension/memory_mapped_file.h"
 #include "starboard/common/log.h"
-#include "starboard/shared/dlmalloc/page_internal.h"
+#include "starboard/shared/posix/page_internal.h"
 
 namespace starboard {
 namespace shared {
diff --git a/starboard/shared/posix/memory_protect.cc b/starboard/shared/posix/memory_protect.cc
new file mode 100644
index 0000000..1d861fd
--- /dev/null
+++ b/starboard/shared/posix/memory_protect.cc
@@ -0,0 +1,21 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/configuration.h"
+#include "starboard/memory.h"
+#include "starboard/shared/posix/page_internal.h"
+
+bool SbMemoryProtect(void* virtual_address, int64_t size_bytes, int flags) {
+  return SbPageProtect(virtual_address, size_bytes, flags);
+}
diff --git a/starboard/shared/posix/memory_unmap.cc b/starboard/shared/posix/memory_unmap.cc
new file mode 100644
index 0000000..93d2db9
--- /dev/null
+++ b/starboard/shared/posix/memory_unmap.cc
@@ -0,0 +1,22 @@
+// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+#include "starboard/shared/posix/page_internal.h"
+#include "starboard/shared/starboard/memory_reporter_internal.h"
+
+bool SbMemoryUnmap(void* virtual_address, int64_t size_bytes) {
+  SbMemoryReporterReportUnmappedMemory(virtual_address, size_bytes);
+  return SbPageUnmap(virtual_address, size_bytes);
+}
diff --git a/starboard/shared/posix/page_internal.cc b/starboard/shared/posix/page_internal.cc
new file mode 100644
index 0000000..49cbb8a
--- /dev/null
+++ b/starboard/shared/posix/page_internal.cc
@@ -0,0 +1,140 @@
+// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Adapted from:
+// lbshell/src/platform/linux/posix_emulation/lb_shell/lb_memory_pages_linux.cc
+
+#include "starboard/shared/posix/page_internal.h"
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#include "starboard/atomic.h"
+#include "starboard/common/log.h"
+#include "starboard/common/memory.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/memory.h"
+
+namespace {
+
+int32_t s_tracked_page_count = 0;
+
+int32_t GetPageCount(size_t byte_count) {
+  return static_cast<int32_t>(
+      starboard::common::MemoryAlignToPageSize(byte_count) / kSbMemoryPageSize);
+}
+
+int SbMemoryMapFlagsToMmapProtect(int sb_flags) {
+  bool flag_set = false;
+  int mmap_protect = 0;
+  if (sb_flags == kSbMemoryMapProtectReserved) {
+    return PROT_NONE;
+  }
+  if (sb_flags & kSbMemoryMapProtectRead) {
+    mmap_protect |= PROT_READ;
+    flag_set = true;
+  }
+  if (sb_flags & kSbMemoryMapProtectWrite) {
+    mmap_protect |= PROT_WRITE;
+    flag_set = true;
+  }
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
+  if (sb_flags & kSbMemoryMapProtectExec) {
+    mmap_protect |= PROT_EXEC;
+    flag_set = true;
+  }
+#endif
+  if (!flag_set) {
+    mmap_protect = PROT_NONE;
+  }
+  return mmap_protect;
+}
+
+void* SbPageMapUntracked(size_t size_bytes,
+                         int flags,
+                         const char* unused_name) {
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
+  if (flags & kSbMemoryMapProtectExec) {
+    // Cobalt does not allow mapping executable memory directly.
+    return SB_MEMORY_MAP_FAILED;
+  }
+#endif
+  int mmap_protect = SbMemoryMapFlagsToMmapProtect(flags);
+  void* mem = mmap(0, size_bytes, mmap_protect, MAP_PRIVATE | MAP_ANON, -1, 0);
+  return mem;
+}
+
+bool SbPageUnmapUntracked(void* ptr, size_t size_bytes) {
+  return munmap(ptr, size_bytes) == 0;
+}
+
+}  // namespace
+
+void* SbPageMap(size_t size_bytes, int flags, const char* unused_name) {
+  void* ret = SbPageMapUntracked(size_bytes, flags, NULL);
+  if (ret != SB_MEMORY_MAP_FAILED) {
+    SbAtomicNoBarrier_Increment(&s_tracked_page_count,
+                                GetPageCount(size_bytes));
+  }
+  return ret;
+}
+
+void* SbPageMapFile(void* addr,
+                    const char* path,
+                    SbMemoryMapFlags flags,
+                    int64_t file_offset,
+                    int64_t size) {
+  int fd = open(path, O_RDONLY);
+  if (fd == -1) {
+    return nullptr;
+  }
+
+  void* p = nullptr;
+  if (addr != nullptr) {
+    p = mmap(addr, size, SbMemoryMapFlagsToMmapProtect(flags),
+             MAP_PRIVATE | MAP_FIXED, fd, file_offset);
+    if (p == MAP_FAILED) {
+      close(fd);
+      return nullptr;
+    }
+  } else {
+    p = mmap(addr, size, SbMemoryMapFlagsToMmapProtect(flags), MAP_PRIVATE, fd,
+             file_offset);
+    if (p == MAP_FAILED) {
+      close(fd);
+      return nullptr;
+    }
+  }
+  // It is OK to close the file descriptor as the memory
+  // mapping keeps the file open.
+  close(fd);
+  return p;
+}
+
+bool SbPageUnmap(void* ptr, size_t size_bytes) {
+  SbAtomicNoBarrier_Increment(&s_tracked_page_count, -GetPageCount(size_bytes));
+  return SbPageUnmapUntracked(ptr, size_bytes);
+}
+
+bool SbPageProtect(void* virtual_address, int64_t size_bytes, int flags) {
+  int mmap_protect = SbMemoryMapFlagsToMmapProtect(flags);
+  return mprotect(virtual_address, size_bytes, mmap_protect) == 0;
+}
+
+size_t SbPageGetMappedBytes() {
+  return static_cast<size_t>(SbAtomicNoBarrier_Load(&s_tracked_page_count) *
+                             kSbMemoryPageSize);
+}
diff --git a/starboard/shared/posix/page_internal.h b/starboard/shared/posix/page_internal.h
new file mode 100644
index 0000000..d653730
--- /dev/null
+++ b/starboard/shared/posix/page_internal.h
@@ -0,0 +1,64 @@
+// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_POSIX_PAGE_INTERNAL_H_
+#define STARBOARD_SHARED_POSIX_PAGE_INTERNAL_H_
+
+#include "starboard/memory.h"
+#include "starboard/shared/internal_only.h"
+#include "starboard/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Allocates |size_bytes| worth of physical memory pages and maps them into an
+// available virtual region. On some platforms, |name| appears in the debugger
+// and can be up to 32 bytes. Returns SB_MEMORY_MAP_FAILED on failure, as NULL
+// is a valid return value.
+void* SbPageMap(size_t size_bytes, int flags, const char* name);
+
+// Memory maps a file to the specified |addr| starting with |file_offset| and
+// mapping |size| bytes. The |addr| should be reserved before calling. If
+// NULL |addr| is passed a new memory block would be allocated and the address
+// returned. The file_offset must be a multiple of |kSbMemoryPageSize|.
+// On error returns NULL.
+void* SbPageMapFile(void* addr,
+                    const char* path,
+                    SbMemoryMapFlags flags,
+                    int64_t file_offset,
+                    int64_t size);
+
+// Unmap |size_bytes| of physical pages starting from |virtual_address|,
+// returning true on success. After this, [virtual_address, virtual_address +
+// size_bytes) will not be read/writable. SbUnmap() can unmap multiple
+// contiguous regions that were mapped with separate calls to
+// SbPageMap(). E.g. if one call to SbPageMap(0x1000) returns (void*)0xA000 and
+// another call to SbPageMap(0x1000) returns (void*)0xB000, SbPageUnmap(0xA000,
+// 0x2000) should free both.
+bool SbPageUnmap(void* virtual_address, size_t size_bytes);
+
+// Change the protection of |size_bytes| of physical pages, starting from
+// |virtual_address|, to |flags|, returning |true| on success.
+bool SbPageProtect(void* virtual_address, int64_t size_bytes, int flags);
+
+// Returns the total amount, in bytes, currently allocated via Map().  Should
+// always be a multiple of kSbMemoryPageSize.
+size_t SbPageGetMappedBytes();
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+#endif  // STARBOARD_SHARED_POSIX_PAGE_INTERNAL_H_
diff --git a/starboard/shared/posix/socket_bind.cc b/starboard/shared/posix/socket_bind.cc
index fcb5869..42f8335 100644
--- a/starboard/shared/posix/socket_bind.cc
+++ b/starboard/shared/posix/socket_bind.cc
@@ -28,21 +28,21 @@
                            const SbSocketAddress* local_address) {
   if (!SbSocketIsValid(socket)) {
     errno = EBADF;
-    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid socket";
+    SB_LOG(ERROR) << __FUNCTION__ << ": Invalid socket";
     return kSbSocketErrorFailed;
   }
 
   sbposix::SockAddr sock_addr;
   if (!sock_addr.FromSbSocketAddress(local_address)) {
-    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid address";
+    SB_LOG(ERROR) << __FUNCTION__ << ": Invalid address";
     return (socket->error = sbposix::TranslateSocketErrno(EINVAL));
   }
 
   SB_DCHECK(socket->socket_fd >= 0);
   if (local_address->type != socket->address_type) {
-    SB_DLOG(ERROR) << __FUNCTION__ << ": Incompatible addresses: "
-                   << "socket type = " << socket->address_type
-                   << ", argument type = " << local_address->type;
+    SB_LOG(ERROR) << __FUNCTION__ << ": Incompatible addresses: "
+                  << "socket type = " << socket->address_type
+                  << ", argument type = " << local_address->type;
     return (socket->error = sbposix::TranslateSocketErrno(EAFNOSUPPORT));
   }
 
@@ -63,7 +63,7 @@
   int result = HANDLE_EINTR(
       bind(socket->socket_fd, sock_addr.sockaddr(), sock_addr.length));
   if (result != 0) {
-    SB_DLOG(ERROR) << __FUNCTION__ << ": Bind failed. errno=" << errno;
+    SB_LOG(ERROR) << __FUNCTION__ << ": Bind failed. errno=" << errno;
     return (socket->error = sbposix::TranslateSocketErrno(errno));
   }
 
diff --git a/starboard/shared/posix/socket_connect.cc b/starboard/shared/posix/socket_connect.cc
index 0172da5..aa47dea 100644
--- a/starboard/shared/posix/socket_connect.cc
+++ b/starboard/shared/posix/socket_connect.cc
@@ -30,15 +30,15 @@
 
   sbposix::SockAddr sock_addr;
   if (!sock_addr.FromSbSocketAddress(address)) {
-    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid address";
+    SB_LOG(ERROR) << __FUNCTION__ << ": Invalid address";
     return (socket->error = kSbSocketErrorFailed);
   }
 
   SB_DCHECK(socket->socket_fd >= 0);
   if (address->type != socket->address_type) {
-    SB_DLOG(ERROR) << __FUNCTION__ << ": Incompatible addresses: "
-                   << "socket type = " << socket->address_type
-                   << ", argument type = " << address->type;
+    SB_LOG(ERROR) << __FUNCTION__ << ": Incompatible addresses: "
+                  << "socket type = " << socket->address_type
+                  << ", argument type = " << address->type;
     return (socket->error = kSbSocketErrorFailed);
   }
 
@@ -49,7 +49,7 @@
   }
 
   if (result != 0) {
-    SB_DLOG(ERROR) << __FUNCTION__ << ": connect failed: " << errno;
+    SB_LOG(ERROR) << __FUNCTION__ << ": connect failed: " << errno;
     return (socket->error = kSbSocketErrorFailed);
   }
 
diff --git a/starboard/shared/posix/socket_internal.cc b/starboard/shared/posix/socket_internal.cc
index 1b18007..3e60e5b 100644
--- a/starboard/shared/posix/socket_internal.cc
+++ b/starboard/shared/posix/socket_internal.cc
@@ -34,7 +34,7 @@
 const socklen_t kAddressStructLengthIpv6 =
     static_cast<socklen_t>(sizeof(struct sockaddr_in6));
 #endif
-}
+}  // namespace
 
 SbSocketError TranslateSocketErrno(int error) {
   switch (error) {
@@ -73,8 +73,8 @@
   int result =
       setsockopt(socket->socket_fd, level, option_code, &on, sizeof(on));
   if (result != 0) {
-    SB_DLOG(ERROR) << "Failed to set " << option_name << " on socket "
-                   << socket->socket_fd << ", errno = " << errno;
+    SB_LOG(ERROR) << "Failed to set " << option_name << " on socket "
+                  << socket->socket_fd << ", errno = " << errno;
     socket->error = TranslateSocketErrno(errno);
     return false;
   }
@@ -97,8 +97,8 @@
   int result =
       setsockopt(socket->socket_fd, level, option_code, &value, sizeof(value));
   if (result != 0) {
-    SB_DLOG(ERROR) << "Failed to set " << option_name << " on socket "
-                   << socket->socket_fd << ", errno = " << errno;
+    SB_LOG(ERROR) << "Failed to set " << option_name << " on socket "
+                  << socket->socket_fd << ", errno = " << errno;
     socket->error = TranslateSocketErrno(errno);
     return false;
   }
@@ -147,7 +147,7 @@
     return false;
   }
 
-  // Check that we have been properly initialized.
+// Check that we have been properly initialized.
 #if SB_HAS(IPV6)
   SB_DCHECK(length == kAddressStructLengthIpv4 ||
             length == kAddressStructLengthIpv6);
@@ -209,7 +209,7 @@
 #endif
   }
 
-  SB_DLOG(WARNING) << "Unrecognized address family: " << family;
+  SB_LOG(WARNING) << "Unrecognized address family: " << family;
   return false;
 }
 
diff --git a/starboard/shared/posix/socket_is_ipv6_supported.cc b/starboard/shared/posix/socket_is_ipv6_supported.cc
index 8ae972b..9675b50 100644
--- a/starboard/shared/posix/socket_is_ipv6_supported.cc
+++ b/starboard/shared/posix/socket_is_ipv6_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/socket.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbSocketIsIpv6Supported() {
   return SB_HAS_IPV6;
 }
-
-#endif
diff --git a/starboard/shared/posix/socket_join_multicast_group.cc b/starboard/shared/posix/socket_join_multicast_group.cc
index 72d3593..0dde43f 100644
--- a/starboard/shared/posix/socket_join_multicast_group.cc
+++ b/starboard/shared/posix/socket_join_multicast_group.cc
@@ -45,8 +45,8 @@
   int result = setsockopt(socket->socket_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                           &imreq, sizeof(imreq));
   if (result != 0) {
-    SB_DLOG(ERROR) << "Failed to IP_ADD_MEMBERSHIP on socket "
-                   << socket->socket_fd << ", errno = " << errno;
+    SB_LOG(ERROR) << "Failed to IP_ADD_MEMBERSHIP on socket "
+                  << socket->socket_fd << ", errno = " << errno;
     socket->error = sbposix::TranslateSocketErrno(errno);
     return false;
   }
diff --git a/starboard/shared/posix/socket_receive_from.cc b/starboard/shared/posix/socket_receive_from.cc
index de1e2b8..8c0b779 100644
--- a/starboard/shared/posix/socket_receive_from.cc
+++ b/starboard/shared/posix/socket_receive_from.cc
@@ -49,14 +49,14 @@
       int result = getpeername(socket->socket_fd, sock_addr.sockaddr(),
                                &sock_addr.length);
       if (result < 0) {
-        SB_DLOG(ERROR) << __FUNCTION__
-                       << ": getpeername failed, errno = " << errno;
+        SB_LOG(ERROR) << __FUNCTION__
+                      << ": getpeername failed, errno = " << errno;
         socket->error = sbposix::TranslateSocketErrno(errno);
         return -1;
       }
 
       if (!sock_addr.ToSbSocketAddress(out_source)) {
-        SB_DLOG(FATAL) << __FUNCTION__ << ": Bad TCP source address.";
+        SB_LOG(FATAL) << __FUNCTION__ << ": Bad TCP source address.";
         socket->error = kSbSocketErrorFailed;
         return -1;
       }
@@ -71,7 +71,7 @@
 
     if (IsReportableErrno(errno) &&
         socket->error != sbposix::TranslateSocketErrno(errno)) {
-      SB_DLOG(ERROR) << "recv failed, errno = " << errno;
+      SB_LOG(ERROR) << "recv failed, errno = " << errno;
     }
     socket->error = sbposix::TranslateSocketErrno(errno);
     return -1;
@@ -84,7 +84,7 @@
     if (bytes_read >= 0) {
       if (out_source) {
         if (!sock_addr.ToSbSocketAddress(out_source)) {
-          SB_DLOG(FATAL) << __FUNCTION__ << ": Bad UDP source address.";
+          SB_LOG(FATAL) << __FUNCTION__ << ": Bad UDP source address.";
           socket->error = kSbSocketErrorFailed;
           return -1;
         }
@@ -96,7 +96,7 @@
 
     if (errno != EAGAIN && errno != EWOULDBLOCK &&
         socket->error != sbposix::TranslateSocketErrno(errno)) {
-      SB_DLOG(ERROR) << "recvfrom failed, errno = " << errno;
+      SB_LOG(ERROR) << "recvfrom failed, errno = " << errno;
     }
     socket->error = sbposix::TranslateSocketErrno(errno);
     return -1;
diff --git a/starboard/shared/posix/socket_send_to.cc b/starboard/shared/posix/socket_send_to.cc
index cdee458..3e81ae0 100644
--- a/starboard/shared/posix/socket_send_to.cc
+++ b/starboard/shared/posix/socket_send_to.cc
@@ -39,7 +39,7 @@
   SB_DCHECK(socket->socket_fd >= 0);
   if (socket->protocol == kSbSocketProtocolTcp) {
     if (destination) {
-      SB_DLOG(FATAL) << "Destination passed to TCP send.";
+      SB_LOG(FATAL) << "Destination passed to TCP send.";
       socket->error = kSbSocketErrorFailed;
       return -1;
     }
@@ -52,13 +52,13 @@
     }
 
     if (errno != EAGAIN && errno != EWOULDBLOCK) {
-      SB_DLOG(ERROR) << "send failed, errno = " << errno;
+      SB_LOG(ERROR) << "send failed, errno = " << errno;
     }
     socket->error = sbposix::TranslateSocketErrno(errno);
     return -1;
   } else if (socket->protocol == kSbSocketProtocolUdp) {
     if (!destination) {
-      SB_DLOG(FATAL) << "No destination passed to UDP send.";
+      SB_LOG(FATAL) << "No destination passed to UDP send.";
       socket->error = kSbSocketErrorFailed;
       return -1;
     }
@@ -68,7 +68,7 @@
     socklen_t sockaddr_length = 0;
     if (destination) {
       if (!sock_addr.FromSbSocketAddress(destination)) {
-        SB_DLOG(FATAL) << "Invalid destination passed to UDP send.";
+        SB_LOG(FATAL) << "Invalid destination passed to UDP send.";
         socket->error = kSbSocketErrorFailed;
         return -1;
       }
@@ -84,7 +84,7 @@
     }
 
     if (errno != EAGAIN && errno != EWOULDBLOCK) {
-      SB_DLOG(ERROR) << "sendto failed, errno = " << errno;
+      SB_LOG(ERROR) << "sendto failed, errno = " << errno;
     }
     socket->error = sbposix::TranslateSocketErrno(errno);
     return -1;
diff --git a/starboard/shared/posix/time_is_time_thread_now_supported.cc b/starboard/shared/posix/time_is_time_thread_now_supported.cc
index a97d2cc..b45e116 100644
--- a/starboard/shared/posix/time_is_time_thread_now_supported.cc
+++ b/starboard/shared/posix/time_is_time_thread_now_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/time.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbTimeIsTimeThreadNowSupported() {
   return true;
 }
-
-#endif
diff --git a/starboard/shared/pthread/mutex_acquire.cc b/starboard/shared/pthread/mutex_acquire.cc
index 3266ed9..cf951e4 100644
--- a/starboard/shared/pthread/mutex_acquire.cc
+++ b/starboard/shared/pthread/mutex_acquire.cc
@@ -29,12 +29,11 @@
     return kSbMutexDestroyed;
   }
 
-#if SB_API_VERSION >= 12
   if (!EnsureInitialized(&(SB_INTERNAL_MUTEX(mutex)->initialized_state))) {
     *SB_PTHREAD_INTERNAL_MUTEX(mutex) = PTHREAD_MUTEX_INITIALIZER;
     SetInitialized(&(SB_INTERNAL_MUTEX(mutex)->initialized_state));
   }
-#endif
+
 #if SB_ENABLE_CONCURRENCY_DEBUG
   starboard::experimental::ScopedMutexWaitTracker tracker(mutex);
   if (tracker.acquired()) {
diff --git a/starboard/shared/pthread/mutex_acquire_try.cc b/starboard/shared/pthread/mutex_acquire_try.cc
index 8c5c241..f9d86a3 100644
--- a/starboard/shared/pthread/mutex_acquire_try.cc
+++ b/starboard/shared/pthread/mutex_acquire_try.cc
@@ -28,12 +28,10 @@
     return kSbMutexDestroyed;
   }
 
-#if SB_API_VERSION >= 12
   if (!EnsureInitialized(&(SB_INTERNAL_MUTEX(mutex)->initialized_state))) {
     *SB_PTHREAD_INTERNAL_MUTEX(mutex) = PTHREAD_MUTEX_INITIALIZER;
     SetInitialized(&(SB_INTERNAL_MUTEX(mutex)->initialized_state));
   }
-#endif
 
   int result = pthread_mutex_trylock(SB_PTHREAD_INTERNAL_MUTEX(mutex));
   if (IsSuccess(result)) {
diff --git a/starboard/shared/pthread/mutex_create.cc b/starboard/shared/pthread/mutex_create.cc
index 55b6a94..744caf4 100644
--- a/starboard/shared/pthread/mutex_create.cc
+++ b/starboard/shared/pthread/mutex_create.cc
@@ -24,16 +24,12 @@
 using starboard::shared::starboard::SetInitialized;
 
 bool SbMutexCreate(SbMutex* mutex) {
-#if SB_API_VERSION >= 12
   SB_COMPILE_ASSERT(sizeof(SbMutex) >= sizeof(SbMutexPrivate),
                     sb_mutex_private_larger_than_sb_mutex);
-#endif
   if (!mutex) {
     return false;
   }
 
-#if SB_API_VERSION >= 12
   SetInitialized(&(SB_INTERNAL_MUTEX(mutex)->initialized_state));
-#endif
   return IsSuccess(pthread_mutex_init(SB_PTHREAD_INTERNAL_MUTEX(mutex), NULL));
 }
diff --git a/starboard/shared/pthread/mutex_destroy.cc b/starboard/shared/pthread/mutex_destroy.cc
index f2d0b15..3fb53f5 100644
--- a/starboard/shared/pthread/mutex_destroy.cc
+++ b/starboard/shared/pthread/mutex_destroy.cc
@@ -29,25 +29,12 @@
     return false;
   }
 
-#if SB_API_VERSION >= 12
   if (!IsInitialized(&(SB_INTERNAL_MUTEX(mutex)->initialized_state))) {
     // If the mutex is not initialized there is nothing to destroy.
     return true;
   }
-#endif
 
-#if SB_API_VERSION >= 12
   // Both trying to recursively acquire a mutex that is locked by the calling
   // thread, as well as deleting a locked mutex, result in undefined behavior.
   return IsSuccess(pthread_mutex_destroy(SB_PTHREAD_INTERNAL_MUTEX(mutex)));
-#else   // SB_API_VERSION >= 12
-  // Destroying a locked mutex is undefined, so fail if the mutex is
-  // already locked,
-  if (!IsSuccess(pthread_mutex_trylock(SB_PTHREAD_INTERNAL_MUTEX(mutex)))) {
-    SB_LOG(ERROR) << "Trying to destroy a locked mutex";
-    return false;
-  }
-  return IsSuccess(pthread_mutex_unlock(SB_PTHREAD_INTERNAL_MUTEX(mutex))) &&
-         IsSuccess(pthread_mutex_destroy(SB_PTHREAD_INTERNAL_MUTEX(mutex)));
-#endif  // SB_API_VERSION >= 12
 }
diff --git a/starboard/shared/pthread/mutex_release.cc b/starboard/shared/pthread/mutex_release.cc
index d2ce183..86b318f 100644
--- a/starboard/shared/pthread/mutex_release.cc
+++ b/starboard/shared/pthread/mutex_release.cc
@@ -27,12 +27,9 @@
     return false;
   }
 
-#if SB_API_VERSION >= 12
   if (!IsInitialized(&(SB_INTERNAL_MUTEX(mutex)->initialized_state))) {
     // If the mutex is not initialized there is nothing to release.
     return true;
   }
-#endif
-
   return IsSuccess(pthread_mutex_unlock(SB_PTHREAD_INTERNAL_MUTEX(mutex)));
 }
diff --git a/starboard/shared/pthread/once.cc b/starboard/shared/pthread/once.cc
index e3a898e..cb6e743 100644
--- a/starboard/shared/pthread/once.cc
+++ b/starboard/shared/pthread/once.cc
@@ -24,23 +24,19 @@
 using starboard::shared::starboard::SetInitialized;
 
 bool SbOnce(SbOnceControl* once_control, SbOnceInitRoutine init_routine) {
-#if SB_API_VERSION >= 12
   SB_COMPILE_ASSERT(sizeof(SbOnceControl) >= sizeof(SbOnceControlPrivate),
                     sb_once_control_private_larger_than_sb_once_control);
-#endif
   if (once_control == NULL) {
     return false;
   }
   if (init_routine == NULL) {
     return false;
   }
-#if SB_API_VERSION >= 12
   if (!EnsureInitialized(
           &(SB_INTERNAL_ONCE(once_control)->initialized_state))) {
     *SB_PTHREAD_INTERNAL_ONCE(once_control) = PTHREAD_ONCE_INIT;
     SetInitialized(&(SB_INTERNAL_ONCE(once_control)->initialized_state));
   }
-#endif
 
   return pthread_once(SB_PTHREAD_INTERNAL_ONCE(once_control), init_routine) ==
          0;
diff --git a/starboard/shared/pthread/thread_context_get_pointer.cc b/starboard/shared/pthread/thread_context_get_pointer.cc
index 80e94a0..174355b 100644
--- a/starboard/shared/pthread/thread_context_get_pointer.cc
+++ b/starboard/shared/pthread/thread_context_get_pointer.cc
@@ -39,11 +39,9 @@
       *out_value = context->fp_;
       return true;
 
-#if SB_API_VERSION >= 12
     case kSbThreadContextLinkRegister:
       *out_value = context->lr_;
       return true;
-#endif  // SB_API_VERSION >= 12
 
     default:
       SB_NOTIMPLEMENTED() << "SbThreadContextGetPointer not implemented for "
diff --git a/starboard/shared/pthread/thread_create.cc b/starboard/shared/pthread/thread_create.cc
index 5db5a21..baec37e 100644
--- a/starboard/shared/pthread/thread_create.cc
+++ b/starboard/shared/pthread/thread_create.cc
@@ -27,14 +27,7 @@
 
 namespace starboard {
 namespace shared {
-namespace pthread {
-
-#if SB_API_VERSION < 12 && !SB_HAS(THREAD_PRIORITY_SUPPORT)
-// Default implementation without thread priority support
-void ThreadSetPriority(SbThreadPriority priority) {}
-#endif
-
-}  // namespace pthread
+namespace pthread {}  // namespace pthread
 }  // namespace shared
 }  // namespace starboard
 
diff --git a/starboard/shared/pthread/types_internal.h b/starboard/shared/pthread/types_internal.h
index 0670baf..3030d6f 100644
--- a/starboard/shared/pthread/types_internal.h
+++ b/starboard/shared/pthread/types_internal.h
@@ -11,13 +11,10 @@
 // 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.
-
 #include "starboard/shared/starboard/lazy_initialization_public.h"
-
 #ifndef STARBOARD_SHARED_PTHREAD_TYPES_INTERNAL_H_
 #define STARBOARD_SHARED_PTHREAD_TYPES_INTERNAL_H_
 
-#if SB_API_VERSION >= 12
 #define SB_INTERNAL_MUTEX(mutex_var) \
   reinterpret_cast<SbMutexPrivate*>((mutex_var)->mutex_buffer)
 #define SB_PTHREAD_INTERNAL_MUTEX(mutex_var) \
@@ -33,15 +30,6 @@
 #define SB_PTHREAD_INTERNAL_CONDITION(condition_var) \
   reinterpret_cast<SbConditionVariablePrivate*>(     \
       (condition_var)->condition_buffer)
-#else
-#define SB_PTHREAD_INTERNAL_MUTEX(mutex_var) (mutex_var)
-#define SB_PTHREAD_INTERNAL_ONCE(once_var) (once_var)
-#define SB_PTHREAD_INTERNAL_THREAD(thread) (thread)
-#define SB_PTHREAD_INTERNAL_THREAD_PTR(thread) \
-  reinterpret_cast<pthread_t*>(&(thread))
-#define SB_THREAD(thread) (thread)
-#define SB_PTHREAD_INTERNAL_CONDITION(condition_var) (condition_var)
-#endif  // SB_API_VERSION >= 12
 
 // Transparent Condition Variable handle.
 // It is customized from the plain pthread_cont_t object because we
@@ -52,7 +40,6 @@
   InitializedState initialized_state;
   pthread_cond_t condition;
 } SbConditionVariablePrivate;
-
 // Wrapping pthread_mutex_t to add initialization state
 // which allows for lazy initialization to PTHREAD_MUTEX_INITIALIZER.
 // NOTE: The actual value of PTHREAD_MUTEX_INITIALIZER.
@@ -60,7 +47,6 @@
   InitializedState initialized_state;
   pthread_mutex_t mutex;
 } SbMutexPrivate;
-
 // Wrapping pthread_once_t to add initialization state
 // which allows for lazy initialization to PTHREAD_ONCE_INIT.
 // NOTE: The actual value of PTHREAD_ONCE_INIT.
@@ -68,5 +54,4 @@
   InitializedState initialized_state;
   pthread_once_t once;
 } SbOnceControlPrivate;
-
 #endif  // STARBOARD_SHARED_PTHREAD_TYPES_INTERNAL_H_
diff --git a/starboard/shared/pthread/types_public.h b/starboard/shared/pthread/types_public.h
deleted file mode 100644
index ebdee71..0000000
--- a/starboard/shared/pthread/types_public.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Defines the pthread versions of Starboard synchronization primitives and the
-// static initializers for those primitives.
-
-#ifndef STARBOARD_SHARED_PTHREAD_TYPES_PUBLIC_H_
-#define STARBOARD_SHARED_PTHREAD_TYPES_PUBLIC_H_
-
-#if SB_API_VERSION >= 12
-#error "The starboard/shared/pthread/types_public.h is deprecated."
-#endif  // SB_API_VERSION >= 12
-
-#include "starboard/types.h"
-
-#include <pthread.h>
-
-#include "starboard/shared/starboard/lazy_initialization_public.h"
-
-// --- SbConditionVariable ---
-
-// Transparent Condition Variable handle.
-// It is customized from the plain pthread_cont_t object because we
-// need to ensure that each condition variable is initialized to use
-// CLOCK_MONOTONIC, which is not the default (and the default is used
-// when PTHREAD_COND_INITIALIZER is set).
-typedef struct SbConditionVariable {
-  InitializedState initialized_state;
-  pthread_cond_t condition;
-} SbConditionVariable;
-
-// Condition Variable static initializer.
-#define SB_CONDITION_VARIABLE_INITIALIZER \
-  { INITIALIZED_STATE_UNINITIALIZED, 0 }
-
-// --- SbMutex ---
-
-// Transparent Mutex handle.
-typedef pthread_mutex_t SbMutex;
-
-// Mutex static initializer.
-#define SB_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
-
-// --- SbOnce ---
-
-// Transparent Once control handle.
-typedef pthread_once_t SbOnceControl;
-
-// Once static initializer.
-#define SB_ONCE_INITIALIZER PTHREAD_ONCE_INIT
-
-// --- SbThread ---
-
-// Transparent pthread handle.
-typedef pthread_t SbThread;
-
-// Well-defined constant value to mean "no thread handle."
-#define kSbThreadInvalid (SbThread)-1
-
-#endif  // STARBOARD_SHARED_PTHREAD_TYPES_PUBLIC_H_
diff --git a/starboard/shared/pulse/pulse_audio_sink_type.cc b/starboard/shared/pulse/pulse_audio_sink_type.cc
index 5c74442..1b51c18 100644
--- a/starboard/shared/pulse/pulse_audio_sink_type.cc
+++ b/starboard/shared/pulse/pulse_audio_sink_type.cc
@@ -132,9 +132,7 @@
       int frames_per_channel,
       SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
       SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
       SbAudioSinkPrivate::ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
       void* context) override;
   bool IsValid(SbAudioSink audio_sink) override {
     return audio_sink != kSbAudioSinkInvalid && audio_sink->IsType(this);
@@ -399,9 +397,7 @@
     int frames_per_channel,
     SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
     SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
     SbAudioSinkPrivate::ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
     void* context) {
   PulseAudioSink* audio_sink = new PulseAudioSink(
       this, channels, sampling_frequency_hz, audio_sample_type, frame_buffers,
@@ -442,7 +438,7 @@
   if (!mainloop_) {
     return false;
   }
-  // Create pulse context.
+// Create pulse context.
 #if HAS_LEAK_SANITIZER
   __lsan_disable();
 #endif
diff --git a/starboard/shared/speechd/speech_synthesis_is_supported.cc b/starboard/shared/speechd/speech_synthesis_is_supported.cc
index ee7f1be..dfba33e 100644
--- a/starboard/shared/speechd/speech_synthesis_is_supported.cc
+++ b/starboard/shared/speechd/speech_synthesis_is_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/speech_synthesis.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbSpeechSynthesisIsSupported() {
   return true;
 }
-
-#endif
diff --git a/starboard/shared/starboard/application.cc b/starboard/shared/starboard/application.cc
index 2d34e10..65bc7ab 100644
--- a/starboard/shared/starboard/application.cc
+++ b/starboard/shared/starboard/application.cc
@@ -600,6 +600,7 @@
     start_data->argument_values[i] = const_cast<char*>(args[i].c_str());
   }
   start_data->link = start_link_;
+
 #if SB_API_VERSION >= 13
   return new Event(type, timestamp, start_data, &DeleteStartData);
 #else  // SB_API_VERSION >= 13
diff --git a/starboard/shared/starboard/application.h b/starboard/shared/starboard/application.h
index 6281f00..eaa8f6c 100644
--- a/starboard/shared/starboard/application.h
+++ b/starboard/shared/starboard/application.h
@@ -145,8 +145,10 @@
   // deleted.
   struct Event {
 #if SB_API_VERSION >= 13
-     Event(SbEventType type, SbTimeMonotonic timestamp,
-           void* data, SbEventDataDestructor destructor)
+    Event(SbEventType type,
+          SbTimeMonotonic timestamp,
+          void* data,
+          SbEventDataDestructor destructor)
         : event(new SbEvent()), destructor(destructor), error_level(0) {
       event->type = type;
       event->timestamp = timestamp;
@@ -168,7 +170,7 @@
       event->timestamp = SbTimeGetMonotonicNow();
       event->data = data;
     }
-#else  // SB_API_VERSION >= 13
+#else   // SB_API_VERSION >= 13
     Event(SbEventType type, void* data, SbEventDataDestructor destructor)
         : event(new SbEvent()), destructor(destructor), error_level(0) {
       event->type = type;
@@ -473,11 +475,11 @@
   // some point.
   virtual bool IsStartImmediate() { return true; }
 
-  // Synchronously dispatches a Start event to the system event handler. Must be
-  // called on the main dispatch thread.
+// Synchronously dispatches a Start event to the system event handler. Must be
+// called on the main dispatch thread.
 #if SB_API_VERSION >= 13
   void DispatchStart(SbTimeMonotonic timestamp);
-#else  // SB_API_VERSION >= 13
+#else   // SB_API_VERSION >= 13
   void DispatchStart();
 #endif  // SB_API_VERSION >= 13
 
@@ -488,11 +490,11 @@
   // |IsPreloadImmediate|, if true, takes precedence over |IsStartImmediate|.
   virtual bool IsPreloadImmediate() { return false; }
 
-  // Synchronously dispatches a Preload event to the system event handler. Must
-  // be called on the main dispatch thread.
+// Synchronously dispatches a Preload event to the system event handler. Must
+// be called on the main dispatch thread.
 #if SB_API_VERSION >= 13
   void DispatchPreload(SbTimeMonotonic timestamp);
-#else  // SB_API_VERSION >= 13
+#else   // SB_API_VERSION >= 13
   void DispatchPreload();
 #endif  // SB_API_VERSION >= 13
 
@@ -510,11 +512,11 @@
   void CallTeardownCallbacks();
 
  private:
-  // Creates an initial event type of either Start or Preload with the original
-  // command line and deep link.
+// Creates an initial event type of either Start or Preload with the original
+// command line and deep link.
 #if SB_API_VERSION >= 13
   Event* CreateInitialEvent(SbEventType type, SbTimeMonotonic timestamp);
-#else  // SB_API_VERSION >= 13
+#else   // SB_API_VERSION >= 13
   Event* CreateInitialEvent(SbEventType type);
 #endif  // SB_API_VERSION >= 13
 
diff --git a/starboard/shared/starboard/audio_sink/audio_sink_create.cc b/starboard/shared/starboard/audio_sink/audio_sink_create.cc
index e0f30f5..7061745 100644
--- a/starboard/shared/starboard/audio_sink/audio_sink_create.cc
+++ b/starboard/shared/starboard/audio_sink/audio_sink_create.cc
@@ -30,9 +30,6 @@
   return SbAudioSinkPrivate::Create(
       channels, sampling_frequency_hz, audio_sample_type,
       audio_frame_storage_type, frame_buffers, frame_buffers_size_in_frames,
-      update_source_status_func, consume_frames_func,
-#if SB_API_VERSION >= 12
-      NULL /*error_func*/,
-#endif  // SB_API_VERSION >= 12
+      update_source_status_func, consume_frames_func, NULL /*error_func*/,
       context);
 }
diff --git a/starboard/shared/starboard/audio_sink/audio_sink_internal.cc b/starboard/shared/starboard/audio_sink/audio_sink_internal.cc
index 0d4ae83..61bcdb4 100644
--- a/starboard/shared/starboard/audio_sink/audio_sink_internal.cc
+++ b/starboard/shared/starboard/audio_sink/audio_sink_internal.cc
@@ -39,16 +39,8 @@
                            int frames_consumed,
                            SbTime frames_consumed_at,
                            void* context) {
-#if SB_API_VERSION >= 12
   SB_UNREFERENCED_PARAMETER(frames_consumed_at);
   sb_consume_frames_func(frames_consumed, context);
-#else  // SB_API_VERSION >= 12
-  sb_consume_frames_func(frames_consumed,
-#if SB_HAS(SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING)
-                         frames_consumed_at,
-#endif
-                         context);
-#endif  // SB_API_VERSION >=  12
 }
 
 }  // namespace
@@ -117,9 +109,7 @@
     int frame_buffers_size_in_frames,
     SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
     ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
     ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
     void* context) {
   if (channels <= 0 || channels > SbAudioSinkGetMaxChannels()) {
     SB_LOG(WARNING) << "Invalid audio channels " << channels;
@@ -168,11 +158,7 @@
     auto audio_sink = audio_sink_type->Create(
         channels, sampling_frequency_hz, audio_sample_type,
         audio_frame_storage_type, frame_buffers, frame_buffers_size_in_frames,
-        update_source_status_func, consume_frames_func,
-#if SB_API_VERSION >= 12
-        error_func,
-#endif  // SB_API_VERSION >= 12
-        context);
+        update_source_status_func, consume_frames_func, error_func, context);
     if (audio_sink_type->IsValid(audio_sink)) {
       return audio_sink;
     }
@@ -187,11 +173,7 @@
     auto audio_sink = fallback_type->Create(
         channels, sampling_frequency_hz, audio_sample_type,
         audio_frame_storage_type, frame_buffers, frame_buffers_size_in_frames,
-        update_source_status_func, consume_frames_func,
-#if SB_API_VERSION >= 12
-        error_func,
-#endif  // SB_API_VERSION >= 12
-        context);
+        update_source_status_func, consume_frames_func, error_func, context);
     if (fallback_type->IsValid(audio_sink)) {
       return audio_sink;
     }
@@ -213,9 +195,7 @@
     int frame_buffers_size_in_frames,
     SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
     SbAudioSinkConsumeFramesFunc sb_consume_frames_func,
-#if SB_API_VERSION >= 12
     ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
     void* context) {
   return Create(channels, sampling_frequency_hz, audio_sample_type,
                 audio_frame_storage_type, frame_buffers,
@@ -224,8 +204,5 @@
                     ? std::bind(&::WrapConsumeFramesFunc,
                                 sb_consume_frames_func, _1, _2, _3)
                     : ConsumeFramesFunc(),
-#if SB_API_VERSION >= 12
-                error_func,
-#endif  // SB_API_VERSION >= 12
-                context);
+                error_func, context);
 }
diff --git a/starboard/shared/starboard/audio_sink/audio_sink_internal.h b/starboard/shared/starboard/audio_sink/audio_sink_internal.h
index 6923a22..57e282a 100644
--- a/starboard/shared/starboard/audio_sink/audio_sink_internal.h
+++ b/starboard/shared/starboard/audio_sink/audio_sink_internal.h
@@ -24,14 +24,12 @@
 #include "starboard/shared/internal_only.h"
 
 struct SbAudioSinkPrivate {
-#if SB_API_VERSION >= 12
   // When |capability_changed| is true, it hints that the error is caused by a
   // a transient capability on the platform.  The app should retry playback to
   // recover from the error.
   typedef void (*ErrorFunc)(bool capability_changed,
                             const std::string& error_message,
                             void* context);
-#endif  // SB_API_VERSION >= 12
 
   typedef std::function<
       void(int frames_consumed, SbTime frames_consumed_at, void* context)>
@@ -51,9 +49,7 @@
         int frame_buffers_size_in_frames,
         SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
         ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
         ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
         void* context) = 0;
     virtual bool IsValid(SbAudioSink audio_sink) = 0;
     virtual void Destroy(SbAudioSink audio_sink) = 0;
@@ -95,9 +91,7 @@
       int frame_buffers_size_in_frames,
       SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
       ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
       ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
       void* context);
 
   static SbAudioSink Create(
@@ -109,9 +103,7 @@
       int frame_buffers_size_in_frames,
       SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
       SbAudioSinkConsumeFramesFunc sb_consume_frames_func,
-#if SB_API_VERSION >= 12
       ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
       void* context);
 
   // Individual implementation has to provide implementation of the following
diff --git a/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc b/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc
index e82d6b8..0510c98 100644
--- a/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc
+++ b/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc
@@ -38,12 +38,9 @@
   ~StubAudioSink() override;
 
   bool IsType(Type* type) override { return type_ == type; }
-  void SetPlaybackRate(double playback_rate) override {
-    SB_NOTIMPLEMENTED();
-  }
+  void SetPlaybackRate(double playback_rate) override { SB_NOTIMPLEMENTED(); }
 
-  void SetVolume(double volume) override {
-  }
+  void SetVolume(double volume) override {}
 
  private:
   static void* ThreadEntryPoint(void* context);
@@ -137,11 +134,8 @@
     int frame_buffers_size_in_frames,
     SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
     SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
     SbAudioSinkPrivate::ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
     void* context) {
-
   return new StubAudioSink(this, sampling_frequency_hz,
                            update_source_status_func, consume_frames_func,
                            context);
diff --git a/starboard/shared/starboard/audio_sink/stub_audio_sink_type.h b/starboard/shared/starboard/audio_sink/stub_audio_sink_type.h
index 7ee89a8..d1d59de 100644
--- a/starboard/shared/starboard/audio_sink/stub_audio_sink_type.h
+++ b/starboard/shared/starboard/audio_sink/stub_audio_sink_type.h
@@ -35,9 +35,7 @@
       int frame_buffers_size_in_frames,
       SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
       SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
       SbAudioSinkPrivate::ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
       void* context) override;
 
   bool IsValid(SbAudioSink audio_sink) override {
diff --git a/starboard/shared/starboard/configuration_constants_compatibility_defines.h b/starboard/shared/starboard/configuration_constants_compatibility_defines.h
deleted file mode 100644
index 1aff514..0000000
--- a/starboard/shared/starboard/configuration_constants_compatibility_defines.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2019 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file defines macros to provide convenience for backwards compatibility
-// after the change that migrated certain configuration macros to extern
-// variables.
-
-#ifndef STARBOARD_SHARED_STARBOARD_CONFIGURATION_CONSTANTS_COMPATIBILITY_DEFINES_H_
-#define STARBOARD_SHARED_STARBOARD_CONFIGURATION_CONSTANTS_COMPATIBILITY_DEFINES_H_
-
-#if SB_API_VERSION >= 12
-
-#error \
-    "This file is only relevant for Starboard versions before 12. Please do " \
-"not include this file otherwise."
-
-#else  // SB_API_VERSION >= 12
-
-#define kSbDefaultMmapThreshold SB_DEFAULT_MMAP_THRESHOLD
-
-#define kSbFileMaxName SB_FILE_MAX_NAME
-
-#define kSbFileMaxOpen SB_FILE_MAX_OPEN
-
-#define kSbFileAltSepChar SB_FILE_ALT_SEP_CHAR
-
-#define kSbFileAltSepString SB_FILE_ALT_SEP_STRING
-
-#define kSbFileMaxPath SB_FILE_MAX_PATH
-
-#define kSbFileSepChar SB_FILE_SEP_CHAR
-
-#define kSbFileSepString SB_FILE_SEP_STRING
-
-#define kSbHasAc3Audio SB_HAS_AC3_AUDIO
-
-#define kSbHasMediaWebmVp9Support SB_HAS_MEDIA_WEBM_VP9_SUPPORT
-
-#define kSbHasThreadPrioritySupport SB_HAS_THREAD_PRIORITY_SUPPORT
-
-#define kSbMallocAlignment SB_MALLOC_ALIGNMENT
-
-#define kSbMaxThreadLocalKeys SB_MAX_THREAD_LOCAL_KEYS
-
-#define kSbMaxThreadNameLength SB_MAX_THREAD_NAME_LENGTH
-
-#define kSbMediaMaxAudioBitrateInBitsPerSecond \
-  SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND
-
-#define kSbMediaMaxVideoBitrateInBitsPerSecond \
-  SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND
-
-#define kSbMediaVideoFrameAlignment SB_MEDIA_VIDEO_FRAME_ALIGNMENT
-
-#define kSbMemoryLogPath SB_MEMORY_LOG_PATH
-
-#define kSbMemoryPageSize SB_MEMORY_PAGE_SIZE
-
-#define kSbNetworkReceiveBufferSize SB_NETWORK_RECEIVE_BUFFER_SIZE
-
-#define kSbMaxThreads SB_MAX_THREADS
-
-#define kSbPathSepChar SB_PATH_SEP_CHAR
-
-#define kSbPathSepString SB_PATH_SEP_STRING
-
-#define kSbPreferredRgbaByteOrder SB_PREFERRED_RGBA_BYTE_ORDER
-
-#define kSbUserMaxSignedIn SB_USER_MAX_SIGNED_IN
-
-#endif  // SB_API_VERSION >= 12
-
-#endif  // STARBOARD_SHARED_STARBOARD_CONFIGURATION_CONSTANTS_COMPATIBILITY_DEFINES_H_
diff --git a/starboard/shared/starboard/cryptography/cryptography_create_transformer.cc b/starboard/shared/starboard/cryptography/cryptography_create_transformer.cc
deleted file mode 100644
index 11e0b71..0000000
--- a/starboard/shared/starboard/cryptography/cryptography_create_transformer.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/common/log.h"
-#include "starboard/common/string.h"
-#include "starboard/cryptography.h"
-#include "starboard/memory.h"
-#include "starboard/shared/starboard/cryptography/cryptography_internal.h"
-#include "starboard/shared/starboard/cryptography/software_aes.h"
-
-using starboard::shared::starboard::cryptography::AES_KEY;
-using starboard::shared::starboard::cryptography::AES_gcm128_init;
-using starboard::shared::starboard::cryptography::Algorithm;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Cbc;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Ctr;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Ecb;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Gcm;
-
-SbCryptographyTransformer SbCryptographyCreateTransformer(
-    const char* algorithm,
-    int block_size_bits,
-    SbCryptographyDirection direction,
-    SbCryptographyBlockCipherMode mode,
-    const void* initialization_vector,
-    int initialization_vector_size,
-    const void* key,
-    int key_size) {
-  if (strcmp(algorithm, kSbCryptographyAlgorithmAes) != 0) {
-    SB_DLOG(WARNING) << "Unsupported algorithm: " << algorithm;
-    return kSbCryptographyInvalidTransformer;
-  }
-
-  if (block_size_bits != 128) {
-    SB_DLOG(WARNING) << "Unsupported block size: " << block_size_bits;
-    return kSbCryptographyInvalidTransformer;
-  }
-
-  Algorithm combined_algorithm;
-  if (mode == kSbCryptographyBlockCipherModeCbc) {
-    combined_algorithm = kAlgorithmAes128Cbc;
-  } else if (mode == kSbCryptographyBlockCipherModeCtr) {
-    combined_algorithm = kAlgorithmAes128Ctr;
-  } else if (mode == kSbCryptographyBlockCipherModeEcb) {
-    combined_algorithm = kAlgorithmAes128Ecb;
-  } else if (mode == kSbCryptographyBlockCipherModeGcm) {
-    combined_algorithm = kAlgorithmAes128Gcm;
-  } else {
-    SB_DLOG(WARNING) << "Unsupported block cipher mode: " << mode;
-    return kSbCryptographyInvalidTransformer;
-  }
-
-  if (mode == kSbCryptographyBlockCipherModeGcm ||
-      mode == kSbCryptographyBlockCipherModeEcb) {
-    if (initialization_vector_size != 0) {
-      SB_DLOG(WARNING) << "Unsupported initialization_vector_size: "
-                       << initialization_vector_size;
-      return kSbCryptographyInvalidTransformer;
-    }
-  } else if (mode == kSbCryptographyBlockCipherModeCtr) {
-    if (initialization_vector_size != 0 && initialization_vector_size != 12 &&
-        initialization_vector_size != 16 && initialization_vector_size != 32) {
-      SB_DLOG(WARNING) << "Unsupported CTR initialization_vector_size: "
-                       << initialization_vector_size;
-      return kSbCryptographyInvalidTransformer;
-    }
-  } else if (initialization_vector_size != block_size_bits / 8) {
-    SB_DLOG(WARNING) << "Unsupported initialization_vector_size: "
-                     << initialization_vector_size;
-    return kSbCryptographyInvalidTransformer;
-  }
-
-  if (key_size != 16 && key_size != 24 && key_size != 32) {
-    SB_DLOG(WARNING) << "Unsupported key_size: " << key_size;
-    return kSbCryptographyInvalidTransformer;
-  }
-
-  AES_KEY aeskey = {0};
-  int result = -1;
-  if (direction == kSbCryptographyDirectionDecode &&
-      mode != kSbCryptographyBlockCipherModeCtr &&
-      mode != kSbCryptographyBlockCipherModeGcm) {
-    result = AES_set_decrypt_key(key, key_size * 8, &aeskey);
-  } else {
-    result = AES_set_encrypt_key(key, key_size * 8, &aeskey);
-  }
-
-  if (result != 0) {
-    SB_DLOG(WARNING) << "Error setting key: " << result;
-    return kSbCryptographyInvalidTransformer;
-  }
-
-  SbCryptographyTransformer transformer =
-      new SbCryptographyTransformerPrivate();
-  memset(transformer, 0, sizeof(transformer));
-  transformer->key = aeskey;
-  transformer->algorithm = combined_algorithm;
-  transformer->direction = direction;
-  if (initialization_vector_size) {
-    memcpy(transformer->ivec, initialization_vector,
-                 initialization_vector_size);
-  }
-
-  if (transformer->algorithm == kAlgorithmAes128Gcm) {
-    AES_gcm128_init(&transformer->gcm_context, &transformer->key,
-                    direction == kSbCryptographyDirectionEncode ? 1 : 0);
-  }
-
-  return transformer;
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/starboard/cryptography/cryptography_destroy_transformer.cc b/starboard/shared/starboard/cryptography/cryptography_destroy_transformer.cc
deleted file mode 100644
index f87e2ed..0000000
--- a/starboard/shared/starboard/cryptography/cryptography_destroy_transformer.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-#include "starboard/shared/starboard/cryptography/cryptography_internal.h"
-
-void SbCryptographyDestroyTransformer(SbCryptographyTransformer transformer) {
-  if (!transformer) {
-    return;
-  }
-
-  delete transformer;
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/starboard/cryptography/cryptography_get_tag.cc b/starboard/shared/starboard/cryptography/cryptography_get_tag.cc
deleted file mode 100644
index 9b19b98..0000000
--- a/starboard/shared/starboard/cryptography/cryptography_get_tag.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-#include "starboard/shared/starboard/cryptography/cryptography_internal.h"
-#include "starboard/shared/starboard/cryptography/software_aes.h"
-
-using starboard::shared::starboard::cryptography::AES_gcm128_tag;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Gcm;
-
-bool SbCryptographyGetTag(
-    SbCryptographyTransformer transformer,
-    void* out_tag,
-    int out_tag_size) {
-  if (transformer->algorithm != kAlgorithmAes128Gcm) {
-    SB_DLOG(ERROR) << "Trying to get tag on non-GCM transformer.";
-    return false;
-  }
-
-  AES_gcm128_tag(&transformer->gcm_context, out_tag, out_tag_size);
-  return true;
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/starboard/cryptography/cryptography_internal.h b/starboard/shared/starboard/cryptography/cryptography_internal.h
deleted file mode 100644
index 8b00947..0000000
--- a/starboard/shared/starboard/cryptography/cryptography_internal.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_SHARED_STARBOARD_CRYPTOGRAPHY_CRYPTOGRAPHY_INTERNAL_H_
-#define STARBOARD_SHARED_STARBOARD_CRYPTOGRAPHY_CRYPTOGRAPHY_INTERNAL_H_
-
-#if SB_API_VERSION >= 12
-#error "Starboard Crypto API is deprecated"
-#else
-
-#include "starboard/cryptography.h"
-
-#include "starboard/shared/internal_only.h"
-#include "starboard/shared/starboard/cryptography/software_aes.h"
-
-namespace starboard {
-namespace shared {
-namespace starboard {
-namespace cryptography {
-
-// The modes supported by this software-only implementation.
-enum Algorithm {
-  kAlgorithmAes128Cbc,
-  kAlgorithmAes128Ctr,
-  kAlgorithmAes128Ecb,
-  kAlgorithmAes128Gcm,
-};
-
-}  // namespace cryptography
-}  // namespace starboard
-}  // namespace shared
-}  // namespace starboard
-
-struct SbCryptographyTransformerPrivate {
-  starboard::shared::starboard::cryptography::Algorithm algorithm;
-  SbCryptographyDirection direction;
-  starboard::shared::starboard::cryptography::GCM128_CONTEXT gcm_context;
-  starboard::shared::starboard::cryptography::AES_KEY key;
-  uint8_t ivec[SB_AES_BLOCK_SIZE];
-  uint8_t ecount_buf[SB_AES_BLOCK_SIZE];
-  uint32_t counter;
-};
-
-#endif  // SB_API_VERSION >= 12
-
-#endif  // STARBOARD_SHARED_STARBOARD_CRYPTOGRAPHY_CRYPTOGRAPHY_INTERNAL_H_
diff --git a/starboard/shared/starboard/cryptography/cryptography_set_authenticated_data.cc b/starboard/shared/starboard/cryptography/cryptography_set_authenticated_data.cc
deleted file mode 100644
index e8c973f..0000000
--- a/starboard/shared/starboard/cryptography/cryptography_set_authenticated_data.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-#include "starboard/shared/starboard/cryptography/cryptography_internal.h"
-#include "starboard/shared/starboard/cryptography/software_aes.h"
-
-using starboard::shared::starboard::cryptography::AES_gcm128_aad;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Gcm;
-
-bool SbCryptographySetAuthenticatedData(
-    SbCryptographyTransformer transformer,
-    const void* data,
-    int data_size) {
-  if (transformer->algorithm != kAlgorithmAes128Gcm) {
-    SB_DLOG(ERROR) << "Trying to set AAD on non-GCM transformer.";
-    return false;
-  }
-
-  int result = AES_gcm128_aad(&transformer->gcm_context, data, data_size);
-  return result == 1;
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/starboard/cryptography/cryptography_set_initialization_vector.cc b/starboard/shared/starboard/cryptography/cryptography_set_initialization_vector.cc
deleted file mode 100644
index 42de9ba..0000000
--- a/starboard/shared/starboard/cryptography/cryptography_set_initialization_vector.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-#include <algorithm>
-
-#include "starboard/memory.h"
-#include "starboard/shared/starboard/cryptography/cryptography_internal.h"
-#include "starboard/shared/starboard/cryptography/software_aes.h"
-
-using starboard::shared::starboard::cryptography::AES_gcm128_setiv;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Gcm;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Ctr;
-
-void SbCryptographySetInitializationVector(
-    SbCryptographyTransformer transformer,
-    const void* initialization_vector,
-    int initialization_vector_size) {
-  if (transformer->algorithm == kAlgorithmAes128Gcm) {
-    AES_gcm128_setiv(&transformer->gcm_context, &transformer->key,
-                     initialization_vector, initialization_vector_size);
-  } else {
-    memcpy(transformer->ivec, initialization_vector,
-                 std::min(initialization_vector_size,
-                          static_cast<int>(sizeof(transformer->ivec))));
-  }
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/starboard/cryptography/cryptography_transform.cc b/starboard/shared/starboard/cryptography/cryptography_transform.cc
deleted file mode 100644
index ed464a2..0000000
--- a/starboard/shared/starboard/cryptography/cryptography_transform.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-#include "starboard/shared/starboard/cryptography/cryptography_internal.h"
-#include "starboard/shared/starboard/cryptography/software_aes.h"
-
-using starboard::shared::starboard::cryptography::AES_cbc_encrypt;
-using starboard::shared::starboard::cryptography::AES_ctr128_encrypt;
-using starboard::shared::starboard::cryptography::AES_decrypt;
-using starboard::shared::starboard::cryptography::AES_encrypt;
-using starboard::shared::starboard::cryptography::AES_gcm128_decrypt;
-using starboard::shared::starboard::cryptography::AES_gcm128_encrypt;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Cbc;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Ctr;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Ecb;
-using starboard::shared::starboard::cryptography::kAlgorithmAes128Gcm;
-
-namespace {
-inline void* AddPtr(void* pointer, int value) {
-  return reinterpret_cast<char*>(pointer) + value;
-}
-
-inline const void* AddPtr(const void* pointer, int value) {
-  return reinterpret_cast<const char*>(pointer) + value;
-}
-}  // namespace
-
-int SbCryptographyTransform(SbCryptographyTransformer transformer,
-                            const void* in_data,
-                            int in_data_size,
-                            void* out_data) {
-  if (!SbCryptographyIsTransformerValid(transformer) || !in_data || !out_data) {
-    return -1;
-  }
-
-  if (in_data_size == 0) {
-    return 0;
-  }
-
-  switch (transformer->algorithm) {
-    case kAlgorithmAes128Cbc:
-      AES_cbc_encrypt(in_data, out_data, in_data_size, &(transformer->key),
-                      transformer->ivec,
-                      transformer->direction == kSbCryptographyDirectionEncode ?
-                      SB_AES_ENCRYPT : SB_AES_DECRYPT);
-      break;
-
-    case kAlgorithmAes128Ctr:
-      AES_ctr128_encrypt(in_data, out_data, in_data_size, &(transformer->key),
-                         transformer->ivec, transformer->ecount_buf,
-                         &transformer->counter);
-      break;
-
-    case kAlgorithmAes128Ecb:
-      if (in_data_size % 16 != 0) {
-        SB_DLOG(ERROR) << "ECB called with a non-multiple of the block size.";
-        return -1;
-      }
-
-      if (transformer->direction == kSbCryptographyDirectionEncode) {
-        const void* in = in_data;
-        void* out = out_data;
-        for (int i = 0, blocks = in_data_size / 16; i < blocks; ++i) {
-          AES_encrypt(in, out, &transformer->key);
-          in = AddPtr(in, 16);
-          out = AddPtr(out, 16);
-        }
-      } else if (transformer->direction == kSbCryptographyDirectionDecode) {
-        const void* in = in_data;
-        void* out = out_data;
-        for (int i = 0, blocks = in_data_size / 16; i < blocks; ++i) {
-          AES_decrypt(in, out, &transformer->key);
-          in = AddPtr(in, 16);
-          out = AddPtr(out, 16);
-        }
-      } else {
-        SB_NOTREACHED();
-      }
-      break;
-
-    case kAlgorithmAes128Gcm:
-      if (transformer->direction == kSbCryptographyDirectionEncode) {
-        AES_gcm128_encrypt(&transformer->gcm_context, &transformer->key,
-                           in_data, out_data, in_data_size);
-      } else if (transformer->direction == kSbCryptographyDirectionDecode) {
-        AES_gcm128_decrypt(&transformer->gcm_context, &transformer->key,
-                           in_data, out_data, in_data_size);
-      } else {
-        SB_NOTREACHED();
-      }
-      break;
-
-    default:
-      SB_NOTREACHED();
-      return -1;
-  }
-
-  return in_data_size;
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/starboard/cryptography/software_aes.cc b/starboard/shared/starboard/cryptography/software_aes.cc
deleted file mode 100644
index c901791..0000000
--- a/starboard/shared/starboard/cryptography/software_aes.cc
+++ /dev/null
@@ -1,1586 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2002-2006 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    openssl-core@openssl.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED 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 OpenSSL PROJECT OR
- * ITS 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.
- * ==================================================================== */
-
-// Modifications Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/shared/starboard/cryptography/software_aes.h"
-
-#include "starboard/common/byte_swap.h"
-#include "starboard/memory.h"
-#include "starboard/types.h"
-
-#pragma message "software_aes.cc is not meant for production use! Instead, use "
-#pragma message "starboard/shared/stub/cryptography_* if you don't have "
-#pragma message "hardware-accelerated AES support."
-
-namespace starboard {
-namespace shared {
-namespace starboard {
-namespace cryptography {
-
-namespace {
-inline uint32_t GETU32(const void* in) {
-  uint32_t value;
-  memcpy(&value, in, sizeof(value));
-  return SbByteSwapU32(value);
-}
-
-inline void PUTU32(void* out, uint32_t value) {
-  value = SbByteSwapU32(value);
-  memcpy(out, &value, sizeof(value));
-}
-
-inline uint32_t GETU32_aligned(const void* in) {
-  const char* alias = static_cast<const char*>(in);
-  return SbByteSwapU32(*reinterpret_cast<const uint32_t*>(alias));
-}
-
-inline void PUTU32_aligned(void* in, uint32_t value) {
-  char* alias = static_cast<char*>(in);
-  *reinterpret_cast<uint32_t*>(alias) = SbByteSwapU32(value);
-}
-
-/* Te0[x] = S [x].[02, 01, 01, 03];
- * Te1[x] = S [x].[03, 02, 01, 01];
- * Te2[x] = S [x].[01, 03, 02, 01];
- * Te3[x] = S [x].[01, 01, 03, 02];
- *
- * Td0[x] = Si[x].[0e, 09, 0d, 0b];
- * Td1[x] = Si[x].[0b, 0e, 09, 0d];
- * Td2[x] = Si[x].[0d, 0b, 0e, 09];
- * Td3[x] = Si[x].[09, 0d, 0b, 0e];
- * Td4[x] = Si[x].[01]; */
-static const uint32_t Te0[256] = {
-    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 0xfff2f20dU,
-    0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 0x60303050U, 0x02010103U,
-    0xce6767a9U, 0x562b2b7dU, 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U,
-    0xec76769aU, 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
-    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 0x41adadecU,
-    0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 0x239c9cbfU, 0x53a4a4f7U,
-    0xe4727296U, 0x9bc0c05bU, 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU,
-    0x4c26266aU, 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
-    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 0xe2717193U,
-    0xabd8d873U, 0x62313153U, 0x2a15153fU, 0x0804040cU, 0x95c7c752U,
-    0x46232365U, 0x9dc3c35eU, 0x30181828U, 0x379696a1U, 0x0a05050fU,
-    0x2f9a9ab5U, 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
-    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 0x1209091bU,
-    0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 0x361b1b2dU, 0xdc6e6eb2U,
-    0xb45a5aeeU, 0x5ba0a0fbU, 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U,
-    0x7db3b3ceU, 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
-    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 0x40202060U,
-    0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 0xd46a6abeU, 0x8dcbcb46U,
-    0x67bebed9U, 0x7239394bU, 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U,
-    0x85cfcf4aU, 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
-    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 0x8a4545cfU,
-    0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 0xa05050f0U, 0x783c3c44U,
-    0x259f9fbaU, 0x4ba8a8e3U, 0xa25151f3U, 0x5da3a3feU, 0x804040c0U,
-    0x058f8f8aU, 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
-    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 0x20101030U,
-    0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 0x81cdcd4cU, 0x180c0c14U,
-    0x26131335U, 0xc3ecec2fU, 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU,
-    0x2e171739U, 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
-    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 0xc06060a0U,
-    0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 0x44222266U, 0x542a2a7eU,
-    0x3b9090abU, 0x0b888883U, 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U,
-    0x2814143cU, 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
-    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 0x924949dbU,
-    0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 0x9fc2c25dU, 0xbdd3d36eU,
-    0x43acacefU, 0xc46262a6U, 0x399191a8U, 0x319595a4U, 0xd3e4e437U,
-    0xf279798bU, 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
-    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 0xd86c6cb4U,
-    0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 0xca6565afU, 0xf47a7a8eU,
-    0x47aeaee9U, 0x10080818U, 0x6fbabad5U, 0xf0787888U, 0x4a25256fU,
-    0x5c2e2e72U, 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
-    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 0x964b4bddU,
-    0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 0xe0707090U, 0x7c3e3e42U,
-    0x71b5b5c4U, 0xcc6666aaU, 0x904848d8U, 0x06030305U, 0xf7f6f601U,
-    0x1c0e0e12U, 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
-    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 0xd9e1e138U,
-    0xebf8f813U, 0x2b9898b3U, 0x22111133U, 0xd26969bbU, 0xa9d9d970U,
-    0x078e8e89U, 0x339494a7U, 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U,
-    0xc9e9e920U, 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
-    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 0x65bfbfdaU,
-    0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 0x824141c3U, 0x299999b0U,
-    0x5a2d2d77U, 0x1e0f0f11U, 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U,
-    0x2c16163aU,
-};
-static const uint32_t Te1[256] = {
-    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 0x0dfff2f2U,
-    0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 0x50603030U, 0x03020101U,
-    0xa9ce6767U, 0x7d562b2bU, 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU,
-    0x9aec7676U, 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
-    0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 0xec41adadU,
-    0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 0xbf239c9cU, 0xf753a4a4U,
-    0x96e47272U, 0x5b9bc0c0U, 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U,
-    0x6a4c2626U, 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
-    0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 0x93e27171U,
-    0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 0x0c080404U, 0x5295c7c7U,
-    0x65462323U, 0x5e9dc3c3U, 0x28301818U, 0xa1379696U, 0x0f0a0505U,
-    0xb52f9a9aU, 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
-    0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 0x1b120909U,
-    0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 0x2d361b1bU, 0xb2dc6e6eU,
-    0xeeb45a5aU, 0xfb5ba0a0U, 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U,
-    0xce7db3b3U, 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
-    0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 0x60402020U,
-    0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 0xbed46a6aU, 0x468dcbcbU,
-    0xd967bebeU, 0x4b723939U, 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U,
-    0x4a85cfcfU, 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
-    0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 0xcf8a4545U,
-    0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 0xf0a05050U, 0x44783c3cU,
-    0xba259f9fU, 0xe34ba8a8U, 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U,
-    0x8a058f8fU, 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
-    0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 0x30201010U,
-    0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 0x4c81cdcdU, 0x14180c0cU,
-    0x35261313U, 0x2fc3ececU, 0xe1be5f5fU, 0xa2359797U, 0xcc884444U,
-    0x392e1717U, 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
-    0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 0xa0c06060U,
-    0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 0x66442222U, 0x7e542a2aU,
-    0xab3b9090U, 0x830b8888U, 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U,
-    0x3c281414U, 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
-    0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 0xdb924949U,
-    0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 0x5d9fc2c2U, 0x6ebdd3d3U,
-    0xef43acacU, 0xa6c46262U, 0xa8399191U, 0xa4319595U, 0x37d3e4e4U,
-    0x8bf27979U, 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
-    0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 0xb4d86c6cU,
-    0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 0xafca6565U, 0x8ef47a7aU,
-    0xe947aeaeU, 0x18100808U, 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U,
-    0x725c2e2eU, 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
-    0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 0xdd964b4bU,
-    0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 0x90e07070U, 0x427c3e3eU,
-    0xc471b5b5U, 0xaacc6666U, 0xd8904848U, 0x05060303U, 0x01f7f6f6U,
-    0x121c0e0eU, 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
-    0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 0x38d9e1e1U,
-    0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 0xbbd26969U, 0x70a9d9d9U,
-    0x89078e8eU, 0xa7339494U, 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U,
-    0x20c9e9e9U, 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
-    0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 0xda65bfbfU,
-    0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 0xc3824141U, 0xb0299999U,
-    0x775a2d2dU, 0x111e0f0fU, 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU,
-    0x3a2c1616U,
-};
-static const uint32_t Te2[256] = {
-    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 0xf20dfff2U,
-    0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 0x30506030U, 0x01030201U,
-    0x67a9ce67U, 0x2b7d562bU, 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU,
-    0x769aec76U, 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
-    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 0xadec41adU,
-    0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 0x9cbf239cU, 0xa4f753a4U,
-    0x7296e472U, 0xc05b9bc0U, 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U,
-    0x266a4c26U, 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
-    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 0x7193e271U,
-    0xd873abd8U, 0x31536231U, 0x153f2a15U, 0x040c0804U, 0xc75295c7U,
-    0x23654623U, 0xc35e9dc3U, 0x18283018U, 0x96a13796U, 0x050f0a05U,
-    0x9ab52f9aU, 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
-    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 0x091b1209U,
-    0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 0x1b2d361bU, 0x6eb2dc6eU,
-    0x5aeeb45aU, 0xa0fb5ba0U, 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U,
-    0xb3ce7db3U, 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
-    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 0x20604020U,
-    0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 0x6abed46aU, 0xcb468dcbU,
-    0xbed967beU, 0x394b7239U, 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U,
-    0xcf4a85cfU, 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
-    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 0x45cf8a45U,
-    0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 0x50f0a050U, 0x3c44783cU,
-    0x9fba259fU, 0xa8e34ba8U, 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U,
-    0x8f8a058fU, 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
-    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 0x10302010U,
-    0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 0xcd4c81cdU, 0x0c14180cU,
-    0x13352613U, 0xec2fc3ecU, 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U,
-    0x17392e17U, 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
-    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 0x60a0c060U,
-    0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 0x22664422U, 0x2a7e542aU,
-    0x90ab3b90U, 0x88830b88U, 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U,
-    0x143c2814U, 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
-    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 0x49db9249U,
-    0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 0xc25d9fc2U, 0xd36ebdd3U,
-    0xacef43acU, 0x62a6c462U, 0x91a83991U, 0x95a43195U, 0xe437d3e4U,
-    0x798bf279U, 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
-    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 0x6cb4d86cU,
-    0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 0x65afca65U, 0x7a8ef47aU,
-    0xaee947aeU, 0x08181008U, 0xbad56fbaU, 0x7888f078U, 0x256f4a25U,
-    0x2e725c2eU, 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
-    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 0x4bdd964bU,
-    0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 0x7090e070U, 0x3e427c3eU,
-    0xb5c471b5U, 0x66aacc66U, 0x48d89048U, 0x03050603U, 0xf601f7f6U,
-    0x0e121c0eU, 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
-    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 0xe138d9e1U,
-    0xf813ebf8U, 0x98b32b98U, 0x11332211U, 0x69bbd269U, 0xd970a9d9U,
-    0x8e89078eU, 0x94a73394U, 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U,
-    0xe920c9e9U, 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
-    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 0xbfda65bfU,
-    0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 0x41c38241U, 0x99b02999U,
-    0x2d775a2dU, 0x0f111e0fU, 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU,
-    0x163a2c16U,
-};
-static const uint32_t Te3[256] = {
-    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 0xf2f20dffU,
-    0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 0x30305060U, 0x01010302U,
-    0x6767a9ceU, 0x2b2b7d56U, 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU,
-    0x76769aecU, 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
-    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 0xadadec41U,
-    0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 0x9c9cbf23U, 0xa4a4f753U,
-    0x727296e4U, 0xc0c05b9bU, 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU,
-    0x26266a4cU, 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
-    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 0x717193e2U,
-    0xd8d873abU, 0x31315362U, 0x15153f2aU, 0x04040c08U, 0xc7c75295U,
-    0x23236546U, 0xc3c35e9dU, 0x18182830U, 0x9696a137U, 0x05050f0aU,
-    0x9a9ab52fU, 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
-    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 0x09091b12U,
-    0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 0x1b1b2d36U, 0x6e6eb2dcU,
-    0x5a5aeeb4U, 0xa0a0fb5bU, 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U,
-    0xb3b3ce7dU, 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
-    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 0x20206040U,
-    0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 0x6a6abed4U, 0xcbcb468dU,
-    0xbebed967U, 0x39394b72U, 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U,
-    0xcfcf4a85U, 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
-    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 0x4545cf8aU,
-    0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 0x5050f0a0U, 0x3c3c4478U,
-    0x9f9fba25U, 0xa8a8e34bU, 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U,
-    0x8f8f8a05U, 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
-    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 0x10103020U,
-    0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 0xcdcd4c81U, 0x0c0c1418U,
-    0x13133526U, 0xecec2fc3U, 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U,
-    0x1717392eU, 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
-    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 0x6060a0c0U,
-    0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 0x22226644U, 0x2a2a7e54U,
-    0x9090ab3bU, 0x8888830bU, 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU,
-    0x14143c28U, 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
-    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 0x4949db92U,
-    0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 0xc2c25d9fU, 0xd3d36ebdU,
-    0xacacef43U, 0x6262a6c4U, 0x9191a839U, 0x9595a431U, 0xe4e437d3U,
-    0x79798bf2U, 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
-    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 0x6c6cb4d8U,
-    0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 0x6565afcaU, 0x7a7a8ef4U,
-    0xaeaee947U, 0x08081810U, 0xbabad56fU, 0x787888f0U, 0x25256f4aU,
-    0x2e2e725cU, 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
-    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 0x4b4bdd96U,
-    0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 0x707090e0U, 0x3e3e427cU,
-    0xb5b5c471U, 0x6666aaccU, 0x4848d890U, 0x03030506U, 0xf6f601f7U,
-    0x0e0e121cU, 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
-    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 0xe1e138d9U,
-    0xf8f813ebU, 0x9898b32bU, 0x11113322U, 0x6969bbd2U, 0xd9d970a9U,
-    0x8e8e8907U, 0x9494a733U, 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U,
-    0xe9e920c9U, 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
-    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 0xbfbfda65U,
-    0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 0x4141c382U, 0x9999b029U,
-    0x2d2d775aU, 0x0f0f111eU, 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU,
-    0x16163a2cU,
-};
-static const uint32_t Td0[256] = {
-    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 0x3bab6bcbU,
-    0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 0x2030fa55U, 0xad766df6U,
-    0x88cc7691U, 0xf5024c25U, 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U,
-    0xb562a38fU, 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
-    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 0x038f5fe7U,
-    0x15929c95U, 0xbf6d7aebU, 0x955259daU, 0xd4be832dU, 0x587421d3U,
-    0x49e06929U, 0x8ec9c844U, 0x75c2896aU, 0xf48e7978U, 0x99583e6bU,
-    0x27b971ddU, 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
-    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 0xb16477e0U,
-    0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 0x70486858U, 0x8f45fd19U,
-    0x94de6c87U, 0x527bf8b7U, 0xab73d323U, 0x724b02e2U, 0xe31f8f57U,
-    0x6655ab2aU, 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
-    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 0x8acf1c2bU,
-    0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 0x65daf4cdU, 0x0605bed5U,
-    0xd134621fU, 0xc4a6fe8aU, 0x342e539dU, 0xa2f355a0U, 0x058ae132U,
-    0xa4f6eb75U, 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
-    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 0x91548db5U,
-    0x71c45d05U, 0x0406d46fU, 0x605015ffU, 0x1998fb24U, 0xd6bde997U,
-    0x894043ccU, 0x67d99e77U, 0xb0e842bdU, 0x07898b88U, 0xe7195b38U,
-    0x79c8eedbU, 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
-    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 0xfd0efffbU,
-    0x0f853856U, 0x3daed51eU, 0x362d3927U, 0x0a0fd964U, 0x685ca621U,
-    0x9b5b54d1U, 0x24362e3aU, 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U,
-    0x1b9b919eU, 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
-    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 0x0e090d0bU,
-    0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 0x57f11985U, 0xaf75074cU,
-    0xee99ddbbU, 0xa37f60fdU, 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U,
-    0x5bfb7e34U, 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
-    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 0x854a247dU,
-    0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 0x1d9e2f4bU, 0xdcb230f3U,
-    0x0d8652ecU, 0x77c1e3d0U, 0x2bb3166cU, 0xa970b999U, 0x119448faU,
-    0x47e96422U, 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
-    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 0xa6f581cfU,
-    0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 0x2c3a9de4U, 0x5078920dU,
-    0x6a5fcc9bU, 0x547e4662U, 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU,
-    0x82c3aff5U, 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
-    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 0xcd267809U,
-    0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 0xe6956e65U, 0xaaffe67eU,
-    0x21bccf08U, 0xef15e8e6U, 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U,
-    0x29b07cd6U, 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
-    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 0xf104984aU,
-    0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 0x764dd68dU, 0x43efb04dU,
-    0xccaa4d54U, 0xe49604dfU, 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U,
-    0x4665517fU, 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
-    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 0x9ad7618cU,
-    0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 0xcea927eeU, 0xb761c935U,
-    0xe11ce5edU, 0x7a47b13cU, 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U,
-    0x73c737bfU, 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
-    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 0x161dc372U,
-    0xbce2250cU, 0x283c498bU, 0xff0d9541U, 0x39a80171U, 0x080cb3deU,
-    0xd8b4e49cU, 0x6456c190U, 0x7bcb8461U, 0xd532b670U, 0x486c5c74U,
-    0xd0b85742U,
-};
-static const uint32_t Td1[256] = {
-    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 0xcb3bab6bU,
-    0xf11f9d45U, 0xabacfa58U, 0x934be303U, 0x552030faU, 0xf6ad766dU,
-    0x9188cc76U, 0x25f5024cU, 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U,
-    0x8fb562a3U, 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
-    0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 0xe7038f5fU,
-    0x9515929cU, 0xebbf6d7aU, 0xda955259U, 0x2dd4be83U, 0xd3587421U,
-    0x2949e069U, 0x448ec9c8U, 0x6a75c289U, 0x78f48e79U, 0x6b99583eU,
-    0xdd27b971U, 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
-    0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 0xe0b16477U,
-    0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 0x58704868U, 0x198f45fdU,
-    0x8794de6cU, 0xb7527bf8U, 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU,
-    0x2a6655abU, 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
-    0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 0x2b8acf1cU,
-    0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 0xcd65daf4U, 0xd50605beU,
-    0x1fd13462U, 0x8ac4a6feU, 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U,
-    0x75a4f6ebU, 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
-    0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 0xb591548dU,
-    0x0571c45dU, 0x6f0406d4U, 0xff605015U, 0x241998fbU, 0x97d6bde9U,
-    0xcc894043U, 0x7767d99eU, 0xbdb0e842U, 0x8807898bU, 0x38e7195bU,
-    0xdb79c8eeU, 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
-    0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 0xfbfd0effU,
-    0x560f8538U, 0x1e3daed5U, 0x27362d39U, 0x640a0fd9U, 0x21685ca6U,
-    0xd19b5b54U, 0x3a24362eU, 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U,
-    0x9e1b9b91U, 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
-    0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 0x0b0e090dU,
-    0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 0x8557f119U, 0x4caf7507U,
-    0xbbee99ddU, 0xfda37f60U, 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU,
-    0x345bfb7eU, 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
-    0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 0x7d854a24U,
-    0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 0x4b1d9e2fU, 0xf3dcb230U,
-    0xec0d8652U, 0xd077c1e3U, 0x6c2bb316U, 0x99a970b9U, 0xfa119448U,
-    0x2247e964U, 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
-    0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 0xcfa6f581U,
-    0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 0xe42c3a9dU, 0x0d507892U,
-    0x9b6a5fccU, 0x62547e46U, 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U,
-    0xf582c3afU, 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
-    0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 0x09cd2678U,
-    0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 0x65e6956eU, 0x7eaaffe6U,
-    0x0821bccfU, 0xe6ef15e8U, 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U,
-    0xd629b07cU, 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
-    0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 0x4af10498U,
-    0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 0x8d764dd6U, 0x4d43efb0U,
-    0x54ccaa4dU, 0xdfe49604U, 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU,
-    0x7f466551U, 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
-    0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 0x8c9ad761U,
-    0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 0xeecea927U, 0x35b761c9U,
-    0xede11ce5U, 0x3c7a47b1U, 0x599cd2dfU, 0x3f55f273U, 0x791814ceU,
-    0xbf73c737U, 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
-    0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 0x72161dc3U,
-    0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 0x7139a801U, 0xde080cb3U,
-    0x9cd8b4e4U, 0x906456c1U, 0x617bcb84U, 0x70d532b6U, 0x74486c5cU,
-    0x42d0b857U,
-};
-static const uint32_t Td2[256] = {
-    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 0x6bcb3babU,
-    0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 0xfa552030U, 0x6df6ad76U,
-    0x769188ccU, 0x4c25f502U, 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U,
-    0xa38fb562U, 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
-    0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 0x5fe7038fU,
-    0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 0x832dd4beU, 0x21d35874U,
-    0x692949e0U, 0xc8448ec9U, 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U,
-    0x71dd27b9U, 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
-    0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 0x77e0b164U,
-    0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 0x68587048U, 0xfd198f45U,
-    0x6c8794deU, 0xf8b7527bU, 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU,
-    0xab2a6655U, 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
-    0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 0x1c2b8acfU,
-    0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 0xf4cd65daU, 0xbed50605U,
-    0x621fd134U, 0xfe8ac4a6U, 0x539d342eU, 0x55a0a2f3U, 0xe132058aU,
-    0xeb75a4f6U, 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
-    0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 0x8db59154U,
-    0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 0xfb241998U, 0xe997d6bdU,
-    0x43cc8940U, 0x9e7767d9U, 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U,
-    0xeedb79c8U, 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
-    0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 0xfffbfd0eU,
-    0x38560f85U, 0xd51e3daeU, 0x3927362dU, 0xd9640a0fU, 0xa621685cU,
-    0x54d19b5bU, 0x2e3a2436U, 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU,
-    0x919e1b9bU, 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
-    0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 0x0d0b0e09U,
-    0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 0x198557f1U, 0x074caf75U,
-    0xddbbee99U, 0x60fda37fU, 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U,
-    0x7e345bfbU, 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
-    0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 0x247d854aU,
-    0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 0x2f4b1d9eU, 0x30f3dcb2U,
-    0x52ec0d86U, 0xe3d077c1U, 0x166c2bb3U, 0xb999a970U, 0x48fa1194U,
-    0x642247e9U, 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
-    0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 0x81cfa6f5U,
-    0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 0x9de42c3aU, 0x920d5078U,
-    0xcc9b6a5fU, 0x4662547eU, 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U,
-    0xaff582c3U, 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
-    0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 0x7809cd26U,
-    0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 0x6e65e695U, 0xe67eaaffU,
-    0xcf0821bcU, 0xe8e6ef15U, 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU,
-    0x7cd629b0U, 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
-    0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 0x984af104U,
-    0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 0xd68d764dU, 0xb04d43efU,
-    0x4d54ccaaU, 0x04dfe496U, 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU,
-    0x517f4665U, 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
-    0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 0x618c9ad7U,
-    0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 0x27eecea9U, 0xc935b761U,
-    0xe5ede11cU, 0xb13c7a47U, 0xdf599cd2U, 0x733f55f2U, 0xce791814U,
-    0x37bf73c7U, 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
-    0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 0xc372161dU,
-    0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 0x017139a8U, 0xb3de080cU,
-    0xe49cd8b4U, 0xc1906456U, 0x84617bcbU, 0xb670d532U, 0x5c74486cU,
-    0x5742d0b8U,
-};
-static const uint32_t Td3[256] = {
-    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 0xab6bcb3bU,
-    0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 0x30fa5520U, 0x766df6adU,
-    0xcc769188U, 0x024c25f5U, 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U,
-    0x62a38fb5U, 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
-    0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 0x8f5fe703U,
-    0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 0xbe832dd4U, 0x7421d358U,
-    0xe0692949U, 0xc9c8448eU, 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U,
-    0xb971dd27U, 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
-    0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 0x6477e0b1U,
-    0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 0x48685870U, 0x45fd198fU,
-    0xde6c8794U, 0x7bf8b752U, 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U,
-    0x55ab2a66U, 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
-    0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 0xcf1c2b8aU,
-    0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 0xdaf4cd65U, 0x05bed506U,
-    0x34621fd1U, 0xa6fe8ac4U, 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U,
-    0xf6eb75a4U, 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
-    0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 0x548db591U,
-    0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 0x98fb2419U, 0xbde997d6U,
-    0x4043cc89U, 0xd99e7767U, 0xe842bdb0U, 0x898b8807U, 0x195b38e7U,
-    0xc8eedb79U, 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
-    0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 0x0efffbfdU,
-    0x8538560fU, 0xaed51e3dU, 0x2d392736U, 0x0fd9640aU, 0x5ca62168U,
-    0x5b54d19bU, 0x362e3a24U, 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U,
-    0x9b919e1bU, 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
-    0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 0x090d0b0eU,
-    0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 0xf1198557U, 0x75074cafU,
-    0x99ddbbeeU, 0x7f60fda3U, 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U,
-    0xfb7e345bU, 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
-    0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 0x4a247d85U,
-    0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 0x9e2f4b1dU, 0xb230f3dcU,
-    0x8652ec0dU, 0xc1e3d077U, 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U,
-    0xe9642247U, 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
-    0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 0xf581cfa6U,
-    0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 0x3a9de42cU, 0x78920d50U,
-    0x5fcc9b6aU, 0x7e466254U, 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU,
-    0xc3aff582U, 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
-    0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 0x267809cdU,
-    0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 0x956e65e6U, 0xffe67eaaU,
-    0xbccf0821U, 0x15e8e6efU, 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU,
-    0xb07cd629U, 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
-    0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 0x04984af1U,
-    0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 0x4dd68d76U, 0xefb04d43U,
-    0xaa4d54ccU, 0x9604dfe4U, 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U,
-    0x65517f46U, 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
-    0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 0xd7618c9aU,
-    0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 0xa927eeceU, 0x61c935b7U,
-    0x1ce5ede1U, 0x47b13c7aU, 0xd2df599cU, 0xf2733f55U, 0x14ce7918U,
-    0xc737bf73U, 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
-    0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 0x1dc37216U,
-    0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 0xa8017139U, 0x0cb3de08U,
-    0xb4e49cd8U, 0x56c19064U, 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U,
-    0xb85742d0U,
-};
-static const uint8_t Td4[256] = {
-    0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, 0xbfU, 0x40U, 0xa3U,
-    0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU,
-    0xffU, 0x87U, 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, 0x54U,
-    0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, 0xeeU, 0x4cU, 0x95U, 0x0bU,
-    0x42U, 0xfaU, 0xc3U, 0x4eU, 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U,
-    0xb2U, 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, 0x72U, 0xf8U,
-    0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU,
-    0x65U, 0xb6U, 0x92U, 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
-    0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, 0x90U, 0xd8U, 0xabU,
-    0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U,
-    0x45U, 0x06U, 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, 0xc1U,
-    0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, 0x3aU, 0x91U, 0x11U, 0x41U,
-    0x4fU, 0x67U, 0xdcU, 0xeaU, 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U,
-    0x73U, 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, 0xe2U, 0xf9U,
-    0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU,
-    0x29U, 0xc5U, 0x89U, 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
-    0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, 0x9aU, 0xdbU, 0xc0U,
-    0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U,
-    0xc7U, 0x31U, 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, 0x60U,
-    0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, 0x2dU, 0xe5U, 0x7aU, 0x9fU,
-    0x93U, 0xc9U, 0x9cU, 0xefU, 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U,
-    0xb0U, 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, 0x17U, 0x2bU,
-    0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U,
-    0x21U, 0x0cU, 0x7dU,
-};
-static const uint32_t rcon[] = {
-    0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
-    0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000,
-    /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
-};
-
-inline void ctr128_inc(void* counter_pointer) {
-  uint8_t* counter = reinterpret_cast<uint8_t*>(counter_pointer);
-  uint32_t n = 16;
-  uint8_t c;
-
-  do {
-    --n;
-    c = counter[n];
-    ++c;
-    counter[n] = c;
-    if (c)
-      return;
-  } while (n);
-}
-
-inline void ctr128_inc_aligned(void* counter_pointer) {
-  uint8_t* counter = reinterpret_cast<uint8_t*>(counter_pointer);
-  size_t *data, c, n;
-  const union {
-    uint32_t one;
-    char little;
-  } is_endian = {1};
-
-  if (is_endian.little) {
-    ctr128_inc(counter);
-    return;
-  }
-
-  data = reinterpret_cast<size_t*>(counter_pointer);
-  n = 16 / sizeof(size_t);
-  do {
-    --n;
-    c = data[n];
-    ++c;
-    data[n] = c;
-    if (c)
-      return;
-  } while (n);
-}
-
-/*
- * The input encrypted as though 128bit counter mode is being used.  The
- * extra state information to record how much of the 128bit block we have
- * used is contained in *num, and the encrypted counter is kept in
- * ecount_buf.  Both *num and ecount_buf must be initialised with zeros
- * before the first call to CRYPTO_ctr128_encrypt(). This algorithm assumes
- * that the counter is in the x lower bits of the IV (ivec), and that the
- * application has full control over overflow and the rest of the IV.  This
- * implementation takes NO responsibility for checking that the counter
- * doesn't overflow into the rest of the IV when incremented.
- */
-void CRYPTO_ctr128_encrypt(const void* in_pointer,
-                           void* out_pointer,
-                           size_t len,
-                           const AES_KEY* key,
-                           unsigned char ivec[16],
-                           unsigned char ecount_buf[16],
-                           unsigned int* num,
-                           block128_f block) {
-  const uint8_t* in = reinterpret_cast<const uint8_t*>(in_pointer);
-  uint8_t* out = reinterpret_cast<uint8_t*>(out_pointer);
-
-  uint32_t n;
-  size_t l = 0;
-
-  SB_DCHECK(in && out && key && ecount_buf && num);
-  SB_DCHECK(*num < 16);
-
-  n = *num;
-
-  if (16 % sizeof(size_t) == 0) { /* always true actually */
-    do {
-      while (n && len) {
-        *(out++) = *(in++) ^ ecount_buf[n];
-        --len;
-        n = (n + 1) % 16;
-      }
-
-      while (len >= 16) {
-        (*block)(ivec, ecount_buf, key);
-        ctr128_inc_aligned(ivec);
-        for (; n < 16; n += sizeof(size_t))
-          *reinterpret_cast<size_t*>(out + n) =
-              *reinterpret_cast<const size_t*>(in + n) ^
-              *reinterpret_cast<size_t*>(ecount_buf + n);
-        len -= 16;
-        out += 16;
-        in += 16;
-        n = 0;
-      }
-      if (len) {
-        (*block)(ivec, ecount_buf, key);
-        ctr128_inc_aligned(ivec);
-        while (len--) {
-          out[n] = in[n] ^ ecount_buf[n];
-          ++n;
-        }
-      }
-      *num = n;
-      return;
-    } while (0);
-  }
-
-  /* the rest would be commonly eliminated by x86* compiler */
-  while (l < len) {
-    if (n == 0) {
-      (*block)(ivec, ecount_buf, key);
-      ctr128_inc(ivec);
-    }
-    out[l] = in[l] ^ ecount_buf[n];
-    ++l;
-    n = (n + 1) % 16;
-  }
-
-  *num = n;
-}
-
-void CRYPTO_cbc128_encrypt(const void* in_pointer,
-                           void* out_pointer,
-                           size_t len,
-                           const AES_KEY* key,
-                           unsigned char ivec[16],
-                           block128_f block) {
-  const uint8_t* in = reinterpret_cast<const uint8_t*>(in_pointer);
-  uint8_t* out = reinterpret_cast<uint8_t*>(out_pointer);
-  size_t n;
-  const unsigned char* iv = ivec;
-
-  SB_DCHECK(in && out && key && ivec);
-
-  while (len >= 16) {
-    for (n = 0; n < 16; n += sizeof(size_t))
-      *reinterpret_cast<size_t*>(out + n) =
-          *reinterpret_cast<const size_t*>(in + n) ^
-          *reinterpret_cast<const size_t*>(iv + n);
-    (*block)(out, out, key);
-    iv = out;
-    len -= 16;
-    in += 16;
-    out += 16;
-  }
-
-  while (len) {
-    for (n = 0; n < 16 && n < len; ++n)
-      out[n] = in[n] ^ iv[n];
-    for (; n < 16; ++n)
-      out[n] = iv[n];
-    (*block)(out, out, key);
-    iv = out;
-    if (len <= 16)
-      break;
-    len -= 16;
-    in += 16;
-    out += 16;
-  }
-  memcpy(ivec, iv, 16);
-}
-
-void CRYPTO_cbc128_decrypt(const void* in_pointer,
-                           void* out_pointer,
-                           size_t len,
-                           const AES_KEY* key,
-                           unsigned char ivec[16],
-                           block128_f block) {
-  const uint8_t* in = reinterpret_cast<const uint8_t*>(in_pointer);
-  uint8_t* out = reinterpret_cast<uint8_t*>(out_pointer);
-  size_t n;
-  union {
-    size_t t[16 / sizeof(size_t)];
-    unsigned char c[16];
-  } tmp;
-
-  SB_DCHECK(in && out && key && ivec);
-
-  if (in != out) {
-    const unsigned char* iv = ivec;
-
-    if (16 % sizeof(size_t) == 0) { /* always true */
-      while (len >= 16) {
-        size_t* out_t = reinterpret_cast<size_t*>(out);
-        const size_t* iv_t = reinterpret_cast<const size_t*>(iv);
-
-        (*block)(in, out, key);
-        for (n = 0; n < 16 / sizeof(size_t); n++)
-          out_t[n] ^= iv_t[n];
-        iv = in;
-        len -= 16;
-        in += 16;
-        out += 16;
-      }
-    }
-    memcpy(ivec, iv, 16);
-  } else {
-    if (16 % sizeof(size_t) == 0) { /* always true */
-      while (len >= 16) {
-        size_t c, *out_t = reinterpret_cast<size_t*>(out);
-        size_t* ivec_t = reinterpret_cast<size_t*>(ivec);
-        const size_t* in_t = reinterpret_cast<const size_t*>(in);
-
-        (*block)(in, tmp.c, key);
-        for (n = 0; n < 16 / sizeof(size_t); n++) {
-          c = in_t[n];
-          out_t[n] = tmp.t[n] ^ ivec_t[n];
-          ivec_t[n] = c;
-        }
-        len -= 16;
-        in += 16;
-        out += 16;
-      }
-    }
-  }
-
-  while (len) {
-    unsigned char c;
-    (*block)(in, tmp.c, key);
-    for (n = 0; n < 16 && n < len; ++n) {
-      c = in[n];
-      out[n] = tmp.c[n] ^ ivec[n];
-      ivec[n] = c;
-    }
-    if (len <= 16) {
-      for (; n < 16; ++n)
-        ivec[n] = in[n];
-      break;
-    }
-    len -= 16;
-    in += 16;
-    out += 16;
-  }
-}
-}  // namespace
-
-int AES_set_encrypt_key(const void* key_pointer,
-                        unsigned bits,
-                        AES_KEY* aeskey) {
-  const uint8_t* key = reinterpret_cast<const uint8_t*>(key_pointer);
-  uint32_t* rk;
-  int i = 0;
-  uint32_t temp;
-  if (!key || !aeskey) {
-    return -1;
-  }
-  switch (bits) {
-    case 128:
-      aeskey->rounds = 10;
-      break;
-    case 192:
-      aeskey->rounds = 12;
-      break;
-    case 256:
-      aeskey->rounds = 14;
-      break;
-    default:
-      return -2;
-  }
-  rk = aeskey->rd_key;
-  rk[0] = GETU32(key);
-  rk[1] = GETU32(key + 4);
-  rk[2] = GETU32(key + 8);
-  rk[3] = GETU32(key + 12);
-  if (bits == 128) {
-    while (1) {
-      temp = rk[3];
-      rk[4] = rk[0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
-              (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
-              (Te0[(temp)&0xff] & 0x0000ff00) ^
-              (Te1[(temp >> 24)] & 0x000000ff) ^ rcon[i];
-      rk[5] = rk[1] ^ rk[4];
-      rk[6] = rk[2] ^ rk[5];
-      rk[7] = rk[3] ^ rk[6];
-      if (++i == 10) {
-        return 0;
-      }
-      rk += 4;
-    }
-  }
-  rk[4] = GETU32(key + 16);
-  rk[5] = GETU32(key + 20);
-  if (bits == 192) {
-    while (1) {
-      temp = rk[5];
-      rk[6] = rk[0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
-              (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
-              (Te0[(temp)&0xff] & 0x0000ff00) ^
-              (Te1[(temp >> 24)] & 0x000000ff) ^ rcon[i];
-      rk[7] = rk[1] ^ rk[6];
-      rk[8] = rk[2] ^ rk[7];
-      rk[9] = rk[3] ^ rk[8];
-      if (++i == 8) {
-        return 0;
-      }
-      rk[10] = rk[4] ^ rk[9];
-      rk[11] = rk[5] ^ rk[10];
-      rk += 6;
-    }
-  }
-  rk[6] = GETU32(key + 24);
-  rk[7] = GETU32(key + 28);
-  if (bits == 256) {
-    while (1) {
-      temp = rk[7];
-      rk[8] = rk[0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
-              (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
-              (Te0[(temp)&0xff] & 0x0000ff00) ^
-              (Te1[(temp >> 24)] & 0x000000ff) ^ rcon[i];
-      rk[9] = rk[1] ^ rk[8];
-      rk[10] = rk[2] ^ rk[9];
-      rk[11] = rk[3] ^ rk[10];
-      if (++i == 7) {
-        return 0;
-      }
-      temp = rk[11];
-      rk[12] = rk[4] ^ (Te2[(temp >> 24)] & 0xff000000) ^
-               (Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^
-               (Te0[(temp >> 8) & 0xff] & 0x0000ff00) ^
-               (Te1[(temp)&0xff] & 0x000000ff);
-      rk[13] = rk[5] ^ rk[12];
-      rk[14] = rk[6] ^ rk[13];
-      rk[15] = rk[7] ^ rk[14];
-      rk += 8;
-    }
-  }
-  return 0;
-}
-
-int AES_set_decrypt_key(const void* key_pointer,
-                        unsigned bits,
-                        AES_KEY* aeskey) {
-  const uint8_t* key = reinterpret_cast<const uint8_t*>(key_pointer);
-  uint32_t* rk;
-  int i, j, status;
-  uint32_t temp;
-  /* first, start with an encryption schedule */
-  status = AES_set_encrypt_key(key, bits, aeskey);
-  if (status < 0) {
-    return status;
-  }
-  rk = aeskey->rd_key;
-  /* invert the order of the round keys: */
-  for (i = 0, j = 4 * aeskey->rounds; i < j; i += 4, j -= 4) {
-    temp = rk[i];
-    rk[i] = rk[j];
-    rk[j] = temp;
-    temp = rk[i + 1];
-    rk[i + 1] = rk[j + 1];
-    rk[j + 1] = temp;
-    temp = rk[i + 2];
-    rk[i + 2] = rk[j + 2];
-    rk[j + 2] = temp;
-    temp = rk[i + 3];
-    rk[i + 3] = rk[j + 3];
-    rk[j + 3] = temp;
-  }
-  /* apply the inverse MixColumn transform to all round keys but the first and
-   * the last: */
-  for (i = 1; i < static_cast<int>(aeskey->rounds); i++) {
-    rk += 4;
-    rk[0] =
-        Td0[Te1[(rk[0] >> 24)] & 0xff] ^ Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^
-        Td2[Te1[(rk[0] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[0]) & 0xff] & 0xff];
-    rk[1] =
-        Td0[Te1[(rk[1] >> 24)] & 0xff] ^ Td1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^
-        Td2[Te1[(rk[1] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[1]) & 0xff] & 0xff];
-    rk[2] =
-        Td0[Te1[(rk[2] >> 24)] & 0xff] ^ Td1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^
-        Td2[Te1[(rk[2] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[2]) & 0xff] & 0xff];
-    rk[3] =
-        Td0[Te1[(rk[3] >> 24)] & 0xff] ^ Td1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^
-        Td2[Te1[(rk[3] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[3]) & 0xff] & 0xff];
-  }
-  return 0;
-}
-
-void AES_encrypt(const void* in_pointer,
-                 void* out_pointer,
-                 const AES_KEY* key) {
-  const uint8_t* in = reinterpret_cast<const uint8_t*>(in_pointer);
-  uint8_t* out = reinterpret_cast<uint8_t*>(out_pointer);
-  const uint32_t* rk;
-  uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
-  int r;
-  SB_DCHECK(in && out && key);
-  rk = key->rd_key;
-  /* map byte array block to cipher state
-   * and add initial round key: */
-  s0 = GETU32(in) ^ rk[0];
-  s1 = GETU32(in + 4) ^ rk[1];
-  s2 = GETU32(in + 8) ^ rk[2];
-  s3 = GETU32(in + 12) ^ rk[3];
-  /*
-   * Nr - 1 full rounds:
-   */
-  r = key->rounds >> 1;
-  for (;;) {
-    t0 = Te0[(s0 >> 24)] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
-         Te3[(s3)&0xff] ^ rk[4];
-    t1 = Te0[(s1 >> 24)] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
-         Te3[(s0)&0xff] ^ rk[5];
-    t2 = Te0[(s2 >> 24)] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
-         Te3[(s1)&0xff] ^ rk[6];
-    t3 = Te0[(s3 >> 24)] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
-         Te3[(s2)&0xff] ^ rk[7];
-    rk += 8;
-    if (--r == 0) {
-      break;
-    }
-    s0 = Te0[(t0 >> 24)] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
-         Te3[(t3)&0xff] ^ rk[0];
-    s1 = Te0[(t1 >> 24)] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
-         Te3[(t0)&0xff] ^ rk[1];
-    s2 = Te0[(t2 >> 24)] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
-         Te3[(t1)&0xff] ^ rk[2];
-    s3 = Te0[(t3 >> 24)] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
-         Te3[(t2)&0xff] ^ rk[3];
-  }
-
-  /*  apply last round and map cipher state to byte array block: */
-  s0 = (Te2[(t0 >> 24)] & 0xff000000) ^ (Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^
-       (Te0[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t3)&0xff] & 0x000000ff) ^
-       rk[0];
-  PUTU32(out, s0);
-  s1 = (Te2[(t1 >> 24)] & 0xff000000) ^ (Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^
-       (Te0[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t0)&0xff] & 0x000000ff) ^
-       rk[1];
-  PUTU32(out + 4, s1);
-  s2 = (Te2[(t2 >> 24)] & 0xff000000) ^ (Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^
-       (Te0[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t1)&0xff] & 0x000000ff) ^
-       rk[2];
-  PUTU32(out + 8, s2);
-  s3 = (Te2[(t3 >> 24)] & 0xff000000) ^ (Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^
-       (Te0[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t2)&0xff] & 0x000000ff) ^
-       rk[3];
-  PUTU32(out + 12, s3);
-}
-
-void AES_decrypt(const void* in_pointer,
-                 void* out_pointer,
-                 const AES_KEY* key) {
-  const uint8_t* in = reinterpret_cast<const uint8_t*>(in_pointer);
-  uint8_t* out = reinterpret_cast<uint8_t*>(out_pointer);
-  const uint32_t* rk;
-  uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
-  int r;
-  SB_DCHECK(in && out && key);
-  rk = key->rd_key;
-
-  /* map byte array block to cipher state
-   * and add initial round key: */
-  s0 = GETU32(in) ^ rk[0];
-  s1 = GETU32(in + 4) ^ rk[1];
-  s2 = GETU32(in + 8) ^ rk[2];
-  s3 = GETU32(in + 12) ^ rk[3];
-
-  /*
-   * Nr - 1 full rounds:
-   */
-  r = key->rounds >> 1;
-  for (;;) {
-    t0 = Td0[(s0 >> 24)] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
-         Td3[(s1)&0xff] ^ rk[4];
-    t1 = Td0[(s1 >> 24)] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
-         Td3[(s2)&0xff] ^ rk[5];
-    t2 = Td0[(s2 >> 24)] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
-         Td3[(s3)&0xff] ^ rk[6];
-    t3 = Td0[(s3 >> 24)] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
-         Td3[(s0)&0xff] ^ rk[7];
-    rk += 8;
-    if (--r == 0) {
-      break;
-    }
-    s0 = Td0[(t0 >> 24)] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
-         Td3[(t1)&0xff] ^ rk[0];
-    s1 = Td0[(t1 >> 24)] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
-         Td3[(t2)&0xff] ^ rk[1];
-    s2 = Td0[(t2 >> 24)] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
-         Td3[(t3)&0xff] ^ rk[2];
-    s3 = Td0[(t3 >> 24)] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
-         Td3[(t0)&0xff] ^ rk[3];
-  }
-
-  /* apply last round and
-   * map cipher state to byte array block: */
-  s0 = ((uint32_t)Td4[(t0 >> 24)] << 24) ^
-       ((uint32_t)Td4[(t3 >> 16) & 0xff] << 16) ^
-       ((uint32_t)Td4[(t2 >> 8) & 0xff] << 8) ^ ((uint32_t)Td4[(t1)&0xff]) ^
-       rk[0];
-  PUTU32(out, s0);
-  s1 = ((uint32_t)Td4[(t1 >> 24)] << 24) ^
-       ((uint32_t)Td4[(t0 >> 16) & 0xff] << 16) ^
-       ((uint32_t)Td4[(t3 >> 8) & 0xff] << 8) ^ ((uint32_t)Td4[(t2)&0xff]) ^
-       rk[1];
-  PUTU32(out + 4, s1);
-  s2 = ((uint32_t)Td4[(t2 >> 24)] << 24) ^
-       ((uint32_t)Td4[(t1 >> 16) & 0xff] << 16) ^
-       ((uint32_t)Td4[(t0 >> 8) & 0xff] << 8) ^ ((uint32_t)Td4[(t3)&0xff]) ^
-       rk[2];
-  PUTU32(out + 8, s2);
-  s3 = ((uint32_t)Td4[(t3 >> 24)] << 24) ^
-       ((uint32_t)Td4[(t2 >> 16) & 0xff] << 16) ^
-       ((uint32_t)Td4[(t1 >> 8) & 0xff] << 8) ^ ((uint32_t)Td4[(t0)&0xff]) ^
-       rk[3];
-  PUTU32(out + 12, s3);
-}
-
-void AES_ctr128_encrypt(const void* in,
-                        void* out,
-                        size_t len,
-                        const AES_KEY* key,
-                        uint8_t ivec[SB_AES_BLOCK_SIZE],
-                        uint8_t ecount_buf[SB_AES_BLOCK_SIZE],
-                        unsigned int* num) {
-  CRYPTO_ctr128_encrypt(in, out, len, key, ivec, ecount_buf, num, AES_encrypt);
-}
-
-void AES_cbc_encrypt(const void* in,
-                     void* out,
-                     size_t len,
-                     const AES_KEY* key,
-                     uint8_t* ivec,
-                     const int enc) {
-  if (enc) {
-    CRYPTO_cbc128_encrypt(in, out, len, key, ivec, AES_encrypt);
-  } else {
-    CRYPTO_cbc128_decrypt(in, out, len, key, ivec, AES_decrypt);
-  }
-}
-
-// --- GCM -------------------------------------------------------------------
-
-#define GCM_MUL(ctx, Xi) gcm_gmult_4bit((ctx)->Xi.u, (ctx)->Htable)
-#define PACK(s) ((size_t)(s) << (sizeof(size_t) * 8 - 16))
-#define REDUCE1BIT(V)                                                 \
-  do {                                                                \
-    if (sizeof(size_t) == 8) {                                        \
-      uint64_t T = UINT64_C(0xe100000000000000) & (0 - ((V).lo & 1)); \
-      (V).lo = ((V).hi << 63) | ((V).lo >> 1);                        \
-      (V).hi = ((V).hi >> 1) ^ T;                                     \
-    } else {                                                          \
-      uint32_t T = 0xe1000000U & (0 - (uint32_t)((V).lo & 1));        \
-      (V).lo = ((V).hi << 63) | ((V).lo >> 1);                        \
-      (V).hi = ((V).hi >> 1) ^ ((uint64_t)T << 32);                   \
-    }                                                                 \
-  } while (0)
-
-namespace {
-const size_t rem_4bit[16] = {
-    PACK(0x0000), PACK(0x1C20), PACK(0x3840), PACK(0x2460),
-    PACK(0x7080), PACK(0x6CA0), PACK(0x48C0), PACK(0x54E0),
-    PACK(0xE100), PACK(0xFD20), PACK(0xD940), PACK(0xC560),
-    PACK(0x9180), PACK(0x8DA0), PACK(0xA9C0), PACK(0xB5E0)};
-
-static void gcm_init_4bit(u128 Htable[16], uint64_t H[2]) {
-  u128 V;
-
-  Htable[0].hi = 0;
-  Htable[0].lo = 0;
-  V.hi = H[0];
-  V.lo = H[1];
-
-  Htable[8] = V;
-  REDUCE1BIT(V);
-  Htable[4] = V;
-  REDUCE1BIT(V);
-  Htable[2] = V;
-  REDUCE1BIT(V);
-  Htable[1] = V;
-  Htable[3].hi = V.hi ^ Htable[2].hi, Htable[3].lo = V.lo ^ Htable[2].lo;
-  V = Htable[4];
-  Htable[5].hi = V.hi ^ Htable[1].hi, Htable[5].lo = V.lo ^ Htable[1].lo;
-  Htable[6].hi = V.hi ^ Htable[2].hi, Htable[6].lo = V.lo ^ Htable[2].lo;
-  Htable[7].hi = V.hi ^ Htable[3].hi, Htable[7].lo = V.lo ^ Htable[3].lo;
-  V = Htable[8];
-  Htable[9].hi = V.hi ^ Htable[1].hi, Htable[9].lo = V.lo ^ Htable[1].lo;
-  Htable[10].hi = V.hi ^ Htable[2].hi, Htable[10].lo = V.lo ^ Htable[2].lo;
-  Htable[11].hi = V.hi ^ Htable[3].hi, Htable[11].lo = V.lo ^ Htable[3].lo;
-  Htable[12].hi = V.hi ^ Htable[4].hi, Htable[12].lo = V.lo ^ Htable[4].lo;
-  Htable[13].hi = V.hi ^ Htable[5].hi, Htable[13].lo = V.lo ^ Htable[5].lo;
-  Htable[14].hi = V.hi ^ Htable[6].hi, Htable[14].lo = V.lo ^ Htable[6].lo;
-  Htable[15].hi = V.hi ^ Htable[7].hi, Htable[15].lo = V.lo ^ Htable[7].lo;
-}
-
-void gcm_gmult_4bit(uint64_t Xi[2], const u128 Htable[16]) {
-  u128 Z;
-  int cnt = 15;
-  size_t rem, nlo, nhi;
-
-  nlo = ((const uint8_t*)Xi)[15];
-  nhi = nlo >> 4;
-  nlo &= 0xf;
-
-  Z.hi = Htable[nlo].hi;
-  Z.lo = Htable[nlo].lo;
-
-  while (1) {
-    rem = (size_t)Z.lo & 0xf;
-    Z.lo = (Z.hi << 60) | (Z.lo >> 4);
-    Z.hi = (Z.hi >> 4);
-    if (sizeof(size_t) == 8) {
-      Z.hi ^= rem_4bit[rem];
-    } else {
-      Z.hi ^= (uint64_t)rem_4bit[rem] << 32;
-    }
-
-    Z.hi ^= Htable[nhi].hi;
-    Z.lo ^= Htable[nhi].lo;
-
-    if (--cnt < 0) {
-      break;
-    }
-
-    nlo = ((const uint8_t*)Xi)[cnt];
-    nhi = nlo >> 4;
-    nlo &= 0xf;
-
-    rem = (size_t)Z.lo & 0xf;
-    Z.lo = (Z.hi << 60) | (Z.lo >> 4);
-    Z.hi = (Z.hi >> 4);
-    if (sizeof(size_t) == 8) {
-      Z.hi ^= rem_4bit[rem];
-    } else {
-      Z.hi ^= (uint64_t)rem_4bit[rem] << 32;
-    }
-
-    Z.hi ^= Htable[nlo].hi;
-    Z.lo ^= Htable[nlo].lo;
-  }
-
-  Xi[0] = SbByteSwapU64(Z.hi);
-  Xi[1] = SbByteSwapU64(Z.lo);
-}
-
-/* Streamed gcm_mult_4bit, see CRYPTO_gcm128_[en|de]crypt for
- * details... Compiler-generated code doesn't seem to give any
- * performance improvement, at least not on x86[_64]. It's here
- * mostly as reference and a placeholder for possible future
- * non-trivial optimization[s]... */
-void gcm_ghash_4bit(uint64_t Xi[2],
-                    const u128 Htable[16],
-                    const uint8_t* inp,
-                    size_t len) {
-  u128 Z;
-  int cnt;
-  size_t rem, nlo, nhi;
-
-  do {
-    cnt = 15;
-    nlo = ((const uint8_t*)Xi)[15];
-    nlo ^= inp[15];
-    nhi = nlo >> 4;
-    nlo &= 0xf;
-
-    Z.hi = Htable[nlo].hi;
-    Z.lo = Htable[nlo].lo;
-
-    while (1) {
-      rem = (size_t)Z.lo & 0xf;
-      Z.lo = (Z.hi << 60) | (Z.lo >> 4);
-      Z.hi = (Z.hi >> 4);
-      if (sizeof(size_t) == 8) {
-        Z.hi ^= rem_4bit[rem];
-      } else {
-        Z.hi ^= (uint64_t)rem_4bit[rem] << 32;
-      }
-
-      Z.hi ^= Htable[nhi].hi;
-      Z.lo ^= Htable[nhi].lo;
-
-      if (--cnt < 0) {
-        break;
-      }
-
-      nlo = ((const uint8_t*)Xi)[cnt];
-      nlo ^= inp[cnt];
-      nhi = nlo >> 4;
-      nlo &= 0xf;
-
-      rem = (size_t)Z.lo & 0xf;
-      Z.lo = (Z.hi << 60) | (Z.lo >> 4);
-      Z.hi = (Z.hi >> 4);
-      if (sizeof(size_t) == 8) {
-        Z.hi ^= rem_4bit[rem];
-      } else {
-        Z.hi ^= (uint64_t)rem_4bit[rem] << 32;
-      }
-
-      Z.hi ^= Htable[nlo].hi;
-      Z.lo ^= Htable[nlo].lo;
-    }
-
-    Xi[0] = SbByteSwapU64(Z.hi);
-    Xi[1] = SbByteSwapU64(Z.lo);
-  } while (inp += 16, len -= 16);
-}
-}  // namespace
-
-void CRYPTO_ghash_init(gmult_func* out_mult,
-                       ghash_func* out_hash,
-                       u128* out_key,
-                       u128 out_table[16],
-                       int* out_is_avx,
-                       const uint8_t* gcm_key) {
-  *out_is_avx = 0;
-
-  union {
-    uint64_t u[2];
-    uint8_t c[16];
-  } H;
-
-  memcpy(H.c, gcm_key, 16);
-
-  /* H is stored in host byte order */
-  H.u[0] = SbByteSwapU64(H.u[0]);
-  H.u[1] = SbByteSwapU64(H.u[1]);
-
-  memcpy(out_key, H.c, 16);
-
-  gcm_init_4bit(out_table, H.u);
-  *out_mult = gcm_gmult_4bit;
-  *out_hash = gcm_ghash_4bit;
-}
-
-void AES_gcm128_init(GCM128_CONTEXT* ctx, const AES_KEY* aes_key, int enc) {
-  memset(ctx, 0, sizeof(*ctx));
-  ctx->block = AES_encrypt;
-
-  uint8_t gcm_key[16];
-  memset(gcm_key, 0, sizeof(gcm_key));
-  (*ctx->block)(gcm_key, gcm_key, aes_key);
-
-  int is_avx;
-  CRYPTO_ghash_init(&ctx->gmult, &ctx->ghash, &ctx->H, ctx->Htable, &is_avx,
-                    gcm_key);
-}
-
-void AES_gcm128_setiv(GCM128_CONTEXT* ctx,
-                      const AES_KEY* key,
-                      const void* iv_void,
-                      size_t len) {
-  unsigned int ctr;
-  const uint8_t* iv = static_cast<const uint8_t*>(iv_void);
-
-  ctx->Yi.u[0] = 0;
-  ctx->Yi.u[1] = 0;
-  ctx->Xi.u[0] = 0;
-  ctx->Xi.u[1] = 0;
-  ctx->len.u[0] = 0; /* AAD length */
-  ctx->len.u[1] = 0; /* message length */
-  ctx->ares = 0;
-  ctx->mres = 0;
-
-  if (len == 12) {
-    memcpy(ctx->Yi.c, iv, 12);
-    ctx->Yi.c[15] = 1;
-    ctr = 1;
-  } else {
-    uint64_t len0 = len;
-
-    while (len >= 16) {
-      for (size_t i = 0; i < 16; ++i) {
-        ctx->Yi.c[i] ^= iv[i];
-      }
-      GCM_MUL(ctx, Yi);
-      iv += 16;
-      len -= 16;
-    }
-    if (len) {
-      for (size_t i = 0; i < len; ++i) {
-        ctx->Yi.c[i] ^= iv[i];
-      }
-      GCM_MUL(ctx, Yi);
-    }
-    len0 <<= 3;
-    ctx->Yi.u[1] ^= SbByteSwapU64(len0);
-
-    GCM_MUL(ctx, Yi);
-    ctr = GETU32_aligned(ctx->Yi.c + 12);
-  }
-
-  (*ctx->block)(ctx->Yi.c, ctx->EK0.c, key);
-  ++ctr;
-  PUTU32_aligned(ctx->Yi.c + 12, ctr);
-}
-
-int AES_gcm128_aad(GCM128_CONTEXT* ctx, const void* aad_void, size_t len) {
-  unsigned int n;
-  uint64_t alen = ctx->len.u[0];
-  const uint8_t* aad = static_cast<const uint8_t*>(aad_void);
-
-  if (ctx->len.u[1]) {
-    return 0;
-  }
-
-  alen += len;
-  if (alen > (UINT64_C(1) << 61) || (sizeof(len) == 8 && alen < len)) {
-    return 0;
-  }
-  ctx->len.u[0] = alen;
-
-  n = ctx->ares;
-  if (n) {
-    while (n && len) {
-      ctx->Xi.c[n] ^= *(aad++);
-      --len;
-      n = (n + 1) % 16;
-    }
-    if (n == 0) {
-      GCM_MUL(ctx, Xi);
-    } else {
-      ctx->ares = n;
-      return 1;
-    }
-  }
-
-  /* Process a whole number of blocks. */
-  while (len >= 16) {
-    for (size_t i = 0; i < 16; ++i) {
-      ctx->Xi.c[i] ^= aad[i];
-    }
-    GCM_MUL(ctx, Xi);
-    aad += 16;
-    len -= 16;
-  }
-
-  /* Process the remainder. */
-  if (len != 0) {
-    n = (unsigned int)len;
-    for (size_t i = 0; i < len; ++i) {
-      ctx->Xi.c[i] ^= aad[i];
-    }
-  }
-
-  ctx->ares = n;
-  return 1;
-}
-
-int AES_gcm128_encrypt(GCM128_CONTEXT* ctx,
-                       const AES_KEY* key,
-                       const void* in_void,
-                       void* out_void,
-                       size_t len) {
-  unsigned int n, ctr;
-  uint64_t mlen = ctx->len.u[1];
-  block128_f block = ctx->block;
-  const uint8_t* in = static_cast<const uint8_t*>(in_void);
-  uint8_t* out = static_cast<uint8_t*>(out_void);
-
-  mlen += len;
-  if (mlen > ((UINT64_C(1) << 36) - 32) || (sizeof(len) == 8 && mlen < len)) {
-    return 0;
-  }
-  ctx->len.u[1] = mlen;
-
-  if (ctx->ares) {
-    /* First call to encrypt finalizes GHASH(AAD) */
-    GCM_MUL(ctx, Xi);
-    ctx->ares = 0;
-  }
-
-  ctr = GETU32_aligned(ctx->Yi.c + 12);
-
-  n = ctx->mres;
-  if (n) {
-    while (n && len) {
-      ctx->Xi.c[n] ^= *(out++) = *(in++) ^ ctx->EKi.c[n];
-      --len;
-      n = (n + 1) % 16;
-    }
-    if (n == 0) {
-      GCM_MUL(ctx, Xi);
-    } else {
-      ctx->mres = n;
-      return 1;
-    }
-  }
-
-  while (len >= 16) {
-    size_t* out_t = reinterpret_cast<size_t*>(out);
-    const size_t* in_t = reinterpret_cast<const size_t*>(in);
-
-    (*block)(ctx->Yi.c, ctx->EKi.c, key);
-    ++ctr;
-    PUTU32_aligned(ctx->Yi.c + 12, ctr);
-    for (size_t i = 0; i < 16 / sizeof(size_t); ++i) {
-      ctx->Xi.t[i] ^= out_t[i] = in_t[i] ^ ctx->EKi.t[i];
-    }
-    GCM_MUL(ctx, Xi);
-    out += 16;
-    in += 16;
-    len -= 16;
-  }
-
-  if (len) {
-    (*block)(ctx->Yi.c, ctx->EKi.c, key);
-    ++ctr;
-    PUTU32_aligned(ctx->Yi.c + 12, ctr);
-    while (len--) {
-      ctx->Xi.c[n] ^= out[n] = in[n] ^ ctx->EKi.c[n];
-      ++n;
-    }
-  }
-
-  ctx->mres = n;
-  return 1;
-}
-
-int AES_gcm128_decrypt(GCM128_CONTEXT* ctx,
-                       const AES_KEY* key,
-                       const void* in_void,
-                       void* out_void,
-                       size_t len) {
-  unsigned int n, ctr;
-  uint64_t mlen = ctx->len.u[1];
-  block128_f block = ctx->block;
-  const uint8_t* in = static_cast<const uint8_t*>(in_void);
-  uint8_t* out = static_cast<uint8_t*>(out_void);
-
-  mlen += len;
-  if (mlen > ((UINT64_C(1) << 36) - 32) || (sizeof(len) == 8 && mlen < len)) {
-    return 0;
-  }
-  ctx->len.u[1] = mlen;
-
-  if (ctx->ares) {
-    /* First call to decrypt finalizes GHASH(AAD) */
-    GCM_MUL(ctx, Xi);
-    ctx->ares = 0;
-  }
-
-  ctr = GETU32_aligned(ctx->Yi.c + 12);
-
-  n = ctx->mres;
-  if (n) {
-    while (n && len) {
-      uint8_t c = *(in++);
-      *(out++) = c ^ ctx->EKi.c[n];
-      ctx->Xi.c[n] ^= c;
-      --len;
-      n = (n + 1) % 16;
-    }
-    if (n == 0) {
-      GCM_MUL(ctx, Xi);
-    } else {
-      ctx->mres = n;
-      return 1;
-    }
-  }
-
-  while (len >= 16) {
-    size_t* out_t = reinterpret_cast<size_t*>(out);
-    const size_t* in_t = reinterpret_cast<const size_t*>(in);
-
-    (*block)(ctx->Yi.c, ctx->EKi.c, key);
-    ++ctr;
-    PUTU32_aligned(ctx->Yi.c + 12, ctr);
-    for (size_t i = 0; i < 16 / sizeof(size_t); ++i) {
-      size_t c = in_t[i];
-      out_t[i] = c ^ ctx->EKi.t[i];
-      ctx->Xi.t[i] ^= c;
-    }
-    GCM_MUL(ctx, Xi);
-    out += 16;
-    in += 16;
-    len -= 16;
-  }
-
-  if (len) {
-    (*block)(ctx->Yi.c, ctx->EKi.c, key);
-    ++ctr;
-    PUTU32_aligned(ctx->Yi.c + 12, ctr);
-    while (len--) {
-      uint8_t c = in[n];
-      ctx->Xi.c[n] ^= c;
-      out[n] = c ^ ctx->EKi.c[n];
-      ++n;
-    }
-  }
-
-  ctx->mres = n;
-  return 1;
-}
-
-void AES_gcm128_tag(GCM128_CONTEXT* ctx, void* tag, size_t len) {
-  uint64_t alen = ctx->len.u[0] << 3;
-  uint64_t clen = ctx->len.u[1] << 3;
-
-  if (ctx->mres || ctx->ares) {
-    GCM_MUL(ctx, Xi);
-  }
-
-  alen = SbByteSwapU64(alen);
-  clen = SbByteSwapU64(clen);
-
-  ctx->Xi.u[0] ^= alen;
-  ctx->Xi.u[1] ^= clen;
-  GCM_MUL(ctx, Xi);
-
-  ctx->Xi.u[0] ^= ctx->EK0.u[0];
-  ctx->Xi.u[1] ^= ctx->EK0.u[1];
-
-  memcpy(tag, ctx->Xi.c,
-               len <= sizeof(ctx->Xi.c) ? len : sizeof(ctx->Xi.c));
-}
-
-}  // namespace cryptography
-}  // namespace starboard
-}  // namespace shared
-}  // namespace starboard
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/starboard/cryptography/software_aes.h b/starboard/shared/starboard/cryptography/software_aes.h
deleted file mode 100644
index 18d5da5..0000000
--- a/starboard/shared/starboard/cryptography/software_aes.h
+++ /dev/null
@@ -1,221 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2002-2006,2008 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    openssl-core@openssl.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED 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 OpenSSL PROJECT OR
- * ITS 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.
- * ==================================================================== */
-
-// Modifications Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef STARBOARD_SHARED_STARBOARD_CRYPTOGRAPHY_SOFTWARE_AES_H_
-#define STARBOARD_SHARED_STARBOARD_CRYPTOGRAPHY_SOFTWARE_AES_H_
-
-#if SB_API_VERSION >= 12
-#error "Starboard Crypto API is deprecated"
-#else
-
-#include "starboard/common/log.h"
-#include "starboard/configuration.h"
-#include "starboard/types.h"
-
-namespace starboard {
-namespace shared {
-namespace starboard {
-namespace cryptography {
-
-/* Raw AES functions. */
-#define SB_AES_ENCRYPT 1
-#define SB_AES_DECRYPT 0
-
-/* AES_MAXNR is the maximum number of AES rounds. */
-#define SB_AES_MAXNR 14
-#define SB_AES_BLOCK_SIZE 16
-
-/* aes_key_st should be an opaque type, but EVP requires that the size be
- * known. */
-struct aes_key_st {
-  uint32_t rd_key[4 * (SB_AES_MAXNR + 1)];
-  unsigned rounds;
-};
-
-typedef struct aes_key_st AES_KEY;
-
-typedef void (*block128_f)(const void* in, void* out, const AES_KEY* key);
-
-/* AES_set_encrypt_key configures |aeskey| to encrypt with the |bits|-bit key,
- * |key|.
- *
- * WARNING: unlike other OpenSSL functions, this returns zero on success and a
- * negative number on error. */
-int AES_set_encrypt_key(const void* key, unsigned bits, AES_KEY* aeskey);
-
-/* AES_set_decrypt_key configures |aeskey| to decrypt with the |bits|-bit key,
- * |key|.
- *
- * WARNING: unlike other OpenSSL functions, this returns zero on success and a
- * negative number on error. */
-int AES_set_decrypt_key(const void* key, unsigned bits, AES_KEY* aeskey);
-
-/* AES_encrypt encrypts a single block from |in| to |out| with |key|. The |in|
- * and |out| pointers may overlap. */
-void AES_encrypt(const void* in, void* out, const AES_KEY* key);
-
-/* AES_decrypt decrypts a single block from |in| to |out| with |key|. The |in|
- * and |out| pointers may overlap. */
-void AES_decrypt(const void* in, void* out, const AES_KEY* key);
-
-/* Block cipher modes. */
-/* AES_ctr128_encrypt encrypts (or decrypts, it's the same in CTR mode) |len|
- * bytes from |in| to |out|. The |num| parameter must be set to zero on the
- * first call and |ivec| will be incremented. */
-void AES_ctr128_encrypt(const void* in,
-                        void* out,
-                        size_t len,
-                        const AES_KEY* key,
-                        uint8_t ivec[SB_AES_BLOCK_SIZE],
-                        uint8_t ecount_buf[SB_AES_BLOCK_SIZE],
-                        uint32_t* num);
-
-/* AES_cbc_encrypt encrypts (or decrypts, if |enc| == |AES_DECRYPT|) |len|
- * bytes from |in| to |out|. The length must be a multiple of the block size. */
-void AES_cbc_encrypt(const void* in,
-                     void* out,
-                     size_t len,
-                     const AES_KEY* key,
-                     uint8_t* ivec,
-                     const int enc);
-
-/* GCM */
-
-typedef struct {
-  uint64_t hi;
-  uint64_t lo;
-} u128;
-
-/* gmult_func multiplies |Xi| by the GCM key and writes the result back to
- * |Xi|. */
-typedef void (*gmult_func)(uint64_t Xi[2], const u128 Htable[16]);
-
-/* ghash_func repeatedly multiplies |Xi| by the GCM key and adds in blocks from
- * |inp|. The result is written back to |Xi| and the |len| argument must be a
- * multiple of 16. */
-typedef void (*ghash_func)(uint64_t Xi[2], const u128 Htable[16],
-                           const uint8_t *inp, size_t len);
-
-/* This differs from upstream's |gcm128_context| in that it does not have the
- * |key| pointer, in order to make it |memcpy|-friendly. Rather the key is
- * passed into each call that needs it. */
-struct gcm128_context {
-  /* Following 6 names follow names in GCM specification */
-  union {
-    uint64_t u[2];
-    uint32_t d[4];
-    uint8_t c[16];
-    size_t t[16 / sizeof(size_t)];
-  } Yi, EKi, EK0, len, Xi;
-  /* Note that the order of |Xi|, |H| and |Htable| is fixed by the MOVBE-based,
-   * x86-64, GHASH assembly. */
-  u128 H;
-  u128 Htable[16];
-  gmult_func gmult;
-  ghash_func ghash;
-  unsigned int mres, ares;
-  block128_f block;
-};
-
-/* This API differs from the upstream API slightly. The |GCM128_CONTEXT| does
- * not have a |key| pointer that points to the key as upstream's version does.
- * Instead, every function takes a |key| parameter. This way |GCM128_CONTEXT|
- * can be safely copied. */
-typedef struct gcm128_context GCM128_CONTEXT;
-
-/* AES_gcm128_init initialises |ctx| to use the given key. */
-void AES_gcm128_init(GCM128_CONTEXT *ctx, const AES_KEY *key, int enc);
-
-/* AES_gcm128_setiv sets the IV (nonce) for |ctx|. The |key| must be the same
- * key that was passed to |AES_gcm128_init|. */
-void AES_gcm128_setiv(GCM128_CONTEXT *ctx, const AES_KEY *key,
-                      const void *iv, size_t iv_len);
-
-/* AES_gcm128_aad sets the authenticated data for an instance of GCM.  This must
- * be called before and data is encrypted. It returns one on success and zero
- * otherwise. */
-int AES_gcm128_aad(GCM128_CONTEXT *ctx, const void *aad, size_t len);
-
-/* AES_gcm128_encrypt encrypts |len| bytes from |in| to |out|. The |key| must be
- * the same key that was passed to |AES_gcm128_init|. It returns one on success
- * and zero otherwise. */
-int AES_gcm128_encrypt(GCM128_CONTEXT *ctx, const AES_KEY *key,
-                       const void *in, void *out, size_t len);
-
-/* AES_gcm128_decrypt decrypts |len| bytes from |in| to |out|. The |key| must be
- * the same key that was passed to |AES_gcm128_init|. It returns one on success
- * and zero otherwise. */
-int AES_gcm128_decrypt(GCM128_CONTEXT *ctx, const AES_KEY *key,
-                       const void *in, void *out, size_t len);
-
-/* AES_gcm128_tag calculates the authenticator and copies it into |tag|.  The
- * minimum of |len| and 16 bytes are copied into |tag|. */
-void AES_gcm128_tag(GCM128_CONTEXT *ctx, void *tag, size_t len);
-
-}  // namespace cryptography
-}  // namespace starboard
-}  // namespace shared
-}  // namespace starboard
-
-#endif  // SB_API_VERSION >= 12
-
-#endif  // STARBOARD_SHARED_STARBOARD_CRYPTOGRAPHY_SOFTWARE_AES_H_
diff --git a/starboard/shared/starboard/drm/drm_get_metrics.cc b/starboard/shared/starboard/drm/drm_get_metrics.cc
index 457830b..8ef78b2 100644
--- a/starboard/shared/starboard/drm/drm_get_metrics.cc
+++ b/starboard/shared/starboard/drm/drm_get_metrics.cc
@@ -17,8 +17,6 @@
 #include "starboard/common/log.h"
 #include "starboard/shared/starboard/drm/drm_system_internal.h"
 
-#if SB_API_VERSION >= 12
-
 const void* SbDrmGetMetrics(SbDrmSystem drm_system, int* size) {
   if (size == NULL) {
     SB_DLOG(WARNING) << "|size| cannot be NULL.";
@@ -34,5 +32,3 @@
 
   return drm_system->GetMetrics(size);
 }
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/shared/starboard/file_atomic_replace_write_file.cc b/starboard/shared/starboard/file_atomic_replace_write_file.cc
index deacb7a..6516eca 100644
--- a/starboard/shared/starboard/file_atomic_replace_write_file.cc
+++ b/starboard/shared/starboard/file_atomic_replace_write_file.cc
@@ -19,8 +19,6 @@
 #include "starboard/common/log.h"
 #include "starboard/file.h"
 
-#if SB_API_VERSION >= 12
-
 namespace starboard {
 namespace shared {
 namespace starboard {
@@ -67,5 +65,3 @@
 }  // namespace starboard
 }  // namespace shared
 }  // namespace starboard
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/shared/starboard/file_atomic_replace_write_file.h b/starboard/shared/starboard/file_atomic_replace_write_file.h
index f4657e6..9cb49a3 100644
--- a/starboard/shared/starboard/file_atomic_replace_write_file.h
+++ b/starboard/shared/starboard/file_atomic_replace_write_file.h
@@ -18,8 +18,6 @@
 #include "starboard/configuration.h"
 #include "starboard/types.h"
 
-#if SB_API_VERSION >= 12
-
 namespace starboard {
 namespace shared {
 namespace starboard {
@@ -32,6 +30,4 @@
 }  // namespace shared
 }  // namespace starboard
 
-#endif  // SB_API_VERSION >= 12
-
 #endif  // STARBOARD_SHARED_STARBOARD_FILE_ATOMIC_REPLACE_WRITE_FILE_H_
diff --git a/starboard/shared/starboard/lazy_initialization_internal.h b/starboard/shared/starboard/lazy_initialization_internal.h
index e094919..6588c45 100644
--- a/starboard/shared/starboard/lazy_initialization_internal.h
+++ b/starboard/shared/starboard/lazy_initialization_internal.h
@@ -22,14 +22,8 @@
 #include "starboard/thread.h"
 
 // INITIALIZED_STATE_UNINITIALIZED is defined in the header.
-
-#if SB_API_VERSION >= 12
 #define INITIALIZED_STATE_INITIALIZING 1
 #define INITIALIZED_STATE_INITIALIZED 2
-#else
-#define INITIALIZED_STATE_INITIALIZING 2
-#define INITIALIZED_STATE_INITIALIZED 3
-#endif
 
 namespace starboard {
 namespace shared {
diff --git a/starboard/shared/starboard/lazy_initialization_public.h b/starboard/shared/starboard/lazy_initialization_public.h
index ff05bb4..93b33f1 100644
--- a/starboard/shared/starboard/lazy_initialization_public.h
+++ b/starboard/shared/starboard/lazy_initialization_public.h
@@ -28,10 +28,6 @@
 // "starboard/atomic.h".
 typedef int32_t InitializedState;
 
-#if SB_API_VERSION >= 12
 #define INITIALIZED_STATE_UNINITIALIZED 0
-#else
-#define INITIALIZED_STATE_UNINITIALIZED 1
-#endif
 
 #endif  // STARBOARD_SHARED_STARBOARD_LAZY_INITIALIZATION_PUBLIC_H_
diff --git a/starboard/shared/starboard/media/codec_util.cc b/starboard/shared/starboard/media/codec_util.cc
index a6b090b..bd3e8ba 100644
--- a/starboard/shared/starboard/media/codec_util.cc
+++ b/starboard/shared/starboard/media/codec_util.cc
@@ -285,13 +285,11 @@
 // spec but this function only parses "avc1" and "avc3".  This function returns
 // false when |codec| doesn't contain a valid codec string.
 bool ParseH264Info(const char* codec, int* profile, int* level) {
-  if (strncmp(codec, "avc1.", 5) != 0 &&
-      strncmp(codec, "avc3.", 5) != 0) {
+  if (strncmp(codec, "avc1.", 5) != 0 && strncmp(codec, "avc3.", 5) != 0) {
     return false;
   }
 
-  if (strlen(codec) != 11 || !isxdigit(codec[9]) ||
-      !isxdigit(codec[10])) {
+  if (strlen(codec) != 11 || !isxdigit(codec[9]) || !isxdigit(codec[10])) {
     return false;
   }
 
@@ -313,8 +311,7 @@
 // Please see the comment in the code for interactions between the various
 // parts.
 bool ParseH265Info(const char* codec, int* profile, int* level) {
-  if (strncmp(codec, "hev1.", 5) != 0 &&
-      strncmp(codec, "hvc1.", 5) != 0) {
+  if (strncmp(codec, "hev1.", 5) != 0 && strncmp(codec, "hvc1.", 5) != 0) {
     return false;
   }
 
@@ -624,7 +621,6 @@
   if (strncmp(codec, "mp4a.40.", 8) == 0) {
     return kSbMediaAudioCodecAac;
   }
-#if SB_API_VERSION >= 12 || defined(SB_HAS_AC3_AUDIO)
   if (kSbHasAc3Audio) {
     if (strcmp(codec, "ac-3") == 0) {
       return kSbMediaAudioCodecAc3;
@@ -633,8 +629,6 @@
       return kSbMediaAudioCodecEac3;
     }
   }
-#endif  // SB_API_VERSION >= 12 ||
-        // defined(SB_HAS_AC3_AUDIO)
   if (strncmp(codec, "opus", 4) == 0) {
     return kSbMediaAudioCodecOpus;
   }
diff --git a/starboard/shared/starboard/media/media.gyp b/starboard/shared/starboard/media/media.gyp
deleted file mode 100644
index 31bc43b..0000000
--- a/starboard/shared/starboard/media/media.gyp
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-
-  'targets': [
-    {
-      'target_name': 'media_util',
-      'type': 'static_library',
-      'sources': [
-        '<(DEPTH)/starboard/shared/starboard/media/avc_util.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/avc_util.h',
-        '<(DEPTH)/starboard/shared/starboard/media/codec_util.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/codec_util.h',
-        '<(DEPTH)/starboard/shared/starboard/media/media_util.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/media_util.h',
-        '<(DEPTH)/starboard/shared/starboard/media/video_capabilities.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/video_capabilities.h',
-        '<(DEPTH)/starboard/shared/starboard/media/vp9_util.cc',
-        '<(DEPTH)/starboard/shared/starboard/media/vp9_util.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-      ],
-      'defines': [
-        # This allows the tests to include internal only header files.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-    },
-  ],
-}
diff --git a/starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc b/starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc
index c65f647..6d2c701 100644
--- a/starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc
+++ b/starboard/shared/starboard/media/media_is_audio_supported_aac_and_opus.cc
@@ -19,9 +19,7 @@
 #include "starboard/media.h"
 
 bool SbMediaIsAudioSupported(SbMediaAudioCodec audio_codec,
-#if SB_API_VERSION >= 12
                              const char* content_type,
-#endif  // SB_API_VERSION >= 12
                              int64_t bitrate) {
   if (audio_codec == kSbMediaAudioCodecAac) {
     return bitrate <= kSbMediaMaxAudioBitrateInBitsPerSecond;
diff --git a/starboard/shared/starboard/media/media_is_audio_supported_aac_only.cc b/starboard/shared/starboard/media/media_is_audio_supported_aac_only.cc
index afcccd4..fc72934 100644
--- a/starboard/shared/starboard/media/media_is_audio_supported_aac_only.cc
+++ b/starboard/shared/starboard/media/media_is_audio_supported_aac_only.cc
@@ -19,9 +19,7 @@
 #include "starboard/media.h"
 
 bool SbMediaIsAudioSupported(SbMediaAudioCodec audio_codec,
-#if SB_API_VERSION >= 12
                              const char* content_type,
-#endif  // SB_API_VERSION >= 12
                              int64_t bitrate) {
   return audio_codec == kSbMediaAudioCodecAac &&
          bitrate <= kSbMediaMaxAudioBitrateInBitsPerSecond;
diff --git a/starboard/shared/starboard/media/media_is_transfer_characteristics_supported.cc b/starboard/shared/starboard/media/media_is_transfer_characteristics_supported.cc
deleted file mode 100644
index 487ebf6..0000000
--- a/starboard/shared/starboard/media/media_is_transfer_characteristics_supported.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/shared/starboard/media/media_support_internal.h"
-
-#include "starboard/media.h"
-
-#if !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-bool SbMediaIsTransferCharacteristicsSupported(SbMediaTransferId transfer_id) {
-  return transfer_id == kSbMediaTransferIdBt709 ||
-         transfer_id == kSbMediaTransferIdUnspecified;
-}
-#endif  // !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
diff --git a/starboard/shared/starboard/media/media_support_internal.h b/starboard/shared/starboard/media/media_support_internal.h
index 13f9900..bf5fe78 100644
--- a/starboard/shared/starboard/media/media_support_internal.h
+++ b/starboard/shared/starboard/media/media_support_internal.h
@@ -75,8 +75,6 @@
 //        it indicates that the fps shouldn't be considered.
 // |decode_to_texture_required|: Whether or not the resulting video frames can
 //                               be decoded and used as textures by the GPU.
-#if SB_API_VERSION >= 12
-
 bool SbMediaIsVideoSupported(SbMediaVideoCodec video_codec,
                              const char* content_type,
                              int profile,
@@ -91,25 +89,6 @@
                              int fps,
                              bool decode_to_texture_required);
 
-#else  // SB_API_VERSION >= 12
-
-bool SbMediaIsVideoSupported(SbMediaVideoCodec video_codec,
-#if SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-                             int profile,
-                             int level,
-                             int bit_depth,
-                             SbMediaPrimaryId primary_id,
-                             SbMediaTransferId transfer_id,
-                             SbMediaMatrixId matrix_id,
-#endif  // SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-                             int frame_width,
-                             int frame_height,
-                             int64_t bitrate,
-                             int fps,
-                             bool decode_to_texture_required);
-
-#endif  // SB_API_VERSION >= 12
-
 // Indicates whether this platform supports |audio_codec| at |bitrate|.
 // If |audio_codec| is not supported under any condition, this function
 // returns |false|.
@@ -119,28 +98,10 @@
 //                 interface if there is any.  Otherwise it will be set to "".
 //                 It should never to set to NULL.
 // |bitrate|: The media's bitrate.
-#if SB_API_VERSION >= 12
-
 bool SbMediaIsAudioSupported(SbMediaAudioCodec audio_codec,
                              const char* content_type,
                              int64_t bitrate);
 
-#else  // SB_API_VERSION >= 12
-
-bool SbMediaIsAudioSupported(SbMediaAudioCodec audio_codec, int64_t bitrate);
-
-#endif  // SB_API_VERSION >= 12
-
-#if !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-// Indicates whether this platform supports |transfer_id| as a transfer
-// characteristics.  If |transfer_id| is not supported under any condition, this
-// function returns |false|.
-//
-// |transfer_id|: The id of transfer characteristics listed in
-//                SbMediaTransferId.
-bool SbMediaIsTransferCharacteristicsSupported(SbMediaTransferId transfer_id);
-#endif  // !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-
 #ifdef __cplusplus
 }  // extern "C"
 #endif
diff --git a/starboard/shared/starboard/media/media_tests.gypi b/starboard/shared/starboard/media/media_tests.gypi
deleted file mode 100644
index d581f6f..0000000
--- a/starboard/shared/starboard/media/media_tests.gypi
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    # This will be included by 'starboard_platform_tests.gyp' so full path names
-    # have to be used here.
-    'media_tests_sources': [
-      '<(DEPTH)/starboard/shared/starboard/media/avc_util_test.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/codec_util_test.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/mime_type_test.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/video_capabilities_test.cc',
-      '<(DEPTH)/starboard/shared/starboard/media/vp9_util_test.cc',
-    ],
-  },
-}
diff --git a/starboard/shared/starboard/media/media_util.cc b/starboard/shared/starboard/media/media_util.cc
index 786e284..3081d34 100644
--- a/starboard/shared/starboard/media/media_util.cc
+++ b/starboard/shared/starboard/media/media_util.cc
@@ -61,10 +61,7 @@
   int bitrate = mime_type.GetParamIntValue("bitrate", kDefaultBitRate);
 
   if (!SbMediaIsAudioSupported(audio_codec,
-#if SB_API_VERSION >= 12
-                               mime_type.raw_content_type().c_str(),
-#endif  // SB_API_VERSION >= 12
-                               bitrate)) {
+                               mime_type.raw_content_type().c_str(), bitrate)) {
     return false;
   }
 
@@ -74,7 +71,6 @@
       return false;
     case kSbMediaAudioCodecAac:
       return mime_type.subtype() == "mp4";
-#if SB_API_VERSION >= 12 || SB_HAS(AC3_AUDIO)
     case kSbMediaAudioCodecAc3:
       if (!kSbHasAc3Audio) {
         SB_NOTREACHED() << "AC3 audio is not enabled on this platform. To "
@@ -89,8 +85,6 @@
         return false;
       }
       return mime_type.subtype() == "mp4";
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(AC3_AUDIO)
     case kSbMediaAudioCodecOpus:
     case kSbMediaAudioCodecVorbis:
       return mime_type.subtype() == "webm";
@@ -139,11 +133,6 @@
           << codec << "\" will be overwritten by the eotf attribute " << eotf;
     }
     transfer_id = transfer_id_from_eotf;
-#if !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-    if (!SbMediaIsTransferCharacteristicsSupported(transfer_id)) {
-      return false;
-    }
-#endif  // !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
   }
 
   std::string cryptoblockformat =
@@ -164,22 +153,12 @@
     return false;
   }
 
-#if SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-  if (!SbMediaIsVideoSupported(video_codec,
-#if SB_API_VERSION >= 12
-                               mime_type.raw_content_type().c_str(),
-#endif  // SB_API_VERSION >= 12
-                               profile, level, bit_depth, primary_id,
-                               transfer_id, matrix_id, width, height, bitrate,
-                               fps, decode_to_texture_required)) {
+  if (!SbMediaIsVideoSupported(
+          video_codec, mime_type.raw_content_type().c_str(), profile, level,
+          bit_depth, primary_id, transfer_id, matrix_id, width, height, bitrate,
+          fps, decode_to_texture_required)) {
     return false;
   }
-#else   //  SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-  if (!SbMediaIsVideoSupported(video_codec, width, height, bitrate, fps,
-                               decode_to_texture_required)) {
-    return false;
-  }
-#endif  // SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
 
   switch (video_codec) {
     case kSbMediaVideoCodecNone:
@@ -224,7 +203,7 @@
            audio_specific_config_size);
     audio_specific_config = audio_specific_config_storage.data();
   }
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+
   if (codec == kSbMediaAudioCodecNone) {
     mime_storage.clear();
   } else {
@@ -232,7 +211,7 @@
     mime_storage = that.mime;
   }
   mime = mime_storage.c_str();
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+
   return *this;
 }
 
@@ -248,7 +227,7 @@
 VideoSampleInfo& VideoSampleInfo::operator=(
     const SbMediaVideoSampleInfo& that) {
   *static_cast<SbMediaVideoSampleInfo*>(this) = that;
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+
   if (codec == kSbMediaVideoCodecNone) {
     mime_storage.clear();
     max_video_capabilities_storage.clear();
@@ -259,7 +238,7 @@
   }
   mime = mime_storage.c_str();
   max_video_capabilities = max_video_capabilities_storage.c_str();
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+
   return *this;
 }
 
@@ -527,7 +506,6 @@
     return true;
   }
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   if (strcmp(sample_info_1.mime, sample_info_2.mime) != 0) {
     return false;
   }
@@ -535,7 +513,6 @@
              sample_info_2.max_video_capabilities) != 0) {
     return false;
   }
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
   if (sample_info_1.is_key_frame != sample_info_2.is_key_frame) {
     return false;
diff --git a/starboard/shared/starboard/media/media_util.h b/starboard/shared/starboard/media/media_util.h
index a0ee728..aef3cb8 100644
--- a/starboard/shared/starboard/media/media_util.h
+++ b/starboard/shared/starboard/media/media_util.h
@@ -34,9 +34,7 @@
   AudioSampleInfo& operator=(const SbMediaAudioSampleInfo& that);
 
  private:
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   std::string mime_storage;
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   std::vector<char> audio_specific_config_storage;
 };
 
@@ -46,10 +44,8 @@
   VideoSampleInfo& operator=(const SbMediaVideoSampleInfo& that);
 
  private:
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   std::string mime_storage;
   std::string max_video_capabilities_storage;
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 };
 
 bool IsAudioOutputSupported(SbMediaAudioCodingType coding_type, int channels);
diff --git a/starboard/shared/starboard/microphone/microphone_close.cc b/starboard/shared/starboard/microphone/microphone_close.cc
index 6022bad..c08ba67 100644
--- a/starboard/shared/starboard/microphone/microphone_close.cc
+++ b/starboard/shared/starboard/microphone/microphone_close.cc
@@ -16,11 +16,6 @@
 
 #include "starboard/shared/starboard/microphone/microphone_internal.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 bool SbMicrophoneClose(SbMicrophone microphone) {
   return SbMicrophoneIsValid(microphone) ? microphone->Close() : false;
 }
diff --git a/starboard/shared/starboard/microphone/microphone_create.cc b/starboard/shared/starboard/microphone/microphone_create.cc
index c783dc0..2c028eb 100644
--- a/starboard/shared/starboard/microphone/microphone_create.cc
+++ b/starboard/shared/starboard/microphone/microphone_create.cc
@@ -16,11 +16,6 @@
 
 #include "starboard/shared/starboard/microphone/microphone_internal.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 SbMicrophone SbMicrophoneCreate(SbMicrophoneId id,
                                 int sample_rate_in_hz,
                                 int buffer_size) {
diff --git a/starboard/shared/starboard/microphone/microphone_destroy.cc b/starboard/shared/starboard/microphone/microphone_destroy.cc
index 7c838ce..26e9708 100644
--- a/starboard/shared/starboard/microphone/microphone_destroy.cc
+++ b/starboard/shared/starboard/microphone/microphone_destroy.cc
@@ -16,11 +16,6 @@
 
 #include "starboard/shared/starboard/microphone/microphone_internal.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 void SbMicrophoneDestroy(SbMicrophone microphone) {
   SbMicrophonePrivate::DestroyMicrophone(microphone);
 }
diff --git a/starboard/shared/starboard/microphone/microphone_get_available.cc b/starboard/shared/starboard/microphone/microphone_get_available.cc
index 1af00f8..ee1d898 100644
--- a/starboard/shared/starboard/microphone/microphone_get_available.cc
+++ b/starboard/shared/starboard/microphone/microphone_get_available.cc
@@ -17,11 +17,6 @@
 #include "starboard/memory.h"
 #include "starboard/shared/starboard/microphone/microphone_internal.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 int SbMicrophoneGetAvailable(SbMicrophoneInfo* out_info_array,
                              int info_array_size) {
   if (out_info_array && info_array_size > 0) {
diff --git a/starboard/shared/starboard/microphone/microphone_internal.h b/starboard/shared/starboard/microphone/microphone_internal.h
index 9e984d5..a35dbe9 100644
--- a/starboard/shared/starboard/microphone/microphone_internal.h
+++ b/starboard/shared/starboard/microphone/microphone_internal.h
@@ -18,11 +18,6 @@
 #include "starboard/microphone.h"
 #include "starboard/shared/internal_only.h"
 
-#if (SB_API_VERSION < 12 && !SB_HAS(MICROPHONE))
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 struct SbMicrophonePrivate {
   virtual ~SbMicrophonePrivate() {}
   virtual bool Open() = 0;
diff --git a/starboard/shared/starboard/microphone/microphone_is_sample_rate_supported.cc b/starboard/shared/starboard/microphone/microphone_is_sample_rate_supported.cc
index aea18a7..bce3752 100644
--- a/starboard/shared/starboard/microphone/microphone_is_sample_rate_supported.cc
+++ b/starboard/shared/starboard/microphone/microphone_is_sample_rate_supported.cc
@@ -16,11 +16,6 @@
 
 #include "starboard/shared/starboard/microphone/microphone_internal.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 bool SbMicrophoneIsSampleRateSupported(SbMicrophoneId id,
                                        int sample_rate_in_hz) {
   return SbMicrophonePrivate::IsMicrophoneSampleRateSupported(
diff --git a/starboard/shared/starboard/microphone/microphone_open.cc b/starboard/shared/starboard/microphone/microphone_open.cc
index f708497..be8450e 100644
--- a/starboard/shared/starboard/microphone/microphone_open.cc
+++ b/starboard/shared/starboard/microphone/microphone_open.cc
@@ -16,11 +16,6 @@
 
 #include "starboard/shared/starboard/microphone/microphone_internal.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 bool SbMicrophoneOpen(SbMicrophone microphone) {
   return SbMicrophoneIsValid(microphone) ? microphone->Open() : false;
 }
diff --git a/starboard/shared/starboard/microphone/microphone_read.cc b/starboard/shared/starboard/microphone/microphone_read.cc
index 0d28592..0ed375d 100644
--- a/starboard/shared/starboard/microphone/microphone_read.cc
+++ b/starboard/shared/starboard/microphone/microphone_read.cc
@@ -16,11 +16,6 @@
 
 #include "starboard/shared/starboard/microphone/microphone_internal.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 int SbMicrophoneRead(SbMicrophone microphone,
                      void* out_audio_data,
                      int audio_data_size) {
diff --git a/starboard/shared/starboard/player/common_player_sources.gypi b/starboard/shared/starboard/player/common_player_sources.gypi
deleted file mode 100644
index 07121d4..0000000
--- a/starboard/shared/starboard/player/common_player_sources.gypi
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'common_player_sources': [
-      '<(DEPTH)/starboard/shared/starboard/player/decoded_audio_internal.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/decoded_audio_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/player/input_buffer_internal.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/input_buffer_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/player/job_queue.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/job_queue.h',
-      '<(DEPTH)/starboard/shared/starboard/player/job_thread.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/job_thread.h',
-      '<(DEPTH)/starboard/shared/starboard/player/player_create.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_destroy.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_get_current_frame.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_get_info2.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_get_maximum_number_of_samples_per_write.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_get_preferred_output_mode_prefer_punchout.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_internal.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/player/player_seek2.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_set_bounds.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_set_playback_rate.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_set_volume.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_worker.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_worker.h',
-      '<(DEPTH)/starboard/shared/starboard/player/player_write_end_of_stream.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/player_write_sample2.cc',
-    ],
-  },
-}
diff --git a/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc b/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc
index 4970a5b..c9136ae 100644
--- a/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc
+++ b/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc
@@ -37,21 +37,14 @@
              int frame_buffers_size_in_frames,
              SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
              SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
              SbAudioSinkPrivate::ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
              void* context) {
             return SbAudioSinkPrivate::Create(
                 channels, sampling_frequency_hz, audio_sample_type,
                 audio_frame_storage_type, frame_buffers,
                 frame_buffers_size_in_frames, update_source_status_func,
-                consume_frames_func,
-#if SB_API_VERSION >= 12
-                error_func,
-#endif  // SB_API_VERSION >= 12
-                context);
-          }) {
-}
+                consume_frames_func, error_func, context);
+          }) {}
 
 AudioRendererSinkImpl::AudioRendererSinkImpl(
     CreateAudioSinkFunc create_audio_sink_func)
@@ -110,10 +103,7 @@
       audio_frame_storage_type, frame_buffers, frames_per_channel,
       &AudioRendererSinkImpl::UpdateSourceStatusFunc,
       &AudioRendererSinkImpl::ConsumeFramesFunc,
-#if SB_API_VERSION >= 12
-      &AudioRendererSinkImpl::ErrorFunc,
-#endif  // SB_API_VERSION >= 12
-      this);
+      &AudioRendererSinkImpl::ErrorFunc, this);
   if (!SbAudioSinkIsValid(audio_sink_)) {
     return;
   }
diff --git a/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.h b/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.h
index 319cb32..bc60aa1 100644
--- a/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.h
+++ b/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.h
@@ -42,9 +42,7 @@
       int frame_buffers_size_in_frames,
       SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
       SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
-#if SB_API_VERSION >= 12
       SbAudioSinkPrivate::ErrorFunc error_func,
-#endif  // SB_API_VERSION >= 12
       void* context)>
       CreateAudioSinkFunc;
 
diff --git a/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc b/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
index 6a4b15e..b5d1d59 100644
--- a/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
+++ b/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc
@@ -67,7 +67,6 @@
 
 }  // namespace
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 FilterBasedPlayerWorkerHandler::FilterBasedPlayerWorkerHandler(
     const SbPlayerCreationParam* creation_param,
     SbDecodeTargetGraphicsContextProvider* provider)
@@ -81,34 +80,13 @@
       video_sample_info_(creation_param->video_sample_info) {
   update_job_ = std::bind(&FilterBasedPlayerWorkerHandler::Update, this);
 }
-#else   // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-FilterBasedPlayerWorkerHandler::FilterBasedPlayerWorkerHandler(
-    SbMediaVideoCodec video_codec,
-    SbMediaAudioCodec audio_codec,
-    SbDrmSystem drm_system,
-    const SbMediaAudioSampleInfo* audio_sample_info,
-    SbPlayerOutputMode output_mode,
-    SbDecodeTargetGraphicsContextProvider* provider)
-    : JobOwner(kDetached),
-      video_codec_(video_codec),
-      audio_codec_(audio_codec),
-      drm_system_(drm_system),
-      output_mode_(output_mode),
-      decode_target_graphics_context_provider_(provider) {
-  if (audio_sample_info) {
-    audio_sample_info_ = *audio_sample_info;
-  }
-  update_job_ = std::bind(&FilterBasedPlayerWorkerHandler::Update, this);
-}
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
 bool FilterBasedPlayerWorkerHandler::Init(
     SbPlayer player,
     UpdateMediaInfoCB update_media_info_cb,
     GetPlayerStateCB get_player_state_cb,
     UpdatePlayerStateCB update_player_state_cb,
-    UpdatePlayerErrorCB update_player_error_cb,
-    std::string* error_message) {
+    UpdatePlayerErrorCB update_player_error_cb) {
   // This function should only be called once.
   SB_DCHECK(update_media_info_cb_ == NULL);
 
@@ -117,7 +95,6 @@
   SB_DCHECK(update_media_info_cb);
   SB_DCHECK(get_player_state_cb);
   SB_DCHECK(update_player_state_cb);
-  SB_DCHECK(error_message);
 
   AttachToCurrentThread();
 
@@ -141,28 +118,28 @@
       SB_LOG(ERROR) << "Audio channels requested " << required_audio_channels
                     << ", but currently supported less than or equal to "
                     << supported_audio_channels;
-      *error_message =
+      OnError(
+          kSbPlayerErrorCapabilityChanged,
           FormatString("Required channel %d is greater than maximum channel %d",
-                       required_audio_channels, supported_audio_channels);
+                       required_audio_channels, supported_audio_channels));
       return false;
     }
   }
 
   PlayerComponents::Factory::CreationParameters creation_parameters(
-      audio_codec_, audio_sample_info_, video_codec_,
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-      video_sample_info_,
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+      audio_codec_, audio_sample_info_, video_codec_, video_sample_info_,
       player_, output_mode_, decode_target_graphics_context_provider_,
       drm_system_);
 
   {
     ::starboard::ScopedLock lock(player_components_existence_mutex_);
+    std::string error_message;
     player_components_ =
-        factory->CreateComponents(creation_parameters, error_message);
+        factory->CreateComponents(creation_parameters, &error_message);
     if (!player_components_) {
-      SB_LOG(ERROR) << "Failed to create player components with error: "
-                    << *error_message;
+      OnError(kSbPlayerErrorDecode,
+              FormatString("Failed to create player components with error: %s",
+                           error_message.c_str()));
       return false;
     }
     media_time_provider_ = player_components_->GetMediaTimeProvider();
diff --git a/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h b/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
index 00853a1..d6c56b3 100644
--- a/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
+++ b/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h
@@ -43,27 +43,16 @@
 class FilterBasedPlayerWorkerHandler : public PlayerWorker::Handler,
                                        private JobQueue::JobOwner {
  public:
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   FilterBasedPlayerWorkerHandler(
       const SbPlayerCreationParam* creation_param,
       SbDecodeTargetGraphicsContextProvider* provider);
-#else   // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-  FilterBasedPlayerWorkerHandler(
-      SbMediaVideoCodec video_codec,
-      SbMediaAudioCodec audio_codec,
-      SbDrmSystem drm_system,
-      const SbMediaAudioSampleInfo* audio_sample_info,
-      SbPlayerOutputMode output_mode,
-      SbDecodeTargetGraphicsContextProvider* provider);
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
  private:
   bool Init(SbPlayer player,
             UpdateMediaInfoCB update_media_info_cb,
             GetPlayerStateCB get_player_state_cb,
             UpdatePlayerStateCB update_player_state_cb,
-            UpdatePlayerErrorCB update_player_error_cb,
-            std::string* error_message) override;
+            UpdatePlayerErrorCB update_player_error_cb) override;
   bool Seek(SbTime seek_to_time, int ticket) override;
   bool WriteSample(const scoped_refptr<InputBuffer>& input_buffer,
                    bool* written) override;
@@ -126,10 +115,7 @@
   SbPlayerOutputMode output_mode_;
   SbDecodeTargetGraphicsContextProvider*
       decode_target_graphics_context_provider_;
-
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   media::VideoSampleInfo video_sample_info_;
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 };
 
 }  // namespace filter
diff --git a/starboard/shared/starboard/player/filter/player_components.cc b/starboard/shared/starboard/player/filter/player_components.cc
index b0098a9..f8eb7b0 100644
--- a/starboard/shared/starboard/player/filter/player_components.cc
+++ b/starboard/shared/starboard/player/filter/player_components.cc
@@ -95,18 +95,14 @@
 
 PlayerComponents::Factory::CreationParameters::CreationParameters(
     SbMediaVideoCodec video_codec,
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     const SbMediaVideoSampleInfo& video_sample_info,
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     SbPlayer player,
     SbPlayerOutputMode output_mode,
     SbDecodeTargetGraphicsContextProvider*
         decode_target_graphics_context_provider,
     SbDrmSystem drm_system)
     : video_codec_(video_codec),
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
       video_sample_info_(video_sample_info),
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
       player_(player),
       output_mode_(output_mode),
       decode_target_graphics_context_provider_(
@@ -121,9 +117,7 @@
     SbMediaAudioCodec audio_codec,
     const SbMediaAudioSampleInfo& audio_sample_info,
     SbMediaVideoCodec video_codec,
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     const SbMediaVideoSampleInfo& video_sample_info,
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     SbPlayer player,
     SbPlayerOutputMode output_mode,
     SbDecodeTargetGraphicsContextProvider*
@@ -132,9 +126,7 @@
     : audio_codec_(audio_codec),
       audio_sample_info_(audio_sample_info),
       video_codec_(video_codec),
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
       video_sample_info_(video_sample_info),
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
       player_(player),
       output_mode_(output_mode),
       decode_target_graphics_context_provider_(
@@ -150,9 +142,7 @@
   this->audio_codec_ = that.audio_codec_;
   this->audio_sample_info_ = that.audio_sample_info_;
   this->video_codec_ = that.video_codec_;
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   this->video_sample_info_ = that.video_sample_info_;
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   this->player_ = that.player_;
   this->output_mode_ = that.output_mode_;
   this->decode_target_graphics_context_provider_ =
diff --git a/starboard/shared/starboard/player/filter/player_components.h b/starboard/shared/starboard/player/filter/player_components.h
index 76d9bff..0948845 100644
--- a/starboard/shared/starboard/player/filter/player_components.h
+++ b/starboard/shared/starboard/player/filter/player_components.h
@@ -64,9 +64,7 @@
                          const SbMediaAudioSampleInfo& audio_sample_info,
                          SbDrmSystem drm_system = kSbDrmSystemInvalid);
       CreationParameters(SbMediaVideoCodec video_codec,
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
                          const SbMediaVideoSampleInfo& video_sample_info,
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
                          SbPlayer player,
                          SbPlayerOutputMode output_mode,
                          SbDecodeTargetGraphicsContextProvider*
@@ -75,9 +73,7 @@
       CreationParameters(SbMediaAudioCodec audio_codec,
                          const SbMediaAudioSampleInfo& audio_sample_info,
                          SbMediaVideoCodec video_codec,
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
                          const SbMediaVideoSampleInfo& video_sample_info,
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
                          SbPlayer player,
                          SbPlayerOutputMode output_mode,
                          SbDecodeTargetGraphicsContextProvider*
@@ -98,7 +94,6 @@
 
       SbMediaVideoCodec video_codec() const { return video_codec_; }
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
       const char* audio_mime() const {
         SB_DCHECK(audio_codec_ != kSbMediaAudioCodecNone);
         return audio_sample_info_.mime;
@@ -118,7 +113,6 @@
         SB_DCHECK(video_codec_ != kSbMediaVideoCodecNone);
         return video_sample_info_.max_video_capabilities;
       }
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
       SbPlayer player() const { return player_; }
       SbPlayerOutputMode output_mode() const { return output_mode_; }
@@ -144,9 +138,7 @@
       // |video_codec| can be set to kSbMediaVideoCodecNone for audio only
       // video.
       SbMediaVideoCodec video_codec_ = kSbMediaVideoCodecNone;
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
       media::VideoSampleInfo video_sample_info_;
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
       SbPlayer player_ = kSbPlayerInvalid;
       SbPlayerOutputMode output_mode_ = kSbPlayerOutputModeInvalid;
       SbDecodeTargetGraphicsContextProvider*
diff --git a/starboard/shared/starboard/player/filter/player_filter.gypi b/starboard/shared/starboard/player/filter/player_filter.gypi
deleted file mode 100644
index 2d79207..0000000
--- a/starboard/shared/starboard/player/filter/player_filter.gypi
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'variables': {
-    'filter_based_player_sources': [
-      '<(DEPTH)/starboard/shared/starboard/player/filter/adaptive_audio_decoder_internal.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/adaptive_audio_decoder_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_channel_layout_mixer.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_channel_layout_mixer_impl.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_decoder_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_frame_tracker.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_frame_tracker.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_renderer_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_renderer_internal_impl.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_renderer_internal_impl.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_renderer_sink.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_renderer_sink_impl.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_resampler.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_resampler_impl.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_time_stretcher.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/audio_time_stretcher.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/common.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/cpu_video_frame.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/cpu_video_frame.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/decoded_audio_queue.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/decoded_audio_queue.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/filter_based_player_worker_handler.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/interleaved_sinc_resampler.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/media_time_provider.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/media_time_provider_impl.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/media_time_provider_impl.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/mock_audio_decoder.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/mock_audio_renderer_sink.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/player_components.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/player_components.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/punchout_video_renderer_sink.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/punchout_video_renderer_sink.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/stub_audio_decoder.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/stub_audio_decoder.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/stub_player_components_factory.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/stub_player_components_factory.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/stub_video_decoder.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/stub_video_decoder.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_decoder_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_frame_cadence_pattern_generator.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_frame_cadence_pattern_generator.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_frame_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_frame_rate_estimator.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_frame_rate_estimator.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_render_algorithm.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_render_algorithm_impl.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_render_algorithm_impl.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_renderer_internal.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_renderer_internal_impl.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_renderer_internal_impl.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/video_renderer_sink.h',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/wsola_internal.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/filter/wsola_internal.h',
-    ],
-  },
-}
diff --git a/starboard/shared/starboard/player/filter/testing/BUILD.gn b/starboard/shared/starboard/player/filter/testing/BUILD.gn
index dc5cdcc..15ca8b9 100644
--- a/starboard/shared/starboard/player/filter/testing/BUILD.gn
+++ b/starboard/shared/starboard/player/filter/testing/BUILD.gn
@@ -41,10 +41,8 @@
 
   deps = cobalt_platform_dependencies
 
-  content_deps = [
-    "//starboard/shared/starboard/player:player_download_test_data",
-    "//third_party/icu:icudata",
-  ]
+  content_deps =
+      [ "//starboard/shared/starboard/player:player_download_test_data" ]
 }
 
 if (host_os != "win") {
diff --git a/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc b/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc
index f36b5d7..c7b15c9 100644
--- a/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc
+++ b/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc
@@ -247,9 +247,7 @@
     static starboard::media::AudioSampleInfo audio_sample_info = {};
 
     audio_sample_info.codec = kSbMediaAudioCodecAac;
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     audio_sample_info.mime = "";
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     audio_sample_info.number_of_channels = kDefaultNumberOfChannels;
     audio_sample_info.samples_per_second = kDefaultSamplesPerSecond;
     audio_sample_info.bits_per_sample = 32;
@@ -273,19 +271,11 @@
 };
 
 bool HasAsyncAudioFramesReporting() {
-#if SB_API_VERSION >= 12
   // TODO: When deprecating Starboard API versions less than
   // 12 it is safe to assume that all tests can be run regardless of
   // whether the platform has asynchronous audio frames reporting.
   // This function can be removed then.
   return false;
-#else  // SB_API_VERSION >=  12
-#if SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-  return true;
-#else   // SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-  return false;
-#endif  // SB_HAS(ASYNC_AUDIO_FRAMES_REPORTING)
-#endif  // SB_API_VERSION >=  12
 }
 
 // static
diff --git a/starboard/shared/starboard/player/filter/testing/player_components_test.cc b/starboard/shared/starboard/player/filter/testing/player_components_test.cc
index afa4fad..0e9ce1c 100644
--- a/starboard/shared/starboard/player/filter/testing/player_components_test.cc
+++ b/starboard/shared/starboard/player/filter/testing/player_components_test.cc
@@ -91,10 +91,8 @@
       CreationParameters creation_parameters(
           audio_reader_->audio_codec(), audio_reader_->audio_sample_info(),
           video_reader_->video_codec(),
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
           video_reader_->GetPlayerSampleInfo(kSbMediaTypeVideo, 0)
               .video_sample_info,
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
           kDummyPlayer, output_mode_,
           fake_graphics_context_provider_.decoder_target_provider());
       player_components_ =
@@ -110,10 +108,8 @@
       ASSERT_TRUE(video_reader_);
       CreationParameters creation_parameters(
           video_reader_->video_codec(),
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
           video_reader_->GetPlayerSampleInfo(kSbMediaTypeVideo, 0)
               .video_sample_info,
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
           kDummyPlayer, output_mode_,
           fake_graphics_context_provider_.decoder_target_provider());
       player_components_ =
diff --git a/starboard/shared/starboard/player/filter/testing/player_filter_tests.gyp b/starboard/shared/starboard/player/filter/testing/player_filter_tests.gyp
deleted file mode 100644
index 75f6c95..0000000
--- a/starboard/shared/starboard/player/filter/testing/player_filter_tests.gyp
+++ /dev/null
@@ -1,113 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'player_filter_tests',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        '<(DEPTH)/starboard/common/test_main.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/adaptive_audio_decoder_test.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/audio_channel_layout_mixer_test.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/audio_decoder_test.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/audio_renderer_internal_test.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/file_cache_reader_test.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/media_time_provider_impl_test.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/player_components_test.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/test_util.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/test_util.h',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.h',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/video_frame_cadence_pattern_generator_test.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/video_frame_rate_estimator_test.cc',
-        '<(DEPTH)/starboard/testing/fake_graphics_context_provider.cc',
-        '<(DEPTH)/starboard/testing/fake_graphics_context_provider.h',
-      ],
-      'conditions': [
-        ['gl_type != "none"', {
-          'dependencies': [
-            # This is needed because VideoDecoderTest depends on
-            # FakeGraphicsContextProvider which depends on EGL and GLES.
-            '<(DEPTH)/starboard/egl_and_gles/egl_and_gles.gyp:egl_and_gles',
-          ],
-        }],
-      ],
-      'defines': [
-        # This allows the tests to include internal only header files.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/starboard/shared/starboard/player/player.gyp:video_dmp',
-        '<(DEPTH)/starboard/shared/starboard/player/player.gyp:player_copy_test_data',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'player_filter_tests_deploy',
-      'type': 'none',
-      'dependencies': [
-        'player_filter_tests',
-      ],
-      'variables': {
-        'executable_name': 'player_filter_tests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-    {
-      'target_name': 'player_filter_benchmarks',
-      'type': '<(final_executable_type)',
-      'conditions': [
-        ['gl_type != "none"', {
-          'dependencies': [
-            # This is needed because VideoDecoderTest depends on
-            # FakeGraphicsContextProvider which depends on EGL and GLES.
-            '<(DEPTH)/starboard/egl_and_gles/egl_and_gles.gyp:egl_and_gles',
-          ],
-        }],
-      ],
-      'defines': [
-        # This allows the benchmarks to include internal only header files.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'sources': [
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/audio_decoder_benchmark.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/filter/testing/test_util.cc',
-        '<(DEPTH)/starboard/common/benchmark_main.cc',
-      ],
-      'dependencies': [
-        '<@(cobalt_platform_dependencies)',
-        '<(DEPTH)/starboard/shared/starboard/player/player.gyp:video_dmp',
-        '<(DEPTH)/starboard/shared/starboard/player/player.gyp:player_copy_test_data',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/third_party/google_benchmark/google_benchmark.gyp:google_benchmark',
-      ],
-    },
-    {
-      'target_name': 'player_filter_benchmarks_deploy',
-      'type': 'none',
-      'dependencies': [
-        'player_filter_benchmarks',
-      ],
-      'variables': {
-        'executable_name': 'player_filter_benchmarks',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/shared/starboard/player/filter/testing/test_util.cc b/starboard/shared/starboard/player/filter/testing/test_util.cc
index 21447a4..9bfdb7e 100644
--- a/starboard/shared/starboard/player/filter/testing/test_util.cc
+++ b/starboard/shared/starboard/player/filter/testing/test_util.cc
@@ -157,11 +157,9 @@
     // Filter files of unsupported codec.
     if (!SbMediaIsAudioSupported(
             audio_file_info.audio_codec,
-#if SB_API_VERSION >= 12
             GetContentTypeFromAudioCodec(audio_file_info.audio_codec,
                                          extra_mime_attributes)
                 .c_str(),
-#endif  // SB_API_VERSION >= 12
             audio_file_info.bitrate)) {
       continue;
     }
@@ -207,14 +205,9 @@
               .video_sample_info;
 
       if (SbMediaIsVideoSupported(
-              dmp_reader.video_codec(),
-#if SB_API_VERSION >= 12
-              dmp_reader.video_mime_type().c_str(),
-#endif  // SB_API_VERSION >= 12
-#if SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
+              dmp_reader.video_codec(), dmp_reader.video_mime_type().c_str(),
               -1, -1, 8, kSbMediaPrimaryIdUnspecified,
               kSbMediaTransferIdUnspecified, kSbMediaMatrixIdUnspecified,
-#endif  // SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
               video_sample_info.frame_width, video_sample_info.frame_height,
               dmp_reader.video_bitrate(), dmp_reader.video_fps(), false)) {
         test_params.push_back(std::make_tuple(filename, output_mode));
@@ -268,7 +261,6 @@
          << "time " << time1 << " doesn't match with time " << time2;
 }
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 media::VideoSampleInfo CreateVideoSampleInfo(SbMediaVideoCodec codec) {
   shared::starboard::media::VideoSampleInfo video_sample_info = {};
 
@@ -286,7 +278,6 @@
 
   return video_sample_info;
 }
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
 }  // namespace testing
 }  // namespace filter
diff --git a/starboard/shared/starboard/player/filter/testing/test_util.h b/starboard/shared/starboard/player/filter/testing/test_util.h
index 20808ec..625ccba 100644
--- a/starboard/shared/starboard/player/filter/testing/test_util.h
+++ b/starboard/shared/starboard/player/filter/testing/test_util.h
@@ -62,9 +62,7 @@
 
 ::testing::AssertionResult AlmostEqualTime(SbTime time1, SbTime time2);
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 media::VideoSampleInfo CreateVideoSampleInfo(SbMediaVideoCodec codec);
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
 }  // namespace testing
 }  // namespace filter
diff --git a/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc b/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
index f62ffe7..03f0c08 100644
--- a/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
+++ b/starboard/shared/starboard/player/filter/testing/video_decoder_test.cc
@@ -93,16 +93,9 @@
   SbPlayerOutputMode kOutputModes[] = {kSbPlayerOutputModeDecodeToTexture,
                                        kSbPlayerOutputModePunchOut};
   SbMediaVideoCodec kVideoCodecs[] = {
-    kSbMediaVideoCodecNone,
-    kSbMediaVideoCodecH264,
-    kSbMediaVideoCodecH265,
-    kSbMediaVideoCodecMpeg2,
-    kSbMediaVideoCodecTheora,
-    kSbMediaVideoCodecVc1,
-    kSbMediaVideoCodecAv1,
-    kSbMediaVideoCodecVp8,
-    kSbMediaVideoCodecVp9
-  };
+      kSbMediaVideoCodecNone,  kSbMediaVideoCodecH264,   kSbMediaVideoCodecH265,
+      kSbMediaVideoCodecMpeg2, kSbMediaVideoCodecTheora, kSbMediaVideoCodecVc1,
+      kSbMediaVideoCodecAv1,   kSbMediaVideoCodecVp8,    kSbMediaVideoCodecVp9};
   for (auto output_mode : kOutputModes) {
     for (auto video_codec : kVideoCodecs) {
       VideoDecoder::OutputModeSupported(output_mode, video_codec,
@@ -129,16 +122,9 @@
   SbPlayerOutputMode kOutputModes[] = {kSbPlayerOutputModeDecodeToTexture,
                                        kSbPlayerOutputModePunchOut};
   SbMediaVideoCodec kVideoCodecs[] = {
-    kSbMediaVideoCodecNone,
-    kSbMediaVideoCodecH264,
-    kSbMediaVideoCodecH265,
-    kSbMediaVideoCodecMpeg2,
-    kSbMediaVideoCodecTheora,
-    kSbMediaVideoCodecVc1,
-    kSbMediaVideoCodecAv1,
-    kSbMediaVideoCodecVp8,
-    kSbMediaVideoCodecVp9
-  };
+      kSbMediaVideoCodecNone,  kSbMediaVideoCodecH264,   kSbMediaVideoCodecH265,
+      kSbMediaVideoCodecMpeg2, kSbMediaVideoCodecTheora, kSbMediaVideoCodecVc1,
+      kSbMediaVideoCodecAv1,   kSbMediaVideoCodecVp8,    kSbMediaVideoCodecVp9};
 
   for (auto output_mode : kOutputModes) {
     for (auto video_codec : kVideoCodecs) {
@@ -153,13 +139,10 @@
 
         for (int i = 0; i < kDecodersToCreate; ++i) {
           SbMediaAudioSampleInfo dummy_audio_sample_info = {
-            kSbMediaAudioCodecNone
-          };
+              kSbMediaAudioCodecNone};
           PlayerComponents::Factory::CreationParameters creation_parameters(
               fixture_.dmp_reader().video_codec(),
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
               CreateVideoSampleInfo(fixture_.dmp_reader().video_codec()),
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
               &players[i], output_mode,
               fake_graphics_context_provider_.decoder_target_provider(),
               nullptr);
diff --git a/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.cc b/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.cc
index 3932a71..f274a3e 100644
--- a/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.cc
+++ b/starboard/shared/starboard/player/filter/testing/video_decoder_test_fixture.cc
@@ -86,10 +86,7 @@
       output_mode, dmp_reader_.video_codec(), kSbDrmSystemInvalid));
 
   PlayerComponents::Factory::CreationParameters creation_parameters(
-      dmp_reader_.video_codec(),
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-      GetVideoInputBuffer(0)->video_sample_info(),
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
+      dmp_reader_.video_codec(), GetVideoInputBuffer(0)->video_sample_info(),
       &player_, output_mode,
       fake_graphics_context_provider_->decoder_target_provider(), nullptr);
 
@@ -266,7 +263,7 @@
       ++start_index;
       --number_of_inputs_to_write;
     } else if (event.status == kError || event.status == kTimeout) {
-      // Assume that the caller does't expect an error when |event_cb| isn't
+      // Assume that the caller doesn't expect an error when |event_cb| isn't
       // provided.
       ASSERT_TRUE(event_cb);
       bool continue_process = true;
diff --git a/starboard/shared/starboard/player/filter/tools/tools.gyp b/starboard/shared/starboard/player/filter/tools/tools.gyp
deleted file mode 100644
index efe5dd1..0000000
--- a/starboard/shared/starboard/player/filter/tools/tools.gyp
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'audio_dmp_player',
-      'type': '<(final_executable_type)',
-      'sources': [
-        '<(DEPTH)/starboard/shared/starboard/player/file_cache_reader.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/file_cache_reader.h',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_common.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_common.h',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_reader.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_reader.h',
-        'audio_dmp_player.cc',
-      ],
-      'defines': [
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/shared/starboard/player/player.gyp:player_copy_test_data',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-    {
-      'target_name': 'audio_dmp_player_deploy',
-      'type': 'none',
-      'dependencies': [
-        'audio_dmp_player',
-      ],
-      'variables': {
-        'executable_name': 'audio_dmp_player',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/starboard/shared/starboard/player/input_buffer_internal.cc b/starboard/shared/starboard/player/input_buffer_internal.cc
index 7296f00..b9b22c2 100644
--- a/starboard/shared/starboard/player/input_buffer_internal.cc
+++ b/starboard/shared/starboard/player/input_buffer_internal.cc
@@ -87,21 +87,16 @@
      << " sample @ timestamp: " << timestamp() << " in " << size()
      << " bytes ==========\n";
   if (sample_type() == kSbMediaTypeAudio) {
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     ss << "codec: " << audio_sample_info().codec << ", mime: '"
        << audio_sample_info().mime << "'\n";
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
     ss << audio_sample_info().samples_per_second << '\n';
   } else {
     SB_DCHECK(sample_type() == kSbMediaTypeVideo);
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     ss << "codec: " << video_sample_info().codec << ", mime: '"
        << video_sample_info().mime << "'"
        << ", max_video_capabilities: '"
        << video_sample_info().max_video_capabilities << "'\n";
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
     ss << video_sample_info().frame_width << " x "
        << video_sample_info().frame_height << '\n';
   }
diff --git a/starboard/shared/starboard/player/player.gyp b/starboard/shared/starboard/player/player.gyp
deleted file mode 100644
index c38e82e..0000000
--- a/starboard/shared/starboard/player/player.gyp
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'player',
-      'type': 'static_library',
-      'sources': [
-        '<@(common_player_sources)',
-      ],
-      'defines': [
-        # This must be defined when building Starboard, and must not when
-        # building Starboard client code.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-      'includes': ['<(DEPTH)/starboard/shared/starboard/player/common_player_sources.gypi'],
-    },
-    {
-      'target_name': 'video_dmp',
-      'type': 'static_library',
-      'sources': [
-        '<(DEPTH)/starboard/shared/starboard/player/file_cache_reader.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/file_cache_reader.h',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_common.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_common.h',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_reader.cc',
-        '<(DEPTH)/starboard/shared/starboard/player/video_dmp_reader.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-      ],
-      'defines': [
-        # This allows the tests to include internal only header files.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-    },
-    {
-      'target_name': 'player_copy_test_data',
-      'type': 'none',
-      'variables': {
-        'content_test_input_files': [
-          '<!@pymod_do_main(starboard.build.gyp_functions file_glob_sub <(DEPTH)/starboard/shared/starboard/player/testdata *.dmp.sha1 dmp.sha1 dmp)'
-        ],
-        'content_test_output_subdir': 'starboard/shared/starboard/player/testdata',
-      },
-      'actions' : [
-        {
-          'variables': {
-            'sha_dir': '<(DEPTH)/starboard/shared/starboard/player/testdata',
-            # GYP will remove an argument to an action that looks like a duplicate, so
-            # we change it semantically here.
-            'out_dir': '<(DEPTH)/starboard/../starboard/shared/starboard/player/testdata',
-          },
-          'action_name': 'player_download_test_data',
-          'action': [
-            'python2',
-            '<(DEPTH)/tools/download_from_gcs.py',
-            '--bucket', 'cobalt-static-storage',
-            '--sha1', '<(sha_dir)',
-            '--output', '<(out_dir)',
-          ],
-          'inputs': [
-            '<!@pymod_do_main(starboard.build.gyp_functions file_glob <(sha_dir) *.dmp.sha1)',
-          ],
-          'outputs': [
-            '<!@pymod_do_main(starboard.build.gyp_functions file_glob_sub <(DEPTH)/starboard/shared/starboard/player/testdata *.dmp.sha1 dmp.sha1 dmp)',
-          ],
-        },
-      ],
-      'includes': ['<(DEPTH)/starboard/build/copy_test_data.gypi'],
-    },
-  ],
-}
diff --git a/starboard/shared/starboard/player/player_create.cc b/starboard/shared/starboard/player/player_create.cc
index dd59c65..c2e0a07 100644
--- a/starboard/shared/starboard/player/player_create.cc
+++ b/starboard/shared/starboard/player/player_create.cc
@@ -37,8 +37,6 @@
     FilterBasedPlayerWorkerHandler;
 using starboard::shared::starboard::player::PlayerWorker;
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 SbPlayer SbPlayerCreate(SbWindow window,
                         const SbPlayerCreationParam* creation_param,
                         SbPlayerDeallocateSampleFunc sample_deallocate_func,
@@ -106,23 +104,6 @@
       &creation_param->audio_sample_info;
   const auto output_mode = creation_param->output_mode;
 
-#else   // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-SbPlayer SbPlayerCreate(SbWindow window,
-                        SbMediaVideoCodec video_codec,
-                        SbMediaAudioCodec audio_codec,
-                        SbDrmSystem drm_system,
-                        const SbMediaAudioSampleInfo* audio_sample_info,
-                        const char* max_video_capabilities,
-                        SbPlayerDeallocateSampleFunc sample_deallocate_func,
-                        SbPlayerDecoderStatusFunc decoder_status_func,
-                        SbPlayerStatusFunc player_status_func,
-                        SbPlayerErrorFunc player_error_func,
-                        void* context,
-                        SbPlayerOutputMode output_mode,
-                        SbDecodeTargetGraphicsContextProvider* provider) {
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
   if (!player_error_func) {
     SB_LOG(ERROR) << "|player_error_func| cannot be null.";
     return kSbPlayerInvalid;
@@ -155,11 +136,7 @@
 
   const int64_t kDefaultBitRate = 0;
   if (audio_codec != kSbMediaAudioCodecNone &&
-      !SbMediaIsAudioSupported(audio_codec,
-#if SB_API_VERSION >= 12
-                               audio_mime,
-#endif  // SB_API_VERSION >= 12
-                               kDefaultBitRate)) {
+      !SbMediaIsAudioSupported(audio_codec, audio_mime, kDefaultBitRate)) {
     SB_LOG(ERROR) << "Unsupported audio codec "
                   << starboard::GetMediaAudioCodecName(audio_codec) << ".";
     player_error_func(
@@ -178,15 +155,9 @@
   const int kDefaultFrameRate = 0;
   if (video_codec != kSbMediaVideoCodecNone &&
       !SbMediaIsVideoSupported(
-          video_codec,
-#if SB_API_VERSION >= 12
-          video_mime,
-#endif  // SB_API_VERSION >= 12
-#if SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-          kDefaultProfile, kDefaultLevel, kDefaultColorDepth,
-          kSbMediaPrimaryIdUnspecified, kSbMediaTransferIdUnspecified,
-          kSbMediaMatrixIdUnspecified,
-#endif  // SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
+          video_codec, video_mime, kDefaultProfile, kDefaultLevel,
+          kDefaultColorDepth, kSbMediaPrimaryIdUnspecified,
+          kSbMediaTransferIdUnspecified, kSbMediaMatrixIdUnspecified,
           kDefaultFrameWidth, kDefaultFrameHeight, kDefaultBitRate,
           kDefaultFrameRate,
           output_mode == kSbPlayerOutputModeDecodeToTexture)) {
@@ -234,7 +205,6 @@
     return kSbPlayerInvalid;
   }
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   if (SbPlayerGetPreferredOutputMode(creation_param) != output_mode) {
     error_message = starboard::FormatString("Unsupported player output mode %d",
                                             output_mode);
@@ -243,28 +213,11 @@
                       error_message.c_str());
     return kSbPlayerInvalid;
   }
-#else   // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-  if (!SbPlayerOutputModeSupported(output_mode, video_codec, drm_system)) {
-    error_message = starboard::FormatString("Unsupported player output mode %d",
-                                            output_mode);
-    SB_LOG(ERROR) << error_message << ".";
-    player_error_func(kSbPlayerInvalid, context, kSbPlayerErrorDecode,
-                      error_message.c_str());
-    return kSbPlayerInvalid;
-  }
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
   UpdateActiveSessionPlatformPlaybackState(kPlaying);
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   starboard::scoped_ptr<PlayerWorker::Handler> handler(
       new FilterBasedPlayerWorkerHandler(creation_param, provider));
-#else   // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-  starboard::scoped_ptr<PlayerWorker::Handler> handler(
-      new FilterBasedPlayerWorkerHandler(video_codec, audio_codec, drm_system,
-                                         audio_sample_info, output_mode,
-                                         provider));
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
   SbPlayer player = SbPlayerPrivate::CreateInstance(
       audio_codec, video_codec, audio_sample_info, sample_deallocate_func,
diff --git a/starboard/shared/starboard/player/player_get_preferred_output_mode_prefer_punchout.cc b/starboard/shared/starboard/player/player_get_preferred_output_mode_prefer_punchout.cc
index 37203a3..356dccb 100644
--- a/starboard/shared/starboard/player/player_get_preferred_output_mode_prefer_punchout.cc
+++ b/starboard/shared/starboard/player/player_get_preferred_output_mode_prefer_punchout.cc
@@ -19,8 +19,6 @@
 #include "starboard/configuration.h"
 #include "starboard/shared/starboard/player/filter/video_decoder_internal.h"
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 SbPlayerOutputMode SbPlayerGetPreferredOutputMode(
     const SbPlayerCreationParam* creation_param) {
   using starboard::shared::starboard::player::filter::VideoDecoder;
@@ -76,5 +74,3 @@
                   << ") is not supported";
   return kSbPlayerOutputModeInvalid;
 }
-
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
diff --git a/starboard/shared/starboard/player/player_output_mode_supported.cc b/starboard/shared/starboard/player/player_output_mode_supported.cc
deleted file mode 100644
index beadfb7..0000000
--- a/starboard/shared/starboard/player/player_output_mode_supported.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/player.h"
-
-#include "starboard/common/log.h"
-#include "starboard/configuration.h"
-#include "starboard/shared/starboard/player/filter/video_decoder_internal.h"
-
-#if !SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-bool SbPlayerOutputModeSupported(SbPlayerOutputMode output_mode,
-                                 SbMediaVideoCodec codec,
-                                 SbDrmSystem drm_system) {
-  return starboard::shared::starboard::player::filter::VideoDecoder::
-      OutputModeSupported(output_mode, codec, drm_system);
-}
-
-#endif  // !SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
diff --git a/starboard/shared/starboard/player/player_tests.gypi b/starboard/shared/starboard/player/player_tests.gypi
deleted file mode 100644
index 1ad36ff..0000000
--- a/starboard/shared/starboard/player/player_tests.gypi
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    # This will be included by 'starboard_platform_tests.gyp' so full path names
-    # have to be used here.
-    'player_tests_sources': [
-      '<(DEPTH)/starboard/shared/starboard/player/job_queue_test.cc',
-      '<(DEPTH)/starboard/shared/starboard/player/job_thread_test.cc',
-    ],
-  },
-}
diff --git a/starboard/shared/starboard/player/player_worker.cc b/starboard/shared/starboard/player/player_worker.cc
index 5ab9a8a..2cec1a6 100644
--- a/starboard/shared/starboard/player/player_worker.cc
+++ b/starboard/shared/starboard/player/player_worker.cc
@@ -159,14 +159,15 @@
 
 void PlayerWorker::UpdatePlayerError(SbPlayerError error,
                                      const std::string& error_message) {
-  error_occurred_ = true;
   SB_LOG(WARNING) << "Encountered player error " << error
                   << " with message: " << error_message;
-
+  // Only report the first error.
+  if (error_occurred_.exchange(true)) {
+    return;
+  }
   if (!player_error_func_) {
     return;
   }
-
   player_error_func_(player_, context_, error, error_message.c_str());
 }
 
@@ -198,17 +199,15 @@
   Handler::UpdatePlayerErrorCB update_player_error_cb;
   update_player_error_cb =
       std::bind(&PlayerWorker::UpdatePlayerError, this, _1, _2);
-  std::string error_message;
   if (handler_->Init(
           player_, std::bind(&PlayerWorker::UpdateMediaInfo, this, _1, _2, _3),
           std::bind(&PlayerWorker::player_state, this),
           std::bind(&PlayerWorker::UpdatePlayerState, this, _1),
-          update_player_error_cb, &error_message)) {
+          update_player_error_cb)) {
     UpdatePlayerState(kSbPlayerStateInitialized);
   } else {
-    UpdatePlayerError(
-        kSbPlayerErrorDecode,
-        "Failed to initialize PlayerWorker with error: " + error_message);
+    UpdatePlayerError(kSbPlayerErrorDecode,
+                      "Failed to initialize PlayerWorker with unknown error.");
   }
 }
 
diff --git a/starboard/shared/starboard/player/player_worker.h b/starboard/shared/starboard/player/player_worker.h
index a1565a7..dac9f8f 100644
--- a/starboard/shared/starboard/player/player_worker.h
+++ b/starboard/shared/starboard/player/player_worker.h
@@ -15,6 +15,7 @@
 #ifndef STARBOARD_SHARED_STARBOARD_PLAYER_PLAYER_WORKER_H_
 #define STARBOARD_SHARED_STARBOARD_PLAYER_PLAYER_WORKER_H_
 
+#include <atomic>
 #include <functional>
 #include <string>
 
@@ -81,8 +82,7 @@
                       UpdateMediaInfoCB update_media_info_cb,
                       GetPlayerStateCB get_player_state_cb,
                       UpdatePlayerStateCB update_player_state_cb,
-                      UpdatePlayerErrorCB update_player_error_cb,
-                      std::string* error_message) = 0;
+                      UpdatePlayerErrorCB update_player_error_cb) = 0;
     virtual bool Seek(SbTime seek_to_time, int ticket) = 0;
     virtual bool WriteSample(const scoped_refptr<InputBuffer>& input_buffer,
                              bool* written) = 0;
@@ -212,7 +212,7 @@
   SbPlayerDecoderStatusFunc decoder_status_func_;
   SbPlayerStatusFunc player_status_func_;
   SbPlayerErrorFunc player_error_func_;
-  bool error_occurred_ = false;
+  std::atomic_bool error_occurred_ = {false};
   SbPlayer player_;
   void* context_;
   int ticket_;
diff --git a/starboard/shared/starboard/player/video_dmp_common.cc b/starboard/shared/starboard/player/video_dmp_common.cc
index d4a65ff..a5440c1 100644
--- a/starboard/shared/starboard/player/video_dmp_common.cc
+++ b/starboard/shared/starboard/player/video_dmp_common.cc
@@ -92,9 +92,7 @@
           SbMediaAudioSampleInfoWithConfig* audio_sample_info) {
   Read(read_cb, reverse_byte_order, &audio_sample_info->codec);
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   audio_sample_info->mime = "";
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
   Read(read_cb, reverse_byte_order, &audio_sample_info->format_tag);
   Read(read_cb, reverse_byte_order, &audio_sample_info->number_of_channels);
@@ -170,10 +168,8 @@
           SbMediaVideoSampleInfoWithOptionalColorMetadata* video_sample_info) {
   Read(read_cb, reverse_byte_order, &video_sample_info->codec);
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
   video_sample_info->mime = "";
   video_sample_info->max_video_capabilities = "";
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
 
   Read(read_cb, reverse_byte_order, &video_sample_info->is_key_frame);
   Read(read_cb, reverse_byte_order, &video_sample_info->frame_width);
diff --git a/starboard/shared/starboard/speech_recognizer/speech_recognizer_cancel.cc b/starboard/shared/starboard/speech_recognizer/speech_recognizer_cancel.cc
index 9b6b925..f87ee9a 100644
--- a/starboard/shared/starboard/speech_recognizer/speech_recognizer_cancel.cc
+++ b/starboard/shared/starboard/speech_recognizer/speech_recognizer_cancel.cc
@@ -14,8 +14,6 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 #include "starboard/common/log.h"
 #include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h"
 
@@ -24,5 +22,3 @@
     recognizer->Cancel();
   }
 }
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/starboard/speech_recognizer/speech_recognizer_create.cc b/starboard/shared/starboard/speech_recognizer/speech_recognizer_create.cc
index 178f58d..217d166 100644
--- a/starboard/shared/starboard/speech_recognizer/speech_recognizer_create.cc
+++ b/starboard/shared/starboard/speech_recognizer/speech_recognizer_create.cc
@@ -18,13 +18,9 @@
 #error Speech Recognizer is deprecated. Implement full Microphone instead.
 #endif
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 #include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h"
 
 SbSpeechRecognizer SbSpeechRecognizerCreate(
     const SbSpeechRecognizerHandler* handler) {
   return SbSpeechRecognizerPrivate::CreateSpeechRecognizer(handler);
 }
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/starboard/speech_recognizer/speech_recognizer_destroy.cc b/starboard/shared/starboard/speech_recognizer/speech_recognizer_destroy.cc
index 2edfb30..a8f3b03 100644
--- a/starboard/shared/starboard/speech_recognizer/speech_recognizer_destroy.cc
+++ b/starboard/shared/starboard/speech_recognizer/speech_recognizer_destroy.cc
@@ -14,8 +14,6 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 #include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h"
 
 void SbSpeechRecognizerDestroy(SbSpeechRecognizer recognizer) {
@@ -23,5 +21,3 @@
     SbSpeechRecognizerPrivate::DestroySpeechRecognizer(recognizer);
   }
 }
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h b/starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h
index e3e3e34..04624fb 100644
--- a/starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h
+++ b/starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h
@@ -18,7 +18,6 @@
 #include "starboard/shared/internal_only.h"
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
 struct SbSpeechRecognizerPrivate {
   virtual ~SbSpeechRecognizerPrivate() {}
   virtual bool Start(const SbSpeechConfiguration* configuration) = 0;
@@ -28,6 +27,5 @@
       const SbSpeechRecognizerHandler* handler);
   static void DestroySpeechRecognizer(SbSpeechRecognizer speech_recognizer);
 };
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
 
 #endif  // STARBOARD_SHARED_STARBOARD_SPEECH_RECOGNIZER_SPEECH_RECOGNIZER_INTERNAL_H_
diff --git a/starboard/shared/starboard/speech_recognizer/speech_recognizer_is_supported.cc b/starboard/shared/starboard/speech_recognizer/speech_recognizer_is_supported.cc
index 03cd6ab..a2f82c1 100644
--- a/starboard/shared/starboard/speech_recognizer/speech_recognizer_is_supported.cc
+++ b/starboard/shared/starboard/speech_recognizer/speech_recognizer_is_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbSpeechRecognizerIsSupported() {
   return true;
 }
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/shared/starboard/speech_recognizer/speech_recognizer_start.cc b/starboard/shared/starboard/speech_recognizer/speech_recognizer_start.cc
index 407d089..7282267 100644
--- a/starboard/shared/starboard/speech_recognizer/speech_recognizer_start.cc
+++ b/starboard/shared/starboard/speech_recognizer/speech_recognizer_start.cc
@@ -14,8 +14,6 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 #include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h"
 
 bool SbSpeechRecognizerStart(SbSpeechRecognizer recognizer,
@@ -24,5 +22,3 @@
              ? recognizer->Start(configuration)
              : false;
 }
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/starboard/speech_recognizer/speech_recognizer_stop.cc b/starboard/shared/starboard/speech_recognizer/speech_recognizer_stop.cc
index 50d5802..f03c234 100644
--- a/starboard/shared/starboard/speech_recognizer/speech_recognizer_stop.cc
+++ b/starboard/shared/starboard/speech_recognizer/speech_recognizer_stop.cc
@@ -14,8 +14,6 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 #include "starboard/common/log.h"
 #include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h"
 
@@ -24,5 +22,3 @@
     recognizer->Stop();
   }
 }
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/starboard/starboard_switches.cc b/starboard/shared/starboard/starboard_switches.cc
new file mode 100644
index 0000000..7da02f4
--- /dev/null
+++ b/starboard/shared/starboard/starboard_switches.cc
@@ -0,0 +1,25 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/starboard/starboard_switches.h"
+
+namespace starboard {
+namespace shared {
+namespace starboard {
+
+const char kStartHandlerAtCrash[] = "start_handler_at_crash";
+
+}  // namespace starboard
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/starboard/starboard_switches.h b/starboard/shared/starboard/starboard_switches.h
new file mode 100644
index 0000000..025e03b
--- /dev/null
+++ b/starboard/shared/starboard/starboard_switches.h
@@ -0,0 +1,33 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_STARBOARD_STARBOARD_SWITCHES_H_
+#define STARBOARD_SHARED_STARBOARD_STARBOARD_SWITCHES_H_
+
+#include "starboard/configuration.h"
+
+namespace starboard {
+namespace shared {
+namespace starboard {
+
+// Start the crash handler only when a crash happens, instead of starting it
+// before the app runs and keeping it running all the time. This option reduces
+// memory consumption by the crash handler.
+extern const char kStartHandlerAtCrash[];
+
+}  // namespace starboard
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_STARBOARD_STARBOARD_SWITCHES_H_
diff --git a/starboard/shared/starboard/thread_local_storage_internal.cc b/starboard/shared/starboard/thread_local_storage_internal.cc
index 50711b4..02a1763 100644
--- a/starboard/shared/starboard/thread_local_storage_internal.cc
+++ b/starboard/shared/starboard/thread_local_storage_internal.cc
@@ -229,12 +229,8 @@
   KeyRecord* record = &data_->key_table_[key->index];
 
   record->destructor = destructor;
-#if SB_API_VERSION >= 12
   memset(record->values.data(), 0,
-              record->values.size() * sizeof(record->values[0]));
-#else   // SB_API_VERSION >= 12
-  memset(record->values, 0, sizeof(record->values));
-#endif  // SB_API_VERSION >= 12
+         record->values.size() * sizeof(record->values[0]));
   record->valid = true;
 
   return key;
diff --git a/starboard/shared/starboard/thread_local_storage_internal.h b/starboard/shared/starboard/thread_local_storage_internal.h
index 4e322f4..ffa225a 100644
--- a/starboard/shared/starboard/thread_local_storage_internal.h
+++ b/starboard/shared/starboard/thread_local_storage_internal.h
@@ -58,11 +58,7 @@
   struct KeyRecord {
     bool valid;
     SbThreadLocalDestructor destructor;
-#if SB_API_VERSION >= 12
     std::vector<void*> values(kMaxThreads);
-#else   // SB_API_VERSION >= 12
-    void* values[kMaxThreads];
-#endif  // SB_API_VERSION >= 12
   };
 
   // Sets up the specified key.
diff --git a/starboard/shared/stub/accessibility_get_caption_settings.cc b/starboard/shared/stub/accessibility_get_caption_settings.cc
index ddabf2e..7975467 100644
--- a/starboard/shared/stub/accessibility_get_caption_settings.cc
+++ b/starboard/shared/stub/accessibility_get_caption_settings.cc
@@ -17,7 +17,6 @@
 #include "starboard/accessibility.h"
 #include "starboard/common/memory.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 bool SbAccessibilityGetCaptionSettings(
     SbAccessibilityCaptionSettings* caption_settings) {
   if (!caption_settings ||
@@ -30,4 +29,3 @@
   // explicitly set states to kSbAccessibilityCaptionStateUnsupported.
   return true;
 }
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
diff --git a/starboard/shared/stub/accessibility_set_captions_enabled.cc b/starboard/shared/stub/accessibility_set_captions_enabled.cc
index 0665fd5..3bd95ba 100644
--- a/starboard/shared/stub/accessibility_set_captions_enabled.cc
+++ b/starboard/shared/stub/accessibility_set_captions_enabled.cc
@@ -15,8 +15,6 @@
 #include "starboard/accessibility.h"
 #include "starboard/configuration.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
 bool SbAccessibilitySetCaptionsEnabled(bool enabled) {
   return false;
 }
-#endif  // SB_API_VERSION >= 12 || SB_HAS(CAPTIONS)
diff --git a/starboard/shared/stub/cryptography_create_transformer.cc b/starboard/shared/stub/cryptography_create_transformer.cc
deleted file mode 100644
index 68ff25b..0000000
--- a/starboard/shared/stub/cryptography_create_transformer.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-SbCryptographyTransformer SbCryptographyCreateTransformer(
-    const char* algorithm,
-    int block_size_bits,
-    SbCryptographyDirection direction,
-    SbCryptographyBlockCipherMode mode,
-    const void* initialization_vector,
-    int initialization_vector_size,
-    const void* key,
-    int key_size) {
-  return kSbCryptographyInvalidTransformer;
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/stub/cryptography_destroy_transformer.cc b/starboard/shared/stub/cryptography_destroy_transformer.cc
deleted file mode 100644
index 497548d..0000000
--- a/starboard/shared/stub/cryptography_destroy_transformer.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-void SbCryptographyDestroyTransformer(SbCryptographyTransformer transformer) {
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/stub/cryptography_get_tag.cc b/starboard/shared/stub/cryptography_get_tag.cc
deleted file mode 100644
index 53f7066..0000000
--- a/starboard/shared/stub/cryptography_get_tag.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-bool SbCryptographyGetTag(
-    SbCryptographyTransformer transformer,
-    void* out_tag,
-    int out_tag_size) {
-  return false;
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/stub/cryptography_set_authenticated_data.cc b/starboard/shared/stub/cryptography_set_authenticated_data.cc
deleted file mode 100644
index c5d2ea2..0000000
--- a/starboard/shared/stub/cryptography_set_authenticated_data.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-bool SbCryptographySetAuthenticatedData(
-    SbCryptographyTransformer transformer,
-    const void* data,
-    int data_size) {
-  return false;
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/stub/cryptography_set_initialization_vector.cc b/starboard/shared/stub/cryptography_set_initialization_vector.cc
deleted file mode 100644
index 8be7f5d..0000000
--- a/starboard/shared/stub/cryptography_set_initialization_vector.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-void SbCryptographySetInitializationVector(
-    SbCryptographyTransformer transformer,
-    const void* initialization_vector,
-    int initialization_vector_size) {
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/stub/cryptography_transform.cc b/starboard/shared/stub/cryptography_transform.cc
deleted file mode 100644
index d600833..0000000
--- a/starboard/shared/stub/cryptography_transform.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-#include "starboard/cryptography.h"
-
-int SbCryptographyTransform(SbCryptographyTransformer transformer,
-                            const void* in_data,
-                            int in_data_size,
-                            void* out_data) {
-  return 0;
-}
-
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/stub/drm_get_metrics.cc b/starboard/shared/stub/drm_get_metrics.cc
index dc11009..ce47bdc 100644
--- a/starboard/shared/stub/drm_get_metrics.cc
+++ b/starboard/shared/stub/drm_get_metrics.cc
@@ -14,8 +14,6 @@
 
 #include "starboard/drm.h"
 
-#if SB_API_VERSION >= 12
-
 const void* SbDrmGetMetrics(SbDrmSystem drm_system, int* size) {
   if (size != NULL) {
     *size = 0;
@@ -23,5 +21,3 @@
 
   return NULL;
 }
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/shared/stub/environment.cc b/starboard/shared/stub/environment.cc
new file mode 100644
index 0000000..9517c65
--- /dev/null
+++ b/starboard/shared/stub/environment.cc
@@ -0,0 +1,23 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/environment.h"
+
+namespace starboard {
+
+std::string GetEnvironment(std::string name) {
+  return "";
+}
+
+}  // namespace starboard
diff --git a/starboard/shared/stub/file_atomic_replace.cc b/starboard/shared/stub/file_atomic_replace.cc
index e365f0f..e7bd7ba 100644
--- a/starboard/shared/stub/file_atomic_replace.cc
+++ b/starboard/shared/stub/file_atomic_replace.cc
@@ -14,12 +14,8 @@
 
 #include "starboard/file.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbFileAtomicReplace(const char* path,
                          const char* data,
                          int64_t data_size) {
   return false;
 }
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/shared/stub/media_is_audio_supported.cc b/starboard/shared/stub/media_is_audio_supported.cc
index 00187ee..d9c70c5 100644
--- a/starboard/shared/stub/media_is_audio_supported.cc
+++ b/starboard/shared/stub/media_is_audio_supported.cc
@@ -17,9 +17,7 @@
 #include "starboard/media.h"
 
 bool SbMediaIsAudioSupported(SbMediaAudioCodec audio_codec,
-#if SB_API_VERSION >= 12
                              const char* content_type,
-#endif  // SB_API_VERSION >= 12
                              int64_t bitrate) {
   return false;
 }
diff --git a/starboard/shared/stub/media_is_output_protected.cc b/starboard/shared/stub/media_is_output_protected.cc
deleted file mode 100644
index 3d117a5..0000000
--- a/starboard/shared/stub/media_is_output_protected.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/media.h"
-
-#include "starboard/common/log.h"
-
-#if SB_API_VERSION < 12
-bool SbMediaIsOutputProtected() {
-  return false;
-}
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/stub/media_is_transfer_characteristics_supported.cc b/starboard/shared/stub/media_is_transfer_characteristics_supported.cc
deleted file mode 100644
index e278733..0000000
--- a/starboard/shared/stub/media_is_transfer_characteristics_supported.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/shared/starboard/media/media_support_internal.h"
-
-#include "starboard/media.h"
-
-#if !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
-bool SbMediaIsTransferCharacteristicsSupported(SbMediaTransferId transfer_id) {
-  return false;
-}
-#endif  // !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
diff --git a/starboard/shared/stub/media_is_video_supported.cc b/starboard/shared/stub/media_is_video_supported.cc
index e7d2f4c..e16ee53 100644
--- a/starboard/shared/stub/media_is_video_supported.cc
+++ b/starboard/shared/stub/media_is_video_supported.cc
@@ -17,17 +17,13 @@
 #include "starboard/media.h"
 
 bool SbMediaIsVideoSupported(SbMediaVideoCodec video_codec,
-#if SB_API_VERSION >= 12
                              const char* content_type,
-#endif  // SB_API_VERSION >= 12
-#if SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
                              int profile,
                              int level,
                              int bit_depth,
                              SbMediaPrimaryId primary_id,
                              SbMediaTransferId transfer_id,
                              SbMediaMatrixId matrix_id,
-#endif  // SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
                              int frame_width,
                              int frame_height,
                              int64_t bitrate,
diff --git a/starboard/shared/stub/media_set_output_protection.cc b/starboard/shared/stub/media_set_output_protection.cc
deleted file mode 100644
index 219237d..0000000
--- a/starboard/shared/stub/media_set_output_protection.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/media.h"
-
-#include "starboard/common/log.h"
-
-#if SB_API_VERSION < 12
-bool SbMediaSetOutputProtection(bool enabled) {
-  return false;
-}
-#endif  // SB_API_VERSION < 12
diff --git a/starboard/shared/stub/microphone_close.cc b/starboard/shared/stub/microphone_close.cc
index df29c84..4371551 100644
--- a/starboard/shared/stub/microphone_close.cc
+++ b/starboard/shared/stub/microphone_close.cc
@@ -14,11 +14,6 @@
 
 #include "starboard/microphone.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 bool SbMicrophoneClose(SbMicrophone microphone) {
   return false;
 }
diff --git a/starboard/shared/stub/microphone_create.cc b/starboard/shared/stub/microphone_create.cc
index 8aeb393..a014a5a 100644
--- a/starboard/shared/stub/microphone_create.cc
+++ b/starboard/shared/stub/microphone_create.cc
@@ -14,11 +14,6 @@
 
 #include "starboard/microphone.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 SbMicrophone SbMicrophoneCreate(SbMicrophoneId id,
                                 int sample_rate_in_hz,
                                 int buffer_size) {
diff --git a/starboard/shared/stub/microphone_destroy.cc b/starboard/shared/stub/microphone_destroy.cc
index 02e415b..6e02a90 100644
--- a/starboard/shared/stub/microphone_destroy.cc
+++ b/starboard/shared/stub/microphone_destroy.cc
@@ -14,9 +14,4 @@
 
 #include "starboard/microphone.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 void SbMicrophoneDestroy(SbMicrophone microphone) {}
diff --git a/starboard/shared/stub/microphone_get_available.cc b/starboard/shared/stub/microphone_get_available.cc
index 0bb634c..f13208d 100644
--- a/starboard/shared/stub/microphone_get_available.cc
+++ b/starboard/shared/stub/microphone_get_available.cc
@@ -14,11 +14,6 @@
 
 #include "starboard/microphone.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 int SbMicrophoneGetAvailable(SbMicrophoneInfo* out_info_array,
                              int info_array_size) {
   return 0;
diff --git a/starboard/shared/stub/microphone_is_sample_rate_supported.cc b/starboard/shared/stub/microphone_is_sample_rate_supported.cc
index 42a6fb9..d6591c2 100644
--- a/starboard/shared/stub/microphone_is_sample_rate_supported.cc
+++ b/starboard/shared/stub/microphone_is_sample_rate_supported.cc
@@ -14,11 +14,6 @@
 
 #include "starboard/microphone.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 bool SbMicrophoneIsSampleRateSupported(SbMicrophoneId id,
                                        int sample_rate_in_hz) {
   return false;
diff --git a/starboard/shared/stub/microphone_open.cc b/starboard/shared/stub/microphone_open.cc
index 12be60e..c01fe6e 100644
--- a/starboard/shared/stub/microphone_open.cc
+++ b/starboard/shared/stub/microphone_open.cc
@@ -14,11 +14,6 @@
 
 #include "starboard/microphone.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 bool SbMicrophoneOpen(SbMicrophone microphone) {
   return false;
 }
diff --git a/starboard/shared/stub/microphone_read.cc b/starboard/shared/stub/microphone_read.cc
index 6d13bf7..0c3636b 100644
--- a/starboard/shared/stub/microphone_read.cc
+++ b/starboard/shared/stub/microphone_read.cc
@@ -14,11 +14,6 @@
 
 #include "starboard/microphone.h"
 
-#if SB_API_VERSION < 12 && !SB_HAS(MICROPHONE)
-#error "SB_HAS_MICROPHONE must be set to build this file before Starboard API \
-version 12."
-#endif
-
 int SbMicrophoneRead(SbMicrophone microphone,
                      void* out_audio_data,
                      int audio_data_size) {
diff --git a/starboard/shared/stub/player_create.cc b/starboard/shared/stub/player_create.cc
index c44975d..1b47f6e 100644
--- a/starboard/shared/stub/player_create.cc
+++ b/starboard/shared/stub/player_create.cc
@@ -16,8 +16,6 @@
 
 #include "starboard/configuration.h"
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 SbPlayer SbPlayerCreate(
     SbWindow window,
     const SbPlayerCreationParam* creation_param,
@@ -29,23 +27,3 @@
     SbDecodeTargetGraphicsContextProvider* context_provider) {
   return kSbPlayerInvalid;
 }
-
-#else  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-SbPlayer SbPlayerCreate(SbWindow window,
-                        SbMediaVideoCodec video_codec,
-                        SbMediaAudioCodec audio_codec,
-                        SbDrmSystem drm_system,
-                        const SbMediaAudioSampleInfo* audio_sample_info,
-                        const char* max_video_capabilities,
-                        SbPlayerDeallocateSampleFunc sample_deallocate_func,
-                        SbPlayerDecoderStatusFunc decoder_status_func,
-                        SbPlayerStatusFunc player_status_func,
-                        SbPlayerErrorFunc player_error_func,
-                        void* context,
-                        SbPlayerOutputMode output_mode,
-                        SbDecodeTargetGraphicsContextProvider* provider) {
-  return kSbPlayerInvalid;
-}
-
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
diff --git a/starboard/shared/stub/player_get_preferred_output_mode.cc b/starboard/shared/stub/player_get_preferred_output_mode.cc
index 8d55e5d..c537892 100644
--- a/starboard/shared/stub/player_get_preferred_output_mode.cc
+++ b/starboard/shared/stub/player_get_preferred_output_mode.cc
@@ -16,11 +16,7 @@
 
 #include "starboard/configuration.h"
 
-#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
 SbPlayerOutputMode SbPlayerGetPreferredOutputMode(
     const SbPlayerCreationParam* creation_param) {
   return kSbPlayerOutputModeInvalid;
 }
-
-#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
diff --git a/starboard/shared/stub/player_output_mode_supported.cc b/starboard/shared/stub/player_output_mode_supported.cc
deleted file mode 100644
index 24e4149..0000000
--- a/starboard/shared/stub/player_output_mode_supported.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "starboard/player.h"
-
-#if !SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
-
-bool SbPlayerOutputModeSupported(SbPlayerOutputMode output_mod /,
-                                 SbMediaVideoCodec codec,
-                                 SbDrmSystem drm_system) {
-  return false;
-}
-
-#endif  // !SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)
diff --git a/starboard/shared/stub/socket_is_ipv6_supported.cc b/starboard/shared/stub/socket_is_ipv6_supported.cc
index 64cac7e..d2e0fe2 100644
--- a/starboard/shared/stub/socket_is_ipv6_supported.cc
+++ b/starboard/shared/stub/socket_is_ipv6_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/socket.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbSocketIsIpv6Supported() {
   return false;
 }
-
-#endif
diff --git a/starboard/shared/stub/speech_recognizer_cancel.cc b/starboard/shared/stub/speech_recognizer_cancel.cc
index 2eb0d24..5176585 100644
--- a/starboard/shared/stub/speech_recognizer_cancel.cc
+++ b/starboard/shared/stub/speech_recognizer_cancel.cc
@@ -14,8 +14,4 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 void SbSpeechRecognizerCancel(SbSpeechRecognizer recognizer) {}
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/stub/speech_recognizer_create.cc b/starboard/shared/stub/speech_recognizer_create.cc
index ef37611..e5b7805 100644
--- a/starboard/shared/stub/speech_recognizer_create.cc
+++ b/starboard/shared/stub/speech_recognizer_create.cc
@@ -14,11 +14,7 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 SbSpeechRecognizer SbSpeechRecognizerCreate(
     const SbSpeechRecognizerHandler* handler) {
   return kSbSpeechRecognizerInvalid;
 }
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/stub/speech_recognizer_destroy.cc b/starboard/shared/stub/speech_recognizer_destroy.cc
index 2bef6a7..1b7339e 100644
--- a/starboard/shared/stub/speech_recognizer_destroy.cc
+++ b/starboard/shared/stub/speech_recognizer_destroy.cc
@@ -14,8 +14,4 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 void SbSpeechRecognizerDestroy(SbSpeechRecognizer recognizer) {}
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/stub/speech_recognizer_is_supported.cc b/starboard/shared/stub/speech_recognizer_is_supported.cc
index 3122b73..c98a6ad 100644
--- a/starboard/shared/stub/speech_recognizer_is_supported.cc
+++ b/starboard/shared/stub/speech_recognizer_is_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbSpeechRecognizerIsSupported() {
   return false;
 }
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/shared/stub/speech_recognizer_start.cc b/starboard/shared/stub/speech_recognizer_start.cc
index 0c0bdf8..16c9b1f 100644
--- a/starboard/shared/stub/speech_recognizer_start.cc
+++ b/starboard/shared/stub/speech_recognizer_start.cc
@@ -14,11 +14,7 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 bool SbSpeechRecognizerStart(SbSpeechRecognizer recognizer,
                              const SbSpeechConfiguration* configuration) {
   return false;
 }
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/stub/speech_recognizer_stop.cc b/starboard/shared/stub/speech_recognizer_stop.cc
index 9d704c3..44ac29e 100644
--- a/starboard/shared/stub/speech_recognizer_stop.cc
+++ b/starboard/shared/stub/speech_recognizer_stop.cc
@@ -14,8 +14,4 @@
 
 #include "starboard/speech_recognizer.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 void SbSpeechRecognizerStop(SbSpeechRecognizer recognizer) {}
-
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
diff --git a/starboard/shared/stub/speech_synthesis_cancel.cc b/starboard/shared/stub/speech_synthesis_cancel.cc
index e640713..9f3808e 100644
--- a/starboard/shared/stub/speech_synthesis_cancel.cc
+++ b/starboard/shared/stub/speech_synthesis_cancel.cc
@@ -14,8 +14,4 @@
 
 #include "starboard/speech_synthesis.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_SYNTHESIS)
-
 void SbSpeechSynthesisCancel() {}
-
-#endif
diff --git a/starboard/shared/stub/speech_synthesis_is_supported.cc b/starboard/shared/stub/speech_synthesis_is_supported.cc
index 8d998a7..16f9fd3 100644
--- a/starboard/shared/stub/speech_synthesis_is_supported.cc
+++ b/starboard/shared/stub/speech_synthesis_is_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/speech_synthesis.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbSpeechSynthesisIsSupported() {
   return false;
 }
-
-#endif
diff --git a/starboard/shared/stub/speech_synthesis_speak.cc b/starboard/shared/stub/speech_synthesis_speak.cc
index 1b5fdde..c0437bd 100644
--- a/starboard/shared/stub/speech_synthesis_speak.cc
+++ b/starboard/shared/stub/speech_synthesis_speak.cc
@@ -14,8 +14,4 @@
 
 #include "starboard/speech_synthesis.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_SYNTHESIS)
-
 void SbSpeechSynthesisSpeak(const char* text) {}
-
-#endif
diff --git a/starboard/shared/stub/thread_create_priority.cc b/starboard/shared/stub/thread_create_priority.cc
index 9266844..8c431a1 100644
--- a/starboard/shared/stub/thread_create_priority.cc
+++ b/starboard/shared/stub/thread_create_priority.cc
@@ -18,13 +18,9 @@
 namespace shared {
 namespace pthread {
 
-#if SB_API_VERSION >= 12
-
 // Default implementation without thread priority support
 void ThreadSetPriority(SbThreadPriority priority) {}
 
-#endif  // SB_API_VERSION >= 12
-
 }  // namespace pthread
 }  // namespace shared
 }  // namespace starboard
diff --git a/starboard/shared/stub/thread_types_public.h b/starboard/shared/stub/thread_types_public.h
deleted file mode 100644
index 2398f4d..0000000
--- a/starboard/shared/stub/thread_types_public.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Includes threading primitive types and initializers.
-
-#ifndef STARBOARD_SHARED_STUB_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_SHARED_STUB_THREAD_TYPES_PUBLIC_H_
-
-// --- SbConditionVariable ---
-
-// Transparent Condition Variable handle.
-typedef void* SbConditionVariable;
-
-// Condition Variable static initializer.
-#define SB_CONDITION_VARIABLE_INITIALIZER NULL
-
-// --- SbMutex ---
-
-// Transparent Mutex handle.
-typedef void* SbMutex;
-
-// Mutex static initializer.
-#define SB_MUTEX_INITIALIZER NULL
-
-// --- SbOnce ---
-
-// Transparent Once control handle.
-typedef void* SbOnceControl;
-
-// Once static initializer.
-#define SB_ONCE_INITIALIZER NULL
-
-// --- SbThread ---
-
-// Transparent pthread handle.
-typedef void* SbThread;
-
-// Well-defined constant value to mean "no thread handle."
-#define kSbThreadInvalid (SbThread)-1
-
-#endif  // STARBOARD_SHARED_STUB_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/shared/stub/time_is_time_thread_now_supported.cc b/starboard/shared/stub/time_is_time_thread_now_supported.cc
index 63e68f7..2342a15 100644
--- a/starboard/shared/stub/time_is_time_thread_now_supported.cc
+++ b/starboard/shared/stub/time_is_time_thread_now_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/time.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbTimeIsTimeThreadNowSupported() {
   return false;
 }
-
-#endif
diff --git a/starboard/shared/stub/ui_nav_get_interface.cc b/starboard/shared/stub/ui_nav_get_interface.cc
index aff9582..0218be2 100644
--- a/starboard/shared/stub/ui_nav_get_interface.cc
+++ b/starboard/shared/stub/ui_nav_get_interface.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/ui_navigation.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbUiNavGetInterface(SbUiNavInterface* out_interface) {
   return false;
 }
-
-#endif  // SB_API_VERSION >= 12
diff --git a/starboard/shared/stub/window_blur_on_screen_keyboard.cc b/starboard/shared/stub/window_blur_on_screen_keyboard.cc
index 3612354..d6ec34c 100644
--- a/starboard/shared/stub/window_blur_on_screen_keyboard.cc
+++ b/starboard/shared/stub/window_blur_on_screen_keyboard.cc
@@ -14,8 +14,4 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 void SbWindowBlurOnScreenKeyboard(SbWindow window, int ticket) {}
-
-#endif
diff --git a/starboard/shared/stub/window_focus_on_screen_keyboard.cc b/starboard/shared/stub/window_focus_on_screen_keyboard.cc
index 81c89fa..95768e5 100644
--- a/starboard/shared/stub/window_focus_on_screen_keyboard.cc
+++ b/starboard/shared/stub/window_focus_on_screen_keyboard.cc
@@ -14,8 +14,4 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket) {}
-
-#endif
diff --git a/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc b/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc
index b6001a5..f79cdc1 100644
--- a/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc
+++ b/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc
@@ -14,11 +14,7 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbWindowGetOnScreenKeyboardBoundingRect(SbWindow window,
                                              SbWindowRect* bounding_rect) {
   return false;
 }
-
-#endif
diff --git a/starboard/shared/stub/window_hide_on_screen_keyboard.cc b/starboard/shared/stub/window_hide_on_screen_keyboard.cc
index 8f8468c..403fc78 100644
--- a/starboard/shared/stub/window_hide_on_screen_keyboard.cc
+++ b/starboard/shared/stub/window_hide_on_screen_keyboard.cc
@@ -14,8 +14,4 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket) {}
-
-#endif
diff --git a/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc b/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc
index 7d7d735..c9900ae 100644
--- a/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc
+++ b/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbWindowIsOnScreenKeyboardShown(SbWindow window) {
   return false;
 }
-
-#endif
diff --git a/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc b/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc
index ab63af8..5388180 100644
--- a/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc
+++ b/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 bool SbWindowOnScreenKeyboardIsSupported() {
   return false;
 }
-
-#endif
diff --git a/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc b/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc
index cd5d491..e18a7c8 100644
--- a/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc
+++ b/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc
@@ -14,9 +14,6 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window) {
   return false;
 }
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc b/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc
index 13afa89..78be96e 100644
--- a/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc
+++ b/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc
@@ -14,8 +14,4 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 void SbWindowSetOnScreenKeyboardKeepFocus(SbWindow window, bool keep_focus) {}
-
-#endif
diff --git a/starboard/shared/stub/window_show_on_screen_keyboard.cc b/starboard/shared/stub/window_show_on_screen_keyboard.cc
index 775aa76..579972f 100644
--- a/starboard/shared/stub/window_show_on_screen_keyboard.cc
+++ b/starboard/shared/stub/window_show_on_screen_keyboard.cc
@@ -14,10 +14,6 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 void SbWindowShowOnScreenKeyboard(SbWindow window,
                                   const char* input_text,
                                   int ticket) {}
-
-#endif
diff --git a/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc b/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc
index 8894e68..96f3ea2 100644
--- a/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc
+++ b/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc
@@ -14,10 +14,7 @@
 
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
 void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window,
                                                const char* suggestions[],
                                                int num_suggestions,
                                                int ticket) {}
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
diff --git a/starboard/shared/test_webapi_extension/BUILD.gn b/starboard/shared/test_webapi_extension/BUILD.gn
new file mode 100644
index 0000000..331ced9
--- /dev/null
+++ b/starboard/shared/test_webapi_extension/BUILD.gn
@@ -0,0 +1,29 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+static_library("cobalt_test_webapi_extension") {
+  # List of all source files and header files needed to support the IDL
+  # definitions.
+  sources = [
+    "my_new_interface.cc",
+    "my_new_interface.h",
+    "webapi_extension.cc",
+  ]
+
+  deps = [
+    "//base",
+    "//cobalt/dom",
+    "//cobalt/script",
+  ]
+}
diff --git a/starboard/shared/test_webapi_extension/test_webapi_extension.gypi b/starboard/shared/test_webapi_extension/test_webapi_extension.gypi
deleted file mode 100644
index 17170cb..0000000
--- a/starboard/shared/test_webapi_extension/test_webapi_extension.gypi
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file can be included from a platform's gyp_configuration.gypi file to
-# setup the test custom webapi_extension defined in this directory to be
-# injected into that platform.
-{
-  'variables': {
-    'cobalt_webapi_extension_source_idl_files': [
-      'my_new_interface.idl'
-    ],
-    'cobalt_webapi_extension_generated_header_idl_files': [
-      'my_new_enum.idl'
-    ],
-    'cobalt_webapi_extension_gyp_target':
-      '<(DEPTH)/starboard/shared/test_webapi_extension/webapi_extension.gyp:cobalt_test_webapi_extension',
-  },
-}
\ No newline at end of file
diff --git a/starboard/shared/test_webapi_extension/webapi_extension.cc b/starboard/shared/test_webapi_extension/webapi_extension.cc
index b0151d5..23791dd 100644
--- a/starboard/shared/test_webapi_extension/webapi_extension.cc
+++ b/starboard/shared/test_webapi_extension/webapi_extension.cc
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "cobalt/browser/webapi_extension.h"
-
 #include "base/compiler_specific.h"
 #include "cobalt/script/global_environment.h"
 #include "starboard/shared/test_webapi_extension/my_new_interface.h"
diff --git a/starboard/shared/test_webapi_extension/webapi_extension.gyp b/starboard/shared/test_webapi_extension/webapi_extension.gyp
deleted file mode 100644
index 851fe66..0000000
--- a/starboard/shared/test_webapi_extension/webapi_extension.gyp
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'targets': [
-    {
-      'target_name': 'cobalt_test_webapi_extension',
-      'type': 'static_library',
-
-      # List of all source files and header files needed to support the IDL
-      # definitions.
-      'sources': [
-        'my_new_interface.h',
-        'my_new_interface.cc',
-        'webapi_extension.cc',
-      ],
-
-      'dependencies': [
-        '<(DEPTH)/cobalt/dom/dom.gyp:dom',
-        '<(DEPTH)/cobalt/script/script.gyp:script',
-        '<(DEPTH)/base/base.gyp:base',
-      ],
-    },
-  ],
-}
diff --git a/starboard/shared/widevine/drm_system_widevine.cc b/starboard/shared/widevine/drm_system_widevine.cc
index 03bd477..59292ef 100644
--- a/starboard/shared/widevine/drm_system_widevine.cc
+++ b/starboard/shared/widevine/drm_system_widevine.cc
@@ -435,12 +435,9 @@
   input.iv = initialization_vector.data();
   input.iv_length = static_cast<uint32_t>(initialization_vector.size());
   input.is_video = (buffer->sample_type() == kSbMediaTypeVideo);
-
-#if SB_API_VERSION >= 12
   input.pattern.encrypted_blocks =
       drm_info->encryption_pattern.crypt_byte_block;
   input.pattern.clear_blocks = drm_info->encryption_pattern.skip_byte_block;
-#endif  // SB_API_VERSION >= 12
 
   std::vector<uint8_t> output_data(buffer->size());
   wv3cdm::OutputBuffer output;
@@ -482,13 +479,11 @@
     if (subsample.encrypted_byte_count) {
       input.last_subsample = i + 1 == buffer->drm_info()->subsample_count;
       input.encryption_scheme = wv3cdm::EncryptionScheme::kAesCtr;
-#if SB_API_VERSION >= 12
       if (drm_info->encryption_scheme == kSbDrmEncryptionSchemeAesCbc) {
         input.encryption_scheme = wv3cdm::EncryptionScheme::kAesCbc;
       } else {
         SB_DCHECK(drm_info->encryption_scheme == kSbDrmEncryptionSchemeAesCtr);
       }
-#endif  // SB_API_VERSION >= 12
       input.data_length = subsample.encrypted_byte_count;
 
       wv3cdm::Status status = cdm_->decrypt(input, output);
@@ -591,8 +586,7 @@
     SB_DLOG(ERROR) << "GenerateKeyRequest status " << status;
     const char* session_id =
         SbDrmTicketIsValid(ticket) ? NULL : kFirstSbDrmSessionId;
-    int session_id_size =
-        session_id ? static_cast<int>(strlen(session_id)) : 0;
+    int session_id_size = session_id ? static_cast<int>(strlen(session_id)) : 0;
     session_update_request_callback_(
         this, context_, ticket, CdmStatusToSbDrmStatus(status),
         kSbDrmSessionRequestTypeLicenseRequest, "", session_id, session_id_size,
@@ -652,7 +646,7 @@
     SbDrmKeyId sb_key_id;
     SB_DCHECK(key_status.first.size() <= sizeof(sb_key_id.identifier));
     memcpy(sb_key_id.identifier, key_status.first.c_str(),
-                 key_status.first.size());
+           key_status.first.size());
     sb_key_id.identifier_size = static_cast<int>(key_status.first.size());
     sb_key_ids.push_back(sb_key_id);
     sb_key_statuses.push_back(CdmKeyStatusToSbDrmKeyStatus(key_status.second));
diff --git a/starboard/shared/widevine/widevine3.gyp b/starboard/shared/widevine/widevine3.gyp
deleted file mode 100644
index 8285e85..0000000
--- a/starboard/shared/widevine/widevine3.gyp
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    # sets defaults for variables expected by cdm.gyp.
-    '<(DEPTH)/third_party/ce_cdm/platforms/x86-64/settings.gypi',
-    # cdm.gyp defines widevine_ce_cdm_static.
-    '<(DEPTH)/third_party/ce_cdm/cdm/cdm.gyp',
-  ],
-  'variables': {
-    'oemcrypto_target': 'oemcrypto',
-    'optimize_target_for_speed': 1,
-
-    # Use the protoc supplied in src/tools as precompiled executable.
-    'protoc_dir': '<(DEPTH)/tools',
-    'protoc_bin': '<(DEPTH)/tools/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
-    'protoc': '<(DEPTH)/tools/protoc.exe',
-
-    # Use the chromium target for protobuf.
-    'protobuf_lib_type': 'target',
-    'protobuf_lib': '<(DEPTH)/third_party/protobuf/protobuf.gyp:protobuf_lite',
-
-    'platform_oem_sources': [
-      '<(DEPTH)/starboard/keyboxes/<(sb_widevine_platform)/<(sb_widevine_platform).h',
-      '<(DEPTH)/starboard/keyboxes/<(sb_widevine_platform)/<(sb_widevine_platform)_client.c',
-      '<(DEPTH)/starboard/shared/widevine/internal/wv_keybox.cc',
-      '<(DEPTH)/starboard/shared/widevine/widevine_keybox_hash.cc',
-    ],
-   },
-  'target_defaults': {
-    'include_dirs': [
-      # Get protobuf headers from the chromium tree.
-      '<(DEPTH)/third_party/protobuf/src',
-    ],
-    'dependencies': [
-      '<(DEPTH)/third_party/boringssl/boringssl.gyp:crypto',
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'oemcrypto',
-      'type': 'static_library',
-      'defines': [
-        'COBALT_WIDEVINE_KEYBOX_TRANSFORM_FUNCTION=<(sb_widevine_platform)_client',
-        'COBALT_WIDEVINE_KEYBOX_TRANSFORM_INCLUDE="starboard/keyboxes/<(sb_widevine_platform)/<(sb_widevine_platform).h"',
-        'COBALT_WIDEVINE_KEYBOX_INCLUDE="<(DEPTH)/starboard/keyboxes/<(sb_widevine_platform)_widevine_keybox.h"',
-      ],
-      'sources': [
-        '<@(platform_oem_sources)',
-      ],
-      'variables': {
-        'oec_mock_dir': '<(DEPTH)/third_party/ce_cdm/oemcrypto/mock',
-      },
-      'dependencies': [
-        '<(DEPTH)/third_party/ce_cdm/oemcrypto/mock/oec_mock.gyp:oec_mock',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(DEPTH)/third_party/ce_cdm/core/include',
-          '<(DEPTH)/third_party/ce_cdm/oemcrypto/include',
-        ],
-      },
-    },
-  ],
-}
diff --git a/starboard/linux/x64x11/sbversion/__init__.py b/starboard/shared/win32/__init__.py
similarity index 100%
copy from starboard/linux/x64x11/sbversion/__init__.py
copy to starboard/shared/win32/__init__.py
diff --git a/starboard/shared/win32/adapter_utils.cc b/starboard/shared/win32/adapter_utils.cc
new file mode 100644
index 0000000..6b8ea24
--- /dev/null
+++ b/starboard/shared/win32/adapter_utils.cc
@@ -0,0 +1,87 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/adapter_utils.h"
+
+#include <winsock2.h>
+
+#include <iphlpapi.h>
+
+#include <memory>
+
+#include "starboard/common/log.h"
+#include "starboard/common/socket.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace {
+const ULONG kDefaultAdapterInfoBufferSizeInBytes = 16 * 1024;
+}  // namespace
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+bool GetAdapters(const SbSocketAddressType address_type,
+                 std::unique_ptr<char[]>* adapter_info) {
+  SB_DCHECK(adapter_info);
+
+  ULONG family = 0;
+  int address_length_bytes = 0;
+
+  switch (address_type) {
+    case kSbSocketAddressTypeIpv4:
+      family = AF_INET;
+      address_length_bytes = kAddressLengthIpv4;
+      break;
+    case kSbSocketAddressTypeIpv6:
+      family = AF_INET6;
+      address_length_bytes = kAddressLengthIpv6;
+      break;
+    default:
+      SB_NOTREACHED() << "Invalid address type: " << address_type;
+      return false;
+  }
+
+  ULONG adapter_addresses_number_bytes = kDefaultAdapterInfoBufferSizeInBytes;
+
+  for (int try_count = 0; try_count != 2; ++try_count) {
+    // Using auto for return value here, since different versions of windows use
+    // slightly different datatypes.  These differences do not matter to us, but
+    // the compiler might warn on them.
+    adapter_info->reset(new char[adapter_addresses_number_bytes]);
+    PIP_ADAPTER_ADDRESSES adapter_addresses =
+        reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info->get());
+
+    // Note: If |GetAdapterAddresses| deems that buffer supplied is not enough,
+    // it will return the recommended number of bytes in
+    // |adapter_addresses_number_bytes|.
+    auto retval = GetAdaptersAddresses(
+        family, GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_DNS_SERVER, nullptr,
+        adapter_addresses, &adapter_addresses_number_bytes);
+
+    if (retval == ERROR_SUCCESS) {
+      return true;
+    }
+    if (retval != ERROR_BUFFER_OVERFLOW) {
+      // Only retry with more memory if the error says so.
+      break;
+    }
+    SB_LOG(ERROR) << "GetAdapterAddresses() failed with error code " << retval;
+  }
+  return false;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/adapter_utils.h b/starboard/shared/win32/adapter_utils.h
new file mode 100644
index 0000000..831fb86
--- /dev/null
+++ b/starboard/shared/win32/adapter_utils.h
@@ -0,0 +1,52 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_ADAPTER_UTILS_H_
+#define STARBOARD_SHARED_WIN32_ADAPTER_UTILS_H_
+
+#include <winsock2.h>
+
+#include <ifdef.h>
+#include <iphlpapi.h>
+
+#include <memory>
+
+#include "starboard/common/socket.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// Returns all of the results for wi32's
+bool GetAdapters(const SbSocketAddressType address_type,
+                 std::unique_ptr<char[]>* adapter_info);
+
+// Returns true if a IP_ADAPTER_ADDRESSES IfType is a
+// non-loopback Ethernet interface.
+inline bool IsIfTypeEthernet(DWORD iftype) {
+  switch (iftype) {
+    case IF_TYPE_ETHERNET_CSMACD:
+    case IF_TYPE_IEEE80211:
+      return true;
+    case IF_TYPE_SOFTWARE_LOOPBACK:
+    default:
+      return false;
+  }
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_ADAPTER_UTILS_H_
diff --git a/starboard/shared/win32/application_win32.cc b/starboard/shared/win32/application_win32.cc
new file mode 100644
index 0000000..4290730
--- /dev/null
+++ b/starboard/shared/win32/application_win32.cc
@@ -0,0 +1,341 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/application_win32.h"
+
+#include <windows.h>   // NOLINT(build/include_order)
+#include <windowsx.h>  // NOLINT(build/include_order)
+
+#include <cstdio>
+#include <string>
+
+#include "starboard/input.h"
+#include "starboard/key.h"
+#include "starboard/shared/starboard/application.h"
+#include "starboard/shared/win32/dialog.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/minidump.h"
+#include "starboard/shared/win32/thread_private.h"
+#include "starboard/shared/win32/wchar_utils.h"
+#include "starboard/shared/win32/window_internal.h"
+#include "starboard/system.h"
+
+using starboard::shared::starboard::Application;
+using starboard::shared::starboard::CommandLine;
+using starboard::shared::win32::ApplicationWin32;
+using starboard::shared::win32::CStringToWString;
+using starboard::shared::win32::DebugLogWinError;
+
+namespace {
+
+static const int kSbMouseDeviceId = 1;
+
+static const TCHAR kWindowClassName[] = L"window_class_name";
+const char kMiniDumpFilePath[] = "mini_dump_file_path";
+
+LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM w_param, LPARAM l_param) {
+  return ApplicationWin32::Get()->WindowProcess(hWnd, msg, w_param, l_param);
+}
+
+bool RegisterWindowClass() {
+  WNDCLASSEX window_class;
+  window_class.cbSize = sizeof(WNDCLASSEX);
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx
+  window_class.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
+  window_class.lpfnWndProc = WndProc;
+  window_class.cbClsExtra = 0;
+  window_class.cbWndExtra = 0;
+  window_class.hInstance = GetModuleHandle(nullptr);
+  // TODO: Add YouTube icon.
+  window_class.hIcon = LoadIcon(window_class.hInstance, IDI_APPLICATION);
+  window_class.hIconSm = LoadIcon(window_class.hInstance, IDI_APPLICATION);
+  window_class.hCursor = LoadCursor(NULL, IDC_ARROW);
+  window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
+  window_class.lpszMenuName = NULL;
+  window_class.lpszClassName = kWindowClassName;
+
+  if (!::RegisterClassEx(&window_class)) {
+    SB_LOG(ERROR) << "Failed to register window";
+    DebugLogWinError();
+    return false;
+  }
+  return true;
+}
+
+// Create a Windows window.
+HWND CreateWindowInstance(const SbWindowOptions& options) {
+  DWORD dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_CLIPSIBLINGS |
+                  WS_CLIPCHILDREN | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
+  if (options.windowed) {
+    dwStyle |= WS_MAXIMIZE;
+  }
+  const std::wstring wide_window_name = CStringToWString(options.name);
+  const HWND window = CreateWindow(
+      kWindowClassName, wide_window_name.c_str(), dwStyle, CW_USEDEFAULT,
+      CW_USEDEFAULT, options.size.width, options.size.height, nullptr, nullptr,
+      GetModuleHandle(nullptr), nullptr);
+  SetForegroundWindow(window);
+  if (window == nullptr) {
+    SB_LOG(ERROR) << "Failed to create window.";
+    DebugLogWinError();
+  }
+
+  return window;
+}
+
+void AttachMiniDumpHandler(const CommandLine& cmd_line) {
+  std::string file_path;
+  if (cmd_line.HasSwitch(kMiniDumpFilePath)) {
+    // If there is a mini dump file path then use that.
+    file_path = cmd_line.GetSwitchValue(kMiniDumpFilePath);
+  } else {
+    // Otherwise use the file path and append ".dmp" to it.
+    const auto& args = cmd_line.argv();
+    if (!args.empty()) {
+      file_path = args[0];
+      file_path.append(".dmp");
+    }
+  }
+
+  if (!file_path.empty()) {
+    starboard::shared::win32::InitMiniDumpHandler(file_path.c_str());
+  }
+}
+
+}  // namespace
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+ApplicationWin32::ApplicationWin32()
+    : localized_strings_(SbSystemGetLocaleId()) {}
+ApplicationWin32::~ApplicationWin32() {}
+
+SbWindow ApplicationWin32::CreateWindowForWin32(
+    const SbWindowOptions* options) {
+  if (SbWindowIsValid(window_.get())) {
+    SB_LOG(WARNING) << "Returning existing window instance.";
+    return window_.get();
+  }
+
+  RegisterWindowClass();
+  HWND window;
+  if (options) {
+    window = CreateWindowInstance(*options);
+    window_.reset(new SbWindowPrivate(options, window));
+  } else {
+    SbWindowOptions default_options;
+    SbWindowSetDefaultOptions(&default_options);
+    window = CreateWindowInstance(default_options);
+    window_.reset(new SbWindowPrivate(&default_options, window));
+  }
+  ShowWindow(window, SW_SHOW);
+  UpdateWindow(window);
+  return window_.get();
+}
+
+bool ApplicationWin32::DestroyWindow(SbWindow window) {
+  if (!SbWindowIsValid(window) || window != window_.get()) {
+    return false;
+  }
+
+  HWND window_handle = window_->GetWindowHandle();
+  window_.reset();
+
+  if (!::DestroyWindow(window_handle)) {
+    SB_LOG(WARNING) << "Unable to destroy window";
+  }
+
+  if (!::UnregisterClass(kWindowClassName, NULL)) {
+    SB_LOG(ERROR) << "Failed to unregister window class.";
+    DebugLogWinError();
+  }
+
+  return true;
+}
+
+bool ApplicationWin32::OnSbSystemRaisePlatformError(
+    SbSystemPlatformErrorType type,
+    SbSystemPlatformErrorCallback callback,
+    void* user_data) {
+  // This was never being deleted, but it should be.
+  if (type != kSbSystemPlatformErrorTypeConnectionError)
+    SB_NOTREACHED();
+
+  ApplicationWin32* app = ApplicationWin32::Get();
+  const bool created_dialog = ShowOkCancelDialog(
+      app->GetCoreWindow()->GetWindowHandle(),
+      "",  // No title.
+      app->GetLocalizedString("UNABLE_TO_CONTACT_YOUTUBE_1",
+                              "Sorry, could not connect to YouTube."),
+      app->GetLocalizedString("RETRY_BUTTON", "Retry"),
+      [this, callback, user_data]() {
+        callback(kSbSystemPlatformErrorResponsePositive, user_data);
+      },
+      app->GetLocalizedString("EXIT_BUTTON", "Exit"),
+      [this, callback, user_data]() {
+        callback(kSbSystemPlatformErrorResponseNegative, user_data);
+      });
+  SB_DCHECK(!created_dialog);
+  if (!created_dialog) {
+    SB_LOG(ERROR) << "Failed to create dialog!";
+  }
+  return true;
+}
+
+Application::Event* ApplicationWin32::WaitForSystemEventWithTimeout(
+    SbTime time) {
+  ProcessNextSystemMessage();
+  if (pending_event_) {
+    Event* out = pending_event_;
+    pending_event_ = nullptr;
+    return out;
+  }
+
+  ScopedLock lock(stop_waiting_for_system_events_mutex_);
+  if (time <= SbTimeGetMonotonicNow() || stop_waiting_for_system_events_) {
+    stop_waiting_for_system_events_ = false;
+    return nullptr;
+  }
+
+  return WaitForSystemEventWithTimeout(time);
+}
+
+LRESULT ApplicationWin32::WindowProcess(HWND hWnd,
+                                        UINT msg,
+                                        WPARAM w_param,
+                                        LPARAM l_param) {
+  switch (msg) {
+    // Input message handling.
+    case WM_MBUTTONDOWN:
+    case WM_LBUTTONDOWN:
+    case WM_RBUTTONDOWN:
+    case WM_MBUTTONUP:
+    case WM_LBUTTONUP:
+    case WM_RBUTTONUP:
+    case WM_MOUSEMOVE:
+    case WM_MOUSEWHEEL:
+      pending_event_ =
+          ProcessWinMouseEvent(GetCoreWindow(), msg, w_param, l_param);
+      break;
+    case WM_KEYDOWN:
+    case WM_SYSKEYDOWN:
+    case WM_KEYUP:
+    case WM_SYSKEYUP:
+      pending_event_ =
+          ProcessWinKeyEvent(GetCoreWindow(), msg, w_param, l_param);
+      break;
+    case WM_DESTROY:
+      if (window_.get()) {
+        // Freeze the application first so we can do some cleanup before the
+        // window is destroyed (e.g. stopping rasterization).
+        DispatchAndDelete(new Event(kSbEventTypeFreeze, NULL, NULL));
+        PostQuitMessage(0);
+      }
+      break;
+    default:
+      return DefWindowProcW(hWnd, msg, w_param, l_param);
+  }
+  return 0;
+}
+
+int ApplicationWin32::Run(int argc, char** argv) {
+  CommandLine cmd_line(argc, argv);
+  AttachMiniDumpHandler(cmd_line);
+  int return_val = Application::Run(argc, argv);
+  return return_val;
+}
+
+void ApplicationWin32::ProcessNextSystemMessage() {
+  MSG msg;
+  BOOL peek_message_return = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
+  if (peek_message_return == 0) {  // 0 indicates no messages available.
+    return;
+  }
+
+  if (!DialogHandleMessage(&msg)) {
+    TranslateMessage(&msg);
+    DispatchMessage(&msg);
+  }
+  if (msg.message == WM_QUIT) {
+    SB_LOG(INFO) << "Received Quit message; stopping application";
+    SbSystemRequestStop(msg.wParam);
+  }
+}
+
+Application::Event* ApplicationWin32::ProcessWinMouseEvent(SbWindow window,
+                                                           UINT msg,
+                                                           WPARAM w_param,
+                                                           LPARAM l_param) {
+  SbInputData* data = new SbInputData();
+  memset(data, 0, sizeof(*data));
+
+  data->window = window;
+  data->device_type = kSbInputDeviceTypeMouse;
+  data->device_id = kSbMouseDeviceId;
+  switch (msg) {
+    case WM_LBUTTONDOWN:
+      data->key = kSbKeyMouse1;
+      data->type = kSbInputEventTypePress;
+      break;
+    case WM_RBUTTONDOWN:
+      data->key = kSbKeyMouse2;
+      data->type = kSbInputEventTypePress;
+      break;
+    case WM_MBUTTONDOWN:
+      data->key = kSbKeyMouse3;
+      data->type = kSbInputEventTypePress;
+      break;
+    case WM_LBUTTONUP:
+      data->key = kSbKeyMouse1;
+      data->type = kSbInputEventTypeUnpress;
+      break;
+    case WM_RBUTTONUP:
+      data->key = kSbKeyMouse2;
+      data->type = kSbInputEventTypeUnpress;
+      break;
+    case WM_MBUTTONUP:
+      data->key = kSbKeyMouse3;
+      data->type = kSbInputEventTypeUnpress;
+      break;
+    case WM_MOUSEMOVE:
+      data->type = kSbInputEventTypeMove;
+      break;
+    case WM_MOUSEWHEEL: {
+      data->type = kSbInputEventTypeWheel;
+      int wheel_delta = GET_WHEEL_DELTA_WPARAM(w_param);
+      // Per MSFT, standard mouse wheel increments are multiples of 120. For
+      // smooth scrolling, this may be less.
+      // https://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx
+      data->delta.y = wheel_delta / 120.0f;
+    } break;
+    default:
+      SB_LOG(WARNING) << "Received unrecognized MSG code " << msg;
+      return nullptr;
+  }
+
+  data->pressure = NAN;
+  data->size = {NAN, NAN};
+  data->tilt = {NAN, NAN};
+  data->position.x = GET_X_LPARAM(l_param);
+  data->position.y = GET_Y_LPARAM(l_param);
+
+  return new Application::Event(kSbEventTypeInput, data,
+                                &Application::DeleteDestructor<SbInputData>);
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/application_win32.h b/starboard/shared/win32/application_win32.h
new file mode 100644
index 0000000..380c9f0
--- /dev/null
+++ b/starboard/shared/win32/application_win32.h
@@ -0,0 +1,137 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_APPLICATION_WIN32_H_
+#define STARBOARD_SHARED_WIN32_APPLICATION_WIN32_H_
+
+// Windows headers.
+#include <windows.h>
+
+#include <memory>
+#include <string>
+#include <unordered_map>
+
+#include "starboard/common/mutex.h"
+#include "starboard/shared/starboard/application.h"
+#include "starboard/shared/starboard/localized_strings.h"
+#include "starboard/shared/starboard/queue_application.h"
+#include "starboard/shared/win32/window_internal.h"
+#include "starboard/system.h"
+#include "starboard/window.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+class ApplicationWin32 : public starboard::QueueApplication {
+ public:
+  ApplicationWin32();
+  ~ApplicationWin32() override;
+
+  static ApplicationWin32* Get() {
+    return static_cast<ApplicationWin32*>(
+        ::starboard::shared::starboard::Application::Get());
+  }
+
+  SbWindow CreateWindowForWin32(const SbWindowOptions* options);
+
+  bool DestroyWindow(SbWindow window);
+
+#if SB_API_VERSION >= 13
+  void DispatchStart(SbTimeMonotonic timestamp) {
+    shared::starboard::Application::DispatchStart(timestamp);
+  }
+#else  // SB_API_VERSION >= 13
+void DispatchStart() {
+    shared::starboard::Application::DispatchStart();
+  }
+#endif  // SB_API_VERSION >= 13
+
+  SbWindow GetCoreWindow() {
+    return SbWindowIsValid(window_.get()) ? window_.get() : kSbWindowInvalid;
+  }
+
+  bool OnSbSystemRaisePlatformError(SbSystemPlatformErrorType type,
+                                    SbSystemPlatformErrorCallback callback,
+                                    void* user_data);
+
+  std::string GetLocalizedString(const char* id, const char* fallback) const {
+    return localized_strings_.GetString(id, fallback);
+  }
+
+  // Returns true if it is valid to poll/query for system events.
+  bool MayHaveSystemEvents() override { return true; }
+
+  // Waits for an event until the timeout |time| runs out.  If an event occurs
+  // in this time, it is returned, otherwise NULL is returned. If |time| is zero
+  // or negative, then this should function effectively like a no-wait poll.
+  Event* WaitForSystemEventWithTimeout(SbTime time) override;
+
+  // Wakes up any thread waiting within a call to
+  // WaitForSystemEventWithTimeout().
+  void WakeSystemEventWait() override {
+    ScopedLock lock(stop_waiting_for_system_events_mutex_);
+    stop_waiting_for_system_events_ = true;
+  }
+
+  LRESULT WindowProcess(HWND hWnd, UINT msg, WPARAM w_param, LPARAM l_param);
+  VOID TimedEventCallback(PVOID lp, BOOLEAN timer_or_wait_fired);
+
+  // Non-virtual override. Calls into super class Run().
+  int Run(int argc, char** argv);
+
+ private:
+  // --- Application overrides ---
+  bool IsStartImmediate() override { return true; }
+  void Initialize() override {}
+  void Teardown() override {}
+
+  void ProcessNextSystemMessage();
+  SbTimeMonotonic GetNextTimedEventTargetTime() override {
+    return SbTimeGetMonotonicNow();
+  }
+
+  // Processes window key events, returning a corresponding Event instance.
+  // This transfers ownership of the returned Event.
+  Event* ProcessWinKeyEvent(SbWindow window,
+                            UINT msg,
+                            WPARAM w_param,
+                            LPARAM l_param);
+
+  // Processes window mouse events, returning a corresponding Event instance.
+  // This transfers ownership of the returned Event. The Event may be nullptr.
+  Event* ProcessWinMouseEvent(SbWindow window,
+                              UINT msg,
+                              WPARAM w_param,
+                              LPARAM l_param);
+
+  Event* pending_event_ = nullptr;
+
+  // The single open window, if any.
+  std::unique_ptr<SbWindowPrivate> window_;
+
+  starboard::LocalizedStrings localized_strings_;
+
+  Mutex stop_waiting_for_system_events_mutex_;
+  bool stop_waiting_for_system_events_;
+
+  // The current depressed SbKeyModifiers - if there are any.
+  unsigned int current_key_modifiers_ = 0;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_APPLICATION_WIN32_H_
diff --git a/starboard/shared/win32/application_win32_key_event.cc b/starboard/shared/win32/application_win32_key_event.cc
new file mode 100644
index 0000000..8fd18e3
--- /dev/null
+++ b/starboard/shared/win32/application_win32_key_event.cc
@@ -0,0 +1,249 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/application_win32.h"
+
+#include <windows.h>
+
+#include "starboard/event.h"
+#include "starboard/input.h"
+#include "starboard/key.h"
+#include "starboard/shared/starboard/application.h"
+
+using starboard::shared::starboard::Application;
+
+namespace {
+
+const int kSbKeyboardDeviceId = 1;
+
+SbKey VirtualKeyCodeToSbKey(WPARAM virtual_key_code) {
+  // Keyboard code reference:
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
+  switch (virtual_key_code) {
+    case VK_CANCEL: return kSbKeyCancel;
+    case VK_BACK: return kSbKeyBack;
+    case VK_TAB: return kSbKeyTab;
+    case VK_CLEAR: return kSbKeyClear;
+    case VK_RETURN: return kSbKeyReturn;
+    case VK_SHIFT: return kSbKeyShift;
+    case VK_CONTROL: return kSbKeyControl;
+    case VK_MENU: return kSbKeyMenu;
+    case VK_PAUSE: return kSbKeyPause;
+    case VK_CAPITAL: return kSbKeyCapital;
+    // Hangul and Kana have the same VirtualKey constant
+    case VK_KANA: return kSbKeyKana;
+    case VK_JUNJA: return kSbKeyJunja;
+    case VK_FINAL: return kSbKeyFinal;
+    // Hanja and Kanji have the same VirtualKey constant
+    case VK_HANJA: return kSbKeyHanja;
+    case VK_ESCAPE: return kSbKeyEscape;
+    case VK_CONVERT: return kSbKeyConvert;
+    case VK_NONCONVERT: return kSbKeyNonconvert;
+    case VK_ACCEPT: return kSbKeyAccept;
+    case VK_MODECHANGE: return kSbKeyModechange;
+    case VK_SPACE: return kSbKeySpace;
+    case VK_PRIOR: return kSbKeyPrior;
+    case VK_NEXT: return kSbKeyNext;
+    case VK_END: return kSbKeyEnd;
+    case VK_HOME: return kSbKeyHome;
+    case VK_LEFT: return kSbKeyLeft;
+    case VK_UP: return kSbKeyUp;
+    case VK_RIGHT: return kSbKeyRight;
+    case VK_DOWN: return kSbKeyDown;
+    case VK_SELECT: return kSbKeySelect;
+    case VK_PRINT: return kSbKeyPrint;
+    case VK_EXECUTE: return kSbKeyExecute;
+    case VK_SNAPSHOT: return kSbKeySnapshot;
+    case VK_INSERT: return kSbKeyInsert;
+    case VK_DELETE: return kSbKeyDelete;
+    case VK_OEM_PERIOD: return kSbKeyOemPeriod;
+    case 0x30: return kSbKey0;
+    case 0x31: return kSbKey1;
+    case 0x32: return kSbKey2;
+    case 0x33: return kSbKey3;
+    case 0x34: return kSbKey4;
+    case 0x35: return kSbKey5;
+    case 0x36: return kSbKey6;
+    case 0x37: return kSbKey7;
+    case 0x38: return kSbKey8;
+    case 0x39: return kSbKey9;
+    case 0x41: return kSbKeyA;
+    case 0x42: return kSbKeyB;
+    case 0x43: return kSbKeyC;
+    case 0x44: return kSbKeyD;
+    case 0x45: return kSbKeyE;
+    case 0x46: return kSbKeyF;
+    case 0x47: return kSbKeyG;
+    case 0x48: return kSbKeyH;
+    case 0x49: return kSbKeyI;
+    case 0x4A: return kSbKeyJ;
+    case 0x4B: return kSbKeyK;
+    case 0x4C: return kSbKeyL;
+    case 0x4D: return kSbKeyM;
+    case 0x4E: return kSbKeyN;
+    case 0x4F: return kSbKeyO;
+    case 0x50: return kSbKeyP;
+    case 0x51: return kSbKeyQ;
+    case 0x52: return kSbKeyR;
+    case 0x53: return kSbKeyS;
+    case 0x54: return kSbKeyT;
+    case 0x55: return kSbKeyU;
+    case 0x56: return kSbKeyV;
+    case 0x57: return kSbKeyW;
+    case 0x58: return kSbKeyX;
+    case 0x59: return kSbKeyY;
+    case 0x5A: return kSbKeyZ;
+    case VK_LWIN: return kSbKeyLwin;
+    case VK_RWIN: return kSbKeyRwin;
+    case VK_APPS: return kSbKeyApps;
+    case VK_SLEEP: return kSbKeySleep;
+    case VK_NUMPAD0: return kSbKeyNumpad0;
+    case VK_NUMPAD1: return kSbKeyNumpad1;
+    case VK_NUMPAD2: return kSbKeyNumpad2;
+    case VK_NUMPAD3: return kSbKeyNumpad3;
+    case VK_NUMPAD4: return kSbKeyNumpad4;
+    case VK_NUMPAD5: return kSbKeyNumpad5;
+    case VK_NUMPAD6: return kSbKeyNumpad6;
+    case VK_NUMPAD7: return kSbKeyNumpad7;
+    case VK_NUMPAD8: return kSbKeyNumpad8;
+    case VK_NUMPAD9: return kSbKeyNumpad9;
+    case VK_MULTIPLY: return kSbKeyMultiply;
+    case VK_ADD: return kSbKeyAdd;
+    case VK_SEPARATOR: return kSbKeySeparator;
+    case VK_SUBTRACT: return kSbKeySubtract;
+    case VK_DECIMAL: return kSbKeyDecimal;
+    case VK_DIVIDE: return kSbKeyDivide;
+    case VK_F1: return kSbKeyF1;
+    case VK_F2: return kSbKeyF2;
+    case VK_F3: return kSbKeyF3;
+    case VK_F4: return kSbKeyF4;
+    case VK_F5: return kSbKeyF5;
+    case VK_F6: return kSbKeyF6;
+    case VK_F7: return kSbKeyF7;
+    case VK_F8: return kSbKeyF8;
+    case VK_F9: return kSbKeyF9;
+    case VK_F10: return kSbKeyF10;
+    case VK_F11: return kSbKeyF11;
+    case VK_F12: return kSbKeyF12;
+    case VK_F13: return kSbKeyF13;
+    case VK_F14: return kSbKeyF14;
+    case VK_F15: return kSbKeyF15;
+    case VK_F16: return kSbKeyF16;
+    case VK_F17: return kSbKeyF17;
+    case VK_F18: return kSbKeyF18;
+    case VK_F19: return kSbKeyF19;
+    case VK_F20: return kSbKeyF20;
+    case VK_F21: return kSbKeyF21;
+    case VK_F22: return kSbKeyF22;
+    case VK_F23: return kSbKeyF23;
+    case VK_F24: return kSbKeyF24;
+    case VK_NUMLOCK: return kSbKeyNumlock;
+    case VK_SCROLL: return kSbKeyScroll;
+    case VK_LSHIFT: return kSbKeyLshift;
+    case VK_RSHIFT: return kSbKeyRshift;
+    case VK_LCONTROL: return kSbKeyLcontrol;
+    case VK_RCONTROL: return kSbKeyRcontrol;
+    case VK_LMENU: return kSbKeyLmenu;
+    case VK_RMENU: return kSbKeyRmenu;
+    case VK_BROWSER_BACK: return kSbKeyBrowserBack;
+    case VK_BROWSER_FORWARD: return kSbKeyBrowserForward;
+    case VK_BROWSER_REFRESH: return kSbKeyBrowserRefresh;
+    case VK_BROWSER_STOP: return kSbKeyBrowserStop;
+    case VK_BROWSER_SEARCH: return kSbKeyBrowserSearch;
+    case VK_BROWSER_FAVORITES: return kSbKeyBrowserFavorites;
+    case VK_BROWSER_HOME: return kSbKeyBrowserHome;
+    case VK_LBUTTON: return kSbKeyMouse1;
+    case VK_RBUTTON: return kSbKeyMouse2;
+    case VK_MBUTTON: return kSbKeyMouse3;
+    case VK_XBUTTON1: return kSbKeyMouse4;
+    case VK_XBUTTON2: return kSbKeyMouse5;
+    default:
+      SB_LOG(WARNING) << "Unrecognized key hit.";
+      return kSbKeyUnknown;
+  }
+}
+
+}  // namespace
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// TODO: Plug into XInput APIs for Xbox controller input?
+Application::Event* ApplicationWin32::ProcessWinKeyEvent(SbWindow window,
+                                                         UINT msg,
+                                                         WPARAM w_param,
+                                                         LPARAM l_param) {
+  SbInputData* data = new SbInputData();
+  memset(data, 0, sizeof(*data));
+
+  data->window = window;
+  data->device_type = kSbInputDeviceTypeKeyboard;
+  // TODO: Do some more intelligent handling logic here to determine
+  // a unique device ID.
+  data->device_id = kSbKeyboardDeviceId;
+  data->key = VirtualKeyCodeToSbKey(w_param);
+
+  const bool was_down = ((l_param & (1 << 30)) != 0);
+  const bool up = msg != WM_KEYDOWN && msg != WM_SYSKEYDOWN;
+
+  data->type = up ? kSbInputEventTypeUnpress : kSbInputEventTypePress;
+
+  SbKeyModifiers current_modifier = kSbKeyModifiersNone;
+  if (data->key == kSbKeyShift || data->key == kSbKeyRshift ||
+      data->key == kSbKeyLshift) {
+    current_modifier = kSbKeyModifiersShift;
+  } else if (data->key == kSbKeyMenu || data->key == kSbKeyRmenu ||
+             data->key == kSbKeyLmenu) {
+    current_modifier = kSbKeyModifiersAlt;
+  } else if (data->key == kSbKeyControl || data->key == kSbKeyRcontrol ||
+             data->key == kSbKeyLcontrol) {
+    current_modifier = kSbKeyModifiersCtrl;
+  } else if (data->key == kSbKeyRwin || data->key == kSbKeyLwin) {
+    current_modifier = kSbKeyModifiersMeta;
+  }
+
+  // Either add or remove the current modifier key being pressed or released.
+  // This noops for kSbKeyModifiersNone.
+  if (up) {
+    current_key_modifiers_ &= ~current_modifier;
+  } else {
+    current_key_modifiers_ |= current_modifier;
+  }
+  data->key_modifiers = current_key_modifiers_;
+
+  switch (data->key) {
+    case kSbKeyLshift:
+    case kSbKeyLmenu:
+    case kSbKeyLcontrol:
+    case kSbKeyLwin:
+      data->key_location = kSbKeyLocationLeft;
+      break;
+    case kSbKeyRshift:
+    case kSbKeyRmenu:
+    case kSbKeyRcontrol:
+    case kSbKeyRwin:
+      data->key_location = kSbKeyLocationRight;
+      break;
+    default:
+      break;
+  }
+
+  return new Application::Event(kSbEventTypeInput, data,
+                                &Application::DeleteDestructor<SbInputData>);
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/atomic_public.h b/starboard/shared/win32/atomic_public.h
new file mode 100644
index 0000000..2d84281
--- /dev/null
+++ b/starboard/shared/win32/atomic_public.h
@@ -0,0 +1,263 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_ATOMIC_PUBLIC_H_
+#define STARBOARD_SHARED_WIN32_ATOMIC_PUBLIC_H_
+
+#include "starboard/atomic.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Declarations for Windows Intrinsic Functions
+// Defined here to avoid including Windows headers
+// See https://msdn.microsoft.com/en-us/library/w5405h95.aspx
+
+long _InterlockedCompareExchange(
+  long volatile * Destination,
+  long Exchange,
+  long Comparand
+);
+#pragma intrinsic(_InterlockedCompareExchange)
+
+__int64 _InterlockedCompareExchange64(
+  __int64 volatile * Destination,
+  __int64 Exchange,
+  __int64 Comparand
+);
+#pragma intrinsic(_InterlockedCompareExchange64)
+
+char _InterlockedCompareExchange8(
+  char volatile * Destination,
+  char Exchange,
+  char Comparand
+);
+#pragma intrinsic(_InterlockedCompareExchange8)
+
+long _InterlockedExchange(
+  long volatile * Target,
+  long Value
+);
+#pragma intrinsic(_InterlockedExchange)
+
+__int64 _InterlockedExchange64(
+  __int64 volatile * Target,
+  __int64 Value
+);
+#pragma intrinsic(_InterlockedExchange64)
+
+long _InterlockedExchangeAdd(
+  long volatile * Addend,
+  long Value
+);
+#pragma intrinsic(_InterlockedExchangeAdd)
+
+__int64 _InterlockedExchangeAdd64(
+  __int64 volatile * Addend,
+  __int64 Value
+);
+#pragma intrinsic(_InterlockedExchangeAdd64)
+
+void _ReadWriteBarrier(void);
+#pragma intrinsic(_ReadWriteBarrier)
+
+SB_C_FORCE_INLINE SbAtomic32
+SbAtomicNoBarrier_CompareAndSwap(volatile SbAtomic32* ptr,
+                                 SbAtomic32 old_value,
+                                 SbAtomic32 new_value) {
+  // Note this does a full memory barrier
+  return _InterlockedCompareExchange(
+      (volatile long*) ptr, (long) new_value, (long) old_value);
+}
+
+SB_C_FORCE_INLINE SbAtomic32
+SbAtomicNoBarrier_Exchange(volatile SbAtomic32* ptr, SbAtomic32 new_value) {
+  // Note this does a full memory barrier
+  return _InterlockedExchange((volatile long*)ptr, (long)new_value);
+}
+
+SB_C_FORCE_INLINE SbAtomic32
+SbAtomicNoBarrier_Increment(volatile SbAtomic32* ptr, SbAtomic32 increment) {
+  return SbAtomicBarrier_Increment(ptr, increment);
+}
+
+SB_C_FORCE_INLINE SbAtomic32 SbAtomicBarrier_Increment(volatile SbAtomic32* ptr,
+                                                       SbAtomic32 increment) {
+  // Note InterlockedExchangeAdd does a full memory barrier
+  return increment + _InterlockedExchangeAdd(
+      (volatile long *)ptr, (long)increment);
+}
+
+SB_C_FORCE_INLINE SbAtomic32
+SbAtomicAcquire_CompareAndSwap(volatile SbAtomic32* ptr,
+                               SbAtomic32 old_value,
+                               SbAtomic32 new_value) {
+  // Note this does a full memory barrier
+  return _InterlockedCompareExchange(
+      (volatile long*) ptr, (long) new_value, (long) old_value);
+}
+
+SB_C_FORCE_INLINE SbAtomic32
+SbAtomicRelease_CompareAndSwap(volatile SbAtomic32* ptr,
+                               SbAtomic32 old_value,
+                               SbAtomic32 new_value) {
+  // Note this does a full memory barrier
+  return _InterlockedCompareExchange(
+      (volatile long*) ptr, (long) new_value, (long) old_value);
+}
+
+// NOTE: https://msdn.microsoft.com/en-us/library/f20w0x5e.aspx
+// states _ReadWriteBarrier() is deprecated and
+// recommends "atomic_thread_fence", which is C++11 and violates
+// Starboard's "C-only header" policy
+SB_C_FORCE_INLINE void SbAtomicMemoryBarrier() {
+  _ReadWriteBarrier();
+}
+
+SB_C_FORCE_INLINE void SbAtomicNoBarrier_Store(volatile SbAtomic32* ptr,
+                                               SbAtomic32 value) {
+  *ptr = value;
+}
+
+SB_C_FORCE_INLINE void SbAtomicAcquire_Store(volatile SbAtomic32* ptr,
+                                             SbAtomic32 value) {
+  *ptr = value;
+  SbAtomicMemoryBarrier();
+}
+
+SB_C_FORCE_INLINE void SbAtomicRelease_Store(volatile SbAtomic32* ptr,
+                                             SbAtomic32 value) {
+  SbAtomicMemoryBarrier();
+  *ptr = value;
+}
+
+SB_C_FORCE_INLINE SbAtomic32
+SbAtomicNoBarrier_Load(volatile const SbAtomic32* ptr) {
+  return *ptr;
+}
+
+SB_C_FORCE_INLINE SbAtomic32
+SbAtomicAcquire_Load(volatile const SbAtomic32* ptr) {
+  SbAtomic32 value = *ptr;
+  SbAtomicMemoryBarrier();
+  return value;
+}
+
+SB_C_FORCE_INLINE SbAtomic32
+SbAtomicRelease_Load(volatile const SbAtomic32* ptr) {
+  SbAtomicMemoryBarrier();
+  return *ptr;
+}
+
+SB_C_FORCE_INLINE SbAtomic8
+SbAtomicRelease_CompareAndSwap8(volatile SbAtomic8* ptr,
+                               SbAtomic8 old_value,
+                               SbAtomic8 new_value) {
+  // Note this does a full memory barrier
+  return _InterlockedCompareExchange8((volatile char*)ptr, new_value, old_value);
+}
+
+SB_C_FORCE_INLINE void
+SbAtomicNoBarrier_Store8(volatile SbAtomic8* ptr, SbAtomic8 value) {
+  *ptr = value;
+}
+
+SB_C_FORCE_INLINE SbAtomic8
+SbAtomicNoBarrier_Load8(volatile const SbAtomic8* ptr) {
+  return *ptr;
+}
+
+// 64-bit atomic operations (only available on 64-bit processors).
+#if SB_HAS(64_BIT_ATOMICS)
+SB_C_FORCE_INLINE SbAtomic64
+SbAtomicNoBarrier_CompareAndSwap64(volatile SbAtomic64* ptr,
+                                   SbAtomic64 old_value,
+                                   SbAtomic64 new_value) {
+  return _InterlockedCompareExchange64(ptr, new_value, old_value);
+}
+
+SB_C_FORCE_INLINE SbAtomic64
+SbAtomicNoBarrier_Exchange64(volatile SbAtomic64* ptr, SbAtomic64 new_value) {
+  return _InterlockedExchange64(ptr, new_value);
+}
+
+SB_C_FORCE_INLINE SbAtomic64
+SbAtomicNoBarrier_Increment64(volatile SbAtomic64* ptr, SbAtomic64 increment) {
+  return increment + _InterlockedExchangeAdd64(ptr, increment);
+}
+
+SB_C_FORCE_INLINE SbAtomic64
+SbAtomicBarrier_Increment64(volatile SbAtomic64* ptr, SbAtomic64 increment) {
+  // Note this does a full memory barrier
+  return increment + _InterlockedExchangeAdd64(ptr, increment);
+}
+
+SB_C_FORCE_INLINE SbAtomic64
+SbAtomicAcquire_CompareAndSwap64(volatile SbAtomic64* ptr,
+                                 SbAtomic64 old_value,
+                                 SbAtomic64 new_value) {
+  // Note this does a full memory barrier
+  return _InterlockedCompareExchange64(ptr, new_value, old_value);
+}
+
+SB_C_FORCE_INLINE SbAtomic64
+SbAtomicRelease_CompareAndSwap64(volatile SbAtomic64* ptr,
+                                 SbAtomic64 old_value,
+                                 SbAtomic64 new_value) {
+  // Note this does a full memory barrier
+  return _InterlockedCompareExchange64(ptr, new_value, old_value);
+}
+
+SB_C_FORCE_INLINE void SbAtomicNoBarrier_Store64(volatile SbAtomic64* ptr,
+                                                 SbAtomic64 value) {
+  *ptr = value;
+}
+
+SB_C_FORCE_INLINE void SbAtomicAcquire_Store64(volatile SbAtomic64* ptr,
+                                               SbAtomic64 value) {
+  *ptr = value;
+  SbAtomicMemoryBarrier();
+}
+
+SB_C_FORCE_INLINE void SbAtomicRelease_Store64(volatile SbAtomic64* ptr,
+                                               SbAtomic64 value) {
+  SbAtomicMemoryBarrier();
+  *ptr = value;
+}
+
+SB_C_FORCE_INLINE SbAtomic64
+SbAtomicNoBarrier_Load64(volatile const SbAtomic64* ptr) {
+  return *ptr;
+}
+
+SB_C_FORCE_INLINE SbAtomic64
+SbAtomicAcquire_Load64(volatile const SbAtomic64* ptr) {
+  SbAtomic64 value = *ptr;
+  SbAtomicMemoryBarrier();
+  return value;
+}
+
+SB_C_FORCE_INLINE SbAtomic64
+SbAtomicRelease_Load64(volatile const SbAtomic64* ptr) {
+  SbAtomicMemoryBarrier();
+  return *ptr;
+}
+#endif  // SB_HAS(64_BIT_ATOMICS)
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+#endif  // STARBOARD_SHARED_WIN32_ATOMIC_PUBLIC_H_
diff --git a/starboard/shared/win32/atomic_queue.h b/starboard/shared/win32/atomic_queue.h
new file mode 100644
index 0000000..cd22487
--- /dev/null
+++ b/starboard/shared/win32/atomic_queue.h
@@ -0,0 +1,75 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_ATOMIC_QUEUE_H_
+#define STARBOARD_SHARED_WIN32_ATOMIC_QUEUE_H_
+
+#include <deque>
+
+#include "starboard/common/mutex.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// A simple thread-safe producer / consumer queue. Elements are added via
+// PopBack() and removed via PopFront().
+template <typename Data>
+class AtomicQueue {
+ public:
+  size_t PushBack(Data data_ptr) {
+    ScopedLock lock(mutex_);
+    data_queue_.push_back(data_ptr);
+    return data_queue_.size();
+  }
+
+  Data PopFront() {
+    ScopedLock lock(mutex_);
+    if (data_queue_.empty()) {
+      Data empty = Data();
+      return empty;
+    }
+    Data data_ptr = data_queue_.front();
+    data_queue_.pop_front();
+    return data_ptr;
+  }
+
+  bool IsEmpty() const {
+    ScopedLock lock(mutex_);
+    return data_queue_.empty();
+  }
+
+  size_t Size() const {
+    ScopedLock lock(mutex_);
+    return data_queue_.size();
+  }
+
+  void Clear() {
+    ScopedLock lock(mutex_);
+    std::deque<Data> empty;
+    data_queue_.swap(empty);
+  }
+
+ private:
+  using Mutex = ::starboard::Mutex;
+  using ScopedLock = ::starboard::ScopedLock;
+  std::deque<Data> data_queue_;
+  ::starboard::Mutex mutex_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_ATOMIC_QUEUE_H_
diff --git a/starboard/shared/win32/audio_decoder.cc b/starboard/shared/win32/audio_decoder.cc
new file mode 100644
index 0000000..d404441
--- /dev/null
+++ b/starboard/shared/win32/audio_decoder.cc
@@ -0,0 +1,151 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/audio_decoder.h"
+
+#include "starboard/atomic.h"
+#include "starboard/audio_sink.h"
+#include "starboard/common/log.h"
+#include "starboard/memory.h"
+#include "starboard/shared/win32/media_common.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+class AudioDecoder::CallbackScheduler : private JobOwner {
+ public:
+  CallbackScheduler() : callback_signaled_(false) {}
+
+  void SetCallbackOnce(ConsumedCB cb) {
+    SB_DCHECK(cb);
+    ::starboard::ScopedLock lock(mutex_);
+    if (!cb_) {
+      cb_ = cb;
+    }
+  }
+
+  void ScheduleCallbackIfNecessary() {
+    ::starboard::ScopedLock lock(mutex_);
+    if (!cb_ || callback_signaled_) {
+      return;
+    }
+    callback_signaled_ = true;
+    JobOwner::Schedule(cb_);
+  }
+
+  void OnCallbackSignaled() {
+    ::starboard::ScopedLock lock(mutex_);
+    callback_signaled_ = false;
+  }
+
+  ConsumedCB cb_;
+  ::starboard::Mutex mutex_;
+  bool callback_signaled_;
+};
+
+AudioDecoder::AudioDecoder(SbMediaAudioCodec audio_codec,
+                           const SbMediaAudioSampleInfo& audio_sample_info,
+                           SbDrmSystem drm_system)
+    : audio_codec_(audio_codec),
+      audio_sample_info_(audio_sample_info),
+      drm_system_(drm_system),
+      sample_type_(kSbMediaAudioSampleTypeFloat32),
+      stream_ended_(false) {
+  SB_DCHECK(audio_codec == kSbMediaAudioCodecAac);
+}
+
+AudioDecoder::~AudioDecoder() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  decoder_thread_.reset(nullptr);
+  decoder_impl_.reset(nullptr);
+  callback_scheduler_.reset(nullptr);
+}
+
+void AudioDecoder::Initialize(const OutputCB& output_cb,
+                              const ErrorCB& error_cb) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  SB_DCHECK(output_cb);
+  SB_DCHECK(!output_cb_);
+  output_cb_ = output_cb;
+  decoder_impl_ = AbstractWin32AudioDecoder::Create(
+      audio_codec_, kSbMediaAudioFrameStorageTypeInterleaved, sample_type_,
+      audio_sample_info_, drm_system_);
+  decoder_thread_.reset(new AudioDecoderThread(decoder_impl_.get(), this));
+  callback_scheduler_.reset(new CallbackScheduler());
+}
+
+void AudioDecoder::Decode(const scoped_refptr<InputBuffer>& input_buffer,
+                          const ConsumedCB& consumed_cb) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  SB_DCHECK(input_buffer);
+
+  callback_scheduler_->SetCallbackOnce(consumed_cb);
+  callback_scheduler_->OnCallbackSignaled();
+  const bool can_take_more_data = decoder_thread_->QueueInput(input_buffer);
+  if (can_take_more_data) {
+    callback_scheduler_->ScheduleCallbackIfNecessary();
+  }
+
+  if (stream_ended_) {
+    SB_LOG(ERROR) << "Decode() is called after WriteEndOfStream() is called.";
+    return;
+  }
+}
+
+void AudioDecoder::WriteEndOfStream() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  ::starboard::ScopedLock lock(mutex_);
+  stream_ended_ = true;
+  decoder_thread_->QueueEndOfStream();
+}
+
+scoped_refptr<AudioDecoder::DecodedAudio> AudioDecoder::Read(
+    int* samples_per_second) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  DecodedAudioPtr data = decoded_data_.PopFront();
+  SB_DCHECK(data);
+  *samples_per_second = decoder_impl_->GetSamplesPerSecond();
+  return data;
+}
+
+void AudioDecoder::Reset() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  decoder_thread_.reset(nullptr);
+  decoder_impl_->Reset();
+
+  decoded_data_.Clear();
+  stream_ended_ = false;
+  callback_scheduler_.reset(new CallbackScheduler());
+  CancelPendingJobs();
+
+  decoder_thread_.reset(new AudioDecoderThread(decoder_impl_.get(), this));
+}
+
+void AudioDecoder::OnAudioDecoded(DecodedAudioPtr data) {
+  decoded_data_.PushBack(data);
+  if (output_cb_) {
+    Schedule(output_cb_);
+  }
+  callback_scheduler_->ScheduleCallbackIfNecessary();
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/audio_decoder.h b/starboard/shared/win32/audio_decoder.h
new file mode 100644
index 0000000..18631f0
--- /dev/null
+++ b/starboard/shared/win32/audio_decoder.h
@@ -0,0 +1,79 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_AUDIO_DECODER_H_
+#define STARBOARD_SHARED_WIN32_AUDIO_DECODER_H_
+
+#include "starboard/common/ref_counted.h"
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/configuration.h"
+#include "starboard/drm.h"
+#include "starboard/media.h"
+#include "starboard/shared/internal_only.h"
+#include "starboard/shared/starboard/media/media_util.h"
+#include "starboard/shared/starboard/player/decoded_audio_internal.h"
+#include "starboard/shared/starboard/player/filter/audio_decoder_internal.h"
+#include "starboard/shared/starboard/player/job_queue.h"
+#include "starboard/shared/starboard/thread_checker.h"
+#include "starboard/shared/win32/atomic_queue.h"
+#include "starboard/shared/win32/audio_decoder_thread.h"
+#include "starboard/shared/win32/media_common.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+class AudioDecoder
+    : public ::starboard::shared::starboard::player::filter::AudioDecoder,
+      private ::starboard::shared::starboard::player::JobQueue::JobOwner,
+      private AudioDecodedCallback {
+ public:
+  AudioDecoder(SbMediaAudioCodec audio_codec,
+               const SbMediaAudioSampleInfo& audio_sample_info,
+               SbDrmSystem drm_system);
+  ~AudioDecoder() override;
+
+  void Initialize(const OutputCB& output_cb, const ErrorCB& error_cb) override;
+  void Decode(const scoped_refptr<InputBuffer>& input_buffer,
+              const ConsumedCB& consumed_cb) override;
+  void WriteEndOfStream() override;
+  scoped_refptr<DecodedAudio> Read(int* samples_per_second) override;
+  void Reset() override;
+  void OnAudioDecoded(DecodedAudioPtr data) override;
+
+ private:
+  class CallbackScheduler;
+
+  ::starboard::shared::starboard::ThreadChecker thread_checker_;
+
+  const SbMediaAudioCodec audio_codec_;
+  const starboard::media::AudioSampleInfo audio_sample_info_;
+  SbDrmSystem const drm_system_;
+  const SbMediaAudioSampleType sample_type_;
+  bool stream_ended_;
+
+  AtomicQueue<DecodedAudioPtr> decoded_data_;
+  scoped_ptr<AudioDecoder::CallbackScheduler> callback_scheduler_;
+  scoped_ptr<AbstractWin32AudioDecoder> decoder_impl_;
+  scoped_ptr<AudioDecoderThread> decoder_thread_;
+  OutputCB output_cb_;
+
+  Mutex mutex_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_AUDIO_DECODER_H_
diff --git a/starboard/shared/win32/audio_decoder_thread.cc b/starboard/shared/win32/audio_decoder_thread.cc
new file mode 100644
index 0000000..02bdb6b
--- /dev/null
+++ b/starboard/shared/win32/audio_decoder_thread.cc
@@ -0,0 +1,130 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/audio_decoder_thread.h"
+
+#include <deque>
+#include <vector>
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+namespace {
+
+// Size of the queue for audio units.
+const size_t kMaxProcessingElements = 64;
+
+size_t WriteAsMuchAsPossible(
+    std::deque<scoped_refptr<InputBuffer> >* data_queue,
+    AbstractWin32AudioDecoder* audio_decoder) {
+  const size_t original_size = data_queue->size();
+  while (!data_queue->empty()) {
+    scoped_refptr<InputBuffer> buff = data_queue->front();
+    data_queue->pop_front();
+
+    if (buff) {
+      if (!audio_decoder->TryWrite(buff)) {
+        data_queue->push_front(buff);
+        break;
+      }
+    } else {
+      audio_decoder->WriteEndOfStream();
+    }
+  }
+  return original_size - data_queue->size();
+}
+
+std::vector<DecodedAudioPtr> ReadAllDecodedAudioSamples(
+    AbstractWin32AudioDecoder* audio_decoder) {
+  std::vector<DecodedAudioPtr> decoded_audio_out;
+  while (DecodedAudioPtr decoded_datum = audio_decoder->ProcessAndRead()) {
+    decoded_audio_out.push_back(decoded_datum);
+  }
+  return decoded_audio_out;
+}
+
+}  // namespace.
+
+AudioDecoderThread::AudioDecoderThread(AbstractWin32AudioDecoder* decoder_impl,
+                                       AudioDecodedCallback* callback)
+    : Thread("AudioDecoderThd"),
+      win32_audio_decoder_(decoder_impl),
+      callback_(callback) {
+  Start();
+}
+
+AudioDecoderThread::~AudioDecoderThread() {
+  Join();
+}
+
+bool AudioDecoderThread::QueueInput(const scoped_refptr<InputBuffer>& buffer) {
+  {
+    ::starboard::ScopedLock lock(input_buffer_queue_mutex_);
+    input_buffer_queue_.push_back(buffer);
+  }
+
+  // increment() returns the previous value.
+  size_t element_count = processing_elements_.increment() + 1;
+  semaphore_.Put();
+  return element_count < kMaxProcessingElements;
+}
+
+void AudioDecoderThread::QueueEndOfStream() {
+  scoped_refptr<InputBuffer> empty;
+  QueueInput(empty);
+}
+
+void AudioDecoderThread::Run() {
+  std::deque<scoped_refptr<InputBuffer> > local_queue;
+
+  while (!join_called()) {
+    if (local_queue.empty()) {
+      TransferPendingInputTo(&local_queue);
+    }
+    bool work_done = false;
+    size_t number_written =
+        WriteAsMuchAsPossible(&local_queue, win32_audio_decoder_);
+    if (number_written > 0) {
+      processing_elements_.fetch_sub(static_cast<int32_t>(number_written));
+      work_done = true;
+    }
+
+    std::vector<DecodedAudioPtr> decoded_audio =
+        ReadAllDecodedAudioSamples(win32_audio_decoder_);
+
+    if (!decoded_audio.empty()) {
+      work_done = true;
+      for (auto it = decoded_audio.begin(); it != decoded_audio.end(); ++it) {
+        callback_->OnAudioDecoded(*it);
+      }
+    }
+
+    if (!work_done) {
+      semaphore_.TakeWait(kSbTimeMillisecond);
+    }
+  }
+}
+
+void AudioDecoderThread::TransferPendingInputTo(
+    std::deque<scoped_refptr<InputBuffer> >* destination) {
+  ::starboard::ScopedLock lock(input_buffer_queue_mutex_);
+  while (!input_buffer_queue_.empty()) {
+    destination->push_back(input_buffer_queue_.front());
+    input_buffer_queue_.pop_front();
+  }
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/audio_decoder_thread.h b/starboard/shared/win32/audio_decoder_thread.h
new file mode 100644
index 0000000..45f0d42
--- /dev/null
+++ b/starboard/shared/win32/audio_decoder_thread.h
@@ -0,0 +1,71 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_AUDIO_DECODER_THREAD_H_
+#define STARBOARD_SHARED_WIN32_AUDIO_DECODER_THREAD_H_
+
+#include <deque>
+#include <queue>
+
+#include "starboard/common/ref_counted.h"
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/common/semaphore.h"
+#include "starboard/common/thread.h"
+#include "starboard/media.h"
+#include "starboard/shared/starboard/player/decoded_audio_internal.h"
+#include "starboard/shared/starboard/player/filter/audio_decoder_internal.h"
+#include "starboard/shared/win32/media_common.h"
+#include "starboard/shared/win32/win32_audio_decoder.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+class AudioDecodedCallback {
+ public:
+  virtual ~AudioDecodedCallback() {}
+  virtual void OnAudioDecoded(DecodedAudioPtr data) = 0;
+};
+
+// This decoder thread simplifies decoding media. Data is pushed in via
+// QueueInput() and QueueEndOfStream() and output data is pushed via
+// the AudioDecodedCallback.
+class AudioDecoderThread : private Thread {
+ public:
+  AudioDecoderThread(AbstractWin32AudioDecoder* decoder_impl,
+                     AudioDecodedCallback* callback);
+  ~AudioDecoderThread() override;
+
+  // Returns true if more input can be pushed to this thread.
+  bool QueueInput(const scoped_refptr<InputBuffer>& buffer);
+  void QueueEndOfStream();
+
+ private:
+  void Run() override;
+  void TransferPendingInputTo(
+      std::deque<scoped_refptr<InputBuffer> >* destination);
+  AbstractWin32AudioDecoder* win32_audio_decoder_;
+  AudioDecodedCallback* callback_;
+
+  std::deque<scoped_refptr<InputBuffer> > input_buffer_queue_;
+  ::starboard::Mutex input_buffer_queue_mutex_;
+  atomic_int32_t processing_elements_;
+  Semaphore semaphore_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_AUDIO_DECODER_THREAD_H_
diff --git a/starboard/shared/win32/audio_sink.cc b/starboard/shared/win32/audio_sink.cc
new file mode 100644
index 0000000..57d38cb
--- /dev/null
+++ b/starboard/shared/win32/audio_sink.cc
@@ -0,0 +1,617 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <basetyps.h>
+#include <wrl.h>
+#include <xaudio2.h>
+
+#include <algorithm>
+#include <limits>
+#include <list>
+
+#include "starboard/atomic.h"
+#include "starboard/common/condition_variable.h"
+#include "starboard/common/log.h"
+#include "starboard/common/mutex.h"
+#include "starboard/configuration.h"
+#include "starboard/shared/starboard/audio_sink/audio_sink_internal.h"
+#include "starboard/shared/starboard/player/job_thread.h"
+#include "starboard/shared/starboard/thread_checker.h"
+#include "starboard/thread.h"
+#include "starboard/time.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+namespace {
+
+using Microsoft::WRL::ComPtr;
+
+const int kMaxBuffersSubmittedPerLoop = 2;
+
+// Fails an SB_DCHECK if an HRESULT is not S_OK
+void CHECK_HRESULT_OK(HRESULT hr) {
+  SB_DCHECK(SUCCEEDED(hr)) << std::hex << hr;
+}
+
+WORD SampleTypeToFormatTag(SbMediaAudioSampleType type) {
+  switch (type) {
+#if SB_HAS_QUIRK(SUPPORT_INT16_AUDIO_SAMPLES)
+    case kSbMediaAudioSampleTypeInt16:
+      return WAVE_FORMAT_PCM;
+#endif  // SB_HAS_QUIRK(SUPPORT_INT16_AUDIO_SAMPLES)
+    case kSbMediaAudioSampleTypeFloat32:
+      return WAVE_FORMAT_IEEE_FLOAT;
+    default:
+      SB_NOTREACHED();
+      return 0;
+  }
+}
+
+WORD SampleTypeToBitsPerSample(SbMediaAudioSampleType type) {
+  switch (type) {
+#if SB_HAS_QUIRK(SUPPORT_INT16_AUDIO_SAMPLES)
+    case kSbMediaAudioSampleTypeInt16:
+      return 16;
+#endif  // SB_HAS_QUIRK(SUPPORT_INT16_AUDIO_SAMPLES)
+    case kSbMediaAudioSampleTypeFloat32:
+      return 32;
+    default:
+      SB_NOTREACHED();
+      return 0;
+  }
+}
+
+class XAudioAudioSinkType;
+
+class XAudioAudioSink : public SbAudioSinkPrivate {
+ public:
+  XAudioAudioSink(XAudioAudioSinkType* type,
+                  IXAudio2SourceVoice* source_voice,
+                  const WAVEFORMATEX& wfx,
+                  SbAudioSinkFrameBuffers frame_buffers,
+                  int frame_buffers_size_in_frames,
+                  SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
+                  ConsumeFramesFunc consume_frames_func,
+                  void* context);
+  ~XAudioAudioSink() override{};
+
+  void SetSourceVoice(IXAudio2SourceVoice* source_voice) {
+    source_voice_ = source_voice;
+    samples_played_ = 0;
+    submitted_frames_ = 0;
+    if (source_voice_) {
+      CHECK_HRESULT_OK(source_voice_->Start(0));
+      SbAtomicRelease_Store(&stop_callbacks_, 0);
+    }
+  }
+
+  bool IsType(Type* type) override;
+  void SetPlaybackRate(double playback_rate) override {
+    SB_DCHECK(playback_rate >= 0.0);
+    if (playback_rate != 0.0 && playback_rate != 1.0) {
+      SB_NOTIMPLEMENTED() << "TODO: Only playback rates of 0.0 and 1.0 are "
+                             "currently supported.";
+      playback_rate = (playback_rate > 0.0) ? 1.0 : 0.0;
+    }
+    ScopedLock lock(mutex_);
+    playback_rate_ = playback_rate;
+  }
+  void SetVolume(double volume) override {
+    ScopedLock lock(mutex_);
+    volume_ = volume;
+  }
+  void Process();
+
+  void StopCallbacks() {
+    SbAtomicBarrier_Increment(&stop_callbacks_, 1);
+    // Make sure that any call to Process() returns so we know that
+    // no future callbacks will be invoked.
+    process_mutex_.Acquire();
+    process_mutex_.Release();
+
+    // This must happen on a non-XAudio callback thread.
+    if (source_voice_) {
+      source_voice_->DestroyVoice();
+    }
+  }
+  const WAVEFORMATEX& GetWaveFormatEx() const { return wfx_; }
+
+ private:
+  bool AreCallbacksStopped() const {
+    return SbAtomicAcquire_Load(&stop_callbacks_) != 0;
+  }
+  void SubmitSourceBuffer(int offset_in_frames, int count_frames);
+
+  // If true, this instance's source_voice_ has been destroyed and
+  // future Process() calls should return immediately.
+  SbAtomic32 stop_callbacks_;
+
+  XAudioAudioSinkType* const type_;
+  const SbAudioSinkUpdateSourceStatusFunc update_source_status_func_;
+  const ConsumeFramesFunc consume_frames_func_;
+  void* const context_;
+
+  SbAudioSinkFrameBuffers frame_buffers_;
+  const int frame_buffers_size_in_frames_;
+  const WAVEFORMATEX wfx_;
+
+  // Note: despite some documentation to the contrary, it appears
+  // that IXAudio2SourceVoice cannot be a ComPtr.
+  IXAudio2SourceVoice* source_voice_;
+
+  // |process_mutex_| is held during Process. Others may rapidly
+  // acquire/release to ensure they wait until the current Process() ends.
+  Mutex process_mutex_;
+  // |mutex_| protects |playback_rate_| and |volume_|.
+  Mutex mutex_;
+  double playback_rate_;
+  double volume_;
+  // The following variables are only used inside Process().  To keep it in the
+  // class simply to allow them to be kept between Process() calls.
+  int submitted_frames_;
+  int samples_played_;
+  int queued_buffers_;
+  bool was_playing_;
+  double current_volume_;
+};
+
+class XAudioAudioSinkType : public SbAudioSinkPrivate::Type,
+                            private IXAudio2EngineCallback {
+ public:
+  XAudioAudioSinkType();
+
+  ComPtr<IXAudio2> XAudioCreate();
+
+  SbAudioSink Create(
+      int channels,
+      int sampling_frequency_hz,
+      SbMediaAudioSampleType audio_sample_type,
+      SbMediaAudioFrameStorageType audio_frame_storage_type,
+      SbAudioSinkFrameBuffers frame_buffers,
+      int frame_buffers_size_in_frames,
+      SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
+      SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
+      SbAudioSinkPrivate::ErrorFunc error_func,
+      void* context);
+
+  bool IsValid(SbAudioSink audio_sink) override {
+    return audio_sink != kSbAudioSinkInvalid && audio_sink->IsType(this);
+  }
+
+  void Destroy(SbAudioSink audio_sink) override;
+
+ private:
+  void RestartAudioDevice();
+  void TryAcquireSinkVoices();
+  // IXAudio2EngineCallback methods
+  // This function will be called periodically with an interval of ~10ms.
+  void OnProcessingPassStart() override;
+  void OnProcessingPassEnd() override {}
+  void OnCriticalError(HRESULT hr) {
+    SB_LOG(INFO) << "OnCriticalError() called with code " << hr;
+
+    SB_DCHECK(thread_checker_.CalledOnValidThread());
+    // The thread id of callbacks will be changed after OnCriticalError() call.
+    thread_checker_.Detach();
+
+    if (sink_shutdown_in_progress_) {
+      return;
+    }
+    sink_shutdown_in_progress_ = true;
+
+    x_audio2_->UnregisterForCallbacks(this);
+
+    for (XAudioAudioSink* sink : audio_sinks_on_xaudio_callbacks_) {
+      sink->StopCallbacks();
+    }
+
+    restart_audio_thread_.job_queue()->Schedule(
+        std::bind(&XAudioAudioSinkType::RestartAudioDevice, this));
+  }
+
+  void ProcessSinksToAdd() {
+    if (!audio_sinks_to_add_.empty()) {
+      audio_sinks_on_xaudio_callbacks_.insert(
+          audio_sinks_on_xaudio_callbacks_.end(), audio_sinks_to_add_.begin(),
+          audio_sinks_to_add_.end());
+      audio_sinks_to_add_.clear();
+    }
+  }
+
+  void ProcessSinksToDelete() {
+    if (!audio_sinks_to_delete_.empty()) {
+      for (auto sink : audio_sinks_to_delete_) {
+        audio_sinks_on_xaudio_callbacks_.erase(
+            std::find(audio_sinks_on_xaudio_callbacks_.begin(),
+                      audio_sinks_on_xaudio_callbacks_.end(), sink));
+        delete sink;
+      }
+      audio_sinks_to_delete_.clear();
+    }
+  }
+
+  ComPtr<IXAudio2> x_audio2_;
+  Mutex x_audio2_mutex_;
+  IXAudio2MasteringVoice* mastering_voice_ = nullptr;
+
+  // This mutex protects |audio_sinks_to_add_| and |audio_sinks_to_delete_|.
+  Mutex mutex_;
+  std::list<XAudioAudioSink*> audio_sinks_to_add_;
+  std::list<SbAudioSink> audio_sinks_to_delete_;
+
+  // This must only be accessed from the OnProcessingPassStart callback
+  std::list<XAudioAudioSink*> audio_sinks_on_xaudio_callbacks_;
+  starboard::ThreadChecker thread_checker_;
+
+  starboard::player::JobThread restart_audio_thread_;
+  std::list<XAudioAudioSink*> audio_sinks_to_restart_;
+  bool sink_shutdown_in_progress_;
+};
+
+XAudioAudioSink::XAudioAudioSink(
+    XAudioAudioSinkType* type,
+    IXAudio2SourceVoice* source_voice,
+    const WAVEFORMATEX& wfx,
+    SbAudioSinkFrameBuffers frame_buffers,
+    int frame_buffers_size_in_frames,
+    SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
+    ConsumeFramesFunc consume_frames_func,
+    void* context)
+    : stop_callbacks_(0),
+      type_(type),
+      source_voice_(source_voice),
+      update_source_status_func_(update_source_status_func),
+      consume_frames_func_(consume_frames_func),
+      context_(context),
+      frame_buffers_(frame_buffers),
+      frame_buffers_size_in_frames_(frame_buffers_size_in_frames),
+      wfx_(wfx),
+      playback_rate_(1.0),
+      volume_(1.0),
+      submitted_frames_(0),
+      samples_played_(0),
+      queued_buffers_(0),
+      was_playing_(false),
+      current_volume_(1.0) {
+  CHECK_HRESULT_OK(source_voice_->Stop(0));
+}
+
+bool XAudioAudioSink::IsType(Type* type) {
+  return type_ == type;
+}
+
+void XAudioAudioSink::Process() {
+  ScopedLock process_lock(process_mutex_);
+  if (AreCallbacksStopped()) {
+    // We must not continue in this case, since |source_voice_| has been
+    // destroyed.
+    return;
+  }
+  int frames_in_buffer, offset_in_frames;
+  bool is_playing, is_eos_reached;
+  bool is_playback_rate_zero = false;
+  bool should_set_volume = false;
+
+  // This function is run on the XAudio thread and shouldn't be blocked.
+  if (mutex_.AcquireTry()) {
+    is_playback_rate_zero = playback_rate_ == 0.0;
+    should_set_volume = current_volume_ != volume_;
+    current_volume_ = volume_;
+    mutex_.Release();
+  }
+
+  if (should_set_volume) {
+    CHECK_HRESULT_OK(source_voice_->SetVolume(current_volume_));
+  }
+
+  update_source_status_func_(&frames_in_buffer, &offset_in_frames, &is_playing,
+                             &is_eos_reached, context_);
+  if (is_playback_rate_zero) {
+    is_playing = false;
+  }
+
+  if (is_playing != was_playing_) {
+    if (is_playing) {
+      CHECK_HRESULT_OK(source_voice_->Start(0));
+    } else {
+      CHECK_HRESULT_OK(source_voice_->Stop(0));
+    }
+  }
+  was_playing_ = is_playing;
+
+  // TODO: make sure that frames_in_buffer is large enough
+  // that it exceeds the voice state pool interval
+  if (!is_playing || frames_in_buffer == 0 || is_playback_rate_zero) {
+    return;
+  }
+  int unsubmitted_frames = frames_in_buffer - submitted_frames_;
+  int unsubmitted_start =
+      (offset_in_frames + submitted_frames_) % frame_buffers_size_in_frames_;
+  if (unsubmitted_frames == 0 || queued_buffers_ + kMaxBuffersSubmittedPerLoop >
+                                     XAUDIO2_MAX_QUEUED_BUFFERS) {
+    // submit nothing
+  } else if (unsubmitted_start + unsubmitted_frames <=
+             frame_buffers_size_in_frames_) {
+    SubmitSourceBuffer(unsubmitted_start, unsubmitted_frames);
+  } else {
+    int count_tail_frames = frame_buffers_size_in_frames_ - unsubmitted_start;
+    // Note since we can submit up to two source buffers at a time,
+    // kMaxBuffersSubmittedPerLoop = 2.
+    SubmitSourceBuffer(unsubmitted_start, count_tail_frames);
+    SubmitSourceBuffer(0, unsubmitted_frames - count_tail_frames);
+  }
+  submitted_frames_ = frames_in_buffer;
+
+  XAUDIO2_VOICE_STATE voice_state;
+  source_voice_->GetState(&voice_state);
+
+  int64_t consumed_frames = voice_state.SamplesPlayed - samples_played_;
+  SB_DCHECK(consumed_frames >= 0);
+  SB_DCHECK(consumed_frames <= std::numeric_limits<int>::max());
+  int consumed_frames_int = static_cast<int>(consumed_frames);
+
+  consume_frames_func_(consumed_frames_int, SbTimeGetMonotonicNow(), context_);
+  submitted_frames_ -= consumed_frames_int;
+  samples_played_ = voice_state.SamplesPlayed;
+  queued_buffers_ = voice_state.BuffersQueued;
+}
+
+void XAudioAudioSink::SubmitSourceBuffer(int offset_in_frames,
+                                         int count_frames) {
+  XAUDIO2_BUFFER audio_buffer_info;
+
+  audio_buffer_info.Flags = 0;
+  audio_buffer_info.AudioBytes = wfx_.nChannels *
+                                 frame_buffers_size_in_frames_ *
+                                 (wfx_.wBitsPerSample / 8);
+  audio_buffer_info.pAudioData = static_cast<const BYTE*>(frame_buffers_[0]);
+  audio_buffer_info.PlayBegin = offset_in_frames;
+  audio_buffer_info.PlayLength = count_frames;
+  audio_buffer_info.LoopBegin = 0;
+  audio_buffer_info.LoopLength = 0;
+  audio_buffer_info.LoopCount = 0;
+  audio_buffer_info.pContext = nullptr;
+  CHECK_HRESULT_OK(source_voice_->SubmitSourceBuffer(&audio_buffer_info));
+}
+
+XAudioAudioSinkType::XAudioAudioSinkType()
+    : restart_audio_thread_("RestartAudioDevice"),
+      sink_shutdown_in_progress_(false),
+      thread_checker_(starboard::ThreadChecker::kSetThreadIdOnFirstCheck) {
+  x_audio2_ = XAudioCreate();
+  HRESULT hr = x_audio2_->CreateMasteringVoice(&mastering_voice_);
+  SB_LOG_IF(WARNING, FAILED(hr)) << "Audio failed to CreateMasteringVoice(), "
+                                    "sound will be disabled.";
+}
+
+ComPtr<IXAudio2> XAudioAudioSinkType::XAudioCreate() {
+  ComPtr<IXAudio2> x_audio2;
+  HRESULT hr = XAudio2Create(&x_audio2, 0, XAUDIO2_DEFAULT_PROCESSOR);
+  if (FAILED(hr)) {
+    return nullptr;
+  }
+
+#if !defined(COBALT_BUILD_TYPE_GOLD)
+  XAUDIO2_DEBUG_CONFIGURATION debug_config = {};
+  debug_config.TraceMask = XAUDIO2_LOG_ERRORS | XAUDIO2_LOG_WARNINGS |
+                           XAUDIO2_LOG_INFO | XAUDIO2_LOG_DETAIL |
+                           XAUDIO2_LOG_TIMING | XAUDIO2_LOG_LOCKS;
+  debug_config.LogThreadID = TRUE;
+  debug_config.LogFileline = TRUE;
+  debug_config.LogFunctionName = TRUE;
+  debug_config.LogTiming = TRUE;
+  x_audio2->SetDebugConfiguration(&debug_config, NULL);
+#endif  // !defined(COBALT_BUILD_TYPE_GOLD)
+
+  x_audio2->RegisterForCallbacks(this);
+  return x_audio2;
+}
+
+SbAudioSink XAudioAudioSinkType::Create(
+    int channels,
+    int sampling_frequency_hz,
+    SbMediaAudioSampleType audio_sample_type,
+    SbMediaAudioFrameStorageType audio_frame_storage_type,
+    SbAudioSinkFrameBuffers frame_buffers,
+    int frame_buffers_size_in_frames,
+    SbAudioSinkUpdateSourceStatusFunc update_source_status_func,
+    SbAudioSinkPrivate::ConsumeFramesFunc consume_frames_func,
+    SbAudioSinkPrivate::ErrorFunc error_func,
+    void* context) {
+  SB_DCHECK(audio_frame_storage_type ==
+            kSbMediaAudioFrameStorageTypeInterleaved);
+
+  WAVEFORMATEX wfx;
+  wfx.wFormatTag = SampleTypeToFormatTag(audio_sample_type);
+  wfx.nChannels = static_cast<WORD>(channels);
+  wfx.nSamplesPerSec = sampling_frequency_hz;
+  wfx.nAvgBytesPerSec = channels *
+                        SampleTypeToBitsPerSample(audio_sample_type) *
+                        sampling_frequency_hz / 8;
+  wfx.wBitsPerSample = SampleTypeToBitsPerSample(audio_sample_type);
+  wfx.nBlockAlign = static_cast<WORD>((channels * wfx.wBitsPerSample) / 8);
+  wfx.cbSize = 0;
+
+  IXAudio2SourceVoice* source_voice = nullptr;
+  HRESULT hr = E_FAIL;
+  {
+    ScopedLock lock(x_audio2_mutex_);
+    if (!x_audio2_) {
+      x_audio2_ = XAudioCreate();
+      if (!x_audio2_) {
+        SB_DLOG(WARNING) << "Audio failed to XAudioCreate(), "
+                            "sound will be disabled.";
+        return nullptr;
+      }
+      hr = x_audio2_->CreateMasteringVoice(&mastering_voice_);
+      if (FAILED(hr)) {
+        SB_DLOG(WARNING) << "Audio failed to CreateMasteringVoice(), "
+                            "sound will be disabled.";
+        return nullptr;
+      }
+    }
+    hr = x_audio2_->CreateSourceVoice(&source_voice, &wfx,
+                                      XAUDIO2_VOICE_NOPITCH, 1.f);
+  }
+  if (FAILED(hr)) {
+    SB_DLOG(WARNING) << "Could not create source voice, error code: " << hr;
+    return nullptr;
+  }
+
+  XAudioAudioSink* audio_sink = new XAudioAudioSink(
+      this, source_voice, wfx, frame_buffers, frame_buffers_size_in_frames,
+      update_source_status_func, consume_frames_func, context);
+
+  ScopedLock lock(mutex_);
+  audio_sinks_to_add_.push_back(audio_sink);
+  return audio_sink;
+}
+
+void XAudioAudioSinkType::Destroy(SbAudioSink audio_sink) {
+  if (audio_sink == kSbAudioSinkInvalid) {
+    return;
+  }
+  if (!IsValid(audio_sink)) {
+    SB_LOG(WARNING) << "audio_sink is invalid.";
+    return;
+  }
+  // Previous versions of this code waited for the next OnProcessingPassStart()
+  // call to occur before returning. However, various circumstances could
+  // cause that never to happen, especially during UWP suspend.
+  // Instead, we return immediately, ensuring no SbAudioSink callbacks occur
+  // and postpone the delete itself until the next OnProcessingPassStart()
+  static_cast<XAudioAudioSink*>(audio_sink)->StopCallbacks();
+
+  ScopedLock lock(mutex_);
+  auto it = std::find(audio_sinks_to_restart_.begin(),
+                      audio_sinks_to_restart_.end(), audio_sink);
+  if (it == audio_sinks_to_restart_.end()) {
+    audio_sinks_to_delete_.push_back(audio_sink);
+  } else {
+    audio_sinks_to_restart_.erase(it);
+    delete audio_sink;
+  }
+}
+
+void XAudioAudioSinkType::RestartAudioDevice() {
+  {
+    ScopedLock lock(mutex_);
+    audio_sinks_to_restart_.insert(audio_sinks_to_restart_.end(),
+                                   audio_sinks_on_xaudio_callbacks_.begin(),
+                                   audio_sinks_on_xaudio_callbacks_.end());
+    audio_sinks_on_xaudio_callbacks_.clear();
+    audio_sinks_to_restart_.insert(audio_sinks_to_restart_.end(),
+                                   audio_sinks_to_add_.begin(),
+                                   audio_sinks_to_add_.end());
+    audio_sinks_to_add_.clear();
+
+    ProcessSinksToDelete();
+    for (auto sink : audio_sinks_to_restart_) {
+      sink->SetSourceVoice(nullptr);
+    }
+  }
+  if (mastering_voice_) {
+    mastering_voice_->DestroyVoice();
+    mastering_voice_ = nullptr;
+  }
+  {
+    ScopedLock lock(x_audio2_mutex_);
+    x_audio2_.Reset();
+  }
+  sink_shutdown_in_progress_ = false;
+
+  TryAcquireSinkVoices();
+}
+
+void XAudioAudioSinkType::TryAcquireSinkVoices() {
+  HRESULT hr = E_FAIL;
+  ScopedLock x_audio2_mutex_lock(x_audio2_mutex_);
+  if (!x_audio2_) {
+    hr = XAudio2Create(&x_audio2_, 0, XAUDIO2_DEFAULT_PROCESSOR);
+    if (FAILED(hr)) {
+      restart_audio_thread_.job_queue()->Schedule(
+          std::bind(&XAudioAudioSinkType::TryAcquireSinkVoices, this));
+      return;
+    }
+    x_audio2_->RegisterForCallbacks(this);
+  }
+
+  if (!mastering_voice_) {
+    hr = x_audio2_->CreateMasteringVoice(&mastering_voice_);
+    if (FAILED(hr)) {
+      restart_audio_thread_.job_queue()->Schedule(
+          std::bind(&XAudioAudioSinkType::TryAcquireSinkVoices, this));
+      return;
+    }
+  }
+
+  std::list<XAudioAudioSink*> audio_sinks_failed;
+  ScopedLock mutex_lock(mutex_);
+  for (auto sink : audio_sinks_to_restart_) {
+    IXAudio2SourceVoice* source_voice = nullptr;
+    hr = x_audio2_->CreateSourceVoice(&source_voice, &sink->GetWaveFormatEx(),
+                                      XAUDIO2_VOICE_NOPITCH, 1.f);
+    if (FAILED(hr)) {
+      audio_sinks_failed.push_back(sink);
+      continue;
+    }
+    sink->SetSourceVoice(source_voice);
+    audio_sinks_to_add_.push_back(sink);
+  }
+  audio_sinks_to_restart_ = audio_sinks_failed;
+  if (audio_sinks_to_restart_.empty()) {
+    return;
+  }
+  restart_audio_thread_.job_queue()->Schedule(
+      std::bind(&XAudioAudioSinkType::TryAcquireSinkVoices, this));
+}
+
+void XAudioAudioSinkType::OnProcessingPassStart() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  if (mutex_.AcquireTry()) {
+    ProcessSinksToAdd();
+    ProcessSinksToDelete();
+    mutex_.Release();
+  }
+
+  for (XAudioAudioSink* sink : audio_sinks_on_xaudio_callbacks_) {
+    sink->Process();
+  }
+}
+
+}  // namespace
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+namespace {
+SbAudioSinkPrivate::Type* audio_sink_;
+}  // namespace
+
+// static
+void SbAudioSinkPrivate::PlatformInitialize() {
+  SB_DCHECK(!audio_sink_);
+  audio_sink_ = new starboard::shared::win32::XAudioAudioSinkType();
+  SetPrimaryType(audio_sink_);
+  EnableFallbackToStub();
+}
+
+// static
+void SbAudioSinkPrivate::PlatformTearDown() {
+  SB_DCHECK(audio_sink_ == GetPrimaryType());
+  SetPrimaryType(nullptr);
+  delete audio_sink_;
+  audio_sink_ = nullptr;
+}
diff --git a/starboard/shared/win32/audio_sink_get_max_channels.cc b/starboard/shared/win32/audio_sink_get_max_channels.cc
new file mode 100644
index 0000000..979f62f
--- /dev/null
+++ b/starboard/shared/win32/audio_sink_get_max_channels.cc
@@ -0,0 +1,19 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/audio_sink.h"
+
+int SbAudioSinkGetMaxChannels() {
+  return 6;
+}
diff --git a/starboard/shared/win32/audio_sink_get_nearest_supported_sample_frequency.cc b/starboard/shared/win32/audio_sink_get_nearest_supported_sample_frequency.cc
new file mode 100644
index 0000000..4e0c5ec
--- /dev/null
+++ b/starboard/shared/win32/audio_sink_get_nearest_supported_sample_frequency.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/audio_sink.h"
+
+#include "starboard/common/log.h"
+
+int SbAudioSinkGetNearestSupportedSampleFrequency(int sampling_frequency_hz) {
+  if (sampling_frequency_hz <= 0) {
+    SB_LOG(ERROR) << "Invalid audio sampling frequency "
+                  << sampling_frequency_hz;
+    return 1;
+  }
+  return sampling_frequency_hz;
+}
diff --git a/starboard/shared/win32/audio_sink_is_audio_frame_storage_type_supported.cc b/starboard/shared/win32/audio_sink_is_audio_frame_storage_type_supported.cc
new file mode 100644
index 0000000..55af5b9
--- /dev/null
+++ b/starboard/shared/win32/audio_sink_is_audio_frame_storage_type_supported.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/audio_sink.h"
+
+#include "starboard/common/log.h"
+
+bool SbAudioSinkIsAudioFrameStorageTypeSupported(
+    SbMediaAudioFrameStorageType audio_frame_storage_type) {
+  switch (audio_frame_storage_type) {
+    case kSbMediaAudioFrameStorageTypeInterleaved:
+      return true;
+    case kSbMediaAudioFrameStorageTypePlanar:
+      return false;
+    default:
+      SB_NOTREACHED();
+      return false;
+  }
+}
diff --git a/starboard/shared/win32/audio_sink_is_audio_sample_type_supported.cc b/starboard/shared/win32/audio_sink_is_audio_sample_type_supported.cc
new file mode 100644
index 0000000..ccba840
--- /dev/null
+++ b/starboard/shared/win32/audio_sink_is_audio_sample_type_supported.cc
@@ -0,0 +1,31 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/audio_sink.h"
+
+#include "starboard/common/log.h"
+
+bool SbAudioSinkIsAudioSampleTypeSupported(
+    SbMediaAudioSampleType audio_sample_type) {
+  switch (audio_sample_type) {
+#if SB_HAS_QUIRK(SUPPORT_INT16_AUDIO_SAMPLES)
+    case kSbMediaAudioSampleTypeInt16:
+      return true;
+#endif  // SB_HAS_QUIRK(SUPPORT_INT16_AUDIO_SAMPLES)
+    case kSbMediaAudioSampleTypeFloat32:
+      return true;
+    default:
+      return false;
+  }
+}
diff --git a/starboard/shared/win32/audio_transform.cc b/starboard/shared/win32/audio_transform.cc
new file mode 100644
index 0000000..5a03f94
--- /dev/null
+++ b/starboard/shared/win32/audio_transform.cc
@@ -0,0 +1,133 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/audio_transform.h"
+
+#include <vector>
+
+#include "starboard/memory.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/media_common.h"
+#include "starboard/shared/win32/media_foundation_utils.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+using Microsoft::WRL::ComPtr;
+
+namespace {
+
+GUID ConvertToWin32AudioCodec(SbMediaAudioCodec codec) {
+  switch (codec) {
+    case kSbMediaAudioCodecNone: {
+      return MFAudioFormat_PCM;
+    }
+    case kSbMediaAudioCodecAac: {
+      return MFAudioFormat_AAC;
+    }
+    case kSbMediaAudioCodecOpus: {
+      return MFAudioFormat_Opus;
+    }
+    default: {
+      SB_NOTIMPLEMENTED();
+      return MFAudioFormat_PCM;
+    }
+  }
+}
+
+class WinAudioFormat {
+ public:
+  explicit WinAudioFormat(const SbMediaAudioSampleInfo& audio_sample_info) {
+    // The HEAACWAVEFORMAT structure has many specializations with varying data
+    // appended at the end.
+    // The "-1" is used to account for pbAudioSpecificConfig[1] at the end of
+    // HEAACWAVEFORMAT.
+    format_buffer_.resize(sizeof(HEAACWAVEFORMAT) +
+                          audio_sample_info.audio_specific_config_size - 1);
+    HEAACWAVEFORMAT* wave_format =
+        reinterpret_cast<HEAACWAVEFORMAT*>(format_buffer_.data());
+
+    wave_format->wfInfo.wfx.nAvgBytesPerSec = 0;
+    wave_format->wfInfo.wfx.nBlockAlign = audio_sample_info.block_alignment;
+    wave_format->wfInfo.wfx.nChannels = audio_sample_info.number_of_channels;
+    wave_format->wfInfo.wfx.nSamplesPerSec =
+        audio_sample_info.samples_per_second;
+    wave_format->wfInfo.wfx.wBitsPerSample = audio_sample_info.bits_per_sample;
+    wave_format->wfInfo.wfx.wFormatTag = WAVE_FORMAT_MPEG_HEAAC;
+    // The "-1" is used to account for pbAudioSpecificConfig[1] at the end of
+    // HEAACWAVEFORMAT.
+    wave_format->wfInfo.wfx.cbSize =
+        sizeof(HEAACWAVEFORMAT) - sizeof(WAVEFORMATEX) +
+        audio_sample_info.audio_specific_config_size - 1;
+
+    wave_format->wfInfo.wPayloadType = 0;                     // RAW
+    wave_format->wfInfo.wAudioProfileLevelIndication = 0xfe;  // Unknown Profile
+    wave_format->wfInfo.wStructType = 0;  // AudioSpecificConfig()
+
+    if (audio_sample_info.audio_specific_config_size > 0) {
+      memcpy(wave_format->pbAudioSpecificConfig,
+                   audio_sample_info.audio_specific_config,
+                   audio_sample_info.audio_specific_config_size);
+    }
+  }
+
+  WAVEFORMATEX* WaveFormatData() {
+    return reinterpret_cast<WAVEFORMATEX*>(format_buffer_.data());
+  }
+  UINT32 Size() const { return static_cast<UINT32>(format_buffer_.size()); }
+
+ private:
+  std::vector<uint8_t> format_buffer_;
+};
+
+}  // namespace.
+
+scoped_ptr<MediaTransform> CreateAudioTransform(
+    const SbMediaAudioSampleInfo& audio,
+    SbMediaAudioCodec codec) {
+  ComPtr<IMFTransform> transform;
+  HRESULT hr = CreateDecoderTransform(CLSID_MSAACDecMFT, &transform);
+  CheckResult(hr);
+
+  ComPtr<IMFMediaType> input_type;
+  hr = MFCreateMediaType(&input_type);
+  CheckResult(hr);
+
+  WinAudioFormat audio_fmt(audio);
+  hr = MFInitMediaTypeFromWaveFormatEx(
+      input_type.Get(), audio_fmt.WaveFormatData(), audio_fmt.Size());
+  CheckResult(hr);
+
+  GUID win32_audio_type = ConvertToWin32AudioCodec(codec);
+
+  std::vector<ComPtr<IMFMediaType>> available_types =
+      GetAllInputMediaTypes(MediaTransform::kStreamId, transform.Get());
+
+  available_types = FilterMediaBySubType(available_types, win32_audio_type);
+  SB_DCHECK(available_types.size());
+
+  ComPtr<IMFMediaType> selected = available_types[0];
+  CopyProperties(input_type.Get(), selected.Get());
+
+  scoped_ptr<MediaTransform> output(new MediaTransform(transform));
+  output->SetInputType(selected);
+  output->SetOutputTypeBySubType(MFAudioFormat_Float);
+
+  return output.Pass();
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/audio_transform.h b/starboard/shared/win32/audio_transform.h
new file mode 100644
index 0000000..9087d96
--- /dev/null
+++ b/starboard/shared/win32/audio_transform.h
@@ -0,0 +1,34 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_AUDIO_TRANSFORM_H_
+#define STARBOARD_SHARED_WIN32_AUDIO_TRANSFORM_H_
+
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/media.h"
+#include "starboard/shared/win32/media_transform.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+scoped_ptr<MediaTransform> CreateAudioTransform(
+    const SbMediaAudioSampleInfo& audio,
+    SbMediaAudioCodec codec);
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_AUDIO_TRANSFORM_H_
diff --git a/starboard/shared/win32/auto_event_handle.h b/starboard/shared/win32/auto_event_handle.h
new file mode 100644
index 0000000..b971d87
--- /dev/null
+++ b/starboard/shared/win32/auto_event_handle.h
@@ -0,0 +1,57 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_AUTO_EVENT_HANDLE_H_
+#define STARBOARD_SHARED_WIN32_AUTO_EVENT_HANDLE_H_
+
+#include <winsock2.h>
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+class AutoEventHandle {
+ public:
+  explicit AutoEventHandle(WSAEVENT event) : event_(event) {}
+
+  ~AutoEventHandle() { CleanupExistingEvent(); }
+
+  void Reset(WSAEVENT new_event) {
+    CleanupExistingEvent();
+    event_ = new_event;
+  }
+
+  bool IsValid() const { return event_ != WSA_INVALID_EVENT; }
+
+  WSAEVENT GetEvent() { return event_; }
+
+ private:
+  AutoEventHandle(const AutoEventHandle&) = delete;
+  AutoEventHandle& operator=(const AutoEventHandle&) = delete;
+
+  void CleanupExistingEvent() {
+    if (IsValid()) {
+      WSACloseEvent(event_);
+      event_ = WSA_INVALID_EVENT;
+    }
+  }
+
+  WSAEVENT event_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_AUTO_EVENT_HANDLE_H_
diff --git a/starboard/shared/win32/byte_swap.cc b/starboard/shared/win32/byte_swap.cc
new file mode 100644
index 0000000..2bf8c77
--- /dev/null
+++ b/starboard/shared/win32/byte_swap.cc
@@ -0,0 +1,44 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Not breaking these functions up because however one is implemented, the
+// others should be implemented similarly.
+
+#include "starboard/common/byte_swap.h"
+
+#include <stdlib.h>
+
+int16_t SbByteSwapS16(int16_t value) {
+  return _byteswap_ushort(value);
+}
+
+uint16_t SbByteSwapU16(uint16_t value) {
+  return _byteswap_ushort(value);
+}
+
+int32_t SbByteSwapS32(int32_t value) {
+  return _byteswap_ulong(value);
+}
+
+uint32_t SbByteSwapU32(uint32_t value) {
+  return _byteswap_ulong(value);
+}
+
+int64_t SbByteSwapS64(int64_t value) {
+  return _byteswap_uint64(value);
+}
+
+uint64_t SbByteSwapU64(uint64_t value) {
+  return _byteswap_uint64(value);
+}
diff --git a/starboard/shared/win32/condition_variable_broadcast.cc b/starboard/shared/win32/condition_variable_broadcast.cc
new file mode 100644
index 0000000..283887d
--- /dev/null
+++ b/starboard/shared/win32/condition_variable_broadcast.cc
@@ -0,0 +1,27 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/condition_variable.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/types_internal.h"
+
+bool SbConditionVariableBroadcast(SbConditionVariable* condition) {
+  if (!condition) {
+    return false;
+  }
+  WakeAllConditionVariable(SB_WIN32_INTERNAL_CONDITION(condition));
+  return true;
+}
diff --git a/starboard/shared/win32/condition_variable_create.cc b/starboard/shared/win32/condition_variable_create.cc
new file mode 100644
index 0000000..6bc8eae
--- /dev/null
+++ b/starboard/shared/win32/condition_variable_create.cc
@@ -0,0 +1,31 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/condition_variable.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/types_internal.h"
+
+bool SbConditionVariableCreate(SbConditionVariable* out_condition,
+                               SbMutex* opt_mutex) {
+  SB_COMPILE_ASSERT(sizeof(SbConditionVariable) >= sizeof(CONDITION_VARIABLE),
+                    condition_variable_larger_than_sb_condition_variable);
+  if (!out_condition) {
+    return false;
+  }
+  InitializeConditionVariable(SB_WIN32_INTERNAL_CONDITION(out_condition));
+  return true;
+}
diff --git a/starboard/shared/win32/condition_variable_destroy.cc b/starboard/shared/win32/condition_variable_destroy.cc
new file mode 100644
index 0000000..f274855
--- /dev/null
+++ b/starboard/shared/win32/condition_variable_destroy.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/condition_variable.h"
+
+#include <windows.h>
+
+bool SbConditionVariableDestroy(SbConditionVariable* condition) {
+  if (!condition) {
+    return false;
+  }
+  return true;
+}
diff --git a/starboard/shared/win32/condition_variable_signal.cc b/starboard/shared/win32/condition_variable_signal.cc
new file mode 100644
index 0000000..4653d6f
--- /dev/null
+++ b/starboard/shared/win32/condition_variable_signal.cc
@@ -0,0 +1,27 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/condition_variable.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/types_internal.h"
+
+bool SbConditionVariableSignal(SbConditionVariable* condition) {
+  if (!condition) {
+    return false;
+  }
+  WakeConditionVariable(SB_WIN32_INTERNAL_CONDITION(condition));
+  return true;
+}
diff --git a/starboard/shared/win32/condition_variable_wait.cc b/starboard/shared/win32/condition_variable_wait.cc
new file mode 100644
index 0000000..d90dc89
--- /dev/null
+++ b/starboard/shared/win32/condition_variable_wait.cc
@@ -0,0 +1,32 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/condition_variable.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/types_internal.h"
+
+SbConditionVariableResult SbConditionVariableWait(
+    SbConditionVariable* condition,
+    SbMutex* mutex) {
+  if (!condition || !mutex) {
+    return kSbConditionVariableFailed;
+  }
+  bool result =
+      SleepConditionVariableSRW(SB_WIN32_INTERNAL_CONDITION(condition),
+                                SB_WIN32_INTERNAL_MUTEX(mutex), INFINITE, 0);
+
+  return result ? kSbConditionVariableSignaled : kSbConditionVariableFailed;
+}
diff --git a/starboard/shared/win32/condition_variable_wait_timed.cc b/starboard/shared/win32/condition_variable_wait_timed.cc
new file mode 100644
index 0000000..bfa48f5
--- /dev/null
+++ b/starboard/shared/win32/condition_variable_wait_timed.cc
@@ -0,0 +1,54 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/condition_variable.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/time_utils.h"
+#include "starboard/shared/win32/types_internal.h"
+
+using starboard::shared::win32::ConvertSbTimeToMillisRoundUp;
+
+SbConditionVariableResult SbConditionVariableWaitTimed(
+    SbConditionVariable* condition,
+    SbMutex* mutex,
+    SbTime timeout) {
+  if (!condition || !mutex) {
+    return kSbConditionVariableFailed;
+  }
+
+  if (timeout < 0) {
+    timeout = 0;
+  }
+  bool result = SleepConditionVariableSRW(
+      SB_WIN32_INTERNAL_CONDITION(condition), SB_WIN32_INTERNAL_MUTEX(mutex),
+      ConvertSbTimeToMillisRoundUp(timeout), 0);
+
+  if (timeout == 0) {
+    // Per documentation, "If the |timeout_duration| value is less than
+    // or equal to zero, the function returns as quickly as possible with a
+    // kSbConditionVariableTimedOut result."
+    return kSbConditionVariableTimedOut;
+  }
+
+  if (result) {
+    return kSbConditionVariableSignaled;
+  }
+
+  if (GetLastError() == ERROR_TIMEOUT) {
+    return kSbConditionVariableTimedOut;
+  }
+  return kSbConditionVariableFailed;
+}
diff --git a/starboard/shared/win32/configuration.cc b/starboard/shared/win32/configuration.cc
new file mode 100644
index 0000000..9e41cbf
--- /dev/null
+++ b/starboard/shared/win32/configuration.cc
@@ -0,0 +1,71 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/configuration.h"
+
+#include "cobalt/extension/configuration.h"
+#include "starboard/common/configuration_defaults.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+namespace {
+
+const char* CobaltFallbackSplashScreenUrl() {
+  return "file:///cobalt/browser/splash_screen/youtube_splash_screen.html";
+}
+
+const char* CobaltRasterizerType() {
+  // Use a hardware rasterizer and graphical setup.
+  return "hardware";
+}
+
+const CobaltExtensionConfigurationApi kConfigurationApi = {
+    kCobaltExtensionConfigurationName,
+    2,
+    &common::CobaltUserOnExitStrategyDefault,
+    &common::CobaltRenderDirtyRegionOnlyDefault,
+    &common::CobaltEglSwapIntervalDefault,
+    &CobaltFallbackSplashScreenUrl,
+    &common::CobaltEnableQuicDefault,
+    &common::CobaltSkiaCacheSizeInBytesDefault,
+    &common::CobaltOffscreenTargetCacheSizeInBytesDefault,
+    &common::CobaltEncodedImageCacheSizeInBytesDefault,
+    &common::CobaltImageCacheSizeInBytesDefault,
+    &common::CobaltLocalTypefaceCacheSizeInBytesDefault,
+    &common::CobaltRemoteTypefaceCacheSizeInBytesDefault,
+    &common::CobaltMeshCacheSizeInBytesDefault,
+    &common::CobaltSoftwareSurfaceCacheSizeInBytesDefault,
+    &common::CobaltImageCacheCapacityMultiplierWhenPlayingVideoDefault,
+    &common::CobaltSkiaGlyphAtlasWidthDefault,
+    &common::CobaltSkiaGlyphAtlasHeightDefault,
+    &common::CobaltJsGarbageCollectionThresholdInBytesDefault,
+    &common::CobaltReduceCpuMemoryByDefault,
+    &common::CobaltReduceGpuMemoryByDefault,
+    &common::CobaltGcZealDefault,
+    &CobaltRasterizerType,
+    &common::CobaltEnableJitDefault,
+    &common::CobaltFallbackSplashScreenTopicsDefault,
+};
+
+}  // namespace
+
+const void* GetConfigurationApi() {
+  return &kConfigurationApi;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/configuration.h b/starboard/shared/win32/configuration.h
new file mode 100644
index 0000000..390b35e
--- /dev/null
+++ b/starboard/shared/win32/configuration.h
@@ -0,0 +1,28 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_CONFIGURATION_H_
+#define STARBOARD_SHARED_WIN32_CONFIGURATION_H_
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+const void* GetConfigurationApi();
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_CONFIGURATION_H_
diff --git a/starboard/shared/win32/decode_target_internal.cc b/starboard/shared/win32/decode_target_internal.cc
new file mode 100644
index 0000000..88e7046
--- /dev/null
+++ b/starboard/shared/win32/decode_target_internal.cc
@@ -0,0 +1,60 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/decode_target_internal.h"
+
+#include "starboard/common/log.h"
+#include "starboard/common/memory.h"
+#include "starboard/configuration.h"
+
+SbDecodeTargetPrivate::SbDecodeTargetPrivate() : refcount(1) {
+  memset(&info, 0, sizeof(info));
+}
+
+void SbDecodeTargetPrivate::AddRef() {
+  SbAtomicBarrier_Increment(&refcount, 1);
+}
+
+void SbDecodeTargetPrivate::Release() {
+  int new_count = SbAtomicBarrier_Increment(&refcount, -1);
+  SB_DCHECK(new_count >= 0);
+  if (new_count == 0) {
+    delete this;
+  }
+}
+
+void SbDecodeTargetRelease(SbDecodeTarget decode_target) {
+  if (SbDecodeTargetIsValid(decode_target)) {
+    decode_target->Release();
+  }
+}
+
+SbDecodeTargetFormat SbDecodeTargetGetFormat(SbDecodeTarget decode_target) {
+  // Note that kSbDecodeTargetFormat2PlaneYUVNV12 represents DXGI_FORMAT_NV12.
+  // kSbDecodeTargetFormat1PlaneRGBA represents DXGI_FORMAT_R10G10B10A2_UNORM.
+  SB_DCHECK(kSbDecodeTargetFormat2PlaneYUVNV12 == decode_target->info.format ||
+            kSbDecodeTargetFormat1PlaneRGBA == decode_target->info.format);
+  return decode_target->info.format;
+}
+
+bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target,
+                           SbDecodeTargetInfo* out_info) {
+  if (!out_info ||
+      !starboard::common::MemoryIsZero(out_info, sizeof(*out_info))) {
+    SB_DCHECK(false) << "out_info must be zeroed out.";
+    return false;
+  }
+  memcpy(out_info, &decode_target->info, sizeof(*out_info));
+  return true;
+}
diff --git a/starboard/shared/win32/decode_target_internal.h b/starboard/shared/win32/decode_target_internal.h
new file mode 100644
index 0000000..0f1e077
--- /dev/null
+++ b/starboard/shared/win32/decode_target_internal.h
@@ -0,0 +1,34 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_DECODE_TARGET_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_DECODE_TARGET_INTERNAL_H_
+
+#include "starboard/atomic.h"
+#include "starboard/decode_target.h"
+
+struct SbDecodeTargetPrivate {
+  SbAtomic32 refcount;
+
+  // Publicly accessible information about the decode target.
+  SbDecodeTargetInfo info;
+
+  SbDecodeTargetPrivate();
+  virtual ~SbDecodeTargetPrivate() {}
+
+  void AddRef();
+  void Release();
+};
+
+#endif  // STARBOARD_SHARED_WIN32_DECODE_TARGET_INTERNAL_H_
diff --git a/starboard/shared/win32/decrypting_decoder.cc b/starboard/shared/win32/decrypting_decoder.cc
new file mode 100644
index 0000000..9cb884f
--- /dev/null
+++ b/starboard/shared/win32/decrypting_decoder.cc
@@ -0,0 +1,362 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/decrypting_decoder.h"
+
+#include <algorithm>
+#include <numeric>
+
+#include "starboard/common/byte_swap.h"
+#include "starboard/common/log.h"
+#include "starboard/common/memory.h"
+#include "starboard/common/ref_counted.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/media_foundation_utils.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+namespace {
+
+ComPtr<IMFSample> CreateSample(const void* data,
+                               int size,
+                               int64_t win32_timestamp) {
+  ComPtr<IMFMediaBuffer> buffer;
+  HRESULT hr = MFCreateMemoryBuffer(size, &buffer);
+  CheckResult(hr);
+
+  BYTE* buffer_ptr;
+  hr = buffer->Lock(&buffer_ptr, 0, 0);
+  CheckResult(hr);
+
+  memcpy(buffer_ptr, data, size);
+
+  hr = buffer->Unlock();
+  CheckResult(hr);
+
+  hr = buffer->SetCurrentLength(size);
+  CheckResult(hr);
+
+  ComPtr<IMFSample> input;
+  hr = MFCreateSample(&input);
+  CheckResult(hr);
+
+  hr = input->AddBuffer(buffer.Get());
+  CheckResult(hr);
+
+  // sample time is in 100 nanoseconds.
+  input->SetSampleTime(win32_timestamp);
+  return input;
+}
+
+void AttachDrmDataToSample(ComPtr<IMFSample> sample,
+                           int sample_size,
+                           const uint8_t* key_id,
+                           int key_id_size,
+                           const uint8_t* iv,
+                           int iv_size,
+                           const SbDrmSubSampleMapping* subsample_mapping,
+                           int subsample_count) {
+  if (iv_size == 16 && ::starboard::common::MemoryIsZero(iv + 8, 8)) {
+    // For iv that is 16 bytes long but the the last 8 bytes is 0, we treat
+    // it as an 8 bytes iv.
+    iv_size = 8;
+  }
+  sample->SetBlob(MFSampleExtension_Encryption_SampleID,
+                  reinterpret_cast<const UINT8*>(iv),
+                  static_cast<UINT32>(iv_size));
+  SB_DCHECK(key_id_size == sizeof(GUID));
+  GUID guid = *reinterpret_cast<const GUID*>(key_id);
+
+  guid.Data1 = SbByteSwapU32(guid.Data1);
+  guid.Data2 = SbByteSwapU16(guid.Data2);
+  guid.Data3 = SbByteSwapU16(guid.Data3);
+
+  sample->SetGUID(MFSampleExtension_Content_KeyID, guid);
+
+  SB_DCHECK(sizeof(DWORD) * 2 == sizeof(SbDrmSubSampleMapping));
+
+  SbDrmSubSampleMapping default_subsample = {0, sample_size};
+  if (subsample_count == 0) {
+    subsample_mapping = &default_subsample;
+    subsample_count = 1;
+  }
+  sample->SetBlob(
+      MFSampleExtension_Encryption_SubSampleMappingSplit,
+      reinterpret_cast<const UINT8*>(subsample_mapping),
+      static_cast<UINT32>(subsample_count * sizeof(SbDrmSubSampleMapping)));
+}
+
+}  // namespace
+
+DecryptingDecoder::DecryptingDecoder(const std::string& type,
+                                     scoped_ptr<MediaTransform> decoder,
+                                     SbDrmSystem drm_system)
+    : type_(type), decoder_(decoder.Pass()) {
+  SB_DCHECK(decoder_.get());
+  drm_system_ = static_cast<DrmSystemPlayready*>(drm_system);
+}
+
+DecryptingDecoder::~DecryptingDecoder() {
+  Reset();
+}
+
+bool DecryptingDecoder::TryWriteInputBuffer(
+    const scoped_refptr<InputBuffer>& input_buffer,
+    int bytes_to_skip_in_sample) {
+  SB_DCHECK(input_buffer);
+  SB_DCHECK(bytes_to_skip_in_sample >= 0);
+
+  ComPtr<IMFSample> input_sample;
+
+  const SbDrmSampleInfo* drm_info = input_buffer->drm_info();
+  const uint8_t* key_id = NULL;
+  int key_id_size = 0;
+  bool encrypted = false;
+
+  if (drm_info != NULL && drm_info->identifier_size == 16 &&
+      (drm_info->initialization_vector_size == 8 ||
+       drm_info->initialization_vector_size == 16)) {
+    key_id = drm_info->identifier;
+    key_id_size = drm_info->identifier_size;
+    encrypted = true;
+  }
+
+  if (input_buffer == last_input_buffer_) {
+    SB_DCHECK(last_input_sample_);
+    input_sample = last_input_sample_;
+  } else {
+    if (input_buffer->size() < bytes_to_skip_in_sample) {
+      SB_NOTREACHED();
+      return false;
+    }
+
+    const void* data = input_buffer->data() + bytes_to_skip_in_sample;
+    int size = input_buffer->size() - bytes_to_skip_in_sample;
+
+    std::int64_t win32_timestamp =
+        ConvertToWin32Time(input_buffer->timestamp());
+    const uint8_t* iv = NULL;
+    int iv_size = 0;
+    const SbDrmSubSampleMapping* subsample_mapping = NULL;
+    int subsample_count = 0;
+
+    if (drm_info != NULL && drm_info->initialization_vector_size != 0) {
+      if (bytes_to_skip_in_sample != 0) {
+        if (drm_info->subsample_count != 0 && drm_info->subsample_count != 1) {
+          return false;
+        }
+        if (drm_info->subsample_count == 1) {
+          if (drm_info->subsample_mapping[0].clear_byte_count !=
+              bytes_to_skip_in_sample) {
+            return false;
+          }
+        }
+      } else {
+        subsample_mapping = drm_info->subsample_mapping;
+        subsample_count = drm_info->subsample_count;
+      }
+
+      iv = drm_info->initialization_vector;
+      iv_size = drm_info->initialization_vector_size;
+    }
+
+    // MFSampleExtension_CleanPoint is a key-frame for the video + audio. It is
+    // not set here because the win32 system is smart enough to figure this out.
+    // It will probably be totally ok to not set this at all. Resolution: If
+    // there are problems with win32 video decoding, come back to this and see
+    // if setting this will fix it. THis will be used if
+    // SbMediaVideoSampleInfo::is_key_frame is true inside of the this function
+    // (which will receive an InputBuffer).
+    input_sample = CreateSample(data, size, win32_timestamp);
+
+    if (encrypted) {
+      AttachDrmDataToSample(input_sample, size, key_id, key_id_size, iv,
+                            iv_size, subsample_mapping, subsample_count);
+    }
+    last_input_buffer_ = input_buffer;
+    last_input_sample_ = input_sample;
+  }
+
+  if (encrypted) {
+    if (!decryptor_) {
+      if (decoder_->draining()) {
+        return false;
+      }
+      if (!decoder_->drained()) {
+        decoder_->Drain();
+        return false;
+      }
+      decoder_->ResetFromDrained();
+      scoped_refptr<DrmSystemPlayready::License> license =
+          drm_system_->GetLicense(key_id, key_id_size);
+      if (license && license->usable()) {
+        decryptor_.reset(new MediaTransform(license->decryptor()));
+        bool success = ActivateDecryptor();
+        if (!success) {
+          decryptor_.reset();
+          return false;
+        }
+      }
+    }
+    if (!decryptor_) {
+      SB_NOTREACHED();
+      return false;
+    }
+  }
+
+  if (encrypted) {
+    return decryptor_->TryWrite(input_sample);
+  }
+  return decoder_->TryWrite(input_sample);
+}
+
+bool DecryptingDecoder::ProcessAndRead(ComPtr<IMFSample>* output,
+                                       ComPtr<IMFMediaType>* new_type) {
+  bool did_something = false;
+
+  *output = decoder_->TryRead(new_type);
+  did_something |= *output != NULL;
+
+  if (decryptor_) {
+    if (!pending_decryptor_output_) {
+      ComPtr<IMFMediaType> ignored_type;
+      pending_decryptor_output_ = decryptor_->TryRead(&ignored_type);
+      did_something |= pending_decryptor_output_ != NULL;
+    }
+
+    if (pending_decryptor_output_) {
+      if (decoder_->TryWrite(pending_decryptor_output_)) {
+        pending_decryptor_output_.Reset();
+        did_something = true;
+      }
+    }
+
+    if (decryptor_->drained() && !decoder_->draining() &&
+        !decoder_->drained()) {
+      decoder_->Drain();
+      did_something = true;
+    }
+  }
+
+  return did_something;
+}
+
+void DecryptingDecoder::Drain() {
+  if (decryptor_) {
+    decryptor_->Drain();
+  } else {
+    decoder_->Drain();
+  }
+}
+
+bool DecryptingDecoder::ActivateDecryptor() {
+  SB_DCHECK(decryptor_);
+
+  ComPtr<IMFMediaType> decoder_output_type = decoder_->GetCurrentOutputType();
+  decryptor_->SetInputType(decoder_->GetCurrentInputType());
+
+  GUID original_sub_type;
+  decoder_output_type->GetGUID(MF_MT_SUBTYPE, &original_sub_type);
+
+  // Ensure that the decryptor and the decoder agrees on the protection of
+  // samples transferred between them.
+  ComPtr<IMFSampleProtection> decryption_sample_protection =
+      decryptor_->GetSampleProtection();
+  SB_DCHECK(decryption_sample_protection);
+
+  DWORD decryption_protection_version;
+  HRESULT hr = decryption_sample_protection->GetOutputProtectionVersion(
+      &decryption_protection_version);
+  CheckResult(hr);
+
+  ComPtr<IMFSampleProtection> decoder_sample_protection =
+      decoder_->GetSampleProtection();
+  SB_DCHECK(decoder_sample_protection);
+
+  DWORD decoder_protection_version;
+  hr = decoder_sample_protection->GetInputProtectionVersion(
+      &decoder_protection_version);
+  CheckResult(hr);
+
+  DWORD protection_version =
+      std::min(decoder_protection_version, decryption_protection_version);
+  if (protection_version < SAMPLE_PROTECTION_VERSION_RC4) {
+    SB_NOTREACHED();
+    return true;
+  }
+
+  BYTE* cert_data = NULL;
+  DWORD cert_data_size = 0;
+
+  hr = decoder_sample_protection->GetProtectionCertificate(
+      protection_version, &cert_data, &cert_data_size);
+  CheckResult(hr);
+
+  BYTE* crypt_seed = NULL;
+  DWORD crypt_seed_size = 0;
+  hr = decryption_sample_protection->InitOutputProtection(
+      protection_version, 0, cert_data, cert_data_size, &crypt_seed,
+      &crypt_seed_size);
+  if (FAILED(hr)) {
+    // This can happen if we call InitOutputProtection while processing
+    // a UWP resume event or shortly after.
+    return false;
+  }
+  CheckResult(hr);
+
+  hr = decoder_sample_protection->InitInputProtection(
+      protection_version, 0, crypt_seed, crypt_seed_size);
+  CheckResult(hr);
+
+  CoTaskMemFree(cert_data);
+  CoTaskMemFree(crypt_seed);
+
+  // Ensure that the input type of the decoder is the output type of the
+  // decryptor.
+  ComPtr<IMFMediaType> decoder_input_type;
+  std::vector<ComPtr<IMFMediaType>> decryptor_output_types =
+      decryptor_->GetAvailableOutputTypes();
+  SB_DCHECK(!decryptor_output_types.empty());
+
+  decryptor_->SetOutputType(decryptor_output_types[0]);
+  decoder_->SetInputType(decryptor_output_types[0]);
+
+  std::vector<ComPtr<IMFMediaType>> decoder_output_types =
+      decoder_->GetAvailableOutputTypes();
+  for (auto output_type : decoder_output_types) {
+    GUID sub_type;
+    output_type->GetGUID(MF_MT_SUBTYPE, &sub_type);
+    if (IsEqualGUID(sub_type, original_sub_type)) {
+      decoder_->SetOutputType(output_type);
+      return true;
+    }
+  }
+  return true;
+}
+
+void DecryptingDecoder::Reset() {
+  if (decryptor_) {
+    decryptor_->Reset();
+  }
+  decoder_->Reset();
+
+  last_input_buffer_ = nullptr;
+  last_input_sample_ = nullptr;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/decrypting_decoder.h b/starboard/shared/win32/decrypting_decoder.h
new file mode 100644
index 0000000..6ac9d62
--- /dev/null
+++ b/starboard/shared/win32/decrypting_decoder.h
@@ -0,0 +1,85 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_DECRYPTING_DECODER_H_
+#define STARBOARD_SHARED_WIN32_DECRYPTING_DECODER_H_
+
+#include <D3D11.h>
+#include <mfapi.h>
+#include <mferror.h>
+#include <mfidl.h>
+#include <wrl\client.h>
+
+#include <string>
+#include <vector>
+
+#include "starboard/common/ref_counted.h"
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/drm.h"
+#include "starboard/media.h"
+#include "starboard/shared/win32/drm_system_playready.h"
+#include "starboard/shared/win32/media_common.h"
+#include "starboard/shared/win32/media_transform.h"
+#include "starboard/types.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// This class maintains a MediaTransform based decoding stream.  When the
+// stream is encrypted, it also contains a MediaTransform based decryptor and
+// manages the interaction between the decryptor and the decoder.
+class DecryptingDecoder {
+ public:
+  DecryptingDecoder(const std::string& type,
+                    scoped_ptr<MediaTransform> decoder,
+                    SbDrmSystem drm_system);
+  ~DecryptingDecoder();
+
+  MediaTransform* GetDecoder() { return decoder_.get(); }
+
+  bool TryWriteInputBuffer(const scoped_refptr<InputBuffer>& input_buffer,
+                           int bytes_to_skip_in_sample);
+
+  // Return true if there is any internal actions succeeded, this implies that
+  // the caller can call this function again to process further.
+  // |output| contains the decrypted and decoded output if there is any.
+  // |new_type| contains the new output type in case the output type of the
+  // decoding stream is changed.
+  bool ProcessAndRead(ComPtr<IMFSample>* output,
+                      ComPtr<IMFMediaType>* new_type);
+  void Drain();
+  void Reset();
+
+ private:
+  bool ActivateDecryptor();
+
+  // TODO: Clarify the thread pattern of this class.
+  const std::string type_;  // For debugging purpose.
+  DrmSystemPlayready* drm_system_;
+
+  scoped_ptr<MediaTransform> decryptor_;
+  scoped_ptr<MediaTransform> decoder_;
+
+  scoped_refptr<InputBuffer> last_input_buffer_;
+  ComPtr<IMFSample> last_input_sample_;
+
+  ComPtr<IMFSample> pending_decryptor_output_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_DECRYPTING_DECODER_H_
diff --git a/starboard/shared/win32/dialog.cc b/starboard/shared/win32/dialog.cc
new file mode 100644
index 0000000..1fafa5f
--- /dev/null
+++ b/starboard/shared/win32/dialog.cc
@@ -0,0 +1,252 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/dialog.h"
+
+#include <windef.h>
+#include <windows.h>
+#include <windowsx.h>
+
+#include <functional>
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+typedef std::function<void()> DialogCallback;
+
+using starboard::shared::win32::DebugLogWinError;
+using starboard::shared::win32::CStringToWString;
+
+namespace {
+HWND g_current_dialog_handle = nullptr;
+DialogCallback g_ok_callback;
+DialogCallback g_cancel_callback;
+}  // namespace
+
+// Wraps the win32 Dialog interface for building Dialogs at runtime.
+// https://blogs.msdn.microsoft.com/oldnewthing/20050429-00/?p=35743
+class DialogTemplateBuilder {
+ public:
+  LPCDLGTEMPLATE BuildTemplate() { return (LPCDLGTEMPLATE)&v[0]; }
+  void AlignToDword() {
+    if (v.size() % 4)
+      Write(NULL, 4 - (v.size() % 4));
+  }
+  void Write(LPCVOID pvWrite, DWORD cbWrite) {
+    v.insert(v.end(), cbWrite, 0);
+    if (pvWrite)
+      CopyMemory(&v[v.size() - cbWrite], pvWrite, cbWrite);
+  }
+  template <typename T>
+  void Write(T t) {
+    Write(&t, sizeof(T));
+  }
+  void WriteString(LPCWSTR psz) {
+    Write(psz, (lstrlenW(psz) + 1) * sizeof(WCHAR));
+  }
+
+ private:
+  std::vector<BYTE> v;
+};
+
+INT_PTR CALLBACK DialogProcedureCallback(HWND dialog_handle,
+                                         UINT message,
+                                         WPARAM w_param,
+                                         LPARAM l_param) {
+  SB_CHECK(!g_current_dialog_handle || dialog_handle == g_current_dialog_handle)
+      << "Received callback on non-active dialog! Only one dialog at a time is "
+         "supported.";
+  switch (message) {
+    case WM_INITDIALOG:
+      return TRUE;
+    case WM_COMMAND:
+      auto command_id = GET_WM_COMMAND_ID(w_param, l_param);
+      if (command_id == IDCANCEL) {
+        g_cancel_callback();
+      } else if (command_id == IDOK) {
+        g_ok_callback();
+      } else {
+        return FALSE;
+      }
+      EndDialog(dialog_handle, 0);
+      g_current_dialog_handle = nullptr;
+      return TRUE;
+  }
+  return FALSE;
+}
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+bool ShowOkCancelDialog(HWND hwnd,
+                        const std::string& title,
+                        const std::string& message,
+                        const std::string& ok_message,
+                        DialogCallback ok_callback,
+                        const std::string& cancel_message,
+                        DialogCallback cancel_callback) {
+  if (g_current_dialog_handle != nullptr) {
+    SB_LOG(WARNING) << "Already showing a dialog; cancelling existing and "
+                       "replacing with new dialog";
+    CancelDialog();
+  }
+  g_ok_callback = ok_callback;
+  g_cancel_callback = cancel_callback;
+  // Get the device context (DC) and from the system so we can scale our fonts
+  // correctly.
+  HDC hdc = GetDC(NULL);
+  SB_CHECK(hdc);
+  NONCLIENTMETRICSW ncm = {sizeof(ncm)};
+  bool retrieved_system_params =
+      SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
+
+  if (!retrieved_system_params) {
+    DebugLogWinError();
+    ReleaseDC(NULL, hdc);
+    return false;
+  }
+  DialogTemplateBuilder dialog_template;
+  const int help_id = 0;
+  const int extended_style = 0;
+
+  const int window_width = 200;
+  const int window_height = 80;
+  const int window_x = 32;
+  const int window_y = 32;
+
+  const int edge_padding = 7;
+
+  const int button_height = 14;
+  const int button_width = 50;
+  const int button_y = window_height - button_height - edge_padding;
+  const int left_button_x = window_width / 2 - button_width - edge_padding / 2;
+  const int right_button_x = window_width / 2 + edge_padding / 2;
+  const int text_width = window_width - edge_padding * 2;
+  const int text_height = window_width - edge_padding * 3 - button_height;
+  const int extra_data = 0;
+
+  // Create a dialog template.
+  // The following MSDN blogposts explains how this is all laid out:
+  // https://blogs.msdn.microsoft.com/oldnewthing/20040623-00/?p=38753
+  // https://blogs.msdn.microsoft.com/oldnewthing/20050429-00/?p=35743
+  // More official documentation:
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644996(v=vs.85).aspx#modeless_box
+  dialog_template.Write<WORD>(1);       // dialog version
+  dialog_template.Write<WORD>(0xFFFF);  // extended dialog template
+  dialog_template.Write<DWORD>(help_id);
+  dialog_template.Write<DWORD>(extended_style);
+  dialog_template.Write<DWORD>(WS_CAPTION | WS_SYSMENU | DS_SETFONT |
+                               DS_MODALFRAME);
+  dialog_template.Write<WORD>(3);  // number of controls
+  dialog_template.Write<WORD>(window_x);
+  dialog_template.Write<WORD>(window_y);
+  dialog_template.Write<WORD>(window_width);
+  dialog_template.Write<WORD>(window_height);
+  dialog_template.WriteString(L"");  // no menu
+  dialog_template.WriteString(L"");  // default dialog class
+  // Title.
+  dialog_template.WriteString(
+      (LPCWSTR)starboard::shared::win32::CStringToWString(title.c_str())
+          .c_str());
+
+  // See following for info on how the font styling is calculated:
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/ff684173(v=vs.85).aspx
+  if (ncm.lfMessageFont.lfHeight < 0) {
+    ncm.lfMessageFont.lfHeight =
+        -MulDiv(ncm.lfMessageFont.lfHeight, 72, GetDeviceCaps(hdc, LOGPIXELSY));
+  }
+  dialog_template.Write<WORD>((WORD)ncm.lfMessageFont.lfHeight);
+  dialog_template.Write<WORD>((WORD)ncm.lfMessageFont.lfWeight);
+  dialog_template.Write<BYTE>(ncm.lfMessageFont.lfItalic);
+  dialog_template.Write<BYTE>(ncm.lfMessageFont.lfCharSet);
+  dialog_template.WriteString(ncm.lfMessageFont.lfFaceName);
+
+  // Message text.
+  dialog_template.AlignToDword();
+  dialog_template.Write<DWORD>(help_id);
+  dialog_template.Write<DWORD>(extended_style);
+  dialog_template.Write<DWORD>(WS_CHILD | WS_VISIBLE);
+  dialog_template.Write<WORD>(edge_padding);
+  dialog_template.Write<WORD>(edge_padding);
+  dialog_template.Write<WORD>(text_width);
+  dialog_template.Write<WORD>(text_height);
+  dialog_template.Write<DWORD>((DWORD)-1);
+  dialog_template.Write<DWORD>(0x0082FFFF);
+  dialog_template.WriteString(
+      (LPCWSTR)starboard::shared::win32::CStringToWString(message.c_str())
+          .c_str());
+  dialog_template.Write<WORD>(extra_data);
+
+  // Cancel button.
+  dialog_template.AlignToDword();
+  dialog_template.Write<DWORD>(help_id);
+  dialog_template.Write<DWORD>(extended_style);
+  dialog_template.Write<DWORD>(WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP |
+                               BS_DEFPUSHBUTTON);
+  dialog_template.Write<WORD>(left_button_x);
+  dialog_template.Write<WORD>(button_y);
+  dialog_template.Write<WORD>(button_width);
+  dialog_template.Write<WORD>(button_height);
+  dialog_template.Write<DWORD>(IDCANCEL);
+  dialog_template.Write<DWORD>(0x0080FFFF);
+  dialog_template.WriteString(
+      (LPCWSTR)starboard::shared::win32::CStringToWString(
+          cancel_message.c_str())
+          .c_str());
+  dialog_template.Write<WORD>(extra_data);
+
+  // Ok button.
+  dialog_template.AlignToDword();
+  dialog_template.Write<DWORD>(help_id);
+  dialog_template.Write<DWORD>(extended_style);
+  dialog_template.Write<DWORD>(WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP |
+                               BS_DEFPUSHBUTTON);  // style
+  dialog_template.Write<WORD>(right_button_x);
+  dialog_template.Write<WORD>(button_y);
+  dialog_template.Write<WORD>(button_width);
+  dialog_template.Write<WORD>(button_height);
+  dialog_template.Write<DWORD>(IDOK);
+  dialog_template.Write<DWORD>(0x0080FFFF);
+  dialog_template.WriteString(
+      (LPCWSTR)starboard::shared::win32::CStringToWString(ok_message.c_str())
+          .c_str());
+  dialog_template.Write<WORD>(extra_data);
+
+  ReleaseDC(NULL, hdc);
+  // Template is ready - go display it.
+  g_current_dialog_handle = CreateDialogIndirect(
+      GetModuleHandle(nullptr), dialog_template.BuildTemplate(), hwnd,
+      DialogProcedureCallback);
+  ShowWindow(g_current_dialog_handle, SW_SHOW);
+  return g_current_dialog_handle != nullptr;
+}
+
+bool DialogHandleMessage(MSG* msg) {
+  return IsWindow(g_current_dialog_handle) &&
+         IsDialogMessage(g_current_dialog_handle, msg);
+}
+
+void CancelDialog() {
+  if (g_current_dialog_handle != nullptr) {
+    EndDialog(g_current_dialog_handle, 0);
+    g_current_dialog_handle = nullptr;
+  }
+}
+
+}  //  namespace win32
+}  //  namespace shared
+}  //  namespace starboard
diff --git a/starboard/shared/win32/dialog.h b/starboard/shared/win32/dialog.h
new file mode 100644
index 0000000..cbff87e
--- /dev/null
+++ b/starboard/shared/win32/dialog.h
@@ -0,0 +1,48 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_DIALOG_H_
+#define STARBOARD_SHARED_WIN32_DIALOG_H_
+
+#include <windows.h>
+
+#include <functional>
+#include <string>
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+typedef std::function<void()> DialogCallback;
+
+// Shows a modeless OK/Cancel-style dialog. Only one dialog may be shown at a
+// time.
+bool ShowOkCancelDialog(HWND hwnd,
+                        const std::string& title,
+                        const std::string& message,
+                        const std::string& ok_message,
+                        DialogCallback ok_callback,
+                        const std::string& cancel_message,
+                        DialogCallback cancel_callback);
+
+// Cancels the current dialog that is showing, if there is one.
+void CancelDialog();
+
+bool DialogHandleMessage(MSG* msg);
+
+}  //  namespace win32
+}  //  namespace shared
+}  //  namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_DIALOG_H_
diff --git a/starboard/shared/win32/directory_can_open.cc b/starboard/shared/win32/directory_can_open.cc
new file mode 100644
index 0000000..338de21
--- /dev/null
+++ b/starboard/shared/win32/directory_can_open.cc
@@ -0,0 +1,53 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/directory.h"
+
+#include <windows.h>
+#include <algorithm>
+
+#include "starboard/shared/win32/directory_internal.h"
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+bool SbDirectoryCanOpen(const char* path) {
+  using starboard::shared::win32::IsAbsolutePath;
+  using starboard::shared::win32::IsValidHandle;
+  using starboard::shared::win32::NormalizeWin32Path;
+  using starboard::shared::win32::TrimExtraFileSeparators;
+
+  if ((path == nullptr) || (path[0] == '\0')) {
+    return false;
+  }
+
+  std::wstring path_wstring = NormalizeWin32Path(path);
+  TrimExtraFileSeparators(&path_wstring);
+
+  if (!IsAbsolutePath(path_wstring)) {
+    return false;
+  }
+
+  WIN32_FIND_DATA find_data = {0};
+
+  HANDLE search_handle = FindFirstFileExW(
+      path_wstring.c_str(), FindExInfoStandard, &find_data,
+      FindExSearchNameMatch, NULL, FIND_FIRST_EX_CASE_SENSITIVE);
+  if (!IsValidHandle(search_handle)) {
+    return false;
+  }
+
+  FindClose(search_handle);
+
+  return find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+}
diff --git a/starboard/shared/win32/directory_close.cc b/starboard/shared/win32/directory_close.cc
new file mode 100644
index 0000000..87d4e55
--- /dev/null
+++ b/starboard/shared/win32/directory_close.cc
@@ -0,0 +1,31 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/directory.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/directory_internal.h"
+
+bool SbDirectoryClose(SbDirectory directory) {
+  if (!SbDirectoryIsValid(directory)) {
+    return false;
+  }
+
+  bool success = CloseHandle(directory->directory_handle);
+
+  delete directory;
+
+  return success;
+}
diff --git a/starboard/shared/win32/directory_create.cc b/starboard/shared/win32/directory_create.cc
new file mode 100644
index 0000000..8dcaf41
--- /dev/null
+++ b/starboard/shared/win32/directory_create.cc
@@ -0,0 +1,43 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/directory.h"
+
+#include <vector>
+#include <windows.h>
+
+#include "starboard/shared/win32/directory_internal.h"
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+using starboard::shared::win32::DirectoryExists;
+using starboard::shared::win32::DirectoryExistsOrCreated;
+using starboard::shared::win32::IsAbsolutePath;
+using starboard::shared::win32::NormalizeWin32Path;
+using starboard::shared::win32::TrimExtraFileSeparators;
+
+bool SbDirectoryCreate(const char* path) {
+  if ((path == nullptr) || (path[0] == '\0')) {
+    return false;
+  }
+
+  std::wstring path_wstring = NormalizeWin32Path(path);
+  TrimExtraFileSeparators(&path_wstring);
+
+  if (!IsAbsolutePath(path_wstring)) {
+    return false;
+  }
+
+  return DirectoryExistsOrCreated(path_wstring);
+}
diff --git a/starboard/shared/win32/directory_get_next.cc b/starboard/shared/win32/directory_get_next.cc
new file mode 100644
index 0000000..e632610
--- /dev/null
+++ b/starboard/shared/win32/directory_get_next.cc
@@ -0,0 +1,97 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/directory.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/shared/win32/directory_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+namespace {
+// One of the entries of FILE_ID_BOTH_DIR_INFO is a file path, so make the
+// buffer at-least one path big.
+const std::size_t kDirectoryInfoBufferSize =
+    kSbFileMaxPath + sizeof(FILE_ID_BOTH_DIR_INFO);
+
+std::deque<std::string> GetDirectoryEntries(HANDLE directory_handle) {
+  // According to
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/aa364226(v=vs.85).aspx,
+  // FILE_ID_BOTH_DIR_INFO must be aligned on a DWORDLONG boundary.
+  alignas(sizeof(DWORDLONG)) std::vector<char> directory_info_buffer(
+      kDirectoryInfoBufferSize);
+
+  std::deque<std::string> entries;
+  BOOL directory_info_success = GetFileInformationByHandleEx(
+      directory_handle, FileIdBothDirectoryInfo, directory_info_buffer.data(),
+      static_cast<int>(directory_info_buffer.size()));
+
+  if (!directory_info_success) {
+    return entries;
+  }
+
+  const char* directory_info_pointer = directory_info_buffer.data();
+  DWORD next_entry_offset = 0;
+
+  do {
+    auto directory_info =
+        reinterpret_cast<const FILE_ID_BOTH_DIR_INFO*>(directory_info_pointer);
+
+    // FileName is in Unicode, so divide by 2 to get the real length.
+    DWORD number_characters_in_filename = directory_info->FileNameLength / 2;
+    std::string ascii_path = starboard::shared::win32::wchar_tToUTF8(
+        directory_info->FileName, number_characters_in_filename);
+    SB_DCHECK(ascii_path.size() == number_characters_in_filename);
+    bool is_dotted_directory =
+        !ascii_path.compare(".") || !ascii_path.compare("..");
+    if (!is_dotted_directory) {
+      entries.emplace_back(std::move(ascii_path));
+    }
+    next_entry_offset = directory_info->NextEntryOffset;
+    directory_info_pointer += next_entry_offset;
+  } while (next_entry_offset != 0);
+
+  return entries;
+}
+
+}  // namespace
+
+bool SbDirectoryGetNext(SbDirectory directory,
+                        char* out_entry,
+                        size_t out_entry_size) {
+  if (!SbDirectoryIsValid(directory) || out_entry == nullptr ||
+      out_entry_size < kSbFileMaxName) {
+    return false;
+  }
+
+  auto& next_directory_entries = directory->next_directory_entries;
+  if (next_directory_entries.empty()) {
+    next_directory_entries = GetDirectoryEntries(directory->directory_handle);
+  }
+
+  if (next_directory_entries.empty()) {
+    return false;
+  }
+
+  bool success = true;
+  if (starboard::strlcpy(out_entry, next_directory_entries.rbegin()->c_str(),
+                         static_cast<int>(out_entry_size)) >= out_entry_size) {
+    success = false;
+  }
+  directory->next_directory_entries.pop_back();
+  return success;
+}
diff --git a/starboard/shared/win32/directory_internal.cc b/starboard/shared/win32/directory_internal.cc
new file mode 100644
index 0000000..7c2190a
--- /dev/null
+++ b/starboard/shared/win32/directory_internal.cc
@@ -0,0 +1,106 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/directory_internal.h"
+
+#include "starboard/directory.h"
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/memory.h"
+#include "starboard/shared/internal_only.h"
+#include "starboard/shared/win32/file_internal.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+bool HasValidHandle(SbDirectory directory) {
+  if (!SbDirectoryIsValid(directory)) {
+    return false;
+  }
+  return directory->HasValidHandle();
+}
+
+// This function strips trailing file separators from a directory name.
+// For example if the directory name was "C:\\Temp\\\\\\", it would
+// strip them, so that the directory name is now to be "C:\\temp".
+void TrimExtraFileSeparators(std::wstring* dirname_pointer) {
+  SB_DCHECK(dirname_pointer);
+  std::wstring& dirname = *dirname_pointer;
+  auto new_end = std::find_if_not(
+      dirname.rbegin(), dirname.rend(),
+      [](wchar_t c) { return c == kSbFileSepChar || c == kSbFileAltSepChar; });
+  dirname.erase(new_end.base(), dirname.end());
+}
+
+bool IsAbsolutePath(const std::wstring& path) {
+  std::vector<wchar_t> full_path(kSbFileMaxPath);
+  DWORD full_path_size =
+      GetFullPathNameW(path.c_str(), static_cast<DWORD>(full_path.size()),
+                       full_path.data(), NULL);
+  if (full_path_size == 0) {
+    return false;
+  }
+
+  int path_size = static_cast<int>(path.size());
+  return CompareStringEx(LOCALE_NAME_USER_DEFAULT, NORM_IGNORECASE,
+                         path.c_str(), path_size, full_path.data(),
+                         full_path_size, NULL, NULL, 0) == CSTR_EQUAL;
+}
+
+bool DirectoryExists(const std::wstring& dir_path) {
+  if (dir_path.empty()) {
+    return false;
+  }
+  std::wstring norm_dir_path = NormalizeWin32Path(dir_path);
+  WIN32_FILE_ATTRIBUTE_DATA attribute_data = {0};
+  if (!GetFileAttributesExW(norm_dir_path.c_str(), GetFileExInfoStandard,
+                            &attribute_data)) {
+    return false;
+  }
+  return (attribute_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+}
+
+bool CreateDirectoryHierarchy(const std::wstring& wfull_path) {
+  if (DirectoryExistsOrCreated(wfull_path)) {
+    return true;
+  }
+  const wchar_t kPathSeparators[] = {static_cast<wchar_t>(kSbFileSepChar),
+                                     static_cast<wchar_t>(kSbFileAltSepChar)};
+  size_t path_end = 0;
+  do {
+    path_end = wfull_path.find_first_of(kPathSeparators, path_end,
+                                        SB_ARRAY_SIZE(kPathSeparators));
+    if (path_end == std::wstring::npos) {
+      path_end = wfull_path.size();
+    }
+    std::wstring temp_path = wfull_path.substr(0, path_end);
+    DirectoryExistsOrCreated(temp_path);
+  } while (path_end < wfull_path.size());
+
+  return DirectoryExistsOrCreated(wfull_path);
+}
+
+bool DirectoryExistsOrCreated(const std::wstring& wpath) {
+  return DirectoryExists(wpath) || CreateDirectoryW(wpath.c_str(), NULL);
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/directory_internal.h b/starboard/shared/win32/directory_internal.h
new file mode 100644
index 0000000..4fce048
--- /dev/null
+++ b/starboard/shared/win32/directory_internal.h
@@ -0,0 +1,80 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_DIRECTORY_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_DIRECTORY_INTERNAL_H_
+
+#include "starboard/directory.h"
+
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/memory.h"
+#include "starboard/shared/internal_only.h"
+#include "starboard/shared/win32/file_internal.h"
+
+#pragma warning(push)
+
+// SbFilePrivate is defined as a struct, but for windows implementation
+// enough functionality has been added so that it warrants being a class
+// per Google's C++ style guide.  This mismatch causes the Microsoft's compiler
+// to generate a warning.
+#pragma warning(disable : 4099)
+
+class SbDirectoryPrivate {
+ public:
+  explicit SbDirectoryPrivate(HANDLE handle) : directory_handle(handle) {}
+
+  bool HasValidHandle() const {
+    return starboard::shared::win32::IsValidHandle(directory_handle);
+  }
+
+  HANDLE directory_handle;
+  std::deque<std::string> next_directory_entries;
+
+  // SbDirectoryPrivate is neither copyable nor movable.
+  SbDirectoryPrivate(const SbDirectoryPrivate&) = delete;
+  SbDirectoryPrivate& operator=(const SbDirectoryPrivate&) = delete;
+};
+#pragma warning(pop)
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+bool HasValidHandle(SbDirectory directory);
+
+// This function strips trailing file separators from a directory name.
+// For example if the directory name was "C:\\Temp\\\\\\", it would
+// strip them, so that the directory name is now to be "C:\\temp".
+void TrimExtraFileSeparators(std::wstring* dirname_pointer);
+
+bool IsAbsolutePath(const std::wstring& path);
+
+bool DirectoryExists(const std::wstring& dir_path);
+
+// Directory hierarchy is created from tip down to root. This is necessary
+// because UWP has issues with bottom up directory creation due to permissions.
+bool CreateDirectoryHierarchy(const std::wstring& wfull_path);
+
+bool DirectoryExistsOrCreated(const std::wstring& wpath);
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_DIRECTORY_INTERNAL_H_
diff --git a/starboard/shared/win32/directory_open.cc b/starboard/shared/win32/directory_open.cc
new file mode 100644
index 0000000..a5a58dc
--- /dev/null
+++ b/starboard/shared/win32/directory_open.cc
@@ -0,0 +1,62 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/directory.h"
+
+#include "starboard/shared/win32/directory_internal.h"
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+SbDirectory SbDirectoryOpen(const char* path, SbFileError* out_error) {
+  using starboard::shared::win32::CStringToWString;
+  using starboard::shared::win32::NormalizeWin32Path;
+
+  if ((path == nullptr) || (path[0] == '\0')) {
+    if (out_error) {
+      *out_error = kSbFileErrorNotFound;
+    }
+    return kSbDirectoryInvalid;
+  }
+
+  std::wstring path_wstring = NormalizeWin32Path(path);
+
+  if (!starboard::shared::win32::IsAbsolutePath(path_wstring)) {
+    if (out_error) {
+      *out_error = kSbFileErrorNotFound;
+    }
+    return kSbDirectoryInvalid;
+  }
+
+  HANDLE directory_handle = starboard::shared::win32::OpenFileOrDirectory(
+      path, kSbFileOpenOnly | kSbFileRead, nullptr, out_error);
+
+  if (!starboard::shared::win32::IsValidHandle(directory_handle)) {
+    return kSbDirectoryInvalid;
+  }
+
+  FILE_BASIC_INFO basic_info = {0};
+  BOOL basic_info_success = GetFileInformationByHandleEx(
+      directory_handle, FileBasicInfo, &basic_info, sizeof(FILE_BASIC_INFO));
+
+  if (!basic_info_success ||
+      !(basic_info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
+    CloseHandle(directory_handle);
+    if (out_error) {
+      *out_error = kSbFileErrorNotADirectory;
+    }
+    return kSbDirectoryInvalid;
+  }
+
+  return new SbDirectoryPrivate(directory_handle);
+}
diff --git a/starboard/shared/win32/drm_create_system.cc b/starboard/shared/win32/drm_create_system.cc
new file mode 100644
index 0000000..db73316
--- /dev/null
+++ b/starboard/shared/win32/drm_create_system.cc
@@ -0,0 +1,48 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/drm.h"
+
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/shared/win32/drm_system_playready.h"
+
+SbDrmSystem SbDrmCreateSystem(
+    const char* key_system,
+    void* context,
+    SbDrmSessionUpdateRequestFunc update_request_callback,
+    SbDrmSessionUpdatedFunc session_updated_callback,
+    SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback,
+    SbDrmServerCertificateUpdatedFunc server_certificate_updated_callback,
+    SbDrmSessionClosedFunc session_closed_callback) {
+  using ::starboard::shared::win32::DrmSystemPlayready;
+
+  if (!update_request_callback || !session_updated_callback ||
+      !key_statuses_changed_callback || !server_certificate_updated_callback ||
+      !session_closed_callback) {
+    SB_DLOG(WARNING) << "Callback functions not set on key system: "
+                     << key_system;
+    return kSbDrmSystemInvalid;
+  }
+
+  if (DrmSystemPlayready::IsKeySystemSupported(key_system)) {
+    return new DrmSystemPlayready(
+        context, []() { return false; },  // Output protection not supported
+        update_request_callback, session_updated_callback,
+        key_statuses_changed_callback, session_closed_callback);
+  }
+
+  SB_DLOG(WARNING) << "Invalid key system " << key_system;
+  return kSbDrmSystemInvalid;
+}
diff --git a/starboard/shared/win32/drm_system_playready.cc b/starboard/shared/win32/drm_system_playready.cc
new file mode 100644
index 0000000..43a5f41
--- /dev/null
+++ b/starboard/shared/win32/drm_system_playready.cc
@@ -0,0 +1,378 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/drm_system_playready.h"
+
+#include <algorithm>
+#include <cctype>
+#include <sstream>
+#include <vector>
+
+#include "starboard/common/instance_counter.h"
+#include "starboard/common/log.h"
+#include "starboard/common/mutex.h"
+#include "starboard/common/string.h"
+#include "starboard/configuration.h"
+#include "starboard/memory.h"
+#include "starboard/once.h"
+#include "starboard/shared/starboard/media/mime_type.h"
+
+namespace {
+
+const char kPlayReadyKeySystem[] = "com.youtube.playready";
+const bool kLogPlayreadyChallengeResponse = false;
+
+DECLARE_INSTANCE_COUNTER(DrmSystemPlayready);
+
+std::string GetHexRepresentation(const void* data, size_t size) {
+  const char kHex[] = "0123456789ABCDEF";
+
+  std::stringstream representation;
+  std::stringstream ascii;
+  const uint8_t* binary = static_cast<const uint8_t*>(data);
+  bool new_line = true;
+  for (size_t i = 0; i < size; ++i) {
+    if (new_line) {
+      new_line = false;
+    } else {
+      representation << ' ';
+    }
+    ascii << (std::isprint(binary[i]) ? static_cast<char>(binary[i]) : '?');
+    representation << kHex[binary[i] / 16] << kHex[binary[i] % 16];
+    if (i % 16 == 15 && i != size - 1) {
+      representation << " (" << ascii.str() << ')' << std::endl;
+      std::stringstream empty;
+      ascii.swap(empty);  // Clear the ascii stream
+      new_line = true;
+    }
+  }
+
+  if (!ascii.str().empty()) {
+    representation << '(' << ascii.str() << ')' << std::endl;
+  }
+
+  return representation.str();
+}
+
+template <typename T>
+std::string GetHexRepresentation(const T& value) {
+  return GetHexRepresentation(&value, sizeof(T));
+}
+
+class ActiveDrmSystems {
+ public:
+  ::starboard::Mutex mutex_;
+  std::vector<starboard::shared::win32::DrmSystemPlayready*> active_systems_;
+};
+
+SB_ONCE_INITIALIZE_FUNCTION(ActiveDrmSystems, GetActiveDrmSystems);
+
+}  // namespace
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+void DrmSystemOnUwpResume() {
+  ::starboard::ScopedLock lock(GetActiveDrmSystems()->mutex_);
+  for (DrmSystemPlayready* item : GetActiveDrmSystems()->active_systems_) {
+    item->OnUwpResume();
+  }
+}
+
+DrmSystemPlayready::DrmSystemPlayready(
+    void* context,
+    EnableOutputProtectionFunc enable_output_protection_func,
+    SbDrmSessionUpdateRequestFunc session_update_request_callback,
+    SbDrmSessionUpdatedFunc session_updated_callback,
+    SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback,
+    SbDrmSessionClosedFunc session_closed_callback)
+    : context_(context),
+      enable_output_protection_func_(enable_output_protection_func),
+      session_update_request_callback_(session_update_request_callback),
+      session_updated_callback_(session_updated_callback),
+      key_statuses_changed_callback_(key_statuses_changed_callback),
+      session_closed_callback_(session_closed_callback) {
+  SB_DCHECK(enable_output_protection_func);
+  SB_DCHECK(session_update_request_callback);
+  SB_DCHECK(session_updated_callback);
+  SB_DCHECK(key_statuses_changed_callback);
+  SB_DCHECK(session_closed_callback);
+
+  ON_INSTANCE_CREATED(DrmSystemPlayready);
+
+  ScopedLock lock(GetActiveDrmSystems()->mutex_);
+  GetActiveDrmSystems()->active_systems_.push_back(this);
+}
+
+DrmSystemPlayready::~DrmSystemPlayready() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  ON_INSTANCE_RELEASED(DrmSystemPlayready);
+
+  ScopedLock lock(GetActiveDrmSystems()->mutex_);
+  auto& active_systems = GetActiveDrmSystems()->active_systems_;
+  active_systems.erase(std::remove(
+      active_systems.begin(), active_systems.end(), this));
+}
+
+bool DrmSystemPlayready::IsKeySystemSupported(const char* key_system) {
+  SB_DCHECK(key_system);
+
+  // It is possible that the |key_system| comes with extra attributes, like
+  // `com.youtube.playready; encryptionscheme="cenc"`.  We prepend "key_system/"
+  // to it, so it can be parsed by MimeType.
+  starboard::media::MimeType mime_type(std::string("key_system/") + key_system);
+
+  if (!mime_type.is_valid()) {
+    return false;
+  }
+  SB_DCHECK(mime_type.type() == "key_system");
+  if (mime_type.subtype() != kPlayReadyKeySystem) {
+    return false;
+  }
+
+  for (int i = 0; i < mime_type.GetParamCount(); ++i) {
+    if (mime_type.GetParamName(i) == "encryptionscheme") {
+      auto value = mime_type.GetParamStringValue(i);
+      if (value != "cenc") {
+        return false;
+      }
+    }
+  }
+
+  return true;
+}
+
+void DrmSystemPlayready::GenerateSessionUpdateRequest(
+    int ticket,
+    const char* type,
+    const void* initialization_data,
+    int initialization_data_size) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  if (strcmp("cenc", type) != 0) {
+    SB_NOTREACHED() << "Invalid initialization data type " << type;
+    return;
+  }
+
+  std::string session_id = GenerateAndAdvanceSessionId();
+  scoped_refptr<License> license =
+      License::Create(initialization_data, initialization_data_size);
+  const std::string& challenge = license->license_challenge();
+  if (challenge.empty()) {
+    // Signal an error with |session_id| as NULL.
+    SB_LOG(ERROR) << "Failed to generate license challenge";
+    session_update_request_callback_(
+        this, context_, ticket, kSbDrmStatusUnknownError,
+        kSbDrmSessionRequestTypeLicenseRequest, NULL, NULL, 0, NULL, 0, NULL);
+    return;
+  }
+
+  SB_LOG(INFO) << "Send challenge for key id "
+               << GetHexRepresentation(license->key_id()) << " in session "
+               << session_id;
+  SB_LOG_IF(INFO, kLogPlayreadyChallengeResponse)
+      << GetHexRepresentation(challenge.data(), challenge.size());
+
+  session_update_request_callback_(
+      this, context_, ticket, kSbDrmStatusSuccess,
+      kSbDrmSessionRequestTypeLicenseRequest, NULL, session_id.c_str(),
+      static_cast<int>(session_id.size()), challenge.c_str(),
+      static_cast<int>(challenge.size()), NULL);
+  pending_requests_[session_id] = license;
+}
+
+void DrmSystemPlayready::UpdateSession(int ticket,
+                                       const void* key,
+                                       int key_size,
+                                       const void* session_id,
+                                       int session_id_size) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  std::string session_id_copy(static_cast<const char*>(session_id),
+                              session_id_size);
+  auto iter = pending_requests_.find(session_id_copy);
+  SB_DCHECK(iter != pending_requests_.end());
+  if (iter == pending_requests_.end()) {
+    SB_NOTREACHED() << "Invalid session id " << session_id_copy;
+    return;
+  }
+
+  scoped_refptr<License> license = iter->second;
+
+  SB_LOG(INFO) << "Adding playready response for key id "
+               << GetHexRepresentation(license->key_id());
+  SB_LOG_IF(INFO, kLogPlayreadyChallengeResponse)
+      << GetHexRepresentation(key, key_size);
+
+  license->UpdateLicense(key, key_size);
+
+  if (license->usable()) {
+    SB_LOG(INFO) << "Successfully add key for key id "
+                 << GetHexRepresentation(license->key_id()) << " in session "
+                 << session_id_copy;
+    {
+      ScopedLock lock(mutex_);
+      successful_requests_[iter->first] =
+          LicenseInfo(kSbDrmKeyStatusUsable, license);
+    }
+    session_updated_callback_(this, context_, ticket, kSbDrmStatusSuccess, NULL,
+                              session_id, session_id_size);
+
+    {
+      ScopedLock lock(mutex_);
+      ReportKeyStatusChanged_Locked(session_id_copy);
+    }
+    pending_requests_.erase(iter);
+  } else {
+    SB_LOG(INFO) << "Failed to add key for session " << session_id_copy;
+    // Don't report it as a failure as otherwise the JS player is going to
+    // terminate the video.
+    session_updated_callback_(this, context_, ticket, kSbDrmStatusSuccess, NULL,
+                              session_id, session_id_size);
+    // When UpdateLicense() fails, the |license| must have generated a new
+    // challenge internally.  Send this challenge again.
+    const std::string& challenge = license->license_challenge();
+    if (challenge.empty()) {
+      SB_NOTREACHED();
+      return;
+    }
+
+    SB_LOG(INFO) << "Send challenge again for key id "
+                 << GetHexRepresentation(license->key_id()) << " in session "
+                 << session_id;
+    SB_LOG_IF(INFO, kLogPlayreadyChallengeResponse)
+        << GetHexRepresentation(challenge.data(), challenge.size());
+
+    // We have to use |kSbDrmTicketInvalid| as the license challenge is not a
+    // result of GenerateSessionUpdateRequest().
+    session_update_request_callback_(
+        this, context_, kSbDrmTicketInvalid, kSbDrmStatusSuccess,
+        kSbDrmSessionRequestTypeLicenseRequest, NULL, session_id,
+        session_id_size, challenge.c_str(), static_cast<int>(challenge.size()),
+        NULL);
+  }
+}
+
+void DrmSystemPlayready::CloseSession(const void* session_id,
+                                      int session_id_size) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  key_statuses_changed_callback_(this, context_, session_id, session_id_size, 0,
+                                 nullptr, nullptr);
+
+  std::string session_id_copy(static_cast<const char*>(session_id),
+                              session_id_size);
+  pending_requests_.erase(session_id_copy);
+
+  ScopedLock lock(mutex_);
+  successful_requests_.erase(session_id_copy);
+}
+
+SbDrmSystemPrivate::DecryptStatus DrmSystemPlayready::Decrypt(
+    InputBuffer* buffer) {
+  const SbDrmSampleInfo* drm_info = buffer->drm_info();
+
+  if (drm_info == NULL || drm_info->initialization_vector_size == 0) {
+    return kSuccess;
+  }
+
+  GUID key_id;
+  if (drm_info->identifier_size != sizeof(key_id)) {
+    return kRetry;
+  }
+  key_id = *reinterpret_cast<const GUID*>(drm_info->identifier);
+
+  ScopedLock lock(mutex_);
+  for (auto& item : successful_requests_) {
+    if (item.second.license_->key_id() == key_id) {
+      if (buffer->sample_type() == kSbMediaTypeAudio) {
+        return kSuccess;
+      }
+
+      if (item.second.license_->IsHDCPRequired()) {
+        if (!enable_output_protection_func_()) {
+          SB_LOG(INFO) << "HDCP required but not available";
+          item.second.status_ = kSbDrmKeyStatusRestricted;
+          ReportKeyStatusChanged_Locked(item.first);
+          return kRetry;
+        }
+      }
+
+      return kSuccess;
+    }
+  }
+
+  return kRetry;
+}
+
+void DrmSystemPlayready::ReportKeyStatusChanged_Locked(
+    const std::string& session_id) {
+  // mutex_ must be held by caller
+  ::starboard::ScopedTryLock lock_should_fail(mutex_);
+  SB_DCHECK(!lock_should_fail.is_locked());
+
+  LicenseInfo& item = successful_requests_[session_id];
+
+  GUID key_id = item.license_->key_id();
+  SbDrmKeyId drm_key_id;
+  SB_DCHECK(sizeof(drm_key_id.identifier) >= sizeof(key_id));
+  memcpy(&(drm_key_id.identifier), &key_id, sizeof(key_id));
+  drm_key_id.identifier_size = sizeof(key_id);
+
+  key_statuses_changed_callback_(this, context_,
+      session_id.data(), static_cast<int>(session_id.size()),
+      1, &drm_key_id, &(item.status_));
+}
+
+scoped_refptr<DrmSystemPlayready::License> DrmSystemPlayready::GetLicense(
+    const uint8_t* key_id,
+    int key_id_size) {
+  GUID key_id_copy;
+  if (key_id_size != sizeof(key_id_copy)) {
+    return NULL;
+  }
+  key_id_copy = *reinterpret_cast<const GUID*>(key_id);
+
+  ScopedLock lock(mutex_);
+
+  for (auto& item : successful_requests_) {
+    if (item.second.license_->key_id() == key_id_copy) {
+      return item.second.license_;
+    }
+  }
+
+  return NULL;
+}
+
+void DrmSystemPlayready::OnUwpResume() {
+  for (auto& item : successful_requests_) {
+    session_closed_callback_(this, context_,
+        item.first.data(), static_cast<int>(item.first.size()));
+  }
+}
+
+std::string DrmSystemPlayready::GenerateAndAdvanceSessionId() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  std::stringstream ss;
+  ss << current_session_id_;
+  ++current_session_id_;
+  return ss.str();
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/drm_system_playready.h b/starboard/shared/win32/drm_system_playready.h
new file mode 100644
index 0000000..efcade1
--- /dev/null
+++ b/starboard/shared/win32/drm_system_playready.h
@@ -0,0 +1,133 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_DRM_SYSTEM_PLAYREADY_H_
+#define STARBOARD_SHARED_WIN32_DRM_SYSTEM_PLAYREADY_H_
+
+#include <mfapi.h>
+#include <mfidl.h>
+#include <wrl.h>
+#include <wrl/client.h>
+
+#include <functional>
+#include <map>
+#include <string>
+
+#include "starboard/common/mutex.h"
+#include "starboard/common/ref_counted.h"
+#include "starboard/shared/starboard/drm/drm_system_internal.h"
+#include "starboard/shared/starboard/thread_checker.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// Adapts PlayReady decryption module to Starboard's |SbDrmSystem|.
+class DrmSystemPlayready : public SbDrmSystemPrivate {
+ public:
+  typedef std::function<bool()> EnableOutputProtectionFunc;
+
+  class License : public RefCountedThreadSafe<License> {
+   public:
+    static scoped_refptr<License> Create(const void* initialization_data,
+                                         int initialization_data_size);
+
+    virtual ~License() {}
+
+    virtual GUID key_id() const = 0;
+    virtual bool usable() const = 0;
+    virtual std::string license_challenge() const = 0;
+    virtual Microsoft::WRL::ComPtr<IMFTransform> decryptor() = 0;
+    virtual void UpdateLicense(const void* license, int license_size) = 0;
+    virtual bool IsHDCPRequired() = 0;
+  };
+
+  DrmSystemPlayready(
+      void* context,
+      EnableOutputProtectionFunc enable_output_protection_func,
+      SbDrmSessionUpdateRequestFunc session_update_request_callback,
+      SbDrmSessionUpdatedFunc session_updated_callback,
+      SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback,
+      SbDrmSessionClosedFunc session_closed_callback);
+  ~DrmSystemPlayready() override;
+
+  static bool IsKeySystemSupported(const char* key_system);
+
+  // From |SbDrmSystemPrivate|.
+  void GenerateSessionUpdateRequest(int ticket,
+                                    const char* type,
+                                    const void* initialization_data,
+                                    int initialization_data_size) override;
+
+  void UpdateSession(int ticket,
+                     const void* key,
+                     int key_size,
+                     const void* session_id,
+                     int session_id_size) override;
+
+  void CloseSession(const void* session_id, int session_id_size) override;
+
+  DecryptStatus Decrypt(InputBuffer* buffer) override;
+
+  // Used by audio and video decoders to retrieve the decryptors.
+  scoped_refptr<License> GetLicense(const uint8_t* key_id, int key_id_size);
+
+  void OnUwpResume();
+
+  bool IsServerCertificateUpdatable() override { return false; }
+  void UpdateServerCertificate(int ticket,
+                               const void* certificate,
+                               int certificate_size) override {
+  }
+
+  const void* GetMetrics(int* size) override { return NULL; }
+
+ private:
+  std::string GenerateAndAdvanceSessionId();
+  // Note: requires mutex_ to be held
+  void ReportKeyStatusChanged_Locked(const std::string& session_id);
+
+  ::starboard::shared::starboard::ThreadChecker thread_checker_;
+
+  void* context_;
+  const EnableOutputProtectionFunc enable_output_protection_func_;
+  const SbDrmSessionUpdateRequestFunc session_update_request_callback_;
+  const SbDrmSessionUpdatedFunc session_updated_callback_;
+  const SbDrmSessionKeyStatusesChangedFunc key_statuses_changed_callback_;
+  const SbDrmSessionClosedFunc session_closed_callback_;
+  int current_session_id_ = 1;
+
+  std::map<std::string, scoped_refptr<License> > pending_requests_;
+
+  // |successful_requests_| can be accessed from more than one thread.  Guard
+  // it by a mutex.
+  Mutex mutex_;
+
+  struct LicenseInfo {
+    LicenseInfo(SbDrmKeyStatus status, const scoped_refptr<License>& license)
+        : status_(status), license_(license) {}
+    LicenseInfo() : status_(kSbDrmKeyStatusError) {}
+
+    SbDrmKeyStatus status_;
+    scoped_refptr<License> license_;
+  };
+
+  std::map<std::string, LicenseInfo> successful_requests_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_DRM_SYSTEM_PLAYREADY_H_
diff --git a/starboard/shared/win32/dx_context_video_decoder.cc b/starboard/shared/win32/dx_context_video_decoder.cc
new file mode 100644
index 0000000..9f935c8
--- /dev/null
+++ b/starboard/shared/win32/dx_context_video_decoder.cc
@@ -0,0 +1,72 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/dx_context_video_decoder.h"
+
+#include <D3D11.h>
+#include <D3D11_4.h>
+#include <mfapi.h>
+
+#include "third_party/angle/include/EGL/egl.h"
+#include "third_party/angle/include/EGL/eglext.h"
+
+#include "starboard/common/log.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+HardwareDecoderContext GetDirectXForHardwareDecoding() {
+  HRESULT result = S_OK;
+  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+  PFNEGLQUERYDISPLAYATTRIBEXTPROC query_display;
+
+  query_display = reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>(
+      eglGetProcAddress("eglQueryDisplayAttribEXT"));
+  SB_DCHECK(query_display != nullptr);
+
+  PFNEGLQUERYDEVICEATTRIBEXTPROC query_device;
+  query_device = reinterpret_cast<PFNEGLQUERYDEVICEATTRIBEXTPROC>(
+      eglGetProcAddress("eglQueryDeviceAttribEXT"));
+  SB_DCHECK(query_device != nullptr);
+
+  intptr_t egl_device = 0;
+  query_display(display, EGL_DEVICE_EXT, &egl_device);
+  SB_DCHECK(egl_device != 0);
+
+  intptr_t device;
+  query_device(reinterpret_cast<EGLDeviceEXT>(egl_device),
+      EGL_D3D11_DEVICE_ANGLE, &device);
+
+  ID3D11Device* output_dx_device = reinterpret_cast<ID3D11Device*>(device);
+  IMFDXGIDeviceManager* dxgi_device_mgr = nullptr;
+
+  UINT token = 0;
+  result = MFCreateDXGIDeviceManager(&token, &dxgi_device_mgr);
+  SB_DCHECK(result == S_OK);
+  SB_DCHECK(dxgi_device_mgr);
+
+  result = dxgi_device_mgr->ResetDevice(output_dx_device, token);
+  SB_DCHECK(SUCCEEDED(result));
+
+  HardwareDecoderContext output = {
+    output_dx_device,
+    dxgi_device_mgr
+  };
+  return output;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/dx_context_video_decoder.h b/starboard/shared/win32/dx_context_video_decoder.h
new file mode 100644
index 0000000..ece2172
--- /dev/null
+++ b/starboard/shared/win32/dx_context_video_decoder.h
@@ -0,0 +1,38 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_DX_CONTEXT_VIDEO_DECODER_H_
+#define STARBOARD_SHARED_WIN32_DX_CONTEXT_VIDEO_DECODER_H_
+
+#include <wrl\client.h>  // For ComPtr.
+
+struct ID3D11Device;
+struct ID3D11DeviceContext;
+struct IMFDXGIDeviceManager;
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+struct HardwareDecoderContext {
+  Microsoft::WRL::ComPtr<ID3D11Device> dx_device_out;
+  Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> dxgi_device_manager_out;
+};
+
+HardwareDecoderContext GetDirectXForHardwareDecoding();
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+#endif  // STARBOARD_SHARED_WIN32_DX_CONTEXT_VIDEO_DECODER_H_
diff --git a/starboard/shared/win32/environment.cc b/starboard/shared/win32/environment.cc
new file mode 100644
index 0000000..bba9b00
--- /dev/null
+++ b/starboard/shared/win32/environment.cc
@@ -0,0 +1,33 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <windows.h>
+
+#include "starboard/shared/environment.h"
+
+namespace starboard {
+
+std::string GetEnvironment(std::string name) {
+  std::wstring w_name(name.begin(), name.end());
+  DWORD len = GetEnvironmentVariable(w_name.c_str(), nullptr, 0);
+  if (len == 0)
+    return "";
+  std::wstring w_environment_string(len, 0);
+  GetEnvironmentVariable(w_name.c_str(), &w_environment_string[0], len);
+  std::string environment_string(w_environment_string.begin(),
+                                 w_environment_string.end());
+  return environment_string;
+}
+
+}  // namespace starboard
diff --git a/starboard/shared/win32/error_utils.cc b/starboard/shared/win32/error_utils.cc
new file mode 100644
index 0000000..fa3e7a4
--- /dev/null
+++ b/starboard/shared/win32/error_utils.cc
@@ -0,0 +1,198 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Not breaking these functions up because however one is implemented, the
+// others should be implemented similarly.
+
+#include "starboard/shared/win32/error_utils.h"
+
+#include <Mfapi.h>
+#include <Mferror.h>
+#include <propvarutil.h>
+
+#include <utility>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+namespace {
+
+std::string GetFormatHresultMessage(HRESULT hr) {
+  std::stringstream ss;
+  LPWSTR error_message;
+  int message_size = FormatMessage(
+      FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
+          FORMAT_MESSAGE_IGNORE_INSERTS,
+      nullptr,  // Unused with FORMAT_MESSAGE_FROM_SYSTEM.
+      hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+      (LPTSTR)&error_message,
+      0,  // Minimum size for output buffer.
+      nullptr);
+  SB_DCHECK(message_size);
+  ss << wchar_tToUTF8(error_message);
+  LocalFree(error_message);
+  return ss.str();
+}
+
+#define MAKE_HR_PAIR(X) std::pair<HRESULT, std::string>(X, #X)
+const std::pair<HRESULT, std::string> kHresultValueStrings[] = {
+  MAKE_HR_PAIR(S_OK),
+  MAKE_HR_PAIR(MF_E_PLATFORM_NOT_INITIALIZED),
+  MAKE_HR_PAIR(MF_E_BUFFERTOOSMALL),
+  MAKE_HR_PAIR(MF_E_INVALIDREQUEST),
+  MAKE_HR_PAIR(MF_E_INVALIDSTREAMNUMBER),
+  MAKE_HR_PAIR(MF_E_INVALIDMEDIATYPE),
+  MAKE_HR_PAIR(MF_E_NOTACCEPTING),
+  MAKE_HR_PAIR(MF_E_NOT_INITIALIZED),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_REPRESENTATION),
+  MAKE_HR_PAIR(MF_E_NO_MORE_TYPES),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_SERVICE),
+  MAKE_HR_PAIR(MF_E_UNEXPECTED),
+  MAKE_HR_PAIR(MF_E_INVALIDNAME),
+  MAKE_HR_PAIR(MF_E_INVALIDTYPE),
+  MAKE_HR_PAIR(MF_E_INVALID_FILE_FORMAT),
+  MAKE_HR_PAIR(MF_E_INVALIDINDEX),
+  MAKE_HR_PAIR(MF_E_INVALID_TIMESTAMP),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_SCHEME),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_BYTESTREAM_TYPE),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_TIME_FORMAT),
+  MAKE_HR_PAIR(MF_E_NO_SAMPLE_TIMESTAMP),
+  MAKE_HR_PAIR(MF_E_NO_SAMPLE_DURATION),
+  MAKE_HR_PAIR(MF_E_INVALID_STREAM_DATA),
+  MAKE_HR_PAIR(MF_E_RT_UNAVAILABLE),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_RATE),
+  MAKE_HR_PAIR(MF_E_THINNING_UNSUPPORTED),
+  MAKE_HR_PAIR(MF_E_REVERSE_UNSUPPORTED),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_RATE_TRANSITION),
+  MAKE_HR_PAIR(MF_E_RATE_CHANGE_PREEMPTED),
+  MAKE_HR_PAIR(MF_E_NOT_FOUND),
+  MAKE_HR_PAIR(MF_E_NOT_AVAILABLE),
+  MAKE_HR_PAIR(MF_E_NO_CLOCK),
+  MAKE_HR_PAIR(MF_S_MULTIPLE_BEGIN),
+  MAKE_HR_PAIR(MF_E_MULTIPLE_BEGIN),
+  MAKE_HR_PAIR(MF_E_MULTIPLE_SUBSCRIBERS),
+  MAKE_HR_PAIR(MF_E_TIMER_ORPHANED),
+  MAKE_HR_PAIR(MF_E_STATE_TRANSITION_PENDING),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_STATE_TRANSITION),
+  MAKE_HR_PAIR(MF_E_UNRECOVERABLE_ERROR_OCCURRED),
+  MAKE_HR_PAIR(MF_E_SAMPLE_HAS_TOO_MANY_BUFFERS),
+  MAKE_HR_PAIR(MF_E_SAMPLE_NOT_WRITABLE),
+  MAKE_HR_PAIR(MF_E_INVALID_KEY),
+  MAKE_HR_PAIR(MF_E_BAD_STARTUP_VERSION),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_CAPTION),
+  MAKE_HR_PAIR(MF_E_INVALID_POSITION),
+  MAKE_HR_PAIR(MF_E_ATTRIBUTENOTFOUND),
+  MAKE_HR_PAIR(MF_E_PROPERTY_TYPE_NOT_ALLOWED),
+  MAKE_HR_PAIR(MF_E_TOPO_INVALID_OPTIONAL_NODE),
+  MAKE_HR_PAIR(MF_E_TOPO_CANNOT_FIND_DECRYPTOR),
+  MAKE_HR_PAIR(MF_E_TOPO_CODEC_NOT_FOUND),
+  MAKE_HR_PAIR(MF_E_TOPO_CANNOT_CONNECT),
+  MAKE_HR_PAIR(MF_E_TOPO_UNSUPPORTED),
+  MAKE_HR_PAIR(MF_E_TOPO_INVALID_TIME_ATTRIBUTES),
+  MAKE_HR_PAIR(MF_E_TOPO_LOOPS_IN_TOPOLOGY),
+  MAKE_HR_PAIR(MF_E_TOPO_MISSING_PRESENTATION_DESCRIPTOR),
+  MAKE_HR_PAIR(MF_E_TOPO_MISSING_STREAM_DESCRIPTOR),
+  MAKE_HR_PAIR(MF_E_TOPO_STREAM_DESCRIPTOR_NOT_SELECTED),
+  MAKE_HR_PAIR(MF_E_TOPO_MISSING_SOURCE),
+  MAKE_HR_PAIR(MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_TYPE_NOT_SET),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_STREAM_CHANGE),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_INPUT_REMAINING),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROFILE_MISSING),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROFILE_INVALID_OR_CORRUPT),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROFILE_TRUNCATED),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_PID_NOT_RECOGNIZED),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VARIANT_TYPE_WRONG),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_NOT_WRITEABLE),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_ARRAY_VALUE_WRONG_NUM_DIM),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VALUE_SIZE_WRONG),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VALUE_OUT_OF_RANGE),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_PROPERTY_VALUE_INCOMPATIBLE),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_OUTPUT_MEDIATYPE),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_INPUT_MEDIATYPE),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_CONFLICTS_WITH_OTHER_CURRENTLY_ENABLED_FEATURES),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_NEED_MORE_INPUT),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_SPKR_CONFIG),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING),
+  MAKE_HR_PAIR(MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT),
+  MAKE_HR_PAIR(MF_E_UNSUPPORTED_D3D_TYPE),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_ASYNC_LOCKED),
+  MAKE_HR_PAIR(MF_E_TRANSFORM_CANNOT_INITIALIZE_ACM_DRIVER),
+};
+#undef MAKE_HR_PAIR
+
+bool FindHResultEnumString(HRESULT hr, std::string* output) {
+  const size_t n = sizeof(kHresultValueStrings) /
+                   sizeof(*kHresultValueStrings);
+
+  for (auto i = 0; i < n; ++i) {
+    const auto& elems = kHresultValueStrings[i];
+    if (hr == elems.first) {
+      *output = elems.second;
+      return true;
+    }
+  }
+  return false;
+}
+
+}  // namespace
+
+std::ostream& operator<<(std::ostream& os, const Win32ErrorCode& error_code) {
+  LPWSTR error_message;
+  int message_size = FormatMessage(
+      FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
+          FORMAT_MESSAGE_IGNORE_INSERTS,
+      nullptr,  // Unused with FORMAT_MESSAGE_FROM_SYSTEM.
+      error_code.GetHRESULT(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+      (LPTSTR)&error_message,
+      0,  // Minimum size for output buffer.
+      nullptr);
+  SB_DCHECK(message_size);
+  os << wchar_tToUTF8(error_message);
+  LocalFree(error_message);
+
+  return os;
+}
+
+void DebugLogWinError() {
+#if defined(_DEBUG)
+  DWORD error_code = GetLastError();
+  if (!error_code)
+    return;
+
+  SB_LOG(ERROR) << Win32ErrorCode(error_code);
+#endif  // defined(_DEBUG)
+}
+
+std::string HResultToString(HRESULT hr) {
+  std::string enum_str;
+  bool has_enum_str = FindHResultEnumString(hr, &enum_str);
+  std::string error_message = GetFormatHresultMessage(hr);
+
+  std::stringstream ss;
+  if (has_enum_str) {
+    ss << enum_str << ": ";
+  }
+
+  ss << "\"" << error_message << "\"";
+  return ss.str();
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/error_utils.h b/starboard/shared/win32/error_utils.h
new file mode 100644
index 0000000..31a2f9a
--- /dev/null
+++ b/starboard/shared/win32/error_utils.h
@@ -0,0 +1,66 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Not breaking these functions up because however one is implemented, the
+// others should be implemented similarly.
+
+#ifndef STARBOARD_SHARED_WIN32_ERROR_UTILS_H_
+#define STARBOARD_SHARED_WIN32_ERROR_UTILS_H_
+
+#include <windows.h>
+
+#include <ostream>
+#include <string>
+
+#include "starboard/common/log.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+class Win32ErrorCode {
+ public:
+  explicit Win32ErrorCode(DWORD error_code) : error_code_(error_code) {}
+
+  HRESULT GetHRESULT() const { return HRESULT_FROM_WIN32(error_code_); }
+
+ private:
+  DWORD error_code_;
+};
+
+std::ostream& operator<<(std::ostream& os, const Win32ErrorCode& error_code);
+
+// Checks for system errors and logs a human-readable error if GetLastError()
+// returns an error code. Noops on non-debug builds.
+void DebugLogWinError();
+
+std::string HResultToString(HRESULT hr);
+
+// The following macro evaluates statement in every build config, and checks the
+// result in debug & devel builds only.
+#define CheckResult(statement)                                          \
+  do {                                                                  \
+    auto check_result_hr = (statement);                                 \
+    SB_DCHECK(SUCCEEDED(check_result_hr))                               \
+        << "HRESULT was " << std::hex << check_result_hr                \
+        << " which translates to\n---> \""                              \
+        << ::starboard::shared::win32::HResultToString(check_result_hr) \
+        << "\"";                                                        \
+  } while (0)
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_ERROR_UTILS_H_
diff --git a/starboard/shared/win32/file_atomic_replace.cc b/starboard/shared/win32/file_atomic_replace.cc
new file mode 100644
index 0000000..6b7dddc
--- /dev/null
+++ b/starboard/shared/win32/file_atomic_replace.cc
@@ -0,0 +1,68 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include <vector>
+
+#include "starboard/common/string.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/shared/starboard/file_atomic_replace_write_file.h"
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+namespace {
+
+const char kTempFileSuffix[] = ".temp";
+
+}  // namespace
+
+bool SbFileAtomicReplace(const char* path,
+                         const char* data,
+                         int64_t data_size) {
+  if ((data_size < 0) || ((data_size > 0) && !data)) {
+    return false;
+  }
+
+  std::vector<char> temp_path(kSbFileMaxPath + 1, 0);
+
+  starboard::strlcpy(temp_path.data(), path, kSbFileMaxPath);
+  starboard::strlcat(temp_path.data(), kTempFileSuffix, kSbFileMaxPath);
+
+  if (!::starboard::shared::starboard::SbFileAtomicReplaceWriteFile(
+          temp_path.data(), data, data_size)) {
+    return false;
+  }
+
+  std::wstring path_wstring = starboard::shared::win32::NormalizeWin32Path(
+      starboard::shared::win32::CStringToWString(path));
+  std::wstring temp_path_wstring = starboard::shared::win32::NormalizeWin32Path(
+      starboard::shared::win32::CStringToWString(temp_path.data()));
+
+  // Try a simple move first. It will only succeed when |to_path| doesn't
+  // already exist.
+  if (MoveFileEx(temp_path_wstring.c_str(), path_wstring.c_str(), 0)) {
+    return true;
+  }
+
+  // Try the full-blown replace if the move fails, as ReplaceFile will only
+  // succeed when |to_path| does exist.
+  if (ReplaceFile(path_wstring.c_str(), temp_path_wstring.c_str(), NULL, 0,
+                  NULL, NULL)) {
+    return true;
+  }
+  return false;
+}
diff --git a/starboard/shared/win32/file_can_open.cc b/starboard/shared/win32/file_can_open.cc
new file mode 100644
index 0000000..4e78d34
--- /dev/null
+++ b/starboard/shared/win32/file_can_open.cc
@@ -0,0 +1,53 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+bool SbFileCanOpen(const char* path, int flags) {
+  if ((path == nullptr) || (path[0] == '\0')) {
+    return false;
+  }
+
+  bool can_read = flags & kSbFileRead;
+  bool can_write = flags & kSbFileWrite;
+  if (!can_read && !can_write) {
+    return false;
+  }
+
+  std::wstring path_wstring = starboard::shared::win32::CStringToWString(path);
+  WIN32_FIND_DATA find_data = {0};
+
+  HANDLE search_handle = FindFirstFileExW(
+      path_wstring.c_str(), FindExInfoStandard, &find_data,
+      FindExSearchNameMatch, NULL, FIND_FIRST_EX_CASE_SENSITIVE);
+  if (!starboard::shared::win32::IsValidHandle(search_handle)) {
+    return false;
+  }
+
+  bool can_open = true;
+
+  if (((find_data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) && can_write) ||
+      !starboard::shared::win32::PathEndsWith(path_wstring, find_data.cFileName)) {
+    can_open = false;
+  }
+
+  FindClose(search_handle);
+
+  return can_open;
+}
diff --git a/starboard/shared/win32/file_close.cc b/starboard/shared/win32/file_close.cc
new file mode 100644
index 0000000..afd99ae
--- /dev/null
+++ b/starboard/shared/win32/file_close.cc
@@ -0,0 +1,38 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/file_internal.h"
+
+using starboard::shared::win32::DebugLogWinError;
+
+bool SbFileClose(SbFile file) {
+  if (!SbFileIsValid(file)) {
+    return false;
+  }
+
+  bool success = CloseHandle(file->file_handle);
+
+  if (!success) {
+    DebugLogWinError();
+  }
+
+  delete file;
+
+  return success;
+}
diff --git a/starboard/shared/win32/file_delete.cc b/starboard/shared/win32/file_delete.cc
new file mode 100644
index 0000000..268263a
--- /dev/null
+++ b/starboard/shared/win32/file_delete.cc
@@ -0,0 +1,39 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+bool SbFileDelete(const char* path) {
+  using starboard::shared::win32::CStringToWString;
+  using starboard::shared::win32::NormalizeWin32Path;
+
+  if ((path == nullptr) || *path == '\0') {
+    return false;
+  }
+
+  if (!SbFileExists(path)) {
+    return true;
+  }
+
+  std::wstring path_wstring = NormalizeWin32Path(path);
+
+  // Remove file or empty directory.
+  return DeleteFileW(path_wstring.c_str()) ||
+         RemoveDirectoryW(path_wstring.c_str());
+}
diff --git a/starboard/shared/win32/file_exists.cc b/starboard/shared/win32/file_exists.cc
new file mode 100644
index 0000000..677ddb5
--- /dev/null
+++ b/starboard/shared/win32/file_exists.cc
@@ -0,0 +1,52 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+bool SbFileExists(const char* path) {
+  using starboard::shared::win32::CStringToWString;
+  using starboard::shared::win32::IsValidHandle;
+  using starboard::shared::win32::NormalizeWin32Path;
+  using starboard::shared::win32::PathEndsWith;
+
+  if ((path == nullptr) || (path[0] == '\0')) {
+    return false;
+  }
+
+  std::wstring path_wstring = NormalizeWin32Path(path);
+  // Win32 does not like a trailing "\\" on the path names for directories,
+  // so it's needs to be chopped off.
+  if (!path_wstring.empty() && (path_wstring.back() == '\\')) {
+    path_wstring.pop_back();
+  }
+
+  WIN32_FIND_DATA find_data = {0};
+
+  HANDLE search_handle = FindFirstFileExW(
+      path_wstring.c_str(), FindExInfoStandard, &find_data,
+      FindExSearchNameMatch, NULL, FIND_FIRST_EX_CASE_SENSITIVE);
+
+  if (!IsValidHandle(search_handle)) {
+    return false;
+  }
+
+  FindClose(search_handle);
+
+  return PathEndsWith(path_wstring, find_data.cFileName);
+}
diff --git a/starboard/shared/win32/file_flush.cc b/starboard/shared/win32/file_flush.cc
new file mode 100644
index 0000000..c42e69e
--- /dev/null
+++ b/starboard/shared/win32/file_flush.cc
@@ -0,0 +1,28 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/file_internal.h"
+
+bool SbFileFlush(SbFile file) {
+  if (!starboard::shared::win32::HasValidHandle(file)) {
+    return false;
+  }
+
+  return FlushFileBuffers(file->file_handle);
+}
diff --git a/starboard/shared/win32/file_get_info.cc b/starboard/shared/win32/file_get_info.cc
new file mode 100644
index 0000000..eacb6b6
--- /dev/null
+++ b/starboard/shared/win32/file_get_info.cc
@@ -0,0 +1,59 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/time_utils.h"
+
+bool SbFileGetInfo(SbFile file, SbFileInfo* out_info) {
+  if (!starboard::shared::win32::HasValidHandle(file) || !out_info) {
+    return false;
+  }
+
+  FILE_BASIC_INFO basic_info = {0};
+  BOOL basic_info_success = GetFileInformationByHandleEx(
+      file->file_handle, FileBasicInfo, &basic_info, sizeof(FILE_BASIC_INFO));
+  if (!basic_info_success) {
+    return false;
+  }
+
+  FILE_STANDARD_INFO standard_info = {0};
+  BOOL standard_info_success =
+      GetFileInformationByHandleEx(file->file_handle, FileStandardInfo,
+                                   &standard_info, sizeof(FILE_STANDARD_INFO));
+  if (!standard_info_success) {
+    return false;
+  }
+
+  out_info->size = standard_info.EndOfFile.QuadPart;
+  SB_DCHECK(out_info->size >= 0);
+
+  using starboard::shared::win32::ConvertFileTimeTicksToSbTime;
+
+  out_info->creation_time =
+      ConvertFileTimeTicksToSbTime(basic_info.CreationTime);
+  out_info->last_accessed =
+      ConvertFileTimeTicksToSbTime(basic_info.LastAccessTime);
+  out_info->last_modified =
+      ConvertFileTimeTicksToSbTime(basic_info.LastWriteTime);
+
+  out_info->is_symbolic_link = false;
+  out_info->is_directory = standard_info.Directory;
+
+  return true;
+}
diff --git a/starboard/shared/win32/file_get_path_info.cc b/starboard/shared/win32/file_get_path_info.cc
new file mode 100644
index 0000000..9ed102d
--- /dev/null
+++ b/starboard/shared/win32/file_get_path_info.cc
@@ -0,0 +1,104 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/time_utils.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+namespace {
+
+bool IsDriveLetter(wchar_t drive_letter) {
+  if (L'A' <= drive_letter && drive_letter <= 'Z') {
+    return true;
+  }
+
+  if (L'a' <= drive_letter && drive_letter <= 'z') {
+    return true;
+  }
+  return false;
+}
+
+bool IsRootDirectory(std::wstring wpath) {
+  if (wpath.length() > 3) {
+    return false;
+  }
+
+  // Strip optional trailing slash.
+  if (wpath.length() == 3) {
+    if (wpath.back() != L'\\') {
+      return false;
+    }
+    wpath.pop_back();
+  }
+
+  if (wpath.length() == 2) {
+    if (IsDriveLetter(wpath[0]) && wpath[1] == ':') {
+      return true;
+    }
+  }
+  return false;
+}
+
+}  // namespace
+
+bool SbFileGetPathInfo(const char* path, SbFileInfo* out_info) {
+  using starboard::shared::win32::CStringToWString;
+  using starboard::shared::win32::NormalizeWin32Path;
+
+  if (!path || path[0] == '\0' || !out_info) {
+    return false;
+  }
+
+  std::wstring path_wstring = NormalizeWin32Path(path);
+
+  // GetFileAttributesExW(...) does not handle root directories
+  // we we have to handle it here.
+  if (IsRootDirectory(path_wstring)) {
+    out_info->is_directory = true;
+    out_info->last_modified = 0;
+    out_info->last_accessed = 0;
+    out_info->creation_time = 0;
+    return true;
+  }
+
+  WIN32_FILE_ATTRIBUTE_DATA attribute_data = {0};
+  if (!GetFileAttributesExW(path_wstring.c_str(), GetFileExInfoStandard,
+                            &attribute_data)) {
+    return false;
+  }
+
+  out_info->size = static_cast<int64_t>(attribute_data.nFileSizeHigh) << 32 |
+                   attribute_data.nFileSizeLow;
+  SB_DCHECK(out_info->size >= 0);
+
+  using starboard::shared::win32::ConvertFileTimeToSbTime;
+
+  out_info->creation_time =
+      ConvertFileTimeToSbTime(attribute_data.ftCreationTime);
+  out_info->last_accessed =
+      ConvertFileTimeToSbTime(attribute_data.ftLastAccessTime);
+  out_info->last_modified =
+      ConvertFileTimeToSbTime(attribute_data.ftLastWriteTime);
+
+  out_info->is_symbolic_link = false;
+  out_info->is_directory =
+      (attribute_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+
+  return true;
+}
diff --git a/starboard/shared/win32/file_internal.cc b/starboard/shared/win32/file_internal.cc
new file mode 100644
index 0000000..84c9bcd
--- /dev/null
+++ b/starboard/shared/win32/file_internal.cc
@@ -0,0 +1,211 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/file_internal.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/memory.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+namespace {
+const char kUnixSep[] = "/";
+const char kWin32Sep[] = "\\";
+const wchar_t kUnixSepW[] = L"/";
+const wchar_t kWin32SepW[] = L"\\";
+
+bool IsPathNormalized(const std::string& string) {
+  return string.find(kUnixSep) == std::string::npos;
+}
+
+bool IsPathNormalized(const std::wstring& string) {
+  return string.find(kUnixSepW) == std::wstring::npos;
+}
+
+std::string NormalizePathSeparator(std::string str) {
+  size_t start_pos = 0;
+  while ((start_pos = str.find(kUnixSep, start_pos)) != std::string::npos) {
+    str.replace(start_pos, sizeof(kUnixSep) - 1, kWin32Sep);
+    start_pos += sizeof(kWin32Sep) - 1;
+  }
+  return str;
+}
+
+std::wstring NormalizePathSeparator(std::wstring str) {
+  size_t start_pos = 0;
+  while ((start_pos = str.find(kUnixSepW, start_pos)) != std::wstring::npos) {
+    str.replace(start_pos, sizeof(kUnixSepW) / 2 - 1, kWin32SepW);
+    start_pos += sizeof(kWin32SepW) / 2 - 1;
+  }
+  return str;
+}
+
+bool StringCanNarrow(const std::wstring& str) {
+  for (wchar_t value : str) {
+    char narrow_val = static_cast<char>(value);
+    if (value != narrow_val) {
+      return false;
+    }
+  }
+  return true;
+}
+
+}  // namespace
+
+std::wstring NormalizeWin32Path(std::string str) {
+  return NormalizeWin32Path(CStringToWString(str.c_str()));
+}
+
+std::wstring NormalizeWin32Path(std::wstring str) {
+  return NormalizePathSeparator(str);
+}
+
+HANDLE OpenFileOrDirectory(const char* path,
+                           int flags,
+                           bool* out_created,
+                           SbFileError* out_error) {
+  // Note that FILE_SHARE_DELETE allows a file to be deleted while there
+  // are other handles open for read/write. This is necessary for the
+  // Async file tests which, due to system timing, will sometimes have
+  // outstanding handles open and fail to delete, failing the test.
+  const DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE |
+                           FILE_SHARE_DELETE;
+
+  DWORD creation_disposition = 0;
+  if (flags & kSbFileCreateOnly) {
+    SB_DCHECK(!creation_disposition);
+    SB_DCHECK(!(flags & kSbFileCreateAlways));
+    creation_disposition = CREATE_NEW;
+  }
+
+  if (out_created) {
+    *out_created = false;
+  }
+
+  if (flags & kSbFileCreateAlways) {
+    SB_DCHECK(!creation_disposition);
+    SB_DCHECK(!(flags & kSbFileCreateOnly));
+    creation_disposition = CREATE_ALWAYS;
+  }
+
+  if (flags & kSbFileOpenTruncated) {
+    SB_DCHECK(!creation_disposition);
+    SB_DCHECK(flags & kSbFileWrite);
+    creation_disposition = TRUNCATE_EXISTING;
+  }
+
+  if (flags & kSbFileOpenOnly) {
+    SB_DCHECK(!(flags & kSbFileOpenAlways));
+    creation_disposition = OPEN_EXISTING;
+  }
+
+  if (flags & kSbFileOpenAlways) {
+    SB_DCHECK(!(flags & kSbFileOpenOnly));
+    creation_disposition = OPEN_ALWAYS;
+  }
+
+  if (!creation_disposition && !(flags & kSbFileOpenOnly) &&
+      !(flags & kSbFileOpenAlways)) {
+    SB_NOTREACHED();
+    errno = ENOTSUP;
+    if (out_error) {
+      *out_error = kSbFileErrorFailed;
+    }
+
+    return kSbFileInvalid;
+  }
+
+  DWORD desired_access = 0;
+  if (flags & kSbFileRead) {
+    desired_access |= GENERIC_READ;
+  }
+
+  const bool open_file_in_write_mode = flags & kSbFileWrite;
+  if (open_file_in_write_mode) {
+    desired_access |= GENERIC_WRITE;
+  }
+
+  // TODO: Support asynchronous IO, if necessary.
+  SB_DCHECK(!(flags & kSbFileAsync));
+
+  SB_DCHECK(desired_access != 0) << "Invalid permission flag.";
+
+  std::wstring path_wstring = NormalizeWin32Path(path);
+
+  CREATEFILE2_EXTENDED_PARAMETERS create_ex_params = {0};
+  // Enabling |FILE_FLAG_BACKUP_SEMANTICS| allows us to figure out if the path
+  // is a directory.
+  create_ex_params.dwFileFlags = FILE_FLAG_BACKUP_SEMANTICS;
+  create_ex_params.dwFileFlags |= FILE_FLAG_POSIX_SEMANTICS;
+  create_ex_params.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
+  create_ex_params.dwSecurityQosFlags = SECURITY_ANONYMOUS;
+  create_ex_params.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
+
+  const bool file_exists_prior_to_open = SbFileExists(path);
+
+  HANDLE file_handle =
+      CreateFile2(path_wstring.c_str(), desired_access, share_mode,
+                  creation_disposition, &create_ex_params);
+
+  const bool file_exists_after_open = SbFileExists(path);
+
+  if (out_created && starboard::shared::win32::IsValidHandle(file_handle)) {
+    if (flags & kSbFileCreateAlways) {
+      *out_created = file_exists_after_open;
+    } else {
+      *out_created = (!file_exists_prior_to_open && file_exists_after_open);
+    }
+  }
+
+  const DWORD last_error = GetLastError();
+
+  if (out_error) {
+    if (starboard::shared::win32::IsValidHandle(file_handle)) {
+      *out_error = kSbFileOk;
+    } else {
+      switch (last_error) {
+        case ERROR_ACCESS_DENIED:
+          *out_error = kSbFileErrorAccessDenied;
+          break;
+        case ERROR_FILE_EXISTS: {
+          if (flags & kSbFileCreateOnly) {
+            *out_error = kSbFileErrorExists;
+          } else {
+            *out_error = kSbFileErrorAccessDenied;
+          }
+          break;
+        }
+        case ERROR_FILE_NOT_FOUND:
+          *out_error = kSbFileErrorNotFound;
+          break;
+        default:
+          *out_error = kSbFileErrorFailed;
+      }
+    }
+  }
+
+  return file_handle;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/file_internal.h b/starboard/shared/win32/file_internal.h
new file mode 100644
index 0000000..9f60f69
--- /dev/null
+++ b/starboard/shared/win32/file_internal.h
@@ -0,0 +1,99 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_FILE_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_FILE_INTERNAL_H_
+
+#include <wtypes.h>
+
+#include <cwchar>  // This file included for std::wcslen.
+#include <string>
+
+#include "starboard/file.h"
+#include "starboard/shared/internal_only.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+inline bool IsValidHandle(HANDLE handle) {
+  return handle != INVALID_HANDLE_VALUE;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#pragma warning(push)
+
+// SbFilePrivate is defined as a struct, but for windows implementation
+// enough functionality has been added so that it warrants being a class
+// per Google's C++ style guide.  This mismatch causes the Microsoft's compiler
+// to generate a warning.
+#pragma warning(disable : 4099)
+
+class SbFilePrivate {
+ public:
+  explicit SbFilePrivate(HANDLE handle) : file_handle(handle) {}
+
+  bool HasValidHandle() const {
+    return starboard::shared::win32::IsValidHandle(file_handle);
+  }
+
+  HANDLE file_handle;
+
+  // SbFilePrivate is neither copyable nor movable.
+  SbFilePrivate(const SbFilePrivate&) = delete;
+  SbFilePrivate& operator=(const SbFilePrivate&) = delete;
+};
+#pragma warning(pop)
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+inline bool HasValidHandle(SbFile file) {
+  if (!SbFileIsValid(file)) {
+    return false;
+  }
+
+  return file->HasValidHandle();
+}
+
+inline bool PathEndsWith(const std::wstring& path, const wchar_t* filename) {
+  size_t filename_length = std::wcslen(filename);
+  if (filename_length > path.size()) {
+    return false;
+  }
+
+  size_t path_offset = path.size() - filename_length;
+
+  return _wcsicmp(path.c_str() + path_offset, filename) == 0;
+}
+
+// Path's from cobalt use "/" as a path separator. This function will
+// replace all of the "/" with "\".
+std::wstring NormalizeWin32Path(std::string str);
+std::wstring NormalizeWin32Path(std::wstring str);
+
+HANDLE OpenFileOrDirectory(const char* path,
+                           int flags,
+                           bool* out_created,
+                           SbFileError* out_error);
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_FILE_INTERNAL_H_
diff --git a/starboard/shared/win32/file_open.cc b/starboard/shared/win32/file_open.cc
new file mode 100644
index 0000000..6d7c18e
--- /dev/null
+++ b/starboard/shared/win32/file_open.cc
@@ -0,0 +1,41 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include "starboard/shared/win32/file_internal.h"
+
+SbFile SbFileOpen(const char* path,
+                  int flags,
+                  bool* out_created,
+                  SbFileError* out_error) {
+  if ((path == nullptr) || (path[0] == '\0')) {
+    if (out_created) {
+      *out_created = false;
+    }
+    if (out_error) {
+      *out_error = kSbFileErrorNotAFile;
+    }
+    return kSbFileInvalid;
+  }
+
+  HANDLE file_handle =
+      starboard::shared::win32::OpenFileOrDirectory(path, flags, out_created, out_error);
+
+  if (!starboard::shared::win32::IsValidHandle(file_handle)) {
+    return kSbFileInvalid;
+  }
+
+  return new SbFilePrivate(file_handle);
+}
diff --git a/starboard/shared/win32/file_read.cc b/starboard/shared/win32/file_read.cc
new file mode 100644
index 0000000..e0efce4
--- /dev/null
+++ b/starboard/shared/win32/file_read.cc
@@ -0,0 +1,47 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/file_internal.h"
+
+int SbFileRead(SbFile file, char* data, int size) {
+  SB_DCHECK((size == 0) || (data != nullptr));
+
+  if (!starboard::shared::win32::HasValidHandle(file)) {
+    return -1;
+  }
+
+  if (size < 0) {
+    SB_NOTREACHED();
+    return -1;
+  } else if (size == 0) {
+    return 0;
+  }
+
+  DWORD number_bytes_read = 0;
+  BOOL success =
+      ReadFile(file->file_handle, data, size, &number_bytes_read, nullptr);
+
+  // Since we are only doing synchronous IO, success == FALSE implies that
+  // something is wrong.
+  if (!success) {
+    return -1;
+  }
+
+  return number_bytes_read;
+}
diff --git a/starboard/shared/win32/file_seek.cc b/starboard/shared/win32/file_seek.cc
new file mode 100644
index 0000000..6400594
--- /dev/null
+++ b/starboard/shared/win32/file_seek.cc
@@ -0,0 +1,38 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/file_internal.h"
+
+int64_t SbFileSeek(SbFile file, SbFileWhence whence, int64_t offset) {
+  if (!starboard::shared::win32::HasValidHandle(file)) {
+    return -1;
+  }
+
+  LARGE_INTEGER new_file_pointer = {0};
+  LARGE_INTEGER offset_argument = {0};
+  offset_argument.QuadPart = offset;
+  BOOL success =
+      SetFilePointerEx(file->file_handle, offset_argument, &new_file_pointer,
+                       static_cast<DWORD>(whence));
+
+  if (!success) {
+    return -1;
+  }
+
+  return new_file_pointer.QuadPart;
+}
diff --git a/starboard/shared/win32/file_truncate.cc b/starboard/shared/win32/file_truncate.cc
new file mode 100644
index 0000000..7e77ab9
--- /dev/null
+++ b/starboard/shared/win32/file_truncate.cc
@@ -0,0 +1,102 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include <algorithm>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/file_internal.h"
+
+namespace {
+static const char k4KZeroPage[4 * 1024] = {0};
+
+bool WriteZerosToFile(HANDLE file_handle,
+                      LARGE_INTEGER begin,
+                      LARGE_INTEGER end) {
+  SB_DCHECK(starboard::shared::win32::IsValidHandle(file_handle));
+  int64_t bytes_left_to_write = end.QuadPart - begin.QuadPart;
+  if (bytes_left_to_write <= 0) {
+    return true;
+  }
+
+  // Set the file pointer to |begin|.
+  if (!SetFilePointerEx(file_handle, begin, NULL, FILE_BEGIN)) {
+    return false;
+  }
+
+  // Write from zeros from |begin| to |end|.
+  while (bytes_left_to_write > 0) {
+    int64_t bytes_to_write =
+        std::min<int64_t>(SB_ARRAY_SIZE(k4KZeroPage), bytes_left_to_write);
+    SB_DCHECK(bytes_to_write <= kSbInt32Max);
+
+    DWORD bytes_written = 0;
+    if (!WriteFile(file_handle, k4KZeroPage, static_cast<int>(bytes_to_write),
+                   &bytes_written, NULL)) {
+      return false;
+    }
+
+    bytes_left_to_write -= bytes_written;
+  }
+
+  return true;
+}
+
+}  // namespace
+
+bool SbFileTruncate(SbFile file, int64_t length) {
+  if (!starboard::shared::win32::HasValidHandle(file) || length < 0) {
+    return false;
+  }
+
+  HANDLE file_handle = file->file_handle;
+
+  // Get current position.
+  LARGE_INTEGER current_position = {0};
+  BOOL success =
+      SetFilePointerEx(file_handle, {0}, &current_position, FILE_CURRENT);
+
+  if (!success) {
+    return false;
+  }
+
+  bool return_value = false;
+  do {
+    LARGE_INTEGER old_eof = {0};
+    if (!SetFilePointerEx(file_handle, {0}, &old_eof, FILE_END)) {
+      break;
+    }
+
+    LARGE_INTEGER new_eof = {0};
+    new_eof.QuadPart = length;
+    if (!SetFilePointerEx(file_handle, new_eof, NULL, FILE_BEGIN)) {
+      break;
+    }
+
+    if (!SetEndOfFile(file_handle)) {
+      break;
+    }
+
+    WriteZerosToFile(file_handle, old_eof, new_eof);
+    return_value = true;
+  } while (0);
+
+  // Set the file pointer position back where it was.
+  SetFilePointerEx(file_handle, current_position, NULL, FILE_BEGIN);
+
+  return return_value;
+}
diff --git a/starboard/shared/win32/file_write.cc b/starboard/shared/win32/file_write.cc
new file mode 100644
index 0000000..6e56f68
--- /dev/null
+++ b/starboard/shared/win32/file_write.cc
@@ -0,0 +1,42 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/file.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/file_internal.h"
+
+int SbFileWrite(SbFile file, const char* data, int size) {
+  // TODO: Support asynchronous IO, if necessary.
+  SB_DCHECK((size == 0) || (data != nullptr));
+  if (!SbFileIsValid(file)) {
+    return -1;
+  }
+  if (size < 0) {
+    SB_NOTREACHED();
+    return -1;
+  } else if (size == 0) {
+    return 0;
+  }
+
+  DWORD bytes_written = 0;
+  bool success = WriteFile(file->file_handle, data, size, &bytes_written, NULL);
+  if (!success) {
+    return -1;
+  }
+
+  return bytes_written;
+}
diff --git a/starboard/shared/win32/get_home_directory.cc b/starboard/shared/win32/get_home_directory.cc
new file mode 100644
index 0000000..5e7cf0c
--- /dev/null
+++ b/starboard/shared/win32/get_home_directory.cc
@@ -0,0 +1,96 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <objbase.h>
+#include <shlobj.h>
+#include <shlwapi.h>
+
+// Windows defines GetCommandLine as a macro to GetCommandLineW which
+// breaks our Application::GetCommandLine call below; thus we undefine
+// it after including our Windows headers.
+#undef GetCommandLine
+
+#include <cstdlib>
+#include <cstring>
+#include <string>
+
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/shared/nouser/user_internal.h"
+#include "starboard/shared/starboard/application.h"
+#include "starboard/shared/starboard/command_line.h"
+#include "starboard/shared/win32/application_win32.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/wchar_utils.h"
+#include "starboard/system.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+using starboard::shared::starboard::CommandLine;
+
+namespace starboard {
+namespace shared {
+namespace nouser {
+
+bool GetHomeDirectory(SbUser user, char* out_path, int path_size) {
+  if (user != SbUserGetCurrent()) {
+    return false;
+  }
+
+  PWSTR local_app_data_path = nullptr;
+
+  if (S_OK == SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr,
+                                   &local_app_data_path)) {
+    TCHAR wide_path[MAX_PATH];
+    wcscpy(wide_path, local_app_data_path);
+    CoTaskMemFree(local_app_data_path);
+    // Instead of using the raw local AppData directory, we create a program
+    // app directory if it doesn't exist already.
+    TCHAR program_name[MAX_PATH];
+    DWORD program_name_length = GetModuleFileName(NULL, program_name, MAX_PATH);
+    if (program_name_length == 0) {
+      SB_LOG(ERROR) << "GetModuleFileName failed";
+      sbwin32::DebugLogWinError();
+      return false;
+    }
+    PathStripPath(program_name);
+    PathAppend(wide_path, program_name);
+    if (!PathFileExists(wide_path)) {
+      SECURITY_ATTRIBUTES security_attributes = {sizeof(SECURITY_ATTRIBUTES),
+                                                 NULL, TRUE};
+      const BOOL created_directory =
+          CreateDirectory(wide_path, &security_attributes);
+      if (!created_directory) {
+        SB_LOG(ERROR) << "Failed to create home directory";
+        sbwin32::DebugLogWinError();
+        return false;
+      }
+    }
+
+    const size_t actual_path_length = wcslen(wide_path);
+    if (path_size < actual_path_length) {
+      SB_LOG(ERROR) << "Home directory length exceeds max path size";
+      return false;
+    }
+    std::wcstombs(out_path, wide_path, actual_path_length + 1);
+    return true;
+  }
+  SB_LOG(ERROR) << "Unable to open local AppData as home directory.";
+  sbwin32::DebugLogWinError();
+  return false;
+}
+
+}  // namespace nouser
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/graphics.cc b/starboard/shared/win32/graphics.cc
new file mode 100644
index 0000000..0259a60
--- /dev/null
+++ b/starboard/shared/win32/graphics.cc
@@ -0,0 +1,53 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/graphics.h"
+
+#include "cobalt/extension/graphics.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+namespace {
+
+float GetMaximumFrameIntervalInMilliseconds() {
+  // Allow the rasterizer to delay rendering indefinitely if nothing has
+  // changed.
+  return -1.0f;
+}
+
+float GetMinimumFrameIntervalInMilliseconds() {
+  // Frame presentation is blocked on vsync, so the render thread will also
+  // block on vsync. However, use a non-zero minimum frame time to avoid
+  // possible busy-loops on unrendered submissions.
+  return 1.0f;
+}
+
+const CobaltExtensionGraphicsApi kGraphicsApi = {
+  kCobaltExtensionGraphicsName,
+  2,
+  &GetMaximumFrameIntervalInMilliseconds,
+  &GetMinimumFrameIntervalInMilliseconds,
+};
+
+}  // namespace
+
+const void* GetGraphicsApi() {
+  return &kGraphicsApi;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/graphics.h b/starboard/shared/win32/graphics.h
new file mode 100644
index 0000000..555a24a
--- /dev/null
+++ b/starboard/shared/win32/graphics.h
@@ -0,0 +1,28 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_GRAPHICS_H_
+#define STARBOARD_SHARED_WIN32_GRAPHICS_H_
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+const void* GetGraphicsApi();
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_GRAPHICS_H_
diff --git a/starboard/shared/win32/gyp_configuration.py b/starboard/shared/win32/gyp_configuration.py
new file mode 100644
index 0000000..7893875
--- /dev/null
+++ b/starboard/shared/win32/gyp_configuration.py
@@ -0,0 +1,23 @@
+# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard win32 shared platform configuration for gyp_cobalt."""
+
+from starboard.build import platform_configuration
+
+MSVS_VERSION = 2017
+
+
+class Win32SharedConfiguration(platform_configuration.PlatformConfiguration):
+  """Starboard Microsoft Windows platform configuration."""
+  pass
diff --git a/starboard/shared/win32/hardware_decode_target_internal.cc b/starboard/shared/win32/hardware_decode_target_internal.cc
new file mode 100644
index 0000000..80859fc
--- /dev/null
+++ b/starboard/shared/win32/hardware_decode_target_internal.cc
@@ -0,0 +1,382 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/hardware_decode_target_internal.h"
+
+#include "starboard/common/log.h"
+#include "starboard/configuration.h"
+#include "starboard/memory.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "third_party/angle/include/EGL/egl.h"
+#include "third_party/angle/include/EGL/eglext.h"
+#include "third_party/angle/include/GLES2/gl2.h"
+#include "third_party/angle/include/GLES2/gl2ext.h"
+
+namespace {
+
+using Microsoft::WRL::ComPtr;
+
+// {3C3A43AB-C69B-46C9-AA8D-B0CFFCD4596D}
+const GUID kCobaltNv12BindChroma = {
+    0x3c3a43ab,
+    0xc69b,
+    0x46c9,
+    {0xaa, 0x8d, 0xb0, 0xcf, 0xfc, 0xd4, 0x59, 0x6d}};
+
+ComPtr<ID3D11Texture2D> AllocateTexture(const ComPtr<ID3D11Device>& d3d_device,
+                                        SbDecodeTargetFormat format,
+                                        int width,
+                                        int height) {
+  ComPtr<ID3D11Texture2D> texture;
+  D3D11_TEXTURE2D_DESC texture_desc = {};
+  texture_desc.Width = width;
+  texture_desc.Height = height;
+  texture_desc.MipLevels = 1;
+  texture_desc.ArraySize = 1;
+  switch (format) {
+    case kSbDecodeTargetFormat2PlaneYUVNV12:
+      texture_desc.Format = DXGI_FORMAT_NV12;
+      break;
+    case kSbDecodeTargetFormat1PlaneRGBA:
+      texture_desc.Format = DXGI_FORMAT_R10G10B10A2_UNORM;
+      break;
+    default:
+      SB_NOTREACHED();
+  }
+
+  texture_desc.SampleDesc.Count = 1;
+  texture_desc.SampleDesc.Quality = 0;
+  texture_desc.Usage = D3D11_USAGE_DEFAULT;
+  texture_desc.BindFlags =
+      D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
+  CheckResult(d3d_device->CreateTexture2D(&texture_desc, nullptr,
+                                          texture.GetAddressOf()));
+  return texture;
+}
+
+void UpdateTexture(
+    const ComPtr<ID3D11Texture2D>& texture,
+    const ComPtr<ID3D11VideoDevice1>& video_device,
+    const ComPtr<ID3D11VideoContext>& video_context,
+    const ComPtr<ID3D11VideoProcessorEnumerator>& video_enumerator,
+    const ComPtr<ID3D11VideoProcessor>& video_processor,
+    const ComPtr<IMFSample>& video_sample,
+    const RECT& video_area) {
+  ComPtr<IMFMediaBuffer> media_buffer;
+  CheckResult(video_sample->GetBufferByIndex(0, media_buffer.GetAddressOf()));
+
+  ComPtr<IMFDXGIBuffer> dxgi_buffer;
+  CheckResult(media_buffer.As(&dxgi_buffer));
+
+  ComPtr<ID3D11Texture2D> input_texture;
+  CheckResult(dxgi_buffer->GetResource(IID_PPV_ARGS(&input_texture)));
+
+  // The VideoProcessor needs to know what subset of the decoded
+  // frame contains active pixels that should be displayed to the user.
+  video_context->VideoProcessorSetStreamSourceRect(video_processor.Get(), 0,
+                                                   TRUE, &video_area);
+
+  D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC input_desc = {};
+  input_desc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D;
+  input_desc.Texture2D.MipSlice = 0;
+  dxgi_buffer->GetSubresourceIndex(&input_desc.Texture2D.ArraySlice);
+
+  ComPtr<ID3D11VideoProcessorInputView> input_view;
+  CheckResult(video_device->CreateVideoProcessorInputView(
+      input_texture.Get(), video_enumerator.Get(), &input_desc,
+      input_view.GetAddressOf()));
+
+  D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC output_desc = {};
+  output_desc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D;
+  output_desc.Texture2D.MipSlice = 0;
+
+  ComPtr<ID3D11VideoProcessorOutputView> output_view;
+  CheckResult(video_device->CreateVideoProcessorOutputView(
+      texture.Get(), video_enumerator.Get(), &output_desc,
+      output_view.GetAddressOf()));
+
+  // We have a single video stream, which is enabled for display.
+  D3D11_VIDEO_PROCESSOR_STREAM stream_info = {};
+  stream_info.Enable = TRUE;
+  stream_info.pInputSurface = input_view.Get();
+  CheckResult(video_context->VideoProcessorBlt(
+      video_processor.Get(), output_view.Get(), 0, 1, &stream_info));
+}
+
+}  // namespace
+
+HardwareDecodeTargetPrivate::HardwareDecodeTargetPrivate(
+    const ComPtr<ID3D11Device>& d3d_device,
+    const ComPtr<ID3D11VideoDevice1>& video_device,
+    const ComPtr<ID3D11VideoContext>& video_context,
+    const ComPtr<ID3D11VideoProcessorEnumerator>& video_enumerator,
+    const ComPtr<ID3D11VideoProcessor>& video_processor,
+    const ComPtr<IMFSample>& video_sample,
+    const RECT& video_area,
+    bool texture_RGBA)
+    : texture_RGBA_(texture_RGBA) {
+  memset(&info, 0, sizeof(info));
+  info.is_opaque = true;
+  info.width = video_area.right;
+  info.height = video_area.bottom;
+
+  if (texture_RGBA_) {
+    info.format = kSbDecodeTargetFormat1PlaneRGBA;
+  } else {
+    info.format = kSbDecodeTargetFormat2PlaneYUVNV12;
+  }
+
+  d3d_texture =
+      AllocateTexture(d3d_device, info.format, info.width, info.height);
+  if (video_sample) {
+    UpdateTexture(d3d_texture, video_device, video_context, video_enumerator,
+                  video_processor, video_sample, video_area);
+  }
+
+  if (texture_RGBA_) {
+    InitTextureRGBA();
+  } else {
+    InitTextureYUV();
+  }
+}
+
+void HardwareDecodeTargetPrivate::InitTextureYUV() {
+  SbDecodeTargetInfoPlane* planeY = &(info.planes[kSbDecodeTargetPlaneY]);
+  SbDecodeTargetInfoPlane* planeUV = &(info.planes[kSbDecodeTargetPlaneUV]);
+
+  planeY->width = info.width;
+  planeY->height = info.height;
+  planeY->content_region.left = 0;
+  planeY->content_region.top = info.height;
+  planeY->content_region.right = info.width;
+  planeY->content_region.bottom = 0;
+
+  planeUV->width = info.width / 2;
+  planeUV->height = info.height / 2;
+  planeUV->content_region.left = planeY->content_region.left / 2;
+  planeUV->content_region.top = planeY->content_region.top / 2;
+  planeUV->content_region.right = planeY->content_region.right / 2;
+  planeUV->content_region.bottom = planeY->content_region.bottom / 2;
+
+  EGLint luma_texture_attributes[] = {EGL_WIDTH,
+                                      static_cast<EGLint>(info.width),
+                                      EGL_HEIGHT,
+                                      static_cast<EGLint>(info.height),
+                                      EGL_TEXTURE_TARGET,
+                                      EGL_TEXTURE_2D,
+                                      EGL_TEXTURE_FORMAT,
+                                      EGL_TEXTURE_RGBA,
+                                      EGL_NONE};
+
+  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+
+  EGLConfig config;
+  EGLint attribute_list[] = {EGL_SURFACE_TYPE,  // this must be first
+                             EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
+                             EGL_RED_SIZE,
+                             8,
+                             EGL_GREEN_SIZE,
+                             8,
+                             EGL_BLUE_SIZE,
+                             8,
+                             EGL_ALPHA_SIZE,
+                             8,
+                             EGL_BIND_TO_TEXTURE_RGBA,
+                             EGL_TRUE,
+                             EGL_RENDERABLE_TYPE,
+                             EGL_OPENGL_ES2_BIT,
+                             EGL_NONE};
+
+  EGLint num_configs;
+  bool ok = eglChooseConfig(display, attribute_list, &config, 1, &num_configs);
+  SB_DCHECK(ok);
+  SB_DCHECK(num_configs == 1);
+
+  GLuint gl_textures[2] = {0};
+  glGenTextures(2, gl_textures);
+  SB_DCHECK(glGetError() == GL_NO_ERROR);
+
+  // This tells ANGLE that the texture it creates should draw
+  // the luma channel on R8.
+  HRESULT hr = d3d_texture->SetPrivateData(kCobaltNv12BindChroma, 0, nullptr);
+  SB_DCHECK(SUCCEEDED(hr));
+
+  surface[0] = eglCreatePbufferFromClientBuffer(display, EGL_D3D_TEXTURE_ANGLE,
+                                                d3d_texture.Get(), config,
+                                                luma_texture_attributes);
+
+  SB_DCHECK(surface[0] != EGL_NO_SURFACE);
+
+  glBindTexture(GL_TEXTURE_2D, gl_textures[0]);
+  SB_DCHECK(glGetError() == GL_NO_ERROR);
+
+  ok = eglBindTexImage(display, surface[0], EGL_BACK_BUFFER);
+  SB_DCHECK(ok);
+
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+  planeY->texture = gl_textures[0];
+  planeY->gl_texture_target = GL_TEXTURE_2D;
+  planeY->gl_texture_format = GL_RED_EXT;
+
+  // This tells ANGLE that the texture it creates should draw
+  // the chroma channel on R8G8.
+  bool bind_chroma = true;
+  hr = d3d_texture->SetPrivateData(kCobaltNv12BindChroma, 1, &bind_chroma);
+  SB_DCHECK(SUCCEEDED(hr));
+
+  EGLint chroma_texture_attributes[] = {EGL_WIDTH,
+                                        static_cast<EGLint>(info.width) / 2,
+                                        EGL_HEIGHT,
+                                        static_cast<EGLint>(info.height) / 2,
+                                        EGL_TEXTURE_TARGET,
+                                        EGL_TEXTURE_2D,
+                                        EGL_TEXTURE_FORMAT,
+                                        EGL_TEXTURE_RGBA,
+                                        EGL_NONE};
+  surface[1] = eglCreatePbufferFromClientBuffer(display, EGL_D3D_TEXTURE_ANGLE,
+                                                d3d_texture.Get(), config,
+                                                chroma_texture_attributes);
+
+  SB_DCHECK(surface[1] != EGL_NO_SURFACE);
+
+  glBindTexture(GL_TEXTURE_2D, gl_textures[1]);
+  SB_DCHECK(glGetError() == GL_NO_ERROR);
+
+  ok = eglBindTexImage(display, surface[1], EGL_BACK_BUFFER);
+  SB_DCHECK(ok);
+
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+  planeUV->texture = gl_textures[1];
+  planeUV->gl_texture_target = GL_TEXTURE_2D;
+  planeUV->gl_texture_format = GL_RG_EXT;
+}
+
+void HardwareDecodeTargetPrivate::InitTextureRGBA() {
+  SbDecodeTargetInfoPlane* planeRGBA = &(info.planes[kSbDecodeTargetPlaneRGBA]);
+
+  planeRGBA->width = info.width;
+  planeRGBA->height = info.height;
+  planeRGBA->content_region.left = 0;
+  planeRGBA->content_region.top = info.height;
+  planeRGBA->content_region.right = info.width;
+  planeRGBA->content_region.bottom = 0;
+
+  EGLint RGBA_texture_attributes[] = {EGL_WIDTH,
+                                      static_cast<EGLint>(info.width),
+                                      EGL_HEIGHT,
+                                      static_cast<EGLint>(info.height),
+                                      EGL_TEXTURE_TARGET,
+                                      EGL_TEXTURE_2D,
+                                      EGL_TEXTURE_FORMAT,
+                                      EGL_TEXTURE_RGBA,
+                                      EGL_NONE};
+
+  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+
+  EGLConfig config;
+  EGLint attribute_list[] = {EGL_SURFACE_TYPE,  // this must be first
+                             EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
+                             EGL_RED_SIZE,
+                             10,
+                             EGL_GREEN_SIZE,
+                             10,
+                             EGL_BLUE_SIZE,
+                             10,
+                             EGL_ALPHA_SIZE,
+                             2,
+                             EGL_BIND_TO_TEXTURE_RGBA,
+                             EGL_TRUE,
+                             EGL_RENDERABLE_TYPE,
+                             EGL_OPENGL_ES2_BIT,
+                             EGL_NONE};
+
+  EGLint num_configs;
+  bool ok = eglChooseConfig(display, attribute_list, &config, 1, &num_configs);
+  SB_DCHECK(ok);
+  SB_DCHECK(num_configs == 1);
+
+  GLuint gl_textures[2] = {0};
+  glGenTextures(2, gl_textures);
+  SB_DCHECK(glGetError() == GL_NO_ERROR);
+
+  surface[0] = eglCreatePbufferFromClientBuffer(display, EGL_D3D_TEXTURE_ANGLE,
+                                                d3d_texture.Get(), config,
+                                                RGBA_texture_attributes);
+
+  SB_DCHECK(surface[0] != EGL_NO_SURFACE);
+
+  glBindTexture(GL_TEXTURE_2D, gl_textures[0]);
+  SB_DCHECK(glGetError() == GL_NO_ERROR);
+
+  ok = eglBindTexImage(display, surface[0], EGL_BACK_BUFFER);
+  SB_DCHECK(ok);
+
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+  planeRGBA->texture = gl_textures[0];
+  planeRGBA->gl_texture_target = GL_TEXTURE_2D;
+  planeRGBA->gl_texture_format = GL_RED_EXT;
+}
+
+HardwareDecodeTargetPrivate::~HardwareDecodeTargetPrivate() {
+  if (!texture_RGBA_) {
+    glDeleteTextures(1, &(info.planes[kSbDecodeTargetPlaneY].texture));
+    glDeleteTextures(1, &(info.planes[kSbDecodeTargetPlaneUV].texture));
+  }
+
+  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+
+  eglReleaseTexImage(display, surface[0], EGL_BACK_BUFFER);
+  eglDestroySurface(display, surface[0]);
+
+  if (!texture_RGBA_) {
+    eglReleaseTexImage(display, surface[1], EGL_BACK_BUFFER);
+    eglDestroySurface(display, surface[1]);
+  }
+}
+
+bool HardwareDecodeTargetPrivate::Update(
+    const ComPtr<ID3D11Device>& d3d_device,
+    const ComPtr<ID3D11VideoDevice1>& video_device,
+    const ComPtr<ID3D11VideoContext>& video_context,
+    const ComPtr<ID3D11VideoProcessorEnumerator>& video_enumerator,
+    const ComPtr<ID3D11VideoProcessor>& video_processor,
+    const ComPtr<IMFSample>& video_sample,
+    const RECT& video_area,
+    bool texture_RGBA) {
+  // Only allow updating if this is the only reference. Otherwise the update
+  // may change something that's currently being used.
+  if (SbAtomicNoBarrier_Load(&refcount) > 1) {
+    return false;
+  }
+
+  // The decode target info must be compatible. The resolution should match
+  // exactly, otherwise the shader may sample invalid texels along the
+  // texture border.
+  if ((texture_RGBA ^ (info.format != kSbDecodeTargetFormat2PlaneYUVNV12)) ||
+      (texture_RGBA ^ (info.format == kSbDecodeTargetFormat1PlaneRGBA)) ||
+      info.is_opaque != true || info.width != video_area.right ||
+      info.height != video_area.bottom) {
+    return false;
+  }
+
+  UpdateTexture(d3d_texture, video_device, video_context, video_enumerator,
+                video_processor, video_sample, video_area);
+  return true;
+}
diff --git a/starboard/shared/win32/hardware_decode_target_internal.h b/starboard/shared/win32/hardware_decode_target_internal.h
new file mode 100644
index 0000000..8fccdbe
--- /dev/null
+++ b/starboard/shared/win32/hardware_decode_target_internal.h
@@ -0,0 +1,64 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_HARDWARE_DECODE_TARGET_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_HARDWARE_DECODE_TARGET_INTERNAL_H_
+
+#include <D3d11_1.h>
+#include <mfidl.h>
+#include <wrl/client.h>
+
+#include "starboard/atomic.h"
+#include "starboard/decode_target.h"
+#include "starboard/shared/win32/decode_target_internal.h"
+
+struct HardwareDecodeTargetPrivate : public SbDecodeTargetPrivate {
+  template <typename T>
+  using ComPtr = ::Microsoft::WRL::ComPtr<T>;
+
+  ComPtr<ID3D11Texture2D> d3d_texture;
+  bool texture_RGBA_;
+
+  // EGLSurface is defined as void* in "third_party/angle/include/EGL/egl.h".
+  // Use void* directly here to avoid `egl.h` being included broadly.
+  void* surface[2];
+
+  HardwareDecodeTargetPrivate(
+      const ComPtr<ID3D11Device>& d3d_device,
+      const ComPtr<ID3D11VideoDevice1>& video_device,
+      const ComPtr<ID3D11VideoContext>& video_context,
+      const ComPtr<ID3D11VideoProcessorEnumerator>& video_enumerator,
+      const ComPtr<ID3D11VideoProcessor>& video_processor,
+      const ComPtr<IMFSample>& video_sample,
+      const RECT& video_area,
+      bool texture_RGBA);
+  ~HardwareDecodeTargetPrivate() override;
+
+  // Update the existing texture with the given video_sample's data.
+  // If the current object is not compatible with the new video_sample, then
+  // this will return false, and the caller should just create a new
+  // decode target for the sample.
+  bool Update(const ComPtr<ID3D11Device>& d3d_device,
+              const ComPtr<ID3D11VideoDevice1>& video_device,
+              const ComPtr<ID3D11VideoContext>& video_context,
+              const ComPtr<ID3D11VideoProcessorEnumerator>& video_enumerator,
+              const ComPtr<ID3D11VideoProcessor>& video_processor,
+              const ComPtr<IMFSample>& video_sample,
+              const RECT& video_area,
+              bool texture_RGBA);
+  void InitTextureRGBA();
+  void InitTextureYUV();
+};
+
+#endif  // STARBOARD_SHARED_WIN32_HARDWARE_DECODE_TARGET_INTERNAL_H_
diff --git a/starboard/shared/win32/log.cc b/starboard/shared/win32/log.cc
new file mode 100644
index 0000000..51eb1d1
--- /dev/null
+++ b/starboard/shared/win32/log.cc
@@ -0,0 +1,19 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+
+void SbLog(SbLogPriority priority, const char* message) {
+  SbLogRaw(message);
+}
diff --git a/starboard/shared/win32/log_file_impl.cc b/starboard/shared/win32/log_file_impl.cc
new file mode 100644
index 0000000..58904a0
--- /dev/null
+++ b/starboard/shared/win32/log_file_impl.cc
@@ -0,0 +1,118 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/log_file_impl.h"
+
+#include <string>
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/common/mutex.h"
+#include "starboard/common/string.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/file.h"
+#include "starboard/memory.h"
+#include "starboard/once.h"
+#include "starboard/shared/win32/file_internal.h"
+
+namespace {
+
+SbMutex log_mutex = SB_MUTEX_INITIALIZER;
+SbFile log_file = kSbFileInvalid;
+
+// SbMutex is not reentrant, so factor out close log file functionality for use
+// by other functions.
+void CloseLogFileWithoutLock() {
+  if (SbFileIsValid(log_file)) {
+    SbFileFlush(log_file);
+    SbFileClose(log_file);
+    log_file = kSbFileInvalid;
+  }
+}
+
+}  // namespace
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+void CloseLogFile() {
+  SbMutexAcquire(&log_mutex);
+  CloseLogFileWithoutLock();
+  SbMutexRelease(&log_mutex);
+}
+
+void OpenLogInCacheDirectory(const char* log_file_name, int creation_flags) {
+  SB_DCHECK((creation_flags & kSbFileOpenAlways) ||
+            (creation_flags & kSbFileCreateAlways));
+  SB_DCHECK(strlen(log_file_name) != 0);
+  SB_DCHECK(strchr(log_file_name, kSbFileSepChar) == nullptr);
+  std::vector<char> out_path(kSbFileMaxPath + 1);
+  out_path[0] = '\0';
+
+  const int path_size = static_cast<int>(out_path.size());
+  if (!SbSystemGetPath(kSbSystemPathCacheDirectory, out_path.data(),
+                       path_size)) {
+    return;
+  }
+
+  if (starboard::strlcat(out_path.data(), kSbFileSepString, path_size) >=
+      path_size) {
+    return;
+  }
+  if (starboard::strlcat(out_path.data(), log_file_name, path_size) >=
+      path_size) {
+    return;
+  }
+
+  OpenLogFile(out_path.data(), creation_flags);
+}
+
+void OpenLogFile(const char* path, const int creation_flags) {
+  SB_DCHECK((creation_flags & kSbFileOpenAlways) ||
+            (creation_flags & kSbFileCreateAlways));
+  SB_DLOG(INFO) << "Logging to [" << path << "]";
+
+  int flags = creation_flags | kSbFileWrite;
+
+  SbMutexAcquire(&log_mutex);
+  CloseLogFileWithoutLock();
+  if ((path != nullptr) && (path[0] != '\0')) {
+    log_file = SbFileOpen(path, flags, nullptr, nullptr);
+    SB_DCHECK(SbFileIsValid(log_file));
+  }
+
+  SbMutexRelease(&log_mutex);
+}
+
+void WriteToLogFile(const char* text, const int text_length) {
+  if (text_length <= 0) {
+    return;
+  }
+  SbMutexAcquire(&log_mutex);
+  if (!SbFileIsValid(log_file)) {
+    SbMutexRelease(&log_mutex);
+    return;
+  }
+
+  int bytes_written = SbFileWriteAll(log_file, text, text_length);
+  SB_DCHECK(text_length == bytes_written);
+
+  SbFileFlush(log_file);
+  SbMutexRelease(&log_mutex);
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/log_file_impl.h b/starboard/shared/win32/log_file_impl.h
new file mode 100644
index 0000000..cfa17a5
--- /dev/null
+++ b/starboard/shared/win32/log_file_impl.h
@@ -0,0 +1,50 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This header provides a mechanism for multiple Android logging
+// formats to share a single log file handle.
+
+#ifndef STARBOARD_SHARED_WIN32_LOG_FILE_IMPL_H_
+#define STARBOARD_SHARED_WIN32_LOG_FILE_IMPL_H_
+
+#include "starboard/common/mutex.h"
+#include "starboard/file.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// Closes the log file.
+void CloseLogFile();
+
+// Opens a file in |kSbSystemPathCacheDirectory| directory.
+// |log_file_name|: C-style string of a filename
+// |creation_flags|: Must be kSbFileCreateAlways (which will truncate the file)
+//   |kSbFileOpenAlways|, which can be used to append to the file.
+void OpenLogInCacheDirectory(const char* log_file_name, int creation_flags);
+
+// Opens a file at |log_file_path| with |creation_flags|.
+// |log_file_name|: C-style string of a filename
+// |creation_flags|: Must be kSbFileCreateAlways (which will truncate the file)
+//   |kSbFileOpenAlways|, which can be used to append to the file.
+void OpenLogFile(const char* log_file_path, int creation_flags);
+
+// Writes |text_length| bytes starting from |text| to the current log file.
+void WriteToLogFile(const char* text, const int text_length);
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_LOG_FILE_IMPL_H_
diff --git a/starboard/shared/win32/log_flush.cc b/starboard/shared/win32/log_flush.cc
new file mode 100644
index 0000000..5c5a5b9
--- /dev/null
+++ b/starboard/shared/win32/log_flush.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+
+#include <stdio.h>
+
+void SbLogFlush() {
+  fflush(stderr);
+}
diff --git a/starboard/shared/win32/log_format.cc b/starboard/shared/win32/log_format.cc
new file mode 100644
index 0000000..c65266a
--- /dev/null
+++ b/starboard/shared/win32/log_format.cc
@@ -0,0 +1,19 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+
+void SbLogFormat(const char* format, va_list arguments) {
+  SbLogRawFormat(format, arguments);
+}
diff --git a/starboard/shared/win32/log_is_tty.cc b/starboard/shared/win32/log_is_tty.cc
new file mode 100644
index 0000000..bb3f511
--- /dev/null
+++ b/starboard/shared/win32/log_is_tty.cc
@@ -0,0 +1,19 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+
+bool SbLogIsTty() {
+  return false;
+}
diff --git a/starboard/shared/win32/log_raw.cc b/starboard/shared/win32/log_raw.cc
new file mode 100644
index 0000000..77c3efd
--- /dev/null
+++ b/starboard/shared/win32/log_raw.cc
@@ -0,0 +1,33 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+
+#include <stdio.h>
+#include <windows.h>
+
+#include "starboard/common/string.h"
+#include "starboard/shared/starboard/net_log.h"
+#include "starboard/shared/win32/log_file_impl.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+void SbLogRaw(const char* message) {
+  fprintf(stderr, "%s", message);
+  OutputDebugStringA(message);
+  sbwin32::WriteToLogFile(
+      message, static_cast<int>(strlen(message)));
+
+  starboard::shared::starboard::NetLogWrite(message);
+}
diff --git a/starboard/shared/win32/log_raw_dump_stack.cc b/starboard/shared/win32/log_raw_dump_stack.cc
new file mode 100644
index 0000000..180a29b
--- /dev/null
+++ b/starboard/shared/win32/log_raw_dump_stack.cc
@@ -0,0 +1,19 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+
+void SbLogRawDumpStack(int frames_to_skip) {
+  SbLogRaw("TODO stack dump not implemented\n");
+}
diff --git a/starboard/shared/win32/log_raw_format.cc b/starboard/shared/win32/log_raw_format.cc
new file mode 100644
index 0000000..cdae664
--- /dev/null
+++ b/starboard/shared/win32/log_raw_format.cc
@@ -0,0 +1,34 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+
+#include <stdio.h>
+#include <windows.h>
+
+#include "starboard/shared/win32/log_file_impl.h"
+
+static const int kMaxLogLineChars = 16 * 1024;
+
+namespace sbwin32 = starboard::shared::win32;
+
+void SbLogRawFormat(const char* format, va_list arguments) {
+  char log_buffer[kMaxLogLineChars] = {0};
+  int result = vsprintf_s(log_buffer, kMaxLogLineChars-1, format, arguments);
+  if (result > 0) {
+    SbLogRaw(log_buffer);
+  } else {
+    SbLogRaw("[log line too long]");
+  }
+}
diff --git a/starboard/shared/win32/media_common.cc b/starboard/shared/win32/media_common.cc
new file mode 100644
index 0000000..a09843c
--- /dev/null
+++ b/starboard/shared/win32/media_common.cc
@@ -0,0 +1,109 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/media_common.h"
+
+#include <Mfapi.h>
+#include <Mferror.h>
+#include <Mfidl.h>
+#include <Mfobjects.h>
+#include <Rpc.h>
+#include <comutil.h>
+#include <wrl\client.h>  // For ComPtr.
+
+#include "starboard/common/log.h"
+#include "starboard/common/mutex.h"
+#include "starboard/common/ref_counted.h"
+#include "starboard/common/string.h"
+#include "starboard/configuration.h"
+#include "starboard/media.h"
+#include "starboard/shared/starboard/player/filter/player_components.h"
+#include "starboard/shared/starboard/player/input_buffer_internal.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// Converts microseconds to 10Mhz (100ns time).
+int64_t ConvertToWin32Time(SbTime input) {
+  int64_t out = input;
+  out *= 10;
+  return out;
+}
+
+// Convert the other way around.
+SbTime ConvertToSbTime(int64_t input) {
+  SbTime out = input;
+  out /= 10;
+  return out;
+}
+
+std::vector<ComPtr<IMFMediaType>> GetAllOutputMediaTypes(
+    int stream_id,
+    IMFTransform* decoder) {
+  std::vector<ComPtr<IMFMediaType>> output;
+  for (int index = 0;; ++index) {
+    ComPtr<IMFMediaType> media_type;
+    HRESULT hr = decoder->GetOutputAvailableType(stream_id, index, &media_type);
+    if (SUCCEEDED(hr)) {
+      output.push_back(media_type);
+    } else {
+      SB_DCHECK(hr == MF_E_NO_MORE_TYPES);
+      break;
+    }
+  }
+  return output;
+}
+
+std::vector<ComPtr<IMFMediaType>> GetAllInputMediaTypes(
+    int stream_id,
+    IMFTransform* transform) {
+  std::vector<ComPtr<IMFMediaType>> input_types;
+
+  for (DWORD i = 0;; ++i) {
+    ComPtr<IMFMediaType> curr_type;
+    HRESULT hr = transform->GetInputAvailableType(stream_id, i,
+                                                  curr_type.GetAddressOf());
+    if (FAILED(hr)) {
+      break;
+    }
+    input_types.push_back(curr_type);
+  }
+  return input_types;
+}
+
+std::vector<ComPtr<IMFMediaType>> FilterMediaBySubType(
+    const std::vector<ComPtr<IMFMediaType>>& input,
+    GUID sub_type_filter) {
+  std::vector<ComPtr<IMFMediaType>> output;
+  for (auto it = input.begin(); it != input.end(); ++it) {
+    ComPtr<IMFMediaType> media_type = *it;
+    GUID media_sub_type = {0};
+    media_type->GetGUID(MF_MT_SUBTYPE, &media_sub_type);
+    if (IsEqualGUID(media_sub_type, sub_type_filter)) {
+      output.push_back(media_type);
+    }
+  }
+  return output;
+}
+
+HRESULT CreateDecoderTransform(const GUID& decoder_guid,
+                               ComPtr<IMFTransform>* transform) {
+  return CoCreateInstance(decoder_guid, NULL, CLSCTX_INPROC_SERVER,
+                          IID_PPV_ARGS(transform->GetAddressOf()));
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/media_common.h b/starboard/shared/win32/media_common.h
new file mode 100644
index 0000000..eacedfb
--- /dev/null
+++ b/starboard/shared/win32/media_common.h
@@ -0,0 +1,76 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_MEDIA_COMMON_H_
+#define STARBOARD_SHARED_WIN32_MEDIA_COMMON_H_
+
+#include <D3D11.h>
+#include <Mfapi.h>
+#include <Mferror.h>
+#include <Mfidl.h>
+#include <Mfobjects.h>
+#include <Rpc.h>
+#include <comutil.h>
+#include <wrl\client.h>  // For ComPtr.
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/common/mutex.h"
+#include "starboard/common/ref_counted.h"
+#include "starboard/common/string.h"
+#include "starboard/configuration.h"
+#include "starboard/media.h"
+#include "starboard/shared/starboard/player/filter/player_components.h"
+#include "starboard/shared/starboard/player/filter/video_frame_internal.h"
+#include "starboard/shared/starboard/player/input_buffer_internal.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+using DecodedAudio = ::starboard::shared::starboard::player::DecodedAudio;
+using DecodedAudioPtr = ::starboard::scoped_refptr<DecodedAudio>;
+using InputBuffer = ::starboard::shared::starboard::player::InputBuffer;
+using PlayerComponents =
+    ::starboard::shared::starboard::player::filter::PlayerComponents;
+using Status =
+    ::starboard::shared::starboard::player::filter::VideoDecoder::Status;
+using VideoFrame = ::starboard::shared::starboard::player::filter::VideoFrame;
+using VideoFramePtr = ::starboard::scoped_refptr<VideoFrame>;
+using Microsoft::WRL::ComPtr;
+
+// Converts microseconds to 10Mhz (100ns time).
+int64_t ConvertToWin32Time(SbTime input);
+
+// Convert the other way around.
+SbTime ConvertToSbTime(int64_t input);
+
+std::vector<ComPtr<IMFMediaType>> GetAllOutputMediaTypes(int stream_id,
+                                                         IMFTransform* decoder);
+std::vector<ComPtr<IMFMediaType>> GetAllInputMediaTypes(
+    int stream_id,
+    IMFTransform* transform);
+
+std::vector<ComPtr<IMFMediaType>> FilterMediaBySubType(
+    const std::vector<ComPtr<IMFMediaType>>& input,
+    GUID sub_type_filter);
+
+HRESULT CreateDecoderTransform(const GUID& decoder_guid,
+                               ComPtr<IMFTransform>* transform);
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_MEDIA_COMMON_H_
diff --git a/starboard/shared/win32/media_foundation_utils.cc b/starboard/shared/win32/media_foundation_utils.cc
new file mode 100644
index 0000000..052b392
--- /dev/null
+++ b/starboard/shared/win32/media_foundation_utils.cc
@@ -0,0 +1,272 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/media_foundation_utils.h"
+
+#include <Mfapi.h>
+#include <Mferror.h>
+#include <propvarutil.h>
+
+#include <ios>
+#include <sstream>
+#include <utility>
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/error_utils.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+namespace {
+
+#define MAKE_GUID_PAIR(X) std::pair<GUID, std::string>(X, #X)
+
+const std::pair<GUID, std::string> kMfMtAudio[] = {
+  MAKE_GUID_PAIR(MF_MT_AAC_PAYLOAD_TYPE),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_AVG_BYTES_PER_SECOND),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_BITS_PER_SAMPLE),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_BLOCK_ALIGNMENT),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_CHANNEL_MASK),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_NUM_CHANNELS),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_SAMPLES_PER_BLOCK),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_SAMPLES_PER_SECOND),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_NUM_CHANNELS),
+  MAKE_GUID_PAIR(MF_MT_MAJOR_TYPE),
+  MAKE_GUID_PAIR(MF_MT_AUDIO_PREFER_WAVEFORMATEX),
+  MAKE_GUID_PAIR(MF_MT_USER_DATA),
+  MAKE_GUID_PAIR(MF_MT_SUBTYPE),
+  MAKE_GUID_PAIR(MFAudioFormat_AAC),
+  MAKE_GUID_PAIR(MFAudioFormat_ADTS),
+  MAKE_GUID_PAIR(MFAudioFormat_ALAC),
+  MAKE_GUID_PAIR(MFAudioFormat_AMR_NB),
+  MAKE_GUID_PAIR(MFAudioFormat_AMR_WB),
+  MAKE_GUID_PAIR(MFAudioFormat_AMR_WP),
+  MAKE_GUID_PAIR(MFAudioFormat_Dolby_AC3),
+  MAKE_GUID_PAIR(MFAudioFormat_Dolby_AC3_SPDIF),
+  MAKE_GUID_PAIR(MFAudioFormat_Dolby_DDPlus),
+  MAKE_GUID_PAIR(MFAudioFormat_DRM),
+  MAKE_GUID_PAIR(MFAudioFormat_DTS),
+  MAKE_GUID_PAIR(MFAudioFormat_FLAC),
+  MAKE_GUID_PAIR(MFAudioFormat_Float),
+  MAKE_GUID_PAIR(MFAudioFormat_Float_SpatialObjects),
+  MAKE_GUID_PAIR(MFAudioFormat_MP3),
+  MAKE_GUID_PAIR(MFAudioFormat_MPEG),
+  MAKE_GUID_PAIR(MFAudioFormat_MSP1),
+  MAKE_GUID_PAIR(MFAudioFormat_Opus),
+  MAKE_GUID_PAIR(MFAudioFormat_PCM),
+  MAKE_GUID_PAIR(MFAudioFormat_WMASPDIF),
+  MAKE_GUID_PAIR(MFAudioFormat_WMAudio_Lossless),
+  MAKE_GUID_PAIR(MFAudioFormat_WMAudioV8),
+  MAKE_GUID_PAIR(MFAudioFormat_WMAudioV9),
+  MAKE_GUID_PAIR(MFAudioFormat_WMAudioV9),
+  MAKE_GUID_PAIR(MFMediaType_Audio),
+};
+#undef MAKE_GUID_PAIR
+
+std::string GuidToFallbackString(GUID guid) {
+  std::stringstream ss;
+  wchar_t* guid_str = nullptr;
+  StringFromCLSID(guid, &guid_str);
+  ss << guid_str;
+  CoTaskMemFree(guid_str);
+  return ss.str();
+}
+
+std::string MfGuidToString(GUID guid) {
+  const size_t n = sizeof(kMfMtAudio) / sizeof(*kMfMtAudio);
+  for (auto i = 0; i < n; ++i) {
+    const auto& elems = kMfMtAudio[i];
+    if (guid == elems.first) {
+      return elems.second;
+    }
+  }
+  return GuidToFallbackString(guid);
+}
+
+std::string ImfAttributesToString(IMFAttributes* type) {
+  std::stringstream ss;
+  UINT32 n = 0;
+  HRESULT hr = type->GetCount(&n);
+  CheckResult(hr);
+  for (UINT32 i = 0; i < n; ++i) {
+    GUID key;
+    PROPVARIANT val;
+    type->GetItemByIndex(i, &key, &val);
+    PropVariantClear(&val);
+
+    MF_ATTRIBUTE_TYPE attrib_type;
+    hr = type->GetItemType(key, &attrib_type);
+    CheckResult(hr);
+
+    std::string key_str = MfGuidToString(key);
+    ss << key_str << ": ";
+
+    switch (attrib_type) {
+      case MF_ATTRIBUTE_GUID: {
+        GUID value_guid;
+        hr = type->GetGUID(key, &value_guid);
+        ss << MfGuidToString(value_guid) << "\n";
+        break;
+      }
+
+      case MF_ATTRIBUTE_DOUBLE: {
+        double value = 0;
+        hr = type->GetDouble(key, &value);
+        ss << value << "\n";
+        break;
+      }
+
+      case MF_ATTRIBUTE_BLOB: {
+        // Skip.
+        ss << "<BLOB>" << "\n";
+        break;
+      }
+
+      case MF_ATTRIBUTE_UINT32: {
+        UINT32 int_val = 0;
+        hr = type->GetUINT32(key, &int_val);
+        ss << int_val << "\n";
+        break;
+      }
+
+      case MF_ATTRIBUTE_UINT64: {
+        UINT64 int_val = 0;
+        hr = type->GetUINT64(key, &int_val);
+        ss << int_val << "\n";
+        break;
+      }
+
+      case MF_ATTRIBUTE_STRING: {
+        UINT32 length = 0;
+        hr = type->GetStringLength(key, &length);
+        CheckResult(hr);
+        ++length;  // For trailing 0.
+        std::vector<wchar_t> buffer(length);
+        hr = type->GetString(key, buffer.data(), length, NULL);
+        CheckResult(hr);
+        ss << buffer.data() << "\n";
+        break;
+      }
+
+      case MF_ATTRIBUTE_IUNKNOWN: {
+        SB_NOTIMPLEMENTED();
+        break;
+      }
+    }
+  }
+  ss << "\n";
+  return ss.str();
+}
+
+}  // namespace.
+
+void CopyProperties(IMFMediaType* source, IMFMediaType* destination) {
+  UINT32 attribute_count = 0;
+  HRESULT hr = source->GetCount(&attribute_count);
+  CheckResult(hr);
+  for (UINT32 i = 0; i < attribute_count; ++i) {
+    GUID key;
+    PROPVARIANT variant;
+    hr = source->GetItemByIndex(i, &key, &variant);
+    CheckResult(hr);
+    PropVariantClear(&variant);
+
+    MF_ATTRIBUTE_TYPE attrib_type;
+    hr = source->GetItemType(key, &attrib_type);
+    CheckResult(hr);
+
+    switch (attrib_type) {
+      case MF_ATTRIBUTE_GUID: {
+        GUID value_guid;
+        hr = source->GetGUID(key, &value_guid);
+        CheckResult(hr);
+        hr = destination->SetGUID(key, value_guid);
+        CheckResult(hr);
+        break;
+      }
+
+      case MF_ATTRIBUTE_DOUBLE: {
+        double value = 0;
+        hr = source->GetDouble(key, &value);
+        CheckResult(hr);
+        hr = destination->SetDouble(key, value);
+        CheckResult(hr);
+        break;
+      }
+
+      case MF_ATTRIBUTE_BLOB: {
+        UINT32 blob_size = 0;
+        hr = source->GetBlobSize(key, &blob_size);
+        CheckResult(hr);
+        std::vector<UINT8> blob(blob_size);
+        hr = source->GetBlob(key, blob.data(), blob_size, &blob_size);
+        CheckResult(hr);
+        hr = destination->SetBlob(key, blob.data(), blob_size);
+        CheckResult(hr);
+        break;
+      }
+
+      case MF_ATTRIBUTE_UINT32: {
+        UINT32 int_val = 0;
+        hr = source->GetUINT32(key, &int_val);
+        CheckResult(hr);
+        hr = destination->SetUINT32(key, int_val);
+        CheckResult(hr);
+        break;
+      }
+
+      case MF_ATTRIBUTE_UINT64: {
+        UINT64 int_val = 0;
+        hr = source->GetUINT64(key, &int_val);
+        CheckResult(hr);
+        hr = destination->SetUINT64(key, int_val);
+        CheckResult(hr);
+        break;
+      }
+
+      case MF_ATTRIBUTE_STRING: {
+        UINT32 length = 0;
+        hr = source->GetStringLength(key, &length);
+        CheckResult(hr);
+        ++length;  // For trailing 0.
+        std::vector<wchar_t> buffer(length);
+        hr = source->GetString(key, buffer.data(), length, NULL);
+        CheckResult(hr);
+        hr = destination->SetString(key, buffer.data());
+        CheckResult(hr);
+        break;
+      }
+
+      case MF_ATTRIBUTE_IUNKNOWN: {
+        SB_NOTIMPLEMENTED();
+        break;
+      }
+    }
+  }
+}
+
+std::ostream& operator<<(std::ostream& os, const IMFMediaType& media_type) {
+  const IMFAttributes* attribs = &media_type;  // Upcast.
+  std::string output_str =
+      ImfAttributesToString(const_cast<IMFAttributes*>(attribs));
+  os << output_str;
+  return os;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/media_foundation_utils.h b/starboard/shared/win32/media_foundation_utils.h
new file mode 100644
index 0000000..8b5be47
--- /dev/null
+++ b/starboard/shared/win32/media_foundation_utils.h
@@ -0,0 +1,37 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <wrl/client.h>
+#include <Mfobjects.h>
+
+#include <string>
+
+#ifndef STARBOARD_SHARED_WIN32_MEDIA_FOUNDATION_UTILS_H_
+#define STARBOARD_SHARED_WIN32_MEDIA_FOUNDATION_UTILS_H_
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+std::ostream& operator<<(std::ostream& os, const IMFMediaType& media_type);
+
+std::string ToString(IMFAttributes* type);
+
+void CopyProperties(IMFMediaType* source, IMFMediaType* destination);
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_MEDIA_FOUNDATION_UTILS_H_
diff --git a/starboard/shared/win32/media_get_max_buffer_capacity.cc b/starboard/shared/win32/media_get_max_buffer_capacity.cc
new file mode 100644
index 0000000..591923d
--- /dev/null
+++ b/starboard/shared/win32/media_get_max_buffer_capacity.cc
@@ -0,0 +1,25 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/media.h"
+
+int SbMediaGetMaxBufferCapacity(SbMediaVideoCodec codec,
+                                int resolution_width,
+                                int resolution_height,
+                                int bits_per_pixel) {
+  // TODO: refine this to a more reasonable value, taking into account
+  // resolution. On most platforms this is 36 * 1024 * 1024 for 1080p, and
+  // 65 * 1024 * 1024 for 4k.
+  return 500 * 1024 * 1024;
+}
diff --git a/starboard/shared/win32/media_is_audio_supported.cc b/starboard/shared/win32/media_is_audio_supported.cc
new file mode 100644
index 0000000..b1c99f3
--- /dev/null
+++ b/starboard/shared/win32/media_is_audio_supported.cc
@@ -0,0 +1,29 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/starboard/media/media_support_internal.h"
+
+#include "starboard/configuration.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/media.h"
+
+bool SbMediaIsAudioSupported(SbMediaAudioCodec audio_codec,
+                             const char* content_type,
+                             int64_t bitrate) {
+  if (audio_codec != kSbMediaAudioCodecAac &&
+      audio_codec != kSbMediaAudioCodecOpus) {
+    return false;
+  }
+  return bitrate <= kSbMediaMaxAudioBitrateInBitsPerSecond;
+}
diff --git a/starboard/shared/win32/media_is_supported.cc b/starboard/shared/win32/media_is_supported.cc
new file mode 100644
index 0000000..b7180b5
--- /dev/null
+++ b/starboard/shared/win32/media_is_supported.cc
@@ -0,0 +1,28 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/starboard/media/media_support_internal.h"
+
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/media.h"
+#include "starboard/shared/win32/drm_system_playready.h"
+
+bool SbMediaIsSupported(SbMediaVideoCodec video_codec,
+                        SbMediaAudioCodec audio_codec,
+                        const char* key_system) {
+  using ::starboard::shared::win32::DrmSystemPlayready;
+
+  return DrmSystemPlayready::IsKeySystemSupported(key_system);
+}
diff --git a/starboard/shared/win32/media_is_video_supported.cc b/starboard/shared/win32/media_is_video_supported.cc
new file mode 100644
index 0000000..4b49b55
--- /dev/null
+++ b/starboard/shared/win32/media_is_video_supported.cc
@@ -0,0 +1,148 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/starboard/media/media_support_internal.h"
+
+#include <d3d11.h>
+#include <mfapi.h>
+#include <mfidl.h>
+#include <wrl/client.h>
+
+#include "starboard/configuration_constants.h"
+#include "starboard/shared/starboard/media/media_util.h"
+
+namespace {
+
+#if SB_API_VERSION >= SB_RUNTIME_CONFIGS_VERSION || \
+    defined(SB_HAS_MEDIA_WEBM_VP9_SUPPORT)
+// Cache the VP9 support status since the check may be expensive.
+enum Vp9Support {
+  kVp9SupportUnknown,
+  kVp9SupportYes,
+  kVp9SupportNo
+};
+Vp9Support s_vp9_support = kVp9SupportUnknown;
+
+// Check for VP9 support. Since this is used by a starboard function, it
+// cannot depend on other modules (e.g. ANGLE).
+bool IsVp9Supported() {
+  if (!kSbHasMediaWebmVp9Support) {
+    return false;
+  }
+
+  if (s_vp9_support == kVp9SupportUnknown) {
+    // Try initializing the VP9 decoder to determine if it is supported.
+    HRESULT hr;
+
+    Microsoft::WRL::ComPtr<ID3D11Device> d3d_device;
+    hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0,
+                           nullptr, 0, D3D11_SDK_VERSION,
+                           d3d_device.GetAddressOf(), nullptr, nullptr);
+
+    UINT reset_token = 0;
+    Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> device_manager;
+    if (SUCCEEDED(hr)) {
+      hr = MFCreateDXGIDeviceManager(&reset_token,
+                                     device_manager.GetAddressOf());
+    }
+    if (SUCCEEDED(hr)) {
+      hr = device_manager->ResetDevice(d3d_device.Get(), reset_token);
+    }
+
+    Microsoft::WRL::ComPtr<IMFTransform> transform;
+    if (SUCCEEDED(hr)) {
+      hr = CoCreateInstance(CLSID_MSVPxDecoder, nullptr, CLSCTX_INPROC_SERVER,
+                            IID_PPV_ARGS(transform.GetAddressOf()));
+    }
+
+    if (SUCCEEDED(hr)) {
+      hr = transform->ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER,
+                                     ULONG_PTR(device_manager.Get()));
+    }
+
+    s_vp9_support = SUCCEEDED(hr) ? kVp9SupportYes : kVp9SupportNo;
+  }
+  return s_vp9_support == kVp9SupportYes;
+}
+#else   // SB_API_VERSION >= SB_RUNTIME_CONFIGS_VERSION ||
+        // defined(SB_HAS_MEDIA_WEBM_VP9_SUPPORT)
+bool IsVp9Supported() {
+  return false;
+}
+#endif  // SB_API_VERSION >= SB_RUNTIME_CONFIGS_VERSION ||
+        // defined(SB_HAS_MEDIA_WEBM_VP9_SUPPORT)
+
+}  // namespace
+
+bool SbMediaIsVideoSupported(SbMediaVideoCodec video_codec,
+                             const char* content_type,
+                             int profile,
+                             int level,
+                             int bit_depth,
+                             SbMediaPrimaryId primary_id,
+                             SbMediaTransferId transfer_id,
+                             SbMediaMatrixId matrix_id,
+                             int frame_width,
+                             int frame_height,
+                             int64_t bitrate,
+                             int fps,
+                             bool decode_to_texture_required) {
+  // Win32 platforms use decode-to-texture by default so there is no special
+  // constraints if decode-to-texture support is specifically required.
+
+  int max_width = 1920;
+  int max_height = 1080;
+
+  if (video_codec == kSbMediaVideoCodecVp9) {
+    // Vp9 supports 8k only in whitelisted platforms, up to 4k in the others.
+#ifdef ENABLE_VP9_8K_SUPPORT
+    max_width = 7680;
+    max_height = 4320;
+#else  // ENABLE_VP9_8K_SUPPORT
+    max_width = 3840;
+    max_height = 2160;
+#endif  // ENABLE_VP9_8K_SUPPORT
+  } else if (video_codec == kSbMediaVideoCodecH264) {
+    // Not all devices can support 4k H264; some (e.g. xb1) may crash in
+    // the decoder if provided too high of a resolution. Therefore
+    // platforms must explicitly opt-in to support 4k H264.
+#ifdef ENABLE_H264_4K_SUPPORT
+    max_width = 3840;
+    max_height = 2160;
+#endif  // ENABLE_H264_4K_SUPPORT
+  }
+
+  if (frame_width > max_width || frame_height > max_height) {
+    return false;
+  }
+
+  // Is bitrate in range?
+  if (bitrate > kSbMediaMaxVideoBitrateInBitsPerSecond) {
+    return false;
+  }
+  if (fps > 60) {
+    return false;
+  }
+  using ::starboard::shared::starboard::media::IsSDRVideo;
+  if (!IsSDRVideo(bit_depth, primary_id, transfer_id, matrix_id)) {
+    return false;
+  }
+  if (video_codec == kSbMediaVideoCodecH264) {
+    return true;
+  }
+  if (video_codec == kSbMediaVideoCodecVp9) {
+    return IsVp9Supported();
+  }
+  return false;
+}
diff --git a/starboard/shared/win32/media_transform.cc b/starboard/shared/win32/media_transform.cc
new file mode 100644
index 0000000..a724231
--- /dev/null
+++ b/starboard/shared/win32/media_transform.cc
@@ -0,0 +1,379 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/media_transform.h"
+
+#include "starboard/common/log.h"
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/shared/win32/audio_transform.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/media_common.h"
+#include "starboard/shared/win32/media_foundation_utils.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+using Microsoft::WRL::ComPtr;
+using ::starboard::shared::starboard::ThreadChecker;
+
+namespace {
+
+template <typename T>
+void ReleaseIfNotNull(T** ptr) {
+  if (*ptr) {
+    (*ptr)->Release();
+    *ptr = NULL;
+  }
+}
+
+}  // namespace
+
+MediaTransform::MediaTransform(CLSID clsid)
+    : thread_checker_(ThreadChecker::kSetThreadIdOnFirstCheck),
+      state_(kCanAcceptInput),
+      stream_begun_(false),
+      discontinuity_(true),
+      throttle_inputs_(false) {
+  transform_ = nullptr;
+  HRESULT hr = CreateDecoderTransform(clsid, &transform_);
+  if (FAILED(hr) || !transform_) {
+    transform_ = nullptr;
+    state_ = kDrained;
+  }
+}
+
+MediaTransform::MediaTransform(
+    const Microsoft::WRL::ComPtr<IMFTransform>& transform)
+    : transform_(transform),
+      thread_checker_(ThreadChecker::kSetThreadIdOnFirstCheck),
+      state_(kCanAcceptInput),
+      stream_begun_(false),
+      discontinuity_(true),
+      throttle_inputs_(false) {
+  SB_DCHECK(transform_);
+}
+
+bool MediaTransform::TryWrite(const ComPtr<IMFSample>& input) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  if (state_ != kCanAcceptInput || !transform_) {
+    return false;
+  }
+
+  if (!stream_begun_) {
+    SendMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING);
+    SendMessage(MFT_MESSAGE_NOTIFY_START_OF_STREAM);
+    stream_begun_ = true;
+  }
+
+  HRESULT hr = transform_->ProcessInput(kStreamId, input.Get(), 0);
+
+  if (SUCCEEDED(hr)) {
+    // Some transforms do not return MF_E_NOTACCEPTING. To avoid flooding
+    // these transforms, input is only allowed when ProcessOutput returns
+    // MF_E_TRANSFORM_NEED_MORE_INPUT.
+    if (throttle_inputs_) {
+      state_ = kCanProvideOutput;
+    }
+    return true;
+  }
+  if (hr == MF_E_NOTACCEPTING) {
+    state_ = kCanProvideOutput;
+    return false;
+  }
+  SB_NOTREACHED() << "Unexpected return value " << hr;
+  return false;
+}
+
+ComPtr<IMFSample> MediaTransform::TryRead(ComPtr<IMFMediaType>* new_type) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  SB_DCHECK(new_type);
+
+  if (state_ == kDrained || !transform_) {
+    return NULL;
+  }
+
+  ComPtr<IMFSample> sample;
+  HRESULT hr = ProcessOutput(&sample);
+
+  if (hr == MF_E_TRANSFORM_STREAM_CHANGE) {
+    hr = transform_->GetOutputAvailableType(kStreamId,
+                                            0,  // TypeIndex
+                                            new_type->GetAddressOf());
+    CheckResult(hr);
+    SetOutputType(*new_type);
+
+    hr = ProcessOutput(&sample);
+  }
+
+  if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) {
+    if (state_ == kCanProvideOutput) {
+      state_ = kCanAcceptInput;
+    }
+    if (state_ == kDraining) {
+      state_ = kDrained;
+    }
+    return NULL;
+  }
+
+  if (FAILED(hr)) {
+    // Sometimes the decryptor refuse to emit output after shutting down.
+    SB_DCHECK(hr == MF_E_INVALIDREQUEST);
+    if (state_ == kDraining) {
+      state_ = kDrained;
+    }
+    return NULL;
+  }
+
+  SB_DCHECK(sample);
+
+  if (discontinuity_) {
+    sample->SetUINT32(MFSampleExtension_Discontinuity, TRUE);
+    discontinuity_ = false;
+  }
+
+  return sample;
+}
+
+void MediaTransform::Drain() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  SB_DCHECK(state_ != kDraining && state_ != kDrained);
+
+  if (state_ == kDraining || state_ == kDrained) {
+    return;
+  }
+
+  if (!stream_begun_) {
+    state_ = kDrained;
+    return;
+  }
+
+  // The VP9 codec may crash when MFT_MESSAGE_NOTIFY_END_OF_STREAM is processed
+  // at the same time an IMFSample is released. Per documentation, the client
+  // is not required to send this message for IMFTransforms. Avoid the possible
+  // race condition by not sending this message.
+  // SendMessage(MFT_MESSAGE_NOTIFY_END_OF_STREAM);
+  SendMessage(MFT_MESSAGE_COMMAND_DRAIN);
+  state_ = kDraining;
+}
+
+bool MediaTransform::draining() const {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  return state_ == kDraining;
+}
+
+bool MediaTransform::drained() const {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  return state_ == kDrained;
+}
+
+bool MediaTransform::HasValidTransform() const {
+  return transform_ ? true : false;
+}
+
+void MediaTransform::ResetFromDrained() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  SB_DCHECK(drained());
+
+  state_ = kCanAcceptInput;
+  stream_begun_ = false;
+  discontinuity_ = true;
+}
+
+ComPtr<IMFMediaType> MediaTransform::GetCurrentInputType() {
+  ComPtr<IMFMediaType> type;
+  SB_DCHECK(transform_);
+  HRESULT hr = transform_->GetInputCurrentType(kStreamId, type.GetAddressOf());
+  CheckResult(hr);
+  return type;
+}
+
+void MediaTransform::SetInputType(const ComPtr<IMFMediaType>& input_type) {
+  SB_DCHECK(transform_);
+  HRESULT hr = transform_->SetInputType(0, input_type.Get(), 0);
+  CheckResult(hr);
+}
+
+std::vector<ComPtr<IMFMediaType>> MediaTransform::GetAvailableInputTypes() {
+  SB_DCHECK(transform_);
+  return GetAllInputMediaTypes(kStreamId, transform_.Get());
+}
+
+ComPtr<IMFMediaType> MediaTransform::GetCurrentOutputType() {
+  ComPtr<IMFMediaType> type;
+  SB_DCHECK(transform_);
+  HRESULT hr = transform_->GetOutputCurrentType(kStreamId, type.GetAddressOf());
+  CheckResult(hr);
+  return type;
+}
+
+void MediaTransform::SetOutputType(const ComPtr<IMFMediaType>& output_type) {
+  SB_DCHECK(transform_);
+  HRESULT hr = transform_->SetOutputType(0, output_type.Get(), 0);
+  CheckResult(hr);
+}
+
+std::vector<ComPtr<IMFMediaType>> MediaTransform::GetAvailableOutputTypes() {
+  std::vector<ComPtr<IMFMediaType>> output_types;
+  SB_DCHECK(transform_);
+
+  for (DWORD i = 0;; ++i) {
+    ComPtr<IMFMediaType> curr_type;
+    HRESULT hr = transform_->GetOutputAvailableType(kStreamId, i,
+                                                    curr_type.GetAddressOf());
+    if (FAILED(hr)) {
+      break;
+    }
+    output_types.push_back(curr_type);
+  }
+
+  return output_types;
+}
+
+void MediaTransform::SetOutputTypeBySubType(GUID subtype) {
+  SB_DCHECK(transform_);
+  for (int index = 0;; ++index) {
+    ComPtr<IMFMediaType> media_type;
+    HRESULT hr =
+        transform_->GetOutputAvailableType(kStreamId, index, &media_type);
+    if (SUCCEEDED(hr)) {
+      GUID media_sub_type = {};
+      media_type->GetGUID(MF_MT_SUBTYPE, &media_sub_type);
+      if (media_sub_type == subtype) {
+        SetOutputType(media_type);
+        return;
+      }
+    } else {
+      SB_DCHECK(hr == MF_E_NO_MORE_TYPES);
+      break;
+    }
+  }
+  SB_NOTREACHED();
+}
+
+ComPtr<IMFAttributes> MediaTransform::GetAttributes() {
+  SB_DCHECK(transform_);
+  ComPtr<IMFAttributes> attributes;
+  HRESULT hr = transform_->GetAttributes(attributes.GetAddressOf());
+  CheckResult(hr);
+  return attributes;
+}
+
+ComPtr<IMFAttributes> MediaTransform::GetOutputStreamAttributes() {
+  SB_DCHECK(transform_);
+  ComPtr<IMFAttributes> attributes;
+  HRESULT hr =
+      transform_->GetOutputStreamAttributes(0, attributes.GetAddressOf());
+  CheckResult(hr);
+  return attributes;
+}
+
+ComPtr<IMFSampleProtection> MediaTransform::GetSampleProtection() {
+  SB_DCHECK(transform_);
+  ComPtr<IMFSampleProtection> sample_protection;
+  HRESULT hr = transform_.As(&sample_protection);
+  CheckResult(hr);
+  return sample_protection;
+}
+
+void MediaTransform::GetStreamCount(DWORD* input_stream_count,
+                                    DWORD* output_stream_count) {
+  SB_DCHECK(transform_);
+  SB_DCHECK(input_stream_count);
+  SB_DCHECK(output_stream_count);
+  HRESULT hr =
+      transform_->GetStreamCount(input_stream_count, output_stream_count);
+  CheckResult(hr);
+}
+
+HRESULT MediaTransform::SendMessage(MFT_MESSAGE_TYPE msg,
+                                    ULONG_PTR data /*= 0*/) {
+  SB_DCHECK(transform_);
+  return transform_->ProcessMessage(msg, data);
+}
+
+void MediaTransform::Reset() {
+  if (stream_begun_) {
+    SendMessage(MFT_MESSAGE_COMMAND_FLUSH);
+  }
+  state_ = kCanAcceptInput;
+  discontinuity_ = true;
+  thread_checker_.Detach();
+}
+
+void MediaTransform::PrepareOutputDataBuffer(
+    MFT_OUTPUT_DATA_BUFFER* output_data_buffer) {
+  SB_DCHECK(transform_);
+  output_data_buffer->dwStreamID = kStreamId;
+  output_data_buffer->pSample = NULL;
+  output_data_buffer->dwStatus = 0;
+  output_data_buffer->pEvents = NULL;
+
+  MFT_OUTPUT_STREAM_INFO output_stream_info;
+  HRESULT hr = transform_->GetOutputStreamInfo(kStreamId, &output_stream_info);
+  CheckResult(hr);
+
+  static const DWORD kFlagAutoAllocateMemory =
+      MFT_OUTPUT_STREAM_PROVIDES_SAMPLES |
+      MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES;
+  if ((output_stream_info.dwFlags & kFlagAutoAllocateMemory) != 0) {
+    // Try to let the IMFTransform allocate the memory if possible.
+    return;
+  }
+
+  ComPtr<IMFSample> sample;
+  hr = MFCreateSample(&sample);
+  CheckResult(hr);
+
+  ComPtr<IMFMediaBuffer> buffer;
+  hr = MFCreateAlignedMemoryBuffer(output_stream_info.cbSize,
+                                   output_stream_info.cbAlignment, &buffer);
+  CheckResult(hr);
+
+  hr = sample->AddBuffer(buffer.Get());
+  CheckResult(hr);
+
+  output_data_buffer->pSample = sample.Detach();
+}
+
+HRESULT MediaTransform::ProcessOutput(ComPtr<IMFSample>* sample) {
+  SB_DCHECK(sample);
+  SB_DCHECK(transform_);
+
+  MFT_OUTPUT_DATA_BUFFER output_data_buffer;
+  PrepareOutputDataBuffer(&output_data_buffer);
+
+  const DWORD kFlags = 0;
+  const DWORD kNumberOfBuffers = 1;
+  DWORD status = 0;
+  HRESULT hr = transform_->ProcessOutput(kFlags, kNumberOfBuffers,
+                                         &output_data_buffer, &status);
+
+  SB_DCHECK(!output_data_buffer.pEvents);
+
+  *sample = output_data_buffer.pSample;
+  ReleaseIfNotNull(&output_data_buffer.pEvents);
+  ReleaseIfNotNull(&output_data_buffer.pSample);
+
+  if (output_data_buffer.dwStatus == MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE) {
+    hr = MF_E_TRANSFORM_NEED_MORE_INPUT;
+  }
+
+  return hr;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/media_transform.h b/starboard/shared/win32/media_transform.h
new file mode 100644
index 0000000..79e7072
--- /dev/null
+++ b/starboard/shared/win32/media_transform.h
@@ -0,0 +1,108 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_MEDIA_TRANSFORM_H_
+#define STARBOARD_SHARED_WIN32_MEDIA_TRANSFORM_H_
+
+#include <mfapi.h>
+#include <mferror.h>
+#include <mfidl.h>
+#include <wrl\client.h>
+
+#include <vector>
+
+#include "starboard/media.h"
+#include "starboard/shared/starboard/thread_checker.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// Wrapper class for IMFTransform with the following functionalities:
+// 1. State management:
+//    It supports a one way life cycle from "kCanAcceptInput/kCanProvideOutput"
+//    to "kDraining" then to "kDrained".
+// 2. Manages states like input/output types, various attributes, and sample
+//    protection, etc.
+// 3. Send message to the underlying transform.
+// This simplifies the implementation of higher level decoder mechanism that
+// may deal with two IMFTransforms: one decoder and one decryptor.
+class MediaTransform {
+ public:
+  enum { kStreamId = 0 };
+  explicit MediaTransform(CLSID clsid);
+  explicit MediaTransform(
+      const Microsoft::WRL::ComPtr<IMFTransform>& transform);
+
+  // By default, the input throttle is disabled, and inputs can be written to
+  // the transform until rejected; i.e. the transform is kept full of inputs.
+  // However, some transforms may never report that they are full, so enabling
+  // the input throttle will allow inputs only when the transform reports that
+  // it needs more input.
+  void EnableInputThrottle(bool enable) { throttle_inputs_ = enable; }
+
+  bool TryWrite(const Microsoft::WRL::ComPtr<IMFSample>& input);
+  Microsoft::WRL::ComPtr<IMFSample> TryRead(
+      Microsoft::WRL::ComPtr<IMFMediaType>* new_type);
+  void Drain();
+  bool draining() const;
+  bool drained() const;
+  // Once the transform is drained, this function can be called to allow the
+  // transform to accept new input as a newly created transform.  This allows
+  // the reuse of existing transform without re-negotiating all types and
+  // attributes.
+  void ResetFromDrained();
+
+  bool HasValidTransform() const;
+
+  Microsoft::WRL::ComPtr<IMFMediaType> GetCurrentInputType();
+  void SetInputType(const Microsoft::WRL::ComPtr<IMFMediaType>& type);
+  std::vector<Microsoft::WRL::ComPtr<IMFMediaType>> GetAvailableInputTypes();
+
+  Microsoft::WRL::ComPtr<IMFMediaType> GetCurrentOutputType();
+  void SetOutputType(const Microsoft::WRL::ComPtr<IMFMediaType>& type);
+  std::vector<Microsoft::WRL::ComPtr<IMFMediaType>> GetAvailableOutputTypes();
+  void SetOutputTypeBySubType(GUID subtype);
+
+  Microsoft::WRL::ComPtr<IMFAttributes> GetAttributes();
+  Microsoft::WRL::ComPtr<IMFAttributes> GetOutputStreamAttributes();
+
+  Microsoft::WRL::ComPtr<IMFSampleProtection> GetSampleProtection();
+  void GetStreamCount(DWORD* input_streamcount, DWORD* output_stream_count);
+
+  HRESULT SendMessage(MFT_MESSAGE_TYPE msg, ULONG_PTR data = 0);
+
+  // Reset the media transform to its original state.
+  void Reset();
+
+ private:
+  enum State { kCanAcceptInput, kCanProvideOutput, kDraining, kDrained };
+
+  void PrepareOutputDataBuffer(MFT_OUTPUT_DATA_BUFFER* output_data_buffer);
+  HRESULT ProcessOutput(Microsoft::WRL::ComPtr<IMFSample>* sample);
+
+  Microsoft::WRL::ComPtr<IMFTransform> transform_;
+
+  ::starboard::shared::starboard::ThreadChecker thread_checker_;
+  State state_;
+  bool stream_begun_;
+  bool discontinuity_;
+  bool throttle_inputs_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_MEDIA_TRANSFORM_H_
diff --git a/starboard/shared/win32/memory_allocate_aligned_unchecked.cc b/starboard/shared/win32/memory_allocate_aligned_unchecked.cc
new file mode 100644
index 0000000..2b1c7c3
--- /dev/null
+++ b/starboard/shared/win32/memory_allocate_aligned_unchecked.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+
+#include <malloc.h>
+
+void* SbMemoryAllocateAlignedUnchecked(size_t alignment, size_t size) {
+  return _aligned_malloc(size, alignment);
+}
diff --git a/starboard/shared/win32/memory_allocate_unchecked.cc b/starboard/shared/win32/memory_allocate_unchecked.cc
new file mode 100644
index 0000000..8330459
--- /dev/null
+++ b/starboard/shared/win32/memory_allocate_unchecked.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+
+#include <windows.h>
+
+void* SbMemoryAllocateUnchecked(size_t size) {
+  return HeapAlloc(GetProcessHeap(), 0, size);
+}
diff --git a/starboard/shared/win32/memory_flush.cc b/starboard/shared/win32/memory_flush.cc
new file mode 100644
index 0000000..456d830
--- /dev/null
+++ b/starboard/shared/win32/memory_flush.cc
@@ -0,0 +1,30 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+#include "starboard/memory.h"
+
+#include <windows.h>
+
+#if !SB_CAN(MAP_EXECUTABLE_MEMORY)
+#error \
+    "You shouldn't implement SbMemoryFlush unless you can map " \
+       "memory pages as executable"
+#endif
+
+void SbMemoryFlush(void* virtual_address, int64_t size_bytes) {
+  SB_NOTIMPLEMENTED();
+  // TODO: Enable the following implementation when xb1 can compile it.
+  // FlushInstructionCache(GetCurrentProcess(), virtual_address, size_bytes);
+}
diff --git a/starboard/shared/win32/memory_free.cc b/starboard/shared/win32/memory_free.cc
new file mode 100644
index 0000000..4eb2535
--- /dev/null
+++ b/starboard/shared/win32/memory_free.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+
+#include <windows.h>
+
+void SbMemoryFree(void* memory) {
+  HeapFree(GetProcessHeap(), 0, memory);
+}
diff --git a/starboard/shared/win32/memory_free_aligned.cc b/starboard/shared/win32/memory_free_aligned.cc
new file mode 100644
index 0000000..251695b
--- /dev/null
+++ b/starboard/shared/win32/memory_free_aligned.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+
+#include <malloc.h>
+
+void SbMemoryFreeAligned(void* memory) {
+  _aligned_free(memory);
+}
diff --git a/starboard/shared/win32/memory_get_stack_bounds.cc b/starboard/shared/win32/memory_get_stack_bounds.cc
new file mode 100644
index 0000000..8505eb9
--- /dev/null
+++ b/starboard/shared/win32/memory_get_stack_bounds.cc
@@ -0,0 +1,23 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+
+#include <windows.h>
+
+void SbMemoryGetStackBounds(void** out_high, void** out_low) {
+  _NT_TIB* tib = reinterpret_cast<_NT_TIB*>(NtCurrentTeb());
+  *out_high = tib->StackBase;
+  *out_low = tib->StackLimit;
+}
diff --git a/starboard/shared/win32/memory_map.cc b/starboard/shared/win32/memory_map.cc
new file mode 100644
index 0000000..ae3aa52
--- /dev/null
+++ b/starboard/shared/win32/memory_map.cc
@@ -0,0 +1,55 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/starboard/memory_reporter_internal.h"
+
+void* SbMemoryMap(int64_t size_bytes, int flags, const char* name) {
+  if (size_bytes == 0) {
+    return SB_MEMORY_MAP_FAILED;
+  }
+  ULONG protect = PAGE_NOACCESS;
+  // |flags| is a bitmask of SbMemoryMapFlags, but |protect| is not a bitmask.
+  switch (flags) {
+    case kSbMemoryMapProtectReserved: {
+      protect = PAGE_NOACCESS;
+      break;
+    }
+    case kSbMemoryMapProtectRead:
+      protect = PAGE_READONLY;
+      break;
+    case kSbMemoryMapProtectWrite:
+      // Windows does not provide write only mode privileges
+      // are escalated to read/write.
+    case kSbMemoryMapProtectReadWrite:
+      protect = PAGE_READWRITE;
+      break;
+    default:
+      SB_NOTIMPLEMENTED() << "memory flag " << flags << " not supported.";
+      return SB_MEMORY_MAP_FAILED;
+  }
+
+  void* memory = VirtualAllocFromApp(
+      NULL, size_bytes,
+     (flags == kSbMemoryMapProtectReserved) ? MEM_RESERVE : MEM_COMMIT,
+      protect);
+  if (PAGE_READONLY != protect) {
+    SbMemoryReporterReportMappedMemory(memory, size_bytes);
+  }
+  return memory;
+}
diff --git a/starboard/shared/win32/memory_protect.cc b/starboard/shared/win32/memory_protect.cc
new file mode 100644
index 0000000..8fd9b5d
--- /dev/null
+++ b/starboard/shared/win32/memory_protect.cc
@@ -0,0 +1,58 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+
+#include <windows.h>
+
+bool SbMemoryProtect(void* virtual_address, int64_t size_bytes, int flags) {
+  ULONG new_protection = 0;
+
+  switch (flags) {
+    case kSbMemoryMapProtectReserved:
+      // After this call, the address will be in reserved state.
+      return VirtualFree(virtual_address, size_bytes, MEM_DECOMMIT);
+    case kSbMemoryMapProtectRead:
+      new_protection = PAGE_READONLY;
+      break;
+
+    // Windows does not provide write only mode privileges
+    // are escalated to read/write.
+    case kSbMemoryMapProtectWrite:
+    case kSbMemoryMapProtectReadWrite:
+      new_protection = PAGE_READWRITE;
+      break;
+
+#if SB_CAN(MAP_EXECUTABLE_MEMORY)
+    case kSbMemoryMapProtectExec:
+      new_protection = PAGE_EXECUTE;
+      break;
+    case kSbMemoryMapProtectRead | kSbMemoryMapProtectExec:
+      new_protection = PAGE_EXECUTE_READ;
+      break;
+#endif
+
+    // No other protections are supported, see
+    // https://msdn.microsoft.com/en-us/library/windows/desktop/mt169846.
+    default:
+      return false;
+  }
+
+  ULONG old_protection;
+  // Changing protection from No-Access to others needs the memory to be
+  // committed first. Commit committed pages will not reset them to zero.
+  VirtualAllocFromApp(virtual_address, size_bytes, MEM_COMMIT, PAGE_READONLY);
+  return VirtualProtectFromApp(virtual_address, size_bytes, new_protection,
+                               &old_protection) != 0;
+}
diff --git a/starboard/shared/win32/memory_reallocate_unchecked.cc b/starboard/shared/win32/memory_reallocate_unchecked.cc
new file mode 100644
index 0000000..b70e443
--- /dev/null
+++ b/starboard/shared/win32/memory_reallocate_unchecked.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+
+#include <windows.h>
+
+void* SbMemoryReallocateUnchecked(void* memory, size_t size) {
+  if (memory == NULL) {
+    return SbMemoryAllocateUnchecked(size);
+  }
+  return HeapReAlloc(GetProcessHeap(), 0, memory, size);
+}
diff --git a/starboard/shared/win32/memory_unmap.cc b/starboard/shared/win32/memory_unmap.cc
new file mode 100644
index 0000000..37ee710
--- /dev/null
+++ b/starboard/shared/win32/memory_unmap.cc
@@ -0,0 +1,27 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+
+#include <windows.h>
+
+#include "starboard/shared/starboard/memory_reporter_internal.h"
+
+bool SbMemoryUnmap(void* virtual_address, int64_t size_bytes) {
+  // Note that SbMemoryUnmap documentation says that "This function can
+  // unmap multiple contiguous regions that were mapped with separate calls
+  // to SbMemoryMap()". Because of that, we cannot use MEM_FREE here.
+  SbMemoryReporterReportUnmappedMemory(virtual_address, size_bytes);
+  return VirtualFree(virtual_address, size_bytes, MEM_DECOMMIT);
+}
diff --git a/starboard/shared/win32/mini_dump_printer.py b/starboard/shared/win32/mini_dump_printer.py
new file mode 100644
index 0000000..f22ff82
--- /dev/null
+++ b/starboard/shared/win32/mini_dump_printer.py
@@ -0,0 +1,60 @@
+#!/usr/bin/python
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import os
+import subprocess
+import sys
+
+# This cdb tool is part of Microsoft's debugging toolset, it will allow mini
+# dump analysis and printing.
+_DEFAULT_TOOL_PATH = "C:/Program Files (x86)/Windows Kits/10/Debuggers/x64/cdb.exe"
+
+
+def PrintMiniDump(mini_dump_path,
+                  exe_path,
+                  out_stream=sys.stdout,
+                  tool_path=_DEFAULT_TOOL_PATH):
+  out_stream.write('\n*** Found crash dump! ***\nMinDumpPath:'\
+                   + mini_dump_path + '\n')
+
+  tool_path = os.path.abspath(tool_path)
+  if not os.path.isfile(tool_path):
+    out_stream.write('Could not perform crash analysis because ' + tool_path\
+                     + ' does not exist.\n')
+    return
+
+  dump_log = mini_dump_path + '.log'
+  cmd = "\"{0}\" -z \"{1}\" -c \"!analyze -v;q\" > {2}" \
+        .format(tool_path, mini_dump_path, dump_log)
+
+  try:
+    out_stream.write('Running command:\n' + cmd + '\n')
+    subprocess.check_output(cmd, shell=True, universal_newlines=True)
+
+    if not os.path.exists(dump_log):
+      out_stream.write('Error - mini dump log ' + dump_log\
+                       + ' was not found.\n')
+      return
+    with open(dump_log) as f:
+      out_stream.write(f.read() + '\n')
+      out_stream.write('*** Finished printing minidump '\
+                       + mini_dump_path + ' ***\n'\
+                       + 'For more information, use VisualStudio '\
+                       + 'to load the minidump.\n')
+    os.remove(dump_log)
+  except Exception as e:
+    out_stream.write('Error: ' + str(e))
diff --git a/starboard/shared/win32/minidump.cc b/starboard/shared/win32/minidump.cc
new file mode 100644
index 0000000..133463f
--- /dev/null
+++ b/starboard/shared/win32/minidump.cc
@@ -0,0 +1,133 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/minidump.h"
+
+// clang-format off
+#include <windows.h>  // Has to go first.
+// clang-format on
+#include <crtdbg.h>
+#include <dbghelp.h>
+#include <sstream>
+#include <string>
+
+#include "starboard/common/log.h"
+#include "starboard/common/mutex.h"
+#include "starboard/once.h"
+#include "starboard/shared/win32/file_internal.h"
+
+using starboard::Mutex;
+using starboard::ScopedLock;
+using starboard::shared::win32::NormalizeWin32Path;
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+namespace {
+
+class DumpHandler {
+ public:
+  static DumpHandler* Instance();
+
+  void Init(std::string file_path) {
+    ScopedLock lock(mutex_);
+    if (initialized_) {
+      return;
+    }
+    file_path_ = file_path;
+    // After this call, unhandled exceptions will use the exception handler
+    // when an error occurs but only if the debugger is not attached.
+    SetUnhandledExceptionFilter(UnhandledExceptionHandler);
+
+    std::stringstream ss;
+    ss << "\n****MiniDumpHandler activated***\nIf a crash happens then an "
+       << "attempt to write a MiniDump file to: " << file_path << "\n\n";
+    SbLogRaw(ss.str().c_str());
+
+    initialized_ = true;
+  }
+
+ private:
+  static LONG WINAPI UnhandledExceptionHandler(EXCEPTION_POINTERS* pep) {
+    DumpHandler::Instance()->DumpStack(pep);
+    return EXCEPTION_EXECUTE_HANDLER;
+  }
+  DumpHandler() {}
+
+  void DumpStack(EXCEPTION_POINTERS* pep) {
+    ScopedLock lock(mutex_);
+    if (file_path_.empty()) {
+      SbLogRaw("Could not write minidump because the dump path is missing.");
+      return;
+    }
+    bool out_created = false;
+    SbFileError out_error = kSbFileOk;
+
+    HANDLE file_handle = OpenFileOrDirectory(file_path_.c_str(),
+                                             kSbFileCreateAlways | kSbFileWrite,
+                                             &out_created, &out_error);
+
+    const bool file_ok = out_created && (out_error == kSbFileOk) &&
+                         (file_handle != NULL) &&
+                         (file_handle != INVALID_HANDLE_VALUE);
+
+    if (!file_ok) {
+      std::stringstream ss;
+      ss << "CreateFile failed. Error: " << GetLastError() << "\n";
+      SbLogRaw(ss.str().c_str());
+      return;
+    }
+
+    // Create the minidump.
+    MINIDUMP_EXCEPTION_INFORMATION mdei;
+    mdei.ThreadId = GetCurrentThreadId();
+    mdei.ExceptionPointers = pep;
+    mdei.ClientPointers = TRUE;
+    MINIDUMP_TYPE mdt = static_cast<MINIDUMP_TYPE>(
+        MiniDumpWithFullMemory | MiniDumpWithFullMemoryInfo |
+        MiniDumpWithHandleData | MiniDumpWithThreadInfo |
+        MiniDumpWithUnloadedModules);
+
+    BOOL rv = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
+                                file_handle, mdt, (pep != 0) ? &mdei : 0, 0, 0);
+    std::stringstream ss;
+    if (!rv) {
+      ss << "Minidump write failed. Error: " << GetLastError() << "\n";
+    } else {
+      ss << "Minidump " << file_path_ << "created.\n";
+    }
+    // Lower level logging than SbLogRaw().
+    SbLogRaw(ss.str().c_str());
+    CloseHandle(file_handle);
+  }
+
+  std::string file_path_;
+  starboard::Mutex mutex_;
+  bool initialized_ = false;
+};
+
+SB_ONCE_INITIALIZE_FUNCTION(DumpHandler, DumpHandler::Instance);
+
+}  // namespace
+
+void InitMiniDumpHandler(const char* file_path) {
+#ifndef COBALT_BUILD_TYPE_GOLD
+  DumpHandler::Instance()->Init(file_path);
+#endif
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/minidump.h b/starboard/shared/win32/minidump.h
new file mode 100644
index 0000000..0f0137b
--- /dev/null
+++ b/starboard/shared/win32/minidump.h
@@ -0,0 +1,37 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_MINIDUMP_H_
+#define STARBOARD_SHARED_WIN32_MINIDUMP_H_
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// After this call, any crashes will cause a mini dump file to be written
+// to the file path. Note that the dump file will only be written if the
+// process is not running in a debugger (e.g. inside of Visual Studio).
+//
+// Example 1:
+//  InitMiniDumpHandler("cobalt.exe.dmp");  // Relative path to current working
+//                                          // directory
+// Example 2:
+//  InitMiniDumpHandler("C:\\...\\cobalt.exe.dmp")  // Absolute path.
+void InitMiniDumpHandler(const char* file_path);
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_MINIDUMP_H_
diff --git a/starboard/shared/win32/mutex_acquire.cc b/starboard/shared/win32/mutex_acquire.cc
new file mode 100644
index 0000000..b67d6d6
--- /dev/null
+++ b/starboard/shared/win32/mutex_acquire.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/mutex.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/types_internal.h"
+
+SbMutexResult SbMutexAcquire(SbMutex* mutex) {
+  AcquireSRWLockExclusive(SB_WIN32_INTERNAL_MUTEX(mutex));
+  return kSbMutexAcquired;
+}
diff --git a/starboard/shared/win32/mutex_acquire_try.cc b/starboard/shared/win32/mutex_acquire_try.cc
new file mode 100644
index 0000000..dda6942
--- /dev/null
+++ b/starboard/shared/win32/mutex_acquire_try.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/mutex.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/types_internal.h"
+
+SbMutexResult SbMutexAcquireTry(SbMutex* mutex) {
+  bool result = TryAcquireSRWLockExclusive(SB_WIN32_INTERNAL_MUTEX(mutex));
+  return result ? kSbMutexAcquired : kSbMutexBusy;
+}
diff --git a/starboard/shared/win32/mutex_create.cc b/starboard/shared/win32/mutex_create.cc
new file mode 100644
index 0000000..d8aead2
--- /dev/null
+++ b/starboard/shared/win32/mutex_create.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/mutex.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/types_internal.h"
+
+bool SbMutexCreate(SbMutex* mutex) {
+  SB_COMPILE_ASSERT(sizeof(SbMutex) >= sizeof(SRWLOCK),
+                    srwlock_larger_than_sb_mutex);
+  if (!mutex) {
+    return false;
+  }
+  InitializeSRWLock(SB_WIN32_INTERNAL_MUTEX(mutex));
+  return true;
+}
diff --git a/starboard/shared/win32/mutex_destroy.cc b/starboard/shared/win32/mutex_destroy.cc
new file mode 100644
index 0000000..bad4689
--- /dev/null
+++ b/starboard/shared/win32/mutex_destroy.cc
@@ -0,0 +1,37 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/mutex.h"
+
+#include <windows.h>
+
+#include "starboard/configuration.h"
+
+bool SbMutexDestroy(SbMutex* mutex) {
+  if (!mutex) {
+    return false;
+  }
+  // On Windows a SRWLOCK is used in place of the heavier mutex. These locks
+  // cannot be acquired recursively, and the behavior when this is attempted is
+  // not clear in the documentation. A Microsoft DevBlog seems to suggest this
+  // is undefined behavior:
+  //
+  //   It’s a programming error. It is your responsibility as a programmer not
+  //   to call Acquire­SRW­Lock­Shared or Acquire­SRW­Lock­Exclusive from a
+  //   thread that has already acquired the lock. Failing to comply with this
+  //   rule will result in undefined behavior.
+  //
+  // https://devblogs.microsoft.com/oldnewthing/20160819-00/?p=94125
+  return true;
+}
diff --git a/starboard/shared/win32/mutex_release.cc b/starboard/shared/win32/mutex_release.cc
new file mode 100644
index 0000000..34d35e3
--- /dev/null
+++ b/starboard/shared/win32/mutex_release.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/mutex.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/types_internal.h"
+
+bool SbMutexRelease(SbMutex* mutex) {
+  ReleaseSRWLockExclusive(SB_WIN32_INTERNAL_MUTEX(mutex));
+  return true;
+}
diff --git a/starboard/shared/win32/once.cc b/starboard/shared/win32/once.cc
new file mode 100644
index 0000000..bdccc46
--- /dev/null
+++ b/starboard/shared/win32/once.cc
@@ -0,0 +1,40 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/once.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/types_internal.h"
+
+namespace {
+BOOL CALLBACK OnceTrampoline(PINIT_ONCE once_control,
+                             void* parameter,
+                             void** context) {
+  static_cast<SbOnceInitRoutine>(parameter)();
+  return true;
+}
+
+}  // namespace
+
+bool SbOnce(SbOnceControl* once_control, SbOnceInitRoutine init_routine) {
+  SB_COMPILE_ASSERT(sizeof(SbOnceControl) >= sizeof(INIT_ONCE),
+                    init_once_larger_than_sb_once_control);
+  if (!once_control || !init_routine) {
+    return false;
+  }
+  return InitOnceExecuteOnce(SB_WIN32_INTERNAL_ONCE(once_control),
+                             OnceTrampoline, init_routine, NULL);
+}
diff --git a/starboard/shared/win32/player_components_factory.cc b/starboard/shared/win32/player_components_factory.cc
new file mode 100644
index 0000000..be024bd
--- /dev/null
+++ b/starboard/shared/win32/player_components_factory.cc
@@ -0,0 +1,117 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/starboard/player/filter/player_components.h"
+
+#include "starboard/common/log.h"
+#include "starboard/common/ref_counted.h"
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/shared/opus/opus_audio_decoder.h"
+#include "starboard/shared/starboard/player/filter/adaptive_audio_decoder_internal.h"
+#include "starboard/shared/starboard/player/filter/audio_decoder_internal.h"
+#include "starboard/shared/starboard/player/filter/audio_renderer_sink_impl.h"
+#include "starboard/shared/starboard/player/filter/video_decoder_internal.h"
+#include "starboard/shared/starboard/player/filter/video_render_algorithm.h"
+#include "starboard/shared/starboard/player/filter/video_render_algorithm_impl.h"
+#include "starboard/shared/starboard/player/filter/video_renderer_sink.h"
+#include "starboard/shared/win32/audio_decoder.h"
+#include "starboard/shared/win32/video_decoder.h"
+
+namespace starboard {
+namespace shared {
+namespace starboard {
+namespace player {
+namespace filter {
+
+namespace {
+
+class PlayerComponentsFactory : public PlayerComponents::Factory {
+  bool CreateSubComponents(
+      const CreationParameters& creation_parameters,
+      scoped_ptr<AudioDecoder>* audio_decoder,
+      scoped_ptr<AudioRendererSink>* audio_renderer_sink,
+      scoped_ptr<VideoDecoder>* video_decoder,
+      scoped_ptr<VideoRenderAlgorithm>* video_render_algorithm,
+      scoped_refptr<VideoRendererSink>* video_renderer_sink,
+      std::string* error_message) override {
+    SB_DCHECK(error_message);
+
+    if (creation_parameters.audio_codec() != kSbMediaAudioCodecNone) {
+      SB_DCHECK(audio_decoder);
+      SB_DCHECK(audio_renderer_sink);
+
+      auto decoder_creator = [](const SbMediaAudioSampleInfo& audio_sample_info,
+                                SbDrmSystem drm_system) {
+        using AacAudioDecoderImpl = ::starboard::shared::win32::AudioDecoder;
+        using OpusAudioDecoderImpl =
+            ::starboard::shared::opus::OpusAudioDecoder;
+
+        if (audio_sample_info.codec == kSbMediaAudioCodecAac) {
+          return scoped_ptr<AudioDecoder>(new AacAudioDecoderImpl(
+              audio_sample_info.codec, audio_sample_info, drm_system));
+        } else if (audio_sample_info.codec == kSbMediaAudioCodecOpus) {
+          return scoped_ptr<AudioDecoder>(
+              new OpusAudioDecoderImpl(audio_sample_info));
+        } else {
+          SB_NOTREACHED();
+        }
+        return scoped_ptr<AudioDecoder>();
+      };
+
+      audio_decoder->reset(new AdaptiveAudioDecoder(
+          creation_parameters.audio_sample_info(),
+          creation_parameters.drm_system(), decoder_creator));
+      audio_renderer_sink->reset(new AudioRendererSinkImpl);
+    }
+
+    if (creation_parameters.video_codec() != kSbMediaVideoCodecNone) {
+      using VideoDecoderImpl = ::starboard::shared::win32::VideoDecoder;
+
+      SB_DCHECK(video_decoder);
+      SB_DCHECK(video_render_algorithm);
+      SB_DCHECK(video_renderer_sink);
+
+      scoped_ptr<VideoDecoderImpl> video_decoder_impl(new VideoDecoderImpl(
+          creation_parameters.video_codec(), creation_parameters.output_mode(),
+          creation_parameters.decode_target_graphics_context_provider(),
+          creation_parameters.drm_system()));
+      *video_renderer_sink = NULL;
+      video_decoder->reset(video_decoder_impl.release());
+      video_render_algorithm->reset(new VideoRenderAlgorithmImpl);
+    }
+
+    return true;
+  }
+};
+
+}  // namespace
+
+// static
+scoped_ptr<PlayerComponents::Factory> PlayerComponents::Factory::Create() {
+  return make_scoped_ptr<PlayerComponents::Factory>(
+      new PlayerComponentsFactory);
+}
+
+// static
+bool VideoDecoder::OutputModeSupported(SbPlayerOutputMode output_mode,
+                                       SbMediaVideoCodec codec,
+                                       SbDrmSystem drm_system) {
+  return output_mode == kSbPlayerOutputModeDecodeToTexture;
+}
+
+}  // namespace filter
+}  // namespace player
+}  // namespace starboard
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/playready_license.cc b/starboard/shared/win32/playready_license.cc
new file mode 100644
index 0000000..421df2a
--- /dev/null
+++ b/starboard/shared/win32/playready_license.cc
@@ -0,0 +1,31 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/drm_system_playready.h"
+
+#include "starboard/configuration.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+scoped_refptr<DrmSystemPlayready::License> DrmSystemPlayready::License::Create(
+    const void* initialization_data,
+    int initialization_data_size) {
+  return NULL;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/set_non_blocking_internal.cc b/starboard/shared/win32/set_non_blocking_internal.cc
new file mode 100644
index 0000000..8abeb3a
--- /dev/null
+++ b/starboard/shared/win32/set_non_blocking_internal.cc
@@ -0,0 +1,31 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/set_non_blocking_internal.h"
+
+#include <winsock2.h>
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+bool SetNonBlocking(SOCKET socket_handle) {
+  u_long kOne = 1;
+  bool success = (ioctlsocket(socket_handle, FIONBIO, &kOne) == 0);
+  return success;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/set_non_blocking_internal.h b/starboard/shared/win32/set_non_blocking_internal.h
new file mode 100644
index 0000000..fc369f7
--- /dev/null
+++ b/starboard/shared/win32/set_non_blocking_internal.h
@@ -0,0 +1,33 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_SET_NON_BLOCKING_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_SET_NON_BLOCKING_INTERNAL_H_
+
+#include "starboard/shared/internal_only.h"
+
+#include <winsock2.h>
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// Makes the socket file descriptor non-blocking.
+bool SetNonBlocking(SOCKET socket_handle);
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_SET_NON_BLOCKING_INTERNAL_H_
diff --git a/starboard/shared/win32/socket_accept.cc b/starboard/shared/win32/socket_accept.cc
new file mode 100644
index 0000000..b8ca76b
--- /dev/null
+++ b/starboard/shared/win32/socket_accept.cc
@@ -0,0 +1,52 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/set_non_blocking_internal.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+SbSocket SbSocketAccept(SbSocket socket) {
+  if (!SbSocketIsValid(socket)) {
+    return kSbSocketInvalid;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+
+  SOCKET socket_handle = accept(socket->socket_handle, nullptr, nullptr);
+  if (socket_handle == INVALID_SOCKET) {
+    socket->error = sbwin32::TranslateSocketErrorStatus(WSAGetLastError());
+    return kSbSocketInvalid;
+  }
+
+  // All Starboard sockets are non-blocking, so let's ensure it.
+  if (!sbwin32::SetNonBlocking(socket_handle)) {
+    // Something went wrong, we'll clean up and return failure.
+    socket->error = sbwin32::TranslateSocketErrorStatus(WSAGetLastError());
+    closesocket(socket_handle);
+    return kSbSocketInvalid;
+  }
+
+  socket->error = kSbSocketOk;
+
+  // Adopt the newly accepted socket.
+  return new SbSocketPrivate(socket->address_type, socket->protocol,
+                             socket_handle,
+                             SbSocketPrivate::BindTarget::kAccepted);
+}
diff --git a/starboard/shared/win32/socket_bind.cc b/starboard/shared/win32/socket_bind.cc
new file mode 100644
index 0000000..56fd97b
--- /dev/null
+++ b/starboard/shared/win32/socket_bind.cc
@@ -0,0 +1,95 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/common/memory.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+namespace {
+
+bool IsIpv6InaddrAny(const SbSocketAddress* local_address) {
+  return starboard::common::MemoryIsZero(local_address->address,
+                                         sbwin32::kAddressLengthIpv6);
+}
+bool IsIpv4InaddrAny(const SbSocketAddress* local_address) {
+  return starboard::common::MemoryIsZero(local_address->address,
+                                         sbwin32::kAddressLengthIpv4);
+}
+
+}  // namespace
+
+SbSocketError SbSocketBind(SbSocket socket,
+                           const SbSocketAddress* local_address) {
+  if (!SbSocketIsValid(socket)) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid socket";
+    return kSbSocketErrorFailed;
+  }
+
+  sbwin32::SockAddr sock_addr;
+  if (!sock_addr.FromSbSocketAddress(local_address)) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid address";
+    return (socket->error = sbwin32::TranslateSocketErrorStatus(EINVAL));
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+  if (local_address->type != socket->address_type) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Incompatible addresses: "
+                   << "socket type = " << socket->address_type
+                   << ", argument type = " << local_address->type;
+    return (socket->error = sbwin32::TranslateSocketErrorStatus(EAFNOSUPPORT));
+  }
+
+  switch (local_address->type) {
+    case kSbSocketAddressTypeIpv6:
+      if (!IsIpv6InaddrAny(local_address)) {
+        socket->bound_to = SbSocketPrivate::BindTarget::kOther;
+        break;
+      }
+
+      socket->bound_to = SbSocketPrivate::BindTarget::kAny;
+
+      // When binding to the IPV6 any address, ensure that the IPV6_V6ONLY flag
+      // is off to allow incoming IPV4 connections on the same socket.
+      // See https://www.ietf.org/rfc/rfc3493.txt for details.
+      if (!sbwin32::SetBooleanSocketOption(socket, IPPROTO_IPV6, IPV6_V6ONLY,
+                                           "IPV6_V6ONLY", false)) {
+        // Silently ignore errors, assume the default behavior is as expected.
+        socket->error = kSbSocketOk;
+      }
+
+      break;
+    case kSbSocketAddressTypeIpv4:
+      socket->bound_to = IsIpv4InaddrAny(local_address)
+                             ? SbSocketPrivate::BindTarget::kAny
+                             : SbSocketPrivate::BindTarget::kOther;
+      break;
+  }
+
+  int result =
+      bind(socket->socket_handle, sock_addr.sockaddr(), sock_addr.length);
+  if (result == SOCKET_ERROR) {
+    int last_error = WSAGetLastError();
+    SB_DLOG(ERROR) << __FUNCTION__
+                   << ": Bind failed. last_error=" << last_error;
+    return (socket->error = sbwin32::TranslateSocketErrorStatus(last_error));
+  }
+
+  return (socket->error = kSbSocketOk);
+}
diff --git a/starboard/shared/win32/socket_clear_last_error.cc b/starboard/shared/win32/socket_clear_last_error.cc
new file mode 100644
index 0000000..06f4a7d
--- /dev/null
+++ b/starboard/shared/win32/socket_clear_last_error.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include "starboard/shared/win32/socket_internal.h"
+
+bool SbSocketClearLastError(SbSocket socket) {
+  if (!SbSocketIsValid(socket)) {
+    return false;
+  }
+
+  socket->error = kSbSocketOk;
+  return true;
+}
diff --git a/starboard/shared/win32/socket_connect.cc b/starboard/shared/win32/socket_connect.cc
new file mode 100644
index 0000000..a618efc
--- /dev/null
+++ b/starboard/shared/win32/socket_connect.cc
@@ -0,0 +1,59 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+SbSocketError SbSocketConnect(SbSocket socket, const SbSocketAddress* address) {
+  if (!SbSocketIsValid(socket)) {
+    return kSbSocketErrorFailed;
+  }
+
+  sbwin32::SockAddr sock_addr;
+  if (!sock_addr.FromSbSocketAddress(address)) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid address";
+    return (socket->error = kSbSocketErrorFailed);
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+  if (address->type != socket->address_type) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Incompatible addresses: "
+                   << "socket type = " << socket->address_type
+                   << ", argument type = " << address->type;
+    return (socket->error = kSbSocketErrorFailed);
+  }
+
+  int result =
+      connect(socket->socket_handle, sock_addr.sockaddr(), sock_addr.length);
+
+  if (result != SOCKET_ERROR) {
+    socket->bound_to = SbSocketPrivate::BindTarget::kAny;
+    return (socket->error = kSbSocketOk);
+  }
+
+  const int last_error = WSAGetLastError();
+  if (last_error == WSAEWOULDBLOCK) {
+    socket->bound_to = SbSocketPrivate::BindTarget::kAny;
+    return (socket->error = kSbSocketPending);
+  }
+
+  SB_DLOG(ERROR) << __FUNCTION__ << ": connect failed: " << last_error;
+  return (socket->error = kSbSocketErrorFailed);
+}
diff --git a/starboard/shared/win32/socket_create.cc b/starboard/shared/win32/socket_create.cc
new file mode 100644
index 0000000..ecceaaf
--- /dev/null
+++ b/starboard/shared/win32/socket_create.cc
@@ -0,0 +1,119 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+#include <mswsock.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/set_non_blocking_internal.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+SbSocket SbSocketCreate(SbSocketAddressType address_type,
+                        SbSocketProtocol protocol) {
+  int socket_domain;
+  switch (address_type) {
+    case kSbSocketAddressTypeIpv4:
+      socket_domain = AF_INET;
+      break;
+    case kSbSocketAddressTypeIpv6:
+      socket_domain = AF_INET6;
+      break;
+    default:
+      SB_NOTREACHED();
+      return kSbSocketInvalid;
+  }
+
+  int socket_type;
+  int socket_protocol;
+  switch (protocol) {
+    case kSbSocketProtocolTcp:
+      socket_type = SOCK_STREAM;
+      socket_protocol = IPPROTO_TCP;
+      break;
+    case kSbSocketProtocolUdp:
+      socket_type = SOCK_DGRAM;
+      socket_protocol = IPPROTO_UDP;
+      break;
+    default:
+      SB_NOTREACHED();
+      return kSbSocketInvalid;
+  }
+
+  // WSASocket with dwFlags=0, instead of socket() creates sockets that do not
+  // support overlapped IO.
+  SOCKET socket_handle =
+      WSASocketW(socket_domain, socket_type, socket_protocol, nullptr, 0, 0);
+  if (socket_handle == INVALID_SOCKET) {
+    return kSbSocketInvalid;
+  }
+
+  // From
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/cc136103(v=vs.85).aspx:
+  // "When the TargetOsVersion member is set to a value for Windows Vista or
+  // later, reductions to the TCP receive buffer size on this socket using the
+  // SO_RCVBUF socket option are allowed even after a TCP connection has been
+  // establishment."
+  // "When the TargetOsVersion member is set to a value for Windows Vista or
+  // later, receive window auto-tuning is enabled and the TCP window scale
+  // factor is reduced to 2 from the default value of 8."
+
+  // The main impetus for this change:
+
+  // "The WsaBehaviorAutoTuning option is needed on Windows Vista for some
+  // Internet gateway devices and firewalls that do not correctly support data
+  // flows for TCP connections that use the WSopt extension and a windows scale
+  // factor. On Windows Vista, a receiver by default negotiates a window scale
+  // factor of 8 for a maximum true window size of 16,776,960 bytes. When data
+  // begins to flow on a fast link, Windows initially starts with a 64 Kilobyte
+  // true window size by setting the Window field of the TCP header to 256 and
+  // setting the window scale factor to 8 in the TCP options (256*2^8=64KB).
+  // Some Internet gateway devices and firewalls ignore the window scale factor
+  // and only look at the advertised Window field in the TCP header specified as
+  // 256, and drop incoming packets for the connection that contain more than
+  // 256 bytes of TCP data. To support TCP receive window scaling, a gateway
+  // device or firewall must monitor the TCP handshake and track the negotiated
+  // window scale factor as part of the TCP connection data. Also some
+  // applications and TCP stack implementations on other platforms ignore the
+  // TCP WSopt extension and the window scaling factor. So the remote host
+  // sending the data may send data at the rate advertised in the Window field
+  // of the TCP header (256 bytes). This can result in data being received very
+  // slowly by the receiver."
+
+  if (protocol == kSbSocketProtocolTcp) {
+    WSA_COMPATIBILITY_MODE compatibility_mode = {WsaBehaviorAll, NTDDI_VISTA};
+
+    DWORD kZero = 0;
+    int return_value = WSAIoctl(
+        socket_handle, SIO_SET_COMPATIBILITY_MODE, &compatibility_mode,
+        sizeof(WSA_COMPATIBILITY_MODE), nullptr, 0, &kZero, nullptr, nullptr);
+    if (return_value == SOCKET_ERROR) {
+      closesocket(socket_handle);
+      return kSbSocketInvalid;
+    }
+  }
+
+  // All Starboard sockets are non-blocking, so let's ensure it.
+  if (!sbwin32::SetNonBlocking(socket_handle)) {
+    // Something went wrong, we'll clean up and return failure.
+    closesocket(socket_handle);
+    return kSbSocketInvalid;
+  }
+
+  return new SbSocketPrivate(address_type, protocol, socket_handle,
+                             SbSocketPrivate::BindTarget::kUnbound);
+}
diff --git a/starboard/shared/win32/socket_destroy.cc b/starboard/shared/win32/socket_destroy.cc
new file mode 100644
index 0000000..14da41e
--- /dev/null
+++ b/starboard/shared/win32/socket_destroy.cc
@@ -0,0 +1,39 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+#include "starboard/socket_waiter.h"
+
+bool SbSocketDestroy(SbSocket socket) {
+  if (!SbSocketIsValid(socket)) {
+    return false;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+
+  if (socket->waiter != nullptr) {
+    bool result = SbSocketWaiterRemove(socket->waiter, socket);
+    SB_DCHECK(result);
+  }
+
+  bool result = closesocket(socket->socket_handle) != SOCKET_ERROR;
+
+  delete socket;
+  return result;
+}
diff --git a/starboard/shared/win32/socket_free_resolution.cc b/starboard/shared/win32/socket_free_resolution.cc
new file mode 100644
index 0000000..834e472
--- /dev/null
+++ b/starboard/shared/win32/socket_free_resolution.cc
@@ -0,0 +1,29 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include "starboard/common/log.h"
+
+void SbSocketFreeResolution(SbSocketResolution* resolution) {
+  if (!resolution) {
+    return;
+  }
+
+  if (resolution->addresses) {
+    delete[] resolution->addresses;
+  }
+
+  delete resolution;
+}
diff --git a/starboard/shared/win32/socket_get_interface_address.cc b/starboard/shared/win32/socket_get_interface_address.cc
new file mode 100644
index 0000000..5d0929a
--- /dev/null
+++ b/starboard/shared/win32/socket_get_interface_address.cc
@@ -0,0 +1,289 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include <ifdef.h>
+#include <iphlpapi.h>
+
+#include <algorithm>
+#include <memory>
+
+#include "starboard/common/byte_swap.h"
+#include "starboard/common/log.h"
+#include "starboard/memory.h"
+#include "starboard/shared/win32/adapter_utils.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+namespace {
+const ULONG kDefaultAdapterInfoBufferSizeInBytes = 16 * 1024;
+
+bool IsAnyAddress(const SbSocketAddress& address) {
+  switch (address.type) {
+    case kSbSocketAddressTypeIpv4:
+      return (address.address[0] == 0 && address.address[1] == 0 &&
+              address.address[2] == 0 && address.address[3] == 0);
+    case kSbSocketAddressTypeIpv6: {
+      bool found_nonzero = false;
+      for (std::size_t i = 0; i != sbwin32::kAddressLengthIpv6; ++i) {
+        found_nonzero |= (address.address[i] != 0);
+      }
+      return !found_nonzero;
+    }
+    default:
+      SB_NOTREACHED() << "Invalid address type " << address.type;
+      break;
+  }
+
+  return false;
+}
+
+void GenerateNetMaskFromPrefixLength(UINT8 prefix_length,
+                                     UINT32* const address_begin,
+                                     UINT32* const address_end) {
+  SB_DCHECK(address_end >= address_begin);
+  SB_DCHECK((reinterpret_cast<char*>(address_end) -
+             reinterpret_cast<char*>(address_begin)) %
+                4 ==
+            0);
+  UINT8 ones_left = prefix_length;
+  const int kBitsInOneDWORD = sizeof(UINT32) * 8;
+  for (UINT32* iterator = address_begin; iterator != address_end; ++iterator) {
+    UINT8 ones_in_this_dword = std::min<UINT8>(kBitsInOneDWORD, ones_left);
+    UINT64 mask_value =
+        kSbUInt64Max - ((1ULL << (kBitsInOneDWORD - ones_in_this_dword)) - 1);
+    *iterator =
+        SB_HOST_TO_NET_U32(static_cast<UINT32>(mask_value & kSbUInt64Max));
+    ones_left -= ones_in_this_dword;
+  }
+}
+
+bool PopulateInterfaceAddress(const IP_ADAPTER_UNICAST_ADDRESS& unicast_address,
+                              SbSocketAddress* out_interface_ip) {
+  if (!out_interface_ip) {
+    return true;
+  }
+
+  const SOCKET_ADDRESS& address = unicast_address.Address;
+  sbwin32::SockAddr addr;
+  return addr.FromSockaddr(address.lpSockaddr) &&
+         addr.ToSbSocketAddress(out_interface_ip);
+}
+
+bool PopulateNetmask(const IP_ADAPTER_UNICAST_ADDRESS& unicast_address,
+                     SbSocketAddress* out_netmask) {
+  if (!out_netmask) {
+    return true;
+  }
+
+  const SOCKET_ADDRESS& address = unicast_address.Address;
+  if (address.lpSockaddr == nullptr) {
+    return false;
+  }
+  const ADDRESS_FAMILY& family = address.lpSockaddr->sa_family;
+
+  switch (family) {
+    case AF_INET:
+      out_netmask->type = kSbSocketAddressTypeIpv4;
+      break;
+    case AF_INET6:
+      out_netmask->type = kSbSocketAddressTypeIpv6;
+      break;
+    default:
+      SB_NOTREACHED() << "Invalid family " << family;
+      return false;
+  }
+
+  UINT32* const begin_netmask =
+      reinterpret_cast<UINT32*>(&(out_netmask->address[0]));
+  UINT32* const end_netmask =
+      begin_netmask + SB_ARRAY_SIZE(out_netmask->address) / sizeof(UINT32);
+
+  GenerateNetMaskFromPrefixLength(unicast_address.OnLinkPrefixLength,
+                                  begin_netmask, end_netmask);
+  return true;
+}
+
+bool GetNetmaskForInterfaceAddress(const SbSocketAddress& interface_address,
+                                   SbSocketAddress* out_netmask) {
+  std::unique_ptr<char[]> adapter_info_memory_block;
+  if (!sbwin32::GetAdapters(
+      interface_address.type, &adapter_info_memory_block)) {
+    return false;
+  }
+  const void* const interface_address_buffer =
+      reinterpret_cast<const void* const>(interface_address.address);
+  for (PIP_ADAPTER_ADDRESSES adapter = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(
+           adapter_info_memory_block.get());
+       adapter != nullptr; adapter = adapter->Next) {
+    if ((adapter->OperStatus != IfOperStatusUp) ||
+        !sbwin32::IsIfTypeEthernet(adapter->IfType)) {
+      continue;
+    }
+
+    for (PIP_ADAPTER_UNICAST_ADDRESS unicast_address =
+             adapter->FirstUnicastAddress;
+         unicast_address != nullptr; unicast_address = unicast_address->Next) {
+      sbwin32::SockAddr addr;
+      if (!addr.FromSockaddr(unicast_address->Address.lpSockaddr)) {
+        continue;
+      }
+
+      const void* unicast_address_buffer = nullptr;
+      int bytes_to_check = 0;
+
+      switch (interface_address.type) {
+        case kSbSocketAddressTypeIpv4:
+          unicast_address_buffer =
+              reinterpret_cast<void*>(&(addr.sockaddr_in()->sin_addr));
+          bytes_to_check = sbwin32::kAddressLengthIpv4;
+          break;
+        case kSbSocketAddressTypeIpv6:
+          unicast_address_buffer =
+              reinterpret_cast<void*>(&(addr.sockaddr_in6()->sin6_addr));
+          bytes_to_check = sbwin32::kAddressLengthIpv6;
+          break;
+        default:
+          SB_DLOG(ERROR) << "Invalid interface address type "
+                         << interface_address.type;
+          return false;
+      }
+
+      if (memcmp(unicast_address_buffer, interface_address_buffer,
+                 bytes_to_check) != 0) {
+        continue;
+      }
+
+      if (PopulateNetmask(*unicast_address, out_netmask)) {
+        return true;
+      }
+    }
+  }
+
+  return false;
+}
+
+bool IsUniqueLocalAddress(const unsigned char ip[16]) {
+  // Unique Local Addresses are in fd08::/8.
+  return ip[0] == 0xfd && ip[1] == 0x08;
+}
+
+bool FindInterfaceIP(const SbSocketAddressType address_type,
+                     SbSocketAddress* out_interface_ip,
+                     SbSocketAddress* out_netmask) {
+  if (out_interface_ip == nullptr) {
+    SB_NOTREACHED() << "out_interface_ip must be specified";
+    return false;
+  }
+
+  std::unique_ptr<char[]> adapter_info_memory_block;
+  if (!sbwin32::GetAdapters(address_type, &adapter_info_memory_block)) {
+    return false;
+  }
+
+  for (PIP_ADAPTER_ADDRESSES adapter = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(
+           adapter_info_memory_block.get());
+       adapter != nullptr; adapter = adapter->Next) {
+    if ((adapter->OperStatus != IfOperStatusUp) ||
+        !sbwin32::IsIfTypeEthernet(adapter->IfType)) {
+      continue;
+    }
+
+    for (PIP_ADAPTER_UNICAST_ADDRESS unicast_address =
+             adapter->FirstUnicastAddress;
+         unicast_address != nullptr; unicast_address = unicast_address->Next) {
+      if (unicast_address->Flags & (IP_ADAPTER_ADDRESS_TRANSIENT)) {
+        continue;
+      }
+      if (!(unicast_address->Flags & IP_ADAPTER_ADDRESS_DNS_ELIGIBLE)) {
+        continue;
+      }
+
+      // TODO: For IPv6, Prioritize interface with highest scope.
+      // Skip ULAs for now.
+      if (address_type == kSbSocketAddressTypeIpv6) {
+        // Documentation on MSDN states:
+        // "The SOCKADDR structure pointed to by the lpSockaddr member varies
+        // depending on the protocol or address family selected. For example,
+        // the sockaddr_in6 structure is used for an IPv6 socket address
+        // while the sockaddr_in4 structure is used for an IPv4 socket address."
+        // https://msdn.microsoft.com/en-us/library/windows/desktop/ms740507(v=vs.85).aspx
+
+        sockaddr_in6* addr = reinterpret_cast<sockaddr_in6*>(
+            unicast_address->Address.lpSockaddr);
+        SB_DCHECK(addr->sin6_family == AF_INET6);
+        if (IsUniqueLocalAddress(addr->sin6_addr.u.Byte)) {
+          continue;
+        }
+      }
+
+      if (!PopulateInterfaceAddress(*unicast_address, out_interface_ip)) {
+        continue;
+      }
+      if (!PopulateNetmask(*unicast_address, out_netmask)) {
+        continue;
+      }
+
+      return true;
+    }
+  }
+  return false;
+}
+
+bool FindSourceAddressForDestination(const SbSocketAddress& destination,
+                                     SbSocketAddress* out_source_address) {
+  SbSocket socket = SbSocketCreate(destination.type, kSbSocketProtocolUdp);
+  if (!SbSocketIsValid(socket)) {
+    return false;
+  }
+
+  SbSocketError connect_retval = SbSocketConnect(socket, &destination);
+  if (connect_retval != kSbSocketOk) {
+    bool socket_destroyed = SbSocketDestroy(socket);
+    SB_DCHECK(socket_destroyed);
+    return false;
+  }
+
+  bool success = SbSocketGetLocalAddress(socket, out_source_address);
+  bool socket_destroyed = SbSocketDestroy(socket);
+  SB_DCHECK(socket_destroyed);
+  return success;
+}
+
+}  // namespace
+
+bool SbSocketGetInterfaceAddress(const SbSocketAddress* const destination,
+                                 SbSocketAddress* out_source_address,
+                                 SbSocketAddress* out_netmask) {
+  if (!out_source_address) {
+    return false;
+  }
+
+  if (destination == nullptr) {
+    // Return either a v4 or a v6 address.  Per spec.
+    return (FindInterfaceIP(kSbSocketAddressTypeIpv4, out_source_address,
+                            out_netmask) ||
+            FindInterfaceIP(kSbSocketAddressTypeIpv6, out_source_address,
+                            out_netmask));
+  } else if (IsAnyAddress(*destination)) {
+    return FindInterfaceIP(destination->type, out_source_address, out_netmask);
+  }
+
+  return (FindSourceAddressForDestination(*destination, out_source_address) &&
+          GetNetmaskForInterfaceAddress(*out_source_address, out_netmask));
+}
diff --git a/starboard/shared/win32/socket_get_last_error.cc b/starboard/shared/win32/socket_get_last_error.cc
new file mode 100644
index 0000000..cdfa21d
--- /dev/null
+++ b/starboard/shared/win32/socket_get_last_error.cc
@@ -0,0 +1,25 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include "starboard/shared/win32/socket_internal.h"
+
+SbSocketError SbSocketGetLastError(SbSocket socket) {
+  if (!SbSocketIsValid(socket)) {
+    return kSbSocketErrorFailed;
+  }
+
+  return socket->error;
+}
diff --git a/starboard/shared/win32/socket_get_local_address.cc b/starboard/shared/win32/socket_get_local_address.cc
new file mode 100644
index 0000000..5b900f6
--- /dev/null
+++ b/starboard/shared/win32/socket_get_local_address.cc
@@ -0,0 +1,66 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/memory.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+bool SbSocketGetLocalAddress(SbSocket socket, SbSocketAddress* out_address) {
+  if (!SbSocketIsValid(socket)) {
+    return false;
+  }
+
+  // winsock2 considers calling getsockname() on unbound sockets to be an error.
+  // Therefore, SbSocketListen() will call SbSocketBind().
+  if (socket->bound_to == SbSocketPrivate::BindTarget::kUnbound) {
+    out_address->type = socket->address_type;
+    switch (socket->address_type) {
+      case kSbSocketAddressTypeIpv4:
+        memset(out_address->address, 0, sbwin32::kAddressLengthIpv4);
+        out_address->port = 0;
+        return true;
+      case kSbSocketAddressTypeIpv6:
+        memset(out_address->address, 0, sbwin32::kAddressLengthIpv6);
+        out_address->port = 0;
+        return true;
+      default:
+        SB_NOTREACHED() << "Invalid address type: " << socket->address_type;
+        return false;
+    }
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+  sbwin32::SockAddr sock_addr;
+  int result = getsockname(socket->socket_handle, sock_addr.sockaddr(),
+                           &sock_addr.length);
+  if (result == SOCKET_ERROR) {
+    int last_error = WSAGetLastError();
+    SB_LOG(ERROR) << "getsockname() failed with last_error = " << last_error;
+    socket->error = sbwin32::TranslateSocketErrorStatus(last_error);
+    return false;
+  }
+  if (!sock_addr.ToSbSocketAddress(out_address)) {
+    socket->error = kSbSocketErrorFailed;
+    return false;
+  }
+
+  socket->error = kSbSocketOk;
+  return true;
+}
diff --git a/starboard/shared/win32/socket_internal.cc b/starboard/shared/win32/socket_internal.cc
new file mode 100644
index 0000000..078043c
--- /dev/null
+++ b/starboard/shared/win32/socket_internal.cc
@@ -0,0 +1,205 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/socket_internal.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/memory.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+namespace {
+const socklen_t kAddressStructLengthIpv4 =
+    static_cast<socklen_t>(sizeof(struct sockaddr_in));
+const socklen_t kAddressStructLengthIpv6 =
+    static_cast<socklen_t>(sizeof(struct sockaddr_in6));
+}
+
+SbSocketError TranslateSocketErrorStatus(int error) {
+  switch (error) {
+    case 0:
+      return kSbSocketOk;
+
+    // Microsoft Winsock error codes:
+    //   https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
+    case WSAEINPROGRESS:
+    case WSAEWOULDBLOCK:
+      return kSbSocketPending;
+    case WSAECONNRESET:
+    case WSAENETRESET:
+    case WSAECONNABORTED:
+      return kSbSocketErrorConnectionReset;
+
+    // Microsoft System Error codes:
+    //   https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx
+    case ERROR_BROKEN_PIPE:
+      return kSbSocketErrorConnectionReset;
+  }
+
+  // Here's where we would be more nuanced if we need to be.
+  return kSbSocketErrorFailed;
+}
+
+bool SetBooleanSocketOption(SbSocket socket,
+                            int level,
+                            int option_code,
+                            const char* option_name,
+                            bool value) {
+  if (!SbSocketIsValid(socket)) {
+    return false;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+  const int on = value ? 1 : 0;
+  int result = setsockopt(socket->socket_handle, level, option_code,
+                          reinterpret_cast<const char*>(&on), sizeof(on));
+  if (result == SOCKET_ERROR) {
+    int last_error = WSAGetLastError();
+    SB_DLOG(ERROR) << "Failed to set " << option_name << " on socket "
+                   << socket->socket_handle << ", last_error = " << last_error;
+    socket->error = TranslateSocketErrorStatus(last_error);
+    return false;
+  }
+
+  socket->error = kSbSocketOk;
+  return true;
+}
+
+bool SetIntegerSocketOption(SbSocket socket,
+                            int level,
+                            int option_code,
+                            const char* option_name,
+                            int value) {
+  if (!SbSocketIsValid(socket)) {
+    return false;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+  int result = setsockopt(socket->socket_handle, level, option_code,
+                          reinterpret_cast<const char*>(&value), sizeof(value));
+  if (result == SOCKET_ERROR) {
+    int last_error = WSAGetLastError();
+    SB_DLOG(ERROR) << "Failed to set " << option_name << " on socket "
+                   << socket->socket_handle << ", last_error = " << last_error;
+    socket->error = TranslateSocketErrorStatus(last_error);
+    return false;
+  }
+
+  socket->error = kSbSocketOk;
+  return true;
+}
+
+bool SockAddr::FromSbSocketAddress(const SbSocketAddress* address) {
+  if (!address) {
+    return false;
+  }
+
+  length = sizeof(storage_);
+  switch (address->type) {
+    case kSbSocketAddressTypeIpv4: {
+      struct sockaddr_in* addr = sockaddr_in();
+      length = kAddressStructLengthIpv4;
+      memset(addr, 0, length);
+      addr->sin_family = AF_INET;
+      addr->sin_port = htons(static_cast<USHORT>(address->port));
+      memcpy(&addr->sin_addr, address->address, kAddressLengthIpv4);
+      break;
+    }
+    case kSbSocketAddressTypeIpv6: {
+      struct sockaddr_in6* addr6 = sockaddr_in6();
+      length = kAddressStructLengthIpv6;
+      memset(addr6, 0, length);
+      addr6->sin6_family = AF_INET6;
+      addr6->sin6_port = htons(static_cast<USHORT>(address->port));
+      memcpy(&addr6->sin6_addr, address->address, kAddressLengthIpv6);
+      break;
+    }
+    default:
+      SB_NOTREACHED() << "Unrecognized address type: " << address->type;
+      return false;
+  }
+
+  return true;
+}
+
+bool SockAddr::ToSbSocketAddress(SbSocketAddress* out_address) const {
+  if (!out_address) {
+    return false;
+  }
+
+// Check that we have been properly initialized.
+  SB_DCHECK(length == kAddressStructLengthIpv4 ||
+            length == kAddressStructLengthIpv6);
+
+  if (family() == AF_INET) {
+    const struct sockaddr_in* addr = sockaddr_in();
+    if (length < kAddressStructLengthIpv4) {
+      SB_NOTREACHED() << "Insufficient INET size: " << length;
+      return false;
+    }
+
+    memcpy(out_address->address, &addr->sin_addr, kAddressLengthIpv4);
+    out_address->port = ntohs(addr->sin_port);
+    out_address->type = kSbSocketAddressTypeIpv4;
+    return true;
+  }
+
+  if (family() == AF_INET6) {
+    const struct sockaddr_in6* addr6 = sockaddr_in6();
+    if (length < kAddressStructLengthIpv6) {
+      SB_NOTREACHED() << "Insufficient INET6 size: " << length;
+      return false;
+    }
+
+    memcpy(out_address->address, &addr6->sin6_addr, kAddressLengthIpv6);
+    out_address->port = ntohs(addr6->sin6_port);
+    out_address->type = kSbSocketAddressTypeIpv6;
+    return true;
+  }
+
+  SB_NOTREACHED() << "Unrecognized address family: " << family();
+  return false;
+}
+
+bool SockAddr::FromSockaddr(const struct sockaddr* sock_addr) {
+  if (!sock_addr) {
+    return false;
+  }
+
+  int family = sock_addr->sa_family;
+  if (family == AF_INET) {
+    const struct sockaddr_in* addr =
+        reinterpret_cast<const struct sockaddr_in*>(sock_addr);
+    *sockaddr_in() = *addr;
+    length = static_cast<socklen_t>(sizeof(*addr));
+    return true;
+  } else if (family == AF_INET6) {
+    const struct sockaddr_in6* addr =
+        reinterpret_cast<const struct sockaddr_in6*>(sock_addr);
+    *sockaddr_in6() = *addr;
+    length = static_cast<socklen_t>(sizeof(*addr));
+    return true;
+  }
+
+  SB_DLOG(WARNING) << "Unrecognized address family: " << family;
+  return false;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/socket_internal.h b/starboard/shared/win32/socket_internal.h
new file mode 100644
index 0000000..3030ac8
--- /dev/null
+++ b/starboard/shared/win32/socket_internal.h
@@ -0,0 +1,164 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_SOCKET_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_SOCKET_INTERNAL_H_
+
+#include <WS2tcpip.h>
+#include <winsock2.h>
+
+#include "starboard/atomic.h"
+#include "starboard/common/socket.h"
+#include "starboard/shared/internal_only.h"
+#include "starboard/shared/win32/auto_event_handle.h"
+#include "starboard/socket_waiter.h"
+#include "starboard/types.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+struct SbSocketPrivate {
+  enum struct BindTarget {
+    kUnbound = 0,
+    kAny = 1,
+    kOther = 2,
+    kAccepted = 3,
+  };
+
+  SbSocketPrivate(SbSocketAddressType address_type,
+                  SbSocketProtocol protocol,
+                  SOCKET handle,
+                  BindTarget bound_to)
+      : address_type(address_type),
+        protocol(protocol),
+        socket_handle(handle),
+        socket_event(WSA_INVALID_EVENT),
+        writable(0),
+        error(kSbSocketOk),
+        waiter(kSbSocketWaiterInvalid),
+        bound_to(bound_to) {}
+  ~SbSocketPrivate() {}
+
+  // The address domain of this socket, IPv4 or IPv6.
+  SbSocketAddressType address_type;
+
+  // The protocol of this socket, UDP or TCP.
+  SbSocketProtocol protocol;
+
+  // The handle for this socket.
+  SOCKET socket_handle;
+
+  // The event related to the socket_handle.  Used for SbSocketWaiter.
+  sbwin32::AutoEventHandle socket_event;
+
+  // Set to true between when socket is shown as writable via WSAEventSelect/
+  // WSAWaitForMultipleEvents and when writing to the socket returns
+  // fails with WSAEWOULDBLOCK.
+  //
+  // Used to work around the fact that WSAEventSelect for FD_WRITE is
+  // edge-triggered, unlike other events.
+  //
+  // See MSDN documentation for WSAEventSelect FD_WRITE for more info.
+  starboard::atomic_bool writable;
+
+  // The last error that occurred on this socket, or kSbSocketOk.
+  SbSocketError error;
+
+  // The waiter this socket is registered with, or kSbSocketWaiterInvalid.
+  SbSocketWaiter waiter;
+
+  BindTarget bound_to;
+};
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+const socklen_t kAddressLengthIpv4 = 4;
+const socklen_t kAddressLengthIpv6 = 16;
+
+// Translates an last_error from a socket call into an SbSocketError.
+SbSocketError TranslateSocketErrorStatus(int error);
+
+// Sets a boolean socket option, doing all appropriate checks.
+bool SetBooleanSocketOption(SbSocket socket,
+                            int level,
+                            int option_code,
+                            const char* option_name,
+                            bool value);
+
+// Sets an integer socket option, doing all appropriate checks.
+bool SetIntegerSocketOption(SbSocket socket,
+                            int level,
+                            int option_code,
+                            const char* option_name,
+                            int value);
+
+// A helper class for converting back and forth from sockaddrs, ugh.
+class SockAddr {
+ public:
+  SockAddr() : length(sizeof(storage_)) {}
+  ~SockAddr() {}
+
+  // Initializes this SockAddr with the given SbSocketAddress, overwriting
+  // anything any address previously held.
+  bool FromSbSocketAddress(const SbSocketAddress* address);
+
+  // Initializes the given SbSocketAddress with this SockAddr, which must have
+  // been previously initialized.
+  bool ToSbSocketAddress(SbSocketAddress* out_address) const;
+
+  // Initializes this SockAddr with |sock_addr|, assuming it is appropriately
+  // sized for its type.
+  bool FromSockaddr(const struct sockaddr* sock_addr);
+
+  // The sockaddr family. We only support INET and INET6.
+  u_short family() const { return sockaddr()->sa_family; }
+
+  struct sockaddr* sockaddr() {
+    return reinterpret_cast<struct sockaddr*>(&storage_);
+  }
+
+  const struct sockaddr* sockaddr() const {
+    return reinterpret_cast<const struct sockaddr*>(&storage_);
+  }
+
+  struct sockaddr_in* sockaddr_in() {
+    return reinterpret_cast<struct sockaddr_in*>(&storage_);
+  }
+
+  const struct sockaddr_in* sockaddr_in() const {
+    return reinterpret_cast<const struct sockaddr_in*>(&storage_);
+  }
+
+  struct sockaddr_in6* sockaddr_in6() {
+    return reinterpret_cast<struct sockaddr_in6*>(&storage_);
+  }
+
+  const struct sockaddr_in6* sockaddr_in6() const {
+    return reinterpret_cast<const struct sockaddr_in6*>(&storage_);
+  }
+
+  // Public on purpose, because it will be handy to be passed directly by
+  // reference into other functions.
+  socklen_t length;
+
+ private:
+  sockaddr_storage storage_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_SOCKET_INTERNAL_H_
diff --git a/starboard/shared/win32/socket_is_connected.cc b/starboard/shared/win32/socket_is_connected.cc
new file mode 100644
index 0000000..23ec5ac
--- /dev/null
+++ b/starboard/shared/win32/socket_is_connected.cc
@@ -0,0 +1,41 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+bool SbSocketIsConnected(SbSocket socket) {
+  if (!SbSocketIsValid(socket)) {
+    return false;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+
+  // To tell if it is really connected, we peek a byte from the stream. We
+  // should get a byte back, or an EAGAIN/EWOULDBLOCK telling us the socket is
+  // waiting for data.
+  char c;
+  const int result = recv(socket->socket_handle, &c, 1, MSG_PEEK);
+  if (result == 0) {
+    // If the connection is closed, the return value is 0.
+    return false;
+  }
+
+  const int last_error = WSAGetLastError();
+  return (result > 0 || last_error == WSAEWOULDBLOCK);
+}
diff --git a/starboard/shared/win32/socket_is_connected_and_idle.cc b/starboard/shared/win32/socket_is_connected_and_idle.cc
new file mode 100644
index 0000000..5a74897
--- /dev/null
+++ b/starboard/shared/win32/socket_is_connected_and_idle.cc
@@ -0,0 +1,40 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+bool SbSocketIsConnectedAndIdle(SbSocket socket) {
+  if (!SbSocketIsValid(socket)) {
+    return false;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+
+  // To tell if it is really connected and idle, we peek a byte from the
+  // stream. We should get an EAGAIN/EWOULDBLOCK telling us the socket is
+  // waiting for data.
+  char c;
+  int rv = recv(socket->socket_handle, &c, 1, MSG_PEEK);
+  if (rv != SOCKET_ERROR) {
+    // Either not connected, or not idle.
+    return false;
+  }
+
+  return (WSAGetLastError() == WSAEWOULDBLOCK);
+}
diff --git a/starboard/shared/win32/socket_join_multicast_group.cc b/starboard/shared/win32/socket_join_multicast_group.cc
new file mode 100644
index 0000000..0fabee0
--- /dev/null
+++ b/starboard/shared/win32/socket_join_multicast_group.cc
@@ -0,0 +1,52 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+bool SbSocketJoinMulticastGroup(SbSocket socket,
+                                const SbSocketAddress* address) {
+  if (!SbSocketIsValid(socket)) {
+    return false;
+  }
+
+  if (!address) {
+    return false;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+  ip_mreq imreq = {0};
+  IN_ADDR addr = *reinterpret_cast<const IN_ADDR*>(address->address);
+  imreq.imr_multiaddr.s_addr = addr.S_un.S_addr;
+  imreq.imr_interface.s_addr = INADDR_ANY;
+
+  int result = setsockopt(socket->socket_handle, IPPROTO_IP, IP_ADD_MEMBERSHIP,
+                          reinterpret_cast<const char*>(&imreq), sizeof(imreq));
+  if (result == SOCKET_ERROR) {
+    int last_error = WSAGetLastError();
+    SB_DLOG(ERROR) << "Failed to IP_ADD_MEMBERSHIP on socket "
+                   << socket->socket_handle << ", last_error = " << last_error;
+    socket->error = sbwin32::TranslateSocketErrorStatus(last_error);
+    return false;
+  }
+
+  socket->error = kSbSocketOk;
+  return true;
+}
diff --git a/starboard/shared/win32/socket_listen.cc b/starboard/shared/win32/socket_listen.cc
new file mode 100644
index 0000000..0fbdda7
--- /dev/null
+++ b/starboard/shared/win32/socket_listen.cc
@@ -0,0 +1,57 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+SbSocketError SbSocketListen(SbSocket socket) {
+  if (!SbSocketIsValid(socket)) {
+    return kSbSocketErrorFailed;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+
+  // Under winsock, a socket must be bound before we can listen on it.
+  if (socket->bound_to == SbSocketPrivate::BindTarget::kUnbound) {
+    // By listening on ::, we can accept both IPv4 and IPv6 connections.
+    SbSocketAddress any_address = {0};
+    any_address.type = socket->address_type;
+    if (SbSocketBind(socket, &any_address) != kSbSocketOk) {
+      SB_DLOG(ERROR) << "Unable to bind a socket during SbListen.";
+      return (socket->error = kSbSocketErrorFailed);
+    }
+
+    socket->bound_to = SbSocketPrivate::BindTarget::kAny;
+  }
+
+  // We set the backlog to SOMAXCONN to ensure that it is above 1, and high
+  // enough that all tests are able to pass. Some tests will fail if backlog==1
+  // because they expect to be able to successfully initiate multiple connects
+  // at once, and then after all connects have been initiated to subsequently
+  // initiate corresponding accepts.
+  int result = listen(socket->socket_handle, SOMAXCONN);
+  if (result == SOCKET_ERROR) {
+    int last_error = WSAGetLastError();
+    SB_LOG(ERROR) << "listen() failed with last_error = " << last_error;
+    return (socket->error = sbwin32::TranslateSocketErrorStatus(last_error));
+  }
+
+  return (socket->error = kSbSocketOk);
+}
diff --git a/starboard/shared/win32/socket_receive_from.cc b/starboard/shared/win32/socket_receive_from.cc
new file mode 100644
index 0000000..2788266
--- /dev/null
+++ b/starboard/shared/win32/socket_receive_from.cc
@@ -0,0 +1,107 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+namespace {
+
+bool IsReportableErrno(int code) {
+  return (code != WSAEWOULDBLOCK && code != WSAECONNRESET);
+}
+
+}  // namespace
+
+int SbSocketReceiveFrom(SbSocket socket,
+                        char* out_data,
+                        int data_size,
+                        SbSocketAddress* out_source) {
+  const int kRecvFlags = 0;
+
+  if (!SbSocketIsValid(socket)) {
+    return -1;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+  if (socket->protocol == kSbSocketProtocolTcp) {
+    if (out_source) {
+      sbwin32::SockAddr sock_addr;
+      int result = getpeername(socket->socket_handle, sock_addr.sockaddr(),
+                               &sock_addr.length);
+      if (result == SOCKET_ERROR) {
+        int last_error = WSAGetLastError();
+        SB_DLOG(ERROR) << __FUNCTION__
+                       << ": getpeername failed, last_error = " << last_error;
+        socket->error = sbwin32::TranslateSocketErrorStatus(last_error);
+        return -1;
+      }
+
+      if (!sock_addr.ToSbSocketAddress(out_source)) {
+        SB_DLOG(FATAL) << __FUNCTION__ << ": Bad TCP source address.";
+        socket->error = kSbSocketErrorFailed;
+        return -1;
+      }
+    }
+
+    int bytes_read =
+        recv(socket->socket_handle, out_data, data_size, kRecvFlags);
+    if (bytes_read >= 0) {
+      socket->error = kSbSocketOk;
+      return static_cast<int>(bytes_read);
+    }
+
+    int last_error = WSAGetLastError();
+    if (IsReportableErrno(last_error) &&
+        socket->error != sbwin32::TranslateSocketErrorStatus(last_error)) {
+      SB_DLOG(ERROR) << "recv failed, last_error = " << last_error;
+    }
+    socket->error = sbwin32::TranslateSocketErrorStatus(last_error);
+    return -1;
+  } else if (socket->protocol == kSbSocketProtocolUdp) {
+    sbwin32::SockAddr sock_addr;
+    ssize_t bytes_read =
+        recvfrom(socket->socket_handle, out_data, data_size, kRecvFlags,
+                 sock_addr.sockaddr(), &sock_addr.length);
+
+    if (bytes_read >= 0) {
+      if (out_source) {
+        if (!sock_addr.ToSbSocketAddress(out_source)) {
+          SB_DLOG(FATAL) << __FUNCTION__ << ": Bad UDP source address.";
+          socket->error = kSbSocketErrorFailed;
+          return -1;
+        }
+      }
+
+      socket->error = kSbSocketOk;
+      return static_cast<int>(bytes_read);
+    }
+
+    int last_error = WSAGetLastError();
+    if (last_error != WSAEWOULDBLOCK &&
+        socket->error != sbwin32::TranslateSocketErrorStatus(last_error)) {
+      SB_DLOG(ERROR) << "recvfrom failed, last_error = " << last_error;
+    }
+    socket->error = sbwin32::TranslateSocketErrorStatus(last_error);
+    return -1;
+  }
+
+  SB_NOTREACHED() << "Unrecognized protocol: " << socket->protocol;
+  return -1;
+}
diff --git a/starboard/shared/win32/socket_resolve.cc b/starboard/shared/win32/socket_resolve.cc
new file mode 100644
index 0000000..44c3200
--- /dev/null
+++ b/starboard/shared/win32/socket_resolve.cc
@@ -0,0 +1,90 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include <memory>
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+SbSocketResolution* SbSocketResolve(const char* hostname, int filters) {
+  struct addrinfo* ai = nullptr;
+  struct addrinfo hints = {0};
+
+  if (filters & kSbSocketResolveFilterIpv4) {
+    if (filters & kSbSocketResolveFilterIpv6) {
+      hints.ai_family = AF_UNSPEC;
+    } else {
+      hints.ai_family = AF_INET;
+    }
+  } else if (filters & kSbSocketResolveFilterIpv6) {
+    hints.ai_family = AF_INET6;
+  } else {
+    hints.ai_family = AF_UNSPEC;
+  }
+
+  hints.ai_flags = AI_ADDRCONFIG;
+  hints.ai_socktype = SOCK_STREAM;
+
+  // Actually make the call to get the data.
+  int err = getaddrinfo(hostname, nullptr, &hints, &ai);
+  if (err != 0 || ai == nullptr) {
+    SB_DLOG(ERROR) << "getaddrinfo failed.  last_error: " << WSAGetLastError();
+    return nullptr;
+  }
+
+  int address_count = 0;
+  for (const auto* i = ai; i != nullptr; i = i->ai_next) {
+    ++address_count;
+  }
+
+  SbSocketResolution* result = new SbSocketResolution();
+
+  // Translate all the sockaddrs.
+  std::vector<sbwin32::SockAddr> sock_addrs;
+  sock_addrs.resize(address_count);
+
+  std::vector<bool> parsed;
+  parsed.resize(address_count);
+
+  int index = 0;
+  int skip = 0;
+  for (const auto *i = ai; i != nullptr; i = i->ai_next, ++index) {
+    // Skip over any addresses we can't parse.
+    parsed[index] = sock_addrs[index].FromSockaddr(i->ai_addr);
+    if (!parsed[index]) {
+      ++skip;
+    }
+  }
+
+  result->address_count = address_count - skip;
+  result->addresses = new SbSocketAddress[result->address_count];
+
+  int result_index = 0;
+  for (int i = 0; i < address_count; ++i) {
+    if (parsed[i] &&
+        sock_addrs[i].ToSbSocketAddress(&result->addresses[result_index])) {
+      ++result_index;
+    }
+  }
+
+  freeaddrinfo(ai);
+  return result;
+}
diff --git a/starboard/shared/win32/socket_send_to.cc b/starboard/shared/win32/socket_send_to.cc
new file mode 100644
index 0000000..53fa594
--- /dev/null
+++ b/starboard/shared/win32/socket_send_to.cc
@@ -0,0 +1,110 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <sstream>
+#include <string>
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+namespace {
+std::string CreateErrorString(const SbSocketAddress* addr, int error) {
+  std::stringstream out;
+  if (addr) {
+    out << "Sendto failed while sending to port " << addr->port
+        << ". Last Error: 0x" << std::hex << error;
+  } else {
+    out << "Sendto failed because of error: 0x" << std::hex << error;
+  }
+  return out.str();
+}
+}  // namespace
+
+int SbSocketSendTo(SbSocket socket,
+                   const char* data,
+                   int data_size,
+                   const SbSocketAddress* destination) {
+  const int kSendFlags = 0;
+  if (!SbSocketIsValid(socket)) {
+    return -1;
+  }
+
+  SB_DCHECK(socket->socket_handle != INVALID_SOCKET);
+  if (socket->protocol == kSbSocketProtocolTcp) {
+    if (destination) {
+      SB_DLOG(FATAL) << "Destination passed to TCP send.";
+      socket->error = kSbSocketErrorFailed;
+      return -1;
+    }
+
+    int bytes_written =
+        send(socket->socket_handle, data, data_size, kSendFlags);
+    if (bytes_written >= 0) {
+      socket->error = kSbSocketOk;
+      return static_cast<int>(bytes_written);
+    }
+
+    int last_error = WSAGetLastError();
+
+    if ((last_error == WSAEWOULDBLOCK) || (last_error == WSAECONNABORTED)) {
+      socket->writable.store(false);
+    } else {
+      SB_DLOG(ERROR) << CreateErrorString(destination, last_error);
+    }
+    socket->error = sbwin32::TranslateSocketErrorStatus(last_error);
+    return -1;
+  } else if (socket->protocol == kSbSocketProtocolUdp) {
+    if (!destination) {
+      SB_DLOG(FATAL) << "No destination passed to UDP send.";
+      socket->error = kSbSocketErrorFailed;
+      return -1;
+    }
+
+    sbwin32::SockAddr sock_addr;
+    const sockaddr* sockaddr = nullptr;
+    socklen_t sockaddr_length = 0;
+    if (destination) {
+      if (!sock_addr.FromSbSocketAddress(destination)) {
+        SB_DLOG(FATAL) << "Invalid destination passed to UDP send.";
+        socket->error = kSbSocketErrorFailed;
+        return -1;
+      }
+      sockaddr = sock_addr.sockaddr();
+      sockaddr_length = sock_addr.length;
+    }
+
+    int bytes_written = sendto(socket->socket_handle, data, data_size,
+                               kSendFlags, sockaddr, sockaddr_length);
+    if (bytes_written >= 0) {
+      socket->error = kSbSocketOk;
+      return static_cast<int>(bytes_written);
+    }
+
+    int last_error = WSAGetLastError();
+
+    if (last_error != WSAEWOULDBLOCK) {
+      SB_DLOG(ERROR) << CreateErrorString(destination, last_error);
+    }
+    socket->error = sbwin32::TranslateSocketErrorStatus(last_error);
+    return -1;
+  }
+
+  SB_NOTREACHED() << "Unrecognized protocol: " << socket->protocol;
+  return -1;
+}
diff --git a/starboard/shared/win32/socket_set_broadcast.cc b/starboard/shared/win32/socket_set_broadcast.cc
new file mode 100644
index 0000000..af86362
--- /dev/null
+++ b/starboard/shared/win32/socket_set_broadcast.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+bool SbSocketSetBroadcast(SbSocket socket, bool value) {
+  return sbwin32::SetBooleanSocketOption(socket, SOL_SOCKET, SO_BROADCAST,
+                                         "SO_BROADCAST", value);
+}
diff --git a/starboard/shared/win32/socket_set_receive_buffer_size.cc b/starboard/shared/win32/socket_set_receive_buffer_size.cc
new file mode 100644
index 0000000..f9571be
--- /dev/null
+++ b/starboard/shared/win32/socket_set_receive_buffer_size.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+bool SbSocketSetReceiveBufferSize(SbSocket socket, int32_t size) {
+  return sbwin32::SetIntegerSocketOption(socket, SOL_SOCKET, SO_RCVBUF,
+                                         "SO_RCVBUF", size);
+}
diff --git a/starboard/shared/win32/socket_set_reuse_address.cc b/starboard/shared/win32/socket_set_reuse_address.cc
new file mode 100644
index 0000000..b240402
--- /dev/null
+++ b/starboard/shared/win32/socket_set_reuse_address.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+bool SbSocketSetReuseAddress(SbSocket socket, bool value) {
+  return sbwin32::SetBooleanSocketOption(socket, SOL_SOCKET, SO_REUSEADDR,
+                                         "SO_REUSEADDR", value);
+}
diff --git a/starboard/shared/win32/socket_set_send_buffer_size.cc b/starboard/shared/win32/socket_set_send_buffer_size.cc
new file mode 100644
index 0000000..ca02d01
--- /dev/null
+++ b/starboard/shared/win32/socket_set_send_buffer_size.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+bool SbSocketSetSendBufferSize(SbSocket socket, int32_t size) {
+  return sbwin32::SetIntegerSocketOption(socket, SOL_SOCKET, SO_SNDBUF,
+                                         "SO_SNDBUF", size);
+}
diff --git a/starboard/shared/win32/socket_set_tcp_keep_alive.cc b/starboard/shared/win32/socket_set_tcp_keep_alive.cc
new file mode 100644
index 0000000..5d6988d
--- /dev/null
+++ b/starboard/shared/win32/socket_set_tcp_keep_alive.cc
@@ -0,0 +1,29 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+bool SbSocketSetTcpKeepAlive(SbSocket socket, bool value, SbTime period) {
+  const DWORD should_set_keepalive = value;
+  bool result = sbwin32::SetBooleanSocketOption(
+      socket, SOL_SOCKET, SO_KEEPALIVE, "SO_KEEPALIVE", value);
+  return result;
+}
diff --git a/starboard/shared/win32/socket_set_tcp_no_delay.cc b/starboard/shared/win32/socket_set_tcp_no_delay.cc
new file mode 100644
index 0000000..f6c3408
--- /dev/null
+++ b/starboard/shared/win32/socket_set_tcp_no_delay.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <winsock2.h>
+
+#include "starboard/shared/win32/socket_internal.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+bool SbSocketSetTcpNoDelay(SbSocket socket, bool value) {
+  return sbwin32::SetBooleanSocketOption(socket, IPPROTO_TCP, TCP_NODELAY,
+                                         "TCP_NODELAY", value);
+}
diff --git a/starboard/shared/win32/socket_set_tcp_window_scaling.cc b/starboard/shared/win32/socket_set_tcp_window_scaling.cc
new file mode 100644
index 0000000..0e73066
--- /dev/null
+++ b/starboard/shared/win32/socket_set_tcp_window_scaling.cc
@@ -0,0 +1,44 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/socket.h"
+
+#include <windows.h>
+#include <winsock2.h>
+
+// Note that windows.h and winsock2.h must be included before these.
+#include <mswsock.h>
+#include <sdkddkver.h>
+
+#include "starboard/shared/win32/socket_internal.h"
+
+bool SbSocketSetTcpWindowScaling(SbSocket socket, bool enable_window_scaling) {
+  // From
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/cc136103(v=vs.85).aspx:
+  // "When the TargetOsVersion member is set to a value for Windows Vista or
+  // later, receive window auto-tuning is enabled and the TCP window scale
+  // factor is reduced to 2 from the default value of 8."
+
+  const ULONG target_os_version =
+      enable_window_scaling ? NTDDI_VISTA : NTDDI_WS03;
+  WSA_COMPATIBILITY_MODE compatibility_mode = {WsaBehaviorAutoTuning,
+                                               target_os_version};
+
+  DWORD kZero = 0;
+  int return_value = WSAIoctl(
+      socket->socket_handle, SIO_SET_COMPATIBILITY_MODE, &compatibility_mode,
+      sizeof(WSA_COMPATIBILITY_MODE), nullptr, 0, &kZero, nullptr, nullptr);
+
+  return return_value != SOCKET_ERROR;
+}
diff --git a/starboard/shared/win32/socket_waiter_add.cc b/starboard/shared/win32/socket_waiter_add.cc
new file mode 100644
index 0000000..33cdf60
--- /dev/null
+++ b/starboard/shared/win32/socket_waiter_add.cc
@@ -0,0 +1,47 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/socket_waiter.h"
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/socket_waiter_internal.h"
+
+bool SbSocketWaiterAdd(SbSocketWaiter waiter,
+                       SbSocket socket,
+                       void* context,
+                       SbSocketWaiterCallback callback,
+                       int interests,
+                       bool persistent) {
+  if (!SbSocketWaiterIsValid(waiter)) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Waiter (" << waiter << ") is invalid.";
+    return false;
+  }
+
+  if (!SbSocketIsValid(socket)) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Socket (" << socket << ") is invalid.";
+    return false;
+  }
+
+  if (!callback) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": No callback provided.";
+    return false;
+  }
+
+  if (!interests) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": No interests provided.";
+    return false;
+  }
+
+  return waiter->Add(socket, context, callback, interests, persistent);
+}
diff --git a/starboard/shared/win32/socket_waiter_create.cc b/starboard/shared/win32/socket_waiter_create.cc
new file mode 100644
index 0000000..0b032f2
--- /dev/null
+++ b/starboard/shared/win32/socket_waiter_create.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/socket_waiter.h"
+
+#include "starboard/shared/win32/socket_waiter_internal.h"
+
+SbSocketWaiter SbSocketWaiterCreate() {
+  return new SbSocketWaiterPrivate();
+}
diff --git a/starboard/shared/win32/socket_waiter_destroy.cc b/starboard/shared/win32/socket_waiter_destroy.cc
new file mode 100644
index 0000000..22bab60
--- /dev/null
+++ b/starboard/shared/win32/socket_waiter_destroy.cc
@@ -0,0 +1,25 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/socket_waiter.h"
+
+#include "starboard/shared/win32/socket_waiter_internal.h"
+
+bool SbSocketWaiterDestroy(SbSocketWaiter waiter) {
+  if (!SbSocketWaiterIsValid(waiter)) {
+    return false;
+  }
+  delete waiter;
+  return true;
+}
diff --git a/starboard/shared/win32/socket_waiter_internal.cc b/starboard/shared/win32/socket_waiter_internal.cc
new file mode 100644
index 0000000..6f80d95
--- /dev/null
+++ b/starboard/shared/win32/socket_waiter_internal.cc
@@ -0,0 +1,489 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/socket_waiter_internal.h"
+
+#include <windows.h>
+
+#include <algorithm>
+
+#include "starboard/common/log.h"
+#include "starboard/common/optional.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/socket_internal.h"
+#include "starboard/shared/win32/thread_private.h"
+#include "starboard/shared/win32/time_utils.h"
+#include "starboard/thread.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+namespace {
+
+// This is a helper function that takes data from |network_events|, and then
+// adds the bitwise ORs |interest_to_add| onto |interest_out|.
+// For more information, please see
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms741572(v=vs.85).aspx.
+void TranslateNetworkBitIntoInterests(const WSANETWORKEVENTS& network_events,
+                                      int bit_to_check,
+                                      SbSocketWaiterInterest interest_to_add,
+                                      SbSocketWaiterInterest* interests_out) {
+  SB_DCHECK(interests_out);
+
+  static_assert(
+      sizeof(SbSocketWaiterInterest) == sizeof(int),
+      "Assuming size of enum is size of int, due to the bitfield logic below.");
+
+  if (network_events.lNetworkEvents & (1 << bit_to_check)) {
+    *(reinterpret_cast<int*>(interests_out)) |=
+        static_cast<int>(interest_to_add);
+    const int error_code = network_events.iErrorCode[bit_to_check];
+    if (error_code != 0) {
+      SB_DLOG(ERROR) << "Error on network event " << bit_to_check << " "
+                     << sbwin32::Win32ErrorCode(error_code);
+    }
+  }
+}
+
+SbSocketWaiterInterest DiscoverNetworkEventInterests(SOCKET socket_handle) {
+  // Please take note that WSAEnumNetworkEvents below only works with
+  // WSAEventSelect.
+  SbSocketWaiterInterest interests = kSbSocketWaiterInterestNone;
+  WSANETWORKEVENTS network_events = {0};
+  int return_code =
+      WSAEnumNetworkEvents(socket_handle, nullptr, &network_events);
+  if (return_code == SOCKET_ERROR) {
+    int last_error = WSAGetLastError();
+    SB_DLOG(ERROR) << "WSAEnumNetworkEvents failed with last_error = "
+                   << sbwin32::Win32ErrorCode(last_error);
+    return interests;
+  }
+
+  // Translate information from WSAEnumNetworkEvents to interests:
+  // From the MSDN documentation:
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/ms741572(v=vs.85).aspx
+  // The lNetworkEvents member of the WSANETWORKEVENTS structure indicates which
+  // of the FD_XXX network events have occurred. The iErrorCode array is used to
+  // contain any associated error codes with the array index corresponding to
+  // the position of event bits in lNetworkEvents. Identifiers such as
+  // FD_READ_BIT and FD_WRITE_BIT can be used to index the iErrorCode array.
+  // Note that only those elements of the iErrorCode array are set that
+  // correspond to the bits set in lNetworkEvents parameter
+  TranslateNetworkBitIntoInterests(network_events, FD_READ_BIT,
+                                   kSbSocketWaiterInterestRead, &interests);
+  TranslateNetworkBitIntoInterests(network_events, FD_ACCEPT_BIT,
+                                   kSbSocketWaiterInterestRead, &interests);
+  TranslateNetworkBitIntoInterests(network_events, FD_CLOSE_BIT,
+                                   kSbSocketWaiterInterestRead, &interests);
+
+  TranslateNetworkBitIntoInterests(network_events, FD_CONNECT_BIT,
+                                   kSbSocketWaiterInterestWrite, &interests);
+  TranslateNetworkBitIntoInterests(network_events, FD_WRITE_BIT,
+                                   kSbSocketWaiterInterestWrite, &interests);
+
+  return interests;
+}
+
+// The function erases the |index|th element from the collection by swapping
+// it with the last element.  This operation leaves all the other elements in
+// place, which is useful for some operations.
+template <typename T>
+void EraseIndexFromVector(T* collection_pointer, std::size_t index) {
+  SB_DCHECK(collection_pointer);
+  T& collection = *collection_pointer;
+  const std::size_t current_size = collection.size();
+  if (current_size <= 1) {
+    collection.clear();
+    return;
+  }
+  const std::size_t new_size = collection.size() - 1;
+  std::swap(collection[index], collection[new_size]);
+  collection.resize(new_size);
+}
+
+SbSocketWaiterInterest CombineInterests(
+    SbSocketWaiterInterest a, SbSocketWaiterInterest b) {
+  int a_int = static_cast<int>(a);
+  int b_int = static_cast<int>(b);
+  return static_cast<SbSocketWaiterInterest>(a_int | b_int);
+}
+
+}  // namespace
+
+SbSocketWaiterPrivate::SbSocketWaiterPrivate()
+    : thread_(SbThreadGetCurrent()),
+      wakeup_event_token_(-1),
+      wakeup_event_(CreateEvent(nullptr, false, false, nullptr)) {
+  {
+    starboard::ScopedLock lock(unhandled_wakeup_count_mutex_);
+    unhandled_wakeup_count_ = 0;
+  }
+  if (wakeup_event_.IsValid() == false) {
+    SB_DLOG(ERROR) << "Could not create wakeup event: "
+                   << starboard::shared::win32::Win32ErrorCode(GetLastError());
+    return;
+  }
+  wakeup_event_token_ =
+      waitees_.AddSocketEventAndWaitee(wakeup_event_.GetEvent(), nullptr);
+}
+
+SbSocketWaiterPrivate::~SbSocketWaiterPrivate() {
+  for (auto& it : waitees_.GetWaitees()) {
+    if (it) {
+      SB_DCHECK(CheckSocketWaiterIsThis(it->socket));
+    }
+  }
+}
+
+bool SbSocketWaiterPrivate::Add(SbSocket socket,
+                                void* context,
+                                SbSocketWaiterCallback callback,
+                                int interests,
+                                bool persistent) {
+  SB_DCHECK(SbThreadIsCurrent(thread_));
+
+  if (!SbSocketIsValid(socket)) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Socket (" << socket << ") is invalid.";
+    return false;
+  }
+
+  if (!interests) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": No interests provided.";
+    return false;
+  }
+
+  // The policy is not to add a socket to a waiter if it is registered with
+  // another waiter.
+
+  // TODO: If anyone were to want to add a socket to a different waiter,
+  // it would probably be another thread, so doing this check without locking is
+  // probably wrong. But, it is also a pain, and, at this precise moment, socket
+  // access is all going to come from one I/O thread anyway, and there will only
+  // be one waiter.
+  if (SbSocketWaiterIsValid(socket->waiter)) {
+    if (socket->waiter == this) {
+      SB_DLOG(ERROR) << __FUNCTION__ << ": Socket already has this waiter ("
+                     << this << ").";
+    } else {
+      SB_DLOG(ERROR) << __FUNCTION__ << ": Socket already has waiter ("
+                     << socket->waiter << ", this=" << this << ").";
+    }
+    return false;
+  }
+
+  int network_event_interests = 0;
+  if (interests & kSbSocketWaiterInterestRead) {
+    network_event_interests |= FD_READ | FD_ACCEPT | FD_CLOSE;
+  }
+
+  if (interests & kSbSocketWaiterInterestWrite) {
+    network_event_interests |= FD_CONNECT | FD_WRITE;
+  }
+
+  const BOOL manual_reset = !persistent;
+
+  SB_DCHECK(!socket->socket_event.IsValid());
+
+  socket->socket_event.Reset(
+      CreateEvent(nullptr, manual_reset, false, nullptr));
+  if (socket->socket_event.GetEvent() == WSA_INVALID_EVENT) {
+    int last_error = WSAGetLastError();
+    SB_DLOG(ERROR) << "Error calling WSACreateEvent() last_error = "
+                   << sbwin32::Win32ErrorCode(last_error);
+    return false;
+  }
+
+  // Note that WSAEnumNetworkEvents used elsewhere only works with
+  // WSAEventSelect.
+  // Please consider that before changing this code.
+  int return_value =
+      WSAEventSelect(socket->socket_handle, socket->socket_event.GetEvent(),
+                     network_event_interests);
+
+  if (return_value == SOCKET_ERROR) {
+    int last_error = WSAGetLastError();
+    SB_DLOG(ERROR) << "Error calling WSAEventSelect() last_error = "
+                   << sbwin32::Win32ErrorCode(last_error);
+    return false;
+  }
+
+  if (waitees_.GetHandleArraySize() >= MAXIMUM_WAIT_OBJECTS) {
+    SB_DLOG(ERROR) << "Reached maxed number of socket events ("
+                   << MAXIMUM_WAIT_OBJECTS << ")";
+    return false;
+  }
+
+  std::unique_ptr<Waitee> waitee(
+      new Waitee(this, socket, context, callback, interests, persistent));
+  waitees_.AddSocketEventAndWaitee(socket->socket_event.GetEvent(),
+                                   std::move(waitee));
+  socket->waiter = this;
+
+  return true;
+}
+
+bool SbSocketWaiterPrivate::Remove(SbSocket socket) {
+  SB_DCHECK(SbThreadIsCurrent(thread_));
+
+  if (!CheckSocketWaiterIsThis(socket)) {
+    return false;
+  }
+
+  socket->waiter = kSbSocketWaiterInvalid;
+
+  socket->socket_event.Reset(nullptr);
+  return waitees_.RemoveSocket(socket);
+}
+
+void SbSocketWaiterPrivate::HandleWakeUpRead() {
+  SB_LOG(INFO) << "HandleWakeUpRead incrementing counter..";
+  starboard::ScopedLock lock(unhandled_wakeup_count_mutex_);
+  ++unhandled_wakeup_count_;
+}
+
+void SbSocketWaiterPrivate::SignalWakeupEvent() {
+  SB_DCHECK(wakeup_event_.IsValid());
+  WSASetEvent(wakeup_event_.GetEvent());
+}
+
+void SbSocketWaiterPrivate::ResetWakeupEvent() {
+  SB_DCHECK(wakeup_event_.IsValid());
+  WSAResetEvent(wakeup_event_.GetEvent());
+}
+
+bool SbSocketWaiterPrivate::CheckSocketWaiterIsThis(SbSocket socket) {
+  if (!SbSocketIsValid(socket)) {
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Socket (" << socket << ") is invalid.";
+    return false;
+  }
+
+  if (socket->waiter != this) {
+    return false;
+  }
+
+  return true;
+}
+
+void SbSocketWaiterPrivate::Wait() {
+  SB_DCHECK(SbThreadIsCurrent(thread_));
+
+  // We basically wait for the largest amount of time to achieve an indefinite
+  // block.
+  WaitTimed(kSbTimeMax);
+}
+
+SbSocketWaiterResult SbSocketWaiterPrivate::WaitTimed(SbTime duration) {
+  SB_DCHECK(SbThreadIsCurrent(thread_));
+
+  const SbTimeMonotonic start_time = SbTimeGetMonotonicNow();
+  int64_t duration_left = duration;
+
+  while (true) {
+    // |waitees_| could have been modified in the last loop iteration, so
+    // re-read it.
+    const DWORD number_events =
+        static_cast<DWORD>(waitees_.GetHandleArraySize());
+
+    const DWORD millis = sbwin32::ConvertSbTimeToMillisRoundUp(duration_left);
+
+    {
+      starboard::ScopedLock lock(unhandled_wakeup_count_mutex_);
+      if (unhandled_wakeup_count_ > 0) {
+        --unhandled_wakeup_count_;
+        // The signaling thread also set the event, so reset it.
+        ResetWakeupEvent();
+        return kSbSocketWaiterResultWokenUp;
+      }
+    }
+
+    // There should always be a wakeup event.
+    SB_DCHECK(number_events > 0);
+
+    SbSocket maybe_writable_socket = kSbSocketInvalid;
+    for (auto& it : waitees_.GetWaitees()) {
+      if (!it) {
+        continue;
+      }
+      if ((it->interests & kSbSocketWaiterInterestWrite) == 0) {
+        continue;
+      }
+      if (it->socket->writable.load()) {
+        maybe_writable_socket = it->socket;
+        break;
+      }
+    }
+
+    bool has_writable = (maybe_writable_socket != kSbSocketInvalid);
+    DWORD return_value = WSAWaitForMultipleEvents(
+        number_events, waitees_.GetHandleArray(),
+        false, has_writable ? 0 : millis, false);
+
+    if (has_writable || ((return_value >= WSA_WAIT_EVENT_0) &&
+        (return_value < (WSA_WAIT_EVENT_0 + number_events)))) {
+      int64_t socket_index;
+      if (has_writable) {
+        socket_index = waitees_.GetIndex(maybe_writable_socket).value();
+      } else {
+        socket_index = static_cast<int64_t>(return_value) -
+                       static_cast<int64_t>(WSA_WAIT_EVENT_0);
+      }
+      SB_DCHECK(socket_index >= 0);
+      if (socket_index < 0) {
+        SB_NOTREACHED() << "Bad socket_index. " << socket_index;
+        return kSbSocketWaiterResultTimedOut;
+      }
+
+      // Make sure wakeup_event_token_ is initialized.
+      SB_DCHECK(wakeup_event_token_ >= 0);
+
+      if (socket_index == wakeup_event_token_) {
+        starboard::ScopedLock lock(unhandled_wakeup_count_mutex_);
+        SB_DCHECK(unhandled_wakeup_count_ > 0);
+
+        --unhandled_wakeup_count_;
+        // This was a dummy event.  We were woken up.
+        // Note that we do not need to reset the event here,
+        // since it was created using an auto-reset flag.
+        return kSbSocketWaiterResultWokenUp;
+      } else {
+        Waitee* waitee = waitees_.GetWaiteeByIndex(socket_index);
+
+        // Remove the non-persistent waitee before calling the callback, so
+        // that we can add another waitee in the callback if we need to. This
+        // is also why we copy all the fields we need out of waitee.
+        const SbSocket socket = waitee->socket;
+        const SbSocketWaiterCallback callback = waitee->callback;
+        void* context = waitee->context;
+
+        // Note: this should also go before Remove().
+        SbSocketWaiterInterest interests =
+            DiscoverNetworkEventInterests(socket->socket_handle);
+
+        if ((waitee->interests & kSbSocketWaiterInterestWrite) &&
+              socket->writable.load()) {
+          interests = CombineInterests(interests, kSbSocketWaiterInterestWrite);
+        } else if (interests & kSbSocketWaiterInterestWrite) {
+          socket->writable.store(true);
+        }
+
+        if (!waitee->persistent) {
+          Remove(waitee->socket);
+        }
+
+        callback(this, socket, context, interests);
+      }
+    } else if (return_value == WSA_WAIT_FAILED) {
+      SB_DLOG(ERROR) << "Wait failed -- "
+                     << sbwin32::Win32ErrorCode(WSAGetLastError());
+      return kSbSocketWaiterResultInvalid;
+    } else if (return_value == WSA_WAIT_TIMEOUT) {
+      // Do nothing, check time ourselves.
+    } else {
+      SB_NOTREACHED() << "Unhandled case: " << return_value;
+      return kSbSocketWaiterResultInvalid;
+    }
+
+    const int64_t time_elapsed =
+        static_cast<std::int64_t>(SbTimeGetMonotonicNow()) -
+        static_cast<std::int64_t>(start_time);
+    duration_left -= time_elapsed;
+    if (duration_left < 0) {
+      return kSbSocketWaiterResultTimedOut;
+    }
+  }
+
+  SB_NOTREACHED() << "Invalid state reached";
+  return kSbSocketWaiterResultInvalid;
+}
+
+void SbSocketWaiterPrivate::WakeUp() {
+  // Increasing unhandled_wakeup_count_mutex_ and calling SignalWakeupEvent
+  // atomically helps add additional guarantees of when the waiter can be
+  // woken up.  While we can code around this easily, having a stronger
+  // coupling enables us to add DCHECKs for |unhandled_wakeup_count_| in other
+  // parts of the code.
+  starboard::ScopedLock lock(unhandled_wakeup_count_mutex_);
+  ++unhandled_wakeup_count_;
+  SignalWakeupEvent();
+}
+
+SbSocketWaiterPrivate::Waitee* SbSocketWaiterPrivate::WaiteeRegistry::GetWaitee(
+    SbSocket socket) {
+  starboard::optional<int64_t> token = GetIndex(socket);
+  if (!token) {
+    return nullptr;
+  }
+  return waitees_[token.value()].get();
+}
+
+starboard::optional<int64_t>
+SbSocketWaiterPrivate::WaiteeRegistry::GetIndex(SbSocket socket) {
+  auto iterator = socket_to_index_map_.find(socket);
+  if (iterator == socket_to_index_map_.end()) {
+    return starboard::nullopt;
+  }
+  return iterator->second;
+}
+
+SbSocketWaiterPrivate::WaiteeRegistry::LookupToken
+SbSocketWaiterPrivate::WaiteeRegistry::AddSocketEventAndWaitee(
+    WSAEVENT socket_event,
+    std::unique_ptr<Waitee> waitee) {
+  SB_DCHECK(socket_event != WSA_INVALID_EVENT);
+  SB_DCHECK(socket_events_.size() == waitees_.size());
+  SbSocket socket = kSbSocketInvalid;
+  if (waitee) {
+    socket = waitee->socket;
+  }
+  socket_to_index_map_.emplace(socket, socket_events_.size());
+  socket_events_.emplace_back(socket_event);
+  waitees_.emplace_back(std::move(waitee));
+
+  return socket_events_.size() - 1;
+}
+
+bool SbSocketWaiterPrivate::WaiteeRegistry::RemoveSocket(SbSocket socket) {
+  auto iterator = socket_to_index_map_.find(socket);
+  if (iterator == socket_to_index_map_.end()) {
+    return false;
+  }
+
+  const std::size_t current_size = socket_events_.size();
+  SB_DCHECK(current_size == waitees_.size());
+
+  const std::size_t socket_index = iterator->second;
+  SbSocket socket_to_swap = waitees_[current_size - 1]->socket;
+
+  // Since |EraseIndexFromVector| will swap the last socket and the socket
+  // at current index, |socket_to_index_| will need to be updated.
+  socket_to_index_map_[socket_to_swap] = socket_index;
+  // Note that |EraseIndexFromVector| only touches the last element and the
+  // element to remove.
+  EraseIndexFromVector(&socket_events_, socket_index);
+  EraseIndexFromVector(&waitees_, socket_index);
+
+  socket_to_index_map_.erase(socket);
+
+  SB_DCHECK(socket_events_.size() == waitees_.size());
+  SB_DCHECK(socket_events_.size() == socket_to_index_map_.size());
+  return true;
+}
+
+SbSocketWaiterPrivate::Waitee*
+SbSocketWaiterPrivate::WaiteeRegistry::GetWaiteeByIndex(
+    const SbSocketWaiterPrivate::WaiteeRegistry::LookupToken socket_index) {
+  SB_DCHECK(socket_index >= 0);
+
+  SB_DCHECK(static_cast<std::size_t>(socket_index) <= socket_events_.size());
+  return waitees_[socket_index].get();
+}
diff --git a/starboard/shared/win32/socket_waiter_internal.h b/starboard/shared/win32/socket_waiter_internal.h
new file mode 100644
index 0000000..0420e86
--- /dev/null
+++ b/starboard/shared/win32/socket_waiter_internal.h
@@ -0,0 +1,149 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_SOCKET_WAITER_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_SOCKET_WAITER_INTERNAL_H_
+
+#include <windows.h>
+#include <winsock2.h>
+
+#include <deque>
+#include <memory>
+#include <unordered_map>
+#include <vector>
+
+#include "starboard/common/mutex.h"
+#include "starboard/common/optional.h"
+#include "starboard/common/socket.h"
+#include "starboard/shared/internal_only.h"
+#include "starboard/shared/win32/auto_event_handle.h"
+#include "starboard/shared/win32/socket_internal.h"
+#include "starboard/socket_waiter.h"
+#include "starboard/thread.h"
+#include "starboard/types.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+#pragma warning(push)
+
+// SbSocketWaiterPrivate is defined as a struct, but for windows implementation
+// enough functionality has been added so that it warrants being a class
+// per Google's C++ style guide.  This mismatch causes the Microsoft's compiler
+// to generate a warning.
+#pragma warning(disable : 4099)
+class SbSocketWaiterPrivate {
+ public:
+  SbSocketWaiterPrivate();
+  ~SbSocketWaiterPrivate();
+
+  // These methods implement the SbSocketWaiter API defined in socket_waiter.h.
+  bool Add(SbSocket socket,
+           void* context,
+           SbSocketWaiterCallback callback,
+           int interests,
+           bool persistent);
+  bool Remove(SbSocket socket);
+  void Wait();
+  SbSocketWaiterResult WaitTimed(SbTime duration);
+  void WakeUp();
+  void HandleWakeUpRead();
+
+ private:
+  // A registration of a socket with a socket waiter.
+  struct Waitee {
+    Waitee(SbSocketWaiter waiter,
+           SbSocket socket,
+           void* context,
+           SbSocketWaiterCallback callback,
+           int interests,
+           bool persistent)
+        : waiter(waiter),
+          socket(socket),
+          context(context),
+          callback(callback),
+          interests(interests),
+          persistent(persistent) {}
+    // The waiter this event is registered with.
+    SbSocketWaiter waiter;
+
+    // The socket registered with the waiter.
+    SbSocket socket;
+
+    // A context value that will be passed to the callback.
+    void* context;
+
+    // The callback to call when one or more registered interests become ready.
+    SbSocketWaiterCallback callback;
+
+    // The set of interests registered with the waiter.
+    int interests;
+
+    // Whether this Waitee should stay registered after the next callback.
+    bool persistent;
+  };
+
+  class WaiteeRegistry {
+   public:
+    typedef int64_t LookupToken;
+    typedef std::deque<std::unique_ptr<Waitee>> Waitees;
+    typedef std::unordered_map<SbSocket, std::size_t> SocketToIndex;
+
+    WSAEVENT* GetHandleArray() { return socket_events_.data(); }
+    std::size_t GetHandleArraySize() { return socket_events_.size(); }
+    const Waitees& GetWaitees() const { return waitees_; }
+
+    // Gets the Waitee associated with the given socket, or nullptr.
+    Waitee* GetWaitee(SbSocket socket);
+
+    // Gets the index by socket
+    starboard::optional<int64_t> GetIndex(SbSocket socket);
+
+    // Gets the Waitee by index.
+    Waitee* GetWaiteeByIndex(LookupToken socket_index);
+
+    // Returns the index of the event.
+    LookupToken AddSocketEventAndWaitee(WSAEVENT socket_event,
+                                        std::unique_ptr<Waitee> waitee);
+    // Returns true if socket was found, and removed.
+    bool RemoveSocket(SbSocket socket);
+
+   private:
+    SocketToIndex socket_to_index_map_;
+    std::vector<WSAEVENT> socket_events_;
+    std::deque<std::unique_ptr<Waitee>> waitees_;
+  };
+
+  void SignalWakeupEvent();
+  void ResetWakeupEvent();
+
+  bool CheckSocketWaiterIsThis(SbSocket socket);
+
+  // The thread this waiter was created on. Immutable, so accessible from any
+  // thread.
+  const SbThread thread_;
+
+  // The registry of currently registered Waitees.
+  WaiteeRegistry waitees_;
+  WaiteeRegistry::LookupToken wakeup_event_token_;
+
+  // This mutex covers the next two variables.
+  starboard::Mutex unhandled_wakeup_count_mutex_;
+  // Number of times wake up has been called, and not handled.
+  std::int32_t unhandled_wakeup_count_;
+  // The WSAEvent that is set by Wakeup();
+  sbwin32::AutoEventHandle wakeup_event_;
+};
+#pragma warning(pop)
+
+#endif  // STARBOARD_SHARED_WIN32_SOCKET_WAITER_INTERNAL_H_
diff --git a/starboard/shared/win32/socket_waiter_remove.cc b/starboard/shared/win32/socket_waiter_remove.cc
new file mode 100644
index 0000000..5f8e2fa
--- /dev/null
+++ b/starboard/shared/win32/socket_waiter_remove.cc
@@ -0,0 +1,25 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/socket_waiter.h"
+
+#include "starboard/shared/win32/socket_waiter_internal.h"
+
+bool SbSocketWaiterRemove(SbSocketWaiter waiter, SbSocket socket) {
+  if (!SbSocketWaiterIsValid(waiter)) {
+    return false;
+  }
+
+  return waiter->Remove(socket);
+}
diff --git a/starboard/shared/win32/socket_waiter_wait.cc b/starboard/shared/win32/socket_waiter_wait.cc
new file mode 100644
index 0000000..c46052a
--- /dev/null
+++ b/starboard/shared/win32/socket_waiter_wait.cc
@@ -0,0 +1,25 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/socket_waiter.h"
+
+#include "starboard/shared/win32/socket_waiter_internal.h"
+
+void SbSocketWaiterWait(SbSocketWaiter waiter) {
+  if (!SbSocketWaiterIsValid(waiter)) {
+    return;
+  }
+
+  waiter->Wait();
+}
diff --git a/starboard/shared/win32/socket_waiter_wait_timed.cc b/starboard/shared/win32/socket_waiter_wait_timed.cc
new file mode 100644
index 0000000..30bd455
--- /dev/null
+++ b/starboard/shared/win32/socket_waiter_wait_timed.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/socket_waiter.h"
+
+#include "starboard/shared/win32/socket_waiter_internal.h"
+
+SbSocketWaiterResult SbSocketWaiterWaitTimed(SbSocketWaiter waiter,
+                                             SbTime duration) {
+  if (!SbSocketWaiterIsValid(waiter)) {
+    return kSbSocketWaiterResultInvalid;
+  }
+
+  return waiter->WaitTimed(duration);
+}
diff --git a/starboard/shared/win32/socket_waiter_wake_up.cc b/starboard/shared/win32/socket_waiter_wake_up.cc
new file mode 100644
index 0000000..06c13cf
--- /dev/null
+++ b/starboard/shared/win32/socket_waiter_wake_up.cc
@@ -0,0 +1,25 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/socket_waiter.h"
+
+#include "starboard/shared/win32/socket_waiter_internal.h"
+
+void SbSocketWaiterWakeUp(SbSocketWaiter waiter) {
+  if (!SbSocketWaiterIsValid(waiter)) {
+    return;
+  }
+
+  waiter->WakeUp();
+}
diff --git a/starboard/shared/win32/starboard_main.cc b/starboard/shared/win32/starboard_main.cc
new file mode 100644
index 0000000..d03f5a8
--- /dev/null
+++ b/starboard/shared/win32/starboard_main.cc
@@ -0,0 +1,84 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/starboard_main.h"
+
+#include <Objbase.h>
+#include <WinSock2.h>
+#include <mfapi.h>
+#include <windows.h>
+
+#include <cstdio>
+#include <cstdlib>
+#include <string>
+
+#include "starboard/common/string.h"
+#include "starboard/shared/starboard/audio_sink/audio_sink_internal.h"
+#include "starboard/shared/starboard/command_line.h"
+#include "starboard/shared/starboard/net_log.h"
+#include "starboard/shared/win32/application_win32.h"
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::starboard::CommandLine;
+using starboard::shared::starboard::kNetLogCommandSwitchWait;
+using starboard::shared::starboard::NetLogFlushThenClose;
+using starboard::shared::starboard::NetLogWaitForClientConnected;
+using starboard::shared::win32::ApplicationWin32;
+
+namespace {
+
+void WaitForNetLogIfNecessary(const CommandLine& cmd_line) {
+  if (cmd_line.HasSwitch(kNetLogCommandSwitchWait)) {
+    SbTime timeout = kSbTimeSecond * 2;
+    std::string val = cmd_line.GetSwitchValue(kNetLogCommandSwitchWait);
+    if (!val.empty()) {
+      timeout = atoi(val.c_str());
+    }
+    NetLogWaitForClientConnected(timeout);
+  }
+}
+
+}  // namespace.
+
+extern "C" int StarboardMain(int argc, char** argv) {
+  WSAData wsaData;
+  const int kWinSockVersionMajor = 2;
+  const int kWinSockVersionMinor = 2;
+  const int init_result = WSAStartup(
+      MAKEWORD(kWinSockVersionMajor, kWinSockVersionMajor), &wsaData);
+
+  SB_CHECK(init_result == 0);
+  // WSAStartup returns the highest version that is supported up to the version
+  // we request.
+  SB_CHECK(LOBYTE(wsaData.wVersion) == kWinSockVersionMajor &&
+           HIBYTE(wsaData.wVersion) == kWinSockVersionMinor);
+
+  // Initialize COM for XAudio2 APIs.
+  CoInitialize(nullptr);
+  SbAudioSinkPrivate::Initialize();
+  starboard::shared::win32::RegisterMainThread();
+  // TODO: Do this with SbOnce when media is first used instead.
+  HRESULT hr = MFStartup(MF_VERSION);
+  SB_DCHECK(SUCCEEDED(hr));
+
+  WaitForNetLogIfNecessary(CommandLine(argc, argv));
+  ApplicationWin32 application;
+  // This will run the message loop.
+  const int main_return_value = application.Run(argc, argv);
+  NetLogFlushThenClose();
+
+  MFShutdown();
+  WSACleanup();
+  return main_return_value;
+}
diff --git a/starboard/shared/win32/starboard_main.h b/starboard/shared/win32/starboard_main.h
new file mode 100644
index 0000000..60cff15
--- /dev/null
+++ b/starboard/shared/win32/starboard_main.h
@@ -0,0 +1,22 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_STARBOARD_MAIN_H_
+#define STARBOARD_SHARED_WIN32_STARBOARD_MAIN_H_
+
+#include "starboard/export.h"
+
+extern "C" SB_EXPORT_PLATFORM int StarboardMain(int argc, char** argv);
+
+#endif  // STARBOARD_SHARED_WIN32_STARBOARD_MAIN_H_
diff --git a/starboard/shared/win32/storage_write_record.cc b/starboard/shared/win32/storage_write_record.cc
new file mode 100644
index 0000000..5ccabdd
--- /dev/null
+++ b/starboard/shared/win32/storage_write_record.cc
@@ -0,0 +1,105 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/storage.h"
+
+#include <windows.h>
+
+#include <algorithm>
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/file.h"
+#include "starboard/shared/starboard/file_storage/storage_internal.h"
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+const char kTempFileSuffix[] = ".temp";
+
+bool SbStorageWriteRecord(SbStorageRecord record,
+                          const char* data,
+                          int64_t data_size) {
+  if (!SbStorageIsValidRecord(record) || !data || data_size < 0) {
+    return false;
+  }
+
+  const char* name = record->name.c_str();
+  std::vector<char> original_file_path(kSbFileMaxPath);
+  if (!starboard::shared::starboard::GetUserStorageFilePath(
+          record->user, name, original_file_path.data(), kSbFileMaxPath)) {
+    return false;
+  }
+
+  std::vector<char> temp_file_path(kSbFileMaxPath + 1, 0);
+  starboard::strlcpy(temp_file_path.data(), original_file_path.data(),
+                     kSbFileMaxPath);
+  starboard::strlcat(temp_file_path.data(), kTempFileSuffix, kSbFileMaxPath);
+
+  SbFileError error;
+  SbFile temp_file = SbFileOpen(
+      temp_file_path.data(), kSbFileCreateAlways | kSbFileWrite | kSbFileRead,
+      NULL, &error);
+  if (error != kSbFileOk) {
+    return false;
+  }
+
+  SbFileTruncate(temp_file, 0);
+
+  const char* source = data;
+  int64_t to_write = data_size;
+  while (to_write > 0) {
+    int to_write_max =
+        static_cast<int>(std::min(to_write, static_cast<int64_t>(kSbInt32Max)));
+    int bytes_written = SbFileWrite(temp_file, source, to_write_max);
+    if (bytes_written < 0) {
+      SbFileClose(temp_file);
+      SbFileDelete(temp_file_path.data());
+      return false;
+    }
+
+    source += bytes_written;
+    to_write -= bytes_written;
+  }
+
+  SbFileFlush(temp_file);
+
+  if (SbFileIsValid(record->file) && !SbFileClose(record->file)) {
+    return false;
+  }
+
+  record->file = kSbFileInvalid;
+
+  if (!SbFileClose(temp_file)) {
+    return false;
+  }
+
+  std::wstring original_path_wstring =
+      starboard::shared::win32::NormalizeWin32Path(
+          starboard::shared::win32::CStringToWString(
+              original_file_path.data()));
+  std::wstring temp_path_wstring = starboard::shared::win32::NormalizeWin32Path(
+      starboard::shared::win32::CStringToWString(temp_file_path.data()));
+  if (ReplaceFileW(original_path_wstring.c_str(), temp_path_wstring.c_str(),
+                   NULL, 0, NULL, NULL) == 0) {
+    return false;
+  }
+  SbFile new_record_file =
+      SbFileOpen(original_file_path.data(),
+                 kSbFileOpenOnly | kSbFileWrite | kSbFileRead, NULL, NULL);
+  record->file = new_record_file;
+
+  return true;
+}
diff --git a/starboard/shared/win32/string_compare_no_case.cc b/starboard/shared/win32/string_compare_no_case.cc
new file mode 100644
index 0000000..c3e0866
--- /dev/null
+++ b/starboard/shared/win32/string_compare_no_case.cc
@@ -0,0 +1,22 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/string.h"
+
+#include <string.h>
+
+int SbStringCompareNoCase(const char* string1, const char* string2) {
+  return _stricmp(string1, string2);
+}
+
diff --git a/starboard/shared/win32/string_compare_no_case_n.cc b/starboard/shared/win32/string_compare_no_case_n.cc
new file mode 100644
index 0000000..5c3c688
--- /dev/null
+++ b/starboard/shared/win32/string_compare_no_case_n.cc
@@ -0,0 +1,23 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/string.h"
+
+#include <string.h>
+
+int SbStringCompareNoCaseN(const char* string1,
+  const char* string2, size_t count) {
+  return _strnicmp(string1, string2, count);
+}
+
diff --git a/starboard/shared/win32/string_compare_wide.cc b/starboard/shared/win32/string_compare_wide.cc
new file mode 100644
index 0000000..45fb8bc
--- /dev/null
+++ b/starboard/shared/win32/string_compare_wide.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/string.h"
+
+#include <string.h>
+
+#if SB_API_VERSION < 13
+
+int SbStringCompareWide(const wchar_t* string1, const wchar_t* string2,
+                        size_t count) {
+  return wcsncmp(string1, string2, count);
+}
+
+#endif  // SB_API_VERSION < 13
diff --git a/starboard/shared/win32/string_format.cc b/starboard/shared/win32/string_format.cc
new file mode 100644
index 0000000..d4dd55b
--- /dev/null
+++ b/starboard/shared/win32/string_format.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/string.h"
+
+#include <stdio.h>
+
+int SbStringFormat(char* out_buffer,
+                   size_t buffer_size,
+                   const char* format,
+                   va_list arguments) {
+  return vsnprintf(out_buffer, buffer_size, format, arguments);
+}
diff --git a/starboard/shared/win32/string_format_wide.cc b/starboard/shared/win32/string_format_wide.cc
new file mode 100644
index 0000000..852f65b
--- /dev/null
+++ b/starboard/shared/win32/string_format_wide.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/string.h"
+
+#include <stdio.h>
+
+int SbStringFormatWide(wchar_t* out_buffer,
+                       size_t buffer_size,
+                       const wchar_t* format,
+                       va_list arguments) {
+  return _vsnwprintf(out_buffer, buffer_size, format, arguments);
+}
diff --git a/starboard/shared/win32/system_break_into_debugger.cc b/starboard/shared/win32/system_break_into_debugger.cc
new file mode 100644
index 0000000..ba66e70
--- /dev/null
+++ b/starboard/shared/win32/system_break_into_debugger.cc
@@ -0,0 +1,27 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <intrin.h>
+
+#include "starboard/shared/starboard/net_log.h"
+
+void SbSystemBreakIntoDebugger() {
+  // Note: neither DebugBreak() nor ExitProcess() are valid
+  // on some Windows platforms (eg UWP) so we use __debugbreak()
+  // instead.
+  starboard::shared::starboard::NetLogFlush();
+  __debugbreak();
+}
diff --git a/starboard/shared/win32/system_clear_last_error.cc b/starboard/shared/win32/system_clear_last_error.cc
new file mode 100644
index 0000000..1105b3d
--- /dev/null
+++ b/starboard/shared/win32/system_clear_last_error.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <windows.h>
+
+void SbSystemClearLastError() {
+  SetLastError(0);
+}
diff --git a/starboard/shared/win32/system_get_connection_type.cc b/starboard/shared/win32/system_get_connection_type.cc
new file mode 100644
index 0000000..e474949
--- /dev/null
+++ b/starboard/shared/win32/system_get_connection_type.cc
@@ -0,0 +1,62 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <winsock2.h>
+
+#include <ifdef.h>
+#include <iphlpapi.h>
+
+#include "starboard/shared/win32/adapter_utils.h"
+
+namespace sbwin32 = ::starboard::shared::win32;
+
+namespace {
+// Return the connection type of the first "up" ethernet interface,
+// or unknown if none found.
+SbSystemConnectionType FindConnectionType(PIP_ADAPTER_ADDRESSES adapter) {
+  for (; adapter != nullptr; adapter = adapter->Next) {
+    if ((adapter->OperStatus != IfOperStatusUp) ||
+        !sbwin32::IsIfTypeEthernet(adapter->IfType)) {
+      continue;
+    }
+    // Some devices do not report IfType correctly.
+    // So, an extra attempt at determining if an interface is wireless is made.
+    if (adapter->IfType == IF_TYPE_IEEE80211 ||
+      (wcsstr(adapter->Description, L"WiFi") != nullptr)) {
+      return kSbSystemConnectionTypeWireless;
+    }
+    return kSbSystemConnectionTypeWired;
+  }
+  return kSbSystemConnectionTypeUnknown;
+}
+}  // namespace
+
+SbSystemConnectionType SbSystemGetConnectionType() {
+  std::unique_ptr<char[]> buffer;
+  if (!sbwin32::GetAdapters(kSbSocketAddressTypeIpv4, &buffer)) {
+      return kSbSystemConnectionTypeUnknown;
+  }
+  SbSystemConnectionType result = FindConnectionType(
+      reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.get()));
+  if (result != kSbSystemConnectionTypeUnknown) {
+    return result;
+  }
+  if (!sbwin32::GetAdapters(kSbSocketAddressTypeIpv6, &buffer)) {
+      return kSbSystemConnectionTypeUnknown;
+  }
+  return FindConnectionType(
+      reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.get()));
+}
diff --git a/starboard/shared/win32/system_get_device_type.cc b/starboard/shared/win32/system_get_device_type.cc
new file mode 100644
index 0000000..b03b42d
--- /dev/null
+++ b/starboard/shared/win32/system_get_device_type.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <string>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+SbSystemDeviceType SbSystemGetDeviceType() {
+  return kSbSystemDeviceTypeDesktopPC;
+}
diff --git a/starboard/shared/win32/system_get_error_string.cc b/starboard/shared/win32/system_get_error_string.cc
new file mode 100644
index 0000000..b59e1aa
--- /dev/null
+++ b/starboard/shared/win32/system_get_error_string.cc
@@ -0,0 +1,31 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <sstream>
+
+#include "starboard/common/string.h"
+#include "starboard/shared/win32/error_utils.h"
+
+int SbSystemGetErrorString(SbSystemError error,
+                           char* out_string,
+                           int string_length) {
+  std::ostringstream out;
+  out << starboard::shared::win32::Win32ErrorCode(error);
+  if (out_string != nullptr) {
+    starboard::strlcpy(out_string, out.str().c_str(), string_length);
+  }
+  return static_cast<int>(out.str().size());
+}
diff --git a/starboard/shared/win32/system_get_extensions.cc b/starboard/shared/win32/system_get_extensions.cc
new file mode 100644
index 0000000..c428752
--- /dev/null
+++ b/starboard/shared/win32/system_get_extensions.cc
@@ -0,0 +1,31 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include "cobalt/extension/configuration.h"
+#include "cobalt/extension/graphics.h"
+#include "starboard/common/string.h"
+#include "starboard/shared/win32/configuration.h"
+#include "starboard/shared/win32/graphics.h"
+
+const void* SbSystemGetExtension(const char* name) {
+  if (strcmp(name, kCobaltExtensionGraphicsName) == 0) {
+    return starboard::shared::win32::GetGraphicsApi();
+  }
+  if (strcmp(name, kCobaltExtensionConfigurationName) == 0) {
+    return starboard::shared::win32::GetConfigurationApi();
+  }
+  return NULL;
+}
diff --git a/starboard/shared/win32/system_get_last_error.cc b/starboard/shared/win32/system_get_last_error.cc
new file mode 100644
index 0000000..f01b6aa
--- /dev/null
+++ b/starboard/shared/win32/system_get_last_error.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <windows.h>
+
+SbSystemError SbSystemGetLastError() {
+  return GetLastError();
+}
diff --git a/starboard/shared/win32/system_get_locale_id.cc b/starboard/shared/win32/system_get_locale_id.cc
new file mode 100644
index 0000000..c6a86ed
--- /dev/null
+++ b/starboard/shared/win32/system_get_locale_id.cc
@@ -0,0 +1,54 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <string>
+
+#include "starboard/common/log.h"
+#include "starboard/once.h"
+
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+using starboard::shared::win32::DebugLogWinError;
+using starboard::shared::win32::wchar_tToUTF8;
+
+namespace {
+class LocaleString {
+ public:
+  static LocaleString* Get();
+  const char* value() const { return value_.c_str(); }
+
+ private:
+  LocaleString() {
+    wchar_t name[LOCALE_NAME_MAX_LENGTH];
+    int result = GetUserDefaultLocaleName(name, LOCALE_NAME_MAX_LENGTH);
+    if (result != 0) {
+      value_ = wchar_tToUTF8(name);
+    } else {
+      SB_LOG(ERROR) << "Error retrieving GetUserDefaultLocaleName";
+      DebugLogWinError();
+      value_ ="en-US";
+    }
+  }
+  std::string value_;
+};
+
+SB_ONCE_INITIALIZE_FUNCTION(LocaleString, LocaleString::Get);
+}  // namespace
+
+const char* SbSystemGetLocaleId() {
+  return LocaleString::Get()->value();
+}
diff --git a/starboard/shared/win32/system_get_number_of_processors.cc b/starboard/shared/win32/system_get_number_of_processors.cc
new file mode 100644
index 0000000..b3b6486
--- /dev/null
+++ b/starboard/shared/win32/system_get_number_of_processors.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <windows.h>
+
+int SbSystemGetNumberOfProcessors() {
+  // Note that this returns the number of logical processors.
+  SYSTEM_INFO system_info = {0};
+  GetSystemInfo(&system_info);
+  return system_info.dwNumberOfProcessors;
+}
diff --git a/starboard/shared/win32/system_get_property.cc b/starboard/shared/win32/system_get_property.cc
new file mode 100644
index 0000000..8140ab3
--- /dev/null
+++ b/starboard/shared/win32/system_get_property.cc
@@ -0,0 +1,65 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/system.h"
+
+namespace {
+
+const char* kFriendlyName = "Windows Desktop";
+const char* kPlatformName = "win32; Windows x86_64";
+
+bool CopyStringAndTestIfSuccess(char* out_value,
+                                int value_length,
+                                const char* from_value) {
+  if (strlen(from_value) + 1 > value_length)
+    return false;
+  starboard::strlcpy(out_value, from_value, value_length);
+  return true;
+}
+
+}  // namespace
+
+bool SbSystemGetProperty(SbSystemPropertyId property_id,
+                         char* out_value,
+                         int value_length) {
+  if (!out_value || !value_length) {
+    return false;
+  }
+
+  switch (property_id) {
+    case kSbSystemPropertyBrandName:
+    case kSbSystemPropertyChipsetModelNumber:
+    case kSbSystemPropertyFirmwareVersion:
+    case kSbSystemPropertyModelName:
+    case kSbSystemPropertyModelYear:
+    case kSbSystemPropertySystemIntegratorName:
+    case kSbSystemPropertySpeechApiKey:
+      return false;
+
+    case kSbSystemPropertyFriendlyName:
+      return CopyStringAndTestIfSuccess(out_value, value_length, kFriendlyName);
+
+    case kSbSystemPropertyPlatformName:
+      return CopyStringAndTestIfSuccess(out_value, value_length, kPlatformName);
+
+    default:
+      SB_DLOG(WARNING) << __FUNCTION__
+                       << ": Unrecognized property: " << property_id;
+      break;
+  }
+
+  return false;
+}
diff --git a/starboard/shared/win32/system_get_random_data.cc b/starboard/shared/win32/system_get_random_data.cc
new file mode 100644
index 0000000..5bcb0ec
--- /dev/null
+++ b/starboard/shared/win32/system_get_random_data.cc
@@ -0,0 +1,42 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <windows.h>
+
+// This must be included after windows.h
+#include <bcrypt.h>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/error_utils.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+void SbSystemGetRandomData(void* out_buffer, int buffer_size) {
+  // Note: this might not be secure before Windows 10, as
+  // BCRYPT_RNG_DUAL_EC_ALGORITHM might be used.  See:
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/aa375534%28v=vs.85%29.aspx
+  // "Windows 10:  Beginning with Windows 10, the dual elliptic curve random
+  // number generator algorithm has been removed. Existing uses of this
+  // algorithm will continue to work; however, the random number generator is
+  // based on the AES counter mode specified in the NIST SP 800-90 standard. New
+  // code should use BCRYPT_RNG_ALGORITHM, and it is recommended that existing
+  // code be changed to use BCRYPT_RNG_ALGORITHM."
+  NTSTATUS status =
+      BCryptGenRandom(nullptr, reinterpret_cast<PUCHAR>(out_buffer),
+                      buffer_size, BCRYPT_USE_SYSTEM_PREFERRED_RNG);
+  SB_DCHECK(status == 0) << "Error while calling CryptGenRandom: "
+                         << sbwin32::Win32ErrorCode(GetLastError());
+}
diff --git a/starboard/shared/win32/system_get_random_uint64.cc b/starboard/shared/win32/system_get_random_uint64.cc
new file mode 100644
index 0000000..159d472
--- /dev/null
+++ b/starboard/shared/win32/system_get_random_uint64.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+uint64_t SbSystemGetRandomUInt64() {
+  uint64_t return_value = 0;
+  SbSystemGetRandomData(&return_value, sizeof(return_value));
+  return return_value;
+}
diff --git a/starboard/shared/win32/system_get_stack.cc b/starboard/shared/win32/system_get_stack.cc
new file mode 100644
index 0000000..9fa9f02
--- /dev/null
+++ b/starboard/shared/win32/system_get_stack.cc
@@ -0,0 +1,24 @@
+// Copyright 2016 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <Windows.h>
+
+__declspec(noinline) int SbSystemGetStack(void** out_stack, int stack_size) {
+  ULONG frames_to_skip = 1;
+  int num_captured = CaptureStackBackTrace(frames_to_skip, stack_size,
+                                           out_stack, nullptr);
+  return num_captured;
+}
diff --git a/starboard/shared/win32/system_get_total_cpu_memory.cc b/starboard/shared/win32/system_get_total_cpu_memory.cc
new file mode 100644
index 0000000..6dd4780
--- /dev/null
+++ b/starboard/shared/win32/system_get_total_cpu_memory.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <windows.h>
+
+int64_t SbSystemGetTotalCPUMemory() {
+  MEMORYSTATUSEX statex = {0};
+  statex.dwLength = sizeof(statex);
+  GlobalMemoryStatusEx(&statex);
+  return static_cast<int64_t>(statex.ullTotalPhys);
+}
diff --git a/starboard/shared/win32/system_get_used_cpu_memory.cc b/starboard/shared/win32/system_get_used_cpu_memory.cc
new file mode 100644
index 0000000..7376eaf
--- /dev/null
+++ b/starboard/shared/win32/system_get_used_cpu_memory.cc
@@ -0,0 +1,29 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+
+int64_t SbSystemGetUsedCPUMemory() {
+  MEMORYSTATUSEX statex = {0};
+  statex.dwLength = sizeof(statex);
+  GlobalMemoryStatusEx(&statex);
+  int64_t remaining_bytes = static_cast<int64_t>(statex.ullTotalPhys) -
+                            static_cast<int64_t>(statex.ullAvailPhys);
+  SB_DCHECK(remaining_bytes >= 0);
+  return remaining_bytes;
+}
diff --git a/starboard/shared/win32/system_is_debugger_attached.cc b/starboard/shared/win32/system_is_debugger_attached.cc
new file mode 100644
index 0000000..93403ad
--- /dev/null
+++ b/starboard/shared/win32/system_is_debugger_attached.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <windows.h>
+
+bool SbSystemIsDebuggerAttached() {
+  return IsDebuggerPresent();
+}
diff --git a/starboard/shared/win32/system_raise_platform_error.cc b/starboard/shared/win32/system_raise_platform_error.cc
new file mode 100644
index 0000000..2fa51dc
--- /dev/null
+++ b/starboard/shared/win32/system_raise_platform_error.cc
@@ -0,0 +1,25 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/application_win32.h"
+#include "starboard/system.h"
+
+using starboard::shared::win32::ApplicationWin32;
+
+bool SbSystemRaisePlatformError(SbSystemPlatformErrorType type,
+                                SbSystemPlatformErrorCallback callback,
+                                void* user_data) {
+  return ApplicationWin32::Get()->OnSbSystemRaisePlatformError(type, callback,
+                                                               user_data);
+}
diff --git a/starboard/shared/win32/system_symbolize.cc b/starboard/shared/win32/system_symbolize.cc
new file mode 100644
index 0000000..42c9de2
--- /dev/null
+++ b/starboard/shared/win32/system_symbolize.cc
@@ -0,0 +1,107 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#ifndef COBALT_BUILD_TYPE_GOLD
+
+#include <functional>
+#include <string>
+
+#include <Windows.h>  // Must go before dbghelp.h
+#include <dbghelp.h>
+
+#include "starboard/common/log.h"
+#include "starboard/common/mutex.h"
+#include "starboard/common/string.h"
+#include "starboard/memory.h"
+#include "starboard/once.h"
+
+namespace {
+
+typedef std::function<bool(const void*, std::string*)> SymbolResolverFunction;
+
+// Handles dynamically loading functions from dbghelp.dll used
+// for symbol resolution.
+SymbolResolverFunction CreateWin32SymbolResolver() {
+  SymbolResolverFunction null_function = [](const void*, std::string*) {
+    return false;
+  };
+
+  if (!::SymInitialize(GetCurrentProcess(), NULL, TRUE)) {
+    auto error = GetLastError();
+    SB_LOG(WARNING) << "SymInitialize returned error : " << error << "\n";
+    return null_function;
+  }
+
+  ::SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);
+  return [=](const void* address, std::string* destination) {
+    char sym_buf[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
+    SYMBOL_INFO* symbol = reinterpret_cast<SYMBOL_INFO*>(sym_buf);
+    symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
+    symbol->MaxNameLen = MAX_SYM_NAME;
+
+    DWORD64 offset = 0;
+    bool ok =
+        ::SymFromAddr(::GetCurrentProcess(), reinterpret_cast<DWORD64>(address),
+                      &offset, symbol);
+
+    const char* name = symbol->Name;
+    if (name[0] == '_') {
+      name++;
+    }
+    *destination = name;
+    return ok;
+  };
+}
+
+class SymbolResolver {
+ public:
+  static SymbolResolver* Instance();
+
+  bool Resolve(const void* address, char* out_buffer, int buffer_size) {
+    std::string symbol;
+
+    starboard::ScopedLock lock(mutex_);
+    if (resolver_(address, &symbol)) {
+      starboard::strlcpy(out_buffer, symbol.c_str(), buffer_size);
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+ private:
+  SymbolResolver() { resolver_ = CreateWin32SymbolResolver(); }
+  starboard::Mutex mutex_;
+  SymbolResolverFunction resolver_;
+};
+
+SB_ONCE_INITIALIZE_FUNCTION(SymbolResolver, SymbolResolver::Instance);
+
+}  // namespace
+
+bool SbSystemSymbolize(const void* address, char* out_buffer, int buffer_size) {
+  SymbolResolver* db = SymbolResolver::Instance();
+  bool ok = db->Resolve(address, out_buffer, buffer_size);
+  return ok;
+}
+
+#else  // COBALT_BUILD_TYPE_GOLD
+
+bool SbSystemSymbolize(const void*, char*, int) {
+  return false;
+}
+
+#endif
diff --git a/starboard/shared/win32/test_filters.py b/starboard/shared/win32/test_filters.py
new file mode 100644
index 0000000..2619466
--- /dev/null
+++ b/starboard/shared/win32/test_filters.py
@@ -0,0 +1,33 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard Win32 Platform Test Filters."""
+
+from starboard.tools.testing import test_filter
+
+_FILTERED_TESTS = {}
+
+
+class TestFilters(object):
+  """Starboard Win32 platform test filters."""
+
+  def GetTestFilters(self):
+    """Gets all tests to be excluded from a unit test run.
+
+    Returns:
+      A list of initialized TestFilter objects.
+    """
+    filters = []
+    for target, tests in _FILTERED_TESTS.items():
+      filters.extend(test_filter.TestFilter(target, test) for test in tests)
+    return filters
diff --git a/starboard/shared/win32/thread_create.cc b/starboard/shared/win32/thread_create.cc
new file mode 100644
index 0000000..6e0d011
--- /dev/null
+++ b/starboard/shared/win32/thread_create.cc
@@ -0,0 +1,204 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <process.h>
+#include <memory>
+
+#include "starboard/common/log.h"
+#include "starboard/once.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/thread_private.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+namespace sbwin32 = starboard::shared::win32;
+
+using sbwin32::DebugLogWinError;
+using sbwin32::GetThreadSubsystemSingleton;
+using sbwin32::SbThreadPrivate;
+using sbwin32::ThreadSubsystemSingleton;
+using sbwin32::wchar_tToUTF8;
+
+namespace {
+
+void ResetWinError() {
+  SetLastError(0);
+}
+
+class ThreadCreateInfo {
+ public:
+  SbThreadPrivate thread_private_;
+  SbThreadEntryPoint entry_point_;
+  void* user_context_;
+  std::string name_;
+};
+
+int RunThreadLocalDestructors(ThreadSubsystemSingleton* singleton) {
+  int num_destructors_called = 0;
+
+  for (auto it = singleton->thread_local_keys_.begin();
+       it != singleton->thread_local_keys_.end();) {
+    auto curr_it = it++;
+
+    if (!curr_it->second->destructor) {
+      continue;
+    }
+    auto key = curr_it->second;
+    void* entry = SbThreadGetLocalValue(key);
+    if (!entry) {
+      continue;
+    }
+    SbThreadSetLocalValue(key, nullptr);
+    ++num_destructors_called;
+    curr_it->second->destructor(entry);
+  }
+  return num_destructors_called;
+}
+
+int CountTlsObjectsRemaining(ThreadSubsystemSingleton* singleton) {
+  int num_objects_remain = 0;
+  for (auto it = singleton->thread_local_keys_.begin();
+       it != singleton->thread_local_keys_.end(); ++it) {
+    if (!it->second->destructor) {
+      continue;
+    }
+    auto key = it->second;
+    void* entry = SbThreadGetLocalValue(key);
+    if (!entry) {
+      continue;
+    }
+    ++num_objects_remain;
+  }
+  return num_objects_remain;
+}
+
+void CallThreadLocalDestructorsMultipleTimes() {
+  // The number of passes conforms to the base_unittests. This is useful for
+  // destructors that insert new objects into thread local storage. These
+  // objects then need to be destroyed as well in subsequent passes. The total
+  // number of passes is 4, which is one more than what base_unittest tests
+  // for.
+  const int kNumDestructorPasses = 4;
+
+  ThreadSubsystemSingleton* singleton = GetThreadSubsystemSingleton();
+  int num_tls_objects_remaining = 0;
+  // TODO note that the implementation below holds a global lock
+  // while processing TLS destructors on thread exit. This could
+  // be a bottleneck in some scenarios. A lockless approach may be preferable.
+  SbMutexAcquire(&singleton->mutex_);
+
+  for (int i = 0; i < kNumDestructorPasses; ++i) {
+    // Run through each destructor and call it.
+    const int num_destructors_called = RunThreadLocalDestructors(singleton);
+    if (0 == num_destructors_called) {
+      break;  // No more destructors to call.
+    }
+  }
+  num_tls_objects_remaining = CountTlsObjectsRemaining(singleton);
+  SbMutexRelease(&singleton->mutex_);
+
+  SB_DCHECK(num_tls_objects_remaining == 0) << "Dangling objects in TLS exist.";
+}
+
+unsigned ThreadTrampoline(void* thread_create_info_context) {
+  std::unique_ptr<ThreadCreateInfo> info(
+      static_cast<ThreadCreateInfo*>(thread_create_info_context));
+
+  ThreadSubsystemSingleton* singleton = GetThreadSubsystemSingleton();
+  SbThreadSetLocalValue(singleton->thread_private_key_, &info->thread_private_);
+  SbThreadSetName(info->name_.c_str());
+
+  void* result = info->entry_point_(info->user_context_);
+
+  CallThreadLocalDestructorsMultipleTimes();
+
+  SbMutexAcquire(&info->thread_private_.mutex_);
+  info->thread_private_.result_ = result;
+  info->thread_private_.result_is_valid_ = true;
+  SbConditionVariableSignal(&info->thread_private_.condition_);
+  while (info->thread_private_.wait_for_join_) {
+    SbConditionVariableWait(&info->thread_private_.condition_,
+                            &info->thread_private_.mutex_);
+  }
+  SbMutexRelease(&info->thread_private_.mutex_);
+
+  return 0;
+}
+
+int SbThreadPriorityToWin32Priority(SbThreadPriority priority) {
+  switch (priority) {
+    case kSbThreadPriorityLowest:
+      return THREAD_PRIORITY_LOWEST;
+    case kSbThreadPriorityLow:
+      return THREAD_PRIORITY_BELOW_NORMAL;
+    case kSbThreadPriorityNormal:
+    case kSbThreadNoPriority:
+      return THREAD_PRIORITY_NORMAL;
+    case kSbThreadPriorityHigh:
+      return THREAD_PRIORITY_ABOVE_NORMAL;
+    case kSbThreadPriorityHighest:
+      return THREAD_PRIORITY_HIGHEST;
+    case kSbThreadPriorityRealTime:
+      return THREAD_PRIORITY_TIME_CRITICAL;
+  }
+  SB_NOTREACHED() << "Invalid priority " << priority;
+  return 0;
+}
+}  // namespace
+
+// Note that SetThreadAffinityMask() is not available on some
+// platforms (eg UWP). If it's necessary for a non-UWP platform,
+// please fork this implementation for UWP.
+SbThread SbThreadCreate(int64_t stack_size,
+                        SbThreadPriority priority,
+                        SbThreadAffinity affinity,
+                        bool joinable,
+                        const char* name,
+                        SbThreadEntryPoint entry_point,
+                        void* context) {
+  if (entry_point == NULL) {
+    return kSbThreadInvalid;
+  }
+  ThreadCreateInfo* info = new ThreadCreateInfo();
+
+  info->entry_point_ = entry_point;
+  info->user_context_ = context;
+  info->thread_private_.wait_for_join_ = joinable;
+  if (name) {
+    info->name_ = name;
+  }
+
+  // Create the thread suspended, and then resume once ThreadCreateInfo::handle_
+  // has been set, so that it's always valid in the ThreadCreateInfo
+  // destructor.
+  uintptr_t handle =
+      _beginthreadex(NULL, static_cast<unsigned int>(stack_size),
+                     ThreadTrampoline, info, CREATE_SUSPENDED, NULL);
+  SB_DCHECK(handle);
+  info->thread_private_.handle_ = reinterpret_cast<HANDLE>(handle);
+  ResetWinError();
+  if (priority != kSbThreadNoPriority &&
+      !SetThreadPriority(info->thread_private_.handle_,
+                         SbThreadPriorityToWin32Priority(priority)) &&
+      !GetLastError()) {
+    SB_LOG(ERROR) << "Failed to set priority for thread " << (name ? name : "")
+                  << " to " << priority;
+    DebugLogWinError();
+  }
+
+  ResumeThread(info->thread_private_.handle_);
+
+  return &info->thread_private_;
+}
diff --git a/starboard/shared/win32/thread_create_local_key.cc b/starboard/shared/win32/thread_create_local_key.cc
new file mode 100644
index 0000000..f721b74
--- /dev/null
+++ b/starboard/shared/win32/thread_create_local_key.cc
@@ -0,0 +1,73 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <windows.h>
+
+#include "starboard/common/mutex.h"
+#include "starboard/memory.h"
+#include "starboard/shared/win32/thread_local_internal.h"
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::GetThreadSubsystemSingleton;
+using starboard::shared::win32::ThreadSubsystemSingleton;
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+SbThreadLocalKey SbThreadCreateLocalKeyInternal(
+    SbThreadLocalDestructor destructor,
+    ThreadSubsystemSingleton* singleton) {
+  // Note that destructor used here to allow destruction of objects created by
+  // TLS access by non-starboard threads.
+  // Note that FlsAlloc's destructor mechanism is insufficient to pass
+  // base_unittests, which expects that multiple destructor passes for
+  // objects which insert destructable TLS pointers as side effects. For
+  // starboard threads, the TLS destructors will run first and set the
+  // TLS pointers to null, then the destructors will run a second time
+  // but this is okay since the pointers will now be nullptrs, which is
+  // a no-op. For non starboard threads, only the secondary destructor
+  // will run.
+  DWORD index = TlsInternalAlloc(destructor);
+
+  if (index == TLS_OUT_OF_INDEXES) {
+    return kSbThreadLocalKeyInvalid;
+  }
+
+  SbThreadLocalKeyPrivate* result = static_cast<SbThreadLocalKeyPrivate*>(
+      SbMemoryAllocateNoReport(sizeof(SbThreadLocalKeyPrivate)));
+
+  if (result == nullptr) {
+    return kSbThreadLocalKeyInvalid;
+  }
+
+  result->tls_index = index;
+  result->destructor = destructor;
+
+  SbMutexAcquire(&singleton->mutex_);
+  singleton->thread_local_keys_.insert(std::make_pair(index, result));
+  SbMutexRelease(&singleton->mutex_);
+  return result;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+SbThreadLocalKey SbThreadCreateLocalKey(SbThreadLocalDestructor destructor) {
+  ThreadSubsystemSingleton* singleton = GetThreadSubsystemSingleton();
+  return SbThreadCreateLocalKeyInternal(destructor, singleton);
+}
diff --git a/starboard/shared/win32/thread_destroy_local_key.cc b/starboard/shared/win32/thread_destroy_local_key.cc
new file mode 100644
index 0000000..e2abb3c
--- /dev/null
+++ b/starboard/shared/win32/thread_destroy_local_key.cc
@@ -0,0 +1,43 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <windows.h>
+
+#include "starboard/memory.h"
+#include "starboard/shared/win32/thread_local_internal.h"
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::GetThreadSubsystemSingleton;
+using starboard::shared::win32::TlsInternalFree;
+using starboard::shared::win32::ThreadSubsystemSingleton;
+
+void SbThreadDestroyLocalKey(SbThreadLocalKey key) {
+  if (!SbThreadIsValidLocalKey(key)) {
+    return;
+  }
+  // To match pthreads, the thread local pointer for the key is set to null
+  // so that a supplied destructor doesn't run.
+  SbThreadSetLocalValue(key, nullptr);
+  DWORD tls_index = static_cast<SbThreadLocalKeyPrivate*>(key)->tls_index;
+  ThreadSubsystemSingleton* singleton = GetThreadSubsystemSingleton();
+
+  SbMutexAcquire(&singleton->mutex_);
+  singleton->thread_local_keys_.erase(tls_index);
+  SbMutexRelease(&singleton->mutex_);
+
+  TlsInternalFree(tls_index);
+  SbMemoryDeallocateNoReport(key);
+}
diff --git a/starboard/shared/win32/thread_detach.cc b/starboard/shared/win32/thread_detach.cc
new file mode 100644
index 0000000..d16f524
--- /dev/null
+++ b/starboard/shared/win32/thread_detach.cc
@@ -0,0 +1,33 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include "starboard/common/condition_variable.h"
+#include "starboard/common/mutex.h"
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::SbThreadPrivate;
+
+void SbThreadDetach(SbThread thread) {
+  if (thread == kSbThreadInvalid) {
+    return;
+  }
+  SbThreadPrivate* thread_private = static_cast<SbThreadPrivate*>(thread);
+
+  SbMutexAcquire(&thread_private->mutex_);
+  thread_private->wait_for_join_ = false;
+  SbConditionVariableSignal(&thread_private->condition_);
+  SbMutexRelease(&thread_private->mutex_);
+}
diff --git a/starboard/shared/win32/thread_get_current.cc b/starboard/shared/win32/thread_get_current.cc
new file mode 100644
index 0000000..0b8af37
--- /dev/null
+++ b/starboard/shared/win32/thread_get_current.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::GetCurrentSbThreadPrivate;
+using starboard::shared::win32::SbThreadPrivate;
+
+SbThread SbThreadGetCurrent() {
+  return GetCurrentSbThreadPrivate();
+}
diff --git a/starboard/shared/win32/thread_get_id.cc b/starboard/shared/win32/thread_get_id.cc
new file mode 100644
index 0000000..6580ba1
--- /dev/null
+++ b/starboard/shared/win32/thread_get_id.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <windows.h>
+
+SbThreadId SbThreadGetId() {
+  return GetCurrentThreadId();
+}
diff --git a/starboard/shared/win32/thread_get_local_value.cc b/starboard/shared/win32/thread_get_local_value.cc
new file mode 100644
index 0000000..d36c3bb
--- /dev/null
+++ b/starboard/shared/win32/thread_get_local_value.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/thread_local_internal.h"
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::TlsInternalGetValue;
+
+void* SbThreadGetLocalValue(SbThreadLocalKey key) {
+  if (!SbThreadIsValidLocalKey(key)) {
+    return NULL;
+  }
+  DWORD tls_index = static_cast<SbThreadLocalKeyPrivate*>(key)->tls_index;
+  return TlsInternalGetValue(tls_index);
+}
diff --git a/starboard/shared/win32/thread_get_name.cc b/starboard/shared/win32/thread_get_name.cc
new file mode 100644
index 0000000..e9b299d
--- /dev/null
+++ b/starboard/shared/win32/thread_get_name.cc
@@ -0,0 +1,28 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <windows.h>
+
+#include "starboard/common/string.h"
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::GetCurrentSbThreadPrivate;
+using starboard::shared::win32::SbThreadPrivate;
+
+void SbThreadGetName(char* buffer, int buffer_size) {
+  SbThreadPrivate* thread_private = GetCurrentSbThreadPrivate();
+  starboard::strlcpy(buffer, thread_private->name_.c_str(), buffer_size);
+}
diff --git a/starboard/shared/win32/thread_is_equal.cc b/starboard/shared/win32/thread_is_equal.cc
new file mode 100644
index 0000000..e3afc0c
--- /dev/null
+++ b/starboard/shared/win32/thread_is_equal.cc
@@ -0,0 +1,19 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+bool SbThreadIsEqual(SbThread thread1, SbThread thread2) {
+  return thread1 == thread2;
+}
diff --git a/starboard/shared/win32/thread_join.cc b/starboard/shared/win32/thread_join.cc
new file mode 100644
index 0000000..7f2e761
--- /dev/null
+++ b/starboard/shared/win32/thread_join.cc
@@ -0,0 +1,47 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include "starboard/common/condition_variable.h"
+#include "starboard/common/mutex.h"
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::SbThreadPrivate;
+
+bool SbThreadJoin(SbThread thread, void** out_return) {
+  if (thread == kSbThreadInvalid) {
+    return false;
+  }
+
+  SbThreadPrivate* thread_private = static_cast<SbThreadPrivate*>(thread);
+
+  SbMutexAcquire(&thread_private->mutex_);
+  if (!thread_private->wait_for_join_) {
+    // Thread has already been detached.
+    SbMutexRelease(&thread_private->mutex_);
+    return false;
+  }
+  while (!thread_private->result_is_valid_) {
+    SbConditionVariableWait(&thread_private->condition_,
+                            &thread_private->mutex_);
+  }
+  thread_private->wait_for_join_ = false;
+  SbConditionVariableSignal(&thread_private->condition_);
+  if (out_return != NULL) {
+    *out_return = thread_private->result_;
+  }
+  SbMutexRelease(&thread_private->mutex_);
+  return true;
+}
diff --git a/starboard/shared/win32/thread_local_internal.cc b/starboard/shared/win32/thread_local_internal.cc
new file mode 100644
index 0000000..a771064
--- /dev/null
+++ b/starboard/shared/win32/thread_local_internal.cc
@@ -0,0 +1,72 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/thread_local_internal.h"
+
+#include <windows.h>
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// FlsAlloc() is like TlsAlloc(), but allows destructors.
+// The downside is that FlsAlloc() has a small upper limit of
+// about ~100 available keys. To provide extra keys, TlsAlloc()
+// is used whenever a destructor is not necessary.
+DWORD TlsInternalAlloc(SbThreadLocalDestructor destructor_fn) {
+  DWORD output = 0;
+  if (destructor_fn) {
+    output = FlsAlloc(destructor_fn);
+  } else {
+    output = TlsAlloc();
+  }
+  if (output == TLS_OUT_OF_INDEXES) {
+    return TLS_OUT_OF_INDEXES;
+  }
+  return (output << 1) | (destructor_fn ? 0x1 : 0x0);
+}
+
+void TlsInternalFree(DWORD key) {
+  bool has_destructor = key & 0x1;
+  DWORD index = key >> 1;
+  if (has_destructor) {
+    FlsFree(index);
+  } else {
+    TlsFree(index);
+  }
+}
+
+void* TlsInternalGetValue(DWORD key) {
+  bool has_destructor = key & 0x1;
+  DWORD index = key >> 1;
+  if (has_destructor) {
+    return FlsGetValue(index);
+  } else {
+    return TlsGetValue(index);
+  }
+}
+
+bool TlsInternalSetValue(DWORD key, void* value) {
+  bool has_destructor = key & 0x1;
+  DWORD index = key >> 1;
+  if (has_destructor) {
+    return FlsSetValue(index, value);
+  } else {
+    return TlsSetValue(index, value);
+  }
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/thread_local_internal.h b/starboard/shared/win32/thread_local_internal.h
new file mode 100644
index 0000000..847997f
--- /dev/null
+++ b/starboard/shared/win32/thread_local_internal.h
@@ -0,0 +1,36 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_THREAD_LOCAL_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_THREAD_LOCAL_INTERNAL_H_
+
+#include <windows.h>
+
+#include "starboard/thread.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+DWORD TlsInternalAlloc(SbThreadLocalDestructor destructor_fn);
+void TlsInternalFree(DWORD key);
+
+void* TlsInternalGetValue(DWORD key);
+bool TlsInternalSetValue(DWORD key, void* value);
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_THREAD_LOCAL_INTERNAL_H_
diff --git a/starboard/shared/win32/thread_private.cc b/starboard/shared/win32/thread_private.cc
new file mode 100644
index 0000000..456ea3b
--- /dev/null
+++ b/starboard/shared/win32/thread_private.cc
@@ -0,0 +1,70 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <process.h>
+#include <memory>
+
+#include "starboard/common/log.h"
+#include "starboard/once.h"
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::GetThreadSubsystemSingleton;
+using starboard::shared::win32::SbThreadPrivate;
+using starboard::shared::win32::ThreadSubsystemSingleton;
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+SB_ONCE_INITIALIZE_FUNCTION(ThreadSubsystemSingleton,
+                            GetThreadSubsystemSingleton);
+
+void RegisterMainThread() {
+  std::unique_ptr<SbThreadPrivate> thread_private(new SbThreadPrivate());
+
+  // GetCurrentThread() returns a pseudo-handle that must be duplicated
+  // to be used in general cases.
+  HANDLE pseudo_handle = GetCurrentThread();
+  HANDLE handle;
+  BOOL success =
+      DuplicateHandle(GetCurrentProcess(), pseudo_handle, GetCurrentProcess(),
+                      &handle, 0, false, DUPLICATE_SAME_ACCESS);
+  SB_DCHECK(success) << "DuplicateHandle failed";
+
+  thread_private->handle_ = handle;
+  thread_private->wait_for_join_ = false;
+
+  SbThreadSetLocalValue(GetThreadSubsystemSingleton()->thread_private_key_,
+                        thread_private.release());
+}
+
+SbThreadPrivate* GetCurrentSbThreadPrivate() {
+  SbThreadPrivate* sb_thread_private =
+      static_cast<SbThreadPrivate*>(SbThreadGetLocalValue(
+          GetThreadSubsystemSingleton()->thread_private_key_));
+  if (sb_thread_private == nullptr) {
+    // We are likely on a thread we did not create, so TLS needs to be setup.
+    RegisterMainThread();
+    sb_thread_private = static_cast<SbThreadPrivate*>(SbThreadGetLocalValue(
+        GetThreadSubsystemSingleton()->thread_private_key_));
+    // TODO: Clean up TLS storage for threads we do not create.
+  }
+  return sb_thread_private;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/thread_private.h b/starboard/shared/win32/thread_private.h
new file mode 100644
index 0000000..7691011
--- /dev/null
+++ b/starboard/shared/win32/thread_private.h
@@ -0,0 +1,111 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_THREAD_PRIVATE_H_
+#define STARBOARD_SHARED_WIN32_THREAD_PRIVATE_H_
+
+#include <windows.h>
+
+#include <map>
+#include <string>
+
+#include "starboard/common/condition_variable.h"
+#include "starboard/common/mutex.h"
+#include "starboard/once.h"
+#include "starboard/shared/internal_only.h"
+#include "starboard/thread.h"
+
+struct SbThreadLocalKeyPrivate {
+  DWORD tls_index;
+  SbThreadLocalDestructor destructor;
+};
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+class ThreadSubsystemSingleton;
+
+// Creates a SbThreadLocalKey given a ThreadSubsystemSingleton. Used
+// to create the first SbThreadLocalKey.
+SbThreadLocalKey SbThreadCreateLocalKeyInternal(
+    SbThreadLocalDestructor destructor,
+    ThreadSubsystemSingleton* singleton);
+
+// Singleton state for the thread subsystem.
+class ThreadSubsystemSingleton {
+ public:
+  ThreadSubsystemSingleton()
+      : mutex_(SB_MUTEX_INITIALIZER),
+        thread_private_key_(SbThreadCreateLocalKeyInternal(NULL, this)) {}
+  // This mutex protects all class members
+  SbMutex mutex_;
+  // Allocated thread_local_keys. Note that std::map is used
+  // so that elements can be deleted without triggering an allocation.
+  std::map<DWORD, SbThreadLocalKeyPrivate*> thread_local_keys_;
+  // Thread-local key for the thread's SbThreadPrivate
+  SbThreadLocalKey thread_private_key_;
+};
+
+// Obtains the ThreadsSubsystemSingleton();
+ThreadSubsystemSingleton* GetThreadSubsystemSingleton();
+
+// Registers the main thread. setting it's SbThreadPrivate*
+void RegisterMainThread();
+
+// Private thread state, stored in thread local storage and
+// cleaned up when thread exits.
+class SbThreadPrivate {
+ public:
+  SbThreadPrivate()
+      : mutex_(SB_MUTEX_INITIALIZER),
+        condition_(SB_CONDITION_VARIABLE_INITIALIZER),
+        handle_(NULL),
+        result_(NULL),
+        wait_for_join_(false),
+        result_is_valid_(false) {}
+
+  ~SbThreadPrivate() {
+    if (handle_) {
+      CloseHandle(handle_);
+    }
+
+    SbMutexDestroy(&mutex_);
+    SbConditionVariableDestroy(&condition_);
+  }
+
+  // This mutex protects all class members
+  SbMutex mutex_;
+  SbConditionVariable condition_;
+  std::string name_;
+  HANDLE handle_;
+  // The result of the thread. The return value of SbThreadEntryPoint
+  // to return to SbThreadJoin.
+  void* result_;
+  // True if a thread must wait to be joined before completely exiting.
+  // Changes to this must signal |condition_|.
+  bool wait_for_join_;
+  // True if |result_| is valid (the thread has completed and is waiting
+  // to exit). Changes to this must signal |condition_|.
+  bool result_is_valid_;
+};
+
+// Obtains the current thread's SbThreadPrivate* from thread-local storage.
+SbThreadPrivate* GetCurrentSbThreadPrivate();
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_THREAD_PRIVATE_H_
diff --git a/starboard/shared/win32/thread_set_local_value.cc b/starboard/shared/win32/thread_set_local_value.cc
new file mode 100644
index 0000000..f857db0
--- /dev/null
+++ b/starboard/shared/win32/thread_set_local_value.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/thread_local_internal.h"
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::TlsInternalSetValue;
+
+bool SbThreadSetLocalValue(SbThreadLocalKey key, void* value) {
+  if (!SbThreadIsValidLocalKey(key)) {
+    return false;
+  }
+  DWORD tls_index = static_cast<SbThreadLocalKeyPrivate*>(key)->tls_index;
+  return TlsInternalSetValue(tls_index, value);
+}
diff --git a/starboard/shared/win32/thread_set_name.cc b/starboard/shared/win32/thread_set_name.cc
new file mode 100644
index 0000000..72aafef
--- /dev/null
+++ b/starboard/shared/win32/thread_set_name.cc
@@ -0,0 +1,66 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/thread_private.h"
+
+using starboard::shared::win32::GetCurrentSbThreadPrivate;
+using starboard::shared::win32::SbThreadPrivate;
+
+namespace {
+
+// The code below is from
+// https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
+// A |dwThreadID| of -1 means "current thread";
+//
+// Usage: SetThreadName ((DWORD)-1, "MainThread");
+//
+const DWORD MS_VC_EXCEPTION = 0x406D1388;
+#pragma pack(push, 8)
+typedef struct tagTHREADNAME_INF {
+  DWORD dwType;      // Must be 0x1000.
+  LPCSTR szName;     // Pointer to name (in user addr space).
+  DWORD dwThreadID;  // Thread ID (-1=caller thread).
+  DWORD dwFlags;     // Reserved for future use, must be zero.
+} THREADNAME_INFO;
+#pragma pack(pop)
+void SetThreadName(DWORD dwThreadID, const char* threadName) {
+  THREADNAME_INFO info;
+  info.dwType = 0x1000;
+  info.szName = threadName;
+  info.dwThreadID = dwThreadID;
+  info.dwFlags = 0;
+#pragma warning(push)
+#pragma warning(disable : 6320 6322)
+  __try {
+    RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR),
+                   reinterpret_cast<ULONG_PTR*>(&info));
+  } __except(EXCEPTION_EXECUTE_HANDLER) {
+  }
+#pragma warning(pop)
+}
+
+}  // namespace
+
+void SbThreadSetName(const char* name) {
+  SbThreadPrivate* thread_private = GetCurrentSbThreadPrivate();
+
+  // We store the thread name in our own TLS context as well as telling
+  // the OS because it's much easier to retrieve from our own TLS context.
+  thread_private->name_ = name;
+  SetThreadName(static_cast<DWORD>(-1), name);
+}
diff --git a/starboard/shared/win32/thread_sleep.cc b/starboard/shared/win32/thread_sleep.cc
new file mode 100644
index 0000000..b68067b
--- /dev/null
+++ b/starboard/shared/win32/thread_sleep.cc
@@ -0,0 +1,28 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <windows.h>
+
+#include "starboard/shared/win32/time_utils.h"
+
+using starboard::shared::win32::ConvertSbTimeToMillisRoundUp;
+
+void SbThreadSleep(SbTime duration) {
+  if (duration < 0) {
+    return;
+  }
+  Sleep(ConvertSbTimeToMillisRoundUp(duration));
+}
diff --git a/starboard/shared/win32/thread_yield.cc b/starboard/shared/win32/thread_yield.cc
new file mode 100644
index 0000000..98eb8cf
--- /dev/null
+++ b/starboard/shared/win32/thread_yield.cc
@@ -0,0 +1,21 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/thread.h"
+
+#include <windows.h>
+
+void SbThreadYield() {
+  Sleep(0);
+}
diff --git a/starboard/shared/win32/time_get_monotonic_now.cc b/starboard/shared/win32/time_get_monotonic_now.cc
new file mode 100644
index 0000000..bfa43f4
--- /dev/null
+++ b/starboard/shared/win32/time_get_monotonic_now.cc
@@ -0,0 +1,47 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/time.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+
+SbTimeMonotonic SbTimeGetMonotonicNow() {
+  LARGE_INTEGER counts;
+  bool success;
+
+  success = QueryPerformanceCounter(&counts);
+
+  // "On systems that run Windows XP or later,
+  // the function will always succeed and will thus never return zero."
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx
+  SB_DCHECK(success);
+
+  LARGE_INTEGER countsPerSecond;
+  success = QueryPerformanceFrequency(&countsPerSecond);
+  // "On systems that run Windows XP or later,
+  // the function will always succeed and will thus never return zero."
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644905(v=vs.85).aspx
+  SB_DCHECK(success);
+
+  // An observed value of countsPerSecond on a desktop x86 machine is
+  // ~2.5e6. With this frequency, it will take ~37500 days to exceed
+  // 2^53, which is the mantissa precision of a double.
+  // Hence, we can safely convert to a double here without losing precision.
+  double result = static_cast<double>(counts.QuadPart);
+  result *= (1000.0 * 1000.0) / countsPerSecond.QuadPart;
+
+  return static_cast<SbTimeMonotonic>(result);
+}
diff --git a/starboard/shared/win32/time_get_now.cc b/starboard/shared/win32/time_get_now.cc
new file mode 100644
index 0000000..806f78e
--- /dev/null
+++ b/starboard/shared/win32/time_get_now.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/time.h"
+
+#include <windows.h>
+
+SbTime SbTimeGetNow() {
+  SYSTEMTIME system_time;
+  GetSystemTime(&system_time);
+
+  FILETIME file_time;
+  SystemTimeToFileTime(&system_time, &file_time);
+
+  ULARGE_INTEGER large_int;
+  large_int.LowPart = file_time.dwLowDateTime;
+  large_int.HighPart = file_time.dwHighDateTime;
+  return static_cast<SbTime>(large_int.QuadPart) / 10;
+}
diff --git a/starboard/shared/win32/time_utils.h b/starboard/shared/win32/time_utils.h
new file mode 100644
index 0000000..b88388b
--- /dev/null
+++ b/starboard/shared/win32/time_utils.h
@@ -0,0 +1,63 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_TIME_UTILS_H_
+#define STARBOARD_SHARED_WIN32_TIME_UTILS_H_
+
+#include "starboard/common/log.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+inline SbTime ConvertFileTimeTicksToSbTime(const LARGE_INTEGER ticks) {
+  // According to
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx
+  // FILETIME format is "Contains a 64-bit value representing the number of
+  // 100-nanosecond intervals since January 1, 1601 (UTC)"
+  const uint64_t kNumber100nanosecondTicksInMicrosecond = 10;
+  return ticks.QuadPart / kNumber100nanosecondTicksInMicrosecond;
+}
+
+inline SbTime ConvertFileTimeToSbTime(const FILETIME file_time) {
+  // According to
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx
+  // FILETIME format is "Contains a 64-bit value representing the number of
+  // 100-nanosecond intervals since January 1, 1601 (UTC)"
+  LARGE_INTEGER ticks;
+  ticks.QuadPart = (static_cast<LONGLONG>(file_time.dwHighDateTime) << 32) |
+                   file_time.dwLowDateTime;
+  return ConvertFileTimeTicksToSbTime(ticks);
+}
+
+inline SbTime ConvertSystemTimeToSbTime(const SYSTEMTIME system_time) {
+  FILETIME file_time = {0};
+  SystemTimeToFileTime(&system_time, &file_time);
+  return ConvertFileTimeToSbTime(file_time);
+}
+
+// Many Win32 calls take millis, but SbTime is microseconds.
+// Many nplb tests assume waits are at least as long as requested, so
+// round up.
+inline DWORD ConvertSbTimeToMillisRoundUp(SbTime duration) {
+  const int64_t milliseconds_to_sleep =
+      (duration + kSbTimeMillisecond - 1) / kSbTimeMillisecond;
+  return static_cast<DWORD>(milliseconds_to_sleep);
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_TIME_UTILS_H_
diff --git a/starboard/shared/win32/time_zone_get_current.cc b/starboard/shared/win32/time_zone_get_current.cc
new file mode 100644
index 0000000..85a5493
--- /dev/null
+++ b/starboard/shared/win32/time_zone_get_current.cc
@@ -0,0 +1,36 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/time_zone.h"
+
+#include <windows.h>
+
+#include "starboard/common/log.h"
+SbTimeZone SbTimeZoneGetCurrent() {
+  DYNAMIC_TIME_ZONE_INFORMATION time_zone_info;
+
+  DWORD zone_id = GetDynamicTimeZoneInformation(&time_zone_info);
+
+  switch (zone_id) {
+  case TIME_ZONE_ID_UNKNOWN:
+    return time_zone_info.Bias;
+  case TIME_ZONE_ID_STANDARD:
+    return time_zone_info.Bias + time_zone_info.StandardBias;
+  case TIME_ZONE_ID_DAYLIGHT:
+    return time_zone_info.Bias + time_zone_info.DaylightBias;
+  default:
+    SB_NOTREACHED();
+    return 0;
+  }
+}
diff --git a/starboard/shared/win32/time_zone_get_name.cc b/starboard/shared/win32/time_zone_get_name.cc
new file mode 100644
index 0000000..bc92e3b
--- /dev/null
+++ b/starboard/shared/win32/time_zone_get_name.cc
@@ -0,0 +1,58 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/time_zone.h"
+
+#include <string>
+#include <Windows.h>
+
+#include "starboard/common/log.h"
+#include "starboard/once.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+namespace {
+class TimeZoneString {
+ public:
+  static TimeZoneString* Get();
+  const char* value() const { return value_.c_str(); }
+
+ private:
+  TimeZoneString() {
+    DYNAMIC_TIME_ZONE_INFORMATION time_zone_info;
+    DWORD zone_id = GetDynamicTimeZoneInformation(&time_zone_info);
+
+    std::wstring wide_string;
+    switch (zone_id) {
+      case TIME_ZONE_ID_UNKNOWN:
+      case TIME_ZONE_ID_STANDARD:
+        wide_string = time_zone_info.StandardName;
+        break;
+      case TIME_ZONE_ID_DAYLIGHT:
+        wide_string = time_zone_info.DaylightName;
+        break;
+      default:
+        SB_NOTREACHED();
+    }
+    value_ = starboard::shared::win32::wchar_tToUTF8(wide_string.c_str());
+  }
+  std::string value_;
+};
+
+SB_ONCE_INITIALIZE_FUNCTION(TimeZoneString, TimeZoneString::Get);
+}  // namespace.
+
+const char* SbTimeZoneGetName() {
+  const char* output = TimeZoneString::Get()->value();
+  return output;
+}
diff --git a/starboard/shared/win32/types_internal.h b/starboard/shared/win32/types_internal.h
new file mode 100644
index 0000000..fcc10c8
--- /dev/null
+++ b/starboard/shared/win32/types_internal.h
@@ -0,0 +1,33 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Defines the pthread versions of Starboard synchronization primitives and the
+// static initializers for those primitives.
+
+#ifndef STARBOARD_SHARED_WIN32_TYPES_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_TYPES_INTERNAL_H_
+
+#define SB_WIN32_INTERNAL_MUTEX(mutex_ptr) \
+  reinterpret_cast<PSRWLOCK>((mutex_ptr)->mutex_buffer)
+#define SB_WIN32_INTERNAL_CONDITION(condition_ptr) \
+  reinterpret_cast<PCONDITION_VARIABLE>((condition_ptr)->condition_buffer)
+#define SB_WIN32_INTERNAL_ONCE(once_ptr) \
+  reinterpret_cast<PINIT_ONCE>((once_ptr)->once_buffer)
+#else
+#define SB_WIN32_INTERNAL_MUTEX(mutex_ptr) reinterpret_cast<PSRWLOCK>(mutex_ptr)
+#define SB_WIN32_INTERNAL_CONDITION(condition_ptr) \
+  reinterpret_cast<PCONDITION_VARIABLE>(condition_ptr)
+#define SB_WIN32_INTERNAL_ONCE(once_ptr) reinterpret_cast<PINIT_ONCE>(once_ptr)
+
+#endif  // STARBOARD_SHARED_WIN32_TYPES_INTERNAL_H_
diff --git a/starboard/shared/win32/video_decoder.cc b/starboard/shared/win32/video_decoder.cc
new file mode 100644
index 0000000..44f30c4
--- /dev/null
+++ b/starboard/shared/win32/video_decoder.cc
@@ -0,0 +1,745 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/video_decoder.h"
+
+#include <functional>
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/dx_context_video_decoder.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/hardware_decode_target_internal.h"
+#include "starboard/time.h"
+
+// Include this after all other headers to avoid introducing redundant
+// definitions from other header files.
+#include <codecapi.h>  // For CODECAPI_*
+#include <initguid.h>  // For DXVA_ModeVP9_VLD_Profile0
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+namespace {
+
+using Microsoft::WRL::ComPtr;
+using ::starboard::shared::starboard::player::filter::VideoFrame;
+using std::placeholders::_1;
+using std::placeholders::_2;
+
+// Limit the number of active output samples to control memory usage.
+// NOTE: Higher numbers may result in increased dropped frames when the video
+// resolution changes during playback (if the decoder is not forced to use
+// max resolution resources).
+const int kMaxOutputSamples = 10;
+
+// Throttle the number of queued inputs to control memory usage.
+const int kMaxInputSamples = 15;
+
+// Prime the VP9 decoder for a certain number of output frames to reduce
+// hitching at the start of playback.
+const int kVp9PrimingFrameCount = 10;
+
+// Decode targets are cached for reuse. Ensure the cache size is large enough
+// to accommodate the depth of the presentation swap chain, otherwise the
+// video textures may be updated before or while they are actually rendered.
+const int kDecodeTargetCacheSize = 2;
+
+// Allocate decode targets at the maximum size to allow them to be reused for
+// all resolutions. This minimizes hitching during resolution changes.
+#ifdef ENABLE_VP9_8K_SUPPORT
+const int kMaxDecodeTargetWidth = 7680;
+const int kMaxDecodeTargetHeight = 4320;
+#else   // ENABLE_VP9_8K_SUPPORT
+const int kMaxDecodeTargetWidth = 3840;
+const int kMaxDecodeTargetHeight = 2160;
+#endif  // ENABLE_VP9_8K_SUPPOR
+
+DEFINE_GUID(DXVA_ModeVP9_VLD_Profile0,
+            0x463707f8,
+            0xa1d0,
+            0x4585,
+            0x87,
+            0x6d,
+            0x83,
+            0xaa,
+            0x6d,
+            0x60,
+            0xb8,
+            0x9e);
+
+DEFINE_GUID(DXVA_ModeVP9_VLD_10bit_Profile2,
+            0xa4c749ef,
+            0x6ecf,
+            0x48aa,
+            0x84,
+            0x48,
+            0x50,
+            0xa7,
+            0xa1,
+            0x16,
+            0x5f,
+            0xf7);
+
+scoped_ptr<MediaTransform> CreateVideoTransform(
+    const GUID& decoder_guid,
+    const GUID& input_guid,
+    const GUID& output_guid,
+    const IMFDXGIDeviceManager* device_manager) {
+  scoped_ptr<MediaTransform> media_transform(new MediaTransform(decoder_guid));
+  if (!media_transform->HasValidTransform()) {
+    // Decoder Transform setup failed
+    return scoped_ptr<MediaTransform>().Pass();
+  }
+  media_transform->EnableInputThrottle(true);
+
+  ComPtr<IMFAttributes> attributes = media_transform->GetAttributes();
+  if (!attributes) {
+    // Decoder Transform setup failed
+    return scoped_ptr<MediaTransform>().Pass();
+  }
+
+  UINT32 is_d3d_aware_attribute = false;
+  HRESULT hr = attributes->GetUINT32(MF_SA_D3D_AWARE, &is_d3d_aware_attribute);
+  if (SUCCEEDED(hr) && is_d3d_aware_attribute) {
+    // Ignore the return value, an error is expected when running in Session 0.
+    hr = media_transform->SendMessage(MFT_MESSAGE_SET_D3D_MANAGER,
+                                      ULONG_PTR(device_manager));
+    if (FAILED(hr)) {
+      SB_LOG(WARNING) << "Unable to set device manager for d3d aware decoder, "
+                         "disabling DXVA.";
+      hr = attributes->SetUINT32(CODECAPI_AVDecVideoAcceleration_H264, FALSE);
+      if (FAILED(hr)) {
+        SB_LOG(WARNING) << "Unable to disable DXVA.";
+        return scoped_ptr<MediaTransform>().Pass();
+      }
+    } else {
+      hr = attributes->SetUINT32(CODECAPI_AVDecVideoAcceleration_H264, TRUE);
+      if (FAILED(hr)) {
+        SB_LOG(INFO) << "Unable to enable DXVA for video decoder.";
+      }
+    }
+  } else {
+    SB_LOG(WARNING) << "Video decoder is not D3D aware, decoding may be slow.";
+  }
+
+  // Tell the decoder to allocate resources for the maximum resolution in
+  // order to minimize glitching on resolution changes.
+  if (FAILED(attributes->SetUINT32(MF_MT_DECODER_USE_MAX_RESOLUTION, 1))) {
+    return scoped_ptr<MediaTransform>().Pass();
+  }
+
+  ComPtr<IMFMediaType> input_type;
+  if (FAILED(MFCreateMediaType(&input_type)) || !input_type) {
+    return scoped_ptr<MediaTransform>().Pass();
+  }
+  CheckResult(input_type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));
+  CheckResult(input_type->SetGUID(MF_MT_SUBTYPE, input_guid));
+  CheckResult(input_type->SetUINT32(MF_MT_INTERLACE_MODE,
+                                    MFVideoInterlace_Progressive));
+  if (input_guid == MFVideoFormat_VP90) {
+    // Set the expected video resolution. Setting the proper resolution can
+    // mitigate a format change, but the decoder will adjust to the real
+    // resolution regardless.
+    CheckResult(MFSetAttributeSize(input_type.Get(), MF_MT_FRAME_SIZE,
+                                   kMaxDecodeTargetWidth,
+                                   kMaxDecodeTargetHeight));
+  }
+  media_transform->SetInputType(input_type);
+
+  media_transform->SetOutputTypeBySubType(output_guid);
+
+  return media_transform.Pass();
+}
+
+class VideoFrameImpl : public VideoFrame {
+ public:
+  VideoFrameImpl(SbTime timestamp, std::function<void(VideoFrame*)> release_cb)
+      : VideoFrame(timestamp), release_cb_(release_cb) {
+    SB_DCHECK(release_cb_);
+  }
+  ~VideoFrameImpl() { release_cb_(this); }
+
+ private:
+  std::function<void(VideoFrame*)> release_cb_;
+};
+
+}  // namespace
+
+VideoDecoder::VideoDecoder(
+    SbMediaVideoCodec video_codec,
+    SbPlayerOutputMode output_mode,
+    SbDecodeTargetGraphicsContextProvider* graphics_context_provider,
+    SbDrmSystem drm_system,
+    bool is_hdr_supported)
+    : video_codec_(video_codec),
+      graphics_context_provider_(graphics_context_provider),
+      drm_system_(drm_system),
+      is_hdr_supported_(is_hdr_supported) {
+  SB_DCHECK(output_mode == kSbPlayerOutputModeDecodeToTexture);
+
+  HardwareDecoderContext hardware_context = GetDirectXForHardwareDecoding();
+  d3d_device_ = hardware_context.dx_device_out;
+  device_manager_ = hardware_context.dxgi_device_manager_out;
+  HRESULT hr = d3d_device_.As(&video_device_);
+  if (FAILED(hr)) {
+    return;
+  }
+
+  ComPtr<ID3D11DeviceContext> d3d_context;
+  d3d_device_->GetImmediateContext(d3d_context.GetAddressOf());
+  d3d_context.As(&video_context_);
+}
+
+VideoDecoder::~VideoDecoder() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  Reset();
+  ShutdownCodec();
+}
+
+// static
+bool VideoDecoder::IsHardwareVp9DecoderSupported(bool is_hdr_required) {
+  static bool s_first_time_update = true;
+  static bool s_is_vp9_supported = false;
+  static bool s_is_hdr_supported = false;
+
+  const UINT D3D11_VIDEO_DECODER_CAPS_UNSUPPORTED = 0x10;
+
+  if (s_first_time_update) {
+    ComPtr<ID3D11Device> d3d11_device;
+    HRESULT hr = D3D11CreateDevice(
+        nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0,
+        D3D11_SDK_VERSION, d3d11_device.GetAddressOf(), nullptr, nullptr);
+    if (FAILED(hr)) {
+      return false;
+    }
+    ComPtr<ID3D11VideoDevice1> video_device;
+    if (FAILED(d3d11_device.As(&video_device))) {
+      return false;
+    }
+    const DXGI_RATIONAL kFps = {30, 1};  // 30 fps = 30/1
+    const UINT kBitrate = 0;
+    UINT caps_profile_0 = 0;
+    if (SUCCEEDED(video_device->GetVideoDecoderCaps(&DXVA_ModeVP9_VLD_Profile0,
+                                                    3840, 2160, &kFps, kBitrate,
+                                                    NULL, &caps_profile_0))) {
+      s_is_vp9_supported =
+          caps_profile_0 != D3D11_VIDEO_DECODER_CAPS_UNSUPPORTED;
+    }
+
+    UINT caps_profile_2 = 0;
+    if (SUCCEEDED(video_device->GetVideoDecoderCaps(
+            &DXVA_ModeVP9_VLD_10bit_Profile2, 3840, 2160, &kFps, kBitrate, NULL,
+            &caps_profile_2))) {
+      s_is_hdr_supported =
+          caps_profile_2 != D3D11_VIDEO_DECODER_CAPS_UNSUPPORTED;
+    }
+    s_first_time_update = false;
+  }
+  return is_hdr_required ? s_is_vp9_supported && s_is_hdr_supported
+                         : s_is_vp9_supported;
+}
+
+size_t VideoDecoder::GetPrerollFrameCount() const {
+  return kMaxOutputSamples;
+}
+
+size_t VideoDecoder::GetMaxNumberOfCachedFrames() const {
+  return kMaxOutputSamples;
+}
+
+void VideoDecoder::Initialize(const DecoderStatusCB& decoder_status_cb,
+                              const ErrorCB& error_cb) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  SB_DCHECK(!decoder_status_cb_);
+  SB_DCHECK(decoder_status_cb);
+  SB_DCHECK(!error_cb_);
+  SB_DCHECK(error_cb);
+  decoder_status_cb_ = decoder_status_cb;
+  error_cb_ = error_cb;
+  if (video_device_) {
+    InitializeCodec();
+  }
+  if (!decoder_) {
+    error_cb_(kSbPlayerErrorDecode, "Cannot initialize codec.");
+  }
+}
+
+void VideoDecoder::WriteInputBuffer(
+    const scoped_refptr<InputBuffer>& input_buffer) {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  SB_DCHECK(input_buffer);
+  SB_DCHECK(decoder_status_cb_);
+  EnsureDecoderThreadRunning();
+
+  if (TryUpdateOutputForHdrVideo(input_buffer->video_sample_info())) {
+    ScopedLock lock(thread_lock_);
+    thread_events_.emplace_back(
+        new Event{Event::kWriteInputBuffer, input_buffer});
+  } else {
+    error_cb_(kSbPlayerErrorCapabilityChanged,
+              "HDR sink lost while HDR video playing.");
+  }
+}
+
+void VideoDecoder::WriteEndOfStream() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  SB_DCHECK(decoder_status_cb_);
+  EnsureDecoderThreadRunning();
+
+  ScopedLock lock(thread_lock_);
+  thread_events_.emplace_back(new Event{Event::kWriteEndOfStream});
+}
+
+void VideoDecoder::Reset() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  StopDecoderThread();
+
+  // Make sure all output samples have been released before flushing the
+  // decoder. Be sure to Acquire the mutexes in the same order as
+  // CreateDecodeTarget to avoid possible deadlock.
+  outputs_reset_lock_.Acquire();
+  thread_lock_.Acquire();
+  thread_outputs_.clear();
+  thread_lock_.Release();
+  outputs_reset_lock_.Release();
+
+  // If the previous priming hasn't finished, restart it.  This happens rarely
+  // as it is only triggered when a seek is requested immediately after video is
+  // started.
+  if (priming_output_count_ > 0) {
+    priming_output_count_ = kVp9PrimingFrameCount;
+  }
+
+  decoder_status_cb_(kReleaseAllFrames, nullptr);
+  if (decoder_) {
+    decoder_->Reset();
+  }
+}
+
+SbDecodeTarget VideoDecoder::GetCurrentDecodeTarget() {
+  auto decode_target = CreateDecodeTarget();
+
+  if (SbDecodeTargetIsValid(decode_target)) {
+    if (SbDecodeTargetIsValid(current_decode_target_)) {
+      prev_decode_targets_.emplace_back(current_decode_target_);
+    }
+    current_decode_target_ = decode_target;
+  }
+  if (SbDecodeTargetIsValid(current_decode_target_)) {
+    // Add a reference for the caller.
+    current_decode_target_->AddRef();
+  }
+  return current_decode_target_;
+}
+
+SbDecodeTarget VideoDecoder::CreateDecodeTarget() {
+  RECT video_area;
+  ComPtr<IMFSample> video_sample;
+
+  // Don't allow a decoder reset (flush) while an IMFSample is
+  // alive. However, the decoder thread should be allowed to continue
+  // while the SbDecodeTarget is being created.
+  ScopedLock reset_lock(outputs_reset_lock_);
+
+  // Use the oldest output.
+  thread_lock_.Acquire();
+  if (!thread_outputs_.empty()) {
+    // This function should not remove output frames. However, it's possible
+    // for the same frame to be requested multiple times. To avoid re-creating
+    // SbDecodeTargets, release the video_sample once it is used to create
+    // an output frame. The next call to CreateDecodeTarget for the same frame
+    // will return kSbDecodeTargetInvalid, and |current_decode_target_| will
+    // be reused.
+    Output& output = thread_outputs_.front();
+    video_area = output.video_area;
+    video_sample.Swap(output.video_sample);
+  }
+  thread_lock_.Release();
+
+  SbDecodeTarget decode_target = kSbDecodeTargetInvalid;
+  if (video_sample != nullptr) {
+    // Try reusing the previous decode target to avoid the performance hit of
+    // creating a new texture.
+    SB_DCHECK(prev_decode_targets_.size() <= kDecodeTargetCacheSize + 1);
+    if (prev_decode_targets_.size() >= kDecodeTargetCacheSize) {
+      decode_target = prev_decode_targets_.front();
+      prev_decode_targets_.pop_front();
+      auto hardware_decode_target =
+          reinterpret_cast<HardwareDecodeTargetPrivate*>(decode_target);
+      if (!hardware_decode_target->Update(
+              d3d_device_, video_device_, video_context_, video_enumerator_,
+              video_processor_, video_sample, video_area, is_hdr_supported_)) {
+        // The cached decode target was not compatible; just release it.
+        SbDecodeTargetRelease(decode_target);
+        decode_target = kSbDecodeTargetInvalid;
+      }
+    }
+
+    if (!SbDecodeTargetIsValid(decode_target)) {
+      decode_target = new HardwareDecodeTargetPrivate(
+          d3d_device_, video_device_, video_context_, video_enumerator_,
+          video_processor_, video_sample, video_area, is_hdr_supported_);
+    }
+
+    // Release the video_sample before releasing the reset lock.
+    video_sample.Reset();
+  }
+  return decode_target;
+}
+
+void VideoDecoder::InitializeCodec() {
+  scoped_ptr<MediaTransform> media_transform;
+
+  // If this is updated then media_is_video_supported.cc also needs to be
+  // updated.
+  switch (video_codec_) {
+    case kSbMediaVideoCodecH264: {
+      media_transform =
+          CreateVideoTransform(CLSID_MSH264DecoderMFT, MFVideoFormat_H264,
+                               MFVideoFormat_NV12, device_manager_.Get());
+      priming_output_count_ = 0;
+      if (!media_transform) {
+        SB_LOG(WARNING) << "H264 hardware decoder creation failed.";
+        return;
+      }
+      break;
+    }
+    case kSbMediaVideoCodecVp9: {
+      if (IsHardwareVp9DecoderSupported()) {
+        media_transform =
+            CreateVideoTransform(CLSID_MSVPxDecoder, MFVideoFormat_VP90,
+                                 MFVideoFormat_NV12, device_manager_.Get());
+        priming_output_count_ = kVp9PrimingFrameCount;
+      }
+      if (!media_transform) {
+        SB_LOG(WARNING) << "VP9 hardware decoder creation failed.";
+        return;
+      }
+      break;
+    }
+    default: { SB_NOTREACHED(); }
+  }
+
+  decoder_.reset(
+      new DecryptingDecoder("video", media_transform.Pass(), drm_system_));
+  MediaTransform* transform = decoder_->GetDecoder();
+
+  DWORD input_stream_count = 0;
+  DWORD output_stream_count = 0;
+  SB_DCHECK(transform);
+  transform->GetStreamCount(&input_stream_count, &output_stream_count);
+  SB_DCHECK(1 == input_stream_count);
+  SB_DCHECK(1 == output_stream_count);
+
+  ComPtr<IMFAttributes> attributes = transform->GetAttributes();
+  SB_DCHECK(attributes);
+  CheckResult(attributes->SetUINT32(MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT,
+                                    kMaxOutputSamples));
+
+  UpdateVideoArea(transform->GetCurrentOutputType());
+
+  // The transform must output textures that are bound to shader resources,
+  // or we can't draw them later via ANGLE.
+  ComPtr<IMFAttributes> output_attributes =
+      transform->GetOutputStreamAttributes();
+  SB_DCHECK(output_attributes);
+  CheckResult(output_attributes->SetUINT32(
+      MF_SA_D3D11_BINDFLAGS, D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_DECODER));
+
+  // The resolution and framerate will adjust to the actual content data.
+  D3D11_VIDEO_PROCESSOR_CONTENT_DESC content_desc = {};
+  content_desc.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE;
+  content_desc.InputFrameRate.Numerator = 60;
+  content_desc.InputFrameRate.Denominator = 1;
+  content_desc.InputWidth = kMaxDecodeTargetWidth;
+  content_desc.InputHeight = kMaxDecodeTargetHeight;
+  content_desc.OutputFrameRate.Numerator = 60;
+  content_desc.OutputFrameRate.Denominator = 1;
+  content_desc.OutputWidth = kMaxDecodeTargetWidth;
+  content_desc.OutputHeight = kMaxDecodeTargetHeight;
+  content_desc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL;
+  CheckResult(video_device_->CreateVideoProcessorEnumerator(
+      &content_desc, video_enumerator_.GetAddressOf()));
+  CheckResult(video_device_->CreateVideoProcessor(
+      video_enumerator_.Get(), 0, video_processor_.GetAddressOf()));
+  SB_DCHECK(video_context_);
+  video_context_->VideoProcessorSetStreamFrameFormat(
+      video_processor_.Get(), MediaTransform::kStreamId,
+      D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE);
+  video_context_->VideoProcessorSetStreamAutoProcessingMode(
+      video_processor_.Get(), 0, false);
+}
+
+void VideoDecoder::ShutdownCodec() {
+  SB_DCHECK(!SbThreadIsValid(decoder_thread_));
+  SB_DCHECK(thread_outputs_.empty());
+  if (!decoder_) {
+    return;
+  }
+
+  // Work around a VP9 decoder crash. All IMFSamples and anything that may
+  // reference them indirectly (the d3d texture in SbDecodeTarget) must be
+  // released before releasing the IMFTransform. Do this on the render thread
+  // since graphics resources are being released.
+  graphics_context_provider_->gles_context_runner(
+      graphics_context_provider_, &VideoDecoder::ReleaseDecodeTargets, this);
+
+  // Microsoft recommends stalling to let other systems release their
+  // references to the IMFSamples.
+  if (video_codec_ == kSbMediaVideoCodecVp9) {
+    SbThreadSleep(150 * kSbTimeMillisecond);
+  }
+  decoder_.reset();
+  video_processor_.Reset();
+  video_enumerator_.Reset();
+}
+
+// static
+void VideoDecoder::ReleaseDecodeTargets(void* context) {
+  VideoDecoder* this_ptr = static_cast<VideoDecoder*>(context);
+  while (!this_ptr->prev_decode_targets_.empty()) {
+    SbDecodeTargetRelease(this_ptr->prev_decode_targets_.front());
+    this_ptr->prev_decode_targets_.pop_front();
+  }
+  if (SbDecodeTargetIsValid(this_ptr->current_decode_target_)) {
+    SbDecodeTargetRelease(this_ptr->current_decode_target_);
+    this_ptr->current_decode_target_ = kSbDecodeTargetInvalid;
+  }
+}
+
+void VideoDecoder::EnsureDecoderThreadRunning() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+  // NOTE: The video decoder thread will exit after processing the
+  // kWriteEndOfStream event. In this case, Reset must be called (which will
+  // then StopDecoderThread) before WriteInputBuffer or WriteEndOfStream again.
+  SB_DCHECK(!decoder_thread_stopped_);
+
+  if (!SbThreadIsValid(decoder_thread_)) {
+    if (!decoder_) {
+      error_cb_(kSbPlayerErrorDecode, "Decoder is not valid.");
+      return;
+    }
+    SB_DCHECK(decoder_ != nullptr);
+    SB_DCHECK(thread_events_.empty());
+    decoder_thread_stop_requested_ = false;
+    decoder_thread_ =
+        SbThreadCreate(0, kSbThreadPriorityHigh, kSbThreadNoAffinity, true,
+                       "VideoDecoder", &VideoDecoder::DecoderThreadEntry, this);
+    SB_DCHECK(SbThreadIsValid(decoder_thread_));
+  }
+}
+
+void VideoDecoder::StopDecoderThread() {
+  SB_DCHECK(thread_checker_.CalledOnValidThread());
+  if (SbThreadIsValid(decoder_thread_)) {
+    decoder_thread_stop_requested_ = true;
+    SbThreadJoin(decoder_thread_, nullptr);
+    SB_DCHECK(decoder_thread_stopped_);
+    decoder_thread_stopped_ = false;
+    decoder_thread_ = kSbThreadInvalid;
+  }
+  thread_events_.clear();
+}
+
+void VideoDecoder::UpdateVideoArea(const ComPtr<IMFMediaType>& media) {
+  MFVideoArea video_area;
+  HRESULT hr = media->GetBlob(MF_MT_MINIMUM_DISPLAY_APERTURE,
+                              reinterpret_cast<UINT8*>(&video_area),
+                              sizeof(video_area), nullptr);
+  if (SUCCEEDED(hr)) {
+    video_area_.left = video_area.OffsetX.value;
+    video_area_.top = video_area.OffsetY.value;
+    video_area_.right = video_area_.left + video_area.Area.cx;
+    video_area_.bottom = video_area_.top + video_area.Area.cy;
+    return;
+  }
+
+  UINT32 width;
+  UINT32 height;
+  hr = MFGetAttributeSize(media.Get(), MF_MT_FRAME_SIZE, &width, &height);
+  if (SUCCEEDED(hr)) {
+    video_area_.left = 0;
+    video_area_.top = 0;
+    video_area_.right = width;
+    video_area_.bottom = height;
+    return;
+  }
+
+  SB_NOTREACHED() << "Could not determine new video output resolution";
+}
+
+scoped_refptr<VideoFrame> VideoDecoder::CreateVideoFrame(
+    const ComPtr<IMFSample>& sample) {
+  // NOTE: All samples must be released before flushing the decoder. Since
+  // the host may hang onto VideoFrames that are created here, make them
+  // weak references to the actual sample.
+  LONGLONG win32_sample_time = 0;
+  CheckResult(sample->GetSampleTime(&win32_sample_time));
+  SbTime sample_time = ConvertToSbTime(win32_sample_time);
+
+  thread_lock_.Acquire();
+  thread_outputs_.emplace_back(sample_time, video_area_, sample);
+  thread_lock_.Release();
+
+  // The "native texture" for the VideoFrame is actually just the timestamp
+  // for the output sample.
+  return new VideoFrameImpl(
+      sample_time, std::bind(&VideoDecoder::DeleteVideoFrame, this, _1));
+}
+
+void VideoDecoder::DeleteVideoFrame(VideoFrame* video_frame) {
+  ScopedLock lock(thread_lock_);
+  for (auto iter = thread_outputs_.begin(); iter != thread_outputs_.end();
+       ++iter) {
+    if (iter->time == video_frame->timestamp()) {
+      thread_outputs_.erase(iter);
+      break;
+    }
+  }
+}
+
+void VideoDecoder::DecoderThreadRun() {
+  std::list<std::unique_ptr<Event> > priming_events;
+  std::unique_ptr<Event> event;
+  bool is_end_of_stream = false;
+
+  while (!decoder_thread_stop_requested_) {
+    int outputs_to_process = 1;
+    bool wrote_input = false;
+    bool read_output = false;
+
+    // Process a new event or re-try the previous event.
+    if (event == nullptr) {
+      ScopedLock lock(thread_lock_);
+      if (!thread_events_.empty()) {
+        event.swap(thread_events_.front());
+        thread_events_.pop_front();
+      }
+    }
+
+    if (event == nullptr) {
+      SbThreadSleep(kSbTimeMillisecond);
+    } else {
+      switch (event->type) {
+        case Event::kWriteInputBuffer:
+          SB_DCHECK(event->input_buffer != nullptr);
+          if (decoder_->TryWriteInputBuffer(event->input_buffer, 0)) {
+            if (priming_output_count_ > 0) {
+              // Save this event for the actual playback.
+              priming_events.emplace_back(event.release());
+            }
+            // The event was successfully processed. Discard it.
+            event.reset();
+            wrote_input = true;
+          } else {
+            // The decoder must be full. Re-try the event on the next
+            // iteration. Additionally, try reading an extra output frame to
+            // start draining the decoder.
+            ++outputs_to_process;
+          }
+          break;
+        case Event::kWriteEndOfStream:
+          if (priming_output_count_ > 0) {
+            // Finish priming when eos is encountered.
+            priming_output_count_ = 0;
+            thread_lock_.Acquire();
+            while (!priming_events.empty()) {
+              thread_events_.emplace_front(priming_events.back().release());
+              priming_events.pop_back();
+            }
+            // Also append the eos event.
+            thread_events_.emplace_back(event.release());
+            thread_lock_.Release();
+            decoder_->Reset();
+            break;
+          }
+          event.reset();
+          decoder_->Drain();
+          is_end_of_stream = true;
+          wrote_input = true;
+          break;
+      }
+    }
+
+    // Process output frame(s).
+    for (int outputs = 0; outputs < outputs_to_process; ++outputs) {
+      // NOTE: IMFTransform::ProcessOutput (called by decoder_->ProcessAndRead)
+      // may stall if the number of active IMFSamples would exceed the value of
+      // MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT.
+      thread_lock_.Acquire();
+      bool input_full = thread_events_.size() >= kMaxInputSamples;
+      bool output_full = thread_outputs_.size() >= kMaxOutputSamples;
+      thread_lock_.Release();
+
+      Status status = input_full ? kBufferFull : kNeedMoreInput;
+      decoder_status_cb_(status, nullptr);
+
+      if (output_full) {
+        // Wait for the active samples to be consumed before polling for more.
+        break;
+      }
+
+      ComPtr<IMFSample> sample;
+      ComPtr<IMFMediaType> media_type;
+      decoder_->ProcessAndRead(&sample, &media_type);
+      if (media_type) {
+        UpdateVideoArea(media_type);
+      }
+      if (sample) {
+        if (priming_output_count_ > 0) {
+          // Ignore the output samples while priming the decoder.
+          if (--priming_output_count_ == 0) {
+            // Replay all the priming events once priming is finished.
+            if (event != nullptr) {
+              priming_events.emplace_back(event.release());
+            }
+            thread_lock_.Acquire();
+            while (!priming_events.empty()) {
+              thread_events_.emplace_front(priming_events.back().release());
+              priming_events.pop_back();
+            }
+            thread_lock_.Release();
+            decoder_->Reset();
+          }
+        } else {
+          decoder_status_cb_(status, CreateVideoFrame(sample));
+        }
+        read_output = true;
+      } else if (is_end_of_stream) {
+        decoder_status_cb_(kBufferFull, VideoFrame::CreateEOSFrame());
+        return;
+      }
+    }
+
+    if (!wrote_input && !read_output) {
+      // Throttle decode loop since no I/O was possible.
+      SbThreadSleep(kSbTimeMillisecond);
+    }
+  }
+}
+
+// static
+void* VideoDecoder::DecoderThreadEntry(void* context) {
+  SB_DCHECK(context);
+  VideoDecoder* decoder = static_cast<VideoDecoder*>(context);
+  decoder->DecoderThreadRun();
+  decoder->decoder_thread_stopped_ = true;
+  return nullptr;
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/video_decoder.h b/starboard/shared/win32/video_decoder.h
new file mode 100644
index 0000000..2186963
--- /dev/null
+++ b/starboard/shared/win32/video_decoder.h
@@ -0,0 +1,165 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_VIDEO_DECODER_H_
+#define STARBOARD_SHARED_WIN32_VIDEO_DECODER_H_
+
+#include <D3d11_1.h>
+#include <wrl/client.h>
+
+#include <list>
+#include <memory>
+
+#include "starboard/common/mutex.h"
+#include "starboard/common/ref_counted.h"
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/configuration.h"
+#include "starboard/decode_target.h"
+#include "starboard/shared/starboard/player/filter/video_decoder_internal.h"
+#include "starboard/shared/starboard/thread_checker.h"
+#include "starboard/shared/win32/decrypting_decoder.h"
+#include "starboard/thread.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+class VideoDecoder
+    : public ::starboard::shared::starboard::player::filter::VideoDecoder {
+ public:
+  VideoDecoder(SbMediaVideoCodec video_codec,
+               SbPlayerOutputMode output_mode,
+               SbDecodeTargetGraphicsContextProvider* graphics_context_provider,
+               SbDrmSystem drm_system,
+               bool is_hdr_supported = false);
+  ~VideoDecoder() override;
+
+  // Queries for support without creating the vp9 decoder. The function caches
+  // the result for the first call.  Note that the first call to this function
+  // isn't thread safe and is supposed to be called on startup.
+  static bool IsHardwareVp9DecoderSupported(bool is_hdr_required = false);
+
+  bool IsHdrSupported() const { return is_hdr_supported_; }
+
+  // Implement VideoDecoder interface.
+  void Initialize(const DecoderStatusCB& decoder_status_cb,
+                  const ErrorCB& error_cb) override;
+  size_t GetPrerollFrameCount() const override;
+  SbTime GetPrerollTimeout() const override { return kSbTimeMax; }
+  size_t GetMaxNumberOfCachedFrames() const override;
+
+  void WriteInputBuffer(
+      const scoped_refptr<InputBuffer>& input_buffer) override;
+  void WriteEndOfStream() override;
+  void Reset() override;
+  SbDecodeTarget GetCurrentDecodeTarget() override;
+
+ private:
+  template <typename T>
+  using ComPtr = Microsoft::WRL::ComPtr<T>;
+
+  struct Event {
+    enum Type {
+      kWriteInputBuffer,
+      kWriteEndOfStream,
+    };
+    Type type;
+    scoped_refptr<InputBuffer> input_buffer;
+  };
+
+  struct Output {
+    Output(SbTime time,
+           const RECT& video_area,
+           const ComPtr<IMFSample>& video_sample)
+        : time(time), video_area(video_area), video_sample(video_sample) {}
+    SbTime time;
+    RECT video_area;
+    ComPtr<IMFSample> video_sample;
+  };
+
+  // This function returns false if HDR video is played, but HDR support is
+  // lost. Otherwise it returns true. For inherited class it also updates HDMI
+  // color metadata and sets HDR mode for Angle, if the video stream is HDR
+  // stream.
+  virtual bool TryUpdateOutputForHdrVideo(const SbMediaVideoSampleInfo&) {
+    return true;
+  }
+
+  void InitializeCodec();
+  void ShutdownCodec();
+  static void ReleaseDecodeTargets(void* context);
+
+  void UpdateVideoArea(const ComPtr<IMFMediaType>& media);
+  scoped_refptr<VideoFrame> CreateVideoFrame(const ComPtr<IMFSample>& sample);
+  void DeleteVideoFrame(VideoFrame* video_frame);
+  SbDecodeTarget CreateDecodeTarget();
+
+  void EnsureDecoderThreadRunning();
+  void StopDecoderThread();
+  void DecoderThreadRun();
+  static void* DecoderThreadEntry(void* context);
+
+  ::starboard::shared::starboard::ThreadChecker thread_checker_;
+
+  // These variables will be initialized inside ctor or Initialize() and will
+  // not be changed during the life time of this class.
+  const SbMediaVideoCodec video_codec_;
+  DecoderStatusCB decoder_status_cb_;
+  ErrorCB error_cb_;
+  SbDecodeTargetGraphicsContextProvider* graphics_context_provider_;
+  SbDrmSystem const drm_system_;
+
+  // These are platform-specific objects required to create and use a codec.
+  ComPtr<ID3D11Device> d3d_device_;
+  ComPtr<IMFDXGIDeviceManager> device_manager_;
+  ComPtr<ID3D11VideoDevice1> video_device_;
+  ComPtr<ID3D11VideoContext> video_context_;
+  ComPtr<ID3D11VideoProcessorEnumerator> video_enumerator_;
+  ComPtr<ID3D11VideoProcessor> video_processor_;
+
+  scoped_ptr<DecryptingDecoder> decoder_;
+  RECT video_area_;
+
+  SbThread decoder_thread_ = kSbThreadInvalid;
+  volatile bool decoder_thread_stop_requested_ = false;
+  bool decoder_thread_stopped_ = false;
+  Mutex thread_lock_;
+  std::list<std::unique_ptr<Event> > thread_events_;
+
+  // This structure shadows the list of outstanding frames held by the host.
+  // When a new output is added to this structure, the host should be notified
+  // of a new VideoFrame. When the host deletes the VideoFrame, the delete
+  // callback is used to update this structure. The VideoDecoder may need to
+  // delete outputs without notifying the host. In such a situation, the host's
+  // VideoFrames will be invalid if they still require the IMFSample; it's
+  // possible that the VideoFrame was converted to a texture already, so it
+  // will continue to be valid since the IMFSample is no longer needed.
+  Mutex outputs_reset_lock_;
+  std::list<Output> thread_outputs_;
+
+  // To workaround the startup hitch for VP9, exercise the decoder for a
+  // certain number of frames while prerolling the initial playback.
+  int priming_output_count_;
+
+  SbDecodeTarget current_decode_target_ = kSbDecodeTargetInvalid;
+  std::list<SbDecodeTarget> prev_decode_targets_;
+
+  bool is_hdr_supported_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_VIDEO_DECODER_H_
diff --git a/starboard/shared/win32/wchar_utils.h b/starboard/shared/win32/wchar_utils.h
new file mode 100644
index 0000000..7ee0960
--- /dev/null
+++ b/starboard/shared/win32/wchar_utils.h
@@ -0,0 +1,58 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_WCHAR_UTILS_H_
+#define STARBOARD_SHARED_WIN32_WCHAR_UTILS_H_
+
+#include <codecvt>
+#include <cwchar>
+#include <locale>
+#include <string>
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+inline std::string wchar_tToUTF8(const wchar_t* const str) {
+  std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
+  return converter.to_bytes(str);
+}
+
+inline std::string wchar_tToUTF8(const wchar_t* const str,
+                                 const std::size_t size) {
+  std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
+  return converter.to_bytes(str, str + size);
+}
+
+inline std::wstring CStringToWString(const char* str) {
+  std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
+  return converter.from_bytes(str);
+}
+
+#if defined(__cplusplus_winrt)
+inline std::string platformStringToString(Platform::String^ to_convert) {
+  std::wstring ws(to_convert->Begin(), to_convert->End());
+  return wchar_tToUTF8(ws.data(), ws.size());
+}
+
+inline Platform::String^ stringToPlatformString(const std::string& to_convert) {
+  return ref new Platform::String(CStringToWString(to_convert.c_str()).c_str());
+}
+#endif
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_WCHAR_UTILS_H_
diff --git a/starboard/shared/win32/win32_audio_decoder.cc b/starboard/shared/win32/win32_audio_decoder.cc
new file mode 100644
index 0000000..df49374
--- /dev/null
+++ b/starboard/shared/win32/win32_audio_decoder.cc
@@ -0,0 +1,202 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/win32_audio_decoder.h"
+
+#include <algorithm>
+#include <queue>
+
+#include "starboard/atomic.h"
+#include "starboard/shared/starboard/thread_checker.h"
+#include "starboard/shared/win32/atomic_queue.h"
+#include "starboard/shared/win32/audio_decoder.h"
+#include "starboard/shared/win32/audio_transform.h"
+#include "starboard/shared/win32/decrypting_decoder.h"
+#include "starboard/shared/win32/error_utils.h"
+#include "starboard/shared/win32/media_foundation_utils.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+using Microsoft::WRL::ComPtr;
+using ::starboard::shared::starboard::ThreadChecker;
+using ::starboard::shared::win32::CreateAudioTransform;
+
+const size_t kAacSamplesPerFrame = 1024;
+// We are using float samples on Xb1.
+const size_t kBytesPerSample = sizeof(float);
+
+namespace {
+
+class AbstractWin32AudioDecoderImpl : public AbstractWin32AudioDecoder {
+ public:
+  AbstractWin32AudioDecoderImpl(SbMediaAudioCodec codec,
+                                SbMediaAudioFrameStorageType audio_frame_fmt,
+                                SbMediaAudioSampleType sample_type,
+                                const SbMediaAudioSampleInfo& audio_sample_info,
+                                SbDrmSystem drm_system)
+      : thread_checker_(ThreadChecker::kSetThreadIdOnFirstCheck),
+        codec_(codec),
+        audio_frame_fmt_(audio_frame_fmt),
+        sample_type_(sample_type),
+        number_of_channels_(audio_sample_info.number_of_channels),
+        heaac_detected_(false),
+        samples_per_second_(
+            static_cast<int>(audio_sample_info.samples_per_second)) {
+    scoped_ptr<MediaTransform> audio_decoder =
+        CreateAudioTransform(audio_sample_info, codec_);
+    impl_.reset(
+        new DecryptingDecoder("audio", audio_decoder.Pass(), drm_system));
+  }
+
+  void Consume(ComPtr<IMFSample> sample) {
+    DWORD buff_count = 0;
+    HRESULT hr = sample->GetBufferCount(&buff_count);
+    CheckResult(hr);
+    SB_DCHECK(buff_count == 1);
+
+    ComPtr<IMFMediaBuffer> media_buffer;
+    hr = sample->GetBufferByIndex(0, &media_buffer);
+    if (FAILED(hr)) {
+      return;
+    }
+
+    LONGLONG win32_timestamp = 0;
+    hr = sample->GetSampleTime(&win32_timestamp);
+    CheckResult(hr);
+
+    BYTE* buffer;
+    DWORD length;
+    hr = media_buffer->Lock(&buffer, NULL, &length);
+    CheckResult(hr);
+    SB_DCHECK(length);
+
+    const uint8_t* data = reinterpret_cast<uint8_t*>(buffer);
+    const size_t data_size = static_cast<size_t>(length);
+
+    const size_t expect_size_in_bytes =
+        number_of_channels_ * kAacSamplesPerFrame * kBytesPerSample;
+    if (data_size / expect_size_in_bytes == 2) {
+      heaac_detected_.store(true);
+    }
+
+    const size_t decoded_data_size = std::max(expect_size_in_bytes, data_size);
+
+    DecodedAudioPtr data_ptr(
+        new DecodedAudio(number_of_channels_, sample_type_, audio_frame_fmt_,
+                         ConvertToSbTime(win32_timestamp), decoded_data_size));
+
+    std::copy(data, data + data_size, data_ptr->buffer());
+    std::memset(data_ptr->buffer() + data_size, 0,
+                decoded_data_size - data_size);
+
+    output_queue_.push(data_ptr);
+    media_buffer->Unlock();
+  }
+
+  bool TryWrite(const scoped_refptr<InputBuffer>& buff) override {
+    SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+    // The incoming audio is in ADTS format which has a 7 bytes header.  But
+    // the audio decoder is configured to accept raw AAC.  So we have to adjust
+    // the data, size, and subsample mapping to skip the ADTS header.
+    const int kADTSHeaderSize = 7;
+    const bool write_ok = impl_->TryWriteInputBuffer(buff, kADTSHeaderSize);
+    return write_ok;
+  }
+
+  void WriteEndOfStream() override {
+    SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+    impl_->Drain();
+    ComPtr<IMFSample> sample;
+    ComPtr<IMFMediaType> media_type;
+    while (impl_->ProcessAndRead(&sample, &media_type)) {
+      if (sample) {
+        Consume(sample);
+      }
+    }
+    output_queue_.push(new DecodedAudio);
+  }
+
+  scoped_refptr<DecodedAudio> ProcessAndRead() override {
+    SB_DCHECK(thread_checker_.CalledOnValidThread());
+
+    ComPtr<IMFSample> sample;
+    ComPtr<IMFMediaType> media_type;
+    while (impl_->ProcessAndRead(&sample, &media_type)) {
+      if (sample) {
+        Consume(sample);
+      }
+    }
+    if (output_queue_.empty()) {
+      return NULL;
+    }
+    scoped_refptr<DecodedAudio> output = output_queue_.front();
+    output_queue_.pop();
+    return output;
+  }
+
+  void Reset() override {
+    impl_->Reset();
+    std::queue<DecodedAudioPtr> empty;
+    output_queue_.swap(empty);
+    thread_checker_.Detach();
+  }
+
+  int GetSamplesPerSecond() const override {
+    if (heaac_detected_.load()) {
+      return samples_per_second_ * 2;
+    }
+    return samples_per_second_;
+  }
+
+  // The object is single-threaded and is driven by a dedicated thread.
+  // However the thread may gets destroyed and re-created over the life time of
+  // this object.  We enforce that certain member functions can only called
+  // from one thread while still allows this object to be driven by different
+  // threads by:
+  // 1. The |thread_checker_| is initially created without attaching to any
+  //    thread.
+  // 2. When a thread is destroyed, Reset() will be called which in turn calls
+  //    Detach() on the |thread_checker_| to allow the object to attach to a
+  //    new thread.
+  ::starboard::shared::starboard::ThreadChecker thread_checker_;
+  const SbMediaAudioCodec codec_;
+  const SbMediaAudioSampleType sample_type_;
+  const SbMediaAudioFrameStorageType audio_frame_fmt_;
+  scoped_ptr<DecryptingDecoder> impl_;
+  std::queue<DecodedAudioPtr> output_queue_;
+  uint16_t number_of_channels_;
+  atomic_bool heaac_detected_;
+  int samples_per_second_;
+};
+
+}  // anonymous namespace.
+
+scoped_ptr<AbstractWin32AudioDecoder> AbstractWin32AudioDecoder::Create(
+    SbMediaAudioCodec code,
+    SbMediaAudioFrameStorageType audio_frame_fmt,
+    SbMediaAudioSampleType sample_type,
+    const SbMediaAudioSampleInfo& audio_sample_info,
+    SbDrmSystem drm_system) {
+  return scoped_ptr<AbstractWin32AudioDecoder>(
+      new AbstractWin32AudioDecoderImpl(code, audio_frame_fmt, sample_type,
+                                        audio_sample_info, drm_system));
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/win32_audio_decoder.h b/starboard/shared/win32/win32_audio_decoder.h
new file mode 100644
index 0000000..c174310
--- /dev/null
+++ b/starboard/shared/win32/win32_audio_decoder.h
@@ -0,0 +1,61 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_WIN32_AUDIO_DECODER_H_
+#define STARBOARD_SHARED_WIN32_WIN32_AUDIO_DECODER_H_
+
+#include <vector>
+
+#include "starboard/common/ref_counted.h"
+#include "starboard/common/scoped_ptr.h"
+#include "starboard/drm.h"
+#include "starboard/media.h"
+#include "starboard/shared/starboard/player/decoded_audio_internal.h"
+#include "starboard/shared/win32/media_common.h"
+#include "starboard/types.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+// AudioDecoder for Win32.
+class AbstractWin32AudioDecoder {
+ public:
+  static scoped_ptr<AbstractWin32AudioDecoder> Create(
+      SbMediaAudioCodec codec,
+      SbMediaAudioFrameStorageType audio_frame_fmt,
+      SbMediaAudioSampleType sample_type,
+      const SbMediaAudioSampleInfo& audio_sample_info,
+      SbDrmSystem drm_system);
+  virtual ~AbstractWin32AudioDecoder() {}
+
+  // INPUT:
+  //
+  virtual bool TryWrite(const scoped_refptr<InputBuffer>& buff) = 0;
+  virtual void WriteEndOfStream() = 0;
+  // OUTPUT
+  //
+  virtual DecodedAudioPtr ProcessAndRead() = 0;
+  // Reset
+  virtual void Reset() = 0;
+
+  // Dynamically query the audio frequency to support HE-AAC.
+  virtual int GetSamplesPerSecond() const = 0;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_WIN32_AUDIO_DECODER_H_
diff --git a/starboard/shared/win32/window_create.cc b/starboard/shared/win32/window_create.cc
new file mode 100644
index 0000000..72c009d
--- /dev/null
+++ b/starboard/shared/win32/window_create.cc
@@ -0,0 +1,23 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/window.h"
+
+#include "starboard/shared/win32/application_win32.h"
+
+using ::starboard::shared::win32::ApplicationWin32;
+
+SbWindow SbWindowCreate(const SbWindowOptions* options) {
+  return ApplicationWin32::Get()->CreateWindowForWin32(options);
+}
diff --git a/starboard/shared/win32/window_destroy.cc b/starboard/shared/win32/window_destroy.cc
new file mode 100644
index 0000000..34a8c54
--- /dev/null
+++ b/starboard/shared/win32/window_destroy.cc
@@ -0,0 +1,22 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/application_win32.h"
+#include "starboard/window.h"
+
+using ::starboard::shared::win32::ApplicationWin32;
+
+bool SbWindowDestroy(SbWindow window) {
+  return ApplicationWin32::Get()->DestroyWindow(window);
+}
diff --git a/starboard/shared/win32/window_get_platform_handle.cc b/starboard/shared/win32/window_get_platform_handle.cc
new file mode 100644
index 0000000..566cf47
--- /dev/null
+++ b/starboard/shared/win32/window_get_platform_handle.cc
@@ -0,0 +1,26 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <EGL/egl.h>
+
+#include "starboard/shared/win32/window_internal.h"
+#include "starboard/window.h"
+
+void* SbWindowGetPlatformHandle(SbWindow window) {
+  if (!SbWindowIsValid(window)) {
+    return NULL;
+  }
+
+  return reinterpret_cast<EGLNativeWindowType>(window->GetWindowHandle());
+}
diff --git a/starboard/shared/win32/window_get_size.cc b/starboard/shared/win32/window_get_size.cc
new file mode 100644
index 0000000..6ca581b
--- /dev/null
+++ b/starboard/shared/win32/window_get_size.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/common/log.h"
+#include "starboard/shared/win32/window_internal.h"
+#include "starboard/window.h"
+
+bool SbWindowGetSize(SbWindow window, SbWindowSize* size) {
+  if (!SbWindowIsValid(window)) {
+    SB_LOG(ERROR) << __FUNCTION__ << ": Invalid window.";
+    return false;
+  }
+
+  size->width = window->width;
+  size->height = window->height;
+  // The video resolution is the same as the graphics resolution.
+  size->video_pixel_ratio = 1.0f;
+  return true;
+}
diff --git a/starboard/shared/win32/window_internal.cc b/starboard/shared/win32/window_internal.cc
new file mode 100644
index 0000000..02939b3
--- /dev/null
+++ b/starboard/shared/win32/window_internal.cc
@@ -0,0 +1,32 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/window_internal.h"
+
+// TODO: Make sure the width and height here behave well given that we want
+// 1080 video, but perhaps 4k UI where applicable.
+SbWindowPrivate::SbWindowPrivate(const SbWindowOptions* options,
+                                 HWND window_handle)
+    : width(options->size.width),
+      height(options->size.height),
+      window_handle_(window_handle) {
+  RECT window_client_rect;
+
+  if (GetClientRect(window_handle_, &window_client_rect)) {
+    width = window_client_rect.right - window_client_rect.left;
+    height = window_client_rect.bottom - window_client_rect.top;
+  }
+}
+
+SbWindowPrivate::~SbWindowPrivate() {}
diff --git a/starboard/shared/win32/window_internal.h b/starboard/shared/win32/window_internal.h
new file mode 100644
index 0000000..10e6cfb
--- /dev/null
+++ b/starboard/shared/win32/window_internal.h
@@ -0,0 +1,43 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_WINDOW_INTERNAL_H_
+#define STARBOARD_SHARED_WIN32_WINDOW_INTERNAL_H_
+
+#include <EGL/egl.h>
+
+// Windows headers.
+#include <windows.h>
+
+#include "starboard/atomic.h"
+#include "starboard/time.h"
+#include "starboard/window.h"
+
+struct SbWindowPrivate {
+  SbWindowPrivate(const SbWindowOptions* options, HWND window_handle);
+  ~SbWindowPrivate();
+
+  HWND GetWindowHandle() { return window_handle_; }
+
+  // The width of this window.
+  int width;
+
+  // The height of this window.
+  int height;
+
+ private:
+  HWND window_handle_;
+};
+
+#endif  // STARBOARD_SHARED_WIN32_WINDOW_INTERNAL_H_
diff --git a/starboard/shared/win32/window_set_default_options.cc b/starboard/shared/win32/window_set_default_options.cc
new file mode 100644
index 0000000..f0f124f
--- /dev/null
+++ b/starboard/shared/win32/window_set_default_options.cc
@@ -0,0 +1,23 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/memory.h"
+#include "starboard/window.h"
+
+void SbWindowSetDefaultOptions(SbWindowOptions* options) {
+  memset(options, 0, sizeof(*options));
+  options->size.width = 1920;
+  options->size.height = 1080;
+  options->name = "YouTube";
+}
diff --git a/starboard/shared/win32/wrm_header.cc b/starboard/shared/win32/wrm_header.cc
new file mode 100644
index 0000000..71003d3
--- /dev/null
+++ b/starboard/shared/win32/wrm_header.cc
@@ -0,0 +1,395 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/wrm_header.h"
+
+#include <guiddef.h>
+#include <initguid.h>
+
+#include <algorithm>
+
+#include "starboard/common/byte_swap.h"
+#include "starboard/memory.h"
+#include "starboard/shared/win32/error_utils.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+using Microsoft::WRL::ComPtr;
+
+namespace {
+
+// The playready system id used to create the content header.
+DEFINE_GUID(kPlayreadyContentHeaderCLSID,
+            0xF4637010,
+            0x03C3,
+            0x42CD,
+            0xB9,
+            0x32,
+            0xB4,
+            0x8A,
+            0xDF,
+            0x3A,
+            0x6A,
+            0x54);
+
+// The playready system id used to identify the wrm header in the
+// initialization data.
+DEFINE_GUID(kPlayreadyInitializationDataCLSID,
+            0x79f0049a,
+            0x4098,
+            0x8642,
+            0xab,
+            0x92,
+            0xe6,
+            0x5b,
+            0xe0,
+            0x88,
+            0x5f,
+            0x95);
+
+const uint16_t kPlayreadyWRMTag = 0x0001;
+
+class Reader {
+ public:
+  Reader(const uint8_t* data, size_t length)
+      : start_(data), curr_(data), end_(data + length) {}
+
+  size_t GetPosition() const { return curr_ - start_; }
+  size_t GetRemaining() const { return end_ - curr_; }
+
+  const uint8_t* curr() const { curr_; }
+
+  bool Skip(size_t distance) {
+    if (distance > GetRemaining())
+      return false;
+    curr_ += distance;
+    return true;
+  }
+
+  bool ReadGUID(GUID* guid) {
+    if (sizeof(*guid) > GetRemaining()) {
+      return false;
+    }
+    memcpy(guid, curr_, sizeof(*guid));
+    curr_ += sizeof(*guid);
+    return true;
+  }
+
+  bool ReadBigEndianU32(uint32_t* i) {
+    if (sizeof(*i) > GetRemaining())
+      return false;
+    *i =
+        curr_[0] * 0x1000000 + curr_[1] * 0x10000 + curr_[2] * 0x100 + curr_[3];
+    curr_ += sizeof(*i);
+    return true;
+  }
+
+  bool ReadLittleEndianU16(uint16_t* i) {
+    if (sizeof(*i) > GetRemaining())
+      return false;
+    *i = curr_[0] + curr_[1] * 0x100;
+    curr_ += sizeof(*i);
+    return true;
+  }
+
+ private:
+  const uint8_t* const start_;
+  const uint8_t* curr_;
+  const uint8_t* const end_;
+};
+
+std::vector<uint8_t> ParseWrmHeaderFromInitializationData(
+    const void* initialization_data,
+    int initialization_data_size) {
+  if (initialization_data_size == 0) {
+    SB_NOTIMPLEMENTED();
+    return std::vector<uint8_t>();
+  }
+
+  std::vector<uint8_t> output;
+  const uint8_t* data = static_cast<const uint8_t*>(initialization_data);
+
+  Reader reader(data, initialization_data_size);
+  while (reader.GetRemaining() > 0) {
+    // Parse pssh atom (big endian)
+    //
+    // 4 bytes -- size
+    // 4 bytes -- "pssh"
+    // 4 bytes -- flags
+    // 16 bytes -- guid
+    uint32_t pssh_size;
+    if (!reader.ReadBigEndianU32(&pssh_size)) {
+      return output;
+    }
+
+    // Skipping pssh and flags
+    if (!reader.Skip(8)) {
+      return output;
+    }
+    GUID system_id;
+    if (!reader.ReadGUID(&system_id)) {
+      return output;
+    }
+    if (system_id != kPlayreadyInitializationDataCLSID) {
+      // Skip entire pssh atom
+      if (!reader.Skip(pssh_size - 28)) {
+        return output;
+      }
+      continue;
+    }
+
+    // 4 bytes -- size of PlayreadyObject
+    // followed by PlayreadyObject
+
+    // Skip size, and continue parsing
+    if (!reader.Skip(4)) {
+      return output;
+    }
+
+    // Parse Playready object (little endian)
+    // 4 bytes -- size
+    // 2 bytes -- record count
+    //
+    // Playready Record
+    // 2 bytes -- type
+    // 2 bytes -- size of record
+    // n bytes -- record
+    if (!reader.Skip(4)) {
+      return output;
+    }
+    uint16_t num_records;
+    if (!reader.ReadLittleEndianU16(&num_records)) {
+      return output;
+    }
+
+    for (int i = 0; i < num_records; i++) {
+      uint16_t record_type;
+      if (!reader.ReadLittleEndianU16(&record_type)) {
+        return output;
+      }
+      uint16_t record_size;
+      if (!reader.ReadLittleEndianU16(&record_size)) {
+        return output;
+      }
+      if ((record_type & kPlayreadyWRMTag) == kPlayreadyWRMTag) {
+        std::copy(data + reader.GetPosition(),
+                  data + reader.GetPosition() + record_size,
+                  std::back_inserter(output));
+        return output;
+      }
+      if (!reader.Skip(record_size)) {
+        return output;
+      }
+    }
+  }
+
+  return output;
+}
+
+uint32_t Base64ToValue(uint8_t byte) {
+  if (byte >= 'A' && byte <= 'Z') {
+    return byte - 'A';
+  }
+  if (byte >= 'a' && byte <= 'z') {
+    return byte - 'a' + 26;
+  }
+  if (byte >= '0' && byte <= '9') {
+    return byte - '0' + 52;
+  }
+  if (byte == '+') {
+    return 62;
+  }
+  if (byte == '/') {
+    return 63;
+  }
+  SB_DCHECK(byte == '=');
+  return 0;
+}
+
+std::string Base64Decode(const std::wstring& input) {
+  SB_DCHECK(input.size() % 4 == 0);
+
+  std::string output;
+
+  output.reserve(input.size() / 4 * 3);
+  for (size_t i = 0; i < input.size() - 3; i += 4) {
+    uint32_t decoded =
+        Base64ToValue(input[i]) * 4 + Base64ToValue(input[i + 1]) / 16;
+    output += static_cast<char>(decoded);
+    if (input[i + 2] != '=') {
+      decoded = Base64ToValue(input[i + 1]) % 16 * 16 +
+                Base64ToValue(input[i + 2]) / 4;
+      output += static_cast<char>(decoded);
+      if (input[i + 3] != '=') {
+        decoded =
+            Base64ToValue(input[i + 2]) % 4 * 64 + Base64ToValue(input[i + 3]);
+        output += static_cast<char>(decoded);
+      }
+    }
+  }
+
+  return output;
+}
+
+GUID ParseKeyIdFromWrmHeader(const std::vector<uint8_t>& wrm_header) {
+  // The wrm_header is an XML in wchar_t that contains the base64 encoded key
+  // id in <KID> node in base64.  The original key id should be 16 characters,
+  // so it is 24 characters after based64 encoded.
+  const size_t kEncodedKeyIdLength = 24;
+
+  SB_DCHECK(wrm_header.size() % 2 == 0);
+  std::wstring wrm_header_copy(
+      reinterpret_cast<const wchar_t*>(wrm_header.data()),
+      wrm_header.size() / 2);
+  std::wstring::size_type begin = wrm_header_copy.find(L"<KID>");
+  if (begin == wrm_header_copy.npos) {
+    return WrmHeader::kInvalidKeyId;
+  }
+  std::wstring::size_type end = wrm_header_copy.find(L"</KID>", begin);
+  if (end == wrm_header_copy.npos) {
+    return WrmHeader::kInvalidKeyId;
+  }
+  begin += 5;
+  if (end - begin != kEncodedKeyIdLength) {
+    return WrmHeader::kInvalidKeyId;
+  }
+
+  std::string key_id_in_string =
+      Base64Decode(wrm_header_copy.substr(begin, kEncodedKeyIdLength));
+  if (key_id_in_string.size() != sizeof(GUID)) {
+    return WrmHeader::kInvalidKeyId;
+  }
+
+  GUID key_id = *reinterpret_cast<const GUID*>(key_id_in_string.data());
+
+  key_id.Data1 = SbByteSwap(key_id.Data1);
+  key_id.Data2 = SbByteSwap(key_id.Data2);
+  key_id.Data3 = SbByteSwap(key_id.Data3);
+
+  return key_id;
+}
+
+ComPtr<IStream> CreateWrmHeaderStream(const std::vector<uint8_t>& wrm_header) {
+  ComPtr<IStream> stream;
+  HRESULT hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
+  if (FAILED(hr)) {
+    return NULL;
+  }
+
+  DWORD wrm_header_size = static_cast<DWORD>(wrm_header.size());
+  ULONG bytes_written = 0;
+
+  if (wrm_header_size != 0) {
+    hr = stream->Write(wrm_header.data(), wrm_header_size, &bytes_written);
+    if (FAILED(hr)) {
+      return NULL;
+    }
+  }
+
+  return stream;
+}
+
+ComPtr<IStream> CreateContentHeaderFromWrmHeader(
+    const std::vector<uint8_t>& wrm_header) {
+  ComPtr<IStream> content_header;
+  // Assume we use one license for one stream.
+  const DWORD kNumStreams = 1;
+  const DWORD kNextStreamId = static_cast<DWORD>(-1);
+
+  HRESULT hr = CreateStreamOnHGlobal(NULL, TRUE, &content_header);
+  if (FAILED(hr)) {
+    return NULL;
+  }
+
+  // Initialize spInitStm with the required data
+  // Format: (All DWORD values are serialized in little-endian order)
+  // [GUID (content protection system guid, see msprita.idl)]
+  // [DWORD (stream count, use the actual stream count even if all streams are
+  // encrypted using the same data, note that zero is invalid)] [DWORD (next
+  // stream ID, use -1 if all remaining streams are encrypted using the same
+  // data)] [DWORD (next stream's binary data size)] [BYTE* (next stream's
+  // binary data)] { Repeat from "next stream ID" above for each stream }
+  DWORD wrm_header_size = static_cast<DWORD>(wrm_header.size());
+  ULONG bytes_written = 0;
+  hr = content_header->Write(&kPlayreadyContentHeaderCLSID,
+                             sizeof(kPlayreadyContentHeaderCLSID),
+                             &bytes_written);
+  if (FAILED(hr)) {
+    return NULL;
+  }
+
+  hr = content_header->Write(&kNumStreams, sizeof(kNumStreams), &bytes_written);
+  if (FAILED(hr)) {
+    return NULL;
+  }
+
+  hr = content_header->Write(&kNextStreamId, sizeof(kNextStreamId),
+                             &bytes_written);
+  if (FAILED(hr)) {
+    return NULL;
+  }
+
+  hr = content_header->Write(&wrm_header_size, sizeof(wrm_header_size),
+                             &bytes_written);
+  if (FAILED(hr)) {
+    return NULL;
+  }
+
+  if (0 != wrm_header_size) {
+    hr = content_header->Write(wrm_header.data(), wrm_header_size,
+                               &bytes_written);
+    if (FAILED(hr)) {
+      return NULL;
+    }
+  }
+
+  return content_header;
+}
+
+ComPtr<IStream> ResetStreamPosition(const ComPtr<IStream>& stream) {
+  if (stream == NULL) {
+    return NULL;
+  }
+  LARGE_INTEGER seek_position = {0};
+  HRESULT hr = stream->Seek(seek_position, STREAM_SEEK_SET, NULL);
+  CheckResult(hr);
+  return stream;
+}
+
+}  // namespace.
+
+// static
+GUID WrmHeader::kInvalidKeyId;
+
+WrmHeader::WrmHeader(const void* initialization_data,
+                     int initialization_data_size) {
+  wrm_header_ = ParseWrmHeaderFromInitializationData(initialization_data,
+                                                     initialization_data_size);
+  key_id_ = ParseKeyIdFromWrmHeader(wrm_header_);
+}
+
+ComPtr<IStream> WrmHeader::content_header() const {
+  SB_DCHECK(is_valid());
+
+  if (key_id_ == kInvalidKeyId) {
+    return NULL;
+  }
+  return ResetStreamPosition(CreateContentHeaderFromWrmHeader(wrm_header_));
+}
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
diff --git a/starboard/shared/win32/wrm_header.h b/starboard/shared/win32/wrm_header.h
new file mode 100644
index 0000000..c13cf69
--- /dev/null
+++ b/starboard/shared/win32/wrm_header.h
@@ -0,0 +1,57 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_WIN32_WRM_HEADER_H_
+#define STARBOARD_SHARED_WIN32_WRM_HEADER_H_
+
+#include <objidl.h>
+#include <wrl.h>
+#include <wrl/client.h>
+
+#include <string>
+#include <vector>
+
+#include "starboard/common/log.h"
+#include "starboard/types.h"
+
+namespace starboard {
+namespace shared {
+namespace win32 {
+
+class WrmHeader {
+ public:
+  WrmHeader(const void* initialization_data, int initialization_data_size);
+
+  static GUID kInvalidKeyId;
+
+  bool is_valid() const {
+    return key_id_ != kInvalidKeyId && !wrm_header_.empty();
+  }
+  const GUID& key_id() const {
+    SB_DCHECK(is_valid());
+    return key_id_;
+  }
+  Microsoft::WRL::ComPtr<IStream> content_header() const;
+  const std::vector<uint8_t>& wrm_header() const { return wrm_header_; }
+
+ private:
+  GUID key_id_;
+  std::vector<uint8_t> wrm_header_;
+};
+
+}  // namespace win32
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_WIN32_WRM_HEADER_H_
diff --git a/starboard/socket.h b/starboard/socket.h
index cc6b915..0398e75 100644
--- a/starboard/socket.h
+++ b/starboard/socket.h
@@ -131,10 +131,8 @@
   return socket != kSbSocketInvalid;
 }
 
-#if SB_API_VERSION >= 12
 // Returns whether IPV6 is supported on the current platform.
 SB_EXPORT bool SbSocketIsIpv6Supported();
-#endif
 
 // Creates a new non-blocking socket for protocol |protocol| using address
 // family |address_type|.
diff --git a/starboard/speech_recognizer.h b/starboard/speech_recognizer.h
index 6d5d741..56bca7a 100644
--- a/starboard/speech_recognizer.h
+++ b/starboard/speech_recognizer.h
@@ -39,8 +39,6 @@
 #error Speech Recognizer is deprecated, switch to microphone implementation.
 #endif
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -149,10 +147,8 @@
   void* context;
 };
 
-#if SB_API_VERSION >= 12
 // Returns whether the platform supports SbSpeechRecognizer.
 SB_EXPORT bool SbSpeechRecognizerIsSupported();
-#endif
 
 // Creates a speech recognizer with a speech recognizer handler.
 //
@@ -203,6 +199,4 @@
 }  // extern "C"
 #endif
 
-#endif  // SB_API_VERSION >= 12 || SB_HAS(SPEECH_RECOGNIZER)
-
 #endif  // STARBOARD_SPEECH_RECOGNIZER_H_
diff --git a/starboard/speech_synthesis.h b/starboard/speech_synthesis.h
index 8dc7085..5abdb45 100644
--- a/starboard/speech_synthesis.h
+++ b/starboard/speech_synthesis.h
@@ -29,16 +29,12 @@
 #include "starboard/export.h"
 #include "starboard/types.h"
 
-#if SB_API_VERSION >= 12 || SB_HAS(SPEECH_SYNTHESIS)
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#if SB_API_VERSION >= 12
 // Returns whether the platform supports speech synthesis
 SB_EXPORT bool SbSpeechSynthesisIsSupported();
-#endif
 
 // Enqueues |text|, a UTF-8 string, to be spoken.
 // Returns immediately.
@@ -59,7 +55,4 @@
 }  // extern "C"
 #endif
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(SPEECH_SYNTHESIS)
-
 #endif  // STARBOARD_SPEECH_SYNTHESIS_H_
diff --git a/starboard/starboard.gyp b/starboard/starboard.gyp
deleted file mode 100644
index 5cdad9c..0000000
--- a/starboard/starboard.gyp
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# The common "starboard" target. Any target that depends on Starboard should
-# depend on this common target, and not any of the specific "starboard_platform"
-# targets.
-
-{
-  'targets': [
-    {
-      'target_name': 'starboard',
-      'type': 'none',
-      'conditions': [
-        ['sb_evergreen == 1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/client_porting/cwrappers/cwrappers.gyp:cwrappers',
-            '<(DEPTH)/starboard/client_porting/eztime/eztime.gyp:eztime',
-            '<(DEPTH)/starboard/elf_loader/sabi_string.gyp:sabi_string',
-            '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-            '<(DEPTH)/third_party/llvm-project/compiler-rt/compiler-rt.gyp:compiler_rt',
-            '<(DEPTH)/third_party/llvm-project/libcxx/libcxx.gyp:cxx',
-            '<(DEPTH)/third_party/llvm-project/libcxxabi/libcxxabi.gyp:cxxabi',
-            '<(DEPTH)/third_party/llvm-project/libunwind/libunwind.gyp:unwind_evergreen',
-            '<(DEPTH)/third_party/musl/musl.gyp:c',
-          ],
-        }, {
-          'dependencies': [
-            'starboard_full',
-          ],
-        }],
-      ],
-    },
-  ],
-  'conditions' : [
-    # Evergreen platforms aren't built with a starboard_platform static library
-    # but rather just the Starboard headers. Even though targets don't depend on
-    # starboard_full when sb_evergreen is True, GYP will still try to define it
-    # if it's included in the global dictionary defined by this file. So, this
-    # condition is used to only include it when sb_evergreen is False.
-    ['sb_evergreen == 0', {
-      'targets': [
-        {
-          'target_name': 'starboard_full',
-          'type': 'none',
-          'dependencies': [
-            '<(DEPTH)/<(starboard_path)/starboard_platform.gyp:starboard_platform',
-            '<(DEPTH)/starboard/client_porting/cwrappers/cwrappers.gyp:cwrappers',
-            '<(DEPTH)/starboard/client_porting/eztime/eztime.gyp:eztime',
-            '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-            'common/common.gyp:common',
-          ],
-          'export_dependent_settings': [
-            '<(DEPTH)/<(starboard_path)/starboard_platform.gyp:starboard_platform',
-          ],
-          'conditions': [
-            ['sb_evergreen_compatible == 1', {
-              'dependencies': [
-                '<(DEPTH)/third_party/crashpad/wrapper/wrapper.gyp:crashpad_wrapper',
-              ],
-            }, {
-              'dependencies': [
-                '<(DEPTH)/third_party/crashpad/wrapper/wrapper.gyp:crashpad_wrapper_stub',
-              ],
-            }],
-            ['final_executable_type=="shared_library"', {
-              'all_dependent_settings': {
-                'target_conditions': [
-                  ['_type=="executable" and _toolset=="target"', {
-                    'sources': [
-                      '<(DEPTH)/starboard/shared/starboard/shared_main_adapter.cc',
-                    ],
-                  }],
-                ],
-              },
-            }],
-          ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/starboard/starboard_all.gyp b/starboard/starboard_all.gyp
deleted file mode 100644
index 39177c3..0000000
--- a/starboard/starboard_all.gyp
+++ /dev/null
@@ -1,111 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# The Starboard "all" target, which includes all interesting targets for the
-# Starboard project.
-
-{
-  'variables': {
-    'has_platform_tests%': '<!pymod_do_main(starboard.build.gyp_functions file_exists \'<(DEPTH)/<(starboard_path)/starboard_platform_tests.gyp\')',
-    'has_platform_targets%': '<!pymod_do_main(starboard.build.gyp_functions file_exists \'<(DEPTH)/<(starboard_path)/platform_targets.gyp\')',
-  },
-  'conditions': [
-    # If 'starboard_platform_tests' is not defined by the platform, then an
-    # empty 'starboard_platform_tests' target is defined.
-    ['has_platform_tests==0', {
-      'targets': [
-        {
-          'target_name': 'starboard_platform_tests',
-          'type': '<(gtest_target_type)',
-          'sources': [
-            '<(DEPTH)/starboard/common/test_main.cc',
-           ],
-          'dependencies': [
-            '<(DEPTH)/starboard/starboard.gyp:starboard',
-            '<(DEPTH)/testing/gmock.gyp:gmock',
-            '<(DEPTH)/testing/gtest.gyp:gtest',
-          ],
-        },
-        {
-          'target_name': 'starboard_platform_tests_deploy',
-          'type': 'none',
-          'dependencies': [
-            'starboard_platform_tests',
-          ],
-          'variables': {
-            'executable_name': 'starboard_platform_tests',
-          },
-          'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-        },
-      ],
-    }],
-  ],
-  'targets': [
-    {
-      # Note that this target must be in a separate GYP file from starboard.gyp,
-      # or else it produces a GYP file loop (which is not allowed by GYP).
-      'target_name': 'starboard_all',
-      'type': 'none',
-      'dependencies': [
-        '<(DEPTH)/starboard/client_porting/eztime/eztime.gyp:*',
-        '<(DEPTH)/starboard/client_porting/eztime/eztime_test.gyp:*',
-        '<(DEPTH)/starboard/client_porting/icu_init/icu_init.gyp:*',
-        '<(DEPTH)/starboard/client_porting/poem/poem.gyp:*',
-        '<(DEPTH)/starboard/examples/window/window.gyp:*',
-        '<(DEPTH)/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp:*',
-        '<(DEPTH)/starboard/nplb/nplb.gyp:*',
-        '<(DEPTH)/starboard/starboard.gyp:*',
-        '<(DEPTH)/starboard/tools/tools.gyp:*',
-      ],
-      'conditions': [
-        ['gl_type != "none"', {
-          'dependencies': [
-            '<(DEPTH)/starboard/examples/glclear/glclear.gyp:starboard_glclear_example',
-          ],
-        }],
-        ['has_platform_targets==1', {
-          'dependencies': [
-            '<(DEPTH)/<(starboard_path)/platform_targets.gyp:*',
-          ],
-        }],
-        ['has_platform_tests==1', {
-          'dependencies': [
-            '<(DEPTH)/<(starboard_path)/starboard_platform_tests.gyp:*',
-          ],
-        }, {
-          'dependencies': [
-            '<(DEPTH)/starboard/starboard_all.gyp:starboard_platform_tests_deploy',
-          ],
-        }],
-        ['sb_filter_based_player==1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/shared/starboard/player/filter/testing/player_filter_tests.gyp:player_filter_tests_deploy',
-            '<(DEPTH)/starboard/shared/starboard/player/filter/tools/tools.gyp:*',
-          ],
-        }],
-        ['sb_enable_benchmark==1', {
-          'dependencies': [
-            '<(DEPTH)/starboard/benchmark/benchmark.gyp:*',
-          ],
-        }],
-        ['sb_evergreen==0', {
-          'dependencies': [
-            '<(DEPTH)/third_party/crashpad/crashpad.gyp:*',
-            '<(DEPTH)/third_party/lz4_lib/lz4.gyp:lz4',
-          ],
-        }]
-      ],
-    },
-  ],
-}
diff --git a/starboard/starboard_base_target.gypi b/starboard/starboard_base_target.gypi
deleted file mode 100644
index 135eb45..0000000
--- a/starboard/starboard_base_target.gypi
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright 2015 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file is included in the target defaults from
-# cobalt/build/config/base.gypi
-{
-  'defines': [
-    # The canonical way to detect Starboard is #if defined(STARBOARD). This
-    # should be defined both when building Starboard itself, and when building
-    # any other source file in a Starboard-based project.
-    'STARBOARD',
-  ],
-  'conditions': [
-    ['gl_type == "none"', {
-      'defines': [
-        'SB_GYP_GL_TYPE_IS_NONE=1',
-      ],
-    }, {
-      'defines': [
-        'SB_GYP_GL_TYPE_IS_NONE=0',
-      ],
-    }],
-    ['abort_on_allocation_failure==1', {
-      'defines': [
-        'SB_ABORT_ON_ALLOCATION_FAILURE',
-      ],
-    }],
-    ['sb_allows_memory_tracking==1', {
-      'defines': [
-        'STARBOARD_ALLOWS_MEMORY_TRACKING',
-      ],
-    }],
-    ['sb_enable_lib==1', {
-      'defines': [
-        'SB_IS_LIBRARY=1',
-      ],
-    }],
-    ['sb_evergreen==1', {
-      'defines': [
-        'SB_IS_EVERGREEN=1',
-      ],
-    }],
-    ['sb_evergreen_compatible==1', {
-      'defines': [
-        'SB_IS_EVERGREEN_COMPATIBLE=1',
-      ],
-    }],
-    ['sb_evergreen_compatible_libunwind==1', {
-      'defines': [
-        'SB_IS_EVERGREEN_COMPATIBLE_LIBUNWIND=1',
-      ],
-    }],
-    ['sb_evergreen_compatible_lite==1', {
-      'defines': [
-        'SB_IS_EVERGREEN_COMPATIBLE_LITE=1',
-      ],
-    }],
-    ['starboard_path == ""', {
-      'defines': [
-        # There doesn't appear to be any way to use the C preprocessor to do
-        # string concatenation with the / character. This prevents us from using
-        # the preprocessor to assemble an include file path, so we have to do
-        # the concatenation here in GYP.
-        # http://stackoverflow.com/questions/29601786/c-preprocessor-building-a-path-string
-        'STARBOARD_ATOMIC_INCLUDE="starboard/<(target_arch)/atomic_public.h"',
-        'STARBOARD_CONFIGURATION_INCLUDE="starboard/<(target_arch)/configuration_public.h"',
-        'STARBOARD_THREAD_TYPES_INCLUDE="starboard/<(target_arch)/thread_types_public.h"',
-      ],
-    }, {
-      'defines': [
-        'STARBOARD_ATOMIC_INCLUDE="<(starboard_path)/atomic_public.h"',
-        'STARBOARD_CONFIGURATION_INCLUDE="<(starboard_path)/configuration_public.h"',
-        'STARBOARD_THREAD_TYPES_INCLUDE="<(starboard_path)/thread_types_public.h"',
-      ],
-    }],
-  ],
-}
diff --git a/starboard/starboard_headers_only.gyp b/starboard/starboard_headers_only.gyp
deleted file mode 100644
index 922a09f..0000000
--- a/starboard/starboard_headers_only.gyp
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# The common "starboard_headers_only" target, like the common "starboard" target
-# but without the starboard_platform implementation. If a non-executable target
-# depends on Starboard, but is also used by Starboard ports, the target should
-# depend on this common header target. This avoids file dependency cycles for
-# targets simultaneously above and below starboard. In contrast, executable
-# targets such as test targets, must in some way depend on the common
-# "starboard" target.
-
-{
-  'targets': [
-    {
-      'target_name': 'starboard_headers_only',
-      'type': 'none',
-      'sources': [
-        'atomic.h',
-        'audio_sink.h',
-        'byte_swap.h',
-        'character.h',
-        'condition_variable.h',
-        'configuration.h',
-        'configuration_constants.h',
-        'cpu_features.h',
-        'decode_target.h',
-        'directory.h',
-        'double.h',
-        'drm.h',
-        'egl.h',
-        'event.h',
-        'export.h',
-        'file.h',
-        'gles.h',
-        'input.h',
-        'key.h',
-        'log.h',
-        'media.h',
-        'memory.h',
-        'microphone.h',
-        'mutex.h',
-        'once.h',
-        'player.h',
-        'queue.h',
-        'socket.h',
-        'socket_waiter.h',
-        'spin_lock.h',
-        'storage.h',
-        'string.h',
-        'system.h',
-        'thread.h',
-        'thread_types.h',
-        'time.h',
-        'time_zone.h',
-        'types.h',
-        'user.h',
-        'window.h',
-        # Include private headers, if present.
-        '<!@pymod_do_main(starboard.build.gyp_functions file_glob <(DEPTH)/starboard/private *.h)',
-      ],
-    },
-  ],
-}
diff --git a/starboard/stub/BUILD.gn b/starboard/stub/BUILD.gn
index fa39e19..2e713bd 100644
--- a/starboard/stub/BUILD.gn
+++ b/starboard/stub/BUILD.gn
@@ -26,7 +26,6 @@
     "javascript_cache.h",
     "main.cc",
     "system_get_extensions.cc",
-    "thread_types_public.h",
   ]
 
   public_deps = [ ":stub_sources" ]
@@ -42,6 +41,8 @@
     "//starboard/shared/starboard/file_mode_string_to_flags.cc",
     "//starboard/shared/starboard/memory.cc",
     "//starboard/shared/starboard/queue_application.cc",
+    "//starboard/shared/starboard/starboard_switches.cc",
+    "//starboard/shared/starboard/starboard_switches.h",
     "//starboard/shared/stub/accessibility_get_caption_settings.cc",
     "//starboard/shared/stub/accessibility_get_display_settings.cc",
     "//starboard/shared/stub/accessibility_get_text_to_speech_settings.cc",
@@ -70,12 +71,6 @@
     "//starboard/shared/stub/condition_variable_wait.cc",
     "//starboard/shared/stub/condition_variable_wait_timed.cc",
     "//starboard/shared/stub/cpu_features_get.cc",
-    "//starboard/shared/stub/cryptography_create_transformer.cc",
-    "//starboard/shared/stub/cryptography_destroy_transformer.cc",
-    "//starboard/shared/stub/cryptography_get_tag.cc",
-    "//starboard/shared/stub/cryptography_set_authenticated_data.cc",
-    "//starboard/shared/stub/cryptography_set_initialization_vector.cc",
-    "//starboard/shared/stub/cryptography_transform.cc",
     "//starboard/shared/stub/decode_target_get_info.cc",
     "//starboard/shared/stub/decode_target_release.cc",
     "//starboard/shared/stub/directory_can_open.cc",
@@ -96,6 +91,7 @@
     "//starboard/shared/stub/drm_is_server_certificate_updatable.cc",
     "//starboard/shared/stub/drm_update_server_certificate.cc",
     "//starboard/shared/stub/drm_update_session.cc",
+    "//starboard/shared/stub/environment.cc",
     "//starboard/shared/stub/file_atomic_replace.cc",
     "//starboard/shared/stub/file_can_open.cc",
     "//starboard/shared/stub/file_close.cc",
@@ -134,12 +130,9 @@
     "//starboard/shared/stub/media_is_audio_supported.cc",
     "//starboard/shared/stub/media_is_buffer_pool_allocate_on_demand.cc",
     "//starboard/shared/stub/media_is_buffer_using_memory_pool.cc",
-    "//starboard/shared/stub/media_is_output_protected.cc",
     "//starboard/shared/stub/media_is_supported.cc",
-    "//starboard/shared/stub/media_is_transfer_characteristics_supported.cc",
     "//starboard/shared/stub/media_is_video_supported.cc",
     "//starboard/shared/stub/media_set_audio_write_duration.cc",
-    "//starboard/shared/stub/media_set_output_protection.cc",
     "//starboard/shared/stub/memory_allocate_aligned_unchecked.cc",
     "//starboard/shared/stub/memory_allocate_unchecked.cc",
     "//starboard/shared/stub/memory_compare.cc",
@@ -174,7 +167,6 @@
     "//starboard/shared/stub/player_get_info2.cc",
     "//starboard/shared/stub/player_get_maximum_number_of_samples_per_write.cc",
     "//starboard/shared/stub/player_get_preferred_output_mode.cc",
-    "//starboard/shared/stub/player_output_mode_supported.cc",
     "//starboard/shared/stub/player_seek2.cc",
     "//starboard/shared/stub/player_set_bounds.cc",
     "//starboard/shared/stub/player_set_playback_rate.cc",
@@ -302,7 +294,6 @@
     "//starboard/shared/stub/thread_set_local_value.cc",
     "//starboard/shared/stub/thread_set_name.cc",
     "//starboard/shared/stub/thread_sleep.cc",
-    "//starboard/shared/stub/thread_types_public.h",
     "//starboard/shared/stub/thread_yield.cc",
     "//starboard/shared/stub/time_get_monotonic_now.cc",
     "//starboard/shared/stub/time_get_monotonic_thread_now.cc",
diff --git a/starboard/stub/configuration_public.h b/starboard/stub/configuration_public.h
index e618ef7..0700fcb 100644
--- a/starboard/stub/configuration_public.h
+++ b/starboard/stub/configuration_public.h
@@ -171,11 +171,6 @@
 // following macro is defined, the app will append audio frames start from the
 // timestamp that is before the timestamp of the video key frame being appended.
 //
-// This quirk has been deprecated in Starboard version 12 or later.  Please see
-// `configuration_public.md` for more details.
-#if SB_API_VERSION < 12
-#undef SB_HAS_QUIRK_SEEK_TO_KEYFRAME
-#endif  // SB_API_VERSION < 12
 
 // The implementation is allowed to support kSbMediaAudioSampleTypeInt16 only
 // when this macro is defined.
@@ -185,12 +180,6 @@
 
 // --- Memory Configuration --------------------------------------------------
 
-// Whether this platform has and should use an MMAP function to map physical
-// memory to the virtual address space.
-#if SB_API_VERSION < 12
-#define SB_HAS_MMAP 1
-#endif
-
 // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
 // required for platforms that want to JIT.
 #define SB_CAN_MAP_EXECUTABLE_MEMORY 1
diff --git a/starboard/stub/gyp_configuration.gypi b/starboard/stub/gyp_configuration.gypi
deleted file mode 100644
index cbc9f06..0000000
--- a/starboard/stub/gyp_configuration.gypi
+++ /dev/null
@@ -1,161 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'variables': {
-    # Stub does not use a filter-based player.
-    'sb_filter_based_player': 0,
-
-    'target_os': 'linux',
-
-    # No GL drivers available.
-    'gl_type': 'none',
-
-    # Define platform specific compiler and linker flags.
-    # Refer to base.gypi for a list of all available variables.
-    'compiler_flags_host': [
-      '-O2',
-      # Do not warn about unused function params.
-      '-Wno-unused-parameter',
-     ],
-    'linker_flags': [
-      '-static-libstdc++'
-    ],
-    'compiler_flags_debug': [
-      '-frtti',
-      '-O0',
-    ],
-    'compiler_flags_devel': [
-      '-frtti',
-      '-O2',
-    ],
-    'compiler_flags_qa': [
-      '-fno-rtti',
-      '-O2',
-      '-gline-tables-only',
-    ],
-    'compiler_flags_gold': [
-      '-fno-rtti',
-      '-O2',
-      '-gline-tables-only',
-    ],
-    'conditions': [
-      ['clang==1', {
-        'common_clang_flags': [
-          '-Werror',
-          '-fcolor-diagnostics',
-          # Default visibility to hidden, to enable dead stripping.
-          '-fvisibility=hidden',
-          # Warn for implicit type conversions that may change a value.
-          '-Wconversion',
-          # Warns on switches on enums that cover all enum values but
-          # also contain a default: branch. Chrome is full of that.
-          '-Wno-covered-switch-default',
-          # protobuf uses hash_map.
-          '-Wno-deprecated',
-          '-fno-exceptions',
-          # Don't warn about the "struct foo f = {0};" initialization pattern.
-          '-Wno-missing-field-initializers',
-          # Do not warn for implicit sign conversions.
-          '-Wno-sign-conversion',
-          '-fno-strict-aliasing',  # See http://crbug.com/32204
-          # TODO(pkasting): In C++11 this is legal, so this should be
-          # removed when we change to that.  (This is also why we don't
-          # bother fixing all these cases today.)
-          '-Wno-unnamed-type-template-args',
-          # Triggered by the COMPILE_ASSERT macro.
-          '-Wno-unused-local-typedef',
-          # Do not warn if a function or variable cannot be implicitly
-          # instantiated.
-          '-Wno-undefined-var-template',
-          # Do not warn about unused function params.
-          '-Wno-unused-parameter',
-        ],
-      }],
-      ['cobalt_fastbuild==0', {
-        'compiler_flags_debug': [
-          '-g',
-        ],
-        'compiler_flags_devel': [
-          '-g',
-        ],
-        'compiler_flags_qa': [
-          '-gline-tables-only',
-        ],
-        'compiler_flags_gold': [
-          '-gline-tables-only',
-        ],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'defines': [
-      '__STDC_FORMAT_MACROS', # so that we get PRI*
-      # Enable GNU extensions to get prototypes like ffsl.
-      #'_GNU_SOURCE=1',
-    ],
-    'cflags_c': [
-      # Limit to C99. This allows stub to be a canary build for any
-      # C11 features that are not supported on some platforms' compilers.
-      #'-std=c99',
-    ],
-    'cflags_cc': [
-      '-std=gnu++14',
-    ],
-    'default_configuration': 'stub_debug',
-    'configurations': {
-      'stub_debug': {
-        'inherit_from': ['debug_base'],
-      },
-      'stub_devel': {
-        'inherit_from': ['devel_base'],
-      },
-      'stub_qa': {
-        'inherit_from': ['qa_base'],
-      },
-      'stub_gold': {
-        'inherit_from': ['gold_base'],
-      },
-    }, # end of configurations
-    'target_conditions': [
-      ['sb_pedantic_warnings==1', {
-        'cflags': [
-          '-Wall',
-          '-Wextra',
-          '-Wunreachable-code',
-          '<@(common_clang_flags)',
-        ],
-      },{
-        'cflags': [
-          '<@(common_clang_flags)',
-          # 'this' pointer cannot be NULL...pointer may be assumed
-          # to always convert to true.
-          '-Wno-undefined-bool-conversion',
-          # Skia doesn't use overrides.
-          '-Wno-inconsistent-missing-override',
-          # Do not warn for implicit type conversions that may change a value.
-          '-Wno-conversion',
-          # shifting a negative signed value is undefined
-          '-Wno-shift-negative-value',
-          # Width of bit-field exceeds width of its type- value will be truncated
-          '-Wno-bitfield-width',
-        ],
-      }],
-    ],
-  }, # end of target_defaults
-
-  'includes': [
-    '<(DEPTH)/starboard/sabi/sabi.gypi',
-  ],
-}
diff --git a/starboard/stub/gyp_configuration.py b/starboard/stub/gyp_configuration.py
index dc2a4b2..581c1f9 100644
--- a/starboard/stub/gyp_configuration.py
+++ b/starboard/stub/gyp_configuration.py
@@ -15,17 +15,7 @@
 
 import logging
 
-import config.base
-from starboard.build import clang as clang_specification
-from starboard.tools import build
-from starboard.tools.toolchain import ar
-from starboard.tools.toolchain import bash
-from starboard.tools.toolchain import clang
-from starboard.tools.toolchain import clangxx
-from starboard.tools.toolchain import cp
-from starboard.tools.toolchain import touch
-
-_SABI_JSON_PATH = 'starboard/sabi/x64/sysv/sabi-v{sb_api_version}.json'
+from starboard.build.platform_configuration import PlatformConfiguration
 
 
 def CreatePlatformConfig():
@@ -36,69 +26,6 @@
     return None
 
 
-class StubConfiguration(config.base.PlatformConfigBase):
+class StubConfiguration(PlatformConfiguration):
   """Starboard stub platform configuration."""
-
-  def GetVariables(self, configuration):
-    variables = super(StubConfiguration, self).GetVariables(
-        configuration, use_clang=1)
-    return variables
-
-  def GetEnvironmentVariables(self):
-    if not hasattr(self, 'host_compiler_environment'):
-      self.host_compiler_environment = build.GetHostCompilerEnvironment(
-          clang_specification.GetClangSpecification(), 'ccache')
-
-    env_variables = self.host_compiler_environment
-    env_variables.update({
-        'CC': self.host_compiler_environment['CC_host'],
-        'CXX': self.host_compiler_environment['CXX_host'],
-    })
-    return env_variables
-
-  def GetTargetToolchain(self, **kwargs):  # pylint: disable=unused-argument
-    environment_variables = self.GetEnvironmentVariables()
-    cc_path = environment_variables['CC']
-    cxx_path = environment_variables['CXX']
-
-    return [
-        clang.CCompiler(path=cc_path),
-        clang.CxxCompiler(path=cxx_path),
-        clang.AssemblerWithCPreprocessor(path=cc_path),
-        ar.StaticThinLinker(),
-        ar.StaticLinker(),
-        clangxx.ExecutableLinker(path=cxx_path, write_group=True),
-        clangxx.SharedLibraryLinker(path=cxx_path),
-        cp.Copy(),
-        touch.Stamp(),
-        bash.Shell(),
-    ]
-
-  def GetHostToolchain(self, **kwargs):  # pylint: disable=unused-argument
-    environment_variables = self.GetEnvironmentVariables()
-    cc_path = environment_variables['CC_host']
-    cxx_path = environment_variables['CXX_host']
-
-    return [
-        clang.CCompiler(path=cc_path),
-        clang.CxxCompiler(path=cxx_path),
-        clang.AssemblerWithCPreprocessor(path=cc_path),
-        ar.StaticThinLinker(),
-        ar.StaticLinker(),
-        clangxx.ExecutableLinker(path=cxx_path, write_group=True),
-        clangxx.SharedLibraryLinker(path=cxx_path),
-        cp.Copy(),
-        touch.Stamp(),
-        bash.Shell(),
-    ]
-
-  def GetTestFilters(self):
-    """Gets all tests to be excluded from a unit test run.
-
-    Returns:
-      A list of initialized TestFilter objects.
-    """
-    return []
-
-  def GetPathToSabiJsonFile(self):
-    return _SABI_JSON_PATH
+  pass
diff --git a/starboard/stub/starboard_platform.gyp b/starboard/stub/starboard_platform.gyp
deleted file mode 100644
index 62cceef..0000000
--- a/starboard/stub/starboard_platform.gyp
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'includes': [
-    'stub_sources.gypi'
-  ],
-  'targets': [
-    {
-      'target_name': 'starboard_platform',
-      'type': 'static_library',
-      'sources': [
-        '<@(stub_sources)',
-        'application_stub.cc',
-        'application_stub.h',
-        'atomic_public.h',
-        'configuration.cc',
-        'configuration.h',
-        'configuration_constants.cc',
-        'font.cc',
-        'font.h',
-        'javascript_cache.h',
-        'javascript_cache.cc',
-        'main.cc',
-        'system_get_extensions.cc',
-        'thread_types_public.h',
-        # Include private stubs, if present.
-        '<!@pymod_do_main(starboard.build.gyp_functions file_glob <(DEPTH)/starboard/private/shared/stub *.cc)',
-      ],
-      'defines': [
-        # This must be defined when building Starboard, and must not when
-        # building Starboard client code.
-        'STARBOARD_IMPLEMENTATION',
-      ],
-    },
-  ],
-}
diff --git a/starboard/stub/stub_sources.gypi b/starboard/stub/stub_sources.gypi
deleted file mode 100644
index 45ef651..0000000
--- a/starboard/stub/stub_sources.gypi
+++ /dev/null
@@ -1,315 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-{
-  'variables': {
-    'stub_sources': [
-        '<(DEPTH)/starboard/shared/starboard/application.cc',
-        '<(DEPTH)/starboard/shared/starboard/command_line.cc',
-        '<(DEPTH)/starboard/shared/starboard/command_line.h',
-        '<(DEPTH)/starboard/shared/starboard/event_cancel.cc',
-        '<(DEPTH)/starboard/shared/starboard/event_schedule.cc',
-        '<(DEPTH)/starboard/shared/starboard/file_mode_string_to_flags.cc',
-        '<(DEPTH)/starboard/shared/starboard/memory.cc',
-        '<(DEPTH)/starboard/shared/starboard/queue_application.cc',
-        '<(DEPTH)/starboard/shared/stub/accessibility_get_caption_settings.cc',
-        '<(DEPTH)/starboard/shared/stub/accessibility_get_display_settings.cc',
-        '<(DEPTH)/starboard/shared/stub/accessibility_get_text_to_speech_settings.cc',
-        '<(DEPTH)/starboard/shared/stub/accessibility_set_captions_enabled.cc',
-        '<(DEPTH)/starboard/shared/stub/atomic_public.h',
-        '<(DEPTH)/starboard/shared/stub/audio_sink_create.cc',
-        '<(DEPTH)/starboard/shared/stub/audio_sink_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/audio_sink_get_max_channels.cc',
-        '<(DEPTH)/starboard/shared/stub/audio_sink_get_min_buffer_size_in_frames.cc',
-        '<(DEPTH)/starboard/shared/stub/audio_sink_get_nearest_supported_sample_frequency.cc',
-        '<(DEPTH)/starboard/shared/stub/audio_sink_is_audio_frame_storage_type_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/audio_sink_is_audio_sample_type_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/audio_sink_is_valid.cc',
-        '<(DEPTH)/starboard/shared/stub/byte_swap.cc',
-        '<(DEPTH)/starboard/shared/stub/character_is_alphanumeric.cc',
-        '<(DEPTH)/starboard/shared/stub/character_is_digit.cc',
-        '<(DEPTH)/starboard/shared/stub/character_is_hex_digit.cc',
-        '<(DEPTH)/starboard/shared/stub/character_is_space.cc',
-        '<(DEPTH)/starboard/shared/stub/character_is_upper.cc',
-        '<(DEPTH)/starboard/shared/stub/character_to_lower.cc',
-        '<(DEPTH)/starboard/shared/stub/character_to_upper.cc',
-        '<(DEPTH)/starboard/shared/stub/condition_variable_broadcast.cc',
-        '<(DEPTH)/starboard/shared/stub/condition_variable_create.cc',
-        '<(DEPTH)/starboard/shared/stub/condition_variable_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/condition_variable_signal.cc',
-        '<(DEPTH)/starboard/shared/stub/condition_variable_wait.cc',
-        '<(DEPTH)/starboard/shared/stub/condition_variable_wait_timed.cc',
-        '<(DEPTH)/starboard/shared/stub/cpu_features_get.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_create_transformer.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_destroy_transformer.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_get_tag.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_set_authenticated_data.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_set_initialization_vector.cc',
-        '<(DEPTH)/starboard/shared/stub/cryptography_transform.cc',
-        '<(DEPTH)/starboard/shared/stub/decode_target_get_info.cc',
-        '<(DEPTH)/starboard/shared/stub/decode_target_release.cc',
-        '<(DEPTH)/starboard/shared/stub/directory_can_open.cc',
-        '<(DEPTH)/starboard/shared/stub/directory_close.cc',
-        '<(DEPTH)/starboard/shared/stub/directory_create.cc',
-        '<(DEPTH)/starboard/shared/stub/directory_get_next.cc',
-        '<(DEPTH)/starboard/shared/stub/directory_open.cc',
-        '<(DEPTH)/starboard/shared/stub/double_absolute.cc',
-        '<(DEPTH)/starboard/shared/stub/double_exponent.cc',
-        '<(DEPTH)/starboard/shared/stub/double_floor.cc',
-        '<(DEPTH)/starboard/shared/stub/double_is_finite.cc',
-        '<(DEPTH)/starboard/shared/stub/double_is_nan.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_close_session.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_create_system.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_destroy_system.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_generate_session_update_request.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_get_metrics.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_is_server_certificate_updatable.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_update_server_certificate.cc',
-        '<(DEPTH)/starboard/shared/stub/drm_update_session.cc',
-        '<(DEPTH)/starboard/shared/stub/file_atomic_replace.cc',
-        '<(DEPTH)/starboard/shared/stub/file_can_open.cc',
-        '<(DEPTH)/starboard/shared/stub/file_close.cc',
-        '<(DEPTH)/starboard/shared/stub/file_delete.cc',
-        '<(DEPTH)/starboard/shared/stub/file_exists.cc',
-        '<(DEPTH)/starboard/shared/stub/file_flush.cc',
-        '<(DEPTH)/starboard/shared/stub/file_get_info.cc',
-        '<(DEPTH)/starboard/shared/stub/file_get_path_info.cc',
-        '<(DEPTH)/starboard/shared/stub/file_open.cc',
-        '<(DEPTH)/starboard/shared/stub/file_read.cc',
-        '<(DEPTH)/starboard/shared/stub/file_seek.cc',
-        '<(DEPTH)/starboard/shared/stub/file_truncate.cc',
-        '<(DEPTH)/starboard/shared/stub/file_write.cc',
-        '<(DEPTH)/starboard/shared/stub/image_decode.cc',
-        '<(DEPTH)/starboard/shared/stub/image_is_decode_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/log.cc',
-        '<(DEPTH)/starboard/shared/stub/log_flush.cc',
-        '<(DEPTH)/starboard/shared/stub/log_format.cc',
-        '<(DEPTH)/starboard/shared/stub/log_is_tty.cc',
-        '<(DEPTH)/starboard/shared/stub/log_raw.cc',
-        '<(DEPTH)/starboard/shared/stub/log_raw_dump_stack.cc',
-        '<(DEPTH)/starboard/shared/stub/log_raw_format.cc',
-        '<(DEPTH)/starboard/shared/stub/media_can_play_mime_and_key_system.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_audio_buffer_budget.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_audio_configuration.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_audio_output_count.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_buffer_alignment.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_buffer_allocation_unit.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_buffer_garbage_collection_duration_threshold.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_buffer_padding.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_buffer_storage_type.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_initial_buffer_capacity.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_max_buffer_capacity.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_progressive_buffer_budget.cc',
-        '<(DEPTH)/starboard/shared/stub/media_get_video_buffer_budget.cc',
-        '<(DEPTH)/starboard/shared/stub/media_is_audio_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/media_is_buffer_pool_allocate_on_demand.cc',
-        '<(DEPTH)/starboard/shared/stub/media_is_buffer_using_memory_pool.cc',
-        '<(DEPTH)/starboard/shared/stub/media_is_output_protected.cc',
-        '<(DEPTH)/starboard/shared/stub/media_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/media_is_transfer_characteristics_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/media_is_video_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/media_set_audio_write_duration.cc',
-        '<(DEPTH)/starboard/shared/stub/media_set_output_protection.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_allocate_aligned_unchecked.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_allocate_unchecked.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_compare.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_copy.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_find_byte.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_flush.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_free.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_free_aligned.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_get_stack_bounds.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_map.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_move.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_protect.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_reallocate_unchecked.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_set.cc',
-        '<(DEPTH)/starboard/shared/stub/memory_unmap.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_close.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_create.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_get_available.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_is_sample_rate_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_open.cc',
-        '<(DEPTH)/starboard/shared/stub/microphone_read.cc',
-        '<(DEPTH)/starboard/shared/stub/mutex_acquire.cc',
-        '<(DEPTH)/starboard/shared/stub/mutex_acquire_try.cc',
-        '<(DEPTH)/starboard/shared/stub/mutex_create.cc',
-        '<(DEPTH)/starboard/shared/stub/mutex_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/mutex_release.cc',
-        '<(DEPTH)/starboard/shared/stub/once.cc',
-        '<(DEPTH)/starboard/shared/stub/player_create.cc',
-        '<(DEPTH)/starboard/shared/stub/player_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/player_get_current_frame.cc',
-        '<(DEPTH)/starboard/shared/stub/player_get_info2.cc',
-        '<(DEPTH)/starboard/shared/stub/player_get_maximum_number_of_samples_per_write.cc',
-        '<(DEPTH)/starboard/shared/stub/player_get_preferred_output_mode.cc',
-        '<(DEPTH)/starboard/shared/stub/player_output_mode_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/player_seek2.cc',
-        '<(DEPTH)/starboard/shared/stub/player_set_bounds.cc',
-        '<(DEPTH)/starboard/shared/stub/player_set_playback_rate.cc',
-        '<(DEPTH)/starboard/shared/stub/player_set_volume.cc',
-        '<(DEPTH)/starboard/shared/stub/player_write_end_of_stream.cc',
-        '<(DEPTH)/starboard/shared/stub/player_write_sample2.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_accept.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_bind.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_clear_last_error.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_connect.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_create.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_free_resolution.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_get_interface_address.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_get_last_error.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_get_local_address.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_is_connected.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_is_connected_and_idle.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_is_ipv6_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_join_multicast_group.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_listen.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_receive_from.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_resolve.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_send_to.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_set_broadcast.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_set_receive_buffer_size.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_set_reuse_address.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_set_send_buffer_size.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_set_tcp_keep_alive.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_set_tcp_no_delay.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_set_tcp_window_scaling.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_waiter_add.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_waiter_create.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_waiter_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_waiter_remove.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_waiter_wait.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_waiter_wait_timed.cc',
-        '<(DEPTH)/starboard/shared/stub/socket_waiter_wake_up.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_synthesis_cancel.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_synthesis_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/speech_synthesis_speak.cc',
-        '<(DEPTH)/starboard/shared/stub/storage_close_record.cc',
-        '<(DEPTH)/starboard/shared/stub/storage_delete_record.cc',
-        '<(DEPTH)/starboard/shared/stub/storage_get_record_size.cc',
-        '<(DEPTH)/starboard/shared/stub/storage_open_record.cc',
-        '<(DEPTH)/starboard/shared/stub/storage_read_record.cc',
-        '<(DEPTH)/starboard/shared/stub/storage_write_record.cc',
-        '<(DEPTH)/starboard/shared/stub/string_compare.cc',
-        '<(DEPTH)/starboard/shared/stub/string_compare_all.cc',
-        '<(DEPTH)/starboard/shared/stub/string_compare_no_case.cc',
-        '<(DEPTH)/starboard/shared/stub/string_compare_no_case_n.cc',
-        '<(DEPTH)/starboard/shared/stub/string_compare_wide.cc',
-        '<(DEPTH)/starboard/shared/stub/string_concat.cc',
-        '<(DEPTH)/starboard/shared/stub/string_concat_wide.cc',
-        '<(DEPTH)/starboard/shared/stub/string_copy.cc',
-        '<(DEPTH)/starboard/shared/stub/string_copy_wide.cc',
-        '<(DEPTH)/starboard/shared/stub/string_duplicate.cc',
-        '<(DEPTH)/starboard/shared/stub/string_find_character.cc',
-        '<(DEPTH)/starboard/shared/stub/string_find_last_character.cc',
-        '<(DEPTH)/starboard/shared/stub/string_find_string.cc',
-        '<(DEPTH)/starboard/shared/stub/string_format.cc',
-        '<(DEPTH)/starboard/shared/stub/string_format_wide.cc',
-        '<(DEPTH)/starboard/shared/stub/string_get_length.cc',
-        '<(DEPTH)/starboard/shared/stub/string_get_length_wide.cc',
-        '<(DEPTH)/starboard/shared/stub/string_parse_double.cc',
-        '<(DEPTH)/starboard/shared/stub/string_parse_signed_integer.cc',
-        '<(DEPTH)/starboard/shared/stub/string_parse_uint64.cc',
-        '<(DEPTH)/starboard/shared/stub/string_parse_unsigned_integer.cc',
-        '<(DEPTH)/starboard/shared/stub/string_scan.cc',
-        '<(DEPTH)/starboard/shared/stub/system_binary_search.cc',
-        '<(DEPTH)/starboard/shared/stub/system_break_into_debugger.cc',
-        '<(DEPTH)/starboard/shared/stub/system_clear_last_error.cc',
-        '<(DEPTH)/starboard/shared/stub/system_egl.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_connection_type.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_device_type.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_error_string.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_last_error.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_locale_id.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_number_of_processors.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_path.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_property.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_random_data.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_random_uint64.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_stack.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_total_cpu_memory.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_used_cpu_memory.cc',
-        '<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
-        '<(DEPTH)/starboard/shared/stub/system_gles.cc',
-        '<(DEPTH)/starboard/shared/stub/system_has_capability.cc',
-        '<(DEPTH)/starboard/shared/stub/system_hide_splash_screen.cc',
-        '<(DEPTH)/starboard/shared/stub/system_network_is_disconnected.cc',
-        '<(DEPTH)/starboard/shared/stub/system_is_debugger_attached.cc',
-        '<(DEPTH)/starboard/shared/stub/system_raise_platform_error.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_blur.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_conceal.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_focus.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_freeze.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_pause.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_reveal.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_stop.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_suspend.cc',
-        '<(DEPTH)/starboard/shared/stub/system_request_unpause.cc',
-        '<(DEPTH)/starboard/shared/stub/system_sign_with_certification_secret_key.cc',
-        '<(DEPTH)/starboard/shared/stub/system_sort.cc',
-        '<(DEPTH)/starboard/shared/stub/system_supports_resume.cc',
-        '<(DEPTH)/starboard/shared/stub/system_symbolize.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_context_get_pointer.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_create.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_create_priority.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_create_local_key.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_destroy_local_key.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_detach.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_get_current.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_get_id.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_get_local_value.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_get_name.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_is_equal.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_join.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_create.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_freeze.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sampler_thaw.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_set_local_value.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_set_name.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_sleep.cc',
-        '<(DEPTH)/starboard/shared/stub/thread_types_public.h',
-        '<(DEPTH)/starboard/shared/stub/thread_yield.cc',
-        '<(DEPTH)/starboard/shared/stub/time_get_monotonic_now.cc',
-        '<(DEPTH)/starboard/shared/stub/time_get_monotonic_thread_now.cc',
-        '<(DEPTH)/starboard/shared/stub/time_get_now.cc',
-        '<(DEPTH)/starboard/shared/stub/time_is_time_thread_now_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/time_zone_get_current.cc',
-        '<(DEPTH)/starboard/shared/stub/time_zone_get_name.cc',
-        '<(DEPTH)/starboard/shared/stub/ui_nav_get_interface.cc',
-        '<(DEPTH)/starboard/shared/stub/user_get_current.cc',
-        '<(DEPTH)/starboard/shared/stub/user_get_property.cc',
-        '<(DEPTH)/starboard/shared/stub/user_get_signed_in.cc',
-        '<(DEPTH)/starboard/shared/stub/window_blur_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/shared/stub/window_create.cc',
-        '<(DEPTH)/starboard/shared/stub/window_destroy.cc',
-        '<(DEPTH)/starboard/shared/stub/window_focus_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/shared/stub/window_get_diagonal_size_in_inches.cc',
-        '<(DEPTH)/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc',
-        '<(DEPTH)/starboard/shared/stub/window_get_platform_handle.cc',
-        '<(DEPTH)/starboard/shared/stub/window_get_size.cc',
-        '<(DEPTH)/starboard/shared/stub/window_hide_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc',
-        '<(DEPTH)/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc',
-        '<(DEPTH)/starboard/shared/stub/window_set_default_options.cc',
-        '<(DEPTH)/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc',
-        '<(DEPTH)/starboard/shared/stub/window_show_on_screen_keyboard.cc',
-        '<(DEPTH)/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc',
-    ],
-  },
-}
diff --git a/starboard/stub/thread_types_public.h b/starboard/stub/thread_types_public.h
deleted file mode 100644
index 48dd93f..0000000
--- a/starboard/stub/thread_types_public.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Includes threading primitive types and initializers.
-
-#ifndef STARBOARD_STUB_THREAD_TYPES_PUBLIC_H_
-#define STARBOARD_STUB_THREAD_TYPES_PUBLIC_H_
-
-#include "starboard/shared/stub/thread_types_public.h"
-
-#endif  // STARBOARD_STUB_THREAD_TYPES_PUBLIC_H_
diff --git a/starboard/system.h b/starboard/system.h
index 59efced..ebd1005 100644
--- a/starboard/system.h
+++ b/starboard/system.h
@@ -58,18 +58,18 @@
   // Path to a directory where temporary files can be written.
   kSbSystemPathTempDirectory,
 
+#if SB_API_VERSION < SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED
   // Path to a directory where test results can be written.
   kSbSystemPathTestOutputDirectory,
+#endif  // #if SB_API_VERSION < SB_SYSTEM_PATH_TEST_OUTPUT_DIRECTORY_DEPRECATED
 
   // Full path to the executable file.
   kSbSystemPathExecutableFile,
 
-#if SB_API_VERSION >= 12
   // Path to a directory for permanent file storage. Both read and write
   // access is required. This is where an app may store its persistent settings.
   // The location should be user agnostic if possible.
   kSbSystemPathStorageDirectory,
-#endif
 } SbSystemPathId;
 
 // System properties that can be queried for. Many of these are used in
@@ -109,16 +109,9 @@
   // The year the device was launched, e.g. "2016".
   kSbSystemPropertyModelYear,
 
-#if SB_API_VERSION >= 12
   // The corporate entity responsible for submitting the device to YouTube
   // certification and for the device maintenance/updates.
   kSbSystemPropertySystemIntegratorName,
-#else
-  // The corporate entity responsible for the manufacturing/assembly of the
-  // device on behalf of the business entity owning the brand.  This is often
-  // abbreviated as ODM.
-  kSbSystemPropertyOriginalDesignManufacturerName,
-#endif
 
   // The name of the operating system and platform, suitable for inclusion in a
   // User-Agent, say.
@@ -160,6 +153,11 @@
   // An Android TV Device.
   kSbSystemDeviceTypeAndroidTV,
 
+#if SB_API_VERSION >= SB_SYSTEM_DEVICE_PROJECTOR_ADDED
+  // A wall video projector.
+  kSbSystemDeviceTypeVideoProjector,
+#endif  // SB_API_VERSION >= SB_SYSTEM_DEVICE_PROJECTOR_ADDED
+
   // Unknown device.
   kSbSystemDeviceTypeUnknown,
 } SbSystemDeviceType;
@@ -629,10 +627,6 @@
 // Computes a HMAC-SHA256 digest of |message| into |digest| using the
 // application's certification secret.
 //
-// This function may be implemented as an alternative to implementing
-// SbSystemGetProperty(kSbSystemPropertyBase64EncodedCertificationSecret),
-// however both should not be implemented.
-//
 // The output will be written into |digest|.  |digest_size_in_bytes| must be 32
 // (or greater), since 32-bytes will be written into it.
 // Returns false in the case of an error, or if it is not implemented.  In this
diff --git a/starboard/testing/fake_graphics_context_provider.cc b/starboard/testing/fake_graphics_context_provider.cc
index b9e8279..237d32e 100644
--- a/starboard/testing/fake_graphics_context_provider.cc
+++ b/starboard/testing/fake_graphics_context_provider.cc
@@ -231,11 +231,6 @@
   EGLint context_attrib_list[] = {
       EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE,
   };
-#if SB_API_VERSION < 12 && defined(GLES3_SUPPORTED)
-  // Attempt to create an OpenGL ES 3.0 context.
-  context_ = EGL_CALL_SIMPLE(
-      eglCreateContext(display_, config, EGL_NO_CONTEXT, context_attrib_list));
-#endif
   if (context_ == EGL_NO_CONTEXT) {
     // Create an OpenGL ES 2.0 context.
     context_attrib_list[1] = 2;
diff --git a/starboard/thread.h b/starboard/thread.h
index a04e38a..bf5c81d 100644
--- a/starboard/thread.h
+++ b/starboard/thread.h
@@ -21,7 +21,6 @@
 
 #include "starboard/configuration.h"
 #include "starboard/export.h"
-#include "starboard/thread_types.h"
 #include "starboard/time.h"
 #include "starboard/types.h"
 
@@ -29,15 +28,11 @@
 extern "C" {
 #endif
 
-#if SB_API_VERSION >= 12
-
 // An opaque handle to a thread type.
 typedef void* SbThread;
 
 #define kSbThreadInvalid (SbThread) NULL
 
-#endif  // SB_API_VERSION >= 12
-
 // A spectrum of thread priorities. Platforms map them appropriately to their
 // own priority system. Note that scheduling is platform-specific, and what
 // these priorities mean, if they mean anything at all, is also
@@ -293,11 +288,9 @@
   // Pointer to the the current stack frame.
   kSbThreadContextFramePointer,
 
-#if SB_API_VERSION >= 12
   // Pointer to where to return to when the current function call completes, or
   // nullptr on platforms without a link register.
   kSbThreadContextLinkRegister,
-#endif  // SB_API_VERSION >= 12
 } SbThreadContextProperty;
 
 // Gets the specified pointer-type |property| from the specified |context|.
diff --git a/starboard/thread_types.h b/starboard/thread_types.h
deleted file mode 100644
index 5876085..0000000
--- a/starboard/thread_types.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2015 The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Module Overview: Starboard Thread Types module
-//
-// Defines platform-specific threading and synchronization primitive types and
-// initializers. We hide, but pass through, the platform's primitives to avoid
-// doing a lot of work to replicate initialization-less synchronization
-// primitives.
-
-// TODO: Implement a cross-platform initless synchronization model, and
-// then properly hide thread primitives. This could look like implementing our
-// own high-performance init-less lock (e.g. MCS or CLH) using the Atomics
-// abstraction, and use that on all platforms and hope really hard that we
-// didn't mess it up and then use that to auto-init uninitialized static
-// objects.
-
-#ifndef STARBOARD_THREAD_TYPES_H_
-#define STARBOARD_THREAD_TYPES_H_
-
-#include "starboard/configuration.h"
-
-#if SB_API_VERSION < 12
-
-// This platform-specific include file must define:
-//
-//   SbConditionVariable
-//   SB_CONDITION_VARIABLE_INITIALIZER
-//
-//   SbMutex
-//   SB_MUTEX_INITIALIZER
-//
-//   SbThread
-//   SbThreadIsValid()
-//   kSbThreadInvalid
-//
-//   SbOnce
-//   SB_ONCE_INITIALIIER
-
-#include STARBOARD_THREAD_TYPES_INCLUDE
-
-#ifndef SB_CONDITION_VARIABLE_INITIALIZER
-#error "SB_CONDITION_VARIABLE_INITIALIZER not defined by platform."
-#endif
-
-#ifndef SB_MUTEX_INITIALIZER
-#error "SB_MUTEX_INITIALIZER not defined by platform."
-#endif
-
-#ifndef SB_ONCE_INITIALIZER
-#error "SB_ONCE_INITIALIZER not defined by platform."
-#endif
-
-#endif  // SB_API_VERSION < 12
-#endif  // STARBOARD_THREAD_TYPES_H_
diff --git a/starboard/time.h b/starboard/time.h
index c71a700..e5127ff 100644
--- a/starboard/time.h
+++ b/starboard/time.h
@@ -91,12 +91,8 @@
 // Gets a monotonically increasing time representing right now.
 SB_EXPORT SbTimeMonotonic SbTimeGetMonotonicNow();
 
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
-
-#if SB_API_VERSION >= 12
 // Returns whether the current platform supports time thread now
 SB_EXPORT bool SbTimeIsTimeThreadNowSupported();
-#endif
 
 // Gets a monotonically increasing time representing how long the current
 // thread has been in the executing state (i.e. not pre-empted nor waiting
@@ -105,9 +101,6 @@
 // available then SbTimeGetMonotonicNow() should be used.
 SB_EXPORT SbTimeMonotonic SbTimeGetMonotonicThreadNow();
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(TIME_THREAD_NOW)
-
 #ifdef __cplusplus
 }  // extern "C"
 #endif
diff --git a/starboard/tools/BUILD.gn b/starboard/tools/BUILD.gn
index b4f1ffd..27dca14 100644
--- a/starboard/tools/BUILD.gn
+++ b/starboard/tools/BUILD.gn
@@ -13,24 +13,13 @@
 # limitations under the License.
 
 action("build_app_launcher_zip") {
-  script = "//starboard/build/run_bash.py"
-  py_script = "//starboard/tools/app_launcher_packager.py"
+  script = "//starboard/tools/app_launcher_packager.py"
 
-  file_list = exec_script("//starboard/build/run_bash.py",
-                          [
-                            "python2",
-                            rebase_path(py_script, root_build_dir),
-                            "-l",
-                          ],
-                          "trim string",
-                          [ py_script ])
+  file_list = exec_script(script, [ "-l" ], "trim string")
   inputs = string_split(file_list)
-  inputs += [ py_script ]
   outputs = [ "$root_out_dir/app_launcher.zip" ]
 
   args = [
-    "python2",
-    rebase_path(py_script, root_build_dir),
     "-z",
     rebase_path(outputs[0], root_build_dir),
   ]
diff --git a/starboard/tools/_env.py b/starboard/tools/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/starboard/tools/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/tools/abstract_launcher.py b/starboard/tools/abstract_launcher.py
index 85963cb..a385ad4 100644
--- a/starboard/tools/abstract_launcher.py
+++ b/starboard/tools/abstract_launcher.py
@@ -19,7 +19,6 @@
 import os
 import sys
 
-import _env  # pylint: disable=unused-import
 from starboard.tools import build
 from starboard.tools import paths
 
diff --git a/starboard/tools/app_launcher_packager.py b/starboard/tools/app_launcher_packager.py
index c228a95..1e9cda0 100644
--- a/starboard/tools/app_launcher_packager.py
+++ b/starboard/tools/app_launcher_packager.py
@@ -24,27 +24,19 @@
 import logging
 import os
 import shutil
-import string
 import sys
 import tempfile
 
-import _env  # pylint: disable=unused-import
-from paths import REPOSITORY_ROOT
-from paths import THIRD_PARTY_ROOT
-
-sys.path.append(THIRD_PARTY_ROOT)
-# pylint: disable=g-import-not-at-top,g-bad-import-order,wrong-import-position
 from starboard.tools import command_line
 from starboard.tools import log_level
 from starboard.tools import port_symlink
-import starboard.tools.platform
+from starboard.tools.paths import REPOSITORY_ROOT
 
 # Default directories to app launcher resources.
 _INCLUDE_FILE_PATTERNS = [
     ('cobalt', '*.py'),
     ('starboard', '*.py'),
     ('starboard', '*.pfx'),
-    ('starboard/tools', 'platform.py.template'),
     # Just match everything since the Evergreen tests are written using shell
     # scripts and html files.
     ('starboard/evergreen/testing', '*')
@@ -107,40 +99,6 @@
   return file_list
 
 
-def _WritePlatformsInfo(repo_root, dest_root):
-  """Get platforms' information and write the platform.py based on a template.
-
-  Platform.py is responsible for enumerating all supported platforms in the
-  Cobalt source tree.  Since we are extracting the app launcher script from the
-  Cobalt source tree, this function records which platforms are supported while
-  the Cobalt source tree is still available and bakes them in to a newly created
-  platform.py file that does not depend on the Cobalt source tree.
-
-  Args:
-    repo_root: Absolute path to the root of the repository where platforms'
-      information is retrieved.
-    dest_root: Absolute path to the root of the new repository into which
-      platforms' information to be written.
-  """
-  logging.info('Baking platform info files.')
-  current_file = os.path.abspath(__file__)
-  current_dir = os.path.dirname(current_file)
-  dest_dir = os.path.join(dest_root, 'starboard', 'tools')
-  platforms_map = {}
-  for p in starboard.tools.platform.GetAll():
-    platform_path = os.path.relpath(
-        starboard.tools.platform.Get(p).path, repo_root)
-    # Store posix paths even on Windows so MH Linux hosts can use them.
-    # The template has code to re-normalize them when used on Windows hosts.
-    platforms_map[p] = platform_path.replace('\\', '/')
-  with open(os.path.join(current_dir, 'platform.py.template')) as c:
-    template = string.Template(c.read())
-    with open(os.path.join(dest_dir, 'platform.py'), 'w+') as f:
-      sub = template.substitute(platforms_map=platforms_map)
-      f.write(sub.encode('utf-8'))
-  logging.info('Finished baking in platform info files.')
-
-
 def CopyAppLauncherTools(repo_root,
                          dest_root,
                          additional_glob_patterns=None,
@@ -216,8 +174,6 @@
       folders_logged.add(src_folder)
       logging.info(src_folder + ' -> ' + os.path.dirname(dst))
     shutil.copy2(src, dst)
-  # Re-write the platform infos file in the new repo copy.
-  _WritePlatformsInfo(repo_root, dest_root)
 
 
 def MakeZipArchive(src, output_zip):
@@ -287,8 +243,6 @@
       # Skip paths with '$' since they won't get through the Ninja generator.
       if '$' in src_file:
         continue
-      # Relative to CWD where gyp ran this; same as '<(DEPTH)' in gyp file.
-      src_file = os.path.relpath(src_file)
       # Forward slashes for gyp, even on Windows.
       src_file = src_file.replace('\\', '/')
       src_files.append(src_file)
diff --git a/starboard/tools/build.py b/starboard/tools/build.py
index 64eca42..6566e55 100644
--- a/starboard/tools/build.py
+++ b/starboard/tools/build.py
@@ -21,10 +21,9 @@
 import os
 import sys
 
-import _env  # pylint: disable=unused-import
+from starboard.build.platforms import PLATFORMS
 from starboard.tools import config
 from starboard.tools import paths
-from starboard.tools import platform
 from starboard.tools import download_clang
 
 _STARBOARD_TOOLCHAINS_DIR_KEY = 'STARBOARD_TOOLCHAINS_DIR'
@@ -57,12 +56,12 @@
 
 
 def _CheckPlatform(key, raw_value, value):
-  if platform.IsValid(value):
+  if value in PLATFORMS:
     return True
 
   logging.warning("Environment variable '%s' is '%s', which is invalid.", key,
                   raw_value)
-  logging.warning('Valid platforms: %s', platform.GetAll())
+  logging.warning('Valid platforms: %s', list(PLATFORMS.keys()))
   return False
 
 
@@ -216,9 +215,9 @@
   """
   try:
     logging.debug('Loading platform %s for "%s".', file_name, platform_name)
-    if platform.IsValid(platform_name):
+    if platform_name in PLATFORMS:
       platform_path = os.path.join(paths.REPOSITORY_ROOT,
-                                   platform.Get(platform_name).path)
+                                   PLATFORMS[platform_name])
       module_path = os.path.join(platform_path, file_name)
       if not _ModuleLoaded('platform_module', module_path):
         platform_module = imp.load_source('platform_module', module_path)
@@ -254,7 +253,7 @@
     platform_name: Platform name.
 
   Returns:
-    Instance of a class derived from PlatformConfigBase.
+    Instance of a class derived from PlatformConfiguration.
   """
   platform_configuration, platform_path = _LoadPlatformModule(
       platform_name, 'gyp_configuration.py', 'CreatePlatformConfig')
@@ -297,7 +296,7 @@
     platform_name: Platform name.
 
   Returns:
-    Instance of a class derived from PlatformConfigBase.
+    Instance of a class derived from PlatformConfiguration.
   """
 
   if platform_name not in _PLATFORM_CONFIG_DICT:
@@ -320,4 +319,4 @@
     _PLATFORM_TEST_FILTERS_DICT[platform_name] = _LoadPlatformTestFilters(
         platform_name)
 
-  return _PLATFORM_CONFIG_DICT[platform_name]
+  return _PLATFORM_TEST_FILTERS_DICT[platform_name]
diff --git a/starboard/tools/command_line.py b/starboard/tools/command_line.py
index afeb1a3..88f9196 100644
--- a/starboard/tools/command_line.py
+++ b/starboard/tools/command_line.py
@@ -16,11 +16,10 @@
 """Adds common command-line arguments to a provided argument parser."""
 
 import argparse
-import _env  # pylint: disable=unused-import
+from starboard.build.platforms import PLATFORMS
 from starboard.tools import build
 from starboard.tools import params
 import starboard.tools.config
-import starboard.tools.platform
 
 
 def AddLoggingArguments(arg_parser, default='info'):
@@ -46,11 +45,11 @@
   arg_parser.add_argument(
       '-p',
       '--platform',
-      choices=starboard.tools.platform.GetAll(),
+      choices=list(PLATFORMS.keys()),
       default=default_platform,
       required=not default_platform,
       help="Device platform, eg 'linux-x64x11'. Requires that you have "
-      'already run gyp_cobalt for the desired platform.')
+      'already run gn.py for the desired platform.')
   arg_parser.add_argument(
       '-c',
       '--config',
@@ -65,7 +64,7 @@
       help='Specifies the platform to build the loader with. This flag is only '
       'relevant for Evergreen builds, and should be the platform you intend to '
       "run your tests on (eg 'linux-x64x11', or 'raspi-2'). Requires that "
-      '--loader_config be given, and that you have already run gyp_cobalt for '
+      '--loader_config be given, and that you have already run gn.py for '
       'the desired loader platform.')
   arg_parser.add_argument(
       '-C',
@@ -77,7 +76,10 @@
 
 
 def AddLauncherArguments(arg_parser):
-  """Adds the platform configuration and device information arguments require by launchers."""
+  """
+  Adds the platform configuration and device information arguments require by
+  launchers.
+  """
   AddPlatformConfigArguments(arg_parser)
   arg_parser.add_argument(
       '-d', '--device_id', help='Devkit or IP address for the target device.')
diff --git a/starboard/tools/command_line_test.py b/starboard/tools/command_line_test.py
index c2482bd..8393163 100755
--- a/starboard/tools/command_line_test.py
+++ b/starboard/tools/command_line_test.py
@@ -20,18 +20,17 @@
 import os
 import unittest
 
-import _env  # pylint: disable=unused-import
+from starboard.build.platforms import PLATFORMS
 from starboard.tools import command_line
 import starboard.tools.config
-import starboard.tools.platform
 
 _A_CONFIG = starboard.tools.config.GetAll()[0]
-_A_PLATFORM = starboard.tools.platform.GetAll()[0]
+_A_PLATFORM = list(PLATFORMS.keys())[0]
 
 
 def _RestoreMapping(target, source):
   target.clear()
-  for key, value in source.iteritems():
+  for key, value in source.items():
     target[key] = value
 
 
@@ -71,11 +70,13 @@
 class CommandLineTest(unittest.TestCase):
 
   def setUp(self):
+    super(CommandLineTest, self).setUp()
     self.environ = os.environ.copy()
     _ClearEnviron()
 
   def tearDown(self):
     _RestoreMapping(os.environ, self.environ)
+    super(CommandLineTest, self).tearDown()
 
   def testNoEnvironmentRainyDayNoArgs(self):
     arg_parser = _CreateParser()
diff --git a/starboard/tools/config_test.py b/starboard/tools/config_test.py
deleted file mode 100755
index 89af160..0000000
--- a/starboard/tools/config_test.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Tests the config module."""
-
-import unittest
-
-import config
-
-
-class ConfigTest(unittest.TestCase):
-
-  def testGetAll(self):
-    config_names = config.GetAll()
-    self.assertNotEqual(0, len(config_names))
-
-  def testIsValid(self):
-    config_names = config.GetAll()
-    for config_name in config_names:
-      self.assertTrue(config.IsValid(config_name))
-      self.assertTrue(config.IsValid(config_name.lower()))
-      self.assertFalse(config.IsValid(config_name.upper()))
-    self.assertFalse(config.IsValid('invalidconfig'))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/starboard/tools/create_derived_build.py b/starboard/tools/create_derived_build.py
deleted file mode 100644
index f54baac..0000000
--- a/starboard/tools/create_derived_build.py
+++ /dev/null
@@ -1,192 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Tool to create a new Starboard build deriving from an existing one.
-
-When this tool is provided with input giving the desired existing build path to
-derive from as well as a destination build path to create, it will generate
-the files necessary for a new build to be created in the destination build
-path.  The generated build will be identical to the previous build since it
-derives all configuration from it.  The intended usage of this script is to
-make it easy to initialize new Starboard builds that are later manually tweaked
-by hand.
-"""
-
-import argparse
-import datetime
-import logging
-import os
-import sys
-import textwrap
-
-import _env  # pylint: disable=unused-import
-from starboard.tools import log_level
-from starboard.tools import paths
-import starboard.tools.environment as environment
-
-TEMPLATE_DIRECTORY = (
-    os.path.join(os.path.dirname(__file__), 'create_derived_build_templates'))
-
-# The list of files we will generate in the output directory.  For each of
-# these files it is expected that there exists a corresponding template file in
-# the directory TEMPLATE_DIRECTORY.
-FILES_TO_GENERATE = [
-    'atomic_public.h',
-    'configuration_public.h',
-    'gyp_configuration.gypi',
-    'gyp_configuration.py',
-    'starboard_platform.gyp',
-    'starboard_platform_tests.gyp',
-    'thread_types_public.h',
-]
-
-
-def _GenerateFile(output_file_path, template_file_path, template_dictionary):
-  """Applies the dictionary to the template file and outputs to output file."""
-  if not os.path.exists(os.path.dirname(output_file_path)):
-    os.makedirs(os.path.dirname(output_file_path))
-
-  with open(template_file_path, 'r') as f:
-    template_file_contents = f.read()
-
-  with open(output_file_path, 'w') as f:
-    f.write(template_file_contents.format(**template_dictionary))
-
-
-def _GetCopyrightYear():
-  """Returns the year to be used in the copyright header comment."""
-  return datetime.datetime.now().year
-
-
-def _GetAutoGeneratedPreambleComment(language):
-  """Returns the comment about how a current file is auto-generated."""
-  if language == 'cc':
-    comment_start = '//'
-  elif language == 'python':
-    comment_start = '#'
-  script_path_relative_to_repository = (
-      _GetPathRelativeToRepository(os.path.abspath(__file__)))
-  return ('{comment_start} This file was initially generated by {},\n'
-          '{comment_start} though it may have been modified since its '
-          'creation.'.format(
-              script_path_relative_to_repository, comment_start=comment_start))
-
-
-def _GetPathRelativeToStarboardRoot(path):
-  abspath = os.path.abspath(path)
-  # This is a bit tricky because there can be multiple Starboard roots.
-  for root in environment.GetStarboardPortRoots():
-    absroot = os.path.abspath(root)
-    if os.path.commonprefix([absroot, abspath]) == absroot:
-      return os.path.relpath(abspath, start=absroot)
-
-  raise Exception('Path not relative to any Starboard root.')
-
-
-def _GetPathRelativeToRepository(path):
-  return os.path.relpath(os.path.abspath(path), start=paths.REPOSITORY_ROOT)
-
-
-def _GetIncludeGuard(output_file_path):
-  """Returns the include guard define to be used in generated C++ headers."""
-  repository_relative_path = _GetPathRelativeToRepository(output_file_path)
-  return (repository_relative_path.upper().replace(os.sep, '_').replace(
-      '.', '_') + '_')
-
-
-def _GetBuildName(output_build_path):
-  """Returns the name of the build (e.g. how you identify the build to gyp)."""
-  starboard_relative_path = _GetPathRelativeToStarboardRoot(output_build_path)
-  return starboard_relative_path.lower().replace(os.sep, '-')
-
-
-def _GetParentImportPath(parent_build_path):
-  repository_relative_path = _GetPathRelativeToRepository(parent_build_path)
-  return repository_relative_path.replace(os.sep, '.')
-
-
-def _CreateDerivedBuild(parent_build_path, parent_configuration_class_name,
-                        output_build_path):
-  general_template_dictionary = {
-      'copyright_year':
-          _GetCopyrightYear(),
-      'auto_generated_cc_preamble_comment':
-          _GetAutoGeneratedPreambleComment('cc'),
-      'auto_generated_python_preamble_comment':
-          _GetAutoGeneratedPreambleComment('python'),
-      'parent_build_path':
-          _GetPathRelativeToRepository(parent_build_path),
-      'build_name':
-          _GetBuildName(output_build_path),
-      'parent_import_path':
-          _GetParentImportPath(parent_build_path),
-      'parent_configuration_class_name':
-          parent_configuration_class_name,
-  }
-
-  # Go through each file in the list of files to generate and for each one
-  # apply the dictionary to the template to produce the generated file.
-  for gen_file in FILES_TO_GENERATE:
-    output_file_path = os.path.join(output_build_path, gen_file)
-
-    # Apply per-file customizations to the template dictionary.
-    file_template_dictionary = general_template_dictionary
-    file_template_dictionary['include_guard'] = (
-        _GetIncludeGuard(output_file_path))
-
-    _GenerateFile(output_file_path,
-                  os.path.join(TEMPLATE_DIRECTORY, gen_file) + '.template',
-                  file_template_dictionary)
-
-
-def main():
-  log_level.InitializeLoggingWithLevel(logging.INFO)
-
-  parser = argparse.ArgumentParser(
-      formatter_class=argparse.ArgumentDefaultsHelpFormatter,
-      description=textwrap.dedent(__doc__))
-  parser.add_argument(
-      '-p',
-      '--parent_build_path',
-      required=True,
-      type=str,
-      help='Path to the build that the destination build will inherit from.')
-  parser.add_argument(
-      '-c',
-      '--parent_configuration_class_name',
-      required=True,
-      type=str,
-      help='The name of the class in the parent build\'s gyp_configuration.py '
-      'file that the derived build\'s gyp_configuration.py should '
-      'derive from.  You may have to open the parent build\'s '
-      'gyp_configuration.py file to know what to pass in for this '
-      'parameter.')
-  parser.add_argument(
-      '-o',
-      '--output_build_path',
-      required=True,
-      type=str,
-      help='Path to the directory where the destination build\'s files will '
-      'be created.')
-  arguments = parser.parse_args()
-
-  return _CreateDerivedBuild(
-      os.path.normpath(arguments.parent_build_path),
-      arguments.parent_configuration_class_name,
-      os.path.normpath(arguments.output_build_path))
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/starboard/tools/create_derived_build_templates/atomic_public.h.template b/starboard/tools/create_derived_build_templates/atomic_public.h.template
deleted file mode 100644
index ebedcf2..0000000
--- a/starboard/tools/create_derived_build_templates/atomic_public.h.template
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright {copyright_year} The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-{auto_generated_cc_preamble_comment}
-
-#ifndef {include_guard}
-#define {include_guard}
-
-#include "{parent_build_path}/atomic_public.h"
-
-#endif  // {include_guard}
diff --git a/starboard/tools/create_derived_build_templates/configuration_public.h.template b/starboard/tools/create_derived_build_templates/configuration_public.h.template
deleted file mode 100644
index 615b8e6..0000000
--- a/starboard/tools/create_derived_build_templates/configuration_public.h.template
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright {copyright_year} The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-{auto_generated_cc_preamble_comment}
-
-#ifndef {include_guard}
-#define {include_guard}
-
-#include "{parent_build_path}/configuration_public.h"
-
-#endif  // {include_guard}
diff --git a/starboard/tools/create_derived_build_templates/gyp_configuration.gypi.template b/starboard/tools/create_derived_build_templates/gyp_configuration.gypi.template
deleted file mode 100644
index 4216b8f..0000000
--- a/starboard/tools/create_derived_build_templates/gyp_configuration.gypi.template
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright {copyright_year} The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{auto_generated_python_preamble_comment}
-
-{{
-  'target_defaults': {{
-    'default_configuration': '{build_name}_debug',
-    'configurations': {{
-      '{build_name}_debug': {{
-        'inherit_from': ['debug_base'],
-      }},
-      '{build_name}_devel': {{
-        'inherit_from': ['devel_base'],
-      }},
-      '{build_name}_qa': {{
-        'inherit_from': ['qa_base'],
-      }},
-      '{build_name}_gold': {{
-        'inherit_from': ['gold_base'],
-      }},
-    }}, # end of configurations
-  }},
-
-  'includes': [
-    '<(DEPTH)/{parent_build_path}/gyp_configuration.gypi',
-  ],
-}}
diff --git a/starboard/tools/create_derived_build_templates/gyp_configuration.py.template b/starboard/tools/create_derived_build_templates/gyp_configuration.py.template
deleted file mode 100644
index 72d68ac..0000000
--- a/starboard/tools/create_derived_build_templates/gyp_configuration.py.template
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright {copyright_year} The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{auto_generated_python_preamble_comment}
-
-
-from {parent_import_path} import gyp_configuration as parent_configuration
-
-
-def CreatePlatformConfig():
-  return parent_configuration.{parent_configuration_class_name}('{build_name}')
diff --git a/starboard/tools/create_derived_build_templates/starboard_platform.gyp.template b/starboard/tools/create_derived_build_templates/starboard_platform.gyp.template
deleted file mode 100644
index 133d804..0000000
--- a/starboard/tools/create_derived_build_templates/starboard_platform.gyp.template
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright {copyright_year} The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{auto_generated_python_preamble_comment}
-
-{{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/{parent_build_path}/starboard_platform.gyp',
-  ],
-}}
diff --git a/starboard/tools/create_derived_build_templates/starboard_platform_tests.gyp.template b/starboard/tools/create_derived_build_templates/starboard_platform_tests.gyp.template
deleted file mode 100644
index 0e4e026..0000000
--- a/starboard/tools/create_derived_build_templates/starboard_platform_tests.gyp.template
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright {copyright_year} The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{auto_generated_python_preamble_comment}
-
-{{
-  'includes': [
-    # Note that we are 'includes'ing a 'gyp' file, not a 'gypi' file.  The idea
-    # is that we just want this file to *be* the parent gyp file.
-    '<(DEPTH)/{parent_build_path}/starboard_platform_tests.gyp',
-  ],
-}}
diff --git a/starboard/tools/create_derived_build_templates/thread_types_public.h.template b/starboard/tools/create_derived_build_templates/thread_types_public.h.template
deleted file mode 100644
index 89bcc44..0000000
--- a/starboard/tools/create_derived_build_templates/thread_types_public.h.template
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright {copyright_year} The Cobalt Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-{auto_generated_cc_preamble_comment}
-
-#ifndef {include_guard}
-#define {include_guard}
-
-#include "{parent_build_path}/thread_types_public.h"
-
-#endif  // {include_guard}
diff --git a/starboard/tools/doc/testing.md b/starboard/tools/doc/testing.md
index e26e6fb..6a7d0d3 100644
--- a/starboard/tools/doc/testing.md
+++ b/starboard/tools/doc/testing.md
@@ -61,9 +61,9 @@
 ## Filtering Tests
 
 To filter out tests that you do not want to run for a specific platform,
-implement a method within the platform's `PlatformConfiguration` subclass called
-`GetTestFilters()`. The `PlatformConfiguration` subclass lives in the
-`gyp_configuration.py` file for each platform. If the tests are
+implement a method within the platform's `TestFilters` subclass called
+`GetTestFilters()`. The `TestFilters` subclass lives in the
+`test_filters.py` file for each platform. If the tests are
 application-specific, you may define `GetTestFilters()` on an optional
 `ApplicationConfiguration` subclass, which will be found in the
 `<platform-directory>/<application-name>/configuration.py` subdirectory. See
diff --git a/starboard/tools/download_clang.sh b/starboard/tools/download_clang.sh
new file mode 100755
index 0000000..a32d327
--- /dev/null
+++ b/starboard/tools/download_clang.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e
+
+CLANG_VERSION="${1:-365097-f7e52fbd-8}"
+TOOLCHAIN_ROOT="${HOME}/starboard-toolchains/"
+TOOLCHAIN_HOME="${TOOLCHAIN_ROOT}/x86_64-linux-gnu-clang-chromium-${CLANG_VERSION}"
+
+if [ -d "${TOOLCHAIN_HOME}" ]; then
+  echo "Clang is already downloaded, exiting."
+  exit 0
+fi
+
+BASE_URL="https://commondatastorage.googleapis.com/chromium-browser-clang"
+
+cd /tmp
+mkdir -p ${TOOLCHAIN_HOME}
+curl --silent -O -J ${BASE_URL}/Linux_x64/clang-${CLANG_VERSION}.tgz
+tar xf clang-${CLANG_VERSION}.tgz -C ${TOOLCHAIN_HOME}
+echo ${CLANG_VERSION} >> ${TOOLCHAIN_HOME}/cr_build_revision
+rm clang-${CLANG_VERSION}.tgz
+
+echo "Downloaded clang."
diff --git a/starboard/tools/environment.py b/starboard/tools/environment.py
deleted file mode 100644
index ccf82b8..0000000
--- a/starboard/tools/environment.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License."""
-"""Sets up a Starboard environment for use by the host application.
-
-Applications that use Starboard should contain a Python file, called
-"starboard_configuration.py", somewhere in the ancestor path of their
-"starboard" directory.
-
-The file should contain a variable, called PORT_ROOTS. Assign to it a
-list of paths to directories in which Starboard ports are located.
-Each path should be represented as a list of directory names whose locations
-are relative to the configuration file.  Example:
-
-PORT_ROOTS = [
-    ["some_directory", "starboard"]
-    ["somewhere_else", "starboard"]
-]
-
-It should also contain another variable, called APPLICATIONS.  This variable
-should be a Python Mapping containing names of applications you want to support
-mapped to functions that will construct their ApplicationConfiguration subclass
-with all appropriate discovery and fallback logic.
-
-Example:
-
-APPLICATIONS = {
-    'cobalt': cobalt.build.CreateCobaltConfiguration,
-}
-
-IF YOU ARE GOING TO USE STARBOARD FILES OUTSIDE OF STARBOARD, YOU NEED TO IMPORT
-THIS MODULE FIRST.  Otherwise, sys.path will not be configured properly, none of
-your code will work, and you'll be sad.
-"""
-
-import importlib
-import os
-import sys
-
-_SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                         os.pardir,
-                                         os.pardir))
-
-PATHS = [
-    # Necessary because the gyp_configuration for linux-x64x11 imports
-    # directly from "starboard/".
-    _SRC_ROOT,
-
-    # Necessary because gyp_configuration modules use relative imports.
-    # "cobalt/build" needs to be in sys.path to keep the imports working
-    os.path.join(_SRC_ROOT, 'cobalt', 'build'),
-]
-
-# This module should only add the above paths to sys.path when they are not
-# present in the list already.
-for new_path in PATHS:
-  if new_path not in sys.path:
-    sys.path.insert(0, new_path)
-
-# Saved in global state so we only ever search for it once.
-_CONFIG_PATH = None
-
-
-def _GetStarboardConfigPath():
-  """Gets the path to the "starboard_configuration.py" file from the host app.
-
-  Returns:
-    Path to the "starboard_configuration.py" file from the host app
-
-  Raises:
-    RuntimeError: There is no configuration file.
-  """
-  global _CONFIG_PATH
-
-  if _CONFIG_PATH:
-    return _CONFIG_PATH
-
-  else:
-    current_path = os.path.normpath(os.path.dirname(__file__))
-    while not os.path.exists(os.path.join(current_path,
-                                          "starboard_configuration.py")):
-      next_path = os.path.dirname(current_path)
-      if next_path == current_path:
-        current_path = None
-        break
-      current_path = next_path
-    config_path = current_path
-
-    if not config_path:
-      raise RuntimeError("No starboard configuration declared.")
-
-    _CONFIG_PATH = config_path
-    return config_path
-
-
-def _ImportConfigModule():
-  if "starboard_configuration" in sys.modules:
-    return sys.modules["starboard_configuration"]
-  else:
-    config_path = _GetStarboardConfigPath()
-    if config_path not in sys.path:
-      sys.path.append(config_path)
-    return importlib.import_module("starboard_configuration")
-
-
-def GetStarboardPortRoots():
-  """Gets paths to the host app's Starboard port directories."""
-  config_path = _GetStarboardConfigPath()
-  config_module = _ImportConfigModule()
-  port_roots = config_module.PORT_ROOTS
-  port_root_paths = [os.path.abspath(os.path.join(
-      config_path, os.sep.join(root))) for root in port_roots]
-  return port_root_paths
-
-
-def GetApplicationClass(application_name):
-  """Gets the class or function that constructs the ApplicationConfiguration."""
-  config_module = _ImportConfigModule()
-  return config_module.APPLICATIONS.get(application_name)
diff --git a/starboard/tools/example/_env.py b/starboard/tools/example/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/starboard/tools/example/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/tools/example/app_launcher_client.py b/starboard/tools/example/app_launcher_client.py
index 53231fc..2abc77e 100644
--- a/starboard/tools/example/app_launcher_client.py
+++ b/starboard/tools/example/app_launcher_client.py
@@ -16,11 +16,9 @@
 """Client to launch executables via the new launcher logic."""
 
 import argparse
-import logging
 import signal
 import sys
 
-import _env  # pylint: disable=unused-import, relative-import
 from starboard.tools import abstract_launcher
 from starboard.tools import command_line
 from starboard.tools.util import SetupDefaultLoggingConfig
diff --git a/starboard/tools/extract_starboard_versions.py b/starboard/tools/extract_starboard_versions.py
index f8117ce..365cabb 100755
--- a/starboard/tools/extract_starboard_versions.py
+++ b/starboard/tools/extract_starboard_versions.py
@@ -26,15 +26,14 @@
 import re
 import sys
 
-import _env  # pylint: disable=unused-import
+from starboard.build.platforms import PLATFORMS
 from starboard.tools import paths
-from starboard.tools import platform
 
 
 # Sometimes files have weird encodings. This function will use a variety of
 # hand selected encoders that work on the starboard codebase.
 def AutoDecodeString(file_data):
-  for encoding in {'UTF-8', 'utf_16', 'windows-1253', 'iso-8859-7', 'macgreek'}:
+  for encoding in ['UTF-8', 'utf_16', 'windows-1253', 'iso-8859-7', 'macgreek']:
     try:
       return file_data.decode(encoding)
     except ValueError:
@@ -121,13 +120,17 @@
 def GeneratePlatformPathMap():
   """Return a map of platform-name -> full-path-to-platform-config-header."""
 
-  def GenPath(p):
-    full_path = os.path.abspath(os.path.join(p.path, 'configuration_public.h'))
+  def GenPath(platform_path):
+    full_path = os.path.abspath(
+        os.path.join(platform_path, 'configuration_public.h'))
     if not os.path.exists(full_path):
       raise IOError('Could not find path ' + full_path)
     return full_path
 
-  return {p.name: GenPath(p) for p in platform.GetAllInfos()}
+  return {
+      platform_name: GenPath(platform_path)
+      for platform_name, platform_path in PLATFORMS.items()
+  }
 
 
 # Given the root starboard directory, and the full path to the platform,
@@ -165,13 +168,13 @@
 
   print('Experimental API Version: ' + str(experimental_api_version) + '\n')
 
-  for platform_name, platform_path in port_dict.iteritems():
+  for platform_name, platform_path in port_dict.items():
     version_str = FindVersionRecursive(paths.STARBOARD_ROOT, platform_path)
     if 'SB_EXPERIMENTAL_API_VERSION' in version_str:
       version_str = str(experimental_api_version)
     path_map[platform_name] = version_str
 
-  for platform_name, api_version in sorted(path_map.iteritems()):
+  for platform_name, api_version in sorted(path_map.items()):
     print(platform_name + ': ' + api_version)
 
   return 0
diff --git a/starboard/tools/get_toolchains_path.py b/starboard/tools/get_toolchains_path.py
deleted file mode 100755
index 012f2a5..0000000
--- a/starboard/tools/get_toolchains_path.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/python
-
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Prints the canonical path to the toolchains directory to stdout."""
-
-import sys
-
-import _env  # pylint: disable=unused-import
-from starboard.tools import build
-
-
-def main(argv):
-  del argv  # Not used.
-  print '%s' % build.GetToolchainsDir()
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/starboard/tools/log_level.py b/starboard/tools/log_level.py
index 6bb05e0..67f5c83 100644
--- a/starboard/tools/log_level.py
+++ b/starboard/tools/log_level.py
@@ -16,7 +16,6 @@
 """Provides a consistent mechanism for the initialize of logging."""
 
 import logging
-import _env  # pylint: disable=unused-import
 
 _NAME_TO_LEVEL = {
     'info': logging.INFO,
diff --git a/starboard/tools/log_level_test.py b/starboard/tools/log_level_test.py
index 8167c14..273d775 100755
--- a/starboard/tools/log_level_test.py
+++ b/starboard/tools/log_level_test.py
@@ -18,12 +18,16 @@
 
 import argparse
 import logging
-import mock
 import unittest
-import _env  # pylint: disable=unused-import
+
+try:
+  from unittest import mock
+except ImportError:
+  import mock
+
 from starboard.tools import log_level
 
-_INITIALIZE_LOGGING_MOCK = 'starboard.tools.log_level.InitializeLoggingWithLevel'
+_INITIALIZE_LOGGING_MOCK = 'starboard.tools.log_level.InitializeLoggingWithLevel'  # pylint:disable=line-too-long
 
 
 class LogLevelTest(unittest.TestCase):
@@ -40,7 +44,7 @@
 
   @mock.patch(_INITIALIZE_LOGGING_MOCK)
   def testSunnyDayCorrectLevels(self, initialize_logging_mock):
-    for name, level in log_level._NAME_TO_LEVEL.items():
+    for name, level in log_level._NAME_TO_LEVEL.items():  # pylint:disable=protected-access
       args = argparse.Namespace()
       args.log_level = name
       log_level.InitializeLogging(args)
diff --git a/starboard/tools/package.py b/starboard/tools/package.py
index 716596b..22778a3 100644
--- a/starboard/tools/package.py
+++ b/starboard/tools/package.py
@@ -20,48 +20,33 @@
 import logging
 import os
 
-import _env  # pylint: disable=unused-import
-import starboard
-from starboard.tools import platform
+from starboard.build.platforms import PLATFORMS
 
 
-def _ImportModule(path, root_module, module_name=None):
-  """Load a platform specific python module using importlib.
-
-  Load the python module named |module_name| relative to |root_module|.
-  Args:
-    path: Path to the platform
-    root_module: An already-loaded module
-    module_name: Name of a python module to load. If None, load the platform
-      directory as a python module.
+def _ImportModule(path, module_name=None):
+  """Convert a filepath to a python-style import path and import it.
 
   Returns:
     A module loaded with importlib.import_module
   Throws:
     ImportError if the module fails to be loaded.
   """
-  # From the relative path to the |root_module|'s directory, construct a full
-  # python package name and attempt to load it.
-  relative_path = os.path.relpath(path, os.path.dirname(root_module.__file__))
-  full_path = os.path.join(root_module.__name__, relative_path)
-
-  # This normpath may collapse out the root module. This is generally OK as long
-  # as we stay within the workspace, as _env will add the workspace root to the
-  # system import path.
-  components = os.path.normpath(full_path).split(os.sep)
+  components = os.path.normpath(path).split(os.sep)
   if module_name:
     components.append(module_name)
   full_package_name = '.'.join(components)
   return importlib.import_module(full_package_name)
 
 
-def _GetPackageClass(platform_info):
-  """Loads the package class associated with the given platform.PlatformInfo."""
+def _GetPackageClass(platform_name, platform_path):
+  """
+  Loads the package class associated with the given platform.
+  """
   try:
-    module = _ImportModule(platform_info.path, starboard)
+    module = _ImportModule(platform_path)
   except ImportError as e:
     logging.debug('Failed to import module for platform %s with error: %s',
-                  platform_info.name, e)
+                  platform_name, e)
     return None
 
   if not hasattr(module, 'Package'):
@@ -77,11 +62,10 @@
     A dict of [platform_name, Class] where Class inherits from PackageBase
   """
   packager_modules = {}
-  for platform_name in platform.GetAll():
-    platform_info = platform.Get(platform_name)
+  for platform_name, platform_path in PLATFORMS.items():
     # From the relative path to the starboard directory, construct a full
     # python package name and attempt to load it.
-    package_class = _GetPackageClass(platform_info)
+    package_class = _GetPackageClass(platform_name, platform_path)
     if not package_class:
       continue
     # Populate a mapping from platform name to the module containing the
@@ -92,13 +76,13 @@
           logging.warning('Packager for %s is defined in multiple modules.',
                           supported_name)
         else:
-          packager_modules[supported_name] = platform_info
+          packager_modules[supported_name] = platform_path
     except Exception as e:  # pylint: disable=broad-except
       # Catch all exceptions to avoid an error in one platform's Packager
       # halting the script for other platforms' packagers.
       logging.warning(
           'Exception iterating supported platform for platform '
-          '%s: %s.', platform_info.name, e)
+          '%s: %s.', platform_name, e)
 
   return packager_modules
 
@@ -172,10 +156,9 @@
 
   def GetApplicationPackageInfo(self, platform_name, application_name):
     """Get application-specific packaging information."""
-    platform_info = self.GetPlatformInfo(platform_name)
+    platform_path = self.GetPlatformInfo(platform_name)
     try:
-      return _ImportModule(platform_info.path, starboard,
-                           '%s.package' % application_name)
+      return _ImportModule(platform_path, '{}.package'.format(application_name))
     except ImportError as e:
       # No package parameters specified for this platform.
       logging.debug('Failed to import cobalt.package: %s', e)
@@ -193,13 +176,16 @@
     Returns:
       A PackageBase instance.
     """
-    package_class = _GetPackageClass(self.platform_infos[platform_name])
+    package_class = _GetPackageClass(platform_name,
+                                     self.platform_infos[platform_name])
     return package_class(source_dir=source_dir, output_dir=output_dir, **kwargs)
 
   def AddPlatformArguments(self, platform_name, argparser):
-    package_class = _GetPackageClass(self.platform_infos[platform_name])
+    package_class = _GetPackageClass(platform_name,
+                                     self.platform_infos[platform_name])
     package_class.AddArguments(argparser)
 
   def ExtractPlatformArguments(self, platform_name, options):
-    package_class = _GetPackageClass(self.platform_infos[platform_name])
+    package_class = _GetPackageClass(platform_name,
+                                     self.platform_infos[platform_name])
     return package_class.ExtractArguments(options)
diff --git a/starboard/tools/platform.py b/starboard/tools/platform.py
deleted file mode 100644
index f548d32..0000000
--- a/starboard/tools/platform.py
+++ /dev/null
@@ -1,152 +0,0 @@
-#
-# Copyright 2016 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Functionality to enumerate and represent starboard ports."""
-
-import logging
-import os
-import re
-
-import _env  # pylint: disable=unused-import
-from starboard.tools import environment
-
-# The list of files that must be present in a directory to allow it to be
-# considered a valid platform.
-_PLATFORM_FILES = [
-    'gyp_configuration.gypi',
-    'gyp_configuration.py',
-    'starboard_platform.gyp',
-    'configuration_public.h',
-    'atomic_public.h',
-    'thread_types_public.h',
-]
-
-
-# Whether to emit warnings if it finds a directory that almost has a platform.
-# TODO: Enable when tree is clean.
-_WARN_ON_ALMOST = False
-
-
-def _IsValidPlatformFilenameList(directory, filenames):
-  """Determines if |filenames| contains the required files for a valid port."""
-  missing = set(_PLATFORM_FILES) - set(filenames)
-  if missing:
-    if len(missing) < (len(_PLATFORM_FILES) / 2) and _WARN_ON_ALMOST:
-      logging.warning('Directory %s contains several files needed for a '
-                      'platform, but not all of them. In particular, it is '
-                      'missing: %s', directory, ', '.join(missing))
-  return not missing
-
-
-def _GetPlatformName(root, directory):
-  """Gets the name of a platform found at |directory| off of |root|."""
-  assert directory.startswith(root)
-  start = len(root) + 1  # Remove the trailing slash from the root.
-
-  assert start < len(directory)
-
-  # Calculate the name based on relative path from search root to directory.
-  return re.sub(r'[^a-zA-Z0-9_]', r'-', directory[start:])
-
-
-def _EnumeratePlatforms(root_path, exclusion_set=None):
-  """Generator that iterates over Starboard platforms found under |path|."""
-  if not exclusion_set:
-    exclusion_set = set()
-
-  for current_path, directories, filenames in os.walk(root_path):
-    # Don't walk into any directories in the exclusion set.
-    directories[:] = (x for x in directories
-                      if os.path.join(current_path, x) not in exclusion_set)
-
-    # Determine if the current directory is a valid port directory.
-    if _IsValidPlatformFilenameList(current_path, filenames):
-      if current_path == root_path:
-        logging.warning('Found platform at search path root: %s', current_path)
-      name = _GetPlatformName(root_path, current_path)
-      yield PlatformInfo(name, current_path)
-
-
-def _FindAllPlatforms():
-  """Search the filesystem for all valid Starboard platforms.
-
-  Returns:
-    A Mapping of name->PlatformInfo.
-  """
-
-  result = {}
-  search_path = environment.GetStarboardPortRoots()
-
-  # Ignore search path directories inside other search path directories.
-  exclusion_set = set(search_path)
-
-  for entry in search_path:
-    if not os.path.isdir(entry):
-      continue
-    for platform_info in _EnumeratePlatforms(entry, exclusion_set):
-      if platform_info.name in result:
-        logging.error('Found duplicate port name "%s" at "%s" and "%s"',
-                      platform_info.name, result[platform_info.name],
-                      platform_info.path)
-      result[platform_info.name] = platform_info
-
-  return result
-
-
-# Cache of name->PlatformInfo mapping.
-_INFO_MAP = None
-
-
-def _GetInfoMap():
-  """Gets mapping of platform names to PlatformInfo objects."""
-  global _INFO_MAP
-  if not _INFO_MAP:
-    _INFO_MAP = _FindAllPlatforms()
-  return _INFO_MAP
-
-
-# Cache of the sorted list of all platform names.
-_ALL = None
-
-
-def GetAll():
-  """Gets a sorted list of all valid Starboard platform names."""
-  global _ALL
-  if not _ALL:
-    _ALL = sorted(_GetInfoMap().keys())
-  return _ALL
-
-
-def Get(platform_name):
-  """Gets the PlatformInfo for the given platform name, or None."""
-  return _GetInfoMap().get(platform_name)
-
-
-def GetAllInfos():
-  """Gets a sorted sequence of PlatformInfo objects for all valid platforms."""
-  return (Get(p) for p in GetAll())
-
-
-def IsValid(platform_name):
-  """Determines whether the given platform name is valid."""
-  return platform_name in _GetInfoMap()
-
-
-class PlatformInfo(object):
-  """Information about a specific Starboard platform."""
-
-  def __init__(self, name, path):
-    self.name = name
-    self.path = path
diff --git a/starboard/tools/platform.py.template b/starboard/tools/platform.py.template
deleted file mode 100644
index 204d415..0000000
--- a/starboard/tools/platform.py.template
+++ /dev/null
@@ -1,83 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Functionality to enumerate and represent starboard ports."""
-
-import os
-import _env
-from starboard.tools import environment
-
-# The name->platform path mapping.
-_PATH_MAP = $platforms_map
-_PATH_MAP = {k:os.path.normpath(v) for k,v in _PATH_MAP.iteritems()}
-
-
-# Cache of the name->PlatformInfo mapping.
-_INFO_MAP = None
-
-
-def _ConstructInfoMap():
-  """Constructs mapping of platform names to PlatformInfo objects.
-
-  Returns:
-    A Mapping of name->PlatformInfo.
-  """
-  result = {}
-  for name, path in _PATH_MAP.iteritems():
-    result[name] = PlatformInfo(name, path)
-  return result
-
-
-def _GetInfoMap():
-  """Gets mapping of platform names to PlatformInfo objects."""
-  global _INFO_MAP
-  if not _INFO_MAP:
-    _INFO_MAP = _ConstructInfoMap()
-  return _INFO_MAP
-
-
-# Cache of the sorted list of all platform names.
-_ALL = None
-
-
-def GetAll():
-  """Gets a sorted list of all valid Starboard platform names."""
-  global _ALL
-  if not _ALL:
-    _ALL = sorted(_GetInfoMap().keys())
-  return _ALL
-
-
-def Get(platform_name):
-  """Gets the PlatformInfo for the given platform name, or None."""
-  return _GetInfoMap().get(platform_name)
-
-
-def GetAllInfos():
-  """Gets a sorted sequence of PlatformInfo objects for all valid platforms."""
-  return (Get(p) for p in GetAll())
-
-
-def IsValid(platform_name):
-  """Determines whether the given platform name is valid."""
-  return platform_name in _GetInfoMap()
-
-
-class PlatformInfo(object):
-  """Information about a specific Starboard platform."""
-
-  def __init__(self, name, path):
-    self.name = name
-    self.path = path
diff --git a/starboard/tools/platform_test.py b/starboard/tools/platform_test.py
deleted file mode 100755
index 58142f3..0000000
--- a/starboard/tools/platform_test.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Tests the platform module."""
-
-import platform
-import unittest
-
-
-class PlatformTest(unittest.TestCase):
-
-  def testGetAll(self):
-    platform_names = platform.GetAll()
-    self.assertNotEqual(0, len(platform_names))
-
-  def testGet(self):
-    platform_names = platform.GetAll()
-    self.assertNotEqual(0, len(platform_names))
-    platform_name = platform_names[0]
-    platform_info = platform.Get(platform_name)
-    self.assertTrue(platform_info)
-    self.assertEqual(platform_name, platform_info.name)
-    self.assertTrue(platform_info.path)
-
-  def testIsValid(self):
-    platform_names = platform.GetAll()
-    for platform_name in platform_names:
-      self.assertTrue(platform.IsValid(platform_name))
-      self.assertTrue(platform.IsValid(platform_name.lower()))
-      self.assertFalse(platform.IsValid(platform_name.upper()))
-    self.assertFalse(platform.IsValid('invalidplatform'))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/starboard/tools/port_symlink.py b/starboard/tools/port_symlink.py
index f248abc..b77a817 100644
--- a/starboard/tools/port_symlink.py
+++ b/starboard/tools/port_symlink.py
@@ -16,14 +16,12 @@
 """A portable interface for symlinking."""
 
 import argparse
-import logging
 import os
 import shutil
 import sys
 
-import _env  # pylint: disable=relative-import,unused-import
-
 from starboard.tools import util
+from starboard.tools import win_symlink
 
 
 def IsWindows():
@@ -33,8 +31,6 @@
 def ToLongPath(path):
   """Converts to a path that supports long filenames."""
   if IsWindows():
-    # pylint: disable=g-import-not-at-top
-    from starboard.tools import win_symlink
     return win_symlink.ToDevicePath(path)
   else:
     return path
@@ -43,8 +39,6 @@
 def IsSymLink(path):
   """Platform neutral version os os.path.islink()."""
   if IsWindows():
-    # pylint: disable=g-import-not-at-top
-    from starboard.tools import win_symlink
     return win_symlink.IsReparsePoint(path)
   else:
     return os.path.islink(path)
@@ -61,8 +55,6 @@
     None
   """
   if IsWindows():
-    # pylint: disable=g-import-not-at-top
-    from starboard.tools import win_symlink
     win_symlink.CreateReparsePoint(target_path, link_path)
   else:
     util.MakeDirs(os.path.dirname(link_path))
@@ -72,8 +64,6 @@
 def ReadSymLink(link_path):
   """Returns the path (abs. or rel.) to the folder referred to by link_path."""
   if IsWindows():
-    # pylint: disable=g-import-not-at-top
-    from starboard.tools import win_symlink
     path = win_symlink.ReadReparsePoint(link_path)
   else:
     try:
@@ -85,8 +75,6 @@
 
 def DelSymLink(link_path):
   if IsWindows():
-    # pylint: disable=g-import-not-at-top
-    from starboard.tools import win_symlink
     win_symlink.UnlinkReparsePoint(link_path)
   else:
     os.unlink(link_path)
@@ -95,8 +83,6 @@
 def Rmtree(path):
   """See Rmtree() for documentation of this function."""
   if IsWindows():
-    # pylint: disable=g-import-not-at-top
-    from starboard.tools import win_symlink
     func = win_symlink.RmtreeShallow
   elif not os.path.islink(path):
     func = shutil.rmtree
@@ -109,8 +95,6 @@
 
 def OsWalk(root_dir, topdown=True, onerror=None, followlinks=False):
   if IsWindows():
-    # pylint: disable=g-import-not-at-top
-    from starboard.tools import win_symlink
     return win_symlink.OsWalk(root_dir, topdown, onerror, followlinks)
   else:
     return os.walk(root_dir, topdown, onerror, followlinks)
diff --git a/starboard/tools/port_symlink_test.py b/starboard/tools/port_symlink_test.py
index 1932e9d..5eb4326 100644
--- a/starboard/tools/port_symlink_test.py
+++ b/starboard/tools/port_symlink_test.py
@@ -13,14 +13,13 @@
 # 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.
+"""Unit tests for port_symlink.py."""
 
 import os
 import shutil
 import tempfile
 import unittest
 
-import _env  # pylint: disable=relative-import,unused-import
-
 from starboard.tools import port_symlink
 from starboard.tools import util
 
@@ -53,14 +52,11 @@
 
   def setUp(self):
     super(PortSymlinkTest, self).setUp()
-    self.tmp_dir = os.path.join(tempfile.gettempdir(), 'port_symlink')
-    if os.path.exists(self.tmp_dir):
-      Rmtree(self.tmp_dir)
+    self.tmp_dir = tempfile.mkdtemp(prefix='port_symlink_')
     self.target_dir = os.path.join(self.tmp_dir, 'target')
     self.inner_dir = os.path.join(self.target_dir, 'inner')
     self.link_dir = os.path.join(self.tmp_dir, 'link')
     self.target_file = os.path.join(self.target_dir, _TARGET_FILENAME)
-    _MakeDirs(self.tmp_dir)
     _MakeDirs(self.target_dir)
     _MakeDirs(self.inner_dir)
     with open(self.target_file, 'w') as fd:
@@ -135,13 +131,13 @@
   def testOsWalk(self):
     paths_nofollow_links = _GetAllPaths(self.tmp_dir, followlinks=False)
     paths_follow_links = _GetAllPaths(self.tmp_dir, followlinks=True)
-    print '\nOsWalk Follow links:'
+    print('\nOsWalk Follow links:')
     for path in paths_follow_links:
-      print '  ' + path + ' (' + _PathTypeToString(path) + ')'
-    print '\nOsWalk No-Follow links:'
+      print('  ' + path + ' (' + _PathTypeToString(path) + ')')
+    print('\nOsWalk No-Follow links:')
     for path in paths_nofollow_links:
-      print '  ' + path + ' (' + _PathTypeToString(path) + ')'
-    print ''
+      print('  ' + path + ' (' + _PathTypeToString(path) + ')')
+    print('')
     self.assertIn(self.link_dir, paths_nofollow_links)
     self.assertIn(self.link_dir, paths_follow_links)
     self.assertIn(
diff --git a/starboard/tools/send_link.py b/starboard/tools/send_link.py
index 10a5a5d..4072c9e 100755
--- a/starboard/tools/send_link.py
+++ b/starboard/tools/send_link.py
@@ -126,7 +126,7 @@
       if not _ConnectWithRetry(s, port, connection_attempts):
         logging.exception('Could not connect to port: %d', port)
         return 1
-      terminated_link = link + '\x00'
+      terminated_link = (link + '\x00').encode()
       bytes_sent = 0
       while bytes_sent < len(terminated_link):
         sent = s.send(terminated_link[bytes_sent:])
diff --git a/starboard/tools/symbolize/_env.py b/starboard/tools/symbolize/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/starboard/tools/symbolize/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/tools/symbolize/symbolize.py b/starboard/tools/symbolize/symbolize.py
index cd135a6..bc7611a 100644
--- a/starboard/tools/symbolize/symbolize.py
+++ b/starboard/tools/symbolize/symbolize.py
@@ -34,8 +34,6 @@
 will always output the results of the symbolizer.
 """
 
-import _env  # pylint: disable=unused-import
-
 import argparse
 import os
 import re
@@ -113,8 +111,9 @@
     offset:  The offset into the library of the symbol we are looking for.
   """
   if int(offset) >= 0:
-    command = subprocess.Popen([_SYMBOLIZER, '-e', library, offset, '-f'],
-                               stdout=subprocess.PIPE)
+    command = subprocess.Popen(  # pylint:disable=consider-using-with
+        [_SYMBOLIZER, '-e', library, offset, '-f'],
+        stdout=subprocess.PIPE)
     results = command.communicate()
     if command.returncode == 0:
       return results[0].split(os.linesep)
@@ -127,8 +126,8 @@
       '-f',
       '--filename',
       required=True,
-      help='The path to the file that contains the stack traces, crashes, or raw addresses.'
-  )
+      help='The path to the file that contains the stack traces, crashes, or '
+      'raw addresses.')
   arg_parser.add_argument(
       '-l',
       '--library',
diff --git a/starboard/tools/testing/_env.py b/starboard/tools/testing/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/starboard/tools/testing/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/starboard/tools/testing/build_tests.py b/starboard/tools/testing/build_tests.py
index ba2dd9b..fc35f55 100644
--- a/starboard/tools/testing/build_tests.py
+++ b/starboard/tools/testing/build_tests.py
@@ -16,14 +16,14 @@
 import logging
 import subprocess
 
-APP_LAUNCHER_TARGET = 'app_launcher_zip'
+APP_LAUNCHER_TARGET = 'build_app_launcher_zip'
 
 
 def BuildTargets(targets, out_directory, dry_run=False, extra_build_flags=None):
   """Builds all specified targets.
 
   Args:
-    targets: Gyp targets to be built
+    targets: GN targets to be built
     out_directory: Directory to build to
     dry_run: Whether to run ninja with -n (dry run)
     extra_build_flags: Array of additional command line flags to pass to ninja
@@ -40,7 +40,7 @@
     args_list.append('-n')
 
   args_list.append(APP_LAUNCHER_TARGET)
-  args_list.extend(['{}_deploy'.format(test_name) for test_name in targets])
+  args_list.extend(['{}_install'.format(test_name) for test_name in targets])
   if extra_build_flags:
     args_list.extend(extra_build_flags)
 
diff --git a/starboard/tools/testing/test_runner.py b/starboard/tools/testing/test_runner.py
index a51f5ca..0a721d5 100755
--- a/starboard/tools/testing/test_runner.py
+++ b/starboard/tools/testing/test_runner.py
@@ -26,8 +26,7 @@
 import threading
 import traceback
 
-import _env  # pylint: disable=unused-import, relative-import
-import cStringIO
+from six.moves import cStringIO as StringIO
 from starboard.tools import abstract_launcher
 from starboard.tools import build
 from starboard.tools import command_line
@@ -79,10 +78,9 @@
   return targets
 
 
-def _VerifyConfig(config):
+def _VerifyConfig(config, filters):
   """Ensures a platform or app config is self-consistent."""
   targets = config.GetTestTargets()
-  filters = config.GetTestFilters()
   filter_targets = [
       f.target_name for f in filters if f != test_filter.DISABLE_TESTING
   ]
@@ -105,7 +103,7 @@
 
   def __init__(self, read_pipe):
     self.read_pipe = read_pipe
-    self.output_lines = cStringIO.StringIO()
+    self.output_lines = StringIO()
     self.stop_event = threading.Event()
     self.reader_thread = threading.Thread(target=self._ReadLines)
 
@@ -259,13 +257,15 @@
     self.threads = []
 
     _EnsureBuildDirectoryExists(self.out_directory)
-    _VerifyConfig(self._platform_config)
+    _VerifyConfig(self._platform_config,
+                  self._platform_test_filters.GetTestFilters())
 
     if self.loader_platform:
       _EnsureBuildDirectoryExists(self.loader_out_directory)
-      _VerifyConfig(self._loader_platform_config)
+      _VerifyConfig(self._loader_platform_config,
+                    self._loader_platform_test_filters.GetTestFilters())
 
-    _VerifyConfig(self._app_config)
+    _VerifyConfig(self._app_config, self._app_config.GetTestFilters())
 
     # If a particular test binary has been provided, configure only that one.
     logging.info("Getting test targets")
@@ -373,7 +373,7 @@
   def _GetAllTestEnvVariables(self):
     """Gets all environment variables used for tests on the given platform."""
     env_variables = {}
-    for test, test_env in self._app_config.GetTestEnvVariables().iteritems():
+    for test, test_env in self._app_config.GetTestEnvVariables().items():
       if test in env_variables:
         env_variables[test].update(test_env)
       else:
diff --git a/starboard/tools/toolchain_deprecated.py b/starboard/tools/toolchain_deprecated.py
deleted file mode 100644
index 81de44e..0000000
--- a/starboard/tools/toolchain_deprecated.py
+++ /dev/null
@@ -1,160 +0,0 @@
-# Copyright 2017 The Cobalt Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Starboard's abstract Toolchain which is implemented for each platform."""
-
-import abc
-
-
-class ABCMetaSingleton(abc.ABCMeta):
-  instances = {}
-
-  def __call__(cls, *args, **kwargs):
-    if cls not in cls.instances:
-      cls.instances[cls] = super(ABCMetaSingleton, cls).__call__(
-          *args, **kwargs)
-    return cls.instances[cls]
-
-
-class Toolchain(object):
-  """This is an abstract interface of the Toolchain."""
-  __metaclass__ = ABCMetaSingleton
-
-  # TODO: move variables / commands
-  #   AR / _HOST
-  #   ARFLAGS / _HOST
-  #   ARTHINFLAGS / _HOST
-  #   CC / CC_HOST
-  #   CXX / CXX_HOST
-  #   LD / LD_HOST
-  #   RC / RC_HOST
-  # And / or implement NinjaWriter.WriteSources & GenerateOutputForConfig body
-  # here.
-
-  @abc.abstractmethod
-  def Define(self, d):
-    pass
-
-  @abc.abstractmethod
-  def EncodeRspFileList(self, args):
-    pass
-
-  @abc.abstractmethod
-  def ExpandEnvVars(self, path, env):
-    pass
-
-  @abc.abstractmethod
-  def ExpandRuleVariables(self, path, root, dirname, source, ext, name):
-    pass
-
-  @abc.abstractmethod
-  def GenerateEnvironmentFiles(self, toplevel_build_dir, generator_flags,
-                               open_out):
-    pass
-
-  @abc.abstractmethod
-  def GetCompilerSettings(self):
-    pass
-
-  @abc.abstractmethod
-  def GetPrecompiledHeader(self, **kwargs):
-    pass
-
-  @abc.abstractmethod
-  def InitCompilerSettings(self, spec, **kwargs):
-    pass
-
-  @abc.abstractmethod
-  def SetAdditionalGypVariables(self, default_variables, **kwargs):
-    pass
-
-  @abc.abstractmethod
-  def VerifyMissingSources(self, sources, **kwargs):
-    pass
-
-  @abc.abstractmethod
-  def QuoteForRspFile(self, arg):
-    pass
-
-
-class PrecompiledHeader:
-  """Abstract precompiled header settings class."""
-  __metaclass__ = abc.ABCMeta
-
-  @abc.abstractmethod
-  def __init__(self):
-    pass
-
-  @abc.abstractmethod
-  def GetFlagsModifications(self, input_flags, output, implicit, command,
-                            cflags_c, cflags_cc, expand_special):
-    pass
-
-  @abc.abstractmethod
-  def GetPchBuildCommands(self):
-    pass
-
-  @abc.abstractmethod
-  def GetInclude(self):
-    pass
-
-  @abc.abstractmethod
-  def GetObjDependencies(self, sources, output):
-    pass
-
-
-class CompilerSettings:
-  """Abstract Compiler Settings class."""
-  __metaclass__ = abc.ABCMeta
-
-  @abc.abstractmethod
-  def __init__(self):
-    pass
-
-  @abc.abstractmethod
-  def GetArch(self, config):
-    pass
-
-  @abc.abstractmethod
-  def GetCflags(self, config):
-    pass
-
-  @abc.abstractmethod
-  def GetCflagsC(self, config):
-    pass
-
-  @abc.abstractmethod
-  def GetCflagsCC(self, config):
-    pass
-
-  @abc.abstractmethod
-  def GetCflagsObjectiveC(self, config):
-    pass
-
-  @abc.abstractmethod
-  def GetCflagsObjectiveCC(self, config):
-    pass
-
-  @abc.abstractmethod
-  def GetDefines(self, config):
-    pass
-
-  @abc.abstractmethod
-  def GetLdFlags(self, config, **kwargs):
-    pass
-
-  @abc.abstractmethod
-  def GetLibFlags(self, config, gyp_path_to_ninja):
-    pass
-
-  @abc.abstractmethod
-  def GetRcFlags(self, config, gyp_path_to_ninja):
-    pass
-
-  @abc.abstractmethod
-  def ProcessIncludeDirs(self, include_dirs, config_name):
-    pass
-
-  @abc.abstractmethod
-  def ProcessLibraries(self, libraries, config_name):
-    pass
diff --git a/starboard/tools/tools.gyp b/starboard/tools/tools.gyp
deleted file mode 100644
index f6fe913..0000000
--- a/starboard/tools/tools.gyp
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# The Starboard "all" target, which includes all interesting targets for the
-# Starboard project.
-
-{
-  'targets': [
-    {
-      'target_name': 'app_launcher_zip',
-      'type': 'none',
-      'variables': {
-        'app_launcher_packager_path': 'app_launcher_packager.py',
-        'app_launcher_zip_file': '<(PRODUCT_DIR)/app_launcher.zip',
-      },
-      'actions': [
-        {
-          'action_name': 'package_app_launcher',
-          'message': 'Zipping <(app_launcher_zip_file)',
-          'inputs': [
-            '<!@pymod_do_main(starboard.tools.app_launcher_packager -l --return_list)',
-          ],
-          'outputs': [
-            '<(app_launcher_zip_file)',
-          ],
-          'action': [
-            'python2',
-            '<(app_launcher_packager_path)',
-            '-z',
-            '<(app_launcher_zip_file)',
-          ],
-        },
-      ],
-    },
-  ]
-}
diff --git a/starboard/tools/util.py b/starboard/tools/util.py
index b3de5c6..eab3644 100644
--- a/starboard/tools/util.py
+++ b/starboard/tools/util.py
@@ -32,6 +32,7 @@
       return full_name
   return None
 
+
 def MakeDirs(destination_dir):
   """Wrapper around os.makedirs that is a noop if the directory exists."""
   if os.path.isdir(destination_dir):
@@ -82,39 +83,14 @@
 
   logging.debug('shell is %r', shell)
 
-  return subprocess.Popen(cmd_line,
-                          shell=shell,
-                          stdout=subprocess.PIPE,
-                          stderr=subprocess.STDOUT,
-                          env=env,
-                          cwd=cwd,
-                          universal_newlines=True)
-
-
-def Execute(cmd_line, env=None, cwd=None, shell=None):
-  """Run the specific command line and handle error.
-
-  Args:
-    cmd_line: Command line. Can either be a list of args or a string.
-    env: Dict of environment variables.
-    cwd: Working directory for the process.
-    shell: Set to True to spawn a shell for the process.
-  Raises:
-    RuntimeError: if process returns an error.
-  Returns:
-    bytearray containing any command output.
-  """
-
-  proc = SpawnProcess(cmd_line, env, cwd, shell)
-  output = bytearray()
-  for line in proc.stdout:
-    logging.info(line.rstrip())
-    output += line
-
-  if proc.wait() != 0:
-    msg = '%s failed (%d):\n%s' % (cmd_line, proc.returncode, output)
-    raise RuntimeError(msg)
-  return output
+  return subprocess.Popen(
+      cmd_line,
+      shell=shell,
+      stdout=subprocess.PIPE,
+      stderr=subprocess.STDOUT,
+      env=env,
+      cwd=cwd,
+      universal_newlines=True)
 
 
 def ExecuteMultiple(cmd_line_list,
@@ -190,7 +166,7 @@
   """
   MakeCleanDirs(destination_dir)
   logging.info('Decompressing %s -> %s', archive_file, destination_dir)
-  zip_file = zipfile.ZipFile(archive_file, mode='r')
+  zip_file = zipfile.ZipFile(archive_file, mode='r')  # pylint: disable=consider-using-with
   zip_file.extractall(destination_dir)
 
 
@@ -212,9 +188,9 @@
   for source, dest in job_list:
     logging.info('Compressing %s -> %s.zip', source, dest)
     outputs.append('%s.zip' % dest)
-    compress_procs.append(multiprocessing.Process(target=shutil.make_archive,
-                                                  args=(dest, 'zip', source,
-                                                        None)))
+    compress_procs.append(
+        multiprocessing.Process(
+            target=shutil.make_archive, args=(dest, 'zip', source, None)))
 
   for proc in compress_procs:
     proc.start()
@@ -224,6 +200,7 @@
     proc.join()
   return outputs
 
+
 def SetupDefaultLoggingConfig(logging_lvl=logging.INFO):
   fmt = '[%(filename)s:%(lineno)s:%(levelname)s] %(message)s'
   logging.basicConfig(format=fmt, level=logging_lvl)
diff --git a/starboard/tools/win_symlink.py b/starboard/tools/win_symlink.py
index 8426b21..939f6a8 100644
--- a/starboard/tools/win_symlink.py
+++ b/starboard/tools/win_symlink.py
@@ -12,7 +12,6 @@
 # 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.
-
 """Provides functions for symlinking on Windows.
 
 Reparse points: Are os-level symlinks for folders which can be created without
@@ -32,7 +31,6 @@
 import subprocess
 import time
 
-
 _RETRY_TIMES = 10
 
 
@@ -48,7 +46,9 @@
   Returns:
     Absolute device path starting with "\\?\".
   """
-  if not isinstance(dos_path, unicode) and encoding is not None:
+  # This type is compatible with both python 2 and 3.
+  unicode_type = type(u'')
+  if not isinstance(dos_path, unicode_type) and encoding is not None:
     dos_path = dos_path.decode(encoding)
   path = os.path.abspath(dos_path)
   if path.startswith(u'\\\\'):
@@ -64,7 +64,7 @@
       os.rmdir(path)
       return
     except Exception:  # pylint: disable=broad-except
-      if i == _RETRY_TIMES-1:
+      if i == _RETRY_TIMES - 1:
         raise
       else:
         time.sleep(.1)
@@ -143,8 +143,8 @@
 def ReadReparsePoint(path):
   """Mimics os.readlink for usage."""
   try:
-    # pylint: disable=g-import-not-at-top
-    import win_symlink_fast
+    # pylint: disable=import-outside-toplevel
+    from starboard.tools import win_symlink_fast
     return win_symlink_fast.FastReadReparseLink(path)
   except Exception as err:  # pylint: disable=broad-except
     logging.exception(' error: %s, falling back to command line version.', err)
@@ -154,10 +154,10 @@
 def IsReparsePoint(path):
   """Mimics os.islink for usage."""
   try:
-    # pylint: disable=g-import-not-at-top
-    import win_symlink_fast
+    # pylint: disable=import-outside-toplevel
+    from starboard.tools import win_symlink_fast
     return win_symlink_fast.FastIsReparseLink(path)
-  except  Exception as err:  # pylint: disable=broad-except
+  except Exception as err:  # pylint: disable=broad-except
     logging.exception(' error: %s, falling back to command line version.', err)
     return None is not ReadReparsePointShell(path)
 
@@ -180,15 +180,16 @@
   else:
     UnlinkReparsePoint(link_folder)  # Deletes if it exists.
   try:
-    # pylint: disable=g-import-not-at-top
-    import win_symlink_fast
+    # pylint: disable=import-outside-toplevel
+    from starboard.tools import win_symlink_fast
     win_symlink_fast.FastCreateReparseLink(from_folder, link_folder)
     return
   except OSError:
     pass
   except Exception as err:  # pylint: disable=broad-except
-    logging.exception('unexpected error: %s, from=%s, link=%s, falling back to '
-                      'command line version.', err, from_folder, link_folder)
+    logging.exception(
+        'unexpected error: %s, from=%s, link=%s, falling back to '
+        'command line version.', err, from_folder, link_folder)
   par_dir = os.path.dirname(link_folder)
   if not os.path.isdir(par_dir):
     os.makedirs(par_dir)
diff --git a/starboard/tools/win_symlink_fast.py b/starboard/tools/win_symlink_fast.py
index 987a69b..8c5e940 100644
--- a/starboard/tools/win_symlink_fast.py
+++ b/starboard/tools/win_symlink_fast.py
@@ -12,16 +12,12 @@
 # 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.
-
-
 """Provides functions for symlinking on Windows."""
 
-
 import ctypes
 from ctypes import wintypes
 import os
 
-
 DWORD = wintypes.DWORD
 LPCWSTR = wintypes.LPCWSTR
 HANDLE = wintypes.HANDLE
@@ -31,54 +27,48 @@
 ULONG = wintypes.ULONG
 WCHAR = wintypes.WCHAR
 
-
-kernel32 = wintypes.WinDLL('kernel32')
+kernel32 = ctypes.windll.kernel32
 LPDWORD = ctypes.POINTER(DWORD)
 UCHAR = ctypes.c_ubyte
 
-
 GetFileAttributesW = kernel32.GetFileAttributesW
 GetFileAttributesW.restype = DWORD
 GetFileAttributesW.argtypes = (LPCWSTR,)  # lpFileName In
 
-
 INVALID_FILE_ATTRIBUTES = 0xFFFFFFFF
 FILE_ATTRIBUTE_REPARSE_POINT = 0x00400
 
-
 CreateFileW = kernel32.CreateFileW
 CreateFileW.restype = HANDLE
-CreateFileW.argtypes = (LPCWSTR,  # lpFileName In
-                        DWORD,    # dwDesiredAccess In
-                        DWORD,    # dwShareMode In
-                        LPVOID,   # lpSecurityAttributes In_opt
-                        DWORD,    # dwCreationDisposition In
-                        DWORD,    # dwFlagsAndAttributes In
-                        HANDLE)   # hTemplateFile In_opt
-
+CreateFileW.argtypes = (
+    LPCWSTR,  # lpFileName In
+    DWORD,  # dwDesiredAccess In
+    DWORD,  # dwShareMode In
+    LPVOID,  # lpSecurityAttributes In_opt
+    DWORD,  # dwCreationDisposition In
+    DWORD,  # dwFlagsAndAttributes In
+    HANDLE)  # hTemplateFile In_opt
 
 CloseHandle = kernel32.CloseHandle
 CloseHandle.restype = BOOL
 CloseHandle.argtypes = (HANDLE,)  # hObject In
 
-
-INVALID_HANDLE_VALUE = HANDLE(-1).value
+INVALID_HANDLE_VALUE = HANDLE(-1).value  # pylint:disable=invalid-name
 OPEN_EXISTING = 3
 FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
 FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
 
-
 DeviceIoControl = kernel32.DeviceIoControl
 DeviceIoControl.restype = BOOL
-DeviceIoControl.argtypes = (HANDLE,   # hDevice In
-                            DWORD,    # dwIoControlCode In
-                            LPVOID,   # lpInBuffer In_opt
-                            DWORD,    # nInBufferSize In
-                            LPVOID,   # lpOutBuffer Out_opt
-                            DWORD,    # nOutBufferSize In
-                            LPDWORD,  # lpBytesReturned Out_opt
-                            LPVOID)   # lpOverlapped Inout_opt
-
+DeviceIoControl.argtypes = (
+    HANDLE,  # hDevice In
+    DWORD,  # dwIoControlCode In
+    LPVOID,  # lpInBuffer In_opt
+    DWORD,  # nInBufferSize In
+    LPVOID,  # lpOutBuffer Out_opt
+    DWORD,  # nOutBufferSize In
+    LPDWORD,  # lpBytesReturned Out_opt
+    LPVOID)  # lpOverlapped Inout_opt
 
 FSCTL_GET_REPARSE_POINT = 0x000900A8
 IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003
@@ -99,11 +89,9 @@
   """Win32 api data structure."""
 
   _fields_ = (('SubstituteNameOffset', USHORT),
-              ('SubstituteNameLength', USHORT),
-              ('PrintNameOffset', USHORT),
-              ('PrintNameLength', USHORT),
-              ('Flags', ULONG),
-              ('PathBuffer', WCHAR * 1))
+              ('SubstituteNameLength', USHORT), ('PrintNameOffset', USHORT),
+              ('PrintNameLength', USHORT), ('Flags', ULONG), ('PathBuffer',
+                                                              WCHAR * 1))
 
   @property
   def print_name(self):
@@ -125,10 +113,8 @@
 class MountPointReparseBuffer(ctypes.Structure):
   """Win32 api data structure."""
   _fields_ = (('SubstituteNameOffset', USHORT),
-              ('SubstituteNameLength', USHORT),
-              ('PrintNameOffset', USHORT),
-              ('PrintNameLength', USHORT),
-              ('PathBuffer', WCHAR * 1))
+              ('SubstituteNameLength', USHORT), ('PrintNameOffset', USHORT),
+              ('PrintNameLength', USHORT), ('PathBuffer', WCHAR * 1))
 
   @property
   def print_name(self):
@@ -151,15 +137,17 @@
     _fields_ = (('SymbolicLinkReparseBuffer', SymbolicLinkReparseBuffer),
                 ('MountPointReparseBuffer', MountPointReparseBuffer),
                 ('GenericReparseBuffer', GenericReparseBuffer))
-  _fields_ = (('ReparseTag', ULONG),
-              ('ReparseDataLength', USHORT),
-              ('Reserved', USHORT),
-              ('ReparseBuffer', ReparseBuffer))
+
+  _fields_ = (('ReparseTag', ULONG), ('ReparseDataLength', USHORT),
+              ('Reserved', USHORT), ('ReparseBuffer', ReparseBuffer))
   _anonymous_ = ('ReparseBuffer',)
 
 
 def _ToUnicode(s):
-  return s.decode('utf-8')
+  try:
+    return s.decode('utf-8')
+  except AttributeError:
+    return s
 
 
 _kdll = None
@@ -212,26 +200,18 @@
 def FastReadReparseLink(path):
   """See api docstring, above."""
   path = _ToUnicode(path)
-  reparse_point_handle = CreateFileW(path,
-                                     0,
-                                     0,
-                                     None,
-                                     OPEN_EXISTING,
-                                     FILE_FLAG_OPEN_REPARSE_POINT |
-                                     FILE_FLAG_BACKUP_SEMANTICS,
-                                     None)
+  reparse_point_handle = CreateFileW(
+      path, 0, 0, None, OPEN_EXISTING,
+      FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, None)
   if reparse_point_handle == INVALID_HANDLE_VALUE:
     return None
   # Remove false positive below.
   # pylint: disable=deprecated-method
   target_buffer = ctypes.c_buffer(MAXIMUM_REPARSE_DATA_BUFFER_SIZE)
   n_bytes_returned = DWORD()
-  io_result = DeviceIoControl(reparse_point_handle,
-                              FSCTL_GET_REPARSE_POINT,
-                              None, 0,
-                              target_buffer, len(target_buffer),
-                              ctypes.byref(n_bytes_returned),
-                              None)
+  io_result = DeviceIoControl(reparse_point_handle, FSCTL_GET_REPARSE_POINT,
+                              None, 0, target_buffer, len(target_buffer),
+                              ctypes.byref(n_bytes_returned), None)
   CloseHandle(reparse_point_handle)
   if not io_result:
     return None
diff --git a/starboard/tools/win_symlink_fast_test.py b/starboard/tools/win_symlink_fast_test.py
index 473a2f8..9def20b 100644
--- a/starboard/tools/win_symlink_fast_test.py
+++ b/starboard/tools/win_symlink_fast_test.py
@@ -12,16 +12,11 @@
 # 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.
-
 """Tests the win_symlink_fast functionality."""
 
 import sys
 import unittest
 
-
-import _env  # pylint: disable=relative-import,unused-import
-
-
 if __name__ == '__main__' and sys.platform == 'win32':
   from starboard.tools import port_symlink_test  # pylint: disable=g-import-not-at-top
   from starboard.tools import util  # pylint: disable=g-import-not-at-top
diff --git a/starboard/tools/win_symlink_test.py b/starboard/tools/win_symlink_test.py
index 851ae76..ffad024 100644
--- a/starboard/tools/win_symlink_test.py
+++ b/starboard/tools/win_symlink_test.py
@@ -12,7 +12,6 @@
 # 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.
-
 """Tests win_symlink."""
 
 import os
@@ -21,10 +20,6 @@
 import tempfile
 import unittest
 
-
-import _env  # pylint: disable=relative-import,unused-import
-
-
 if __name__ == '__main__' and sys.platform == 'win32':
   from starboard.tools import port_symlink_test  # pylint: disable=g-import-not-at-top
   from starboard.tools import util  # pylint: disable=g-import-not-at-top
@@ -65,7 +60,7 @@
           fd.write('HI')
         link_dir = os.path.join(self.tmp_dir, 'foo', 'link_dir')
         MakeSymLink(external_temp_file, link_dir)
-        win_symlink._RmtreeOsWalk(self.tmp_dir)
+        win_symlink._RmtreeOsWalk(self.tmp_dir)  # pylint:disable=protected-access
         # The target file should still exist
         self.assertTrue(os.path.isfile(external_temp_file))
       finally:
@@ -80,12 +75,11 @@
           fd.write('HI')
         link_dir = os.path.join(self.tmp_dir, 'foo', 'link_dir')
         MakeSymLink(external_temp_file, link_dir)
-        win_symlink._RmtreeShellCmd(self.tmp_dir)
+        win_symlink._RmtreeShellCmd(self.tmp_dir)  # pylint:disable=protected-access
         # The target file should still exist
         self.assertTrue(os.path.isfile(external_temp_file))
       finally:
         shutil.rmtree(external_temp_dir, ignore_errors=True)
 
-
   util.SetupDefaultLoggingConfig()
   unittest.main(verbosity=2)
diff --git a/starboard/ui_navigation.h b/starboard/ui_navigation.h
index ba7a0a9..01754a9 100644
--- a/starboard/ui_navigation.h
+++ b/starboard/ui_navigation.h
@@ -38,8 +38,6 @@
 #include "starboard/types.h"
 #include "starboard/window.h"
 
-#if SB_API_VERSION >= 12
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -317,6 +315,4 @@
 }  // extern "C"
 #endif
 
-#endif  // SB_API_VERSION >= 12
-
 #endif  // STARBOARD_UI_NAVIGATION_H_
diff --git a/starboard/linux/x64x11/sbversion/__init__.py b/starboard/win/__init__.py
similarity index 100%
rename from starboard/linux/x64x11/sbversion/__init__.py
rename to starboard/win/__init__.py
diff --git a/starboard/win/shared/BUILD.gn b/starboard/win/shared/BUILD.gn
new file mode 100644
index 0000000..662e967
--- /dev/null
+++ b/starboard/win/shared/BUILD.gn
@@ -0,0 +1,384 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/win/visual_studio_version.gni")
+import("//starboard/build/convert_i18n_data.gni")
+import("//starboard/shared/starboard/player/buildfiles.gni")
+
+config("starboard_platform_config") {
+  if (current_os == "winuwp") {
+    # We want this to apply to all shared win sources for xb1.
+    configs = [ "//starboard/xb1:starboard_platform_config" ]
+  }
+  include_dirs = [
+    "//third_party/angle/include",
+    "//third_party/angle/include/EGL",
+    "//third_party/angle/include/GLES2",
+    "//third_party/angle/include/KHR",
+  ]
+
+  cflags = [
+    "/EHsc",  # C++ exceptions (required with /ZW)
+  ]
+
+  cflags += [
+    "/FU${msvc_path}/lib/x86/store/references/platform.winmd",
+    "/FU${windows_sdk_path}/References/$wdk_version/Windows.Foundation.FoundationContract/4.0.0.0/Windows.Foundation.FoundationContract.winmd",
+    "/FU${windows_sdk_path}/References/$wdk_version/Windows.Foundation.UniversalApiContract/14.0.0.0/Windows.Foundation.UniversalApiContract.winmd",
+    "/FU${windows_sdk_path}/References/$wdk_version/Windows.UI.ViewManagement.ViewManagementViewScalingContract/1.0.0.0/Windows.UI.ViewManagement.ViewManagementViewScalingContract.winmd",
+    "/FU${windows_sdk_path}/References/$wdk_version/Windows.Xbox.ApplicationResourcesContract/2.0.0.0/Windows.Xbox.ApplicationResourcesContract.winmd",
+    "/FU${windows_sdk_path}/References/$wdk_version/Windows.Xbox.Security.ApplicationSpecificDeviceAuthenticationContract/1.0.0.0/Windows.Xbox.Security.ApplicationSpecificDeviceAuthenticationContract.winmd",
+  ]
+}
+
+static_library("starboard_platform") {
+  has_pedantic_warnings = true
+
+  sources = [
+    "//starboard/common/thread.cc",
+    "//starboard/common/thread.h",
+    "//starboard/shared/egl/system_egl.cc",
+    "//starboard/shared/gles/system_gles2.cc",
+    "//starboard/shared/iso/character_is_alphanumeric.cc",
+    "//starboard/shared/iso/character_is_digit.cc",
+    "//starboard/shared/iso/character_is_hex_digit.cc",
+    "//starboard/shared/iso/character_is_space.cc",
+    "//starboard/shared/iso/character_is_upper.cc",
+    "//starboard/shared/iso/character_to_lower.cc",
+    "//starboard/shared/iso/character_to_upper.cc",
+    "//starboard/shared/iso/double_absolute.cc",
+    "//starboard/shared/iso/double_exponent.cc",
+    "//starboard/shared/iso/double_floor.cc",
+    "//starboard/shared/iso/double_is_finite.cc",
+    "//starboard/shared/iso/double_is_nan.cc",
+    "//starboard/shared/iso/memory_compare.cc",
+    "//starboard/shared/iso/memory_copy.cc",
+    "//starboard/shared/iso/memory_find_byte.cc",
+    "//starboard/shared/iso/memory_move.cc",
+    "//starboard/shared/iso/memory_set.cc",
+    "//starboard/shared/iso/string_compare.cc",
+    "//starboard/shared/iso/string_compare_all.cc",
+    "//starboard/shared/iso/string_find_character.cc",
+    "//starboard/shared/iso/string_find_last_character.cc",
+    "//starboard/shared/iso/string_find_string.cc",
+    "//starboard/shared/iso/string_get_length.cc",
+    "//starboard/shared/iso/string_get_length_wide.cc",
+    "//starboard/shared/iso/string_parse_double.cc",
+    "//starboard/shared/iso/string_parse_signed_integer.cc",
+    "//starboard/shared/iso/string_parse_uint64.cc",
+    "//starboard/shared/iso/string_parse_unsigned_integer.cc",
+    "//starboard/shared/iso/string_scan.cc",
+    "//starboard/shared/iso/system_binary_search.cc",
+    "//starboard/shared/iso/system_sort.cc",
+    "//starboard/shared/nouser/user_get_current.cc",
+    "//starboard/shared/nouser/user_get_property.cc",
+    "//starboard/shared/nouser/user_get_signed_in.cc",
+    "//starboard/shared/nouser/user_internal.cc",
+    "//starboard/shared/opus/opus_audio_decoder.cc",
+    "//starboard/shared/opus/opus_audio_decoder.h",
+    "//starboard/shared/posix/socket_is_ipv6_supported.cc",
+    "//starboard/shared/starboard/application.cc",
+    "//starboard/shared/starboard/audio_sink/audio_sink_create.cc",
+    "//starboard/shared/starboard/audio_sink/audio_sink_destroy.cc",
+    "//starboard/shared/starboard/audio_sink/audio_sink_get_min_buffer_size_in_frames.cc",
+    "//starboard/shared/starboard/audio_sink/audio_sink_internal.cc",
+    "//starboard/shared/starboard/audio_sink/audio_sink_internal.h",
+    "//starboard/shared/starboard/audio_sink/audio_sink_is_valid.cc",
+    "//starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc",
+    "//starboard/shared/starboard/audio_sink/stub_audio_sink_type.h",
+    "//starboard/shared/starboard/command_line.cc",
+    "//starboard/shared/starboard/command_line.h",
+    "//starboard/shared/starboard/drm/drm_close_session.cc",
+    "//starboard/shared/starboard/drm/drm_destroy_system.cc",
+    "//starboard/shared/starboard/drm/drm_generate_session_update_request.cc",
+    "//starboard/shared/starboard/drm/drm_get_metrics.cc",
+    "//starboard/shared/starboard/drm/drm_system_internal.h",
+    "//starboard/shared/starboard/drm/drm_update_session.cc",
+    "//starboard/shared/starboard/event_cancel.cc",
+    "//starboard/shared/starboard/event_schedule.cc",
+    "//starboard/shared/starboard/file_atomic_replace_write_file.cc",
+    "//starboard/shared/starboard/file_atomic_replace_write_file.h",
+    "//starboard/shared/starboard/file_mode_string_to_flags.cc",
+    "//starboard/shared/starboard/file_storage/storage_close_record.cc",
+    "//starboard/shared/starboard/file_storage/storage_delete_record.cc",
+    "//starboard/shared/starboard/file_storage/storage_get_record_size.cc",
+    "//starboard/shared/starboard/file_storage/storage_open_record.cc",
+    "//starboard/shared/starboard/file_storage/storage_read_record.cc",
+    "//starboard/shared/starboard/log_mutex.cc",
+    "//starboard/shared/starboard/log_mutex.h",
+    "//starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc",
+    "//starboard/shared/starboard/media/media_get_audio_buffer_budget.cc",
+    "//starboard/shared/starboard/media/media_get_audio_output_count_single_audio_output.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_alignment.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_allocation_unit.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_garbage_collection_duration_threshold.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_padding.cc",
+    "//starboard/shared/starboard/media/media_get_buffer_storage_type.cc",
+    "//starboard/shared/starboard/media/media_get_initial_buffer_capacity.cc",
+    "//starboard/shared/starboard/media/media_get_progressive_buffer_budget.cc",
+    "//starboard/shared/starboard/media/media_get_video_buffer_budget.cc",
+    "//starboard/shared/starboard/media/media_is_buffer_pool_allocate_on_demand.cc",
+    "//starboard/shared/starboard/media/media_is_buffer_using_memory_pool.cc",
+    "//starboard/shared/starboard/media/mime_type.cc",
+    "//starboard/shared/starboard/media/mime_type.h",
+    "//starboard/shared/starboard/memory.cc",
+    "//starboard/shared/starboard/net_args.cc",
+    "//starboard/shared/starboard/net_args.h",
+    "//starboard/shared/starboard/net_log.cc",
+    "//starboard/shared/starboard/net_log.h",
+    "//starboard/shared/starboard/string_concat.cc",
+    "//starboard/shared/starboard/string_concat_wide.cc",
+    "//starboard/shared/starboard/string_copy.cc",
+    "//starboard/shared/starboard/string_copy_wide.cc",
+    "//starboard/shared/starboard/string_duplicate.cc",
+    "//starboard/shared/stub/accessibility_get_caption_settings.cc",
+    "//starboard/shared/stub/accessibility_get_display_settings.cc",
+    "//starboard/shared/stub/accessibility_get_text_to_speech_settings.cc",
+    "//starboard/shared/stub/accessibility_set_captions_enabled.cc",
+    "//starboard/shared/stub/cpu_features_get.cc",
+    "//starboard/shared/stub/image_decode.cc",
+    "//starboard/shared/stub/image_is_decode_supported.cc",
+    "//starboard/shared/stub/media_set_audio_write_duration.cc",
+    "//starboard/shared/stub/speech_synthesis_cancel.cc",
+    "//starboard/shared/stub/speech_synthesis_is_supported.cc",
+    "//starboard/shared/stub/speech_synthesis_speak.cc",
+    "//starboard/shared/stub/system_get_total_gpu_memory.cc",
+    "//starboard/shared/stub/system_get_used_gpu_memory.cc",
+    "//starboard/shared/stub/system_has_capability.cc",
+    "//starboard/shared/stub/system_hide_splash_screen.cc",
+    "//starboard/shared/stub/system_network_is_disconnected.cc",
+    "//starboard/shared/stub/system_sign_with_certification_secret_key.cc",
+    "//starboard/shared/stub/thread_context_get_pointer.cc",
+    "//starboard/shared/stub/thread_create_priority.cc",
+    "//starboard/shared/stub/thread_sampler_create.cc",
+    "//starboard/shared/stub/thread_sampler_destroy.cc",
+    "//starboard/shared/stub/thread_sampler_freeze.cc",
+    "//starboard/shared/stub/thread_sampler_is_supported.cc",
+    "//starboard/shared/stub/thread_sampler_thaw.cc",
+    "//starboard/shared/stub/time_get_monotonic_thread_now.cc",
+    "//starboard/shared/stub/time_is_time_thread_now_supported.cc",
+    "//starboard/shared/stub/ui_nav_get_interface.cc",
+    "//starboard/shared/stub/window_blur_on_screen_keyboard.cc",
+    "//starboard/shared/stub/window_focus_on_screen_keyboard.cc",
+    "//starboard/shared/stub/window_get_diagonal_size_in_inches.cc",
+    "//starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc",
+    "//starboard/shared/stub/window_hide_on_screen_keyboard.cc",
+    "//starboard/shared/stub/window_is_on_screen_keyboard_shown.cc",
+    "//starboard/shared/stub/window_on_screen_keyboard_is_supported.cc",
+    "//starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc",
+    "//starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc",
+    "//starboard/shared/stub/window_show_on_screen_keyboard.cc",
+    "//starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc",
+    "//starboard/shared/win32/adapter_utils.cc",
+    "//starboard/shared/win32/adapter_utils.h",
+    "//starboard/shared/win32/atomic_public.h",
+    "//starboard/shared/win32/atomic_queue.h",
+    "//starboard/shared/win32/audio_decoder.cc",
+    "//starboard/shared/win32/audio_decoder.h",
+    "//starboard/shared/win32/audio_decoder_thread.cc",
+    "//starboard/shared/win32/audio_decoder_thread.h",
+    "//starboard/shared/win32/audio_sink.cc",
+    "//starboard/shared/win32/audio_sink_get_max_channels.cc",
+    "//starboard/shared/win32/audio_sink_get_nearest_supported_sample_frequency.cc",
+    "//starboard/shared/win32/audio_sink_is_audio_frame_storage_type_supported.cc",
+    "//starboard/shared/win32/audio_sink_is_audio_sample_type_supported.cc",
+    "//starboard/shared/win32/audio_transform.cc",
+    "//starboard/shared/win32/audio_transform.h",
+    "//starboard/shared/win32/auto_event_handle.h",
+    "//starboard/shared/win32/byte_swap.cc",
+    "//starboard/shared/win32/condition_variable_broadcast.cc",
+    "//starboard/shared/win32/condition_variable_create.cc",
+    "//starboard/shared/win32/condition_variable_destroy.cc",
+    "//starboard/shared/win32/condition_variable_signal.cc",
+    "//starboard/shared/win32/condition_variable_wait.cc",
+    "//starboard/shared/win32/condition_variable_wait_timed.cc",
+    "//starboard/shared/win32/decode_target_internal.cc",
+    "//starboard/shared/win32/decode_target_internal.h",
+    "//starboard/shared/win32/decrypting_decoder.cc",
+    "//starboard/shared/win32/decrypting_decoder.h",
+    "//starboard/shared/win32/directory_can_open.cc",
+    "//starboard/shared/win32/directory_close.cc",
+    "//starboard/shared/win32/directory_create.cc",
+    "//starboard/shared/win32/directory_get_next.cc",
+    "//starboard/shared/win32/directory_internal.cc",
+    "//starboard/shared/win32/directory_internal.h",
+    "//starboard/shared/win32/directory_open.cc",
+    "//starboard/shared/win32/drm_system_playready.cc",
+    "//starboard/shared/win32/drm_system_playready.h",
+    "//starboard/shared/win32/dx_context_video_decoder.cc",
+    "//starboard/shared/win32/dx_context_video_decoder.h",
+    "//starboard/shared/win32/environment.cc",
+    "//starboard/shared/win32/error_utils.cc",
+    "//starboard/shared/win32/error_utils.h",
+    "//starboard/shared/win32/file_atomic_replace.cc",
+    "//starboard/shared/win32/file_can_open.cc",
+    "//starboard/shared/win32/file_close.cc",
+    "//starboard/shared/win32/file_delete.cc",
+    "//starboard/shared/win32/file_exists.cc",
+    "//starboard/shared/win32/file_flush.cc",
+    "//starboard/shared/win32/file_get_info.cc",
+    "//starboard/shared/win32/file_get_path_info.cc",
+    "//starboard/shared/win32/file_internal.cc",
+    "//starboard/shared/win32/file_internal.h",
+    "//starboard/shared/win32/file_open.cc",
+    "//starboard/shared/win32/file_read.cc",
+    "//starboard/shared/win32/file_seek.cc",
+    "//starboard/shared/win32/file_truncate.cc",
+    "//starboard/shared/win32/file_write.cc",
+    "//starboard/shared/win32/graphics.cc",
+    "//starboard/shared/win32/graphics.h",
+    "//starboard/shared/win32/hardware_decode_target_internal.cc",
+    "//starboard/shared/win32/hardware_decode_target_internal.h",
+    "//starboard/shared/win32/log.cc",
+    "//starboard/shared/win32/log_flush.cc",
+    "//starboard/shared/win32/log_format.cc",
+    "//starboard/shared/win32/log_is_tty.cc",
+    "//starboard/shared/win32/log_raw_dump_stack.cc",
+    "//starboard/shared/win32/media_common.cc",
+    "//starboard/shared/win32/media_common.h",
+    "//starboard/shared/win32/media_foundation_utils.cc",
+    "//starboard/shared/win32/media_foundation_utils.h",
+    "//starboard/shared/win32/media_get_max_buffer_capacity.cc",
+    "//starboard/shared/win32/media_transform.cc",
+    "//starboard/shared/win32/media_transform.h",
+    "//starboard/shared/win32/memory_allocate_aligned_unchecked.cc",
+    "//starboard/shared/win32/memory_allocate_unchecked.cc",
+    "//starboard/shared/win32/memory_flush.cc",
+    "//starboard/shared/win32/memory_free.cc",
+    "//starboard/shared/win32/memory_free_aligned.cc",
+    "//starboard/shared/win32/memory_get_stack_bounds.cc",
+    "//starboard/shared/win32/memory_map.cc",
+    "//starboard/shared/win32/memory_protect.cc",
+    "//starboard/shared/win32/memory_reallocate_unchecked.cc",
+    "//starboard/shared/win32/memory_unmap.cc",
+    "//starboard/shared/win32/mutex_acquire.cc",
+    "//starboard/shared/win32/mutex_acquire_try.cc",
+    "//starboard/shared/win32/mutex_create.cc",
+    "//starboard/shared/win32/mutex_destroy.cc",
+    "//starboard/shared/win32/mutex_release.cc",
+    "//starboard/shared/win32/once.cc",
+    "//starboard/shared/win32/set_non_blocking_internal.cc",
+    "//starboard/shared/win32/set_non_blocking_internal.h",
+    "//starboard/shared/win32/socket_accept.cc",
+    "//starboard/shared/win32/socket_bind.cc",
+    "//starboard/shared/win32/socket_clear_last_error.cc",
+    "//starboard/shared/win32/socket_connect.cc",
+    "//starboard/shared/win32/socket_create.cc",
+    "//starboard/shared/win32/socket_destroy.cc",
+    "//starboard/shared/win32/socket_free_resolution.cc",
+    "//starboard/shared/win32/socket_get_interface_address.cc",
+    "//starboard/shared/win32/socket_get_last_error.cc",
+    "//starboard/shared/win32/socket_get_local_address.cc",
+    "//starboard/shared/win32/socket_internal.cc",
+    "//starboard/shared/win32/socket_internal.h",
+    "//starboard/shared/win32/socket_is_connected.cc",
+    "//starboard/shared/win32/socket_is_connected_and_idle.cc",
+    "//starboard/shared/win32/socket_join_multicast_group.cc",
+    "//starboard/shared/win32/socket_listen.cc",
+    "//starboard/shared/win32/socket_receive_from.cc",
+    "//starboard/shared/win32/socket_resolve.cc",
+    "//starboard/shared/win32/socket_send_to.cc",
+    "//starboard/shared/win32/socket_set_broadcast.cc",
+    "//starboard/shared/win32/socket_set_receive_buffer_size.cc",
+    "//starboard/shared/win32/socket_set_reuse_address.cc",
+    "//starboard/shared/win32/socket_set_send_buffer_size.cc",
+    "//starboard/shared/win32/socket_set_tcp_keep_alive.cc",
+    "//starboard/shared/win32/socket_set_tcp_no_delay.cc",
+    "//starboard/shared/win32/socket_set_tcp_window_scaling.cc",
+    "//starboard/shared/win32/socket_waiter_add.cc",
+    "//starboard/shared/win32/socket_waiter_create.cc",
+    "//starboard/shared/win32/socket_waiter_destroy.cc",
+    "//starboard/shared/win32/socket_waiter_internal.cc",
+    "//starboard/shared/win32/socket_waiter_remove.cc",
+    "//starboard/shared/win32/socket_waiter_wait.cc",
+    "//starboard/shared/win32/socket_waiter_wait_timed.cc",
+    "//starboard/shared/win32/socket_waiter_wake_up.cc",
+    "//starboard/shared/win32/storage_write_record.cc",
+    "//starboard/shared/win32/string_compare_no_case.cc",
+    "//starboard/shared/win32/string_compare_no_case_n.cc",
+    "//starboard/shared/win32/string_compare_wide.cc",
+    "//starboard/shared/win32/string_format.cc",
+    "//starboard/shared/win32/string_format_wide.cc",
+    "//starboard/shared/win32/system_break_into_debugger.cc",
+    "//starboard/shared/win32/system_clear_last_error.cc",
+    "//starboard/shared/win32/system_get_connection_type.cc",
+    "//starboard/shared/win32/system_get_error_string.cc",
+    "//starboard/shared/win32/system_get_last_error.cc",
+    "//starboard/shared/win32/system_get_locale_id.cc",
+    "//starboard/shared/win32/system_get_number_of_processors.cc",
+    "//starboard/shared/win32/system_get_random_data.cc",
+    "//starboard/shared/win32/system_get_random_uint64.cc",
+    "//starboard/shared/win32/system_get_stack.cc",
+    "//starboard/shared/win32/system_is_debugger_attached.cc",
+    "//starboard/shared/win32/thread_create.cc",
+    "//starboard/shared/win32/thread_create_local_key.cc",
+    "//starboard/shared/win32/thread_destroy_local_key.cc",
+    "//starboard/shared/win32/thread_detach.cc",
+    "//starboard/shared/win32/thread_get_current.cc",
+    "//starboard/shared/win32/thread_get_id.cc",
+    "//starboard/shared/win32/thread_get_local_value.cc",
+    "//starboard/shared/win32/thread_get_name.cc",
+    "//starboard/shared/win32/thread_is_equal.cc",
+    "//starboard/shared/win32/thread_join.cc",
+    "//starboard/shared/win32/thread_local_internal.cc",
+    "//starboard/shared/win32/thread_local_internal.h",
+    "//starboard/shared/win32/thread_private.cc",
+    "//starboard/shared/win32/thread_private.h",
+    "//starboard/shared/win32/thread_set_local_value.cc",
+    "//starboard/shared/win32/thread_set_name.cc",
+    "//starboard/shared/win32/thread_sleep.cc",
+    "//starboard/shared/win32/thread_yield.cc",
+    "//starboard/shared/win32/time_get_monotonic_now.cc",
+    "//starboard/shared/win32/time_get_now.cc",
+    "//starboard/shared/win32/time_utils.h",
+    "//starboard/shared/win32/time_zone_get_current.cc",
+    "//starboard/shared/win32/time_zone_get_name.cc",
+    "//starboard/shared/win32/video_decoder.cc",
+    "//starboard/shared/win32/video_decoder.h",
+    "//starboard/shared/win32/wchar_utils.h",
+    "//starboard/shared/win32/win32_audio_decoder.cc",
+    "//starboard/shared/win32/win32_audio_decoder.h",
+    "//starboard/shared/win32/wrm_header.cc",
+    "//starboard/shared/win32/wrm_header.h",
+  ]
+
+  sources += common_player_sources
+
+  configs += [
+    "//starboard/build/config:starboard_implementation",
+    ":starboard_platform_config",
+  ]
+
+  public_deps = [
+    "//starboard/common",
+    "//starboard/shared/starboard/media:media_util",
+    "//starboard/shared/starboard/player/filter:filter_based_player_sources",
+  ]
+
+  deps = [
+    "//cobalt/content/i18n/platform/xb1",
+    "//starboard/egl_and_gles",
+    "//starboard/shared/starboard/media:media_util",
+    "//starboard/shared/starboard/player/filter:filter_based_player_sources",
+    "//third_party/opus",
+  ]
+
+  if (is_internal_build) {
+    deps += [ "//starboard/private/shared/stub:private_sources" ]
+  }
+
+  if (gl_type == "angle") {
+    deps += [ "//third_party/angle:translator" ]
+  }
+}
diff --git a/starboard/win/shared/configuration_constants.cc b/starboard/win/shared/configuration_constants.cc
new file mode 100644
index 0000000..2979ddf
--- /dev/null
+++ b/starboard/win/shared/configuration_constants.cc
@@ -0,0 +1,137 @@
+// Copyright 2019 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This file defines all configuration constants for a platform.
+
+#include "starboard/configuration_constants.h"
+
+// Determines the threshhold of allocation size that should be done with mmap
+// (if available), rather than allocated within the core heap.
+const size_t kSbDefaultMmapThreshold = 256 * 1024U;
+
+// The current platform's maximum length of the name of a single directory
+// entry, not including the absolute path.
+const int32_t kSbFileMaxName = 260;
+
+// The current platform's maximum number of files that can be opened at the
+// same time by one process.
+// This is set to MAXIMUM_WAIT_OBJECTS - 1, since we use WaitForMultipleEvents
+// and that only supports MAXIMUM_WAIT_OBJECTS events.  The -1 is since we
+// use a dummy event to wake up the socket.
+const uint32_t kSbFileMaxOpen = 63;
+
+// The current platform's alternate file path component separator character.
+// This is like SB_FILE_SEP_CHAR, except if your platform supports an alternate
+// character, then you can place that here. For example, on windows machines,
+// the primary separator character is probably '\', but the alternate is '/'.
+const char kSbFileAltSepChar = '/';
+
+// The string form of SB_FILE_ALT_SEP_CHAR.
+const char* kSbFileAltSepString = "/";
+
+// The current platform's maximum length of an absolute path.
+const uint32_t kSbFileMaxPath = 4096;
+
+// The current platform's file path component separator character. This is the
+// character that appears after a directory in a file path. For example, the
+// absolute canonical path of the file "/path/to/a/file.txt" uses '/' as a path
+// component separator character.
+const char kSbFileSepChar = '\\';
+
+// The string form of SB_FILE_SEP_CHAR.
+const char* kSbFileSepString = "\\";
+
+// Allow ac3 and ec3 support
+const bool kSbHasAc3Audio = true;
+
+// Specifies whether this platform has webm/vp9 support.  This should be set to
+// non-zero on platforms with webm/vp9 support.
+const bool kSbHasMediaWebmVp9Support = true;
+
+// Whether the current platform supports thread priorities.
+const bool kSbHasThreadPrioritySupport = true;
+
+// Determines the alignment that allocations should have on this platform.
+const size_t kSbMallocAlignment = 16;
+
+// The maximum number of thread local storage keys supported by this platform.
+const uint32_t kSbMaxThreadLocalKeys = 512;
+
+// The maximum length of a name for a thread, including the NULL-terminator.
+const int32_t kSbMaxThreadNameLength = 16;
+
+// Defines the path where memory debugging logs should be written to.
+const char* kSbMemoryLogPath = "/tmp/starboard";
+
+// The maximum audio bitrate the platform can decode.  The following value
+// equals to 5M bytes per seconds which is more than enough for compressed
+// audio.
+const uint32_t kSbMediaMaxAudioBitrateInBitsPerSecond = 40 * 1024 * 1024;
+
+// The maximum video bitrate the platform can decode.  The following value
+// equals to 25M bytes per seconds which is more than enough for compressed
+// video.
+const uint32_t kSbMediaMaxVideoBitrateInBitsPerSecond = 200 * 1024 * 1024;
+
+// Specifies how video frame buffers must be aligned on this platform.
+const uint32_t kSbMediaVideoFrameAlignment = 256;
+
+// The memory page size, which controls the size of chunks on memory that
+// allocators deal with, and the alignment of those chunks. This doesn't have to
+// be the hardware-defined physical page size, but it should be a multiple of
+// it.
+const size_t kSbMemoryPageSize = 4096;
+
+// Specifies the network receive buffer size in bytes, set via
+// SbSocketSetReceiveBufferSize().
+//
+// Setting this to 0 indicates that SbSocketSetReceiveBufferSize() should
+// not be called. Use this for OSs (such as Linux) where receive buffer
+// auto-tuning is better.
+//
+// On some platforms, this may affect max TCP window size which may
+// dramatically affect throughput in the presence of latency.
+//
+// If your platform does not have a good TCP auto-tuning mechanism,
+// a setting of (128 * 1024) here is recommended.
+const uint32_t kSbNetworkReceiveBufferSize = 0;
+
+// Defines the maximum number of simultaneous threads for this platform. Some
+// platforms require sharing thread handles with other kinds of system handles,
+// like mutexes, so we want to keep this manageable.
+const uint32_t kSbMaxThreads = 90;
+
+// The current platform's search path component separator character. When
+// specifying an ordered list of absolute paths of directories to search for a
+// given reason, this is the character that appears between entries. For
+// example, the search path of "/etc/search/first:/etc/search/second" uses ':'
+// as a search path component separator character.
+#ifdef __cplusplus
+extern "C" {
+#endif
+const char kSbPathSepChar = ';';
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+// The string form of SB_PATH_SEP_CHAR.
+const char* kSbPathSepString = ";";
+
+// Specifies the preferred byte order of color channels in a pixel. Refer to
+// starboard/configuration.h for the possible values. EGL/GLES platforms should
+// generally prefer a byte order of RGBA, regardless of endianness.
+const int kSbPreferredRgbaByteOrder = SB_PREFERRED_RGBA_BYTE_ORDER_RGBA;
+
+// The maximum number of users that can be signed in at the same time.
+const uint32_t kSbUserMaxSignedIn = 1;
diff --git a/starboard/win/shared/configuration_public.h b/starboard/win/shared/configuration_public.h
new file mode 100644
index 0000000..1033510
--- /dev/null
+++ b/starboard/win/shared/configuration_public.h
@@ -0,0 +1,171 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
+
+#ifndef STARBOARD_WIN_SHARED_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_WIN_SHARED_CONFIGURATION_PUBLIC_H_
+
+// --- Architecture Configuration --------------------------------------------
+
+// --- System Header Configuration -------------------------------------------
+
+// Any system headers listed here that are not provided by the platform will be
+// emulated in starboard/types.h.
+
+// Whether the current platform provides the standard header sys/types.h.
+#define SB_HAS_SYS_TYPES_H 0
+
+// Whether the current platform provides ssize_t.
+#define SB_HAS_SSIZE_T 0
+
+#if !defined(__WCHAR_MAX__)
+#include <wchar.h>
+#define __WCHAR_MAX__ WCHAR_MAX
+#endif
+
+// Type detection for wchar_t.
+#if defined(__WCHAR_MAX__) && \
+    (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff)
+#define SB_IS_WCHAR_T_UTF32 1
+#elif defined(__WCHAR_MAX__) && \
+    (__WCHAR_MAX__ == 0x7fff || __WCHAR_MAX__ == 0xffff)
+#define SB_IS_WCHAR_T_UTF16 1
+#endif
+
+// Chrome only defines this for ARMEL.
+#if defined(__ARMEL__)
+// Chrome has an exclusion for iOS here, we should too when we support iOS.
+#define SB_IS_WCHAR_T_UNSIGNED 1
+#endif
+
+// --- Compiler Configuration ------------------------------------------------
+
+// The platform's annotation for forcing a C function to be inlined.
+//   https://msdn.microsoft.com/en-us/library/bw1hbe6y.aspx#Anchor_1
+#define SB_C_FORCE_INLINE __forceinline
+
+// The platform's annotation for marking a C function as suggested to be
+// inlined.
+#define SB_C_INLINE inline
+
+// The platform's annotation for marking a C function as forcibly not
+// inlined.
+#define SB_C_NOINLINE __declspec(noinline)
+
+// The platform's annotation for marking a symbol as exported outside of the
+// current shared library.
+#define SB_EXPORT_PLATFORM __declspec(dllexport)
+
+// The platform's annotation for marking a symbol as imported from outside of
+// the current linking unit.
+#define SB_IMPORT_PLATFORM
+
+// --- Extensions Configuration ----------------------------------------------
+
+// Please use <unordered_map> and <unordered_set> for the hash table types.
+#define SB_HAS_STD_UNORDERED_HASH 1
+
+// GCC/Clang doesn't define a long long hash function, except for Android and
+// Game consoles.
+#define SB_HAS_LONG_LONG_HASH 1
+
+// GCC/Clang doesn't define a string hash function, except for Game Consoles.
+#define SB_HAS_STRING_HASH 1
+
+// Desktop Linux needs a using statement for the hash functions.
+#define SB_HAS_HASH_USING 1
+
+// Set this to 1 if hash functions for custom types can be defined as a
+// hash_value() function. Otherwise, they need to be placed inside a
+// partially-specified hash struct template with an operator().
+#define SB_HAS_HASH_VALUE 1
+
+// Set this to 1 if use of hash_map or hash_set causes a deprecation warning
+// (which then breaks the build).
+#define SB_HAS_HASH_WARNING 1
+#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
+
+// The location to include hash_map on this platform.
+#define SB_HASH_MAP_INCLUDE <hash_map>
+
+// C++'s hash_map and hash_set are often found in different namespaces depending
+// on the compiler.
+#define SB_HASH_NAMESPACE stdext
+
+// The location to include hash_set on this platform.
+#define SB_HASH_SET_INCLUDE <hash_set>
+
+// --- Filesystem Configuration ----------------------------------------------
+
+// --- Graphics Configuration ------------------------------------------------
+
+// Indicates whether or not the given platform supports bilinear filtering.
+// This can be checked to enable/disable renderer tests that verify that this is
+// working properly.
+#define SB_HAS_BILINEAR_FILTERING_SUPPORT 1
+
+// Indicates whether or not the given platform supports rendering of NV12
+// textures. These textures typically originate from video decoders.
+#define SB_HAS_NV12_TEXTURE_SUPPORT 0
+
+#define SB_HAS_VIRTUAL_REALITY 0
+
+// --- I/O Configuration -----------------------------------------------------
+
+// Whether the current platform supports on screen keyboard.
+#define SB_HAS_ON_SCREEN_KEYBOARD 0
+
+// Whether the current platform has speech synthesis.
+#define SB_HAS_SPEECH_SYNTHESIS 0
+
+// --- Media Configuration ---------------------------------------------------
+
+// --- Memory Configuration --------------------------------------------------
+
+// Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is
+// required for platforms that want to JIT.
+#define SB_CAN_MAP_EXECUTABLE_MEMORY 1
+
+// --- Network Configuration -------------------------------------------------
+
+// Specifies whether this platform supports IPV6.
+#define SB_HAS_IPV6 1
+
+// Specifies whether this platform supports pipe.
+#define SB_HAS_PIPE 1
+
+// --- Thread Configuration --------------------------------------------------
+
+// --- Timing API ------------------------------------------------------------
+
+// Whether this platform has an API to retrieve how long the current thread
+// has spent in the executing state.
+#define SB_HAS_TIME_THREAD_NOW 0
+
+// --- Tuneable Parameters ---------------------------------------------------
+
+// --- User Configuration ----------------------------------------------------
+
+// --- Platform Specific Configuration ---------------------------------------
+
+// Whether or not the platform supports socket connection reset.
+#define SB_HAS_SOCKET_ERROR_CONNECTION_RESET_SUPPORT 1
+
+// --- Platform Specific Audits ----------------------------------------------
+
+// --- Platform Specific Quirks ----------------------------------------------
+
+#endif  // STARBOARD_WIN_SHARED_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/win/shared/platform_configuration/BUILD.gn b/starboard/win/shared/platform_configuration/BUILD.gn
new file mode 100644
index 0000000..37e60e7
--- /dev/null
+++ b/starboard/win/shared/platform_configuration/BUILD.gn
@@ -0,0 +1,287 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/win/visual_studio_version.gni")
+
+config("platform_configuration") {
+  # TODO(b/206809341): Migrate Detect64BitPortabilityProblems
+
+  configs = [ "//starboard/build/config/sabi" ]
+  cflags_cc = [ "/TP" ]
+  cflags = []
+  ldflags = [
+    "/NXCOMPAT",
+    "/MANIFEST:NO",
+  ]
+  libs = []
+  include_dirs = []
+  arflags = []
+  defines = [
+    "_UNICODE",
+    "UNICODE",
+  ]
+
+  if (!cobalt_fastbuild) {
+    # Containers cannot use PDBs, so we conditionally disable them.
+    # We want to keep them for non-docker builds as they make compilation
+    # significantly faster.
+    if (is_docker_build) {
+      cflags += [ "/Z7" ]
+    } else {
+      cflags += [
+        "/Zi",
+        "/FS",
+      ]
+    }
+    ldflags += [ "/DEBUG:FULL" ]
+  }
+
+  # msvs_base
+  # OutputDirectory and IntermediateDirectory, maybe CharacterSet
+  include_dirs += [
+    "$wdk_include_path/shared",
+    "$wdk_include_path/ucrt",
+    "$wdk_include_path/um",
+    "$wdk_include_path/winrt",
+    "$msvc_path/include",
+  ]
+  cflags += [
+    "/EHsc",
+    "/std:c++14",
+  ]
+
+  # msvs_debug/_devel/etc
+  ldflags += [ "/INCREMENTAL:NO" ]
+  if (is_debug) {
+    cflags += [
+      "/Od",
+
+      # Check stack frame validity and check for uninitialized variables at run time.
+      "/RTC1",
+    ]
+  } else {
+    cflags += [ "/O2" ]
+  }
+
+  if (!is_gold) {
+    libs += [ "dbghelp.lib" ]
+  }
+
+  if (is_debug || is_devel) {
+    cflags += [
+      # Use debug multithreaded library.
+      "/MDd",
+      "/GS",
+
+      # Unit tests can have huge object files.
+      "/bigobj",
+    ]
+  } else {
+    cflags += [
+      # Use release multithreaded library.
+      "/MD",
+
+      # Unreferenced variable.
+      # Often variables are only referenced in DCHECKs.
+      "/wd4189",
+    ]
+    ldflags += [
+      "/OPT:REF",
+      "/OPT:ICF",
+    ]
+  }
+
+  # target defaults
+  if (current_toolchain == default_toolchain) {
+    defines += [
+      # Disable warnings.  These options were inherited from Chromium.
+      "_CRT_SECURE_NO_DEPRECATE",
+      "_CRT_NONSTDC_NO_WARNINGS",
+      "_CRT_NONSTDC_NO_DEPRECATE",
+      "_SCL_SECURE_NO_DEPRECATE",
+
+      # Disable suggestions to switch to Microsoft-specific secure CRT.
+      "_CRT_SECURE_NO_WARNINGS",
+      "__STDC_FORMAT_MACROS",  # so that we get PRI*
+
+      # By defining this, M_PI will get #defined.
+      "_USE_MATH_DEFINES",
+
+      # min and max collide with std::min and std::max
+      "NOMINMAX",
+
+      # Conform with C99 spec.
+      "_CRT_STDIO_ISO_WIDE_SPECIFIERS",
+    ]
+  }
+
+  cflags += [
+    # Check for buffer overruns.
+    "/GS",
+
+    # "for" loop's initializer go out of scope after the for loop.
+    "/Zc:forScope",
+
+    # wchar_t is treated as a built-in type.
+    "/Zc:wchar_t",
+
+    # Don't send error reports to MS.
+    "/errorReport:none",
+  ]
+
+  arflags += [
+    # Linking statically with C++/CX library is not recommended.
+    # TODO: Remove after removing ComponentExtensions
+    "/ignore:4264",
+  ]
+
+  cflags += [
+    # Allow unused function input parameter.
+    "/wd4100",
+
+    # Conditional expression is constant.
+    # Triggers in many legitimate cases, like branching on a constant declared
+    # in type traits.
+    "/wd4127",
+
+    # Disable anonymous union warnings.
+    "/wd4201",
+
+    # 4244 (Level 2) - Implicit conversion from float to int
+    # 4244 (Level 3) - Implicit conversion from int to something smaller
+    # than int.
+    # 4244 (Level 4) - Implicit conversion of types, which may result in
+    # data loss.
+    "/wd4244",
+
+    # Class has virtual functions, but destructor is not virtual.
+    # Far less useful than in GCC because doesn't take into account the fact
+    # that destructor is not public.
+    "/wd4265",
+
+    # Inconsistent DLL linkage
+    "/wd4273",
+
+    # Matching delete operator for `new`. 4291 is also ignored by Chromium.
+    "/wd4291",
+
+    # Double -> float truncation. Not enabled on other compilers.
+    "/wd4305",
+
+    # cast truncates constant value.
+    # We do not care.
+    "/wd4309",
+
+    # casting constant number.
+    "/wd4310",
+
+    # An rvalue cannot be bound to a non-const reference.
+    # In previous versions of Visual C++, it was possible to bind an rvalue
+    # to a non-const reference in a direct initialization. This warning
+    # is useless as it simply describes proper C++ behavior.
+    "/wd4350",
+
+    # layout of class may have changed from a previous version of
+    # the compiler due to better packing of member. We don't care about
+    # binary compatibility with other compiler versions.
+    "/wd4371",
+
+    # relative include path contains '..'.
+    # This occurs in a lot third party libraries and we don't care.
+    "/wd4464",
+
+    # decorated name length exceeded, name was truncated.
+    "/wd4503",
+
+    # assignment operator could not be generated.
+    # This is expected for structs with const members.
+    "/wd4512",
+
+    # Unreferenced inline function has been removed.
+    # While detection of dead code is good, this warning triggers in
+    # third-party libraries which renders it useless.
+    "/wd4514",
+
+    # Expression before comma has no effect.
+    # Cannot be used because Microsoft uses _ASSERTE(("message", 0)) trick
+    # in malloc.h which is included pretty much everywhere.
+    "/wd4548",
+
+    # Use of noexcept in targets compiled without /EHsc triggers a warning
+    # "termination on exception is not guaranteed" which we consider benign
+    # because we don't expect exceptions to cross the boundary of modules
+    # compiled with /EHsc.
+    "/wd4577",
+
+    # Copy constructor could not be generated because a base class copy
+    # constructor is inaccessible.
+    # This is an expected consequence of using DISALLOW_COPY_AND_ASSIGN().
+    "/wd4625",
+
+    # Assignment operator could not be generated because a base class
+    # assignment operator is inaccessible.
+    # This is an expected consequence of using DISALLOW_COPY_AND_ASSIGN().
+    "/wd4626",
+
+    # Digraphs not supported.
+    "/wd4628",
+
+    # Sometimes template definitions and declarations are separate and MSVC
+    # complains when it fails to find the definition on seeing the template.
+    "/wd4661",
+
+    # Symbol is not defined as a preprocessor macro, replacing with '0'.
+    # Seems like common practice, used in Windows SDK and gtest.
+    "/wd4668",
+
+    # Function not inlined.
+    # It's up to the compiler to decide what to inline.
+    "/wd4710",
+
+    # Function selected for inline expansion.
+    # It's up to the compiler to decide what to inline.
+    "/wd4711",
+
+    # The type and order of elements caused the compiler to add padding
+    # to the end of a struct.
+    # Unsurprisingly, most of the structs become larger because of padding
+    # but it's a universally acceptable price for better performance.
+    "/wd4820",
+
+    # Disable static analyzer warning for std::min and std::max with
+    # objects.
+    # https://connect.microsoft.com/VisualStudio/feedback/details/783808/static-analyzer-warning-c28285-for-std-min-and-std-max
+    "/wd28285",
+  ]
+}
+
+config("no_pedantic_warnings") {
+  cflags = [
+    # Enable some warnings, even those that are disabled by default.
+    # See https://msdn.microsoft.com/en-us/library/23k5d385.aspx
+    "/W2",
+  ]
+}
+
+config("pedantic_warnings") {
+  cflags = [
+    # Enable some warnings, even those that are disabled by default.
+    # See https://msdn.microsoft.com/en-us/library/23k5d385.aspx
+    "/W4",
+
+    # Warn if an enumeration value is unhandled in switch (C4062).
+    # This warning is off by default, so it must be turned on explicitly.
+    "/w44062",
+  ]
+}
diff --git a/starboard/win/shared/platform_configuration/configuration.gni b/starboard/win/shared/platform_configuration/configuration.gni
new file mode 100644
index 0000000..9fac923
--- /dev/null
+++ b/starboard/win/shared/platform_configuration/configuration.gni
@@ -0,0 +1,33 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/build/config/base_configuration.gni")
+
+# No GL drivers available.
+gl_type = "angle"
+
+sabi_path = "//starboard/sabi/x64/windows/sabi-v$sb_api_version.json"
+
+install_target_path = "//starboard/build/install/no_install.gni"
+
+no_pedantic_warnings_config_path =
+    "//starboard/win/shared/platform_configuration:no_pedantic_warnings"
+pedantic_warnings_config_path =
+    "//starboard/win/shared/platform_configuration:pedantic_warnings"
+
+cobalt_platform_dependencies = [ "//starboard/egl_and_gles" ]
+
+platform_i18n_config_path = "//cobalt/content/i18n/platform/xb1:xb1"
+
+sb_enable_cpp17_audit = false
diff --git a/starboard/win/shared/system_get_path.cc b/starboard/win/shared/system_get_path.cc
new file mode 100644
index 0000000..b1d0386
--- /dev/null
+++ b/starboard/win/shared/system_get_path.cc
@@ -0,0 +1,179 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/system.h"
+
+#include <windows.h>
+// pathcch.h must come after windows.h.
+#include <pathcch.h>
+
+#include <codecvt>
+#include <cstring>
+#include <locale>
+
+#include "starboard/common/log.h"
+#include "starboard/common/string.h"
+#include "starboard/configuration_constants.h"
+#include "starboard/directory.h"
+#include "starboard/shared/win32/directory_internal.h"
+#include "starboard/shared/win32/file_internal.h"
+#include "starboard/shared/win32/wchar_utils.h"
+
+namespace {
+
+using starboard::shared::win32::CreateDirectoryHierarchy;
+using starboard::shared::win32::NormalizeWin32Path;
+
+// Places up to |path_size| - 1 characters of the path to the current
+// executable in |out_path|, ensuring it is NULL-terminated. Returns success
+// status. The result being greater than |path_size| - 1 characters is a
+// failure. |out_path| may be written to in unsuccessful cases.
+bool GetExecutablePath(char* out_path, int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+
+  std::vector<wchar_t> w_file_path(kSbFileMaxPath);
+  DWORD characters_written =
+      GetModuleFileName(NULL, w_file_path.data(), kSbFileMaxPath);
+  if (characters_written < 1) {
+    return false;
+  }
+  std::string utf8_string =
+      starboard::shared::win32::wchar_tToUTF8(w_file_path.data());
+  if (utf8_string.length() >= path_size) {
+    return false;
+  }
+  return starboard::strlcpy(out_path, utf8_string.c_str(), path_size);
+}
+
+// Places up to |path_size| - 1 characters of the path to the directory
+// containing the current executable in |out_path|, ensuring it is
+// NULL-terminated. Returns success status. The result being greater than
+// |path_size| - 1 characters is a failure. |out_path| may be written to in
+// unsuccessful cases.
+bool GetExecutableDirectory(char* out_path, int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+
+  std::vector<wchar_t> w_file_path(kSbFileMaxPath);
+  DWORD characters_written =
+      GetModuleFileName(NULL, w_file_path.data(), kSbFileMaxPath);
+  if (characters_written < 1) {
+    return false;
+  }
+  PathCchRemoveFileSpec(w_file_path.data(), kSbFileMaxPath);
+  std::string utf8_string =
+      starboard::shared::win32::wchar_tToUTF8(w_file_path.data());
+  if (utf8_string.length() >= path_size) {
+    return false;
+  }
+  return starboard::strlcpy(out_path, utf8_string.c_str(), path_size);
+}
+
+bool GetRelativeDirectory(const char* relative_path,
+                          char* out_path,
+                          int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+  std::vector<char> file_path(kSbFileMaxPath);
+  file_path[0] = '\0';
+  if (!GetExecutableDirectory(file_path.data(), path_size)) {
+    return false;
+  }
+  if (starboard::strlcat(file_path.data(), relative_path, kSbFileMaxPath) >=
+      path_size) {
+    return false;
+  }
+
+  if (!CreateDirectoryHierarchy(NormalizeWin32Path(file_path.data()))) {
+    return false;
+  }
+  return starboard::strlcpy(out_path, file_path.data(), path_size);
+}
+
+// Places up to |path_size| - 1 characters of the path to the content directory
+// in |out_path|, ensuring it is NULL-terminated. Returns success
+// status. The result being greater than |path_size| - 1 characters is a
+// failure. |out_path| may be written to in unsuccessful cases.
+bool GetContentPath(char* out_path, int path_size) {
+  return GetRelativeDirectory("\\content\\data", out_path, path_size);
+}
+
+bool GetCachePath(char* out_path, int path_size) {
+  return GetRelativeDirectory("\\content\\cache", out_path, path_size);
+}
+
+bool CreateAndGetTempPath(char* out_path, int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+  std::vector<wchar_t> w_file_path(kSbFileMaxPath);
+  w_file_path[0] = L'\0';
+
+  int64_t characters_written =
+      static_cast<int>(GetTempPathW(kSbFileMaxPath, w_file_path.data()));
+  if (characters_written >= (path_size + 1) || characters_written < 1) {
+    return false;
+  }
+  // Remove the last slash, to match other Starboard implementations.
+  w_file_path[characters_written - 1] = L'\0';
+
+  std::string utf8_string =
+      starboard::shared::win32::wchar_tToUTF8(w_file_path.data());
+
+  if (starboard::strlcpy(out_path, utf8_string.c_str(), path_size) >=
+      path_size) {
+    return false;
+  }
+  SbDirectoryCreate(out_path);
+
+  size_t length = strlen(out_path);
+  if (length < 1 || length > path_size) {
+    return false;
+  }
+  return true;
+}
+
+}  // namespace
+
+// Note: This function is only minimally implemented to allow tests to run.
+bool SbSystemGetPath(SbSystemPathId path_id, char* out_path, int path_size) {
+  if (!out_path || (path_size <= 0)) {
+    return false;
+  }
+
+  switch (path_id) {
+    case kSbSystemPathContentDirectory:
+      return GetContentPath(out_path, path_size);
+    case kSbSystemPathDebugOutputDirectory:
+      return SbSystemGetPath(kSbSystemPathTempDirectory, out_path, path_size);
+    case kSbSystemPathExecutableFile:
+      return GetExecutablePath(out_path, path_size);
+    case kSbSystemPathTempDirectory:
+      return CreateAndGetTempPath(out_path, path_size);
+    case kSbSystemPathCacheDirectory:
+      return GetCachePath(out_path, path_size);
+    case kSbSystemPathFontConfigurationDirectory:
+      return false;
+    case kSbSystemPathFontDirectory:
+      return false;
+    // TODO: implement all the other cases.
+    default:
+      SB_NOTIMPLEMENTED();
+      return false;
+  }
+}
diff --git a/starboard/win/win32/BUILD.gn b/starboard/win/win32/BUILD.gn
new file mode 100644
index 0000000..0345ec9
--- /dev/null
+++ b/starboard/win/win32/BUILD.gn
@@ -0,0 +1,85 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+static_library("starboard_platform") {
+  sources = [
+    "//starboard/shared/starboard/localized_strings.cc",
+    "//starboard/shared/starboard/media/media_get_audio_configuration_5_1.cc",
+    "//starboard/shared/starboard/queue_application.cc",
+    "//starboard/shared/starboard/system_request_blur.cc",
+    "//starboard/shared/starboard/system_request_conceal.cc",
+    "//starboard/shared/starboard/system_request_focus.cc",
+    "//starboard/shared/starboard/system_request_freeze.cc",
+    "//starboard/shared/starboard/system_request_pause.cc",
+    "//starboard/shared/starboard/system_request_reveal.cc",
+    "//starboard/shared/starboard/system_request_stop.cc",
+    "//starboard/shared/starboard/system_request_suspend.cc",
+    "//starboard/shared/starboard/system_request_unpause.cc",
+    "//starboard/shared/starboard/system_supports_resume.cc",
+    "//starboard/shared/stub/drm_is_server_certificate_updatable.cc",
+    "//starboard/shared/stub/drm_update_server_certificate.cc",
+    "//starboard/shared/stub/microphone_close.cc",
+    "//starboard/shared/stub/microphone_create.cc",
+    "//starboard/shared/stub/microphone_destroy.cc",
+    "//starboard/shared/stub/microphone_get_available.cc",
+    "//starboard/shared/stub/microphone_is_sample_rate_supported.cc",
+    "//starboard/shared/stub/microphone_open.cc",
+    "//starboard/shared/stub/microphone_read.cc",
+    "//starboard/shared/win32/application_win32.cc",
+    "//starboard/shared/win32/application_win32_key_event.cc",
+    "//starboard/shared/win32/configuration.cc",
+    "//starboard/shared/win32/configuration.h",
+    "//starboard/shared/win32/dialog.cc",
+    "//starboard/shared/win32/drm_create_system.cc",
+    "//starboard/shared/win32/get_home_directory.cc",
+    "//starboard/shared/win32/log_file_impl.cc",
+    "//starboard/shared/win32/log_file_impl.h",
+    "//starboard/shared/win32/log_raw.cc",
+    "//starboard/shared/win32/log_raw_format.cc",
+    "//starboard/shared/win32/media_is_audio_supported.cc",
+    "//starboard/shared/win32/media_is_supported.cc",
+    "//starboard/shared/win32/media_is_video_supported.cc",
+    "//starboard/shared/win32/minidump.cc",
+    "//starboard/shared/win32/minidump.h",
+    "//starboard/shared/win32/player_components_factory.cc",
+    "//starboard/shared/win32/playready_license.cc",
+    "//starboard/shared/win32/starboard_main.cc",
+    "//starboard/shared/win32/system_get_device_type.cc",
+    "//starboard/shared/win32/system_get_extensions.cc",
+    "//starboard/shared/win32/system_get_property.cc",
+    "//starboard/shared/win32/system_get_total_cpu_memory.cc",
+    "//starboard/shared/win32/system_get_used_cpu_memory.cc",
+    "//starboard/shared/win32/system_raise_platform_error.cc",
+    "//starboard/shared/win32/system_symbolize.cc",
+    "//starboard/shared/win32/window_create.cc",
+    "//starboard/shared/win32/window_destroy.cc",
+    "//starboard/shared/win32/window_get_platform_handle.cc",
+    "//starboard/shared/win32/window_get_size.cc",
+    "//starboard/shared/win32/window_internal.cc",
+    "//starboard/shared/win32/window_internal.h",
+    "//starboard/shared/win32/window_set_default_options.cc",
+    "//starboard/win/shared/configuration_constants.cc",
+    "//starboard/win/shared/system_get_path.cc",
+    "atomic_public.h",
+    "configuration_public.h",
+    "main.cc",
+  ]
+
+  configs += [
+    "//starboard/build/config:starboard_implementation",
+    "//starboard/win/shared:starboard_platform_config",
+  ]
+
+  public_deps = [ "//starboard/win/shared:starboard_platform" ]
+}
diff --git a/starboard/linux/x64x11/sbversion/__init__.py b/starboard/win/win32/__init__.py
similarity index 100%
copy from starboard/linux/x64x11/sbversion/__init__.py
copy to starboard/win/win32/__init__.py
diff --git a/starboard/win/win32/args.gn b/starboard/win/win32/args.gn
new file mode 100644
index 0000000..5dba6c9
--- /dev/null
+++ b/starboard/win/win32/args.gn
@@ -0,0 +1,19 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+target_platform = "win-win32"
+target_os = "win"
+target_cpu = "x64"
+is_clang = false
+is_internal_build = true
diff --git a/starboard/win/win32/atomic_public.h b/starboard/win/win32/atomic_public.h
new file mode 100644
index 0000000..b015b98
--- /dev/null
+++ b/starboard/win/win32/atomic_public.h
@@ -0,0 +1,20 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_WIN_WIN32_ATOMIC_PUBLIC_H_
+#define STARBOARD_WIN_WIN32_ATOMIC_PUBLIC_H_
+
+#include "starboard/shared/win32/atomic_public.h"
+
+#endif  // STARBOARD_WIN_WIN32_ATOMIC_PUBLIC_H_
diff --git a/starboard/win/win32/cobalt/configuration.py b/starboard/win/win32/cobalt/configuration.py
new file mode 100644
index 0000000..e342987
--- /dev/null
+++ b/starboard/win/win32/cobalt/configuration.py
@@ -0,0 +1,55 @@
+# Copyright 2018 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard Win32 Cobalt configuration."""
+
+from cobalt.build import cobalt_configuration
+from starboard.tools.testing import test_filter
+
+
+class CobaltWinWin32Configuration(cobalt_configuration.CobaltConfiguration):
+  """Starboard Nintendo Switch Cobalt configuration."""
+
+  def WebdriverBenchmarksEnabled(self):
+    return False
+
+  def GetTestFilters(self):
+    filters = super(CobaltWinWin32Configuration, self).GetTestFilters()
+    for target, tests in self.__FILTERED_TESTS.items():
+      filters.extend(test_filter.TestFilter(target, test) for test in tests)
+    return filters
+
+  def GetWebPlatformTestFilters(self):
+    filters = super(CobaltWinWin32Configuration,
+                    self).GetWebPlatformTestFilters()
+    filters += [
+        '*WebPlatformTest.Run*',
+    ]
+    return filters
+
+  __FILTERED_TESTS = {  # pylint: disable=invalid-name
+      # These unittest cases are failing after C++14 migration. They will be
+      # fixed soon and re-enabled.
+      'base_unittests': [
+          '*TaskScheduler*',
+          'TaskTraits*',
+      ],
+      'renderer_test': [
+          # Flaky test is still being counted as a fail.
+          ('RendererPipelineTest.FLAKY_'
+           'RasterizerSubmitCalledAtExpectedFrequencyAfterManyPipelineSubmits'),
+          ('RendererPipelineTest.FLAKY_'
+           'RasterizerSubmitCalledAtExpectedFrequencyAfterSinglePipelineSubmit'
+           ),
+      ],
+  }
diff --git a/starboard/win/win32/configuration_public.h b/starboard/win/win32/configuration_public.h
new file mode 100644
index 0000000..aaf0aad
--- /dev/null
+++ b/starboard/win/win32/configuration_public.h
@@ -0,0 +1,23 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Other source files should never include this header directly, but should
+// include the generic "starboard/configuration.h" instead.
+
+#ifndef STARBOARD_WIN_WIN32_CONFIGURATION_PUBLIC_H_
+#define STARBOARD_WIN_WIN32_CONFIGURATION_PUBLIC_H_
+
+#include "starboard/win/shared/configuration_public.h"
+
+#endif  // STARBOARD_WIN_WIN32_CONFIGURATION_PUBLIC_H_
diff --git a/starboard/win/win32/gyp_configuration.py b/starboard/win/win32/gyp_configuration.py
new file mode 100644
index 0000000..4483aa6
--- /dev/null
+++ b/starboard/win/win32/gyp_configuration.py
@@ -0,0 +1,43 @@
+# Copyright 2016 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard win-win32 platform configuration for gyp_cobalt."""
+
+from __future__ import print_function
+
+import imp  # pylint: disable=deprecated-module
+import logging
+import os
+
+from starboard.shared.win32 import gyp_configuration
+
+
+def CreatePlatformConfig():
+  try:
+    win_lib_config = WinWin32PlatformConfig('win-win32')
+    return win_lib_config
+  except RuntimeError as e:
+    logging.critical(e)
+    return None
+
+
+class WinWin32PlatformConfig(gyp_configuration.Win32SharedConfiguration):
+  """Starboard win-32 platform configuration."""
+
+  def GetLauncher(self):
+    """Gets the module used to launch applications on this platform."""
+    module_path = os.path.abspath(
+        os.path.join(os.path.dirname(__file__), 'launcher.py'))
+
+    launcher_module = imp.load_source('launcher', module_path)
+    return launcher_module
diff --git a/starboard/win/win32/launcher.py b/starboard/win/win32/launcher.py
new file mode 100644
index 0000000..4db9e51
--- /dev/null
+++ b/starboard/win/win32/launcher.py
@@ -0,0 +1,91 @@
+#
+# Copyright 2017 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard win-win32 launcher."""
+
+from __future__ import print_function
+
+import os
+import socket
+import subprocess
+import sys
+import traceback
+
+from starboard.shared.win32 import mini_dump_printer
+from starboard.tools import abstract_launcher
+
+
+class Launcher(abstract_launcher.AbstractLauncher):
+  """Run an application on Windows."""
+
+  def __init__(self, platform, target_name, config, device_id, **kwargs):
+    super(Launcher, self).__init__(platform, target_name, config, device_id,
+                                   **kwargs)
+    self.executable_path = self.GetTargetPath()
+
+    self.executable_mini_dump_path = self.executable_path + '.dmp'
+    if os.path.exists(self.executable_mini_dump_path):
+      self.LogLn('Found previous crash mini dump: deleting.')
+      os.remove(self.executable_mini_dump_path)
+
+  def Run(self):
+    """Runs launcher's executable_path."""
+    self.LogLn('\n***Running Launcher***')
+    self.proc = subprocess.Popen(  # pylint: disable=consider-using-with
+        [self.executable_path] + self.target_command_line_params,
+        stdout=self.output_file,
+        stderr=self.output_file,
+        universal_newlines=True)
+    self.pid = self.proc.pid
+    self.proc.communicate()
+    self.proc.poll()
+    rtn_code = self.proc.returncode
+    self.DetectAndHandleCrashDump()
+    self.LogLn('Finished running executable.')
+    return rtn_code
+
+  def Kill(self):
+    self.LogLn('\n***Killing Launcher***')
+    if self.pid:
+      try:
+        self.proc.kill()
+      except OSError:
+        self.LogLn('Error killing launcher with SIGKILL:')
+        traceback.print_exc(file=sys.stdout)
+        # If for some reason Kill() fails then os_.exit(1) will kill the
+        # child process without cleanup. Otherwise the process will hang.
+        os._exit(1)  # pylint: disable=protected-access
+    else:
+      self.LogLn('Kill() called before Run(), cannot kill.')
+
+  def Log(self, s):
+    self.output_file.write(s)
+
+  def LogLn(self, s):
+    self.Log(s + '\n')
+
+  def DetectAndHandleCrashDump(self):
+    if not os.path.exists(self.executable_mini_dump_path):
+      return
+    self.LogLn('\n*** Found crash dump! ***\nMinDumpPath:' +
+               self.executable_mini_dump_path)
+    mini_dump_printer.PrintMiniDump(self.executable_mini_dump_path,
+                                    self.executable_path, self.output_file)
+
+  def GetDeviceIp(self):
+    """Gets the device IP."""
+    return socket.gethostbyname(socket.getfqdn())
+
+  def GetDeviceOutputPath(self):
+    return os.getenv('TMP')
diff --git a/starboard/win/win32/main.cc b/starboard/win/win32/main.cc
new file mode 100644
index 0000000..12e66ac
--- /dev/null
+++ b/starboard/win/win32/main.cc
@@ -0,0 +1,19 @@
+// Copyright 2017 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/win32/starboard_main.h"
+
+int main(int argc, char** argv) {
+  StarboardMain(argc, argv);
+}
diff --git a/starboard/win/win32/platform_configuration/BUILD.gn b/starboard/win/win32/platform_configuration/BUILD.gn
new file mode 100644
index 0000000..6b48048
--- /dev/null
+++ b/starboard/win/win32/platform_configuration/BUILD.gn
@@ -0,0 +1,80 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/win/visual_studio_version.gni")
+
+config("platform_configuration") {
+  configs = [
+    "//starboard/build/config/sabi",
+    "//starboard/win/shared/platform_configuration",
+  ]
+
+  ldflags = [ "/SUBSYSTEM:CONSOLE" ]
+  libs = [
+    "shell32.lib",
+    "winmm.lib",
+    "gdi32.lib",
+    "dbghelp.lib",
+    "user32.lib",
+    "shlwapi.lib",
+    "mfplat.lib",
+    "mfuuid.lib",
+    "windowsapp.lib",
+  ]
+
+  include_dirs = [
+    "$wdk_include_path",
+    "$msvc_path/atlmfc/include",
+  ]
+
+  ldflags += [
+    "/DYNAMICBASE",
+
+    # TODO: SubSystem is hardcoded in
+    # win/sources_template.vcxproj. This will have the exe behave in the
+    # expected way in MSVS: when it's run without debug (Ctrl+F5), it
+    # will pause after finish; when debugging (F5) it will not pause
+    # before the cmd window disappears.
+    # Currently the value is ignored by msvs_makefile.py which generates
+    # the MSVS project files (it's in "data" in GenerateOutput()). Fix
+    # it if we ever need to change SubSystem.
+    "/SUBSYSTEM:CONSOLE",
+    "/MACHINE:x64",
+
+    # Do not generate a WinMD file.
+    "/WINMD:NO",
+
+    # Don't send error reports to MS.
+    "/errorReport:none",
+  ]
+
+  cflags = [
+    # Following V8 upstream to disable narrowing conversion.
+    "/wd4838",
+  ]
+
+  if (current_toolchain == default_toolchain) {
+    defines = [
+      "_WIN32",
+      "WIN32",
+      "WINDOWS",
+
+      # Enable GNU extensions to get prototypes like ffsl.
+      "_GNU_SOURCE=1",
+    ]
+  } else {
+    # Increase compiler heap limit.
+    cflags += [ "/Zm10" ]
+  }
+}
diff --git a/starboard/win/win32/platform_configuration/configuration.gni b/starboard/win/win32/platform_configuration/configuration.gni
new file mode 100644
index 0000000..02d30d7
--- /dev/null
+++ b/starboard/win/win32/platform_configuration/configuration.gni
@@ -0,0 +1,15 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//starboard/win/shared/platform_configuration/configuration.gni")
diff --git a/starboard/win/win32/test_filters.py b/starboard/win/win32/test_filters.py
new file mode 100644
index 0000000..59732f3
--- /dev/null
+++ b/starboard/win/win32/test_filters.py
@@ -0,0 +1,115 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Starboard win-win32 Platform Test Filters."""
+
+import logging
+import os
+
+from starboard.shared.win32 import test_filters as shared_test_filters
+from starboard.tools.testing import test_filter
+
+
+# pylint: disable=line-too-long
+_FILTERED_TESTS = {
+    'nplb': [
+        # This single test takes >15 minutes.
+        'SbPlayerTest.MultiPlayer',
+        # This test fails on win-win32 devel builds, because the compiler
+        # performs an optimization that defeats the SB_C_NOINLINE 'noinline'
+        # attribute.
+        'SbSystemGetStackTest.SunnyDayStackDirection',
+    ],
+    'player_filter_tests': [
+        # These tests fail on our VMs for win-win32 builds due to missing
+        # or non functioning system video decoders.
+        'VideoDecoderTests/VideoDecoderTest.DecodeFullGOP/0',
+        'VideoDecoderTests/VideoDecoderTest.DecodeFullGOP/2',
+        'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/0',
+        'VideoDecoderTests/VideoDecoderTest.EndOfStreamWithoutAnyInput/2',
+        'VideoDecoderTests/VideoDecoderTest.GetCurrentDecodeTargetBeforeWriteInputBuffer/0',
+        'VideoDecoderTests/VideoDecoderTest.GetCurrentDecodeTargetBeforeWriteInputBuffer/2',
+        'VideoDecoderTests/VideoDecoderTest.HoldFramesUntilFull/0',
+        'VideoDecoderTests/VideoDecoderTest.HoldFramesUntilFull/2',
+        'VideoDecoderTests/VideoDecoderTest.MaxNumberOfCachedFrames/0',
+        'VideoDecoderTests/VideoDecoderTest.MaxNumberOfCachedFrames/2',
+        'VideoDecoderTests/VideoDecoderTest.MultipleInputs/0',
+        'VideoDecoderTests/VideoDecoderTest.MultipleInputs/2',
+        'VideoDecoderTests/VideoDecoderTest.MultipleInvalidInput/0',
+        'VideoDecoderTests/VideoDecoderTest.MultipleInvalidInput/2',
+        'VideoDecoderTests/VideoDecoderTest.MultipleResets/0',
+        'VideoDecoderTests/VideoDecoderTest.MultipleResets/2',
+        'VideoDecoderTests/VideoDecoderTest.MultipleValidInputsAfterInvalidKeyFrame/0',
+        'VideoDecoderTests/VideoDecoderTest.MultipleValidInputsAfterInvalidKeyFrame/2',
+        'VideoDecoderTests/VideoDecoderTest.OutputModeSupported/0',
+        'VideoDecoderTests/VideoDecoderTest.OutputModeSupported/2',
+        'VideoDecoderTests/VideoDecoderTest.Preroll/0',
+        'VideoDecoderTests/VideoDecoderTest.Preroll/2',
+        'VideoDecoderTests/VideoDecoderTest.PrerollFrameCount/0',
+        'VideoDecoderTests/VideoDecoderTest.PrerollFrameCount/2',
+        'VideoDecoderTests/VideoDecoderTest.PrerollTimeout/0',
+        'VideoDecoderTests/VideoDecoderTest.PrerollTimeout/2',
+        'VideoDecoderTests/VideoDecoderTest.ResetAfterInput/0',
+        'VideoDecoderTests/VideoDecoderTest.ResetAfterInput/2',
+        'VideoDecoderTests/VideoDecoderTest.ResetBeforeInput/0',
+        'VideoDecoderTests/VideoDecoderTest.ResetBeforeInput/2',
+        'VideoDecoderTests/VideoDecoderTest.SingleInput/0',
+        'VideoDecoderTests/VideoDecoderTest.SingleInput/2',
+        'VideoDecoderTests/VideoDecoderTest.SingleInvalidKeyFrame/0',
+        'VideoDecoderTests/VideoDecoderTest.SingleInvalidKeyFrame/2',
+        'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/0',
+        'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/1',
+        'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/2',
+        'VideoDecoderTests/VideoDecoderTest.ThreeMoreDecoders/3',
+
+        # PlayerComponentsTests fail on our VMs. Preroll callback is always not called in
+        # 5 seconds, which causes timeout error.
+        'PlayerComponentsTests/*',
+    ],
+}
+
+# pylint: enable=line-too-long
+
+
+def CreateTestFilters():
+  return WinWin32TestFilters()
+
+
+class WinWin32TestFilters(shared_test_filters.TestFilters):
+  """Starboard win-win32 Platform Test Filters."""
+
+  def GetTestFilters(self):
+    """Gets all tests to be excluded from a unit test run.
+
+    Returns:
+      A list of initialized TestFilter objects.
+    """
+    if os.environ.get('COBALT_WIN_BUILDBOT_DISABLE_TESTS', '0') == '1':
+      logging.error('COBALT_WIN_BUILDBOT_DISABLE_TESTS=1, Tests are disabled.')
+      return [test_filter.DISABLE_TESTING]
+    else:
+      filters = super(WinWin32TestFilters, self).GetTestFilters()
+      for target, tests in _FILTERED_TESTS.items():
+        filters.extend(test_filter.TestFilter(target, test) for test in tests)
+      if os.environ.get('EXPERIMENTAL_CI', '0') == '1':
+        # Disable these tests in the experimental CI due to pending failures.
+        experimental_filtered_tests = {
+            'drain_file_test': [
+                'DrainFileTest.SunnyDay',
+                'DrainFileTest.SunnyDayPrepareDirectory',
+                'DrainFileTest.RainyDayDrainFileAlreadyExists'
+            ]
+        }
+        for target, tests in experimental_filtered_tests.items():
+          filters.extend(test_filter.TestFilter(target, test) for test in tests)
+      return filters
diff --git a/starboard/win/win32/toolchain/BUILD.gn b/starboard/win/win32/toolchain/BUILD.gn
new file mode 100644
index 0000000..4e82dcf
--- /dev/null
+++ b/starboard/win/win32/toolchain/BUILD.gn
@@ -0,0 +1,47 @@
+# Copyright 2021 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/config/win/visual_studio_version.gni")
+import("//build/toolchain/win/msvc_toolchain.gni")
+
+_base_path = "$msvc_path/bin/HostX64/x64"
+_libpaths = "/LIBPATH:\"$wdk_lib_path/ucrt/x64\" /LIBPATH:\"$wdk_lib_path/um/x64\" /LIBPATH:\"$msvc_path/lib/x64\""
+
+msvc_toolchain("host") {
+  cl = "$_base_path/cl.exe"
+  lib = "$_base_path/lib.exe"
+  link = "$_base_path/link.exe"
+  asm = "$_base_path/ml64.exe"
+  sys_lib_flags = _libpaths
+
+  toolchain_args = {
+    is_clang = false
+    current_os = "win"
+    current_cpu = "x64"
+  }
+}
+
+msvc_toolchain("target") {
+  cl = "$_base_path/cl.exe"
+  lib = "$_base_path/lib.exe"
+  link = "$_base_path/link.exe"
+  asm = "$_base_path/ml64.exe"
+  sys_lib_flags = _libpaths
+
+  toolchain_args = {
+    is_clang = false
+    current_os = "win"
+    current_cpu = "x64"
+  }
+}
diff --git a/starboard/window.h b/starboard/window.h
index 9d5a6dc..bbd7bc2 100644
--- a/starboard/window.h
+++ b/starboard/window.h
@@ -137,8 +137,6 @@
 // |window|: The SbWindow to retrieve the platform handle for.
 SB_EXPORT void* SbWindowGetPlatformHandle(SbWindow window);
 
-#if SB_API_VERSION >= 12 || SB_HAS(ON_SCREEN_KEYBOARD)
-
 // System-triggered OnScreenKeyboard events have ticket value
 // kSbEventOnScreenKeyboardInvalidTicket.
 #define kSbEventOnScreenKeyboardInvalidTicket (-1)
@@ -152,10 +150,8 @@
   float height;
 } SbWindowRect;
 
-#if SB_API_VERSION >= 12
 // Return whether the current platform supports an on screen keyboard
 SB_EXPORT bool SbWindowOnScreenKeyboardIsSupported();
-#endif
 
 // Determine if the on screen keyboard is shown.
 SB_EXPORT bool SbWindowIsOnScreenKeyboardShown(SbWindow window);
@@ -225,9 +221,6 @@
 // be undefined.
 SB_EXPORT bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window);
 
-#endif  // SB_API_VERSION >= 12 ||
-        // SB_HAS(ON_SCREEN_KEYBOARD)
-
 #ifdef __cplusplus
 }  // extern "C"
 #endif
diff --git a/testing/android/native_test.gyp b/testing/android/native_test.gyp
deleted file mode 100644
index c2ff80e..0000000
--- a/testing/android/native_test.gyp
+++ /dev/null
@@ -1,95 +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.
-
-{
-  'conditions': [
-    ['OS=="android" or (OS=="lb_shell" and target_arch=="android")', {
-      'targets': [
-        {
-          'target_name': 'native_test_apk',
-          'message': 'building native test apk',
-          'type': 'none',
-          'dependencies': [
-            'native_test_native_code',
-            '<(DEPTH)/base/base.gyp:base_java',
-          ],
-          'actions': [
-            {
-              'action_name': 'native_test_apk',
-              'inputs': [
-                '<(DEPTH)/testing/android/native_test_apk.xml',
-                '<!@(find <(DEPTH)/testing/android -name "*.java")',
-                '>@(input_jars_paths)',
-                'native_test_launcher.cc'
-              ],
-              'outputs': [
-                # Awkwardly, we build a Debug APK even when gyp is in
-                # Release mode.  I don't think it matters (e.g. we're
-                # probably happy to not codesign) but naming should be
-                # fixed.  The -debug name is an aspect of the android
-                # SDK antfiles (e.g. ${sdk.dir}/tools/ant/build.xml)
-                '<(PRODUCT_DIR)/replaceme_apk/replaceme-debug.apk',
-              ],
-              'action': [
-                'ant',
-                # TODO: All of these paths are absolute paths right now, while
-                # we really should be using relative paths for anything that is
-                # checked in to the Chromium tree (among which the SDK).
-                '-DPRODUCT_DIR=<(ant_build_out)',
-                '-DANDROID_SDK=<(android_sdk)',
-                '-DANDROID_SDK_ROOT=<(android_sdk_root)',
-                '-DANDROID_SDK_TOOLS=<(android_sdk_tools)',
-                '-DANDROID_SDK_VERSION=<(android_sdk_version)',
-                '-DANDROID_GDBSERVER=<(android_gdbserver)',
-                '-DCHROMIUM_SRC=<(ant_build_out)/../..',
-                '-DINPUT_JARS_PATHS=>(input_jars_paths)',
-                '-buildfile',
-                '<(DEPTH)/testing/android/native_test_apk.xml',
-              ]
-            }
-          ],
-        },
-        {
-          'target_name': 'native_test_native_code',
-          'message': 'building native pieces of native test package',
-          'type': 'static_library',
-          'sources': [
-            'native_test_launcher.cc',
-          ],
-          'direct_dependent_settings': {
-            'ldflags!': [
-              # JNI_OnLoad is implemented in a .a and we need to
-              # re-export in the .so.
-              '-Wl,--exclude-libs=ALL',
-            ],
-          },
-          'dependencies': [
-            '../../base/base.gyp:base',
-            '../../base/base.gyp:test_support_base',
-            '../gtest.gyp:gtest',
-            'native_test_jni_headers',
-          ],
-        },
-        {
-          'target_name': 'native_test_jni_headers',
-          'type': 'none',
-          'sources': [
-            'java/src/org/chromium/native_test/ChromeNativeTestActivity.java'
-          ],
-          'variables': {
-            'jni_gen_dir': 'testing',
-          },
-          'includes': [ '../../build/jni_generator.gypi' ],
-          # So generated jni headers can be found by targets that
-          # depend on this.
-          'direct_dependent_settings': {
-            'include_dirs': [
-              '<(SHARED_INTERMEDIATE_DIR)',
-            ],
-          },
-        },
-      ],
-    }]
-  ],
-}
diff --git a/testing/gmock.gyp b/testing/gmock.gyp
deleted file mode 100644
index 22a1893..0000000
--- a/testing/gmock.gyp
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright (c) 2009 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'targets': [
-    {
-      'target_name': 'gmock',
-      'type': 'static_library',
-      'dependencies': [
-        'gtest.gyp:gtest',
-      ],
-      'sources': [
-        # Sources based on files in r173 of gmock.
-        'gmock/include/gmock/gmock-actions.h',
-        'gmock/include/gmock/gmock-cardinalities.h',
-        'gmock/include/gmock/gmock-generated-actions.h',
-        'gmock/include/gmock/gmock-generated-function-mockers.h',
-        'gmock/include/gmock/gmock-generated-matchers.h',
-        'gmock/include/gmock/gmock-generated-nice-strict.h',
-        'gmock/include/gmock/gmock-matchers.h',
-        'gmock/include/gmock/gmock-spec-builders.h',
-        'gmock/include/gmock/gmock.h',
-        'gmock/include/gmock/internal/gmock-generated-internal-utils.h',
-        'gmock/include/gmock/internal/gmock-internal-utils.h',
-        'gmock/include/gmock/internal/gmock-port.h',
-        'gmock/src/gmock-all.cc',
-        'gmock/src/gmock-cardinalities.cc',
-        'gmock/src/gmock-internal-utils.cc',
-        'gmock/src/gmock-matchers.cc',
-        'gmock/src/gmock-spec-builders.cc',
-        'gmock/src/gmock.cc',
-        'gmock_mutant.h',  # gMock helpers
-      ],
-      'sources!': [
-        'gmock/src/gmock-all.cc',  # Not needed by our build.
-      ],
-      'include_dirs': [
-        'gmock',
-        'gmock/include',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          'gmock/include',  # So that gmock headers can find themselves.
-        ],
-      },
-      'export_dependent_settings': [
-        'gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'gmock_main',
-      'type': 'static_library',
-      'dependencies': [
-        'gmock',
-      ],
-      'sources': [
-        'gmock/src/gmock_main.cc',
-      ],
-    },
-  ],
-}
diff --git a/testing/gtest.gyp b/testing/gtest.gyp
deleted file mode 100644
index 4891083..0000000
--- a/testing/gtest.gyp
+++ /dev/null
@@ -1,260 +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.
-
-{
-  'targets': [
-    {
-      'target_name': 'gtest',
-      'type': 'static_library',
-      'sources': [
-        'gtest/include/gtest/gtest-death-test.h',
-        'gtest/include/gtest/gtest-message.h',
-        'gtest/include/gtest/gtest-param-test.h',
-        'gtest/include/gtest/gtest-printers.h',
-        'gtest/include/gtest/gtest-spi.h',
-        'gtest/include/gtest/gtest-test-part.h',
-        'gtest/include/gtest/gtest-typed-test.h',
-        'gtest/include/gtest/gtest.h',
-        'gtest/include/gtest/gtest_pred_impl.h',
-        'gtest/include/gtest/internal/gtest-death-test-internal.h',
-        'gtest/include/gtest/internal/gtest-filepath.h',
-        'gtest/include/gtest/internal/gtest-internal.h',
-        'gtest/include/gtest/internal/gtest-linked_ptr.h',
-        'gtest/include/gtest/internal/gtest-param-util-generated.h',
-        'gtest/include/gtest/internal/gtest-param-util.h',
-        'gtest/include/gtest/internal/gtest-port.h',
-        'gtest/include/gtest/internal/gtest-string.h',
-        'gtest/include/gtest/internal/gtest-tuple.h',
-        'gtest/include/gtest/internal/gtest-type-util.h',
-        'gtest/src/gtest-death-test.cc',
-        'gtest/src/gtest-filepath.cc',
-        'gtest/src/gtest-internal-inl.h',
-        'gtest/src/gtest-port.cc',
-        'gtest/src/gtest-printers.cc',
-        'gtest/src/gtest-test-part.cc',
-        'gtest/src/gtest-typed-test.cc',
-        'gtest/src/gtest.cc',
-        'multiprocess_func_list.cc',
-        'multiprocess_func_list.h',
-        'platform_test.h',
-      ],
-      'include_dirs': [
-        'gtest',
-        'gtest/include',
-      ],
-      'dependencies': [
-        'gtest_prod',
-      ],
-      'cflags_cc': [
-        '-frtti',
-      ],
-      'cflags_cc!': [
-        '-fno-rtti',
-      ],
-      'all_dependent_settings': {
-        'cflags_cc': [
-          '-frtti',
-        ],
-        'cflags_cc!': [
-          '-fno-rtti',
-        ],
-      },
-      'conditions': [
-        ['OS == "mac" or OS == "ios"', {
-          'sources': [
-            'gtest_mac.h',
-            'gtest_mac.mm',
-            'platform_test_mac.mm'
-          ],
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
-            ],
-          },
-        }],
-        ['OS == "ios"', {
-          'dependencies' : [
-            '<(DEPTH)/testing/iossim/iossim.gyp:iossim',
-          ],
-          'direct_dependent_settings': {
-            'target_conditions': [
-              # Turn all tests into bundles on iOS because that's the only
-              # type of executable supported for iOS.
-              ['_type=="executable"', {
-                'variables': {
-                  # Use a variable so the path gets fixed up so it is always
-                  # correct when INFOPLIST_FILE finally gets set.
-                  'ios_unittest_info_plist_path':
-                    '<(DEPTH)/testing/gtest_ios/unittest-Info.plist',
-                },
-                'mac_bundle': 1,
-                'xcode_settings': {
-                  'BUNDLE_ID_TEST_NAME':
-                    '>!(echo ">(_target_name)" | sed -e "s/_//g")',
-                  'INFOPLIST_FILE': '>(ios_unittest_info_plist_path)',
-                },
-                'mac_bundle_resources': [
-                  '<(ios_unittest_info_plist_path)',
-                ],
-                'mac_bundle_resources!': [
-                  '<(ios_unittest_info_plist_path)',
-                ],
-              }],
-            ],
-          },
-        }],
-        ['os_posix == 1 and cobalt != 1', {
-          'defines': [
-            # gtest isn't able to figure out when RTTI is disabled for gcc
-            # versions older than 4.3.2, and assumes it's enabled.  Our Mac
-            # and Linux builds disable RTTI, and cannot guarantee that the
-            # compiler will be 4.3.2. or newer.  The Mac, for example, uses
-            # 4.2.1 as that is the latest available on that platform.  gtest
-            # must be instructed that RTTI is disabled here, and for any
-            # direct dependents that might include gtest headers.
-            'GTEST_HAS_RTTI=0',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'GTEST_HAS_RTTI=0',
-            ],
-          },
-        }],
-        ['OS=="android" and android_app_abi=="x86"', {
-          'defines': [
-            'GTEST_HAS_CLONE=0',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'GTEST_HAS_CLONE=0',
-            ],
-          },
-        }],
-        ['OS=="android"', {
-          # We want gtest features that use tr1::tuple, but we currently
-          # don't support the variadic templates used by libstdc++'s
-          # implementation. gtest supports this scenario by providing its
-          # own implementation but we must opt in to it.
-          'defines': [
-            'GTEST_USE_OWN_TR1_TUPLE=1',
-            # GTEST_USE_OWN_TR1_TUPLE only works if GTEST_HAS_TR1_TUPLE is set.
-            # gtest r625 made it so that GTEST_HAS_TR1_TUPLE is set to 0
-            # automatically on android, so it has to be set explicitly here.
-            'GTEST_HAS_TR1_TUPLE=1',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'GTEST_USE_OWN_TR1_TUPLE=1',
-              'GTEST_HAS_TR1_TUPLE=1',
-            ],
-          },
-        }],
-        ['OS=="win" and MSVS_VERSION=="2012"', {
-          'defines': [
-            '_VARIADIC_MAX=10',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              '_VARIADIC_MAX=10',
-            ],
-          },
-        }],
-        ['OS=="lb_shell" or OS=="starboard"', {
-          'variables': {
-            'gtest_defines' : [
-              'GTEST_USE_OWN_TR1_TUPLE=1',
-              'GTEST_HAS_POSIX_RE=0',
-              '_POSIX_PATH_MAX=255',
-              '_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING',
-            ],
-            'conditions' : [
-              ['target_arch=="android"', {
-                'gtest_defines!' : [
-                  '_POSIX_PATH_MAX=255',
-                ],
-              }],
-              ['OS=="starboard"', {
-                'gtest_defines!' : [
-                  '_POSIX_PATH_MAX=255',
-                ],
-              }],
-              ['target_os=="win"', {
-                'gtest_defines!' : [
-                  'GTEST_USE_OWN_TR1_TUPLE=1',
-                ],
-              }],
-            ],
-          },
-          'defines': [
-            '<@(gtest_defines)',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              '<@(gtest_defines)',
-            ],
-          },
-        }],
-      ],
-      'direct_dependent_settings': {
-        'defines': [
-          'UNIT_TEST',
-        ],
-        'include_dirs': [
-          'gtest/include',  # So that gtest headers can find themselves.
-        ],
-        'target_conditions': [
-          ['_type=="executable"', {
-            'test': 1,
-            'conditions': [
-              ['OS=="mac"', {
-                'run_as': {
-                  'action????': ['${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}'],
-                },
-              }],
-              ['OS=="ios"', {
-                'variables': {
-                  # Use a variable so the path gets fixed up so it is always
-                  # correct when the action finally gets used.
-                  'ios_run_unittest_script_path':
-                    '<(DEPTH)/testing/gtest_ios/run-unittest.sh',
-                },
-                'run_as': {
-                  'action????': ['>(ios_run_unittest_script_path)'],
-                },
-              }],
-              ['OS=="win"', {
-                'run_as': {
-                  'action????': ['$(TargetPath)', '--gtest_print_time'],
-                },
-              }],
-            ],
-          }],
-        ],
-        'msvs_disabled_warnings': [
-          # Potential comparison of a constant with another constant.
-          # Detected by PREfast in unit tests when using EXPECT_EQ.
-          6326,
-        ],
-      },
-    },
-    {
-      'target_name': 'gtest_main',
-      'type': 'static_library',
-      'dependencies': [
-        'gtest',
-      ],
-      'sources': [
-        'gtest/src/gtest_main.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_prod',
-      'toolsets': ['host', 'target'],
-      'type': 'none',
-      'sources': [
-        'gtest/include/gtest/gtest_prod.h',
-      ],
-    },
-  ],
-}
diff --git a/testing/gtest/src/gtest-internal-inl.h b/testing/gtest/src/gtest-internal-inl.h
index 56c8a20..e5d6870 100644
--- a/testing/gtest/src/gtest-internal-inl.h
+++ b/testing/gtest/src/gtest-internal-inl.h
@@ -101,6 +101,10 @@
 const char kStreamResultToFlag[] = "stream_result_to";
 const char kThrowOnFailureFlag[] = "throw_on_failure";
 const char kFlagfileFlag[] = "flagfile";
+#if GTEST_OS_STARBOARD
+const char kTotalShardsFlag[] = "total_shards";
+const char kShardIndexFlag[] = "shard_index";
+#endif  // GTEST_OS_STARBOARD
 
 // A valid random seed must be in [1, kMaxRandomSeed].
 const int kMaxRandomSeed = 99999;
diff --git a/testing/gtest/src/gtest.cc b/testing/gtest/src/gtest.cc
index e561a3c..09bca96 100644
--- a/testing/gtest/src/gtest.cc
+++ b/testing/gtest/src/gtest.cc
@@ -312,6 +312,17 @@
     "This flag specifies the flagfile to read command-line flags from.");
 #endif  // GTEST_USE_OWN_FLAGFILE_FLAG_
 
+#if GTEST_OS_STARBOARD
+GTEST_DEFINE_int32_(
+    total_shards,
+    internal::Int32FromGTestEnv("total_shards", -1),
+    "The total number of shards to split test cases into.");
+GTEST_DEFINE_int32_(
+    shard_index,
+    internal::Int32FromGTestEnv("shard_index", -1),
+    "The shard index that determines the subset of unit tests run in the shard.");
+#endif  // GTEST_OS_STARBOARD
+
 namespace internal {
 
 // Generates a random number from [0, range), using a Linear
@@ -3095,11 +3106,20 @@
   }
 
   if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+#if GTEST_OS_STARBOARD
+    const Int32 shard_index = GTEST_FLAG(shard_index);
+    const Int32 total_shards = GTEST_FLAG(total_shards);
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: This is test shard %d of %d.\n",
+                  static_cast<int>(shard_index) + 1,
+                  static_cast<int>(total_shards));
+#else  // GTEST_OS_STARBOARD
     const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
     ColoredPrintf(COLOR_YELLOW,
                   "Note: This is test shard %d of %s.\n",
                   static_cast<int>(shard_index) + 1,
                   internal::posix::GetEnv(kTestTotalShards));
+#endif  // GTEST_OS_STARBOARD
   }
 
   if (GTEST_FLAG(shuffle)) {
@@ -4799,15 +4819,17 @@
 bool ShouldShard(const char* total_shards_env,
                  const char* shard_index_env,
                  bool in_subprocess_for_death_test) {
-#if GTEST_OS_STARBOARD
-  return false;
-#else  // GTEST_OS_STARBOARD
   if (in_subprocess_for_death_test) {
     return false;
   }
 
+#if GTEST_OS_STARBOARD
+  const Int32 total_shards = GTEST_FLAG(total_shards);
+  const Int32 shard_index = GTEST_FLAG(shard_index);
+#else  // GTEST_OS_STARBOARD
   const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
   const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+#endif  // GTEST_OS_STARBOARD
 
   if (total_shards == -1 && shard_index == -1) {
     return false;
@@ -4839,7 +4861,6 @@
   }
 
   return total_shards > 1;
-#endif  // GTEST_OS_STARBOARD
 }
 
 // Parses the environment variable var as an Int32. If it is unset,
@@ -4875,10 +4896,17 @@
 // http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
 // Returns the number of tests that should run.
 int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+#if GTEST_OS_STARBOARD
+  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      GTEST_FLAG(total_shards) : -1;
+  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      GTEST_FLAG(shard_index) : -1;
+#else  // GTEST_OS_STARBOARD
   const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
       Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
   const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
       Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+#endif  // GTEST_OS_STARBOARD
 
   // num_runnable_tests are the number of tests that will
   // run across all shards (i.e., match filter and are not disabled).
@@ -5333,6 +5361,12 @@
                      &GTEST_FLAG(stack_trace_depth)) ||
       ParseStringFlag(arg, kStreamResultToFlag,
                       &GTEST_FLAG(stream_result_to)) ||
+#if GTEST_OS_STARBOARD
+      ParseInt32Flag(arg, kTotalShardsFlag,
+                     &GTEST_FLAG(total_shards)) ||
+      ParseInt32Flag(arg, kShardIndexFlag,
+                     &GTEST_FLAG(shard_index)) ||
+#endif  // GTEST_OS_STARBOARD
       ParseBoolFlag(arg, kThrowOnFailureFlag,
                     &GTEST_FLAG(throw_on_failure));
 }
diff --git a/testing/iossim/iossim.gyp b/testing/iossim/iossim.gyp
deleted file mode 100644
index 45601f4..0000000
--- a/testing/iossim/iossim.gyp
+++ /dev/null
@@ -1,120 +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.
-
-{
-  'conditions': [
-    ['OS != "ios"', {
-      'targets': [
-        {
-          'target_name': 'iossim',
-            'type': 'executable',
-            'variables': {
-              'developer_dir': '<!(xcode-select -print-path)',
-              'iphone_sim_path': '<(developer_dir)/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks',
-              'other_frameworks_path': '<(developer_dir)/../OtherFrameworks'
-            },
-            'dependencies': [
-              'third_party/class-dump/class-dump.gyp:class-dump',
-            ],
-            'include_dirs': [
-              '<(INTERMEDIATE_DIR)/iossim',
-            ],
-            'sources': [
-              'iossim.mm',
-              '<(INTERMEDIATE_DIR)/iossim/iPhoneSimulatorRemoteClient.h',
-            ],
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
-            ],
-            'actions': [
-              {
-                'action_name': 'generate_iphone_sim_header',
-                'inputs': [
-                  '<(iphone_sim_path)/iPhoneSimulatorRemoteClient.framework/Versions/Current/iPhoneSimulatorRemoteClient',
-                  '<(PRODUCT_DIR)/class-dump',
-                ],
-                'outputs': [
-                  '<(INTERMEDIATE_DIR)/iossim/iPhoneSimulatorRemoteClient.h'
-                ],
-                'action': [
-                  # Actions don't provide a way to redirect stdout, so a custom
-                  # script is invoked that will execute the first argument and write
-                  # the output to the file specified as the second argument.
-                  './redirect-stdout.sh',
-                  '<(PRODUCT_DIR)/class-dump -CiPhoneSimulator <(iphone_sim_path)/iPhoneSimulatorRemoteClient.framework',
-                  '<(INTERMEDIATE_DIR)/iossim/iPhoneSimulatorRemoteClient.h',
-                ],
-                'message': 'Generating header',
-              },
-            ],
-          },
-        ],
-      }, {  # else, OS == "ios"
-        'variables': {
-          'ninja_output_dir': 'ninja-iossim',
-          'ninja_product_dir':
-            '<(DEPTH)/xcodebuild/<(ninja_output_dir)/<(CONFIGURATION_NAME)',
-        },
-        # Generation is done via two actions: (1) compiling the executable with
-        # ninja, and (2) copying the executable into a location that is shared
-        # with other projects. These actions are separated into two targets in
-        # order to be able to specify that the second action should not run
-        # until the first action finishes (since the ordering of multiple
-        # actions in one target is defined only by inputs and outputs, and it's
-        # impossible to set correct inputs for the ninja build, so setting all
-        # the inputs and outputs isn't an option).
-        'targets': [
-          {
-            'target_name': 'compile_iossim',
-            'type': 'none',
-            'variables': {
-              # Gyp to rerun
-              're_run_targets': [
-                 'testing/iossim/iossim.gyp',
-              ],
-            },
-            'includes': ['../../build/ios/mac_build.gypi'],
-            'actions': [
-              {
-                'action_name': 'compile iossim',
-                'inputs': [],
-                'outputs': [],
-                'action': [
-                  '<@(ninja_cmd)',
-                  'iossim',
-                ],
-                'message': 'Generating the iossim executable',
-              },
-            ],
-          },
-          {
-            'target_name': 'iossim',
-            'type': 'none',
-            'dependencies': [
-              'compile_iossim',
-            ],
-            'actions': [
-              {
-                'action_name': 'copy iossim',
-                'inputs': [
-                  # TODO(ios): It should be possible to define the input, but
-                  # adding it causes gyp to complain about duplicate id.
-                  # '<(ninja_product_dir)/iossim',
-                ],
-                'outputs': [
-                  '<(DEPTH)/xcodebuild/<(CONFIGURATION_NAME)/iossim',
-                ],
-                'action': [
-                  'cp',
-                  '<(ninja_product_dir)/iossim',
-                  '<(DEPTH)/xcodebuild/<(CONFIGURATION_NAME)/iossim',
-                ],
-              },
-            ],
-          },
-        ],
-      },
-    ],
-  ],
-}
diff --git a/third_party/QR-Code-generator/qr_code_generator.gyp b/third_party/QR-Code-generator/qr_code_generator.gyp
deleted file mode 100644
index 29cdd4a..0000000
--- a/third_party/QR-Code-generator/qr_code_generator.gyp
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'qr_code_generator',
-      'type': 'static_library',
-      'include_dirs': ['.'],
-      'sources': [
-        'cpp/BitBuffer.cpp',
-        'cpp/BitBuffer.hpp',
-        'cpp/QrCode.cpp',
-        'cpp/QrCode.hpp',
-        'cpp/QrSegment.cpp',
-        'cpp/QrSegment.hpp',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-    },
-  ],
-}
diff --git a/third_party/angle/BUILD.gn b/third_party/angle/BUILD.gn
index 5882ce0..35f6dd7 100644
--- a/third_party/angle/BUILD.gn
+++ b/third_party/angle/BUILD.gn
@@ -182,6 +182,16 @@
       "-Wunreachable-code",
       "-Wshorten-64-to-32",
     ]
+
+    if(using_old_compiler){
+      cflags -= [
+        "-Wextra-semi-stmt",
+        "-Winconsistent-missing-destructor-override",
+        "-Wredundant-parens",
+        "-Wshadow-field",
+        "-Wtautological-type-limit-compare",
+      ]
+    }
   }
 
   if (angle_is_winuwp) {
diff --git a/third_party/angle/angle.gyp b/third_party/angle/angle.gyp
deleted file mode 100644
index b34eea7..0000000
--- a/third_party/angle/angle.gyp
+++ /dev/null
@@ -1,372 +0,0 @@
-# Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-    'variables':
-    {
-        'angle_build_winrt%': 1,
-        'angle_code': 1,
-        'angle_gen_path': '<(SHARED_INTERMEDIATE_DIR)/angle',
-        'angle_use_commit_id%': 0,
-        'angle_enable_d3d9%': 0,
-        'angle_enable_d3d11%': 1,
-        'enable_d3d11_feature_level_11%': 0,
-        'angle_enable_gl%': 0,
-        'angle_use_glx%': 0,
-        'angle_enable_vulkan%': 0,
-        'angle_enable_essl%': 1, # Enable this for all configs by default
-        'angle_enable_glsl%': 1, # Enable this for all configs by default
-        'angle_enable_hlsl%': 1,
-        'angle_link_glx%': 0,
-        'angle_gl_library_type%': 'static_library',
-        'dcheck_always_on%': 0,
-        'angle_enable_null%': 1, # Available on all platforms
-
-        # On Starboard platforms, the target Angle platform must be explicitly
-        # defined in the platform configuration.
-        'angle_platform_linux%': 0,
-        'angle_platform_posix%': 0,
-        'angle_platform_windows%': 0,
-    },
-    'includes':
-    [
-        './src/compiler.gypi',
-        './src/libGLESv2.gypi',
-        './src/libEGL.gypi',
-        './src/vulkan_support/vulkan.gypi',
-    ],
-
-    'targets':
-    [
-        {
-            'target_name': 'angle_common',
-            'type': 'static_library',
-            'includes': [ './gyp/common_defines.gypi', ],
-            'sources':
-            [
-                '<@(libangle_common_sources)',
-                '<@(angle_system_utils_sources)',
-                '<@(xxhash_sources)',
-            ],
-            'include_dirs':
-            [
-                './include',
-                './src',
-                './src/common/third_party/base',
-            ],
-            'msvs_settings':
-            {
-                  'VCCLCompilerTool':
-                  {
-                        'WarnAsError': 'false',
-                  },
-            },
-            'direct_dependent_settings':
-            {
-                'include_dirs':
-                [
-                    '<(DEPTH)/third_party/angle/include',
-                    '<(DEPTH)/third_party/angle/src',
-                    '<(DEPTH)/third_party/angle/src/common/third_party/base',
-                ],
-                'conditions':
-                [
-                    ['dcheck_always_on==1',
-                    {
-                        'configurations':
-                        {
-                            'Release_Base':
-                            {
-                                'defines':
-                                [
-                                    'ANGLE_ENABLE_RELEASE_ASSERTS',
-                                ],
-                            },
-                        },
-                    }],
-                    ['target_os=="win"',
-                    {
-                        'configurations':
-                        {
-                            'Debug_Base':
-                            {
-                                'defines':
-                                [
-                                    'ANGLE_ENABLE_DEBUG_ANNOTATIONS'
-                                ],
-                            },
-                        },
-                    }],
-                ],
-            },
-            'conditions':
-            [
-                ['dcheck_always_on==1',
-                {
-                    'configurations':
-                    {
-                        'Release_Base':
-                        {
-                            'defines':
-                            [
-                                'ANGLE_ENABLE_RELEASE_ASSERTS',
-                            ],
-                        },
-                    },
-                }],
-                ['target_os=="win"',
-                {
-                    'configurations':
-                    {
-                        'Debug_Base':
-                        {
-                            'defines':
-                            [
-                                'ANGLE_ENABLE_DEBUG_ANNOTATIONS'
-                            ],
-                        },
-                    },
-                }],
-                ['target_os=="win" and angle_build_winrt==0',
-                {
-                    'sources':
-                    [
-                        '<@(angle_system_utils_win_sources)',
-                    ],
-                }],
-                ['target_os=="win" and angle_build_winrt==1',
-                {
-                    'sources':
-                    [
-                        '<@(angle_system_utils_winuwp_sources)',
-                    ],
-                }],
-                ['target_os=="mac"',
-                {
-                    'sources':
-                    [
-                        '<@(angle_system_utils_mac_sources)',
-                    ],
-                    'link_settings':
-                    {
-                        'libraries':
-                        [
-                            '$(SDKROOT)/System/Library/Frameworks/IOKit.framework',
-                            '$(SDKROOT)/System/Library/Frameworks/CoreFoundation.framework',
-                        ],
-                    },
-                }],
-                ['target_os=="linux"',
-                {
-                    'sources':
-                    [
-                        '<@(angle_system_utils_linux_sources)',
-                    ],
-                }]
-            ],
-        },
-
-        {
-            'target_name': 'angle_image_util',
-            'type': 'static_library',
-            'includes': [ './gyp/common_defines.gypi', ],
-            'sources':
-            [
-                '<@(libangle_image_util_sources)',
-            ],
-            'include_dirs':
-            [
-                './include',
-                './src',
-            ],
-            'dependencies':
-            [
-                'angle_common',
-            ],
-            'direct_dependent_settings':
-            {
-                'include_dirs':
-                [
-                    '<(DEPTH)/third_party/angle/include',
-                    '<(DEPTH)/third_party/angle/src',
-                ],
-            },
-        },
-
-        {
-            'target_name': 'angle_gpu_info_util',
-            'type': 'static_library',
-            'includes': [ './gyp/common_defines.gypi', ],
-            'sources':
-            [
-                '<@(libangle_gpu_info_util_sources)',
-            ],
-            'include_dirs':
-            [
-                './include',
-                './src',
-            ],
-            'dependencies':
-            [
-                'angle_common',
-            ],
-            'direct_dependent_settings':
-            {
-                'include_dirs':
-                [
-                    '<(DEPTH)/third_party/angle/include',
-                    '<(DEPTH)/third_party/angle/src',
-                ],
-            },
-            'conditions':
-            [
-                ['target_os=="win"',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_gpu_info_util_win_sources)',
-                    ],
-                }],
-                ['target_os=="win" and angle_build_winrt==0',
-                {
-                    'link_settings':
-                    {
-                        'msvs_settings':
-                        {
-                            'VCLinkerTool':
-                            {
-                                'AdditionalDependencies':
-                                [
-                                    'setupapi.lib'
-                                ]
-                            }
-                        }
-                    },
-                    'defines':
-                    [
-                        'GPU_INFO_USE_SETUPAPI',
-                    ],
-                },
-                {
-                    'link_settings':
-                    {
-                        'msvs_settings':
-                        {
-                            'VCLinkerTool':
-                            {
-                                'AdditionalDependencies':
-                                [
-                                    'dxgi.lib'
-                                ]
-                            }
-                        }
-                    },
-                    'defines':
-                    [
-                        'GPU_INFO_USE_DXGI',
-                    ],
-                }],
-                ['OS=="linux"',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_gpu_info_util_linux_sources)',
-                    ],
-                }],
-                ['OS=="linux" and use_libpci==1',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_gpu_info_util_libpci_sources)',
-                    ],
-                    'defines':
-                    [
-                        'GPU_INFO_USE_LIBPCI',
-                    ],
-                    'link_settings':
-                    {
-                        'ldflags':
-                        [
-                            '<!@(<(pkg-config) --libs-only-L --libs-only-other libpci)',
-                        ],
-                        'libraries':
-                        [
-                            '<!@(<(pkg-config) --libs-only-l libpci)',
-                        ],
-                    },
-                }],
-                ['OS=="mac"',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_gpu_info_util_mac_sources)',
-                    ],
-                }],
-            ],
-        },
-
-        {
-            'target_name': 'copy_scripts',
-            'type': 'none',
-            'includes': [ './gyp/common_defines.gypi', ],
-            'hard_dependency': 1,
-            'copies':
-            [
-                {
-                    'destination': '<(angle_gen_path)',
-                    'files': [ './src/copy_compiler_dll.bat' ],
-                },
-            ],
-            'conditions':
-            [
-                ['angle_build_winrt==1',
-                {
-                    'type' : 'shared_library',
-                }],
-            ],
-        },
-    ],
-    'conditions':
-    [
-        ['target_os=="win"',
-        {
-            'targets':
-            [
-                {
-                    'target_name': 'copy_compiler_dll',
-                    'type': 'none',
-                    'dependencies': [ 'copy_scripts', ],
-                    'includes': [ './gyp/common_defines.gypi', ],
-                    'conditions':
-                    [
-                        ['angle_build_winrt==0',
-                        {
-                            'actions':
-                            [
-                                {
-                                    'action_name': 'copy_dll',
-                                    'message': 'Copying D3D Compiler DLL...',
-                                    'msvs_cygwin_shell': 0,
-                                    'inputs': [ './src/copy_compiler_dll.bat' ],
-                                    'outputs': [ '<(PRODUCT_DIR)/d3dcompiler_47.dll' ],
-                                    'action':
-                                    [
-                                        "<(DEPTH)/third_party/angle/src/copy_compiler_dll.bat",
-                                        "x64",
-                                        "<(windows_sdk_path)",
-                                        "<(PRODUCT_DIR)"
-                                    ],
-                                },
-                            ], #actions
-                        }],
-                        ['angle_build_winrt==1',
-                        {
-                            'type' : 'shared_library',
-                        }],
-                    ]
-                },
-            ], # targets
-        }],
-    ] # conditions
-}
diff --git a/third_party/angle/gyp/common_defines.gypi b/third_party/angle/gyp/common_defines.gypi
deleted file mode 100644
index e8edd40..0000000
--- a/third_party/angle/gyp/common_defines.gypi
+++ /dev/null
@@ -1,166 +0,0 @@
-# Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-    'variables':
-    {
-        'component%': 'static_library',
-        'use_libpci%': 1,
-        'windows_sdk_path%': 'C:/Program Files (x86)/Windows Kits/10',
-
-        'angle_build_winrt%': '0',
-
-        # This works like the Ozone GBM platform in Chrome:
-        # - Generic Buffer Manager (gbm) to allocate buffers
-        # - EGL_EXT_image_dma_buf_import to render into those buffers via EGLImage
-        # - Direct Rendering Manager + Kernel Mode Setting to scan out from those buffers
-        # - EGL_PLATFORM_SURFACELESS because there are no native windows
-        'use_ozone%': 0,
-
-        'angle_use_glx%': 0,
-
-        # root of the OSX SDK for Chromium builds, the system root for standalone builds
-        'SDKROOT%': "",
-    },
-    'defines':
-    [
-        'ANGLE_STANDALONE_BUILD',
-    ],
-    'msvs_disabled_warnings':
-    [
-        4100, # Unreferenced formal parameter. Not interesting.
-        4127, # conditional expression is constant. Too noisy to be useful.
-        4200, # Nonstandard extension used: zero-sized array in struct/union.
-        4718, # Recursive call has no side effects. Fires on xtree system header.
-        4251, # STL objects do not have DLL interface, needed by ShaderVars.h and angle_util
-    ],
-    'conditions':
-    [
-        ['use_ozone==1',
-        {
-            'defines': [ 'USE_OZONE' ],
-        }],
-        ['component=="shared_library"',
-        {
-            'defines': [ 'COMPONENT_BUILD' ],
-        }],
-        ['target_os=="win" and angle_build_winrt==1',
-        {
-            'defines': [
-                'WINAPI_FAMILY=WINAPI_FAMILY_APP', # UWP.
-                ' __WRL_NO_DEFAULT_LIB__',
-            ],
-        }],
-        ['target_os=="win" and angle_build_winrt==0',
-        {
-            'defines': [
-                '_WIN32',
-                'WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP', # win32
-                ' __WRL_NO_DEFAULT_LIB__',
-            ],
-        }]
-    ],
-    'msvs_settings':
-    {
-        'VCCLCompilerTool':
-        {
-            'PreprocessorDefinitions':
-            [
-                '_CRT_SECURE_NO_DEPRECATE',
-                '_SCL_SECURE_NO_WARNINGS',
-                '_HAS_EXCEPTIONS=0',
-                'NOMINMAX',
-            ],
-        },
-        'VCLinkerTool':
-        {
-            'conditions':
-            [
-                ['angle_build_winrt==0',
-                {
-                    'AdditionalDependencies':
-                    [
-                        'kernel32.lib',
-                        'gdi32.lib',
-                        'winspool.lib',
-                        'comdlg32.lib',
-                        'advapi32.lib',
-                        'shell32.lib',
-                        'ole32.lib',
-                        'oleaut32.lib',
-                        'user32.lib',
-                        'uuid.lib',
-                        'odbc32.lib',
-                        'odbccp32.lib',
-                        'delayimp.lib',
-                    ],
-                }],
-                # winrt compilation is dynamic depending on the project
-                # type. AdditionalDependencies is automatically configured
-                # with the required .libs
-                ['angle_build_winrt==1',
-                {
-                    'AdditionalDependencies':
-                    [
-                        '%(AdditionalDependencies)',
-                        'uuid.lib',
-                    ],
-                }],
-            ],
-        },
-    },
-
-    # Windows SDK library directories for the configurations
-    'configurations':
-    {
-        'conditions':
-        [
-            ['angle_build_winrt==0',
-            {
-                'x86_Base':
-                {
-                    'abstract': 1,
-                    'msvs_settings':
-                    {
-                        'VCLinkerTool':
-                        {
-                            'AdditionalLibraryDirectories':
-                            [
-                                '<(windows_sdk_path)/Lib/winv6.3/um/x86',
-                            ],
-                        },
-                        'VCLibrarianTool':
-                        {
-                            'AdditionalLibraryDirectories':
-                            [
-                                '<(windows_sdk_path)/Lib/winv6.3/um/x86',
-                            ],
-                        },
-                    },
-                },
-                'x64_Base':
-                {
-                    'abstract': 1,
-                    'msvs_settings':
-                    {
-                        'VCLinkerTool':
-                        {
-                            'AdditionalLibraryDirectories':
-                            [
-                                '<(windows_sdk_path)/Lib/winv6.3/um/x64',
-                            ],
-                        },
-                        'VCLibrarianTool':
-                        {
-                            'AdditionalLibraryDirectories':
-                            [
-                                '<(windows_sdk_path)/Lib/winv6.3/um/x64',
-                            ],
-                        },
-                    },
-                },
-            }],
-        ],
-    },
-}
diff --git a/third_party/angle/gyp/standalone.gypi b/third_party/angle/gyp/standalone.gypi
deleted file mode 100644
index 7cc789b..0000000
--- a/third_party/angle/gyp/standalone.gypi
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-    'variables':
-    {
-        # Chrome OS chroot builds need a special pkg-config, so make it possible to change.
-        'pkg-config%': 'pkg-config',
-
-        # Use a nested variable trick to get use_x11 evaluated more
-        # eagerly than other conditional variables.
-        'variables':
-        {
-            'variables':
-            {
-                'use_ozone%': 0,
-            },
-
-            # Copy conditionally-set variables out one scope.
-            'use_ozone%': '<(use_ozone)',
-        },
-    },
-}
diff --git a/third_party/angle/scripts/trigger.bat b/third_party/angle/scripts/trigger.bat
index 7341233..a2d00d6 100644
--- a/third_party/angle/scripts/trigger.bat
+++ b/third_party/angle/scripts/trigger.bat
@@ -1 +1 @@
-@python %~dp0\trigger.py %*

+@python %~dp0\trigger.py %*
diff --git a/third_party/angle/src/compiler.gypi b/third_party/angle/src/compiler.gypi
deleted file mode 100644
index 99a79a8..0000000
--- a/third_party/angle/src/compiler.gypi
+++ /dev/null
@@ -1,464 +0,0 @@
-# Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-    'variables':
-    {
-        'angle_translator_exported_headers':
-        [
-          "include/GLSLANG/ShaderLang.h",
-          "include/GLSLANG/ShaderVars.h",
-          "src/compiler/translator/blocklayout.h",
-          "src/compiler/translator/blocklayoutHLSL.h",
-        ],
-        'angle_translator_sources':
-        [
-            '<(DEPTH)/third_party/angle/include/EGL/egl.h',
-            '<(DEPTH)/third_party/angle/include/EGL/eglext.h',
-            '<(DEPTH)/third_party/angle/include/EGL/eglplatform.h',
-            '<(DEPTH)/third_party/angle/include/GLES2/gl2.h',
-            '<(DEPTH)/third_party/angle/include/GLES2/gl2ext.h',
-            '<(DEPTH)/third_party/angle/include/GLES2/gl2platform.h',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl3.h',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl3platform.h',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl31.h',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl32.h',
-            '<(DEPTH)/third_party/angle/include/KHR/khrplatform.h',
-            '<(DEPTH)/third_party/angle/include/angle_gl.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/BaseTypes.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/BuiltInFunctionEmulator.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/BuiltInFunctionEmulator.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/CallDAG.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/CallDAG.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/CodeGen.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/CollectVariables.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/CollectVariables.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Common.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Compiler.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Compiler.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ConstantUnion.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ConstantUnion.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Declarator.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Declarator.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Diagnostics.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Diagnostics.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/DirectiveHandler.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/DirectiveHandler.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ExtensionBehavior.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ExtensionBehavior.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/FlagStd140Structs.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/FlagStd140Structs.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/FunctionLookup.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/FunctionLookup.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/HashNames.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/HashNames.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ImmutableString.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ImmutableStringBuilder.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ImmutableStringBuilder.h',
-            # TODO: Consider ImmutableString_ESSL_autogen.cpp below,
-            #       see https://chromium-review.googlesource.com/c/angle/angle/+/1757372
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ImmutableString_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/InfoSink.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/InfoSink.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Initialize.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Initialize.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/InitializeDll.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/InitializeDll.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/InitializeGlobals.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/IntermNode.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/IntermNode.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/IsASTDepthBelowLimit.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/IsASTDepthBelowLimit.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Operator.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Operator.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputTree.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputTree.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ParseContext.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ParseContext.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ParseContext_interm.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ParseContext_complete_autogen.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ParseContext_ESSL_autogen.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/PoolAlloc.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/PoolAlloc.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Pragma.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/QualifierTypes.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/QualifierTypes.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Severity.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ShaderLang.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ShaderVars.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/StaticType.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Symbol.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Symbol.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/SymbolTable.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/SymbolTable.h',
-            # TODO: Consider using SymbolTable_ESSL_autogen.cpp below,
-            #       see https://chromium-review.googlesource.com/c/angle/angle/+/1757372
-            '<(DEPTH)/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/SymbolTable_autogen.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/SymbolUniqueId.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/SymbolUniqueId.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Types.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/Types.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateAST.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateAST.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateGlobalInitializer.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateGlobalInitializer.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateLimitations.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateLimitations.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateMaxParameters.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateMaxParameters.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateOutputs.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateOutputs.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateSwitch.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateSwitch.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateVaryingLocations.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ValidateVaryingLocations.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/VariablePacker.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/VariablePacker.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/blocklayout.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/glslang.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/glslang_lex_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/glslang_tab_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/glslang_tab_autogen.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/length_limits.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/util.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/util.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/AddAndTrueToLoopCondition.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/BreakVariableAliasingInInnerLoops.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ClampFragDepth.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ClampFragDepth.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ClampPointSize.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ClampPointSize.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/DeferGlobalInitializers.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ExpandIntegerPowExpressions.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/FoldExpressions.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/FoldExpressions.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/InitializeVariables.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/InitializeVariables.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/NameEmbeddedUniformStructs.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/NameNamelessUniformBuffers.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/NameNamelessUniformBuffers.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/PruneEmptyCases.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/PruneEmptyCases.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/PruneNoOps.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/PruneNoOps.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RecordConstantPrecision.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RecordConstantPrecision.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RegenerateStructNames.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RegenerateStructNames.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveArrayLengthMethod.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveDynamicIndexing.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveInvariantDeclaration.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveInvariantDeclaration.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemovePow.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemovePow.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveUnreferencedVariables.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteAtomicCounters.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteAtomicFunctionExpressions.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteDfdy.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteDfdy.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteDoWhile.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteDoWhile.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteExpressionsWithShaderStorageBlock.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteStructSamplers.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteStructSamplersOld.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteRowMajorMatrices.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteRowMajorMatrices.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteTexelFetchOffset.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteTexelFetchOffset.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorFloat.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorFloat.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorInt.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteUnaryMinusOperatorInt.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SeparateDeclarations.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SeparateDeclarations.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SimplifyLoopConditions.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SimplifyLoopConditions.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SplitSequenceOperator.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SplitSequenceOperator.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/UnfoldShortCircuitAST.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/UnfoldShortCircuitAST.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/UseInterfaceBlockFields.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/UseInterfaceBlockFields.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/VectorizeVectorScalarArithmetic.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/VectorizeVectorScalarArithmetic.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/BuiltIn.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/BuiltIn_complete_autogen.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/FindFunction.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/FindFunction.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/FindMain.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/FindMain.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/FindSymbolNode.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/FindSymbolNode.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/IntermNodePatternMatcher.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/IntermNodePatternMatcher.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/IntermNode_util.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/IntermNode_util.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/IntermTraverse.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/IntermTraverse.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/NodeSearch.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/ReplaceVariable.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/ReplaceVariable.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/ReplaceShadowingVariables.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/ReplaceShadowingVariables.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/RunAtTheEndOfShader.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_util/Visit.h',
-            '<(DEPTH)/third_party/angle/src/third_party/compiler/ArrayBoundsClamper.cpp',
-            '<(DEPTH)/third_party/angle/src/third_party/compiler/ArrayBoundsClamper.h',
-        ],
-        'angle_translator_essl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputESSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputESSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TranslatorESSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TranslatorESSL.h',
-        ],
-        'angle_translator_glsl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/BuiltInFunctionEmulatorGLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/BuiltinsWorkaroundGLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/BuiltinsWorkaroundGLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ExtensionGLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ExtensionGLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputGLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputGLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputGLSLBase.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputGLSLBase.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TranslatorGLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TranslatorGLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/VersionGLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/VersionGLSL.h',
-        ],
-        'angle_translator_hlsl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ASTMetadataHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ASTMetadataHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/blocklayoutHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/BuiltInFunctionEmulatorHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ResourcesHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ShaderStorageBlockFunctionHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ShaderStorageBlockOutputHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/StructureHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/StructureHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TextureFunctionHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TextureFunctionHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ImageFunctionHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/ImageFunctionHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TranslatorHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TranslatorHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/UtilsHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/UtilsHLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/AddDefaultReturnStatements.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/AddDefaultReturnStatements.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/ArrayReturnValueToOutParameter.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveSwitchFallThrough.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RemoveSwitchFallThrough.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteElseBlocks.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/RewriteElseBlocks.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SeparateArrayConstructorStatements.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SeparateArrayConstructorStatements.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SeparateArrayInitialization.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SeparateArrayInitialization.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SeparateExpressionsReturningArrays.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/SeparateExpressionsReturningArrays.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/UnfoldShortCircuitToIf.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/UnfoldShortCircuitToIf.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/WrapSwitchStatementsInBlocks.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/tree_ops/WrapSwitchStatementsInBlocks.h',
-        ],
-        'angle_translator_lib_vulkan_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputVulkanGLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/OutputVulkanGLSL.h',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TranslatorVulkan.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/translator/TranslatorVulkan.h',
-        ],
-        'angle_preprocessor_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/DiagnosticsBase.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/DiagnosticsBase.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/DirectiveHandlerBase.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/DirectiveHandlerBase.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/DirectiveParser.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/DirectiveParser.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/ExpressionParser.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Input.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Input.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Lexer.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Lexer.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Macro.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Macro.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/MacroExpander.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/MacroExpander.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/preprocessor_lex_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/preprocessor_tab_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Preprocessor.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Preprocessor.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/SourceLocation.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Token.cpp',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Token.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/Tokenizer.h',
-            '<(DEPTH)/third_party/angle/src/compiler/preprocessor/numeric_lex.h',
-        ],
-    },
-    # Everything below this is duplicated in the GN build. If you change
-    # anything also change angle/BUILD.gn
-    'targets':
-    [
-        {
-            'target_name': 'preprocessor',
-            'type': 'static_library',
-            'dependencies': [ 'angle_common' ],
-            'includes': [ '../gyp/common_defines.gypi', ],
-            'sources': [ '<@(angle_preprocessor_sources)', ],
-            'msvs_settings':
-            {
-                  'VCCLCompilerTool':
-                  {
-                        'WarnAsError': 'false',
-                  },
-            },
-        },
-        {
-            'target_name': 'translator',
-            'type': 'static_library',
-            'dependencies': [ 'preprocessor', 'angle_common' ],
-            'includes': [ '../gyp/common_defines.gypi', ],
-            'include_dirs':
-            [
-                '<(DEPTH)/third_party/angle/include',
-                '<(DEPTH)/third_party/angle/src',
-            ],
-            'sources':
-            [
-                '<@(angle_translator_sources)',
-            ],
-            'msvs_settings':
-            {
-                  'VCCLCompilerTool':
-                  {
-                        'WarnAsError': 'false',
-                  },
-                  'VCLibrarianTool':
-                  {
-                        'AdditionalOptions': ['/ignore:4221'],
-                  },
-            },
-            'conditions':
-            [
-                ['angle_enable_essl==1',
-                {
-                    'defines':
-                    [
-                        'ANGLE_ENABLE_ESSL',
-                    ],
-                    'direct_dependent_settings':
-                    {
-                        'defines':
-                        [
-                            'ANGLE_ENABLE_ESSL',
-                        ],
-                    },
-                    'sources':
-                    [
-                        '<@(angle_translator_essl_sources)',
-                    ],
-                }],
-                ['angle_enable_glsl==1',
-                {
-                    'defines':
-                    [
-                        'ANGLE_ENABLE_GLSL',
-                    ],
-                    'direct_dependent_settings':
-                    {
-                        'defines':
-                        [
-                            'ANGLE_ENABLE_GLSL',
-                        ],
-                    },
-                    'sources':
-                    [
-                        '<@(angle_translator_glsl_sources)',
-                    ],
-                }],
-                ['angle_enable_hlsl==1',
-                {
-                    'defines':
-                    [
-                        'ANGLE_ENABLE_HLSL',
-                    ],
-                    'direct_dependent_settings':
-                    {
-                        'defines':
-                        [
-                            'ANGLE_ENABLE_HLSL',
-                        ],
-                    },
-                    'sources':
-                    [
-                        '<@(angle_translator_hlsl_sources)',
-                    ],
-                }],
-                ['angle_enable_vulkan==1',
-                {
-                    'defines':
-                    [
-                        'ANGLE_ENABLE_VULKAN',
-                    ],
-                    'direct_dependent_settings':
-                    {
-                        'defines':
-                        [
-                            'ANGLE_ENABLE_VULKAN',
-                        ],
-                    },
-                    'sources':
-                    [
-                        '<@(angle_translator_lib_vulkan_sources)',
-                    ],
-                }],
-            ],
-        },
-    ],
-}
diff --git a/third_party/angle/src/copy_compiler_dll.bat b/third_party/angle/src/copy_compiler_dll.bat
index 1aac1ab..8106415 100644
--- a/third_party/angle/src/copy_compiler_dll.bat
+++ b/third_party/angle/src/copy_compiler_dll.bat
@@ -1,9 +1,9 @@
-@echo off

-set _arch=%1

-set _arch=%_arch:Win32=x86%

-copy %2"\Redist\D3D\"%_arch%"\d3dcompiler_47.dll" %3 > NUL

-:: This is equivalent to `touch', see:

-:: https://technet.microsoft.com/en-us/library/bb490886.aspx

-:: This avoids rerunning because this batch file is also copied to the gen dir,

-:: so it's timestamp would otherwise be newer than the dll.

-copy /b %3\d3dcompiler_47.dll+,, %3\d3dcompiler_47.dll > NUL

+@echo off
+set _arch=%1
+set _arch=%_arch:Win32=x86%
+copy %2"\Redist\D3D\"%_arch%"\d3dcompiler_47.dll" %3 > NUL
+:: This is equivalent to `touch', see:
+:: https://technet.microsoft.com/en-us/library/bb490886.aspx
+:: This avoids rerunning because this batch file is also copied to the gen dir,
+:: so it's timestamp would otherwise be newer than the dll.
+copy /b %3\d3dcompiler_47.dll+,, %3\d3dcompiler_47.dll > NUL
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h
index dbc216a..c063522 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h
@@ -1,85 +1,85 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E GS_BufferToTexture /T gs_4_0 /Fh

-//    compiled/buffertotexture11_gs.h BufferToTexture11.hlsl

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float   xyzw

-// TEXCOORD                 0   x           1     NONE   uint   x   

-// LAYER                    0    y          1     NONE   uint    y  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float   xyzw

-// TEXCOORD                 0   x           1     NONE   uint   x   

-// SV_RenderTargetArrayIndex     0    y          1  RTINDEX   uint    y  

-//

-gs_4_0

-dcl_input_siv v[1][0].xyzw, position

-dcl_input v[1][1].x

-dcl_input v[1][1].y

-dcl_inputprimitive point 

-dcl_outputtopology pointlist 

-dcl_output_siv o0.xyzw, position

-dcl_output o1.x

-dcl_output_siv o1.y, rendertarget_array_index

-dcl_maxout 1

-mov o0.xyzw, v[0][0].xyzw

-mov o1.x, v[0][1].x

-mov o1.y, v[0][1].y

-emit 

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_GS_BufferToTexture[] = {

-    68,  88,  66,  67,  253, 178, 132, 190, 125, 118, 185, 34,  196, 114, 214, 207, 219, 137, 140,

-    138, 1,   0,   0,   0,   212, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 0,

-    0,   0,   0,   1,   0,   0,   136, 1,   0,   0,   88,  2,   0,   0,   82,  68,  69,  70,  80,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   83,  71,  0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111,

-    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,

-    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,

-    49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  108, 0,   0,   0,   3,   0,   0,   0,

-    8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   15,  15,  0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   101, 0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   2,   2,   0,   0,

-    83,  86,  95,  80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   76,  65,  89,  69,  82,  0,   171, 79,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   14,  0,   0,   101, 0,   0,

-    0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   2,   13,

-    0,   0,   83,  86,  95,  80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,

-    79,  82,  68,  0,   83,  86,  95,  82,  101, 110, 100, 101, 114, 84,  97,  114, 103, 101, 116,

-    65,  114, 114, 97,  121, 73,  110, 100, 101, 120, 0,   171, 83,  72,  68,  82,  200, 0,   0,

-    0,   64,  0,   2,   0,   50,  0,   0,   0,   97,  0,   0,   5,   242, 16,  32,  0,   1,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   95,  0,   0,   4,   18,  16,  32,  0,   1,

-    0,   0,   0,   1,   0,   0,   0,   95,  0,   0,   4,   34,  16,  32,  0,   1,   0,   0,   0,

-    1,   0,   0,   0,   93,  8,   0,   1,   92,  8,   0,   1,   103, 0,   0,   4,   242, 32,  16,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   101, 0,   0,   3,   18,  32,  16,  0,   1,   0,

-    0,   0,   103, 0,   0,   4,   34,  32,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   94,

-    0,   0,   2,   1,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,

-    70,  30,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  32,  16,

-    0,   1,   0,   0,   0,   10,  16,  32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   54,  0,

-    0,   6,   34,  32,  16,  0,   1,   0,   0,   0,   26,  16,  32,  0,   0,   0,   0,   0,   1,

-    0,   0,   0,   19,  0,   0,   1,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E GS_BufferToTexture /T gs_4_0 /Fh
+//    compiled/buffertotexture11_gs.h BufferToTexture11.hlsl
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float   xyzw
+// TEXCOORD                 0   x           1     NONE   uint   x   
+// LAYER                    0    y          1     NONE   uint    y  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float   xyzw
+// TEXCOORD                 0   x           1     NONE   uint   x   
+// SV_RenderTargetArrayIndex     0    y          1  RTINDEX   uint    y  
+//
+gs_4_0
+dcl_input_siv v[1][0].xyzw, position
+dcl_input v[1][1].x
+dcl_input v[1][1].y
+dcl_inputprimitive point 
+dcl_outputtopology pointlist 
+dcl_output_siv o0.xyzw, position
+dcl_output o1.x
+dcl_output_siv o1.y, rendertarget_array_index
+dcl_maxout 1
+mov o0.xyzw, v[0][0].xyzw
+mov o1.x, v[0][1].x
+mov o1.y, v[0][1].y
+emit 
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_GS_BufferToTexture[] = {
+    68,  88,  66,  67,  253, 178, 132, 190, 125, 118, 185, 34,  196, 114, 214, 207, 219, 137, 140,
+    138, 1,   0,   0,   0,   212, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 0,
+    0,   0,   0,   1,   0,   0,   136, 1,   0,   0,   88,  2,   0,   0,   82,  68,  69,  70,  80,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   83,  71,  0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111,
+    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,
+    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,
+    49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  108, 0,   0,   0,   3,   0,   0,   0,
+    8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   15,  15,  0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   101, 0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   2,   2,   0,   0,
+    83,  86,  95,  80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   76,  65,  89,  69,  82,  0,   171, 79,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   14,  0,   0,   101, 0,   0,
+    0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   2,   13,
+    0,   0,   83,  86,  95,  80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,
+    79,  82,  68,  0,   83,  86,  95,  82,  101, 110, 100, 101, 114, 84,  97,  114, 103, 101, 116,
+    65,  114, 114, 97,  121, 73,  110, 100, 101, 120, 0,   171, 83,  72,  68,  82,  200, 0,   0,
+    0,   64,  0,   2,   0,   50,  0,   0,   0,   97,  0,   0,   5,   242, 16,  32,  0,   1,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   95,  0,   0,   4,   18,  16,  32,  0,   1,
+    0,   0,   0,   1,   0,   0,   0,   95,  0,   0,   4,   34,  16,  32,  0,   1,   0,   0,   0,
+    1,   0,   0,   0,   93,  8,   0,   1,   92,  8,   0,   1,   103, 0,   0,   4,   242, 32,  16,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   101, 0,   0,   3,   18,  32,  16,  0,   1,   0,
+    0,   0,   103, 0,   0,   4,   34,  32,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   94,
+    0,   0,   2,   1,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,
+    70,  30,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  32,  16,
+    0,   1,   0,   0,   0,   10,  16,  32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   54,  0,
+    0,   6,   34,  32,  16,  0,   1,   0,   0,   0,   26,  16,  32,  0,   0,   0,   0,   0,   1,
+    0,   0,   0,   19,  0,   0,   1,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h
index ccb8a98..5b98b67 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h
@@ -1,115 +1,115 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_BufferToTexture_4F /T ps_4_0 /Fh

-//    compiled/buffertotexture11_ps_4f.h BufferToTexture11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer BufferCopyParams

-// {

-//

-//   uint FirstPixelOffset;             // Offset:    0 Size:     4 [unused]

-//   uint PixelsPerRow;                 // Offset:    4 Size:     4 [unused]

-//   uint RowStride;                    // Offset:    8 Size:     4 [unused]

-//   uint RowsPerSlice;                 // Offset:   12 Size:     4 [unused]

-//   float2 PositionOffset;             // Offset:   16 Size:     8 [unused]

-//   float2 PositionScale;              // Offset:   24 Size:     8 [unused]

-//   int2 TexLocationOffset;            // Offset:   32 Size:     8 [unused]

-//   int2 TexLocationScale;             // Offset:   40 Size:     8 [unused]

-//   uint FirstSlice;                   // Offset:   48 Size:     4 [unused]

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Buffer4F                          texture  float4         buf    0        1

-// BufferCopyParams                  cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float       

-// TEXCOORD                 0   x           1     NONE   uint   x   

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Target                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_resource_buffer (float,float,float,float) t0

-dcl_input_ps constant v1.x

-dcl_output o0.xyzw

-ld o0.xyzw, v1.xxxx, t0.xyzw

-ret 

-// Approximately 2 instruction slots used

-#endif

-

-const BYTE g_PS_BufferToTexture_4F[] = {

-    68,  88,  66,  67,  143, 104, 46,  161, 50,  189, 182, 102, 245, 177, 159, 82,  43,  210, 80,

-    71,  1,   0,   0,   0,   252, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 2,

-    0,   0,   228, 2,   0,   0,   24,  3,   0,   0,   128, 3,   0,   0,   82,  68,  69,  70,  80,

-    2,   0,   0,   1,   0,   0,   0,   120, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   28,  2,   0,   0,   92,  0,   0,   0,   2,   0,   0,

-    0,   5,   0,   0,   0,   1,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   101, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    66,  117, 102, 102, 101, 114, 52,  70,  0,   66,  117, 102, 102, 101, 114, 67,  111, 112, 121,

-    80,  97,  114, 97,  109, 115, 0,   171, 171, 101, 0,   0,   0,   9,   0,   0,   0,   144, 0,

-    0,   0,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   104, 1,   0,   0,   0,

-    0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   124, 1,   0,   0,   0,   0,   0,   0,

-    140, 1,   0,   0,   4,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   124, 1,   0,

-    0,   0,   0,   0,   0,   153, 1,   0,   0,   8,   0,   0,   0,   4,   0,   0,   0,   0,   0,

-    0,   0,   124, 1,   0,   0,   0,   0,   0,   0,   163, 1,   0,   0,   12,  0,   0,   0,   4,

-    0,   0,   0,   0,   0,   0,   0,   124, 1,   0,   0,   0,   0,   0,   0,   176, 1,   0,   0,

-    16,  0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   192, 1,   0,   0,   0,   0,   0,

-    0,   208, 1,   0,   0,   24,  0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   192, 1,

-    0,   0,   0,   0,   0,   0,   222, 1,   0,   0,   32,  0,   0,   0,   8,   0,   0,   0,   0,

-    0,   0,   0,   240, 1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   40,  0,   0,   0,

-    8,   0,   0,   0,   0,   0,   0,   0,   240, 1,   0,   0,   0,   0,   0,   0,   17,  2,   0,

-    0,   48,  0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   124, 1,   0,   0,   0,   0,

-    0,   0,   70,  105, 114, 115, 116, 80,  105, 120, 101, 108, 79,  102, 102, 115, 101, 116, 0,

-    171, 171, 171, 0,   0,   19,  0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    80,  105, 120, 101, 108, 115, 80,  101, 114, 82,  111, 119, 0,   82,  111, 119, 83,  116, 114,

-    105, 100, 101, 0,   82,  111, 119, 115, 80,  101, 114, 83,  108, 105, 99,  101, 0,   80,  111,

-    115, 105, 116, 105, 111, 110, 79,  102, 102, 115, 101, 116, 0,   171, 1,   0,   3,   0,   1,

-    0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   80,  111, 115, 105, 116, 105, 111, 110,

-    83,  99,  97,  108, 101, 0,   84,  101, 120, 76,  111, 99,  97,  116, 105, 111, 110, 79,  102,

-    102, 115, 101, 116, 0,   1,   0,   2,   0,   1,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   84,  101, 120, 76,  111, 99,  97,  116, 105, 111, 110, 83,  99,  97,  108, 101, 0,

-    70,  105, 114, 115, 116, 83,  108, 105, 99,  101, 0,   77,  105, 99,  114, 111, 115, 111, 102,

-    116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,

-    111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,

-    49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,

-    0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,

-    0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,  80,  111, 115,

-    105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,

-    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,  82,  96,  0,

-    0,   0,   64,  0,   0,   0,   24,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,

-    0,   0,   0,   1,   0,   0,   0,   88,  8,   0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   98,  8,   0,   3,   18,  16,  16,  0,   1,   0,   0,   0,   101, 0,   0,

-    3,   242, 32,  16,  0,   0,   0,   0,   0,   45,  0,   0,   7,   242, 32,  16,  0,   0,   0,

-    0,   0,   6,   16,  16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_BufferToTexture_4F /T ps_4_0 /Fh
+//    compiled/buffertotexture11_ps_4f.h BufferToTexture11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer BufferCopyParams
+// {
+//
+//   uint FirstPixelOffset;             // Offset:    0 Size:     4 [unused]
+//   uint PixelsPerRow;                 // Offset:    4 Size:     4 [unused]
+//   uint RowStride;                    // Offset:    8 Size:     4 [unused]
+//   uint RowsPerSlice;                 // Offset:   12 Size:     4 [unused]
+//   float2 PositionOffset;             // Offset:   16 Size:     8 [unused]
+//   float2 PositionScale;              // Offset:   24 Size:     8 [unused]
+//   int2 TexLocationOffset;            // Offset:   32 Size:     8 [unused]
+//   int2 TexLocationScale;             // Offset:   40 Size:     8 [unused]
+//   uint FirstSlice;                   // Offset:   48 Size:     4 [unused]
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Buffer4F                          texture  float4         buf    0        1
+// BufferCopyParams                  cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float       
+// TEXCOORD                 0   x           1     NONE   uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Target                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_buffer (float,float,float,float) t0
+dcl_input_ps constant v1.x
+dcl_output o0.xyzw
+ld o0.xyzw, v1.xxxx, t0.xyzw
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_BufferToTexture_4F[] = {
+    68,  88,  66,  67,  143, 104, 46,  161, 50,  189, 182, 102, 245, 177, 159, 82,  43,  210, 80,
+    71,  1,   0,   0,   0,   252, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 2,
+    0,   0,   228, 2,   0,   0,   24,  3,   0,   0,   128, 3,   0,   0,   82,  68,  69,  70,  80,
+    2,   0,   0,   1,   0,   0,   0,   120, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   28,  2,   0,   0,   92,  0,   0,   0,   2,   0,   0,
+    0,   5,   0,   0,   0,   1,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   101, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    66,  117, 102, 102, 101, 114, 52,  70,  0,   66,  117, 102, 102, 101, 114, 67,  111, 112, 121,
+    80,  97,  114, 97,  109, 115, 0,   171, 171, 101, 0,   0,   0,   9,   0,   0,   0,   144, 0,
+    0,   0,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   104, 1,   0,   0,   0,
+    0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   124, 1,   0,   0,   0,   0,   0,   0,
+    140, 1,   0,   0,   4,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   124, 1,   0,
+    0,   0,   0,   0,   0,   153, 1,   0,   0,   8,   0,   0,   0,   4,   0,   0,   0,   0,   0,
+    0,   0,   124, 1,   0,   0,   0,   0,   0,   0,   163, 1,   0,   0,   12,  0,   0,   0,   4,
+    0,   0,   0,   0,   0,   0,   0,   124, 1,   0,   0,   0,   0,   0,   0,   176, 1,   0,   0,
+    16,  0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   192, 1,   0,   0,   0,   0,   0,
+    0,   208, 1,   0,   0,   24,  0,   0,   0,   8,   0,   0,   0,   0,   0,   0,   0,   192, 1,
+    0,   0,   0,   0,   0,   0,   222, 1,   0,   0,   32,  0,   0,   0,   8,   0,   0,   0,   0,
+    0,   0,   0,   240, 1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   40,  0,   0,   0,
+    8,   0,   0,   0,   0,   0,   0,   0,   240, 1,   0,   0,   0,   0,   0,   0,   17,  2,   0,
+    0,   48,  0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   124, 1,   0,   0,   0,   0,
+    0,   0,   70,  105, 114, 115, 116, 80,  105, 120, 101, 108, 79,  102, 102, 115, 101, 116, 0,
+    171, 171, 171, 0,   0,   19,  0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    80,  105, 120, 101, 108, 115, 80,  101, 114, 82,  111, 119, 0,   82,  111, 119, 83,  116, 114,
+    105, 100, 101, 0,   82,  111, 119, 115, 80,  101, 114, 83,  108, 105, 99,  101, 0,   80,  111,
+    115, 105, 116, 105, 111, 110, 79,  102, 102, 115, 101, 116, 0,   171, 1,   0,   3,   0,   1,
+    0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   80,  111, 115, 105, 116, 105, 111, 110,
+    83,  99,  97,  108, 101, 0,   84,  101, 120, 76,  111, 99,  97,  116, 105, 111, 110, 79,  102,
+    102, 115, 101, 116, 0,   1,   0,   2,   0,   1,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   84,  101, 120, 76,  111, 99,  97,  116, 105, 111, 110, 83,  99,  97,  108, 101, 0,
+    70,  105, 114, 115, 116, 83,  108, 105, 99,  101, 0,   77,  105, 99,  114, 111, 115, 111, 102,
+    116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,
+    111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,
+    49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,
+    0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,
+    0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,  80,  111, 115,
+    105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,
+    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,  82,  96,  0,
+    0,   0,   64,  0,   0,   0,   24,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,
+    0,   0,   0,   1,   0,   0,   0,   88,  8,   0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   98,  8,   0,   3,   18,  16,  16,  0,   1,   0,   0,   0,   101, 0,   0,
+    3,   242, 32,  16,  0,   0,   0,   0,   0,   45,  0,   0,   7,   242, 32,  16,  0,   0,   0,
+    0,   0,   6,   16,  16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h
index 07871aa..b3692c9 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h
@@ -1,69 +1,69 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_BufferToTexture_4I /T ps_4_0 /Fh

-//    compiled/buffertotexture11_ps_4i.h BufferToTexture11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Buffer4I                          texture   sint4         buf    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float       

-// TEXCOORD                 0   x           1     NONE   uint   x   

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Target                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_buffer (sint,sint,sint,sint) t0

-dcl_input_ps constant v1.x

-dcl_output o0.xyzw

-ld o0.xyzw, v1.xxxx, t0.xyzw

-ret 

-// Approximately 2 instruction slots used

-#endif

-

-const BYTE g_PS_BufferToTexture_4I[] = {

-    68,  88,  66,  67,  104, 142, 165, 212, 7,   64,  44,  53,  68,  117, 135, 216, 87,  167, 148,

-    192, 1,   0,   0,   0,   20,  2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   152, 1,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   1,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   66,  117, 102, 102, 101, 114, 52,  73,  0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,

-    80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,

-    82,  80,  0,   0,   0,   64,  0,   0,   0,   20,  0,   0,   0,   88,  8,   0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  8,   0,   3,   18,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   45,  0,   0,   7,

-    242, 32,  16,  0,   0,   0,   0,   0,   6,   16,  16,  0,   1,   0,   0,   0,   70,  126, 16,

-    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_BufferToTexture_4I /T ps_4_0 /Fh
+//    compiled/buffertotexture11_ps_4i.h BufferToTexture11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Buffer4I                          texture   sint4         buf    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float       
+// TEXCOORD                 0   x           1     NONE   uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Target                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_buffer (sint,sint,sint,sint) t0
+dcl_input_ps constant v1.x
+dcl_output o0.xyzw
+ld o0.xyzw, v1.xxxx, t0.xyzw
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_BufferToTexture_4I[] = {
+    68,  88,  66,  67,  104, 142, 165, 212, 7,   64,  44,  53,  68,  117, 135, 216, 87,  167, 148,
+    192, 1,   0,   0,   0,   20,  2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   152, 1,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   1,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   66,  117, 102, 102, 101, 114, 52,  73,  0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,
+    80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,
+    82,  80,  0,   0,   0,   64,  0,   0,   0,   20,  0,   0,   0,   88,  8,   0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  8,   0,   3,   18,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   45,  0,   0,   7,
+    242, 32,  16,  0,   0,   0,   0,   0,   6,   16,  16,  0,   1,   0,   0,   0,   70,  126, 16,
+    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h
index b66009e..9eb6355 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h
@@ -1,69 +1,69 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_BufferToTexture_4UI /T ps_4_0 /Fh

-//    compiled/buffertotexture11_ps_4ui.h BufferToTexture11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Buffer4UI                         texture   uint4         buf    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float       

-// TEXCOORD                 0   x           1     NONE   uint   x   

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Target                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_buffer (uint,uint,uint,uint) t0

-dcl_input_ps constant v1.x

-dcl_output o0.xyzw

-ld o0.xyzw, v1.xxxx, t0.xyzw

-ret 

-// Approximately 2 instruction slots used

-#endif

-

-const BYTE g_PS_BufferToTexture_4UI[] = {

-    68,  88,  66,  67,  150, 54,  239, 129, 105, 57,  103, 28,  8,   175, 168, 118, 153, 92,  233,

-    98,  1,   0,   0,   0,   20,  2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   152, 1,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   1,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   66,  117, 102, 102, 101, 114, 52,  85,  73,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,

-    80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,

-    82,  80,  0,   0,   0,   64,  0,   0,   0,   20,  0,   0,   0,   88,  8,   0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  8,   0,   3,   18,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   45,  0,   0,   7,

-    242, 32,  16,  0,   0,   0,   0,   0,   6,   16,  16,  0,   1,   0,   0,   0,   70,  126, 16,

-    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_BufferToTexture_4UI /T ps_4_0 /Fh
+//    compiled/buffertotexture11_ps_4ui.h BufferToTexture11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Buffer4UI                         texture   uint4         buf    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float       
+// TEXCOORD                 0   x           1     NONE   uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Target                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_buffer (uint,uint,uint,uint) t0
+dcl_input_ps constant v1.x
+dcl_output o0.xyzw
+ld o0.xyzw, v1.xxxx, t0.xyzw
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_BufferToTexture_4UI[] = {
+    68,  88,  66,  67,  150, 54,  239, 129, 105, 57,  103, 28,  8,   175, 168, 118, 153, 92,  233,
+    98,  1,   0,   0,   0,   20,  2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   152, 1,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   1,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   66,  117, 102, 102, 101, 114, 52,  85,  73,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,
+    80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,
+    82,  80,  0,   0,   0,   64,  0,   0,   0,   20,  0,   0,   0,   88,  8,   0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  8,   0,   3,   18,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   45,  0,   0,   7,
+    242, 32,  16,  0,   0,   0,   0,   0,   6,   16,  16,  0,   1,   0,   0,   0,   70,  126, 16,
+    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h
index 881a975..41f1c03 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h
@@ -1,150 +1,150 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E VS_BufferToTexture /T vs_4_0 /Fh

-//    compiled/buffertotexture11_vs.h BufferToTexture11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer BufferCopyParams

-// {

-//

-//   uint FirstPixelOffset;             // Offset:    0 Size:     4

-//   uint PixelsPerRow;                 // Offset:    4 Size:     4

-//   uint RowStride;                    // Offset:    8 Size:     4

-//   uint RowsPerSlice;                 // Offset:   12 Size:     4

-//   float2 PositionOffset;             // Offset:   16 Size:     8

-//   float2 PositionScale;              // Offset:   24 Size:     8

-//   int2 TexLocationOffset;            // Offset:   32 Size:     8 [unused]

-//   int2 TexLocationScale;             // Offset:   40 Size:     8 [unused]

-//   uint FirstSlice;                   // Offset:   48 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// BufferCopyParams                  cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_VertexID              0   x           0   VERTID   uint   x   

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float   xyzw

-// TEXCOORD                 0   x           1     NONE   uint   x   

-// LAYER                    0    y          1     NONE   uint    y  

-//

-vs_4_0

-dcl_constantbuffer cb0[4], immediateIndexed

-dcl_input_sgv v0.x, vertex_id

-dcl_output_siv o0.xyzw, position

-dcl_output o1.x

-dcl_output o1.y

-dcl_temps 2

-mov o0.zw, l(0,0,0,1.000000)

-imul null, r0.xy, cb0[0].yzyy, cb0[0].wwww

-udiv r0.z, null, v0.x, r0.x

-imad r0.x, -r0.z, r0.x, v0.x

-imad r0.y, r0.z, r0.y, cb0[0].x

-iadd o1.y, cb0[3].x, r0.z

-udiv r0.z, null, r0.x, cb0[0].y

-imad r0.x, -r0.z, cb0[0].y, r0.x

-utof r1.xy, r0.xzxx

-imad r0.y, r0.z, cb0[0].z, r0.y

-iadd o1.x, r0.y, r0.x

-mad o0.xy, cb0[1].zwzz, r1.xyxx, cb0[1].xyxx

-ret 

-// Approximately 13 instruction slots used

-#endif

-

-const BYTE g_VS_BufferToTexture[] = {

-    68,  88,  66,  67,  118, 65,  244, 232, 116, 137, 175, 126, 82,  230, 140, 17,  178, 249, 223,

-    31,  1,   0,   0,   0,   152, 5,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   100, 2,

-    0,   0,   152, 2,   0,   0,   12,  3,   0,   0,   28,  5,   0,   0,   82,  68,  69,  70,  40,

-    2,   0,   0,   1,   0,   0,   0,   80,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   254, 255, 0,   1,   0,   0,   244, 1,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   66,  117, 102, 102, 101, 114, 67,  111, 112, 121, 80,  97,  114,

-    97,  109, 115, 0,   171, 171, 171, 60,  0,   0,   0,   9,   0,   0,   0,   104, 0,   0,   0,

-    64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   64,  1,   0,   0,   0,   0,   0,

-    0,   4,   0,   0,   0,   2,   0,   0,   0,   84,  1,   0,   0,   0,   0,   0,   0,   100, 1,

-    0,   0,   4,   0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   84,  1,   0,   0,   0,

-    0,   0,   0,   113, 1,   0,   0,   8,   0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,

-    84,  1,   0,   0,   0,   0,   0,   0,   123, 1,   0,   0,   12,  0,   0,   0,   4,   0,   0,

-    0,   2,   0,   0,   0,   84,  1,   0,   0,   0,   0,   0,   0,   136, 1,   0,   0,   16,  0,

-    0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   152, 1,   0,   0,   0,   0,   0,   0,   168,

-    1,   0,   0,   24,  0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   152, 1,   0,   0,

-    0,   0,   0,   0,   182, 1,   0,   0,   32,  0,   0,   0,   8,   0,   0,   0,   0,   0,   0,

-    0,   200, 1,   0,   0,   0,   0,   0,   0,   216, 1,   0,   0,   40,  0,   0,   0,   8,   0,

-    0,   0,   0,   0,   0,   0,   200, 1,   0,   0,   0,   0,   0,   0,   233, 1,   0,   0,   48,

-    0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   84,  1,   0,   0,   0,   0,   0,   0,

-    70,  105, 114, 115, 116, 80,  105, 120, 101, 108, 79,  102, 102, 115, 101, 116, 0,   171, 171,

-    171, 0,   0,   19,  0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   80,  105,

-    120, 101, 108, 115, 80,  101, 114, 82,  111, 119, 0,   82,  111, 119, 83,  116, 114, 105, 100,

-    101, 0,   82,  111, 119, 115, 80,  101, 114, 83,  108, 105, 99,  101, 0,   80,  111, 115, 105,

-    116, 105, 111, 110, 79,  102, 102, 115, 101, 116, 0,   171, 1,   0,   3,   0,   1,   0,   2,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   80,  111, 115, 105, 116, 105, 111, 110, 83,  99,

-    97,  108, 101, 0,   84,  101, 120, 76,  111, 99,  97,  116, 105, 111, 110, 79,  102, 102, 115,

-    101, 116, 0,   1,   0,   2,   0,   1,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    84,  101, 120, 76,  111, 99,  97,  116, 105, 111, 110, 83,  99,  97,  108, 101, 0,   70,  105,

-    114, 115, 116, 83,  108, 105, 99,  101, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,

-    40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109,

-    112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,

-    0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   1,   1,   0,   0,   83,  86,  95,  86,  101, 114, 116, 101, 120, 73,  68,  0,   79,

-    83,  71,  78,  108, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   92,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,

-    0,   0,   1,   14,  0,   0,   101, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   1,   0,   0,   0,   2,   13,  0,   0,   83,  86,  95,  80,  111, 115, 105, 116,

-    105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   76,  65,  89,  69,  82,  0,

-    171, 83,  72,  68,  82,  8,   2,   0,   0,   64,  0,   1,   0,   130, 0,   0,   0,   89,  0,

-    0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   4,   0,   0,   0,   96,  0,   0,   4,   18,

-    16,  16,  0,   0,   0,   0,   0,   6,   0,   0,   0,   103, 0,   0,   4,   242, 32,  16,  0,

-    0,   0,   0,   0,   1,   0,   0,   0,   101, 0,   0,   3,   18,  32,  16,  0,   1,   0,   0,

-    0,   101, 0,   0,   3,   34,  32,  16,  0,   1,   0,   0,   0,   104, 0,   0,   2,   2,   0,

-    0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  38,  0,   0,   10,

-    0,   208, 0,   0,   50,  0,   16,  0,   0,   0,   0,   0,   150, 133, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   246, 143, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   78,  0,

-    0,   8,   66,  0,   16,  0,   0,   0,   0,   0,   0,   208, 0,   0,   10,  16,  16,  0,   0,

-    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   35,  0,   0,   10,  18,  0,   16,  0,

-    0,   0,   0,   0,   42,  0,   16,  128, 65,  0,   0,   0,   0,   0,   0,   0,   10,  0,   16,

-    0,   0,   0,   0,   0,   10,  16,  16,  0,   0,   0,   0,   0,   35,  0,   0,   10,  34,  0,

-    16,  0,   0,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   26,  0,   16,  0,   0,

-    0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   30,  0,   0,   8,

-    34,  32,  16,  0,   1,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   3,   0,   0,

-    0,   42,  0,   16,  0,   0,   0,   0,   0,   78,  0,   0,   9,   66,  0,   16,  0,   0,   0,

-    0,   0,   0,   208, 0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   26,  128, 32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   35,  0,   0,   11,  18,  0,   16,  0,   0,   0,   0,   0,

-    42,  0,   16,  128, 65,  0,   0,   0,   0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,

-    16,  0,   1,   0,   0,   0,   134, 0,   16,  0,   0,   0,   0,   0,   35,  0,   0,   10,  34,

-    0,   16,  0,   0,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   42,  128, 32,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   30,  0,   0,

-    7,   18,  32,  16,  0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   10,  0,

-    16,  0,   0,   0,   0,   0,   50,  0,   0,   11,  50,  32,  16,  0,   0,   0,   0,   0,   230,

-    138, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   70,  0,   16,  0,   1,   0,   0,   0,

-    70,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   13,  0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   4,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E VS_BufferToTexture /T vs_4_0 /Fh
+//    compiled/buffertotexture11_vs.h BufferToTexture11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer BufferCopyParams
+// {
+//
+//   uint FirstPixelOffset;             // Offset:    0 Size:     4
+//   uint PixelsPerRow;                 // Offset:    4 Size:     4
+//   uint RowStride;                    // Offset:    8 Size:     4
+//   uint RowsPerSlice;                 // Offset:   12 Size:     4
+//   float2 PositionOffset;             // Offset:   16 Size:     8
+//   float2 PositionScale;              // Offset:   24 Size:     8
+//   int2 TexLocationOffset;            // Offset:   32 Size:     8 [unused]
+//   int2 TexLocationScale;             // Offset:   40 Size:     8 [unused]
+//   uint FirstSlice;                   // Offset:   48 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// BufferCopyParams                  cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_VertexID              0   x           0   VERTID   uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float   xyzw
+// TEXCOORD                 0   x           1     NONE   uint   x   
+// LAYER                    0    y          1     NONE   uint    y  
+//
+vs_4_0
+dcl_constantbuffer cb0[4], immediateIndexed
+dcl_input_sgv v0.x, vertex_id
+dcl_output_siv o0.xyzw, position
+dcl_output o1.x
+dcl_output o1.y
+dcl_temps 2
+mov o0.zw, l(0,0,0,1.000000)
+imul null, r0.xy, cb0[0].yzyy, cb0[0].wwww
+udiv r0.z, null, v0.x, r0.x
+imad r0.x, -r0.z, r0.x, v0.x
+imad r0.y, r0.z, r0.y, cb0[0].x
+iadd o1.y, cb0[3].x, r0.z
+udiv r0.z, null, r0.x, cb0[0].y
+imad r0.x, -r0.z, cb0[0].y, r0.x
+utof r1.xy, r0.xzxx
+imad r0.y, r0.z, cb0[0].z, r0.y
+iadd o1.x, r0.y, r0.x
+mad o0.xy, cb0[1].zwzz, r1.xyxx, cb0[1].xyxx
+ret 
+// Approximately 13 instruction slots used
+#endif
+
+const BYTE g_VS_BufferToTexture[] = {
+    68,  88,  66,  67,  118, 65,  244, 232, 116, 137, 175, 126, 82,  230, 140, 17,  178, 249, 223,
+    31,  1,   0,   0,   0,   152, 5,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   100, 2,
+    0,   0,   152, 2,   0,   0,   12,  3,   0,   0,   28,  5,   0,   0,   82,  68,  69,  70,  40,
+    2,   0,   0,   1,   0,   0,   0,   80,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   254, 255, 0,   1,   0,   0,   244, 1,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   66,  117, 102, 102, 101, 114, 67,  111, 112, 121, 80,  97,  114,
+    97,  109, 115, 0,   171, 171, 171, 60,  0,   0,   0,   9,   0,   0,   0,   104, 0,   0,   0,
+    64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   64,  1,   0,   0,   0,   0,   0,
+    0,   4,   0,   0,   0,   2,   0,   0,   0,   84,  1,   0,   0,   0,   0,   0,   0,   100, 1,
+    0,   0,   4,   0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   84,  1,   0,   0,   0,
+    0,   0,   0,   113, 1,   0,   0,   8,   0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,
+    84,  1,   0,   0,   0,   0,   0,   0,   123, 1,   0,   0,   12,  0,   0,   0,   4,   0,   0,
+    0,   2,   0,   0,   0,   84,  1,   0,   0,   0,   0,   0,   0,   136, 1,   0,   0,   16,  0,
+    0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   152, 1,   0,   0,   0,   0,   0,   0,   168,
+    1,   0,   0,   24,  0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   152, 1,   0,   0,
+    0,   0,   0,   0,   182, 1,   0,   0,   32,  0,   0,   0,   8,   0,   0,   0,   0,   0,   0,
+    0,   200, 1,   0,   0,   0,   0,   0,   0,   216, 1,   0,   0,   40,  0,   0,   0,   8,   0,
+    0,   0,   0,   0,   0,   0,   200, 1,   0,   0,   0,   0,   0,   0,   233, 1,   0,   0,   48,
+    0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   84,  1,   0,   0,   0,   0,   0,   0,
+    70,  105, 114, 115, 116, 80,  105, 120, 101, 108, 79,  102, 102, 115, 101, 116, 0,   171, 171,
+    171, 0,   0,   19,  0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   80,  105,
+    120, 101, 108, 115, 80,  101, 114, 82,  111, 119, 0,   82,  111, 119, 83,  116, 114, 105, 100,
+    101, 0,   82,  111, 119, 115, 80,  101, 114, 83,  108, 105, 99,  101, 0,   80,  111, 115, 105,
+    116, 105, 111, 110, 79,  102, 102, 115, 101, 116, 0,   171, 1,   0,   3,   0,   1,   0,   2,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   80,  111, 115, 105, 116, 105, 111, 110, 83,  99,
+    97,  108, 101, 0,   84,  101, 120, 76,  111, 99,  97,  116, 105, 111, 110, 79,  102, 102, 115,
+    101, 116, 0,   1,   0,   2,   0,   1,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    84,  101, 120, 76,  111, 99,  97,  116, 105, 111, 110, 83,  99,  97,  108, 101, 0,   70,  105,
+    114, 115, 116, 83,  108, 105, 99,  101, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,
+    40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109,
+    112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,
+    0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   1,   1,   0,   0,   83,  86,  95,  86,  101, 114, 116, 101, 120, 73,  68,  0,   79,
+    83,  71,  78,  108, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   92,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,
+    0,   0,   1,   14,  0,   0,   101, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   1,   0,   0,   0,   2,   13,  0,   0,   83,  86,  95,  80,  111, 115, 105, 116,
+    105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   76,  65,  89,  69,  82,  0,
+    171, 83,  72,  68,  82,  8,   2,   0,   0,   64,  0,   1,   0,   130, 0,   0,   0,   89,  0,
+    0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   4,   0,   0,   0,   96,  0,   0,   4,   18,
+    16,  16,  0,   0,   0,   0,   0,   6,   0,   0,   0,   103, 0,   0,   4,   242, 32,  16,  0,
+    0,   0,   0,   0,   1,   0,   0,   0,   101, 0,   0,   3,   18,  32,  16,  0,   1,   0,   0,
+    0,   101, 0,   0,   3,   34,  32,  16,  0,   1,   0,   0,   0,   104, 0,   0,   2,   2,   0,
+    0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  38,  0,   0,   10,
+    0,   208, 0,   0,   50,  0,   16,  0,   0,   0,   0,   0,   150, 133, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   246, 143, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   78,  0,
+    0,   8,   66,  0,   16,  0,   0,   0,   0,   0,   0,   208, 0,   0,   10,  16,  16,  0,   0,
+    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   35,  0,   0,   10,  18,  0,   16,  0,
+    0,   0,   0,   0,   42,  0,   16,  128, 65,  0,   0,   0,   0,   0,   0,   0,   10,  0,   16,
+    0,   0,   0,   0,   0,   10,  16,  16,  0,   0,   0,   0,   0,   35,  0,   0,   10,  34,  0,
+    16,  0,   0,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   26,  0,   16,  0,   0,
+    0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   30,  0,   0,   8,
+    34,  32,  16,  0,   1,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   3,   0,   0,
+    0,   42,  0,   16,  0,   0,   0,   0,   0,   78,  0,   0,   9,   66,  0,   16,  0,   0,   0,
+    0,   0,   0,   208, 0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   26,  128, 32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   35,  0,   0,   11,  18,  0,   16,  0,   0,   0,   0,   0,
+    42,  0,   16,  128, 65,  0,   0,   0,   0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,
+    16,  0,   1,   0,   0,   0,   134, 0,   16,  0,   0,   0,   0,   0,   35,  0,   0,   10,  34,
+    0,   16,  0,   0,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   42,  128, 32,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   30,  0,   0,
+    7,   18,  32,  16,  0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   10,  0,
+    16,  0,   0,   0,   0,   0,   50,  0,   0,   11,  50,  32,  16,  0,   0,   0,   0,   0,   230,
+    138, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   70,  0,   16,  0,   1,   0,   0,   0,
+    70,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   13,  0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   4,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11_fl9vs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11_fl9vs.h
index 4998c47..5f04bcb 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11_fl9vs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11_fl9vs.h
@@ -1,75 +1,75 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E VS_Clear_FL9 /T vs_4_0_level_9_3 /Fh

-//    compiled\clear11_fl9vs.h Clear11.hlsl

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// POSITION                 0   xyzw        0     NONE  float   xyzw

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float   xyzw

-//

-//

-// Runtime generated constant mappings:

-//

-// Target Reg                               Constant Description

-// ---------- --------------------------------------------------

-// c0                              Vertex Shader position offset

-//

-//

-// Level9 shader bytecode:

-//

-    vs_2_x

-    dcl_texcoord v0

-    mad oPos.xy, v0.w, c0, v0

-    mov oPos.zw, v0

-

-// approximately 2 instruction slots used

-vs_4_0

-dcl_input v0.xyzw

-dcl_output_siv o0.xyzw, position

-mov o0.xyzw, v0.xyzw

-ret 

-// Approximately 2 instruction slots used

-#endif

-

-const BYTE g_VS_Clear_FL9[] = {

-    68,  88, 66, 67, 70,  225, 22,  82,  198, 171, 210, 104, 82,  233, 227, 173, 206, 48,  250, 109,

-    1,   0,  0,  0,  28,  2,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   156, 0,   0,   0,

-    224, 0,  0,  0,  92,  1,   0,   0,   180, 1,   0,   0,   232, 1,   0,   0,   65,  111, 110, 57,

-    92,  0,  0,  0,  92,  0,   0,   0,   0,   2,   254, 255, 52,  0,   0,   0,   40,  0,   0,   0,

-    0,   0,  36, 0,  0,   0,   36,  0,   0,   0,   36,  0,   0,   0,   36,  0,   1,   0,   36,  0,

-    0,   0,  0,  0,  1,   2,   254, 255, 31,  0,   0,   2,   5,   0,   0,   128, 0,   0,   15,  144,

-    4,   0,  0,  4,  0,   0,   3,   192, 0,   0,   255, 144, 0,   0,   228, 160, 0,   0,   228, 144,

-    1,   0,  0,  2,  0,   0,   12,  192, 0,   0,   228, 144, 255, 255, 0,   0,   83,  72,  68,  82,

-    60,  0,  0,  0,  64,  0,   1,   0,   15,  0,   0,   0,   95,  0,   0,   3,   242, 16,  16,  0,

-    0,   0,  0,  0,  103, 0,   0,   4,   242, 32,  16,  0,   0,   0,   0,   0,   1,   0,   0,   0,

-    54,  0,  0,  5,  242, 32,  16,  0,   0,   0,   0,   0,   70,  30,  16,  0,   0,   0,   0,   0,

-    62,  0,  0,  1,  83,  84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,  0,  2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,  0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,  0,  0,   0,   0,   0,   82,  68,  69,  70,  80,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,  0,  0,   0,   0,   0,   28,  0,   0,   0,   0,   4,   254, 255, 0,   1,   0,   0,

-    28,  0,  0,  0,  77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,

-    83,  76, 32, 83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,

-    46,  50, 57, 46, 57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    44,  0,  0,  0,  1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,  0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  15,  0,   0,   80,  79,  83,  73,

-    84,  73, 79, 78, 0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,

-    8,   0,  0,  0,  32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,

-    0,   0,  0,  0,  15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E VS_Clear_FL9 /T vs_4_0_level_9_3 /Fh
+//    compiled\clear11_fl9vs.h Clear11.hlsl
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// POSITION                 0   xyzw        0     NONE  float   xyzw
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float   xyzw
+//
+//
+// Runtime generated constant mappings:
+//
+// Target Reg                               Constant Description
+// ---------- --------------------------------------------------
+// c0                              Vertex Shader position offset
+//
+//
+// Level9 shader bytecode:
+//
+    vs_2_x
+    dcl_texcoord v0
+    mad oPos.xy, v0.w, c0, v0
+    mov oPos.zw, v0
+
+// approximately 2 instruction slots used
+vs_4_0
+dcl_input v0.xyzw
+dcl_output_siv o0.xyzw, position
+mov o0.xyzw, v0.xyzw
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_VS_Clear_FL9[] = {
+    68,  88, 66, 67, 70,  225, 22,  82,  198, 171, 210, 104, 82,  233, 227, 173, 206, 48,  250, 109,
+    1,   0,  0,  0,  28,  2,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   156, 0,   0,   0,
+    224, 0,  0,  0,  92,  1,   0,   0,   180, 1,   0,   0,   232, 1,   0,   0,   65,  111, 110, 57,
+    92,  0,  0,  0,  92,  0,   0,   0,   0,   2,   254, 255, 52,  0,   0,   0,   40,  0,   0,   0,
+    0,   0,  36, 0,  0,   0,   36,  0,   0,   0,   36,  0,   0,   0,   36,  0,   1,   0,   36,  0,
+    0,   0,  0,  0,  1,   2,   254, 255, 31,  0,   0,   2,   5,   0,   0,   128, 0,   0,   15,  144,
+    4,   0,  0,  4,  0,   0,   3,   192, 0,   0,   255, 144, 0,   0,   228, 160, 0,   0,   228, 144,
+    1,   0,  0,  2,  0,   0,   12,  192, 0,   0,   228, 144, 255, 255, 0,   0,   83,  72,  68,  82,
+    60,  0,  0,  0,  64,  0,   1,   0,   15,  0,   0,   0,   95,  0,   0,   3,   242, 16,  16,  0,
+    0,   0,  0,  0,  103, 0,   0,   4,   242, 32,  16,  0,   0,   0,   0,   0,   1,   0,   0,   0,
+    54,  0,  0,  5,  242, 32,  16,  0,   0,   0,   0,   0,   70,  30,  16,  0,   0,   0,   0,   0,
+    62,  0,  0,  1,  83,  84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,  0,  2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,  0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,  0,  0,   0,   0,   0,   82,  68,  69,  70,  80,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,  0,  0,   0,   0,   0,   28,  0,   0,   0,   0,   4,   254, 255, 0,   1,   0,   0,
+    28,  0,  0,  0,  77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,
+    83,  76, 32, 83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,
+    46,  50, 57, 46, 57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    44,  0,  0,  0,  1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,  0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  15,  0,   0,   80,  79,  83,  73,
+    84,  73, 79, 78, 0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,
+    8,   0,  0,  0,  32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,
+    0,   0,  0,  0,  15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewgs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewgs.h
index fa13ac6..4e581a2 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewgs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewgs.h
@@ -1,88 +1,88 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E GS_Multiview_Clear /T gs_4_0 /Fh

-//    compiled\clear11multiviewgs.h Clear11.hlsl

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float   xyzw

-// TEXCOORD                 0   x           1     NONE   uint   x   

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float   xyzw

-// SV_RenderTargetArrayIndex     0   x           1  RTINDEX   uint   x   

-//

-gs_4_0

-dcl_input_siv v[3][0].xyzw, position

-dcl_input v[3][1].x

-dcl_temps 1

-dcl_inputprimitive triangle 

-dcl_outputtopology trianglestrip 

-dcl_output_siv o0.xyzw, position

-dcl_output_siv o1.x, rendertarget_array_index

-dcl_maxout 3

-mov r0.x, l(0)

-loop 

-  ige r0.y, r0.x, l(3)

-  breakc_nz r0.y

-  mov o0.xyzw, v[r0.x + 0][0].xyzw

-  mov o1.x, v[r0.x + 0][1].x

-  emit 

-  iadd r0.x, r0.x, l(1)

-endloop 

-cut 

-ret 

-// Approximately 11 instruction slots used

-#endif

-

-const BYTE g_GS_Multiview_Clear[] = {

-    68,  88,  66,  67,  97,  213, 116, 205, 170, 60, 132, 93,  138, 100, 91,  17,  237, 138, 8,

-    224, 1,   0,   0,   0,   216, 2,   0,   0,   5,  0,   0,   0,   52,  0,   0,   0,   140, 0,

-    0,   0,   228, 0,   0,   0,   76,  1,   0,   0,  92,  2,   0,   0,   82,  68,  69,  70,  80,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   83,  71,  0,   1,   0,   0,   28,  0,  0,   0,   77,  105, 99,  114, 111, 115, 111,

-    102, 116, 32,  40,  82,  41,  32,  72,  76,  83, 76,  32,  83,  104, 97,  100, 101, 114, 32,

-    67,  111, 109, 112, 105, 108, 101, 114, 32,  57, 46,  50,  57,  46,  57,  53,  50,  46,  51,

-    49,  49,  49,  0,   171, 171, 171, 73,  83,  71, 78,  80,  0,   0,   0,   2,   0,   0,   0,

-    8,   0,   0,   0,   56,  0,   0,   0,   0,   0,  0,   0,   1,   0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   15,  15,  0,   0,   68, 0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,  1,   1,   0,   0,   83,  86,  95,  80,  111,

-    115, 105, 116, 105, 111, 110, 0,   84,  69,  88, 67,  79,  79,  82,  68,  0,   171, 171, 171,

-    79,  83,  71,  78,  96,  0,   0,   0,   2,   0,  0,   0,   8,   0,   0,   0,   56,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,  0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   68,  0,   0,   0,   0,   0,   0,   0,  4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   14,  0,   0,   83,  86,  95, 80,  111, 115, 105, 116, 105, 111, 110, 0,

-    83,  86,  95,  82,  101, 110, 100, 101, 114, 84, 97,  114, 103, 101, 116, 65,  114, 114, 97,

-    121, 73,  110, 100, 101, 120, 0,   171, 171, 83, 72,  68,  82,  8,   1,   0,   0,   64,  0,

-    2,   0,   66,  0,   0,   0,   97,  0,   0,   5,  242, 16,  32,  0,   3,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   95,  0,   0,  4,   18,  16,  32,  0,   3,   0,   0,   0,

-    1,   0,   0,   0,   104, 0,   0,   2,   1,   0,  0,   0,   93,  24,  0,   1,   92,  40,  0,

-    1,   103, 0,   0,   4,   242, 32,  16,  0,   0,  0,   0,   0,   1,   0,   0,   0,   103, 0,

-    0,   4,   18,  32,  16,  0,   1,   0,   0,   0,  4,   0,   0,   0,   94,  0,   0,   2,   3,

-    0,   0,   0,   54,  0,   0,   5,   18,  0,   16, 0,   0,   0,   0,   0,   1,   64,  0,   0,

-    0,   0,   0,   0,   48,  0,   0,   1,   33,  0,  0,   7,   34,  0,   16,  0,   0,   0,   0,

-    0,   10,  0,   16,  0,   0,   0,   0,   0,   1,  64,  0,   0,   3,   0,   0,   0,   3,   0,

-    4,   3,   26,  0,   16,  0,   0,   0,   0,   0,  54,  0,   0,   7,   242, 32,  16,  0,   0,

-    0,   0,   0,   70,  30,  160, 0,   10,  0,   16, 0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   7,   18,  32,  16,  0,   1,   0,  0,   0,   10,  16,  160, 0,   10,  0,   16,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   19, 0,   0,   1,   30,  0,   0,   7,   18,  0,

-    16,  0,   0,   0,   0,   0,   10,  0,   16,  0,  0,   0,   0,   0,   1,   64,  0,   0,   1,

-    0,   0,   0,   22,  0,   0,   1,   9,   0,   0,  1,   62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,   0,   0,   11,  0,   0,   0,   1,   0,  0,   0,   0,   0,   0,   0,   4,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,   0,   1,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   11,  0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   5,   0,   0,   0,   3,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E GS_Multiview_Clear /T gs_4_0 /Fh
+//    compiled\clear11multiviewgs.h Clear11.hlsl
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float   xyzw
+// TEXCOORD                 0   x           1     NONE   uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float   xyzw
+// SV_RenderTargetArrayIndex     0   x           1  RTINDEX   uint   x   
+//
+gs_4_0
+dcl_input_siv v[3][0].xyzw, position
+dcl_input v[3][1].x
+dcl_temps 1
+dcl_inputprimitive triangle 
+dcl_outputtopology trianglestrip 
+dcl_output_siv o0.xyzw, position
+dcl_output_siv o1.x, rendertarget_array_index
+dcl_maxout 3
+mov r0.x, l(0)
+loop 
+  ige r0.y, r0.x, l(3)
+  breakc_nz r0.y
+  mov o0.xyzw, v[r0.x + 0][0].xyzw
+  mov o1.x, v[r0.x + 0][1].x
+  emit 
+  iadd r0.x, r0.x, l(1)
+endloop 
+cut 
+ret 
+// Approximately 11 instruction slots used
+#endif
+
+const BYTE g_GS_Multiview_Clear[] = {
+    68,  88,  66,  67,  97,  213, 116, 205, 170, 60, 132, 93,  138, 100, 91,  17,  237, 138, 8,
+    224, 1,   0,   0,   0,   216, 2,   0,   0,   5,  0,   0,   0,   52,  0,   0,   0,   140, 0,
+    0,   0,   228, 0,   0,   0,   76,  1,   0,   0,  92,  2,   0,   0,   82,  68,  69,  70,  80,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   83,  71,  0,   1,   0,   0,   28,  0,  0,   0,   77,  105, 99,  114, 111, 115, 111,
+    102, 116, 32,  40,  82,  41,  32,  72,  76,  83, 76,  32,  83,  104, 97,  100, 101, 114, 32,
+    67,  111, 109, 112, 105, 108, 101, 114, 32,  57, 46,  50,  57,  46,  57,  53,  50,  46,  51,
+    49,  49,  49,  0,   171, 171, 171, 73,  83,  71, 78,  80,  0,   0,   0,   2,   0,   0,   0,
+    8,   0,   0,   0,   56,  0,   0,   0,   0,   0,  0,   0,   1,   0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   15,  15,  0,   0,   68, 0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,  1,   1,   0,   0,   83,  86,  95,  80,  111,
+    115, 105, 116, 105, 111, 110, 0,   84,  69,  88, 67,  79,  79,  82,  68,  0,   171, 171, 171,
+    79,  83,  71,  78,  96,  0,   0,   0,   2,   0,  0,   0,   8,   0,   0,   0,   56,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,  0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   68,  0,   0,   0,   0,   0,   0,   0,  4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   14,  0,   0,   83,  86,  95, 80,  111, 115, 105, 116, 105, 111, 110, 0,
+    83,  86,  95,  82,  101, 110, 100, 101, 114, 84, 97,  114, 103, 101, 116, 65,  114, 114, 97,
+    121, 73,  110, 100, 101, 120, 0,   171, 171, 83, 72,  68,  82,  8,   1,   0,   0,   64,  0,
+    2,   0,   66,  0,   0,   0,   97,  0,   0,   5,  242, 16,  32,  0,   3,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   95,  0,   0,  4,   18,  16,  32,  0,   3,   0,   0,   0,
+    1,   0,   0,   0,   104, 0,   0,   2,   1,   0,  0,   0,   93,  24,  0,   1,   92,  40,  0,
+    1,   103, 0,   0,   4,   242, 32,  16,  0,   0,  0,   0,   0,   1,   0,   0,   0,   103, 0,
+    0,   4,   18,  32,  16,  0,   1,   0,   0,   0,  4,   0,   0,   0,   94,  0,   0,   2,   3,
+    0,   0,   0,   54,  0,   0,   5,   18,  0,   16, 0,   0,   0,   0,   0,   1,   64,  0,   0,
+    0,   0,   0,   0,   48,  0,   0,   1,   33,  0,  0,   7,   34,  0,   16,  0,   0,   0,   0,
+    0,   10,  0,   16,  0,   0,   0,   0,   0,   1,  64,  0,   0,   3,   0,   0,   0,   3,   0,
+    4,   3,   26,  0,   16,  0,   0,   0,   0,   0,  54,  0,   0,   7,   242, 32,  16,  0,   0,
+    0,   0,   0,   70,  30,  160, 0,   10,  0,   16, 0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   7,   18,  32,  16,  0,   1,   0,  0,   0,   10,  16,  160, 0,   10,  0,   16,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   19, 0,   0,   1,   30,  0,   0,   7,   18,  0,
+    16,  0,   0,   0,   0,   0,   10,  0,   16,  0,  0,   0,   0,   0,   1,   64,  0,   0,   1,
+    0,   0,   0,   22,  0,   0,   1,   9,   0,   0,  1,   62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,   0,   0,   11,  0,   0,   0,   1,   0,  0,   0,   0,   0,   0,   0,   4,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,   0,   1,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   11,  0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   5,   0,   0,   0,   3,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewvs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewvs.h
index 820ffdd..aa3073b 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewvs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewvs.h
@@ -1,85 +1,85 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E VS_Multiview_Clear /T vs_4_0 /Fh

-//    compiled\clear11multiviewvs.h Clear11.hlsl

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_VertexID              0   x           0   VERTID   uint   x   

-// SV_InstanceID            0   x           1   INSTID   uint   x   

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float   xyzw

-// TEXCOORD                 0   x           1     NONE   uint   x   

-//

-vs_4_0

-dcl_immediateConstantBuffer { { -1.000000, 1.000000, 0, 0},

-                              { 1.000000, -1.000000, 0, 0},

-                              { -1.000000, -1.000000, 0, 0},

-                              { -1.000000, 1.000000, 0, 0},

-                              { 1.000000, 1.000000, 0, 0},

-                              { 1.000000, -1.000000, 0, 0} }

-dcl_input_sgv v0.x, vertex_id

-dcl_input_sgv v1.x, instance_id

-dcl_output_siv o0.xyzw, position

-dcl_output o1.x

-dcl_temps 1

-mov r0.x, v0.x

-mov o0.xy, icb[r0.x + 0].xyxx

-mov o0.zw, l(0,0,0,1.000000)

-mov o1.x, v1.x

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_VS_Multiview_Clear[] = {

-    68,  88,  66,  67,  14,  99,  210, 81,  182, 39,  8,   134, 74,  169, 88,  103, 114, 197, 56,

-    220, 1,   0,   0,   0,   220, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 0,

-    0,   0,   232, 0,   0,   0,   64,  1,   0,   0,   96,  2,   0,   0,   82,  68,  69,  70,  80,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   254, 255, 0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111,

-    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,

-    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,

-    49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  84,  0,   0,   0,   2,   0,   0,   0,

-    8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   1,   1,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   8,   0,

-    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,  86,  101,

-    114, 116, 101, 120, 73,  68,  0,   83,  86,  95,  73,  110, 115, 116, 97,  110, 99,  101, 73,

-    68,  0,   171, 171, 79,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,

-    0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   1,   0,   0,   0,   1,   14,  0,   0,   83,  86,  95,  80,  79,  83,  73,  84,

-    73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 83,  72,  68,

-    82,  24,  1,   0,   0,   64,  0,   1,   0,   70,  0,   0,   0,   53,  24,  0,   0,   26,  0,

-    0,   0,   0,   0,   128, 191, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   128, 63,  0,   0,   128, 191, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 191,

-    0,   0,   128, 191, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 191, 0,   0,   128,

-    63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   128, 63,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   128, 191, 0,   0,   0,   0,   0,

-    0,   0,   0,   96,  0,   0,   4,   18,  16,  16,  0,   0,   0,   0,   0,   6,   0,   0,   0,

-    96,  0,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   8,   0,   0,   0,   103, 0,   0,

-    4,   242, 32,  16,  0,   0,   0,   0,   0,   1,   0,   0,   0,   101, 0,   0,   3,   18,  32,

-    16,  0,   1,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   54,  0,   0,   5,   18,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   0,   0,   0,   0,   54,  0,   0,   6,

-    50,  32,  16,  0,   0,   0,   0,   0,   70,  144, 144, 0,   10,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  54,  0,   0,   5,   18,

-    32,  16,  0,   1,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   6,   0,   0,

-    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E VS_Multiview_Clear /T vs_4_0 /Fh
+//    compiled\clear11multiviewvs.h Clear11.hlsl
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_VertexID              0   x           0   VERTID   uint   x   
+// SV_InstanceID            0   x           1   INSTID   uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float   xyzw
+// TEXCOORD                 0   x           1     NONE   uint   x   
+//
+vs_4_0
+dcl_immediateConstantBuffer { { -1.000000, 1.000000, 0, 0},
+                              { 1.000000, -1.000000, 0, 0},
+                              { -1.000000, -1.000000, 0, 0},
+                              { -1.000000, 1.000000, 0, 0},
+                              { 1.000000, 1.000000, 0, 0},
+                              { 1.000000, -1.000000, 0, 0} }
+dcl_input_sgv v0.x, vertex_id
+dcl_input_sgv v1.x, instance_id
+dcl_output_siv o0.xyzw, position
+dcl_output o1.x
+dcl_temps 1
+mov r0.x, v0.x
+mov o0.xy, icb[r0.x + 0].xyxx
+mov o0.zw, l(0,0,0,1.000000)
+mov o1.x, v1.x
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_VS_Multiview_Clear[] = {
+    68,  88,  66,  67,  14,  99,  210, 81,  182, 39,  8,   134, 74,  169, 88,  103, 114, 197, 56,
+    220, 1,   0,   0,   0,   220, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 0,
+    0,   0,   232, 0,   0,   0,   64,  1,   0,   0,   96,  2,   0,   0,   82,  68,  69,  70,  80,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   254, 255, 0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111,
+    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,
+    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,
+    49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  84,  0,   0,   0,   2,   0,   0,   0,
+    8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   1,   1,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   8,   0,
+    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,  86,  101,
+    114, 116, 101, 120, 73,  68,  0,   83,  86,  95,  73,  110, 115, 116, 97,  110, 99,  101, 73,
+    68,  0,   171, 171, 79,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,
+    0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   1,   0,   0,   0,   1,   14,  0,   0,   83,  86,  95,  80,  79,  83,  73,  84,
+    73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 83,  72,  68,
+    82,  24,  1,   0,   0,   64,  0,   1,   0,   70,  0,   0,   0,   53,  24,  0,   0,   26,  0,
+    0,   0,   0,   0,   128, 191, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   128, 63,  0,   0,   128, 191, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 191,
+    0,   0,   128, 191, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 191, 0,   0,   128,
+    63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   128, 63,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   128, 191, 0,   0,   0,   0,   0,
+    0,   0,   0,   96,  0,   0,   4,   18,  16,  16,  0,   0,   0,   0,   0,   6,   0,   0,   0,
+    96,  0,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   8,   0,   0,   0,   103, 0,   0,
+    4,   242, 32,  16,  0,   0,   0,   0,   0,   1,   0,   0,   0,   101, 0,   0,   3,   18,  32,
+    16,  0,   1,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   54,  0,   0,   5,   18,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   0,   0,   0,   0,   54,  0,   0,   6,
+    50,  32,  16,  0,   0,   0,   0,   0,   70,  144, 144, 0,   10,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  54,  0,   0,   5,   18,
+    32,  16,  0,   1,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   6,   0,   0,
+    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11vs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11vs.h
index 9484525..de5f1d3 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11vs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11vs.h
@@ -1,72 +1,72 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E VS_Clear /T vs_4_0 /Fh compiled\clear11vs.h Clear11.hlsl

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_VertexID              0   x           0   VERTID   uint   x   

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float   xyzw

-//

-vs_4_0

-dcl_immediateConstantBuffer { { -1.000000, 1.000000, 0, 0},

-                              { 1.000000, -1.000000, 0, 0},

-                              { -1.000000, -1.000000, 0, 0},

-                              { -1.000000, 1.000000, 0, 0},

-                              { 1.000000, 1.000000, 0, 0},

-                              { 1.000000, -1.000000, 0, 0} }

-dcl_input_sgv v0.x, vertex_id

-dcl_output_siv o0.xyzw, position

-dcl_temps 1

-mov r0.x, v0.x

-mov o0.xy, icb[r0.x + 0].xyxx

-mov o0.zw, l(0,0,0,1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_VS_Clear[] = {

-    68,  88,  66,  67,  103, 28,  87,  215, 135, 83, 130, 82,  213, 30,  12,  24,  41,  41,  187,

-    87,  1,   0,   0,   0,   96,  2,   0,   0,   5,  0,   0,   0,   52,  0,   0,   0,   140, 0,

-    0,   0,   192, 0,   0,   0,   244, 0,   0,   0,  228, 1,   0,   0,   82,  68,  69,  70,  80,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   254, 255, 0,   1,   0,   0,   28,  0,  0,   0,   77,  105, 99,  114, 111, 115, 111,

-    102, 116, 32,  40,  82,  41,  32,  72,  76,  83, 76,  32,  83,  104, 97,  100, 101, 114, 32,

-    67,  111, 109, 112, 105, 108, 101, 114, 32,  57, 46,  50,  57,  46,  57,  53,  50,  46,  51,

-    49,  49,  49,  0,   171, 171, 171, 73,  83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,

-    8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,   6,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   1,   1,   0,   0,   83, 86,  95,  86,  101, 114, 116, 101, 120, 73,

-    68,  0,   79,  83,  71,  78,  44,  0,   0,   0,  1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   3,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  80,  79,  83, 73,  84,  73,  79,  78,  0,   83,  72,  68,

-    82,  232, 0,   0,   0,   64,  0,   1,   0,   58, 0,   0,   0,   53,  24,  0,   0,   26,  0,

-    0,   0,   0,   0,   128, 191, 0,   0,   128, 63, 0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   128, 63,  0,   0,   128, 191, 0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   128, 191,

-    0,   0,   128, 191, 0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   128, 191, 0,   0,   128,

-    63,  0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   128, 63,  0,   0,   128, 63,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   128, 63, 0,   0,   128, 191, 0,   0,   0,   0,   0,

-    0,   0,   0,   96,  0,   0,   4,   18,  16,  16, 0,   0,   0,   0,   0,   6,   0,   0,   0,

-    103, 0,   0,   4,   242, 32,  16,  0,   0,   0,  0,   0,   1,   0,   0,   0,   104, 0,   0,

-    2,   1,   0,   0,   0,   54,  0,   0,   5,   18, 0,   16,  0,   0,   0,   0,   0,   10,  16,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,  50,  32,  16,  0,   0,   0,   0,   0,   70,

-    144, 144, 0,   10,  0,   16,  0,   0,   0,   0,  0,   54,  0,   0,   8,   194, 32,  16,  0,

-    0,   0,   0,   0,   2,   64,  0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   128, 63,  62,  0,   0,   1,   83, 84,  65,  84,  116, 0,   0,   0,   4,   0,

-    0,   0,   1,   0,   0,   0,   6,   0,   0,   0,  2,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E VS_Clear /T vs_4_0 /Fh compiled\clear11vs.h Clear11.hlsl
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_VertexID              0   x           0   VERTID   uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float   xyzw
+//
+vs_4_0
+dcl_immediateConstantBuffer { { -1.000000, 1.000000, 0, 0},
+                              { 1.000000, -1.000000, 0, 0},
+                              { -1.000000, -1.000000, 0, 0},
+                              { -1.000000, 1.000000, 0, 0},
+                              { 1.000000, 1.000000, 0, 0},
+                              { 1.000000, -1.000000, 0, 0} }
+dcl_input_sgv v0.x, vertex_id
+dcl_output_siv o0.xyzw, position
+dcl_temps 1
+mov r0.x, v0.x
+mov o0.xy, icb[r0.x + 0].xyxx
+mov o0.zw, l(0,0,0,1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_VS_Clear[] = {
+    68,  88,  66,  67,  103, 28,  87,  215, 135, 83, 130, 82,  213, 30,  12,  24,  41,  41,  187,
+    87,  1,   0,   0,   0,   96,  2,   0,   0,   5,  0,   0,   0,   52,  0,   0,   0,   140, 0,
+    0,   0,   192, 0,   0,   0,   244, 0,   0,   0,  228, 1,   0,   0,   82,  68,  69,  70,  80,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   254, 255, 0,   1,   0,   0,   28,  0,  0,   0,   77,  105, 99,  114, 111, 115, 111,
+    102, 116, 32,  40,  82,  41,  32,  72,  76,  83, 76,  32,  83,  104, 97,  100, 101, 114, 32,
+    67,  111, 109, 112, 105, 108, 101, 114, 32,  57, 46,  50,  57,  46,  57,  53,  50,  46,  51,
+    49,  49,  49,  0,   171, 171, 171, 73,  83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,
+    8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,   6,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   1,   1,   0,   0,   83, 86,  95,  86,  101, 114, 116, 101, 120, 73,
+    68,  0,   79,  83,  71,  78,  44,  0,   0,   0,  1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   3,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  80,  79,  83, 73,  84,  73,  79,  78,  0,   83,  72,  68,
+    82,  232, 0,   0,   0,   64,  0,   1,   0,   58, 0,   0,   0,   53,  24,  0,   0,   26,  0,
+    0,   0,   0,   0,   128, 191, 0,   0,   128, 63, 0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   128, 63,  0,   0,   128, 191, 0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   128, 191,
+    0,   0,   128, 191, 0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   128, 191, 0,   0,   128,
+    63,  0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   128, 63,  0,   0,   128, 63,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   128, 63, 0,   0,   128, 191, 0,   0,   0,   0,   0,
+    0,   0,   0,   96,  0,   0,   4,   18,  16,  16, 0,   0,   0,   0,   0,   6,   0,   0,   0,
+    103, 0,   0,   4,   242, 32,  16,  0,   0,   0,  0,   0,   1,   0,   0,   0,   104, 0,   0,
+    2,   1,   0,   0,   0,   54,  0,   0,   5,   18, 0,   16,  0,   0,   0,   0,   0,   10,  16,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,  50,  32,  16,  0,   0,   0,   0,   0,   70,
+    144, 144, 0,   10,  0,   16,  0,   0,   0,   0,  0,   54,  0,   0,   8,   194, 32,  16,  0,
+    0,   0,   0,   0,   2,   64,  0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   128, 63,  62,  0,   0,   1,   83, 84,  65,  84,  116, 0,   0,   0,   4,   0,
+    0,   0,   1,   0,   0,   0,   6,   0,   0,   0,  2,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/cleardepth11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/cleardepth11ps.h
index 742d511..059a844 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/cleardepth11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/cleardepth11ps.h
@@ -1,79 +1,79 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearDepth /T ps_4_0 /Fh compiled\cleardepth11ps.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer DepthOnlyData

-// {

-//

-//   float zValue_Depth;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// DepthOnlyData                     cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output oDepth

-mov oDepth, cb0[1].x

-ret 

-// Approximately 2 instruction slots used

-#endif

-

-const BYTE g_PS_ClearDepth[] = {

-    68,  88,  66,  67,  120, 231, 15,  116, 114, 21,  246, 235, 236, 14,  234, 123, 214, 247, 16,

-    187, 1,   0,   0,   0,   48,  2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   12,  1,

-    0,   0,   64,  1,   0,   0,   116, 1,   0,   0,   180, 1,   0,   0,   82,  68,  69,  70,  208,

-    0,   0,   0,   1,   0,   0,   0,   76,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   156, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   68,  101, 112, 116, 104, 79,  110, 108, 121, 68,  97,  116, 97,

-    0,   171, 171, 60,  0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   124, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,

-    0,   2,   0,   0,   0,   140, 0,   0,   0,   0,   0,   0,   0,   122, 86,  97,  108, 117, 101,

-    95,  68,  101, 112, 116, 104, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,

-    41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105,

-    108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171,

-    171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   79,  83,  71,

-    78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,

-    86,  95,  68,  69,  80,  84,  72,  0,   171, 171, 171, 83,  72,  68,  82,  56,  0,   0,   0,

-    64,  0,   0,   0,   14,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,

-    0,   2,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   5,   1,   192,

-    0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,

-    84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearDepth /T ps_4_0 /Fh compiled\cleardepth11ps.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer DepthOnlyData
+// {
+//
+//   float zValue_Depth;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// DepthOnlyData                     cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output oDepth
+mov oDepth, cb0[1].x
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_ClearDepth[] = {
+    68,  88,  66,  67,  120, 231, 15,  116, 114, 21,  246, 235, 236, 14,  234, 123, 214, 247, 16,
+    187, 1,   0,   0,   0,   48,  2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   12,  1,
+    0,   0,   64,  1,   0,   0,   116, 1,   0,   0,   180, 1,   0,   0,   82,  68,  69,  70,  208,
+    0,   0,   0,   1,   0,   0,   0,   76,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   156, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   68,  101, 112, 116, 104, 79,  110, 108, 121, 68,  97,  116, 97,
+    0,   171, 171, 60,  0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   124, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,
+    0,   2,   0,   0,   0,   140, 0,   0,   0,   0,   0,   0,   0,   122, 86,  97,  108, 117, 101,
+    95,  68,  101, 112, 116, 104, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,
+    41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105,
+    108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171,
+    171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   79,  83,  71,
+    78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,
+    86,  95,  68,  69,  80,  84,  72,  0,   171, 171, 171, 83,  72,  68,  82,  56,  0,   0,   0,
+    64,  0,   0,   0,   14,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,
+    0,   2,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   5,   1,   192,
+    0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,
+    84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h
index 53de495..9d8e9a7 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h
@@ -1,133 +1,133 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearFloat_FL9 /T ps_4_0_level_9_3 /Fh

-//    compiled\clearfloat11_fl9ps.h Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataFloat

-// {

-//

-//   float4 color_Float;                // Offset:    0 Size:    16

-//   float zValueF_Float;               // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-// SV_TARGET                1   xyzw        1   TARGET  float   xyzw

-// SV_TARGET                2   xyzw        2   TARGET  float   xyzw

-// SV_TARGET                3   xyzw        3   TARGET  float   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-//

-// Constant buffer to DX9 shader constant mappings:

-//

-// Target Reg Buffer  Start Reg # of Regs        Data Conversion

-// ---------- ------- --------- --------- ----------------------

-// c0         cb0             0         2  ( FLT, FLT, FLT, FLT)

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    mov oC0, c0

-    mov oC1, c0

-    mov oC2, c0

-    mov oC3, c0

-    mov oDepth, c1.x

-

-// approximately 5 instruction slots used

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_ClearFloat_FL9[] = {

-    68,  88,  66,  67,  104, 72,  248, 31,  140, 236, 7,   58,  247, 255, 77,  116, 217, 183, 170,

-    19,  1,   0,   0,   0,   228, 3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   180, 0,

-    0,   0,   132, 1,   0,   0,   0,   2,   0,   0,   20,  3,   0,   0,   72,  3,   0,   0,   65,

-    111, 110, 57,  116, 0,   0,   0,   116, 0,   0,   0,   0,   2,   255, 255, 68,  0,   0,   0,

-    48,  0,   0,   0,   1,   0,   36,  0,   0,   0,   48,  0,   0,   0,   48,  0,   0,   0,   36,

-    0,   0,   0,   48,  0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   1,   2,

-    255, 255, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 160, 1,   0,   0,   2,   1,

-    8,   15,  128, 0,   0,   228, 160, 1,   0,   0,   2,   2,   8,   15,  128, 0,   0,   228, 160,

-    1,   0,   0,   2,   3,   8,   15,  128, 0,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,

-    144, 1,   0,   0,   160, 255, 255, 0,   0,   83,  72,  68,  82,  200, 0,   0,   0,   64,  0,

-    0,   0,   50,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,

-    242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,

-    0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   2,   1,   192,

-    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,

-    70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,

-    0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,

-    0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,

-    1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,

-    68,  69,  70,  12,  1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,

-    28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,

-    101, 112, 116, 104, 68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,

-    2,   0,   0,   0,   108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   156, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,

-    0,   0,   0,   0,   0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,

-    0,   0,   0,   200, 0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108,

-    111, 97,  116, 0,   1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   122, 86,  97,  108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,

-    3,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111,

-    115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101,

-    114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,

-    46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,

-    0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,

-    73,  79,  78,  0,   79,  83,  71,  78,  148, 0,   0,   0,   5,   0,   0,   0,   8,   0,   0,

-    0,   128, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,

-    0,   0,   0,   1,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,

-    0,   0,   138, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255,

-    255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,

-    95,  68,  69,  80,  84,  72,  0,   171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearFloat_FL9 /T ps_4_0_level_9_3 /Fh
+//    compiled\clearfloat11_fl9ps.h Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataFloat
+// {
+//
+//   float4 color_Float;                // Offset:    0 Size:    16
+//   float zValueF_Float;               // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET  float   xyzw
+// SV_TARGET                2   xyzw        2   TARGET  float   xyzw
+// SV_TARGET                3   xyzw        3   TARGET  float   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+//
+// Constant buffer to DX9 shader constant mappings:
+//
+// Target Reg Buffer  Start Reg # of Regs        Data Conversion
+// ---------- ------- --------- --------- ----------------------
+// c0         cb0             0         2  ( FLT, FLT, FLT, FLT)
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    mov oC0, c0
+    mov oC1, c0
+    mov oC2, c0
+    mov oC3, c0
+    mov oDepth, c1.x
+
+// approximately 5 instruction slots used
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat_FL9[] = {
+    68,  88,  66,  67,  104, 72,  248, 31,  140, 236, 7,   58,  247, 255, 77,  116, 217, 183, 170,
+    19,  1,   0,   0,   0,   228, 3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   180, 0,
+    0,   0,   132, 1,   0,   0,   0,   2,   0,   0,   20,  3,   0,   0,   72,  3,   0,   0,   65,
+    111, 110, 57,  116, 0,   0,   0,   116, 0,   0,   0,   0,   2,   255, 255, 68,  0,   0,   0,
+    48,  0,   0,   0,   1,   0,   36,  0,   0,   0,   48,  0,   0,   0,   48,  0,   0,   0,   36,
+    0,   0,   0,   48,  0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   1,   2,
+    255, 255, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 160, 1,   0,   0,   2,   1,
+    8,   15,  128, 0,   0,   228, 160, 1,   0,   0,   2,   2,   8,   15,  128, 0,   0,   228, 160,
+    1,   0,   0,   2,   3,   8,   15,  128, 0,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,
+    144, 1,   0,   0,   160, 255, 255, 0,   0,   83,  72,  68,  82,  200, 0,   0,   0,   64,  0,
+    0,   0,   50,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,
+    242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,
+    0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   2,   1,   192,
+    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,
+    70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,
+    0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,
+    0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,
+    1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,
+    68,  69,  70,  12,  1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,
+    28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,
+    101, 112, 116, 104, 68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,
+    2,   0,   0,   0,   108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   156, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,
+    0,   0,   0,   0,   0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,
+    0,   0,   0,   200, 0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108,
+    111, 97,  116, 0,   1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   122, 86,  97,  108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,
+    3,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111,
+    115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101,
+    114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,
+    46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,
+    0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,
+    73,  79,  78,  0,   79,  83,  71,  78,  148, 0,   0,   0,   5,   0,   0,   0,   8,   0,   0,
+    0,   128, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,
+    0,   0,   0,   1,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,
+    0,   0,   138, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255,
+    255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,
+    95,  68,  69,  80,  84,  72,  0,   171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps1.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps1.h
index 591b59d..d486562 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps1.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps1.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearFloat1 /T ps_4_0 /Fh compiled\clearfloat11ps1.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataFloat

-// {

-//

-//   float4 color_Float;                // Offset:    0 Size:    16

-//   float zValueF_Float;               // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 3 instruction slots used

-#endif

-

-const BYTE g_PS_ClearFloat1[] = {

-    68,  88,  66,  67,  194, 191, 135, 22,  7,   101, 39,  154, 161, 7,   119, 129, 159, 77,  141,

-    64,  1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   208, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,

-    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  76,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   66,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255,

-    255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,

-    95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  92,  0,   0,   0,   64,  0,   0,

-    0,   23,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,

-    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   2,   1,

-    192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearFloat1 /T ps_4_0 /Fh compiled\clearfloat11ps1.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataFloat
+// {
+//
+//   float4 color_Float;                // Offset:    0 Size:    16
+//   float zValueF_Float;               // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 3 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat1[] = {
+    68,  88,  66,  67,  194, 191, 135, 22,  7,   101, 39,  154, 161, 7,   119, 129, 159, 77,  141,
+    64,  1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   208, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,
+    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  76,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   66,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255,
+    255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,
+    95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  92,  0,   0,   0,   64,  0,   0,
+    0,   23,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,
+    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   2,   1,
+    192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps2.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps2.h
index 52410db..d2fb37a 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps2.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps2.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearFloat2 /T ps_4_0 /Fh compiled\clearfloat11ps2.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataFloat

-// {

-//

-//   float4 color_Float;                // Offset:    0 Size:    16

-//   float zValueF_Float;               // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-// SV_TARGET                1   xyzw        1   TARGET  float   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_ClearFloat2[] = {

-    68,  88,  66,  67,  225, 157, 134, 36,  221, 175, 143, 13,  216, 233, 141, 160, 234, 199, 6,

-    135, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   232, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,

-    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  100, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   80,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   90,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,

-    69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  128, 0,

-    0,   0,   64,  0,   0,   0,   32,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,

-    0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,

-    101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,

-    0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,

-    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,

-    10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearFloat2 /T ps_4_0 /Fh compiled\clearfloat11ps2.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataFloat
+// {
+//
+//   float4 color_Float;                // Offset:    0 Size:    16
+//   float zValueF_Float;               // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET  float   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat2[] = {
+    68,  88,  66,  67,  225, 157, 134, 36,  221, 175, 143, 13,  216, 233, 141, 160, 234, 199, 6,
+    135, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   232, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,
+    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  100, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   80,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   90,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,
+    69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  128, 0,
+    0,   0,   64,  0,   0,   0,   32,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,
+    0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,
+    101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,
+    0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,
+    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,
+    10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps3.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps3.h
index 79b5cff..df64565 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps3.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps3.h
@@ -1,102 +1,102 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearFloat3 /T ps_4_0 /Fh compiled\clearfloat11ps3.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataFloat

-// {

-//

-//   float4 color_Float;                // Offset:    0 Size:    16

-//   float zValueF_Float;               // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-// SV_TARGET                1   xyzw        1   TARGET  float   xyzw

-// SV_TARGET                2   xyzw        2   TARGET  float   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_ClearFloat3[] = {

-    68,  88,  66,  67,  204, 19,  228, 34,  50,  163, 79,  235, 82,  71,  143, 124, 210, 54,  184,

-    205, 1,   0,   0,   0,   40,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   0,   2,   0,   0,   172, 2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,

-    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  124, 0,   0,   0,   4,   0,   0,   0,   8,   0,   0,   0,   104, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   104, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   104, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   114, 0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,

-    95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,

-    72,  68,  82,  164, 0,   0,   0,   64,  0,   0,   0,   41,  0,   0,   0,   89,  0,   0,   4,

-    70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,

-    0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,

-    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,

-    192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearFloat3 /T ps_4_0 /Fh compiled\clearfloat11ps3.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataFloat
+// {
+//
+//   float4 color_Float;                // Offset:    0 Size:    16
+//   float zValueF_Float;               // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET  float   xyzw
+// SV_TARGET                2   xyzw        2   TARGET  float   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat3[] = {
+    68,  88,  66,  67,  204, 19,  228, 34,  50,  163, 79,  235, 82,  71,  143, 124, 210, 54,  184,
+    205, 1,   0,   0,   0,   40,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   0,   2,   0,   0,   172, 2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,
+    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  124, 0,   0,   0,   4,   0,   0,   0,   8,   0,   0,   0,   104, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   104, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   104, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   114, 0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,
+    95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,
+    72,  68,  82,  164, 0,   0,   0,   64,  0,   0,   0,   41,  0,   0,   0,   89,  0,   0,   4,
+    70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,
+    0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,
+    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,
+    192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps4.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps4.h
index dd08fad..7917307 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps4.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps4.h
@@ -1,108 +1,108 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearFloat4 /T ps_4_0 /Fh compiled\clearfloat11ps4.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataFloat

-// {

-//

-//   float4 color_Float;                // Offset:    0 Size:    16

-//   float zValueF_Float;               // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-// SV_TARGET                1   xyzw        1   TARGET  float   xyzw

-// SV_TARGET                2   xyzw        2   TARGET  float   xyzw

-// SV_TARGET                3   xyzw        3   TARGET  float   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_ClearFloat4[] = {

-    68,  88,  66,  67,  118, 236, 166, 207, 85,  126, 49,  200, 223, 63,  28,  99,  129, 76,  44,

-    101, 1,   0,   0,   0,   100, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   24,  2,   0,   0,   232, 2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,

-    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  148, 0,   0,   0,   5,   0,   0,   0,   8,   0,   0,   0,   128, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   128, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   138, 0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,

-    14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,

-    84,  72,  0,   171, 83,  72,  68,  82,  200, 0,   0,   0,   64,  0,   0,   0,   50,  0,   0,

-    0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,

-    242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,

-    6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,

-    70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,

-    0,   3,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,

-    0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearFloat4 /T ps_4_0 /Fh compiled\clearfloat11ps4.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataFloat
+// {
+//
+//   float4 color_Float;                // Offset:    0 Size:    16
+//   float zValueF_Float;               // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET  float   xyzw
+// SV_TARGET                2   xyzw        2   TARGET  float   xyzw
+// SV_TARGET                3   xyzw        3   TARGET  float   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat4[] = {
+    68,  88,  66,  67,  118, 236, 166, 207, 85,  126, 49,  200, 223, 63,  28,  99,  129, 76,  44,
+    101, 1,   0,   0,   0,   100, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   24,  2,   0,   0,   232, 2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,
+    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  148, 0,   0,   0,   5,   0,   0,   0,   8,   0,   0,   0,   128, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   128, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   138, 0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,
+    14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,
+    84,  72,  0,   171, 83,  72,  68,  82,  200, 0,   0,   0,   64,  0,   0,   0,   50,  0,   0,
+    0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,
+    242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,
+    6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,
+    70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,
+    0,   3,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,
+    0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps5.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps5.h
index 3b80a50..b9c7027 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps5.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps5.h
@@ -1,114 +1,114 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearFloat5 /T ps_4_0 /Fh compiled\clearfloat11ps5.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataFloat

-// {

-//

-//   float4 color_Float;                // Offset:    0 Size:    16

-//   float zValueF_Float;               // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-// SV_TARGET                1   xyzw        1   TARGET  float   xyzw

-// SV_TARGET                2   xyzw        2   TARGET  float   xyzw

-// SV_TARGET                3   xyzw        3   TARGET  float   xyzw

-// SV_TARGET                4   xyzw        4   TARGET  float   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_ClearFloat5[] = {

-    68,  88,  66,  67,  123, 52,  161, 168, 70,  129, 246, 30,  10,  53,  190, 145, 187, 163, 141,

-    41,  1,   0,   0,   0,   160, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   48,  2,   0,   0,   36,  3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,

-    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  172, 0,   0,   0,   6,   0,   0,   0,   8,   0,   0,   0,   152, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   152, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   152, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   162, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,

-    86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  236, 0,   0,   0,   64,  0,

-    0,   0,   59,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,

-    242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,

-    0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   4,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242,

-    32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,

-    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,

-    242, 32,  16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,

-    0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearFloat5 /T ps_4_0 /Fh compiled\clearfloat11ps5.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataFloat
+// {
+//
+//   float4 color_Float;                // Offset:    0 Size:    16
+//   float zValueF_Float;               // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET  float   xyzw
+// SV_TARGET                2   xyzw        2   TARGET  float   xyzw
+// SV_TARGET                3   xyzw        3   TARGET  float   xyzw
+// SV_TARGET                4   xyzw        4   TARGET  float   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat5[] = {
+    68,  88,  66,  67,  123, 52,  161, 168, 70,  129, 246, 30,  10,  53,  190, 145, 187, 163, 141,
+    41,  1,   0,   0,   0,   160, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   48,  2,   0,   0,   36,  3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,
+    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  172, 0,   0,   0,   6,   0,   0,   0,   8,   0,   0,   0,   152, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   152, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   152, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   162, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,
+    86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  236, 0,   0,   0,   64,  0,
+    0,   0,   59,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,
+    242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,
+    0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   4,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242,
+    32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,
+    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,
+    242, 32,  16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,
+    0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps6.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps6.h
index 5a4830c..6a0d5ad 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps6.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps6.h
@@ -1,120 +1,120 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearFloat6 /T ps_4_0 /Fh compiled\clearfloat11ps6.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataFloat

-// {

-//

-//   float4 color_Float;                // Offset:    0 Size:    16

-//   float zValueF_Float;               // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-// SV_TARGET                1   xyzw        1   TARGET  float   xyzw

-// SV_TARGET                2   xyzw        2   TARGET  float   xyzw

-// SV_TARGET                3   xyzw        3   TARGET  float   xyzw

-// SV_TARGET                4   xyzw        4   TARGET  float   xyzw

-// SV_TARGET                5   xyzw        5   TARGET  float   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output o5.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov o5.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_ClearFloat6[] = {

-    68,  88,  66,  67,  9,   231, 198, 152, 73,  204, 169, 213, 251, 221, 21,  165, 112, 13,  206,

-    187, 1,   0,   0,   0,   220, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   72,  2,   0,   0,   96,  3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,

-    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  196, 0,   0,   0,   7,   0,   0,   0,   8,   0,   0,   0,   176, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   176, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   176, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   176, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    5,   0,   0,   0,   15,  0,   0,   0,   186, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,

-    71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  16,

-    1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,

-    0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101,

-    0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    5,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,

-    0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,

-    0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,

-    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,

-    16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,

-    0,   0,   6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,

-    0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearFloat6 /T ps_4_0 /Fh compiled\clearfloat11ps6.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataFloat
+// {
+//
+//   float4 color_Float;                // Offset:    0 Size:    16
+//   float zValueF_Float;               // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET  float   xyzw
+// SV_TARGET                2   xyzw        2   TARGET  float   xyzw
+// SV_TARGET                3   xyzw        3   TARGET  float   xyzw
+// SV_TARGET                4   xyzw        4   TARGET  float   xyzw
+// SV_TARGET                5   xyzw        5   TARGET  float   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov o5.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat6[] = {
+    68,  88,  66,  67,  9,   231, 198, 152, 73,  204, 169, 213, 251, 221, 21,  165, 112, 13,  206,
+    187, 1,   0,   0,   0,   220, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   72,  2,   0,   0,   96,  3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,
+    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  196, 0,   0,   0,   7,   0,   0,   0,   8,   0,   0,   0,   176, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   176, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   176, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   176, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    5,   0,   0,   0,   15,  0,   0,   0,   186, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,
+    71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  16,
+    1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,
+    0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101,
+    0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    5,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,
+    0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,
+    0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,
+    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,
+    16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,
+    0,   0,   6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,
+    0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps7.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps7.h
index 2c10a6a..fd2f572 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps7.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps7.h
@@ -1,127 +1,127 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearFloat7 /T ps_4_0 /Fh compiled\clearfloat11ps7.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataFloat

-// {

-//

-//   float4 color_Float;                // Offset:    0 Size:    16

-//   float zValueF_Float;               // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-// SV_TARGET                1   xyzw        1   TARGET  float   xyzw

-// SV_TARGET                2   xyzw        2   TARGET  float   xyzw

-// SV_TARGET                3   xyzw        3   TARGET  float   xyzw

-// SV_TARGET                4   xyzw        4   TARGET  float   xyzw

-// SV_TARGET                5   xyzw        5   TARGET  float   xyzw

-// SV_TARGET                6   xyzw        6   TARGET  float   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output o5.xyzw

-dcl_output o6.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov o5.xyzw, cb0[0].xyzw

-mov o6.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_ClearFloat7[] = {

-    68,  88,  66,  67,  170, 173, 131, 172, 155, 25,  100, 152, 127, 184, 193, 251, 147, 13,  61,

-    159, 1,   0,   0,   0,   24,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   96,  2,   0,   0,   156, 3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,

-    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  220, 0,   0,   0,   8,   0,   0,   0,   8,   0,   0,   0,   200, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   200, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   200, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   200, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    5,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   210, 0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,

-    86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171,

-    83,  72,  68,  82,  52,  1,   0,   0,   64,  0,   0,   0,   77,  0,   0,   0,   89,  0,   0,

-    4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101,

-    0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,

-    3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   6,   0,

-    0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,

-    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,

-    242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,

-    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,

-    4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,

-    6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,

-    0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearFloat7 /T ps_4_0 /Fh compiled\clearfloat11ps7.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataFloat
+// {
+//
+//   float4 color_Float;                // Offset:    0 Size:    16
+//   float zValueF_Float;               // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET  float   xyzw
+// SV_TARGET                2   xyzw        2   TARGET  float   xyzw
+// SV_TARGET                3   xyzw        3   TARGET  float   xyzw
+// SV_TARGET                4   xyzw        4   TARGET  float   xyzw
+// SV_TARGET                5   xyzw        5   TARGET  float   xyzw
+// SV_TARGET                6   xyzw        6   TARGET  float   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output o6.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov o5.xyzw, cb0[0].xyzw
+mov o6.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat7[] = {
+    68,  88,  66,  67,  170, 173, 131, 172, 155, 25,  100, 152, 127, 184, 193, 251, 147, 13,  61,
+    159, 1,   0,   0,   0,   24,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   96,  2,   0,   0,   156, 3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,
+    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  220, 0,   0,   0,   8,   0,   0,   0,   8,   0,   0,   0,   200, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   200, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   200, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   200, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    5,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   210, 0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,
+    86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171,
+    83,  72,  68,  82,  52,  1,   0,   0,   64,  0,   0,   0,   77,  0,   0,   0,   89,  0,   0,
+    4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101,
+    0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,
+    3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   6,   0,
+    0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,
+    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,
+    242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,
+    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,
+    4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,
+    6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,
+    0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps8.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps8.h
index e5dc70c..dbc9073 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps8.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps8.h
@@ -1,133 +1,133 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearFloat8 /T ps_4_0 /Fh compiled\clearfloat11ps8.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataFloat

-// {

-//

-//   float4 color_Float;                // Offset:    0 Size:    16

-//   float zValueF_Float;               // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-// SV_TARGET                1   xyzw        1   TARGET  float   xyzw

-// SV_TARGET                2   xyzw        2   TARGET  float   xyzw

-// SV_TARGET                3   xyzw        3   TARGET  float   xyzw

-// SV_TARGET                4   xyzw        4   TARGET  float   xyzw

-// SV_TARGET                5   xyzw        5   TARGET  float   xyzw

-// SV_TARGET                6   xyzw        6   TARGET  float   xyzw

-// SV_TARGET                7   xyzw        7   TARGET  float   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output o5.xyzw

-dcl_output o6.xyzw

-dcl_output o7.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov o5.xyzw, cb0[0].xyzw

-mov o6.xyzw, cb0[0].xyzw

-mov o7.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_ClearFloat8[] = {

-    68,  88,  66,  67,  182, 101, 16,  155, 29,  152, 163, 52,  194, 25,  110, 209, 100, 8,   227,

-    42,  1,   0,   0,   0,   84,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   120, 2,   0,   0,   216, 3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,

-    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  244, 0,   0,   0,   9,   0,   0,   0,   8,   0,   0,   0,   224, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   224, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   224, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   224, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    5,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   7,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   7,   0,   0,   0,   15,  0,   0,   0,   234,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255,

-    1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,

-    80,  84,  72,  0,   171, 83,  72,  68,  82,  88,  1,   0,   0,   64,  0,   0,   0,   86,  0,

-    0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101,

-    0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,

-    3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,

-    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242,

-    32,  16,  0,   6,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   7,   0,   0,   0,

-    101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,

-    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,

-    16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,

-    0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,  142, 32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   4,   0,

-    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242,

-    32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   7,   0,   0,   0,   70,  142,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,

-    128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,   0,   0,   10,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearFloat8 /T ps_4_0 /Fh compiled\clearfloat11ps8.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataFloat
+// {
+//
+//   float4 color_Float;                // Offset:    0 Size:    16
+//   float zValueF_Float;               // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataFloat            cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET  float   xyzw
+// SV_TARGET                2   xyzw        2   TARGET  float   xyzw
+// SV_TARGET                3   xyzw        3   TARGET  float   xyzw
+// SV_TARGET                4   xyzw        4   TARGET  float   xyzw
+// SV_TARGET                5   xyzw        5   TARGET  float   xyzw
+// SV_TARGET                6   xyzw        6   TARGET  float   xyzw
+// SV_TARGET                7   xyzw        7   TARGET  float   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output o6.xyzw
+dcl_output o7.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov o5.xyzw, cb0[0].xyzw
+mov o6.xyzw, cb0[0].xyzw
+mov o7.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat8[] = {
+    68,  88,  66,  67,  182, 101, 16,  155, 29,  152, 163, 52,  194, 25,  110, 209, 100, 8,   227,
+    42,  1,   0,   0,   0,   84,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   120, 2,   0,   0,   216, 3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  70,  108, 111, 97,  116, 0,   171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  70,  108, 111, 97,  116, 0,
+    1,   0,   3,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  70,  108, 111, 97,  116, 0,   171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  244, 0,   0,   0,   9,   0,   0,   0,   8,   0,   0,   0,   224, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   224, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   224, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   224, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    5,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   7,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   7,   0,   0,   0,   15,  0,   0,   0,   234,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255,
+    1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,
+    80,  84,  72,  0,   171, 83,  72,  68,  82,  88,  1,   0,   0,   64,  0,   0,   0,   86,  0,
+    0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101,
+    0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,
+    3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,
+    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242,
+    32,  16,  0,   6,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   7,   0,   0,   0,
+    101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,
+    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,
+    16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,
+    0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,  142, 32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   4,   0,
+    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242,
+    32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   7,   0,   0,   0,   70,  142,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,
+    128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,   0,   0,   10,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps1.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps1.h
index fba316f..369f91b 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps1.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps1.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearSint1 /T ps_4_0 /Fh compiled\clearsint11ps1.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataSint

-// {

-//

-//   int4 color_Sint;                   // Offset:    0 Size:    16

-//   float zValueF_Sint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataSint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 3 instruction slots used

-#endif

-

-const BYTE g_PS_ClearSint1[] = {

-    68,  88,  66,  67,  88,  163, 189, 91,  71,  60,  117, 226, 154, 216, 135, 21,  77,  90,  76,

-    124, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   208, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,

-    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  76,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   66,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255,

-    255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,

-    95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  92,  0,   0,   0,   64,  0,   0,

-    0,   23,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,

-    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   2,   1,

-    192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearSint1 /T ps_4_0 /Fh compiled\clearsint11ps1.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataSint
+// {
+//
+//   int4 color_Sint;                   // Offset:    0 Size:    16
+//   float zValueF_Sint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataSint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 3 instruction slots used
+#endif
+
+const BYTE g_PS_ClearSint1[] = {
+    68,  88,  66,  67,  88,  163, 189, 91,  71,  60,  117, 226, 154, 216, 135, 21,  77,  90,  76,
+    124, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   208, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,
+    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  76,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   66,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255,
+    255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,
+    95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  92,  0,   0,   0,   64,  0,   0,
+    0,   23,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,
+    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   2,   1,
+    192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps2.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps2.h
index ef51659..cbf612d 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps2.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps2.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearSint2 /T ps_4_0 /Fh compiled\clearsint11ps2.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataSint

-// {

-//

-//   int4 color_Sint;                   // Offset:    0 Size:    16

-//   float zValueF_Sint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataSint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-// SV_TARGET                1   xyzw        1   TARGET    int   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_ClearSint2[] = {

-    68,  88,  66,  67,  78,  174, 75,  16,  146, 221, 109, 222, 248, 135, 83,  225, 132, 36,  188,

-    212, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   232, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,

-    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  100, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   80,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   90,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,

-    69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  128, 0,

-    0,   0,   64,  0,   0,   0,   32,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,

-    0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,

-    101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,

-    0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,

-    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,

-    10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearSint2 /T ps_4_0 /Fh compiled\clearsint11ps2.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataSint
+// {
+//
+//   int4 color_Sint;                   // Offset:    0 Size:    16
+//   float zValueF_Sint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataSint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+// SV_TARGET                1   xyzw        1   TARGET    int   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_ClearSint2[] = {
+    68,  88,  66,  67,  78,  174, 75,  16,  146, 221, 109, 222, 248, 135, 83,  225, 132, 36,  188,
+    212, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   232, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,
+    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  100, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   80,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   90,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,
+    69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  128, 0,
+    0,   0,   64,  0,   0,   0,   32,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,
+    0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,
+    101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,
+    0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,
+    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,
+    10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps3.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps3.h
index 2329b45..4df53c3 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps3.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps3.h
@@ -1,102 +1,102 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearSint3 /T ps_4_0 /Fh compiled\clearsint11ps3.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataSint

-// {

-//

-//   int4 color_Sint;                   // Offset:    0 Size:    16

-//   float zValueF_Sint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataSint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-// SV_TARGET                1   xyzw        1   TARGET    int   xyzw

-// SV_TARGET                2   xyzw        2   TARGET    int   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_ClearSint3[] = {

-    68,  88,  66,  67,  211, 173, 24,  113, 222, 43,  56,  242, 158, 91,  245, 255, 64,  66,  11,

-    177, 1,   0,   0,   0,   40,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   0,   2,   0,   0,   172, 2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,

-    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  124, 0,   0,   0,   4,   0,   0,   0,   8,   0,   0,   0,   104, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   104, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   104, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   114, 0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,

-    95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,

-    72,  68,  82,  164, 0,   0,   0,   64,  0,   0,   0,   41,  0,   0,   0,   89,  0,   0,   4,

-    70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,

-    0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,

-    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,

-    192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearSint3 /T ps_4_0 /Fh compiled\clearsint11ps3.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataSint
+// {
+//
+//   int4 color_Sint;                   // Offset:    0 Size:    16
+//   float zValueF_Sint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataSint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+// SV_TARGET                1   xyzw        1   TARGET    int   xyzw
+// SV_TARGET                2   xyzw        2   TARGET    int   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_ClearSint3[] = {
+    68,  88,  66,  67,  211, 173, 24,  113, 222, 43,  56,  242, 158, 91,  245, 255, 64,  66,  11,
+    177, 1,   0,   0,   0,   40,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   0,   2,   0,   0,   172, 2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,
+    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  124, 0,   0,   0,   4,   0,   0,   0,   8,   0,   0,   0,   104, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   104, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   104, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   114, 0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,
+    95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,
+    72,  68,  82,  164, 0,   0,   0,   64,  0,   0,   0,   41,  0,   0,   0,   89,  0,   0,   4,
+    70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,
+    0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,
+    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,
+    192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps4.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps4.h
index 703d262..45527cb 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps4.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps4.h
@@ -1,108 +1,108 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearSint4 /T ps_4_0 /Fh compiled\clearsint11ps4.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataSint

-// {

-//

-//   int4 color_Sint;                   // Offset:    0 Size:    16

-//   float zValueF_Sint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataSint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-// SV_TARGET                1   xyzw        1   TARGET    int   xyzw

-// SV_TARGET                2   xyzw        2   TARGET    int   xyzw

-// SV_TARGET                3   xyzw        3   TARGET    int   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_ClearSint4[] = {

-    68,  88,  66,  67,  38,  96,  29,  166, 205, 218, 64,  123, 117, 198, 133, 227, 83,  243, 198,

-    238, 1,   0,   0,   0,   100, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   24,  2,   0,   0,   232, 2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,

-    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  148, 0,   0,   0,   5,   0,   0,   0,   8,   0,   0,   0,   128, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   128, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   138, 0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,

-    14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,

-    84,  72,  0,   171, 83,  72,  68,  82,  200, 0,   0,   0,   64,  0,   0,   0,   50,  0,   0,

-    0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,

-    242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,

-    6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,

-    70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,

-    0,   3,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,

-    0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearSint4 /T ps_4_0 /Fh compiled\clearsint11ps4.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataSint
+// {
+//
+//   int4 color_Sint;                   // Offset:    0 Size:    16
+//   float zValueF_Sint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataSint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+// SV_TARGET                1   xyzw        1   TARGET    int   xyzw
+// SV_TARGET                2   xyzw        2   TARGET    int   xyzw
+// SV_TARGET                3   xyzw        3   TARGET    int   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_ClearSint4[] = {
+    68,  88,  66,  67,  38,  96,  29,  166, 205, 218, 64,  123, 117, 198, 133, 227, 83,  243, 198,
+    238, 1,   0,   0,   0,   100, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   24,  2,   0,   0,   232, 2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,
+    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  148, 0,   0,   0,   5,   0,   0,   0,   8,   0,   0,   0,   128, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   128, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   138, 0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,
+    14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,
+    84,  72,  0,   171, 83,  72,  68,  82,  200, 0,   0,   0,   64,  0,   0,   0,   50,  0,   0,
+    0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,
+    242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,
+    6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,
+    70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,
+    0,   3,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,
+    0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps5.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps5.h
index d55aed2..76cbc11 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps5.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps5.h
@@ -1,114 +1,114 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearSint5 /T ps_4_0 /Fh compiled\clearsint11ps5.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataSint

-// {

-//

-//   int4 color_Sint;                   // Offset:    0 Size:    16

-//   float zValueF_Sint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataSint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-// SV_TARGET                1   xyzw        1   TARGET    int   xyzw

-// SV_TARGET                2   xyzw        2   TARGET    int   xyzw

-// SV_TARGET                3   xyzw        3   TARGET    int   xyzw

-// SV_TARGET                4   xyzw        4   TARGET    int   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_ClearSint5[] = {

-    68,  88,  66,  67,  24,  79,  49,  33,  135, 214, 214, 87,  139, 54,  205, 88,  244, 235, 83,

-    59,  1,   0,   0,   0,   160, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   48,  2,   0,   0,   36,  3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,

-    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  172, 0,   0,   0,   6,   0,   0,   0,   8,   0,   0,   0,   152, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   152, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   152, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   162, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,

-    86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  236, 0,   0,   0,   64,  0,

-    0,   0,   59,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,

-    242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,

-    0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   4,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242,

-    32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,

-    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,

-    242, 32,  16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,

-    0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearSint5 /T ps_4_0 /Fh compiled\clearsint11ps5.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataSint
+// {
+//
+//   int4 color_Sint;                   // Offset:    0 Size:    16
+//   float zValueF_Sint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataSint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+// SV_TARGET                1   xyzw        1   TARGET    int   xyzw
+// SV_TARGET                2   xyzw        2   TARGET    int   xyzw
+// SV_TARGET                3   xyzw        3   TARGET    int   xyzw
+// SV_TARGET                4   xyzw        4   TARGET    int   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_ClearSint5[] = {
+    68,  88,  66,  67,  24,  79,  49,  33,  135, 214, 214, 87,  139, 54,  205, 88,  244, 235, 83,
+    59,  1,   0,   0,   0,   160, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   48,  2,   0,   0,   36,  3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,
+    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  172, 0,   0,   0,   6,   0,   0,   0,   8,   0,   0,   0,   152, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   152, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   152, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   162, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,
+    86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  236, 0,   0,   0,   64,  0,
+    0,   0,   59,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,
+    242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,
+    0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   4,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242,
+    32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,
+    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,
+    242, 32,  16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,
+    0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps6.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps6.h
index 89a76f3..4ea96b3 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps6.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps6.h
@@ -1,120 +1,120 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearSint6 /T ps_4_0 /Fh compiled\clearsint11ps6.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataSint

-// {

-//

-//   int4 color_Sint;                   // Offset:    0 Size:    16

-//   float zValueF_Sint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataSint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-// SV_TARGET                1   xyzw        1   TARGET    int   xyzw

-// SV_TARGET                2   xyzw        2   TARGET    int   xyzw

-// SV_TARGET                3   xyzw        3   TARGET    int   xyzw

-// SV_TARGET                4   xyzw        4   TARGET    int   xyzw

-// SV_TARGET                5   xyzw        5   TARGET    int   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output o5.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov o5.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_ClearSint6[] = {

-    68,  88,  66,  67,  222, 117, 7,   238, 217, 163, 47,  39,  162, 0,   176, 159, 4,   111, 83,

-    238, 1,   0,   0,   0,   220, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   72,  2,   0,   0,   96,  3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,

-    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  196, 0,   0,   0,   7,   0,   0,   0,   8,   0,   0,   0,   176, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   176, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   176, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   176, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,

-    5,   0,   0,   0,   15,  0,   0,   0,   186, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,

-    71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  16,

-    1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,

-    0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101,

-    0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    5,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,

-    0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,

-    0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,

-    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,

-    16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,

-    0,   0,   6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,

-    0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearSint6 /T ps_4_0 /Fh compiled\clearsint11ps6.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataSint
+// {
+//
+//   int4 color_Sint;                   // Offset:    0 Size:    16
+//   float zValueF_Sint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataSint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+// SV_TARGET                1   xyzw        1   TARGET    int   xyzw
+// SV_TARGET                2   xyzw        2   TARGET    int   xyzw
+// SV_TARGET                3   xyzw        3   TARGET    int   xyzw
+// SV_TARGET                4   xyzw        4   TARGET    int   xyzw
+// SV_TARGET                5   xyzw        5   TARGET    int   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov o5.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_ClearSint6[] = {
+    68,  88,  66,  67,  222, 117, 7,   238, 217, 163, 47,  39,  162, 0,   176, 159, 4,   111, 83,
+    238, 1,   0,   0,   0,   220, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   72,  2,   0,   0,   96,  3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,
+    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  196, 0,   0,   0,   7,   0,   0,   0,   8,   0,   0,   0,   176, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   176, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   176, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   176, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,
+    5,   0,   0,   0,   15,  0,   0,   0,   186, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,
+    71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  16,
+    1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,
+    0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101,
+    0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    5,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,
+    0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,
+    0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,
+    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,
+    16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,
+    0,   0,   6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,
+    0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps7.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps7.h
index ca8e0cb..b48dc1e 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps7.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps7.h
@@ -1,127 +1,127 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearSint7 /T ps_4_0 /Fh compiled\clearsint11ps7.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataSint

-// {

-//

-//   int4 color_Sint;                   // Offset:    0 Size:    16

-//   float zValueF_Sint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataSint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-// SV_TARGET                1   xyzw        1   TARGET    int   xyzw

-// SV_TARGET                2   xyzw        2   TARGET    int   xyzw

-// SV_TARGET                3   xyzw        3   TARGET    int   xyzw

-// SV_TARGET                4   xyzw        4   TARGET    int   xyzw

-// SV_TARGET                5   xyzw        5   TARGET    int   xyzw

-// SV_TARGET                6   xyzw        6   TARGET    int   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output o5.xyzw

-dcl_output o6.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov o5.xyzw, cb0[0].xyzw

-mov o6.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_ClearSint7[] = {

-    68,  88,  66,  67,  47,  152, 142, 138, 182, 8,   198, 91,  234, 199, 6,   111, 183, 141, 38,

-    79,  1,   0,   0,   0,   24,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   96,  2,   0,   0,   156, 3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,

-    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  220, 0,   0,   0,   8,   0,   0,   0,   8,   0,   0,   0,   200, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   200, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   200, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   200, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,

-    5,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,

-    0,   2,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   210, 0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,

-    86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171,

-    83,  72,  68,  82,  52,  1,   0,   0,   64,  0,   0,   0,   77,  0,   0,   0,   89,  0,   0,

-    4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101,

-    0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,

-    3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   6,   0,

-    0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,

-    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,

-    242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,

-    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,

-    4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,

-    6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,

-    0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearSint7 /T ps_4_0 /Fh compiled\clearsint11ps7.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataSint
+// {
+//
+//   int4 color_Sint;                   // Offset:    0 Size:    16
+//   float zValueF_Sint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataSint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+// SV_TARGET                1   xyzw        1   TARGET    int   xyzw
+// SV_TARGET                2   xyzw        2   TARGET    int   xyzw
+// SV_TARGET                3   xyzw        3   TARGET    int   xyzw
+// SV_TARGET                4   xyzw        4   TARGET    int   xyzw
+// SV_TARGET                5   xyzw        5   TARGET    int   xyzw
+// SV_TARGET                6   xyzw        6   TARGET    int   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output o6.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov o5.xyzw, cb0[0].xyzw
+mov o6.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_ClearSint7[] = {
+    68,  88,  66,  67,  47,  152, 142, 138, 182, 8,   198, 91,  234, 199, 6,   111, 183, 141, 38,
+    79,  1,   0,   0,   0,   24,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   96,  2,   0,   0,   156, 3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,
+    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  220, 0,   0,   0,   8,   0,   0,   0,   8,   0,   0,   0,   200, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   200, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   200, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   200, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,
+    5,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,
+    0,   2,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   210, 0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,
+    86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171,
+    83,  72,  68,  82,  52,  1,   0,   0,   64,  0,   0,   0,   77,  0,   0,   0,   89,  0,   0,
+    4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101,
+    0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,
+    3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   6,   0,
+    0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,
+    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,
+    242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,
+    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,
+    4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,
+    6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,
+    0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps8.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps8.h
index bbf5642..1d07938 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps8.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps8.h
@@ -1,133 +1,133 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearSint8 /T ps_4_0 /Fh compiled\clearsint11ps8.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataSint

-// {

-//

-//   int4 color_Sint;                   // Offset:    0 Size:    16

-//   float zValueF_Sint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataSint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-// SV_TARGET                1   xyzw        1   TARGET    int   xyzw

-// SV_TARGET                2   xyzw        2   TARGET    int   xyzw

-// SV_TARGET                3   xyzw        3   TARGET    int   xyzw

-// SV_TARGET                4   xyzw        4   TARGET    int   xyzw

-// SV_TARGET                5   xyzw        5   TARGET    int   xyzw

-// SV_TARGET                6   xyzw        6   TARGET    int   xyzw

-// SV_TARGET                7   xyzw        7   TARGET    int   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output o5.xyzw

-dcl_output o6.xyzw

-dcl_output o7.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov o5.xyzw, cb0[0].xyzw

-mov o6.xyzw, cb0[0].xyzw

-mov o7.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_ClearSint8[] = {

-    68,  88,  66,  67,  224, 106, 130, 91,  4,   244, 99,  23,  240, 126, 19,  252, 49,  217, 220,

-    228, 1,   0,   0,   0,   84,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   120, 2,   0,   0,   216, 3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,

-    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  244, 0,   0,   0,   9,   0,   0,   0,   8,   0,   0,   0,   224, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   224, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   224, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   224, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,

-    5,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,

-    0,   2,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   7,   0,

-    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   7,   0,   0,   0,   15,  0,   0,   0,   234,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255,

-    1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,

-    80,  84,  72,  0,   171, 83,  72,  68,  82,  88,  1,   0,   0,   64,  0,   0,   0,   86,  0,

-    0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101,

-    0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,

-    3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,

-    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242,

-    32,  16,  0,   6,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   7,   0,   0,   0,

-    101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,

-    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,

-    16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,

-    0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,  142, 32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   4,   0,

-    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242,

-    32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   7,   0,   0,   0,   70,  142,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,

-    128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,   0,   0,   10,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearSint8 /T ps_4_0 /Fh compiled\clearsint11ps8.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataSint
+// {
+//
+//   int4 color_Sint;                   // Offset:    0 Size:    16
+//   float zValueF_Sint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataSint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+// SV_TARGET                1   xyzw        1   TARGET    int   xyzw
+// SV_TARGET                2   xyzw        2   TARGET    int   xyzw
+// SV_TARGET                3   xyzw        3   TARGET    int   xyzw
+// SV_TARGET                4   xyzw        4   TARGET    int   xyzw
+// SV_TARGET                5   xyzw        5   TARGET    int   xyzw
+// SV_TARGET                6   xyzw        6   TARGET    int   xyzw
+// SV_TARGET                7   xyzw        7   TARGET    int   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output o6.xyzw
+dcl_output o7.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov o5.xyzw, cb0[0].xyzw
+mov o6.xyzw, cb0[0].xyzw
+mov o7.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_ClearSint8[] = {
+    68,  88,  66,  67,  224, 106, 130, 91,  4,   244, 99,  23,  240, 126, 19,  252, 49,  217, 220,
+    228, 1,   0,   0,   0,   84,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   120, 2,   0,   0,   216, 3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  83,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  83,  105, 110, 116, 0,   171,
+    1,   0,   2,   0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  83,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  244, 0,   0,   0,   9,   0,   0,   0,   8,   0,   0,   0,   224, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   224, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   224, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   224, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,
+    5,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,
+    0,   2,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   7,   0,
+    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   7,   0,   0,   0,   15,  0,   0,   0,   234,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255,
+    1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,
+    80,  84,  72,  0,   171, 83,  72,  68,  82,  88,  1,   0,   0,   64,  0,   0,   0,   86,  0,
+    0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101,
+    0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,
+    3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,
+    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242,
+    32,  16,  0,   6,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   7,   0,   0,   0,
+    101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,
+    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,
+    16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,
+    0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,  142, 32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   4,   0,
+    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242,
+    32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   7,   0,   0,   0,   70,  142,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,
+    128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,   0,   0,   10,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps1.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps1.h
index a869653..a2ad6bc 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps1.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps1.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearUint1 /T ps_4_0 /Fh compiled\clearuint11ps1.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataUint

-// {

-//

-//   uint4 color_Uint;                  // Offset:    0 Size:    16

-//   float zValueF_Uint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataUint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 3 instruction slots used

-#endif

-

-const BYTE g_PS_ClearUint1[] = {

-    68,  88,  66,  67,  220, 175, 96,  75,  216, 185, 134, 21,  58,  117, 130, 41,  133, 106, 117,

-    72,  1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   208, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,

-    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  76,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   66,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255,

-    255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,

-    95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  92,  0,   0,   0,   64,  0,   0,

-    0,   23,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,

-    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   2,   1,

-    192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearUint1 /T ps_4_0 /Fh compiled\clearuint11ps1.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataUint
+// {
+//
+//   uint4 color_Uint;                  // Offset:    0 Size:    16
+//   float zValueF_Uint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataUint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 3 instruction slots used
+#endif
+
+const BYTE g_PS_ClearUint1[] = {
+    68,  88,  66,  67,  220, 175, 96,  75,  216, 185, 134, 21,  58,  117, 130, 41,  133, 106, 117,
+    72,  1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   208, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,
+    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  76,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   66,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255,
+    255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,
+    95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  92,  0,   0,   0,   64,  0,   0,
+    0,   23,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,
+    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   2,   1,
+    192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps2.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps2.h
index 59c6270..c465545 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps2.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps2.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearUint2 /T ps_4_0 /Fh compiled\clearuint11ps2.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataUint

-// {

-//

-//   uint4 color_Uint;                  // Offset:    0 Size:    16

-//   float zValueF_Uint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataUint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_ClearUint2[] = {

-    68,  88,  66,  67,  42,  133, 132, 52,  23,  242, 4,   181, 33,  9,   143, 17,  179, 83,  209,

-    213, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   232, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,

-    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  100, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   80,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   90,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,

-    69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  128, 0,

-    0,   0,   64,  0,   0,   0,   32,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,

-    0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,

-    101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,

-    0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,

-    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,

-    10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearUint2 /T ps_4_0 /Fh compiled\clearuint11ps2.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataUint
+// {
+//
+//   uint4 color_Uint;                  // Offset:    0 Size:    16
+//   float zValueF_Uint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataUint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_ClearUint2[] = {
+    68,  88,  66,  67,  42,  133, 132, 52,  23,  242, 4,   181, 33,  9,   143, 17,  179, 83,  209,
+    213, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   232, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,
+    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  100, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   80,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   90,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,
+    69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  128, 0,
+    0,   0,   64,  0,   0,   0,   32,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,
+    0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,
+    101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,
+    0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,
+    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,
+    10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps3.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps3.h
index d3da033..e83c792 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps3.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps3.h
@@ -1,102 +1,102 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearUint3 /T ps_4_0 /Fh compiled\clearuint11ps3.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataUint

-// {

-//

-//   uint4 color_Uint;                  // Offset:    0 Size:    16

-//   float zValueF_Uint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataUint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw

-// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_ClearUint3[] = {

-    68,  88,  66,  67,  53,  56,  177, 56,  90,  50,  25,  21,  43,  95,  252, 133, 162, 6,   79,

-    246, 1,   0,   0,   0,   40,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   0,   2,   0,   0,   172, 2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,

-    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  124, 0,   0,   0,   4,   0,   0,   0,   8,   0,   0,   0,   104, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   104, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   104, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   114, 0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,

-    95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,

-    72,  68,  82,  164, 0,   0,   0,   64,  0,   0,   0,   41,  0,   0,   0,   89,  0,   0,   4,

-    70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,

-    0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,

-    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,

-    192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearUint3 /T ps_4_0 /Fh compiled\clearuint11ps3.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataUint
+// {
+//
+//   uint4 color_Uint;                  // Offset:    0 Size:    16
+//   float zValueF_Uint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataUint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw
+// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_ClearUint3[] = {
+    68,  88,  66,  67,  53,  56,  177, 56,  90,  50,  25,  21,  43,  95,  252, 133, 162, 6,   79,
+    246, 1,   0,   0,   0,   40,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   0,   2,   0,   0,   172, 2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,
+    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  124, 0,   0,   0,   4,   0,   0,   0,   8,   0,   0,   0,   104, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   104, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   104, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   114, 0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,
+    95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,
+    72,  68,  82,  164, 0,   0,   0,   64,  0,   0,   0,   41,  0,   0,   0,   89,  0,   0,   4,
+    70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,
+    0,   0,   6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,
+    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,
+    192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps4.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps4.h
index c36348e..756ce6a 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps4.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps4.h
@@ -1,108 +1,108 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearUint4 /T ps_4_0 /Fh compiled\clearuint11ps4.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataUint

-// {

-//

-//   uint4 color_Uint;                  // Offset:    0 Size:    16

-//   float zValueF_Uint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataUint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw

-// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw

-// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_ClearUint4[] = {

-    68,  88,  66,  67,  93,  224, 233, 7,   108, 86,  206, 136, 211, 232, 189, 38,  61,  229, 240,

-    107, 1,   0,   0,   0,   100, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   24,  2,   0,   0,   232, 2,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,

-    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  148, 0,   0,   0,   5,   0,   0,   0,   8,   0,   0,   0,   128, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   128, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   138, 0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,

-    14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,

-    84,  72,  0,   171, 83,  72,  68,  82,  200, 0,   0,   0,   64,  0,   0,   0,   50,  0,   0,

-    0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,

-    242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,

-    6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,

-    70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,

-    0,   3,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,

-    0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearUint4 /T ps_4_0 /Fh compiled\clearuint11ps4.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataUint
+// {
+//
+//   uint4 color_Uint;                  // Offset:    0 Size:    16
+//   float zValueF_Uint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataUint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw
+// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw
+// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_ClearUint4[] = {
+    68,  88,  66,  67,  93,  224, 233, 7,   108, 86,  206, 136, 211, 232, 189, 38,  61,  229, 240,
+    107, 1,   0,   0,   0,   100, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   24,  2,   0,   0,   232, 2,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,
+    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  148, 0,   0,   0,   5,   0,   0,   0,   8,   0,   0,   0,   128, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   128, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   128, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   138, 0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,
+    14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,
+    84,  72,  0,   171, 83,  72,  68,  82,  200, 0,   0,   0,   64,  0,   0,   0,   50,  0,   0,
+    0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,
+    242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,
+    6,   242, 32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,
+    70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,
+    0,   3,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,
+    0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps5.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps5.h
index 364c590..c3f4855 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps5.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps5.h
@@ -1,114 +1,114 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearUint5 /T ps_4_0 /Fh compiled\clearuint11ps5.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataUint

-// {

-//

-//   uint4 color_Uint;                  // Offset:    0 Size:    16

-//   float zValueF_Uint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataUint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw

-// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw

-// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw

-// SV_TARGET                4   xyzw        4   TARGET   uint   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_ClearUint5[] = {

-    68,  88,  66,  67,  145, 170, 201, 225, 97,  45,  33,  28,  95,  98,  167, 25,  135, 24,  231,

-    97,  1,   0,   0,   0,   160, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   48,  2,   0,   0,   36,  3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,

-    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  172, 0,   0,   0,   6,   0,   0,   0,   8,   0,   0,   0,   152, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   152, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   152, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   162, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,

-    86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  236, 0,   0,   0,   64,  0,

-    0,   0,   59,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,

-    242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,

-    0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   4,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242,

-    32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,

-    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,

-    242, 32,  16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,

-    0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearUint5 /T ps_4_0 /Fh compiled\clearuint11ps5.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataUint
+// {
+//
+//   uint4 color_Uint;                  // Offset:    0 Size:    16
+//   float zValueF_Uint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataUint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw
+// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw
+// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw
+// SV_TARGET                4   xyzw        4   TARGET   uint   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_ClearUint5[] = {
+    68,  88,  66,  67,  145, 170, 201, 225, 97,  45,  33,  28,  95,  98,  167, 25,  135, 24,  231,
+    97,  1,   0,   0,   0,   160, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   48,  2,   0,   0,   36,  3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,
+    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  172, 0,   0,   0,   6,   0,   0,   0,   8,   0,   0,   0,   152, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   152, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   152, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   152, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   162, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,
+    86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  236, 0,   0,   0,   64,  0,
+    0,   0,   59,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,
+    242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,
+    0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   4,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242,
+    32,  16,  0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,
+    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,
+    242, 32,  16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   1,   0,
+    0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps6.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps6.h
index c9ff5fd..9861e81 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps6.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps6.h
@@ -1,120 +1,120 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearUint6 /T ps_4_0 /Fh compiled\clearuint11ps6.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataUint

-// {

-//

-//   uint4 color_Uint;                  // Offset:    0 Size:    16

-//   float zValueF_Uint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataUint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw

-// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw

-// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw

-// SV_TARGET                4   xyzw        4   TARGET   uint   xyzw

-// SV_TARGET                5   xyzw        5   TARGET   uint   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output o5.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov o5.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_ClearUint6[] = {

-    68,  88,  66,  67,  59,  95,  199, 69,  225, 101, 80,  115, 38,  233, 215, 218, 240, 146, 191,

-    41,  1,   0,   0,   0,   220, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   72,  2,   0,   0,   96,  3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,

-    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  196, 0,   0,   0,   7,   0,   0,   0,   8,   0,   0,   0,   176, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   176, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   176, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   176, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    5,   0,   0,   0,   15,  0,   0,   0,   186, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,

-    71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  16,

-    1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,

-    0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101,

-    0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    5,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,

-    0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,

-    0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,

-    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,

-    16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,

-    0,   0,   6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,

-    0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearUint6 /T ps_4_0 /Fh compiled\clearuint11ps6.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataUint
+// {
+//
+//   uint4 color_Uint;                  // Offset:    0 Size:    16
+//   float zValueF_Uint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataUint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw
+// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw
+// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw
+// SV_TARGET                4   xyzw        4   TARGET   uint   xyzw
+// SV_TARGET                5   xyzw        5   TARGET   uint   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov o5.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_ClearUint6[] = {
+    68,  88,  66,  67,  59,  95,  199, 69,  225, 101, 80,  115, 38,  233, 215, 218, 240, 146, 191,
+    41,  1,   0,   0,   0,   220, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   72,  2,   0,   0,   96,  3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,
+    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  196, 0,   0,   0,   7,   0,   0,   0,   8,   0,   0,   0,   176, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   176, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   176, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   176, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   176, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    5,   0,   0,   0,   15,  0,   0,   0,   186, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,  86,  95,  84,  65,  82,
+    71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 83,  72,  68,  82,  16,
+    1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,
+    0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   3,   0,   0,   0,   101,
+    0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    5,   0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,
+    0,   0,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,
+    0,   6,   242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,
+    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,
+    16,  0,   4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,
+    0,   0,   6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,   0,   0,   0,
+    0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps7.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps7.h
index 003f8e5..39af7a5 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps7.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps7.h
@@ -1,127 +1,127 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearUint7 /T ps_4_0 /Fh compiled\clearuint11ps7.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataUint

-// {

-//

-//   uint4 color_Uint;                  // Offset:    0 Size:    16

-//   float zValueF_Uint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataUint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw

-// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw

-// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw

-// SV_TARGET                4   xyzw        4   TARGET   uint   xyzw

-// SV_TARGET                5   xyzw        5   TARGET   uint   xyzw

-// SV_TARGET                6   xyzw        6   TARGET   uint   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output o5.xyzw

-dcl_output o6.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov o5.xyzw, cb0[0].xyzw

-mov o6.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_ClearUint7[] = {

-    68,  88,  66,  67,  6,   251, 248, 98,  126, 222, 114, 11,  145, 122, 100, 238, 211, 116, 210,

-    124, 1,   0,   0,   0,   24,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   96,  2,   0,   0,   156, 3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,

-    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  220, 0,   0,   0,   8,   0,   0,   0,   8,   0,   0,   0,   200, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   200, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   200, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   200, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    5,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   210, 0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,

-    86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171,

-    83,  72,  68,  82,  52,  1,   0,   0,   64,  0,   0,   0,   77,  0,   0,   0,   89,  0,   0,

-    4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101,

-    0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,

-    3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   6,   0,

-    0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,

-    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,

-    242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,

-    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,

-    4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,

-    6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,

-    0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearUint7 /T ps_4_0 /Fh compiled\clearuint11ps7.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataUint
+// {
+//
+//   uint4 color_Uint;                  // Offset:    0 Size:    16
+//   float zValueF_Uint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataUint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw
+// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw
+// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw
+// SV_TARGET                4   xyzw        4   TARGET   uint   xyzw
+// SV_TARGET                5   xyzw        5   TARGET   uint   xyzw
+// SV_TARGET                6   xyzw        6   TARGET   uint   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output o6.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov o5.xyzw, cb0[0].xyzw
+mov o6.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_ClearUint7[] = {
+    68,  88,  66,  67,  6,   251, 248, 98,  126, 222, 114, 11,  145, 122, 100, 238, 211, 116, 210,
+    124, 1,   0,   0,   0,   24,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   96,  2,   0,   0,   156, 3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,
+    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  220, 0,   0,   0,   8,   0,   0,   0,   8,   0,   0,   0,   200, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   200, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   200, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   200, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    5,   0,   0,   0,   15,  0,   0,   0,   200, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   210, 0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,   83,
+    86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171,
+    83,  72,  68,  82,  52,  1,   0,   0,   64,  0,   0,   0,   77,  0,   0,   0,   89,  0,   0,
+    4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   1,   0,   0,   0,   101,
+    0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,   0,   0,   101, 0,   0,
+    3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   6,   0,
+    0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,
+    0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,
+    242, 32,  16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   54,  0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,
+    142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,
+    4,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,
+    6,   242, 32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,  128, 32,  0,
+    0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   8,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps8.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps8.h
index 36719eb..3974396 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps8.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps8.h
@@ -1,133 +1,133 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ClearUint8 /T ps_4_0 /Fh compiled\clearuint11ps8.h

-//    Clear11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer ColorAndDepthDataUint

-// {

-//

-//   uint4 color_Uint;                  // Offset:    0 Size:    16

-//   float zValueF_Uint;                // Offset:   16 Size:     4

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// ColorAndDepthDataUint             cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw

-// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw

-// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw

-// SV_TARGET                4   xyzw        4   TARGET   uint   xyzw

-// SV_TARGET                5   xyzw        5   TARGET   uint   xyzw

-// SV_TARGET                6   xyzw        6   TARGET   uint   xyzw

-// SV_TARGET                7   xyzw        7   TARGET   uint   xyzw

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_constantbuffer cb0[2], immediateIndexed

-dcl_output o0.xyzw

-dcl_output o1.xyzw

-dcl_output o2.xyzw

-dcl_output o3.xyzw

-dcl_output o4.xyzw

-dcl_output o5.xyzw

-dcl_output o6.xyzw

-dcl_output o7.xyzw

-dcl_output oDepth

-mov o0.xyzw, cb0[0].xyzw

-mov o1.xyzw, cb0[0].xyzw

-mov o2.xyzw, cb0[0].xyzw

-mov o3.xyzw, cb0[0].xyzw

-mov o4.xyzw, cb0[0].xyzw

-mov o5.xyzw, cb0[0].xyzw

-mov o6.xyzw, cb0[0].xyzw

-mov o7.xyzw, cb0[0].xyzw

-mov oDepth, cb0[1].x

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_ClearUint8[] = {

-    68,  88,  66,  67,  136, 114, 184, 151, 152, 245, 97,  46,  151, 61,  117, 123, 231, 117, 211,

-    116, 1,   0,   0,   0,   84,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,

-    0,   0,   124, 1,   0,   0,   120, 2,   0,   0,   216, 3,   0,   0,   82,  68,  69,  70,  12,

-    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,

-    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,

-    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,

-    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,

-    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,

-    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,

-    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,

-    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    79,  83,  71,  78,  244, 0,   0,   0,   9,   0,   0,   0,   8,   0,   0,   0,   224, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   224, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   224, 0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   4,   0,   0,   0,   15,

-    0,   0,   0,   224, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    5,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   7,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   7,   0,   0,   0,   15,  0,   0,   0,   234,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255,

-    1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,

-    80,  84,  72,  0,   171, 83,  72,  68,  82,  88,  1,   0,   0,   64,  0,   0,   0,   86,  0,

-    0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101,

-    0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,

-    3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,

-    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242,

-    32,  16,  0,   6,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   7,   0,   0,   0,

-    101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,

-    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,

-    16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,

-    0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,  142, 32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   4,   0,

-    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242,

-    32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   7,   0,   0,   0,   70,  142,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,

-    128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,   0,   0,   10,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ClearUint8 /T ps_4_0 /Fh compiled\clearuint11ps8.h
+//    Clear11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer ColorAndDepthDataUint
+// {
+//
+//   uint4 color_Uint;                  // Offset:    0 Size:    16
+//   float zValueF_Uint;                // Offset:   16 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// ColorAndDepthDataUint             cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+// SV_TARGET                1   xyzw        1   TARGET   uint   xyzw
+// SV_TARGET                2   xyzw        2   TARGET   uint   xyzw
+// SV_TARGET                3   xyzw        3   TARGET   uint   xyzw
+// SV_TARGET                4   xyzw        4   TARGET   uint   xyzw
+// SV_TARGET                5   xyzw        5   TARGET   uint   xyzw
+// SV_TARGET                6   xyzw        6   TARGET   uint   xyzw
+// SV_TARGET                7   xyzw        7   TARGET   uint   xyzw
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_constantbuffer cb0[2], immediateIndexed
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output o6.xyzw
+dcl_output o7.xyzw
+dcl_output oDepth
+mov o0.xyzw, cb0[0].xyzw
+mov o1.xyzw, cb0[0].xyzw
+mov o2.xyzw, cb0[0].xyzw
+mov o3.xyzw, cb0[0].xyzw
+mov o4.xyzw, cb0[0].xyzw
+mov o5.xyzw, cb0[0].xyzw
+mov o6.xyzw, cb0[0].xyzw
+mov o7.xyzw, cb0[0].xyzw
+mov oDepth, cb0[1].x
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_ClearUint8[] = {
+    68,  88,  66,  67,  136, 114, 184, 151, 152, 245, 97,  46,  151, 61,  117, 123, 231, 117, 211,
+    116, 1,   0,   0,   0,   84,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   72,  1,
+    0,   0,   124, 1,   0,   0,   120, 2,   0,   0,   216, 3,   0,   0,   82,  68,  69,  70,  12,
+    1,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   216, 0,   0,   0,   60,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   67,  111, 108, 111, 114, 65,  110, 100, 68,  101, 112, 116, 104,
+    68,  97,  116, 97,  85,  105, 110, 116, 0,   171, 171, 60,  0,   0,   0,   2,   0,   0,   0,
+    108, 0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   156, 0,   0,
+    0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   168, 0,   0,   0,   0,   0,
+    0,   0,   184, 0,   0,   0,   16,  0,   0,   0,   4,   0,   0,   0,   2,   0,   0,   0,   200,
+    0,   0,   0,   0,   0,   0,   0,   99,  111, 108, 111, 114, 95,  85,  105, 110, 116, 0,   171,
+    1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   122, 86,  97,
+    108, 117, 101, 70,  95,  85,  105, 110, 116, 0,   171, 171, 171, 0,   0,   3,   0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    79,  83,  71,  78,  244, 0,   0,   0,   9,   0,   0,   0,   8,   0,   0,   0,   224, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   224, 0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   2,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   15,  0,   0,   0,   224, 0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   4,   0,   0,   0,   15,
+    0,   0,   0,   224, 0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    5,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   6,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   6,   0,   0,   0,   15,  0,   0,   0,   224, 0,   0,   0,   7,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   7,   0,   0,   0,   15,  0,   0,   0,   234,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255,
+    1,   14,  0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   83,  86,  95,  68,  69,
+    80,  84,  72,  0,   171, 83,  72,  68,  82,  88,  1,   0,   0,   64,  0,   0,   0,   86,  0,
+    0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   101,
+    0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   2,   0,   0,   0,   101, 0,   0,
+    3,   242, 32,  16,  0,   3,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   4,   0,
+    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   5,   0,   0,   0,   101, 0,   0,   3,   242,
+    32,  16,  0,   6,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   7,   0,   0,   0,
+    101, 0,   0,   2,   1,   192, 0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   0,   0,   0,
+    0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,
+    16,  0,   1,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,
+    0,   0,   6,   242, 32,  16,  0,   2,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   3,   0,   0,   0,   70,  142, 32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   4,   0,
+    0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   242,
+    32,  16,  0,   5,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   6,   242, 32,  16,  0,   6,   0,   0,   0,   70,  142, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   242, 32,  16,  0,   7,   0,   0,   0,   70,  142,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   1,   192, 0,   0,   10,
+    128, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,   0,   0,   10,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_2d_ps.h
index d69ba0d..e267c67 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_2d_ps.h
@@ -1,81 +1,81 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_LUMA_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_luma_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xxxx

-mov o0.w, l(1.000000)

-ret

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_LUMA_2D[] = {

-    68,  88,  66,  67,  209, 59,  102, 31,  237, 225, 110, 86,  236, 253, 1,   91,  155, 216, 150,

-    240, 1,   0,   0,   0,   136, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   12,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  156, 0,   0,   0,   64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    7,   114, 32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,

-    64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_LUMA_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_luma_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xxxx
+mov o0.w, l(1.000000)
+ret
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_LUMA_2D[] = {
+    68,  88,  66,  67,  209, 59,  102, 31,  237, 225, 110, 86,  236, 253, 1,   91,  155, 216, 150,
+    240, 1,   0,   0,   0,   136, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   12,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  156, 0,   0,   0,   64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    7,   114, 32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,
+    64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_2darray_ps.h
index 8f4f216..386203c 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_2darray_ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_LUMA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_luma_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xxxx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_LUMA_2DArray[] = {

-    68,  88,  66,  67,  208, 70,  99,  71,  119, 41,  43,  184, 189, 145, 19,  67,  181, 106, 103,

-    72,  1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  212, 0,   0,   0,   64,  0,   0,   0,   53,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,

-    0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_LUMA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_luma_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xxxx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_LUMA_2DArray[] = {
+    68,  88,  66,  67,  208, 70,  99,  71,  119, 41,  43,  184, 189, 145, 19,  67,  181, 106, 103,
+    72,  1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  212, 0,   0,   0,   64,  0,   0,   0,   53,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,
+    0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_3d_ps.h
index eed7a69..d3d612b 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_luma_3d_ps.h
@@ -1,84 +1,84 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_LUMA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_luma_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xxxx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_LUMA_3D[] = {

-    68,  88, 66,  67,  214, 160, 249, 108, 182, 66,  25,  177, 36,  87,  104, 15,  250, 128, 30,

-    24,  1,  0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  156, 0,

-    0,   0,  64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 32,  16,  0,

-    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   0,   0,   0,

-    0,   54, 0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,

-    128, 63, 62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,

-    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_LUMA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_luma_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xxxx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_LUMA_3D[] = {
+    68,  88, 66,  67,  214, 160, 249, 108, 182, 66,  25,  177, 36,  87,  104, 15,  250, 128, 30,
+    24,  1,  0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  156, 0,
+    0,   0,  64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 32,  16,  0,
+    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   0,   0,   0,
+    0,   54, 0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,
+    128, 63, 62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,
+    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_2d_ps.h
index 5e8866d..7e2fbdd 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_2d_ps.h
@@ -1,81 +1,81 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_LUMAALPHA_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_lumaalpha_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xxxx

-mov o0.w, r0.w

-ret

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_LUMAALPHA_2D[] = {

-    68, 88,  66,  67,  115, 23,  213, 46,  252, 25,  113, 198, 165, 30,  205, 48,  189, 198, 141,

-    23, 1,   0,   0,   0,   136, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,  0,   52,  1,   0,   0,   104, 1,   0,   0,   12,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,  0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86, 95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,  171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,  0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72, 68,  82,  156, 0,   0,   0,   64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,

-    0,  96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,  85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,  3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,  0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70, 126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    7,  114, 32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,

-    16, 0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,

-    0,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    4,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_LUMAALPHA_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_lumaalpha_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xxxx
+mov o0.w, r0.w
+ret
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_LUMAALPHA_2D[] = {
+    68, 88,  66,  67,  115, 23,  213, 46,  252, 25,  113, 198, 165, 30,  205, 48,  189, 198, 141,
+    23, 1,   0,   0,   0,   136, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,  0,   52,  1,   0,   0,   104, 1,   0,   0,   12,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,  0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86, 95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,  171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,  0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72, 68,  82,  156, 0,   0,   0,   64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,
+    0,  96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,  85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,  3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,  0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70, 126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    7,  114, 32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,
+    16, 0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,
+    0,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    4,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_2darray_ps.h
index fc5d8ef..8e19b44 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_2darray_ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_LUMAALPHA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_lumaalpha_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xxxx

-mov o0.w, r0.w

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_LUMAALPHA_2DArray[] = {

-    68,  88,  66,  67,  93,  91,  193, 199, 207, 164, 35,  12,  201, 95,  163, 171, 218, 214, 187,

-    51,  1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  212, 0,   0,   0,   64,  0,   0,   0,   53,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,  0,   16,

-    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_LUMAALPHA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_lumaalpha_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xxxx
+mov o0.w, r0.w
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_LUMAALPHA_2DArray[] = {
+    68,  88,  66,  67,  93,  91,  193, 199, 207, 164, 35,  12,  201, 95,  163, 171, 218, 214, 187,
+    51,  1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  212, 0,   0,   0,   64,  0,   0,   0,   53,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,  0,   16,
+    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_3d_ps.h
index f129ca1..003c0f2 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_lumaalpha_3d_ps.h
@@ -1,84 +1,84 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_LUMAALPHA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_lumaalpha_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xxxx

-mov o0.w, r0.w

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_LUMAALPHA_3D[] = {

-    68,  88, 66,  67,  246, 88,  227, 190, 126, 145, 255, 83,  3,   145, 110, 73,  19,  110, 141,

-    116, 1,  0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  156, 0,

-    0,   0,  64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 32,  16,  0,

-    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   0,   0,   0,

-    0,   54, 0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,

-    0,   0,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,

-    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_LUMAALPHA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_lumaalpha_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xxxx
+mov o0.w, r0.w
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_LUMAALPHA_3D[] = {
+    68,  88, 66,  67,  246, 88,  227, 190, 126, 145, 255, 83,  3,   145, 110, 73,  19,  110, 141,
+    116, 1,  0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  156, 0,
+    0,   0,  64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 32,  16,  0,
+    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   0,   0,   0,
+    0,   54, 0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,
+    0,   0,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,
+    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_2d_ps.h
index 1066eec..5e6b380 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_2d_ps.h
@@ -1,81 +1,81 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGB_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgb_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xyzx

-mov o0.w, l(1.000000)

-ret

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGB_2D[] = {

-    68,  88,  66,  67,  25,  134, 222, 46,  234, 185, 135, 172, 122, 147, 21,  58,  145, 33,  84,

-    232, 1,   0,   0,   0,   136, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   12,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  156, 0,   0,   0,   64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    7,   114, 32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,

-    64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGB_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgb_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xyzx
+mov o0.w, l(1.000000)
+ret
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGB_2D[] = {
+    68,  88,  66,  67,  25,  134, 222, 46,  234, 185, 135, 172, 122, 147, 21,  58,  145, 33,  84,
+    232, 1,   0,   0,   0,   136, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   12,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  156, 0,   0,   0,   64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    7,   114, 32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,
+    64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_2darray_ps.h
index 2cc0348..8ec063d 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_2darray_ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGB_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgb_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xyzx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGB_2DArray[] = {

-    68,  88,  66,  67,  5,   209, 117, 255, 204, 165, 3,   202, 62,  237, 111, 22,  134, 7,   56,

-    167, 1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  212, 0,   0,   0,   64,  0,   0,   0,   53,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,

-    0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGB_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgb_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGB_2DArray[] = {
+    68,  88,  66,  67,  5,   209, 117, 255, 204, 165, 3,   202, 62,  237, 111, 22,  134, 7,   56,
+    167, 1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  212, 0,   0,   0,   64,  0,   0,   0,   53,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,
+    0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_3d_ps.h
index 8a87516..ba2a948 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_3d_ps.h
@@ -1,84 +1,84 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGB_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgb_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xyzx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGB_3D[] = {

-    68,  88, 66,  67,  105, 156, 158, 73,  245, 65,  169, 138, 164, 71,  86,  95,  185, 136, 127,

-    70,  1,  0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  156, 0,

-    0,   0,  64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 32,  16,  0,

-    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,

-    0,   54, 0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,

-    128, 63, 62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,

-    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGB_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgb_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGB_3D[] = {
+    68,  88, 66,  67,  105, 156, 158, 73,  245, 65,  169, 138, 164, 71,  86,  95,  185, 136, 127,
+    70,  1,  0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  156, 0,
+    0,   0,  64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 32,  16,  0,
+    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,
+    0,   54, 0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,
+    128, 63, 62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,
+    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_2d_ps.h
index d0b675f..d5d6e60 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_2d_ps.h
@@ -1,89 +1,89 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGB_565_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgb_565_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)

-mov o0.w, l(1.000000)

-ret

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGB_565_2D[] = {

-    68, 88,  66,  67,  153, 181, 200, 3,   63,  247, 199, 176, 24,  55,  137, 153, 94,  174, 61,

-    31, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,  0,   52,  1,   0,   0,   104, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,  0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86, 95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,  171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,  0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72, 68,  82,  0,   1,   0,   0,   64,  0,   0,   0,   64,  0,   0,   0,   90,  0,   0,   3,

-    0,  96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,  85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,  3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,  0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70, 126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    7,  114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,

-    16, 0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,

-    2,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124, 66,

-    0,  0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,

-    0,  70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,   0,

-    0,  0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  33,

-    8,  130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,

-    0,  0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,

-    84, 116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,  0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGB_565_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgb_565_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)
+mov o0.w, l(1.000000)
+ret
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGB_565_2D[] = {
+    68, 88,  66,  67,  153, 181, 200, 3,   63,  247, 199, 176, 24,  55,  137, 153, 94,  174, 61,
+    31, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,  0,   52,  1,   0,   0,   104, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,  0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86, 95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,  171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,  0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72, 68,  82,  0,   1,   0,   0,   64,  0,   0,   0,   64,  0,   0,   0,   90,  0,   0,   3,
+    0,  96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,  85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,  3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,  0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70, 126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    7,  114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,
+    16, 0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,
+    2,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124, 66,
+    0,  0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,
+    0,  70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,   0,
+    0,  0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  33,
+    8,  130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,
+    0,  0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,
+    84, 116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,  0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_2darray_ps.h
index 2eabf1d..fbc1bf5 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_2darray_ps.h
@@ -1,99 +1,99 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGB_565_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgb_565_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)

-mov o0.w, l(1.000000)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGB_565_2DArray[] = {

-    68,  88,  66,  67,  82,  230, 180, 156, 53,  248, 202, 43,  118, 192, 10,  70,  121, 224, 218,

-    52,  1,   0,   0,   0,   92,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   224, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  56,  1,   0,   0,   64,  0,   0,   0,   78,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124, 66,  0,   0,

-    248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,

-    2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,   0,   0,   0,

-    70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  33,  8,   130,

-    60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,

-    0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116,

-    0,   0,   0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGB_565_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgb_565_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)
+mov o0.w, l(1.000000)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGB_565_2DArray[] = {
+    68,  88,  66,  67,  82,  230, 180, 156, 53,  248, 202, 43,  118, 192, 10,  70,  121, 224, 218,
+    52,  1,   0,   0,   0,   92,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   224, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  56,  1,   0,   0,   64,  0,   0,   0,   78,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124, 66,  0,   0,
+    248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,
+    2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,   0,   0,   0,
+    70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  33,  8,   130,
+    60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,
+    0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116,
+    0,   0,   0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_3d_ps.h
index c63d662..1c349a2 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgb_565_3d_ps.h
@@ -1,93 +1,93 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGB_565_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgb_565_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)

-mov o0.w, l(1.000000)

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGB_565_3D[] = {

-    68,  88, 66,  67,  151, 48,  123, 120, 147, 84,  12,  118, 27,  132, 114, 7,   119, 110, 184,

-    103, 1,  0,   0,   0,   32,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   164, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,

-    0,   0,  64,  0,   0,   0,   64,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,

-    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,

-    0,   56, 0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,

-    0,   0,  2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124, 66,  0,   0,   248, 65,  0,

-    0,   0,  0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,  0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,  0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  33,  8,   130, 60,  8,   33,

-    4,   61, 0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,

-    64,  0,  0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    7,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGB_565_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgb_565_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)
+mov o0.w, l(1.000000)
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGB_565_3D[] = {
+    68,  88, 66,  67,  151, 48,  123, 120, 147, 84,  12,  118, 27,  132, 114, 7,   119, 110, 184,
+    103, 1,  0,   0,   0,   32,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   164, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,
+    0,   0,  64,  0,   0,   0,   64,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,
+    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,
+    0,   56, 0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,
+    0,   0,  2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124, 66,  0,   0,   248, 65,  0,
+    0,   0,  0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,  0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,  0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  33,  8,   130, 60,  8,   33,
+    4,   61, 0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,
+    64,  0,  0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    7,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_2d_ps.h
index 121a1a1..72b1105 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_2d_ps.h
@@ -1,81 +1,81 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGBA_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgba_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xyzx

-mov o0.w, r0.w

-ret

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGBA_2D[] = {

-    68, 88,  66,  67,  98,  163, 157, 38,  253, 172, 208, 179, 84,  166, 215, 117, 236, 59,  71,

-    89, 1,   0,   0,   0,   136, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,  0,   52,  1,   0,   0,   104, 1,   0,   0,   12,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,  0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86, 95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,  171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,  0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72, 68,  82,  156, 0,   0,   0,   64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,

-    0,  96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,  85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,  3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,  0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70, 126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    7,  114, 32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,

-    16, 0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,

-    0,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    4,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGBA_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgba_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xyzx
+mov o0.w, r0.w
+ret
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGBA_2D[] = {
+    68, 88,  66,  67,  98,  163, 157, 38,  253, 172, 208, 179, 84,  166, 215, 117, 236, 59,  71,
+    89, 1,   0,   0,   0,   136, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,  0,   52,  1,   0,   0,   104, 1,   0,   0,   12,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,  0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86, 95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,  171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,  0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72, 68,  82,  156, 0,   0,   0,   64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,
+    0,  96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,  85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,  3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,  0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70, 126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    7,  114, 32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,
+    16, 0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,
+    0,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    4,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_2darray_ps.h
index 1e5b89f..02e93e1 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_2darray_ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGBA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgba_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xyzx

-mov o0.w, r0.w

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGBA_2DArray[] = {

-    68,  88,  66,  67,  71,  137, 115, 116, 116, 227, 120, 13,  78,  6,   238, 184, 42,  233, 145,

-    176, 1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  212, 0,   0,   0,   64,  0,   0,   0,   53,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,  0,   16,

-    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGBA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgba_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xyzx
+mov o0.w, r0.w
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGBA_2DArray[] = {
+    68,  88,  66,  67,  71,  137, 115, 116, 116, 227, 120, 13,  78,  6,   238, 184, 42,  233, 145,
+    176, 1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  212, 0,   0,   0,   64,  0,   0,   0,   53,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    32,  16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,  0,   16,
+    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_3d_ps.h
index 624b152..588e7a8 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_3d_ps.h
@@ -1,84 +1,84 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGBA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgba_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul o0.xyz, r0.wwww, r0.xyzx

-mov o0.w, r0.w

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGBA_3D[] = {

-    68,  88, 66,  67,  18,  96,  97,  129, 150, 42,  120, 55,  5,   245, 19,  153, 24,  53,  74,

-    155, 1,  0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  156, 0,

-    0,   0,  64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 32,  16,  0,

-    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,

-    0,   54, 0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,

-    0,   0,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,

-    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGBA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgba_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul o0.xyz, r0.wwww, r0.xyzx
+mov o0.w, r0.w
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGBA_3D[] = {
+    68,  88, 66,  67,  18,  96,  97,  129, 150, 42,  120, 55,  5,   245, 19,  153, 24,  53,  74,
+    155, 1,  0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  156, 0,
+    0,   0,  64,  0,   0,   0,   39,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 32,  16,  0,
+    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,
+    0,   54, 0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,
+    0,   0,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,
+    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_2d_ps.h
index 280f4d6..de1bf9b 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_2d_ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGBA_4444_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgba_4444_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGBA_4444_2D[] = {

-    68,  88,  66,  67,  162, 159, 42,  148, 192, 35,  248, 166, 96,  219, 84,  153, 55,  243, 174,

-    115, 1,   0,   0,   0,   216, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   92,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  236, 0,   0,   0,   64,  0,   0,   0,   59,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    7,   114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,

-    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,

-    0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,

-    0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,

-    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137,

-    136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGBA_4444_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgba_4444_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGBA_4444_2D[] = {
+    68,  88,  66,  67,  162, 159, 42,  148, 192, 35,  248, 166, 96,  219, 84,  153, 55,  243, 174,
+    115, 1,   0,   0,   0,   216, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   92,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  236, 0,   0,   0,   64,  0,   0,   0,   59,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    7,   114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,
+    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,
+    0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,
+    0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,
+    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137,
+    136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_2darray_ps.h
index 378cae7..0beb462 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_2darray_ps.h
@@ -1,97 +1,97 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGBA_4444_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgba_4444_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGBA_4444_2DArray[] = {

-    68,  88,  66,  67,  0,   105, 196, 49,  19,  185, 247, 82,  176, 7,   54,  252, 239, 225, 169,

-    225, 1,   0,   0,   0,   72,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   204, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  36,  1,   0,   0,   64,  0,   0,   0,   73,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,  0,   0,

-    112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,

-    70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137, 136, 136,

-    61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGBA_4444_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgba_4444_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGBA_4444_2DArray[] = {
+    68,  88,  66,  67,  0,   105, 196, 49,  19,  185, 247, 82,  176, 7,   54,  252, 239, 225, 169,
+    225, 1,   0,   0,   0,   72,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   204, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  36,  1,   0,   0,   64,  0,   0,   0,   73,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,  0,   0,
+    112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,
+    70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137, 136, 136,
+    61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_3d_ps.h
index 8f0958d..95984d7 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_4444_3d_ps.h
@@ -1,91 +1,91 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGBA_4444_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgba_4444_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGBA_4444_3D[] = {

-    68,  88,  66,  67,  182, 254, 44,  165, 15,  39,  193, 247, 58,  244, 243, 166, 190, 236, 221,

-    252, 1,   0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  236, 0,

-    0,   0,   64,  0,   0,   0,   59,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,

-    0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,

-    0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  0,

-    0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137, 136, 136, 61,  137, 136,

-    136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGBA_4444_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgba_4444_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGBA_4444_3D[] = {
+    68,  88,  66,  67,  182, 254, 44,  165, 15,  39,  193, 247, 58,  244, 243, 166, 190, 236, 221,
+    252, 1,   0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  236, 0,
+    0,   0,   64,  0,   0,   0,   59,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,
+    0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,
+    0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  0,
+    0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137, 136, 136, 61,  137, 136,
+    136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_2d_ps.h
index 46f740b..ec165e0 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_2d_ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGBA_5551_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgba_5551_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGBA_5551_2D[] = {

-    68,  88,  66,  67,  9,   162, 245, 66,  237, 195, 125, 215, 175, 86,  217, 7,  250, 144, 127,

-    24,  1,   0,   0,   0,   216, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   92,  2,   0,   0,   82,  68, 69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,  0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,

-    72,  68,  82,  236, 0,   0,   0,   64,  0,   0,   0,   59,  0,   0,   0,   90, 0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,  0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  56,  0,   0,

-    7,   114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,  0,   70,  2,

-    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,  0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,  0,   248, 65,

-    0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,  0,   0,   0,

-    0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16, 0,   0,   0,

-    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33, 4,   61,  8,

-    33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83, 84,  65,  84,

-    116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  2,   0,   0,

-    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGBA_5551_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgba_5551_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGBA_5551_2D[] = {
+    68,  88,  66,  67,  9,   162, 245, 66,  237, 195, 125, 215, 175, 86,  217, 7,  250, 144, 127,
+    24,  1,   0,   0,   0,   216, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   92,  2,   0,   0,   82,  68, 69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,  0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,
+    72,  68,  82,  236, 0,   0,   0,   64,  0,   0,   0,   59,  0,   0,   0,   90, 0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,  0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  56,  0,   0,
+    7,   114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,  0,   70,  2,
+    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,  0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,  0,   248, 65,
+    0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,  0,   0,   0,
+    0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16, 0,   0,   0,
+    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33, 4,   61,  8,
+    33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83, 84,  65,  84,
+    116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  2,   0,   0,
+    0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_2darray_ps.h
index 54020dd..c32ad2a 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_2darray_ps.h
@@ -1,97 +1,97 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGBA_5551_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgba_5551_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGBA_5551_2DArray[] = {

-    68,  88,  66,  67,  205, 80,  185, 185, 211, 249, 96,  159, 20,  215, 234, 77,  101, 157, 240,

-    47,  1,   0,   0,   0,   72,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   204, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  36,  1,   0,   0,   64,  0,   0,   0,   73,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   248, 65,  0,   0,

-    248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,

-    70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  8,   33,  4,

-    61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGBA_5551_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgba_5551_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGBA_5551_2DArray[] = {
+    68,  88,  66,  67,  205, 80,  185, 185, 211, 249, 96,  159, 20,  215, 234, 77,  101, 157, 240,
+    47,  1,   0,   0,   0,   72,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   204, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  36,  1,   0,   0,   64,  0,   0,   0,   73,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   248, 65,  0,   0,
+    248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,
+    70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  8,   33,  4,
+    61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   4,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_3d_ps.h
index e0403fc..1220a49 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_pm_rgba_5551_3d_ps.h
@@ -1,91 +1,91 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_PM_RGBA_5551_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_pm_rgba_5551_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_PM_RGBA_5551_3D[] = {

-    68,  88,  66,  67,  6,   155, 93,  120, 159, 88,  203, 149, 81,  116, 108, 30,  223, 171, 137,

-    112, 1,   0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  236, 0,

-    0,   0,   64,  0,   0,   0,   59,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,

-    0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,

-    0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   248, 65,  0,

-    0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  8,   33,  4,   61,  8,   33,

-    4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_PM_RGBA_5551_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_pm_rgba_5551_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_PM_RGBA_5551_3D[] = {
+    68,  88,  66,  67,  6,   155, 93,  120, 159, 88,  203, 149, 81,  116, 108, 30,  223, 171, 137,
+    112, 1,   0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  236, 0,
+    0,   0,   64,  0,   0,   0,   59,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,
+    0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,
+    0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   248, 65,  0,
+    0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  8,   33,  4,   61,  8,   33,
+    4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_2d_ps.h
index d8e6d5a..3ef4aff 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_2d_ps.h
@@ -1,86 +1,86 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_LUMA_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_luma_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r0.w, r0.x, r0.w

-movc o0.xyz, r1.xxxx, r0.wwww, r0.xyzx

-mov o0.w, l(1.000000)

-ret

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_LUMA_2D[] = {

-    68,  88,  66,  67,  71,  14,  186, 44,  238, 163, 144, 254, 61,  126, 83,  179, 106, 64,  226,

-    41,  1,   0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   76,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  220, 0,   0,   0,   64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   130, 0,   16,  0,   0,   0,   0,   0,   10,

-    0,   16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,

-    114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   246, 15,  16,

-    0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,

-    84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_LUMA_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_luma_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r0.w, r0.x, r0.w
+movc o0.xyz, r1.xxxx, r0.wwww, r0.xyzx
+mov o0.w, l(1.000000)
+ret
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_LUMA_2D[] = {
+    68,  88,  66,  67,  71,  14,  186, 44,  238, 163, 144, 254, 61,  126, 83,  179, 106, 64,  226,
+    41,  1,   0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   76,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  220, 0,   0,   0,   64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   130, 0,   16,  0,   0,   0,   0,   0,   10,
+    0,   16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,
+    114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   246, 15,  16,
+    0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,
+    84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_2darray_ps.h
index 7eeffbb..64ab922 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_2darray_ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_LUMA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_luma_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r0.w, r0.x, r0.w

-movc o0.xyz, r1.xxxx, r0.wwww, r0.xyzx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_LUMA_2DArray[] = {

-    68,  88,  66,  67,  184, 162, 155, 43,  23,  48,  207, 131, 7,   89,  192, 94,  227, 94,  220,

-    191, 1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  20,  1,   0,   0,   64,  0,   0,   0,   69,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   130, 0,   16,  0,   0,   0,   0,   0,   10,  0,   16,

-    0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   246, 15,  16,  0,   0,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_LUMA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_luma_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r0.w, r0.x, r0.w
+movc o0.xyz, r1.xxxx, r0.wwww, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_LUMA_2DArray[] = {
+    68,  88,  66,  67,  184, 162, 155, 43,  23,  48,  207, 131, 7,   89,  192, 94,  227, 94,  220,
+    191, 1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  20,  1,   0,   0,   64,  0,   0,   0,   69,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   130, 0,   16,  0,   0,   0,   0,   0,   10,  0,   16,
+    0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   246, 15,  16,  0,   0,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_3d_ps.h
index 3d15d42..7ad4895 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_luma_3d_ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_LUMA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_luma_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r0.w, r0.x, r0.w

-movc o0.xyz, r1.xxxx, r0.wwww, r0.xyzx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_LUMA_3D[] = {

-    68,  88, 66,  67,  77,  171, 194, 196, 97,  109, 120, 177, 44,  223, 143, 94,  184, 55,  24,

-    193, 1,  0,   0,   0,   252, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   128, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  220, 0,

-    0,   0,  64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14, 0,   0,   7,   130, 0,   16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,

-    0,   0,  58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,  16,  0,   0,

-    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,

-    70,  2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,

-    0,   1,  64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,  6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_LUMA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_luma_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r0.w, r0.x, r0.w
+movc o0.xyz, r1.xxxx, r0.wwww, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_LUMA_3D[] = {
+    68,  88, 66,  67,  77,  171, 194, 196, 97,  109, 120, 177, 44,  223, 143, 94,  184, 55,  24,
+    193, 1,  0,   0,   0,   252, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   128, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  220, 0,
+    0,   0,  64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14, 0,   0,   7,   130, 0,   16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,
+    0,   0,  58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,  16,  0,   0,
+    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,
+    70,  2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,
+    0,   1,  64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,  6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_2d_ps.h
index 783fe40..78c2c25 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_2d_ps.h
@@ -1,86 +1,86 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_LUMAALPHA_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_lumaalpha_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.y, r0.x, r0.w

-movc o0.xyz, r1.xxxx, r1.yyyy, r0.xyzx

-mov o0.w, r0.w

-ret

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_LUMAALPHA_2D[] = {

-    68,  88,  66,  67,  22,  109, 155, 40,  201, 35,  16,  39,  85,  5,   175, 53, 227, 54,  209,

-    235, 1,   0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   76,  2,   0,   0,   82,  68, 69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,  0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,

-    72,  68,  82,  220, 0,   0,   0,   64,  0,   0,   0,   55,  0,   0,   0,   90, 0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,  0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   34,  0,   16,  0,   1,   0,  0,   0,   10,

-    0,   16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   55, 0,   0,   9,

-    114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,  86,  5,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,  5,   130, 32,

-    16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   62,  0,  0,   1,   83,

-    84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_LUMAALPHA_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_lumaalpha_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.y, r0.x, r0.w
+movc o0.xyz, r1.xxxx, r1.yyyy, r0.xyzx
+mov o0.w, r0.w
+ret
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_LUMAALPHA_2D[] = {
+    68,  88,  66,  67,  22,  109, 155, 40,  201, 35,  16,  39,  85,  5,   175, 53, 227, 54,  209,
+    235, 1,   0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   76,  2,   0,   0,   82,  68, 69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,  0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,
+    72,  68,  82,  220, 0,   0,   0,   64,  0,   0,   0,   55,  0,   0,   0,   90, 0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,  0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   34,  0,   16,  0,   1,   0,  0,   0,   10,
+    0,   16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   55, 0,   0,   9,
+    114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,  86,  5,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,  5,   130, 32,
+    16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   62,  0,  0,   1,   83,
+    84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_2darray_ps.h
index 40ab74a..297851a 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_2darray_ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_LUMAALPHA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_lumaalpha_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.y, r0.x, r0.w

-movc o0.xyz, r1.xxxx, r1.yyyy, r0.xyzx

-mov o0.w, r0.w

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_LUMAALPHA_2DArray[] = {

-    68,  88,  66,  67,  94,  117, 2,   58,  233, 207, 165, 71,  59,  41,  51,  92,  213, 80,  177,

-    27,  1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  20,  1,   0,   0,   64,  0,   0,   0,   69,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   34,  0,   16,  0,   1,   0,   0,   0,   10,  0,   16,

-    0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   86,  5,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,

-    0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_LUMAALPHA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_lumaalpha_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.y, r0.x, r0.w
+movc o0.xyz, r1.xxxx, r1.yyyy, r0.xyzx
+mov o0.w, r0.w
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_LUMAALPHA_2DArray[] = {
+    68,  88,  66,  67,  94,  117, 2,   58,  233, 207, 165, 71,  59,  41,  51,  92,  213, 80,  177,
+    27,  1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  20,  1,   0,   0,   64,  0,   0,   0,   69,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   34,  0,   16,  0,   1,   0,   0,   0,   10,  0,   16,
+    0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   86,  5,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,
+    0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_3d_ps.h
index abfe212..530391a 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_lumaalpha_3d_ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_LUMAALPHA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_lumaalpha_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.y, r0.x, r0.w

-movc o0.xyz, r1.xxxx, r1.yyyy, r0.xyzx

-mov o0.w, r0.w

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_LUMAALPHA_3D[] = {

-    68,  88, 66,  67,  128, 175, 170, 32,  32,  26,  145, 52,  16,  138, 167, 233, 195, 132, 202,

-    23,  1,  0,   0,   0,   252, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   128, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  220, 0,

-    0,   0,  64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14, 0,   0,   7,   34,  0,   16,  0,   1,   0,   0,   0,   10,  0,   16,  0,   0,   0,

-    0,   0,  58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,  16,  0,   0,

-    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   86,  5,   16,  0,   1,   0,   0,   0,

-    70,  2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,

-    0,   58, 0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,  6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_LUMAALPHA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_lumaalpha_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.y, r0.x, r0.w
+movc o0.xyz, r1.xxxx, r1.yyyy, r0.xyzx
+mov o0.w, r0.w
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_LUMAALPHA_3D[] = {
+    68,  88, 66,  67,  128, 175, 170, 32,  32,  26,  145, 52,  16,  138, 167, 233, 195, 132, 202,
+    23,  1,  0,   0,   0,   252, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   128, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  220, 0,
+    0,   0,  64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14, 0,   0,   7,   34,  0,   16,  0,   1,   0,   0,   0,   10,  0,   16,  0,   0,   0,
+    0,   0,  58,  0,   16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,  16,  0,   0,
+    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   86,  5,   16,  0,   1,   0,   0,   0,
+    70,  2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,
+    0,   58, 0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,  6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_2d_ps.h
index 3e32558..bc82ff6 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_2d_ps.h
@@ -1,86 +1,86 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGB_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgb_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mov o0.w, l(1.000000)

-ret

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGB_2D[] = {

-    68,  88,  66,  67,  63,  117, 49,  53,  235, 146, 223, 2,   159, 166, 4,   195, 149, 255, 102,

-    138, 1,   0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   76,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  220, 0,   0,   0,   64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,

-    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,

-    114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,

-    84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGB_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgb_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mov o0.w, l(1.000000)
+ret
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGB_2D[] = {
+    68,  88,  66,  67,  63,  117, 49,  53,  235, 146, 223, 2,   159, 166, 4,   195, 149, 255, 102,
+    138, 1,   0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   76,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  220, 0,   0,   0,   64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,
+    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,
+    114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,
+    84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_2darray_ps.h
index caf50b5..7e9b05f 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_2darray_ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGB_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgb_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGB_2DArray[] = {

-    68,  88,  66,  67,  210, 10,  53,  114, 86,  93,  161, 110, 5,   206, 177, 106, 185, 213, 179,

-    76,  1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  20,  1,   0,   0,   64,  0,   0,   0,   69,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,

-    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGB_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgb_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGB_2DArray[] = {
+    68,  88,  66,  67,  210, 10,  53,  114, 86,  93,  161, 110, 5,   206, 177, 106, 185, 213, 179,
+    76,  1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  20,  1,   0,   0,   64,  0,   0,   0,   69,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,
+    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_3d_ps.h
index 7373f15..7af44b3 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_3d_ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGB_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgb_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGB_3D[] = {

-    68,  88, 66,  67,  188, 48,  16,  8,   90,  93,  28,  229, 37,  1,   35,  250, 16,  184, 91,

-    94,  1,  0,   0,   0,   252, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   128, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  220, 0,

-    0,   0,  64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,

-    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,  16,  0,   0,

-    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,

-    70,  2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,

-    0,   1,  64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,  6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGB_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgb_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGB_3D[] = {
+    68,  88, 66,  67,  188, 48,  16,  8,   90,  93,  28,  229, 37,  1,   35,  250, 16,  184, 91,
+    94,  1,  0,   0,   0,   252, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   128, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  220, 0,
+    0,   0,  64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,
+    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,  16,  0,   0,
+    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,
+    70,  2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,
+    0,   1,  64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,  6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_2d_ps.h
index b4f5165..7bc7ce3 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_2d_ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGB_565_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgb_565_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)

-mov o0.w, l(1.000000)

-ret

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGB_565_2D[] = {

-    68,  88,  66,  67,  117, 81,  223, 7,   30,  231, 23,  32,  47,  120, 68,  27, 206, 77,  54,

-    22,  1,   0,   0,   0,   44,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   176, 2,   0,   0,   82,  68, 69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,  0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,

-    72,  68,  82,  64,  1,   0,   0,   64,  0,   0,   0,   80,  0,   0,   0,   90, 0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,  0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,  0,   0,   6,

-    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55, 0,   0,   9,

-    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,  150, 7,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,  10,  114, 0,

-    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64, 0,   0,   0,

-    0,   248, 65,  0,   0,   124, 66,  0,   0,   248, 65,  0,   0,   0,   0,   64, 0,   0,   5,

-    114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  56,  0,   0,

-    10,  114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,  0,   2,   64,

-    0,   0,   8,   33,  4,   61,  33,  8,   130, 60,  8,   33,  4,   61,  0,   0,  0,   0,   54,

-    0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,  0,   128, 63,

-    62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,  2,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  1,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGB_565_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgb_565_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)
+mov o0.w, l(1.000000)
+ret
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGB_565_2D[] = {
+    68,  88,  66,  67,  117, 81,  223, 7,   30,  231, 23,  32,  47,  120, 68,  27, 206, 77,  54,
+    22,  1,   0,   0,   0,   44,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   176, 2,   0,   0,   82,  68, 69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,  0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,
+    72,  68,  82,  64,  1,   0,   0,   64,  0,   0,   0,   80,  0,   0,   0,   90, 0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,  0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,  0,   0,   6,
+    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55, 0,   0,   9,
+    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,  150, 7,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,  10,  114, 0,
+    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64, 0,   0,   0,
+    0,   248, 65,  0,   0,   124, 66,  0,   0,   248, 65,  0,   0,   0,   0,   64, 0,   0,   5,
+    114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  56,  0,   0,
+    10,  114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,  0,   2,   64,
+    0,   0,   8,   33,  4,   61,  33,  8,   130, 60,  8,   33,  4,   61,  0,   0,  0,   0,   54,
+    0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,  0,   128, 63,
+    62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,  2,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  1,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_2darray_ps.h
index 4e24812..e45bb2a 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_2darray_ps.h
@@ -1,104 +1,104 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGB_565_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgb_565_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)

-mov o0.w, l(1.000000)

-ret 

-// Approximately 11 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGB_565_2DArray[] = {

-    68,  88,  66,  67,  35,  219, 151, 252, 191, 176, 177, 149, 253, 136, 157, 72,  99,  141, 43,

-    53,  1,   0,   0,   0,   156, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   32,  3,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  120, 1,   0,   0,   64,  0,   0,   0,   94,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,

-    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,

-    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248,

-    65,  0,   0,   124, 66,  0,   0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,

-    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114,

-    32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,

-    8,   33,  4,   61,  33,  8,   130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,

-    5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,

-    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   11,  0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   3,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGB_565_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgb_565_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)
+mov o0.w, l(1.000000)
+ret 
+// Approximately 11 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGB_565_2DArray[] = {
+    68,  88,  66,  67,  35,  219, 151, 252, 191, 176, 177, 149, 253, 136, 157, 72,  99,  141, 43,
+    53,  1,   0,   0,   0,   156, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   32,  3,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  120, 1,   0,   0,   64,  0,   0,   0,   94,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,
+    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,
+    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248,
+    65,  0,   0,   124, 66,  0,   0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,
+    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114,
+    32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,
+    8,   33,  4,   61,  33,  8,   130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,
+    5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,
+    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   11,  0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   3,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_3d_ps.h
index 866658b..7cda8da 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgb_565_3d_ps.h
@@ -1,98 +1,98 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGB_565_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgb_565_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)

-mov o0.w, l(1.000000)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGB_565_3D[] = {

-    68,  88, 66,  67,  103, 213, 3,   101, 235, 72,  224, 234, 90,  115, 96,  192, 84,  122, 216,

-    161, 1,  0,   0,   0,   96,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   228, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  64,  1,

-    0,   0,  64,  0,   0,   0,   80,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,

-    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,

-    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,

-    70,  2,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,

-    0,   70, 2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,

-    124, 66, 0,   0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,

-    0,   0,  0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,

-    0,   0,  0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,

-    61,  33, 8,   130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,

-    16,  0,  0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,

-    84,  65, 84,  116, 0,   0,   0,   9,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,  0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGB_565_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgb_565_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)
+mov o0.w, l(1.000000)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGB_565_3D[] = {
+    68,  88, 66,  67,  103, 213, 3,   101, 235, 72,  224, 234, 90,  115, 96,  192, 84,  122, 216,
+    161, 1,  0,   0,   0,   96,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   228, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  64,  1,
+    0,   0,  64,  0,   0,   0,   80,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,
+    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,
+    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,
+    70,  2,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,
+    0,   70, 2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,
+    124, 66, 0,   0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,
+    0,   0,  0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,
+    0,   0,  0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,
+    61,  33, 8,   130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,
+    16,  0,  0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,
+    84,  65, 84,  116, 0,   0,   0,   9,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,  0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_2d_ps.h
index a36329c..ba9d3a2 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_2d_ps.h
@@ -1,86 +1,86 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mov o0.w, r0.w

-ret

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_2D[] = {

-    68,  88,  66,  67,  214, 130, 152, 233, 185, 254, 78,  247, 13,  195, 81,  12, 126, 13,  130,

-    154, 1,   0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   76,  2,   0,   0,   82,  68, 69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,  0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,

-    72,  68,  82,  220, 0,   0,   0,   64,  0,   0,   0,   55,  0,   0,   0,   90, 0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,  0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,  0,   0,   6,

-    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55, 0,   0,   9,

-    114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,  150, 7,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,  5,   130, 32,

-    16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   62,  0,  0,   1,   83,

-    84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,   0,

-    2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mov o0.w, r0.w
+ret
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_2D[] = {
+    68,  88,  66,  67,  214, 130, 152, 233, 185, 254, 78,  247, 13,  195, 81,  12, 126, 13,  130,
+    154, 1,   0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   76,  2,   0,   0,   82,  68, 69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,  0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,
+    72,  68,  82,  220, 0,   0,   0,   64,  0,   0,   0,   55,  0,   0,   0,   90, 0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,  0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,  0,   0,   6,
+    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55, 0,   0,   9,
+    114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,  150, 7,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,  5,   130, 32,
+    16,  0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   62,  0,  0,   1,   83,
+    84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,   0,
+    2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_2darray_ps.h
index d85e889..8fde37e 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_2darray_ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mov o0.w, r0.w

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_2DArray[] = {

-    68,  88,  66,  67,  94,  112, 50,  105, 113, 109, 240, 60,  172, 113, 184, 242, 235, 87,  64,

-    32,  1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  20,  1,   0,   0,   64,  0,   0,   0,   69,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,

-    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,

-    0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mov o0.w, r0.w
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_2DArray[] = {
+    68,  88,  66,  67,  94,  112, 50,  105, 113, 109, 240, 60,  172, 113, 184, 242, 235, 87,  64,
+    32,  1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  20,  1,   0,   0,   64,  0,   0,   0,   69,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,
+    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,
+    0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_3d_ps.h
index 948d260..b3589c6 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_3d_ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mov o0.w, r0.w

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_3D[] = {

-    68,  88, 66,  67,  238, 227, 231, 209, 25,  105, 137, 11,  175, 227, 234, 239, 250, 100, 198,

-    187, 1,  0,   0,   0,   252, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   128, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  220, 0,

-    0,   0,  64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,

-    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,  16,  0,   0,

-    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,

-    70,  2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,

-    0,   58, 0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,  6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc o0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mov o0.w, r0.w
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_3D[] = {
+    68,  88, 66,  67,  238, 227, 231, 209, 25,  105, 137, 11,  175, 227, 234, 239, 250, 100, 198,
+    187, 1,  0,   0,   0,   252, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   128, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  220, 0,
+    0,   0,  64,  0,   0,   0,   55,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,
+    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 32,  16,  0,   0,
+    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,
+    70,  2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,
+    0,   58, 0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,  6,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_2d_ps.h
index e9a6210..76495e7 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_2d_ps.h
@@ -1,92 +1,92 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_4444_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_4444_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_4444_2D[] = {

-    68,  88,  66,  67,  222, 241, 125, 211, 53,  8,   171, 225, 195, 188, 22,  118, 155, 53,  136,

-    73,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  44,  1,   0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,

-    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,

-    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,

-    0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,

-    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_4444_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_4444_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_4444_2D[] = {
+    68,  88,  66,  67,  222, 241, 125, 211, 53,  8,   171, 225, 195, 188, 22,  118, 155, 53,  136,
+    73,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  44,  1,   0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,
+    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,
+    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,
+    0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,
+    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_2darray_ps.h
index c2784d1..b0e165a 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_2darray_ps.h
@@ -1,102 +1,102 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_4444_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_4444_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_4444_2DArray[] = {

-    68,  88,  66,  67,  248, 46,  191, 7,   4,   167, 130, 163, 93,  127, 212, 211, 47,  149, 216,

-    24,  1,   0,   0,   0,   136, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   12,  3,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  100, 1,   0,   0,   64,  0,   0,   0,   89,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,

-    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,

-    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112,

-    65,  0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242,

-    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,

-    137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,

-    1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   2,   0,   0,   0,   0,   0,

-    0,   0,   3,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_4444_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_4444_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_4444_2DArray[] = {
+    68,  88,  66,  67,  248, 46,  191, 7,   4,   167, 130, 163, 93,  127, 212, 211, 47,  149, 216,
+    24,  1,   0,   0,   0,   136, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   12,  3,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  100, 1,   0,   0,   64,  0,   0,   0,   89,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,
+    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,
+    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112,
+    65,  0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242,
+    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,
+    137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,
+    1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   2,   0,   0,   0,   0,   0,
+    0,   0,   3,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_3d_ps.h
index 07c452f..a1b7ed0 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_3d_ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_4444_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_4444_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_4444_3D[] = {

-    68,  88,  66,  67,  234, 154, 253, 59,  138, 126, 10,  67,  101, 219, 116, 42,  69,  129, 73,

-    147, 1,   0,   0,   0,   76,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   208, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  44,  1,

-    0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,

-    0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,

-    0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,

-    70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,

-    0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,

-    112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,

-    0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,

-    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136,

-    61,  137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,

-    65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,

-    0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_4444_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_4444_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_4444_3D[] = {
+    68,  88,  66,  67,  234, 154, 253, 59,  138, 126, 10,  67,  101, 219, 116, 42,  69,  129, 73,
+    147, 1,   0,   0,   0,   76,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   208, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  44,  1,
+    0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,
+    0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,
+    0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,
+    70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,
+    0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,
+    112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,
+    0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,
+    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136,
+    61,  137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,
+    65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,
+    0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_ps.h
index c786ca7..0f46616 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_4444_ps.h
@@ -1,92 +1,92 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_4444 /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_4444_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_4444[] = {

-    68,  88,  66,  67,  222, 241, 125, 211, 53,  8,   171, 225, 195, 188, 22,  118, 155, 53,  136,

-    73,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  44,  1,   0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,

-    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,

-    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,

-    0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,

-    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_4444 /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_4444_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_4444[] = {
+    68,  88,  66,  67,  222, 241, 125, 211, 53,  8,   171, 225, 195, 188, 22,  118, 155, 53,  136,
+    73,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  44,  1,   0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,
+    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,
+    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,
+    0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,
+    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_2d_ps.h
index 2b304fa..1fc8416 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_2d_ps.h
@@ -1,92 +1,92 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_5551_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_5551_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_5551_2D[] = {

-    68,  88,  66,  67,  244, 247, 148, 118, 3,   30,  60,  3,   4,   193, 209, 178, 87,  185, 179,

-    75,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  44,  1,   0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,

-    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,

-    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,

-    0,   248, 65,  0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,

-    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   8,   33,  4,   61,  8,   33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_5551_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_5551_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_5551_2D[] = {
+    68,  88,  66,  67,  244, 247, 148, 118, 3,   30,  60,  3,   4,   193, 209, 178, 87,  185, 179,
+    75,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  44,  1,   0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,
+    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,
+    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,
+    0,   248, 65,  0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,
+    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   8,   33,  4,   61,  8,   33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_2darray_ps.h
index 7fe59a0..b98fd23 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_2darray_ps.h
@@ -1,102 +1,102 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_5551_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_5551_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_5551_2DArray[] = {

-    68,  88,  66,  67,  196, 233, 27,  136, 227, 152, 84,  237, 85,  28,  205, 241, 162, 112, 239,

-    139, 1,   0,   0,   0,   136, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   12,  3,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  100, 1,   0,   0,   64,  0,   0,   0,   89,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,

-    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,

-    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248,

-    65,  0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242,

-    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,

-    8,   33,  4,   61,  8,   33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,

-    1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   2,   0,   0,   0,   0,   0,

-    0,   0,   3,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_5551_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_5551_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_5551_2DArray[] = {
+    68,  88,  66,  67,  196, 233, 27,  136, 227, 152, 84,  237, 85,  28,  205, 241, 162, 112, 239,
+    139, 1,   0,   0,   0,   136, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   12,  3,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  100, 1,   0,   0,   64,  0,   0,   0,   89,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,
+    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,
+    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248,
+    65,  0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242,
+    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,
+    8,   33,  4,   61,  8,   33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,
+    1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   2,   0,   0,   0,   0,   0,
+    0,   0,   3,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_3d_ps.h
index 44b77f2..235f5d7 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_3d_ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_5551_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_5551_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_5551_3D[] = {

-    68,  88, 66,  67,  11,  156, 219, 201, 154, 211, 248, 190, 164, 107, 120, 89,  222, 49,  246,

-    208, 1,  0,   0,   0,   76,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   208, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  44,  1,

-    0,   0,  64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,

-    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,

-    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,

-    70,  2,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,

-    0,   70, 14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,

-    248, 65, 0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,

-    0,   0,  0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,

-    0,   0,  0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,

-    61,  8,  33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,

-    65,  84, 116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,

-    0,   0,  0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_5551_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_5551_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_5551_3D[] = {
+    68,  88, 66,  67,  11,  156, 219, 201, 154, 211, 248, 190, 164, 107, 120, 89,  222, 49,  246,
+    208, 1,  0,   0,   0,   76,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   208, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  44,  1,
+    0,   0,  64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,
+    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,
+    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,
+    70,  2,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,
+    0,   70, 14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,
+    248, 65, 0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,
+    0,   0,  0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,
+    0,   0,  0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,
+    61,  8,  33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,
+    65,  84, 116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,
+    0,   0,  0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_ps.h
index bf5ad0a..479d25f 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftof_um_rgba_5551_ps.h
@@ -1,92 +1,92 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoF_UM_RGBA_5551 /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftof_um_rgba_5551_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoF_UM_RGBA_5551[] = {

-    68,  88,  66,  67,  244, 247, 148, 118, 3,   30,  60,  3,   4,   193, 209, 178, 87,  185, 179,

-    75,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  44,  1,   0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,

-    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,

-    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,

-    0,   248, 65,  0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,

-    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   8,   33,  4,   61,  8,   33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoF_UM_RGBA_5551 /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftof_um_rgba_5551_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoF_UM_RGBA_5551[] = {
+    68,  88,  66,  67,  244, 247, 148, 118, 3,   30,  60,  3,   4,   193, 209, 178, 87,  185, 179,
+    75,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  44,  1,   0,   0,   64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,
+    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,
+    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,
+    0,   248, 65,  0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,
+    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    10,  242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   8,   33,  4,   61,  8,   33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgb_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgb_2darray_ps.h
index 287daa8..d04d804 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgb_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgb_2darray_ps.h
@@ -1,98 +1,98 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_PM_RGB_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_pm_rgb_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-ftoi o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_PM_RGB_2DArray[] = {

-    68,  88,  66,  67,  178, 234, 183, 182, 127, 41,  43,  30,  160, 66,  5,   227, 47,  30,  115,

-    214, 1,   0,   0,   0,   72,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   204, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  36,  1,   0,   0,   64,  0,   0,   0,   73,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,   254, 66,  0,   0,

-    254, 66,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,

-    2,   16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,

-    70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,

-    0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_PM_RGB_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_pm_rgb_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+ftoi o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_PM_RGB_2DArray[] = {
+    68,  88,  66,  67,  178, 234, 183, 182, 127, 41,  43,  30,  160, 66,  5,   227, 47,  30,  115,
+    214, 1,   0,   0,   0,   72,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   204, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  36,  1,   0,   0,   64,  0,   0,   0,   73,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,   254, 66,  0,   0,
+    254, 66,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,
+    2,   16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,
+    70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,
+    0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgb_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgb_3d_ps.h
index 4696fe7..4b51b2a 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgb_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgb_3d_ps.h
@@ -1,92 +1,92 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_PM_RGB_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_pm_rgb_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-ftoi o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_PM_RGB_3D[] = {

-    68,  88, 66,  67,  223, 210, 226, 205, 135, 197, 5,   16,  69,  92,  186, 191, 202, 155, 229,

-    110, 1,  0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  236, 0,

-    0,   0,  64,  0,   0,   0,   59,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,

-    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,

-    0,   56, 0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,

-    0,   0,  2,   64,  0,   0,   0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  0,

-    0,   0,  0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,  0,   0,   27,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,  0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,

-    0,   0,  1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,

-    0,   0,  0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_PM_RGB_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_pm_rgb_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+ftoi o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_PM_RGB_3D[] = {
+    68,  88, 66,  67,  223, 210, 226, 205, 135, 197, 5,   16,  69,  92,  186, 191, 202, 155, 229,
+    110, 1,  0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  236, 0,
+    0,   0,  64,  0,   0,   0,   59,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,
+    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,
+    0,   56, 0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,
+    0,   0,  2,   64,  0,   0,   0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  0,
+    0,   0,  0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,  0,   0,   27,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,  0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,
+    0,   0,  1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,
+    0,   0,  0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,  0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgba_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgba_2darray_ps.h
index 8d18cee..b2f8221 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgba_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgba_2darray_ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_PM_RGBA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_pm_rgba_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)

-round_ne r0.xyzw, r0.xyzw

-ftoi o0.xyzw, r0.xyzw

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_PM_RGBA_2DArray[] = {

-    68,  88,  66,  67,  87,  131, 227, 32,  225, 230, 151, 126, 121, 211, 132, 157, 16,  12,  99,

-    119, 1,   0,   0,   0,   52,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   184, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  16,  1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,   254, 66,  0,   0,

-    254, 66,  0,   0,   254, 66,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,

-    70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_PM_RGBA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_pm_rgba_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)
+round_ne r0.xyzw, r0.xyzw
+ftoi o0.xyzw, r0.xyzw
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_PM_RGBA_2DArray[] = {
+    68,  88,  66,  67,  87,  131, 227, 32,  225, 230, 151, 126, 121, 211, 132, 157, 16,  12,  99,
+    119, 1,   0,   0,   0,   52,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   184, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  16,  1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,   254, 66,  0,   0,
+    254, 66,  0,   0,   254, 66,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,
+    70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   3,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgba_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgba_3d_ps.h
index b05df5a..54bd284 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgba_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pm_rgba_3d_ps.h
@@ -1,89 +1,89 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_PM_RGBA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_pm_rgba_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)

-round_ne r0.xyzw, r0.xyzw

-ftoi o0.xyzw, r0.xyzw

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_PM_RGBA_3D[] = {

-    68,  88,  66,  67,  76,  57,  132, 133, 26,  119, 131, 55,  47,  147, 155, 129, 114, 58,  103,

-    131, 1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  216, 0,

-    0,   0,   64,  0,   0,   0,   54,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,

-    0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,

-    0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  0,

-    0,   254, 66,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,

-    0,   0,   0,   0,   27,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,

-    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_PM_RGBA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_pm_rgba_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)
+round_ne r0.xyzw, r0.xyzw
+ftoi o0.xyzw, r0.xyzw
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_PM_RGBA_3D[] = {
+    68,  88,  66,  67,  76,  57,  132, 133, 26,  119, 131, 55,  47,  147, 155, 129, 114, 58,  103,
+    131, 1,   0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  216, 0,
+    0,   0,   64,  0,   0,   0,   54,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,
+    0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,
+    0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  0,
+    0,   254, 66,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,
+    0,   0,   0,   0,   27,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,
+    0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgb_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgb_2darray_ps.h
index 672fb12..ff9a4fc 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgb_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgb_2darray_ps.h
@@ -1,95 +1,95 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_PT_RGB_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_pt_rgb_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-ftoi o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_PT_RGB_2DArray[] = {

-    68,  88,  66,  67,  222, 89,  121, 207, 53,  159, 15,  135, 134, 177, 156, 255, 37,  117, 152,

-    141, 1,   0,   0,   0,   44,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   176, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  8,   1,   0,   0,   64,  0,   0,   0,   66,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,

-    0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   0,   0,   64,  0,   0,

-    5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   27,  0,

-    0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,

-    0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,

-    62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_PT_RGB_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_pt_rgb_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+ftoi o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_PT_RGB_2DArray[] = {
+    68,  88,  66,  67,  222, 89,  121, 207, 53,  159, 15,  135, 134, 177, 156, 255, 37,  117, 152,
+    141, 1,   0,   0,   0,   44,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   176, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  8,   1,   0,   0,   64,  0,   0,   0,   66,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,
+    0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   0,   0,   64,  0,   0,
+    5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   27,  0,
+    0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,
+    0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,
+    62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgb_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgb_3d_ps.h
index 402d434..6e9b39d 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgb_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgb_3d_ps.h
@@ -1,89 +1,89 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_PT_RGB_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_pt_rgb_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-ftoi o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_PT_RGB_3D[] = {

-    68,  88, 66,  67,  43,  227, 90,  159, 144, 11,  2,   191, 69,  118, 253, 191, 58,  136, 178,

-    132, 1,  0,   0,   0,   240, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   116, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  208, 0,

-    0,   0,  64,  0,   0,   0,   52,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,

-    0,   0,  0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254,

-    66,  0,  0,   254, 66,  0,   0,   254, 66,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,

-    16,  0,  0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   114,

-    32,  16, 0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,

-    130, 32, 16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,

-    1,   83, 84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,  2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_PT_RGB_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_pt_rgb_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+ftoi o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_PT_RGB_3D[] = {
+    68,  88, 66,  67,  43,  227, 90,  159, 144, 11,  2,   191, 69,  118, 253, 191, 58,  136, 178,
+    132, 1,  0,   0,   0,   240, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   116, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  208, 0,
+    0,   0,  64,  0,   0,   0,   52,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,
+    0,   0,  0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254,
+    66,  0,  0,   254, 66,  0,   0,   254, 66,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,
+    16,  0,  0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   114,
+    32,  16, 0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,
+    130, 32, 16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,
+    1,   83, 84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,  2,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgba_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgba_2darray_ps.h
index 162d802..93fec30 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgba_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgba_2darray_ps.h
@@ -1,93 +1,93 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_PT_RGBA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_pt_rgba_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)

-round_ne r0.xyzw, r0.xyzw

-ftoi o0.xyzw, r0.xyzw

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_PT_RGBA_2DArray[] = {

-    68,  88,  66,  67,  148, 84,  9,   215, 25,  45,  131, 213, 232, 230, 51,  79,  128, 66,  45,

-    64,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  244, 0,   0,   0,   64,  0,   0,   0,   61,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242,

-    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,

-    0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  64,  0,   0,

-    5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   27,  0,

-    0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_PT_RGBA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_pt_rgba_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)
+round_ne r0.xyzw, r0.xyzw
+ftoi o0.xyzw, r0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_PT_RGBA_2DArray[] = {
+    68,  88,  66,  67,  148, 84,  9,   215, 25,  45,  131, 213, 232, 230, 51,  79,  128, 66,  45,
+    64,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  244, 0,   0,   0,   64,  0,   0,   0,   61,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242,
+    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,
+    0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  64,  0,   0,
+    5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   27,  0,
+    0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgba_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgba_3d_ps.h
index 0798d17..8618026 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgba_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_pt_rgba_3d_ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_PT_RGBA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_pt_rgba_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)

-round_ne r0.xyzw, r0.xyzw

-ftoi o0.xyzw, r0.xyzw

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_PT_RGBA_3D[] = {

-    68,  88, 66,  67,  32,  58,  93,  84,  232, 52,  147, 45,  185, 44,  249, 218, 171, 114, 58,

-    216, 1,  0,   0,   0,   220, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   96,  2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  188, 0,

-    0,   0,  64,  0,   0,   0,   47,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,

-    0,   0,  0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254,

-    66,  0,  0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  64,  0,   0,   5,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   242,

-    32,  16, 0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,

-    83,  84, 65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   2,  0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_PT_RGBA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_pt_rgba_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)
+round_ne r0.xyzw, r0.xyzw
+ftoi o0.xyzw, r0.xyzw
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_PT_RGBA_3D[] = {
+    68,  88, 66,  67,  32,  58,  93,  84,  232, 52,  147, 45,  185, 44,  249, 218, 171, 114, 58,
+    216, 1,  0,   0,   0,   220, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   96,  2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  188, 0,
+    0,   0,  64,  0,   0,   0,   47,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,
+    0,   0,  0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254,
+    66,  0,  0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  64,  0,   0,   5,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   242,
+    32,  16, 0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,
+    83,  84, 65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   2,  0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgb_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgb_2darray_ps.h
index 62275e4..b9ffff9 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgb_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgb_2darray_ps.h
@@ -1,103 +1,103 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_UM_RGB_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_um_rgb_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-ftoi o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 11 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_UM_RGB_2DArray[] = {

-    68,  88,  66,  67,  255, 151, 44,  91,  195, 98,  212, 246, 231, 76,  145, 99,  52,  104, 88,

-    255, 1,   0,   0,   0,   136, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   12,  3,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  100, 1,   0,   0,   64,  0,   0,   0,   89,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,

-    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,

-    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254,

-    66,  0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,

-    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   114,

-    32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,

-    130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,

-    1,   83,  84,  65,  84,  116, 0,   0,   0,   11,  0,   0,   0,   2,   0,   0,   0,   0,   0,

-    0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   3,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_UM_RGB_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_um_rgb_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+ftoi o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 11 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_UM_RGB_2DArray[] = {
+    68,  88,  66,  67,  255, 151, 44,  91,  195, 98,  212, 246, 231, 76,  145, 99,  52,  104, 88,
+    255, 1,   0,   0,   0,   136, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   12,  3,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  100, 1,   0,   0,   64,  0,   0,   0,   89,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,
+    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,
+    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254,
+    66,  0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,
+    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   114,
+    32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,
+    130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,
+    1,   83,  84,  65,  84,  116, 0,   0,   0,   11,  0,   0,   0,   2,   0,   0,   0,   0,   0,
+    0,   0,   3,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   3,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgb_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgb_3d_ps.h
index ea2277f..30c03e1 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgb_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgb_3d_ps.h
@@ -1,97 +1,97 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_UM_RGB_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_um_rgb_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-ftoi o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_UM_RGB_3D[] = {

-    68,  88, 66,  67,  228, 27,  253, 8,   117, 139, 69,  193, 51,  55,  44,  74,  19,  61,  157,

-    116, 1,  0,   0,   0,   76,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   208, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  44,  1,

-    0,   0,  64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,

-    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,

-    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,

-    70,  2,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,

-    0,   70, 2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,

-    254, 66, 0,   0,   254, 66,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,

-    0,   0,  0,   70,  2,   16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   114, 32,  16,  0,

-    0,   0,  0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,

-    0,   0,  0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,

-    65,  84, 116, 0,   0,   0,   9,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,

-    0,   0,  0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_UM_RGB_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_um_rgb_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyz, r0.xyzx, l(127.000000, 127.000000, 127.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+ftoi o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_UM_RGB_3D[] = {
+    68,  88, 66,  67,  228, 27,  253, 8,   117, 139, 69,  193, 51,  55,  44,  74,  19,  61,  157,
+    116, 1,  0,   0,   0,   76,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   208, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  44,  1,
+    0,   0,  64,  0,   0,   0,   75,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,
+    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,
+    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,
+    70,  2,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,
+    0,   70, 2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,
+    254, 66, 0,   0,   254, 66,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,
+    0,   0,  0,   70,  2,   16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   114, 32,  16,  0,
+    0,   0,  0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,
+    0,   0,  0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,
+    65,  84, 116, 0,   0,   0,   9,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,
+    0,   0,  0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgba_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgba_2darray_ps.h
index dc929d9..a4f4b86 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgba_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgba_2darray_ps.h
@@ -1,101 +1,101 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_UM_RGBA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_um_rgba_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)

-round_ne r0.xyzw, r0.xyzw

-ftoi o0.xyzw, r0.xyzw

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_UM_RGBA_2DArray[] = {

-    68,  88,  66,  67,  18,  73,  236, 141, 229, 245, 37,  44,  233, 175, 83,  206, 219, 9,   226,

-    133, 1,   0,   0,   0,   116, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   248, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  80,  1,   0,   0,   64,  0,   0,   0,   84,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,

-    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,

-    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254,

-    66,  0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  64,  0,   0,   5,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   242,

-    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_UM_RGBA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_um_rgba_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)
+round_ne r0.xyzw, r0.xyzw
+ftoi o0.xyzw, r0.xyzw
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_UM_RGBA_2DArray[] = {
+    68,  88,  66,  67,  18,  73,  236, 141, 229, 245, 37,  44,  233, 175, 83,  206, 219, 9,   226,
+    133, 1,   0,   0,   0,   116, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   248, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  80,  1,   0,   0,   64,  0,   0,   0,   84,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,
+    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,
+    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254,
+    66,  0,   0,   254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  64,  0,   0,   5,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   242,
+    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgba_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgba_3d_ps.h
index 8f0eacf..2d31e31 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgba_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftoi_um_rgba_3d_ps.h
@@ -1,95 +1,95 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoI_UM_RGBA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftoi_um_rgba_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)

-round_ne r0.xyzw, r0.xyzw

-ftoi o0.xyzw, r0.xyzw

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoI_UM_RGBA_3D[] = {

-    68,  88,  66,  67,  242, 33,  254, 63,  245, 177, 165, 63,  135, 115, 166, 217, 149, 184, 138,

-    167, 1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  24,  1,

-    0,   0,   64,  0,   0,   0,   70,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,

-    0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,

-    0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,

-    70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,

-    0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,

-    254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  64,  0,   0,   5,   242, 0,   16,  0,   0,

-    0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   242, 32,  16,  0,

-    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   2,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoI_UM_RGBA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftoi_um_rgba_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(127.000000, 127.000000, 127.000000, 127.000000)
+round_ne r0.xyzw, r0.xyzw
+ftoi o0.xyzw, r0.xyzw
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoI_UM_RGBA_3D[] = {
+    68,  88,  66,  67,  242, 33,  254, 63,  245, 177, 165, 63,  135, 115, 166, 217, 149, 184, 138,
+    167, 1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  24,  1,
+    0,   0,   64,  0,   0,   0,   70,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,
+    0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,
+    0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,
+    70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,
+    0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   254, 66,  0,   0,
+    254, 66,  0,   0,   254, 66,  0,   0,   254, 66,  64,  0,   0,   5,   242, 0,   16,  0,   0,
+    0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   27,  0,   0,   5,   242, 32,  16,  0,
+    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   2,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_2d_ps.h
index eaf82cf..6bbafe8 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_2d_ps.h
@@ -1,86 +1,86 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PM_RGB_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pm_rgb_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)

-ftou o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PM_RGB_2D[] = {

-    68,  88,  66,  67,  20,  77,  110, 129, 29,  108, 27,  35,  238, 173, 7,   238, 54,  53,  120,

-    204, 1,   0,   0,   0,   196, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   72,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  216, 0,   0,   0,   64,  0,   0,   0,   54,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    7,   114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,

-    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,

-    2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,

-    0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,

-    0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116,

-    0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PM_RGB_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pm_rgb_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)
+ftou o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PM_RGB_2D[] = {
+    68,  88,  66,  67,  20,  77,  110, 129, 29,  108, 27,  35,  238, 173, 7,   238, 54,  53,  120,
+    204, 1,   0,   0,   0,   196, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   72,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  216, 0,   0,   0,   64,  0,   0,   0,   54,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    7,   114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,
+    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,
+    2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,
+    0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,
+    0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116,
+    0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_2darray_ps.h
index 402a9d6..decebdd 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_2darray_ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PM_RGB_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pm_rgb_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)

-ftou o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PM_RGB_2DArray[] = {

-    68,  88,  66,  67,  54,  224, 65,  196, 66,  244, 119, 251, 192, 102, 250, 25,  134, 201, 171,

-    166, 1,   0,   0,   0,   52,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   184, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  16,  1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,

-    127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,

-    2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,

-    1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PM_RGB_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pm_rgb_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)
+ftou o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PM_RGB_2DArray[] = {
+    68,  88,  66,  67,  54,  224, 65,  196, 66,  244, 119, 251, 192, 102, 250, 25,  134, 201, 171,
+    166, 1,   0,   0,   0,   52,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   184, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  16,  1,   0,   0,   64,  0,   0,   0,   68,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,
+    127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,
+    2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,
+    1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_3d_ps.h
index ae3cbf6..0480272 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgb_3d_ps.h
@@ -1,89 +1,89 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PM_RGB_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pm_rgb_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)

-ftou o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PM_RGB_3D[] = {

-    68,  88, 66,  67,  20,  187, 213, 234, 155, 214, 102, 203, 113, 47,  28,  231, 206, 171, 185,

-    96,  1,  0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  216, 0,

-    0,   0,  64,  0,   0,   0,   54,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,

-    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,

-    0,   56, 0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,

-    0,   0,  2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,

-    0,   0,  0,   28,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,  0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,

-    0,   1,  0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,

-    0,   0,  1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PM_RGB_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pm_rgb_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)
+ftou o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PM_RGB_3D[] = {
+    68,  88, 66,  67,  20,  187, 213, 234, 155, 214, 102, 203, 113, 47,  28,  231, 206, 171, 185,
+    96,  1,  0,   0,   0,   248, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   124, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  216, 0,
+    0,   0,  64,  0,   0,   0,   54,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,
+    0,   0,  0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,
+    0,   56, 0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,
+    0,   0,  2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,
+    0,   0,  0,   28,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,  0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,
+    0,   1,  0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,
+    0,   0,  1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_2d_ps.h
index 65fbc6e..eecab30 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_2d_ps.h
@@ -1,84 +1,84 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PM_RGBA_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pm_rgba_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)

-ftou o0.xyzw, r0.xyzw

-ret

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PM_RGBA_2D[] = {

-    68,  88,  66,  67,  93,  192, 148, 235, 21,  122, 15,  156, 33,  238, 227, 9,  210, 97,  80,

-    205, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   52,  2,   0,   0,   82,  68, 69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,

-    72,  68,  82,  196, 0,   0,   0,   64,  0,   0,   0,   49,  0,   0,   0,   90, 0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,  0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  56,  0,   0,

-    7,   114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,  0,   70,  2,

-    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,  0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,  0,   127, 67,

-    0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,  16,  0,  0,   0,   0,

-    0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65, 84,  116, 0,

-    0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,  0,   0,   2,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PM_RGBA_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pm_rgba_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)
+ftou o0.xyzw, r0.xyzw
+ret
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PM_RGBA_2D[] = {
+    68,  88,  66,  67,  93,  192, 148, 235, 21,  122, 15,  156, 33,  238, 227, 9,  210, 97,  80,
+    205, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   52,  2,   0,   0,   82,  68, 69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,
+    72,  68,  82,  196, 0,   0,   0,   64,  0,   0,   0,   49,  0,   0,   0,   90, 0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,  0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  56,  0,   0,
+    7,   114, 0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,  0,   70,  2,
+    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,  0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,  0,   127, 67,
+    0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,  16,  0,  0,   0,   0,
+    0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65, 84,  116, 0,
+    0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,  0,   0,   2,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_2darray_ps.h
index f0a451f..f96c032 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_2darray_ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PM_RGBA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pm_rgba_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)

-ftou o0.xyzw, r0.xyzw

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PM_RGBA_2DArray[] = {

-    68,  88,  66,  67,  42,  244, 142, 225, 76,  161, 113, 194, 50,  71,  173, 250, 202, 155, 165,

-    106, 1,   0,   0,   0,   32,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   164, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  252, 0,   0,   0,   64,  0,   0,   0,   63,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,

-    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,

-    127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PM_RGBA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pm_rgba_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)
+ftou o0.xyzw, r0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PM_RGBA_2DArray[] = {
+    68,  88,  66,  67,  42,  244, 142, 225, 76,  161, 113, 194, 50,  71,  173, 250, 202, 155, 165,
+    106, 1,   0,   0,   0,   32,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   164, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  252, 0,   0,   0,   64,  0,   0,   0,   63,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114,
+    0,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,
+    127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_3d_ps.h
index d9fad28..47204f6 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pm_rgba_3d_ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PM_RGBA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pm_rgba_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.wwww, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)

-ftou o0.xyzw, r0.xyzw

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PM_RGBA_3D[] = {

-    68,  88,  66,  67,  5,   232, 61,  27,  145, 8,   233, 211, 47,  61,  219, 94,  35,  252, 253,

-    81,  1,   0,   0,   0,   228, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   104, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  196, 0,

-    0,   0,   64,  0,   0,   0,   49,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,

-    0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,

-    0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,

-    0,   127, 67,  28,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,

-    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PM_RGBA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pm_rgba_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.wwww, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)
+ftou o0.xyzw, r0.xyzw
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PM_RGBA_3D[] = {
+    68,  88,  66,  67,  5,   232, 61,  27,  145, 8,   233, 211, 47,  61,  219, 94,  35,  252, 253,
+    81,  1,   0,   0,   0,   228, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   104, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  196, 0,
+    0,   0,   64,  0,   0,   0,   49,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,
+    0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,
+    0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,
+    0,   127, 67,  28,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,
+    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   2,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_2d_ps.h
index d6c7a7e..b032b9b 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_2d_ps.h
@@ -1,83 +1,83 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PT_RGB_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pt_rgb_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)

-ftou o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PT_RGB_2D[] = {

-    68,  88,  66,  67,  239, 19,  57,  191, 36,  138, 64,  19,  35,  8,   170, 114, 160, 146, 147,

-    152, 1,   0,   0,   0,   168, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   44,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  188, 0,   0,   0,   64,  0,   0,   0,   47,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,

-    0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,

-    54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,

-    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PT_RGB_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pt_rgb_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)
+ftou o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PT_RGB_2D[] = {
+    68,  88,  66,  67,  239, 19,  57,  191, 36,  138, 64,  19,  35,  8,   170, 114, 160, 146, 147,
+    152, 1,   0,   0,   0,   168, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   44,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  188, 0,   0,   0,   64,  0,   0,   0,   47,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,
+    0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,
+    54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,
+    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_2darray_ps.h
index e8a7608..11e56cb 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_2darray_ps.h
@@ -1,93 +1,93 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PT_RGB_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pt_rgb_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)

-ftou o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PT_RGB_2DArray[] = {

-    68,  88,  66,  67,  138, 251, 49,  113, 99,  115, 227, 181, 77,  108, 206, 221, 48,  181, 111,

-    115, 1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  244, 0,   0,   0,   64,  0,   0,   0,   61,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,

-    0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,

-    5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,

-    0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PT_RGB_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pt_rgb_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)
+ftou o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PT_RGB_2DArray[] = {
+    68,  88,  66,  67,  138, 251, 49,  113, 99,  115, 227, 181, 77,  108, 206, 221, 48,  181, 111,
+    115, 1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  244, 0,   0,   0,   64,  0,   0,   0,   61,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,
+    0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,
+    5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,
+    0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_3d_ps.h
index a817b31..b6c37cb 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgb_3d_ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PT_RGB_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pt_rgb_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)

-ftou o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PT_RGB_3D[] = {

-    68,  88, 66,  67,  230, 86,  10,  151, 92,  97,  109, 198, 34,  46,  73,  109, 246, 243, 56,

-    31,  1,  0,   0,   0,   220, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   96,  2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  188, 0,

-    0,   0,  64,  0,   0,   0,   47,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,

-    0,   0,  0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127,

-    67,  0,  0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,

-    16,  0,  0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130,

-    32,  16, 0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,

-    83,  84, 65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   2,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PT_RGB_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pt_rgb_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)
+ftou o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PT_RGB_3D[] = {
+    68,  88, 66,  67,  230, 86,  10,  151, 92,  97,  109, 198, 34,  46,  73,  109, 246, 243, 56,
+    31,  1,  0,   0,   0,   220, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   96,  2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  188, 0,
+    0,   0,  64,  0,   0,   0,   47,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,
+    0,   0,  0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127,
+    67,  0,  0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,
+    16,  0,  0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130,
+    32,  16, 0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,
+    83,  84, 65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   2,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_2d_ps.h
index 7ccc7d3..d563857 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_2d_ps.h
@@ -1,81 +1,81 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PT_RGBA_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pt_rgba_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)

-ftou o0.xyzw, r0.xyzw

-ret

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PT_RGBA_2D[] = {

-    68,  88,  66,  67,  220, 98,  155, 50,  254, 144, 222, 163, 64,  196, 167, 225, 13,  4,   27,

-    185, 1,   0,   0,   0,   148, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   24,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  168, 0,   0,   0,   64,  0,   0,   0,   42,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,

-    10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,

-    0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,

-    62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PT_RGBA_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pt_rgba_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)
+ftou o0.xyzw, r0.xyzw
+ret
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PT_RGBA_2D[] = {
+    68,  88,  66,  67,  220, 98,  155, 50,  254, 144, 222, 163, 64,  196, 167, 225, 13,  4,   27,
+    185, 1,   0,   0,   0,   148, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   24,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  168, 0,   0,   0,   64,  0,   0,   0,   42,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,
+    10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,
+    0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,
+    62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_2darray_ps.h
index c735b09..519a857 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_2darray_ps.h
@@ -1,91 +1,91 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PT_RGBA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pt_rgba_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)

-ftou o0.xyzw, r0.xyzw

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PT_RGBA_2DArray[] = {

-    68,  88,  66,  67,  0,   99,  216, 74,  193, 89,  188, 62,  67,  114, 133, 110, 172, 170, 220,

-    250, 1,   0,   0,   0,   4,   3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   136, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  224, 0,   0,   0,   64,  0,   0,   0,   56,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242,

-    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,

-    0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,

-    5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,

-    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PT_RGBA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pt_rgba_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)
+ftou o0.xyzw, r0.xyzw
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PT_RGBA_2DArray[] = {
+    68,  88,  66,  67,  0,   99,  216, 74,  193, 89,  188, 62,  67,  114, 133, 110, 172, 170, 220,
+    250, 1,   0,   0,   0,   4,   3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   136, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  224, 0,   0,   0,   64,  0,   0,   0,   56,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242,
+    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,
+    0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,
+    5,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,
+    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_3d_ps.h
index eb0e7ce..ed52359 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_pt_rgba_3d_ps.h
@@ -1,85 +1,85 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_PT_RGBA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_pt_rgba_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)

-ftou o0.xyzw, r0.xyzw

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_PT_RGBA_3D[] = {

-    68,  88, 66,  67,  140, 33,  31,  103, 96,  28,  78,  196, 234, 153, 58,  158, 176, 167, 230,

-    238, 1,  0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   76,  2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  168, 0,

-    0,   0,  64,  0,   0,   0,   42,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,

-    0,   0,  0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127,

-    67,  0,  0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,

-    16,  0,  0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,

-    84,  65, 84,  116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_PT_RGBA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_pt_rgba_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)
+ftou o0.xyzw, r0.xyzw
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_PT_RGBA_3D[] = {
+    68,  88, 66,  67,  140, 33,  31,  103, 96,  28,  78,  196, 234, 153, 58,  158, 176, 167, 230,
+    238, 1,  0,   0,   0,   200, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   76,  2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  168, 0,
+    0,   0,  64,  0,   0,   0,   42,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,
+    0,   0,  0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127,
+    67,  0,  0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,
+    16,  0,  0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,
+    84,  65, 84,  116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_2d_ps.h
index 03c16ca..2531db2 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_2d_ps.h
@@ -1,91 +1,91 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_UM_RGB_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_um_rgb_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)

-ftou o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_UM_RGB_2D[] = {

-    68,  88,  66,  67,  114, 138, 59,  173, 45,  10,  93,  45,  253, 137, 191, 45, 53,  32,  34,

-    110, 1,   0,   0,   0,   4,   3,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   136, 2,   0,   0,   82,  68, 69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,

-    72,  68,  82,  24,  1,   0,   0,   64,  0,   0,   0,   70,  0,   0,   0,   90, 0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,  0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,  0,   0,   6,

-    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55, 0,   0,   9,

-    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,  150, 7,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,  10,  114, 0,

-    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64, 0,   0,   0,

-    0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28, 0,   0,   5,

-    114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54,  0,   0,

-    5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,  0,   62,  0,

-    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,  0,   0,   0,

-    0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,  0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_UM_RGB_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_um_rgb_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)
+ftou o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_UM_RGB_2D[] = {
+    68,  88,  66,  67,  114, 138, 59,  173, 45,  10,  93,  45,  253, 137, 191, 45, 53,  32,  34,
+    110, 1,   0,   0,   0,   4,   3,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   136, 2,   0,   0,   82,  68, 69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,  3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,  0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13, 0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70, 0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,
+    72,  68,  82,  24,  1,   0,   0,   64,  0,   0,   0,   70,  0,   0,   0,   90, 0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,  0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,  0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,  0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,  0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,  49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,  0,   0,   6,
+    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55, 0,   0,   9,
+    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,  150, 7,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,  10,  114, 0,
+    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64, 0,   0,   0,
+    0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28, 0,   0,   5,
+    114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54,  0,   0,
+    5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,  0,   62,  0,
+    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,  0,   0,   0,
+    0,   0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,  0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_2darray_ps.h
index 8540d07..361ceff 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_2darray_ps.h
@@ -1,101 +1,101 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_UM_RGB_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_um_rgb_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)

-ftou o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_UM_RGB_2DArray[] = {

-    68,  88,  66,  67,  34,  166, 61,  121, 63,  205, 72,  128, 217, 151, 52,  241, 20,  136, 182,

-    226, 1,   0,   0,   0,   116, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   248, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  80,  1,   0,   0,   64,  0,   0,   0,   84,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,

-    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,

-    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127,

-    67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,

-    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130,

-    32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_UM_RGB_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_um_rgb_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)
+ftou o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_UM_RGB_2DArray[] = {
+    68,  88,  66,  67,  34,  166, 61,  121, 63,  205, 72,  128, 217, 151, 52,  241, 20,  136, 182,
+    226, 1,   0,   0,   0,   116, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   248, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  80,  1,   0,   0,   64,  0,   0,   0,   84,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,
+    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,
+    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127,
+    67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,
+    16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130,
+    32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_3d_ps.h
index e607a53..5eb39dd 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgb_3d_ps.h
@@ -1,95 +1,95 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_UM_RGB_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_um_rgb_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)

-ftou o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_UM_RGB_3D[] = {

-    68,  88,  66,  67,  90,  1,   145, 37,  152, 68,  18,  98,  175, 189, 182, 166, 152, 58,  224,

-    12,  1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  24,  1,

-    0,   0,   64,  0,   0,   0,   70,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,

-    0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,

-    0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,

-    70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,

-    127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,  16,  0,   0,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_UM_RGB_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_um_rgb_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000)
+ftou o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_UM_RGB_3D[] = {
+    68,  88,  66,  67,  90,  1,   145, 37,  152, 68,  18,  98,  175, 189, 182, 166, 152, 58,  224,
+    12,  1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,   104, 1,   0,   0,   156, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  24,  1,
+    0,   0,   64,  0,   0,   0,   70,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,
+    0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,
+    0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,
+    70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,
+    127, 67,  0,   0,   127, 67,  0,   0,   0,   0,   28,  0,   0,   5,   114, 32,  16,  0,   0,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   8,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_2d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_2d_ps.h
index 3dd6e62..336a896 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_2d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_2d_ps.h
@@ -1,89 +1,89 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_UM_RGBA_2D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_um_rgba_2d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float

-// TEXCOORD                 0   xy          1     NONE  float   xy

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)

-ftou o0.xyzw, r0.xyzw

-ret

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_UM_RGBA_2D[] = {

-    68,  88,  66,  67,  168, 0,   97,  230, 108, 173, 2,   154, 44,  146, 249, 246, 158, 213, 153,

-    180, 1,   0,   0,   0,   240, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   116, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,

-    72,  68,  82,  4,   1,   0,   0,   64,  0,   0,   0,   65,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,

-    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,

-    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,

-    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,

-    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,

-    0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,

-    242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,

-    1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   2,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_UM_RGBA_2D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_um_rgba_2d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float
+// TEXCOORD                 0   xy          1     NONE  float   xy
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)
+ftou o0.xyzw, r0.xyzw
+ret
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_UM_RGBA_2D[] = {
+    68,  88,  66,  67,  168, 0,   97,  230, 108, 173, 2,   154, 44,  146, 249, 246, 158, 213, 153,
+    180, 1,   0,   0,   0,   240, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   116, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,
+    72,  68,  82,  4,   1,   0,   0,   64,  0,   0,   0,   65,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,
+    7,   18,  0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,
+    9,   16,  0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,
+    114, 0,   16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,
+    0,   1,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,
+    0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,
+    242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,
+    1,   83,  84,  65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   2,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_2darray_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_2darray_ps.h
index 66c0a82..adf8403 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_2darray_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_2darray_ps.h
@@ -1,99 +1,99 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_UM_RGBA_2DArray /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_um_rgba_2darray_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_2DArray                  texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 2

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)

-ftou o0.xyzw, r0.xyzw

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_UM_RGBA_2DArray[] = {

-    68,  88,  66,  67,  222, 115, 245, 233, 95,  182, 197, 189, 41,  105, 31,  89,  140, 176, 0,

-    87,  1,   0,   0,   0,   96,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,

-    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   228, 2,   0,   0,   82,  68,  69,  70,  168,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,

-    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,

-    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,

-    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,

-    68,  82,  60,  1,   0,   0,   64,  0,   0,   0,   79,  0,   0,   0,   90,  0,   0,   3,   0,

-    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,

-    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,

-    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,

-    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,

-    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,

-    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,

-    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,

-    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,

-    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127,

-    67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,

-    84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_UM_RGBA_2DArray /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_um_rgba_2darray_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_2DArray                  texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 2
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)
+ftou o0.xyzw, r0.xyzw
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_UM_RGBA_2DArray[] = {
+    68,  88,  66,  67,  222, 115, 245, 233, 95,  182, 197, 189, 41,  105, 31,  89,  140, 176, 0,
+    87,  1,   0,   0,   0,   96,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   228, 0,
+    0,   0,   108, 1,   0,   0,   160, 1,   0,   0,   228, 2,   0,   0,   82,  68,  69,  70,  168,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   117, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  50,  68,
+    65,  114, 114, 97,  121, 0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,
+    84,  73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,
+    84,  65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,
+    68,  82,  60,  1,   0,   0,   64,  0,   0,   0,   79,  0,   0,   0,   90,  0,   0,   3,   0,
+    96,  16,  0,   0,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,
+    85,  85,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   86,  0,   0,   5,   66,
+    0,   16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,
+    50,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,
+    9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,
+    0,   16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   14,  0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,
+    0,   0,   0,   0,   0,   246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,
+    16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,
+    0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127,
+    67,  0,   0,   127, 67,  0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,
+    84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   2,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_3d_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_3d_ps.h
index 0a8aef9..6c98014 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_3d_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/multiplyalpha_ftou_um_rgba_3d_ps.h
@@ -1,93 +1,93 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_FtoU_UM_RGBA_3D /T ps_4_0 /Fh

-//    compiled\multiplyalpha_ftou_um_rgba_3d_ps.h MultiplyAlpha.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF_3D                       texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 2

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-lt r1.x, l(0.000000), r0.w

-div r1.yzw, r0.xxyz, r0.wwww

-movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx

-mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)

-ftou o0.xyzw, r0.xyzw

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_FtoU_UM_RGBA_3D[] = {

-    68,  88, 66,  67,  211, 213, 129, 95,  158, 84,  47,  191, 113, 114, 198, 245, 188, 65,  31,

-    212, 1,  0,   0,   0,   36,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,

-    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   168, 2,   0,   0,   82,  68,  69,  70,  164,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,

-    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,

-    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,

-    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,

-    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,

-    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,

-    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,

-    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,

-    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  4,   1,

-    0,   0,  64,  0,   0,   0,   65,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,

-    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,

-    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,

-    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,

-    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,

-    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,

-    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,

-    70,  2,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,

-    0,   70, 14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,

-    127, 67, 0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,  16,  0,   0,

-    0,   0,  0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,  0,   0,   7,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   3,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,  0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_FtoU_UM_RGBA_3D /T ps_4_0 /Fh
+//    compiled\multiplyalpha_ftou_um_rgba_3d_ps.h MultiplyAlpha.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF_3D                       texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 2
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+lt r1.x, l(0.000000), r0.w
+div r1.yzw, r0.xxyz, r0.wwww
+movc r0.xyz, r1.xxxx, r1.yzwy, r0.xyzx
+mul r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000)
+ftou o0.xyzw, r0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_FtoU_UM_RGBA_3D[] = {
+    68,  88, 66,  67,  211, 213, 129, 95,  158, 84,  47,  191, 113, 114, 198, 245, 188, 65,  31,
+    212, 1,  0,   0,   0,   36,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   224, 0,
+    0,   0,  104, 1,   0,   0,   156, 1,   0,   0,   168, 2,   0,   0,   82,  68,  69,  70,  164,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,  255, 255, 0,   1,   0,   0,   112, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,  1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,  0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97, 109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  51,  68,
+    0,   77, 105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,
+    50,  57, 46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,
+    128, 0,  0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,
+    0,   1,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,
+    0,   0,  0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,  0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,  0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,
+    0,   83, 86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,
+    65,  89, 73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,
+    83,  71, 78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   83, 86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  4,   1,
+    0,   0,  64,  0,   0,   0,   65,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,  0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    98,  16, 0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,
+    0,   0,  0,   0,   0,   104, 0,   0,   2,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,
+    16,  0,  0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,  0,   0,   96,  16,  0,   0,   0,   0,   0,   49,  0,   0,   7,   18,  0,   16,  0,
+    1,   0,  0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,
+    0,   14, 0,   0,   7,   226, 0,   16,  0,   1,   0,   0,   0,   6,   9,   16,  0,   0,   0,
+    0,   0,  246, 15,  16,  0,   0,   0,   0,   0,   55,  0,   0,   9,   114, 0,   16,  0,   0,
+    0,   0,  0,   6,   0,   16,  0,   1,   0,   0,   0,   150, 7,   16,  0,   1,   0,   0,   0,
+    70,  2,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,
+    0,   70, 14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   127, 67,  0,   0,
+    127, 67, 0,   0,   127, 67,  0,   0,   127, 67,  28,  0,   0,   5,   242, 32,  16,  0,   0,
+    0,   0,  0,   70,  14,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,  0,   0,   7,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   3,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,  0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h
index 4dba0eb..36e6ddd 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E VS_Passthrough2D /T vs_4_0_level_9_3 /Fh

-//    compiled\passthrough2d11vs.h Passthrough2D11.hlsl

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// POSITION                 0   xy          0     NONE  float   xy  

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float   xyzw

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Runtime generated constant mappings:

-//

-// Target Reg                               Constant Description

-// ---------- --------------------------------------------------

-// c0                              Vertex Shader position offset

-//

-//

-// Level9 shader bytecode:

-//

-    vs_2_x

-    def c1, 0, 1, 0, 0

-    dcl_texcoord v0

-    dcl_texcoord1 v1

-    add oPos.xy, v0, c0

-    mov oPos.zw, c1.xyxy

-    mov oT0.xy, v1

-

-// approximately 3 instruction slots used

-vs_4_0

-dcl_input v0.xy

-dcl_input v1.xy

-dcl_output_siv o0.xyzw, position

-dcl_output o1.xy

-mov o0.xy, v0.xyxx

-mov o0.zw, l(0,0,0,1.000000)

-mov o1.xy, v1.xyxx

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_VS_Passthrough2D[] = {

-    68,  88,  66,  67,  156, 85,  202, 210, 211, 104, 132, 208, 180, 71,  55,  89,  176, 127, 12,

-    190, 1,   0,   0,   0,   216, 2,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   200, 0,

-    0,   0,   88,  1,   0,   0,   212, 1,   0,   0,   44,  2,   0,   0,   128, 2,   0,   0,   65,

-    111, 110, 57,  136, 0,   0,   0,   136, 0,   0,   0,   0,   2,   254, 255, 96,  0,   0,   0,

-    40,  0,   0,   0,   0,   0,   36,  0,   0,   0,   36,  0,   0,   0,   36,  0,   0,   0,   36,

-    0,   1,   0,   36,  0,   0,   0,   0,   0,   1,   2,   254, 255, 81,  0,   0,   5,   1,   0,

-    15,  160, 0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   31,

-    0,   0,   2,   5,   0,   0,   128, 0,   0,   15,  144, 31,  0,   0,   2,   5,   0,   1,   128,

-    1,   0,   15,  144, 2,   0,   0,   3,   0,   0,   3,   192, 0,   0,   228, 144, 0,   0,   228,

-    160, 1,   0,   0,   2,   0,   0,   12,  192, 1,   0,   68,  160, 1,   0,   0,   2,   0,   0,

-    3,   224, 1,   0,   228, 144, 255, 255, 0,   0,   83,  72,  68,  82,  136, 0,   0,   0,   64,

-    0,   1,   0,   34,  0,   0,   0,   95,  0,   0,   3,   50,  16,  16,  0,   0,   0,   0,   0,

-    95,  0,   0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   103, 0,   0,   4,   242, 32,  16,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   101, 0,   0,   3,   50,  32,  16,  0,   1,   0,

-    0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   0,

-    0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  54,  0,   0,

-    5,   50,  32,  16,  0,   1,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,   62,  0,

-    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  80,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,   0,   4,

-    254, 255, 0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,

-    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,

-    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,

-    49,  0,   171, 171, 171, 73,  83,  71,  78,  76,  0,   0,   0,   2,   0,   0,   0,   8,   0,

-    0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   3,   3,   0,   0,   65,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   80,  79,  83,  73,  84,  73,  79,

-    78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 79,  83,  71,  78,  80,  0,

-    0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   12,  0,

-    0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,

-    82,  68,  0,   171, 171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E VS_Passthrough2D /T vs_4_0_level_9_3 /Fh
+//    compiled\passthrough2d11vs.h Passthrough2D11.hlsl
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// POSITION                 0   xy          0     NONE  float   xy  
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float   xyzw
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Runtime generated constant mappings:
+//
+// Target Reg                               Constant Description
+// ---------- --------------------------------------------------
+// c0                              Vertex Shader position offset
+//
+//
+// Level9 shader bytecode:
+//
+    vs_2_x
+    def c1, 0, 1, 0, 0
+    dcl_texcoord v0
+    dcl_texcoord1 v1
+    add oPos.xy, v0, c0
+    mov oPos.zw, c1.xyxy
+    mov oT0.xy, v1
+
+// approximately 3 instruction slots used
+vs_4_0
+dcl_input v0.xy
+dcl_input v1.xy
+dcl_output_siv o0.xyzw, position
+dcl_output o1.xy
+mov o0.xy, v0.xyxx
+mov o0.zw, l(0,0,0,1.000000)
+mov o1.xy, v1.xyxx
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_VS_Passthrough2D[] = {
+    68,  88,  66,  67,  156, 85,  202, 210, 211, 104, 132, 208, 180, 71,  55,  89,  176, 127, 12,
+    190, 1,   0,   0,   0,   216, 2,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   200, 0,
+    0,   0,   88,  1,   0,   0,   212, 1,   0,   0,   44,  2,   0,   0,   128, 2,   0,   0,   65,
+    111, 110, 57,  136, 0,   0,   0,   136, 0,   0,   0,   0,   2,   254, 255, 96,  0,   0,   0,
+    40,  0,   0,   0,   0,   0,   36,  0,   0,   0,   36,  0,   0,   0,   36,  0,   0,   0,   36,
+    0,   1,   0,   36,  0,   0,   0,   0,   0,   1,   2,   254, 255, 81,  0,   0,   5,   1,   0,
+    15,  160, 0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   31,
+    0,   0,   2,   5,   0,   0,   128, 0,   0,   15,  144, 31,  0,   0,   2,   5,   0,   1,   128,
+    1,   0,   15,  144, 2,   0,   0,   3,   0,   0,   3,   192, 0,   0,   228, 144, 0,   0,   228,
+    160, 1,   0,   0,   2,   0,   0,   12,  192, 1,   0,   68,  160, 1,   0,   0,   2,   0,   0,
+    3,   224, 1,   0,   228, 144, 255, 255, 0,   0,   83,  72,  68,  82,  136, 0,   0,   0,   64,
+    0,   1,   0,   34,  0,   0,   0,   95,  0,   0,   3,   50,  16,  16,  0,   0,   0,   0,   0,
+    95,  0,   0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   103, 0,   0,   4,   242, 32,  16,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   101, 0,   0,   3,   50,  32,  16,  0,   1,   0,
+    0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   0,
+    0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  54,  0,   0,
+    5,   50,  32,  16,  0,   1,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,   62,  0,
+    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  80,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,   0,   4,
+    254, 255, 0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116,
+    32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111,
+    109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,
+    49,  0,   171, 171, 171, 73,  83,  71,  78,  76,  0,   0,   0,   2,   0,   0,   0,   8,   0,
+    0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   3,   3,   0,   0,   65,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   80,  79,  83,  73,  84,  73,  79,
+    78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 79,  83,  71,  78,  80,  0,
+    0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   12,  0,
+    0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,
+    82,  68,  0,   171, 171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h
index c160ca7..b25aa0e 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h
@@ -1,95 +1,95 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E GS_Passthrough3D /T gs_4_0 /Fh compiled\passthrough3d11gs.h

-//    Passthrough3D11.hlsl

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float   xyzw

-// LAYER                    0   x           1     NONE   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float   xyzw

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-gs_4_0

-dcl_input_siv v[3][0].xyzw, position

-dcl_input v[3][1].x

-dcl_input v[3][2].xyz

-dcl_temps 1

-dcl_inputprimitive triangle 

-dcl_outputtopology trianglestrip 

-dcl_output_siv o0.xyzw, position

-dcl_output_siv o1.x, rendertarget_array_index

-dcl_output o2.xyz

-dcl_maxout 3

-mov r0.x, l(0)

-loop 

-  ige r0.y, r0.x, l(3)

-  breakc_nz r0.y

-  mov o0.xyzw, v[r0.x + 0][0].xyzw

-  mov o1.x, v[r0.x + 0][1].x

-  mov o2.xyz, v[r0.x + 0][2].xyzx

-  emit 

-  iadd r0.x, r0.x, l(1)

-endloop 

-ret 

-// Approximately 11 instruction slots used

-#endif

-

-const BYTE g_GS_Passthrough3D[] = {

-    68,  88,  66,  67, 180, 53, 93,  23, 14,  237, 172, 99,  214, 91,  125, 123, 81,  232, 165, 207,

-    1,   0,   0,   0,  72,  3,  0,   0,  5,   0,   0,   0,   52,  0,   0,   0,   140, 0,   0,   0,

-    0,   1,   0,   0,  136, 1,  0,   0,  204, 2,   0,   0,   82,  68,  69,  70,  80,  0,   0,   0,

-    0,   0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   28,  0,   0,   0,   0,   4,   83,  71,

-    0,   1,   0,   0,  28,  0,  0,   0,  77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,

-    41,  32,  72,  76, 83,  76, 32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57, 46,  50, 57,  46, 57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171,

-    73,  83,  71,  78, 108, 0,  0,   0,  3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,

-    0,   0,   0,   0,  1,   0,  0,   0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  15,  0,   0,

-    92,  0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    1,   1,   0,   0,  98,  0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    2,   0,   0,   0,  7,   7,  0,   0,  83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    76,  65,  89,  69, 82,  0,  84,  69, 88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,

-    128, 0,   0,   0,  3,   0,  0,   0,  8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,  3,   0,  0,   0,  0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,

-    0,   0,   0,   0,  4,   0,  0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   1,   14,  0,   0,

-    118, 0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   8,   0,   0,  83,  86, 95,  80, 79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,

-    69,  78,  68,  69, 82,  84, 65,  82, 71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69, 88,  67, 79,  79, 82,  68,  0,   171, 83,  72,  68,  82,  60,  1,   0,   0,

-    64,  0,   2,   0,  79,  0,  0,   0,  97,  0,   0,   5,   242, 16,  32,  0,   3,   0,   0,   0,

-    0,   0,   0,   0,  1,   0,  0,   0,  95,  0,   0,   4,   18,  16,  32,  0,   3,   0,   0,   0,

-    1,   0,   0,   0,  95,  0,  0,   4,  114, 16,  32,  0,   3,   0,   0,   0,   2,   0,   0,   0,

-    104, 0,   0,   2,  1,   0,  0,   0,  93,  24,  0,   1,   92,  40,  0,   1,   103, 0,   0,   4,

-    242, 32,  16,  0,  0,   0,  0,   0,  1,   0,   0,   0,   103, 0,   0,   4,   18,  32,  16,  0,

-    1,   0,   0,   0,  4,   0,  0,   0,  101, 0,   0,   3,   114, 32,  16,  0,   2,   0,   0,   0,

-    94,  0,   0,   2,  3,   0,  0,   0,  54,  0,   0,   5,   18,  0,   16,  0,   0,   0,   0,   0,

-    1,   64,  0,   0,  0,   0,  0,   0,  48,  0,   0,   1,   33,  0,   0,   7,   34,  0,   16,  0,

-    0,   0,   0,   0,  10,  0,  16,  0,  0,   0,   0,   0,   1,   64,  0,   0,   3,   0,   0,   0,

-    3,   0,   4,   3,  26,  0,  16,  0,  0,   0,   0,   0,   54,  0,   0,   7,   242, 32,  16,  0,

-    0,   0,   0,   0,  70,  30, 160, 0,  10,  0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   7,  18,  32, 16,  0,  1,   0,   0,   0,   10,  16,  160, 0,   10,  0,   16,  0,

-    0,   0,   0,   0,  1,   0,  0,   0,  54,  0,   0,   7,   114, 32,  16,  0,   2,   0,   0,   0,

-    70,  18,  160, 0,  10,  0,  16,  0,  0,   0,   0,   0,   2,   0,   0,   0,   19,  0,   0,   1,

-    30,  0,   0,   7,  18,  0,  16,  0,  0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,

-    1,   64,  0,   0,  1,   0,  0,   0,  22,  0,   0,   1,   62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,   0,   0,  11,  0,  0,   0,  1,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,

-    0,   0,   0,   0,  2,   0,  0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    11,  0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    5,   0,   0,   0,  3,   0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E GS_Passthrough3D /T gs_4_0 /Fh compiled\passthrough3d11gs.h
+//    Passthrough3D11.hlsl
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float   xyzw
+// LAYER                    0   x           1     NONE   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float   xyzw
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+gs_4_0
+dcl_input_siv v[3][0].xyzw, position
+dcl_input v[3][1].x
+dcl_input v[3][2].xyz
+dcl_temps 1
+dcl_inputprimitive triangle 
+dcl_outputtopology trianglestrip 
+dcl_output_siv o0.xyzw, position
+dcl_output_siv o1.x, rendertarget_array_index
+dcl_output o2.xyz
+dcl_maxout 3
+mov r0.x, l(0)
+loop 
+  ige r0.y, r0.x, l(3)
+  breakc_nz r0.y
+  mov o0.xyzw, v[r0.x + 0][0].xyzw
+  mov o1.x, v[r0.x + 0][1].x
+  mov o2.xyz, v[r0.x + 0][2].xyzx
+  emit 
+  iadd r0.x, r0.x, l(1)
+endloop 
+ret 
+// Approximately 11 instruction slots used
+#endif
+
+const BYTE g_GS_Passthrough3D[] = {
+    68,  88,  66,  67, 180, 53, 93,  23, 14,  237, 172, 99,  214, 91,  125, 123, 81,  232, 165, 207,
+    1,   0,   0,   0,  72,  3,  0,   0,  5,   0,   0,   0,   52,  0,   0,   0,   140, 0,   0,   0,
+    0,   1,   0,   0,  136, 1,  0,   0,  204, 2,   0,   0,   82,  68,  69,  70,  80,  0,   0,   0,
+    0,   0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   28,  0,   0,   0,   0,   4,   83,  71,
+    0,   1,   0,   0,  28,  0,  0,   0,  77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,
+    41,  32,  72,  76, 83,  76, 32,  83, 104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57, 46,  50, 57,  46, 57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171,
+    73,  83,  71,  78, 108, 0,  0,   0,  3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,
+    0,   0,   0,   0,  1,   0,  0,   0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  15,  0,   0,
+    92,  0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    1,   1,   0,   0,  98,  0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    2,   0,   0,   0,  7,   7,  0,   0,  83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    76,  65,  89,  69, 82,  0,  84,  69, 88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,
+    128, 0,   0,   0,  3,   0,  0,   0,  8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,  3,   0,  0,   0,  0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,
+    0,   0,   0,   0,  4,   0,  0,   0,  1,   0,   0,   0,   1,   0,   0,   0,   1,   14,  0,   0,
+    118, 0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   8,   0,   0,  83,  86, 95,  80, 79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,
+    69,  78,  68,  69, 82,  84, 65,  82, 71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69, 88,  67, 79,  79, 82,  68,  0,   171, 83,  72,  68,  82,  60,  1,   0,   0,
+    64,  0,   2,   0,  79,  0,  0,   0,  97,  0,   0,   5,   242, 16,  32,  0,   3,   0,   0,   0,
+    0,   0,   0,   0,  1,   0,  0,   0,  95,  0,   0,   4,   18,  16,  32,  0,   3,   0,   0,   0,
+    1,   0,   0,   0,  95,  0,  0,   4,  114, 16,  32,  0,   3,   0,   0,   0,   2,   0,   0,   0,
+    104, 0,   0,   2,  1,   0,  0,   0,  93,  24,  0,   1,   92,  40,  0,   1,   103, 0,   0,   4,
+    242, 32,  16,  0,  0,   0,  0,   0,  1,   0,   0,   0,   103, 0,   0,   4,   18,  32,  16,  0,
+    1,   0,   0,   0,  4,   0,  0,   0,  101, 0,   0,   3,   114, 32,  16,  0,   2,   0,   0,   0,
+    94,  0,   0,   2,  3,   0,  0,   0,  54,  0,   0,   5,   18,  0,   16,  0,   0,   0,   0,   0,
+    1,   64,  0,   0,  0,   0,  0,   0,  48,  0,   0,   1,   33,  0,   0,   7,   34,  0,   16,  0,
+    0,   0,   0,   0,  10,  0,  16,  0,  0,   0,   0,   0,   1,   64,  0,   0,   3,   0,   0,   0,
+    3,   0,   4,   3,  26,  0,  16,  0,  0,   0,   0,   0,   54,  0,   0,   7,   242, 32,  16,  0,
+    0,   0,   0,   0,  70,  30, 160, 0,  10,  0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   7,  18,  32, 16,  0,  1,   0,   0,   0,   10,  16,  160, 0,   10,  0,   16,  0,
+    0,   0,   0,   0,  1,   0,  0,   0,  54,  0,   0,   7,   114, 32,  16,  0,   2,   0,   0,   0,
+    70,  18,  160, 0,  10,  0,  16,  0,  0,   0,   0,   0,   2,   0,   0,   0,   19,  0,   0,   1,
+    30,  0,   0,   7,  18,  0,  16,  0,  0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,
+    1,   64,  0,   0,  1,   0,  0,   0,  22,  0,   0,   1,   62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,   0,   0,  11,  0,  0,   0,  1,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,
+    0,   0,   0,   0,  2,   0,  0,   0,  0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    11,  0,   0,   0,  0,   0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    5,   0,   0,   0,  3,   0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h
index 8141a35..9eb05ca 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h
@@ -1,79 +1,79 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E VS_Passthrough3D /T vs_4_0 /Fh compiled\passthrough3d11vs.h

-//    Passthrough3D11.hlsl

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// POSITION                 0   xy          0     NONE  float   xy  

-// LAYER                    0   x           1     NONE   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float   xyzw

-// LAYER                    0   x           1     NONE   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-vs_4_0

-dcl_input v0.xy

-dcl_input v1.x

-dcl_input v2.xyz

-dcl_output_siv o0.xyzw, position

-dcl_output o1.x

-dcl_output o2.xyz

-mov o0.xy, v0.xyxx

-mov o0.zw, l(0,0,0,1.000000)

-mov o1.x, v1.x

-mov o2.xyz, v2.xyzx

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_VS_Passthrough3D[] = {

-    68,  88,  66,  67,  9,   205, 109, 150, 157, 96,  223, 251, 107, 10,  208, 179, 211, 20,  141,

-    130, 1,   0,   0,   0,   168, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 0,

-    0,   0,   252, 0,   0,   0,   112, 1,   0,   0,   44,  2,   0,   0,   82,  68,  69,  70,  80,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   254, 255, 0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111,

-    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,

-    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,

-    49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  104, 0,   0,   0,   3,   0,   0,   0,

-    8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   3,   3,   0,   0,   89,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   95,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   7,   0,   0,

-    80,  79,  83,  73,  84,  73,  79,  78,  0,   76,  65,  89,  69,  82,  0,   84,  69,  88,  67,

-    79,  79,  82,  68,  0,   79,  83,  71,  78,  108, 0,   0,   0,   3,   0,   0,   0,   8,   0,

-    0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   1,   0,   0,   0,   1,   14,  0,   0,   98,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   8,   0,   0,   83,  86,

-    95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   76,  65,  89,  69,  82,  0,   84,  69,  88,

-    67,  79,  79,  82,  68,  0,   171, 83,  72,  68,  82,  180, 0,   0,   0,   64,  0,   1,   0,

-    45,  0,   0,   0,   95,  0,   0,   3,   50,  16,  16,  0,   0,   0,   0,   0,   95,  0,   0,

-    3,   18,  16,  16,  0,   1,   0,   0,   0,   95,  0,   0,   3,   114, 16,  16,  0,   2,   0,

-    0,   0,   103, 0,   0,   4,   242, 32,  16,  0,   0,   0,   0,   0,   1,   0,   0,   0,   101,

-    0,   0,   3,   18,  32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   114, 32,  16,  0,

-    2,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  16,  16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  54,

-    0,   0,   5,   18,  32,  16,  0,   1,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,

-    54,  0,   0,   5,   114, 32,  16,  0,   2,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,

-    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E VS_Passthrough3D /T vs_4_0 /Fh compiled\passthrough3d11vs.h
+//    Passthrough3D11.hlsl
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// POSITION                 0   xy          0     NONE  float   xy  
+// LAYER                    0   x           1     NONE   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float   xyzw
+// LAYER                    0   x           1     NONE   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+vs_4_0
+dcl_input v0.xy
+dcl_input v1.x
+dcl_input v2.xyz
+dcl_output_siv o0.xyzw, position
+dcl_output o1.x
+dcl_output o2.xyz
+mov o0.xy, v0.xyxx
+mov o0.zw, l(0,0,0,1.000000)
+mov o1.x, v1.x
+mov o2.xyz, v2.xyzx
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_VS_Passthrough3D[] = {
+    68,  88,  66,  67,  9,   205, 109, 150, 157, 96,  223, 251, 107, 10,  208, 179, 211, 20,  141,
+    130, 1,   0,   0,   0,   168, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 0,
+    0,   0,   252, 0,   0,   0,   112, 1,   0,   0,   44,  2,   0,   0,   82,  68,  69,  70,  80,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   254, 255, 0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111,
+    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,
+    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,
+    49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  104, 0,   0,   0,   3,   0,   0,   0,
+    8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   3,   3,   0,   0,   89,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   95,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   7,   0,   0,
+    80,  79,  83,  73,  84,  73,  79,  78,  0,   76,  65,  89,  69,  82,  0,   84,  69,  88,  67,
+    79,  79,  82,  68,  0,   79,  83,  71,  78,  108, 0,   0,   0,   3,   0,   0,   0,   8,   0,
+    0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   1,   0,   0,   0,   1,   14,  0,   0,   98,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   8,   0,   0,   83,  86,
+    95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   76,  65,  89,  69,  82,  0,   84,  69,  88,
+    67,  79,  79,  82,  68,  0,   171, 83,  72,  68,  82,  180, 0,   0,   0,   64,  0,   1,   0,
+    45,  0,   0,   0,   95,  0,   0,   3,   50,  16,  16,  0,   0,   0,   0,   0,   95,  0,   0,
+    3,   18,  16,  16,  0,   1,   0,   0,   0,   95,  0,   0,   3,   114, 16,  16,  0,   2,   0,
+    0,   0,   103, 0,   0,   4,   242, 32,  16,  0,   0,   0,   0,   0,   1,   0,   0,   0,   101,
+    0,   0,   3,   18,  32,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   114, 32,  16,  0,
+    2,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  16,  16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  54,
+    0,   0,   5,   18,  32,  16,  0,   1,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,
+    54,  0,   0,   5,   114, 32,  16,  0,   2,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,
+    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   5,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrougha2d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrougha2d11ps.h
index 86e3399..267e759 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrougha2d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrougha2d11ps.h
@@ -1,108 +1,108 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughA2D /T ps_4_0_level_9_3 /Fh

-//    compiled\passthrougha2d11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    def c0, 0, 1, 0, 0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mul r0, r0.w, c0.xxxy

-    mov oC0, r0

-

-// approximately 3 instruction slots used (1 texture, 2 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mov o0.w, r0.w

-mov o0.xyz, l(0,0,0,0)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughA2D[] = {

-    68,  88,  66,  67,  17,  105, 185, 134, 195, 189, 174, 192, 122, 0,   85,  229, 126, 190, 30,

-    125, 1,   0,   0,   0,   36,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   204, 0,

-    0,   0,   116, 1,   0,   0,   240, 1,   0,   0,   152, 2,   0,   0,   240, 2,   0,   0,   65,

-    111, 110, 57,  140, 0,   0,   0,   140, 0,   0,   0,   0,   2,   255, 255, 100, 0,   0,   0,

-    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,

-    15,  160, 0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 5,   0,   0,   3,   0,   0,   15,  128, 0,   0,   255, 128, 0,   0,   64,  160, 1,   0,

-    0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,  72,  68,  82,  160,

-    0,   0,   0,   64,  0,   0,   0,   40,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,

-    0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,

-    0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242,

-    0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,

-    0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   114, 32,

-    16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,

-    0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,

-    92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,

-    0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,

-    0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116,

-    117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,

-    72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101,

-    114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,

-    83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,

-    0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,

-    69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,

-    1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,

-    71,  69,  84,  0,   171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughA2D /T ps_4_0_level_9_3 /Fh
+//    compiled\passthrougha2d11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 0, 1, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mul r0, r0.w, c0.xxxy
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.w, r0.w
+mov o0.xyz, l(0,0,0,0)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughA2D[] = {
+    68,  88,  66,  67,  17,  105, 185, 134, 195, 189, 174, 192, 122, 0,   85,  229, 126, 190, 30,
+    125, 1,   0,   0,   0,   36,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   204, 0,
+    0,   0,   116, 1,   0,   0,   240, 1,   0,   0,   152, 2,   0,   0,   240, 2,   0,   0,   65,
+    111, 110, 57,  140, 0,   0,   0,   140, 0,   0,   0,   0,   2,   255, 255, 100, 0,   0,   0,
+    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,
+    15,  160, 0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 5,   0,   0,   3,   0,   0,   15,  128, 0,   0,   255, 128, 0,   0,   64,  160, 1,   0,
+    0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,  72,  68,  82,  160,
+    0,   0,   0,   64,  0,   0,   0,   40,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,
+    0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,
+    0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242,
+    0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,
+    0,   0,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   114, 32,
+    16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,
+    0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,
+    92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,
+    0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,
+    0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116,
+    117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,
+    72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101,
+    114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,
+    83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,
+    0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,
+    69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,
+    1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,
+    71,  69,  84,  0,   171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h
index b49bda2..16bfaa7 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h
@@ -1,78 +1,78 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughDepth2D /T ps_4_0 /Fh

-//    compiled\passthroughdepth2d11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output oDepth

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mov oDepth, r0.x

-ret 

-// Approximately 3 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughDepth2D[] = {

-    68,  88,  66,  67,  18,  100, 210, 152, 138, 132, 5,   51,  93,  169, 189, 245, 32,  164, 14,

-    233, 1,   0,   0,   0,   100, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   232, 1,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,

-    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,

-    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255,

-    255, 255, 1,   14,  0,   0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 171, 171, 83,

-    72,  68,  82,  120, 0,   0,   0,   64,  0,   0,   0,   30,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   2,   1,   192, 0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242,

-    0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   4,   1,   192, 0,

-    0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughDepth2D /T ps_4_0 /Fh
+//    compiled\passthroughdepth2d11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_DEPTH                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output oDepth
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov oDepth, r0.x
+ret 
+// Approximately 3 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughDepth2D[] = {
+    68,  88,  66,  67,  18,  100, 210, 152, 138, 132, 5,   51,  93,  169, 189, 245, 32,  164, 14,
+    233, 1,   0,   0,   0,   100, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   232, 1,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,
+    2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,
+    86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255,
+    255, 255, 1,   14,  0,   0,   83,  86,  95,  68,  69,  80,  84,  72,  0,   171, 171, 171, 83,
+    72,  68,  82,  120, 0,   0,   0,   64,  0,   0,   0,   30,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   2,   1,   192, 0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242,
+    0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   4,   1,   192, 0,
+    0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h
index 7b641c9..72a111b 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h
@@ -1,107 +1,107 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughLum2D /T ps_4_0_level_9_3 /Fh

-//    compiled\passthroughlum2d11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    def c0, 1, 0, 0, 0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mad r0, r0.x, c0.xxxy, c0.yyyx

-    mov oC0, r0

-

-// approximately 3 instruction slots used (1 texture, 2 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mov o0.xyz, r0.xxxx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughLum2D[] = {

-    68,  88,  66,  67,  188, 225, 249, 227, 93,  195, 221, 6,   89,  16,  237, 173, 184, 245, 118,

-    123, 1,   0,   0,   0,   28,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   208, 0,

-    0,   0,   108, 1,   0,   0,   232, 1,   0,   0,   144, 2,   0,   0,   232, 2,   0,   0,   65,

-    111, 110, 57,  144, 0,   0,   0,   144, 0,   0,   0,   0,   2,   255, 255, 104, 0,   0,   0,

-    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,

-    15,  160, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   0,   128, 0,   0,   64,  160, 0,   0,

-    21,  160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,

-    72,  68,  82,  148, 0,   0,   0,   64,  0,   0,   0,   37,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,

-    5,   114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   0,   0,   0,   0,   54,  0,

-    0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  160, 0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,   0,

-    4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,   0,

-    0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,   83,

-    97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,

-    0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,

-    95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,

-    171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughLum2D /T ps_4_0_level_9_3 /Fh
+//    compiled\passthroughlum2d11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 1, 0, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0.x, c0.xxxy, c0.yyyx
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.xyz, r0.xxxx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLum2D[] = {
+    68,  88,  66,  67,  188, 225, 249, 227, 93,  195, 221, 6,   89,  16,  237, 173, 184, 245, 118,
+    123, 1,   0,   0,   0,   28,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   208, 0,
+    0,   0,   108, 1,   0,   0,   232, 1,   0,   0,   144, 2,   0,   0,   232, 2,   0,   0,   65,
+    111, 110, 57,  144, 0,   0,   0,   144, 0,   0,   0,   0,   2,   255, 255, 104, 0,   0,   0,
+    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,
+    15,  160, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   0,   128, 0,   0,   64,  160, 0,   0,
+    21,  160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,
+    72,  68,  82,  148, 0,   0,   0,   64,  0,   0,   0,   37,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,
+    5,   114, 32,  16,  0,   0,   0,   0,   0,   6,   0,   16,  0,   0,   0,   0,   0,   54,  0,
+    0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  160, 0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,   0,
+    4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,   0,
+    0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,   83,
+    97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,
+    0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,
+    95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,
+    171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2darray11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2darray11ps.h
index 418bf64..916d9d0 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2darray11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2darray11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughLum2DArray /T ps_4_0 /Fh

-//    compiled\passthroughlum2darray11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mov o0.xyz, r0.xxxx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughLum2DArray[] = {

-    68,  88,  66,  67,  48,  31,  236, 162, 56,  23,  109, 114, 250, 90,  80,  100, 160, 102, 228,

-    252, 1,   0,   0,   0,   232, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   108, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  204, 0,   0,   0,   64,  0,

-    0,   0,   51,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,

-    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,

-    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,

-    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,

-    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,

-    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   6,

-    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,

-    1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughLum2DArray /T ps_4_0 /Fh
+//    compiled\passthroughlum2darray11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mov o0.xyz, r0.xxxx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLum2DArray[] = {
+    68,  88,  66,  67,  48,  31,  236, 162, 56,  23,  109, 114, 250, 90,  80,  100, 160, 102, 228,
+    252, 1,   0,   0,   0,   232, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   108, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  204, 0,   0,   0,   64,  0,
+    0,   0,   51,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,
+    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,
+    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,
+    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,
+    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,
+    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   6,
+    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,
+    1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h
index fb2490e..1c307d4 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h
@@ -1,84 +1,84 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughLum3D /T ps_4_0 /Fh

-//    compiled\passthroughlum3d11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mov o0.xyz, r0.xxxx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughLum3D[] = {

-    68,  88,  66,  67,  189, 19,  141, 227, 229, 153, 47,  229, 108, 56,  120, 27,  139, 44,  214,

-    101, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  148, 0,   0,   0,   64,  0,

-    0,   0,   37,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,

-    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,

-    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,

-    6,   0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,

-    0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughLum3D /T ps_4_0 /Fh
+//    compiled\passthroughlum3d11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.xyz, r0.xxxx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLum3D[] = {
+    68,  88,  66,  67,  189, 19,  141, 227, 229, 153, 47,  229, 108, 56,  120, 27,  139, 44,  214,
+    101, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  148, 0,   0,   0,   64,  0,
+    0,   0,   37,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,
+    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,
+    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,
+    6,   0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,
+    0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h
index 9825e7a..58771dd 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h
@@ -1,103 +1,103 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughLumAlpha2D /T ps_4_0_level_9_3 /Fh

-//    compiled\passthroughlumalpha2d11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mov r0, r0.xxxw

-    mov oC0, r0

-

-// approximately 3 instruction slots used (1 texture, 2 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mov o0.xyzw, r0.xxxw

-ret 

-// Approximately 3 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughLumAlpha2D[] = {

-    68,  88,  66,  67,  123, 243, 206, 171, 140, 47,  129, 32,  9,   64,  73,  124, 19,  131, 17,

-    168, 1,   0,   0,   0,   232, 2,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   176, 0,

-    0,   0,   56,  1,   0,   0,   180, 1,   0,   0,   92,  2,   0,   0,   180, 2,   0,   0,   65,

-    111, 110, 57,  112, 0,   0,   0,   112, 0,   0,   0,   0,   2,   255, 255, 72,  0,   0,   0,

-    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 31,  0,   0,   2,   0,   0,

-    0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144, 0,   8,   15,  160, 66,

-    0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228, 160, 1,   0,   0,   2,

-    0,   0,   15,  128, 0,   0,   192, 128, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228,

-    128, 255, 255, 0,   0,   83,  72,  68,  82,  128, 0,   0,   0,   64,  0,   0,   0,   32,  0,

-    0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,

-    112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,

-    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,

-    2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,

-    16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,

-    0,   0,   0,   54,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   6,   12,  16,  0,

-    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   3,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,

-    68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,

-    28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,

-    0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,

-    13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101,

-    70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,

-    76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,

-    46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,

-    80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,

-    3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,

-    79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,

-    0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,

-    0,   171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughLumAlpha2D /T ps_4_0_level_9_3 /Fh
+//    compiled\passthroughlumalpha2d11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov r0, r0.xxxw
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.xyzw, r0.xxxw
+ret 
+// Approximately 3 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLumAlpha2D[] = {
+    68,  88,  66,  67,  123, 243, 206, 171, 140, 47,  129, 32,  9,   64,  73,  124, 19,  131, 17,
+    168, 1,   0,   0,   0,   232, 2,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   176, 0,
+    0,   0,   56,  1,   0,   0,   180, 1,   0,   0,   92,  2,   0,   0,   180, 2,   0,   0,   65,
+    111, 110, 57,  112, 0,   0,   0,   112, 0,   0,   0,   0,   2,   255, 255, 72,  0,   0,   0,
+    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 31,  0,   0,   2,   0,   0,
+    0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144, 0,   8,   15,  160, 66,
+    0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228, 160, 1,   0,   0,   2,
+    0,   0,   15,  128, 0,   0,   192, 128, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228,
+    128, 255, 255, 0,   0,   83,  72,  68,  82,  128, 0,   0,   0,   64,  0,   0,   0,   32,  0,
+    0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,
+    112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,
+    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,
+    2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,
+    16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,
+    0,   0,   0,   54,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   6,   12,  16,  0,
+    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   3,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,
+    68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,
+    28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,
+    0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,
+    13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101,
+    70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,
+    76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,
+    46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,
+    80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,
+    3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,
+    79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,
+    0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,
+    0,   171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2darray11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2darray11ps.h
index dae455f..9fe93ed 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2darray11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2darray11ps.h
@@ -1,88 +1,88 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughLumAlpha2DArray /T ps_4_0 /Fh

-//    compiled\passthroughlumalpha2darray11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mov o0.xyzw, r0.xxxw

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughLumAlpha2DArray[] = {

-    68,  88,  66,  67,  171, 126, 222, 213, 133, 151, 3,   160, 237, 58,  39,  228, 228, 109, 48,

-    150, 1,   0,   0,   0,   212, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   88,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  184, 0,   0,   0,   64,  0,

-    0,   0,   46,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,

-    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,

-    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,

-    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,

-    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,

-    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   6,

-    12,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughLumAlpha2DArray /T ps_4_0 /Fh
+//    compiled\passthroughlumalpha2darray11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mov o0.xyzw, r0.xxxw
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLumAlpha2DArray[] = {
+    68,  88,  66,  67,  171, 126, 222, 213, 133, 151, 3,   160, 237, 58,  39,  228, 228, 109, 48,
+    150, 1,   0,   0,   0,   212, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   88,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  184, 0,   0,   0,   64,  0,
+    0,   0,   46,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,
+    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,
+    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,
+    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,
+    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,
+    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,   6,
+    12,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h
index b6dcbee..adb47fe 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h
@@ -1,82 +1,82 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughLumAlpha3D /T ps_4_0 /Fh

-//    compiled\passthroughlumalpha3d11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mov o0.xyzw, r0.xxxw

-ret 

-// Approximately 3 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughLumAlpha3D[] = {

-    68,  88,  66,  67,  191, 137, 201, 175, 2,   158, 150, 52,  202, 186, 67,  28,  235, 67,  228,

-    244, 1,   0,   0,   0,   156, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   32,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  128, 0,   0,   0,   64,  0,

-    0,   0,   32,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,

-    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,

-    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,

-    6,   12,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughLumAlpha3D /T ps_4_0 /Fh
+//    compiled\passthroughlumalpha3d11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.xyzw, r0.xxxw
+ret 
+// Approximately 3 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLumAlpha3D[] = {
+    68,  88,  66,  67,  191, 137, 201, 175, 2,   158, 150, 52,  202, 186, 67,  28,  235, 67,  228,
+    244, 1,   0,   0,   0,   156, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   32,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  128, 0,   0,   0,   64,  0,
+    0,   0,   32,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,
+    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,
+    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   242, 32,  16,  0,   0,   0,   0,   0,
+    6,   12,  16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h
index 7219814..b6f4e8d 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h
@@ -1,108 +1,108 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughR2D /T ps_4_0_level_9_3 /Fh

-//    compiled\passthroughr2d11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    def c0, 1, 0, 0, 0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mad r0, r0.x, c0.xyyy, c0.yyyx

-    mov oC0, r0

-

-// approximately 3 instruction slots used (1 texture, 2 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mov o0.x, r0.x

-mov o0.yzw, l(0,0,0,1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughR2D[] = {

-    68,  88,  66,  67,  192, 5,   106, 26,  153, 118, 66,  122, 234, 139, 38,  125, 56,  165, 124,

-    152, 1,   0,   0,   0,   40,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   208, 0,

-    0,   0,   120, 1,   0,   0,   244, 1,   0,   0,   156, 2,   0,   0,   244, 2,   0,   0,   65,

-    111, 110, 57,  144, 0,   0,   0,   144, 0,   0,   0,   0,   2,   255, 255, 104, 0,   0,   0,

-    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,

-    15,  160, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   0,   128, 0,   0,   84,  160, 0,   0,

-    21,  160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,

-    72,  68,  82,  160, 0,   0,   0,   64,  0,   0,   0,   40,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,

-    5,   18,  32,  16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,

-    0,   8,   226, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,

-    109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,

-    0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,

-    0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,

-    84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,

-    40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109,

-    112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,

-    0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,

-    56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,

-    79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,

-    44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,

-    95,  84,  65,  82,  71,  69,  84,  0,   171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughR2D /T ps_4_0_level_9_3 /Fh
+//    compiled\passthroughr2d11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 1, 0, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0.x, c0.xyyy, c0.yyyx
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR2D[] = {
+    68,  88,  66,  67,  192, 5,   106, 26,  153, 118, 66,  122, 234, 139, 38,  125, 56,  165, 124,
+    152, 1,   0,   0,   0,   40,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   208, 0,
+    0,   0,   120, 1,   0,   0,   244, 1,   0,   0,   156, 2,   0,   0,   244, 2,   0,   0,   65,
+    111, 110, 57,  144, 0,   0,   0,   144, 0,   0,   0,   0,   2,   255, 255, 104, 0,   0,   0,
+    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,
+    15,  160, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   0,   128, 0,   0,   84,  160, 0,   0,
+    21,  160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,
+    72,  68,  82,  160, 0,   0,   0,   64,  0,   0,   0,   40,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,
+    5,   18,  32,  16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,
+    0,   8,   226, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,
+    109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,
+    0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,
+    0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,
+    84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,
+    40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109,
+    112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,
+    0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,
+    56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,
+    79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,
+    44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,
+    95,  84,  65,  82,  71,  69,  84,  0,   171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darray11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darray11ps.h
index b0d85b9..cac7073 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darray11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darray11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughR2DArray /T ps_4_0 /Fh

-//    compiled\passthroughr2darray11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mov o0.x, r0.x

-mov o0.yzw, l(0,0,0,1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughR2DArray[] = {

-    68, 88,  66,  67,  153, 98,  1,   143, 57,  155, 108, 8,   63,  182, 136, 234, 41, 243, 201,

-    84, 1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,

-    0,  0,   100, 1,   0,   0,   152, 1,   0,   0,   120, 2,   0,   0,   82,  68,  69, 70,  160,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,

-    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,

-    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   5,

-    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,

-    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,

-    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,

-    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,

-    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,

-    3,  0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,

-    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,

-    0,  0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,  0,   118,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,

-    7,  3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,

-    82, 69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,

-    68, 69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,

-    0,  0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,

-    0,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,

-    84, 65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  216, 0,   0,   0,  64,  0,

-    0,  0,   54,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,

-    64, 0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,  0,   4,

-    18, 16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50, 16,  16,

-    0,  2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,  104, 0,

-    0,  2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,  0,   10,

-    16, 16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,

-    70, 16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,  0,   0,

-    0,  70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,  0,   96,

-    16, 0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,  0,   10,

-    0,  16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,  0,   0,

-    2,  64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   128,

-    63, 62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,  1,   0,

-    0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,  0,   0,

-    0,  0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughR2DArray /T ps_4_0 /Fh
+//    compiled\passthroughr2darray11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR2DArray[] = {
+    68, 88,  66,  67,  153, 98,  1,   143, 57,  155, 108, 8,   63,  182, 136, 234, 41, 243, 201,
+    84, 1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,
+    0,  0,   100, 1,   0,   0,   152, 1,   0,   0,   120, 2,   0,   0,   82,  68,  69, 70,  160,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,
+    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,
+    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   5,
+    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,
+    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,
+    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,
+    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,
+    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,
+    3,  0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,
+    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,
+    0,  0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,  0,   118,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,
+    7,  3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,
+    82, 69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,
+    68, 69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,
+    0,  0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,
+    0,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,
+    84, 65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  216, 0,   0,   0,  64,  0,
+    0,  0,   54,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,
+    64, 0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,  0,   4,
+    18, 16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50, 16,  16,
+    0,  2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,  104, 0,
+    0,  2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,  0,   10,
+    16, 16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,
+    70, 16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,  0,   0,
+    0,  70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,  0,   96,
+    16, 0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,  0,   10,
+    0,  16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,  0,   0,
+    2,  64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   128,
+    63, 62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,  1,   0,
+    0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,  0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,  0,   0,
+    0,  0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darrayi11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darrayi11ps.h
index 7c30775..a540a84 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darrayi11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darrayi11ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughR2DArrayI /T ps_4_0 /Fh

-//    compiled\passthroughr2darrayi11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture2darray (sint,sint,sint,sint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.x, r0.x

-mov o0.yzw, l(0,0,0,1)

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughR2DArrayI[] = {

-    68,  88,  66,  67,  190, 14,  213, 255, 85,  29,  217, 11,  43,  5,   110, 54,  55,  146, 149,

-    98,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  36,  1,   0,   0,   64,  0,   0,   0,

-    73,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,

-    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,

-    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,

-    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,

-    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,   0,   10,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughR2DArrayI /T ps_4_0 /Fh
+//    compiled\passthroughr2darrayi11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture2darray (sint,sint,sint,sint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,1)
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR2DArrayI[] = {
+    68,  88,  66,  67,  190, 14,  213, 255, 85,  29,  217, 11,  43,  5,   110, 54,  55,  146, 149,
+    98,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  36,  1,   0,   0,   64,  0,   0,   0,
+    73,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,
+    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,
+    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,
+    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,
+    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,   0,   10,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darrayui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darrayui11ps.h
index 5dcde4a..6cc2b56 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darrayui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2darrayui11ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughR2DArrayUI /T ps_4_0 /Fh

-//    compiled\passthroughr2darrayui11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture2darray (uint,uint,uint,uint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.x, r0.x

-mov o0.yzw, l(0,0,0,1)

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughR2DArrayUI[] = {

-    68,  88,  66,  67,  97,  102, 75,  216, 41,  19,  132, 193, 57,  182, 129, 168, 6,   197, 203,

-    131, 1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  36,  1,   0,   0,   64,  0,   0,   0,

-    73,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,

-    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,

-    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,

-    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,

-    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,   0,   10,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughR2DArrayUI /T ps_4_0 /Fh
+//    compiled\passthroughr2darrayui11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2darray (uint,uint,uint,uint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,1)
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR2DArrayUI[] = {
+    68,  88,  66,  67,  97,  102, 75,  216, 41,  19,  132, 193, 57,  182, 129, 168, 6,   197, 203,
+    131, 1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  36,  1,   0,   0,   64,  0,   0,   0,
+    73,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,
+    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,
+    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,
+    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,
+    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,   0,   10,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h
index 894fd79..aa8baec 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughR2DI /T ps_4_0 /Fh

-//    compiled\passthroughr2di11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture2d (sint,sint,sint,sint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.x, r0.x

-mov o0.yzw, l(0,0,0,0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughR2DI[] = {

-    68,  88,  66,  67,  84,  64,  112, 93,  36,  186, 166, 75,  161, 187, 231, 211, 189, 98,  8,

-    233, 1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,

-    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,

-    82,  12,  1,   0,   0,   64,  0,   0,   0,   67,  0,   0,   0,   88,  24,  0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,

-    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,

-    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,

-    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,

-    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,

-    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,

-    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,

-    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughR2DI /T ps_4_0 /Fh
+//    compiled\passthroughr2di11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR2DI[] = {
+    68,  88,  66,  67,  84,  64,  112, 93,  36,  186, 166, 75,  161, 187, 231, 211, 189, 98,  8,
+    233, 1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,
+    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,
+    82,  12,  1,   0,   0,   64,  0,   0,   0,   67,  0,   0,   0,   88,  24,  0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,
+    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,
+    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,
+    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,
+    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,
+    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,
+    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,
+    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h
index dd4c320..513fe48 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughR2DUI /T ps_4_0 /Fh

-//    compiled\passthroughr2dui11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture2d (uint,uint,uint,uint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.x, r0.x

-mov o0.yzw, l(0,0,0,0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughR2DUI[] = {

-    68,  88,  66,  67,  55,  128, 134, 94,  118, 7,   10,  194, 208, 15,  238, 95,  29, 18,  60,

-    168, 1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69, 70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,  0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,  0,   0,

-    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,  1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77, 105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83, 104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57, 46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,  2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83, 86,  95,

-    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68, 0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,  0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,  0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83, 72,  68,

-    82,  12,  1,   0,   0,   64,  0,   0,   0,   67,  0,   0,   0,   88,  24,  0,   4,  0,   112,

-    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16, 0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,  0,   2,

-    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,  64,  0,

-    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,  50,  0,

-    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,  7,   50,

-    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16, 16,  0,

-    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70, 0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,  2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   45,

-    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,  0,   0,

-    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,  0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,  0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,  0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughR2DUI /T ps_4_0 /Fh
+//    compiled\passthroughr2dui11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR2DUI[] = {
+    68,  88,  66,  67,  55,  128, 134, 94,  118, 7,   10,  194, 208, 15,  238, 95,  29, 18,  60,
+    168, 1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69, 70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,  0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,  0,   0,
+    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,  1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77, 105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83, 104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57, 46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,  2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83, 86,  95,
+    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68, 0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,  0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,  0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83, 72,  68,
+    82,  12,  1,   0,   0,   64,  0,   0,   0,   67,  0,   0,   0,   88,  24,  0,   4,  0,   112,
+    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16, 0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,  0,   2,
+    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,  64,  0,
+    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,  50,  0,
+    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,  7,   50,
+    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16, 16,  0,
+    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70, 0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,  2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   45,
+    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,  0,   0,
+    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,  0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,  0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,  0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h
index 6bf38da..54d4060 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h
@@ -1,84 +1,84 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughR3D /T ps_4_0 /Fh

-//    compiled\passthroughr3d11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mov o0.x, r0.x

-mov o0.yzw, l(0,0,0,1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughR3D[] = {

-    68,  88,  66,  67,  163, 108, 19,  168, 114, 56,  140, 241, 17,  131, 30,  212, 85, 209, 92,

-    73,  1,   0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69, 70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,

-    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  160, 0,   0,   0,  64,  0,

-    0,   0,   40,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16, 0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,  0,   0,

-    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,  0,   0,

-    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,  0,   0,

-    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,  0,   0,

-    10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,  0,   0,

-    0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,  0,   1,

-    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughR3D /T ps_4_0 /Fh
+//    compiled\passthroughr3d11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR3D[] = {
+    68,  88,  66,  67,  163, 108, 19,  168, 114, 56,  140, 241, 17,  131, 30,  212, 85, 209, 92,
+    73,  1,   0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69, 70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,
+    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  160, 0,   0,   0,  64,  0,
+    0,   0,   40,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16, 0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,  0,   0,
+    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,  0,   0,
+    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,  0,   0,
+    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,  0,   0,
+    10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,  0,   0,
+    0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,  0,   1,
+    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h
index de572bf..3150d79 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughR3DI /T ps_4_0 /Fh

-//    compiled\passthroughr3di11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture3d (sint,sint,sint,sint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.x, r0.x

-mov o0.yzw, l(0,0,0,0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughR3DI[] = {

-    68,  88,  66,  67,  127, 168, 81,  164, 11,  136, 38,  235, 9,   101, 192, 215, 64,  24,  167,

-    101, 1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   120, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   7,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,   0,   0,   64,  0,   0,   0,

-    64,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,

-    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,

-    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,   0,   10,

-    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,   0,   0,

-    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughR3DI /T ps_4_0 /Fh
+//    compiled\passthroughr3di11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR3DI[] = {
+    68,  88,  66,  67,  127, 168, 81,  164, 11,  136, 38,  235, 9,   101, 192, 215, 64,  24,  167,
+    101, 1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   120, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   7,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,   0,   0,   64,  0,   0,   0,
+    64,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,
+    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,
+    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,   0,   10,
+    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,   0,   0,   0,   0,
+    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h
index 47d726d..3db3809 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughR3DUI /T ps_4_0 /Fh

-//    compiled\passthroughr3dui11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture3d (uint,uint,uint,uint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.x, r0.x

-mov o0.yzw, l(0,0,0,0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughR3DUI[] = {

-    68,  88,  66,  67,  181, 211, 48,  255, 138, 94,  31,  252, 44,  254, 92, 188, 78,  15,  80,

-    13,  1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   120, 2,   0,   0,   82, 68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,  0,   2,   0,   0,

-    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,  0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73, 0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,  0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,   7,   7,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,   0,   0,  64,  0,   0,   0,

-    64,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,  0,   68,  68,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,  0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61, 16,  0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  70,  126, 16,  0,

-    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,  0,   70,  2,   16,

-    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,  0,   0,   70,  2,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27, 0,   0,   5,   114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54,  0,   0,   5,

-    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   45,  0,   0,

-    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,  0,   0,   0,   10,

-    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,  0,   0,   0,   0,

-    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,  0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,  0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughR3DUI /T ps_4_0 /Fh
+//    compiled\passthroughr3dui11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR3DUI[] = {
+    68,  88,  66,  67,  181, 211, 48,  255, 138, 94,  31,  252, 44,  254, 92, 188, 78,  15,  80,
+    13,  1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   120, 2,   0,   0,   82, 68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,  0,   2,   0,   0,
+    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,  0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73, 0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,  0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,   7,   7,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,   0,   0,  64,  0,   0,   0,
+    64,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,  0,   68,  68,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,  0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61, 16,  0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  70,  126, 16,  0,
+    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,  0,   70,  2,   16,
+    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,  0,   0,   70,  2,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27, 0,   0,   5,   114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54,  0,   0,   5,
+    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   45,  0,   0,
+    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,  0,   0,   0,   10,
+    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   226, 32,  16,  0,  0,   0,   0,   0,
+    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,  0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,  0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h
index 158378a..63024de 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h
@@ -1,108 +1,108 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRG2D /T ps_4_0_level_9_3 /Fh

-//    compiled\passthroughrg2d11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    def c0, 1, 0, 0, 0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mad r0, r0.xyxx, c0.xxyy, c0.yyyx

-    mov oC0, r0

-

-// approximately 3 instruction slots used (1 texture, 2 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mov o0.xy, r0.xyxx

-mov o0.zw, l(0,0,0,1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRG2D[] = {

-    68,  88,  66,  67,  191, 201, 107, 187, 59,  10,  97,  89,  109, 87,  18,  235, 11,  52,  192,

-    94,  1,   0,   0,   0,   40,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   208, 0,

-    0,   0,   120, 1,   0,   0,   244, 1,   0,   0,   156, 2,   0,   0,   244, 2,   0,   0,   65,

-    111, 110, 57,  144, 0,   0,   0,   144, 0,   0,   0,   0,   2,   255, 255, 104, 0,   0,   0,

-    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,

-    15,  160, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   4,   128, 0,   0,   80,  160, 0,   0,

-    21,  160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,

-    72,  68,  82,  160, 0,   0,   0,   64,  0,   0,   0,   40,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,

-    5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,

-    0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,

-    109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,

-    0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,

-    0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,

-    84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,

-    40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109,

-    112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,

-    0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,

-    56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,

-    0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,

-    79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,

-    44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,

-    95,  84,  65,  82,  71,  69,  84,  0,   171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRG2D /T ps_4_0_level_9_3 /Fh
+//    compiled\passthroughrg2d11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 1, 0, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0.xyxx, c0.xxyy, c0.yyyx
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG2D[] = {
+    68,  88,  66,  67,  191, 201, 107, 187, 59,  10,  97,  89,  109, 87,  18,  235, 11,  52,  192,
+    94,  1,   0,   0,   0,   40,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   208, 0,
+    0,   0,   120, 1,   0,   0,   244, 1,   0,   0,   156, 2,   0,   0,   244, 2,   0,   0,   65,
+    111, 110, 57,  144, 0,   0,   0,   144, 0,   0,   0,   0,   2,   255, 255, 104, 0,   0,   0,
+    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,
+    15,  160, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   4,   128, 0,   0,   80,  160, 0,   0,
+    21,  160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,
+    72,  68,  82,  160, 0,   0,   0,   64,  0,   0,   0,   40,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,
+    5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,
+    0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,
+    109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,
+    0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,
+    0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,
+    84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,
+    40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109,
+    112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,
+    0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,
+    56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,
+    0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,
+    79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,
+    44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,
+    95,  84,  65,  82,  71,  69,  84,  0,   171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darray11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darray11ps.h
index b559739..9fd5014 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darray11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darray11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRG2DArray /T ps_4_0 /Fh

-//    compiled\passthroughrg2darray11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mov o0.xy, r0.xyxx

-mov o0.zw, l(0,0,0,1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRG2DArray[] = {

-    68,  88,  66,  67,  113, 101, 41,  131, 63,  206, 223, 205, 209, 167, 123, 102, 201, 174, 37,

-    186, 1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   120, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  216, 0,   0,   0,   64,  0,

-    0,   0,   54,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,

-    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,

-    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,

-    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,

-    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,

-    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,

-    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,

-    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128,

-    63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRG2DArray /T ps_4_0 /Fh
+//    compiled\passthroughrg2darray11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG2DArray[] = {
+    68,  88,  66,  67,  113, 101, 41,  131, 63,  206, 223, 205, 209, 167, 123, 102, 201, 174, 37,
+    186, 1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   120, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  216, 0,   0,   0,   64,  0,
+    0,   0,   54,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,
+    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,
+    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,
+    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,
+    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,
+    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,
+    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,
+    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128,
+    63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darrayi11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darrayi11ps.h
index b875328..a092deb 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darrayi11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darrayi11ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRG2DArrayI /T ps_4_0 /Fh

-//    compiled\passthroughrg2darrayi11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture2darray (sint,sint,sint,sint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xy, r0.xyxx

-mov o0.zw, l(0,0,0,1)

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRG2DArrayI[] = {

-    68,  88,  66,  67,  247, 185, 135, 38,  69,  135, 207, 14,  57,  114, 126, 102, 133, 233, 225,

-    80,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  36,  1,   0,   0,   64,  0,   0,   0,

-    73,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,

-    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,

-    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,

-    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,

-    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRG2DArrayI /T ps_4_0 /Fh
+//    compiled\passthroughrg2darrayi11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture2darray (sint,sint,sint,sint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,1)
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG2DArrayI[] = {
+    68,  88,  66,  67,  247, 185, 135, 38,  69,  135, 207, 14,  57,  114, 126, 102, 133, 233, 225,
+    80,  1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  36,  1,   0,   0,   64,  0,   0,   0,
+    73,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,
+    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,
+    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,
+    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,
+    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darrayui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darrayui11ps.h
index 1dcbca4..f5e0afc 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darrayui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2darrayui11ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRG2DArrayUI /T ps_4_0 /Fh

-//    compiled\passthroughrg2darrayui11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture2darray (uint,uint,uint,uint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xy, r0.xyxx

-mov o0.zw, l(0,0,0,1)

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRG2DArrayUI[] = {

-    68,  88,  66,  67,  63,  58,  182, 113, 143, 129, 92,  4,   182, 79,  59,  171, 155, 95,  217,

-    111, 1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  36,  1,   0,   0,   64,  0,   0,   0,

-    73,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,

-    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,

-    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,

-    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,

-    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRG2DArrayUI /T ps_4_0 /Fh
+//    compiled\passthroughrg2darrayui11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2darray (uint,uint,uint,uint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,1)
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG2DArrayUI[] = {
+    68,  88,  66,  67,  63,  58,  182, 113, 143, 129, 92,  4,   182, 79,  59,  171, 155, 95,  217,
+    111, 1,   0,   0,   0,   24,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   156, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  36,  1,   0,   0,   64,  0,   0,   0,
+    73,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,
+    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,
+    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,
+    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,
+    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h
index 10f4e75..e2f98d9 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRG2DI /T ps_4_0 /Fh

-//    compiled\passthroughrg2di11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture2d (sint,sint,sint,sint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xy, r0.xyxx

-mov o0.zw, l(0,0,0,0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRG2DI[] = {

-    68,  88,  66,  67,  154, 63,  188, 122, 50,  211, 44,  194, 175, 193, 7,   1,   234, 178, 251,

-    83,  1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,

-    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,

-    82,  12,  1,   0,   0,   64,  0,   0,   0,   67,  0,   0,   0,   88,  24,  0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,

-    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,

-    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,

-    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,

-    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,

-    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,

-    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,

-    0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRG2DI /T ps_4_0 /Fh
+//    compiled\passthroughrg2di11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG2DI[] = {
+    68,  88,  66,  67,  154, 63,  188, 122, 50,  211, 44,  194, 175, 193, 7,   1,   234, 178, 251,
+    83,  1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,
+    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,
+    82,  12,  1,   0,   0,   64,  0,   0,   0,   67,  0,   0,   0,   88,  24,  0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,
+    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,
+    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,
+    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,
+    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,
+    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,
+    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,
+    0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h
index 28902c9..4b0e4ce 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRG2DUI /T ps_4_0 /Fh

-//    compiled\passthroughrg2dui11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture2d (uint,uint,uint,uint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xy, r0.xyxx

-mov o0.zw, l(0,0,0,0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRG2DUI[] = {

-    68,  88,  66,  67,  144, 43,  208, 108, 186, 143, 89,  184, 35,  31,  116, 8,   149, 47,  23,

-    40,  1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,

-    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,

-    82,  12,  1,   0,   0,   64,  0,   0,   0,   67,  0,   0,   0,   88,  24,  0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,

-    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,

-    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,

-    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,

-    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,

-    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,

-    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,

-    0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRG2DUI /T ps_4_0 /Fh
+//    compiled\passthroughrg2dui11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG2DUI[] = {
+    68,  88,  66,  67,  144, 43,  208, 108, 186, 143, 89,  184, 35,  31,  116, 8,   149, 47,  23,
+    40,  1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,
+    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,
+    82,  12,  1,   0,   0,   64,  0,   0,   0,   67,  0,   0,   0,   88,  24,  0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,
+    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,
+    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,
+    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,
+    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,
+    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,
+    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,
+    0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h
index 55575af..9510edc 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h
@@ -1,84 +1,84 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRG3D /T ps_4_0 /Fh

-//    compiled\passthroughrg3d11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mov o0.xy, r0.xyxx

-mov o0.zw, l(0,0,0,1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRG3D[] = {

-    68,  88,  66,  67,  229, 144, 152, 160, 204, 175, 158, 188, 47,  45,  65,  251, 42, 224, 182,

-    55,  1,   0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69, 70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,

-    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  160, 0,   0,   0,  64,  0,

-    0,   0,   40,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16, 0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,  0,   0,

-    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,  0,   0,

-    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,  0,   0,

-    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,  0,   0,

-    70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,  0,   0,

-    0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,  0,   1,

-    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRG3D /T ps_4_0 /Fh
+//    compiled\passthroughrg3d11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG3D[] = {
+    68,  88,  66,  67,  229, 144, 152, 160, 204, 175, 158, 188, 47,  45,  65,  251, 42, 224, 182,
+    55,  1,   0,   0,   0,   188, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   64,  2,   0,   0,   82,  68,  69, 70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,
+    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  160, 0,   0,   0,  64,  0,
+    0,   0,   40,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16, 0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,  0,   0,
+    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,  0,   0,
+    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,  0,   0,
+    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,  0,   0,
+    70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,  0,   0,
+    0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,  0,   1,
+    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h
index 282385e..daa39a8 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRG3DI /T ps_4_0 /Fh

-//    compiled\passthroughrg3di11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture3d (sint,sint,sint,sint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xy, r0.xyxx

-mov o0.zw, l(0,0,0,0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRG3DI[] = {

-    68,  88,  66,  67,  185, 213, 244, 108, 113, 189, 253, 145, 131, 2,   68, 116, 163, 196, 223,

-    94,  1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   120, 2,   0,   0,   82, 68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,  0,   2,   0,   0,

-    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,  0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,  77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,   7,   7,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,   0,   0,  64,  0,   0,   0,

-    64,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,  0,   51,  51,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,  0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61, 16,  0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  70,  126, 16,  0,

-    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,  0,   70,  2,   16,

-    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,  0,   0,   70,  2,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27, 0,   0,   5,   114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54,  0,   0,   5,

-    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   45,  0,   0,

-    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,  0,   0,   0,   70,

-    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,  0,   0,   0,   0,

-    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,  0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,  0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRG3DI /T ps_4_0 /Fh
+//    compiled\passthroughrg3di11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG3DI[] = {
+    68,  88,  66,  67,  185, 213, 244, 108, 113, 189, 253, 145, 131, 2,   68, 116, 163, 196, 223,
+    94,  1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   120, 2,   0,   0,   82, 68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,  0,   2,   0,   0,
+    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,  0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,  77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,   7,   7,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,   0,   0,  64,  0,   0,   0,
+    64,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,  0,   51,  51,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,  0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61, 16,  0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  70,  126, 16,  0,
+    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,  0,   70,  2,   16,
+    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,  0,   0,   70,  2,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27, 0,   0,   5,   114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54,  0,   0,   5,
+    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,   45,  0,   0,
+    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,  0,   0,   0,   70,
+    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,  0,   0,   0,   0,
+    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,  0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,  0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h
index 5abdfce..cf62b2e 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRG3DUI /T ps_4_0 /Fh

-//    compiled\passthroughrg3dui11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture3d (uint,uint,uint,uint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xy, r0.xyxx

-mov o0.zw, l(0,0,0,0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRG3DUI[] = {

-    68,  88,  66,  67,  96,  192, 36,  178, 243, 86,  188, 32,  61,  242, 109, 248, 60,  242, 238,

-    185, 1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   120, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   7,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,   0,   0,   64,  0,   0,   0,

-    64,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,

-    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,

-    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,

-    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,

-    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRG3DUI /T ps_4_0 /Fh
+//    compiled\passthroughrg3dui11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG3DUI[] = {
+    68,  88,  66,  67,  96,  192, 36,  178, 243, 86,  188, 32,  61,  242, 109, 248, 60,  242, 238,
+    185, 1,   0,   0,   0,   244, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   120, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   7,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  0,   1,   0,   0,   64,  0,   0,   0,
+    64,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,
+    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,
+    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   50,  32,  16,  0,   0,   0,   0,   0,   70,
+    0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,
+    2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h
index 231dd19..ea3c4ae 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h
@@ -1,107 +1,107 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB2D /T ps_4_0_level_9_3 /Fh

-//    compiled\passthroughrgb2d11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    def c0, 1, 0, 0, 0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mad r0, r0.xyzx, c0.xxxy, c0.yyyx

-    mov oC0, r0

-

-// approximately 3 instruction slots used (1 texture, 2 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mov o0.xyz, r0.xyzx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB2D[] = {

-    68,  88,  66,  67,  85,  126, 250, 196, 188, 16,  162, 84,  25,  241, 221, 195, 112, 236, 199,

-    254, 1,   0,   0,   0,   28,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   208, 0,

-    0,   0,   108, 1,   0,   0,   232, 1,   0,   0,   144, 2,   0,   0,   232, 2,   0,   0,   65,

-    111, 110, 57,  144, 0,   0,   0,   144, 0,   0,   0,   0,   2,   255, 255, 104, 0,   0,   0,

-    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,

-    15,  160, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   36,  128, 0,   0,   64,  160, 0,   0,

-    21,  160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,

-    72,  68,  82,  148, 0,   0,   0,   64,  0,   0,   0,   37,  0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,

-    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,

-    5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,

-    0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  160, 0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,   0,

-    4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,   0,

-    0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,   83,

-    97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,

-    0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,

-    95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,

-    171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,

-    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB2D /T ps_4_0_level_9_3 /Fh
+//    compiled\passthroughrgb2d11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 1, 0, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0.xyzx, c0.xxxy, c0.yyyx
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.xyz, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2D[] = {
+    68,  88,  66,  67,  85,  126, 250, 196, 188, 16,  162, 84,  25,  241, 221, 195, 112, 236, 199,
+    254, 1,   0,   0,   0,   28,  3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   208, 0,
+    0,   0,   108, 1,   0,   0,   232, 1,   0,   0,   144, 2,   0,   0,   232, 2,   0,   0,   65,
+    111, 110, 57,  144, 0,   0,   0,   144, 0,   0,   0,   0,   2,   255, 255, 104, 0,   0,   0,
+    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,
+    15,  160, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   36,  128, 0,   0,   64,  160, 0,   0,
+    21,  160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0,   83,
+    72,  68,  82,  148, 0,   0,   0,   64,  0,   0,   0,   37,  0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   69,
+    0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,
+    5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,
+    0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,  68,  69,  70,  160, 0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,   0,
+    4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,   0,
+    0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,   83,
+    97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,
+    0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,
+    95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,
+    171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,
+    0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d_565_11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d_565_11ps.h
index 0b69411..f0dfd44 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d_565_11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d_565_11ps.h
@@ -1,123 +1,123 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB2D_565 /T ps_4_0_level_9_3 /Fh

-//    compiled\passthroughrgb2d_565_11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    def c0, 31, 63, 0.5, 1

-    def c1, 0.0322580636, 0.0158730168, 0, 0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mad r0.xyz, r0, c0.xyxw, c0.z

-    frc r1.xyz, r0

-    add r0.xyz, r0, -r1

-    mul r0.xyz, r0, c1.xyxw

-    mov r0.w, c0.w

-    mov oC0, r0

-

-// approximately 7 instruction slots used (1 texture, 6 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)

-mov o0.w, l(1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB2D_565[] = {

-    68,  88,  66,  67,  67,  66,  55,  172, 133, 227, 110, 204, 193, 171, 136, 102, 65,  233, 15,

-    94,  1,   0,   0,   0,   188, 3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   32,  1,

-    0,   0,   12,  2,   0,   0,   136, 2,   0,   0,   48,  3,   0,   0,   136, 3,   0,   0,   65,

-    111, 110, 57,  224, 0,   0,   0,   224, 0,   0,   0,   0,   2,   255, 255, 184, 0,   0,   0,

-    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,

-    15,  160, 0,   0,   248, 65,  0,   0,   124, 66,  0,   0,   0,   63,  0,   0,   128, 63,  81,

-    0,   0,   5,   1,   0,   15,  160, 8,   33,  4,   61,  33,  8,   130, 60,  0,   0,   0,   0,

-    0,   0,   0,   0,   31,  0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,

-    2,   0,   0,   0,   144, 0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,

-    228, 176, 0,   8,   228, 160, 4,   0,   0,   4,   0,   0,   7,   128, 0,   0,   228, 128, 0,

-    0,   196, 160, 0,   0,   170, 160, 19,  0,   0,   2,   1,   0,   7,   128, 0,   0,   228, 128,

-    2,   0,   0,   3,   0,   0,   7,   128, 0,   0,   228, 128, 1,   0,   228, 129, 5,   0,   0,

-    3,   0,   0,   7,   128, 0,   0,   228, 128, 1,   0,   196, 160, 1,   0,   0,   2,   0,   0,

-    8,   128, 0,   0,   255, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255,

-    255, 0,   0,   83,  72,  68,  82,  228, 0,   0,   0,   64,  0,   0,   0,   57,  0,   0,   0,

-    90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,

-    0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,

-    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,

-    0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,

-    1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,

-    0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124, 66,  0,   0,   248, 65,  0,

-    0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,

-    0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  33,  8,   130, 60,  8,   33,

-    4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,

-    64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,

-    6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,

-    0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,

-    92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,

-    0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,

-    0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116,

-    117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,

-    72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101,

-    114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,

-    83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,

-    0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,

-    69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,

-    1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,

-    71,  69,  84,  0,   171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB2D_565 /T ps_4_0_level_9_3 /Fh
+//    compiled\passthroughrgb2d_565_11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 31, 63, 0.5, 1
+    def c1, 0.0322580636, 0.0158730168, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0.xyz, r0, c0.xyxw, c0.z
+    frc r1.xyz, r0
+    add r0.xyz, r0, -r1
+    mul r0.xyz, r0, c1.xyxw
+    mov r0.w, c0.w
+    mov oC0, r0
+
+// approximately 7 instruction slots used (1 texture, 6 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)
+mov o0.w, l(1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2D_565[] = {
+    68,  88,  66,  67,  67,  66,  55,  172, 133, 227, 110, 204, 193, 171, 136, 102, 65,  233, 15,
+    94,  1,   0,   0,   0,   188, 3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   32,  1,
+    0,   0,   12,  2,   0,   0,   136, 2,   0,   0,   48,  3,   0,   0,   136, 3,   0,   0,   65,
+    111, 110, 57,  224, 0,   0,   0,   224, 0,   0,   0,   0,   2,   255, 255, 184, 0,   0,   0,
+    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,
+    15,  160, 0,   0,   248, 65,  0,   0,   124, 66,  0,   0,   0,   63,  0,   0,   128, 63,  81,
+    0,   0,   5,   1,   0,   15,  160, 8,   33,  4,   61,  33,  8,   130, 60,  0,   0,   0,   0,
+    0,   0,   0,   0,   31,  0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,
+    2,   0,   0,   0,   144, 0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,
+    228, 176, 0,   8,   228, 160, 4,   0,   0,   4,   0,   0,   7,   128, 0,   0,   228, 128, 0,
+    0,   196, 160, 0,   0,   170, 160, 19,  0,   0,   2,   1,   0,   7,   128, 0,   0,   228, 128,
+    2,   0,   0,   3,   0,   0,   7,   128, 0,   0,   228, 128, 1,   0,   228, 129, 5,   0,   0,
+    3,   0,   0,   7,   128, 0,   0,   228, 128, 1,   0,   196, 160, 1,   0,   0,   2,   0,   0,
+    8,   128, 0,   0,   255, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255,
+    255, 0,   0,   83,  72,  68,  82,  228, 0,   0,   0,   64,  0,   0,   0,   57,  0,   0,   0,
+    90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,
+    0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,
+    0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,
+    0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,
+    1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,
+    0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124, 66,  0,   0,   248, 65,  0,
+    0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,
+    0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  33,  8,   130, 60,  8,   33,
+    4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,
+    64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,
+    6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,
+    0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,
+    92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,
+    0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,
+    0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116,
+    117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,
+    72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101,
+    114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,
+    83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,
+    0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,
+    69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,
+    1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,
+    71,  69,  84,  0,   171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darray11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darray11ps.h
index c219a9e..674ecbe 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darray11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darray11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB2DArray /T ps_4_0 /Fh

-//    compiled\passthroughrgb2darray11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mov o0.xyz, r0.xyzx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB2DArray[] = {

-    68, 88,  66,  67,  225, 163, 46,  39,  57,  32,  20,  75,  137, 40,  221, 13,  168, 142, 200,

-    45, 1,   0,   0,   0,   232, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,  0,   100, 1,   0,   0,   152, 1,   0,   0,   108, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,  0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,  0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,  3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82, 69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68, 69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,  0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84, 65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  204, 0,   0,   0,   64,  0,

-    0,  0,   51,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    64, 0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,

-    18, 16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,

-    0,  2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,

-    0,  2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,

-    16, 16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,

-    70, 16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,

-    0,  70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,

-    16, 0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,

-    2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,

-    1,  64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,  6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  3,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,  0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB2DArray /T ps_4_0 /Fh
+//    compiled\passthroughrgb2darray11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mov o0.xyz, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2DArray[] = {
+    68, 88,  66,  67,  225, 163, 46,  39,  57,  32,  20,  75,  137, 40,  221, 13,  168, 142, 200,
+    45, 1,   0,   0,   0,   232, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,  0,   100, 1,   0,   0,   152, 1,   0,   0,   108, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,  0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,  0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,  3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82, 69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68, 69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,  0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84, 65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  204, 0,   0,   0,   64,  0,
+    0,  0,   51,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    64, 0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,
+    18, 16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,
+    0,  2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,
+    0,  2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,
+    16, 16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,
+    70, 16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,
+    0,  70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,
+    16, 0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,
+    2,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,
+    1,  64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,  6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  3,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darray_565_11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darray_565_11ps.h
index 86c450a..4ac3484 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darray_565_11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darray_565_11ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB2DArray_565 /T ps_4_0 /Fh

-//    compiled\passthroughrgb2darray_565_11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)

-mov o0.w, l(1.000000)

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB2DArray_565[] = {

-    68,  88,  66,  67,  154, 118, 191, 108, 144, 58,  136, 40,  31,  50,  241, 170, 80, 59,  111,

-    122, 1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69, 70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,  0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,

-    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  28,  1,   0,   0,  64,  0,

-    0,   0,   71,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,

-    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,  0,   4,

-    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50, 16,  16,

-    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,  104, 0,

-    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,  0,   10,

-    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,

-    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,  0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,  0,   96,

-    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,  0,   70,

-    2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,  124, 66,

-    0,   0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,  0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,  0,   0,

-    0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,  61,  33,

-    8,   130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32, 16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83, 84,  65,

-    84,  116, 0,   0,   0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  3,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB2DArray_565 /T ps_4_0 /Fh
+//    compiled\passthroughrgb2darray_565_11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)
+mov o0.w, l(1.000000)
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2DArray_565[] = {
+    68,  88,  66,  67,  154, 118, 191, 108, 144, 58,  136, 40,  31,  50,  241, 170, 80, 59,  111,
+    122, 1,   0,   0,   0,   56,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   188, 2,   0,   0,   82,  68,  69, 70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,  0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,
+    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  28,  1,   0,   0,  64,  0,
+    0,   0,   71,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,
+    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,  0,   4,
+    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50, 16,  16,
+    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,  104, 0,
+    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,  0,   10,
+    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,
+    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,  0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,  0,   96,
+    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,  0,   70,
+    2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,  124, 66,
+    0,   0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,  0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,  0,   0,
+    0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,  61,  33,
+    8,   130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32, 16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83, 84,  65,
+    84,  116, 0,   0,   0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  3,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darrayi11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darrayi11ps.h
index 2500e4f..867c9fb 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darrayi11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darrayi11ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB2DArrayI /T ps_4_0 /Fh

-//    compiled\passthroughrgb2darrayi11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture2darray (sint,sint,sint,sint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB2DArrayI[] = {

-    68,  88,  66,  67,  203, 204, 115, 216, 122, 41,  103, 203, 207, 35,  129, 118, 254, 235, 84,

-    148, 1,   0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  24,  1,   0,   0,   64,  0,   0,   0,

-    70,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,

-    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,

-    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,

-    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,

-    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,

-    0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,

-    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB2DArrayI /T ps_4_0 /Fh
+//    compiled\passthroughrgb2darrayi11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture2darray (sint,sint,sint,sint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2DArrayI[] = {
+    68,  88,  66,  67,  203, 204, 115, 216, 122, 41,  103, 203, 207, 35,  129, 118, 254, 235, 84,
+    148, 1,   0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  24,  1,   0,   0,   64,  0,   0,   0,
+    70,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,
+    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,
+    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,
+    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,
+    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,
+    0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,
+    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darrayui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darrayui11ps.h
index b04e3d5..af27be1 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darrayui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2darrayui11ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB2DArrayUI /T ps_4_0 /Fh

-//    compiled\passthroughrgb2darrayui11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture2darray (uint,uint,uint,uint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xyz, r0.xyzx

-mov o0.w, l(1)

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB2DArrayUI[] = {

-    68,  88,  66,  67,  253, 90,  38,  58,  32,  167, 35,  29,  29,  134, 13,  19,  245, 38,  146,

-    38,  1,   0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  24,  1,   0,   0,   64,  0,   0,   0,

-    70,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,

-    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,

-    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,

-    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,

-    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,

-    0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,

-    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB2DArrayUI /T ps_4_0 /Fh
+//    compiled\passthroughrgb2darrayui11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2darray (uint,uint,uint,uint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(1)
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2DArrayUI[] = {
+    68,  88,  66,  67,  253, 90,  38,  58,  32,  167, 35,  29,  29,  134, 13,  19,  245, 38,  146,
+    38,  1,   0,   0,   0,   12,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   144, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  24,  1,   0,   0,   64,  0,   0,   0,
+    70,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,
+    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,
+    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,
+    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,
+    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,   70,  2,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,   0,   1,   64,
+    0,   0,   1,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   10,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,
+    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h
index 4b0b6dc..d44e778 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB2DI /T ps_4_0 /Fh

-//    compiled\passthroughrgb2di11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture2d (sint,sint,sint,sint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xyz, r0.xyzx

-mov o0.w, l(0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB2DI[] = {

-    68,  88,  66,  67,  103, 48,  174, 226, 36,  218, 154, 243, 36,  109, 177, 52,  89,  59,  167,

-    243, 1,   0,   0,   0,   196, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   72,  2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,

-    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,

-    82,  0,   1,   0,   0,   64,  0,   0,   0,   64,  0,   0,   0,   88,  24,  0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,

-    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,

-    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,

-    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,

-    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,

-    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,

-    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,

-    0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116,

-    0,   0,   0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB2DI /T ps_4_0 /Fh
+//    compiled\passthroughrgb2di11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2DI[] = {
+    68,  88,  66,  67,  103, 48,  174, 226, 36,  218, 154, 243, 36,  109, 177, 52,  89,  59,  167,
+    243, 1,   0,   0,   0,   196, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   72,  2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,
+    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,
+    82,  0,   1,   0,   0,   64,  0,   0,   0,   64,  0,   0,   0,   88,  24,  0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,
+    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,
+    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,
+    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,
+    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,
+    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,
+    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,
+    0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116,
+    0,   0,   0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h
index c9142de..7905f1d 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h
@@ -1,87 +1,87 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB2DUI /T ps_4_0 /Fh

-//    compiled\passthroughrgb2dui11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture2d (uint,uint,uint,uint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xyz, r0.xyzx

-mov o0.w, l(0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB2DUI[] = {

-    68,  88,  66,  67,  106, 224, 213, 49,  148, 23,  134, 204, 255, 208, 89,  239, 72, 191, 144,

-    2,   1,   0,   0,   0,   196, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   72,  2,   0,   0,   82,  68,  69, 70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,  0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,  0,   0,

-    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,  1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77, 105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83, 104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57, 46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,  2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83, 86,  95,

-    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68, 0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,  0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,  0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83, 72,  68,

-    82,  0,   1,   0,   0,   64,  0,   0,   0,   64,  0,   0,   0,   88,  24,  0,   4,  0,   112,

-    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16, 0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,  0,   2,

-    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,  64,  0,

-    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,  50,  0,

-    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,  7,   50,

-    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16, 16,  0,

-    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70, 0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,  2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   45,

-    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,  0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,  0,   0,

-    0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65, 84,  116,

-    0,   0,   0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,  0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB2DUI /T ps_4_0 /Fh
+//    compiled\passthroughrgb2dui11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2DUI[] = {
+    68,  88,  66,  67,  106, 224, 213, 49,  148, 23,  134, 204, 255, 208, 89,  239, 72, 191, 144,
+    2,   1,   0,   0,   0,   196, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   72,  2,   0,   0,   82,  68,  69, 70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,  0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,  0,   0,
+    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,  1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77, 105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83, 104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57, 46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,  2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83, 86,  95,
+    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68, 0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,  0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,  0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83, 72,  68,
+    82,  0,   1,   0,   0,   64,  0,   0,   0,   64,  0,   0,   0,   88,  24,  0,   4,  0,   112,
+    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16, 0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,  0,   2,
+    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,  64,  0,
+    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,  50,  0,
+    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,  7,   50,
+    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16, 16,  0,
+    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70, 0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,  2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   45,
+    0,   0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,  0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,  0,   0,
+    0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65, 84,  116,
+    0,   0,   0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,  0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h
index 21b64b0..2f35cb0 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h
@@ -1,84 +1,84 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB3D /T ps_4_0 /Fh

-//    compiled\passthroughrgb3d11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mov o0.xyz, r0.xyzx

-mov o0.w, l(1.000000)

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB3D[] = {

-    68,  88,  66,  67,  64,  144, 204, 156, 117, 84,  185, 228, 65,  179, 80,  244, 146, 54,  206,

-    119, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  148, 0,   0,   0,   64,  0,

-    0,   0,   37,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,

-    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,

-    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,

-    70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,

-    0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB3D /T ps_4_0 /Fh
+//    compiled\passthroughrgb3d11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.xyz, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB3D[] = {
+    68,  88,  66,  67,  64,  144, 204, 156, 117, 84,  185, 228, 65,  179, 80,  244, 146, 54,  206,
+    119, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  148, 0,   0,   0,   64,  0,
+    0,   0,   37,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,
+    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,
+    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,   0,   0,   0,
+    70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,   0,   0,   0,
+    0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d_565_11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d_565_11ps.h
index f6e538e..29f83d9 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d_565_11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d_565_11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB3D_565 /T ps_4_0 /Fh

-//    compiled\passthroughrgb3d_565_11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)

-round_ne r0.xyz, r0.xyzx

-mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)

-mov o0.w, l(1.000000)

-ret 

-// Approximately 6 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB3D_565[] = {

-    68,  88,  66,  67,  64,  214, 210, 233, 132, 86,  85,  54,  162, 63,  180, 191, 68,  70,  147,

-    32,  1,   0,   0,   0,   0,   3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   132, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  228, 0,   0,   0,   64,  0,

-    0,   0,   57,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,

-    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,

-    96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,

-    70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124,

-    66,  0,   0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,

-    0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,

-    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,

-    33,  8,   130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,

-    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,

-    65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,

-    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB3D_565 /T ps_4_0 /Fh
+//    compiled\passthroughrgb3d_565_11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyz, r0.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000)
+round_ne r0.xyz, r0.xyzx
+mul o0.xyz, r0.xyzx, l(0.032258, 0.015873, 0.032258, 0.000000)
+mov o0.w, l(1.000000)
+ret 
+// Approximately 6 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB3D_565[] = {
+    68,  88,  66,  67,  64,  214, 210, 233, 132, 86,  85,  54,  162, 63,  180, 191, 68,  70,  147,
+    32,  1,   0,   0,   0,   0,   3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   132, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  228, 0,   0,   0,   64,  0,
+    0,   0,   57,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,
+    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,
+    96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 0,   16,  0,   0,   0,   0,   0,
+    70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   124,
+    66,  0,   0,   248, 65,  0,   0,   0,   0,   64,  0,   0,   5,   114, 0,   16,  0,   0,   0,
+    0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  114, 32,  16,  0,   0,
+    0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,
+    33,  8,   130, 60,  8,   33,  4,   61,  0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,
+    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  62,  0,   0,   1,   83,  84,
+    65,  84,  116, 0,   0,   0,   6,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,
+    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h
index f9730b8..90fd973 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB3DI /T ps_4_0 /Fh

-//    compiled\passthroughrgb3di11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture3d (sint,sint,sint,sint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xyz, r0.xyzx

-mov o0.w, l(0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB3DI[] = {

-    68,  88,  66,  67,  154, 56,  82,  215, 167, 57,  211, 57,  235, 39,  42, 82, 164, 188, 103,

-    126, 1,   0,   0,   0,   232, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,  0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   108, 2,   0,   0,   82, 68, 69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,  0,  2,   0,   0,

-    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,  0,  0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,  77, 105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83, 104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57, 46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,  0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,  0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,  0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,  118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,  0,   7,   7,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86, 95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73, 78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78, 44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86, 95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  244, 0,   0,   0,  64, 0,   0,   0,

-    61,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,  0,  51,  51,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,  0,  3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61, 16, 0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  70, 126, 16,  0,

-    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,  0,  70,  2,   16,

-    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,  0,  0,   70,  2,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27, 0,  0,   5,   114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54, 0,   0,   5,

-    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,  45,  0,   0,

-    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,  0,   70,  126,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,  0,  0,   0,   70,

-    2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,  0,  0,   0,   0,

-    1,   64,  0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65, 84, 116, 0,   0,

-    0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,  0,  0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB3DI /T ps_4_0 /Fh
+//    compiled\passthroughrgb3di11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB3DI[] = {
+    68,  88,  66,  67,  154, 56,  82,  215, 167, 57,  211, 57,  235, 39,  42, 82, 164, 188, 103,
+    126, 1,   0,   0,   0,   232, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,  0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   108, 2,   0,   0,   82, 68, 69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,  0,  2,   0,   0,
+    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,  0,  0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,  77, 105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83, 104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57, 46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,  0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,  0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,  0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,  118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,  0,   7,   7,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86, 95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73, 78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78, 44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86, 95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  244, 0,   0,   0,  64, 0,   0,   0,
+    61,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,  0,  51,  51,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,  0,  3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61, 16, 0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  70, 126, 16,  0,
+    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,  0,  70,  2,   16,
+    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,  0,  0,   70,  2,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27, 0,  0,   5,   114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54, 0,   0,   5,
+    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,  45,  0,   0,
+    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,  0,   70,  126,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,  0,  0,   0,   70,
+    2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,  0,  0,   0,   0,
+    1,   64,  0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65, 84, 116, 0,   0,
+    0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,  0,  0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h
index afd9a43..0192a1c 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h
@@ -1,90 +1,90 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGB3DUI /T ps_4_0 /Fh

-//    compiled\passthroughrgb3dui11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture3d (uint,uint,uint,uint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov o0.xyz, r0.xyzx

-mov o0.w, l(0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGB3DUI[] = {

-    68,  88,  66,  67,  206, 73,  153, 209, 111, 4,   107, 131, 207, 172, 41, 87, 186, 3,   238,

-    41,  1,   0,   0,   0,   232, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,  0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   108, 2,   0,   0,   82, 68, 69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,  0,  2,   0,   0,

-    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,  0,  0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73, 0,  77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32, 83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50, 57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,  0,  0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,  0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,  0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,  118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,  0,   7,   7,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86, 95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73, 78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78, 44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86, 95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  244, 0,   0,   0,  64, 0,   0,   0,

-    61,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,  0,  68,  68,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,  0,  3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61, 16, 0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  70, 126, 16,  0,

-    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,  0,  70,  2,   16,

-    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,  0,  0,   70,  2,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27, 0,  0,   5,   114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54, 0,   0,   5,

-    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,  45,  0,   0,

-    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,  0,   70,  126,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,  0,  0,   0,   70,

-    2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,  0,  0,   0,   0,

-    1,   64,  0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65, 84, 116, 0,   0,

-    0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,  0,  0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGB3DUI /T ps_4_0 /Fh
+//    compiled\passthroughrgb3dui11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB3DUI[] = {
+    68,  88,  66,  67,  206, 73,  153, 209, 111, 4,   107, 131, 207, 172, 41, 87, 186, 3,   238,
+    41,  1,   0,   0,   0,   232, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,  0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   108, 2,   0,   0,   82, 68, 69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,  0,  2,   0,   0,
+    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,  0,  0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73, 0,  77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32, 83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50, 57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,  0,  0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,  0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,  0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,  118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,  0,   7,   7,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86, 95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73, 78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78, 44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86, 95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  244, 0,   0,   0,  64, 0,   0,   0,
+    61,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,  0,  68,  68,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,  0,  3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61, 16, 0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  70, 126, 16,  0,
+    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,  0,  70,  2,   16,
+    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,  0,  0,   70,  2,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27, 0,  0,   5,   114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,  54, 0,   0,   5,
+    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,  0,  45,  0,   0,
+    7,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,  0,  0,   70,  126,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   114, 32,  16,  0,   0,  0,  0,   0,   70,
+    2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 32,  16,  0,  0,  0,   0,   0,
+    1,   64,  0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65, 84, 116, 0,   0,
+    0,   9,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,  0,  0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h
index 98381a5..fb4b2f4 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h
@@ -1,98 +1,98 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2D /T ps_4_0_level_9_3 /Fh

-//    compiled\passthroughrgba2d11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mov oC0, r0

-

-// approximately 2 instruction slots used (1 texture, 1 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-sample o0.xyzw, v1.xyxx, t0.xyzw, s0

-ret 

-// Approximately 2 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2D[] = {

-    68,  88,  66, 67,  184, 218, 64,  10,  229, 55,  228, 76,  217, 225, 255, 57,  166, 235, 140,

-    175, 1,   0,  0,   0,   192, 2,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   164, 0,

-    0,   0,   16, 1,   0,   0,   140, 1,   0,   0,   52,  2,   0,   0,   140, 2,   0,   0,   65,

-    111, 110, 57, 100, 0,   0,   0,   100, 0,   0,   0,   0,   2,   255, 255, 60,  0,   0,   0,

-    40,  0,   0,  0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,  40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 31,  0,   0,   2,   0,   0,

-    0,   128, 0,  0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144, 0,   8,   15,  160, 66,

-    0,   0,   3,  0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228, 160, 1,   0,   0,   2,

-    0,   8,   15, 128, 0,   0,   228, 128, 255, 255, 0,   0,   83,  72,  68,  82,  100, 0,   0,

-    0,   64,  0,  0,   0,   25,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,

-    0,   0,   88, 24,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,

-    16,  0,   3,  50,  16,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,

-    0,   0,   0,  0,   69,  0,   0,   9,   242, 32,  16,  0,   0,   0,   0,   0,   70,  16,  16,

-    0,   1,   0,  0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,

-    0,   0,   62, 0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,  0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,  0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,  68,  69,

-    70,  160, 0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,

-    0,   0,   0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,

-    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,

-    0,   4,   0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,

-    0,   0,   83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,

-    77,  105, 99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,

-    83,  104, 97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,

-    57,  46,  57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,

-    0,   0,   2,  0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,

-    0,   0,   0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,

-    0,   83,  86, 95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,

-    82,  68,  0,  171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,

-    0,   0,   0,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,

-    0,   0,   0,  0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171,

-    171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2D /T ps_4_0_level_9_3 /Fh
+//    compiled\passthroughrgba2d11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov oC0, r0
+
+// approximately 2 instruction slots used (1 texture, 1 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+sample o0.xyzw, v1.xyxx, t0.xyzw, s0
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2D[] = {
+    68,  88,  66, 67,  184, 218, 64,  10,  229, 55,  228, 76,  217, 225, 255, 57,  166, 235, 140,
+    175, 1,   0,  0,   0,   192, 2,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   164, 0,
+    0,   0,   16, 1,   0,   0,   140, 1,   0,   0,   52,  2,   0,   0,   140, 2,   0,   0,   65,
+    111, 110, 57, 100, 0,   0,   0,   100, 0,   0,   0,   0,   2,   255, 255, 60,  0,   0,   0,
+    40,  0,   0,  0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,  40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 31,  0,   0,   2,   0,   0,
+    0,   128, 0,  0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144, 0,   8,   15,  160, 66,
+    0,   0,   3,  0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228, 160, 1,   0,   0,   2,
+    0,   8,   15, 128, 0,   0,   228, 128, 255, 255, 0,   0,   83,  72,  68,  82,  100, 0,   0,
+    0,   64,  0,  0,   0,   25,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,
+    0,   0,   88, 24,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,
+    16,  0,   3,  50,  16,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,
+    0,   0,   0,  0,   69,  0,   0,   9,   242, 32,  16,  0,   0,   0,   0,   0,   70,  16,  16,
+    0,   1,   0,  0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,
+    0,   0,   62, 0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,  0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,  0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   82,  68,  69,
+    70,  160, 0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,
+    0,   0,   0,  4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,
+    0,   0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,  0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,
+    0,   4,   0,  0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,
+    0,   0,   83, 97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,
+    77,  105, 99, 114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,
+    83,  104, 97, 100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,
+    57,  46,  57, 53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80,  0,
+    0,   0,   2,  0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,  3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,
+    0,   0,   0,  0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,
+    0,   83,  86, 95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,
+    82,  68,  0,  171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,
+    0,   0,   0,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,
+    0,   0,   0,  0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171,
+    171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d_4444_11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d_4444_11ps.h
index 221aaa2..e8f4114 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d_4444_11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d_4444_11ps.h
@@ -1,117 +1,117 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2D_4444 /T ps_4_0_level_9_3 /Fh

-//    compiled\passthroughrgba2d_4444_11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    def c0, 15, 0.5, 0.0666666701, 0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mad r0, r0, c0.x, c0.y

-    frc r1, r0

-    add r0, r0, -r1

-    mul r0, r0, c0.z

-    mov oC0, r0

-

-// approximately 6 instruction slots used (1 texture, 5 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2D_4444[] = {

-    68,  88,  66,  67,  181, 230, 28,  163, 183, 216, 19,  26,  254, 253, 53,  255, 203, 47,  5,

-    169, 1,   0,   0,   0,   132, 3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   252, 0,

-    0,   0,   212, 1,   0,   0,   80,  2,   0,   0,   248, 2,   0,   0,   80,  3,   0,   0,   65,

-    111, 110, 57,  188, 0,   0,   0,   188, 0,   0,   0,   0,   2,   255, 255, 148, 0,   0,   0,

-    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,

-    15,  160, 0,   0,   112, 65,  0,   0,   0,   63,  137, 136, 136, 61,  0,   0,   0,   0,   31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228, 128, 0,   0,   0,   160, 0,   0,

-    85,  160, 19,  0,   0,   2,   1,   0,   15,  128, 0,   0,   228, 128, 2,   0,   0,   3,   0,

-    0,   15,  128, 0,   0,   228, 128, 1,   0,   228, 129, 5,   0,   0,   3,   0,   0,   15,  128,

-    0,   0,   228, 128, 0,   0,   170, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228,

-    128, 255, 255, 0,   0,   83,  72,  68,  82,  208, 0,   0,   0,   64,  0,   0,   0,   52,  0,

-    0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,

-    112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,

-    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,

-    2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,

-    16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,

-    0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,

-    0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112,

-    65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,

-    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137, 136, 136, 61,

-    137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,

-    0,   92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,

-    0,   0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,

-    1,   0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120,

-    116, 117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,

-    0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2D_4444 /T ps_4_0_level_9_3 /Fh
+//    compiled\passthroughrgba2d_4444_11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 15, 0.5, 0.0666666701, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0, c0.x, c0.y
+    frc r1, r0
+    add r0, r0, -r1
+    mul r0, r0, c0.z
+    mov oC0, r0
+
+// approximately 6 instruction slots used (1 texture, 5 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2D_4444[] = {
+    68,  88,  66,  67,  181, 230, 28,  163, 183, 216, 19,  26,  254, 253, 53,  255, 203, 47,  5,
+    169, 1,   0,   0,   0,   132, 3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   252, 0,
+    0,   0,   212, 1,   0,   0,   80,  2,   0,   0,   248, 2,   0,   0,   80,  3,   0,   0,   65,
+    111, 110, 57,  188, 0,   0,   0,   188, 0,   0,   0,   0,   2,   255, 255, 148, 0,   0,   0,
+    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,
+    15,  160, 0,   0,   112, 65,  0,   0,   0,   63,  137, 136, 136, 61,  0,   0,   0,   0,   31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228, 128, 0,   0,   0,   160, 0,   0,
+    85,  160, 19,  0,   0,   2,   1,   0,   15,  128, 0,   0,   228, 128, 2,   0,   0,   3,   0,
+    0,   15,  128, 0,   0,   228, 128, 1,   0,   228, 129, 5,   0,   0,   3,   0,   0,   15,  128,
+    0,   0,   228, 128, 0,   0,   170, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228,
+    128, 255, 255, 0,   0,   83,  72,  68,  82,  208, 0,   0,   0,   64,  0,   0,   0,   52,  0,
+    0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,
+    112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,
+    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,
+    2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,
+    16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,
+    0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,
+    0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,  0,   0,   112,
+    65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,
+    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137, 136, 136, 61,
+    137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,
+    0,   92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,
+    0,   0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,
+    1,   0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120,
+    116, 117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,
+    0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d_5551_11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d_5551_11ps.h
index ef736bc..c0e6cfa 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d_5551_11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d_5551_11ps.h
@@ -1,117 +1,117 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2D_5551 /T ps_4_0_level_9_3 /Fh

-//    compiled\passthroughrgba2d_5551_11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-//

-// Sampler/Resource to DX9 shader sampler mappings:

-//

-// Target Sampler Source Sampler  Source Resource

-// -------------- --------------- ----------------

-// s0             s0              t0               

-//

-//

-// Level9 shader bytecode:

-//

-    ps_2_x

-    def c0, 31, 1, 0.5, 0.0322580636

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mad r0, r0, c0.xxxy, c0.z

-    frc r1, r0

-    add r0, r0, -r1

-    mul r0, r0, c0.wwwy

-    mov oC0, r0

-

-// approximately 6 instruction slots used (1 texture, 5 arithmetic)

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2D_5551[] = {

-    68,  88,  66,  67,  187, 10,  247, 243, 253, 108, 12,  228, 143, 154, 244, 52,  216, 197, 86,

-    249, 1,   0,   0,   0,   132, 3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   252, 0,

-    0,   0,   212, 1,   0,   0,   80,  2,   0,   0,   248, 2,   0,   0,   80,  3,   0,   0,   65,

-    111, 110, 57,  188, 0,   0,   0,   188, 0,   0,   0,   0,   2,   255, 255, 148, 0,   0,   0,

-    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,

-    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,

-    15,  160, 0,   0,   248, 65,  0,   0,   128, 63,  0,   0,   0,   63,  8,   33,  4,   61,  31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228, 128, 0,   0,   64,  160, 0,   0,

-    170, 160, 19,  0,   0,   2,   1,   0,   15,  128, 0,   0,   228, 128, 2,   0,   0,   3,   0,

-    0,   15,  128, 0,   0,   228, 128, 1,   0,   228, 129, 5,   0,   0,   3,   0,   0,   15,  128,

-    0,   0,   228, 128, 0,   0,   127, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228,

-    128, 255, 255, 0,   0,   83,  72,  68,  82,  208, 0,   0,   0,   64,  0,   0,   0,   52,  0,

-    0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,

-    112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,

-    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,

-    2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,

-    16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,

-    0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,

-    0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   248,

-    65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,

-    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  8,   33,  4,   61,

-    8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,

-    0,   92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,

-    0,   0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,

-    1,   0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120,

-    116, 117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,

-    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,

-    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,

-    73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,

-    0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2D_5551 /T ps_4_0_level_9_3 /Fh
+//    compiled\passthroughrgba2d_5551_11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 31, 1, 0.5, 0.0322580636
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0, c0.xxxy, c0.z
+    frc r1, r0
+    add r0, r0, -r1
+    mul r0, r0, c0.wwwy
+    mov oC0, r0
+
+// approximately 6 instruction slots used (1 texture, 5 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2D_5551[] = {
+    68,  88,  66,  67,  187, 10,  247, 243, 253, 108, 12,  228, 143, 154, 244, 52,  216, 197, 86,
+    249, 1,   0,   0,   0,   132, 3,   0,   0,   6,   0,   0,   0,   56,  0,   0,   0,   252, 0,
+    0,   0,   212, 1,   0,   0,   80,  2,   0,   0,   248, 2,   0,   0,   80,  3,   0,   0,   65,
+    111, 110, 57,  188, 0,   0,   0,   188, 0,   0,   0,   0,   2,   255, 255, 148, 0,   0,   0,
+    40,  0,   0,   0,   0,   0,   40,  0,   0,   0,   40,  0,   0,   0,   40,  0,   1,   0,   36,
+    0,   0,   0,   40,  0,   0,   0,   0,   0,   1,   2,   255, 255, 81,  0,   0,   5,   0,   0,
+    15,  160, 0,   0,   248, 65,  0,   0,   128, 63,  0,   0,   0,   63,  8,   33,  4,   61,  31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228, 128, 0,   0,   64,  160, 0,   0,
+    170, 160, 19,  0,   0,   2,   1,   0,   15,  128, 0,   0,   228, 128, 2,   0,   0,   3,   0,
+    0,   15,  128, 0,   0,   228, 128, 1,   0,   228, 129, 5,   0,   0,   3,   0,   0,   15,  128,
+    0,   0,   228, 128, 0,   0,   127, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228,
+    128, 255, 255, 0,   0,   83,  72,  68,  82,  208, 0,   0,   0,   64,  0,   0,   0,   52,  0,
+    0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,
+    112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,
+    1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,
+    2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,  16,
+    16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,
+    0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,
+    0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   248, 65,  0,   0,   248,
+    65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,   0,   70,  14,
+    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,   0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,  8,   33,  4,   61,
+    8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   3,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   82,  68,  69,  70,  160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   28,  0,   0,   0,   0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,
+    0,   92,  0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,
+    0,   0,   0,   5,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,
+    1,   0,   0,   0,   13,  0,   0,   0,   83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120,
+    116, 117, 114, 101, 70,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,
+    32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108,
+    101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171,
+    73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,
+    0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray11ps.h
index 24477dc..be55672 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray11ps.h
@@ -1,86 +1,86 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2DArray /T ps_4_0 /Fh

-//    compiled\passthroughrgba2darray11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample o0.xyzw, r0.xyzx, t0.xyzw, s0

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2DArray[] = {

-    68,  88,  66,  67,  148, 154, 188, 83,  129, 94,  72,  95,  71,  120, 64,  206, 76, 52,  234,

-    173, 1,   0,   0,   0,   192, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   68,  2,   0,   0,   82,  68,  69, 70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,  0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,

-    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  164, 0,   0,   0,  64,  0,

-    0,   0,   41,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,

-    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,  0,   4,

-    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50, 16,  16,

-    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,  104, 0,

-    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,  0,   10,

-    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,

-    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 32,  16,  0,   0,  0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,  0,   96,

-    16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,  0,   4,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2DArray /T ps_4_0 /Fh
+//    compiled\passthroughrgba2darray11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample o0.xyzw, r0.xyzx, t0.xyzw, s0
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DArray[] = {
+    68,  88,  66,  67,  148, 154, 188, 83,  129, 94,  72,  95,  71,  120, 64,  206, 76, 52,  234,
+    173, 1,   0,   0,   0,   192, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   68,  2,   0,   0,   82,  68,  69, 70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,  0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,
+    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  164, 0,   0,   0,  64,  0,
+    0,   0,   41,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,
+    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,  0,   4,
+    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50, 16,  16,
+    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,  104, 0,
+    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,  0,   10,
+    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,
+    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 32,  16,  0,   0,  0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,  0,   96,
+    16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,  0,   4,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   1,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray_4444_11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray_4444_11ps.h
index 13abd2d..7b46eb5 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray_4444_11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray_4444_11ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2DArray_4444 /T ps_4_0 /Fh

-//    compiled\passthroughrgba2darray_4444_11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2DArray_4444[] = {

-    68,  88,  66,  67,  61,  140, 14,  155, 149, 30,  84,  37,  234, 238, 138, 36,  31,  128, 78,

-    120, 1,   0,   0,   0,   36,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   168, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  8,   1,   0,   0,   64,  0,

-    0,   0,   66,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,

-    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,

-    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,

-    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,

-    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,

-    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,

-    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,

-    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,

-    0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,

-    0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,

-    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137,

-    136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,

-    116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2DArray_4444 /T ps_4_0 /Fh
+//    compiled\passthroughrgba2darray_4444_11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DArray_4444[] = {
+    68,  88,  66,  67,  61,  140, 14,  155, 149, 30,  84,  37,  234, 238, 138, 36,  31,  128, 78,
+    120, 1,   0,   0,   0,   36,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   168, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  8,   1,   0,   0,   64,  0,
+    0,   0,   66,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,   0,   4,
+    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50,  16,  16,
+    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,
+    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,
+    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,
+    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,
+    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,   70,
+    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112, 65,
+    0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,   0,
+    0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,   0,
+    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,  137,
+    136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,  84,
+    116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray_5551_11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray_5551_11ps.h
index cff17ed..c7ed3eb 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray_5551_11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darray_5551_11ps.h
@@ -1,94 +1,94 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2DArray_5551 /T ps_4_0 /Fh

-//    compiled\passthroughrgba2darray_5551_11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2DArray_5551[] = {

-    68,  88,  66,  67,  209, 124, 27,  45,  239, 120, 103, 6,   221, 133, 157, 71,  79, 73,  236,

-    138, 1,   0,   0,   0,   36,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   168, 2,   0,   0,   82,  68,  69, 70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,  0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,

-    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  8,   1,   0,   0,  64,  0,

-    0,   0,   66,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,

-    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,  0,   4,

-    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50, 16,  16,

-    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,  104, 0,

-    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,  0,   10,

-    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,

-    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,  0,   0,

-    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,  0,   96,

-    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,  0,   70,

-    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,  248, 65,

-    0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,  0,   0,

-    0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,  0,   0,

-    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,  61,  8,

-    33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84, 65,  84,

-    116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,  0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2DArray_5551 /T ps_4_0 /Fh
+//    compiled\passthroughrgba2darray_5551_11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DArray_5551[] = {
+    68,  88,  66,  67,  209, 124, 27,  45,  239, 120, 103, 6,   221, 133, 157, 71,  79, 73,  236,
+    138, 1,   0,   0,   0,   36,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   168, 2,   0,   0,   82,  68,  69, 70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,  0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,
+    7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  8,   1,   0,   0,  64,  0,
+    0,   0,   66,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,
+    64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   100, 8,  0,   4,
+    18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,   3,   50, 16,  16,
+    0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,  104, 0,
+    0,   2,   1,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,  0,   10,
+    16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,
+    70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,  0,   0,
+    0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,  0,   96,
+    16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,  0,   70,
+    14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,  248, 65,
+    0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,  0,   0,
+    0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,  0,   0,
+    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,  61,  8,
+    33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84, 65,  84,
+    116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   3,  0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darrayi11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darrayi11ps.h
index 66d27ab..c1d45a2 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darrayi11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darrayi11ps.h
@@ -1,89 +1,89 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2DArrayI /T ps_4_0 /Fh

-//    compiled\passthroughrgba2darrayi11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture2darray (sint,sint,sint,sint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld o0.xyzw, r0.xyzw, t0.xyzw

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2DArrayI[] = {

-    68,  88,  66,  67,  5,   189, 13,  241, 119, 156, 1,   197, 65,  203, 237, 2,   64,  152, 186,

-    206, 1,   0,   0,   0,   228, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   104, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  240, 0,   0,   0,   64,  0,   0,   0,

-    60,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,

-    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,

-    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,

-    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,

-    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,

-    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2DArrayI /T ps_4_0 /Fh
+//    compiled\passthroughrgba2darrayi11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture2darray (sint,sint,sint,sint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DArrayI[] = {
+    68,  88,  66,  67,  5,   189, 13,  241, 119, 156, 1,   197, 65,  203, 237, 2,   64,  152, 186,
+    206, 1,   0,   0,   0,   228, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   104, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  240, 0,   0,   0,   64,  0,   0,   0,
+    60,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,
+    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,
+    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,
+    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,
+    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,
+    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darrayui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darrayui11ps.h
index 84dfb69..a1b050a 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darrayui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2darrayui11ps.h
@@ -1,89 +1,89 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2DArrayUI /T ps_4_0 /Fh

-//    compiled\passthroughrgba2darrayui11ps.h Passthrough2DArray11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4     2darray    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture2darray (uint,uint,uint,uint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld o0.xyzw, r0.xyzw, t0.xyzw

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2DArrayUI[] = {

-    68,  88,  66,  67,  5,   138, 102, 222, 93,  168, 178, 120, 117, 240, 177, 152, 209, 17,  205,

-    155, 1,   0,   0,   0,   228, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   104, 2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  240, 0,   0,   0,   64,  0,   0,   0,

-    60,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,

-    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,

-    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,

-    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,

-    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,

-    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2DArrayUI /T ps_4_0 /Fh
+//    compiled\passthroughrgba2darrayui11ps.h Passthrough2DArray11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4     2darray    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2darray (uint,uint,uint,uint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DArrayUI[] = {
+    68,  88,  66,  67,  5,   138, 102, 222, 93,  168, 178, 120, 117, 240, 177, 152, 209, 17,  205,
+    155, 1,   0,   0,   0,   228, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   104, 2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,   0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   1,   0,   0,   118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,   7,   3,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  240, 0,   0,   0,   64,  0,   0,   0,
+    60,  0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,
+    0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,
+    0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,
+    0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,   16,
+    0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130, 0,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242,
+    32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   8,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h
index c458507..8347f23 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h
@@ -1,83 +1,83 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2DI /T ps_4_0 /Fh

-//    compiled\passthroughrgba2di11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture2d (sint,sint,sint,sint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld o0.xyzw, r0.xyzw, t0.xyzw

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2DI[] = {

-    68,  88,  66,  67,  95,  246, 206, 5,   65,  242, 73,  197, 5,   64, 172, 186, 253, 27,  87,

-    195, 1,   0,   0,   0,   156, 2,   0,   0,   5,   0,   0,   0,   52, 0,   0,   0,   180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   32,  2,   0,   0,  82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,  0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,  0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73, 0,   77,  105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,   2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,  86,  95,

-    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,  0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,  0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,  72,  68,

-    82,  216, 0,   0,   0,   64,  0,   0,   0,   54,  0,   0,   0,   88, 24,  0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,  50,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,  0,   104, 0,   0,   2,

-    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,  0,   0,   1,   64,  0,

-    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86, 0,   0,   5,   50,  0,

-    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,  56,  0,   0,   7,   50,

-    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,  0,   70,  16,  16,  0,

-    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,   70,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,  0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   45,

-    0,   0,   7,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16, 0,   0,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84, 65,  84,  116, 0,   0,

-    0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,  0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2DI /T ps_4_0 /Fh
+//    compiled\passthroughrgba2di11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DI[] = {
+    68,  88,  66,  67,  95,  246, 206, 5,   65,  242, 73,  197, 5,   64, 172, 186, 253, 27,  87,
+    195, 1,   0,   0,   0,   156, 2,   0,   0,   5,   0,   0,   0,   52, 0,   0,   0,   180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   32,  2,   0,   0,  82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,  0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,  0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73, 0,   77,  105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46, 50,  57,  46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  80, 0,   0,   0,   2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,  1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,  0,   0,   83,  86,  95,
+    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79, 79,  82,  68,  0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,  8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,  0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,  171, 171, 83,  72,  68,
+    82,  216, 0,   0,   0,   64,  0,   0,   0,   54,  0,   0,   0,   88, 24,  0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,  50,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,  0,   104, 0,   0,   2,
+    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,  0,   0,   1,   64,  0,
+    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86, 0,   0,   5,   50,  0,
+    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,  56,  0,   0,   7,   50,
+    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,  0,   70,  16,  16,  0,
+    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,  0,   0,   70,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,  0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   45,
+    0,   0,   7,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16, 0,   0,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84, 65,  84,  116, 0,   0,
+    0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,  0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h
index dca98d8..56d4c63 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h
@@ -1,80 +1,80 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureF_MS                       texture  float4        2dMS    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue  Format   Used

-// -------------------- ----- ------ -------- -------- ------- ------

-// SV_POSITION              0   xyzw        0      POS   float       

-// TEXCORD                  0   xy          1     NONE   float   xy  

-// SV_SAMPLEINDEX           0   x           2   SAMPLE    uint   x   

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue  Format   Used

-// -------------------- ----- ------ -------- -------- ------- ------

-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw

-//

-// Pixel Shader runs at sample frequency

-//

-ps_4_1

-dcl_globalFlags refactoringAllowed

-dcl_resource_texture2dms(0) (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_input_ps_sgv v2.x, sampleIndex

-dcl_output o0.xyzw

-dcl_temps 1

-ftou r0.xy, v1.xyxx

-mov r0.zw, l(0,0,0,0)

-ldms o0.xyzw, r0.xyzw, t0.xyzw, v2.x

-ret 

-// Approximately 4 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2DMS[] = {

-    68,  88,  66,  67,  24,  185, 64,  224, 216, 192, 107, 84,  140, 208, 46, 210, 75,  20,  1,

-    202, 1,   0,   0,   0,   148, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,   0,   184, 0,

-    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   24,  2,   0,   0,   82, 68,  69,  70,  124,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28,  0,   0,   0,

-    1,   4,   255, 255, 0,   1,   0,   0,   72,  0,   0,   0,   60,  0,   0,  0,   2,   0,   0,

-    0,   5,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 70,  95, 77,  83,  0,   77,

-    105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76, 83,  76,  32,  83,

-    104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32, 54,  46,  51,  46,

-    57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 73,  83, 71,  78,  116, 0,

-    0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,  0,   0,   0,   1,

-    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,  92,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,  0,   3,   3,   0,

-    0,   100, 0,   0,   0,   0,   0,   0,   0,   10,  0,   0,   0,   1,   0,  0,   0,   2,   0,

-    0,   0,   1,   1,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73, 79,  78,  0,   84,

-    69,  88,  67,  79,  82,  68,  0,   83,  86,  95,  83,  65,  77,  80,  76, 69,  73,  78,  68,

-    69,  88,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,  0,   8,   0,   0,

-    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,  0,   0,   0,   0,

-    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84, 0,   171, 171, 83,

-    72,  68,  82,  168, 0,   0,   0,   65,  0,   0,   0,   42,  0,   0,   0,  106, 8,   0,   1,

-    88,  32,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,  0,   98,  16,  0,

-    3,   50,  16,  16,  0,   1,   0,   0,   0,   99,  8,   0,   4,   18,  16, 16,  0,   2,   0,

-    0,   0,   10,  0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,  0,   0,   0,   104,

-    0,   0,   2,   1,   0,   0,   0,   28,  0,   0,   5,   50,  0,   16,  0,  0,   0,   0,   0,

-    70,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16, 0,   0,   0,   0,

-    0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   46,  0,   0,   9,   242, 32,  16,  0,   0,   0,   0,   0,   70, 14,  16,  0,   0,

-    0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   10,  16,  16,  0,  2,   0,   0,   0,

-    62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,  0,   1,   0,   0,

-    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureF_MS                       texture  float4        2dMS    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCORD                  0   xy          1     NONE   float   xy  
+// SV_SAMPLEINDEX           0   x           2   SAMPLE    uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+// Pixel Shader runs at sample frequency
+//
+ps_4_1
+dcl_globalFlags refactoringAllowed
+dcl_resource_texture2dms(0) (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_input_ps_sgv v2.x, sampleIndex
+dcl_output o0.xyzw
+dcl_temps 1
+ftou r0.xy, v1.xyxx
+mov r0.zw, l(0,0,0,0)
+ldms o0.xyzw, r0.xyzw, t0.xyzw, v2.x
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DMS[] = {
+    68,  88,  66,  67,  24,  185, 64,  224, 216, 192, 107, 84,  140, 208, 46, 210, 75,  20,  1,
+    202, 1,   0,   0,   0,   148, 2,   0,   0,   5,   0,   0,   0,   52,  0,  0,   0,   184, 0,
+    0,   0,   52,  1,   0,   0,   104, 1,   0,   0,   24,  2,   0,   0,   82, 68,  69,  70,  124,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,  28,  0,   0,   0,
+    1,   4,   255, 255, 0,   1,   0,   0,   72,  0,   0,   0,   60,  0,   0,  0,   2,   0,   0,
+    0,   5,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 70,  95, 77,  83,  0,   77,
+    105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76, 83,  76,  32,  83,
+    104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32, 54,  46,  51,  46,
+    57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 73,  83, 71,  78,  116, 0,
+    0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,  0,   0,   0,   1,
+    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,  92,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,  0,   3,   3,   0,
+    0,   100, 0,   0,   0,   0,   0,   0,   0,   10,  0,   0,   0,   1,   0,  0,   0,   2,   0,
+    0,   0,   1,   1,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73, 79,  78,  0,   84,
+    69,  88,  67,  79,  82,  68,  0,   83,  86,  95,  83,  65,  77,  80,  76, 69,  73,  78,  68,
+    69,  88,  0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,  0,   8,   0,   0,
+    0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,  0,   0,   0,   0,
+    0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84, 0,   171, 171, 83,
+    72,  68,  82,  168, 0,   0,   0,   65,  0,   0,   0,   42,  0,   0,   0,  106, 8,   0,   1,
+    88,  32,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,  0,   98,  16,  0,
+    3,   50,  16,  16,  0,   1,   0,   0,   0,   99,  8,   0,   4,   18,  16, 16,  0,   2,   0,
+    0,   0,   10,  0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,  0,   0,   0,   104,
+    0,   0,   2,   1,   0,   0,   0,   28,  0,   0,   5,   50,  0,   16,  0,  0,   0,   0,   0,
+    70,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16, 0,   0,   0,   0,
+    0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   46,  0,   0,   9,   242, 32,  16,  0,   0,   0,   0,   0,   70, 14,  16,  0,   0,
+    0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   10,  16,  16,  0,  2,   0,   0,   0,
+    62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   4,   0,   0,  0,   1,   0,   0,
+    0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,  0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h
index bda58ea..e26df78 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h
@@ -1,83 +1,83 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA2DUI /T ps_4_0 /Fh

-//    compiled\passthroughrgba2dui11ps.h Passthrough2D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4          2d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture2d (uint,uint,uint,uint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld o0.xyzw, r0.xyzw, t0.xyzw

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA2DUI[] = {

-    68,  88,  66,  67,  159, 192, 164, 129, 44,  28,  150, 201, 25,  200, 72,  168, 76,  37,  93,

-    246, 1,   0,   0,   0,   156, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   32,  2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,

-    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,

-    82,  216, 0,   0,   0,   64,  0,   0,   0,   54,  0,   0,   0,   88,  24,  0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,

-    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,

-    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,

-    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,

-    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,

-    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,

-    0,   0,   7,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,

-    70,  126, 16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,

-    0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA2DUI /T ps_4_0 /Fh
+//    compiled\passthroughrgba2dui11ps.h Passthrough2D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DUI[] = {
+    68,  88,  66,  67,  159, 192, 164, 129, 44,  28,  150, 201, 25,  200, 72,  168, 76,  37,  93,
+    246, 1,   0,   0,   0,   156, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   32,  2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,   77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,
+    80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,
+    82,  216, 0,   0,   0,   64,  0,   0,   0,   54,  0,   0,   0,   88,  24,  0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,
+    1,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,
+    0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,
+    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,
+    0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,
+    1,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,
+    0,   0,   7,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,
+    70,  126, 16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,
+    0,   7,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h
index 851787a..1965700 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h
@@ -1,78 +1,78 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA3D /T ps_4_0 /Fh

-//    compiled\passthroughrgba3d11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-sample o0.xyzw, v2.xyzx, t0.xyzw, s0

-ret 

-// Approximately 2 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA3D[] = {

-    68,  88,  66,  67,  249, 218, 187, 23,  150, 61,  9,   105, 122, 199, 110, 26,  29, 97,  207,

-    112, 1,   0,   0,   0,   128, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   4,   2,   0,   0,   82,  68,  69, 70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,

-    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  100, 0,   0,   0,  64,  0,

-    0,   0,   25,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16, 0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,  0,   0,

-    0,   69,  0,   0,   9,   242, 32,  16,  0,   0,   0,   0,   0,   70,  18,  16,  0,  2,   0,

-    0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,  0,   62,

-    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA3D /T ps_4_0 /Fh
+//    compiled\passthroughrgba3d11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+sample o0.xyzw, v2.xyzx, t0.xyzw, s0
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA3D[] = {
+    68,  88,  66,  67,  249, 218, 187, 23,  150, 61,  9,   105, 122, 199, 110, 26,  29, 97,  207,
+    112, 1,   0,   0,   0,   128, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,  220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   4,   2,   0,   0,   82,  68,  69, 70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,  0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,  0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,  0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,  77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,  0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,  0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,  0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,  0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,  0,   0,
+    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83, 86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89, 73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71, 78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83, 86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  100, 0,   0,   0,  64,  0,
+    0,   0,   25,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,  0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16, 0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,  0,   0,
+    0,   69,  0,   0,   9,   242, 32,  16,  0,   0,   0,   0,   0,   70,  18,  16,  0,  2,   0,
+    0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,  0,   62,
+    0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   2,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d_4444_11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d_4444_11ps.h
index 61b6d59..a19ab8f 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d_4444_11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d_4444_11ps.h
@@ -1,88 +1,88 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA3D_4444 /T ps_4_0 /Fh

-//    compiled\passthroughrgba3d_4444_11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA3D_4444[] = {

-    68,  88,  66,  67,  34,  122, 167, 6,   161, 200, 45,  27,  155, 205, 20,  94,  188, 182, 46,

-    114, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  208, 0,   0,   0,   64,  0,

-    0,   0,   52,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,

-    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,

-    96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,

-    70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112,

-    65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,

-    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,

-    0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,

-    137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA3D_4444 /T ps_4_0 /Fh
+//    compiled\passthroughrgba3d_4444_11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.066667, 0.066667, 0.066667, 0.066667)
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA3D_4444[] = {
+    68,  88,  66,  67,  34,  122, 167, 6,   161, 200, 45,  27,  155, 205, 20,  94,  188, 182, 46,
+    114, 1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  208, 0,   0,   0,   64,  0,
+    0,   0,   52,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,
+    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,
+    96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,
+    70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   112, 65,  0,   0,   112,
+    65,  0,   0,   112, 65,  0,   0,   112, 65,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,
+    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,
+    0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   137, 136, 136, 61,
+    137, 136, 136, 61,  137, 136, 136, 61,  137, 136, 136, 61,  62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d_5551_11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d_5551_11ps.h
index 96b65e4..b048b57 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d_5551_11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d_5551_11ps.h
@@ -1,88 +1,88 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA3D_5551 /T ps_4_0 /Fh

-//    compiled\passthroughrgba3d_5551_11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF                          texture  float4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)

-round_ne r0.xyzw, r0.xyzw

-mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)

-ret 

-// Approximately 5 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA3D_5551[] = {

-    68,  88,  66,  67,  145, 96,  104, 51,  195, 218, 236, 165, 55,  186, 12,  206, 155, 10,  90,

-    25,  1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,

-    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  160,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,

-    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,

-    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,

-    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,

-    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,

-    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,

-    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,

-    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  208, 0,   0,   0,   64,  0,

-    0,   0,   52,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,

-    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,

-    96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,

-    70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   248,

-    65,  0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,

-    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,

-    0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,

-    8,   33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,

-    84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA3D_5551 /T ps_4_0 /Fh
+//    compiled\passthroughrgba3d_5551_11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mul r0.xyzw, r0.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000)
+round_ne r0.xyzw, r0.xyzw
+mul o0.xyzw, r0.xyzw, l(0.032258, 0.032258, 0.032258, 1.000000)
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA3D_5551[] = {
+    68,  88,  66,  67,  145, 96,  104, 51,  195, 218, 236, 165, 55,  186, 12,  206, 155, 10,  90,
+    25,  1,   0,   0,   0,   236, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   220, 0,
+    0,   0,   100, 1,   0,   0,   152, 1,   0,   0,   112, 2,   0,   0,   82,  68,  69,  70,  160,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   109, 0,   0,   0,   92,  0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   100, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    83,  97,  109, 112, 108, 101, 114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,   0,
+    3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,   0,
+    0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   118,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,   0,
+    7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,  95,
+    82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,  78,
+    68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,  44,
+    0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,
+    84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  208, 0,   0,   0,   64,  0,
+    0,   0,   52,  0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   104, 0,   0,   2,   1,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,
+    0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,
+    96,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 0,   16,  0,   0,   0,   0,   0,
+    70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   248, 65,  0,   0,   248,
+    65,  0,   0,   248, 65,  0,   0,   128, 63,  64,  0,   0,   5,   242, 0,   16,  0,   0,   0,
+    0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  242, 32,  16,  0,   0,
+    0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   8,   33,  4,   61,
+    8,   33,  4,   61,  8,   33,  4,   61,  0,   0,   128, 63,  62,  0,   0,   1,   83,  84,  65,
+    84,  116, 0,   0,   0,   5,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h
index 58fb3e9..3d9180e 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h
@@ -1,86 +1,86 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA3DI /T ps_4_0 /Fh

-//    compiled\passthroughrgba3di11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI                          texture   sint4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_resource_texture3d (sint,sint,sint,sint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld o0.xyzw, r0.xyzw, t0.xyzw

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA3DI[] = {

-    68,  88,  66,  67,  114, 209, 219, 121, 211, 105, 24,  83,  99,  59,  231, 76, 145, 78,  142,

-    39,  1,   0,   0,   0,   192, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   68,  2,   0,   0,   82,  68, 69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,  2,   0,   0,

-    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,  0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77, 105, 99,  114,

-    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83, 104, 97,  100,

-    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57, 46,  57,  53,

-    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,  0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,  0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,  0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,  118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,  0,   7,   7,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86, 95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73, 78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78, 44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86, 95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  204, 0,   0,   0,   64, 0,   0,   0,

-    51,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,  51,  51,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,  3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16, 0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70, 126, 16,  0,

-    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,  70,  2,   16,

-    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,  0,   70,  2,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,  0,   5,   114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54, 0,   0,   5,

-    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  45,  0,   0,

-    7,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,  0,   70,  126,

-    16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,  0,   0,   7,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA3DI /T ps_4_0 /Fh
+//    compiled\passthroughrgba3di11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA3DI[] = {
+    68,  88,  66,  67,  114, 209, 219, 121, 211, 105, 24,  83,  99,  59,  231, 76, 145, 78,  142,
+    39,  1,   0,   0,   0,   192, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   68,  2,   0,   0,   82,  68, 69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   69,  0,   0,   0,   60,  0,   0,   0,  2,   0,   0,
+    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,  0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 73,  0,   77, 105, 99,  114,
+    111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83, 104, 97,  100,
+    101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57, 46,  57,  53,
+    50,  46,  51,  49,  49,  49,  0,   171, 171, 73,  83,  71,  78,  128, 0,   0,  0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,  0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,  0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,  118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,  0,   7,   7,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86, 95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73, 78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78, 44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86, 95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  204, 0,   0,   0,   64, 0,   0,   0,
+    51,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,  51,  51,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,  3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16, 0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70, 126, 16,  0,
+    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,  70,  2,   16,
+    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,  0,   70,  2,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,  0,   5,   114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54, 0,   0,   5,
+    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  45,  0,   0,
+    7,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,  0,   70,  126,
+    16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,  0,   0,   7,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h
index 022bb69..59e1574 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h
@@ -1,86 +1,86 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_PassthroughRGBA3DUI /T ps_4_0 /Fh

-//    compiled\passthroughrgba3dui11ps.h Passthrough3D11.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI                         texture   uint4          3d    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_resource_texture3d (uint,uint,uint,uint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld o0.xyzw, r0.xyzw, t0.xyzw

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_PS_PassthroughRGBA3DUI[] = {

-    68,  88,  66,  67,  117, 34,  123, 144, 139, 50,  107, 8,   199, 58,  188, 37, 26,  62,  108,

-    21,  1,   0,   0,   0,   192, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   180, 0,

-    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   68,  2,   0,   0,   82,  68, 69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28, 0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,  2,   0,   0,

-    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,  0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,  77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104, 97,

-    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,  57,

-    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,  0,   3,   0,

-    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,  0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,  0,   0,   0,

-    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,  118, 0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,  0,   7,   7,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86, 95,  82,  69,

-    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73, 78,  68,  69,

-    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78, 44,  0,   0,

-    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86, 95,  84,  65,

-    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  204, 0,   0,   0,   64, 0,   0,   0,

-    51,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,  68,  68,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,  3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16, 0,   7,   242,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70, 126, 16,  0,

-    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,  70,  2,   16,

-    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,  0,   70,  2,

-    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,  0,   5,   114,

-    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54, 0,   0,   5,

-    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  45,  0,   0,

-    7,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,  0,   70,  126,

-    16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,  0,   0,   7,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,

-    0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_PassthroughRGBA3DUI /T ps_4_0 /Fh
+//    compiled\passthroughrgba3dui11ps.h Passthrough3D11.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA3DUI[] = {
+    68,  88,  66,  67,  117, 34,  123, 144, 139, 50,  107, 8,   199, 58,  188, 37, 26,  62,  108,
+    21,  1,   0,   0,   0,   192, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,  0,   180, 0,
+    0,   0,   60,  1,   0,   0,   112, 1,   0,   0,   68,  2,   0,   0,   82,  68, 69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28, 0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   70,  0,   0,   0,   60,  0,   0,   0,  2,   0,   0,
+    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,  0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 85,  73,  0,  77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32, 83,  104, 97,
+    100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50, 57,  46,  57,
+    53,  50,  46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  128, 0,   0,  0,   3,   0,
+    0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,  0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,  0,   0,   0,
+    4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,  118, 0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,  0,   7,   7,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86, 95,  82,  69,
+    78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73, 78,  68,  69,
+    88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78, 44,  0,   0,
+    0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86, 95,  84,  65,
+    82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  204, 0,   0,   0,   64, 0,   0,   0,
+    51,  0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,  68,  68,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,  3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   61,  16, 0,   7,   242,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70, 126, 16,  0,
+    0,   0,   0,   0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,  70,  2,   16,
+    0,   0,   0,   0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,  0,   70,  2,
+    16,  0,   0,   0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,  0,   5,   114,
+    0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54, 0,   0,   5,
+    130, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,  45,  0,   0,
+    7,   242, 32,  16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,  0,   70,  126,
+    16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,  0,   0,   7,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0,   0,
+    0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvecolor2dps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvecolor2dps.h
index d7747a6..b214a23 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvecolor2dps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvecolor2dps.h
@@ -1,107 +1,107 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ResolveColor2D /T ps_4_1 /Fh compiled\resolvecolor2dps.h

-//    ResolveColor.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureF_MS                       texture  float4        2dMS    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCORD                  0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_1

-dcl_globalFlags refactoringAllowed

-dcl_resource_texture2dms(0) (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 4

-resinfo_uint r0.xy, l(0), t0.xyzw

-sampleinfo_uint r0.z, t0.x

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftou r1.xy, r0.xyxx

-mov r1.zw, l(0,0,0,0)

-mov r2.xyzw, l(0,0,0,0)

-mov r0.x, l(0)

-loop 

-  uge r0.y, r0.x, r0.z

-  breakc_nz r0.y

-  ldms r3.xyzw, r1.xyzw, t0.xyzw, r0.x

-  add r2.xyzw, r2.xyzw, r3.xyzw

-  iadd r0.x, r0.x, l(1)

-endloop 

-sampleinfo r0.x, t0.x

-div o0.xyzw, r2.xyzw, r0.xxxx

-ret 

-// Approximately 18 instruction slots used

-#endif

-

-const BYTE g_PS_ResolveColor2D[] = {

-    68,  88,  66,  67,  192, 130, 252, 156, 103, 192, 177, 148, 25,  142, 181, 214, 173, 217, 123,

-    174, 1,   0,   0,   0,   136, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   184, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   12,  3,   0,   0,   82,  68,  69,  70,  124,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    1,   4,   255, 255, 0,   1,   0,   0,   72,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   5,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  77,  83,  0,   77,

-    105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,

-    104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,

-    46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  76,  0,

-    0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,

-    0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  82,

-    68,  0,   79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,

-    82,  196, 1,   0,   0,   65,  0,   0,   0,   113, 0,   0,   0,   106, 8,   0,   1,   88,  32,

-    0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,

-    16,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,

-    104, 0,   0,   2,   4,   0,   0,   0,   61,  16,  0,   7,   50,  0,   16,  0,   0,   0,   0,

-    0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   111, 8,

-    0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,  112, 16,  0,   0,   0,   0,   0,   86,

-    0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,

-    56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,

-    0,   70,  16,  16,  0,   1,   0,   0,   0,   28,  0,   0,   5,   50,  0,   16,  0,   1,   0,

-    0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   1,

-    0,   0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   8,   242, 0,   16,  0,   2,   0,   0,   0,   2,   64,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,

-    0,   5,   18,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   48,

-    0,   0,   1,   80,  0,   0,   7,   34,  0,   16,  0,   0,   0,   0,   0,   10,  0,   16,  0,

-    0,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   3,   0,   4,   3,   26,  0,   16,

-    0,   0,   0,   0,   0,   46,  0,   0,   9,   242, 0,   16,  0,   3,   0,   0,   0,   70,  14,

-    16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,

-    0,   0,   0,   0,   0,   0,   7,   242, 0,   16,  0,   2,   0,   0,   0,   70,  14,  16,  0,

-    2,   0,   0,   0,   70,  14,  16,  0,   3,   0,   0,   0,   30,  0,   0,   7,   18,  0,   16,

-    0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,

-    0,   0,   22,  0,   0,   1,   111, 0,   0,   5,   18,  0,   16,  0,   0,   0,   0,   0,   10,

-    112, 16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   242, 32,  16,  0,   0,   0,   0,   0,

-    70,  14,  16,  0,   2,   0,   0,   0,   6,   0,   16,  0,   0,   0,   0,   0,   62,  0,   0,

-    1,   83,  84,  65,  84,  116, 0,   0,   0,   18,  0,   0,   0,   4,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,   0,   2,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ResolveColor2D /T ps_4_1 /Fh compiled\resolvecolor2dps.h
+//    ResolveColor.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureF_MS                       texture  float4        2dMS    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCORD                  0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_1
+dcl_globalFlags refactoringAllowed
+dcl_resource_texture2dms(0) (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 4
+resinfo_uint r0.xy, l(0), t0.xyzw
+sampleinfo_uint r0.z, t0.x
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftou r1.xy, r0.xyxx
+mov r1.zw, l(0,0,0,0)
+mov r2.xyzw, l(0,0,0,0)
+mov r0.x, l(0)
+loop 
+  uge r0.y, r0.x, r0.z
+  breakc_nz r0.y
+  ldms r3.xyzw, r1.xyzw, t0.xyzw, r0.x
+  add r2.xyzw, r2.xyzw, r3.xyzw
+  iadd r0.x, r0.x, l(1)
+endloop 
+sampleinfo r0.x, t0.x
+div o0.xyzw, r2.xyzw, r0.xxxx
+ret 
+// Approximately 18 instruction slots used
+#endif
+
+const BYTE g_PS_ResolveColor2D[] = {
+    68,  88,  66,  67,  192, 130, 252, 156, 103, 192, 177, 148, 25,  142, 181, 214, 173, 217, 123,
+    174, 1,   0,   0,   0,   136, 3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   184, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   12,  3,   0,   0,   82,  68,  69,  70,  124,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    1,   4,   255, 255, 0,   1,   0,   0,   72,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   5,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   84,  101, 120, 116, 117, 114, 101, 70,  95,  77,  83,  0,   77,
+    105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,
+    104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,
+    46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  76,  0,
+    0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,
+    0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  82,
+    68,  0,   79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,
+    82,  196, 1,   0,   0,   65,  0,   0,   0,   113, 0,   0,   0,   106, 8,   0,   1,   88,  32,
+    0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,
+    16,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,
+    104, 0,   0,   2,   4,   0,   0,   0,   61,  16,  0,   7,   50,  0,   16,  0,   0,   0,   0,
+    0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   111, 8,
+    0,   5,   66,  0,   16,  0,   0,   0,   0,   0,   10,  112, 16,  0,   0,   0,   0,   0,   86,
+    0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,
+    56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,
+    0,   70,  16,  16,  0,   1,   0,   0,   0,   28,  0,   0,   5,   50,  0,   16,  0,   1,   0,
+    0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   1,
+    0,   0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   8,   242, 0,   16,  0,   2,   0,   0,   0,   2,   64,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,
+    0,   5,   18,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   48,
+    0,   0,   1,   80,  0,   0,   7,   34,  0,   16,  0,   0,   0,   0,   0,   10,  0,   16,  0,
+    0,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   3,   0,   4,   3,   26,  0,   16,
+    0,   0,   0,   0,   0,   46,  0,   0,   9,   242, 0,   16,  0,   3,   0,   0,   0,   70,  14,
+    16,  0,   1,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,
+    0,   0,   0,   0,   0,   0,   7,   242, 0,   16,  0,   2,   0,   0,   0,   70,  14,  16,  0,
+    2,   0,   0,   0,   70,  14,  16,  0,   3,   0,   0,   0,   30,  0,   0,   7,   18,  0,   16,
+    0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   1,   0,
+    0,   0,   22,  0,   0,   1,   111, 0,   0,   5,   18,  0,   16,  0,   0,   0,   0,   0,   10,
+    112, 16,  0,   0,   0,   0,   0,   14,  0,   0,   7,   242, 32,  16,  0,   0,   0,   0,   0,
+    70,  14,  16,  0,   2,   0,   0,   0,   6,   0,   16,  0,   0,   0,   0,   0,   62,  0,   0,
+    1,   83,  84,  65,  84,  116, 0,   0,   0,   18,  0,   0,   0,   4,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,   0,   2,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepth11_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepth11_ps.h
index c9ddbd8..48fd119 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepth11_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepth11_ps.h
@@ -1,86 +1,86 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ResolveDepth /T ps_4_1 /Fh compiled/resolvedepth11_ps.h

-//    ResolveDepthStencil.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Depth                             texture   float        2dMS    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Depth                 0    N/A   oDepth    DEPTH  float    YES

-//

-ps_4_1

-dcl_globalFlags refactoringAllowed

-dcl_resource_texture2dms(0) (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output oDepth

-dcl_temps 1

-resinfo_uint r0.xy, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftou r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ldms r0.x, r0.xyzw, t0.xyzw, l(0)

-mov oDepth, r0.x

-ret 

-// Approximately 8 instruction slots used

-#endif

-

-const BYTE g_PS_ResolveDepth[] = {

-    68,  88,  66,  67,  91,  30,  96,  236, 23,  31,  71,  224, 94,  101, 86,  142, 90,  12,  152,

-    206, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   176, 0,

-    0,   0,   8,   1,   0,   0,   60,  1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  116,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    1,   4,   255, 255, 0,   1,   0,   0,   66,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   5,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   68,  101, 112, 116, 104, 0,   77,  105, 99,  114, 111, 115, 111,

-    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,

-    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,

-    49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,

-    0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  111, 115, 105,

-    116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,

-    71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,

-    83,  86,  95,  68,  101, 112, 116, 104, 0,   171, 171, 171, 83,  72,  68,  82,  240, 0,   0,

-    0,   65,  0,   0,   0,   60,  0,   0,   0,   106, 8,   0,   1,   88,  32,  0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   104, 0,   0,   2,   1,   0,   0,   0,

-    61,  16,  0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,

-    0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,

-    0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,

-    0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,

-    28,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   46,  0,   0,   9,   18,

-    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   4,   1,   192, 0,

-    0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,

-    0,   0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ResolveDepth /T ps_4_1 /Fh compiled/resolvedepth11_ps.h
+//    ResolveDepthStencil.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Depth                             texture   float        2dMS    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Depth                 0    N/A   oDepth    DEPTH  float    YES
+//
+ps_4_1
+dcl_globalFlags refactoringAllowed
+dcl_resource_texture2dms(0) (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output oDepth
+dcl_temps 1
+resinfo_uint r0.xy, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftou r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ldms r0.x, r0.xyzw, t0.xyzw, l(0)
+mov oDepth, r0.x
+ret 
+// Approximately 8 instruction slots used
+#endif
+
+const BYTE g_PS_ResolveDepth[] = {
+    68,  88,  66,  67,  91,  30,  96,  236, 23,  31,  71,  224, 94,  101, 86,  142, 90,  12,  152,
+    206, 1,   0,   0,   0,   176, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   176, 0,
+    0,   0,   8,   1,   0,   0,   60,  1,   0,   0,   52,  2,   0,   0,   82,  68,  69,  70,  116,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    1,   4,   255, 255, 0,   1,   0,   0,   66,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   5,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   68,  101, 112, 116, 104, 0,   77,  105, 99,  114, 111, 115, 111,
+    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,
+    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,
+    49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,
+    0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  111, 115, 105,
+    116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 79,  83,
+    71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   255, 255, 255, 255, 1,   14,  0,   0,
+    83,  86,  95,  68,  101, 112, 116, 104, 0,   171, 171, 171, 83,  72,  68,  82,  240, 0,   0,
+    0,   65,  0,   0,   0,   60,  0,   0,   0,   106, 8,   0,   1,   88,  32,  0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   2,   1,   192, 0,   0,   104, 0,   0,   2,   1,   0,   0,   0,
+    61,  16,  0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,
+    0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,
+    0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,
+    0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,
+    28,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   46,  0,   0,   9,   18,
+    0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   4,   1,   192, 0,
+    0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,
+    0,   0,   8,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_ps.h
index 51b65bb..b5ae56f 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_ps.h
@@ -1,96 +1,96 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ResolveDepthStencil /T ps_4_1 /Fh

-//    compiled/resolvedepthstencil11_ps.h ResolveDepthStencil.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Depth                             texture   float        2dMS    0        1

-// Stencil                           texture   uint2        2dMS    1        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Target                0   xy          0   TARGET  float   xy  

-//

-ps_4_1

-dcl_globalFlags refactoringAllowed

-dcl_resource_texture2dms(0) (float,float,float,float) t0

-dcl_resource_texture2dms(0) (uint,uint,uint,uint) t1

-dcl_input_ps linear v1.xy

-dcl_output o0.xy

-dcl_temps 1

-resinfo_uint r0.xy, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftou r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ldms r0.z, r0.xyzw, t1.xzyw, l(0)

-ldms r0.x, r0.xyww, t0.xyzw, l(0)

-mov o0.x, r0.x

-utof o0.y, r0.z

-ret 

-// Approximately 10 instruction slots used

-#endif

-

-const BYTE g_PS_ResolveDepthStencil[] = {

-    68,  88,  66,  67,  47,  137, 160, 229, 91,  11,  163, 77,  193, 134, 67,  56,  141, 222, 2,

-    194, 1,   0,   0,   0,   40,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   216, 0,

-    0,   0,   48,  1,   0,   0,   100, 1,   0,   0,   172, 2,   0,   0,   82,  68,  69,  70,  156,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    1,   4,   255, 255, 0,   1,   0,   0,   106, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,

-    0,   5,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   98,  0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   6,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   5,   0,   0,   0,

-    68,  101, 112, 116, 104, 0,   83,  116, 101, 110, 99,  105, 108, 0,   77,  105, 99,  114, 111,

-    115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101,

-    114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,

-    46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,

-    8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  111,

-    115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171,

-    79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   3,   12,

-    0,   0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,  82,  64,

-    1,   0,   0,   65,  0,   0,   0,   80,  0,   0,   0,   106, 8,   0,   1,   88,  32,  0,   4,

-    0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   88,  32,  0,   4,   0,   112, 16,

-    0,   1,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,

-    0,   0,   101, 0,   0,   3,   50,  32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,

-    0,   0,   0,   61,  16,  0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,

-    0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,   16,

-    0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,  0,

-    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,

-    0,   0,   0,   28,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   46,  0,

-    0,   9,   66,  0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   134,

-    125, 16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   46,  0,   0,   9,

-    18,  0,   16,  0,   0,   0,   0,   0,   70,  15,  16,  0,   0,   0,   0,   0,   70,  126, 16,

-    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,

-    16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   34,

-    32,  16,  0,   0,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ResolveDepthStencil /T ps_4_1 /Fh
+//    compiled/resolvedepthstencil11_ps.h ResolveDepthStencil.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Depth                             texture   float        2dMS    0        1
+// Stencil                           texture   uint2        2dMS    1        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Target                0   xy          0   TARGET  float   xy  
+//
+ps_4_1
+dcl_globalFlags refactoringAllowed
+dcl_resource_texture2dms(0) (float,float,float,float) t0
+dcl_resource_texture2dms(0) (uint,uint,uint,uint) t1
+dcl_input_ps linear v1.xy
+dcl_output o0.xy
+dcl_temps 1
+resinfo_uint r0.xy, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftou r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ldms r0.z, r0.xyzw, t1.xzyw, l(0)
+ldms r0.x, r0.xyww, t0.xyzw, l(0)
+mov o0.x, r0.x
+utof o0.y, r0.z
+ret 
+// Approximately 10 instruction slots used
+#endif
+
+const BYTE g_PS_ResolveDepthStencil[] = {
+    68,  88,  66,  67,  47,  137, 160, 229, 91,  11,  163, 77,  193, 134, 67,  56,  141, 222, 2,
+    194, 1,   0,   0,   0,   40,  3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   216, 0,
+    0,   0,   48,  1,   0,   0,   100, 1,   0,   0,   172, 2,   0,   0,   82,  68,  69,  70,  156,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    1,   4,   255, 255, 0,   1,   0,   0,   106, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,
+    0,   5,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   98,  0,   0,   0,   2,   0,   0,   0,   4,   0,   0,   0,   6,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   5,   0,   0,   0,
+    68,  101, 112, 116, 104, 0,   83,  116, 101, 110, 99,  105, 108, 0,   77,  105, 99,  114, 111,
+    115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101,
+    114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,
+    46,  51,  49,  49,  49,  0,   171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,
+    8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,  80,  111,
+    115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171,
+    79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   3,   12,
+    0,   0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,  82,  64,
+    1,   0,   0,   65,  0,   0,   0,   80,  0,   0,   0,   106, 8,   0,   1,   88,  32,  0,   4,
+    0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   88,  32,  0,   4,   0,   112, 16,
+    0,   1,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,
+    0,   0,   101, 0,   0,   3,   50,  32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,
+    0,   0,   0,   61,  16,  0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,
+    0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,   16,
+    0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,  0,
+    16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,
+    0,   0,   0,   28,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   46,  0,
+    0,   9,   66,  0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   134,
+    125, 16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   46,  0,   0,   9,
+    18,  0,   16,  0,   0,   0,   0,   0,   70,  15,  16,  0,   0,   0,   0,   0,   70,  126, 16,
+    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   5,   18,  32,
+    16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   34,
+    32,  16,  0,   0,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   10,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_vs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_vs.h
index 85adfff..b141a3c 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_vs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_vs.h
@@ -1,88 +1,88 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E VS_ResolveDepthStencil /T vs_4_1 /Fh

-//    compiled/resolvedepthstencil11_vs.h ResolveDepthStencil.hlsl

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_VertexID              0   x           0   VERTID   uint   x   

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float   xyzw

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-vs_4_1

-dcl_globalFlags refactoringAllowed

-dcl_immediateConstantBuffer { { -1.000000, 1.000000, 0, 0},

-                              { 1.000000, -1.000000, 0, 0},

-                              { -1.000000, -1.000000, 0, 0},

-                              { -1.000000, 1.000000, 0, 0},

-                              { 1.000000, 1.000000, 0, 0},

-                              { 1.000000, -1.000000, 0, 0} }

-dcl_input_sgv v0.x, vertex_id

-dcl_output_siv o0.xyzw, position

-dcl_output o1.xy

-dcl_temps 1

-mov o0.zw, l(0,0,0,1.000000)

-mov r0.x, v0.x

-mov o0.xy, icb[r0.x + 0].xyxx

-add r0.y, l(1.000000), icb[r0.x + 0].x

-add r0.x, l(1.000000), -icb[r0.x + 0].y

-mul o1.xy, r0.yxyy, l(0.500000, 0.500000, 0.000000, 0.000000)

-ret 

-// Approximately 7 instruction slots used

-#endif

-

-const BYTE g_VS_ResolveDepthStencil[] = {

-    68,  88,  66,  67,  40,  8,   1,   50,  138, 208, 33,  92,  46,  194, 48,  131, 250, 159, 71,

-    56,  1,   0,   0,   0,   0,   3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 0,

-    0,   0,   192, 0,   0,   0,   24,  1,   0,   0,   132, 2,   0,   0,   82,  68,  69,  70,  80,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,

-    1,   4,   254, 255, 0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111,

-    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,

-    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,

-    49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,

-    8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,  86,  101, 114, 116, 101, 120, 73,

-    68,  0,   79,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,

-    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,

-    0,   1,   0,   0,   0,   3,   12,  0,   0,   83,  86,  95,  80,  111, 115, 105, 116, 105, 111,

-    110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 83,  72,  68,  82,  100,

-    1,   0,   0,   65,  0,   1,   0,   89,  0,   0,   0,   106, 8,   0,   1,   53,  24,  0,   0,

-    26,  0,   0,   0,   0,   0,   128, 191, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   128, 63,  0,   0,   128, 191, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    128, 191, 0,   0,   128, 191, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 191, 0,

-    0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   128, 63,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   128, 191, 0,   0,   0,

-    0,   0,   0,   0,   0,   96,  0,   0,   4,   18,  16,  16,  0,   0,   0,   0,   0,   6,   0,

-    0,   0,   103, 0,   0,   4,   242, 32,  16,  0,   0,   0,   0,   0,   1,   0,   0,   0,   101,

-    0,   0,   3,   50,  32,  16,  0,   1,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,

-    54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  54,  0,   0,   5,   18,  0,

-    16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   50,

-    32,  16,  0,   0,   0,   0,   0,   70,  144, 144, 0,   10,  0,   16,  0,   0,   0,   0,   0,

-    0,   0,   0,   8,   34,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128,

-    63,  10,  144, 144, 0,   10,  0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   9,   18,  0,

-    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  26,  144, 144, 128, 65,

-    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  50,  32,  16,  0,

-    1,   0,   0,   0,   22,  5,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,

-    63,  0,   0,   0,   63,  0,   0,   0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,

-    65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,   6,   0,   0,   0,   3,

-    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E VS_ResolveDepthStencil /T vs_4_1 /Fh
+//    compiled/resolvedepthstencil11_vs.h ResolveDepthStencil.hlsl
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_VertexID              0   x           0   VERTID   uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float   xyzw
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+vs_4_1
+dcl_globalFlags refactoringAllowed
+dcl_immediateConstantBuffer { { -1.000000, 1.000000, 0, 0},
+                              { 1.000000, -1.000000, 0, 0},
+                              { -1.000000, -1.000000, 0, 0},
+                              { -1.000000, 1.000000, 0, 0},
+                              { 1.000000, 1.000000, 0, 0},
+                              { 1.000000, -1.000000, 0, 0} }
+dcl_input_sgv v0.x, vertex_id
+dcl_output_siv o0.xyzw, position
+dcl_output o1.xy
+dcl_temps 1
+mov o0.zw, l(0,0,0,1.000000)
+mov r0.x, v0.x
+mov o0.xy, icb[r0.x + 0].xyxx
+add r0.y, l(1.000000), icb[r0.x + 0].x
+add r0.x, l(1.000000), -icb[r0.x + 0].y
+mul o1.xy, r0.yxyy, l(0.500000, 0.500000, 0.000000, 0.000000)
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_VS_ResolveDepthStencil[] = {
+    68,  88,  66,  67,  40,  8,   1,   50,  138, 208, 33,  92,  46,  194, 48,  131, 250, 159, 71,
+    56,  1,   0,   0,   0,   0,   3,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   140, 0,
+    0,   0,   192, 0,   0,   0,   24,  1,   0,   0,   132, 2,   0,   0,   82,  68,  69,  70,  80,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   28,  0,   0,   0,
+    1,   4,   254, 255, 0,   1,   0,   0,   28,  0,   0,   0,   77,  105, 99,  114, 111, 115, 111,
+    102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,
+    67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,
+    49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,
+    8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   1,   1,   0,   0,   83,  86,  95,  86,  101, 114, 116, 101, 120, 73,
+    68,  0,   79,  83,  71,  78,  80,  0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,
+    0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,
+    0,   1,   0,   0,   0,   3,   12,  0,   0,   83,  86,  95,  80,  111, 115, 105, 116, 105, 111,
+    110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 171, 171, 83,  72,  68,  82,  100,
+    1,   0,   0,   65,  0,   1,   0,   89,  0,   0,   0,   106, 8,   0,   1,   53,  24,  0,   0,
+    26,  0,   0,   0,   0,   0,   128, 191, 0,   0,   128, 63,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   128, 63,  0,   0,   128, 191, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    128, 191, 0,   0,   128, 191, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 191, 0,
+    0,   128, 63,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   128, 63,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  0,   0,   128, 191, 0,   0,   0,
+    0,   0,   0,   0,   0,   96,  0,   0,   4,   18,  16,  16,  0,   0,   0,   0,   0,   6,   0,
+    0,   0,   103, 0,   0,   4,   242, 32,  16,  0,   0,   0,   0,   0,   1,   0,   0,   0,   101,
+    0,   0,   3,   50,  32,  16,  0,   1,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,
+    54,  0,   0,   8,   194, 32,  16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   128, 63,  54,  0,   0,   5,   18,  0,
+    16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   50,
+    32,  16,  0,   0,   0,   0,   0,   70,  144, 144, 0,   10,  0,   16,  0,   0,   0,   0,   0,
+    0,   0,   0,   8,   34,  0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128,
+    63,  10,  144, 144, 0,   10,  0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   9,   18,  0,
+    16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  26,  144, 144, 128, 65,
+    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   10,  50,  32,  16,  0,
+    1,   0,   0,   0,   22,  5,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,   0,   0,
+    63,  0,   0,   0,   63,  0,   0,   0,   0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,
+    65,  84,  116, 0,   0,   0,   7,   0,   0,   0,   1,   0,   0,   0,   6,   0,   0,   0,   3,
+    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvestencil11_ps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvestencil11_ps.h
index 1698c76..55bddf2 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvestencil11_ps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvestencil11_ps.h
@@ -1,88 +1,88 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_ResolveStencil /T ps_4_1 /Fh

-//    compiled/resolvestencil11_ps.h ResolveDepthStencil.hlsl

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Stencil                           texture   uint2        2dMS    1        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Position              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_Target                0   xy          0   TARGET  float   xy  

-//

-ps_4_1

-dcl_globalFlags refactoringAllowed

-dcl_resource_texture2dms(0) (uint,uint,uint,uint) t1

-dcl_input_ps linear v1.xy

-dcl_output o0.xy

-dcl_temps 1

-resinfo_uint r0.xy, l(0), t1.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftou r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ldms r0.x, r0.xyzw, t1.yxzw, l(0)

-utof o0.y, r0.x

-mov o0.x, l(0)

-ret 

-// Approximately 9 instruction slots used

-#endif

-

-const BYTE g_PS_ResolveStencil[] = {

-    68,  88,  66,  67,  23,  194, 195, 209, 212, 28,  208, 37,  42,  21,  191, 206, 191, 0,   52,

-    120, 1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,

-    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69,  70,  120,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,

-    1,   4,   255, 255, 0,   1,   0,   0,   68,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,

-    0,   0,   5,   0,   0,   0,   83,  116, 101, 110, 99,  105, 108, 0,   77,  105, 99,  114, 111,

-    115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101,

-    114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,

-    46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,

-    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,

-    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,

-    80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,

-    3,   12,  0,   0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,

-    82,  12,  1,   0,   0,   65,  0,   0,   0,   67,  0,   0,   0,   106, 8,   0,   1,   88,  32,

-    0,   4,   0,   112, 16,  0,   1,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,

-    16,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   50,  32,  16,  0,   0,   0,   0,   0,

-    104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   50,  0,   16,  0,   0,   0,   0,

-    0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   1,   0,   0,   0,   86,  0,

-    0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,

-    0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,

-    70,  16,  16,  0,   1,   0,   0,   0,   28,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,

-    0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,

-    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   46,  0,   0,   9,   18,  0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,

-    0,   0,   0,   0,   22,  126, 16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,

-    0,   86,  0,   0,   5,   34,  32,  16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,

-    0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,

-    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,

-    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_ResolveStencil /T ps_4_1 /Fh
+//    compiled/resolvestencil11_ps.h ResolveDepthStencil.hlsl
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Stencil                           texture   uint2        2dMS    1        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Position              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_Target                0   xy          0   TARGET  float   xy  
+//
+ps_4_1
+dcl_globalFlags refactoringAllowed
+dcl_resource_texture2dms(0) (uint,uint,uint,uint) t1
+dcl_input_ps linear v1.xy
+dcl_output o0.xy
+dcl_temps 1
+resinfo_uint r0.xy, l(0), t1.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftou r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ldms r0.x, r0.xyzw, t1.yxzw, l(0)
+utof o0.y, r0.x
+mov o0.x, l(0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_ResolveStencil[] = {
+    68,  88,  66,  67,  23,  194, 195, 209, 212, 28,  208, 37,  42,  21,  191, 206, 191, 0,   52,
+    120, 1,   0,   0,   0,   208, 2,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   180, 0,
+    0,   0,   12,  1,   0,   0,   64,  1,   0,   0,   84,  2,   0,   0,   82,  68,  69,  70,  120,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   28,  0,   0,   0,
+    1,   4,   255, 255, 0,   1,   0,   0,   68,  0,   0,   0,   60,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,
+    0,   0,   5,   0,   0,   0,   83,  116, 101, 110, 99,  105, 108, 0,   77,  105, 99,  114, 111,
+    115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104, 97,  100, 101,
+    114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,  57,  53,  50,
+    46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,  0,   0,   0,   2,   0,
+    0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   3,
+    0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,   83,  86,  95,
+    80,  111, 115, 105, 116, 105, 111, 110, 0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,
+    3,   12,  0,   0,   83,  86,  95,  84,  97,  114, 103, 101, 116, 0,   171, 171, 83,  72,  68,
+    82,  12,  1,   0,   0,   65,  0,   0,   0,   67,  0,   0,   0,   106, 8,   0,   1,   88,  32,
+    0,   4,   0,   112, 16,  0,   1,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,
+    16,  16,  0,   1,   0,   0,   0,   101, 0,   0,   3,   50,  32,  16,  0,   0,   0,   0,   0,
+    104, 0,   0,   2,   1,   0,   0,   0,   61,  16,  0,   7,   50,  0,   16,  0,   0,   0,   0,
+    0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   1,   0,   0,   0,   86,  0,
+    0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,
+    0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,
+    70,  16,  16,  0,   1,   0,   0,   0,   28,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,
+    0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,
+    0,   0,   2,   64,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   46,  0,   0,   9,   18,  0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,
+    0,   0,   0,   0,   22,  126, 16,  0,   1,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,
+    0,   86,  0,   0,   5,   34,  32,  16,  0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,
+    0,   0,   54,  0,   0,   5,   18,  32,  16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,
+    0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   9,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,
+    0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h
index dd88a2c..81b94fd 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h
@@ -1,140 +1,140 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_SwizzleF2DArray /T ps_4_0 /Fh

-//    compiled\swizzlef2darrayps.h Swizzle11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer SwizzleProperties

-// {

-//

-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF2DArray                   texture  float4     2darray    0        1

-// SwizzleProperties                 cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_sampler s0, mode_default

-dcl_resource_texture2darray (float,float,float,float) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-dcl_indexableTemp x0[6], 4

-utof r0.z, v1.x

-mov r0.xy, v2.xyxx

-sample r0.xyzw, r0.xyzx, t0.xyzw, s0

-mov x0[0].x, r0.x

-mov x0[1].x, r0.y

-mov x0[2].x, r0.z

-mov x0[3].x, r0.w

-mov x0[4].x, l(0)

-mov x0[5].x, l(1.000000)

-mov r0.x, cb0[0].x

-mov o0.x, x0[r0.x + 0].x

-mov r0.x, cb0[0].y

-mov o0.y, x0[r0.x + 0].x

-mov r0.x, cb0[0].z

-mov o0.z, x0[r0.x + 0].x

-mov r0.x, cb0[0].w

-mov o0.w, x0[r0.x + 0].x

-ret 

-// Approximately 18 instruction slots used

-#endif

-

-const BYTE g_PS_SwizzleF2DArray[] = {

-    68,  88,  66,  67,  10,  112, 114, 208, 204, 221, 6,   130, 191, 123, 80,  111, 226, 70,  79,

-    225, 1,   0,   0,   0,   204, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   104, 1,

-    0,   0,   240, 1,   0,   0,   36,  2,   0,   0,   80,  4,   0,   0,   82,  68,  69,  70,  44,

-    1,   0,   0,   1,   0,   0,   0,   168, 0,   0,   0,   3,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   248, 0,   0,   0,   124, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   132, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    148, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   83,  97,  109, 112, 108, 101,

-    114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  50,  68,  65,  114, 114, 97,  121, 0,   83,

-    119, 105, 122, 122, 108, 101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171,

-    148, 0,   0,   0,   1,   0,   0,   0,   192, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   216, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,

-    0,   0,   232, 0,   0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110,

-    100, 105, 99,  101, 115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,

-    76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114,

-    32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,

-    83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,

-    0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,

-    0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,

-    0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,

-    0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,

-    73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,

-    65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,

-    0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,

-    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,

-    82,  36,  2,   0,   0,   64,  0,   0,   0,   137, 0,   0,   0,   89,  0,   0,   4,   70,  142,

-    32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,

-    0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,

-    100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,

-    3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,

-    0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,   0,   0,   0,   0,   6,

-    0,   0,   0,   4,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,

-    10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,

-    0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,

-    0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,

-    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,

-    0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,

-    0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,

-    58,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,

-    0,   4,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,

-    32,  0,   0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  54,

-    0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,

-    4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,

-    16,  0,   0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,

-    0,   0,   7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,

-    10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,

-    0,   42,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,

-    16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,

-    0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,

-    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,

-    0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,

-    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   18,  0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   1,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_SwizzleF2DArray /T ps_4_0 /Fh
+//    compiled\swizzlef2darrayps.h Swizzle11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF2DArray                   texture  float4     2darray    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1.000000)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 18 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleF2DArray[] = {
+    68,  88,  66,  67,  10,  112, 114, 208, 204, 221, 6,   130, 191, 123, 80,  111, 226, 70,  79,
+    225, 1,   0,   0,   0,   204, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   104, 1,
+    0,   0,   240, 1,   0,   0,   36,  2,   0,   0,   80,  4,   0,   0,   82,  68,  69,  70,  44,
+    1,   0,   0,   1,   0,   0,   0,   168, 0,   0,   0,   3,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   248, 0,   0,   0,   124, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   132, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   5,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    148, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   83,  97,  109, 112, 108, 101,
+    114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  50,  68,  65,  114, 114, 97,  121, 0,   83,
+    119, 105, 122, 122, 108, 101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171,
+    148, 0,   0,   0,   1,   0,   0,   0,   192, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   216, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,
+    0,   0,   232, 0,   0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110,
+    100, 105, 99,  101, 115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,
+    76,  83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114,
+    32,  57,  46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,
+    83,  71,  78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,
+    0,   0,   0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,
+    0,   92,  0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,
+    0,   0,   1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,
+    0,   0,   0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,
+    73,  79,  78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,
+    65,  82,  82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,
+    0,   171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,
+    15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,
+    82,  36,  2,   0,   0,   64,  0,   0,   0,   137, 0,   0,   0,   89,  0,   0,   4,   70,  142,
+    32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,
+    0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,
+    100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,   0,   0,   98,  16,  0,
+    3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,
+    0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,   0,   0,   0,   0,   6,
+    0,   0,   0,   4,   0,   0,   0,   86,  0,   0,   5,   66,  0,   16,  0,   0,   0,   0,   0,
+    10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,
+    0,   70,  16,  16,  0,   2,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,
+    0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,
+    96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,
+    0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,
+    0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,
+    58,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,
+    0,   4,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,
+    32,  0,   0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  54,
+    0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,
+    4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,
+    16,  0,   0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,
+    0,   0,   7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,
+    10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,
+    0,   42,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,
+    16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,
+    0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,
+    0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,
+    0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   18,  0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   1,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h
index 9e923bf..27a87c2 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h
@@ -1,130 +1,130 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_SwizzleF2D /T ps_4_0 /Fh compiled\swizzlef2dps.h

-//    Swizzle11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer SwizzleProperties

-// {

-//

-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF2D                        texture  float4          2d    0        1

-// SwizzleProperties                 cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_sampler s0, mode_default

-dcl_resource_texture2d (float,float,float,float) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-dcl_indexableTemp x0[6], 4

-sample r0.xyzw, v1.xyxx, t0.xyzw, s0

-mov x0[0].x, r0.x

-mov x0[1].x, r0.y

-mov x0[2].x, r0.z

-mov x0[3].x, r0.w

-mov x0[4].x, l(0)

-mov x0[5].x, l(1.000000)

-mov r0.x, cb0[0].x

-mov o0.x, x0[r0.x + 0].x

-mov r0.x, cb0[0].y

-mov o0.y, x0[r0.x + 0].x

-mov r0.x, cb0[0].z

-mov o0.z, x0[r0.x + 0].x

-mov r0.x, cb0[0].w

-mov o0.w, x0[r0.x + 0].x

-ret 

-// Approximately 16 instruction slots used

-#endif

-

-const BYTE g_PS_SwizzleF2D[] = {

-    68,  88,  66,  67,  231, 84,  171, 36,  174, 101, 233, 167, 224, 61,  160, 30,  113, 106, 106,

-    125, 1,   0,   0,   0,   96,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   100, 1,

-    0,   0,   188, 1,   0,   0,   240, 1,   0,   0,   228, 3,   0,   0,   82,  68,  69,  70,  40,

-    1,   0,   0,   1,   0,   0,   0,   164, 0,   0,   0,   3,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   244, 0,   0,   0,   124, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   132, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    143, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   83,  97,  109, 112, 108, 101,

-    114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  50,  68,  0,   83,  119, 105, 122, 122, 108,

-    101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 171, 143, 0,   0,   0,

-    1,   0,   0,   0,   188, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   212, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   228, 0,

-    0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101,

-    115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,

-    83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,

-    57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,

-    0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,

-    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,

-    79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,

-    8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,

-    171, 171, 83,  72,  68,  82,  236, 1,   0,   0,   64,  0,   0,   0,   123, 0,   0,   0,   89,

-    0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   90,  0,   0,   3,

-    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,

-    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105,

-    0,   0,   4,   0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   69,  0,   0,   9,

-    242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,   70,  126, 16,

-    0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,

-    0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,

-    0,   42,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,

-    0,   0,   3,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,

-    48,  32,  0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,

-    54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,

-    0,   0,   0,   128, 63,  54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,

-    0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,

-    54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   54,  0,   0,   7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,

-    32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,

-    0,   16,  0,   0,   0,   0,   0,   42,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   7,   66,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,

-    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,

-    0,   0,   58,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130,

-    32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,

-    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   16,  0,   0,

-    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,

-    0,   0,   0,   10,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_SwizzleF2D /T ps_4_0 /Fh compiled\swizzlef2dps.h
+//    Swizzle11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF2D                        texture  float4          2d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1.000000)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 16 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleF2D[] = {
+    68,  88,  66,  67,  231, 84,  171, 36,  174, 101, 233, 167, 224, 61,  160, 30,  113, 106, 106,
+    125, 1,   0,   0,   0,   96,  4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   100, 1,
+    0,   0,   188, 1,   0,   0,   240, 1,   0,   0,   228, 3,   0,   0,   82,  68,  69,  70,  40,
+    1,   0,   0,   1,   0,   0,   0,   164, 0,   0,   0,   3,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   244, 0,   0,   0,   124, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   132, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   4,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    143, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   83,  97,  109, 112, 108, 101,
+    114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  50,  68,  0,   83,  119, 105, 122, 122, 108,
+    101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 171, 143, 0,   0,   0,
+    1,   0,   0,   0,   188, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   212, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   228, 0,
+    0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101,
+    115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,
+    83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,
+    57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,
+    0,   0,   0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,
+    0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,
+    79,  82,  68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,
+    8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,
+    171, 171, 83,  72,  68,  82,  236, 1,   0,   0,   64,  0,   0,   0,   123, 0,   0,   0,   89,
+    0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   90,  0,   0,   3,
+    0,   96,  16,  0,   0,   0,   0,   0,   88,  24,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   85,  85,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,   0,   0,   0,   101, 0,
+    0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105,
+    0,   0,   4,   0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   69,  0,   0,   9,
+    242, 0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,   0,   70,  126, 16,
+    0,   0,   0,   0,   0,   0,   96,  16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,
+    0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,
+    0,   42,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,
+    0,   0,   3,   0,   0,   0,   58,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,
+    48,  32,  0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,
+    54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,
+    0,   0,   0,   128, 63,  54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,
+    0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,
+    54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   54,  0,   0,   7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,
+    32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,
+    0,   16,  0,   0,   0,   0,   0,   42,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   7,   66,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,
+    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,
+    0,   0,   58,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130,
+    32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,
+    0,   0,   0,   0,   62,  0,   0,   1,   83,  84,  65,  84,  116, 0,   0,   0,   16,  0,   0,
+    0,   1,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,
+    0,   0,   0,   10,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h
index 191e83e..4b05cda 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h
@@ -1,134 +1,134 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_SwizzleF3D /T ps_4_0 /Fh compiled\swizzlef3dps.h

-//    Swizzle11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer SwizzleProperties

-// {

-//

-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// Sampler                           sampler      NA          NA    0        1

-// TextureF3D                        texture  float4          3d    0        1

-// SwizzleProperties                 cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET  float   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_sampler s0, mode_default

-dcl_resource_texture3d (float,float,float,float) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-dcl_indexableTemp x0[6], 4

-sample r0.xyzw, v2.xyzx, t0.xyzw, s0

-mov x0[0].x, r0.x

-mov x0[1].x, r0.y

-mov x0[2].x, r0.z

-mov x0[3].x, r0.w

-mov x0[4].x, l(0)

-mov x0[5].x, l(1.000000)

-mov r0.x, cb0[0].x

-mov o0.x, x0[r0.x + 0].x

-mov r0.x, cb0[0].y

-mov o0.y, x0[r0.x + 0].x

-mov r0.x, cb0[0].z

-mov o0.z, x0[r0.x + 0].x

-mov r0.x, cb0[0].w

-mov o0.w, x0[r0.x + 0].x

-ret 

-// Approximately 16 instruction slots used

-#endif

-

-const BYTE g_PS_SwizzleF3D[] = {

-    68,  88,  66,  67,  239, 190, 93,  16,  108, 116, 194, 88,  111, 43,  244, 26,  83,  204, 59,

-    123, 1,   0,   0,   0,   144, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   100, 1,

-    0,   0,   236, 1,   0,   0,   32,  2,   0,   0,   20,  4,   0,   0,   82,  68,  69,  70,  40,

-    1,   0,   0,   1,   0,   0,   0,   164, 0,   0,   0,   3,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   244, 0,   0,   0,   124, 0,   0,   0,   3,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   1,   0,   0,   0,   132, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,

-    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,

-    143, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   83,  97,  109, 112, 108, 101,

-    114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  51,  68,  0,   83,  119, 105, 122, 122, 108,

-    101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 171, 143, 0,   0,   0,

-    1,   0,   0,   0,   188, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   212, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   228, 0,

-    0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101,

-    115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,

-    83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,

-    57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  128,

-    0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,

-    1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,

-    0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,

-    0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,

-    0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,

-    83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,

-    89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,

-    71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,

-    83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  236, 1,   0,

-    0,   64,  0,   0,   0,   123, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,

-    0,   0,   1,   0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,

-    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,

-    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,

-    0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,   0,   0,   0,   0,   6,   0,

-    0,   0,   4,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,

-    18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,

-    0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,

-    0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,

-    48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,

-    54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,   0,

-    0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,

-    0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  54,  0,   0,   6,

-    18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,

-    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,

-    0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,

-    34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,  128,

-    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,   0,

-    0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,

-    54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,  48,

-    32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,

-    84,  65,  84,  116, 0,   0,   0,   16,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,

-    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_SwizzleF3D /T ps_4_0 /Fh compiled\swizzlef3dps.h
+//    Swizzle11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF3D                        texture  float4          3d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET  float   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1.000000)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 16 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleF3D[] = {
+    68,  88,  66,  67,  239, 190, 93,  16,  108, 116, 194, 88,  111, 43,  244, 26,  83,  204, 59,
+    123, 1,   0,   0,   0,   144, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   100, 1,
+    0,   0,   236, 1,   0,   0,   32,  2,   0,   0,   20,  4,   0,   0,   82,  68,  69,  70,  40,
+    1,   0,   0,   1,   0,   0,   0,   164, 0,   0,   0,   3,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   244, 0,   0,   0,   124, 0,   0,   0,   3,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   1,   0,   0,   0,   132, 0,   0,   0,   2,   0,   0,   0,   5,   0,   0,   0,   8,
+    0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,   0,   0,   13,  0,   0,   0,
+    143, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   83,  97,  109, 112, 108, 101,
+    114, 0,   84,  101, 120, 116, 117, 114, 101, 70,  51,  68,  0,   83,  119, 105, 122, 122, 108,
+    101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 171, 143, 0,   0,   0,
+    1,   0,   0,   0,   188, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   212, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   228, 0,
+    0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101,
+    115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,
+    83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,
+    57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  128,
+    0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,
+    1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,
+    0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,
+    0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,
+    0,   0,   0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,
+    83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,
+    89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,
+    71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,
+    83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  236, 1,   0,
+    0,   64,  0,   0,   0,   123, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,
+    0,   0,   1,   0,   0,   0,   90,  0,   0,   3,   0,   96,  16,  0,   0,   0,   0,   0,   88,
+    40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   85,  85,  0,   0,   98,  16,  0,   3,
+    114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,
+    0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,   0,   0,   0,   0,   6,   0,
+    0,   0,   4,   0,   0,   0,   69,  0,   0,   9,   242, 0,   16,  0,   0,   0,   0,   0,   70,
+    18,  16,  0,   2,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   0,   96,  16,  0,
+    0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,
+    0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,
+    48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,
+    54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,   0,
+    0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,
+    0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   0,   0,   128, 63,  54,  0,   0,   6,
+    18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,
+    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,
+    0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,
+    34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,  128,
+    32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,   0,
+    0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,
+    54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,  48,
+    32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,
+    84,  65,  84,  116, 0,   0,   0,   16,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,
+    2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h
index 1b36b95..b3188ad 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h
@@ -1,144 +1,144 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_SwizzleI2DArray /T ps_4_0 /Fh

-//    compiled\swizzlei2darrayps.h Swizzle11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer SwizzleProperties

-// {

-//

-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI2DArray                   texture   sint4     2darray    0        1

-// SwizzleProperties                 cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_resource_texture2darray (sint,sint,sint,sint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-dcl_indexableTemp x0[6], 4

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov x0[0].x, r0.x

-mov x0[1].x, r0.y

-mov x0[2].x, r0.z

-mov x0[3].x, r0.w

-mov x0[4].x, l(0)

-mov x0[5].x, l(1)

-mov r0.x, cb0[0].x

-mov o0.x, x0[r0.x + 0].x

-mov r0.x, cb0[0].y

-mov o0.y, x0[r0.x + 0].x

-mov r0.x, cb0[0].z

-mov o0.z, x0[r0.x + 0].x

-mov r0.x, cb0[0].w

-mov o0.w, x0[r0.x + 0].x

-ret 

-// Approximately 22 instruction slots used

-#endif

-

-const BYTE g_PS_SwizzleI2DArray[] = {

-    68,  88,  66,  67,  133, 234, 212, 67,  255, 165, 181, 252, 19,  185, 168, 29,  237, 193, 125,

-    57,  1,   0,   0,   0,   240, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   64,  1,

-    0,   0,   200, 1,   0,   0,   252, 1,   0,   0,   116, 4,   0,   0,   82,  68,  69,  70,  4,

-    1,   0,   0,   1,   0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   208, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   108, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    84,  101, 120, 116, 117, 114, 101, 73,  50,  68,  65,  114, 114, 97,  121, 0,   83,  119, 105,

-    122, 122, 108, 101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 108, 0,

-    0,   0,   1,   0,   0,   0,   152, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   176, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,

-    192, 0,   0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105,

-    99,  101, 115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,

-    76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,

-    46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,

-    78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,

-    0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,

-    0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,

-    78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,

-    82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  112,

-    2,   0,   0,   64,  0,   0,   0,   156, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,

-    0,   0,   0,   0,   1,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   51,  51,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,

-    0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242,

-    32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,

-    0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,

-    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,

-    0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,

-    0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,

-    0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,

-    16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,

-    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,

-    0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,

-    18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,

-    0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,

-    0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,

-    6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,

-    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,

-    0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,

-    7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,

-    128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,

-    0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,

-    48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   22,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_SwizzleI2DArray /T ps_4_0 /Fh
+//    compiled\swizzlei2darrayps.h Swizzle11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI2DArray                   texture   sint4     2darray    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture2darray (sint,sint,sint,sint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 22 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleI2DArray[] = {
+    68,  88,  66,  67,  133, 234, 212, 67,  255, 165, 181, 252, 19,  185, 168, 29,  237, 193, 125,
+    57,  1,   0,   0,   0,   240, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   64,  1,
+    0,   0,   200, 1,   0,   0,   252, 1,   0,   0,   116, 4,   0,   0,   82,  68,  69,  70,  4,
+    1,   0,   0,   1,   0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   208, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   108, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    84,  101, 120, 116, 117, 114, 101, 73,  50,  68,  65,  114, 114, 97,  121, 0,   83,  119, 105,
+    122, 122, 108, 101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 108, 0,
+    0,   0,   1,   0,   0,   0,   152, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   176, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,
+    192, 0,   0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105,
+    99,  101, 115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,
+    76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,
+    46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,
+    78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,
+    0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,
+    0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,
+    78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,
+    82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  112,
+    2,   0,   0,   64,  0,   0,   0,   156, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,
+    0,   0,   0,   0,   1,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   51,  51,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,
+    0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242,
+    32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,
+    0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,
+    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,
+    0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,
+    0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,
+    0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,
+    16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,
+    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,
+    0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,
+    18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,
+    0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,
+    0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,
+    6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,
+    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,
+    0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,
+    7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,
+    128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,
+    0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,
+    48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   22,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h
index a13235b..a0470b5 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h
@@ -1,137 +1,137 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_SwizzleI2D /T ps_4_0 /Fh compiled\swizzlei2dps.h

-//    Swizzle11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer SwizzleProperties

-// {

-//

-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI2D                        texture   sint4          2d    0        1

-// SwizzleProperties                 cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_resource_texture2d (sint,sint,sint,sint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-dcl_indexableTemp x0[6], 4

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov x0[0].x, r0.x

-mov x0[1].x, r0.y

-mov x0[2].x, r0.z

-mov x0[3].x, r0.w

-mov x0[4].x, l(0)

-mov x0[5].x, l(1)

-mov r0.x, cb0[0].x

-mov o0.x, x0[r0.x + 0].x

-mov r0.x, cb0[0].y

-mov o0.y, x0[r0.x + 0].x

-mov r0.x, cb0[0].z

-mov o0.z, x0[r0.x + 0].x

-mov r0.x, cb0[0].w

-mov o0.w, x0[r0.x + 0].x

-ret 

-// Approximately 21 instruction slots used

-#endif

-

-const BYTE g_PS_SwizzleI2D[] = {

-    68,  88,  66,  67,  173, 226, 173, 23,  21,  249, 148, 56,  12,  194, 17,  225, 118, 52,  31,

-    119, 1,   0,   0,   0,   164, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   60,  1,

-    0,   0,   148, 1,   0,   0,   200, 1,   0,   0,   40,  4,   0,   0,   82,  68,  69,  70,  0,

-    1,   0,   0,   1,   0,   0,   0,   124, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   204, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   103, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    84,  101, 120, 116, 117, 114, 101, 73,  50,  68,  0,   83,  119, 105, 122, 122, 108, 101, 80,

-    114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 171, 103, 0,   0,   0,   1,   0,

-    0,   0,   148, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   172,

-    0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   188, 0,   0,   0,

-    0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101, 115, 0,

-    171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,  0,   0,

-    0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,

-    83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171,

-    83,  72,  68,  82,  88,  2,   0,   0,   64,  0,   0,   0,   150, 0,   0,   0,   89,  0,   0,

-    4,   70,  142, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   88,  24,  0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,

-    1,   0,   0,   0,   105, 0,   0,   4,   0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,

-    0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,

-    0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,

-    0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,

-    0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,  0,   0,   7,

-    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,

-    0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,

-    18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,

-    0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,

-    0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,

-    6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,

-    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,

-    0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,

-    7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,

-    128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,

-    0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,

-    48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   21,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_SwizzleI2D /T ps_4_0 /Fh compiled\swizzlei2dps.h
+//    Swizzle11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI2D                        texture   sint4          2d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 21 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleI2D[] = {
+    68,  88,  66,  67,  173, 226, 173, 23,  21,  249, 148, 56,  12,  194, 17,  225, 118, 52,  31,
+    119, 1,   0,   0,   0,   164, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   60,  1,
+    0,   0,   148, 1,   0,   0,   200, 1,   0,   0,   40,  4,   0,   0,   82,  68,  69,  70,  0,
+    1,   0,   0,   1,   0,   0,   0,   124, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   204, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   103, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    84,  101, 120, 116, 117, 114, 101, 73,  50,  68,  0,   83,  119, 105, 122, 122, 108, 101, 80,
+    114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 171, 103, 0,   0,   0,   1,   0,
+    0,   0,   148, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   172,
+    0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   188, 0,   0,   0,
+    0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101, 115, 0,
+    171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,  0,   0,
+    0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,
+    83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171,
+    83,  72,  68,  82,  88,  2,   0,   0,   64,  0,   0,   0,   150, 0,   0,   0,   89,  0,   0,
+    4,   70,  142, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   88,  24,  0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   51,  51,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,
+    1,   0,   0,   0,   105, 0,   0,   4,   0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,
+    0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,
+    0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,
+    0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,
+    0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,  0,   0,   7,
+    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,
+    0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,
+    18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,
+    0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,
+    0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,
+    6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,
+    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,
+    0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,
+    7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,
+    128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,
+    0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,
+    48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   21,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h
index 762bff2..d5b4644 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h
@@ -1,140 +1,140 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_SwizzleI3D /T ps_4_0 /Fh compiled\swizzlei3dps.h

-//    Swizzle11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer SwizzleProperties

-// {

-//

-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureI3D                        texture   sint4          3d    0        1

-// SwizzleProperties                 cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET    int   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_resource_texture3d (sint,sint,sint,sint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-dcl_indexableTemp x0[6], 4

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov x0[0].x, r0.x

-mov x0[1].x, r0.y

-mov x0[2].x, r0.z

-mov x0[3].x, r0.w

-mov x0[4].x, l(0)

-mov x0[5].x, l(1)

-mov r0.x, cb0[0].x

-mov o0.x, x0[r0.x + 0].x

-mov r0.x, cb0[0].y

-mov o0.y, x0[r0.x + 0].x

-mov r0.x, cb0[0].z

-mov o0.z, x0[r0.x + 0].x

-mov r0.x, cb0[0].w

-mov o0.w, x0[r0.x + 0].x

-ret 

-// Approximately 21 instruction slots used

-#endif

-

-const BYTE g_PS_SwizzleI3D[] = {

-    68,  88,  66,  67,  249, 178, 247, 141, 249, 115, 249, 29,  105, 250, 202, 151, 43,  0,   206,

-    251, 1,   0,   0,   0,   200, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   60,  1,

-    0,   0,   196, 1,   0,   0,   248, 1,   0,   0,   76,  4,   0,   0,   82,  68,  69,  70,  0,

-    1,   0,   0,   1,   0,   0,   0,   124, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   204, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,

-    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   103, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    84,  101, 120, 116, 117, 114, 101, 73,  51,  68,  0,   83,  119, 105, 122, 122, 108, 101, 80,

-    114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 171, 103, 0,   0,   0,   1,   0,

-    0,   0,   148, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   172,

-    0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   188, 0,   0,   0,

-    0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101, 115, 0,

-    171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  128, 0,   0,

-    0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,

-    0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,

-    0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,

-    95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,

-    78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,

-    44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,

-    95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  76,  2,   0,   0,   64,

-    0,   0,   0,   147, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,

-    1,   0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,   0,

-    0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,

-    0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   114, 0,   16,  0,

-    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 0,   16,

-    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,

-    0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,

-    32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   54,

-    0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,   0,   0,

-    0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,

-    0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,   6,   18,

-    0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,

-    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,

-    0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   34,

-    32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,  128, 32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,   0,   0,

-    0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,

-    0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,  48,  32,

-    4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,

-    65,  84,  116, 0,   0,   0,   21,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_SwizzleI3D /T ps_4_0 /Fh compiled\swizzlei3dps.h
+//    Swizzle11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI3D                        texture   sint4          3d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET    int   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 21 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleI3D[] = {
+    68,  88,  66,  67,  249, 178, 247, 141, 249, 115, 249, 29,  105, 250, 202, 151, 43,  0,   206,
+    251, 1,   0,   0,   0,   200, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   60,  1,
+    0,   0,   196, 1,   0,   0,   248, 1,   0,   0,   76,  4,   0,   0,   82,  68,  69,  70,  0,
+    1,   0,   0,   1,   0,   0,   0,   124, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   204, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,
+    0,   3,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   103, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    84,  101, 120, 116, 117, 114, 101, 73,  51,  68,  0,   83,  119, 105, 122, 122, 108, 101, 80,
+    114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 171, 103, 0,   0,   0,   1,   0,
+    0,   0,   148, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   172,
+    0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   188, 0,   0,   0,
+    0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101, 115, 0,
+    171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  128, 0,   0,
+    0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,
+    0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,
+    0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,
+    95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,
+    78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,
+    44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,
+    95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  76,  2,   0,   0,   64,
+    0,   0,   0,   147, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,
+    1,   0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   51,  51,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,   0,
+    0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,
+    0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   114, 0,   16,  0,
+    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 0,   16,
+    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,
+    0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,
+    32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   54,
+    0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,   0,   0,
+    0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,
+    0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,   6,   18,
+    0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,
+    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,
+    0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   34,
+    32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,  128, 32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,   0,   0,
+    0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,
+    0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,  48,  32,
+    4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,
+    65,  84,  116, 0,   0,   0,   21,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h
index 510ee15..e840ad8 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h
@@ -1,144 +1,144 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_SwizzleUI2DArray /T ps_4_0 /Fh

-//    compiled\swizzleui2darrayps.h Swizzle11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer SwizzleProperties

-// {

-//

-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI2DArray                  texture   uint4     2darray    0        1

-// SwizzleProperties                 cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   

-// TEXCOORD                 0   xyz         2     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_resource_texture2darray (uint,uint,uint,uint) t0

-dcl_input_ps_siv constant v1.x, rendertarget_array_index

-dcl_input_ps linear v2.xy

-dcl_output o0.xyzw

-dcl_temps 1

-dcl_indexableTemp x0[6], 4

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v2.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.z, v1.x

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov x0[0].x, r0.x

-mov x0[1].x, r0.y

-mov x0[2].x, r0.z

-mov x0[3].x, r0.w

-mov x0[4].x, l(0)

-mov x0[5].x, l(1)

-mov r0.x, cb0[0].x

-mov o0.x, x0[r0.x + 0].x

-mov r0.x, cb0[0].y

-mov o0.y, x0[r0.x + 0].x

-mov r0.x, cb0[0].z

-mov o0.z, x0[r0.x + 0].x

-mov r0.x, cb0[0].w

-mov o0.w, x0[r0.x + 0].x

-ret 

-// Approximately 22 instruction slots used

-#endif

-

-const BYTE g_PS_SwizzleUI2DArray[] = {

-    68,  88,  66,  67,  253, 219, 132, 138, 227, 164, 143, 132, 2,   123, 116, 0,   12,  103, 207,

-    6,   1,   0,   0,   0,   240, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   64,  1,

-    0,   0,   200, 1,   0,   0,   252, 1,   0,   0,   116, 4,   0,   0,   82,  68,  69,  70,  4,

-    1,   0,   0,   1,   0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   208, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   109, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    84,  101, 120, 116, 117, 114, 101, 85,  73,  50,  68,  65,  114, 114, 97,  121, 0,   83,  119,

-    105, 122, 122, 108, 101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 109, 0,

-    0,   0,   1,   0,   0,   0,   152, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   176, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,

-    192, 0,   0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105,

-    99,  101, 115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,

-    76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,

-    46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,

-    78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,

-    0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,

-    0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,

-    0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,

-    78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,

-    82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,

-    79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,

-    0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  112,

-    2,   0,   0,   64,  0,   0,   0,   156, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,

-    0,   0,   0,   0,   1,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,

-    0,   68,  68,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,

-    0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242,

-    32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,

-    0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,

-    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,

-    0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,

-    0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,

-    0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,

-    0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,

-    16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130,

-    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,

-    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,

-    0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,

-    18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,

-    0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,

-    0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,

-    6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,

-    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,

-    0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,

-    7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,

-    128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,

-    0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,

-    48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   22,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_SwizzleUI2DArray /T ps_4_0 /Fh
+//    compiled\swizzleui2darrayps.h Swizzle11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI2DArray                  texture   uint4     2darray    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint   x   
+// TEXCOORD                 0   xyz         2     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture2darray (uint,uint,uint,uint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 22 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleUI2DArray[] = {
+    68,  88,  66,  67,  253, 219, 132, 138, 227, 164, 143, 132, 2,   123, 116, 0,   12,  103, 207,
+    6,   1,   0,   0,   0,   240, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   64,  1,
+    0,   0,   200, 1,   0,   0,   252, 1,   0,   0,   116, 4,   0,   0,   82,  68,  69,  70,  4,
+    1,   0,   0,   1,   0,   0,   0,   128, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   208, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   5,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   109, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    84,  101, 120, 116, 117, 114, 101, 85,  73,  50,  68,  65,  114, 114, 97,  121, 0,   83,  119,
+    105, 122, 122, 108, 101, 80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 109, 0,
+    0,   0,   1,   0,   0,   0,   152, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   176, 0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,
+    192, 0,   0,   0,   0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105,
+    99,  101, 115, 0,   171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,
+    76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,
+    46,  50,  57,  46,  57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,
+    78,  128, 0,   0,   0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,
+    0,   0,   1,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,
+    0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    1,   1,   0,   0,   118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,
+    0,   2,   0,   0,   0,   7,   3,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,
+    78,  0,   83,  86,  95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,
+    82,  65,  89,  73,  78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171,
+    79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,
+    0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  112,
+    2,   0,   0,   64,  0,   0,   0,   156, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,
+    0,   0,   0,   0,   1,   0,   0,   0,   88,  64,  0,   4,   0,   112, 16,  0,   0,   0,   0,
+    0,   68,  68,  0,   0,   100, 8,   0,   4,   18,  16,  16,  0,   1,   0,   0,   0,   4,   0,
+    0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242,
+    32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,
+    0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,
+    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,
+    0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,
+    0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,
+    0,   0,   0,   0,   70,  16,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   50,  0,   16,
+    0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   66,  0,
+    16,  0,   0,   0,   0,   0,   10,  16,  16,  0,   1,   0,   0,   0,   54,  0,   0,   5,   130,
+    0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,
+    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,
+    0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,
+    18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,
+    0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,
+    0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,
+    6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,
+    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,
+    0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,
+    7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,
+    128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,
+    0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,
+    48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   22,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   3,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h
index a871082..2316b28 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h
@@ -1,137 +1,137 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_SwizzleUI2D /T ps_4_0 /Fh compiled\swizzleui2dps.h

-//    Swizzle11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer SwizzleProperties

-// {

-//

-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI2D                       texture   uint4          2d    0        1

-// SwizzleProperties                 cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// TEXCOORD                 0   xy          1     NONE  float   xy  

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_resource_texture2d (uint,uint,uint,uint) t0

-dcl_input_ps linear v1.xy

-dcl_output o0.xyzw

-dcl_temps 1

-dcl_indexableTemp x0[6], 4

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xy, r0.xyxx

-mul r0.xy, r0.xyxx, v1.xyxx

-ftoi r0.xy, r0.xyxx

-mov r0.zw, l(0,0,0,0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov x0[0].x, r0.x

-mov x0[1].x, r0.y

-mov x0[2].x, r0.z

-mov x0[3].x, r0.w

-mov x0[4].x, l(0)

-mov x0[5].x, l(1)

-mov r0.x, cb0[0].x

-mov o0.x, x0[r0.x + 0].x

-mov r0.x, cb0[0].y

-mov o0.y, x0[r0.x + 0].x

-mov r0.x, cb0[0].z

-mov o0.z, x0[r0.x + 0].x

-mov r0.x, cb0[0].w

-mov o0.w, x0[r0.x + 0].x

-ret 

-// Approximately 21 instruction slots used

-#endif

-

-const BYTE g_PS_SwizzleUI2D[] = {

-    68,  88,  66,  67,  140, 55,  150, 179, 133, 9,   250, 249, 200, 106, 121, 178, 86,  215, 59,

-    109, 1,   0,   0,   0,   164, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   60,  1,

-    0,   0,   148, 1,   0,   0,   200, 1,   0,   0,   40,  4,   0,   0,   82,  68,  69,  70,  0,

-    1,   0,   0,   1,   0,   0,   0,   124, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   204, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   104, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    84,  101, 120, 116, 117, 114, 101, 85,  73,  50,  68,  0,   83,  119, 105, 122, 122, 108, 101,

-    80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 104, 0,   0,   0,   1,   0,

-    0,   0,   148, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   172,

-    0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   188, 0,   0,   0,

-    0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101, 115, 0,

-    171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,  0,   0,

-    0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,

-    83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,

-    68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,

-    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,

-    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171,

-    83,  72,  68,  82,  88,  2,   0,   0,   64,  0,   0,   0,   150, 0,   0,   0,   89,  0,   0,

-    4,   70,  142, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   88,  24,  0,   4,   0,   112,

-    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,

-    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,

-    1,   0,   0,   0,   105, 0,   0,   4,   0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,

-    0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,

-    0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,

-    0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,

-    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,

-    0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,

-    0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,  0,   0,   7,

-    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,

-    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,

-    0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,

-    18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,

-    0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,

-    0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,

-    6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,

-    0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,

-    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,

-    0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,

-    7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,

-    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,

-    128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,

-    0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,

-    0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,

-    0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,

-    48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,

-    83,  84,  65,  84,  116, 0,   0,   0,   21,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,

-    0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_SwizzleUI2D /T ps_4_0 /Fh compiled\swizzleui2dps.h
+//    Swizzle11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI2D                       texture   uint4          2d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// TEXCOORD                 0   xy          1     NONE  float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 21 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleUI2D[] = {
+    68,  88,  66,  67,  140, 55,  150, 179, 133, 9,   250, 249, 200, 106, 121, 178, 86,  215, 59,
+    109, 1,   0,   0,   0,   164, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   60,  1,
+    0,   0,   148, 1,   0,   0,   200, 1,   0,   0,   40,  4,   0,   0,   82,  68,  69,  70,  0,
+    1,   0,   0,   1,   0,   0,   0,   124, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   204, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   4,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   104, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    84,  101, 120, 116, 117, 114, 101, 85,  73,  50,  68,  0,   83,  119, 105, 122, 122, 108, 101,
+    80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 104, 0,   0,   0,   1,   0,
+    0,   0,   148, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   172,
+    0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   188, 0,   0,   0,
+    0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101, 115, 0,
+    171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  80,  0,   0,
+    0,   2,   0,   0,   0,   8,   0,   0,   0,   56,  0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   68,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   3,   3,   0,   0,
+    83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   84,  69,  88,  67,  79,  79,  82,
+    68,  0,   171, 171, 171, 79,  83,  71,  78,  44,  0,   0,   0,   1,   0,   0,   0,   8,   0,
+    0,   0,   32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,
+    0,   0,   0,   15,  0,   0,   0,   83,  86,  95,  84,  65,  82,  71,  69,  84,  0,   171, 171,
+    83,  72,  68,  82,  88,  2,   0,   0,   64,  0,   0,   0,   150, 0,   0,   0,   89,  0,   0,
+    4,   70,  142, 32,  0,   0,   0,   0,   0,   1,   0,   0,   0,   88,  24,  0,   4,   0,   112,
+    16,  0,   0,   0,   0,   0,   68,  68,  0,   0,   98,  16,  0,   3,   50,  16,  16,  0,   1,
+    0,   0,   0,   101, 0,   0,   3,   242, 32,  16,  0,   0,   0,   0,   0,   104, 0,   0,   2,
+    1,   0,   0,   0,   105, 0,   0,   4,   0,   0,   0,   0,   6,   0,   0,   0,   4,   0,   0,
+    0,   61,  16,  0,   7,   242, 0,   16,  0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,
+    0,   0,   70,  126, 16,  0,   0,   0,   0,   0,   86,  0,   0,   5,   50,  0,   16,  0,   0,
+    0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   56,  0,   0,   7,   50,  0,   16,  0,
+    0,   0,   0,   0,   70,  0,   16,  0,   0,   0,   0,   0,   70,  16,  16,  0,   1,   0,   0,
+    0,   27,  0,   0,   5,   50,  0,   16,  0,   0,   0,   0,   0,   70,  0,   16,  0,   0,   0,
+    0,   0,   54,  0,   0,   8,   194, 0,   16,  0,   0,   0,   0,   0,   2,   64,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   45,  0,   0,   7,
+    242, 0,   16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,
+    0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,
+    0,   0,   0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,
+    18,  48,  32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,
+    0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,
+    0,   0,   0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,
+    6,   18,  0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,
+    0,   0,   54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,
+    0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,
+    0,   0,   0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,
+    7,   34,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,
+    16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,
+    128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,
+    0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,
+    0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,
+    0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,
+    48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,
+    83,  84,  65,  84,  116, 0,   0,   0,   21,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
+    0,   2,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h
index 28004ed..608813e 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h
@@ -1,140 +1,140 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111

-//

-//

-//   fxc /nologo /E PS_SwizzleUI3D /T ps_4_0 /Fh compiled\swizzleui3dps.h

-//    Swizzle11.hlsl

-//

-//

-// Buffer Definitions: 

-//

-// cbuffer SwizzleProperties

-// {

-//

-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16

-//

-// }

-//

-//

-// Resource Bindings:

-//

-// Name                                 Type  Format         Dim Slot Elements

-// ------------------------------ ---------- ------- ----------- ---- --------

-// TextureUI3D                       texture   uint4          3d    0        1

-// SwizzleProperties                 cbuffer      NA          NA    0        1

-//

-//

-//

-// Input signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_POSITION              0   xyzw        0      POS  float       

-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       

-// TEXCOORD                 0   xyz         2     NONE  float   xyz 

-//

-//

-// Output signature:

-//

-// Name                 Index   Mask Register SysValue Format   Used

-// -------------------- ----- ------ -------- -------- ------ ------

-// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw

-//

-ps_4_0

-dcl_constantbuffer cb0[1], immediateIndexed

-dcl_resource_texture3d (uint,uint,uint,uint) t0

-dcl_input_ps linear v2.xyz

-dcl_output o0.xyzw

-dcl_temps 1

-dcl_indexableTemp x0[6], 4

-resinfo_uint r0.xyzw, l(0), t0.xyzw

-utof r0.xyz, r0.xyzx

-mul r0.xyz, r0.xyzx, v2.xyzx

-ftoi r0.xyz, r0.xyzx

-mov r0.w, l(0)

-ld r0.xyzw, r0.xyzw, t0.xyzw

-mov x0[0].x, r0.x

-mov x0[1].x, r0.y

-mov x0[2].x, r0.z

-mov x0[3].x, r0.w

-mov x0[4].x, l(0)

-mov x0[5].x, l(1)

-mov r0.x, cb0[0].x

-mov o0.x, x0[r0.x + 0].x

-mov r0.x, cb0[0].y

-mov o0.y, x0[r0.x + 0].x

-mov r0.x, cb0[0].z

-mov o0.z, x0[r0.x + 0].x

-mov r0.x, cb0[0].w

-mov o0.w, x0[r0.x + 0].x

-ret 

-// Approximately 21 instruction slots used

-#endif

-

-const BYTE g_PS_SwizzleUI3D[] = {

-    68,  88,  66,  67,  16,  68,  155, 94,  147, 232, 30,  147, 133, 253, 183, 22,  27,  47,  144,

-    44,  1,   0,   0,   0,   200, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   60,  1,

-    0,   0,   196, 1,   0,   0,   248, 1,   0,   0,   76,  4,   0,   0,   82,  68,  69,  70,  0,

-    1,   0,   0,   1,   0,   0,   0,   124, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,

-    0,   4,   255, 255, 0,   1,   0,   0,   204, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,

-    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,

-    0,   0,   13,  0,   0,   0,   104, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    84,  101, 120, 116, 117, 114, 101, 85,  73,  51,  68,  0,   83,  119, 105, 122, 122, 108, 101,

-    80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 104, 0,   0,   0,   1,   0,

-    0,   0,   148, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   172,

-    0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   188, 0,   0,   0,

-    0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101, 115, 0,

-    171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105,

-    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,

-    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  128, 0,   0,

-    0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,

-    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,

-    0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,

-    118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,

-    0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,

-    95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,

-    78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,

-    44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,

-    95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  76,  2,   0,   0,   64,

-    0,   0,   0,   147, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,

-    1,   0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,

-    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,

-    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,   0,

-    0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,

-    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,

-    0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,

-    0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,

-    0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   114, 0,   16,  0,

-    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 0,   16,

-    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242, 0,

-    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,

-    0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,

-    0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,

-    32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   54,

-    0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,   0,   0,

-    0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,

-    0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,   6,   18,

-    0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,

-    54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,

-    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,

-    0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   34,

-    32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,

-    0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,  128, 32,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,   0,   0,

-    0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,

-    0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,   0,   0,

-    0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,  48,  32,

-    4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,

-    65,  84,  116, 0,   0,   0,   21,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,

-    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

-    0,   0,   0,   0,   0,   0,   0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
+//
+//
+//   fxc /nologo /E PS_SwizzleUI3D /T ps_4_0 /Fh compiled\swizzleui3dps.h
+//    Swizzle11.hlsl
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI3D                       texture   uint4          3d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_POSITION              0   xyzw        0      POS  float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX   uint       
+// TEXCOORD                 0   xyz         2     NONE  float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue Format   Used
+// -------------------- ----- ------ -------- -------- ------ ------
+// SV_TARGET                0   xyzw        0   TARGET   uint   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 21 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleUI3D[] = {
+    68,  88,  66,  67,  16,  68,  155, 94,  147, 232, 30,  147, 133, 253, 183, 22,  27,  47,  144,
+    44,  1,   0,   0,   0,   200, 4,   0,   0,   5,   0,   0,   0,   52,  0,   0,   0,   60,  1,
+    0,   0,   196, 1,   0,   0,   248, 1,   0,   0,   76,  4,   0,   0,   82,  68,  69,  70,  0,
+    1,   0,   0,   1,   0,   0,   0,   124, 0,   0,   0,   2,   0,   0,   0,   28,  0,   0,   0,
+    0,   4,   255, 255, 0,   1,   0,   0,   204, 0,   0,   0,   92,  0,   0,   0,   2,   0,   0,
+    0,   4,   0,   0,   0,   8,   0,   0,   0,   255, 255, 255, 255, 0,   0,   0,   0,   1,   0,
+    0,   0,   13,  0,   0,   0,   104, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    84,  101, 120, 116, 117, 114, 101, 85,  73,  51,  68,  0,   83,  119, 105, 122, 122, 108, 101,
+    80,  114, 111, 112, 101, 114, 116, 105, 101, 115, 0,   171, 171, 104, 0,   0,   0,   1,   0,
+    0,   0,   148, 0,   0,   0,   16,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   172,
+    0,   0,   0,   0,   0,   0,   0,   16,  0,   0,   0,   2,   0,   0,   0,   188, 0,   0,   0,
+    0,   0,   0,   0,   83,  119, 105, 122, 122, 108, 101, 73,  110, 100, 105, 99,  101, 115, 0,
+    171, 1,   0,   19,  0,   1,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   77,  105,
+    99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,  32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  57,  46,  50,  57,  46,
+    57,  53,  50,  46,  51,  49,  49,  49,  0,   171, 171, 171, 73,  83,  71,  78,  128, 0,   0,
+    0,   3,   0,   0,   0,   8,   0,   0,   0,   80,  0,   0,   0,   0,   0,   0,   0,   1,   0,
+    0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   92,  0,   0,   0,   0,
+    0,   0,   0,   4,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,   1,   0,   0,   0,
+    118, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   0,   2,   0,   0,
+    0,   7,   7,   0,   0,   83,  86,  95,  80,  79,  83,  73,  84,  73,  79,  78,  0,   83,  86,
+    95,  82,  69,  78,  68,  69,  82,  84,  65,  82,  71,  69,  84,  65,  82,  82,  65,  89,  73,
+    78,  68,  69,  88,  0,   84,  69,  88,  67,  79,  79,  82,  68,  0,   171, 79,  83,  71,  78,
+    44,  0,   0,   0,   1,   0,   0,   0,   8,   0,   0,   0,   32,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   15,  0,   0,   0,   83,  86,
+    95,  84,  65,  82,  71,  69,  84,  0,   171, 171, 83,  72,  68,  82,  76,  2,   0,   0,   64,
+    0,   0,   0,   147, 0,   0,   0,   89,  0,   0,   4,   70,  142, 32,  0,   0,   0,   0,   0,
+    1,   0,   0,   0,   88,  40,  0,   4,   0,   112, 16,  0,   0,   0,   0,   0,   68,  68,  0,
+    0,   98,  16,  0,   3,   114, 16,  16,  0,   2,   0,   0,   0,   101, 0,   0,   3,   242, 32,
+    16,  0,   0,   0,   0,   0,   104, 0,   0,   2,   1,   0,   0,   0,   105, 0,   0,   4,   0,
+    0,   0,   0,   6,   0,   0,   0,   4,   0,   0,   0,   61,  16,  0,   7,   242, 0,   16,  0,
+    0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   70,  126, 16,  0,   0,   0,   0,
+    0,   86,  0,   0,   5,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,   0,
+    0,   0,   56,  0,   0,   7,   114, 0,   16,  0,   0,   0,   0,   0,   70,  2,   16,  0,   0,
+    0,   0,   0,   70,  18,  16,  0,   2,   0,   0,   0,   27,  0,   0,   5,   114, 0,   16,  0,
+    0,   0,   0,   0,   70,  2,   16,  0,   0,   0,   0,   0,   54,  0,   0,   5,   130, 0,   16,
+    0,   0,   0,   0,   0,   1,   64,  0,   0,   0,   0,   0,   0,   45,  0,   0,   7,   242, 0,
+    16,  0,   0,   0,   0,   0,   70,  14,  16,  0,   0,   0,   0,   0,   70,  126, 16,  0,   0,
+    0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,
+    0,   1,   0,   0,   0,   26,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,
+    32,  0,   0,   0,   0,   0,   2,   0,   0,   0,   42,  0,   16,  0,   0,   0,   0,   0,   54,
+    0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   3,   0,   0,   0,   58,  0,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,   0,   0,   4,   0,   0,
+    0,   1,   64,  0,   0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  48,  32,  0,   0,   0,
+    0,   0,   5,   0,   0,   0,   1,   64,  0,   0,   1,   0,   0,   0,   54,  0,   0,   6,   18,
+    0,   16,  0,   0,   0,   0,   0,   10,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,
+    54,  0,   0,   7,   18,  32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,
+    0,   10,  0,   16,  0,   0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,
+    0,   0,   26,  128, 32,  0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   34,
+    32,  16,  0,   0,   0,   0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,
+    0,   0,   0,   0,   54,  0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   42,  128, 32,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   54,  0,   0,   7,   66,  32,  16,  0,   0,   0,
+    0,   0,   10,  48,  32,  4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   54,
+    0,   0,   6,   18,  0,   16,  0,   0,   0,   0,   0,   58,  128, 32,  0,   0,   0,   0,   0,
+    0,   0,   0,   0,   54,  0,   0,   7,   130, 32,  16,  0,   0,   0,   0,   0,   10,  48,  32,
+    4,   0,   0,   0,   0,   10,  0,   16,  0,   0,   0,   0,   0,   62,  0,   0,   1,   83,  84,
+    65,  84,  116, 0,   0,   0,   21,  0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   2,
+    0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   6,   0,   0,   0,   10,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat
index 0dd33d3..b7420a5 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat
@@ -1,260 +1,260 @@
-@ECHO OFF

-REM

-REM Copyright 2013 The ANGLE Project Authors. All rights reserved.

-REM Use of this source code is governed by a BSD-style license that can be

-REM found in the LICENSE file.

-REM

-

-PATH %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86;%DXSDK_DIR%\Utilities\bin\x86;%PATH%

-

-setlocal

-set errorCount=0

-set successCount=0

-set debug=0

-

-if "%1" == "debug" (

-    set debug=1

-)

-if "%1" == "release" (

-    set debug=0

-)

-

-:: Shaders for OpenGL ES 2.0 and OpenGL ES 3.0+

-::              | Input file         | Entry point            | Type            | Output file                        | Debug |

-call:BuildShader Passthrough2D11.hlsl VS_Passthrough2D         vs_4_0_level_9_3  compiled\passthrough2d11vs.h         %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2D     ps_4_0_level_9_3  compiled\passthroughrgba2d11ps.h     %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughA2D        ps_4_0_level_9_3  compiled\passthrougha2d11ps.h        %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2DMS   ps_4_1            compiled\passthroughrgba2dms11ps.h   %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2D      ps_4_0_level_9_3  compiled\passthroughrgb2d11ps.h      %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRG2D       ps_4_0_level_9_3  compiled\passthroughrg2d11ps.h       %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughR2D        ps_4_0_level_9_3  compiled\passthroughr2d11ps.h        %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughLum2D      ps_4_0_level_9_3  compiled\passthroughlum2d11ps.h      %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughLumAlpha2D ps_4_0_level_9_3  compiled\passthroughlumalpha2d11ps.h %debug%

-

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2D_4444 ps_4_0_level_9_3 compiled\passthroughrgba2d_4444_11ps.h %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2D_565   ps_4_0_level_9_3 compiled\passthroughrgb2d_565_11ps.h   %debug%

-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2D_5551 ps_4_0_level_9_3 compiled\passthroughrgba2d_5551_11ps.h %debug%

-

-call:BuildShader ResolveColor.hlsl PS_ResolveColor2D ps_4_1 compiled\resolvecolor2dps.h %debug%

-

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_2D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_2d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_2D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_2d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_2D  ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_2d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_2D  ps_4_0 compiled\multiplyalpha_ftof_um_rgb_2d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGBA_2D ps_4_0 compiled\multiplyalpha_ftou_pt_rgba_2d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGBA_2D ps_4_0 compiled\multiplyalpha_ftou_pm_rgba_2d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGBA_2D ps_4_0 compiled\multiplyalpha_ftou_um_rgba_2d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGB_2D  ps_4_0 compiled\multiplyalpha_ftou_pt_rgb_2d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGB_2D  ps_4_0 compiled\multiplyalpha_ftou_pm_rgb_2d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGB_2D  ps_4_0 compiled\multiplyalpha_ftou_um_rgb_2d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMA_2D ps_4_0 compiled\multiplyalpha_ftof_pm_luma_2d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMA_2D ps_4_0 compiled\multiplyalpha_ftof_um_luma_2d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMAALPHA_2D   ps_4_0 compiled\multiplyalpha_ftof_pm_lumaalpha_2d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMAALPHA_2D   ps_4_0 compiled\multiplyalpha_ftof_um_lumaalpha_2d_ps.h  %debug%

-

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_4444_2D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_4444_2d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_4444_2D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_4444_2d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_565_2D   ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_565_2d_ps.h   %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_565_2D   ps_4_0 compiled\multiplyalpha_ftof_um_rgb_565_2d_ps.h   %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_5551_2D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_5551_2d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_5551_2D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_5551_2d_ps.h %debug%

-

-call:BuildShader Clear11.hlsl           VS_Clear_FL9             vs_4_0_level_9_3  compiled\clear11_fl9vs.h             %debug%

-call:BuildShader Clear11.hlsl           PS_ClearFloat_FL9        ps_4_0_level_9_3  compiled\clearfloat11_fl9ps.h        %debug%

-

-call:BuildShader Clear11.hlsl           VS_Clear                 vs_4_0            compiled\clear11vs.h                 %debug%

-call:BuildShader Clear11.hlsl           VS_Multiview_Clear                 vs_4_0            compiled\clear11multiviewvs.h                 %debug%

-call:BuildShader Clear11.hlsl           GS_Multiview_Clear                 gs_4_0            compiled\clear11multiviewgs.h                 %debug%

-call:BuildShader Clear11.hlsl           PS_ClearDepth            ps_4_0            compiled\cleardepth11ps.h            %debug%

-call:BuildShader Clear11.hlsl           PS_ClearFloat1           ps_4_0            compiled\clearfloat11ps1.h           %debug%

-call:BuildShader Clear11.hlsl           PS_ClearFloat2           ps_4_0            compiled\clearfloat11ps2.h           %debug%

-call:BuildShader Clear11.hlsl           PS_ClearFloat3           ps_4_0            compiled\clearfloat11ps3.h           %debug%

-call:BuildShader Clear11.hlsl           PS_ClearFloat4           ps_4_0            compiled\clearfloat11ps4.h           %debug%

-call:BuildShader Clear11.hlsl           PS_ClearFloat5           ps_4_0            compiled\clearfloat11ps5.h           %debug%

-call:BuildShader Clear11.hlsl           PS_ClearFloat6           ps_4_0            compiled\clearfloat11ps6.h           %debug%

-call:BuildShader Clear11.hlsl           PS_ClearFloat7           ps_4_0            compiled\clearfloat11ps7.h           %debug%

-call:BuildShader Clear11.hlsl           PS_ClearFloat8           ps_4_0            compiled\clearfloat11ps8.h           %debug%

-

-:: Shaders for OpenGL ES 3.0+ only

-::              | Input file               | Entry point            | Type   | Output file                        | Debug |

-call:BuildShader Passthrough2D11.hlsl       PS_PassthroughDepth2D    ps_4_0   compiled\passthroughdepth2d11ps.h    %debug%

-call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRGBA2DUI   ps_4_0   compiled\passthroughrgba2dui11ps.h   %debug%

-call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRGBA2DI    ps_4_0   compiled\passthroughrgba2di11ps.h    %debug%

-call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRGB2DUI    ps_4_0   compiled\passthroughrgb2dui11ps.h    %debug%

-call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRGB2DI     ps_4_0   compiled\passthroughrgb2di11ps.h     %debug%

-call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRG2DUI     ps_4_0   compiled\passthroughrg2dui11ps.h     %debug%

-call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRG2DI      ps_4_0   compiled\passthroughrg2di11ps.h      %debug%

-call:BuildShader Passthrough2D11.hlsl       PS_PassthroughR2DUI      ps_4_0   compiled\passthroughr2dui11ps.h      %debug%

-call:BuildShader Passthrough2D11.hlsl       PS_PassthroughR2DI       ps_4_0   compiled\passthroughr2di11ps.h       %debug%

-

-call:BuildShader Passthrough3D11.hlsl       VS_Passthrough3D         vs_4_0   compiled\passthrough3d11vs.h         %debug%

-call:BuildShader Passthrough3D11.hlsl       GS_Passthrough3D         gs_4_0   compiled\passthrough3d11gs.h         %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGBA3D     ps_4_0   compiled\passthroughrgba3d11ps.h     %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGBA3DUI   ps_4_0   compiled\passthroughrgba3dui11ps.h   %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGBA3DI    ps_4_0   compiled\passthroughrgba3di11ps.h    %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGB3D      ps_4_0   compiled\passthroughrgb3d11ps.h      %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGB3DUI    ps_4_0   compiled\passthroughrgb3dui11ps.h    %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGB3DI     ps_4_0   compiled\passthroughrgb3di11ps.h     %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRG3D       ps_4_0   compiled\passthroughrg3d11ps.h       %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRG3DUI     ps_4_0   compiled\passthroughrg3dui11ps.h     %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRG3DI      ps_4_0   compiled\passthroughrg3di11ps.h      %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughR3D        ps_4_0   compiled\passthroughr3d11ps.h        %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughR3DUI      ps_4_0   compiled\passthroughr3dui11ps.h      %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughR3DI       ps_4_0   compiled\passthroughr3di11ps.h       %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughLum3D      ps_4_0   compiled\passthroughlum3d11ps.h      %debug%

-call:BuildShader Passthrough3D11.hlsl       PS_PassthroughLumAlpha3D ps_4_0   compiled\passthroughlumalpha3d11ps.h %debug%

-

-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3D_4444 ps_4_0 compiled\passthroughrgba3d_4444_11ps.h %debug%

-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGB3D_565   ps_4_0 compiled\passthroughrgb3d_565_11ps.h   %debug%

-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3D_5551 ps_4_0 compiled\passthroughrgba3d_5551_11ps.h %debug%

-

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGBA2DArray     ps_4_0   compiled\passthroughrgba2darray11ps.h     %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGBA2DArrayUI   ps_4_0   compiled\passthroughrgba2darrayui11ps.h   %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGBA2DArrayI    ps_4_0   compiled\passthroughrgba2darrayi11ps.h    %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGB2DArray      ps_4_0   compiled\passthroughrgb2darray11ps.h      %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGB2DArrayUI    ps_4_0   compiled\passthroughrgb2darrayui11ps.h    %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGB2DArrayI     ps_4_0   compiled\passthroughrgb2darrayi11ps.h     %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRG2DArray       ps_4_0   compiled\passthroughrg2darray11ps.h       %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRG2DArrayUI     ps_4_0   compiled\passthroughrg2darrayui11ps.h     %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRG2DArrayI      ps_4_0   compiled\passthroughrg2darrayi11ps.h      %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughR2DArray        ps_4_0   compiled\passthroughr2darray11ps.h        %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughR2DArrayUI      ps_4_0   compiled\passthroughr2darrayui11ps.h      %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughR2DArrayI       ps_4_0   compiled\passthroughr2darrayi11ps.h       %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughLum2DArray      ps_4_0   compiled\passthroughlum2darray11ps.h      %debug%

-call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughLumAlpha2DArray ps_4_0   compiled\passthroughlumalpha2darray11ps.h %debug%

-

-call:BuildShader Passthrough2DArray11.hlsl PS_PassthroughRGBA2DArray_4444 ps_4_0 compiled\passthroughrgba2darray_4444_11ps.h %debug%

-call:BuildShader Passthrough2DArray11.hlsl PS_PassthroughRGB2DArray_565   ps_4_0 compiled\passthroughrgb2darray_565_11ps.h   %debug%

-call:BuildShader Passthrough2DArray11.hlsl PS_PassthroughRGBA2DArray_5551 ps_4_0 compiled\passthroughrgba2darray_5551_11ps.h %debug%

-

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftof_um_rgb_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGBA_3D ps_4_0 compiled\multiplyalpha_ftou_pt_rgba_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftou_pm_rgba_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftou_um_rgba_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGB_3D  ps_4_0 compiled\multiplyalpha_ftou_pt_rgb_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftou_pm_rgb_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftou_um_rgb_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PT_RGBA_3D ps_4_0 compiled\multiplyalpha_ftoi_pt_rgba_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftoi_pm_rgba_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_UM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftoi_um_rgba_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PT_RGB_3D  ps_4_0 compiled\multiplyalpha_ftoi_pt_rgb_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftoi_pm_rgb_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_UM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftoi_um_rgb_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMA_3D ps_4_0 compiled\multiplyalpha_ftof_pm_luma_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMA_3D ps_4_0 compiled\multiplyalpha_ftof_um_luma_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMAALPHA_3D   ps_4_0 compiled\multiplyalpha_ftof_pm_lumaalpha_3d_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMAALPHA_3D   ps_4_0 compiled\multiplyalpha_ftof_um_lumaalpha_3d_ps.h  %debug%

-

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_4444_3D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_4444_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_4444_3D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_4444_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_565_3D   ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_565_3d_ps.h   %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_565_3D   ps_4_0 compiled\multiplyalpha_ftof_um_rgb_565_3d_ps.h   %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_5551_3D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_5551_3d_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_5551_3D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_5551_3d_ps.h %debug%

-

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftof_um_rgba_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftof_um_rgb_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftou_pt_rgba_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftou_pm_rgba_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftou_um_rgba_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftou_pt_rgb_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftou_pm_rgb_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftou_um_rgb_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PT_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftoi_pt_rgba_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftoi_pm_rgba_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_UM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftoi_um_rgba_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PT_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftoi_pt_rgb_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftoi_pm_rgb_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoI_UM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftoi_um_rgb_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMA_2DArray ps_4_0 compiled\multiplyalpha_ftof_pm_luma_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMA_2DArray ps_4_0 compiled\multiplyalpha_ftof_um_luma_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMAALPHA_2DArray   ps_4_0 compiled\multiplyalpha_ftof_pm_lumaalpha_2darray_ps.h  %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMAALPHA_2DArray   ps_4_0 compiled\multiplyalpha_ftof_um_lumaalpha_2darray_ps.h  %debug%

-

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_4444_2DArray ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_4444_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_4444_2DArray ps_4_0 compiled\multiplyalpha_ftof_um_rgba_4444_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_565_2DArray   ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_565_2darray_ps.h   %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_565_2DArray   ps_4_0 compiled\multiplyalpha_ftof_um_rgb_565_2darray_ps.h   %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_5551_2DArray ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_5551_2darray_ps.h %debug%

-call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_5551_2DArray ps_4_0 compiled\multiplyalpha_ftof_um_rgba_5551_2darray_ps.h %debug%

-

-call:BuildShader Swizzle11.hlsl             PS_SwizzleF2D            ps_4_0   compiled\swizzlef2dps.h              %debug%

-call:BuildShader Swizzle11.hlsl             PS_SwizzleI2D            ps_4_0   compiled\swizzlei2dps.h              %debug%

-call:BuildShader Swizzle11.hlsl             PS_SwizzleUI2D           ps_4_0   compiled\swizzleui2dps.h             %debug%

-

-call:BuildShader Swizzle11.hlsl             PS_SwizzleF3D            ps_4_0   compiled\swizzlef3dps.h              %debug%

-call:BuildShader Swizzle11.hlsl             PS_SwizzleI3D            ps_4_0   compiled\swizzlei3dps.h              %debug%

-call:BuildShader Swizzle11.hlsl             PS_SwizzleUI3D           ps_4_0   compiled\swizzleui3dps.h             %debug%

-

-call:BuildShader Swizzle11.hlsl             PS_SwizzleF2DArray       ps_4_0   compiled\swizzlef2darrayps.h         %debug%

-call:BuildShader Swizzle11.hlsl             PS_SwizzleI2DArray       ps_4_0   compiled\swizzlei2darrayps.h         %debug%

-call:BuildShader Swizzle11.hlsl             PS_SwizzleUI2DArray      ps_4_0   compiled\swizzleui2darrayps.h        %debug%

-

-call:BuildShader Clear11.hlsl               PS_ClearUint1            ps_4_0   compiled\clearuint11ps1.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearUint2            ps_4_0   compiled\clearuint11ps2.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearUint3            ps_4_0   compiled\clearuint11ps3.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearUint4            ps_4_0   compiled\clearuint11ps4.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearUint5            ps_4_0   compiled\clearuint11ps5.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearUint6            ps_4_0   compiled\clearuint11ps6.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearUint7            ps_4_0   compiled\clearuint11ps7.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearUint8            ps_4_0   compiled\clearuint11ps8.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearSint1            ps_4_0   compiled\clearsint11ps1.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearSint2            ps_4_0   compiled\clearsint11ps2.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearSint3            ps_4_0   compiled\clearsint11ps3.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearSint4            ps_4_0   compiled\clearsint11ps4.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearSint5            ps_4_0   compiled\clearsint11ps5.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearSint6            ps_4_0   compiled\clearsint11ps6.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearSint7            ps_4_0   compiled\clearsint11ps7.h            %debug%

-call:BuildShader Clear11.hlsl               PS_ClearSint8            ps_4_0   compiled\clearsint11ps8.h            %debug%

-

-call:BuildShader BufferToTexture11.hlsl     VS_BufferToTexture       vs_4_0   compiled/buffertotexture11_vs.h      %debug%

-call:BuildShader BufferToTexture11.hlsl     GS_BufferToTexture       gs_4_0   compiled/buffertotexture11_gs.h      %debug%

-call:BuildShader BufferToTexture11.hlsl     PS_BufferToTexture_4F    ps_4_0   compiled/buffertotexture11_ps_4f.h   %debug%

-call:BuildShader BufferToTexture11.hlsl     PS_BufferToTexture_4I    ps_4_0   compiled/buffertotexture11_ps_4i.h   %debug%

-call:BuildShader BufferToTexture11.hlsl     PS_BufferToTexture_4UI   ps_4_0   compiled/buffertotexture11_ps_4ui.h  %debug%

-

-call:BuildShader ResolveDepthStencil.hlsl   VS_ResolveDepthStencil   vs_4_1   compiled/resolvedepthstencil11_vs.h  %debug%

-call:BuildShader ResolveDepthStencil.hlsl   PS_ResolveDepth          ps_4_1   compiled/resolvedepth11_ps.h         %debug%

-call:BuildShader ResolveDepthStencil.hlsl   PS_ResolveDepthStencil   ps_4_1   compiled/resolvedepthstencil11_ps.h  %debug%

-call:BuildShader ResolveDepthStencil.hlsl   PS_ResolveStencil        ps_4_1   compiled/resolvestencil11_ps.h       %debug%

-

-echo.

-

-if %successCount% GTR 0 (

-   echo %successCount% shaders compiled successfully.

-)

-if %errorCount% GTR 0 (

-   echo There were %errorCount% shader compilation errors.

-)

-

-endlocal

-exit /b

-

-:BuildShader

-set input=%~1

-set entry=%~2

-set type=%~3

-set output=%~4

-set debug=%~5

-

-if %debug% == 0 (

-    set "buildCMD=fxc /nologo /E %entry% /T %type% /Fh %output% %input%"

-) else (

-    set "buildCMD=fxc /nologo /Zi /Od /E %entry% /T %type% /Fh %output% %input%"

-)

-

-set error=0

-%buildCMD% || set error=1

-

-if %error% == 0 (

-    set /a successCount=%successCount%+1

-) else (

-    set /a errorCount=%errorCount%+1

-)

-

-exit /b

+@ECHO OFF
+REM
+REM Copyright 2013 The ANGLE Project Authors. All rights reserved.
+REM Use of this source code is governed by a BSD-style license that can be
+REM found in the LICENSE file.
+REM
+
+PATH %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86;%DXSDK_DIR%\Utilities\bin\x86;%PATH%
+
+setlocal
+set errorCount=0
+set successCount=0
+set debug=0
+
+if "%1" == "debug" (
+    set debug=1
+)
+if "%1" == "release" (
+    set debug=0
+)
+
+:: Shaders for OpenGL ES 2.0 and OpenGL ES 3.0+
+::              | Input file         | Entry point            | Type            | Output file                        | Debug |
+call:BuildShader Passthrough2D11.hlsl VS_Passthrough2D         vs_4_0_level_9_3  compiled\passthrough2d11vs.h         %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2D     ps_4_0_level_9_3  compiled\passthroughrgba2d11ps.h     %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughA2D        ps_4_0_level_9_3  compiled\passthrougha2d11ps.h        %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2DMS   ps_4_1            compiled\passthroughrgba2dms11ps.h   %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2D      ps_4_0_level_9_3  compiled\passthroughrgb2d11ps.h      %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRG2D       ps_4_0_level_9_3  compiled\passthroughrg2d11ps.h       %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughR2D        ps_4_0_level_9_3  compiled\passthroughr2d11ps.h        %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughLum2D      ps_4_0_level_9_3  compiled\passthroughlum2d11ps.h      %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughLumAlpha2D ps_4_0_level_9_3  compiled\passthroughlumalpha2d11ps.h %debug%
+
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2D_4444 ps_4_0_level_9_3 compiled\passthroughrgba2d_4444_11ps.h %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2D_565   ps_4_0_level_9_3 compiled\passthroughrgb2d_565_11ps.h   %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2D_5551 ps_4_0_level_9_3 compiled\passthroughrgba2d_5551_11ps.h %debug%
+
+call:BuildShader ResolveColor.hlsl PS_ResolveColor2D ps_4_1 compiled\resolvecolor2dps.h %debug%
+
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_2D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_2d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_2D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_2d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_2D  ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_2d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_2D  ps_4_0 compiled\multiplyalpha_ftof_um_rgb_2d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGBA_2D ps_4_0 compiled\multiplyalpha_ftou_pt_rgba_2d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGBA_2D ps_4_0 compiled\multiplyalpha_ftou_pm_rgba_2d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGBA_2D ps_4_0 compiled\multiplyalpha_ftou_um_rgba_2d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGB_2D  ps_4_0 compiled\multiplyalpha_ftou_pt_rgb_2d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGB_2D  ps_4_0 compiled\multiplyalpha_ftou_pm_rgb_2d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGB_2D  ps_4_0 compiled\multiplyalpha_ftou_um_rgb_2d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMA_2D ps_4_0 compiled\multiplyalpha_ftof_pm_luma_2d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMA_2D ps_4_0 compiled\multiplyalpha_ftof_um_luma_2d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMAALPHA_2D   ps_4_0 compiled\multiplyalpha_ftof_pm_lumaalpha_2d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMAALPHA_2D   ps_4_0 compiled\multiplyalpha_ftof_um_lumaalpha_2d_ps.h  %debug%
+
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_4444_2D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_4444_2d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_4444_2D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_4444_2d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_565_2D   ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_565_2d_ps.h   %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_565_2D   ps_4_0 compiled\multiplyalpha_ftof_um_rgb_565_2d_ps.h   %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_5551_2D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_5551_2d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_5551_2D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_5551_2d_ps.h %debug%
+
+call:BuildShader Clear11.hlsl           VS_Clear_FL9             vs_4_0_level_9_3  compiled\clear11_fl9vs.h             %debug%
+call:BuildShader Clear11.hlsl           PS_ClearFloat_FL9        ps_4_0_level_9_3  compiled\clearfloat11_fl9ps.h        %debug%
+
+call:BuildShader Clear11.hlsl           VS_Clear                 vs_4_0            compiled\clear11vs.h                 %debug%
+call:BuildShader Clear11.hlsl           VS_Multiview_Clear                 vs_4_0            compiled\clear11multiviewvs.h                 %debug%
+call:BuildShader Clear11.hlsl           GS_Multiview_Clear                 gs_4_0            compiled\clear11multiviewgs.h                 %debug%
+call:BuildShader Clear11.hlsl           PS_ClearDepth            ps_4_0            compiled\cleardepth11ps.h            %debug%
+call:BuildShader Clear11.hlsl           PS_ClearFloat1           ps_4_0            compiled\clearfloat11ps1.h           %debug%
+call:BuildShader Clear11.hlsl           PS_ClearFloat2           ps_4_0            compiled\clearfloat11ps2.h           %debug%
+call:BuildShader Clear11.hlsl           PS_ClearFloat3           ps_4_0            compiled\clearfloat11ps3.h           %debug%
+call:BuildShader Clear11.hlsl           PS_ClearFloat4           ps_4_0            compiled\clearfloat11ps4.h           %debug%
+call:BuildShader Clear11.hlsl           PS_ClearFloat5           ps_4_0            compiled\clearfloat11ps5.h           %debug%
+call:BuildShader Clear11.hlsl           PS_ClearFloat6           ps_4_0            compiled\clearfloat11ps6.h           %debug%
+call:BuildShader Clear11.hlsl           PS_ClearFloat7           ps_4_0            compiled\clearfloat11ps7.h           %debug%
+call:BuildShader Clear11.hlsl           PS_ClearFloat8           ps_4_0            compiled\clearfloat11ps8.h           %debug%
+
+:: Shaders for OpenGL ES 3.0+ only
+::              | Input file               | Entry point            | Type   | Output file                        | Debug |
+call:BuildShader Passthrough2D11.hlsl       PS_PassthroughDepth2D    ps_4_0   compiled\passthroughdepth2d11ps.h    %debug%
+call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRGBA2DUI   ps_4_0   compiled\passthroughrgba2dui11ps.h   %debug%
+call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRGBA2DI    ps_4_0   compiled\passthroughrgba2di11ps.h    %debug%
+call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRGB2DUI    ps_4_0   compiled\passthroughrgb2dui11ps.h    %debug%
+call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRGB2DI     ps_4_0   compiled\passthroughrgb2di11ps.h     %debug%
+call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRG2DUI     ps_4_0   compiled\passthroughrg2dui11ps.h     %debug%
+call:BuildShader Passthrough2D11.hlsl       PS_PassthroughRG2DI      ps_4_0   compiled\passthroughrg2di11ps.h      %debug%
+call:BuildShader Passthrough2D11.hlsl       PS_PassthroughR2DUI      ps_4_0   compiled\passthroughr2dui11ps.h      %debug%
+call:BuildShader Passthrough2D11.hlsl       PS_PassthroughR2DI       ps_4_0   compiled\passthroughr2di11ps.h       %debug%
+
+call:BuildShader Passthrough3D11.hlsl       VS_Passthrough3D         vs_4_0   compiled\passthrough3d11vs.h         %debug%
+call:BuildShader Passthrough3D11.hlsl       GS_Passthrough3D         gs_4_0   compiled\passthrough3d11gs.h         %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGBA3D     ps_4_0   compiled\passthroughrgba3d11ps.h     %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGBA3DUI   ps_4_0   compiled\passthroughrgba3dui11ps.h   %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGBA3DI    ps_4_0   compiled\passthroughrgba3di11ps.h    %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGB3D      ps_4_0   compiled\passthroughrgb3d11ps.h      %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGB3DUI    ps_4_0   compiled\passthroughrgb3dui11ps.h    %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRGB3DI     ps_4_0   compiled\passthroughrgb3di11ps.h     %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRG3D       ps_4_0   compiled\passthroughrg3d11ps.h       %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRG3DUI     ps_4_0   compiled\passthroughrg3dui11ps.h     %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughRG3DI      ps_4_0   compiled\passthroughrg3di11ps.h      %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughR3D        ps_4_0   compiled\passthroughr3d11ps.h        %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughR3DUI      ps_4_0   compiled\passthroughr3dui11ps.h      %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughR3DI       ps_4_0   compiled\passthroughr3di11ps.h       %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughLum3D      ps_4_0   compiled\passthroughlum3d11ps.h      %debug%
+call:BuildShader Passthrough3D11.hlsl       PS_PassthroughLumAlpha3D ps_4_0   compiled\passthroughlumalpha3d11ps.h %debug%
+
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3D_4444 ps_4_0 compiled\passthroughrgba3d_4444_11ps.h %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGB3D_565   ps_4_0 compiled\passthroughrgb3d_565_11ps.h   %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3D_5551 ps_4_0 compiled\passthroughrgba3d_5551_11ps.h %debug%
+
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGBA2DArray     ps_4_0   compiled\passthroughrgba2darray11ps.h     %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGBA2DArrayUI   ps_4_0   compiled\passthroughrgba2darrayui11ps.h   %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGBA2DArrayI    ps_4_0   compiled\passthroughrgba2darrayi11ps.h    %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGB2DArray      ps_4_0   compiled\passthroughrgb2darray11ps.h      %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGB2DArrayUI    ps_4_0   compiled\passthroughrgb2darrayui11ps.h    %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRGB2DArrayI     ps_4_0   compiled\passthroughrgb2darrayi11ps.h     %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRG2DArray       ps_4_0   compiled\passthroughrg2darray11ps.h       %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRG2DArrayUI     ps_4_0   compiled\passthroughrg2darrayui11ps.h     %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughRG2DArrayI      ps_4_0   compiled\passthroughrg2darrayi11ps.h      %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughR2DArray        ps_4_0   compiled\passthroughr2darray11ps.h        %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughR2DArrayUI      ps_4_0   compiled\passthroughr2darrayui11ps.h      %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughR2DArrayI       ps_4_0   compiled\passthroughr2darrayi11ps.h       %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughLum2DArray      ps_4_0   compiled\passthroughlum2darray11ps.h      %debug%
+call:BuildShader Passthrough2DArray11.hlsl       PS_PassthroughLumAlpha2DArray ps_4_0   compiled\passthroughlumalpha2darray11ps.h %debug%
+
+call:BuildShader Passthrough2DArray11.hlsl PS_PassthroughRGBA2DArray_4444 ps_4_0 compiled\passthroughrgba2darray_4444_11ps.h %debug%
+call:BuildShader Passthrough2DArray11.hlsl PS_PassthroughRGB2DArray_565   ps_4_0 compiled\passthroughrgb2darray_565_11ps.h   %debug%
+call:BuildShader Passthrough2DArray11.hlsl PS_PassthroughRGBA2DArray_5551 ps_4_0 compiled\passthroughrgba2darray_5551_11ps.h %debug%
+
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftof_um_rgb_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGBA_3D ps_4_0 compiled\multiplyalpha_ftou_pt_rgba_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftou_pm_rgba_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftou_um_rgba_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGB_3D  ps_4_0 compiled\multiplyalpha_ftou_pt_rgb_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftou_pm_rgb_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftou_um_rgb_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PT_RGBA_3D ps_4_0 compiled\multiplyalpha_ftoi_pt_rgba_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftoi_pm_rgba_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_UM_RGBA_3D ps_4_0 compiled\multiplyalpha_ftoi_um_rgba_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PT_RGB_3D  ps_4_0 compiled\multiplyalpha_ftoi_pt_rgb_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftoi_pm_rgb_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_UM_RGB_3D  ps_4_0 compiled\multiplyalpha_ftoi_um_rgb_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMA_3D ps_4_0 compiled\multiplyalpha_ftof_pm_luma_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMA_3D ps_4_0 compiled\multiplyalpha_ftof_um_luma_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMAALPHA_3D   ps_4_0 compiled\multiplyalpha_ftof_pm_lumaalpha_3d_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMAALPHA_3D   ps_4_0 compiled\multiplyalpha_ftof_um_lumaalpha_3d_ps.h  %debug%
+
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_4444_3D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_4444_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_4444_3D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_4444_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_565_3D   ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_565_3d_ps.h   %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_565_3D   ps_4_0 compiled\multiplyalpha_ftof_um_rgb_565_3d_ps.h   %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_5551_3D ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_5551_3d_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_5551_3D ps_4_0 compiled\multiplyalpha_ftof_um_rgba_5551_3d_ps.h %debug%
+
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftof_um_rgba_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftof_um_rgb_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftou_pt_rgba_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftou_pm_rgba_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftou_um_rgba_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PT_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftou_pt_rgb_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_PM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftou_pm_rgb_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoU_UM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftou_um_rgb_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PT_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftoi_pt_rgba_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftoi_pm_rgba_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_UM_RGBA_2DArray ps_4_0 compiled\multiplyalpha_ftoi_um_rgba_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PT_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftoi_pt_rgb_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_PM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftoi_pm_rgb_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoI_UM_RGB_2DArray  ps_4_0 compiled\multiplyalpha_ftoi_um_rgb_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMA_2DArray ps_4_0 compiled\multiplyalpha_ftof_pm_luma_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMA_2DArray ps_4_0 compiled\multiplyalpha_ftof_um_luma_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_LUMAALPHA_2DArray   ps_4_0 compiled\multiplyalpha_ftof_pm_lumaalpha_2darray_ps.h  %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_LUMAALPHA_2DArray   ps_4_0 compiled\multiplyalpha_ftof_um_lumaalpha_2darray_ps.h  %debug%
+
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_4444_2DArray ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_4444_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_4444_2DArray ps_4_0 compiled\multiplyalpha_ftof_um_rgba_4444_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGB_565_2DArray   ps_4_0 compiled\multiplyalpha_ftof_pm_rgb_565_2darray_ps.h   %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGB_565_2DArray   ps_4_0 compiled\multiplyalpha_ftof_um_rgb_565_2darray_ps.h   %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_PM_RGBA_5551_2DArray ps_4_0 compiled\multiplyalpha_ftof_pm_rgba_5551_2darray_ps.h %debug%
+call:BuildShader MultiplyAlpha.hlsl PS_FtoF_UM_RGBA_5551_2DArray ps_4_0 compiled\multiplyalpha_ftof_um_rgba_5551_2darray_ps.h %debug%
+
+call:BuildShader Swizzle11.hlsl             PS_SwizzleF2D            ps_4_0   compiled\swizzlef2dps.h              %debug%
+call:BuildShader Swizzle11.hlsl             PS_SwizzleI2D            ps_4_0   compiled\swizzlei2dps.h              %debug%
+call:BuildShader Swizzle11.hlsl             PS_SwizzleUI2D           ps_4_0   compiled\swizzleui2dps.h             %debug%
+
+call:BuildShader Swizzle11.hlsl             PS_SwizzleF3D            ps_4_0   compiled\swizzlef3dps.h              %debug%
+call:BuildShader Swizzle11.hlsl             PS_SwizzleI3D            ps_4_0   compiled\swizzlei3dps.h              %debug%
+call:BuildShader Swizzle11.hlsl             PS_SwizzleUI3D           ps_4_0   compiled\swizzleui3dps.h             %debug%
+
+call:BuildShader Swizzle11.hlsl             PS_SwizzleF2DArray       ps_4_0   compiled\swizzlef2darrayps.h         %debug%
+call:BuildShader Swizzle11.hlsl             PS_SwizzleI2DArray       ps_4_0   compiled\swizzlei2darrayps.h         %debug%
+call:BuildShader Swizzle11.hlsl             PS_SwizzleUI2DArray      ps_4_0   compiled\swizzleui2darrayps.h        %debug%
+
+call:BuildShader Clear11.hlsl               PS_ClearUint1            ps_4_0   compiled\clearuint11ps1.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearUint2            ps_4_0   compiled\clearuint11ps2.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearUint3            ps_4_0   compiled\clearuint11ps3.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearUint4            ps_4_0   compiled\clearuint11ps4.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearUint5            ps_4_0   compiled\clearuint11ps5.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearUint6            ps_4_0   compiled\clearuint11ps6.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearUint7            ps_4_0   compiled\clearuint11ps7.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearUint8            ps_4_0   compiled\clearuint11ps8.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearSint1            ps_4_0   compiled\clearsint11ps1.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearSint2            ps_4_0   compiled\clearsint11ps2.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearSint3            ps_4_0   compiled\clearsint11ps3.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearSint4            ps_4_0   compiled\clearsint11ps4.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearSint5            ps_4_0   compiled\clearsint11ps5.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearSint6            ps_4_0   compiled\clearsint11ps6.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearSint7            ps_4_0   compiled\clearsint11ps7.h            %debug%
+call:BuildShader Clear11.hlsl               PS_ClearSint8            ps_4_0   compiled\clearsint11ps8.h            %debug%
+
+call:BuildShader BufferToTexture11.hlsl     VS_BufferToTexture       vs_4_0   compiled/buffertotexture11_vs.h      %debug%
+call:BuildShader BufferToTexture11.hlsl     GS_BufferToTexture       gs_4_0   compiled/buffertotexture11_gs.h      %debug%
+call:BuildShader BufferToTexture11.hlsl     PS_BufferToTexture_4F    ps_4_0   compiled/buffertotexture11_ps_4f.h   %debug%
+call:BuildShader BufferToTexture11.hlsl     PS_BufferToTexture_4I    ps_4_0   compiled/buffertotexture11_ps_4i.h   %debug%
+call:BuildShader BufferToTexture11.hlsl     PS_BufferToTexture_4UI   ps_4_0   compiled/buffertotexture11_ps_4ui.h  %debug%
+
+call:BuildShader ResolveDepthStencil.hlsl   VS_ResolveDepthStencil   vs_4_1   compiled/resolvedepthstencil11_vs.h  %debug%
+call:BuildShader ResolveDepthStencil.hlsl   PS_ResolveDepth          ps_4_1   compiled/resolvedepth11_ps.h         %debug%
+call:BuildShader ResolveDepthStencil.hlsl   PS_ResolveDepthStencil   ps_4_1   compiled/resolvedepthstencil11_ps.h  %debug%
+call:BuildShader ResolveDepthStencil.hlsl   PS_ResolveStencil        ps_4_1   compiled/resolvestencil11_ps.h       %debug%
+
+echo.
+
+if %successCount% GTR 0 (
+   echo %successCount% shaders compiled successfully.
+)
+if %errorCount% GTR 0 (
+   echo There were %errorCount% shader compilation errors.
+)
+
+endlocal
+exit /b
+
+:BuildShader
+set input=%~1
+set entry=%~2
+set type=%~3
+set output=%~4
+set debug=%~5
+
+if %debug% == 0 (
+    set "buildCMD=fxc /nologo /E %entry% /T %type% /Fh %output% %input%"
+) else (
+    set "buildCMD=fxc /nologo /Zi /Od /E %entry% /T %type% /Fh %output% %input%"
+)
+
+set error=0
+%buildCMD% || set error=1
+
+if %error% == 0 (
+    set /a successCount=%successCount%+1
+) else (
+    set /a errorCount=%errorCount%+1
+)
+
+exit /b
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskpremultps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskpremultps.h
index e8e1d27..04868ae 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskpremultps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskpremultps.h
@@ -1,50 +1,50 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384

-//

-// Parameters:

-//

-//   float4 add;

-//   float4 mult;

-//   sampler2D tex;

-//

-//

-// Registers:

-//

-//   Name         Reg   Size

-//   ------------ ----- ----

-//   mult         c0       1

-//   add          c1       1

-//   tex          s0       1

-//

-

-    ps_2_0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mul r0.xyz, r0.w, r0

-    mov r1, c0

-    mad r0, r0, r1, c1

-    mov oC0, r0

-

-// approximately 5 instruction slots used (1 texture, 4 arithmetic)

-#endif

-

-const BYTE g_ps20_componentmaskpremultps[] = {

-    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,

-    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,

-    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,

-    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,

-    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,

-    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,

-    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,

-    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,

-    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,

-    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 5,   0,   0,   3,   0,   0,   7,   128, 0,   0,   255, 128, 0,   0,   228, 128, 1,   0,

-    0,   2,   1,   0,   15,  128, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,

-    0,   228, 128, 1,   0,   228, 128, 1,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,  128,

-    0,   0,   228, 128, 255, 255, 0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 add;
+//   float4 mult;
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   mult         c0       1
+//   add          c1       1
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mul r0.xyz, r0.w, r0
+    mov r1, c0
+    mad r0, r0, r1, c1
+    mov oC0, r0
+
+// approximately 5 instruction slots used (1 texture, 4 arithmetic)
+#endif
+
+const BYTE g_ps20_componentmaskpremultps[] = {
+    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,
+    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,
+    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,
+    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,
+    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,
+    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,
+    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,
+    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,
+    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,
+    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 5,   0,   0,   3,   0,   0,   7,   128, 0,   0,   255, 128, 0,   0,   228, 128, 1,   0,
+    0,   2,   1,   0,   15,  128, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,
+    0,   228, 128, 1,   0,   228, 128, 1,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,  128,
+    0,   0,   228, 128, 255, 255, 0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h
index b4af7da..06673ae 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h
@@ -1,48 +1,48 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384

-//

-// Parameters:

-//

-//   float4 add;

-//   float4 mult;

-//   sampler2D tex;

-//

-//

-// Registers:

-//

-//   Name         Reg   Size

-//   ------------ ----- ----

-//   mult         c0       1

-//   add          c1       1

-//   tex          s0       1

-//

-

-    ps_2_0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mov r1, c0

-    mad r0, r0, r1, c1

-    mov oC0, r0

-

-// approximately 4 instruction slots used (1 texture, 3 arithmetic)

-#endif

-

-const BYTE g_ps20_componentmaskps[] = {

-    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,

-    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,

-    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,

-    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,

-    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,

-    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,

-    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,

-    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,

-    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,

-    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 1,   0,   0,   2,   1,   0,   15,  128, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,

-    15,  128, 0,   0,   228, 128, 1,   0,   228, 128, 1,   0,   228, 160, 1,   0,   0,   2,   0,

-    8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 add;
+//   float4 mult;
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   mult         c0       1
+//   add          c1       1
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov r1, c0
+    mad r0, r0, r1, c1
+    mov oC0, r0
+
+// approximately 4 instruction slots used (1 texture, 3 arithmetic)
+#endif
+
+const BYTE g_ps20_componentmaskps[] = {
+    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,
+    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,
+    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,
+    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,
+    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,
+    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,
+    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,
+    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,
+    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,
+    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 1,   0,   0,   2,   1,   0,   15,  128, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,
+    15,  128, 0,   0,   228, 128, 1,   0,   228, 128, 1,   0,   228, 160, 1,   0,   0,   2,   0,
+    8,   15,  128, 0,   0,   228, 128, 255, 255, 0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskunmultps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskunmultps.h
index a384fa2..ad15364 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskunmultps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskunmultps.h
@@ -1,54 +1,54 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384

-//

-// Parameters:

-//

-//   float4 add;

-//   float4 mult;

-//   sampler2D tex;

-//

-//

-// Registers:

-//

-//   Name         Reg   Size

-//   ------------ ----- ----

-//   mult         c0       1

-//   add          c1       1

-//   tex          s0       1

-//

-

-    ps_2_0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    rcp r1.w, r0.w

-    mul r1.xyz, r0, r1.w

-    cmp r0.xyz, -r0.w, r0, r1

-    mov r1, c0

-    mad r0, r0, r1, c1

-    mov oC0, r0

-

-// approximately 7 instruction slots used (1 texture, 6 arithmetic)

-#endif

-

-const BYTE g_ps20_componentmaskunmultps[] = {

-    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,

-    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,

-    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,

-    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,

-    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,

-    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,

-    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,

-    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,

-    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,

-    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 6,   0,   0,   2,   1,   0,   8,   128, 0,   0,   255, 128, 5,   0,   0,   3,   1,   0,

-    7,   128, 0,   0,   228, 128, 1,   0,   255, 128, 88,  0,   0,   4,   0,   0,   7,   128, 0,

-    0,   255, 129, 0,   0,   228, 128, 1,   0,   228, 128, 1,   0,   0,   2,   1,   0,   15,  128,

-    0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228, 128, 1,   0,   228,

-    128, 1,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255,

-    0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 add;
+//   float4 mult;
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   mult         c0       1
+//   add          c1       1
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    rcp r1.w, r0.w
+    mul r1.xyz, r0, r1.w
+    cmp r0.xyz, -r0.w, r0, r1
+    mov r1, c0
+    mad r0, r0, r1, c1
+    mov oC0, r0
+
+// approximately 7 instruction slots used (1 texture, 6 arithmetic)
+#endif
+
+const BYTE g_ps20_componentmaskunmultps[] = {
+    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,
+    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,
+    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,
+    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,
+    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,
+    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,
+    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,
+    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,
+    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,
+    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 6,   0,   0,   2,   1,   0,   8,   128, 0,   0,   255, 128, 5,   0,   0,   3,   1,   0,
+    7,   128, 0,   0,   228, 128, 1,   0,   255, 128, 88,  0,   0,   4,   0,   0,   7,   128, 0,
+    0,   255, 129, 0,   0,   228, 128, 1,   0,   228, 128, 1,   0,   0,   2,   1,   0,   15,  128,
+    0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228, 128, 1,   0,   228,
+    128, 1,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255,
+    0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminancepremultps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminancepremultps.h
index d2c71aa..274a782 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminancepremultps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminancepremultps.h
@@ -1,50 +1,50 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384

-//

-// Parameters:

-//

-//   float4 add;

-//   float4 mult;

-//   sampler2D tex;

-//

-//

-// Registers:

-//

-//   Name         Reg   Size

-//   ------------ ----- ----

-//   mult         c0       1

-//   add          c1       1

-//   tex          s0       1

-//

-

-    ps_2_0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mul r0.xyz, r0.w, r0.x

-    mov r1, c0

-    mad r0, r0, r1, c1

-    mov oC0, r0

-

-// approximately 5 instruction slots used (1 texture, 4 arithmetic)

-#endif

-

-const BYTE g_ps20_luminancepremultps[] = {

-    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,

-    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,

-    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,

-    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,

-    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,

-    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,

-    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,

-    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,

-    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,

-    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 5,   0,   0,   3,   0,   0,   7,   128, 0,   0,   255, 128, 0,   0,   0,   128, 1,   0,

-    0,   2,   1,   0,   15,  128, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,

-    0,   228, 128, 1,   0,   228, 128, 1,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,  128,

-    0,   0,   228, 128, 255, 255, 0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 add;
+//   float4 mult;
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   mult         c0       1
+//   add          c1       1
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mul r0.xyz, r0.w, r0.x
+    mov r1, c0
+    mad r0, r0, r1, c1
+    mov oC0, r0
+
+// approximately 5 instruction slots used (1 texture, 4 arithmetic)
+#endif
+
+const BYTE g_ps20_luminancepremultps[] = {
+    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,
+    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,
+    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,
+    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,
+    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,
+    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,
+    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,
+    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,
+    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,
+    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 5,   0,   0,   3,   0,   0,   7,   128, 0,   0,   255, 128, 0,   0,   0,   128, 1,   0,
+    0,   2,   1,   0,   15,  128, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,
+    0,   228, 128, 1,   0,   228, 128, 1,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,  128,
+    0,   0,   228, 128, 255, 255, 0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h
index 0fe3d85..0be665c 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h
@@ -1,53 +1,53 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384

-//

-// Parameters:

-//

-//   float4 add;

-//   float4 mult;

-//   sampler2D tex;

-//

-//

-// Registers:

-//

-//   Name         Reg   Size

-//   ------------ ----- ----

-//   mult         c0       1

-//   add          c1       1

-//   tex          s0       1

-//

-

-    ps_2_0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mov r1.xw, c0

-    mad r0.x, r0.x, r1.x, c1.x

-    mad r0.y, r0.w, r1.w, c1.w

-    mov r1.xyz, r0.x

-    mov r1.w, r0.y

-    mov oC0, r1

-

-// approximately 7 instruction slots used (1 texture, 6 arithmetic)

-#endif

-

-const BYTE g_ps20_luminanceps[] = {

-    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,

-    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,

-    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,

-    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,

-    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,

-    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,

-    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,

-    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,

-    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,

-    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 1,   0,   0,   2,   1,   0,   9,   128, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,

-    1,   128, 0,   0,   0,   128, 1,   0,   0,   128, 1,   0,   0,   160, 4,   0,   0,   4,   0,

-    0,   2,   128, 0,   0,   255, 128, 1,   0,   255, 128, 1,   0,   255, 160, 1,   0,   0,   2,

-    1,   0,   7,   128, 0,   0,   0,   128, 1,   0,   0,   2,   1,   0,   8,   128, 0,   0,   85,

-    128, 1,   0,   0,   2,   0,   8,   15,  128, 1,   0,   228, 128, 255, 255, 0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 add;
+//   float4 mult;
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   mult         c0       1
+//   add          c1       1
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov r1.xw, c0
+    mad r0.x, r0.x, r1.x, c1.x
+    mad r0.y, r0.w, r1.w, c1.w
+    mov r1.xyz, r0.x
+    mov r1.w, r0.y
+    mov oC0, r1
+
+// approximately 7 instruction slots used (1 texture, 6 arithmetic)
+#endif
+
+const BYTE g_ps20_luminanceps[] = {
+    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,
+    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,
+    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,
+    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,
+    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,
+    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,
+    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,
+    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,
+    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,
+    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 1,   0,   0,   2,   1,   0,   9,   128, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,
+    1,   128, 0,   0,   0,   128, 1,   0,   0,   128, 1,   0,   0,   160, 4,   0,   0,   4,   0,
+    0,   2,   128, 0,   0,   255, 128, 1,   0,   255, 128, 1,   0,   255, 160, 1,   0,   0,   2,
+    1,   0,   7,   128, 0,   0,   0,   128, 1,   0,   0,   2,   1,   0,   8,   128, 0,   0,   85,
+    128, 1,   0,   0,   2,   0,   8,   15,  128, 1,   0,   228, 128, 255, 255, 0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceunmultps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceunmultps.h
index 07069ea..1100d0b 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceunmultps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceunmultps.h
@@ -1,54 +1,54 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384

-//

-// Parameters:

-//

-//   float4 add;

-//   float4 mult;

-//   sampler2D tex;

-//

-//

-// Registers:

-//

-//   Name         Reg   Size

-//   ------------ ----- ----

-//   mult         c0       1

-//   add          c1       1

-//   tex          s0       1

-//

-

-    ps_2_0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    rcp r1.w, r0.w

-    mul r1.x, r0.x, r1.w

-    cmp r0.xyz, -r0.w, r0.x, r1.x

-    mov r1, c0

-    mad r0, r0, r1, c1

-    mov oC0, r0

-

-// approximately 7 instruction slots used (1 texture, 6 arithmetic)

-#endif

-

-const BYTE g_ps20_luminanceunmultps[] = {

-    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,

-    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,

-    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,

-    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,

-    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,

-    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,

-    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,

-    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,

-    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,

-    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,

-    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,

-    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,

-    160, 6,   0,   0,   2,   1,   0,   8,   128, 0,   0,   255, 128, 5,   0,   0,   3,   1,   0,

-    1,   128, 0,   0,   0,   128, 1,   0,   255, 128, 88,  0,   0,   4,   0,   0,   7,   128, 0,

-    0,   255, 129, 0,   0,   0,   128, 1,   0,   0,   128, 1,   0,   0,   2,   1,   0,   15,  128,

-    0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228, 128, 1,   0,   228,

-    128, 1,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255,

-    0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 add;
+//   float4 mult;
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   mult         c0       1
+//   add          c1       1
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    rcp r1.w, r0.w
+    mul r1.x, r0.x, r1.w
+    cmp r0.xyz, -r0.w, r0.x, r1.x
+    mov r1, c0
+    mad r0, r0, r1, c1
+    mov oC0, r0
+
+// approximately 7 instruction slots used (1 texture, 6 arithmetic)
+#endif
+
+const BYTE g_ps20_luminanceunmultps[] = {
+    0,   2,   255, 255, 254, 255, 50,  0,   67,  84,  65,  66,  28,  0,   0,   0,   143, 0,   0,
+    0,   0,   2,   255, 255, 3,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   136, 0,
+    0,   0,   88,  0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   92,  0,   0,   0,   0,
+    0,   0,   0,   108, 0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   92,  0,   0,   0,
+    0,   0,   0,   0,   113, 0,   0,   0,   3,   0,   0,   0,   1,   0,   0,   0,   120, 0,   0,
+    0,   0,   0,   0,   0,   97,  100, 100, 0,   1,   0,   3,   0,   1,   0,   4,   0,   1,   0,
+    0,   0,   0,   0,   0,   0,   109, 117, 108, 116, 0,   116, 101, 120, 0,   171, 171, 171, 4,
+    0,   12,  0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,
+    95,  48,  0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,
+    83,  76,  32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,
+    54,  46,  51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,   144,
+    0,   8,   15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,   8,   228,
+    160, 6,   0,   0,   2,   1,   0,   8,   128, 0,   0,   255, 128, 5,   0,   0,   3,   1,   0,
+    1,   128, 0,   0,   0,   128, 1,   0,   255, 128, 88,  0,   0,   4,   0,   0,   7,   128, 0,
+    0,   255, 129, 0,   0,   0,   128, 1,   0,   0,   128, 1,   0,   0,   2,   1,   0,   15,  128,
+    0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228, 128, 1,   0,   228,
+    128, 1,   0,   228, 160, 1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255,
+    0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h
index a74e14e..0c17739 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h
@@ -1,37 +1,37 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384

-//

-// Parameters:

-//

-//   sampler2D tex;

-//

-//

-// Registers:

-//

-//   Name         Reg   Size

-//   ------------ ----- ----

-//   tex          s0       1

-//

-

-    ps_2_0

-    dcl t0.xy

-    dcl_2d s0

-    texld r0, t0, s0

-    mov oC0, r0

-

-// approximately 2 instruction slots used (1 texture, 1 arithmetic)

-#endif

-

-const BYTE g_ps20_passthroughps[] = {

-    0,   2,   255, 255, 254, 255, 33,  0,   67,  84,  65,  66,  28,  0,   0,  0,   75,  0,

-    0,   0,   0,   2,   255, 255, 1,   0,   0,   0,   28,  0,   0,   0,   0,  1,   0,   0,

-    68,  0,   0,   0,   48,  0,   0,   0,   3,   0,   0,   0,   1,   0,   0,  0,   52,  0,

-    0,   0,   0,   0,   0,   0,   116, 101, 120, 0,   4,   0,   12,  0,   1,  0,   1,   0,

-    1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,  95,  48,  0,  77,  105, 99,

-    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,

-    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  54, 46,  51,  46,

-    57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31, 0,   0,   2,

-    0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,  144, 0,   8,

-    15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,  8,   228, 160,

-    1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,  0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov oC0, r0
+
+// approximately 2 instruction slots used (1 texture, 1 arithmetic)
+#endif
+
+const BYTE g_ps20_passthroughps[] = {
+    0,   2,   255, 255, 254, 255, 33,  0,   67,  84,  65,  66,  28,  0,   0,  0,   75,  0,
+    0,   0,   0,   2,   255, 255, 1,   0,   0,   0,   28,  0,   0,   0,   0,  1,   0,   0,
+    68,  0,   0,   0,   48,  0,   0,   0,   3,   0,   0,   0,   1,   0,   0,  0,   52,  0,
+    0,   0,   0,   0,   0,   0,   116, 101, 120, 0,   4,   0,   12,  0,   1,  0,   1,   0,
+    1,   0,   0,   0,   0,   0,   0,   0,   112, 115, 95,  50,  95,  48,  0,  77,  105, 99,
+    114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76, 32,  83,  104,
+    97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  54, 46,  51,  46,
+    57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   171, 171, 171, 31, 0,   0,   2,
+    0,   0,   0,   128, 0,   0,   3,   176, 31,  0,   0,   2,   0,   0,   0,  144, 0,   8,
+    15,  160, 66,  0,   0,   3,   0,   0,   15,  128, 0,   0,   228, 176, 0,  8,   228, 160,
+    1,   0,   0,   2,   0,   8,   15,  128, 0,   0,   228, 128, 255, 255, 0,  0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h
index 350b2eb..e4d7e0e 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h
@@ -1,46 +1,46 @@
-#if 0

-//

-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384

-//

-// Parameters:

-//

-//   float4 halfPixelSize;

-//   float4 texcoordOffset;

-//

-//

-// Registers:

-//

-//   Name           Reg   Size

-//   -------------- ----- ----

-//   halfPixelSize  c0       1

-//   texcoordOffset c1       1

-//

-

-    vs_2_0

-    def c2, 0.5, -0.5, 1, 0

-    dcl_position v0

-    add oPos, v0, c0

-    mad r0, v0, c2.xyzz, c2.xxww

-    mov oT0.zw, r0

-    mad oT0.xy, r0, c1.zwzw, c1

-

-// approximately 4 instruction slots used

-#endif

-

-const BYTE g_vs20_standardvs[] = {

-    0,   2,   254, 255, 254, 255, 44,  0,   67,  84,  65,  66,  28,  0,   0,   0,   122, 0,   0,

-    0,   0,   2,   254, 255, 2,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   115, 0,

-    0,   0,   68,  0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   0,

-    0,   0,   0,   100, 0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   84,  0,   0,   0,

-    0,   0,   0,   0,   104, 97,  108, 102, 80,  105, 120, 101, 108, 83,  105, 122, 101, 0,   171,

-    171, 1,   0,   3,   0,   1,   0,   4,   0,   1,   0,   0,   0,   0,   0,   0,   0,   116, 101,

-    120, 99,  111, 111, 114, 100, 79,  102, 102, 115, 101, 116, 0,   118, 115, 95,  50,  95,  48,

-    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,

-    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  54,  46,

-    51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   81,  0,   0,   5,   2,   0,

-    15,  160, 0,   0,   0,   63,  0,   0,   0,   191, 0,   0,   128, 63,  0,   0,   0,   0,   31,

-    0,   0,   2,   0,   0,   0,   128, 0,   0,   15,  144, 2,   0,   0,   3,   0,   0,   15,  192,

-    0,   0,   228, 144, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228,

-    144, 2,   0,   164, 160, 2,   0,   240, 160, 1,   0,   0,   2,   0,   0,   12,  224, 0,   0,

-    228, 128, 4,   0,   0,   4,   0,   0,   3,   224, 0,   0,   228, 128, 1,   0,   238, 160, 1,

-    0,   228, 160, 255, 255, 0,   0};

+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 halfPixelSize;
+//   float4 texcoordOffset;
+//
+//
+// Registers:
+//
+//   Name           Reg   Size
+//   -------------- ----- ----
+//   halfPixelSize  c0       1
+//   texcoordOffset c1       1
+//
+
+    vs_2_0
+    def c2, 0.5, -0.5, 1, 0
+    dcl_position v0
+    add oPos, v0, c0
+    mad r0, v0, c2.xyzz, c2.xxww
+    mov oT0.zw, r0
+    mad oT0.xy, r0, c1.zwzw, c1
+
+// approximately 4 instruction slots used
+#endif
+
+const BYTE g_vs20_standardvs[] = {
+    0,   2,   254, 255, 254, 255, 44,  0,   67,  84,  65,  66,  28,  0,   0,   0,   122, 0,   0,
+    0,   0,   2,   254, 255, 2,   0,   0,   0,   28,  0,   0,   0,   0,   1,   0,   0,   115, 0,
+    0,   0,   68,  0,   0,   0,   2,   0,   0,   0,   1,   0,   0,   0,   84,  0,   0,   0,   0,
+    0,   0,   0,   100, 0,   0,   0,   2,   0,   1,   0,   1,   0,   0,   0,   84,  0,   0,   0,
+    0,   0,   0,   0,   104, 97,  108, 102, 80,  105, 120, 101, 108, 83,  105, 122, 101, 0,   171,
+    171, 1,   0,   3,   0,   1,   0,   4,   0,   1,   0,   0,   0,   0,   0,   0,   0,   116, 101,
+    120, 99,  111, 111, 114, 100, 79,  102, 102, 115, 101, 116, 0,   118, 115, 95,  50,  95,  48,
+    0,   77,  105, 99,  114, 111, 115, 111, 102, 116, 32,  40,  82,  41,  32,  72,  76,  83,  76,
+    32,  83,  104, 97,  100, 101, 114, 32,  67,  111, 109, 112, 105, 108, 101, 114, 32,  54,  46,
+    51,  46,  57,  54,  48,  48,  46,  49,  54,  51,  56,  52,  0,   81,  0,   0,   5,   2,   0,
+    15,  160, 0,   0,   0,   63,  0,   0,   0,   191, 0,   0,   128, 63,  0,   0,   0,   0,   31,
+    0,   0,   2,   0,   0,   0,   128, 0,   0,   15,  144, 2,   0,   0,   3,   0,   0,   15,  192,
+    0,   0,   228, 144, 0,   0,   228, 160, 4,   0,   0,   4,   0,   0,   15,  128, 0,   0,   228,
+    144, 2,   0,   164, 160, 2,   0,   240, 160, 1,   0,   0,   2,   0,   0,   12,  224, 0,   0,
+    228, 128, 4,   0,   0,   4,   0,   0,   3,   224, 0,   0,   228, 128, 1,   0,   238, 160, 1,
+    0,   228, 160, 255, 255, 0,   0};
diff --git a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/generate_shaders.bat b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/generate_shaders.bat
index 310cb82..5c701ff 100644
--- a/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/generate_shaders.bat
+++ b/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/generate_shaders.bat
@@ -1,66 +1,66 @@
-@ECHO OFF

-REM

-REM Copyright 2013 The ANGLE Project Authors. All rights reserved.

-REM Use of this source code is governed by a BSD-style license that can be

-REM found in the LICENSE file.

-REM

-

-PATH %PATH%;%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86;%DXSDK_DIR%\Utilities\bin\x86

-

-setlocal

-set errorCount=0

-set successCount=0

-set debug=0

-

-if "%1" == "debug" (

-    set debug=1

-)

-if "%1" == "release" (

-    set debug=0

-)

-

-::              | Input file          | Entry point           | Type | Output file                        | Debug |

-call:BuildShader Blit.vs               standardvs              vs_2_0 compiled\standardvs.h                %debug%

-call:BuildShader Blit.ps               passthroughps           ps_2_0 compiled\passthroughps.h             %debug%

-call:BuildShader Blit.ps               luminanceps             ps_2_0 compiled\luminanceps.h               %debug%

-call:BuildShader Blit.ps               luminancepremultps      ps_2_0 compiled\luminancepremultps.h        %debug%

-call:BuildShader Blit.ps               luminanceunmultps       ps_2_0 compiled\luminanceunmultps.h         %debug%

-call:BuildShader Blit.ps               componentmaskps         ps_2_0 compiled\componentmaskps.h           %debug%

-call:BuildShader Blit.ps               componentmaskpremultps  ps_2_0 compiled\componentmaskpremultps.h    %debug%

-call:BuildShader Blit.ps               componentmaskunmultps   ps_2_0 compiled\componentmaskunmultps.h     %debug%

-

-echo.

-

-if %successCount% GTR 0 (

-   echo %successCount% shaders compiled successfully.

-)

-if %errorCount% GTR 0 (

-   echo There were %errorCount% shader compilation errors.

-)

-

-endlocal

-exit /b

-

-:BuildShader

-set input=%~1

-set entry=%~2

-set type=%~3

-set output=%~4

-set debug=%~5

-

-if %debug% == 0 (

-    set "buildCMD=fxc /nologo /E %entry% /T %type% /Fh %output% %input%"

-) else (

-    set "buildCMD=fxc /nologo /Zi /Od /E %entry% /T %type% /Fh %output% %input%"

-)

-

-set error=0

-%buildCMD% || set error=1

-

-if %error% == 0 (

-    set /a successCount=%successCount%+1

-) else (

-    set /a errorCount=%errorCount%+1

-)

-

-exit /b

+@ECHO OFF
+REM
+REM Copyright 2013 The ANGLE Project Authors. All rights reserved.
+REM Use of this source code is governed by a BSD-style license that can be
+REM found in the LICENSE file.
+REM
+
+PATH %PATH%;%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86;%DXSDK_DIR%\Utilities\bin\x86
+
+setlocal
+set errorCount=0
+set successCount=0
+set debug=0
+
+if "%1" == "debug" (
+    set debug=1
+)
+if "%1" == "release" (
+    set debug=0
+)
+
+::              | Input file          | Entry point           | Type | Output file                        | Debug |
+call:BuildShader Blit.vs               standardvs              vs_2_0 compiled\standardvs.h                %debug%
+call:BuildShader Blit.ps               passthroughps           ps_2_0 compiled\passthroughps.h             %debug%
+call:BuildShader Blit.ps               luminanceps             ps_2_0 compiled\luminanceps.h               %debug%
+call:BuildShader Blit.ps               luminancepremultps      ps_2_0 compiled\luminancepremultps.h        %debug%
+call:BuildShader Blit.ps               luminanceunmultps       ps_2_0 compiled\luminanceunmultps.h         %debug%
+call:BuildShader Blit.ps               componentmaskps         ps_2_0 compiled\componentmaskps.h           %debug%
+call:BuildShader Blit.ps               componentmaskpremultps  ps_2_0 compiled\componentmaskpremultps.h    %debug%
+call:BuildShader Blit.ps               componentmaskunmultps   ps_2_0 compiled\componentmaskunmultps.h     %debug%
+
+echo.
+
+if %successCount% GTR 0 (
+   echo %successCount% shaders compiled successfully.
+)
+if %errorCount% GTR 0 (
+   echo There were %errorCount% shader compilation errors.
+)
+
+endlocal
+exit /b
+
+:BuildShader
+set input=%~1
+set entry=%~2
+set type=%~3
+set output=%~4
+set debug=%~5
+
+if %debug% == 0 (
+    set "buildCMD=fxc /nologo /E %entry% /T %type% /Fh %output% %input%"
+) else (
+    set "buildCMD=fxc /nologo /Zi /Od /E %entry% /T %type% /Fh %output% %input%"
+)
+
+set error=0
+%buildCMD% || set error=1
+
+if %error% == 0 (
+    set /a successCount=%successCount%+1
+) else (
+    set /a errorCount=%errorCount%+1
+)
+
+exit /b
diff --git a/third_party/angle/src/libEGL.gypi b/third_party/angle/src/libEGL.gypi
deleted file mode 100644
index 19105e7..0000000
--- a/third_party/angle/src/libEGL.gypi
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-    # Everything below this is duplicated in the GN build. If you change
-    # anything also change angle/BUILD.gn
-    'targets':
-    [
-        {
-            'target_name': 'libEGL',
-            'type': '<(angle_gl_library_type)',
-            'dependencies':
-            [
-                'libGLESv2',
-            ],
-            'includes':
-            [
-                '../gyp/common_defines.gypi',
-            ],
-            'include_dirs':
-            [
-                '.',
-                '../include',
-                '../src/common/third_party/base',
-            ],
-            'sources':
-            [
-                '<@(libegl_sources)',
-            ],
-            'conditions':
-            [
-                ['angle_build_winrt==1',
-                {
-                    'msvs_requires_importlibrary' : 'true',
-                }],
-                ['target_os=="win"', {
-                    'defines':
-                    [
-                        'EGLAPI=',
-                    ],
-                }, {
-                    'defines':
-                    [
-                        'EGLAPI=__attribute__((visibility("default")))',
-                    ],
-                }],
-                ['OS == "mac"',
-                {
-                    'xcode_settings':
-                    {
-                        'DYLIB_INSTALL_NAME_BASE': '@rpath',
-                    },
-                }],
-            ],
-        },
-
-        {
-            'target_name': 'libEGL_static',
-            'type': 'static_library',
-            'dependencies':
-            [
-                'libGLESv2_static',
-            ],
-            'includes':
-            [
-                '../gyp/common_defines.gypi',
-            ],
-            'include_dirs':
-            [
-                '.',
-                '../include',
-                '../src/common/third_party/base',
-            ],
-            'sources':
-            [
-                '<@(libegl_sources)',
-            ],
-            'defines':
-            [
-                'EGLAPI=',
-            ],
-            'direct_dependent_settings':
-            {
-                'defines':
-                [
-                    'EGLAPI=',
-                ],
-            },
-        },
-    ],
-}
diff --git a/third_party/angle/src/libEGL/libEGL.rc b/third_party/angle/src/libEGL/libEGL.rc
index acffcef..52d9267 100644
--- a/third_party/angle/src/libEGL/libEGL.rc
+++ b/third_party/angle/src/libEGL/libEGL.rc
@@ -1,103 +1,103 @@
-// Microsoft Visual C++ generated resource script.

-//

-#include "resource.h"

-

-#define APSTUDIO_READONLY_SYMBOLS

-/////////////////////////////////////////////////////////////////////////////

-//

-// Generated from the TEXTINCLUDE 2 resource.

-//

-#include <windows.h>

-#include "../common/version.h"

-

-/////////////////////////////////////////////////////////////////////////////

-#undef APSTUDIO_READONLY_SYMBOLS

-

-/////////////////////////////////////////////////////////////////////////////

-// English (U.S.) resources

-

-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

-#ifdef _WIN32

-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

-#pragma code_page(1252)

-#endif //_WIN32

-

-#ifdef APSTUDIO_INVOKED

-/////////////////////////////////////////////////////////////////////////////

-//

-// TEXTINCLUDE

-//

-

-1 TEXTINCLUDE 

-BEGIN

-    "resource.h\0"

-END

-

-2 TEXTINCLUDE 

-BEGIN

-    "#include ""afxres.h""\r\n"

-    "#include ""../common/version.h""\0"

-END

-

-3 TEXTINCLUDE 

-BEGIN

-    "\r\n"

-    "\0"

-END

-

-#endif    // APSTUDIO_INVOKED

-

-

-/////////////////////////////////////////////////////////////////////////////

-//

-// Version

-//

-

-VS_VERSION_INFO VERSIONINFO

- FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0

- PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0

- FILEFLAGSMASK 0x17L

-#ifdef _DEBUG

- FILEFLAGS 0x1L

-#else

- FILEFLAGS 0x0L

-#endif

- FILEOS 0x4L

- FILETYPE 0x2L

- FILESUBTYPE 0x0L

-BEGIN

-    BLOCK "StringFileInfo"

-    BEGIN

-        BLOCK "040904b0"

-        BEGIN

-            VALUE "FileDescription", "ANGLE libEGL Dynamic Link Library"

-            VALUE "FileVersion", ANGLE_VERSION_STRING

-            VALUE "InternalName", "libEGL"

-            VALUE "LegalCopyright", "Copyright (C) 2015 Google Inc."

-            VALUE "OriginalFilename", "libEGL.dll"

-            VALUE "PrivateBuild", ANGLE_VERSION_STRING

-            VALUE "ProductName", "ANGLE libEGL Dynamic Link Library"

-            VALUE "ProductVersion", ANGLE_VERSION_STRING

-            VALUE "Comments", "Build Date: " ANGLE_COMMIT_DATE

-        END

-    END

-    BLOCK "VarFileInfo"

-    BEGIN

-        VALUE "Translation", 0x409, 1200

-    END

-END

-

-#endif    // English (U.S.) resources

-/////////////////////////////////////////////////////////////////////////////

-

-

-

-#ifndef APSTUDIO_INVOKED

-/////////////////////////////////////////////////////////////////////////////

-//

-// Generated from the TEXTINCLUDE 3 resource.

-//

-

-

-/////////////////////////////////////////////////////////////////////////////

-#endif    // not APSTUDIO_INVOKED

+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+#include "../common/version.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "#include ""../common/version.h""\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "FileDescription", "ANGLE libEGL Dynamic Link Library"
+            VALUE "FileVersion", ANGLE_VERSION_STRING
+            VALUE "InternalName", "libEGL"
+            VALUE "LegalCopyright", "Copyright (C) 2015 Google Inc."
+            VALUE "OriginalFilename", "libEGL.dll"
+            VALUE "PrivateBuild", ANGLE_VERSION_STRING
+            VALUE "ProductName", "ANGLE libEGL Dynamic Link Library"
+            VALUE "ProductVersion", ANGLE_VERSION_STRING
+            VALUE "Comments", "Build Date: " ANGLE_COMMIT_DATE
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
diff --git a/third_party/angle/src/libGL/libGL.rc b/third_party/angle/src/libGL/libGL.rc
index ef637d1..a7eb1d8 100644
--- a/third_party/angle/src/libGL/libGL.rc
+++ b/third_party/angle/src/libGL/libGL.rc
@@ -1,137 +1,137 @@
-// Microsoft Visual C++ generated resource script.

-//

-#include "../libGLESv2/resource.h"

-

-#define APSTUDIO_READONLY_SYMBOLS

-/////////////////////////////////////////////////////////////////////////////

-//

-// Generated from the TEXTINCLUDE 2 resource.

-//

-#include <windows.h>

-#include "../common/version.h"

-

-/////////////////////////////////////////////////////////////////////////////

-#undef APSTUDIO_READONLY_SYMBOLS

-

-/////////////////////////////////////////////////////////////////////////////

-// English (U.S.) resources

-

-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

-#ifdef _WIN32

-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

-#pragma code_page(1252)

-#endif //_WIN32

-

-#ifdef APSTUDIO_INVOKED

-/////////////////////////////////////////////////////////////////////////////

-//

-// TEXTINCLUDE

-//

-

-1 TEXTINCLUDE 

-BEGIN

-    "resource.h\0"

-END

-

-2 TEXTINCLUDE 

-BEGIN

-    "#include ""afxres.h""\r\n"

-    "#include ""../common/version.h""\0"

-END

-

-3 TEXTINCLUDE 

-BEGIN

-    "\r\n"

-    "\0"

-END

-

-#endif    // APSTUDIO_INVOKED

-

-

-/////////////////////////////////////////////////////////////////////////////

-//

-// Version

-//

-

-VS_VERSION_INFO VERSIONINFO

- FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0

- PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0

- FILEFLAGSMASK 0x17L

-#ifdef _DEBUG

- FILEFLAGS 0x1L

-#else

- FILEFLAGS 0x0L

-#endif

- FILEOS 0x4L

- FILETYPE 0x2L

- FILESUBTYPE 0x0L

-BEGIN

-    BLOCK "StringFileInfo"

-    BEGIN

-        BLOCK "040904b0"

-        BEGIN

-            VALUE "FileDescription", "ANGLE OpenGL32 Dynamic Link Library"

-            VALUE "FileVersion", ANGLE_VERSION_STRING

-            VALUE "InternalName", "libGL"

-            VALUE "LegalCopyright", "Copyright (C) 2019 Google Inc."

-            VALUE "OriginalFilename", "openGL32.dll"

-            VALUE "PrivateBuild", ANGLE_VERSION_STRING

-            VALUE "ProductName", "ANGLE OpenGL32 Dynamic Link Library"

-            VALUE "ProductVersion", ANGLE_VERSION_STRING

-            VALUE "Comments", "Build Date: " ANGLE_COMMIT_DATE

-        END

-    END

-    BLOCK "VarFileInfo"

-    BEGIN

-        VALUE "Translation", 0x409, 1200

-    END

-END

-

-

-/////////////////////////////////////////////////////////////////////////////

-//

-// Dialog

-//

-

-IDD_DIALOG1 DIALOGEX 0, 0, 129, 47

-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU

-CAPTION "Waiting for debugger"

-FONT 8, "MS Shell Dlg", 400, 0, 0x1

-BEGIN

-PUSHBUTTON      "Cancel",IDCANCEL,72,26,50,14

-LTEXT           "Attach a debugger or ESC to cancel",IDC_STATIC,7,7,115,8

-END

-

-

-/////////////////////////////////////////////////////////////////////////////

-//

-// DESIGNINFO

-//

-

-#ifdef APSTUDIO_INVOKED

-GUIDELINES DESIGNINFO

-BEGIN

-IDD_DIALOG1, DIALOG

-BEGIN

-LEFTMARGIN, 7

-RIGHTMARGIN, 122

-TOPMARGIN, 7

-BOTTOMMARGIN, 40

-END

-END

-#endif    // APSTUDIO_INVOKED

-

-#endif    // English (U.S.) resources

-/////////////////////////////////////////////////////////////////////////////

-

-

-

-#ifndef APSTUDIO_INVOKED

-/////////////////////////////////////////////////////////////////////////////

-//

-// Generated from the TEXTINCLUDE 3 resource.

-//

-

-

-/////////////////////////////////////////////////////////////////////////////

-#endif    // not APSTUDIO_INVOKED

+// Microsoft Visual C++ generated resource script.
+//
+#include "../libGLESv2/resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+#include "../common/version.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "#include ""../common/version.h""\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "FileDescription", "ANGLE OpenGL32 Dynamic Link Library"
+            VALUE "FileVersion", ANGLE_VERSION_STRING
+            VALUE "InternalName", "libGL"
+            VALUE "LegalCopyright", "Copyright (C) 2019 Google Inc."
+            VALUE "OriginalFilename", "openGL32.dll"
+            VALUE "PrivateBuild", ANGLE_VERSION_STRING
+            VALUE "ProductName", "ANGLE OpenGL32 Dynamic Link Library"
+            VALUE "ProductVersion", ANGLE_VERSION_STRING
+            VALUE "Comments", "Build Date: " ANGLE_COMMIT_DATE
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_DIALOG1 DIALOGEX 0, 0, 129, 47
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Waiting for debugger"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+PUSHBUTTON      "Cancel",IDCANCEL,72,26,50,14
+LTEXT           "Attach a debugger or ESC to cancel",IDC_STATIC,7,7,115,8
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+IDD_DIALOG1, DIALOG
+BEGIN
+LEFTMARGIN, 7
+RIGHTMARGIN, 122
+TOPMARGIN, 7
+BOTTOMMARGIN, 40
+END
+END
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
diff --git a/third_party/angle/src/libGLESv1_CM/libGLESv1_CM.rc b/third_party/angle/src/libGLESv1_CM/libGLESv1_CM.rc
index 2b74a9d..1a96f85 100644
--- a/third_party/angle/src/libGLESv1_CM/libGLESv1_CM.rc
+++ b/third_party/angle/src/libGLESv1_CM/libGLESv1_CM.rc
@@ -1,103 +1,103 @@
-// Microsoft Visual C++ generated resource script.

-//

-#include "resource.h"

-

-#define APSTUDIO_READONLY_SYMBOLS

-/////////////////////////////////////////////////////////////////////////////

-//

-// Generated from the TEXTINCLUDE 2 resource.

-//

-#include <windows.h>

-#include "../common/version.h"

-

-/////////////////////////////////////////////////////////////////////////////

-#undef APSTUDIO_READONLY_SYMBOLS

-

-/////////////////////////////////////////////////////////////////////////////

-// English (U.S.) resources

-

-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

-#ifdef _WIN32

-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

-#pragma code_page(1252)

-#endif //_WIN32

-

-#ifdef APSTUDIO_INVOKED

-/////////////////////////////////////////////////////////////////////////////

-//

-// TEXTINCLUDE

-//

-

-1 TEXTINCLUDE

-BEGIN

-    "resource.h\0"

-END

-

-2 TEXTINCLUDE

-BEGIN

-    "#include ""afxres.h""\r\n"

-    "#include ""../common/version.h""\0"

-END

-

-3 TEXTINCLUDE

-BEGIN

-    "\r\n"

-    "\0"

-END

-

-#endif    // APSTUDIO_INVOKED

-

-

-/////////////////////////////////////////////////////////////////////////////

-//

-// Version

-//

-

-VS_VERSION_INFO VERSIONINFO

- FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0

- PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0

- FILEFLAGSMASK 0x17L

-#ifdef _DEBUG

- FILEFLAGS 0x1L

-#else

- FILEFLAGS 0x0L

-#endif

- FILEOS 0x4L

- FILETYPE 0x2L

- FILESUBTYPE 0x0L

-BEGIN

-    BLOCK "StringFileInfo"

-    BEGIN

-        BLOCK "040904b0"

-        BEGIN

-            VALUE "FileDescription", "ANGLE libGLESv1_CM Dynamic Link Library"

-            VALUE "FileVersion", ANGLE_VERSION_STRING

-            VALUE "InternalName", "libGLESv1_CM"

-            VALUE "LegalCopyright", "Copyright (C) 2015 Google Inc."

-            VALUE "OriginalFilename", "libGLESv1_CM.dll"

-            VALUE "PrivateBuild", ANGLE_VERSION_STRING

-            VALUE "ProductName", "ANGLE libGLESv1_CM Dynamic Link Library"

-            VALUE "ProductVersion", ANGLE_VERSION_STRING

-            VALUE "Comments", "Build Date: " ANGLE_COMMIT_DATE

-        END

-    END

-    BLOCK "VarFileInfo"

-    BEGIN

-        VALUE "Translation", 0x409, 1200

-    END

-END

-

-#endif    // English (U.S.) resources

-/////////////////////////////////////////////////////////////////////////////

-

-

-

-#ifndef APSTUDIO_INVOKED

-/////////////////////////////////////////////////////////////////////////////

-//

-// Generated from the TEXTINCLUDE 3 resource.

-//

-

-

-/////////////////////////////////////////////////////////////////////////////

-#endif    // not APSTUDIO_INVOKED

+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+#include "../common/version.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "#include ""../common/version.h""\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "FileDescription", "ANGLE libGLESv1_CM Dynamic Link Library"
+            VALUE "FileVersion", ANGLE_VERSION_STRING
+            VALUE "InternalName", "libGLESv1_CM"
+            VALUE "LegalCopyright", "Copyright (C) 2015 Google Inc."
+            VALUE "OriginalFilename", "libGLESv1_CM.dll"
+            VALUE "PrivateBuild", ANGLE_VERSION_STRING
+            VALUE "ProductName", "ANGLE libGLESv1_CM Dynamic Link Library"
+            VALUE "ProductVersion", ANGLE_VERSION_STRING
+            VALUE "Comments", "Build Date: " ANGLE_COMMIT_DATE
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
diff --git a/third_party/angle/src/libGLESv2.gypi b/third_party/angle/src/libGLESv2.gypi
deleted file mode 100644
index 41591fe..0000000
--- a/third_party/angle/src/libGLESv2.gypi
+++ /dev/null
@@ -1,1488 +0,0 @@
-# Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-    'variables':
-    {
-        'libangle_common_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/common/Color.h',
-            '<(DEPTH)/third_party/angle/src/common/Color.inc',
-            '<(DEPTH)/third_party/angle/src/common/FastVector.h',
-            '<(DEPTH)/third_party/angle/src/common/FixedVector.h',
-            '<(DEPTH)/third_party/angle/src/common/Float16ToFloat32.cpp',
-            '<(DEPTH)/third_party/angle/src/common/MemoryBuffer.cpp',
-            '<(DEPTH)/third_party/angle/src/common/MemoryBuffer.h',
-            '<(DEPTH)/third_party/angle/src/common/Optional.h',
-            '<(DEPTH)/third_party/angle/src/common/angle_hdr.cpp',
-            '<(DEPTH)/third_party/angle/src/common/PackedEGLEnums_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/common/PackedEGLEnums_autogen.h',
-            '<(DEPTH)/third_party/angle/src/common/PackedEnums.cpp',
-            '<(DEPTH)/third_party/angle/src/common/PackedEnums.h',
-            '<(DEPTH)/third_party/angle/src/common/PackedGLEnums_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/common/PackedGLEnums_autogen.h',
-            '<(DEPTH)/third_party/angle/src/common/PoolAlloc.cpp',
-            '<(DEPTH)/third_party/angle/src/common/PoolAlloc.h',
-            '<(DEPTH)/third_party/angle/src/common/aligned_memory.cpp',
-            '<(DEPTH)/third_party/angle/src/common/aligned_memory.h',
-            '<(DEPTH)/third_party/angle/src/common/android_util.cpp',
-            '<(DEPTH)/third_party/angle/src/common/android_util.h',
-            '<(DEPTH)/third_party/angle/src/common/angleutils.cpp',
-            '<(DEPTH)/third_party/angle/src/common/angleutils.h',
-            '<(DEPTH)/third_party/angle/src/common/apple_platform_utils.h',
-            '<(DEPTH)/third_party/angle/src/common/bitset_utils.h',
-            '<(DEPTH)/third_party/angle/src/common/debug.cpp',
-            '<(DEPTH)/third_party/angle/src/common/debug.h',
-            '<(DEPTH)/third_party/angle/src/common/event_tracer.cpp',
-            '<(DEPTH)/third_party/angle/src/common/event_tracer.h',
-            '<(DEPTH)/third_party/angle/src/common/hash_utils.h',
-            '<(DEPTH)/third_party/angle/src/common/mathutil.cpp',
-            '<(DEPTH)/third_party/angle/src/common/mathutil.h',
-            '<(DEPTH)/third_party/angle/src/common/matrix_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/common/matrix_utils.h',
-            '<(DEPTH)/third_party/angle/src/common/platform.h',
-            '<(DEPTH)/third_party/angle/src/common/string_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/common/string_utils.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/base_export.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/containers/mru_cache.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/logging.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/macros.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/no_destructor.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/numerics/safe_conversions.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/numerics/safe_conversions_impl.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/numerics/safe_math.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/numerics/safe_math_impl.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/sha1.cc',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/sha1.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/base/anglebase/sys_byteorder.h',
-            '<(DEPTH)/third_party/angle/src/common/third_party/smhasher/src/PMurHash.cpp',
-            '<(DEPTH)/third_party/angle/src/common/third_party/smhasher/src/PMurHash.h',
-            '<(DEPTH)/third_party/angle/src/common/tls.cpp',
-            '<(DEPTH)/third_party/angle/src/common/tls.h',
-            '<(DEPTH)/third_party/angle/src/common/uniform_type_info_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/common/utilities.cpp',
-            '<(DEPTH)/third_party/angle/src/common/utilities.h',
-            '<(DEPTH)/third_party/angle/src/common/vector_utils.h',
-        ],
-        'xxhash_sources': [
-            '<(DEPTH)/third_party/angle/src/common/third_party/xxhash/xxhash.c',
-            '<(DEPTH)/third_party/angle/src/common/third_party/xxhash/xxhash.h',
-        ],
-
-        'angle_system_utils_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/common/Optional.h',
-            '<(DEPTH)/third_party/angle/src/common/angleutils.h',
-            '<(DEPTH)/third_party/angle/src/common/platform.h',
-            '<(DEPTH)/third_party/angle/src/common/system_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/common/system_utils.h',
-        ],
-        'angle_system_utils_linux_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/common/system_utils_linux.cpp',
-            '<(DEPTH)/third_party/angle/src/common/system_utils_posix.cpp',
-        ],
-        'angle_system_utils_mac_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/common/system_utils_mac.cpp',
-            '<(DEPTH)/third_party/angle/src/common/system_utils_posix.cpp',
-        ],
-        'angle_system_utils_winuwp_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/common/system_utils_winuwp.cpp',
-        ],
-        'angle_system_utils_win_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/common/system_utils_win.cpp',
-        ],
-        'libangle_image_util_headers':
-        [
-            '<(DEPTH)/third_party/angle/src/image_util/copyimage.h',
-            '<(DEPTH)/third_party/angle/src/image_util/copyimage.inc',
-            '<(DEPTH)/third_party/angle/src/image_util/generatemip.h',
-            '<(DEPTH)/third_party/angle/src/image_util/generatemip.inc',
-            '<(DEPTH)/third_party/angle/src/image_util/imageformats.h',
-            '<(DEPTH)/third_party/angle/src/image_util/loadimage.h',
-            '<(DEPTH)/third_party/angle/src/image_util/loadimage.inc',
-        ],
-        'libangle_image_util_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/image_util/copyimage.cpp',
-            '<(DEPTH)/third_party/angle/src/image_util/imageformats.cpp',
-            '<(DEPTH)/third_party/angle/src/image_util/loadimage.cpp',
-            '<(DEPTH)/third_party/angle/src/image_util/loadimage_etc.cpp',
-        ],
-        'libangle_gpu_info_util_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/gpu_info_util/SystemInfo.cpp',
-            '<(DEPTH)/third_party/angle/src/gpu_info_util/SystemInfo.h',
-            '<(DEPTH)/third_party/angle/src/gpu_info_util/SystemInfo_internal.h',
-        ],
-        'libangle_gpu_info_util_win_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/gpu_info_util/SystemInfo_win.cpp',
-        ],
-        'libangle_gpu_info_util_linux_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp',
-        ],
-        'libangle_gpu_info_util_libpci_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/gpu_info_util/SystemInfo_libpci.cpp',
-        ],
-        'libangle_gpu_info_util_x11_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/gpu_info_util/SystemInfo_x11.cpp',
-        ],
-        'libangle_gpu_info_util_mac_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/gpu_info_util/SystemInfo_mac.mm',
-        ],
-        'libangle_includes':
-        [
-            '<(DEPTH)/third_party/angle/include/angle_gl.h',
-            '<(DEPTH)/third_party/angle/include/angle_hdr.h',
-            '<(DEPTH)/third_party/angle/include/export.h',
-            '<(DEPTH)/third_party/angle/include/EGL/egl.h',
-            '<(DEPTH)/third_party/angle/include/EGL/eglext.h',
-            '<(DEPTH)/third_party/angle/include/EGL/eglext_angle.h',
-            '<(DEPTH)/third_party/angle/include/EGL/eglplatform.h',
-            '<(DEPTH)/third_party/angle/include/GLES/gl.h',
-            '<(DEPTH)/third_party/angle/include/GLES/glplatform.h',
-            '<(DEPTH)/third_party/angle/include/GLES/glext.h',
-            '<(DEPTH)/third_party/angle/include/GLES/glext_angle.h',
-            '<(DEPTH)/third_party/angle/include/GLES/glext_explicit_context_autogen.inc',
-            '<(DEPTH)/third_party/angle/include/GLES2/gl2.h',
-            '<(DEPTH)/third_party/angle/include/GLES2/gl2ext.h',
-            '<(DEPTH)/third_party/angle/include/GLES2/gl2ext_angle.h',
-            '<(DEPTH)/third_party/angle/include/GLES2/gl2ext_explicit_context_autogen.inc',
-            '<(DEPTH)/third_party/angle/include/GLES2/gl2platform.h',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl3.h',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl3ext_explicit_context_autogen.inc',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl3platform.h',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl31.h',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl31ext_explicit_context_autogen.inc',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl32.h',
-            '<(DEPTH)/third_party/angle/include/GLES3/gl32ext_explicit_context_autogen.inc',
-            '<(DEPTH)/third_party/angle/include/KHR/khrplatform.h',
-            '<(DEPTH)/third_party/angle/include/WGL/wgl.h',
-            '<(DEPTH)/third_party/angle/include/platform/Feature.h',
-            '<(DEPTH)/third_party/angle/include/platform/FeaturesD3D.h',
-            '<(DEPTH)/third_party/angle/include/platform/FeaturesGL.h',
-            '<(DEPTH)/third_party/angle/include/platform/FeaturesMtl.h',
-            '<(DEPTH)/third_party/angle/include/platform/FeaturesVk.h',
-            '<(DEPTH)/third_party/angle/include/platform/FrontendFeatures.h',
-            '<(DEPTH)/third_party/angle/include/platform/Platform.h',
-        ],
-        'libangle_headers':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/AttributeMap.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/BinaryStream.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/BlobCache.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Buffer.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Caps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Compiler.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Config.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Constants.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context.inl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_1_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_1_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_1_2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_1_3_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_1_4_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_1_5_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_2_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_2_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_3_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_3_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_3_2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_3_3_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_4_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_4_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_4_2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_4_3_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_4_4_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_4_5_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl_4_6_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gles_1_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gles_2_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gles_3_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gles_3_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gles_3_2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gles_ext_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Debug.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Device.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Display.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/EGLSync.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Error.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Error.inc',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ErrorStrings.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Fence.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Framebuffer.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/FramebufferAttachment.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/GLES1Renderer.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/GLES1Shaders.inc',
-            '<(DEPTH)/third_party/angle/src/libANGLE/GLES1State.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/HandleAllocator.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/HandleRangeAllocator.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Image.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ImageIndex.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/IndexRangeCache.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/LoggingAnnotator.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/MemoryObject.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/MemoryProgramCache.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Observer.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Overlay.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Overlay.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/OverlayWidgets.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/OverlayWidgets.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Overlay_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Overlay_font_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Overlay_font_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Path.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Program.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ProgramLinkedResources.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ProgramPipeline.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Query.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/RefCountObject.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Renderbuffer.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ResourceManager.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ResourceMap.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Sampler.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Semaphore.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Shader.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/SizedMRUCache.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/State.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Stream.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Surface.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Texture.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Thread.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/TransformFeedback.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Uniform.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/VaryingPacking.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Version.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Version.inc',
-            '<(DEPTH)/third_party/angle/src/libANGLE/VertexArray.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/VertexAttribute.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/VertexAttribute.inc',
-            '<(DEPTH)/third_party/angle/src/libANGLE/WorkerThread.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/angletypes.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/angletypes.inc',
-            '<(DEPTH)/third_party/angle/src/libANGLE/entry_points_enum_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/entry_points_utils.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/features.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/formatutils.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/histogram_macros.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/queryconversions.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/queryutils.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/trace.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/BufferImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/CompilerImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/ContextImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/driver_utils.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/DeviceImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/DisplayImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/EGLImplFactory.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/EGLSyncImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/FenceNVImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/FormatID_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/Format.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/FramebufferAttachmentObjectImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/FramebufferImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/GLImplFactory.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/ImageImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/MemoryObjectImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/OverlayImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/PathImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/ProgramImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/ProgramPipelineImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/QueryImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/RenderbufferImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/RenderTargetCache.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/SamplerImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/SemaphoreImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/ShaderImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/StreamProducerImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/SurfaceImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/SyncImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/TextureImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/TransformFeedbackImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/VertexArrayImpl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/copyvertex.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/copyvertex.inc.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/load_functions_table.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/renderer_utils.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES1.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES2.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES3.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES31.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES31_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES32.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES32_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES3_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationESEXT.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationESEXT_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL11_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL12_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL13_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL14_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL15_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL21_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL31_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL32_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL33_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL3_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL41_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL42_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL43_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL44_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL45_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL46_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL4_autogen.h',
-            '<(DEPTH)/third_party/angle/src/third_party/trace_event/trace_event.h',
-        ],
-        'libangle_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/AttributeMap.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/BlobCache.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Buffer.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Caps.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Compiler.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Config.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gl.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Context_gles_1_0.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Debug.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Device.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Display.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/EGLSync.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Error.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Fence.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Framebuffer.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/FramebufferAttachment.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/FrameCapture_mock.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/GLES1Renderer.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/GLES1State.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/HandleAllocator.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/HandleRangeAllocator.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Image.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ImageIndex.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/IndexRangeCache.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/LoggingAnnotator.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/MemoryObject.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/MemoryProgramCache.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Observer.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Path.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Platform.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Program.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ProgramLinkedResources.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ProgramPipeline.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Query.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Renderbuffer.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/ResourceManager.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Sampler.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Semaphore.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Shader.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/State.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Stream.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Surface.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Texture.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Thread.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/TransformFeedback.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/Uniform.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/VaryingPacking.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/VertexArray.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/VertexAttribute.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/WorkerThread.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/angletypes.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/entry_points_enum_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/format_map_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/format_map_desktop.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/formatutils.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/queryconversions.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/queryutils.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/ContextImpl.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/driver_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/DeviceImpl.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/DisplayImpl.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/Format_table_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/QueryImpl.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/ShaderImpl.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/SurfaceImpl.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/TextureImpl.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES1.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES2.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES3.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES31.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationES32.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationESEXT.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL1.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL2.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL3.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL4.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL12.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL14.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL15.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL13.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL21.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL31.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL32.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL33.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL41.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL42.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL43.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL44.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL45.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/validationGL46.cpp',
-        ],
-        'libangle_d3d_shared_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/CompilerD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/CompilerD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/ContextD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/DeviceD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/DeviceD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/DisplayD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/DynamicImage2DHLSL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/DynamicImage2DHLSL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/EGLImageD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/formatutilsD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/FramebufferD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/HLSLCompiler.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/HLSLCompiler.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/ImageD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/ImageD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/IndexBuffer.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/IndexBuffer.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/IndexDataManager.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/IndexDataManager.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/NativeWindowD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/RenderbufferD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/RenderTargetD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/SamplerD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/ShaderExecutableD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/SwapChainD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/VertexDataManager.h',
-        ],
-        'libangle_d3d9_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Blit9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Buffer9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Fence9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/formatutils9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Image9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/NativeWindow9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Query9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Query9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/ShaderCache.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskpremultps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskunmultps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminancepremultps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceunmultps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h',
-        ],
-        'libangle_d3d11_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Blit11Helper_autogen.inc',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Fence11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Image11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/NativeWindow11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/MappedSubresourceVerifier11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/MappedSubresourceVerifier11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Program11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Program11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ProgramPipeline11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Query11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11_fl9vs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewgs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11multiviewvs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clear11vs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/cleardepth11ps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps1.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps2.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps3.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps4.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps5.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps6.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps7.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps8.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps1.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps2.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps3.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps4.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps5.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps6.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps7.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps8.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps1.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps2.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps3.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps4.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps5.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps6.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps7.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps8.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dms11ps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvecolor2dps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepth11_ps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_ps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvedepthstencil11_vs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/resolvestencil11_ps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StreamProducerD3DTexture.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_utils.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TransformFeedback11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Trim11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h',
-        ],
-        'libangle_d3d11_win32_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h',
-            '<(DEPTH)/third_party/angle/src/third_party/systeminfo/SystemInfo.cpp',
-            '<(DEPTH)/third_party/angle/src/third_party/systeminfo/SystemInfo.h',
-        ],
-        'libangle_d3d11_winuwp_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h',
-        ],
-        'libangle_gl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/BlitGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/BlitGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/BufferGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/BufferGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/CompilerGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/CompilerGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/FenceNVGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/FenceNVGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/FunctionsGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ImageGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ImageGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/MemoryObjectGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/MemoryObjectGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/PathGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/PathGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ProgramPipelineGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ProgramPipelineGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/QueryGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/QueryGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/RenderbufferGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/RenderbufferGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/SamplerGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/SamplerGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/SemaphoreGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/SemaphoreGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/SyncGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/SyncGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/formatutilsgl.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/formatutilsgl.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/functionsgl_enums.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/functionsgl_typedefs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.h',
-        ],
-        'libangle_gl_null_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/null_functions.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/null_functions.h',
-        ],
-        'libangle_gl_wgl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/ContextWGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/ContextWGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/FunctionsWGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/RendererWGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/RendererWGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/SurfaceWGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/functionswgl_typedefs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/wgl_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/wgl/wgl_utils.h',
-            '<(DEPTH)/third_party/angle/src/third_party/khronos/GL/wglext.h',
-        ],
-        'libangle_gl_glx_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/RendererGLX.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/RendererGLX.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/SurfaceGLX.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/functionsglx_typedefs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/glx/platform_glx.h',
-        ],
-        'libangle_gl_egl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/ContextEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/ContextEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/DisplayEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/DisplayEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/ExternalImageSiblingEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/egl_utils.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/egl_utils.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/ImageEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/ImageEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/functionsegl_typedefs.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/RendererEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/RendererEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h',
-        ],
-        'libangle_gl_egl_dl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGLDL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/FunctionsEGLDL.h',
-        ],
-        'libangle_gl_ozone_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h',
-        ],
-        'libangle_gl_egl_android_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/android/DisplayAndroid.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h',
-        ],
-        'libangle_gl_cgl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/ContextCGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/ContextCGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/DeviceCGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/DeviceCGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/DisplayCGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/RendererCGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/RendererCGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h',
-        ],
-        'libangle_mac_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/driver_utils_mac.mm',
-        ],
-        'libangle_null_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/BufferNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/BufferNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/CompilerNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/CompilerNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/DeviceNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/DeviceNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/DisplayNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/FenceNVNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/FenceNVNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/FramebufferNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ImageNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ImageNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/PathNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/PathNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ProgramNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ProgramPipelineNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ProgramPipelineNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/QueryNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/QueryNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/RenderbufferNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/RenderbufferNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/SamplerNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/SamplerNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/SurfaceNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/SyncNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/SyncNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/TransformFeedbackNULL.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.cpp',
-            '<(DEPTH)/third_party/angle/src/libANGLE/renderer/null/VertexArrayNULL.h',
-        ],
-        'libgl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/common/angleutils.h',
-            '<(DEPTH)/third_party/angle/src/common/debug.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_0_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_1_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_2_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_3_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_3_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_4_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_4_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_5_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_1_5_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_2_0_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_2_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_2_1_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_2_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_3_0_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_3_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_3_1_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_3_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_3_2_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_3_2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_3_3_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_3_3_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_0_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_1_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_2_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_3_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_3_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_4_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_6_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_4_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_5_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_5_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_gl_4_6_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_wgl.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/entry_points_wgl.h',
-            '<(DEPTH)/third_party/angle/src/libGL/libGL_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGL/libGL_autogen.def',
-            '<(DEPTH)/third_party/angle/src/libGL/libGL.rc',
-            '<(DEPTH)/third_party/angle/src/libGL/proc_table_wgl.h',
-            '<(DEPTH)/third_party/angle/src/libGL/proc_table_wgl_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/global_state.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/global_state.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/resource.h',
-        ],
-        'libglesv2_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/common/angleutils.h',
-            '<(DEPTH)/third_party/angle/src/common/debug.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/entry_points_enum_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libANGLE/entry_points_utils.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_egl.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_egl.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_egl_ext.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_egl_ext.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_1_0_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_1_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_2_0_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_2_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_3_0_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_3_0_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_3_1_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_3_1_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_3_2_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_3_2_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/global_state.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/global_state.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/libGLESv2_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/libGLESv2.rc',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/proc_table_egl.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/proc_table_egl_autogen.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/resource.h',
-        ],
-        'libglesv1_cm_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libGLESv1_CM/libGLESv1_CM.cpp',
-            '<(DEPTH)/third_party/angle/src/libGLESv1_CM/libGLESv1_CM.def',
-            '<(DEPTH)/third_party/angle/src/libGLESv1_CM/libGLESv1_CM.rc',
-            '<(DEPTH)/third_party/angle/src/libGLESv1_CM/resource.h',
-        ],
-        'libegl_sources':
-        [
-            '<(DEPTH)/third_party/angle/src/libEGL/libEGL.cpp',
-            '<(DEPTH)/third_party/angle/src/libEGL/libEGL.rc',
-            '<(DEPTH)/third_party/angle/src/libEGL/resource.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_egl.h',
-            '<(DEPTH)/third_party/angle/src/libGLESv2/entry_points_egl_ext.h',
-            '<(DEPTH)/third_party/angle/src/libEGL/egl_loader_autogen.h',
-        ],
-    },
-    'target_defaults': {
-        'conditions':
-        [
-            ['OS=="starboard"',
-            {
-                'conditions':
-                [
-                    ['angle_platform_linux==1',
-                    {
-                        'defines': [
-                            'ANGLE_PLATFORM_LINUX=1',
-                        ],
-                    }],
-                    ['angle_platform_posix==1',
-                    {
-                        'defines': [
-                            'ANGLE_PLATFORM_POSIX=1',
-                        ],
-                    }],
-                    ['angle_platform_windows==1',
-                    {
-                        'defines': [
-                            'ANGLE_PLATFORM_WINDOWS=1',
-                        ],
-                    }],
-                ],
-            }],
-        ],
-    },
-    # Everything below this is duplicated in the GN build. If you change
-    # anything also change angle/BUILD.gn
-    'targets':
-    [
-        {
-            # This target includes the right ANGLE defines for <(DEPTH)/third_party/angle/src/common/platform.h for D3D11.
-            # It also links against the right libs. This is useful for the tests, which
-            # have special D3D11 code for Debug runtime error message handling.
-            'target_name': 'libANGLE_d3d11_config',
-            'type': 'none',
-            'conditions':
-            [
-                ['angle_enable_d3d11==1',
-                {
-                    'link_settings':
-                    {
-                        'msvs_settings':
-                        {
-                            'VCLinkerTool':
-                            {
-                                'conditions':
-                                [
-                                    ['angle_build_winrt==0',
-                                    {
-                                        'AdditionalDependencies':
-                                        [
-                                            'dxguid.lib',
-                                        ],
-                                    }],
-                                    ['angle_build_winrt==1',
-                                    {
-                                        'AdditionalDependencies':
-                                        [
-                                            'dxguid.lib',
-                                            'd3d11.lib',
-                                            'd3dcompiler.lib',
-                                        ],
-                                    }],
-                                ],
-                            }
-                        },
-                    },
-                }],
-            ],
-        },
-
-        {
-            'target_name': 'libANGLE_renderer_config',
-            'type': 'none',
-            'direct_dependent_settings':
-            {
-                'conditions':
-                [
-                    ['angle_enable_d3d11==1',
-                    {
-                        'defines':
-                        [
-                            'ANGLE_ENABLE_D3D11',
-                        ],
-                    }],
-                    ['angle_enable_d3d9==1',
-                    {
-                        'defines':
-                        [
-                            'ANGLE_ENABLE_D3D9',
-                        ],
-                    }],
-                    ['angle_enable_gl==1',
-                    {
-                        'defines':
-                        [
-                            'ANGLE_ENABLE_OPENGL',
-                        ],
-                    }],
-                    ['angle_enable_vulkan==1',
-                    {
-                        'defines':
-                        [
-                            'ANGLE_ENABLE_VULKAN',
-                        ],
-                    }],
-                    ['angle_enable_null==1',
-                    {
-                        'defines':
-                        [
-                            'ANGLE_ENABLE_NULL',
-                        ],
-                    }],
-                ],
-            },
-        },
-
-        {
-            'target_name': 'libANGLE',
-            'type': 'static_library',
-            'dependencies':
-            [
-                'translator',
-                'angle_common',
-                'angle_image_util',
-                'angle_gpu_info_util',
-                'libANGLE_d3d11_config',
-                'libANGLE_renderer_config',
-            ],
-            'includes': [ '../gyp/common_defines.gypi', ],
-            'include_dirs':
-            [
-                '<(DEPTH)/third_party/angle/',
-                '<(DEPTH)/third_party/angle/include',
-                '<(DEPTH)/third_party/angle/src/third_party/khronos',
-            ],
-            'sources':
-            [
-                '<@(libangle_headers)',
-                '<@(libangle_sources)',
-                '<@(libangle_includes)',
-            ],
-            'defines':
-            [
-                'LIBANGLE_IMPLEMENTATION',
-            ],
-            'export_dependent_settings':
-            [
-                'angle_common',
-                'libANGLE_d3d11_config',
-                'libANGLE_renderer_config',
-            ],
-            'direct_dependent_settings':
-            {
-                'include_dirs':
-                [
-                    '<(DEPTH)/third_party/angle/src',
-                    '<(DEPTH)/third_party/angle/include',
-                ],
-                'defines':
-                [
-                    'LIBANGLE_IMPLEMENTATION',
-                    'GL_GLEXT_PROTOTYPES',
-                    'ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ "d3dcompiler_47.dll", "d3dcompiler_46.dll", "d3dcompiler_43.dll" }',
-                ],
-                'conditions':
-                [
-                    ['target_os=="win"', {
-                        'defines':
-                        [
-                            'GL_APICALL=',
-                        ],
-                    }, {
-                        'defines':
-                        [
-                            'GL_APICALL=__attribute__((visibility("default")))',
-                        ],
-                    }],
-                    ['OS == "mac"',
-                    {
-                        'xcode_settings':
-                        {
-                            'DYLIB_INSTALL_NAME_BASE': '@rpath',
-                        },
-                    }],
-                    ['angle_enable_gl==1',
-                    {
-                        'conditions':
-                        [
-                            ['angle_use_glx==1',
-                            {
-                                'defines':
-                                [
-                                    'ANGLE_USE_X11',
-                                ],
-                            }],
-                        ],
-                    }],
-                ],
-            },
-            'conditions':
-            [
-                ['angle_enable_d3d9==1 or angle_enable_d3d11==1',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_d3d_shared_sources)',
-                    ],
-                }],
-                ['angle_enable_d3d9==1',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_d3d9_sources)',
-                    ],
-                    'link_settings':
-                    {
-                        'msvs_settings':
-                        {
-                            'VCLinkerTool':
-                            {
-                                'AdditionalDependencies':
-                                [
-                                    'd3d9.lib',
-                                ]
-                            }
-                        },
-                    },
-                }],
-                ['angle_enable_d3d11==1',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_d3d11_sources)',
-                    ],
-                    'conditions':
-                    [
-                        ['angle_build_winrt==1',
-                        {
-                            'sources':
-                            [
-                                '<@(libangle_d3d11_winuwp_sources)',
-                            ],
-                        },
-                        { # win32
-                            'sources':
-                            [
-                                '<@(libangle_d3d11_win32_sources)',
-                            ],
-                        }],
-                        ['enable_d3d11_feature_level_11==1',
-                        {
-                            'defines': [
-                                'ENABLE_D3D11_FEATURE_LEVEL_11'
-                            ]
-                        }],
-                    ],
-                }],
-                ['angle_enable_gl==1',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_gl_sources)',
-                    ],
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<@(libangle_gl_wgl_sources)',
-                            ],
-                        }],
-                        ['angle_use_glx==1',
-                        {
-                            'defines':
-                            [
-                                'ANGLE_USE_X11',
-                            ],
-                            'sources':
-                            [
-                                '<@(libangle_gl_glx_sources)',
-                            ],
-                        }],
-                        ['use_ozone==1',
-                        {
-                            'defines':
-                            [
-                                'ANGLE_USE_OZONE',
-                            ],
-                            'sources':
-                            [
-                                '<@(libangle_gl_egl_sources)',
-                                '<@(libangle_gl_egl_dl_sources)',
-                                '<@(libangle_gl_ozone_sources)',
-                            ],
-                            'cflags':
-                            [
-                                '<!@(<(pkg-config) --cflags libdrm gbm)',
-                            ],
-                            'link_settings': {
-                                'ldflags': [
-                                    '<!@(<(pkg-config) --libs-only-L --libs-only-other libdrm gbm)',
-                                ],
-                                'libraries': [
-                                    '<!@(<(pkg-config) --libs-only-l libdrm gbm) -ldl',
-                                ],
-                            },
-                        }],
-                        ['angle_link_glx==1',
-                        {
-                            'link_settings':
-                            {
-                                'libraries':
-                                [
-                                    '-lGL',
-                                ],
-                            },
-                            'defines':
-                            [
-                                'ANGLE_LINK_GLX',
-                            ],
-                        }, {
-                            # If we don't statically link GL, we need the dl
-                            # library so that we can dynamically link with GL.
-                            'link_settings': {
-                                'libraries': [
-                                    '-ldl',
-                                ]
-                            }
-                        }],
-                        ['OS=="mac"',
-                        {
-                            'sources':
-                            [
-                                '<@(libangle_gl_cgl_sources)',
-                            ],
-                            'link_settings':
-                            {
-                                'libraries':
-                                [
-                                    '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework',
-                                    '$(SDKROOT)/System/Library/Frameworks/IOSurface.framework',
-                                    '$(SDKROOT)/System/Library/Frameworks/OpenGL.framework',
-                                    '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework',
-                                ],
-                            },
-                            'all_dependent_settings':
-                            {
-                                'xcode_settings': {
-                                    'LD_RUNPATH_SEARCH_PATHS': ['@executable_path/.'],
-                                },
-                            }
-                        }],
-                    ],
-                }],
-                ['angle_enable_vulkan==1',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_vulkan_sources)',
-                    ],
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<@(libangle_vulkan_win32_sources)',
-                            ],
-                        }],
-                        ['OS=="linux"',
-                        {
-                            'sources':
-                            [
-                                '<@(libangle_vulkan_xcb_sources)',
-                            ],
-                        }],
-                    ],
-                    'dependencies':
-                    [
-                        'angle_vulkan',
-                    ],
-                    'export_dependent_settings':
-                    [
-                        'angle_vulkan',
-                    ],
-                }],
-                ['angle_enable_null==1',
-                {
-                    'sources':
-                    [
-                        '<@(libangle_null_sources)',
-                    ],
-                }],
-                ['angle_build_winrt==0 and target_os=="win"',
-                {
-                    'dependencies':
-                    [
-                        'copy_compiler_dll'
-                    ],
-                }],
-                ['angle_build_winrt==1',
-                {
-                    'msvs_requires_importlibrary' : 'true',
-                }],
-            ],
-        },
-        {
-            'target_name': 'libGLESv2',
-            'type': '<(angle_gl_library_type)',
-            'dependencies': [ 'libANGLE', 'angle_common' ],
-            'includes': [ '../gyp/common_defines.gypi', ],
-            'sources':
-            [
-                '<@(libglesv2_sources)',
-            ],
-            'defines':
-            [
-                'LIBGLESV2_IMPLEMENTATION',
-            ],
-            'conditions':
-            [
-                ['angle_build_winrt==1',
-                {
-                    'msvs_requires_importlibrary' : 'true',
-                }],
-                ['angle_gl_library_type== "shared_library"',
-                {
-                    'defines':[
-                      'LIBGLESV2_DLL'
-                    ]
-                }],
-            ],
-
-        },
-
-        {
-            'target_name': 'libGLESv2_static',
-            'type': 'static_library',
-            'dependencies': [ 'libANGLE', 'angle_common' ],
-            'export_dependent_settings':
-            [
-                'libANGLE',
-            ],
-            'includes': [ '../gyp/common_defines.gypi', ],
-            'sources':
-            [
-                '<@(libglesv2_sources)',
-            ],
-            'conditions':
-            [
-                ['angle_build_winrt==1',
-                {
-                    'msvs_requires_importlibrary' : 'true',
-                }],
-            ],
-        },
-    ],
-}
diff --git a/third_party/angle/src/libGLESv2/libGLESv2.rc b/third_party/angle/src/libGLESv2/libGLESv2.rc
index 5b10471..59b2d81 100644
--- a/third_party/angle/src/libGLESv2/libGLESv2.rc
+++ b/third_party/angle/src/libGLESv2/libGLESv2.rc
@@ -1,137 +1,137 @@
-// Microsoft Visual C++ generated resource script.

-//

-#include "resource.h"

-

-#define APSTUDIO_READONLY_SYMBOLS

-/////////////////////////////////////////////////////////////////////////////

-//

-// Generated from the TEXTINCLUDE 2 resource.

-//

-#include <windows.h>

-#include "../common/version.h"

-

-/////////////////////////////////////////////////////////////////////////////

-#undef APSTUDIO_READONLY_SYMBOLS

-

-/////////////////////////////////////////////////////////////////////////////

-// English (U.S.) resources

-

-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

-#ifdef _WIN32

-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

-#pragma code_page(1252)

-#endif //_WIN32

-

-#ifdef APSTUDIO_INVOKED

-/////////////////////////////////////////////////////////////////////////////

-//

-// TEXTINCLUDE

-//

-

-1 TEXTINCLUDE 

-BEGIN

-    "resource.h\0"

-END

-

-2 TEXTINCLUDE 

-BEGIN

-    "#include ""afxres.h""\r\n"

-    "#include ""../common/version.h""\0"

-END

-

-3 TEXTINCLUDE 

-BEGIN

-    "\r\n"

-    "\0"

-END

-

-#endif    // APSTUDIO_INVOKED

-

-

-/////////////////////////////////////////////////////////////////////////////

-//

-// Version

-//

-

-VS_VERSION_INFO VERSIONINFO

- FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0

- PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0

- FILEFLAGSMASK 0x17L

-#ifdef _DEBUG

- FILEFLAGS 0x1L

-#else

- FILEFLAGS 0x0L

-#endif

- FILEOS 0x4L

- FILETYPE 0x2L

- FILESUBTYPE 0x0L

-BEGIN

-    BLOCK "StringFileInfo"

-    BEGIN

-        BLOCK "040904b0"

-        BEGIN

-            VALUE "FileDescription", "ANGLE libGLESv2 Dynamic Link Library"

-            VALUE "FileVersion", ANGLE_VERSION_STRING

-            VALUE "InternalName", "libGLESv2"

-            VALUE "LegalCopyright", "Copyright (C) 2015 Google Inc."

-            VALUE "OriginalFilename", "libGLESv2.dll"

-            VALUE "PrivateBuild", ANGLE_VERSION_STRING

-            VALUE "ProductName", "ANGLE libGLESv2 Dynamic Link Library"

-            VALUE "ProductVersion", ANGLE_VERSION_STRING

-            VALUE "Comments", "Build Date: " ANGLE_COMMIT_DATE

-        END

-    END

-    BLOCK "VarFileInfo"

-    BEGIN

-        VALUE "Translation", 0x409, 1200

-    END

-END

-

-

-/////////////////////////////////////////////////////////////////////////////

-//

-// Dialog

-//

-

-IDD_DIALOG1 DIALOGEX 0, 0, 129, 47

-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU

-CAPTION "Waiting for debugger"

-FONT 8, "MS Shell Dlg", 400, 0, 0x1

-BEGIN

-PUSHBUTTON      "Cancel",IDCANCEL,72,26,50,14

-LTEXT           "Attach a debugger or ESC to cancel",IDC_STATIC,7,7,115,8

-END

-

-

-/////////////////////////////////////////////////////////////////////////////

-//

-// DESIGNINFO

-//

-

-#ifdef APSTUDIO_INVOKED

-GUIDELINES DESIGNINFO

-BEGIN

-IDD_DIALOG1, DIALOG

-BEGIN

-LEFTMARGIN, 7

-RIGHTMARGIN, 122

-TOPMARGIN, 7

-BOTTOMMARGIN, 40

-END

-END

-#endif    // APSTUDIO_INVOKED

-

-#endif    // English (U.S.) resources

-/////////////////////////////////////////////////////////////////////////////

-

-

-

-#ifndef APSTUDIO_INVOKED

-/////////////////////////////////////////////////////////////////////////////

-//

-// Generated from the TEXTINCLUDE 3 resource.

-//

-

-

-/////////////////////////////////////////////////////////////////////////////

-#endif    // not APSTUDIO_INVOKED

+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+#include "../common/version.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "#include ""../common/version.h""\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "FileDescription", "ANGLE libGLESv2 Dynamic Link Library"
+            VALUE "FileVersion", ANGLE_VERSION_STRING
+            VALUE "InternalName", "libGLESv2"
+            VALUE "LegalCopyright", "Copyright (C) 2015 Google Inc."
+            VALUE "OriginalFilename", "libGLESv2.dll"
+            VALUE "PrivateBuild", ANGLE_VERSION_STRING
+            VALUE "ProductName", "ANGLE libGLESv2 Dynamic Link Library"
+            VALUE "ProductVersion", ANGLE_VERSION_STRING
+            VALUE "Comments", "Build Date: " ANGLE_COMMIT_DATE
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_DIALOG1 DIALOGEX 0, 0, 129, 47
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Waiting for debugger"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+PUSHBUTTON      "Cancel",IDCANCEL,72,26,50,14
+LTEXT           "Attach a debugger or ESC to cancel",IDC_STATIC,7,7,115,8
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+IDD_DIALOG1, DIALOG
+BEGIN
+LEFTMARGIN, 7
+RIGHTMARGIN, 122
+TOPMARGIN, 7
+BOTTOMMARGIN, 40
+END
+END
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
diff --git a/third_party/angle/src/tests/angle_unittests.gypi b/third_party/angle/src/tests/angle_unittests.gypi
deleted file mode 100644
index 48dd7b4..0000000
--- a/third_party/angle/src/tests/angle_unittests.gypi
+++ /dev/null
@@ -1,171 +0,0 @@
-# Copyright (c) 2015 The ANGLE Project 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 .gypi describes all of the sources and dependencies to build a
-# unified "angle_unittests" target, which contains all of ANGLE's
-# tests that don't require a fully functional ANGLE in order to run
-# (compiler tests, preprocessor tests, etc.). It requires a parent
-# target to include this gypi in an executable target containing a
-# gtest harness in a main.cpp.
-
-{
-    'variables':
-    {
-        'angle_unittests_sources':
-        [
-            '<(angle_path)/src/common/Optional_unittest.cpp',
-            '<(angle_path)/src/common/bitset_utils_unittest.cpp',
-            '<(angle_path)/src/common/mathutil_unittest.cpp',
-            '<(angle_path)/src/common/matrix_utils_unittest.cpp',
-            '<(angle_path)/src/common/string_utils_unittest.cpp',
-            '<(angle_path)/src/common/utilities_unittest.cpp',
-            '<(angle_path)/src/common/vector_utils_unittest.cpp',
-            '<(angle_path)/src/gpu_info_util/SystemInfo_unittest.cpp',
-            '<(angle_path)/src/libANGLE/BinaryStream_unittest.cpp',
-            '<(angle_path)/src/libANGLE/Config_unittest.cpp',
-            '<(angle_path)/src/libANGLE/Fence_unittest.cpp',
-            '<(angle_path)/src/libANGLE/HandleAllocator_unittest.cpp',
-            '<(angle_path)/src/libANGLE/HandleRangeAllocator_unittest.cpp',
-            '<(angle_path)/src/libANGLE/Image_unittest.cpp',
-            '<(angle_path)/src/libANGLE/ImageIndexIterator_unittest.cpp',
-            '<(angle_path)/src/libANGLE/Program_unittest.cpp',
-            '<(angle_path)/src/libANGLE/ResourceManager_unittest.cpp',
-            '<(angle_path)/src/libANGLE/Surface_unittest.cpp',
-            '<(angle_path)/src/libANGLE/TransformFeedback_unittest.cpp',
-            '<(angle_path)/src/libANGLE/VaryingPacking_unittest.cpp',
-            '<(angle_path)/src/libANGLE/VertexArray_unittest.cpp',
-            '<(angle_path)/src/libANGLE/WorkerThread_unittest.cpp',
-            '<(angle_path)/src/libANGLE/renderer/BufferImpl_mock.h',
-            '<(angle_path)/src/libANGLE/renderer/FramebufferImpl_mock.h',
-            '<(angle_path)/src/libANGLE/renderer/ProgramImpl_mock.h',
-            '<(angle_path)/src/libANGLE/renderer/RenderbufferImpl_mock.h',
-            '<(angle_path)/src/libANGLE/renderer/ImageImpl_mock.h',
-            '<(angle_path)/src/libANGLE/renderer/TextureImpl_mock.h',
-            '<(angle_path)/src/libANGLE/renderer/TransformFeedbackImpl_mock.h',
-            '<(angle_path)/src/libANGLE/signal_utils_unittest.cpp',
-            '<(angle_path)/src/libANGLE/validationES_unittest.cpp',
-            '<(angle_path)/src/tests/angle_unittests_utils.h',
-            '<(angle_path)/src/tests/compiler_tests/API_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/AppendixALimitations_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/CollectVariables_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ConstantFolding_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ConstantFoldingNaN_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ConstantFoldingOverflow_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ConstructCompiler_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/DebugShaderPrecision_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/EmulateGLFragColorBroadcast_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ExpressionLimit_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/EXT_YUV_target_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/EXT_blend_func_extended_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/FloatLex_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/FragDepth_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/GLSLCompatibilityOutput_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/IntermNode_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/NV_draw_buffers_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/Pack_Unpack_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/PruneEmptyDeclarations_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/PrunePureLiteralStatements_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/PruneUnusedFunctions_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/QualificationOrderESSL31_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/QualificationOrder_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/RecordConstantPrecision_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/RemovePow_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/SamplerMultisample_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ShaderExtension_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ShaderImage_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ShaderValidation_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ShaderVariable_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/ShCompile_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/TypeTracking_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/VariablePacker_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/WEBGL_multiview_test.cpp',
-            '<(angle_path)/src/tests/compiler_tests/WorkGroupSize_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/char_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/comment_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/define_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/error_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/extension_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/identifier_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/if_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/input_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/location_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/MockDiagnostics.h',
-            '<(angle_path)/src/tests/preprocessor_tests/MockDirectiveHandler.h',
-            '<(angle_path)/src/tests/preprocessor_tests/number_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/operator_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/pragma_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/PreprocessorTest.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/PreprocessorTest.h',
-            '<(angle_path)/src/tests/preprocessor_tests/space_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/token_test.cpp',
-            '<(angle_path)/src/tests/preprocessor_tests/version_test.cpp',
-            '<(angle_path)/src/tests/test_utils/compiler_test.cpp',
-            '<(angle_path)/src/tests/test_utils/compiler_test.h',
-            '<(angle_path)/src/tests/test_utils/ConstantFoldingTest.h',
-            '<(angle_path)/src/tests/test_utils/ConstantFoldingTest.cpp',
-            '<(angle_path)/src/tests/test_utils/ShaderCompileTreeTest.h',
-            '<(angle_path)/src/tests/test_utils/ShaderCompileTreeTest.cpp',
-        ],
-        # TODO(jmadill): should probably call this windows sources
-        'angle_unittests_hlsl_sources':
-        [
-            '<(angle_path)/src/tests/compiler_tests/UnrollFlatten_test.cpp',
-        ],
-    },
-    # Everything below this but the WinRT configuration is duplicated in the GN build.
-    # If you change anything also change angle/src/tests/BUILD.gn
-    'dependencies':
-    [
-        '<(angle_path)/src/angle.gyp:libANGLE',
-        '<(angle_path)/src/angle.gyp:preprocessor',
-        '<(angle_path)/src/angle.gyp:translator',
-        '<(angle_path)/src/tests/tests.gyp:angle_test_support',
-    ],
-    'include_dirs':
-    [
-        '<(angle_path)/include',
-        '<(angle_path)/src',
-    ],
-    'sources':
-    [
-        '<@(angle_unittests_sources)',
-    ],
-    'conditions':
-    [
-        ['angle_build_winrt==1',
-        {
-            'sources':
-            [
-                '<(angle_path)/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow_unittest.cpp',
-                '<(angle_path)/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow_unittest.cpp',
-            ],
-            'defines':
-            [
-                'ANGLE_ENABLE_D3D11',
-            ],
-            'msvs_settings':
-            {
-                'VCLinkerTool':
-                {
-                    'AdditionalDependencies':
-                    [
-                        'runtimeobject.lib',
-                    ],
-                },
-            },
-        }],
-        ['target_os=="win"',
-        {
-            # TODO(cwallez): make this angle_enable_hlsl instead (requires gyp file refactoring)
-            'defines':
-            [
-                'ANGLE_ENABLE_HLSL',
-            ],
-            'sources':
-            [
-                '<@(angle_unittests_hlsl_sources)',
-            ],
-        }],
-    ],
-}
diff --git a/third_party/angle/src/tests/tests.gyp b/third_party/angle/src/tests/tests.gyp
deleted file mode 100644
index 702539f..0000000
--- a/third_party/angle/src/tests/tests.gyp
+++ /dev/null
@@ -1,362 +0,0 @@
-# Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-    'includes':
-    [
-        'deqp.gypi',
-        '../../gyp/common_defines.gypi',
-    ],
-    'variables':
-    {
-        'angle_build_conformance_tests%': '0',
-
-        'rapidjson_include_dir': 'third_party/rapidjson/include',
-        'rapidjson_headers':
-        [
-            'third_party/rapidjson/include/rapidjson/allocators.h',
-            'third_party/rapidjson/include/rapidjson/document.h',
-            'third_party/rapidjson/include/rapidjson/encodedstream.h',
-            'third_party/rapidjson/include/rapidjson/encodings.h',
-            'third_party/rapidjson/include/rapidjson/filereadstream.h',
-            'third_party/rapidjson/include/rapidjson/filestream.h',
-            'third_party/rapidjson/include/rapidjson/filewritestream.h',
-            'third_party/rapidjson/include/rapidjson/memorybuffer.h',
-            'third_party/rapidjson/include/rapidjson/memorystream.h',
-            'third_party/rapidjson/include/rapidjson/prettywriter.h',
-            'third_party/rapidjson/include/rapidjson/rapidjson.h',
-            'third_party/rapidjson/include/rapidjson/reader.h',
-            'third_party/rapidjson/include/rapidjson/stringbuffer.h',
-            'third_party/rapidjson/include/rapidjson/writer.h',
-            'third_party/rapidjson/include/rapidjson/error/en.h',
-            'third_party/rapidjson/include/rapidjson/error/error.h',
-            'third_party/rapidjson/include/rapidjson/internal/dtoa.h',
-            'third_party/rapidjson/include/rapidjson/internal/itoa.h',
-            'third_party/rapidjson/include/rapidjson/internal/meta.h',
-            'third_party/rapidjson/include/rapidjson/internal/pow10.h',
-            'third_party/rapidjson/include/rapidjson/internal/stack.h',
-            'third_party/rapidjson/include/rapidjson/internal/strfunc.h',
-            'third_party/rapidjson/include/rapidjson/msinttypes/inttypes.h',
-            'third_party/rapidjson/include/rapidjson/msinttypes/stdint.h',
-        ],
-    },
-    'conditions':
-    [
-        # GoogleTest doesn't support WinRT
-        ['angle_build_winrt==0',
-        {
-            'targets':
-            [
-                {
-                    'target_name': 'angle_test_support',
-                    'type': 'none',
-                    'dependencies':
-                    [
-                        'angle_internal_gmock',
-                        'angle_internal_gtest',
-                    ],
-                },
-            ],
-        }],
-        ['angle_build_winrt==0',
-        {
-            'targets':
-            [
-                # Hide these targets from Chromium, because it can't
-                # find our standalone copy of the gtest/gmock sources.
-                {
-                    'target_name': 'angle_internal_gtest',
-                    'type': 'static_library',
-                    'includes': [ '../../gyp/common_defines.gypi', ],
-                    'include_dirs':
-                    [
-                        '<(angle_path)/testing/gtest',
-                        '<(angle_path)/testing/gtest/include',
-                    ],
-                    'sources':
-                    [
-                        '<(angle_path)/testing/gtest/src/gtest-all.cc',
-                    ],
-                    'defines':
-                    [
-                        '_VARIADIC_MAX=10',
-                    ],
-                    'all_dependent_settings':
-                    {
-                        'defines':
-                        [
-                            '_VARIADIC_MAX=10',
-                        ],
-                        'include_dirs':
-                        [
-                            '<(angle_path)/testing/gtest',
-                            '<(angle_path)/testing/gtest/include',
-                        ],
-                    },
-                },
-
-                {
-                    'target_name': 'angle_internal_gmock',
-                    'type': 'static_library',
-                    'includes': [ '../../gyp/common_defines.gypi', ],
-                    'include_dirs':
-                    [
-                        '<(angle_path)/testing/gmock',
-                        '<(angle_path)/testing/gmock/include',
-                        '<(angle_path)/testing/gtest/include',
-                    ],
-                    'sources':
-                    [
-                        '<(angle_path)/testing/gmock/src/gmock-all.cc',
-                    ],
-                    'defines':
-                    [
-                        '_VARIADIC_MAX=10',
-                    ],
-                    'all_dependent_settings':
-                    {
-                        'defines':
-                        [
-                            '_VARIADIC_MAX=10',
-                        ],
-                        'include_dirs':
-                        [
-                            '<(angle_path)/testing/gmock',
-                            '<(angle_path)/testing/gmock/include',
-                            '<(angle_path)/testing/gtest/include',
-                        ],
-                    },
-                },
-
-                # These same target names exist on the Chromium side,
-                # which is forbidden, so we make them conditional on
-                # ANGLE's standalone build.
-                {
-                    'target_name': 'angle_unittests',
-                    'type': 'executable',
-                    'includes':
-                    [
-                        '../../gyp/common_defines.gypi',
-                        'angle_unittests.gypi',
-                    ],
-                    'sources':
-                    [
-                        'angle_unittests_main.cpp',
-                    ],
-                    'msvs_settings':
-                    {
-                        'VCLinkerTool':
-                        {
-                            'conditions':
-                            [
-                                ['angle_build_winrt==1',
-                                {
-                                    'AdditionalDependencies':
-                                    [
-                                        'runtimeobject.lib',
-                                    ],
-                                }],
-                            ],
-                        },
-                    },
-                    'msvs_disabled_warnings':
-                    [
-                        4244, # Conversion from 'type1' to 'type2', possible loss of data
-                    ],
-                },
-                {
-                    'target_name': 'angle_end2end_tests',
-                    'type': 'executable',
-                    'includes':
-                    [
-                        '../../gyp/common_defines.gypi',
-                        'angle_end2end_tests.gypi',
-                    ],
-                    'sources':
-                    [
-                        'angle_end2end_tests_main.cpp',
-                    ],
-                },
-                {
-                    'target_name': 'angle_white_box_tests',
-                    'type': 'executable',
-                    'includes':
-                    [
-                        '../../gyp/common_defines.gypi',
-                        'angle_white_box_tests.gypi',
-                    ],
-                    'sources':
-                    [
-                        'angle_white_box_tests_main.cpp',
-                    ],
-                },
-                {
-                    'target_name': 'angle_perftests',
-                    'type': 'executable',
-                    'includes':
-                    [
-                        '../../gyp/common_defines.gypi',
-                        'angle_perftests.gypi',
-                    ],
-                    'sources':
-                    [
-                        'angle_perftests_main.cpp',
-                    ],
-                },
-            ],
-        }],
-        ['target_os=="win"',
-        {
-            'conditions':
-            [
-                ['angle_build_conformance_tests',
-                {
-                    'variables':
-                    {
-                        'gles_conformance_tests_output_dir': '<(SHARED_INTERMEDIATE_DIR)/conformance_tests',
-                        'gles_conformance_tests_input_dir': 'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF',
-                        'gles_conformance_tests_generator_script': 'gles_conformance_tests/generate_gles_conformance_tests.py',
-                    },
-                    'targets':
-                    [
-                        {
-                            'target_name': 'angle_gles2_conformance_tests',
-                            'type': 'executable',
-                            'includes': [ '../../gyp/common_defines.gypi', ],
-                            'dependencies':
-                            [
-                                '<(angle_path)/src/angle.gyp:libGLESv2',
-                                '<(angle_path)/src/angle.gyp:libEGL',
-                                'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF/es_cts.gyp:es_cts_test_data',
-                                'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF/es_cts.gyp:es2_cts',
-                                'angle_test_support',
-                            ],
-                            'variables':
-                            {
-                                'gles2_conformance_tests_input_file': '<(gles_conformance_tests_input_dir)/mustpass_es20.run',
-                                'gles2_conformance_tests_generated_file': '<(gles_conformance_tests_output_dir)/generated_gles2_conformance_tests.cpp',
-                            },
-                            'sources':
-                            [
-                                'gles_conformance_tests/gles_conformance_tests.cpp',
-                                'gles_conformance_tests/gles_conformance_tests.h',
-                                'gles_conformance_tests/gles_conformance_tests_main.cpp',
-                                '<(gles2_conformance_tests_generated_file)',
-                            ],
-                            'include_dirs':
-                            [
-                                '<(angle_path)/include',
-                                'gles_conformance_tests',
-                            ],
-                            'defines':
-                            [
-                                'CONFORMANCE_TESTS_TYPE=CONFORMANCE_TESTS_ES2',
-                            ],
-                            'msvs_settings':
-                            {
-                                'VCCLCompilerTool':
-                                {
-                                    # MSVS has trouble compiling this due to the obj files becoming too large.
-                                    'AdditionalOptions': [ '/bigobj' ],
-                                },
-                            },
-                            'actions':
-                            [
-                                {
-                                    'action_name': 'generate_gles2_conformance_tests',
-                                    'message': 'Generating ES2 conformance tests...',
-                                    'msvs_cygwin_shell': 0,
-                                    'inputs':
-                                    [
-                                        '<(gles_conformance_tests_generator_script)',
-                                        '<(gles2_conformance_tests_input_file)',
-                                    ],
-                                    'outputs':
-                                    [
-                                        '<(gles2_conformance_tests_generated_file)',
-                                    ],
-                                    'action':
-                                    [
-                                        'python',
-                                        '<(gles_conformance_tests_generator_script)',
-                                        '<(gles2_conformance_tests_input_file)',
-                                        '<(gles_conformance_tests_input_dir)',
-                                        '<(gles2_conformance_tests_generated_file)',
-                                    ],
-                                },
-                            ],
-                        },
-                        {
-                            'target_name': 'angle_gles3_conformance_tests',
-                            'type': 'executable',
-                            'includes': [ '../../gyp/common_defines.gypi', ],
-                            'dependencies':
-                            [
-                                '<(angle_path)/src/angle.gyp:libGLESv2',
-                                '<(angle_path)/src/angle.gyp:libEGL',
-                                'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF/es_cts.gyp:es_cts_test_data',
-                                'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF/es_cts.gyp:es3_cts',
-                                'angle_test_support',
-                            ],
-                            'variables':
-                            {
-                                'gles3_conformance_tests_input_file': '<(gles_conformance_tests_input_dir)/mustpass_es30.run',
-                                'gles3_conformance_tests_generated_file': '<(gles_conformance_tests_output_dir)/generated_gles3_conformance_tests.cpp',
-                            },
-                            'sources':
-                            [
-                                'gles_conformance_tests/gles_conformance_tests.cpp',
-                                'gles_conformance_tests/gles_conformance_tests.h',
-                                'gles_conformance_tests/gles_conformance_tests_main.cpp',
-                                '<(gles3_conformance_tests_generated_file)',
-                            ],
-                            'include_dirs':
-                            [
-                                '<(angle_path)/include',
-                                'gles_conformance_tests',
-                            ],
-                            'defines':
-                            [
-                                'CONFORMANCE_TESTS_TYPE=CONFORMANCE_TESTS_ES3',
-                            ],
-                            'msvs_settings':
-                            {
-                                'VCCLCompilerTool':
-                                {
-                                    # MSVS has trouble compiling this due to the obj files becoming too large.
-                                    'AdditionalOptions': [ '/bigobj' ],
-                                },
-                            },
-                            'actions':
-                            [
-                                {
-                                    'action_name': 'generate_gles3_conformance_tests',
-                                    'message': 'Generating ES3 conformance tests...',
-                                    'msvs_cygwin_shell': 0,
-                                    'inputs':
-                                    [
-                                        '<(gles_conformance_tests_generator_script)',
-                                        '<(gles3_conformance_tests_input_file)',
-                                    ],
-                                    'outputs':
-                                    [
-                                        '<(gles3_conformance_tests_generated_file)',
-                                    ],
-                                    'action':
-                                    [
-                                        'python',
-                                        '<(gles_conformance_tests_generator_script)',
-                                        '<(gles3_conformance_tests_input_file)',
-                                        '<(gles_conformance_tests_input_dir)',
-                                        '<(gles3_conformance_tests_generated_file)',
-                                    ],
-                                },
-                            ],
-                        },
-                    ],
-                }],
-            ],
-        }],
-    ],
-}
diff --git a/third_party/angle/src/third_party/libXNVCtrl/libXNVCtrl.gyp b/third_party/angle/src/third_party/libXNVCtrl/libXNVCtrl.gyp
deleted file mode 100644
index dc0df78..0000000
--- a/third_party/angle/src/third_party/libXNVCtrl/libXNVCtrl.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2016 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-    'targets':
-    [{
-        'target_name': 'libXNVCtrl',
-        'type': 'static_library',
-        'sources':
-        [
-            'NVCtrl.c',
-            'NVCtrl.h',
-            'NVCtrlLib.h',
-            'nv_control.h',
-        ],
-    }],
-}
diff --git a/third_party/angle/src/vulkan_support/vulkan.gypi b/third_party/angle/src/vulkan_support/vulkan.gypi
deleted file mode 100644
index 2c821ba..0000000
--- a/third_party/angle/src/vulkan_support/vulkan.gypi
+++ /dev/null
@@ -1,1352 +0,0 @@
-# Copyright 2016 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-    'variables':
-    {
-        'glslang_path': '../../third_party/glslang-angle/src',
-        'spirv_headers_path': '../../third_party/spirv-headers/src',
-        'spirv_tools_path': '../../third_party/spirv-tools-angle/src',
-        'vulkan_layers_path': '../../third_party/vulkan-validation-layers/src',
-        'vulkan_json': 'angledata',
-        'vulkan_loader_sources':
-        [
-            '<(vulkan_layers_path)/loader/cJSON.c',
-            '<(vulkan_layers_path)/loader/cJSON.h',
-            '<(vulkan_layers_path)/loader/debug_report.c',
-            '<(vulkan_layers_path)/loader/debug_report.h',
-            '<(vulkan_layers_path)/loader/dev_ext_trampoline.c',
-            '<(vulkan_layers_path)/loader/extension_manual.c',
-            '<(vulkan_layers_path)/loader/extension_manual.h',
-            '<(vulkan_layers_path)/loader/gpa_helper.h',
-            '<(vulkan_layers_path)/loader/loader.c',
-            '<(vulkan_layers_path)/loader/loader.h',
-            '<(vulkan_layers_path)/loader/murmurhash.c',
-            '<(vulkan_layers_path)/loader/murmurhash.h',
-            '<(vulkan_layers_path)/loader/phys_dev_ext.c',
-            '<(vulkan_layers_path)/loader/trampoline.c',
-            '<(vulkan_layers_path)/loader/vk_loader_platform.h',
-            '<(vulkan_layers_path)/loader/wsi.c',
-            '<(vulkan_layers_path)/loader/wsi.h',
-        ],
-        'vulkan_loader_win_sources':
-        [
-            '<(vulkan_layers_path)/loader/dirent_on_windows.c',
-            '<(vulkan_layers_path)/loader/dirent_on_windows.h',
-        ],
-        'vulkan_loader_include_dirs':
-        [
-            '<(vulkan_layers_path)/include',
-            '<(vulkan_layers_path)/loader',
-        ],
-        'vulkan_loader_cflags_win':
-        [
-            '/wd4054', # Type cast from function pointer
-            '/wd4055', # Type cast from data pointer
-            '/wd4100', # Unreferenced formal parameter
-            '/wd4152', # Nonstandard extension used (pointer conversion)
-            '/wd4201', # Nonstandard extension used: nameless struct/union
-            '/wd4214', # Nonstandard extension used: bit field types other than int
-            '/wd4232', # Nonstandard extension used: address of dllimport is not static
-            '/wd4305', # Type cast truncation
-            '/wd4706', # Assignment within conditional expression
-            '/wd4996', # Unsafe stdlib function
-        ],
-        'vulkan_layer_generated_files':
-        [
-            '<(angle_gen_path)/vulkan/vk_enum_string_helper.h',
-            '<(angle_gen_path)/vulkan/vk_struct_size_helper.h',
-            '<(angle_gen_path)/vulkan/vk_struct_size_helper.c',
-            '<(angle_gen_path)/vulkan/vk_safe_struct.h',
-            '<(angle_gen_path)/vulkan/vk_safe_struct.cpp',
-            '<(angle_gen_path)/vulkan/vk_layer_dispatch_table.h',
-            '<(angle_gen_path)/vulkan/vk_dispatch_table_helper.h',
-            '<(angle_gen_path)/vulkan/vk_loader_extensions.h',
-            '<(angle_gen_path)/vulkan/vk_loader_extensions.c',
-            '<@(vulkan_gen_json_files_outputs)',
-        ],
-        'glslang_sources':
-        [
-            '<(glslang_path)/glslang/GenericCodeGen/CodeGen.cpp',
-            '<(glslang_path)/glslang/GenericCodeGen/Link.cpp',
-            '<(glslang_path)/glslang/Include/arrays.h',
-            '<(glslang_path)/glslang/Include/BaseTypes.h',
-            '<(glslang_path)/glslang/Include/Common.h',
-            '<(glslang_path)/glslang/Include/ConstantUnion.h',
-            '<(glslang_path)/glslang/Include/InfoSink.h',
-            '<(glslang_path)/glslang/Include/InitializeGlobals.h',
-            '<(glslang_path)/glslang/Include/intermediate.h',
-            '<(glslang_path)/glslang/Include/PoolAlloc.h',
-            '<(glslang_path)/glslang/Include/ResourceLimits.h',
-            '<(glslang_path)/glslang/Include/revision.h',
-            '<(glslang_path)/glslang/Include/ShHandle.h',
-            '<(glslang_path)/glslang/Include/Types.h',
-            '<(glslang_path)/glslang/MachineIndependent/Constant.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/gl_types.h',
-            '<(glslang_path)/glslang/MachineIndependent/glslang.y',
-            '<(glslang_path)/glslang/MachineIndependent/glslang_tab.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/glslang_tab.cpp.h',
-            '<(glslang_path)/glslang/MachineIndependent/InfoSink.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/Initialize.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/Initialize.h',
-            '<(glslang_path)/glslang/MachineIndependent/Intermediate.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/intermOut.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/IntermTraverse.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/iomapper.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/iomapper.h',
-            '<(glslang_path)/glslang/MachineIndependent/limits.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/linkValidate.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/LiveTraverser.h',
-            '<(glslang_path)/glslang/MachineIndependent/localintermediate.h',
-            '<(glslang_path)/glslang/MachineIndependent/parseConst.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/ParseContextBase.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/ParseHelper.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/ParseHelper.h',
-            '<(glslang_path)/glslang/MachineIndependent/parseVersions.h',
-            '<(glslang_path)/glslang/MachineIndependent/PoolAlloc.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/preprocessor/Pp.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/preprocessor/PpAtom.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/preprocessor/PpContext.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/preprocessor/PpContext.h',
-            '<(glslang_path)/glslang/MachineIndependent/preprocessor/PpMemory.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/preprocessor/PpScanner.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/preprocessor/PpSymbols.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/preprocessor/PpTokens.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/preprocessor/PpTokens.h',
-            '<(glslang_path)/glslang/MachineIndependent/propagateNoContraction.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/propagateNoContraction.h',
-            '<(glslang_path)/glslang/MachineIndependent/reflection.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/reflection.h',
-            '<(glslang_path)/glslang/MachineIndependent/RemoveTree.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/RemoveTree.h',
-            '<(glslang_path)/glslang/MachineIndependent/Scan.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/Scan.h',
-            '<(glslang_path)/glslang/MachineIndependent/ScanContext.h',
-            '<(glslang_path)/glslang/MachineIndependent/ShaderLang.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/SymbolTable.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/SymbolTable.h',
-            '<(glslang_path)/glslang/MachineIndependent/Versions.cpp',
-            '<(glslang_path)/glslang/MachineIndependent/Versions.h',
-            '<(glslang_path)/glslang/OSDependent/osinclude.h',
-            '<(glslang_path)/glslang/Public/ShaderLang.h',
-            '<(glslang_path)/hlsl/hlslAttributes.cpp',
-            '<(glslang_path)/hlsl/hlslAttributes.h',
-            '<(glslang_path)/hlsl/hlslGrammar.cpp',
-            '<(glslang_path)/hlsl/hlslGrammar.h',
-            '<(glslang_path)/hlsl/hlslOpMap.cpp',
-            '<(glslang_path)/hlsl/hlslOpMap.h',
-            '<(glslang_path)/hlsl/hlslParseables.cpp',
-            '<(glslang_path)/hlsl/hlslParseables.h',
-            '<(glslang_path)/hlsl/hlslParseHelper.cpp',
-            '<(glslang_path)/hlsl/hlslParseHelper.h',
-            '<(glslang_path)/hlsl/hlslScanContext.cpp',
-            '<(glslang_path)/hlsl/hlslScanContext.h',
-            '<(glslang_path)/hlsl/hlslTokens.h',
-            '<(glslang_path)/hlsl/hlslTokenStream.cpp',
-            '<(glslang_path)/hlsl/hlslTokenStream.h',
-            '<(glslang_path)/OGLCompilersDLL/InitializeDll.cpp',
-            '<(glslang_path)/OGLCompilersDLL/InitializeDll.h',
-            '<(glslang_path)/SPIRV/bitutils.h',
-            '<(glslang_path)/SPIRV/disassemble.cpp',
-            '<(glslang_path)/SPIRV/disassemble.h',
-            '<(glslang_path)/SPIRV/doc.cpp',
-            '<(glslang_path)/SPIRV/doc.h',
-            '<(glslang_path)/SPIRV/GLSL.ext.KHR.h',
-            '<(glslang_path)/SPIRV/GLSL.std.450.h',
-            '<(glslang_path)/SPIRV/GlslangToSpv.cpp',
-            '<(glslang_path)/SPIRV/GlslangToSpv.h',
-            '<(glslang_path)/SPIRV/hex_float.h',
-            '<(glslang_path)/SPIRV/InReadableOrder.cpp',
-            '<(glslang_path)/SPIRV/Logger.cpp',
-            '<(glslang_path)/SPIRV/Logger.h',
-            '<(glslang_path)/SPIRV/spirv.hpp',
-            '<(glslang_path)/SPIRV/SpvBuilder.cpp',
-            '<(glslang_path)/SPIRV/SpvBuilder.h',
-            '<(glslang_path)/SPIRV/spvIR.h',
-            '<(glslang_path)/StandAlone/ResourceLimits.cpp',
-            '<(glslang_path)/StandAlone/ResourceLimits.h',
-        ],
-        'glslang_win_sources':
-        [
-            '<(glslang_path)/glslang/OSDependent/Windows/ossource.cpp',
-        ],
-        'glslang_unix_sources':
-        [
-            '<(glslang_path)/glslang/OSDependent/Unix/ossource.cpp',
-        ],
-        'spirv_tools_sources':
-        [
-            '<(angle_gen_path)/vulkan/core.insts-1.0.inc',
-            '<(angle_gen_path)/vulkan/core.insts-1.1.inc',
-            '<(angle_gen_path)/vulkan/generators.inc',
-            '<(angle_gen_path)/vulkan/glsl.std.450.insts-1.0.inc',
-            '<(angle_gen_path)/vulkan/opencl.std.insts-1.0.inc',
-            '<(angle_gen_path)/vulkan/operand.kinds-1.0.inc',
-            '<(angle_gen_path)/vulkan/operand.kinds-1.1.inc',
-            '<(spirv_tools_path)/source/assembly_grammar.cpp',
-            '<(spirv_tools_path)/source/assembly_grammar.h',
-            '<(spirv_tools_path)/source/binary.cpp',
-            '<(spirv_tools_path)/source/binary.h',
-            '<(spirv_tools_path)/source/diagnostic.cpp',
-            '<(spirv_tools_path)/source/diagnostic.h',
-            '<(spirv_tools_path)/source/disassemble.cpp',
-            '<(spirv_tools_path)/source/enum_set.h',
-            '<(spirv_tools_path)/source/ext_inst.cpp',
-            '<(spirv_tools_path)/source/ext_inst.h',
-            '<(spirv_tools_path)/source/instruction.h',
-            '<(spirv_tools_path)/source/libspirv.cpp',
-            '<(spirv_tools_path)/source/macro.h',
-            '<(spirv_tools_path)/source/message.cpp',
-            '<(spirv_tools_path)/source/name_mapper.cpp',
-            '<(spirv_tools_path)/source/name_mapper.h',
-            '<(spirv_tools_path)/source/opcode.cpp',
-            '<(spirv_tools_path)/source/opcode.h',
-            '<(spirv_tools_path)/source/operand.cpp',
-            '<(spirv_tools_path)/source/operand.h',
-            '<(spirv_tools_path)/source/parsed_operand.cpp',
-            '<(spirv_tools_path)/source/parsed_operand.h',
-            '<(spirv_tools_path)/source/print.cpp',
-            '<(spirv_tools_path)/source/print.h',
-            # TODO(jmadill): Determine if this is ever needed.
-            #'<(spirv_tools_path)/source/software_version.cpp',
-            '<(spirv_tools_path)/source/spirv_constant.h',
-            '<(spirv_tools_path)/source/spirv_definition.h',
-            '<(spirv_tools_path)/source/spirv_endian.cpp',
-            '<(spirv_tools_path)/source/spirv_endian.h',
-            '<(spirv_tools_path)/source/spirv_target_env.cpp',
-            '<(spirv_tools_path)/source/spirv_target_env.h',
-            '<(spirv_tools_path)/source/table.cpp',
-            '<(spirv_tools_path)/source/table.h',
-            '<(spirv_tools_path)/source/text.cpp',
-            '<(spirv_tools_path)/source/text.h',
-            '<(spirv_tools_path)/source/text_handler.cpp',
-            '<(spirv_tools_path)/source/text_handler.h',
-            '<(spirv_tools_path)/source/util/bitutils.h',
-            '<(spirv_tools_path)/source/util/hex_float.h',
-            '<(spirv_tools_path)/source/util/parse_number.cpp',
-            '<(spirv_tools_path)/source/util/parse_number.h',
-            '<(spirv_tools_path)/source/val/basic_block.cpp',
-            '<(spirv_tools_path)/source/val/construct.cpp',
-            '<(spirv_tools_path)/source/val/function.cpp',
-            '<(spirv_tools_path)/source/val/instruction.cpp',
-            '<(spirv_tools_path)/source/val/validation_state.cpp',
-            '<(spirv_tools_path)/source/validate.cpp',
-            '<(spirv_tools_path)/source/validate.h',
-            '<(spirv_tools_path)/source/validate_cfg.cpp',
-            '<(spirv_tools_path)/source/validate_datarules.cpp',
-            '<(spirv_tools_path)/source/validate_id.cpp',
-            '<(spirv_tools_path)/source/validate_instruction.cpp',
-            '<(spirv_tools_path)/source/validate_layout.cpp',
-        ],
-        'vulkan_layer_utils_sources':
-        [
-            '<(vulkan_layers_path)/layers/vk_layer_config.cpp',
-            '<(vulkan_layers_path)/layers/vk_layer_config.h',
-            '<(vulkan_layers_path)/layers/vk_layer_extension_utils.cpp',
-            '<(vulkan_layers_path)/layers/vk_layer_extension_utils.h',
-            '<(vulkan_layers_path)/layers/vk_layer_utils.cpp',
-            '<(vulkan_layers_path)/layers/vk_layer_utils.h',
-        ],
-        'vulkan_struct_wrappers_outputs':
-        [
-            '<(angle_gen_path)/vulkan/vk_safe_struct.cpp',
-            '<(angle_gen_path)/vulkan/vk_safe_struct.h',
-            '<(angle_gen_path)/vulkan/vk_struct_size_helper.c',
-            '<(angle_gen_path)/vulkan/vk_struct_size_helper.h',
-            '<(angle_gen_path)/vulkan/vk_struct_string_helper.h',
-            '<(angle_gen_path)/vulkan/vk_struct_string_helper_cpp.h',
-        ],
-        'VkLayer_core_validation_sources':
-        [
-            # This file is manually included in the layer
-            # '<(angle_gen_path)/vulkan/vk_safe_struct.cpp',
-            '<(angle_gen_path)/vulkan/vk_safe_struct.h',
-            '<(vulkan_layers_path)/layers/buffer_validation.cpp',
-            '<(vulkan_layers_path)/layers/buffer_validation.h',
-            '<(vulkan_layers_path)/layers/core_validation.cpp',
-            '<(vulkan_layers_path)/layers/core_validation.h',
-            '<(vulkan_layers_path)/layers/descriptor_sets.cpp',
-            '<(vulkan_layers_path)/layers/descriptor_sets.h',
-        ],
-        'VkLayer_swapchain_sources':
-        [
-            '<(vulkan_layers_path)/layers/swapchain.cpp',
-            '<(vulkan_layers_path)/layers/swapchain.h',
-        ],
-        'VkLayer_object_tracker_sources':
-        [
-            '<(vulkan_layers_path)/layers/object_tracker.cpp',
-            '<(vulkan_layers_path)/layers/object_tracker.h',
-        ],
-        'VkLayer_unique_objects_sources':
-        [
-            '<(angle_gen_path)/vulkan/unique_objects_wrappers.h',
-            # This file is manually included in the layer
-            # '<(angle_gen_path)/vulkan/vk_safe_struct.cpp',
-            '<(angle_gen_path)/vulkan/vk_safe_struct.h',
-            '<(vulkan_layers_path)/layers/unique_objects.cpp',
-            '<(vulkan_layers_path)/layers/unique_objects.h',
-        ],
-        'VkLayer_threading_sources':
-        [
-            '<(angle_gen_path)/vulkan/thread_check.h',
-            '<(vulkan_layers_path)/layers/threading.cpp',
-            '<(vulkan_layers_path)/layers/threading.h',
-        ],
-        'VkLayer_parameter_validation_sources':
-        [
-            '<(angle_gen_path)/vulkan/parameter_validation.h',
-            '<(vulkan_layers_path)/layers/parameter_validation.cpp',
-        ],
-        'vulkan_gen_json_files_sources_win':
-        [
-            '<(vulkan_layers_path)/layers/windows/VkLayer_core_validation.json',
-            '<(vulkan_layers_path)/layers/windows/VkLayer_object_tracker.json',
-            '<(vulkan_layers_path)/layers/windows/VkLayer_parameter_validation.json',
-            '<(vulkan_layers_path)/layers/windows/VkLayer_swapchain.json',
-            '<(vulkan_layers_path)/layers/windows/VkLayer_threading.json',
-            '<(vulkan_layers_path)/layers/windows/VkLayer_unique_objects.json',
-        ],
-        'vulkan_gen_json_files_sources_linux':
-        [
-            '<(vulkan_layers_path)/layers/linux/VkLayer_core_validation.json',
-            '<(vulkan_layers_path)/layers/linux/VkLayer_object_tracker.json',
-            '<(vulkan_layers_path)/layers/linux/VkLayer_parameter_validation.json',
-            '<(vulkan_layers_path)/layers/linux/VkLayer_swapchain.json',
-            '<(vulkan_layers_path)/layers/linux/VkLayer_threading.json',
-            '<(vulkan_layers_path)/layers/linux/VkLayer_unique_objects.json',
-        ],
-        'vulkan_gen_json_files_outputs':
-        [
-            '<(PRODUCT_DIR)/<(vulkan_json)/VkLayer_core_validation.json',
-            '<(PRODUCT_DIR)/<(vulkan_json)/VkLayer_object_tracker.json',
-            '<(PRODUCT_DIR)/<(vulkan_json)/VkLayer_parameter_validation.json',
-            '<(PRODUCT_DIR)/<(vulkan_json)/VkLayer_swapchain.json',
-            '<(PRODUCT_DIR)/<(vulkan_json)/VkLayer_threading.json',
-            '<(PRODUCT_DIR)/<(vulkan_json)/VkLayer_unique_objects.json',
-        ],
-    },
-    'conditions':
-    [
-        ['angle_enable_vulkan==1',
-        {
-            'targets':
-            [
-                {
-                    'target_name': 'glslang',
-                    'type': 'static_library',
-                    'sources':
-                    [
-                        '<@(glslang_sources)',
-                    ],
-                    'include_dirs':
-                    [
-                        '<(glslang_path)',
-                    ],
-                    'msvs_settings':
-                    {
-                        'VCCLCompilerTool':
-                        {
-                            'PreprocessorDefinitions':
-                            [
-                                '_HAS_EXCEPTIONS=0',
-                            ],
-                            'AdditionalOptions':
-                            [
-                                '/wd4100', # Unreferenced formal parameter
-                                '/wd4456', # Declaration hides previous local declaration
-                                '/wd4457', # Declaration hides function parameter
-                                '/wd4458', # Declaration hides class member
-                                '/wd4702', # Unreachable code (from glslang_tab.cpp)
-                                '/wd4718', # Recursive call has no side effects (from PpContext.cpp)
-                            ],
-                        },
-                    },
-                    'direct_dependent_settings':
-                    {
-                        'include_dirs':
-                        [
-                            '<(glslang_path)/glslang/Public',
-                            '<(glslang_path)',
-                        ],
-                    },
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<@(glslang_win_sources)',
-                            ],
-                        }],
-                        ['OS=="linux"',
-                        {
-                            'sources':
-                            [
-                                '<@(glslang_unix_sources)',
-                            ],
-                        }],
-                    ],
-                },
-
-                {
-                    'target_name': 'spirv_tools',
-                    'type': 'static_library',
-                    'sources':
-                    [
-                        '<@(spirv_tools_sources)',
-                    ],
-                    'include_dirs':
-                    [
-                        '<(angle_gen_path)/vulkan',
-                        '<(spirv_headers_path)/include',
-                        '<(spirv_tools_path)/include',
-                        '<(spirv_tools_path)/source',
-                    ],
-                    'msvs_settings':
-                    {
-                        'VCCLCompilerTool':
-                        {
-                            'PreprocessorDefinitions':
-                            [
-                                '_HAS_EXCEPTIONS=0',
-                            ],
-                            'AdditionalOptions':
-                            [
-                                '/wd4127', # Conditional expression is constant, happens in a template in hex_float.h.
-                                '/wd4706', # Assignment within conditional expression
-                                '/wd4996', # Unsafe stdlib function
-                            ],
-                        },
-                    },
-                    'actions':
-                    [
-                        {
-                            'action_name': 'spirv_tools_gen_build_tables_1_0',
-                            'message': 'generating info tables for SPIR-V 1.0 instructions and operands',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(spirv_headers_path)/include/spirv/1.0/extinst.glsl.std.450.grammar.json',
-                                '<(spirv_headers_path)/include/spirv/1.0/spirv.core.grammar.json',
-                                '<(spirv_tools_path)/source/extinst-1.0.opencl.std.grammar.json',
-                                '<(spirv_tools_path)/utils/generate_grammar_tables.py',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/core.insts-1.0.inc',
-                                '<(angle_gen_path)/vulkan/glsl.std.450.insts-1.0.inc',
-                                '<(angle_gen_path)/vulkan/opencl.std.insts-1.0.inc',
-                                '<(angle_gen_path)/vulkan/operand.kinds-1.0.inc',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(spirv_tools_path)/utils/generate_grammar_tables.py',
-                                '--spirv-core-grammar=<(spirv_headers_path)/include/spirv/1.0/spirv.core.grammar.json',
-                                '--extinst-glsl-grammar=<(spirv_headers_path)/include/spirv/1.0/extinst.glsl.std.450.grammar.json',
-                                '--extinst-opencl-grammar=<(spirv_tools_path)/source/extinst-1.0.opencl.std.grammar.json',
-                                '--core-insts-output=<(angle_gen_path)/vulkan/core.insts-1.0.inc',
-                                '--glsl-insts-output=<(angle_gen_path)/vulkan/glsl.std.450.insts-1.0.inc',
-                                '--opencl-insts-output=<(angle_gen_path)/vulkan/opencl.std.insts-1.0.inc',
-                                '--operand-kinds-output=<(angle_gen_path)/vulkan/operand.kinds-1.0.inc',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'spirv_tools_gen_build_tables_1_1',
-                            'message': 'generating info tables for SPIR-V 1.1 instructions and operands',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(spirv_tools_path)/utils/generate_grammar_tables.py',
-                                '<(spirv_headers_path)/include/spirv/1.1/spirv.core.grammar.json',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/core.insts-1.1.inc',
-                                '<(angle_gen_path)/vulkan/operand.kinds-1.1.inc',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(spirv_tools_path)/utils/generate_grammar_tables.py',
-                                '--spirv-core-grammar=<(spirv_headers_path)/include/spirv/1.1/spirv.core.grammar.json',
-                                '--core-insts-output=<(angle_gen_path)/vulkan/core.insts-1.1.inc',
-                                '--operand-kinds-output=<(angle_gen_path)/vulkan/operand.kinds-1.1.inc',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'spirv_tools_gen_generators_inc',
-                            'message': 'generating generators.inc for SPIRV-Tools',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(spirv_tools_path)/utils/generate_registry_tables.py',
-                                '<(spirv_headers_path)/include/spirv/spir-v.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/generators.inc',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(spirv_tools_path)/utils/generate_registry_tables.py',
-                                '--xml=<(spirv_headers_path)/include/spirv/spir-v.xml',
-                                '--generator-output=<(angle_gen_path)/vulkan/generators.inc',
-                            ],
-                        },
-                    ],
-
-                    'direct_dependent_settings':
-                    {
-                        'include_dirs':
-                        [
-                            '<(spirv_headers_path)/include',
-                            '<(spirv_tools_path)/include',
-                        ],
-                    },
-                },
-
-                {
-                    'target_name': 'vulkan_layer_utils_static',
-                    'type': 'static_library',
-                    'msvs_cygwin_shell': 0,
-                    'sources':
-                    [
-                        '<@(vulkan_layer_utils_sources)',
-                    ],
-                    'include_dirs':
-                    [
-                        '<(angle_gen_path)/vulkan',
-                        '<@(vulkan_loader_include_dirs)',
-                    ],
-                    'msvs_settings':
-                    {
-                        'VCCLCompilerTool':
-                        {
-                            'PreprocessorDefinitions':
-                            [
-                                '_HAS_EXCEPTIONS=0',
-                            ],
-                            'AdditionalOptions':
-                            [
-                                '/wd4100', # Unreferenced formal parameter
-                                '/wd4309', # Truncation of constant value
-                                '/wd4505', # Unreferenced local function has been removed
-                                '/wd4996', # Unsafe stdlib function
-                            ],
-                        },
-                    },
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'defines':
-                            [
-                                'WIN32',
-                                'WIN32_LEAN_AND_MEAN',
-                                'VK_USE_PLATFORM_WIN32_KHR',
-                                'VK_USE_PLATFORM_WIN32_KHX',
-                            ],
-                        }],
-                        ['OS=="linux"',
-                        {
-                            'defines':
-                            [
-                                'VK_USE_PLATFORM_XCB_KHR',
-                                'VK_USE_PLATFORM_XCB_KHX',
-                            ],
-                        }],
-                    ],
-                    'direct_dependent_settings':
-                    {
-                        'msvs_cygwin_shell': 0,
-                        'sources':
-                        [
-                            '<(vulkan_layers_path)/layers/vk_layer_table.cpp',
-                            '<(vulkan_layers_path)/layers/vk_layer_table.h',
-                        ],
-                        'include_dirs':
-                        [
-                            '<(angle_gen_path)/vulkan',
-                            '<(glslang_path)',
-                            '<(vulkan_layers_path)/layers',
-                            '<@(vulkan_loader_include_dirs)',
-                        ],
-                        'msvs_settings':
-                        {
-                            'VCCLCompilerTool':
-                            {
-                                'PreprocessorDefinitions':
-                                [
-                                    '_HAS_EXCEPTIONS=0',
-                                ],
-                                'AdditionalOptions':
-                                [
-                                    '/wd4100', # Unreferenced local parameter
-                                    '/wd4201', # Nonstandard extension used: nameless struct/union
-                                    '/wd4456', # declaration hides previous local declaration
-                                    '/wd4505', # Unreferenced local function has been removed
-                                    '/wd4996', # Unsafe stdlib function
-                                ],
-                            }
-                        },
-                        'conditions':
-                        [
-                            ['target_os=="win"',
-                            {
-                                'defines':
-                                [
-                                    'WIN32_LEAN_AND_MEAN',
-                                    'VK_USE_PLATFORM_WIN32_KHR',
-                                    'VK_USE_PLATFORM_WIN32_KHX',
-                                ],
-                                'configurations':
-                                {
-                                    'Debug_Base':
-                                    {
-                                        'msvs_settings':
-                                        {
-                                            'VCCLCompilerTool':
-                                            {
-                                                'AdditionalOptions':
-                                                [
-                                                    '/bigobj',
-                                                ],
-                                            },
-                                        },
-                                    },
-                                },
-                            }],
-                            ['OS=="linux"',
-                            {
-                                'defines':
-                                [
-                                    'VK_USE_PLATFORM_XCB_KHR',
-                                    'VK_USE_PLATFORM_XCB_KHX',
-                                ],
-                            }],
-                        ],
-                    },
-
-                    'actions':
-                    [
-                        # Duplicate everything because of GYP limitations.
-                        {
-                            'action_name': 'vulkan_run_vk_xml_generate_vk_enum_string_helper_h',
-                            'message': 'generating vk_enum_string_helper.h',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/helper_file_generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/vk_enum_string_helper.h'
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                 '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml',
-                                'vk_enum_string_helper.h', '-quiet',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'vulkan_run_vk_xml_generate_vk_struct_size_helper_h',
-                            'message': 'generating vk_struct_size_helper.h',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/helper_file_generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/vk_struct_size_helper.h'
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                 '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml',
-                                'vk_struct_size_helper.h', '-quiet',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'vulkan_run_vk_xml_generate_vk_struct_size_helper_c',
-                            'message': 'generating vk_struct_size_helper.c',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/helper_file_generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/vk_struct_size_helper.c'
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                 '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml',
-                                'vk_struct_size_helper.c', '-quiet',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'vulkan_run_vk_xml_generate_vk_safe_struct_h',
-                            'message': 'generating vk_safe_struct.h',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/helper_file_generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/vk_safe_struct.h'
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                 '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml',
-                                'vk_safe_struct.h', '-quiet',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'vulkan_run_vk_xml_generate_vk_safe_struct_cpp',
-                            'message': 'generating vk_safe_struct.cpp',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/helper_file_generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/vk_safe_struct.cpp'
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                 '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml',
-                                'vk_safe_struct.cpp', '-quiet',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'vulkan_run_vk_xml_generate_vk_layer_dispatch_table_h',
-                            'message': 'generating vk_layer_dispatch_table.h',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/loader_extension_generator.py',
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/vk_layer_dispatch_table.h',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py', '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml', 'vk_layer_dispatch_table.h', '-quiet',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'vulkan_run_vk_xml_generate_vk_dispatch_table_helper_h',
-                            'message': 'generating vk_dispatch_table_helper.h',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/dispatch_table_helper_generator.py',
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/vk_dispatch_table_helper.h',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py', '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml', 'vk_dispatch_table_helper.h', '-quiet',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'vulkan_run_vk_xml_generate_vk_loader_extensions_h',
-                            'message': 'generating vk_loader_extensions.h',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/loader_extension_generator.py',
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/vk_loader_extensions.h',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py', '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml', 'vk_loader_extensions.h', '-quiet',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'vulkan_run_vk_xml_generate_vk_loader_extensions_c',
-                            'message': 'generating vk_loader_extensions.c',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/loader_extension_generator.py',
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/vk_loader_extensions.c',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py', '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml', 'vk_loader_extensions.c', '-quiet',
-                            ],
-                        },
-
-                        {
-                            'action_name': 'vulkan_generate_json_files',
-                            'message': 'generating Vulkan json files',
-                            'inputs':
-                            [
-                                '<(angle_path)/scripts/generate_vulkan_layers_json.py',
-                            ],
-                            'outputs':
-                            [
-                                '<@(vulkan_gen_json_files_outputs)',
-                            ],
-                            'conditions':
-                            [
-                                ['target_os=="win"',
-                                {
-                                    'inputs':
-                                    [
-                                        '<@(vulkan_gen_json_files_sources_win)',
-                                    ],
-                                    'action':
-                                    [
-                                        'python2', '<(angle_path)/scripts/generate_vulkan_layers_json.py',
-                                        '<(vulkan_layers_path)/layers/windows', '<(PRODUCT_DIR)/<(vulkan_json)',
-                                    ],
-                                }],
-                                ['OS=="linux"',
-                                {
-                                    'inputs':
-                                    [
-                                        '<@(vulkan_gen_json_files_sources_linux)',
-                                    ],
-                                    'action':
-                                    [
-                                        'python2', '<(angle_path)/scripts/generate_vulkan_layers_json.py',
-                                        '<(vulkan_layers_path)/layers/linux', '<(PRODUCT_DIR)/<(vulkan_json)',
-                                    ],
-                                }],
-                            ],
-                        },
-                    ],
-                },
-
-                {
-                    'target_name': 'vulkan_loader',
-                    'type': 'static_library',
-                    'sources':
-                    [
-                        '<@(vulkan_loader_sources)',
-                    ],
-                    'include_dirs':
-                    [
-                        '<@(vulkan_loader_include_dirs)',
-                        '<(angle_gen_path)/vulkan',
-                    ],
-                    'defines':
-                    [
-                        'API_NAME="Vulkan"',
-                        'VULKAN_NON_CMAKE_BUILD',
-                    ],
-                    'msvs_settings':
-                    {
-                        'VCCLCompilerTool':
-                        {
-                            'AdditionalOptions':
-                            [
-                                # TODO(jmadill): Force include header on other platforms.
-                                '<@(vulkan_loader_cflags_win)',
-                                '/FIangle_loader.h'
-                            ],
-                        },
-                        'VCLinkerTool':
-                        {
-                            'AdditionalDependencies':
-                            [
-                                'shlwapi.lib',
-                            ],
-                        },
-                    },
-                    'direct_dependent_settings':
-                    {
-                        'include_dirs':
-                        [
-                            '<@(vulkan_loader_include_dirs)',
-                        ],
-                        'msvs_settings':
-                        {
-                            'VCLinkerTool':
-                            {
-                                'AdditionalDependencies':
-                                [
-                                    'shlwapi.lib',
-                                ],
-                            },
-                        },
-                        'conditions':
-                        [
-                            ['target_os=="win"',
-                            {
-                                'defines':
-                                [
-                                    'VK_USE_PLATFORM_WIN32_KHR',
-                                    'VK_USE_PLATFORM_WIN32_KHX',
-                                ],
-                            }],
-                            ['OS=="linux"',
-                            {
-                                'defines':
-                                [
-                                    'VK_USE_PLATFORM_XCB_KHR',
-                                    'VK_USE_PLATFORM_XCB_KHX',
-                                ],
-                            }],
-                        ],
-                    },
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<(angle_gen_path)/vulkan/angle_loader.h',
-                                '<@(vulkan_loader_win_sources)',
-                            ],
-                            'defines':
-                            [
-                                'VK_USE_PLATFORM_WIN32_KHR',
-                                'VK_USE_PLATFORM_WIN32_KHX',
-                            ],
-                        }],
-                        ['OS=="linux"',
-                        {
-                            'defines':
-                            [
-                                'DEFAULT_VK_LAYERS_PATH="."',
-                                'HAVE_SECURE_GETENV',
-                                'LAYERS_SOURCE_PATH="<(vulkan_json)"',
-                                'VK_USE_PLATFORM_XCB_KHR',
-                                'VK_USE_PLATFORM_XCB_KHX',
-                            ],
-                        }],
-                    ],
-                    'actions':
-                    [
-                        {
-                            # The loader header is force included into the loader and layers. Because
-                            # of issues with GYP, we can't use a normal header file, we hav to force
-                            # inclue this using compiler-specific flags.
-                            'action_name': 'vulkan_loader_gen_angle_header',
-                            'message': 'generating Vulkan loader ANGLE header',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(angle_path)/scripts/generate_vulkan_header.py',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/angle_loader.h',
-                            ],
-                            'action':
-                            [
-                                # TODO(jmadill): Use correct platform path
-                                'python2', '<(angle_path)/scripts/generate_vulkan_header.py', '<(PRODUCT_DIR)/<(vulkan_json)',
-                                '<(angle_gen_path)/vulkan/angle_loader.h', '<(PRODUCT_DIR)',
-                            ],
-                        },
-                        {
-                            'action_name': 'vulkan_loader_order_deps',
-                            'message': 'stamping for vulkan_loader_order_deps',
-                            'msvs_cygwin_shell': 0,
-                            'inputs': [ '<@(vulkan_layer_generated_files)' ],
-                            'outputs': [ '<(angle_gen_path)/vulkan/vulkan_loader_order_deps.stamp' ],
-                            'action':
-                            [
-                                'python2', '<(angle_path)/gyp/touch_stamp.py',
-                                '<(angle_gen_path)/vulkan/vulkan_loader_order_deps.stamp',
-                            ]
-                        },
-                    ],
-                },
-
-                {
-                    'target_name': 'VkLayer_core_validation',
-                    'type': 'shared_library',
-                    'dependencies':
-                    [
-                        'spirv_tools',
-                        'vulkan_layer_utils_static',
-                    ],
-                    'sources':
-                    [
-                        '<@(VkLayer_core_validation_sources)',
-                    ],
-                    'actions':
-                    [
-                        {
-                            'action_name': 'layer_core_validation_order_deps',
-                            'message': 'stamping for layer_core_validation_order_deps',
-                            'msvs_cygwin_shell': 0,
-                            'inputs': [ '<@(vulkan_layer_generated_files)' ],
-                            'outputs': [ '<(angle_gen_path)/vulkan/layer_core_validation_order_deps.stamp' ],
-                            'action':
-                            [
-                                'python2', '<(angle_path)/gyp/touch_stamp.py',
-                                '<(angle_gen_path)/vulkan/layer_core_validation_order_deps.stamp',
-                            ]
-                        },
-                    ],
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<(vulkan_layers_path)/layers/VkLayer_core_validation.def',
-                            ]
-                        }],
-                    ],
-                },
-
-                {
-                    'target_name': 'VkLayer_swapchain',
-                    'type': 'shared_library',
-                    'dependencies':
-                    [
-                        'vulkan_layer_utils_static',
-                    ],
-                    'sources':
-                    [
-                        '<@(VkLayer_swapchain_sources)',
-                    ],
-                    'actions':
-                    [
-                        {
-                            'action_name': 'layer_swapchain_order_deps',
-                            'message': 'stamping for layer_swapchain_order_deps',
-                            'msvs_cygwin_shell': 0,
-                            'inputs': [ '<@(vulkan_layer_generated_files)' ],
-                            'outputs': [ '<(angle_gen_path)/vulkan/layer_swapchain_order_deps.stamp' ],
-                            'action':
-                            [
-                                'python2', '<(angle_path)/gyp/touch_stamp.py',
-                                '<(angle_gen_path)/vulkan/layer_swapchain_order_deps.stamp',
-                            ]
-                        },
-                    ],
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<(vulkan_layers_path)/layers/VkLayer_swapchain.def',
-                            ]
-                        }],
-                    ],
-                },
-
-                {
-                    'target_name': 'VkLayer_object_tracker',
-                    'type': 'shared_library',
-                    'dependencies':
-                    [
-                        'vulkan_layer_utils_static',
-                    ],
-                    'sources':
-                    [
-                        '<@(VkLayer_object_tracker_sources)',
-                    ],
-                    'actions':
-                    [
-                        {
-                            'action_name': 'layer_object_tracker_order_deps',
-                            'message': 'stamping for layer_object_tracker_order_deps',
-                            'msvs_cygwin_shell': 0,
-                            'inputs': [ '<@(vulkan_layer_generated_files)' ],
-                            'outputs': [ '<(angle_gen_path)/vulkan/layer_object_tracker_order_deps.stamp' ],
-                            'action':
-                            [
-                                'python2', '<(angle_path)/gyp/touch_stamp.py',
-                                '<(angle_gen_path)/vulkan/layer_object_tracker_order_deps.stamp',
-                            ]
-                        },
-                    ],
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<(vulkan_layers_path)/layers/VkLayer_object_tracker.def',
-                            ]
-                        }],
-                    ],
-                },
-
-                {
-                    'target_name': 'VkLayer_unique_objects',
-                    'type': 'shared_library',
-                    'dependencies':
-                    [
-                        'vulkan_layer_utils_static',
-                    ],
-                    'sources':
-                    [
-                        '<@(VkLayer_unique_objects_sources)',
-                    ],
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<(vulkan_layers_path)/layers/VkLayer_unique_objects.def',
-                            ]
-                        }],
-                    ],
-                    'actions':
-                    [
-                        {
-                            'action_name': 'layer_unique_objects_order_deps',
-                            'message': 'stamping for layer_unique_objects_order_deps',
-                            'msvs_cygwin_shell': 0,
-                            'inputs': [ '<@(vulkan_layer_generated_files)' ],
-                            'outputs': [ '<(angle_gen_path)/vulkan/layer_unique_objects_order_deps.stamp' ],
-                            'action':
-                            [
-                                'python2', '<(angle_path)/gyp/touch_stamp.py',
-                                '<(angle_gen_path)/vulkan/layer_unique_objects_order_deps.stamp',
-                            ]
-                        },
-                        {
-                            'action_name': 'vulkan_layer_unique_objects_generate',
-                            'message': 'generating Vulkan unique_objects helpers',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/unique_objects_generator.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/unique_objects_wrappers.h',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py', '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml', 'unique_objects_wrappers.h', '-quiet',
-                            ],
-                        },
-                    ],
-                },
-
-                {
-                    'target_name': 'VkLayer_threading',
-                    'type': 'shared_library',
-                    'dependencies':
-                    [
-                        'vulkan_layer_utils_static',
-                    ],
-                    'sources':
-                    [
-                        '<@(VkLayer_threading_sources)',
-                    ],
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<(vulkan_layers_path)/layers/VkLayer_threading.def',
-                            ]
-                        }],
-                    ],
-                    'actions':
-                    [
-                        {
-                            'action_name': 'layer_threading_order_deps',
-                            'message': 'stamping for layer_threading_order_deps',
-                            'msvs_cygwin_shell': 0,
-                            'inputs': [ '<@(vulkan_layer_generated_files)' ],
-                            'outputs': [ '<(angle_gen_path)/vulkan/layer_threading_order_deps.stamp' ],
-                            'action':
-                            [
-                                'python2', '<(angle_path)/gyp/touch_stamp.py',
-                                '<(angle_gen_path)/vulkan/layer_threading_order_deps.stamp',
-                            ]
-                        },
-                        {
-                            'action_name': 'vulkan_layer_threading_generate',
-                            'message': 'generating Vulkan threading header',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/thread_check.h',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py', '-o',
-                                '<(angle_gen_path)/vulkan', '-registry', '<(vulkan_layers_path)/scripts/vk.xml',
-                                'thread_check.h', '-quiet',
-                            ],
-                        },
-                    ],
-                },
-
-                {
-                    'target_name': 'VkLayer_parameter_validation',
-                    'type': 'shared_library',
-                    'dependencies':
-                    [
-                        'vulkan_layer_utils_static',
-                    ],
-                    'sources':
-                    [
-                        '<@(VkLayer_parameter_validation_sources)',
-                    ],
-                    'conditions':
-                    [
-                        ['target_os=="win"',
-                        {
-                            'sources':
-                            [
-                                '<(vulkan_layers_path)/layers/VkLayer_parameter_validation.def',
-                            ]
-                        }],
-                    ],
-                    'actions':
-                    [
-                        {
-                            'action_name': 'layer_parameter_validation_order_deps',
-                            'message': 'stamping for layer_parameter_validation_order_deps',
-                            'msvs_cygwin_shell': 0,
-                            'inputs': [ '<@(vulkan_layer_generated_files)' ],
-                            'outputs': [ '<(angle_gen_path)/vulkan/layer_parameter_validation_order_deps.stamp' ],
-                            'action':
-                            [
-                                'python2', '<(angle_path)/gyp/touch_stamp.py',
-                                '<(angle_gen_path)/vulkan/layer_parameter_validation_order_deps.stamp',
-                            ]
-                        },
-                        {
-                            'action_name': 'vulkan_layer_parameter_validation_generate',
-                            'message': 'generating Vulkan parameter_validation header',
-                            'msvs_cygwin_shell': 0,
-                            'inputs':
-                            [
-                                '<(vulkan_layers_path)/scripts/generator.py',
-                                '<(vulkan_layers_path)/scripts/lvl_genvk.py',
-                                '<(vulkan_layers_path)/scripts/reg.py',
-                                '<(vulkan_layers_path)/scripts/vk.xml',
-                            ],
-                            'outputs':
-                            [
-                                '<(angle_gen_path)/vulkan/parameter_validation.h',
-                            ],
-                            'action':
-                            [
-                                'python2', '<(vulkan_layers_path)/scripts/lvl_genvk.py', '-o', '<(angle_gen_path)/vulkan',
-                                '-registry', '<(vulkan_layers_path)/scripts/vk.xml', 'parameter_validation.h', '-quiet',
-                            ],
-                        },
-                    ],
-                },
-
-                {
-                    'target_name': 'angle_vulkan',
-                    'type': 'none',
-                    'dependencies':
-                    [
-                        'glslang',
-                        # Need to disable these to prevent multiply defined symbols with ninja.
-                        # TODO(jmadill): Figure out how to implement data_deps in gyp.
-                        # 'VkLayer_core_validation',
-                        # 'VkLayer_object_tracker',
-                        # 'VkLayer_parameter_validation',
-                        # 'VkLayer_swapchain',
-                        # 'VkLayer_threading',
-                        # 'VkLayer_unique_objects',
-                        'vulkan_loader',
-                    ],
-                    'export_dependent_settings':
-                    [
-                        'glslang',
-                        'vulkan_loader',
-                    ],
-                }
-            ],
-        }],
-    ],
-}
diff --git a/third_party/aom_includes/aom_includes.gyp b/third_party/aom_includes/aom_includes.gyp
deleted file mode 100644
index 6a1805d..0000000
--- a/third_party/aom_includes/aom_includes.gyp
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'aom',
-      'type': 'none',
-      'direct_dependent_settings': {
-        'include_dirs': [ 'aom.1.0.0' ],
-      },
-    },
-  ],
-}
diff --git a/third_party/blink/Source/bindings/scripts/blink_idl_lexer.py b/third_party/blink/Source/bindings/scripts/blink_idl_lexer.py
index 31a71ff..8405f40 100644
--- a/third_party/blink/Source/bindings/scripts/blink_idl_lexer.py
+++ b/third_party/blink/Source/bindings/scripts/blink_idl_lexer.py
@@ -135,7 +135,7 @@
     try:
         outputdir = argv[1]
     except IndexError as err:
-        print 'Usage: %s OUTPUT_DIR' % argv[0]
+        print('Usage: %s OUTPUT_DIR' % argv[0])
         return 1
     # Important: rewrite_tables=True causes the cache file to be deleted if it
     # exists, thus making sure that PLY doesn't load it instead of regenerating
diff --git a/third_party/blink/Source/bindings/scripts/blink_idl_parser.py b/third_party/blink/Source/bindings/scripts/blink_idl_parser.py
index 7fbfd77..2fc8a40 100644
--- a/third_party/blink/Source/bindings/scripts/blink_idl_parser.py
+++ b/third_party/blink/Source/bindings/scripts/blink_idl_parser.py
@@ -66,7 +66,10 @@
 
 # Base parser is in Chromium src/tools/idl_parser
 tools_dir = os.path.join(module_path, os.pardir, os.pardir, os.pardir, os.pardir, os.pardir, 'tools')
+idl_parser_dir = os.path.join(module_path, os.pardir, os.pardir, os.pardir, os.pardir, os.pardir, 'tools', 'idl_parser')
 sys.path.append(tools_dir)
+sys.path.append(idl_parser_dir)
+
 from idl_parser.idl_parser import IDLParser, ListFromConcat
 from idl_parser.idl_parser import ParseFile as parse_file
 
@@ -393,7 +396,7 @@
     try:
         outputdir = argv[1]
     except IndexError as err:
-        print 'Usage: %s OUTPUT_DIR' % argv[0]
+        print('Usage: %s OUTPUT_DIR' % argv[0])
         return 1
     blink_idl_lexer.main(argv)
     # Important: rewrite_tables=True causes the cache file to be deleted if it
diff --git a/third_party/blink/Source/bindings/scripts/code_generator.py b/third_party/blink/Source/bindings/scripts/code_generator.py
index e6e1764..d66ba4f 100644
--- a/third_party/blink/Source/bindings/scripts/code_generator.py
+++ b/third_party/blink/Source/bindings/scripts/code_generator.py
@@ -171,7 +171,7 @@
         cache_dir = argv[1]
         dummy_filename = argv[2]
     except IndexError:
-        print 'Usage: %s CACHE_DIR DUMMY_FILENAME' % argv[0]
+        print('Usage: %s CACHE_DIR DUMMY_FILENAME' % argv[0])
         return 1
 
     # Cache templates
diff --git a/third_party/blink/Source/bindings/scripts/compute_global_objects.py b/third_party/blink/Source/bindings/scripts/compute_global_objects.py
index 183f066..f925502 100755
--- a/third_party/blink/Source/bindings/scripts/compute_global_objects.py
+++ b/third_party/blink/Source/bindings/scripts/compute_global_objects.py
@@ -68,7 +68,7 @@
     extended_attributes = get_interface_extended_attributes_from_idl(idl_file_contents)
 
     global_keys = GLOBAL_EXTENDED_ATTRIBUTES.intersection(
-        extended_attributes.iterkeys())
+        extended_attributes.keys())
     if not global_keys:
         return
     if len(global_keys) > 1:
diff --git a/third_party/blink/Source/bindings/scripts/compute_interfaces_info_individual.py b/third_party/blink/Source/bindings/scripts/compute_interfaces_info_individual.py
index 6799f9a..7f14694 100755
--- a/third_party/blink/Source/bindings/scripts/compute_interfaces_info_individual.py
+++ b/third_party/blink/Source/bindings/scripts/compute_interfaces_info_individual.py
@@ -222,7 +222,7 @@
         this_union_types = collect_union_types_from_definitions(definitions)
         self.union_types.update(this_union_types)
         self.typedefs.update(definitions.typedefs)
-        for callback_function_name, callback_function in definitions.callback_functions.iteritems():
+        for callback_function_name, callback_function in definitions.callback_functions.items():
             # Set 'component_dir' to specify a directory that callback function files belong to
             self.callback_functions[callback_function_name] = {
                 'callback_function': callback_function,
@@ -231,9 +231,9 @@
             }
 
         # Include more information about the enum for Cobalt.
-        for enum_name, values in definitions.enumerations.iteritems():
+        for enum_name, values in definitions.enumerations.items():
             # Check enum duplication.
-            if self.enumerations.has_key(enum_name):
+            if enum_name in self.enumerations:
                 raise Exception('Enumeration %s has multiple definitions' % enum_name)
             self.enumerations[enum_name] = {
                 'values': values,
@@ -241,7 +241,7 @@
             }
 
         if definitions.interfaces:
-            definition = next(definitions.interfaces.itervalues())
+            definition = next(iter(definitions.interfaces.values()))
             interface_info = {
                 'is_callback_interface': definition.is_callback,
                 'is_dictionary': False,
@@ -258,7 +258,7 @@
                 'unsupported': 'NotSupported' in definition.extended_attributes,
             }
         elif definitions.dictionaries:
-            definition = next(definitions.dictionaries.itervalues())
+            definition = next(iter(definitions.dictionaries.values()))
             interface_info = {
                 'is_callback_interface': False,
                 'is_dictionary': True,
diff --git a/third_party/blink/Source/bindings/scripts/compute_interfaces_info_overall.py b/third_party/blink/Source/bindings/scripts/compute_interfaces_info_overall.py
index e7ae0d5..d62ea48 100755
--- a/third_party/blink/Source/bindings/scripts/compute_interfaces_info_overall.py
+++ b/third_party/blink/Source/bindings/scripts/compute_interfaces_info_overall.py
@@ -131,12 +131,12 @@
 
     Needed for merging partial_interface_files across components.
     """
-    for key, value in other.iteritems():
+    for key, value in other.items():
         if key not in existing:
             existing[key] = value
             continue
         existing_value = existing[key]
-        for inner_key, inner_value in value.iteritems():
+        for inner_key, inner_value in value.items():
             existing_value[inner_key].extend(inner_value)
 
 
@@ -174,7 +174,7 @@
     garbage_collected_interfaces = set()
     callback_interfaces = set()
 
-    for interface_name, interface_info in interfaces_info.iteritems():
+    for interface_name, interface_info in interfaces_info.items():
         component_dirs[interface_name] = idl_filename_to_component(interface_info['full_path'])
 
         if interface_info['ancestors']:
@@ -191,7 +191,7 @@
 
     # Record a list of all interface names
     interfaces_info['all_interfaces'] = set(
-        interface_name for interface_name, info in interfaces_info.iteritems()
+        interface_name for interface_name, info in interfaces_info.items()
             if not info['is_dependency'])
 
     interfaces_info['ancestors'] = ancestors
@@ -227,11 +227,11 @@
 
 
     # Record inheritance information individually
-    for interface_name, interface_info in interfaces_info.iteritems():
+    for interface_name, interface_info in interfaces_info.items():
         extended_attributes = interface_info['extended_attributes']
         inherited_extended_attributes_by_interface[interface_name] = dict(
                 (key, value)
-                for key, value in extended_attributes.iteritems()
+                for key, value in extended_attributes.items()
                 if key in INHERITED_EXTENDED_ATTRIBUTES)
         parent = interface_info['parent']
         if parent:
@@ -249,14 +249,14 @@
     # to implement*ing* interface (lhs of 'implements').
     # Note that moving an 'implements' statement between implementing and
     # implemented files does not change the info (or hence cause a rebuild)!
-    for right_interface_name, interface_info in interfaces_info.iteritems():
+    for right_interface_name, interface_info in interfaces_info.items():
         for left_interface_name in interface_info['implemented_by_interfaces']:
             interfaces_info[left_interface_name]['implements_interfaces'].append(right_interface_name)
         del interface_info['implemented_by_interfaces']
 
     # An IDL file's dependencies are partial interface files that extend it,
     # and files for other interfaces that this interfaces implements.
-    for interface_name, interface_info in interfaces_info.iteritems():
+    for interface_name, interface_info in interfaces_info.items():
         partial_interface_paths = partial_interface_files[interface_name]
         partial_interfaces_full_paths = partial_interface_paths['full_paths']
         # Partial interface definitions each need an include, as they are
@@ -319,7 +319,7 @@
         })
 
     # Clean up temporary private information
-    for interface_info in interfaces_info.itervalues():
+    for interface_info in interfaces_info.values():
         del interface_info['extended_attributes']
         del interface_info['union_types']
         del interface_info['is_legacy_treat_as_partial_interface']
diff --git a/third_party/blink/Source/bindings/scripts/generate_global_constructors.py b/third_party/blink/Source/bindings/scripts/generate_global_constructors.py
index 16c9165..31e4f65 100755
--- a/third_party/blink/Source/bindings/scripts/generate_global_constructors.py
+++ b/third_party/blink/Source/bindings/scripts/generate_global_constructors.py
@@ -108,7 +108,7 @@
 def generate_global_constructors_list(interface_name, extended_attributes):
     extended_attributes_list = [
             name + ('=' + extended_attributes[name] if extended_attributes[name] else "")
-            for name in 'Conditional', 'RuntimeEnabled', 'OriginTrialEnabled', 'NotSupported'
+            for name in ['Conditional', 'RuntimeEnabled', 'OriginTrialEnabled', 'NotSupported']
             if name in extended_attributes]
     if extended_attributes_list:
         extended_string = '[%s] ' % ', '.join(extended_attributes_list)
diff --git a/third_party/blink/Source/bindings/scripts/global_constructors.gypi b/third_party/blink/Source/bindings/scripts/global_constructors.gypi
deleted file mode 100644
index df0629c..0000000
--- a/third_party/blink/Source/bindings/scripts/global_constructors.gypi
+++ /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 meant to be included into a target to provide an action
-# to compute global objects in a component.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'core_global_constructors_idls',
-#   'dependencies': [
-#     'component_global_objects',
-#   ],
-#   'variables': {
-#     'idl_files': '<(list_of_idl_files)',
-#     'global_objects_file': '<(some_dir)/GlobalObjectsComponent.pickle',
-#     'global_names_idl_files': [
-#       'GlobalName',
-#       '<(blink_core_output_dir)/GlobalScopeComponentConstructors.idl',
-#       # ...
-#     ],
-#     'outputs': [
-#       '<@(component_global_constructors_generated_idl_files)',
-#       '<@(component_global_constructors_generated_header_files)',
-#     ],
-#   },
-#   'includes': ['path/to/this/gypi/file'],
-# },
-#
-# Required variables:
-#  idl_files - List of .idl files that will be searched in.
-#    This should *only* contain main IDL files, excluding dependencies and
-#    testing, which should not appear on global objects.
-#  global_objects - Pickle file of global objects.
-#  global_names_idl_files - pairs (GlobalName, Constructors.idl)
-#  outputs - List of output files.
-#    Passed as a variable here, included by the template in the action.
-#
-# Spec: http://heycam.github.io/webidl/#Global
-#       http://heycam.github.io/webidl/#Exposed
-# Design document: http://www.chromium.org/developers/design-documents/idl-build
-
-{
-  'type': 'none',
-  'actions': [{
-    'action_name': 'generate_<(_target_name)',
-    'message': 'Generating IDL files for constructors on global objects for <(_target_name)',
-    'variables': {
-      'idl_files_list': '<|(<(_target_name)_idl_files_list.tmp <@(idl_files))',
-    },
-    'includes': ['scripts.gypi'],
-    'inputs': [
-      '<(bindings_scripts_dir)/generate_global_constructors.py',
-      '<(bindings_scripts_dir)/utilities.py',
-      '<(idl_files_list)',
-      '<@(idl_files)',
-      '<(global_objects_file)',
-    ],
-    'outputs': ['<@(outputs)'],
-    'action': [
-      'python2',
-      '<(bindings_scripts_dir)/generate_global_constructors.py',
-      '--idl-files-list',
-      '<(idl_files_list)',
-      '--global-objects-file',
-      '<(global_objects_file)',
-      '--',
-      '<@(global_names_idl_files)',
-    ],
-  }],
-}
diff --git a/third_party/blink/Source/bindings/scripts/global_objects.gypi b/third_party/blink/Source/bindings/scripts/global_objects.gypi
deleted file mode 100644
index feb909f..0000000
--- a/third_party/blink/Source/bindings/scripts/global_objects.gypi
+++ /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.
-#
-# This file is meant to be included into a target to provide an action
-# to compute global objects in a component.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'component_global_objects',
-#   'variables': {
-#     'idl_files': '<(list_of_idl_files)',
-#     'input_files': ['<(some_dir)/GlobalObjectBaseComponent.pickle'],
-#     'output_file': '<(some_dir)/GlobalObjectsComponent.pickle',
-#   },
-#   'includes': ['path/to/this/gypi/file'],
-# },
-#
-# Required variables:
-#  idl_files - List of .idl files that will be searched in.
-#    This should *only* contain main IDL files, excluding dependencies and
-#    testing, which should not define global objects.
-#  output_file - Pickle file of output.
-#
-# Optional variables:
-#  input_files - List of input pickle files of global objects in base
-#    components. In this case make sure to include a dependencies section
-#    in the target to ensure this is generated.
-#
-# Spec: http://heycam.github.io/webidl/#Global
-# Design document: http://www.chromium.org/developers/design-documents/idl-build
-
-{
-  'type': 'none',
-  'actions': [{
-    'action_name': 'compute_<(_target_name)',
-    'message': 'Computing global objects for <(_target_name)',
-    'variables': {
-      'input_files%': [],
-      'idl_files_list': '<|(<(_target_name)_idl_files_list.tmp <@(idl_files))',
-    },
-    'includes': ['scripts.gypi'],
-    'inputs': [
-      '<(bindings_scripts_dir)/compute_global_objects.py',
-      '<(bindings_scripts_dir)/utilities.py',
-      '<(idl_files_list)',
-      '<@(idl_files)',
-    ],
-    'outputs': [
-      '<(output_file)',
-    ],
-    'action': [
-      'python2',
-      '<(bindings_scripts_dir)/compute_global_objects.py',
-      '--idl-files-list',
-      '<(idl_files_list)',
-      '--',
-      '<@(input_files)',
-      '<(output_file)',
-     ],
-  }],
-}
diff --git a/third_party/blink/Source/bindings/scripts/idl_definitions.py b/third_party/blink/Source/bindings/scripts/idl_definitions.py
index 57b0091..67a2565 100644
--- a/third_party/blink/Source/bindings/scripts/idl_definitions.py
+++ b/third_party/blink/Source/bindings/scripts/idl_definitions.py
@@ -139,22 +139,22 @@
 
     def accept(self, visitor):
         visitor.visit_definitions(self)
-        for interface in self.interfaces.itervalues():
+        for interface in self.interfaces.values():
             interface.accept(visitor)
-        for callback_function in self.callback_functions.itervalues():
+        for callback_function in self.callback_functions.values():
             callback_function.accept(visitor)
-        for dictionary in self.dictionaries.itervalues():
+        for dictionary in self.dictionaries.values():
             dictionary.accept(visitor)
-        for enumeration in self.enumerations.itervalues():
+        for enumeration in self.enumerations.values():
             enumeration.accept(visitor)
         for implement in self.implements:
             implement.accept(visitor)
-        for typedef in self.typedefs.itervalues():
+        for typedef in self.typedefs.values():
             typedef.accept(visitor)
 
     def update(self, other):
         """Update with additional IdlDefinitions."""
-        for interface_name, new_interface in other.interfaces.iteritems():
+        for interface_name, new_interface in other.interfaces.items():
             if not new_interface.is_partial:
                 # Add as new interface
                 self.interfaces[interface_name] = new_interface
@@ -358,7 +358,7 @@
             else:
                 raise ValueError('Unrecognized node class: %s' % child_class)
 
-        if len(filter(None, [self.iterable, self.maplike, self.setlike])) > 1:
+        if len(list(filter(None, [self.iterable, self.maplike, self.setlike]))) > 1:
             raise ValueError('Interface can only have one of iterable<>, maplike<> and setlike<>.')
 
         if has_integer_typed_length and has_indexed_property_getter:
@@ -474,6 +474,9 @@
     def accept(self, visitor):
         visitor.visit_attribute(self)
 
+    def __lt__(self, other):
+        return id(self) < id(other)
+
 
 ################################################################################
 # Constants
diff --git a/third_party/blink/Source/bindings/scripts/idl_reader.py b/third_party/blink/Source/bindings/scripts/idl_reader.py
index c0c6c6e..3cf8d4a 100644
--- a/third_party/blink/Source/bindings/scripts/idl_reader.py
+++ b/third_party/blink/Source/bindings/scripts/idl_reader.py
@@ -55,8 +55,8 @@
          definitions. There is no filename convention in this case.
        - Otherwise, an IDL file is invalid.
     """
-    targets = (definitions.interfaces.values() +
-               definitions.dictionaries.values())
+    targets = (list(definitions.interfaces.values()) +
+               list(definitions.dictionaries.values()))
     number_of_targets = len(targets)
     if number_of_targets > 1:
         raise Exception(
diff --git a/third_party/blink/Source/bindings/scripts/idl_validator.py b/third_party/blink/Source/bindings/scripts/idl_validator.py
index e5f9c54..2cda3b7 100644
--- a/third_party/blink/Source/bindings/scripts/idl_validator.py
+++ b/third_party/blink/Source/bindings/scripts/idl_validator.py
@@ -52,7 +52,7 @@
 
     def validate_extended_attributes(self, definitions):
         # FIXME: this should be done when parsing the file, rather than after.
-        for interface in definitions.interfaces.itervalues():
+        for interface in definitions.interfaces.values():
             self.validate_extended_attributes_node(interface)
             for attribute in interface.attributes:
                 self.validate_extended_attributes_node(attribute)
@@ -62,7 +62,7 @@
                     self.validate_extended_attributes_node(argument)
 
     def validate_extended_attributes_node(self, node):
-        for name, values_string in node.extended_attributes.iteritems():
+        for name, values_string in node.extended_attributes.items():
             self.validate_name_values_string(name, values_string)
 
     def validate_name_values_string(self, name, values_string):
diff --git a/third_party/blink/Source/bindings/scripts/interface_dependency_resolver.py b/third_party/blink/Source/bindings/scripts/interface_dependency_resolver.py
index 1a8a7b0..fb0459f 100644
--- a/third_party/blink/Source/bindings/scripts/interface_dependency_resolver.py
+++ b/third_party/blink/Source/bindings/scripts/interface_dependency_resolver.py
@@ -103,7 +103,7 @@
                             'this definition: %s, because this should '
                             'have a dictionary.' % definitions.idl_name)
 
-        target_interface = next(definitions.interfaces.itervalues())
+        target_interface = next(iter(definitions.interfaces.values()))
         interface_name = target_interface.name
         interface_info = self.interfaces_info[interface_name]
 
@@ -163,7 +163,7 @@
         # so interfaces will get merged together.
         dependency_component = component
 
-        dependency_interface = next(dependency_definitions.interfaces.itervalues())
+        dependency_interface = next(iter(dependency_definitions.interfaces.values()))
         dependency_interface_basename, _ = os.path.splitext(os.path.basename(dependency_idl_filename))
 
         transfer_extended_attributes(dependency_interface,
@@ -341,8 +341,8 @@
         cpp_includes.update(interface.get('cpp_includes', {}).get(component, {}))
         return unforgeable_attributes, referenced_interfaces, cpp_includes
 
-    for component, definitions in resolved_definitions.iteritems():
-        for interface_name, interface in definitions.interfaces.iteritems():
+    for component, definitions in resolved_definitions.items():
+        for interface_name, interface in definitions.interfaces.items():
             interface_info = interfaces_info[interface_name]
             inherited_unforgeable_attributes, referenced_interfaces, cpp_includes = collect_unforgeable_attributes_in_ancestors(interface_info.get('parent'), component)
             # This loop may process the same interface many times, so it's
diff --git a/third_party/blink/Source/bindings/scripts/interfaces_info_individual.gypi b/third_party/blink/Source/bindings/scripts/interfaces_info_individual.gypi
deleted file mode 100644
index 51cc447..0000000
--- a/third_party/blink/Source/bindings/scripts/interfaces_info_individual.gypi
+++ /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 is meant to be included into a target to provide an action
-# to compute information about individual interfaces defined in a component.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'interfaces_info_individual_component',
-#   'dependencies': [
-#     'generated_idls_target',
-#   ],
-#   'variables': {
-#     'static_idl_files': '<(component_static_idl_files)',
-#     'generated_idl_files': '<(component_generated_idl_files)',
-#     'output_file':
-#       '<(bindings_core_output_dir)/InterfacesInfoComponentIndividual.pickle',
-#   },
-#   'includes': ['path/to/this/gypi/file'],
-# },
-#
-# Required variables:
-#  static_idl_files - All static .idl files for the component, including
-#    dependencies and testing.
-#  generated_idl_files - All generated .idl files for the component.
-#    (Must be separate from static because build dir not know at gyp time.)
-#  interfaces_info_file - Output pickle file containing interfaces info.
-#  component_info_file - Output pickle file containing component-wide info.
-#
-# Design document: http://www.chromium.org/developers/design-documents/idl-build
-
-{
-  'type': 'none',
-  'actions': [{
-    'action_name': 'compute_<(_target_name)',
-    'message': 'Computing global information about individual IDL files for <(_target_name)',
-    'variables': {
-      'static_idl_files_list':
-        '<|(<(_target_name)_static_idl_files_list.tmp <@(static_idl_files))',
-    },
-    'inputs': [
-      '<(bindings_scripts_dir)/compute_interfaces_info_individual.py',
-      '<(bindings_scripts_dir)/utilities.py',
-      '<(extended_attributes_file)',
-      '<(static_idl_files_list)',
-      '<@(static_idl_files)',
-      '<@(generated_idl_files)',
-      '<@(dependency_idl_files)',
-    ],
-    'outputs': [
-      '<(interfaces_info_file)',
-      '<(component_info_file)',
-    ],
-
-    'action': [
-      'python2',
-      '<(bindings_scripts_dir)/compute_interfaces_info_individual.py',
-      '--cache-directory',
-      '<(cache_directory)',
-      '--root-directory',
-      '<(root_directory)',
-      '--idl-files-list',
-      '<(static_idl_files_list)',
-      '--dependency-idl-files',
-      '<(dependency_idl_files)',
-      '--interfaces-info-file',
-      '<(interfaces_info_file)',
-      '--component-info-file',
-      '<(component_info_file)',
-      '--extended-attributes',
-      '<(extended_attributes_file)',
-      '--',
-      # Generated files must be passed at command line
-      '<@(generated_idl_files)',
-    ],
-  }],
-}
diff --git a/third_party/blink/Source/bindings/scripts/interfaces_info_overall.gypi b/third_party/blink/Source/bindings/scripts/interfaces_info_overall.gypi
deleted file mode 100644
index d593e07..0000000
--- a/third_party/blink/Source/bindings/scripts/interfaces_info_overall.gypi
+++ /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.
-#
-# This file is meant to be included into a target to provide an action
-# to compute overall information about interfaces defined in a component.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'interfaces_info_component',
-#   'dependencies': [
-#       'interfaces_info_individual_base_component',
-#       'interfaces_info_individual_component',
-#   ],
-#   'variables': {
-#     'input_files': [
-#       '<(bindings_base_component_output_dir)/InterfacesInfoBaseComponentIndividual.pickle',
-#       '<(bindings_component_output_dir)/InterfacesInfoComponentIndividual.pickle',
-#     ],
-#     'output_file':
-#       '<(bindings_component_output_dir)/InterfacesInfoComponent.pickle',
-#   },
-#   'includes': ['path/to/this/gypi/file'],
-# },
-#
-# Required variables:
-#  input_files - Pickle files containing info about individual interfaces, both
-#    current component and any base components.
-#  output_file - Pickle file containing output (overall info).
-#
-# Design document: http://www.chromium.org/developers/design-documents/idl-build
-
-{
-  'type': 'none',
-  'actions': [{
-    'action_name': 'compute_<(_target_name)',
-    'message': 'Computing overall global information about IDL files for <(_target_name)',
-
-    'inputs': [
-      '<(bindings_scripts_dir)/compute_interfaces_info_overall.py',
-      '<@(input_files)',
-    ],
-    'outputs': [
-      '<(output_file)',
-    ],
-    'action': [
-      'python2',
-      '<(bindings_scripts_dir)/compute_interfaces_info_overall.py',
-      '--',
-      '<@(input_files)',
-      '<(output_file)',
-    ],
-  }],
-}
diff --git a/third_party/blink/Source/bindings/scripts/overload_set_algorithm.py b/third_party/blink/Source/bindings/scripts/overload_set_algorithm.py
index 15b4168..ee69120 100644
--- a/third_party/blink/Source/bindings/scripts/overload_set_algorithm.py
+++ b/third_party/blink/Source/bindings/scripts/overload_set_algorithm.py
@@ -158,7 +158,7 @@
     # Filter to only methods that are actually overloaded
     method_counts = Counter(method['name'] for method in methods)
     overloaded_method_names = set(name
-                                  for name, count in method_counts.iteritems())
+                                  for name, count in method_counts.items())
     overloaded_methods = [method for method in methods
                           if method['name'] in overloaded_method_names]
 
diff --git a/third_party/blink/Source/bindings/scripts/scripts.gypi b/third_party/blink/Source/bindings/scripts/scripts.gypi
deleted file mode 100644
index 7bde4d3..0000000
--- a/third_party/blink/Source/bindings/scripts/scripts.gypi
+++ /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.
-
-{
-  'variables': {
-    'bindings_scripts_dir': '.',
-    'bindings_scripts_output_dir%': '<(SHARED_INTERMEDIATE_DIR)/blink/bindings/scripts',
-    'jinja_module_files': [
-      # jinja2/__init__.py contains version string, so sufficient for package
-      '<(DEPTH)/third_party/jinja2/__init__.py',
-      '<(DEPTH)/third_party/markupsafe/__init__.py',  # jinja2 dep
-    ],
-    'idl_lexer_parser_files': [
-      # PLY (Python Lex-Yacc)
-      '<(DEPTH)/third_party/ply/lex.py',
-      '<(DEPTH)/third_party/ply/yacc.py',
-      # Web IDL lexer/parser (base parser)
-      '<(DEPTH)/tools/idl_parser/idl_lexer.py',
-      '<(DEPTH)/tools/idl_parser/idl_node.py',
-      '<(DEPTH)/tools/idl_parser/idl_parser.py',
-      # Blink IDL lexer/parser/constructor
-      'blink_idl_lexer.py',
-      'blink_idl_parser.py',
-    ],
-    'idl_compiler_files': [
-       'idl_compiler.py',
-
-       # Blink IDL front end (ex-lexer/parser)
-       'idl_definitions.py',
-       'idl_reader.py',
-       'idl_types.py',
-       'idl_validator.py',
-       'interface_dependency_resolver.py',
-
-       # V8 code generator
-       'code_generator.py',
-       'code_generator_v8.py',
-       'code_generator_web_agent_api.py',
-       'v8_attributes.py',
-       'v8_callback_function.py',
-       'v8_callback_interface.py',
-       'v8_dictionary.py',
-       'v8_globals.py',
-       'v8_interface.py',
-       'v8_methods.py',
-       'v8_types.py',
-       'v8_union.py',
-       'v8_utilities.py',
-    ],
-    'idl_cache_files': [
-      '<(bindings_scripts_output_dir)/lextab.py',
-      '<(bindings_scripts_output_dir)/parsetab.pickle',
-      '<(bindings_scripts_output_dir)/cached_jinja_templates.stamp',
-    ],
-  },
-}
diff --git a/third_party/blink/Source/bindings/scripts/utilities.py b/third_party/blink/Source/bindings/scripts/utilities.py
index bfcebe2..7b35933 100644
--- a/third_party/blink/Source/bindings/scripts/utilities.py
+++ b/third_party/blink/Source/bindings/scripts/utilities.py
@@ -8,10 +8,9 @@
 """
 
 import os
-import cPickle as pickle
+import pickle
 import re
 import shlex
-import string
 import subprocess
 
 # All of Cobalt's interfaces are under either the cobalt/, starboard/ or
@@ -264,7 +263,7 @@
     |target| will be updated with |diff|.  Part of |diff| may be re-used in
     |target|.
     """
-    for key, value in diff.iteritems():
+    for key, value in diff.items():
         if key not in target:
             target[key] = value
         elif type(value) == dict:
@@ -362,7 +361,7 @@
 
 
 def read_pickle_file(pickle_filename):
-    with open(pickle_filename) as pickle_file:
+    with open(pickle_filename, 'rb') as pickle_file:
         return pickle.load(pickle_file)
 
 
@@ -376,7 +375,7 @@
     destination_dirname = os.path.dirname(destination_filename)
     if not os.path.exists(destination_dirname):
         os.makedirs(destination_dirname)
-    with open(destination_filename, 'wb') as destination_file:
+    with open(destination_filename, 'w') as destination_file:
         destination_file.write(new_text)
 
 
@@ -390,7 +389,7 @@
             except Exception:
                 # If trouble unpickling, overwrite
                 pass
-    with open(pickle_filename, 'w') as pickle_file:
+    with open(pickle_filename, 'wb') as pickle_file:
         pickle.dump(data, pickle_file)
 
 
@@ -447,7 +446,7 @@
              # Discard empty parts, which may exist due to trailing comma
              if extended_attribute.strip()]
     for part in parts:
-        name, _, value = map(string.strip, part.partition('='))
+        name, _, value = map(lambda x: x.strip(), part.partition('='))
         extended_attributes[name] = value
     return extended_attributes
 
@@ -462,7 +461,7 @@
     if not match:
         return None
     arguments = []
-    for argument in map(string.strip, match.group(1).split(',')):
+    for argument in map(lambda x: x.strip(), match.group(1).split(',')):
         exposed, runtime_enabled = argument.split()
         arguments.append({'exposed': exposed, 'runtime_enabled': runtime_enabled})
 
diff --git a/third_party/boringssl/BUILD.gn b/third_party/boringssl/BUILD.gn
index 430b77e..b4d4974 100644
--- a/third_party/boringssl/BUILD.gn
+++ b/third_party/boringssl/BUILD.gn
@@ -183,5 +183,4 @@
     ":crypto",
     "//starboard",
   ]
-  content_deps = [ "//third_party/icu:icudata" ]
 }
diff --git a/third_party/boringssl/boringssl.gyp b/third_party/boringssl/boringssl.gyp
deleted file mode 100644
index 585fd34..0000000
--- a/third_party/boringssl/boringssl.gyp
+++ /dev/null
@@ -1,256 +0,0 @@
-# Copyright 2017 Google Inc. All Rights Reserved.
-{
-  'variables': {
-    'asm_target_arch%': '<(target_arch)',
-    'boringssl_root%': '<(DEPTH)/third_party/boringssl/src',
-    'optimize_target_for_speed': 1,
-  },
-
-  'target_defaults': {
-    # Turn off bad-function-cast warning, as BoringSSL violates this sometimes.
-    'defines': [
-      'PURIFY',
-      'TERMIO',
-      '_REENTRANT',
-    ],
-    'cflags': [
-      '-fPIC',
-      '-fvisibility=hidden',
-    ],
-    'cflags_c': [
-      '-std=gnu99',
-      '-Wno-bad-function-cast',
-    ],
-    'cflags_c!': [
-      '-Wbad-function-cast',
-    ],
-
-    'ldflags': [
-      '-fPIC',
-    ],
-
-    'type': '<(library)',
-
-    'conditions': [
-      ['OS=="starboard"', {
-        'variables': {
-          'openssl_config_path': '<(boringssl_root)/config/starboard',
-        },
-        'dependencies': [
-          '<(DEPTH)/starboard/client_porting/eztime/eztime.gyp:eztime',
-          '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-        ],
-        'sources!': [
-          '<(boringssl_root)/crypto/rand_extra/deterministic.c',
-          '<(boringssl_root)/crypto/rand_extra/fuchsia.c',
-          '<(boringssl_root)/crypto/rand_extra/windows.c',
-        ],
-      }],
-      ['OS=="starboard"', {
-        'defines': [
-          'NO_SYS_PARAM_H',
-          'NO_SYS_UN_H',
-          'NO_SYSLOG',
-          'OPENSSL_NO_CAMELLIA',
-          'OPENSSL_NO_CAPIENG',
-          'OPENSSL_NO_CAST',
-          'OPENSSL_NO_CMS',
-          'OPENSSL_NO_DYNAMIC_ENGINE',
-          'OPENSSL_NO_EC_NISTP_64_GCC_128',
-          'OPENSSL_NO_GMP',
-          'OPENSSL_NO_IDEA',
-          'OPENSSL_NO_JPAKE',
-          'OPENSSL_NO_KRB5',
-          'OPENSSL_NO_MDC2',
-          'OPENSSL_NO_OCSP',
-          'OPENSSL_NO_RC5',
-          'OPENSSL_NO_RFC3779',
-          'OPENSSL_NO_SCTP',
-          'OPENSSL_NO_SEED',
-          'OPENSSL_NO_STORE',
-          'OPENSSL_NO_SOCK',  # Added by Cobalt to remove unused socket code.
-          'OPENSSL_NO_WHIRLPOOL',
-          'OPENSSL_NO_POSIX_IO',
-        ],
-      }],  # OS == "starboard"
-    ],
-    'include_dirs': [
-      '.',
-      '<@(openssl_config_path)',
-    ],
-    'all_dependent_settings': {
-      'include_dirs': [
-        '<@(openssl_config_path)',
-      ],
-    },
-  },
-  'targets': [
-    {
-      'target_name': 'crypto_full',
-
-      # Include the source file list generated by BoringSSL
-      'includes': ['boringssl.gypi',],
-
-      'sources': [
-        '<@(boringssl_crypto_files)',
-        '<@(boringssl_ssl_files)',
-      ],
-      'include_dirs': [
-        '<(boringssl_root)/include',
-      ],
-      'all_dependent_settings': {
-        'include_dirs': [
-          '<(boringssl_root)/include',
-        ],
-      },
-
-      'conditions': [
-        # This massive, nested conditional block will select the correct batch
-        # of assembly language files for the current OS and CPU architecture, or
-        # it will turn off assembly language files entirely if the
-        # |asm_target_arch| has been set to "none".
-        ['sb_evergreen==1', {
-          'conditions': [
-            ['calling_convention not in ["aarch64", "eabi", "sysv", "windows"] or asm_target_arch not in ["x86", "x64", "arm", "arm64"]', {
-              'defines': [
-                'OPENSSL_NO_ASM',
-              ],
-            }, {  # calling_convention not in ["aarch64", "eabi", "sysv", "windows"] or asm_target_arch not in ["x86", "x64", "arm", "arm64"]
-              'conditions': [
-                ['calling_convention=="aarch64" or \
-                  calling_convention=="eabi" or \
-                  calling_convention=="sysv"', {
-                  'conditions': [
-                    ['asm_target_arch=="x86"', {
-                      'sources': [
-                        '<@(boringssl_linux_x86_files)',
-                      ],
-                    }],
-                    ['asm_target_arch=="x64"', {
-                      'sources': [
-                        '<@(boringssl_linux_x86_64_files)',
-                      ],
-                    }],
-                    ['asm_target_arch=="arm"', {
-                      'sources': [
-                        '<@(boringssl_linux_arm_files)',
-                      ],
-                    }],
-                    ['asm_target_arch=="arm64"', {
-                      'sources': [
-                        '<@(boringssl_linux_aarch64_files)',
-                      ],
-                    }],
-                  ],
-                }],
-                ['calling_convention=="windows"', {
-                  'conditions': [
-                    ['asm_target_arch=="x86"', {
-                      'sources': [
-                        '<@(boringssl_win_x86_files)',
-                      ],
-                    }],
-                    ['asm_target_arch=="x64"', {
-                      'sources': [
-                        '<@(boringssl_win_x86_64_files)',
-                      ],
-                    }],
-                  ],
-                }],
-              ],
-            }],
-          ],
-        }, {
-          'conditions': [
-            ['target_os not in ["linux", "android", "tvos"] or asm_target_arch not in ["x86", "x64", "arm", "arm64"]', {
-              # please read comments for |target_os=="win"| condition below
-              'defines': [
-                'OPENSSL_NO_ASM',
-              ],
-            }, {  # target_os in ["linux", "android", "tvos"] and asm_target_arch in ["none", "mips", "x86"]
-              'conditions': [
-                ['target_os=="linux" or target_os=="android"', {
-                  'conditions': [
-                    ['asm_target_arch=="x86"', {
-                      'sources': [
-                        '<@(boringssl_linux_x86_files)',
-                      ],
-                    }],
-                    ['asm_target_arch=="x64"', {
-                      'sources': [
-                        '<@(boringssl_linux_x86_64_files)',
-                      ],
-                    }],
-                    ['asm_target_arch=="arm"', {
-                      'sources': [
-                        '<@(boringssl_linux_arm_files)',
-                      ],
-                    }],
-                    ['asm_target_arch=="arm64"', {
-                      'sources': [
-                        '<@(boringssl_linux_aarch64_files)',
-                      ],
-                    }],
-                  ],
-                }],
-                ['target_os=="win"', {
-
-                # For |target_os=="win"| an ASM rule uses ml.exe (aka MS Macro Assembler)
-                # which we can't use with GNU format. As soon as ASM rule will be fixed
-                # for using GNU Assembler, to accelerate "crypto" with assembler
-                # implementations just remove target_os=="win" from abowe condition
-                # |'asm_target_arch=="none" or target_os=="win"'| which currently
-                # sets OPENSSL_NO_ASM for "win" too
-
-                  'conditions': [
-                    ['asm_target_arch=="x86"', {
-                      'sources': [
-                        '<@(boringssl_win_x86_files)',
-                      ],
-                    }],
-                    ['asm_target_arch=="x64"', {
-                      'sources': [
-                        '<@(boringssl_win_x86_64_files)',
-                      ],
-                    }],
-                  ],
-                }],
-                ['target_os=="tvos"', {
-                  'conditions': [
-                    ['asm_target_arch=="arm64"', {
-                      'sources': [
-                        '<@(boringssl_ios_aarch64_files)',
-                      ],
-                    }],
-                    # Simulator
-                    ['asm_target_arch=="x64"', {
-                      'defines': [
-                        'OPENSSL_NO_ASM',
-                      ],
-                    }],
-                  ],
-                }]
-              ],
-            }],
-          ],
-        }],
-        ['OS=="starboard"', {
-          'sources': [
-            '<(boringssl_root)/crypto/rand_extra/starboard.c',
-            '<(boringssl_root)/crypto/cpu-starboard.c',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'crypto',
-      'sources!': [
-        '<(boringssl_root)/crypto/bio/connect.c',
-        '<(boringssl_root)/crypto/bio/fd.c',
-        '<(boringssl_root)/crypto/bio/socket.c',
-        '<(boringssl_root)/crypto/bio/socket_helper.c',
-      ],
-      'dependencies': [ 'crypto_full' ],
-    },
-  ],
-}
diff --git a/third_party/boringssl/boringssl.gypi b/third_party/boringssl/boringssl.gypi
deleted file mode 100644
index 69d1a1f..0000000
--- a/third_party/boringssl/boringssl.gypi
+++ /dev/null
@@ -1,529 +0,0 @@
-# Copyright (c) 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 is created by generate_build_files.py. Do not edit manually.
-
-{
-  'variables': {
-    'boringssl_ssl_files': [
-      '<(boringssl_root)/include/openssl/dtls1.h',
-      '<(boringssl_root)/include/openssl/ssl.h',
-      '<(boringssl_root)/include/openssl/ssl3.h',
-      '<(boringssl_root)/include/openssl/tls1.h',
-      '<(boringssl_root)/ssl/bio_ssl.cc',
-      '<(boringssl_root)/ssl/d1_both.cc',
-      '<(boringssl_root)/ssl/d1_lib.cc',
-      '<(boringssl_root)/ssl/d1_pkt.cc',
-      '<(boringssl_root)/ssl/d1_srtp.cc',
-      '<(boringssl_root)/ssl/dtls_method.cc',
-      '<(boringssl_root)/ssl/dtls_record.cc',
-      '<(boringssl_root)/ssl/handshake.cc',
-      '<(boringssl_root)/ssl/handshake_client.cc',
-      '<(boringssl_root)/ssl/handshake_server.cc',
-      '<(boringssl_root)/ssl/internal.h',
-      '<(boringssl_root)/ssl/s3_both.cc',
-      '<(boringssl_root)/ssl/s3_lib.cc',
-      '<(boringssl_root)/ssl/s3_pkt.cc',
-      '<(boringssl_root)/ssl/ssl_aead_ctx.cc',
-      '<(boringssl_root)/ssl/ssl_asn1.cc',
-      '<(boringssl_root)/ssl/ssl_buffer.cc',
-      '<(boringssl_root)/ssl/ssl_cert.cc',
-      '<(boringssl_root)/ssl/ssl_cipher.cc',
-      '<(boringssl_root)/ssl/ssl_file.cc',
-      '<(boringssl_root)/ssl/ssl_key_share.cc',
-      '<(boringssl_root)/ssl/ssl_lib.cc',
-      '<(boringssl_root)/ssl/ssl_privkey.cc',
-      '<(boringssl_root)/ssl/ssl_session.cc',
-      '<(boringssl_root)/ssl/ssl_stat.cc',
-      '<(boringssl_root)/ssl/ssl_transcript.cc',
-      '<(boringssl_root)/ssl/ssl_versions.cc',
-      '<(boringssl_root)/ssl/ssl_x509.cc',
-      '<(boringssl_root)/ssl/t1_enc.cc',
-      '<(boringssl_root)/ssl/t1_lib.cc',
-      '<(boringssl_root)/ssl/tls13_both.cc',
-      '<(boringssl_root)/ssl/tls13_client.cc',
-      '<(boringssl_root)/ssl/tls13_enc.cc',
-      '<(boringssl_root)/ssl/tls13_server.cc',
-      '<(boringssl_root)/ssl/tls_method.cc',
-      '<(boringssl_root)/ssl/tls_record.cc',
-    ],
-    'boringssl_crypto_files': [
-      'err_data.c',
-      '<(boringssl_root)/crypto/asn1/a_bitstr.c',
-      '<(boringssl_root)/crypto/asn1/a_bool.c',
-      '<(boringssl_root)/crypto/asn1/a_d2i_fp.c',
-      '<(boringssl_root)/crypto/asn1/a_dup.c',
-      '<(boringssl_root)/crypto/asn1/a_enum.c',
-      '<(boringssl_root)/crypto/asn1/a_gentm.c',
-      '<(boringssl_root)/crypto/asn1/a_i2d_fp.c',
-      '<(boringssl_root)/crypto/asn1/a_int.c',
-      '<(boringssl_root)/crypto/asn1/a_mbstr.c',
-      '<(boringssl_root)/crypto/asn1/a_object.c',
-      '<(boringssl_root)/crypto/asn1/a_octet.c',
-      '<(boringssl_root)/crypto/asn1/a_print.c',
-      '<(boringssl_root)/crypto/asn1/a_strnid.c',
-      '<(boringssl_root)/crypto/asn1/a_time.c',
-      '<(boringssl_root)/crypto/asn1/a_type.c',
-      '<(boringssl_root)/crypto/asn1/a_utctm.c',
-      '<(boringssl_root)/crypto/asn1/a_utf8.c',
-      '<(boringssl_root)/crypto/asn1/asn1_lib.c',
-      '<(boringssl_root)/crypto/asn1/asn1_locl.h',
-      '<(boringssl_root)/crypto/asn1/asn1_par.c',
-      '<(boringssl_root)/crypto/asn1/asn_pack.c',
-      '<(boringssl_root)/crypto/asn1/f_enum.c',
-      '<(boringssl_root)/crypto/asn1/f_int.c',
-      '<(boringssl_root)/crypto/asn1/f_string.c',
-      '<(boringssl_root)/crypto/asn1/tasn_dec.c',
-      '<(boringssl_root)/crypto/asn1/tasn_enc.c',
-      '<(boringssl_root)/crypto/asn1/tasn_fre.c',
-      '<(boringssl_root)/crypto/asn1/tasn_new.c',
-      '<(boringssl_root)/crypto/asn1/tasn_typ.c',
-      '<(boringssl_root)/crypto/asn1/tasn_utl.c',
-      '<(boringssl_root)/crypto/asn1/time_support.c',
-      '<(boringssl_root)/crypto/base64/base64.c',
-      '<(boringssl_root)/crypto/bio/bio.c',
-      '<(boringssl_root)/crypto/bio/bio_mem.c',
-      '<(boringssl_root)/crypto/bio/connect.c',
-      '<(boringssl_root)/crypto/bio/fd.c',
-      '<(boringssl_root)/crypto/bio/file.c',
-      '<(boringssl_root)/crypto/bio/hexdump.c',
-      '<(boringssl_root)/crypto/bio/internal.h',
-      '<(boringssl_root)/crypto/bio/pair.c',
-      '<(boringssl_root)/crypto/bio/printf.c',
-      '<(boringssl_root)/crypto/bio/socket.c',
-      '<(boringssl_root)/crypto/bio/socket_helper.c',
-      '<(boringssl_root)/crypto/bn_extra/bn_asn1.c',
-      '<(boringssl_root)/crypto/bn_extra/convert.c',
-      '<(boringssl_root)/crypto/buf/buf.c',
-      '<(boringssl_root)/crypto/bytestring/asn1_compat.c',
-      '<(boringssl_root)/crypto/bytestring/ber.c',
-      '<(boringssl_root)/crypto/bytestring/cbb.c',
-      '<(boringssl_root)/crypto/bytestring/cbs.c',
-      '<(boringssl_root)/crypto/bytestring/internal.h',
-      '<(boringssl_root)/crypto/bytestring/unicode.c',
-      '<(boringssl_root)/crypto/chacha/chacha.c',
-      '<(boringssl_root)/crypto/cipher_extra/cipher_extra.c',
-      '<(boringssl_root)/crypto/cipher_extra/derive_key.c',
-      '<(boringssl_root)/crypto/cipher_extra/e_aesccm.c',
-      '<(boringssl_root)/crypto/cipher_extra/e_aesctrhmac.c',
-      '<(boringssl_root)/crypto/cipher_extra/e_aesgcmsiv.c',
-      '<(boringssl_root)/crypto/cipher_extra/e_chacha20poly1305.c',
-      '<(boringssl_root)/crypto/cipher_extra/e_null.c',
-      '<(boringssl_root)/crypto/cipher_extra/e_rc2.c',
-      '<(boringssl_root)/crypto/cipher_extra/e_rc4.c',
-      '<(boringssl_root)/crypto/cipher_extra/e_tls.c',
-      '<(boringssl_root)/crypto/cipher_extra/internal.h',
-      '<(boringssl_root)/crypto/cipher_extra/tls_cbc.c',
-      '<(boringssl_root)/crypto/cmac/cmac.c',
-      '<(boringssl_root)/crypto/conf/conf.c',
-      '<(boringssl_root)/crypto/conf/conf_def.h',
-      '<(boringssl_root)/crypto/conf/internal.h',
-      '<(boringssl_root)/crypto/cpu-arm.c',
-      '<(boringssl_root)/crypto/cpu-intel.c',
-      '<(boringssl_root)/crypto/cpu-ppc64le.c',
-      '<(boringssl_root)/crypto/crypto.c',
-      '<(boringssl_root)/third_party/fiat/curve25519.c',
-      '<(boringssl_root)/crypto/curve25519/internal.h',
-      '<(boringssl_root)/crypto/curve25519/spake25519.c',
-      '<(boringssl_root)/crypto/dh/check.c',
-      '<(boringssl_root)/crypto/dh/dh.c',
-      '<(boringssl_root)/crypto/dh/dh_asn1.c',
-      '<(boringssl_root)/crypto/dh/params.c',
-      '<(boringssl_root)/crypto/digest_extra/digest_extra.c',
-      '<(boringssl_root)/crypto/dsa/dsa.c',
-      '<(boringssl_root)/crypto/dsa/dsa_asn1.c',
-      '<(boringssl_root)/crypto/ec_extra/ec_asn1.c',
-      '<(boringssl_root)/crypto/ecdh_extra/ecdh_extra.c',
-      '<(boringssl_root)/crypto/ecdsa_extra/ecdsa_asn1.c',
-      '<(boringssl_root)/crypto/engine/engine.c',
-      '<(boringssl_root)/crypto/err/err.c',
-      '<(boringssl_root)/crypto/err/internal.h',
-      '<(boringssl_root)/crypto/evp/digestsign.c',
-      '<(boringssl_root)/crypto/evp/evp.c',
-      '<(boringssl_root)/crypto/evp/evp_asn1.c',
-      '<(boringssl_root)/crypto/evp/evp_ctx.c',
-      '<(boringssl_root)/crypto/evp/internal.h',
-      '<(boringssl_root)/crypto/evp/p_dsa_asn1.c',
-      '<(boringssl_root)/crypto/evp/p_ec.c',
-      '<(boringssl_root)/crypto/evp/p_ec_asn1.c',
-      '<(boringssl_root)/crypto/evp/p_ed25519.c',
-      '<(boringssl_root)/crypto/evp/p_ed25519_asn1.c',
-      '<(boringssl_root)/crypto/evp/p_rsa.c',
-      '<(boringssl_root)/crypto/evp/p_rsa_asn1.c',
-      '<(boringssl_root)/crypto/evp/pbkdf.c',
-      '<(boringssl_root)/crypto/evp/print.c',
-      '<(boringssl_root)/crypto/evp/scrypt.c',
-      '<(boringssl_root)/crypto/evp/sign.c',
-      '<(boringssl_root)/crypto/ex_data.c',
-      '<(boringssl_root)/crypto/fipsmodule/aes/internal.h',
-      '<(boringssl_root)/crypto/fipsmodule/bcm.c',
-      '<(boringssl_root)/crypto/fipsmodule/bn/internal.h',
-      '<(boringssl_root)/crypto/fipsmodule/bn/rsaz_exp.h',
-      '<(boringssl_root)/crypto/fipsmodule/cipher/internal.h',
-      '<(boringssl_root)/crypto/fipsmodule/delocate.h',
-      '<(boringssl_root)/crypto/fipsmodule/des/internal.h',
-      '<(boringssl_root)/crypto/fipsmodule/digest/internal.h',
-      '<(boringssl_root)/crypto/fipsmodule/digest/md32_common.h',
-      '<(boringssl_root)/crypto/fipsmodule/ec/internal.h',
-      '<(boringssl_root)/crypto/fipsmodule/ec/p256-x86_64-table.h',
-      '<(boringssl_root)/crypto/fipsmodule/ec/p256-x86_64.h',
-      '<(boringssl_root)/crypto/fipsmodule/is_fips.c',
-      '<(boringssl_root)/crypto/fipsmodule/modes/internal.h',
-      '<(boringssl_root)/crypto/fipsmodule/rand/internal.h',
-      '<(boringssl_root)/crypto/fipsmodule/rsa/internal.h',
-      '<(boringssl_root)/crypto/hkdf/hkdf.c',
-      '<(boringssl_root)/crypto/internal.h',
-      '<(boringssl_root)/crypto/lhash/lhash.c',
-      '<(boringssl_root)/crypto/mem_starboard.c',
-      '<(boringssl_root)/crypto/obj/obj.c',
-      '<(boringssl_root)/crypto/obj/obj_dat.h',
-      '<(boringssl_root)/crypto/obj/obj_xref.c',
-      '<(boringssl_root)/crypto/pem/pem_all.c',
-      '<(boringssl_root)/crypto/pem/pem_info.c',
-      '<(boringssl_root)/crypto/pem/pem_lib.c',
-      '<(boringssl_root)/crypto/pem/pem_oth.c',
-      '<(boringssl_root)/crypto/pem/pem_pk8.c',
-      '<(boringssl_root)/crypto/pem/pem_pkey.c',
-      '<(boringssl_root)/crypto/pem/pem_x509.c',
-      '<(boringssl_root)/crypto/pem/pem_xaux.c',
-      '<(boringssl_root)/crypto/pkcs7/internal.h',
-      '<(boringssl_root)/crypto/pkcs7/pkcs7.c',
-      '<(boringssl_root)/crypto/pkcs7/pkcs7_x509.c',
-      '<(boringssl_root)/crypto/pkcs8/internal.h',
-      '<(boringssl_root)/crypto/pkcs8/p5_pbev2.c',
-      '<(boringssl_root)/crypto/pkcs8/pkcs8.c',
-      '<(boringssl_root)/crypto/pkcs8/pkcs8_x509.c',
-      '<(boringssl_root)/crypto/poly1305/internal.h',
-      '<(boringssl_root)/crypto/poly1305/poly1305.c',
-      '<(boringssl_root)/crypto/poly1305/poly1305_arm.c',
-      '<(boringssl_root)/crypto/poly1305/poly1305_vec.c',
-      '<(boringssl_root)/crypto/pool/internal.h',
-      '<(boringssl_root)/crypto/pool/pool.c',
-      '<(boringssl_root)/crypto/rand_extra/deterministic.c',
-      '<(boringssl_root)/crypto/rand_extra/forkunsafe.c',
-      '<(boringssl_root)/crypto/rand_extra/fuchsia.c',
-      '<(boringssl_root)/crypto/rand_extra/rand_extra.c',
-      '<(boringssl_root)/crypto/rand_extra/windows.c',
-      '<(boringssl_root)/crypto/rc4/rc4.c',
-      '<(boringssl_root)/crypto/refcount_c11.c',
-      '<(boringssl_root)/crypto/refcount_lock.c',
-      '<(boringssl_root)/crypto/refcount_starboard.c',
-      '<(boringssl_root)/crypto/rsa_extra/rsa_asn1.c',
-      '<(boringssl_root)/crypto/stack/stack.c',
-      '<(boringssl_root)/crypto/thread.c',
-      '<(boringssl_root)/crypto/thread_none.c',
-      '<(boringssl_root)/crypto/thread_pthread.c',
-      '<(boringssl_root)/crypto/thread_starboard.cc',
-      '<(boringssl_root)/crypto/thread_win.c',
-      '<(boringssl_root)/crypto/x509/a_digest.c',
-      '<(boringssl_root)/crypto/x509/a_sign.c',
-      '<(boringssl_root)/crypto/x509/a_strex.c',
-      '<(boringssl_root)/crypto/x509/a_verify.c',
-      '<(boringssl_root)/crypto/x509/algorithm.c',
-      '<(boringssl_root)/crypto/x509/asn1_gen.c',
-      '<(boringssl_root)/crypto/x509/by_dir.c',
-      '<(boringssl_root)/crypto/x509/by_file.c',
-      '<(boringssl_root)/crypto/x509/charmap.h',
-      '<(boringssl_root)/crypto/x509/i2d_pr.c',
-      '<(boringssl_root)/crypto/x509/internal.h',
-      '<(boringssl_root)/crypto/x509/rsa_pss.c',
-      '<(boringssl_root)/crypto/x509/t_crl.c',
-      '<(boringssl_root)/crypto/x509/t_req.c',
-      '<(boringssl_root)/crypto/x509/t_x509.c',
-      '<(boringssl_root)/crypto/x509/t_x509a.c',
-      '<(boringssl_root)/crypto/x509/vpm_int.h',
-      '<(boringssl_root)/crypto/x509/x509.c',
-      '<(boringssl_root)/crypto/x509/x509_att.c',
-      '<(boringssl_root)/crypto/x509/x509_cmp.c',
-      '<(boringssl_root)/crypto/x509/x509_d2.c',
-      '<(boringssl_root)/crypto/x509/x509_def.c',
-      '<(boringssl_root)/crypto/x509/x509_ext.c',
-      '<(boringssl_root)/crypto/x509/x509_lu.c',
-      '<(boringssl_root)/crypto/x509/x509_obj.c',
-      '<(boringssl_root)/crypto/x509/x509_r2x.c',
-      '<(boringssl_root)/crypto/x509/x509_req.c',
-      '<(boringssl_root)/crypto/x509/x509_set.c',
-      '<(boringssl_root)/crypto/x509/x509_trs.c',
-      '<(boringssl_root)/crypto/x509/x509_txt.c',
-      '<(boringssl_root)/crypto/x509/x509_v3.c',
-      '<(boringssl_root)/crypto/x509/x509_vfy.c',
-      '<(boringssl_root)/crypto/x509/x509_vpm.c',
-      '<(boringssl_root)/crypto/x509/x509cset.c',
-      '<(boringssl_root)/crypto/x509/x509name.c',
-      '<(boringssl_root)/crypto/x509/x509rset.c',
-      '<(boringssl_root)/crypto/x509/x509spki.c',
-      '<(boringssl_root)/crypto/x509/x_algor.c',
-      '<(boringssl_root)/crypto/x509/x_all.c',
-      '<(boringssl_root)/crypto/x509/x_attrib.c',
-      '<(boringssl_root)/crypto/x509/x_crl.c',
-      '<(boringssl_root)/crypto/x509/x_exten.c',
-      '<(boringssl_root)/crypto/x509/x_info.c',
-      '<(boringssl_root)/crypto/x509/x_name.c',
-      '<(boringssl_root)/crypto/x509/x_pkey.c',
-      '<(boringssl_root)/crypto/x509/x_pubkey.c',
-      '<(boringssl_root)/crypto/x509/x_req.c',
-      '<(boringssl_root)/crypto/x509/x_sig.c',
-      '<(boringssl_root)/crypto/x509/x_spki.c',
-      '<(boringssl_root)/crypto/x509/x_val.c',
-      '<(boringssl_root)/crypto/x509/x_x509.c',
-      '<(boringssl_root)/crypto/x509/x_x509a.c',
-      '<(boringssl_root)/crypto/x509v3/ext_dat.h',
-      '<(boringssl_root)/crypto/x509v3/pcy_cache.c',
-      '<(boringssl_root)/crypto/x509v3/pcy_data.c',
-      '<(boringssl_root)/crypto/x509v3/pcy_int.h',
-      '<(boringssl_root)/crypto/x509v3/pcy_lib.c',
-      '<(boringssl_root)/crypto/x509v3/pcy_map.c',
-      '<(boringssl_root)/crypto/x509v3/pcy_node.c',
-      '<(boringssl_root)/crypto/x509v3/pcy_tree.c',
-      '<(boringssl_root)/crypto/x509v3/v3_akey.c',
-      '<(boringssl_root)/crypto/x509v3/v3_akeya.c',
-      '<(boringssl_root)/crypto/x509v3/v3_alt.c',
-      '<(boringssl_root)/crypto/x509v3/v3_bcons.c',
-      '<(boringssl_root)/crypto/x509v3/v3_bitst.c',
-      '<(boringssl_root)/crypto/x509v3/v3_conf.c',
-      '<(boringssl_root)/crypto/x509v3/v3_cpols.c',
-      '<(boringssl_root)/crypto/x509v3/v3_crld.c',
-      '<(boringssl_root)/crypto/x509v3/v3_enum.c',
-      '<(boringssl_root)/crypto/x509v3/v3_extku.c',
-      '<(boringssl_root)/crypto/x509v3/v3_genn.c',
-      '<(boringssl_root)/crypto/x509v3/v3_ia5.c',
-      '<(boringssl_root)/crypto/x509v3/v3_info.c',
-      '<(boringssl_root)/crypto/x509v3/v3_int.c',
-      '<(boringssl_root)/crypto/x509v3/v3_lib.c',
-      '<(boringssl_root)/crypto/x509v3/v3_ncons.c',
-      '<(boringssl_root)/crypto/x509v3/v3_ocsp.c',
-      '<(boringssl_root)/crypto/x509v3/v3_pci.c',
-      '<(boringssl_root)/crypto/x509v3/v3_pcia.c',
-      '<(boringssl_root)/crypto/x509v3/v3_pcons.c',
-      '<(boringssl_root)/crypto/x509v3/v3_pku.c',
-      '<(boringssl_root)/crypto/x509v3/v3_pmaps.c',
-      '<(boringssl_root)/crypto/x509v3/v3_prn.c',
-      '<(boringssl_root)/crypto/x509v3/v3_purp.c',
-      '<(boringssl_root)/crypto/x509v3/v3_skey.c',
-      '<(boringssl_root)/crypto/x509v3/v3_sxnet.c',
-      '<(boringssl_root)/crypto/x509v3/v3_utl.c',
-      '<(boringssl_root)/include/openssl/aead.h',
-      '<(boringssl_root)/include/openssl/aes.h',
-      '<(boringssl_root)/include/openssl/arm_arch.h',
-      '<(boringssl_root)/include/openssl/asn1.h',
-      '<(boringssl_root)/include/openssl/asn1_mac.h',
-      '<(boringssl_root)/include/openssl/asn1t.h',
-      '<(boringssl_root)/include/openssl/base.h',
-      '<(boringssl_root)/include/openssl/base64.h',
-      '<(boringssl_root)/include/openssl/bio.h',
-      '<(boringssl_root)/include/openssl/blowfish.h',
-      '<(boringssl_root)/include/openssl/bn.h',
-      '<(boringssl_root)/include/openssl/buf.h',
-      '<(boringssl_root)/include/openssl/buffer.h',
-      '<(boringssl_root)/include/openssl/bytestring.h',
-      '<(boringssl_root)/include/openssl/cast.h',
-      '<(boringssl_root)/include/openssl/chacha.h',
-      '<(boringssl_root)/include/openssl/cipher.h',
-      '<(boringssl_root)/include/openssl/cmac.h',
-      '<(boringssl_root)/include/openssl/conf.h',
-      '<(boringssl_root)/include/openssl/cpu.h',
-      '<(boringssl_root)/include/openssl/crypto.h',
-      '<(boringssl_root)/include/openssl/curve25519.h',
-      '<(boringssl_root)/include/openssl/des.h',
-      '<(boringssl_root)/include/openssl/dh.h',
-      '<(boringssl_root)/include/openssl/digest.h',
-      '<(boringssl_root)/include/openssl/dsa.h',
-      '<(boringssl_root)/include/openssl/ec.h',
-      '<(boringssl_root)/include/openssl/ec_key.h',
-      '<(boringssl_root)/include/openssl/ecdh.h',
-      '<(boringssl_root)/include/openssl/ecdsa.h',
-      '<(boringssl_root)/include/openssl/engine.h',
-      '<(boringssl_root)/include/openssl/err.h',
-      '<(boringssl_root)/include/openssl/evp.h',
-      '<(boringssl_root)/include/openssl/ex_data.h',
-      '<(boringssl_root)/include/openssl/hkdf.h',
-      '<(boringssl_root)/include/openssl/hmac.h',
-      '<(boringssl_root)/include/openssl/is_boringssl.h',
-      '<(boringssl_root)/include/openssl/lhash.h',
-      '<(boringssl_root)/include/openssl/lhash_macros.h',
-      '<(boringssl_root)/include/openssl/md4.h',
-      '<(boringssl_root)/include/openssl/md5.h',
-      '<(boringssl_root)/include/openssl/mem.h',
-      '<(boringssl_root)/include/openssl/nid.h',
-      '<(boringssl_root)/include/openssl/obj.h',
-      '<(boringssl_root)/include/openssl/obj_mac.h',
-      '<(boringssl_root)/include/openssl/objects.h',
-      '<(boringssl_root)/include/openssl/opensslconf.h',
-      '<(boringssl_root)/include/openssl/opensslv.h',
-      '<(boringssl_root)/include/openssl/ossl_typ.h',
-      '<(boringssl_root)/include/openssl/pem.h',
-      '<(boringssl_root)/include/openssl/pkcs12.h',
-      '<(boringssl_root)/include/openssl/pkcs7.h',
-      '<(boringssl_root)/include/openssl/pkcs8.h',
-      '<(boringssl_root)/include/openssl/poly1305.h',
-      '<(boringssl_root)/include/openssl/pool.h',
-      '<(boringssl_root)/include/openssl/rand.h',
-      '<(boringssl_root)/include/openssl/rc4.h',
-      '<(boringssl_root)/include/openssl/ripemd.h',
-      '<(boringssl_root)/include/openssl/rsa.h',
-      '<(boringssl_root)/include/openssl/safestack.h',
-      '<(boringssl_root)/include/openssl/sha.h',
-      '<(boringssl_root)/include/openssl/span.h',
-      '<(boringssl_root)/include/openssl/srtp.h',
-      '<(boringssl_root)/include/openssl/stack.h',
-      '<(boringssl_root)/include/openssl/thread.h',
-      '<(boringssl_root)/include/openssl/type_check.h',
-      '<(boringssl_root)/include/openssl/x509.h',
-      '<(boringssl_root)/include/openssl/x509_vfy.h',
-      '<(boringssl_root)/include/openssl/x509v3.h',
-    ],
-    'boringssl_ios_aarch64_files': [
-      'ios-aarch64/crypto/chacha/chacha-armv8.S',
-      'ios-aarch64/crypto/fipsmodule/aesv8-armx64.S',
-      'ios-aarch64/crypto/fipsmodule/armv8-mont.S',
-      'ios-aarch64/crypto/fipsmodule/ghashv8-armx64.S',
-      'ios-aarch64/crypto/fipsmodule/sha1-armv8.S',
-      'ios-aarch64/crypto/fipsmodule/sha256-armv8.S',
-      'ios-aarch64/crypto/fipsmodule/sha512-armv8.S',
-    ],
-    'boringssl_ios_arm_files': [
-      'ios-arm/crypto/chacha/chacha-armv4.S',
-      'ios-arm/crypto/fipsmodule/aes-armv4.S',
-      'ios-arm/crypto/fipsmodule/aesv8-armx32.S',
-      'ios-arm/crypto/fipsmodule/armv4-mont.S',
-      'ios-arm/crypto/fipsmodule/bsaes-armv7.S',
-      'ios-arm/crypto/fipsmodule/ghash-armv4.S',
-      'ios-arm/crypto/fipsmodule/ghashv8-armx32.S',
-      'ios-arm/crypto/fipsmodule/sha1-armv4-large.S',
-      'ios-arm/crypto/fipsmodule/sha256-armv4.S',
-      'ios-arm/crypto/fipsmodule/sha512-armv4.S',
-    ],
-    'boringssl_linux_aarch64_files': [
-      '<(boringssl_root)/crypto/cpu-aarch64-linux.c', # Linux arm64 only file
-      'linux-aarch64/crypto/chacha/chacha-armv8.S',
-      'linux-aarch64/crypto/fipsmodule/aesv8-armx64.S',
-      'linux-aarch64/crypto/fipsmodule/armv8-mont.S',
-      'linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S',
-      'linux-aarch64/crypto/fipsmodule/sha1-armv8.S',
-      'linux-aarch64/crypto/fipsmodule/sha256-armv8.S',
-      'linux-aarch64/crypto/fipsmodule/sha512-armv8.S',
-    ],
-    'boringssl_linux_arm_files': [
-      '<(boringssl_root)/crypto/cpu-arm-linux.c', # Linux arm only file
-      'linux-arm/crypto/chacha/chacha-armv4.S',
-      'linux-arm/crypto/fipsmodule/aes-armv4.S',
-      'linux-arm/crypto/fipsmodule/aesv8-armx32.S',
-      'linux-arm/crypto/fipsmodule/armv4-mont.S',
-      'linux-arm/crypto/fipsmodule/bsaes-armv7.S',
-      'linux-arm/crypto/fipsmodule/ghash-armv4.S',
-      'linux-arm/crypto/fipsmodule/ghashv8-armx32.S',
-      'linux-arm/crypto/fipsmodule/sha1-armv4-large.S',
-      'linux-arm/crypto/fipsmodule/sha256-armv4.S',
-      'linux-arm/crypto/fipsmodule/sha512-armv4.S',
-      '<(boringssl_root)/crypto/curve25519/asm/x25519-asm-arm.S',
-      '<(boringssl_root)/crypto/poly1305/poly1305_arm_asm.S',
-    ],
-    'boringssl_linux_ppc64le_files': [
-      'linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S',
-      'linux-ppc64le/crypto/fipsmodule/ghashp8-ppc.S',
-    ],
-    'boringssl_linux_x86_files': [
-      'linux-x86/crypto/chacha/chacha-x86.S',
-      'linux-x86/crypto/fipsmodule/aes-586.S',
-      'linux-x86/crypto/fipsmodule/aesni-x86.S',
-      'linux-x86/crypto/fipsmodule/bn-586.S',
-      'linux-x86/crypto/fipsmodule/co-586.S',
-      'linux-x86/crypto/fipsmodule/ghash-x86.S',
-      'linux-x86/crypto/fipsmodule/md5-586.S',
-      'linux-x86/crypto/fipsmodule/sha1-586.S',
-      'linux-x86/crypto/fipsmodule/sha256-586.S',
-      'linux-x86/crypto/fipsmodule/sha512-586.S',
-      'linux-x86/crypto/fipsmodule/vpaes-x86.S',
-      'linux-x86/crypto/fipsmodule/x86-mont.S',
-    ],
-    'boringssl_linux_x86_64_files': [
-      'linux-x86_64/crypto/chacha/chacha-x86_64.S',
-      'linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S',
-      'linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/aes-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/aesni-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/bsaes-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/ghash-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/md5-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S',
-      'linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/rsaz-avx2.S',
-      'linux-x86_64/crypto/fipsmodule/sha1-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/sha256-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/sha512-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S',
-      'linux-x86_64/crypto/fipsmodule/x86_64-mont.S',
-      'linux-x86_64/crypto/fipsmodule/x86_64-mont5.S',
-    ],
-    'boringssl_mac_x86_files': [
-      'mac-x86/crypto/chacha/chacha-x86.S',
-      'mac-x86/crypto/fipsmodule/aes-586.S',
-      'mac-x86/crypto/fipsmodule/aesni-x86.S',
-      'mac-x86/crypto/fipsmodule/bn-586.S',
-      'mac-x86/crypto/fipsmodule/co-586.S',
-      'mac-x86/crypto/fipsmodule/ghash-x86.S',
-      'mac-x86/crypto/fipsmodule/md5-586.S',
-      'mac-x86/crypto/fipsmodule/sha1-586.S',
-      'mac-x86/crypto/fipsmodule/sha256-586.S',
-      'mac-x86/crypto/fipsmodule/sha512-586.S',
-      'mac-x86/crypto/fipsmodule/vpaes-x86.S',
-      'mac-x86/crypto/fipsmodule/x86-mont.S',
-    ],
-    'boringssl_mac_x86_64_files': [
-      'mac-x86_64/crypto/chacha/chacha-x86_64.S',
-      'mac-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S',
-      'mac-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/aes-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/aesni-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/bsaes-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/ghash-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/md5-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S',
-      'mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/rsaz-avx2.S',
-      'mac-x86_64/crypto/fipsmodule/sha1-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/sha256-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/sha512-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S',
-      'mac-x86_64/crypto/fipsmodule/x86_64-mont.S',
-      'mac-x86_64/crypto/fipsmodule/x86_64-mont5.S',
-    ],
-    'boringssl_win_x86_files': [
-      'win-x86/crypto/chacha/chacha-x86.asm',
-      'win-x86/crypto/fipsmodule/aes-586.asm',
-      'win-x86/crypto/fipsmodule/aesni-x86.asm',
-      'win-x86/crypto/fipsmodule/bn-586.asm',
-      'win-x86/crypto/fipsmodule/co-586.asm',
-      'win-x86/crypto/fipsmodule/ghash-x86.asm',
-      'win-x86/crypto/fipsmodule/md5-586.asm',
-      'win-x86/crypto/fipsmodule/sha1-586.asm',
-      'win-x86/crypto/fipsmodule/sha256-586.asm',
-      'win-x86/crypto/fipsmodule/sha512-586.asm',
-      'win-x86/crypto/fipsmodule/vpaes-x86.asm',
-      'win-x86/crypto/fipsmodule/x86-mont.asm',
-    ],
-    'boringssl_win_x86_64_files': [
-      'win-x86_64/crypto/chacha/chacha-x86_64.asm',
-      'win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.asm',
-      'win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/aes-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/aesni-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/bsaes-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/ghash-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/md5-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/p256-x86_64-asm.asm',
-      'win-x86_64/crypto/fipsmodule/rdrand-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/rsaz-avx2.asm',
-      'win-x86_64/crypto/fipsmodule/sha1-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/sha256-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/sha512-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/vpaes-x86_64.asm',
-      'win-x86_64/crypto/fipsmodule/x86_64-mont.asm',
-      'win-x86_64/crypto/fipsmodule/x86_64-mont5.asm',
-    ],
-  }
-}
diff --git a/third_party/boringssl/boringssl_tool.gyp b/third_party/boringssl/boringssl_tool.gyp
deleted file mode 100644
index 8397b22..0000000
--- a/third_party/boringssl/boringssl_tool.gyp
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2019 Google Inc. All Rights Reserved.
-{
-  'variables': {
-    'boringssl_root%': '<(DEPTH)/third_party/boringssl/src',
-  },
-  'targets': [
-    {
-      'target_name': 'crypto_tool',
-      'type': '<(final_executable_type)',
-      'include_dirs': [
-        '<(boringssl_root)/include',
-      ],
-      'defines': [
-        'OPENSSL_NO_SOCK'
-      ],
-      'sources' : [
-        '<(boringssl_root)/tool/args.cc',
-        '<(boringssl_root)/tool/ciphers.cc',
-        '<(boringssl_root)/tool/const.cc',
-        '<(boringssl_root)/tool/digest.cc',
-        '<(boringssl_root)/tool/file.cc',
-        '<(boringssl_root)/tool/generate_ed25519.cc',
-        '<(boringssl_root)/tool/genrsa.cc',
-        '<(boringssl_root)/tool/pkcs12.cc',
-        '<(boringssl_root)/tool/rand.cc',
-        '<(boringssl_root)/tool/sign.cc',
-        '<(boringssl_root)/tool/speed.cc',
-        '<(boringssl_root)/tool/tool.cc',
-      ],
-      'dependencies' : [
-          '<(DEPTH)/third_party/boringssl/boringssl.gyp:crypto',
-          '<(DEPTH)/starboard/starboard.gyp:starboard'
-      ]
-    },
-    {
-      'target_name': 'crypto_tool_deploy',
-      'type': 'none',
-      'dependencies': [
-        'crypto_tool',
-      ],
-      'variables': {
-        'executable_name': 'crypto_tool',
-      },
-      'includes': [ '../../starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/third_party/brotli/bro.gypi b/third_party/brotli/bro.gypi
deleted file mode 100644
index a416b92..0000000
--- a/third_party/brotli/bro.gypi
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright (c) 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.
-
-# Usage:
-# {
-#   'target_name': 'your_target_name',
-#   'type': 'none',
-#   'actions': [
-#     {
-#       'variables': {
-#         'input_file': 'file/to/compress',
-#         'output_file': 'file/to/put/compressed',
-#       },
-#       'includes': ['../third_party/brotli/bro.gypi'],
-#     }
-#   ],
-#   'dependencies': [
-#     'path/to:builds_file_to_compress'
-#   ],
-# },
-
-{
-  'action_name': 'genbro',
-  'variables': {
-    'bro': '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)bro<(EXECUTABLE_SUFFIX)',
-  },
-  'inputs': [
-    '<(bro)',
-    '<(input_file)',
-  ],
-  'outputs': [
-    '<(output_file)',
-  ],
-  'action': [
-    '<(bro)',
-    '--force',
-    '--input',
-    '<(input_file)',
-    '--output',
-    '<(output_file)',
-  ],
-  'dependencies': [
-    '<(DEPTH)/third_party/brotli/brotli.gyp:bro#host',
-  ],
-}
diff --git a/third_party/brotli/brotli.gyp b/third_party/brotli/brotli.gyp
deleted file mode 100644
index 831b5ff..0000000
--- a/third_party/brotli/brotli.gyp
+++ /dev/null
@@ -1,195 +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.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'headers',
-      'type': 'static_library',
-      'sources': [
-        'c/include/brotli/decode.h',
-        'c/include/brotli/encode.h',
-        'c/include/brotli/port.h',
-        'c/include/brotli/types.h',
-      ],
-      'toolsets': ['host', 'target'],
-    },
-    {
-      'target_name': 'common',
-      'type': 'static_library',
-      'include_dirs': [
-        'c/include',
-      ],
-      'sources': [
-        'c/common/constants.h',
-        'c/common/dictionary.c',
-        'c/common/dictionary.h',
-        'c/common/platform.h',
-        'c/common/version.h',
-      ],
-      'dependencies': [
-        'headers',
-      ],
-      'toolsets': ['host', 'target'],
-    },
-    {
-      'target_name': 'common_no_dictionary_data',
-      'type': 'static_library',
-      'include_dirs': [
-        'c/include',
-      ],
-      'sources': [
-        'c/common/constants.h',
-        'c/common/dictionary.c',
-        'c/common/dictionary.h',
-        'c/common/platform.h',
-        'c/common/version.h',
-      ],
-      'dependencies': [
-        'headers',
-      ],
-      'defines': [
-        'BROTLI_EXTERNAL_DICTIONARY_DATA',
-      ],
-      'toolsets': ['host', 'target'],
-    },
-    {
-      'target_name': 'dec',
-      'type': 'static_library',
-      'include_dirs': [
-        'c/include',
-      ],
-      'sources': [
-        'c/dec/bit_reader.c',
-        'c/dec/bit_reader.h',
-        'c/dec/context.h',
-        'c/dec/decode.c',
-        'c/dec/huffman.c',
-        'c/dec/huffman.h',
-        'c/dec/prefix.h',
-        'c/dec/state.c',
-        'c/dec/state.h',
-        'c/dec/transform.h',
-      ],
-      'dependencies': [
-        'headers',
-        'common',
-      ],
-      'conditions': [
-        ['os_posix==1 and (target_arch=="arm" or target_arch=="armv7" or target_arch=="arm64")', {
-          'cflags!': ['-Os'],
-          'cflags': ['-O2'],
-        }],
-      ],
-      'toolsets': ['host', 'target'],
-    },
-    {
-      'target_name': 'dec_no_dictionary_data',
-      'type': 'static_library',
-      'include_dirs': [
-        'c/include',
-      ],
-      'sources': [
-        'c/dec/bit_reader.c',
-        'c/dec/bit_reader.h',
-        'c/dec/context.h',
-        'c/dec/decode.c',
-        'c/dec/huffman.c',
-        'c/dec/huffman.h',
-        'c/dec/prefix.h',
-        'c/dec/state.c',
-        'c/dec/state.h',
-        'c/dec/transform.h',
-      ],
-      'dependencies': [
-        'headers',
-        'common_no_dictionary_data',
-      ],
-      'toolsets': ['host', 'target'],
-    },
-    {
-      'target_name': 'bro',
-      'type': 'executable',
-      'dependencies': [
-        'headers',
-        'common',
-        'dec',
-      ],
-      'include_dirs': [
-        'c/include',
-      ],
-      'sources': [
-        'c/enc/backward_references.c',
-        'c/enc/backward_references.h',
-        'c/enc/backward_references_hq.c',
-        'c/enc/backward_references_hq.h',
-        'c/enc/backward_references_inc.h',
-        'c/enc/bit_cost.c',
-        'c/enc/bit_cost.h',
-        'c/enc/bit_cost_inc.h',
-        'c/enc/block_encoder_inc.h',
-        'c/enc/block_splitter.c',
-        'c/enc/block_splitter.h',
-        'c/enc/block_splitter_inc.h',
-        'c/enc/brotli_bit_stream.c',
-        'c/enc/brotli_bit_stream.h',
-        'c/enc/cluster.c',
-        'c/enc/cluster.h',
-        'c/enc/cluster_inc.h',
-        'c/enc/command.h',
-        'c/enc/compress_fragment.c',
-        'c/enc/compress_fragment.h',
-        'c/enc/compress_fragment_two_pass.c',
-        'c/enc/compress_fragment_two_pass.h',
-        'c/enc/context.h',
-        'c/enc/dictionary_hash.c',
-        'c/enc/dictionary_hash.h',
-        'c/enc/encode.c',
-        'c/enc/entropy_encode.c',
-        'c/enc/entropy_encode.h',
-        'c/enc/entropy_encode_static.h',
-        'c/enc/fast_log.h',
-        'c/enc/find_match_length.h',
-        'c/enc/hash_forgetful_chain_inc.h',
-        'c/enc/hash.h',
-        'c/enc/hash_longest_match64_inc.h',
-        'c/enc/hash_longest_match_inc.h',
-        'c/enc/hash_longest_match_quickly_inc.h',
-        'c/enc/hash_to_binary_tree_inc.h',
-        'c/enc/histogram.c',
-        'c/enc/histogram.h',
-        'c/enc/histogram_inc.h',
-        'c/enc/literal_cost.c',
-        'c/enc/literal_cost.h',
-        'c/enc/memory.c',
-        'c/enc/memory.h',
-        'c/enc/metablock.c',
-        'c/enc/metablock.h',
-        'c/enc/metablock_inc.h',
-        'c/enc/params.h',
-        'c/enc/prefix.h',
-        'c/enc/quality.h',
-        'c/enc/ringbuffer.h',
-        'c/enc/static_dict.c',
-        'c/enc/static_dict.h',
-        'c/enc/static_dict_lut.h',
-        'c/enc/utf8_util.c',
-        'c/enc/utf8_util.h',
-        'c/enc/write_bits.h',
-        'c/tools/brotli.c',
-      ],
-      'toolsets': ['host'],
-      'conditions': [
-        ['OS=="win" and MSVS_VERSION == "2015"', {
-          # Disabling "result of 32-bit shift implicitly converted to 64 bits",
-          # caused by code like: foo |= (1 << i);   // warning 4334
-          'msvs_disabled_warnings': [ 4334, ],
-        }],
-      ],
-    }
-  ],
-}
diff --git a/third_party/chromium/media/BUILD.gn b/third_party/chromium/media/BUILD.gn
index d5c158c..ce95f56 100644
--- a/third_party/chromium/media/BUILD.gn
+++ b/third_party/chromium/media/BUILD.gn
@@ -1,463 +1,251 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
-import("//build/buildflag_header.gni")
-import("//build/config/android/config.gni")
-import("//build/config/arm.gni")
-import("//build/config/chromecast_build.gni")
-import("//build/config/features.gni")
-import("//build/config/linux/pkg_config.gni")
-import("//build/config/ui.gni")
-import("//media/cdm/library_cdm/cdm_paths.gni")
-import("//media/media_options.gni")
-import("//testing/libfuzzer/fuzzer_test.gni")
-import("//testing/test.gni")
-import("//third_party/ffmpeg/ffmpeg_options.gni")
-
-buildflag_header("media_buildflags") {
-  header = "media_buildflags.h"
-
-  flags = [
-    "ALTERNATE_CDM_STORAGE_ID_KEY=\"$alternate_cdm_storage_id_key\"",
-    "CDM_PLATFORM_SPECIFIC_PATH=\"$cdm_platform_specific_path\"",
-    "ENABLE_PLATFORM_AC3_EAC3_AUDIO=$enable_platform_ac3_eac3_audio",
-    "ENABLE_CAST_AUDIO_RENDERER=$enable_cast_audio_renderer",
-    "ENABLE_CDM_HOST_VERIFICATION=$enable_cdm_host_verification",
-    "ENABLE_CDM_STORAGE_ID=$enable_cdm_storage_id",
-    "ENABLE_DAV1D_DECODER=$enable_dav1d_decoder",
-    "ENABLE_AV1_DECODER=$enable_av1_decoder",
-    "ENABLE_PLATFORM_DOLBY_VISION=$enable_platform_dolby_vision",
-    "ENABLE_FFMPEG=$media_use_ffmpeg",
-    "ENABLE_FFMPEG_VIDEO_DECODERS=$enable_ffmpeg_video_decoders",
-    "ENABLE_PLATFORM_HEVC=$enable_platform_hevc",
-    "ENABLE_PLATFORM_HEVC_DECODING=$enable_platform_hevc_decoding",
-    "ENABLE_PLATFORM_ENCRYPTED_HEVC=$enable_platform_encrypted_hevc",
-    "ENABLE_HLS_SAMPLE_AES=$enable_hls_sample_aes",
-    "ENABLE_LIBGAV1_DECODER=$enable_libgav1_decoder",
-    "ENABLE_LIBRARY_CDMS=$enable_library_cdms",
-    "ENABLE_LIBVPX=$media_use_libvpx",
-    "ENABLE_LOGGING_OVERRIDE=$enable_logging_override",
-    "ENABLE_MEDIA_DRM_STORAGE=$enable_media_drm_storage",
-    "ENABLE_MEDIA_REMOTING=$enable_media_remoting",
-    "ENABLE_MEDIA_REMOTING_RPC=$enable_media_remoting_rpc",
-    "ENABLE_OPENH264=$media_use_openh264",
-    "ENABLE_PLATFORM_MPEG_H_AUDIO=$enable_platform_mpeg_h_audio",
-    "ENABLE_MSE_MPEG2TS_STREAM_PARSER=$enable_mse_mpeg2ts_stream_parser",
-    "ENABLE_CAST_STREAMING_RENDERER=$enable_cast_streaming_renderer",
-    "USE_CHROMEOS_MEDIA_ACCELERATION=$use_vaapi||$use_v4l2_codec",
-    "USE_CHROMEOS_PROTECTED_AV1=$use_chromeos_protected_av1",
-    "USE_CHROMEOS_PROTECTED_MEDIA=$use_chromeos_protected_media",
-    "USE_PROPRIETARY_CODECS=$proprietary_codecs",
-  ]
-}
-
-if (proprietary_codecs && media_use_ffmpeg) {
-  assert(
-      ffmpeg_branding != "Chromium",
-      "proprietary codecs and ffmpeg_branding set to Chromium are incompatible")
-}
-
-# Common configuration for targets in the media directory; these must not be
-# exported since things like USE_NEON and USE_CRAS have different meanings
-# elsewhere in the code base.
 config("media_config") {
-  defines = []
-  if (current_cpu == "arm64" || (current_cpu == "arm" && arm_use_neon)) {
-    defines += [ "USE_NEON" ]
+  if (is_win) {
+    cflags = [
+      "/wd4267",  # Conversion from 'size_t' to 'type', possible loss of data.
+      "/wd4715",  # Not all control paths return a value.
+      # Conversion from 'size_t' to 'int' requires a narrowing conversion.
+      "/wd4838",
+    ]
+  } else {
+    cflags_cc = [
+      "-Wno-conversion",
+      "-Wno-unused-parameter",
+      "-Wno-unused-variable",
+    ]
   }
-  if (use_pulseaudio) {
-    defines += [ "USE_PULSEAUDIO" ]
-    if (!link_pulseaudio) {
-      defines += [ "DLOPEN_PULSEAUDIO" ]
-    }
-  }
-  if (use_cras) {
-    defines += [ "USE_CRAS" ]
-  }
+
+  defines = [ "MEDIA_IMPLEMENTATION" ]
 }
 
-# Internal grouping of the configs necessary to support sub-folders having their
-# own BUILD.gn files; only targets which roll up into the "media" target should
-# include this config. I.e., not "test_support" or "unit_tests" targets.
-#
-# Without these configs having individual sub-folders take a //media/base DEP
-# (or others) can yield incorrectly imported and exported symbols on Windows:
-#
-#    fatal error LNK1169: one or more multiply defined symbols found.
-#
-config("subcomponent_config") {
-  visibility = media_subcomponent_deps
-  if (is_mac) {
-    visibility += [ "//media/base/mac" ]
-  }
-  defines = [ "IS_MEDIA_IMPL" ]
-  configs = [
-    ":media_config",
-    "//build/config/compiler:wexit_time_destructors",
-  ]
+config("media_config_public") {
+  # TODO: Make include_dirs other than the first one private.
+  include_dirs = [ "..", "cobalt", "../../skia" ]
+}
+
+config("external_config") {
+  include_dirs = [ "..", "cobalt", "../../skia"  ]
 }
 
 component("media") {
-  libs = []
-
-  deps = [
-    "//base",
-    "//base:i18n",
-    "//base/third_party/dynamic_annotations",
-    "//cc/paint",
-    "//crypto:platform",
-    "//gpu/command_buffer/client:gles2_interface",
-    "//gpu/command_buffer/common",
-    "//third_party/libyuv",
-    "//ui/events:events_base",
-    "//ui/gfx",
-    "//ui/gfx/geometry",
-    "//ui/gl:gl",
-    "//url",
-  ]
-
-  public_configs = [ "//third_party/libwebm:libwebm_config" ]
-  public_deps = media_subcomponent_deps
-  public_deps += [
-    ":media_buildflags",
-    ":shared_memory_support",
-    "//ui/gfx:color_space",
-  ]
-
-  # This must be included here since it actually depends on //media/base.
-  if (is_apple) {
-    public_deps += [ "//media/base/mac" ]
-  }
-
-  if (use_ozone) {
-    deps += [ "//ui/ozone" ]
-  }
-}
-
-# Note: This can't be a static_library since it does not have any sources.
-source_set("test_support") {
-  testonly = true
-  public_deps = [
-    ":media",
-    "//media/audio:test_support",
-    "//media/base:test_support",
-    "//media/base/android:test_support",
-    "//media/filters:test_support",
-    "//media/formats:test_support",
-    "//media/renderers:test_support",
-    "//media/video:test_support",
-  ]
-}
-
-# Contains tests for all targets in the "media" folder.
-# TODO(xhwang): Move mojo/capture/remoting tests here where applicable.
-test("media_unittests") {
-  use_xvfb = use_xvfb_in_this_config
-
-  deps = [
-    "//media/audio:unit_tests",
-    "//media/base:unit_tests",
-    "//media/capabilities:unit_tests",
-    "//media/cast/receiver:unit_tests",
-    "//media/cdm:unit_tests",
-    "//media/device_monitors:unit_tests",
-    "//media/filters:unit_tests",
-    "//media/formats:unit_tests",
-    "//media/gpu:unit_tests",
-    "//media/learning:unit_tests",
-    "//media/mojo:unit_tests",
-    "//media/muxers:unit_tests",
-    "//media/parsers:unit_tests",
-    "//media/renderers:unit_tests",
-    "//media/test:pipeline_integration_tests",
-    "//media/test:run_all_unittests",
-    "//media/video:unit_tests",
-    "//media/webrtc:unit_tests",
-  ]
-
-  data = [
-    "test/data/",
-    "formats/mp4/h264_annex_b_fuzz_corpus/",
-  ]
-
-  data_deps = [ "//testing/buildbot/filters:media_unittests_filters" ]
-
-  if (media_use_ffmpeg) {
-    deps += [ "//media/ffmpeg:unit_tests" ]
-  }
-
-  if (is_android) {
-    deps += [
-      # The test needs the java dependencies to add the java classes for their
-      # native counterparts to the test apk.
-      "//gpu/command_buffer/service:android_texture_owner_unittests",
-      "//media/base/android:media_java",
-      "//media/base/android:unit_tests",
-      "//media/gpu:android_video_decode_accelerator_unittests",
-      "//ui/android:ui_java",
-    ]
-  }
-
-  if (is_fuchsia) {
-    deps += [
-      "//media/fuchsia/audio:unittests",
-      "//media/fuchsia/cdm/service:unittests",
-    ]
-
-    additional_manifest_fragments = [
-      "//build/config/fuchsia/test/audio_capabilities.test-cmx",
-
-      # TODO(crbug.com/1185811): Figure out why
-      # PaintCanvasVideoRendererWithGLTest.CopyVideoFrameYUVDataToGLTexture
-      # crashes without "deprecated-ambient-replace-as-executable".
-      "//build/config/fuchsia/test/jit_capabilities.test-cmx",
-
-      "//build/config/fuchsia/test/vulkan_capabilities.test-cmx",
-    ]
-  }
-
-  if (enable_media_remoting) {
-    deps += [ "//media/remoting:media_remoting_tests" ]
-  }
-
-  # The test needs OPUS_FIXED_POINT conditional define.
-  configs += [ "//third_party/opus:opus_config" ]
-}
-
-test("media_perftests") {
-  configs += [ ":media_config" ]
-  deps = [
-    ":test_support",
-    "//base/test:test_support",
-    "//media/base:perftests",
-    "//media/filters:perftests",
-    "//media/test:pipeline_integration_perftests",
-    "//testing/gmock",
-    "//testing/gtest",
-    "//testing/perf",
-    "//third_party/widevine/cdm:headers",
-    "//ui/gfx:test_support",
-  ]
-  if (media_use_ffmpeg) {
-    # Direct dependency required to inherit config.
-    deps += [ "//third_party/ffmpeg" ]
-  }
-
-  # This target should not require the Chrome executable to run.
-  assert_no_deps = [ "//chrome" ]
-
-  data = [ "test/data/" ]
-
-  data_deps = [
-    # Needed for isolate script to execute.
-    "//testing:run_perf_test",
-  ]
-}
-
-# The audio subset of media_unittests. This target exists for running only the
-# audio tests on the GPU bots (which have audio hardware).
-test("audio_unittests") {
-  deps = [
-    ":test_support",
-    "//base/test:test_support",
-    "//media/audio:unit_tests",
-    "//media/test:run_all_unittests",
-  ]
-  if (is_android) {
-    deps += [
-      # The test needs the java dependencies to add the java classes for their
-      # native counterparts to the test apk.
-      "//media/base/android:media_java",
-      "//ui/android:ui_java",
-    ]
-  }
-}
-
-# Note: Most external components should just depend on //media unless they
-# specifically need this pared own target (NaCl, PPAPI, etc). Internal targets
-# should just depend on //media/base which will propagate this target to them.
-component("shared_memory_support") {
   sources = [
-    "base/audio_bus.cc",
-    "base/audio_bus.h",
-    "base/audio_latency.cc",
-    "base/audio_latency.h",
-    "base/audio_parameters.cc",
-    "base/audio_parameters.h",
-    "base/audio_point.cc",
-    "base/audio_point.h",
-    "base/audio_sample_types.h",
+    "base/audio_codecs.cc",
+    "base/audio_codecs.h",
+    "base/audio_decoder_config.cc",
+    "base/audio_decoder_config.h",
+    "base/audio_timestamp_helper.cc",
+    "base/audio_timestamp_helper.h",
+    "base/bit_reader.cc",
+    "base/bit_reader.h",
+    "base/bit_reader_core.cc",
+    "base/bit_reader_core.h",
+    "base/byte_queue.cc",
+    "base/byte_queue.h",
     "base/channel_layout.cc",
     "base/channel_layout.h",
-    "base/limits.h",
-    "base/media_shmem_export.h",
+    "base/decoder_buffer.cc",
+    "base/decoder_buffer.h",
+    "base/decrypt_config.cc",
+    "base/decrypt_config.h",
+    "base/demuxer.cc",
+    "base/demuxer.h",
+    "base/demuxer_memory_limit_starboard.cc",
+    "base/demuxer_stream.cc",
+    "base/demuxer_stream.h",
+    "base/demuxer_memory_limit.h",
+    "base/encryption_pattern.cc",
+    "base/encryption_pattern.h",
+    "base/encryption_scheme.cc",
+    "base/encryption_scheme.h",
+    "base/media_log.h",
+    "base/media_resource.cc",
+    "base/media_resource.h",
+    "base/media_track.cc",
+    "base/media_track.h",
+    "base/media_tracks.cc",
+    "base/media_tracks.h",
+    "base/media_util.cc",
+    "base/media_util.h",
+    "base/media_url_params.cc",
+    "base/media_url_params.h",
+    "base/mime_util.cc",
+    "base/mime_util.h",
+    "base/mime_util_internal.cc",
+    "base/mime_util_internal.h",
+    "base/pipeline_status.cc",
+    "base/pipeline_status.h",
+    "base/ranges.cc",
+    "base/ranges.h",
     "base/sample_format.cc",
     "base/sample_format.h",
-    "base/vector_math.cc",
-    "base/vector_math.h",
-    "base/vector_math_testing.h",
-    "base/video_types.cc",
-    "base/video_types.h",
+    "base/stream_parser.cc",
+    "base/stream_parser.h",
+    "base/stream_parser_buffer.cc",
+    "base/stream_parser_buffer.h",
+    "base/supported_types.cc",
+    "base/supported_types.h",
+    "base/text_track_config.cc",
+    "base/text_track_config.h",
+    "base/video_aspect_ratio.cc",
+    "base/video_aspect_ratio.h",
+    "base/video_color_space.cc",
+    "base/video_color_space.h",
+    "base/video_codecs.cc",
+    "base/video_codecs.h",
+    "base/video_decoder_config.cc",
+    "base/video_decoder_config.h",
+    "base/video_transformation.cc",
+    "base/video_transformation.h",
+    "filters/chunk_demuxer.cc",
+    "filters/chunk_demuxer.h",
+    "filters/frame_processor.cc",
+    "filters/frame_processor.h",
+    "filters/h264_bitstream_buffer.cc",
+    "filters/h264_bitstream_buffer.h",
+    "filters/h264_to_annex_b_bitstream_converter.cc",
+    "filters/h264_to_annex_b_bitstream_converter.h",
+    "filters/source_buffer_range.cc",
+    "filters/source_buffer_range.h",
+    "filters/source_buffer_state.cc",
+    "filters/source_buffer_state.h",
+    "filters/source_buffer_stream.cc",
+    "filters/source_buffer_stream.h",
+    "filters/stream_parser_factory.cc",
+    "filters/stream_parser_factory.h",
+    "formats/common/offset_byte_queue.cc",
+    "formats/common/offset_byte_queue.h",
+    "formats/mp4/aac.cc",
+    "formats/mp4/aac.h",
+    "formats/mp4/avc.cc",
+    "formats/mp4/avc.h",
+    "formats/mp4/bitstream_converter.cc",
+    "formats/mp4/bitstream_converter.h",
+    "formats/mp4/box_definitions.cc",
+    "formats/mp4/box_definitions.h",
+    "formats/mp4/box_reader.cc",
+    "formats/mp4/box_reader.h",
+    "formats/mp4/dolby_vision.cc",
+    "formats/mp4/dolby_vision.h",
+    "formats/mp4/es_descriptor.cc",
+    "formats/mp4/es_descriptor.h",
+    "formats/mp4/fourccs.h",
+    "formats/mp4/hevc.cc",
+    "formats/mp4/hevc.h",
+    "formats/mp4/mp4_stream_parser.cc",
+    "formats/mp4/mp4_stream_parser.h",
+    "formats/mp4/rcheck.h",
+    "formats/mp4/sample_to_group_iterator.cc",
+    "formats/mp4/sample_to_group_iterator.h",
+    "formats/mp4/track_run_iterator.cc",
+    "formats/mp4/track_run_iterator.h",
+    "formats/mpeg/adts_constants.cc",
+    "formats/mpeg/adts_constants.h",
+    "formats/mpeg/adts_stream_parser.cc",
+    "formats/mpeg/adts_stream_parser.h",
+    "formats/mpeg/mpeg1_audio_stream_parser.cc",
+    "formats/mpeg/mpeg1_audio_stream_parser.h",
+    "formats/mpeg/mpeg_audio_stream_parser_base.cc",
+    "formats/mpeg/mpeg_audio_stream_parser_base.h",
+    "formats/webcodecs/webcodecs_encoded_chunk_stream_parser.cc",
+    "formats/webcodecs/webcodecs_encoded_chunk_stream_parser.h",
+    "formats/webm/webm_audio_client.cc",
+    "formats/webm/webm_audio_client.h",
+    "formats/webm/webm_cluster_parser.cc",
+    "formats/webm/webm_cluster_parser.h",
+    "formats/webm/webm_colour_parser.cc",
+    "formats/webm/webm_colour_parser.h",
+    "formats/webm/webm_constants.cc",
+    "formats/webm/webm_constants.h",
+    "formats/webm/webm_content_encodings.cc",
+    "formats/webm/webm_content_encodings.h",
+    "formats/webm/webm_content_encodings_client.cc",
+    "formats/webm/webm_content_encodings_client.h",
+    "formats/webm/webm_crypto_helpers.cc",
+    "formats/webm/webm_crypto_helpers.h",
+    "formats/webm/webm_info_parser.cc",
+    "formats/webm/webm_info_parser.h",
+    "formats/webm/webm_parser.cc",
+    "formats/webm/webm_parser.h",
+    "formats/webm/webm_projection_parser.cc",
+    "formats/webm/webm_projection_parser.h",
+    "formats/webm/webm_stream_parser.cc",
+    "formats/webm/webm_stream_parser.h",
+    "formats/webm/webm_tracks_parser.cc",
+    "formats/webm/webm_tracks_parser.h",
+    "formats/webm/webm_video_client.cc",
+    "formats/webm/webm_video_client.h",
+    "formats/webm/webm_webvtt_parser.cc",
+    "formats/webm/webm_webvtt_parser.h",
+    "video/h264_bit_reader.cc",
+    "video/h264_bit_reader.h",
+    "video/h264_parser.cc",
+    "video/h264_parser.h",
+    "video/h265_nalu_parser.cc",
+    "video/h265_nalu_parser.h",
+    "video/h265_parser.cc",
+    "video/h265_parser.h",
   ]
-  if (is_mac) {
-    # These need to be included here because audio_latency.cc depends on them.
-    sources += [
-      "base/mac/audio_latency_mac.cc",
-      "base/mac/audio_latency_mac.h",
-    ]
-  }
 
-  # Do not use "subcomponent_config" here since these files are in their own
-  # component target and thus can't share the standard export macros.
-  configs += [ ":media_config" ]
-  defines = [ "MEDIA_SHMEM_IMPLEMENTATION" ]
+  sources += [
+    "cobalt/third_party/abseil-cpp/absl/types/optional.h",
+    "cobalt/ui/gfx/geometry/point3_f.h",
+    "cobalt/ui/gfx/geometry/point_base.h",
+    "cobalt/ui/gfx/geometry/rect.h",
+    "cobalt/ui/gfx/geometry/size_base.h",
+    "cobalt/ui/gfx/geometry/rect_base_impl.h",
+    "cobalt/ui/gfx/geometry/vector2d_f.h",
+    "cobalt/ui/gfx/geometry/rect_base.h",
+    "cobalt/ui/gfx/geometry/size_f.h",
+    "cobalt/ui/gfx/geometry/point_f.cc",
+    "cobalt/ui/gfx/geometry/point_f.h",
+    "cobalt/ui/gfx/geometry/point.cc",
+    "cobalt/ui/gfx/geometry/point.h",
+    "cobalt/ui/gfx/geometry/size.h",
+    "cobalt/ui/gfx/geometry/vector2d.h",
+    "cobalt/ui/gfx/color_space_export.h",
+    "cobalt/ui/gfx/hdr_metadata.h",
+    "cobalt/ui/gfx/native_pixmap_handle.h",
+    #"cobalt/ui/gfx/hdr_metadata.cc",
+    "cobalt/ui/gfx/color_space.h",
+    "cobalt/base/notreached.h",
+    "cobalt/base/cxx17_backports.h",
+    "cobalt/base/bind_post_task.h",
+    "cobalt/base/check.h",
+    "cobalt/base/types/strong_alias.h",
+    "cobalt/base/hash/md5.h",
+    "cobalt/base/check_op.h",
+    "cobalt/net/cookies/site_for_cookies.h",
+  ]
 
-  if (!is_debug) {
-    configs -= [ "//build/config/compiler:default_optimization" ]
-    configs += [ "//build/config/compiler:optimize_max" ]
-  }
+  configs -= [ "//starboard/build/config:size" ]
+  configs += [
+    "//starboard/build/config:speed",
+    ":media_config",
+  ]
+
+  public_configs = [ ":media_config_public" ]
+
+  all_dependent_configs = [ ":external_config" ]
+
   deps = [
     "//base",
+    "//build:chromecast_buildflags",
     "//build:chromeos_buildflags",
-    "//ui/gfx/geometry",
+    "//net",
+    "//starboard",
+    "//url",
   ]
 }
-
-# TODO(watk): Refactor tests that could be made to run on Android. See
-# http://crbug.com/570762
-if (media_use_ffmpeg && !is_android) {
-  test("ffmpeg_regression_tests") {
-    configs += [ "//media:media_config" ]
-
-    deps = [
-      ":test_support",
-      "//base/test:test_support",
-      "//media/ffmpeg:ffmpeg_regression_tests",
-      "//media/test:pipeline_integration_tests",
-      "//media/test:run_all_unittests",
-      "//testing/gmock",
-      "//testing/gtest",
-      "//ui/gfx:test_support",
-      "//ui/gfx/geometry",
-    ]
-  }
-}
-
-if (proprietary_codecs) {
-  fuzzer_test("media_cenc_utils_fuzzer") {
-    sources = [ "cdm/cenc_utils_fuzzertest.cc" ]
-    deps = [ ":media" ]
-  }
-}
-
-fuzzer_test("media_vp9_parser_fuzzer") {
-  sources = [ "filters/vp9_parser_fuzzertest.cc" ]
-  deps = [
-    ":test_support",
-    "//base",
-  ]
-  libfuzzer_options = [ "max_len = 400000" ]
-}
-
-fuzzer_test("media_vp9_parser_encrypted_fuzzer") {
-  sources = [ "filters/vp9_parser_encrypted_fuzzertest.cc" ]
-  deps = [
-    ":test_support",
-    "//base",
-    "//base/test:test_support",
-  ]
-  seed_corpus = "//media/test/data"
-}
-
-fuzzer_test("media_vpx_video_decoder_fuzzer") {
-  sources = [ "filters/vpx_video_decoder_fuzzertest.cc" ]
-  deps = [
-    ":media",
-    "//base",
-    "//base/test:test_support",
-  ]
-  libfuzzer_options = [ "max_len = 400000" ]
-  seed_corpus = "//media/test/data"
-}
-
-fuzzer_test("media_webm_muxer_fuzzer") {
-  sources = [ "muxers/webm_muxer_fuzzertest.cc" ]
-  deps = [
-    ":media",
-    "//base",
-    "//third_party/libwebm",
-  ]
-}
-
-fuzzer_test("cbcs_decryptor_fuzzer") {
-  sources = [ "cdm/cbcs_decryptor_fuzzer.cc" ]
-  deps = [
-    ":media",
-    "//base",
-    "//crypto",
-  ]
-}
-
-fuzzer_test("cenc_decryptor_fuzzer") {
-  sources = [ "cdm/cenc_decryptor_fuzzer.cc" ]
-  deps = [
-    ":media",
-    "//base",
-    "//crypto",
-  ]
-}
-
-fuzzer_test("json_web_key_fuzzer") {
-  sources = [ "cdm/json_web_key_fuzzer.cc" ]
-  deps = [
-    ":media",
-    "//base",
-  ]
-}
-
-if (proprietary_codecs) {
-  fuzzer_test("media_mp4_avcc_parser_fuzzer") {
-    sources = [ "formats/mp4/mp4_avcc_parser_fuzzer.cc" ]
-    deps = [
-      ":media",
-      "//base",
-    ]
-  }
-
-  fuzzer_test("media_mp4_box_reader_fuzzer") {
-    sources = [ "formats/mp4/mp4_box_reader_fuzzer.cc" ]
-    deps = [
-      ":media",
-      "//base",
-    ]
-    libfuzzer_options = [ "max_len=500" ]
-    dict = "test/mp4.dict"
-  }
-}
-
-if (enable_mse_mpeg2ts_stream_parser) {
-  fuzzer_test("media_es_parser_adts_fuzzer") {
-    sources = [ "formats/mp2t/es_parser_adts_fuzzer.cc" ]
-    deps = [
-      ":media",
-      "//base",
-    ]
-  }
-
-  fuzzer_test("media_es_parser_h264_fuzzer") {
-    sources = [ "formats/mp2t/es_parser_h264_fuzzer.cc" ]
-    deps = [
-      ":media",
-      "//base",
-    ]
-  }
-
-  fuzzer_test("media_es_parser_mpeg1audio_fuzzer") {
-    sources = [ "formats/mp2t/es_parser_mpeg1audio_fuzzer.cc" ]
-    deps = [
-      ":media",
-      "//base",
-    ]
-  }
-}
diff --git a/third_party/chromium/media/BUILD.gn.chromium b/third_party/chromium/media/BUILD.gn.chromium
new file mode 100644
index 0000000..d5c158c
--- /dev/null
+++ b/third_party/chromium/media/BUILD.gn.chromium
@@ -0,0 +1,463 @@
+# Copyright 2014 The Chromium 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/buildflag_header.gni")
+import("//build/config/android/config.gni")
+import("//build/config/arm.gni")
+import("//build/config/chromecast_build.gni")
+import("//build/config/features.gni")
+import("//build/config/linux/pkg_config.gni")
+import("//build/config/ui.gni")
+import("//media/cdm/library_cdm/cdm_paths.gni")
+import("//media/media_options.gni")
+import("//testing/libfuzzer/fuzzer_test.gni")
+import("//testing/test.gni")
+import("//third_party/ffmpeg/ffmpeg_options.gni")
+
+buildflag_header("media_buildflags") {
+  header = "media_buildflags.h"
+
+  flags = [
+    "ALTERNATE_CDM_STORAGE_ID_KEY=\"$alternate_cdm_storage_id_key\"",
+    "CDM_PLATFORM_SPECIFIC_PATH=\"$cdm_platform_specific_path\"",
+    "ENABLE_PLATFORM_AC3_EAC3_AUDIO=$enable_platform_ac3_eac3_audio",
+    "ENABLE_CAST_AUDIO_RENDERER=$enable_cast_audio_renderer",
+    "ENABLE_CDM_HOST_VERIFICATION=$enable_cdm_host_verification",
+    "ENABLE_CDM_STORAGE_ID=$enable_cdm_storage_id",
+    "ENABLE_DAV1D_DECODER=$enable_dav1d_decoder",
+    "ENABLE_AV1_DECODER=$enable_av1_decoder",
+    "ENABLE_PLATFORM_DOLBY_VISION=$enable_platform_dolby_vision",
+    "ENABLE_FFMPEG=$media_use_ffmpeg",
+    "ENABLE_FFMPEG_VIDEO_DECODERS=$enable_ffmpeg_video_decoders",
+    "ENABLE_PLATFORM_HEVC=$enable_platform_hevc",
+    "ENABLE_PLATFORM_HEVC_DECODING=$enable_platform_hevc_decoding",
+    "ENABLE_PLATFORM_ENCRYPTED_HEVC=$enable_platform_encrypted_hevc",
+    "ENABLE_HLS_SAMPLE_AES=$enable_hls_sample_aes",
+    "ENABLE_LIBGAV1_DECODER=$enable_libgav1_decoder",
+    "ENABLE_LIBRARY_CDMS=$enable_library_cdms",
+    "ENABLE_LIBVPX=$media_use_libvpx",
+    "ENABLE_LOGGING_OVERRIDE=$enable_logging_override",
+    "ENABLE_MEDIA_DRM_STORAGE=$enable_media_drm_storage",
+    "ENABLE_MEDIA_REMOTING=$enable_media_remoting",
+    "ENABLE_MEDIA_REMOTING_RPC=$enable_media_remoting_rpc",
+    "ENABLE_OPENH264=$media_use_openh264",
+    "ENABLE_PLATFORM_MPEG_H_AUDIO=$enable_platform_mpeg_h_audio",
+    "ENABLE_MSE_MPEG2TS_STREAM_PARSER=$enable_mse_mpeg2ts_stream_parser",
+    "ENABLE_CAST_STREAMING_RENDERER=$enable_cast_streaming_renderer",
+    "USE_CHROMEOS_MEDIA_ACCELERATION=$use_vaapi||$use_v4l2_codec",
+    "USE_CHROMEOS_PROTECTED_AV1=$use_chromeos_protected_av1",
+    "USE_CHROMEOS_PROTECTED_MEDIA=$use_chromeos_protected_media",
+    "USE_PROPRIETARY_CODECS=$proprietary_codecs",
+  ]
+}
+
+if (proprietary_codecs && media_use_ffmpeg) {
+  assert(
+      ffmpeg_branding != "Chromium",
+      "proprietary codecs and ffmpeg_branding set to Chromium are incompatible")
+}
+
+# Common configuration for targets in the media directory; these must not be
+# exported since things like USE_NEON and USE_CRAS have different meanings
+# elsewhere in the code base.
+config("media_config") {
+  defines = []
+  if (current_cpu == "arm64" || (current_cpu == "arm" && arm_use_neon)) {
+    defines += [ "USE_NEON" ]
+  }
+  if (use_pulseaudio) {
+    defines += [ "USE_PULSEAUDIO" ]
+    if (!link_pulseaudio) {
+      defines += [ "DLOPEN_PULSEAUDIO" ]
+    }
+  }
+  if (use_cras) {
+    defines += [ "USE_CRAS" ]
+  }
+}
+
+# Internal grouping of the configs necessary to support sub-folders having their
+# own BUILD.gn files; only targets which roll up into the "media" target should
+# include this config. I.e., not "test_support" or "unit_tests" targets.
+#
+# Without these configs having individual sub-folders take a //media/base DEP
+# (or others) can yield incorrectly imported and exported symbols on Windows:
+#
+#    fatal error LNK1169: one or more multiply defined symbols found.
+#
+config("subcomponent_config") {
+  visibility = media_subcomponent_deps
+  if (is_mac) {
+    visibility += [ "//media/base/mac" ]
+  }
+  defines = [ "IS_MEDIA_IMPL" ]
+  configs = [
+    ":media_config",
+    "//build/config/compiler:wexit_time_destructors",
+  ]
+}
+
+component("media") {
+  libs = []
+
+  deps = [
+    "//base",
+    "//base:i18n",
+    "//base/third_party/dynamic_annotations",
+    "//cc/paint",
+    "//crypto:platform",
+    "//gpu/command_buffer/client:gles2_interface",
+    "//gpu/command_buffer/common",
+    "//third_party/libyuv",
+    "//ui/events:events_base",
+    "//ui/gfx",
+    "//ui/gfx/geometry",
+    "//ui/gl:gl",
+    "//url",
+  ]
+
+  public_configs = [ "//third_party/libwebm:libwebm_config" ]
+  public_deps = media_subcomponent_deps
+  public_deps += [
+    ":media_buildflags",
+    ":shared_memory_support",
+    "//ui/gfx:color_space",
+  ]
+
+  # This must be included here since it actually depends on //media/base.
+  if (is_apple) {
+    public_deps += [ "//media/base/mac" ]
+  }
+
+  if (use_ozone) {
+    deps += [ "//ui/ozone" ]
+  }
+}
+
+# Note: This can't be a static_library since it does not have any sources.
+source_set("test_support") {
+  testonly = true
+  public_deps = [
+    ":media",
+    "//media/audio:test_support",
+    "//media/base:test_support",
+    "//media/base/android:test_support",
+    "//media/filters:test_support",
+    "//media/formats:test_support",
+    "//media/renderers:test_support",
+    "//media/video:test_support",
+  ]
+}
+
+# Contains tests for all targets in the "media" folder.
+# TODO(xhwang): Move mojo/capture/remoting tests here where applicable.
+test("media_unittests") {
+  use_xvfb = use_xvfb_in_this_config
+
+  deps = [
+    "//media/audio:unit_tests",
+    "//media/base:unit_tests",
+    "//media/capabilities:unit_tests",
+    "//media/cast/receiver:unit_tests",
+    "//media/cdm:unit_tests",
+    "//media/device_monitors:unit_tests",
+    "//media/filters:unit_tests",
+    "//media/formats:unit_tests",
+    "//media/gpu:unit_tests",
+    "//media/learning:unit_tests",
+    "//media/mojo:unit_tests",
+    "//media/muxers:unit_tests",
+    "//media/parsers:unit_tests",
+    "//media/renderers:unit_tests",
+    "//media/test:pipeline_integration_tests",
+    "//media/test:run_all_unittests",
+    "//media/video:unit_tests",
+    "//media/webrtc:unit_tests",
+  ]
+
+  data = [
+    "test/data/",
+    "formats/mp4/h264_annex_b_fuzz_corpus/",
+  ]
+
+  data_deps = [ "//testing/buildbot/filters:media_unittests_filters" ]
+
+  if (media_use_ffmpeg) {
+    deps += [ "//media/ffmpeg:unit_tests" ]
+  }
+
+  if (is_android) {
+    deps += [
+      # The test needs the java dependencies to add the java classes for their
+      # native counterparts to the test apk.
+      "//gpu/command_buffer/service:android_texture_owner_unittests",
+      "//media/base/android:media_java",
+      "//media/base/android:unit_tests",
+      "//media/gpu:android_video_decode_accelerator_unittests",
+      "//ui/android:ui_java",
+    ]
+  }
+
+  if (is_fuchsia) {
+    deps += [
+      "//media/fuchsia/audio:unittests",
+      "//media/fuchsia/cdm/service:unittests",
+    ]
+
+    additional_manifest_fragments = [
+      "//build/config/fuchsia/test/audio_capabilities.test-cmx",
+
+      # TODO(crbug.com/1185811): Figure out why
+      # PaintCanvasVideoRendererWithGLTest.CopyVideoFrameYUVDataToGLTexture
+      # crashes without "deprecated-ambient-replace-as-executable".
+      "//build/config/fuchsia/test/jit_capabilities.test-cmx",
+
+      "//build/config/fuchsia/test/vulkan_capabilities.test-cmx",
+    ]
+  }
+
+  if (enable_media_remoting) {
+    deps += [ "//media/remoting:media_remoting_tests" ]
+  }
+
+  # The test needs OPUS_FIXED_POINT conditional define.
+  configs += [ "//third_party/opus:opus_config" ]
+}
+
+test("media_perftests") {
+  configs += [ ":media_config" ]
+  deps = [
+    ":test_support",
+    "//base/test:test_support",
+    "//media/base:perftests",
+    "//media/filters:perftests",
+    "//media/test:pipeline_integration_perftests",
+    "//testing/gmock",
+    "//testing/gtest",
+    "//testing/perf",
+    "//third_party/widevine/cdm:headers",
+    "//ui/gfx:test_support",
+  ]
+  if (media_use_ffmpeg) {
+    # Direct dependency required to inherit config.
+    deps += [ "//third_party/ffmpeg" ]
+  }
+
+  # This target should not require the Chrome executable to run.
+  assert_no_deps = [ "//chrome" ]
+
+  data = [ "test/data/" ]
+
+  data_deps = [
+    # Needed for isolate script to execute.
+    "//testing:run_perf_test",
+  ]
+}
+
+# The audio subset of media_unittests. This target exists for running only the
+# audio tests on the GPU bots (which have audio hardware).
+test("audio_unittests") {
+  deps = [
+    ":test_support",
+    "//base/test:test_support",
+    "//media/audio:unit_tests",
+    "//media/test:run_all_unittests",
+  ]
+  if (is_android) {
+    deps += [
+      # The test needs the java dependencies to add the java classes for their
+      # native counterparts to the test apk.
+      "//media/base/android:media_java",
+      "//ui/android:ui_java",
+    ]
+  }
+}
+
+# Note: Most external components should just depend on //media unless they
+# specifically need this pared own target (NaCl, PPAPI, etc). Internal targets
+# should just depend on //media/base which will propagate this target to them.
+component("shared_memory_support") {
+  sources = [
+    "base/audio_bus.cc",
+    "base/audio_bus.h",
+    "base/audio_latency.cc",
+    "base/audio_latency.h",
+    "base/audio_parameters.cc",
+    "base/audio_parameters.h",
+    "base/audio_point.cc",
+    "base/audio_point.h",
+    "base/audio_sample_types.h",
+    "base/channel_layout.cc",
+    "base/channel_layout.h",
+    "base/limits.h",
+    "base/media_shmem_export.h",
+    "base/sample_format.cc",
+    "base/sample_format.h",
+    "base/vector_math.cc",
+    "base/vector_math.h",
+    "base/vector_math_testing.h",
+    "base/video_types.cc",
+    "base/video_types.h",
+  ]
+  if (is_mac) {
+    # These need to be included here because audio_latency.cc depends on them.
+    sources += [
+      "base/mac/audio_latency_mac.cc",
+      "base/mac/audio_latency_mac.h",
+    ]
+  }
+
+  # Do not use "subcomponent_config" here since these files are in their own
+  # component target and thus can't share the standard export macros.
+  configs += [ ":media_config" ]
+  defines = [ "MEDIA_SHMEM_IMPLEMENTATION" ]
+
+  if (!is_debug) {
+    configs -= [ "//build/config/compiler:default_optimization" ]
+    configs += [ "//build/config/compiler:optimize_max" ]
+  }
+  deps = [
+    "//base",
+    "//build:chromeos_buildflags",
+    "//ui/gfx/geometry",
+  ]
+}
+
+# TODO(watk): Refactor tests that could be made to run on Android. See
+# http://crbug.com/570762
+if (media_use_ffmpeg && !is_android) {
+  test("ffmpeg_regression_tests") {
+    configs += [ "//media:media_config" ]
+
+    deps = [
+      ":test_support",
+      "//base/test:test_support",
+      "//media/ffmpeg:ffmpeg_regression_tests",
+      "//media/test:pipeline_integration_tests",
+      "//media/test:run_all_unittests",
+      "//testing/gmock",
+      "//testing/gtest",
+      "//ui/gfx:test_support",
+      "//ui/gfx/geometry",
+    ]
+  }
+}
+
+if (proprietary_codecs) {
+  fuzzer_test("media_cenc_utils_fuzzer") {
+    sources = [ "cdm/cenc_utils_fuzzertest.cc" ]
+    deps = [ ":media" ]
+  }
+}
+
+fuzzer_test("media_vp9_parser_fuzzer") {
+  sources = [ "filters/vp9_parser_fuzzertest.cc" ]
+  deps = [
+    ":test_support",
+    "//base",
+  ]
+  libfuzzer_options = [ "max_len = 400000" ]
+}
+
+fuzzer_test("media_vp9_parser_encrypted_fuzzer") {
+  sources = [ "filters/vp9_parser_encrypted_fuzzertest.cc" ]
+  deps = [
+    ":test_support",
+    "//base",
+    "//base/test:test_support",
+  ]
+  seed_corpus = "//media/test/data"
+}
+
+fuzzer_test("media_vpx_video_decoder_fuzzer") {
+  sources = [ "filters/vpx_video_decoder_fuzzertest.cc" ]
+  deps = [
+    ":media",
+    "//base",
+    "//base/test:test_support",
+  ]
+  libfuzzer_options = [ "max_len = 400000" ]
+  seed_corpus = "//media/test/data"
+}
+
+fuzzer_test("media_webm_muxer_fuzzer") {
+  sources = [ "muxers/webm_muxer_fuzzertest.cc" ]
+  deps = [
+    ":media",
+    "//base",
+    "//third_party/libwebm",
+  ]
+}
+
+fuzzer_test("cbcs_decryptor_fuzzer") {
+  sources = [ "cdm/cbcs_decryptor_fuzzer.cc" ]
+  deps = [
+    ":media",
+    "//base",
+    "//crypto",
+  ]
+}
+
+fuzzer_test("cenc_decryptor_fuzzer") {
+  sources = [ "cdm/cenc_decryptor_fuzzer.cc" ]
+  deps = [
+    ":media",
+    "//base",
+    "//crypto",
+  ]
+}
+
+fuzzer_test("json_web_key_fuzzer") {
+  sources = [ "cdm/json_web_key_fuzzer.cc" ]
+  deps = [
+    ":media",
+    "//base",
+  ]
+}
+
+if (proprietary_codecs) {
+  fuzzer_test("media_mp4_avcc_parser_fuzzer") {
+    sources = [ "formats/mp4/mp4_avcc_parser_fuzzer.cc" ]
+    deps = [
+      ":media",
+      "//base",
+    ]
+  }
+
+  fuzzer_test("media_mp4_box_reader_fuzzer") {
+    sources = [ "formats/mp4/mp4_box_reader_fuzzer.cc" ]
+    deps = [
+      ":media",
+      "//base",
+    ]
+    libfuzzer_options = [ "max_len=500" ]
+    dict = "test/mp4.dict"
+  }
+}
+
+if (enable_mse_mpeg2ts_stream_parser) {
+  fuzzer_test("media_es_parser_adts_fuzzer") {
+    sources = [ "formats/mp2t/es_parser_adts_fuzzer.cc" ]
+    deps = [
+      ":media",
+      "//base",
+    ]
+  }
+
+  fuzzer_test("media_es_parser_h264_fuzzer") {
+    sources = [ "formats/mp2t/es_parser_h264_fuzzer.cc" ]
+    deps = [
+      ":media",
+      "//base",
+    ]
+  }
+
+  fuzzer_test("media_es_parser_mpeg1audio_fuzzer") {
+    sources = [ "formats/mp2t/es_parser_mpeg1audio_fuzzer.cc" ]
+    deps = [
+      ":media",
+      "//base",
+    ]
+  }
+}
diff --git a/third_party/chromium/media/METADATA b/third_party/chromium/media/METADATA
new file mode 100644
index 0000000..65c61b0
--- /dev/null
+++ b/third_party/chromium/media/METADATA
@@ -0,0 +1,20 @@
+name: "media"
+description:
+  "Subtree at third_party/chromium/media"
+
+third_party {
+  url {
+    type: LOCAL_SOURCE
+    value: "/third_party/chromium/media_mirror"
+  }
+  url {
+    type: GIT
+    value: "https://chromium.googlesource.com/chromium/src.git"
+  }
+  version: "4dc2af87b3a5ff1c1489ec642491b59e9872ac8b"
+  last_upgrade_date {
+    year: 2022
+    month: 1
+    day: 11
+  }
+}
diff --git a/third_party/chromium/media/base/bind_to_current_loop.h b/third_party/chromium/media/base/bind_to_current_loop.h
index 4ddf4fc..f3e6341 100644
--- a/third_party/chromium/media/base/bind_to_current_loop.h
+++ b/third_party/chromium/media/base/bind_to_current_loop.h
@@ -15,6 +15,24 @@
 
 namespace media {
 
+#if defined(STARBOARD)
+
+template <typename... Args>
+inline base::RepeatingCallback<void(Args...)> BindToCurrentLoop(
+    base::RepeatingCallback<void(Args...)> cb) {
+  return base::BindPostTask(base::SequencedTaskRunnerHandle::Get(),
+                            std::move(cb), FROM_HERE);
+}
+
+template <typename... Args>
+inline base::OnceCallback<void(Args...)> BindToCurrentLoop(
+    base::OnceCallback<void(Args...)> cb) {
+  return base::BindPostTask(base::SequencedTaskRunnerHandle::Get(),
+                            std::move(cb), FROM_HERE);
+}
+
+#else  // defined(STARBOARD)
+
 template <typename... Args>
 inline base::RepeatingCallback<void(Args...)> BindToCurrentLoop(
     base::RepeatingCallback<void(Args...)> cb,
@@ -31,6 +49,8 @@
                             std::move(cb), location);
 }
 
+#endif  // defined(STARBOARD)
+
 }  // namespace media
 
 #endif  // MEDIA_BASE_BIND_TO_CURRENT_LOOP_H_
diff --git a/third_party/chromium/media/base/decoder_buffer.cc b/third_party/chromium/media/base/decoder_buffer.cc
index 995e104..7f8d096 100644
--- a/third_party/chromium/media/base/decoder_buffer.cc
+++ b/third_party/chromium/media/base/decoder_buffer.cc
@@ -7,9 +7,24 @@
 #include <sstream>
 
 #include "base/debug/alias.h"
+#if defined(STARBOARD)
+#include "starboard/media.h"
+#endif  // defined(STARBOARD)
 
 namespace media {
 
+#if defined(STARBOARD)
+
+namespace {
+DecoderBuffer::Allocator* s_allocator = nullptr;
+}  // namespace
+
+// static
+void DecoderBuffer::Allocator::Set(Allocator* allocator) {
+  s_allocator = allocator;
+}
+#endif  // defined(STARBOARD)
+
 DecoderBuffer::DecoderBuffer(size_t size)
     : size_(size), side_data_size_(0), is_key_frame_(false) {
   Initialize();
@@ -28,7 +43,11 @@
 
   Initialize();
 
+#if defined(STARBOARD)
+  memcpy(data_, data, size_);
+#else  // defined(STARBOARD)
   memcpy(data_.get(), data, size_);
+#endif  // defined(STARBOARD)
 
   if (!side_data) {
     CHECK_EQ(side_data_size, 0u);
@@ -39,6 +58,7 @@
   memcpy(side_data_.get(), side_data, side_data_size_);
 }
 
+#if !defined(STARBOARD)
 DecoderBuffer::DecoderBuffer(std::unique_ptr<uint8_t[]> data, size_t size)
     : data_(std::move(data)),
       size_(size),
@@ -59,14 +79,31 @@
       side_data_size_(0),
       shared_mem_mapping_(std::move(shared_mem_mapping)),
       is_key_frame_(false) {}
+#endif  // !defined(STARBOARD)
 
 DecoderBuffer::~DecoderBuffer() {
+#if defined(STARBOARD)
+  DCHECK(s_allocator);
+  s_allocator->Free(data_, allocated_size_);
+#else  // defined(STARBOARD)
   data_.reset();
+#endif  // defined(STARBOARD)
   side_data_.reset();
 }
 
 void DecoderBuffer::Initialize() {
+#if defined(STARBOARD)
+  DCHECK(s_allocator);
+  DCHECK(!data_);
+  // TODO(b/230887703): Consider deprecate type parameter to
+  // `SbMediaGetBufferAlignment()`.
+  data_ = static_cast<uint8_t*>(
+              s_allocator->Allocate(
+                  size_, SbMediaGetBufferAlignment(kSbMediaTypeVideo)));
+  allocated_size_ = size_;
+#else  // defined(STARBOARD)
   data_.reset(new uint8_t[size_]);
+#endif  // defined(STARBOARD)
   if (side_data_size_ > 0)
     side_data_.reset(new uint8_t[side_data_size_]);
 }
@@ -91,6 +128,8 @@
       new DecoderBuffer(data, data_size, side_data, side_data_size));
 }
 
+#if !defined(STARBOARD)
+
 // static
 scoped_refptr<DecoderBuffer> DecoderBuffer::FromArray(
     std::unique_ptr<uint8_t[]> data,
@@ -131,6 +170,8 @@
       new DecoderBuffer(std::move(unaligned_mapping), size));
 }
 
+#endif  // !defined(STARBOARD)
+
 // static
 scoped_refptr<DecoderBuffer> DecoderBuffer::CreateEOSBuffer() {
   return base::WrapRefCounted(new DecoderBuffer(NULL, 0, NULL, 0));
diff --git a/third_party/chromium/media/base/decoder_buffer.h b/third_party/chromium/media/base/decoder_buffer.h
index 9a305f3..ed7c01e 100644
--- a/third_party/chromium/media/base/decoder_buffer.h
+++ b/third_party/chromium/media/base/decoder_buffer.h
@@ -21,7 +21,9 @@
 #include "media/base/decrypt_config.h"
 #include "media/base/media_export.h"
 #include "media/base/timestamp_constants.h"
+#if !defined(STARBOARD)
 #include "media/base/unaligned_shared_memory.h"
+#endif  // !defined(STARBOARD)
 
 namespace media {
 
@@ -42,6 +44,21 @@
 #endif
   };
 
+#if defined(STARBOARD)
+  class Allocator {
+    public:
+      // The function should never return nullptr.  It may terminate the app on
+      // allocation failure.
+      virtual void* Allocate(size_t size, size_t alignment) = 0;
+      virtual void Free(void* p, size_t size) = 0;
+
+    protected:
+      ~Allocator() {}
+
+      static void Set(Allocator* allocator);
+  };
+#endif  // defined(STARBOARD)
+
   // Allocates buffer with |size| >= 0. |is_key_frame_| will default to false.
   explicit DecoderBuffer(size_t size);
 
@@ -59,6 +76,7 @@
                                                const uint8_t* side_data,
                                                size_t side_data_size);
 
+#if !defined(STARBOARD)
   // Create a DecoderBuffer where data() of |size| bytes resides within the heap
   // as byte array. The buffer's |is_key_frame_| will default to false.
   //
@@ -87,6 +105,7 @@
       base::ReadOnlySharedMemoryRegion region,
       off_t offset,
       size_t size);
+#endif  // !defined(STARBOARD)
 
   // Create a DecoderBuffer indicating we've reached end of stream.
   //
@@ -118,19 +137,29 @@
 
   const uint8_t* data() const {
     DCHECK(!end_of_stream());
+
+#if defined(STARBOARD)
+    return data_;
+#else  // defined(STARBOARD)
     if (shared_mem_mapping_ && shared_mem_mapping_->IsValid())
       return static_cast<const uint8_t*>(shared_mem_mapping_->memory());
     if (shm_)
       return static_cast<uint8_t*>(shm_->memory());
     return data_.get();
+#endif  // defined(STARBOARD)
   }
 
   // TODO(sandersd): Remove writable_data(). https://crbug.com/834088
   uint8_t* writable_data() const {
     DCHECK(!end_of_stream());
+
+#if defined(STARBOARD)
+    return data_;
+#else  // defined(STARBOARD)
     DCHECK(!shm_);
     DCHECK(!shared_mem_mapping_);
     return data_.get();
+#endif  // defined(STARBOARD)
   }
 
   size_t data_size() const {
@@ -172,7 +201,12 @@
   }
 
   // If there's no data in this buffer, it represents end of stream.
+#if defined(STARBOARD)
+  bool end_of_stream() const { return !data_; }
+  void shrink_to(size_t size) { DCHECK_LE(size, size_); size_ = size; }
+#else  // defined(STARBOARD)
   bool end_of_stream() const { return !shared_mem_mapping_ && !shm_ && !data_; }
+#endif  // defined(STARBOARD)
 
   bool is_key_frame() const {
     DCHECK(!end_of_stream());
@@ -205,17 +239,25 @@
                 const uint8_t* side_data,
                 size_t side_data_size);
 
+#if !defined(STARBOARD)
   DecoderBuffer(std::unique_ptr<uint8_t[]> data, size_t size);
 
   DecoderBuffer(std::unique_ptr<UnalignedSharedMemory> shm, size_t size);
 
   DecoderBuffer(std::unique_ptr<ReadOnlyUnalignedMapping> shared_mem_mapping,
                 size_t size);
+#endif  // !defined(STARBOARD)
 
   virtual ~DecoderBuffer();
 
+#if defined(STARBOARD)
+  // Encoded data, allocated from DecoderBuffer::Allocator.
+  uint8_t* data_ = nullptr;
+  size_t allocated_size_ = 0;
+#else  // defined(STARBOARD)
   // Encoded data, if it is stored on the heap.
   std::unique_ptr<uint8_t[]> data_;
+#endif  // defined(STARBOARD)
 
  private:
   // Presentation time of the frame.
@@ -230,11 +272,13 @@
   size_t side_data_size_;
   std::unique_ptr<uint8_t[]> side_data_;
 
+#if !defined(STARBOARD)
   // Encoded data, if it is stored in a shared memory mapping.
   std::unique_ptr<ReadOnlyUnalignedMapping> shared_mem_mapping_;
 
   // Encoded data, if it is stored in SHM.
   std::unique_ptr<UnalignedSharedMemory> shm_;
+#endif  // !defined(STARBOARD)
 
   // Encryption parameters for the encoded data.
   std::unique_ptr<DecryptConfig> decrypt_config_;
diff --git a/third_party/chromium/media/base/demuxer_memory_limit_starboard.cc b/third_party/chromium/media/base/demuxer_memory_limit_starboard.cc
new file mode 100644
index 0000000..0a622e5
--- /dev/null
+++ b/third_party/chromium/media/base/demuxer_memory_limit_starboard.cc
@@ -0,0 +1,82 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "media/base/demuxer_memory_limit.h"
+#include "media/base/video_codecs.h"
+#include "base/logging.h"
+#include "starboard/media.h"
+
+namespace media {
+namespace {
+
+// TODO(b/231375871): Move this to video_codecs.h.  Also consider remove
+// starboard_utils.* and move the functions to individual files.
+SbMediaVideoCodec MediaVideoCodecToSbMediaVideoCodec(VideoCodec codec) {
+  switch (codec) {
+    case VideoCodec::kH264:
+      return kSbMediaVideoCodecH264;
+    case VideoCodec::kVC1:
+      return kSbMediaVideoCodecVc1;
+    case VideoCodec::kMPEG2:
+      return kSbMediaVideoCodecMpeg2;
+    case VideoCodec::kTheora:
+      return kSbMediaVideoCodecTheora;
+    case VideoCodec::kVP8:
+      return kSbMediaVideoCodecVp8;
+    case VideoCodec::kVP9:
+      return kSbMediaVideoCodecVp9;
+    case VideoCodec::kHEVC:
+      return kSbMediaVideoCodecH265;
+    case VideoCodec::kAV1:
+      return kSbMediaVideoCodecAv1;
+    default:
+      // Cobalt only supports a subset of video codecs defined by Chromium.
+      DLOG(ERROR) << "Unsupported video codec " << GetCodecName(codec);
+      return kSbMediaVideoCodecNone;
+  }
+  NOTREACHED();
+  return kSbMediaVideoCodecNone;
+}
+
+}  // namespace
+
+size_t GetDemuxerStreamAudioMemoryLimit(
+    const AudioDecoderConfig* /*audio_config*/) {
+  return SbMediaGetAudioBufferBudget();
+}
+
+size_t GetDemuxerStreamVideoMemoryLimit(
+    Demuxer::DemuxerTypes /*demuxer_type*/,
+    const VideoDecoderConfig* video_config) {
+  if (!video_config) {
+    return static_cast<size_t>(
+        SbMediaGetVideoBufferBudget(kSbMediaVideoCodecH264, 1920, 1080, 8));
+  }
+
+  auto width = video_config->visible_rect().size().width();
+  auto height = video_config->visible_rect().size().height();
+  // TODO(b/230799815_): Ensure |bits_per_pixel| always contains a valid value,
+  // or consider deprecating it from `SbMediaGetVideoBufferBudget()`.
+  auto bits_per_pixel = 0;
+  auto codec = MediaVideoCodecToSbMediaVideoCodec(video_config->codec());
+  return static_cast<size_t>(
+      SbMediaGetVideoBufferBudget(codec, width, height, bits_per_pixel));
+}
+
+size_t GetDemuxerMemoryLimit(Demuxer::DemuxerTypes demuxer_type) {
+  return GetDemuxerStreamAudioMemoryLimit(nullptr) +
+         GetDemuxerStreamVideoMemoryLimit(demuxer_type, nullptr);
+}
+
+}  // namespace media
diff --git a/third_party/chromium/media/base/demuxer_stream.h b/third_party/chromium/media/base/demuxer_stream.h
index 3b10523..9a31c24 100644
--- a/third_party/chromium/media/base/demuxer_stream.h
+++ b/third_party/chromium/media/base/demuxer_stream.h
@@ -64,6 +64,10 @@
 
   static const char* GetStatusName(Status status);
 
+#if defined(STARBOARD)
+  virtual std::string mime_type() const { return ""; }
+#endif  // defined (STARBOARD)
+
   // Request a buffer to returned via the provided callback.
   //
   // The first parameter indicates the status of the read.
diff --git a/third_party/chromium/media/base/media_log.h b/third_party/chromium/media/base/media_log.h
index 4cf55eb..89d44be 100644
--- a/third_party/chromium/media/base/media_log.h
+++ b/third_party/chromium/media/base/media_log.h
@@ -30,6 +30,39 @@
 
 namespace media {
 
+#if defined(STARBOARD)
+
+// A stub MediaLog implementation.
+// TODO(b/230916218): Consider making use of MediaLog for debugging.
+class MEDIA_EXPORT MediaLog {
+public:  template <MediaLogProperty P, typename T>
+  void SetProperty(const T& value) {}
+  MediaLog() {}
+  virtual ~MediaLog() {}
+
+  virtual void AddLogRecordLocked(
+      std::unique_ptr<media::MediaLogRecord> event) {
+    NOTREACHED();
+  }
+
+  template <MediaLogEvent E, typename... T>
+  void AddEvent(const T&... value) {
+  }
+
+  template <MediaLogEvent E, typename... T>
+  int CreateEvent(const T&... value) {
+    return 0;
+  }
+
+  void NotifyError(PipelineStatus status) {}
+};
+
+#define MEDIA_LOG(level, media_log) LOG(INFO)
+
+#define LIMITED_MEDIA_LOG(level, media_log, count, max) DLOG(INFO)
+
+#else  // defined(STARBOARD)
+
 // Interface for media components to log to chrome://media-internals log.
 //
 // To provide a logging implementation, derive from MediaLog instead.
@@ -240,6 +273,8 @@
                                "may be suppressed): "                         \
                              : "")
 
+#endif  // defined(STARBOARD)
+
 }  // namespace media
 
 #endif  // MEDIA_BASE_MEDIA_LOG_H_
diff --git a/third_party/chromium/media/base/media_serializers.h b/third_party/chromium/media/base/media_serializers.h
index b44da27..d51a621 100644
--- a/third_party/chromium/media/base/media_serializers.h
+++ b/third_party/chromium/media/base/media_serializers.h
@@ -54,10 +54,15 @@
 template <typename VecType>
 struct MediaSerializer<std::vector<VecType>> {
   static base::Value Serialize(const std::vector<VecType>& vec) {
+#if defined(STARBOARD)
+    NOTREACHED();
+    return base::Value();
+#else  // defined(STARBOARD)
     base::Value result(base::Value::Type::LIST);
     for (const VecType& value : vec)
       result.Append(MediaSerializer<VecType>::Serialize(value));
     return result;
+#endif  // defined(STARBOARD)
   }
 };
 
@@ -308,7 +313,12 @@
     // defined for int64_t, (long vs long long) so format specifiers dont work.
     std::ostringstream preroll;
     preroll << value.seek_preroll().InMicroseconds() << "us";
+
+#if defined(STARBOARD)
+    result.SetKey("seek preroll", base::Value(preroll.str()));
+#else  // defined(STARBOARD)
     result.SetStringKey("seek preroll", preroll.str());
+#endif  // defined(STARBOARD)
 
     return result;
   }
@@ -424,8 +434,13 @@
         break;
     }
 
+#if defined(STARBOARD)
+    if (T == SerializableBufferingStateType::kPipeline)
+      result.SetKey("for_suspended_start", base::Value(value.suspended_start));
+#else  // defined(STARBOARD)
     if (T == SerializableBufferingStateType::kPipeline)
       result.SetBoolKey("for_suspended_start", value.suspended_start);
+#endif  // defined(STARBOARD)
 
     return result;
   }
diff --git a/third_party/chromium/media/base/media_switches.h b/third_party/chromium/media/base/media_switches.h
index e09620e..fa26330 100644
--- a/third_party/chromium/media/base/media_switches.h
+++ b/third_party/chromium/media/base/media_switches.h
@@ -273,10 +273,12 @@
   kHeuristic,
 };
 
+#if !defined(STARBOARD)
 // Feature param used to force default pin/unpin for global media controls in
 // CrOS.
 MEDIA_EXPORT extern const base::FeatureParam<kCrosGlobalMediaControlsPinOptions>
     kCrosGlobalMediaControlsPinParam;
+#endif  // !defined(STARBOARD)
 
 }  // namespace media
 
diff --git a/third_party/chromium/media/base/mime_util_internal.cc b/third_party/chromium/media/base/mime_util_internal.cc
index 2a0ee05..a08acbc 100644
--- a/third_party/chromium/media/base/mime_util_internal.cc
+++ b/third_party/chromium/media/base/mime_util_internal.cc
@@ -632,10 +632,14 @@
       return is_encrypted ? platform_info.has_platform_vp8_decoder : true;
 
     case VP9: {
+#if !defined(STARBOARD)
+      // Cobalt doesn't support `kReportVp9AsAnUnsupportedMimeType` command line
+      // switch.
       if (base::CommandLine::ForCurrentProcess()->HasSwitch(
               switches::kReportVp9AsAnUnsupportedMimeType)) {
         return false;
       }
+#endif  // !defined(STARBOARD)
 
       // If clear, the unified pipeline can always decode VP9.0,1 in software.
       // If we don't know the profile, then support is ambiguous, but default to
diff --git a/third_party/chromium/media/base/pipeline_status.cc b/third_party/chromium/media/base/pipeline_status.cc
index 7e439f2..3e4861e 100644
--- a/third_party/chromium/media/base/pipeline_status.cc
+++ b/third_party/chromium/media/base/pipeline_status.cc
@@ -94,6 +94,11 @@
       return StatusCode::kPipelineErrorDemuxerErrorDetectedHLS;
     case PIPELINE_ERROR_HARDWARE_CONTEXT_RESET:
       return StatusCode::kPipelineErrorHardwareContextReset;
+#if defined(STARBOARD)
+    case PLAYBACK_CAPABILITY_CHANGED:
+      NOTREACHED();
+      return StatusCode::kPipelineErrorDecode;
+#endif  // defined(STARBOARD)
   }
 
   NOTREACHED();
@@ -127,6 +132,9 @@
     STRINGIFY_STATUS_CASE(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR);
     STRINGIFY_STATUS_CASE(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR);
     STRINGIFY_STATUS_CASE(AUDIO_RENDERER_ERROR);
+#if defined(STARBOARD)
+    STRINGIFY_STATUS_CASE(PLAYBACK_CAPABILITY_CHANGED);
+#endif  // defined(STARBOARD)
   }
 
 #undef STRINGIFY_STATUS_CASE
diff --git a/third_party/chromium/media/base/pipeline_status.h b/third_party/chromium/media/base/pipeline_status.h
index 88b6c8c..9b53d78 100644
--- a/third_party/chromium/media/base/pipeline_status.h
+++ b/third_party/chromium/media/base/pipeline_status.h
@@ -63,6 +63,11 @@
   // https://crbug.com/1208618
   PIPELINE_ERROR_HARDWARE_CONTEXT_RESET = 23,
 
+#if defined(STARBOARD)
+  // Transient errors.
+  PLAYBACK_CAPABILITY_CHANGED = 24,
+#endif  // defined(STARBOARD)
+
   // Must be equal to the largest value ever logged.
   PIPELINE_STATUS_MAX = PIPELINE_ERROR_HARDWARE_CONTEXT_RESET,
 };
diff --git a/third_party/chromium/media/base/status.h b/third_party/chromium/media/base/status.h
index ced9c6e..6101e3f 100644
--- a/third_party/chromium/media/base/status.h
+++ b/third_party/chromium/media/base/status.h
@@ -17,6 +17,7 @@
 #include "media/base/media_export.h"
 #include "media/base/media_serializers_base.h"
 #include "media/base/status_codes.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 // Mojo namespaces for serialization friend declarations.
 namespace mojo {
diff --git a/third_party/chromium/media/base/stream_parser_buffer.h b/third_party/chromium/media/base/stream_parser_buffer.h
index 0999d8e..603cf1b 100644
--- a/third_party/chromium/media/base/stream_parser_buffer.h
+++ b/third_party/chromium/media/base/stream_parser_buffer.h
@@ -63,7 +63,9 @@
   }
 
   double operator/(base::TimeDelta rhs) const { return ts_ / rhs; }
+#if !defined(STARBOARD)
   int64_t IntDiv(base::TimeDelta rhs) const { return ts_.IntDiv(rhs); }
+#endif  // !defined(STARBOARD)
 
   static DecodeTimestamp FromSecondsD(double seconds) {
     return DecodeTimestamp(base::Seconds(seconds));
diff --git a/third_party/chromium/media/base/supported_types.cc b/third_party/chromium/media/base/supported_types.cc
index 9c4e2ea..6469eae 100644
--- a/third_party/chromium/media/base/supported_types.cc
+++ b/third_party/chromium/media/base/supported_types.cc
@@ -15,6 +15,7 @@
 #include "media/base/media_client.h"
 #include "media/base/media_switches.h"
 #include "media/media_buildflags.h"
+#if !defined(STARBOARD)
 #include "ui/display/display_switches.h"
 
 #if BUILDFLAG(ENABLE_LIBVPX)
@@ -24,6 +25,8 @@
 #include "third_party/libvpx/source/libvpx/vpx/vpx_codec.h"
 #endif
 
+#endif  // !defined(STARBOARD)
+
 #if defined(OS_ANDROID)
 #include "base/android/build_info.h"
 
@@ -78,17 +81,21 @@
 }  // namespace
 
 bool IsSupportedAudioType(const AudioType& type) {
+#if !defined(STARBOARD)
   MediaClient* media_client = GetMediaClient();
   if (media_client)
     return media_client->IsSupportedAudioType(type);
+#endif  // !defined(STARBOARD)
 
   return IsDefaultSupportedAudioType(type);
 }
 
 bool IsSupportedVideoType(const VideoType& type) {
+#if !defined(STARBOARD)
   MediaClient* media_client = GetMediaClient();
   if (media_client)
     return media_client->IsSupportedVideoType(type);
+#endif  // !defined(STARBOARD)
 
   return IsDefaultSupportedVideoType(type);
 }
@@ -176,6 +183,12 @@
 }
 
 bool IsVp9ProfileSupported(VideoCodecProfile profile) {
+#if defined(STARBOARD)
+  // Assume all profiles are supported, and let the Starboard implementation to
+  // filter it out.
+  return profile == VP9PROFILE_PROFILE0 || profile == VP9PROFILE_PROFILE1 ||
+         profile == VP9PROFILE_PROFILE2 || profile == VP9PROFILE_PROFILE3;
+#else  // defined(STARBOARD)
 #if BUILDFLAG(ENABLE_LIBVPX)
   // High bit depth capabilities may be toggled via LibVPX config flags.
   static const bool vpx_supports_hbd = (vpx_codec_get_caps(vpx_codec_vp9_dx()) &
@@ -202,6 +215,7 @@
   }
 #endif
   return false;
+#endif  // defined(STARBOARD)
 }
 
 bool IsAudioCodecProprietary(AudioCodec codec) {
diff --git a/third_party/chromium/media/cobalt/base/bind_post_task.h b/third_party/chromium/media/cobalt/base/bind_post_task.h
new file mode 100644
index 0000000..b914e8a
--- /dev/null
+++ b/third_party/chromium/media/cobalt/base/bind_post_task.h
@@ -0,0 +1,131 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_BIND_POST_TASK_H_
+#define BASE_BIND_POST_TASK_H_
+
+#include "base/location.h"
+
+namespace base {
+
+// Helper class to ensure that the input callback is always invoked and
+// destroyed on the provided task runner.
+template <typename CallbackType>
+class BindPostTaskTrampoline {
+ public:
+  BindPostTaskTrampoline(scoped_refptr<base::TaskRunner> task_runner,
+                         const base::Location& location,
+                         CallbackType callback)
+      : task_runner_(std::move(task_runner)),
+        location_(location),
+        callback_(std::move(callback)) {
+    DCHECK(task_runner_);
+    // Crash immediately instead of when trying to Run() `callback_` on the
+    // destination `task_runner_`.
+    CHECK(callback_);
+  }
+
+  BindPostTaskTrampoline(const BindPostTaskTrampoline& other) = delete;
+  BindPostTaskTrampoline& operator=(const BindPostTaskTrampoline& other) =
+      delete;
+
+  ~BindPostTaskTrampoline() {
+    if (callback_) {
+      // Post a task to ensure that `callback_` is destroyed on `task_runner_`.
+      // The callback's BindState may own an object that isn't threadsafe and is
+      // unsafe to destroy on a different task runner.
+      //
+      // Note that while this guarantees `callback_` will be destroyed when the
+      // posted task runs, it doesn't guarantee the ref-counted BindState is
+      // destroyed at the same time. If the callback was copied before being
+      // passed to BindPostTaskTrampoline then the BindState can outlive
+      // `callback_`, so the user must ensure any other copies of the callback
+      // are also destroyed on the correct task runner.
+      task_runner_->PostTask(location_, BindOnce(&DestroyCallbackOnTaskRunner,
+                                                 std::move(callback_)));
+    }
+  }
+
+  template <typename... Args>
+  void Run(Args... args) {
+    // If CallbackType is a OnceCallback then GetClosure() consumes `callback_`.
+    task_runner_->PostTask(location_,
+                           GetClosure(&callback_, std::forward<Args>(args)...));
+  }
+
+ private:
+  typedef base::OnceClosure OnceClosure;
+
+  static OnceClosure GetClosure(OnceClosure* callback) {
+    // `callback` is already a closure, no need to call BindOnce().
+    return std::move(*callback);
+  }
+
+  template <typename... Args>
+  static OnceClosure GetClosure(base::OnceCallback<void(Args...)>* callback,
+                                Args&&... args) {
+    return BindOnce(std::move(*callback), std::forward<Args>(args)...);
+  }
+
+  static OnceClosure GetClosure(base::RepeatingClosure* callback) {
+    // `callback` is already a closure, no need to call BindOnce().
+    return *callback;
+  }
+
+  template <typename... Args>
+  static OnceClosure GetClosure(base::RepeatingCallback<void(Args...)>* callback,
+                                Args&&... args) {
+    return BindOnce(*callback, std::forward<Args>(args)...);
+  }
+
+  static void DestroyCallbackOnTaskRunner(CallbackType callback) {}
+
+  const scoped_refptr<base::TaskRunner> task_runner_;
+  const base::Location location_;
+  CallbackType callback_;
+};
+
+template <typename ReturnType, typename... Args>
+base::OnceCallback<void(Args...)> BindPostTask(
+    scoped_refptr<base::TaskRunner> task_runner,
+    base::OnceCallback<ReturnType(Args...)> callback,
+    const base::Location& location) {
+  static_assert(std::is_same<ReturnType, void>::value,
+                "OnceCallback must have void return type in order to produce a "
+                "closure for PostTask(). Use base::IgnoreResult() to drop the "
+                "return value if desired.");
+
+  using Helper = BindPostTaskTrampoline<base::OnceCallback<void(Args...)>>;
+
+  return base::BindOnce(
+      &Helper::template Run<Args...>,
+      std::make_unique<Helper>(std::move(task_runner), location,
+                               std::move(callback)));
+}
+
+// Creates a RepeatingCallback that will run |callback| on |task_runner|. When
+// the returned callback is destroyed a task will be posted to destroy the input
+// |callback| on |task_runner|.
+template <typename ReturnType, typename... Args>
+base::RepeatingCallback<void(Args...)> BindPostTask(
+    scoped_refptr<base::TaskRunner> task_runner,
+    base::RepeatingCallback<ReturnType(Args...)> callback,
+    const base::Location& location) {
+  static_assert(std::is_same<ReturnType, void>::value,
+                "RepeatingCallback must have void return type in order to "
+                "produce a closure for PostTask(). Use base::IgnoreResult() to "
+                "drop the return value if desired.");
+
+  using Helper =
+      BindPostTaskTrampoline<base::RepeatingCallback<void(Args...)>>;
+
+  return base::BindRepeating(
+      &Helper::template Run<Args...>,
+      std::make_unique<Helper>(std::move(task_runner), location,
+                               std::move(callback)));
+}
+
+}  // namespace base
+
+#endif  // BASE_BIND_POST_TASK_H_
diff --git a/third_party/chromium/media/cobalt/base/check.h b/third_party/chromium/media/cobalt/base/check.h
new file mode 100644
index 0000000..d26320b
--- /dev/null
+++ b/third_party/chromium/media/cobalt/base/check.h
@@ -0,0 +1,20 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef BASE_CHECK_H_
+#define BASE_CHECK_H_
+
+#include "base/logging.h"
+
+#endif  // BASE_CHECK_H_
diff --git a/third_party/chromium/media/cobalt/base/check_op.h b/third_party/chromium/media/cobalt/base/check_op.h
new file mode 100644
index 0000000..296c84f
--- /dev/null
+++ b/third_party/chromium/media/cobalt/base/check_op.h
@@ -0,0 +1,20 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef BASE_CHECK_OP_H_
+#define BASE_CHECK_OP_H_
+
+#include "base/logging.h"
+
+#endif  // BASE_CHECK_OP_H_
diff --git a/third_party/chromium/media/cobalt/base/cxx17_backports.h b/third_party/chromium/media/cobalt/base/cxx17_backports.h
new file mode 100644
index 0000000..a7c1c13
--- /dev/null
+++ b/third_party/chromium/media/cobalt/base/cxx17_backports.h
@@ -0,0 +1,20 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef BASE_CXX17_BACKPORTS_H_
+#define BASE_CXX17_BACKPORTS_H_
+
+#include "base/stl_util.h"
+
+#endif  // BASE_CXX17_BACKPORTS_H_
diff --git a/third_party/chromium/media/cobalt/base/hash/md5.h b/third_party/chromium/media/cobalt/base/hash/md5.h
new file mode 100644
index 0000000..2993131
--- /dev/null
+++ b/third_party/chromium/media/cobalt/base/hash/md5.h
@@ -0,0 +1,20 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef BASE_HASH_MD5_H_
+#define BASE_HASH_MD5_H_
+
+#include "base/md5.h"
+
+#endif  // BASE_HASH_MD5_H_
diff --git a/third_party/chromium/media/cobalt/base/notreached.h b/third_party/chromium/media/cobalt/base/notreached.h
new file mode 100644
index 0000000..0afca93
--- /dev/null
+++ b/third_party/chromium/media/cobalt/base/notreached.h
@@ -0,0 +1,20 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef BASE_NOTREACHED_H_
+#define BASE_NOTREACHED_H_
+
+#include "base/logging.h"
+
+#endif  // BASE_NOTREACHED_H_
diff --git a/third_party/chromium/media/cobalt/base/types/strong_alias.h b/third_party/chromium/media/cobalt/base/types/strong_alias.h
new file mode 100644
index 0000000..8c148d4
--- /dev/null
+++ b/third_party/chromium/media/cobalt/base/types/strong_alias.h
@@ -0,0 +1,154 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TYPES_STRONG_ALIAS_H_
+#define BASE_TYPES_STRONG_ALIAS_H_
+
+#include <ostream>
+#include <type_traits>
+#include <utility>
+
+#include "base/template_util.h"
+
+namespace base {
+
+// A type-safe alternative for a typedef or a 'using' directive.
+//
+// C++ currently does not support type-safe typedefs, despite multiple proposals
+// (ex. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3515.pdf). The
+// next best thing is to try and emulate them in library code.
+//
+// The motivation is to disallow several classes of errors:
+//
+// using Orange = int;
+// using Apple = int;
+// Apple apple(2);
+// Orange orange = apple;  // Orange should not be able to become an Apple.
+// Orange x = orange + apple;  // Shouldn't add Oranges and Apples.
+// if (orange > apple);  // Shouldn't compare Apples to Oranges.
+// void foo(Orange);
+// void foo(Apple);  // Redefinition.
+// etc.
+//
+// StrongAlias may instead be used as follows:
+//
+// using Orange = StrongAlias<class OrangeTag, int>;
+// using Apple = StrongAlias<class AppleTag, int>;
+// using Banana = StrongAlias<class BananaTag, std::string>;
+// Apple apple(2);
+// Banana banana("Hello");
+// Orange orange = apple;  // Does not compile.
+// Orange other_orange = orange;  // Compiles, types match.
+// Orange x = orange + apple;  // Does not compile.
+// Orange y = Orange(orange.value() + apple.value());  // Compiles.
+// Orange z = Orange(banana->size() + *other_orange);  // Compiles.
+// if (orange > apple);  // Does not compile.
+// if (orange > other_orange);  // Compiles.
+// void foo(Orange);
+// void foo(Apple);  // Compiles into separate overload.
+//
+// StrongAlias is a zero-cost abstraction, it's compiled away.
+//
+// TagType is an empty tag class (also called "phantom type") that only serves
+// the type system to differentiate between different instantiations of the
+// template.
+// UnderlyingType may be almost any value type. Note that some methods of the
+// StrongAlias may be unavailable (ie. produce elaborate compilation errors when
+// used) if UnderlyingType doesn't support them.
+//
+// StrongAlias only directly exposes comparison operators (for convenient use in
+// ordered containers) and a Hasher struct (for unordered_map/set). It's
+// impossible, without reflection, to expose all methods of the UnderlyingType
+// in StrongAlias's interface. It's also potentially unwanted (ex. you don't
+// want to be able to add two StrongAliases that represent socket handles).
+// A getter and dereference operators are provided in case you need to access
+// the UnderlyingType.
+//
+// See also
+// - //styleguide/c++/blink-c++.md which provides recommendation and examples of
+//   using StrongAlias<Tag, bool> instead of a bare bool.
+// - IdType<...> which provides helpers for specializing StrongAlias to be
+//   used as an id.
+// - TokenType<...> which provides helpers for specializing StrongAlias to be
+//   used as a wrapper of base::UnguessableToken.
+template <typename TagType, typename UnderlyingType>
+class StrongAlias {
+ public:
+  constexpr StrongAlias() = default;
+  constexpr explicit StrongAlias(const UnderlyingType& v) : value_(v) {}
+  constexpr explicit StrongAlias(UnderlyingType&& v) noexcept
+      : value_(std::move(v)) {}
+
+  constexpr UnderlyingType* operator->() { return &value_; }
+  constexpr const UnderlyingType* operator->() const { return &value_; }
+
+  constexpr UnderlyingType& operator*() & { return value_; }
+  constexpr const UnderlyingType& operator*() const& { return value_; }
+  constexpr UnderlyingType&& operator*() && { return std::move(value_); }
+  constexpr const UnderlyingType&& operator*() const&& {
+    return std::move(value_);
+  }
+
+  constexpr UnderlyingType& value() & { return value_; }
+  constexpr const UnderlyingType& value() const& { return value_; }
+  constexpr UnderlyingType&& value() && { return std::move(value_); }
+  constexpr const UnderlyingType&& value() const&& { return std::move(value_); }
+
+  constexpr explicit operator const UnderlyingType&() const& { return value_; }
+
+  constexpr bool operator==(const StrongAlias& other) const {
+    return value_ == other.value_;
+  }
+  constexpr bool operator!=(const StrongAlias& other) const {
+    return value_ != other.value_;
+  }
+  constexpr bool operator<(const StrongAlias& other) const {
+    return value_ < other.value_;
+  }
+  constexpr bool operator<=(const StrongAlias& other) const {
+    return value_ <= other.value_;
+  }
+  constexpr bool operator>(const StrongAlias& other) const {
+    return value_ > other.value_;
+  }
+  constexpr bool operator>=(const StrongAlias& other) const {
+    return value_ >= other.value_;
+  }
+
+  // Hasher to use in std::unordered_map, std::unordered_set, etc.
+  //
+  // Example usage:
+  //     using MyType = base::StrongAlias<...>;
+  //     using MySet = std::unordered_set<MyType, typename MyType::Hasher>;
+  //
+  // https://google.github.io/styleguide/cppguide.html#std_hash asks to avoid
+  // defining specializations of `std::hash` - this is why the hasher needs to
+  // be explicitly specified and why the following code will *not* work:
+  //     using MyType = base::StrongAlias<...>;
+  //     using MySet = std::unordered_set<MyType>;  // This won't work.
+  struct Hasher {
+    using argument_type = StrongAlias;
+    using result_type = std::size_t;
+    result_type operator()(const argument_type& id) const {
+      return std::hash<UnderlyingType>()(id.value());
+    }
+  };
+
+ protected:
+  UnderlyingType value_;
+};
+
+// Stream operator for convenience, streams the UnderlyingType.
+template <typename TagType,
+          typename UnderlyingType,
+          typename = std::enable_if_t<
+              base::internal::SupportsOstreamOperator<UnderlyingType>::value>>
+std::ostream& operator<<(std::ostream& stream,
+                         const StrongAlias<TagType, UnderlyingType>& alias) {
+  return stream << alias.value();
+}
+
+}  // namespace base
+
+#endif  // BASE_TYPES_STRONG_ALIAS_H_
diff --git a/third_party/chromium/media/cobalt/net/cookies/site_for_cookies.h b/third_party/chromium/media/cobalt/net/cookies/site_for_cookies.h
new file mode 100644
index 0000000..296e3e4
--- /dev/null
+++ b/third_party/chromium/media/cobalt/net/cookies/site_for_cookies.h
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_SITE_FOR_COOKIES_H
+#define NET_SITE_FOR_COOKIES_H
+
+namespace net {
+
+// Reduced version enough to make media code depending on it to be built.
+class SiteForCookies {
+};
+
+}  // namespace net
+
+#endif  // NET_SITE_FOR_COOKIES_H
diff --git a/third_party/chromium/media/cobalt/third_party/abseil-cpp/absl/types/optional.h b/third_party/chromium/media/cobalt/third_party/abseil-cpp/absl/types/optional.h
new file mode 100644
index 0000000..da00e41
--- /dev/null
+++ b/third_party/chromium/media/cobalt/third_party/abseil-cpp/absl/types/optional.h
@@ -0,0 +1,29 @@
+// Copyright 2022 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_TYPES_OPTIONAL_H_
+#define ABSL_TYPES_OPTIONAL_H_
+
+#include "base/optional.h"
+
+namespace absl {
+
+template<typename T>
+using optional = base::Optional<T>;
+
+using base::nullopt;
+
+}  // namespace absl
+
+#endif  // ABSL_TYPES_OPTIONAL_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/color_space.h b/third_party/chromium/media/cobalt/ui/gfx/color_space.h
new file mode 100644
index 0000000..169ef2f
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/color_space.h
@@ -0,0 +1,417 @@
+// 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 UI_GFX_COLOR_SPACE_H_
+#define UI_GFX_COLOR_SPACE_H_
+
+#include <stdint.h>
+
+#include <iosfwd>
+#include <string>
+
+#include "base/gtest_prod_util.h"
+#include "build/build_config.h"
+#if !defined(STARBOARD)
+#include "third_party/skia/include/core/SkRefCnt.h"
+#endif  // !defined(STARBOARD)
+#include "ui/gfx/color_space_export.h"
+
+struct skcms_Matrix3x3;
+struct skcms_TransferFunction;
+class SkColorSpace;
+#if !defined(STARBOARD)
+enum SkYUVColorSpace : int;
+#endif  // !defined(STARBOARD)
+
+namespace skia {
+class Matrix44;
+}  // namespace skia
+
+// These forward declarations are used to give IPC code friend access to private
+// fields of gfx::ColorSpace for the purpose of serialization and
+// deserialization.
+namespace IPC {
+template <class P>
+struct ParamTraits;
+}  // namespace IPC
+
+namespace mojo {
+template <class T, class U>
+struct StructTraits;
+}  // namespace mojo
+
+// Used to serialize a gfx::ColorSpace through the GPU command buffer.
+struct _GLcolorSpace;
+
+namespace gfx {
+
+enum class ContentColorUsage : uint8_t;
+
+namespace mojom {
+class ColorSpaceDataView;
+}  // namespace mojom
+
+// Used to represet a color space for the purpose of color conversion.
+// This is designed to be safe and compact enough to send over IPC
+// between any processes.
+class COLOR_SPACE_EXPORT ColorSpace {
+ public:
+  enum class PrimaryID : uint8_t {
+    INVALID,
+    BT709,
+    BT470M,
+    BT470BG,
+    SMPTE170M,
+    SMPTE240M,
+    FILM,
+    BT2020,
+    SMPTEST428_1,
+    SMPTEST431_2,
+    SMPTEST432_1,
+    XYZ_D50,
+    ADOBE_RGB,
+    // Corresponds the the primaries of the "Generic RGB" profile used in the
+    // Apple ColorSync application, used by layout tests on Mac.
+    APPLE_GENERIC_RGB,
+    // A very wide gamut space with rotated primaries. Used by layout tests.
+    WIDE_GAMUT_COLOR_SPIN,
+    // Primaries defined by the primary matrix |custom_primary_matrix_|.
+    CUSTOM,
+    kMaxValue = CUSTOM,
+  };
+
+  enum class TransferID : uint8_t {
+    INVALID,
+    BT709,
+    // On macOS, BT709 hardware decoded video frames, when displayed as
+    // overlays, will have a transfer function of gamma=1.961.
+    BT709_APPLE,
+    GAMMA18,
+    GAMMA22,
+    GAMMA24,
+    GAMMA28,
+    SMPTE170M,
+    SMPTE240M,
+    LINEAR,
+    LOG,
+    LOG_SQRT,
+    IEC61966_2_4,
+    BT1361_ECG,
+    IEC61966_2_1,
+    BT2020_10,
+    BT2020_12,
+    SMPTEST2084,
+    SMPTEST428_1,
+    ARIB_STD_B67,  // AKA hybrid-log gamma, HLG.
+    // The same as IEC61966_2_1 on the interval [0, 1], with the nonlinear
+    // segment continuing beyond 1 and point symmetry defining values below 0.
+    IEC61966_2_1_HDR,
+    // The same as LINEAR but is defined for all real values.
+    LINEAR_HDR,
+    // A parametric transfer function defined by |transfer_params_|.
+    CUSTOM,
+    // An HDR parametric transfer function defined by |transfer_params_|.
+    CUSTOM_HDR,
+    // An HDR transfer function that is piecewise sRGB, and piecewise linear.
+    PIECEWISE_HDR,
+    kMaxValue = PIECEWISE_HDR,
+  };
+
+  enum class MatrixID : uint8_t {
+    INVALID,
+    RGB,
+    BT709,
+    FCC,
+    BT470BG,
+    SMPTE170M,
+    SMPTE240M,
+    YCOCG,
+    BT2020_NCL,
+    BT2020_CL,
+    YDZDX,
+    GBR,
+    kMaxValue = GBR,
+  };
+
+  enum class RangeID : uint8_t {
+    INVALID,
+    // Limited Rec. 709 color range with RGB values ranging from 16 to 235.
+    LIMITED,
+    // Full RGB color range with RGB valees from 0 to 255.
+    FULL,
+    // Range is defined by TransferID/MatrixID.
+    DERIVED,
+    kMaxValue = DERIVED,
+  };
+
+  constexpr ColorSpace() {}
+  constexpr ColorSpace(PrimaryID primaries, TransferID transfer)
+      : ColorSpace(primaries, transfer, MatrixID::RGB, RangeID::FULL) {}
+  constexpr ColorSpace(PrimaryID primaries,
+                       TransferID transfer,
+                       MatrixID matrix,
+                       RangeID range)
+      : primaries_(primaries),
+        transfer_(transfer),
+        matrix_(matrix),
+        range_(range) {}
+  ColorSpace(PrimaryID primaries,
+             TransferID transfer,
+             MatrixID matrix,
+             RangeID range,
+             const skcms_Matrix3x3* custom_primary_matrix,
+             const skcms_TransferFunction* cunstom_transfer_fn);
+
+  explicit ColorSpace(const SkColorSpace& sk_color_space);
+
+  // Returns true if this is not the default-constructor object.
+  bool IsValid() const;
+
+  static constexpr ColorSpace CreateSRGB() {
+    return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1, MatrixID::RGB,
+                      RangeID::FULL);
+  }
+
+  static constexpr ColorSpace CreateDisplayP3D65() {
+    return ColorSpace(PrimaryID::SMPTEST432_1, TransferID::IEC61966_2_1,
+                      MatrixID::RGB, RangeID::FULL);
+  }
+  static ColorSpace CreateCustom(const skcms_Matrix3x3& to_XYZD50,
+                                 const skcms_TransferFunction& fn);
+  static ColorSpace CreateCustom(const skcms_Matrix3x3& to_XYZD50,
+                                 TransferID transfer);
+  static constexpr ColorSpace CreateXYZD50() {
+    return ColorSpace(PrimaryID::XYZ_D50, TransferID::LINEAR, MatrixID::RGB,
+                      RangeID::FULL);
+  }
+
+  // Extended sRGB matches sRGB for values in [0, 1], and extends the transfer
+  // function to all real values.
+  static constexpr ColorSpace CreateExtendedSRGB() {
+    return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1_HDR,
+                      MatrixID::RGB, RangeID::FULL);
+  }
+
+  // scRGB uses the same primaries as sRGB but has a linear transfer function
+  // for all real values, and a white point of kDefaultScrgbLinearSdrWhiteLevel.
+  static constexpr ColorSpace CreateSCRGBLinear() {
+    return ColorSpace(PrimaryID::BT709, TransferID::LINEAR_HDR, MatrixID::RGB,
+                      RangeID::FULL);
+  }
+  // Allows specifying a custom SDR white level.  Only used on Windows.
+  static ColorSpace CreateSCRGBLinear(float sdr_white_level);
+
+  // HDR10 uses BT.2020 primaries with SMPTE ST 2084 PQ transfer function.
+  static constexpr ColorSpace CreateHDR10() {
+    return ColorSpace(PrimaryID::BT2020, TransferID::SMPTEST2084, MatrixID::RGB,
+                      RangeID::FULL);
+  }
+  // Allows specifying a custom SDR white level.  Only used on Windows.
+  static ColorSpace CreateHDR10(float sdr_white_level);
+
+  // HLG uses the BT.2020 primaries with the ARIB_STD_B67 transfer function.
+  static ColorSpace CreateHLG();
+
+  // Create a piecewise-HDR color space.
+  // - If |primaries| is CUSTOM, then |custom_primary_matrix| must be
+  //   non-nullptr.
+  // - The SDR joint is the encoded pixel value where the SDR portion reaches 1,
+  //   usually 0.25 or 0.5, corresponding to giving 8 or 9 of 10 bits to SDR.
+  //   This must be in the open interval (0, 1).
+  // - The HDR level the value that the transfer function will evaluate to at 1,
+  //   and represents the maximum HDR brightness relative to the maximum SDR
+  //   brightness. This must be strictly greater than 1.
+  static ColorSpace CreatePiecewiseHDR(
+      PrimaryID primaries,
+      float sdr_joint,
+      float hdr_level,
+      const skcms_Matrix3x3* custom_primary_matrix = nullptr);
+
+  // TODO(ccameron): Remove these, and replace with more generic constructors.
+  static constexpr ColorSpace CreateJpeg() {
+    // TODO(ccameron): Determine which primaries and transfer function were
+    // intended here.
+    return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1,
+                      MatrixID::SMPTE170M, RangeID::FULL);
+  }
+  static constexpr ColorSpace CreateREC601() {
+    return ColorSpace(PrimaryID::SMPTE170M, TransferID::SMPTE170M,
+                      MatrixID::SMPTE170M, RangeID::LIMITED);
+  }
+  static constexpr ColorSpace CreateREC709() {
+    return ColorSpace(PrimaryID::BT709, TransferID::BT709, MatrixID::BT709,
+                      RangeID::LIMITED);
+  }
+
+  // On macOS and on ChromeOS, sRGB's (1,1,1) always coincides with PQ's 100
+  // nits (which may not be 100 physical nits). On Windows, sRGB's (1,1,1)
+  // maps to scRGB linear's (1,1,1) when the SDR white level is set to 80 nits.
+  // See also kDefaultScrgbLinearSdrWhiteLevel.
+  static constexpr float kDefaultSDRWhiteLevel = 100.f;
+
+  // The default white level in nits for scRGB linear color space. On Windows,
+  // sRGB's (1,1,1) maps to scRGB linear's (1,1,1) when the SDR white level is
+  // set to 80 nits. On Mac and ChromeOS, sRGB's (1,1,1) maps to PQ's 100 nits.
+  // Using a platform specific value here satisfies both constraints.
+#if defined(OS_WIN)
+  static constexpr float kDefaultScrgbLinearSdrWhiteLevel = 80.0f;
+#else
+  static constexpr float kDefaultScrgbLinearSdrWhiteLevel =
+      kDefaultSDRWhiteLevel;
+#endif  // OS_WIN
+
+  bool operator==(const ColorSpace& other) const;
+  bool operator!=(const ColorSpace& other) const;
+  bool operator<(const ColorSpace& other) const;
+  size_t GetHash() const;
+  std::string ToString() const {
+    // TODO: Refine ColorSpace::ToString().
+    return "";
+  }
+
+  bool IsWide() const;
+
+  // Returns true if the transfer function is an HDR one (SMPTE 2084, HLG, etc).
+  bool IsHDR() const {
+    // TODO: Refine ColorSpace::IsHDR().
+    return false;
+  }
+
+  // Returns true if the encoded values can be outside of the 0.0-1.0 range.
+  bool FullRangeEncodedValues() const;
+
+  // Returns the color space's content color usage category (sRGB, WCG, or HDR).
+  ContentColorUsage GetContentColorUsage() const;
+
+  // Return this color space with any YUV to RGB conversion stripped off.
+  ColorSpace GetAsRGB() const;
+
+  // Return this color space with any range adjust or YUV to RGB conversion
+  // stripped off.
+  ColorSpace GetAsFullRangeRGB() const;
+
+  // Return a color space where all values are bigger/smaller by the given
+  // factor. If you convert colors from SRGB to SRGB.GetScaledColorSpace(2.0)
+  // everything will be half as bright in linear lumens.
+  ColorSpace GetScaledColorSpace(float factor) const;
+
+  // Return true if blending in |this| is close enough to blending in sRGB to
+  // be considered acceptable (only PQ and nearly-linear transfer functions
+  // return false).
+  bool IsSuitableForBlending() const;
+
+  // Return a combined color space with has the same primary and transfer than
+  // the caller but replacing the matrix and range with the given values.
+  ColorSpace GetWithMatrixAndRange(MatrixID matrix, RangeID range) const;
+
+  // If this color space has a PQ or scRGB linear transfer function, then return
+  // |this| with its SDR white level set to |sdr_white_level|. Otherwise return
+  // |this| unmodified.
+  ColorSpace GetWithSDRWhiteLevel(float sdr_white_level) const;
+
+#if !defined(STARBOARD)
+  // This will return nullptr for non-RGB spaces, spaces with non-FULL
+  // range, and unspecified spaces.
+  sk_sp<SkColorSpace> ToSkColorSpace() const;
+#endif  // !defined(STARBOARD)
+
+  // Return a GLcolorSpace value that is valid for the lifetime of |this|. This
+  // function is used to serialize ColorSpace objects across the GPU command
+  // buffer.
+  const _GLcolorSpace* AsGLColorSpace() const;
+
+#if !defined(STARBOARD)
+  // For YUV color spaces, return the closest SkYUVColorSpace. Returns true if a
+  // close match is found. Otherwise, leaves *out unchanged and returns false.
+  // If |matrix_id| is MatrixID::BT2020_NCL and |bit_depth| is provided, a bit
+  // depth appropriate SkYUVColorSpace will be provided.
+  bool ToSkYUVColorSpace(int bit_depth, SkYUVColorSpace* out) const;
+  bool ToSkYUVColorSpace(SkYUVColorSpace* out) const {
+    return ToSkYUVColorSpace(kDefaultBitDepth, out);
+  }
+#endif  // !defined(STARBOARD)
+
+  void GetPrimaryMatrix(skcms_Matrix3x3* to_XYZD50) const;
+  void GetPrimaryMatrix(skia::Matrix44* to_XYZD50) const;
+  bool GetTransferFunction(skcms_TransferFunction* fn) const;
+  bool GetInverseTransferFunction(skcms_TransferFunction* fn) const;
+
+  // Returns the SDR white level specified for the PQ or HLG transfer functions.
+  // If no value was specified, then use kDefaultSDRWhiteLevel. If the transfer
+  // function is not PQ then return false.
+  bool GetSDRWhiteLevel(float* sdr_white_level) const;
+
+  // Returns the parameters for a PIECEWISE_HDR transfer function. See
+  // CreatePiecewiseHDR for parameter meanings.
+  bool GetPiecewiseHDRParams(float* sdr_point, float* hdr_level) const;
+
+  // Returns the transfer matrix for |bit_depth|. For most formats, this is the
+  // RGB to YUV matrix.
+  void GetTransferMatrix(int bit_depth, skia::Matrix44* matrix) const;
+
+  // Returns the range adjust matrix that converts from |range_| to full range
+  // for |bit_depth|.
+  void GetRangeAdjustMatrix(int bit_depth, skia::Matrix44* matrix) const;
+
+  // Returns the current primary ID.
+  // Note: if SetCustomPrimaries() has been used, the primary ID returned
+  // may have been set to PrimaryID::CUSTOM, or been coerced to another
+  // PrimaryID if it was very close.
+  PrimaryID GetPrimaryID() const;
+
+  // Returns the current transfer ID.
+  TransferID GetTransferID() const;
+
+  // Returns the current matrix ID.
+  MatrixID GetMatrixID() const;
+
+  // Returns the current range ID.
+  RangeID GetRangeID() const;
+
+  // Returns true if the transfer function is defined by an
+  // skcms_TransferFunction which is extended to all real values.
+  bool HasExtendedSkTransferFn() const;
+
+  // Returns true if each color in |other| can be expressed in this color space.
+  bool Contains(const ColorSpace& other) const;
+
+ private:
+  // The default bit depth assumed by ToSkYUVColorSpace().
+  static constexpr int kDefaultBitDepth = 8;
+
+  static void GetPrimaryMatrix(PrimaryID, skcms_Matrix3x3* to_XYZD50);
+  static bool GetTransferFunction(TransferID, skcms_TransferFunction* fn);
+  static size_t TransferParamCount(TransferID);
+
+  void SetCustomTransferFunction(const skcms_TransferFunction& fn);
+  void SetCustomPrimaries(const skcms_Matrix3x3& to_XYZD50);
+
+  PrimaryID primaries_ = PrimaryID::INVALID;
+  TransferID transfer_ = TransferID::INVALID;
+  MatrixID matrix_ = MatrixID::INVALID;
+  RangeID range_ = RangeID::INVALID;
+
+  // Only used if primaries_ is PrimaryID::CUSTOM.
+  float custom_primary_matrix_[9] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+  // Parameters for the transfer function. The interpretation depends on
+  // |transfer_|. Only TransferParamCount() of these parameters are used, all
+  // others must be zero.
+  // - CUSTOM and CUSTOM_HDR: Entries A through G of the skcms_TransferFunction
+  //   structure in alphabetical order.
+  // - SMPTEST2084: SDR white point.
+  float transfer_params_[7] = {0, 0, 0, 0, 0, 0, 0};
+
+  friend struct IPC::ParamTraits<gfx::ColorSpace>;
+  friend struct mojo::StructTraits<gfx::mojom::ColorSpaceDataView,
+                                   gfx::ColorSpace>;
+};
+
+// Stream operator so ColorSpace can be used in assertion statements.
+COLOR_SPACE_EXPORT std::ostream& operator<<(std::ostream& out,
+                                            const ColorSpace& color_space);
+
+}  // namespace gfx
+
+#endif  // UI_GFX_COLOR_SPACE_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/color_space_export.h b/third_party/chromium/media/cobalt/ui/gfx/color_space_export.h
new file mode 100644
index 0000000..a0402b7
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/color_space_export.h
@@ -0,0 +1,29 @@
+// 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 UI_GFX_COLOR_SPACE_EXPORT_H_
+#define UI_GFX_COLOR_SPACE_EXPORT_H_
+
+#if defined(COMPONENT_BUILD)
+#if defined(WIN32)
+
+#if defined(COLOR_SPACE_IMPLEMENTATION)
+#define COLOR_SPACE_EXPORT __declspec(dllexport)
+#else
+#define COLOR_SPACE_EXPORT __declspec(dllimport)
+#endif  // defined(COLOR_SPACE_IMPLEMENTATION)
+
+#else  // defined(WIN32)
+#if defined(COLOR_SPACE_IMPLEMENTATION)
+#define COLOR_SPACE_EXPORT __attribute__((visibility("default")))
+#else
+#define COLOR_SPACE_EXPORT
+#endif
+#endif
+
+#else  // defined(COMPONENT_BUILD)
+#define COLOR_SPACE_EXPORT
+#endif
+
+#endif  // UI_GFX_COLOR_SPACE_EXPORT_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/point.cc b/third_party/chromium/media/cobalt/ui/gfx/geometry/point.cc
new file mode 100644
index 0000000..f167f20
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/point.cc
@@ -0,0 +1,17 @@
+// 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 "ui/gfx/geometry/point.h"
+
+#include "base/strings/stringprintf.h"
+
+namespace gfx {
+
+template class PointBase<Point, int, Vector2d>;
+
+std::string Point::ToString() const {
+  return base::StringPrintf("%d,%d", x(), y());
+}
+
+}  // namespace gfx
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/point.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/point.h
new file mode 100644
index 0000000..3d02ccf
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/point.h
@@ -0,0 +1,65 @@
+// 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 UI_GFX_GEOMETRY_POINT_H_
+#define UI_GFX_GEOMETRY_POINT_H_
+
+#include <iosfwd>
+#include <string>
+
+#include "ui/gfx/geometry/point_base.h"
+#include "ui/gfx/geometry/point_f.h"
+#include "ui/gfx/geometry/vector2d.h"
+
+namespace gfx {
+
+// A point has an x and y coordinate.
+class Point : public PointBase<Point, int, Vector2d> {
+ public:
+  Point() : PointBase<Point, int, Vector2d>(0, 0) {}
+  Point(int x, int y) : PointBase<Point, int, Vector2d>(x, y) {}
+
+  ~Point() {}
+
+  operator PointF() const {
+    return PointF(static_cast<float>(x()), static_cast<float>(y()));
+  }
+
+  // Returns a string representation of point.
+  std::string ToString() const;
+};
+
+inline bool operator==(const Point& lhs, const Point& rhs) {
+  return lhs.x() == rhs.x() && lhs.y() == rhs.y();
+}
+
+inline bool operator!=(const Point& lhs, const Point& rhs) {
+  return !(lhs == rhs);
+}
+
+inline Point operator+(const Point& lhs, const Vector2d& rhs) {
+  Point result(lhs);
+  result += rhs;
+  return result;
+}
+
+inline Point operator-(const Point& lhs, const Vector2d& rhs) {
+  Point result(lhs);
+  result -= rhs;
+  return result;
+}
+
+inline Vector2d operator-(const Point& lhs, const Point& rhs) {
+  return Vector2d(lhs.x() - rhs.x(), lhs.y() - rhs.y());
+}
+
+inline Point PointAtOffsetFromOrigin(const Vector2d& offset_from_origin) {
+  return Point(offset_from_origin.x(), offset_from_origin.y());
+}
+
+extern template class PointBase<Point, int, Vector2d>;
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_POINT_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/point3_f.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/point3_f.h
new file mode 100644
index 0000000..07b95c0
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/point3_f.h
@@ -0,0 +1,86 @@
+// 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 UI_GFX_GEOMETRY_POINT3_F_H_
+#define UI_GFX_GEOMETRY_POINT3_F_H_
+
+#include <iosfwd>
+#include <string>
+
+#include "ui/gfx/geometry/point_f.h"
+
+namespace gfx {
+
+// A point has an x, y and z coordinate.
+class Point3F {
+ public:
+  Point3F() : x_(0), y_(0), z_(0) {}
+
+  Point3F(float x, float y, float z) : x_(x), y_(y), z_(z) {}
+
+  explicit Point3F(const PointF& point) : x_(point.x()), y_(point.y()), z_(0) {}
+
+  ~Point3F() {}
+
+  void Scale(float scale) { Scale(scale, scale, scale); }
+
+  void Scale(float x_scale, float y_scale, float z_scale) {
+    SetPoint(x() * x_scale, y() * y_scale, z() * z_scale);
+  }
+
+  float x() const { return x_; }
+  float y() const { return y_; }
+  float z() const { return z_; }
+
+  void set_x(float x) { x_ = x; }
+  void set_y(float y) { y_ = y; }
+  void set_z(float z) { z_ = z; }
+
+  void SetPoint(float x, float y, float z) {
+    x_ = x;
+    y_ = y;
+    z_ = z;
+  }
+
+  // Returns the squared euclidean distance between two points.
+  float SquaredDistanceTo(const Point3F& other) const {
+    float dx = x_ - other.x_;
+    float dy = y_ - other.y_;
+    float dz = z_ - other.z_;
+    return dx * dx + dy * dy + dz * dz;
+  }
+
+  PointF AsPointF() const { return PointF(x_, y_); }
+
+  // Returns a string representation of 3d point.
+  std::string ToString() const;
+
+ private:
+  float x_;
+  float y_;
+  float z_;
+
+  // copy/assign are allowed.
+};
+
+inline bool operator==(const Point3F& lhs, const Point3F& rhs) {
+  return lhs.x() == rhs.x() && lhs.y() == rhs.y() && lhs.z() == rhs.z();
+}
+
+inline bool operator!=(const Point3F& lhs, const Point3F& rhs) {
+  return !(lhs == rhs);
+}
+
+inline Point3F ScalePoint(const Point3F& p, float x_scale, float y_scale,
+                          float z_scale) {
+  return Point3F(p.x() * x_scale, p.y() * y_scale, p.z() * z_scale);
+}
+
+inline Point3F ScalePoint(const Point3F& p, float scale) {
+  return ScalePoint(p, scale, scale, scale);
+}
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_POINT3_F_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/point_base.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/point_base.h
new file mode 100644
index 0000000..43eea50
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/point_base.h
@@ -0,0 +1,80 @@
+// 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 UI_GFX_GEOMETRY_POINT_BASE_H_
+#define UI_GFX_GEOMETRY_POINT_BASE_H_
+
+#include <string>
+
+namespace gfx {
+
+// A point has an x and y coordinate.
+template <typename Class, typename Type, typename VectorClass>
+class PointBase {
+ public:
+  Type x() const { return x_; }
+  Type y() const { return y_; }
+
+  void SetPoint(Type x, Type y) {
+    x_ = x;
+    y_ = y;
+  }
+
+  void set_x(Type x) { x_ = x; }
+  void set_y(Type y) { y_ = y; }
+
+  void Offset(Type delta_x, Type delta_y) {
+    x_ += delta_x;
+    y_ += delta_y;
+  }
+
+  void operator+=(const VectorClass& vector) {
+    x_ += vector.x();
+    y_ += vector.y();
+  }
+
+  void operator-=(const VectorClass& vector) {
+    x_ -= vector.x();
+    y_ -= vector.y();
+  }
+
+  void SetToMin(const Class& other) {
+    x_ = x_ <= other.x_ ? x_ : other.x_;
+    y_ = y_ <= other.y_ ? y_ : other.y_;
+  }
+
+  void SetToMax(const Class& other) {
+    x_ = x_ >= other.x_ ? x_ : other.x_;
+    y_ = y_ >= other.y_ ? y_ : other.y_;
+  }
+
+  bool IsOrigin() const { return x_ == Type(0) && y_ == Type(0); }
+
+  VectorClass OffsetFromOrigin() const { return VectorClass(x_, y_); }
+
+  // A point is less than another point if its y-value is closer
+  // to the origin. If the y-values are the same, then point with
+  // the x-value closer to the origin is considered less than the
+  // other.
+  // This comparison is required to use Point in sets, or sorted
+  // vectors.
+  bool operator<(const Class& rhs) const {
+    return (y_ == rhs.y_) ? (x_ < rhs.x_) : (y_ < rhs.y_);
+  }
+
+ protected:
+  PointBase() {}
+  PointBase(Type x, Type y) : x_(x), y_(y) {}
+  // Destructor is intentionally made non virtual and protected.
+  // Do not make this public.
+  ~PointBase() {}
+
+ private:
+  Type x_;
+  Type y_;
+};
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_POINT_BASE_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/point_f.cc b/third_party/chromium/media/cobalt/ui/gfx/geometry/point_f.cc
new file mode 100644
index 0000000..4808ab7
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/point_f.cc
@@ -0,0 +1,23 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/geometry/point_f.h"
+
+#include "base/strings/stringprintf.h"
+
+namespace gfx {
+
+template class PointBase<PointF, float, Vector2dF>;
+
+std::string PointF::ToString() const {
+  return base::StringPrintf("%f,%f", x(), y());
+}
+
+PointF ScalePoint(const PointF& p, float x_scale, float y_scale) {
+  PointF scaled_p(p);
+  scaled_p.Scale(x_scale, y_scale);
+  return scaled_p;
+}
+
+}  // namespace gfx
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/point_f.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/point_f.h
new file mode 100644
index 0000000..6dd12ff
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/point_f.h
@@ -0,0 +1,71 @@
+// 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 UI_GFX_GEOMETRY_POINT_F_H_
+#define UI_GFX_GEOMETRY_POINT_F_H_
+
+#include <iosfwd>
+#include <string>
+
+#include "ui/gfx/geometry/point_base.h"
+#include "ui/gfx/geometry/vector2d_f.h"
+
+namespace gfx {
+
+// A floating-point version of Point.
+class PointF : public PointBase<PointF, float, Vector2dF> {
+ public:
+  PointF() : PointBase<PointF, float, Vector2dF>(0, 0) {}
+  PointF(float x, float y) : PointBase<PointF, float, Vector2dF>(x, y) {}
+  ~PointF() {}
+
+  void Scale(float scale) { Scale(scale, scale); }
+
+  void Scale(float x_scale, float y_scale) {
+    SetPoint(x() * x_scale, y() * y_scale);
+  }
+
+  // Returns a string representation of point.
+  std::string ToString() const;
+};
+
+inline bool operator==(const PointF& lhs, const PointF& rhs) {
+  return lhs.x() == rhs.x() && lhs.y() == rhs.y();
+}
+
+inline bool operator!=(const PointF& lhs, const PointF& rhs) {
+  return !(lhs == rhs);
+}
+
+inline PointF operator+(const PointF& lhs, const Vector2dF& rhs) {
+  PointF result(lhs);
+  result += rhs;
+  return result;
+}
+
+inline PointF operator-(const PointF& lhs, const Vector2dF& rhs) {
+  PointF result(lhs);
+  result -= rhs;
+  return result;
+}
+
+inline Vector2dF operator-(const PointF& lhs, const PointF& rhs) {
+  return Vector2dF(lhs.x() - rhs.x(), lhs.y() - rhs.y());
+}
+
+inline PointF PointAtOffsetFromOrigin(const Vector2dF& offset_from_origin) {
+  return PointF(offset_from_origin.x(), offset_from_origin.y());
+}
+
+PointF ScalePoint(const PointF& p, float x_scale, float y_scale);
+
+inline PointF ScalePoint(const PointF& p, float scale) {
+  return ScalePoint(p, scale, scale);
+}
+
+extern template class PointBase<PointF, float, Vector2dF>;
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_POINT_F_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/rect.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/rect.h
new file mode 100644
index 0000000..c980174
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/rect.h
@@ -0,0 +1,122 @@
+// 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 simple integer rectangle class.  The containment semantics
+// are array-like; that is, the coordinate (x, y) is considered to be
+// contained by the rectangle, but the coordinate (x + width, y) is not.
+// The class will happily let you create malformed rectangles (that is,
+// rectangles with negative width and/or height), but there will be assertions
+// in the operations (such as Contains()) to complain in this case.
+
+#ifndef UI_GFX_GEOMETRY_RECT_H_
+#define UI_GFX_GEOMETRY_RECT_H_
+
+#include <cmath>
+#include <iosfwd>
+#include <string>
+
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/rect_base.h"
+#include "ui/gfx/geometry/rect_base_impl.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/geometry/vector2d.h"
+
+namespace gfx {
+
+class Insets;
+
+class Rect : public RectBase<Rect, Point, Size, Insets, Vector2d, int> {
+ public:
+  Rect() : RectBase<Rect, Point, Size, Insets, Vector2d, int>(Point()) {}
+
+  Rect(int width, int height)
+      : RectBase<Rect, Point, Size, Insets, Vector2d, int>(
+            Size(width, height)) {}
+
+  Rect(int x, int y, int width, int height)
+      : RectBase<Rect, Point, Size, Insets, Vector2d, int>(
+            Point(x, y), Size(width, height)) {}
+
+  explicit Rect(const Size& size)
+      : RectBase<Rect, Point, Size, Insets, Vector2d, int>(size) {}
+
+  Rect(const Point& origin, const Size& size)
+      : RectBase<Rect, Point, Size, Insets, Vector2d, int>(origin, size) {}
+
+  ~Rect() {}
+
+  std::string ToString() const;
+};
+
+inline bool operator==(const Rect& lhs, const Rect& rhs) {
+  return lhs.origin() == rhs.origin() && lhs.size() == rhs.size();
+}
+
+inline bool operator!=(const Rect& lhs, const Rect& rhs) {
+  return !(lhs == rhs);
+}
+
+Rect operator+(const Rect& lhs, const Vector2d& rhs);
+Rect operator-(const Rect& lhs, const Vector2d& rhs);
+
+inline std::ostream& operator<<(std::ostream& os, const Rect& rect) {
+  os << rect.ToString();
+  return os;
+}
+
+inline Rect operator+(const Vector2d& lhs, const Rect& rhs) {
+  return rhs + lhs;
+}
+
+Rect IntersectRects(const Rect& a, const Rect& b);
+Rect UnionRects(const Rect& a, const Rect& b);
+Rect SubtractRects(const Rect& a, const Rect& b);
+
+// Constructs a rectangle with |p1| and |p2| as opposite corners.
+//
+// This could also be thought of as "the smallest rect that contains both
+// points", except that we consider points on the right/bottom edges of the
+// rect to be outside the rect.  So technically one or both points will not be
+// contained within the rect, because they will appear on one of these edges.
+Rect BoundingRect(const Point& p1, const Point& p2);
+
+inline Rect ScaleToEnclosingRect(const Rect& rect, float x_scale,
+                                 float y_scale) {
+  int x = static_cast<int>(std::floor(rect.x() * x_scale));
+  int y = static_cast<int>(std::floor(rect.y() * y_scale));
+  int r = rect.width() == 0
+              ? x
+              : static_cast<int>(std::ceil(rect.right() * x_scale));
+  int b = rect.height() == 0
+              ? y
+              : static_cast<int>(std::ceil(rect.bottom() * y_scale));
+  return Rect(x, y, r - x, b - y);
+}
+
+inline Rect ScaleToEnclosingRect(const Rect& rect, float scale) {
+  return ScaleToEnclosingRect(rect, scale, scale);
+}
+
+inline Rect ScaleToEnclosedRect(const Rect& rect, float x_scale,
+                                float y_scale) {
+  int x = static_cast<int>(std::ceil(rect.x() * x_scale));
+  int y = static_cast<int>(std::ceil(rect.y() * y_scale));
+  int r = rect.width() == 0
+              ? x
+              : static_cast<int>(std::floor(rect.right() * x_scale));
+  int b = rect.height() == 0
+              ? y
+              : static_cast<int>(std::floor(rect.bottom() * y_scale));
+  return Rect(x, y, r - x, b - y);
+}
+
+inline Rect ScaleToEnclosedRect(const Rect& rect, float scale) {
+  return ScaleToEnclosedRect(rect, scale, scale);
+}
+
+// extern template class RectBase<Rect, Point, Size, Insets, Vector2d, int>;
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_RECT_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/rect_base.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/rect_base.h
new file mode 100644
index 0000000..0cec1ea
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/rect_base.h
@@ -0,0 +1,173 @@
+// 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 template for a simple rectangle class.  The containment semantics
+// are array-like; that is, the coordinate (x, y) is considered to be
+// contained by the rectangle, but the coordinate (x + width, y) is not.
+// The class will happily let you create malformed rectangles (that is,
+// rectangles with negative width and/or height), but there will be assertions
+// in the operations (such as Contains()) to complain in this case.
+
+#ifndef UI_GFX_GEOMETRY_RECT_BASE_H_
+#define UI_GFX_GEOMETRY_RECT_BASE_H_
+
+#include <string>
+
+namespace gfx {
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+class RectBase {
+ public:
+  Type x() const { return origin_.x(); }
+  void set_x(Type x) { origin_.set_x(x); }
+
+  Type y() const { return origin_.y(); }
+  void set_y(Type y) { origin_.set_y(y); }
+
+  Type width() const { return size_.width(); }
+  void set_width(Type width) { size_.set_width(width); }
+
+  Type height() const { return size_.height(); }
+  void set_height(Type height) { size_.set_height(height); }
+
+  const PointClass& origin() const { return origin_; }
+  void set_origin(const PointClass& origin) { origin_ = origin; }
+
+  const SizeClass& size() const { return size_; }
+  void set_size(const SizeClass& size) { size_ = size; }
+
+  Type right() const { return x() + width(); }
+  Type bottom() const { return y() + height(); }
+
+  PointClass top_right() const { return PointClass(right(), y()); }
+  PointClass bottom_left() const { return PointClass(x(), bottom()); }
+  PointClass bottom_right() const { return PointClass(right(), bottom()); }
+
+  VectorClass OffsetFromOrigin() const { return VectorClass(x(), y()); }
+
+  void SetRect(Type x, Type y, Type width, Type height);
+
+  // Shrink the rectangle by a horizontal and vertical distance on all sides.
+  void Inset(Type horizontal, Type vertical) {
+    Inset(horizontal, vertical, horizontal, vertical);
+  }
+
+  // Enlarge the rectangle by a horizontal and vertical distance on all sides.
+  void Outset(Type horizontal, Type vertical) { Inset(-horizontal, -vertical); }
+
+  // Shrink the rectangle by the given insets.
+  void Inset(const InsetsClass& insets);
+
+  // Enlarge the rectangle by the given insets.
+  void Outset(const InsetsClass& insets) { Inset(-insets); }
+
+  // Shrink the rectangle by the specified amount on each side.
+  void Inset(Type left, Type top, Type right, Type bottom);
+
+  // Enlarge the rectangle by the specified amount on each side.
+  void Outset(Type left, Type top, Type right, Type bottom) {
+    Inset(-left, -top, -right, -bottom);
+  }
+
+  // Move the rectangle by a horizontal and vertical distance.
+  void Offset(Type horizontal, Type vertical);
+  void Offset(const VectorClass& distance) {
+    Offset(distance.x(), distance.y());
+  }
+  void operator+=(const VectorClass& offset);
+  void operator-=(const VectorClass& offset);
+
+  InsetsClass InsetsFrom(const Class& inner) const {
+    return InsetsClass(inner.x() - x(), inner.y() - y(),
+                       right() - inner.right(), bottom() - inner.bottom());
+  }
+
+  // Returns true if the area of the rectangle is zero.
+  bool IsEmpty() const { return size_.IsEmpty(); }
+
+  // A rect is less than another rect if its origin is less than
+  // the other rect's origin. If the origins are equal, then the
+  // shortest rect is less than the other. If the origin and the
+  // height are equal, then the narrowest rect is less than.
+  // This comparison is required to use Rects in sets, or sorted
+  // vectors.
+  bool operator<(const Class& other) const;
+
+  // Returns true if the point identified by point_x and point_y falls inside
+  // this rectangle.  The point (x, y) is inside the rectangle, but the
+  // point (x + width, y + height) is not.
+  bool Contains(Type point_x, Type point_y) const;
+
+  // Returns true if the specified point is contained by this rectangle.
+  bool Contains(const PointClass& point) const {
+    return Contains(point.x(), point.y());
+  }
+
+  // Returns true if this rectangle contains the specified rectangle.
+  bool Contains(const Class& rect) const;
+
+  // Returns true if this rectangle intersects the specified rectangle.
+  // An empty rectangle doesn't intersect any rectangle.
+  bool Intersects(const Class& rect) const;
+
+  // Computes the intersection of this rectangle with the given rectangle.
+  void Intersect(const Class& rect);
+
+  // Computes the union of this rectangle with the given rectangle.  The union
+  // is the smallest rectangle containing both rectangles.
+  void Union(const Class& rect);
+
+  // Computes the rectangle resulting from subtracting |rect| from |*this|,
+  // i.e. the bounding rect of |Region(*this) - Region(rect)|.
+  void Subtract(const Class& rect);
+
+  // Fits as much of the receiving rectangle into the supplied rectangle as
+  // possible, becoming the result. For example, if the receiver had
+  // a x-location of 2 and a width of 4, and the supplied rectangle had
+  // an x-location of 0 with a width of 5, the returned rectangle would have
+  // an x-location of 1 with a width of 4.
+  void AdjustToFit(const Class& rect);
+
+  // Returns the center of this rectangle.
+  PointClass CenterPoint() const;
+
+  // Becomes a rectangle that has the same center point but with a size capped
+  // at given |size|.
+  void ClampToCenteredSize(const SizeClass& size);
+
+  // Splits |this| in two halves, |left_half| and |right_half|.
+  void SplitVertically(Class* left_half, Class* right_half) const;
+
+  // Returns true if this rectangle shares an entire edge (i.e., same width or
+  // same height) with the given rectangle, and the rectangles do not overlap.
+  bool SharesEdgeWith(const Class& rect) const;
+
+  // Returns the manhattan distance from the rect to the point. If the point is
+  // inside the rect, returns 0.
+  Type ManhattanDistanceToPoint(const PointClass& point) const;
+
+  // Returns the manhattan distance between the contents of this rect and the
+  // contents of the given rect. That is, if the intersection of the two rects
+  // is non-empty then the function returns 0. If the rects share a side, it
+  // returns the smallest non-zero value appropriate for Type.
+  Type ManhattanInternalDistance(const Class& rect) const;
+
+ protected:
+  RectBase(const PointClass& origin, const SizeClass& size)
+      : origin_(origin), size_(size) {}
+  explicit RectBase(const SizeClass& size) : size_(size) {}
+  explicit RectBase(const PointClass& origin) : origin_(origin) {}
+  // Destructor is intentionally made non virtual and protected.
+  // Do not make this public.
+  ~RectBase() {}
+
+ private:
+  PointClass origin_;
+  SizeClass size_;
+};
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_RECT_BASE_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/rect_base_impl.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/rect_base_impl.h
new file mode 100644
index 0000000..09ee7f3
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/rect_base_impl.h
@@ -0,0 +1,267 @@
+// 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 UI_GFX_GEOMETRY_RECT_BASE_IMPL_H_
+#define UI_GFX_GEOMETRY_RECT_BASE_IMPL_H_
+
+#include <algorithm>
+#include <limits>
+
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
+#include "ui/gfx/geometry/rect_base.h"
+
+namespace gfx {
+
+template <typename Type>
+void AdjustAlongAxis(Type dst_origin, Type dst_size, Type* origin, Type* size) {
+  *size = std::min(dst_size, *size);
+  if (*origin < dst_origin)
+    *origin = dst_origin;
+  else
+    *origin = std::min(dst_origin + dst_size, *origin + *size) - *size;
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::SetRect(Type x, Type y, Type width, Type height) {
+  origin_.SetPoint(x, y);
+  set_width(width);
+  set_height(height);
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::Inset(const InsetsClass& insets) {
+  Inset(insets.left(), insets.top(), insets.right(), insets.bottom());
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::Inset(Type left, Type top, Type right, Type bottom) {
+  origin_ += VectorClass(left, top);
+  set_width(std::max(width() - left - right, static_cast<Type>(0)));
+  set_height(std::max(height() - top - bottom, static_cast<Type>(0)));
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::Offset(Type horizontal, Type vertical) {
+  origin_ += VectorClass(horizontal, vertical);
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>::
+operator+=(const VectorClass& offset) {
+  origin_ += offset;
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>::
+operator-=(const VectorClass& offset) {
+  origin_ -= offset;
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>::
+operator<(const Class& other) const {
+  if (origin_ == other.origin_) {
+    if (width() == other.width()) {
+      return height() < other.height();
+    } else {
+      return width() < other.width();
+    }
+  } else {
+    return origin_ < other.origin_;
+  }
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::Contains(Type point_x, Type point_y) const {
+  return (point_x >= x()) && (point_x < right()) && (point_y >= y()) &&
+         (point_y < bottom());
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::Contains(const Class& rect) const {
+  return (rect.x() >= x() && rect.right() <= right() && rect.y() >= y() &&
+          rect.bottom() <= bottom());
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::Intersects(const Class& rect) const {
+  return !(IsEmpty() || rect.IsEmpty() || rect.x() >= right() ||
+           rect.right() <= x() || rect.y() >= bottom() || rect.bottom() <= y());
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::Intersect(const Class& rect) {
+  if (IsEmpty() || rect.IsEmpty()) {
+    SetRect(Type(0), Type(0), Type(0), Type(0));
+    return;
+  }
+
+  Type rx = std::max(x(), rect.x());
+  Type ry = std::max(y(), rect.y());
+  Type rr = std::min(right(), rect.right());
+  Type rb = std::min(bottom(), rect.bottom());
+
+  if (rx >= rr || ry >= rb) rx = ry = rr = rb = Type(0);  // non-intersecting
+
+  SetRect(rx, ry, rr - rx, rb - ry);
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::Union(const Class& rect) {
+  if (IsEmpty()) {
+    *this = rect;
+    return;
+  }
+  if (rect.IsEmpty()) return;
+
+  Type rx = std::min(x(), rect.x());
+  Type ry = std::min(y(), rect.y());
+  Type rr = std::max(right(), rect.right());
+  Type rb = std::max(bottom(), rect.bottom());
+
+  SetRect(rx, ry, rr - rx, rb - ry);
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::Subtract(const Class& rect) {
+  if (!Intersects(rect)) return;
+  if (rect.Contains(*static_cast<const Class*>(this))) {
+    SetRect(Type(0), Type(0), Type(0), Type(0));
+    return;
+  }
+
+  Type rx = x();
+  Type ry = y();
+  Type rr = right();
+  Type rb = bottom();
+
+  if (rect.y() <= y() && rect.bottom() >= bottom()) {
+    // complete intersection in the y-direction
+    if (rect.x() <= x()) {
+      rx = rect.right();
+    } else if (rect.right() >= right()) {
+      rr = rect.x();
+    }
+  } else if (rect.x() <= x() && rect.right() >= right()) {
+    // complete intersection in the x-direction
+    if (rect.y() <= y()) {
+      ry = rect.bottom();
+    } else if (rect.bottom() >= bottom()) {
+      rb = rect.y();
+    }
+  }
+  SetRect(rx, ry, rr - rx, rb - ry);
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::AdjustToFit(const Class& rect) {
+  Type new_x = x();
+  Type new_y = y();
+  Type new_width = width();
+  Type new_height = height();
+  AdjustAlongAxis(rect.x(), rect.width(), &new_x, &new_width);
+  AdjustAlongAxis(rect.y(), rect.height(), &new_y, &new_height);
+  SetRect(new_x, new_y, new_width, new_height);
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+PointClass RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+                    Type>::CenterPoint() const {
+  return PointClass(x() + width() / 2, y() + height() / 2);
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::ClampToCenteredSize(const SizeClass& size) {
+  Type new_width = std::min(width(), size.width());
+  Type new_height = std::min(height(), size.height());
+  Type new_x = x() + (width() - new_width) / 2;
+  Type new_y = y() + (height() - new_height) / 2;
+  SetRect(new_x, new_y, new_width, new_height);
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::SplitVertically(Class* left_half,
+                                     Class* right_half) const {
+  DCHECK(left_half);
+  DCHECK(right_half);
+
+  left_half->SetRect(x(), y(), width() / 2, height());
+  right_half->SetRect(left_half->right(), y(), width() - left_half->width(),
+                      height());
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::SharesEdgeWith(const Class& rect) const {
+  return (y() == rect.y() && height() == rect.height() &&
+          (x() == rect.right() || right() == rect.x())) ||
+         (x() == rect.x() && width() == rect.width() &&
+          (y() == rect.bottom() || bottom() == rect.y()));
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+Type RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::ManhattanDistanceToPoint(const PointClass& point) const {
+  Type x_distance =
+      std::max<Type>(Type(0), std::max(x() - point.x(), point.x() - right()));
+  Type y_distance =
+      std::max<Type>(Type(0), std::max(y() - point.y(), point.y() - bottom()));
+
+  return x_distance + y_distance;
+}
+
+template <typename Class, typename PointClass, typename SizeClass,
+          typename InsetsClass, typename VectorClass, typename Type>
+Type RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
+              Type>::ManhattanInternalDistance(const Class& rect) const {
+  Class c(x(), y(), width(), height());
+  c.Union(rect);
+
+  const Type kEpsilon = std::numeric_limits<Type>::is_integer
+                                   ? Type(1)
+                                   : std::numeric_limits<Type>::epsilon();
+
+  Type x =
+      std::max<Type>(Type(0), c.width() - width() - rect.width() + kEpsilon);
+  Type y =
+      std::max<Type>(Type(0), c.height() - height() - rect.height() + kEpsilon);
+  return x + y;
+}
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_RECT_BASE_IMPL_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/size.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/size.h
new file mode 100644
index 0000000..3e5a5b6
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/size.h
@@ -0,0 +1,51 @@
+// 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 UI_GFX_GEOMETRY_SIZE_H_
+#define UI_GFX_GEOMETRY_SIZE_H_
+
+#include <iosfwd>
+#include <string>
+
+#include "base/numerics/checked_math.h"
+#include "ui/gfx/geometry/size_base.h"
+#include "ui/gfx/geometry/size_f.h"
+
+namespace gfx {
+
+// A size has width and height values.
+class Size : public SizeBase<Size, int> {
+ public:
+  Size() : SizeBase<Size, int>(0, 0) {}
+  Size(int width, int height) : SizeBase<Size, int>(width, height) {}
+  ~Size() {}
+
+  operator SizeF() const {
+    return SizeF(static_cast<float>(width()), static_cast<float>(height()));
+  }
+
+  int GetArea() const { return width() * height(); }
+
+  base::CheckedNumeric<int> GetCheckedArea() const {
+    base::CheckedNumeric<int> checked_area = width();
+    checked_area *= height();
+    return checked_area;
+  }
+
+  std::string ToString() const;
+};
+
+inline bool operator==(const Size& lhs, const Size& rhs) {
+  return lhs.width() == rhs.width() && lhs.height() == rhs.height();
+}
+
+inline bool operator!=(const Size& lhs, const Size& rhs) {
+  return !(lhs == rhs);
+}
+
+// extern template class SizeBase<Size, int>;
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_SIZE_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/size_base.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/size_base.h
new file mode 100644
index 0000000..b535b3f
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/size_base.h
@@ -0,0 +1,57 @@
+// 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 UI_GFX_GEOMETRY_SIZE_BASE_H_
+#define UI_GFX_GEOMETRY_SIZE_BASE_H_
+
+namespace gfx {
+
+// A size has width and height values.
+template <typename Class, typename Type>
+class SizeBase {
+ public:
+  Type width() const { return width_; }
+  Type height() const { return height_; }
+
+  void SetSize(Type width, Type height) {
+    set_width(width);
+    set_height(height);
+  }
+
+  void Enlarge(Type width, Type height) {
+    set_width(width_ + width);
+    set_height(height_ + height);
+  }
+
+  void set_width(Type width) { width_ = width; }
+  void set_height(Type height) { height_ = height; }
+
+  void SetToMin(const Class& other) {
+    width_ = width_ <= other.width_ ? width_ : other.width_;
+    height_ = height_ <= other.height_ ? height_ : other.height_;
+  }
+
+  void SetToMax(const Class& other) {
+    width_ = width_ >= other.width_ ? width_ : other.width_;
+    height_ = height_ >= other.height_ ? height_ : other.height_;
+  }
+
+  bool IsEmpty() const { return (width_ == Type(0)) || (height_ == Type(0)); }
+
+ protected:
+  SizeBase() {}
+  SizeBase(Type width, Type height) : width_(width), height_(height) {}
+
+  // Destructor is intentionally made non virtual and protected.
+  // Do not make this public.
+  ~SizeBase() {}
+
+ private:
+  Type width_;
+  Type height_;
+};
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_SIZE_BASE_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/size_f.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/size_f.h
new file mode 100644
index 0000000..587f19e
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/size_f.h
@@ -0,0 +1,56 @@
+// 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 UI_GFX_GEOMETRY_SIZE_F_H_
+#define UI_GFX_GEOMETRY_SIZE_F_H_
+
+#include <iostream>
+#include <string>
+
+#include "ui/gfx/geometry/size_base.h"
+
+namespace gfx {
+
+// A floating-point version of Size.
+class SizeF : public SizeBase<SizeF, float> {
+ public:
+  SizeF() : SizeBase<SizeF, float>(0, 0) {}
+  SizeF(float width, float height) : SizeBase<SizeF, float>(width, height) {}
+  ~SizeF() {}
+
+  float GetArea() const { return width() * height(); }
+
+  void Scale(float scale) { Scale(scale, scale); }
+
+  void Scale(float x_scale, float y_scale) {
+    SetSize(width() * x_scale, height() * y_scale);
+  }
+
+  std::string ToString() const;
+};
+
+inline bool operator==(const SizeF& lhs, const SizeF& rhs) {
+  return lhs.width() == rhs.width() && lhs.height() == rhs.height();
+}
+
+inline bool operator!=(const SizeF& lhs, const SizeF& rhs) {
+  return !(lhs == rhs);
+}
+
+SizeF ScaleSize(const SizeF& p, float x_scale, float y_scale);
+
+inline SizeF ScaleSize(const SizeF& p, float scale) {
+  return ScaleSize(p, scale, scale);
+}
+
+inline std::ostream& operator<<(std::ostream& stream, const SizeF& size) {
+  stream << "{width=" << size.width() << " height=" << size.height() << "}";
+  return stream;
+}
+
+// extern template class SizeBase<SizeF, float>;
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_SIZE_F_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/vector2d.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/vector2d.h
new file mode 100644
index 0000000..86ad260
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/vector2d.h
@@ -0,0 +1,98 @@
+// 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 simple integer vector class.  This class is used to indicate a
+// distance in two dimensions between two points. Subtracting two points should
+// produce a vector, and adding a vector to a point produces the point at the
+// vector's distance from the original point.
+
+#ifndef UI_GFX_GEOMETRY_VECTOR2D_H_
+#define UI_GFX_GEOMETRY_VECTOR2D_H_
+
+#include <iosfwd>
+#include <string>
+
+#include "base/basictypes.h"
+#include "ui/gfx/geometry/vector2d_f.h"
+
+namespace gfx {
+
+class Vector2d {
+ public:
+  Vector2d() : x_(0), y_(0) {}
+  Vector2d(int x, int y) : x_(x), y_(y) {}
+
+  void SetVector(int x, int y) {
+    x_ = x;
+    y_ = y;
+  }
+
+  int x() const { return x_; }
+  void set_x(int x) { x_ = x; }
+
+  int y() const { return y_; }
+  void set_y(int y) { y_ = y; }
+
+  // True if both components of the vector are 0.
+  bool IsZero() const;
+
+  // Add the components of the |other| vector to the current vector.
+  void Add(const Vector2d& other);
+  // Subtract the components of the |other| vector from the current vector.
+  void Subtract(const Vector2d& other);
+
+  void operator+=(const Vector2d& other) { Add(other); }
+  void operator-=(const Vector2d& other) { Subtract(other); }
+
+  void SetToMin(const Vector2d& other) {
+    x_ = x_ <= other.x_ ? x_ : other.x_;
+    y_ = y_ <= other.y_ ? y_ : other.y_;
+  }
+
+  void SetToMax(const Vector2d& other) {
+    x_ = x_ >= other.x_ ? x_ : other.x_;
+    y_ = y_ >= other.y_ ? y_ : other.y_;
+  }
+
+  // Gives the square of the diagonal length of the vector. Since this is
+  // cheaper to compute than Length(), it is useful when you want to compare
+  // relative lengths of different vectors without needing the actual lengths.
+  int64 LengthSquared() const;
+  // Gives the diagonal length of the vector.
+  float Length() const;
+
+  std::string ToString() const;
+
+  operator Vector2dF() const {
+    return Vector2dF(static_cast<float>(x_), static_cast<float>(y_));
+  }
+
+ private:
+  int x_;
+  int y_;
+};
+
+inline bool operator==(const Vector2d& lhs, const Vector2d& rhs) {
+  return lhs.x() == rhs.x() && lhs.y() == rhs.y();
+}
+
+inline Vector2d operator-(const Vector2d& v) {
+  return Vector2d(-v.x(), -v.y());
+}
+
+inline Vector2d operator+(const Vector2d& lhs, const Vector2d& rhs) {
+  Vector2d result = lhs;
+  result.Add(rhs);
+  return result;
+}
+
+inline Vector2d operator-(const Vector2d& lhs, const Vector2d& rhs) {
+  Vector2d result = lhs;
+  result.Add(-rhs);
+  return result;
+}
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_VECTOR2D_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/geometry/vector2d_f.h b/third_party/chromium/media/cobalt/ui/gfx/geometry/vector2d_f.h
new file mode 100644
index 0000000..f97ef00
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/geometry/vector2d_f.h
@@ -0,0 +1,127 @@
+// 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 simple float vector class.  This class is used to indicate a
+// distance in two dimensions between two points. Subtracting two points should
+// produce a vector, and adding a vector to a point produces the point at the
+// vector's distance from the original point.
+
+#ifndef UI_GFX_GEOMETRY_VECTOR2D_F_H_
+#define UI_GFX_GEOMETRY_VECTOR2D_F_H_
+
+#include <iosfwd>
+#include <string>
+
+#include "base/logging.h"
+
+namespace gfx {
+
+class Vector2dF {
+ public:
+  Vector2dF() : x_(0), y_(0) {}
+  Vector2dF(float x, float y) : x_(x), y_(y) {}
+
+  void SetVector(float x, float y) {
+    x_ = x;
+    y_ = y;
+  }
+
+  float x() const { return x_; }
+  void set_x(float x) { x_ = x; }
+
+  float y() const { return y_; }
+  void set_y(float y) { y_ = y; }
+
+  // True if both components of the vector are 0.
+  bool IsZero() const;
+
+  // Add the components of the |other| vector to the current vector.
+  void Add(const Vector2dF& other);
+  // Subtract the components of the |other| vector from the current vector.
+  void Subtract(const Vector2dF& other);
+
+  void operator+=(const Vector2dF& other) { Add(other); }
+  void operator-=(const Vector2dF& other) { Subtract(other); }
+
+  float operator[](int i) const {
+    DCHECK_LE(0, i);
+    DCHECK_GE(1, i);
+    return i == 0 ? x_ : y_;
+  }
+  float& operator[](int i) {
+    DCHECK_LE(0, i);
+    DCHECK_GE(1, i);
+    return i == 0 ? x_ : y_;
+  }
+
+  void SetToMin(const Vector2dF& other) {
+    x_ = x_ <= other.x_ ? x_ : other.x_;
+    y_ = y_ <= other.y_ ? y_ : other.y_;
+  }
+
+  void SetToMax(const Vector2dF& other) {
+    x_ = x_ >= other.x_ ? x_ : other.x_;
+    y_ = y_ >= other.y_ ? y_ : other.y_;
+  }
+
+  // Gives the square of the diagonal length of the vector.
+  double LengthSquared() const;
+  // Gives the diagonal length of the vector.
+  float Length() const;
+
+  // Scale the x and y components of the vector by |scale|.
+  void Scale(float scale) { Scale(scale, scale); }
+  // Scale the x and y components of the vector by |x_scale| and |y_scale|
+  // respectively.
+  void Scale(float x_scale, float y_scale);
+
+  std::string ToString() const;
+
+ private:
+  float x_;
+  float y_;
+};
+
+inline bool operator==(const Vector2dF& lhs, const Vector2dF& rhs) {
+  return lhs.x() == rhs.x() && lhs.y() == rhs.y();
+}
+
+inline bool operator!=(const Vector2dF& lhs, const Vector2dF& rhs) {
+  return !(lhs == rhs);
+}
+
+inline Vector2dF operator-(const Vector2dF& v) {
+  return Vector2dF(-v.x(), -v.y());
+}
+
+inline Vector2dF operator+(const Vector2dF& lhs, const Vector2dF& rhs) {
+  Vector2dF result = lhs;
+  result.Add(rhs);
+  return result;
+}
+
+inline Vector2dF operator-(const Vector2dF& lhs, const Vector2dF& rhs) {
+  Vector2dF result = lhs;
+  result.Add(-rhs);
+  return result;
+}
+
+// Return the cross product of two vectors.
+double CrossProduct(const Vector2dF& lhs, const Vector2dF& rhs);
+
+// Return the dot product of two vectors.
+double DotProduct(const Vector2dF& lhs, const Vector2dF& rhs);
+
+// Return a vector that is |v| scaled by the given scale factors along each
+// axis.
+Vector2dF ScaleVector2d(const Vector2dF& v, float x_scale, float y_scale);
+
+// Return a vector that is |v| scaled by the given scale factor.
+inline Vector2dF ScaleVector2d(const Vector2dF& v, float scale) {
+  return ScaleVector2d(v, scale, scale);
+}
+
+}  // namespace gfx
+
+#endif  // UI_GFX_GEOMETRY_VECTOR2D_F_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/hdr_metadata.h b/third_party/chromium/media/cobalt/ui/gfx/hdr_metadata.h
new file mode 100644
index 0000000..8828158
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/hdr_metadata.h
@@ -0,0 +1,76 @@
+// 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_HDR_METADATA_H_
+#define UI_GFX_HDR_METADATA_H_
+
+#include "media/base/media_export.h"
+#include "ui/gfx/geometry/point_f.h"
+
+namespace gfx {
+
+// SMPTE ST 2086 color volume metadata.
+struct MEDIA_EXPORT ColorVolumeMetadata {
+  using Chromaticity = gfx::PointF;
+  Chromaticity primary_r;
+  Chromaticity primary_g;
+  Chromaticity primary_b;
+  Chromaticity white_point;
+  float luminance_max = 0;
+  float luminance_min = 0;
+
+  ColorVolumeMetadata() = default;
+  ColorVolumeMetadata(const ColorVolumeMetadata& rhs) = default;
+  ColorVolumeMetadata& operator=(const ColorVolumeMetadata& rhs) = default;
+
+  bool operator==(const ColorVolumeMetadata& rhs) const {
+    return ((primary_r == rhs.primary_r) && (primary_g == rhs.primary_g) &&
+            (primary_b == rhs.primary_b) && (white_point == rhs.white_point) &&
+            (luminance_max == rhs.luminance_max) &&
+            (luminance_min == rhs.luminance_min));
+  }
+};
+
+// HDR metadata common for HDR10 and WebM/VP9-based HDR formats.
+struct MEDIA_EXPORT HDRMetadata {
+  ColorVolumeMetadata color_volume_metadata;
+  // Max content light level (CLL), i.e. maximum brightness level present in the
+  // stream), in nits.
+  unsigned max_content_light_level = 0;
+  // Max frame-average light level (FALL), i.e. maximum average brightness of
+  // the brightest frame in the stream), in nits.
+  unsigned max_frame_average_light_level = 0;
+
+  HDRMetadata() = default;
+  HDRMetadata(const HDRMetadata& rhs) = default;
+  HDRMetadata& operator=(const HDRMetadata& rhs) = default;
+
+  bool IsValid() const {
+    return !((max_content_light_level == 0) &&
+             (max_frame_average_light_level == 0) &&
+             (color_volume_metadata == ColorVolumeMetadata()));
+  }
+
+  bool operator==(const HDRMetadata& rhs) const {
+    return (
+        (max_content_light_level == rhs.max_content_light_level) &&
+        (max_frame_average_light_level == rhs.max_frame_average_light_level) &&
+        (color_volume_metadata == rhs.color_volume_metadata));
+  }
+
+  bool operator!=(const HDRMetadata& rhs) const { return !(*this == rhs); }
+};
+
+// HDR metadata types as described in
+// https://w3c.github.io/media-capabilities/#enumdef-hdrmetadatatype
+enum class HdrMetadataType {
+  kNone,
+  kSmpteSt2086,
+  kSmpteSt2094_10,
+  kSmpteSt2094_40,
+};
+
+}  // namespace gfx
+
+#endif  // UI_GFX_HDR_METADATA_H_
diff --git a/third_party/chromium/media/cobalt/ui/gfx/native_pixmap_handle.h b/third_party/chromium/media/cobalt/ui/gfx/native_pixmap_handle.h
new file mode 100644
index 0000000..d0d769b
--- /dev/null
+++ b/third_party/chromium/media/cobalt/ui/gfx/native_pixmap_handle.h
@@ -0,0 +1,20 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_NATIVE_PIXMAP_HANDLE_H_
+#define UI_GFX_NATIVE_PIXMAP_HANDLE_H_
+
+// A reduced version of `native_pixmap_handle.h` enough to make required files
+// in Chromium media to be built.
+
+namespace gfx {
+
+class NativePixmapHandle {
+ public:
+  static constexpr uint64_t kNoModifier = 0x00ffffffffffffff;
+};
+
+}  // namespace gfx
+
+#endif  // UI_GFX_NATIVE_PIXMAP_HANDLE_H_
diff --git a/third_party/chromium/media/filters/chunk_demuxer.cc b/third_party/chromium/media/filters/chunk_demuxer.cc
index 7befc2d..e738be9 100644
--- a/third_party/chromium/media/filters/chunk_demuxer.cc
+++ b/third_party/chromium/media/filters/chunk_demuxer.cc
@@ -15,6 +15,9 @@
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
+#if defined(STARBOARD)
+#include "base/strings/string_split.h"
+#endif  // defined (STARBOARD)
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "media/base/audio_decoder_config.h"
@@ -59,12 +62,55 @@
   return codecs;
 }
 
+#if defined(STARBOARD)
+
+// Parse type and codecs from mime type. It will return "video/mp4" and
+// "avc1.42E01E, mp4a.40.2" for "video/mp4; codecs="avc1.42E01E, mp4a.40.2".
+// Note that this function does minimum validation as the media stack will check
+// the type and codecs strictly.
+bool ParseMimeType(const std::string& mime_type, std::string* type,
+                   std::string* codecs) {
+  DCHECK(type);
+  DCHECK(codecs);
+  static const char kCodecs[] = "codecs=";
+
+  // SplitString will also trim the results.
+  std::vector<std::string> tokens = ::base::SplitString(
+      mime_type, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+  // The first one has to be mime type with delimiter '/' like 'video/mp4'.
+  if (tokens.empty() || tokens[0].find('/') == tokens[0].npos) {
+    return false;
+  }
+  *type = tokens[0];
+  codecs->clear();
+  for (size_t i = 1; i < tokens.size(); ++i) {
+    if (base::strncasecmp(tokens[i].c_str(), kCodecs, strlen(kCodecs))) {
+      continue;
+    }
+    *codecs = tokens[i].substr(strlen(kCodecs));
+    base::TrimString(*codecs, " \"", codecs);
+    break;
+  }
+  // It is possible to not having any codecs, and will leave the validation to
+  // underlying parsers.
+  return true;
+}
+
+#endif  // defined (STARBOARD)
+
 }  // namespace
 
 namespace media {
 
+#if defined(STARBOARD)
+ChunkDemuxerStream::ChunkDemuxerStream(const std::string& mime_type, Type type,
+                                       MediaTrack::Id media_track_id)
+    : mime_type_(mime_type),
+      type_(type),
+#else  // defined (STARBOARD)
 ChunkDemuxerStream::ChunkDemuxerStream(Type type, MediaTrack::Id media_track_id)
     : type_(type),
+#endif  // defined (STARBOARD)
       liveness_(DemuxerStream::LIVENESS_UNKNOWN),
       media_track_id_(media_track_id),
       state_(UNINITIALIZED),
@@ -251,7 +297,11 @@
   base::AutoLock auto_lock(lock_);
   if (!stream_) {
     DCHECK_EQ(state_, UNINITIALIZED);
+#if defined(STARBOARD)
+    stream_ = std::make_unique<SourceBufferStream>(mime_type_, config, media_log);
+#else  // defined (STARBOARD)
     stream_ = std::make_unique<SourceBufferStream>(config, media_log);
+#endif  // defined (STARBOARD)
     return true;
   }
 
@@ -267,7 +317,11 @@
 
   if (!stream_) {
     DCHECK_EQ(state_, UNINITIALIZED);
+#if defined(STARBOARD)
+    stream_ = std::make_unique<SourceBufferStream>(mime_type_, config, media_log);
+#else  // defined (STARBOARD)
     stream_ = std::make_unique<SourceBufferStream>(config, media_log);
+#endif  // defined (STARBOARD)
     return true;
   }
 
@@ -708,6 +762,22 @@
                        ExpectedCodecs(content_type, codecs));
 }
 
+#if defined(STARBOARD)
+
+ChunkDemuxer::Status ChunkDemuxer::AddId(const std::string& id,
+                                         const std::string& mime_type) {
+  std::string type, codecs;
+  if (!ParseMimeType(mime_type, &type, &codecs)) {
+    return kNotSupported;
+  }
+
+  DCHECK(id_to_mime_map_.find(id) == id_to_mime_map_.end());
+  id_to_mime_map_[id] = mime_type;
+  return AddId(id, type, codecs);
+}
+
+#endif  // defined (STARBOARD)
+
 ChunkDemuxer::Status ChunkDemuxer::AddIdInternal(
     const std::string& id,
     std::unique_ptr<media::StreamParser> stream_parser,
@@ -1450,8 +1520,16 @@
       return nullptr;
   }
 
+#if defined(STARBOARD)
+  auto iter = id_to_mime_map_.find(source_id);
+  DCHECK(iter != id_to_mime_map_.end());
+  std::unique_ptr<ChunkDemuxerStream> stream =
+      std::make_unique<ChunkDemuxerStream>(iter->second, type, media_track_id);
+#else  // defined(STARBOARD)
   std::unique_ptr<ChunkDemuxerStream> stream =
       std::make_unique<ChunkDemuxerStream>(type, media_track_id);
+#endif  // defined (STARBOARD)
+
   DCHECK(track_id_to_demux_stream_map_.find(media_track_id) ==
          track_id_to_demux_stream_map_.end());
   track_id_to_demux_stream_map_[media_track_id] = stream.get();
diff --git a/third_party/chromium/media/filters/chunk_demuxer.h b/third_party/chromium/media/filters/chunk_demuxer.h
index d2fb4d1..e59fcfb 100644
--- a/third_party/chromium/media/filters/chunk_demuxer.h
+++ b/third_party/chromium/media/filters/chunk_demuxer.h
@@ -41,7 +41,11 @@
  public:
   using BufferQueue = base::circular_deque<scoped_refptr<StreamParserBuffer>>;
 
+#if defined(STARBOARD)
+  ChunkDemuxerStream(const std::string& mime_type, Type type, MediaTrack::Id media_track_id);
+#else  // defined (STARBOARD)
   ChunkDemuxerStream(Type type, MediaTrack::Id media_track_id);
+#endif  // defined (STARBOARD)
   ~ChunkDemuxerStream() override;
 
   // ChunkDemuxerStream control methods.
@@ -122,6 +126,10 @@
   void UnmarkEndOfStream();
 
   // DemuxerStream methods.
+#if defined(STARBOARD)
+  std::string mime_type() const override { return mime_type_; }
+#endif  // defined (STARBOARD)
+
   void Read(ReadCB read_cb) override;
   Type type() const override;
   Liveness liveness() const override;
@@ -170,6 +178,10 @@
 
   void CompletePendingReadIfPossible_Locked() EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
+#if defined(STARBOARD)
+  const std::string mime_type_;
+#endif  // defined (STARBOARD)
+
   // Specifies the type of the stream.
   const Type type_;
 
@@ -263,6 +275,12 @@
                std::unique_ptr<VideoDecoderConfig> video_config)
       WARN_UNUSED_RESULT;
 
+#if defined(STARBOARD)
+  // Special version of AddId() that retains the |mime_type| from the web app.
+  Status AddId(const std::string& id, const std::string& mime_type)
+      WARN_UNUSED_RESULT;
+#endif  // defined (STARBOARD)
+
   // Notifies a caller via |tracks_updated_cb| that the set of media tracks
   // for a given |id| has changed. This callback must be set before any calls to
   // AppendData() for this |id|.
@@ -556,6 +574,10 @@
   std::vector<std::unique_ptr<ChunkDemuxerStream>> removed_streams_;
 
   std::map<MediaTrack::Id, ChunkDemuxerStream*> track_id_to_demux_stream_map_;
+
+#if defined(STARBOARD)
+  std::map<std::string, std::string> id_to_mime_map_;
+#endif  // defined (STARBOARD)
 };
 
 }  // namespace media
diff --git a/third_party/chromium/media/filters/h264_bitstream_buffer.h b/third_party/chromium/media/filters/h264_bitstream_buffer.h
index 773d58b..70ed1d6 100644
--- a/third_party/chromium/media/filters/h264_bitstream_buffer.h
+++ b/third_party/chromium/media/filters/h264_bitstream_buffer.h
@@ -17,7 +17,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/numerics/safe_conversions.h"
 #include "media/base/media_export.h"
+#if !defined(STARBOARD)
 #include "media/base/video_frame.h"
+#endif  // !defined(STARBOARD)
 #include "media/video/h264_parser.h"
 
 namespace media {
diff --git a/third_party/chromium/media/filters/source_buffer_state.cc b/third_party/chromium/media/filters/source_buffer_state.cc
index 74814c3..8951bc8 100644
--- a/third_party/chromium/media/filters/source_buffer_state.cc
+++ b/third_party/chromium/media/filters/source_buffer_state.cc
@@ -916,6 +916,9 @@
 }
 
 void SourceBufferState::SetStreamMemoryLimits() {
+#if defined(STARBOARD)
+  // Cobalt doesn't get stream memory limits from the command line.
+#else  // defined(STARBOARD)
   size_t audio_buf_size_limit =
       GetMSEBufferSizeLimitIfExists(switches::kMSEAudioBufferSizeLimitMb);
   if (audio_buf_size_limit) {
@@ -935,6 +938,7 @@
     for (const auto& it : video_streams_)
       it.second->SetStreamMemoryLimit(video_buf_size_limit);
   }
+#endif  // defined(STARBOARD)
 }
 
 void SourceBufferState::OnNewMediaSegment() {
diff --git a/third_party/chromium/media/filters/source_buffer_stream.cc b/third_party/chromium/media/filters/source_buffer_stream.cc
index 509e2df..cdd8f4d 100644
--- a/third_party/chromium/media/filters/source_buffer_stream.cc
+++ b/third_party/chromium/media/filters/source_buffer_stream.cc
@@ -17,6 +17,9 @@
 #include "media/base/demuxer_memory_limit.h"
 #include "media/base/media_switches.h"
 #include "media/base/timestamp_constants.h"
+#if defined(STARBOARD)
+#include "starboard/media.h"
+#endif  // defined(STARBOARD)
 
 namespace media {
 
@@ -156,9 +159,17 @@
 
 }  // namespace
 
+#if defined(STARBOARD)
+SourceBufferStream::SourceBufferStream(const std::string& mime_type,
+                                       const AudioDecoderConfig& audio_config,
+                                       MediaLog* media_log)
+    : mime_type_(mime_type),
+      media_log_(media_log),
+#else  // defined (STARBOARD)
 SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config,
                                        MediaLog* media_log)
     : media_log_(media_log),
+#endif  // defined (STARBOARD)
       seek_buffer_timestamp_(kNoTimestamp),
       coded_frame_group_start_pts_(kNoTimestamp),
       range_for_next_append_(ranges_.end()),
@@ -171,9 +182,17 @@
   DVLOG(2) << __func__ << ": audio_buffer_size= " << memory_limit_;
 }
 
+#if defined(STARBOARD)
+SourceBufferStream::SourceBufferStream(const std::string& mime_type,
+                                       const VideoDecoderConfig& video_config,
+                                       MediaLog* media_log)
+    : mime_type_(mime_type),
+      media_log_(media_log),
+#else  // defined (STARBOARD)
 SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config,
                                        MediaLog* media_log)
     : media_log_(media_log),
+#endif  // defined (STARBOARD)
       seek_buffer_timestamp_(kNoTimestamp),
       coded_frame_group_start_pts_(kNoTimestamp),
       range_for_next_append_(ranges_.end()),
@@ -782,8 +801,16 @@
   // which should not happen in end-of-stream state. Unless we also allow GC to
   // happen on memory pressure notifications, which might happen even in EOS
   // state.
+#if defined(STARBOARD)
+  // TODO: Check if we should enable `kEnableMemoryPressureBasedSourceBufferGC`.
+  constexpr bool kEnableMemoryPressureBasedSourceBufferGC = true;
+  if (!kEnableMemoryPressureBasedSourceBufferGC) {
+    DCHECK(!end_of_stream_);
+  }
+#else // defined(STARBOARD)
   if (!base::FeatureList::IsEnabled(kMemoryPressureBasedSourceBufferGC))
     DCHECK(!end_of_stream_);
+#endif // defined(STARBOARD)
   // Compute size of |ranges_|.
   size_t ranges_size = GetBufferedSize();
 
@@ -800,7 +827,11 @@
   }
 
   size_t effective_memory_limit = memory_limit_;
+#if defined(STARBOARD)
+  if (kEnableMemoryPressureBasedSourceBufferGC) {
+#else // defined(STARBOARD)
   if (base::FeatureList::IsEnabled(kMemoryPressureBasedSourceBufferGC)) {
+#endif // defined(STARBOARD)
     switch (memory_pressure_level_) {
       case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
         effective_memory_limit = memory_limit_ / 2;
@@ -813,6 +844,17 @@
     }
   }
 
+#if defined(STARBOARD)
+  // Address duration based GC.
+  base::TimeDelta duration = GetBufferedDurationForGarbageCollection();
+  const SbTime duration_gc_threadold =
+      SbMediaGetBufferGarbageCollectionDurationThreshold();
+  if (duration.ToSbTime() > duration_gc_threadold) {
+    effective_memory_limit = ranges_size * duration_gc_threadold /
+                             duration.ToSbTime();
+  }
+#endif  // defined(STARBOARD)
+
   // Return if we're under or at the memory limit.
   if (ranges_size + newDataSize <= effective_memory_limit)
     return true;
@@ -1854,6 +1896,14 @@
   DVLOG(2) << "New video config - index: " << append_config_index_;
   video_configs_.resize(video_configs_.size() + 1);
   video_configs_[append_config_index_] = config;
+
+#if defined(STARBOARD)
+  // Dynamically increase |memory_limit_| when video resolution goes up.
+  memory_limit_ = std::max(
+      memory_limit_,
+      GetDemuxerStreamVideoMemoryLimit(Demuxer::DemuxerTypes::kChunkDemuxer,
+                                       &config));
+#endif  // defined(STARBOARD)
   return true;
 }
 
@@ -2020,4 +2070,17 @@
   return true;
 }
 
+#if defined(STARBOARD)
+
+base::TimeDelta SourceBufferStream::GetBufferedDurationForGarbageCollection()
+    const {
+  base::TimeDelta duration;
+  for (auto&& range : ranges_) {
+    duration += range->GetEndTimestamp() - range->GetStartTimestamp();
+  }
+  return duration;
+}
+
+#endif  // defined (STARBOARD)
+
 }  // namespace media
diff --git a/third_party/chromium/media/filters/source_buffer_stream.h b/third_party/chromium/media/filters/source_buffer_stream.h
index 1c6d245..356db45 100644
--- a/third_party/chromium/media/filters/source_buffer_stream.h
+++ b/third_party/chromium/media/filters/source_buffer_stream.h
@@ -61,10 +61,20 @@
                                    base::TimeDelta* start,
                                    base::TimeDelta* end);
 
+#if defined(STARBOARD)
+  SourceBufferStream(const std::string& mime_type,
+                     const AudioDecoderConfig& audio_config,
+                     MediaLog* media_log);
+  SourceBufferStream(const std::string& mime_type,
+                     const VideoDecoderConfig& video_config,
+                     MediaLog* media_log);
+#else  // defined (STARBOARD)
   SourceBufferStream(const AudioDecoderConfig& audio_config,
                      MediaLog* media_log);
   SourceBufferStream(const VideoDecoderConfig& video_config,
                      MediaLog* media_log);
+#endif  // defined (STARBOARD)
+
   SourceBufferStream(const TextTrackConfig& text_config, MediaLog* media_log);
 
   SourceBufferStream(const SourceBufferStream&) = delete;
@@ -389,6 +399,14 @@
   // returns true.  Otherwise returns false.
   bool SetPendingBuffer(scoped_refptr<StreamParserBuffer>* out_buffer);
 
+#if defined(STARBOARD)
+  // Returns the accumulated duration of all ranges.  This is solely used by
+  // duration base garbage collection.
+  base::TimeDelta GetBufferedDurationForGarbageCollection() const;
+
+  const std::string mime_type_;
+#endif  // defined (STARBOARD)
+
   // Used to report log messages that can help the web developer figure out what
   // is wrong with the content.
   MediaLog* media_log_;
diff --git a/third_party/chromium/media/formats/webm/webm_cluster_parser.h b/third_party/chromium/media/formats/webm/webm_cluster_parser.h
index 1f2ffcb..6ecced1 100644
--- a/third_party/chromium/media/formats/webm/webm_cluster_parser.h
+++ b/third_party/chromium/media/formats/webm/webm_cluster_parser.h
@@ -33,6 +33,16 @@
 
   // Numbers chosen to estimate the duration of a buffer if none is set and
   // there is not enough information to get a better estimate.
+#if defined(STARBOARD)
+  // Our version of base::ClampedNumeric() doesn't support enum as underlying
+  // type.
+
+  // Common 1k samples @44.1kHz
+  static constexpr int kDefaultAudioBufferDurationInMs = 23;
+  // Chosen to represent 16fps duration, which will prevent MSE stalls in videos
+  // with frame-rates as low as 8fps.
+  static constexpr int kDefaultVideoBufferDurationInMs = 63;
+#else // defined(STARBOARD)
   enum {
     // Common 1k samples @44.1kHz
     kDefaultAudioBufferDurationInMs = 23,
@@ -41,6 +51,7 @@
     // videos with frame-rates as low as 8fps.
     kDefaultVideoBufferDurationInMs = 63
   };
+#endif  // defined(STARBOARD)
 
   // Opus packets encode the duration and other parameters in the 5 most
   // significant bits of the first byte. The index in this array corresponds
diff --git a/third_party/chromium/media/formats/webm/webm_colour_parser.cc b/third_party/chromium/media/formats/webm/webm_colour_parser.cc
index ee28b27..246e959 100644
--- a/third_party/chromium/media/formats/webm/webm_colour_parser.cc
+++ b/third_party/chromium/media/formats/webm/webm_colour_parser.cc
@@ -7,7 +7,27 @@
 #include "base/check.h"
 #include "base/logging.h"
 #include "media/formats/webm/webm_constants.h"
+
+#if defined(STARBOARD)
+
+// Taken from mkvmuxer.h as is to avoid introducing the whole libwebm library.
+namespace mkvmuxer {
+
+class Colour {
+ public:
+  enum Range {
+    kUnspecifiedCr = 0,
+    kBroadcastRange = 1,
+    kFullRange = 2,
+    kMcTcDefined = 3,  // Defined by MatrixCoefficients/TransferCharacteristics.
+  };
+};
+
+}  // namespace mkvmuxer
+
+#else // defined(STARBOARD)
 #include "third_party/libwebm/source/mkvmuxer/mkvmuxer.h"
+#endif // defined(STARBOARD)
 
 namespace media {
 
diff --git a/third_party/chromium/media/gpu/buildflags.h b/third_party/chromium/media/gpu/buildflags.h
new file mode 100644
index 0000000..803bdd8
--- /dev/null
+++ b/third_party/chromium/media/gpu/buildflags.h
@@ -0,0 +1,19 @@
+// Modified based on the file generated by build/write_buildflag_header.py from
+// "//media/gpu:buildflags"
+
+#ifndef MEDIA_GPU_BUILDFLAGS_H_
+#define MEDIA_GPU_BUILDFLAGS_H_
+
+#if !defined(STARBOARD)
+#error "This file only works with Cobalt/Starboard."
+#endif  // !defined(STARBOARD)
+
+#include "build/buildflag.h"
+
+#define BUILDFLAG_INTERNAL_USE_VAAPI() (0)
+#define BUILDFLAG_INTERNAL_USE_VAAPI_IMAGE_CODECS() (0)
+#define BUILDFLAG_INTERNAL_USE_V4L2_CODEC() (0)
+#define BUILDFLAG_INTERNAL_USE_LIBV4L2() (0)
+#define BUILDFLAG_INTERNAL_USE_VAAPI_X11() (0)
+
+#endif  // MEDIA_GPU_BUILDFLAGS_H_
diff --git a/third_party/chromium/media/media_buildflags.h b/third_party/chromium/media/media_buildflags.h
new file mode 100644
index 0000000..be0bd01
--- /dev/null
+++ b/third_party/chromium/media/media_buildflags.h
@@ -0,0 +1,49 @@
+// Modified based on the file generated by build/write_buildflag_header.py from
+// "//media:media_buildflags"
+
+#ifndef MEDIA_MEDIA_BUILDFLAGS_H_
+#define MEDIA_MEDIA_BUILDFLAGS_H_
+
+#if !defined(STARBOARD)
+#error "This file only works with Cobalt/Starboard."
+#endif  // !defined(STARBOARD)
+
+#include "build/buildflag.h"
+
+#define BUILDFLAG_INTERNAL_ALTERNATE_CDM_STORAGE_ID_KEY() ("")
+#define BUILDFLAG_INTERNAL_CDM_PLATFORM_SPECIFIC_PATH() ("_platform_specific/linux_x64")
+#define BUILDFLAG_INTERNAL_ENABLE_PLATFORM_AC3_EAC3_AUDIO() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_CAST_AUDIO_RENDERER() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_CDM_HOST_VERIFICATION() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_CDM_STORAGE_ID() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_DAV1D_DECODER() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_AV1_DECODER() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_PLATFORM_DOLBY_VISION() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_FFMPEG() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_FFMPEG_VIDEO_DECODERS() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_PLATFORM_HEVC() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_PLATFORM_HEVC_DECODING() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_PLATFORM_ENCRYPTED_HEVC() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_HLS_SAMPLE_AES() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_HLS_DEMUXER() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_LIBGAV1_DECODER() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_LIBRARY_CDMS() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_LIBAOM() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_LIBVPX() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_LOGGING_OVERRIDE() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_MEDIA_DRM_STORAGE() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_MEDIA_REMOTING() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_MEDIA_REMOTING_RPC() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_OPENH264() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_PLATFORM_MPEG_H_AUDIO() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_MSE_MPEG2TS_STREAM_PARSER() (0)
+#define BUILDFLAG_INTERNAL_ENABLE_CAST_STREAMING_RENDERER() (0)
+#define BUILDFLAG_INTERNAL_USE_ARC_PROTECTED_MEDIA() (0)
+#define BUILDFLAG_INTERNAL_USE_CHROMEOS_MEDIA_ACCELERATION() (true||false)
+#define BUILDFLAG_INTERNAL_USE_CHROMEOS_PROTECTED_AV1() (0)
+#define BUILDFLAG_INTERNAL_USE_CHROMEOS_PROTECTED_MEDIA() (0)
+#define BUILDFLAG_INTERNAL_USE_PROPRIETARY_CODECS() (1)
+#define BUILDFLAG_INTERNAL_ENABLE_PLATFORM_DTS_AUDIO() (0)
+#define BUILDFLAG_INTERNAL_IS_CHROMEOS_ASH() (0)
+
+#endif  // MEDIA_MEDIA_BUILDFLAGS_H_
diff --git a/third_party/chromium/media/video/h265_parser.cc b/third_party/chromium/media/video/h265_parser.cc
index 0bcaa83..40452eb 100644
--- a/third_party/chromium/media/video/h265_parser.cc
+++ b/third_party/chromium/media/video/h265_parser.cc
@@ -48,9 +48,17 @@
                                   int size_id,
                                   int matrix_id) {
   if (size_id == 0) {
+#if defined(STARBOARD)
+    // Looping on an enum (i.e. kScalingListSizeId0Count) isn't supported on
+    // all platforms.
+    std::fill_n(scaling_list_data->scaling_list_4x4[matrix_id],
+                static_cast<int>(H265ScalingListData::kScalingListSizeId0Count),
+                H265ScalingListData::kDefaultScalingListSize0Values);
+#else  // defined(STARBOARD)
     std::fill_n(scaling_list_data->scaling_list_4x4[matrix_id],
                 H265ScalingListData::kScalingListSizeId0Count,
                 H265ScalingListData::kDefaultScalingListSize0Values);
+#endif  // defined(STARBOARD)
     return;
   }
 
@@ -1345,7 +1353,14 @@
     bool used_by_curr_pic_flag[kMaxShortTermRefPicSets];
     bool use_delta_flag[kMaxShortTermRefPicSets];
     // 7.4.8 - use_delta_flag defaults to 1 if not present.
+#if defined(STARBOARD)
+    // Looping on an enum (i.e. kMaxShortTermRefPicSets) isn't supported on all
+    // platforms.
+    std::fill_n(use_delta_flag, static_cast<int>(kMaxShortTermRefPicSets),
+                true);
+#else  // defined(STARBOARD)
     std::fill_n(use_delta_flag, kMaxShortTermRefPicSets, true);
+#endif  // defined(STARBOARD)
 
     for (int j = 0; j <= ref_set.num_delta_pocs; j++) {
       READ_BOOL_OR_RETURN(&used_by_curr_pic_flag[j]);
diff --git a/third_party/crashpad/build/crashpad.gypi b/third_party/crashpad/build/crashpad.gypi
deleted file mode 100644
index 5acc87a..0000000
--- a/third_party/crashpad/build/crashpad.gypi
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2015 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    # When building as a part of Chromium, this variable sets up the build to
-    # treat Crashpad as Chromium code. This enables warnings at an appropriate
-    # level and applies Chromium’s build/filename_rules.gypi. In a standalone
-    # build, this variable has no effect.
-    'crashpad_code': 1,
-  },
-  'target_defaults': {
-    'msvs_disabled_warnings': [
-      4201,  # nonstandard extension used : nameless struct/union.
-      4324,  # structure was padded due to __declspec(align()).
-    ],
-    'conditions': [
-      ['target_os=="linux" or target_os=="android"', {
-        'conditions': [
-          ['clang==0', {
-            'cflags': [
-              '-Wno-multichar',
-            ],
-          }],
-        ],
-      }],
-      ['OS=="android"', {
-        'ldflags': [
-          '-static-libstdc++',
-        ],
-      }],
-    ],
-  },
-}
diff --git a/third_party/crashpad/build/crashpad_dependencies.gypi b/third_party/crashpad/build/crashpad_dependencies.gypi
deleted file mode 100644
index 1e04abd..0000000
--- a/third_party/crashpad/build/crashpad_dependencies.gypi
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2015 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  # Crashpad’s GYP build can obtain dependencies in two different ways, directed
-  # by the crashpad_standalone GYP variable. It may have these values:
-  #   standalone
-  #     A “standalone” Crashpad build, where the dependencies are in the
-  #     Crashpad tree. third_party/mini_chromium and third_party/gtest provide
-  #     the base and gtest libraries.
-  #   external
-  #     A build with external dependencies. mini_chromium provides the base
-  #     library, but it’s located outside of the Crashpad tree, as is gtest.
-  #
-  # In order for Crashpad’s .gyp files to reference the correct versions
-  # depending on how dependencies are being provided, include this .gypi file
-  # and reference the crashpad_dependencies variable.
-  #
-  # Note that Crashpad’s in-Chromium build uses GN instead of GYP, and
-  # Chromium’s GN build configures Crashpad to use Chromium’s own base library
-  # and its copy of the gtest library.
-
-  'variables': {
-    'crashpad_dependencies%': 'external',
-  },
-}
diff --git a/third_party/crashpad/client/client.gyp b/third_party/crashpad/client/client.gyp
deleted file mode 100644
index d0f30fb..0000000
--- a/third_party/crashpad/client/client.gyp
+++ /dev/null
@@ -1,108 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_client',
-      'type': 'static_library',
-      'dependencies': [
-        '../compat/compat.gyp:crashpad_compat',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../third_party/lss/lss.gyp:lss',
-        '../util/util.gyp:crashpad_util',
-      ],
-      # We change including the top level directory here to a isystem include
-      # to ensure it is included after all normal includes for Crashpad. This
-      # guarantees that Crashpad will find mini_chromium's base before Cobalt's
-      # base. The same is true for direct dependents.
-      'include_dirs!': [
-        '<(DEPTH)',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'cflags': [
-        '-isystem../..',
-      ],
-      'sources': [
-        'annotation.cc',
-        'annotation.h',
-        'annotation_list.cc',
-        'annotation_list.h',
-        'crash_report_database.cc',
-        'crash_report_database.h',
-        'crash_report_database_mac.mm',
-        'crash_report_database_win.cc',
-        'crashpad_client.h',
-        'crashpad_client_linux.cc',
-        'crashpad_client_mac.cc',
-        'crashpad_client_win.cc',
-        'crashpad_info.cc',
-        'crashpad_info.h',
-        'prune_crash_reports.cc',
-        'prune_crash_reports.h',
-        'settings.cc',
-        'settings.h',
-        'simple_string_dictionary.h',
-        'simple_address_range_bag.h',
-        'simulate_crash.h',
-        'simulate_crash_linux.h',
-        'simulate_crash_mac.cc',
-        'simulate_crash_mac.h',
-        'simulate_crash_win.h',
-      ],
-      'conditions': [
-        ['OS=="win"', {
-          'link_settings': {
-            'libraries': [
-              '-lrpcrt4.lib',
-            ],
-          },
-        }],
-        ['target_os=="linux" or target_os=="android"', {
-          'sources': [
-            'client_argv_handling.cc',
-            'client_argv_handling.h',
-            'crashpad_info_note.S',
-            'crash_report_database_generic.cc',
-          ],
-        }],
-      ],
-      'target_conditions': [
-        ['OS=="android"', {
-          'sources/': [
-            ['include', '^crashpad_client_linux\\.cc$'],
-            ['include', '^simulate_crash_linux\\.h$'],
-          ],
-        }],
-      ],
-      'direct_dependent_settings': {
-        'include_dirs!': [
-          '<(DEPTH)',
-        ],
-        'include_dirs': [
-          '..',
-          '<(DEPTH)/third_party/mini_chromium',
-        ],
-        'cflags': [
-          '-isystem../..',
-        ],
-      },
-    },
-  ],
-}
diff --git a/third_party/crashpad/client/client_test.gyp b/third_party/crashpad/client/client_test.gyp
deleted file mode 100644
index 0686cc6..0000000
--- a/third_party/crashpad/client/client_test.gyp
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_client_test',
-      'type': 'executable',
-      'dependencies': [
-        'client.gyp:crashpad_client',
-        '../compat/compat.gyp:crashpad_compat',
-        '../handler/handler.gyp:crashpad_handler',
-        '../snapshot/snapshot.gyp:crashpad_snapshot',
-        '../test/test.gyp:crashpad_gmock_main',
-        '../test/test.gyp:crashpad_test',
-        '../third_party/gtest/gmock.gyp:gmock',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'annotation_test.cc',
-        'annotation_list_test.cc',
-        'crash_report_database_test.cc',
-        'crashpad_client_win_test.cc',
-        'crashpad_client_linux_test.cc',
-        'prune_crash_reports_test.cc',
-        'settings_test.cc',
-        'simple_address_range_bag_test.cc',
-        'simple_string_dictionary_test.cc',
-        'simulate_crash_mac_test.cc',
-      ],
-      'conditions': [
-        ['OS=="win"', {
-          'dependencies': [
-            '../handler/handler.gyp:crashpad_handler_console',
-          ],
-        }],
-      ],
-      'target_conditions': [
-        ['OS=="android"', {
-          'sources/': [
-            ['include', '^crashpad_client_linux_test\\.cc$'],
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/client/crashpad_client_linux.cc b/third_party/crashpad/client/crashpad_client_linux.cc
index 570be2e..5738668 100644
--- a/third_party/crashpad/client/crashpad_client_linux.cc
+++ b/third_party/crashpad/client/crashpad_client_linux.cc
@@ -42,6 +42,13 @@
 
 namespace {
 
+#if defined(STARBOARD)
+constexpr char kEvergreenInfoKey[] = "evergreen-information";
+constexpr char kProductKey[] = "annotation=prod";
+constexpr char kVersionKey[] = "annotation=ver";
+constexpr char kUAKey[] = "annotation=user_agent_string";
+#endif
+
 std::string FormatArgumentInt(const std::string& name, int value) {
   return base::StringPrintf("--%s=%d", name.c_str(), value);
 }
@@ -50,6 +57,36 @@
   return base::StringPrintf("--%s=%p", name.c_str(), addr);
 }
 
+#if defined(STARBOARD)
+std::string FormatArgumentString(const std::string& name,
+                                 const std::string& value) {
+  return base::StringPrintf("--%s=%s", name.c_str(), value.c_str());
+}
+
+bool UpdateAnnotation(std::string& annotation,
+                            const std::string key,
+                            const std::string& new_value) {
+  if (new_value.empty()) {
+    return false;
+  }
+  // The annotation is in the format --key=value
+  if (annotation.compare(2, key.size(), key) == 0) {
+    annotation = FormatArgumentString(key, new_value);
+    LOG(INFO) << "Updated annotation: " << annotation;
+    return true;
+  }
+  return false;
+}
+
+void AddAnnotation(std::vector<std::string>& argv_strings,
+                         const std::string& key,
+                         const std::string& new_value) {
+  std::string v = FormatArgumentString(key, new_value);
+  argv_strings.push_back(v);
+  LOG(INFO) << "Added annotation: " << v;
+}
+#endif
+
 #if defined(OS_ANDROID)
 
 std::vector<std::string> BuildAppProcessArgs(
@@ -265,8 +302,55 @@
   }
 
 #if defined(STARBOARD)
-  bool SendEvergreenInfoImpl() override { return false; }
-  bool SendAnnotationsImpl() override { return false; }
+  bool SendEvergreenInfoImpl() override {
+    bool updated = false;
+    for (auto& s : argv_strings_) {
+      if (s.compare(2, strlen(kEvergreenInfoKey), kEvergreenInfoKey) == 0) {
+        s = FormatArgumentAddress(kEvergreenInfoKey, &GetEvergreenInfo());
+        LOG(INFO) << "Updated evergreen info: " << s;
+        updated = true;
+        break;
+      }
+    }
+    if (!updated) {
+      std::string v =
+          FormatArgumentAddress(kEvergreenInfoKey, &GetEvergreenInfo());
+      argv_strings_.push_back(v);
+      LOG(INFO) << "Added evergreen info: " << v;
+    }
+
+    StringVectorToCStringVector(argv_strings_, &argv_);
+
+    return true;
+  }
+
+  bool SendAnnotationsImpl() override {
+    bool updated_product = false;
+    bool updated_version = false;
+    bool updated_user_agent_string = false;
+    for (auto& s : argv_strings_) {
+      if (UpdateAnnotation(s, kProductKey, GetAnnotations().product)) {
+        updated_product = true;
+      } else if (UpdateAnnotation(s, kVersionKey, GetAnnotations().version)) {
+        updated_version = true;
+      } else if (UpdateAnnotation(s, kUAKey, GetAnnotations().user_agent_string)) {
+        updated_user_agent_string = true;
+      }
+    }
+    if (!updated_product) {
+      AddAnnotation(argv_strings_, kProductKey, GetAnnotations().product);
+    }
+    if (!updated_version) {
+      AddAnnotation(argv_strings_, kVersionKey, GetAnnotations().version);
+    }
+    if (!updated_user_agent_string) {
+      AddAnnotation(argv_strings_, kUAKey, GetAnnotations().user_agent_string);
+    }
+
+    StringVectorToCStringVector(argv_strings_, &argv_);
+
+    return true;
+  }
 #endif
 
   void HandleCrashImpl() override {
@@ -387,6 +471,9 @@
 #if defined(STARBOARD)
     info.sanitization_information_address =
         FromPointerCast<VMAddress>(&GetSanitizationInformation());
+    info.annotations_address = FromPointerCast<VMAddress>(&GetAnnotations());
+    info.evergreen_information_address =
+        FromPointerCast<VMAddress>(&GetEvergreenInfo());
 #endif
 
 #if defined(OS_CHROMEOS)
diff --git a/third_party/crashpad/compat/compat.gyp b/third_party/crashpad/compat/compat.gyp
deleted file mode 100644
index 646e9bc..0000000
--- a/third_party/crashpad/compat/compat.gyp
+++ /dev/null
@@ -1,142 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_compat',
-      'type': 'none',
-      'sources': [
-        'android/android/api-level.cc',
-        'android/android/api-level.h',
-        'android/dlfcn_internal.cc',
-        'android/dlfcn_internal.h',
-        'android/elf.h',
-        'android/linux/elf.h',
-        'android/linux/prctl.h',
-        'android/linux/ptrace.h',
-        'android/sched.h',
-        'android/sys/epoll.cc',
-        'android/sys/epoll.h',
-        'android/sys/mman.cc',
-        'android/sys/mman.h',
-        'android/sys/syscall.h',
-        'android/sys/user.h',
-        'linux/signal.h',
-        'linux/sys/ptrace.h',
-        'linux/sys/user.h',
-        'mac/AvailabilityMacros.h',
-        'mac/kern/exc_resource.h',
-        'mac/mach/i386/thread_state.h',
-        'mac/mach/mach.h',
-        'mac/mach-o/loader.h',
-        'mac/sys/resource.h',
-        'non_mac/mach/mach.h',
-        'non_win/dbghelp.h',
-        'non_win/minwinbase.h',
-        'non_win/timezoneapi.h',
-        'non_win/verrsrc.h',
-        'non_win/windows.h',
-        'non_win/winnt.h',
-        'win/getopt.h',
-        'win/strings.cc',
-        'win/strings.h',
-        'win/sys/time.h',
-        'win/sys/types.h',
-        'win/time.cc',
-        'win/time.h',
-        'win/winbase.h',
-        'win/winnt.h',
-        'win/winternl.h',
-      ],
-      'conditions': [
-        ['OS=="mac"', {
-          'type': 'none',
-          'include_dirs': [
-            'mac',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'mac',
-            ],
-          },
-        }, {
-          'include_dirs': [
-            'non_mac',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'non_mac',
-            ],
-          },
-        }],
-        ['OS=="win"', {
-          'type': 'static_library',
-          'include_dirs': [
-            'win',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'win',
-            ],
-          },
-          'dependencies': [
-            '../third_party/getopt/getopt.gyp:getopt',
-          ],
-        }, {
-          'include_dirs': [
-            'non_win',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'non_win',
-            ],
-          },
-        }],
-        ['OS=="android"', {
-          'type': 'static_library',
-          'include_dirs': [
-            'android',
-            'linux',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'android',
-              'linux',
-            ],
-          },
-          'link_settings': {
-            'libraries': [
-              '-ldl',
-            ],
-          },
-        }],
-        ['target_os=="linux"', {
-          'type': 'none',
-          'include_dirs': [
-            'linux',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'linux',
-            ],
-          },
-        }],
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/crashpad.gyp b/third_party/crashpad/crashpad.gyp
deleted file mode 100644
index cbbf283..0000000
--- a/third_party/crashpad/crashpad.gyp
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'All',
-      'type': 'none',
-      'dependencies': [
-        'client/client.gyp:*',
-        # 'client/client_test.gyp:*',
-        'compat/compat.gyp:*',
-        'handler/handler.gyp:*',
-        # 'handler/handler_test.gyp:*',
-        'minidump/minidump.gyp:*',
-        # 'minidump/minidump_test.gyp:*',
-        'snapshot/snapshot.gyp:*',
-        # 'snapshot/snapshot_test.gyp:*',
-        # 'test/test.gyp:*',
-        # 'test/test_test.gyp:*',
-        'tools/tools.gyp:*',
-        'util/util.gyp:*',
-        # 'util/util_test.gyp:*',
-      ],
-      'sources': [
-        'doc/support/crashpad.doxy.h',
-        'package.h',
-      ],
-      'conditions': [
-        ['OS!="mac" and OS!="win"', {
-          'suppress_wildcard': 1,
-        }],
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/handler/handler.gyp b/third_party/crashpad/handler/handler.gyp
deleted file mode 100644
index d862d70..0000000
--- a/third_party/crashpad/handler/handler.gyp
+++ /dev/null
@@ -1,165 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      # This target exists so that the crashpad_handler can be embedded into
-      # another binary.
-      'target_name': 'crashpad_handler_lib',
-      'type': 'static_library',
-      'dependencies': [
-        '../client/client.gyp:crashpad_client',
-        '../compat/compat.gyp:crashpad_compat',
-        '../minidump/minidump.gyp:crashpad_minidump',
-        '../snapshot/snapshot.gyp:crashpad_snapshot',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../third_party/zlib/zlib.gyp:zlib',
-        '../tools/tools.gyp:crashpad_tool_support',
-        '../util/util.gyp:crashpad_util',
-        '<(DEPTH)/third_party/boringssl/boringssl.gyp:crypto_full',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'defines': [
-        'CRASHPAD_USE_BORINGSSL',
-      ],
-      'sources': [
-        '../util/net/http_transport_socket.cc',
-        'crash_report_upload_thread.cc',
-        'crash_report_upload_thread.h',
-        'handler_main.cc',
-        'handler_main.h',
-        'linux/capture_snapshot.cc',
-        'linux/capture_snapshot.h',
-        'linux/crash_report_exception_handler.cc',
-        'linux/crash_report_exception_handler.h',
-        'linux/exception_handler_server.cc',
-        'linux/exception_handler_server.h',
-        'mac/crash_report_exception_handler.cc',
-        'mac/crash_report_exception_handler.h',
-        'mac/exception_handler_server.cc',
-        'mac/exception_handler_server.h',
-        'mac/file_limit_annotation.cc',
-        'mac/file_limit_annotation.h',
-        'minidump_to_upload_parameters.cc',
-        'minidump_to_upload_parameters.h',
-        'prune_crash_reports_thread.cc',
-        'prune_crash_reports_thread.h',
-        'user_stream_data_source.cc',
-        'user_stream_data_source.h',
-        'win/crash_report_exception_handler.cc',
-        'win/crash_report_exception_handler.h',
-      ],
-      'target_conditions': [
-        ['OS=="android"', {
-          'sources/': [
-            ['include', '^linux/'],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'crashpad_handler',
-      'type': 'executable',
-      'dependencies': [
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../tools/tools.gyp:crashpad_tool_support',
-        'crashpad_handler_lib',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'main.cc',
-      ],
-      'conditions': [
-        # Help platforms cross compiled on linux to reduce
-        # the memory footprint of crashpad_handler by eliminating
-        # unused code and unused shared libraries.
-        # The flags assume gcc/clang toolchain.
-        ['host_os=="linux"',  {
-          'cflags': [
-            '-ffunction-sections',
-            '-fdata-sections',
-          ],
-          'ldflags': [
-            '-Wl,--as-needed',
-            '-Wl,-gc-sections',
-            '-Wl,-z,noexecstack',
-          ],
-        }],
-        ['OS=="win"',  {
-          'msvs_settings': {
-            'VCLinkerTool': {
-              'SubSystem': '2',  # /SUBSYSTEM:WINDOWS
-            },
-          },
-        }],
-      ],
-    },
-    {
-      'target_name': 'crashpad_handler_deploy',
-      'type': 'none',
-      'dependencies': [
-        'crashpad_handler',
-      ],
-      'variables': {
-        'executable_name': 'crashpad_handler',
-      },
-      'includes': ['<(DEPTH)/starboard/build/deploy.gypi'],
-    },
-  ],
-  'conditions': [
-    ['OS=="win"', {
-      'targets': [
-        {
-          # Duplicates crashpad_handler.exe to crashpad_handler.com and makes it
-          # a console app.
-          'target_name': 'crashpad_handler_console',
-          'type': 'none',
-          'dependencies': [
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../tools/tools.gyp:crashpad_tool_support',
-            'crashpad_handler',
-          ],
-          'actions': [
-            {
-              'action_name': 'copy handler exe to com',
-              'inputs': [
-                '<(PRODUCT_DIR)/crashpad_handler.exe',
-              ],
-              'outputs': [
-                '<(PRODUCT_DIR)/crashpad_handler.com',
-              ],
-              'action': [
-                'copy <(PRODUCT_DIR)\crashpad_handler.exe '
-                    '<(PRODUCT_DIR)\crashpad_handler.com >nul && '
-                'editbin -nologo -subsystem:console '
-                    '<(PRODUCT_DIR)\crashpad_handler.com >nul',
-              ],
-              'msvs_cygwin_shell': '0',
-              'quote_cmd': '0',
-            },
-          ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/third_party/crashpad/handler/handler_main.cc b/third_party/crashpad/handler/handler_main.cc
index be73916..51bd64e 100644
--- a/third_party/crashpad/handler/handler_main.cc
+++ b/third_party/crashpad/handler/handler_main.cc
@@ -169,6 +169,10 @@
 "      --trace-parent-with-exception=EXCEPTION_INFORMATION_ADDRESS\n"
 "                              request a dump for the handler's parent process\n"
 #endif  // OS_LINUX || OS_ANDROID
+#if defined(STARBOARD)
+"      --evergreen-information=EVERGREEN_INFORMATION_ADDRESS\n"
+"                              the address of a EvegreenInfo struct.\n"
+#endif
 "      --url=URL               send crash reports to this Breakpad server URL,\n"
 "                              only if uploads are enabled for the database\n"
 #if defined(OS_CHROMEOS)
@@ -208,6 +212,9 @@
   VMAddress sanitization_information_address;
   int initial_client_fd;
   bool shared_client_connection;
+#if defined(STARBOARD)
+  VMAddress evergreen_information_address;
+#endif  // defined(STARBOARD)
 #if defined(OS_ANDROID)
   bool write_minidump_to_log;
   bool write_minidump_to_database;
@@ -581,6 +588,9 @@
     kOptionSanitizationInformation,
     kOptionSharedClientConnection,
     kOptionTraceParentWithException,
+#if defined(STARBOARD)
+    kOptionEvergreenInformaton,
+#endif  // defined(STARBOARD)
 #endif
     kOptionURL,
 #if defined(OS_CHROMEOS)
@@ -661,6 +671,12 @@
      nullptr,
      kOptionTraceParentWithException},
 #endif  // OS_LINUX || OS_ANDROID
+#if defined(STARBOARD)
+    {"evergreen-information",
+     required_argument,
+     nullptr,
+     kOptionEvergreenInformaton},
+#endif
     {"url", required_argument, nullptr, kOptionURL},
 #if defined(OS_CHROMEOS)
     {"use-cros-crash-reporter",
@@ -824,6 +840,17 @@
         }
         break;
       }
+#if defined(STARBOARD)
+      case kOptionEvergreenInformaton: {
+        if (!StringToNumber(optarg,
+                            &options.evergreen_information_address)) {
+          ToolSupport::UsageHint(me,
+                                 "failed to parse --evergreen-information");
+          return ExitFailure();
+        }
+        break;
+      }
+#endif   // defined(STARBOARD)
 #endif  // OS_LINUX || OS_ANDROID
       case kOptionURL: {
         options.url = optarg;
@@ -1040,6 +1067,10 @@
     info.exception_information_address = options.exception_information_address;
     info.sanitization_information_address =
         options.sanitization_information_address;
+#if defined(STARBOARD)
+    info.evergreen_information_address =
+        options.evergreen_information_address;
+#endif   // defined(STARBOARD)
     return exception_handler->HandleException(getppid(), geteuid(), info)
                ? EXIT_SUCCESS
                : ExitFailure();
diff --git a/third_party/crashpad/handler/handler_test.gyp b/third_party/crashpad/handler/handler_test.gyp
deleted file mode 100644
index c047e7c..0000000
--- a/third_party/crashpad/handler/handler_test.gyp
+++ /dev/null
@@ -1,196 +0,0 @@
-# Copyright 2017 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_handler_test',
-      'type': 'executable',
-      'dependencies': [
-        'crashpad_handler_test_extended_handler',
-        'handler.gyp:crashpad_handler_lib',
-        '../client/client.gyp:crashpad_client',
-        '../compat/compat.gyp:crashpad_compat',
-        '../snapshot/snapshot.gyp:crashpad_snapshot',
-        '../snapshot/snapshot_test.gyp:crashpad_snapshot_test_lib',
-        '../test/test.gyp:crashpad_gtest_main',
-        '../test/test.gyp:crashpad_test',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'crashpad_handler_test.cc',
-        'linux/exception_handler_server_test.cc',
-        'minidump_to_upload_parameters_test.cc',
-      ],
-      'conditions': [
-        ['OS!="win"', {
-          'dependencies!': [
-            'crashpad_handler_test_extended_handler',
-          ],
-          'sources!': [
-            'crashpad_handler_test.cc',
-          ],
-        }],
-      ],
-      'target_conditions': [
-        ['OS=="android"', {
-          'sources/': [
-            ['include', '^linux/'],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'crashpad_handler_test_extended_handler',
-      'type': 'executable',
-      'dependencies': [
-        '../compat/compat.gyp:crashpad_compat',
-        '../minidump/minidump_test.gyp:crashpad_minidump_test_lib',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../tools/tools.gyp:crashpad_tool_support',
-        'handler.gyp:crashpad_handler_lib',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'crashpad_handler_test_extended_handler.cc',
-      ],
-    },
-  ],
-  'conditions': [
-    ['OS=="win"', {
-      'targets': [
-        {
-          'target_name': 'crash_other_program',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../test/test.gyp:crashpad_test',
-            '../third_party/gtest/gtest.gyp:gtest',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'sources': [
-            'win/crash_other_program.cc',
-          ],
-        },
-        {
-          'target_name': 'crashy_program',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'include_dirs': [
-            '..',
-          ],
-          'sources': [
-            'win/crashy_test_program.cc',
-          ],
-        },
-        {
-          'target_name': 'crashy_signal',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-          ],
-          'include_dirs': [
-            '..',
-          ],
-          'sources': [
-            'win/crashy_signal.cc',
-          ],
-        },
-        {
-          'target_name': 'fake_handler_that_crashes_at_startup',
-          'type': 'executable',
-          'sources': [
-            'win/fake_handler_that_crashes_at_startup.cc',
-          ],
-        },
-        {
-          'target_name': 'hanging_program',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-          ],
-          'sources': [
-            'win/hanging_program.cc',
-          ],
-        },
-        {
-          'target_name': 'loader_lock_dll',
-          'type': 'loadable_module',
-          'sources': [
-            'win/loader_lock_dll.cc',
-          ],
-          'msvs_settings': {
-            'NoImportLibrary': 'true',
-          },
-        },
-        {
-          'target_name': 'self_destroying_program',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../compat/compat.gyp:crashpad_compat',
-            '../snapshot/snapshot.gyp:crashpad_snapshot',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'include_dirs': [
-            '..',
-          ],
-          'sources': [
-            'win/self_destroying_test_program.cc',
-          ],
-        },
-      ],
-      'conditions': [
-        # Cannot create an x64 DLL with embedded debug info.
-        ['target_arch=="ia32"', {
-          'targets': [
-            {
-              'target_name': 'crashy_z7_loader',
-              'type': 'executable',
-              'dependencies': [
-                '../client/client.gyp:crashpad_client',
-                '../test/test.gyp:crashpad_test',
-                '../third_party/mini_chromium/mini_chromium.gyp:base',
-              ],
-              'include_dirs': [
-                '..',
-              ],
-              'sources': [
-                'win/crashy_test_z7_loader.cc',
-              ],
-            },
-          ],
-        }],
-      ],
-    }],
-  ],
-}
diff --git a/third_party/crashpad/handler/linux/capture_snapshot.cc b/third_party/crashpad/handler/linux/capture_snapshot.cc
index 488bbba..8fb0735 100644
--- a/third_party/crashpad/handler/linux/capture_snapshot.cc
+++ b/third_party/crashpad/handler/linux/capture_snapshot.cc
@@ -41,8 +41,9 @@
   std::unique_ptr<ProcessSnapshotLinux> process_snapshot(
       new ProcessSnapshotLinux());
 #if defined(STARBOARD)
-  if (!process_snapshot->Initialize(
-          connection, evergreen_information_address, annotations_address)) {
+  if (!process_snapshot->Initialize(connection,
+                                    info.evergreen_information_address,
+                                    info.annotations_address)) {
 #else
   if (!process_snapshot->Initialize(connection)) {
 #endif
diff --git a/third_party/crashpad/minidump/minidump.gyp b/third_party/crashpad/minidump/minidump.gyp
deleted file mode 100644
index 63e0ba6..0000000
--- a/third_party/crashpad/minidump/minidump.gyp
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_minidump',
-      'type': 'static_library',
-      'dependencies': [
-        '../compat/compat.gyp:crashpad_compat',
-        '../snapshot/snapshot.gyp:crashpad_snapshot',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'export_dependent_settings': [
-        '../compat/compat.gyp:crashpad_compat',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'minidump_annotation_writer.cc',
-        'minidump_annotation_writer.h',
-        'minidump_byte_array_writer.cc',
-        'minidump_byte_array_writer.h',
-        'minidump_context.h',
-        'minidump_context_writer.cc',
-        'minidump_context_writer.h',
-        'minidump_crashpad_info_writer.cc',
-        'minidump_crashpad_info_writer.h',
-        'minidump_exception_writer.cc',
-        'minidump_exception_writer.h',
-        'minidump_extensions.cc',
-        'minidump_extensions.h',
-        'minidump_file_writer.cc',
-        'minidump_file_writer.h',
-        'minidump_handle_writer.cc',
-        'minidump_handle_writer.h',
-        'minidump_memory_info_writer.cc',
-        'minidump_memory_info_writer.h',
-        'minidump_memory_writer.cc',
-        'minidump_memory_writer.h',
-        'minidump_misc_info_writer.cc',
-        'minidump_misc_info_writer.h',
-        'minidump_module_crashpad_info_writer.cc',
-        'minidump_module_crashpad_info_writer.h',
-        'minidump_module_writer.cc',
-        'minidump_module_writer.h',
-        'minidump_rva_list_writer.cc',
-        'minidump_rva_list_writer.h',
-        'minidump_simple_string_dictionary_writer.cc',
-        'minidump_simple_string_dictionary_writer.h',
-        'minidump_stream_writer.cc',
-        'minidump_stream_writer.h',
-        'minidump_string_writer.cc',
-        'minidump_string_writer.h',
-        'minidump_system_info_writer.cc',
-        'minidump_system_info_writer.h',
-        'minidump_thread_id_map.cc',
-        'minidump_thread_id_map.h',
-        'minidump_thread_writer.cc',
-        'minidump_thread_writer.h',
-        'minidump_unloaded_module_writer.cc',
-        'minidump_unloaded_module_writer.h',
-        'minidump_user_extension_stream_data_source.cc',
-        'minidump_user_extension_stream_data_source.h',
-        'minidump_user_stream_writer.cc',
-        'minidump_user_stream_writer.h',
-        'minidump_writable.cc',
-        'minidump_writable.h',
-        'minidump_writer_util.cc',
-        'minidump_writer_util.h',
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/minidump/minidump_test.gyp b/third_party/crashpad/minidump/minidump_test.gyp
deleted file mode 100644
index cfc0606..0000000
--- a/third_party/crashpad/minidump/minidump_test.gyp
+++ /dev/null
@@ -1,91 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_minidump_test_lib',
-      'type': 'static_library',
-      'dependencies': [
-        'minidump.gyp:crashpad_minidump',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'test/minidump_byte_array_writer_test_util.cc',
-        'test/minidump_byte_array_writer_test_util.h',
-        'test/minidump_context_test_util.cc',
-        'test/minidump_context_test_util.h',
-        'test/minidump_file_writer_test_util.cc',
-        'test/minidump_file_writer_test_util.h',
-        'test/minidump_memory_writer_test_util.cc',
-        'test/minidump_memory_writer_test_util.h',
-        'test/minidump_rva_list_test_util.cc',
-        'test/minidump_rva_list_test_util.h',
-        'test/minidump_string_writer_test_util.cc',
-        'test/minidump_string_writer_test_util.h',
-        'test/minidump_user_extension_stream_util.cc',
-        'test/minidump_user_extension_stream_util.h',
-        'test/minidump_writable_test_util.cc',
-        'test/minidump_writable_test_util.h',
-      ],
-    },
-    {
-      'target_name': 'crashpad_minidump_test',
-      'type': 'executable',
-      'dependencies': [
-        'crashpad_minidump_test_lib',
-        'minidump.gyp:crashpad_minidump',
-        '../snapshot/snapshot_test.gyp:crashpad_snapshot_test_lib',
-        '../test/test.gyp:crashpad_gtest_main',
-        '../test/test.gyp:crashpad_test',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'minidump_annotation_writer_test.cc',
-        'minidump_byte_array_writer_test.cc',
-        'minidump_context_writer_test.cc',
-        'minidump_crashpad_info_writer_test.cc',
-        'minidump_exception_writer_test.cc',
-        'minidump_file_writer_test.cc',
-        'minidump_handle_writer_test.cc',
-        'minidump_memory_info_writer_test.cc',
-        'minidump_memory_writer_test.cc',
-        'minidump_misc_info_writer_test.cc',
-        'minidump_module_crashpad_info_writer_test.cc',
-        'minidump_module_writer_test.cc',
-        'minidump_rva_list_writer_test.cc',
-        'minidump_simple_string_dictionary_writer_test.cc',
-        'minidump_string_writer_test.cc',
-        'minidump_system_info_writer_test.cc',
-        'minidump_thread_id_map_test.cc',
-        'minidump_thread_writer_test.cc',
-        'minidump_unloaded_module_writer_test.cc',
-        'minidump_user_stream_writer_test.cc',
-        'minidump_writable_test.cc',
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/snapshot/BUILD.gn b/third_party/crashpad/snapshot/BUILD.gn
index 9c46636..f47b3f2 100644
--- a/third_party/crashpad/snapshot/BUILD.gn
+++ b/third_party/crashpad/snapshot/BUILD.gn
@@ -437,7 +437,7 @@
     }
 
     if ((crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) &&
-        target_cpu != "mipsel" && target_cpu != "mips64el") {
+        target_cpu != "mipsel" && target_cpu != "mips64el" && !using_old_compiler) {
       data_deps += [ ":crashpad_snapshot_test_both_dt_hash_styles" ]
     }
 
@@ -494,7 +494,7 @@
 }
 
 if ((crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) &&
-    target_cpu != "mipsel" && target_cpu != "mips64el") {
+    target_cpu != "mipsel" && target_cpu != "mips64el" && !using_old_compiler) {
   crashpad_loadable_module("crashpad_snapshot_test_both_dt_hash_styles") {
     testonly = true
     sources = [ "hash_types_test.cc" ]
diff --git a/third_party/crashpad/snapshot/snapshot.gyp b/third_party/crashpad/snapshot/snapshot.gyp
deleted file mode 100644
index a4c57fc..0000000
--- a/third_party/crashpad/snapshot/snapshot.gyp
+++ /dev/null
@@ -1,218 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_snapshot',
-      'type': 'static_library',
-      'dependencies': [
-        '../client/client.gyp:crashpad_client',
-        '../compat/compat.gyp:crashpad_compat',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'annotation_snapshot.cc',
-        'annotation_snapshot.h',
-        'capture_memory.cc',
-        'capture_memory.h',
-        'cpu_architecture.h',
-        'cpu_context.cc',
-        'cpu_context.h',
-        'crashpad_info_client_options.cc',
-        'crashpad_info_client_options.h',
-        'crashpad_types/crashpad_info_reader.cc',
-        'crashpad_types/crashpad_info_reader.h',
-        'crashpad_types/image_annotation_reader.cc',
-        'crashpad_types/image_annotation_reader.h',
-        'elf/elf_dynamic_array_reader.cc',
-        'elf/elf_dynamic_array_reader.h',
-        'elf/elf_image_reader.cc',
-        'elf/elf_image_reader.h',
-        'elf/elf_symbol_table_reader.cc',
-        'elf/elf_symbol_table_reader.h',
-        'elf/module_snapshot_elf.cc',
-        'elf/module_snapshot_elf.h',
-        'exception_snapshot.h',
-        'handle_snapshot.cc',
-        'handle_snapshot.h',
-        'linux/cpu_context_linux.cc',
-        'linux/cpu_context_linux.h',
-        'linux/debug_rendezvous.cc',
-        'linux/debug_rendezvous.h',
-        'linux/exception_snapshot_linux.cc',
-        'linux/exception_snapshot_linux.h',
-        'linux/process_reader_linux.cc',
-        'linux/process_reader_linux.h',
-        'linux/process_snapshot_linux.cc',
-        'linux/process_snapshot_linux.h',
-        'linux/signal_context.h',
-        'linux/system_snapshot_linux.cc',
-        'linux/system_snapshot_linux.h',
-        'linux/thread_snapshot_linux.cc',
-        'linux/thread_snapshot_linux.h',
-        'mac/cpu_context_mac.cc',
-        'mac/cpu_context_mac.h',
-        'mac/exception_snapshot_mac.cc',
-        'mac/exception_snapshot_mac.h',
-        'mac/mach_o_image_annotations_reader.cc',
-        'mac/mach_o_image_annotations_reader.h',
-        'mac/mach_o_image_reader.cc',
-        'mac/mach_o_image_reader.h',
-        'mac/mach_o_image_segment_reader.cc',
-        'mac/mach_o_image_segment_reader.h',
-        'mac/mach_o_image_symbol_table_reader.cc',
-        'mac/mach_o_image_symbol_table_reader.h',
-        'mac/module_snapshot_mac.cc',
-        'mac/module_snapshot_mac.h',
-        'mac/process_reader_mac.cc',
-        'mac/process_reader_mac.h',
-        'mac/process_snapshot_mac.cc',
-        'mac/process_snapshot_mac.h',
-        'mac/process_types.cc',
-        'mac/process_types.h',
-        'mac/process_types/all.proctype',
-        'mac/process_types/annotation.proctype',
-        'mac/process_types/crashpad_info.proctype',
-        'mac/process_types/crashreporterclient.proctype',
-        'mac/process_types/custom.cc',
-        'mac/process_types/dyld_images.proctype',
-        'mac/process_types/flavors.h',
-        'mac/process_types/internal.h',
-        'mac/process_types/loader.proctype',
-        'mac/process_types/nlist.proctype',
-        'mac/process_types/traits.h',
-        'mac/system_snapshot_mac.cc',
-        'mac/system_snapshot_mac.h',
-        'mac/thread_snapshot_mac.cc',
-        'mac/thread_snapshot_mac.h',
-        'memory_snapshot.cc',
-        'memory_snapshot.h',
-        'memory_snapshot_generic.h',
-        'minidump/minidump_annotation_reader.cc',
-        'minidump/minidump_annotation_reader.h',
-        'minidump/minidump_context_converter.cc',
-        'minidump/minidump_context_converter.h',
-        'minidump/minidump_simple_string_dictionary_reader.cc',
-        'minidump/minidump_simple_string_dictionary_reader.h',
-        'minidump/minidump_stream.h',
-        'minidump/minidump_string_list_reader.cc',
-        'minidump/minidump_string_list_reader.h',
-        'minidump/minidump_string_reader.cc',
-        'minidump/minidump_string_reader.h',
-        'minidump/exception_snapshot_minidump.cc',
-        'minidump/exception_snapshot_minidump.h',
-        'minidump/memory_snapshot_minidump.cc',
-        'minidump/memory_snapshot_minidump.h',
-        'minidump/module_snapshot_minidump.cc',
-        'minidump/module_snapshot_minidump.h',
-        'minidump/process_snapshot_minidump.cc',
-        'minidump/process_snapshot_minidump.h',
-        'minidump/system_snapshot_minidump.cc',
-        'minidump/system_snapshot_minidump.h',
-        'minidump/thread_snapshot_minidump.cc',
-        'minidump/thread_snapshot_minidump.h',
-        'module_snapshot.h',
-        'module_snapshot_evergreen.h',
-        'module_snapshot_evergreen.cc',
-        'posix/timezone.cc',
-        'posix/timezone.h',
-        'process_snapshot.h',
-        'sanitized/memory_snapshot_sanitized.cc',
-        'sanitized/memory_snapshot_sanitized.h',
-        'sanitized/module_snapshot_sanitized.cc',
-        'sanitized/module_snapshot_sanitized.h',
-        'sanitized/process_snapshot_sanitized.cc',
-        'sanitized/process_snapshot_sanitized.h',
-        'sanitized/sanitization_information.cc',
-        'sanitized/sanitization_information.h',
-        'sanitized/thread_snapshot_sanitized.cc',
-        'sanitized/thread_snapshot_sanitized.h',
-        'snapshot_constants.h',
-        'system_snapshot.h',
-        'thread_snapshot.h',
-        'unloaded_module_snapshot.cc',
-        'unloaded_module_snapshot.h',
-        'win/cpu_context_win.cc',
-        'win/cpu_context_win.h',
-        'win/exception_snapshot_win.cc',
-        'win/exception_snapshot_win.h',
-        'win/capture_memory_delegate_win.cc',
-        'win/capture_memory_delegate_win.h',
-        'win/memory_map_region_snapshot_win.cc',
-        'win/memory_map_region_snapshot_win.h',
-        'win/module_snapshot_win.cc',
-        'win/module_snapshot_win.h',
-        'win/pe_image_annotations_reader.cc',
-        'win/pe_image_annotations_reader.h',
-        'win/pe_image_reader.cc',
-        'win/pe_image_reader.h',
-        'win/pe_image_resource_reader.cc',
-        'win/pe_image_resource_reader.h',
-        'win/process_reader_win.cc',
-        'win/process_reader_win.h',
-        'win/process_snapshot_win.cc',
-        'win/process_snapshot_win.h',
-        'win/process_subrange_reader.cc',
-        'win/process_subrange_reader.h',
-        'win/system_snapshot_win.cc',
-        'win/system_snapshot_win.h',
-        'win/thread_snapshot_win.cc',
-        'win/thread_snapshot_win.h',
-        'x86/cpuid_reader.cc',
-        'x86/cpuid_reader.h',
-      ],
-      'conditions': [
-        ['OS=="win"', {
-          'link_settings': {
-            'libraries': [
-              '-lpowrprof.lib',
-            ],
-          },
-        }],
-        ['target_os=="linux" or target_os=="android"', {
-          'sources!': [
-            'capture_memory.cc',
-            'capture_memory.h',
-          ],
-        }, {  # else: OS!="linux" and OS!="android"
-          'sources/': [
-            ['exclude', '^elf/'],
-            ['exclude', '^crashpad_types/'],
-            ['exclude', '^sanitized/'],
-          ],
-        }],
-        ['target_arch!="ia32" and target_arch!="x64"', {
-          'sources/': [
-            ['exclude', '^x86/'],
-          ],
-        }],
-      ],
-      'target_conditions': [
-        ['OS=="android"', {
-          'sources/': [
-            ['include', '^linux/'],
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/snapshot/snapshot_test.gyp b/third_party/crashpad/snapshot/snapshot_test.gyp
deleted file mode 100644
index cf7b8ae..0000000
--- a/third_party/crashpad/snapshot/snapshot_test.gyp
+++ /dev/null
@@ -1,347 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_snapshot_test_lib',
-      'type': 'static_library',
-      'dependencies': [
-        'snapshot.gyp:crashpad_snapshot',
-        '../compat/compat.gyp:crashpad_compat',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'test/test_cpu_context.cc',
-        'test/test_cpu_context.h',
-        'test/test_exception_snapshot.cc',
-        'test/test_exception_snapshot.h',
-        'test/test_memory_map_region_snapshot.cc',
-        'test/test_memory_map_region_snapshot.h',
-        'test/test_memory_snapshot.cc',
-        'test/test_memory_snapshot.h',
-        'test/test_module_snapshot.cc',
-        'test/test_module_snapshot.h',
-        'test/test_process_snapshot.cc',
-        'test/test_process_snapshot.h',
-        'test/test_system_snapshot.cc',
-        'test/test_system_snapshot.h',
-        'test/test_thread_snapshot.cc',
-        'test/test_thread_snapshot.h',
-      ],
-    },
-    {
-      'target_name': 'crashpad_snapshot_test',
-      'type': 'executable',
-      'dependencies': [
-        'crashpad_snapshot_test_lib',
-        'crashpad_snapshot_test_module',
-        'crashpad_snapshot_test_module_large',
-        'crashpad_snapshot_test_module_small',
-        'snapshot.gyp:crashpad_snapshot',
-        '../client/client.gyp:crashpad_client',
-        '../compat/compat.gyp:crashpad_compat',
-        '../test/test.gyp:crashpad_gtest_main',
-        '../test/test.gyp:crashpad_test',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'cpu_context_test.cc',
-        'memory_snapshot_test.cc',
-        'crashpad_info_client_options_test.cc',
-        'crashpad_types/crashpad_info_reader_test.cc',
-        'crashpad_types/image_annotation_reader_test.cc',
-        'elf/elf_image_reader_test.cc',
-        'elf/elf_image_reader_test_note.S',
-        'linux/debug_rendezvous_test.cc',
-        'linux/exception_snapshot_linux_test.cc',
-        'linux/process_reader_linux_test.cc',
-        'linux/system_snapshot_linux_test.cc',
-        'mac/cpu_context_mac_test.cc',
-        'mac/mach_o_image_annotations_reader_test.cc',
-        'mac/mach_o_image_reader_test.cc',
-        'mac/mach_o_image_segment_reader_test.cc',
-        'mac/process_reader_mac_test.cc',
-        'mac/process_types_test.cc',
-        'mac/system_snapshot_mac_test.cc',
-        'minidump/process_snapshot_minidump_test.cc',
-        'posix/timezone_test.cc',
-        'sanitized/process_snapshot_sanitized_test.cc',
-        'sanitized/sanitization_information_test.cc',
-        'win/cpu_context_win_test.cc',
-        'win/exception_snapshot_win_test.cc',
-        'win/extra_memory_ranges_test.cc',
-        'win/module_snapshot_win_test.cc',
-        'win/pe_image_reader_test.cc',
-        'win/process_reader_win_test.cc',
-        'win/process_snapshot_win_test.cc',
-        'win/system_snapshot_win_test.cc',
-      ],
-      'conditions': [
-        # .gnu.hash is incompatible with the MIPS ABI
-        ['target_arch!="mips"', {
-          'dependencies': ['crashpad_snapshot_test_both_dt_hash_styles']
-        }],
-        ['OS=="mac"', {
-          'dependencies': [
-            'crashpad_snapshot_test_module_crashy_initializer',
-            'crashpad_snapshot_test_no_op',
-          ],
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/OpenCL.framework',
-            ],
-          },
-        }],
-        ['OS=="win"', {
-          'dependencies': [
-            'crashpad_snapshot_test_annotations',
-            'crashpad_snapshot_test_crashing_child',
-            'crashpad_snapshot_test_dump_without_crashing',
-            'crashpad_snapshot_test_extra_memory_ranges',
-            'crashpad_snapshot_test_image_reader',
-            'crashpad_snapshot_test_image_reader_module',
-          ],
-        }],
-        ['OS=="linux" or OS=="android"', {
-          'sources!': [
-            'crashpad_info_client_options_test.cc',
-          ],
-          'copies': [{
-            'destination': '<(PRODUCT_DIR)',
-            'files': [
-              'elf/test_exported_symbols.sym',
-            ],
-          }],
-          'ldflags': [
-            '-Wl,--dynamic-list=test_exported_symbols.sym',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-ldl',
-            ],
-          },
-        }, {  # else: OS!="linux" and OS!="android"
-          'sources/': [
-            ['exclude', '^elf/'],
-            ['exclude', '^crashpad_types/'],
-            ['exclude', '^sanitized/'],
-          ],
-        }],
-      ],
-      'target_conditions': [
-        ['OS=="android"', {
-          'sources/': [
-            ['include', '^linux/'],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'crashpad_snapshot_test_module',
-      'type': 'loadable_module',
-      'dependencies': [
-        '../client/client.gyp:crashpad_client',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'crashpad_info_client_options_test_module.cc',
-      ],
-    },
-    {
-      'target_name': 'crashpad_snapshot_test_module_large',
-      'type': 'loadable_module',
-      'dependencies': [
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-      ],
-      'defines': [
-        'CRASHPAD_INFO_SIZE_TEST_MODULE_LARGE=1',
-      ],
-      'sources': [
-        'crashpad_info_size_test_module.cc',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'conditions': [
-        ['OS=="linux" or OS=="android"', {
-          'sources': [
-            'crashpad_info_size_test_note.S',
-          ],
-          'dependencies': [
-            '../util/util.gyp:crashpad_util',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'crashpad_snapshot_test_module_small',
-      'type': 'loadable_module',
-      'dependencies': [
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-      ],
-      'defines': [
-        'CRASHPAD_INFO_SIZE_TEST_MODULE_SMALL=1',
-      ],
-      'sources': [
-        'crashpad_info_size_test_module.cc',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'conditions': [
-        ['OS=="linux" or OS=="android"', {
-          'sources': [
-            'crashpad_info_size_test_note.S',
-          ],
-          'dependencies': [
-            '../util/util.gyp:crashpad_util',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'crashpad_snapshot_test_both_dt_hash_styles',
-      'type': 'executable',
-      'conditions': [
-        # .gnu.hash is incompatible with the MIPS ABI
-        ['target_arch!="mips"', {
-          'sources': [
-            'hash_types_test.cc',
-          ],
-          'ldflags': [
-            # This makes `ld` emit both .hash and .gnu.hash sections.
-            '-Wl,--hash-style=both',
-          ]},
-        ]
-      ],
-    },
-  ],
-  'conditions': [
-    ['OS=="mac"', {
-      'targets': [
-        {
-          'target_name': 'crashpad_snapshot_test_module_crashy_initializer',
-          'type': 'loadable_module',
-          'sources': [
-            'mac/mach_o_image_annotations_reader_test_module_crashy_initializer.cc',
-          ],
-        },
-        {
-          'target_name': 'crashpad_snapshot_test_no_op',
-          'type': 'executable',
-          'sources': [
-            'mac/mach_o_image_annotations_reader_test_no_op.cc',
-          ],
-        },
-      ],
-    }],
-    ['OS=="win"', {
-      'targets': [
-        {
-          'target_name': 'crashpad_snapshot_test_crashing_child',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../compat/compat.gyp:crashpad_compat',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'sources': [
-            'win/crashpad_snapshot_test_crashing_child.cc',
-          ],
-        },
-        {
-          'target_name': 'crashpad_snapshot_test_dump_without_crashing',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../compat/compat.gyp:crashpad_compat',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'sources': [
-            'win/crashpad_snapshot_test_dump_without_crashing.cc',
-          ],
-        },
-        {
-          'target_name': 'crashpad_snapshot_test_extra_memory_ranges',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../compat/compat.gyp:crashpad_compat',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-          ],
-          'sources': [
-            'win/crashpad_snapshot_test_extra_memory_ranges.cc',
-          ],
-        },
-        {
-          'target_name': 'crashpad_snapshot_test_image_reader',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../compat/compat.gyp:crashpad_compat',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'sources': [
-            'win/crashpad_snapshot_test_image_reader.cc',
-          ],
-        },
-        {
-          'target_name': 'crashpad_snapshot_test_image_reader_module',
-          'type': 'loadable_module',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-          ],
-          'sources': [
-            'win/crashpad_snapshot_test_image_reader_module.cc',
-          ],
-          'msvs_settings': {
-            'NoImportLibrary': 'true',
-          },
-        },
-        {
-          'target_name': 'crashpad_snapshot_test_annotations',
-          'type': 'executable',
-          'dependencies': [
-            '../client/client.gyp:crashpad_client',
-            '../compat/compat.gyp:crashpad_compat',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-          ],
-          'sources': [
-            'win/crashpad_snapshot_test_annotations.cc',
-          ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/third_party/crashpad/test/test.gyp b/third_party/crashpad/test/test.gyp
deleted file mode 100644
index d00256a..0000000
--- a/third_party/crashpad/test/test.gyp
+++ /dev/null
@@ -1,154 +0,0 @@
-# Copyright 2015 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_test',
-      'type': 'static_library',
-      'dependencies': [
-        '../compat/compat.gyp:crashpad_compat',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'errors.cc',
-        'errors.h',
-        'file.cc',
-        'file.h',
-        'filesystem.cc',
-        'filesystem.h',
-        'gtest_death.h',
-        'hex_string.cc',
-        'hex_string.h',
-        'linux/fake_ptrace_connection.cc',
-        'linux/fake_ptrace_connection.h',
-        'linux/get_tls.cc',
-        'linux/get_tls.h',
-        'mac/dyld.cc',
-        'mac/dyld.h',
-        'mac/exception_swallower.cc',
-        'mac/exception_swallower.h',
-        'mac/mach_errors.cc',
-        'mac/mach_errors.h',
-        'mac/mach_multiprocess.cc',
-        'mac/mach_multiprocess.h',
-        'main_arguments.cc',
-        'main_arguments.h',
-        'multiprocess.h',
-        'multiprocess_exec.cc',
-        'multiprocess_exec.h',
-        'multiprocess_exec_posix.cc',
-        'multiprocess_exec_win.cc',
-        'multiprocess_posix.cc',
-        'process_type.cc',
-        'process_type.h',
-        'scoped_guarded_page.h',
-        'scoped_guarded_page_posix.cc',
-        'scoped_module_handle.cc',
-        'scoped_module_handle.h',
-        'scoped_temp_dir.cc',
-        'scoped_temp_dir.h',
-        'scoped_temp_dir_posix.cc',
-        'scoped_temp_dir_win.cc',
-        'test_paths.cc',
-        'test_paths.h',
-        'win/child_launcher.cc',
-        'win/child_launcher.h',
-        'win/win_child_process.cc',
-        'win/win_child_process.h',
-        'win/win_multiprocess.cc',
-        'win/win_multiprocess.h',
-        'win/win_multiprocess_with_temp_dir.cc',
-        'win/win_multiprocess_with_temp_dir.h',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '..',
-        ],
-      },
-      'conditions': [
-        ['OS=="mac"', {
-          'dependencies': [
-            '../handler/handler.gyp:crashpad_handler_lib',
-            '../snapshot/snapshot.gyp:crashpad_snapshot',
-          ],
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/usr/lib/libbsm.dylib',
-            ],
-          },
-        }],
-        ['OS=="win"', {
-          'link_settings': {
-            'libraries': [
-              '-lshell32.lib',
-            ],
-          },
-        }],
-      ],
-      'target_conditions': [
-        ['OS=="android"', {
-          'sources/': [
-            ['include', '^linux/'],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'crashpad_gmock_main',
-      'type': 'static_library',
-      'dependencies': [
-        'crashpad_test',
-        '../third_party/gtest/gmock.gyp:gmock',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'defines': [
-        'CRASHPAD_TEST_LAUNCHER_GMOCK=1',
-      ],
-      'sources': [
-        'gtest_main.cc',
-      ],
-    },
-    {
-      'target_name': 'crashpad_gtest_main',
-      'type': 'static_library',
-      'dependencies': [
-        'crashpad_test',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'defines': [
-        'CRASHPAD_TEST_LAUNCHER_GTEST=1',
-      ],
-      'sources': [
-        'gtest_main.cc',
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/test/test_test.gyp b/third_party/crashpad/test/test_test.gyp
deleted file mode 100644
index ddd920e..0000000
--- a/third_party/crashpad/test/test_test.gyp
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2015 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_test_test',
-      'type': 'executable',
-      'dependencies': [
-        'crashpad_test_test_multiprocess_exec_test_child',
-        'test.gyp:crashpad_gmock_main',
-        'test.gyp:crashpad_test',
-        '../compat/compat.gyp:crashpad_compat',
-        '../third_party/gtest/gmock.gyp:gmock',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'hex_string_test.cc',
-        'mac/mach_multiprocess_test.cc',
-        'main_arguments_test.cc',
-        'multiprocess_exec_test.cc',
-        'multiprocess_posix_test.cc',
-        'scoped_guarded_page_test.cc',
-        'scoped_temp_dir_test.cc',
-        'test_paths_test.cc',
-        'win/win_child_process_test.cc',
-        'win/win_multiprocess_test.cc',
-      ],
-    },
-    {
-      'target_name': 'crashpad_test_test_multiprocess_exec_test_child',
-      'type': 'executable',
-      'dependencies': [
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-      ],
-      'sources': [
-        'multiprocess_exec_test_child.cc',
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/third_party/getopt/getopt.gyp b/third_party/crashpad/third_party/getopt/getopt.gyp
deleted file mode 100644
index 5644584..0000000
--- a/third_party/crashpad/third_party/getopt/getopt.gyp
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2015 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../../build/crashpad.gypi',
-  ],
-  'conditions': [
-    ['OS=="win"', {
-      'targets': [
-        {
-          'target_name': 'getopt',
-          'type': 'static_library',
-          'sources': [
-            'getopt.cc',
-            'getopt.h',
-          ],
-        },
-      ],
-    }, {
-      'targets': []
-    }]
-  ],
-}
diff --git a/third_party/crashpad/third_party/gtest/gmock.gyp b/third_party/crashpad/third_party/gtest/gmock.gyp
deleted file mode 100644
index 499792f..0000000
--- a/third_party/crashpad/third_party/gtest/gmock.gyp
+++ /dev/null
@@ -1,227 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../../build/crashpad_dependencies.gypi',
-  ],
-  'conditions': [
-    ['1==1', {  # Defer processing until crashpad_dependencies is set
-      'variables': {
-        'conditions': [
-          ['crashpad_dependencies=="standalone"', {
-            'gmock_dir': 'gtest/googlemock',
-          }],
-          ['crashpad_dependencies=="external"', {
-            'gmock_dir': '../../../../gmock',
-          }],
-        ],
-      },
-    }],
-  ],
-  'target_defaults': {
-    # gmock relies heavily on objects with static storage duration.
-    'xcode_settings': {
-      'WARNING_CFLAGS!': [
-        '-Wexit-time-destructors',
-      ],
-    },
-    'cflags!': [
-      '-Wexit-time-destructors',
-    ],
-  },
-
-  'targets': [
-    {
-      'target_name': 'gmock',
-      'type': 'static_library',
-      'dependencies': [
-        'gtest.gyp:gtest',
-      ],
-      'include_dirs': [
-        '<(gmock_dir)',
-        '<(gmock_dir)/include',
-      ],
-      'sources': [
-        '<(gmock_dir)/include/gmock/gmock-actions.h',
-        '<(gmock_dir)/include/gmock/gmock-cardinalities.h',
-        '<(gmock_dir)/include/gmock/gmock-function-mocker.h',
-        '<(gmock_dir)/include/gmock/gmock-generated-actions.h',
-        '<(gmock_dir)/include/gmock/gmock-generated-function-mockers.h',
-        '<(gmock_dir)/include/gmock/gmock-generated-matchers.h',
-        '<(gmock_dir)/include/gmock/gmock-matchers.h',
-        '<(gmock_dir)/include/gmock/gmock-more-actions.h',
-        '<(gmock_dir)/include/gmock/gmock-more-matchers.h',
-        '<(gmock_dir)/include/gmock/gmock-nice-strict.h',
-        '<(gmock_dir)/include/gmock/gmock-spec-builders.h',
-        '<(gmock_dir)/include/gmock/gmock.h',
-        '<(gmock_dir)/include/gmock/internal/custom/gmock-generated-actions.h',
-        '<(gmock_dir)/include/gmock/internal/custom/gmock-matchers.h',
-        '<(gmock_dir)/include/gmock/internal/custom/gmock-port.h',
-        '<(gmock_dir)/include/gmock/internal/custom/gmock-pp.h',
-        '<(gmock_dir)/include/gmock/internal/gmock-generated-internal-utils.h',
-        '<(gmock_dir)/include/gmock/internal/gmock-internal-utils.h',
-        '<(gmock_dir)/include/gmock/internal/gmock-port.h',
-        '<(gmock_dir)/src/gmock-all.cc',
-        '<(gmock_dir)/src/gmock-cardinalities.cc',
-        '<(gmock_dir)/src/gmock-internal-utils.cc',
-        '<(gmock_dir)/src/gmock-matchers.cc',
-        '<(gmock_dir)/src/gmock-spec-builders.cc',
-        '<(gmock_dir)/src/gmock.cc',
-      ],
-      'sources!': [
-        '<(gmock_dir)/src/gmock-all.cc',
-      ],
-
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(gmock_dir)/include',
-        ],
-        'conditions': [
-          ['clang!=0', {
-            # The MOCK_METHODn() macros do not specify “override”, which
-            # triggers this warning in users: “error: 'Method' overrides a
-            # member function but is not marked 'override'
-            # [-Werror,-Winconsistent-missing-override]”. Suppress these
-            # warnings until https://github.com/google/googletest/issues/533 is
-            # fixed.
-            'conditions': [
-              ['OS=="mac"', {
-                'xcode_settings': {
-                  'WARNING_CFLAGS': [
-                    '-Wno-inconsistent-missing-override',
-                  ],
-                },
-              }],
-              ['OS=="linux" or OS=="android"', {
-                'cflags': [
-                  '-Wno-inconsistent-missing-override',
-                ],
-              }],
-            ],
-          }],
-        ],
-      },
-      'export_dependent_settings': [
-        'gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'gmock_main',
-      'type': 'static_library',
-      'dependencies': [
-        'gmock',
-        'gtest.gyp:gtest',
-      ],
-      'sources': [
-        '<(gmock_dir)/src/gmock_main.cc',
-      ],
-    },
-    {
-      'target_name': 'gmock_test_executable',
-      'type': 'none',
-      'dependencies': [
-        'gmock',
-        'gtest.gyp:gtest',
-      ],
-      'direct_dependent_settings': {
-        'type': 'executable',
-        'include_dirs': [
-          '<(gmock_dir)',
-        ],
-      },
-      'export_dependent_settings': [
-        'gmock',
-        'gtest.gyp:gtest',
-      ],
-    },
-    {
-      'target_name': 'gmock_all_test',
-      'dependencies': [
-        'gmock_test_executable',
-        'gmock_main',
-      ],
-      'include_dirs': [
-        'gtest/googletest',
-      ],
-      'sources': [
-        '<(gmock_dir)/test/gmock-actions_test.cc',
-        '<(gmock_dir)/test/gmock-cardinalities_test.cc',
-        '<(gmock_dir)/test/gmock-function-mocker_test.cc',
-        '<(gmock_dir)/test/gmock-generated-actions_test.cc',
-        '<(gmock_dir)/test/gmock-generated-function-mockers_test.cc',
-        '<(gmock_dir)/test/gmock-generated-matchers_test.cc',
-        '<(gmock_dir)/test/gmock-internal-utils_test.cc',
-        '<(gmock_dir)/test/gmock-matchers_test.cc',
-        '<(gmock_dir)/test/gmock-more-actions_test.cc',
-        '<(gmock_dir)/test/gmock-nice-strict_test.cc',
-        '<(gmock_dir)/test/gmock-port_test.cc',
-        '<(gmock_dir)/test/gmock-pp-string_test.cc',
-        '<(gmock_dir)/test/gmock-pp_test.cc',
-        '<(gmock_dir)/test/gmock-spec-builders_test.cc',
-        '<(gmock_dir)/test/gmock_test.cc',
-      ],
-      'conditions': [
-         ['clang!=0', {
-          # For gtest/googlemock/test/gmock-matchers_test.cc’s
-          # Unstreamable::value_.
-          'conditions': [
-            ['OS=="mac"', {
-              'xcode_settings': {
-                'WARNING_CFLAGS': [
-                  '-Wno-unused-private-field',
-                ],
-              },
-            }],
-            ['OS=="linux" or OS=="android"', {
-              'cflags': [
-                '-Wno-unused-private-field',
-              ],
-            }],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'gmock_link_test',
-      'dependencies': [
-        'gmock_test_executable',
-        'gmock_main',
-      ],
-      'sources': [
-        '<(gmock_dir)/test/gmock_link_test.cc',
-        '<(gmock_dir)/test/gmock_link_test.h',
-        '<(gmock_dir)/test/gmock_link2_test.cc',
-      ],
-    },
-    {
-      'target_name': 'gmock_stress_test',
-      'dependencies': [
-        'gmock_test_executable',
-      ],
-      'sources': [
-        '<(gmock_dir)/test/gmock_stress_test.cc',
-      ],
-    },
-    {
-      'target_name': 'gmock_all_tests',
-      'type': 'none',
-      'dependencies': [
-        'gmock_all_test',
-        'gmock_link_test',
-        'gmock_stress_test',
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/third_party/gtest/gtest.gyp b/third_party/crashpad/third_party/gtest/gtest.gyp
deleted file mode 100644
index aa6399b..0000000
--- a/third_party/crashpad/third_party/gtest/gtest.gyp
+++ /dev/null
@@ -1,304 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../../build/crashpad_dependencies.gypi',
-  ],
-  'conditions': [
-    ['1==1', {  # Defer processing until crashpad_dependencies is set
-      'variables': {
-        'conditions': [
-          ['crashpad_dependencies=="standalone"', {
-            'gtest_dir': 'gtest/googletest',
-          }],
-          ['crashpad_dependencies=="external"', {
-            'gtest_dir': '../../../../gtest',
-          }],
-        ],
-      },
-    }],
-  ],
-  'target_defaults': {
-    # gtest relies heavily on objects with static storage duration.
-    'xcode_settings': {
-      'WARNING_CFLAGS!': [
-        '-Wexit-time-destructors',
-      ],
-    },
-    'cflags!': [
-      '-Wexit-time-destructors',
-    ],
-
-    'conditions': [
-      ['OS=="android" and android_api_level!="" and android_api_level<24', {
-        'defines!': [
-          # Although many system interfaces are available to 32-bit code with
-          # 64-bit off_t at API 21, the routines in <stdio.h> are not until API
-          # 24. gtest doesn’t make use of these functions directly, but can
-          # reach them indirectly via the C++ standard library. Disable 64-bit
-          # off_t prior to API 24 so that these uses can work. Since nothing
-          # dependent on the size of off_t should escape gtest’s own API, this
-          # should be safe even in a program that otherwise uses a 64-bit off_t.
-          '_FILE_OFFSET_BITS=64',
-        ],
-      }],
-    ],
-  },
-
-  'targets': [
-    {
-      'target_name': 'gtest',
-      'type': 'static_library',
-      'include_dirs': [
-        '<(gtest_dir)',
-        '<(gtest_dir)/include',
-      ],
-      'sources': [
-        '<(gtest_dir)/include/gtest/gtest-death-test.h',
-        '<(gtest_dir)/include/gtest/gtest-matchers.h',
-        '<(gtest_dir)/include/gtest/gtest-message.h',
-        '<(gtest_dir)/include/gtest/gtest-param-test.h',
-        '<(gtest_dir)/include/gtest/gtest-printers.h',
-        '<(gtest_dir)/include/gtest/gtest-spi.h',
-        '<(gtest_dir)/include/gtest/gtest-test-part.h',
-        '<(gtest_dir)/include/gtest/gtest-typed-test.h',
-        '<(gtest_dir)/include/gtest/gtest.h',
-        '<(gtest_dir)/include/gtest/gtest_pred_impl.h',
-        '<(gtest_dir)/include/gtest/gtest_prod.h',
-        '<(gtest_dir)/include/gtest/internal/custom/gtest-port.h',
-        '<(gtest_dir)/include/gtest/internal/custom/gtest-printers.h',
-        '<(gtest_dir)/include/gtest/internal/custom/gtest.h',
-        '<(gtest_dir)/include/gtest/internal/gtest-death-test-internal.h',
-        '<(gtest_dir)/include/gtest/internal/gtest-filepath.h',
-        '<(gtest_dir)/include/gtest/internal/gtest-internal.h',
-        '<(gtest_dir)/include/gtest/internal/gtest-param-util-generated.h',
-        '<(gtest_dir)/include/gtest/internal/gtest-param-util.h',
-        '<(gtest_dir)/include/gtest/internal/gtest-port-arch.h',
-        '<(gtest_dir)/include/gtest/internal/gtest-port.h',
-        '<(gtest_dir)/include/gtest/internal/gtest-string.h',
-        '<(gtest_dir)/include/gtest/internal/gtest-type-util.h',
-        '<(gtest_dir)/src/gtest-all.cc',
-        '<(gtest_dir)/src/gtest-death-test.cc',
-        '<(gtest_dir)/src/gtest-filepath.cc',
-        '<(gtest_dir)/src/gtest-internal-inl.h',
-        '<(gtest_dir)/src/gtest-matchers.cc',
-        '<(gtest_dir)/src/gtest-port.cc',
-        '<(gtest_dir)/src/gtest-printers.cc',
-        '<(gtest_dir)/src/gtest-test-part.cc',
-        '<(gtest_dir)/src/gtest-typed-test.cc',
-        '<(gtest_dir)/src/gtest.cc',
-      ],
-      'sources!': [
-        '<(gtest_dir)/src/gtest-all.cc',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(gtest_dir)/include',
-        ],
-      },
-      'conditions': [
-        ['crashpad_dependencies=="external"', {
-          'include_dirs': [
-            '<(gtest_dir)/../..',
-          ],
-          'defines': [
-            'GUNIT_NO_GOOGLE3=1',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              '<(gtest_dir)/../..',
-            ],
-            'defines': [
-              'GUNIT_NO_GOOGLE3=1',
-            ],
-          },
-        }],
-      ],
-    },
-    {
-      'target_name': 'gtest_main',
-      'type': 'static_library',
-      'dependencies': [
-        'gtest',
-      ],
-      'sources': [
-        '<(gtest_dir)/src/gtest_main.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_test_executable',
-      'type': 'none',
-      'dependencies': [
-        'gtest',
-      ],
-      'direct_dependent_settings': {
-        'type': 'executable',
-        'include_dirs': [
-          '<(gtest_dir)',
-        ],
-      },
-      'export_dependent_settings': [
-        'gtest',
-      ],
-    },
-    {
-      'target_name': 'gtest_all_test',
-      'dependencies': [
-        'gtest_test_executable',
-        'gtest_main',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest-death-test_test.cc',
-        '<(gtest_dir)/test/gtest-filepath_test.cc',
-        '<(gtest_dir)/test/gtest-linked_ptr_test.cc',
-        '<(gtest_dir)/test/gtest-message_test.cc',
-        '<(gtest_dir)/test/gtest-options_test.cc',
-        '<(gtest_dir)/test/gtest-port_test.cc',
-        '<(gtest_dir)/test/gtest-printers_test.cc',
-        '<(gtest_dir)/test/gtest-test-part_test.cc',
-        '<(gtest_dir)/test/gtest-typed-test2_test.cc',
-        '<(gtest_dir)/test/gtest-typed-test_test.cc',
-        '<(gtest_dir)/test/gtest-typed-test_test.h',
-        '<(gtest_dir)/test/gtest_main_unittest.cc',
-        '<(gtest_dir)/test/gtest_pred_impl_unittest.cc',
-        '<(gtest_dir)/test/gtest_prod_test.cc',
-        '<(gtest_dir)/test/gtest_skip_test.cc',
-        '<(gtest_dir)/test/gtest_unittest.cc',
-        '<(gtest_dir)/test/production.cc',
-        '<(gtest_dir)/test/production.h',
-      ],
-    },
-    {
-      'target_name': 'gtest_environment_test',
-      'dependencies': [
-        'gtest_test_executable',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest_environment_test.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_listener_test',
-      'dependencies': [
-        'gtest_test_executable',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest-listener_test.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_no_test',
-      'dependencies': [
-        'gtest_test_executable',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest_no_test_unittest.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_param_test',
-      'dependencies': [
-        'gtest_test_executable',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest-param-test2_test.cc',
-        '<(gtest_dir)/test/gtest-param-test_test.cc',
-        '<(gtest_dir)/test/gtest-param-test_test.h',
-      ],
-      'conditions': [
-         ['clang!=0', {
-          # For gtest/googlemock/test/gmock-matchers_test.cc’s
-          # Unstreamable::value_.
-          'conditions': [
-            ['OS=="mac"', {
-              'xcode_settings': {
-                'WARNING_CFLAGS': [
-                  '-Wno-unused-private-field',
-                ],
-              },
-            }],
-            ['OS=="linux" or OS=="android"', {
-              'cflags': [
-                '-Wno-unused-private-field',
-              ],
-            }],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'gtest_premature_exit_test',
-      'dependencies': [
-        'gtest_test_executable',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest_premature_exit_test.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_repeat_test',
-      'dependencies': [
-        'gtest_test_executable',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest_repeat_test.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_sole_header_test',
-      'dependencies': [
-        'gtest_test_executable',
-        'gtest_main',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest_sole_header_test.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_stress_test',
-      'dependencies': [
-        'gtest_test_executable',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest_stress_test.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_unittest_api_test',
-      'dependencies': [
-        'gtest_test_executable',
-      ],
-      'sources': [
-        '<(gtest_dir)/test/gtest-unittest-api_test.cc',
-      ],
-    },
-    {
-      'target_name': 'gtest_all_tests',
-      'type': 'none',
-      'dependencies': [
-        'gtest_all_test',
-        'gtest_environment_test',
-        'gtest_listener_test',
-        'gtest_no_test',
-        'gtest_param_test',
-        'gtest_premature_exit_test',
-        'gtest_repeat_test',
-        'gtest_sole_header_test',
-        'gtest_stress_test',
-        'gtest_unittest_api_test',
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/third_party/lss/lss.gyp b/third_party/crashpad/third_party/lss/lss.gyp
deleted file mode 100644
index 63b9b3a..0000000
--- a/third_party/crashpad/third_party/lss/lss.gyp
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2019 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'lss',
-      'type': 'none',
-      'sources': [ 'lss.h' ],
-      'direct_dependent_settings': {
-        # gyp is only used in circumstances when the embedded lss is used.
-        'defines': [ 'CRASHPAD_LSS_SOURCE_EMBEDDED' ]
-      },
-    }
-  ]
-}
diff --git a/third_party/crashpad/third_party/mini_chromium/mini_chromium.gyp b/third_party/crashpad/third_party/mini_chromium/mini_chromium.gyp
deleted file mode 100644
index e4e9357..0000000
--- a/third_party/crashpad/third_party/mini_chromium/mini_chromium.gyp
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2015 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../../build/crashpad_dependencies.gypi',
-  ],
-  'targets': [
-    {
-      # To support Crashpad’s standalone build and its build depending on
-      # external libraries, Crashpad code depending on base should do so through
-      # this shim, which will either get base from mini_chromium or an external
-      # library depending on the build type.
-      'target_name': 'base',
-      'type': 'none',
-      'conditions': [
-        ['crashpad_dependencies=="standalone"', {
-          'dependencies': [
-            'mini_chromium/base/base.gyp:base',
-          ],
-          'export_dependent_settings': [
-            'mini_chromium/base/base.gyp:base',
-          ],
-        }],
-        ['crashpad_dependencies=="external"', {
-          'dependencies': [
-            '<(DEPTH)/third_party/mini_chromium/base/base.gyp:base',
-          ],
-          'export_dependent_settings': [
-            '<(DEPTH)/third_party/mini_chromium/base/base.gyp:base',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/third_party/zlib/zlib.gyp b/third_party/crashpad/third_party/zlib/zlib.gyp
deleted file mode 100644
index 09c68b0..0000000
--- a/third_party/crashpad/third_party/zlib/zlib.gyp
+++ /dev/null
@@ -1,172 +0,0 @@
-# Copyright 2017 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../../build/crashpad_dependencies.gypi',
-  ],
-  'conditions': [
-    ['1==1', {  # Defer processing until crashpad_dependencies is set
-      'variables': {
-        'conditions': [
-          ['crashpad_dependencies=="external"', {
-            'zlib_source%': 'external',
-          }, {
-            'conditions': [
-              ['OS!="win"', {
-                # Use the system zlib by default where available, as it is on most
-                # platforms. Windows does not have a system zlib, so use “embedded”
-                # which directs the build to use the source code in the zlib
-                # subdirectory.
-                'zlib_source%': 'system',
-              }, {
-                'zlib_source%': 'embedded',
-              }],
-            ],
-          }],
-        ],
-      },
-    }],
-  ],
-  'targets': [
-    {
-      'target_name': 'zlib',
-      'conditions': [
-        ['zlib_source=="system"', {
-          'type': 'none',
-          'direct_dependent_settings': {
-            'defines': [
-              'CRASHPAD_ZLIB_SOURCE_SYSTEM',
-            ],
-          },
-          'link_settings': {
-            'conditions': [
-              ['OS=="mac"', {
-                'libraries': [
-                  '$(SDKROOT)/usr/lib/libz.dylib',
-                ],
-              }, {
-                'libraries': [
-                  '-lz',
-                ],
-              }],
-            ],
-          },
-        }],
-        ['zlib_source=="embedded"', {
-          'type': 'static_library',
-          'include_dirs': [
-              'zlib',
-          ],
-          'defines': [
-            'CRASHPAD_ZLIB_SOURCE_EMBEDDED',
-            'HAVE_STDARG_H',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'zlib',
-            ],
-            'defines': [
-              'CRASHPAD_ZLIB_SOURCE_EMBEDDED',
-            ],
-          },
-          'sources': [
-            'zlib/adler32.c',
-            'zlib/compress.c',
-            'zlib/crc32.c',
-            'zlib/crc32.h',
-            'zlib/crc_folding.c',
-            'zlib/deflate.c',
-            'zlib/deflate.h',
-            'zlib/fill_window_sse.c',
-            'zlib/gzclose.c',
-            'zlib/gzguts.h',
-            'zlib/gzlib.c',
-            'zlib/gzread.c',
-            'zlib/gzwrite.c',
-            'zlib/infback.c',
-            'zlib/inffast.c',
-            'zlib/inffast.h',
-            'zlib/inffixed.h',
-            'zlib/inflate.c',
-            'zlib/inflate.h',
-            'zlib/inftrees.c',
-            'zlib/inftrees.h',
-            'zlib/names.h',
-            'zlib/simd_stub.c',
-            'zlib/trees.c',
-            'zlib/trees.h',
-            'zlib/uncompr.c',
-            'zlib/x86.c',
-            'zlib/x86.h',
-            'zlib/zconf.h',
-            'zlib/zlib.h',
-            'zlib/zutil.c',
-            'zlib/zutil.h',
-            'zlib_crashpad.h',
-          ],
-          'conditions': [
-            ['target_arch=="ia32" or target_arch=="x64"', {
-              'sources!': [
-                'zlib/simd_stub.c',
-              ],
-              'cflags': [
-                '-msse4.2',
-                '-mpclmul',
-              ],
-              'xcode_settings': {
-                'OTHER_CFLAGS': [
-                  '-msse4.2',
-                  '-mpclmul',
-                ],
-              },
-            }, {
-              'sources!': [
-                'zlib/crc_folding.c',
-                'zlib/fill_window_sse.c',
-                'zlib/x86.c',
-                'zlib/x86.h',
-              ],
-            }],
-            ['OS!="win"', {
-              'defines': [
-                'HAVE_HIDDEN',
-                'HAVE_UNISTD_H',
-              ],
-            }, {
-              'msvs_disabled_warnings': [
-                4131,  # uses old-style declarator
-                4244,  # conversion from 't1' to 't2', possible loss of data
-                4245,  # conversion from 't1' to 't2', signed/unsigned mismatch
-                4267,  # conversion from 'size_t' to 't', possible loss of data
-                4324,  # structure was padded due to alignment specifier
-              ],
-            }],
-          ],
-        }],
-        ['zlib_source=="external"', {
-          'type': 'none',
-          'direct_dependent_settings': {
-            'defines': [
-              'CRASHPAD_ZLIB_SOURCE_EXTERNAL',
-            ],
-          },
-          'dependencies': [
-            '<(DEPTH)/third_party/zlib/zlib.gyp:zlib',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/tools/tools.gyp b/third_party/crashpad/tools/tools.gyp
deleted file mode 100644
index d2ab29a..0000000
--- a/third_party/crashpad/tools/tools.gyp
+++ /dev/null
@@ -1,209 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_tool_support',
-      'type': 'static_library',
-      'dependencies': [
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'tool_support.cc',
-        'tool_support.h',
-      ],
-    },
-    {
-      'target_name': 'crashpad_database_util',
-      'type': 'executable',
-      'dependencies': [
-        'crashpad_tool_support',
-        '../client/client.gyp:crashpad_client',
-        '../compat/compat.gyp:crashpad_compat',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'crashpad_database_util.cc',
-      ],
-    },
-    {
-      'target_name': 'crashpad_http_upload',
-      'type': 'executable',
-      'dependencies': [
-        'crashpad_tool_support',
-        '../compat/compat.gyp:crashpad_compat',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'crashpad_http_upload.cc',
-      ],
-    },
-    {
-      'target_name': 'generate_dump',
-      'type': 'executable',
-      'dependencies': [
-        'crashpad_tool_support',
-        '../compat/compat.gyp:crashpad_compat',
-        '../minidump/minidump.gyp:crashpad_minidump',
-        '../snapshot/snapshot.gyp:crashpad_snapshot',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../util/util.gyp:crashpad_util',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'generate_dump.cc',
-      ],
-      'conditions': [
-        ['OS=="mac"', {
-          'xcode_settings': {
-            'OTHER_LDFLAGS': [
-              '-sectcreate',
-              '__TEXT',
-              '__info_plist',
-              '<(sectaskaccess_info_plist)'
-            ],
-          },
-        }],
-      ],
-    },
-  ],
-  'conditions': [
-    ['OS=="mac"', {
-      'variables': {
-        # Programs that use task_for_pid() can indicate to taskgated(8) in their
-        # Info.plist that they are allowed to call that function. In order for
-        # this to work, the programs in question must be signed by an authority
-        # trusted by the system. Signing is beyond the scope of the build, but
-        # the key to make this work is placed in Info.plist to enable the
-        # desired behavior once the tools that require this access are signed.
-        #
-        # The tools built here are flat-file executables, and are not bundled.
-        # To have an Info.plist, they must have a special __TEXT,__info_plist
-        # section. This section is created at link time.
-        #
-        # The Info.plist for this purpose is mac/sectaskaccess_info.plist and is
-        # referenced by OTHER_LDFLAGS. ninja runs the link step from the output
-        # directory such as out/Release, and requires a relative path from that
-        # directory. Xcode runs the link step from the directory of the
-        # .xcodeproj, which is the directory of the .gyp file.
-        'conditions': [
-          ['GENERATOR=="ninja"', {
-            'sectaskaccess_info_plist': '<!(pwd)/mac/sectaskaccess_info.plist',
-          }, {  # else: GENERATOR!="ninja"
-            'sectaskaccess_info_plist': 'mac/sectaskaccess_info.plist',
-          }],
-        ],
-      },
-
-      'targets': [
-        {
-          'target_name': 'catch_exception_tool',
-          'type': 'executable',
-          'dependencies': [
-            'crashpad_tool_support',
-            '../compat/compat.gyp:crashpad_compat',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'include_dirs': [
-            '..',
-          ],
-          'sources': [
-            'mac/catch_exception_tool.cc',
-          ],
-        },
-        {
-          'target_name': 'exception_port_tool',
-          'type': 'executable',
-          'dependencies': [
-            'crashpad_tool_support',
-            '../compat/compat.gyp:crashpad_compat',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'include_dirs': [
-            '..',
-          ],
-          'sources': [
-            'mac/exception_port_tool.cc',
-          ],
-          'xcode_settings': {
-            'OTHER_LDFLAGS': [
-              '-sectcreate',
-              '__TEXT',
-              '__info_plist',
-              '<(sectaskaccess_info_plist)'
-            ],
-          },
-        },
-        {
-          'target_name': 'on_demand_service_tool',
-          'type': 'executable',
-          'dependencies': [
-            'crashpad_tool_support',
-            '../compat/compat.gyp:crashpad_compat',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'include_dirs': [
-            '..',
-          ],
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/CoreFoundation.framework',
-              '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
-            ],
-          },
-          'sources': [
-            'mac/on_demand_service_tool.mm',
-          ],
-        },
-        {
-          'target_name': 'run_with_crashpad',
-          'type': 'executable',
-          'dependencies': [
-            'crashpad_tool_support',
-            '../client/client.gyp:crashpad_client',
-            '../compat/compat.gyp:crashpad_compat',
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'include_dirs': [
-            '..',
-          ],
-          'sources': [
-            'run_with_crashpad.cc',
-          ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/third_party/crashpad/util/util.gyp b/third_party/crashpad/util/util.gyp
deleted file mode 100644
index ce4d32f..0000000
--- a/third_party/crashpad/util/util.gyp
+++ /dev/null
@@ -1,450 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_util',
-      'type': 'static_library',
-      'dependencies': [
-        '../compat/compat.gyp:crashpad_compat',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../third_party/lss/lss.gyp:lss',
-      ],
-      'defines': [
-        'ZLIB_CONST',
-        'CRASHPAD_USE_BORINGSSL',
-      ],
-      'include_dirs': [
-        '..',
-        '<(INTERMEDIATE_DIR)',
-      ],
-      'sources': [
-        'file/delimited_file_reader.cc',
-        'file/delimited_file_reader.h',
-        'file/directory_reader.h',
-        'file/directory_reader_posix.cc',
-        'file/directory_reader_win.cc',
-        'file/file_io.cc',
-        'file/file_io.h',
-        'file/file_io_posix.cc',
-        'file/file_io_win.cc',
-        'file/file_reader.cc',
-        'file/file_reader.h',
-        'file/file_seeker.cc',
-        'file/file_seeker.h',
-        'file/filesystem.h',
-        'file/filesystem_posix.cc',
-        'file/filesystem_win.cc',
-        'file/file_writer.cc',
-        'file/file_writer.h',
-        'file/output_stream_file_writer.cc',
-        'file/output_stream_file_writer.h',
-        'file/scoped_remove_file.cc',
-        'file/scoped_remove_file.h',
-        'file/string_file.cc',
-        'file/string_file.h',
-        'linux/address_types.h',
-        'linux/auxiliary_vector.cc',
-        'linux/auxiliary_vector.h',
-        'linux/checked_address_range.h',
-        'linux/direct_ptrace_connection.cc',
-        'linux/direct_ptrace_connection.h',
-        'linux/exception_handler_client.cc',
-        'linux/exception_handler_client.h',
-        'linux/exception_handler_protocol.cc',
-        'linux/exception_handler_protocol.h',
-        'linux/exception_information.h',
-        'linux/memory_map.cc',
-        'linux/memory_map.h',
-        'linux/proc_stat_reader.cc',
-        'linux/proc_stat_reader.h',
-        'linux/proc_task_reader.cc',
-        'linux/proc_task_reader.h',
-        'linux/ptrace_broker.cc',
-        'linux/ptrace_broker.h',
-        'linux/ptrace_client.cc',
-        'linux/ptrace_client.h'
-        'linux/ptrace_connection.h',
-        'linux/ptracer.cc',
-        'linux/ptracer.h',
-        'linux/scoped_pr_set_dumpable.cc',
-        'linux/scoped_pr_set_dumpable.h',
-        'linux/scoped_pr_set_ptracer.cc',
-        'linux/scoped_pr_set_ptracer.h',
-        'linux/scoped_ptrace_attach.cc',
-        'linux/scoped_ptrace_attach.h',
-        'linux/socket.cc',
-        'linux/socket.h',
-        'linux/thread_info.cc',
-        'linux/thread_info.h',
-        'linux/traits.h',
-        'mac/checked_mach_address_range.h',
-        'mac/launchd.h',
-        'mac/launchd.mm',
-        'mac/mac_util.cc',
-        'mac/mac_util.h',
-        'mac/service_management.cc',
-        'mac/service_management.h',
-        'mac/xattr.cc',
-        'mac/xattr.h',
-        'mach/child_port.defs',
-        'mach/child_port_handshake.cc',
-        'mach/child_port_handshake.h',
-        'mach/child_port_server.cc',
-        'mach/child_port_server.h',
-        'mach/child_port_types.h',
-        'mach/composite_mach_message_server.cc',
-        'mach/composite_mach_message_server.h',
-        'mach/exc_client_variants.cc',
-        'mach/exc_client_variants.h',
-        'mach/exc_server_variants.cc',
-        'mach/exc_server_variants.h',
-        'mach/exception_behaviors.cc',
-        'mach/exception_behaviors.h',
-        'mach/exception_ports.cc',
-        'mach/exception_ports.h',
-        'mach/exception_types.cc',
-        'mach/exception_types.h',
-        'mach/mach_extensions.cc',
-        'mach/mach_extensions.h',
-        'mach/mach_message.cc',
-        'mach/mach_message.h',
-        'mach/mach_message_server.cc',
-        'mach/mach_message_server.h',
-        'mach/notify_server.cc',
-        'mach/notify_server.h',
-        'mach/scoped_task_suspend.cc',
-        'mach/scoped_task_suspend.h',
-        'mach/symbolic_constants_mach.cc',
-        'mach/symbolic_constants_mach.h',
-        'mach/task_for_pid.cc',
-        'mach/task_for_pid.h',
-        'misc/address_sanitizer.h',
-        'misc/address_types.h',
-        'misc/arraysize.h',
-        'misc/as_underlying_type.h',
-        'misc/capture_context.h',
-        'misc/capture_context_linux.S',
-        'misc/capture_context_mac.S',
-        'misc/capture_context_win.asm',
-        'misc/clock.h',
-        'misc/clock_mac.cc',
-        'misc/clock_posix.cc',
-        'misc/clock_win.cc',
-        'misc/elf_note_types.h',
-        'misc/from_pointer_cast.h',
-        'misc/implicit_cast.h',
-        'misc/initialization_state.h',
-        'misc/initialization_state_dcheck.cc',
-        'misc/initialization_state_dcheck.h',
-        'misc/lexing.cc',
-        'misc/lexing.h',
-        'misc/metrics.cc',
-        'misc/metrics.h',
-        'misc/paths.h',
-        'misc/paths_mac.cc',
-        'misc/paths_linux.cc',
-        'misc/paths_win.cc',
-        'misc/pdb_structures.cc',
-        'misc/pdb_structures.h',
-        'misc/random_string.cc',
-        'misc/random_string.h',
-        'misc/range_set.cc',
-        'misc/range_set.h',
-        'misc/reinterpret_bytes.cc',
-        'misc/reinterpret_bytes.h',
-        'misc/scoped_forbid_return.cc',
-        'misc/scoped_forbid_return.h',
-        'misc/symbolic_constants_common.h',
-        'misc/time.cc',
-        'misc/time.h',
-        'misc/time_linux.cc',
-        'misc/time_win.cc',
-        'misc/tri_state.h',
-        'misc/uuid.cc',
-        'misc/uuid.h',
-        'misc/zlib.cc',
-        'misc/zlib.h',
-        'net/http_body.cc',
-        'net/http_body.h',
-        'net/http_body_gzip.cc',
-        'net/http_body_gzip.h',
-        'net/http_headers.h',
-        'net/http_multipart_builder.cc',
-        'net/http_multipart_builder.h',
-        'net/http_transport.cc',
-        'net/http_transport.h',
-        'net/http_transport_mac.mm',
-        'net/http_transport_win.cc',
-        'net/url.cc',
-        'net/url.h',
-        'numeric/checked_address_range.cc',
-        'numeric/checked_address_range.h',
-        'numeric/checked_range.h',
-        'numeric/checked_vm_address_range.h',
-        'numeric/in_range_cast.h',
-        'numeric/int128.h',
-        'numeric/safe_assignment.h',
-        'posix/close_multiple.cc',
-        'posix/close_multiple.h',
-        'posix/close_stdio.cc',
-        'posix/close_stdio.h',
-        'posix/drop_privileges.cc',
-        'posix/drop_privileges.h',
-        'posix/double_fork_and_exec.cc',
-        'posix/double_fork_and_exec.h',
-        'posix/process_info.h',
-        'posix/process_info_linux.cc',
-        'posix/process_info_mac.cc',
-        'posix/scoped_dir.cc',
-        'posix/scoped_dir.h',
-        'posix/scoped_mmap.cc',
-        'posix/scoped_mmap.h',
-        'posix/signals.cc',
-        'posix/signals.h',
-        'posix/symbolic_constants_posix.cc',
-        'posix/symbolic_constants_posix.h',
-        'process/process_id.h',
-        'process/process_memory.cc',
-        'process/process_memory.h',
-        'process/process_memory_linux.cc',
-        'process/process_memory_linux.h',
-        'process/process_memory_mac.cc',
-        'process/process_memory_mac.h',
-        'process/process_memory_native.h',
-        'process/process_memory_range.cc',
-        'process/process_memory_range.h',
-        'stdlib/aligned_allocator.cc',
-        'stdlib/aligned_allocator.h',
-        'stdlib/map_insert.h',
-        'stdlib/objc.h',
-        'stdlib/string_number_conversion.cc',
-        'stdlib/string_number_conversion.h',
-        'stdlib/strlcpy.cc',
-        'stdlib/strlcpy.h',
-        'stdlib/strnlen.cc',
-        'stdlib/strnlen.h',
-        'stdlib/thread_safe_vector.h',
-        'stream/base94_output_stream.cc',
-        'stream/base94_output_stream.h',
-        'stream/file_encoder.cc',
-        'stream/file_encoder.h',
-        'stream/file_output_stream.cc',
-        'stream/file_output_stream.h',
-        'stream/log_output_stream.cc',
-        'stream/log_output_stream.h',
-        'stream/output_stream_interface.h',
-        'stream/zlib_output_stream.cc',
-        'stream/zlib_output_stream.h',
-        'string/split_string.cc',
-        'string/split_string.h',
-        'synchronization/semaphore_mac.cc',
-        'synchronization/semaphore_posix.cc',
-        'synchronization/semaphore_win.cc',
-        'synchronization/semaphore.h',
-        'thread/stoppable.h',
-        'thread/thread.cc',
-        'thread/thread.h',
-        'thread/thread_log_messages.cc',
-        'thread/thread_log_messages.h',
-        'thread/thread_posix.cc',
-        'thread/thread_win.cc',
-        'thread/worker_thread.cc',
-        'thread/worker_thread.h',
-        'win/address_types.h',
-        'win/checked_win_address_range.h',
-        'win/command_line.cc',
-        'win/command_line.h',
-        'win/context_wrappers.h',
-        'win/critical_section_with_debug_info.cc',
-        'win/critical_section_with_debug_info.h',
-        'win/exception_handler_server.cc',
-        'win/exception_handler_server.h',
-        'win/get_function.cc',
-        'win/get_function.h',
-        'win/get_module_information.cc',
-        'win/get_module_information.h',
-        'win/handle.cc',
-        'win/handle.h',
-        'win/initial_client_data.cc',
-        'win/initial_client_data.h',
-        'win/module_version.cc',
-        'win/module_version.h',
-        'win/nt_internals.cc',
-        'win/nt_internals.h',
-        'win/ntstatus_logging.cc',
-        'win/ntstatus_logging.h',
-        'win/process_info.cc',
-        'win/process_info.h',
-        'win/process_structs.h',
-        'win/registration_protocol_win.cc',
-        'win/registration_protocol_win.h',
-        'win/safe_terminate_process.asm',
-        'win/safe_terminate_process.h',
-        'win/scoped_handle.cc',
-        'win/scoped_handle.h',
-        'win/scoped_local_alloc.cc',
-        'win/scoped_local_alloc.h',
-        'win/scoped_process_suspend.cc',
-        'win/scoped_process_suspend.h',
-        'win/scoped_set_event.cc',
-        'win/scoped_set_event.h',
-        'win/session_end_watcher.cc',
-        'win/session_end_watcher.h',
-        'win/termination_codes.h',
-        'win/xp_compat.h',
-      ],
-      'conditions': [
-        ['OS=="mac"', {
-          'conditions': [
-            ['GENERATOR=="ninja"', {
-              # ninja’s rules can’t deal with sources that have paths relative
-              # to environment variables like SDKROOT. Copy the .defs files out
-              # of SDKROOT and into a place they can be referenced without any
-              # environment variables.
-              'copies': [
-                {
-                  'destination': '<(INTERMEDIATE_DIR)/util/mach',
-                  'files': [
-                    '$(SDKROOT)/usr/include/mach/exc.defs',
-                    '$(SDKROOT)/usr/include/mach/mach_exc.defs',
-                    '$(SDKROOT)/usr/include/mach/notify.defs',
-                  ],
-                },
-              ],
-              'sources': [
-                '<(INTERMEDIATE_DIR)/util/mach/exc.defs',
-                '<(INTERMEDIATE_DIR)/util/mach/mach_exc.defs',
-                '<(INTERMEDIATE_DIR)/util/mach/notify.defs',
-              ],
-            }, {  # else: GENERATOR!="ninja"
-              # The Xcode generator does copies after rules, so the above trick
-              # won’t work, but its rules tolerate sources with SDKROOT-relative
-              # paths.
-              'sources': [
-                '$(SDKROOT)/usr/include/mach/exc.defs',
-                '$(SDKROOT)/usr/include/mach/mach_exc.defs',
-                '$(SDKROOT)/usr/include/mach/notify.defs',
-              ],
-            }],
-          ],
-          'rules': [
-            {
-              'rule_name': 'mig',
-              'extension': 'defs',
-              'inputs': [
-                'mach/mig.py',
-              ],
-              'outputs': [
-                '<(INTERMEDIATE_DIR)/util/mach/<(RULE_INPUT_ROOT)User.c',
-                '<(INTERMEDIATE_DIR)/util/mach/<(RULE_INPUT_ROOT)Server.c',
-                '<(INTERMEDIATE_DIR)/util/mach/<(RULE_INPUT_ROOT).h',
-                '<(INTERMEDIATE_DIR)/util/mach/<(RULE_INPUT_ROOT)Server.h',
-              ],
-              'action': [
-                'python2',
-                '<@(_inputs)',
-                '<(RULE_INPUT_PATH)',
-                '<@(_outputs)',
-                '--include=../compat/mac'
-              ],
-              'process_outputs_as_sources': 1,
-            },
-          ],
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/CoreFoundation.framework',
-              '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
-              '$(SDKROOT)/System/Library/Frameworks/IOKit.framework',
-              '$(SDKROOT)/usr/lib/libbsm.dylib',
-            ],
-          },
-        }, { # else: OS!=mac
-          'sources!': [ 'misc/capture_context_mac.S' ],
-        }],
-        ['OS=="win"', {
-          'link_settings': {
-            'libraries': [
-              '-luser32.lib',
-              '-lversion.lib',
-              '-lwinhttp.lib',
-            ],
-          },
-          'msvs_disabled_warnings': [
-            4201,  # nonstandard extension used : nameless struct/union.
-            4577,  # 'noexcept' used with no exception handling mode specified
-          ],
-          'direct_dependent_settings': {
-            'msvs_disabled_warnings': [
-              4577,  # 'noexcept' used with no exception handling mode specified
-            ],
-          },
-          'conditions': [
-            ['target_arch=="ia32"', {
-              'msvs_settings': {
-                'MASM': {
-                  'UseSafeExceptionHandlers': 'true',
-                },
-              },
-            }],
-          ],
-        }, {  # else: OS!="win"
-          'sources!': [
-            'misc/capture_context_win.asm',
-            'win/safe_terminate_process.asm',
-          ],
-        }],
-        ['OS=="android"', {
-          'link_settings': {
-            'libraries': [
-              '-llog',
-            ],
-          },
-        }],
-        ['target_os=="linux" or target_os=="android"', {
-          'sources': [
-            'process/process_memory_sanitized.cc',
-            'process/process_memory_sanitized.h',
-          ],
-        }, {  # else: OS!="linux"
-          'sources!': [
-            'misc/capture_context_linux.S',
-          ],
-        }],
-        ['target_os!="linux" and target_os!="android"', {
-          'sources/': [
-            ['exclude', '^process/'],
-          ],
-        }],
-      ],
-      'target_conditions': [
-        ['OS=="android"', {
-          'sources/': [
-            ['include', '^linux/'],
-            ['include', '^misc/capture_context_linux\\.S$'],
-            ['include', '^misc/paths_linux\\.cc$'],
-            ['include', '^misc/time_linux\\.cc$'],
-            ['include', '^posix/process_info_linux\\.cc$'],
-            ['include', '^process/process_memory_linux\\.cc$'],
-            ['include', '^process/process_memory_linux\\.h$'],
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/util/util_test.gyp b/third_party/crashpad/util/util_test.gyp
deleted file mode 100644
index f65a918..0000000
--- a/third_party/crashpad/util/util_test.gyp
+++ /dev/null
@@ -1,235 +0,0 @@
-# Copyright 2014 The Crashpad Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'includes': [
-    '../build/crashpad.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'crashpad_util_test',
-      'type': 'executable',
-      'dependencies': [
-        'util.gyp:crashpad_util',
-        '../client/client.gyp:crashpad_client',
-        '../compat/compat.gyp:crashpad_compat',
-        '../test/test.gyp:crashpad_gmock_main',
-        '../test/test.gyp:crashpad_test',
-        '../third_party/gtest/gmock.gyp:gmock',
-        '../third_party/gtest/gtest.gyp:gtest',
-        '../third_party/lss/lss.gyp:lss',
-        '../third_party/mini_chromium/mini_chromium.gyp:base',
-        '../third_party/zlib/zlib.gyp:zlib',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'file/delimited_file_reader_test.cc',
-        'file/directory_reader_test.cc',
-        'file/file_io_test.cc',
-        'file/file_reader_test.cc',
-        'file/filesystem_test.cc',
-        'file/string_file_test.cc',
-        'linux/auxiliary_vector_test.cc',
-        'linux/memory_map_test.cc',
-        'linux/proc_stat_reader_test.cc',
-        'linux/proc_task_reader_test.cc',
-        'linux/ptrace_broker_test.cc',
-        'linux/ptracer_test.cc',
-        'linux/scoped_ptrace_attach_test.cc',
-        'linux/socket_test.cc',
-        'mac/launchd_test.mm',
-        'mac/mac_util_test.mm',
-        'mac/service_management_test.mm',
-        'mac/xattr_test.cc',
-        'mach/child_port_handshake_test.cc',
-        'mach/child_port_server_test.cc',
-        'mach/composite_mach_message_server_test.cc',
-        'mach/exc_client_variants_test.cc',
-        'mach/exc_server_variants_test.cc',
-        'mach/exception_behaviors_test.cc',
-        'mach/exception_ports_test.cc',
-        'mach/exception_types_test.cc',
-        'mach/mach_extensions_test.cc',
-        'mach/mach_message_server_test.cc',
-        'mach/mach_message_test.cc',
-        'mach/notify_server_test.cc',
-        'mach/scoped_task_suspend_test.cc',
-        'mach/symbolic_constants_mach_test.cc',
-        'misc/arraysize_test.cc',
-        'misc/capture_context_test.cc',
-        'misc/capture_context_test_util.h',
-        'misc/capture_context_test_util_linux.cc',
-        'misc/capture_context_test_util_mac.cc',
-        'misc/capture_context_test_util_win.cc',
-        'misc/clock_test.cc',
-        'misc/from_pointer_cast_test.cc',
-        'misc/initialization_state_dcheck_test.cc',
-        'misc/initialization_state_test.cc',
-        'misc/paths_test.cc',
-        'misc/scoped_forbid_return_test.cc',
-        'misc/random_string_test.cc',
-        'misc/range_set_test.cc',
-        'misc/reinterpret_bytes_test.cc',
-        'misc/time_test.cc',
-        'misc/uuid_test.cc',
-        'net/http_body_gzip_test.cc',
-        'net/http_body_test.cc',
-        'net/http_body_test_util.cc',
-        'net/http_body_test_util.h',
-        'net/http_multipart_builder_test.cc',
-        'net/http_transport_test.cc',
-        'net/url_test.cc',
-        'numeric/checked_address_range_test.cc',
-        'numeric/checked_range_test.cc',
-        'numeric/in_range_cast_test.cc',
-        'numeric/int128_test.cc',
-        'posix/process_info_test.cc',
-        'posix/scoped_mmap_test.cc',
-        'posix/signals_test.cc',
-        'posix/symbolic_constants_posix_test.cc',
-        'process/process_memory_mac_test.cc',
-        'process/process_memory_range_test.cc',
-        'process/process_memory_test.cc',
-        'stdlib/aligned_allocator_test.cc',
-        'stdlib/map_insert_test.cc',
-        'stdlib/string_number_conversion_test.cc',
-        'stdlib/strlcpy_test.cc',
-        'stdlib/strnlen_test.cc',
-        'stdlib/thread_safe_vector_test.cc',
-        'string/split_string_test.cc',
-        'synchronization/semaphore_test.cc',
-        'thread/thread_log_messages_test.cc',
-        'thread/thread_test.cc',
-        'thread/worker_thread_test.cc',
-        'win/command_line_test.cc',
-        'win/critical_section_with_debug_info_test.cc',
-        'win/exception_handler_server_test.cc',
-        'win/get_function_test.cc',
-        'win/handle_test.cc',
-        'win/initial_client_data_test.cc',
-        'win/process_info_test.cc',
-        'win/registration_protocol_win_test.cc',
-        'win/safe_terminate_process_test.cc',
-        'win/scoped_process_suspend_test.cc',
-        'win/session_end_watcher_test.cc',
-      ],
-      'conditions': [
-        ['OS=="mac"', {
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
-            ],
-          },
-        }],
-        ['OS=="win"', {
-          'dependencies': [
-            'crashpad_util_test_process_info_test_child',
-            'crashpad_util_test_safe_terminate_process_test_child',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-ladvapi32.lib',
-              '-limagehlp.lib',
-              '-lrpcrt4.lib',
-              '-luser32.lib',
-            ],
-          },
-        }],
-        ['OS=="android"', {
-          # Things not yet ported to Android
-          'sources/' : [
-            ['exclude', '^net/http_transport_test\\.cc$'],
-          ]
-        }],
-        ['OS=="linux" or OS=="android"', {
-          'sources': [
-            'process/process_memory_sanitized_test.cc',
-          ],
-        }],
-        ['OS!="linux" and OS!="android"', {
-          'sources/': [
-            ['exclude', '^process/'],
-          ],
-        }],
-      ],
-      'target_conditions': [
-        ['OS=="android"', {
-          'sources/': [
-            ['include', '^linux/'],
-            ['include', '^misc/capture_context_test_util_linux\\.cc$'],
-          ],
-        }],
-      ],
-    },
-  ],
-  'conditions': [
-    ['OS!="android"', {
-      'targets': [
-        {
-          'target_name': 'http_transport_test_server',
-          'type': 'executable',
-          'dependencies': [
-            '../third_party/mini_chromium/mini_chromium.gyp:base',
-            '../third_party/zlib/zlib.gyp:zlib',
-            '../tools/tools.gyp:crashpad_tool_support',
-            '../util/util.gyp:crashpad_util',
-          ],
-          'sources': [
-            'net/http_transport_test_server.cc',
-          ],
-          'include_dirs': [
-            '..',
-          ],
-          'xcode_settings': {
-            'WARNING_CFLAGS!': [
-              '-Wexit-time-destructors',
-            ],
-          },
-          'cflags!': [
-            '-Wexit-time-destructors',
-          ],
-          'conditions': [
-            ['OS=="win"', {
-              'link_settings': {
-                'libraries': [
-                  '-lws2_32.lib',
-                ],
-              },
-            }],
-          ],
-        },
-      ],
-    }],
-    ['OS=="win"', {
-      'targets': [
-        {
-          'target_name': 'crashpad_util_test_process_info_test_child',
-          'type': 'executable',
-          'sources': [
-            'win/process_info_test_child.cc',
-          ],
-        },
-        {
-          'target_name': 'crashpad_util_test_safe_terminate_process_test_child',
-          'type': 'executable',
-          'sources': [
-            'win/safe_terminate_process_test_child.cc',
-          ],
-        },
-      ]
-    }],
-  ],
-}
diff --git a/third_party/crashpad/wrapper/wrapper.cc b/third_party/crashpad/wrapper/wrapper.cc
index 5390853..8f19a70 100644
--- a/third_party/crashpad/wrapper/wrapper.cc
+++ b/third_party/crashpad/wrapper/wrapper.cc
@@ -106,16 +106,9 @@
   const size_t kSystemPropertyMaxLength = 1024;
   std::vector<char> value(kSystemPropertyMaxLength);
   bool result;
-
-#if SB_API_VERSION >= 12
   result = SbSystemGetProperty(kSbSystemPropertySystemIntegratorName,
                                value.data(),
                                kSystemPropertyMaxLength);
-#else
-  result = SbSystemGetProperty(kSbSystemPropertyOriginalDesignManufacturerName,
-                               value.data(),
-                               kSystemPropertyMaxLength);
-#endif
   if (result) {
     platform_info.insert({"system_integrator_name", value.data()});
   }
@@ -173,7 +166,7 @@
 
 }  // namespace
 
-void InstallCrashpadHandler() {
+void InstallCrashpadHandler(bool start_at_crash) {
   ::crashpad::CrashpadClient* client = GetCrashpadClient();
 
   const base::FilePath handler_path = GetPathToCrashpadHandlerBinary();
@@ -195,14 +188,23 @@
 
   InitializeCrashpadDatabase(database_directory_path);
   client->SetUnhandledSignals({});
-  client->StartHandler(handler_path,
-                       database_directory_path,
-                       default_metrics_dir,
-                       kUploadUrl,
-                       default_annotations,
-                       default_arguments,
-                       false,
-                       false);
+
+  if (start_at_crash)
+    client->StartHandlerAtCrash(handler_path,
+                                database_directory_path,
+                                default_metrics_dir,
+                                kUploadUrl,
+                                default_annotations,
+                                default_arguments);
+  else
+    client->StartHandler(handler_path,
+                         database_directory_path,
+                         default_metrics_dir,
+                         kUploadUrl,
+                         default_annotations,
+                         default_arguments,
+                         false,
+                         false);
 
   ::crashpad::SanitizationInformation sanitization_info = {0, 0, 0, 1};
   client->SendSanitizationInformationToHandler(sanitization_info);
diff --git a/third_party/crashpad/wrapper/wrapper.gyp b/third_party/crashpad/wrapper/wrapper.gyp
deleted file mode 100644
index b7196e1..0000000
--- a/third_party/crashpad/wrapper/wrapper.gyp
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'crashpad_wrapper_stub',
-      'type': 'static_library',
-      'sources': [
-        'wrapper_stub.cc',
-        'wrapper.h',
-      ],
-    },
-    {
-      'target_name': 'crashpad_wrapper',
-      'type': 'static_library',
-      'sources': [
-        'wrapper.cc',
-        'wrapper.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/third_party/crashpad/client/client.gyp:crashpad_client',
-      ],
-    },
-  ],
-}
diff --git a/third_party/crashpad/wrapper/wrapper.h b/third_party/crashpad/wrapper/wrapper.h
index b64c368..4def1a8 100644
--- a/third_party/crashpad/wrapper/wrapper.h
+++ b/third_party/crashpad/wrapper/wrapper.h
@@ -22,7 +22,7 @@
 namespace crashpad {
 namespace wrapper {
 
-void InstallCrashpadHandler();
+void InstallCrashpadHandler(bool start_at_crash);
 
 bool AddEvergreenInfoToCrashpad(EvergreenInfo evergreen_info);
 
diff --git a/third_party/crashpad/wrapper/wrapper_stub.cc b/third_party/crashpad/wrapper/wrapper_stub.cc
index 3775da3..bf3c093 100644
--- a/third_party/crashpad/wrapper/wrapper_stub.cc
+++ b/third_party/crashpad/wrapper/wrapper_stub.cc
@@ -18,7 +18,7 @@
 namespace crashpad {
 namespace wrapper {
 
-void InstallCrashpadHandler() {}
+void InstallCrashpadHandler(bool start_at_crash) {}
 
 bool AddEvergreenInfoToCrashpad(EvergreenInfo evergreen_info) {
   return false;
diff --git a/third_party/de265_includes/de265_includes.gyp b/third_party/de265_includes/de265_includes.gyp
deleted file mode 100644
index 3faf0c6..0000000
--- a/third_party/de265_includes/de265_includes.gyp
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'de265',
-      'type': 'none',
-      'direct_dependent_settings': {
-        'include_dirs': [ '.' ],
-      },
-    },
-  ],
-}
diff --git a/third_party/devtools/BUILD.gn b/third_party/devtools/BUILD.gn
index 1cb5e07..6b84392 100644
--- a/third_party/devtools/BUILD.gn
+++ b/third_party/devtools/BUILD.gn
@@ -479,6 +479,12 @@
   "front_end/workspace_diff/module.json",
 ]
 
+if (is_starboard) {
+  all_devtools_files += [
+    "front_end/cobalt/module.json",
+  ]
+}
+
 lighthouse_locale_files = [
   "front_end/audits_worker/lighthouse/locales/ar-XB.json",
   "front_end/audits_worker/lighthouse/locales/ar.json",
@@ -1063,6 +1069,9 @@
 ]
 
 if (is_starboard) {
+  all_devtools_modules += [
+    "front_end/cobalt/cobalt.js",
+  ]
   all_devtools_modules -= [
     "front_end/web_audio/web_audio.js",
     "front_end/web_audio/graph_visualizer/Types.js",
@@ -1624,6 +1633,8 @@
   "$resources_out_dir/cm/matchbrackets.js",
   "$resources_out_dir/cm/multiplex.js",
   "$resources_out_dir/cm/overlay.js",
+  "$resources_out_dir/formatter_worker.unbundled.js",
+  "$resources_out_dir/heap_snapshot_worker.unbundled.js",
   "$resources_out_dir/heap_snapshot_model/heap_snapshot_model.js",
   "$resources_out_dir/heap_snapshot_model/HeapSnapshotModel.js",
   "$resources_out_dir/heap_snapshot_worker/heap_snapshot_worker.js",
@@ -1636,6 +1647,18 @@
   "$resources_out_dir/text_utils/TextUtils.js",
   "$resources_out_dir/text_utils/TextRange.js",
   "$resources_out_dir/text_utils/Text.js",
+  "$resources_out_dir/formatter_worker/formatter_worker.js",
+  "$resources_out_dir/formatter_worker/RelaxedJSONParser.js",
+  "$resources_out_dir/formatter_worker/JavaScriptOutline.js",
+  "$resources_out_dir/formatter_worker/JavaScriptFormatter.js",
+  "$resources_out_dir/formatter_worker/IdentityFormatter.js",
+  "$resources_out_dir/formatter_worker/HTMLFormatter.js",
+  "$resources_out_dir/formatter_worker/FormatterWorker.js",
+  "$resources_out_dir/formatter_worker/FormattedContentBuilder.js",
+  "$resources_out_dir/formatter_worker/ESTreeWalker.js",
+  "$resources_out_dir/formatter_worker/CSSRuleParser.js",
+  "$resources_out_dir/formatter_worker/CSSFormatter.js",
+  "$resources_out_dir/formatter_worker/AcornTokenizer.js",
   "$resources_out_dir/cm_headless/cm_headless.js",
   "$resources_out_dir/cm_headless/headlesscodemirror.js",
   "$resources_out_dir/data_grid/data_grid.js",
@@ -1863,6 +1886,9 @@
 ]
 
 if (is_starboard) {
+  copied_devtools_modules += [
+    "$resources_out_dir/cobalt/cobalt.js",
+  ]
   copied_devtools_modules -= [
     "$resources_out_dir/web_audio/web_audio.js",
     "$resources_out_dir/web_audio/graph_visualizer/Types.js",
@@ -1998,17 +2024,18 @@
 ]
 
 if (is_starboard) {
+  generated_non_autostart_non_remote_modules += [
+    "$resources_out_dir/cobalt/cobalt_module.js",
+  ]
   generated_non_autostart_non_remote_modules -= [
     "$resources_out_dir/animation/animation_module.js",
     "$resources_out_dir/audits/audits_module.js",
     "$resources_out_dir/changes/changes_module.js",
     "$resources_out_dir/coverage/coverage_module.js",
     "$resources_out_dir/devices/devices_module.js",
-    "$resources_out_dir/heap_snapshot_model/heap_snapshot_model_module.js",
     "$resources_out_dir/js_profiler/js_profiler_module.js",
     "$resources_out_dir/media/media_module.js",
     "$resources_out_dir/node_debugger/node_debugger_module.js",
-    "$resources_out_dir/performance_monitor/performance_monitor_module.js",
     "$resources_out_dir/security/security_module.js",
     "$resources_out_dir/web_audio/web_audio_module.js",
   ]
@@ -2151,6 +2178,10 @@
 }
 
 copy("copy_inspector_images") {
+  if (is_starboard) {
+    install_content = true
+  }
+
   sources = devtools_image_files
   outputs = [
     "$resources_out_dir/Images/{{source_file_part}}",
@@ -2233,6 +2264,10 @@
 }
 
 action("supported_css_properties") {
+  if (is_starboard) {
+    install_content = true
+  }
+
   script = "scripts/build/generate_supported_css.py"
 
   if (is_starboard) {
@@ -2253,24 +2288,32 @@
       rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir)
 }
 
-if (!is_starboard) {
-  action("aria_properties") {
-    script = "scripts/build/generate_aria.py"
+action("aria_properties") {
+  script = "scripts/build/generate_aria.py"
 
+  if (is_starboard) {
+    inputs = [
+      "blink/properties/aria_properties.json5",
+    ]
+  } else {
     inputs = [
       "//third_party/blink/renderer/core/html/aria_properties.json5",
     ]
-
-    outputs = [
-      "$resources_out_dir/accessibility/ARIAProperties.js",
-    ]
-
-    args =
-        rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir)
   }
+
+  outputs = [
+    "$resources_out_dir/accessibility/ARIAProperties.js",
+  ]
+
+  args =
+      rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir)
 }
 
 action("frontend_protocol_sources") {
+  if (is_starboard) {
+    install_content = true
+  }
+
   script = "scripts/build/code_generator_frontend.py"
   if (is_starboard) {
     deps = [
@@ -2295,8 +2338,11 @@
 }
 
 action("build_release_devtools") {
-  script = "//starboard/build/run_bash.py"
-  py_script = "scripts/build/build_release_applications.py"
+  if (is_starboard) {
+    install_content = true
+  }
+
+  script = "scripts/build/build_release_applications.py"
 
   deps = [
     ":aria_properties",
@@ -2314,7 +2360,7 @@
   ]
 
   inputs =
-      [ py_script ] + helper_scripts + all_devtools_files +
+      helper_scripts + all_devtools_files +
       devtools_test_files + generated_scripts + generated_aria_properties +
       application_templates +
       # In `build_release_applications` we sometimes include
@@ -2331,11 +2377,7 @@
     outputs -= generated_test_modules
   }
 
-  args = [
-           "python2",
-           rebase_path(py_script, root_build_dir),
-         ] + devtools_applications +
-         [
+  args = devtools_applications + [
            "--input_path",
            rebase_path("front_end", root_build_dir),
            "--output_path",
@@ -2344,21 +2386,20 @@
 }
 
 action("copy_devtools_modules") {
-  script = "//starboard/build/run_bash.py"
-  py_script = "scripts/build/copy_devtools_modules.py"
+  if (is_starboard) {
+    install_content = true
+  }
+
+  script = "scripts/build/copy_devtools_modules.py"
 
   deps = [
     ":build_release_devtools",
   ]
 
-  inputs = [ py_script ] + all_devtools_modules
+  inputs = all_devtools_modules
   outputs = copied_devtools_modules
 
-  args = [
-           "python2",
-           rebase_path(py_script, root_build_dir),
-         ] + all_devtools_modules +
-         [
+  args = all_devtools_modules + [
            "--input_path",
            rebase_path(".", root_build_dir),
            "--output_path",
diff --git a/third_party/devtools/blink/devtools_protocol/devtools_protocol.gyp b/third_party/devtools/blink/devtools_protocol/devtools_protocol.gyp
deleted file mode 100644
index 2dced4f..0000000
--- a/third_party/devtools/blink/devtools_protocol/devtools_protocol.gyp
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# See Chromium:
-# https://chromium.googlesource.com/chromium/src.git/+/refs/tags/80.0.3987.148/third_party/blink/public/devtools_protocol/BUILD.gn
-
-{
-  'variables': {
-    'sb_pedantic_warnings': 1,
-    'v8_inspector_js_protocol_file': '<(DEPTH)/third_party/v8/include/js_protocol.pdl',
-  },
-  'targets': [
-    {
-      'target_name': 'protocol_compatibility_check',
-      'type': 'none',
-      'actions': [{
-        'action_name': 'check_protocol_compatibility',
-        'variables': {
-          'script_path': '<(DEPTH)/third_party/inspector_protocol/check_protocol_compatibility.py',
-          'input_files': [
-            'browser_protocol.pdl',
-            '<(v8_inspector_js_protocol_file)',
-          ],
-          'stamp_file': '<(SHARED_INTERMEDIATE_DIR)/third_party/devtools/blink/devtools_protocol/check_protocol_compatibility.stamp',
-        },
-        'inputs': [ '<(script_path)', '<@(input_files)' ],
-        'outputs': [ '<(stamp_file)' ],
-        'action': [
-          'python2',
-          '<(script_path)',
-          '--stamp',
-          '<(stamp_file)',
-          '<@(input_files)',
-        ],
-      }],
-    },
-
-    {
-      'target_name': 'protocol_version',
-      'type': 'none',
-      'dependencies': [
-        'protocol_compatibility_check',
-      ],
-      'actions': [{
-        'action_name': 'concatenate_protocols',
-        'variables': {
-          'script_path': '<(DEPTH)/third_party/inspector_protocol/concatenate_protocols.py',
-          'input_files': [
-            'browser_protocol.pdl',
-            '<(v8_inspector_js_protocol_file)',
-          ],
-          'output_file': '<(SHARED_INTERMEDIATE_DIR)/third_party/devtools/blink/devtools_protocol/protocol.json',
-        },
-        'inputs': [ '<(script_path)', '<@(input_files)' ],
-        'outputs': [ '<(output_file)' ],
-        'action': [
-          'python2',
-          '<(script_path)',
-          '<@(input_files)',
-          '<(output_file)',
-        ],
-      }],
-    },
-  ],
-}
diff --git a/third_party/devtools/devtools.gyp b/third_party/devtools/devtools.gyp
deleted file mode 100644
index 17c7ce6..0000000
--- a/third_party/devtools/devtools.gyp
+++ /dev/null
@@ -1,2233 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-# Ported from Chromium's BUILD.gn (in this directory).
-# Variable and target names were kept the same.
-
-{
-  'variables': {
-    'all_devtools_files': [
-      "front_end/accessibility/accessibilityNode.css",
-      "front_end/accessibility/accessibilityProperties.css",
-      "front_end/accessibility/axBreadcrumbs.css",
-      "front_end/accessibility/module.json",
-      "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js",
-      "front_end/accessibility_test_runner/module.json",
-      "front_end/animation/animationScreenshotPopover.css",
-      "front_end/animation/animationTimeline.css",
-      "front_end/animation/module.json",
-      "front_end/application_test_runner/AppcacheTestRunner.js",
-      "front_end/application_test_runner/CacheStorageTestRunner.js",
-      "front_end/application_test_runner/IndexedDBTestRunner.js",
-      "front_end/application_test_runner/module.json",
-      "front_end/application_test_runner/ResourcesTestRunner.js",
-      "front_end/application_test_runner/ResourceTreeTestRunner.js",
-      "front_end/application_test_runner/ServiceWorkersTestRunner.js",
-      "front_end/audits_worker.js",
-      "front_end/audits_worker.json",
-      "front_end/audits_worker/AuditsService.js",
-      "front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js",
-      "front_end/audits_worker/module.json",
-      "front_end/audits/auditsDialog.css",
-      "front_end/audits/auditsStartView.css",
-      "front_end/audits/auditsPanel.css",
-      "front_end/audits/lighthouse/report.css",
-      "front_end/audits/lighthouse/template.html",
-      "front_end/audits/lighthouse/templates.html",
-      "front_end/audits/module.json",
-      "front_end/audits_test_runner/AuditsTestRunner.js",
-      "front_end/audits_test_runner/module.json",
-      "front_end/axe_core_test_runner/AxeCoreTestRunner.js",
-      "front_end/axe_core_test_runner/module.json",
-      "front_end/bindings/module.json",
-      "front_end/bindings_test_runner/AutomappingTestRunner.js",
-      "front_end/bindings_test_runner/BindingsTestRunner.js",
-      "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js",
-      "front_end/bindings_test_runner/module.json",
-      "front_end/bindings_test_runner/PersistenceTestRunner.js",
-      "front_end/bindings_test_runner/OverridesTestRunner.js",
-      "front_end/browser_debugger/domBreakpointsSidebarPane.css",
-      "front_end/browser_debugger/eventListenerBreakpoints.css",
-      "front_end/browser_debugger/module.json",
-      "front_end/browser_debugger/xhrBreakpointsSidebarPane.css",
-      "front_end/browser_sdk/module.json",
-      "front_end/css_overview/cssOverview.css",
-      "front_end/css_overview/cssOverviewStartView.css",
-      "front_end/css_overview/cssOverviewProcessingView.css",
-      "front_end/css_overview/cssOverviewCompletedView.css",
-      "front_end/css_overview/cssOverviewSidebarPanel.css",
-      "front_end/css_overview/module.json",
-      "front_end/changes/changesView.css",
-      "front_end/changes/changesSidebar.css",
-      "front_end/changes/module.json",
-      "front_end/cm/codemirror.css",
-      "front_end/cm/module.json",
-      "front_end/cm_headless/module.json",
-      "front_end/cm_modes/module.json",
-      "front_end/cm_web_modes/module.json",
-      "front_end/cobalt/module.json",
-      "front_end/color_picker/module.json",
-      "front_end/color_picker/spectrum.css",
-      "front_end/common/module.json",
-      "front_end/components/imagePreview.css",
-      "front_end/components/jsUtils.css",
-      "front_end/components/module.json",
-      "front_end/console/consoleView.css",
-      "front_end/console/consoleContextSelector.css",
-      "front_end/console/consolePinPane.css",
-      "front_end/console/consolePrompt.css",
-      "front_end/console/consoleSidebar.css",
-      "front_end/console/module.json",
-      "front_end/console_counters/errorWarningCounter.css",
-      "front_end/console_counters/module.json",
-      "front_end/console_test_runner/ConsoleTestRunner.js",
-      "front_end/console_test_runner/module.json",
-      "front_end/cookie_table/module.json",
-      "front_end/coverage/coverageListView.css",
-      "front_end/coverage/coverageView.css",
-      "front_end/coverage/module.json",
-      "front_end/coverage_test_runner/CoverageTestRunner.js",
-      "front_end/coverage_test_runner/module.json",
-      "front_end/cpu_profiler_test_runner/module.json",
-      "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js",
-      "front_end/dagre_layout/dagre.js",
-      "front_end/dagre_layout/module.json",
-      "front_end/data_grid/dataGrid.css",
-      "front_end/data_grid/module.json",
-      "front_end/data_grid_test_runner/DataGridTestRunner.js",
-      "front_end/data_grid_test_runner/module.json",
-      "front_end/device_mode_test_runner/DeviceModeTestRunner.js",
-      "front_end/device_mode_test_runner/module.json",
-      "front_end/devices/DevicesView.js",
-      "front_end/devices/module.json",
-      "front_end/diff/module.json",
-      "front_end/dom_extension/module.json",
-      "front_end/elements/breadcrumbs.css",
-      "front_end/elements/classesPaneWidget.css",
-      "front_end/elements/computedStyleSidebarPane.css",
-      "front_end/elements/computedStyleWidgetTree.css",
-      "front_end/elements/domLinkifier.css",
-      "front_end/elements/elementsPanel.css",
-      "front_end/elements/elementStatePaneWidget.css",
-      "front_end/elements/elementsTreeOutline.css",
-      "front_end/elements/metricsSidebarPane.css",
-      "front_end/elements/nodeStackTraceWidget.css",
-      "front_end/elements/module.json",
-      "front_end/elements/platformFontsWidget.css",
-      "front_end/elements/propertiesWidget.css",
-      "front_end/elements/stylesSectionTree.css",
-      "front_end/elements/stylesSidebarPane.css",
-      "front_end/elements_test_runner/EditDOMTestRunner.js",
-      "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js",
-      "front_end/elements_test_runner/ElementsTestRunner.js",
-      "front_end/elements_test_runner/module.json",
-      "front_end/elements_test_runner/SetOuterHTMLTestRunner.js",
-      "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js",
-      "front_end/emulated_devices/module.json",
-      "front_end/emulation/deviceModeToolbar.css",
-      "front_end/emulation/deviceModeView.css",
-      "front_end/emulation/devicesSettingsTab.css",
-      "front_end/emulation/geolocationsSettingsTab.css",
-      "front_end/emulation/inspectedPagePlaceholder.css",
-      "front_end/emulation/mediaQueryInspector.css",
-      "front_end/emulation/module.json",
-      "front_end/emulation/sensors.css",
-      "front_end/event_listeners/eventListenersView.css",
-      "front_end/event_listeners/module.json",
-      "front_end/extensions/module.json",
-      "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js",
-      "front_end/extensions_test_runner/ExtensionsTestRunner.js",
-      "front_end/extensions_test_runner/module.json",
-      "front_end/formatter/module.json",
-      "front_end/formatter_worker.json",
-      "front_end/formatter_worker/acorn/acorn.js",
-      "front_end/formatter_worker/acorn/acorn_loose.js",
-      "front_end/formatter_worker/module.json",
-      "front_end/har_importer/module.json",
-      "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js",
-      "front_end/heap_profiler_test_runner/module.json",
-      "front_end/heap_snapshot_model/module.json",
-      "front_end/heap_snapshot_worker.json",
-      "front_end/heap_snapshot_worker/module.json",
-      "front_end/help/module.json",
-      "front_end/help/releaseNote.css",
-      "front_end/host/module.json",
-      "front_end/inline_editor/bezierEditor.css",
-      "front_end/inline_editor/bezierSwatch.css",
-      "front_end/inline_editor/colorSwatch.css",
-      "front_end/inline_editor/cssShadowEditor.css",
-      "front_end/inline_editor/cssShadowSwatch.css",
-      "front_end/inline_editor/module.json",
-      "front_end/inline_editor/swatchPopover.css",
-      "front_end/inspector.js",
-      "front_end/inspector.json",
-      "front_end/inspector_main/module.json",
-      "front_end/inspector_main/nodeIcon.css",
-      "front_end/inspector_main/renderingOptions.css",
-      "front_end/integration_test_runner.js",
-      "front_end/integration_test_runner.json",
-      "front_end/javascript_metadata/module.json",
-
-      "front_end/js_main/module.json",
-      "front_end/js_profiler/module.json",
-      "front_end/layer_viewer/layerDetailsView.css",
-      "front_end/layer_viewer/layers3DView.css",
-      "front_end/layer_viewer/module.json",
-      "front_end/layer_viewer/paintProfiler.css",
-      "front_end/layers/module.json",
-      "front_end/layers_test_runner/LayersTestRunner.js",
-      "front_end/layers_test_runner/module.json",
-      "front_end/main/module.json",
-      "front_end/protocol_monitor/protocolMonitor.css",
-      "front_end/protocol_monitor/module.json",
-      "front_end/mobile_throttling/module.json",
-      "front_end/mobile_throttling/throttlingSettingsTab.css",
-      "front_end/media/eventDisplayTable.css",
-      "front_end/media/EventDisplayTable.js",
-      "front_end/media/MainView.js",
-      "front_end/media/MediaTable.js",
-      "front_end/media/PlayerDetailView.js",
-      "front_end/media/playerListView.css",
-      "front_end/media/PlayerListView.js",
-      "front_end/media/module.json",
-      "front_end/media/MediaModel.js",
-      "front_end/media/mediaView.css",
-      "front_end/ndb_app.json",
-      "front_end/network/binaryResourceView.css",
-      "front_end/network/blockedURLsPane.css",
-      "front_end/network/eventSourceMessagesView.css",
-      "front_end/network/module.json",
-      "front_end/network/networkConfigView.css",
-      "front_end/network/networkLogView.css",
-      "front_end/network/networkManageCustomHeadersView.css",
-      "front_end/network/networkPanel.css",
-      "front_end/network/networkTimingTable.css",
-      "front_end/network/networkWaterfallColumn.css",
-      "front_end/network/requestCookiesView.css",
-      "front_end/network/requestHeadersTree.css",
-      "front_end/network/requestHeadersView.css",
-      "front_end/network/requestHTMLView.css",
-      "front_end/network/requestInitiatorView.css",
-      "front_end/network/signedExchangeInfoTree.css",
-      "front_end/network/signedExchangeInfoView.css",
-      "front_end/network/webSocketFrameView.css",
-      "front_end/network_test_runner/module.json",
-      "front_end/network_test_runner/NetworkTestRunner.js",
-      "front_end/node_debugger/module.json",
-      "front_end/node_main/NodeConnectionsPanel.js",
-      "front_end/node_main/nodeConnectionsPanel.css",
-      "front_end/node_main/NodeMain.js",
-      "front_end/node_main/module.json",
-      "front_end/object_ui/customPreviewComponent.css",
-      "front_end/object_ui/module.json",
-      "front_end/object_ui/objectPopover.css",
-      "front_end/object_ui/objectPropertiesSection.css",
-      "front_end/object_ui/objectValue.css",
-      "front_end/perf_ui/ChartViewport.js",
-      "front_end/perf_ui/FilmStripView.js",
-      "front_end/perf_ui/FlameChart.js",
-      "front_end/perf_ui/GCActionDelegate.js",
-      "front_end/perf_ui/LineLevelProfile.js",
-      "front_end/perf_ui/LiveHeapProfile.js",
-      "front_end/perf_ui/NetworkPriorities.js",
-      "front_end/perf_ui/OverviewGrid.js",
-      "front_end/perf_ui/PieChart.js",
-      "front_end/perf_ui/TimelineGrid.js",
-      "front_end/perf_ui/TimelineOverviewPane.js",
-      "front_end/perf_ui/chartViewport.css",
-      "front_end/perf_ui/filmStripView.css",
-      "front_end/perf_ui/flameChart.css",
-      "front_end/perf_ui/module.json",
-      "front_end/perf_ui/overviewGrid.css",
-      "front_end/perf_ui/pieChart.css",
-      "front_end/perf_ui/timelineGrid.css",
-      "front_end/perf_ui/timelineOverviewInfo.css",
-      "front_end/performance_monitor/performanceMonitor.css",
-      "front_end/performance_monitor/module.json",
-      "front_end/performance_test_runner/module.json",
-      "front_end/performance_test_runner/TimelineDataTestRunner.js",
-      "front_end/performance_test_runner/TimelineTestRunner.js",
-      "front_end/persistence/editFileSystemView.css",
-      "front_end/persistence/module.json",
-      "front_end/persistence/workspaceSettingsTab.css",
-      "front_end/platform/module.json",
-      "front_end/profiler/BottomUpProfileDataGrid.js",
-      "front_end/profiler/CPUProfileFlameChart.js",
-      "front_end/profiler/CPUProfileView.js",
-      "front_end/profiler/heapProfiler.css",
-      "front_end/profiler/HeapProfileView.js",
-      "front_end/profiler/HeapProfilerPanel.js",
-      "front_end/profiler/HeapSnapshotDataGrids.js",
-      "front_end/profiler/HeapSnapshotGridNodes.js",
-      "front_end/profiler/HeapSnapshotProxy.js",
-      "front_end/profiler/HeapSnapshotView.js",
-      "front_end/profiler/HeapTimelineOverview.js",
-      "front_end/profiler/IsolateSelector.js",
-      "front_end/profiler/LiveHeapProfileView.js",
-      "front_end/profiler/liveHeapProfile.css",
-      "front_end/profiler/module.json",
-      "front_end/profiler/ProfileDataGrid.js",
-      "front_end/profiler/ProfileHeader.js",
-      "front_end/profiler/profileLauncherView.css",
-      "front_end/profiler/ProfileLauncherView.js",
-      "front_end/profiler/ProfileType.js",
-      "front_end/profiler/profilesPanel.css",
-      "front_end/profiler/ProfilesPanel.js",
-      "front_end/profiler/profilesSidebarTree.css",
-      "front_end/profiler/ProfileTypeRegistry.js",
-      "front_end/profiler/ProfileView.js",
-      "front_end/profiler/TopDownProfileDataGrid.js",
-      "front_end/protocol/module.json",
-      "front_end/quick_open/filteredListWidget.css",
-      "front_end/quick_open/module.json",
-      "front_end/resources/ApplicationCacheModel.js",
-      "front_end/resources/ApplicationCacheItemsView.js",
-      "front_end/resources/ApplicationPanelSidebar.js",
-      "front_end/resources/appManifestView.css",
-      "front_end/resources/AppManifestView.js",
-      "front_end/resources/BackgroundServiceModel.js",
-      "front_end/resources/backgroundServiceView.css",
-      "front_end/resources/BackgroundServiceView.js",
-      "front_end/resources/clearStorageView.css",
-      "front_end/resources/ClearStorageView.js",
-      "front_end/resources/CookieItemsView.js",
-      "front_end/resources/cookieItemsView.css",
-      "front_end/resources/DatabaseModel.js",
-      "front_end/resources/DatabaseQueryView.js",
-      "front_end/resources/DatabaseTableView.js",
-      "front_end/resources/DOMStorageItemsView.js",
-      "front_end/resources/DOMStorageModel.js",
-      "front_end/resources/IndexedDBModel.js",
-      "front_end/resources/indexedDBViews.css",
-      "front_end/resources/IndexedDBViews.js",
-      "front_end/resources/module.json",
-      "front_end/resources/resourcesPanel.css",
-      "front_end/resources/ResourcesPanel.js",
-      "front_end/resources/ResourcesSection.js",
-      "front_end/resources/resourcesSidebar.css",
-      "front_end/resources/serviceWorkerCacheViews.css",
-      "front_end/resources/ServiceWorkerCacheViews.js",
-      "front_end/resources/serviceWorkersView.css",
-      "front_end/resources/ServiceWorkersView.js",
-      "front_end/resources/StorageItemsView.js",
-      "front_end/shell.json",
-      "front_end/screencast/module.json",
-      "front_end/screencast/screencastView.css",
-      "front_end/sdk/module.json",
-      "front_end/sdk_test_runner/module.json",
-      "front_end/sdk_test_runner/PageMockTestRunner.js",
-      "front_end/search/module.json",
-      "front_end/search/searchResultsPane.css",
-      "front_end/search/searchView.css",
-      "front_end/security/lockIcon.css",
-      "front_end/security/mainView.css",
-      "front_end/security/module.json",
-      "front_end/security/originView.css",
-      "front_end/security/sidebar.css",
-      "front_end/security_test_runner/module.json",
-      "front_end/security_test_runner/SecurityTestRunner.js",
-      "front_end/services/module.json",
-      "front_end/settings/frameworkBlackboxSettingsTab.css",
-      "front_end/settings/module.json",
-      "front_end/settings/settingsScreen.css",
-      "front_end/snippets/module.json",
-      "front_end/source_frame/fontView.css",
-      "front_end/source_frame/imageView.css",
-      "front_end/source_frame/jsonView.css",
-      "front_end/source_frame/messagesPopover.css",
-      "front_end/source_frame/module.json",
-      "front_end/source_frame/resourceSourceFrame.css",
-      "front_end/source_frame/xmlTree.css",
-      "front_end/source_frame/xmlView.css",
-      "front_end/sources/AddSourceMapURLDialog.js",
-      "front_end/sources/breakpointEditDialog.css",
-      "front_end/sources/BreakpointEditDialog.js",
-      "front_end/sources/callStackSidebarPane.css",
-      "front_end/sources/CallStackSidebarPane.js",
-      "front_end/sources/CSSPlugin.js",
-      "front_end/sources/DebuggerPlugin.js",
-      "front_end/sources/CoveragePlugin.js",
-      "front_end/sources/dialog.css",
-      "front_end/sources/debuggerPausedMessage.css",
-      "front_end/sources/DebuggerPausedMessage.js",
-      "front_end/sources/EditingLocationHistoryManager.js",
-      "front_end/sources/FilePathScoreFunction.js",
-      "front_end/sources/FilteredUISourceCodeListProvider.js",
-      "front_end/sources/GoToLineQuickOpen.js",
-      "front_end/sources/GutterDiffPlugin.js",
-      "front_end/sources/InplaceFormatterEditorAction.js",
-      "front_end/sources/javaScriptBreakpointsSidebarPane.css",
-      "front_end/sources/JavaScriptBreakpointsSidebarPane.js",
-      "front_end/sources/JavaScriptCompilerPlugin.js",
-      "front_end/sources/module.json",
-      "front_end/sources/navigatorTree.css",
-      "front_end/sources/navigatorView.css",
-      "front_end/sources/NavigatorView.js",
-      "front_end/sources/OpenFileQuickOpen.js",
-      "front_end/sources/OutlineQuickOpen.js",
-      "front_end/sources/scopeChainSidebarPane.css",
-      "front_end/sources/ScopeChainSidebarPane.js",
-      "front_end/sources/ScriptFormatterEditorAction.js",
-      "front_end/sources/ScriptOriginPlugin.js",
-      "front_end/sources/SearchSourcesView.js",
-      "front_end/sources/SimpleHistoryManager.js",
-      "front_end/sources/SnippetsPlugin.js",
-      "front_end/sources/SourceFormatter.js",
-      "front_end/sources/SourceMapNamesResolver.js",
-      "front_end/sources/SourcesNavigator.js",
-      "front_end/sources/sourcesPanel.css",
-      "front_end/sources/SourcesPanel.js",
-      "front_end/sources/SourcesSearchScope.js",
-      "front_end/sources/sourcesView.css",
-      "front_end/sources/SourcesView.js",
-      "front_end/sources/UISourceCodeFrame.js",
-      "front_end/sources/TabbedEditorContainer.js",
-      "front_end/sources/threadsSidebarPane.css",
-      "front_end/sources/ThreadsSidebarPane.js",
-      "front_end/sources/watchExpressionsSidebarPane.css",
-      "front_end/sources/WatchExpressionsSidebarPane.js",
-      "front_end/sources_test_runner/AutocompleteTestRunner.js",
-      "front_end/sources_test_runner/DebuggerTestRunner.js",
-      "front_end/sources_test_runner/EditorTestRunner.js",
-      "front_end/sources_test_runner/LiveEditTestRunner.js",
-      "front_end/sources_test_runner/SearchTestRunner.js",
-      "front_end/sources_test_runner/SourcesTestRunner.js",
-      "front_end/sources_test_runner/module.json",
-      "front_end/test_runner/module.json",
-      "front_end/text_editor/autocompleteTooltip.css",
-      "front_end/text_editor/cmdevtools.css",
-      "front_end/text_editor/module.json",
-      "front_end/text_utils/module.json",
-      "front_end/timeline_model/module.json",
-      "front_end/timeline/CountersGraph.js",
-      "front_end/timeline/EventsTimelineTreeView.js",
-      "front_end/timeline/ExtensionTracingSession.js",
-      "front_end/timeline/historyToolbarButton.css",
-      "front_end/timeline/invalidationsTree.css",
-      "front_end/timeline/module.json",
-      "front_end/timeline/PerformanceModel.js",
-      "front_end/timeline/TimelineController.js",
-      "front_end/timeline/TimelineDetailsView.js",
-      "front_end/timeline/TimelineEventOverview.js",
-      "front_end/timeline/TimelineFilters.js",
-      "front_end/timeline/TimelineFlameChartDataProvider.js",
-      "front_end/timeline/TimelineFlameChartNetworkDataProvider.js",
-      "front_end/timeline/timelineFlamechartPopover.css",
-      "front_end/timeline/TimelineFlameChartView.js",
-      "front_end/timeline/timelineHistoryManager.css",
-      "front_end/timeline/TimelineHistoryManager.js",
-      "front_end/timeline/TimelineLayersView.js",
-      "front_end/timeline/TimelineLoader.js",
-      "front_end/timeline/timelinePaintProfiler.css",
-      "front_end/timeline/TimelinePaintProfilerView.js",
-      "front_end/timeline/timelinePanel.css",
-      "front_end/timeline/TimelinePanel.js",
-      "front_end/timeline/timelineStatusDialog.css",
-      "front_end/timeline/TimelineTreeView.js",
-      "front_end/timeline/TimelineUIUtils.js",
-      "front_end/timeline/UIDevtoolsController.js",
-      "front_end/timeline/UIDevtoolsUtils.js",
-      "front_end/toolbox_bootstrap/module.json",
-      "front_end/toolbox_bootstrap/Toolbox.js",
-      "front_end/toolbox.js",
-      "front_end/toolbox.json",
-      "front_end/ui/checkboxTextLabel.css",
-      "front_end/ui/closeButton.css",
-      "front_end/ui/confirmDialog.css",
-      "front_end/ui/dialog.css",
-      "front_end/ui/dropTarget.css",
-      "front_end/ui/emptyWidget.css",
-      "front_end/ui/filter.css",
-      "front_end/ui/glassPane.css",
-      "front_end/ui/infobar.css",
-      "front_end/ui/inlineButton.css",
-      "front_end/ui/inspectorCommon.css",
-      "front_end/ui/inspectorStyle.css",
-      "front_end/ui/inspectorSyntaxHighlight.css",
-      "front_end/ui/inspectorSyntaxHighlightDark.css",
-      "front_end/ui/inspectorViewTabbedPane.css",
-      "front_end/ui/listWidget.css",
-      "front_end/ui/module.json",
-      "front_end/ui/popover.css",
-      "front_end/ui/progressIndicator.css",
-      "front_end/ui/radioButton.css",
-      "front_end/ui/reportView.css",
-      "front_end/ui/remoteDebuggingTerminatedScreen.css",
-      "front_end/ui/rootView.css",
-      "front_end/ui/searchableView.css",
-      "front_end/ui/segmentedButton.css",
-      "front_end/ui/slider.css",
-      "front_end/ui/smallBubble.css",
-      "front_end/ui/softContextMenu.css",
-      "front_end/ui/softDropDown.css",
-      "front_end/ui/softDropDownButton.css",
-      "front_end/ui/splitWidget.css",
-      "front_end/ui/suggestBox.css",
-      "front_end/ui/tabbedPane.css",
-      "front_end/ui/targetCrashedScreen.css",
-      "front_end/ui/textButton.css",
-      "front_end/ui/textPrompt.css",
-      "front_end/ui/toolbar.css",
-      "front_end/ui/tooltip.css",
-      "front_end/ui/treeoutline.css",
-      "front_end/ui/viewContainers.css",
-      "front_end/web_audio/audioContextSelector.css",
-      "front_end/web_audio/module.json",
-      "front_end/web_audio/webAudio.css",
-      "front_end/worker_main/WorkerMain.js",
-      "front_end/worker_main/module.json",
-      "front_end/worker_service/module.json",
-      "front_end/worker_service/ServiceDispatcher.js",
-      "front_end/workspace/module.json",
-      "front_end/workspace_diff/module.json",
-    ],
-
-    'lighthouse_locale_files': [
-      "front_end/audits_worker/lighthouse/locales/ar-XB.json",
-      "front_end/audits_worker/lighthouse/locales/ar.json",
-      "front_end/audits_worker/lighthouse/locales/bg.json",
-      "front_end/audits_worker/lighthouse/locales/ca.json",
-      "front_end/audits_worker/lighthouse/locales/cs.json",
-      "front_end/audits_worker/lighthouse/locales/da.json",
-      "front_end/audits_worker/lighthouse/locales/de.json",
-      "front_end/audits_worker/lighthouse/locales/el.json",
-      "front_end/audits_worker/lighthouse/locales/en-GB.json",
-      "front_end/audits_worker/lighthouse/locales/en-US.json",
-      "front_end/audits_worker/lighthouse/locales/en-XA.json",
-      "front_end/audits_worker/lighthouse/locales/en-XL.json",
-      "front_end/audits_worker/lighthouse/locales/es-419.json",
-      "front_end/audits_worker/lighthouse/locales/es.json",
-      "front_end/audits_worker/lighthouse/locales/fi.json",
-      "front_end/audits_worker/lighthouse/locales/fil.json",
-      "front_end/audits_worker/lighthouse/locales/fr.json",
-      "front_end/audits_worker/lighthouse/locales/he.json",
-      "front_end/audits_worker/lighthouse/locales/hi.json",
-      "front_end/audits_worker/lighthouse/locales/hr.json",
-      "front_end/audits_worker/lighthouse/locales/hu.json",
-      "front_end/audits_worker/lighthouse/locales/id.json",
-      "front_end/audits_worker/lighthouse/locales/it.json",
-      "front_end/audits_worker/lighthouse/locales/ja.json",
-      "front_end/audits_worker/lighthouse/locales/ko.json",
-      "front_end/audits_worker/lighthouse/locales/lt.json",
-      "front_end/audits_worker/lighthouse/locales/lv.json",
-      "front_end/audits_worker/lighthouse/locales/nl.json",
-      "front_end/audits_worker/lighthouse/locales/no.json",
-      "front_end/audits_worker/lighthouse/locales/pl.json",
-      "front_end/audits_worker/lighthouse/locales/pt-PT.json",
-      "front_end/audits_worker/lighthouse/locales/pt.json",
-      "front_end/audits_worker/lighthouse/locales/ro.json",
-      "front_end/audits_worker/lighthouse/locales/ru.json",
-      "front_end/audits_worker/lighthouse/locales/sk.json",
-      "front_end/audits_worker/lighthouse/locales/sl.json",
-      "front_end/audits_worker/lighthouse/locales/sr-Latn.json",
-      "front_end/audits_worker/lighthouse/locales/sr.json",
-      "front_end/audits_worker/lighthouse/locales/sv.json",
-      "front_end/audits_worker/lighthouse/locales/ta.json",
-      "front_end/audits_worker/lighthouse/locales/te.json",
-      "front_end/audits_worker/lighthouse/locales/th.json",
-      "front_end/audits_worker/lighthouse/locales/tr.json",
-      "front_end/audits_worker/lighthouse/locales/uk.json",
-      "front_end/audits_worker/lighthouse/locales/vi.json",
-      "front_end/audits_worker/lighthouse/locales/zh-HK.json",
-      "front_end/audits_worker/lighthouse/locales/zh-TW.json",
-      "front_end/audits_worker/lighthouse/locales/zh.json",
-    ],
-
-    # TODO: all_devtools_files += lighthouse_locale_files
-    # (Not important since Cobalt doesn't need lighthouse)
-
-    'all_devtools_modules': [
-      "front_end/cobalt/cobalt.js",
-      "front_end/network/network.js",
-      "front_end/network/SignedExchangeInfoView.js",
-      "front_end/network/ResourceWebSocketFrameView.js",
-      "front_end/network/RequestTimingView.js",
-      "front_end/network/RequestResponseView.js",
-      "front_end/network/RequestPreviewView.js",
-      "front_end/network/RequestInitiatorView.js",
-      "front_end/network/RequestHeadersView.js",
-      "front_end/network/RequestHTMLView.js",
-      "front_end/network/RequestCookiesView.js",
-      "front_end/network/NetworkWaterfallColumn.js",
-      "front_end/network/NetworkTimeCalculator.js",
-      "front_end/network/NetworkSearchScope.js",
-      "front_end/network/NetworkPanel.js",
-      "front_end/network/NetworkOverview.js",
-      "front_end/network/NetworkManageCustomHeadersView.js",
-      "front_end/network/NetworkLogViewColumns.js",
-      "front_end/network/NetworkLogView.js",
-      "front_end/network/NetworkItemView.js",
-      "front_end/network/NetworkFrameGrouper.js",
-      "front_end/network/NetworkDataGridNode.js",
-      "front_end/network/NetworkConfigView.js",
-      "front_end/network/HARWriter.js",
-      "front_end/network/EventSourceMessagesView.js",
-      "front_end/network/BlockedURLsPane.js",
-      "front_end/network/BinaryResourceView.js",
-      "front_end/test_runner/test_runner.js",
-      "front_end/test_runner/TestRunner.js",
-      "front_end/emulation/emulation.js",
-      "front_end/emulation/SensorsView.js",
-      "front_end/emulation/MediaQueryInspector.js",
-      "front_end/emulation/InspectedPagePlaceholder.js",
-      "front_end/emulation/GeolocationsSettingsTab.js",
-      "front_end/emulation/EmulatedDevices.js",
-      "front_end/emulation/DevicesSettingsTab.js",
-      "front_end/emulation/DeviceModeWrapper.js",
-      "front_end/emulation/DeviceModeView.js",
-      "front_end/emulation/DeviceModeToolbar.js",
-      "front_end/emulation/DeviceModeModel.js",
-      "front_end/emulation/AdvancedApp.js",
-      "front_end/inspector_main/inspector_main.js",
-      "front_end/inspector_main/RenderingOptions.js",
-      "front_end/inspector_main/InspectorMain.js",
-      "front_end/js_main/js_main.js",
-      "front_end/js_main/JsMain.js",
-      "front_end/search/search.js",
-      "front_end/search/SearchView.js",
-      "front_end/search/SearchResultsPane.js",
-      "front_end/search/SearchConfig.js",
-      "front_end/screencast/screencast.js",
-      "front_end/screencast/ScreencastView.js",
-      "front_end/screencast/ScreencastApp.js",
-      "front_end/screencast/InputModel.js",
-      "front_end/performance_monitor/performance_monitor.js",
-      "front_end/performance_monitor/PerformanceMonitor.js",
-      "front_end/main/main.js",
-      "front_end/main/SimpleApp.js",
-      "front_end/main/MainImpl.js",
-      "front_end/main/ExecutionContextSelector.js",
-      "front_end/snippets/snippets.js",
-      "front_end/snippets/SnippetsQuickOpen.js",
-      "front_end/snippets/ScriptSnippetFileSystem.js",
-      "front_end/settings/settings.js",
-      "front_end/settings/SettingsScreen.js",
-      "front_end/settings/FrameworkBlackboxSettingsTab.js",
-      "front_end/security/security.js",
-      "front_end/security/SecurityPanel.js",
-      "front_end/security/SecurityModel.js",
-      # "front_end/web_audio/web_audio.js",
-      # "front_end/web_audio/graph_visualizer/Types.js",
-      # "front_end/web_audio/graph_visualizer/GraphStyle.js",
-      # "front_end/web_audio/graph_visualizer/GraphManager.js",
-      # "front_end/web_audio/graph_visualizer/NodeRendererUtility.js",
-      # "front_end/web_audio/graph_visualizer/NodeView.js",
-      # "front_end/web_audio/graph_visualizer/EdgeView.js",
-      # "front_end/web_audio/graph_visualizer/GraphView.js",
-      # "front_end/web_audio/WebAudioView.js",
-      # "front_end/web_audio/WebAudioModel.js",
-      # "front_end/web_audio/AudioContextSelector.js",
-      # "front_end/web_audio/AudioContextContentBuilder.js",
-      "front_end/javascript_metadata/javascript_metadata.js",
-      "front_end/javascript_metadata/NativeFunctions.js",
-      "front_end/javascript_metadata/JavaScriptMetadata.js",
-      "front_end/har_importer/har_importer.js",
-      "front_end/har_importer/HARImporter.js",
-      "front_end/har_importer/HARFormat.js",
-      "front_end/browser_debugger/browser_debugger.js",
-      "front_end/browser_debugger/XHRBreakpointsSidebarPane.js",
-      "front_end/browser_debugger/ObjectEventListenersSidebarPane.js",
-      "front_end/browser_debugger/EventListenerBreakpointsSidebarPane.js",
-      "front_end/browser_debugger/DOMBreakpointsSidebarPane.js",
-      "front_end/layer_viewer/layer_viewer.js",
-      "front_end/layer_viewer/TransformController.js",
-      "front_end/layer_viewer/PaintProfilerView.js",
-      "front_end/layer_viewer/Layers3DView.js",
-      "front_end/layer_viewer/LayerViewHost.js",
-      "front_end/layer_viewer/LayerTreeOutline.js",
-      "front_end/layer_viewer/LayerDetailsView.js",
-      "front_end/cm_web_modes/cm_web_modes.js",
-      "front_end/cm_web_modes/cm_web_modes_cm.js",
-      "front_end/cm_web_modes/cm_web_modes_headless.js",
-      "front_end/cm_web_modes/css.js",
-      "front_end/cm_web_modes/javascript.js",
-      "front_end/cm_web_modes/xml.js",
-      "front_end/cm_web_modes/htmlmixed.js",
-      "front_end/cm_web_modes/htmlembedded.js",
-      "front_end/text_editor/text_editor.js",
-      "front_end/text_editor/TextEditorAutocompleteController.js",
-      "front_end/text_editor/CodeMirrorUtils.js",
-      "front_end/text_editor/CodeMirrorTextEditor.js",
-      "front_end/quick_open/quick_open.js",
-      "front_end/quick_open/QuickOpen.js",
-      "front_end/quick_open/HelpQuickOpen.js",
-      "front_end/quick_open/FilteredListWidget.js",
-      "front_end/quick_open/CommandMenu.js",
-      "front_end/elements/elements.js",
-      "front_end/elements/elements-legacy.js",
-      "front_end/elements/StylesSidebarPane.js",
-      "front_end/elements/StylePropertyTreeElement.js",
-      "front_end/elements/StylePropertyHighlighter.js",
-      "front_end/elements/PropertiesWidget.js",
-      "front_end/elements/PlatformFontsWidget.js",
-      "front_end/elements/NodeStackTraceWidget.js",
-      "front_end/elements/MetricsSidebarPane.js",
-      "front_end/elements/MarkerDecorator.js",
-      "front_end/elements/InspectElementModeController.js",
-      "front_end/elements/EventListenersWidget.js",
-      "front_end/elements/ElementsTreeOutline.js",
-      "front_end/elements/ElementsTreeElement.js",
-      "front_end/elements/ElementsTreeElementHighlighter.js",
-      "front_end/elements/ElementStatePaneWidget.js",
-      "front_end/elements/ElementsSidebarPane.js",
-      "front_end/elements/ElementsPanel.js",
-      "front_end/elements/ElementsBreadcrumbs.js",
-      "front_end/elements/DOMPath.js",
-      "front_end/elements/DOMLinkifier.js",
-      "front_end/elements/ComputedStyleWidget.js",
-      "front_end/elements/ComputedStyleModel.js",
-      "front_end/elements/ColorSwatchPopoverIcon.js",
-      "front_end/elements/ClassesPaneWidget.js",
-      "front_end/timeline_model/timeline_model.js",
-      "front_end/timeline_model/TracingLayerTree.js",
-      "front_end/timeline_model/TimelineProfileTree.js",
-      "front_end/timeline_model/TimelineModel.js",
-      "front_end/timeline_model/TimelineModelFilter.js",
-      "front_end/timeline_model/TimelineJSProfile.js",
-      "front_end/timeline_model/TimelineIRModel.js",
-      "front_end/timeline_model/TimelineFrameModel.js",
-      "front_end/help/help.js",
-      "front_end/help/ReleaseNoteView.js",
-      "front_end/help/ReleaseNoteText.js",
-      "front_end/help/HelpImpl.js",
-      "front_end/workspace_diff/workspace_diff.js",
-      "front_end/workspace_diff/WorkspaceDiff.js",
-      "front_end/mobile_throttling/mobile_throttling.js",
-      "front_end/mobile_throttling/ThrottlingSettingsTab.js",
-      "front_end/mobile_throttling/ThrottlingPresets.js",
-      "front_end/mobile_throttling/ThrottlingManager.js",
-      "front_end/mobile_throttling/NetworkThrottlingSelector.js",
-      "front_end/mobile_throttling/NetworkPanelIndicator.js",
-      "front_end/mobile_throttling/MobileThrottlingSelector.js",
-      "front_end/event_listeners/event_listeners.js",
-      "front_end/event_listeners/EventListenersView.js",
-      "front_end/event_listeners/EventListenersUtils.js",
-      # "front_end/layers/layers.js",
-      # "front_end/layers/LayersPanel.js",
-      # "front_end/layers/LayerTreeModel.js",
-      # "front_end/layers/LayerPaintProfilerView.js",
-      "front_end/object_ui/object_ui.js",
-      "front_end/object_ui/RemoteObjectPreviewFormatter.js",
-      "front_end/object_ui/ObjectPropertiesSection.js",
-      "front_end/object_ui/ObjectPopoverHelper.js",
-      "front_end/object_ui/JavaScriptREPL.js",
-      "front_end/object_ui/JavaScriptAutocomplete.js",
-      "front_end/object_ui/CustomPreviewComponent.js",
-      "front_end/cookie_table/cookie_table.js",
-      "front_end/cookie_table/CookiesTable.js",
-      "front_end/cm_modes/cm_modes.js",
-      "front_end/cm_modes/DefaultCodeMirrorMimeMode.js",
-      "front_end/cm_modes/clike.js",
-      "front_end/cm_modes/coffeescript.js",
-      "front_end/cm_modes/php.js",
-      "front_end/cm_modes/python.js",
-      "front_end/cm_modes/shell.js",
-      "front_end/cm_modes/livescript.js",
-      "front_end/cm_modes/markdown.js",
-      "front_end/cm_modes/clojure.js",
-      "front_end/cm_modes/jsx.js",
-      # "front_end/coverage/coverage.js",
-      # "front_end/coverage/CoverageView.js",
-      # "front_end/coverage/CoverageModel.js",
-      # "front_end/coverage/CoverageListView.js",
-      # "front_end/coverage/CoverageDecorationManager.js",
-      "front_end/css_overview/css_overview.js",
-      "front_end/css_overview/CSSOverviewUnusedDeclarations.js",
-      "front_end/css_overview/CSSOverviewStartView.js",
-      "front_end/css_overview/CSSOverviewSidebarPanel.js",
-      "front_end/css_overview/CSSOverviewProcessingView.js",
-      "front_end/css_overview/CSSOverviewPanel.js",
-      "front_end/css_overview/CSSOverviewModel.js",
-      "front_end/css_overview/CSSOverviewController.js",
-      "front_end/css_overview/CSSOverviewCompletedView.js",
-      # "front_end/audits/audits.js",
-      # "front_end/audits/lighthouse/report-generator.js",
-      # "front_end/audits/lighthouse/report.js",
-      # "front_end/audits/RadioSetting.js",
-      # "front_end/audits/AuditsStatusView.js",
-      # "front_end/audits/AuditsStartView.js",
-      # "front_end/audits/AuditsReportSelector.js",
-      # "front_end/audits/AuditsReportRenderer.js",
-      # "front_end/audits/AuditsProtocolService.js",
-      # "front_end/audits/AuditsPanel.js",
-      # "front_end/audits/AuditsController.js",
-      "front_end/console/console.js",
-      "front_end/console/ConsoleContextSelector.js",
-      "front_end/console/ConsoleFilter.js",
-      "front_end/console/ConsoleSidebar.js",
-      "front_end/console/ConsolePanel.js",
-      "front_end/console/ConsolePinPane.js",
-      "front_end/console/ConsolePrompt.js",
-      "front_end/console/ConsoleView.js",
-      "front_end/console/ConsoleViewMessage.js",
-      "front_end/console/ConsoleViewport.js",
-      # "front_end/animation/animation.js",
-      # "front_end/animation/AnimationUI.js",
-      # "front_end/animation/AnimationTimeline.js",
-      # "front_end/animation/AnimationScreenshotPopover.js",
-      # "front_end/animation/AnimationModel.js",
-      # "front_end/animation/AnimationGroupPreviewUI.js",
-      # "front_end/changes/changes.js",
-      # "front_end/changes/ChangesView.js",
-      # "front_end/changes/ChangesSidebar.js",
-      # "front_end/changes/ChangesHighlighter.js",
-      "front_end/source_frame/source_frame.js",
-      "front_end/source_frame/XMLView.js",
-      "front_end/source_frame/SourcesTextEditor.js",
-      "front_end/source_frame/SourceFrame.js",
-      "front_end/source_frame/source_frame.js",
-      "front_end/source_frame/SourceCodeDiff.js",
-      "front_end/source_frame/ResourceSourceFrame.js",
-      "front_end/source_frame/PreviewFactory.js",
-      "front_end/source_frame/JSONView.js",
-      "front_end/source_frame/ImageView.js",
-      "front_end/source_frame/FontView.js",
-      "front_end/source_frame/BinaryResourceViewFactory.js",
-      "front_end/inline_editor/inline_editor.js",
-      "front_end/inline_editor/SwatchPopoverHelper.js",
-      "front_end/inline_editor/CSSShadowModel.js",
-      "front_end/inline_editor/CSSShadowEditor.js",
-      "front_end/inline_editor/ColorSwatch.js",
-      "front_end/inline_editor/BezierUI.js",
-      "front_end/inline_editor/BezierEditor.js",
-      "front_end/diff/diff.js",
-      "front_end/diff/diff_match_patch.js",
-      "front_end/diff/DiffWrapper.js",
-      "front_end/formatter/formatter.js",
-      "front_end/formatter/ScriptFormatter.js",
-      "front_end/formatter/FormatterWorkerPool.js",
-      "front_end/color_picker/color_picker.js",
-      "front_end/color_picker/Spectrum.js",
-      "front_end/color_picker/ContrastOverlay.js",
-      "front_end/color_picker/ContrastInfo.js",
-      "front_end/color_picker/ContrastDetails.js",
-      "front_end/cm/cm.js",
-      "front_end/cm/active-line.js",
-      "front_end/cm/brace-fold.js",
-      "front_end/cm/closebrackets.js",
-      "front_end/cm/codemirror.js",
-      "front_end/cm/comment.js",
-      "front_end/cm/foldcode.js",
-      "front_end/cm/foldgutter.js",
-      "front_end/cm/mark-selection.js",
-      "front_end/cm/matchbrackets.js",
-      "front_end/cm/multiplex.js",
-      "front_end/cm/overlay.js",
-      "front_end/formatter_worker.unbundled.js",
-      "front_end/heap_snapshot_worker.unbundled.js",
-      "front_end/heap_snapshot_model/heap_snapshot_model.js",
-      "front_end/heap_snapshot_model/HeapSnapshotModel.js",
-      "front_end/heap_snapshot_worker/heap_snapshot_worker.js",
-      "front_end/heap_snapshot_worker/AllocationProfile.js",
-      "front_end/heap_snapshot_worker/HeapSnapshot.js",
-      "front_end/heap_snapshot_worker/HeapSnapshotLoader.js",
-      "front_end/heap_snapshot_worker/HeapSnapshotWorker.js",
-      "front_end/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.js",
-      "front_end/text_utils/text_utils.js",
-      "front_end/text_utils/TextUtils.js",
-      "front_end/text_utils/TextRange.js",
-      "front_end/text_utils/Text.js",
-      "front_end/formatter_worker/formatter_worker.js",
-      "front_end/formatter_worker/RelaxedJSONParser.js",
-      "front_end/formatter_worker/JavaScriptOutline.js",
-      "front_end/formatter_worker/JavaScriptFormatter.js",
-      "front_end/formatter_worker/IdentityFormatter.js",
-      "front_end/formatter_worker/HTMLFormatter.js",
-      "front_end/formatter_worker/FormatterWorker.js",
-      "front_end/formatter_worker/FormattedContentBuilder.js",
-      "front_end/formatter_worker/ESTreeWalker.js",
-      "front_end/formatter_worker/CSSRuleParser.js",
-      "front_end/formatter_worker/CSSFormatter.js",
-      "front_end/formatter_worker/AcornTokenizer.js",
-      "front_end/cm_headless/cm_headless.js",
-      "front_end/cm_headless/headlesscodemirror.js",
-      "front_end/data_grid/data_grid.js",
-      "front_end/data_grid/ViewportDataGrid.js",
-      "front_end/data_grid/SortableDataGrid.js",
-      "front_end/data_grid/ShowMoreDataGridNode.js",
-      "front_end/data_grid/DataGrid.js",
-      # "front_end/accessibility/accessibility.js",
-      # "front_end/accessibility/AccessibilityStrings.js",
-      # "front_end/accessibility/AccessibilitySidebarView.js",
-      # "front_end/accessibility/AccessibilityNodeView.js",
-      # "front_end/accessibility/AccessibilityModel.js",
-      # "front_end/accessibility/AXBreadcrumbsPane.js",
-      # "front_end/accessibility/ARIAMetadata.js",
-      # "front_end/accessibility/ARIAAttributesView.js",
-      "front_end/protocol_monitor/protocol_monitor.js",
-      "front_end/protocol_monitor/ProtocolMonitor.js",
-      "front_end/console_counters/console_counters.js",
-      "front_end/console_counters/WarningErrorCounter.js",
-      "front_end/extensions/extensions.js",
-      "front_end/extensions/ExtensionAPI.js",
-      "front_end/extensions/ExtensionPanel.js",
-      "front_end/extensions/ExtensionServer.js",
-      "front_end/extensions/ExtensionTraceProvider.js",
-      "front_end/extensions/ExtensionView.js",
-      "front_end/browser_sdk/browser_sdk.js",
-      "front_end/browser_sdk/LogManager.js",
-      "front_end/persistence/persistence.js",
-      "front_end/persistence/WorkspaceSettingsTab.js",
-      "front_end/persistence/PlatformFileSystem.js",
-      "front_end/persistence/PersistenceUtils.js",
-      "front_end/persistence/PersistenceImpl.js",
-      "front_end/persistence/PersistenceActions.js",
-      "front_end/persistence/NetworkPersistenceManager.js",
-      "front_end/persistence/IsolatedFileSystemManager.js",
-      "front_end/persistence/IsolatedFileSystem.js",
-      "front_end/persistence/FileSystemWorkspaceBinding.js",
-      "front_end/persistence/EditFileSystemView.js",
-      "front_end/persistence/Automapping.js",
-      "front_end/components/components.js",
-      "front_end/components/TargetDetachedDialog.js",
-      "front_end/components/Reload.js",
-      "front_end/components/Linkifier.js",
-      "front_end/components/JSPresentationUtils.js",
-      "front_end/components/ImagePreview.js",
-      "front_end/components/DockController.js",
-      "front_end/bindings/bindings.js",
-      "front_end/bindings/TempFile.js",
-      "front_end/bindings/StylesSourceMapping.js",
-      "front_end/bindings/SASSSourceMapping.js",
-      "front_end/bindings/ResourceUtils.js",
-      "front_end/bindings/ResourceScriptMapping.js",
-      "front_end/bindings/ResourceMapping.js",
-      "front_end/bindings/PresentationConsoleMessageHelper.js",
-      "front_end/bindings/NetworkProject.js",
-      "front_end/bindings/LiveLocation.js",
-      "front_end/bindings/FileUtils.js",
-      "front_end/bindings/DefaultScriptMapping.js",
-      "front_end/bindings/DebuggerWorkspaceBinding.js",
-      "front_end/bindings/CSSWorkspaceBinding.js",
-      "front_end/bindings/ContentProviderBasedProject.js",
-      "front_end/bindings/CompilerScriptMapping.js",
-      "front_end/bindings/BreakpointManager.js",
-      "front_end/bindings/BlackboxManager.js",
-      "front_end/workspace/workspace.js",
-      "front_end/workspace/WorkspaceImpl.js",
-      "front_end/workspace/UISourceCode.js",
-      "front_end/workspace/FileManager.js",
-      "front_end/services/services.js",
-      "front_end/services/ServiceManager.js",
-      "front_end/sdk/sdk.js",
-      "front_end/sdk/TracingModel.js",
-      "front_end/sdk/TracingManager.js",
-      "front_end/sdk/TargetManager.js",
-      "front_end/sdk/Target.js",
-      "front_end/sdk/SourceMapManager.js",
-      "front_end/sdk/SourceMap.js",
-      "front_end/sdk/ServiceWorkerManager.js",
-      "front_end/sdk/ServiceWorkerCacheModel.js",
-      "front_end/sdk/ServerTiming.js",
-      "front_end/sdk/SecurityOriginManager.js",
-      "front_end/sdk/SDKModel.js",
-      "front_end/sdk/Script.js",
-      "front_end/sdk/ScreenCaptureModel.js",
-      "front_end/sdk/RuntimeModel.js",
-      "front_end/sdk/ResourceTreeModel.js",
-      "front_end/sdk/Resource.js",
-      "front_end/sdk/RemoteObject.js",
-      "front_end/sdk/ProfileTreeModel.js",
-      "front_end/sdk/IssuesModel.js",
-      "front_end/sdk/PerformanceMetricsModel.js",
-      "front_end/sdk/PaintProfiler.js",
-      "front_end/sdk/OverlayModel.js",
-      "front_end/sdk/NetworkRequest.js",
-      "front_end/sdk/NetworkManager.js",
-      "front_end/sdk/NetworkLog.js",
-      "front_end/sdk/LogModel.js",
-      "front_end/sdk/LayerTreeBase.js",
-      "front_end/sdk/IsolateManager.js",
-      "front_end/sdk/HeapProfilerModel.js",
-      "front_end/sdk/HARLog.js",
-      "front_end/sdk/FilmStripModel.js",
-      "front_end/sdk/EmulationModel.js",
-      "front_end/sdk/DOMModel.js",
-      "front_end/sdk/DOMDebuggerModel.js",
-      "front_end/sdk/DebuggerModel.js",
-      "front_end/sdk/CSSStyleSheetHeader.js",
-      "front_end/sdk/CSSStyleDeclaration.js",
-      "front_end/sdk/CSSRule.js",
-      "front_end/sdk/CSSProperty.js",
-      "front_end/sdk/CSSModel.js",
-      "front_end/sdk/CSSMetadata.js",
-      "front_end/sdk/CSSMedia.js",
-      "front_end/sdk/CSSMatchedStyles.js",
-      "front_end/sdk/CPUProfilerModel.js",
-      "front_end/sdk/CPUProfileDataModel.js",
-      "front_end/sdk/CookieParser.js",
-      "front_end/sdk/CookieModel.js",
-      "front_end/sdk/CompilerSourceMappingContentProvider.js",
-      "front_end/sdk/ConsoleModel.js",
-      "front_end/sdk/Connections.js",
-      "front_end/sdk/ChildTargetManager.js",
-      # "front_end/sdk/wasm_source_map/pkg/wasm_source_map.js",
-      "front_end/protocol/protocol.js",
-      "front_end/protocol/NodeURL.js",
-      "front_end/protocol/InspectorBackend.js",
-      "front_end/host/host.js",
-      "front_end/host/UserMetrics.js",
-      "front_end/host/ResourceLoader.js",
-      "front_end/host/Platform.js",
-      "front_end/host/InspectorFrontendHost.js",
-      "front_end/host/InspectorFrontendHostAPI.js",
-      "front_end/dom_extension/DOMExtension.js",
-      "front_end/dom_extension/dom_extension.js",
-      "front_end/root.js",
-      "front_end/Runtime.js",
-      "front_end/platform/utilities.js",
-      "front_end/platform/platform.js",
-      "front_end/ui/ARIAUtils.js",
-      "front_end/ui/ZoomManager.js",
-      "front_end/ui/XWidget.js",
-      "front_end/ui/XLink.js",
-      "front_end/ui/XElement.js",
-      "front_end/ui/Widget.js",
-      "front_end/ui/View.js",
-      "front_end/ui/ViewManager.js",
-      "front_end/ui/UIUtils.js",
-      "front_end/ui/ui.js",
-      "front_end/ui/Treeoutline.js",
-      "front_end/ui/Tooltip.js",
-      "front_end/ui/Toolbar.js",
-      "front_end/ui/ThrottledWidget.js",
-      "front_end/ui/TextPrompt.js",
-      "front_end/ui/TextEditor.js",
-      "front_end/ui/TargetCrashedScreen.js",
-      "front_end/ui/TabbedPane.js",
-      "front_end/ui/SyntaxHighlighter.js",
-      "front_end/ui/SuggestBox.js",
-      "front_end/ui/SplitWidget.js",
-      "front_end/ui/SoftDropDown.js",
-      "front_end/ui/SoftContextMenu.js",
-      "front_end/ui/ShortcutsScreen.js",
-      "front_end/ui/ShortcutRegistry.js",
-      "front_end/ui/SettingsUI.js",
-      "front_end/ui/SegmentedButton.js",
-      "front_end/ui/SearchableView.js",
-      "front_end/ui/RootView.js",
-      "front_end/ui/ResizerWidget.js",
-      "front_end/ui/ReportView.js",
-      "front_end/ui/RemoteDebuggingTerminatedScreen.js",
-      "front_end/ui/ProgressIndicator.js",
-      "front_end/ui/PopoverHelper.js",
-      "front_end/ui/Panel.js",
-      "front_end/ui/ListWidget.js",
-      "front_end/ui/ListModel.js",
-      "front_end/ui/ListControl.js",
-      "front_end/ui/KeyboardShortcut.js",
-      "front_end/ui/InspectorView.js",
-      "front_end/ui/InplaceEditor.js",
-      "front_end/ui/Infobar.js",
-      "front_end/ui/Icon.js",
-      "front_end/ui/HistoryInput.js",
-      "front_end/ui/GlassPane.js",
-      "front_end/ui/Geometry.js",
-      "front_end/ui/Fragment.js",
-      "front_end/ui/ForwardedInputEventHandler.js",
-      "front_end/ui/FilterSuggestionBuilder.js",
-      "front_end/ui/FilterBar.js",
-      "front_end/ui/EmptyWidget.js",
-      "front_end/ui/DropTarget.js",
-      "front_end/ui/Dialog.js",
-      "front_end/ui/ContextMenu.js",
-      "front_end/ui/Context.js",
-      "front_end/ui/ARIAUtils.js",
-      "front_end/ui/ActionRegistry.js",
-      "front_end/ui/Action.js",
-      "front_end/ui/ActionDelegate.js",
-      "front_end/ui/ContextFlavorListener.js",
-      "front_end/root.js",
-      "front_end/common/common.js",
-      "front_end/common/common-legacy.js",
-      "front_end/common/App.js",
-      "front_end/common/AppProvider.js",
-      "front_end/common/CharacterIdMap.js",
-      "front_end/common/Color.js",
-      "front_end/common/ContentProvider.js",
-      "front_end/common/EventTarget.js",
-      "front_end/common/JavaScriptMetaData.js",
-      "front_end/common/Linkifier.js",
-      "front_end/common/Object.js",
-      "front_end/common/Console.js",
-      "front_end/common/ParsedURL.js",
-      "front_end/common/Progress.js",
-      "front_end/common/QueryParamHandler.js",
-      "front_end/common/ResourceType.js",
-      "front_end/common/Revealer.js",
-      "front_end/common/Runnable.js",
-      "front_end/common/SegmentedRange.js",
-      "front_end/common/Settings.js",
-      "front_end/common/StaticContentProvider.js",
-      "front_end/common/StringOutputStream.js",
-      "front_end/common/TextDictionary.js",
-      "front_end/common/Throttler.js",
-      "front_end/common/Trie.js",
-      "front_end/common/UIString.js",
-      "front_end/common/Worker.js",
-    ],
-
-    'devtools_test_files': [
-      # "//third_party/axe-core/axe.js",
-      "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js",
-      "front_end/accessibility_test_runner/module.json",
-      "front_end/application_test_runner/AppcacheTestRunner.js",
-      "front_end/application_test_runner/CacheStorageTestRunner.js",
-      "front_end/application_test_runner/IndexedDBTestRunner.js",
-      "front_end/application_test_runner/module.json",
-      "front_end/application_test_runner/ResourcesTestRunner.js",
-      "front_end/application_test_runner/ResourceTreeTestRunner.js",
-      "front_end/application_test_runner/ServiceWorkersTestRunner.js",
-      "front_end/audits_test_runner/AuditsTestRunner.js",
-      "front_end/audits_test_runner/module.json",
-      "front_end/axe_core_test_runner/AxeCoreTestRunner.js",
-      "front_end/axe_core_test_runner/module.json",
-      "front_end/bindings_test_runner/AutomappingTestRunner.js",
-      "front_end/bindings_test_runner/BindingsTestRunner.js",
-      "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js",
-      "front_end/bindings_test_runner/module.json",
-      "front_end/bindings_test_runner/OverridesTestRunner.js",
-      "front_end/bindings_test_runner/PersistenceTestRunner.js",
-      "front_end/console_test_runner/ConsoleTestRunner.js",
-      "front_end/console_test_runner/module.json",
-      "front_end/coverage_test_runner/CoverageTestRunner.js",
-      "front_end/coverage_test_runner/module.json",
-      "front_end/cpu_profiler_test_runner/module.json",
-      "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js",
-      "front_end/data_grid_test_runner/DataGridTestRunner.js",
-      "front_end/data_grid_test_runner/module.json",
-      "front_end/device_mode_test_runner/DeviceModeTestRunner.js",
-      "front_end/device_mode_test_runner/module.json",
-      "front_end/elements_test_runner/EditDOMTestRunner.js",
-      "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js",
-      "front_end/elements_test_runner/ElementsTestRunner.js",
-      "front_end/elements_test_runner/module.json",
-      "front_end/elements_test_runner/SetOuterHTMLTestRunner.js",
-      "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js",
-      "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js",
-      "front_end/extensions_test_runner/ExtensionsTestRunner.js",
-      "front_end/extensions_test_runner/module.json",
-      "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js",
-      "front_end/heap_profiler_test_runner/module.json",
-      "front_end/integration_test_runner.html",
-      "front_end/integration_test_runner.js",
-      "front_end/integration_test_runner.json",
-      "front_end/layers_test_runner/LayersTestRunner.js",
-      "front_end/layers_test_runner/module.json",
-      "front_end/network_test_runner/module.json",
-      "front_end/network_test_runner/NetworkTestRunner.js",
-      "front_end/performance_test_runner/module.json",
-      "front_end/performance_test_runner/TimelineDataTestRunner.js",
-      "front_end/performance_test_runner/TimelineTestRunner.js",
-      "front_end/sdk_test_runner/module.json",
-      "front_end/sdk_test_runner/PageMockTestRunner.js",
-      "front_end/security_test_runner/module.json",
-      "front_end/security_test_runner/SecurityTestRunner.js",
-      "front_end/sources_test_runner/AutocompleteTestRunner.js",
-      "front_end/sources_test_runner/DebuggerTestRunner.js",
-      "front_end/sources_test_runner/EditorTestRunner.js",
-      "front_end/sources_test_runner/LiveEditTestRunner.js",
-      "front_end/sources_test_runner/module.json",
-      "front_end/sources_test_runner/SearchTestRunner.js",
-      "front_end/sources_test_runner/SourcesTestRunner.js",
-      "front_end/test_runner/module.json",
-    ],
-
-    'devtools_embedder_scripts': [
-      "front_end/devtools_compatibility.js",
-      "front_end/Tests.js",
-    ],
-
-    'devtools_emulated_devices_images': [
-      "front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png",
-      "front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png",
-      "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png",
-      "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png",
-      "front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png",
-      "front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png",
-      "front_end/emulated_devices/google-nexus-5-vertical-default-1x.png",
-      "front_end/emulated_devices/google-nexus-5-vertical-default-2x.png",
-      "front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png",
-      "front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png",
-      "front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png",
-      "front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png",
-      "front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png",
-      "front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png",
-      "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png",
-      "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png",
-      "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png",
-      "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png",
-      "front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png",
-      "front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png",
-      "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png",
-      "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png",
-      "front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png",
-      "front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png",
-      "front_end/emulated_devices/iPad-landscape.svg",
-      "front_end/emulated_devices/iPad-portrait.svg",
-      "front_end/emulated_devices/iPhone5-landscape.svg",
-      "front_end/emulated_devices/iPhone5-portrait.svg",
-      "front_end/emulated_devices/iPhone6-landscape.svg",
-      "front_end/emulated_devices/iPhone6-portrait.svg",
-      "front_end/emulated_devices/iPhone6Plus-landscape.svg",
-      "front_end/emulated_devices/iPhone6Plus-portrait.svg",
-      "front_end/emulated_devices/Nexus5X-landscape.svg",
-      "front_end/emulated_devices/Nexus5X-portrait.svg",
-      "front_end/emulated_devices/Nexus6P-landscape.svg",
-      "front_end/emulated_devices/Nexus6P-portrait.svg",
-    ],
-
-    # Find actually referenced images in compiled release code with:
-    # grep -r Images/ | sed "s/[()']/\n/g" | grep Images/ | sort | uniq
-
-    'devtools_image_files': [
-      # "front_end/Images/accelerometer-back.svg",
-      # "front_end/Images/accelerometer-bottom.png",
-      # "front_end/Images/accelerometer-front.svg",
-      # "front_end/Images/accelerometer-left.png",
-      # "front_end/Images/accelerometer-right.png",
-      # "front_end/Images/accelerometer-top.png",
-      # "front_end/Images/audits_logo.svg",
-      "front_end/Images/breakpoint.svg",
-      "front_end/Images/breakpointConditional.svg",
-      "front_end/Images/checkboxCheckmark.svg",
-      "front_end/Images/checker.png",
-      "front_end/Images/chevrons.svg",
-      # "front_end/Images/chromeDisabledSelect.png",
-      # "front_end/Images/chromeDisabledSelect_2x.png",
-      # "front_end/Images/chromeLeft.png",
-      # "front_end/Images/chromeMiddle.png",
-      # "front_end/Images/chromeRight.png",
-      "front_end/Images/chromeSelect.png",
-      "front_end/Images/chromeSelect_2x.png",
-      "front_end/Images/cssoverview_icons_2x.png",
-      "front_end/Images/errorWave.svg",
-      "front_end/Images/ic_info_black_18dp.svg",
-      "front_end/Images/ic_warning_black_18dp.svg",
-      "front_end/Images/largeIcons.svg",
-      "front_end/Images/mediumIcons.svg",
-      # "front_end/Images/navigationControls.png",
-      # "front_end/Images/navigationControls_2x.png",
-      # "front_end/Images/nodeIcon.png",
-      "front_end/Images/popoverArrows.png",
-      "front_end/Images/profileGroupIcon.png",
-      "front_end/Images/profileIcon.png",
-      "front_end/Images/profileSmallIcon.png",
-      "front_end/Images/radioDot.png",
-      # "front_end/Images/resizeDiagonal.png",
-      # "front_end/Images/resizeDiagonal_2x.png",
-      # "front_end/Images/resizeHorizontal.png",
-      # "front_end/Images/resizeHorizontal_2x.png",
-      # "front_end/Images/resizeVertical.png",
-      # "front_end/Images/resizeVertical_2x.png",
-      "front_end/Images/resourceCSSIcon.png",
-      "front_end/Images/resourceDocumentIcon.png",
-      "front_end/Images/resourceDocumentIconSmall.png",
-      "front_end/Images/resourceJSIcon.png",
-      "front_end/Images/resourcePlainIcon.png",
-      "front_end/Images/resourcePlainIconSmall.png",
-      # "front_end/Images/resourcesTimeGraphIcon.png",
-      "front_end/Images/searchNext.png",
-      "front_end/Images/searchPrev.png",
-      # "front_end/Images/securityIcons.svg",
-      # "front_end/Images/speech.png",
-      "front_end/Images/smallIcons.svg",
-      # "front_end/Images/toolbarResizerVertical.png",
-      # "front_end/Images/touchCursor.png",
-      # "front_end/Images/touchCursor_2x.png",
-      "front_end/Images/treeoutlineTriangles.svg",
-      # "front_end/Images/whatsnew.png",
-    ],
-
-    'resources_out_dir': '<(sb_static_contents_output_data_dir)/web/debug_remote/devtools',
-    'resources_out_debug_dir': '<(resources_out_dir)/debug',
-
-    'generated_scripts': [
-      "<(resources_out_dir)/InspectorBackendCommands.js",
-      "<(resources_out_dir)/SupportedCSSProperties.js",
-    ],
-
-    'generated_aria_properties': [
-      "<(resources_out_dir)/accessibility/ARIAProperties.js",
-    ],
-
-    'application_templates': [
-      "front_end/devtools_app.html",
-      "front_end/inspector.html",
-      "front_end/integration_test_runner.html",
-      "front_end/js_app.html",
-      "front_end/ndb_app.html",
-      "front_end/node_app.html",
-      "front_end/toolbox.html",
-      "front_end/worker_app.html",
-    ],
-
-    'copied_devtools_modules': [
-      "<(resources_out_dir)/cobalt/cobalt.js",
-      "<(resources_out_dir)/network/network.js",
-      "<(resources_out_dir)/network/SignedExchangeInfoView.js",
-      "<(resources_out_dir)/network/ResourceWebSocketFrameView.js",
-      "<(resources_out_dir)/network/RequestTimingView.js",
-      "<(resources_out_dir)/network/RequestResponseView.js",
-      "<(resources_out_dir)/network/RequestPreviewView.js",
-      "<(resources_out_dir)/network/RequestInitiatorView.js",
-      "<(resources_out_dir)/network/RequestHeadersView.js",
-      "<(resources_out_dir)/network/RequestHTMLView.js",
-      "<(resources_out_dir)/network/RequestCookiesView.js",
-      "<(resources_out_dir)/network/NetworkWaterfallColumn.js",
-      "<(resources_out_dir)/network/NetworkTimeCalculator.js",
-      "<(resources_out_dir)/network/NetworkSearchScope.js",
-      "<(resources_out_dir)/network/NetworkPanel.js",
-      "<(resources_out_dir)/network/NetworkOverview.js",
-      "<(resources_out_dir)/network/NetworkManageCustomHeadersView.js",
-      "<(resources_out_dir)/network/NetworkLogViewColumns.js",
-      "<(resources_out_dir)/network/NetworkLogView.js",
-      "<(resources_out_dir)/network/NetworkItemView.js",
-      "<(resources_out_dir)/network/NetworkFrameGrouper.js",
-      "<(resources_out_dir)/network/NetworkDataGridNode.js",
-      "<(resources_out_dir)/network/NetworkConfigView.js",
-      "<(resources_out_dir)/network/HARWriter.js",
-      "<(resources_out_dir)/network/EventSourceMessagesView.js",
-      "<(resources_out_dir)/network/BlockedURLsPane.js",
-      "<(resources_out_dir)/network/BinaryResourceView.js",
-      "<(resources_out_dir)/test_runner/test_runner.js",
-      "<(resources_out_dir)/test_runner/TestRunner.js",
-      "<(resources_out_dir)/emulation/emulation.js",
-      "<(resources_out_dir)/emulation/SensorsView.js",
-      "<(resources_out_dir)/emulation/MediaQueryInspector.js",
-      "<(resources_out_dir)/emulation/InspectedPagePlaceholder.js",
-      "<(resources_out_dir)/emulation/GeolocationsSettingsTab.js",
-      "<(resources_out_dir)/emulation/EmulatedDevices.js",
-      "<(resources_out_dir)/emulation/DevicesSettingsTab.js",
-      "<(resources_out_dir)/emulation/DeviceModeWrapper.js",
-      "<(resources_out_dir)/emulation/DeviceModeView.js",
-      "<(resources_out_dir)/emulation/DeviceModeToolbar.js",
-      "<(resources_out_dir)/emulation/DeviceModeModel.js",
-      "<(resources_out_dir)/emulation/AdvancedApp.js",
-      "<(resources_out_dir)/inspector_main/inspector_main.js",
-      "<(resources_out_dir)/inspector_main/RenderingOptions.js",
-      "<(resources_out_dir)/inspector_main/InspectorMain.js",
-      "<(resources_out_dir)/js_main/js_main.js",
-      "<(resources_out_dir)/js_main/JsMain.js",
-      "<(resources_out_dir)/search/search.js",
-      "<(resources_out_dir)/search/SearchView.js",
-      "<(resources_out_dir)/search/SearchResultsPane.js",
-      "<(resources_out_dir)/search/SearchConfig.js",
-      "<(resources_out_dir)/screencast/screencast.js",
-      "<(resources_out_dir)/screencast/ScreencastView.js",
-      "<(resources_out_dir)/screencast/ScreencastApp.js",
-      "<(resources_out_dir)/screencast/InputModel.js",
-      "<(resources_out_dir)/performance_monitor/performance_monitor.js",
-      "<(resources_out_dir)/performance_monitor/PerformanceMonitor.js",
-      "<(resources_out_dir)/main/main.js",
-      "<(resources_out_dir)/main/SimpleApp.js",
-      "<(resources_out_dir)/main/MainImpl.js",
-      "<(resources_out_dir)/main/ExecutionContextSelector.js",
-      "<(resources_out_dir)/snippets/snippets.js",
-      "<(resources_out_dir)/snippets/SnippetsQuickOpen.js",
-      "<(resources_out_dir)/snippets/ScriptSnippetFileSystem.js",
-      "<(resources_out_dir)/settings/settings.js",
-      "<(resources_out_dir)/settings/SettingsScreen.js",
-      "<(resources_out_dir)/settings/FrameworkBlackboxSettingsTab.js",
-      "<(resources_out_dir)/security/security.js",
-      "<(resources_out_dir)/security/SecurityPanel.js",
-      "<(resources_out_dir)/security/SecurityModel.js",
-      # "<(resources_out_dir)/web_audio/web_audio.js",
-      # "<(resources_out_dir)/web_audio/graph_visualizer/Types.js",
-      # "<(resources_out_dir)/web_audio/graph_visualizer/GraphStyle.js",
-      # "<(resources_out_dir)/web_audio/graph_visualizer/GraphManager.js",
-      # "<(resources_out_dir)/web_audio/graph_visualizer/NodeRendererUtility.js",
-      # "<(resources_out_dir)/web_audio/graph_visualizer/NodeView.js",
-      # "<(resources_out_dir)/web_audio/graph_visualizer/EdgeView.js",
-      # "<(resources_out_dir)/web_audio/graph_visualizer/GraphView.js",
-      # "<(resources_out_dir)/web_audio/WebAudioView.js",
-      # "<(resources_out_dir)/web_audio/WebAudioModel.js",
-      # "<(resources_out_dir)/web_audio/AudioContextSelector.js",
-      # "<(resources_out_dir)/web_audio/AudioContextContentBuilder.js",
-      "<(resources_out_dir)/elements/elements.js",
-      "<(resources_out_dir)/elements/elements-legacy.js",
-      "<(resources_out_dir)/elements/StylesSidebarPane.js",
-      "<(resources_out_dir)/elements/StylePropertyTreeElement.js",
-      "<(resources_out_dir)/elements/StylePropertyHighlighter.js",
-      "<(resources_out_dir)/elements/PropertiesWidget.js",
-      "<(resources_out_dir)/elements/PlatformFontsWidget.js",
-      "<(resources_out_dir)/elements/NodeStackTraceWidget.js",
-      "<(resources_out_dir)/elements/MetricsSidebarPane.js",
-      "<(resources_out_dir)/elements/MarkerDecorator.js",
-      "<(resources_out_dir)/elements/InspectElementModeController.js",
-      "<(resources_out_dir)/elements/EventListenersWidget.js",
-      "<(resources_out_dir)/elements/ElementsTreeOutline.js",
-      "<(resources_out_dir)/elements/ElementsTreeElement.js",
-      "<(resources_out_dir)/elements/ElementsTreeElementHighlighter.js",
-      "<(resources_out_dir)/elements/ElementStatePaneWidget.js",
-      "<(resources_out_dir)/elements/ElementsSidebarPane.js",
-      "<(resources_out_dir)/elements/ElementsPanel.js",
-      "<(resources_out_dir)/elements/ElementsBreadcrumbs.js",
-      "<(resources_out_dir)/elements/DOMPath.js",
-      "<(resources_out_dir)/elements/DOMLinkifier.js",
-      "<(resources_out_dir)/elements/ComputedStyleWidget.js",
-      "<(resources_out_dir)/elements/ComputedStyleModel.js",
-      "<(resources_out_dir)/elements/ColorSwatchPopoverIcon.js",
-      "<(resources_out_dir)/elements/ClassesPaneWidget.js",
-      "<(resources_out_dir)/javascript_metadata/javascript_metadata.js",
-      "<(resources_out_dir)/javascript_metadata/NativeFunctions.js",
-      "<(resources_out_dir)/javascript_metadata/JavaScriptMetadata.js",
-      "<(resources_out_dir)/har_importer/har_importer.js",
-      "<(resources_out_dir)/har_importer/HARImporter.js",
-      "<(resources_out_dir)/har_importer/HARFormat.js",
-      "<(resources_out_dir)/browser_debugger/browser_debugger.js",
-      "<(resources_out_dir)/browser_debugger/XHRBreakpointsSidebarPane.js",
-      "<(resources_out_dir)/browser_debugger/ObjectEventListenersSidebarPane.js",
-      "<(resources_out_dir)/browser_debugger/EventListenerBreakpointsSidebarPane.js",
-      "<(resources_out_dir)/browser_debugger/DOMBreakpointsSidebarPane.js",
-      "<(resources_out_dir)/layer_viewer/layer_viewer.js",
-      "<(resources_out_dir)/layer_viewer/TransformController.js",
-      "<(resources_out_dir)/layer_viewer/PaintProfilerView.js",
-      "<(resources_out_dir)/layer_viewer/Layers3DView.js",
-      "<(resources_out_dir)/layer_viewer/LayerViewHost.js",
-      "<(resources_out_dir)/layer_viewer/LayerTreeOutline.js",
-      "<(resources_out_dir)/layer_viewer/LayerDetailsView.js",
-      "<(resources_out_dir)/cm_web_modes/cm_web_modes.js",
-      "<(resources_out_dir)/cm_web_modes/cm_web_modes_cm.js",
-      "<(resources_out_dir)/cm_web_modes/cm_web_modes_headless.js",
-      "<(resources_out_dir)/cm_web_modes/css.js",
-      "<(resources_out_dir)/cm_web_modes/javascript.js",
-      "<(resources_out_dir)/cm_web_modes/xml.js",
-      "<(resources_out_dir)/cm_web_modes/htmlmixed.js",
-      "<(resources_out_dir)/cm_web_modes/htmlembedded.js",
-      "<(resources_out_dir)/text_editor/text_editor.js",
-      "<(resources_out_dir)/text_editor/TextEditorAutocompleteController.js",
-      "<(resources_out_dir)/text_editor/CodeMirrorUtils.js",
-      "<(resources_out_dir)/text_editor/CodeMirrorTextEditor.js",
-      "<(resources_out_dir)/quick_open/quick_open.js",
-      "<(resources_out_dir)/quick_open/QuickOpen.js",
-      "<(resources_out_dir)/quick_open/HelpQuickOpen.js",
-      "<(resources_out_dir)/quick_open/FilteredListWidget.js",
-      "<(resources_out_dir)/quick_open/CommandMenu.js",
-      "<(resources_out_dir)/timeline_model/timeline_model.js",
-      "<(resources_out_dir)/timeline_model/TracingLayerTree.js",
-      "<(resources_out_dir)/timeline_model/TimelineProfileTree.js",
-      "<(resources_out_dir)/timeline_model/TimelineModel.js",
-      "<(resources_out_dir)/timeline_model/TimelineModelFilter.js",
-      "<(resources_out_dir)/timeline_model/TimelineJSProfile.js",
-      "<(resources_out_dir)/timeline_model/TimelineIRModel.js",
-      "<(resources_out_dir)/timeline_model/TimelineFrameModel.js",
-      "<(resources_out_dir)/help/help.js",
-      "<(resources_out_dir)/help/ReleaseNoteView.js",
-      "<(resources_out_dir)/help/ReleaseNoteText.js",
-      "<(resources_out_dir)/help/HelpImpl.js",
-      "<(resources_out_dir)/workspace_diff/workspace_diff.js",
-      "<(resources_out_dir)/workspace_diff/WorkspaceDiff.js",
-      "<(resources_out_dir)/mobile_throttling/mobile_throttling.js",
-      "<(resources_out_dir)/mobile_throttling/ThrottlingSettingsTab.js",
-      "<(resources_out_dir)/mobile_throttling/ThrottlingPresets.js",
-      "<(resources_out_dir)/mobile_throttling/ThrottlingManager.js",
-      "<(resources_out_dir)/mobile_throttling/NetworkThrottlingSelector.js",
-      "<(resources_out_dir)/mobile_throttling/NetworkPanelIndicator.js",
-      "<(resources_out_dir)/mobile_throttling/MobileThrottlingSelector.js",
-      "<(resources_out_dir)/event_listeners/event_listeners.js",
-      "<(resources_out_dir)/event_listeners/EventListenersView.js",
-      "<(resources_out_dir)/event_listeners/EventListenersUtils.js",
-      # "<(resources_out_dir)/layers/layers.js",
-      # "<(resources_out_dir)/layers/LayersPanel.js",
-      # "<(resources_out_dir)/layers/LayerTreeModel.js",
-      # "<(resources_out_dir)/layers/LayerPaintProfilerView.js",
-      "<(resources_out_dir)/object_ui/object_ui.js",
-      "<(resources_out_dir)/object_ui/RemoteObjectPreviewFormatter.js",
-      "<(resources_out_dir)/object_ui/ObjectPropertiesSection.js",
-      "<(resources_out_dir)/object_ui/ObjectPopoverHelper.js",
-      "<(resources_out_dir)/object_ui/JavaScriptREPL.js",
-      "<(resources_out_dir)/object_ui/JavaScriptAutocomplete.js",
-      "<(resources_out_dir)/object_ui/CustomPreviewComponent.js",
-      "<(resources_out_dir)/cookie_table/cookie_table.js",
-      "<(resources_out_dir)/cookie_table/CookiesTable.js",
-      "<(resources_out_dir)/cm_modes/cm_modes.js",
-      "<(resources_out_dir)/cm_modes/DefaultCodeMirrorMimeMode.js",
-      "<(resources_out_dir)/cm_modes/clike.js",
-      "<(resources_out_dir)/cm_modes/coffeescript.js",
-      "<(resources_out_dir)/cm_modes/php.js",
-      "<(resources_out_dir)/cm_modes/python.js",
-      "<(resources_out_dir)/cm_modes/shell.js",
-      "<(resources_out_dir)/cm_modes/livescript.js",
-      "<(resources_out_dir)/cm_modes/markdown.js",
-      "<(resources_out_dir)/cm_modes/clojure.js",
-      "<(resources_out_dir)/cm_modes/jsx.js",
-      # "<(resources_out_dir)/coverage/coverage.js",
-      # "<(resources_out_dir)/coverage/CoverageView.js",
-      # "<(resources_out_dir)/coverage/CoverageModel.js",
-      # "<(resources_out_dir)/coverage/CoverageListView.js",
-      # "<(resources_out_dir)/coverage/CoverageDecorationManager.js",
-      "<(resources_out_dir)/css_overview/css_overview.js",
-      "<(resources_out_dir)/css_overview/CSSOverviewUnusedDeclarations.js",
-      "<(resources_out_dir)/css_overview/CSSOverviewStartView.js",
-      "<(resources_out_dir)/css_overview/CSSOverviewSidebarPanel.js",
-      "<(resources_out_dir)/css_overview/CSSOverviewProcessingView.js",
-      "<(resources_out_dir)/css_overview/CSSOverviewPanel.js",
-      "<(resources_out_dir)/css_overview/CSSOverviewModel.js",
-      "<(resources_out_dir)/css_overview/CSSOverviewController.js",
-      "<(resources_out_dir)/css_overview/CSSOverviewCompletedView.js",
-      # "<(resources_out_dir)/audits/lighthouse/report.js",
-      # "<(resources_out_dir)/audits/lighthouse/report-generator.js",
-      # "<(resources_out_dir)/audits/audits.js",
-      # "<(resources_out_dir)/audits/RadioSetting.js",
-      # "<(resources_out_dir)/audits/AuditsStatusView.js",
-      # "<(resources_out_dir)/audits/AuditsStartView.js",
-      # "<(resources_out_dir)/audits/AuditsReportSelector.js",
-      # "<(resources_out_dir)/audits/AuditsReportRenderer.js",
-      # "<(resources_out_dir)/audits/AuditsProtocolService.js",
-      # "<(resources_out_dir)/audits/AuditsPanel.js",
-      # "<(resources_out_dir)/audits/AuditsController.js",
-      "<(resources_out_dir)/console/console.js",
-      "<(resources_out_dir)/console/ConsoleContextSelector.js",
-      "<(resources_out_dir)/console/ConsoleFilter.js",
-      "<(resources_out_dir)/console/ConsoleSidebar.js",
-      "<(resources_out_dir)/console/ConsolePanel.js",
-      "<(resources_out_dir)/console/ConsolePinPane.js",
-      "<(resources_out_dir)/console/ConsolePrompt.js",
-      "<(resources_out_dir)/console/ConsoleView.js",
-      "<(resources_out_dir)/console/ConsoleViewMessage.js",
-      "<(resources_out_dir)/console/ConsoleViewport.js",
-      # "<(resources_out_dir)/animation/animation.js",
-      # "<(resources_out_dir)/animation/AnimationUI.js",
-      # "<(resources_out_dir)/animation/AnimationTimeline.js",
-      # "<(resources_out_dir)/animation/AnimationScreenshotPopover.js",
-      # "<(resources_out_dir)/animation/AnimationModel.js",
-      # "<(resources_out_dir)/animation/AnimationGroupPreviewUI.js",
-      # "<(resources_out_dir)/changes/changes.js",
-      # "<(resources_out_dir)/changes/ChangesView.js",
-      # "<(resources_out_dir)/changes/ChangesSidebar.js",
-      # "<(resources_out_dir)/changes/ChangesHighlighter.js",
-      "<(resources_out_dir)/source_frame/source_frame.js",
-      "<(resources_out_dir)/source_frame/XMLView.js",
-      "<(resources_out_dir)/source_frame/SourcesTextEditor.js",
-      "<(resources_out_dir)/source_frame/SourceFrame.js",
-      "<(resources_out_dir)/source_frame/SourceCodeDiff.js",
-      "<(resources_out_dir)/source_frame/ResourceSourceFrame.js",
-      "<(resources_out_dir)/source_frame/PreviewFactory.js",
-      "<(resources_out_dir)/source_frame/JSONView.js",
-      "<(resources_out_dir)/source_frame/ImageView.js",
-      "<(resources_out_dir)/source_frame/FontView.js",
-      "<(resources_out_dir)/source_frame/BinaryResourceViewFactory.js",
-      "<(resources_out_dir)/inline_editor/inline_editor.js",
-      "<(resources_out_dir)/inline_editor/SwatchPopoverHelper.js",
-      "<(resources_out_dir)/inline_editor/CSSShadowModel.js",
-      "<(resources_out_dir)/inline_editor/CSSShadowEditor.js",
-      "<(resources_out_dir)/inline_editor/ColorSwatch.js",
-      "<(resources_out_dir)/inline_editor/BezierUI.js",
-      "<(resources_out_dir)/inline_editor/BezierEditor.js",
-      "<(resources_out_dir)/diff/diff.js",
-      "<(resources_out_dir)/diff/diff_match_patch.js",
-      "<(resources_out_dir)/diff/DiffWrapper.js",
-      "<(resources_out_dir)/formatter/formatter.js",
-      "<(resources_out_dir)/formatter/ScriptFormatter.js",
-      "<(resources_out_dir)/formatter/FormatterWorkerPool.js",
-      "<(resources_out_dir)/color_picker/color_picker.js",
-      "<(resources_out_dir)/color_picker/Spectrum.js",
-      "<(resources_out_dir)/color_picker/ContrastOverlay.js",
-      "<(resources_out_dir)/color_picker/ContrastInfo.js",
-      "<(resources_out_dir)/color_picker/ContrastDetails.js",
-      "<(resources_out_dir)/cm/cm.js",
-      "<(resources_out_dir)/cm/active-line.js",
-      "<(resources_out_dir)/cm/brace-fold.js",
-      "<(resources_out_dir)/cm/closebrackets.js",
-      "<(resources_out_dir)/cm/codemirror.js",
-      "<(resources_out_dir)/cm/comment.js",
-      "<(resources_out_dir)/cm/foldcode.js",
-      "<(resources_out_dir)/cm/foldgutter.js",
-      "<(resources_out_dir)/cm/mark-selection.js",
-      "<(resources_out_dir)/cm/matchbrackets.js",
-      "<(resources_out_dir)/cm/multiplex.js",
-      "<(resources_out_dir)/cm/overlay.js",
-      "<(resources_out_dir)/heap_snapshot_model/heap_snapshot_model.js",
-      "<(resources_out_dir)/heap_snapshot_model/HeapSnapshotModel.js",
-      "<(resources_out_dir)/heap_snapshot_worker/heap_snapshot_worker.js",
-      "<(resources_out_dir)/heap_snapshot_worker/AllocationProfile.js",
-      "<(resources_out_dir)/heap_snapshot_worker/HeapSnapshot.js",
-      "<(resources_out_dir)/heap_snapshot_worker/HeapSnapshotLoader.js",
-      "<(resources_out_dir)/heap_snapshot_worker/HeapSnapshotWorker.js",
-      "<(resources_out_dir)/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.js",
-      "<(resources_out_dir)/text_utils/text_utils.js",
-      "<(resources_out_dir)/text_utils/TextUtils.js",
-      "<(resources_out_dir)/text_utils/TextRange.js",
-      "<(resources_out_dir)/text_utils/Text.js",
-      "<(resources_out_dir)/cm_headless/cm_headless.js",
-      "<(resources_out_dir)/cm_headless/headlesscodemirror.js",
-      "<(resources_out_dir)/data_grid/data_grid.js",
-      "<(resources_out_dir)/data_grid/ViewportDataGrid.js",
-      "<(resources_out_dir)/data_grid/SortableDataGrid.js",
-      "<(resources_out_dir)/data_grid/ShowMoreDataGridNode.js",
-      "<(resources_out_dir)/data_grid/DataGrid.js",
-      # "<(resources_out_dir)/accessibility/accessibility.js",
-      # "<(resources_out_dir)/accessibility/AccessibilityStrings.js",
-      # "<(resources_out_dir)/accessibility/AccessibilitySidebarView.js",
-      # "<(resources_out_dir)/accessibility/AccessibilityNodeView.js",
-      # "<(resources_out_dir)/accessibility/AccessibilityModel.js",
-      # "<(resources_out_dir)/accessibility/AXBreadcrumbsPane.js",
-      # "<(resources_out_dir)/accessibility/ARIAMetadata.js",
-      # "<(resources_out_dir)/accessibility/ARIAAttributesView.js",
-      "<(resources_out_dir)/protocol_monitor/protocol_monitor.js",
-      "<(resources_out_dir)/protocol_monitor/ProtocolMonitor.js",
-      "<(resources_out_dir)/console_counters/console_counters.js",
-      "<(resources_out_dir)/console_counters/WarningErrorCounter.js",
-      "<(resources_out_dir)/extensions/extensions.js",
-      "<(resources_out_dir)/extensions/ExtensionAPI.js",
-      "<(resources_out_dir)/extensions/ExtensionPanel.js",
-      "<(resources_out_dir)/extensions/ExtensionServer.js",
-      "<(resources_out_dir)/extensions/ExtensionTraceProvider.js",
-      "<(resources_out_dir)/extensions/ExtensionView.js",
-      "<(resources_out_dir)/browser_sdk/browser_sdk.js",
-      "<(resources_out_dir)/browser_sdk/LogManager.js",
-      "<(resources_out_dir)/persistence/persistence.js",
-      "<(resources_out_dir)/persistence/WorkspaceSettingsTab.js",
-      "<(resources_out_dir)/persistence/PlatformFileSystem.js",
-      "<(resources_out_dir)/persistence/PersistenceUtils.js",
-      "<(resources_out_dir)/persistence/PersistenceImpl.js",
-      "<(resources_out_dir)/persistence/PersistenceActions.js",
-      "<(resources_out_dir)/persistence/NetworkPersistenceManager.js",
-      "<(resources_out_dir)/persistence/IsolatedFileSystemManager.js",
-      "<(resources_out_dir)/persistence/IsolatedFileSystem.js",
-      "<(resources_out_dir)/persistence/FileSystemWorkspaceBinding.js",
-      "<(resources_out_dir)/persistence/EditFileSystemView.js",
-      "<(resources_out_dir)/persistence/Automapping.js",
-      "<(resources_out_dir)/components/components.js",
-      "<(resources_out_dir)/components/TargetDetachedDialog.js",
-      "<(resources_out_dir)/components/Reload.js",
-      "<(resources_out_dir)/components/Linkifier.js",
-      "<(resources_out_dir)/components/JSPresentationUtils.js",
-      "<(resources_out_dir)/components/ImagePreview.js",
-      "<(resources_out_dir)/components/DockController.js",
-      "<(resources_out_dir)/bindings/bindings.js",
-      "<(resources_out_dir)/bindings/TempFile.js",
-      "<(resources_out_dir)/bindings/StylesSourceMapping.js",
-      "<(resources_out_dir)/bindings/SASSSourceMapping.js",
-      "<(resources_out_dir)/bindings/ResourceUtils.js",
-      "<(resources_out_dir)/bindings/ResourceScriptMapping.js",
-      "<(resources_out_dir)/bindings/ResourceMapping.js",
-      "<(resources_out_dir)/bindings/PresentationConsoleMessageHelper.js",
-      "<(resources_out_dir)/bindings/NetworkProject.js",
-      "<(resources_out_dir)/bindings/LiveLocation.js",
-      "<(resources_out_dir)/bindings/FileUtils.js",
-      "<(resources_out_dir)/bindings/DefaultScriptMapping.js",
-      "<(resources_out_dir)/bindings/DebuggerWorkspaceBinding.js",
-      "<(resources_out_dir)/bindings/CSSWorkspaceBinding.js",
-      "<(resources_out_dir)/bindings/ContentProviderBasedProject.js",
-      "<(resources_out_dir)/bindings/CompilerScriptMapping.js",
-      "<(resources_out_dir)/bindings/BreakpointManager.js",
-      "<(resources_out_dir)/bindings/BlackboxManager.js",
-      "<(resources_out_dir)/workspace/workspace.js",
-      "<(resources_out_dir)/workspace/WorkspaceImpl.js",
-      "<(resources_out_dir)/workspace/UISourceCode.js",
-      "<(resources_out_dir)/workspace/FileManager.js",
-      "<(resources_out_dir)/services/services.js",
-      "<(resources_out_dir)/services/ServiceManager.js",
-      "<(resources_out_dir)/sdk/sdk.js",
-      "<(resources_out_dir)/sdk/TracingModel.js",
-      "<(resources_out_dir)/sdk/TracingManager.js",
-      "<(resources_out_dir)/sdk/TargetManager.js",
-      "<(resources_out_dir)/sdk/Target.js",
-      "<(resources_out_dir)/sdk/SourceMapManager.js",
-      "<(resources_out_dir)/sdk/SourceMap.js",
-      "<(resources_out_dir)/sdk/ServiceWorkerManager.js",
-      "<(resources_out_dir)/sdk/ServiceWorkerCacheModel.js",
-      "<(resources_out_dir)/sdk/ServerTiming.js",
-      "<(resources_out_dir)/sdk/SecurityOriginManager.js",
-      "<(resources_out_dir)/sdk/SDKModel.js",
-      "<(resources_out_dir)/sdk/Script.js",
-      "<(resources_out_dir)/sdk/ScreenCaptureModel.js",
-      "<(resources_out_dir)/sdk/RuntimeModel.js",
-      "<(resources_out_dir)/sdk/ResourceTreeModel.js",
-      "<(resources_out_dir)/sdk/Resource.js",
-      "<(resources_out_dir)/sdk/RemoteObject.js",
-      "<(resources_out_dir)/sdk/ProfileTreeModel.js",
-      "<(resources_out_dir)/sdk/IssuesModel.js",
-      "<(resources_out_dir)/sdk/PerformanceMetricsModel.js",
-      "<(resources_out_dir)/sdk/PaintProfiler.js",
-      "<(resources_out_dir)/sdk/OverlayModel.js",
-      "<(resources_out_dir)/sdk/NetworkRequest.js",
-      "<(resources_out_dir)/sdk/NetworkManager.js",
-      "<(resources_out_dir)/sdk/NetworkLog.js",
-      "<(resources_out_dir)/sdk/LogModel.js",
-      "<(resources_out_dir)/sdk/LayerTreeBase.js",
-      "<(resources_out_dir)/sdk/IsolateManager.js",
-      "<(resources_out_dir)/sdk/HeapProfilerModel.js",
-      "<(resources_out_dir)/sdk/HARLog.js",
-      "<(resources_out_dir)/sdk/FilmStripModel.js",
-      "<(resources_out_dir)/sdk/EmulationModel.js",
-      "<(resources_out_dir)/sdk/DOMModel.js",
-      "<(resources_out_dir)/sdk/DOMDebuggerModel.js",
-      "<(resources_out_dir)/sdk/DebuggerModel.js",
-      "<(resources_out_dir)/sdk/CSSStyleSheetHeader.js",
-      "<(resources_out_dir)/sdk/CSSStyleDeclaration.js",
-      "<(resources_out_dir)/sdk/CSSRule.js",
-      "<(resources_out_dir)/sdk/CSSProperty.js",
-      "<(resources_out_dir)/sdk/CSSModel.js",
-      "<(resources_out_dir)/sdk/CSSMetadata.js",
-      "<(resources_out_dir)/sdk/CSSMedia.js",
-      "<(resources_out_dir)/sdk/CSSMatchedStyles.js",
-      "<(resources_out_dir)/sdk/CPUProfilerModel.js",
-      "<(resources_out_dir)/sdk/CPUProfileDataModel.js",
-      "<(resources_out_dir)/sdk/CookieParser.js",
-      "<(resources_out_dir)/sdk/CookieModel.js",
-      "<(resources_out_dir)/sdk/CompilerSourceMappingContentProvider.js",
-      "<(resources_out_dir)/sdk/ConsoleModel.js",
-      "<(resources_out_dir)/sdk/Connections.js",
-      "<(resources_out_dir)/sdk/ChildTargetManager.js",
-      # "<(resources_out_dir)/sdk/wasm_source_map/pkg/wasm_source_map.js",
-      "<(resources_out_dir)/protocol/protocol.js",
-      "<(resources_out_dir)/protocol/NodeURL.js",
-      "<(resources_out_dir)/protocol/InspectorBackend.js",
-      "<(resources_out_dir)/host/host.js",
-      "<(resources_out_dir)/host/UserMetrics.js",
-      "<(resources_out_dir)/host/ResourceLoader.js",
-      "<(resources_out_dir)/host/Platform.js",
-      "<(resources_out_dir)/host/InspectorFrontendHost.js",
-      "<(resources_out_dir)/host/InspectorFrontendHostAPI.js",
-      "<(resources_out_dir)/dom_extension/DOMExtension.js",
-      "<(resources_out_dir)/dom_extension/dom_extension.js",
-      "<(resources_out_dir)/root.js",
-      "<(resources_out_dir)/Runtime.js",
-      "<(resources_out_dir)/platform/utilities.js",
-      "<(resources_out_dir)/platform/platform.js",
-      "<(resources_out_dir)/ui/ui.js",
-      "<(resources_out_dir)/ui/ZoomManager.js",
-      "<(resources_out_dir)/ui/XWidget.js",
-      "<(resources_out_dir)/ui/XLink.js",
-      "<(resources_out_dir)/ui/XElement.js",
-      "<(resources_out_dir)/ui/Widget.js",
-      "<(resources_out_dir)/ui/View.js",
-      "<(resources_out_dir)/ui/ViewManager.js",
-      "<(resources_out_dir)/ui/UIUtils.js",
-      "<(resources_out_dir)/ui/Treeoutline.js",
-      "<(resources_out_dir)/ui/Tooltip.js",
-      "<(resources_out_dir)/ui/Toolbar.js",
-      "<(resources_out_dir)/ui/ThrottledWidget.js",
-      "<(resources_out_dir)/ui/TextPrompt.js",
-      "<(resources_out_dir)/ui/TextEditor.js",
-      "<(resources_out_dir)/ui/TargetCrashedScreen.js",
-      "<(resources_out_dir)/ui/TabbedPane.js",
-      "<(resources_out_dir)/ui/SyntaxHighlighter.js",
-      "<(resources_out_dir)/ui/SuggestBox.js",
-      "<(resources_out_dir)/ui/SplitWidget.js",
-      "<(resources_out_dir)/ui/SoftDropDown.js",
-      "<(resources_out_dir)/ui/SoftContextMenu.js",
-      "<(resources_out_dir)/ui/ShortcutsScreen.js",
-      "<(resources_out_dir)/ui/ShortcutRegistry.js",
-      "<(resources_out_dir)/ui/SettingsUI.js",
-      "<(resources_out_dir)/ui/SegmentedButton.js",
-      "<(resources_out_dir)/ui/SearchableView.js",
-      "<(resources_out_dir)/ui/RootView.js",
-      "<(resources_out_dir)/ui/ResizerWidget.js",
-      "<(resources_out_dir)/ui/ReportView.js",
-      "<(resources_out_dir)/ui/RemoteDebuggingTerminatedScreen.js",
-      "<(resources_out_dir)/ui/ProgressIndicator.js",
-      "<(resources_out_dir)/ui/PopoverHelper.js",
-      "<(resources_out_dir)/ui/Panel.js",
-      "<(resources_out_dir)/ui/ListWidget.js",
-      "<(resources_out_dir)/ui/ListModel.js",
-      "<(resources_out_dir)/ui/ListControl.js",
-      "<(resources_out_dir)/ui/KeyboardShortcut.js",
-      "<(resources_out_dir)/ui/InspectorView.js",
-      "<(resources_out_dir)/ui/InplaceEditor.js",
-      "<(resources_out_dir)/ui/Infobar.js",
-      "<(resources_out_dir)/ui/Icon.js",
-      "<(resources_out_dir)/ui/HistoryInput.js",
-      "<(resources_out_dir)/ui/GlassPane.js",
-      "<(resources_out_dir)/ui/Geometry.js",
-      "<(resources_out_dir)/ui/Fragment.js",
-      "<(resources_out_dir)/ui/ForwardedInputEventHandler.js",
-      "<(resources_out_dir)/ui/FilterSuggestionBuilder.js",
-      "<(resources_out_dir)/ui/FilterBar.js",
-      "<(resources_out_dir)/ui/EmptyWidget.js",
-      "<(resources_out_dir)/ui/DropTarget.js",
-      "<(resources_out_dir)/ui/Dialog.js",
-      "<(resources_out_dir)/ui/ContextMenu.js",
-      "<(resources_out_dir)/ui/Context.js",
-      "<(resources_out_dir)/ui/ARIAUtils.js",
-      "<(resources_out_dir)/ui/ActionRegistry.js",
-      "<(resources_out_dir)/ui/Action.js",
-      "<(resources_out_dir)/ui/ActionDelegate.js",
-      "<(resources_out_dir)/ui/ContextFlavorListener.js",
-      "<(resources_out_dir)/common/common.js",
-      "<(resources_out_dir)/common/common-legacy.js",
-      "<(resources_out_dir)/common/App.js",
-      "<(resources_out_dir)/common/AppProvider.js",
-      "<(resources_out_dir)/common/CharacterIdMap.js",
-      "<(resources_out_dir)/common/Color.js",
-      "<(resources_out_dir)/common/ContentProvider.js",
-      "<(resources_out_dir)/common/EventTarget.js",
-      "<(resources_out_dir)/common/JavaScriptMetaData.js",
-      "<(resources_out_dir)/common/Linkifier.js",
-      "<(resources_out_dir)/common/Object.js",
-      "<(resources_out_dir)/common/Console.js",
-      "<(resources_out_dir)/common/ParsedURL.js",
-      "<(resources_out_dir)/common/Progress.js",
-      "<(resources_out_dir)/common/QueryParamHandler.js",
-      "<(resources_out_dir)/common/ResourceType.js",
-      "<(resources_out_dir)/common/Revealer.js",
-      "<(resources_out_dir)/common/Runnable.js",
-      "<(resources_out_dir)/common/SegmentedRange.js",
-      "<(resources_out_dir)/common/Settings.js",
-      "<(resources_out_dir)/common/StaticContentProvider.js",
-      "<(resources_out_dir)/common/StringOutputStream.js",
-      "<(resources_out_dir)/common/TextDictionary.js",
-      "<(resources_out_dir)/common/Throttler.js",
-      "<(resources_out_dir)/common/Trie.js",
-      "<(resources_out_dir)/common/UIString.js",
-      "<(resources_out_dir)/common/Worker.js",
-    ],
-
-    'generated_applications': [
-      # "<(resources_out_dir)/audits_worker.js",
-      "<(resources_out_dir)/devtools_app.html",
-      "<(resources_out_dir)/devtools_app.js",
-      "<(resources_out_dir)/inspector.html",
-      "<(resources_out_dir)/inspector.js",
-      # "<(resources_out_dir)/js_app.html",
-      # "<(resources_out_dir)/js_app.js",
-      # "<(resources_out_dir)/node_app.html",
-      # "<(resources_out_dir)/node_app.js",
-      "<(resources_out_dir)/shell.js",
-      # "<(resources_out_dir)/toolbox.html",
-      # "<(resources_out_dir)/toolbox.js",
-      "<(resources_out_dir)/worker_app.html",
-      "<(resources_out_dir)/worker_app.js",
-    ],
-
-    'generated_non_autostart_non_remote_modules': [
-      # "<(resources_out_dir)/animation/animation_module.js",
-      # "<(resources_out_dir)/audits/audits_module.js",
-      "<(resources_out_dir)/browser_debugger/browser_debugger_module.js",
-      # "<(resources_out_dir)/changes/changes_module.js",
-      "<(resources_out_dir)/protocol_monitor/protocol_monitor_module.js",
-      "<(resources_out_dir)/css_overview/css_overview_module.js",
-      "<(resources_out_dir)/cm/cm_module.js",
-      "<(resources_out_dir)/cm_web_modes/cm_web_modes_module.js",
-      "<(resources_out_dir)/cm_modes/cm_modes_module.js",
-      "<(resources_out_dir)/color_picker/color_picker_module.js",
-      "<(resources_out_dir)/console/console_module.js",
-      "<(resources_out_dir)/cookie_table/cookie_table_module.js",
-      # "<(resources_out_dir)/coverage/coverage_module.js",
-      "<(resources_out_dir)/data_grid/data_grid_module.js",
-      # "<(resources_out_dir)/devices/devices_module.js",
-      "<(resources_out_dir)/diff/diff_module.js",
-      "<(resources_out_dir)/elements/elements_module.js",
-      "<(resources_out_dir)/event_listeners/event_listeners_module.js",
-      "<(resources_out_dir)/formatter/formatter_module.js",
-      "<(resources_out_dir)/har_importer/har_importer_module.js",
-      # "<(resources_out_dir)/heap_snapshot_model/heap_snapshot_model_module.js",
-      "<(resources_out_dir)/help/help_module.js",
-      "<(resources_out_dir)/inline_editor/inline_editor_module.js",
-      "<(resources_out_dir)/javascript_metadata/javascript_metadata_module.js",
-      # "<(resources_out_dir)/js_profiler/js_profiler_module.js",
-      "<(resources_out_dir)/layer_viewer/layer_viewer_module.js",
-      "<(resources_out_dir)/layers/layers_module.js",
-      # "<(resources_out_dir)/media/media_module.js",
-      "<(resources_out_dir)/network/network_module.js",
-      # "<(resources_out_dir)/node_debugger/node_debugger_module.js",
-      "<(resources_out_dir)/object_ui/object_ui_module.js",
-      "<(resources_out_dir)/perf_ui/perf_ui_module.js",
-      # "<(resources_out_dir)/performance_monitor/performance_monitor_module.js",
-      "<(resources_out_dir)/profiler/profiler_module.js",
-      "<(resources_out_dir)/quick_open/quick_open_module.js",
-      "<(resources_out_dir)/resources/resources_module.js",
-      "<(resources_out_dir)/search/search_module.js",
-      # "<(resources_out_dir)/security/security_module.js",
-      "<(resources_out_dir)/settings/settings_module.js",
-      "<(resources_out_dir)/snippets/snippets_module.js",
-      "<(resources_out_dir)/source_frame/source_frame_module.js",
-      "<(resources_out_dir)/sources/sources_module.js",
-      "<(resources_out_dir)/text_editor/text_editor_module.js",
-      "<(resources_out_dir)/timeline_model/timeline_model_module.js",
-      "<(resources_out_dir)/timeline/timeline_module.js",
-      # "<(resources_out_dir)/web_audio/web_audio_module.js",
-      "<(resources_out_dir)/workspace_diff/workspace_diff_module.js",
-    ],
-
-    'generated_remote_modules': [
-      "<(resources_out_dir)/accessibility/accessibility_module.js",
-      "<(resources_out_dir)/audits_worker/audits_worker_module.js",
-      "<(resources_out_dir)/dagre_layout/dagre_layout_module.js",
-      "<(resources_out_dir)/emulated_devices/emulated_devices_module.js",
-    ],
-
-    'generated_test_modules': [
-      "<(resources_out_dir)/accessibility_test_runner/accessibility_test_runner_module.js",
-      "<(resources_out_dir)/application_test_runner/application_test_runner_module.js",
-      "<(resources_out_dir)/audits_test_runner/audits_test_runner_module.js",
-      "<(resources_out_dir)/axe_core_test_runner/axe_core_test_runner_module.js",
-      "<(resources_out_dir)/bindings_test_runner/bindings_test_runner_module.js",
-      "<(resources_out_dir)/console_test_runner/console_test_runner_module.js",
-      "<(resources_out_dir)/coverage_test_runner/coverage_test_runner_module.js",
-      "<(resources_out_dir)/cpu_profiler_test_runner/cpu_profiler_test_runner_module.js",
-      "<(resources_out_dir)/data_grid_test_runner/data_grid_test_runner_module.js",
-      "<(resources_out_dir)/device_mode_test_runner/device_mode_test_runner_module.js",
-      "<(resources_out_dir)/elements_test_runner/elements_test_runner_module.js",
-      "<(resources_out_dir)/extensions_test_runner/extensions_test_runner_module.js",
-      "<(resources_out_dir)/heap_profiler_test_runner/heap_profiler_test_runner_module.js",
-      "<(resources_out_dir)/heap_snapshot_worker/heap_snapshot_worker_module.js",
-      "<(resources_out_dir)/integration_test_runner.html",
-      "<(resources_out_dir)/integration_test_runner.js",
-      "<(resources_out_dir)/layers_test_runner/layers_test_runner_module.js",
-      "<(resources_out_dir)/network_test_runner/network_test_runner_module.js",
-      "<(resources_out_dir)/performance_test_runner/performance_test_runner_module.js",
-      "<(resources_out_dir)/sdk_test_runner/sdk_test_runner_module.js",
-      "<(resources_out_dir)/security_test_runner/security_test_runner_module.js",
-      "<(resources_out_dir)/sources_test_runner/sources_test_runner_module.js",
-    ],
-
-    'generated_worker_bundles': [
-      "<(resources_out_dir)/formatter_worker.js",
-      "<(resources_out_dir)/heap_snapshot_worker.js",
-    ],
-
-    'devtools_applications': [
-      # "audits_worker",
-      "devtools_app",
-      "formatter_worker",
-      "heap_snapshot_worker",
-      "inspector",
-      # "integration_test_runner",
-      # "js_app",
-      # "ndb_app",
-      # "node_app",
-      "shell",
-      # "toolbox",
-      "worker_app",
-    ],
-  },
-#-------------------------------------------------------------------------------
-
-  'targets': [
-    {
-      # This is the main roll-up target to generate the devtools frontend files
-      # that go into the content directory.
-      'target_name': 'devtools',
-      'type': 'none',
-      'dependencies': [
-        # 'aria_properties',
-        'build_release_devtools',
-        # 'copy_embedder_scripts',
-        # 'copy_emulated_devices_images',
-        # 'copy_htaccess',
-        'copy_inspector_images',
-        # 'copy_lighthouse_locale_files',
-        # 'copy_wasm_deps',
-        # 'devtools_extension_api',
-        'frontend_protocol_sources',
-        'supported_css_properties',
-        'copy_devtools_modules',
-      ],
-    },
-
-    {
-      # This is an alternate roll-up target to generate the devtools frontend
-      # files, including the uncompiled version for debugging devtools itself.
-      'target_name': 'debug_devtools',
-      'type': 'none',
-      'dependencies': [
-        'devtools',
-        'build_debug_devtools',
-        # 'copy_aria_properties',
-        'copy_generated_scripts',
-      ],
-    },
-
-    {
-      'target_name': 'copy_embedder_scripts',
-      'type': 'none',
-      'copies': [{
-        'files': [ '<@(devtools_embedder_scripts)' ],
-        'destination': '<(resources_out_dir)',
-      }],
-    },
-
-    {
-      # TODO: Rename the destination file to '.htaccess'
-      'target_name': 'copy_htaccess',
-      'type': 'none',
-      'copies': [{
-        'files': [ 'htaccess' ],
-        'destination': '<(resources_out_dir)',
-      }],
-    },
-
-    {
-      'target_name': 'copy_inspector_images',
-      'type': 'none',
-      'copies': [{
-        'files': [ '<@(devtools_image_files)' ],
-        'destination': '<(resources_out_dir)/Images',
-      }],
-    },
-
-    {
-      'target_name': 'copy_emulated_devices_images',
-      'type': 'none',
-      'copies': [{
-        'files': [ '<@(devtools_emulated_devices_images)' ],
-        'destination': '<(resources_out_dir)/emulated_devices',
-      }],
-    },
-
-    {
-      'target_name': 'copy_lighthouse_locale_files',
-      'type': 'none',
-      'copies': [{
-        'files': [ '<@(lighthouse_locale_files)' ],
-        'destination': '<(resources_out_dir)/audits_worker/lighthouse/locales',
-      }],
-    },
-
-    {
-      'target_name': 'copy_wasm_deps',
-      'type': 'none',
-      'copies': [{
-        'files': [ 'front_end/sdk/wasm_source_map/pkg/wasm_source_map_bg.wasm' ],
-        'destination': '<(resources_out_dir)/sdk/wasm_source_map/pkg',
-      }],
-    },
-    {
-      'target_name': 'devtools_extension_api',
-      'type': 'none',
-      'actions': [{
-        'action_name': 'generate_devtools_extension_api',
-        'variables': {
-          'script_path': 'scripts/build/generate_devtools_extension_api.py',
-          'input_files': [ 'front_end/extensions/ExtensionAPI.js' ],
-          'output_file': '<(resources_out_dir)/devtools_extension_api.js',
-        },
-        'inputs': [ '<(script_path)', '<@(input_files)' ],
-        'outputs': [ '<(output_file)' ],
-        'action': [
-          'python2',
-          '<(script_path)',
-          '<(output_file)',
-          '<@(input_files)',
-        ],
-      }],
-    },
-
-    {
-      'target_name': 'supported_css_properties',
-      'type': 'none',
-      'actions': [{
-        'action_name': 'generate_supported_css',
-        'variables': {
-          'script_path': 'scripts/build/generate_supported_css.py',
-          'input_files': [ 'blink/properties/CSSProperties.json5' ],
-          'output_file': '<(resources_out_dir)/SupportedCSSProperties.js',
-        },
-        'inputs': [ '<(script_path)', '<@(input_files)' ],
-        'outputs': [ '<(output_file)' ],
-        'action': [
-          'python2',
-          '<(script_path)',
-          '<@(input_files)',
-          '<(output_file)',
-        ],
-      }],
-    },
-
-    {
-      'target_name': 'aria_properties',
-      'type': 'none',
-      'actions': [{
-        'action_name': 'generate_aria',
-        'variables': {
-          'script_path': 'scripts/build/generate_aria.py',
-          'input_files': [ 'blink/properties/aria_properties.json5' ],
-          'output_file': '<(resources_out_dir)/accessibility/ARIAProperties.js',
-        },
-        'inputs': [ '<(script_path)', '<@(input_files)' ],
-        'outputs': [ '<(output_file)' ],
-        'action': [
-          'python2',
-          '<(script_path)',
-          '<@(input_files)',
-          '<(output_file)',
-        ],
-      }],
-    },
-
-    {
-      'target_name': 'frontend_protocol_sources',
-      'type': 'none',
-      'dependencies': [
-        'blink/devtools_protocol/devtools_protocol.gyp:protocol_version'
-      ],
-      'actions': [{
-        'action_name': 'code_generator_frontend',
-        'variables': {
-          'script_path': 'scripts/build/code_generator_frontend.py',
-          'input_files': [ '<(SHARED_INTERMEDIATE_DIR)/third_party/devtools/blink/devtools_protocol/protocol.json' ],
-          'output_file': '<(resources_out_dir)/InspectorBackendCommands.js',
-        },
-        'inputs': [ '<(script_path)', '<@(input_files)' ],
-        'outputs': [ '<(output_file)' ],
-        'action': [
-          'python2',
-          '<(script_path)',
-          '<@(input_files)',
-          '--output_js_dir',
-          '<(resources_out_dir)',
-        ],
-      }],
-    },
-
-    {
-      'target_name': 'build_release_devtools',
-      'type': 'none',
-      'dependencies': [
-        # 'aria_properties',
-        'frontend_protocol_sources',
-        'supported_css_properties',
-      ],
-      'actions': [{
-        'action_name': 'build_release_devtool_applications',
-        'variables': {
-          'script_path': 'scripts/build/build_release_applications.py',
-          'helper_script_paths': [
-            'scripts/build/modular_build.py',
-            'scripts/build/rjsmin.py',
-          ],
-          'input_path': 'front_end',
-        },
-        'inputs': [
-          '<(script_path)',
-          '<@(helper_script_paths)',
-          '<@(all_devtools_files)',
-          '<@(devtools_test_files)',
-          '<@(generated_scripts)',
-          # '<@(generated_aria_properties)',
-          '<@(application_templates)',
-          # In `build_release_applications` we sometimes include
-          # the content of Runtime.js into the build output.
-          'front_end/Runtime.js',
-        ],
-        'outputs': [
-          '<@(generated_applications)',
-          '<@(generated_non_autostart_non_remote_modules)',
-          # '<@(generated_remote_modules)',
-          # '<@(generated_test_modules)',
-          '<@(generated_worker_bundles)',
-        ],
-        'action': [
-          'python2',
-          '<(script_path)',
-          '<@(devtools_applications)',
-          '--input_path',
-          '<(input_path)',
-          '--output_path',
-          '<(resources_out_dir)',
-        ],
-      }],
-    },
-    {
-      'target_name': 'copy_devtools_modules',
-      'type': 'none',
-      'dependencies': [
-        "build_release_devtools"
-      ],
-      'actions': [{
-        'action_name': 'copy_devtools_modules',
-        'variables': {
-          'script_path': 'scripts/build/copy_devtools_modules.py',
-          'input_path': '.',
-          # TODO: The rsp file should be in <(SHARED_INTERMEDIATE_DIR), but it's not resolved for pymod_do_main.
-          'rsp_file': 'copy_devtools_modules.rsp',
-        },
-        'inputs': [
-          '<(script_path)',
-          '<@(all_devtools_modules)',
-          '<!@pymod_do_main(third_party.devtools.scripts.build.copy_devtools_modules --gen_rsp <(rsp_file) <@(all_devtools_modules))',
-        ],
-        'outputs': [
-          '<@(copied_devtools_modules)',
-        ],
-        'action': [
-          'python2',
-          '<(script_path)',
-          '--rsp',
-          '<(rsp_file)',
-          '--input_path',
-          '<(input_path)',
-          '--output_path',
-          '<(resources_out_dir)',
-        ],
-      }],
-    },
-    {
-      'target_name': 'build_debug_devtools',
-      'type': 'none',
-      'actions': [{
-        'action_name': 'build_debug_devtools_applications',
-        'variables': {
-          'script_path': 'scripts/build/build_debug_applications.py',
-          'input_path': 'front_end',
-          'stamp_file': '<(resources_out_debug_dir)/build.stamp',
-        },
-        'inputs': [
-          '<(script_path)',
-          '<@(all_devtools_files)',
-          '<@(application_templates)',
-        ],
-        'outputs': [
-          '<(stamp_file)',
-        ],
-        'action': [
-          'python2',
-          '<(script_path)',
-          '--input_path',
-          '<(input_path)',
-          '--output_path',
-          '<(resources_out_debug_dir)',
-          '--build_stamp',
-          '<(stamp_file)',
-        ],
-      }],
-    },
-
-    {
-      'target_name': 'copy_generated_scripts',
-      'type': 'none',
-      'dependencies': [
-        'build_debug_devtools',
-        'build_release_devtools',
-        'frontend_protocol_sources',
-        'supported_css_properties',
-      ],
-      'copies': [{
-        'files': [
-          '<@(generated_scripts)',
-          '<@(generated_worker_bundles)',
-        ],
-        'destination': '<(resources_out_debug_dir)',
-      }],
-    },
-
-    {
-      'target_name': 'copy_aria_properties',
-      'type': 'none',
-      'dependencies': [
-        'aria_properties',
-        'build_debug_devtools',
-      ],
-      'copies': [{
-        'files': [ '<@(generated_aria_properties)' ],
-        'destination': '<(resources_out_debug_dir)/accessibility',
-      }],
-    },
-  ],
-}
diff --git a/third_party/devtools/front_end/cobalt/cobalt.js b/third_party/devtools/front_end/cobalt/cobalt.js
index 0c400b4..a085c62 100644
--- a/third_party/devtools/front_end/cobalt/cobalt.js
+++ b/third_party/devtools/front_end/cobalt/cobalt.js
@@ -5,6 +5,10 @@
  */
 export default class CobaltPanel extends UI.VBox {
     constructor() {
+        const trace_files = [
+            ['Trace', 'console_trace.json'],
+            ['Timed Trace', 'timed_trace.json']
+        ];
         super(true, false);
         SDK.targetManager.observeTargets(this);
 
@@ -12,14 +16,15 @@
         this._runtimeAgent = this._target.runtimeAgent();
 
         this.element = this._shadowRoot.createChild('div');
-        this.element.textContent = 'Cobalt Console'
+        this.element.textContent = 'Cobalt Console';
         let download_element = this._shadowRoot.createChild('a', 'download');
         download_element.style.display = 'none';
 
         const traceContainer = this.element.createChild('div', 'trace-container');
         traceContainer.appendChild(UI.createTextButton(Common.UIString('Start Trace'), event => {
             console.log("Start Trace");
-            this.run(`(function() { window.h5vcc.traceEvent.start();})()`);
+            const filename = trace_files[0][1];
+            this.run(`(function() { window.h5vcc.traceEvent.start('${filename}');})()`);
             console.log("Started Trace");
         }));
         traceContainer.appendChild(UI.createTextButton(Common.UIString('Stop Trace'), event => {
@@ -27,17 +32,20 @@
             this.run(`(function() { window.h5vcc.traceEvent.stop();})()`);
             console.log("Stopped Trace");
         }));
-        traceContainer.appendChild(UI.createTextButton(Common.UIString('Download Trace'), event => {
-            console.log("Download Trace");
-            this.run(`(function() { return window.h5vcc.traceEvent.read();})()`).then(function (result) {
-                download_element.setAttribute('href', 'data:text/plain;charset=utf-8,' +
-                    encodeURIComponent(result.result.value));
-                download_element.setAttribute('download', 'trace.json');
-                console.log("Downloaded Trace");
-                download_element.click();
-                download_element.setAttribute('href', undefined);
-            });
-        }));
+        trace_files.forEach( (file) => {
+            traceContainer.appendChild(UI.createTextButton(Common.UIString('Download ' + file[0]), event => {
+                console.log("Download Trace");
+                const filename = file[1];
+                this.run(`(function() { return window.h5vcc.traceEvent.read('${filename}');})()`).then(function (result) {
+                    download_element.setAttribute('href', 'data:text/plain;charset=utf-8,' +
+                        encodeURIComponent(result.result.value));
+                    download_element.setAttribute('download', filename);
+                    console.log("Downloaded Trace");
+                    download_element.click();
+                    download_element.setAttribute('href', undefined);
+                });
+            }));
+        });
     }
 
     async run(expression) {
diff --git a/third_party/devtools/scripts/build/build_release_applications.py b/third_party/devtools/scripts/build/build_release_applications.py
index dcc839b..e603708 100644
--- a/third_party/devtools/scripts/build/build_release_applications.py
+++ b/third_party/devtools/scripts/build/build_release_applications.py
@@ -11,7 +11,7 @@
 - Builds app.html referencing the application script.
 """
 
-from cStringIO import StringIO
+from io import StringIO
 from os import path
 from os.path import join
 import copy
@@ -193,7 +193,7 @@
             resource_name = path.normpath(resource_name).replace('\\', '/')
             output.write('Root.Runtime.cachedResources["%s"] = "' % resource_name)
             resource_content = read_file(path.join(self.application_dir, resource_name))
-            resource_content += resource_source_url(resource_name).encode('utf-8')
+            resource_content += resource_source_url(resource_name)
             resource_content = resource_content.replace('\\', '\\\\')
             resource_content = resource_content.replace('\n', '\\n')
             resource_content = resource_content.replace('"', '\\"')
@@ -236,7 +236,7 @@
             output.write('/* Additional descriptors */\n')
             output.write('Root.allDescriptors.push(...%s);' % self._release_module_descriptors())
             output.write('/* Additional descriptors %s */\n' % self.app_file('json'))
-            output.write('Root.applicationDescriptor.modules.push(...%s);' % json.dumps(self.descriptors.application.values()))
+            output.write('Root.applicationDescriptor.modules.push(...%s);' % json.dumps(list(self.descriptors.application.values())))
 
         output.write('\n/* Autostart modules */\n')
         if (self.descriptors.worker):
diff --git a/third_party/devtools/scripts/build/modular_build.py b/third_party/devtools/scripts/build/modular_build.py
index dd01d8f..9671fa2 100755
--- a/third_party/devtools/scripts/build/modular_build.py
+++ b/third_party/devtools/scripts/build/modular_build.py
@@ -24,7 +24,7 @@
 import json5 as json # pylint: disable=import-error
 
 def read_file(filename):
-    with open(path.normpath(filename), 'rt') as input:
+    with open(path.normpath(filename), 'rt', encoding="utf-8") as input:
         return input.read()
 
 
@@ -34,7 +34,7 @@
     directory = path.dirname(filename)
     if not path.exists(directory):
         os.makedirs(directory)
-    with open(filename, 'wt') as output:
+    with open(filename, 'wt', encoding="utf-8") as output:
         output.write(content)
 
 
@@ -46,7 +46,7 @@
     try:
         return json.loads(read_file(filename))
     except:
-        print 'ERROR: Failed to parse %s' % filename
+        print('ERROR: Failed to parse {}'.format(filename))
         raise
 
 
@@ -74,7 +74,7 @@
 
     def application_json(self):
         result = dict()
-        result['modules'] = self.application.values()
+        result['modules'] = list(self.application.values())
         result['has_html'] = self.has_html
         return json.dumps(result)
 
diff --git a/third_party/ffmpeg_includes/ffmpeg_includes.gyp b/third_party/ffmpeg_includes/ffmpeg_includes.gyp
deleted file mode 100644
index 51e447c..0000000
--- a/third_party/ffmpeg_includes/ffmpeg_includes.gyp
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'libav.54.35.1',
-      'type': 'none',
-      'direct_dependent_settings': {
-        'include_dirs': [ 'libav.54.35.1' ],
-      },
-    },
-    {
-      'target_name': 'libav.56.1.0',
-      'type': 'none',
-      'direct_dependent_settings': {
-        'include_dirs': [ 'libav.56.1.0' ],
-      },
-    },
-    {
-      'target_name': 'ffmpeg.57.107.100',
-      'type': 'none',
-      'direct_dependent_settings': {
-        'include_dirs': [ 'ffmpeg.57.107.100' ],
-      },
-    },
-    {
-      'target_name': 'ffmpeg.58.35.100',
-      'type': 'none',
-      'direct_dependent_settings': {
-        'include_dirs': [ 'ffmpeg.58.35.100' ],
-      },
-    },
-  ],
-}
diff --git a/third_party/flac/flac.gyp b/third_party/flac/flac.gyp
deleted file mode 100644
index b448544..0000000
--- a/third_party/flac/flac.gyp
+++ /dev/null
@@ -1,120 +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.
-
-{
-  'variables': {
-    'use_system_flac%': 0,
-  },
-  'conditions': [
-    ['use_system_flac==0', {
-      'targets': [
-        {
-          'target_name': 'libflac',
-          'product_name': 'flac',
-          'type': '<(library)',
-          'sources': [
-            'include/FLAC/all.h',
-            'include/FLAC/assert.h',
-            'include/FLAC/callback.h',
-            'include/FLAC/export.h',
-            'include/FLAC/format.h',
-            'include/FLAC/metadata.h',
-            'include/FLAC/ordinals.h',
-            'include/FLAC/stream_decoder.h',
-            'include/FLAC/stream_encoder.h',
-            'include/share/alloc.h',
-            'src/libFLAC/alloc.c',
-            'src/libFLAC/bitmath.c',
-            'src/libFLAC/bitreader.c',
-            'src/libFLAC/bitwriter.c',
-            'src/libFLAC/cpu.c',
-            'src/libFLAC/crc.c',
-            'src/libFLAC/fixed.c',
-            'src/libFLAC/float.c',
-            'src/libFLAC/format.c',
-            'src/libFLAC/lpc.c',
-            'src/libFLAC/md5.c',
-            'src/libFLAC/memory.c',
-            'src/libFLAC/stream_decoder.c',
-            'src/libFLAC/stream_encoder.c',
-            'src/libFLAC/stream_encoder_framing.c',
-            'src/libFLAC/window.c',
-            'src/libFLAC/include/private/all.h',
-            'src/libFLAC/include/private/bitmath.h',
-            'src/libFLAC/include/private/bitreader.h',
-            'src/libFLAC/include/private/bitwriter.h',
-            'src/libFLAC/include/private/cpu.h',
-            'src/libFLAC/include/private/crc.h',
-            'src/libFLAC/include/private/fixed.h',
-            'src/libFLAC/include/private/float.h',
-            'src/libFLAC/include/private/format.h',
-            'src/libFLAC/include/private/lpc.h',
-            'src/libFLAC/include/private/md5.h',
-            'src/libFLAC/include/private/memory.h',
-            'src/libFLAC/include/private/metadata.h',
-            'src/libFLAC/include/private/stream_encoder_framing.h',
-            'src/libFLAC/include/private/window.h',
-            'src/libFLAC/include/protected/all.h',
-            'src/libFLAC/include/protected/stream_decoder.h',
-            'src/libFLAC/include/protected/stream_encoder.h',
-          ],
-          'defines': [
-            'FLAC__NO_DLL',
-            'FLAC__OVERFLOW_DETECT',
-            'VERSION="1.2.1"',
-          ],
-          'include_dirs': [
-            'include',
-            'src/libFLAC/include',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'FLAC__NO_DLL',
-            ],
-          },
-          'conditions': [
-            ['clang == 1', {
-              'xcode_settings': {
-                'WARNING_CFLAGS': [
-                  # libflac converts between FLAC__StreamDecoderState and
-                  # FLAC__StreamDecoderInitStatus a lot in stream_decoder.c.
-                  '-Wno-conversion',
-                ],
-              },
-              'cflags': [
-                '-Wno-conversion',
-              ],
-            }],
-          ],
-        },
-      ],
-    }, { # use_system_speex != 0
-      'targets': [
-        {
-          'target_name': 'libflac',
-          'type': 'none',
-          'direct_dependent_settings': {
-            'defines': [
-              'USE_SYSTEM_FLAC',
-            ],
-          },
-          'link_settings': {
-            'ldflags': [
-              '<!@(pkg-config --libs-only-L --libs-only-other flac)',
-            ],
-            'libraries': [
-              '<!@(pkg-config --libs-only-l flac)',
-            ],
-          },
-        },
-      ],
-    }],
-  ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/third_party/freetype2/freetype2_cobalt.gyp b/third_party/freetype2/freetype2_cobalt.gyp
deleted file mode 100644
index b94a33e..0000000
--- a/third_party/freetype2/freetype2_cobalt.gyp
+++ /dev/null
@@ -1,87 +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.
-
-{
- 'variables': {
-    'ft2_dir': '<(DEPTH)/third_party/freetype2',
- },
- 'targets': [
-    {
-      'target_name': 'freetype2',
-      'type': 'static_library',
-      'toolsets': ['target'],
-      'sources': [
-        '<(ft2_dir)/src/autofit/autofit.c',
-        '<(ft2_dir)/src/base/ftbase.c',
-        '<(ft2_dir)/src/base/ftbbox.c',
-        '<(ft2_dir)/src/base/ftbitmap.c',
-        '<(ft2_dir)/src/base/ftdebug.c',
-        '<(ft2_dir)/src/base/ftfstype.c',
-        '<(ft2_dir)/src/base/ftgasp.c',
-        '<(ft2_dir)/src/base/ftglyph.c',
-        '<(ft2_dir)/src/base/ftinit.c',
-        '<(ft2_dir)/src/base/ftmm.c',
-        '<(ft2_dir)/src/base/ftstroke.c',
-        '<(ft2_dir)/src/base/ftsystem.c',
-        '<(ft2_dir)/src/base/fttype1.c',
-        '<(ft2_dir)/src/cff/cff.c',
-        '<(ft2_dir)/src/gzip/ftgzip.c',
-        '<(ft2_dir)/src/psaux/psaux.c',
-        '<(ft2_dir)/src/pshinter/pshinter.c',
-        '<(ft2_dir)/src/psnames/psnames.c',
-        '<(ft2_dir)/src/raster/raster.c',
-        '<(ft2_dir)/src/sfnt/sfnt.c',
-        '<(ft2_dir)/src/smooth/smooth.c',
-        '<(ft2_dir)/src/truetype/truetype.c',
-      ],
-      'defines': [
-        'FT_CONFIG_OPTION_SYSTEM_ZLIB',
-        'FT2_BUILD_LIBRARY',
-        'FT_CONFIG_CONFIG_H="ftconfig.h"',
-        'FT_CONFIG_MODULES_H="ftmodule.h"',
-        'FT_CONFIG_OPTIONS_H="ftoption.h"',
-      ],
-      'include_dirs': [
-        '<(ft2_dir)/include_cobalt',
-        '<(ft2_dir)/include',
-        '<(DEPTH)/third_party/brotli/c/include',
-      ],
-      'dependencies': [
-        '<(DEPTH)/third_party/libpng/libpng.gyp:libpng',
-        '<(DEPTH)/third_party/zlib/zlib.gyp:zlib',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(ft2_dir)/include_cobalt',
-          '<(ft2_dir)/include',
-        ],
-        'defines': [
-          'FT_CONFIG_OPTION_SYSTEM_ZLIB',
-          'FT_CONFIG_CONFIG_H="ftconfig.h"',
-          'FT_CONFIG_MODULES_H="ftmodule.h"',
-          'FT_CONFIG_OPTIONS_H="ftoption.h"',
-        ],
-      },
-      'msvs_disabled_warnings': [
-        # Level 1 - Formal parameter 'number' is different from declaration.
-        4028,
-        # Level 1 - Incompatible types conversion.
-        4133,
-        # Level 2 - Unary minus operator applied to unsigned type; result is
-        # still unsigned.
-        4146,
-        # Level 1 - Conversion from 'type1' to 'type2' of a greater size.
-        # Typically when 32-bit value is assigned to a 64-bit pointer value.
-        4312,
-      ],
-      'conditions': [
-        ['clang == 1', {
-          'cflags': [
-            '-Wno-tautological-compare',
-          ],
-        }],
-      ],
-    },
-  ], # targets
-}
diff --git a/third_party/google_benchmark/google_benchmark.gyp b/third_party/google_benchmark/google_benchmark.gyp
deleted file mode 100644
index 0464259..0000000
--- a/third_party/google_benchmark/google_benchmark.gyp
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'google_benchmark',
-      'type': 'static_library',
-      'sources': [
-        'src/benchmark.cc',
-        'src/benchmark_api_internal.cc',
-        'src/benchmark_name.cc',
-        'src/benchmark_register.cc',
-        'src/benchmark_runner.cc',
-        'src/colorprint_starboard.cc',
-        'src/commandlineflags.cc',
-        'src/complexity.cc',
-        'src/console_reporter.cc',
-        'src/counter.cc',
-        'src/csv_reporter.cc',
-        'src/json_reporter.cc',
-        'src/reporter.cc',
-        'src/sleep.cc',
-        'src/statistics.cc',
-        'src/string_util.cc',
-        'src/sysinfo.cc',
-        'src/timers.cc',
-      ],
-      'include_dirs': [
-        'include',
-      ],
-    },
-  ],
-}
diff --git a/third_party/harfbuzz-ng/harfbuzz.gyp b/third_party/harfbuzz-ng/harfbuzz.gyp
deleted file mode 100644
index 1e2a29a..0000000
--- a/third_party/harfbuzz-ng/harfbuzz.gyp
+++ /dev/null
@@ -1,184 +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.
-
-{
-  'variables': {
-    'use_system_harfbuzz%': 0,
-  },
-  'includes': [
-    '../../build_gyp/win_precompile.gypi',
-  ],
-  'conditions': [
-    ['use_system_harfbuzz==0', {
-      'targets': [
-        {
-          'target_name': 'harfbuzz-ng',
-          'type': 'static_library',
-          'defines': [
-            'HAVE_OT',
-            'HAVE_ICU',
-            'HAVE_ICU_BUILTIN',
-            'HB_NO_MT',
-          ],
-          'sources': [
-            'src/hb-atomic-private.hh',
-            'src/hb-blob.cc',
-            'src/hb-blob.h',
-            'src/hb-buffer.cc',
-            'src/hb-buffer-deserialize-json.hh',
-            'src/hb-buffer-deserialize-text.hh',
-            'src/hb-buffer.h',
-            'src/hb-buffer-private.hh',
-            'src/hb-buffer-serialize.cc',
-            'src/hb-cache-private.hh',
-            'src/hb-common.cc',
-            'src/hb-common.h',
-            'src/hb-deprecated.h',
-            'src/hb-face.cc',
-            'src/hb-face.h',
-            'src/hb-face-private.hh',
-            'src/hb-fallback-shape.cc',
-            'src/hb-font.cc',
-            'src/hb-font.h',
-            'src/hb-font-private.hh',
-            'src/hb.h',
-            'src/hb-icu.cc',
-            'src/hb-icu.h',
-            'src/hb-mutex-private.hh',
-            'src/hb-object-private.hh',
-            'src/hb-open-file-private.hh',
-            'src/hb-open-type-private.hh',
-            'src/hb-ot.h',
-            'src/hb-ot-font.cc',
-            'src/hb-ot-font.h',
-            'src/hb-ot-head-table.hh',
-            'src/hb-ot-hhea-table.hh',
-            'src/hb-ot-hmtx-table.hh',
-            'src/hb-ot-layout.cc',
-            'src/hb-ot-layout-common-private.hh',
-            'src/hb-ot-layout-gdef-table.hh',
-            'src/hb-ot-layout-gpos-table.hh',
-            'src/hb-ot-layout-gsubgpos-private.hh',
-            'src/hb-ot-layout-gsub-table.hh',
-            'src/hb-ot-layout.h',
-            'src/hb-ot-layout-private.hh',
-            'src/hb-ot-map.cc',
-            'src/hb-ot-map-private.hh',
-            'src/hb-ot-maxp-table.hh',
-            'src/hb-ot-name-table.hh',
-            'src/hb-ot-shape.cc',
-            'src/hb-ot-shape-complex-arabic.cc',
-            'src/hb-ot-shape-complex-arabic-fallback.hh',
-            'src/hb-ot-shape-complex-arabic-private.hh',
-            'src/hb-ot-shape-complex-arabic-table.hh',
-            'src/hb-ot-shape-complex-default.cc',
-            'src/hb-ot-shape-complex-hangul.cc',
-            'src/hb-ot-shape-complex-hebrew.cc',
-            'src/hb-ot-shape-complex-indic.cc',
-            'src/hb-ot-shape-complex-indic-machine.hh',
-            'src/hb-ot-shape-complex-indic-private.hh',
-            'src/hb-ot-shape-complex-indic-table.cc',
-            'src/hb-ot-shape-complex-myanmar.cc',
-            'src/hb-ot-shape-complex-myanmar-machine.hh',
-            'src/hb-ot-shape-complex-private.hh',
-            'src/hb-ot-shape-complex-thai.cc',
-            'src/hb-ot-shape-complex-tibetan.cc',
-            'src/hb-ot-shape-complex-use.cc',
-            'src/hb-ot-shape-complex-use-machine.hh',
-            'src/hb-ot-shape-complex-use-private.hh',
-            'src/hb-ot-shape-complex-use-table.cc',
-            'src/hb-ot-shape-fallback.cc',
-            'src/hb-ot-shape-fallback-private.hh',
-            'src/hb-ot-shape.h',
-            'src/hb-ot-shape-normalize.cc',
-            'src/hb-ot-shape-normalize-private.hh',
-            'src/hb-ot-shape-private.hh',
-            'src/hb-ot-tag.cc',
-            'src/hb-ot-tag.h',
-            'src/hb-private.hh',
-            'src/hb-set.cc',
-            'src/hb-set.h',
-            'src/hb-set-private.hh',
-            'src/hb-shape.cc',
-            'src/hb-shape.h',
-            'src/hb-shape-plan.cc',
-            'src/hb-shape-plan.h',
-            'src/hb-shape-plan-private.hh',
-            'src/hb-shaper.cc',
-            'src/hb-shaper-impl-private.hh',
-            'src/hb-shaper-list.hh',
-            'src/hb-shaper-private.hh',
-            'src/hb-unicode.cc',
-            'src/hb-unicode.h',
-            'src/hb-unicode-private.hh',
-            'src/hb-utf-private.hh',
-            'src/hb-version.h',
-            'src/hb-warning.cc',
-          ],
-          'include_dirs': [
-            'src',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'src',
-            ],
-          },
-          'dependencies': [
-            '../../third_party/icu/icu.gyp:icuuc',
-          ],
-          'conditions': [
-            ['clang==1', {
-              'xcode_settings': {
-                'WARNING_CFLAGS': [
-                  '-Wno-unused-value',
-                  # Harfbuzz uses unused typedefs for its static asserts (and its
-                  # static asserts are strange enough that they can't be replaced
-                  # by static_assert).
-                  '-Wno-unused-local-typedef',
-                ],
-              },
-              'cflags': [
-                '-Wno-unused-value',
-                # Harfbuzz uses unused typedefs for its static asserts (and its
-                # static asserts are strange enough that they can't be replaced
-                # by static_assert).
-                '-Wno-unused-local-typedef',
-              ]
-            }],
-            # Disable windows harfbuzz warnings:
-            #   4267: on amd64. size_t -> int, size_t -> unsigned int
-            #   4334: '<<' : result of 32-bit shift implicitly converted to 64
-            #       bits (was 64-bit shift intended?)
-            ['target_arch=="win"', {
-              'msvs_disabled_warnings': [4267, 4334],
-            }],
-          ],
-        },
-      ],
-    }, {  # use_system_harfbuzz==1
-      'targets': [
-        {
-          'target_name': 'harfbuzz-ng',
-          'type': 'none',
-          'cflags': [
-            '<!@(<(pkg-config) --cflags harfbuzz)',
-          ],
-          'direct_dependent_settings': {
-            'cflags': [
-              '<!@(<(pkg-config) --cflags harfbuzz)',
-            ],
-          },
-          'link_settings': {
-            'ldflags': [
-              '<!@(<(pkg-config) --libs-only-L --libs-only-other harfbuzz)',
-            ],
-            'libraries': [
-              '<!@(<(pkg-config) --libs-only-l harfbuzz)',
-            ],
-          },
-        },
-      ],
-    }],
-  ],
-}
diff --git a/third_party/icu/icu.gyp b/third_party/icu/icu.gyp
deleted file mode 100644
index 8028893..0000000
--- a/third_party/icu/icu.gyp
+++ /dev/null
@@ -1,838 +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.
-
-{
-  'includes': [
-    'icu.gypi',
-  ],
-  'variables': {
-    'use_system_icu%': 0,
-    'icu_use_data_file_flag%': 0,
-    'want_separate_host_toolset%': 0,
-    'icudata_target_type': 'static_library',
-  },
-  'target_defaults': {
-    'direct_dependent_settings': {
-      'defines': [
-        # Tell ICU to not insert |using namespace icu;| into its headers,
-        # so that chrome's source explicitly has to use |icu::|.
-        'U_USING_ICU_NAMESPACE=0',
-        # We don't use ICU plugins and dyload is only necessary for them.
-        # NaCl-related builds also fail looking for dlfcn.h when it's enabled.
-        'U_ENABLE_DYLOAD=0',
-        # Disable unused ICU code
-        'UCONFIG_ONLY_HTML_CONVERSION',
-        'UCONFIG_NO_COLLATION',
-        'UCONFIG_NO_LEGACY_CONVERSION',
-        'UCONFIG_NO_TRANSLITERATION',
-        'UCONFIG_NO_REGULAR_EXPRESSIONS'
-      ],
-      # Some dependencies also use UBool, which triggers this warning.
-      'msvs_disabled_warnings': [4805],
-    },
-    'defines': [
-      'U_USING_ICU_NAMESPACE=0',
-      'HAVE_DLOPEN=0',
-      # Only build encoding coverters and detectors necessary for HTML5.
-      'UCONFIG_ONLY_HTML_CONVERSION=1',
-      # TODO(jshin): Do we still need/want this?
-      'UCONFIG_USE_WINDOWS_LCID_MAPPING_API=0',
-      # No dependency on the default platform encoding.
-      # Will cut down the code size.
-      'U_CHARSET_IS_UTF8=1',
-    ],
-    'conditions': [
-      ['clang == 1', {
-        'cflags': [
-          # ICU has some `unsigned < 0` checks.
-          '-Wno-tautological-compare',
-        ],
-      }],
-      ['component=="static_library"', {
-        'defines': [
-          'U_STATIC_IMPLEMENTATION',
-        ],
-        'direct_dependent_settings': {
-          'defines': [
-            'U_STATIC_IMPLEMENTATION',
-          ]
-        },
-      }],
-      ['OS=="win"', {
-        'defines': [
-          'UCHAR_TYPE=wchar_t',
-        ],
-	'cflags': [ '/utf-8' ],
-      },{
-        'defines': [
-          'UCHAR_TYPE=uint16_t',
-        ],
-      }],
-      ['(OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \
-         or OS=="netbsd" or OS=="mac" or OS=="android" or OS=="qnx") and \
-        (target_arch=="arm" or target_arch=="x86" or \
-         target_arch=="mipsel" or target_arch=="mips" or \
-         target_arch=="ppc" or target_arch=="s390")', {
-        'target_conditions': [
-          ['_toolset=="host"', {
-            'conditions': [
-              ['host_arch=="s390" or host_arch=="s390x"', {
-                'cflags': [ '-m31' ],
-                'ldflags': [ '-m31' ],
-                'asflags': [ '-31' ],
-              },{
-               'cflags': [ '-m32' ],
-               'ldflags': [ '-m32' ],
-               'asflags': [ '-32' ],
-              }],
-            ],
-            'xcode_settings': {
-              'ARCHS': [ 'i386' ],
-            },
-          }],
-        ],
-      }],
-      ['(OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \
-         or OS=="netbsd" or OS=="mac" or OS=="android" or OS=="qnx") and \
-        (target_arch=="arm64" or target_arch=="x64" or \
-         target_arch=="mips64el" or target_arch=="mips64" or \
-         target_arch=="ppc64" or target_arch=="s390x")', {
-        'target_conditions': [
-          ['_toolset=="host"', {
-            'cflags': [ '-m64' ],
-            'ldflags': [ '-m64' ],
-            'asflags': [ '-64' ],
-            'xcode_settings': {
-              'ARCHS': [ 'x86_64' ],
-            },
-          }],
-        ],
-      }],
-    ],
-    'include_dirs': [
-      'source/common',
-      'source/i18n',
-    ],
-    # Add 4244 to allow conversion of float to int, 4661 to allow undefined
-    # member of template class, 4805 to allow comparison between bool and int
-    'msvs_disabled_warnings': [4005, 4068, 4244, 4267, 4661, 4805],
-  },
-  'conditions': [
-    ['use_system_icu==0 or want_separate_host_toolset==1', {
-      'targets': [
-        {
-          'target_name': 'copy_icudt_dat',
-          'type': 'none',
-          # icudtl.dat is the same for both host/target, so this only supports a
-          # single toolset. If a target requires that the .dat file be copied
-          # to the output directory, it should explicitly depend on this target
-          # with the host toolset (like copy_icudt_dat#host).
-          'toolsets': [ 'host' ],
-          'copies': [{
-            'destination': '<(PRODUCT_DIR)',
-            'conditions': [
-              [ 'cobalt==1', {
-                # TODO: ICU data handling should be unified with
-                # the Chromium code.
-                'includes': [
-                  '<(DEPTH)/cobalt/build/copy_icu_data.gypi',
-                ],
-              }],
-              ['OS == "android"', {
-                'files': [
-                  'android/icudtl.dat',
-                ],
-              } , { # else: OS != android
-                'conditions': [
-                  # Big Endian
-                  [ 'target_arch=="mips" or \
-                     target_arch=="mips64"', {
-                    'files': [
-                      'common/icudtb.dat',
-                    ],
-                  } , {  # else: ! Big Endian = Little Endian
-                    'files': [
-                      'common/icudtl.dat',
-                    ],
-                  }],
-                ],
-              }],
-            ],
-          }],
-        },
-        {
-          'target_name': 'data_assembly',
-          'type': 'none',
-          'conditions': [
-            [ 'target_arch=="mips" or \
-               target_arch=="mips64"', { # Big Endian
-              'data_assembly_inputs': [
-                'common/icudtb.dat',
-              ],
-              'data_assembly_outputs': [
-                '<(SHARED_INTERMEDIATE_DIR)/third_party/icu/icudtb_dat.S',
-              ],
-            }, { # Little Endian
-              'data_assembly_outputs': [
-                '<(SHARED_INTERMEDIATE_DIR)/third_party/icu/icudtl_dat.S',
-              ],
-              'conditions': [
-                ['OS == "android"', {
-                  'data_assembly_inputs': [
-                    'android/icudtl.dat',
-                  ],
-                } , { # else: OS!="android"
-                  'data_assembly_inputs': [
-                    'common/icudtl.dat',
-                  ],
-                }], # OS==android
-              ],
-            }],
-          ],
-          'sources': [
-            '<@(_data_assembly_inputs)',
-          ],
-          'actions': [
-            {
-              'action_name': 'make_data_assembly',
-              'inputs': [
-                'scripts/make_data_assembly.py',
-                '<@(_data_assembly_inputs)',
-              ],
-              'outputs': [
-                '<@(_data_assembly_outputs)',
-              ],
-              'target_conditions': [
-                 [ 'OS == "mac" or OS == "ios" or '
-                   '((OS == "android" or OS == "qnx") and '
-                   '_toolset == "host" and host_os == "mac")', {
-                   'action': ['python', '<@(_inputs)', '<@(_outputs)', '--mac'],
-                 } , {
-                   'action': ['python', '<@(_inputs)', '<@(_outputs)'],
-                 }],
-              ],
-            },
-          ],
-        },
-        {
-          'target_name': 'icudata',
-          'type': 'static_library',
-          'defines': [
-            'U_HIDE_DATA_SYMBOL',
-            'U_ICUDATAENTRY_IN_COMMON',
-          ],
-          'dependencies': [
-            'data_assembly#target',
-          ],
-          'sources': [
-            'source/stubdata/stubdata.cpp',
-          ],
-          'conditions': [
-            [ 'target_arch=="mips" or \
-               target_arch=="mips64"', {
-              'sources!': [
-                '<(SHARED_INTERMEDIATE_DIR)/third_party/icu/icudtl_dat.S'
-              ],
-            }, {
-              'sources!': [
-                '<(SHARED_INTERMEDIATE_DIR)/third_party/icu/icudtb_dat.S'
-              ],
-            }],
-            [ 'use_system_icu==1 and want_separate_host_toolset==1', {
-              'toolsets': ['host'],
-            }],
-            [ 'use_system_icu==0 and want_separate_host_toolset==1', {
-              'toolsets': ['host', 'target'],
-            }],
-            [ 'use_system_icu==0 and want_separate_host_toolset==0', {
-              'toolsets': ['target'],
-            }],
-            [ 'cobalt==1', {
-              # TODO: ICU data handling should be unified with
-              # the Chromium code.
-              'includes': [
-                '<(DEPTH)/cobalt/build/copy_icu_data.gypi',
-              ],
-              'dependencies!': [
-                'data_assembly#target',
-              ],
-            }],
-            [ 'OS == "win" and icu_use_data_file_flag==0', {
-              'type': 'none',
-              'dependencies!': [
-                'data_assembly#target',
-              ],
-              'copies': [
-                {
-                  'destination': '<(PRODUCT_DIR)',
-                  'files': [
-                    'windows/icudt.dll',
-                  ],
-                },
-              ],
-            }],
-            [ 'icu_use_data_file_flag==1', {
-              'type': 'none',
-              'dependencies!': [
-                'data_assembly#target',
-              ],
-              # Remove any assembly data file.
-              'sources/': [['exclude', 'icudt[lb]_dat']],
-
-              # Make sure any binary depending on this gets the data file.
-              'conditions': [
-                ['OS != "ios"', {
-                  'dependencies': [
-                    'copy_icudt_dat#host',
-                  ],
-                } , { # else: OS=="ios"
-                  'link_settings': {
-                    'mac_bundle_resources': [
-                      'common/icudtl.dat',
-                    ],
-                  },
-                }], # OS!=ios
-              ], # conditions
-            }], # icu_use_data_file_flag
-          ], # conditions
-        },
-        {
-          'target_name': 'icui18n',
-          'type': '<(component)',
-          'sources': [
-            '<@(icui18n_sources)',
-          ],
-          'defines': [
-            'U_I18N_IMPLEMENTATION',
-          ],
-          'dependencies': [
-            'icuuc',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'source/i18n',
-            ],
-          },
-          'variables': {
-            'clang_warning_flags': [
-              # ICU uses its own deprecated functions.
-              '-Wno-deprecated-declarations',
-              # ICU prefers `a && b || c` over `(a && b) || c`.
-              '-Wno-logical-op-parentheses',
-              # ICU has some `unsigned < 0` checks.
-              '-Wno-tautological-compare',
-              # ICU has some code with the pattern:
-              #   if (found = uprv_getWindowsTimeZoneInfo(...))
-              '-Wno-parentheses',
-            ],
-          },
-          # Since ICU wants to internally use its own deprecated APIs, don't
-          # complain about it.
-          'xcode_settings': {
-            'GCC_ENABLE_CPP_RTTI': 'YES',       # -frtti
-          },
-          'conditions': [
-            [ 'os_posix == 1 and OS != "mac" and OS != "ios" and OS != "lb_shell"', {
-              # Since ICU wants to internally use its own deprecated APIs, don't
-              # complain about it.
-              'cflags': [
-                '-Wno-deprecated-declarations',
-              ],
-              'cflags_cc': [
-                '-frtti',
-              ],
-            }],
-            ['OS == "mac" or OS == "ios"', {
-              'xcode_settings': {
-                'GCC_ENABLE_CPP_RTTI': 'YES',       # -frtti
-              },
-            }],
-            ['OS == "win"', {
-              'msvs_settings': {
-                'VCCLCompilerTool': {
-                  'RuntimeTypeInfo': 'true',
-                },
-              }
-            }],
-            ['(OS == "lb_shell" or OS=="starboard") and target_arch == "ps3"', {
-              'cflags_cc': [
-                '-Xc+=rtti',
-              ],
-              'cflags!': [
-                '-Wno-deprecated-declarations',
-                '-Wno-unused-function',
-              ],
-              'cflags_cc!': [
-                '-frtti',
-              ],
-            }],
-            [ 'use_system_icu==1 and want_separate_host_toolset==1', {
-              'toolsets': ['host'],
-            }],
-            [ 'use_system_icu==0 and want_separate_host_toolset==1', {
-              'toolsets': ['host', 'target'],
-            }],
-            [ 'use_system_icu==0 and want_separate_host_toolset==0', {
-              'toolsets': ['target'],
-            }],
-            ['OS == "android" and clang==0', {
-                # Disable sincos() optimization to avoid a linker error since
-                # Android's math library doesn't have sincos().  Either
-                # -fno-builtin-sin or -fno-builtin-cos works.
-                'cflags': [
-                    '-fno-builtin-sin',
-                ],
-            }],
-            ['OS=="starboard"', {
-              'defines': [
-                'U_HAVE_NL_LANGINFO_CODESET=0',
-                'U_HAVE_NL_LANGINFO=0'
-              ],
-              'dependencies': [
-                '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-               ],
-            }],
-            ['(OS=="starboard") and (target_os=="android")', {
-              'cflags_cc': [
-                # reldtfmt.cpp compares 'UDateFormatStyle' and 'EStyle'.
-                '-Wno-enum-compare-switch',
-              ],
-            }],
-            ['(OS=="lb_shell" or OS=="starboard") and (target_os=="android" or target_os=="linux" or clang==1)', {
-              'cflags_cc': [
-                '-frtti',
-              ],
-              'cflags_cc!': [
-                '-fno-rtti',
-              ],
-            }],
-            [ 'OS == "win" and clang==1', {
-              # Note: General clang warnings should go in the
-              # clang_warning_flags block above.
-              'msvs_settings': {
-                'VCCLCompilerTool': {
-                  'AdditionalOptions': [
-                    '-Wno-implicit-exception-spec-mismatch',
-                  ],
-                },
-              },
-            }],
-          ], # conditions
-        },
-        {
-          'target_name': 'icuuc',
-          'type': '<(component)',
-          'sources': [
-            '<@(icuuc_sources)',
-          ],
-          'defines': [
-            'U_COMMON_IMPLEMENTATION',
-          ],
-          'dependencies': [
-            'icudata',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              'source/common',
-            ],
-            'msvs_settings': {

-              'VCCLCompilerTool': {

-                # Certain currency characters will try to use the legacy

-                # windows-1252 encoding unless we explicitly specify utf-8

-                'AdditionalOptions': ['/utf-8'],

-              },

-            },
-            'conditions': [
-              [ 'component=="static_library"', {
-                'defines': [
-                  'U_STATIC_IMPLEMENTATION',
-                ],
-                'direct_dependent_settings': {
-                  'defines': [
-                    'U_STATIC_IMPLEMENTATION',
-                  ],
-                },
-              }],
-            ],
-          },
-          'variables': {
-            'clang_warning_flags': [
-              # ICU uses its own deprecated functions.
-              '-Wno-deprecated-declarations',
-              # ICU prefers `a && b || c` over `(a && b) || c`.
-              '-Wno-logical-op-parentheses',
-              # ICU has some `unsigned < 0` checks.
-              '-Wno-tautological-compare',
-              # uresdata.c has switch(RES_GET_TYPE(x)) code. The
-              # RES_GET_TYPE macro returns an UResType enum, but some switch
-              # statement contains case values that aren't part of that
-              # enum (e.g. URES_TABLE32 which is in UResInternalType). This
-              # is on purpose.
-              '-Wno-switch',
-              # ICU has some code with the pattern:
-              #   if (found = uprv_getWindowsTimeZoneInfo(...))
-              '-Wno-parentheses',
-              # ICU generally has no unused variables, but there are a few
-              # places where this warning triggers.
-              # See https://codereview.chromium.org/1222643002/ and
-              # http://www.icu-project.org/trac/ticket/11759.
-              '-Wno-unused-const-variable',
-              # ucnv2022.cpp contains three functions that are only used when
-              # certain preprocessor defines are set.
-              '-Wno-unused-function',
-            ],
-          },
-          'cflags': [
-            # Since ICU wants to internally use its own deprecated APIs,
-            # don't complain about it.
-            '-Wno-deprecated-declarations',
-            '-Wno-unused-function',
-          ],
-          'cflags_cc': [
-            '-frtti',
-          ],
-          'cflags_cc!': [
-            '-fno-rtti',
-          ],
-          'xcode_settings': {
-            'GCC_ENABLE_CPP_RTTI': 'YES',       # -frtti
-          },
-          'msvs_settings': {
-            'VCCLCompilerTool': {
-              'RuntimeTypeInfo': 'true',
-              # Certain currency characters will try to use the legacy
-              # windows-1252 encoding unless we explicitly specify utf-8
-              'AdditionalOptions': ['/utf-8'],
-            },
-          },
-          'all_dependent_settings': {
-            'msvs_settings': {
-              'VCLinkerTool': {
-                'AdditionalDependencies': [
-                  'advapi32.lib',
-                ],
-              },
-            },
-          },
-          'conditions': [
-            [ 'use_system_icu==1 and want_separate_host_toolset==1', {
-              'toolsets': ['host'],
-            }],
-            [ 'use_system_icu==0 and want_separate_host_toolset==1', {
-              'toolsets': ['host', 'target'],
-            }],
-            [ 'use_system_icu==0 and want_separate_host_toolset==0', {
-              'toolsets': ['target'],
-            }],
-            [ 'OS == "win" or icu_use_data_file_flag==1', {
-              'sources': [
-                'source/stubdata/stubdata.cpp',
-              ],
-              'defines': [
-                'U_ICUDATAENTRY_IN_COMMON',
-              ],
-            }],
-            ['(OS == "lb_shell" or OS=="starboard") and target_arch == "ps3"', {
-              'cflags_cc': [
-                '-Xc+=rtti',
-              ],
-              'cflags!': [
-                '-Wno-deprecated-declarations',
-                '-Wno-unused-function',
-              ],
-              'cflags_cc!': [
-                '-frtti',
-              ],
-            }],
-            ['OS=="starboard"', {
-              'dependencies': [
-                '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-               ],
-            }],
-            ['(OS=="lb_shell" or OS=="starboard") and (target_os=="android" or target_os=="linux" or clang==1)', {
-              'cflags_cc': [
-                '-frtti',
-              ],
-              'cflags_cc!': [
-                '-fno-rtti',
-              ],
-            }],
-            [ 'OS == "win" and clang==1', {
-              # Note: General clang warnings should go in the
-              # clang_warning_flags block above.
-              'msvs_settings': {
-                'VCCLCompilerTool': {
-                  'AdditionalOptions': [
-                    '-Wno-implicit-exception-spec-mismatch',
-                  ],
-                },
-              },
-            }],
-          ], # conditions
-        },
-      ], # targets
-    }],
-    ['use_system_icu==1', {
-      'targets': [
-        {
-          'target_name': 'system_icu',
-          'type': 'none',
-          'conditions': [
-            ['OS=="qnx"', {
-              'link_settings': {
-                'libraries': [
-                  '-licui18n',
-                  '-licuuc',
-                ],
-              },
-            }],
-            ['OS!="qnx"', {
-              'link_settings': {
-                'ldflags': [
-                  '<!@(icu-config --ldflags)',
-                ],
-                'libraries': [
-                  '<!@(icu-config --ldflags-libsonly)',
-                ],
-              },
-            }],
-          ],
-        },
-        {
-          'target_name': 'icudata',
-          'type': 'none',
-          'dependencies': ['system_icu'],
-          'export_dependent_settings': ['system_icu'],
-          'toolsets': ['target'],
-        },
-        {
-          'target_name': 'icui18n',
-          'type': 'none',
-          'dependencies': ['system_icu'],
-          'export_dependent_settings': ['system_icu'],
-          'variables': {
-            'headers_root_path': 'source/i18n',
-            'header_filenames': [
-              # This list can easily be updated using the command below:
-              # ls source/i18n/unicode/*h | sort | \
-              # sed "s/^.*i18n\/\(.*\)$/              '\1',/"
-	      # I18N_HDR_START
-              'unicode/alphaindex.h',
-              'unicode/basictz.h',
-              'unicode/calendar.h',
-              'unicode/choicfmt.h',
-              'unicode/coleitr.h',
-              'unicode/coll.h',
-              'unicode/compactdecimalformat.h',
-              'unicode/curramt.h',
-              'unicode/currpinf.h',
-              'unicode/currunit.h',
-              'unicode/datefmt.h',
-              'unicode/dcfmtsym.h',
-              'unicode/decimfmt.h',
-              'unicode/dtfmtsym.h',
-              'unicode/dtitvfmt.h',
-              'unicode/dtitvinf.h',
-              'unicode/dtptngen.h',
-              'unicode/dtrule.h',
-              'unicode/fieldpos.h',
-              'unicode/fmtable.h',
-              'unicode/format.h',
-              'unicode/formattedvalue.h',
-              'unicode/fpositer.h',
-              'unicode/gender.h',
-              'unicode/gregocal.h',
-              'unicode/listformatter.h',
-              'unicode/measfmt.h',
-              'unicode/measunit.h',
-              'unicode/measure.h',
-              'unicode/msgfmt.h',
-              'unicode/nounit.h',
-              'unicode/numberformatter.h',
-              'unicode/numberrangeformatter.h',
-              'unicode/numfmt.h',
-              'unicode/numsys.h',
-              'unicode/plurfmt.h',
-              'unicode/plurrule.h',
-              'unicode/rbnf.h',
-              'unicode/rbtz.h',
-              'unicode/regex.h',
-              'unicode/region.h',
-              'unicode/reldatefmt.h',
-              'unicode/scientificnumberformatter.h',
-              'unicode/search.h',
-              'unicode/selfmt.h',
-              'unicode/simpletz.h',
-              'unicode/smpdtfmt.h',
-              'unicode/sortkey.h',
-              'unicode/stsearch.h',
-              'unicode/tblcoll.h',
-              'unicode/timezone.h',
-              'unicode/tmunit.h',
-              'unicode/tmutamt.h',
-              'unicode/tmutfmt.h',
-              'unicode/translit.h',
-              'unicode/tzfmt.h',
-              'unicode/tznames.h',
-              'unicode/tzrule.h',
-              'unicode/tztrans.h',
-              'unicode/ucal.h',
-              'unicode/ucoleitr.h',
-              'unicode/ucol.h',
-              'unicode/ucsdet.h',
-              'unicode/udateintervalformat.h',
-              'unicode/udat.h',
-              'unicode/udatpg.h',
-              'unicode/ufieldpositer.h',
-              'unicode/uformattable.h',
-              'unicode/uformattedvalue.h',
-              'unicode/ugender.h',
-              'unicode/ulistformatter.h',
-              'unicode/ulocdata.h',
-              'unicode/umsg.h',
-              'unicode/unirepl.h',
-              'unicode/unumberformatter.h',
-              'unicode/unumberrangeformatter.h',
-              'unicode/unum.h',
-              'unicode/unumsys.h',
-              'unicode/upluralrules.h',
-              'unicode/uregex.h',
-              'unicode/uregion.h',
-              'unicode/ureldatefmt.h',
-              'unicode/usearch.h',
-              'unicode/uspoof.h',
-              'unicode/utmscale.h',
-              'unicode/utrans.h',
-              'unicode/vtzone.h',
-	      # I18N_HDR_END
-            ],
-          },
-          'includes': [
-            'shim_headers.gypi',
-          ],
-          'toolsets': ['target'],
-        },
-        {
-          'target_name': 'icuuc',
-          'type': 'none',
-          'dependencies': ['system_icu'],
-          'export_dependent_settings': ['system_icu'],
-          'variables': {
-            'headers_root_path': 'source/common',
-            'header_filenames': [
-              # This list can easily be updated using the command below:
-              # ls source/common/unicode/*h | sort | \
-              # sed "s/^.*common\/\(.*\)$/              '\1',/"
-	      # COMMON_HDR_START
-              'unicode/appendable.h',
-              'unicode/brkiter.h',
-              'unicode/bytestream.h',
-              'unicode/bytestriebuilder.h',
-              'unicode/bytestrie.h',
-              'unicode/caniter.h',
-              'unicode/casemap.h',
-              'unicode/char16ptr.h',
-              'unicode/chariter.h',
-              'unicode/dbbi.h',
-              'unicode/docmain.h',
-              'unicode/dtintrv.h',
-              'unicode/edits.h',
-              'unicode/enumset.h',
-              'unicode/errorcode.h',
-              'unicode/filteredbrk.h',
-              'unicode/icudataver.h',
-              'unicode/icuplug.h',
-              'unicode/idna.h',
-              'unicode/localebuilder.h',
-              'unicode/localematcher.h',
-              'unicode/localpointer.h',
-              'unicode/locdspnm.h',
-              'unicode/locid.h',
-              'unicode/messagepattern.h',
-              'unicode/normalizer2.h',
-              'unicode/normlzr.h',
-              'unicode/parseerr.h',
-              'unicode/parsepos.h',
-              'unicode/platform.h',
-              'unicode/ptypes.h',
-              'unicode/putil.h',
-              'unicode/rbbi.h',
-              'unicode/rep.h',
-              'unicode/resbund.h',
-              'unicode/schriter.h',
-              'unicode/simpleformatter.h',
-              'unicode/std_string.h',
-              'unicode/strenum.h',
-              'unicode/stringoptions.h',
-              'unicode/stringpiece.h',
-              'unicode/stringtriebuilder.h',
-              'unicode/symtable.h',
-              'unicode/ubidi.h',
-              'unicode/ubiditransform.h',
-              'unicode/ubrk.h',
-              'unicode/ucasemap.h',
-              'unicode/ucat.h',
-              'unicode/uchar.h',
-              'unicode/ucharstriebuilder.h',
-              'unicode/ucharstrie.h',
-              'unicode/uchriter.h',
-              'unicode/uclean.h',
-              'unicode/ucnv_cb.h',
-              'unicode/ucnv_err.h',
-              'unicode/ucnv.h',
-              'unicode/ucnvsel.h',
-              'unicode/uconfig.h',
-              'unicode/ucpmap.h',
-              'unicode/ucptrie.h',
-              'unicode/ucurr.h',
-              'unicode/udata.h',
-              'unicode/udisplaycontext.h',
-              'unicode/uenum.h',
-              'unicode/uidna.h',
-              'unicode/uiter.h',
-              'unicode/uldnames.h',
-              'unicode/uloc.h',
-              'unicode/umachine.h',
-              'unicode/umisc.h',
-              'unicode/umutablecptrie.h',
-              'unicode/unifilt.h',
-              'unicode/unifunct.h',
-              'unicode/unimatch.h',
-              'unicode/uniset.h',
-              'unicode/unistr.h',
-              'unicode/unorm2.h',
-              'unicode/unorm.h',
-              'unicode/uobject.h',
-              'unicode/urename.h',
-              'unicode/urep.h',
-              'unicode/ures.h',
-              'unicode/uscript.h',
-              'unicode/uset.h',
-              'unicode/usetiter.h',
-              'unicode/ushape.h',
-              'unicode/usprep.h',
-              'unicode/ustring.h',
-              'unicode/ustringtrie.h',
-              'unicode/utext.h',
-              'unicode/utf16.h',
-              'unicode/utf32.h',
-              'unicode/utf8.h',
-              'unicode/utf.h',
-              'unicode/utf_old.h',
-              'unicode/utrace.h',
-              'unicode/utypes.h',
-              'unicode/uvernum.h',
-              'unicode/uversion.h',
-	      # COMMON_HDR_END
-            ],
-          },
-          'includes': [
-            'shim_headers.gypi',
-          ],
-          'toolsets': ['target'],
-        },
-      ], # targets
-    }],
-  ], # conditions
-}
diff --git a/third_party/icu/icu.gypi b/third_party/icu/icu.gypi
deleted file mode 100644
index b8c243f..0000000
--- a/third_party/icu/icu.gypi
+++ /dev/null
@@ -1,456 +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.
-
-{
-  'variables': {
-# find  source/i18n -maxdepth 1  ! -type d  | egrep  '\.(c|cpp)$' | \
-# sort | sed "s/^\(.*\)$/      '\1',/"
-    'icui18n_sources': [
-      # I18N_SRC_START
-      'source/i18n/alphaindex.cpp',
-      'source/i18n/anytrans.cpp',
-      'source/i18n/astro.cpp',
-      'source/i18n/basictz.cpp',
-      'source/i18n/bocsu.cpp',
-      'source/i18n/brktrans.cpp',
-      'source/i18n/buddhcal.cpp',
-      'source/i18n/calendar.cpp',
-      'source/i18n/casetrn.cpp',
-      'source/i18n/cecal.cpp',
-      'source/i18n/chnsecal.cpp',
-      'source/i18n/choicfmt.cpp',
-      'source/i18n/coleitr.cpp',
-      'source/i18n/collationbuilder.cpp',
-      'source/i18n/collationcompare.cpp',
-      'source/i18n/collation.cpp',
-      'source/i18n/collationdatabuilder.cpp',
-      'source/i18n/collationdata.cpp',
-      'source/i18n/collationdatareader.cpp',
-      'source/i18n/collationdatawriter.cpp',
-      'source/i18n/collationfastlatinbuilder.cpp',
-      'source/i18n/collationfastlatin.cpp',
-      'source/i18n/collationfcd.cpp',
-      'source/i18n/collationiterator.cpp',
-      'source/i18n/collationkeys.cpp',
-      'source/i18n/collationroot.cpp',
-      'source/i18n/collationrootelements.cpp',
-      'source/i18n/collationruleparser.cpp',
-      'source/i18n/collationsets.cpp',
-      'source/i18n/collationsettings.cpp',
-      'source/i18n/collationtailoring.cpp',
-      'source/i18n/collationweights.cpp',
-      'source/i18n/coll.cpp',
-      'source/i18n/compactdecimalformat.cpp',
-      'source/i18n/coptccal.cpp',
-      'source/i18n/cpdtrans.cpp',
-      'source/i18n/csdetect.cpp',
-      'source/i18n/csmatch.cpp',
-      'source/i18n/csr2022.cpp',
-      'source/i18n/csrecog.cpp',
-      'source/i18n/csrmbcs.cpp',
-      'source/i18n/csrsbcs.cpp',
-      'source/i18n/csrucode.cpp',
-      'source/i18n/csrutf8.cpp',
-      'source/i18n/curramt.cpp',
-      'source/i18n/currfmt.cpp',
-      'source/i18n/currpinf.cpp',
-      'source/i18n/currunit.cpp',
-      'source/i18n/dangical.cpp',
-      'source/i18n/datefmt.cpp',
-      'source/i18n/dayperiodrules.cpp',
-      'source/i18n/dcfmtsym.cpp',
-      'source/i18n/decContext.cpp',
-      'source/i18n/decimfmt.cpp',
-      'source/i18n/decNumber.cpp',
-      'source/i18n/double-conversion-bignum.cpp',
-      'source/i18n/double-conversion-bignum-dtoa.cpp',
-      'source/i18n/double-conversion-cached-powers.cpp',
-      'source/i18n/double-conversion-double-to-string.cpp',
-      'source/i18n/double-conversion-fast-dtoa.cpp',
-      'source/i18n/double-conversion-string-to-double.cpp',
-      'source/i18n/double-conversion-strtod.cpp',
-      'source/i18n/dtfmtsym.cpp',
-      'source/i18n/dtitvfmt.cpp',
-      'source/i18n/dtitvinf.cpp',
-      'source/i18n/dtptngen.cpp',
-      'source/i18n/dtrule.cpp',
-      'source/i18n/erarules.cpp',
-      'source/i18n/esctrn.cpp',
-      'source/i18n/ethpccal.cpp',
-      'source/i18n/fmtable_cnv.cpp',
-      'source/i18n/fmtable.cpp',
-      'source/i18n/format.cpp',
-      'source/i18n/formatted_string_builder.cpp',
-      'source/i18n/formattedval_iterimpl.cpp',
-      'source/i18n/formattedval_sbimpl.cpp',
-      'source/i18n/formattedvalue.cpp',
-      'source/i18n/fphdlimp.cpp',
-      'source/i18n/fpositer.cpp',
-      'source/i18n/funcrepl.cpp',
-      'source/i18n/gender.cpp',
-      'source/i18n/gregocal.cpp',
-      'source/i18n/gregoimp.cpp',
-      'source/i18n/hebrwcal.cpp',
-      'source/i18n/indiancal.cpp',
-      'source/i18n/inputext.cpp',
-      'source/i18n/islamcal.cpp',
-      'source/i18n/japancal.cpp',
-      'source/i18n/listformatter.cpp',
-      'source/i18n/measfmt.cpp',
-      'source/i18n/measunit.cpp',
-      'source/i18n/measunit_extra.cpp',
-      'source/i18n/measure.cpp',
-      'source/i18n/msgfmt.cpp',
-      'source/i18n/name2uni.cpp',
-      'source/i18n/nfrs.cpp',
-      'source/i18n/nfrule.cpp',
-      'source/i18n/nfsubs.cpp',
-      'source/i18n/nortrans.cpp',
-      'source/i18n/nultrans.cpp',
-      'source/i18n/number_affixutils.cpp',
-      'source/i18n/number_asformat.cpp',
-      'source/i18n/number_capi.cpp',
-      'source/i18n/number_compact.cpp',
-      'source/i18n/number_currencysymbols.cpp',
-      'source/i18n/number_decimalquantity.cpp',
-      'source/i18n/number_decimfmtprops.cpp',
-      'source/i18n/number_fluent.cpp',
-      'source/i18n/number_formatimpl.cpp',
-      'source/i18n/number_grouping.cpp',
-      'source/i18n/number_integerwidth.cpp',
-      'source/i18n/number_longnames.cpp',
-      'source/i18n/number_mapper.cpp',
-      'source/i18n/number_modifiers.cpp',
-      'source/i18n/number_multiplier.cpp',
-      'source/i18n/number_notation.cpp',
-      'source/i18n/number_output.cpp',
-      'source/i18n/number_padding.cpp',
-      'source/i18n/number_patternmodifier.cpp',
-      'source/i18n/number_patternstring.cpp',
-      'source/i18n/number_rounding.cpp',
-      'source/i18n/number_scientific.cpp',
-      'source/i18n/number_skeletons.cpp',
-      'source/i18n/number_symbolswrapper.cpp',
-      'source/i18n/number_usageprefs.cpp',
-      'source/i18n/number_utils.cpp',
-      'source/i18n/numfmt.cpp',
-      'source/i18n/numparse_affixes.cpp',
-      'source/i18n/numparse_compositions.cpp',
-      'source/i18n/numparse_currency.cpp',
-      'source/i18n/numparse_decimal.cpp',
-      'source/i18n/numparse_impl.cpp',
-      'source/i18n/numparse_parsednumber.cpp',
-      'source/i18n/numparse_scientific.cpp',
-      'source/i18n/numparse_symbols.cpp',
-      'source/i18n/numparse_validators.cpp',
-      'source/i18n/numrange_capi.cpp',
-      'source/i18n/numrange_fluent.cpp',
-      'source/i18n/numrange_impl.cpp',
-      'source/i18n/numsys.cpp',
-      'source/i18n/olsontz.cpp',
-      'source/i18n/persncal.cpp',
-      'source/i18n/pluralranges.cpp',
-      'source/i18n/plurfmt.cpp',
-      'source/i18n/plurrule.cpp',
-      'source/i18n/quant.cpp',
-      'source/i18n/quantityformatter.cpp',
-      'source/i18n/rbnf.cpp',
-      'source/i18n/rbt.cpp',
-      'source/i18n/rbt_data.cpp',
-      'source/i18n/rbt_pars.cpp',
-      'source/i18n/rbt_rule.cpp',
-      'source/i18n/rbt_set.cpp',
-      'source/i18n/rbtz.cpp',
-      'source/i18n/regexcmp.cpp',
-      'source/i18n/regeximp.cpp',
-      'source/i18n/regexst.cpp',
-      'source/i18n/regextxt.cpp',
-      'source/i18n/region.cpp',
-      'source/i18n/reldatefmt.cpp',
-      'source/i18n/reldtfmt.cpp',
-      'source/i18n/rematch.cpp',
-      'source/i18n/remtrans.cpp',
-      'source/i18n/repattrn.cpp',
-      'source/i18n/rulebasedcollator.cpp',
-      'source/i18n/scientificnumberformatter.cpp',
-      'source/i18n/scriptset.cpp',
-      'source/i18n/search.cpp',
-      'source/i18n/selfmt.cpp',
-      'source/i18n/sharedbreakiterator.cpp',
-      'source/i18n/simpletz.cpp',
-      'source/i18n/smpdtfmt.cpp',
-      'source/i18n/smpdtfst.cpp',
-      'source/i18n/sortkey.cpp',
-      'source/i18n/standardplural.cpp',
-      'source/i18n/string_segment.cpp',
-      'source/i18n/strmatch.cpp',
-      'source/i18n/strrepl.cpp',
-      'source/i18n/stsearch.cpp',
-      'source/i18n/taiwncal.cpp',
-      'source/i18n/timezone.cpp',
-      'source/i18n/titletrn.cpp',
-      'source/i18n/tmunit.cpp',
-      'source/i18n/tmutamt.cpp',
-      'source/i18n/tmutfmt.cpp',
-      'source/i18n/tolowtrn.cpp',
-      'source/i18n/toupptrn.cpp',
-      'source/i18n/translit.cpp',
-      'source/i18n/transreg.cpp',
-      'source/i18n/tridpars.cpp',
-      'source/i18n/tzfmt.cpp',
-      'source/i18n/tzgnames.cpp',
-      'source/i18n/tznames.cpp',
-      'source/i18n/tznames_impl.cpp',
-      'source/i18n/tzrule.cpp',
-      'source/i18n/tztrans.cpp',
-      'source/i18n/ucal.cpp',
-      'source/i18n/ucln_in.cpp',
-      'source/i18n/ucol.cpp',
-      'source/i18n/ucoleitr.cpp',
-      'source/i18n/ucol_res.cpp',
-      'source/i18n/ucol_sit.cpp',
-      'source/i18n/ucsdet.cpp',
-      'source/i18n/udat.cpp',
-      'source/i18n/udateintervalformat.cpp',
-      'source/i18n/udatpg.cpp',
-      'source/i18n/ufieldpositer.cpp',
-      'source/i18n/uitercollationiterator.cpp',
-      'source/i18n/ulistformatter.cpp',
-      'source/i18n/ulocdata.cpp',
-      'source/i18n/umsg.cpp',
-      'source/i18n/unesctrn.cpp',
-      'source/i18n/uni2name.cpp',
-      'source/i18n/units_complexconverter.cpp',
-      'source/i18n/units_converter.cpp',
-      'source/i18n/units_data.cpp',
-      'source/i18n/units_router.cpp',
-      'source/i18n/unum.cpp',
-      'source/i18n/unumsys.cpp',
-      'source/i18n/upluralrules.cpp',
-      'source/i18n/uregexc.cpp',
-      'source/i18n/uregex.cpp',
-      'source/i18n/uregion.cpp',
-      'source/i18n/usearch.cpp',
-      'source/i18n/uspoof_build.cpp',
-      'source/i18n/uspoof_conf.cpp',
-      'source/i18n/uspoof.cpp',
-      'source/i18n/uspoof_impl.cpp',
-      'source/i18n/utf16collationiterator.cpp',
-      'source/i18n/utf8collationiterator.cpp',
-      'source/i18n/utmscale.cpp',
-      'source/i18n/utrans.cpp',
-      'source/i18n/vtzone.cpp',
-      'source/i18n/vzone.cpp',
-      'source/i18n/windtfmt.cpp',
-      'source/i18n/winnmfmt.cpp',
-      'source/i18n/wintzimpl.cpp',
-      'source/i18n/zonemeta.cpp',
-      'source/i18n/zrule.cpp',
-      'source/i18n/ztrans.cpp',
-      # I18N_SRC_END
-    ],
-    'icuuc_sources': [
-# find  source/common -maxdepth 1  ! -type d  | egrep  '\.(c|cpp)$' | \
-# sort | sed "s/^\(.*\)$/      '\1',/"
-      # COMMON_SRC_START
-      'source/common/appendable.cpp',
-      'source/common/bmpset.cpp',
-      'source/common/brkeng.cpp',
-      'source/common/brkiter.cpp',
-      'source/common/bytesinkutil.cpp',
-      'source/common/bytestream.cpp',
-      'source/common/bytestriebuilder.cpp',
-      'source/common/bytestrie.cpp',
-      'source/common/bytestrieiterator.cpp',
-      'source/common/caniter.cpp',
-      'source/common/characterproperties.cpp',
-      'source/common/chariter.cpp',
-      'source/common/charstr.cpp',
-      'source/common/cmemory.cpp',
-      'source/common/cstr.cpp',
-      'source/common/cstring.cpp',
-      'source/common/cwchar.cpp',
-      'source/common/dictbe.cpp',
-      'source/common/dictionarydata.cpp',
-      'source/common/dtintrv.cpp',
-      'source/common/edits.cpp',
-      'source/common/errorcode.cpp',
-      'source/common/filteredbrk.cpp',
-      'source/common/filterednormalizer2.cpp',
-      'source/common/icudataver.cpp',
-      'source/common/icuplug.cpp',
-      'source/common/loadednormalizer2impl.cpp',
-      'source/common/localebuilder.cpp',
-      'source/common/localematcher.cpp',
-      'source/common/localeprioritylist.cpp',
-      'source/common/locavailable.cpp',
-      'source/common/locbased.cpp',
-      'source/common/locdispnames.cpp',
-      'source/common/locdistance.cpp',
-      'source/common/locdspnm.cpp',
-      'source/common/locid.cpp',
-      'source/common/loclikely.cpp',
-      'source/common/loclikelysubtags.cpp',
-      'source/common/locmap.cpp',
-      'source/common/locresdata.cpp',
-      'source/common/locutil.cpp',
-      'source/common/lsr.cpp',
-      'source/common/messagepattern.cpp',
-      'source/common/normalizer2.cpp',
-      'source/common/normalizer2impl.cpp',
-      'source/common/normlzr.cpp',
-      'source/common/parsepos.cpp',
-      'source/common/patternprops.cpp',
-      'source/common/pluralmap.cpp',
-      'source/common/propname.cpp',
-      'source/common/propsvec.cpp',
-      'source/common/punycode.cpp',
-      'source/common/putil.cpp',
-      'source/common/rbbi_cache.cpp',
-      'source/common/rbbi.cpp',
-      'source/common/rbbidata.cpp',
-      'source/common/rbbinode.cpp',
-      'source/common/rbbirb.cpp',
-      'source/common/rbbiscan.cpp',
-      'source/common/rbbisetb.cpp',
-      'source/common/rbbistbl.cpp',
-      'source/common/rbbitblb.cpp',
-      'source/common/resbund_cnv.cpp',
-      'source/common/resbund.cpp',
-      'source/common/resource.cpp',
-      'source/common/restrace.cpp',
-      'source/common/ruleiter.cpp',
-      'source/common/schriter.cpp',
-      'source/common/serv.cpp',
-      'source/common/servlk.cpp',
-      'source/common/servlkf.cpp',
-      'source/common/servls.cpp',
-      'source/common/servnotf.cpp',
-      'source/common/servrbf.cpp',
-      'source/common/servslkf.cpp',
-      'source/common/sharedobject.cpp',
-      'source/common/simpleformatter.cpp',
-      'source/common/static_unicode_sets.cpp',
-      'source/common/stringpiece.cpp',
-      'source/common/stringtriebuilder.cpp',
-      'source/common/uarrsort.cpp',
-      'source/common/ubidi.cpp',
-      'source/common/ubidiln.cpp',
-      'source/common/ubidi_props.cpp',
-      'source/common/ubiditransform.cpp',
-      'source/common/ubidiwrt.cpp',
-      'source/common/ubrk.cpp',
-      'source/common/ucase.cpp',
-      'source/common/ucasemap.cpp',
-      'source/common/ucasemap_titlecase_brkiter.cpp',
-      'source/common/ucat.cpp',
-      'source/common/uchar.cpp',
-      'source/common/ucharstriebuilder.cpp',
-      'source/common/ucharstrie.cpp',
-      'source/common/ucharstrieiterator.cpp',
-      'source/common/uchriter.cpp',
-      'source/common/ucln_cmn.cpp',
-      'source/common/ucmndata.cpp',
-      'source/common/ucnv2022.cpp',
-      'source/common/ucnv_bld.cpp',
-      'source/common/ucnvbocu.cpp',
-      'source/common/ucnv_cb.cpp',
-      'source/common/ucnv_cnv.cpp',
-      'source/common/ucnv.cpp',
-      'source/common/ucnv_ct.cpp',
-      'source/common/ucnvdisp.cpp',
-      'source/common/ucnv_err.cpp',
-      'source/common/ucnv_ext.cpp',
-      'source/common/ucnvhz.cpp',
-      'source/common/ucnv_io.cpp',
-      'source/common/ucnvisci.cpp',
-      'source/common/ucnvlat1.cpp',
-      'source/common/ucnv_lmb.cpp',
-      'source/common/ucnvmbcs.cpp',
-      'source/common/ucnvscsu.cpp',
-      'source/common/ucnvsel.cpp',
-      'source/common/ucnv_set.cpp',
-      'source/common/ucnv_u16.cpp',
-      'source/common/ucnv_u32.cpp',
-      'source/common/ucnv_u7.cpp',
-      'source/common/ucnv_u8.cpp',
-      'source/common/ucol_swp.cpp',
-      'source/common/ucptrie.cpp',
-      'source/common/ucurr.cpp',
-      'source/common/udata.cpp',
-      'source/common/udatamem.cpp',
-      'source/common/udataswp.cpp',
-      'source/common/uenum.cpp',
-      'source/common/uhash.cpp',
-      'source/common/uhash_us.cpp',
-      'source/common/uidna.cpp',
-      'source/common/uinit.cpp',
-      'source/common/uinvchar.cpp',
-      'source/common/uiter.cpp',
-      'source/common/ulist.cpp',
-      'source/common/uloc.cpp',
-      'source/common/uloc_keytype.cpp',
-      'source/common/uloc_tag.cpp',
-      'source/common/umapfile.cpp',
-      'source/common/umath.cpp',
-      'source/common/umutablecptrie.cpp',
-      'source/common/umutex.cpp',
-      'source/common/unames.cpp',
-      'source/common/unifiedcache.cpp',
-      'source/common/unifilt.cpp',
-      'source/common/unifunct.cpp',
-      'source/common/uniset_closure.cpp',
-      'source/common/uniset.cpp',
-      'source/common/uniset_props.cpp',
-      'source/common/unisetspan.cpp',
-      'source/common/unistr_case.cpp',
-      'source/common/unistr_case_locale.cpp',
-      'source/common/unistr_cnv.cpp',
-      'source/common/unistr.cpp',
-      'source/common/unistr_props.cpp',
-      'source/common/unistr_titlecase_brkiter.cpp',
-      'source/common/unormcmp.cpp',
-      'source/common/unorm.cpp',
-      'source/common/uobject.cpp',
-      'source/common/uprops.cpp',
-      'source/common/uresbund.cpp',
-      'source/common/ures_cnv.cpp',
-      'source/common/uresdata.cpp',
-      'source/common/usc_impl.cpp',
-      'source/common/uscript.cpp',
-      'source/common/uscript_props.cpp',
-      'source/common/uset.cpp',
-      'source/common/usetiter.cpp',
-      'source/common/uset_props.cpp',
-      'source/common/ushape.cpp',
-      'source/common/usprep.cpp',
-      'source/common/ustack.cpp',
-      'source/common/ustrcase.cpp',
-      'source/common/ustrcase_locale.cpp',
-      'source/common/ustr_cnv.cpp',
-      'source/common/ustrenum.cpp',
-      'source/common/ustrfmt.cpp',
-      'source/common/ustring.cpp',
-      'source/common/ustr_titlecase_brkiter.cpp',
-      'source/common/ustrtrns.cpp',
-      'source/common/ustr_wcs.cpp',
-      'source/common/utext.cpp',
-      'source/common/utf_impl.cpp',
-      'source/common/util.cpp',
-      'source/common/util_props.cpp',
-      'source/common/utrace.cpp',
-      'source/common/utrie2_builder.cpp',
-      'source/common/utrie2.cpp',
-      'source/common/utrie.cpp',
-      'source/common/utrie_swap.cpp',
-      'source/common/uts46.cpp',
-      'source/common/utypes.cpp',
-      'source/common/uvector.cpp',
-      'source/common/uvectr32.cpp',
-      'source/common/uvectr64.cpp',
-      'source/common/wintz.cpp',
-      # COMMON_SRC_END
-    ]
-  }
-}
diff --git a/third_party/icu/icu_nacl.gyp b/third_party/icu/icu_nacl.gyp
deleted file mode 100644
index d20fa53..0000000
--- a/third_party/icu/icu_nacl.gyp
+++ /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.
-
-{
-  'includes': [
-    'icu.gypi',
-    '../../native_client/build/untrusted.gypi',
-  ],
-  'target_defaults': {
-    'direct_dependent_settings': {
-      'defines': [
-        # Tell ICU to not insert |using namespace icu;| into its headers,
-        # so that chrome's source explicitly has to use |icu::|.
-        'U_USING_ICU_NAMESPACE=0',
-        # We don't use ICU plugins and dyload is only necessary for them.
-        # NaCl-related builds also fail looking for dlfcn.h when it's enabled.
-        'U_ENABLE_DYLOAD=0',
-      ],
-    },
-    'defines': [
-      'U_USING_ICU_NAMESPACE=0',
-      'U_STATIC_IMPLEMENTATION',
-    ],
-    'include_dirs': [
-      'source/common',
-      'source/i18n',
-    ],
-    'pnacl_compile_flags': [
-      '-Wno-char-subscripts',
-      '-Wno-deprecated-declarations',
-      '-Wno-header-hygiene',
-      '-Wno-logical-op-parentheses',
-      '-Wno-return-type-c-linkage',
-      '-Wno-switch',
-      '-Wno-tautological-compare',
-      '-Wno-unused-variable'
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'icudata_nacl',
-      'type': 'none',
-      'variables': {
-        'nlib_target': 'libicudata_nacl.a',
-        'build_glibc': 0,
-        'build_newlib': 0,
-        'build_pnacl_newlib': 1,
-      },
-      'sources': [
-        'source/stubdata/stubdata.c',
-        # Temporary work around for an incremental build NOT rebuilding 
-        # icudata_nacl after an ICU version change.
-        # TODO(jungshik): Remove it once a fix for bug 384752 is in.
-        'source/common/unicode/uvernum.h',
-      ],
-    },
-    {
-      'target_name': 'icui18n_nacl',
-      'type': 'none',
-      'variables': {
-        'nlib_target': 'libicui18n_nacl.a',
-        'build_glibc': 0,
-        'build_newlib': 0,
-        'build_pnacl_newlib': 1,
-      },
-      'sources': [
-        '<@(icui18n_sources)',
-      ],
-      'defines': [
-        'U_I18N_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        'icuuc_nacl',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          'source/i18n',
-        ],
-      },
-    },
-    {
-      'target_name': 'icuuc_nacl',
-      'type': 'none',
-      'variables': {
-        'nlib_target': 'libicuuc_nacl.a',
-        'build_glibc': 0,
-        'build_newlib': 0,
-        'build_pnacl_newlib': 1,
-      },
-      'sources': [
-        '<@(icuuc_sources)',
-      ],
-      'defines': [
-        'U_COMMON_IMPLEMENTATION',
-      ],
-      'dependencies': [
-        'icudata_nacl',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          'source/common',
-        ],
-        'defines': [
-          'U_STATIC_IMPLEMENTATION',
-        ],
-      },
-    },
-  ],
-}
diff --git a/third_party/icu/shim_headers.gypi b/third_party/icu/shim_headers.gypi
deleted file mode 100644
index 56d8d3a..0000000
--- a/third_party/icu/shim_headers.gypi
+++ /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.
-
-# This file is meant to be included into a target to handle shim headers
-# in a consistent manner. To use this the following variables need to be
-# defined:
-#   headers_root_path: string: path to directory containing headers
-#   header_filenames: list: list of header file names
-
-{
-  'variables': {
-    'shim_headers_path': '<(SHARED_INTERMEDIATE_DIR)/shim_headers/<(_target_name)/<(_toolset)',
-    'shim_generator_additional_args%': [],
-  },
-  'include_dirs++': [
-    '<(shim_headers_path)',
-  ],
-  'all_dependent_settings': {
-    # Repeating this with different numbers of plusses is unfortunately required
-    # to make sure that even if this include is inside nested conditions/etc, it
-    # still gets inserted at the beginning of the include_dirs list. See
-    # http://crbug.com/263818 for details.
-    'include_dirs+++': [
-      '<(shim_headers_path)',
-    ],
-    'include_dirs++++': [
-      '<(shim_headers_path)',
-    ],
-    'include_dirs+++++': [
-      '<(shim_headers_path)',
-    ],
-  },
-  'actions': [
-    {
-      'variables': {
-        'generator_path': '<(DEPTH)/tools/generate_shim_headers/generate_shim_headers.py',
-        'generator_args': [
-          '--headers-root', '<(headers_root_path)',
-          '--output-directory', '<(shim_headers_path)',
-          '<@(shim_generator_additional_args)',
-          '<@(header_filenames)',
-        ],
-      },
-      'action_name': 'generate_<(_target_name)_shim_headers',
-      'inputs': [
-        '<(generator_path)',
-      ],
-      'outputs': [
-        '<!@pymod_do_main(generate_shim_headers <@(generator_args) --outputs)',
-      ],
-      'action': ['python',
-                 '<(generator_path)',
-                 '<@(generator_args)',
-                 '--generate',
-      ],
-      'message': 'Generating <(_target_name) shim headers',
-    },
-  ],
-}
diff --git a/third_party/libdav1d/libdav1d.gyp b/third_party/libdav1d/libdav1d.gyp
deleted file mode 100644
index db10ba0..0000000
--- a/third_party/libdav1d/libdav1d.gyp
+++ /dev/null
@@ -1,337 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'conditions': [
-    ['sb_api_version >= 12', {
-      'variables': {
-        'DAV1D_ARCH_AARCH64':   'SB_IS(ARCH_ARM64)',
-        'DAV1D_ARCH_ARM':       'SB_IS(ARCH_ARM)',
-        'DAV1D_ARCH_PPC64LE':   'SB_IS(ARCH_PPC)',
-        'DAV1D_ARCH_X86':       '(SB_IS(ARCH_X86) || SB_IS(ARCH_X64))',
-        'DAV1D_ARCH_X86_32':    'SB_IS(ARCH_X86)',
-        'DAV1D_ARCH_X86_64':    'SB_IS(ARCH_X64)',
-        'DAV1D_ENDIANNESS_BIG': 'SB_IS(BIG_ENDIAN)',
-      },
-    }, {
-      'variables': {
-        'DAV1D_ARCH_AARCH64':   '(SB_IS_ARCH_ARM & SB_IS_64_BIT)',
-        'DAV1D_ARCH_ARM':       '(SB_IS_ARCH_ARM & SB_IS_32_BIT)',
-        'DAV1D_ARCH_PPC64LE':   'SB_IS_ARCH_PPC',
-        'DAV1D_ARCH_X86':       'SB_IS_ARCH_X86',
-        'DAV1D_ARCH_X86_32':    '(SB_IS_ARCH_X86 & SB_IS_32_BIT)',
-        'DAV1D_ARCH_X86_64':    '(SB_IS_ARCH_X86 & SB_IS_64_BIT)',
-        'DAV1D_ENDIANNESS_BIG': 'SB_IS_BIG_ENDIAN',
-      },
-    }],
-  ],
-
-  'variables': {
-    'enable_asm': 0,
-
-    'libdav1d_dir': '<(DEPTH)/third_party/libdav1d',
-
-    'libdav1d_include_dirs': [
-      '<(libdav1d_dir)/',
-      '<(libdav1d_dir)/include',
-      '<(libdav1d_dir)/include/dav1d',
-    ],
-
-    # BITDEPTH-specific sources
-    #  Note: these files must be compiled with -DBITDEPTH=8 or 16
-    'libdav1d_bitdepth_sources': [
-      'src/cdef.h',
-      'src/cdef_apply.h',
-      'src/cdef_apply_tmpl.c',
-      'src/cdef_tmpl.c',
-      'src/fg_apply.h',
-      'src/fg_apply_tmpl.c',
-      'src/film_grain.h',
-      'src/film_grain_tmpl.c',
-      'src/ipred.h',
-      'src/ipred_prepare.h',
-      'src/ipred_prepare_tmpl.c',
-      'src/ipred_tmpl.c',
-      'src/itx.h',
-      'src/itx_tmpl.c',
-      'src/lf_apply.h',
-      'src/lf_apply_tmpl.c',
-      'src/loopfilter.h',
-      'src/loopfilter_tmpl.c',
-      'src/looprestoration.h',
-      'src/looprestoration_tmpl.c',
-      'src/lr_apply.h',
-      'src/lr_apply_tmpl.c',
-      'src/mc.h',
-      'src/mc_tmpl.c',
-      'src/recon.h',
-      'src/recon_tmpl.c',
-    ],
-
-    # ARCH-specific sources
-    'libdav1d_arch_sources': [],
-    'libdav1d_arch_bitdepth_sources': [],
-
-    # ASM-specific sources
-    'libdav1d_base_asm_sources': [],
-    'libdav1d_bitdepth8_asm_sources': [],
-    'libdav1d_bitdepth16_asm_sources': [],
-
-    'conditions': [
-      ['enable_asm == 1 and (target_arch == "x86" or target_arch == "x64")', {
-        'libdav1d_arch_sources': [
-          'src/x86/cpu.c',
-          'src/x86/cpu.h',
-          'src/x86/msac.h',
-        ],
-        'libdav1d_arch_bitdepth_sources': [
-          'src/x86/cdef_init_tmpl.c',
-          'src/x86/film_grain_init_tmpl.c',
-          'src/x86/ipred_init_tmpl.c',
-          'src/x86/itx_init_tmpl.c',
-          'src/x86/loopfilter_init_tmpl.c',
-          'src/x86/looprestoration_init_tmpl.c',
-          'src/x86/mc_init_tmpl.c',
-        ],
-        'libdav1d_base_asm_sources': [
-          'src/x86/cpuid.asm',
-          'src/x86/msac.asm',
-        ],
-        'libdav1d_bitdepth8_asm_sources': [
-          'src/x86/cdef.asm',
-          'src/x86/cdef_sse.asm',
-          'src/x86/film_grain.asm',
-          'src/x86/ipred.asm',
-          'src/x86/ipred_ssse3.asm',
-          'src/x86/itx.asm',
-          'src/x86/itx_ssse3.asm',
-          'src/x86/loopfilter.asm',
-          'src/x86/loopfilter_ssse3.asm',
-          'src/x86/looprestoration.asm',
-          'src/x86/looprestoration_ssse3.asm',
-          'src/x86/mc.asm',
-          'src/x86/mc_ssse3.asm',
-        ],
-      }],
-    ],
-  },
-
-  'target_defaults': {
-    'include_dirs': [
-      '<(DEPTH)/third_party/libdav1d/',
-      '<(DEPTH)/third_party/libdav1d/include',
-      '<(DEPTH)/third_party/libdav1d/include/dav1d',
-      '<(DEPTH)/third_party/libdav1d/src',
-    ],
-    'defines': [
-      'ARCH_AARCH64=<(DAV1D_ARCH_AARCH64)',
-      'ARCH_ARM=<(DAV1D_ARCH_ARM)',
-      'ARCH_PPC64LE=<(DAV1D_ARCH_PPC64LE)',
-      'ARCH_X86=<(DAV1D_ARCH_X86)',
-      'ARCH_X86_32=<(DAV1D_ARCH_X86_32)',
-      'ARCH_X86_64=<(DAV1D_ARCH_X86_64)',
-      'CONFIG_16BPC=1',
-      'CONFIG_8BPC=1',
-      'CONFIG_LOG=1',
-      'ENDIANNESS_BIG=<(DAV1D_ENDIANNESS_BIG)',
-      'HAVE_ASM=<(enable_asm)',
-    ],
-
-    'conditions': [
-      ['target_os == "linux"', {
-        'defines':[
-          'HAVE_CLOCK_GETTIME=1',
-          'HAVE_POSIX_MEMALIGN=1',
-          'HAVE_UNISTD_H=1',
-          'STACK_ALIGNMENT=32',
-        ]
-      }],
-
-      ['target_os == "win"', {
-        'include_dirs': [
-          # for stdatomic.h
-          '<(DEPTH)/third_party/libdav1d/include/compat/msvc',
-        ],
-        'defines':[
-          'HAVE_ALIGNED_MALLOC=1',
-          'HAVE_IO_H=1',
-          'UNICODE=1',
-          '_CRT_DECLARE_NONSTDC_NAMES=1',
-          '_UNICODE=1',
-          '_WIN32_WINNT=0x0601',
-          '__USE_MINGW_ANSI_STDIO=1',
-          'fseeko=_fseeki64',
-          'ftello=_ftelli64',
-        ],
-        'cflags_cc': [
-          '-wd4028',
-          '-wd4996',
-        ],
-        'conditions': [
-          ['target_arch == "x64"', {
-            'defines': [
-              'STACK_ALIGNMENT=16',
-            ],
-          }, {
-            'defines': [
-              'STACK_ALIGNMENT=4',
-            ],
-          }],
-        ],
-      }],
-    ],
-  },
-
-  'targets': [
-    {
-      'target_name': 'libdav1d_entrypoint',
-      'type': 'static_library',
-      'sources': [
-        'src/lib.c',
-        'src/thread_task.c',
-        'src/thread_task.h',
-      ],
-    },
-    {
-      'target_name': 'libdav1d_bitdepth16',
-      'type': 'static_library',
-      'defines': [
-        'BITDEPTH=16',
-      ],
-      'sources': [
-        '<@(libdav1d_arch_bitdepth_sources)',
-        '<@(libdav1d_bitdepth_sources)',
-      ],
-    },
-    {
-      'target_name': 'libdav1d_bitdepth16_asm',
-      'type': 'static_library',
-      'defines': [
-        'BITDEPTH=16',
-      ],
-      'includes': [
-        'libdav1d_asm.gypi'
-      ],
-      'sources': [
-        '<@(libdav1d_bitdepth16_asm_sources)',
-      ],
-    },
-    {
-      'target_name': 'libdav1d_bitdepth8',
-      'type': 'static_library',
-      'defines': [
-        'BITDEPTH=8',
-      ],
-      'sources': [
-        '<@(libdav1d_arch_bitdepth_sources)',
-        '<@(libdav1d_bitdepth_sources)',
-      ],
-    },
-    {
-      'target_name': 'libdav1d_bitdepth8_asm',
-      'type': 'static_library',
-      'defines': [
-        'BITDEPTH=8',
-      ],
-      'includes': [
-        'libdav1d_asm.gypi'
-      ],
-      'sources': [
-        '<@(libdav1d_bitdepth8_asm_sources)',
-      ],
-    },
-    {
-      'target_name': 'libdav1d_base',
-      'type': 'static_library',
-      'sources': [
-        'src/cpu.c',
-        'src/cpu.h',
-        'src/msac.c',
-        'src/msac.h',
-      ],
-    },
-    {
-      'target_name': 'libdav1d_base_asm',
-      'type': 'static_library',
-      'includes': [
-        'libdav1d_asm.gypi'
-      ],
-      'sources': [
-        '<@(libdav1d_arch_sources)',
-        '<@(libdav1d_base_asm_sources)'
-      ],
-    },
-    {
-      'target_name': 'libdav1d',
-      'type': 'static_library',
-      'sources': [
-        'src/cdf.c',
-        'src/cdf.h',
-        'src/ctx.h',
-        'src/data.c',
-        'src/data.h',
-        'src/decode.c',
-        'src/decode.h',
-        'src/dequant_tables.c',
-        'src/dequant_tables.h',
-        'src/env.h',
-        'src/getbits.c',
-        'src/getbits.h',
-        'src/internal.h',
-        'src/intra_edge.c',
-        'src/intra_edge.h',
-        'src/levels.h',
-        'src/lf_mask.c',
-        'src/lf_mask.h',
-        'src/log.c',
-        'src/log.h',
-        'src/obu.c',
-        'src/obu.h',
-        'src/picture.c',
-        'src/picture.h',
-        'src/qm.c',
-        'src/qm.h',
-        'src/ref.c',
-        'src/ref.h',
-        'src/ref_mvs.c',
-        'src/ref_mvs.h',
-        'src/scan.c',
-        'src/scan.h',
-        'src/tables.c',
-        'src/tables.h',
-        'src/thread.h',
-        'src/thread_data.h',
-        'src/warpmv.c',
-        'src/warpmv.h',
-        'src/wedge.c',
-        'src/wedge.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/common/common.gyp:common',
-        'libdav1d_base',
-        'libdav1d_base_asm',
-        'libdav1d_bitdepth16',
-        'libdav1d_bitdepth16_asm',
-        'libdav1d_bitdepth8',
-        'libdav1d_bitdepth8_asm',
-        'libdav1d_entrypoint',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<@(libdav1d_include_dirs)',
-        ],
-      },
-    },
-  ],
-}
diff --git a/third_party/libdav1d/libdav1d_asm.gypi b/third_party/libdav1d/libdav1d_asm.gypi
deleted file mode 100644
index a52b895..0000000
--- a/third_party/libdav1d/libdav1d_asm.gypi
+++ /dev/null
@@ -1,103 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'conditions': [
-    ['target_arch == "x64" or target_arch == "x86"', {
-      'variables': {
-        'DAV1D_IS_PIC': '1',
-      },
-      'conditions': [
-        ['target_arch == "x64"', {
-          'variables': {
-            'DAV1D_ARCH_X86_32': '0',
-            'DAV1D_ARCH_X86_64': '1',
-          }
-        }, {
-          'variables': {
-            'DAV1D_ARCH_X86_32': '1',
-            'DAV1D_ARCH_X86_64': '0',
-          }
-        }]
-      ],
-    }],
-    ['target_os == "linux"', {
-      'variables': {
-        'DAV1D_STACK_ALIGNMENT': '32',
-      },
-    }],
-    ['target_os == "win"', {
-      'conditions': [
-        ['target_arch == "x64"', {
-          'variables': {
-            'DAV1D_STACK_ALIGNMENT': '16',
-          }
-        }, {
-          'variables': {
-            'DAV1D_STACK_ALIGNMENT': '4',
-          }
-        }]
-      ],
-    }],
-  ],
-  'rules': [{
-    'rule_name': 'assemble',
-    'extension': 'asm',
-    'inputs': [],
-    'outputs': [
-      '<(PRODUCT_DIR)/obj/third_party/libdav1d/<(RULE_INPUT_ROOT).asm.o',
-    ],
-
-    'conditions': [
-      ['target_os == "win"', {
-        'variables': {
-          'NASM_EXECUTABLE': 'nasm.exe',
-          'NASM_OUTPUT_FORMAT' : 'win',
-        },
-      }],
-      ['target_os == "linux"', {
-        'variables': {
-          'NASM_EXECUTABLE': '/usr/bin/nasm',
-          'NASM_OUTPUT_FORMAT': 'elf',
-        },
-      }],
-      ['target_arch == "x86"', {
-        'variables': {
-          'NASM_OUTPUT_SIZE': '32'
-        },
-      }, {
-        'variables': {
-          'NASM_OUTPUT_SIZE': '64'
-        },
-      }],
-    ],
-
-    'action': [
-      '<(NASM_EXECUTABLE)',
-      '-f<(NASM_OUTPUT_FORMAT)<(NASM_OUTPUT_SIZE)',
-      '-DSTACK_ALIGNMENT=<(DAV1D_STACK_ALIGNMENT)',
-      '-DARCH_X86_32=<(DAV1D_ARCH_X86_32)',
-      '-DARCH_X86_64=<(DAV1D_ARCH_X86_64)',
-      '-DPIC=<(DAV1D_IS_PIC)',
-      '-I<(DEPTH)/third_party/libdav1d/include',
-      '-I<(DEPTH)/third_party/libdav1d/src',
-      '-MQ<(PRODUCT_DIR)/$out',
-      '-MF<(PRODUCT_DIR)/$out.ndep',
-      '-o<(PRODUCT_DIR)/$out',
-      '<(RULE_INPUT_PATH)',
-    ],
-    'process_outputs_as_sources': 1,
-    'message': 'Building <(RULE_INPUT_ROOT).asm.o',
-  }],
-}
diff --git a/third_party/libdav1d/src/thread.h b/third_party/libdav1d/src/thread.h
index b2c5b6c..d457812 100644
--- a/third_party/libdav1d/src/thread.h
+++ b/third_party/libdav1d/src/thread.h
@@ -37,7 +37,6 @@
 #include "starboard/mutex.h"
 #include "starboard/once.h"
 #include "starboard/thread.h"
-#include "starboard/thread_types.h"
 
 typedef SbThread dav1d_pthread_t;
 typedef SbMutex dav1d_pthread_mutex_t;
diff --git a/third_party/libevent/libevent.gyp b/third_party/libevent/libevent.gyp
deleted file mode 100644
index ab2db97..0000000
--- a/third_party/libevent/libevent.gyp
+++ /dev/null
@@ -1,144 +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.
-
-{
-  'variables': {
-    'use_system_libevent%': 0,
-  },
-  'conditions': [
-    ['use_system_libevent==0', {
-      'targets': [
-        {
-          'target_name': 'libevent',
-          'product_name': 'event',
-          'type': 'static_library',
-          'toolsets': ['host', 'target'],
-          'sources': [
-            'buffer.c',
-            'epoll.c',
-            'evbuffer.c',
-            'evdns.c',
-            'event.c',
-            'event_tagging.c',
-            'evrpc.c',
-            'evutil.c',
-            'http.c',
-            'kqueue.c',
-            'log.c',
-            'poll.c',
-            'select.c',
-            'signal.c',
-            'strlcpy.c',
-          ],
-          'defines': [
-            'HAVE_CONFIG_H',
-          ],
-          'conditions': [
-            # Starboard could be any other underlying platform, so we use
-            # target_arch to tell the difference. Libevent is itself a platform
-            # abstraction library, so Starboard depends on it to implement its
-            # SbSocketWaiter API. This means the Libevent is below the Starboard
-            # platform abstraction line.
-            [ 'OS == "starboard"', {
-              'sources!': [
-                'buffer.c',
-                'evbuffer.c',
-                'evdns.c',
-                'event_tagging.c',
-                'evrpc.c',
-                'http.c',
-                'select.c',
-                'signal.c',
-                'strlcpy.c',
-              ],
-              'include_dirs': [ 'starboard' ],
-              'conditions': [
-                [ 'sb_libevent_method == "epoll"', {
-                  'sources!': [
-                    'kqueue.c',
-                    'poll.c',
-                  ],
-                }],
-                [ 'sb_libevent_method == "poll"', {
-                  'sources!': [
-                    'epoll.c',
-                    'kqueue.c',
-                  ],
-                }],
-                [ 'sb_libevent_method == "kqueue"', {
-                  'sources!': [
-                    'epoll.c',
-                    'poll.c',
-                  ],
-                }],
-                [ 'target_os == "linux"', {
-                  'sources': [ 'epoll_sub.c' ],
-                  'include_dirs': [ 'starboard/linux' ],
-                  'link_settings': {
-                    'libraries': [
-                      '-lrt',
-                    ],
-                  },
-                }],
-                # TODO: Make this android specific, not a linux copy.
-                [ 'target_os == "android"', {
-                  'sources': [ 'epoll_sub.c' ],
-                  'include_dirs': [ 'starboard/linux' ],
-                  }
-                ],
-              ],
-            }],
-            # libevent has platform-specific implementation files.  Since its
-            # native build uses autoconf, platform-specific config.h files are
-            # provided and live in platform-specific directories.
-            [ 'OS == "linux" or (OS == "android" and _toolset == "host")', {
-              'sources': [ 'epoll.c', 'epoll_sub.c' ],
-              'include_dirs': [ 'linux' ],
-              'link_settings': {
-                'libraries': [
-                  # We need rt for clock_gettime().
-                  # TODO(port) Maybe on FreeBSD as well?
-                  '-lrt',
-                ],
-              },
-            }],
-            [ '(OS == "android" or (OS == "lb_shell" and target_arch == "android")) and _toolset == "target"', {
-              # On android, epoll_create(), epoll_ctl(), epoll_wait() and
-              # clock_gettime() are all in libc.so, so no need to add
-              # epoll_sub.c and link librt.
-              'sources': [ 'epoll.c' ],
-              'include_dirs': [ 'android' ],
-            }],
-            [ 'OS == "mac" or OS == "ios" or os_bsd==1', {
-              'sources': [ 'kqueue.c' ],
-              'include_dirs': [ 'mac' ]
-            }],
-            [ 'OS == "solaris"', {
-              'sources': [ 'devpoll.c', 'evport.c' ],
-              'include_dirs': [ 'solaris' ]
-            }],
-          ],
-        },
-      ],
-    }, {  # use_system_libevent != 0
-      'targets': [
-        {
-          'target_name': 'libevent',
-          'type': 'none',
-          'toolsets': ['host', 'target'],
-          'direct_dependent_settings': {
-            'defines': [
-              'USE_SYSTEM_LIBEVENT',
-            ],
-          },
-          'link_settings': {
-            'libraries': [
-              '-levent',
-            ],
-          },
-        }
-      ],
-    }],
-  ],
-}
diff --git a/third_party/libjpeg-turbo/BUILD.gn b/third_party/libjpeg-turbo/BUILD.gn
index ed476d7..88bcb57 100644
--- a/third_party/libjpeg-turbo/BUILD.gn
+++ b/third_party/libjpeg-turbo/BUILD.gn
@@ -149,8 +149,7 @@
 # TODO(b/206642994): look into whether we should condition on the
 # floating_point_fpu SABI variable, rather than sb_is_evergreen, here as we did
 # in third_party/libjpeg-turbo/libjpeg.gyp.
-if (is_starboard && sb_is_evergreen &&
-    (current_cpu == "arm" || current_cpu == "arm64") && arm_use_neon) {
+if (is_starboard && sb_is_evergreen && current_cpu == "arm" && arm_use_neon) {
   config("simd_arm_config") {
     cflags = [ "-mfpu=neon" ]
   }
@@ -203,7 +202,7 @@
     }
     configs += [ "//build/config/compiler:optimize_speed" ]
 
-    if (is_starboard && sb_is_evergreen) {
+    if (is_starboard && sb_is_evergreen && current_cpu == "arm") {
       configs += [ ":simd_arm_config" ]
     }
   } else {
diff --git a/third_party/libjpeg-turbo/libjpeg.gyp b/third_party/libjpeg-turbo/libjpeg.gyp
deleted file mode 100644
index 3448a91..0000000
--- a/third_party/libjpeg-turbo/libjpeg.gyp
+++ /dev/null
@@ -1,235 +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.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-    'is_starboard': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'libjpeg',
-      'type': 'static_library',
-      'include_dirs': [
-        '.',
-      ],
-      'defines': [
-        'BMP_SUPPORTED',
-        'PPM_SUPPORTED',
-      ],
-      'variables': {
-        'no_simd_files': [
-          'jsimd.h',
-          'jsimd_none.c',
-        ]
-      },
-      'sources': [
-        'cdjpeg.h',
-        'jaricom.c',
-        'jcapimin.c',
-        'jcapistd.c',
-        'jcarith.c',
-        'jccoefct.c',
-        'jccolor.c',
-        'jcdctmgr.c',
-        'jchuff.c',
-        'jchuff.h',
-        'jcinit.c',
-        'jcmainct.c',
-        'jcmarker.c',
-        'jcmaster.c',
-        'jcomapi.c',
-        'jconfig.h',
-        'jconfigint.h',
-        'jcparam.c',
-        'jcphuff.c',
-        'jcprepct.c',
-        'jcsample.c',
-        'jctrans.c',
-        'jdapimin.c',
-        'jdapistd.c',
-        'jdarith.c',
-        'jdatadst.c',
-        'jdatadst-tj.c',
-        'jdatasrc.c',
-        'jdatasrc-tj.c',
-        'jdcoefct.c',
-        'jdcolor.c',
-        'jdct.h',
-        'jddctmgr.c',
-        'jdhuff.c',
-        'jdhuff.h',
-        'jdinput.c',
-        'jdmainct.c',
-        'jdmarker.c',
-        'jdmaster.c',
-        'jdmerge.c',
-        'jdphuff.c',
-        'jdpostct.c',
-        'jdsample.c',
-        'jdtrans.c',
-        'jerror.c',
-        'jerror.h',
-        'jfdctflt.c',
-        'jfdctfst.c',
-        'jfdctint.c',
-        'jidctflt.c',
-        'jidctfst.c',
-        'jidctint.c',
-        'jidctred.c',
-        'jinclude.h',
-        'jmemmgr.c',
-        'jmemnobs.c',
-        'jmemsys.h',
-        'jmorecfg.h',
-        'jpeg_nbits_table.c',
-        'jpegint.h',
-        'jpeglib.h',
-        'jpeglibmangler.h',
-        'jquant1.c',
-        'jquant2.c',
-        'jutils.c',
-        'jversion.h',
-        'rdbmp.c',
-        'rdppm.c',
-        'transupp.h',
-        'transupp.c',
-        'turbojpeg.h',
-        'turbojpeg.c',
-        'wrbmp.c',
-        'wrppm.c',
-        '<@(no_simd_files)',
-      ],
-      'conditions': [
-        ['is_starboard', {
-          # These dependecies are needed for file io
-          # and are not currently used by Cobalt.
-          'sources!': [
-            'jdatadst.c',
-            'jdatasrc.c',
-            'rdbmp.c',
-            'rdppm.c',
-            'wrbmp.c',
-            'wrppm.c',
-          ],
-        }],
-        # arm processor specific optimizations.
-        ['target_arch == "arm" and arm_neon == 1 or target_arch == "arm64" and arm_neon == 1', {
-          'include_dirs': [
-            'simd/arm',
-          ],
-          'sources!': [
-            '<@(no_simd_files)'
-          ],
-          'sources': [
-            'simd/arm/jccolor-neon.c',
-            'simd/arm/jcgray-neon.c',
-            'simd/arm/jcphuff-neon.c',
-            'simd/arm/jcsample-neon.c',
-            'simd/arm/jdcolor-neon.c',
-            'simd/arm/jdmerge-neon.c',
-            'simd/arm/jdsample-neon.c',
-            'simd/arm/jfdctfst-neon.c',
-            'simd/arm/jfdctint-neon.c',
-            'simd/arm/jidctfst-neon.c',
-            'simd/arm/jidctint-neon.c',
-            'simd/arm/jidctred-neon.c',
-            'simd/arm/jquanti-neon.c',
-          ],
-          'defines': [
-            'WITH_SIMD',
-            'NEON_INTRINSICS',
-          ],
-          'conditions': [
-            ['target_arch == "arm"', {
-              'sources': [
-                'simd/arm/aarch32/jsimd.c',
-                'simd/arm/aarch32/jchuff-neon.c',
-              ],
-            }],
-            ['target_arch == "arm64"', {
-              'sources': [
-                'simd/arm/aarch64/jsimd.c',
-                'simd/arm/aarch64/jchuff-neon.c',
-              ],
-            }],
-            # For all Evergreen hardfp and softfp platforms.
-            ['floating_point_fpu=="vfpv3"', {
-              'cflags!': [
-                '-mfpu=<(floating_point_fpu)',
-              ],
-              'cflags': [
-                '-mfpu=neon',
-              ],
-            }],
-          ],
-        }],
-        # x86_64 specific optimizations.
-        ['<(yasm_exists) == 1 and target_arch == "x64"', {
-          'sources!': [
-            '<@(no_simd_files)'
-          ],
-          'sources': [
-            'simd/x86_64/jsimdcpu.asm',
-            'simd/x86_64/jfdctflt-sse.asm',
-            'simd/x86_64/jccolor-sse2.asm',
-            'simd/x86_64/jcgray-sse2.asm',
-            'simd/x86_64/jchuff-sse2.asm',
-            'simd/x86_64/jcphuff-sse2.asm',
-            'simd/x86_64/jcsample-sse2.asm',
-            'simd/x86_64/jdcolor-sse2.asm',
-            'simd/x86_64/jdmerge-sse2.asm',
-            'simd/x86_64/jdsample-sse2.asm',
-            'simd/x86_64/jfdctfst-sse2.asm',
-            'simd/x86_64/jfdctint-sse2.asm',
-            'simd/x86_64/jidctflt-sse2.asm',
-            'simd/x86_64/jidctfst-sse2.asm',
-            'simd/x86_64/jidctint-sse2.asm',
-            'simd/x86_64/jidctred-sse2.asm',
-            'simd/x86_64/jquantf-sse2.asm',
-            'simd/x86_64/jquanti-sse2.asm',
-            'simd/x86_64/jccolor-avx2.asm',
-            'simd/x86_64/jcgray-avx2.asm',
-            'simd/x86_64/jcsample-avx2.asm',
-            'simd/x86_64/jdcolor-avx2.asm',
-            'simd/x86_64/jdmerge-avx2.asm',
-            'simd/x86_64/jdsample-avx2.asm',
-            'simd/x86_64/jfdctint-avx2.asm',
-            'simd/x86_64/jidctint-avx2.asm',
-            'simd/x86_64/jquanti-avx2.asm',
-            'simd/x86_64/jsimd.c',
-            'simd/jsimd.h',
-          ],
-          # Rules for assembling .asm files with yasm.
-          'rules': [
-            {
-              'rule_name': 'assemble',
-              'extension': 'asm',
-                  'inputs': [ ],
-                  'outputs': [
-                    '<(PRODUCT_DIR)/obj/third_party/libjpeg-turbo/<(RULE_INPUT_ROOT).asm.o',
-                  ],
-                  'action': [
-                    '<(path_to_yasm)',
-                    '-DELF',
-                    '-D__x86_64__',
-                    '-DPIC',
-                    '-Isimd/nasm/',
-                    '-Isimd/x86_64/',
-                    '-f',
-                    'elf64',
-                    '-o',
-                    "<(PRODUCT_DIR)/$out",
-                    '<(RULE_INPUT_PATH)',
-                  ],
-                  'process_outputs_as_sources': 1,
-                  'message': 'Building <(RULE_INPUT_ROOT).asm.o',
-            },
-          ],
-          },
-        ]
-      ],
-    },
-  ],
-}
diff --git a/third_party/libjpeg/libjpeg.gyp b/third_party/libjpeg/libjpeg.gyp
deleted file mode 100644
index 4907052..0000000
--- a/third_party/libjpeg/libjpeg.gyp
+++ /dev/null
@@ -1,128 +0,0 @@
-# Copyright (c) 2009 The Chromium 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 handles building both with our local libjpeg and with the system
-  # libjpeg.
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'conditions': [
-    ['use_system_libjpeg==0', {
-      'targets': [
-        {
-          'target_name': 'libjpeg',
-          'type': 'static_library',
-          'sources': [
-            'jcapimin.c',
-            'jcapistd.c',
-            'jccoefct.c',
-            'jccolor.c',
-            'jcdctmgr.c',
-            'jchuff.c',
-            'jchuff.h',
-            'jcinit.c',
-            'jcmainct.c',
-            'jcmarker.c',
-            'jcmaster.c',
-            'jcomapi.c',
-            'jconfig.h',
-            'jcparam.c',
-            'jcphuff.c',
-            'jcprepct.c',
-            'jcsample.c',
-            'jdapimin.c',
-            'jdapistd.c',
-            'jdatadst.c',
-            'jdatasrc.c',
-            'jdcoefct.c',
-            'jdcolor.c',
-            'jdct.h',
-            'jddctmgr.c',
-            'jdhuff.c',
-            'jdhuff.h',
-            'jdinput.c',
-            'jdmainct.c',
-            'jdmarker.c',
-            'jdmaster.c',
-            'jdmerge.c',
-            'jdphuff.c',
-            'jdpostct.c',
-            'jdsample.c',
-            'jerror.c',
-            'jerror.h',
-            'jfdctflt.c',
-            'jfdctfst.c',
-            'jfdctint.c',
-            'jidctflt.c',
-            'jidctfst.c',
-            'jidctint.c',
-            'jinclude.h',
-            'jmemmgr.c',
-            'jmemnobs.c',
-            'jmemsys.h',
-            'jmorecfg.h',
-            'jpegint.h',
-            'jpeglib.h',
-            'jquant1.c',
-            'jquant2.c',
-            'jutils.c',
-            'jversion.h',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              '.',
-            ],
-          },
-          'conditions': [
-            ['OS!="win"', {'product_name': 'jpeg'}],
-            ['OS=="lb_shell" or OS=="starboard"', {
-              'sources!': [
-                # These are for decoding directly off of disk. They aren't
-                # currently used, and we probably should always be decoding from
-                # memory.
-                'jdatadst.c',
-                'jdatasrc.c',
-              ],
-            }],
-            ['clang==1', {
-              'cflags': [
-                '-Wno-format-security',
-              ],
-            }],
-          ],
-        },
-      ],
-    }, {
-      'targets': [
-        {
-          'target_name': 'libjpeg',
-          'type': 'none',
-          'direct_dependent_settings': {
-            'defines': [
-              'USE_SYSTEM_LIBJPEG',
-            ],
-            'conditions': [
-              ['os_bsd==1', {
-                'include_dirs': [
-                  '/usr/local/include',
-                ],
-              }],
-              ['OS=="android"', {
-                'include_dirs': [
-                  '<(android_src)/external/jpeg',
-                ],
-              }],
-            ],
-          },
-          'link_settings': {
-            'libraries': [
-              '-ljpeg',
-            ],
-          },
-        }
-      ],
-    }],
-  ],
-}
diff --git a/third_party/libpng/libpng.gyp b/third_party/libpng/libpng.gyp
deleted file mode 100644
index ad2358c..0000000
--- a/third_party/libpng/libpng.gyp
+++ /dev/null
@@ -1,144 +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.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-    'conditions': [
-      [ 'os_posix == 1 and OS != "mac" and OS != "android"', {
-        # Maybe link to system .so once the security concerns are thought
-        # through, since we already use it due to GTK.
-        'use_system_libpng%': 0,
-      }, {  # os_posix != 1 or OS == "mac"
-        'use_system_libpng%': 0,
-      }],
-    ],
-  },
-  'conditions': [
-    ['use_system_libpng==0', {
-      'targets': [
-        {
-          'target_name': 'libpng',
-          'dependencies': [
-            '../zlib/zlib.gyp:zlib',
-          ],
-          'defines': [
-            'CHROME_PNG_WRITE_SUPPORT',
-            'PNG_USER_CONFIG',
-            'PNG_SKIP_SETJMP_CHECK',
-          ],
-          'sources': [
-            'png.c',
-            'png.h',
-            'pngconf.h',
-            'pngerror.c',
-            'pnggccrd.c',
-            'pngget.c',
-            'pngmem.c',
-            'pngpread.c',
-            'pngread.c',
-            'pngrio.c',
-            'pngrtran.c',
-            'pngrutil.c',
-            'pngset.c',
-            'pngtrans.c',
-            'pngusr.h',
-            'pngvcrd.c',
-            'pngwio.c',
-            'pngwrite.c',
-            'pngwtran.c',
-            'pngwutil.c',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              '.',
-            ],
-            'defines': [
-              'CHROME_PNG_WRITE_SUPPORT',
-              'PNG_USER_CONFIG',
-              'PNG_SKIP_SETJMP_CHECK',
-            ],
-          },
-          'export_dependent_settings': [
-            '../zlib/zlib.gyp:zlib',
-          ],
-          'msvs_disabled_warnings': [
-            # Level 1 (but documentation says 3) - incompatible type conversion.
-            4133,
-          ],
-          'conditions': [
-            ['clang == 1', {
-              'cflags': [
-                '-Wno-tautological-compare',
-              ],
-            }],
-            ['OS!="win"', {'product_name': 'png'}],
-            ['OS=="win"', {
-              'type': '<(component)',
-            }, {
-              # Chromium libpng does not support building as a shared_library
-              # on non-Windows platforms.
-              'type': 'static_library',
-            }],
-            ['OS=="win" and component=="shared_library"', {
-              'defines': [
-                'PNG_BUILD_DLL',
-                'PNG_NO_MODULEDEF',
-              ],
-              'direct_dependent_settings': {
-                'defines': [
-                  'PNG_USE_DLL',
-                ],
-              },
-            }],
-            ['OS=="android"', {
-              'toolsets': ['target', 'host'],
-            }],
-          ],
-        },
-      ]
-    }, {
-      'conditions': [
-        ['sysroot!=""', {
-          'variables': {
-            'pkg-config': '../../build/linux/pkg-config-wrapper "<(sysroot)" "<(target_arch)"',
-          },
-        }, {
-          'variables': {
-            'pkg-config': 'pkg-config'
-          },
-        }],
-      ],
-      'targets': [
-        {
-          'target_name': 'libpng',
-          'type': 'none',
-          'dependencies': [
-            '../zlib/zlib.gyp:zlib',
-          ],
-          'direct_dependent_settings': {
-            'cflags': [
-              '<!@(<(pkg-config) --cflags libpng)',
-            ],
-          },
-          'link_settings': {
-            'ldflags': [
-              '<!@(<(pkg-config) --libs-only-L --libs-only-other libpng)',
-            ],
-            'libraries': [
-              '<!@(<(pkg-config) --libs-only-l libpng)',
-            ],
-          },
-          'variables': {
-            'headers_root_path': '.',
-            'header_filenames': [
-              'png.h',
-              'pngconf.h',
-            ],
-          },
-        },
-      ],
-    }],
-  ],
-}
diff --git a/third_party/libvpx/ads2gas.gypi b/third_party/libvpx/ads2gas.gypi
deleted file mode 100644
index 1a6bf96..0000000
--- a/third_party/libvpx/ads2gas.gypi
+++ /dev/null
@@ -1,54 +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.
-
-# This file is meant to be included into a target to provide a rule
-# for translating .asm files to .S files using ads2gas.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'my_lib',
-#   'sources': [
-#     'foo.asm',
-#     'bar.c',
-#   ],
-#   'includes': [ 'ads2gas.gypi' ],
-# }
-{
-  'variables': {
-    # Location of the intermediate output.
-    'shared_generated_dir': '<(SHARED_INTERMEDIATE_DIR)/third_party/libvpx',
-    'variables': {
-      'libvpx_source%': '<(DEPTH)/third_party/libvpx',
-      'conditions': [
-        ['OS=="ios"', {
-          'ads2gas_script%': 'ads2gas_apple.pl',
-        }, {
-          'ads2gas_script%': 'ads2gas.pl',
-        }],
-      ],
-    },
-    'ads2gas_script%': '<(ads2gas_script)',
-    'ads2gas_script_dir': '<(libvpx_source)/build/make',
-  },
-  'rules': [
-    {
-      'rule_name': 'convert_asm',
-      'extension': 'asm',
-      'inputs': [
-        '<(ads2gas_script_dir)/<(ads2gas_script)',
-        '<(ads2gas_script_dir)/thumb.pm',
-      ],
-      'outputs': [
-        '<(shared_generated_dir)/<(RULE_INPUT_ROOT).asm.S',
-      ],
-      'action': [
-        'bash',
-        '-c',
-        'cat <(RULE_INPUT_PATH) | perl -I /lib/perl5/5.10/ <(ads2gas_script_dir)/<(ads2gas_script) -chromium > <(shared_generated_dir)/<(RULE_INPUT_ROOT).asm.S',
-      ],
-      'process_outputs_as_sources': 1,
-      'message': 'Convert libvpx asm file for ARM <(RULE_INPUT_PATH)',
-    },
-  ],
-}
diff --git a/third_party/libvpx/platforms/linux-x64/libvpx.a b/third_party/libvpx/platforms/linux-x64/libvpx.a
deleted file mode 100644
index c8f685f..0000000
--- a/third_party/libvpx/platforms/linux-x64/libvpx.a
+++ /dev/null
Binary files differ
diff --git a/third_party/libwebp/libwebp.gyp b/third_party/libwebp/libwebp.gyp
deleted file mode 100644
index 9c77f08..0000000
--- a/third_party/libwebp/libwebp.gyp
+++ /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.
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'includes': [
-    'libwebp.gypi'
-  ],
-  'targets': [
-    {
-      'target_name': 'libwebp_dec',
-      'type': 'static_library',
-      'include_dirs': ['.'],
-      'sources': [
-        '<@(libwebp_dec_sources)',
-      ],
-    },
-    {
-      'target_name': 'libwebp_demux',
-      'type': 'static_library',
-      'include_dirs': ['.'],
-      'sources': [
-        '<@(libwebp_demux_sources)',
-      ],
-    },
-    {
-      'target_name': 'libwebp_dsp_dec',
-      'type' : 'static_library',
-      'include_dirs': ['.'],
-      'sources' : [
-        '<@(libwebp_dsp_dec_common_sources)',
-      ],
-      'dependencies': [
-        'libwebp_dsp_dec_msa',
-        'libwebp_dsp_dec_neon',
-        'libwebp_dsp_dec_sse2',
-        'libwebp_dsp_dec_sse41',
-        'libwebp_dsp_dec_mips32',
-        'libwebp_dsp_dec_mips_dsp_r2',
-      ],
-    },
-    {
-      'target_name': 'libwebp_dsp_dec_msa',
-      'type' : 'static_library',
-      'include_dirs': ['.'],
-      'sources' : [
-        '<@(libwebp_dsp_dec_msa_sources)',
-      ],
-    },
-    {
-      'target_name': 'libwebp_dsp_dec_neon',
-      'type' : 'static_library',
-      'include_dirs': ['.'],
-      'sources' : [
-        '<@(libwebp_dsp_dec_neon_sources)',
-      ],
-    },
-    {
-      'target_name': 'libwebp_dsp_dec_sse2',
-      'type' : 'static_library',
-      'include_dirs': ['.'],
-      'sources' : [
-        '<@(libwebp_dsp_dec_sse2_sources)',
-      ],
-    },
-    {
-      'target_name': 'libwebp_dsp_dec_sse41',
-      'type' : 'static_library',
-      'include_dirs': ['.'],
-      'sources' : [
-        '<@(libwebp_dsp_dec_sse41_sources)',
-      ],
-    },
-    {
-      'target_name': 'libwebp_dsp_dec_mips32',
-      'type' : 'static_library',
-      'include_dirs': ['.'],
-      'sources' : [
-        '<@(libwebp_dsp_dec_mips32_sources)',
-      ],
-    },
-    {
-      'target_name': 'libwebp_dsp_dec_mips_dsp_r2',
-      'type' : 'static_library',
-      'include_dirs': ['.'],
-      'sources' : [
-        '<@(libwebp_dsp_dec_mips_dsp_r2_sources)',
-      ],
-    },
-    {
-      'target_name': 'libwebp_utils_dec',
-      'type': 'static_library',
-      'include_dirs': ['.'],
-      'sources': [
-        '<@(libwebp_utils_dec_sources)',
-      ],
-    },
-
-    {
-      'target_name': 'libwebp_enc',
-      'type' : 'static_library',
-      'include_dirs': ['.'],
-      'sources' : [
-        '<@(libwebp_enc_sources)',
-      ],
-    },
-    {
-      'target_name': 'libwebp_dsp_enc',
-      'type' : 'static_library',
-      'include_dirs': ['.'],
-      'sources' : [
-        '<@(libwebp_dsp_enc_sources)',
-      ],
-      'dependencies': [
-      ],
-    },
-    {
-      'target_name': 'libwebp_utils_enc',
-      'type': 'static_library',
-      'include_dirs': ['.'],
-      'sources': [
-        '<@(libwebp_utils_enc_sources)',
-      ],
-    },
-
-    {
-      'target_name': 'libwebp',
-      'type': 'none',
-      'dependencies' : [
-        'libwebp_dec',
-        'libwebp_demux',
-        'libwebp_dsp_dec',
-        'libwebp_utils_dec',
-        'libwebp_enc',
-        'libwebp_dsp_enc',
-        'libwebp_utils_enc',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': ['.'],
-      },
-    },
-  ],
-}
diff --git a/third_party/libwebp/libwebp.gypi b/third_party/libwebp/libwebp.gypi
deleted file mode 100644
index 80a1bfd..0000000
--- a/third_party/libwebp/libwebp.gypi
+++ /dev/null
@@ -1,168 +0,0 @@
-{
-  'variables': {
-    'libwebp_dec_sources': [
-      'src/dec/alpha_dec.c',
-      'src/dec/buffer_dec.c',
-      'src/dec/frame_dec.c',
-      'src/dec/idec_dec.c',
-      'src/dec/io_dec.c',
-      'src/dec/quant_dec.c',
-      'src/dec/tree_dec.c',
-      'src/dec/vp8_dec.c',
-      'src/dec/vp8l_dec.c',
-      'src/dec/webp_dec.c',
-    ],
-    'libwebp_demux_sources': [
-      'src/demux/anim_decode.c',
-      'src/demux/demux.c',
-    ],
-    'libwebp_dsp_dec_common_sources': [
-      'src/dsp/alpha_processing.c',
-      'src/dsp/cpu.c',
-      'src/dsp/dec.c',
-      'src/dsp/dec_clip_tables.c',
-      'src/dsp/filters.c',
-      'src/dsp/lossless.c',
-      'src/dsp/rescaler.c',
-      'src/dsp/upsampling.c',
-      'src/dsp/yuv.c',
-    ],
-    'libwebp_dsp_dec_sse41_sources': [
-      'src/dsp/alpha_processing_sse41.c',
-      'src/dsp/dec_sse41.c',
-      'src/dsp/upsampling_sse41.c',
-      'src/dsp/yuv_sse41.c',
-    ],
-    'libwebp_dsp_dec_sse2_sources': [
-      'src/dsp/alpha_processing_sse2.c',
-      'src/dsp/dec_sse2.c',
-      'src/dsp/filters_sse2.c',
-      'src/dsp/lossless_sse2.c',
-      'src/dsp/rescaler_sse2.c',
-      'src/dsp/upsampling_sse2.c',
-      'src/dsp/yuv_sse2.c',
-    ],
-    'libwebp_dsp_dec_neon_sources': [
-      'src/dsp/alpha_processing_neon.c',
-      'src/dsp/dec_neon.c',
-      'src/dsp/filters_neon.c',
-      'src/dsp/lossless_neon.c',
-      'src/dsp/rescaler_neon.c',
-      'src/dsp/upsampling_neon.c',
-      'src/dsp/yuv_neon.c',
-    ],
-    'libwebp_dsp_dec_mips_dsp_r2_sources': [
-      'src/dsp/alpha_processing_mips_dsp_r2.c',
-      'src/dsp/dec_mips_dsp_r2.c',
-      'src/dsp/filters_mips_dsp_r2.c',
-      'src/dsp/lossless_mips_dsp_r2.c',
-      'src/dsp/rescaler_mips_dsp_r2.c',
-      'src/dsp/upsampling_mips_dsp_r2.c',
-      'src/dsp/yuv_mips_dsp_r2.c',
-    ],
-    'libwebp_dsp_dec_mips32_sources': [
-      'src/dsp/dec_mips32.c',
-      'src/dsp/rescaler_mips32.c',
-      'src/dsp/yuv_mips32.c',
-    ],
-    'libwebp_dsp_dec_msa_sources': [
-      'src/dsp/dec_msa.c',
-      'src/dsp/filters_msa.c',
-      'src/dsp/lossless_msa.c',
-      'src/dsp/rescaler_msa.c',
-      'src/dsp/upsampling_msa.c',
-    ],
-    'libwebp_dsp_enc_sources' : [
-      'src/dsp/cost.c',
-      'src/dsp/cost_mips32.c',
-      'src/dsp/cost_mips_dsp_r2.c',
-      'src/dsp/cost_sse2.c',
-      'src/dsp/enc.c',
-      'src/dsp/enc_avx2.c',
-      'src/dsp/enc_mips32.c',
-      'src/dsp/enc_mips_dsp_r2.c',
-      'src/dsp/enc_msa.c',
-      'src/dsp/enc_neon.c',
-      'src/dsp/enc_sse2.c',
-      'src/dsp/enc_sse41.c',
-      'src/dsp/lossless_enc.c',
-      'src/dsp/lossless_enc_mips32.c',
-      'src/dsp/lossless_enc_mips_dsp_r2.c',
-      'src/dsp/lossless_enc_msa.c',
-      'src/dsp/lossless_enc_neon.c',
-      'src/dsp/lossless_enc_sse2.c',
-      'src/dsp/lossless_enc_sse41.c',
-      'src/dsp/ssim.c',
-      'src/dsp/ssim_sse2.c',
-    ],
-    'libwebp_enc_sources': [
-      'src/enc/alpha_enc.c',
-      'src/enc/analysis_enc.c',
-      'src/enc/backward_references_cost_enc.c',
-      'src/enc/backward_references_enc.c',
-      'src/enc/config_enc.c',
-      'src/enc/cost_enc.c',
-      'src/enc/filter_enc.c',
-      'src/enc/frame_enc.c',
-      'src/enc/histogram_enc.c',
-      'src/enc/iterator_enc.c',
-      'src/enc/near_lossless_enc.c',
-      'src/enc/picture_enc.c',
-      'src/enc/picture_csp_enc.c',
-      'src/enc/picture_psnr_enc.c',
-      'src/enc/picture_rescale_enc.c',
-      'src/enc/picture_tools_enc.c',
-      'src/enc/predictor_enc.c',
-      'src/enc/quant_enc.c',
-      'src/enc/syntax_enc.c',
-      'src/enc/token_enc.c',
-      'src/enc/tree_enc.c',
-      'src/enc/vp8l_enc.c',
-      'src/enc/webp_enc.c',
-    ],
-    'libwebp_format_dec_sources': [
-      'imageio/image_dec.c',
-      'imageio/jpegdec.c',
-      'imageio/metadata.c',
-      'imageio/pngdec.c',
-      'imageio/pnmdec.c',
-      'imageio/tiffdec.c',
-      'imageio/webpdec.c',
-    ],
-    'libwebp_format_enc_sources': [
-      'imageio/image_enc.c',
-    ],
-    'libwebp_util_sources': [
-      'examples/example_util.c',
-    ],
-    'libwebp_image_util_sources': [
-      'imageio/imageio_util.c',
-    ],
-    'libwebp_mux_sources': [
-      'src/mux/anim_encode.c',
-      'src/mux/muxedit.c',
-      'src/mux/muxinternal.c',
-      'src/mux/muxread.c',
-    ],
-    'libwebp_utils_dec_sources': [
-      'src/utils/bit_reader_utils.c',
-      'src/utils/color_cache_utils.c',
-      'src/utils/filters_utils.c',
-      'src/utils/huffman_utils.c',
-      'src/utils/quant_levels_dec_utils.c',
-      'src/utils/random_utils.c',
-      'src/utils/rescaler_utils.c',
-      'src/utils/thread_utils.c',
-      'src/utils/utils.c',
-    ],
-    'libwebp_utils_enc_sources': [
-      'src/utils/bit_writer_utils.c',
-      'src/utils/huffman_encode_utils.c',
-      'src/utils/quant_levels_utils.c',
-    ],
-    'libwebp_extra_sources': [
-      'extras/extras.c',
-      'extras/quality_estimate.c',
-    ],
-  },
-}
diff --git a/third_party/libxml/libxml.gyp b/third_party/libxml/libxml.gyp
deleted file mode 100644
index a2666bb..0000000
--- a/third_party/libxml/libxml.gyp
+++ /dev/null
@@ -1,227 +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.
-
-{
-  'variables': {
-    'os_include': 'starboard',
-  },
-  'targets': [
-    {
-      'target_name': 'libxml',
-      'type': 'static_library',
-      'sources': [
-        # 'chromium/libxml_utils.h',
-        # 'chromium/libxml_utils.cc',
-        'linux/config.h',
-        'linux/include/libxml/xmlversion.h',
-        'mac/config.h',
-        'mac/include/libxml/xmlversion.h',
-
-        #'src/DOCBparser.c',
-        'src/HTMLparser.c',
-        'src/HTMLtree.c',
-
-        #'src/SAX.c',
-        'src/SAX2.c',
-        'src/buf.c',
-        'src/buf.h',
-
-        #'src/c14n.c',
-        #'src/catalog.c',
-        'src/chvalid.c',
-
-        #'src/debugXML.c',
-        'src/dict.c',
-        'src/elfgcchack.h',
-        'src/enc.h',
-        'src/encoding.c',
-        'src/entities.c',
-        'src/error.c',
-        'src/globals.c',
-        'src/hash.c',
-        'src/include/libxml/DOCBparser.h',
-        'src/include/libxml/HTMLparser.h',
-        'src/include/libxml/HTMLtree.h',
-        'src/include/libxml/SAX.h',
-        'src/include/libxml/SAX2.h',
-        'src/include/libxml/c14n.h',
-        'src/include/libxml/catalog.h',
-        'src/include/libxml/chvalid.h',
-        'src/include/libxml/debugXML.h',
-        'src/include/libxml/dict.h',
-        'src/include/libxml/encoding.h',
-        'src/include/libxml/entities.h',
-        'src/include/libxml/globals.h',
-        'src/include/libxml/hash.h',
-        'src/include/libxml/list.h',
-        'src/include/libxml/nanoftp.h',
-        'src/include/libxml/nanohttp.h',
-        'src/include/libxml/parser.h',
-        'src/include/libxml/parserInternals.h',
-        'src/include/libxml/pattern.h',
-        'src/include/libxml/relaxng.h',
-        'src/include/libxml/schemasInternals.h',
-        'src/include/libxml/schematron.h',
-        'src/include/libxml/threads.h',
-        'src/include/libxml/tree.h',
-        'src/include/libxml/uri.h',
-        'src/include/libxml/valid.h',
-        'src/include/libxml/xinclude.h',
-        'src/include/libxml/xlink.h',
-        'src/include/libxml/xmlIO.h',
-        'src/include/libxml/xmlautomata.h',
-        'src/include/libxml/xmlerror.h',
-        'src/include/libxml/xmlexports.h',
-        'src/include/libxml/xmlmemory.h',
-        'src/include/libxml/xmlmodule.h',
-        'src/include/libxml/xmlreader.h',
-        'src/include/libxml/xmlregexp.h',
-        'src/include/libxml/xmlsave.h',
-        'src/include/libxml/xmlschemas.h',
-        'src/include/libxml/xmlschemastypes.h',
-        'src/include/libxml/xmlstring.h',
-        'src/include/libxml/xmlunicode.h',
-        'src/include/libxml/xmlwriter.h',
-        'src/include/libxml/xpath.h',
-        'src/include/libxml/xpathInternals.h',
-        'src/include/libxml/xpointer.h',
-        'src/include/win32config.h',
-        'src/include/wsockcompat.h',
-
-        #'src/legacy.c',
-        'src/libxml.h',
-        'src/list.c',
-        'src/parser.c',
-        'src/parserInternals.c',
-        'src/pattern.c',
-
-        'src/relaxng.c',
-        'src/save.h',
-
-        #'src/schematron.c',
-        'src/threads.c',
-        'src/timsort.h',
-        'src/tree.c',
-        'src/triodef.h',
-        'src/trionan.h',
-
-        #'src/trio.c',
-        #'src/trio.h',
-        #'src/triodef.h',
-        # Note: xpath.c #includes trionan.c
-        #'src/trionan.c',
-        #'src/triop.h',
-        #'src/triostr.c',
-        #'src/triostr.h',
-        'src/uri.c',
-        'src/valid.c',
-
-        #'src/xinclude.c',
-        #'src/xlink.c',
-        'src/xmlIO.c',
-        'src/xmlmemory.c',
-
-        #'src/xmlmodule.c',
-        'src/xmlreader.c',
-
-        'src/xmlregexp.c',
-        'src/xmlsave.c',
-
-        'src/xmlschemas.c',
-        'src/xmlschemastypes.c',
-        'src/xmlstring.c',
-        'src/xmlunicode.c',
-        'src/xmlwriter.c',
-        'src/xpath.c',
-
-        'src/xpointer.c',
-        #'src/xzlib.c',
-        'src/xzlib.h',
-        'win32/config.h',
-        'win32/include/libxml/xmlversion.h',
-      ],
-      'defines': [
-        # Define LIBXML_STATIC as nothing to match how libxml.h
-        # (an internal header) defines LIBXML_STATIC, otherwise
-        # we get the macro redefined warning from GCC.  (-DFOO
-        # defines the macro FOO as 1.)
-        'LIBXML_STATIC=',
-      ],
-      'include_dirs': [
-        '<(os_include)',
-        '<(os_include)/include',
-        'src/include',
-      ],
-      'dependencies': [
-        '../icu/icu.gyp:icuuc',
-        '../zlib/zlib.gyp:zlib',
-      ],
-      'export_dependent_settings': [
-        '../icu/icu.gyp:icuuc',
-      ],
-      'direct_dependent_settings': {
-        'defines': [
-          'LIBXML_STATIC',
-        ],
-        'include_dirs': [
-          '<(os_include)/include',
-          'src/include',
-        ],
-      },
-      'msvs_disabled_warnings': [
-        '4018', # Signed / Unsigned mismatch.
-        '4244', # Conversion from int64 to int.
-        '4267', # Conversion from size_t to int.
-        '4005', # Macro re-definition.
-        '4047',
-        '4067',
-        '4101', # Unreferenced local variable.
-        '4996', # Posix name for this item is deprecated.
-        '4311', # Pointer truncation from 'void *' to 'long'
-        '4312', # Conversion from 'long' to 'void *' of greater size
-        '4477', # Format string '%lu' requires an argument of type
-                # 'unsigned long', but variadic argument 1 has type 'size_t'
-      ],
-      'conditions': [
-        ['OS=="starboard" or OS=="lb_shell"', {
-          'dependencies!': [
-            '../zlib/zlib.gyp:zlib',
-          ],
-        }],
-        ['target_arch=="win"', {
-          'product_name': 'libxml2',
-        }, {  # else: OS!="win"
-          'product_name': 'xml2',
-        }],
-        ['clang == 1', {
-          'cflags': [
-            # libxml passes `const unsigned char*` through `const char*`.
-            '-Wno-pointer-sign',
-            # pattern.c and uri.c both have an intentional
-            # `for (...);` / `while(...);` loop. I submitted a patch to
-            # move the `'` to its own line, but until that's landed
-            # suppress the warning:
-            '-Wno-empty-body',
-            # debugXML.c compares array 'arg' to NULL.
-            '-Wno-tautological-pointer-compare',
-            # See http://crbug.com/138571#c8
-            '-Wno-ignored-attributes',
-            # libxml casts from int to long to void*.
-            '-Wno-int-to-void-pointer-cast',
-            # libxml passes a volatile LPCRITICAL_SECTION* to a function
-            # expecting a void* volatile*.
-            '-Wno-incompatible-pointer-types',
-            # trio_is_special_quantity and trio_is_negative are only
-            # used with certain preprocessor defines set.
-            '-Wno-unused-function',
-            # xpath.c xmlXPathNodeCollectAndTest compares 'xmlElementType'
-            # and 'xmlXPathTypeVal'.
-            '-Wno-enum-compare',
-          ],
-        }],
-      ],
-    },
-  ],
-}
-
diff --git a/third_party/llvm-project/compiler-rt/compiler-rt.gyp b/third_party/llvm-project/compiler-rt/compiler-rt.gyp
deleted file mode 100644
index 906ea6c..0000000
--- a/third_party/llvm-project/compiler-rt/compiler-rt.gyp
+++ /dev/null
@@ -1,103 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'compiler_rt',
-      'type': 'static_library',
-      'cflags': [
-        '-nostdinc',
-      ],
-      'cflags_cc': [
-        '-std=c++11',
-        '-nostdinc++',
-        '-fvisibility-inlines-hidden',
-        '-fms-compatibility-version=19.00',
-        '-Wall',
-        '-Wextra',
-        '-W',
-        '-Wwrite-strings',
-        '-Wno-long-long',
-        '-Werror=return-type',
-        '-Wno-user-defined-literals',
-        '-Wno-bitwise-op-parentheses',
-        '-Wno-shift-op-parentheses',
-        '-Wno-error',
-        '-Wno-unused-parameter',
-        '-Wno-unused-command-line-argument',
-        '-fPIC',
-      ],
-      'sources': [
-        'lib/builtins/udivti3.c',
-        'lib/builtins/udivmodti4.c',
-        'lib/builtins/umodti3.c',
-      ],
-      'conditions': [
-        ['sb_evergreen == 1 and target_arch == "arm"', {
-          'sources': [
-            'lib/builtins/divdi3.c',
-            'lib/builtins/divmoddi4.c',
-            'lib/builtins/divmodsi4.c',
-            'lib/builtins/divsi3.c',
-            'lib/builtins/fixdfdi.c',
-            'lib/builtins/fixsfdi.c',
-            'lib/builtins/fixunsdfdi.c',
-            'lib/builtins/fixunssfdi.c',
-            'lib/builtins/floatdidf.c',
-            'lib/builtins/floatdisf.c',
-            'lib/builtins/floatundidf.c',
-            'lib/builtins/floatundisf.c',
-            'lib/builtins/udivmoddi4.c',
-            'lib/builtins/udivmodsi4.c',
-            'lib/builtins/udivsi3.c',
-
-            'lib/builtins/arm/aeabi_idivmod.S',
-            'lib/builtins/arm/aeabi_ldivmod.S',
-            'lib/builtins/arm/aeabi_memcmp.S',
-            'lib/builtins/arm/aeabi_memcpy.S',
-            'lib/builtins/arm/aeabi_memmove.S',
-            'lib/builtins/arm/aeabi_memset.S',
-            'lib/builtins/arm/aeabi_uidivmod.S',
-            'lib/builtins/arm/aeabi_uldivmod.S',
-          ],
-        }],
-        ['sb_evergreen == 1 and target_arch == "arm64"', {
-          'sources': [
-            'lib/builtins/addtf3.c',
-            'lib/builtins/comparetf2.c',
-            'lib/builtins/divtf3.c',
-            'lib/builtins/extenddftf2.c',
-            'lib/builtins/extendsftf2.c',
-            'lib/builtins/fixtfsi.c',
-            'lib/builtins/floatsitf.c',
-            'lib/builtins/floatunsitf.c',
-            'lib/builtins/multf3.c',
-            'lib/builtins/subtf3.c',
-            'lib/builtins/trunctfdf2.c',
-            'lib/builtins/trunctfsf2.c',
-          ],
-        }],
-        ['sb_evergreen == 1 and target_arch == "x86"', {
-          'sources': [
-            'lib/builtins/i386/divdi3.S',
-            'lib/builtins/i386/moddi3.S',
-            'lib/builtins/i386/udivdi3.S',
-            'lib/builtins/i386/umoddi3.S',
-          ],
-        }],
-      ]
-    }
-  ]
-}
diff --git a/third_party/llvm-project/libcxx/include/__external_threading b/third_party/llvm-project/libcxx/include/__external_threading
index 6456285..e4cbef9 100644
--- a/third_party/llvm-project/libcxx/include/__external_threading
+++ b/third_party/llvm-project/libcxx/include/__external_threading
@@ -9,7 +9,6 @@
 #include "starboard/mutex.h"
 #include "starboard/once.h"
 #include "starboard/thread.h"
-#include "starboard/thread_types.h"
 #include "starboard/time.h"
 
 _LIBCPP_PUSH_MACROS
diff --git a/third_party/llvm-project/libcxx/libcxx.gyp b/third_party/llvm-project/libcxx/libcxx.gyp
deleted file mode 100644
index 1669d50..0000000
--- a/third_party/llvm-project/libcxx/libcxx.gyp
+++ /dev/null
@@ -1,105 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'cxx',
-      'type': 'static_library',
-      'include_dirs': [
-        'include',
-        '<(DEPTH)/third_party/llvm-project/libcxxabi/include',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/common/common.gyp:common',
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-        '<(DEPTH)/third_party/musl/musl.gyp:c',
-        '<(DEPTH)/third_party/llvm-project/compiler-rt/compiler-rt.gyp:compiler_rt',
-        '<(DEPTH)/third_party/llvm-project/libcxxabi/libcxxabi.gyp:cxxabi',
-        '<(DEPTH)/third_party/llvm-project/libunwind/libunwind.gyp:unwind_evergreen',
-      ],
-      'cflags': [
-        '-nostdinc',
-      ],
-      'cflags_cc': [
-        '-std=c++11',
-        '-nostdinc++',
-        '-fvisibility-inlines-hidden',
-        '-fms-compatibility-version=19.00',
-        '-Wall',
-        '-Wextra',
-        '-W',
-        '-Wwrite-strings',
-        '-Wno-long-long',
-        '-Werror=return-type',
-        '-Wno-user-defined-literals',
-        '-Wno-bitwise-op-parentheses',
-        '-Wno-shift-op-parentheses',
-        '-Wno-error',
-        '-Wno-unused-parameter',
-        '-Wno-unused-command-line-argument',
-        '-fPIC',
-      ],
-      'defines': [
-        '_LIBCPP_BUILDING_LIBRARY',
-        '_LIBCPP_HAS_MUSL_LIBC',
-        '_LIBCPP_HAS_NO_STDIN',
-        # This macro is used to build libcxxabi with libunwind.
-        'LIBCXX_BUILDING_LIBCXXABI',
-      ],
-      'sources': [
-        'include/apple_availability.h',
-        'include/atomic_support.h',
-        'include/config_elast.h',
-        'include/refstring.h',
-        'src/algorithm.cpp',
-        'src/any.cpp',
-        'src/bind.cpp',
-        'src/charconv.cpp',
-        'src/chrono.cpp',
-        'src/condition_variable.cpp',
-        'src/exception.cpp',
-
-        # Remove file system operations
-        #'src/filesystem/directory_iterator.cpp',
-        #'src/filesystem/filesystem_common.h',
-        #'src/filesystem/int128_builtins.cpp',
-        #'src/filesystem/operations.cpp',
-
-        'src/functional.cpp',
-        'src/future.cpp',
-        'src/hash.cpp',
-        'src/ios.cpp',
-        'src/iostream.cpp',
-        'src/locale.cpp',
-        'src/memory.cpp',
-        'src/mutex.cpp',
-        'src/new.cpp',
-        'src/optional.cpp',
-        'src/regex.cpp',
-        'src/shared_mutex.cpp',
-        'src/stdexcept.cpp',
-        'src/string.cpp',
-        'src/strstream.cpp',
-        'src/system_error.cpp',
-        'src/thread.cpp',
-        'src/typeinfo.cpp',
-        'src/utility.cpp',
-        'src/valarray.cpp',
-        'src/variant.cpp',
-        'src/vector.cpp',
-      ],
-    }
-  ]
-}
diff --git a/third_party/llvm-project/libcxxabi/libcxxabi.gyp b/third_party/llvm-project/libcxxabi/libcxxabi.gyp
deleted file mode 100644
index f9b6f79..0000000
--- a/third_party/llvm-project/libcxxabi/libcxxabi.gyp
+++ /dev/null
@@ -1,106 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'cxxabi',
-      'type': 'static_library',
-      'include_dirs': [
-        'include',
-        '<(DEPTH)/third_party/llvm-project/libunwind/include',
-      ],
-      'dependencies': [
-        '<(DEPTH)/third_party/musl/musl.gyp:c',
-        '<(DEPTH)/third_party/llvm-project/libunwind/libunwind.gyp:unwind_evergreen',
-      ],
-      'cflags': [
-        '-nostdinc',
-      ],
-      'cflags_cc': [
-        '-std=c++11',
-        '-nostdinc++',
-        '-fPIC',
-        '-fexceptions',
-        '-frtti',
-        '-Werror=return-type',
-        '-fvisibility-inlines-hidden',
-        '-fms-compatibility-version=19.00',
-        '-funwind-tables',
-        '-W',
-        '-Wall',
-        '-Wextra',
-        '-Wwrite-strings',
-        '-Wshorten-64-to-32',
-        '-Wno-error',
-        '-Wno-unused-command-line-argument',
-      ],
-      'defines' : [
-        # This macro is used to disable extern template declarations in the libc++
-        # headers. The intended use case is for clients who wish to use the libc++
-        # headers without taking a dependency on the libc++ library itself.
-        '_LIBCPP_DISABLE_EXTERN_TEMPLATE',
-        # This macro is used to re-enable the `set_unexpected`, `get_unexpected`, and
-        # `unexpected` functions, which were removed in C++17.
-        '_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS',
-        # Let the library headers know they are currently being used to build the
-        # library.
-        '_LIBCXXABI_BUILDING_LIBRARY',
-        'LIBCXXABI_USE_LLVM_UNWINDER',
-      ],
-      'sources': [
-        'src/abort_message.cpp',
-        'src/abort_message.h',
-        'src/cxa_aux_runtime.cpp',
-        'src/cxa_default_handlers.cpp',
-        'src/cxa_demangle.cpp',
-        'src/cxa_exception.cpp',
-        'src/cxa_exception.hpp',
-        'src/cxa_exception_storage.cpp',
-        'src/cxa_guard.cpp',
-        'src/cxa_handlers.cpp',
-        'src/cxa_handlers.hpp',
-        'src/cxa_personality.cpp',
-        'src/cxa_unexpected.cpp',
-        'src/cxa_vector.cpp',
-        'src/cxa_virtual.cpp',
-        'src/demangle/Compiler.h',
-        'src/demangle/StringView.h',
-        'src/demangle/Utility.h',
-        'src/fallback_malloc.cpp',
-        'src/fallback_malloc.h',
-        'src/include/atomic_support.h',
-        'src/include/refstring.h',
-        'src/private_typeinfo.cpp',
-        'src/private_typeinfo.h',
-        'src/stdlib_exception.cpp',
-        'src/stdlib_new_delete.cpp',
-        'src/stdlib_stdexcept.cpp',
-        'src/stdlib_typeinfo.cpp',
-      ],
-      'sources!': [
-        # We utilize exception handling and the following file breaks the build.
-        'src/cxa_noexception.cpp',
-
-        # Not needed and leaks __cxa_thread_atexit_impl.
-        'src/cxa_thread_atexit.cpp',
-      ],
-      'all_dependent_settings': {
-        'defines': [
-          'LIBCXXABI_USE_LLVM_UNWINDER',
-        ],
-      },
-    }
-  ]
-}
diff --git a/third_party/llvm-project/libunwind/libunwind.gyp b/third_party/llvm-project/libunwind/libunwind.gyp
deleted file mode 100644
index e0fcb38..0000000
--- a/third_party/llvm-project/libunwind/libunwind.gyp
+++ /dev/null
@@ -1,178 +0,0 @@
-# Copyright 2019 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'unwind_evergreen',
-      'type': 'static_library',
-      'include_dirs': [
-        'include',
-        '<(DEPTH)/third_party/llvm-project/libunwind/include',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/common/common.gyp:common',
-        '<(DEPTH)/third_party/musl/musl.gyp:c',
-      ],
-      'cflags': [
-        '-nostdinc',
-        '-Wno-unused-command-line-argument',
-      ],
-      'cflags_cc': [
-        '-std=c++11',
-        '-nostdinc++',
-        '-fPIC',
-        '-Werror=return-type',
-        '-fvisibility-inlines-hidden',
-        '-fms-compatibility-version=19.00',
-        '-funwind-tables',
-        '-W',
-        '-Wall',
-        '-Wextra',
-        '-Wwrite-strings',
-        '-Wshorten-64-to-32',
-        '-Wno-error',
-        '-Wno-unused-parameter',
-      ],
-      'defines': [
-        # Ensure that __external_threading is used for threading support.
-        '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-        # Build libunwind with concurrency built upon Starboard mutexes and
-        # condition variables.
-        '_LIBUNWIND_HAS_STARBOARD_THREADS',
-        'LIBUNWIND_PRINT_APIS',
-        'LIBUNWIND_PRINT_DWARF',
-        'LIBUNWIND_PRINT_UNWINDING',
-        'LLVM_PATH="<(DEPTH)/third_party/llvm-project/llvm/"',
-      ],
-      'sources': [
-        'src/AddressSpace.hpp',
-        'src/assembly.h',
-        'src/CMakeLists.txt',
-        'src/CompactUnwinder.hpp',
-        'src/config.h',
-        'src/dwarf2.h',
-        'src/DwarfInstructions.hpp',
-        'src/DwarfParser.hpp',
-        'src/EHHeaderParser.hpp',
-        'src/libunwind.cpp',
-        'src/libunwind_ext.h',
-        'src/Registers.hpp',
-        'src/RWMutex.hpp',
-        'src/UnwindCursor.hpp',
-        'src/Unwind-EHABI.cpp',
-        'src/Unwind-EHABI.h',
-        'src/UnwindLevel1.c',
-        'src/UnwindLevel1-gcc-ext.c',
-        'src/UnwindRegistersRestore.S',
-        'src/UnwindRegistersSave.S',
-        'src/Unwind-sjlj.c',
-      ],
-      'all_dependent_settings': {
-        'include_dirs': [
-          '<(DEPTH)/third_party/llvm-project/libunwind/include',
-        ],
-        'defines': [
-          # Ensure that __external_threading is used for threading support.
-          '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-          'LLVM_PATH="<(DEPTH)/third_party/llvm-project/llvm/"',
-        ],
-      },
-      'conditions': [
-        ['target_os == "tvos"', {
-          'sources': [
-            'src/Unwind_AppleExtras.cpp',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'unwind_starboard',
-      'type': 'static_library',
-      'include_dirs': [
-        'include',
-        '<(DEPTH)/third_party/llvm-project/libunwind/include',
-      ],
-      'dependencies': [
-        '<(DEPTH)/starboard/common/common.gyp:common',
-        '<(DEPTH)/starboard/elf_loader/evergreen_info.gyp:evergreen_info',
-      ],
-      'cflags': [
-        '-Wno-unused-command-line-argument',
-      ],
-      'cflags_cc': [
-        '-std=c++11',
-        '-fPIC',
-        '-Werror=return-type',
-        '-fvisibility-inlines-hidden',
-        '-funwind-tables',
-        '-W',
-        '-Wall',
-        '-Wextra',
-        '-Wwrite-strings',
-        '-Wno-error',
-        '-Wno-unused-parameter',
-      ],
-      'defines': [
-        'STARBOARD_IMPLEMENTATION',
-        # Ensure that __external_threading is used for threading support.
-        '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-        # Build libunwind with concurrency built upon Starboard mutexes and
-        # condition variables.
-        '_LIBUNWIND_HAS_STARBOARD_THREADS',
-        'LLVM_PATH="<(DEPTH)/third_party/llvm-project/llvm/"',
-      ],
-      'sources': [
-        'src/AddressSpace.hpp',
-        'src/assembly.h',
-        'src/CMakeLists.txt',
-        'src/CompactUnwinder.hpp',
-        'src/config.h',
-        'src/dwarf2.h',
-        'src/DwarfInstructions.hpp',
-        'src/DwarfParser.hpp',
-        'src/EHHeaderParser.hpp',
-        'src/libunwind.cpp',
-        'src/libunwind_ext.h',
-        'src/Registers.hpp',
-        'src/RWMutex.hpp',
-        'src/UnwindCursor.hpp',
-        'src/Unwind-EHABI.cpp',
-        'src/Unwind-EHABI.h',
-        'src/UnwindLevel1.c',
-        'src/UnwindLevel1-gcc-ext.c',
-        'src/UnwindRegistersRestore.S',
-        'src/UnwindRegistersSave.S',
-        'src/Unwind-sjlj.c',
-      ],
-      'all_dependent_settings': {
-        'include_dirs': [
-          '<(DEPTH)/third_party/llvm-project/libunwind/include',
-        ],
-        'defines': [
-          # Ensure that __external_threading is used for threading support.
-          '_LIBCPP_HAS_THREAD_API_EXTERNAL',
-          'LLVM_PATH="<(DEPTH)/third_party/llvm-project/llvm/"',
-        ],
-      },
-      'conditions': [
-        ['target_os == "tvos"', {
-          'sources': [
-            'src/Unwind_AppleExtras.cpp',
-          ],
-        }],
-      ],
-    }
-  ]
-}
diff --git a/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter3.test b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter3.test
new file mode 100644
index 0000000..b9c8ba6
--- /dev/null
+++ b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter3.test
@@ -0,0 +1,17 @@
+# RUN: Kaleidoscope-Ch3 < %s 2>&1 | FileCheck %s
+
+# Test basic parsing and IR generation.
+def foo(x) x + 1;
+foo(1);
+
+# CHECK:      define double @foo(double %x) {
+# CHECK-NEXT: entry:
+# CHECK-NEXT:   %addtmp = fadd double %x, 1.000000e+00
+# CHECK-NEXT:   ret double %addtmp
+# CHECK-NEXT: }
+
+# CHECK:      define double @__anon_expr() {
+# CHECK-NEXT: entry:
+# CHECK-NEXT:   %calltmp = call double @foo(double 1.000000e+00)
+# CHECK-NEXT:   ret double %calltmp
+# CHECK-NEXT: }
diff --git a/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter4.test b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter4.test
new file mode 100644
index 0000000..5fd0e42
--- /dev/null
+++ b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter4.test
@@ -0,0 +1,17 @@
+# RUN: Kaleidoscope-Ch4 < %s 2>&1 | FileCheck %s
+
+# Test basic definition, binding, and execution.
+def foo(x) x + 1;
+def bar(x) foo(2 * x);
+bar(2);
+# CHECK: Evaluated to 5.000000
+
+# Test redefinition.
+def foo(x) x + 2;
+foo(2);
+# CHECK: Evaluated to 4.000000
+
+# Verify that 'bar' still calls the original 'foo'.
+bar(2);
+# CHECK: Evaluated to 5.000000
+
diff --git a/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter5.test b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter5.test
new file mode 100644
index 0000000..1ad9023
--- /dev/null
+++ b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter5.test
@@ -0,0 +1,19 @@
+# RUN: Kaleidoscope-Ch5 < %s 2>&1 | FileCheck %s
+
+# Test 'if' expression.
+def foo(x) if x < 10 then 0 else 1;
+foo(9);
+foo(11);
+# CHECK: Evaluated to 0.000000
+# CHECK: Evaluated to 1.000000
+
+# Test 'for' expression.
+extern printd(x);
+for i = 1, i < 5, 1.0 in
+  printd(i);
+# CHECK: 1.0
+# CHECK: 2.0
+# CHECK: 3.0
+# CHECK: 4.0
+# CHECK: 5.0
+# CHECK: Evaluated to 0.000000
\ No newline at end of file
diff --git a/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter6.test b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter6.test
new file mode 100644
index 0000000..cbdd01f
--- /dev/null
+++ b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter6.test
@@ -0,0 +1,15 @@
+# RUN: Kaleidoscope-Ch6 < %s 2>&1 | FileCheck %s
+
+# Test unary operator definition.
+def unary-(x) 0 - x;
+1 + (-1);
+# CHECK: Evaluated to 0.000000
+
+# Test binary operator definition.
+def binary> 10 (lhs rhs) rhs < lhs;
+def foo(x) if x > 10 then 0 else 1;
+foo(9);
+foo(11);
+# CHECK: Evaluated to 1.000000
+# CHECK: Evaluated to 0.000000
+
diff --git a/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter7.test b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter7.test
new file mode 100644
index 0000000..4843ca7
--- /dev/null
+++ b/third_party/llvm-project/llvm/test/Examples/Kaleidoscope/Chapter7.test
@@ -0,0 +1,15 @@
+# RUN: Kaleidoscope-Ch7 < %s 2>&1 | FileCheck %s
+
+# Sequence operator and iterative fibonacci function to test user defined vars.
+def binary : 1 (x y) y;
+
+def fibi(x)
+  var a = 1, b = 1, c in
+  (for i = 3, i < x in
+     c = a + b :
+     a = b :
+     b = c) :
+  b;
+
+fibi(10);
+# CHECK: Evaluated to 55.000000
diff --git a/third_party/llvm-project/llvm/test/Examples/lit.local.cfg b/third_party/llvm-project/llvm/test/Examples/lit.local.cfg
new file mode 100644
index 0000000..462e3dc
--- /dev/null
+++ b/third_party/llvm-project/llvm/test/Examples/lit.local.cfg
@@ -0,0 +1 @@
+config.unsupported = True
diff --git a/third_party/lz4_lib/lz4.gyp b/third_party/lz4_lib/lz4.gyp
deleted file mode 100644
index caac2bb..0000000
--- a/third_party/lz4_lib/lz4.gyp
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2021 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'lz4',
-      'type': 'static_library',
-      'include_dirs': [
-        '<(DEPTH)/third_party/lz4_lib',
-      ],
-      'defines': [
-        # Make LZ4 use our implementations for its memory management functions.
-        'LZ4_USER_MEMORY_FUNCTIONS',
-        'XXH_NAMESPACE=LZ4_',
-      ],
-      'sources': [
-        '<(DEPTH)/third_party/lz4_lib/lz4_all.c',
-        '<(DEPTH)/third_party/lz4_lib/lz4starboard.c',
-        '<(DEPTH)/third_party/lz4_lib/xxhash.c',
-      ],
-    },
-  ],
-}
diff --git a/third_party/mini_chromium/base/base.gyp b/third_party/mini_chromium/base/base.gyp
deleted file mode 100644
index 71dd510..0000000
--- a/third_party/mini_chromium/base/base.gyp
+++ /dev/null
@@ -1,154 +0,0 @@
-# Copyright 2009 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'includes': [
-    '../build/common.gypi',
-  ],
-
-  'targets': [
-    {
-      'target_name': 'base',
-      'type': 'static_library',
-      'include_dirs!': [
-        '<(DEPTH)',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'cflags': [
-        '-isystem../..',
-      ],
-      'link_settings': {
-        'conditions': [
-          ['OS=="mac"', {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/ApplicationServices.framework',
-              '$(SDKROOT)/System/Library/Frameworks/CoreFoundation.framework',
-              '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
-              '$(SDKROOT)/System/Library/Frameworks/IOKit.framework',
-              '$(SDKROOT)/System/Library/Frameworks/Security.framework',
-            ],
-          }],
-          ['OS=="win"', {
-            'libraries': [
-              '-ladvapi32.lib',
-            ],
-          }],
-        ],
-      },
-      'sources': [
-        'atomicops.h',
-        'atomicops_internals_atomicword_compat.h',
-        'atomicops_internals_portable.h',
-        'auto_reset.h',
-        'base_wrapper.h',
-        'bit_cast.h',
-        'compiler_specific.h',
-        'debug/alias.cc',
-        'debug/alias.h',
-        'files/file_path.cc',
-        'files/file_path.h',
-        'files/file_util.h',
-        'files/file_util_posix.cc',
-        'files/scoped_file.cc',
-        'files/scoped_file.h',
-        'format_macros.h',
-        'logging.cc',
-        'logging.h',
-        'mac/close_nocancel.cc',
-        'mac/foundation_util.h',
-        'mac/foundation_util.mm',
-        'mac/mach_logging.h',
-        'mac/mach_logging.cc',
-        'mac/scoped_cftyperef.h',
-        'mac/scoped_ioobject.h',
-        'mac/scoped_launch_data.h',
-        'mac/scoped_mach_port.cc',
-        'mac/scoped_mach_port.h',
-        'mac/scoped_mach_vm.cc',
-        'mac/scoped_mach_vm.h',
-        'mac/scoped_nsautorelease_pool.h',
-        'mac/scoped_nsautorelease_pool.mm',
-        'mac/scoped_nsobject.h',
-        'mac/scoped_typeref.h',
-        'macros.h',
-        'memory/free_deleter.h',
-        'memory/scoped_policy.h',
-        'metrics/histogram_functions.h',
-        'metrics/histogram_macros.h',
-        'metrics/persistent_histogram_allocator.h',
-        'numerics/checked_math.h',
-        'numerics/checked_math_impl.h',
-        'numerics/clamped_math.h',
-        'numerics/clamped_math_impl.h',
-        'numerics/safe_conversions.h',
-        'numerics/safe_conversions_arm_impl.h',
-        'numerics/safe_conversions_impl.h',
-        'numerics/safe_math.h',
-        'numerics/safe_math_arm_impl.h',
-        'numerics/safe_math_clang_gcc_impl.h',
-        'numerics/safe_math_shared_impl.h',
-        'posix/eintr_wrapper.h',
-        'posix/safe_strerror.cc',
-        'posix/safe_strerror.h',
-        'process/memory.cc',
-        'process/memory.h',
-        'process/process_metrics.h',
-        'process/process_metrics_posix.cc',
-        'process/process_metrics_win.cc',
-        'rand_util.cc',
-        'rand_util.h',
-        'scoped_clear_errno.h',
-        'scoped_generic.h',
-        'stl_util.h',
-        'strings/string16.cc',
-        'strings/string16.h',
-        'strings/string_number_conversions.cc',
-        'strings/string_number_conversions.h',
-        'strings/string_piece.h',
-        'strings/string_util.cc',
-        'strings/string_util.h',
-        'strings/string_util_posix.h',
-        'strings/string_util_win.cc',
-        'strings/string_util_win.h',
-        'strings/stringprintf.cc',
-        'strings/stringprintf.h',
-        'strings/sys_string_conversions.h',
-        'strings/sys_string_conversions_mac.mm',
-        'strings/utf_string_conversion_utils.cc',
-        'strings/utf_string_conversion_utils.h',
-        'strings/utf_string_conversions.cc',
-        'strings/utf_string_conversions.h',
-        'synchronization/condition_variable.h',
-        'synchronization/condition_variable_posix.cc',
-        'synchronization/lock.cc',
-        'synchronization/lock.h',
-        'synchronization/lock_impl.h',
-        'synchronization/lock_impl_posix.cc',
-        'synchronization/lock_impl_win.cc',
-        'sys_byteorder.h',
-        'template_util.h',
-        'third_party/icu/icu_utf.cc',
-        'third_party/icu/icu_utf.h',
-        'threading/thread_local_storage.cc',
-        'threading/thread_local_storage.h',
-        'threading/thread_local_storage_posix.cc',
-        'threading/thread_local_storage_win.cc',
-        '../build/build_config.h',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs!': [
-          '<(DEPTH)',
-        ],
-        'include_dirs': [
-          '..',
-        ],
-        'cflags': [
-          '-isystem../..',
-        ],
-      },
-    },
-  ],
-}
diff --git a/third_party/mini_chromium/build/common.gypi b/third_party/mini_chromium/build/common.gypi
deleted file mode 100644
index e9359e7..0000000
--- a/third_party/mini_chromium/build/common.gypi
+++ /dev/null
@@ -1,416 +0,0 @@
-# Copyright 2009 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'variables': {
-    'variables': {
-      'clang%': 0,
-      'conditions': [
-        ['OS=="mac"', {
-          'clang%': 1,
-        }],
-      ],
-    },
-    'clang%': '<(clang)',
-
-    'android_api_level%': '',
-
-    'mac_sdk%': '',
-    'mac_deployment_target%': '',
-
-    'target_arch%': 'x64',
-  },
-
-  'target_defaults': {
-    'includes': [
-      'filename_rules.gypi',
-    ],
-    'conditions': [
-
-      ['OS=="mac"', {
-        'xcode_settings': {
-          'ALWAYS_SEARCH_USER_PATHS': 'NO',
-          'GCC_C_LANGUAGE_STANDARD': 'c99',  # -std=c99
-          'GCC_CW_ASM_SYNTAX': 'NO',  # No -fasm-blocks
-          'GCC_DYNAMIC_NO_PIC': 'NO',  # No -mdynamic-no-pic
-          'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',  # -fno-exceptions
-          'GCC_ENABLE_CPP_RTTI': 'NO',  # -fno-rtti
-          'GCC_ENABLE_PASCAL_STRINGS': 'NO',  # No -mpascal-strings
-
-          # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden
-          'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',
-
-          'GCC_OBJC_CALL_CXX_CDTORS': 'YES',  # -fobjc-call-cxx-cdtors
-          'GCC_PRECOMPILE_PREFIX_HEADER': 'NO',
-          'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES',  # -fvisibility=hidden
-          'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES',  # -Werror
-          'GCC_WARN_ABOUT_MISSING_NEWLINE': 'YES',  # -Wnewline-eof
-          'OTHER_CFLAGS': [
-            '-fno-strict-aliasing',  # See http://crbug.com/32204
-            '-fstack-protector-all',  # Implies -fstack-protector
-          ],
-          'USE_HEADERMAP': 'NO',
-          'WARNING_CFLAGS': [
-            '-Wall',
-            '-Wendif-labels',
-            '-Wextra',
-
-            # Don't warn about unused function parameters.
-            '-Wno-unused-parameter',
-
-            # Don't warn about the "struct foo f = {0};" initialization
-            # pattern.
-            '-Wno-missing-field-initializers',
-          ],
-
-          'conditions': [
-            ['clang!=0', {
-              'CLANG_CXX_LANGUAGE_STANDARD': 'c++14',  # -std=c++14
-
-              # Don't link in libarclite_macosx.a, see http://crbug.com/156530.
-              'CLANG_LINK_OBJC_RUNTIME': 'NO',  # No -fobjc-link-runtime
-
-              # CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS maps to
-              # -Wobjc-missing-property-synthesis
-              'CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS': 'YES',
-
-              'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0',
-              'WARNING_CFLAGS': [
-                '-Wexit-time-destructors',
-                '-Wextra-semi',
-                '-Wheader-hygiene',
-                '-Wimplicit-fallthrough',
-                '-Wno-selector-type-mismatch',
-                '-Wsign-compare',
-                '-Wstring-conversion',
-              ],
-            }, {  # else: clang==0
-              'GCC_VERSION': '4.2',
-            }],
-
-            ['mac_sdk!=""', {
-              'SDKROOT': 'macosx<(mac_sdk)',  # -isysroot
-            }],
-
-            ['mac_deployment_target!=""', {
-              # MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min
-              'MACOSX_DEPLOYMENT_TARGET': '<(mac_deployment_target)',
-            }],
-
-            ['target_arch=="ia32"', {
-              'ARCHS': [
-                'i386',
-              ],
-            }],
-            ['target_arch=="x64"', {
-              'ARCHS': [
-                'x86_64',
-              ],
-            }],
-          ],
-
-          'target_conditions': [
-            ['_type=="executable"', {
-              'OTHER_LDFLAGS': [
-                '-Wl,-pie',  # Position-independent executable (MH_PIE)
-              ],
-            }],
-          ],
-
-        },
-      }],
-
-      ['OS=="linux" or OS=="android"', {
-        'cflags': [
-          '-fPIC',
-          '-fno-exceptions',
-          '-fno-strict-aliasing',  # See http://crbug.com/32204
-          '-fstack-protector-all',  # Implies -fstack-protector
-          '-fvisibility=hidden',
-          '-g',
-          '-pipe',
-          '-pthread',
-          '-Wall',
-          '-Werror',
-          '-Wextra',
-          '-Wno-unused-parameter',
-          '-Wno-missing-field-initializers',
-        ],
-        'cflags_cc': [
-          '-fno-rtti',
-          '-fvisibility-inlines-hidden',
-          '-std=c++14',
-        ],
-        'defines': [
-          '_FILE_OFFSET_BITS=64',
-        ],
-        'ldflags': [
-          '-fPIC',
-          '-pthread',
-          '-Wl,--as-needed',
-          '-Wl,-z,noexecstack',
-        ],
-
-        'conditions': [
-          ['clang!=0', {
-            'cflags': [
-              '-Wexit-time-destructors',
-              '-Wextra-semi',
-              '-Wheader-hygiene',
-              '-Wimplicit-fallthrough',
-              '-Wsign-compare',
-              '-Wstring-conversion',
-            ],
-          }, {  # else: clang==0
-            'conditions': [
-              ['target_arch=="ia32"', {
-                'cflags': [
-                  '-msse2',
-                  '-mfpmath=sse',
-                ],
-              }],
-            ],
-          }],
-
-          ['OS=="linux"', {
-            'conditions': [
-              ['target_arch=="ia32"', {
-                'cflags': [
-                  '-m32',
-                ],
-                'ldflags': [
-                  '-m32',
-                ],
-              }],
-              ['target_arch=="x64"', {
-                'cflags': [
-                  '-m64',
-                ],
-                'ldflags': [
-                  '-m64',
-                ],
-              }],
-            ],
-          }],
-
-          ['OS=="android"', {
-            'conditions': [
-              ['android_api_level!=""', {
-                'defines': [
-                  # With deprecated headers, this was available by #including
-                  # <android/api-level.h>, but with unified headers, the desired
-                  # value must be pushed into the build from the outside when
-                  # building with GCC. See
-                  # https://android.googlesource.com/platform/ndk/+/master/docs/UnifiedHeaders.md.
-                  # It’s harmless to define this when building with Clang.
-                  '__ANDROID_API__=<(android_api_level)',
-                ],
-              }],
-            ],
-          }],
-        ],
-
-        'target_conditions': [
-          ['_type=="executable"', {
-            'ldflags': [
-              '-pie',
-            ],
-          }],
-        ],
-      }],
-
-      ['OS=="win"', {
-        'msvs_configuration_attributes': {
-          'CharacterSet': '1',
-        },
-        'msvs_settings': {
-          'VCCLCompilerTool': {
-            'WarningLevel': '4',
-            'WarnAsError': 'true',
-            'DebugInformationFormat': '3',
-            'ExceptionHandling': '0',
-            'RuntimeTypeInfo': 'false',
-            'BufferSecurityCheck': 'true',
-            'EnableFunctionLevelLinking': 'true',
-            'AdditionalOptions': [
-              '/bigobj',  # Maximum 2^32 sections in .obj files (default 2^16).
-            ],
-          },
-          'VCLinkerTool': {
-            'GenerateDebugInformation': 'true',
-            'RandomizedBaseAddress': '2',  # /DYNAMICBASE.
-            'SubSystem': '1',
-          },
-        },
-        'msvs_disabled_warnings': [
-          4100,  # Unreferenced formal parameter.
-          4127,  # Conditional expression is constant.
-          4324,  # Structure was padded due to alignment specifier.
-          4351,  # New behavior: elements of array will be default initialized.
-          4577,  # 'noexcept' used with no exception handling mode specified.
-          4996,  # 'X' was declared deprecated.
-        ],
-        'defines': [
-          '_HAS_EXCEPTIONS=0',
-          '_CRT_SECURE_NO_WARNINGS',
-          'NOMINMAX',
-          'WIN32_LEAN_AND_MEAN',
-        ],
-      }],
-
-    ],
-    'default_configuration': 'Debug',
-    'configurations': {
-      'Release': {
-        'defines': [
-          'NDEBUG',
-        ],
-        'conditions': [
-
-          ['OS=="mac"', {
-            'xcode_settings': {
-              'DEAD_CODE_STRIPPING': 'YES',  # -Wl,-dead_strip
-              'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym',
-              'GCC_OPTIMIZATION_LEVEL': '3',
-
-              'target_conditions': [
-                ['_type=="executable" or _type=="shared_library" or \
-                  _type=="loadable_module"', {
-                  'DEPLOYMENT_POSTPROCESSING': 'YES',
-                  'STRIP_INSTALLED_PRODUCT': 'YES',
-                }],
-                ['_type=="shared_library" or _type=="loadable_module"', {
-                  'STRIPFLAGS': '-x',
-                }],
-              ],
-
-            },
-          }],
-
-          ['OS=="linux" or OS=="android"', {
-            'cflags': [
-              '-O3',
-              '-fdata-sections',
-              '-ffunction-sections',
-            ],
-            'ldflags': [
-              '-Wl,-O1',
-              '-Wl,--gc-sections',
-            ],
-
-            'conditions': [
-              ['clang==0', {
-                'cflags': [
-                  '-fno-ident',
-                ],
-              }],
-            ],
-
-          }],
-
-          ['OS=="win"', {
-            'msvs_configuration_platform': 'Win32',
-            'msvs_settings': {
-              'VCCLCompilerTool': {
-                'RuntimeLibrary': '0',  # /MT.
-                'Optimization': '3',
-                'AdditionalOptions': [
-                  '/Zo',  # Improve debugging optimized builds.
-                ],
-              },
-              'VCLibrarianTool': {
-                'TargetMachine': '1',  # x86.
-              },
-              'VCLinkerTool': {
-                'MinimumRequiredVersion': '5.01',  # XP.
-                'TargetMachine': '1',  # x86.
-              },
-            },
-          }],
-
-        ],
-      },
-      'Debug': {
-        'conditions': [
-
-          ['OS=="mac"', {
-            'xcode_settings': {
-              'COPY_PHASE_STRIP': 'NO',
-              'DEBUG_INFORMATION_FORMAT': 'dwarf',
-              'GCC_OPTIMIZATION_LEVEL': '0',
-            },
-          }],
-
-          ['OS=="linux" or OS=="android"', {
-            'cflags': [
-              '-O0',
-            ],
-          }],
-
-          ['OS=="win"', {
-            'msvs_configuration_platform': 'Win32',
-            'msvs_settings': {
-              'VCCLCompilerTool': {
-                'RuntimeLibrary': '1',  # /MTd.
-                'Optimization': '0',
-              },
-              'VCLibrarianTool': {
-                'TargetMachine': '1',  # x86.
-              },
-              'VCLinkerTool': {
-                'MinimumRequiredVersion': '5.01',  # XP.
-                'TargetMachine': '1',  # x86.
-              },
-            },
-            'defines': [
-              '_DEBUG',
-              '_ITERATOR_DEBUG_LEVEL=2',
-            ],
-          }],
-
-        ],
-      },
-
-      'conditions': [
-        ['OS=="win"', {
-          # gyp-ninja seems to require these, but we don't use them.
-          'Debug_x64': {
-            'inherit_from': ['Debug'],
-            'msvs_configuration_platform': 'x64',
-            'msvs_settings': {
-              'VCLibrarianTool': {
-                'TargetMachine': '17',  # x64.
-              },
-              'VCLinkerTool': {
-                'MinimumRequiredVersion': '5.02',  # Server 2003.
-                'TargetMachine': '17',  # x64.
-              },
-            },
-          },
-          'Release_x64': {
-            'inherit_from': ['Release'],
-            'msvs_configuration_platform': 'x64',
-            'msvs_settings': {
-              'VCLibrarianTool': {
-                'TargetMachine': '17',  # x64.
-              },
-              'VCLinkerTool': {
-                'MinimumRequiredVersion': '5.02',  # Server 2003.
-                'TargetMachine': '17',  # x64.
-              },
-            },
-          }
-        }],
-      ],
-    },
-  },
-
-  'conditions': [
-    ['OS=="mac"', {
-      'xcode_settings': {
-        'SYMROOT': '<(DEPTH)/xcodebuild',
-      },
-    }],
-  ],
-}
diff --git a/third_party/mini_chromium/build/filename_rules.gypi b/third_party/mini_chromium/build/filename_rules.gypi
deleted file mode 100644
index 5c71148..0000000
--- a/third_party/mini_chromium/build/filename_rules.gypi
+++ /dev/null
@@ -1,37 +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.
-
-{
-  'target_conditions': [
-    ['"<(target_os)"!="mac"', {
-      'sources/': [
-        ['exclude', '_(cocoa|mac)(_test)?\\.(h|cc|mm?)$'],
-        ['exclude', '(^|/)(cocoa|mac|mach)/'],
-      ],
-    }],
-    ['"<(target_os)"!="linux"', {
-      'sources/': [
-        ['exclude', '_linux(_test)?\\.(h|cc)$'],
-        ['exclude', '(^|/)linux/'],
-      ],
-    }],
-    ['"<(target_os)"!="android"', {
-      'sources/': [
-        ['exclude', '_android(_test)?\\.(h|cc)$'],
-        ['exclude', '(^|/)android/'],
-      ],
-    }],
-    ['"<(target_os)"=="win"', {
-      'sources/': [
-        ['exclude', '_posix(_test)?\\.(h|cc)$'],
-        ['exclude', '(^|/)posix/'],
-      ],
-    }, {
-      'sources/': [
-        ['exclude', '_win(_test)?\\.(h|cc)$'],
-        ['exclude', '(^|/)win/'],
-      ],
-    }],
-  ],
-}
diff --git a/third_party/mini_chromium/mini_chromium.gyp b/third_party/mini_chromium/mini_chromium.gyp
deleted file mode 100644
index 82f1b59..0000000
--- a/third_party/mini_chromium/mini_chromium.gyp
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 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.
-
-{
-  'includes': [
-    'build/common.gypi',
-  ],
-
-  'targets': [
-    {
-      'target_name': 'All',
-      'type': 'none',
-      'suppress_wildcard': 1,
-      'dependencies': [
-        'base/base.gyp:*',
-      ],
-    },
-  ],
-}
diff --git a/third_party/modp_b64/modp_b64.gyp b/third_party/modp_b64/modp_b64.gyp
deleted file mode 100644
index baed111..0000000
--- a/third_party/modp_b64/modp_b64.gyp
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (c) 2009 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'targets': [
-    {
-      'target_name': 'modp_b64',
-      'type': 'static_library',
-      'toolsets': ['host', 'target'],
-      'sources': [
-        'modp_b64.cc',
-        'modp_b64.h',
-        'modp_b64_data.h',
-      ],
-      'include_dirs': [
-        '../..',
-      ],
-    },
-  ],
-}
diff --git a/third_party/musl/musl.gyp b/third_party/musl/musl.gyp
deleted file mode 100644
index 981aa91..0000000
--- a/third_party/musl/musl.gyp
+++ /dev/null
@@ -1,549 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'conditions': [
-    ['target_arch == "x64"', {
-       'variables': {
-          'musl_arch': 'x86_64'
-        }
-    }],
-    ['target_arch == "x86"', {
-      'variables': {
-         'musl_arch': 'i386'
-       }
-    }],
-    ['target_arch == "arm"', {
-      'variables': {
-         'musl_arch': 'arm'
-       }
-    }],
-    ['target_arch == "arm64"', {
-      'variables': {
-         'musl_arch': 'aarch64'
-       }
-    }],
-    ['target_arch == "mips"', {
-      'variables': {
-         'musl_arch': 'mips'
-       }
-    }],
-    # Not yet supported:
-    # target_arch == win
-  ],
-  'targets': [
-    {
-      'target_name': 'c',
-      'type': 'static_library',
-      'include_dirs': [
-        'src/internal',
-        'arch/<(musl_arch)/',
-      ],
-      'cflags': [
-        # no-unknown-pragmas  -w shift-op-parentheses
-        '-nobuiltininc',
-        '-isystem<(DEPTH)/third_party/musl/include',
-        '-isystem<(DEPTH)/third_party/musl/arch/<(musl_arch)',
-        '-isystem<(DEPTH)/third_party/musl/arch/generic',
-        '-w',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          'musl/include',
-          'arch/<(musl_arch)/',
-          'arch/generic/',
-       ],
-      },
-      'defines' : [
-        # Enables temporary situation where main cobalt is built with
-        # glibc headers but then linked with some musl components.
-        # Expected to go away when main cobalt is also build with
-        # stand-alone libc++.
-        'COBALT_MUSL_W_GLIBC_HEADERS'
-      ],
-      'conditions': [
-        ['musl_arch in ["i386", "x86_64", "aarch64"]', {
-          'sources': [
-            'src/fenv/<(musl_arch)/fenv.s',
-            'src/setjmp/<(musl_arch)/setjmp.s',
-            'src/setjmp/<(musl_arch)/longjmp.s',
-          ],
-        }],
-        ['musl_arch == "arm"', {
-          'sources': [
-            'src/fenv/arm/fenv.c',
-            'src/fenv/arm/fenv-hf.S',
-            'src/setjmp/<(musl_arch)/setjmp.s',
-            'src/setjmp/<(musl_arch)/longjmp.s',
-          ],
-        }],
-        ['musl_arch == "mips"', {
-          'sources': [
-            'src/fenv/mips/fenv.S,',
-            'src/fenv/mips/fenv-sf.c',
-            'src/setjmp/<(musl_arch)/setjmp.S',
-            'src/setjmp/<(musl_arch)/longjmp.S',
-          ],
-        }],
-        ['musl_arch in ["i386", "x86_64"]', {
-          'sources': [
-            'src/string/<(musl_arch)/memcpy.s',
-            'src/string/<(musl_arch)/memmove.s',
-            'src/string/<(musl_arch)/memset.s',
-          ],
-          'sources!': [
-            'src/string/memcpy.c',
-            'src/string/memmove.c',
-            'src/string/memset.c',
-          ],
-        }],
-        # Starboardized implementations are only included for Evergreen
-        # to avoid having multiple versions of libc in a binary. Some
-        # non-Starboardized implementations, such as 'src/stdio/sscanf.c', are
-        # also only included for Evergreen because they are essentially wrappers
-        # around functions that have been Starboardized.
-        ['sb_evergreen == 1', {
-          # The directories here are prepended to the existing list of
-          # directories to include. This is important to note since the order in the
-          # list determines how files are resolved.
-          'include_dirs+': [
-            'src/starboard/internal',
-            'src/errno',
-            'src/multibyte',
-            'src/time',
-          ],
-          'sources': [
-            'src/starboard/ctype/__ctype_get_mb_cur_max.c',
-            'src/starboard/errno/__errno_location.c',
-            'src/starboard/exit/abort.c',
-            'src/starboard/hwcap/sethwcap.c',
-            'src/starboard/locale/freelocale.c',
-            'src/starboard/locale/langinfo.c',
-            'src/starboard/locale/localeconv.c',
-            'src/starboard/locale/newlocale.c',
-            'src/starboard/locale/setlocale.c',
-            'src/starboard/locale/uselocale.c',
-            'src/starboard/malloc/malloc.c',
-            'src/starboard/malloc/memalign.c',
-            'src/starboard/malloc/posix_memalign.c',
-            'src/starboard/stdio/fflush.c',
-            'src/starboard/stdio/fputc.c',
-            'src/starboard/stdio/stderr.c',
-            'src/starboard/stdio/stdout.c',
-            'src/starboard/stdio/vfprintf.c',
-            'src/starboard/stdio/vsnprintf.c',
-            'src/starboard/stdio/vsscanf.c',
-            'src/starboard/stdio/vswprintf.c',
-            'src/starboard/stdlib/strtod_l.c',
-            'src/starboard/time/__tz.c',
-            'src/starboard/time/clock_gettime.c',
-
-            'src/ctype/iswspace.c',
-            'src/errno/strerror.c',
-            'src/exit/assert.c',
-            'src/exit/atexit.c',
-            'src/exit/exit.c',
-            'src/internal/floatscan.c',
-            'src/internal/intscan.c',
-            'src/internal/shgetc.c',
-            'src/locale/strcoll.c',
-            'src/locale/strcoll.c',
-            'src/locale/strxfrm.c',
-            'src/locale/strxfrm.c',
-            'src/locale/wcscoll.c',
-            'src/locale/wcscoll.c',
-            'src/locale/wcsxfrm.c',
-            'src/locale/wcsxfrm.c',
-            'src/math/copysignl.c',
-            'src/math/scalbnl.c',
-            'src/multibyte/btowc.c',
-            'src/multibyte/internal.c',
-            'src/multibyte/mbrlen.c',
-            'src/multibyte/mbrtowc.c',
-            'src/multibyte/mbsnrtowcs.c',
-            'src/multibyte/mbsrtowcs.c',
-            'src/multibyte/mbtowc.c',
-            'src/multibyte/wcrtomb.c',
-            'src/multibyte/wcsnrtombs.c',
-            'src/multibyte/wcsrtombs.c',
-            'src/multibyte/wcstombs.c',
-            'src/multibyte/wctob.c',
-            'src/prng/rand.c',
-            'src/stdio/__toread.c',
-            'src/stdio/__uflow.c',
-            'src/stdio/fprintf.c',
-            'src/stdio/fwrite.c',
-            'src/stdio/printf.c',
-            'src/stdio/snprintf.c',
-            'src/stdio/sscanf.c',
-            'src/stdio/swprintf.c',
-            'src/stdio/vasprintf.c',
-            'src/stdio/vprintf.c',
-            'src/stdio/vsprintf.c',
-            'src/stdlib/abs.c',
-            'src/stdlib/atof.c',
-            'src/stdlib/atoi.c',
-            'src/stdlib/atol.c',
-            'src/stdlib/bsearch.c',
-            'src/stdlib/div.c',
-            'src/stdlib/labs.c',
-            'src/stdlib/llabs.c',
-            'src/stdlib/strtod.c',
-            'src/stdlib/strtol.c',
-            'src/stdlib/qsort.c',
-            'src/stdlib/wcstod.c',
-            'src/stdlib/wcstol.c',
-            'src/string/strerror_r.c',
-            'src/time/__month_to_secs.c',
-            'src/time/__tm_to_secs.c',
-            'src/time/__year_to_secs.c',
-            'src/time/strftime.c',
-          ],
-        }],
-      ],
-      'sources': [
-        'src/ctype/__ctype_b_loc.c',
-        # Excluded because locale_impl needs mutexs
-        # 'src/ctype/__ctype_get_mb_cur_max.c',
-        'src/ctype/__ctype_tolower_loc.c',
-        'src/ctype/__ctype_toupper_loc.c',
-        'src/ctype/isalnum.c',
-        'src/ctype/isalpha.c',
-        'src/ctype/isascii.c',
-        'src/ctype/isblank.c',
-        'src/ctype/iscntrl.c',
-        'src/ctype/isdigit.c',
-        'src/ctype/isgraph.c',
-        'src/ctype/islower.c',
-        'src/ctype/isprint.c',
-        'src/ctype/ispunct.c',
-        'src/ctype/isspace.c',
-        'src/ctype/isupper.c',
-        'src/ctype/iswalnum.c',
-        'src/ctype/iswalpha.c',
-        'src/ctype/iswblank.c',
-        'src/ctype/iswcntrl.c',
-        'src/ctype/iswctype.c',
-        'src/ctype/iswdigit.c',
-        'src/ctype/iswgraph.c',
-        'src/ctype/iswlower.c',
-        'src/ctype/iswprint.c',
-        'src/ctype/iswpunct.c',
-        'src/ctype/iswspace.c',
-        'src/ctype/iswupper.c',
-        'src/ctype/iswxdigit.c',
-        'src/ctype/isxdigit.c',
-        'src/ctype/tolower.c',
-        'src/ctype/toupper.c',
-        'src/ctype/towctrans.c',
-        'src/ctype/wcswidth.c',
-        'src/ctype/wctrans.c',
-        'src/ctype/wcwidth.c',
-        'src/fenv/fegetexceptflag.c',
-        'src/fenv/feholdexcept.c',
-        'src/fenv/fesetexceptflag.c',
-        'src/fenv/fesetround.c',
-        'src/fenv/feupdateenv.c',
-        'src/fenv/__flt_rounds.c',
-        'src/math/acos.c',
-        'src/math/acosf.c',
-        'src/math/acosh.c',
-        'src/math/acoshf.c',
-        'src/math/acoshl.c',
-        'src/math/acosl.c',
-        'src/math/asin.c',
-        'src/math/asinf.c',
-        'src/math/asinh.c',
-        'src/math/asinhf.c',
-        'src/math/asinhl.c',
-        'src/math/asinl.c',
-        'src/math/atan2.c',
-        'src/math/atan2f.c',
-        'src/math/atan2l.c',
-        'src/math/atan.c',
-        'src/math/atanf.c',
-        'src/math/atanh.c',
-        'src/math/atanhf.c',
-        'src/math/atanhl.c',
-        'src/math/atanl.c',
-        'src/math/cbrt.c',
-        'src/math/cbrtf.c',
-        'src/math/cbrtl.c',
-        'src/math/ceil.c',
-        'src/math/ceilf.c',
-        'src/math/ceill.c',
-        'src/math/copysign.c',
-        'src/math/copysignf.c',
-        'src/math/copysignl.c',
-        'src/math/__cos.c',
-        'src/math/cos.c',
-        'src/math/__cosdf.c',
-        'src/math/cosf.c',
-        'src/math/cosh.c',
-        'src/math/coshf.c',
-        'src/math/coshl.c',
-        'src/math/__cosl.c',
-        'src/math/cosl.c',
-        'src/math/erf.c',
-        'src/math/erff.c',
-        'src/math/erfl.c',
-        'src/math/exp10.c',
-        'src/math/exp10f.c',
-        'src/math/exp10l.c',
-        'src/math/exp2.c',
-        'src/math/exp2f.c',
-        'src/math/exp2l.c',
-        'src/math/exp.c',
-        'src/math/expf.c',
-        'src/math/expl.c',
-        'src/math/expm1.c',
-        'src/math/expm1f.c',
-        'src/math/expm1l.c',
-        'src/math/__expo2.c',
-        'src/math/__expo2f.c',
-        'src/math/fabs.c',
-        'src/math/fabsf.c',
-        'src/math/fabsl.c',
-        'src/math/fdim.c',
-        'src/math/fdimf.c',
-        'src/math/fdiml.c',
-        'src/math/finite.c',
-        'src/math/finitef.c',
-        'src/math/floor.c',
-        'src/math/floorf.c',
-        'src/math/floorl.c',
-        'src/math/fma.c',
-        'src/math/fmaf.c',
-        'src/math/fmal.c',
-        'src/math/fmax.c',
-        'src/math/fmaxf.c',
-        'src/math/fmaxl.c',
-        'src/math/fmin.c',
-        'src/math/fminf.c',
-        'src/math/fminl.c',
-        'src/math/fmod.c',
-        'src/math/fmodf.c',
-        'src/math/fmodl.c',
-        'src/math/__fpclassify.c',
-        'src/math/__fpclassifyf.c',
-        'src/math/__fpclassifyl.c',
-        'src/math/frexp.c',
-        'src/math/frexpf.c',
-        'src/math/frexpl.c',
-        'src/math/hypot.c',
-        'src/math/hypotf.c',
-        'src/math/hypotl.c',
-        'src/math/ilogb.c',
-        'src/math/ilogbf.c',
-        'src/math/ilogbl.c',
-        'src/math/__invtrigl.c',
-        'src/math/j0.c',
-        'src/math/j0f.c',
-        'src/math/j1.c',
-        'src/math/j1f.c',
-        'src/math/jn.c',
-        'src/math/jnf.c',
-        'src/math/ldexp.c',
-        'src/math/ldexpf.c',
-        'src/math/ldexpl.c',
-        'src/math/lgamma.c',
-        'src/math/lgammaf.c',
-        'src/math/lgammaf_r.c',
-        'src/math/lgammal.c',
-        'src/math/lgamma_r.c',
-        'src/math/llrint.c',
-        'src/math/llrintf.c',
-        'src/math/llrintl.c',
-        'src/math/llround.c',
-        'src/math/llroundf.c',
-        'src/math/llroundl.c',
-        'src/math/log10.c',
-        'src/math/log10f.c',
-        'src/math/log10l.c',
-        'src/math/log1p.c',
-        'src/math/log1pf.c',
-        'src/math/log1pl.c',
-        'src/math/log2.c',
-        'src/math/log2f.c',
-        'src/math/log2l.c',
-        'src/math/logb.c',
-        'src/math/logbf.c',
-        'src/math/logbl.c',
-        'src/math/log.c',
-        'src/math/logf.c',
-        'src/math/logl.c',
-        'src/math/lrint.c',
-        'src/math/lrintf.c',
-        'src/math/lrintl.c',
-        'src/math/lround.c',
-        'src/math/lroundf.c',
-        'src/math/lroundl.c',
-        'src/math/modf.c',
-        'src/math/modff.c',
-        'src/math/modfl.c',
-        'src/math/nan.c',
-        'src/math/nanf.c',
-        'src/math/nanl.c',
-        'src/math/nearbyint.c',
-        'src/math/nearbyintf.c',
-        'src/math/nearbyintl.c',
-        'src/math/nextafter.c',
-        'src/math/nextafterf.c',
-        'src/math/nextafterl.c',
-        'src/math/nexttoward.c',
-        'src/math/nexttowardf.c',
-        'src/math/nexttowardl.c',
-        'src/math/__polevll.c',
-        'src/math/pow.c',
-        'src/math/powf.c',
-        'src/math/powl.c',
-        'src/math/remainder.c',
-        'src/math/remainderf.c',
-        'src/math/remainderl.c',
-        'src/math/__rem_pio2.c',
-        'src/math/__rem_pio2f.c',
-        'src/math/__rem_pio2_large.c',
-        'src/math/__rem_pio2l.c',
-        'src/math/remquo.c',
-        'src/math/remquof.c',
-        'src/math/remquol.c',
-        'src/math/rint.c',
-        'src/math/rintf.c',
-        'src/math/rintl.c',
-        'src/math/round.c',
-        'src/math/roundf.c',
-        'src/math/roundl.c',
-        'src/math/scalb.c',
-        'src/math/scalbf.c',
-        'src/math/scalbln.c',
-        'src/math/scalblnf.c',
-        'src/math/scalblnl.c',
-        'src/math/scalbn.c',
-        'src/math/scalbnf.c',
-        'src/math/scalbnl.c',
-        'src/math/__signbit.c',
-        'src/math/__signbitf.c',
-        'src/math/__signbitl.c',
-        'src/math/signgam.c',
-        'src/math/significand.c',
-        'src/math/significandf.c',
-        'src/math/__sin.c',
-        'src/math/sin.c',
-        'src/math/sincos.c',
-        'src/math/sincosf.c',
-        'src/math/sincosl.c',
-        'src/math/__sindf.c',
-        'src/math/sinf.c',
-        'src/math/sinh.c',
-        'src/math/sinhf.c',
-        'src/math/sinhl.c',
-        'src/math/__sinl.c',
-        'src/math/sinl.c',
-        'src/math/sqrt.c',
-        'src/math/sqrtf.c',
-        'src/math/sqrtl.c',
-        'src/math/__tan.c',
-        'src/math/tan.c',
-        'src/math/__tandf.c',
-        'src/math/tanf.c',
-        'src/math/tanh.c',
-        'src/math/tanhf.c',
-        'src/math/tanhl.c',
-        'src/math/__tanl.c',
-        'src/math/tanl.c',
-        'src/math/tgamma.c',
-        'src/math/tgammaf.c',
-        'src/math/tgammal.c',
-        'src/math/trunc.c',
-        'src/math/truncf.c',
-        'src/math/truncl.c',
-        'src/string/bcmp.c',
-        'src/string/bcopy.c',
-        'src/string/bzero.c',
-        'src/string/bzero.c',
-        'src/string/explicit_bzero.c',
-        'src/string/index.c',
-        'src/string/memccpy.c',
-        'src/string/memchr.c',
-        'src/string/memcmp.c',
-        'src/string/memcpy.c',
-        'src/string/memmem.c',
-        'src/string/memmove.c',
-        'src/string/mempcpy.c',
-        'src/string/memrchr.c',
-        'src/string/memset.c',
-        'src/string/rindex.c',
-        'src/string/stpcpy.c',
-        'src/string/stpncpy.c',
-        'src/string/strcat.c',
-        'src/string/strchr.c',
-        'src/string/strchrnul.c',
-        'src/string/strcmp.c',
-        'src/string/strcpy.c',
-        'src/string/strcspn.c',
-        'src/string/strlcat.c',
-        'src/string/strlcpy.c',
-        'src/string/strlen.c',
-        'src/string/strncat.c',
-        'src/string/strncmp.c',
-        'src/string/strncpy.c',
-        'src/string/strnlen.c',
-        'src/string/strpbrk.c',
-        'src/string/strrchr.c',
-        'src/string/strsep.c',
-        'src/string/strspn.c',
-        'src/string/strstr.c',
-        'src/string/strtok.c',
-        'src/string/strtok_r.c',
-        'src/string/strverscmp.c',
-        'src/string/swab.c',
-        'src/string/wcpcpy.c',
-        'src/string/wcpncpy.c',
-        'src/string/wcscat.c',
-        'src/string/wcschr.c',
-        'src/string/wcscmp.c',
-        'src/string/wcscpy.c',
-        'src/string/wcscspn.c',
-        'src/string/wcslen.c',
-        'src/string/wcsncat.c',
-        'src/string/wcsncmp.c',
-        'src/string/wcsncpy.c',
-        'src/string/wcsnlen.c',
-        'src/string/wcspbrk.c',
-        'src/string/wcsrchr.c',
-        'src/string/wcsspn.c',
-        'src/string/wcsstr.c',
-        'src/string/wcstok.c',
-        'src/string/wcswcs.c',
-        'src/string/wmemchr.c',
-        'src/string/wmemcmp.c',
-        'src/string/wmemcpy.c',
-        'src/string/wmemmove.c',
-        'src/string/wmemset.c',
-      ]
-    },
-    {
-      'target_name': 'musl_unittests',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'test/type_size_test.cc',
-      ],
-      'dependencies': [
-        'c',
-        '<(DEPTH)/starboard/starboard_headers_only.gyp:starboard_headers_only',
-      ],
-    }
-  ]
-}
-
diff --git a/third_party/musl/src/exit/atexit.c b/third_party/musl/src/exit/atexit.c
index 6ba47a6..cd61ee1 100644
--- a/third_party/musl/src/exit/atexit.c
+++ b/third_party/musl/src/exit/atexit.c
@@ -5,7 +5,6 @@
 #ifdef STARBOARD
 #include "starboard/common/log.h"
 #include "starboard/mutex.h"
-#include "starboard/thread_types.h"
 #include "starboard/types.h"
 #endif  // STARBOARD
 
diff --git a/third_party/musl/src/starboard/errno/__errno_location.c b/third_party/musl/src/starboard/errno/__errno_location.c
index 1770ccf..befa7bd 100644
--- a/third_party/musl/src/starboard/errno/__errno_location.c
+++ b/third_party/musl/src/starboard/errno/__errno_location.c
@@ -4,7 +4,6 @@
 #include "starboard/memory.h"
 #include "starboard/once.h"
 #include "starboard/thread.h"
-#include "starboard/thread_types.h"
 
 static SbThreadLocalKey g_errno_key = kSbThreadLocalKeyInvalid;
 static SbOnceControl g_errno_once = SB_ONCE_INITIALIZER;
diff --git a/third_party/opus/opus.gyp b/third_party/opus/opus.gyp
deleted file mode 100644
index 52da8d2..0000000
--- a/third_party/opus/opus.gyp
+++ /dev/null
@@ -1,275 +0,0 @@
-# Copyright 2018 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'sb_disable_opus_sse%': 0,
-  },
-  'targets': [
-    {
-      'target_name': 'opus',
-      'type': 'static_library',
-      'include_dirs': [
-        '.',
-        'celt',
-        'include',
-        'silk',
-        'silk/float',
-        'starboard',
-      ],
-      'sources': [
-        'celt/_kiss_fft_guts.h',
-        'celt/arch.h',
-        'celt/bands.c',
-        'celt/bands.h',
-        'celt/celt.c',
-        'celt/celt.h',
-        'celt/celt_decoder.c',
-        'celt/celt_encoder.c',
-        'celt/celt_lpc.c',
-        'celt/celt_lpc.h',
-        'celt/cwrs.c',
-        'celt/cwrs.h',
-        'celt/ecintrin.h',
-        'celt/entcode.c',
-        'celt/entcode.h',
-        'celt/entdec.c',
-        'celt/entdec.h',
-        'celt/entenc.c',
-        'celt/entenc.h',
-        'celt/fixed_c5x.h',
-        'celt/fixed_c6x.h',
-        'celt/fixed_debug.h',
-        'celt/fixed_generic.h',
-        'celt/float_cast.h',
-        'celt/kiss_fft.c',
-        'celt/kiss_fft.h',
-        'celt/laplace.c',
-        'celt/laplace.h',
-        'celt/mathops.c',
-        'celt/mathops.h',
-        'celt/mdct.c',
-        'celt/mdct.h',
-        'celt/mfrngcod.h',
-        'celt/modes.c',
-        'celt/modes.h',
-        'celt/os_support.h',
-        'celt/pitch.c',
-        'celt/pitch.h',
-        'celt/quant_bands.c',
-        'celt/quant_bands.h',
-        'celt/rate.c',
-        'celt/rate.h',
-        'celt/stack_alloc.h',
-        'celt/static_modes_fixed.h',
-        'celt/static_modes_float.h',
-        'celt/vq.c',
-        'celt/vq.h',
-
-        'include/opus.h',
-        'include/opus_defines.h',
-        'include/opus_types.h',
-        'include/opus_multistream.h',
-
-        'src/analysis.h',
-        'src/mlp.h',
-        'src/opus_private.h',
-        'src/tansig_table.h',
-
-        'silk/A2NLSF.c',
-        'silk/ana_filt_bank_1.c',
-        'silk/API.h',
-        'silk/biquad_alt.c',
-        'silk/bwexpander.c',
-        'silk/bwexpander_32.c',
-        'silk/check_control_input.c',
-        'silk/CNG.c',
-        'silk/code_signs.c',
-        'silk/control.h',
-        'silk/control_audio_bandwidth.c',
-        'silk/control_codec.c',
-        'silk/control_SNR.c',
-        'silk/debug.c',
-        'silk/debug.h',
-        'silk/decoder_set_fs.c',
-        'silk/decode_core.c',
-        'silk/decode_frame.c',
-        'silk/decode_indices.c',
-        'silk/decode_parameters.c',
-        'silk/decode_pitch.c',
-        'silk/decode_pulses.c',
-        'silk/dec_API.c',
-        'silk/define.h',
-        'silk/encode_indices.c',
-        'silk/encode_pulses.c',
-        'silk/enc_API.c',
-        'silk/errors.h',
-        'silk/gain_quant.c',
-        'silk/HP_variable_cutoff.c',
-        'silk/init_decoder.c',
-        'silk/init_encoder.c',
-        'silk/Inlines.h',
-        'silk/inner_prod_aligned.c',
-        'silk/interpolate.c',
-        'silk/lin2log.c',
-        'silk/log2lin.c',
-        'silk/LPC_analysis_filter.c',
-        'silk/LPC_fit.c',
-        'silk/LPC_inv_pred_gain.c',
-        'silk/LP_variable_cutoff.c',
-        'silk/macros.h',
-        'silk/MacroCount.h',
-        'silk/MacroDebug.h',
-        'silk/main.h',
-        'silk/NLSF2A.c',
-        'silk/NLSF_decode.c',
-        'silk/NLSF_del_dec_quant.c',
-        'silk/NLSF_encode.c',
-        'silk/NLSF_stabilize.c',
-        'silk/NLSF_unpack.c',
-        'silk/NLSF_VQ.c',
-        'silk/NLSF_VQ_weights_laroia.c',
-        'silk/NSQ.c',
-        'silk/NSQ_del_dec.c',
-        'silk/pitch_est_defines.h',
-        'silk/pitch_est_tables.c',
-        'silk/PLC.c',
-        'silk/PLC.h',
-        'silk/process_NLSFs.c',
-        'silk/quant_LTP_gains.c',
-        'silk/resampler.c',
-        'silk/resampler_down2.c',
-        'silk/resampler_down2_3.c',
-        'silk/resampler_private.h',
-        'silk/resampler_private_AR2.c',
-        'silk/resampler_private_down_FIR.c',
-        'silk/resampler_private_IIR_FIR.c',
-        'silk/resampler_private_up2_HQ.c',
-        'silk/resampler_rom.c',
-        'silk/resampler_rom.h',
-        'silk/resampler_structs.h',
-        'silk/shell_coder.c',
-        'silk/sigm_Q15.c',
-        'silk/sort.c',
-        'silk/stereo_decode_pred.c',
-        'silk/stereo_encode_pred.c',
-        'silk/stereo_find_predictor.c',
-        'silk/stereo_LR_to_MS.c',
-        'silk/stereo_MS_to_LR.c',
-        'silk/stereo_quant_pred.c',
-        'silk/structs.h',
-        'silk/sum_sqr_shift.c',
-        'silk/tables.h',
-        'silk/tables_gain.c',
-        'silk/tables_LTP.c',
-        'silk/tables_NLSF_CB_NB_MB.c',
-        'silk/tables_NLSF_CB_WB.c',
-        'silk/tables_other.c',
-        'silk/tables_pitch_lag.c',
-        'silk/tables_pulses_per_block.c',
-        'silk/table_LSF_cos.c',
-        'silk/tuning_parameters.h',
-        'silk/typedef.h',
-        'silk/VAD.c',
-        'silk/VQ_WMat_EC.c',
-        'src/analysis.c',
-        'src/mlp.c',
-        'src/mlp_data.c',
-        'src/opus.c',
-        'src/opus_decoder.c',
-        'src/opus_encoder.c',
-        'src/opus_multistream.c',
-        'src/opus_multistream_decoder.c',
-        'src/opus_multistream_encoder.c',
-        'src/repacketizer.c',
-
-        # Floating point decoding files
-        'silk/float/autocorrelation_FLP.c',
-        'silk/float/burg_modified_FLP.c',
-        'silk/float/bwexpander_FLP.c',
-        'silk/float/corrMatrix_FLP.c',
-        'silk/float/encode_frame_FLP.c',
-        'silk/float/energy_FLP.c',
-        'silk/float/find_LPC_FLP.c',
-        'silk/float/find_LTP_FLP.c',
-        'silk/float/find_pitch_lags_FLP.c',
-        'silk/float/find_pred_coefs_FLP.c',
-        'silk/float/inner_product_FLP.c',
-        'silk/float/k2a_FLP.c',
-        'silk/float/LPC_analysis_filter_FLP.c',
-        'silk/float/LPC_inv_pred_gain_FLP.c',
-        'silk/float/LTP_analysis_filter_FLP.c',
-        'silk/float/LTP_scale_ctrl_FLP.c',
-        'silk/float/main_FLP.h',
-        'silk/float/noise_shape_analysis_FLP.c',
-        'silk/float/pitch_analysis_core_FLP.c',
-        'silk/float/process_gains_FLP.c',
-        'silk/float/regularize_correlations_FLP.c',
-        'silk/float/residual_energy_FLP.c',
-        'silk/float/scale_copy_vector_FLP.c',
-        'silk/float/scale_vector_FLP.c',
-        'silk/float/schur_FLP.c',
-        'silk/float/SigProc_FLP.h',
-        'silk/float/sort_FLP.c',
-        'silk/float/structs_FLP.h',
-        'silk/float/warped_autocorrelation_FLP.c',
-        'silk/float/wrappers_FLP.c',
-
-        'silk/float/apply_sine_window_FLP.c',
-      ],
-      'defines': [
-        'HAVE_CONFIG_H',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '.',
-        ],
-      },
-      'conditions': [
-        # Some x86 or x64 platforms don't support all sse instruction sets, while Opus still tries
-        # to build all sse code in for run time selection and causes build errors.  Exclude all sse
-        # related code on such platforms.
-        ['sb_disable_opus_sse == 0 and (target_arch == "x86" or target_arch == "x64")', {
-          'sources': [
-            'celt/x86/celt_lpc_sse4_1.c',
-            'celt/x86/celt_lpc_sse.h',
-            'celt/x86/pitch_sse.c',
-            'celt/x86/pitch_sse.h',
-            'celt/x86/pitch_sse2.c',
-            'celt/x86/pitch_sse4_1.c',
-            'celt/x86/vq_sse2.c',
-            'celt/x86/vq_sse.h',
-            'celt/x86/x86cpu.c',
-            'celt/x86/x86cpu.h',
-            'celt/x86/x86_celt_map.c',
-            'silk/x86/main_sse.h',
-            'silk/x86/NSQ_del_dec_sse4_1.c',
-            'silk/x86/NSQ_sse4_1.c',
-            'silk/x86/VAD_sse4_1.c',
-            'silk/x86/VQ_WMat_EC_sse4_1.c',
-            'silk/x86/x86_silk_map.c',
-          ],
-        }],
-        ['target_arch == "arm" or target_arch == "arm64"', {
-          'defines': [
-            # Disabled arm asm.
-            # 'OPUS_ARM_ASM',
-            # 'OPUS_ARM_INLINE_ASM',
-            # 'OPUS_ARM_INLINE_EDSP',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/third_party/opus/starboard/config.h b/third_party/opus/starboard/config.h
deleted file mode 100644
index 7c67f29..0000000
--- a/third_party/opus/starboard/config.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/***********************************************************************
-Copyright (c) 2011, Skype Limited. 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 Internet Society, IETF or IETF Trust, nor the
-names of specific contributors, may be used to endorse or promote
-products derived from this software without specific prior written
-permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#define USE_ALLOCA            0
-
-/* Comment out the next line for floating-point code */
-/*#define FIXED_POINT           1 */
-
-#define OPUS_BUILD            1
-
-#if defined(_M_IX86) || defined(_M_X64)
-/* Can always compile SSE intrinsics (no special compiler flags necessary) */
-#define OPUS_X86_MAY_HAVE_SSE
-#define OPUS_X86_MAY_HAVE_SSE2
-#define OPUS_X86_MAY_HAVE_SSE4_1
-
-/* Presume SSE functions, if compiled to use SSE/SSE2/AVX (note that AMD64 implies SSE2, and AVX
-   implies SSE4.1) */
-#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(__AVX__)
-#define OPUS_X86_PRESUME_SSE 1
-#endif
-#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(__AVX__)
-#define OPUS_X86_PRESUME_SSE2 1
-#endif
-#if defined(__AVX__)
-#define OPUS_X86_PRESUME_SSE4_1 1
-#endif
-
-#if !defined(OPUS_X86_PRESUME_SSE4_1) || !defined(OPUS_X86_PRESUME_SSE2) || !defined(OPUS_X86_PRESUME_SSE)
-#define OPUS_HAVE_RTCD 1
-#endif
-
-#endif
-
-#include "version.h"
-
-#endif /* CONFIG_H */
diff --git a/third_party/opus/starboard/version.h b/third_party/opus/starboard/version.h
deleted file mode 100644
index d95510d..0000000
--- a/third_party/opus/starboard/version.h
+++ /dev/null
@@ -1 +0,0 @@
-#define OPUS_VERSION "1.3-rc-2-gc1c247d-dirty"

diff --git a/third_party/opus/win32/config.h b/third_party/opus/win32/config.h
deleted file mode 100644
index 3e54bcb..0000000
--- a/third_party/opus/win32/config.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/***********************************************************************
-Copyright (c) 2011, Skype Limited. 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 Internet Society, IETF or IETF Trust, nor the
-names of specific contributors, may be used to endorse or promote
-products derived from this software without specific prior written
-permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#define USE_ALLOCA            1
-
-/* Comment out the next line for floating-point code */
-/*#define FIXED_POINT           1 */
-
-#define OPUS_BUILD            1
-
-#if defined(_M_IX86) || defined(_M_X64)
-/* Can always compile SSE intrinsics (no special compiler flags necessary) */
-#define OPUS_X86_MAY_HAVE_SSE
-#define OPUS_X86_MAY_HAVE_SSE2
-#define OPUS_X86_MAY_HAVE_SSE4_1
-
-/* Presume SSE functions, if compiled to use SSE/SSE2/AVX (note that AMD64 implies SSE2, and AVX
-   implies SSE4.1) */
-#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(__AVX__)
-#define OPUS_X86_PRESUME_SSE 1
-#endif
-#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(__AVX__)
-#define OPUS_X86_PRESUME_SSE2 1
-#endif
-#if defined(__AVX__)
-#define OPUS_X86_PRESUME_SSE4_1 1
-#endif
-
-#if !defined(OPUS_X86_PRESUME_SSE4_1) || !defined(OPUS_X86_PRESUME_SSE2) || !defined(OPUS_X86_PRESUME_SSE)
-#define OPUS_HAVE_RTCD 1
-#endif
-
-#endif
-
-#include "version.h"
-
-#endif /* CONFIG_H */
diff --git a/third_party/opus/win32/version.h b/third_party/opus/win32/version.h
deleted file mode 100644
index d95510d..0000000
--- a/third_party/opus/win32/version.h
+++ /dev/null
@@ -1 +0,0 @@
-#define OPUS_VERSION "1.3-rc-2-gc1c247d-dirty"

diff --git a/third_party/ots/ots-common.gypi b/third_party/ots/ots-common.gypi
deleted file mode 100644
index 855df5d..0000000
--- a/third_party/ots/ots-common.gypi
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright (c) 2009 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'variables': {
-    'ots_sources': [
-      'include/ots-memory-stream.h',
-      'include/opentype-sanitiser.h',
-      'src/cff.cc',
-      'src/cff.h',
-      'src/cff_type2_charstring.cc',
-      'src/cff_type2_charstring.h',
-      'src/cmap.cc',
-      'src/cmap.h',
-      'src/cvt.cc',
-      'src/cvt.h',
-      'src/feat.cc',
-      'src/feat.h',
-      'src/fpgm.cc',
-      'src/fpgm.h',
-      'src/gasp.cc',
-      'src/gasp.h',
-      'src/gdef.cc',
-      'src/gdef.h',
-      'src/glat.h',
-      'src/gloc.cc',
-      'src/gloc.h',
-      'src/glyf.cc',
-      'src/glyf.h',
-      'src/gpos.cc',
-      'src/gpos.h',
-      'src/graphite.h',
-      'src/gsub.cc',
-      'src/gsub.h',
-      'src/hdmx.cc',
-      'src/hdmx.h',
-      'src/head.cc',
-      'src/head.h',
-      'src/hhea.cc',
-      'src/hhea.h',
-      'src/hmtx.cc',
-      'src/hmtx.h',
-      'src/kern.cc',
-      'src/kern.h',
-      'src/layout.cc',
-      'src/layout.h',
-      'src/loca.cc',
-      'src/loca.h',
-      'src/ltsh.cc',
-      'src/ltsh.h',
-      'src/math.cc',
-      'src/math_.h',
-      'src/maxp.cc',
-      'src/maxp.h',
-      'src/metrics.cc',
-      'src/metrics.h',
-      'src/name.cc',
-      'src/name.h',
-      'src/os2.cc',
-      'src/os2.h',
-      'src/ots.cc',
-      'src/ots.h',
-      'src/post.cc',
-      'src/post.h',
-      'src/prep.cc',
-      'src/prep.h',
-      'src/sile.cc',
-      'src/sile.h',
-      'src/silf.h',
-      'src/sill.cc',
-      'src/sill.h',
-      'src/vdmx.cc',
-      'src/vdmx.h',
-      'src/vhea.cc',
-      'src/vhea.h',
-      'src/vmtx.cc',
-      'src/vmtx.h',
-      'src/vorg.cc',
-      'src/vorg.h',
-    ],
-    'ots_include_dirs': [
-      'include',
-      '../woff2/include',
-    ],
-  },
-}
diff --git a/third_party/ots/ots.gyp b/third_party/ots/ots.gyp
deleted file mode 100644
index 2b9ae16..0000000
--- a/third_party/ots/ots.gyp
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright (c) 2009 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'variables': {
-    'chromium_code': 1,
-  },
-  'includes': [
-    'ots-common.gypi',
-  ],
-  'targets': [
-    {
-      'target_name': 'ots',
-      'type': 'static_library',
-      'sources': [
-        '<@(ots_sources)',
-      ],
-      'include_dirs': [
-        '<@(ots_include_dirs)',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<@(ots_include_dirs)',
-        ],
-      },
-      'dependencies': [
-        '../brotli/brotli.gyp:dec',
-        '../woff2/woff2.gyp:woff2_dec',
-        '../zlib/zlib.gyp:zlib',
-      ],
-      # Disable windows ots warnings:
-      #   4334: '<<' : result of 32-bit shift implicitly converted to 64
-      #       bits (was 64-bit shift intended?)
-      'msvs_disabled_warnings': [ 4334 ],
-    },
-  ],
-}
diff --git a/third_party/protobuf/protobuf.gyp b/third_party/protobuf/protobuf.gyp
deleted file mode 100644
index 48db80e..0000000
--- a/third_party/protobuf/protobuf.gyp
+++ /dev/null
@@ -1,589 +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.
-
-{
-  'conditions': [
-    ['clang==1', {
-      'target_defaults': {
-        'cflags': [
-          # protobuf-3 contains a few functions that are unused.
-          '-Wno-unused-function',
-          # protobuf-3 mixes generated enum types.
-          '-Wno-enum-compare-switch',
-          # Used by older version of clang.
-          '-Wno-enum-compare',
-          # Older version of clang don't have -Wno-enum-compare-switch
-          '-Wno-unknown-warning-option',
-        ],
-        'cflags_host': [
-          # protobuf-3 contains a few functions that are unused.
-          '-Wno-unused-function',
-          # protobuf-3 mixes generated enum types.
-          '-Wno-enum-compare-switch',
-          # Used by older version of clang.
-          '-Wno-enum-compare',
-          # Older version of clang don't have -Wno-enum-compare-switch
-          '-Wno-unknown-warning-option',
-        ]
-      },
-    }],
-    ['use_system_protobuf==0', {
-      'conditions': [
-        ['OS=="win"', {
-          'target_defaults': {
-            'msvs_disabled_warnings': [
-              4018,  # signed/unsigned mismatch in comparison
-              4065,  # switch statement contains 'default' but no 'case' labels
-              4146,  # unary minus operator applied to unsigned type
-              4244,  # implicit conversion, possible loss of data
-              4267,  # size_t to int truncation
-              4291,  # no matching operator delete for a placement new
-              4305,  # double to float truncation
-              4355,  # 'this' used in base member initializer list
-              4506,  # no definition for inline function (protobuf issue #240)
-              4715,  # not all control paths return a value (fixed in trunk)
-            ],
-            'defines!': [
-              'WIN32_LEAN_AND_MEAN',  # Protobuf defines this itself.
-            ],
-          },
-        }],
-      ],
-      'targets': [
-        # The "lite" lib is about 1/7th the size of the heavy lib,
-        # but it doesn't support some of the more exotic features of
-        # protobufs, like reflection.  To generate C++ code that can link
-        # against the lite version of the library, add the option line:
-        #
-        #   option optimize_for = LITE_RUNTIME;
-        #
-        # to your .proto file.
-        {
-          'target_name': 'protobuf_lite',
-          'type': '<(component)',
-          'toolsets': ['host', 'target'],
-          'includes': [
-            'protobuf_lite.gypi',
-          ],
-          # Required for component builds. See http://crbug.com/172800.
-          'defines': [
-            'LIBPROTOBUF_EXPORTS',
-            'PROTOBUF_USE_DLLS',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'PROTOBUF_USE_DLLS',
-            ],
-          },
-          'all_dependent_settings': {
-            'include_dirs': [
-              # Get protobuf headers from the chromium tree.
-              '<(DEPTH)/third_party/protobuf/src',
-            ],
-            'defines': [
-              # This macro must be defined to suppress the use of
-              # dynamic_cast<>, which requires RTTI.
-              'GOOGLE_PROTOBUF_NO_RTTI',
-
-              # The generated code needs to be compiled with the same flags as the
-              # protobuf library. Otherwise we get static initializers which are not
-              # thread safe.
-              'GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER',
-
-              # pthread is used on the host platform, but the target platform
-              # actually uses SbThread.
-              'HAVE_PTHREAD',
-            ],
-          },
-        },
-        # This is the full, heavy protobuf lib that's needed for c++ .protos
-        # that don't specify the LITE_RUNTIME option.  The protocol
-        # compiler itself (protoc) falls into that category.
-        #
-        # DO NOT LINK AGAINST THIS TARGET IN CHROME CODE  --agl
-        {
-          'target_name': 'protobuf_full_do_not_use',
-          'type': 'static_library',
-          'toolsets': ['host','target'],
-          'includes': [
-            'protobuf_lite.gypi',
-          ],
-          'sources': [
-            'src/google/protobuf/any.cc',
-            'src/google/protobuf/any.h',
-            'src/google/protobuf/any.pb.cc',
-            'src/google/protobuf/any.pb.h',
-            'src/google/protobuf/api.pb.cc',
-            'src/google/protobuf/api.pb.h',
-            'src/google/protobuf/compiler/importer.cc',
-            'src/google/protobuf/compiler/importer.h',
-            'src/google/protobuf/compiler/parser.cc',
-            'src/google/protobuf/compiler/parser.h',
-            'src/google/protobuf/descriptor.cc',
-            'src/google/protobuf/descriptor.h',
-            'src/google/protobuf/descriptor.pb.cc',
-            'src/google/protobuf/descriptor.pb.h',
-            'src/google/protobuf/descriptor_database.cc',
-            'src/google/protobuf/descriptor_database.h',
-            'src/google/protobuf/duration.pb.cc',
-            'src/google/protobuf/duration.pb.h',
-            'src/google/protobuf/dynamic_message.cc',
-            'src/google/protobuf/dynamic_message.h',
-            'src/google/protobuf/empty.pb.cc',
-            'src/google/protobuf/empty.pb.h',
-            'src/google/protobuf/extension_set_heavy.cc',
-            'src/google/protobuf/field_mask.pb.cc',
-            'src/google/protobuf/field_mask.pb.h',
-            'src/google/protobuf/generated_enum_reflection.h',
-            'src/google/protobuf/generated_enum_util.h',
-            'src/google/protobuf/generated_message_reflection.cc',
-            'src/google/protobuf/generated_message_reflection.h',
-
-            # gzip_stream.cc pulls in zlib, but it's not actually used by
-            # protoc, just by test code, so instead of compiling zlib for the
-            # host, let's just exclude this.
-            # 'src/google/protobuf/io/gzip_stream.cc',
-            # 'src/google/protobuf/io/gzip_stream.h',
-
-            'src/google/protobuf/io/printer.cc',
-            'src/google/protobuf/io/printer.h',
-            'src/google/protobuf/io/strtod.cc',
-            'src/google/protobuf/io/strtod.h',
-            'src/google/protobuf/io/tokenizer.cc',
-            'src/google/protobuf/io/tokenizer.h',
-            'src/google/protobuf/io/zero_copy_stream_impl.cc',
-            'src/google/protobuf/io/zero_copy_stream_impl.h',
-            'src/google/protobuf/map_entry.h',
-            'src/google/protobuf/map_field.cc',
-            'src/google/protobuf/map_field.h',
-            'src/google/protobuf/map_field_inl.h',
-            'src/google/protobuf/message.cc',
-            'src/google/protobuf/message.h',
-            'src/google/protobuf/metadata.h',
-            'src/google/protobuf/reflection.h',
-            'src/google/protobuf/reflection_internal.h',
-            'src/google/protobuf/reflection_ops.cc',
-            'src/google/protobuf/reflection_ops.h',
-            'src/google/protobuf/service.cc',
-            'src/google/protobuf/service.h',
-            'src/google/protobuf/source_context.pb.cc',
-            'src/google/protobuf/source_context.pb.h',
-            'src/google/protobuf/struct.pb.cc',
-            'src/google/protobuf/struct.pb.h',
-            'src/google/protobuf/stubs/mathutil.h',
-            'src/google/protobuf/stubs/mathlimits.cc',
-            'src/google/protobuf/stubs/mathlimits.h',
-            'src/google/protobuf/stubs/substitute.cc',
-            'src/google/protobuf/stubs/substitute.h',
-            'src/google/protobuf/stubs/singleton.h',
-            'src/google/protobuf/text_format.cc',
-            'src/google/protobuf/text_format.h',
-            'src/google/protobuf/timestamp.pb.cc',
-            'src/google/protobuf/timestamp.pb.h',
-            'src/google/protobuf/type.pb.cc',
-            'src/google/protobuf/type.pb.h',
-            'src/google/protobuf/unknown_field_set.cc',
-            'src/google/protobuf/unknown_field_set.h',
-            'src/google/protobuf/util/field_comparator.cc',
-            'src/google/protobuf/util/field_comparator.h',
-            'src/google/protobuf/util/field_mask_util.cc',
-            'src/google/protobuf/util/field_mask_util.h',
-            'src/google/protobuf/util/internal/constants.h',
-            'src/google/protobuf/util/internal/datapiece.cc',
-            'src/google/protobuf/util/internal/datapiece.h',
-            'src/google/protobuf/util/internal/default_value_objectwriter.cc',
-            'src/google/protobuf/util/internal/default_value_objectwriter.h',
-            'src/google/protobuf/util/internal/error_listener.cc',
-            'src/google/protobuf/util/internal/error_listener.h',
-            'src/google/protobuf/util/internal/field_mask_utility.cc',
-            'src/google/protobuf/util/internal/field_mask_utility.h',
-            'src/google/protobuf/util/internal/json_escaping.cc',
-            'src/google/protobuf/util/internal/json_escaping.h',
-            'src/google/protobuf/util/internal/json_objectwriter.cc',
-            'src/google/protobuf/util/internal/json_objectwriter.h',
-            'src/google/protobuf/util/internal/json_stream_parser.cc',
-            'src/google/protobuf/util/internal/json_stream_parser.h',
-            'src/google/protobuf/util/internal/location_tracker.h',
-            'src/google/protobuf/util/internal/object_location_tracker.h',
-            'src/google/protobuf/util/internal/object_source.h',
-            'src/google/protobuf/util/internal/object_writer.cc',
-            'src/google/protobuf/util/internal/object_writer.h',
-            'src/google/protobuf/util/internal/proto_writer.cc',
-            'src/google/protobuf/util/internal/proto_writer.h',
-            'src/google/protobuf/util/internal/protostream_objectsource.cc',
-            'src/google/protobuf/util/internal/protostream_objectsource.h',
-            'src/google/protobuf/util/internal/protostream_objectwriter.cc',
-            'src/google/protobuf/util/internal/protostream_objectwriter.h',
-            'src/google/protobuf/util/internal/structured_objectwriter.h',
-            'src/google/protobuf/util/internal/type_info.cc',
-            'src/google/protobuf/util/internal/type_info.h',
-            'src/google/protobuf/util/internal/type_info_test_helper.cc',
-            'src/google/protobuf/util/internal/type_info_test_helper.h',
-            'src/google/protobuf/util/internal/utility.cc',
-            'src/google/protobuf/util/internal/utility.h',
-            'src/google/protobuf/util/json_util.cc',
-            'src/google/protobuf/util/json_util.h',
-            'src/google/protobuf/util/message_differencer.cc',
-            'src/google/protobuf/util/message_differencer.h',
-            'src/google/protobuf/util/time_util.cc',
-            'src/google/protobuf/util/time_util.h',
-            'src/google/protobuf/util/type_resolver.h',
-            'src/google/protobuf/util/type_resolver_util.cc',
-            'src/google/protobuf/util/type_resolver_util.h',
-            'src/google/protobuf/wire_format.cc',
-            'src/google/protobuf/wire_format.h',
-            'src/google/protobuf/wrappers.pb.cc',
-            'src/google/protobuf/wrappers.pb.h',
-          ],
-        },
-        {
-          'target_name': 'protoc_lib',
-          'type': 'static_library',
-          'toolsets': ['host'],
-          'sources': [
-            "src/google/protobuf/compiler/code_generator.cc",
-            "src/google/protobuf/compiler/code_generator.h",
-            "src/google/protobuf/compiler/command_line_interface.cc",
-            "src/google/protobuf/compiler/command_line_interface.h",
-            "src/google/protobuf/compiler/cpp/cpp_enum.cc",
-            "src/google/protobuf/compiler/cpp/cpp_enum.h",
-            "src/google/protobuf/compiler/cpp/cpp_enum_field.cc",
-            "src/google/protobuf/compiler/cpp/cpp_enum_field.h",
-            "src/google/protobuf/compiler/cpp/cpp_extension.cc",
-            "src/google/protobuf/compiler/cpp/cpp_extension.h",
-            "src/google/protobuf/compiler/cpp/cpp_field.cc",
-            "src/google/protobuf/compiler/cpp/cpp_field.h",
-            "src/google/protobuf/compiler/cpp/cpp_file.cc",
-            "src/google/protobuf/compiler/cpp/cpp_file.h",
-            "src/google/protobuf/compiler/cpp/cpp_generator.cc",
-            "src/google/protobuf/compiler/cpp/cpp_generator.h",
-            "src/google/protobuf/compiler/cpp/cpp_helpers.cc",
-            "src/google/protobuf/compiler/cpp/cpp_helpers.h",
-            "src/google/protobuf/compiler/cpp/cpp_map_field.cc",
-            "src/google/protobuf/compiler/cpp/cpp_map_field.h",
-            "src/google/protobuf/compiler/cpp/cpp_message.cc",
-            "src/google/protobuf/compiler/cpp/cpp_message.h",
-            "src/google/protobuf/compiler/cpp/cpp_message_field.cc",
-            "src/google/protobuf/compiler/cpp/cpp_message_field.h",
-            "src/google/protobuf/compiler/cpp/cpp_options.h",
-            "src/google/protobuf/compiler/cpp/cpp_primitive_field.cc",
-            "src/google/protobuf/compiler/cpp/cpp_primitive_field.h",
-            "src/google/protobuf/compiler/cpp/cpp_service.cc",
-            "src/google/protobuf/compiler/cpp/cpp_service.h",
-            "src/google/protobuf/compiler/cpp/cpp_string_field.cc",
-            "src/google/protobuf/compiler/cpp/cpp_string_field.h",
-            "src/google/protobuf/compiler/csharp/csharp_doc_comment.cc",
-            "src/google/protobuf/compiler/csharp/csharp_doc_comment.h",
-            "src/google/protobuf/compiler/csharp/csharp_enum.cc",
-            "src/google/protobuf/compiler/csharp/csharp_enum.h",
-            "src/google/protobuf/compiler/csharp/csharp_enum_field.cc",
-            "src/google/protobuf/compiler/csharp/csharp_enum_field.h",
-            "src/google/protobuf/compiler/csharp/csharp_field_base.cc",
-            "src/google/protobuf/compiler/csharp/csharp_field_base.h",
-            "src/google/protobuf/compiler/csharp/csharp_generator.cc",
-            "src/google/protobuf/compiler/csharp/csharp_generator.h",
-            "src/google/protobuf/compiler/csharp/csharp_helpers.cc",
-            "src/google/protobuf/compiler/csharp/csharp_helpers.h",
-            "src/google/protobuf/compiler/csharp/csharp_map_field.cc",
-            "src/google/protobuf/compiler/csharp/csharp_map_field.h",
-            "src/google/protobuf/compiler/csharp/csharp_message.cc",
-            "src/google/protobuf/compiler/csharp/csharp_message.h",
-            "src/google/protobuf/compiler/csharp/csharp_message_field.cc",
-            "src/google/protobuf/compiler/csharp/csharp_message_field.h",
-            "src/google/protobuf/compiler/csharp/csharp_options.h",
-            "src/google/protobuf/compiler/csharp/csharp_primitive_field.cc",
-            "src/google/protobuf/compiler/csharp/csharp_primitive_field.h",
-            "src/google/protobuf/compiler/csharp/csharp_reflection_class.cc",
-            "src/google/protobuf/compiler/csharp/csharp_reflection_class.h",
-            "src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc",
-            "src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h",
-            "src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc",
-            "src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h",
-            "src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc",
-            "src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h",
-            "src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc",
-            "src/google/protobuf/compiler/csharp/csharp_source_generator_base.h",
-            "src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc",
-            "src/google/protobuf/compiler/csharp/csharp_wrapper_field.h",
-            "src/google/protobuf/compiler/java/java_context.cc",
-            "src/google/protobuf/compiler/java/java_context.h",
-            "src/google/protobuf/compiler/java/java_doc_comment.cc",
-            "src/google/protobuf/compiler/java/java_doc_comment.h",
-            "src/google/protobuf/compiler/java/java_enum.cc",
-            "src/google/protobuf/compiler/java/java_enum.h",
-            "src/google/protobuf/compiler/java/java_enum_field.cc",
-            "src/google/protobuf/compiler/java/java_enum_field.h",
-            "src/google/protobuf/compiler/java/java_enum_field_lite.cc",
-            "src/google/protobuf/compiler/java/java_enum_field_lite.h",
-            "src/google/protobuf/compiler/java/java_enum_lite.cc",
-            "src/google/protobuf/compiler/java/java_enum_lite.h",
-            "src/google/protobuf/compiler/java/java_extension.cc",
-            "src/google/protobuf/compiler/java/java_extension.h",
-            "src/google/protobuf/compiler/java/java_extension_lite.cc",
-            "src/google/protobuf/compiler/java/java_extension_lite.h",
-            "src/google/protobuf/compiler/java/java_field.cc",
-            "src/google/protobuf/compiler/java/java_field.h",
-            "src/google/protobuf/compiler/java/java_file.cc",
-            "src/google/protobuf/compiler/java/java_file.h",
-            "src/google/protobuf/compiler/java/java_generator.cc",
-            "src/google/protobuf/compiler/java/java_generator.h",
-            "src/google/protobuf/compiler/java/java_generator_factory.cc",
-            "src/google/protobuf/compiler/java/java_generator_factory.h",
-            "src/google/protobuf/compiler/java/java_helpers.cc",
-            "src/google/protobuf/compiler/java/java_helpers.h",
-            "src/google/protobuf/compiler/java/java_lazy_message_field.cc",
-            "src/google/protobuf/compiler/java/java_lazy_message_field.h",
-            "src/google/protobuf/compiler/java/java_lazy_message_field_lite.cc",
-            "src/google/protobuf/compiler/java/java_lazy_message_field_lite.h",
-            "src/google/protobuf/compiler/java/java_map_field.cc",
-            "src/google/protobuf/compiler/java/java_map_field.h",
-            "src/google/protobuf/compiler/java/java_map_field_lite.cc",
-            "src/google/protobuf/compiler/java/java_map_field_lite.h",
-            "src/google/protobuf/compiler/java/java_message.cc",
-            "src/google/protobuf/compiler/java/java_message.h",
-            "src/google/protobuf/compiler/java/java_message_builder.cc",
-            "src/google/protobuf/compiler/java/java_message_builder.h",
-            "src/google/protobuf/compiler/java/java_message_builder_lite.cc",
-            "src/google/protobuf/compiler/java/java_message_builder_lite.h",
-            "src/google/protobuf/compiler/java/java_message_field.cc",
-            "src/google/protobuf/compiler/java/java_message_field.h",
-            "src/google/protobuf/compiler/java/java_message_field_lite.cc",
-            "src/google/protobuf/compiler/java/java_message_field_lite.h",
-            "src/google/protobuf/compiler/java/java_message_lite.cc",
-            "src/google/protobuf/compiler/java/java_message_lite.h",
-            "src/google/protobuf/compiler/java/java_name_resolver.cc",
-            "src/google/protobuf/compiler/java/java_name_resolver.h",
-            "src/google/protobuf/compiler/java/java_primitive_field.cc",
-            "src/google/protobuf/compiler/java/java_primitive_field.h",
-            "src/google/protobuf/compiler/java/java_primitive_field_lite.cc",
-            "src/google/protobuf/compiler/java/java_primitive_field_lite.h",
-            "src/google/protobuf/compiler/java/java_service.cc",
-            "src/google/protobuf/compiler/java/java_service.h",
-            "src/google/protobuf/compiler/java/java_shared_code_generator.cc",
-            "src/google/protobuf/compiler/java/java_shared_code_generator.h",
-            "src/google/protobuf/compiler/java/java_string_field.cc",
-            "src/google/protobuf/compiler/java/java_string_field.h",
-            "src/google/protobuf/compiler/java/java_string_field_lite.cc",
-            "src/google/protobuf/compiler/java/java_string_field_lite.h",
-            "src/google/protobuf/compiler/javanano/javanano_enum.cc",
-            "src/google/protobuf/compiler/javanano/javanano_enum.h",
-            "src/google/protobuf/compiler/javanano/javanano_enum_field.cc",
-            "src/google/protobuf/compiler/javanano/javanano_enum_field.h",
-            "src/google/protobuf/compiler/javanano/javanano_extension.cc",
-            "src/google/protobuf/compiler/javanano/javanano_extension.h",
-            "src/google/protobuf/compiler/javanano/javanano_field.cc",
-            "src/google/protobuf/compiler/javanano/javanano_field.h",
-            "src/google/protobuf/compiler/javanano/javanano_file.cc",
-            "src/google/protobuf/compiler/javanano/javanano_file.h",
-            "src/google/protobuf/compiler/javanano/javanano_generator.cc",
-            "src/google/protobuf/compiler/javanano/javanano_generator.h",
-            "src/google/protobuf/compiler/javanano/javanano_helpers.cc",
-            "src/google/protobuf/compiler/javanano/javanano_helpers.h",
-            "src/google/protobuf/compiler/javanano/javanano_map_field.cc",
-            "src/google/protobuf/compiler/javanano/javanano_map_field.h",
-            "src/google/protobuf/compiler/javanano/javanano_message.cc",
-            "src/google/protobuf/compiler/javanano/javanano_message.h",
-            "src/google/protobuf/compiler/javanano/javanano_message_field.cc",
-            "src/google/protobuf/compiler/javanano/javanano_message_field.h",
-            "src/google/protobuf/compiler/javanano/javanano_primitive_field.cc",
-            "src/google/protobuf/compiler/javanano/javanano_primitive_field.h",
-            "src/google/protobuf/compiler/js/js_generator.cc",
-            "src/google/protobuf/compiler/js/js_generator.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_enum.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_enum.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_enum_field.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_extension.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_extension.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_field.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_field.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_file.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_file.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_generator.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_generator.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_helpers.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_helpers.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_map_field.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_map_field.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_message.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_message.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_message_field.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_message_field.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_oneof.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_oneof.h",
-            "src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc",
-            "src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h",
-            "src/google/protobuf/compiler/plugin.cc",
-            "src/google/protobuf/compiler/plugin.h",
-            "src/google/protobuf/compiler/plugin.pb.cc",
-            "src/google/protobuf/compiler/plugin.pb.h",
-            "src/google/protobuf/compiler/python/python_generator.cc",
-            "src/google/protobuf/compiler/python/python_generator.h",
-            "src/google/protobuf/compiler/ruby/ruby_generator.cc",
-            "src/google/protobuf/compiler/ruby/ruby_generator.h",
-            "src/google/protobuf/compiler/subprocess.cc",
-            "src/google/protobuf/compiler/subprocess.h",
-            "src/google/protobuf/compiler/zip_writer.cc",
-            "src/google/protobuf/compiler/zip_writer.h",
-          ],
-          'dependencies': [
-            'protobuf_full_do_not_use',
-          ],
-          'include_dirs': [
-            'src',
-          ],
-        },
-        {
-          'target_name': 'protoc',
-          'type': 'executable',
-          'toolsets': ['host'],
-          'sources': [
-            "src/google/protobuf/compiler/main.cc",
-          ],
-          'dependencies': [
-            'protoc_lib',
-          ],
-          'include_dirs': [
-            'src',
-          ],
-        },
-        {
-          # Generate the python module needed by all protoc-generated Python code.
-          'target_name': 'py_proto',
-          'type': 'none',
-          'copies': [
-            {
-              'destination': '<(PRODUCT_DIR)/pyproto/google/',
-              'files': [
-                '__init__.py',
-              ],
-            },
-            {
-              'destination': '<(PRODUCT_DIR)/pyproto/google/third_party/six/',
-              'files': [
-                'third_party/six/six.py',
-              ],
-            },
-            {
-              'destination': '<(PRODUCT_DIR)/pyproto/google/protobuf',
-              'files': [
-                'python/google/protobuf/__init__.py',
-                'python/google/protobuf/descriptor.py',
-                'python/google/protobuf/descriptor_database.py',
-                'python/google/protobuf/descriptor_pool.py',
-                'python/google/protobuf/json_format.py',
-                'python/google/protobuf/message.py',
-                'python/google/protobuf/message_factory.py',
-                'python/google/protobuf/proto_builder.py',
-                'python/google/protobuf/reflection.py',
-                'python/google/protobuf/service.py',
-                'python/google/protobuf/service_reflection.py',
-                'python/google/protobuf/symbol_database.py',
-                'python/google/protobuf/text_encoding.py',
-                'python/google/protobuf/text_format.py',
-
-                # TODO(ncarter): protoc's python generator treats
-                # descriptor.proto specially, but only when the input path is
-                # exactly "google/protobuf/descriptor.proto".  I'm not sure how
-                # to execute a rule from a different directory.  For now, use a
-                # manually-generated copy of descriptor_pb2.py.
-                'python/google/protobuf/descriptor_pb2.py',
-              ],
-            },
-            {
-              'destination': '<(PRODUCT_DIR)/pyproto/google/protobuf/internal',
-              'files': [
-                'python/google/protobuf/internal/__init__.py',
-                'python/google/protobuf/internal/_parameterized.py',
-                'python/google/protobuf/internal/api_implementation.py',
-                'python/google/protobuf/internal/containers.py',
-                'python/google/protobuf/internal/decoder.py',
-                'python/google/protobuf/internal/encoder.py',
-                'python/google/protobuf/internal/enum_type_wrapper.py',
-                'python/google/protobuf/internal/message_listener.py',
-                'python/google/protobuf/internal/python_message.py',
-                'python/google/protobuf/internal/type_checkers.py',
-                'python/google/protobuf/internal/well_known_types.py',
-                'python/google/protobuf/internal/wire_format.py',
-              ],
-            },
-          ],
-      #   # We can't generate a proper descriptor_pb2.py -- see earlier comment.
-      #   'rules': [
-      #     {
-      #       'rule_name': 'genproto',
-      #       'extension': 'proto',
-      #       'inputs': [
-      #         '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
-      #       ],
-      #       'variables': {
-      #         # The protoc compiler requires a proto_path argument with the
-      #           # directory containing the .proto file.
-      #           'rule_input_relpath': 'src/google/protobuf',
-      #         },
-      #         'outputs': [
-      #           '<(PRODUCT_DIR)/pyproto/google/protobuf/<(RULE_INPUT_ROOT)_pb2.py',
-      #         ],
-      #         'action': [
-      #           '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
-      #           '-I./src',
-      #           '-I.',
-      #           '--python_out=<(PRODUCT_DIR)/pyproto/google/protobuf',
-      #           'google/protobuf/descriptor.proto',
-      #         ],
-      #         'message': 'Generating Python code from <(RULE_INPUT_PATH)',
-      #       },
-      #     ],
-      #     'dependencies': [
-      #       'protoc#host',
-      #     ],
-      #     'sources': [
-      #       'src/google/protobuf/descriptor.proto',
-      #     ],
-         },
-      ],
-    }, { # use_system_protobuf==1
-      'targets': [
-        {
-          'target_name': 'protobuf_lite',
-          'type': 'none',
-          'all_dependent_settings': {
-            'cflags': [
-              # Use full protobuf, because vanilla protobuf doesn't have
-              # our custom patch to retain unknown fields in lite mode.
-              '<!@(pkg-config --cflags protobuf)',
-            ],
-            'defines': [
-              'USE_SYSTEM_PROTOBUF',
-
-              # This macro must be defined to suppress the use
-              # of dynamic_cast<>, which requires RTTI.
-              'GOOGLE_PROTOBUF_NO_RTTI',
-              'GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER',
-            ],
-          },
-          'link_settings': {
-            # Use full protobuf, because vanilla protobuf doesn't have
-            # our custom patch to retain unknown fields in lite mode.
-            'ldflags': [
-              '<!@(pkg-config --libs-only-L --libs-only-other protobuf)',
-            ],
-            'libraries': [
-              '<!@(pkg-config --libs-only-l protobuf)',
-            ],
-          },
-        },
-        {
-          'target_name': 'protoc',
-          'type': 'none',
-          'toolsets': ['host', 'target'],
-        },
-        {
-          'target_name': 'py_proto',
-          'type': 'none',
-        },
-      ],
-    }],
-  ],
-}
diff --git a/third_party/protobuf/protobuf_lite.gypi b/third_party/protobuf/protobuf_lite.gypi
deleted file mode 100644
index ffe2288..0000000
--- a/third_party/protobuf/protobuf_lite.gypi
+++ /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.
-
-{
-  'sources': [
-    'src/google/protobuf/arena.cc',
-    'src/google/protobuf/arena.h',
-    'src/google/protobuf/arenastring.cc',
-    'src/google/protobuf/arenastring.h',
-    'src/google/protobuf/extension_set.cc',
-    'src/google/protobuf/extension_set.h',
-    'src/google/protobuf/generated_message_util.cc',
-    'src/google/protobuf/generated_message_util.h',
-    'src/google/protobuf/io/coded_stream.cc',
-    'src/google/protobuf/io/coded_stream.h',
-    'src/google/protobuf/io/coded_stream_inl.h',
-    'src/google/protobuf/io/zero_copy_stream.cc',
-    'src/google/protobuf/io/zero_copy_stream.h',
-    'src/google/protobuf/io/zero_copy_stream_impl_lite.cc',
-    'src/google/protobuf/io/zero_copy_stream_impl_lite.h',
-    'src/google/protobuf/map.h',
-    'src/google/protobuf/map_entry_lite.h',
-    'src/google/protobuf/map_field_lite.h',
-    'src/google/protobuf/map_type_handler.h',
-    'src/google/protobuf/message_lite.cc',
-    'src/google/protobuf/message_lite.h',
-    'src/google/protobuf/repeated_field.cc',
-    'src/google/protobuf/repeated_field.h',
-    'src/google/protobuf/stubs/atomicops.h',
-    'src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h',
-    'src/google/protobuf/stubs/atomicops_internals_arm_gcc.h',
-    'src/google/protobuf/stubs/atomicops_internals_arm_qnx.h',
-    'src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h',
-    'src/google/protobuf/stubs/atomicops_internals_generic_gcc.h',
-    'src/google/protobuf/stubs/atomicops_internals_macosx.h',
-    'src/google/protobuf/stubs/atomicops_internals_mips_gcc.h',
-    'src/google/protobuf/stubs/atomicops_internals_pnacl.h',
-    'src/google/protobuf/stubs/atomicops_internals_power.h',
-    'src/google/protobuf/stubs/atomicops_internals_ppc_gcc.h',
-    'src/google/protobuf/stubs/atomicops_internals_solaris.h',
-    'src/google/protobuf/stubs/atomicops_internals_tsan.h',
-    'src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc',
-    'src/google/protobuf/stubs/atomicops_internals_x86_gcc.h',
-    'src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc',
-    'src/google/protobuf/stubs/atomicops_internals_x86_msvc.h',
-    'src/google/protobuf/stubs/atomic_sequence_num.h',
-    'src/google/protobuf/stubs/bytestream.cc',
-    'src/google/protobuf/stubs/bytestream.h',
-    'src/google/protobuf/stubs/callback.h',
-    'src/google/protobuf/stubs/casts.h',
-    'src/google/protobuf/stubs/common.cc',
-    'src/google/protobuf/stubs/common.h',
-    'src/google/protobuf/stubs/fastmem.h',
-    'src/google/protobuf/stubs/hash.h',
-    'src/google/protobuf/stubs/int128.cc',
-    'src/google/protobuf/stubs/int128.h',
-    'src/google/protobuf/stubs/logging.h',
-    'src/google/protobuf/stubs/macros.h',
-    'src/google/protobuf/stubs/map_util.h',
-    'src/google/protobuf/stubs/mutex.h',
-    'src/google/protobuf/stubs/once.cc',
-    'src/google/protobuf/stubs/once.h',
-    'src/google/protobuf/stubs/platform_macros.h',
-    'src/google/protobuf/stubs/port.h',
-    'src/google/protobuf/stubs/scoped_ptr.h',
-    'src/google/protobuf/stubs/shared_ptr.h',
-    'src/google/protobuf/stubs/status.cc',
-    'src/google/protobuf/stubs/status.h',
-    'src/google/protobuf/stubs/status_macros.h',
-    'src/google/protobuf/stubs/statusor.cc',
-    'src/google/protobuf/stubs/statusor.h',
-    'src/google/protobuf/stubs/stl_util.h',
-    'src/google/protobuf/stubs/stringpiece.cc',
-    'src/google/protobuf/stubs/stringpiece.h',
-    'src/google/protobuf/stubs/stringprintf.cc',
-    'src/google/protobuf/stubs/stringprintf.h',
-    'src/google/protobuf/stubs/structurally_valid.cc',
-    'src/google/protobuf/stubs/strutil.cc',
-    'src/google/protobuf/stubs/strutil.h',
-    'src/google/protobuf/stubs/template_util.h',
-    'src/google/protobuf/stubs/type_traits.h',
-    'src/google/protobuf/stubs/time.cc',
-    'src/google/protobuf/stubs/time.h',
-    'src/google/protobuf/wire_format_lite.cc',
-    'src/google/protobuf/wire_format_lite.h',
-    'src/google/protobuf/wire_format_lite_inl.h',
-  ],
-  'include_dirs': [
-    'src',
-  ],
-  'defines': [
-    # This macro must be defined to suppress the use of dynamic_cast<>,
-    # which requires RTTI.
-    'GOOGLE_PROTOBUF_NO_RTTI',
-
-    'GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER',
-    'HAVE_PTHREAD',
-  ],
-  'direct_dependent_settings': {
-    'include_dirs': [
-      'src',
-    ],
-    'defines': [
-      'GOOGLE_PROTOBUF_NO_RTTI',
-      'GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER',
-    ],
-    # TODO(jschuh): http://crbug.com/167187 size_t -> int.
-    'msvs_disabled_warnings': [ 4267 ],
-  },
-}
diff --git a/third_party/proxy_py/proxy.py b/third_party/proxy_py/proxy.py
index 6b614a6..2845c6a 100755
--- a/third_party/proxy_py/proxy.py
+++ b/third_party/proxy_py/proxy.py
@@ -384,6 +384,11 @@
     def __init__(self, host, port, host_resolver=None):
         super(Server, self).__init__(b'server')
 
+        if isinstance(host, bytes):
+            host = host.decode()
+        if isinstance(port, bytes):
+            port = port.decode()
+
         # Hostname IP resolution.
         if host_resolver and host in host_resolver:
             host = host_resolver[host]
@@ -481,7 +486,11 @@
                     raise ProxyAuthenticationFailed()
 
             if self.request.method == b'CONNECT':
-                host, port = self.request.url.path.split(COLON)
+                if self.request.url.scheme != b'':
+                    host = self.request.url.scheme
+                    port = self.request.url.path
+                else:
+                    host, port = self.request.url.path.split(COLON)
             elif self.request.url:
                 host, port = self.request.url.hostname, self.request.url.port if self.request.url.port else 80
             else:
diff --git a/third_party/pulseaudio_includes/pulseaudio_includes.gyp b/third_party/pulseaudio_includes/pulseaudio_includes.gyp
deleted file mode 100644
index 51b1d88..0000000
--- a/third_party/pulseaudio_includes/pulseaudio_includes.gyp
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'targets': [
-    {
-      'target_name': 'pulseaudio',
-      'type': 'none',
-      'direct_dependent_settings': {
-        'include_dirs': [ 'pulseaudio.12.2' ],
-      },
-    },
-  ],
-}
diff --git a/third_party/skia/gyp/core.gypi b/third_party/skia/gyp/core.gypi
deleted file mode 100644
index da1219a..0000000
--- a/third_party/skia/gyp/core.gypi
+++ /dev/null
@@ -1,597 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Translated from: gn/core.gni
-
-{
-  'variables': {
-    'skia_core_public': [
-      "<(skia_include_path)/core/SkAnnotation.h",
-      "<(skia_include_path)/core/SkBBHFactory.h",
-      "<(skia_include_path)/core/SkBitmap.h",
-      "<(skia_include_path)/core/SkBlendMode.h",
-      "<(skia_include_path)/core/SkBlurTypes.h",
-      "<(skia_include_path)/core/SkCanvas.h",
-      "<(skia_include_path)/core/SkCanvasVirtualEnforcer.h",
-      "<(skia_include_path)/core/SkClipOp.h",
-      "<(skia_include_path)/core/SkColor.h",
-      "<(skia_include_path)/core/SkColorFilter.h",
-      "<(skia_include_path)/core/SkColorPriv.h",
-      "<(skia_include_path)/core/SkColorSpace.h",
-      "<(skia_include_path)/core/SkContourMeasure.h",
-      "<(skia_include_path)/core/SkCoverageMode.h",
-      "<(skia_include_path)/core/SkCubicMap.h",
-      "<(skia_include_path)/core/SkData.h",
-      "<(skia_include_path)/core/SkDataTable.h",
-      "<(skia_include_path)/core/SkDeferredDisplayListRecorder.h",
-      "<(skia_include_path)/core/SkDeque.h",
-      "<(skia_include_path)/core/SkDocument.h",
-      "<(skia_include_path)/core/SkDrawLooper.h",
-      "<(skia_include_path)/core/SkDrawable.h",
-      "<(skia_include_path)/core/SkEncodedImageFormat.h",
-      "<(skia_include_path)/core/SkExecutor.h",
-      "<(skia_include_path)/core/SkFilterQuality.h",
-      "<(skia_include_path)/core/SkFlattenable.h",
-      "<(skia_include_path)/core/SkFont.h",
-      "<(skia_include_path)/core/SkFontArguments.h",
-      "<(skia_include_path)/core/SkFontLCDConfig.h",
-      "<(skia_include_path)/core/SkFontMetrics.h",
-      "<(skia_include_path)/core/SkFontMgr.h",
-      "<(skia_include_path)/core/SkFontParameters.h",
-      "<(skia_include_path)/core/SkFontStyle.h",
-      "<(skia_include_path)/core/SkFontTypes.h",
-      "<(skia_include_path)/core/SkGraphics.h",
-      "<(skia_include_path)/core/SkICC.h",
-      "<(skia_include_path)/core/SkImage.h",
-      "<(skia_include_path)/core/SkImageEncoder.h",
-      "<(skia_include_path)/core/SkImageFilter.h",
-      "<(skia_include_path)/core/SkImageGenerator.h",
-      "<(skia_include_path)/core/SkImageInfo.h",
-      "<(skia_include_path)/core/SkMallocPixelRef.h",
-      "<(skia_include_path)/core/SkMaskFilter.h",
-      "<(skia_include_path)/core/SkMath.h",
-      "<(skia_include_path)/core/SkMatrix.h",
-      "<(skia_include_path)/core/SkMatrix44.h",
-      "<(skia_include_path)/core/SkMilestone.h",
-      "<(skia_include_path)/core/SkOverdrawCanvas.h",
-      "<(skia_include_path)/core/SkPaint.h",
-      "<(skia_include_path)/core/SkPath.h",
-      "<(skia_include_path)/core/SkPathEffect.h",
-      "<(skia_include_path)/core/SkPathMeasure.h",
-      "<(skia_include_path)/core/SkPixelRef.h",
-      "<(skia_include_path)/core/SkPixmap.h",
-      "<(skia_include_path)/core/SkPngChunkReader.h",
-      "<(skia_include_path)/core/SkPoint.h",
-      "<(skia_include_path)/core/SkPoint3.h",
-      "<(skia_include_path)/core/SkPostConfig.h",
-      "<(skia_include_path)/core/SkPreConfig.h",
-      "<(skia_include_path)/core/SkPromiseImageTexture.h",
-      "<(skia_include_path)/core/SkRRect.h",
-      "<(skia_include_path)/core/SkRSXform.h",
-      "<(skia_include_path)/core/SkRWBuffer.h",
-      "<(skia_include_path)/core/SkRasterHandleAllocator.h",
-      "<(skia_include_path)/core/SkRect.h",
-      "<(skia_include_path)/core/SkRefCnt.h",
-      "<(skia_include_path)/core/SkRegion.h",
-      "<(skia_include_path)/core/SkScalar.h",
-      "<(skia_include_path)/core/SkSerialProcs.h",
-      "<(skia_include_path)/core/SkShader.h",
-      "<(skia_include_path)/core/SkSize.h",
-      "<(skia_include_path)/core/SkStream.h",
-      "<(skia_include_path)/core/SkString.h",
-      "<(skia_include_path)/core/SkStrokeRec.h",
-      "<(skia_include_path)/core/SkSurface.h",
-      "<(skia_include_path)/core/SkSurfaceCharacterization.h",
-      "<(skia_include_path)/core/SkSurfaceProps.h",
-      "<(skia_include_path)/core/SkSwizzle.h",
-      "<(skia_include_path)/core/SkTextBlob.h",
-      "<(skia_include_path)/core/SkTime.h",
-      "<(skia_include_path)/core/SkTraceMemoryDump.h",
-      "<(skia_include_path)/core/SkTypeface.h",
-      "<(skia_include_path)/core/SkTypes.h",
-      "<(skia_include_path)/core/SkUnPreMultiply.h",
-      "<(skia_include_path)/core/SkVertices.h",
-      "<(skia_include_path)/core/SkYUVAIndex.h",
-      "<(skia_include_path)/core/SkYUVASizeInfo.h",
-    ],
-
-    'skia_core_sources': [
-      "<(skia_src_path)/c/sk_imageinfo.cpp",
-      "<(skia_src_path)/c/sk_paint.cpp",
-      "<(skia_src_path)/c/sk_surface.cpp",
-      "<(skia_src_path)/c/sk_types_priv.h",
-
-      "<(skia_src_path)/core/Sk4px.h",
-      "<(skia_src_path)/core/SkAAClip.cpp",
-      "<(skia_src_path)/core/SkAnnotation.cpp",
-      "<(skia_src_path)/core/SkAdvancedTypefaceMetrics.h",
-      "<(skia_src_path)/core/SkAlphaRuns.cpp",
-      "<(skia_src_path)/core/SkAntiRun.h",
-      "<(skia_src_path)/core/SkATrace.cpp",
-      "<(skia_src_path)/core/SkATrace.h",
-      "<(skia_src_path)/core/SkAutoPixmapStorage.h",
-      "<(skia_src_path)/core/SkAutoPixmapStorage.cpp",
-      "<(skia_src_path)/core/SkBBHFactory.cpp",
-      "<(skia_src_path)/core/SkBBoxHierarchy.h",
-      "<(skia_src_path)/core/SkBitmap.cpp",
-      "<(skia_src_path)/core/SkBitmapCache.cpp",
-      "<(skia_src_path)/core/SkBitmapController.cpp",
-      "<(skia_src_path)/core/SkBitmapDevice.cpp",
-      "<(skia_src_path)/core/SkBitmapDevice.h",
-      "<(skia_src_path)/core/SkBitmapProcState.cpp",
-      "<(skia_src_path)/core/SkBitmapProcState.h",
-      "<(skia_src_path)/core/SkBitmapProcState_matrixProcs.cpp",
-      "<(skia_src_path)/core/SkBlendMode.cpp",
-      "<(skia_src_path)/core/SkBlitBWMaskTemplate.h",
-      "<(skia_src_path)/core/SkBlitRow.h",
-      "<(skia_src_path)/core/SkBlitRow_D32.cpp",
-      "<(skia_src_path)/core/SkBlitter.h",
-      "<(skia_src_path)/core/SkBlitter.cpp",
-      "<(skia_src_path)/core/SkBlitter_A8.cpp",
-      "<(skia_src_path)/core/SkBlitter_ARGB32.cpp",
-      "<(skia_src_path)/core/SkBlitter_RGB565.cpp",
-      "<(skia_src_path)/core/SkBlitter_Sprite.cpp",
-      "<(skia_src_path)/core/SkBlurMask.cpp",
-      "<(skia_src_path)/core/SkBlurMask.h",
-      "<(skia_src_path)/core/SkBlurMF.cpp",
-      "<(skia_src_path)/core/SkBuffer.cpp",
-      "<(skia_src_path)/core/SkCachedData.cpp",
-      "<(skia_src_path)/core/SkCanvas.cpp",
-      "<(skia_src_path)/core/SkCanvasPriv.cpp",
-      "<(skia_src_path)/core/SkCanvasPriv.h",
-      "<(skia_src_path)/core/SkClipStack.cpp",
-      "<(skia_src_path)/core/SkClipStack.h",
-      "<(skia_src_path)/core/SkClipStackDevice.cpp",
-      "<(skia_src_path)/core/SkClipStackDevice.h",
-      "<(skia_src_path)/core/SkColor.cpp",
-      "<(skia_src_path)/core/SkColorFilter.cpp",
-      "<(skia_src_path)/core/SkColorFilter_Matrix.cpp",
-      "<(skia_src_path)/core/SkColorFilter_Matrix.h",
-      "<(skia_src_path)/core/SkColorSpace.cpp",
-      "<(skia_src_path)/core/SkColorSpaceXformSteps.cpp",
-      "<(skia_src_path)/core/SkContourMeasure.cpp",
-      "<(skia_src_path)/core/SkConvertPixels.cpp",
-      "<(skia_src_path)/core/SkConvertPixels.h",
-      "<(skia_src_path)/core/SkCoreBlitters.h",
-      "<(skia_src_path)/core/SkCpu.cpp",
-      "<(skia_src_path)/core/SkCpu.h",
-      "<(skia_src_path)/core/SkCubicClipper.cpp",
-      "<(skia_src_path)/core/SkCubicClipper.h",
-      "<(skia_src_path)/core/SkCubicMap.cpp",
-      "<(skia_src_path)/core/SkData.cpp",
-      "<(skia_src_path)/core/SkDataTable.cpp",
-      "<(skia_src_path)/core/SkDebug.cpp",
-      "<(skia_src_path)/core/SkDeferredDisplayListPriv.h",
-      "<(skia_src_path)/core/SkDeferredDisplayList.cpp",
-      "<(skia_src_path)/core/SkDeferredDisplayListRecorder.cpp",
-      "<(skia_src_path)/core/SkDeque.cpp",
-      "<(skia_src_path)/core/SkDescriptor.cpp",
-      "<(skia_src_path)/core/SkDescriptor.h",
-      "<(skia_src_path)/core/SkDevice.cpp",
-      "<(skia_src_path)/core/SkDevice.h",
-      "<(skia_src_path)/core/SkDiscardableMemory.h",
-      "<(skia_src_path)/lazy/SkDiscardableMemoryPool.cpp",
-      "<(skia_src_path)/core/SkDistanceFieldGen.cpp",
-      "<(skia_src_path)/core/SkDistanceFieldGen.h",
-      "<(skia_src_path)/core/SkDocument.cpp",
-      "<(skia_src_path)/core/SkDraw.cpp",
-      "<(skia_src_path)/core/SkDraw_atlas.cpp",
-      "<(skia_src_path)/core/SkDraw_text.cpp",
-      "<(skia_src_path)/core/SkDraw_vertices.cpp",
-      "<(skia_src_path)/core/SkDraw.h",
-      "<(skia_src_path)/core/SkDrawable.cpp",
-      "<(skia_src_path)/core/SkDrawLooper.cpp",
-      "<(skia_src_path)/core/SkDrawProcs.h",
-      "<(skia_src_path)/core/SkDrawShadowInfo.cpp",
-      "<(skia_src_path)/core/SkDrawShadowInfo.h",
-      "<(skia_src_path)/core/SkEdgeBuilder.cpp",
-      "<(skia_src_path)/core/SkEdgeBuilder.h",
-      "<(skia_src_path)/core/SkEdgeClipper.cpp",
-      "<(skia_src_path)/core/SkEdgeClipper.h",
-      "<(skia_src_path)/core/SkEndian.h",
-      "<(skia_src_path)/core/SkExecutor.cpp",
-      "<(skia_src_path)/core/SkAnalyticEdge.cpp",
-      "<(skia_src_path)/core/SkEdge.cpp",
-      "<(skia_src_path)/core/SkEdge.h",
-      "<(skia_src_path)/core/SkFDot6.h",
-      "<(skia_src_path)/core/SkArenaAlloc.cpp",
-      "<(skia_src_path)/core/SkArenaAlloc.h",
-      "<(skia_src_path)/core/SkArenaAllocList.h",
-      "<(skia_src_path)/core/SkGaussFilter.cpp",
-      "<(skia_src_path)/core/SkGaussFilter.h",
-      "<(skia_src_path)/core/SkFlattenable.cpp",
-      "<(skia_src_path)/core/SkFont.cpp",
-      "<(skia_src_path)/core/SkFontLCDConfig.cpp",
-      "<(skia_src_path)/core/SkFontMgr.cpp",
-      "<(skia_src_path)/core/SkFontDescriptor.cpp",
-      "<(skia_src_path)/core/SkFontDescriptor.h",
-      "<(skia_src_path)/core/SkFontStream.cpp",
-      "<(skia_src_path)/core/SkFontStream.h",
-      "<(skia_src_path)/core/SkFuzzLogging.h",
-      "<(skia_src_path)/core/SkGeometry.cpp",
-      "<(skia_src_path)/core/SkGeometry.h",
-      "<(skia_src_path)/core/SkGlobalInitialization_core.cpp",
-      "<(skia_src_path)/core/SkGlyph.h",
-      "<(skia_src_path)/core/SkGlyph.cpp",
-      "<(skia_src_path)/core/SkGlyphBuffer.h",
-      "<(skia_src_path)/core/SkGlyphBuffer.cpp",
-      "<(skia_src_path)/core/SkGlyphRun.cpp",
-      "<(skia_src_path)/core/SkGlyphRun.h",
-      "<(skia_src_path)/core/SkGlyphRunPainter.cpp",
-      "<(skia_src_path)/core/SkGlyphRunPainter.h",
-      "<(skia_src_path)/core/SkGpuBlurUtils.h",
-      "<(skia_src_path)/core/SkGpuBlurUtils.cpp",
-      "<(skia_src_path)/core/SkGraphics.cpp",
-      "<(skia_src_path)/core/SkHalf.cpp",
-      "<(skia_src_path)/core/SkICC.cpp",
-      "<(skia_src_path)/core/SkImageFilter.cpp",
-      "<(skia_src_path)/core/SkImageFilter_Base.h",
-      "<(skia_src_path)/core/SkImageFilterCache.cpp",
-      "<(skia_src_path)/core/SkImageFilterCache.h",
-      "<(skia_src_path)/core/SkImageFilterTypes.cpp",
-      "<(skia_src_path)/core/SkImageFilterTypes.h",
-      "<(skia_src_path)/core/SkImageInfo.cpp",
-      "<(skia_src_path)/core/SkImageGenerator.cpp",
-      "<(skia_src_path)/core/SkEnumerate.h",
-      "<(skia_src_path)/core/SkLineClipper.cpp",
-      "<(skia_src_path)/core/SkLocalMatrixImageFilter.cpp",
-      "<(skia_src_path)/core/SkLocalMatrixImageFilter.h",
-      "<(skia_src_path)/core/SkMD5.cpp",
-      "<(skia_src_path)/core/SkMD5.h",
-      "<(skia_src_path)/core/SkMakeUnique.h",
-      "<(skia_src_path)/core/SkMallocPixelRef.cpp",
-      "<(skia_src_path)/core/SkMask.cpp",
-      "<(skia_src_path)/core/SkMask.h",
-      "<(skia_src_path)/core/SkMaskBlurFilter.h",
-      "<(skia_src_path)/core/SkMaskBlurFilter.cpp",
-      "<(skia_src_path)/core/SkMaskCache.cpp",
-      "<(skia_src_path)/core/SkMaskFilter.cpp",
-      "<(skia_src_path)/core/SkMaskGamma.cpp",
-      "<(skia_src_path)/core/SkMaskGamma.h",
-      "<(skia_src_path)/core/SkMath.cpp",
-      "<(skia_src_path)/core/SkMathPriv.h",
-      "<(skia_src_path)/core/SkMatrix.cpp",
-      "<(skia_src_path)/core/SkMatrix44.cpp",
-      "<(skia_src_path)/core/SkMatrixImageFilter.cpp",
-      "<(skia_src_path)/core/SkMatrixImageFilter.h",
-      "<(skia_src_path)/core/SkMatrixUtils.h",
-      "<(skia_src_path)/core/SkMessageBus.h",
-      "<(skia_src_path)/core/SkMipMap.cpp",
-      "<(skia_src_path)/core/SkMipMap.h",
-      "<(skia_src_path)/core/SkMiniRecorder.cpp",
-      "<(skia_src_path)/core/SkMiniRecorder.h",
-      "<(skia_src_path)/core/SkModeColorFilter.cpp",
-      "<(skia_src_path)/core/SkNextID.h",
-      "<(skia_src_path)/core/SkLatticeIter.cpp",
-      "<(skia_src_path)/core/SkLatticeIter.h",
-      "<(skia_src_path)/core/SkNormalFlatSource.cpp",
-      "<(skia_src_path)/core/SkNormalFlatSource.h",
-      "<(skia_src_path)/core/SkNormalMapSource.cpp",
-      "<(skia_src_path)/core/SkNormalMapSource.h",
-      "<(skia_src_path)/core/SkNormalSource.cpp",
-      "<(skia_src_path)/core/SkNormalSource.h",
-      "<(skia_src_path)/core/SkOpts.cpp",
-      "<(skia_src_path)/core/SkOpts.h",
-      "<(skia_src_path)/core/SkOrderedReadBuffer.h",
-      "<(skia_src_path)/core/SkOSFile.h",
-      "<(skia_src_path)/core/SkOverdrawCanvas.cpp",
-      "<(skia_src_path)/core/SkPaint.cpp",
-      "<(skia_src_path)/core/SkPaintDefaults.h",
-      "<(skia_src_path)/core/SkPaintPriv.cpp",
-      "<(skia_src_path)/core/SkPaintPriv.h",
-      "<(skia_src_path)/core/SkPath.cpp",
-      "<(skia_src_path)/core/SkPath_serial.cpp",
-      "<(skia_src_path)/core/SkPathEffect.cpp",
-      "<(skia_src_path)/core/SkPathMeasure.cpp",
-      "<(skia_src_path)/core/SkPathPriv.h",
-      "<(skia_src_path)/core/SkPathRef.cpp",
-      "<(skia_src_path)/core/SkPixelRef.cpp",
-      "<(skia_src_path)/core/SkPixmap.cpp",
-      "<(skia_src_path)/core/SkPoint.cpp",
-      "<(skia_src_path)/core/SkPoint3.cpp",
-      "<(skia_src_path)/core/SkPromiseImageTexture.cpp",
-      "<(skia_src_path)/core/SkPtrRecorder.cpp",
-      "<(skia_src_path)/core/SkQuadClipper.cpp",
-      "<(skia_src_path)/core/SkQuadClipper.h",
-      "<(skia_src_path)/core/SkRasterClip.cpp",
-      "<(skia_src_path)/core/SkRasterPipeline.cpp",
-      "<(skia_src_path)/core/SkRasterPipelineBlitter.cpp",
-      "<(skia_src_path)/core/SkReadBuffer.h",
-      "<(skia_src_path)/core/SkReadBuffer.cpp",
-      "<(skia_src_path)/core/SkReader32.h",
-      "<(skia_src_path)/core/SkRecord.cpp",
-      "<(skia_src_path)/core/SkRecords.cpp",
-      "<(skia_src_path)/core/SkRecords.h",
-      "<(skia_src_path)/core/SkRecordDraw.cpp",
-      "<(skia_src_path)/core/SkRecordOpts.cpp",
-      "<(skia_src_path)/core/SkRecordOpts.h",
-      "<(skia_src_path)/core/SkRecordPattern.h",
-      "<(skia_src_path)/core/SkRect.cpp",
-      "<(skia_src_path)/core/SkRegion.cpp",
-      "<(skia_src_path)/core/SkRegionPriv.h",
-      "<(skia_src_path)/core/SkRegion_path.cpp",
-      "<(skia_src_path)/core/SkRemoteGlyphCache.h",
-      "<(skia_src_path)/core/SkRemoteGlyphCache.cpp",
-      "<(skia_src_path)/core/SkResourceCache.cpp",
-      "<(skia_src_path)/core/SkRRect.cpp",
-      "<(skia_src_path)/core/SkRRectPriv.h",
-      "<(skia_src_path)/core/SkRTree.h",
-      "<(skia_src_path)/core/SkRTree.cpp",
-      "<(skia_src_path)/core/SkRWBuffer.cpp",
-      "<(skia_src_path)/core/SkScalar.cpp",
-      "<(skia_src_path)/core/SkScalerContext.cpp",
-      "<(skia_src_path)/core/SkScalerContext.h",
-      "<(skia_src_path)/core/SkScaleToSides.h",
-      "<(skia_src_path)/core/SkScan.cpp",
-      "<(skia_src_path)/core/SkScan.h",
-      "<(skia_src_path)/core/SkScanPriv.h",
-      "<(skia_src_path)/core/SkScan_AAAPath.cpp",
-      "<(skia_src_path)/core/SkScan_AntiPath.cpp",
-      "<(skia_src_path)/core/SkScan_Antihair.cpp",
-      "<(skia_src_path)/core/SkScan_Hairline.cpp",
-      "<(skia_src_path)/core/SkScan_Path.cpp",
-      "<(skia_src_path)/core/SkScopeExit.h",
-      "<(skia_src_path)/core/SkSemaphore.cpp",
-      "<(skia_src_path)/core/SkSharedMutex.cpp",
-      "<(skia_src_path)/core/SkSharedMutex.h",
-      "<(skia_src_path)/core/SkSpan.h",
-      "<(skia_src_path)/core/SkSpecialImage.cpp",
-      "<(skia_src_path)/core/SkSpecialImage.h",
-      "<(skia_src_path)/core/SkSpecialSurface.cpp",
-      "<(skia_src_path)/core/SkSpecialSurface.h",
-      "<(skia_src_path)/core/SkSpinlock.cpp",
-      "<(skia_src_path)/core/SkSpriteBlitter_ARGB32.cpp",
-      "<(skia_src_path)/core/SkSpriteBlitter_RGB565.cpp",
-      "<(skia_src_path)/core/SkSpriteBlitter.h",
-      "<(skia_src_path)/core/SkStream.cpp",
-      "<(skia_src_path)/core/SkStreamPriv.h",
-      "<(skia_src_path)/core/SkStrike.cpp",
-      "<(skia_src_path)/core/SkStrike.h",
-      "<(skia_src_path)/core/SkStrikeCache.cpp",
-      "<(skia_src_path)/core/SkStrikeCache.h",
-      "<(skia_src_path)/core/SkStrikeForGPU.h",
-      "<(skia_src_path)/core/SkStrikeForGPU.cpp",
-      "<(skia_src_path)/core/SkStrikeSpec.cpp",
-      "<(skia_src_path)/core/SkStrikeSpec.h",
-      "<(skia_src_path)/core/SkString.cpp",
-      "<(skia_src_path)/core/SkStringUtils.cpp",
-      "<(skia_src_path)/core/SkStroke.h",
-      "<(skia_src_path)/core/SkStroke.cpp",
-      "<(skia_src_path)/core/SkStrokeRec.cpp",
-      "<(skia_src_path)/core/SkStrokerPriv.cpp",
-      "<(skia_src_path)/core/SkStrokerPriv.h",
-      "<(skia_src_path)/core/SkSurfaceCharacterization.cpp",
-      "<(skia_src_path)/core/SkSurfacePriv.h",
-      "<(skia_src_path)/core/SkSwizzle.cpp",
-      "<(skia_src_path)/core/SkTaskGroup.cpp",
-      "<(skia_src_path)/core/SkTaskGroup.h",
-      "<(skia_src_path)/core/SkTDPQueue.h",
-      "<(skia_src_path)/core/SkTDynamicHash.h",
-      "<(skia_src_path)/core/SkTextBlob.cpp",
-      "<(skia_src_path)/core/SkTextBlobPriv.h",
-      "<(skia_src_path)/core/SkTextFormatParams.h",
-      "<(skia_src_path)/core/SkTime.cpp",
-      "<(skia_src_path)/core/SkTInternalLList.h",
-      "<(skia_src_path)/core/SkThreadID.cpp",
-      "<(skia_src_path)/core/SkTLazy.h",
-      "<(skia_src_path)/core/SkTLList.h",
-      "<(skia_src_path)/core/SkTLS.cpp",
-      "<(skia_src_path)/core/SkTMultiMap.h",
-      "<(skia_src_path)/core/SkTraceEvent.h",
-      "<(skia_src_path)/core/SkTraceEventCommon.h",
-      "<(skia_src_path)/core/SkTSearch.cpp",
-      "<(skia_src_path)/core/SkTSearch.h",
-      "<(skia_src_path)/core/SkTSort.h",
-      "<(skia_src_path)/core/SkTTopoSort.h",
-      "<(skia_src_path)/core/SkTypeface.cpp",
-      "<(skia_src_path)/core/SkTypeface_remote.h",
-      "<(skia_src_path)/core/SkTypeface_remote.cpp",
-      "<(skia_src_path)/core/SkTypefaceCache.cpp",
-      "<(skia_src_path)/core/SkTypefaceCache.h",
-      "<(skia_src_path)/core/SkTypefacePriv.h",
-      "<(skia_src_path)/core/SkUnPreMultiply.cpp",
-      "<(skia_src_path)/core/SkUtils.cpp",
-      "<(skia_src_path)/core/SkUtils.h",
-      "<(skia_src_path)/core/SkVM.cpp",
-      "<(skia_src_path)/core/SkVM.h",
-      "<(skia_src_path)/core/SkVMBlitter.cpp",
-      "<(skia_src_path)/core/SkValidationUtils.h",
-      "<(skia_src_path)/core/SkVertices.cpp",
-      "<(skia_src_path)/core/SkVertState.cpp",
-      "<(skia_src_path)/core/SkWriteBuffer.cpp",
-      "<(skia_src_path)/core/SkWriter32.cpp",
-      "<(skia_src_path)/core/SkWriter32.h",
-      "<(skia_src_path)/core/SkXfermode.cpp",
-      "<(skia_src_path)/core/SkXfermodeInterpretation.cpp",
-      "<(skia_src_path)/core/SkXfermodeInterpretation.h",
-      "<(skia_src_path)/core/SkYUVPlanesCache.cpp",
-      "<(skia_src_path)/core/SkYUVPlanesCache.h",
-      "<(skia_src_path)/core/SkYUVASizeInfo.cpp",
-      "<(skia_src_path)/core/SkYUVMath.cpp",
-      "<(skia_src_path)/core/SkZip.h",
-
-      "<(skia_src_path)/image/SkImage.cpp",
-
-      #        "<(skia_src_path)/image/SkImage_Gpu.cpp",
-      "<(skia_src_path)/image/SkImage_Lazy.cpp",
-      "<(skia_src_path)/image/SkImage_Lazy.h",
-      "<(skia_src_path)/image/SkImage_Raster.cpp",
-      "<(skia_src_path)/image/SkSurface.cpp",
-      "<(skia_src_path)/image/SkSurface_Base.h",
-
-      #        "<(skia_src_path)/image/SkSurface_Gpu.cpp",
-      "<(skia_src_path)/image/SkSurface_Raster.cpp",
-
-      "<(skia_src_path)/shaders/SkBitmapProcShader.cpp",
-      "<(skia_src_path)/shaders/SkBitmapProcShader.h",
-      "<(skia_src_path)/shaders/SkColorFilterShader.cpp",
-      "<(skia_src_path)/shaders/SkColorFilterShader.h",
-      "<(skia_src_path)/shaders/SkColorShader.cpp",
-      "<(skia_src_path)/shaders/SkColorShader.h",
-      "<(skia_src_path)/shaders/SkComposeShader.cpp",
-      "<(skia_src_path)/shaders/SkComposeShader.h",
-      "<(skia_src_path)/shaders/SkEmptyShader.h",
-      "<(skia_src_path)/shaders/SkImageShader.cpp",
-      "<(skia_src_path)/shaders/SkImageShader.h",
-      "<(skia_src_path)/shaders/SkLightingShader.cpp",
-      "<(skia_src_path)/shaders/SkLightingShader.h",
-      "<(skia_src_path)/shaders/SkLights.cpp",
-      "<(skia_src_path)/shaders/SkLights.h",
-      "<(skia_src_path)/shaders/SkLocalMatrixShader.cpp",
-      "<(skia_src_path)/shaders/SkLocalMatrixShader.h",
-      "<(skia_src_path)/shaders/SkRTShader.cpp",
-      "<(skia_src_path)/shaders/SkShader.cpp",
-      "<(skia_src_path)/shaders/SkShaderBase.h",
-
-      "<(skia_src_path)/opts/SkBlitMask_opts.h",
-      "<(skia_src_path)/opts/SkBlitRow_opts.h",
-      "<(skia_src_path)/opts/SkChecksum_opts.h",
-      "<(skia_src_path)/opts/SkRasterPipeline_opts.h",
-      "<(skia_src_path)/opts/SkSwizzler_opts.h",
-      "<(skia_src_path)/opts/SkUtils_opts.h",
-      "<(skia_src_path)/opts/SkXfermode_opts.h",
-
-      # private
-      "<(skia_include_path)/private/SkChecksum.h",
-      "<(skia_include_path)/private/SkDeferredDisplayList.h",
-      "<(skia_include_path)/private/SkFixed.h",
-      "<(skia_include_path)/private/SkFloatBits.h",
-      "<(skia_include_path)/private/SkFloatingPoint.h",
-      "<(skia_include_path)/private/SkHalf.h",
-      "<(skia_include_path)/private/SkMalloc.h",
-      "<(skia_include_path)/private/SkMutex.h",
-      "<(skia_include_path)/private/SkNoncopyable.h",
-      "<(skia_include_path)/private/SkNx.h",
-      "<(skia_include_path)/private/SkNx_neon.h",
-      "<(skia_include_path)/private/SkNx_sse.h",
-      "<(skia_include_path)/private/SkOnce.h",
-      "<(skia_include_path)/private/SkPathRef.h",
-      "<(skia_include_path)/private/SkSemaphore.h",
-      "<(skia_include_path)/private/SkShadowFlags.h",
-      "<(skia_include_path)/private/SkSpinlock.h",
-      "<(skia_include_path)/private/SkTemplates.h",
-      "<(skia_include_path)/private/SkTArray.h",
-      "<(skia_include_path)/private/SkTDArray.h",
-      "<(skia_include_path)/private/SkTFitsIn.h",
-      "<(skia_include_path)/private/SkTHash.h",
-      "<(skia_include_path)/private/SkThreadAnnotations.h",
-      "<(skia_include_path)/private/SkThreadID.h",
-      "<(skia_include_path)/private/SkTLogic.h",
-      "<(skia_include_path)/private/SkWeakRefCnt.h",
-    ],
-
-    'skia_pathops_public': [
-      "<(skia_include_path)/pathops/SkPathOps.h",
-    ],
-
-    'skia_pathops_sources': [
-      "<(skia_src_path)/pathops/SkAddIntersections.cpp",
-      "<(skia_src_path)/pathops/SkDConicLineIntersection.cpp",
-      "<(skia_src_path)/pathops/SkDCubicLineIntersection.cpp",
-      "<(skia_src_path)/pathops/SkDCubicToQuads.cpp",
-      "<(skia_src_path)/pathops/SkDLineIntersection.cpp",
-      "<(skia_src_path)/pathops/SkDQuadLineIntersection.cpp",
-      "<(skia_src_path)/pathops/SkIntersections.cpp",
-      "<(skia_src_path)/pathops/SkOpAngle.cpp",
-      "<(skia_src_path)/pathops/SkOpBuilder.cpp",
-      "<(skia_src_path)/pathops/SkOpCoincidence.cpp",
-      "<(skia_src_path)/pathops/SkOpContour.cpp",
-      "<(skia_src_path)/pathops/SkOpCubicHull.cpp",
-      "<(skia_src_path)/pathops/SkOpEdgeBuilder.cpp",
-      "<(skia_src_path)/pathops/SkOpSegment.cpp",
-      "<(skia_src_path)/pathops/SkOpSpan.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsAsWinding.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsCommon.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsConic.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsCubic.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsCurve.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsDebug.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsLine.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsOp.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsQuad.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsRect.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsSimplify.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsTSect.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsTightBounds.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsTypes.cpp",
-      "<(skia_src_path)/pathops/SkPathOpsWinding.cpp",
-      "<(skia_src_path)/pathops/SkPathWriter.cpp",
-      "<(skia_src_path)/pathops/SkReduceOrder.cpp",
-
-      "<(skia_src_path)/pathops/SkAddIntersections.h",
-      "<(skia_src_path)/pathops/SkIntersectionHelper.h",
-      "<(skia_src_path)/pathops/SkIntersections.h",
-      "<(skia_src_path)/pathops/SkLineParameters.h",
-      "<(skia_src_path)/pathops/SkOpAngle.h",
-      "<(skia_src_path)/pathops/SkOpCoincidence.h",
-      "<(skia_src_path)/pathops/SkOpContour.h",
-      "<(skia_src_path)/pathops/SkOpEdgeBuilder.h",
-      "<(skia_src_path)/pathops/SkOpSegment.h",
-      "<(skia_src_path)/pathops/SkOpSpan.h",
-      "<(skia_src_path)/pathops/SkPathOpsBounds.h",
-      "<(skia_src_path)/pathops/SkPathOpsCommon.h",
-      "<(skia_src_path)/pathops/SkPathOpsConic.h",
-      "<(skia_src_path)/pathops/SkPathOpsCubic.h",
-      "<(skia_src_path)/pathops/SkPathOpsCurve.h",
-      "<(skia_src_path)/pathops/SkPathOpsDebug.h",
-      "<(skia_src_path)/pathops/SkPathOpsLine.h",
-      "<(skia_src_path)/pathops/SkPathOpsPoint.h",
-      "<(skia_src_path)/pathops/SkPathOpsQuad.h",
-      "<(skia_src_path)/pathops/SkPathOpsRect.h",
-      "<(skia_src_path)/pathops/SkPathOpsTSect.h",
-      "<(skia_src_path)/pathops/SkPathOpsTypes.h",
-      "<(skia_src_path)/pathops/SkPathWriter.h",
-      "<(skia_src_path)/pathops/SkReduceOrder.h",
-    ],
-
-    'skia_skpicture_public': [
-      "<(skia_include_path)/core/SkMultiPictureDraw.h",
-      "<(skia_include_path)/core/SkPicture.h",
-      "<(skia_include_path)/core/SkPictureRecorder.h",
-    ],
-
-    'skia_skpicture_sources': [
-      "<(skia_include_path)/core/SkMultiPictureDraw.h",
-      "<(skia_include_path)/core/SkPicture.h",
-      "<(skia_include_path)/core/SkPictureRecorder.h",
-      "<(skia_src_path)/core/SkBigPicture.cpp",
-      "<(skia_src_path)/core/SkMultiPictureDraw.cpp",
-      "<(skia_src_path)/core/SkPicture.cpp",
-      "<(skia_src_path)/core/SkPictureCommon.h",
-      "<(skia_src_path)/core/SkPictureData.cpp",
-      "<(skia_src_path)/core/SkPictureData.h",
-      "<(skia_src_path)/core/SkPictureFlat.cpp",
-      "<(skia_src_path)/core/SkPictureFlat.h",
-      "<(skia_src_path)/core/SkPictureImageGenerator.cpp",
-      "<(skia_src_path)/core/SkPicturePlayback.cpp",
-      "<(skia_src_path)/core/SkPicturePlayback.h",
-      "<(skia_src_path)/core/SkPictureRecord.cpp",
-      "<(skia_src_path)/core/SkPictureRecord.h",
-      "<(skia_src_path)/core/SkPictureRecorder.cpp",
-      "<(skia_src_path)/core/SkRecordedDrawable.cpp",
-      "<(skia_src_path)/core/SkRecorder.cpp",
-      "<(skia_src_path)/shaders/SkPictureShader.cpp",
-      "<(skia_src_path)/shaders/SkPictureShader.h",
-    ],
-  },
-  'defines': [
-    'SK_BUILD_NO_OPTS',
-  ],
-  'direct_dependent_settings':
-  {
-    'defines': [
-      'SK_BUILD_NO_OPTS',
-    ],
-  }
-}
diff --git a/third_party/skia/gyp/effects.gypi b/third_party/skia/gyp/effects.gypi
deleted file mode 100644
index 32427f7..0000000
--- a/third_party/skia/gyp/effects.gypi
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Translated from: gn/effects.gni
-
-{
-  'variables': {
-    'skia_effects_public': [
-      "<(skia_include_path)/effects/Sk1DPathEffect.h",
-      "<(skia_include_path)/effects/Sk2DPathEffect.h",
-      "<(skia_include_path)/effects/SkBlurDrawLooper.h",
-      "<(skia_include_path)/effects/SkBlurMaskFilter.h",
-      "<(skia_include_path)/effects/SkColorMatrix.h",
-      "<(skia_include_path)/effects/SkColorMatrixFilter.h",
-      "<(skia_include_path)/effects/SkCornerPathEffect.h",
-      "<(skia_include_path)/effects/SkDashPathEffect.h",
-      "<(skia_include_path)/effects/SkDiscretePathEffect.h",
-      "<(skia_include_path)/effects/SkGradientShader.h",
-      "<(skia_include_path)/effects/SkLayerDrawLooper.h",
-      "<(skia_include_path)/effects/SkLumaColorFilter.h",
-      "<(skia_include_path)/effects/SkOverdrawColorFilter.h",
-      "<(skia_include_path)/effects/SkPerlinNoiseShader.h",
-      "<(skia_include_path)/effects/SkShaderMaskFilter.h",
-      "<(skia_include_path)/effects/SkTableColorFilter.h",
-      "<(skia_include_path)/effects/SkTableMaskFilter.h",
-    ],
-
-    'skia_effects_sources': [
-      "<(skia_src_path)/c/sk_effects.cpp",
-
-      "<(skia_src_path)/effects/Sk1DPathEffect.cpp",
-      "<(skia_src_path)/effects/Sk2DPathEffect.cpp",
-      "<(skia_src_path)/effects/SkColorMatrix.cpp",
-      "<(skia_src_path)/effects/SkColorMatrixFilter.cpp",
-      "<(skia_src_path)/effects/SkCornerPathEffect.cpp",
-      "<(skia_src_path)/effects/SkDashPathEffect.cpp",
-      "<(skia_src_path)/effects/SkDiscretePathEffect.cpp",
-      "<(skia_src_path)/effects/SkEmbossMask.cpp",
-      "<(skia_src_path)/effects/SkEmbossMask.h",
-      "<(skia_src_path)/effects/SkEmbossMaskFilter.cpp",
-      "<(skia_src_path)/effects/SkHighContrastFilter.cpp",
-      "<(skia_src_path)/effects/SkLayerDrawLooper.cpp",
-      "<(skia_src_path)/effects/SkLumaColorFilter.cpp",
-      "<(skia_src_path)/effects/SkOpPathEffect.cpp",
-      "<(skia_src_path)/effects/SkOverdrawColorFilter.cpp",
-      "<(skia_src_path)/effects/SkPackBits.cpp",
-      "<(skia_src_path)/effects/SkPackBits.h",
-      "<(skia_src_path)/effects/SkShaderMaskFilter.cpp",
-      "<(skia_src_path)/effects/SkTableColorFilter.cpp",
-      "<(skia_src_path)/effects/SkTableMaskFilter.cpp",
-      "<(skia_src_path)/effects/SkTrimPathEffect.cpp",
-
-      "<(skia_src_path)/shaders/SkPerlinNoiseShader.cpp",
-      "<(skia_src_path)/shaders/gradients/Sk4fGradientBase.cpp",
-      "<(skia_src_path)/shaders/gradients/Sk4fGradientBase.h",
-      "<(skia_src_path)/shaders/gradients/Sk4fGradientPriv.h",
-      "<(skia_src_path)/shaders/gradients/Sk4fLinearGradient.cpp",
-      "<(skia_src_path)/shaders/gradients/Sk4fLinearGradient.h",
-      "<(skia_src_path)/shaders/gradients/SkGradientShader.cpp",
-      "<(skia_src_path)/shaders/gradients/SkGradientShaderPriv.h",
-      "<(skia_src_path)/shaders/gradients/SkLinearGradient.cpp",
-      "<(skia_src_path)/shaders/gradients/SkLinearGradient.h",
-      "<(skia_src_path)/shaders/gradients/SkRadialGradient.cpp",
-      "<(skia_src_path)/shaders/gradients/SkRadialGradient.h",
-      "<(skia_src_path)/shaders/gradients/SkTwoPointConicalGradient.cpp",
-      "<(skia_src_path)/shaders/gradients/SkTwoPointConicalGradient.h",
-      "<(skia_src_path)/shaders/gradients/SkSweepGradient.cpp",
-      "<(skia_src_path)/shaders/gradients/SkSweepGradient.h",
-    ],
-  },
-}
diff --git a/third_party/skia/gyp/effects_imagefilters.gypi b/third_party/skia/gyp/effects_imagefilters.gypi
deleted file mode 100644
index d281283..0000000
--- a/third_party/skia/gyp/effects_imagefilters.gypi
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Translated from: gn/effects_imagefilters.gni
-
-{
-  'variables': {
-    'skia_effects_imagefilter_public' : [
-      "<(skia_include_path)/effects/SkAlphaThresholdFilter.h",
-      "<(skia_include_path)/effects/SkArithmeticImageFilter.h",
-      "<(skia_include_path)/effects/SkBlurImageFilter.h",
-      "<(skia_include_path)/effects/SkColorFilterImageFilter.h",
-      "<(skia_include_path)/effects/SkDisplacementMapEffect.h",
-      "<(skia_include_path)/effects/SkDropShadowImageFilter.h",
-      "<(skia_include_path)/effects/SkImageFilters.h",
-      "<(skia_include_path)/effects/SkImageSource.h",
-      "<(skia_include_path)/effects/SkLightingImageFilter.h",
-      "<(skia_include_path)/effects/SkMagnifierImageFilter.h",
-      "<(skia_include_path)/effects/SkMorphologyImageFilter.h",
-      "<(skia_include_path)/effects/SkOffsetImageFilter.h",
-      "<(skia_include_path)/effects/SkPaintImageFilter.h",
-      "<(skia_include_path)/effects/SkTileImageFilter.h",
-      "<(skia_include_path)/effects/SkXfermodeImageFilter.h",
-    ],
-
-    'skia_effects_imagefilter_sources' : [
-      "<(skia_src_path)/effects/imagefilters/SkAlphaThresholdFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkArithmeticImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkColorFilterImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkComposeImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkDisplacementMapEffect.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkDropShadowImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkImageFilters.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkImageSource.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkLightingImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkMagnifierImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkMatrixConvolutionImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkMergeImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkMorphologyImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkOffsetImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkPaintImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkPictureImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkTileImageFilter.cpp",
-      "<(skia_src_path)/effects/imagefilters/SkXfermodeImageFilter.cpp",
-    ],
-
-    'skia_effects_imagefilter_sources_no_asan' : [
-      "<(skia_src_path)/effects/imagefilters/SkBlurImageFilter.cpp",
-    ],
-  },
-}
diff --git a/third_party/skia/gyp/gpu.gypi b/third_party/skia/gyp/gpu.gypi
deleted file mode 100644
index 3fb29cc..0000000
--- a/third_party/skia/gyp/gpu.gypi
+++ /dev/null
@@ -1,822 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Translated from: gn/gpu.gni
-
-{
-  'variables': {
-    'skia_gpu_sources': [
-      "<(skia_include_path)/gpu/GrBackendDrawableInfo.h",
-      "<(skia_include_path)/gpu/GrBackendSemaphore.h",
-      "<(skia_include_path)/gpu/GrBackendSurface.h",
-      "<(skia_include_path)/gpu/GrConfig.h",
-      "<(skia_include_path)/gpu/GrContextOptions.h",
-      "<(skia_include_path)/gpu/GrContext.h",
-      "<(skia_include_path)/gpu/GrContextThreadSafeProxy.h",
-      "<(skia_include_path)/gpu/GrDriverBugWorkarounds.h",
-      "<(skia_include_path)/gpu/GrGpuResource.h",
-      "<(skia_include_path)/gpu/GrSurface.h",
-      "<(skia_include_path)/gpu/GrTexture.h",
-      "<(skia_include_path)/gpu/GrTypes.h",
-
-      "<(skia_include_path)/gpu/gl/GrGLAssembleInterface.h",
-      "<(skia_include_path)/gpu/gl/GrGLConfig.h",
-      "<(skia_include_path)/gpu/gl/GrGLExtensions.h",
-      "<(skia_include_path)/gpu/gl/GrGLFunctions.h",
-      "<(skia_include_path)/gpu/gl/GrGLInterface.h",
-      "<(skia_include_path)/gpu/gl/GrGLTypes.h",
-
-      # Private includes
-      "<(skia_include_path)/private/GrContext_Base.h",
-      "<(skia_include_path)/private/GrGLTypesPriv.h",
-      "<(skia_include_path)/private/GrImageContext.h",
-      "<(skia_include_path)/private/GrRecordingContext.h",
-      "<(skia_include_path)/private/GrResourceKey.h",
-      "<(skia_include_path)/private/GrSingleOwner.h",
-      "<(skia_include_path)/private/GrTypesPriv.h",
-
-      "<(skia_src_path)/gpu/GrAppliedClip.h",
-      "<(skia_src_path)/gpu/GrAuditTrail.cpp",
-      "<(skia_src_path)/gpu/GrAuditTrail.h",
-      "<(skia_src_path)/gpu/GrAutoLocaleSetter.h",
-      "<(skia_src_path)/gpu/GrAllocator.h",
-      "<(skia_src_path)/gpu/GrBackendSurface.cpp",
-      "<(skia_src_path)/gpu/GrBackendTextureImageGenerator.cpp",
-      "<(skia_src_path)/gpu/GrBackendTextureImageGenerator.h",
-      "<(skia_src_path)/gpu/GrBlend.h",
-      "<(skia_src_path)/gpu/GrAHardwareBufferImageGenerator.cpp",
-      "<(skia_src_path)/gpu/GrAHardwareBufferImageGenerator.h",
-      "<(skia_src_path)/gpu/GrAHardwareBufferUtils.cpp",
-      "<(skia_src_path)/gpu/GrAHardwareBufferUtils.h",
-      "<(skia_src_path)/gpu/GrBaseContextPriv.h",
-      "<(skia_src_path)/gpu/GrBitmapTextureMaker.cpp",
-      "<(skia_src_path)/gpu/GrBitmapTextureMaker.h",
-      "<(skia_src_path)/gpu/GrBlurUtils.cpp",
-      "<(skia_src_path)/gpu/GrBlurUtils.h",
-      "<(skia_src_path)/gpu/GrBuffer.h",
-      "<(skia_src_path)/gpu/GrBufferAllocPool.cpp",
-      "<(skia_src_path)/gpu/GrBufferAllocPool.h",
-      "<(skia_src_path)/gpu/GrCaps.h",
-      "<(skia_src_path)/gpu/GrCaps.cpp",
-      "<(skia_src_path)/gpu/GrClientMappedBufferManager.cpp",
-      "<(skia_src_path)/gpu/GrClientMappedBufferManager.h",
-      "<(skia_src_path)/gpu/GrClip.h",
-      "<(skia_src_path)/gpu/GrClipStackClip.h",
-      "<(skia_src_path)/gpu/GrClipStackClip.cpp",
-      "<(skia_src_path)/gpu/GrColor.h",
-      "<(skia_src_path)/gpu/GrColorInfo.cpp",
-      "<(skia_src_path)/gpu/GrColorInfo.h",
-      "<(skia_src_path)/gpu/GrColorSpaceXform.cpp",
-      "<(skia_src_path)/gpu/GrColorSpaceXform.h",
-      "<(skia_src_path)/gpu/GrContext.cpp",
-      "<(skia_src_path)/gpu/GrContext_Base.cpp",
-      "<(skia_src_path)/gpu/GrContextPriv.cpp",
-      "<(skia_src_path)/gpu/GrContextPriv.h",
-      "<(skia_src_path)/gpu/GrContextThreadSafeProxy.cpp",
-      "<(skia_src_path)/gpu/GrContextThreadSafeProxyPriv.h",
-      "<(skia_src_path)/gpu/GrCoordTransform.h",
-      "<(skia_src_path)/gpu/GrCopyRenderTask.cpp",
-      "<(skia_src_path)/gpu/GrCopyRenderTask.h",
-      "<(skia_src_path)/gpu/GrCpuBuffer.h",
-      "<(skia_src_path)/gpu/GrDataUtils.h",
-      "<(skia_src_path)/gpu/GrDataUtils.cpp",
-      "<(skia_src_path)/gpu/GrDDLContext.cpp",
-      "<(skia_src_path)/gpu/GrDefaultGeoProcFactory.cpp",
-      "<(skia_src_path)/gpu/GrDefaultGeoProcFactory.h",
-      "<(skia_src_path)/gpu/GrDeferredProxyUploader.h",
-      "<(skia_src_path)/gpu/GrDeferredUpload.h",
-      "<(skia_src_path)/gpu/GrDistanceFieldGenFromVector.cpp",
-      "<(skia_src_path)/gpu/GrDistanceFieldGenFromVector.h",
-      "<(skia_src_path)/gpu/GrDrawingManager.cpp",
-      "<(skia_src_path)/gpu/GrDrawingManager.h",
-      "<(skia_src_path)/gpu/GrDrawOpAtlas.cpp",
-      "<(skia_src_path)/gpu/GrDrawOpAtlas.h",
-      "<(skia_src_path)/gpu/GrDrawOpTest.cpp",
-      "<(skia_src_path)/gpu/GrDrawOpTest.h",
-      "<(skia_src_path)/gpu/GrDriverBugWorkarounds.cpp",
-      "<(skia_src_path)/gpu/GrFixedClip.cpp",
-      "<(skia_src_path)/gpu/GrFixedClip.h",
-      "<(skia_src_path)/gpu/GrFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/GrFragmentProcessor.h",
-      "<(skia_src_path)/gpu/GrGeometryProcessor.h",
-      "<(skia_src_path)/gpu/GrGlyph.h",
-      "<(skia_src_path)/gpu/GrGpu.cpp",
-      "<(skia_src_path)/gpu/GrGpu.h",
-      "<(skia_src_path)/gpu/GrGpuBuffer.cpp",
-      "<(skia_src_path)/gpu/GrGpuBuffer.h",
-      "<(skia_src_path)/gpu/GrGpuResourceCacheAccess.h",
-      "<(skia_src_path)/gpu/GrGpuResourcePriv.h",
-      "<(skia_src_path)/gpu/GrGpuResource.cpp",
-      "<(skia_src_path)/gpu/GrImageContext.cpp",
-      "<(skia_src_path)/gpu/GrImageContextPriv.h",
-      "<(skia_src_path)/gpu/GrImageInfo.h",
-      "<(skia_src_path)/gpu/GrImageTextureMaker.cpp",
-      "<(skia_src_path)/gpu/GrImageTextureMaker.h",
-      "<(skia_src_path)/gpu/GrLegacyDirectContext.cpp",
-      "<(skia_src_path)/gpu/GrMemoryPool.cpp",
-      "<(skia_src_path)/gpu/GrMemoryPool.h",
-      "<(skia_src_path)/gpu/GrMesh.h",
-      "<(skia_src_path)/gpu/GrNativeRect.h",
-      "<(skia_src_path)/gpu/GrNonAtomicRef.h",
-      "<(skia_src_path)/gpu/GrOnFlushResourceProvider.cpp",
-      "<(skia_src_path)/gpu/GrOnFlushResourceProvider.h",
-      "<(skia_src_path)/gpu/GrOpFlushState.cpp",
-      "<(skia_src_path)/gpu/GrOpFlushState.h",
-      "<(skia_src_path)/gpu/GrOpsRenderPass.cpp",
-      "<(skia_src_path)/gpu/GrOpsRenderPass.h",
-      "<(skia_src_path)/gpu/GrOpsTask.cpp",
-      "<(skia_src_path)/gpu/GrOpsTask.h",
-      "<(skia_src_path)/gpu/GrPaint.cpp",
-      "<(skia_src_path)/gpu/GrPaint.h",
-      "<(skia_src_path)/gpu/GrPathRendererChain.cpp",
-      "<(skia_src_path)/gpu/GrPathRendererChain.h",
-      "<(skia_src_path)/gpu/GrPathRenderer.cpp",
-      "<(skia_src_path)/gpu/GrPathRenderer.h",
-      "<(skia_src_path)/gpu/GrPipeline.cpp",
-      "<(skia_src_path)/gpu/GrPipeline.h",
-      "<(skia_src_path)/gpu/GrPrimitiveProcessor.cpp",
-      "<(skia_src_path)/gpu/GrPrimitiveProcessor.h",
-      "<(skia_src_path)/gpu/GrProcessorSet.cpp",
-      "<(skia_src_path)/gpu/GrProcessorSet.h",
-      "<(skia_src_path)/gpu/GrProgramDesc.cpp",
-      "<(skia_src_path)/gpu/GrProgramDesc.h",
-      "<(skia_src_path)/gpu/GrProgramInfo.cpp",
-      "<(skia_src_path)/gpu/GrProgramInfo.h",
-      "<(skia_src_path)/gpu/GrProcessor.cpp",
-      "<(skia_src_path)/gpu/GrProcessor.h",
-      "<(skia_src_path)/gpu/GrProcessorAnalysis.cpp",
-      "<(skia_src_path)/gpu/GrProcessorAnalysis.h",
-      "<(skia_src_path)/gpu/GrProcessorUnitTest.cpp",
-      "<(skia_src_path)/gpu/GrProcessorUnitTest.h",
-      "<(skia_src_path)/gpu/GrProxyProvider.cpp",
-      "<(skia_src_path)/gpu/GrProxyProvider.h",
-      "<(skia_src_path)/gpu/GrRecordingContext.cpp",
-      "<(skia_src_path)/gpu/GrRecordingContextPriv.h",
-      "<(skia_src_path)/gpu/GrRectanizer.h",
-      "<(skia_src_path)/gpu/GrRectanizer_pow2.cpp",
-      "<(skia_src_path)/gpu/GrRectanizer_pow2.h",
-      "<(skia_src_path)/gpu/GrRectanizer_skyline.cpp",
-      "<(skia_src_path)/gpu/GrRectanizer_skyline.h",
-      "<(skia_src_path)/gpu/GrRenderTarget.cpp",
-      "<(skia_src_path)/gpu/GrRenderTarget.h",
-      "<(skia_src_path)/gpu/GrRenderTargetPriv.h",
-      "<(skia_src_path)/gpu/GrRenderTargetProxy.cpp",
-      "<(skia_src_path)/gpu/GrRenderTargetProxy.h",
-      "<(skia_src_path)/gpu/GrRenderTargetProxyPriv.h",
-      "<(skia_src_path)/gpu/GrRenderTask.cpp",
-      "<(skia_src_path)/gpu/GrRenderTask.h",
-      "<(skia_src_path)/gpu/GrReducedClip.cpp",
-      "<(skia_src_path)/gpu/GrReducedClip.h",
-      "<(skia_src_path)/gpu/GrRenderTargetContext.cpp",
-      "<(skia_src_path)/gpu/GrRenderTargetContext.h",
-      "<(skia_src_path)/gpu/GrRenderTargetContextPriv.h",
-      "<(skia_src_path)/gpu/GrResourceAllocator.cpp",
-      "<(skia_src_path)/gpu/GrResourceAllocator.h",
-      "<(skia_src_path)/gpu/GrResourceCache.cpp",
-      "<(skia_src_path)/gpu/GrResourceCache.h",
-      "<(skia_src_path)/gpu/GrResourceHandle.h",
-      "<(skia_src_path)/gpu/GrResourceProvider.cpp",
-      "<(skia_src_path)/gpu/GrResourceProvider.h",
-      "<(skia_src_path)/gpu/GrResourceProviderPriv.h",
-      "<(skia_src_path)/gpu/GrSamplePatternDictionary.h",
-      "<(skia_src_path)/gpu/GrSamplePatternDictionary.cpp",
-      "<(skia_src_path)/gpu/GrSamplerState.h",
-      "<(skia_src_path)/gpu/GrScissorState.h",
-      "<(skia_src_path)/gpu/GrSemaphore.h",
-      "<(skia_src_path)/gpu/GrShaderCaps.h",
-      "<(skia_src_path)/gpu/GrShaderCaps.cpp",
-      "<(skia_src_path)/gpu/GrShaderUtils.cpp",
-      "<(skia_src_path)/gpu/GrShaderUtils.h",
-      "<(skia_src_path)/gpu/GrShaderVar.cpp",
-      "<(skia_src_path)/gpu/GrShaderVar.h",
-      "<(skia_src_path)/gpu/GrSoftwarePathRenderer.cpp",
-      "<(skia_src_path)/gpu/GrSoftwarePathRenderer.h",
-      "<(skia_src_path)/gpu/GrStencilAttachment.cpp",
-      "<(skia_src_path)/gpu/GrStencilAttachment.h",
-      "<(skia_src_path)/gpu/GrStencilClip.h",
-      "<(skia_src_path)/gpu/GrStencilSettings.cpp",
-      "<(skia_src_path)/gpu/GrStencilSettings.h",
-      "<(skia_src_path)/gpu/GrStyle.cpp",
-      "<(skia_src_path)/gpu/GrStyle.h",
-      "<(skia_src_path)/gpu/GrSurface.cpp",
-      "<(skia_src_path)/gpu/GrSurfaceContext.cpp",
-      "<(skia_src_path)/gpu/GrSurfaceContext.h",
-      "<(skia_src_path)/gpu/GrSurfaceContextPriv.h",
-      "<(skia_src_path)/gpu/GrSurfaceProxy.cpp",
-      "<(skia_src_path)/gpu/GrSurfaceProxy.h",
-      "<(skia_src_path)/gpu/GrSurfaceProxyPriv.h",
-      "<(skia_src_path)/gpu/GrSurfacePriv.h",
-      "<(skia_src_path)/gpu/GrSwizzle.cpp",
-      "<(skia_src_path)/gpu/GrSwizzle.h",
-      "<(skia_src_path)/gpu/GrSWMaskHelper.cpp",
-      "<(skia_src_path)/gpu/GrSWMaskHelper.h",
-      "<(skia_src_path)/gpu/GrTracing.h",
-      "<(skia_src_path)/gpu/GrTransferFromRenderTask.cpp",
-      "<(skia_src_path)/gpu/GrTransferFromRenderTask.h",
-      "<(skia_src_path)/gpu/GrTessellator.cpp",
-      "<(skia_src_path)/gpu/GrTessellator.h",
-      "<(skia_src_path)/gpu/GrTestUtils.cpp",
-      "<(skia_src_path)/gpu/GrTestUtils.h",
-      "<(skia_src_path)/gpu/GrTexture.cpp",
-      "<(skia_src_path)/gpu/GrTextureAdjuster.cpp",
-      "<(skia_src_path)/gpu/GrTextureAdjuster.h",
-      "<(skia_src_path)/gpu/GrTextureContext.cpp",
-      "<(skia_src_path)/gpu/GrTextureContext.h",
-      "<(skia_src_path)/gpu/GrTextureMaker.cpp",
-      "<(skia_src_path)/gpu/GrTextureMaker.h",
-      "<(skia_src_path)/gpu/GrTexturePriv.h",
-      "<(skia_src_path)/gpu/GrTextureProducer.cpp",
-      "<(skia_src_path)/gpu/GrTextureProducer.h",
-      "<(skia_src_path)/gpu/GrTextureProxy.cpp",
-      "<(skia_src_path)/gpu/GrTextureProxy.h",
-      "<(skia_src_path)/gpu/GrTextureProxyCacheAccess.h",
-      "<(skia_src_path)/gpu/GrTextureProxyPriv.h",
-      "<(skia_src_path)/gpu/GrTextureRenderTargetProxy.cpp",
-      "<(skia_src_path)/gpu/GrTextureRenderTargetProxy.h",
-      "<(skia_src_path)/gpu/GrTextureResolveManager.h",
-      "<(skia_src_path)/gpu/GrTextureResolveRenderTask.cpp",
-      "<(skia_src_path)/gpu/GrTextureResolveRenderTask.h",
-      "<(skia_src_path)/gpu/GrTRecorder.h",
-      "<(skia_src_path)/gpu/GrUserStencilSettings.h",
-      "<(skia_src_path)/gpu/GrWaitRenderTask.cpp",
-      "<(skia_src_path)/gpu/GrWaitRenderTask.h",
-      "<(skia_src_path)/gpu/GrWindowRectangles.h",
-      "<(skia_src_path)/gpu/GrWindowRectsState.h",
-      "<(skia_src_path)/gpu/GrXferProcessor.cpp",
-      "<(skia_src_path)/gpu/GrXferProcessor.h",
-      "<(skia_src_path)/gpu/GrYUVProvider.cpp",
-      "<(skia_src_path)/gpu/GrYUVProvider.h",
-
-      # Ops
-      "<(skia_src_path)/gpu/ops/GrAAConvexTessellator.cpp",
-      "<(skia_src_path)/gpu/ops/GrAAConvexTessellator.h",
-      "<(skia_src_path)/gpu/ops/GrAAConvexPathRenderer.cpp",
-      "<(skia_src_path)/gpu/ops/GrAAConvexPathRenderer.h",
-      "<(skia_src_path)/gpu/ops/GrAAHairLinePathRenderer.cpp",
-      "<(skia_src_path)/gpu/ops/GrAAHairLinePathRenderer.h",
-      "<(skia_src_path)/gpu/ops/GrAALinearizingConvexPathRenderer.cpp",
-      "<(skia_src_path)/gpu/ops/GrAALinearizingConvexPathRenderer.h",
-      "<(skia_src_path)/gpu/ops/GrAtlasTextOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrAtlasTextOp.h",
-      "<(skia_src_path)/gpu/ops/GrClearOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrClearOp.h",
-      "<(skia_src_path)/gpu/ops/GrClearStencilClipOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrClearStencilClipOp.h",
-      "<(skia_src_path)/gpu/ops/GrDashLinePathRenderer.cpp",
-      "<(skia_src_path)/gpu/ops/GrDashLinePathRenderer.h",
-      "<(skia_src_path)/gpu/ops/GrDashOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrDashOp.h",
-      "<(skia_src_path)/gpu/ops/GrDefaultPathRenderer.cpp",
-      "<(skia_src_path)/gpu/ops/GrDefaultPathRenderer.h",
-      "<(skia_src_path)/gpu/ops/GrDebugMarkerOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrDebugMarkerOp.h",
-      "<(skia_src_path)/gpu/ops/GrDrawableOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrDrawableOp.h",
-      "<(skia_src_path)/gpu/ops/GrDrawAtlasOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrDrawAtlasOp.h",
-      "<(skia_src_path)/gpu/ops/GrDrawOp.h",
-      "<(skia_src_path)/gpu/ops/GrDrawVerticesOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrDrawVerticesOp.h",
-      "<(skia_src_path)/gpu/ops/GrFillRectOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrFillRectOp.h",
-      "<(skia_src_path)/gpu/ops/GrFillRRectOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrFillRRectOp.h",
-      "<(skia_src_path)/gpu/ops/GrMeshDrawOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrMeshDrawOp.h",
-      "<(skia_src_path)/gpu/ops/GrLatticeOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrLatticeOp.h",
-      "<(skia_src_path)/gpu/ops/GrOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrOp.h",
-      "<(skia_src_path)/gpu/ops/GrOvalOpFactory.cpp",
-      "<(skia_src_path)/gpu/ops/GrOvalOpFactory.h",
-      "<(skia_src_path)/gpu/ops/GrQuadPerEdgeAA.cpp",
-      "<(skia_src_path)/gpu/ops/GrQuadPerEdgeAA.h",
-      "<(skia_src_path)/gpu/ops/GrRegionOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrRegionOp.h",
-      "<(skia_src_path)/gpu/ops/GrShadowRRectOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrShadowRRectOp.h",
-      "<(skia_src_path)/gpu/ops/GrSimpleMeshDrawOpHelper.cpp",
-      "<(skia_src_path)/gpu/ops/GrSimpleMeshDrawOpHelper.h",
-      "<(skia_src_path)/gpu/ops/GrSmallPathRenderer.cpp",
-      "<(skia_src_path)/gpu/ops/GrSmallPathRenderer.h",
-      "<(skia_src_path)/gpu/ops/GrStrokeRectOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrStrokeRectOp.h",
-      "<(skia_src_path)/gpu/ops/GrTessellatingPathRenderer.cpp",
-      "<(skia_src_path)/gpu/ops/GrTessellatingPathRenderer.h",
-      "<(skia_src_path)/gpu/ops/GrTextureOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrTextureOp.h",
-
-      "<(skia_src_path)/gpu/effects/GrCoverageSetOpXP.cpp",
-      "<(skia_src_path)/gpu/effects/GrCoverageSetOpXP.h",
-      "<(skia_src_path)/gpu/effects/GrCustomXfermode.cpp",
-      "<(skia_src_path)/gpu/effects/GrCustomXfermode.h",
-      "<(skia_src_path)/gpu/effects/GrBezierEffect.cpp",
-      "<(skia_src_path)/gpu/effects/GrBezierEffect.h",
-      "<(skia_src_path)/gpu/effects/GrConvexPolyEffect.cpp",
-      "<(skia_src_path)/gpu/effects/GrConvexPolyEffect.h",
-      "<(skia_src_path)/gpu/effects/GrBicubicEffect.cpp",
-      "<(skia_src_path)/gpu/effects/GrBicubicEffect.h",
-      "<(skia_src_path)/gpu/effects/GrBitmapTextGeoProc.cpp",
-      "<(skia_src_path)/gpu/effects/GrBitmapTextGeoProc.h",
-      "<(skia_src_path)/gpu/effects/GrDisableColorXP.cpp",
-      "<(skia_src_path)/gpu/effects/GrDisableColorXP.h",
-      "<(skia_src_path)/gpu/effects/GrDistanceFieldGeoProc.cpp",
-      "<(skia_src_path)/gpu/effects/GrDistanceFieldGeoProc.h",
-      "<(skia_src_path)/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/GrGaussianConvolutionFragmentProcessor.h",
-      "<(skia_src_path)/gpu/effects/GrMatrixConvolutionEffect.cpp",
-      "<(skia_src_path)/gpu/effects/GrMatrixConvolutionEffect.h",
-      "<(skia_src_path)/gpu/effects/GrOvalEffect.cpp",
-      "<(skia_src_path)/gpu/effects/GrOvalEffect.h",
-      "<(skia_src_path)/gpu/effects/GrPorterDuffXferProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/GrPorterDuffXferProcessor.h",
-      "<(skia_src_path)/gpu/effects/GrRRectEffect.cpp",
-      "<(skia_src_path)/gpu/effects/GrRRectEffect.h",
-      "<(skia_src_path)/gpu/effects/GrShadowGeoProc.cpp",
-      "<(skia_src_path)/gpu/effects/GrShadowGeoProc.h",
-      "<(skia_src_path)/gpu/effects/GrSkSLFP.cpp",
-      "<(skia_src_path)/gpu/effects/GrSkSLFP.h",
-      "<(skia_src_path)/gpu/effects/GrSRGBEffect.cpp",
-      "<(skia_src_path)/gpu/effects/GrSRGBEffect.h",
-      "<(skia_src_path)/gpu/effects/GrTextureDomain.cpp",
-      "<(skia_src_path)/gpu/effects/GrTextureDomain.h",
-      "<(skia_src_path)/gpu/effects/GrXfermodeFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/GrXfermodeFragmentProcessor.h",
-      "<(skia_src_path)/gpu/effects/GrYUVtoRGBEffect.cpp",
-      "<(skia_src_path)/gpu/effects/GrYUVtoRGBEffect.h",
-
-      "<(skia_src_path)/gpu/geometry/GrPathUtils.cpp",
-      "<(skia_src_path)/gpu/geometry/GrPathUtils.h",
-      "<(skia_src_path)/gpu/geometry/GrQuad.cpp",
-      "<(skia_src_path)/gpu/geometry/GrQuad.h",
-      "<(skia_src_path)/gpu/geometry/GrQuadBuffer.h",
-      "<(skia_src_path)/gpu/geometry/GrQuadUtils.cpp",
-      "<(skia_src_path)/gpu/geometry/GrQuadUtils.h",
-      "<(skia_src_path)/gpu/geometry/GrRect.h",
-      "<(skia_src_path)/gpu/geometry/GrShape.cpp",
-      "<(skia_src_path)/gpu/geometry/GrShape.h",
-
-      "<(skia_src_path)/gpu/effects/generated/GrAARectEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrAARectEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrAlphaThresholdFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrAlphaThresholdFragmentProcessor.h",
-      "<(skia_src_path)/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrBlurredEdgeFragmentProcessor.h",
-      "<(skia_src_path)/gpu/effects/generated/GrCircleBlurFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrCircleBlurFragmentProcessor.h",
-      "<(skia_src_path)/gpu/effects/generated/GrCircleEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrCircleEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrColorMatrixFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrColorMatrixFragmentProcessor.h",
-      "<(skia_src_path)/gpu/effects/generated/GrComposeLerpEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrComposeLerpEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrComposeLerpRedEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrComposeLerpRedEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrConfigConversionEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrConfigConversionEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrConstColorProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrConstColorProcessor.h",
-      "<(skia_src_path)/gpu/effects/generated/GrEllipseEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrEllipseEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrLumaColorFilterEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrLumaColorFilterEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrMagnifierEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrMagnifierEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrMixerEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrMixerEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrOverrideInputFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrOverrideInputFragmentProcessor.h",
-      "<(skia_src_path)/gpu/effects/generated/GrPremulInputFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrPremulInputFragmentProcessor.h",
-      "<(skia_src_path)/gpu/effects/generated/GrRectBlurEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrRectBlurEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrRRectBlurEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrRRectBlurEffect.h",
-      "<(skia_src_path)/gpu/effects/generated/GrSaturateProcessor.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrSaturateProcessor.h",
-      "<(skia_src_path)/gpu/effects/generated/GrSimpleTextureEffect.cpp",
-      "<(skia_src_path)/gpu/effects/generated/GrSimpleTextureEffect.h",
-
-      # gradients
-      "<(skia_src_path)/gpu/gradients/GrGradientBitmapCache.cpp",
-      "<(skia_src_path)/gpu/gradients/GrGradientBitmapCache.h",
-      "<(skia_src_path)/gpu/gradients/GrGradientShader.cpp",
-      "<(skia_src_path)/gpu/gradients/GrGradientShader.h",
-
-      "<(skia_src_path)/gpu/gradients/generated/GrDualIntervalGradientColorizer.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrDualIntervalGradientColorizer.h",
-      "<(skia_src_path)/gpu/gradients/generated/GrSingleIntervalGradientColorizer.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrSingleIntervalGradientColorizer.h",
-      "<(skia_src_path)/gpu/gradients/generated/GrTextureGradientColorizer.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrTextureGradientColorizer.h",
-      "<(skia_src_path)/gpu/gradients/generated/GrUnrolledBinaryGradientColorizer.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrUnrolledBinaryGradientColorizer.h",
-      "<(skia_src_path)/gpu/gradients/generated/GrLinearGradientLayout.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrLinearGradientLayout.h",
-      "<(skia_src_path)/gpu/gradients/generated/GrRadialGradientLayout.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrRadialGradientLayout.h",
-      "<(skia_src_path)/gpu/gradients/generated/GrSweepGradientLayout.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrSweepGradientLayout.h",
-      "<(skia_src_path)/gpu/gradients/generated/GrTwoPointConicalGradientLayout.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrTwoPointConicalGradientLayout.h",
-      "<(skia_src_path)/gpu/gradients/generated/GrClampedGradientEffect.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrClampedGradientEffect.h",
-      "<(skia_src_path)/gpu/gradients/generated/GrTiledGradientEffect.cpp",
-      "<(skia_src_path)/gpu/gradients/generated/GrTiledGradientEffect.h",
-
-      # text
-      "<(skia_src_path)/gpu/text/GrAtlasManager.cpp",
-      "<(skia_src_path)/gpu/text/GrAtlasManager.h",
-      "<(skia_src_path)/gpu/text/GrDistanceFieldAdjustTable.cpp",
-      "<(skia_src_path)/gpu/text/GrDistanceFieldAdjustTable.h",
-      "<(skia_src_path)/gpu/text/GrSDFMaskFilter.cpp",
-      "<(skia_src_path)/gpu/text/GrSDFMaskFilter.h",
-      "<(skia_src_path)/gpu/text/GrStrikeCache.cpp",
-      "<(skia_src_path)/gpu/text/GrStrikeCache.h",
-      "<(skia_src_path)/gpu/text/GrTextBlob.cpp",
-      "<(skia_src_path)/gpu/text/GrTextBlob.h",
-      "<(skia_src_path)/gpu/text/GrTextBlobCache.cpp",
-      "<(skia_src_path)/gpu/text/GrTextBlobCache.h",
-      "<(skia_src_path)/gpu/text/GrTextContext.cpp",
-      "<(skia_src_path)/gpu/text/GrTextContext.h",
-      "<(skia_src_path)/gpu/text/GrTextBlobVertexRegenerator.cpp",
-      "<(skia_src_path)/gpu/text/GrTextTarget.h",
-
-      "<(skia_src_path)/gpu/gl/GrGLAssembleGLESInterfaceAutogen.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLAssembleGLInterfaceAutogen.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLAssembleHelpers.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLAssembleInterface.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLAssembleWebGLInterfaceAutogen.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLBuffer.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLBuffer.h",
-      "<(skia_src_path)/gpu/gl/GrGLCaps.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLCaps.h",
-      "<(skia_src_path)/gpu/gl/GrGLContext.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLContext.h",
-      "<(skia_src_path)/gpu/gl/GrGLMakeNativeInterface_none.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLDefines.h",
-      "<(skia_src_path)/gpu/gl/GrGLGLSL.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLGLSL.h",
-      "<(skia_src_path)/gpu/gl/GrGLGpu.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLGpu.h",
-      "<(skia_src_path)/gpu/gl/GrGLGpuProgramCache.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLExtensions.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLInterfaceAutogen.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLOpsRenderPass.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLOpsRenderPass.h",
-      "<(skia_src_path)/gpu/gl/GrGLProgram.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLProgram.h",
-      "<(skia_src_path)/gpu/gl/GrGLProgramDataManager.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLProgramDataManager.h",
-      "<(skia_src_path)/gpu/gl/GrGLRenderTarget.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLRenderTarget.h",
-      "<(skia_src_path)/gpu/gl/GrGLSemaphore.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLSemaphore.h",
-      "<(skia_src_path)/gpu/gl/GrGLStencilAttachment.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLStencilAttachment.h",
-      "<(skia_src_path)/gpu/gl/GrGLTexture.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLTexture.h",
-      "<(skia_src_path)/gpu/gl/GrGLTextureRenderTarget.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLTextureRenderTarget.h",
-      "<(skia_src_path)/gpu/gl/GrGLTypesPriv.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLUtil.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLUtil.h",
-      "<(skia_src_path)/gpu/gl/GrGLUniformHandler.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLUniformHandler.h",
-      "<(skia_src_path)/gpu/gl/GrGLVaryingHandler.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLVaryingHandler.h",
-      "<(skia_src_path)/gpu/gl/GrGLVertexArray.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLVertexArray.h",
-
-      # Files for building GLSL shaders
-      "<(skia_src_path)/gpu/gl/builders/GrGLProgramBuilder.cpp",
-      "<(skia_src_path)/gpu/gl/builders/GrGLProgramBuilder.h",
-      "<(skia_src_path)/gpu/gl/builders/GrGLShaderStringBuilder.cpp",
-      "<(skia_src_path)/gpu/gl/builders/GrGLShaderStringBuilder.h",
-
-      # GLSL
-      "<(skia_src_path)/gpu/glsl/GrGLSL.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSL.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLBlend.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLBlend.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLColorSpaceXformHelper.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLFragmentProcessor.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLFragmentProcessor.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLFragmentShaderBuilder.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLGeometryProcessor.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLGeometryProcessor.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLPrimitiveProcessor.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLPrimitiveProcessor.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLProgramBuilder.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLProgramBuilder.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLProgramDataManager.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLProgramDataManager.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLShaderBuilder.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLShaderBuilder.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLUniformHandler.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLUtil.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLUtil.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLVarying.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLVarying.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLVertexGeoBuilder.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLVertexGeoBuilder.h",
-      "<(skia_src_path)/gpu/glsl/GrGLSLXferProcessor.cpp",
-      "<(skia_src_path)/gpu/glsl/GrGLSLXferProcessor.h",
-
-      # Mock
-      "<(skia_src_path)/gpu/mock/GrMockBuffer.h",
-      "<(skia_src_path)/gpu/mock/GrMockCaps.cpp",
-      "<(skia_src_path)/gpu/mock/GrMockCaps.h",
-      "<(skia_src_path)/gpu/mock/GrMockGpu.cpp",
-      "<(skia_src_path)/gpu/mock/GrMockGpu.h",
-      "<(skia_src_path)/gpu/mock/GrMockOpsRenderPass.h",
-      "<(skia_src_path)/gpu/mock/GrMockStencilAttachment.h",
-      "<(skia_src_path)/gpu/mock/GrMockTexture.h",
-      "<(skia_src_path)/gpu/mock/GrMockTypes.cpp",
-
-      # Sk files
-      "<(skia_src_path)/gpu/SkGpuDevice.cpp",
-      "<(skia_src_path)/gpu/SkGpuDevice.h",
-      "<(skia_src_path)/gpu/SkGpuDevice_drawTexture.cpp",
-      "<(skia_src_path)/gpu/SkGr.h",
-      "<(skia_src_path)/gpu/SkGr.cpp",
-
-      "<(skia_src_path)/image/SkImage_Gpu.h",
-      "<(skia_src_path)/image/SkImage_Gpu.cpp",
-      "<(skia_src_path)/image/SkImage_GpuBase.h",
-      "<(skia_src_path)/image/SkImage_GpuBase.cpp",
-      "<(skia_src_path)/image/SkImage_GpuYUVA.h",
-      "<(skia_src_path)/image/SkImage_GpuYUVA.cpp",
-      "<(skia_src_path)/image/SkSurface_Gpu.h",
-      "<(skia_src_path)/image/SkSurface_Gpu.cpp", 
-    ],
-
-    'skia_ccpr_sources': [
-      # coverage counting path renderer
-      "<(skia_src_path)/gpu/ccpr/GrCCAtlas.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCAtlas.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCClipPath.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCClipPath.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCClipProcessor.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCClipProcessor.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCConicShader.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCConicShader.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCCoverageProcessor.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCCoverageProcessor.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCCubicShader.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCCubicShader.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCDrawPathsOp.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCDrawPathsOp.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCFiller.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCFiller.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCFillGeometry.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCFillGeometry.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCPathCache.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCPathCache.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCPathProcessor.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCPathProcessor.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCPerFlushResources.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCPerFlushResources.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCPerOpsTaskPaths.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCQuadraticShader.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCQuadraticShader.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCStrokeGeometry.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCStrokeGeometry.h",
-      "<(skia_src_path)/gpu/ccpr/GrCCStroker.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCCStroker.h",
-      "<(skia_src_path)/gpu/ccpr/GrCoverageCountingPathRenderer.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrCoverageCountingPathRenderer.h",
-      "<(skia_src_path)/gpu/ccpr/GrGSCoverageProcessor.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrGSCoverageProcessor.h",
-      "<(skia_src_path)/gpu/ccpr/GrOctoBounds.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrOctoBounds.h",
-      "<(skia_src_path)/gpu/ccpr/GrSampleMaskProcessor.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrSampleMaskProcessor.h",
-      "<(skia_src_path)/gpu/ccpr/GrStencilAtlasOp.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrStencilAtlasOp.h",
-      "<(skia_src_path)/gpu/ccpr/GrVSCoverageProcessor.cpp",
-      "<(skia_src_path)/gpu/ccpr/GrVSCoverageProcessor.h",
-    ],
-
-    'skia_nvpr_sources': [
-      "<(skia_src_path)/gpu/GrPath.cpp",
-      "<(skia_src_path)/gpu/GrPath.h",
-      "<(skia_src_path)/gpu/GrPathProcessor.cpp",
-      "<(skia_src_path)/gpu/GrPathProcessor.h",
-      "<(skia_src_path)/gpu/GrPathRendering.cpp",
-      "<(skia_src_path)/gpu/GrPathRendering.h",
-      "<(skia_src_path)/gpu/gl/GrGLPath.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLPath.h",
-      "<(skia_src_path)/gpu/gl/GrGLPathRendering.cpp",
-      "<(skia_src_path)/gpu/gl/GrGLPathRendering.h",
-      "<(skia_src_path)/gpu/ops/GrDrawPathOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrDrawPathOp.h",
-      "<(skia_src_path)/gpu/ops/GrStencilAndCoverPathRenderer.cpp",
-      "<(skia_src_path)/gpu/ops/GrStencilAndCoverPathRenderer.h",
-      "<(skia_src_path)/gpu/ops/GrStencilPathOp.cpp",
-      "<(skia_src_path)/gpu/ops/GrStencilPathOp.h",
-    ],
-
-    'skia_null_gpu_sources': [],
-
-    'skia_vk_sources': [
-      "<(skia_include_path)/gpu/vk/GrVkBackendContext.h",
-      "<(skia_include_path)/gpu/vk/GrVkExtensions.h",
-      "<(skia_include_path)/gpu/vk/GrVkMemoryAllocator.h",
-      "<(skia_include_path)/gpu/vk/GrVkTypes.h",
-      "<(skia_include_path)/gpu/vk/GrVkVulkan.h",
-      "<(skia_include_path)/private/GrVkTypesPriv.h",
-      "<(skia_src_path)/gpu/vk/GrVkAMDMemoryAllocator.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkAMDMemoryAllocator.h",
-      "<(skia_src_path)/gpu/vk/GrVkBuffer.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkBuffer.h",
-      "<(skia_src_path)/gpu/vk/GrVkBufferView.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkBufferView.h",
-      "<(skia_src_path)/gpu/vk/GrVkCaps.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkCaps.h",
-      "<(skia_src_path)/gpu/vk/GrVkCommandBuffer.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkCommandBuffer.h",
-      "<(skia_src_path)/gpu/vk/GrVkCommandPool.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkCommandPool.h",
-      "<(skia_src_path)/gpu/vk/GrVkDescriptorPool.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkDescriptorPool.h",
-      "<(skia_src_path)/gpu/vk/GrVkDescriptorSet.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkDescriptorSet.h",
-      "<(skia_src_path)/gpu/vk/GrVkDescriptorSetManager.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkDescriptorSetManager.h",
-      "<(skia_src_path)/gpu/vk/GrVkExtensions.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkFramebuffer.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkFramebuffer.h",
-      "<(skia_src_path)/gpu/vk/GrVkGpu.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkGpu.h",
-      "<(skia_src_path)/gpu/vk/GrVkImage.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkImage.h",
-      "<(skia_src_path)/gpu/vk/GrVkImageLayout.h",
-      "<(skia_src_path)/gpu/vk/GrVkImageView.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkImageView.h",
-      "<(skia_src_path)/gpu/vk/GrVkIndexBuffer.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkIndexBuffer.h",
-      "<(skia_src_path)/gpu/vk/GrVkInterface.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkInterface.h",
-      "<(skia_src_path)/gpu/vk/GrVkMemory.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkMemory.h",
-      "<(skia_src_path)/gpu/vk/GrVkOpsRenderPass.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkOpsRenderPass.h",
-      "<(skia_src_path)/gpu/vk/GrVkPipeline.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkPipeline.h",
-      "<(skia_src_path)/gpu/vk/GrVkPipelineState.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkPipelineState.h",
-      "<(skia_src_path)/gpu/vk/GrVkPipelineStateBuilder.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkPipelineStateBuilder.h",
-      "<(skia_src_path)/gpu/vk/GrVkPipelineStateCache.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkPipelineStateDataManager.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkPipelineStateDataManager.h",
-      "<(skia_src_path)/gpu/vk/GrVkRenderPass.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkRenderPass.h",
-      "<(skia_src_path)/gpu/vk/GrVkRenderTarget.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkRenderTarget.h",
-      "<(skia_src_path)/gpu/vk/GrVkResource.h",
-      "<(skia_src_path)/gpu/vk/GrVkResourceProvider.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkResourceProvider.h",
-      "<(skia_src_path)/gpu/vk/GrVkSampler.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkSampler.h",
-      "<(skia_src_path)/gpu/vk/GrVkSamplerYcbcrConversion.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkSamplerYcbcrConversion.h",
-      "<(skia_src_path)/gpu/vk/GrVkSecondaryCBDrawContext.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkSecondaryCBDrawContext.h",
-      "<(skia_src_path)/gpu/vk/GrVkSemaphore.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkSemaphore.h",
-      "<(skia_src_path)/gpu/vk/GrVkStencilAttachment.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkStencilAttachment.h",
-      "<(skia_src_path)/gpu/vk/GrVkTexture.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkTexture.h",
-      "<(skia_src_path)/gpu/vk/GrVkTextureRenderTarget.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkTextureRenderTarget.h",
-      "<(skia_src_path)/gpu/vk/GrVkTransferBuffer.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkTransferBuffer.h",
-      "<(skia_src_path)/gpu/vk/GrVkTypesPriv.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkUniformBuffer.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkUniformBuffer.h",
-      "<(skia_src_path)/gpu/vk/GrVkUniformHandler.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkUniformHandler.h",
-      "<(skia_src_path)/gpu/vk/GrVkUtil.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkUtil.h",
-      "<(skia_src_path)/gpu/vk/GrVkVaryingHandler.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkVaryingHandler.h",
-      "<(skia_src_path)/gpu/vk/GrVkVertexBuffer.cpp",
-      "<(skia_src_path)/gpu/vk/GrVkVertexBuffer.h",
-    ],
-
-    'skia_dawn_sources': [
-      "<(skia_include_path)/gpu/dawn/GrDawnTypes.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnBuffer.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnBuffer.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnCaps.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnCaps.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnGpu.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnGpu.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnOpsRenderPass.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnOpsRenderPass.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnProgramDataManager.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnProgramDataManager.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnProgramBuilder.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnProgramBuilder.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnRenderTarget.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnRenderTarget.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnRingBuffer.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnRingBuffer.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnStencilAttachment.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnStencilAttachment.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnStagingManager.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnStagingManager.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnTexture.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnTexture.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnTextureRenderTarget.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnTextureRenderTarget.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnUniformHandler.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnUniformHandler.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnUtil.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnUtil.h",
-      "<(skia_src_path)/gpu/dawn/GrDawnVaryingHandler.cpp",
-      "<(skia_src_path)/gpu/dawn/GrDawnVaryingHandler.h",
-    ],
-
-    'skia_metal_sources': [
-      "<(skia_include_path)/gpu/mtl/GrMtlTypes.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlBuffer.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlBuffer.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlCaps.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlCaps.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlCommandBuffer.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlCommandBuffer.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlCppUtil.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlDepthStencil.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlDepthStencil.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlGpu.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlGpu.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlOpsRenderPass.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlOpsRenderPass.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlPipelineState.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlPipelineState.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlPipelineStateBuilder.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlPipelineStateBuilder.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlPipelineStateDataManager.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlPipelineStateDataManager.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlRenderTarget.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlRenderTarget.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlResourceProvider.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlResourceProvider.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlSampler.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlSampler.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlSemaphore.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlSemaphore.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlStencilAttachment.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlStencilAttachment.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlTexture.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlTexture.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlTextureRenderTarget.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlTextureRenderTarget.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlTrampoline.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlTrampoline.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlUniformHandler.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlUniformHandler.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlUtil.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlUtil.mm",
-      "<(skia_src_path)/gpu/mtl/GrMtlVaryingHandler.h",
-      "<(skia_src_path)/gpu/mtl/GrMtlVaryingHandler.mm",
-      "<(skia_src_path)/image/SkSurface_GpuMtl.mm",
-    ],
-
-    'skia_native_gpu_sources': [
-      "<(skia_src_path)/gpu/gl/mac/GrGLMakeNativeInterface_mac.cpp",
-      "<(skia_src_path)/gpu/gl/win/GrGLMakeNativeInterface_win.cpp",
-      "<(skia_src_path)/gpu/gl/glx/GrGLMakeNativeInterface_glx.cpp",
-      "<(skia_src_path)/gpu/gl/egl/GrGLMakeNativeInterface_egl.cpp",
-      "<(skia_src_path)/gpu/gl/iOS/GrGLMakeNativeInterface_iOS.cpp",
-      "<(skia_src_path)/gpu/gl/android/GrGLMakeNativeInterface_android.cpp",
-    ],
-
-    'skia_atlas_text_sources': [
-      "<(skia_include_path)/atlastext/SkAtlasTextContext.h",
-      "<(skia_include_path)/atlastext/SkAtlasTextFont.h",
-      "<(skia_include_path)/atlastext/SkAtlasTextRenderer.h",
-      "<(skia_include_path)/atlastext/SkAtlasTextTarget.h",
-
-      "<(skia_src_path)/atlastext/SkAtlasTextContext.cpp",
-      "<(skia_src_path)/atlastext/SkAtlasTextTarget.cpp",
-      "<(skia_src_path)/atlastext/SkInternalAtlasTextContext.cpp",
-    ],
-  },
-}
diff --git a/third_party/skia/gyp/utils.gypi b/third_party/skia/gyp/utils.gypi
deleted file mode 100644
index d088207..0000000
--- a/third_party/skia/gyp/utils.gypi
+++ /dev/null
@@ -1,115 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Translated from: gn/utils.gni
-
-{
-  'variables': {
-    'skia_utils_public': [
-      "<(skia_include_path)/utils/SkAnimCodecPlayer.h",
-      "<(skia_include_path)/utils/SkBase64.h",
-      "<(skia_include_path)/utils/SkCamera.h",
-      "<(skia_include_path)/utils/SkCanvasStateUtils.h",
-      "<(skia_include_path)/utils/SkEventTracer.h",
-      "<(skia_include_path)/utils/SkFrontBufferedStream.h",
-      "<(skia_include_path)/utils/SkInterpolator.h",
-      "<(skia_include_path)/utils/SkNWayCanvas.h",
-      "<(skia_include_path)/utils/SkNoDrawCanvas.h",
-      "<(skia_include_path)/utils/SkNullCanvas.h",
-      "<(skia_include_path)/utils/SkPaintFilterCanvas.h",
-      "<(skia_include_path)/utils/SkParse.h",
-      "<(skia_include_path)/utils/SkParsePath.h",
-      "<(skia_include_path)/utils/SkRandom.h",
-      "<(skia_include_path)/utils/SkShadowUtils.h",
-
-      #mac
-      "<(skia_include_path)/utils/mac/SkCGUtils.h",
-    ],
-
-    'skia_utils_sources': [
-      "<(skia_src_path)/utils/Sk3D.cpp",
-      "<(skia_src_path)/utils/SkAnimCodecPlayer.cpp",
-      "<(skia_src_path)/utils/SkBase64.cpp",
-      "<(skia_src_path)/utils/SkBitSet.h",
-      "<(skia_src_path)/utils/SkCallableTraits.h",
-      "<(skia_src_path)/utils/SkCamera.cpp",
-      "<(skia_src_path)/utils/SkCanvasStack.h",
-      "<(skia_src_path)/utils/SkCanvasStack.cpp",
-      "<(skia_src_path)/utils/SkCanvasStateUtils.cpp",
-      "<(skia_src_path)/utils/SkCharToGlyphCache.cpp",
-      "<(skia_src_path)/utils/SkCharToGlyphCache.h",
-      "<(skia_src_path)/utils/SkDashPath.cpp",
-      "<(skia_src_path)/utils/SkDashPathPriv.h",
-      "<(skia_src_path)/utils/SkEventTracer.cpp",
-      "<(skia_src_path)/utils/SkFloatToDecimal.cpp",
-      "<(skia_src_path)/utils/SkFloatToDecimal.h",
-      "<(skia_src_path)/utils/SkFloatUtils.h",
-      "<(skia_src_path)/utils/SkFrontBufferedStream.cpp",
-      "<(skia_src_path)/utils/SkInterpolator.cpp",
-      "<(skia_src_path)/utils/SkJSON.cpp",
-      "<(skia_src_path)/utils/SkJSON.h",
-      "<(skia_src_path)/utils/SkJSONWriter.cpp",
-      "<(skia_src_path)/utils/SkJSONWriter.h",
-      "<(skia_src_path)/utils/SkMatrix22.cpp",
-      "<(skia_src_path)/utils/SkMatrix22.h",
-      "<(skia_src_path)/utils/SkMultiPictureDocument.cpp",
-      "<(skia_src_path)/utils/SkNWayCanvas.cpp",
-      "<(skia_src_path)/utils/SkNullCanvas.cpp",
-      "<(skia_src_path)/utils/SkOSPath.cpp",
-      "<(skia_src_path)/utils/SkOSPath.h",
-      "<(skia_src_path)/utils/SkPaintFilterCanvas.cpp",
-      "<(skia_src_path)/utils/SkParse.cpp",
-      "<(skia_src_path)/utils/SkParseColor.cpp",
-      "<(skia_src_path)/utils/SkParsePath.cpp",
-      "<(skia_src_path)/utils/SkPatchUtils.cpp",
-      "<(skia_src_path)/utils/SkPatchUtils.h",
-      "<(skia_src_path)/utils/SkPolyUtils.cpp",
-      "<(skia_src_path)/utils/SkPolyUtils.h",
-      "<(skia_src_path)/utils/SkShadowTessellator.cpp",
-      "<(skia_src_path)/utils/SkShadowTessellator.h",
-      "<(skia_src_path)/utils/SkShadowUtils.cpp",
-      "<(skia_src_path)/utils/SkShaperJSONWriter.h",
-      "<(skia_src_path)/utils/SkShaperJSONWriter.cpp",
-      "<(skia_src_path)/utils/SkTextUtils.cpp",
-      "<(skia_src_path)/utils/SkThreadUtils_pthread.cpp",
-      "<(skia_src_path)/utils/SkThreadUtils_win.cpp",
-      "<(skia_src_path)/utils/SkUTF.cpp",
-      "<(skia_src_path)/utils/SkUTF.h",
-      "<(skia_src_path)/utils/SkWhitelistTypefaces.cpp",
-
-      #mac
-      "<(skia_src_path)/utils/mac/SkCreateCGImageRef.cpp",
-      "<(skia_src_path)/utils/mac/SkUniqueCFRef.h",
-
-      #windows
-      "<(skia_src_path)/utils/win/SkAutoCoInitialize.h",
-      "<(skia_src_path)/utils/win/SkAutoCoInitialize.cpp",
-      "<(skia_src_path)/utils/win/SkDWrite.h",
-      "<(skia_src_path)/utils/win/SkDWrite.cpp",
-      "<(skia_src_path)/utils/win/SkDWriteFontFileStream.cpp",
-      "<(skia_src_path)/utils/win/SkDWriteFontFileStream.h",
-      "<(skia_src_path)/utils/win/SkDWriteGeometrySink.cpp",
-      "<(skia_src_path)/utils/win/SkDWriteGeometrySink.h",
-      "<(skia_src_path)/utils/win/SkDWriteNTDDI_VERSION.h",
-      "<(skia_src_path)/utils/win/SkHRESULT.h",
-      "<(skia_src_path)/utils/win/SkHRESULT.cpp",
-      "<(skia_src_path)/utils/win/SkIStream.h",
-      "<(skia_src_path)/utils/win/SkIStream.cpp",
-      "<(skia_src_path)/utils/win/SkObjBase.h",
-      "<(skia_src_path)/utils/win/SkTScopedComPtr.h",
-      "<(skia_src_path)/utils/win/SkWGL.h",
-      "<(skia_src_path)/utils/win/SkWGL_win.cpp",
-    ],
-  },
-}
diff --git a/third_party/skia/include/core/SkColorPriv.h b/third_party/skia/include/core/SkColorPriv.h
index 45ff80a..46447c4 100644
--- a/third_party/skia/include/core/SkColorPriv.h
+++ b/third_party/skia/include/core/SkColorPriv.h
@@ -72,7 +72,7 @@
 
 // Deduce which SK_PMCOLOR_IS_ to define from the _SHIFT defines
 
-#if !defined(STARBOARD) || SB_API_VERSION < 12
+#if !defined(STARBOARD)
 #if (SK_A32_SHIFT == SK_RGBA_A32_SHIFT && \
      SK_R32_SHIFT == SK_RGBA_R32_SHIFT && \
      SK_G32_SHIFT == SK_RGBA_G32_SHIFT && \
@@ -86,7 +86,7 @@
 #else
     #error "need 32bit packing to be either RGBA or BGRA"
 #endif
-#endif  // !defined(STARBOARD) || SB_API_VERSION < 12
+#endif  // !defined(STARBOARD)
 
 #define SkGetPackedA32(packed)      ((uint32_t)((packed) << (24 - SK_A32_SHIFT)) >> 24)
 #define SkGetPackedR32(packed)      ((uint32_t)((packed) << (24 - SK_R32_SHIFT)) >> 24)
diff --git a/third_party/skia/include/core/SkImageInfo.h b/third_party/skia/include/core/SkImageInfo.h
index 9b173e5..1abfb7e 100644
--- a/third_party/skia/include/core/SkImageInfo.h
+++ b/third_party/skia/include/core/SkImageInfo.h
@@ -98,7 +98,7 @@
 
     kLastEnum_SkColorType     = kR16G16B16A16_unorm_SkColorType, //!< last valid value
 
-#if !defined(STARBOARD) || SB_API_VERSION < 12
+#if !defined(STARBOARD)
 #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A)
     kN32_SkColorType          = kBGRA_8888_SkColorType,//!< native ARGB 32-bit encoding
 
@@ -111,7 +111,7 @@
 #endif
 };
 
-#if defined(STARBOARD) && SB_API_VERSION >= 12
+#if defined(STARBOARD)
 #define kN32_SkColorType \
     (GetSkPmcolor() == SkPmcolorIsBgra ? kBGRA_8888_SkColorType : kRGBA_8888_SkColorType)
 #endif
diff --git a/third_party/skia/include/core/SkPostConfig.h b/third_party/skia/include/core/SkPostConfig.h
index 6586fb2..6eb8217 100644
--- a/third_party/skia/include/core/SkPostConfig.h
+++ b/third_party/skia/include/core/SkPostConfig.h
@@ -10,7 +10,7 @@
 #ifndef SkPostConfig_DEFINED
 #define SkPostConfig_DEFINED
 
-#if defined(STARBOARD) && SB_API_VERSION >= 12
+#if defined(STARBOARD)
 #include "base/logging.h"
 #include "include/core/SkTypes.h"
 #endif
@@ -145,7 +145,7 @@
 // If SK_R32_SHIFT is set, we'll use that to choose RGBA or BGRA.
 // If not, we'll default to RGBA everywhere except BGRA on Windows.
 #if defined(SK_R32_SHIFT)
-#if !defined(STARBOARD) || SB_API_VERSION < 12
+#if !defined(STARBOARD)
     static_assert(SK_R32_SHIFT == 0 || SK_R32_SHIFT == 16, "");
 #endif
 #elif defined(SK_BUILD_FOR_WIN)
@@ -155,7 +155,7 @@
 #endif
 
 #if defined(SK_B32_SHIFT)
-#if !defined(STARBOARD) || SB_API_VERSION < 12
+#if !defined(STARBOARD)
     static_assert(SK_B32_SHIFT == (16-SK_R32_SHIFT), "");
 #endif
 #else
@@ -195,7 +195,7 @@
          SK_ ## C3 ## 32_SHIFT == 24)
 #endif
 
-#if defined(STARBOARD) && SB_API_VERSION >= 12
+#if defined(STARBOARD)
     typedef enum SkPmcolor { SkPmcolorIsRgba, SkPmcolorIsBgra } SkPmColor;
 
     inline SkPmcolor GetSkPmcolor() {
diff --git a/third_party/skia/include/core/SkTypes.h b/third_party/skia/include/core/SkTypes.h
index 246c10c..f72a0d4 100644
--- a/third_party/skia/include/core/SkTypes.h
+++ b/third_party/skia/include/core/SkTypes.h
@@ -8,6 +8,11 @@
 #ifndef SkTypes_DEFINED
 #define SkTypes_DEFINED
 
+#ifdef USE_SKIA_NEXT
+#error Including a skia header in a skia_next build. \
+Check include paths order and use_skia_next argument usage in build configs.
+#endif
+
 // IWYU pragma: begin_exports
 #include "include/core/SkPreConfig.h"
 #if defined (SK_USER_CONFIG_HEADER)
diff --git a/third_party/skia/include/private/GrTypesPriv.h b/third_party/skia/include/private/GrTypesPriv.h
index 1758a85..0d29f7d 100644
--- a/third_party/skia/include/private/GrTypesPriv.h
+++ b/third_party/skia/include/private/GrTypesPriv.h
@@ -74,7 +74,7 @@
 #ifndef SK_CPU_LENDIAN
 #error "Skia gpu currently assumes little endian"
 #endif
-#if defined(STARBOARD) && SB_API_VERSION >= 12
+#if defined(STARBOARD)
 static const GrPixelConfig kSkia8888_GrPixelConfig =
         (GetSkPmcolor() == SkPmcolorIsBgra) ? kBGRA_8888_GrPixelConfig : kRGBA_8888_GrPixelConfig;
 #else
diff --git a/third_party/skia/include/private/SkColorData.h b/third_party/skia/include/private/SkColorData.h
index debaf57..de1134d 100644
--- a/third_party/skia/include/private/SkColorData.h
+++ b/third_party/skia/include/private/SkColorData.h
@@ -82,27 +82,11 @@
 }
 
 static inline SkPMColor SkSwizzle_RGBA_to_PMColor(uint32_t c) {
-#if SB_API_VERSION >= 12
     return (GetSkPmcolor() == SkPmcolorIsRgba) ? c : SkSwizzle_RB(c);
-#else
-#ifdef SK_PMCOLOR_IS_RGBA
-    return c;
-#else
-    return SkSwizzle_RB(c);
-#endif
-#endif
 }
 
 static inline SkPMColor SkSwizzle_BGRA_to_PMColor(uint32_t c) {
-#if SB_API_VERSION >= 12
     return (GetSkPmcolor() == SkPmcolorIsBgra) ? c : SkSwizzle_RB(c);
-#else
-#ifdef SK_PMCOLOR_IS_BGRA
-    return c;
-#else
-    return SkSwizzle_RB(c);
-#endif
-#endif
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -412,15 +396,7 @@
 }
 
 static inline Sk4f swizzle_rb_if_bgra(const Sk4f& x) {
-#if SB_API_VERSION >= 12
     return (GetSkPmcolor() == SkPmcolorIsBgra) ? swizzle_rb(x) : x;
-#else
-#ifdef SK_PMCOLOR_IS_BGRA
-    return swizzle_rb(x);
-#else
-    return x;
-#endif
-#endif
 }
 
 static inline Sk4f Sk4f_fromL32(uint32_t px) {
diff --git a/third_party/skia/modules/skottie/skottie.gypi b/third_party/skia/modules/skottie/skottie.gypi
deleted file mode 100644
index 7b6d32b..0000000
--- a/third_party/skia/modules/skottie/skottie.gypi
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Translated from: skottie.gni
-
-{
-  'variables': {
-    'skottie_src_path': '<(skia_modules_path)/skottie/src',
-    'skottie_include_path': '<(skia_modules_path)/skottie/include',
-
-    'skia_skottie_public': [
-      "<(skottie_include_path)/Skottie.h",
-      "<(skottie_include_path)/SkottieProperty.h",
-    ],
-
-    'skia_skottie_sources' : [
-      "<(skottie_src_path)/Composition.cpp",
-      "<(skottie_src_path)/Layer.cpp",
-      "<(skottie_src_path)/Skottie.cpp",
-      "<(skottie_src_path)/SkottieAdapter.cpp",
-      "<(skottie_src_path)/SkottieAdapter.h",
-      "<(skottie_src_path)/SkottieAnimator.cpp",
-      "<(skottie_src_path)/SkottieJson.cpp",
-      "<(skottie_src_path)/SkottieJson.h",
-      "<(skottie_src_path)/SkottiePriv.h",
-      "<(skottie_src_path)/SkottieProperty.cpp",
-      "<(skottie_src_path)/SkottieValue.cpp",
-      "<(skottie_src_path)/SkottieValue.h",
-
-      "<(skottie_src_path)/effects/DropShadowEffect.cpp",
-      "<(skottie_src_path)/effects/Effects.cpp",
-      "<(skottie_src_path)/effects/Effects.h",
-      "<(skottie_src_path)/effects/FillEffect.cpp",
-      "<(skottie_src_path)/effects/GaussianBlurEffect.cpp",
-      "<(skottie_src_path)/effects/GradientEffect.cpp",
-      "<(skottie_src_path)/effects/HueSaturationEffect.cpp",
-      "<(skottie_src_path)/effects/LevelsEffect.cpp",
-      "<(skottie_src_path)/effects/LinearWipeEffect.cpp",
-      "<(skottie_src_path)/effects/MotionBlurEffect.cpp",
-      "<(skottie_src_path)/effects/MotionBlurEffect.h",
-      "<(skottie_src_path)/effects/MotionTileEffect.cpp",
-      "<(skottie_src_path)/effects/RadialWipeEffect.cpp",
-      "<(skottie_src_path)/effects/TintEffect.cpp",
-      "<(skottie_src_path)/effects/TransformEffect.cpp",
-      "<(skottie_src_path)/effects/TritoneEffect.cpp",
-      "<(skottie_src_path)/effects/VenetianBlindsEffect.cpp",
-
-      "<(skottie_src_path)/layers/ImageLayer.cpp",
-      "<(skottie_src_path)/layers/NullLayer.cpp",
-      "<(skottie_src_path)/layers/PrecompLayer.cpp",
-      "<(skottie_src_path)/layers/ShapeLayer.cpp",
-      "<(skottie_src_path)/layers/SolidLayer.cpp",
-      "<(skottie_src_path)/layers/TextLayer.cpp",
-
-      "<(skottie_src_path)/text/RangeSelector.cpp",
-      "<(skottie_src_path)/text/RangeSelector.h",
-      "<(skottie_src_path)/text/SkottieShaper.cpp",
-      "<(skottie_src_path)/text/SkottieShaper.h",
-      "<(skottie_src_path)/text/TextAdapter.cpp",
-      "<(skottie_src_path)/text/TextAdapter.h",
-      "<(skottie_src_path)/text/TextAnimator.cpp",
-      "<(skottie_src_path)/text/TextAnimator.h",
-      "<(skottie_src_path)/text/TextValue.cpp",
-      "<(skottie_src_path)/text/TextValue.h",
-    ],
-  }
-}
diff --git a/third_party/skia/modules/sksg/sksg.gypi b/third_party/skia/modules/sksg/sksg.gypi
deleted file mode 100644
index 71cc3a9..0000000
--- a/third_party/skia/modules/sksg/sksg.gypi
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Translated from: sksg.gni
-
-{
-  'variables': {
-    'sksg_src_path': '<(skia_modules_path)/sksg/src',
-
-    'skia_sksg_sources' : [
-      "<(sksg_src_path)/SkSGClipEffect.cpp",
-      "<(sksg_src_path)/SkSGColorFilter.cpp",
-      "<(sksg_src_path)/SkSGDraw.cpp",
-      "<(sksg_src_path)/SkSGEffectNode.cpp",
-      "<(sksg_src_path)/SkSGGeometryNode.cpp",
-      "<(sksg_src_path)/SkSGGeometryTransform.cpp",
-      "<(sksg_src_path)/SkSGGradient.cpp",
-      "<(sksg_src_path)/SkSGGroup.cpp",
-      "<(sksg_src_path)/SkSGImage.cpp",
-      "<(sksg_src_path)/SkSGInvalidationController.cpp",
-      "<(sksg_src_path)/SkSGMaskEffect.cpp",
-      "<(sksg_src_path)/SkSGMerge.cpp",
-      "<(sksg_src_path)/SkSGNode.cpp",
-      "<(sksg_src_path)/SkSGNodePriv.h",
-      "<(sksg_src_path)/SkSGOpacityEffect.cpp",
-      "<(sksg_src_path)/SkSGPaint.cpp",
-      "<(sksg_src_path)/SkSGPath.cpp",
-      "<(sksg_src_path)/SkSGPlane.cpp",
-      "<(sksg_src_path)/SkSGRect.cpp",
-      "<(sksg_src_path)/SkSGRenderEffect.cpp",
-      "<(sksg_src_path)/SkSGRenderNode.cpp",
-      "<(sksg_src_path)/SkSGRoundEffect.cpp",
-      "<(sksg_src_path)/SkSGScene.cpp",
-      "<(sksg_src_path)/SkSGText.cpp",
-      "<(sksg_src_path)/SkSGTransform.cpp",
-      "<(sksg_src_path)/SkSGTransformPriv.h",
-      "<(sksg_src_path)/SkSGTrimEffect.cpp",
-    ],
-  }
-}
diff --git a/third_party/skia/modules/skshaper/skshaper.gypi b/third_party/skia/modules/skshaper/skshaper.gypi
deleted file mode 100644
index b38d8a9..0000000
--- a/third_party/skia/modules/skshaper/skshaper.gypi
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2020 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Translated from: skshaper.gni
-
-{
-  'variables': {
-    'skshaper_src_path': '<(skia_modules_path)/skshaper/src',
-    'skshaper_include_path': '<skia_modules_path)/skshaper/include',
-
-    'skia_shaper_public': [
-      "<(skshaper_include_path)/SkShaper.h"
-    ],
-
-    'skia_shaper_primitive_sources': [
-      "<(skshaper_src_path)/SkShaper.cpp",
-      "<(skshaper_src_path)/SkShaper_primitive.cpp",
-    ],
-
-    'skia_shaper_harfbuzz_sources': [
-      "<(skshaper_src_path)/SkShaper_harfbuzz.cpp",
-    ],
-  },
-}
diff --git a/third_party/skia/src/codec/SkCodec.cpp b/third_party/skia/src/codec/SkCodec.cpp
index 754b911..4df4190 100644
--- a/third_party/skia/src/codec/SkCodec.cpp
+++ b/third_party/skia/src/codec/SkCodec.cpp
@@ -624,7 +624,7 @@
             break;
         case kRGB_565_SkColorType:
             if (forColorTable) {
-#if defined(STARBOARD) && SB_API_VERSION >= 12
+#if defined(STARBOARD)
                 *outFormat = (GetSkPmcolor() == SkPmcolorIsRgba) ? skcms_PixelFormat_RGBA_8888
                                                                  : skcms_PixelFormat_RGBA_8888;
 #else
diff --git a/third_party/skia/src/codec/SkCodecPriv.h b/third_party/skia/src/codec/SkCodecPriv.h
index 0b46b43..3463393 100644
--- a/third_party/skia/src/codec/SkCodecPriv.h
+++ b/third_party/skia/src/codec/SkCodecPriv.h
@@ -218,7 +218,7 @@
 }
 
 static inline bool is_rgba(SkColorType colorType) {
-#if defined(STARBOARD) && SB_API_VERSION >= 12
+#if defined(STARBOARD)
     return (GetSkPmcolor() == SkPmcolorIsRgba) ? (kBGRA_8888_SkColorType != colorType)
                                                : (kBGRA_8888_SkColorType == colorType);
 #else
diff --git a/third_party/skia/src/gpu/gl/GrGLUtil.cpp b/third_party/skia/src/gpu/gl/GrGLUtil.cpp
index 5164def..3f67663 100644
--- a/third_party/skia/src/gpu/gl/GrGLUtil.cpp
+++ b/third_party/skia/src/gpu/gl/GrGLUtil.cpp
@@ -22,7 +22,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-#if !defined(STARBOARD) || (SB_API_VERSION >= 12 || SB_HAS_GLES2)
 #if defined(STARBOARD)
 #include "starboard/common/string.h"
 #include "starboard/configuration.h"
@@ -261,7 +260,7 @@
         return GR_GL_INVALID_VER;
     }
 
-#if defined(STARBOARD) && (SB_API_VERSION >= 12 || !defined(GLES3_SUPPORTED))
+#if defined(STARBOARD) && !defined(GLES3_SUPPORTED)
     // If we are in a build that does not support GLES3 (or it is explicitly
     // disabled), ensure that Skia returns GLES2 as the version being used by
     // performing the check before attempting to parse the string below.
@@ -737,30 +736,3 @@
     SkUNREACHABLE;
 }
 
-#else  // !defined(STARBOARD) || (SB_API_VERSION >= 12|| SB_HAS_GLES2)
-
-void GrGLCheckErr(const GrGLInterface* gl, const char* location, const char* call) {}
-
-void GrGLClearErr(const GrGLInterface* gl) {}
-
-GrGLenum GrToGLStencilFunc(GrStencilTest test) { return -1; }
-
-GrGLVersion GrGLGetVersionFromString(const char* versionString) { return GR_GL_INVALID_VER; }
-
-GrGLVendor GrGLGetVendor(const GrGLInterface* gl) { return kOther_GrGLVendor; }
-
-GrGLRenderer GrGLGetRendererFromString(const char* rendererString) { return kOther_GrGLRenderer; }
-
-void GrGLGetDriverInfo(GrGLStandard standard,
-                       GrGLVendor vendor,
-                       const char* rendererString,
-                       const char* versionString,
-                       GrGLDriver* outDriver,
-                       GrGLDriverVersion* outVersion) {}
-
-GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface* gl) { return GR_GLSL_INVALID_VER; }
-
-GrGLVersion GrGLGetVersion(const GrGLInterface* gl) { return GR_GL_INVALID_VER; }
-
-#endif  // !defined(STARBOARD) || (SB_API_VERSION >= 12||
-        // SB_HAS_GLES2)
diff --git a/third_party/skia/third_party/skcms/skcms.gyp b/third_party/skia/third_party/skcms/skcms.gyp
deleted file mode 100644
index 22007bd..0000000
--- a/third_party/skia/third_party/skcms/skcms.gyp
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2018 Google Inc.
-#
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'targets': [
-    {
-      'target_name': 'skcms',
-      'type': 'static_library',
-      'toolsets': ['target'],
-      'defines': [
-        # Starboard doesn't have APIs for vector registers.
-        # Use portable code instead.
-        'SKCMS_PORTABLE',
-      ],
-      'sources': [
-        'skcms.cc',
-      ],
-      'include_dirs': [
-        '<(DEPTH)/third_party/skia/include/third_party/skcms',
-      ],
-    },
-  ],
-}
diff --git a/third_party/skia_next/third_party/skia/dm/DMSrcSink.cpp b/third_party/skia_next/third_party/skia/dm/DMSrcSink.cpp
index 421eb90..2168ea3 100644
--- a/third_party/skia_next/third_party/skia/dm/DMSrcSink.cpp
+++ b/third_party/skia_next/third_party/skia/dm/DMSrcSink.cpp
@@ -392,11 +392,11 @@
                     || kRGBA_F16_SkColorType == canvasColorType) {
                 return false;
             }
-#ifdef SK_PMCOLOR_IS_RGBA
-            *decodeInfo = decodeInfo->makeColorType(kBGRA_8888_SkColorType);
-#else
-            *decodeInfo = decodeInfo->makeColorType(kRGBA_8888_SkColorType);
-#endif
+            if (GetSkPmcolor() == SkPmcolorIsRgba) {
+              *decodeInfo = decodeInfo->makeColorType(kBGRA_8888_SkColorType);
+            } else {
+              *decodeInfo = decodeInfo->makeColorType(kRGBA_8888_SkColorType);
+            }
             break;
         default:
             if (kRGB_565_SkColorType == canvasColorType &&
diff --git a/third_party/skia_next/third_party/skia/gm/all_bitmap_configs.cpp b/third_party/skia_next/third_party/skia/gm/all_bitmap_configs.cpp
index 62badb7..e72b4b8 100644
--- a/third_party/skia_next/third_party/skia/gm/all_bitmap_configs.cpp
+++ b/third_party/skia_next/third_party/skia/gm/all_bitmap_configs.cpp
@@ -173,12 +173,15 @@
     n32bitmap.eraseColor(SK_ColorTRANSPARENT);
     SkCanvas n32canvas(n32bitmap);
     color_wheel_native(&n32canvas);
-    #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A)
-        const SkColorType ct = kRGBA_8888_SkColorType;
-    #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A)
-        const SkColorType ct = kBGRA_8888_SkColorType;
-    #endif
-    static_assert(ct != kN32_SkColorType, "BRGA!=RGBA");
+    SkColorType ct;
+    if (SK_PMCOLOR_BYTE_ORDER(B, G, R, A)) {
+        ct = kRGBA_8888_SkColorType;
+    } else if (SK_PMCOLOR_BYTE_ORDER(R, G, B, A)) {
+        ct = kBGRA_8888_SkColorType;
+    } else {
+        NOTREACHED() << "Byte order must be BGRA or RGBA.";
+    }
+    DCHECK(ct != kN32_SkColorType) << "BRGA!=RGBA";
     SkAssertResult(ToolUtils::copy_to(&notN32bitmap, ct, n32bitmap));
     SkASSERT(notN32bitmap.colorType() == ct);
     return notN32bitmap.asImage();
diff --git a/third_party/skia_next/third_party/skia/include/core/SkCanvas.h b/third_party/skia_next/third_party/skia/include/core/SkCanvas.h
index 303ecd6..f5d9feb 100644
--- a/third_party/skia_next/third_party/skia/include/core/SkCanvas.h
+++ b/third_party/skia_next/third_party/skia/include/core/SkCanvas.h
@@ -299,6 +299,15 @@
      */
     virtual GrRecordingContext* recordingContext();
 
+#ifdef STARBOARD
+    /**
+     * Return the framebuffer object identifier for the render target, if
+     * applicable.
+     * NOTE: This will cause a flush, so use sparingly.
+     */
+    intptr_t getRenderTargetHandle() const;
+#endif
+
     /** Sometimes a canvas is owned by a surface. If it is, getSurface() will return a bare
      *  pointer to that surface, else this will return nullptr.
      */
@@ -2366,7 +2375,12 @@
     sk_sp<SkMarkerStack> fMarkerStack;
 
     // the first N recs that can fit here mean we won't call malloc
+#if defined(STARBOARD)
+    // Cobalt uses various compilers, set a safe larger size.
+    static constexpr int kMCRecSize      = 112;
+#else
     static constexpr int kMCRecSize      = 96; // most recent measurement
+#endif
     static constexpr int kMCRecCount     = 32; // common depth for save/restores
 
     intptr_t fMCRecStorage[kMCRecSize * kMCRecCount / sizeof(intptr_t)];
diff --git a/third_party/skia_next/third_party/skia/include/core/SkColorPriv.h b/third_party/skia_next/third_party/skia/include/core/SkColorPriv.h
index 29f6433..89cf0dd 100644
--- a/third_party/skia_next/third_party/skia/include/core/SkColorPriv.h
+++ b/third_party/skia_next/third_party/skia/include/core/SkColorPriv.h
@@ -73,6 +73,7 @@
 
 // Deduce which SK_PMCOLOR_IS_ to define from the _SHIFT defines
 
+#if !defined(STARBOARD)
 #if (SK_A32_SHIFT == SK_RGBA_A32_SHIFT && \
      SK_R32_SHIFT == SK_RGBA_R32_SHIFT && \
      SK_G32_SHIFT == SK_RGBA_G32_SHIFT && \
@@ -86,6 +87,7 @@
 #else
     #error "need 32bit packing to be either RGBA or BGRA"
 #endif
+#endif  // !defined(STARBOARD)
 
 #define SkGetPackedA32(packed)      ((uint32_t)((packed) << (24 - SK_A32_SHIFT)) >> 24)
 #define SkGetPackedR32(packed)      ((uint32_t)((packed) << (24 - SK_R32_SHIFT)) >> 24)
diff --git a/third_party/skia_next/third_party/skia/include/core/SkData.h b/third_party/skia_next/third_party/skia/include/core/SkData.h
index eb845b5..9de2fc5 100644
--- a/third_party/skia_next/third_party/skia/include/core/SkData.h
+++ b/third_party/skia_next/third_party/skia/include/core/SkData.h
@@ -11,6 +11,7 @@
 #include <stdio.h>
 
 #include "include/core/SkRefCnt.h"
+#include "src/core/SkOSFile.h"  // Included for SkFile.
 
 class SkStream;
 
@@ -127,7 +128,7 @@
      *  The FILE must be open for reading only.
      *  Returns NULL on failure.
      */
-    static sk_sp<SkData> MakeFromFILE(FILE* f);
+    static sk_sp<SkData> MakeFromFILE(SkFile* f);
 
     /**
      *  Create a new dataref from a file descriptor.
diff --git a/third_party/skia_next/third_party/skia/include/core/SkImageInfo.h b/third_party/skia_next/third_party/skia/include/core/SkImageInfo.h
index 99b65e8..3068ec4 100644
--- a/third_party/skia_next/third_party/skia/include/core/SkImageInfo.h
+++ b/third_party/skia_next/third_party/skia/include/core/SkImageInfo.h
@@ -95,6 +95,7 @@
 
     kLastEnum_SkColorType     = kSRGBA_8888_SkColorType, //!< last valid value
 
+#if !defined(STARBOARD)
 #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A)
     kN32_SkColorType          = kBGRA_8888_SkColorType,//!< native 32-bit BGRA encoding
 
@@ -104,8 +105,14 @@
 #else
     #error "SK_*32_SHIFT values must correspond to BGRA or RGBA byte order"
 #endif
+#endif
 };
 
+#if defined(STARBOARD)
+#define kN32_SkColorType \
+    (GetSkPmcolor() == SkPmcolorIsBgra ? kBGRA_8888_SkColorType : kRGBA_8888_SkColorType)
+#endif
+
 /** Returns the number of bytes required to store a pixel, including unused padding.
     Returns zero if ct is kUnknown_SkColorType or invalid.
 
diff --git a/third_party/skia_next/third_party/skia/include/core/SkPoint.h b/third_party/skia_next/third_party/skia/include/core/SkPoint.h
index 92cb0b7..7e76536 100644
--- a/third_party/skia_next/third_party/skia/include/core/SkPoint.h
+++ b/third_party/skia_next/third_party/skia/include/core/SkPoint.h
@@ -563,4 +563,16 @@
 
 };
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<SkPoint> {
+  static auto Coerce(SkPoint&& t) {
+    return std::move( std::make_tuple(t.fX, t.fY));
+  }
+  static auto Coerce(const SkPoint& t) {
+    return std::make_tuple(t.fX, t.fY);
+  }
+};
+#endif
+
 #endif
diff --git a/third_party/skia_next/third_party/skia/include/core/SkRSXform.h b/third_party/skia_next/third_party/skia/include/core/SkRSXform.h
index 9165331..6826ac5 100644
--- a/third_party/skia_next/third_party/skia/include/core/SkRSXform.h
+++ b/third_party/skia_next/third_party/skia/include/core/SkRSXform.h
@@ -65,5 +65,18 @@
     void toTriStrip(SkScalar width, SkScalar height, SkPoint strip[4]) const;
 };
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<SkRSXform> {
+  static auto Coerce(SkRSXform&& t) {
+    return std::forward<std::tuple<SkScalar, SkScalar, SkScalar, SkScalar>>(
+        std::make_tuple(t.fSCos, t.fSSin, t.fTx, t.fTy));
+  }
+  static auto Coerce(const SkRSXform& t) {
+    return std::make_tuple(t.fSCos, t.fSSin, t.fTx, t.fTy);
+  }
+};
+#endif
+
 #endif
 
diff --git a/third_party/skia_next/third_party/skia/include/core/SkRect.h b/third_party/skia_next/third_party/skia/include/core/SkRect.h
index 6ef1f86..ab45ca6 100644
--- a/third_party/skia_next/third_party/skia/include/core/SkRect.h
+++ b/third_party/skia_next/third_party/skia/include/core/SkRect.h
@@ -1375,4 +1375,16 @@
             (SkScalar)fRight >= r.fRight && (SkScalar)fBottom >= r.fBottom;
 }
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<SkRect> {
+  static auto Coerce(SkRect&& t) {
+    return std::make_tuple(t.fLeft, t.fTop, t.fRight, t.fBottom);
+  }
+  static auto Coerce(const SkRect& t) {
+    return std::make_tuple(t.fLeft, t.fTop, t.fRight, t.fBottom);
+  }
+};
+#endif
+
 #endif
diff --git a/third_party/skia_next/third_party/skia/include/core/SkStream.h b/third_party/skia_next/third_party/skia/include/core/SkStream.h
index 32dfff2..ecf0026 100644
--- a/third_party/skia_next/third_party/skia/include/core/SkStream.h
+++ b/third_party/skia_next/third_party/skia/include/core/SkStream.h
@@ -12,6 +12,7 @@
 #include "include/core/SkRefCnt.h"
 #include "include/core/SkScalar.h"
 #include "include/private/SkTo.h"
+#include "src/core/SkOSFile.h"  // Included for SkFile.
 
 #include <memory.h>
 
@@ -311,14 +312,14 @@
      *  beginning of the SkFILEStream and the current seek end of the FILE will be the end.
      *  The C FILE stream will be closed in the destructor.
      */
-    explicit SkFILEStream(FILE* file);
+    explicit SkFILEStream(SkFile* file);
 
     /** Initialize the stream with an existing C FILE stream.
      *  The current position of the C FILE stream will be considered the
      *  beginning of the SkFILEStream and size bytes later will be the end.
      *  The C FILE stream will be closed in the destructor.
      */
-    explicit SkFILEStream(FILE* file, size_t size);
+    explicit SkFILEStream(SkFile* file, size_t size);
 
     ~SkFILEStream() override;
 
@@ -352,14 +353,14 @@
     size_t getLength() const override;
 
 private:
-    explicit SkFILEStream(FILE*, size_t size, size_t start);
-    explicit SkFILEStream(std::shared_ptr<FILE>, size_t end, size_t start);
-    explicit SkFILEStream(std::shared_ptr<FILE>, size_t end, size_t start, size_t current);
+    explicit SkFILEStream(SkFile*, size_t size, size_t start);
+    explicit SkFILEStream(std::shared_ptr<SkFile>, size_t end, size_t start);
+    explicit SkFILEStream(std::shared_ptr<SkFile>, size_t end, size_t start, size_t current);
 
     SkStreamAsset* onDuplicate() const override;
     SkStreamAsset* onFork() const override;
 
-    std::shared_ptr<FILE> fFILE;
+    std::shared_ptr<SkFile> fFILE;
     // My own council will I keep on sizes and offsets.
     // These are seek positions in the underling FILE, not offsets into the stream.
     size_t fEnd;
@@ -459,7 +460,7 @@
     size_t bytesWritten() const override;
 
 private:
-    FILE* fFILE;
+    SkFile* fFILE;
 
     using INHERITED = SkWStream;
 };
diff --git a/third_party/skia_next/third_party/skia/include/core/SkTypes.h b/third_party/skia_next/third_party/skia/include/core/SkTypes.h
index c007347..45b5a00 100644
--- a/third_party/skia_next/third_party/skia/include/core/SkTypes.h
+++ b/third_party/skia_next/third_party/skia/include/core/SkTypes.h
@@ -8,9 +8,16 @@
 #ifndef SkTypes_DEFINED
 #define SkTypes_DEFINED
 
+#ifndef USE_SKIA_NEXT
+#error Including a skia_next header in a Skia build. \
+Check include paths order and use_skia_next argument usage in build configs.
+#endif
+
 /** \file SkTypes.h
 */
 
+#include "cpp17oncpp14.h"
+
 // Pre-SkUserConfig.h setup.
 
 // Allows embedders that want to disable macros that take arguments to just
@@ -288,7 +295,9 @@
 // If SK_R32_SHIFT is set, we'll use that to choose RGBA or BGRA.
 // If not, we'll default to RGBA everywhere except BGRA on Windows.
 #if defined(SK_R32_SHIFT)
+#if !defined(STARBOARD)
     static_assert(SK_R32_SHIFT == 0 || SK_R32_SHIFT == 16, "");
+#endif
 #elif defined(SK_BUILD_FOR_WIN)
     #define SK_R32_SHIFT 16
 #else
@@ -296,7 +305,9 @@
 #endif
 
 #if defined(SK_B32_SHIFT)
+#if !defined(STARBOARD)
     static_assert(SK_B32_SHIFT == (16-SK_R32_SHIFT), "");
+#endif
 #else
     #define SK_B32_SHIFT (16-SK_R32_SHIFT)
 #endif
@@ -322,6 +333,21 @@
          SK_ ## C3 ## 32_SHIFT == 24)
 #endif
 
+#if defined(STARBOARD)
+typedef enum SkPmcolor { SkPmcolorIsRgba, SkPmcolorIsBgra } SkPmColor;
+
+inline SkPmcolor GetSkPmcolor() {
+    if (SK_PMCOLOR_BYTE_ORDER(R,G,B,A)) {
+        return SkPmcolorIsRgba;
+    } else if (SK_PMCOLOR_BYTE_ORDER(B,G,R,A)) {
+        return SkPmcolorIsBgra;
+    } else {
+        DCHECK(false) << "SK shift values do not correspond to a supported byte order.";
+        return (SkPmcolor)NULL;
+    }
+}
+#endif
+
 #if defined SK_DEBUG && defined SK_BUILD_FOR_WIN
     #ifdef free
         #undef free
diff --git a/third_party/skia_next/third_party/skia/include/core/cpp17oncpp14.h b/third_party/skia_next/third_party/skia/include/core/cpp17oncpp14.h
new file mode 100644
index 0000000..219b57a
--- /dev/null
+++ b/third_party/skia_next/third_party/skia/include/core/cpp17oncpp14.h
@@ -0,0 +1,78 @@
+#ifndef Cpp17OnCpp14_DEFINED
+#define Cpp17OnCpp14_DEFINED
+
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+#include <tuple>
+#include <type_traits>
+#include <utility>
+
+// Helpers for converting types to tuples.
+template <typename T>
+struct CoercerToTuple;
+
+template <typename... Types>
+struct CoercerToTuple<std::tuple<Types...>> {
+  static std::tuple<Types...>&& Coerce(std::tuple<Types...>&& tuple) {
+    return std::move(tuple);
+  }
+  static std::tuple<Types...> Coerce(std::tuple<Types...>& tuple) {
+    return tuple;
+  }
+};
+
+template <typename T1, typename T2>
+struct CoercerToTuple<std::pair<T1, T2>> {
+  static auto Coerce(std::pair<T1, T2>&& t) {
+    return std::make_tuple(t.first, t.second);
+  }
+  static auto Coerce(const std::pair<T1, T2>& t) {
+    return std::make_tuple(t.first, t.second);
+  }
+};
+
+template <typename T>
+auto CoerceToTuple(T&& t) {
+  return CoercerToTuple<T>::Coerce(std::forward<T>(t));
+}
+
+template <typename T>
+auto CoerceToTuple(T& t) {
+  return CoercerToTuple<T>::Coerce(t);
+}
+
+template <typename T>
+auto CoerceToTuple(const T& t) {
+  return CoercerToTuple<T>::Coerce(t);
+}
+
+// Macro.
+
+#define STRUCTURED_BINDING_2(v0, v1, maybe_tuple)  \
+  auto tuple##v0##v1 = CoerceToTuple(maybe_tuple); \
+  auto& v0 = std::get<0>(tuple##v0##v1);           \
+  auto& v1 = std::get<1>(tuple##v0##v1)
+
+#define STRUCTURED_BINDING_3(v0, v1, v2, maybe_tuple)  \
+  auto tuple##v0##v1##v2 = CoerceToTuple(maybe_tuple); \
+  auto& v0 = std::get<0>(tuple##v0##v1##v2);           \
+  auto& v1 = std::get<1>(tuple##v0##v1##v2);           \
+  auto& v2 = std::get<2>(tuple##v0##v1##v2)
+
+#define STRUCTURED_BINDING_4(v0, v1, v2, v3, maybe_tuple)  \
+  auto tuple##v0##v1##v2##v3 = CoerceToTuple(maybe_tuple); \
+  auto& v0 = std::get<0>(tuple##v0##v1##v2##v3);           \
+  auto& v1 = std::get<1>(tuple##v0##v1##v2##v3);           \
+  auto& v2 = std::get<2>(tuple##v0##v1##v2##v3);           \
+  auto& v3 = std::get<3>(tuple##v0##v1##v2##v3)
+
+#define STRUCTURED_BINDING_5(v0, v1, v2, v3, v4, maybe_tuple)  \
+  auto tuple##v0##v1##v2##v3##v4 = CoerceToTuple(maybe_tuple); \
+  auto& v0 = std::get<0>(tuple##v0##v1##v2##v3##v4);           \
+  auto& v1 = std::get<1>(tuple##v0##v1##v2##v3##v4);           \
+  auto& v2 = std::get<2>(tuple##v0##v1##v2##v3##v4);           \
+  auto& v3 = std::get<3>(tuple##v0##v1##v2##v3##v4);           \
+  auto& v4 = std::get<4>(tuple##v0##v1##v2##v3##v4)
+
+#endif  // SKIA_STRUCTURED_BINDINGS_BACKPORT
+
+#endif  // Cpp17OnCpp14_DEFINED
diff --git a/third_party/skia_next/third_party/skia/include/effects/SkRuntimeEffect.h b/third_party/skia_next/third_party/skia/include/effects/SkRuntimeEffect.h
index b3f21b1..8581392 100644
--- a/third_party/skia_next/third_party/skia/include/effects/SkRuntimeEffect.h
+++ b/third_party/skia_next/third_party/skia/include/effects/SkRuntimeEffect.h
@@ -476,6 +476,16 @@
     using INHERITED = SkRuntimeEffectBuilder;
 };
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<SkRuntimeEffect::Result> {
+  static std::tuple<sk_sp<SkRuntimeEffect>, SkString> Coerce(
+      const SkRuntimeEffect::Result&& t) {
+    return std::make_tuple(t.effect, t.errorText);
+  }
+};
+#endif
+
 #endif  // SK_ENABLE_SKSL
 
 #endif  // SkRuntimeEffect_DEFINED
diff --git a/third_party/skia_next/third_party/skia/include/private/SkColorData.h b/third_party/skia_next/third_party/skia/include/private/SkColorData.h
index a59e7b0..6b529e6 100644
--- a/third_party/skia_next/third_party/skia/include/private/SkColorData.h
+++ b/third_party/skia_next/third_party/skia/include/private/SkColorData.h
@@ -82,19 +82,27 @@
 }
 
 static inline SkPMColor SkSwizzle_RGBA_to_PMColor(uint32_t c) {
+#if defined(STARBOARD)
+    return (GetSkPmcolor() == SkPmcolorIsRgba) ? c : SkSwizzle_RB(c);
+#else
 #ifdef SK_PMCOLOR_IS_RGBA
     return c;
 #else
     return SkSwizzle_RB(c);
 #endif
+#endif
 }
 
 static inline SkPMColor SkSwizzle_BGRA_to_PMColor(uint32_t c) {
+#if defined(STARBOARD)
+    return (GetSkPmcolor() == SkPmcolorIsBgra) ? c : SkSwizzle_RB(c);
+#else
 #ifdef SK_PMCOLOR_IS_BGRA
     return c;
 #else
     return SkSwizzle_RB(c);
 #endif
+#endif
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -400,11 +408,15 @@
 }
 
 static inline Sk4f swizzle_rb_if_bgra(const Sk4f& x) {
+#if defined(STARBOARD)
+    return (GetSkPmcolor() == SkPmcolorIsBgra) ? swizzle_rb(x) : x;
+#else
 #ifdef SK_PMCOLOR_IS_BGRA
     return swizzle_rb(x);
 #else
     return x;
 #endif
+#endif
 }
 
 static inline Sk4f Sk4f_fromL32(uint32_t px) {
diff --git a/third_party/skia_next/third_party/skia/modules/skottie/src/effects/DisplacementMapEffect.cpp b/third_party/skia_next/third_party/skia/modules/skottie/src/effects/DisplacementMapEffect.cpp
index 198a715..f1b4462 100644
--- a/third_party/skia_next/third_party/skia/modules/skottie/src/effects/DisplacementMapEffect.cpp
+++ b/third_party/skia_next/third_party/skia/modules/skottie/src/effects/DisplacementMapEffect.cpp
@@ -394,7 +394,11 @@
 sk_sp<sksg::RenderNode> EffectBuilder::attachDisplacementMapEffect(
         const skjson::ArrayValue& jprops, sk_sp<sksg::RenderNode> layer) const {
 #ifdef SK_ENABLE_SKSL
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [ displ, displ_size ] = DisplacementMapAdapter::GetDisplacementSource(jprops, this);
+#else
+    STRUCTURED_BINDING_2(displ, displ_size, DisplacementMapAdapter::GetDisplacementSource(jprops, this));
+#endif
 
     auto displ_node = DisplacementNode::Make(layer, fLayerSize, std::move(displ), displ_size);
 
diff --git a/third_party/skia_next/third_party/skia/modules/skottie/src/effects/FractalNoiseEffect.cpp b/third_party/skia_next/third_party/skia/modules/skottie/src/effects/FractalNoiseEffect.cpp
index e64d5c0..624af6d 100644
--- a/third_party/skia_next/third_party/skia/modules/skottie/src/effects/FractalNoiseEffect.cpp
+++ b/third_party/skia_next/third_party/skia/modules/skottie/src/effects/FractalNoiseEffect.cpp
@@ -469,7 +469,11 @@
     void onSync() override {
         const auto& n = this->node();
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         const auto [noise_planes, noise_weight] = this->noise();
+#else
+        const STRUCTURED_BINDING_2(noise_planes, noise_weight, this->noise());
+#endif
 
         n->setOctaves(SkTPin(fComplexity, 1.0f, 20.0f));
         n->setPersistence(SkTPin(fSubInfluence * 0.01f, 0.0f, 100.0f));
diff --git a/third_party/skia_next/third_party/skia/src/codec/SkCodec.cpp b/third_party/skia_next/third_party/skia/src/codec/SkCodec.cpp
index 497ff95..cf1c5cd 100644
--- a/third_party/skia_next/third_party/skia/src/codec/SkCodec.cpp
+++ b/third_party/skia_next/third_party/skia/src/codec/SkCodec.cpp
@@ -684,11 +684,16 @@
             break;
         case kRGB_565_SkColorType:
             if (forColorTable) {
+#if defined(STARBOARD)
+                *outFormat = (GetSkPmcolor() == SkPmcolorIsRgba) ? skcms_PixelFormat_RGBA_8888
+                                                                 : skcms_PixelFormat_RGBA_8888;
+#else
 #ifdef SK_PMCOLOR_IS_RGBA
                 *outFormat = skcms_PixelFormat_RGBA_8888;
 #else
                 *outFormat = skcms_PixelFormat_BGRA_8888;
 #endif
+#endif
                 break;
             }
             *outFormat = skcms_PixelFormat_BGR_565;
diff --git a/third_party/skia_next/third_party/skia/src/codec/SkCodecPriv.h b/third_party/skia_next/third_party/skia/src/codec/SkCodecPriv.h
index ec0f7c9..ab790c2 100644
--- a/third_party/skia_next/third_party/skia/src/codec/SkCodecPriv.h
+++ b/third_party/skia_next/third_party/skia/src/codec/SkCodecPriv.h
@@ -226,11 +226,16 @@
 }
 
 static inline bool is_rgba(SkColorType colorType) {
+#if defined(STARBOARD)
+    return (GetSkPmcolor() == SkPmcolorIsRgba) ? (kBGRA_8888_SkColorType != colorType)
+                                               : (kBGRA_8888_SkColorType == colorType);
+#else
 #ifdef SK_PMCOLOR_IS_RGBA
     return (kBGRA_8888_SkColorType != colorType);
 #else
     return (kRGBA_8888_SkColorType == colorType);
 #endif
+#endif
 }
 
 // Method for coverting to a 32 bit pixel.
diff --git a/third_party/skia_next/third_party/skia/src/core/SkBlitter.cpp b/third_party/skia_next/third_party/skia/src/core/SkBlitter.cpp
index d0e318d..fb9f928 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkBlitter.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkBlitter.cpp
@@ -795,28 +795,25 @@
         }
     }
 
-    switch (device.colorType()) {
-        case kN32_SkColorType:
-            if (shaderContext) {
-                return alloc->make<SkARGB32_Shader_Blitter>(device, *paint, shaderContext);
-            } else if (paint->getColor() == SK_ColorBLACK) {
-                return alloc->make<SkARGB32_Black_Blitter>(device, *paint);
-            } else if (paint->getAlpha() == 0xFF) {
-                return alloc->make<SkARGB32_Opaque_Blitter>(device, *paint);
-            } else {
-                return alloc->make<SkARGB32_Blitter>(device, *paint);
-            }
-
-        case kRGB_565_SkColorType:
-            if (shaderContext && SkRGB565_Shader_Blitter::Supports(device, *paint)) {
-                return alloc->make<SkRGB565_Shader_Blitter>(device, *paint, shaderContext);
-            } else {
-                return create_SkRP_or_SkVMBlitter();
-            }
-
-        default:
-            SkASSERT(false);
-            return alloc->make<SkNullBlitter>();
+    if (device.colorType() == kN32_SkColorType) {
+        if (shaderContext) {
+            return alloc->make<SkARGB32_Shader_Blitter>(device, *paint, shaderContext);
+        } else if (paint->getColor() == SK_ColorBLACK) {
+            return alloc->make<SkARGB32_Black_Blitter>(device, *paint);
+        } else if (paint->getAlpha() == 0xFF) {
+            return alloc->make<SkARGB32_Opaque_Blitter>(device, *paint);
+        } else {
+            return alloc->make<SkARGB32_Blitter>(device, *paint);
+        }
+    } else if (device.colorType() == kRGB_565_SkColorType) {
+        if (shaderContext && SkRGB565_Shader_Blitter::Supports(device, *paint)) {
+            return alloc->make<SkRGB565_Shader_Blitter>(device, *paint, shaderContext);
+        } else {
+            return create_SkRP_or_SkVMBlitter();
+        }
+    } else {
+        SkASSERT(false);
+        return alloc->make<SkNullBlitter>();
     }
 }
 
diff --git a/third_party/skia_next/third_party/skia/src/core/SkBlitter_Sprite.cpp b/third_party/skia_next/third_party/skia/src/core/SkBlitter_Sprite.cpp
index 8c1b2ef..0ef4d9b 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkBlitter_Sprite.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkBlitter_Sprite.cpp
@@ -204,9 +204,6 @@
         }
         if (!blitter) {
             switch (dst.colorType()) {
-                case kN32_SkColorType:
-                    blitter = SkSpriteBlitter::ChooseL32(source, paint, alloc);
-                    break;
                 case kRGB_565_SkColorType:
                     blitter = SkSpriteBlitter::ChooseL565(source, paint, alloc);
                     break;
@@ -214,6 +211,9 @@
                     blitter = SkSpriteBlitter::ChooseLA8(source, paint, alloc);
                     break;
                 default:
+                    if (dst.colorType() == kN32_SkColorType) {
+                        blitter = SkSpriteBlitter::ChooseL32(source, paint, alloc);
+                    }
                     break;
             }
         }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkBlurMF.cpp b/third_party/skia_next/third_party/skia/src/core/SkBlurMF.cpp
index f516697..cbff40d 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkBlurMF.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkBlurMF.cpp
@@ -1280,11 +1280,19 @@
     if (GrDirectContext* dContext = rContext->asDirectContext()) {
         // The gpu thread gets priority over the recording threads. If the gpu thread is first,
         // it crams a lazy proxy into the cache and then fills it in later.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [lazyView, trampoline] = GrThreadSafeCache::CreateLazyView(dContext,
                                                                         GrColorType::kAlpha_8,
                                                                         dimensions,
                                                                         kBlurredRRectMaskOrigin,
                                                                         SkBackingFit::kExact);
+#else
+        STRUCTURED_BINDING_2(lazyView, trampoline, GrThreadSafeCache::CreateLazyView(dContext,
+                                                                        GrColorType::kAlpha_8,
+                                                                        dimensions,
+                                                                        kBlurredRRectMaskOrigin,
+                                                                        SkBackingFit::kExact));
+#endif
         if (!lazyView) {
             return nullptr;
         }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkCanvas.cpp b/third_party/skia_next/third_party/skia/src/core/SkCanvas.cpp
index 34e7027..9effc55 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkCanvas.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkCanvas.cpp
@@ -1722,6 +1722,20 @@
     return nullptr;
 }
 
+#ifdef STARBOARD
+intptr_t SkCanvas::getRenderTargetHandle() const {
+    if (fSurfaceBase) {
+        GrBackendRenderTarget target =
+                fSurfaceBase->getBackendRenderTarget(SkSurface::kFlushRead_BackendHandleAccess);
+        GrGLFramebufferInfo info;
+        if (target.getGLFramebufferInfo(&info)) {
+            return info.fFBOID;
+        }
+    }
+    return 0;
+}
+#endif
+
 void SkCanvas::drawDRRect(const SkRRect& outer, const SkRRect& inner,
                           const SkPaint& paint) {
     TRACE_EVENT0("skia", TRACE_FUNC);
@@ -2365,8 +2379,13 @@
                           SkPoint origin, const SkFont& font, const SkPaint& paint) {
     if (count <= 0) { return; }
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [positions, rotateScales] =
             fScratchGlyphRunBuilder->convertRSXForm(SkMakeSpan(xforms, count));
+#else
+    STRUCTURED_BINDING_2(positions, rotateScales,
+            fScratchGlyphRunBuilder->convertRSXForm(SkMakeSpan(xforms, count)));
+#endif
 
     SkGlyphRun glyphRun {
             font,
diff --git a/third_party/skia_next/third_party/skia/src/core/SkColorFilter.cpp b/third_party/skia_next/third_party/skia/src/core/SkColorFilter.cpp
index 38c7ee5..b659aaf 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkColorFilter.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkColorFilter.cpp
@@ -171,14 +171,24 @@
                                    const GrColorInfo& dstColorInfo) const override {
         GrFragmentProcessor* originalInputFP = inputFP.get();
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [innerSuccess, innerFP] =
                 fInner->asFragmentProcessor(std::move(inputFP), context, dstColorInfo);
+#else
+        STRUCTURED_BINDING_2(innerSuccess, innerFP,
+                fInner->asFragmentProcessor(std::move(inputFP), context, dstColorInfo));
+#endif
         if (!innerSuccess) {
             return GrFPFailure(std::move(innerFP));
         }
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [outerSuccess, outerFP] =
                 fOuter->asFragmentProcessor(std::move(innerFP), context, dstColorInfo);
+#else
+        STRUCTURED_BINDING_2(outerSuccess, outerFP,
+                fOuter->asFragmentProcessor(std::move(innerFP), context, dstColorInfo));
+#endif
         if (!outerSuccess) {
             // In the rare event that the outer FP cannot be built, we have no good way of
             // separating the inputFP from the innerFP, so we need to return a cloned inputFP.
@@ -363,8 +373,13 @@
         GrColorInfo dst = {dstColorInfo.colorType(), dstColorInfo.alphaType(), dstCS},
                 working = {dstColorInfo.colorType(), workingAT, workingCS};
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [ok, fp] = as_CFB(fChild)->asFragmentProcessor(
                 GrColorSpaceXformEffect::Make(std::move(inputFP), dst,working), context, working);
+#else
+        STRUCTURED_BINDING_2(ok, fp, as_CFB(fChild)->asFragmentProcessor(
+                GrColorSpaceXformEffect::Make(std::move(inputFP), dst,working), context, working));
+#endif
 
         return ok ? GrFPSuccess(GrColorSpaceXformEffect::Make(std::move(fp), working,dst))
                   : GrFPFailure(std::move(fp));
diff --git a/third_party/skia_next/third_party/skia/src/core/SkColorFilter_Matrix.cpp b/third_party/skia_next/third_party/skia/src/core/SkColorFilter_Matrix.cpp
index a0a047c..3c6cb95 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkColorFilter_Matrix.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkColorFilter_Matrix.cpp
@@ -97,7 +97,11 @@
             skvm::F32 bias = b == 0.0f ? p->splat(0.0f)
                                        : p->uniformF(uniforms->pushF(b));
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [x,y,z,w] = xyzw;
+#else
+            STRUCTURED_BINDING_4(x,y,z,w, xyzw);
+#endif
             return custom_mad(fMatrix[0+j*5], x,
                    custom_mad(fMatrix[1+j*5], y,
                    custom_mad(fMatrix[2+j*5], z,
@@ -109,10 +113,18 @@
     c = unpremul(c);
 
     if (fDomain == Domain::kHSLA) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [h,s,l,a] = apply_matrix(p->to_hsla(c));
+#else
+        STRUCTURED_BINDING_4(h,s,l,a, apply_matrix(p->to_hsla(c)));
+#endif
         c = p->to_rgba({h,s,l,a});
     } else {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [r,g,b,a] = apply_matrix(c);
+#else
+        STRUCTURED_BINDING_4(r,g,b,a, apply_matrix(c));
+#endif
         c = {r,g,b,a};
     }
 
diff --git a/third_party/skia_next/third_party/skia/src/core/SkContourMeasure.cpp b/third_party/skia_next/third_party/skia/src/core/SkContourMeasure.cpp
index 7755b4c..b434cd2 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkContourMeasure.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkContourMeasure.cpp
@@ -346,7 +346,11 @@
 
     auto end = SkPathPriv::Iterate(fPath).end();
     for (; fIter != end; ++fIter) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [verb, pts, w] = *fIter;
+#else
+        STRUCTURED_BINDING_3(verb, pts, w, *fIter);
+#endif
         if (haveSeenMoveTo && verb == SkPathVerb::kMove) {
             break;
         }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkCpu.cpp b/third_party/skia_next/third_party/skia/src/core/SkCpu.cpp
index a88f498..49abc46 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkCpu.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkCpu.cpp
@@ -10,6 +10,10 @@
 #include "include/private/SkOnce.h"
 #include "src/core/SkCpu.h"
 
+#if defined(STARBOARD)
+#include "starboard/cpu_features.h"
+#endif
+
 #if defined(SK_CPU_X86)
     #if defined(_MSC_VER)
         #include <intrin.h>
@@ -81,7 +85,15 @@
                        kHWCAP_ASIMDHP = (1<<10);
 
         uint32_t features = 0;
+#if defined(STARBOARD)
+        uint32_t hwcaps = 0;
+        SbCPUFeatures cpu_features;
+        if (SbCPUFeaturesGet(&cpu_features)) {
+            hwcaps = cpu_features.hwcap;
+        }
+#else
         uint32_t hwcaps = getauxval(AT_HWCAP);
+#endif  // defined(STARBOARD)
         if (hwcaps & kHWCAP_CRC32  ) { features |= SkCpu::CRC32; }
         if (hwcaps & kHWCAP_ASIMDHP) { features |= SkCpu::ASIMDHP; }
 
diff --git a/third_party/skia_next/third_party/skia/src/core/SkData.cpp b/third_party/skia_next/third_party/skia/src/core/SkData.cpp
index f957542..467d080 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkData.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkData.cpp
@@ -121,7 +121,7 @@
     sk_fmunmap(addr, length);
 }
 
-sk_sp<SkData> SkData::MakeFromFILE(FILE* f) {
+sk_sp<SkData> SkData::MakeFromFILE(SkFile* f) {
     size_t size;
     void* addr = sk_fmmap(f, &size);
     if (nullptr == addr) {
@@ -132,7 +132,7 @@
 }
 
 sk_sp<SkData> SkData::MakeFromFileName(const char path[]) {
-    FILE* f = path ? sk_fopen(path, kRead_SkFILE_Flag) : nullptr;
+    SkFile* f = path ? sk_fopen(path, kRead_SkFILE_Flag) : nullptr;
     if (nullptr == f) {
         return nullptr;
     }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkDevice.cpp b/third_party/skia_next/third_party/skia/src/core/SkDevice.cpp
index 476a19e..4b8d646 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkDevice.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkDevice.cpp
@@ -466,9 +466,18 @@
             };
 
             const SkM44 originalLocalToDevice = this->localToDevice44();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             for (auto [i, glyphID, pos] : SkMakeEnumerate(run.source())) {
+#else
+            for (auto item : SkMakeEnumerate(run.source())) {
+                STRUCTURED_BINDING_3(i, glyphID, pos, std::move(item));
+#endif
                 sharedGlyphID = glyphID;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 auto [scos, ssin] = run.scaledRotations()[i];
+#else
+                STRUCTURED_BINDING_2(scos, ssin, run.scaledRotations()[i]);
+#endif
                 SkRSXform rsxForm = SkRSXform::Make(scos, ssin, pos.x(), pos.y());
                 SkMatrix glyphToLocal;
                 glyphToLocal.setRSXform(rsxForm).postTranslate(origin.x(), origin.y());
diff --git a/third_party/skia_next/third_party/skia/src/core/SkDraw_text.cpp b/third_party/skia_next/third_party/skia/src/core/SkDraw_text.cpp
index 5989f22..bd6dccd 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkDraw_text.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkDraw_text.cpp
@@ -54,7 +54,12 @@
     bool useRegion = fRC->isBW() && !fRC->isRect();
 
     if (useRegion) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [variant, pos] : drawables->drawable()) {
+#else
+        for (auto item : drawables->drawable()) {
+            STRUCTURED_BINDING_2(variant, pos, std::move(item));
+#endif
             SkGlyph* glyph = variant.glyph();
             if (check_glyph_position(pos)) {
                 SkMask mask = glyph->mask(pos);
@@ -81,7 +86,12 @@
     } else {
         SkIRect clipBounds = fRC->isBW() ? fRC->bwRgn().getBounds()
                                          : fRC->aaRgn().getBounds();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [variant, pos] : drawables->drawable()) {
+#else
+        for (auto item : drawables->drawable()) {
+            STRUCTURED_BINDING_2(variant, pos, std::move(item));
+#endif
             SkGlyph* glyph = variant.glyph();
             if (check_glyph_position(pos)) {
                 SkMask mask = glyph->mask(pos);
@@ -115,7 +125,12 @@
                         SkScalar scale,
                         SkPoint origin,
                         const SkPaint& paint) const {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [variant, pos] : drawables->drawable()) {
+#else
+    for (auto item : drawables->drawable()) {
+        STRUCTURED_BINDING_2(variant, pos, std::move(item));
+#endif
         const SkPath* path = variant.path();
         SkMatrix m;
         SkPoint translate = origin + pos;
diff --git a/third_party/skia_next/third_party/skia/src/core/SkExecutor.cpp b/third_party/skia_next/third_party/skia/src/core/SkExecutor.cpp
index 8b12b46..2f561df 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkExecutor.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkExecutor.cpp
@@ -13,6 +13,12 @@
 #include <deque>
 #include <thread>
 
+#if defined(STARBOARD)
+#include "starboard/system.h"
+static int num_cores() {
+  return SbSystemGetNumberOfProcessors();
+}
+#else  // defined(STARBOARD)
 #if defined(SK_BUILD_FOR_WIN)
     #include "src/core/SkLeanWindows.h"
     static int num_cores() {
@@ -26,6 +32,7 @@
         return (int)sysconf(_SC_NPROCESSORS_ONLN);
     }
 #endif
+#endif  // defined(STARBOARD)
 
 SkExecutor::~SkExecutor() {}
 
diff --git a/third_party/skia_next/third_party/skia/src/core/SkFont.cpp b/third_party/skia_next/third_party/skia/src/core/SkFont.cpp
index f74d868..1eb1e6c 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkFont.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkFont.cpp
@@ -169,7 +169,11 @@
     }
     const SkGlyphID* glyphIDs = atg.glyphs();
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [strikeSpec, strikeToSourceScale] = SkStrikeSpec::MakeCanonicalized(*this, paint);
+#else
+    STRUCTURED_BINDING_2(strikeSpec, strikeToSourceScale, SkStrikeSpec::MakeCanonicalized(*this, paint));
+#endif
     SkBulkGlyphMetrics metrics{strikeSpec};
     SkSpan<const SkGlyph*> glyphs = metrics.glyphs(SkMakeSpan(glyphIDs, glyphCount));
 
@@ -207,7 +211,11 @@
                              SkScalar widths[],
                              SkRect bounds[],
                              const SkPaint* paint) const {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [strikeSpec, strikeToSourceScale] = SkStrikeSpec::MakeCanonicalized(*this, paint);
+#else
+    STRUCTURED_BINDING_2(strikeSpec, strikeToSourceScale, SkStrikeSpec::MakeCanonicalized(*this, paint));
+#endif
     SkBulkGlyphMetrics metrics{strikeSpec};
     SkSpan<const SkGlyph*> glyphs = metrics.glyphs(SkMakeSpan(glyphIDs, count));
 
@@ -228,7 +236,11 @@
 }
 
 void SkFont::getPos(const SkGlyphID glyphIDs[], int count, SkPoint pos[], SkPoint origin) const {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [strikeSpec, strikeToSourceScale] = SkStrikeSpec::MakeCanonicalized(*this);
+#else
+    STRUCTURED_BINDING_2(strikeSpec, strikeToSourceScale, SkStrikeSpec::MakeCanonicalized(*this));
+#endif
     SkBulkGlyphMetrics metrics{strikeSpec};
     SkSpan<const SkGlyph*> glyphs = metrics.glyphs(SkMakeSpan(glyphIDs, count));
 
@@ -242,7 +254,11 @@
 void SkFont::getXPos(
         const SkGlyphID glyphIDs[], int count, SkScalar xpos[], SkScalar origin) const {
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [strikeSpec, strikeToSourceScale] = SkStrikeSpec::MakeCanonicalized(*this);
+#else
+    STRUCTURED_BINDING_2(strikeSpec, strikeToSourceScale, SkStrikeSpec::MakeCanonicalized(*this));
+#endif
     SkBulkGlyphMetrics metrics{strikeSpec};
     SkSpan<const SkGlyph*> glyphs = metrics.glyphs(SkMakeSpan(glyphIDs, count));
 
@@ -287,7 +303,11 @@
 
 SkScalar SkFont::getMetrics(SkFontMetrics* metrics) const {
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [strikeSpec, strikeToSourceScale] = SkStrikeSpec::MakeCanonicalized(*this, nullptr);
+#else
+    STRUCTURED_BINDING_2(strikeSpec, strikeToSourceScale, SkStrikeSpec::MakeCanonicalized(*this, nullptr));
+#endif
 
     SkFontMetrics storage;
     if (nullptr == metrics) {
diff --git a/third_party/skia_next/third_party/skia/src/core/SkGlyphBuffer.cpp b/third_party/skia_next/third_party/skia/src/core/SkGlyphBuffer.cpp
index 31b247a..4f90bdb 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkGlyphBuffer.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkGlyphBuffer.cpp
@@ -62,7 +62,12 @@
     SkZip<const SkGlyphID, const SkPoint> withMappedPos =
             SkMakeZip(source.get<0>(), fPositions.get());
     SkGlyphVariant* packedIDCursor = fMultiBuffer.get();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [glyphID, pos] : withMappedPos) {
+#else
+    for (auto item : withMappedPos) {
+        STRUCTURED_BINDING_2(glyphID, pos, std::move(item));
+#endif
         *packedIDCursor++ = SkPackedGlyphID{glyphID, pos, mask};
     }
     SkDEBUGCODE(fPhase = kInput);
@@ -88,8 +93,14 @@
         return {SkScalarFloorToScalar(pt.x()), SkScalarFloorToScalar(pt.y())};
     };
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [packedGlyphID, glyphID, pos]
             : SkMakeZip(fMultiBuffer.get(), source.get<0>(), fPositions.get())) {
+#else
+    for (auto item
+            : SkMakeZip(fMultiBuffer.get(), source.get<0>(), fPositions.get())) {
+        STRUCTURED_BINDING_3(packedGlyphID, glyphID, pos, std::move(item));
+#endif
         packedGlyphID = SkPackedGlyphID{glyphID, pos, roundingSpec.ignorePositionFieldMask};
         // Store rounded device coords back in pos.
         pos = floor(pos);
@@ -102,8 +113,14 @@
     SkASSERT(fPhase == kInput);
 
     SkString msg;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [packedGlyphID, pos]
             : SkZip<SkGlyphVariant, SkPoint>{fInputSize, fMultiBuffer.get(), fPositions.get()}) {
+#else
+    for (auto item
+            : SkZip<SkGlyphVariant, SkPoint>{fInputSize, fMultiBuffer.get(), fPositions.get()}) {
+        STRUCTURED_BINDING_2(packedGlyphID, pos, std::move(item));
+#endif
         msg.appendf("0x%x:(%a,%a), ", packedGlyphID.packedID().value(), pos.x(), pos.y());
     }
     return msg;
diff --git a/third_party/skia_next/third_party/skia/src/core/SkGlyphBuffer.h b/third_party/skia_next/third_party/skia/src/core/SkGlyphBuffer.h
index f373679..3e2880f 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkGlyphBuffer.h
+++ b/third_party/skia_next/third_party/skia/src/core/SkGlyphBuffer.h
@@ -34,7 +34,11 @@
         if (!this->sourceIsRejectBuffers()) {
             // Need to expand the buffers for first use. All other reject sets will be fewer than
             // this one.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [glyphID, pos] = fSource[index];
+#else
+            STRUCTURED_BINDING_2(glyphID, pos, fSource[index]);
+#endif
             fRejectedGlyphIDs.push_back(glyphID);
             fRejectedPositions.push_back(pos);
             fRejectSize++;
@@ -217,7 +221,12 @@
 
     template <typename Fn>
     void forEachGlyphID(Fn&& fn) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [i, packedID, pos] : SkMakeEnumerate(this->input())) {
+#else
+        for (auto item : SkMakeEnumerate(this->input())) {
+            STRUCTURED_BINDING_3(i, packedID, pos, std::move(item));
+#endif
             fn(i, packedID.packedID(), pos);
         }
     }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkGlyphRun.cpp b/third_party/skia_next/third_party/skia/src/core/SkGlyphRun.cpp
index c5b82ff..92ecc0a 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkGlyphRun.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkGlyphRun.cpp
@@ -46,7 +46,11 @@
     if (fontBounds.isEmpty()) {
         // Empty font bounds are likely a font bug.  TightBounds has a better chance of
         // producing useful results in this case.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [strikeSpec, strikeToSourceScale] = SkStrikeSpec::MakeCanonicalized(fFont, &paint);
+#else
+        STRUCTURED_BINDING_2(strikeSpec, strikeToSourceScale, SkStrikeSpec::MakeCanonicalized(fFont, &paint));
+#endif
         SkBulkGlyphMetrics metrics{strikeSpec};
         SkSpan<const SkGlyph*> glyphs = metrics.glyphs(this->glyphsIDs());
         if (fScaledRotations.empty()) {
@@ -60,7 +64,12 @@
                 };
 
             SkRect bounds = SkRect::MakeEmpty();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             for (auto [pos, glyph] : SkMakeZip(this->positions(), glyphs)) {
+#else
+            for (auto item : SkMakeZip(this->positions(), glyphs)) {
+                STRUCTURED_BINDING_2(pos, glyph, std::move(item));
+#endif
                 if (SkRect r = glyph->rect(); !r.isEmpty()) {
                     bounds.join(scaleAndTranslateRect(r, pos));
                 }
@@ -69,8 +78,14 @@
         } else {
             // RSXForm - glyphs can be any scale or rotation.
             SkRect bounds = SkRect::MakeEmpty();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             for (auto [pos, scaleRotate, glyph] :
                     SkMakeZip(this->positions(), fScaledRotations, glyphs)) {
+#else
+            for (auto item :
+                    SkMakeZip(this->positions(), fScaledRotations, glyphs)) {
+                STRUCTURED_BINDING_3(pos, scaleRotate, glyph, std::move(item));
+#endif
                 if (!glyph->rect().isEmpty()) {
                     SkMatrix xform = SkMatrix().setRSXform(
                             SkRSXform{pos.x(), pos.y(), scaleRotate.x(), scaleRotate.y()});
@@ -95,7 +110,12 @@
         // RSXForm case glyphs can be any scale or rotation.
         SkRect bounds;
         bounds.setEmpty();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [pos, scaleRotate] : SkMakeZip(this->positions(), fScaledRotations)) {
+#else
+        for (auto item : SkMakeZip(this->positions(), fScaledRotations)) {
+            STRUCTURED_BINDING_2(pos, scaleRotate, std::move(item));
+#endif
             const SkRSXform xform{pos.x(), pos.y(), scaleRotate.x(), scaleRotate.y()};
             bounds.join(SkMatrix().setRSXform(xform).mapRect(fontBounds));
         }
@@ -158,9 +178,16 @@
             memcpy(buffer.points(), positions.data(), positions.size_bytes());
         } else {
             buffer = builder.allocRunRSXform(run.font(), run.runSize());
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             for (auto [xform, pos, sr] : SkMakeZip(buffer.xforms(),
                                                    run.positions(),
                                                    run.scaledRotations())) {
+#else
+            for (auto item : SkMakeZip(buffer.xforms(),
+                                                   run.positions(),
+                                                   run.scaledRotations())) {
+                STRUCTURED_BINDING_3(xform, pos, sr, std::move(item));
+#endif
                 xform = SkRSXform::Make(sr.x(), sr.y(), pos.x(), pos.y());
             }
         }
@@ -272,8 +299,17 @@
     this->prepareBuffers(count, count);
     auto positions = SkMakeSpan(fPositions.get(), count);
     auto scaledRotations = SkMakeSpan(fScaledRotations.get(), count);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [pos, sr, xform] : SkMakeZip(positions, scaledRotations, xforms)) {
+#else
+    for (auto item : SkMakeZip(positions, scaledRotations, xforms)) {
+        STRUCTURED_BINDING_3(pos, sr, xform, std::move(item));
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [scos, ssin, tx, ty] = xform;
+#else
+        STRUCTURED_BINDING_4(scos, ssin, tx, ty, xform);
+#endif
         pos = {tx, ty};
         sr = {scos, ssin};
     }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkGlyphRunPainter.cpp b/third_party/skia_next/third_party/skia/src/core/SkGlyphRunPainter.cpp
index 32b5692..756642e 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkGlyphRunPainter.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkGlyphRunPainter.cpp
@@ -100,8 +100,13 @@
 
         if (SkStrikeSpec::ShouldDrawAsPath(paint, runFont, deviceMatrix)) {
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [strikeSpec, strikeToSourceScale] =
                     SkStrikeSpec::MakePath(runFont, paint, props, fScalerContextFlags);
+#else
+            STRUCTURED_BINDING_2(strikeSpec, strikeToSourceScale,
+                    SkStrikeSpec::MakePath(runFont, paint, props, fScalerContextFlags));
+#endif
 
             auto strike = strikeSpec.findOrCreateStrike();
 
@@ -145,7 +150,12 @@
             SkScalar maxScale = SK_ScalarMin;
 
             // Calculate the scale that makes the longest edge 1:1 with its side in the cache.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             for (auto [glyph, pos] : SkMakeZip(glyphs, positions)) {
+#else
+            for (auto item : SkMakeZip(glyphs, positions)) {
+                STRUCTURED_BINDING_2(glyph, pos, std::move(item));
+#endif
                 SkPoint corners[4];
                 SkPoint srcPos = pos + drawOrigin;
                 // Store off the positions in device space to position the glyphs during drawing.
@@ -183,7 +193,12 @@
 
             strike->prepareForDrawingMasksCPU(&fDrawable);
             auto variants = fDrawable.drawable().get<0>();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             for (auto [variant, srcPos] : SkMakeZip(variants, sourcePositions)) {
+#else
+            for (auto item : SkMakeZip(variants, sourcePositions)) {
+                STRUCTURED_BINDING_2(variant, srcPos, std::move(item));
+#endif
                 SkGlyph* glyph = variant.glyph();
                 SkMask mask = glyph->mask();
                 // TODO: is this needed will A8 and BW just work?
@@ -246,8 +261,13 @@
 
     if (drawingType == GrSDFTControl::kSDFT) {
         // Process SDFT - This should be the .009% case.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         const auto& [strikeSpec, minScale, maxScale] =
                 SkStrikeSpec::MakeSDFT(runFont, runPaint, fDeviceProps, drawMatrix, control);
+#else
+        STRUCTURED_BINDING_3(strikeSpec, minScale, maxScale,
+                SkStrikeSpec::MakeSDFT(runFont, runPaint, fDeviceProps, drawMatrix, control));
+#endif
 
         #if defined(SK_TRACE_GLYPH_RUN_PROCESS)
             msg.appendf("  SDFT case:\n%s", strikeSpec.dump().c_str());
@@ -305,8 +325,13 @@
     SkScalar maxDimensionInSourceSpace = 0.0;
     if (!fRejects.source().empty()) {
         // Path case - handle big things without color and that have a path.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [strikeSpec, strikeToSourceScale] =
                 SkStrikeSpec::MakePath(runFont, runPaint, fDeviceProps, fScalerContextFlags);
+#else
+        STRUCTURED_BINDING_2(strikeSpec, strikeToSourceScale,
+                SkStrikeSpec::MakePath(runFont, runPaint, fDeviceProps, fScalerContextFlags));
+#endif
 
         #if defined(SK_TRACE_GLYPH_RUN_PROCESS)
             msg.appendf("  Path case:\n%s", strikeSpec.dump().c_str());
diff --git a/third_party/skia_next/third_party/skia/src/core/SkGpuBlurUtils.cpp b/third_party/skia_next/third_party/skia/src/core/SkGpuBlurUtils.cpp
index 81800c9..b4b6ed1 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkGpuBlurUtils.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkGpuBlurUtils.cpp
@@ -652,7 +652,11 @@
                                      SkMatrix::I(),
                                      nullptr);
         };
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [dw, dh] = rescaledSize;
+#else
+        STRUCTURED_BINDING_2(dw, dh, rescaledSize);
+#endif
         // The are the src rows and columns from the source that we will scale into the dst padding.
         float sLCol = srcBounds.left();
         float sTRow = srcBounds.top();
diff --git a/third_party/skia_next/third_party/skia/src/core/SkGpuBlurUtils.h b/third_party/skia_next/third_party/skia/src/core/SkGpuBlurUtils.h
index 01dd121..4d3361c 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkGpuBlurUtils.h
+++ b/third_party/skia_next/third_party/skia/src/core/SkGpuBlurUtils.h
@@ -105,4 +105,13 @@
 
 #endif // SK_SUPPORT_GPU
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<SkISize> {
+  static auto Coerce(const SkISize& t) {
+    return std::make_tuple(t.fWidth, t.fHeight);
+  }
+};
+#endif
+
 #endif
diff --git a/third_party/skia_next/third_party/skia/src/core/SkIPoint16.h b/third_party/skia_next/third_party/skia/src/core/SkIPoint16.h
index c66465f..19b8b38 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkIPoint16.h
+++ b/third_party/skia_next/third_party/skia/src/core/SkIPoint16.h
@@ -53,5 +53,17 @@
     }
 };
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<SkIPoint16> {
+  static auto Coerce(SkIPoint16&& t) {
+    return std::make_tuple(t.fX, t.fY);
+  }
+  static auto Coerce(const SkIPoint16& t) {
+    return std::make_tuple(t.fX, t.fY);
+  }
+};
+#endif
+
 #endif
 
diff --git a/third_party/skia_next/third_party/skia/src/core/SkOSFile.h b/third_party/skia_next/third_party/skia/src/core/SkOSFile.h
index 9e8a396..3368579 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkOSFile.h
+++ b/third_party/skia_next/third_party/skia/src/core/SkOSFile.h
@@ -11,6 +11,14 @@
 #ifndef SkOSFile_DEFINED
 #define SkOSFile_DEFINED
 
+#if defined(STARBOARD)
+#include "starboard/file.h"
+#define SkFile SbFilePrivate
+#else
+#include <stdio.h>
+#define SkFile FILE
+#endif
+
 #include <stdio.h>
 
 #include "include/core/SkString.h"
@@ -21,23 +29,23 @@
     kWrite_SkFILE_Flag  = 0x02
 };
 
-FILE* sk_fopen(const char path[], SkFILE_Flags);
-void    sk_fclose(FILE*);
+SkFile* sk_fopen(const char path[], SkFILE_Flags);
+void    sk_fclose(SkFile*);
 
-size_t  sk_fgetsize(FILE*);
+size_t  sk_fgetsize(SkFile*);
 
-size_t  sk_fwrite(const void* buffer, size_t byteCount, FILE*);
+size_t  sk_fwrite(const void* buffer, size_t byteCount, SkFile*);
 
-void    sk_fflush(FILE*);
-void    sk_fsync(FILE*);
+void    sk_fflush(SkFile*);
+void    sk_fsync(SkFile*);
 
-size_t  sk_ftell(FILE*);
+size_t  sk_ftell(SkFile*);
 
 /** Maps a file into memory. Returns the address and length on success, NULL otherwise.
  *  The mapping is read only.
  *  When finished with the mapping, free the returned pointer with sk_fmunmap.
  */
-void*   sk_fmmap(FILE* f, size_t* length);
+void*   sk_fmmap(SkFile* f, size_t* length);
 
 /** Maps a file descriptor into memory. Returns the address and length on success, NULL otherwise.
  *  The mapping is read only.
@@ -51,12 +59,12 @@
 void    sk_fmunmap(const void* addr, size_t length);
 
 /** Returns true if the two point at the exact same filesystem object. */
-bool    sk_fidentical(FILE* a, FILE* b);
+bool    sk_fidentical(SkFile* a, SkFile* b);
 
 /** Returns the underlying file descriptor for the given file.
  *  The return value will be < 0 on failure.
  */
-int     sk_fileno(FILE* f);
+int     sk_fileno(SkFile* f);
 
 /** Returns true if something (file, directory, ???) exists at this path,
  *  and has the specified access flags.
@@ -68,7 +76,7 @@
 
 // Like pread, but may affect the file position marker.
 // Returns the number of bytes read or SIZE_MAX if failed.
-size_t sk_qread(FILE*, void* buffer, size_t count, size_t offset);
+size_t sk_qread(SkFile*, void* buffer, size_t count, size_t offset);
 
 
 // Create a new directory at this path; returns true if successful.
diff --git a/third_party/skia_next/third_party/skia/src/core/SkOpts.cpp b/third_party/skia_next/third_party/skia/src/core/SkOpts.cpp
index e69bedb..2a6eae1 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkOpts.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkOpts.cpp
@@ -115,6 +115,7 @@
     void Init_crc32();
 
     static void init() {
+#if !(defined(STARBOARD) && defined(SK_BUILD_NO_OPTS))
     #if defined(SK_CPU_X86)
         #if SK_CPU_SSE_LEVEL < SK_CPU_SSE_LEVEL_SSSE3
             if (SkCpu::Supports(SkCpu::SSSE3)) { Init_ssse3(); }
@@ -139,6 +140,7 @@
         if (SkCpu::Supports(SkCpu::CRC32)) { Init_crc32(); }
 
     #endif
+#endif
     }
 
     void Init() {
diff --git a/third_party/skia_next/third_party/skia/src/core/SkPath.cpp b/third_party/skia_next/third_party/skia/src/core/SkPath.cpp
index 56810de..7e81baf 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkPath.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkPath.cpp
@@ -296,7 +296,12 @@
     int segmentCount = 0;
     SkDEBUGCODE(int moveCnt = 0;)
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [verb, pts, weight] : SkPathPriv::Iterate(*this)) {
+#else
+    for (auto item : SkPathPriv::Iterate(*this)) {
+        STRUCTURED_BINDING_3(verb, pts, weight, std::move(item));
+#endif
         if (verb == SkPathVerb::kClose || (segmentCount > 0 && verb == SkPathVerb::kMove)) {
             // Closing the current contour; but since convexity is a precondition, it's the only
             // contour that matters.
@@ -1387,7 +1392,11 @@
         fLastMoveToIndex = this->countPoints() + src->fLastMoveToIndex;
 
         SkPathRef::Editor ed(&fPathRef);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [newPts, newWeights] = ed.growForVerbsInPath(*src->fPathRef);
+#else
+        STRUCTURED_BINDING_2(newPts, newWeights, ed.growForVerbsInPath(*src->fPathRef));
+#endif
         matrix.mapPoints(newPts, src->fPathRef->points(), src->countPoints());
         if (int numWeights = src->fPathRef->countWeights()) {
             memcpy(newWeights, src->fPathRef->conicWeights(), numWeights * sizeof(newWeights[0]));
@@ -1401,7 +1410,12 @@
 
     SkMatrixPriv::MapPtsProc mapPtsProc = SkMatrixPriv::GetMapPtsProc(matrix);
     bool firstVerb = true;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [verb, pts, w] : SkPathPriv::Iterate(*src)) {
+#else
+    for (auto item : SkPathPriv::Iterate(*src)) {
+        STRUCTURED_BINDING_3(verb, pts, w, std::move(item));
+#endif
         switch (verb) {
             SkPoint mappedPts[3];
             case SkPathVerb::kMove:
@@ -1838,7 +1852,11 @@
     if (!(fIter != fEnd)) {
         return kDone_Verb;
     }
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [verb, iterPts, weights] = *fIter;
+#else
+    STRUCTURED_BINDING_3(verb, iterPts, weights, *fIter);
+#endif
     int numPts;
     switch (verb) {
         case SkPathVerb::kMove: numPts = 1; break;
@@ -2260,7 +2278,12 @@
     bool needsClose = false;
     Convexicator state;
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [verb, pts, wt] : SkPathPriv::Iterate(*this)) {
+#else
+    for (auto item : SkPathPriv::Iterate(*this)) {
+        STRUCTURED_BINDING_3(verb, pts, wt, std::move(item));
+#endif
         // Looking for the last moveTo before non-move verbs start
         if (contourCount == 0) {
             if (verb == SkPathVerb::kMove) {
@@ -3088,7 +3111,12 @@
     SkPoint rectPts[5];
     int rectPtCnt = 0;
     bool needsClose = !isSimpleFill;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [v, verbPts, w] : SkPathPriv::Iterate(path)) {
+#else
+    for (auto item : SkPathPriv::Iterate(path)) {
+        STRUCTURED_BINDING_3(v, verbPts, w, std::move(item));
+#endif
         switch (v) {
             case SkPathVerb::kMove:
                 if (0 != rectPtCnt) {
@@ -3293,7 +3321,12 @@
     // initial with the first MoveTo, so we don't have to check inside the switch
     Sk2s min, max;
     min = max = from_point(this->getPoint(0));
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [verb, pts, w] : SkPathPriv::Iterate(*this)) {
+#else
+    for (auto item : SkPathPriv::Iterate(*this)) {
+        STRUCTURED_BINDING_3(verb, pts, w, std::move(item));
+#endif
         int count = 0;
         switch (verb) {
             case SkPathVerb::kMove:
diff --git a/third_party/skia_next/third_party/skia/src/core/SkPathBuilder.cpp b/third_party/skia_next/third_party/skia/src/core/SkPathBuilder.cpp
index 0085bca..1725c3a 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkPathBuilder.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkPathBuilder.cpp
@@ -53,7 +53,12 @@
 SkPathBuilder& SkPathBuilder::operator=(const SkPath& src) {
     this->reset().setFillType(src.getFillType());
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [verb, pts, w] : SkPathPriv::Iterate(src)) {
+#else
+    for (auto item : SkPathPriv::Iterate(src)) {
+        STRUCTURED_BINDING_3(verb, pts, w, std::move(item));
+#endif
         switch (verb) {
             case SkPathVerb::kMove:  this->moveTo(pts[0]); break;
             case SkPathVerb::kLine:  this->lineTo(pts[1]); break;
diff --git a/third_party/skia_next/third_party/skia/src/core/SkPictureImageGenerator.cpp b/third_party/skia_next/third_party/skia/src/core/SkPictureImageGenerator.cpp
index 845971e..e581c6c 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkPictureImageGenerator.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkPictureImageGenerator.cpp
@@ -120,7 +120,11 @@
     if (!image) {
         return {};
     }
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct] = as_IB(image)->asView(ctx, mipmapped);
+#else
+    STRUCTURED_BINDING_2(view, ct, as_IB(image)->asView(ctx, mipmapped));
+#endif
     SkASSERT(view);
     SkASSERT(mipmapped == GrMipmapped::kNo ||
              view.asTextureProxy()->mipmapped() == GrMipmapped::kYes);
diff --git a/third_party/skia_next/third_party/skia/src/core/SkRemoteGlyphCache.cpp b/third_party/skia_next/third_party/skia/src/core/SkRemoteGlyphCache.cpp
index 1a23a90..5b7209a 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkRemoteGlyphCache.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkRemoteGlyphCache.cpp
@@ -492,7 +492,12 @@
 
 void RemoteStrike::prepareForMaskDrawing(
         SkDrawableGlyphBuffer* drawables, SkSourceGlyphBuffer* rejects) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [i, variant, _] : SkMakeEnumerate(drawables->input())) {
+#else
+    for (auto item : SkMakeEnumerate(drawables->input())) {
+        STRUCTURED_BINDING_3(i, variant, _, std::move(item));
+#endif
         SkPackedGlyphID packedID = variant.packedID();
         if (fSentLowGlyphIDs.test(packedID)) {
             #ifdef SK_DEBUG
diff --git a/third_party/skia_next/third_party/skia/src/core/SkRuntimeEffect.cpp b/third_party/skia_next/third_party/skia/src/core/SkRuntimeEffect.cpp
index d6fddb2..4cbcdda 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkRuntimeEffect.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkRuntimeEffect.cpp
@@ -458,7 +458,11 @@
         }
     }
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [effect, err] = make(std::move(sksl));
+#else
+    STRUCTURED_BINDING_2(effect, err, make(std::move(sksl)));
+#endif
     if (!effect) {
         return nullptr;
     }
@@ -784,10 +788,17 @@
             childFPs.push_back(std::move(childFP));
         } else if (type == ChildType::kColorFilter) {
             // Convert a SkColorFilter into a child FP.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [success, childFP] = as_CFB(child.colorFilter())
                                               ->asFragmentProcessor(/*inputFP=*/nullptr,
                                                                     childArgs.fContext,
                                                                     *childArgs.fDstColorInfo);
+#else
+            STRUCTURED_BINDING_2(success, childFP, as_CFB(child.colorFilter())
+                                              ->asFragmentProcessor(/*inputFP=*/nullptr,
+                                                                    childArgs.fContext,
+                                                                    *childArgs.fDstColorInfo));
+#endif
             if (!success) {
                 return GrFPFailure(std::move(inputFP));
             }
@@ -986,6 +997,7 @@
         GrFPArgs childArgs = args;
         childArgs.fInputColorIsOpaque = false;
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [success, fp] = make_effect_fp(fEffect,
                                             "runtime_shader",
                                             std::move(uniforms),
@@ -993,6 +1005,15 @@
                                             /*destColorFP=*/nullptr,
                                             SkMakeSpan(fChildren),
                                             childArgs);
+#else
+        STRUCTURED_BINDING_2(success, fp, make_effect_fp(fEffect,
+                                            "runtime_shader",
+                                            std::move(uniforms),
+                                            /*inputFP=*/nullptr,
+                                            /*destColorFP=*/nullptr,
+                                            SkMakeSpan(fChildren),
+                                            childArgs));
+#endif
         if (!success) {
             return nullptr;
         }
@@ -1174,6 +1195,7 @@
         sk_sp<SkData> uniforms = get_xformed_uniforms(fEffect.get(), fUniforms,
                                                       args.fDstColorInfo->colorSpace());
         SkASSERT(uniforms);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [success, fp] = make_effect_fp(fEffect,
                                             "runtime_blender",
                                             std::move(uniforms),
@@ -1181,6 +1203,15 @@
                                             std::move(dstFP),
                                             SkMakeSpan(fChildren),
                                             args);
+#else
+        STRUCTURED_BINDING_2(success, fp, make_effect_fp(fEffect,
+                                            "runtime_blender",
+                                            std::move(uniforms),
+                                            std::move(srcFP),
+                                            std::move(dstFP),
+                                            SkMakeSpan(fChildren),
+                                            args));
+#endif
 
         return success ? std::move(fp) : nullptr;
     }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkScalerCache.cpp b/third_party/skia_next/third_party/skia/src/core/SkScalerCache.cpp
index c687644..6575e32 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkScalerCache.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkScalerCache.cpp
@@ -37,7 +37,11 @@
 }
 
 std::tuple<SkGlyph*, size_t> SkScalerCache::glyph(SkPackedGlyphID packedGlyphID) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [digest, size] = this->digest(packedGlyphID);
+#else
+    STRUCTURED_BINDING_2(digest, size, this->digest(packedGlyphID));
+#endif
     return {fGlyphForIndex[digest.index()], size};
 }
 
@@ -92,10 +96,18 @@
     const SkGlyph** cursor = results;
     size_t delta = 0;
     for (auto glyphID : glyphIDs) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [glyph, size] = this->glyph(SkPackedGlyphID{glyphID});
+#else
+        STRUCTURED_BINDING_2(glyph, size, this->glyph(SkPackedGlyphID{glyphID}));
+#endif
         delta += size;
         if (pathDetail == kMetricsAndPath) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [_, pathSize] = this->preparePath(glyph);
+#else
+            STRUCTURED_BINDING_2(_, pathSize, this->preparePath(glyph));
+#endif
             delta += pathSize;
         }
         *cursor++ = glyph;
@@ -134,14 +146,22 @@
 std::tuple<SkSpan<const SkGlyph*>, size_t> SkScalerCache::metrics(
         SkSpan<const SkGlyphID> glyphIDs, const SkGlyph* results[]) {
     SkAutoMutexExclusive lock{fMu};
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [glyphs, delta] = this->internalPrepare(glyphIDs, kMetricsOnly, results);
+#else
+    STRUCTURED_BINDING_2(glyphs, delta, this->internalPrepare(glyphIDs, kMetricsOnly, results));
+#endif
     return {glyphs, delta};
 }
 
 std::tuple<SkSpan<const SkGlyph*>, size_t> SkScalerCache::preparePaths(
         SkSpan<const SkGlyphID> glyphIDs, const SkGlyph* results[]) {
     SkAutoMutexExclusive lock{fMu};
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [glyphs, delta] = this->internalPrepare(glyphIDs, kMetricsAndPath, results);
+#else
+    STRUCTURED_BINDING_2(glyphs, delta, this->internalPrepare(glyphIDs, kMetricsAndPath, results));
+#endif
     return {glyphs, delta};
 }
 
@@ -151,8 +171,16 @@
     SkAutoMutexExclusive lock{fMu};
     size_t delta = 0;
     for (auto glyphID : glyphIDs) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[glyph, glyphSize] = this->glyph(glyphID);
+#else
+        STRUCTURED_BINDING_2(glyph, glyphSize, this->glyph(glyphID));
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[_, imageSize] = this->prepareImage(glyph);
+#else
+        STRUCTURED_BINDING_2(_, imageSize, this->prepareImage(glyph));
+#endif
         delta += glyphSize + imageSize;
         *cursor++ = glyph;
     }
@@ -163,9 +191,18 @@
 template <typename Fn>
 size_t SkScalerCache::commonFilterLoop(SkDrawableGlyphBuffer* drawables, Fn&& fn) {
     size_t total = 0;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [i, packedID, pos] : SkMakeEnumerate(drawables->input())) {
+#else
+    for (auto item : SkMakeEnumerate(drawables->input())) {
+        STRUCTURED_BINDING_3(i, packedID, pos, std::move(item));
+#endif
         if (SkScalarsAreFinite(pos.x(), pos.y())) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [digest, size] = this->digest(packedID);
+#else
+            STRUCTURED_BINDING_2(digest, size, this->digest(packedID));
+#endif
             total += size;
             if (!digest.isEmpty()) {
                 fn(i, digest, pos);
@@ -182,7 +219,11 @@
         [&](size_t i, SkGlyphDigest digest, SkPoint pos) SK_REQUIRES(fMu) {
             // If the glyph is too large, then no image is created.
             SkGlyph* glyph = fGlyphForIndex[digest.index()];
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [image, imageSize] = this->prepareImage(glyph);
+#else
+            STRUCTURED_BINDING_2(image, imageSize, this->prepareImage(glyph));
+#endif
             if (image != nullptr) {
                 drawables->push_back(glyph, i);
                 imageDelta += imageSize;
@@ -231,7 +272,11 @@
         [&](size_t i, SkGlyphDigest digest, SkPoint pos) SK_REQUIRES(fMu) {
             SkGlyph* glyph = fGlyphForIndex[digest.index()];
             if (!digest.isColor()) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 auto [path, pathSize] = this->preparePath(glyph);
+#else
+                STRUCTURED_BINDING_2(path, pathSize, this->preparePath(glyph));
+#endif
                 pathDelta += pathSize;
                 if (path != nullptr) {
                     // Save off the path to draw later.
diff --git a/third_party/skia_next/third_party/skia/src/core/SkScan_Hairline.cpp b/third_party/skia_next/third_party/skia/src/core/SkScan_Hairline.cpp
index 5e0f081..45903bf 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkScan_Hairline.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkScan_Hairline.cpp
@@ -577,7 +577,11 @@
         prevVerb = SkPath::kDone_Verb;
     }
     while (iter != end) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [pathVerb, pathPts, w] = *iter++;
+#else
+        STRUCTURED_BINDING_3(pathVerb, pathPts, w, *iter++);
+#endif
         SkPath::Verb verb = (SkPath::Verb)pathVerb;
         SkPath::Verb nextVerb = (iter != end) ? (SkPath::Verb)iter.peekVerb() : SkPath::kDone_Verb;
         memcpy(pts, pathPts, SkPathPriv::PtsInIter(verb) * sizeof(SkPoint));
diff --git a/third_party/skia_next/third_party/skia/src/core/SkSpecialImage.cpp b/third_party/skia_next/third_party/skia/src/core/SkSpecialImage.cpp
index 1e31b03..4a3fb85 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkSpecialImage.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkSpecialImage.cpp
@@ -160,7 +160,11 @@
 
 #if SK_SUPPORT_GPU
     if (rContext) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [view, ct] = as_IB(image)->asView(rContext, GrMipmapped::kNo);
+#else
+        STRUCTURED_BINDING_2(view, ct, as_IB(image)->asView(rContext, GrMipmapped::kNo));
+#endif
         return MakeDeferredFromGpu(rContext,
                                    subset,
                                    image->uniqueID(),
diff --git a/third_party/skia_next/third_party/skia/src/core/SkStream.cpp b/third_party/skia_next/third_party/skia/src/core/SkStream.cpp
index 52fe061..8e99b4b 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkStream.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkStream.cpp
@@ -152,7 +152,7 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-SkFILEStream::SkFILEStream(std::shared_ptr<FILE> file, size_t end, size_t start, size_t current)
+SkFILEStream::SkFILEStream(std::shared_ptr<SkFile> file, size_t end, size_t start, size_t current)
     : fFILE(std::move(file))
     , fEnd(end)
     , fStart(std::min(start, fEnd))
@@ -162,20 +162,20 @@
     SkASSERT(fCurrent == current);
 }
 
-SkFILEStream::SkFILEStream(std::shared_ptr<FILE> file, size_t end, size_t start)
+SkFILEStream::SkFILEStream(std::shared_ptr<SkFile> file, size_t end, size_t start)
     : SkFILEStream(std::move(file), end, start, start)
 { }
 
-SkFILEStream::SkFILEStream(FILE* file, size_t size, size_t start)
-    : SkFILEStream(std::shared_ptr<FILE>(file, sk_fclose), SkSafeMath::Add(start, size), start)
+SkFILEStream::SkFILEStream(SkFile* file, size_t size, size_t start)
+    : SkFILEStream(std::shared_ptr<SkFile>(file, sk_fclose), SkSafeMath::Add(start, size), start)
 { }
 
-SkFILEStream::SkFILEStream(FILE* file, size_t size)
+SkFILEStream::SkFILEStream(SkFile* file, size_t size)
     : SkFILEStream(file, size, file ? sk_ftell(file) : 0)
 { }
 
-SkFILEStream::SkFILEStream(FILE* file)
-    : SkFILEStream(std::shared_ptr<FILE>(file, sk_fclose),
+SkFILEStream::SkFILEStream(SkFile* file)
+    : SkFILEStream(std::shared_ptr<SkFile>(file, sk_fclose),
                    file ? sk_fgetsize(file) : 0,
                    file ? sk_ftell(file) : 0)
 { }
@@ -894,7 +894,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 static sk_sp<SkData> mmap_filename(const char path[]) {
-    FILE* file = sk_fopen(path, kRead_SkFILE_Flag);
+    SkFile* file = sk_fopen(path, kRead_SkFILE_Flag);
     if (nullptr == file) {
         return nullptr;
     }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkStrikeCache.h b/third_party/skia_next/third_party/skia/src/core/SkStrikeCache.h
index cf93e11..534b645 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkStrikeCache.h
+++ b/third_party/skia_next/third_party/skia/src/core/SkStrikeCache.h
@@ -50,13 +50,21 @@
                 , fPinner{std::move(pinner)} {}
 
         SkGlyph* mergeGlyphAndImage(SkPackedGlyphID toID, const SkGlyph& from) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [glyph, increase] = fScalerCache.mergeGlyphAndImage(toID, from);
+#else
+            STRUCTURED_BINDING_2(glyph, increase, fScalerCache.mergeGlyphAndImage(toID, from));
+#endif
             this->updateDelta(increase);
             return glyph;
         }
 
         const SkPath* mergePath(SkGlyph* glyph, const SkPath* path, bool hairline) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [glyphPath, increase] = fScalerCache.mergePath(glyph, path, hairline);
+#else
+            STRUCTURED_BINDING_2(glyphPath, increase, fScalerCache.mergePath(glyph, path, hairline));
+#endif
             this->updateDelta(increase);
             return glyphPath;
         }
@@ -76,21 +84,33 @@
 
         SkSpan<const SkGlyph*> metrics(SkSpan<const SkGlyphID> glyphIDs,
                                        const SkGlyph* results[]) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [glyphs, increase] = fScalerCache.metrics(glyphIDs, results);
+#else
+            STRUCTURED_BINDING_2(glyphs, increase, fScalerCache.metrics(glyphIDs, results));
+#endif
             this->updateDelta(increase);
             return glyphs;
         }
 
         SkSpan<const SkGlyph*> preparePaths(SkSpan<const SkGlyphID> glyphIDs,
                                             const SkGlyph* results[]) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [glyphs, increase] = fScalerCache.preparePaths(glyphIDs, results);
+#else
+            STRUCTURED_BINDING_2(glyphs, increase, fScalerCache.preparePaths(glyphIDs, results));
+#endif
             this->updateDelta(increase);
             return glyphs;
         }
 
         SkSpan<const SkGlyph*> prepareImages(SkSpan<const SkPackedGlyphID> glyphIDs,
                                              const SkGlyph* results[]) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [glyphs, increase] = fScalerCache.prepareImages(glyphIDs, results);
+#else
+            STRUCTURED_BINDING_2(glyphs, increase, fScalerCache.prepareImages(glyphIDs, results));
+#endif
             this->updateDelta(increase);
             return glyphs;
         }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkVM.cpp b/third_party/skia_next/third_party/skia/src/core/SkVM.cpp
index adfdb8d..c67b4e5 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkVM.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkVM.cpp
@@ -1343,7 +1343,11 @@
     }
 
     Color Builder::uniformColor(SkColor4f color, Uniforms* uniforms) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [r,g,b,a] = color;
+#else
+        STRUCTURED_BINDING_4(r,g,b,a, color);
+#endif
         return {
             uniformF(uniforms->pushF(r)),
             uniformF(uniforms->pushF(g)),
@@ -1391,7 +1395,11 @@
     Color Builder::to_rgba(HSLA c) {
         // See GrRGBToHSLFilterEffect.fp
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [h,s,l,a] = c;
+#else
+        STRUCTURED_BINDING_4(h,s,l,a, c);
+#endif
         F32 x = s * (1.0f - abs(l + l - 1.0f));
 
         auto hue_to_rgb = [&,l=l](auto hue) {
@@ -2558,7 +2566,11 @@
         std::vector<llvm::Value*> vals(instructions.size());
 
         auto emit = [&](size_t i, bool scalar, IRBuilder* b) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [op, x,y,z,w, immA,immB,immC, death,can_hoist] = instructions[i];
+#else
+            STRUCTURED_BINDING_10(op, x,y,z,w, immA,immB,immC, death,can_hoist, instructions[i]);
+#endif
 
             llvm::Type *i1    = llvm::Type::getInt1Ty (*ctx),
                        *i8    = llvm::Type::getInt8Ty (*ctx),
@@ -3407,7 +3419,12 @@
                 if (v ==  w && rw != NA) { return rw; }
 
                 // Search inter-instruction register map.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 for (auto [r,val] : SkMakeEnumerate(regs)) {
+#else
+                for (auto item : SkMakeEnumerate(regs)) {
+                    STRUCTURED_BINDING_2(r,val, std::move(item));
+#endif
                     if (val == v) {
                         return update_regs((Reg)r, v);
                     }
diff --git a/third_party/skia_next/third_party/skia/src/core/SkVM.h b/third_party/skia_next/third_party/skia/src/core/SkVM.h
index fb477e3..0b694fa 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkVM.h
+++ b/third_party/skia_next/third_party/skia/src/core/SkVM.h
@@ -1329,4 +1329,37 @@
 #undef SI
 }  // namespace skvm
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<SkRGBA4f<SkAlphaType::kUnpremul_SkAlphaType>> {
+  static auto Coerce(SkRGBA4f<SkAlphaType::kUnpremul_SkAlphaType>&& t) {
+    return std::forward<std::tuple<float, float, float, float>>(
+        std::make_tuple(t.fR, t.fG, t.fB, t.fA));
+  }
+  static auto Coerce(const SkRGBA4f<SkAlphaType::kUnpremul_SkAlphaType>& t) {
+    return std::make_tuple(t.fR, t.fG, t.fB, t.fA);
+  }
+};
+
+template <>
+struct CoercerToTuple<skvm::Color> {
+  static auto Coerce(skvm::Color&& t) {
+    return std::move(std::make_tuple(t.r, t.g, t.b, t.a));
+  }
+  static auto Coerce(skvm::Color& t) {
+    return std::make_tuple(t.r, t.g, t.b, t.a);
+  }
+};
+
+template <>
+struct CoercerToTuple<skvm::HSLA> {
+  static auto Coerce(skvm::HSLA&& t) {
+    return std::move(std::make_tuple(t.h, t.s, t.l, t.a));
+  }
+  static auto Coerce(skvm::HSLA& t) {
+    return std::make_tuple(t.h, t.s, t.l, t.a);
+  }
+};
+#endif
+
 #endif//SkVM_DEFINED
diff --git a/third_party/skia_next/third_party/skia/src/core/SkYUVAInfo.cpp b/third_party/skia_next/third_party/skia/src/core/SkYUVAInfo.cpp
index 74b3a84..9add9ee 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkYUVAInfo.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkYUVAInfo.cpp
@@ -261,7 +261,16 @@
     SkASSERT(planesAndIndices);
     YUVALocations yuvaLocations;
     for (int i = 0; i < SkYUVAInfo::kYUVAChannelCount; ++i) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [plane, chanIdx] = planesAndIndices[i];
+#else
+        STRUCTURED_BINDING_2(plane, chanIdx, planesAndIndices[i]);
+#endif
+#else
+        int plane = planesAndIndices[i].plane;
+        int chanIdx = planesAndIndices[i].chanIdx;
+#endif
         SkColorChannel channel;
         if (plane >= 0) {
             if (!channel_index_to_channel(planeChannelFlags[plane], chanIdx, &channel)) {
diff --git a/third_party/skia_next/third_party/skia/src/core/SkYUVAInfoLocation.h b/third_party/skia_next/third_party/skia/src/core/SkYUVAInfoLocation.h
index 75368ac..3861492 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkYUVAInfoLocation.h
+++ b/third_party/skia_next/third_party/skia/src/core/SkYUVAInfoLocation.h
@@ -58,4 +58,13 @@
     }
 };
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<SkYUVAInfo::YUVALocation> {
+  static auto Coerce(const SkYUVAInfo::YUVALocation& t) {
+    return std::make_tuple(t.fPlane, t.fChannel);
+  }
+};
+#endif
+
 #endif
diff --git a/third_party/skia_next/third_party/skia/src/core/SkYUVAPixmaps.cpp b/third_party/skia_next/third_party/skia/src/core/SkYUVAPixmaps.cpp
index c956596..68b417b 100644
--- a/third_party/skia_next/third_party/skia/src/core/SkYUVAPixmaps.cpp
+++ b/third_party/skia_next/third_party/skia/src/core/SkYUVAPixmaps.cpp
@@ -102,7 +102,11 @@
                                            kUnpremul_SkAlphaType);
         int numRequiredChannels = yuvaInfo.numChannelsInPlane(i);
         SkASSERT(numRequiredChannels > 0);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [numColorTypeChannels, colorTypeDataType] = NumChannelsAndDataType(colorTypes[i]);
+#else
+        STRUCTURED_BINDING_2(numColorTypeChannels, colorTypeDataType, NumChannelsAndDataType(colorTypes[i]));
+#endif
         ok &= i == 0 || colorTypeDataType == fDataType;
         ok &= numColorTypeChannels >= numRequiredChannels;
         ok &= fPlaneInfos[i].validRowBytes(fRowBytes[i]);
diff --git a/third_party/skia_next/third_party/skia/src/effects/SkTableColorFilter.cpp b/third_party/skia_next/third_party/skia/src/effects/SkTableColorFilter.cpp
index eb7d9f0..1ddf047 100644
--- a/third_party/skia_next/third_party/skia/src/effects/SkTableColorFilter.cpp
+++ b/third_party/skia_next/third_party/skia/src/effects/SkTableColorFilter.cpp
@@ -220,9 +220,15 @@
         (flags & (1 << 3)) ? luts[3] : nullptr
     ));
     sk_sp<SkColorSpace> colorSpace = GrTest::TestColorSpace(d->fRandom);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [success, fp] = as_CFB(filter)->asFragmentProcessor(
             d->inputFP(), d->context(),
             GrColorInfo(GrColorType::kRGBA_8888, kUnknown_SkAlphaType, std::move(colorSpace)));
+#else
+    STRUCTURED_BINDING_2(success, fp, as_CFB(filter)->asFragmentProcessor(
+            d->inputFP(), d->context(),
+            GrColorInfo(GrColorType::kRGBA_8888, kUnknown_SkAlphaType, std::move(colorSpace))));
+#endif
     SkASSERT(success);
     return std::move(fp);
 }
diff --git a/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkDisplacementMapImageFilter.cpp b/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkDisplacementMapImageFilter.cpp
index 920195f..3ecb169 100644
--- a/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkDisplacementMapImageFilter.cpp
+++ b/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkDisplacementMapImageFilter.cpp
@@ -497,8 +497,16 @@
 
 #if GR_TEST_UTILS
 std::unique_ptr<GrFragmentProcessor> GrDisplacementMapEffect::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [dispView,  ct1, at1] = d->randomView();
+#else
+    STRUCTURED_BINDING_3(dispView,  ct1, at1, d->randomView());
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [colorView, ct2, at2] = d->randomView();
+#else
+    STRUCTURED_BINDING_3(colorView, ct2, at2, d->randomView());
+#endif
     static const int kMaxComponent = static_cast<int>(SkColorChannel::kLastEnum);
     SkColorChannel xChannelSelector =
         static_cast<SkColorChannel>(d->fRandom->nextRangeU(1, kMaxComponent));
diff --git a/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkLightingImageFilter.cpp b/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkLightingImageFilter.cpp
index ca42f53..6f31b05 100644
--- a/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkLightingImageFilter.cpp
+++ b/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkLightingImageFilter.cpp
@@ -1727,7 +1727,11 @@
 }
 
 std::unique_ptr<GrFragmentProcessor> DiffuseLightingEffect::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomView());
+#endif
     SkScalar surfaceScale = d->fRandom->nextSScalar1();
     SkScalar kd = d->fRandom->nextUScalar1();
     sk_sp<SkImageFilterLight> light(create_random_light(d->fRandom));
@@ -1919,7 +1923,11 @@
 
 #if GR_TEST_UTILS
 std::unique_ptr<GrFragmentProcessor> SpecularLightingEffect::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomView());
+#endif
     SkScalar surfaceScale = d->fRandom->nextSScalar1();
     SkScalar ks = d->fRandom->nextUScalar1();
     SkScalar shininess = d->fRandom->nextUScalar1();
diff --git a/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkMorphologyImageFilter.cpp b/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkMorphologyImageFilter.cpp
index 3ee3cd8..4da09c6 100644
--- a/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkMorphologyImageFilter.cpp
+++ b/third_party/skia_next/third_party/skia/src/effects/imagefilters/SkMorphologyImageFilter.cpp
@@ -344,7 +344,11 @@
 
 #if GR_TEST_UTILS
 std::unique_ptr<GrFragmentProcessor> GrMorphologyEffect::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomView());
+#endif
 
     MorphDirection dir = d->fRandom->nextBool() ? MorphDirection::kX : MorphDirection::kY;
     static const int kMaxRadius = 10;
diff --git a/third_party/skia_next/third_party/skia/src/gpu/GrBlurUtils.cpp b/third_party/skia_next/third_party/skia/src/gpu/GrBlurUtils.cpp
index 2f2e79f..840a8f9 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/GrBlurUtils.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/GrBlurUtils.cpp
@@ -405,7 +405,11 @@
         }
 
         key->setCustomData(create_data(*maskRect, unclippedDevShapeBounds));
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [cachedView, data] = threadSafeCache->findOrAddWithData(*key, lazyView);
+#else
+        STRUCTURED_BINDING_2(cachedView, data, threadSafeCache->findOrAddWithData(*key, lazyView));
+#endif
         if (cachedView != lazyView) {
             // In this case, the gpu-thread lost out to a recording thread - use its result.
             SkASSERT(data);
diff --git a/third_party/skia_next/third_party/skia/src/gpu/GrDrawIndirectCommand.h b/third_party/skia_next/third_party/skia/src/gpu/GrDrawIndirectCommand.h
index d645223..2049591 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/GrDrawIndirectCommand.h
+++ b/third_party/skia_next/third_party/skia/src/gpu/GrDrawIndirectCommand.h
@@ -11,6 +11,8 @@
 #include <stdint.h>
 #include <utility>
 
+#include "include/core/cpp17oncpp14.h"
+
 struct GrDrawIndirectCommand {
     uint32_t fVertexCount;
     uint32_t fInstanceCount;
@@ -100,4 +102,22 @@
     GrDrawIndexedIndirectCommand* fData;
 };
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<GrDrawIndirectCommand> {
+  static auto Coerce(const GrDrawIndirectCommand& t) {
+    return std::make_tuple(t.fVertexCount, t.fInstanceCount,
+        t.fBaseVertex, t.fBaseInstance);
+  }
+};
+
+template <>
+struct CoercerToTuple<GrDrawIndexedIndirectCommand> {
+  static auto Coerce(const GrDrawIndexedIndirectCommand& t) {
+    return std::make_tuple(t.fIndexCount, t.fInstanceCount, t.fBaseIndex,
+        t.fBaseVertex, t.fBaseInstance);
+  }
+};
+#endif
+
 #endif
diff --git a/third_party/skia_next/third_party/skia/src/gpu/GrGeometryProcessor.cpp b/third_party/skia_next/third_party/skia/src/gpu/GrGeometryProcessor.cpp
index 05057d0..a9b8dcd 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/GrGeometryProcessor.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/GrGeometryProcessor.cpp
@@ -161,7 +161,13 @@
                 break;
         }
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto& [varyingFSVar, hasCoordsParam] = result[&fp];
+#else
+        auto& item = result[&fp];
+        auto& varyingFSVar = item.coordsVarying;
+        auto& hasCoordsParam = item.hasCoordsParam;
+#endif
         hasCoordsParam = fp.usesSampleCoordsDirectly();
 
         // We add a varying if we're in a chain of matrices multiplied by local or device coords.
@@ -179,7 +185,14 @@
             } else {
                 // If there is an already a varying that incorporates all matrices from the root to
                 // lastMatrixFP just use it. Otherwise, we add it.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 auto& [varying, inputCoords, varyingIdx] = fTransformVaryingsMap[lastMatrixFP];
+#else
+                auto& item = fTransformVaryingsMap[lastMatrixFP];
+                auto& varying = item.varying;
+                auto& inputCoords = item.inputCoords;
+                auto& varyingIdx = item.traversalOrder;
+#endif
                 if (varying.type() == kVoid_GrSLType) {
                     varying = GrGLSLVarying(hasPerspective ? kFloat3_GrSLType : kFloat2_GrSLType);
                     SkString strVaryingName = SkStringPrintf("TransformedCoords_%d",
@@ -233,7 +246,12 @@
         pq.push(entry);
     });
     for (; !pq.empty(); pq.pop()) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         const auto& [fp, info] = pq.top();
+#else
+        const GrFragmentProcessor* fp; TransformInfo info;
+        std::tie(fp, info) = pq.top();
+#endif
         // If we recorded a transform info, its sample matrix must be uniform
         SkASSERT(fp->sampleUsage().isUniformMatrix());
         GrShaderVar uniform = uniformHandler->liftUniformToVertexShader(
diff --git a/third_party/skia_next/third_party/skia/src/gpu/GrOpsRenderPass.cpp b/third_party/skia_next/third_party/skia/src/gpu/GrOpsRenderPass.cpp
index f408b3f..9f284c7 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/GrOpsRenderPass.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/GrOpsRenderPass.cpp
@@ -283,7 +283,11 @@
         auto* cmds = reinterpret_cast<const GrDrawIndirectCommand*>(
                 cpuIndirectBuffer->data() + bufferOffset);
         for (int i = 0; i < drawCount; ++i) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [vertexCount, instanceCount, baseVertex, baseInstance] = cmds[i];
+#else
+            STRUCTURED_BINDING_4(vertexCount, instanceCount, baseVertex, baseInstance, cmds[i]);
+#endif
             this->onDrawInstanced(instanceCount, baseInstance, vertexCount, baseVertex);
         }
         return;
@@ -310,7 +314,11 @@
         auto* cmds = reinterpret_cast<const GrDrawIndexedIndirectCommand*>(
                 cpuIndirectBuffer->data() + bufferOffset);
         for (int i = 0; i < drawCount; ++i) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [indexCount, instanceCount, baseIndex, baseVertex, baseInstance] = cmds[i];
+#else
+            STRUCTURED_BINDING_5(indexCount, instanceCount, baseIndex, baseVertex, baseInstance, cmds[i]);
+#endif
             this->onDrawIndexedInstanced(indexCount, baseIndex, instanceCount, baseInstance,
                                          baseVertex);
         }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/GrProcessorUnitTest.cpp b/third_party/skia_next/third_party/skia/src/gpu/GrProcessorUnitTest.cpp
index 5e1fe10..88f03c9 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/GrProcessorUnitTest.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/GrProcessorUnitTest.cpp
@@ -57,14 +57,24 @@
 
 GrProcessorTestData::ViewInfo GrProcessorTestData::randomAlphaOnlyView() {
     int numAlphaOnly = 0;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (const auto& [v, ct, at] : fViews) {
+#else
+    for (const auto& item : fViews) {
+        STRUCTURED_BINDING_3(v, ct, at, std::move(item));
+#endif
         if (GrColorTypeIsAlphaOnly(ct)) {
             ++numAlphaOnly;
         }
     }
     SkASSERT(numAlphaOnly);
     int idx = fRandom->nextULessThan(numAlphaOnly);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (const auto& [v, ct, at] : fViews) {
+#else
+    for (const auto& item : fViews) {
+        STRUCTURED_BINDING_3(v, ct, at, std::move(item));
+#endif
         if (GrColorTypeIsAlphaOnly(ct) && !idx--) {
             return {v, ct, at};
         }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/GrRecordingContext.cpp b/third_party/skia_next/third_party/skia/src/gpu/GrRecordingContext.cpp
index 0418670..8bb9815 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/GrRecordingContext.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/GrRecordingContext.cpp
@@ -222,7 +222,12 @@
     keys->push_back(SkString("dmsaa_multisample_render_passes"));
     values->push_back(fNumMultisampleRenderPasses);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (const auto& [name, count] : fTriggerCounts) {
+#else
+    for (const auto& item : fTriggerCounts) {
+        STRUCTURED_BINDING_2(name, count, std::move(item));
+#endif
         keys->push_back(SkStringPrintf("dmsaa_trigger_%s", name.c_str()));
         values->push_back(count);
     }
@@ -233,7 +238,12 @@
     SkDebugf("DMSAA Multisample Render Passes: %d\n", fNumMultisampleRenderPasses);
     if (!fTriggerCounts.empty()) {
         SkDebugf("DMSAA Triggers:\n");
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (const auto& [name, count] : fTriggerCounts) {
+#else
+        for (const auto& item : fTriggerCounts) {
+            STRUCTURED_BINDING_2(name, count, std::move(item));
+#endif
             SkDebugf("    %s: %d\n", name.c_str(), count);
         }
     }
@@ -242,7 +252,12 @@
 void GrRecordingContext::DMSAAStats::merge(const DMSAAStats& stats) {
     fNumRenderPasses += stats.fNumRenderPasses;
     fNumMultisampleRenderPasses += stats.fNumMultisampleRenderPasses;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (const auto& [name, count] : stats.fTriggerCounts) {
+#else
+    for (const auto& item : stats.fTriggerCounts) {
+        STRUCTURED_BINDING_2(name, count, std::move(item));
+#endif
         fTriggerCounts[name] += count;
     }
 }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/GrRecordingContextPriv.cpp b/third_party/skia_next/third_party/skia/src/gpu/GrRecordingContextPriv.cpp
index 6e4f2cb..e443361 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/GrRecordingContextPriv.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/GrRecordingContextPriv.cpp
@@ -351,7 +351,11 @@
         }
         const GrCaps* caps = this->caps();
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [ct, _] = caps->getFallbackColorTypeAndFormat(info.colorType(), sampleCount);
+#else
+        STRUCTURED_BINDING_2(ct, _, caps->getFallbackColorTypeAndFormat(info.colorType(), sampleCount));
+#endif
         if (ct == GrColorType::kUnknown) {
             return nullptr;
         }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/GrThreadSafeCache.cpp b/third_party/skia_next/third_party/skia/src/gpu/GrThreadSafeCache.cpp
index 44b0225..2ac0b63 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/GrThreadSafeCache.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/GrThreadSafeCache.cpp
@@ -240,7 +240,11 @@
                                                                       const GrSurfaceProxyView& v) {
     SkAutoSpinlock lock{fSpinLock};
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, data] = this->internalFind(key);
+#else
+    STRUCTURED_BINDING_2(view, data, this->internalFind(key));
+#endif
     if (view) {
         return { std::move(view), std::move(data) };
     }
@@ -326,7 +330,11 @@
     const GrCaps* caps = dContext->priv().caps();
 
     constexpr int kSampleCnt = 1;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [newCT, format] = caps->getFallbackColorTypeAndFormat(origCT, kSampleCnt);
+#else
+    STRUCTURED_BINDING_2(newCT, format, caps->getFallbackColorTypeAndFormat(origCT, kSampleCnt));
+#endif
 
     if (newCT == GrColorType::kUnknown) {
         return {GrSurfaceProxyView(nullptr), nullptr};
diff --git a/third_party/skia_next/third_party/skia/src/gpu/SkGr.cpp b/third_party/skia_next/third_party/skia/src/gpu/SkGr.cpp
index 4f064d4..29f02c2 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/SkGr.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/SkGr.cpp
@@ -382,7 +382,11 @@
     // Pixel 4           Adreno640       500    110ms        221ms (2.01x)     214ms (1.95x)
     // Galaxy S20 FE     Mali-G77 MP11   600    165ms        360ms (2.18x)     260ms (1.58x)
     static const SkBitmap gLUT = make_dither_lut();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [tex, ct] = GrMakeCachedBitmapProxyView(rContext, gLUT, GrMipmapped::kNo);
+#else
+    STRUCTURED_BINDING_2(tex, ct, GrMakeCachedBitmapProxyView(rContext, gLUT, GrMipmapped::kNo));
+#endif
     if (!tex) {
         return inputFP;
     }
@@ -525,8 +529,13 @@
             SkColorSpace* dstCS = dstColorInfo.colorSpace();
             grPaint->setColor4f(colorFilter->filterColor4f(origColor, dstCS, dstCS).premul());
         } else {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [success, fp] = as_CFB(colorFilter)->asFragmentProcessor(std::move(paintFP),
                                                                           context, dstColorInfo);
+#else
+            STRUCTURED_BINDING_2(success, fp, as_CFB(colorFilter)->asFragmentProcessor(std::move(paintFP),
+                                                                          context, dstColorInfo));
+#endif
             if (!success) {
                 return false;
             }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/SurfaceContext.cpp b/third_party/skia_next/third_party/skia/src/gpu/SurfaceContext.cpp
index 86ec30b..58040e4 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/SurfaceContext.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/SurfaceContext.cpp
@@ -476,10 +476,17 @@
     }
 
     GrColorType srcColorType = src[0].colorType();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [allowedColorType, _] =
             caps->supportedWritePixelsColorType(this->colorInfo().colorType(),
                                                 dstProxy->backendFormat(),
                                                 srcColorType);
+#else
+    auto allowedColorType =
+            caps->supportedWritePixelsColorType(this->colorInfo().colorType(),
+                                                dstProxy->backendFormat(),
+                                                srcColorType).fColorType;
+#endif
     bool flip = this->origin() == kBottomLeft_GrSurfaceOrigin;
 
     bool convertAll = premul              ||
@@ -876,10 +883,19 @@
 
     auto texMatrix = SkMatrix::Translate(x, y);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [readCT, offsetAlignment] =
             this->caps()->supportedReadPixelsColorType(yFC->colorInfo().colorType(),
                                                        yFC->asSurfaceProxy()->backendFormat(),
                                                        GrColorType::kAlpha_8);
+#else
+    auto item =
+            this->caps()->supportedReadPixelsColorType(yFC->colorInfo().colorType(),
+                                                       yFC->asSurfaceProxy()->backendFormat(),
+                                                       GrColorType::kAlpha_8);
+    auto readCT = item.fColorType;
+    auto offsetAlignment = item.fOffsetAlignmentForTransferBuffer;
+#endif
     if (readCT == GrColorType::kUnknown) {
         callback(callbackContext, nullptr);
         return;
diff --git a/third_party/skia_next/third_party/skia/src/gpu/effects/GrBicubicEffect.cpp b/third_party/skia_next/third_party/skia/src/gpu/effects/GrBicubicEffect.cpp
index 609ca73..3c05184 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/effects/GrBicubicEffect.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/effects/GrBicubicEffect.cpp
@@ -255,7 +255,11 @@
     auto m = GrTest::TestMatrix(d->fRandom);
     switch (d->fRandom->nextULessThan(3)) {
         case 0: {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [view, ct, at] = d->randomView();
+#else
+            STRUCTURED_BINDING_3(view, ct, at, d->randomView());
+#endif
             GrSamplerState::WrapMode wm[2];
             GrTest::TestWrapModes(d->fRandom, wm);
 
@@ -279,7 +283,11 @@
             return Make(std::move(view), at, m, wm[0], wm[1], kernel, direction, *d->caps());
         }
         case 1: {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [view, ct, at] = d->randomView();
+#else
+            STRUCTURED_BINDING_3(view, ct, at, d->randomView());
+#endif
             return Make(std::move(view), at, m, kernel, direction);
         }
         default: {
diff --git a/third_party/skia_next/third_party/skia/src/gpu/effects/GrBitmapTextGeoProc.cpp b/third_party/skia_next/third_party/skia/src/gpu/effects/GrBitmapTextGeoProc.cpp
index e0f2a2a..b2495a8 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/effects/GrBitmapTextGeoProc.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/effects/GrBitmapTextGeoProc.cpp
@@ -199,7 +199,11 @@
 #if GR_TEST_UTILS
 
 GrGeometryProcessor* GrBitmapTextGeoProc::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomView());
+#endif
 
     GrSamplerState::WrapMode wrapModes[2];
     GrTest::TestWrapModes(d->fRandom, wrapModes);
diff --git a/third_party/skia_next/third_party/skia/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/third_party/skia_next/third_party/skia/src/gpu/effects/GrDistanceFieldGeoProc.cpp
index d125cc6..5639b2d 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/effects/GrDistanceFieldGeoProc.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/effects/GrDistanceFieldGeoProc.cpp
@@ -284,7 +284,11 @@
 
 #if GR_TEST_UTILS
 GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomAlphaOnlyView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomAlphaOnlyView());
+#endif
 
     GrSamplerState::WrapMode wrapModes[2];
     GrTest::TestWrapModes(d->fRandom, wrapModes);
@@ -551,7 +555,11 @@
 
 #if GR_TEST_UTILS
 GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomAlphaOnlyView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomAlphaOnlyView());
+#endif
 
     GrSamplerState::WrapMode wrapModes[2];
     GrTest::TestWrapModes(d->fRandom, wrapModes);
@@ -864,7 +872,11 @@
 
 #if GR_TEST_UTILS
 GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomView());
+#endif
 
     GrSamplerState::WrapMode wrapModes[2];
     GrTest::TestWrapModes(d->fRandom, wrapModes);
diff --git a/third_party/skia_next/third_party/skia/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp b/third_party/skia_next/third_party/skia/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp
index ed4b5a5..e5a261f 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp
@@ -245,7 +245,11 @@
 #if GR_TEST_UTILS
 std::unique_ptr<GrFragmentProcessor> GrGaussianConvolutionFragmentProcessor::TestCreate(
         GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomView());
+#endif
 
     Direction dir = d->fRandom->nextBool() ? Direction::kY : Direction::kX;
     SkIRect subset{
diff --git a/third_party/skia_next/third_party/skia/src/gpu/effects/GrMatrixConvolutionEffect.cpp b/third_party/skia_next/third_party/skia/src/gpu/effects/GrMatrixConvolutionEffect.cpp
index ba8b973..77e961e 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/effects/GrMatrixConvolutionEffect.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/effects/GrMatrixConvolutionEffect.cpp
@@ -333,7 +333,11 @@
                                                                      GrSamplerState::WrapMode wm,
                                                                      bool convolveAlpha,
                                                                      const GrCaps& caps) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [kernelWrapper, kernelFP] = KernelWrapper::Make(context, kernelSize, caps, kernel);
+#else
+    STRUCTURED_BINDING_2(kernelWrapper, kernelFP, KernelWrapper::Make(context, kernelSize, caps, kernel));
+#endif
     if (!kernelWrapper.isValid()) {
         return nullptr;
     }
@@ -349,7 +353,11 @@
 
 #if GR_TEST_UTILS
 std::unique_ptr<GrFragmentProcessor> GrMatrixConvolutionEffect::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomView());
+#endif
 
     static constexpr size_t kMaxTestKernelSize = 2 * kMaxUniformSize;
     int width = d->fRandom->nextRangeU(1, kMaxTestKernelSize);
diff --git a/third_party/skia_next/third_party/skia/src/gpu/effects/GrShadowGeoProc.cpp b/third_party/skia_next/third_party/skia/src/gpu/effects/GrShadowGeoProc.cpp
index 4d2528f..2e1f616 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/effects/GrShadowGeoProc.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/effects/GrShadowGeoProc.cpp
@@ -75,7 +75,11 @@
 
 #if GR_TEST_UTILS
 GrGeometryProcessor* GrRRectShadowGeoProc::TestCreate(GrProcessorTestData* d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = d->randomAlphaOnlyView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, d->randomAlphaOnlyView());
+#endif
 
     return GrRRectShadowGeoProc::Make(d->allocator(), view);
 }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/effects/GrSkSLFP.cpp b/third_party/skia_next/third_party/skia/src/gpu/effects/GrSkSLFP.cpp
index a31e07e..25367cd 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/effects/GrSkSLFP.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/effects/GrSkSLFP.cpp
@@ -419,8 +419,13 @@
         c = d->fRandom->nextU();
     }
     auto filter = SkOverdrawColorFilter::MakeWithSkColors(colors);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [success, fp] = as_CFB(filter)->asFragmentProcessor(/*inputFP=*/nullptr, d->context(),
                                                              GrColorInfo{});
+#else
+    STRUCTURED_BINDING_2(success, fp, as_CFB(filter)->asFragmentProcessor(/*inputFP=*/nullptr, d->context(),
+                                                             GrColorInfo{}));
+#endif
     SkASSERT(success);
     return std::move(fp);
 }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/effects/GrTextureEffect.cpp b/third_party/skia_next/third_party/skia/src/gpu/effects/GrTextureEffect.cpp
index 2b2beaa..ac38ffb 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/effects/GrTextureEffect.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/effects/GrTextureEffect.cpp
@@ -790,7 +790,11 @@
 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrTextureEffect);
 #if GR_TEST_UTILS
 std::unique_ptr<GrFragmentProcessor> GrTextureEffect::TestCreate(GrProcessorTestData* testData) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct, at] = testData->randomView();
+#else
+    STRUCTURED_BINDING_3(view, ct, at, testData->randomView());
+#endif
     Wrap wrapModes[2];
     GrTest::TestWrapModes(testData->fRandom, wrapModes);
 
diff --git a/third_party/skia_next/third_party/skia/src/gpu/effects/GrYUVtoRGBEffect.cpp b/third_party/skia_next/third_party/skia/src/gpu/effects/GrYUVtoRGBEffect.cpp
index 61abd4c..d38036d 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/effects/GrYUVtoRGBEffect.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/effects/GrYUVtoRGBEffect.cpp
@@ -21,7 +21,11 @@
     float m[20];
     SkColorMatrix_RGB2YUV(yuvaProxies.yuvaInfo().yuvColorSpace(), m);
     for (int i = 0; i < SkYUVAInfo::kYUVAChannelCount; ++i) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [plane, channel] = yuvaProxies.yuvaLocations()[i];
+#else
+        STRUCTURED_BINDING_2(plane, channel, yuvaProxies.yuvaLocations()[i]);
+#endif
         if (plane == -1) {
             return;
         }
@@ -61,7 +65,11 @@
         SkRect planeSubset;
         SkRect planeDomain;
         bool makeLinearWithSnap = false;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [ssx, ssy] = yuvaProxies.yuvaInfo().planeSubsamplingFactors(i);
+#else
+        STRUCTURED_BINDING_2(ssx, ssy, yuvaProxies.yuvaInfo().planeSubsamplingFactors(i));
+#endif
         SkASSERT(ssx > 0 && ssx <= 4);
         SkASSERT(ssy > 0 && ssy <= 2);
         float scaleX = 1.f;
@@ -265,7 +273,11 @@
                 std::string colorChannel;
                 std::string planeChannel;
                 for (int locIdx = 0; locIdx < (hasAlpha ? 4 : 3); ++locIdx) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                     auto [yuvPlane, yuvChannel] = yuvEffect.fLocations[locIdx];
+#else
+                    STRUCTURED_BINDING_2(yuvPlane, yuvChannel, yuvEffect.fLocations[locIdx]);
+#endif
                     if (yuvPlane == planeIdx) {
                         colorChannel.push_back("rgba"[locIdx]);
                         planeChannel.push_back("rgba"[static_cast<int>(yuvChannel)]);
@@ -339,7 +351,12 @@
 void GrYUVtoRGBEffect::onAddToKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
     uint32_t packed = 0;
     int i = 0;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [plane, channel] : fLocations) {
+#else
+    for (auto item : fLocations) {
+        STRUCTURED_BINDING_2(plane, channel, std::move(item));
+#endif
         if (plane < 0) {
             continue;
         }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/geometry/GrPathUtils.h b/third_party/skia_next/third_party/skia/src/gpu/geometry/GrPathUtils.h
index c9ccc21..5dee315 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/geometry/GrPathUtils.h
+++ b/third_party/skia_next/third_party/skia/src/gpu/geometry/GrPathUtils.h
@@ -137,7 +137,7 @@
 // NOTE: This method interpolates at 1/3 and 2/3, but if suitable in context, the cubic
 // {p0, p0, p1, p1} may also work.
 inline void writeLineAsCubic(SkPoint startPt, SkPoint endPt, skgpu::VertexWriter* writer) {
-    using grvx::float2, skvx::bit_pun;
+    using grvx::float2; using skvx::bit_pun;
     float2 p0 = bit_pun<float2>(startPt);
     float2 p1 = bit_pun<float2>(endPt);
     float2 v = (p1 - p0) * (1/3.f);
@@ -146,7 +146,7 @@
 
 // Converts the given quadratic bezier to a cubic.
 inline void writeQuadAsCubic(const SkPoint p[3], skgpu::VertexWriter* writer) {
-    using grvx::float2, skvx::bit_pun;
+    using grvx::float2; using skvx::bit_pun;
     float2 p0 = bit_pun<float2>(p[0]);
     float2 p1 = bit_pun<float2>(p[1]);
     float2 p2 = bit_pun<float2>(p[2]);
diff --git a/third_party/skia_next/third_party/skia/src/gpu/geometry/GrRect.h b/third_party/skia_next/third_party/skia/src/gpu/geometry/GrRect.h
index 546d349..38bbca0 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/geometry/GrRect.h
+++ b/third_party/skia_next/third_party/skia/src/gpu/geometry/GrRect.h
@@ -151,4 +151,16 @@
     // dst bounds.
     return !clippedSrcRect->isEmpty();
 }
+
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<GrIRect16> {
+  static auto Coerce(GrIRect16&& t) {
+    return std::make_tuple(t.fLeft, t.fTop, t.fRight, t.fBottom);
+  }
+  static auto Coerce(const GrIRect16& t) {
+    return std::make_tuple(t.fLeft, t.fTop, t.fRight, t.fBottom);
+  }
+};
+#endif
 #endif
diff --git a/third_party/skia_next/third_party/skia/src/gpu/gl/GrGLOpsRenderPass.cpp b/third_party/skia_next/third_party/skia/src/gpu/gl/GrGLOpsRenderPass.cpp
index 1c0f852..1ebbfd2 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/gl/GrGLOpsRenderPass.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/gl/GrGLOpsRenderPass.cpp
@@ -324,7 +324,11 @@
     while (drawCount) {
         int countInBatch = std::min(drawCount, kMaxDrawCountPerBatch);
         for (int i = 0; i < countInBatch; ++i) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [vertexCount, instanceCount, baseVertex, baseInstance] = cmds[i];
+#else
+            STRUCTURED_BINDING_4(vertexCount, instanceCount, baseVertex, baseInstance, cmds[i]);
+#endif
             fFirsts[i] = baseVertex;
             fCounts[i] = vertexCount;
             fInstanceCounts[i] = instanceCount;
@@ -397,7 +401,11 @@
     while (drawCount) {
         int countInBatch = std::min(drawCount, kMaxDrawCountPerBatch);
         for (int i = 0; i < countInBatch; ++i) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [indexCount, instanceCount, baseIndex, baseVertex, baseInstance] = cmds[i];
+#else
+            STRUCTURED_BINDING_5(indexCount, instanceCount, baseIndex, baseVertex, baseInstance, cmds[i]);
+#endif
             fCounts[i] = indexCount;
             fIndices[i] = this->offsetForBaseIndex(baseIndex);
             fInstanceCounts[i] = instanceCount;
diff --git a/third_party/skia_next/third_party/skia/src/gpu/gl/GrGLUtil.cpp b/third_party/skia_next/third_party/skia/src/gpu/gl/GrGLUtil.cpp
index 9590646..f710539 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/gl/GrGLUtil.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/gl/GrGLUtil.cpp
@@ -572,11 +572,19 @@
 
     GrGLVendor angleVendor = get_vendor(angleVendorString);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [angleDriver, angleDriverVersion] = get_driver_and_version(kGLES_GrGLStandard,
                                                                     angleVendor,
                                                                     angleVendorString,
                                                                     angleRendererString,
                                                                     angleVersionString);
+#else
+    STRUCTURED_BINDING_2(angleDriver, angleDriverVersion, get_driver_and_version(kGLES_GrGLStandard,
+                                                                    angleVendor,
+                                                                    angleVendorString,
+                                                                    angleRendererString,
+                                                                    angleVersionString));
+#endif
 
     auto angleRenderer = get_renderer(angleRendererString, extensions);
 
diff --git a/third_party/skia_next/third_party/skia/src/gpu/ops/AtlasPathRenderer.cpp b/third_party/skia_next/third_party/skia/src/gpu/ops/AtlasPathRenderer.cpp
index b20cdd4..413846e 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/ops/AtlasPathRenderer.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/ops/AtlasPathRenderer.cpp
@@ -144,7 +144,11 @@
     float atlasMaxPathHeight_pow2 = (fallbackAAType == GrAAType::kMSAA)
             ? kAtlasMaxPathHeightWithMSAAFallback * kAtlasMaxPathHeightWithMSAAFallback
             : kAtlasMaxPathHeight * kAtlasMaxPathHeight;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [topLeftFloor, botRightCeil] = round_out(pathDevBounds);
+#else
+    STRUCTURED_BINDING_2(topLeftFloor, botRightCeil, round_out(pathDevBounds));
+#endif
     float2 size = botRightCeil - topLeftFloor;
     return // Ensure the path's largest dimension fits in the atlas.
            skvx::all(size <= fAtlasMaxPathWidth) &&
@@ -180,7 +184,11 @@
 #ifdef SK_DEBUG
     // is_visible() should have guaranteed the path's bounds were representable as ints, since clip
     // bounds within the max render target size are nowhere near INT_MAX.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [topLeftFloor, botRightCeil] = round_out(pathDevBounds);
+#else
+    STRUCTURED_BINDING_2(topLeftFloor, botRightCeil, round_out(pathDevBounds));
+#endif
     SkASSERT(skvx::all(skvx::cast<float>(int2::Load(&devIBounds->fLeft)) == topLeftFloor));
     SkASSERT(skvx::all(skvx::cast<float>(int2::Load(&devIBounds->fRight)) == botRightCeil));
 #endif
@@ -358,7 +366,11 @@
     }
 
     SkMatrix atlasMatrix;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [atlasX, atlasY] = locationInAtlas;
+#else
+    STRUCTURED_BINDING_2(atlasX, atlasY, locationInAtlas);
+#endif
     if (!transposedInAtlas) {
         atlasMatrix = SkMatrix::Translate(atlasX - devIBounds.left(), atlasY - devIBounds.top());
     } else {
diff --git a/third_party/skia_next/third_party/skia/src/gpu/ops/AtlasTextOp.cpp b/third_party/skia_next/third_party/skia/src/gpu/ops/AtlasTextOp.cpp
index 980f9c5..b40cdc4 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/ops/AtlasTextOp.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/ops/AtlasTextOp.cpp
@@ -289,7 +289,11 @@
             // Regenerate the atlas for the remainder of the glyphs in the run, or the remainder
             // of the glyphs to fill the vertex buffer.
             int regenEnd = subRunCursor + std::min(subRunEnd - subRunCursor, quadEnd - quadCursor);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto[ok, glyphsRegenerated] = subRun.regenerateAtlas(subRunCursor, regenEnd, target);
+#else
+            STRUCTURED_BINDING_2(ok, glyphsRegenerated, subRun.regenerateAtlas(subRunCursor, regenEnd, target));
+#endif
             // There was a problem allocating the glyph in the atlas. Bail.
             if (!ok) {
                 return;
diff --git a/third_party/skia_next/third_party/skia/src/gpu/ops/FillRRectOp.cpp b/third_party/skia_next/third_party/skia/src/gpu/ops/FillRRectOp.cpp
index 6637288..d0b4053 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/ops/FillRRectOp.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/ops/FillRRectOp.cpp
@@ -521,7 +521,11 @@
                                                              &fInstanceBuffer, &fBaseInstance)) {
         SkDEBUGCODE(auto end = instanceWrter.makeOffset(instanceStride * fInstanceCount));
         for (Instance* i = fHeadInstance; i; i = i->fNext) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [l, t, r, b] = i->fRRect.rect();
+#else
+            STRUCTURED_BINDING_4(l, t, r, b, i->fRRect.rect());
+#endif
 
             // Produce a matrix that draws the round rect from normalized [-1, -1, +1, +1] space.
             SkMatrix m;
diff --git a/third_party/skia_next/third_party/skia/src/gpu/ops/PathStencilCoverOp.cpp b/third_party/skia_next/third_party/skia/src/gpu/ops/PathStencilCoverOp.cpp
index ad6315d..d8ae94e 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/ops/PathStencilCoverOp.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/ops/PathStencilCoverOp.cpp
@@ -246,10 +246,20 @@
         int maxTrianglesInFans = std::max(maxCombinedFanEdges - 2, 0);
         VertexWriter triangleVertexWriter = vertexAlloc.lock<SkPoint>(maxTrianglesInFans * 3);
         int fanTriangleCount = 0;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [pathMatrix, path] : *fPathDrawList) {
+#else
+        for (auto item : *fPathDrawList) {
+            STRUCTURED_BINDING_2(pathMatrix, path, std::move(item));
+#endif
             PathXform m(pathMatrix);
             for (PathMiddleOutFanIter it(path); !it.done();) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 for (auto [p0, p1, p2] : it.nextStack()) {
+#else
+                for (auto item : it.nextStack()) {
+                    STRUCTURED_BINDING_3(p0, p1, p2, std::move(item));
+#endif
                     triangleVertexWriter << m.map2Points(p0, p1) << m.mapPoint(p2);
                     ++fanTriangleCount;
                 }
@@ -269,7 +279,12 @@
                                                                 &fBBoxBuffer,
                                                                 &fBBoxBaseInstance);
         SkDEBUGCODE(int pathCount = 0;)
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [pathMatrix, path] : *fPathDrawList) {
+#else
+        for (auto item : *fPathDrawList) {
+            STRUCTURED_BINDING_2(pathMatrix, path, std::move(item));
+#endif
             SkDEBUGCODE(auto end = vertexWriter.makeOffset(instanceStride));
             vertexWriter << pathMatrix.getScaleX()
                          << pathMatrix.getSkewY()
diff --git a/third_party/skia_next/third_party/skia/src/gpu/ops/TextureOp.cpp b/third_party/skia_next/third_party/skia/src/gpu/ops/TextureOp.cpp
index 2e95cf7..2dccce3 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/ops/TextureOp.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/ops/TextureOp.cpp
@@ -567,7 +567,11 @@
                          (netFilter == GrSamplerState::Filter::kNearest && filter > netFilter));
                 SkASSERT(mm == netMM ||
                          (netMM == GrSamplerState::MipmapMode::kNone && mm > netMM));
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 auto [mustFilter, mustMM] = filter_and_mm_have_effect(quad.fLocal, quad.fDevice);
+#else
+                STRUCTURED_BINDING_2(mustFilter, mustMM, filter_and_mm_have_effect(quad.fLocal, quad.fDevice));
+#endif
                 if (filter != GrSamplerState::Filter::kNearest) {
                     if (mustFilter) {
                         netFilter = filter; // upgrade batch to higher filter level
@@ -1145,7 +1149,11 @@
     }
 
     if (filter != GrSamplerState::Filter::kNearest || mm != GrSamplerState::MipmapMode::kNone) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [mustFilter, mustMM] = filter_and_mm_have_effect(quad->fLocal, quad->fDevice);
+#else
+        STRUCTURED_BINDING_2(mustFilter, mustMM, filter_and_mm_have_effect(quad->fLocal, quad->fDevice));
+#endif
         if (!mustFilter) {
             filter = GrSamplerState::Filter::kNearest;
         }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/ops/TriangulatingPathRenderer.cpp b/third_party/skia_next/third_party/skia/src/gpu/ops/TriangulatingPathRenderer.cpp
index 0f2fd0a..cce727f 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/ops/TriangulatingPathRenderer.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/ops/TriangulatingPathRenderer.cpp
@@ -287,7 +287,11 @@
                                                         fViewMatrix, fShape.bounds());
 
         if (!fVertexData) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [cachedVerts, data] = threadSafeCache->findVertsWithData(key);
+#else
+            STRUCTURED_BINDING_2(cachedVerts, data, threadSafeCache->findVertsWithData(key));
+#endif
             if (cachedVerts && cache_match(data.get(), tol)) {
                 fVertexData = std::move(cachedVerts);
             }
@@ -326,7 +330,11 @@
 
         key.setCustomData(create_data(vertexCount, isLinear, tol));
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [tmpV, tmpD] = threadSafeCache->addVertsWithData(key, fVertexData, is_newer_better);
+#else
+        STRUCTURED_BINDING_2(tmpV, tmpD, threadSafeCache->addVertsWithData(key, fVertexData, is_newer_better));
+#endif
         if (tmpV != fVertexData) {
             SkASSERT(!tmpV->gpuBuffer());
             // In this case, although the different triangulation found in the cache is better,
@@ -445,7 +453,11 @@
         SkScalar tol = GrPathUtils::scaleToleranceToSrc(GrPathUtils::kDefaultTolerance,
                                                         fViewMatrix, fShape.bounds());
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [cachedVerts, data] = threadSafeViewCache->findVertsWithData(key);
+#else
+        STRUCTURED_BINDING_2(cachedVerts, data, threadSafeViewCache->findVertsWithData(key));
+#endif
         if (cachedVerts && cache_match(data.get(), tol)) {
             fVertexData = std::move(cachedVerts);
             return;
@@ -468,8 +480,13 @@
         // predicate will replace the version in the cache if 'fVertexData' is a more accurate
         // triangulation. This will leave some other recording threads using a poorer triangulation
         // but will result in a version with greater applicability being in the cache.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [tmpV, tmpD] = threadSafeViewCache->addVertsWithData(key, fVertexData,
                                                                   is_newer_better);
+#else
+        STRUCTURED_BINDING_2(tmpV, tmpD, threadSafeViewCache->addVertsWithData(key, fVertexData,
+                                                                  is_newer_better));
+#endif
         if (tmpV != fVertexData) {
             // Someone beat us to creating the triangulation (and it is better than ours) so
             // just go ahead and use it.
diff --git a/third_party/skia_next/third_party/skia/src/gpu/tessellate/MiddleOutPolygonTriangulator.h b/third_party/skia_next/third_party/skia/src/gpu/tessellate/MiddleOutPolygonTriangulator.h
index 9590e6e..26d17fe 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/tessellate/MiddleOutPolygonTriangulator.h
+++ b/third_party/skia_next/third_party/skia/src/gpu/tessellate/MiddleOutPolygonTriangulator.h
@@ -214,7 +214,12 @@
             fDone = true;
             return fMiddleOut.close();
         }
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         switch (auto [verb, pts, w] = *fPathIter++; verb) {
+#else
+        STRUCTURED_BINDING_3(verb, pts, w, *fPathIter++);
+        switch (verb) {
+#endif
             SkPoint pt;
             case SkPathVerb::kMove:
                 return fMiddleOut.closeAndMove(pts[0]);
diff --git a/third_party/skia_next/third_party/skia/src/gpu/tessellate/PathCurveTessellator.cpp b/third_party/skia_next/third_party/skia/src/gpu/tessellate/PathCurveTessellator.cpp
index 5607b8c..0128fbe 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/tessellate/PathCurveTessellator.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/tessellate/PathCurveTessellator.cpp
@@ -228,10 +228,20 @@
         }
         int numRemainingTriangles = maxTriangles;
         if (fDrawInnerFan) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             for (auto [pathMatrix, path] : pathDrawList) {
+#else
+            for (auto item : pathDrawList) {
+                STRUCTURED_BINDING_2(pathMatrix, path, std::move(item));
+#endif
                 PathXform m(pathMatrix);
                 for (PathMiddleOutFanIter it(path); !it.done();) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                     for (auto [p0, p1, p2] : it.nextStack()) {
+#else
+                    for (auto item : it.nextStack()) {
+                        STRUCTURED_BINDING_3(p0, p1, p2, std::move(item));
+#endif
                         vertexWriter << m.map2Points(p0, p1) << m.mapPoint(p2);
                         // Mark this instance as a triangle by setting it to a conic with w=Inf.
                         vertexWriter.fill(VertexWriter::kIEEE_32_infinity, 2);
@@ -247,7 +257,12 @@
             int numWritten = 0;
             SkDEBUGCODE(int count = 0;)
 #ifdef SK_DEBUG
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             for (auto [pathMatrix, path] : pathDrawList) {
+#else
+            for (auto item : pathDrawList) {
+                STRUCTURED_BINDING_2(pathMatrix, path, std::move(item));
+#endif
                 // This assert isn't actually necessary, but we currently only use breadcrumb
                 // triangles with an identity pathMatrix. If that ever changes, this assert will
                 // serve as a gentle reminder to make sure the breadcrumb triangles are also
@@ -292,9 +307,19 @@
     }
 
     CurveWriter curveWriter(maxSegments);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [pathMatrix, path] : pathDrawList) {
+#else
+    for (auto item : pathDrawList) {
+        STRUCTURED_BINDING_2(pathMatrix, path, std::move(item));
+#endif
         curveWriter.setMatrices(fShader->viewMatrix(), pathMatrix);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [verb, pts, w] : SkPathPriv::Iterate(path)) {
+#else
+        for (auto item : SkPathPriv::Iterate(path)) {
+            STRUCTURED_BINDING_3(verb, pts, w, std::move(item));
+#endif
             switch (verb) {
                 case SkPathVerb::kQuad:
                     curveWriter.writeQuadratic(shaderCaps, &chunker, pts);
diff --git a/third_party/skia_next/third_party/skia/src/gpu/tessellate/PathWedgeTessellator.cpp b/third_party/skia_next/third_party/skia/src/gpu/tessellate/PathWedgeTessellator.cpp
index 233cfa7..e5124ed 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/tessellate/PathWedgeTessellator.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/tessellate/PathWedgeTessellator.cpp
@@ -19,6 +19,15 @@
 #include "src/gpu/GrOpFlushState.h"
 #endif
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<skvx::Vec<4, float>> {
+  static auto Coerce(skvx::Vec<4, float>&& t) {
+    return std::make_tuple(t[0], t[1], t[2], t[3]);
+  }
+};
+#endif
+
 namespace skgpu {
 
 struct LineToCubic {
@@ -36,7 +45,11 @@
 };
 
 static VertexWriter& operator<<(VertexWriter& vertexWriter, const QuadToCubic& quadratic) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [p0, p1, p2] = quadratic;
+#else
+    float2 p0 = quadratic.fP0, p1 = quadratic.fP1, p2 = quadratic.fP2;
+#endif
     return vertexWriter << p0 << mix(float4(p0,p2), p1.xyxy(), 2/3.f) << p2;
 }
 
@@ -47,7 +60,12 @@
 //   SkTPathContourParser parser;
 //   while (parser.parseNextContour()) {
 //       SkPoint midpoint = parser.currentMidpoint();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
 //       for (auto [verb, pts] : parser.currentContour()) {
+#else
+//       for (auto item : parser.currentContour()) {
+//           STRUCTURED_BINDING_2(verb, pts, std::move(item));
+#endif
 //           ...
 //       }
 //   }
@@ -162,7 +180,12 @@
     }
 
     void quadTo(const SkPoint p[3]) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [p0, p1] = fPathXform.map2Points(p);
+#else
+        auto item = fPathXform.map2Points(p);
+        float2 p0{item[0], item[1]}, p1{item[2], item[3]};
+#endif
         auto p2 = fPathXform.map1Point(p+2);
         float n4 = wangs_formula::quadratic_pow4(kTessellationPrecision, p, fTotalVectorXform);
         if (n4 <= fMaxSegments_pow4) {
@@ -239,8 +262,18 @@
     }
 
     void cubicTo(const SkPoint p[4]) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [p0, p1] = fPathXform.map2Points(p);
+#else
+        auto item = fPathXform.map2Points(p);
+        float2 p0{item[0], item[1]}, p1{item[2], item[3]};
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [p2, p3] = fPathXform.map2Points(p+2);
+#else
+        auto item1 = fPathXform.map2Points(p+2);
+        float2 p2{item1[0], item1[1]}, p3{item1[2], item1[3]};
+#endif
         float n4 = wangs_formula::cubic_pow4(kTessellationPrecision, p, fTotalVectorXform);
         if (n4 <= fMaxSegments_pow4) {
             // This cubic already fits into "maxSegments" tessellation segments.
@@ -403,14 +436,24 @@
     }
     WedgeWriter wedgeWriter(target, &fVertexChunkArray, patchStride, wedgeAllocCount, maxSegments,
                             shaderCaps);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [pathMatrix, path] : pathDrawList) {
+#else
+    for (auto item : pathDrawList) {
+        STRUCTURED_BINDING_2(pathMatrix, path, std::move(item));
+#endif
         wedgeWriter.setMatrices(fShader->viewMatrix(), pathMatrix);
         MidpointContourParser parser(path);
         while (parser.parseNextContour()) {
             wedgeWriter.setMidpoint(parser.currentMidpoint());
             SkPoint lastPoint = {0, 0};
             SkPoint startPoint = {0, 0};
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             for (auto [verb, pts, w] : parser.currentContour()) {
+#else
+            for (auto item : parser.currentContour()) {
+                STRUCTURED_BINDING_3(verb, pts, w, std::move(item));
+#endif
                 switch (verb) {
                     case SkPathVerb::kMove:
                         startPoint = lastPoint = pts[0];
diff --git a/third_party/skia_next/third_party/skia/src/gpu/tessellate/StrokeHardwareTessellator.cpp b/third_party/skia_next/third_party/skia/src/gpu/tessellate/StrokeHardwareTessellator.cpp
index 4c32270..2489200 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/tessellate/StrokeHardwareTessellator.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/tessellate/StrokeHardwareTessellator.cpp
@@ -745,7 +745,12 @@
 
         const SkPath& path = pathStroke->fPath;
         bool contourIsEmpty = true;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [verb, p, w] : SkPathPriv::Iterate(path)) {
+#else
+        for (auto item : SkPathPriv::Iterate(path)) {
+            STRUCTURED_BINDING_3(verb, p, w, std::move(item));
+#endif
             bool prevJoinFitsInPatch;
             SkPoint scratchPts[4];
             const SkPoint* patchPts;
diff --git a/third_party/skia_next/third_party/skia/src/gpu/tessellate/StrokeIterator.h b/third_party/skia_next/third_party/skia/src/gpu/tessellate/StrokeIterator.h
index e951891..2a8f277 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/tessellate/StrokeIterator.h
+++ b/third_party/skia_next/third_party/skia/src/gpu/tessellate/StrokeIterator.h
@@ -69,7 +69,11 @@
         }
         for (; fIter != fEnd; ++fIter) {
             SkASSERT(fQueueCount == 0 || fQueueCount == 1);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [verb, pts, w] = *fIter;
+#else
+            STRUCTURED_BINDING_3(verb, pts, w, *fIter);
+#endif
             switch (verb) {
                 case SkPathVerb::kMove:
                     if (!this->finishOpenContour()) {
diff --git a/third_party/skia_next/third_party/skia/src/gpu/tessellate/Tessellation.cpp b/third_party/skia_next/third_party/skia/src/gpu/tessellate/Tessellation.cpp
index 9297383..82285a2 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/tessellate/Tessellation.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/tessellate/Tessellation.cpp
@@ -97,7 +97,12 @@
 
 SkPath PreChopPathCurves(const SkPath& path, const SkMatrix& matrix, const SkRect& viewport) {
     PathChopper chopper(matrix, viewport);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [verb, p, w] : SkPathPriv::Iterate(path)) {
+#else
+    for (auto item : SkPathPriv::Iterate(path)) {
+        STRUCTURED_BINDING_3(verb, p, w, std::move(item));
+#endif
         switch (verb) {
             case SkPathVerb::kMove:
                 chopper.moveTo(p[0]);
diff --git a/third_party/skia_next/third_party/skia/src/gpu/text/GrTextBlob.cpp b/third_party/skia_next/third_party/skia/src/gpu/text/GrTextBlob.cpp
index f297665..98022d5 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/text/GrTextBlob.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/text/GrTextBlob.cpp
@@ -98,16 +98,35 @@
                                   GrColor color,
                                   const SkMatrix& matrix) {
     SkPoint inset = {dstPadding, dstPadding};
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto[quad, glyph, vertexData] : quadData) {
+#else
+    for (auto item : quadData) {
+        STRUCTURED_BINDING_3(quad, glyph, vertexData, std::move(item));
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[pos, rect] = vertexData;
+#else
+        auto pos = vertexData.pos;
+        auto rect = vertexData.rect;
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[l, t, r, b] = rect;
+#else
+        STRUCTURED_BINDING_4(l, t, r, b, rect);
+#endif
         SkPoint sLT = (SkPoint::Make(l, t) + inset) * strikeToSource + pos,
                 sRB = (SkPoint::Make(r, b) - inset) * strikeToSource + pos;
         SkPoint lt = matrix.mapXY(sLT.x(), sLT.y()),
                 lb = matrix.mapXY(sLT.x(), sRB.y()),
                 rt = matrix.mapXY(sRB.x(), sLT.y()),
                 rb = matrix.mapXY(sRB.x(), sRB.y());
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[al, at, ar, ab] = glyph->fAtlasLocator.getUVs();
+#else
+        auto a = glyph->fAtlasLocator.getUVs();
+        auto al = a[0], at = a[1], ar = a[2], ab = a[3];
+#endif
         quad[0] = {lt, color, {al, at}};  // L,T
         quad[1] = {lb, color, {al, ab}};  // L,B
         quad[2] = {rt, color, {ar, at}};  // R,T
@@ -128,16 +147,35 @@
         positionMatrix.mapHomogeneousPoints(&result, &pt, 1);
         return result;
     };
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto[quad, glyph, vertexData] : quadData) {
+#else
+    for (auto item : quadData) {
+        STRUCTURED_BINDING_3(quad, glyph, vertexData, std::move(item));
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[pos, rect] = vertexData;
+#else
+        auto pos = vertexData.pos;
+        auto rect = vertexData.rect;
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [l, t, r, b] = rect;
+#else
+        STRUCTURED_BINDING_4(l, t, r, b, rect);
+#endif
         SkPoint sLT = (SkPoint::Make(l, t) + inset) * strikeToSource + pos,
                 sRB = (SkPoint::Make(r, b) - inset) * strikeToSource + pos;
         SkPoint3 lt = mapXYZ(sLT.x(), sLT.y()),
                  lb = mapXYZ(sLT.x(), sRB.y()),
                  rt = mapXYZ(sRB.x(), sLT.y()),
                  rb = mapXYZ(sRB.x(), sRB.y());
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[al, at, ar, ab] = glyph->fAtlasLocator.getUVs();
+#else
+        auto a = glyph->fAtlasLocator.getUVs();
+        auto al = a[0], at = a[1], ar = a[2], ab = a[3];
+#endif
         quad[0] = {lt, color, {al, at}};  // L,T
         quad[1] = {lb, color, {al, ab}};  // L,B
         quad[2] = {rt, color, {ar, at}};  // R,T
@@ -287,7 +325,11 @@
     auto pathData = alloc->makeUniqueArray<PathGlyph>(
             drawables.size(),
             [&](int i){
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 auto [variant, pos] = drawables[i];
+#else
+                STRUCTURED_BINDING_2(variant, pos, drawables[i]);
+#endif
                 return PathGlyph{*variant.path(), pos};
             });
     SkSpan<PathGlyph> paths{pathData.get(), drawables.size()};
@@ -354,7 +396,12 @@
         const SkStrikeSpec &spec, SkSpan<SkGlyphVariant> glyphs, GrSubRunAllocator* alloc) {
 
     Variant* variants = alloc->makePODArray<Variant>(glyphs.size());
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [i, gv] : SkMakeEnumerate(glyphs)) {
+#else
+    for (auto item : SkMakeEnumerate(glyphs)) {
+        STRUCTURED_BINDING_2(i, gv, std::move(item));
+#endif
         variants[i] = gv.glyph()->getPackedID();
     }
 
@@ -532,8 +579,17 @@
             std::numeric_limits<int16_t>::max() - SkStrikeCommon::kSkSideTooBigForAtlas;
     SkGlyphRect runBounds = skglyph::empty_rect();
     size_t goodPosCount = 0;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [variant, pos] : drawables) {
+#else
+    for (auto item : drawables) {
+        STRUCTURED_BINDING_2(variant, pos, std::move(item));
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [x, y] = pos;
+#else
+        STRUCTURED_BINDING_2(x, y, pos);
+#endif
         // Ensure that the .offset() call below does not overflow. And, at this point none of the
         // rectangles are empty because they were culled before the run was created. Basically,
         // cull all the glyphs that can't appear on the screen.
@@ -563,7 +619,11 @@
 }
 
 bool DirectMaskSubRun::canReuse(const SkPaint& paint, const SkMatrix& drawMatrix) const {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [reuse, translation] = check_integer_translate(fBlob->initialMatrix(), drawMatrix);
+#else
+    STRUCTURED_BINDING_2(reuse, translation, check_integer_translate(fBlob->initialMatrix(), drawMatrix));
+#endif
 
     // If glyphs were excluded because of position bounds, then this subrun can only be reused if
     // there is no change in position.
@@ -591,8 +651,13 @@
                             const SkGlyphRunList& glyphRunList,
                             const SkPaint& paint,
                             skgpu::v1::SurfaceDrawContext* sdc) const{
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto[drawingClip, op] = this->makeAtlasTextOp(
             clip, viewMatrix, glyphRunList, paint, sdc, nullptr);
+#else
+    STRUCTURED_BINDING_2(drawingClip, op, this->makeAtlasTextOp(
+            clip, viewMatrix, glyphRunList, paint, sdc, nullptr));
+#endif
     if (op != nullptr) {
         sdc->addDrawOp(drawingClip, std::move(op));
     }
@@ -656,7 +721,11 @@
     // needed.
     const SkRect subRunBounds = this->deviceRect(drawMatrix, drawOrigin);
     const SkRect deviceBounds = SkRect::MakeWH(sdc->width(), sdc->height());
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [clipMethod, clipRect] = calculate_clip(clip, deviceBounds, subRunBounds);
+#else
+    STRUCTURED_BINDING_2(clipMethod, clipRect, calculate_clip(clip, deviceBounds, subRunBounds));
+#endif
 
     switch (clipMethod) {
         case kClippedOut:
@@ -713,8 +782,18 @@
                const DirectMaskSubRun::DevicePosition> quadData,
                GrColor color,
                SkIPoint integralOriginOffset) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto[quad, glyph, leftTop] : quadData) {
+#else
+    for (auto item : quadData) {
+        STRUCTURED_BINDING_3(quad, glyph, leftTop, std::move(item));
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[al, at, ar, ab] = glyph->fAtlasLocator.getUVs();
+#else
+        auto a = glyph->fAtlasLocator.getUVs();
+        auto al = a[0], at = a[1], ar = a[2], ab = a[3];
+#endif
         SkScalar dl = leftTop[0] + integralOriginOffset.x(),
                  dt = leftTop[1] + integralOriginOffset.y(),
                  dr = dl + (ar - al),
@@ -738,14 +817,28 @@
                            GrColor color,
                            SkIPoint integralOriginOffset,
                            SkIRect* clip = nullptr) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto[quad, glyph, leftTop] : quadData) {
+#else
+    for (auto item : quadData) {
+        STRUCTURED_BINDING_3(quad, glyph, leftTop, std::move(item));
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[al, at, ar, ab] = glyph->fAtlasLocator.getUVs();
+#else
+        auto a = glyph->fAtlasLocator.getUVs();
+        auto al = a[0], at = a[1], ar = a[2], ab = a[3];
+#endif
         uint16_t w = ar - al,
                  h = ab - at;
         SkScalar l = (SkScalar)leftTop[0] + integralOriginOffset.x(),
                  t = (SkScalar)leftTop[1] + integralOriginOffset.y();
         if (clip == nullptr) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto[dl, dt, dr, db] = SkRect::MakeLTRB(l, t, l + w, t + h);
+#else
+            STRUCTURED_BINDING_4(dl, dt, dr, db, SkRect::MakeLTRB(l, t, l + w, t + h));
+#endif
             quad[0] = {{dl, dt}, color, {al, at}};  // L,T
             quad[1] = {{dl, db}, color, {al, ab}};  // L,B
             quad[2] = {{dr, dt}, color, {ar, at}};  // R,T
@@ -916,7 +1009,11 @@
     SkSpan<VertexData> vertexData = alloc->makePODArray<VertexData>(
             drawables,
             [&](auto e) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 auto [variant, pos] = e;
+#else
+                STRUCTURED_BINDING_2(variant, pos, e);
+#endif
                 SkGlyph* skGlyph = variant;
                 int16_t l = skGlyph->left(),
                         t = skGlyph->top(),
@@ -939,8 +1036,13 @@
                                  const SkGlyphRunList& glyphRunList,
                                  const SkPaint& paint,
                                  skgpu::v1::SurfaceDrawContext* sdc) const {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto[drawingClip, op] = this->makeAtlasTextOp(
             clip, viewMatrix, glyphRunList, paint, sdc, nullptr);
+#else
+    STRUCTURED_BINDING_2(drawingClip, op, this->makeAtlasTextOp(
+            clip, viewMatrix, glyphRunList, paint, sdc, nullptr));
+#endif
     if (op != nullptr) {
         sdc->addDrawOp(drawingClip, std::move(op));
     }
@@ -1178,7 +1280,12 @@
                                GrSubRunAllocator* alloc) {
     SkRect bounds = SkRectPriv::MakeLargestInverted();
     auto mapper = [&, strikeToSource=strikeSpec.strikeToSourceRatio()](const auto& d) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto& [variant, pos] = d;
+#else
+        auto& variant = std::get<0>(d);
+        auto& pos = std::get<1>(d);
+#endif
         SkGlyph* skGlyph = variant;
         int16_t l = skGlyph->left(),
                 t = skGlyph->top(),
@@ -1208,8 +1315,13 @@
                       const SkGlyphRunList& glyphRunList,
                       const SkPaint& paint,
                       skgpu::v1::SurfaceDrawContext* sdc) const {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto[drawingClip, op] = this->makeAtlasTextOp(
             clip, viewMatrix, glyphRunList, paint, sdc, nullptr);
+#else
+    STRUCTURED_BINDING_2(drawingClip, op, this->makeAtlasTextOp(
+            clip, viewMatrix, glyphRunList, paint, sdc, nullptr));
+#endif
     if (op != nullptr) {
         sdc->addDrawOp(drawingClip, std::move(op));
     }
@@ -1259,8 +1371,13 @@
     GrPaint grPaint;
     SkPMColor4f drawingColor = calculate_colors(sdc, paint, viewMatrix, fMaskFormat, &grPaint);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [maskType, DFGPFlags, useGammaCorrectDistanceTable] =
         calculate_sdf_parameters(*sdc, drawMatrix, fUseLCDText, fAntiAliased);
+#else
+    STRUCTURED_BINDING_3(maskType, DFGPFlags, useGammaCorrectDistanceTable,
+        calculate_sdf_parameters(*sdc, drawMatrix, fUseLCDText, fAntiAliased));
+#endif
 
     auto geometry = AtlasTextOp::Geometry::MakeForBlob(*this,
                                                        drawMatrix,
@@ -1293,7 +1410,11 @@
     SkScalar newMaxScale = drawMatrix.getMaxScale();
     SkScalar oldMaxScale = initialMatrix.getMaxScale();
     SkScalar scaleAdjust = newMaxScale / oldMaxScale;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [maxMinScale, minMaxScale] = fBlob->scaleBounds();
+#else
+    STRUCTURED_BINDING_2(maxMinScale, minMaxScale, fBlob->scaleBounds());
+#endif
     if (scaleAdjust < maxMinScale || scaleAdjust > minMaxScale) {
         return false;
     }
@@ -1472,7 +1593,11 @@
     }
 
     if (fSetOfDrawingTypes & GrSDFTControl::kDirect) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [compatible, _] = check_integer_translate(fDrawMatrix, that.fDrawMatrix);
+#else
+        STRUCTURED_BINDING_2(compatible, _, check_integer_translate(fDrawMatrix, that.fDrawMatrix));
+#endif
         return compatible;
     }
 
@@ -1713,8 +1838,17 @@
             std::numeric_limits<int16_t>::max() - SkStrikeCommon::kSkSideTooBigForAtlas;
     SkGlyphRect runBounds = skglyph::empty_rect();
     size_t goodPosCount = 0;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [variant, pos] : drawables) {
+#else
+    for (auto item : drawables) {
+        STRUCTURED_BINDING_2(variant, pos, std::move(item));
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [x, y] = pos;
+#else
+        STRUCTURED_BINDING_2(x, y, pos);
+#endif
         // Ensure that the .offset() call below does not overflow. And, at this point none of the
         // rectangles are empty because they were culled before the run was created. Basically,
         // cull all the glyphs that can't appear on the screen.
@@ -1768,7 +1902,11 @@
     // non-AA clip is used. If clipRect is empty, and clip is nullptr, then there is no clipping
     // needed.
     const SkRect deviceBounds = SkRect::MakeWH(sdc->width(), sdc->height());
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [clipMethod, clipRect] = calculate_clip(clip, deviceBounds, fGlyphDeviceBounds);
+#else
+    STRUCTURED_BINDING_2(clipMethod, clipRect, calculate_clip(clip, deviceBounds, fGlyphDeviceBounds));
+#endif
 
     switch (clipMethod) {
         case kClippedOut:
@@ -1827,8 +1965,18 @@
         const GrGlyph*,
         const DirectMaskSubRunNoCache::DevicePosition> quadData,
         GrColor color) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto[quad, glyph, leftTop] : quadData) {
+#else
+    for (auto item : quadData) {
+        STRUCTURED_BINDING_3(quad, glyph, leftTop, std::move(item));
+#endif
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto[al, at, ar, ab] = glyph->fAtlasLocator.getUVs();
+#else
+        auto a = glyph->fAtlasLocator.getUVs();
+        auto al = a[0], at = a[1], ar = a[2], ab = a[3];
+#endif
         SkScalar dl = leftTop[0],
                  dt = leftTop[1],
                  dr = dl + (ar - al),
@@ -1946,7 +2094,11 @@
         GrSubRunAllocator* alloc) {
     SkRect bounds = SkRectPriv::MakeLargestInverted();
     auto initializer = [&, strikeToSource=strikeSpec.strikeToSourceRatio()](auto drawable) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [variant, pos] = drawable;
+#else
+        STRUCTURED_BINDING_2(variant, pos, drawable);
+#endif
         SkGlyph* skGlyph = variant;
         int16_t l = skGlyph->left(),
                 t = skGlyph->top(),
@@ -2175,7 +2327,11 @@
 
     SkRect bounds = SkRectPriv::MakeLargestInverted();
     auto initializer = [&, strikeToSource=strikeSpec.strikeToSourceRatio()](auto drawable) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [variant, pos] = drawable;
+#else
+        STRUCTURED_BINDING_2(variant, pos, drawable);
+#endif
         SkGlyph* skGlyph = variant;
         int16_t l = skGlyph->left(),
                 t = skGlyph->top(),
@@ -2214,8 +2370,13 @@
     GrPaint grPaint;
     SkPMColor4f drawingColor = calculate_colors(sdc, paint, viewMatrix, fMaskFormat, &grPaint);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [maskType, DFGPFlags, useGammaCorrectDistanceTable] =
     calculate_sdf_parameters(*sdc, drawMatrix, fUseLCDText, fAntiAliased);
+#else
+    STRUCTURED_BINDING_3(maskType, DFGPFlags, useGammaCorrectDistanceTable,
+    calculate_sdf_parameters(*sdc, drawMatrix, fUseLCDText, fAntiAliased));
+#endif
 
     auto geometry = new ((void*)fGeom) AtlasTextOp::Geometry {
             *this,
@@ -2367,7 +2528,12 @@
     SkMatrix strikeToSource = SkMatrix::Scale(strikeToSourceScale, strikeToSourceScale);
     strikeToSource.postTranslate(drawOrigin.x(), drawOrigin.y());
     if (!needsExactCTM) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [variant, pos] : drawables) {
+#else
+        for (auto item : drawables) {
+            STRUCTURED_BINDING_2(variant, pos, std::move(item));
+#endif
             const SkPath& path = *variant.path();
             SkMatrix pathMatrix = strikeToSource;
             pathMatrix.postTranslate(pos.x(), pos.y());
@@ -2381,7 +2547,12 @@
     } else {
         // Transform the path to device space because the deviceMatrix must be unchanged to
         // draw effect, filter or shader paths.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [variant, pos] : drawables) {
+#else
+        for (auto item : drawables) {
+            STRUCTURED_BINDING_2(variant, pos, std::move(item));
+#endif
             const SkPath& path = *variant.path();
             // Transform the glyph to source space.
             SkMatrix pathMatrix = strikeToSource;
@@ -2412,8 +2583,13 @@
         return;
     }
     GrAtlasSubRun* subRunPtr = subRun.get();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [drawingClip, op] = subRunPtr->makeAtlasTextOp(
             fClip, fViewMatrix, fGlyphRunList, fPaint, fSDC, std::move(subRun));
+#else
+    STRUCTURED_BINDING_2(drawingClip, op, subRunPtr->makeAtlasTextOp(
+            fClip, fViewMatrix, fGlyphRunList, fPaint, fSDC, std::move(subRun)));
+#endif
     if (op != nullptr) {
         fSDC->addDrawOp(drawingClip, std::move(op));
     }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/v1/Device.cpp b/third_party/skia_next/third_party/skia/src/gpu/v1/Device.cpp
index 91cde8a..d7f710c 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/v1/Device.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/v1/Device.cpp
@@ -77,8 +77,13 @@
     if (viewMatrix.isIdentity() || rrect.transform(viewMatrix, devRRect.writable())) {
         auto edgeType = (aa == GrAA::kYes) ? GrClipEdgeType::kInverseFillAA
                                            : GrClipEdgeType::kInverseFillBW;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [success, fp] = GrRRectEffect::Make(/*inputFP=*/nullptr, edgeType, *devRRect,
                                                  shaderCaps);
+#else
+        STRUCTURED_BINDING_2(success, fp, GrRRectEffect::Make(/*inputFP=*/nullptr, edgeType, *devRRect,
+                                                 shaderCaps));
+#endif
         return (success) ? std::move(fp) : nullptr;
     }
     return nullptr;
@@ -671,7 +676,11 @@
 
     SkPixmap pm;
     if (image->isTextureBacked()) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [view, ct] = as_IB(image)->asView(this->recordingContext(), GrMipmapped::kNo);
+#else
+        STRUCTURED_BINDING_2(view, ct, as_IB(image)->asView(this->recordingContext(), GrMipmapped::kNo));
+#endif
         SkASSERT(view);
 
         return SkSpecialImage::MakeDeferredFromGpu(fContext.get(),
@@ -798,8 +807,14 @@
                               const SkPaint& paint) {
     ASSERT_SINGLE_OWNER
     auto iter = std::make_unique<SkLatticeIter>(lattice, dst);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     if (auto [view, ct] = as_IB(image)->asView(this->recordingContext(), GrMipmapped::kNo); view) {
         GrColorInfo colorInfo(ct, image->alphaType(), image->refColorSpace());
+#else
+    STRUCTURED_BINDING_2(view, ct, as_IB(image)->asView(this->recordingContext(), GrMipmapped::kNo));
+    if (view) {
+        GrColorInfo colorInfo(ct, image->alphaType(), image->refColorSpace());
+#endif
         this->drawViewLattice(std::move(view),
                               std::move(colorInfo),
                               std::move(iter),
diff --git a/third_party/skia_next/third_party/skia/src/gpu/v1/Device_drawTexture.cpp b/third_party/skia_next/third_party/skia/src/gpu/v1/Device_drawTexture.cpp
index 4eb0878..65c7d76 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/v1/Device_drawTexture.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/v1/Device_drawTexture.cpp
@@ -431,7 +431,11 @@
         can_use_draw_texture(paint, sampling.useCubic, sampling.mipmap)) {
         // We've done enough checks above to allow us to pass ClampNearest() and not check for
         // scaling adjustments.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [view, ct] = image.asView(rContext, GrMipmapped::kNo);
+#else
+        STRUCTURED_BINDING_2(view, ct, image.asView(rContext, GrMipmapped::kNo));
+#endif
         if (!view) {
             return;
         }
diff --git a/third_party/skia_next/third_party/skia/src/gpu/v1/SurfaceDrawContext.cpp b/third_party/skia_next/third_party/skia/src/gpu/v1/SurfaceDrawContext.cpp
index cdc61ac..1bc291f 100644
--- a/third_party/skia_next/third_party/skia/src/gpu/v1/SurfaceDrawContext.cpp
+++ b/third_party/skia_next/third_party/skia/src/gpu/v1/SurfaceDrawContext.cpp
@@ -251,7 +251,11 @@
         GrSurfaceOrigin origin,
         SkBudgeted budgeted) {
     const GrCaps* caps = rContext->priv().caps();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [ct, _] = caps->getFallbackColorTypeAndFormat(colorType, sampleCnt);
+#else
+    STRUCTURED_BINDING_2(ct, _, caps->getFallbackColorTypeAndFormat(colorType, sampleCnt));
+#endif
     if (ct == GrColorType::kUnknown) {
         return nullptr;
     }
@@ -357,12 +361,21 @@
             this->recordingContext()->priv().getSDFTControl(
                     this->surfaceProps().isUseDeviceIndependentFonts());
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [canCache, key] = GrTextBlob::Key::Make(glyphRunList,
                                                  paint,
                                                  fSurfaceProps,
                                                  this->colorInfo(),
                                                  drawMatrix,
                                                  control);
+#else
+    STRUCTURED_BINDING_2(canCache, key, GrTextBlob::Key::Make(glyphRunList,
+                                                 paint,
+                                                 fSurfaceProps,
+                                                 this->colorInfo(),
+                                                 drawMatrix,
+                                                 control));
+#endif
 
     sk_sp<GrTextBlob> blob;
     GrTextBlobCache* textBlobCache = fContext->priv().getTextBlobCache();
diff --git a/third_party/skia_next/third_party/skia/src/image/SkImage_Gpu.cpp b/third_party/skia_next/third_party/skia/src/image/SkImage_Gpu.cpp
index 745d6d5..e0bcc25 100644
--- a/third_party/skia_next/third_party/skia/src/image/SkImage_Gpu.cpp
+++ b/third_party/skia_next/third_party/skia/src/image/SkImage_Gpu.cpp
@@ -304,7 +304,11 @@
     info = info.makeColorType(ct);
 
     // Draw this image's texture into the SFC.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, _] = this->asView(dContext, GrMipmapped(this->hasMipmaps()));
+#else
+    STRUCTURED_BINDING_2(view, _, this->asView(dContext, GrMipmapped(this->hasMipmaps())));
+#endif
     auto texFP = GrTextureEffect::Make(std::move(view), this->alphaType());
     auto colorFP = GrColorSpaceXformEffect::Make(std::move(texFP),
                                                  this->imageInfo().colorInfo(),
@@ -552,7 +556,11 @@
                                          ? GrImageTexGenPolicy::kNew_Uncached_Budgeted
                                          : GrImageTexGenPolicy::kNew_Uncached_Unbudgeted;
     // TODO: Don't flatten YUVA images here. Add mips to the planes instead.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct] = as_IB(this)->asView(dContext, mipmapped, policy);
+#else
+    STRUCTURED_BINDING_2(view, ct, as_IB(this)->asView(dContext, mipmapped, policy));
+#endif
     if (!view) {
         return nullptr;
     }
@@ -658,7 +666,11 @@
     SkBitmap bmp;
     bmp.installPixels(*pixmap);
     GrMipmapped mipmapped = buildMips ? GrMipmapped::kYes : GrMipmapped::kNo;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct] = GrMakeUncachedBitmapProxyView(dContext, bmp, mipmapped);
+#else
+    STRUCTURED_BINDING_2(view, ct, GrMakeUncachedBitmapProxyView(dContext, bmp, mipmapped));
+#endif
     if (!view) {
         return SkImage::MakeRasterCopy(*pixmap);
     }
@@ -782,7 +794,11 @@
         return false;
     }
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct] = as_IB(image)->asView(direct, GrMipmapped::kNo);
+#else
+    STRUCTURED_BINDING_2(view, ct, as_IB(image)->asView(direct, GrMipmapped::kNo));
+#endif
 
     if (!view) {
         return false;
diff --git a/third_party/skia_next/third_party/skia/src/image/SkImage_GpuBase.cpp b/third_party/skia_next/third_party/skia/src/image/SkImage_GpuBase.cpp
index f79caf9..2031c21 100644
--- a/third_party/skia_next/third_party/skia/src/image/SkImage_GpuBase.cpp
+++ b/third_party/skia_next/third_party/skia/src/image/SkImage_GpuBase.cpp
@@ -107,7 +107,11 @@
         }
     }
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct] = this->asView(dContext, GrMipmapped::kNo);
+#else
+    STRUCTURED_BINDING_2(view, ct, this->asView(dContext, GrMipmapped::kNo));
+#endif
     if (!view) {
         return false;
     }
@@ -135,7 +139,11 @@
         return nullptr;
     }
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct] = this->asView(direct, GrMipmapped::kNo);
+#else
+    STRUCTURED_BINDING_2(view, ct, this->asView(direct, GrMipmapped::kNo));
+#endif
     SkASSERT(view);
     SkASSERT(ct == SkColorTypeToGrColorType(this->colorType()));
 
@@ -169,7 +177,11 @@
         return false;
     }
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [view, ct] = this->asView(dContext, GrMipmapped::kNo);
+#else
+    STRUCTURED_BINDING_2(view, ct, this->asView(dContext, GrMipmapped::kNo));
+#endif
     SkASSERT(view);
 
     GrColorInfo colorInfo(ct, this->alphaType(), this->refColorSpace());
diff --git a/third_party/skia_next/third_party/skia/src/pathops/SkOpEdgeBuilder.cpp b/third_party/skia_next/third_party/skia/src/pathops/SkOpEdgeBuilder.cpp
index 927d9ae..4644bcf 100644
--- a/third_party/skia_next/third_party/skia/src/pathops/SkOpEdgeBuilder.cpp
+++ b/third_party/skia_next/third_party/skia/src/pathops/SkOpEdgeBuilder.cpp
@@ -88,7 +88,12 @@
     SkPoint curveStart;
     SkPoint curve[4];
     bool lastCurve = false;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [pathVerb, pts, w] : SkPathPriv::Iterate(*fPath)) {
+#else
+    for (auto item : SkPathPriv::Iterate(*fPath)) {
+        STRUCTURED_BINDING_3(pathVerb, pts, w, std::move(item));
+#endif
         auto verb = static_cast<SkPath::Verb>(pathVerb);
         switch (verb) {
             case SkPath::kMove_Verb:
diff --git a/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsAsWinding.cpp b/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsAsWinding.cpp
index 2c227cd..50e9bab 100644
--- a/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsAsWinding.cpp
+++ b/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsAsWinding.cpp
@@ -181,7 +181,12 @@
         bounds.setEmpty();
         int lastStart = 0;
         int verbStart = 0;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [verb, pts, w] : SkPathPriv::Iterate(fPath)) {
+#else
+        for (auto item : SkPathPriv::Iterate(fPath)) {
+            STRUCTURED_BINDING_3(verb, pts, w, std::move(item));
+#endif
             if (SkPathVerb::kMove == verb) {
                 if (!bounds.isEmpty()) {
                     containers->emplace_back(bounds, lastStart, verbStart);
@@ -332,7 +337,11 @@
             SkPathBuilder reverse;
             SkPathBuilder* temp = contour.fReverse ? &reverse : &result;
             for (; iter != iterate.end() && verbCount < contour.fVerbEnd; ++iter, ++verbCount) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 auto [verb, pts, w] = *iter;
+#else
+                STRUCTURED_BINDING_3(verb, pts, w, *iter);
+#endif
                 switch (verb) {
                     case SkPathVerb::kMove:
                         temp->moveTo(pts[0]);
diff --git a/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsDebug.cpp b/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsDebug.cpp
index 7c89792..7de30e8 100644
--- a/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsDebug.cpp
+++ b/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsDebug.cpp
@@ -2839,7 +2839,12 @@
 }
 
 static void showPathContours(const SkPath& path, const char* pathName) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [verb, pts, w] : SkPathPriv::Iterate(path)) {
+#else
+    for (auto item : SkPathPriv::Iterate(path)) {
+        STRUCTURED_BINDING_3(verb, pts, w, std::move(item));
+#endif
         switch (verb) {
             case SkPathVerb::kMove:
                 SkDebugf("    %s.moveTo(", pathName);
diff --git a/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsTightBounds.cpp b/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsTightBounds.cpp
index d11b292..f510154 100644
--- a/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsTightBounds.cpp
+++ b/third_party/skia_next/third_party/skia/src/pathops/SkPathOpsTightBounds.cpp
@@ -11,7 +11,12 @@
 bool TightBounds(const SkPath& path, SkRect* result) {
     SkRect moveBounds = { SK_ScalarMax, SK_ScalarMax, SK_ScalarMin, SK_ScalarMin };
     bool wellBehaved = true;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [verb, pts, w] : SkPathPriv::Iterate(path)) {
+#else
+    for (auto item : SkPathPriv::Iterate(path)) {
+        STRUCTURED_BINDING_3(verb, pts, w, std::move(item));
+#endif
         switch (verb) {
             case SkPathVerb::kMove:
                 moveBounds.fLeft = std::min(moveBounds.fLeft, pts[0].fX);
diff --git a/third_party/skia_next/third_party/skia/src/ports/SkFontHost_FreeType_common.cpp b/third_party/skia_next/third_party/skia/src/ports/SkFontHost_FreeType_common.cpp
index e204c83..784783a 100644
--- a/third_party/skia_next/third_party/skia/src/ports/SkFontHost_FreeType_common.cpp
+++ b/third_party/skia_next/third_party/skia/src/ports/SkFontHost_FreeType_common.cpp
@@ -344,9 +344,10 @@
     switch (colorType) {
         case kAlpha_8_SkColorType:
             return SkMask::kA8_Format;
-        case kN32_SkColorType:
-            return SkMask::kARGB32_Format;
         default:
+            if (colorType == kN32_SkColorType) {
+                return SkMask::kARGB32_Format;
+            }
             SkDEBUGFAIL("unsupported SkBitmap::Config");
             return SkMask::kA8_Format;
     }
diff --git a/third_party/skia_next/third_party/skia/src/shaders/SkColorFilterShader.cpp b/third_party/skia_next/third_party/skia/src/shaders/SkColorFilterShader.cpp
index 93e39c6..86476b8 100644
--- a/third_party/skia_next/third_party/skia/src/shaders/SkColorFilterShader.cpp
+++ b/third_party/skia_next/third_party/skia/src/shaders/SkColorFilterShader.cpp
@@ -101,8 +101,13 @@
     // TODO I guess, but it shouldn't come up as used today.
     SkASSERT(fAlpha == 1.0f);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [success, fp] = fFilter->asFragmentProcessor(std::move(shaderFP), args.fContext,
                                                       *args.fDstColorInfo);
+#else
+    STRUCTURED_BINDING_2(success, fp, fFilter->asFragmentProcessor(std::move(shaderFP), args.fContext,
+                                                      *args.fDstColorInfo));
+#endif
     // If the filter FP could not be created, we still want to return the shader FP, so checking
     // success can be omitted here.
     return std::move(fp);
diff --git a/third_party/skia_next/third_party/skia/src/shaders/SkImageShader.cpp b/third_party/skia_next/third_party/skia/src/shaders/SkImageShader.cpp
index 65f37a7..c58d070 100755
--- a/third_party/skia_next/third_party/skia/src/shaders/SkImageShader.cpp
+++ b/third_party/skia_next/third_party/skia/src/shaders/SkImageShader.cpp
@@ -194,7 +194,12 @@
             {SkFilterMode::kLinear,  SkMipmapMode::kNone},    // legacy Low
             {SkFilterMode::kLinear,  SkMipmapMode::kNearest}, // legacy Medium
         };
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto [f, m] : supported) {
+#else
+        for (auto item : supported) {
+            STRUCTURED_BINDING_2(f, m, std::move(item));
+#endif
             if (sampling.filter == f && sampling.mipmap == m) {
                 return true;
             }
@@ -693,7 +698,11 @@
     if (!access) {
         return {};
     }
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [upper, upperInv] = access->level();
+#else
+    STRUCTURED_BINDING_2(upper, upperInv, access->level());
+#endif
     // If we are using a coordShader, then we can't make guesses about the state of the matrix.
     if (!sampling.useCubic && !coordShader) {
         // TODO: can tweak_sampling sometimes for cubic too when B=0
diff --git a/third_party/skia_next/third_party/skia/src/shaders/SkImageShader.h b/third_party/skia_next/third_party/skia/src/shaders/SkImageShader.h
index cd69840..ba78b8c 100644
--- a/third_party/skia_next/third_party/skia/src/shaders/SkImageShader.h
+++ b/third_party/skia_next/third_party/skia/src/shaders/SkImageShader.h
@@ -12,6 +12,16 @@
 #include "src/shaders/SkBitmapProcShader.h"
 #include "src/shaders/SkShaderBase.h"
 
+#ifdef SKIA_STRUCTURED_BINDINGS_BACKPORT
+template <>
+struct CoercerToTuple<std::pair<SkPixmap, SkMatrix>> {
+  static std::tuple<SkPixmap, SkMatrix> Coerce(
+      std::pair<SkPixmap, SkMatrix>&& t) {
+    return std::make_tuple(t.first, t.second);
+  }
+};
+#endif
+
 class SkImageShader : public SkShaderBase {
 public:
     static sk_sp<SkShader> Make(sk_sp<SkImage>,
diff --git a/third_party/skia_next/third_party/skia/src/shaders/SkPictureShader.cpp b/third_party/skia_next/third_party/skia/src/shaders/SkPictureShader.cpp
index aaea7eb..3a3fe8e 100644
--- a/third_party/skia_next/third_party/skia/src/shaders/SkPictureShader.cpp
+++ b/third_party/skia_next/third_party/skia/src/shaders/SkPictureShader.cpp
@@ -417,7 +417,11 @@
         if (!image) {
             return nullptr;
         }
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [v, ct] = as_IB(image)->asView(ctx, GrMipmapped::kNo);
+#else
+        STRUCTURED_BINDING_2(v, ct, as_IB(image)->asView(ctx, GrMipmapped::kNo));
+#endif
         view = std::move(v);
         provider->assignUniqueKeyToProxy(key, view.asTextureProxy());
     }
diff --git a/third_party/skia_next/third_party/skia/src/shaders/gradients/SkSweepGradient.cpp b/third_party/skia_next/third_party/skia/src/shaders/gradients/SkSweepGradient.cpp
index a0f0070..4063480 100644
--- a/third_party/skia_next/third_party/skia/src/shaders/gradients/SkSweepGradient.cpp
+++ b/third_party/skia_next/third_party/skia/src/shaders/gradients/SkSweepGradient.cpp
@@ -42,7 +42,11 @@
 
     const auto tBias  = buffer.readScalar(),
                tScale = buffer.readScalar();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [startAngle, endAngle] = angles_from_t_coeff(tBias, tScale);
+#else
+    STRUCTURED_BINDING_2(startAngle, endAngle, angles_from_t_coeff(tBias, tScale));
+#endif
 
     return SkGradientShader::MakeSweep(center.x(), center.y(), desc.fColors,
                                        std::move(desc.fColorSpace), desc.fPos, desc.fCount,
diff --git a/third_party/skia_next/third_party/skia/src/sksl/SkSLAnalysis.cpp b/third_party/skia_next/third_party/skia/src/sksl/SkSLAnalysis.cpp
index 6e0c9fc..1db93e6 100644
--- a/third_party/skia_next/third_party/skia/src/sksl/SkSLAnalysis.cpp
+++ b/third_party/skia_next/third_party/skia/src/sksl/SkSLAnalysis.cpp
@@ -487,7 +487,11 @@
             const ForStatement& f = s.as<ForStatement>();
             SkASSERT(f.initializer() && f.initializer()->is<VarDeclaration>());
             const Variable* var = &f.initializer()->as<VarDeclaration>().var();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [iter, inserted] = fLoopIndices.insert(var);
+#else
+            STRUCTURED_BINDING_2(iter, inserted, fLoopIndices.insert(var));
+#endif
             SkASSERT(inserted);
             bool result = this->visitStatement(*f.statement());
             fLoopIndices.erase(iter);
diff --git a/third_party/skia_next/third_party/skia/src/sksl/SkSLInliner.cpp b/third_party/skia_next/third_party/skia/src/sksl/SkSLInliner.cpp
index ca17d5a..929dc31 100644
--- a/third_party/skia_next/third_party/skia/src/sksl/SkSLInliner.cpp
+++ b/third_party/skia_next/third_party/skia/src/sksl/SkSLInliner.cpp
@@ -1048,7 +1048,11 @@
 
 bool Inliner::candidateCanBeInlined(const InlineCandidate& candidate, InlinabilityCache* cache) {
     const FunctionDeclaration& funcDecl = candidate_func(candidate);
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, wasInserted] = cache->insert({&funcDecl, false});
+#else
+    STRUCTURED_BINDING_2(iter, wasInserted, cache->insert({&funcDecl, false}));
+#endif
     if (wasInserted) {
         // Recursion is forbidden here to avoid an infinite death spiral of inlining.
         iter->second = this->isSafeToInline(funcDecl.definition()) &&
@@ -1059,7 +1063,11 @@
 }
 
 int Inliner::getFunctionSize(const FunctionDeclaration& funcDecl, FunctionSizeCache* cache) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, wasInserted] = cache->insert({&funcDecl, 0});
+#else
+    STRUCTURED_BINDING_2(iter, wasInserted, cache->insert({&funcDecl, 0}));
+#endif
     if (wasInserted) {
         iter->second = Analysis::NodeCountUpToLimit(*funcDecl.definition(),
                                                     this->settings().fInlineThreshold);
diff --git a/third_party/skia_next/third_party/skia/src/sksl/SkSLModifiersPool.h b/third_party/skia_next/third_party/skia/src/sksl/SkSLModifiersPool.h
index e9b863c..5237776 100644
--- a/third_party/skia_next/third_party/skia/src/sksl/SkSLModifiersPool.h
+++ b/third_party/skia_next/third_party/skia/src/sksl/SkSLModifiersPool.h
@@ -21,7 +21,13 @@
 class ModifiersPool {
 public:
     const Modifiers* add(const Modifiers& modifiers) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [iter, wasInserted] = fModifiersSet.insert(modifiers);
+#else
+        auto pair = fModifiersSet.insert(modifiers);
+        auto iter = pair.first;
+        bool wasInserted = pair.second;
+#endif
         return &*iter;
     }
 
diff --git a/third_party/skia_next/third_party/skia/src/sksl/SkSLPool.cpp b/third_party/skia_next/third_party/skia/src/sksl/SkSLPool.cpp
index b4d2b3f..da7f40b 100644
--- a/third_party/skia_next/third_party/skia/src/sksl/SkSLPool.cpp
+++ b/third_party/skia_next/third_party/skia/src/sksl/SkSLPool.cpp
@@ -9,7 +9,9 @@
 
 #include "include/private/SkSLDefines.h"
 
+#ifndef STARBOARD // Avoid redefining VLOG from base/logging.h
 #define VLOG(...) // printf(__VA_ARGS__)
+#endif
 
 namespace SkSL {
 
@@ -32,13 +34,17 @@
     fMemPool->reportLeaks();
     SkASSERT(fMemPool->isEmpty());
 
+#ifndef STARBOARD
     VLOG("DELETE Pool:0x%016llX\n", (uint64_t)fMemPool.get());
+#endif
 }
 
 std::unique_ptr<Pool> Pool::Create() {
     auto pool = std::unique_ptr<Pool>(new Pool);
     pool->fMemPool = MemoryPool::Make(/*preallocSize=*/65536, /*minAllocSize=*/32768);
+#ifndef STARBOARD
     VLOG("CREATE Pool:0x%016llX\n", (uint64_t)pool->fMemPool.get());
+#endif
     return pool;
 }
 
@@ -47,14 +53,18 @@
 }
 
 void Pool::attachToThread() {
+#ifndef STARBOARD
     VLOG("ATTACH Pool:0x%016llX\n", (uint64_t)fMemPool.get());
+#endif
     SkASSERT(get_thread_local_memory_pool() == nullptr);
     set_thread_local_memory_pool(fMemPool.get());
 }
 
 void Pool::detachFromThread() {
     MemoryPool* memPool = get_thread_local_memory_pool();
+#ifndef STARBOARD
     VLOG("DETACH Pool:0x%016llX\n", (uint64_t)memPool);
+#endif
     SkASSERT(memPool == fMemPool.get());
     memPool->resetScratchSpace();
     set_thread_local_memory_pool(nullptr);
@@ -65,13 +75,17 @@
     MemoryPool* memPool = get_thread_local_memory_pool();
     if (memPool) {
         void* ptr = memPool->allocate(size);
+#ifndef STARBOARD
         VLOG("ALLOC  Pool:0x%016llX  0x%016llX\n", (uint64_t)memPool, (uint64_t)ptr);
+#endif
         return ptr;
     }
 
     // There's no pool attached. Allocate memory using the system allocator.
     void* ptr = ::operator new(size);
+#ifndef STARBOARD
     VLOG("ALLOC  Pool:__________________  0x%016llX\n", (uint64_t)ptr);
+#endif
     return ptr;
 }
 
@@ -79,13 +93,17 @@
     // Is a pool attached?
     MemoryPool* memPool = get_thread_local_memory_pool();
     if (memPool) {
+#ifndef STARBOARD
         VLOG("FREE   Pool:0x%016llX  0x%016llX\n", (uint64_t)memPool, (uint64_t)ptr);
+#endif
         memPool->release(ptr);
         return;
     }
 
+#ifndef STARBOARD
     // There's no pool attached. Free it using the system allocator.
     VLOG("FREE   Pool:__________________  0x%016llX\n", (uint64_t)ptr);
+#endif
     ::operator delete(ptr);
 }
 
diff --git a/third_party/skia_next/third_party/skia/src/sksl/analysis/SkSLCheckProgramUnrolledSize.cpp b/third_party/skia_next/third_party/skia/src/sksl/analysis/SkSLCheckProgramUnrolledSize.cpp
index 16d28da..dab7280 100644
--- a/third_party/skia_next/third_party/skia/src/sksl/analysis/SkSLCheckProgramUnrolledSize.cpp
+++ b/third_party/skia_next/third_party/skia/src/sksl/analysis/SkSLCheckProgramUnrolledSize.cpp
@@ -55,7 +55,13 @@
                 // Check the function-size cache map first. We don't need to visit this function if
                 // we already processed it before.
                 const FunctionDeclaration* decl = &pe.as<FunctionDefinition>().declaration();
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
                 auto [iter, wasInserted] = fFunctionCostMap.insert({decl, kUnknownCost});
+#else
+                auto pair = fFunctionCostMap.insert({decl, kUnknownCost});
+                auto iter = pair.first;
+                bool wasInserted = pair.second;
+#endif
                 if (!wasInserted) {
                     // We already have this function in our map. We don't need to check it again.
                     if (iter->second == kUnknownCost) {
diff --git a/third_party/skia_next/third_party/skia/src/sksl/codegen/SkSLMetalCodeGenerator.cpp b/third_party/skia_next/third_party/skia/src/sksl/codegen/SkSLMetalCodeGenerator.cpp
index 15c5076..1ea8ac3 100644
--- a/third_party/skia_next/third_party/skia/src/sksl/codegen/SkSLMetalCodeGenerator.cpp
+++ b/third_party/skia_next/third_party/skia/src/sksl/codegen/SkSLMetalCodeGenerator.cpp
@@ -239,7 +239,11 @@
             this->write("&");
         }
         if (outVars[index]) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [iter, didInsert] = writtenVars.insert(outVars[index]->variable());
+#else
+            STRUCTURED_BINDING_2(iter, didInsert, writtenVars.insert(outVars[index]->variable()));
+#endif
             if (didInsert) {
                 this->write(" ");
                 fIgnoreVariableReferenceModifiers = true;
@@ -452,7 +456,11 @@
         if (type.isMatrix() && type.rows() == type.columns()) {
             // Inject the correct polyfill based on the matrix size.
             auto name = String::printf("mat%d_inverse", type.columns());
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
             auto [iter, didInsert] = fWrittenIntrinsics.insert(name);
+#else
+            STRUCTURED_BINDING_2(iter, didInsert, fWrittenIntrinsics.insert(name));
+#endif
             if (didInsert) {
                 switch (type.rows()) {
                     case 2:
@@ -1043,7 +1051,11 @@
     }
 
     // If a helper-method has already been synthesized, we don't need to synthesize it again.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, newlyCreated] = fHelpers.insert(name);
+#else
+    STRUCTURED_BINDING_2(iter, newlyCreated, fHelpers.insert(name));
+#endif
     if (!newlyCreated) {
         return name;
     }
@@ -1146,7 +1158,11 @@
     String outTypeName = this->typeName(outType);
 
     String name = "array_of_" + outTypeName + "_from_" + inTypeName;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, didInsert] = fHelpers.insert(name);
+#else
+    STRUCTURED_BINDING_2(iter, didInsert, fHelpers.insert(name));
+#endif
     if (didInsert) {
         fExtraFunctions.printf(R"(
 template <size_t N>
@@ -1388,7 +1404,11 @@
 
     String key = "Matrix *= " + this->typeName(left) + ":" + this->typeName(right);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, wasInserted] = fHelpers.insert(key);
+#else
+    STRUCTURED_BINDING_2(iter, wasInserted, fHelpers.insert(key));
+#endif
     if (wasInserted) {
         fExtraFunctions.printf("thread %s& operator*=(thread %s& left, thread const %s& right) {\n"
                                "    left = left * right;\n"
@@ -1407,7 +1427,11 @@
 
     String key = "Matrix == " + this->typeName(left) + ":" + this->typeName(right);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, wasInserted] = fHelpers.insert(key);
+#else
+    STRUCTURED_BINDING_2(iter, wasInserted, fHelpers.insert(key));
+#endif
     if (wasInserted) {
         fExtraFunctionPrototypes.printf(R"(
 thread bool operator==(const %s left, const %s right);
@@ -1444,7 +1468,11 @@
 
     String key = "Matrix / " + this->typeName(type);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, wasInserted] = fHelpers.insert(key);
+#else
+    STRUCTURED_BINDING_2(iter, wasInserted, fHelpers.insert(key));
+#endif
     if (wasInserted) {
         String typeName = this->typeName(type);
 
@@ -1475,7 +1503,11 @@
     // If the array's component type needs a helper as well, we need to emit that one first.
     this->writeEqualityHelpers(type.componentType(), type.componentType());
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, wasInserted] = fHelpers.insert("ArrayEquality []");
+#else
+    STRUCTURED_BINDING_2(iter, wasInserted, fHelpers.insert("ArrayEquality []"));
+#endif
     if (wasInserted) {
         fExtraFunctionPrototypes.writeText(R"(
 template <typename T1, typename T2, size_t N>
@@ -1506,7 +1538,11 @@
     SkASSERT(type.isStruct());
     String key = "StructEquality " + this->typeName(type);
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, wasInserted] = fHelpers.insert(key);
+#else
+    STRUCTURED_BINDING_2(iter, wasInserted, fHelpers.insert(key));
+#endif
     if (wasInserted) {
         // If one of the struct's fields needs a helper as well, we need to emit that one first.
         for (const Type::Field& field : type.fields()) {
@@ -2391,7 +2427,13 @@
 
 void MetalCodeGenerator::visitGlobalStruct(GlobalStructVisitor* visitor) {
     // Visit the interface blocks.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (const auto& [interfaceType, interfaceName] : fInterfaceBlockNameMap) {
+#else
+    for (const auto& item : fInterfaceBlockNameMap) {
+        auto& interfaceType = item.first;
+        auto& interfaceName = item.second;
+#endif
         visitor->visitInterfaceBlock(*interfaceType, interfaceName);
     }
     for (const ProgramElement* element : fProgram.elements()) {
diff --git a/third_party/skia_next/third_party/skia/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp b/third_party/skia_next/third_party/skia/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
index cc06da0..f617222 100644
--- a/third_party/skia_next/third_party/skia/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
+++ b/third_party/skia_next/third_party/skia/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
@@ -1301,7 +1301,11 @@
     }
 
     // Check to see if we've already synthesized this vector constant.
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, newlyCreated] = fVectorConstants.insert({key, (SpvId)-1});
+#else
+    STRUCTURED_BINDING_2(iter, newlyCreated, fVectorConstants.insert({key, (SpvId)-1}));
+#endif
     if (newlyCreated) {
         // Emit an OpConstantComposite instruction for this constant.
         SpvId result = this->nextId(&type);
@@ -2916,7 +2920,11 @@
     }
 
     SPIRVNumberConstant key{valueBits, l.type().numberKind()};
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     auto [iter, newlyCreated] = fNumberConstants.insert({key, (SpvId)-1});
+#else
+    STRUCTURED_BINDING_2(iter, newlyCreated, fNumberConstants.insert({key, (SpvId)-1}));
+#endif
     if (newlyCreated) {
         SpvId result = this->nextId(nullptr);
         iter->second = result;
diff --git a/third_party/skia_next/third_party/skia/src/sksl/transform/SkSLEliminateDeadLocalVariables.cpp b/third_party/skia_next/third_party/skia/src/sksl/transform/SkSLEliminateDeadLocalVariables.cpp
index 2acc668..3ce305a 100644
--- a/third_party/skia_next/third_party/skia/src/sksl/transform/SkSLEliminateDeadLocalVariables.cpp
+++ b/third_party/skia_next/third_party/skia/src/sksl/transform/SkSLEliminateDeadLocalVariables.cpp
@@ -79,7 +79,13 @@
     DeadLocalVariableEliminator visitor{*program.fContext, usage};
 
     if (program.fConfig->fSettings.fRemoveDeadVariables) {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         for (auto& [var, counts] : usage->fVariableCounts) {
+#else
+        for (auto& item : usage->fVariableCounts) {
+            auto& var = item.first;
+            auto& counts = item.second;
+#endif
             if (DeadLocalVariableEliminator::CanEliminate(var, counts)) {
                 // This program contains at least one dead local variable.
                 // Scan the program for any dead local variables and eliminate them all.
diff --git a/third_party/skia_next/third_party/skia/src/utils/SkCanvasStateUtils.cpp b/third_party/skia_next/third_party/skia/src/utils/SkCanvasStateUtils.cpp
index a30829f..7b20dd5 100644
--- a/third_party/skia_next/third_party/skia/src/utils/SkCanvasStateUtils.cpp
+++ b/third_party/skia_next/third_party/skia/src/utils/SkCanvasStateUtils.cpp
@@ -203,13 +203,14 @@
     layerState->height = pmap.height();
 
     switch (pmap.colorType()) {
-        case kN32_SkColorType:
-            layerState->raster.config = kARGB_8888_RasterConfig;
-            break;
         case kRGB_565_SkColorType:
             layerState->raster.config = kRGB_565_RasterConfig;
             break;
         default:
+            if (pmap.colorType() == kN32_SkColorType) {
+                layerState->raster.config = kARGB_8888_RasterConfig;
+                break;
+            }
             return nullptr;
     }
     layerState->raster.rowBytes = pmap.rowBytes();
diff --git a/third_party/skia_next/third_party/skia/src/utils/SkCustomTypeface.cpp b/third_party/skia_next/third_party/skia/src/utils/SkCustomTypeface.cpp
index 4c69f34..60a6d82 100644
--- a/third_party/skia_next/third_party/skia/src/utils/SkCustomTypeface.cpp
+++ b/third_party/skia_next/third_party/skia/src/utils/SkCustomTypeface.cpp
@@ -225,7 +225,11 @@
     }
 
     void generateFontMetrics(SkFontMetrics* metrics) override {
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
         auto [sx, sy] = fMatrix.mapXY(1, 1);
+#else
+        STRUCTURED_BINDING_2(sx, sy, fMatrix.mapXY(1, 1));
+#endif
         *metrics = scale_fontmetrics(this->userTF()->fMetrics, sx, sy);
     }
 
@@ -260,7 +264,12 @@
 static void compress_write(SkWStream* stream, const SkPath& path, int upem) {
     int pCount = 0;
     std::vector<PVerb> verbs;
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [v, p, w] : SkPathPriv::Iterate(path)) {
+#else
+    for (auto item : SkPathPriv::Iterate(path)) {
+        STRUCTURED_BINDING_3(v, p, w, std::move(item));
+#endif
         switch (v) {
             default: break;
             case SkPathVerb::kMove: verbs.push_back(kMove); pCount += 1; break;
@@ -299,7 +308,12 @@
         }
     };
 
+#ifndef SKIA_STRUCTURED_BINDINGS_BACKPORT
     for (auto [v, p, w] : SkPathPriv::Iterate(path)) {
+#else
+    for (auto item : SkPathPriv::Iterate(path)) {
+        STRUCTURED_BINDING_3(v, p, w, std::move(item));
+#endif
         switch (v) {
             default: break;
             case SkPathVerb::kMove: write_pts(&p[0], 1); break;
diff --git a/third_party/skia_next/third_party/skia/tests/BitmapCopyTest.cpp b/third_party/skia_next/third_party/skia/tests/BitmapCopyTest.cpp
index 88c39bf..4b49ac1 100644
--- a/third_party/skia_next/third_party/skia/tests/BitmapCopyTest.cpp
+++ b/third_party/skia_next/third_party/skia/tests/BitmapCopyTest.cpp
@@ -56,7 +56,7 @@
     }
 };
 
-static const Pair gPairs[] = {
+static constexpr Pair gPairs[] = {
     { kUnknown_SkColorType,     "0000000"  },
     { kAlpha_8_SkColorType,     "0100000"  },
     { kRGB_565_SkColorType,     "0101011"  },
diff --git a/third_party/skia_next/third_party/skia/tests/BitmapGetColorTest.cpp b/third_party/skia_next/third_party/skia/tests/BitmapGetColorTest.cpp
index c27cb2f..a3be0e0 100644
--- a/third_party/skia_next/third_party/skia/tests/BitmapGetColorTest.cpp
+++ b/third_party/skia_next/third_party/skia/tests/BitmapGetColorTest.cpp
@@ -13,7 +13,7 @@
 #include "tests/Test.h"
 
 DEF_TEST(GetColor, reporter) {
-    static const struct Rec {
+    static constexpr struct Rec {
         SkColorType fColorType;
         SkColor     fInColor;
         SkColor     fOutColor;
diff --git a/third_party/skia_next/third_party/skia/tests/ImageGeneratorTest.cpp b/third_party/skia_next/third_party/skia/tests/ImageGeneratorTest.cpp
index 8e6d5ae..1d5aea7 100644
--- a/third_party/skia_next/third_party/skia/tests/ImageGeneratorTest.cpp
+++ b/third_party/skia_next/third_party/skia/tests/ImageGeneratorTest.cpp
@@ -91,7 +91,7 @@
 }
 
 DEF_TEST(PictureImageGenerator, reporter) {
-    const struct {
+    constexpr struct {
         SkColorType fColorType;
         SkAlphaType fAlphaType;
     } recs[] = {
diff --git a/third_party/skia_next/third_party/skia/third_party/skcms/BUILD.gn b/third_party/skia_next/third_party/skia/third_party/skcms/BUILD.gn
new file mode 100644
index 0000000..91e75c7
--- /dev/null
+++ b/third_party/skia_next/third_party/skia/third_party/skcms/BUILD.gn
@@ -0,0 +1,23 @@
+# Copyright 2022 The Cobalt Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+static_library("skcms") {
+  sources = [ "skcms.cc" ]
+
+  include_dirs = [ "../../include/third_party/skcms" ]
+
+  # Starboard doesn't have APIs for vector registers.
+  # Use portable code instead.
+  defines = [ "SKCMS_PORTABLE" ]
+}
diff --git a/third_party/skia_next/third_party/skia/tools/skiaserve/Request.cpp b/third_party/skia_next/third_party/skia/tools/skiaserve/Request.cpp
index bc336ab..4bb5b26 100644
--- a/third_party/skia_next/third_party/skia/tools/skiaserve/Request.cpp
+++ b/third_party/skia_next/third_party/skia/tools/skiaserve/Request.cpp
@@ -132,7 +132,7 @@
     bool fSRGB;
 };
 
-ColorAndProfile ColorModes[] = {
+constexpr ColorAndProfile ColorModes[] = {
     { kN32_SkColorType,      false },
     { kN32_SkColorType,       true },
     { kRGBA_F16_SkColorType,  true },
diff --git a/third_party/v8/BUILD.gn b/third_party/v8/BUILD.gn
index cf83f99..e798d17 100644
--- a/third_party/v8/BUILD.gn
+++ b/third_party/v8/BUILD.gn
@@ -24,7 +24,7 @@
                       (current_cpu != v8_current_cpu && v8_multi_arch_build)
 
 # For faster Windows builds. See https://crbug.com/v8/8475.
-emit_builtins_as_inline_asm = is_win && is_clang
+emit_builtins_as_inline_asm = is_win && is_clang || cobalt_v8_emit_builtins_as_inline_asm
 
 declare_args() {
   # Print to stdout on Android.
@@ -316,7 +316,7 @@
 }
 if (v8_enable_pointer_compression == "") {
   v8_enable_pointer_compression =
-      v8_current_cpu == "arm64" || v8_current_cpu == "x64"
+      (v8_current_cpu == "arm64" || v8_current_cpu == "x64") && v8_enable_pointer_compression_override
 }
 if (v8_enable_fast_torque == "") {
   v8_enable_fast_torque = v8_enable_fast_mksnapshot
diff --git a/third_party/v8/__init__.py b/third_party/v8/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/third_party/v8/__init__.py
+++ /dev/null
diff --git a/third_party/v8/features.gypi b/third_party/v8/features.gypi
deleted file mode 100644
index 287d385..0000000
--- a/third_party/v8/features.gypi
+++ /dev/null
@@ -1,184 +0,0 @@
-# Copyright 2013 the V8 project 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.
-
-# Compile time controlled V8 features.
-
-{
-  'variables': {
-    'variables': {
-      'v8_target_arch%': '<(target_arch)',
-    },
-
-    # Allows the embedder to add a custom suffix to the version string.
-    'v8_embedder_string%': '',
-
-    'v8_enable_disassembler%': 0,
-
-    'v8_promise_internal_field_count%': 0,
-
-    'v8_enable_gdbjit%': 0,
-
-    'v8_enable_verify_csa%': 0,
-
-    'v8_object_print%': 0,
-
-    'v8_enable_verify_heap%': 0,
-
-    'v8_trace_maps%': 0,
-
-    # Enable the snapshot feature, for fast context creation.
-    # http://v8project.blogspot.com/2015/09/custom-startup-snapshots.html
-    'v8_use_snapshot%': 'true',
-
-    'v8_enable_verify_predictable%': 0,
-
-    # With post mortem support enabled, metadata is embedded into libv8 that
-    # describes various parameters of the VM for use by debuggers. See
-    # tools/gen-postmortem-metadata.py for details.
-    'v8_postmortem_support%': 'false',
-
-    # Interpreted regexp engine exists as platform-independent alternative
-    # based where the regular expression is compiled to a bytecode.
-    'v8_interpreted_regexp%': 0,
-
-    # Enable ECMAScript Internationalization API. Enabling this feature will
-    # add a dependency on the ICU library.
-    'v8_enable_i18n_support%': 1,
-
-    # Enable compiler warnings when using V8_DEPRECATED apis.
-    'v8_deprecation_warnings%': 0,
-
-    # Enable compiler warnings when using V8_DEPRECATE_SOON apis.
-    'v8_imminent_deprecation_warnings%': 0,
-
-    # Set to 1 to enable DCHECKs in release builds.
-    'dcheck_always_on%': 0,
-
-    # Enable/disable JavaScript API accessors.
-    'v8_js_accessors%': 0,
-
-    # Temporary flag to allow embedders to update their microtasks scopes.
-    'v8_check_microtasks_scopes_consistency%': 'false',
-
-    # Enable concurrent marking.
-    'v8_enable_concurrent_marking%': 1,
-
-    # Enables various testing features.
-    'v8_enable_test_features%': 0,
-
-    # Controls the threshold for on-heap/off-heap Typed Arrays.
-    'v8_typed_array_max_size_in_heap%': 64,
-
-    # Cobalt added.
-    'v8_enable_handle_zapping': 0,  # zapping is disabled in V8 8.8
-  },
-  'target_defaults': {
-    'conditions': [
-      ['v8_embedder_string!=""', {
-        'defines': ['V8_EMBEDDER_STRING="<(v8_embedder_string)"',],
-      }],
-      ['v8_enable_disassembler==1', {
-        'defines': ['ENABLE_DISASSEMBLER',],
-      }],
-      ['v8_promise_internal_field_count!=0', {
-        'defines': ['V8_PROMISE_INTERNAL_FIELD_COUNT','v8_promise_internal_field_count'],
-      }],
-      ['v8_enable_gdbjit==1', {
-        'defines': ['ENABLE_GDB_JIT_INTERFACE',],
-      }],
-      ['v8_enable_verify_csa==1', {
-        'defines': ['ENABLE_VERIFY_CSA',],
-      }],
-      ['v8_object_print==1', {
-        'defines': ['OBJECT_PRINT',],
-      }],
-      ['v8_enable_verify_heap==1', {
-        'defines': ['VERIFY_HEAP',],
-      }],
-      ['v8_trace_maps==1', {
-        'defines': ['V8_TRACE_MAPS',],
-      }],
-      ['v8_enable_test_features==1', {
-        'defines': ['V8_ENABLE_ALLOCATION_TIMEOUT', 'V8_ENABLE_FORCE_SLOW_PATH'],
-      }],
-      ['v8_enable_verify_predictable==1', {
-        'defines': ['VERIFY_PREDICTABLE',],
-      }],
-      ['v8_interpreted_regexp==1', {
-        'defines': ['V8_INTERPRETED_REGEXP',],
-      }],
-      ['v8_deprecation_warnings==1', {
-        'defines': ['V8_DEPRECATION_WARNINGS',],
-      }],
-      ['v8_imminent_deprecation_warnings==1', {
-        'defines': ['V8_IMMINENT_DEPRECATION_WARNINGS',],
-      }],
-      ['v8_enable_i18n_support==1', {
-        'defines': ['V8_INTL_SUPPORT',],
-      }],
-      ['v8_use_snapshot=="true" and v8_use_external_startup_data==1', {
-        'defines': ['V8_USE_EXTERNAL_STARTUP_DATA',],
-      }],
-      ['dcheck_always_on!=0', {
-        'defines': ['DEBUG',],
-      }],
-      ['v8_check_microtasks_scopes_consistency=="true"', {
-        'defines': ['V8_CHECK_MICROTASKS_SCOPES_CONSISTENCY',],
-      }],
-      ['v8_enable_concurrent_marking==1', {
-        'defines': ['V8_CONCURRENT_MARKING',],
-      }],
-    ],  # conditions
-    'configurations': {
-      'DebugBaseCommon': {
-        'abstract': 1,
-        'variables': {
-          'v8_enable_handle_zapping%': 1,
-        },
-        'conditions': [
-          ['v8_enable_handle_zapping==1', {
-            'defines': ['ENABLE_HANDLE_ZAPPING',],
-          }],
-        ],
-      },  # Debug
-      'Release': {
-        'variables': {
-          'v8_enable_handle_zapping%': 0,
-        },
-        'conditions': [
-          ['v8_enable_handle_zapping==1', {
-            'defines': ['ENABLE_HANDLE_ZAPPING',],
-          }],
-        ],  # conditions
-      },  # Release
-    },  # configurations
-    'defines': [
-      'V8_GYP_BUILD',
-      'V8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=<(v8_typed_array_max_size_in_heap)',
-    ],  # defines
-  },  # target_defaults
-}
diff --git a/third_party/v8/gypfiles/ForEachFormat.py b/third_party/v8/gypfiles/ForEachFormat.py
deleted file mode 100644
index 3015cb8..0000000
--- a/third_party/v8/gypfiles/ForEachFormat.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright (c) 2019 Refael Ackeramnn<refack@gmail.com>. All rights reserved.
-# Use of this source code is governed by an MIT-style license.
-def DoMain(args):
-  format_str = args.pop(0)
-  return ' '.join(format_str % a for a in args)
diff --git a/third_party/v8/gypfiles/ForEachReplace.py b/third_party/v8/gypfiles/ForEachReplace.py
deleted file mode 100644
index 730487a..0000000
--- a/third_party/v8/gypfiles/ForEachReplace.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright (c) 2019 Ujjwal Sharma <usharma1998@gmail>. All rights reserved.
-# Use of this source code is governed by an MIT-style license.
-
-def DoMain(args):
-  old = args.pop(0)
-  new = args.pop(0)
-  return ' '.join(a.replace(old, new) for a in args)
diff --git a/third_party/v8/gypfiles/GN-scraper.py b/third_party/v8/gypfiles/GN-scraper.py
deleted file mode 100644
index ec72f1d..0000000
--- a/third_party/v8/gypfiles/GN-scraper.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (c) 2019 Refael Ackeramnn<refack@gmail.com>. All rights reserved.
-# Use of this source code is governed by an MIT-style license.
-import re
-import os
-
-PLAIN_SOURCE_RE = re.compile('\s*"([^/$].+)"\s*')
-def DoMain(args):
-  gn_filename, pattern = args
-  src_root = os.path.dirname(gn_filename)
-  with open(gn_filename, 'rb') as gn_file:
-    gn_content = gn_file.read().decode('utf-8')
-
-  scraper_re = re.compile(pattern + r'\[([^\]]+)', re.DOTALL)
-  matches = scraper_re.search(gn_content)
-  match = matches.group(1)
-  files = []
-  for l in match.splitlines():
-    m2 = PLAIN_SOURCE_RE.match(l)
-    if not m2:
-      continue
-    files.append(m2.group(1))
-  # always use `/` since GYP will process paths further downstream
-  rel_files = ['"%s/%s"' % (src_root, f) for f in files]
-  return ' '.join(rel_files)
diff --git a/third_party/v8/gypfiles/OWNERS b/third_party/v8/gypfiles/OWNERS
deleted file mode 100644
index 0e56af3..0000000
--- a/third_party/v8/gypfiles/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-machenbach@chromium.org
diff --git a/third_party/v8/gypfiles/README.txt b/third_party/v8/gypfiles/README.txt
deleted file mode 100644
index 5f242ad..0000000
--- a/third_party/v8/gypfiles/README.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-For build instructions, please refer to:
-
-https://code.google.com/p/v8/wiki/BuildingWithGYP
-
-TL;DR version on *nix:
-$ make dependencies        # Only needed once.
-$ make ia32.release -j8
-$ make ia32.release.check  # Optionally: run tests.
-
diff --git a/third_party/v8/gypfiles/__init__.py b/third_party/v8/gypfiles/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/third_party/v8/gypfiles/__init__.py
+++ /dev/null
diff --git a/third_party/v8/gypfiles/_env.py b/third_party/v8/gypfiles/_env.py
deleted file mode 100644
index 021908e..0000000
--- a/third_party/v8/gypfiles/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 The Cobalt Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/third_party/v8/gypfiles/all.gyp b/third_party/v8/gypfiles/all.gyp
deleted file mode 100644
index 2f9cf85..0000000
--- a/third_party/v8/gypfiles/all.gyp
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2011 the V8 project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'targets': [
-    {
-      'target_name': 'All',
-      'type': 'none',
-      'dependencies': [
-        '../src/d8.gyp:d8',
-        '../test/inspector/inspector.gyp:*',
-        '../test/mkgrokdump/mkgrokdump.gyp:*',
-      ],
-      'conditions': [
-        ['component!="shared_library"', {
-          'dependencies': [
-            '../tools/parser-shell.gyp:parser-shell',
-          ],
-        }],
-        # These items don't compile for Android on Mac.
-        ['host_os!="mac" or OS!="android"', {
-          'dependencies': [
-            '../samples/samples.gyp:*',
-            '../test/cctest/cctest.gyp:*',
-            '../test/fuzzer/fuzzer.gyp:*',
-            '../test/unittests/unittests.gyp:*',
-          ],
-        }],
-        ['test_isolation_mode != "noop"', {
-          'dependencies': [
-            '../test/bot_default.gyp:*',
-            '../test/benchmarks/benchmarks.gyp:*',
-            '../test/debugger/debugger.gyp:*',
-            '../test/default.gyp:*',
-            '../test/d8_default.gyp:*',
-            '../test/intl/intl.gyp:*',
-            '../test/message/message.gyp:*',
-            '../test/mjsunit/mjsunit.gyp:*',
-            '../test/mozilla/mozilla.gyp:*',
-            '../test/optimize_for_size.gyp:*',
-            '../test/perf.gyp:*',
-            '../test/preparser/preparser.gyp:*',
-            '../test/test262/test262.gyp:*',
-            '../test/webkit/webkit.gyp:*',
-            '../tools/check-static-initializers.gyp:*',
-            '../tools/gcmole/run_gcmole.gyp:*',
-            '../tools/jsfunfuzz/jsfunfuzz.gyp:*',
-            '../tools/run-deopt-fuzzer.gyp:*',
-            '../tools/run-num-fuzzer.gyp:*',
-          ],
-        }],
-      ]
-    }
-  ]
-}
diff --git a/third_party/v8/gypfiles/coverage_wrapper.py b/third_party/v8/gypfiles/coverage_wrapper.py
deleted file mode 100755
index d5fdee4..0000000
--- a/third_party/v8/gypfiles/coverage_wrapper.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 the V8 project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# CC/CXX wrapper script that excludes certain file patterns from coverage
-# instrumentation.
-
-import re
-import subprocess
-import sys
-
-exclusions = [
-  'buildtools',
-  'src/third_party',
-  'third_party',
-  'test',
-  'testing',
-]
-
-def remove_if_exists(string_list, item):
-  if item in string_list:
-    string_list.remove(item)
-
-args = sys.argv[1:]
-text = ' '.join(sys.argv[2:])
-for exclusion in exclusions:
-  if re.search(r'\-o obj/%s[^ ]*\.o' % exclusion, text):
-    remove_if_exists(args, '-fprofile-arcs')
-    remove_if_exists(args, '-ftest-coverage')
-    remove_if_exists(args, '-fsanitize-coverage=func')
-    remove_if_exists(args, '-fsanitize-coverage=bb')
-    remove_if_exists(args, '-fsanitize-coverage=edge')
-    remove_if_exists(args, '-fsanitize-coverage=trace-pc-guard')
-    remove_if_exists(args, '-fsanitize-coverage=bb,trace-pc-guard')
-    break
-
-sys.exit(subprocess.check_call(args))
diff --git a/third_party/v8/gypfiles/detect_v8_host_arch.py b/third_party/v8/gypfiles/detect_v8_host_arch.py
deleted file mode 100644
index 0545533..0000000
--- a/third_party/v8/gypfiles/detect_v8_host_arch.py
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 the V8 project 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.
-
-"""Outputs host CPU architecture in format recognized by gyp."""
-
-import platform
-import re
-import sys
-
-
-def main():
-  print DoMain([])
-  return 0
-
-def DoMain(_):
-  """Hook to be called from gyp without starting a separate python
-  interpreter."""
-  host_arch = platform.machine()
-  host_system = platform.system();
-
-  # Convert machine type to format recognized by gyp.
-  if re.match(r'i.86', host_arch) or host_arch == 'i86pc':
-    host_arch = 'x86'
-  elif host_arch in ['x86_64', 'amd64']:
-    host_arch = 'x64'
-  elif host_arch.startswith('arm'):
-    host_arch = 'arm'
-  elif host_arch == 'aarch64':
-    host_arch = 'arm64'
-  elif host_arch == 'mips64':
-    host_arch = 'mips64el'
-  elif host_arch.startswith('mips'):
-    host_arch = 'mipsel'
-
-  # Under AIX the value returned by platform.machine is not
-  # the best indicator of the host architecture
-  # AIX 6.1 which is the lowest level supported only provides
-  # a 64 bit kernel
-  if host_system == 'AIX':
-    host_arch = 'ppc64'
-
-  # platform.machine is based on running kernel. It's possible to use 64-bit
-  # kernel with 32-bit userland, e.g. to give linker slightly more memory.
-  # Distinguish between different userland bitness by querying
-  # the python binary.
-  if host_arch == 'x64' and platform.architecture()[0] == '32bit':
-    host_arch = 'x86'
-
-  return host_arch
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/v8/gypfiles/extras-libraries.cc b/third_party/v8/gypfiles/extras-libraries.cc
deleted file mode 100644
index 9044930..0000000
--- a/third_party/v8/gypfiles/extras-libraries.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-
-// This file was generated from .js source files by GYP.  If you
-// want to make changes to this file you should either change the
-// javascript source files or the GYP script.
-
-#include "src/init/v8.h"
-#include "src/snapshot/natives.h"
-#include "src/utils/utils.h"
-
-namespace v8 {
-namespace internal {
-
-  static const char sources[] = { 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 125, 41 };
-
-  template <>
-  int NativesCollection<EXTRAS>::GetBuiltinsCount() {
-    return 1;
-  }
-
-  template <>
-  int NativesCollection<EXTRAS>::GetIndex(const char* name) {
-    if (strcmp(name, "dummy") == 0) return 0;
-    return -1;
-  }
-
-  template <>
-  Vector<const char> NativesCollection<EXTRAS>::GetScriptSource(int index) {
-    if (index == 0) return Vector<const char>(sources + 0, 15);
-    return Vector<const char>("", 0);
-  }
-
-  template <>
-  Vector<const char> NativesCollection<EXTRAS>::GetScriptName(int index) {
-    if (index == 0) return Vector<const char>("native dummy.js", 15);
-    return Vector<const char>("", 0);
-  }
-
-  template <>
-  Vector<const char> NativesCollection<EXTRAS>::GetScriptsSource() {
-    return Vector<const char>(sources, 15);
-  }
-}  // internal
-}  // v8
diff --git a/third_party/v8/gypfiles/get_landmines.py b/third_party/v8/gypfiles/get_landmines.py
deleted file mode 100755
index 6137648..0000000
--- a/third_party/v8/gypfiles/get_landmines.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 the V8 project 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 emits the list of reasons why a particular build needs to be clobbered
-(or a list of 'landmines').
-"""
-
-import sys
-
-
-def main():
-  """
-  ALL LANDMINES ARE EMITTED FROM HERE.
-  """
-  print 'Need to clobber after ICU52 roll.'
-  print 'Landmines test.'
-  print 'Activating MSVS 2013.'
-  print 'Revert activation of MSVS 2013.'
-  print 'Activating MSVS 2013 again.'
-  print 'Clobber after ICU roll.'
-  print 'Moar clobbering...'
-  print 'Remove build/android.gypi'
-  print 'Cleanup after windows ninja switch attempt.'
-  print 'Switching to pinned msvs toolchain.'
-  print 'Clobbering to hopefully resolve problem with mksnapshot'
-  print 'Clobber after ICU roll.'
-  print 'Clobber after Android NDK update.'
-  print 'Clober to fix windows build problems.'
-  print 'Clober again to fix windows build problems.'
-  print 'Clobber to possibly resolve failure on win-32 bot.'
-  print 'Clobber for http://crbug.com/668958.'
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/v8/gypfiles/gyp_environment.py b/third_party/v8/gypfiles/gyp_environment.py
deleted file mode 100644
index fe6b51f..0000000
--- a/third_party/v8/gypfiles/gyp_environment.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2015 the V8 project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Sets up various automatic gyp environment variables. These are used by
-gyp_v8 and landmines.py which run at different stages of runhooks. To
-make sure settings are consistent between them, all setup should happen here.
-"""
-
-import os
-import sys
-
-SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
-V8_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir))
-
-
-def apply_gyp_environment(file_path=None):
-  """
-  Reads in a *.gyp_env file and applies the valid keys to os.environ.
-  """
-  if not file_path or not os.path.exists(file_path):
-    return
-  file_contents = open(file_path).read()
-  try:
-    file_data = eval(file_contents, {'__builtins__': None}, None)
-  except SyntaxError, e:
-    e.filename = os.path.abspath(file_path)
-    raise
-  supported_vars = ( 'V8_GYP_FILE',
-                     'V8_GYP_SYNTAX_CHECK',
-                     'GYP_DEFINES',
-                     'GYP_GENERATORS',
-                     'GYP_GENERATOR_FLAGS',
-                     'GYP_GENERATOR_OUTPUT', )
-  for var in supported_vars:
-    val = file_data.get(var)
-    if val:
-      if var in os.environ:
-        print 'INFO: Environment value for "%s" overrides value in %s.' % (
-            var, os.path.abspath(file_path)
-        )
-      else:
-        os.environ[var] = val
-
-
-def set_environment():
-  """Sets defaults for GYP_* variables."""
-
-  if 'SKIP_V8_GYP_ENV' not in os.environ:
-    # Update the environment based on v8.gyp_env
-    gyp_env_path = os.path.join(os.path.dirname(V8_ROOT), 'v8.gyp_env')
-    apply_gyp_environment(gyp_env_path)
-
-    if not os.environ.get('GYP_GENERATORS'):
-      # Default to ninja on all platforms.
-      os.environ['GYP_GENERATORS'] = 'ninja'
diff --git a/third_party/v8/gypfiles/gyp_v8.py b/third_party/v8/gypfiles/gyp_v8.py
deleted file mode 100644
index 462ee67..0000000
--- a/third_party/v8/gypfiles/gyp_v8.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2013 the V8 project 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.
-
-# This file is (possibly, depending on python version) imported by
-# gyp_v8 when GYP_PARALLEL=1 and it creates sub-processes through the
-# multiprocessing library.
-
-# Importing in Python 2.6 (fixed in 2.7) on Windows doesn't search for imports
-# that don't end in .py (and aren't directories with an __init__.py). This
-# wrapper makes "import gyp_v8" work with those old versions and makes it
-# possible to execute gyp_v8.py directly on Windows where the extension is
-# useful.
-
-import os
-
-path = os.path.abspath(os.path.split(__file__)[0])
-execfile(os.path.join(path, 'gyp_v8'))
diff --git a/third_party/v8/gypfiles/isolate.gypi b/third_party/v8/gypfiles/isolate.gypi
deleted file mode 100644
index 3e85b53..0000000
--- a/third_party/v8/gypfiles/isolate.gypi
+++ /dev/null
@@ -1,100 +0,0 @@
-# Copyright 2015 the V8 project authors. All rights reserved.
-# 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 is meant to be included into a target to provide a rule
-# to "build" .isolate files into a .isolated file.
-#
-# To use this, create a gyp target with the following form:
-# 'conditions': [
-#   ['test_isolation_mode != "noop"', {
-#     'targets': [
-#       {
-#         'target_name': 'foo_test_run',
-#         'type': 'none',
-#         'dependencies': [
-#           'foo_test',
-#         ],
-#         'includes': [
-#           '../gypfiles/isolate.gypi',
-#         ],
-#         'sources': [
-#           'foo_test.isolate',
-#         ],
-#       },
-#     ],
-#   }],
-# ],
-#
-# Note: foo_test.isolate is included and a source file. It is an inherent
-# property of the .isolate format. This permits to define GYP variables but is
-# a stricter format than GYP so isolate.py can read it.
-#
-# The generated .isolated file will be:
-#   <(PRODUCT_DIR)/foo_test.isolated
-#
-# See http://dev.chromium.org/developers/testing/isolated-testing/for-swes
-# for more information.
-
-{
-  'rules': [
-    {
-      'rule_name': 'isolate',
-      'extension': 'isolate',
-      'inputs': [
-        # Files that are known to be involved in this step.
-        '<(DEPTH)/tools/isolate_driver.py',
-        '<(DEPTH)/tools/swarming_client/isolate.py',
-        '<(DEPTH)/tools/swarming_client/run_isolated.py',
-      ],
-      'outputs': [
-        '<(PRODUCT_DIR)/<(RULE_INPUT_ROOT).isolated',
-      ],
-      'action': [
-        'python',
-        '<(DEPTH)/tools/isolate_driver.py',
-        '<(test_isolation_mode)',
-        '--isolated', '<(PRODUCT_DIR)/<(RULE_INPUT_ROOT).isolated',
-        '--isolate', '<(RULE_INPUT_PATH)',
-
-        # Variables should use the -V FOO=<(FOO) form so frequent values,
-        # like '0' or '1', aren't stripped out by GYP. Run 'isolate.py help'
-        # for more details.
-
-        # Path variables are used to replace file paths when loading a .isolate
-        # file
-        '--path-variable', 'DEPTH', '<(DEPTH)',
-        '--path-variable', 'PRODUCT_DIR', '<(PRODUCT_DIR)',
-
-        '--config-variable', 'CONFIGURATION_NAME=<(CONFIGURATION_NAME)',
-        '--config-variable', 'OS=<(OS)',
-        '--config-variable', 'asan=<(asan)',
-        '--config-variable', 'cfi_vptr=<(cfi_vptr)',
-        '--config-variable', 'gcmole=<(gcmole)',
-        '--config-variable', 'has_valgrind=<(has_valgrind)',
-        '--config-variable', 'icu_use_data_file_flag=<(icu_use_data_file_flag)',
-        '--config-variable', 'msan=<(msan)',
-        '--config-variable', 'tsan=<(tsan)',
-        '--config-variable', 'coverage=<(coverage)',
-        '--config-variable', 'sanitizer_coverage=<(sanitizer_coverage)',
-        '--config-variable', 'component=<(component)',
-        '--config-variable', 'target_arch=<(target_arch)',
-        '--config-variable', 'ubsan_vptr=0',
-        '--config-variable', 'v8_use_external_startup_data=<(v8_use_external_startup_data)',
-        '--config-variable', 'v8_use_snapshot=<(v8_use_snapshot)',
-      ],
-      'conditions': [
-        ['OS=="win"', {
-          'action': [
-            '--config-variable', 'msvs_version=2013',
-          ],
-        }, {
-          'action': [
-            '--config-variable', 'msvs_version=0',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/third_party/v8/gypfiles/landmine_utils.py b/third_party/v8/gypfiles/landmine_utils.py
deleted file mode 100644
index 8bdc2b6..0000000
--- a/third_party/v8/gypfiles/landmine_utils.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright 2014 the V8 project 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 functools
-import logging
-import os
-import shlex
-import sys
-
-
-def memoize(default=None):
-  """This decorator caches the return value of a parameterless pure function"""
-  def memoizer(func):
-    val = []
-    @functools.wraps(func)
-    def inner():
-      if not val:
-        ret = func()
-        val.append(ret if ret is not None else default)
-        if logging.getLogger().isEnabledFor(logging.INFO):
-          print '%s -> %r' % (func.__name__, val[0])
-      return val[0]
-    return inner
-  return memoizer
-
-
-@memoize()
-def IsWindows():
-  return sys.platform in ['win32', 'cygwin']
-
-
-@memoize()
-def IsLinux():
-  return sys.platform.startswith(('linux', 'freebsd'))
-
-
-@memoize()
-def IsMac():
-  return sys.platform == 'darwin'
-
-
-@memoize()
-def gyp_defines():
-  """Parses and returns GYP_DEFINES env var as a dictionary."""
-  return dict(arg.split('=', 1)
-      for arg in shlex.split(os.environ.get('GYP_DEFINES', '')))
-
-
-@memoize()
-def gyp_generator_flags():
-  """Parses and returns GYP_GENERATOR_FLAGS env var as a dictionary."""
-  return dict(arg.split('=', 1)
-      for arg in shlex.split(os.environ.get('GYP_GENERATOR_FLAGS', '')))
-
-
-@memoize()
-def gyp_msvs_version():
-  return os.environ.get('GYP_MSVS_VERSION', '')
-
-
-@memoize()
-def distributor():
-  """
-  Returns a string which is the distributed build engine in use (if any).
-  Possible values: 'goma', 'ib', ''
-  """
-  if 'goma' in gyp_defines():
-    return 'goma'
-  elif IsWindows():
-    if 'CHROME_HEADLESS' in os.environ:
-      return 'ib' # use (win and !goma and headless) as approximation of ib
-
-
-@memoize()
-def platform():
-  """
-  Returns a string representing the platform this build is targeted for.
-  Possible values: 'win', 'mac', 'linux', 'ios', 'android'
-  """
-  if 'OS' in gyp_defines():
-    if 'android' in gyp_defines()['OS']:
-      return 'android'
-    else:
-      return gyp_defines()['OS']
-  elif IsWindows():
-    return 'win'
-  elif IsLinux():
-    return 'linux'
-  else:
-    return 'mac'
-
-
-@memoize()
-def builder():
-  """
-  Returns a string representing the build engine (not compiler) to use.
-  Possible values: 'make', 'ninja', 'xcode', 'msvs', 'scons'
-  """
-  if 'GYP_GENERATORS' in os.environ:
-    # for simplicity, only support the first explicit generator
-    generator = os.environ['GYP_GENERATORS'].split(',')[0]
-    if generator.endswith('-android'):
-      return generator.split('-')[0]
-    elif generator.endswith('-ninja'):
-      return 'ninja'
-    else:
-      return generator
-  else:
-    if platform() == 'android':
-      # Good enough for now? Do any android bots use make?
-      return 'make'
-    elif platform() == 'ios':
-      return 'xcode'
-    elif IsWindows():
-      return 'msvs'
-    elif IsLinux():
-      return 'make'
-    elif IsMac():
-      return 'xcode'
-    else:
-      assert False, 'Don\'t know what builder we\'re using!'
diff --git a/third_party/v8/gypfiles/landmines.py b/third_party/v8/gypfiles/landmines.py
deleted file mode 100755
index 2a81c66..0000000
--- a/third_party/v8/gypfiles/landmines.py
+++ /dev/null
@@ -1,245 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 the V8 project 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 runs every build as the first hook (See DEPS). If it detects that
-the build should be clobbered, it will delete the contents of the build
-directory.
-
-A landmine is tripped when a builder checks out a different revision, and the
-diff between the new landmines and the old ones is non-null. At this point, the
-build is clobbered.
-"""
-
-import difflib
-import errno
-import gyp_environment
-import logging
-import optparse
-import os
-import re
-import shutil
-import sys
-import subprocess
-import time
-
-import landmine_utils
-
-
-SRC_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
-
-
-def get_build_dir(build_tool, is_iphone=False):
-  """
-  Returns output directory absolute path dependent on build and targets.
-  Examples:
-    r'c:\b\build\slave\win\build\src\out'
-    '/mnt/data/b/build/slave/linux/build/src/out'
-    '/b/build/slave/ios_rel_device/build/src/xcodebuild'
-
-  Keep this function in sync with tools/build/scripts/slave/compile.py
-  """
-  ret = None
-  if build_tool == 'xcode':
-    ret = os.path.join(SRC_DIR, 'xcodebuild')
-  elif build_tool in ['make', 'ninja', 'ninja-ios']:  # TODO: Remove ninja-ios.
-    if 'CHROMIUM_OUT_DIR' in os.environ:
-      output_dir = os.environ.get('CHROMIUM_OUT_DIR').strip()
-      if not output_dir:
-        raise Error('CHROMIUM_OUT_DIR environment variable is set but blank!')
-    else:
-      output_dir = landmine_utils.gyp_generator_flags().get('output_dir', 'out')
-    ret = os.path.join(SRC_DIR, output_dir)
-  elif build_tool in ['msvs', 'vs', 'ib']:
-    ret = os.path.join(SRC_DIR, 'build')
-  else:
-    raise NotImplementedError('Unexpected GYP_GENERATORS (%s)' % build_tool)
-  return os.path.abspath(ret)
-
-
-def extract_gn_build_commands(build_ninja_file):
-  """Extracts from a build.ninja the commands to run GN.
-
-  The commands to run GN are the gn rule and build.ninja build step at the
-  top of the build.ninja file. We want to keep these when deleting GN builds
-  since we want to preserve the command-line flags to GN.
-
-  On error, returns the empty string."""
-  result = ""
-  with open(build_ninja_file, 'r') as f:
-    # Read until the second blank line. The first thing GN writes to the file
-    # is the "rule gn" and the second is the section for "build build.ninja",
-    # separated by blank lines.
-    num_blank_lines = 0
-    while num_blank_lines < 2:
-      line = f.readline()
-      if len(line) == 0:
-        return ''  # Unexpected EOF.
-      result += line
-      if line[0] == '\n':
-        num_blank_lines = num_blank_lines + 1
-  return result
-
-def delete_build_dir(build_dir):
-  # GN writes a build.ninja.d file. Note that not all GN builds have args.gn.
-  build_ninja_d_file = os.path.join(build_dir, 'build.ninja.d')
-  if not os.path.exists(build_ninja_d_file):
-    shutil.rmtree(build_dir)
-    return
-
-  # GN builds aren't automatically regenerated when you sync. To avoid
-  # messing with the GN workflow, erase everything but the args file, and
-  # write a dummy build.ninja file that will automatically rerun GN the next
-  # time Ninja is run.
-  build_ninja_file = os.path.join(build_dir, 'build.ninja')
-  build_commands = extract_gn_build_commands(build_ninja_file)
-
-  try:
-    gn_args_file = os.path.join(build_dir, 'args.gn')
-    with open(gn_args_file, 'r') as f:
-      args_contents = f.read()
-  except IOError:
-    args_contents = ''
-
-  shutil.rmtree(build_dir)
-
-  # Put back the args file (if any).
-  os.mkdir(build_dir)
-  if args_contents != '':
-    with open(gn_args_file, 'w') as f:
-      f.write(args_contents)
-
-  # Write the build.ninja file sufficiently to regenerate itself.
-  with open(os.path.join(build_dir, 'build.ninja'), 'w') as f:
-    if build_commands != '':
-      f.write(build_commands)
-    else:
-      # Couldn't parse the build.ninja file, write a default thing.
-      f.write('''rule gn
-command = gn -q gen //out/%s/
-description = Regenerating ninja files
-
-build build.ninja: gn
-generator = 1
-depfile = build.ninja.d
-''' % (os.path.split(build_dir)[1]))
-
-  # Write a .d file for the build which references a nonexistant file. This
-  # will make Ninja always mark the build as dirty.
-  with open(build_ninja_d_file, 'w') as f:
-    f.write('build.ninja: nonexistant_file.gn\n')
-
-
-def needs_clobber(landmines_path, new_landmines):
-  if os.path.exists(landmines_path):
-    with open(landmines_path, 'r') as f:
-      old_landmines = f.readlines()
-    if old_landmines != new_landmines:
-      old_date = time.ctime(os.stat(landmines_path).st_ctime)
-      diff = difflib.unified_diff(old_landmines, new_landmines,
-          fromfile='old_landmines', tofile='new_landmines',
-          fromfiledate=old_date, tofiledate=time.ctime(), n=0)
-      sys.stdout.write('Clobbering due to:\n')
-      sys.stdout.writelines(diff)
-      return True
-  else:
-    sys.stdout.write('Clobbering due to missing landmines file.\n')
-    return True
-  return False
-
-
-def clobber_if_necessary(new_landmines):
-  """Does the work of setting, planting, and triggering landmines."""
-  out_dir = get_build_dir(landmine_utils.builder())
-  landmines_path = os.path.normpath(os.path.join(out_dir, '..', '.landmines'))
-  try:
-    os.makedirs(out_dir)
-  except OSError as e:
-    if e.errno == errno.EEXIST:
-      pass
-
-  if needs_clobber(landmines_path, new_landmines):
-    # Clobber contents of build directory but not directory itself: some
-    # checkouts have the build directory mounted.
-    for f in os.listdir(out_dir):
-      path = os.path.join(out_dir, f)
-      if os.path.basename(out_dir) == 'build':
-        # Only delete build directories and files for MSVS builds as the folder
-        # shares some checked out files and directories.
-        if (os.path.isdir(path) and
-            re.search(r'(?:[Rr]elease)|(?:[Dd]ebug)', f)):
-          delete_build_dir(path)
-        elif (os.path.isfile(path) and
-              (path.endswith('.sln') or
-               path.endswith('.vcxproj') or
-               path.endswith('.vcxproj.user'))):
-          os.unlink(path)
-      else:
-        if os.path.isfile(path):
-          os.unlink(path)
-        elif os.path.isdir(path):
-          delete_build_dir(path)
-    if os.path.basename(out_dir) == 'xcodebuild':
-      # Xcodebuild puts an additional project file structure into build,
-      # while the output folder is xcodebuild.
-      project_dir = os.path.join(SRC_DIR, 'build', 'all.xcodeproj')
-      if os.path.exists(project_dir) and os.path.isdir(project_dir):
-        delete_build_dir(project_dir)
-
-  # Save current set of landmines for next time.
-  with open(landmines_path, 'w') as f:
-    f.writelines(new_landmines)
-
-
-def process_options():
-  """Returns a list of landmine emitting scripts."""
-  parser = optparse.OptionParser()
-  parser.add_option(
-      '-s', '--landmine-scripts', action='append',
-      default=[os.path.join(SRC_DIR, 'gypfiles', 'get_landmines.py')],
-      help='Path to the script which emits landmines to stdout. The target '
-           'is passed to this script via option -t. Note that an extra '
-           'script can be specified via an env var EXTRA_LANDMINES_SCRIPT.')
-  parser.add_option('-v', '--verbose', action='store_true',
-      default=('LANDMINES_VERBOSE' in os.environ),
-      help=('Emit some extra debugging information (default off). This option '
-          'is also enabled by the presence of a LANDMINES_VERBOSE environment '
-          'variable.'))
-
-  options, args = parser.parse_args()
-
-  if args:
-    parser.error('Unknown arguments %s' % args)
-
-  logging.basicConfig(
-      level=logging.DEBUG if options.verbose else logging.ERROR)
-
-  extra_script = os.environ.get('EXTRA_LANDMINES_SCRIPT')
-  if extra_script:
-    return options.landmine_scripts + [extra_script]
-  else:
-    return options.landmine_scripts
-
-
-def main():
-  landmine_scripts = process_options()
-
-  if landmine_utils.builder() in ('dump_dependency_json', 'eclipse'):
-    return 0
-
-  gyp_environment.set_environment()
-
-  landmines = []
-  for s in landmine_scripts:
-    proc = subprocess.Popen([sys.executable, s], stdout=subprocess.PIPE)
-    output, _ = proc.communicate()
-    landmines.extend([('%s\n' % l.strip()) for l in output.splitlines()])
-  clobber_if_necessary(landmines)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/v8/gypfiles/mac/asan.gyp b/third_party/v8/gypfiles/mac/asan.gyp
deleted file mode 100644
index 3fc7f58..0000000
--- a/third_party/v8/gypfiles/mac/asan.gyp
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2015 the V8 project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-   'targets': [
-     {
-       'target_name': 'asan_dynamic_runtime',
-       'toolsets': ['target', 'host'],
-       'type': 'none',
-       'variables': {
-         # Every target is going to depend on asan_dynamic_runtime, so allow
-         # this one to depend on itself.
-         'prune_self_dependency': 1,
-         # Path is relative to this GYP file.
-         'asan_rtl_mask_path':
-             '../../third_party/llvm-build/Release+Asserts/lib/clang/*/lib/darwin',
-         'asan_osx_dynamic':
-             '<(asan_rtl_mask_path)/libclang_rt.asan_osx_dynamic.dylib',
-       },
-       'copies': [
-         {
-           'destination': '<(PRODUCT_DIR)',
-           'files': [
-             '<!(/bin/ls <(asan_osx_dynamic))',
-           ],
-         },
-       ],
-     },
-   ],
-}
diff --git a/third_party/v8/gypfiles/run-tests-legacy.py b/third_party/v8/gypfiles/run-tests-legacy.py
deleted file mode 100755
index f1ea478..0000000
--- a/third_party/v8/gypfiles/run-tests-legacy.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 the V8 project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Legacy test-runner wrapper supporting a product of multiple architectures and
-modes.
-"""
-
-import argparse
-import itertools
-from os.path import abspath, dirname, join
-import subprocess
-import sys
-
-BASE_DIR = dirname(dirname(abspath(__file__)))
-RUN_TESTS = join(BASE_DIR, 'tools', 'run-tests.py')
-
-def main():
-  parser = argparse.ArgumentParser(description='Legacy test-runner wrapper')
-  parser.add_argument(
-      '--arch', help='Comma-separated architectures to run tests on')
-  parser.add_argument(
-      '--mode', help='Comma-separated modes to run tests on')
-  parser.add_argument(
-      '--arch-and-mode',
-      help='Architecture and mode in the format \'arch.mode\'',
-  )
-
-  args, remaining_args = parser.parse_known_args(sys.argv)
-  if (args.arch or args.mode) and args.arch_and_mode:
-    parser.error('The flags --arch-and-mode and --arch/--mode are exclusive.')
-  arch = (args.arch or 'ia32,x64,arm').split(',')
-  mode = (args.mode or 'release,debug').split(',')
-  if args.arch_and_mode:
-    arch_and_mode = map(
-        lambda am: am.split('.'),
-        args.arch_and_mode.split(','))
-    arch = map(lambda am: am[0], arch_and_mode)
-    mode = map(lambda am: am[1], arch_and_mode)
-
-  ret_code = 0
-  for a, m in itertools.product(arch, mode):
-    ret_code |= subprocess.check_call(
-        [RUN_TESTS] + remaining_args[1:] + ['--arch', a, '--mode', m])
-  return ret_code
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/v8/gypfiles/set_clang_warning_flags.gypi b/third_party/v8/gypfiles/set_clang_warning_flags.gypi
deleted file mode 100644
index 63d5f14..0000000
--- a/third_party/v8/gypfiles/set_clang_warning_flags.gypi
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2016 the V8 project authors. All rights reserved.
-# Copyright (c) 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This file is meant to be included to set clang-specific compiler flags.
-# To use this the following variable can be defined:
-#   clang_warning_flags:       list: Compiler flags to pass to clang.
-#   clang_warning_flags_unset: list: Compiler flags to not pass to clang.
-#
-# Only use this in third-party code. In chromium_code, fix your code to not
-# warn instead!
-#
-# Note that the gypi file is included in target_defaults, so it does not need
-# to be explicitly included.
-#
-# Warning flags set by this will be used on all platforms. If you want to set
-# warning flags on only some platforms, you have to do so manually.
-#
-# To use this, create a gyp target with the following form:
-# {
-#   'target_name': 'my_target',
-#   'variables': {
-#     'clang_warning_flags': ['-Wno-awesome-warning'],
-#     'clang_warning_flags_unset': ['-Wpreviously-set-flag'],
-#   }
-# }
-
-{
-  'variables': {
-    'clang_warning_flags_unset%': [],  # Provide a default value.
-  },
-  'conditions': [
-    ['clang==1', {
-      # This uses >@ instead of @< to also see clang_warning_flags set in
-      # targets directly, not just the clang_warning_flags in target_defaults.
-      'cflags': [ '>@(clang_warning_flags)' ],
-      'cflags!': [ '>@(clang_warning_flags_unset)' ],
-      'xcode_settings': {
-        'WARNING_CFLAGS': ['>@(clang_warning_flags)'],
-        'WARNING_CFLAGS!': ['>@(clang_warning_flags_unset)'],
-      },
-      'msvs_settings': {
-        'VCCLCompilerTool': {
-          'AdditionalOptions': [ '>@(clang_warning_flags)' ],
-          'AdditionalOptions!': [ '>@(clang_warning_flags_unset)' ],
-        },
-      },
-    }],
-    ['clang==0 and host_clang==1', {
-      'target_conditions': [
-        ['_toolset=="host"', {
-          'cflags': [ '>@(clang_warning_flags)' ],
-          'cflags!': [ '>@(clang_warning_flags_unset)' ],
-        }],
-      ],
-    }],
-  ],
-}
diff --git a/third_party/v8/gypfiles/shim_headers.gypi b/third_party/v8/gypfiles/shim_headers.gypi
deleted file mode 100644
index 7e21773..0000000
--- a/third_party/v8/gypfiles/shim_headers.gypi
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright 2013 the V8 project 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.
-
-# This file is meant to be included into a target to handle shim headers
-# in a consistent manner. To use this the following variables need to be
-# defined:
-#   headers_root_path: string: path to directory containing headers
-#   header_filenames: list: list of header file names
-
-{
-  'variables': {
-    'shim_headers_path': '<(SHARED_INTERMEDIATE_DIR)/shim_headers/<(_target_name)/<(_toolset)',
-    'shim_generator_additional_args%': [],
-  },
-  'include_dirs++': [
-    '<(shim_headers_path)',
-  ],
-  'all_dependent_settings': {
-    'include_dirs+++': [
-      '<(shim_headers_path)',
-    ],
-  },
-  'actions': [
-    {
-      'variables': {
-        'generator_path': '<(DEPTH)/tools/generate_shim_headers/generate_shim_headers.py',
-        'generator_args': [
-          '--headers-root', '<(headers_root_path)',
-          '--output-directory', '<(shim_headers_path)',
-          '<@(shim_generator_additional_args)',
-          '<@(header_filenames)',
-        ],
-      },
-      'action_name': 'generate_<(_target_name)_shim_headers',
-      'inputs': [
-        '<(generator_path)',
-      ],
-      'outputs': [
-        '<!@pymod_do_main(generate_shim_headers <@(generator_args) --outputs)',
-      ],
-      'action': ['python2',
-                 '<(generator_path)',
-                 '<@(generator_args)',
-                 '--generate',
-      ],
-      'message': 'Generating <(_target_name) shim headers.',
-    },
-  ],
-}
diff --git a/third_party/v8/gypfiles/standalone.gypi b/third_party/v8/gypfiles/standalone.gypi
deleted file mode 100644
index a2955f8..0000000
--- a/third_party/v8/gypfiles/standalone.gypi
+++ /dev/null
@@ -1,1411 +0,0 @@
-# Copyright 2012 the V8 project 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.
-
-# Definitions to be used when building stand-alone V8 binaries.
-
-{
-  # We need to include toolchain.gypi here for third-party sources that don't
-  # directly include it themselves.
-  'includes': ['toolchain.gypi'],
-  'variables': {
-    'component%': 'static_library',
-    'clang_xcode%': 0,
-    # Track where uninitialized memory originates from. From fastest to
-    # slowest: 0 - no tracking, 1 - track only the initial allocation site, 2
-    # - track the chain of stores leading from allocation site to use site.
-    'msan_track_origins%': 2,
-    'visibility%': 'hidden',
-    'v8_enable_backtrace%': 0,
-    'v8_enable_i18n_support%': 1,
-    'v8_deprecation_warnings': 1,
-    'v8_imminent_deprecation_warnings': 1,
-    'v8_check_microtasks_scopes_consistency': 'true',
-    'msvs_multi_core_compile%': '1',
-    'mac_deployment_target%': '10.7',
-    'release_extra_cflags%': '',
-    'variables': {
-      'variables': {
-        'variables': {
-          'variables': {
-            'conditions': [
-              ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or \
-                 OS=="netbsd" or OS=="mac" or OS=="qnx" or OS=="aix"', {
-                # This handles the Unix platforms we generally deal with.
-                # Anything else gets passed through, which probably won't work
-                # very well; such hosts should pass an explicit target_arch
-                # to gyp.
-                'host_arch%': '<!pymod_do_main(detect_v8_host_arch)',
-              }, {
-                # OS!="linux" and OS!="freebsd" and OS!="openbsd" and
-                # OS!="netbsd" and OS!="mac" and OS!="aix"
-                'host_arch%': 'ia32',
-              }],
-            ],
-          },
-          'host_arch%': '<(host_arch)',
-          'target_arch%': '<(host_arch)',
-
-          # By default we build against a stable sysroot image to avoid
-          # depending on the packages installed on the local machine. Set this
-          # to 0 to build against locally installed headers and libraries (e.g.
-          # if packaging for a linux distro)
-          'use_sysroot%': 1,
-        },
-        'host_arch%': '<(host_arch)',
-        'target_arch%': '<(target_arch)',
-        'use_sysroot%': '<(use_sysroot)',
-        'base_dir%': '<!(cd <(DEPTH) && python -c "import os; print os.getcwd()")',
-
-        # Instrument for code coverage and use coverage wrapper to exclude some
-        # files. Uses gcov if clang=0 is set explicitly. Otherwise,
-        # sanitizer_coverage must be set too.
-        'coverage%': 0,
-
-        # Default sysroot if no sysroot can be provided.
-        'sysroot%': '',
-
-        'conditions': [
-          # The system root for linux builds.
-          ['OS=="linux" and use_sysroot==1', {
-            'conditions': [
-              ['target_arch=="arm"', {
-                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_jessie_arm-sysroot',
-              }],
-              ['target_arch=="x64"', {
-                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_jessie_amd64-sysroot',
-              }],
-              ['target_arch=="ia32"', {
-                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_jessie_i386-sysroot',
-              }],
-              ['target_arch=="mipsel"', {
-                'sysroot%': '<!(cd <(DEPTH) && pwd -P)/build/linux/debian_jessie_mips-sysroot',
-              }],
-            ],
-          }], # OS=="linux" and use_sysroot==1
-        ],
-      },
-      'base_dir%': '<(base_dir)',
-      'host_arch%': '<(host_arch)',
-      'target_arch%': '<(target_arch)',
-      'v8_target_arch%': '<(target_arch)',
-      'coverage%': '<(coverage)',
-      'sysroot%': '<(sysroot)',
-      'asan%': 0,
-      'lsan%': 0,
-      'msan%': 0,
-      'tsan%': 0,
-      # Enable coverage gathering instrumentation in sanitizer tools. This flag
-      # also controls coverage granularity (1 for function-level, 2 for
-      # block-level, 3 for edge-level).
-      'sanitizer_coverage%': 0,
-
-      # Use dynamic libraries instrumented by one of the sanitizers
-      # instead of the standard system libraries. Set this flag to download
-      # prebuilt binaries from GCS.
-      'use_prebuilt_instrumented_libraries%': 0,
-
-      # Use libc++ (buildtools/third_party/libc++ and
-      # buildtools/third_party/libc++abi) instead of stdlibc++ as standard
-      # library. This is intended to be used for instrumented builds.
-      'use_custom_libcxx%': 0,
-
-      'clang_dir%': '<(base_dir)/third_party/llvm-build/Release+Asserts',
-      'make_clang_dir%': '<(base_dir)/third_party/llvm-build/Release+Asserts',
-
-      # Control Flow Integrity for virtual calls and casts.
-      # See http://clang.llvm.org/docs/ControlFlowIntegrity.html
-      'cfi_vptr%': 0,
-      'cfi_diag%': 0,
-
-      'cfi_blacklist%': '<(base_dir)/tools/cfi/blacklist.txt',
-
-      # Set to 1 to enable fast builds.
-      # TODO(machenbach): Only configured for windows.
-      'fastbuild%': 0,
-
-      # goma settings.
-      # 1 to use goma.
-      # If no gomadir is set, it uses the default gomadir.
-      'use_goma%': 0,
-      'gomadir%': '',
-
-      'test_isolation_mode%': 'noop',
-
-      # By default, use ICU data file (icudtl.dat).
-      'icu_use_data_file_flag%': 1,
-
-      'conditions': [
-        # Set default gomadir.
-        ['OS=="win"', {
-          'gomadir': 'c:\\goma\\goma-win',
-        }, {
-          'gomadir': '<!(/bin/echo -n ${HOME}/goma)',
-        }],
-        ['host_arch!="ppc" and host_arch!="ppc64" and host_arch!="ppc64le" and host_arch!="s390" and host_arch!="s390x"', {
-          'host_clang%': 1,
-        }, {
-          'host_clang%': 0,
-        }],
-        # linux_use_bundled_gold: whether to use the gold linker binary checked
-        # into third_party/binutils.  Force this off via GYP_DEFINES when you
-        # are using a custom toolchain and need to control -B in ldflags.
-        # Do not use 32-bit gold on 32-bit hosts as it runs out address space
-        # for component=static_library builds.
-        ['((OS=="linux" or OS=="android") and (target_arch=="x64" or target_arch=="arm" or (target_arch=="ia32" and host_arch=="x64"))) or (OS=="linux" and target_arch=="mipsel")', {
-          'linux_use_bundled_gold%': 1,
-        }, {
-          'linux_use_bundled_gold%': 0,
-        }],
-      ],
-    },
-    'base_dir%': '<(base_dir)',
-    'clang_dir%': '<(clang_dir)',
-    'make_clang_dir%': '<(make_clang_dir)',
-    'host_arch%': '<(host_arch)',
-    'host_clang%': '<(host_clang)',
-    'target_arch%': '<(target_arch)',
-    'v8_target_arch%': '<(v8_target_arch)',
-    'werror%': '-Werror',
-    'use_goma%': '<(use_goma)',
-    'gomadir%': '<(gomadir)',
-    'asan%': '<(asan)',
-    'lsan%': '<(lsan)',
-    'msan%': '<(msan)',
-    'tsan%': '<(tsan)',
-    'sanitizer_coverage%': '<(sanitizer_coverage)',
-    'use_prebuilt_instrumented_libraries%': '<(use_prebuilt_instrumented_libraries)',
-    'use_custom_libcxx%': '<(use_custom_libcxx)',
-    'linux_use_bundled_gold%': '<(linux_use_bundled_gold)',
-    'cfi_vptr%': '<(cfi_vptr)',
-    'cfi_diag%': '<(cfi_diag)',
-    'cfi_blacklist%': '<(cfi_blacklist)',
-    'test_isolation_mode%': '<(test_isolation_mode)',
-    'fastbuild%': '<(fastbuild)',
-    'coverage%': '<(coverage)',
-    'sysroot%': '<(sysroot)',
-    'icu_use_data_file_flag%': '<(icu_use_data_file_flag)',
-
-    # Add a simple extras solely for the purpose of the cctests
-    'v8_extra_library_files': ['../test/cctest/test-extra.js'],
-    'v8_experimental_extra_library_files': ['../test/cctest/test-experimental-extra.js'],
-
-    # .gyp files or targets should set v8_code to 1 if they build V8 specific
-    # code, as opposed to external code.  This variable is used to control such
-    # things as the set of warnings to enable, and whether warnings are treated
-    # as errors.
-    'v8_code%': 0,
-
-    # Speeds up Debug builds:
-    # 0 - Compiler optimizations off (debuggable) (default). This may
-    #     be 5x slower than Release (or worse).
-    # 1 - Turn on optimizations and disable slow DCHECKs, but leave
-    #     V8_ENABLE_CHECKS and most other assertions enabled.  This may cause
-    #     some v8 tests to fail in the Debug configuration.  This roughly
-    #     matches the performance of a Release build and can be used by
-    #     embedders that need to build their own code as debug but don't want
-    #     or need a debug version of V8. This should produce near-release
-    #     speeds.
-    'v8_optimized_debug%': 0,
-
-    # Use external files for startup data blobs:
-    # the JS builtins sources and the start snapshot.
-    # Embedders that don't use standalone.gypi will need to add
-    # their own default value.
-    'v8_use_external_startup_data%': 1,
-
-    # Relative path to icu.gyp from this file.
-    'icu_gyp_path': '../third_party/icu/icu.gyp',
-
-    'conditions': [
-      ['(v8_target_arch=="arm" and host_arch!="arm") or \
-        (v8_target_arch=="arm64" and host_arch!="arm64") or \
-        (v8_target_arch=="mipsel" and host_arch!="mipsel") or \
-        (v8_target_arch=="mips64el" and host_arch!="mips64el") or \
-        (v8_target_arch=="x64" and host_arch!="x64") or \
-        (OS=="android" or OS=="qnx")', {
-        'want_separate_host_toolset': 1,
-      }, {
-        'want_separate_host_toolset': 0,
-      }],
-      ['OS == "win"', {
-        'os_posix%': 0,
-      }, {
-        'os_posix%': 1,
-      }],
-      ['OS=="win" and use_goma==1', {
-        # goma doesn't support pch yet.
-        'chromium_win_pch': 0,
-        # goma doesn't support PDB yet.
-        'fastbuild%': 1,
-      }],
-      ['((v8_target_arch=="ia32" or v8_target_arch=="x64") and \
-        (OS=="linux" or OS=="mac")) or (v8_target_arch=="ppc64" and OS=="linux")', {
-        'v8_enable_gdbjit%': 1,
-      }, {
-        'v8_enable_gdbjit%': 0,
-      }],
-      ['(OS=="linux" or OS=="mac") and (target_arch=="ia32" or target_arch=="x64") and \
-        v8_target_arch!="x32"', {
-        'clang%': 1,
-      }, {
-        'clang%': 0,
-      }],
-      ['asan==1 or lsan==1 or msan==1 or tsan==1', {
-        'clang%': 1,
-        'use_allocator%': 'none',
-      }],
-      ['asan==1 and OS=="linux"', {
-        'use_custom_libcxx%': 1,
-      }],
-      ['tsan==1', {
-        'use_custom_libcxx%': 1,
-      }],
-      ['msan==1', {
-        # Use a just-built, MSan-instrumented libc++ instead of the system-wide
-        # libstdc++. This is required to avoid false positive reports whenever
-        # the C++ standard library is used.
-        'use_custom_libcxx%': 1,
-      }],
-      ['OS=="android"', {
-        # Location of Android NDK.
-        'variables': {
-          'variables': {
-            # The Android toolchain needs to use the absolute path to the NDK
-            # because it is used at different levels in the GYP files.
-            'android_ndk_root%': '<(base_dir)/third_party/android_ndk/',
-            'android_host_arch%': "<!(uname -m | sed -e 's/i[3456]86/x86/')",
-            # Version of the NDK. Used to ensure full rebuilds on NDK rolls.
-            'android_ndk_version%': 'r12b',
-            'host_os%': "<!(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')",
-            'os_folder_name%': "<!(uname -s | sed -e 's/Linux/linux/;s/Darwin/darwin/')",
-          },
-
-          # Copy conditionally-set variables out one scope.
-          'android_ndk_root%': '<(android_ndk_root)',
-          'android_ndk_version%': '<(android_ndk_version)',
-          'host_os%': '<(host_os)',
-          'os_folder_name%': '<(os_folder_name)',
-
-          'conditions': [
-            ['target_arch == "ia32"', {
-              'android_toolchain%': '<(android_ndk_root)/toolchains/x86-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
-              'android_target_arch%': 'x86',
-              'android_target_platform%': '16',
-              'arm_version%': 'default',
-            }],
-            ['target_arch == "x64"', {
-              'android_toolchain%': '<(android_ndk_root)/toolchains/x86_64-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
-              'android_target_arch%': 'x86_64',
-              'android_target_platform%': '21',
-              'arm_version%': 'default',
-            }],
-            ['target_arch=="arm"', {
-              'android_toolchain%': '<(android_ndk_root)/toolchains/arm-linux-androideabi-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
-              'android_target_arch%': 'arm',
-              'android_target_platform%': '16',
-              'arm_version%': 7,
-            }],
-            ['target_arch == "arm64"', {
-              'android_toolchain%': '<(android_ndk_root)/toolchains/aarch64-linux-android-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
-              'android_target_arch%': 'arm64',
-              'android_target_platform%': '21',
-              'arm_version%': 'default',
-            }],
-            ['target_arch == "mipsel"', {
-              'android_toolchain%': '<(android_ndk_root)/toolchains/mipsel-linux-android-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
-              'android_target_arch%': 'mips',
-              'android_target_platform%': '16',
-              'arm_version%': 'default',
-            }],
-            ['target_arch == "mips64el"', {
-              'android_toolchain%': '<(android_ndk_root)/toolchains/mips64el-linux-android-4.9/prebuilt/<(os_folder_name)-<(android_host_arch)/bin',
-              'android_target_arch%': 'mips64',
-              'android_target_platform%': '21',
-              'arm_version%': 'default',
-            }],
-          ],
-        },
-
-        # Copy conditionally-set variables out one scope.
-        'android_ndk_version%': '<(android_ndk_version)',
-        'android_target_arch%': '<(android_target_arch)',
-        'android_target_platform%': '<(android_target_platform)',
-        'android_toolchain%': '<(android_toolchain)',
-        'arm_version%': '<(arm_version)',
-        'host_os%': '<(host_os)',
-
-        # Print to stdout on Android.
-        'v8_android_log_stdout%': 1,
-
-        'conditions': [
-          ['android_ndk_root==""', {
-            'variables': {
-              'android_sysroot': '<(android_toolchain)/sysroot/',
-              'android_stl': '<(android_toolchain)/sources/cxx-stl/',
-            },
-            'conditions': [
-              ['target_arch=="x64"', {
-                'android_lib': '<(android_sysroot)/usr/lib64',
-              }, {
-                'android_lib': '<(android_sysroot)/usr/lib',
-              }],
-            ],
-            'android_libcpp_include': '<(android_stl)/llvm-libc++/libcxx/include',
-            'android_libcpp_abi_include': '<(android_stl)/llvm-libc++abi/libcxxabi/include',
-            'android_libcpp_libs': '<(android_stl)/llvm-libc++/libs',
-            'android_support_include': '<(android_toolchain)/sources/android/support/include',
-            'android_sysroot': '<(android_sysroot)',
-          }, {
-            'variables': {
-              'android_sysroot': '<(android_ndk_root)/platforms/android-<(android_target_platform)/arch-<(android_target_arch)',
-              'android_stl': '<(android_ndk_root)/sources/cxx-stl/',
-            },
-            'conditions': [
-              ['target_arch=="x64"', {
-                'android_lib': '<(android_sysroot)/usr/lib64',
-              }, {
-                'android_lib': '<(android_sysroot)/usr/lib',
-              }],
-            ],
-            'android_libcpp_include': '<(android_stl)/llvm-libc++/libcxx/include',
-            'android_libcpp_abi_include': '<(android_stl)/llvm-libc++abi/libcxxabi/include',
-            'android_libcpp_libs': '<(android_stl)/llvm-libc++/libs',
-            'android_support_include': '<(android_ndk_root)/sources/android/support/include',
-            'android_sysroot': '<(android_sysroot)',
-          }],
-        ],
-        'android_libcpp_library': 'c++_static',
-      }],  # OS=="android"
-      ['host_clang==1', {
-        'conditions':[
-          ['OS=="android"', {
-            'host_ld': '<!(which ld)',
-            'host_ranlib': '<!(which ranlib)',
-          }],
-        ],
-        'host_cc': '<(clang_dir)/bin/clang',
-        'host_cxx': '<(clang_dir)/bin/clang++',
-      }, {
-        'host_cc': '<!(which gcc)',
-        'host_cxx': '<!(which g++)',
-      }],
-    ],
-    # Default ARM variable settings.
-    'arm_version%': 'default',
-    'arm_fpu%': 'vfpv3',
-    'arm_float_abi%': 'default',
-    'arm_thumb': 'default',
-
-    # Default MIPS variable settings.
-    'mips_arch_variant%': 'r2',
-    # Possible values fp32, fp64, fpxx.
-    # fp32 - 32 32-bit FPU registers are available, doubles are placed in
-    #        register pairs.
-    # fp64 - 32 64-bit FPU registers are available.
-    # fpxx - compatibility mode, it chooses fp32 or fp64 depending on runtime
-    #        detection
-    'mips_fpu_mode%': 'fp32',
-  },
-  'target_defaults': {
-    'variables': {
-      'v8_code%': '<(v8_code)',
-      'clang_warning_flags': [
-        '-Wsign-compare',
-        # TODO(thakis): https://crbug.com/604888
-        '-Wno-undefined-var-template',
-        # TODO(yangguo): issue 5258
-        '-Wno-nonportable-include-path',
-        '-Wno-tautological-constant-compare',
-      ],
-      'conditions':[
-        ['OS=="android"', {
-          'host_os%': '<(host_os)',
-        }],
-      ],
-    },
-    'includes': [ 'set_clang_warning_flags.gypi', ],
-    'default_configuration': 'Debug',
-    'configurations': {
-      'DebugBaseCommon': {
-        'conditions': [
-          ['OS=="aix"', {
-            'cflags': [ '-g', '-Og', '-gxcoff' ],
-          }, {
-            'cflags': [ '-g', '-O0' ],
-          }],
-        ],
-      },
-      'Optdebug': {
-        'inherit_from': [ 'DebugBaseCommon', 'DebugBase1' ],
-      },
-      'Debug': {
-        # Xcode insists on this empty entry.
-      },
-      'Release': {
-        'cflags+': ['<@(release_extra_cflags)'],
-      },
-      'conditions': [
-        ['OS=="win"', {
-          'Optdebug_x64': {
-            'inherit_from': ['Optdebug'],
-          },
-          'Debug_x64': {
-            'inherit_from': ['Debug'],
-          },
-          'Release_x64': {
-            'inherit_from': ['Release'],
-          },
-        }],
-      ],
-    },
-    'conditions':[
-      ['clang==0', {
-        'cflags+': [
-          '-Wno-uninitialized',
-        ],
-      }],
-      ['clang==1 or host_clang==1', {
-        # This is here so that all files get recompiled after a clang roll and
-        # when turning clang on or off.
-        # (defines are passed via the command line, and build systems rebuild
-        # things when their commandline changes). Nothing should ever read this
-        # define.
-        'defines': ['CR_CLANG_REVISION=<!(python <(DEPTH)/tools/clang/scripts/update.py --print-revision)'],
-      }],
-      ['clang==1 and target_arch=="ia32"', {
-        'cflags': ['-mstack-alignment=16', '-mstackrealign'],
-      }],
-      ['fastbuild!=0', {
-        'conditions': [
-          ['OS=="win" and fastbuild==1', {
-            'msvs_settings': {
-              'VCLinkerTool': {
-                # This tells the linker to generate .pdbs, so that
-                # we can get meaningful stack traces.
-                'GenerateDebugInformation': 'true',
-              },
-              'VCCLCompilerTool': {
-                # No debug info to be generated by compiler.
-                'DebugInformationFormat': '0',
-              },
-            },
-          }],
-        ],
-      }],  # fastbuild!=0
-    ],
-    'target_conditions': [
-      ['v8_code == 0', {
-        'defines!': [
-          'DEBUG',
-        ],
-        'conditions': [
-          ['os_posix == 1 and OS != "mac"', {
-            # We don't want to get warnings from third-party code,
-            # so remove any existing warning-enabling flags like -Wall.
-            'cflags!': [
-              '-pedantic',
-              '-Wall',
-              '-Werror',
-              '-Wextra',
-              '-Wshorten-64-to-32',
-            ],
-            'cflags+': [
-              # Clang considers the `register` keyword as deprecated, but
-              # ICU uses it all over the place.
-              '-Wno-deprecated-register',
-              # ICU uses its own deprecated functions.
-              '-Wno-deprecated-declarations',
-              # ICU prefers `a && b || c` over `(a && b) || c`.
-              '-Wno-logical-op-parentheses',
-              # ICU has some `unsigned < 0` checks.
-              '-Wno-tautological-compare',
-              # uresdata.c has switch(RES_GET_TYPE(x)) code. The
-              # RES_GET_TYPE macro returns an UResType enum, but some switch
-              # statement contains case values that aren't part of that
-              # enum (e.g. URES_TABLE32 which is in UResInternalType). This
-              # is on purpose.
-              '-Wno-switch',
-            ],
-            'cflags_cc!': [
-              '-Wnon-virtual-dtor',
-            ],
-          }],
-          ['OS == "mac"', {
-            'xcode_settings': {
-              'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',    # -Werror
-            },
-          }],
-          ['OS == "win"', {
-            'msvs_settings': {
-              'VCCLCompilerTool': {
-                'WarnAsError': 'false',
-              },
-            },
-          }],
-        ],
-      }],
-    ],
-  },
-  'conditions': [
-    ['os_posix==1 and OS!="mac"', {
-      'target_defaults': {
-        'conditions': [
-          # Common options for AddressSanitizer, LeakSanitizer,
-          # ThreadSanitizer, MemorySanitizer and CFI builds.
-          ['asan==1 or lsan==1 or tsan==1 or msan==1 or cfi_vptr==1', {
-            'target_conditions': [
-              ['_toolset=="target"', {
-                'cflags': [
-                  '-fno-omit-frame-pointer',
-                  '-gline-tables-only',
-                ],
-                'cflags!': [
-                  '-fomit-frame-pointer',
-                ],
-              }],
-            ],
-          }],
-          ['asan==1', {
-            'target_conditions': [
-              ['_toolset=="target"', {
-                'cflags': [
-                  '-fsanitize=address',
-                ],
-                'ldflags': [
-                  '-fsanitize=address',
-                ],
-                'defines': [
-                  'ADDRESS_SANITIZER',
-                ],
-              }],
-            ],
-          }],
-          ['lsan==1', {
-            'target_conditions': [
-              ['_toolset=="target"', {
-                'cflags': [
-                  '-fsanitize=leak',
-                ],
-                'ldflags': [
-                  '-fsanitize=leak',
-                ],
-                'defines': [
-                  'LEAK_SANITIZER',
-                ],
-              }],
-            ],
-          }],
-          ['tsan==1', {
-            'target_conditions': [
-              ['_toolset=="target"', {
-                'cflags': [
-                  '-fsanitize=thread',
-                ],
-                'ldflags': [
-                  '-fsanitize=thread',
-                ],
-                'defines': [
-                  'THREAD_SANITIZER',
-                ],
-              }],
-            ],
-          }],
-          ['msan==1', {
-            'target_conditions': [
-              ['_toolset=="target"', {
-                'cflags': [
-                  '-fsanitize=memory',
-                  '-fsanitize-memory-track-origins=<(msan_track_origins)',
-                  '-fPIC',
-                ],
-                'ldflags': [
-                  '-fsanitize=memory',
-                  '-pie',
-                ],
-                'defines': [
-                  'MEMORY_SANITIZER',
-                ],
-              }],
-            ],
-          }],
-          ['use_prebuilt_instrumented_libraries==1', {
-            'dependencies': [
-              '<(DEPTH)/third_party/instrumented_libraries/instrumented_libraries.gyp:prebuilt_instrumented_libraries',
-            ],
-          }],
-          ['use_custom_libcxx==1', {
-            'dependencies': [
-              '<(DEPTH)/buildtools/third_party/libc++/libc++.gyp:libcxx_proxy',
-            ],
-          }],
-          ['sanitizer_coverage!=0', {
-            'target_conditions': [
-              ['_toolset=="target"', {
-                'cflags': [
-                  '-fsanitize-coverage=<(sanitizer_coverage)',
-                ],
-                'defines': [
-                  'SANITIZER_COVERAGE',
-                ],
-              }],
-            ],
-          }],
-          ['linux_use_bundled_gold==1', {
-            # Put our binutils, which contains gold in the search path. We pass
-            # the path to gold to the compiler. gyp leaves unspecified what the
-            # cwd is when running the compiler, so the normal gyp path-munging
-            # fails us. This hack gets the right path.
-            'ldflags': [
-              # Note, Chromium allows ia32 host arch as well, we limit this to
-              # x64 in v8.
-              '-B<(base_dir)/third_party/binutils/Linux_x64/Release/bin',
-            ],
-          }],
-          ['sysroot!="" and clang==1', {
-            'target_conditions': [
-              ['_toolset=="target"', {
-                'variables': {
-                  'ld_paths': ['<!(<(DEPTH)/build/linux/sysroot_ld_path.sh <(sysroot))'],
-                },
-                'cflags': [
-                  '--sysroot=<(sysroot)',
-                ],
-                'ldflags': [
-                  '--sysroot=<(sysroot)',
-                  '<!(<(base_dir)/gypfiles/sysroot_ld_flags.sh <@(ld_paths))',
-                ],
-              }]]
-          }],
-        ],
-      },
-    }],
-    ['OS=="mac"', {
-      'target_defaults': {
-       'conditions': [
-          ['asan==1', {
-            'xcode_settings': {
-              # FIXME(machenbach): This is outdated compared to common.gypi.
-              'OTHER_CFLAGS+': [
-                '-fno-omit-frame-pointer',
-                '-gline-tables-only',
-                '-fsanitize=address',
-                '-w',  # http://crbug.com/162783
-              ],
-              'OTHER_CFLAGS!': [
-                '-fomit-frame-pointer',
-              ],
-              'defines': [
-                'ADDRESS_SANITIZER',
-              ],
-            },
-            'dependencies': [
-              '<(DEPTH)/gypfiles/mac/asan.gyp:asan_dynamic_runtime',
-            ],
-            'target_conditions': [
-              ['_type!="static_library"', {
-                'xcode_settings': {'OTHER_LDFLAGS': ['-fsanitize=address']},
-              }],
-            ],
-          }],
-          ['sanitizer_coverage!=0', {
-            'target_conditions': [
-              ['_toolset=="target"', {
-                'cflags': [
-                  '-fsanitize-coverage=<(sanitizer_coverage)',
-                ],
-                'defines': [
-                  'SANITIZER_COVERAGE',
-                ],
-              }],
-            ],
-          }],
-        ],
-      },  # target_defaults
-    }],  # OS=="mac"
-    ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \
-       or OS=="netbsd" or OS=="aix"', {
-      'target_defaults': {
-        'cflags': [
-          '-Wall',
-          '<(werror)',
-          '-Wno-unused-parameter',
-          '-pthread',
-          '-pedantic',
-          '-Wno-missing-field-initializers',
-          '-Wno-gnu-zero-variadic-macro-arguments',
-        ],
-        'cflags_cc': [
-          '-Wnon-virtual-dtor',
-          '-fno-exceptions',
-          '-fno-rtti',
-          '-std=gnu++11',
-        ],
-        'ldflags': [ '-pthread', ],
-        'conditions': [
-          # Don't warn about TRACE_EVENT_* macros with zero arguments passed to
-          # ##__VA_ARGS__. C99 strict mode prohibits having zero variadic macro
-          # arguments in gcc.
-          [ 'clang==0', {
-            'cflags!' : [
-              '-pedantic' ,
-              # Don't warn about unrecognized command line option.
-              '-Wno-gnu-zero-variadic-macro-arguments',
-            ],
-            'cflags' : [
-              # Disable gcc warnings for optimizations based on the assumption
-              # that signed overflow does not occur. Generates false positives
-              # (see http://crbug.com/v8/6341).
-              "-Wno-strict-overflow",
-              # Don't rely on strict aliasing; v8 does weird pointer casts all
-              # over the place.
-              '-fno-strict-aliasing',
-            ],
-          }, {
-            'cflags' : [
-              # TODO(hans): https://crbug.com/767059
-              '-Wno-tautological-constant-compare',
-            ],
-          }],
-          [ 'clang==1 and (v8_target_arch=="x64" or v8_target_arch=="arm64" \
-            or v8_target_arch=="mips64el")', {
-            'cflags': [ '-Wshorten-64-to-32' ],
-          }],
-          [ 'host_arch=="ppc64" and OS!="aix"', {
-            'cflags': [ '-mminimal-toc' ],
-          }],
-          [ 'visibility=="hidden" and v8_enable_backtrace==0', {
-            'cflags': [ '-fvisibility=hidden' ],
-          }],
-          [ 'component=="shared_library"', {
-            'cflags': [ '-fPIC', ],
-          }],
-          [ 'clang==0 and coverage==1', {
-            'cflags': [ '-fprofile-arcs', '-ftest-coverage'],
-            'ldflags': [ '-fprofile-arcs'],
-          }],
-        ],
-      },
-    }],
-    # 'OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"
-    #  or OS=="netbsd"'
-    ['OS=="qnx"', {
-      'target_defaults': {
-        'cflags': [
-          '-Wall',
-          '<(werror)',
-          '-Wno-unused-parameter',
-          # Don't warn about the "struct foo f = {0};" initialization pattern.
-          '-Wno-missing-field-initializers',
-          '-Wno-gnu-zero-variadic-macro-arguments',
-        ],
-        'cflags_cc': [
-          '-Wnon-virtual-dtor',
-          '-fno-exceptions',
-          '-fno-rtti',
-          '-std=gnu++11',
-        ],
-        'conditions': [
-          [ 'visibility=="hidden"', {
-            'cflags': [ '-fvisibility=hidden' ],
-          }],
-          [ 'component=="shared_library"', {
-            'cflags': [ '-fPIC' ],
-          }],
-        ],
-        'target_conditions': [
-          [ '_toolset=="host" and host_os=="linux"', {
-            'cflags': [ '-pthread' ],
-            'ldflags': [ '-pthread' ],
-            'libraries': [ '-lrt' ],
-          }],
-          [ '_toolset=="target"', {
-            'cflags': [ '-Wno-psabi' ],
-            'libraries': [ '-lbacktrace', '-lsocket', '-lm' ],
-          }],
-        ],
-      },
-    }],  # OS=="qnx"
-    ['OS=="win"', {
-      'target_defaults': {
-        'defines': [
-          '_CRT_SECURE_NO_DEPRECATE',
-          '_CRT_NONSTDC_NO_DEPRECATE',
-          '_USING_V110_SDK71_',
-        ],
-        'conditions': [
-          ['component=="static_library"', {
-            'defines': [
-              '_HAS_EXCEPTIONS=0',
-            ],
-          }],
-        ],
-        'msvs_cygwin_shell': 0,
-        'msvs_disabled_warnings': [
-          # C4091: 'typedef ': ignored on left of 'X' when no variable is
-          #                    declared.
-          # This happens in a number of Windows headers. Dumb.
-          4091,
-
-          # C4127: conditional expression is constant
-          # This warning can in theory catch dead code and other problems, but
-          # triggers in far too many desirable cases where the conditional
-          # expression is either set by macros or corresponds some legitimate
-          # compile-time constant expression (due to constant template args,
-          # conditionals comparing the sizes of different types, etc.).  Some of
-          # these can be worked around, but it's not worth it.
-          4127,
-
-          # C4351: new behavior: elements of array 'array' will be default
-          #        initialized
-          # This is a silly "warning" that basically just alerts you that the
-          # compiler is going to actually follow the language spec like it's
-          # supposed to, instead of not following it like old buggy versions
-          # did.  There's absolutely no reason to turn this on.
-          4351,
-
-          # C4355: 'this': used in base member initializer list
-          # It's commonly useful to pass |this| to objects in a class'
-          # initializer list.  While this warning can catch real bugs, most of
-          # the time the constructors in question don't attempt to call methods
-          # on the passed-in pointer (until later), and annotating every legit
-          # usage of this is simply more hassle than the warning is worth.
-          4355,
-
-          # C4503: 'identifier': decorated name length exceeded, name was
-          #        truncated
-          # This only means that some long error messages might have truncated
-          # identifiers in the presence of lots of templates.  It has no effect
-          # on program correctness and there's no real reason to waste time
-          # trying to prevent it.
-          4503,
-
-          # Warning C4589 says: "Constructor of abstract class ignores
-          # initializer for virtual base class." Disable this warning because it
-          # is flaky in VS 2015 RTM. It triggers on compiler generated
-          # copy-constructors in some cases.
-          4589,
-
-          # C4611: interaction between 'function' and C++ object destruction is
-          #        non-portable
-          # This warning is unavoidable when using e.g. setjmp/longjmp.  MSDN
-          # suggests using exceptions instead of setjmp/longjmp for C++, but
-          # Chromium code compiles without exception support.  We therefore have
-          # to use setjmp/longjmp for e.g. JPEG decode error handling, which
-          # means we have to turn off this warning (and be careful about how
-          # object destruction happens in such cases).
-          4611,
-
-          # TODO(jochen): These warnings are level 4. They will be slowly
-          # removed as code is fixed.
-          4100, # Unreferenced formal parameter
-          4121, # Alignment of a member was sensitive to packing
-          4244, # Conversion from 'type1' to 'type2', possible loss of data
-          4302, # Truncation from 'type 1' to 'type 2'
-          4309, # Truncation of constant value
-          4311, # Pointer truncation from 'type' to 'type'
-          4312, # Conversion from 'type1' to 'type2' of greater size
-          4505, # Unreferenced local function has been removed
-          4510, # Default constructor could not be generated
-          4512, # Assignment operator could not be generated
-          4610, # Object can never be instantiated
-          4800, # Forcing value to bool.
-          4838, # Narrowing conversion. Doesn't seem to be very useful.
-          4995, # 'X': name was marked as #pragma deprecated
-          4996, # 'X': was declared deprecated (for GetVersionEx).
-
-          # These are variable shadowing warnings that are new in VS2015. We
-          # should work through these at some point -- they may be removed from
-          # the RTM release in the /W4 set.
-          4456, 4457, 4458, 4459,
-        ],
-        'msvs_settings': {
-          'VCCLCompilerTool': {
-            'BufferSecurityCheck': 'true',
-            'EnableFunctionLevelLinking': 'true',
-            'RuntimeTypeInfo': 'false',
-            'WarningLevel': '3',
-            'WarnAsError': 'true',
-            'DebugInformationFormat': '3',
-            'Detect64BitPortabilityProblems': 'false',
-            'conditions': [
-              [ 'msvs_multi_core_compile', {
-                'AdditionalOptions': ['/MP'],
-              }],
-              ['component=="shared_library"', {
-                'ExceptionHandling': '1',  # /EHsc
-              }, {
-                'ExceptionHandling': '0',
-              }],
-            ],
-          },
-          'VCLibrarianTool': {
-            'AdditionalOptions': ['/ignore:4221'],
-            'conditions': [
-              ['v8_target_arch=="x64"', {
-                'TargetMachine': '17',  # x64
-              }, {
-                'TargetMachine': '1',  # ia32
-              }],
-            ],
-          },
-          'VCLinkerTool': {
-            'AdditionalDependencies': [
-              'ws2_32.lib',
-            ],
-            'GenerateDebugInformation': 'true',
-            'MapFileName': '$(OutDir)\\$(TargetName).map',
-            'ImportLibrary': '$(OutDir)\\lib\\$(TargetName).lib',
-            'FixedBaseAddress': '1',
-            # LinkIncremental values:
-            #   0 == default
-            #   1 == /INCREMENTAL:NO
-            #   2 == /INCREMENTAL
-            'LinkIncremental': '1',
-            # SubSystem values:
-            #   0 == not set
-            #   1 == /SUBSYSTEM:CONSOLE
-            #   2 == /SUBSYSTEM:WINDOWS
-            'SubSystem': '1',
-
-            'conditions': [
-              ['v8_enable_i18n_support==1', {
-                'AdditionalDependencies': [
-                  'advapi32.lib',
-                ],
-              }],
-              ['v8_target_arch=="x64"', {
-                'MinimumRequiredVersion': '5.02',  # Server 2003.
-                'TargetMachine': '17',  # x64
-              }, {
-                'MinimumRequiredVersion': '5.01',  # XP.
-                'TargetMachine': '1',  # ia32
-              }],
-            ],
-          },
-          'conditions': [
-            ['clang==1', {
-              'VCCLCompilerTool': {
-                'AdditionalOptions': [
-                  # Don't warn about unused function parameters.
-                  # (This is also used on other platforms.)
-                  '-Wno-unused-parameter',
-                  # Don't warn about the "struct foo f = {0};" initialization
-                  # pattern.
-                  '-Wno-missing-field-initializers',
-
-                  # TODO(hans): Make this list shorter eventually, http://crbug.com/504657
-                  '-Qunused-arguments',  # http://crbug.com/504658
-                  '-Wno-microsoft-enum-value',  # http://crbug.com/505296
-                  '-Wno-unknown-pragmas',  # http://crbug.com/505314
-                  '-Wno-microsoft-cast',  # http://crbug.com/550065
-                ],
-              },
-            }],
-            ['clang==1 and MSVS_VERSION == "2013"', {
-              'VCCLCompilerTool': {
-                'AdditionalOptions': [
-                  '-fmsc-version=1800',
-                ],
-              },
-            }],
-            ['clang==1 and MSVS_VERSION == "2015"', {
-              'VCCLCompilerTool': {
-                'AdditionalOptions': [
-                  '-fmsc-version=1900',
-                ],
-              },
-            }],
-          ],
-        },
-      },
-    }],  # OS=="win"
-    ['OS=="mac"', {
-      'xcode_settings': {
-        'SDKROOT': 'macosx',
-        'SYMROOT': '<(DEPTH)/xcodebuild',
-      },
-      'target_defaults': {
-        'xcode_settings': {
-          'ALWAYS_SEARCH_USER_PATHS': 'NO',
-          'GCC_C_LANGUAGE_STANDARD': 'c99',         # -std=c99
-          'GCC_CW_ASM_SYNTAX': 'NO',                # No -fasm-blocks
-          'GCC_DYNAMIC_NO_PIC': 'NO',               # No -mdynamic-no-pic
-                                                    # (Equivalent to -fPIC)
-          'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',        # -fno-exceptions
-          'GCC_ENABLE_CPP_RTTI': 'NO',              # -fno-rtti
-          'GCC_ENABLE_PASCAL_STRINGS': 'NO',        # No -mpascal-strings
-          # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden
-          'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',
-          'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES',      # -fvisibility=hidden
-          'GCC_THREADSAFE_STATICS': 'NO',           # -fno-threadsafe-statics
-          'GCC_WARN_NON_VIRTUAL_DESTRUCTOR': 'YES', # -Wnon-virtual-dtor
-          # MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min
-          'MACOSX_DEPLOYMENT_TARGET': '<(mac_deployment_target)',
-          'PREBINDING': 'NO',                       # No -Wl,-prebind
-          'SYMROOT': '<(DEPTH)/xcodebuild',
-          'USE_HEADERMAP': 'NO',
-          'OTHER_CFLAGS': [
-            '-fno-strict-aliasing',
-          ],
-          'WARNING_CFLAGS': [
-            '-Wall',
-            '-Wendif-labels',
-            '-Wno-unused-parameter',
-            # Don't warn about the "struct foo f = {0};" initialization pattern.
-            '-Wno-missing-field-initializers',
-            '-Wno-gnu-zero-variadic-macro-arguments',
-          ],
-        },
-        'conditions': [
-          ['werror==""', {
-            'xcode_settings': {'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO'},
-          }, {
-            'xcode_settings': {'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES'},
-          }],
-          ['clang==1', {
-            'xcode_settings': {
-              'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0',
-              'CLANG_CXX_LANGUAGE_STANDARD': 'c++11',  # -std=c++11
-            },
-            'conditions': [
-              ['clang_xcode==0', {
-                'xcode_settings': {
-                  'CC': '<(clang_dir)/bin/clang',
-                  'LDPLUSPLUS': '<(clang_dir)/bin/clang++',
-                  'CLANG_CXX_LIBRARY': 'libc++'
-                },
-              }],
-              ['v8_target_arch=="x64" or v8_target_arch=="arm64" \
-                or v8_target_arch=="mips64el"', {
-                'xcode_settings': {'WARNING_CFLAGS': ['-Wshorten-64-to-32']},
-              }],
-            ],
-          }],
-        ],
-        'target_conditions': [
-          ['_type!="static_library"', {
-            'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},
-          }],
-        ],  # target_conditions
-      },  # target_defaults
-    }],  # OS=="mac"
-    ['OS=="android"', {
-      'target_defaults': {
-        'defines': [
-          'ANDROID',
-        ],
-        'configurations': {
-          'Release': {
-            'cflags': [
-              '-fomit-frame-pointer',
-            ],
-          },  # Release
-        },  # configurations
-        'cflags': [ '-Wno-abi', '-Wall', '-W', '-Wno-unused-parameter'],
-        'cflags_cc': [ '-Wnon-virtual-dtor', '-fno-rtti', '-fno-exceptions',
-                       '-std=gnu++11' ],
-        'target_conditions': [
-          ['_toolset=="target"', {
-            'cflags!': [
-              '-pthread',  # Not supported by Android toolchain.
-            ],
-            'cflags': [
-              '-ffunction-sections',
-              '-funwind-tables',
-              '-fstack-protector',
-              '-fno-short-enums',
-              '-finline-limit=64',
-              '-Wa,--noexecstack',
-              '--sysroot=<(android_sysroot)',
-            ],
-            'cflags_cc': [
-              '-isystem<(android_libcpp_include)',
-              '-isystem<(android_libcpp_abi_include)',
-              '-isystem<(android_support_include)',
-            ],
-            'defines': [
-              'ANDROID',
-              #'__GNU_SOURCE=1',  # Necessary for clone()
-              'HAVE_OFF64_T',
-              'HAVE_SYS_UIO_H',
-              'ANDROID_BINSIZE_HACK', # Enable temporary hacks to reduce binsize.
-              'ANDROID_NDK_VERSION=<(android_ndk_version)',
-            ],
-            'ldflags!': [
-              '-pthread',  # Not supported by Android toolchain.
-            ],
-            'ldflags': [
-              '-Wl,--no-undefined',
-              '--sysroot=<(android_sysroot)',
-              '-nostdlib',
-            ],
-            'libraries!': [
-                '-lrt',  # librt is built into Bionic.
-                # Not supported by Android toolchain.
-                # Where do these come from?  Can't find references in
-                # any Chromium gyp or gypi file.  Maybe they come from
-                # gyp itself?
-                '-lpthread', '-lnss3', '-lnssutil3', '-lsmime3', '-lplds4', '-lplc4', '-lnspr4',
-              ],
-              'libraries': [
-                '-l<(android_libcpp_library)',
-                '-latomic',
-                # Manually link the libgcc.a that the cross compiler uses.
-                '<!(<(android_toolchain)/*-gcc -print-libgcc-file-name)',
-                '-lc',
-                '-ldl',
-                '-lm',
-            ],
-            'conditions': [
-              ['target_arch == "arm"', {
-                'ldflags': [
-                  # Enable identical code folding to reduce size.
-                  '-Wl,--icf=safe',
-                ],
-              }],
-              ['target_arch=="arm" and arm_version==7', {
-                'cflags': [
-                  '-march=armv7-a',
-                  '-mtune=cortex-a8',
-                  '-mfpu=vfp3',
-                ],
-                'ldflags': [
-                  '-L<(android_libcpp_libs)/armeabi-v7a',
-                ],
-              }],
-              ['target_arch=="arm" and arm_version < 7', {
-                'ldflags': [
-                  '-L<(android_libcpp_libs)/armeabi',
-                ],
-              }],
-              ['target_arch=="x64"', {
-                'ldflags': [
-                  '-L<(android_libcpp_libs)/x86_64',
-                ],
-              }],
-              ['target_arch=="arm64"', {
-                'ldflags': [
-                  '-L<(android_libcpp_libs)/arm64-v8a',
-                ],
-              }],
-              ['target_arch=="ia32"', {
-                # The x86 toolchain currently has problems with stack-protector.
-                'cflags!': [
-                  '-fstack-protector',
-                ],
-                'cflags': [
-                  '-fno-stack-protector',
-                ],
-                'ldflags': [
-                  '-L<(android_libcpp_libs)/x86',
-                ],
-              }],
-              ['target_arch=="mipsel"', {
-                # The mips toolchain currently has problems with stack-protector.
-                'cflags!': [
-                  '-fstack-protector',
-                ],
-                'cflags': [
-                  '-fno-stack-protector',
-                ],
-                'ldflags': [
-                  '-L<(android_libcpp_libs)/mips',
-                ],
-              }],
-              ['(target_arch=="arm" or target_arch=="arm64" or target_arch=="x64" or target_arch=="ia32") and component!="shared_library"', {
-                'cflags': [
-                  '-fPIE',
-                ],
-                'ldflags': [
-                  '-pie',
-                ],
-              }],
-            ],
-            'target_conditions': [
-              ['_type=="executable"', {
-                'conditions': [
-                  ['target_arch=="arm64" or target_arch=="x64"', {
-                    'ldflags': [
-                      '-Wl,-dynamic-linker,/system/bin/linker64',
-                    ],
-                  }, {
-                    'ldflags': [
-                      '-Wl,-dynamic-linker,/system/bin/linker',
-                    ],
-                  }]
-                ],
-                'ldflags': [
-                  '-Bdynamic',
-                  '-Wl,-z,nocopyreloc',
-                  # crtbegin_dynamic.o should be the last item in ldflags.
-                  '<(android_lib)/crtbegin_dynamic.o',
-                ],
-                'libraries': [
-                  # crtend_android.o needs to be the last item in libraries.
-                  # Do not add any libraries after this!
-                  '<(android_lib)/crtend_android.o',
-                ],
-              }],
-              ['_type=="shared_library"', {
-                'ldflags': [
-                  '-Wl,-shared,-Bsymbolic',
-                  '<(android_lib)/crtbegin_so.o',
-                ],
-              }],
-              ['_type=="static_library"', {
-                'ldflags': [
-                  # Don't export symbols from statically linked libraries.
-                  '-Wl,--exclude-libs=ALL',
-                ],
-              }],
-            ],
-          }],  # _toolset=="target"
-          # Settings for building host targets using the system toolchain.
-          ['_toolset=="host"', {
-            'cflags': [ '-pthread' ],
-            'ldflags': [ '-pthread' ],
-            'ldflags!': [
-              '-Wl,-z,noexecstack',
-              '-Wl,--gc-sections',
-              '-Wl,-O1',
-              '-Wl,--as-needed',
-            ],
-          }],
-        ],  # target_conditions
-      },  # target_defaults
-    }],  # OS=="android"
-    ['OS=="android" and clang==0', {
-      # Hardcode the compiler names in the Makefile so that
-      # it won't depend on the environment at make time.
-      'make_global_settings': [
-        ['LD', '<!(/bin/echo -n <(android_toolchain)/../*/bin/ld)'],
-        ['RANLIB', '<!(/bin/echo -n <(android_toolchain)/../*/bin/ranlib)'],
-        ['CC', '<!(/bin/echo -n <(android_toolchain)/*-gcc)'],
-        ['CXX', '<!(/bin/echo -n <(android_toolchain)/*-g++)'],
-        ['LD.host', '<(host_ld)'],
-        ['RANLIB.host', '<(host_ranlib)'],
-        ['CC.host', '<(host_cc)'],
-        ['CXX.host', '<(host_cxx)'],
-      ],
-    }],
-    ['clang!=1 and host_clang==1 and target_arch!="ia32" and target_arch!="x64"', {
-      'make_global_settings': [
-        ['CC.host', '<(clang_dir)/bin/clang'],
-        ['CXX.host', '<(clang_dir)/bin/clang++'],
-      ],
-    }],
-    ['clang==0 and host_clang==1 and target_arch!="ia32" and target_arch!="x64"', {
-      'target_conditions': [
-        ['_toolset=="host"', {
-          'cflags_cc': [ '-std=gnu++11', ],
-        }],
-      ],
-      'target_defaults': {
-        'target_conditions': [
-          ['_toolset=="host"', { 'cflags!': [ '-Wno-unused-local-typedefs' ]}],
-        ],
-      },
-    }],
-    ['clang==1 and "<(GENERATOR)"=="ninja"', {
-      # See http://crbug.com/110262
-      'target_defaults': {
-        'cflags': [ '-fcolor-diagnostics' ],
-        'xcode_settings': { 'OTHER_CFLAGS': [ '-fcolor-diagnostics' ] },
-      },
-    }],
-    ['clang==1 and ((OS!="mac" and OS!="ios") or clang_xcode==0) '
-        'and OS!="win" and "<(GENERATOR)"=="make"', {
-      'make_global_settings': [
-        ['CC', '<(clang_dir)/bin/clang'],
-        ['CXX', '<(clang_dir)/bin/clang++'],
-        ['CC.host', '$(CC)'],
-        ['CXX.host', '$(CXX)'],
-      ],
-    }],
-    ['clang==1 and ((OS!="mac" and OS!="ios") or clang_xcode==0) '
-        'and OS!="win" and "<(GENERATOR)"=="ninja"', {
-      'make_global_settings': [
-        ['CC', '<(clang_dir)/bin/clang'],
-        ['CXX', '<(clang_dir)/bin/clang++'],
-        ['CC.host', '$(CC)'],
-        ['CXX.host', '$(CXX)'],
-      ],
-    }],
-    ['clang==1 and OS=="win"', {
-      'make_global_settings': [
-        # On Windows, gyp's ninja generator only looks at CC.
-        ['CC', '<(clang_dir)/bin/clang-cl'],
-      ],
-    }],
-    ['OS=="linux" and target_arch=="arm" and host_arch!="arm" and clang==0 and "<(GENERATOR)"=="ninja"', {
-      # Set default ARM cross tools on linux.  These can be overridden
-      # using CC,CXX,CC.host and CXX.host environment variables.
-      'make_global_settings': [
-        ['CC', '<!(which arm-linux-gnueabihf-gcc)'],
-        ['CXX', '<!(which arm-linux-gnueabihf-g++)'],
-        ['CC.host', '<(host_cc)'],
-        ['CXX.host', '<(host_cxx)'],
-      ],
-    }],
-    # TODO(yyanagisawa): supports GENERATOR==make
-    #  make generator doesn't support CC_wrapper without CC
-    #  in make_global_settings yet.
-    ['use_goma==1 and ("<(GENERATOR)"=="ninja" or clang==1)', {
-      'conditions': [
-        ['coverage==1', {
-          # Wrap goma with coverage wrapper.
-          'make_global_settings': [
-            ['CC_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],
-            ['CXX_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],
-            ['CC.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],
-            ['CXX.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py <(gomadir)/gomacc'],
-          ],
-        }, {
-          # Use only goma wrapper.
-          'make_global_settings': [
-            ['CC_wrapper', '<(gomadir)/gomacc'],
-            ['CXX_wrapper', '<(gomadir)/gomacc'],
-            ['CC.host_wrapper', '<(gomadir)/gomacc'],
-            ['CXX.host_wrapper', '<(gomadir)/gomacc'],
-          ],
-        }],
-      ],
-    }, {
-      'conditions': [
-        ['coverage==1', {
-          # Use only coverage wrapper.
-          'make_global_settings': [
-            ['CC_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],
-            ['CXX_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],
-            ['CC.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],
-            ['CXX.host_wrapper', '<(base_dir)/gypfiles/coverage_wrapper.py'],
-          ],
-        }],
-      ],
-    }],
-  ],
-}
diff --git a/third_party/v8/gypfiles/sysroot_ld_flags.sh b/third_party/v8/gypfiles/sysroot_ld_flags.sh
deleted file mode 100755
index 5cc8011..0000000
--- a/third_party/v8/gypfiles/sysroot_ld_flags.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-# Copyright 2017 the V8 project 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 for backwards-compatibility after:
-# https://codereview.chromium.org/2900193003
-
-for entry in $@; do
-  echo -L$entry
-  echo -Wl,-rpath-link=$entry
-done | xargs echo
diff --git a/third_party/v8/gypfiles/v8_external_snapshot.gypi b/third_party/v8/gypfiles/v8_external_snapshot.gypi
deleted file mode 100644
index 19c6c4b..0000000
--- a/third_party/v8/gypfiles/v8_external_snapshot.gypi
+++ /dev/null
@@ -1,201 +0,0 @@
-# Keeping this separate since Node.js does use it
-{
-  'targets': [
-    {
-      'target_name': 'v8_external_snapshot',
-      'type': 'static_library',
-      'conditions': [
-        ['v8_use_external_startup_data==1', {
-          'conditions': [
-            ['want_separate_host_toolset==1', {
-              'toolsets': ['host', 'target'],
-              'dependencies': [
-                'mksnapshot#host',
-                'js2c_extras#host',
-                'natives_blob',
-              ]
-            }, {
-               'toolsets': ['target'],
-               'dependencies': [
-                 'mksnapshot',
-                 'natives_blob',
-               ],
-             }],
-            ['component=="shared_library"', {
-              'defines': [
-                'BUILDING_V8_SHARED',
-              ],
-              'direct_dependent_settings': {
-                'defines': [
-                  'USING_V8_SHARED',
-                ],
-              },
-            }],
-          ],
-          'dependencies': [
-            'v8_base',
-          ],
-          'sources': [
-            '<(V8_ROOT)/src/setup-isolate-deserialize.cc',
-            '<(V8_ROOT)/src/snapshot/embedded-empty.cc',
-            '<(V8_ROOT)/src/snapshot/natives-external.cc',
-            '<(V8_ROOT)/src/snapshot/snapshot-external.cc',
-            '<(embedded_builtins_snapshot_src)',
-          ],
-          'actions': [
-            {
-              'action_name': 'run_mksnapshot (external)',
-              'inputs': [
-                '<(mksnapshot_exec)',
-              ],
-              'variables': {
-                'mksnapshot_flags': [],
-                'conditions': [
-                  ['v8_random_seed!=0', {
-                    'mksnapshot_flags': ['--random-seed', '<(v8_random_seed)'],
-                  }],
-                  ['v8_vector_stores!=0', {
-                    'mksnapshot_flags': ['--vector-stores'],
-                  }],
-                  ['v8_os_page_size!=0', {
-                    'mksnapshot_flags': ['--v8_os_page_size', '<(v8_os_page_size)'],
-                  }],
-                  ['v8_enable_embedded_builtins=1', {
-                    # 'embedded_builtins_snapshot_src': [ "$target_gen_dir/embedded${suffix}.cc" ],
-                    # 'mksnapshot_flags':  ["--embedded_src", "$target_gen_dir/embedded${suffix}.cc",],
-                    # if (invoker.embedded_variant != "") {
-                    #   args += [
-                    #     "--embedded_variant",
-                    #     invoker.embedded_variant,
-                    #   ]
-                    # }
-                  },
-                   ],
-                ],
-              },
-              'conditions': [
-                ['v8_embed_script!=""', {
-                  'inputs': [
-                    '<(v8_embed_script)',
-                  ],
-                }],
-                ['want_separate_host_toolset==1', {
-                  'target_conditions': [
-                    ['_toolset=="host"', {
-                      'outputs': [
-                        '<(PRODUCT_DIR)/snapshot_blob_host.bin',
-                        '<(embedded_builtins_snapshot_src)'
-                      ],
-                      'action': [
-                        '<(mksnapshot_exec)',
-                        '<@(mksnapshot_flags)',
-                        '--startup_blob', '<(PRODUCT_DIR)/snapshot_blob_host.bin',
-                        '<(embed_script)',
-                        '<(warmup_script)',
-                      ],
-                    }, {
-                       'outputs': [
-                         '<(PRODUCT_DIR)/snapshot_blob.bin',
-                       ],
-                       'action': [
-                         '<(mksnapshot_exec)',
-                         '<@(mksnapshot_flags)',
-                         '--startup_blob', '<(PRODUCT_DIR)/snapshot_blob.bin',
-                         '<(embed_script)',
-                         '<(warmup_script)',
-                       ],
-                     }],
-                  ],
-                }, {
-                   'outputs': [
-                     '<(PRODUCT_DIR)/snapshot_blob.bin',
-                     '<(embedded_builtins_snapshot_src)'
-                   ],
-                   'action': [
-                     '<(mksnapshot_exec)',
-                     '<@(mksnapshot_flags)',
-                     '--startup_blob', '<(PRODUCT_DIR)/snapshot_blob.bin',
-                     '<(embed_script)',
-                     '<(warmup_script)',
-                   ],
-                 }],
-              ],
-            },
-          ],
-        }],
-      ],
-    },  # v8_external_snapshot
-    {
-      'target_name': 'natives_blob',
-      'type': 'none',
-      'conditions': [
-        ['want_separate_host_toolset==1', {
-          'toolsets': ['host', 'target'],
-        }, {
-           'toolsets': ['target'],
-         }],
-        ['v8_use_external_startup_data==1', {
-          'conditions': [
-            ['want_separate_host_toolset==1', {
-              'dependencies': ['js2c_extras#host'],
-            }],
-          ],
-          'actions': [
-            {
-              'action_name': 'js2c_extras_bin',
-              'inputs': [
-                '<(V8_ROOT)/tools/js2c.py',
-                '<@(v8_extra_library_files)',
-              ],
-              'outputs': ['<(SHARED_INTERMEDIATE_DIR)/libraries-extras.bin'],
-              'action': [
-                'python2',
-                '<(V8_ROOT)/tools/js2c.py',
-                '<(SHARED_INTERMEDIATE_DIR)/extras-libraries.cc',
-                'EXTRAS',
-                '<@(v8_extra_library_files)',
-                '--startup_blob', '<@(_outputs)',
-                '--nojs',
-              ],
-            },
-            {
-              'action_name': 'concatenate_natives_blob',
-              'inputs': [
-                '<(V8_ROOT)/tools/concatenate-files.py',
-                '<(SHARED_INTERMEDIATE_DIR)/libraries-extras.bin',
-              ],
-              'conditions': [
-                ['want_separate_host_toolset==1', {
-                  'target_conditions': [
-                    ['_toolset=="host"', {
-                      'outputs': [
-                        '<(PRODUCT_DIR)/natives_blob_host.bin',
-                      ],
-                      'action': [
-                        'python2', '<@(_inputs)', '<(PRODUCT_DIR)/natives_blob_host.bin'
-                      ],
-                    }, {
-                       'outputs': [
-                         '<(PRODUCT_DIR)/natives_blob.bin',
-                       ],
-                       'action': [
-                         'python2', '<@(_inputs)', '<(PRODUCT_DIR)/natives_blob.bin'
-                       ],
-                     }],
-                  ],
-                }, {
-                   'outputs': [
-                     '<(PRODUCT_DIR)/natives_blob.bin',
-                   ],
-                   'action': [
-                     'python2', '<@(_inputs)', '<(PRODUCT_DIR)/natives_blob.bin'
-                   ],
-                 }],
-              ],
-            },
-          ],
-        }],
-      ]
-    },  # natives_blob
-  ]
-}
diff --git a/third_party/v8/gypfiles/win/msvs_dependencies.isolate b/third_party/v8/gypfiles/win/msvs_dependencies.isolate
deleted file mode 100644
index 2859126..0000000
--- a/third_party/v8/gypfiles/win/msvs_dependencies.isolate
+++ /dev/null
@@ -1,97 +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.
-
-# TODO(machenbach): Remove this when crbug.com/669910 is resolved.
-{
-  'conditions': [
-    # Copy the VS runtime DLLs into the isolate so that they
-    # don't have to be preinstalled on the target machine.
-    #
-    # VS2013 runtimes
-    ['OS=="win" and msvs_version==2013 and component=="shared_library" and (CONFIGURATION_NAME=="Debug" or CONFIGURATION_NAME=="Debug_x64")', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/msvcp120d.dll',
-          '<(PRODUCT_DIR)/msvcr120d.dll',
-        ],
-      },
-    }],
-    ['OS=="win" and msvs_version==2013 and component=="shared_library" and (CONFIGURATION_NAME=="Release" or CONFIGURATION_NAME=="Release_x64")', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/msvcp120.dll',
-          '<(PRODUCT_DIR)/msvcr120.dll',
-        ],
-      },
-    }],
-    # VS2015/2017 runtimes
-    ['OS=="win" and (msvs_version==2015 or msvs_version==2017) and component=="shared_library" and (CONFIGURATION_NAME=="Debug" or CONFIGURATION_NAME=="Debug_x64")', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/msvcp140d.dll',
-          '<(PRODUCT_DIR)/vccorlib140d.dll',
-          '<(PRODUCT_DIR)/vcruntime140d.dll',
-          '<(PRODUCT_DIR)/ucrtbased.dll',
-        ],
-      },
-    }],
-    ['OS=="win" and (msvs_version==2015 or msvs_version==2017) and component=="shared_library" and (CONFIGURATION_NAME=="Release" or CONFIGURATION_NAME=="Release_x64")', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/msvcp140.dll',
-          '<(PRODUCT_DIR)/vccorlib140.dll',
-          '<(PRODUCT_DIR)/vcruntime140.dll',
-          '<(PRODUCT_DIR)/ucrtbase.dll',
-        ],
-      },
-    }],
-    ['OS=="win" and (msvs_version==2015 or msvs_version==2017) and component=="shared_library"', {
-      # Windows 10 Universal C Runtime binaries.
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/api-ms-win-core-console-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-datetime-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-debug-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-errorhandling-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-file-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-file-l1-2-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-file-l2-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-handle-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-heap-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-interlocked-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-libraryloader-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-localization-l1-2-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-memory-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-namedpipe-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-processenvironment-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-processthreads-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-processthreads-l1-1-1.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-profile-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-rtlsupport-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-string-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-synch-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-synch-l1-2-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-sysinfo-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-timezone-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-core-util-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-conio-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-convert-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-environment-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-filesystem-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-heap-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-locale-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-math-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-multibyte-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-private-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-process-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-runtime-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-stdio-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-string-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-time-l1-1-0.dll',
-          '<(PRODUCT_DIR)/api-ms-win-crt-utility-l1-1-0.dll',
-        ],
-      },
-    }],
-  ],
-}
diff --git a/third_party/v8/src/base/platform/platform-starboard.cc b/third_party/v8/src/base/platform/platform-starboard.cc
index 94b3246..b3103fd 100644
--- a/third_party/v8/src/base/platform/platform-starboard.cc
+++ b/third_party/v8/src/base/platform/platform-starboard.cc
@@ -81,18 +81,12 @@
 }
 
 int OS::GetUserTime(uint32_t* secs, uint32_t* usecs) {
-#if SB_API_VERSION >= 12
   if (!SbTimeIsTimeThreadNowSupported()) return -1;
-#endif
 
-#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW)
   SbTimeMonotonic thread_now = SbTimeGetMonotonicThreadNow();
   *secs = thread_now / kSbTimeSecond;
   *usecs = thread_now % kSbTimeSecond;
   return 0;
-#else
-  return -1;
-#endif
 }
 
 double OS::TimeCurrentMillis() { return Time::Now().ToJsTime(); }
diff --git a/third_party/v8/src/base/platform/time.cc b/third_party/v8/src/base/platform/time.cc
index 78574b7..97f2a90 100644
--- a/third_party/v8/src/base/platform/time.cc
+++ b/third_party/v8/src/base/platform/time.cc
@@ -753,13 +753,7 @@
 
 bool ThreadTicks::IsSupported() {
 #if V8_OS_STARBOARD
-#if SB_API_VERSION >= 12
   return SbTimeIsTimeThreadNowSupported();
-#elif SB_HAS(TIME_THREAD_NOW)
-  return true;
-#else
-  return false;
-#endif
 #elif(defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
     defined(V8_OS_MACOSX) || defined(V8_OS_ANDROID) || defined(V8_OS_SOLARIS)
   return true;
@@ -773,15 +767,9 @@
 
 ThreadTicks ThreadTicks::Now() {
 #if V8_OS_STARBOARD
-#if SB_API_VERSION >= 12
   if (SbTimeIsTimeThreadNowSupported())
     return ThreadTicks(SbTimeGetMonotonicThreadNow());
   UNREACHABLE();
-#elif SB_HAS(TIME_THREAD_NOW)
-  return ThreadTicks(SbTimeGetMonotonicThreadNow());
-#else
-  UNREACHABLE();
-#endif
 #elif V8_OS_MACOSX
   return ThreadTicks(ComputeThreadTicks());
 #elif(defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
diff --git a/third_party/v8/src/d8.gyp b/third_party/v8/src/d8.gyp
deleted file mode 100644
index 29076bd..0000000
--- a/third_party/v8/src/d8.gyp
+++ /dev/null
@@ -1,176 +0,0 @@
-# Copyright 2012 the V8 project 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.
-
-{
-  'variables': {
-    'v8_code': 1,
-    # Enable support for Intel VTune. Supported on x86/x64 only
-    'v8_enable_vtunejit%': 0,
-    'v8_enable_i18n_support%': 1,
-
-    'test_isolation_mode': 'noop',
-    'v8_use_snapshot': 0,
-    'v8_optimized_debug': 0,
-    'v8_use_external_startup_data': 0,
-    # TODO: Enable i18n support.
-    'v8_enable_i18n_support': 0,
-  },
-  'target_defaults': {
-    'defines': [
-      'V8_OS_STARBOARD=1',
-    ],
-   },
-  'includes': ['../toolchain.gypi', '../gypfiles/features.gypi'],
-  'targets': [
-    {
-      'target_name': 'd8',
-      'type': 'executable',
-      'dependencies': [
-        'v8.gyp:v8',
-        'v8.gyp:v8_libbase',
-        'v8.gyp:v8_libplatform',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-      ],
-      # Generated source files need this explicitly:
-      'include_dirs+': [
-        '..',
-        '<(DEPTH)',
-      ],
-      'sources': [
-        'd8.h',
-        'd8.cc',
-        'd8-console.h',
-        'd8-console.cc',
-        '<(SHARED_INTERMEDIATE_DIR)/d8-js.cc',
-      ],
-      'conditions': [
-        [ 'want_separate_host_toolset==1', {
-          'toolsets': [ 'target', ],
-          'dependencies': [
-            'd8_js2c#host',
-          ],
-        }, {
-          'dependencies': [
-            'd8_js2c',
-          ],
-        }],
-        # TODO: Remove OS=="starboard" after starboardization.
-        ['(OS=="linux" or OS=="mac" or OS=="freebsd" or OS=="netbsd" \
-           or OS=="openbsd" or OS=="solaris" or OS=="android" \
-           or OS=="qnx" or OS=="aix" \
-           or OS=="starboard")', {
-             'sources': [ 'd8-posix.cc', ]
-           }],
-        [ 'OS=="win"', {
-          'sources': [ 'd8-windows.cc', ]
-        }],
-        [ 'component!="shared_library"', {
-          'conditions': [
-            [ 'v8_postmortem_support=="true"', {
-              'xcode_settings': {
-                'OTHER_LDFLAGS': [
-                   '-Wl,-force_load,<(PRODUCT_DIR)/libv8_base.a'
-                ],
-              },
-            }],
-          ],
-        }],
-        ['v8_enable_vtunejit==1', {
-          'dependencies': [
-            '../src/third_party/vtune/v8vtune.gyp:v8_vtune',
-          ],
-        }],
-        ['v8_enable_i18n_support==1', {
-          'dependencies': [
-            '<(icu_gyp_path):icui18n',
-            '<(icu_gyp_path):icuuc',
-          ],
-        }],
-        ['OS=="win" and v8_enable_i18n_support==1', {
-          'dependencies': [
-            '<(icu_gyp_path):icudata',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'd8_js2c',
-      'type': 'none',
-      'variables': {
-        'js_files': [
-          'd8.js',
-          'js/macros.py',
-        ],
-      },
-      'conditions': [
-        [ 'want_separate_host_toolset==1', {
-          'toolsets': ['host'],
-        }, {
-          'toolsets': ['target'],
-        }]
-      ],
-      'actions': [
-        {
-          'action_name': 'd8_js2c',
-          'inputs': [
-            '../tools/js2c.py',
-            '<@(js_files)',
-          ],
-          'outputs': [
-            '<(SHARED_INTERMEDIATE_DIR)/d8-js.cc',
-          ],
-          'action': [
-            'python2',
-            '../tools/js2c.py',
-            '<@(_outputs)',
-            'D8',
-            '<@(js_files)'
-          ],
-        },
-      ],
-    },
-  ],
-  'conditions': [
-    ['test_isolation_mode != "noop"', {
-      'targets': [
-        {
-          'target_name': 'd8_run',
-          'type': 'none',
-          'dependencies': [
-            'd8',
-          ],
-          'includes': [
-            '../gypfiles/isolate.gypi',
-          ],
-          'sources': [
-            'd8.isolate',
-          ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/third_party/v8/src/inspector/inspector.gyp b/third_party/v8/src/inspector/inspector.gyp
deleted file mode 100644
index 5890f71..0000000
--- a/third_party/v8/src/inspector/inspector.gyp
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2016 the V8 project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'includes': [
-    'inspector.gypi',
-  ],
-  'targets': [
-    { 'target_name': 'protocol_compatibility',
-      'type': 'none',
-      'toolsets': ['target'],
-      'actions': [
-        {
-          'action_name': 'protocol_compatibility',
-          'inputs': [
-            '<(v8_inspector_js_protocol)',
-          ],
-          'outputs': [
-            '<@(inspector_generated_output_root)/src/js_protocol.stamp',
-          ],
-          'action': [
-            'python2',
-            '<(inspector_protocol_path)/check_protocol_compatibility.py',
-            '--stamp', '<@(_outputs)',
-            '<@(_inputs)',
-          ],
-          'message': 'Checking inspector protocol compatibility',
-        },
-      ]
-    },
-    { 'target_name': 'protocol_generated_sources',
-      'type': 'none',
-      'dependencies': [ 'protocol_compatibility' ],
-      'actions': [
-        {
-          'action_name': 'protocol_generated_sources',
-          'inputs': [
-            '<(v8_inspector_js_protocol)',
-            '<(inspector_path)/inspector_protocol_config.json',
-            '<@(inspector_protocol_files)',
-          ],
-          'outputs': [
-            '<@(inspector_generated_sources)',
-          ],
-          'process_outputs_as_sources': 1,
-          'action': [
-            'python2',
-            '<(inspector_protocol_path)/code_generator.py',
-            '--jinja_dir', '<(DEPTH)/third_party',
-            '--output_base', '<(inspector_generated_output_root)/src/inspector',
-            '--config', '<(inspector_path)/inspector_protocol_config.json',
-            '--inspector_protocol_dir', 'v8/third_party/inspector_protocol',
-          ],
-          'message': 'Generating inspector protocol sources from protocol json',
-        },
-      ]
-    },
-  ],
-}
diff --git a/third_party/v8/src/inspector/inspector.gypi b/third_party/v8/src/inspector/inspector.gypi
deleted file mode 100644
index 0195e68..0000000
--- a/third_party/v8/src/inspector/inspector.gypi
+++ /dev/null
@@ -1,141 +0,0 @@
-# Copyright 2016 the V8 project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
-  'variables': {
-    'V8_ROOT': '<(DEPTH)/third_party/v8',
-    'inspector_protocol_path': '<(V8_ROOT)/third_party/inspector_protocol',
-    'inspector_protocol_files': [
-      '<(inspector_protocol_path)/lib/base_string_adapter_cc.template',
-      '<(inspector_protocol_path)/lib/base_string_adapter_h.template',
-      '<(inspector_protocol_path)/lib/Forward_h.template',
-      '<(inspector_protocol_path)/lib/Object_cpp.template',
-      '<(inspector_protocol_path)/lib/Object_h.template',
-      '<(inspector_protocol_path)/lib/Protocol_cpp.template',
-      '<(inspector_protocol_path)/lib/ValueConversions_h.template',
-      '<(inspector_protocol_path)/lib/Values_cpp.template',
-      '<(inspector_protocol_path)/lib/Values_h.template',
-      '<(inspector_protocol_path)/templates/Exported_h.template',
-      '<(inspector_protocol_path)/templates/Imported_h.template',
-      '<(inspector_protocol_path)/templates/TypeBuilder_cpp.template',
-      '<(inspector_protocol_path)/templates/TypeBuilder_h.template',
-      '<(inspector_protocol_path)/code_generator.py',
-    ],
-    'inspector_path': '<(V8_ROOT)/src/inspector',
-    'inspector_generated_output_root': '<(SHARED_INTERMEDIATE_DIR)/inspector-generated-output-root',
-    'inspector_generated_sources': [
-      '<(inspector_generated_output_root)/src/inspector/protocol/Forward.h',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Protocol.cpp',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Protocol.h',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Console.cpp',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Console.h',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Debugger.cpp',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Debugger.h',
-      '<(inspector_generated_output_root)/src/inspector/protocol/HeapProfiler.cpp',
-      '<(inspector_generated_output_root)/src/inspector/protocol/HeapProfiler.h',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Profiler.cpp',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Profiler.h',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Runtime.cpp',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Runtime.h',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Schema.cpp',
-      '<(inspector_generated_output_root)/src/inspector/protocol/Schema.h',
-      '<(inspector_generated_output_root)/include/inspector/Debugger.h',
-      '<(inspector_generated_output_root)/include/inspector/Runtime.h',
-      '<(inspector_generated_output_root)/include/inspector/Schema.h',
-    ],
-
-    'inspector_all_sources': [
-      '<@(inspector_generated_sources)',
-      '<(V8_ROOT)/include/v8-inspector.h',
-      '<(V8_ROOT)/include/v8-inspector-protocol.h',
-      '<(V8_ROOT)/src/inspector/custom-preview.cc',
-      '<(V8_ROOT)/src/inspector/custom-preview.h',
-      '<(V8_ROOT)/src/inspector/injected-script.cc',
-      '<(V8_ROOT)/src/inspector/injected-script.h',
-      '<(V8_ROOT)/src/inspector/inspected-context.cc',
-      '<(V8_ROOT)/src/inspector/inspected-context.h',
-      '<(V8_ROOT)/src/inspector/remote-object-id.cc',
-      '<(V8_ROOT)/src/inspector/remote-object-id.h',
-      '<(V8_ROOT)/src/inspector/search-util.cc',
-      '<(V8_ROOT)/src/inspector/search-util.h',
-      '<(V8_ROOT)/src/inspector/string-16.cc',
-      '<(V8_ROOT)/src/inspector/string-16.h',
-      '<(V8_ROOT)/src/inspector/string-util.cc',
-      '<(V8_ROOT)/src/inspector/string-util.h',
-      '<(V8_ROOT)/src/inspector/test-interface.cc',
-      '<(V8_ROOT)/src/inspector/test-interface.h',
-      '<(V8_ROOT)/src/inspector/v8-console.cc',
-      '<(V8_ROOT)/src/inspector/v8-console.h',
-      '<(V8_ROOT)/src/inspector/v8-console-agent-impl.cc',
-      '<(V8_ROOT)/src/inspector/v8-console-agent-impl.h',
-      '<(V8_ROOT)/src/inspector/v8-console-message.cc',
-      '<(V8_ROOT)/src/inspector/v8-console-message.h',
-      '<(V8_ROOT)/src/inspector/v8-debugger.cc',
-      '<(V8_ROOT)/src/inspector/v8-debugger.h',
-      '<(V8_ROOT)/src/inspector/v8-debugger-agent-impl.cc',
-      '<(V8_ROOT)/src/inspector/v8-debugger-agent-impl.h',
-      '<(V8_ROOT)/src/inspector/v8-debugger-script.cc',
-      '<(V8_ROOT)/src/inspector/v8-debugger-script.h',
-      '<(V8_ROOT)/src/inspector/v8-heap-profiler-agent-impl.cc',
-      '<(V8_ROOT)/src/inspector/v8-heap-profiler-agent-impl.h',
-      '<(V8_ROOT)/src/inspector/v8-inspector-impl.cc',
-      '<(V8_ROOT)/src/inspector/v8-inspector-impl.h',
-      '<(V8_ROOT)/src/inspector/v8-inspector-session-impl.cc',
-      '<(V8_ROOT)/src/inspector/v8-inspector-session-impl.h',
-      '<(V8_ROOT)/src/inspector/v8-profiler-agent-impl.cc',
-      '<(V8_ROOT)/src/inspector/v8-profiler-agent-impl.h',
-      '<(V8_ROOT)/src/inspector/v8-regex.cc',
-      '<(V8_ROOT)/src/inspector/v8-regex.h',
-      '<(V8_ROOT)/src/inspector/v8-runtime-agent-impl.cc',
-      '<(V8_ROOT)/src/inspector/v8-runtime-agent-impl.h',
-      '<(V8_ROOT)/src/inspector/v8-schema-agent-impl.cc',
-      '<(V8_ROOT)/src/inspector/v8-schema-agent-impl.h',
-      '<(V8_ROOT)/src/inspector/v8-stack-trace-impl.cc',
-      '<(V8_ROOT)/src/inspector/v8-stack-trace-impl.h',
-      '<(V8_ROOT)/src/inspector/v8-value-utils.cc',
-      '<(V8_ROOT)/src/inspector/v8-value-utils.h',
-      '<(V8_ROOT)/src/inspector/value-mirror.cc',
-      '<(V8_ROOT)/src/inspector/value-mirror.h',
-      # Flat merge `third_party/inspector_protocol:inspector_string_conversions`
-      '<(inspector_path)/v8-string-conversions.cc',
-      '<(inspector_path)/v8-string-conversions.h',
-      # Flat merge `third_party/inspector_protocal:crdtp_platform`
-      '<(inspector_protocol_path)/crdtp/json_platform.h',
-      '<(inspector_protocol_path)/crdtp/json_platform_v8.cc',
-      # Flat merge `third_party/inspector_protocol:crdtp`
-      '<(inspector_protocol_path)/crdtp/cbor.cc',
-      '<(inspector_protocol_path)/crdtp/cbor.h',
-      '<(inspector_protocol_path)/crdtp/dispatch.cc',
-      '<(inspector_protocol_path)/crdtp/dispatch.h',
-      '<(inspector_protocol_path)/crdtp/error_support.cc',
-      '<(inspector_protocol_path)/crdtp/error_support.h',
-      '<(inspector_protocol_path)/crdtp/export.h',
-      '<(inspector_protocol_path)/crdtp/find_by_first.h',
-      '<(inspector_protocol_path)/crdtp/json.cc',
-      '<(inspector_protocol_path)/crdtp/json.h',
-      '<(inspector_protocol_path)/crdtp/maybe.h',
-      '<(inspector_protocol_path)/crdtp/parser_handler.h',
-      '<(inspector_protocol_path)/crdtp/protocol_core.cc',
-      '<(inspector_protocol_path)/crdtp/protocol_core.h',
-      '<(inspector_protocol_path)/crdtp/serializable.cc',
-      '<(inspector_protocol_path)/crdtp/serializable.h',
-      '<(inspector_protocol_path)/crdtp/serializer_traits.h',
-      '<(inspector_protocol_path)/crdtp/span.cc',
-      '<(inspector_protocol_path)/crdtp/span.h',
-      '<(inspector_protocol_path)/crdtp/status.cc',
-      '<(inspector_protocol_path)/crdtp/status.h',
-    ],
-    'v8_inspector_js_protocol': '<(V8_ROOT)/include/js_protocol.pdl',
-  },
-  'include_dirs': [
-    '<(inspector_generated_output_root)',
-    '<(inspector_protocol_path)',
-  ],
-  'all_dependent_settings': {
-      'include_dirs': [
-        '<(inspector_generated_output_root)',
-        '<(inspector_protocol_path)',
-      ],
-  }
-}
diff --git a/third_party/v8/test/fuzzer/fuzzer.cc b/third_party/v8/test/fuzzer/fuzzer.cc
index 96c381e..42760c5 100644
--- a/third_party/v8/test/fuzzer/fuzzer.cc
+++ b/third_party/v8/test/fuzzer/fuzzer.cc
@@ -6,6 +6,7 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <utility>
 
 extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv);
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
diff --git a/third_party/v8/toolchain.gypi b/third_party/v8/toolchain.gypi
deleted file mode 100644
index 816cecd..0000000
--- a/third_party/v8/toolchain.gypi
+++ /dev/null
@@ -1,1415 +0,0 @@
-# Copyright 2013 the V8 project 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.
-
-# Shared definitions for all V8-related targets.
-
-{
-  'variables': {
-    'msvs_use_common_release': 0,
-    'clang%': 0,
-    'asan%': 0,
-    'cfi_vptr%': 0,
-    'lsan%': 0,
-    'msan%': 0,
-    'tsan%': 0,
-    'ubsan%': 0,
-    'ubsan_vptr%': 0,
-    'has_valgrind%': 0,
-    'coverage%': 0,
-    'v8_target_arch%': '<(target_arch)',
-    'v8_host_byteorder%': 'little',
-    'force_dynamic_crt%': 0,
-
-    # Setting 'v8_can_use_vfp32dregs' to 'true' will cause V8 to use the VFP
-    # registers d16-d31 in the generated code, both in the snapshot and for the
-    # ARM target. Leaving the default value of 'false' will avoid the use of
-    # these registers in the snapshot and use CPU feature probing when running
-    # on the target.
-    'v8_can_use_vfp32dregs%': 'false',
-    'arm_test_noprobe%': 'off',
-
-    # Similar to vfp but on MIPS.
-    'v8_can_use_fpu_instructions%': 'true',
-
-    # Similar to the ARM hard float ABI but on MIPS.
-    'v8_use_mips_abi_hardfloat%': 'true',
-
-    # MIPS MSA support
-    'mips_use_msa%': 0,
-
-    # Print to stdout on Android.
-    'v8_android_log_stdout%': 0,
-
-    'v8_enable_backtrace%': 0,
-
-    # Enable profiling support. Only required on Windows.
-    'v8_enable_prof%': 0,
-
-    # Some versions of GCC 4.5 seem to need -fno-strict-aliasing.
-    'v8_no_strict_aliasing%': 0,
-
-    # Chrome needs this definition unconditionally. For standalone V8 builds,
-    # it's handled in gypfiles/standalone.gypi.
-    'want_separate_host_toolset%': 1,
-
-    # Toolset the shell binary should be compiled for. Possible values are
-    # 'host' and 'target'.
-    # The setting is ignored if want_separate_host_toolset is 0.
-    'v8_toolset_for_shell%': 'target',
-
-    'host_os%': '<(OS)',
-    'werror%': '-Werror',
-    # For a shared library build, results in "libv8-<(soname_version).so".
-    'soname_version%': '',
-
-    # Override where to find binutils
-    'binutils_dir%': '',
-
-    'conditions': [
-      ['OS=="linux" and host_arch=="x64"', {
-        'binutils_dir%': 'third_party/binutils/Linux_x64/Release/bin',
-      }],
-      ['OS=="linux" and host_arch=="x86"', {
-        'binutils_dir%': 'third_party/binutils/Linux_ia32/Release/bin',
-      }],
-    ],
-
-    # Indicates if gcmole tools are downloaded by a hook.
-    'gcmole%': 0,
-  },
-
-  # [GYP] this needs to be outside of the top level 'variables'
-  'conditions': [
-    ['host_arch=="x86" or host_arch=="x64" or \
-      host_arch=="ppc" or host_arch=="ppc64" or \
-      host_arch=="s390x" or \
-      clang==1', {
-      'variables': {
-        'host_cxx_is_biarch%': 1,
-       },
-     }, {
-      'variables': {
-        'host_cxx_is_biarch%': 0,
-      },
-    }],
-    ['target_arch=="x86" or target_arch=="x64" or \
-      target_arch=="ppc" or target_arch=="ppc64" or \
-      target_arch=="s390x" or clang==1', {
-      'variables': {
-        'target_cxx_is_biarch%': 1,
-       },
-     }, {
-      'variables': {
-        'target_cxx_is_biarch%': 0,
-      },
-    }],
-  ],
-  'target_defaults': {
-    'include_dirs': [
-      '..',
-      '<(V8_ROOT)',
-      '<(V8_ROOT)/include',
-    ],
-    'all_dependent_settings': {
-        'include_dirs': [
-          '..',
-          '<(V8_ROOT)',
-          '<(V8_ROOT)/include',
-        ],
-    },
-    'conditions': [
-      ['cobalt_config == "debug"', {
-        'defines': [
-          # 'DEBUG=1',
-          # 'OBJECT_PRINT=1',
-          'V8_ENABLE_ALLOCATION_TIMEOUT=1',
-        ],
-      }],
-    ],
-
-    'defines': [
-      'DISABLE_GRAPHS_STARBOARD',
-      'DISABLE_UNWIND_STARBOARD',
-      # On host build, V8_OS_STARBOARD or STARBOARD is not defined. We need a
-      # macro to distinguish Cobalt-only configuraitons.
-      'COMPILE_FOR_STARBOARD',
-      # 'DISABLE_WASM_STARBOARD',
-      'DISABLE_WASM_COMPILER_ISSUE_STARBOARD',
-      'NO_ARRAY_MOVE_STARBOARD',
-      # Disable mitigations for executing untrusted code.
-      # Disabled by default on x86 due to conflicting requirements with embedded
-      # builtins.
-      # Chrome enabled this by default only on Android since it doesn't support
-      # site-isolation and on simulator builds which test code generation
-      # on these platforms.
-      # Cobalt only has one isolate instance when the app is fully functioning in
-      # production so we will just disable this feature by default everywhere.
-      'DISABLE_UNTRUSTED_CODE_MITIGATIONS',
-    ],
-    'conditions': [
-      ['clang', {
-        'cflags': [ '-Werror', '-Wno-unknown-pragmas', '-Wno-invalid-offsetof'],
-        'target_conditions': [
-          ['host_os!="win"', {
-            'cflags_host': ['-Wno-invalid-offsetof'],
-          }],
-        ],
-      },{
-        'cflags!': [ '-Wall', '-Wextra' ],
-        'cflags': [ '-Wno-return-type', '-Wno-int-in-bool-context' ],
-      }],
-      ['v8_enable_pointer_compression', {
-        'defines': [
-          # enables pointer compression on 64 bit platforms for Cobalt.
-          'V8_COMPRESS_POINTERS',
-          'V8_31BIT_SMIS_ON_64BIT_ARCH',
-        ],
-      }],
-      ['v8_target_arch=="arm"', {
-        'defines': [
-          'V8_TARGET_ARCH_ARM',
-        ],
-        'conditions': [
-          [ 'arm_version==7 or arm_version=="default"', {
-            'defines': [
-              'CAN_USE_ARMV7_INSTRUCTIONS',
-            ],
-          }],
-          [ 'arm_fpu=="vfpv3-d16" or arm_fpu=="default"', {
-            'defines': [
-              'CAN_USE_VFP3_INSTRUCTIONS',
-            ],
-          }],
-          [ 'arm_fpu=="vfpv3"', {
-            'defines': [
-              'CAN_USE_VFP3_INSTRUCTIONS',
-              'CAN_USE_VFP32DREGS',
-            ],
-          }],
-          [ 'arm_fpu=="neon"', {
-            'defines': [
-              'CAN_USE_VFP3_INSTRUCTIONS',
-              'CAN_USE_VFP32DREGS',
-              'CAN_USE_NEON',
-            ],
-          }],
-          [ 'arm_test_noprobe=="on"', {
-            'defines': [
-              'ARM_TEST_NO_FEATURE_PROBE',
-            ],
-          }],
-        ],
-        'target_conditions': [
-          ['_toolset=="host"', {
-            'conditions': [
-              ['v8_target_arch==host_arch', {
-                # Host built with an Arm CXX compiler.
-                'conditions': [
-                  [ 'arm_version==7', {
-                    'cflags': ['-march=armv7-a',],
-                  }],
-                  [ 'arm_version==7 or arm_version=="default"', {
-                    'conditions': [
-                      [ 'arm_fpu!="default"', {
-                        'cflags': ['-mfpu=<(arm_fpu)',],
-                      }],
-                    ],
-                  }],
-                  [ 'arm_float_abi!="default"', {
-                    'cflags': ['-mfloat-abi=<(arm_float_abi)',],
-                  }],
-                  [ 'arm_thumb==1', {
-                    'cflags': ['-mthumb',],
-                  }],
-                  [ 'arm_thumb==0', {
-                    'cflags': ['-marm',],
-                  }],
-                ],
-              }, {
-                # 'v8_target_arch!=host_arch'
-                # Host not built with an Arm CXX compiler (simulator build).
-                'conditions': [
-                  [ 'arm_float_abi=="hard"', {
-                    'defines': [
-                      'USE_EABI_HARDFLOAT=1',
-                    ],
-                  }],
-                  [ 'arm_float_abi=="softfp" or arm_float_abi=="default"', {
-                    'defines': [
-                      'USE_EABI_HARDFLOAT=0',
-                    ],
-                  }],
-                ],
-              }],
-            ],
-          }],  # _toolset=="host"
-          ['_toolset=="target"', {
-            'conditions': [
-              ['v8_target_arch==target_arch', {
-                # Target built with an Arm CXX compiler.
-                'conditions': [
-                  [ 'arm_version==7', {
-                    'cflags': ['-march=armv7-a',],
-                  }],
-                  [ 'arm_version==7 or arm_version=="default"', {
-                    'conditions': [
-                      [ 'arm_fpu!="default"', {
-                        'cflags': ['-mfpu=<(arm_fpu)',],
-                      }],
-                    ],
-                  }],
-                  [ 'arm_float_abi!="default"', {
-                    'cflags': ['-mfloat-abi=<(arm_float_abi)',],
-                  }],
-                  [ 'arm_thumb==1', {
-                    'cflags': ['-mthumb',],
-                  }],
-                  [ 'arm_thumb==0', {
-                    'cflags': ['-marm',],
-                  }],
-                ],
-              }, {
-                # 'v8_target_arch!=target_arch'
-                # Target not built with an Arm CXX compiler (simulator build).
-                'conditions': [
-                  [ 'arm_float_abi=="hard"', {
-                    'defines': [
-                      'USE_EABI_HARDFLOAT=1',
-                    ],
-                  }],
-                  [ 'arm_float_abi=="softfp" or arm_float_abi=="default"', {
-                    'defines': [
-                      'USE_EABI_HARDFLOAT=0',
-                    ],
-                  }],
-                ],
-              }],
-            ],
-          }],  # _toolset=="target"
-        ],
-      }],  # v8_target_arch=="arm"
-      ['v8_target_arch=="arm64"', {
-        'defines': [
-          'V8_TARGET_ARCH_ARM64',
-        ],
-        'conditions': [
-          ['v8_control_flow_integrity==1', {
-            'cflags': [ '-mbranch-protection=standard' ],
-          }],
-        ],
-      }],
-      ['v8_target_arch=="s390x"', {
-        'defines': [
-          'V8_TARGET_ARCH_S390',
-        ],
-        'cflags': [ '-ffp-contract=off' ],
-        'conditions': [
-          ['v8_target_arch=="s390x"', {
-            'defines': [
-              'V8_TARGET_ARCH_S390X',
-            ],
-          }],
-          ['v8_host_byteorder=="little"', {
-            'defines': [
-              'V8_TARGET_ARCH_S390_LE_SIM',
-            ],
-          }, {
-            'cflags': [ '-march=z196' ],
-          }],
-          ],
-      }],  # s390x
-      ['v8_target_arch=="ppc" or v8_target_arch=="ppc64"', {
-        'conditions': [
-          ['v8_target_arch=="ppc"', {
-            'defines': [
-              'V8_TARGET_ARCH_PPC',
-            ],
-          }],
-          ['v8_target_arch=="ppc64"', {
-            'defines': [
-              'V8_TARGET_ARCH_PPC64',
-            ],
-          }],
-          ['v8_host_byteorder=="little"', {
-            'defines': [
-              'V8_TARGET_ARCH_PPC_LE',
-            ],
-          }],
-          ['v8_host_byteorder=="big"', {
-            'defines': [
-              'V8_TARGET_ARCH_PPC_BE',
-            ],
-            'conditions': [
-              ['OS=="aix"', {
-                # Work around AIX ceil, trunc and round oddities.
-                'cflags': [ '-mcpu=power5+ -mfprnd' ],
-              }],
-              ['OS=="aix"', {
-                # Work around AIX assembler popcntb bug.
-                'cflags': [ '-mno-popcntb' ],
-              }],
-            ],
-          }],
-        ],
-      }],  # ppc
-      ['v8_target_arch=="x86"', {
-        'defines': [
-          'V8_TARGET_ARCH_IA32',
-        ],
-      }],  # v8_target_arch=="x86"
-      ['v8_target_arch=="mips" or v8_target_arch=="mipsel" \
-        or v8_target_arch=="mips64" or v8_target_arch=="mips64el"', {
-        'target_conditions': [
-          ['_toolset=="target"', {
-            'conditions': [
-              ['v8_target_arch==target_arch', {
-                # Target built with a Mips CXX compiler.
-                'variables': {
-                  'ldso_path%': '<!(/bin/echo -n $LDSO_PATH)',
-                  'ld_r_path%': '<!(/bin/echo -n $LD_R_PATH)',
-                },
-                'conditions': [
-                  ['ldso_path!=""', {
-                    'ldflags': ['-Wl,--dynamic-linker=<(ldso_path)'],
-                  }],
-                  ['ld_r_path!=""', {
-                    'ldflags': ['-Wl,--rpath=<(ld_r_path)'],
-                  }],
-                  [ 'clang==1', {
-                    'cflags': ['-integrated-as'],
-                  }],
-                  ['OS!="mac"', {
-                    'defines': ['_MIPS_TARGET_HW',],
-                  }, {
-                    'defines': ['_MIPS_TARGET_SIMULATOR',],
-                  }],
-                ],
-              }, {
-                'defines': ['_MIPS_TARGET_SIMULATOR',],
-              }],
-            ],
-          }],  #'_toolset=="target"
-          ['_toolset=="host"', {
-            'conditions': [
-              ['v8_target_arch==target_arch and OS!="mac"', {
-                'defines': ['_MIPS_TARGET_HW',],
-              }, {
-                'defines': ['_MIPS_TARGET_SIMULATOR',],
-              }],
-            ],
-          }],  #'_toolset=="host"
-        ],
-      }],
-      ['v8_target_arch=="mips"', {
-        'defines': [
-          'V8_TARGET_ARCH_MIPS',
-        ],
-        'conditions': [
-          [ 'v8_can_use_fpu_instructions=="true"', {
-            'defines': [
-              'CAN_USE_FPU_INSTRUCTIONS',
-            ],
-          }],
-          [ 'v8_use_mips_abi_hardfloat=="true"', {
-            'defines': [
-              '__mips_hard_float=1',
-              'CAN_USE_FPU_INSTRUCTIONS',
-            ],
-          }, {
-            'defines': [
-              '__mips_soft_float=1'
-            ]
-          }],
-        ],
-        'target_conditions': [
-          ['_toolset=="target"', {
-            'conditions': [
-              ['v8_target_arch==target_arch', {
-                # Target built with a Mips CXX compiler.
-                'cflags': [
-                  '-EB',
-                  '-Wno-error=array-bounds',  # Workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
-                ],
-                'ldflags': ['-EB'],
-                'conditions': [
-                  [ 'v8_use_mips_abi_hardfloat=="true"', {
-                    'cflags': ['-mhard-float'],
-                    'ldflags': ['-mhard-float'],
-                  }, {
-                    'cflags': ['-msoft-float'],
-                    'ldflags': ['-msoft-float'],
-                  }],
-                  ['mips_arch_variant=="r6"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R6',
-                      'FPU_MODE_FP64',
-                    ],
-                    'cflags!': ['-mfp32', '-mfpxx'],
-                    'conditions': [
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips32r6'],
-                      }],
-                    ],
-                    'cflags': ['-mips32r6'],
-                    'ldflags': ['-mips32r6'],
-                  }],
-                  ['mips_arch_variant=="r6" and mips_use_msa==1', {
-                    'defines': [ '_MIPS_MSA' ],
-                  }],
-                  ['mips_arch_variant=="r2"', {
-                    'conditions': [
-                      [ 'mips_fpu_mode=="fp64"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FP64',
-                        ],
-                        'cflags': ['-mfp64'],
-                      }],
-                      ['mips_fpu_mode=="fpxx"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FPXX',
-                        ],
-                        'cflags': ['-mfpxx'],
-                      }],
-                      ['mips_fpu_mode=="fp32"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FP32',
-                        ],
-                        'cflags': ['-mfp32'],
-                      }],
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips32r2'],
-                      }],
-                    ],
-                    'cflags': ['-mips32r2'],
-                    'ldflags': ['-mips32r2'],
-                  }],
-                  ['mips_arch_variant=="r1"', {
-                    'defines': [
-                      'FPU_MODE_FP32',
-                    ],
-                    'cflags!': ['-mfp64', '-mfpxx'],
-                    'conditions': [
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips32'],
-                      }],
-                    ],
-                    'cflags': ['-mips32'],
-                    'ldflags': ['-mips32'],
-                  }],
-                  ['mips_arch_variant=="rx"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32RX',
-                      'FPU_MODE_FPXX',
-                    ],
-                    'cflags!': ['-mfp64', '-mfp32'],
-                    'conditions': [
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips32'],
-                      }],
-                    ],
-                    'cflags': ['-mips32', '-mfpxx'],
-                    'ldflags': ['-mips32'],
-                  }],
-                ],
-              }, {
-                # 'v8_target_arch!=target_arch'
-                # Target not built with an MIPS CXX compiler (simulator build).
-                'conditions': [
-                  ['mips_arch_variant=="r6"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R6',
-                      'FPU_MODE_FP64',
-                    ],
-                  }],
-                  ['mips_arch_variant=="r6" and mips_use_msa==1', {
-                    'defines': [ '_MIPS_MSA' ],
-                  }],
-                  ['mips_arch_variant=="r2"', {
-                    'conditions': [
-                      [ 'mips_fpu_mode=="fp64"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FP64',
-                        ],
-                      }],
-                      ['mips_fpu_mode=="fpxx"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FPXX',
-                        ],
-                      }],
-                      ['mips_fpu_mode=="fp32"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FP32',
-                        ],
-                      }],
-                    ],
-                  }],
-                  ['mips_arch_variant=="r1"', {
-                    'defines': [
-                      'FPU_MODE_FP32',
-                    ],
-                  }],
-                  ['mips_arch_variant=="rx"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32RX',
-                      'FPU_MODE_FPXX',
-                    ],
-                  }],
-                ],
-              }],
-            ],
-          }],  #_toolset=="target"
-          ['_toolset=="host"', {
-            'conditions': [
-              ['mips_arch_variant=="rx"', {
-                'defines': [
-                  '_MIPS_ARCH_MIPS32RX',
-                  'FPU_MODE_FPXX',
-                ],
-              }],
-              ['mips_arch_variant=="r6"', {
-                'defines': [
-                  '_MIPS_ARCH_MIPS32R6',
-                  'FPU_MODE_FP64',
-                ],
-              }],
-              ['mips_arch_variant=="r6" and mips_use_msa==1', {
-                'defines': [ '_MIPS_MSA' ],
-              }],
-              ['mips_arch_variant=="r2"', {
-                'conditions': [
-                  ['mips_fpu_mode=="fp64"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R2',
-                      'FPU_MODE_FP64',
-                    ],
-                  }],
-                  ['mips_fpu_mode=="fpxx"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R2',
-                      'FPU_MODE_FPXX',
-                    ],
-                  }],
-                  ['mips_fpu_mode=="fp32"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R2',
-                      'FPU_MODE_FP32'
-                    ],
-                  }],
-                ],
-              }],
-              ['mips_arch_variant=="r1"', {
-                'defines': ['FPU_MODE_FP32',],
-              }],
-            ]
-          }],  #_toolset=="host"
-        ],
-      }],  # v8_target_arch=="mips"
-      ['v8_target_arch=="mipsel"', {
-        'defines': [
-          'V8_TARGET_ARCH_MIPS',
-        ],
-        'conditions': [
-          [ 'v8_can_use_fpu_instructions=="true"', {
-            'defines': [
-              'CAN_USE_FPU_INSTRUCTIONS',
-            ],
-          }],
-          [ 'v8_use_mips_abi_hardfloat=="true"', {
-            'defines': [
-              '__mips_hard_float=1',
-              'CAN_USE_FPU_INSTRUCTIONS',
-            ],
-          }, {
-            'defines': [
-              '__mips_soft_float=1'
-            ],
-          }],
-        ],
-        'target_conditions': [
-          ['_toolset=="target"', {
-            'conditions': [
-              ['v8_target_arch==target_arch', {
-                # Target built with a Mips CXX compiler.
-                'cflags': [
-                  '-EL',
-                  '-Wno-error=array-bounds',  # Workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
-                ],
-                'ldflags': ['-EL'],
-                'conditions': [
-                  [ 'v8_use_mips_abi_hardfloat=="true"', {
-                    'cflags': ['-mhard-float'],
-                    'ldflags': ['-mhard-float'],
-                  }, {
-                    'cflags': ['-msoft-float'],
-                    'ldflags': ['-msoft-float'],
-                  }],
-                  ['mips_arch_variant=="r6"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R6',
-                      'FPU_MODE_FP64',
-                    ],
-                    'cflags!': ['-mfp32', '-mfpxx'],
-                    'conditions': [
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips32r6'],
-                      }],
-                    ],
-                    'cflags': ['-mips32r6'],
-                    'ldflags': ['-mips32r6'],
-                  }],
-                  ['mips_arch_variant=="r6" and mips_use_msa==1', {
-                    'defines': [ '_MIPS_MSA' ],
-                  }],
-                  ['mips_arch_variant=="r2"', {
-                    'conditions': [
-                      [ 'mips_fpu_mode=="fp64"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FP64',
-                        ],
-                        'cflags': ['-mfp64'],
-                      }],
-                      ['mips_fpu_mode=="fpxx"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FPXX',
-                        ],
-                        'cflags': ['-mfpxx'],
-                      }],
-                      ['mips_fpu_mode=="fp32"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FP32',
-                        ],
-                        'cflags': ['-mfp32'],
-                      }],
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips32r2'],
-                      }],
-                    ],
-                    'cflags': ['-mips32r2'],
-                    'ldflags': ['-mips32r2'],
-                  }],
-                  ['mips_arch_variant=="r1"', {
-                    'defines': [
-                      'FPU_MODE_FP32',
-                    ],
-                    'cflags!': ['-mfp64', '-mfpxx'],
-                    'conditions': [
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips32'],
-                      }],
-                    ],
-                    'cflags': ['-mips32'],
-                    'ldflags': ['-mips32'],
-                  }],
-                  ['mips_arch_variant=="rx"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32RX',
-                      'FPU_MODE_FPXX',
-                    ],
-                    'cflags!': ['-mfp64', '-mfp32'],
-                    'conditions': [
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips32'],
-                      }],
-                    ],
-                    'cflags': ['-mips32', '-mfpxx'],
-                    'ldflags': ['-mips32'],
-                  }],
-                  ['mips_arch_variant=="loongson"', {
-                    'defines': [
-                      '_MIPS_ARCH_LOONGSON',
-                      'FPU_MODE_FP32',
-                    ],
-                    'cflags!': ['-mfp64', '-mfpxx'],
-                    'conditions': [
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips3'],
-                      }],
-                    ],
-                    'cflags': ['-mips3', '-mfp32'],
-                  }],
-                ],
-              }, {
-                # 'v8_target_arch!=target_arch'
-                # Target not built with an MIPS CXX compiler (simulator build).
-                'conditions': [
-                  ['mips_arch_variant=="r6"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R6',
-                      'FPU_MODE_FP64',
-                    ],
-                  }],
-                  ['mips_arch_variant=="r6" and mips_use_msa==1', {
-                    'defines': [ '_MIPS_MSA' ],
-                  }],
-                  ['mips_arch_variant=="r2"', {
-                    'conditions': [
-                      [ 'mips_fpu_mode=="fp64"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FP64',
-                        ],
-                      }],
-                      ['mips_fpu_mode=="fpxx"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FPXX',
-                        ],
-                      }],
-                      ['mips_fpu_mode=="fp32"', {
-                        'defines': [
-                          '_MIPS_ARCH_MIPS32R2',
-                          'FPU_MODE_FP32',
-                        ],
-                      }],
-                    ],
-                  }],
-                  ['mips_arch_variant=="r1"', {
-                    'defines': [
-                      'FPU_MODE_FP32',
-                    ],
-                  }],
-                  ['mips_arch_variant=="rx"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32RX',
-                      'FPU_MODE_FPXX',
-                    ],
-                  }],
-                  ['mips_arch_variant=="loongson"', {
-                    'defines': [
-                      '_MIPS_ARCH_LOONGSON',
-                      'FPU_MODE_FP32',
-                    ],
-                  }],
-                ],
-              }],
-            ],
-          }], #_toolset=="target
-          ['_toolset=="host"', {
-            'conditions': [
-              ['mips_arch_variant=="rx"', {
-                'defines': [
-                  '_MIPS_ARCH_MIPS32RX',
-                  'FPU_MODE_FPXX',
-                ],
-              }],
-              ['mips_arch_variant=="r6"', {
-                'defines': [
-                  '_MIPS_ARCH_MIPS32R6',
-                  'FPU_MODE_FP64',
-                ],
-              }],
-              ['mips_arch_variant=="r6" and mips_use_msa==1', {
-                'defines': [ '_MIPS_MSA' ],
-              }],
-              ['mips_arch_variant=="r2"', {
-                'conditions': [
-                  ['mips_fpu_mode=="fp64"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R2',
-                      'FPU_MODE_FP64',
-                    ],
-                  }],
-                  ['mips_fpu_mode=="fpxx"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R2',
-                      'FPU_MODE_FPXX',
-                    ],
-                  }],
-                  ['mips_fpu_mode=="fp32"', {
-                    'defines': [
-                      '_MIPS_ARCH_MIPS32R2',
-                      'FPU_MODE_FP32'
-                    ],
-                  }],
-                ],
-              }],
-              ['mips_arch_variant=="r1"', {
-                'defines': ['FPU_MODE_FP32',],
-              }],
-              ['mips_arch_variant=="loongson"', {
-                'defines': [
-                  '_MIPS_ARCH_LOONGSON',
-                  'FPU_MODE_FP32',
-                ],
-              }],
-            ]
-          }],
-        ],
-      }],  # v8_target_arch=="mipsel"
-      ['v8_target_arch=="mips64el" or v8_target_arch=="mips64"', {
-        'defines': [
-          'V8_TARGET_ARCH_MIPS64',
-        ],
-        'conditions': [
-          [ 'v8_can_use_fpu_instructions=="true"', {
-            'defines': [
-              'CAN_USE_FPU_INSTRUCTIONS',
-            ],
-          }],
-          [ 'v8_host_byteorder=="little"', {
-            'defines': [
-              'V8_TARGET_ARCH_MIPS64_LE',
-            ],
-          }],
-          [ 'v8_host_byteorder=="big"', {
-            'defines': [
-              'V8_TARGET_ARCH_MIPS64_BE',
-            ],
-          }],
-          [ 'v8_use_mips_abi_hardfloat=="true"', {
-            'defines': [
-              '__mips_hard_float=1',
-              'CAN_USE_FPU_INSTRUCTIONS',
-            ],
-          }, {
-            'defines': [
-              '__mips_soft_float=1'
-            ],
-          }],
-         ],
-        'target_conditions': [
-          ['_toolset=="target"', {
-            'conditions': [
-              ['v8_target_arch==target_arch', {
-                'cflags': [
-                  '-Wno-error=array-bounds',  # Workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56273
-                ],
-                'conditions': [
-                  ['v8_target_arch=="mips64el"', {
-                    'cflags': ['-EL'],
-                    'ldflags': ['-EL'],
-                  }],
-                  ['v8_target_arch=="mips64"', {
-                    'cflags': ['-EB'],
-                    'ldflags': ['-EB'],
-                  }],
-                  [ 'v8_use_mips_abi_hardfloat=="true"', {
-                    'cflags': ['-mhard-float'],
-                    'ldflags': ['-mhard-float'],
-                  }, {
-                    'cflags': ['-msoft-float'],
-                    'ldflags': ['-msoft-float'],
-                  }],
-                  ['mips_arch_variant=="r6"', {
-                    'defines': ['_MIPS_ARCH_MIPS64R6',],
-                    'conditions': [
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips64r6'],
-                      }],
-                    ],
-                    'cflags': ['-mips64r6', '-mabi=64'],
-                    'ldflags': ['-mips64r6', '-mabi=64'],
-                  }],
-                  ['mips_arch_variant=="r6" and mips_use_msa==1', {
-                    'defines': [ '_MIPS_MSA' ],
-                  }],
-                  ['mips_arch_variant=="r2"', {
-                    'defines': ['_MIPS_ARCH_MIPS64R2',],
-                    'conditions': [
-                      [ 'clang==0', {
-                        'cflags': ['-Wa,-mips64r2'],
-                      }],
-                    ],
-                    'cflags': ['-mips64r2', '-mabi=64'],
-                    'ldflags': ['-mips64r2', '-mabi=64'],
-                  }],
-                ],
-              }, {
-                # 'v8_target_arch!=target_arch'
-                # Target not built with an MIPS CXX compiler (simulator build).
-                'conditions': [
-                  ['mips_arch_variant=="r6"', {
-                    'defines': ['_MIPS_ARCH_MIPS64R6',],
-                  }],
-                  ['mips_arch_variant=="r6" and mips_use_msa==1', {
-                    'defines': [ '_MIPS_MSA' ],
-                  }],
-                  ['mips_arch_variant=="r2"', {
-                    'defines': ['_MIPS_ARCH_MIPS64R2',],
-                  }],
-                ],
-              }],
-            ],
-          }],  #'_toolset=="target"
-          ['_toolset=="host"', {
-            'conditions': [
-              ['mips_arch_variant=="r6"', {
-                'defines': ['_MIPS_ARCH_MIPS64R6',],
-              }],
-              ['mips_arch_variant=="r6" and mips_use_msa==1', {
-                'defines': [ '_MIPS_MSA' ],
-              }],
-              ['mips_arch_variant=="r2"', {
-                'defines': ['_MIPS_ARCH_MIPS64R2',],
-              }],
-            ],
-          }],  #'_toolset=="host"
-        ],
-      }],  # v8_target_arch=="mips64el"
-      ['v8_target_arch=="x64"', {
-        'defines': [
-          'V8_TARGET_ARCH_X64',
-        ],
-        'xcode_settings': {
-          'ARCHS': [ 'x86_64' ],
-        },
-        'msvs_settings': {
-          'VCLinkerTool': {
-            'StackReserveSize': '2097152',
-          },
-        },
-        'msvs_configuration_platform': 'x64',
-      }],  # v8_target_arch=="x64"
-      ['v8_target_arch=="x32"', {
-        'defines': [
-          # x32 port shares the source code with x64 port.
-          'V8_TARGET_ARCH_X64',
-          'V8_TARGET_ARCH_32_BIT',
-        ],
-        'cflags': [
-          '-mx32',
-          # Inhibit warning if long long type is used.
-          '-Wno-long-long',
-        ],
-        'ldflags': [
-          '-mx32',
-        ],
-      }],  # v8_target_arch=="x32"
-      ['OS=="win"', {
-        'defines': [
-          'WIN32',
-          'NOMINMAX',  # Refs: https://chromium-review.googlesource.com/c/v8/v8/+/1456620
-        ],
-        # 4351: VS 2005 and later are warning us that they've fixed a bug
-        #       present in VS 2003 and earlier.
-        'msvs_disabled_warnings': [4351],
-        'msvs_configuration_attributes': {
-          'CharacterSet': '1',
-        },
-      }],
-      ['OS=="win" and v8_target_arch=="x86"', {
-        'msvs_settings': {
-          'VCCLCompilerTool': {
-            # Ensure no surprising artifacts from 80bit double math with x86.
-            'AdditionalOptions': ['/arch:SSE2'],
-          },
-        },
-      }],
-      ['OS=="win" and v8_enable_prof==1', {
-        'msvs_settings': {
-          'VCLinkerTool': {
-            'GenerateMapFile': 'true',
-          },
-        },
-      }],
-      ['(OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \
-         or OS=="netbsd" or OS=="mac" or OS=="android" or OS=="qnx") and \
-        v8_target_arch=="x86"', {
-        'cflags': [
-          '-msse2',
-          '-mfpmath=sse',
-          '-mmmx',  # Allows mmintrin.h for MMX intrinsics.
-        ],
-      }],
-      ['(OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \
-         or OS=="netbsd" or OS=="mac" or OS=="android" or OS=="qnx") and \
-        (v8_target_arch=="arm" or v8_target_arch=="x86" or \
-         v8_target_arch=="mips" or v8_target_arch=="mipsel" or \
-         v8_target_arch=="ppc")', {
-        'target_conditions': [
-          ['_toolset=="host"', {
-            'conditions': [
-              ['host_cxx_is_biarch==1', {
-                'conditions': [
-                  ['host_arch=="s390x"', {
-                    'cflags': [ '-m31' ],
-                    'ldflags': [ '-m31' ]
-                  },{
-                   'cflags': [ '-m32' ],
-                   'ldflags': [ '-m32' ]
-                  }],
-                ],
-              }],
-            ],
-            'xcode_settings': {
-              'ARCHS': [ 'i386' ],
-            },
-          }],
-          ['_toolset=="target"', {
-            'conditions': [
-              ['target_cxx_is_biarch==1', {
-                'conditions': [
-                  ['host_arch=="s390x"', {
-                    'cflags': [ '-m31' ],
-                    'ldflags': [ '-m31' ]
-                  },{
-                   'cflags': [ '-m32' ],
-                   'ldflags': [ '-m32' ],
-                  }],
-                ],
-              }],
-            ],
-            'xcode_settings': {
-              'ARCHS': [ 'i386' ],
-            },
-          }],
-        ],
-      }],
-      ['(OS=="linux" or OS=="android") and \
-        (v8_target_arch=="x64" or v8_target_arch=="arm64" or \
-         v8_target_arch=="ppc64" or v8_target_arch=="s390x")', {
-        'target_conditions': [
-          ['_toolset=="host"', {
-            'conditions': [
-              ['host_cxx_is_biarch==1', {
-                'cflags': [ '-m64' ],
-                'ldflags': [ '-m64' ]
-              }],
-             ],
-           }],
-          ['_toolset=="target"', {
-             'conditions': [
-               ['target_cxx_is_biarch==1', {
-                 'cflags': [ '-m64' ],
-                 'ldflags': [ '-m64' ],
-               }],
-             ]
-           }],
-         ],
-      }],
-      ['OS=="android" and v8_android_log_stdout==1', {
-        'defines': [
-          'V8_ANDROID_LOG_STDOUT',
-        ],
-      }],
-      ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \
-         or OS=="netbsd" or OS=="qnx" or OS=="aix"', {
-        'conditions': [
-          [ 'v8_no_strict_aliasing==1', {
-            'cflags': [ '-fno-strict-aliasing' ],
-          }],
-        ],  # conditions
-      }],
-      ['OS=="solaris"', {
-        'defines': [ '__C99FEATURES__=1' ],  # isinf() etc.
-      }],
-      ['OS=="freebsd" or OS=="openbsd"', {
-        'cflags': [ '-I/usr/local/include' ],
-      }],
-      ['OS=="netbsd"', {
-        'cflags': [ '-I/usr/pkg/include' ],
-      }],
-      ['OS=="aix"', {
-        'defines': [
-          # Support for malloc(0)
-          '_LINUX_SOURCE_COMPAT=1',
-          '__STDC_FORMAT_MACROS',
-          '_ALL_SOURCE=1'],
-        'conditions': [
-          [ 'v8_target_arch=="ppc"', {
-            'ldflags': [ '-Wl,-bmaxdata:0x60000000/dsa' ],
-          }],
-          [ 'v8_target_arch=="ppc64"', {
-            'cflags': [ '-maix64', '-fdollars-in-identifiers' ],
-            'ldflags': [ '-maix64 -Wl,-bbigtoc' ],
-          }],
-        ],
-      }],
-    ],  # conditions
-    'configurations': {
-      'Debug': {
-        'defines': [
-          'ENABLE_DISASSEMBLER',
-          'V8_ENABLE_CHECKS',
-          'OBJECT_PRINT',
-          'VERIFY_HEAP',
-          'DEBUG',
-          'V8_TRACE_MAPS',
-          'V8_ENABLE_ALLOCATION_TIMEOUT',
-          'V8_ENABLE_FORCE_SLOW_PATH',
-        ],
-        'conditions': [
-          ['OS=="linux" and v8_enable_backtrace==1', {
-            # Support for backtrace_symbols.
-            'ldflags': [ '-rdynamic' ],
-          }],
-          ['OS=="aix"', {
-            'ldflags': [ '-Wl,-bbigtoc' ],
-            'conditions': [
-              ['v8_target_arch=="ppc64"', {
-                'cflags': [ '-maix64 -mcmodel=large' ],
-              }],
-            ],
-          }],
-          ['OS=="android"', {
-            'variables': {
-              'android_full_debug%': 1,
-            },
-            'conditions': [
-              ['android_full_debug==0', {
-                # Disable full debug if we want a faster v8 in a debug build.
-                # TODO(2304): pass DISABLE_DEBUG_ASSERT instead of hiding DEBUG.
-                'defines!': [
-                  'DEBUG',
-                  'ENABLE_SLOW_DCHECKS',
-                ],
-              }],
-            ],
-          }],
-          ['v8_optimized_debug==0', {
-            'msvs_settings': {
-              'VCCLCompilerTool': {
-                'Optimization': '0',
-                'conditions': [
-                  ['component=="shared_library" or force_dynamic_crt==1', {
-                    'RuntimeLibrary': '3',  # /MDd
-                  }, {
-                     'RuntimeLibrary': '1',  # /MTd
-                   }],
-                ],
-              },
-              'VCLinkerTool': {
-                'LinkIncremental': '2',
-              },
-            },
-            'variables': {
-              'v8_enable_slow_dchecks%': 1,
-            },
-            'conditions': [
-              ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd" or \
-            OS=="qnx" or OS=="aix"', {
-                'cflags!': [
-                  '-O3',
-                  '-O2',
-                  '-O1',
-                  '-Os',
-                ],
-                'cflags': [
-                  '-fdata-sections',
-                  '-ffunction-sections',
-                ],
-              }],
-              ['OS=="mac"', {
-                'xcode_settings': {
-                  'GCC_OPTIMIZATION_LEVEL': '0',  # -O0
-                },
-              }],
-              ['v8_enable_slow_dchecks==1', {
-                'defines': [
-                  'ENABLE_SLOW_DCHECKS',
-                ],
-              }],
-            ],
-          }, {
-            'msvs_settings': {
-              'VCCLCompilerTool': {
-                'Optimization': '2',
-                'InlineFunctionExpansion': '2',
-                'EnableIntrinsicFunctions': 'true',
-                'FavorSizeOrSpeed': '0',
-                'StringPooling': 'true',
-                'BasicRuntimeChecks': '0',
-                'conditions': [
-                  ['component=="shared_library" or force_dynamic_crt==1', {
-                    'RuntimeLibrary': '3',  #/MDd
-                  }, {
-                     'RuntimeLibrary': '1',  #/MTd
-                   }],
-                ],
-              },
-              'VCLinkerTool': {
-                'LinkIncremental': '1',
-                'OptimizeReferences': '2',
-                'EnableCOMDATFolding': '2',
-              },
-            },
-            'variables': {
-              'v8_enable_slow_dchecks%': 0,
-            },
-            'conditions': [
-              ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd" or \
-            OS=="qnx" or OS=="aix"', {
-                'cflags!': [
-                  '-O0',
-                  '-O1',
-                  '-Os',
-                ],
-                'cflags': [
-                  '-fdata-sections',
-                  '-ffunction-sections',
-                ],
-                'conditions': [
-                  # Don't use -O3 with sanitizers.
-                  ['asan==0 and msan==0 and lsan==0 \
-                and tsan==0 and ubsan==0 and ubsan_vptr==0', {
-                    'cflags': ['-O3'],
-                    'cflags!': ['-O2'],
-                  }, {
-                     'cflags': ['-O2'],
-                     'cflags!': ['-O3'],
-                   }],
-                ],
-              }],
-              ['OS=="mac"', {
-                'xcode_settings': {
-                  'GCC_OPTIMIZATION_LEVEL': '3',  # -O3
-                  'GCC_STRICT_ALIASING': 'YES',
-                },
-              }],
-              ['v8_enable_slow_dchecks==1', {
-                'defines': [
-                  'ENABLE_SLOW_DCHECKS',
-                ],
-              }],
-            ],
-          }],
-          # Temporary refs: https://github.com/nodejs/node/pull/23801
-          ['v8_enable_handle_zapping==1', {
-            'defines': ['ENABLE_HANDLE_ZAPPING',],
-          }],
-        ],
-
-      },  # DebugBaseCommon
-      'Release': {
-        'variables': {
-          'v8_enable_slow_dchecks%': 0,
-        },
-         # Temporary refs: https://github.com/nodejs/node/pull/23801
-        'defines!': ['ENABLE_HANDLE_ZAPPING',],
-        'conditions': [
-          ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd" \
-            or OS=="aix"', {
-            'cflags!': [
-              '-Os',
-            ],
-            'cflags': [
-              '-fdata-sections',
-              '-ffunction-sections',
-            ],
-            'conditions': [
-              # Don't use -O3 with sanitizers.
-              ['asan==0 and msan==0 and lsan==0 \
-                and tsan==0 and ubsan==0 and ubsan_vptr==0', {
-                'cflags': ['-O3'],
-                'cflags!': ['-O2'],
-              }, {
-                'cflags': ['-O2'],
-                'cflags!': ['-O3'],
-              }],
-            ],
-          }],
-          ['OS=="android"', {
-            'cflags!': [
-              '-O3',
-              '-Os',
-            ],
-            'cflags': [
-              '-fdata-sections',
-              '-ffunction-sections',
-              '-O2',
-            ],
-          }],
-          ['OS=="mac"', {
-            'xcode_settings': {
-              'GCC_OPTIMIZATION_LEVEL': '3',  # -O3
-
-              # -fstrict-aliasing.  Mainline gcc
-              # enables this at -O2 and above,
-              # but Apple gcc does not unless it
-              # is specified explicitly.
-              'GCC_STRICT_ALIASING': 'YES',
-            },
-          }],  # OS=="mac"
-          ['OS=="win"', {
-            'msvs_settings': {
-              'VCCLCompilerTool': {
-                'Optimization': '2',
-                'InlineFunctionExpansion': '2',
-                'EnableIntrinsicFunctions': 'true',
-                'FavorSizeOrSpeed': '0',
-                'StringPooling': 'true',
-                'conditions': [
-                  ['component=="shared_library" or force_dynamic_crt==1', {
-                    'RuntimeLibrary': '2',  #/MD
-                  }, {
-                    'RuntimeLibrary': '0',  #/MT
-                  }],
-                ],
-              },
-              'VCLinkerTool': {
-                'LinkIncremental': '1',
-                'OptimizeReferences': '2',
-                'EnableCOMDATFolding': '2',
-              },
-            },
-          }],  # OS=="win"
-          ['v8_enable_slow_dchecks==1', {
-            'defines': [
-              'ENABLE_SLOW_DCHECKS',
-            ],
-          }],
-        ],  # conditions
-      },  # Release
-    },  # configurations
-    'msvs_disabled_warnings': [
-      4129,  # unrecognized character escape sequence (torque-generated)
-      4245,  # Conversion with signed/unsigned mismatch.
-      4267,  # Conversion with possible loss of data.
-      4324,  # Padding structure due to alignment.
-      # 4351, # [refack] Old issue with array init.
-      4355,  # 'this' used in base member initializer list
-      4661,  # no suitable definition provided for explicit template instantiation request
-      4701,  # Potentially uninitialized local variable.
-      4702,  # Unreachable code.
-      4703,  # Potentially uninitialized local pointer variable.
-      4709,  # Comma operator within array index expr (bugged).
-      # 4714,  # Function marked forceinline not inlined.
-      4715,  # Not all control paths return a value. (see https://crbug.com/v8/7658)
-      4718,  # Recursive call has no side-effect.
-      4723,  # https://crbug.com/v8/7771
-      4724,  # https://crbug.com/v8/7771
-      4800,  # Forcing value to bool.
-    ],
-    # Relevant only for x86.
-    # Refs: https://github.com/nodejs/node/pull/25852
-    # Refs: https://docs.microsoft.com/en-us/cpp/build/reference/safeseh-image-has-safe-exception-handlers
-    'msvs_settings': {
-      'VCLinkerTool': {
-        'ImageHasSafeExceptionHandlers': 'false',
-      },
-    },
-  },  # target_defaults
-}
diff --git a/third_party/v8/v8.gyp b/third_party/v8/v8.gyp
deleted file mode 100644
index 03e13ec..0000000
--- a/third_party/v8/v8.gyp
+++ /dev/null
@@ -1,2079 +0,0 @@
-# Copyright 2012 the V8 project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'variables': {
-    'V8_ROOT': '<(DEPTH)/third_party/v8',
-    'v8_code': 1,
-    'v8_random_seed%': 314159265,
-    'v8_vector_stores%': 0,
-    'v8_embed_script%': "",
-    'mksnapshot_exec': '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)mksnapshot<(host_executable_suffix)',
-    'v8_os_page_size%': 0,
-    # Cobalt added variables
-
-    'v8_use_snapshot': 1,
-    'v8_optimized_debug': 0,
-    'v8_use_external_startup_data': 0,
-    'v8_enable_i18n_support': 0,
-    'v8_enable_snapshot_code_comments': 0,
-    # Enable native counters from the snapshot (impacts performance, sets
-    # -dV8_SNAPSHOT_NATIVE_CODE_COUNTERS).
-    # This option will generate extra code in the snapshot to increment counters,
-    # as per the --native-code-counters flag.
-    'v8_enable_snapshot_native_code_counters%': 0,
-    # Enable code-generation-time checking of types in the CodeStubAssembler.
-    'v8_enable_verify_csa%': 0,
-    'v8_enable_31bit_smis_on_64bit_arch%': 0,
-    # Sets -dOBJECT_PRINT.
-    'v8_enable_object_print%': 0,
-    # Sets -dV8_TRACE_MAPS.
-    'v8_enable_trace_maps%': 0,
-    # Sets -dV8_ENABLE_CHECKS.
-    'v8_enable_v8_checks%': 0,
-    # Sets -dV8_TRACE_IGNITION.
-    'v8_enable_trace_ignition%': 0,
-    # Sets -dV8_TRACE_FEEDBACK_UPDATES.
-    'v8_enable_trace_feedback_updates%': 0,
-    # Sets -dV8_CONCURRENT_MARKING
-    'v8_enable_concurrent_marking%': 1,
-    # Enables various testing features.
-    'v8_enable_test_features%': 0,
-    'is_component_build': 0,
-    'v8_current_cpu': '<(v8_target_arch)',
-    'is_posix': 0,
-    'is_fuchsia': 0,
-    'is_android': 0,
-    'is_win': 0,
-    'is_linux': 0,
-    'is_starboard': 1,
-    'is_asan': 0,
-    'v8_use_perfetto': 0,
-    'v8_use_siphash': 0,
-    'v8_enable_lite_mode': 0,
-    'want_separate_host_toolset': 1,
-
-    # New addition after 8.7 rebase
-    'v8_enable_third_party_heap': 0,
-    'v8_control_flow_integrity': 0,  #  qualcomm's pointer authentication
-    # End of Cobalt variables
-
-    'generate_bytecode_output_root': '<(SHARED_INTERMEDIATE_DIR)/generate-bytecode-output-root',
-    'generate_bytecode_builtins_list_output': '<(generate_bytecode_output_root)/builtins-generated/bytecodes-builtins-list.h',
-    'torque_files_v8_root_relative': [
-      "src/builtins/aggregate-error.tq",
-      "src/builtins/array-copywithin.tq",
-      "src/builtins/array-every.tq",
-      "src/builtins/array-filter.tq",
-      "src/builtins/array-find.tq",
-      "src/builtins/array-findindex.tq",
-      "src/builtins/array-foreach.tq",
-      "src/builtins/array-from.tq",
-      "src/builtins/array-isarray.tq",
-      "src/builtins/array-join.tq",
-      "src/builtins/array-lastindexof.tq",
-      "src/builtins/array-map.tq",
-      "src/builtins/array-of.tq",
-      "src/builtins/array-reduce-right.tq",
-      "src/builtins/array-reduce.tq",
-      "src/builtins/array-reverse.tq",
-      "src/builtins/array-shift.tq",
-      "src/builtins/array-slice.tq",
-      "src/builtins/array-some.tq",
-      "src/builtins/array-splice.tq",
-      "src/builtins/array-unshift.tq",
-      "src/builtins/array.tq",
-      "src/builtins/arraybuffer.tq",
-      "src/builtins/base.tq",
-      "src/builtins/boolean.tq",
-      "src/builtins/builtins-bigint.tq",
-      "src/builtins/builtins-string.tq",
-      "src/builtins/cast.tq",
-      "src/builtins/collections.tq",
-      "src/builtins/constructor.tq",
-      "src/builtins/conversion.tq",
-      "src/builtins/convert.tq",
-      "src/builtins/console.tq",
-      "src/builtins/data-view.tq",
-      "src/builtins/finalization-registry.tq",
-      "src/builtins/frames.tq",
-      "src/builtins/frame-arguments.tq",
-      "src/builtins/function.tq",
-      "src/builtins/growable-fixed-array.tq",
-      "src/builtins/ic-callable.tq",
-      "src/builtins/ic-dynamic-map-checks.tq",
-      "src/builtins/ic.tq",
-      "src/builtins/internal-coverage.tq",
-      "src/builtins/internal.tq",
-      "src/builtins/iterator.tq",
-      "src/builtins/math.tq",
-      "src/builtins/number.tq",
-      "src/builtins/object-fromentries.tq",
-      "src/builtins/object.tq",
-      "src/builtins/promise-abstract-operations.tq",
-      "src/builtins/promise-all.tq",
-      "src/builtins/promise-all-element-closure.tq",
-      "src/builtins/promise-any.tq",
-      "src/builtins/promise-constructor.tq",
-      "src/builtins/promise-finally.tq",
-      "src/builtins/promise-misc.tq",
-      "src/builtins/promise-race.tq",
-      "src/builtins/promise-reaction-job.tq",
-      "src/builtins/promise-resolve.tq",
-      "src/builtins/promise-then.tq",
-      "src/builtins/promise-jobs.tq",
-      "src/builtins/proxy-constructor.tq",
-      "src/builtins/proxy-delete-property.tq",
-      "src/builtins/proxy-get-property.tq",
-      "src/builtins/proxy-get-prototype-of.tq",
-      "src/builtins/proxy-has-property.tq",
-      "src/builtins/proxy-is-extensible.tq",
-      "src/builtins/proxy-prevent-extensions.tq",
-      "src/builtins/proxy-revocable.tq",
-      "src/builtins/proxy-revoke.tq",
-      "src/builtins/proxy-set-property.tq",
-      "src/builtins/proxy-set-prototype-of.tq",
-      "src/builtins/proxy.tq",
-      "src/builtins/reflect.tq",
-      "src/builtins/regexp-exec.tq",
-      "src/builtins/regexp-match-all.tq",
-      "src/builtins/regexp-match.tq",
-      "src/builtins/regexp-replace.tq",
-      "src/builtins/regexp-search.tq",
-      "src/builtins/regexp-source.tq",
-      "src/builtins/regexp-split.tq",
-      "src/builtins/regexp-test.tq",
-      "src/builtins/regexp.tq",
-      "src/builtins/string-endswith.tq",
-      "src/builtins/string-html.tq",
-      "src/builtins/string-iterator.tq",
-      "src/builtins/string-pad.tq",
-      "src/builtins/string-repeat.tq",
-      "src/builtins/string-replaceall.tq",
-      "src/builtins/string-slice.tq",
-      "src/builtins/string-startswith.tq",
-      "src/builtins/string-substr.tq",
-      "src/builtins/string-substring.tq",
-      "src/builtins/string-trim.tq",
-      "src/builtins/symbol.tq",
-      "src/builtins/torque-internal.tq",
-      "src/builtins/typed-array-createtypedarray.tq",
-      "src/builtins/typed-array-every.tq",
-      "src/builtins/typed-array-entries.tq",
-      "src/builtins/typed-array-filter.tq",
-      "src/builtins/typed-array-find.tq",
-      "src/builtins/typed-array-findindex.tq",
-      "src/builtins/typed-array-foreach.tq",
-      "src/builtins/typed-array-from.tq",
-      "src/builtins/typed-array-keys.tq",
-      "src/builtins/typed-array-of.tq",
-      "src/builtins/typed-array-reduce.tq",
-      "src/builtins/typed-array-reduceright.tq",
-      "src/builtins/typed-array-set.tq",
-      "src/builtins/typed-array-slice.tq",
-      "src/builtins/typed-array-some.tq",
-      "src/builtins/typed-array-sort.tq",
-      "src/builtins/typed-array-subarray.tq",
-      "src/builtins/typed-array-values.tq",
-      "src/builtins/typed-array.tq",
-      "src/builtins/wasm.tq",
-      "src/builtins/weak-ref.tq",
-      "src/ic/handler-configuration.tq",
-      "src/objects/allocation-site.tq",
-      "src/objects/api-callbacks.tq",
-      "src/objects/arguments.tq",
-      "src/objects/bigint.tq",
-      "src/objects/cell.tq",
-      "src/objects/code.tq",
-      "src/objects/contexts.tq",
-      "src/objects/data-handler.tq",
-      "src/objects/debug-objects.tq",
-      "src/objects/descriptor-array.tq",
-      "src/objects/embedder-data-array.tq",
-      "src/objects/feedback-cell.tq",
-      "src/objects/feedback-vector.tq",
-      "src/objects/fixed-array.tq",
-      "src/objects/foreign.tq",
-      "src/objects/free-space.tq",
-      "src/objects/heap-number.tq",
-      "src/objects/heap-object.tq",
-      "src/objects/js-array-buffer.tq",
-      "src/objects/js-array.tq",
-      "src/objects/js-collection-iterator.tq",
-      "src/objects/js-collection.tq",
-      "src/objects/js-function.tq",
-      "src/objects/js-generator.tq",
-      "src/objects/js-objects.tq",
-      "src/objects/js-promise.tq",
-      "src/objects/js-proxy.tq",
-      "src/objects/js-regexp-string-iterator.tq",
-      "src/objects/js-regexp.tq",
-      "src/objects/js-weak-refs.tq",
-      "src/objects/literal-objects.tq",
-      "src/objects/map.tq",
-      "src/objects/microtask.tq",
-      "src/objects/module.tq",
-      "src/objects/name.tq",
-      "src/objects/oddball.tq",
-      "src/objects/ordered-hash-table.tq",
-      "src/objects/primitive-heap-object.tq",
-      "src/objects/promise.tq",
-      "src/objects/property-array.tq",
-      "src/objects/property-cell.tq",
-      "src/objects/property-descriptor-object.tq",
-      "src/objects/prototype-info.tq",
-      "src/objects/regexp-match-info.tq",
-      "src/objects/scope-info.tq",
-      "src/objects/script.tq",
-      "src/objects/shared-function-info.tq",
-      "src/objects/source-text-module.tq",
-      "src/objects/stack-frame-info.tq",
-      "src/objects/string.tq",
-      "src/objects/struct.tq",
-      "src/objects/synthetic-module.tq",
-      "src/objects/template-objects.tq",
-      "src/objects/templates.tq",
-      "src/objects/torque-defined-classes.tq",
-      "src/wasm/wasm-objects.tq",
-      "test/torque/test-torque.tq",
-      "third_party/v8/builtins/array-sort.tq",
-    ],
-    'torque_files': ['<!@pymod_do_main(third_party.v8.gypfiles.ForEachFormat "<(V8_ROOT)/%s" <@(torque_files_v8_root_relative))'],
-    'torque_output_root': '<(SHARED_INTERMEDIATE_DIR)/torque-output-root',
-    'torque_files_replaced': ['<!@pymod_do_main(third_party.v8.gypfiles.ForEachReplace ".tq" "-tq-csa" <@(torque_files_v8_root_relative))'],
-    'torque_outputs': ['<!@pymod_do_main(third_party.v8.gypfiles.ForEachFormat "<(torque_output_root)/torque-generated/%s.cc" <@(torque_files_replaced))'],
-    'torque_outputs+': ['<!@pymod_do_main(third_party.v8.gypfiles.ForEachFormat "<(torque_output_root)/torque-generated/%s.h" <@(torque_files_replaced))'],
-    'v8_compiler_sources': ['<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "v8_compiler_sources = ")'],
-
-    'conditions': [
-      ['(target_arch=="arm64" or target_arch=="x64") and disable_v8_pointer_compression==0', {
-         'v8_enable_pointer_compression': 1,
-      }, {
-         'v8_enable_pointer_compression': 0,
-      }],
-      ['v8_enable_i18n_support', {
-        'torque_files_v8_root_relative': [
-          "src/objects/intl-objects.tq",
-          "src/objects/js-break-iterator.tq",
-          "src/objects/js-collator.tq",
-          "src/objects/js-date-time-format.tq",
-          "src/objects/js-display-names.tq",
-          "src/objects/js-list-format.tq",
-          "src/objects/js-locale.tq",
-          "src/objects/js-number-format.tq",
-          "src/objects/js-plural-rules.tq",
-          "src/objects/js-relative-time-format.tq",
-          "src/objects/js-segment-iterator.tq",
-          "src/objects/js-segmenter.tq",
-          "src/objects/js-segments.tq",
-        ]
-      }]
-    ],
-  },
-  'includes': ['toolchain.gypi', 'features.gypi'],
-  'target_defaults': {
-    'msvs_settings': {
-      'VCCLCompilerTool': {
-        'AdditionalOptions': ['/utf-8']
-      }
-    },
-  },
-  'targets': [
-    {
-      'target_name': 'fake_torque_output',
-      'hard_dependency': 1,
-      'type': 'none',
-      'actions': [
-        {
-          'action_name': 'no-op',
-          # For some reason, if we put these outputs under target run_torque, they
-          # will be rebuilt unconditionally even if their template files are not
-          # modified. This could be a bug in our gyp runner.
-          # As a solution, we put the outputs here in its own target so that ninja
-          # will know that some target does provide these generated files and ninja
-          # does not rebuild them all the time.
-          'outputs': [
-            '<(torque_output_root)/torque-generated/bit-fields.h',
-            '<(torque_output_root)/torque-generated/builtin-definitions.h',
-            '<(torque_output_root)/torque-generated/interface-descriptors.inc',
-            '<(torque_output_root)/torque-generated/factory.cc',
-            '<(torque_output_root)/torque-generated/factory.inc',
-            '<(torque_output_root)/torque-generated/field-offsets.h',
-            '<(torque_output_root)/torque-generated/class-verifiers.cc',
-            '<(torque_output_root)/torque-generated/class-verifiers.h',
-            '<(torque_output_root)/torque-generated/enum-verifiers.cc',
-            '<(torque_output_root)/torque-generated/objects-printer.cc',
-            '<(torque_output_root)/torque-generated/objects-body-descriptors-inl.inc',
-            '<(torque_output_root)/torque-generated/class-definitions.cc',
-            '<(torque_output_root)/torque-generated/class-definitions-inl.h',
-            '<(torque_output_root)/torque-generated/class-definitions.h',
-            '<(torque_output_root)/torque-generated/class-debug-readers.cc',
-            '<(torque_output_root)/torque-generated/class-debug-readers.h',
-            '<(torque_output_root)/torque-generated/exported-macros-assembler.cc',
-            '<(torque_output_root)/torque-generated/exported-macros-assembler.h',
-            '<(torque_output_root)/torque-generated/csa-types.h',
-            '<(torque_output_root)/torque-generated/instance-types.h',
-            '<(torque_output_root)/torque-generated/runtime-macros.cc',
-            '<(torque_output_root)/torque-generated/runtime-macros.h',
-            '<(torque_output_root)/torque-generated/internal-class-definitions.h',
-            '<(torque_output_root)/torque-generated/internal-class-definitions-inl.h',
-            '<(torque_output_root)/torque-generated/exported-class-definitions.h',
-            '<(torque_output_root)/torque-generated/exported-class-definitions-inl.h',
-          ],
-          'inputs': [],
-          'action': [
-            # Windows gyp runner does not like empty actions.
-            'echo',
-          ],
-        },
-      ],
-    },
-    {
-      'target_name': 'run_torque',
-      'type': 'none',
-      'hard_dependency': 1,
-      'dependent_settings': {
-        'direct_include_dirs': [
-          '<(torque_output_root)',
-        ],
-      },
-      'dependencies': [
-        'fake_torque_output',
-      ],
-      'actions': [
-        {
-          'action_name': 'run_torque_action',
-          'inputs': [  # Order matters.
-            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)torque<(host_executable_suffix)',
-            '<@(torque_files_v8_root_relative)',
-          ],
-          'outputs': [
-            '<@(torque_outputs)',
-          ],
-          'action': [
-            '<@(_inputs)',
-            '-o', '<(torque_output_root)/torque-generated',
-            '-v8-root', '<(V8_ROOT)'
-          ],
-        },
-      ],
-    },  # run_torque
-    {
-      'target_name': 'v8_maybe_icu',
-      'type': 'none',
-      'hard_dependency': 1,
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-        ['v8_enable_i18n_support', {
-          'dependencies': [
-            '<(icu_gyp_path):icui18n',
-            '<(icu_gyp_path):icuuc',
-          ],
-          'export_dependent_settings': [
-            '<(icu_gyp_path):icui18n',
-            '<(icu_gyp_path):icuuc',
-          ],
-        }],
-      ],
-    },  # v8_maybe_icu
-    {
-      'target_name': 'torque_generated_initializers',
-      'type': 'none',
-      'hard_dependency': 1,
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'msvs_disabled_warnings': [4267, 4312, 4351, 4355, 4800, 4838, 4715, 4309],
-      'dependencies': [
-        'generate_bytecode_builtins_list#target',
-        'run_torque#target',
-        'v8_maybe_icu',
-      ],
-      'direct_dependent_settings': {
-        'sources': [
-          '<(torque_output_root)/torque-generated/csa-types.h',
-          '<(torque_output_root)/torque-generated/enum-verifiers.cc',
-          '<(torque_output_root)/torque-generated/exported-macros-assembler.cc',
-          '<(torque_output_root)/torque-generated/exported-macros-assembler.h',
-          '<(V8_ROOT)/src/torque/runtime-support.h',
-          '<@(torque_outputs)',
-        ],
-      }
-    },  # torque_generated_initializers
-    {
-      'target_name': 'torque_generated_definitions',
-      'type': 'none',
-      'hard_dependency': 1,
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'dependencies': [
-        'generate_bytecode_builtins_list#target',
-        'run_torque#target',
-        'v8_maybe_icu',
-      ],
-      'direct_dependent_settings': {
-        'sources': [
-          '<(torque_output_root)/torque-generated/class-verifiers.cc',
-          '<(torque_output_root)/torque-generated/class-verifiers.h',
-          '<(torque_output_root)/torque-generated/factory.cc',
-          '<(torque_output_root)/torque-generated/objects-printer.cc',
-          '<(torque_output_root)/torque-generated/runtime-macros.cc',
-        ],
-        'include_dirs': [
-          '<(torque_output_root)',
-        ],
-      },
-    },  # torque_generated_definitions
-    {
-      'target_name': 'generate_bytecode_builtins_list',
-      'type': 'none',
-      'hard_dependency': 1,
-      'direct_dependent_settings': {
-        'sources': [
-          '<(generate_bytecode_builtins_list_output)',
-        ],
-        'include_dirs': [
-          '<(generate_bytecode_output_root)',
-          '<(torque_output_root)',
-        ],
-      },
-      'actions': [
-        {
-          'action_name': 'generate_bytecode_builtins_list_action',
-          'inputs': [
-            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)bytecode_builtins_list_generator<(host_executable_suffix)',
-          ],
-          'outputs': [
-            '<(generate_bytecode_builtins_list_output)',
-          ],
-          'action': [
-            'python2',
-            '<(V8_ROOT)/tools/run.py',
-            '<@(_inputs)',
-            '<@(_outputs)',
-          ],
-        },
-      ],
-    },  # generate_bytecode_builtins_list#target
-    {
-      'target_name': 'v8_init',
-      'type': 'static_library',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'dependencies': [
-        'generate_bytecode_builtins_list#target',
-        'run_torque#target',
-        'v8_initializers',
-        'v8_maybe_icu',
-      ],
-      'sources': [
-        ### gcmole(all) ###
-        '<(V8_ROOT)/src/init/setup-isolate-full.cc',
-
-        # '<(generate_bytecode_builtins_list_output)',
-      ],
-    },  # v8_init
-    {
-      'target_name': 'v8_initializers',
-      'type': 'static_library',
-      'dependencies': [
-        'torque_generated_initializers',
-      ],
-      'include_dirs': [
-        '<(torque_output_root)',
-        '<(generate_bytecode_output_root)',
-      ],
-      'sources': [
-        '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_initializers.*?sources = ")',
-
-        '<@(torque_outputs)',
-      ],
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-        ['v8_target_arch=="x86"', {
-          'sources': [
-            '<(V8_ROOT)/src/builtins/ia32/builtins-ia32.cc',
-          ],
-        }],
-        ['v8_target_arch=="x64"', {
-          'sources': [
-            '<(V8_ROOT)/src/builtins/x64/builtins-x64.cc',
-          ],
-        }],
-        ['v8_target_arch=="arm"', {
-          'sources': [
-            '<(V8_ROOT)/src/builtins/arm/builtins-arm.cc',
-          ],
-        }],
-        ['v8_target_arch=="arm64"', {
-          'sources': [
-            '<(V8_ROOT)/src/builtins/arm64/builtins-arm64.cc',
-          ],
-        }],
-        ['v8_target_arch=="mips" or v8_target_arch=="mipsel"', {
-          'sources': [
-            '<(V8_ROOT)/src/builtins/mips/builtins-mips.cc',
-          ],
-        }],
-        ['v8_target_arch=="mips64" or v8_target_arch=="mips64el"', {
-          'sources': [
-            '<(V8_ROOT)/src/builtins/mips64/builtins-mips64.cc',
-          ],
-        }],
-        ['v8_target_arch=="ppc"', {
-          'sources': [
-            '<(V8_ROOT)/src/builtins/ppc/builtins-ppc.cc',
-          ],
-        }],
-        ['v8_target_arch=="ppc64"', {
-          'sources': [
-            '<(V8_ROOT)/src/builtins/ppc/builtins-ppc.cc',
-          ],
-        }],
-        ['v8_target_arch=="s390x"', {
-          'sources': [
-            '<(V8_ROOT)/src/builtins/s390/builtins-s390.cc',
-          ],
-        }],
-        ['v8_enable_i18n_support==1', {
-          'dependencies': [
-            '<(icu_gyp_path):icui18n',
-            '<(icu_gyp_path):icuuc',
-          ],
-        }, {
-           'sources!': [
-             '<(V8_ROOT)/src/builtins/builtins-intl-gen.cc',
-           ],
-         }],
-        ['OS=="win"', {
-          'msvs_precompiled_header': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.h',
-          'msvs_precompiled_source': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.cc',
-          'sources': [
-            '<(_msvs_precompiled_header)',
-            '<(_msvs_precompiled_source)',
-          ],
-        }],
-      ],
-    },  # v8_initializers
-    {
-      'target_name': 'v8_snapshot',
-      'type': 'static_library',
-      'toolsets': ['target'],
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'conditions': [
-            ['v8_target_arch=="arm64"', {
-              'msvs_enable_marmasm': 1,
-            }]
-          ],
-          'dependencies': [
-            'generate_bytecode_builtins_list#target',
-            'run_torque#target',
-            'mksnapshot#host',
-            'v8_maybe_icu',
-            # [GYP] added explicitly, instead of inheriting from the other deps
-            'v8_base_without_compiler',
-            'v8_compiler_for_mksnapshot',
-            'v8_initializers',
-            'v8_libplatform',
-          ]
-        }, {
-          'dependencies': [
-            'generate_bytecode_builtins_list#target',
-            'run_torque#target',
-            'mksnapshot',
-            'v8_maybe_icu',
-            # [GYP] added explicitly, instead of inheriting from the other deps
-            'v8_base_without_compiler',
-            'v8_compiler_for_mksnapshot',
-            'v8_initializers',
-            'v8_libplatform',
-          ]
-        }],
-
-        ['cobalt_v8_emit_builtins_as_inline_asm==1', {
-          'actions': [
-            {
-             'action_name': 'convert_asm_to_inline',
-             'inputs': ['<(INTERMEDIATE_DIR)/embedded.S'],
-             'outputs': ['<(INTERMEDIATE_DIR)/embedded.cc'],
-             'action': [
-               'python2',
-               'tools/snapshot/asm_to_inline_asm.py',
-               '>@(_inputs)',
-               '>@(_outputs)',
-             ],
-            },
-          ],
-          'sources': ['<(INTERMEDIATE_DIR)/embedded.cc'],
-        }, {
-          'sources': ['<(INTERMEDIATE_DIR)/embedded.S'],
-        }],
-      ],
-      'sources': [
-        '<(V8_ROOT)/src/init/setup-isolate-deserialize.cc',
-        '<(INTERMEDIATE_DIR)/snapshot.cc',
-      ],
-      'xcode_settings': {
-        # V8 7.4 over macOS10.11 compatibility
-        # Refs: https://github.com/nodejs/node/pull/26685
-        'GCC_GENERATE_DEBUGGING_SYMBOLS': 'NO',
-      },
-      'actions': [
-        {
-          'action_name': 'run_mksnapshot',
-          'message': 'generating: >@(_outputs)',
-          'variables': {
-            'mksnapshot_flags': [
-              '--turbo_instruction_scheduling',
-              '--no-partial-constant-pool',
-              # In cross builds, the snapshot may be generated for both the host and
-              # target toolchains.  The same host binary is used to generate both, so
-              # mksnapshot needs to know which target OS to use at runtime.  It's weird,
-              # but the target OS is really <(OS).
-              '--target_os=<(OS)',
-              '--target_arch=<(v8_target_arch)',
-              '--startup_src', '<(INTERMEDIATE_DIR)/snapshot.cc',
-              '--embedded_variant', 'Default',
-              '--embedded_src', '<(INTERMEDIATE_DIR)/embedded.S',
-            ],
-          },
-          'inputs': [
-            '<(mksnapshot_exec)',
-          ],
-          'outputs': [
-            '<(INTERMEDIATE_DIR)/snapshot.cc',
-            '<(INTERMEDIATE_DIR)/embedded.S',
-          ],
-          'sources': [
-            '<(INTERMEDIATE_DIR)/snapshot.cc',
-          ],
-          'conditions': [
-            ['v8_random_seed', {
-              'variables': {
-                'mksnapshot_flags': ['--random-seed', '<(v8_random_seed)'],
-              },
-            }],
-            ['v8_os_page_size', {
-              'variables': {
-                'mksnapshot_flags': ['--v8_os_page_size', '<(v8_os_page_size)'],
-              },
-            }],
-            ['v8_embed_script != ""', {
-              'inputs': ['<(v8_embed_script)'],
-              'variables': {
-                'mksnapshot_flags': ['<(v8_embed_script)'],
-              },
-            }],
-            ['v8_enable_snapshot_code_comments', {
-              'variables': {
-                'mksnapshot_flags': ['--code-comments'],
-              },
-            }],
-            ['v8_enable_snapshot_native_code_counters', {
-              'variables': {
-                'mksnapshot_flags': ['--native-code-counters'],
-              },
-            }, {
-               # --native-code-counters is the default in debug mode so make sure we can
-               # unset it.
-               'variables': {
-                 'mksnapshot_flags': ['--no-native-code-counters'],
-               },
-             }],
-          ],
-          'action': [
-            '>@(_inputs)',
-            '>@(mksnapshot_flags)',
-          ],
-        },
-      ],
-    },  # v8_snapshot
-    {
-      'target_name': 'v8_version',
-      'type': 'none',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'direct_dependent_settings': {
-        'sources': [
-          '<(V8_ROOT)/include/v8-value-serializer-version.h',
-          '<(V8_ROOT)/include/v8-version-string.h',
-          '<(V8_ROOT)/include/v8-version.h',
-        ],
-      },
-    },  # v8_version
-    {
-      'target_name': 'v8_headers',
-      'type': 'none',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'dependencies': [
-        'v8_version',
-      ],
-      'direct_dependent_settings': {
-        'sources': [
-          '<(V8_ROOT)/include/v8-cppgc.h',
-          '<(V8_ROOT)/include/v8-fast-api-calls.h',
-          '<(V8_ROOT)/include/v8-internal.h',
-          '<(V8_ROOT)/include/v8.h',
-          '<(V8_ROOT)/include/v8config.h',
-
-          # The following headers cannot be platform-specific. The include validation
-          # of `gn gen $dir --check` requires all header files to be available on all
-          # platforms.
-          '<(V8_ROOT)/include/v8-wasm-trap-handler-posix.h',
-          '<(V8_ROOT)/include/v8-wasm-trap-handler-win.h',
-        ],
-      },
-    },  # v8_headers
-    {
-      'target_name': 'v8_shared_internal_headers',
-      'type': 'none',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'dependencies': [
-        'v8_headers',
-      ],
-      'direct_dependent_settings': {
-        'sources': [
-          '<(V8_ROOT)/src/common/globals.h',
-        ],
-      },
-    },  # v8_shared_internal_headers
-    {
-      'target_name': 'v8_compiler_opt',
-      'type': 'static_library',
-      'dependencies': [
-        'generate_bytecode_builtins_list#target',
-        'run_torque#target',
-        'v8_maybe_icu',
-        'v8_base_without_compiler',
-      ],
-    'msvs_disabled_warnings': [4267, 4312, 4351, 4355, 4800, 4838, 4715],
-      'sources': ['<@(v8_compiler_sources)'],
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-        ['OS=="win"', {
-          'msvs_precompiled_header': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.h',
-          'msvs_precompiled_source': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.cc',
-          'sources': [
-            '<(_msvs_precompiled_header)',
-            '<(_msvs_precompiled_source)',
-          ],
-        }],
-      ],
-    },  # v8_compiler_opt
-    {
-      'target_name': 'v8_compiler',
-      'type': 'static_library',
-      'dependencies': [
-        'generate_bytecode_builtins_list#target',
-        'run_torque#target',
-        'v8_maybe_icu',
-        'v8_base_without_compiler',
-      ],
-      'msvs_disabled_warnings': [4267, 4312, 4351, 4355, 4800, 4838, 4715, 4309],
-      'msvs_settings': {
-        'VCCLCompilerTool': {
-          'AdditionalOptions': [
-            '/EHsc',
-            '/std:c++14',
-          ],
-        },
-      },
-      'sources': ['<@(v8_compiler_sources)'],
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-        ['OS=="win"', {
-          'msvs_precompiled_header': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.h',
-          'msvs_precompiled_source': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.cc',
-          'sources': [
-            '<(_msvs_precompiled_header)',
-            '<(_msvs_precompiled_source)',
-          ],
-        }],
-      ],
-    },  # v8_compiler
-    {
-      'target_name': 'v8_compiler_for_mksnapshot',
-      'type': 'none',
-      'hard_dependency': 1,
-      'dependencies': [
-        'generate_bytecode_builtins_list#target',
-        'run_torque#target',
-        'v8_maybe_icu',
-      ],
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-        ['is_component_build and not v8_optimized_debug and v8_enable_fast_mksnapshot', {
-          'dependencies': [
-            'v8_compiler_opt',
-          ],
-          'export_dependent_settings': [
-            'v8_compiler_opt',
-          ],
-        }, {
-           'dependencies': [
-             'v8_compiler',
-           ],
-           'export_dependent_settings': [
-             'v8_compiler',
-           ],
-         }],
-      ],
-    },  # v8_compiler_for_mksnapshot
-    {
-      'target_name': 'v8_base_without_compiler',
-      'type': 'static_library',
-      'dependencies': [
-        '<(V8_ROOT)/src/inspector/inspector.gyp:protocol_generated_sources#target',
-        # Code generators that only need to be build for the host.
-        'cppgc_base',
-        'torque_generated_definitions',
-        'v8_headers',
-        'v8_libbase',
-        'v8_libsampler',
-        'v8_shared_internal_headers',
-        'v8_version',
-        # BUILD.gn public_deps
-        'generate_bytecode_builtins_list#target',
-        'run_torque#target',
-        'v8_cppgc_shared',
-        'v8_maybe_icu',
-        'v8_zlib',
-      ],
-      'includes': ['src/inspector/inspector.gypi'],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(generate_bytecode_output_root)',
-          '<(torque_output_root)',
-        ],
-      },
-      'cflags_cc': ['-fno-exceptions'],
-      'cflags_cc_host': ['-fno-exceptions'],
-      'msvs_disabled_warnings': [4267, 4312, 4351, 4355, 4800, 4838, 4715, 4309],
-      'sources': [
-        # "//base/trace_event/common/trace_event_common.h",
-
-        ### gcmole(all) ###
-        '<(generate_bytecode_builtins_list_output)',
-
-        '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?sources = ")',
-        'src/wasm/baseline/liftoff-compiler-starboard.cc',
-
-        '<@(inspector_all_sources)',
-      ],
-      'conditions': [
-        ['v8_enable_third_party_heap==1', {
-          # TODO(targos): add values from v8_third_party_heap_files to sources
-        }, {
-          'sources': [
-            '<(V8_ROOT)/src/heap/third-party/heap-api-stub.cc',
-          ],
-        }],
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-        ['v8_control_flow_integrity==1', {
-          'sources': [
-            '<(V8_ROOT)/src/execution/arm64/pointer-authentication-arm64.h',
-          ],
-        }, {
-          'sources': [
-            '<(V8_ROOT)/src/execution/pointer-authentication-dummy.h',
-          ],
-        }],
-        ['v8_target_arch=="x86"', {
-          'sources': [  ### gcmole(arch:ia32) ###
-            '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"x86.*?sources \+= ")',
-          ],
-        }],
-        ['v8_target_arch=="x64"', {
-          'sources': [  ### gcmole(arch:x64) ###
-            '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"x64.*?sources \+= ")',
-          ],
-          'conditions': [
-            # iOS Xcode simulator builds run on an x64 target. iOS and macOS are both
-            # based on Darwin and thus POSIX-compliant to a similar degree.
-            ['OS=="linux" or OS=="mac" or OS=="ios" or OS=="freebsd"', {
-              'sources': [
-                '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?is_linux.*?sources \+= ")',
-              ],
-            }],
-            ['OS=="win"', {
-              'sources': [
-                '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?is_win.*?sources \+= ")',
-              ],
-            }],
-          ],
-        }],
-        ['v8_target_arch=="arm"', {
-          'sources': [  ### gcmole(arch:arm) ###
-            '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"arm\\".*?sources \+= ")',
-          ],
-        }],
-        ['v8_target_arch=="arm64"', {
-          'sources': [  ### gcmole(arch:arm64) ###
-            '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"arm64\\".*?sources \+= ")',
-          ],
-          'conditions': [
-            ['OS=="win"', {
-              'sources': [
-                "<(V8_ROOT)/src/diagnostics/unwinding-info-win64.cc",
-                "<(V8_ROOT)/src/diagnostics/unwinding-info-win64.h"
-              ],
-            }],
-          ],
-        }],
-        ['v8_target_arch=="mips" or v8_target_arch=="mipsel"', {
-          'sources': [  ### gcmole(arch:mipsel) ###
-            '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"mips\\".*?sources \+= ")',
-          ],
-        }],
-        ['v8_target_arch=="mips64" or v8_target_arch=="mips64el"', {
-          'sources': [  ### gcmole(arch:mips64el) ###
-            '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"mips64\\".*?sources \+= ")',
-          ],
-        }],
-        ['v8_target_arch=="ppc"', {
-          'sources': [  ### gcmole(arch:ppc) ###
-            '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"ppc\\".*?sources \+= ")',
-          ],
-        }],
-        ['v8_target_arch=="ppc64"', {
-          'sources': [  ### gcmole(arch:ppc64) ###
-            '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"ppc64\\".*?sources \+= ")',
-          ],
-        }],
-        ['v8_target_arch=="s390x"', {
-          'sources': [  ### gcmole(arch:s390) ###
-            '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"s390\\".*?sources \+= ")',
-          ],
-        }],
-        ['OS=="win"', {
-          'msvs_precompiled_header': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.h',
-          'msvs_precompiled_source': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.cc',
-          'sources': [
-            '<(_msvs_precompiled_header)',
-            '<(_msvs_precompiled_source)',
-          ],
-          # This will prevent V8's .cc files conflicting with the inspector's
-          # .cpp files in the same shard.
-          'msvs_settings': {
-            'VCCLCompilerTool': {
-              'ObjectFile': '$(IntDir)%(Extension)\\',
-            },
-          },
-        }],
-        ['is_starboard', {
-          'sources': ['src/deoptimizer/deoptimizer-cfi-empty.cc'],
-          'target_conditions': [
-            ['_toolset=="host"', {
-              # if _toolset="host", we use the native host build which does not
-              # involve Starboard at all.
-              'conditions': [
-                ['host_os=="win"', {
-                  'sources': [
-                    'src/diagnostics/unwinding-info-win64.cc',
-                    'src/diagnostics/unwinding-info-win64.h',
-                    'src/trap-handler/handler-inside-win.cc',
-                    'src/trap-handler/handler-inside-win.h',
-                    'src/trap-handler/handler-outside-win.cc',
-                    'src/heap/base/asm/x64/push_registers_masm.S',
-                  ],
-                  'sources/': [
-                    ['exclude','src/heap/base/asm/x64/push_registers_asm',]
-                  ],
-                }],
-                ['host_os=="linux" or host_os=="mac"', {
-                  'conditions': [
-                    ['v8_target_arch=="x64"', {
-                      'sources': [
-                        "src/trap-handler/handler-inside-posix.cc",
-                        "src/trap-handler/handler-inside-posix.h",
-                        "src/trap-handler/handler-outside-posix.cc",
-                      ],
-                    }],
-                  ],
-                }],
-              ],
-            }, {
-              'conditions': [
-                ['cobalt_compiled_by_msvc', {
-                  'sources': [
-                    'src/heap/base/asm/x64/push_registers_masm.S',
-                  ],
-                  'sources/': [
-                    ['exclude','src/heap/base/asm/x64/push_registers_asm',]
-                  ],
-                }],
-              ],
-            }],
-          ],
-        }],
-        ['component=="shared_library"', {
-          'defines': [
-            'BUILDING_V8_SHARED',
-          ],
-        }],
-        ['v8_enable_i18n_support', {
-          'dependencies': [
-            'run_gen-regexp-special-case',
-          ],
-          'sources': [
-            '<(SHARED_INTERMEDIATE_DIR)/src/regexp/special-case.cc',
-          ],
-          'conditions': [
-            ['icu_use_data_file_flag', {
-              'defines': ['ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE'],
-            }, {
-               'conditions': [
-                 ['OS=="win"', {
-                   'defines': ['ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_SHARED'],
-                 }, {
-                    'defines': ['ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC'],
-                  }],
-               ],
-             }],
-            ['OS=="win"', {
-              'dependencies': [
-                '<(icu_gyp_path):icudata#target',
-              ],
-            }],
-          ],
-        }, {  # v8_enable_i18n_support==0
-           'sources!': [
-             '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_enable_i18n_support.*?sources -= ")',
-           ],
-         }],
-        ['v8_postmortem_support', {
-          'dependencies': ['postmortem-metadata#target'],
-        }],
-        ['v8_enable_third_party_heap', {
-          # TODO(targos): add values from v8_third_party_heap_libs to link_settings.libraries
-        }],
-        # Platforms that don't have Compare-And-Swap (CAS) support need to link atomic library
-        # to implement atomic memory access
-        ['v8_current_cpu in ["mips", "mipsel", "mips64", "mips64el", "ppc", "arm"]', {
-          'link_settings': {
-            'libraries': ['-latomic', ],
-          },
-        }],
-      ],
-    },  # v8_base_without_compiler
-    {
-      'target_name': 'v8_base',
-      'type': 'none',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'dependencies': [
-        'v8_base_without_compiler',
-        'v8_compiler',
-      ],
-    },  # v8_base
-    {
-      'target_name': 'torque_base',
-      'type': 'static_library',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'sources': [
-        '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"torque_base.*?sources = ")',
-      ],
-      'dependencies': [
-        'v8_shared_internal_headers',
-        'v8_libbase',
-      ],
-      'defines!': [
-        '_HAS_EXCEPTIONS=0',
-        'BUILDING_V8_SHARED=1',
-      ],
-      'cflags_cc!': ['-fno-exceptions'],
-      'cflags_cc': ['-fexceptions'],
-      'xcode_settings': {
-        'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',  # -fexceptions
-      },
-      'msvs_settings': {
-        'VCCLCompilerTool': {
-          'RuntimeTypeInfo': 'true',
-          'ExceptionHandling': 1,
-        },
-      },
-    },  # torque_base
-    {
-      'target_name': 'torque_ls_base',
-      'type': 'static_library',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'sources': [
-        '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"torque_ls_base.*?sources = ")',
-      ],
-      'dependencies': [
-        'torque_base',
-      ],
-      'defines!': [
-        '_HAS_EXCEPTIONS=0',
-        'BUILDING_V8_SHARED=1',
-      ],
-      'cflags_cc!': ['-fno-exceptions'],
-      'cflags_cc': ['-fexceptions'],
-      'xcode_settings': {
-        'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',  # -fexceptions
-      },
-      'msvs_settings': {
-        'VCCLCompilerTool': {
-          'RuntimeTypeInfo': 'true',
-          'ExceptionHandling': 1,
-        },
-      },
-    },  # torque_ls_base
-    {
-      'target_name': 'v8_libbase',
-      'type': 'static_library',
-      'sources': [
-        '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_libbase.*?sources = ")',
-      ],
-
-      'dependencies': [
-        'v8_headers',
-      ],
-      'msvs_disabled_warnings': [4267, 4312, 4351, 4355, 4800, 4838, 4715, 4309],
-
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-        ['is_component_build', {
-          'defines': ["BUILDING_V8_BASE_SHARED"],
-        }],
-        ['is_posix or is_fuchsia', {
-          'sources': [
-            '<(V8_ROOT)/src/base/platform/platform-posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix.h',
-          ],
-          'conditions': [
-            ['OS != "aix" and OS != "solaris"', {
-              'sources': [
-                '<(V8_ROOT)/src/base/platform/platform-posix-time.cc',
-                '<(V8_ROOT)/src/base/platform/platform-posix-time.h',
-              ],
-            }],
-          ],
-        }],
-        ['OS=="linux"', {
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-linux.cc',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-ldl',
-              '-lrt'
-            ],
-          },
-        }],
-        ['OS=="aix"', {
-          'variables': {
-            # Used to differentiate `AIX` and `OS400`(IBM i).
-            'aix_variant_name': '<!(uname -s)',
-          },
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-aix.cc',
-          ],
-          'conditions': [
-            [ '"<(aix_variant_name)"=="AIX"', { # It is `AIX`
-              'link_settings': {
-                'libraries': [
-                  '-ldl',
-                  '-lrt'
-                ],
-              },
-            }],
-          ],
-        }],
-        ['is_android', {
-          'sources': [
-            '<(V8_ROOT)/src/base/platform/platform-posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix.h',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.h',
-          ],
-          'link_settings': {
-            'target_conditions': [
-              ['_toolset=="host" and host_os=="linux"', {
-                'libraries': [
-                  '-ldl',
-                  '-lrt'
-                ],
-              }],
-            ],
-          },
-          'target_conditions': [
-            ['_toolset=="host"', {
-              'sources': [
-                '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-                '<(V8_ROOT)/src/base/platform/platform-linux.cc',
-              ],
-            }, {
-              'sources': [
-                '<(V8_ROOT)/src/base/debug/stack_trace_android.cc',
-                '<(V8_ROOT)/src/base/platform/platform-linux.cc',
-              ],
-            }],
-          ],
-        }],
-        ['is_fuchsia', {
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_fuchsia.cc',
-            '<(V8_ROOT)/src/base/platform/platform-fuchsia.cc',
-          ]
-        }],
-        ['OS == "mac" or OS == "ios"', {
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-macos.cc',
-          ]
-        }],
-        ['is_win', {
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_win.cc',
-            '<(V8_ROOT)/src/base/platform/platform-win32.cc',
-            '<(V8_ROOT)/src/base/win32-headers.h',
-          ],
-          'conditions': [['target_arch == "arm64"', {
-            'defines': ['_WIN32_WINNT=0x0602'], # For GetCurrentThreadStackLimits on Windows on Arm
-          }]],
-          'defines': ['_CRT_RAND_S'], # for rand_s()
-          'direct_dependent_settings': {
-            'msvs_settings': {
-              'VCLinkerTool': {
-                'AdditionalDependencies': [
-                  'dbghelp.lib',
-                  'winmm.lib',
-                  'ws2_32.lib'
-                ]
-              }
-            },
-          },
-        }],
-        ['target_arch == "mips" or OS == "mips64"', {
-          # here just for 'BUILD.gn' sync
-          # 'data': [
-          #   '<(V8_ROOT)/tools/mips_toolchain/sysroot/usr/lib/',
-          #   '<(V8_ROOT)/tools/mips_toolchain/sysroot/usr/lib/',
-          # ],
-        }],
-        # end of conditions from 'BUILD.gn'
-
-        # Node.js validated
-        ['OS=="solaris"', {
-          'link_settings': {
-            'libraries': [
-              '-lnsl',
-              '-lrt',
-            ]
-          },
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-solaris.cc',
-          ],
-        }],
-
-        # YMMV with the following conditions
-        ['OS=="qnx"', {
-          'link_settings': {
-            'target_conditions': [
-              ['_toolset=="host" and host_os=="linux"', {
-                'libraries': [
-                  '-lrt'
-                ],
-              }],
-              ['_toolset=="target"', {
-                'libraries': [
-                  '-lbacktrace'
-                ],
-              }],
-            ],
-          },
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix.h',
-            '<(V8_ROOT)/src/base/platform/platform-posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.h',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.cc',
-            '<(V8_ROOT)/src/base/qnx-math.h'
-          ],
-          'target_conditions': [
-            ['_toolset=="host" and host_os=="linux"', {
-              'sources': [
-                '<(V8_ROOT)/src/base/platform/platform-linux.cc'
-              ],
-            }],
-            ['_toolset=="host" and host_os=="mac"', {
-              'sources': [
-                '<(V8_ROOT)/src/base/platform/platform-macos.cc'
-              ],
-            }],
-            ['_toolset=="target"', {
-              'sources': [
-                '<(V8_ROOT)/src/base/platform/platform-qnx.cc'
-              ],
-            }],
-          ],
-        },
-         ],
-        ['OS=="freebsd"', {
-          'link_settings': {
-            'libraries': [
-              '-L/usr/local/lib -lexecinfo',
-            ]
-          },
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-freebsd.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix.h',
-            '<(V8_ROOT)/src/base/platform/platform-posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.h',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.cc',
-          ],
-        }
-         ],
-        ['OS=="openbsd"', {
-          'link_settings': {
-            'libraries': [
-              '-L/usr/local/lib -lexecinfo',
-            ]
-          },
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-openbsd.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix.h',
-            '<(V8_ROOT)/src/base/platform/platform-posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.h',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.cc',
-          ],
-        }
-         ],
-        ['OS=="netbsd"', {
-          'link_settings': {
-            'libraries': [
-              '-L/usr/pkg/lib -Wl,-R/usr/pkg/lib -lexecinfo',
-            ]
-          },
-          'sources': [
-            '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-openbsd.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix.h',
-            '<(V8_ROOT)/src/base/platform/platform-posix.cc',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.h',
-            '<(V8_ROOT)/src/base/platform/platform-posix-time.cc',
-          ],
-        }
-         ],
-        ['is_starboard', {
-          'target_conditions': [
-            ['_toolset=="host"', {
-              # if _toolset="host", we use the native host build which does not
-              # involve Starboard at all.
-              'target_conditions': [
-                ['host_os=="linux"', {
-                  'ldflags_host': [
-                    '-ldl',
-                    '-lrt'
-                  ],
-                  'sources': [
-                    '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-                    '<(V8_ROOT)/src/base/platform/platform-linux.cc',
-                    '<(V8_ROOT)/src/base/platform/platform-posix.h',
-                    '<(V8_ROOT)/src/base/platform/platform-posix.cc',
-                    '<(V8_ROOT)/src/base/platform/platform-posix-time.h',
-                    '<(V8_ROOT)/src/base/platform/platform-posix-time.cc',
-                  ],
-                }],
-                ['host_os=="win"', {
-                  # Most of the following codes are copied from 'OS="win"'
-                  # section.
-                  'defines': [
-                    '_CRT_RAND_S'  # for rand_s()
-                  ],
-                  'variables': {
-                    'gyp_generators': '<!pymod_do_main(starboard.build.gyp_functions getenv GYP_GENERATORS)',
-                  },
-                  'sources': [
-                    '<(V8_ROOT)/src/base/debug/stack_trace_win.cc',
-                    '<(V8_ROOT)/src/base/platform/platform-win32.cc',
-                    '<(V8_ROOT)/src/base/win32-headers.h',
-                  ],
-                  'include_dirs': [
-                    '<(torque_output_root)',
-                  ],
-                  'msvs_disabled_warnings': [4351, 4355, 4800],
-                }],
-                ['host_os == "mac"', {
-                  'sources': [
-                    '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',
-                    '<(V8_ROOT)/src/base/platform/platform-macos.cc',
-                    '<(V8_ROOT)/src/base/platform/platform-posix.h',
-                    '<(V8_ROOT)/src/base/platform/platform-posix.cc',
-                    '<(V8_ROOT)/src/base/platform/platform-posix-time.h',
-                    '<(V8_ROOT)/src/base/platform/platform-posix-time.cc',
-                  ],
-                }],
-              ],
-            }, {
-              # If _toolset=="target", build with target platform's Starboard.
-              'sources': [
-                '<(V8_ROOT)/src/base/debug/stack_trace_starboard.cc',
-                '<(V8_ROOT)/src/base/platform/platform-starboard.cc',
-              ],
-            }],
-          ],
-        }],
-      ],
-    },  # v8_libbase
-    {
-      'target_name': 'v8_libplatform',
-      'type': 'static_library',
-      'dependencies': [
-        'v8_libbase',
-      ],
-      'sources': [
-        '<(V8_ROOT)/base/trace_event/common/trace_event_common.h',
-        '<(V8_ROOT)/include/libplatform/libplatform-export.h',
-        '<(V8_ROOT)/include/libplatform/libplatform.h',
-        '<(V8_ROOT)/include/libplatform/v8-tracing.h',
-        '<(V8_ROOT)/src/libplatform/default-foreground-task-runner.cc',
-        '<(V8_ROOT)/src/libplatform/default-foreground-task-runner.h',
-        '<(V8_ROOT)/src/libplatform/default-job.cc',
-        '<(V8_ROOT)/src/libplatform/default-job.h',
-        '<(V8_ROOT)/src/libplatform/default-platform.cc',
-        '<(V8_ROOT)/src/libplatform/default-platform.h',
-        '<(V8_ROOT)/src/libplatform/default-worker-threads-task-runner.cc',
-        '<(V8_ROOT)/src/libplatform/default-worker-threads-task-runner.h',
-        '<(V8_ROOT)/src/libplatform/delayed-task-queue.cc',
-        '<(V8_ROOT)/src/libplatform/delayed-task-queue.h',
-        '<(V8_ROOT)/src/libplatform/task-queue.cc',
-        '<(V8_ROOT)/src/libplatform/task-queue.h',
-        '<(V8_ROOT)/src/libplatform/tracing/trace-buffer.cc',
-        '<(V8_ROOT)/src/libplatform/tracing/trace-buffer.h',
-        '<(V8_ROOT)/src/libplatform/tracing/trace-config.cc',
-        '<(V8_ROOT)/src/libplatform/tracing/trace-object.cc',
-        '<(V8_ROOT)/src/libplatform/tracing/trace-writer.cc',
-        '<(V8_ROOT)/src/libplatform/tracing/trace-writer.h',
-        '<(V8_ROOT)/src/libplatform/tracing/tracing-controller.cc',
-        '<(V8_ROOT)/src/libplatform/worker-thread.cc',
-        '<(V8_ROOT)/src/libplatform/worker-thread.h',
-      ],
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-        ['component=="shared_library"', {
-          'direct_dependent_settings': {
-            'defines': ['USING_V8_PLATFORM_SHARED'],
-          },
-          'defines': ['BUILDING_V8_PLATFORM_SHARED'],
-        }],
-        ['v8_use_perfetto', {
-          'sources': [
-            '<(V8_ROOT)/src/libplatform/tracing/json-trace-event-listener.cc',
-            '<(V8_ROOT)/src/libplatform/tracing/json-trace-event-listener.h',
-            '<(V8_ROOT)/src/libplatform/tracing/trace-event-listener.cc',
-            '<(V8_ROOT)/src/libplatform/tracing/trace-event-listener.h',
-          ],
-          'dependencies': [
-            '<(V8_ROOT)/third_party/perfetto:libperfetto',
-            '<(V8_ROOT)/third_party/perfetto/protos/perfetto/trace:lite',
-          ],
-        }],
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(V8_ROOT)/include',
-        ],
-      },
-    },  # v8_libplatform
-    {
-      'target_name': 'v8_libsampler',
-      'type': 'static_library',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'dependencies': [
-        'v8_libbase',
-      ],
-      'sources': [
-        '<(V8_ROOT)/src/libsampler/sampler.cc',
-        '<(V8_ROOT)/src/libsampler/sampler.h'
-      ],
-    },  # v8_libsampler
-    {
-      'target_name': 'bytecode_builtins_list_generator',
-      'type': 'executable',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host'],
-        }],
-      ],
-      'defines!': [
-        'BUILDING_V8_SHARED=1',
-      ],
-      'dependencies': [
-        "v8_libbase",
-        # "build/win:default_exe_manifest",
-      ],
-      'sources': [
-        "<(V8_ROOT)/src/builtins/generate-bytecodes-builtins-list.cc",
-        "<(V8_ROOT)/src/interpreter/bytecode-operands.cc",
-        "<(V8_ROOT)/src/interpreter/bytecode-operands.h",
-        "<(V8_ROOT)/src/interpreter/bytecodes.cc",
-        "<(V8_ROOT)/src/interpreter/bytecodes.h",
-      ],
-    },  # bytecode_builtins_list_generator
-    {
-      'target_name': 'mksnapshot',
-      'type': 'executable',
-      'dependencies': [
-        'v8_base_without_compiler',
-        'v8_compiler_for_mksnapshot',
-        'v8_init',
-        'v8_libbase',
-        'v8_libplatform',
-        'v8_maybe_icu',
-        # "build/win:default_exe_manifest",
-      ],
-
-      'sources': [
-        '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"mksnapshot.*?sources = ")',
-      ],
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host'],
-        }],
-        ['clang==1 and host_os!="mac"', {
-          'ldflags_host': [
-            '-fuse-ld=lld',
-          ],
-        }],
-      ],
-    },  # mksnapshot
-    {
-      'target_name': 'torque',
-      'type': 'executable',
-      'dependencies': [
-        'torque_base',
-        # "build/win:default_exe_manifest",
-      ],
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host'],
-        }],
-      ],
-      'defines!': [
-        '_HAS_EXCEPTIONS=0',
-        'BUILDING_V8_SHARED=1',
-      ],
-      'cflags_cc!': ['-fno-exceptions'],
-      'cflags_cc': ['-fexceptions'],
-      'xcode_settings': {
-        'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',  # -fexceptions
-      },
-      'msvs_settings': {
-        'VCCLCompilerTool': {
-          'RuntimeTypeInfo': 'true',
-          'ExceptionHandling': 1,
-        },
-        'VCLinkerTool': {
-          'AdditionalDependencies': [
-            'dbghelp.lib',
-            'winmm.lib',
-            'ws2_32.lib'
-          ]
-        }
-      },
-      'sources': [
-        "<(V8_ROOT)/src/torque/torque.cc",
-      ],
-    },  # torque
-    {
-      'target_name': 'torque-language-server',
-      'type': 'executable',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host'],
-        }],
-      ],
-      'dependencies': [
-        'torque_base',
-        'torque_ls_base',
-        # "build/win:default_exe_manifest",
-      ],
-      'defines!': [
-        '_HAS_EXCEPTIONS=0',
-        'BUILDING_V8_SHARED=1',
-      ],
-      'msvs_settings': {
-        'VCCLCompilerTool': {
-          'RuntimeTypeInfo': 'true',
-          'ExceptionHandling': 1,
-        },
-      },
-      'sources': [
-        "<(V8_ROOT)/src/torque/ls/torque-language-server.cc",
-      ],
-    },  # torque-language-server
-    {
-      'target_name': 'gen-regexp-special-case',
-      'type': 'executable',
-      'dependencies': [
-        'v8_libbase',
-        # "build/win:default_exe_manifest",
-        'v8_maybe_icu',
-      ],
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host'],
-        }],
-      ],
-      'sources': [
-        "<(V8_ROOT)/src/regexp/gen-regexp-special-case.cc",
-      ],
-    },  # gen-regexp-special-case
-#    {
-#      'target_name': 'run_gen-regexp-special-case',
-#      'type': 'none',
-#      'conditions': [
-#        ['want_separate_host_toolset', {
-#          'dependencies': ['gen-regexp-special-case#host'],
-#          'toolsets': ['host', 'target'],
-#        }, {
-#          'dependencies': ['gen-regexp-special-case'],
-#        }],
-#      ],
-#      'actions': [
-#        {
-#          'action_name': 'run_gen-regexp-special-case_action',
-#          'inputs': [
-#            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)gen-regexp-special-case<(EXECUTABLE_SUFFIX)',
-#          ],
-#          'outputs': [
-#            '<(SHARED_INTERMEDIATE_DIR)/src/regexp/special-case.cc',
-#          ],
-#          'action': [
-#            'python2',
-#            '<(V8_ROOT)/tools/run.py',
-#            '<@(_inputs)',
-#            '<@(_outputs)',
-#          ],
-#        },
-#      ],
-#    },  # run_gen-regexp-special-case
-    {
-      'target_name': 'cppgc_base',
-      'type': 'none',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-      ],
-      'direct_dependent_settings': {
-        'sources': [
-          '<!@pymod_do_main(third_party.v8.gypfiles.GN-scraper "<(V8_ROOT)/BUILD.gn"  "v8_source_set.\\"cppgc_base.*?sources = ")',
-        ],
-      },
-    },  # cppgc_base
-    {
-      'target_name': 'v8_cppgc_shared',
-      'type': 'none',
-      'toolsets': ['host', 'target'],
-      'direct_dependent_settings': {
-        'sources': [
-          '<(V8_ROOT)/src/heap/base/stack.cc',
-          '<(V8_ROOT)/src/heap/base/stack.h',
-          '<(V8_ROOT)/src/heap/base/worklist.cc',
-          '<(V8_ROOT)/src/heap/base/worklist.h',
-        ],
-        'conditions': [
-          ['clang or OS!="win"', {
-            'conditions': [
-              ['_toolset == "host" and host_arch == "x64" or _toolset == "target" and target_arch=="x64"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/x64/push_registers_asm.cc',
-                ],
-              }],
-              ['_toolset == "host" and target_arch == "arm" or _toolset == "host" and target_arch=="x86"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/ia32/push_registers_asm.cc',
-                ],
-                # x86 target requires x86 host build.
-                'sources/': [
-                  ['exclude','src/heap/base/asm/x64/push_registers_asm',]
-                ],
-              }],
-              ['_toolset == "host" and host_arch == "arm" or _toolset == "target" and target_arch=="arm"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/arm/push_registers_asm.cc',
-                ],
-              }],
-              ['_toolset == "host" and host_arch == "arm64" or _toolset == "target" and target_arch=="arm64"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/arm64/push_registers_asm.cc',
-                ],
-              }],
-              ['_toolset == "host" and host_arch == "ppc64" or _toolset == "target" and target_arch=="ppc64"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/ppc/push_registers_asm.cc',
-                ],
-              }],
-              ['_toolset == "host" and host_arch == "s390x" or _toolset == "target" and target_arch=="s390x"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/s390/push_registers_asm.cc',
-                ],
-              }],
-              ['_toolset == "host" and host_arch == "mips" or _toolset == "target" and target_arch=="mips" or _toolset == "host" and host_arch == "mipsel" or _toolset == "target" and target_arch=="mipsel"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/mips/push_registers_asm.cc',
-                ],
-              }],
-              ['_toolset == "host" and host_arch == "mips64" or _toolset == "target" and target_arch=="mips64" or _toolset == "host" and host_arch == "mips64el" or _toolset == "target" and target_arch=="mips64el"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/mips64/push_registers_asm.cc',
-                ],
-              }],
-            ]
-          }],
-          ['OS=="win"', {
-            'conditions': [
-              ['_toolset == "host" and host_arch == "x64" or _toolset == "target" and target_arch=="x64"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/x64/push_registers_masm.S',
-                ],
-              }],
-              ['_toolset == "host" and host_arch == "x86" or _toolset == "target" and target_arch=="x86"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/ia32/push_registers_masm.S',
-                ],
-              }],
-              ['_toolset == "host" and host_arch == "arm64" or _toolset == "target" and target_arch=="arm64"', {
-                'sources': [
-                  '<(V8_ROOT)/src/heap/base/asm/arm64/push_registers_masm.S',
-                ],
-              }],
-            ],
-          }],
-        ],
-      },
-    },  # v8_cppgc_shared
-
-    ###############################################################################
-    # Public targets
-    #
-
-    {
-      'target_name': 'v8',
-      'hard_dependency': 1,
-      'toolsets': ['target'],
-      'dependencies': [
-        'v8_snapshot',
-      ],
-      'conditions': [
-        ['component=="shared_library"', {
-          'type': '<(component)',
-          'sources': [
-            # Note: on non-Windows we still build this file so that gyp
-            # has some sources to link into the component.
-            '<(V8_ROOT)/src/utils/v8dll-main.cc',
-          ],
-          'defines': [
-            'BUILDING_V8_SHARED',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'USING_V8_SHARED',
-            ],
-          },
-          'conditions': [
-            ['OS=="mac"', {
-              'xcode_settings': {
-                'OTHER_LDFLAGS': ['-dynamiclib', '-all_load']
-              },
-            }],
-            ['soname_version!=""', {
-              'product_extension': 'so.<(soname_version)',
-            }],
-          ],
-        },
-         {
-           'type': 'none',
-         }],
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(V8_ROOT)/include',
-        ],
-      },
-      'actions': [
-        {
-          'action_name': 'v8_dump_build_config',
-          'inputs': [
-            '<(V8_ROOT)/tools/testrunner/utils/dump_build_config_gyp.py',
-          ],
-          'outputs': [
-            '<(PRODUCT_DIR)/v8_build_config.json',
-          ],
-          'variables': {
-            'v8_dump_build_config_args': [
-              '<(PRODUCT_DIR)/v8_build_config.json',
-              'dcheck_always_on=<(dcheck_always_on)',
-              'is_android=<(is_android)',
-              'is_asan=<(asan)',
-              'is_cfi=<(cfi_vptr)',
-              'is_clang=<(clang)',
-              'is_component_build=<(component)',
-              'is_debug=<(CONFIGURATION_NAME)',
-              # Not available in gyp.
-              'is_gcov_coverage=0',
-              'is_msan=<(msan)',
-              'is_tsan=<(tsan)',
-              # Not available in gyp.
-              'is_ubsan_vptr=0',
-              'target_cpu=<(target_arch)',
-              'v8_enable_i18n_support=<(v8_enable_i18n_support)',
-              'v8_enable_verify_predictable=<(v8_enable_verify_predictable)',
-              'v8_target_cpu=<(v8_target_arch)',
-              'v8_use_siphash=<(v8_use_siphash)',
-              'v8_enable_verify_csa=<(v8_enable_verify_csa)',
-              'v8_enable_lite_mode=<(v8_enable_lite_mode)',
-              'v8_enable_pointer_compression=<(v8_enable_pointer_compression)',
-            ]
-          },
-          'conditions': [
-            ['v8_target_arch=="mips" or v8_target_arch=="mipsel" \
-              or v8_target_arch=="mips64" or v8_target_arch=="mips64el"', {
-              'v8_dump_build_config_args': [
-                'mips_arch_variant=<(mips_arch_variant)',
-                'mips_use_msa=<(mips_use_msa)',
-              ],
-            }],
-          ],
-          'action': [
-            'python2', '<(V8_ROOT)/tools/testrunner/utils/dump_build_config_gyp.py',
-            '<@(v8_dump_build_config_args)',
-          ],
-        },
-      ],
-    },  # v8
-    # missing a bunch of fuzzer targets
-
-    ###############################################################################
-    # Protobuf targets, used only when building outside of chromium.
-    #
-
-    {
-      'target_name': 'postmortem-metadata',
-      'type': 'none',
-      'dependencies': ['run_torque#target'],
-      'variables': {
-        'heapobject_files': [
-          '<(torque_output_root)/torque-generated/instance-types.h',
-          '<(V8_ROOT)/src/objects/allocation-site.h',
-          '<(V8_ROOT)/src/objects/allocation-site-inl.h',
-          '<(V8_ROOT)/src/objects/cell.h',
-          '<(V8_ROOT)/src/objects/cell-inl.h',
-          '<(V8_ROOT)/src/objects/code.h',
-          '<(V8_ROOT)/src/objects/code-inl.h',
-          '<(V8_ROOT)/src/objects/data-handler.h',
-          '<(V8_ROOT)/src/objects/data-handler-inl.h',
-          '<(V8_ROOT)/src/objects/descriptor-array.h',
-          '<(V8_ROOT)/src/objects/descriptor-array-inl.h',
-          '<(V8_ROOT)/src/objects/feedback-cell.h',
-          '<(V8_ROOT)/src/objects/feedback-cell-inl.h',
-          '<(V8_ROOT)/src/objects/fixed-array.h',
-          '<(V8_ROOT)/src/objects/fixed-array-inl.h',
-          '<(V8_ROOT)/src/objects/heap-number.h',
-          '<(V8_ROOT)/src/objects/heap-number-inl.h',
-          '<(V8_ROOT)/src/objects/heap-object.h',
-          '<(V8_ROOT)/src/objects/heap-object-inl.h',
-          '<(V8_ROOT)/src/objects/instance-type.h',
-          '<(V8_ROOT)/src/objects/js-array-buffer.h',
-          '<(V8_ROOT)/src/objects/js-array-buffer-inl.h',
-          '<(V8_ROOT)/src/objects/js-array.h',
-          '<(V8_ROOT)/src/objects/js-array-inl.h',
-          '<(V8_ROOT)/src/objects/js-function-inl.h',
-          '<(V8_ROOT)/src/objects/js-function.cc',
-          '<(V8_ROOT)/src/objects/js-function.h',
-          '<(V8_ROOT)/src/objects/js-objects.cc',
-          '<(V8_ROOT)/src/objects/js-objects.h',
-          '<(V8_ROOT)/src/objects/js-objects-inl.h',
-          '<(V8_ROOT)/src/objects/js-promise.h',
-          '<(V8_ROOT)/src/objects/js-promise-inl.h',
-          '<(V8_ROOT)/src/objects/js-regexp.cc',
-          '<(V8_ROOT)/src/objects/js-regexp.h',
-          '<(V8_ROOT)/src/objects/js-regexp-inl.h',
-          '<(V8_ROOT)/src/objects/js-regexp-string-iterator.h',
-          '<(V8_ROOT)/src/objects/js-regexp-string-iterator-inl.h',
-          '<(V8_ROOT)/src/objects/map.cc',
-          '<(V8_ROOT)/src/objects/map.h',
-          '<(V8_ROOT)/src/objects/map-inl.h',
-          '<(V8_ROOT)/src/objects/name.h',
-          '<(V8_ROOT)/src/objects/name-inl.h',
-          '<(V8_ROOT)/src/objects/objects.h',
-          '<(V8_ROOT)/src/objects/objects-inl.h',
-          '<(V8_ROOT)/src/objects/oddball.h',
-          '<(V8_ROOT)/src/objects/oddball-inl.h',
-          '<(V8_ROOT)/src/objects/primitive-heap-object.h',
-          '<(V8_ROOT)/src/objects/primitive-heap-object-inl.h',
-          '<(V8_ROOT)/src/objects/scope-info.h',
-          '<(V8_ROOT)/src/objects/script.h',
-          '<(V8_ROOT)/src/objects/script-inl.h',
-          '<(V8_ROOT)/src/objects/shared-function-info.cc',
-          '<(V8_ROOT)/src/objects/shared-function-info.h',
-          '<(V8_ROOT)/src/objects/shared-function-info-inl.h',
-          '<(V8_ROOT)/src/objects/string.cc',
-          '<(V8_ROOT)/src/objects/string-comparator.cc',
-          '<(V8_ROOT)/src/objects/string-comparator.h',
-          '<(V8_ROOT)/src/objects/string.h',
-          '<(V8_ROOT)/src/objects/string-inl.h',
-          '<(V8_ROOT)/src/objects/struct.h',
-          '<(V8_ROOT)/src/objects/struct-inl.h',
-        ],
-      },
-      'actions': [
-        {
-          'action_name': 'gen-postmortem-metadata',
-          'inputs': [
-            '<(V8_ROOT)/tools/gen-postmortem-metadata.py',
-            '<@(heapobject_files)',
-          ],
-          'outputs': [
-            '<(SHARED_INTERMEDIATE_DIR)/debug-support.cc',
-          ],
-          'action': [
-            'python2',
-            '<(V8_ROOT)/tools/gen-postmortem-metadata.py',
-            '<@(_outputs)',
-            '<@(heapobject_files)'
-          ],
-        },
-      ],
-      'direct_dependent_settings': {
-        'sources': ['<(SHARED_INTERMEDIATE_DIR)/debug-support.cc', ],
-      },
-    },  # postmortem-metadata
-
-    {
-      'target_name': 'v8_zlib',
-      'type': 'static_library',
-      'conditions': [
-        ['want_separate_host_toolset', {
-          'toolsets': ['host', 'target'],
-        }],
-        ['OS=="win"', {
-          'conditions': [
-            ['"<(target_arch)"=="arm64" and _toolset=="target"', {
-              'defines': ['CPU_NO_SIMD']
-            }, {
-              'defines': ['X86_WINDOWS']
-            }]
-          ]
-        }],
-      ],
-
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(DEPTH)/third_party/zlib',
-          '<(DEPTH)/third_party/zlib/google',
-        ],
-      },
-      'dependencies': [
-        '<(DEPTH)/third_party/zlib/zlib.gyp:zlib#target',
-      ],
-      'target_conditions': [
-        # cobalt/src/third_party/zlib/zlib.gyp does not provide a host biuld,
-        # We can use the following simple zlib build rule from nodejs but for
-        # target builds we need to use the starboardized gyp rule.
-        ['_toolset == "host"', {
-          'defines': [ 'ZLIB_IMPLEMENTATION' ],
-          'include_dirs': [
-            '<(DEPTH)/third_party/zlib',
-            '<(DEPTH)/third_party/zlib/google',
-          ],
-          'sources': [
-            '<(DEPTH)/third_party/zlib/adler32.c',
-            '<(DEPTH)/third_party/zlib/chromeconf.h',
-            '<(DEPTH)/third_party/zlib/compress.c',
-            '<(DEPTH)/third_party/zlib/contrib/optimizations/insert_string.h',
-            '<(DEPTH)/third_party/zlib/contrib/optimizations/insert_string.h',
-            #'<(DEPTH)/third_party/zlib/cpu_features.c',
-            #'<(DEPTH)/third_party/zlib/cpu_features.h',
-            '<(DEPTH)/third_party/zlib/crc32.c',
-            '<(DEPTH)/third_party/zlib/crc32.h',
-            '<(DEPTH)/third_party/zlib/deflate.c',
-            '<(DEPTH)/third_party/zlib/deflate.h',
-            '<(DEPTH)/third_party/zlib/gzclose.c',
-            '<(DEPTH)/third_party/zlib/gzguts.h',
-            '<(DEPTH)/third_party/zlib/gzlib.c',
-            '<(DEPTH)/third_party/zlib/gzread.c',
-            '<(DEPTH)/third_party/zlib/gzwrite.c',
-            '<(DEPTH)/third_party/zlib/infback.c',
-            '<(DEPTH)/third_party/zlib/inffast.c',
-            '<(DEPTH)/third_party/zlib/inffast.h',
-            '<(DEPTH)/third_party/zlib/inffixed.h',
-            '<(DEPTH)/third_party/zlib/inflate.c',
-            '<(DEPTH)/third_party/zlib/inflate.h',
-            '<(DEPTH)/third_party/zlib/inftrees.c',
-            '<(DEPTH)/third_party/zlib/inftrees.h',
-            '<(DEPTH)/third_party/zlib/trees.c',
-            '<(DEPTH)/third_party/zlib/trees.h',
-            '<(DEPTH)/third_party/zlib/uncompr.c',
-            '<(DEPTH)/third_party/zlib/zconf.h',
-            '<(DEPTH)/third_party/zlib/zlib.h',
-            '<(DEPTH)/third_party/zlib/zutil.c',
-            '<(DEPTH)/third_party/zlib/zutil.h',
-            '<(DEPTH)/third_party/zlib/google/compression_utils_portable.cc',
-            '<(DEPTH)/third_party/zlib/google/compression_utils_portable.h',
-          ],
-        }],
-      ],
-    },  # v8_zlib
-  ],
-}
-
diff --git a/third_party/web_platform_tests/XMLHttpRequest/resources/auth2/corsenabled.py b/third_party/web_platform_tests/XMLHttpRequest/resources/auth2/corsenabled.py
index a725d62..13925b8 100644
--- a/third_party/web_platform_tests/XMLHttpRequest/resources/auth2/corsenabled.py
+++ b/third_party/web_platform_tests/XMLHttpRequest/resources/auth2/corsenabled.py
@@ -7,11 +7,8 @@
     response.headers.set('Access-Control-Allow-Methods', 'GET');
     response.headers.set('Access-Control-Allow-Headers', 'authorization, x-user, x-pass');
     response.headers.set('Access-Control-Expose-Headers', 'x-challenge, xhr-user, ses-user');
-    auth = imp.load_source("", os.path.join(os.path.abspath(os.curdir),
-                                            "third_party",
-                                            "web_platform_tests",
-                                            "XMLHttpRequest",
-                                            "resources",
+    auth = imp.load_source("", os.path.join(os.path.abspath(os.path.dirname(__file__)),
+                                            os.pardir,
                                             "authentication.py"))
     if request.method == "OPTIONS":
         return ""
diff --git a/third_party/web_platform_tests/XMLHttpRequest/resources/auth7/corsenabled.py b/third_party/web_platform_tests/XMLHttpRequest/resources/auth7/corsenabled.py
index a725d62..13925b8 100644
--- a/third_party/web_platform_tests/XMLHttpRequest/resources/auth7/corsenabled.py
+++ b/third_party/web_platform_tests/XMLHttpRequest/resources/auth7/corsenabled.py
@@ -7,11 +7,8 @@
     response.headers.set('Access-Control-Allow-Methods', 'GET');
     response.headers.set('Access-Control-Allow-Headers', 'authorization, x-user, x-pass');
     response.headers.set('Access-Control-Expose-Headers', 'x-challenge, xhr-user, ses-user');
-    auth = imp.load_source("", os.path.join(os.path.abspath(os.curdir),
-                                            "third_party",
-                                            "web_platform_tests",
-                                            "XMLHttpRequest",
-                                            "resources",
+    auth = imp.load_source("", os.path.join(os.path.abspath(os.path.dirname(__file__)),
+                                            os.pardir,
                                             "authentication.py"))
     if request.method == "OPTIONS":
         return ""
diff --git a/third_party/web_platform_tests/XMLHttpRequest/resources/auth8/corsenabled-no-authorize.py b/third_party/web_platform_tests/XMLHttpRequest/resources/auth8/corsenabled-no-authorize.py
index e41183d..7a733cb 100644
--- a/third_party/web_platform_tests/XMLHttpRequest/resources/auth8/corsenabled-no-authorize.py
+++ b/third_party/web_platform_tests/XMLHttpRequest/resources/auth8/corsenabled-no-authorize.py
@@ -7,11 +7,8 @@
     response.headers.set('Access-Control-Allow-Methods', 'GET');
     response.headers.set('Access-Control-Allow-Headers', 'x-user, x-pass');
     response.headers.set('Access-Control-Expose-Headers', 'x-challenge, xhr-user, ses-user');
-    auth = imp.load_source("", os.path.join(os.path.abspath(os.curdir),
-                                            "third_party",
-                                            "web_platform_tests",
-                                            "XMLHttpRequest",
-                                            "resources",
+    auth = imp.load_source("", os.path.join(os.path.abspath(os.path.dirname(__file__)),
+                                            os.pardir,
                                             "authentication.py"))
     if request.method == "OPTIONS":
         return ""
diff --git a/third_party/web_platform_tests/XMLHttpRequest/resources/inspect-headers.py b/third_party/web_platform_tests/XMLHttpRequest/resources/inspect-headers.py
index ca59605..ec97bf1 100644
--- a/third_party/web_platform_tests/XMLHttpRequest/resources/inspect-headers.py
+++ b/third_party/web_platform_tests/XMLHttpRequest/resources/inspect-headers.py
@@ -11,7 +11,7 @@
     filter_name = request.GET.first("filter_name", "").lower()
 
     result = ""
-    for name, value in request.headers.iteritems():
+    for name, value in request.headers.items():
         if filter_value:
             if value == filter_value:
                 result += name.lower() + ","
diff --git a/third_party/web_platform_tests/XMLHttpRequest/resources/trickle.py b/third_party/web_platform_tests/XMLHttpRequest/resources/trickle.py
index 0e70944..62fe0c2 100644
--- a/third_party/web_platform_tests/XMLHttpRequest/resources/trickle.py
+++ b/third_party/web_platform_tests/XMLHttpRequest/resources/trickle.py
@@ -7,6 +7,6 @@
     response.headers.set("Content-type", "text/plain")
     response.write_status_headers()
     time.sleep(delay);
-    for i in xrange(count):
+    for i in range(count):
         response.writer.write_content("TEST_TRICKLE\n")
         time.sleep(delay)
diff --git a/third_party/web_platform_tests/content-security-policy/support/report.py b/third_party/web_platform_tests/content-security-policy/support/report.py
index 193315f..729d907 100644
--- a/third_party/web_platform_tests/content-security-policy/support/report.py
+++ b/third_party/web_platform_tests/content-security-policy/support/report.py
@@ -31,4 +31,4 @@
     report.rstrip()
     request.server.stash.take(key=key)
     request.server.stash.put(key=key, value=report)
-    return [("Content-Type", "text/plain")], "Recorded report " + report
+    return [("Content-Type", "text/plain")], "Recorded report " + report.decode()
diff --git a/third_party/web_platform_tests/cookies/resources/set-cookie.py b/third_party/web_platform_tests/cookies/resources/set-cookie.py
index 1eee832..f7a836a 100644
--- a/third_party/web_platform_tests/cookies/resources/set-cookie.py
+++ b/third_party/web_platform_tests/cookies/resources/set-cookie.py
@@ -1,6 +1,6 @@
 
 import sys
-import urlparse
+from six.moves.urllib import parse
 
 def main(request, response):
     """
@@ -20,7 +20,7 @@
     < Date: Tue, 04 Oct 2016 18:16:06 GMT
     < Content-Length: 80
     """
-    params = urlparse.parse_qs(request.url_parts.query)
+    params = parse.parse_qs(request.url_parts.query)
     headers = [
         ("Content-Type", "application/json"),
         ("Set-Cookie", "{name[0]}=1; Path={path[0]}; Expires=Wed, 09 Jun 2021 10:18:14 GMT".format(**params))
diff --git a/third_party/web_platform_tests/cors/resources/cors-makeheader.py b/third_party/web_platform_tests/cors/resources/cors-makeheader.py
index eab35ee..64447bd 100644
--- a/third_party/web_platform_tests/cors/resources/cors-makeheader.py
+++ b/third_party/web_platform_tests/cors/resources/cors-makeheader.py
@@ -50,7 +50,7 @@
             response.headers.set("Location", request.GET.first('location'))
 
     headers = {}
-    for name, values in request.headers.iteritems():
+    for name, values in request.headers.items():
         if len(values) == 1:
             headers[name] = values[0]
         else:
diff --git a/third_party/web_platform_tests/cors/resources/status.py b/third_party/web_platform_tests/cors/resources/status.py
index 8d441f0..fb4b7d0 100644
--- a/third_party/web_platform_tests/cors/resources/status.py
+++ b/third_party/web_platform_tests/cors/resources/status.py
@@ -24,7 +24,7 @@
     if request.method == "OPTIONS" and "preflight" in request.GET:
         try:
             code = int(request.GET.first('preflight'))
-        except KeyError, ValueError:
+        except (KeyError, ValueError):
             pass
 
     status = code, text
diff --git a/third_party/web_platform_tests/fetch/api/resources/bad-chunk-encoding.py b/third_party/web_platform_tests/fetch/api/resources/bad-chunk-encoding.py
index 23c7b3f..304fe19 100644
--- a/third_party/web_platform_tests/fetch/api/resources/bad-chunk-encoding.py
+++ b/third_party/web_platform_tests/fetch/api/resources/bad-chunk-encoding.py
@@ -7,7 +7,7 @@
     response.headers.set("Transfer-Encoding", "chunked")
     response.write_status_headers()
     time.sleep(delay)
-    for i in xrange(count):
+    for i in range(count):
         response.writer.write_content("a\r\nTEST_CHUNK\r\n")
         time.sleep(delay)
     response.writer.write_content("garbage")
diff --git a/third_party/web_platform_tests/fetch/api/resources/infinite-slow-response.py b/third_party/web_platform_tests/fetch/api/resources/infinite-slow-response.py
index fa2c482..8c1e8d6 100644
--- a/third_party/web_platform_tests/fetch/api/resources/infinite-slow-response.py
+++ b/third_party/web_platform_tests/fetch/api/resources/infinite-slow-response.py
@@ -1,4 +1,5 @@
 import time
+from socket import error as socket_error
 
 
 def url_dir(request):
@@ -27,6 +28,11 @@
     while True:
         if not response.writer.flush():
             break
+        # Trigger socket error on Python3, because flush doesn't
+        try:
+            response.writer._wfile._sock.getpeername()
+        except (OSError,socket_error):
+            break
         if abortKey and request.server.stash.take(abortKey, url_dir(request)):
             break
         response.writer.write(".")
diff --git a/third_party/web_platform_tests/fetch/api/resources/trickle.py b/third_party/web_platform_tests/fetch/api/resources/trickle.py
index e2c9bee..d6e99f9 100644
--- a/third_party/web_platform_tests/fetch/api/resources/trickle.py
+++ b/third_party/web_platform_tests/fetch/api/resources/trickle.py
@@ -9,6 +9,6 @@
     response.headers.set("Content-type", "text/plain")
     response.write_status_headers()
     time.sleep(delay)
-    for i in xrange(count):
+    for i in range(count):
         response.writer.write_content("TEST_TRICKLE\n")
         time.sleep(delay)
diff --git a/third_party/web_platform_tests/mixed-content/generic/tools/spec_validator.py b/third_party/web_platform_tests/mixed-content/generic/tools/spec_validator.py
index a6acc10..bb6e52e 100755
--- a/third_party/web_platform_tests/mixed-content/generic/tools/spec_validator.py
+++ b/third_party/web_platform_tests/mixed-content/generic/tools/spec_validator.py
@@ -65,7 +65,7 @@
                                          ["*"] + schema)
         return
 
-    for sub_artifact_key, sub_schema in schema.iteritems():
+    for sub_artifact_key, sub_schema in schema.items():
         assert_valid_artifact(exp_pattern[artifact_key], sub_artifact_key,
                               sub_schema)
 
diff --git a/third_party/web_platform_tests/service-workers/tools/blink-import.py b/third_party/web_platform_tests/service-workers/tools/blink-import.py
index 87ca221..84c958c 100644
--- a/third_party/web_platform_tests/service-workers/tools/blink-import.py
+++ b/third_party/web_platform_tests/service-workers/tools/blink-import.py
@@ -102,7 +102,7 @@
 def sub_changed_filenames(filename_changes, f):
     rv = []
     for line in f:
-        for in_name, out_name in filename_changes.iteritems():
+        for in_name, out_name in filename_changes.items():
             line = line.replace(in_name, out_name)
         rv.append(line)
     return "".join(rv)
@@ -182,7 +182,7 @@
 
     filename_changes = {}
 
-    for k, v in path_changes.iteritems():
+    for k, v in path_changes.items():
         if os.path.basename(k) in filename_changes:
             print "Got duplicate name:" + os.path.basename(k)
         filename_changes[os.path.basename(k)] = os.path.basename(v)
diff --git a/third_party/web_platform_tests/tools/ci/check_stability.py b/third_party/web_platform_tests/tools/ci/check_stability.py
index cf3e10d..1ac7c17 100644
--- a/third_party/web_platform_tests/tools/ci/check_stability.py
+++ b/third_party/web_platform_tests/tools/ci/check_stability.py
@@ -199,7 +199,7 @@
     """Post stability results to a given URL."""
     payload_results = []
 
-    for test_name, test in results.iteritems():
+    for test_name, test in results.items():
         subtests = []
         for subtest_name, subtest in test['subtests'].items():
             subtests.append({
diff --git a/third_party/web_platform_tests/tools/manifest/manifest.py b/third_party/web_platform_tests/tools/manifest/manifest.py
index b153798..37ed4fd 100644
--- a/third_party/web_platform_tests/tools/manifest/manifest.py
+++ b/third_party/web_platform_tests/tools/manifest/manifest.py
@@ -55,7 +55,7 @@
         if not dir_name.endswith(os.path.sep):
             dir_name = dir_name + os.path.sep
         for type_tests in self._data.values():
-            for path, tests in type_tests.iteritems():
+            for path, tests in type_tests.items():
                 if path.startswith(dir_name):
                     for test in tests:
                         yield test
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/example/benchmark_helper_wsh.py b/third_party/web_platform_tests/tools/pywebsocket/src/example/benchmark_helper_wsh.py
index 44ad0bf..d5d9d36 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/example/benchmark_helper_wsh.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/example/benchmark_helper_wsh.py
@@ -30,6 +30,7 @@
 
 """Handler for benchmark.html."""
 
+import six
 
 def web_socket_do_extra_handshake(request):
     # Turn off compression.
@@ -44,7 +45,7 @@
         if command is None:
             return
 
-        if not isinstance(command, unicode):
+        if not isinstance(command, six.text_type):
             raise ValueError('Invalid command data:' + command)
         commands = command.split(' ')
         if len(commands) == 0:
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_client.py b/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_client.py
index 943ce64..f5fb92a 100755
--- a/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_client.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_client.py
@@ -60,6 +60,7 @@
 import os
 import random
 import re
+import six
 import socket
 import struct
 import sys
@@ -143,7 +144,7 @@
                 (length, length - remaining))
         bytes.append(received_bytes)
         remaining -= len(received_bytes)
-    return ''.join(bytes)
+    return b''.join(bytes)
 
 
 def _get_mandatory_header(fields, name):
@@ -267,8 +268,8 @@
         fields = {}
         while True:  # "Field"
             # 4.1 33. let /name/ and /value/ be empty byte arrays
-            name = ''
-            value = ''
+            name = b''
+            value = b''
             # 4.1 34. read /name/
             name = self._read_name()
             if name is None:
@@ -280,7 +281,7 @@
             value = self._read_value(ch)
             # 4.1 37. read a byte from the server
             ch = _receive_bytes(self._socket, 1)
-            if ch != '\n':  # 0x0A
+            if ch != b'\n':  # 0x0A
                 raise ClientHandshakeError(
                     'Expected LF but found %r while reading value %r for '
                     'header %r' % (ch, value, name))
@@ -290,26 +291,23 @@
             # array as a UTF-8 stream and the value given by the string
             # obtained by interpreting the /value/ byte array as a UTF-8 byte
             # stream.
-            fields.setdefault(name, []).append(value)
+            fields.setdefault(name.decode(), []).append(value.decode())
             # 4.1 39. return to the "Field" step above
         return fields
 
     def _read_name(self):
         # 4.1 33. let /name/ be empty byte arrays
-        name = ''
+        name = b''
         while True:
             # 4.1 34. read a byte from the server
             ch = _receive_bytes(self._socket, 1)
-            if ch == '\r':  # 0x0D
+            if ch == b'\r':  # 0x0D
                 return None
-            elif ch == '\n':  # 0x0A
+            elif ch == b'\n':  # 0x0A
                 raise ClientHandshakeError(
                     'Unexpected LF when reading header name %r' % name)
-            elif ch == ':':  # 0x3A
-                return name
-            elif ch >= 'A' and ch <= 'Z':  # Range 0x31 to 0x5A
-                ch = chr(ord(ch) + 0x20)
-                name += ch
+            elif ch == b':':  # 0x3A
+                return name.lower()
             else:
                 name += ch
 
@@ -317,18 +315,18 @@
         # 4.1 35. read a byte from the server
         while True:
             ch = _receive_bytes(self._socket, 1)
-            if ch == ' ':  # 0x20
+            if ch == b' ':  # 0x20
                 continue
             return ch
 
     def _read_value(self, ch):
         # 4.1 33. let /value/ be empty byte arrays
-        value = ''
+        value = b''
         # 4.1 36. read a byte from server.
         while True:
-            if ch == '\r':  # 0x0D
+            if ch == b'\r':  # 0x0D
                 return value
-            elif ch == '\n':  # 0x0A
+            elif ch == b'\n':  # 0x0A
                 raise ClientHandshakeError(
                     'Unexpected LF when reading header value %r' % value)
             else:
@@ -407,7 +405,7 @@
         request_line = _build_method_line(self._options.resource)
         self._logger.debug('Client\'s opening handshake Request-Line: %r',
                            request_line)
-        self._socket.sendall(request_line)
+        self._socket.sendall(request_line.encode())
 
         fields = []
         fields.append(_format_host_header(
@@ -433,7 +431,7 @@
             self._key,
             util.hexify(original_key))
         fields.append(
-            '%s: %s\r\n' % (common.SEC_WEBSOCKET_KEY_HEADER, self._key))
+            '%s: %s\r\n' % (common.SEC_WEBSOCKET_KEY_HEADER, self._key.decode()))
 
         if self._options.version_header > 0:
             fields.append('%s: %d\r\n' % (common.SEC_WEBSOCKET_VERSION_HEADER,
@@ -468,22 +466,22 @@
                  common.format_extensions(extensions_to_request)))
 
         for field in fields:
-            self._socket.sendall(field)
+            self._socket.sendall(field.encode())
 
-        self._socket.sendall('\r\n')
+        self._socket.sendall(b'\r\n')
 
         self._logger.debug('Sent client\'s opening handshake headers: %r',
                            fields)
         self._logger.debug('Start reading Status-Line')
 
-        status_line = ''
+        status_line = b''
         while True:
             ch = _receive_bytes(self._socket, 1)
             status_line += ch
-            if ch == '\n':
+            if ch == b'\n':
                 break
 
-        m = re.match('HTTP/\\d+\.\\d+ (\\d\\d\\d) .*\r\n', status_line)
+        m = re.match(b'HTTP/\\d+\.\\d+ (\\d\\d\\d) .*\r\n', status_line)
         if m is None:
             raise ClientHandshakeError(
                 'Wrong status line format: %r' % status_line)
@@ -500,7 +498,7 @@
         fields = self._read_fields()
 
         ch = _receive_bytes(self._socket, 1)
-        if ch != '\n':  # 0x0A
+        if ch != b'\n':  # 0x0A
             raise ClientHandshakeError(
                 'Expected LF but found %r while reading value %r for header '
                 'name %r' % (ch, value, name))
@@ -526,7 +524,7 @@
         # Validate
         try:
             binary_accept = base64.b64decode(accept)
-        except TypeError, e:
+        except TypeError:
             raise HandshakeError(
                 'Illegal value for header %s: %r' %
                 (common.SEC_WEBSOCKET_ACCEPT_HEADER, accept))
@@ -548,7 +546,7 @@
             'Expected response for challenge: %r (%s)',
             expected_accept, util.hexify(binary_expected_accept))
 
-        if accept != expected_accept:
+        if accept != expected_accept.decode():
             raise ClientHandshakeError(
                 'Invalid %s header: %r (expected: %s)' %
                 (common.SEC_WEBSOCKET_ACCEPT_HEADER, accept, expected_accept))
@@ -662,15 +660,15 @@
         # RETURN U+000A LINE FEED character pair (CRLF).
         random.shuffle(fields)
         for field in fields:
-            self._socket.sendall(field)
+            self._socket.sendall(field.encode())
         # 4.1 25. send a UTF-8-encoded U+000D CARRIAGE RETURN U+000A LINE FEED
         # character pair (CRLF).
-        self._socket.sendall('\r\n')
+        self._socket.sendall(b'\r\n')
         # 4.1 26. let /key3/ be a string consisting of eight random bytes (or
         # equivalently, a random 64 bit integer encoded in a big-endian order).
         self._key3 = self._generate_key3()
         # 4.1 27. send /key3/ to the server.
-        self._socket.sendall(self._key3)
+        self._socket.sendall(self._key3.encode())
         self._logger.debug(
             'Key3: %r (%s)', self._key3, util.hexify(self._key3))
 
@@ -679,19 +677,19 @@
         # 4.1 28. Read bytes from the server until either the connection
         # closes, or a 0x0A byte is read. let /field/ be these bytes, including
         # the 0x0A bytes.
-        field = ''
+        field = b''
         while True:
             ch = _receive_bytes(self._socket, 1)
             field += ch
-            if ch == '\n':
+            if ch == b'\n':
                 break
         # if /field/ is not at least seven bytes long, or if the last
         # two bytes aren't 0x0D and 0x0A respectively, or if it does not
         # contain at least two 0x20 bytes, then fail the WebSocket connection
         # and abort these steps.
-        if len(field) < 7 or not field.endswith('\r\n'):
+        if len(field) < 7 or not field.endswith(b'\r\n'):
             raise ClientHandshakeError('Wrong status line: %r' % field)
-        m = re.match('[^ ]* ([^ ]*) .*', field)
+        m = re.match(b'[^ ]* ([^ ]*) .*', field)
         if m is None:
             raise ClientHandshakeError(
                 'No HTTP status code found in status line: %r' % field)
@@ -702,13 +700,13 @@
         # 4.1 30. if /code/ is not three bytes long, or if any of the bytes in
         # /code/ are not in the range 0x30 to 0x90, then fail the WebSocket
         # connection and abort these steps.
-        if not re.match('[0-9][0-9][0-9]', code):
+        if not re.match(b'[0-9][0-9][0-9]', code):
             raise ClientHandshakeError(
                 'HTTP status code %r is not three digit in status line: %r' %
                 (code, field))
         # 4.1 31. if /code/, interpreted as UTF-8, is "101", then move to the
         # next step.
-        if code != '101':
+        if code != b'101':
             raise ClientHandshakeError(
                 'Expected HTTP status code 101 but found %r in status line: '
                 '%r' % (code, field))
@@ -717,7 +715,7 @@
         # 4.1 40. _Fields processing_
         # read a byte from server
         ch = _receive_bytes(self._socket, 1)
-        if ch != '\n':  # 0x0A
+        if ch != b'\n':  # 0x0A
             raise ClientHandshakeError('Expected LF but found %r' % ch)
         # 4.1 41. check /fields/
         # TODO(ukai): protocol
@@ -800,13 +798,13 @@
         # positions.
         available_chars = range(0x21, 0x2f + 1) + range(0x3a, 0x7e + 1)
         n = random.randint(1, 12)
-        for _ in xrange(n):
+        for _ in range(n):
             ch = random.choice(available_chars)
             pos = random.randint(0, len(key))
             key = key[0:pos] + chr(ch) + key[pos:]
         # 4.1 22. insert /spaces_n/ U+0020 SPACE characters into /key_n/ at
         # random positions other than start or end of the string.
-        for _ in xrange(spaces):
+        for _ in range(spaces):
             pos = random.randint(1, len(key) - 1)
             key = key[0:pos] + ' ' + key[pos:]
         return number, key
@@ -814,7 +812,7 @@
     def _generate_key3(self):
         # 4.1 26. let /key3/ be a string consisting of eight random bytes (or
         # equivalently, a random 64 bit integer encoded in a big-endian order).
-        return ''.join([chr(random.randint(0, 255)) for _ in xrange(8)])
+        return ''.join([chr(random.randint(0, 255)) for _ in range(8)])
 
 
 class ClientConnection(object):
@@ -940,15 +938,15 @@
             for line in self._options.message.split(','):
                 self._stream.send_message(line)
                 if self._options.verbose:
-                    print 'Send: %s' % line
+                    print('Send: %s' % line)
                 try:
                     received = self._stream.receive_message()
 
                     if self._options.verbose:
-                        print 'Recv: %s' % received
-                except Exception, e:
+                        print('Recv: %s' % received)
+                except Exception as e:
                     if self._options.verbose:
-                        print 'Error: %s' % e
+                        print('Error: %s' % e)
                     raise
 
             self._do_closing_handshake()
@@ -964,20 +962,23 @@
             self._logger.info('Wait for server-initiated closing handshake')
             message = self._stream.receive_message()
             if message is None:
-                print 'Recv close'
-                print 'Send ack'
+                print('Recv close')
+                print('Send ack')
                 self._logger.info(
                     'Received closing handshake and sent ack')
                 return
-        print 'Send close'
+        print('Send close')
         self._stream.close_connection()
         self._logger.info('Sent closing handshake')
-        print 'Recv ack'
+        print('Recv ack')
         self._logger.info('Received ack')
 
 
 def main():
-    sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
+    if six.PY2:
+        import locale
+        encoding = locale.getpreferredencoding()
+        sys.stdout = codecs.getwriter(encoding)(sys.stdout)
 
     parser = OptionParser()
     # We accept --command_line_flag style flags which is the same as Google
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_noext_wsh.py b/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_noext_wsh.py
index 1df5151..eba5032 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_noext_wsh.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_noext_wsh.py
@@ -27,6 +27,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import six
 
 _GOODBYE_MESSAGE = u'Goodbye'
 
@@ -50,7 +51,7 @@
         line = request.ws_stream.receive_message()
         if line is None:
             return
-        if isinstance(line, unicode):
+        if isinstance(line, six.text_type):
             request.ws_stream.send_message(line, binary=False)
             if line == _GOODBYE_MESSAGE:
                 return
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_wsh.py b/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_wsh.py
index 38646c3..f7b3c6c 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_wsh.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/example/echo_wsh.py
@@ -27,6 +27,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import six
 
 _GOODBYE_MESSAGE = u'Goodbye'
 
@@ -43,7 +44,7 @@
         line = request.ws_stream.receive_message()
         if line is None:
             return
-        if isinstance(line, unicode):
+        if isinstance(line, six.text_type):
             request.ws_stream.send_message(line, binary=False)
             if line == _GOODBYE_MESSAGE:
                 return
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/_stream_base.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/_stream_base.py
index 8235666..2892b4f 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/_stream_base.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/_stream_base.py
@@ -118,7 +118,7 @@
                     'Receiving %d byte failed. Peer (%r) closed connection' %
                     (length, (self._request.connection.remote_addr,)))
             return read_bytes
-        except socket.error, e:
+        except socket.error as e:
             # Catch a socket.error. Because it's not a child class of the
             # IOError prior to Python 2.6, we cannot omit this except clause.
             # Use %s rather than %r for the exception to use human friendly
@@ -126,7 +126,7 @@
             raise ConnectionTerminatedException(
                 'Receiving %d byte failed. socket.error (%s) occurred' %
                 (length, e))
-        except IOError, e:
+        except IOError as e:
             # Also catch an IOError because mod_python throws it.
             raise ConnectionTerminatedException(
                 'Receiving %d byte failed. IOError (%s) occurred' %
@@ -139,7 +139,7 @@
 
         try:
             self._request.connection.write(bytes_to_write)
-        except Exception, e:
+        except Exception as e:
             util.prepend_message_to_exception(
                     'Failed to send message to %r: ' %
                             (self._request.connection.remote_addr,),
@@ -159,7 +159,7 @@
             new_read_bytes = self._read(length)
             read_bytes.append(new_read_bytes)
             length -= len(new_read_bytes)
-        return ''.join(read_bytes)
+        return b''.join(read_bytes)
 
     def _read_until(self, delim_char):
         """Reads bytes until we encounter delim_char. The result will not
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/_stream_hybi.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/_stream_hybi.py
index a8a49e3..1967ff8 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/_stream_hybi.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/_stream_hybi.py
@@ -39,6 +39,7 @@
 from collections import deque
 import logging
 import os
+import six
 import struct
 import time
 
@@ -90,11 +91,11 @@
     if length < 0:
         raise ValueError('length must be non negative integer')
     elif length <= 125:
-        return chr(mask_bit | length)
+        return struct.pack('!B', mask_bit | length)
     elif length < (1 << 16):
-        return chr(mask_bit | 126) + struct.pack('!H', length)
+        return struct.pack('!B', mask_bit | 126) + struct.pack('!H', length)
     elif length < (1 << 63):
-        return chr(mask_bit | 127) + struct.pack('!Q', length)
+        return struct.pack('!B', mask_bit | 127) + struct.pack('!Q', length)
     else:
         raise ValueError('Payload is too big for one frame')
 
@@ -115,12 +116,12 @@
     if (fin | rsv1 | rsv2 | rsv3) & ~1:
         raise ValueError('FIN bit and Reserved bit parameter must be 0 or 1')
 
-    header = ''
+    header = b''
 
     first_byte = ((fin << 7)
                   | (rsv1 << 6) | (rsv2 << 5) | (rsv3 << 4)
                   | opcode)
-    header += chr(first_byte)
+    header += struct.pack('!B', first_byte)
     header += create_length_header(payload_length, mask)
 
     return header
@@ -189,16 +190,14 @@
 
     logger.log(common.LOGLEVEL_FINE, 'Receive the first 2 octets of a frame')
 
-    received = receive_bytes(2)
-
-    first_byte = ord(received[0])
+    first_byte = ord(receive_bytes(1))
     fin = (first_byte >> 7) & 1
     rsv1 = (first_byte >> 6) & 1
     rsv2 = (first_byte >> 5) & 1
     rsv3 = (first_byte >> 4) & 1
     opcode = first_byte & 0xf
 
-    second_byte = ord(received[1])
+    second_byte = ord(receive_bytes(1))
     mask = (second_byte >> 7) & 1
     payload_length = second_byte & 0x7f
 
@@ -501,7 +500,7 @@
             raise BadOperationException(
                 'Requested send_message after sending out a closing handshake')
 
-        if binary and isinstance(message, unicode):
+        if six.PY2 and binary and isinstance(message, unicode):
             raise BadOperationException(
                 'Message for binary frame must be instance of str')
 
@@ -538,7 +537,7 @@
                 # at least one frame is sent.
                 if len(message) <= bytes_written:
                     break
-        except ValueError, e:
+        except ValueError as e:
             raise BadOperationException(e)
 
     def _get_message_from_frame(self, frame):
@@ -677,7 +676,7 @@
             if handler:
                 handler(self._request, message)
                 return
-        except AttributeError, e:
+        except AttributeError as e:
             pass
         self._send_pong(message)
 
@@ -704,7 +703,7 @@
                     break
                 else:
                     inflight_pings.append(expected_body)
-            except IndexError, e:
+            except IndexError as e:
                 # The received pong was unsolicited pong. Keep the
                 # ping queue as is.
                 self._ping_queue = inflight_pings
@@ -715,7 +714,7 @@
             handler = self._request.on_pong_handler
             if handler:
                 handler(self._request, message)
-        except AttributeError, e:
+        except AttributeError as e:
             pass
 
     def receive_message(self):
@@ -780,7 +779,7 @@
                 # CHARACTER.
                 try:
                     return message.decode('utf-8')
-                except UnicodeDecodeError, e:
+                except UnicodeDecodeError as e:
                     raise InvalidUTF8Exception(e)
             elif self._original_opcode == common.OPCODE_BINARY:
                 return message
@@ -830,7 +829,7 @@
                     'close reason must not be specified if code is None')
             reason = ''
         else:
-            if not isinstance(reason, str) and not isinstance(reason, unicode):
+            if not isinstance(reason, six.string_types):
                 raise BadOperationException(
                     'close reason must be an instance of str or unicode')
 
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/common.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/common.py
index 2fc2ead..0ac23c8 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/common.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/common.py
@@ -79,7 +79,7 @@
 OPCODE_PONG = 0xa
 
 # UUIDs used by HyBi 04 and later opening handshake and frame masking.
-WEBSOCKET_ACCEPT_UUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
+WEBSOCKET_ACCEPT_UUID = b'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
 
 # Opening handshake header names and expected values.
 UPGRADE_HEADER = 'Upgrade'
@@ -235,7 +235,7 @@
 
         try:
             _parse_extension_param(state, extension)
-        except ExtensionParsingException, e:
+        except ExtensionParsingException as e:
             raise ExtensionParsingException(
                 'Failed to parse parameter for %r (%r)' %
                 (extension_token, e))
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/dispatch.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/dispatch.py
index 96c91e0..2591fe8 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/dispatch.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/dispatch.py
@@ -143,7 +143,7 @@
 
     global_dic = {}
     try:
-        exec handler_definition in global_dic
+        exec(handler_definition, global_dic)
     except Exception:
         raise DispatchException('Error in sourcing handler:' +
                                 util.get_stack_trace())
@@ -254,12 +254,12 @@
         do_extra_handshake_ = handler_suite.do_extra_handshake
         try:
             do_extra_handshake_(request)
-        except handshake.AbortedByUserException, e:
+        except handshake.AbortedByUserException as e:
             # Re-raise to tell the caller of this function to finish this
             # connection without sending any error.
             self._logger.debug('%s', util.get_stack_trace())
             raise
-        except Exception, e:
+        except Exception as e:
             util.prepend_message_to_exception(
                     '%s raised exception for %s: ' % (
                             _DO_EXTRA_HANDSHAKE_HANDLER_NAME,
@@ -296,28 +296,28 @@
             if not request.server_terminated:
                 request.ws_stream.close_connection()
         # Catch non-critical exceptions the handler didn't handle.
-        except handshake.AbortedByUserException, e:
+        except handshake.AbortedByUserException as e:
             self._logger.debug('%s', util.get_stack_trace())
             raise
-        except msgutil.BadOperationException, e:
+        except msgutil.BadOperationException as e:
             self._logger.debug('%s', e)
             request.ws_stream.close_connection(
                 common.STATUS_INTERNAL_ENDPOINT_ERROR)
-        except msgutil.InvalidFrameException, e:
+        except msgutil.InvalidFrameException as e:
             # InvalidFrameException must be caught before
             # ConnectionTerminatedException that catches InvalidFrameException.
             self._logger.debug('%s', e)
             request.ws_stream.close_connection(common.STATUS_PROTOCOL_ERROR)
-        except msgutil.UnsupportedFrameException, e:
+        except msgutil.UnsupportedFrameException as e:
             self._logger.debug('%s', e)
             request.ws_stream.close_connection(common.STATUS_UNSUPPORTED_DATA)
-        except stream.InvalidUTF8Exception, e:
+        except stream.InvalidUTF8Exception as e:
             self._logger.debug('%s', e)
             request.ws_stream.close_connection(
                 common.STATUS_INVALID_FRAME_PAYLOAD_DATA)
-        except msgutil.ConnectionTerminatedException, e:
+        except msgutil.ConnectionTerminatedException as e:
             self._logger.debug('%s', e)
-        except Exception, e:
+        except Exception as e:
             # Any other exceptions are forwarded to the caller of this
             # function.
             util.prepend_message_to_exception(
@@ -379,7 +379,7 @@
                 continue
             try:
                 handler_suite = _source_handler_file(open(path).read())
-            except DispatchException, e:
+            except DispatchException as e:
                 self._source_warnings.append('%s: %s' % (path, e))
                 continue
             resource = convert(path)
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/extensions.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/extensions.py
index 49a9fdc..b02d7e7 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/extensions.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/extensions.py
@@ -185,7 +185,7 @@
                 self._WINDOW_BITS_PARAM)
             try:
                 window_bits = _parse_window_bits(window_bits)
-            except ValueError, e:
+            except ValueError as e:
                 return None
 
         no_context_takeover = self._request.has_parameter(
@@ -474,7 +474,7 @@
             try:
                 server_max_window_bits = _parse_window_bits(
                     server_max_window_bits)
-            except ValueError, e:
+            except ValueError as e:
                 self._logger.debug('Bad %s parameter: %r',
                                    self._SERVER_MAX_WINDOW_BITS_PARAM,
                                    e)
@@ -838,7 +838,7 @@
         if quota is not None:
             try:
                 quota = int(quota)
-            except ValueError, e:
+            except ValueError as e:
                 return None
             if quota < 0 or quota >= 2 ** 32:
                 return None
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/__init__.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/__init__.py
index 194f6b3..707263a 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/__init__.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/__init__.py
@@ -90,15 +90,15 @@
             handshaker.do_handshake()
             _LOGGER.info('Established (%s protocol)', name)
             return
-        except HandshakeException, e:
+        except HandshakeException as e:
             _LOGGER.debug(
                 'Failed to complete opening handshake as %s protocol: %r',
                 name, e)
             if e.status:
                 raise e
-        except AbortedByUserException, e:
+        except AbortedByUserException as e:
             raise
-        except VersionException, e:
+        except VersionException as e:
             raise
 
     # TODO(toyoshim): Add a test to cover the case all handshakers fail.
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/_base.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/_base.py
index c993a58..0af0524 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/_base.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/_base.py
@@ -111,7 +111,7 @@
         return fields[0], get_default_port(request.is_https())
     try:
         return fields[0], int(fields[1])
-    except ValueError, e:
+    except ValueError as e:
         raise HandshakeException('Invalid port number format: %r' % e)
 
 
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/hybi.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/hybi.py
index 1ad10ea..1022ba6 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/hybi.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/handshake/hybi.py
@@ -43,6 +43,7 @@
 
 
 import base64
+from hashlib import sha1
 import logging
 import os
 import re
@@ -81,13 +82,22 @@
     Sec-WebSocket-Key header.
     """
 
-    accept_binary = util.sha1_hash(
-        key + common.WEBSOCKET_ACCEPT_UUID).digest()
+    accept_binary = sha1(key + common.WEBSOCKET_ACCEPT_UUID).digest()
     accept = base64.b64encode(accept_binary)
 
     return (accept, accept_binary)
 
 
+def compute_accept_from_unicode(unicode_key):
+    """A wrapper function for compute_accept which takes a unicode string as an
+    argument, and encodes it to byte string. It then passes it on to
+    compute_accept.
+    """
+
+    key = unicode_key.encode('UTF-8')
+    return compute_accept(key)[0]
+
+
 class Handshaker(object):
     """Opening handshake processor for the WebSocket protocol (RFC 6455)."""
 
@@ -112,7 +122,7 @@
 
         try:
             connection_tokens = parse_token_list(connection)
-        except HandshakeException, e:
+        except HandshakeException as e:
             raise HandshakeException(
                 'Failed to parse %s: %s' % (common.CONNECTION_HEADER, e))
 
@@ -182,8 +192,8 @@
 
             # Extra handshake handler may modify/remove processors.
             self._dispatcher.do_extra_handshake(self._request)
-            processors = filter(lambda processor: processor is not None,
-                                self._request.ws_extension_processors)
+            processors = list(filter(lambda processor: processor is not None,
+                                self._request.ws_extension_processors))
 
             # Ask each processor if there are extensions on the request which
             # cannot co-exist. When processor decided other processors cannot
@@ -194,8 +204,8 @@
                 if processor.is_active():
                     processor.check_consistency_with_other_processors(
                         processors)
-            processors = filter(lambda processor: processor.is_active(),
-                                processors)
+            processors = list(filter(lambda processor: processor.is_active(),
+                                     processors))
 
             accepted_extensions = []
 
@@ -220,8 +230,8 @@
                 self._request.mux_processor = processors[mux_index]
                 self._request.mux_processor.set_extensions(
                     logical_channel_extensions)
-                processors = filter(lambda processor: processor.is_active(),
-                                    processors)
+                processors = list(filter(lambda processor: processor.is_active(),
+                                         processors))
 
             stream_options = StreamOptions()
 
@@ -242,7 +252,7 @@
                     continue
 
                 # Inactivate all of the following compression extensions.
-                for j in xrange(index + 1, len(processors)):
+                for j in range(index + 1, len(processors)):
                     if is_compression_extension(processors[j].name()):
                         processors[j].set_active(False)
 
@@ -273,7 +283,7 @@
                         'request any subprotocol')
 
             self._send_handshake(accept)
-        except HandshakeException, e:
+        except HandshakeException as e:
             if not e.status:
                 # Fallback to 400 bad request by default.
                 e.status = common.HTTP_STATUS_BAD_REQUEST
@@ -327,14 +337,14 @@
         try:
             self._request.ws_requested_extensions = common.parse_extensions(
                 extensions_header)
-        except common.ExtensionParsingException, e:
+        except common.ExtensionParsingException as e:
             raise HandshakeException(
                 'Failed to parse Sec-WebSocket-Extensions header: %r' % e)
 
         self._logger.debug(
             'Extensions requested: %r',
-            map(common.ExtensionParameter.name,
-                self._request.ws_requested_extensions))
+            list(map(common.ExtensionParameter.name,
+                     self._request.ws_requested_extensions)))
 
     def _validate_key(self, key):
         if key.find(',') >= 0:
@@ -353,7 +363,7 @@
                 decoded_key = base64.b64decode(key)
                 if len(decoded_key) == 16:
                     key_is_valid = True
-        except TypeError, e:
+        except TypeError as e:
             pass
 
         if not key_is_valid:
@@ -375,7 +385,7 @@
             key,
             util.hexify(decoded_key))
 
-        return key
+        return key.encode()
 
     def _create_stream(self, stream_options):
         return Stream(self._request, stream_options)
@@ -391,7 +401,7 @@
         response.append(format_header(
             common.CONNECTION_HEADER, common.UPGRADE_CONNECTION_TYPE))
         response.append(format_header(
-            common.SEC_WEBSOCKET_ACCEPT_HEADER, accept))
+            common.SEC_WEBSOCKET_ACCEPT_HEADER, accept.decode()))
         if self._request.ws_protocol is not None:
             response.append(format_header(
                 common.SEC_WEBSOCKET_PROTOCOL_HEADER,
@@ -412,7 +422,7 @@
 
     def _send_handshake(self, accept):
         raw_response = self._create_handshake_response(accept)
-        self._request.connection.write(raw_response)
+        self._request.connection.write(raw_response.encode())
         self._logger.debug('Sent server\'s opening handshake: %r',
                            raw_response)
 
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/http_header_util.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/http_header_util.py
index b774653..66277a1 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/http_header_util.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/http_header_util.py
@@ -33,7 +33,7 @@
 """
 
 
-import urlparse
+from six.moves.urllib import parse as urlparse
 
 
 _SEPARATORS = '()<>@,;:\\"/[]?={} \t'
@@ -230,7 +230,7 @@
     port = None
     try:
         port = parsed.port
-    except ValueError, e:
+    except ValueError as e:
         # port property cause ValueError on invalid null port description like
         # 'ws://host:/path'.
         return None, None, None
@@ -254,7 +254,7 @@
 
 try:
     urlparse.uses_netloc.index('ws')
-except ValueError, e:
+except ValueError as e:
     # urlparse in Python2.5.1 doesn't have 'ws' and 'wss' entries.
     urlparse.uses_netloc.append('ws')
     urlparse.uses_netloc.append('wss')
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/memorizingfile.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/memorizingfile.py
index 4d4cd95..ca04539 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/memorizingfile.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/memorizingfile.py
@@ -36,7 +36,7 @@
 """
 
 
-import sys
+import six
 
 
 class MemorizingFile(object):
@@ -47,14 +47,14 @@
     the control reaches WebSocketRequestHandler.
     """
 
-    def __init__(self, file_, max_memorized_lines=sys.maxint):
+    def __init__(self, file_, max_memorized_lines=six.MAXSIZE):
         """Construct an instance.
 
         Args:
             file_: the file object to wrap.
             max_memorized_lines: the maximum number of lines to memorize.
                 Only the first max_memorized_lines are memorized.
-                Default: sys.maxint.
+                Default: six.MAXSIZE.
         """
 
         self._file = file_
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/msgutil.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/msgutil.py
index 4c1a011..26e4e48 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/msgutil.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/msgutil.py
@@ -38,7 +38,7 @@
 """
 
 
-import Queue
+from six.moves import queue as Queue
 import threading
 
 
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/mux.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/mux.py
index 7633468..3a4a419 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/mux.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/mux.py
@@ -353,7 +353,7 @@
 
         try:
             size = self._read_number()
-        except ValueError, e:
+        except ValueError as e:
             raise PhysicalConnectionError(_DROP_CODE_INVALID_MUX_CONTROL_BLOCK,
                                           str(e))
         pos = self._read_position
@@ -376,7 +376,7 @@
         encoding = first_byte & 0x3
         try:
             control_block.channel_id = self.read_channel_id()
-        except ValueError, e:
+        except ValueError as e:
             raise PhysicalConnectionError(_DROP_CODE_INVALID_MUX_CONTROL_BLOCK)
         control_block.encoding = encoding
         encoded_handshake = self._read_size_and_contents()
@@ -394,7 +394,7 @@
         control_block.encoding = first_byte & 0x3
         try:
             control_block.channel_id = self.read_channel_id()
-        except ValueError, e:
+        except ValueError as e:
             raise PhysicalConnectionError(_DROP_CODE_INVALID_MUX_CONTROL_BLOCK)
         control_block.encoded_handshake = self._read_size_and_contents()
         return control_block
@@ -409,7 +409,7 @@
         try:
             control_block.channel_id = self.read_channel_id()
             control_block.send_quota = self._read_number()
-        except ValueError, e:
+        except ValueError as e:
             raise PhysicalConnectionError(_DROP_CODE_INVALID_MUX_CONTROL_BLOCK,
                                           str(e))
 
@@ -424,7 +424,7 @@
 
         try:
             control_block.channel_id = self.read_channel_id()
-        except ValueError, e:
+        except ValueError as e:
             raise PhysicalConnectionError(_DROP_CODE_INVALID_MUX_CONTROL_BLOCK)
         reason = self._read_size_and_contents()
         if len(reason) == 0:
@@ -449,7 +449,7 @@
         try:
             control_block.slots = self._read_number()
             control_block.send_quota = self._read_number()
-        except ValueError, e:
+        except ValueError as e:
             raise PhysicalConnectionError(_DROP_CODE_INVALID_MUX_CONTROL_BLOCK,
                                           str(e))
         return control_block
@@ -921,7 +921,7 @@
 
                 opcode = common.OPCODE_CONTINUATION
 
-        except ValueError, e:
+        except ValueError as e:
             raise BadOperationException(e)
         finally:
             self._write_inner_frame_semaphore.release()
@@ -1029,7 +1029,7 @@
         # connection has closed gracefully.
         try:
             return Stream.receive_message(self)
-        except LogicalConnectionClosedException, e:
+        except LogicalConnectionClosedException as e:
             self._logger.debug('%s', e)
             return None
 
@@ -1144,7 +1144,7 @@
         try:
             self._mux_handler.physical_stream.send_message(
                 message=message, end=True, binary=True)
-        except Exception, e:
+        except Exception as e:
             util.prepend_message_to_exception(
                 'Failed to send message to %r: ' %
                 (self._mux_handler.physical_connection.remote_addr,), e)
@@ -1185,7 +1185,7 @@
                 # by the reader thread.
                 self._mux_handler.physical_stream.close_connection(
                     self._close_code, wait_response=False)
-            except Exception, e:
+            except Exception as e:
                 util.prepend_message_to_exception(
                     'Failed to close the physical connection: %r' % e)
                 raise
@@ -1233,20 +1233,20 @@
                         'Received a text message on physical connection')
                     break
 
-            except ConnectionTerminatedException, e:
+            except ConnectionTerminatedException as e:
                 self._logger.debug('%s', e)
                 break
 
             try:
                 self._mux_handler.dispatch_message(message)
-            except PhysicalConnectionError, e:
+            except PhysicalConnectionError as e:
                 self._mux_handler.fail_physical_connection(
                     e.drop_code, e.message)
                 break
-            except LogicalChannelError, e:
+            except LogicalChannelError as e:
                 self._mux_handler.fail_logical_channel(
                     e.channel_id, e.drop_code, e.message)
-            except Exception, e:
+            except Exception as e:
                 self._logger.debug(traceback.format_exc())
                 break
 
@@ -1278,7 +1278,7 @@
         try:
             # Non-critical exceptions will be handled by dispatcher.
             self._mux_handler.dispatcher.transfer_data(self._request)
-        except LogicalChannelError, e:
+        except LogicalChannelError as e:
             self._mux_handler.fail_logical_channel(
                 e.channel_id, e.drop_code, e.message)
         finally:
@@ -1621,19 +1621,19 @@
                                     send_quota, receive_quota)
         try:
             handshaker.do_handshake()
-        except handshake.VersionException, e:
+        except handshake.VersionException as e:
             self._logger.info('%s', e)
             self._send_error_add_channel_response(
                 request.channel_id, status=common.HTTP_STATUS_BAD_REQUEST)
             return False
-        except handshake.HandshakeException, e:
+        except handshake.HandshakeException as e:
             # TODO(bashi): Should we _Fail the Logical Channel_ with 3001
             # instead?
             self._logger.info('%s', e)
             self._send_error_add_channel_response(request.channel_id,
                                                   status=e.status)
             return False
-        except handshake.AbortedByUserException, e:
+        except handshake.AbortedByUserException as e:
             self._logger.info('%s', e)
             self._send_error_add_channel_response(request.channel_id)
             return False
@@ -1660,7 +1660,7 @@
     def _process_add_channel_request(self, block):
         try:
             logical_request = self._create_logical_request(block)
-        except ValueError, e:
+        except ValueError as e:
             self._logger.debug('Failed to create logical request: %r' % e)
             self._send_error_add_channel_response(
                 block.channel_id, status=common.HTTP_STATUS_BAD_REQUEST)
@@ -1767,7 +1767,7 @@
         parser = _MuxFramePayloadParser(message)
         try:
             channel_id = parser.read_channel_id()
-        except ValueError, e:
+        except ValueError as e:
             raise PhysicalConnectionError(_DROP_CODE_CHANNEL_ID_TRUNCATED)
         if channel_id == _CONTROL_CHANNEL_ID:
             self._process_control_blocks(parser)
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/standalone.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/standalone.py
index 24c299e..898a05b 100755
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/standalone.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/standalone.py
@@ -155,19 +155,20 @@
 used outside a firewall.
 """
 
-import BaseHTTPServer
-import CGIHTTPServer
-import SimpleHTTPServer
-import SocketServer
-import ConfigParser
+from six.moves import BaseHTTPServer
+from six.moves import CGIHTTPServer
+from six.moves import SimpleHTTPServer
+from six.moves import socketserver as SocketServer
+from six.moves import configparser as ConfigParser
 import base64
-import httplib
+from six.moves import http_client as httplib
 import logging
 import logging.handlers
 import optparse
 import os
 import re
 import select
+import six
 import socket
 import sys
 import threading
@@ -225,7 +226,6 @@
 
     def write(self, data):
         """Mimic mp_conn.write()."""
-
         return self._request_handler.wfile.write(data)
 
     def read(self, length):
@@ -347,8 +347,8 @@
 
         try:
             return self._connection.recv(bufsize)
-        except OpenSSL.SSL.SysCallError, (err, message):
-            if err == -1:
+        except OpenSSL.SSL.SysCallError as err:
+            if err.args[0] == -1:
                 # Suppress "unexpected EOF" exception. See the OpenSSL document
                 # for SSL_get_error.
                 return ''
@@ -375,7 +375,7 @@
             try:
                 dispatcher.add_resource_path_alias(
                     m.group(1), m.group(2))
-            except dispatch.DispatchException, e:
+            except dispatch.DispatchException as e:
                 logging.error(str(e))
     finally:
         fp.close()
@@ -451,7 +451,7 @@
             family, socktype, proto, canonname, sockaddr = addrinfo
             try:
                 socket_ = socket.socket(family, socktype)
-            except Exception, e:
+            except Exception as e:
                 self._logger.info('Skip by failure: %r', e)
                 continue
             server_options = self.websocket_server_options
@@ -489,7 +489,7 @@
                 socket_.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
             try:
                 socket_.bind(self.server_address)
-            except Exception, e:
+            except Exception as e:
                 self._logger.info('Skip by failure: %r', e)
                 socket_.close()
                 failed_sockets.append(socketinfo)
@@ -518,7 +518,7 @@
             self._logger.info('Listen on: %r', addrinfo)
             try:
                 socket_.listen(self.request_queue_size)
-            except Exception, e:
+            except Exception as e:
                 self._logger.info('Skip by failure: %r', e)
                 socket_.close()
                 failed_sockets.append(socketinfo)
@@ -569,7 +569,7 @@
             if server_options.tls_module == _TLS_BY_STANDARD_MODULE:
                 try:
                     accepted_socket.do_handshake()
-                except ssl.SSLError, e:
+                except ssl.SSLError as e:
                     self._logger.debug('%r', e)
                     raise
 
@@ -608,7 +608,7 @@
                 # TODO(tyoshino): Convert all kinds of errors.
                 try:
                     accepted_socket.do_handshake()
-                except OpenSSL.SSL.Error, e:
+                except OpenSSL.SSL.Error as e:
                     # Set errno part to 1 (SSL_ERROR_SSL) like the ssl module
                     # does.
                     self._logger.debug('%r', e)
@@ -780,7 +780,7 @@
                                   self.path)
                 self._logger.info('Fallback to CGIHTTPRequestHandler')
                 return True
-        except dispatch.DispatchException, e:
+        except dispatch.DispatchException as e:
             self._logger.info('Dispatch failed for error: %s', e)
             self.send_error(e.status)
             return False
@@ -796,14 +796,14 @@
                     self._options.dispatcher,
                     allowDraft75=self._options.allow_draft75,
                     strict=self._options.strict)
-            except handshake.VersionException, e:
+            except handshake.VersionException as e:
                 self._logger.info('Handshake failed for version error: %s', e)
                 self.send_response(common.HTTP_STATUS_BAD_REQUEST)
                 self.send_header(common.SEC_WEBSOCKET_VERSION_HEADER,
                                  e.supported_versions)
                 self.end_headers()
                 return False
-            except handshake.HandshakeException, e:
+            except handshake.HandshakeException as e:
                 # Handshake for ws(s) failed.
                 self._logger.info('Handshake failed for error: %s', e)
                 self.send_error(e.status)
@@ -811,7 +811,7 @@
 
             request._dispatcher = self._options.dispatcher
             self._options.dispatcher.transfer_data(request)
-        except handshake.AbortedByUserException, e:
+        except handshake.AbortedByUserException as e:
             self._logger.info('Aborted: %s', e)
         return False
 
@@ -1052,7 +1052,7 @@
     if temporary_options.config_file:
         try:
             config_fp = open(temporary_options.config_file, 'r')
-        except IOError, e:
+        except IOError as e:
             logging.critical(
                 'Failed to open configuration file %r: %r',
                 temporary_options.config_file,
@@ -1180,7 +1180,7 @@
 
         server = WebSocketServer(options)
         server.serve_forever()
-    except Exception, e:
+    except Exception as e:
         logging.critical('mod_pywebsocket: %s' % e)
         logging.critical('mod_pywebsocket: %s' % util.get_stack_trace())
         sys.exit(1)
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/util.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/util.py
index d224ae3..a8697e5 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/util.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/util.py
@@ -48,10 +48,11 @@
     md5_hash = md5.md5
     sha1_hash = sha.sha
 
-import StringIO
+from io import StringIO
 import logging
 import os
 import re
+import six
 import socket
 import traceback
 import zlib
@@ -63,16 +64,8 @@
 
 
 def get_stack_trace():
-    """Get the current stack trace as string.
-
-    This is needed to support Python 2.3.
-    TODO: Remove this when we only support Python 2.4 and above.
-          Use traceback.format_exc instead.
-    """
-
-    out = StringIO.StringIO()
-    traceback.print_exc(file=out)
-    return out.getvalue()
+    """Get the current stack trace as string."""
+    return traceback.format_exc()
 
 
 def prepend_message_to_exception(message, exc):
@@ -147,7 +140,10 @@
 
 
 def hexify(s):
-    return ' '.join(map(lambda x: '%02x' % ord(x), s))
+    if six.PY3:
+        return ' '.join(map(lambda x: '{0:02x}'.format(x), s))
+    else:
+        return ' '.join(map(lambda x: '%02x' % ord(x), s))
 
 
 def get_class_logger(o):
@@ -186,22 +182,26 @@
         return masked_data
 
     def _mask_using_array(self, s):
-        result = array.array('B')
-        result.fromstring(s)
+        """Perform the mask via python."""
+        if isinstance(s, six.text_type):
+            raise Exception(
+                'Masking Operation should not process unicode strings')
+
+        result = bytearray(s)
 
         # Use temporary local variables to eliminate the cost to access
         # attributes
-        masking_key = map(ord, self._masking_key)
+        masking_key = [c for c in six.iterbytes(self._masking_key)]
         masking_key_size = len(masking_key)
         masking_key_index = self._masking_key_index
 
-        for i in xrange(len(result)):
+        for i in range(len(result)):
             result[i] ^= masking_key[masking_key_index]
             masking_key_index = (masking_key_index + 1) % masking_key_size
 
         self._masking_key_index = masking_key_index
 
-        return result.tostring()
+        return bytes(result)
 
     if 'fast_masking' in globals():
         mask = _mask_using_swig
@@ -258,7 +258,7 @@
         self._logger = get_class_logger(self)
         self._window_bits = window_bits
 
-        self._unconsumed = ''
+        self._unconsumed = b''
 
         self.reset()
 
@@ -266,7 +266,7 @@
         if not (size == -1 or size > 0):
             raise Exception('size must be -1 or positive')
 
-        data = ''
+        data = b''
 
         while True:
             if size == -1:
@@ -274,7 +274,7 @@
                 # See Python bug http://bugs.python.org/issue12050 to
                 # understand why the same code cannot be used for updating
                 # self._unconsumed for here and else block.
-                self._unconsumed = ''
+                self._unconsumed = b''
             else:
                 data += self._decompress.decompress(
                     self._unconsumed, size - len(data))
@@ -365,7 +365,7 @@
     def filter(self, bytes):
         # Restore stripped LEN and NLEN field of a non-compressed block added
         # for Z_SYNC_FLUSH.
-        self._inflater.append(bytes + '\x00\x00\xff\xff')
+        self._inflater.append(bytes + b'\x00\x00\xff\xff')
         return self._inflater.decompress(-1)
 
 
diff --git a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/xhr_benchmark_handler.py b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/xhr_benchmark_handler.py
index 6735c7e..dd227a4 100644
--- a/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/xhr_benchmark_handler.py
+++ b/third_party/web_platform_tests/tools/pywebsocket/src/mod_pywebsocket/xhr_benchmark_handler.py
@@ -60,7 +60,7 @@
         bytes_to_send = request_array[0]
         try:
             bytes_to_send = int(bytes_to_send)
-        except ValueError, e:
+        except ValueError as e:
             self._logger.debug('Malformed size parameter: %r', bytes_to_send)
             return
         self._logger.debug('Requested to send %s bytes', bytes_to_send)
diff --git a/third_party/web_platform_tests/tools/runner/report.py b/third_party/web_platform_tests/tools/runner/report.py
index f4b3fa7..6ef9fbd 100644
--- a/third_party/web_platform_tests/tools/runner/report.py
+++ b/third_party/web_platform_tests/tools/runner/report.py
@@ -42,7 +42,7 @@
             attrs_unicode = " " + " ".join("%s=\"%s\"" % (html_escape(key),
                                                           html_escape(value,
                                                                       escape_quote=True))
-                                           for key, value in self.attrs.iteritems())
+                                           for key, value in self.attrs.items())
         else:
             attrs_unicode = ""
         return "<%s%s>%s</%s>\n" % (self.name,
@@ -155,7 +155,7 @@
 
 def all_tests(data):
     tests = defaultdict(set)
-    for UA, results in data.iteritems():
+    for UA, results in data.items():
         for result in results["results"]:
             id = test_id(result["test"])
             tests[id] |= set(subtest["name"] for subtest in result["subtests"])
@@ -183,7 +183,7 @@
 
     results_by_test = defaultdict(result)
 
-    for UA, results in data.iteritems():
+    for UA, results in data.items():
         for test_data in results["results"]:
             id = test_id(test_data["test"])
             result = results_by_test[id]
@@ -228,10 +228,10 @@
 def summary(UAs, results_by_test):
     """Render the implementation report summary"""
     not_passing = []
-    for test, results in results_by_test.iteritems():
+    for test, results in results_by_test.items():
         if not any(item[0] in ("PASS", "OK") for item in results["harness"].values()):
             not_passing.append((test, None))
-        for subtest_name, subtest_results in results["subtests"].iteritems():
+        for subtest_name, subtest_results in results["subtests"].items():
             if not any(item[0] == "PASS" for item in subtest_results.values()):
                 not_passing.append((test, subtest_name))
     if not_passing:
@@ -258,7 +258,7 @@
         class_="test"
     )
 
-    for name, subtest_result in sorted(result["subtests"].iteritems()):
+    for name, subtest_result in sorted(result["subtests"].items()):
         yield h.tr(
             h.td(name),
             [status_cell(status, message)
@@ -269,7 +269,7 @@
 
 def result_bodies(UAs, results_by_test):
     return [h.tbody(result_rows(UAs, test, result))
-            for test, result in sorted(results_by_test.iteritems())]
+            for test, result in sorted(results_by_test.items())]
 
 
 def generate_html(UAs, results_by_test):
diff --git a/third_party/web_platform_tests/tools/serve/__init__.py b/third_party/web_platform_tests/tools/serve/__init__.py
index fc2f2f0..e69de29 100644
--- a/third_party/web_platform_tests/tools/serve/__init__.py
+++ b/third_party/web_platform_tests/tools/serve/__init__.py
@@ -1 +0,0 @@
-import serve
diff --git a/third_party/web_platform_tests/tools/serve/serve.py b/third_party/web_platform_tests/tools/serve/serve.py
index 170e7e6..8e24aec 100644
--- a/third_party/web_platform_tests/tools/serve/serve.py
+++ b/third_party/web_platform_tests/tools/serve/serve.py
@@ -12,7 +12,7 @@
 import threading
 import time
 import traceback
-import urllib2
+from six.moves import urllib
 import uuid
 from collections import defaultdict, OrderedDict
 from multiprocessing import Process, Event
@@ -251,7 +251,7 @@
         for (method, suffix, handler_cls) in routes:
             self.mountpoint_routes[url_base].append(
                 (method,
-                 b"%s%s" % (str(url_base) if url_base != "/" else "", str(suffix)),
+                 "{}{}".format(str(url_base) if url_base != "/" else "", str(suffix)).encode(),
                  handler_cls(base_path=path, url_base=url_base)))
 
     def add_file_mount_point(self, file_url, base_path):
@@ -443,20 +443,20 @@
     connected = False
     for i in range(10):
         try:
-            urllib2.urlopen("http://%s:%d/" % (host, port))
+            urllib.request.urlopen("http://%s:%d/" % (host, port))
             connected = True
             break
-        except urllib2.URLError:
+        except urllib.error.URLError:
             time.sleep(1)
 
     if not connected:
         logger.critical("Failed to connect to test server on http://%s:%s You may need to edit /etc/hosts or similar" % (host, port))
         sys.exit(1)
 
-    for subdomain, (punycode, host) in subdomains.iteritems():
+    for subdomain, (punycode, host) in subdomains.items():
         domain = "%s.%s" % (punycode, host)
         try:
-            urllib2.urlopen("http://%s:%d/" % (domain, port))
+            urllib.request.urlopen("http://%s:%d/" % (domain, port))
         except Exception as e:
             logger.critical("Failed probing domain %s. You may need to edit /etc/hosts or similar." % domain)
             sys.exit(1)
@@ -466,14 +466,14 @@
 
 def get_subdomains(host):
     #This assumes that the tld is ascii-only or already in punycode
-    return {subdomain: (subdomain.encode("idna"), host)
+    return {subdomain: (subdomain.encode("idna"), host.encode())
             for subdomain in subdomains}
 
 
 def start_servers(host, ports, paths, routes, bind_hostname, external_config, ssl_config,
                   **kwargs):
     servers = defaultdict(list)
-    for scheme, ports in ports.iteritems():
+    for scheme, ports in ports.items():
         assert len(ports) == {"http":2}.get(scheme, 1)
 
         for port in ports:
@@ -612,7 +612,7 @@
 
 def get_ports(config, ssl_environment):
     rv = defaultdict(list)
-    for scheme, ports in config["ports"].iteritems():
+    for scheme, ports in config["ports"].items():
         for i, port in enumerate(ports):
             if scheme in ["wss", "https"] and not ssl_environment.ssl_enabled:
                 port = None
@@ -629,16 +629,16 @@
     host = config["external_host"] if config["external_host"] else config["host"]
     domains = get_subdomains(host)
     ports_ = {}
-    for scheme, ports_used in ports.iteritems():
+    for scheme, ports_used in ports.items():
         ports_[scheme] = ports_used
 
-    for key, value in domains.iteritems():
-        domains[key] = ".".join(value)
+    for key, value in domains.items():
+        domains[key] = b".".join(value)
 
     domains[""] = host
 
     ports_ = {}
-    for scheme, ports_used in ports.iteritems():
+    for scheme, ports_used in ports.items():
         ports_[scheme] = ports_used
 
     return {"host": host,
@@ -702,7 +702,7 @@
 
 def merge_json(base_obj, override_obj):
     rv = {}
-    for key, value in base_obj.iteritems():
+    for key, value in base_obj.items():
         if key not in override_obj:
             rv[key] = value
         else:
diff --git a/third_party/web_platform_tests/tools/sslutils/__init__.py b/third_party/web_platform_tests/tools/sslutils/__init__.py
index e46be85..313f6af 100644
--- a/third_party/web_platform_tests/tools/sslutils/__init__.py
+++ b/third_party/web_platform_tests/tools/sslutils/__init__.py
@@ -1,3 +1,7 @@
+import sys
+import os
+sys.path.append(os.path.dirname(__file__))
+
 import openssl
 import pregenerated
 from base import NoSSLEnvironment
diff --git a/third_party/web_platform_tests/tools/sslutils/openssl.py b/third_party/web_platform_tests/tools/sslutils/openssl.py
index 09c2471..ee9bad2 100644
--- a/third_party/web_platform_tests/tools/sslutils/openssl.py
+++ b/third_party/web_platform_tests/tools/sslutils/openssl.py
@@ -66,7 +66,7 @@
         # StartProcess is picky about all the keys/values being plain strings,
         # but at least in MSYS shells, the os.environ dictionary can be mixed.
         env = {}
-        for k, v in os.environ.iteritems():
+        for k, v in os.environ.items():
             try:
                 env[k.encode("utf8")] = v.encode("utf8")
             except UnicodeDecodeError:
@@ -106,6 +106,8 @@
     for var, key in args:
         value = locals()[var]
         if value is not None:
+            if isinstance(value, bytes):
+                value = value.decode()
             rv.append("/%s=%s" % (key, value.replace("/", "\\/")))
 
     return "".join(rv)
@@ -310,7 +312,7 @@
             end_date_str = openssl("x509",
                                    "-noout",
                                    "-enddate",
-                                   "-in", cert_path).split("=", 1)[1].strip()
+                                   "-in", cert_path).decode().split("=", 1)[1].strip()
             # Not sure if this works in other locales
             end_date = datetime.strptime(end_date_str, "%b %d %H:%M:%S %Y %Z")
             time_buffer = timedelta(**CERT_EXPIRY_BUFFER)
diff --git a/third_party/web_platform_tests/tools/wpt/run.py b/third_party/web_platform_tests/tools/wpt/run.py
index a7cd48d..b9fb69d 100644
--- a/third_party/web_platform_tests/tools/wpt/run.py
+++ b/third_party/web_platform_tests/tools/wpt/run.py
@@ -297,7 +297,7 @@
 
     global logger
 
-    kwargs = utils.Kwargs(kwargs.iteritems())
+    kwargs = utils.Kwargs(kwargs.items())
 
     product_parts = kwargs["product"].split(":")
     kwargs["product"] = product_parts[0]
diff --git a/third_party/web_platform_tests/tools/wpt/stability.py b/third_party/web_platform_tests/tools/wpt/stability.py
index b3c8570..a87886d 100644
--- a/third_party/web_platform_tests/tools/wpt/stability.py
+++ b/third_party/web_platform_tests/tools/wpt/stability.py
@@ -90,10 +90,10 @@
     handler = LogHandler()
     reader.handle_log(reader.read(log), handler)
     results = handler.results
-    for test_name, test in results.iteritems():
+    for test_name, test in results.items():
         if is_inconsistent(test["status"], iterations):
             inconsistent.append((test_name, None, test["status"], []))
-        for subtest_name, subtest in test["subtests"].iteritems():
+        for subtest_name, subtest in test["subtests"].items():
             if is_inconsistent(subtest["status"], iterations):
                 inconsistent.append((test_name, subtest_name, subtest["status"], subtest["messages"]))
     return results, inconsistent
@@ -134,7 +134,7 @@
                                                   "tests" if len(results) > 1
                                                   else "test"))
 
-    for test_name, test in results.iteritems():
+    for test_name, test in results.items():
         baseurl = "http://w3c-test.org/submissions"
         if "https" in os.path.splitext(test_name)[0].split(".")[1:]:
             baseurl = "https://w3c-test.org/submissions"
diff --git a/third_party/web_platform_tests/tools/wptrunner/test/test.py b/third_party/web_platform_tests/tools/wptrunner/test/test.py
index 034e317..f06f9d6 100644
--- a/third_party/web_platform_tests/tools/wptrunner/test/test.py
+++ b/third_party/web_platform_tests/tools/wptrunner/test/test.py
@@ -87,7 +87,7 @@
 
 def settings_to_argv(settings):
     rv = []
-    for name, value in settings.iteritems():
+    for name, value in settings.items():
         key = "--%s" % name
         if not value:
             rv.append(key)
@@ -113,7 +113,7 @@
 
     logger.suite_start(tests=[])
 
-    for product, product_settings in config["products"].iteritems():
+    for product, product_settings in config["products"].items():
         if args.product and product not in args.product:
             continue
 
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/browsers/base.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/browsers/base.py
index e4c9c30..97549f3 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/browsers/base.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/browsers/base.py
@@ -162,5 +162,5 @@
         but in some cases it may have more elaborate methods for setting
         up the browser from the runner process.
         """
-        for k, v in kwargs.iteritems():
+        for k, v in kwargs.items():
             setattr(self, k, v)
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/environment.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/environment.py
index 167da95..466460b 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/environment.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/environment.py
@@ -113,7 +113,7 @@
     def __exit__(self, exc_type, exc_val, exc_tb):
         self.process_interrupts()
 
-        for scheme, servers in self.servers.iteritems():
+        for scheme, servers in self.servers.items():
             for port, server in servers:
                 server.kill()
         for cm in self.env_extras:
@@ -189,7 +189,7 @@
             path = os.path.normpath(os.path.join(here, path))
             route_builder.add_static(path, format_args, content_type, route)
 
-        for url_base, paths in self.test_paths.iteritems():
+        for url_base, paths in self.test_paths.items():
             if url_base == "/":
                 continue
             route_builder.add_mount_point(url_base, paths["tests_path"])
@@ -210,7 +210,7 @@
 
     def test_servers(self):
         failed = []
-        for scheme, servers in self.servers.iteritems():
+        for scheme, servers in self.servers.items():
             for port, server in servers:
                 if self.test_server_port:
                     s = socket.socket()
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/executors/executormarionette.py
index 1c588d3..4d922e8 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -192,14 +192,14 @@
 
     def on_environment_change(self, old_environment, new_environment):
         #Unset all the old prefs
-        for name in old_environment.get("prefs", {}).iterkeys():
+        for name in old_environment.get("prefs", {}).keys():
             value = self.executor.original_pref_values[name]
             if value is None:
                 self.clear_user_pref(name)
             else:
                 self.set_pref(name, value)
 
-        for name, value in new_environment.get("prefs", {}).iteritems():
+        for name, value in new_environment.get("prefs", {}).items():
             self.executor.original_pref_values[name] = self.get_pref(name)
             self.set_pref(name, value)
 
@@ -576,7 +576,7 @@
         data = {"screenshot": screenshot}
         if self.executor.group_metadata is not None:
             data["urlCount"] = {urlparse.urljoin(self.executor.server_url(key[0]), key[1]):value
-                                for key, value in self.executor.group_metadata.get("url_count", {}).iteritems()
+                                for key, value in self.executor.group_metadata.get("url_count", {}).items()
                                 if value > 1}
         self.executor.protocol.marionette.set_context(self.executor.protocol.marionette.CONTEXT_CHROME)
         self.executor.protocol.marionette._send_message("reftest:setup", data)
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/executors/executorservo.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/executors/executorservo.py
index 216d687..6b33fc6 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/executors/executorservo.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/executors/executorservo.py
@@ -76,7 +76,7 @@
         ]
         for stylesheet in self.browser.user_stylesheets:
             args += ["--user-stylesheet", stylesheet]
-        for pref, value in test.environment.get('prefs', {}).iteritems():
+        for pref, value in test.environment.get('prefs', {}).items():
             args += ["--pref", "%s=%s" % (pref, value)]
         if self.browser.ca_certificate_path:
             args += ["--certificate-path", self.browser.ca_certificate_path]
@@ -219,7 +219,7 @@
             for stylesheet in self.browser.user_stylesheets:
                 command += ["--user-stylesheet", stylesheet]
 
-            for pref, value in test.environment.get('prefs', {}).iteritems():
+            for pref, value in test.environment.get('prefs', {}).items():
                 command += ["--pref", "%s=%s" % (pref, value)]
 
             command += ["--resolution", viewport_size or "800x600"]
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/manifestinclude.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/manifestinclude.py
index 1b53a42..52d717a 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/manifestinclude.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/manifestinclude.py
@@ -91,7 +91,7 @@
         if paths:
             urls = []
             for path in paths:
-                for manifest, data in test_manifests.iteritems():
+                for manifest, data in test_manifests.items():
                     found = False
                     rel_path = os.path.relpath(path, data["tests_path"])
                     iterator = manifest.iterpath if os.path.isfile(path) else manifest.iterdir
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/manifestupdate.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/manifestupdate.py
index 07e623c..23a0528 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/manifestupdate.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/manifestupdate.py
@@ -283,7 +283,7 @@
                     del self._data["expected"]
                     break
 
-        for subtest in self.subtests.itervalues():
+        for subtest in self.subtests.values():
             subtest.clear_expected()
 
     def append(self, node):
@@ -336,7 +336,7 @@
 
     by_property = defaultdict(set)
     for run_info, status in values:
-        for prop_name, prop_value in run_info.iteritems():
+        for prop_name, prop_value in run_info.items():
             by_property[(prop_name, prop_value)].add(status)
 
     if property_order is None:
@@ -350,13 +350,13 @@
     # If we have more than one value, remove any properties that are common
     # for all the values
     if len(values) > 1:
-        for key, statuses in by_property.copy().iteritems():
+        for key, statuses in by_property.copy().items():
             if len(statuses) == len(values):
                 del by_property[key]
         if not by_property:
             raise ConditionError
 
-    properties = set(item[0] for item in by_property.iterkeys())
+    properties = set(item[0] for item in by_property.keys())
     include_props = []
 
     for prop in property_order:
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/metadata.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/metadata.py
index 73f266f..c32487c 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/metadata.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/metadata.py
@@ -52,12 +52,12 @@
                                                 property_order=property_order,
                                                 boolean_properties=boolean_properties)
 
-    for test_manifest, expected_map in expected_map_by_manifest.iteritems():
+    for test_manifest, expected_map in expected_map_by_manifest.items():
         url_base = manifests[test_manifest]["url_base"]
         metadata_path = test_paths[url_base]["metadata_path"]
         write_changes(metadata_path, expected_map)
 
-    results_changed = [item.test_path for item in expected_map.itervalues() if item.modified]
+    results_changed = [item.test_path for item in expected_map.values() if item.modified]
 
     return unexpected_changes(manifests, change_data, results_changed)
 
@@ -100,7 +100,7 @@
     files_changed = set(files_changed)
 
     root_manifest = None
-    for manifest, paths in manifests.iteritems():
+    for manifest, paths in manifests.items():
         if paths["url_base"] == "/":
             root_manifest = manifest
             break
@@ -133,7 +133,7 @@
     expected_map = {}
     id_test_map = {}
 
-    for test_manifest, paths in manifests.iteritems():
+    for test_manifest, paths in manifests.items():
         expected_map_manifest, id_path_map_manifest = create_test_tree(
             paths["metadata_path"],
             test_manifest,
@@ -148,8 +148,8 @@
         with open(log_filename) as f:
             updater.update_from_log(f)
 
-    for manifest_expected in expected_map.itervalues():
-        for tree in manifest_expected.itervalues():
+    for manifest_expected in expected_map.values():
+        for tree in manifest_expected.values():
             for test in tree.iterchildren():
                 for subtest in test.iterchildren():
                     subtest.coalesce_expected()
@@ -196,7 +196,7 @@
 
 def write_new_expected(metadata_path, expected_map):
     # Serialize the data back to a file
-    for tree in expected_map.itervalues():
+    for tree in expected_map.values():
         if not tree.is_empty:
             manifest_str = wptmanifest.serialize(tree.node, skip_empty_data=True)
             assert manifest_str != ""
@@ -293,7 +293,7 @@
     expected_map = {}
     id_test_map = {}
     exclude_types = frozenset(["stub", "helper", "manual", "support", "conformancechecker"])
-    all_types = [item.item_type for item in manifestitem.__dict__.itervalues()
+    all_types = [item.item_type for item in manifestitem.__dict__.values()
                  if type(item) == type and
                  issubclass(item, manifestitem.ManifestItem) and
                  item.item_type is not None]
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/products.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/products.py
index c077f95..ff6b406 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/products.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/products.py
@@ -44,7 +44,7 @@
                        if "run_info_extras" in data else lambda **kwargs:{})
 
     executor_classes = {}
-    for test_type, cls_name in data["executor"].iteritems():
+    for test_type, cls_name in data["executor"].items():
         cls = getattr(module, cls_name)
         executor_classes[test_type] = cls
 
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/reduce.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/reduce.py
index d245ee3..c14effd 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/reduce.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/reduce.py
@@ -168,7 +168,7 @@
                 logger.debug(item)
             return None
 
-        return any(len(item) > 1 for item in statuses.itervalues())
+        return any(len(item) > 1 for item in statuses.values())
 
     def get_initial_tests(self):
         # Need to pass in arguments
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/testloader.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/testloader.py
index 91392fe..c693cdb 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/testloader.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/testloader.py
@@ -198,7 +198,7 @@
                 break
 
         self.logger.debug(self.expected_time)
-        for i, chunk in chunks.iteritems():
+        for i, chunk in chunks.items():
             self.logger.debug("%i: %i, %i" % (i + 1, chunk.time, chunk.badness))
 
         assert self._all_tests(by_dir) == self._chunked_tests(chunks)
@@ -208,13 +208,13 @@
     @staticmethod
     def _all_tests(by_dir):
         """Return a set of all tests in the manifest from a grouping by directory"""
-        return set(x[0] for item in by_dir.itervalues()
+        return set(x[0] for item in by_dir.values()
                    for x in item.tests)
 
     @staticmethod
     def _chunked_tests(chunks):
         """Return a set of all tests in the manifest from the chunk list"""
-        return set(x[0] for chunk in chunks.itervalues()
+        return set(x[0] for chunk in chunks.values()
                    for path in chunk.paths
                    for x in path.tests)
 
@@ -381,7 +381,7 @@
 
     def load(self):
         rv = {}
-        for url_base, paths in self.test_paths.iteritems():
+        for url_base, paths in self.test_paths.items():
             manifest_file = self.load_manifest(url_base=url_base,
                                                **paths)
             path_data = {"url_base": url_base}
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/update/metadata.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/update/metadata.py
index 5f6925e..70964ff 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/update/metadata.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/update/metadata.py
@@ -57,7 +57,7 @@
 
         if not local_tree.is_clean:
             metadata_paths = [manifest_path["metadata_path"]
-                              for manifest_path in state.paths.itervalues()]
+                              for manifest_path in state.paths.values()]
             for path in metadata_paths:
                 local_tree.add_new(os.path.relpath(path, local_tree.root))
             local_tree.update_patch(include=metadata_paths)
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptcommandline.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptcommandline.py
index b3dc8b9..5bfc662 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptcommandline.py
@@ -253,7 +253,7 @@
                     ("host_cert_path", "host_cert_path", True),
                     ("host_key_path", "host_key_path", True)]}
 
-    for section, values in keys.iteritems():
+    for section, values in keys.items():
         for config_value, kw_value, is_path in values:
             if kw_value in kwargs and kwargs[kw_value] is None:
                 if not is_path:
@@ -281,7 +281,7 @@
     # Set up test_paths
     test_paths = OrderedDict()
 
-    for section in config.iterkeys():
+    for section in config.keys():
         if section.startswith("manifest:"):
             manifest_opts = config.get(section)
             url_base = manifest_opts.get("url_base", "/")
@@ -304,12 +304,12 @@
 def check_args(kwargs):
     set_from_config(kwargs)
 
-    for test_paths in kwargs["test_paths"].itervalues():
+    for test_paths in kwargs["test_paths"].values():
         if not ("tests_path" in test_paths and
                 "metadata_path" in test_paths):
             print "Fatal: must specify both a test path and metadata path"
             sys.exit(1)
-        for key, path in test_paths.iteritems():
+        for key, path in test_paths.items():
             name = key.split("_", 1)[0]
 
             if not os.path.exists(path):
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
index f0f4ecf..ea9426d 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
@@ -300,17 +300,17 @@
     def _flatten(self):
         rv = {}
         for node in [self, self.root]:
-            for name, value in node._data.iteritems():
+            for name, value in node._data.items():
                 if name not in rv:
                     rv[name] = value
         return rv
 
-    def iteritems(self):
-        for item in self._flatten().iteritems():
+    def items(self):
+        for item in self._flatten().items():
             yield item
 
-    def iterkeys(self):
-        for item in self._flatten().iterkeys():
+    def keys(self):
+        for item in self._flatten().keys():
             yield item
 
     def remove_value(self, key, value):
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/backends/static.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/backends/static.py
index b2b9fbe..e0a62c7 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/backends/static.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/backends/static.py
@@ -183,21 +183,21 @@
     def _flatten(self):
         rv = {}
         for node in [self, self.root]:
-            for name, value in node._data.iteritems():
+            for name, value in node._data.items():
                 if name not in rv:
                     rv[name] = value
         return rv
 
-    def iteritems(self):
-        for item in self._flatten().iteritems():
+    def items(self):
+        for item in self._flatten().items():
             yield item
 
-    def iterkeys(self):
-        for item in self._flatten().iterkeys():
+    def keys(self):
+        for item in self._flatten().keys():
             yield item
 
-    def itervalues(self):
-        for item in self._flatten().itervalues():
+    def values(self):
+        for item in self._flatten().values():
             yield item
 
     def append(self, child):
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/serializer.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/serializer.py
index 52203ab..c297426 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/serializer.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/serializer.py
@@ -1,7 +1,7 @@
 from node import NodeVisitor, ValueNode, ListNode, BinaryExpressionNode
 from parser import atoms, precedence
 
-atom_names = {v:"@%s" % k for (k,v) in atoms.iteritems()}
+atom_names = {v:"@%s" % k for (k,v) in atoms.items()}
 
 named_escapes = set(["\a", "\b", "\f", "\n", "\r", "\t", "\v"])
 
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_conditional.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_conditional.py
index d9ffdf2..311cfde 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_conditional.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_conditional.py
@@ -140,4 +140,4 @@
         self.assertTrue(manifest.has_key("key_1"))
         self.assertFalse(manifest.has_key("key_2"))
 
-        self.assertEquals(set(manifest.iterkeys()), set(["key", "key_1"]))
+        self.assertEquals(set(manifest.keys()), set(["key", "key_1"]))
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_static.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_static.py
index ed28578..5dd5ca4 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_static.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptmanifest/tests/test_static.py
@@ -85,8 +85,8 @@
         self.assertTrue(manifest.has_key("key_1"))
         self.assertFalse(manifest.has_key("key_2"))
 
-        self.assertEquals(set(manifest.iterkeys()), set(["key", "key_1"]))
-        self.assertEquals(set(manifest.itervalues()), set(["value_1", "other_value"]))
+        self.assertEquals(set(manifest.keys()), set(["key", "key_1"]))
+        self.assertEquals(set(manifest.values()), set(["value_1", "other_value"]))
 
     def test_is_empty_1(self):
         data = """
diff --git a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptrunner.py b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptrunner.py
index c8e3e54..eebd1de 100644
--- a/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptrunner.py
+++ b/third_party/web_platform_tests/tools/wptrunner/wptrunner/wptrunner.py
@@ -94,7 +94,7 @@
     run_info, test_loader = get_loader(test_paths, product, ssl_env,
                                        run_info_extras=run_info_extras, **kwargs)
 
-    for test_type, tests in test_loader.disabled_tests.iteritems():
+    for test_type, tests in test_loader.disabled_tests.items():
         for test in tests:
             rv.append({"test": test.id, "reason": test.disabled()})
     print json.dumps(rv, indent=2)
@@ -117,7 +117,7 @@
 
 
 def get_pause_after_test(test_loader, **kwargs):
-    total_tests = sum(len(item) for item in test_loader.tests.itervalues())
+    total_tests = sum(len(item) for item in test_loader.tests.values())
     if kwargs["pause_after_test"] is None:
         if kwargs["repeat_until_unexpected"]:
             return False
diff --git a/third_party/web_platform_tests/tools/wptserve/tests/functional/base.py b/third_party/web_platform_tests/tools/wptserve/tests/functional/base.py
index 9b0cb50..edeff5f 100644
--- a/third_party/web_platform_tests/tools/wptserve/tests/functional/base.py
+++ b/third_party/web_platform_tests/tools/wptserve/tests/functional/base.py
@@ -29,7 +29,7 @@
         return self.method
 
     def add_data(self, data):
-        if hasattr(data, "iteritems"):
+        if hasattr(data, "items"):
             data = urlencode(data)
         print(data)
         self.add_header("Content-Length", str(len(data)))
@@ -57,7 +57,7 @@
         if headers is None:
             headers = {}
 
-        for name, value in headers.iteritems():
+        for name, value in headers.items():
             req.add_header(name, value)
 
         if body is not None:
diff --git a/third_party/web_platform_tests/tools/wptserve/wptserve/handlers.py b/third_party/web_platform_tests/tools/wptserve/wptserve/handlers.py
index f0ce3c0..0da9e31 100644
--- a/third_party/web_platform_tests/tools/wptserve/wptserve/handlers.py
+++ b/third_party/web_platform_tests/tools/wptserve/wptserve/handlers.py
@@ -169,14 +169,14 @@
             use_sub = False
 
         try:
-            with open(headers_path) as headers_file:
+            with open(headers_path, "rb") as headers_file:
                 data = headers_file.read()
         except IOError:
             return []
         else:
             if use_sub:
                 data = template(request, data, escape_type="none")
-            return [tuple(item.strip() for item in line.split(":", 1))
+            return [tuple(item.strip() for item in line.split(b":", 1))
                     for line in data.splitlines() if line]
 
     def get_data(self, response, path, byte_ranges):
@@ -229,6 +229,11 @@
     def __call__(self, request, response):
         path = filesystem_path(self.base_path, request, self.url_base)
 
+        def execfile(path, global_environ, local_environ):
+            with open(path, "rb") as f:
+                contents = f.read().decode()
+                exec(contents, global_environ, local_environ)
+
         try:
             environ = {"__file__": path}
             execfile(path, environ, environ)
@@ -362,7 +367,7 @@
             self.data = f.read() % format_args
 
         self.resp_headers = [("Content-Type", content_type)]
-        for k, v in headers.iteritems():
+        for k, v in headers.items():
             resp_headers.append((k.replace("_", "-"), v))
 
         self.handler = handler(self.handle_request)
diff --git a/third_party/web_platform_tests/tools/wptserve/wptserve/pipes.py b/third_party/web_platform_tests/tools/wptserve/wptserve/pipes.py
index 95108ba..06e0fe2 100644
--- a/third_party/web_platform_tests/tools/wptserve/wptserve/pipes.py
+++ b/third_party/web_platform_tests/tools/wptserve/wptserve/pipes.py
@@ -1,11 +1,16 @@
-from cgi import escape
 import gzip as gzip_module
 import re
 import time
 import types
 import uuid
-from cStringIO import StringIO
+from io import BytesIO
+import six
 
+if six.PY2:
+    from cgi import escape
+else:
+    from html import escape
+    unicode = lambda s, *args: str(s)
 
 def resolve_content(response):
     return b"".join(item for item in response.iter_content(read_file=True))
@@ -270,26 +275,31 @@
 
 class ReplacementTokenizer(object):
     def ident(scanner, token):
-        return ("ident", token)
+        return ("ident", token.decode())
 
     def index(scanner, token):
         token = token[1:-1]
+        if six.PY3:
+            token = token.decode()
         try:
             token = int(token)
         except ValueError:
-            token = unicode(token, "utf8")
+            if six.PY2:
+                token = unicode(token, "utf8")
+            else:
+                token = token
         return ("index", token)
 
     def var(scanner, token):
-        token = token[:-1]
+        token = token[:-1].decode()
         return ("var", token)
 
     def tokenize(self, string):
         return self.scanner.scan(string)[0]
 
-    scanner = re.Scanner([(r"\$\w+:", var),
-                          (r"\$?\w+(?:\(\))?", ident),
-                          (r"\[[^\]]*\]", index)])
+    scanner = re.Scanner([(br"\$\w+:", var),
+                          (br"\$?\w+(?:\(\))?", ident),
+                          (br"\[[^\]]*\]", index)])
 
 
 class FirstWrapper(object):
@@ -408,7 +418,9 @@
         for item in tokens[1:]:
             value = value[item[1]]
 
-        assert isinstance(value, (int,) + types.StringTypes), tokens
+        if isinstance(value, bytes):
+            value = value.decode()
+        assert isinstance(value, (int,) + six.string_types), tokens
 
         if variable is not None:
             variables[variable] = value
@@ -418,9 +430,13 @@
 
         #Should possibly support escaping for other contexts e.g. script
         #TODO: read the encoding of the response
-        return escape_func(unicode(value)).encode("utf-8")
+        if isinstance(value, bytes):
+            value = value.decode()
+        elif isinstance(value, int):
+            value = str(value)
+        return escape_func(unicode(value)).encode()
 
-    template_regexp = re.compile(r"{{([^}]*)}}")
+    template_regexp = re.compile(br"{{([^}]*)}}")
     new_content = template_regexp.sub(config_replacement, content)
 
     return new_content
@@ -436,7 +452,7 @@
     content = resolve_content(response)
     response.headers.set("Content-Encoding", "gzip")
 
-    out = StringIO()
+    out = BytesIO()
     with gzip_module.GzipFile(fileobj=out, mode="w") as f:
         f.write(content)
     response.content = out.getvalue()
diff --git a/third_party/web_platform_tests/tools/wptserve/wptserve/request.py b/third_party/web_platform_tests/tools/wptserve/wptserve/request.py
index 4476634..44aea33 100644
--- a/third_party/web_platform_tests/tools/wptserve/wptserve/request.py
+++ b/third_party/web_platform_tests/tools/wptserve/wptserve/request.py
@@ -1,14 +1,19 @@
 import base64
 import cgi
-import Cookie
-import StringIO
 import tempfile
 
+import six
+from six.moves import http_cookies
 from six.moves.urllib.parse import parse_qsl, urlsplit
 
 from . import stash
 from .utils import HTTPException
 
+if six.PY2:
+    base64.decodebytes = base64.decodestring
+else:
+    unicode = lambda s, *args: str(s)
+
 missing = object()
 
 
@@ -52,7 +57,7 @@
         if length > self.max_buffer_size:
             self._buf = tempfile.TemporaryFile(mode="rw+b")
         else:
-            self._buf = StringIO.StringIO()
+            self._buf = six.BytesIO()
 
     @property
     def _buf_position(self):
@@ -75,7 +80,7 @@
             old_data = self._buf.read(buf_bytes)
             bytes_remaining -= buf_bytes
         else:
-            old_data = ""
+            old_data = b""
 
         assert self._buf_position == self._file_position, (
             "Before reading buffer position (%i) didn't match file position (%i)" %
@@ -275,7 +280,7 @@
         self._headers = None
 
         self.raw_input = InputFile(request_handler.rfile,
-                                   int(self.headers.get("Content-Length", 0)))
+                                   int(self.raw_headers.get("Content-Length", 0)))
         self._body = None
 
         self._GET = None
@@ -303,10 +308,15 @@
             #Work out the post parameters
             pos = self.raw_input.tell()
             self.raw_input.seek(0)
-            fs = cgi.FieldStorage(fp=self.raw_input,
-                                  environ={"REQUEST_METHOD": self.method},
-                                  headers=self.headers,
-                                  keep_blank_values=True)
+            kwargs = {
+                "fp": self.raw_input,
+                "environ": {"REQUEST_METHOD": self.method},
+                "headers": self.raw_headers,
+                "keep_blank_values": True,
+            }
+            if six.PY3:
+                kwargs.update({"encoding": "iso-8859-1"})
+            fs = cgi.FieldStorage(**kwargs)
             self._POST = MultiDict.from_field_storage(fs)
             self.raw_input.seek(pos)
         return self._POST
@@ -314,11 +324,11 @@
     @property
     def cookies(self):
         if self._cookies is None:
-            parser = Cookie.BaseCookie()
+            parser = http_cookies.BaseCookie()
             cookie_headers = self.headers.get("cookie", "")
             parser.load(cookie_headers)
             cookies = Cookies()
-            for key, value in parser.iteritems():
+            for key, value in parser.items():
                 cookies[key] = CookieValue(value)
             self._cookies = cookies
         return self._cookies
@@ -394,11 +404,11 @@
     def __contains__(self, key):
         return dict.__contains__(self, key.lower())
 
-    def iteritems(self):
+    def items(self):
         for item in self:
             yield item, self[item]
 
-    def itervalues(self):
+    def values(self):
         for item in self:
             yield self[item]
 
@@ -586,5 +596,5 @@
                 raise HTTPException(400, "Unsupported authentication scheme %s" % auth_type)
 
     def decode_basic(self, data):
-        decoded_data = base64.decodestring(data)
+        decoded_data = base64.decodebytes(data.encode()).decode()
         return decoded_data.split(":", 1)
diff --git a/third_party/web_platform_tests/tools/wptserve/wptserve/response.py b/third_party/web_platform_tests/tools/wptserve/wptserve/response.py
index 02b41ea..f8a0d29 100644
--- a/third_party/web_platform_tests/tools/wptserve/wptserve/response.py
+++ b/third_party/web_platform_tests/tools/wptserve/wptserve/response.py
@@ -1,11 +1,13 @@
 from collections import OrderedDict
 from datetime import datetime, timedelta
-import Cookie
+from six.moves import http_cookies
 import json
 import os
 import types
 import uuid
 import socket
+import io
+import six
 
 from .constants import response_codes
 from .logger import get_logger
@@ -133,7 +135,7 @@
                 max_age = int(max_age.total_seconds())
             max_age = "%.0d" % max_age
 
-        m = Cookie.Morsel()
+        m = http_cookies.Morsel()
 
         def maybe_set(key, value):
             if value is not None and value is not False:
@@ -153,7 +155,7 @@
     def unset_cookie(self, name):
         """Remove a cookie from those that are being sent with the response"""
         cookies = self.headers.get("Set-Cookie")
-        parser = Cookie.BaseCookie()
+        parser = http_cookies.BaseCookie()
         for cookie in cookies:
             parser.load(cookie)
 
@@ -175,14 +177,18 @@
         If any part of the content is a function, this will be called
         and the resulting value (if any) returned.
 
-        :param read_file: - boolean controlling the behaviour when content
-        is a file handle. When set to False the handle will be returned directly
-        allowing the file to be passed to the output in small chunks. When set to
-        True, the entire content of the file will be returned as a string facilitating
-        non-streaming operations like template substitution.
+        :param read_file: boolean controlling the behaviour when content is a
+                          file handle. When set to False the handle will be
+                          returned directly allowing the file to be passed to
+                          the output in small chunks. When set to True, the
+                          entire content of the file will be returned as a
+                          string facilitating non-streaming operations like
+                          template substitution.
         """
-        if isinstance(self.content, types.StringTypes):
+        if isinstance(self.content, bytes):
             yield self.content
+        elif isinstance(self.content, str):
+            yield self.content.encode(self.encoding)
         elif hasattr(self.content, "read"):
             if read_file:
                 yield self.content.read()
@@ -336,7 +342,7 @@
         self.set(key, value)
 
     def __iter__(self):
-        for key, values in self.data.itervalues():
+        for key, values in self.data.values():
             for value in values:
                 yield key, value
 
@@ -381,8 +387,12 @@
                 message = response_codes[code][0]
             else:
                 message = ''
-        self.write("%s %d %s\r\n" %
-                   (self._response.request.protocol_version, code, message))
+        
+        protocol_version = self._response.request.protocol_version
+        if isinstance(protocol_version, bytes):
+            protocol_version = protocol_version.decode()
+
+        self.write("%s %d %s\r\n" % (protocol_version, code, message))
 
     def write_header(self, name, value):
         """Write out a single header for the response.
@@ -390,6 +400,10 @@
         :param name: Name of the header field
         :param value: Value of the header field
         """
+        if isinstance(value, bytes):
+            value = value.decode("utf-8")
+        if isinstance(name, bytes):
+            name = name.decode()
         self._headers_seen.add(name.lower())
         self.write("%s: %s\r\n" % (name, value))
         if not self._response.explicit_flush:
@@ -401,12 +415,14 @@
             if name.lower() not in self._headers_seen:
                 self.write_header(name, f())
 
-        if (type(self._response.content) in (str, unicode) and
+
+        if (isinstance(self._response.content, (bytes,) + six.string_types) and
             "content-length" not in self._headers_seen):
             #Would be nice to avoid double-encoding here
             self.write_header("Content-Length", len(self.encode(self._response.content)))
 
-        if (type(self._response.content) in (file,) and
+        file_type = file if six.PY2 else io.IOBase
+        if (isinstance(self._response.content, file_type) and
             "content-length" not in self._headers_seen):
             file_size = os.stat( self._response.content.name ).st_size
             self.write_header("Content-Length", file_size )
@@ -430,7 +446,7 @@
 
     def write_content(self, data):
         """Write the body of the response."""
-        if isinstance(data, types.StringTypes):
+        if isinstance(data, (bytes,) + six.string_types):
             self.write(data)
         else:
             self.write_content_file(data)
@@ -463,10 +479,12 @@
 
     def encode(self, data):
         """Convert unicode to bytes according to response.encoding."""
-        if isinstance(data, str):
+        if isinstance(data, bytes):
             return data
-        elif isinstance(data, unicode):
+        elif six.PY3 or isinstance(data, unicode):
             return data.encode(self._response.encoding)
+        elif isinstance(data, str):
+            return data
         else:
             raise ValueError
 
diff --git a/third_party/web_platform_tests/tools/wptserve/wptserve/router.py b/third_party/web_platform_tests/tools/wptserve/wptserve/router.py
index a35e098..b77d2d9 100644
--- a/third_party/web_platform_tests/tools/wptserve/wptserve/router.py
+++ b/third_party/web_platform_tests/tools/wptserve/wptserve/router.py
@@ -1,6 +1,6 @@
 import itertools
 import re
-import types
+import six
 
 from .logger import get_logger
 
@@ -47,7 +47,10 @@
             tokens = itertools.chain([("slash", None)], tokens)
 
         for token in tokens:
-            re_parts.append(func_map[token[0]](token))
+            re_part = func_map[token[0]](token)
+            if isinstance(re_part, bytes):
+                re_part = re_part.decode()
+            re_parts.append(re_part)
 
         if self.star_seen:
             re_parts.append(")")
@@ -78,6 +81,9 @@
     tokenizer = RouteTokenizer()
     tokens, unmatched = tokenizer.scan(route_pattern)
 
+    if isinstance(unmatched, bytes):
+        unmatched = unmatched.decode()
+
     assert unmatched == "", unmatched
 
     compiler = RouteCompiler()
@@ -135,7 +141,7 @@
                         object and the response object.
 
         """
-        if type(methods) in types.StringTypes or methods in (any_method, "*"):
+        if isinstance(methods, six.string_types) or methods in (any_method, "*"):
             methods = [methods]
         for method in methods:
             self.routes.append((method, compile_path_match(path), handler))
diff --git a/third_party/web_platform_tests/tools/wptserve/wptserve/server.py b/third_party/web_platform_tests/tools/wptserve/wptserve/server.py
index 0ab512c..ee1f8e9 100644
--- a/third_party/web_platform_tests/tools/wptserve/wptserve/server.py
+++ b/third_party/web_platform_tests/tools/wptserve/wptserve/server.py
@@ -1,14 +1,14 @@
-import BaseHTTPServer
 import errno
 import os
 import socket
-from SocketServer import ThreadingMixIn
+import six
+from six.moves import BaseHTTPServer
+from six.moves.socketserver import ThreadingMixIn
 import ssl
 import sys
 import threading
 import time
 import traceback
-import types
 
 from six.moves.urllib.parse import urlsplit, urlunsplit
 
@@ -79,7 +79,7 @@
         :param output_path: Path to replace the input path with in
                             the request.
         """
-        if type(methods) in types.StringTypes:
+        if isinstance(methods, six.string_types):
             methods = [methods]
         self.rules[input_path] = (methods, output_path)
 
@@ -255,8 +255,9 @@
                 except HTTPException as e:
                     response.set_error(e.code, e.message)
                 except Exception as e:
-                    if e.message:
-                        err = [e.message]
+                    message = str(e)
+                    if message:
+                        err = [message]
                     else:
                         err = []
                     err.append(traceback.format_exc())
diff --git a/third_party/web_platform_tests/tools/wptserve/wptserve/stash.py b/third_party/web_platform_tests/tools/wptserve/wptserve/stash.py
index b6bd6ee..0e7c85f 100644
--- a/third_party/web_platform_tests/tools/wptserve/wptserve/stash.py
+++ b/third_party/web_platform_tests/tools/wptserve/wptserve/stash.py
@@ -1,9 +1,14 @@
 import base64
 import json
 import os
+import six
 import uuid
 from multiprocessing.managers import BaseManager, DictProxy
 
+if six.PY2:
+    base64.encodebytes = base64.encodestring
+    base64.decodebytes = base64.decodestring
+
 class ServerDictManager(BaseManager):
     shared_data = {}
 
@@ -39,15 +44,17 @@
         address = tuple(address)
     else:
         address = str(address)
-    authkey = base64.decodestring(authkey)
+    authkey = base64.decodebytes(authkey.encode())
     return address, authkey
 
 def store_env_config(address, authkey):
-    authkey = base64.encodestring(authkey)
-    os.environ["WPT_STASH_CONFIG"] = json.dumps((address, authkey))
+    authkey = base64.encodebytes(authkey)
+    if isinstance(address, bytes):
+        address = address.decode()
+    os.environ["WPT_STASH_CONFIG"] = json.dumps((address, authkey.decode("ascii")))
 
 def start_server(address=None, authkey=None):
-    manager = ServerDictManager(address, authkey)
+    manager = ServerDictManager(address, authkey.encode())
     manager.start()
 
     return (manager, manager._address, manager._authkey)
diff --git a/third_party/web_platform_tests/tools/wptserve/wptserve/utils.py b/third_party/web_platform_tests/tools/wptserve/wptserve/utils.py
index e57ff19..458e22b 100644
--- a/third_party/web_platform_tests/tools/wptserve/wptserve/utils.py
+++ b/third_party/web_platform_tests/tools/wptserve/wptserve/utils.py
@@ -1,6 +1,6 @@
 def invert_dict(dict):
     rv = {}
-    for key, values in dict.iteritems():
+    for key, values in dict.items():
         for value in values:
             if value in rv:
                 raise ValueError
diff --git a/third_party/web_platform_tests/websockets/handlers/echo_close_data_wsh.py b/third_party/web_platform_tests/websockets/handlers/echo_close_data_wsh.py
index 4da4ce6..8bd2827 100755
--- a/third_party/web_platform_tests/websockets/handlers/echo_close_data_wsh.py
+++ b/third_party/web_platform_tests/websockets/handlers/echo_close_data_wsh.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python
 from mod_pywebsocket import msgutil
+import six
 
 _GOODBYE_MESSAGE = u'Goodbye'
 
@@ -15,7 +16,7 @@
         line = request.ws_stream.receive_message()
         if line is None:
             return
-        if isinstance(line, unicode):
+        if isinstance(line, six.text_type):
             if line == _GOODBYE_MESSAGE:
                 return
                 request.ws_stream.send_message(line, binary=False)
diff --git a/third_party/web_platform_tests/websockets/handlers/echo_exit_wsh.py b/third_party/web_platform_tests/websockets/handlers/echo_exit_wsh.py
index 200b92e..be9da0e 100755
--- a/third_party/web_platform_tests/websockets/handlers/echo_exit_wsh.py
+++ b/third_party/web_platform_tests/websockets/handlers/echo_exit_wsh.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python
 from mod_pywebsocket import msgutil
+import six
 
 _GOODBYE_MESSAGE = u'Goodbye'
 
@@ -15,7 +16,7 @@
         line = request.ws_stream.receive_message()
         if line is None:
             return
-        if isinstance(line, unicode):
+        if isinstance(line, six.text_type):
             if line == _GOODBYE_MESSAGE:
                 return
 
diff --git a/third_party/web_platform_tests/websockets/handlers/echo_raw_wsh.py b/third_party/web_platform_tests/websockets/handlers/echo_raw_wsh.py
index c3a030c..0d5de62 100755
--- a/third_party/web_platform_tests/websockets/handlers/echo_raw_wsh.py
+++ b/third_party/web_platform_tests/websockets/handlers/echo_raw_wsh.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
+import six
 from mod_pywebsocket import msgutil
-import urllib
 
 
 def web_socket_do_extra_handshake(request):
@@ -10,6 +10,9 @@
 def web_socket_transfer_data(request):
     while True:
         line = msgutil.receive_message(request)
-        if line == 'exit':
+        if line == b'exit':
             return
-        request.connection.write(line.decode("string-escape"))
+        if line is not None:
+            if isinstance(line, six.string_types):
+                line = line.encode()
+            request.connection.write(line)
diff --git a/third_party/web_platform_tests/websockets/handlers/echo_wsh.py b/third_party/web_platform_tests/websockets/handlers/echo_wsh.py
index 5829c2f..18b7e89 100755
--- a/third_party/web_platform_tests/websockets/handlers/echo_wsh.py
+++ b/third_party/web_platform_tests/websockets/handlers/echo_wsh.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python
-from mod_pywebsocket import msgutil
+import six
+from mod_pywebsocket import common
 
 _GOODBYE_MESSAGE = u'Goodbye'
 
@@ -16,10 +17,20 @@
         line = request.ws_stream.receive_message()
         if line is None:
             return
-        if isinstance(line, unicode):
+        if isinstance(line, six.text_type):
             request.ws_stream.send_message(line, binary=False)
             if line == _GOODBYE_MESSAGE:
                 return
         else:
             request.ws_stream.send_message(line, binary=True)
 
+def web_socket_passive_closing_handshake(request):
+    # Echo close status code and reason
+    code, reason = request.ws_close_code, request.ws_close_reason
+
+    # No status received is a reserved pseudo code representing an empty code,
+    # so echo back an empty code in this case.
+    if code == common.STATUS_NO_STATUS_RECEIVED:
+        code = None
+
+    return code, reason
diff --git a/third_party/web_platform_tests/websockets/handlers/set-cookie_http_wsh.py b/third_party/web_platform_tests/websockets/handlers/set-cookie_http_wsh.py
index 1478424..2ddc61e 100755
--- a/third_party/web_platform_tests/websockets/handlers/set-cookie_http_wsh.py
+++ b/third_party/web_platform_tests/websockets/handlers/set-cookie_http_wsh.py
@@ -2,7 +2,7 @@
 
 from mod_pywebsocket import common, msgutil, util
 from mod_pywebsocket.handshake import hybi
-import urlparse
+from six.moves.urllib import parse as urlparse
 
 def web_socket_do_extra_handshake(request):
     url_parts = urlparse.urlsplit(request.uri)
diff --git a/third_party/web_platform_tests/websockets/handlers/set-cookie_wsh.py b/third_party/web_platform_tests/websockets/handlers/set-cookie_wsh.py
index b0e6504..4405b13 100755
--- a/third_party/web_platform_tests/websockets/handlers/set-cookie_wsh.py
+++ b/third_party/web_platform_tests/websockets/handlers/set-cookie_wsh.py
@@ -1,5 +1,5 @@
 #!/usr/bin/python
-import urlparse
+from six.moves.urllib import parse as urlparse
 
 from mod_pywebsocket import common, msgutil, util
 from mod_pywebsocket.handshake import hybi
@@ -7,7 +7,14 @@
 
 def web_socket_do_extra_handshake(request):
     url_parts = urlparse.urlsplit(request.uri)
-    request.connection.write('HTTP/1.1 101 Switching Protocols:\x0D\x0AConnection: Upgrade\x0D\x0AUpgrade: WebSocket\x0D\x0ASet-Cookie: ws_test_'+(url_parts.query or '')+'=test; Path=/\x0D\x0ASec-WebSocket-Origin: '+request.ws_origin+'\x0D\x0ASec-WebSocket-Accept: '+hybi.compute_accept(request.headers_in.get(common.SEC_WEBSOCKET_KEY_HEADER))[0]+'\x0D\x0A\x0D\x0A')
+    msg = b'HTTP/1.1 101 Switching Protocols:\x0D\x0AConnection: Upgrade\x0D\x0AUpgrade: WebSocket\x0D\x0ASet-Cookie: ws_test_'
+    msg += url_parts.query.encode() or b''
+    msg += b'=test; Path=/\x0D\x0ASec-WebSocket-Origin: '
+    msg += request.ws_origin.encode()
+    msg += b'\x0D\x0ASec-WebSocket-Accept: '
+    msg += hybi.compute_accept_from_unicode(request.headers_in.get(common.SEC_WEBSOCKET_KEY_HEADER))
+    msg += b'\x0D\x0A\x0D\x0A'
+    request.connection.write(msg)
     return
 
 def web_socket_transfer_data(request):
diff --git a/third_party/web_platform_tests/websockets/handlers/simple_handshake_wsh.py b/third_party/web_platform_tests/websockets/handlers/simple_handshake_wsh.py
index 0750099..ebc60db 100755
--- a/third_party/web_platform_tests/websockets/handlers/simple_handshake_wsh.py
+++ b/third_party/web_platform_tests/websockets/handlers/simple_handshake_wsh.py
@@ -5,7 +5,13 @@
 
 
 def web_socket_do_extra_handshake(request):
-    request.connection.write('HTTP/1.1 101 Switching Protocols:\x0D\x0AConnection: Upgrade\x0D\x0AUpgrade: WebSocket\x0D\x0ASet-Cookie: ws_test=test\x0D\x0ASec-WebSocket-Origin: '+request.ws_origin+'\x0D\x0ASec-WebSocket-Accept: '+hybi.compute_accept(request.headers_in.get(common.SEC_WEBSOCKET_KEY_HEADER))[0]+'\x0D\x0A\x0D\x0A')
+    msg = (b'HTTP/1.1 101 Switching Protocols:\x0D\x0A'
+           b'Connection: Upgrade\x0D\x0A'
+           b'Upgrade: WebSocket\x0D\x0A'
+           b'Set-Cookie: ws_test=test\x0D\x0A'
+           b'Sec-WebSocket-Origin: %s\x0D\x0A'
+           b'Sec-WebSocket-Accept: %s\x0D\x0A\x0D\x0A') % (request.ws_origin.encode(), hybi.compute_accept_from_unicode(request.headers_in.get(common.SEC_WEBSOCKET_KEY_HEADER)))
+    request.connection.write(msg)
     return
 
 def web_socket_transfer_data(request):
diff --git a/third_party/web_platform_tests/websockets/handlers/sleep_10_v13_wsh.py b/third_party/web_platform_tests/websockets/handlers/sleep_10_v13_wsh.py
index e1a6d96..ddf9e98 100755
--- a/third_party/web_platform_tests/websockets/handlers/sleep_10_v13_wsh.py
+++ b/third_party/web_platform_tests/websockets/handlers/sleep_10_v13_wsh.py
@@ -4,15 +4,15 @@
 from mod_pywebsocket import common, msgutil, util
 
 def web_socket_do_extra_handshake(request):
-    request.connection.write('x')
+    request.connection.write(b'x')
     time.sleep(2)
-    request.connection.write('x')
+    request.connection.write(b'x')
     time.sleep(2)
-    request.connection.write('x')
+    request.connection.write(b'x')
     time.sleep(2)
-    request.connection.write('x')
+    request.connection.write(b'x')
     time.sleep(2)
-    request.connection.write('x')
+    request.connection.write(b'x')
     time.sleep(2)
     return
 
diff --git a/third_party/web_platform_tests/websockets/handlers/stash_responder_wsh.py b/third_party/web_platform_tests/websockets/handlers/stash_responder_wsh.py
index bc6f4fd..426cf17 100644
--- a/third_party/web_platform_tests/websockets/handlers/stash_responder_wsh.py
+++ b/third_party/web_platform_tests/websockets/handlers/stash_responder_wsh.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python
-import urlparse, json
+import json
+from six.moves.urllib import parse as urlparse
 from mod_pywebsocket import common, msgutil, util
 from mod_pywebsocket.handshake import hybi
 from wptserve import stash
diff --git a/third_party/woff2/woff2.gyp b/third_party/woff2/woff2.gyp
deleted file mode 100644
index deca5f9..0000000
--- a/third_party/woff2/woff2.gyp
+++ /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.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'woff2_dec',
-      'type': 'static_library',
-      'include_dirs': [
-        'src',
-        'include',
-        '../brotli/c/dec',
-        '../brotli/c/include',
-      ],
-      'dependencies': [
-        '../brotli/brotli.gyp:dec',
-      ],
-      'sources': [
-        'src/buffer.h',
-        'src/file.h',
-        'src/round.h',
-        'src/store_bytes.h',
-        'src/table_tags.cc',
-        'src/table_tags.h',
-        'src/variable_length.cc',
-        'src/variable_length.h',
-        'src/woff2_common.cc',
-        'src/woff2_common.h',
-        'src/woff2_dec.cc',
-        'src/woff2_out.cc',
-        'woff2/include/decode.h',
-        'woff2/include/encode.h',
-        'woff2/include/output.h',
-      ],
-      # TODO(ksakamoto): http://crbug.com/167187
-      'msvs_disabled_warnings': [
-        4267,
-      ],
-    },
-  ],
-}
diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn
index e81448d..67b9d7b 100644
--- a/third_party/zlib/BUILD.gn
+++ b/third_party/zlib/BUILD.gn
@@ -25,7 +25,8 @@
 # TODO(b/206642994): look into whether we should condition on the
 # floating_point_fpu SABI variable, rather than sb_is_evergreen, here as we did
 # in third_party/zlib/zlib.gyp.
-if (is_starboard && sb_is_evergreen && use_arm_neon_optimizations) {
+if (is_starboard && sb_is_evergreen && target_cpu == "arm" &&
+    use_arm_neon_optimizations) {
   config("zlib_neon_fpu_config") {
     cflags = [ "-mfpu=neon" ]
     asmflags = cflags
@@ -53,7 +54,6 @@
       "adler32_simd.c",
       "adler32_simd.h",
     ]
-
     if (!is_win || is_clang) {
       cflags = [ "-mssse3" ]
     }
@@ -80,7 +80,8 @@
     configs += [ "//starboard/build/config:speed" ]
   }
 
-  if (is_starboard && sb_is_evergreen && use_arm_neon_optimizations) {
+  if (is_starboard && sb_is_evergreen && target_cpu == "arm" &&
+      use_arm_neon_optimizations) {
     configs += [ ":zlib_neon_fpu_config" ]
   }
 
@@ -160,7 +161,8 @@
       deps = [ "//starboard:starboard_headers_only" ]
     }
 
-    if (is_starboard && sb_is_evergreen && use_arm_neon_optimizations) {
+    if (is_starboard && sb_is_evergreen && target_cpu == "arm" &&
+        use_arm_neon_optimizations) {
       configs += [ ":zlib_neon_fpu_config" ]
     }
 
@@ -175,6 +177,10 @@
     if (current_cpu == "x64") {
       defines += [ "INFLATE_CHUNK_READ_64LE" ]
     }
+
+    if (is_starboard && current_cpu == "x86") {
+      cflags = [ "-msse2" ]
+    }
   }
 
   if (use_arm_neon_optimizations) {
@@ -224,7 +230,8 @@
     configs += [ "//starboard/build/config:speed" ]
   }
 
-  if (is_starboard && sb_is_evergreen && use_arm_neon_optimizations) {
+  if (is_starboard && sb_is_evergreen && target_cpu == "arm" &&
+      use_arm_neon_optimizations) {
     configs += [ ":zlib_neon_fpu_config" ]
   }
 
@@ -535,6 +542,6 @@
     configs -= [ "//starboard/build/config:size" ]
     configs += [ "//starboard/build/config:speed" ]
 
-    content_deps = [ "//third_party/icu:icudata", "//third_party/zlib/google/test:zip_unittest_files" ]
+    content_deps = [ "//third_party/zlib/google/test:zip_unittest_files" ]
   }
 }
diff --git a/third_party/zlib/google/zip_reader.cc b/third_party/zlib/google/zip_reader.cc
index f3e9d0f..90b4145 100644
--- a/third_party/zlib/google/zip_reader.cc
+++ b/third_party/zlib/google/zip_reader.cc
@@ -50,6 +50,10 @@
 
   void SetTimeModified(const base::Time& time) override;
 
+#if defined(STARBOARD)
+  bool IsSuccessful();
+#endif
+
  private:
   size_t max_read_bytes_;
   std::string* output_;
@@ -70,6 +74,12 @@
   return true;
 }
 
+#if defined(STARBOARD)
+bool StringWriterDelegate::IsSuccessful() {
+  return true;
+}
+#endif
+
 bool StringWriterDelegate::WriteBytes(const char* data, int num_bytes) {
   if (output_->size() + num_bytes > max_read_bytes_)
     return false;
@@ -289,7 +299,7 @@
     delegate->SetTimeModified(current_entry_info()->last_modified());
   }
 
-  return entire_file_extracted;
+  return entire_file_extracted && delegate->IsSuccessful();
 }
 
 void ZipReader::ExtractCurrentEntryToFilePathAsync(
@@ -467,6 +477,12 @@
   return file_->Seek(base::File::FROM_BEGIN, 0) >= 0;
 }
 
+#if defined(STARBOARD)
+bool FileWriterDelegate::IsSuccessful() {
+  return true;
+}
+#endif
+
 bool FileWriterDelegate::WriteBytes(const char* data, int num_bytes) {
   int bytes_written = file_->WriteAtCurrentPos(data, num_bytes);
   if (bytes_written > 0)
@@ -497,6 +513,12 @@
   return file_.IsValid();
 }
 
+#ifdef STARBOARD
+bool FilePathWriterDelegate::IsSuccessful() {
+  return true;
+}
+#endif
+
 bool FilePathWriterDelegate::WriteBytes(const char* data, int num_bytes) {
   return num_bytes == file_.WriteAtCurrentPos(data, num_bytes);
 }
diff --git a/third_party/zlib/google/zip_reader.h b/third_party/zlib/google/zip_reader.h
index d442d42..ca0414b 100644
--- a/third_party/zlib/google/zip_reader.h
+++ b/third_party/zlib/google/zip_reader.h
@@ -42,6 +42,11 @@
 
   // Sets the last-modified time of the data.
   virtual void SetTimeModified(const base::Time& time) = 0;
+
+#ifdef STARBOARD
+  // Returns true if the writer finished successfully.
+  virtual bool IsSuccessful() = 0;
+#endif
 };
 
 // This class is used for reading zip files. A typical use case of this
@@ -255,6 +260,10 @@
   // Sets the last-modified time of the data.
   void SetTimeModified(const base::Time& time) override;
 
+#ifdef STARBOARD
+  bool IsSuccessful() override;
+#endif
+
   // Return the actual size of the file.
   int64_t file_length() { return file_length_; }
 
@@ -289,6 +298,9 @@
   // Sets the last-modified time of the data.
   void SetTimeModified(const base::Time& time) override;
 
+#ifdef STARBOARD
+  bool IsSuccessful() override;
+#endif
  private:
   base::FilePath output_file_path_;
   base::File file_;
diff --git a/third_party/zlib/google/zip_reader_unittest.cc b/third_party/zlib/google/zip_reader_unittest.cc
index a595102..cd4f1ae 100644
--- a/third_party/zlib/google/zip_reader_unittest.cc
+++ b/third_party/zlib/google/zip_reader_unittest.cc
@@ -115,6 +115,9 @@
 class MockWriterDelegate : public zip::WriterDelegate {
  public:
   MOCK_METHOD0(PrepareOutput, bool());
+#if defined(STARBOARD)
+  MOCK_METHOD0(IsSuccessful, bool());
+#endif
   MOCK_METHOD2(WriteBytes, bool(const char*, int));
   MOCK_METHOD1(SetTimeModified, void(const base::Time&));
 };
@@ -644,6 +647,10 @@
   EXPECT_CALL(mock_writer, WriteBytes(_, _))
       .WillRepeatedly(Return(true));
   EXPECT_CALL(mock_writer, SetTimeModified(_));
+#if defined(STARBOARD)
+  EXPECT_CALL(mock_writer, IsSuccessful())
+      .WillOnce(Return(true));
+#endif
 
   base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt"));
   ZipReader reader;
diff --git a/third_party/zlib/x86.c b/third_party/zlib/x86.c
index 4b463ef..102b672 100644
--- a/third_party/zlib/x86.c
+++ b/third_party/zlib/x86.c
@@ -35,11 +35,7 @@
     x86_cpu_enable_ssse3 = features.x86.has_ssse3;
     x86_cpu_enable_simd = features.x86.has_sse2 &&
                           features.x86.has_sse42 &&
-#if SB_API_VERSION >= 12
                           features.x86.has_pclmulqdq;
-#else
-                          false;
-#endif
   }
 
   if (!x86_cpu_enable_ssse3 || !x86_cpu_enable_simd) {
diff --git a/third_party/zlib/zlib.gyp b/third_party/zlib/zlib.gyp
deleted file mode 100644
index e6df9b9..0000000
--- a/third_party/zlib/zlib.gyp
+++ /dev/null
@@ -1,555 +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.
-
-{
-  'variables': {
-    'optimize_target_for_speed': 1,
-    'use_system_minizip%': 0,
-    'use_arm_neon_optimizations%': 0,
-    'use_x86_x64_optimizations%': 0,
-
-    'conditions': [
-      [ 'OS == "none"', {
-        # Because we have a patched zlib, we cannot use the system libz.
-        # TODO(pvalchev): OpenBSD is purposefully left out, as the system
-        # zlib brings up an incompatibility that breaks rendering.
-        'use_system_zlib%': 1,
-      }, {
-        'use_system_zlib%': 0,
-      }],
-      ['target_arch=="x86" or target_arch=="x64"', {
-        'use_x86_x64_optimizations%': 1,
-      }],
-      ['target_arch=="arm" or target_arch=="arm64"', {
-        'use_arm_neon_optimizations%': 1,
-      }],
-    ],
-  },
-  'targets': [
-    # zlib_force_neon_fpu forces dependent targets to compile with the Advanced
-    # SIMD extension.
-    {
-      'target_name': 'zlib_force_neon_fpu',
-      'type': 'none',
-      'conditions': [
-        ['target_arch=="arm" and \
-          use_arm_neon_optimizations==1 and \
-          floating_point_fpu!="neon" and \
-          floating_point_fpu!="neon-fp16" and \
-          floating_point_fpu!="neon-vfpv4" and \
-          floating_point_fpu!="crypto-neon-fp-armv8"', {
-          'direct_dependent_settings': {
-            'cflags!': [
-              '-mfpu=<(floating_point_fpu)',
-            ],
-            'cflags': [
-              '-mfpu=neon',
-            ],
-          },
-        }],
-      ],
-    },
-    {
-      'target_name': 'zlib_adler32_simd',
-      'type': 'static_library',
-      'defines': [
-        'ZLIB_IMPLEMENTATION',
-      ],
-      'conditions': [
-        ['use_x86_x64_optimizations==1', {
-          'defines': [
-            'ADLER32_SIMD_SSSE3',
-          ],
-          'sources': [
-            'adler32_simd.c',
-            'adler32_simd.h',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'ADLER32_SIMD_SSSE3',
-            ],
-          },
-          'conditions': [
-            ['OS!="win" or clang==1', {
-              'cflags': [
-                '-mssse3',
-              ],
-            }],
-          ],
-        }],
-        ['use_arm_neon_optimizations==1', {
-          'defines': [
-            'ADLER32_SIMD_NEON',
-          ],
-          'dependencies': [
-            ':zlib_force_neon_fpu',
-          ],
-          'sources': [
-            'adler32_simd.c',
-            'adler32_simd.h',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'ADLER32_SIMD_NEON',
-            ],
-          },
-          'conditions': [
-            ['cobalt_config!="debug"', {
-              'variables': {
-                'optimize_target_for_speed': 1
-              },
-            }],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'zlib_arm_crc32',
-      'type': 'static_library',
-      'conditions': [
-        ['use_arm_neon_optimizations==1', {
-          'include_dirs': [
-            '.',
-          ],
-          'dependencies': [
-            ':zlib_force_neon_fpu',
-          ],
-          'sources': [
-            'contrib/optimizations/slide_hash_neon.c',
-            'contrib/optimizations/slide_hash_neon.h',
-          ],
-          'conditions': [
-            # CRC (cyclic redundancy check) instructions are only available for
-            # ARM versions 8 and later.
-            ['OS!="ios" and arm_version>=8', {
-              'defines': [
-                'CRC32_ARMV8_CRC32',
-                'ZLIB_IMPLEMENTATION',
-              ],
-              'sources': [
-                'crc32_simd.c',
-                'crc32_simd.h',
-              ],
-              'direct_dependent_settings': {
-                'defines': [
-                  'CRC32_ARMV8_CRC32',
-                ],
-              },
-              'conditions': [
-                ['OS=="android"', {
-                  'defines': [
-                    'ARMV8_OS_ANDROID',
-                  ],
-                  'dependencies': [
-                    '<(android_ndk_root)/android_tools_ndk.gyp:cpu_features',
-                  ],
-                }],
-                ['OS=="linux"', {
-                  'defines': [
-                    'ARMV8_OS_LINUX',
-                  ],
-                }],
-                ['OS=="fuchsia"', {
-                  'defines': [
-                    'ARMV8_OS_FUCHSIA',
-                  ],
-                }],
-                ['OS=="win"', {
-                  'defines': [
-                    'ARMV8_OS_WINDOWS',
-                  ],
-                }],
-                ['OS!="win" and clang!=1', {
-                  'cflags_c': [
-                    '-march=armv8-a+crc',
-                  ],
-                }],
-                ['cobalt_config!="debug"', {
-                  'variables': {
-                    'optimize_target_for_speed': 1,
-                  },
-                }],
-              ],
-            }],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'zlib_inflate_chunk_simd',
-      'type': 'static_library',
-      'defines': [
-        'ZLIB_IMPLEMENTATION',
-      ],
-      'conditions': [
-        ['use_x86_x64_optimizations==1 or use_arm_neon_optimizations==1', {
-          'include_dirs': [
-            '.',
-          ],
-          'sources': [
-            'contrib/optimizations/chunkcopy.h',
-            'contrib/optimizations/inffast_chunk.c',
-            'contrib/optimizations/inffast_chunk.h',
-            'contrib/optimizations/inflate.c',
-          ],
-        }],
-        ['use_x86_x64_optimizations==1', {
-          'defines': [
-            'INFLATE_CHUNK_SIMD_SSE2',
-          ],
-          'conditions': [
-            ['target_arch=="x64"', {
-              'defines': [
-                'INFLATE_CHUNK_READ_64LE',
-              ],
-            }],
-            ['target_arch=="x86"', {
-              'cflags': [
-                '-msse2',
-              ],
-            }],
-          ],
-        }],
-        ['use_arm_neon_optimizations==1', {
-          'defines': [
-            'INFLATE_CHUNK_SIMD_NEON',
-          ],
-          'dependencies': [
-            ':zlib_force_neon_fpu',
-          ],
-          'conditions': [
-            ['target_arch=="arm64"', {
-              'defines': [
-                'INFLATE_CHUNK_READ_64LE',
-              ],
-            }],
-            ['cobalt_config!="debug"', {
-              'variables': {
-                'optimize_target_for_speed': 1,
-              },
-            }],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'zlib_crc32_simd',
-      'type': 'static_library',
-      'defines': [
-        'ZLIB_IMPLEMENTATION',
-      ],
-      'conditions': [
-        ['use_x86_x64_optimizations==1', {
-          'defines': [
-            'CRC32_SIMD_SSE42_PCLMUL',
-          ],
-          'sources': [
-            'crc32_simd.c',
-            'crc32_simd.h',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'CRC32_SIMD_SSE42_PCLMUL',
-            ],
-          },
-          'conditions': [
-            ['OS!="win" or clang==1', {
-              'cflags': [
-                '-msse4.2',
-                '-mpclmul',
-              ],
-            }],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'zlib_x86_simd',
-      'type': 'static_library',
-      'defines': [
-        'ZLIB_IMPLEMENTATION',
-      ],
-      'conditions': [
-        ['use_x86_x64_optimizations==1', {
-          'sources': [
-            'crc_folding.c',
-            'fill_window_sse.c',
-          ],
-          'conditions': [
-            ['OS!="win" or clang==1', {
-              'cflags': [
-                '-msse4.2',
-                '-mpclmul',
-              ],
-            }],
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'zlib',
-      'type': 'static_library',
-      'conditions': [
-        ['use_system_zlib==0', {
-          'sources': [
-            'adler32.c',
-            'chromeconf.h',
-            'compress.c',
-            'crc32.c',
-            'crc32.h',
-            'deflate.c',
-            'deflate.h',
-            'infback.c',
-            'inffast.c',
-            'inffast.h',
-            'inffixed.h',
-            'inflate.h',
-            'inflate.c',
-            'inftrees.c',
-            'inftrees.h',
-            'trees.c',
-            'trees.h',
-            'uncompr.c',
-            'x86.h',
-            'zconf.h',
-            'zlib.h',
-            'zutil.c',
-            'zutil.h',
-          ],
-          'include_dirs': [
-            '.',
-          ],
-          'all_dependent_settings': {
-            'defines': [
-               # To prevent Zlib ever from redefining const keyword in zconf.h
-              'STDC',
-            ]
-          },
-          'direct_dependent_settings': {
-            'include_dirs': [
-              '.',
-            ],
-          },
-          'defines': [
-            'ZLIB_IMPLEMENTATION',
-          ],
-          'dependencies': [
-            ':zlib_x86_simd',
-          ],
-          'conditions': [
-            ['OS!="win"', {
-              'product_name': 'chrome_zlib',
-            }],
-            ['OS=="android"', {
-              'toolsets': ['target', 'host'],
-            }],
-            ['OS=="starboard"', {
-              'sources!': [
-                'gzclose.c',
-                'gzguts.h',
-                'gzlib.c',
-                'gzread.c',
-                'gzwrite.c',
-              ],
-            }],
-            ['use_x86_x64_optimizations==1', {
-              'defines': [
-                'USE_X86_X64_OPTIMIZATIONS=1',
-              ],
-              'dependencies': [
-                ':zlib_adler32_simd',
-                ':zlib_crc32_simd',
-                ':zlib_inflate_chunk_simd',
-              ],
-              'sources': [
-                'x86.c',
-              ],
-            }, {
-              'sources': [
-                'simd_stub.c',
-              ],
-            }],
-            ['use_arm_neon_optimizations==1', {
-              'defines': [
-                'USE_ARM_NEON_OPTIMIZATIONS=1',
-              ],
-              'dependencies': [
-                ':zlib_adler32_simd',
-                ':zlib_arm_crc32',
-                ':zlib_inflate_chunk_simd',
-              ],
-              'sources': [
-                # slide_hash_neon.h has been moved to zlib_arm_crc32 so that it
-                # can be compiled with ARM NEON support.
-                'arm_features.c',
-                'arm_features.h',
-              ],
-            }, {
-              'sources': [
-                'arm_stub.c',
-              ],
-            }],
-          ],
-        }, {
-          'direct_dependent_settings': {
-            'defines': [
-              'USE_SYSTEM_ZLIB',
-            ],
-          },
-          'defines': [
-            'USE_SYSTEM_ZLIB',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-lz',
-            ],
-          },
-        }],
-      ],
-    },
-    {
-      'target_name': 'minizip',
-      'type': 'static_library',
-      'conditions': [
-        ['use_system_minizip==0', {
-          'sources': [
-            'contrib/minizip/ioapi.c',
-            'contrib/minizip/ioapi.h',
-            'contrib/minizip/iostarboard.c',
-            'contrib/minizip/iostarboard.h',
-            'contrib/minizip/iowin32.c',
-            'contrib/minizip/iowin32.h',
-            'contrib/minizip/unzip.c',
-            'contrib/minizip/unzip.h',
-            'contrib/minizip/zip.c',
-            'contrib/minizip/zip.h',
-          ],
-          'include_dirs': [
-            '.',
-            '../..',
-          ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              '.',
-            ],
-          },
-          'dependencies': [
-            ':zlib',
-          ],
-          'conditions': [
-            ['OS!="win"', {
-              'sources!': [
-                'contrib/minizip/iowin32.c',
-                'contrib/minizip/iowin32.h',
-              ],
-            }],
-            ['OS=="android"', {
-              'toolsets': ['target', 'host'],
-            }],
-          ],
-        }, {
-          'direct_dependent_settings': {
-            'defines': [
-              'USE_SYSTEM_MINIZIP',
-            ],
-          },
-          'defines': [
-            'USE_SYSTEM_MINIZIP',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-lminizip',
-            ],
-          },
-        }],
-        ['OS in ["mac", "ios", "android"] or os_bsd==1', {
-          # Mac, Android and the BSDs don't have fopen64, ftello64, or
-          # fseeko64. We use fopen, ftell, and fseek instead on these
-          # systems.
-          'defines': [
-            'USE_FILE32API',
-          ],
-        }],
-        ['clang==1', {
-          'xcode_settings': {
-            'WARNING_CFLAGS': [
-              # zlib uses `if ((a == b))` for some reason.
-              '-Wno-parentheses-equality',
-            ],
-          },
-          'cflags': [
-            '-Wno-parentheses-equality',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'zip',
-      'type': 'static_library',
-      'sources': [
-        'google/zip.cc',
-        'google/zip.h',
-        'google/zip_internal.cc',
-        'google/zip_internal.h',
-        'google/zip_reader.cc',
-        'google/zip_reader.h',
-        'google/zip_writer.cc',
-        'google/zip_writer.h',
-      ],
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/third_party/zlib/zlib.gyp:minizip',
-      ],
-    },
-    {
-      'target_name': 'zip_unittests',
-      'type': '<(gtest_target_type)',
-      'sources': [
-        'google/compression_utils_unittest.cc',
-        'google/zip_reader_unittest.cc',
-        'google/zip_unittest.cc',
-
-        # Required by the tests but not used elsewhere.
-        'google/compression_utils.cc',
-        'google/compression_utils.h',
-        'google/compression_utils_portable.cc',
-        'google/compression_utils_portable.h',
-      ],
-      'dependencies': [
-        'minizip',
-        'zip',
-        'zlib',
-        '<(DEPTH)/base/base.gyp:test_support_base',
-        '<(DEPTH)/starboard/common/common.gyp:common',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-      ],
-      'includes': ['<(DEPTH)/base/test/test.gypi'],
-      'conditions': [
-        ['cobalt_copy_test_data == 1', {
-          'variables': {
-            'content_test_input_files': [
-              '<(DEPTH)/third_party/zlib/google/test/data',
-            ],
-            # Canonically this should be "third_party/zlib/google/test" to
-            # match the source path, but we put it higher to reduce depth.
-            'content_test_output_subdir': 'zlib',
-          },
-          'includes': [ '<(DEPTH)/starboard/build/copy_test_data.gypi' ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'zip_unittests_deploy',
-      'type': 'none',
-      'dependencies': [
-        'zip_unittests',
-      ],
-      'variables': {
-        'executable_name': 'zip_unittests',
-      },
-      'includes': [ '<(DEPTH)/starboard/build/deploy.gypi' ],
-    },
-  ],
-}
diff --git a/tools/_env.py b/tools/_env.py
deleted file mode 100644
index 6188bb7..0000000
--- a/tools/_env.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2017 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Ask the parent directory to load the project environment."""
-
-from imp import load_source
-from os import path
-import sys
-
-_ENV = path.abspath(path.join(path.dirname(__file__), path.pardir, '_env.py'))
-if not path.exists(_ENV):
-  print '%s: Can\'t find repo root.\nMissing parent: %s' % (__file__, _ENV)
-  sys.exit(1)
-load_source('', _ENV)
diff --git a/tools/gyp-explain.py b/tools/gyp-explain.py
deleted file mode 100755
index 34758ed..0000000
--- a/tools/gyp-explain.py
+++ /dev/null
@@ -1,97 +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.
-
-"""Prints paths between gyp targets.
-"""
-
-import json
-import os
-import sys
-import time
-
-from collections import deque
-
-def usage():
-  print """\
-Usage:
-  tools/gyp-explain.py chrome_dll gtest#
-"""
-
-
-def GetPath(graph, fro, to):
-  """Given a graph in (node -> list of successor nodes) dictionary format,
-  yields all paths from |fro| to |to|, starting with the shortest."""
-  # Storing full paths in the queue is a bit wasteful, but good enough for this.
-  q = deque([(fro, [])])
-  while q:
-    t, path = q.popleft()
-    if t == to:
-      yield path + [t]
-    for d in graph[t]:
-      q.append((d, path + [t]))
-
-
-def MatchNode(graph, substring):
-  """Given a dictionary, returns the key that matches |substring| best. Exits
-  if there's not one single best match."""
-  candidates = []
-  for target in graph:
-    if substring in target:
-      candidates.append(target)
-
-  if not candidates:
-    print 'No targets match "%s"' % substring
-    sys.exit(1)
-  if len(candidates) > 1:
-    print 'More than one target matches "%s": %s' % (
-        substring, ' '.join(candidates))
-    sys.exit(1)
-  return candidates[0]
-
-
-def Main(argv):
-  if sys.platform in ['win32', 'cygwin']:
-    print 'The dump_dependency_json gyp generator required for gyp-explain.py'
-    print 'does not support Windows.'
-    sys.exit(1)
-
-  # Check that dump.json exists and that it's not too old.
-  dump_json_dirty = False
-  try:
-    st = os.stat('dump.json')
-    file_age_s = time.time() - st.st_mtime
-    if file_age_s > 2 * 60 * 60:
-      print 'dump.json is more than 2 hours old.'
-      dump_json_dirty = True
-  except OSError:
-    print 'dump.json not found.'
-    dump_json_dirty = True
-
-  if dump_json_dirty:
-    print 'Run'
-    print '    GYP_GENERATORS=dump_dependency_json build/gyp_chromium'
-    print 'first, then try again.'
-    sys.exit(1)
-
-  g = json.load(open('dump.json'))
-
-  if len(argv) != 3:
-    usage()
-    sys.exit(1)
-
-  fro = MatchNode(g, argv[1])
-  to = MatchNode(g, argv[2])
-
-  paths = list(GetPath(g, fro, to))
-  if len(paths) > 0:
-    print 'These paths lead from %s to %s:' % (fro, to)
-    for path in paths:
-      print ' -> '.join(path)
-  else:
-    print 'No paths found from %s to %s.' % (fro, to)
-
-
-if __name__ == '__main__':
-  Main(sys.argv)
diff --git a/tools/gyp/.gitignore b/tools/gyp/.gitignore
deleted file mode 100644
index 3c9cb64..0000000
--- a/tools/gyp/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*.pyc
-*~
-.*.sw?
-.DS_Store
diff --git a/tools/gyp/AUTHORS b/tools/gyp/AUTHORS
deleted file mode 100644
index 6db82b9..0000000
--- a/tools/gyp/AUTHORS
+++ /dev/null
@@ -1,6 +0,0 @@
-# Names should be added to this file like so:
-# Name or Organization <email address>
-
-Google Inc.
-Steven Knight <knight@baldmt.com>
-Ryan Norton <rnorton10@gmail.com>
diff --git a/tools/gyp/LICENSE b/tools/gyp/LICENSE
deleted file mode 100644
index ab6b011..0000000
--- a/tools/gyp/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 Google Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-   * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-   * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-   * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/tools/gyp/MANIFEST b/tools/gyp/MANIFEST
deleted file mode 100644
index 925ecc1..0000000
--- a/tools/gyp/MANIFEST
+++ /dev/null
@@ -1,21 +0,0 @@
-setup.py
-gyp
-LICENSE
-AUTHORS
-pylib/gyp/MSVSNew.py
-pylib/gyp/MSVSProject.py
-pylib/gyp/MSVSToolFile.py
-pylib/gyp/MSVSUserFile.py
-pylib/gyp/MSVSVersion.py
-pylib/gyp/SCons.py
-pylib/gyp/__init__.py
-pylib/gyp/common.py
-pylib/gyp/input.py
-pylib/gyp/xcodeproj_file.py
-pylib/gyp/generator/__init__.py
-pylib/gyp/generator/gypd.py
-pylib/gyp/generator/gypsh.py
-pylib/gyp/generator/make.py
-pylib/gyp/generator/msvs.py
-pylib/gyp/generator/scons.py
-pylib/gyp/generator/xcode.py
diff --git a/tools/gyp/OWNERS b/tools/gyp/OWNERS
deleted file mode 100644
index 72e8ffc..0000000
--- a/tools/gyp/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-*
diff --git a/tools/gyp/buildbot/buildbot_run.py b/tools/gyp/buildbot/buildbot_run.py
deleted file mode 100755
index 57fdb65..0000000
--- a/tools/gyp/buildbot/buildbot_run.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-"""Argument-less script to select what to run on the buildbots."""
-
-
-import os
-import shutil
-import subprocess
-import sys
-
-
-if sys.platform in ['win32', 'cygwin']:
-  EXE_SUFFIX = '.exe'
-else:
-  EXE_SUFFIX = ''
-
-
-BUILDBOT_DIR = os.path.dirname(os.path.abspath(__file__))
-TRUNK_DIR = os.path.dirname(BUILDBOT_DIR)
-ROOT_DIR = os.path.dirname(TRUNK_DIR)
-OUT_DIR = os.path.join(TRUNK_DIR, 'out')
-
-
-def GypTestFormat(title, format=None, msvs_version=None):
-  """Run the gyp tests for a given format, emitting annotator tags.
-
-  See annotator docs at:
-    https://sites.google.com/a/chromium.org/dev/developers/testing/chromium-build-infrastructure/buildbot-annotations
-  Args:
-    format: gyp format to test.
-  Returns:
-    0 for sucesss, 1 for failure.
-  """
-  if not format:
-    format = title
-
-  print '@@@BUILD_STEP ' + title + '@@@'
-  sys.stdout.flush()
-  env = os.environ.copy()
-  # TODO(bradnelson): remove this when this issue is resolved:
-  #     http://code.google.com/p/chromium/issues/detail?id=108251
-  if format == 'ninja':
-    env['NOGOLD'] = '1'
-  if msvs_version:
-    env['GYP_MSVS_VERSION'] = msvs_version
-  retcode = subprocess.call(' '.join(
-      [sys.executable, 'trunk/gyptest.py',
-       '--all',
-       '--passed',
-       '--format', format,
-       '--chdir', 'trunk',
-       '--path', '../scons']),
-      cwd=ROOT_DIR, env=env, shell=True)
-  if retcode:
-    # Emit failure tag, and keep going.
-    print '@@@STEP_FAILURE@@@'
-    return 1
-  return 0
-
-
-def GypBuild():
-  # Dump out/ directory.
-  print '@@@BUILD_STEP cleanup@@@'
-  print 'Removing %s...' % OUT_DIR
-  shutil.rmtree(OUT_DIR, ignore_errors=True)
-  print 'Done.'
-
-  retcode = 0
-  if sys.platform.startswith('linux'):
-    retcode += GypTestFormat('ninja')
-    retcode += GypTestFormat('scons')
-    retcode += GypTestFormat('make')
-  elif sys.platform == 'darwin':
-    retcode += GypTestFormat('ninja')
-    retcode += GypTestFormat('xcode')
-    retcode += GypTestFormat('make')
-  elif sys.platform == 'win32':
-    retcode += GypTestFormat('ninja')
-    retcode += GypTestFormat('msvs-2008', format='msvs', msvs_version='2008')
-    if os.environ['BUILDBOT_BUILDERNAME'] == 'gyp-win64':
-      retcode += GypTestFormat('msvs-2010', format='msvs', msvs_version='2010')
-  else:
-    raise Exception('Unknown platform')
-  if retcode:
-    # TODO(bradnelson): once the annotator supports a postscript (section for
-    #     after the build proper that could be used for cumulative failures),
-    #     use that instead of this. This isolates the final return value so
-    #     that it isn't misattributed to the last stage.
-    print '@@@BUILD_STEP failures@@@'
-    sys.exit(retcode)
-
-
-if __name__ == '__main__':
-  GypBuild()
diff --git a/tools/gyp/gyp b/tools/gyp/gyp
deleted file mode 100755
index d52e711..0000000
--- a/tools/gyp/gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2009 Google Inc. 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
-
-# TODO(mark): sys.path manipulation is some temporary testing stuff.
-try:
-  import gyp
-except ImportError, e:
-  import os.path
-  sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), 'pylib'))
-  import gyp
-
-if __name__ == '__main__':
-  sys.exit(gyp.main(sys.argv[1:]))
diff --git a/tools/gyp/gyp.bat b/tools/gyp/gyp.bat
deleted file mode 100755
index 90fbc6d..0000000
--- a/tools/gyp/gyp.bat
+++ /dev/null
@@ -1,5 +0,0 @@
-@rem Copyright (c) 2009 Google Inc. All rights reserved.

-@rem Use of this source code is governed by a BSD-style license that can be

-@rem found in the LICENSE file.

-

-@python "%~dp0/gyp" %*

diff --git a/tools/gyp/gyp_dummy.c b/tools/gyp/gyp_dummy.c
deleted file mode 100644
index fb55bbc..0000000
--- a/tools/gyp/gyp_dummy.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Copyright (c) 2009 Google Inc. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-int main() {
-  return 0;
-}
diff --git a/tools/gyp/gyptest.py b/tools/gyp/gyptest.py
deleted file mode 100755
index 6c6b009..0000000
--- a/tools/gyp/gyptest.py
+++ /dev/null
@@ -1,266 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-__doc__ = """
-gyptest.py -- test runner for GYP tests.
-"""
-
-import os
-import optparse
-import subprocess
-import sys
-
-class CommandRunner:
-  """
-  Executor class for commands, including "commands" implemented by
-  Python functions.
-  """
-  verbose = True
-  active = True
-
-  def __init__(self, dictionary={}):
-    self.subst_dictionary(dictionary)
-
-  def subst_dictionary(self, dictionary):
-    self._subst_dictionary = dictionary
-
-  def subst(self, string, dictionary=None):
-    """
-    Substitutes (via the format operator) the values in the specified
-    dictionary into the specified command.
-
-    The command can be an (action, string) tuple.  In all cases, we
-    perform substitution on strings and don't worry if something isn't
-    a string.  (It's probably a Python function to be executed.)
-    """
-    if dictionary is None:
-      dictionary = self._subst_dictionary
-    if dictionary:
-      try:
-        string = string % dictionary
-      except TypeError:
-        pass
-    return string
-
-  def display(self, command, stdout=None, stderr=None):
-    if not self.verbose:
-      return
-    if type(command) == type(()):
-      func = command[0]
-      args = command[1:]
-      s = '%s(%s)' % (func.__name__, ', '.join(map(repr, args)))
-    if type(command) == type([]):
-      # TODO:  quote arguments containing spaces
-      # TODO:  handle meta characters?
-      s = ' '.join(command)
-    else:
-      s = self.subst(command)
-    if not s.endswith('\n'):
-      s += '\n'
-    sys.stdout.write(s)
-    sys.stdout.flush()
-
-  def execute(self, command, stdout=None, stderr=None):
-    """
-    Executes a single command.
-    """
-    if not self.active:
-      return 0
-    if type(command) == type(''):
-      command = self.subst(command)
-      cmdargs = shlex.split(command)
-      if cmdargs[0] == 'cd':
-         command = (os.chdir,) + tuple(cmdargs[1:])
-    if type(command) == type(()):
-      func = command[0]
-      args = command[1:]
-      return func(*args)
-    else:
-      if stdout is sys.stdout:
-        # Same as passing sys.stdout, except python2.4 doesn't fail on it.
-        subout = None
-      else:
-        # Open pipe for anything else so Popen works on python2.4.
-        subout = subprocess.PIPE
-      if stderr is sys.stderr:
-        # Same as passing sys.stderr, except python2.4 doesn't fail on it.
-        suberr = None
-      elif stderr is None:
-        # Merge with stdout if stderr isn't specified.
-        suberr = subprocess.STDOUT
-      else:
-        # Open pipe for anything else so Popen works on python2.4.
-        suberr = subprocess.PIPE
-      p = subprocess.Popen(command,
-                           shell=(sys.platform == 'win32'),
-                           stdout=subout,
-                           stderr=suberr)
-      p.wait()
-      if stdout is None:
-        self.stdout = p.stdout.read()
-      elif stdout is not sys.stdout:
-        stdout.write(p.stdout.read())
-      if stderr not in (None, sys.stderr):
-        stderr.write(p.stderr.read())
-      return p.returncode
-
-  def run(self, command, display=None, stdout=None, stderr=None):
-    """
-    Runs a single command, displaying it first.
-    """
-    if display is None:
-      display = command
-    self.display(display)
-    return self.execute(command, stdout, stderr)
-
-
-class Unbuffered:
-  def __init__(self, fp):
-    self.fp = fp
-  def write(self, arg):
-    self.fp.write(arg)
-    self.fp.flush()
-  def __getattr__(self, attr):
-    return getattr(self.fp, attr)
-
-sys.stdout = Unbuffered(sys.stdout)
-sys.stderr = Unbuffered(sys.stderr)
-
-
-def find_all_gyptest_files(directory):
-    result = []
-    for root, dirs, files in os.walk(directory):
-      if '.svn' in dirs:
-        dirs.remove('.svn')
-      result.extend([ os.path.join(root, f) for f in files
-                     if f.startswith('gyptest') and f.endswith('.py') ])
-    result.sort()
-    return result
-
-
-def main(argv=None):
-  if argv is None:
-    argv = sys.argv
-
-  usage = "gyptest.py [-ahlnq] [-f formats] [test ...]"
-  parser = optparse.OptionParser(usage=usage)
-  parser.add_option("-a", "--all", action="store_true",
-            help="run all tests")
-  parser.add_option("-C", "--chdir", action="store", default=None,
-            help="chdir to the specified directory")
-  parser.add_option("-f", "--format", action="store", default='',
-            help="run tests with the specified formats")
-  parser.add_option("-G", '--gyp_option', action="append", default=[],
-            help="Add -G options to the gyp command line")
-  parser.add_option("-l", "--list", action="store_true",
-            help="list available tests and exit")
-  parser.add_option("-n", "--no-exec", action="store_true",
-            help="no execute, just print the command line")
-  parser.add_option("--passed", action="store_true",
-            help="report passed tests")
-  parser.add_option("--path", action="append", default=[],
-            help="additional $PATH directory")
-  parser.add_option("-q", "--quiet", action="store_true",
-            help="quiet, don't print test command lines")
-  opts, args = parser.parse_args(argv[1:])
-
-  if opts.chdir:
-    os.chdir(opts.chdir)
-
-  if opts.path:
-    extra_path = [os.path.abspath(p) for p in opts.path]
-    extra_path = os.pathsep.join(extra_path)
-    os.environ['PATH'] += os.pathsep + extra_path
-
-  if not args:
-    if not opts.all:
-      sys.stderr.write('Specify -a to get all tests.\n')
-      return 1
-    args = ['test']
-
-  tests = []
-  for arg in args:
-    if os.path.isdir(arg):
-      tests.extend(find_all_gyptest_files(os.path.normpath(arg)))
-    else:
-      tests.append(arg)
-
-  if opts.list:
-    for test in tests:
-      print test
-    sys.exit(0)
-
-  CommandRunner.verbose = not opts.quiet
-  CommandRunner.active = not opts.no_exec
-  cr = CommandRunner()
-
-  os.environ['PYTHONPATH'] = os.path.abspath('test/lib')
-  if not opts.quiet:
-    sys.stdout.write('PYTHONPATH=%s\n' % os.environ['PYTHONPATH'])
-
-  passed = []
-  failed = []
-  no_result = []
-
-  if opts.format:
-    format_list = opts.format.split(',')
-  else:
-    # TODO:  not duplicate this mapping from pylib/gyp/__init__.py
-    format_list = {
-      'freebsd7': ['make'],
-      'freebsd8': ['make'],
-      'cygwin':   ['msvs'],
-      'win32':    ['msvs', 'ninja'],
-      'linux2':   ['make', 'ninja'],
-      'linux3':   ['make', 'ninja'],
-      'darwin':   ['make', 'ninja', 'xcode'],
-    }[sys.platform]
-
-  for format in format_list:
-    os.environ['TESTGYP_FORMAT'] = format
-    if not opts.quiet:
-      sys.stdout.write('TESTGYP_FORMAT=%s\n' % format)
-
-    gyp_options = []
-    for option in opts.gyp_option:
-      gyp_options += ['-G', option]
-    if gyp_options and not opts.quiet:
-      sys.stdout.write('Extra Gyp options: %s\n' % gyp_options)
-
-    for test in tests:
-      status = cr.run([sys.executable, test] + gyp_options,
-                      stdout=sys.stdout,
-                      stderr=sys.stderr)
-      if status == 2:
-        no_result.append(test)
-      elif status:
-        failed.append(test)
-      else:
-        passed.append(test)
-
-  if not opts.quiet:
-    def report(description, tests):
-      if tests:
-        if len(tests) == 1:
-          sys.stdout.write("\n%s the following test:\n" % description)
-        else:
-          fmt = "\n%s the following %d tests:\n"
-          sys.stdout.write(fmt % (description, len(tests)))
-        sys.stdout.write("\t" + "\n\t".join(tests) + "\n")
-
-    if opts.passed:
-      report("Passed", passed)
-    report("Failed", failed)
-    report("No result from", no_result)
-
-  if failed:
-    return 1
-  else:
-    return 0
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/tools/gyp/pylib/gyp/MSVSNew.py b/tools/gyp/pylib/gyp/MSVSNew.py
deleted file mode 100644
index 253fe61..0000000
--- a/tools/gyp/pylib/gyp/MSVSNew.py
+++ /dev/null
@@ -1,339 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""New implementation of Visual Studio project generation for SCons."""
-
-import os
-import random
-
-import gyp.common
-
-# hashlib is supplied as of Python 2.5 as the replacement interface for md5
-# and other secure hashes.  In 2.6, md5 is deprecated.  Import hashlib if
-# available, avoiding a deprecation warning under 2.6.  Import md5 otherwise,
-# preserving 2.4 compatibility.
-try:
-  import hashlib
-  _new_md5 = hashlib.md5
-except ImportError:
-  import md5
-  _new_md5 = md5.new
-
-
-# Initialize random number generator
-random.seed()
-
-# GUIDs for project types
-ENTRY_TYPE_GUIDS = {
-    'project': '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}',
-    'folder': '{2150E333-8FDC-42A3-9474-1A3956D46DE8}',
-}
-
-#------------------------------------------------------------------------------
-# Helper functions
-
-
-def MakeGuid(name, seed='msvs_new'):
-  """Returns a GUID for the specified target name.
-
-  Args:
-    name: Target name.
-    seed: Seed for MD5 hash.
-  Returns:
-    A GUID-line string calculated from the name and seed.
-
-  This generates something which looks like a GUID, but depends only on the
-  name and seed.  This means the same name/seed will always generate the same
-  GUID, so that projects and solutions which refer to each other can explicitly
-  determine the GUID to refer to explicitly.  It also means that the GUID will
-  not change when the project for a target is rebuilt.
-  """
-  # Calculate a MD5 signature for the seed and name.
-  d = _new_md5(str(seed) + str(name)).hexdigest().upper()
-  # Convert most of the signature to GUID form (discard the rest)
-  guid = ('{' + d[:8] + '-' + d[8:12] + '-' + d[12:16] + '-' + d[16:20]
-          + '-' + d[20:32] + '}')
-  return guid
-
-#------------------------------------------------------------------------------
-
-
-class MSVSSolutionEntry(object):
-  def __cmp__(self, other):
-    # Sort by name then guid (so things are in order on vs2008).
-    return cmp((self.name, self.get_guid()), (other.name, other.get_guid()))
-
-
-class MSVSFolder(MSVSSolutionEntry):
-  """Folder in a Visual Studio project or solution."""
-
-  def __init__(self, path, name = None, entries = None,
-               guid = None, items = None):
-    """Initializes the folder.
-
-    Args:
-      path: Full path to the folder.
-      name: Name of the folder.
-      entries: List of folder entries to nest inside this folder.  May contain
-          Folder or Project objects.  May be None, if the folder is empty.
-      guid: GUID to use for folder, if not None.
-      items: List of solution items to include in the folder project.  May be
-          None, if the folder does not directly contain items.
-    """
-    if name:
-      self.name = name
-    else:
-      # Use last layer.
-      self.name = os.path.basename(path)
-
-    self.path = path
-    self.guid = guid
-
-    # Copy passed lists (or set to empty lists)
-    self.entries = sorted(list(entries or []))
-    self.items = list(items or [])
-
-    self.entry_type_guid = ENTRY_TYPE_GUIDS['folder']
-
-  def get_guid(self):
-    if self.guid is None:
-      # Use consistent guids for folders (so things don't regenerate).
-      self.guid = MakeGuid(self.path, seed='msvs_folder')
-    return self.guid
-
-
-#------------------------------------------------------------------------------
-
-
-class MSVSProject(MSVSSolutionEntry):
-  """Visual Studio project."""
-
-  def __init__(self, path, name = None, dependencies = None, guid = None,
-               spec = None, build_file = None, config_platform_overrides = None,
-               fixpath_prefix = None):
-    """Initializes the project.
-
-    Args:
-      path: Absolute path to the project file.
-      name: Name of project.  If None, the name will be the same as the base
-          name of the project file.
-      dependencies: List of other Project objects this project is dependent
-          upon, if not None.
-      guid: GUID to use for project, if not None.
-      spec: Dictionary specifying how to build this project.
-      build_file: Filename of the .gyp file that the vcproj file comes from.
-      config_platform_overrides: optional dict of configuration platforms to
-          used in place of the default for this target.
-      fixpath_prefix: the path used to adjust the behavior of _fixpath
-    """
-    self.path = path
-    self.guid = guid
-    self.spec = spec
-    self.build_file = build_file
-    # Use project filename if name not specified
-    self.name = name or os.path.splitext(os.path.basename(path))[0]
-
-    # Copy passed lists (or set to empty lists)
-    self.dependencies = list(dependencies or [])
-
-    self.entry_type_guid = ENTRY_TYPE_GUIDS['project']
-
-    if config_platform_overrides:
-      self.config_platform_overrides = config_platform_overrides
-    else:
-      self.config_platform_overrides = {}
-    self.fixpath_prefix = fixpath_prefix
-    self.msbuild_toolset = None
-
-  def set_dependencies(self, dependencies):
-    self.dependencies = list(dependencies or [])
-
-  def get_guid(self):
-    if self.guid is None:
-      # Set GUID from path
-      # TODO(rspangler): This is fragile.
-      # 1. We can't just use the project filename sans path, since there could
-      #    be multiple projects with the same base name (for example,
-      #    foo/unittest.vcproj and bar/unittest.vcproj).
-      # 2. The path needs to be relative to $SOURCE_ROOT, so that the project
-      #    GUID is the same whether it's included from base/base.sln or
-      #    foo/bar/baz/baz.sln.
-      # 3. The GUID needs to be the same each time this builder is invoked, so
-      #    that we don't need to rebuild the solution when the project changes.
-      # 4. We should be able to handle pre-built project files by reading the
-      #    GUID from the files.
-      self.guid = MakeGuid(self.name)
-    return self.guid
-
-  def set_msbuild_toolset(self, msbuild_toolset):
-    self.msbuild_toolset = msbuild_toolset
-
-#------------------------------------------------------------------------------
-
-
-class MSVSSolution:
-  """Visual Studio solution."""
-
-  def __init__(self, path, version, entries=None, variants=None,
-               websiteProperties=True):
-    """Initializes the solution.
-
-    Args:
-      path: Path to solution file.
-      version: Format version to emit.
-      entries: List of entries in solution.  May contain Folder or Project
-          objects.  May be None, if the folder is empty.
-      variants: List of build variant strings.  If none, a default list will
-          be used.
-      websiteProperties: Flag to decide if the website properties section
-          is generated.
-    """
-    self.path = path
-    self.websiteProperties = websiteProperties
-    self.version = version
-
-    # Copy passed lists (or set to empty lists)
-    self.entries = list(entries or [])
-
-    if variants:
-      # Copy passed list
-      self.variants = variants[:]
-    else:
-      # Use default
-      self.variants = ['Debug|Win32', 'Release|Win32']
-    # TODO(rspangler): Need to be able to handle a mapping of solution config
-    # to project config.  Should we be able to handle variants being a dict,
-    # or add a separate variant_map variable?  If it's a dict, we can't
-    # guarantee the order of variants since dict keys aren't ordered.
-
-
-    # TODO(rspangler): Automatically write to disk for now; should delay until
-    # node-evaluation time.
-    self.Write()
-
-
-  def Write(self, writer=gyp.common.WriteOnDiff):
-    """Writes the solution file to disk.
-
-    Raises:
-      IndexError: An entry appears multiple times.
-    """
-    # Walk the entry tree and collect all the folders and projects.
-    all_entries = set()
-    entries_to_check = self.entries[:]
-    while entries_to_check:
-      e = entries_to_check.pop(0)
-
-      # If this entry has been visited, nothing to do.
-      if e in all_entries:
-        continue
-
-      all_entries.add(e)
-
-      # If this is a folder, check its entries too.
-      if isinstance(e, MSVSFolder):
-        entries_to_check += e.entries
-
-    all_entries = sorted(all_entries)
-
-    # Open file and print header
-    f = writer(self.path)
-    f.write('Microsoft Visual Studio Solution File, '
-            'Format Version %s\r\n' % self.version.SolutionVersion())
-    f.write('# %s\r\n' % self.version.Description())
-
-    # Project entries
-    sln_root = os.path.split(self.path)[0]
-    for e in all_entries:
-      relative_path = gyp.common.RelativePath(e.path, sln_root)
-      # msbuild does not accept an empty folder_name.
-      # use '.' in case relative_path is empty.
-      folder_name = relative_path.replace('/', '\\') or '.'
-      f.write('Project("%s") = "%s", "%s", "%s"\r\n' % (
-          e.entry_type_guid,          # Entry type GUID
-          e.name,                     # Folder name
-          folder_name,                # Folder name (again)
-          e.get_guid(),               # Entry GUID
-      ))
-
-      # TODO(rspangler): Need a way to configure this stuff
-      if self.websiteProperties:
-        f.write('\tProjectSection(WebsiteProperties) = preProject\r\n'
-                '\t\tDebug.AspNetCompiler.Debug = "True"\r\n'
-                '\t\tRelease.AspNetCompiler.Debug = "False"\r\n'
-                '\tEndProjectSection\r\n')
-
-      if isinstance(e, MSVSFolder):
-        if e.items:
-          f.write('\tProjectSection(SolutionItems) = preProject\r\n')
-          for i in e.items:
-            f.write('\t\t%s = %s\r\n' % (i, i))
-          f.write('\tEndProjectSection\r\n')
-
-      if isinstance(e, MSVSProject):
-        if e.dependencies:
-          f.write('\tProjectSection(ProjectDependencies) = postProject\r\n')
-          for d in e.dependencies:
-            f.write('\t\t%s = %s\r\n' % (d.get_guid(), d.get_guid()))
-          f.write('\tEndProjectSection\r\n')
-
-      f.write('EndProject\r\n')
-
-    # Global section
-    f.write('Global\r\n')
-
-    # Configurations (variants)
-    f.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n')
-    for v in self.variants:
-      f.write('\t\t%s = %s\r\n' % (v, v))
-    f.write('\tEndGlobalSection\r\n')
-
-    # Sort config guids for easier diffing of solution changes.
-    config_guids = []
-    config_guids_overrides = {}
-    for e in all_entries:
-      if isinstance(e, MSVSProject):
-        config_guids.append(e.get_guid())
-        config_guids_overrides[e.get_guid()] = e.config_platform_overrides
-    config_guids.sort()
-
-    f.write('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n')
-    for g in config_guids:
-      for v in self.variants:
-        nv = config_guids_overrides[g].get(v, v)
-        # Pick which project configuration to build for this solution
-        # configuration.
-        f.write('\t\t%s.%s.ActiveCfg = %s\r\n' % (
-            g,              # Project GUID
-            v,              # Solution build configuration
-            nv,             # Project build config for that solution config
-        ))
-
-        # Enable project in this solution configuration.
-        f.write('\t\t%s.%s.Build.0 = %s\r\n' % (
-            g,              # Project GUID
-            v,              # Solution build configuration
-            nv,             # Project build config for that solution config
-        ))
-    f.write('\tEndGlobalSection\r\n')
-
-    # TODO(rspangler): Should be able to configure this stuff too (though I've
-    # never seen this be any different)
-    f.write('\tGlobalSection(SolutionProperties) = preSolution\r\n')
-    f.write('\t\tHideSolutionNode = FALSE\r\n')
-    f.write('\tEndGlobalSection\r\n')
-
-    # Folder mappings
-    # TODO(rspangler): Should omit this section if there are no folders
-    f.write('\tGlobalSection(NestedProjects) = preSolution\r\n')
-    for e in all_entries:
-      if not isinstance(e, MSVSFolder):
-        continue        # Does not apply to projects, only folders
-      for subentry in e.entries:
-        f.write('\t\t%s = %s\r\n' % (subentry.get_guid(), e.get_guid()))
-    f.write('\tEndGlobalSection\r\n')
-
-    f.write('EndGlobal\r\n')
-
-    f.close()
diff --git a/tools/gyp/pylib/gyp/MSVSProject.py b/tools/gyp/pylib/gyp/MSVSProject.py
deleted file mode 100644
index db1ceed..0000000
--- a/tools/gyp/pylib/gyp/MSVSProject.py
+++ /dev/null
@@ -1,208 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Visual Studio project reader/writer."""
-
-import gyp.common
-import gyp.easy_xml as easy_xml
-
-#------------------------------------------------------------------------------
-
-
-class Tool(object):
-  """Visual Studio tool."""
-
-  def __init__(self, name, attrs=None):
-    """Initializes the tool.
-
-    Args:
-      name: Tool name.
-      attrs: Dict of tool attributes; may be None.
-    """
-    self._attrs = attrs or {}
-    self._attrs['Name'] = name
-
-  def _GetSpecification(self):
-    """Creates an element for the tool.
-
-    Returns:
-      A new xml.dom.Element for the tool.
-    """
-    return ['Tool', self._attrs]
-
-class Filter(object):
-  """Visual Studio filter - that is, a virtual folder."""
-
-  def __init__(self, name, contents=None):
-    """Initializes the folder.
-
-    Args:
-      name: Filter (folder) name.
-      contents: List of filenames and/or Filter objects contained.
-    """
-    self.name = name
-    self.contents = list(contents or [])
-
-
-#------------------------------------------------------------------------------
-
-
-class Writer(object):
-  """Visual Studio XML project writer."""
-
-  def __init__(self, project_path, version, name, guid=None, platforms=None):
-    """Initializes the project.
-
-    Args:
-      project_path: Path to the project file.
-      version: Format version to emit.
-      name: Name of the project.
-      guid: GUID to use for project, if not None.
-      platforms: Array of string, the supported platforms.  If null, ['Win32']
-    """
-    self.project_path = project_path
-    self.version = version
-    self.name = name
-    self.guid = guid
-
-    # Default to Win32 for platforms.
-    if not platforms:
-      platforms = ['Win32']
-
-    # Initialize the specifications of the various sections.
-    self.platform_section = ['Platforms']
-    for platform in platforms:
-      self.platform_section.append(['Platform', {'Name': platform}])
-    self.tool_files_section = ['ToolFiles']
-    self.configurations_section = ['Configurations']
-    self.files_section = ['Files']
-
-    # Keep a dict keyed on filename to speed up access.
-    self.files_dict = dict()
-
-  def AddToolFile(self, path):
-    """Adds a tool file to the project.
-
-    Args:
-      path: Relative path from project to tool file.
-    """
-    self.tool_files_section.append(['ToolFile', {'RelativePath': path}])
-
-  def _GetSpecForConfiguration(self, config_type, config_name, attrs, tools):
-    """Returns the specification for a configuration.
-
-    Args:
-      config_type: Type of configuration node.
-      config_name: Configuration name.
-      attrs: Dict of configuration attributes; may be None.
-      tools: List of tools (strings or Tool objects); may be None.
-    Returns:
-    """
-    # Handle defaults
-    if not attrs:
-      attrs = {}
-    if not tools:
-      tools = []
-
-    # Add configuration node and its attributes
-    node_attrs = attrs.copy()
-    node_attrs['Name'] = config_name
-    specification = [config_type, node_attrs]
-
-    # Add tool nodes and their attributes
-    if tools:
-      for t in tools:
-        if isinstance(t, Tool):
-          specification.append(t._GetSpecification())
-        else:
-          specification.append(Tool(t)._GetSpecification())
-    return specification
-
-
-  def AddConfig(self, name, attrs=None, tools=None):
-    """Adds a configuration to the project.
-
-    Args:
-      name: Configuration name.
-      attrs: Dict of configuration attributes; may be None.
-      tools: List of tools (strings or Tool objects); may be None.
-    """
-    spec = self._GetSpecForConfiguration('Configuration', name, attrs, tools)
-    self.configurations_section.append(spec)
-
-  def _AddFilesToNode(self, parent, files):
-    """Adds files and/or filters to the parent node.
-
-    Args:
-      parent: Destination node
-      files: A list of Filter objects and/or relative paths to files.
-
-    Will call itself recursively, if the files list contains Filter objects.
-    """
-    for f in files:
-      if isinstance(f, Filter):
-        node = ['Filter', {'Name': f.name}]
-        self._AddFilesToNode(node, f.contents)
-      else:
-        node = ['File', {'RelativePath': f}]
-        self.files_dict[f] = node
-      parent.append(node)
-
-  def AddFiles(self, files):
-    """Adds files to the project.
-
-    Args:
-      files: A list of Filter objects and/or relative paths to files.
-
-    This makes a copy of the file/filter tree at the time of this call.  If you
-    later add files to a Filter object which was passed into a previous call
-    to AddFiles(), it will not be reflected in this project.
-    """
-    self._AddFilesToNode(self.files_section, files)
-    # TODO(rspangler) This also doesn't handle adding files to an existing
-    # filter.  That is, it doesn't merge the trees.
-
-  def AddFileConfig(self, path, config, attrs=None, tools=None):
-    """Adds a configuration to a file.
-
-    Args:
-      path: Relative path to the file.
-      config: Name of configuration to add.
-      attrs: Dict of configuration attributes; may be None.
-      tools: List of tools (strings or Tool objects); may be None.
-
-    Raises:
-      ValueError: Relative path does not match any file added via AddFiles().
-    """
-    # Find the file node with the right relative path
-    parent = self.files_dict.get(path)
-    if not parent:
-      raise ValueError('AddFileConfig: file "%s" not in project.' % path)
-
-    # Add the config to the file node
-    spec = self._GetSpecForConfiguration('FileConfiguration', config, attrs,
-                                         tools)
-    parent.append(spec)
-
-  def WriteIfChanged(self):
-    """Writes the project file."""
-    # First create XML content definition
-    content = [
-        'VisualStudioProject',
-        {'ProjectType': 'Visual C++',
-         'Version': self.version.ProjectVersion(),
-         'Name': self.name,
-         'ProjectGUID': self.guid,
-         'RootNamespace': self.name,
-         'Keyword': 'Win32Proj'
-        },
-        self.platform_section,
-        self.tool_files_section,
-        self.configurations_section,
-        ['References'],  # empty section
-        self.files_section,
-        ['Globals']  # empty section
-    ]
-    easy_xml.WriteXmlIfChanged(content, self.project_path,
-                               encoding="Windows-1252")
diff --git a/tools/gyp/pylib/gyp/MSVSSettings.py b/tools/gyp/pylib/gyp/MSVSSettings.py
deleted file mode 100644
index 8526389..0000000
--- a/tools/gyp/pylib/gyp/MSVSSettings.py
+++ /dev/null
@@ -1,1045 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Code to validate and convert settings of the Microsoft build tools.
-
-This file contains code to validate and convert settings of the Microsoft
-build tools.  The function ConvertToMSBuildSettings(), ValidateMSVSSettings(),
-and ValidateMSBuildSettings() are the entry points.
-
-This file was created by comparing the projects created by Visual Studio 2008
-and Visual Studio 2010 for all available settings through the user interface.
-The MSBuild schemas were also considered.  They are typically found in the
-MSBuild install directory, e.g. c:\Program Files (x86)\MSBuild
-"""
-
-import sys
-import re
-
-# Dictionaries of settings validators. The key is the tool name, the value is
-# a dictionary mapping setting names to validation functions.
-_msvs_validators = {}
-_msbuild_validators = {}
-
-
-# A dictionary of settings converters. The key is the tool name, the value is
-# a dictionary mapping setting names to conversion functions.
-_msvs_to_msbuild_converters = {}
-
-
-# Tool name mapping from MSVS to MSBuild.
-_msbuild_name_of_tool = {}
-
-
-class _Tool(object):
-  """Represents a tool used by MSVS or MSBuild.
-
-  Attributes:
-      msvs_name: The name of the tool in MSVS.
-      msbuild_name: The name of the tool in MSBuild.
-  """
-
-  def __init__(self, msvs_name, msbuild_name):
-    self.msvs_name = msvs_name
-    self.msbuild_name = msbuild_name
-
-
-def _AddTool(tool):
-  """Adds a tool to the four dictionaries used to process settings.
-
-  This only defines the tool.  Each setting also needs to be added.
-
-  Args:
-    tool: The _Tool object to be added.
-  """
-  _msvs_validators[tool.msvs_name] = {}
-  _msbuild_validators[tool.msbuild_name] = {}
-  _msvs_to_msbuild_converters[tool.msvs_name] = {}
-  _msbuild_name_of_tool[tool.msvs_name] = tool.msbuild_name
-
-
-def _GetMSBuildToolSettings(msbuild_settings, tool):
-  """Returns an MSBuild tool dictionary.  Creates it if needed."""
-  return msbuild_settings.setdefault(tool.msbuild_name, {})
-
-
-class _Type(object):
-  """Type of settings (Base class)."""
-
-  def ValidateMSVS(self, value):
-    """Verifies that the value is legal for MSVS.
-
-    Args:
-      value: the value to check for this type.
-
-    Raises:
-      ValueError if value is not valid for MSVS.
-    """
-
-  def ValidateMSBuild(self, value):
-    """Verifies that the value is legal for MSBuild.
-
-    Args:
-      value: the value to check for this type.
-
-    Raises:
-      ValueError if value is not valid for MSBuild.
-    """
-
-  def ConvertToMSBuild(self, value):
-    """Returns the MSBuild equivalent of the MSVS value given.
-
-    Args:
-      value: the MSVS value to convert.
-
-    Returns:
-      the MSBuild equivalent.
-
-    Raises:
-      ValueError if value is not valid.
-    """
-    return value
-
-
-class _String(_Type):
-  """A setting that's just a string."""
-
-  def ValidateMSVS(self, value):
-    if not isinstance(value, basestring):
-      raise ValueError('expected string; got %r' % value)
-
-  def ValidateMSBuild(self, value):
-    if not isinstance(value, basestring):
-      raise ValueError('expected string; got %r' % value)
-
-  def ConvertToMSBuild(self, value):
-    # Convert the macros
-    return ConvertVCMacrosToMSBuild(value)
-
-
-class _StringList(_Type):
-  """A settings that's a list of strings."""
-
-  def ValidateMSVS(self, value):
-    if not isinstance(value, basestring) and not isinstance(value, list):
-      raise ValueError('expected string list; got %r' % value)
-
-  def ValidateMSBuild(self, value):
-    if not isinstance(value, basestring) and not isinstance(value, list):
-      raise ValueError('expected string list; got %r' % value)
-
-  def ConvertToMSBuild(self, value):
-    # Convert the macros
-    if isinstance(value, list):
-      return [ConvertVCMacrosToMSBuild(i) for i in value]
-    else:
-      return ConvertVCMacrosToMSBuild(value)
-
-
-class _Boolean(_Type):
-  """Boolean settings, can have the values 'false' or 'true'."""
-
-  def _Validate(self, value):
-    if value != 'true' and value != 'false':
-      raise ValueError('expected bool; got %r' % value)
-
-  def ValidateMSVS(self, value):
-    self._Validate(value)
-
-  def ValidateMSBuild(self, value):
-    self._Validate(value)
-
-  def ConvertToMSBuild(self, value):
-    self._Validate(value)
-    return value
-
-
-class _Integer(_Type):
-  """Integer settings."""
-
-  def __init__(self, msbuild_base=10):
-    _Type.__init__(self)
-    self._msbuild_base = msbuild_base
-
-  def ValidateMSVS(self, value):
-    # Try to convert, this will raise ValueError if invalid.
-    self.ConvertToMSBuild(value)
-
-  def ValidateMSBuild(self, value):
-    # Try to convert, this will raise ValueError if invalid.
-    int(value, self._msbuild_base)
-
-  def ConvertToMSBuild(self, value):
-    msbuild_format = (self._msbuild_base == 10) and '%d' or '0x%04x'
-    return msbuild_format % int(value)
-
-
-class _Enumeration(_Type):
-  """Type of settings that is an enumeration.
-
-  In MSVS, the values are indexes like '0', '1', and '2'.
-  MSBuild uses text labels that are more representative, like 'Win32'.
-
-  Constructor args:
-    label_list: an array of MSBuild labels that correspond to the MSVS index.
-        In the rare cases where MSVS has skipped an index value, None is
-        used in the array to indicate the unused spot.
-    new: an array of labels that are new to MSBuild.
-  """
-
-  def __init__(self, label_list, new=None):
-    _Type.__init__(self)
-    self._label_list = label_list
-    self._msbuild_values = set(value for value in label_list
-                               if value is not None)
-    if new is not None:
-      self._msbuild_values.update(new)
-
-  def ValidateMSVS(self, value):
-    # Try to convert.  It will raise an exception if not valid.
-    self.ConvertToMSBuild(value)
-
-  def ValidateMSBuild(self, value):
-    if value not in self._msbuild_values:
-      raise ValueError('unrecognized enumerated value %s' % value)
-
-  def ConvertToMSBuild(self, value):
-    index = int(value)
-    if index < 0 or index >= len(self._label_list):
-      raise ValueError('index value (%d) not in expected range [0, %d)' %
-                       (index, len(self._label_list)))
-    label = self._label_list[index]
-    if label is None:
-      raise ValueError('converted value for %s not specified.' % value)
-    return label
-
-
-# Instantiate the various generic types.
-_boolean = _Boolean()
-_integer = _Integer()
-# For now, we don't do any special validation on these types:
-_string = _String()
-_file_name = _String()
-_folder_name = _String()
-_file_list = _StringList()
-_folder_list = _StringList()
-_string_list = _StringList()
-# Some boolean settings went from numerical values to boolean.  The
-# mapping is 0: default, 1: false, 2: true.
-_newly_boolean = _Enumeration(['', 'false', 'true'])
-
-
-def _Same(tool, name, setting_type):
-  """Defines a setting that has the same name in MSVS and MSBuild.
-
-  Args:
-    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
-    name: the name of the setting.
-    setting_type: the type of this setting.
-  """
-  _Renamed(tool, name, name, setting_type)
-
-
-def _Renamed(tool, msvs_name, msbuild_name, setting_type):
-  """Defines a setting for which the name has changed.
-
-  Args:
-    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
-    msvs_name: the name of the MSVS setting.
-    msbuild_name: the name of the MSBuild setting.
-    setting_type: the type of this setting.
-  """
-
-  def _Translate(value, msbuild_settings):
-    msbuild_tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
-    msbuild_tool_settings[msbuild_name] = setting_type.ConvertToMSBuild(value)
-
-  _msvs_validators[tool.msvs_name][msvs_name] = setting_type.ValidateMSVS
-  _msbuild_validators[tool.msbuild_name][msbuild_name] = (
-      setting_type.ValidateMSBuild)
-  _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate
-
-
-def _Moved(tool, settings_name, msbuild_tool_name, setting_type):
-  _MovedAndRenamed(tool, settings_name, msbuild_tool_name, settings_name,
-                   setting_type)
-
-
-def _MovedAndRenamed(tool, msvs_settings_name, msbuild_tool_name,
-                     msbuild_settings_name, setting_type):
-  """Defines a setting that may have moved to a new section.
-
-  Args:
-    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
-    msvs_settings_name: the MSVS name of the setting.
-    msbuild_tool_name: the name of the MSBuild tool to place the setting under.
-    msbuild_settings_name: the MSBuild name of the setting.
-    setting_type: the type of this setting.
-  """
-
-  def _Translate(value, msbuild_settings):
-    tool_settings = msbuild_settings.setdefault(msbuild_tool_name, {})
-    tool_settings[msbuild_settings_name] = setting_type.ConvertToMSBuild(value)
-
-  _msvs_validators[tool.msvs_name][msvs_settings_name] = (
-      setting_type.ValidateMSVS)
-  validator = setting_type.ValidateMSBuild
-  _msbuild_validators[msbuild_tool_name][msbuild_settings_name] = validator
-  _msvs_to_msbuild_converters[tool.msvs_name][msvs_settings_name] = _Translate
-
-
-def _MSVSOnly(tool, name, setting_type):
-  """Defines a setting that is only found in MSVS.
-
-  Args:
-    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
-    name: the name of the setting.
-    setting_type: the type of this setting.
-  """
-
-  def _Translate(unused_value, unused_msbuild_settings):
-    # Since this is for MSVS only settings, no translation will happen.
-    pass
-
-  _msvs_validators[tool.msvs_name][name] = setting_type.ValidateMSVS
-  _msvs_to_msbuild_converters[tool.msvs_name][name] = _Translate
-
-
-def _MSBuildOnly(tool, name, setting_type):
-  """Defines a setting that is only found in MSBuild.
-
-  Args:
-    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
-    name: the name of the setting.
-    setting_type: the type of this setting.
-  """
-  _msbuild_validators[tool.msbuild_name][name] = setting_type.ValidateMSBuild
-
-
-def _ConvertedToAdditionalOption(tool, msvs_name, flag):
-  """Defines a setting that's handled via a command line option in MSBuild.
-
-  Args:
-    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
-    msvs_name: the name of the MSVS setting that if 'true' becomes a flag
-    flag: the flag to insert at the end of the AdditionalOptions
-  """
-
-  def _Translate(value, msbuild_settings):
-    if value == 'true':
-      tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
-      if 'AdditionalOptions' in tool_settings:
-        new_flags = '%s %s' % (tool_settings['AdditionalOptions'], flag)
-      else:
-        new_flags = flag
-      tool_settings['AdditionalOptions'] = new_flags
-  _msvs_validators[tool.msvs_name][msvs_name] = _boolean.ValidateMSVS
-  _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate
-
-
-def _CustomGeneratePreprocessedFile(tool, msvs_name):
-  def _Translate(value, msbuild_settings):
-    tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
-    if value == '0':
-      tool_settings['PreprocessToFile'] = 'false'
-      tool_settings['PreprocessSuppressLineNumbers'] = 'false'
-    elif value == '1':  # /P
-      tool_settings['PreprocessToFile'] = 'true'
-      tool_settings['PreprocessSuppressLineNumbers'] = 'false'
-    elif value == '2':  # /EP /P
-      tool_settings['PreprocessToFile'] = 'true'
-      tool_settings['PreprocessSuppressLineNumbers'] = 'true'
-    else:
-      raise ValueError('value must be one of [0, 1, 2]; got %s' % value)
-  # Create a bogus validator that looks for '0', '1', or '2'
-  msvs_validator = _Enumeration(['a', 'b', 'c']).ValidateMSVS
-  _msvs_validators[tool.msvs_name][msvs_name] = msvs_validator
-  msbuild_validator = _boolean.ValidateMSBuild
-  msbuild_tool_validators = _msbuild_validators[tool.msbuild_name]
-  msbuild_tool_validators['PreprocessToFile'] = msbuild_validator
-  msbuild_tool_validators['PreprocessSuppressLineNumbers'] = msbuild_validator
-  _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate
-
-
-fix_vc_macro_slashes_regex_list = ('IntDir', 'OutDir')
-fix_vc_macro_slashes_regex = re.compile(
-  r'(\$\((?:%s)\))(?:[\\/]+)' % "|".join(fix_vc_macro_slashes_regex_list)
-)
-
-def FixVCMacroSlashes(s):
-  """Replace macros which have excessive following slashes.
-
-  These macros are known to have a built-in trailing slash. Furthermore, many
-  scripts hiccup on processing paths with extra slashes in the middle.
-
-  This list is probably not exhaustive.  Add as needed.
-  """
-  if '$' in s:
-    s = fix_vc_macro_slashes_regex.sub(r'\1', s)
-  return s
-
-
-def ConvertVCMacrosToMSBuild(s):
-  """Convert the the MSVS macros found in the string to the MSBuild equivalent.
-
-  This list is probably not exhaustive.  Add as needed.
-  """
-  if '$' in s:
-    replace_map = {
-        '$(ConfigurationName)': '$(Configuration)',
-        '$(InputDir)': '%(RootDir)%(Directory)',
-        '$(InputExt)': '%(Extension)',
-        '$(InputFileName)': '%(Filename)%(Extension)',
-        '$(InputName)': '%(Filename)',
-        '$(InputPath)': '%(FullPath)',
-        '$(ParentName)': '$(ProjectFileName)',
-        '$(PlatformName)': '$(Platform)',
-        '$(SafeInputName)': '%(Filename)',
-    }
-    for old, new in replace_map.iteritems():
-      s = s.replace(old, new)
-    s = FixVCMacroSlashes(s)
-  return s
-
-
-def ConvertToMSBuildSettings(msvs_settings, stderr=sys.stderr):
-  """Converts MSVS settings (VS2008 and earlier) to MSBuild settings (VS2010+).
-
-  Args:
-      msvs_settings: A dictionary.  The key is the tool name.  The values are
-          themselves dictionaries of settings and their values.
-      stderr: The stream receiving the error messages.
-
-  Returns:
-      A dictionary of MSBuild settings.  The key is either the MSBuild tool name
-      or the empty string (for the global settings).  The values are themselves
-      dictionaries of settings and their values.
-  """
-  msbuild_settings = {}
-  for msvs_tool_name, msvs_tool_settings in msvs_settings.iteritems():
-    if msvs_tool_name in _msvs_to_msbuild_converters:
-      msvs_tool = _msvs_to_msbuild_converters[msvs_tool_name]
-      for msvs_setting, msvs_value in msvs_tool_settings.iteritems():
-        if msvs_setting in msvs_tool:
-          # Invoke the translation function.
-          try:
-            msvs_tool[msvs_setting](msvs_value, msbuild_settings)
-          except ValueError, e:
-            print >> stderr, ('Warning: while converting %s/%s to MSBuild, '
-                              '%s' % (msvs_tool_name, msvs_setting, e))
-        else:
-          # We don't know this setting.  Give a warning.
-          print >> stderr, ('Warning: unrecognized setting %s/%s '
-                            'while converting to MSBuild.' %
-                            (msvs_tool_name, msvs_setting))
-    else:
-      print >> stderr, ('Warning: unrecognized tool %s while converting to '
-                        'MSBuild.' % msvs_tool_name)
-  return msbuild_settings
-
-
-def ValidateMSVSSettings(settings, stderr=sys.stderr):
-  """Validates that the names of the settings are valid for MSVS.
-
-  Args:
-      settings: A dictionary.  The key is the tool name.  The values are
-          themselves dictionaries of settings and their values.
-      stderr: The stream receiving the error messages.
-  """
-  _ValidateSettings(_msvs_validators, settings, stderr)
-
-
-def ValidateMSBuildSettings(settings, stderr=sys.stderr):
-  """Validates that the names of the settings are valid for MSBuild.
-
-  Args:
-      settings: A dictionary.  The key is the tool name.  The values are
-          themselves dictionaries of settings and their values.
-      stderr: The stream receiving the error messages.
-  """
-  _ValidateSettings(_msbuild_validators, settings, stderr)
-
-
-def _ValidateSettings(validators, settings, stderr):
-  """Validates that the settings are valid for MSBuild or MSVS.
-
-  We currently only validate the names of the settings, not their values.
-
-  Args:
-      validators: A dictionary of tools and their validators.
-      settings: A dictionary.  The key is the tool name.  The values are
-          themselves dictionaries of settings and their values.
-      stderr: The stream receiving the error messages.
-  """
-  for tool_name in settings:
-    if tool_name in validators:
-      tool_validators = validators[tool_name]
-      for setting, value in settings[tool_name].iteritems():
-        if setting in tool_validators:
-          try:
-            tool_validators[setting](value)
-          except ValueError, e:
-            print >> stderr, ('Warning: for %s/%s, %s' %
-                              (tool_name, setting, e))
-        else:
-          print >> stderr, ('Warning: unrecognized setting %s/%s' %
-                            (tool_name, setting))
-    else:
-      print >> stderr, ('Warning: unrecognized tool %s' % tool_name)
-
-
-# MSVS and MBuild names of the tools.
-_compile = _Tool('VCCLCompilerTool', 'ClCompile')
-_link = _Tool('VCLinkerTool', 'Link')
-_midl = _Tool('VCMIDLTool', 'Midl')
-_rc = _Tool('VCResourceCompilerTool', 'ResourceCompile')
-_lib = _Tool('VCLibrarianTool', 'Lib')
-_manifest = _Tool('VCManifestTool', 'Manifest')
-
-
-_AddTool(_compile)
-_AddTool(_link)
-_AddTool(_midl)
-_AddTool(_rc)
-_AddTool(_lib)
-_AddTool(_manifest)
-# Add sections only found in the MSBuild settings.
-_msbuild_validators[''] = {}
-_msbuild_validators['ProjectReference'] = {}
-_msbuild_validators['ManifestResourceCompile'] = {}
-
-# Descriptions of the compiler options, i.e. VCCLCompilerTool in MSVS and
-# ClCompile in MSBuild.
-# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\cl.xml" for
-# the schema of the MSBuild ClCompile settings.
-
-# Options that have the same name in MSVS and MSBuild
-_Same(_compile, 'AdditionalIncludeDirectories', _folder_list)  # /I
-_Same(_compile, 'AdditionalOptions', _string_list)
-_Same(_compile, 'AdditionalUsingDirectories', _folder_list)  # /AI
-_Same(_compile, 'AssemblerListingLocation', _file_name)  # /Fa
-_Same(_compile, 'BrowseInformationFile', _file_name)
-_Same(_compile, 'BufferSecurityCheck', _boolean)  # /GS
-_Same(_compile, 'DisableLanguageExtensions', _boolean)  # /Za
-_Same(_compile, 'DisableSpecificWarnings', _string_list)  # /wd
-_Same(_compile, 'EnableFiberSafeOptimizations', _boolean)  # /GT
-_Same(_compile, 'EnablePREfast', _boolean)  # /analyze Visible='false'
-_Same(_compile, 'ExpandAttributedSource', _boolean)  # /Fx
-_Same(_compile, 'FloatingPointExceptions', _boolean)  # /fp:except
-_Same(_compile, 'ForceConformanceInForLoopScope', _boolean)  # /Zc:forScope
-_Same(_compile, 'ForcedIncludeFiles', _file_list)  # /FI
-_Same(_compile, 'ForcedUsingFiles', _file_list)  # /FU
-_Same(_compile, 'GenerateXMLDocumentationFiles', _boolean)  # /doc
-_Same(_compile, 'IgnoreStandardIncludePath', _boolean)  # /X
-_Same(_compile, 'OmitDefaultLibName', _boolean)  # /Zl
-_Same(_compile, 'OmitFramePointers', _boolean)  # /Oy
-_Same(_compile, 'PreprocessorDefinitions', _string_list)  # /D
-_Same(_compile, 'ProgramDataBaseFileName', _file_name)  # /Fd
-_Same(_compile, 'RuntimeTypeInfo', _boolean)  # /GR
-_Same(_compile, 'ShowIncludes', _boolean)  # /showIncludes
-_Same(_compile, 'SmallerTypeCheck', _boolean)  # /RTCc
-_Same(_compile, 'StringPooling', _boolean)  # /GF
-_Same(_compile, 'SuppressStartupBanner', _boolean)  # /nologo
-_Same(_compile, 'TreatWChar_tAsBuiltInType', _boolean)  # /Zc:wchar_t
-_Same(_compile, 'UndefineAllPreprocessorDefinitions', _boolean)  # /u
-_Same(_compile, 'UndefinePreprocessorDefinitions', _string_list)  # /U
-_Same(_compile, 'UseFullPaths', _boolean)  # /FC
-_Same(_compile, 'WholeProgramOptimization', _boolean)  # /GL
-_Same(_compile, 'XMLDocumentationFileName', _file_name)
-
-_Same(_compile, 'AssemblerOutput',
-      _Enumeration(['NoListing',
-                    'AssemblyCode',  # /FA
-                    'All',  # /FAcs
-                    'AssemblyAndMachineCode',  # /FAc
-                    'AssemblyAndSourceCode']))  # /FAs
-_Same(_compile, 'BasicRuntimeChecks',
-      _Enumeration(['Default',
-                    'StackFrameRuntimeCheck',  # /RTCs
-                    'UninitializedLocalUsageCheck',  # /RTCu
-                    'EnableFastChecks']))  # /RTC1
-_Same(_compile, 'BrowseInformation',
-      _Enumeration(['false',
-                    'true',  # /FR
-                    'true']))  # /Fr
-_Same(_compile, 'CallingConvention',
-      _Enumeration(['Cdecl',  # /Gd
-                    'FastCall',  # /Gr
-                    'StdCall']))  # /Gz
-_Same(_compile, 'CompileAs',
-      _Enumeration(['Default',
-                    'CompileAsC',  # /TC
-                    'CompileAsCpp']))  # /TP
-_Same(_compile, 'DebugInformationFormat',
-      _Enumeration(['',  # Disabled
-                    'OldStyle',  # /Z7
-                    None,
-                    'ProgramDatabase',  # /Zi
-                    'EditAndContinue']))  # /ZI
-_Same(_compile, 'EnableEnhancedInstructionSet',
-      _Enumeration(['NotSet',
-                    'StreamingSIMDExtensions',  # /arch:SSE
-                    'StreamingSIMDExtensions2']))  # /arch:SSE2
-_Same(_compile, 'ErrorReporting',
-      _Enumeration(['None',  # /errorReport:none
-                    'Prompt',  # /errorReport:prompt
-                    'Queue'],  # /errorReport:queue
-                   new=['Send']))  # /errorReport:send"
-_Same(_compile, 'ExceptionHandling',
-      _Enumeration(['false',
-                    'Sync',  # /EHsc
-                    'Async'],  # /EHa
-                   new=['SyncCThrow']))  # /EHs
-_Same(_compile, 'FavorSizeOrSpeed',
-      _Enumeration(['Neither',
-                    'Speed',  # /Ot
-                    'Size']))  # /Os
-_Same(_compile, 'FloatingPointModel',
-      _Enumeration(['Precise',  # /fp:precise
-                    'Strict',  # /fp:strict
-                    'Fast']))  # /fp:fast
-_Same(_compile, 'InlineFunctionExpansion',
-      _Enumeration(['Default',
-                    'OnlyExplicitInline',  # /Ob1
-                    'AnySuitable'],  # /Ob2
-                   new=['Disabled']))  # /Ob0
-_Same(_compile, 'Optimization',
-      _Enumeration(['Disabled',  # /Od
-                    'MinSpace',  # /O1
-                    'MaxSpeed',  # /O2
-                    'Full']))  # /Ox
-_Same(_compile, 'RuntimeLibrary',
-      _Enumeration(['MultiThreaded',  # /MT
-                    'MultiThreadedDebug',  # /MTd
-                    'MultiThreadedDLL',  # /MD
-                    'MultiThreadedDebugDLL']))  # /MDd
-_Same(_compile, 'StructMemberAlignment',
-      _Enumeration(['Default',
-                    '1Byte',  # /Zp1
-                    '2Bytes',  # /Zp2
-                    '4Bytes',  # /Zp4
-                    '8Bytes',  # /Zp8
-                    '16Bytes']))  # /Zp16
-_Same(_compile, 'WarningLevel',
-      _Enumeration(['TurnOffAllWarnings',  # /W0
-                    'Level1',  # /W1
-                    'Level2',  # /W2
-                    'Level3',  # /W3
-                    'Level4'],  # /W4
-                   new=['EnableAllWarnings']))  # /Wall
-
-# Options found in MSVS that have been renamed in MSBuild.
-_Renamed(_compile, 'EnableFunctionLevelLinking', 'FunctionLevelLinking',
-         _boolean)  # /Gy
-_Renamed(_compile, 'EnableIntrinsicFunctions', 'IntrinsicFunctions',
-         _boolean)  # /Oi
-_Renamed(_compile, 'KeepComments', 'PreprocessKeepComments', _boolean)  # /C
-_Renamed(_compile, 'ObjectFile', 'ObjectFileName', _file_name)  # /Fo
-_Renamed(_compile, 'OpenMP', 'OpenMPSupport', _boolean)  # /openmp
-_Renamed(_compile, 'PrecompiledHeaderThrough', 'PrecompiledHeaderFile',
-         _file_name)  # Used with /Yc and /Yu
-_Renamed(_compile, 'PrecompiledHeaderFile', 'PrecompiledHeaderOutputFile',
-         _file_name)  # /Fp
-_Renamed(_compile, 'UsePrecompiledHeader', 'PrecompiledHeader',
-         _Enumeration(['NotUsing',  # VS recognized '' for this value too.
-                       'Create',   # /Yc
-                       'Use']))  # /Yu
-_Renamed(_compile, 'WarnAsError', 'TreatWarningAsError', _boolean)  # /WX
-
-_ConvertedToAdditionalOption(_compile, 'DefaultCharIsUnsigned', '/J')
-
-# MSVS options not found in MSBuild.
-_MSVSOnly(_compile, 'Detect64BitPortabilityProblems', _boolean)
-_MSVSOnly(_compile, 'UseUnicodeResponseFiles', _boolean)
-
-# MSBuild options not found in MSVS.
-_MSBuildOnly(_compile, 'BuildingInIDE', _boolean)
-_MSBuildOnly(_compile, 'CompileAsManaged',
-             _Enumeration([], new=['false',
-                                   'true',  # /clr
-                                   'Pure',  # /clr:pure
-                                   'Safe',  # /clr:safe
-                                   'OldSyntax']))  # /clr:oldSyntax
-_MSBuildOnly(_compile, 'CreateHotpatchableImage', _boolean)  # /hotpatch
-_MSBuildOnly(_compile, 'MultiProcessorCompilation', _boolean)  # /MP
-_MSBuildOnly(_compile, 'PreprocessOutputPath', _string)  # /Fi
-_MSBuildOnly(_compile, 'ProcessorNumber', _integer)  # the number of processors
-_MSBuildOnly(_compile, 'TrackerLogDirectory', _folder_name)
-_MSBuildOnly(_compile, 'TreatSpecificWarningsAsErrors', _string_list)  # /we
-_MSBuildOnly(_compile, 'UseUnicodeForAssemblerListing', _boolean)  # /FAu
-
-# Defines a setting that needs very customized processing
-_CustomGeneratePreprocessedFile(_compile, 'GeneratePreprocessedFile')
-
-
-# Directives for converting MSVS VCLinkerTool to MSBuild Link.
-# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\link.xml" for
-# the schema of the MSBuild Link settings.
-
-# Options that have the same name in MSVS and MSBuild
-_Same(_link, 'AdditionalDependencies', _file_list)
-_Same(_link, 'AdditionalLibraryDirectories', _folder_list)  # /LIBPATH
-#  /MANIFESTDEPENDENCY:
-_Same(_link, 'AdditionalManifestDependencies', _file_list)
-_Same(_link, 'AdditionalOptions', _string_list)
-_Same(_link, 'AddModuleNamesToAssembly', _file_list)  # /ASSEMBLYMODULE
-_Same(_link, 'AllowIsolation', _boolean)  # /ALLOWISOLATION
-_Same(_link, 'AssemblyLinkResource', _file_list)  # /ASSEMBLYLINKRESOURCE
-_Same(_link, 'BaseAddress', _string)  # /BASE
-_Same(_link, 'CLRUnmanagedCodeCheck', _boolean)  # /CLRUNMANAGEDCODECHECK
-_Same(_link, 'DelayLoadDLLs', _file_list)  # /DELAYLOAD
-_Same(_link, 'DelaySign', _boolean)  # /DELAYSIGN
-_Same(_link, 'EmbedManagedResourceFile', _file_list)  # /ASSEMBLYRESOURCE
-_Same(_link, 'EnableUAC', _boolean)  # /MANIFESTUAC
-_Same(_link, 'EntryPointSymbol', _string)  # /ENTRY
-_Same(_link, 'ForceSymbolReferences', _file_list)  # /INCLUDE
-_Same(_link, 'FunctionOrder', _file_name)  # /ORDER
-_Same(_link, 'GenerateDebugInformation', _boolean)  # /DEBUG
-_Same(_link, 'GenerateMapFile', _boolean)  # /MAP
-_Same(_link, 'HeapCommitSize', _string)
-_Same(_link, 'HeapReserveSize', _string)  # /HEAP
-_Same(_link, 'IgnoreAllDefaultLibraries', _boolean)  # /NODEFAULTLIB
-_Same(_link, 'IgnoreEmbeddedIDL', _boolean)  # /IGNOREIDL
-_Same(_link, 'ImportLibrary', _file_name)  # /IMPLIB
-_Same(_link, 'KeyContainer', _file_name)  # /KEYCONTAINER
-_Same(_link, 'KeyFile', _file_name)  # /KEYFILE
-_Same(_link, 'ManifestFile', _file_name)  # /ManifestFile
-_Same(_link, 'MapExports', _boolean)  # /MAPINFO:EXPORTS
-_Same(_link, 'MapFileName', _file_name)
-_Same(_link, 'MergedIDLBaseFileName', _file_name)  # /IDLOUT
-_Same(_link, 'MergeSections', _string)  # /MERGE
-_Same(_link, 'MidlCommandFile', _file_name)  # /MIDL
-_Same(_link, 'ModuleDefinitionFile', _file_name)  # /DEF
-_Same(_link, 'OutputFile', _file_name)  # /OUT
-_Same(_link, 'PerUserRedirection', _boolean)
-_Same(_link, 'Profile', _boolean)  # /PROFILE
-_Same(_link, 'ProfileGuidedDatabase', _file_name)  # /PGD
-_Same(_link, 'ProgramDatabaseFile', _file_name)  # /PDB
-_Same(_link, 'RegisterOutput', _boolean)
-_Same(_link, 'SetChecksum', _boolean)  # /RELEASE
-_Same(_link, 'StackCommitSize', _string)
-_Same(_link, 'StackReserveSize', _string)  # /STACK
-_Same(_link, 'StripPrivateSymbols', _file_name)  # /PDBSTRIPPED
-_Same(_link, 'SupportUnloadOfDelayLoadedDLL', _boolean)  # /DELAY:UNLOAD
-_Same(_link, 'SuppressStartupBanner', _boolean)  # /NOLOGO
-_Same(_link, 'SwapRunFromCD', _boolean)  # /SWAPRUN:CD
-_Same(_link, 'TurnOffAssemblyGeneration', _boolean)  # /NOASSEMBLY
-_Same(_link, 'TypeLibraryFile', _file_name)  # /TLBOUT
-_Same(_link, 'TypeLibraryResourceID', _integer)  # /TLBID
-_Same(_link, 'UACUIAccess', _boolean)  # /uiAccess='true'
-_Same(_link, 'Version', _string)  # /VERSION
-
-_Same(_link, 'EnableCOMDATFolding', _newly_boolean)  # /OPT:ICF
-_Same(_link, 'FixedBaseAddress', _newly_boolean)  # /FIXED
-_Same(_link, 'LargeAddressAware', _newly_boolean)  # /LARGEADDRESSAWARE
-_Same(_link, 'OptimizeReferences', _newly_boolean)  # /OPT:REF
-_Same(_link, 'RandomizedBaseAddress', _newly_boolean)  # /DYNAMICBASE
-_Same(_link, 'TerminalServerAware', _newly_boolean)  # /TSAWARE
-
-_subsystem_enumeration = _Enumeration(
-    ['NotSet',
-     'Console',  # /SUBSYSTEM:CONSOLE
-     'Windows',  # /SUBSYSTEM:WINDOWS
-     'Native',  # /SUBSYSTEM:NATIVE
-     'EFI Application',  # /SUBSYSTEM:EFI_APPLICATION
-     'EFI Boot Service Driver',  # /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER
-     'EFI ROM',  # /SUBSYSTEM:EFI_ROM
-     'EFI Runtime',  # /SUBSYSTEM:EFI_RUNTIME_DRIVER
-     'WindowsCE'],  # /SUBSYSTEM:WINDOWSCE
-    new=['POSIX'])  # /SUBSYSTEM:POSIX
-
-_target_machine_enumeration = _Enumeration(
-    ['NotSet',
-     'MachineX86',  # /MACHINE:X86
-     None,
-     'MachineARM',  # /MACHINE:ARM
-     'MachineEBC',  # /MACHINE:EBC
-     'MachineIA64',  # /MACHINE:IA64
-     None,
-     'MachineMIPS',  # /MACHINE:MIPS
-     'MachineMIPS16',  # /MACHINE:MIPS16
-     'MachineMIPSFPU',  # /MACHINE:MIPSFPU
-     'MachineMIPSFPU16',  # /MACHINE:MIPSFPU16
-     None,
-     None,
-     None,
-     'MachineSH4',  # /MACHINE:SH4
-     None,
-     'MachineTHUMB',  # /MACHINE:THUMB
-     'MachineX64'])  # /MACHINE:X64
-
-_Same(_link, 'AssemblyDebug',
-      _Enumeration(['',
-                    'true',  # /ASSEMBLYDEBUG
-                    'false']))  # /ASSEMBLYDEBUG:DISABLE
-_Same(_link, 'CLRImageType',
-      _Enumeration(['Default',
-                    'ForceIJWImage',  # /CLRIMAGETYPE:IJW
-                    'ForcePureILImage',  # /Switch="CLRIMAGETYPE:PURE
-                    'ForceSafeILImage']))  # /Switch="CLRIMAGETYPE:SAFE
-_Same(_link, 'CLRThreadAttribute',
-      _Enumeration(['DefaultThreadingAttribute',  # /CLRTHREADATTRIBUTE:NONE
-                    'MTAThreadingAttribute',  # /CLRTHREADATTRIBUTE:MTA
-                    'STAThreadingAttribute']))  # /CLRTHREADATTRIBUTE:STA
-_Same(_link, 'DataExecutionPrevention',
-      _Enumeration(['',
-                    'false',  # /NXCOMPAT:NO
-                    'true']))  # /NXCOMPAT
-_Same(_link, 'Driver',
-      _Enumeration(['NotSet',
-                    'Driver',  # /Driver
-                    'UpOnly',  # /DRIVER:UPONLY
-                    'WDM']))  # /DRIVER:WDM
-_Same(_link, 'LinkTimeCodeGeneration',
-      _Enumeration(['Default',
-                    'UseLinkTimeCodeGeneration',  # /LTCG
-                    'PGInstrument',  # /LTCG:PGInstrument
-                    'PGOptimization',  # /LTCG:PGOptimize
-                    'PGUpdate']))  # /LTCG:PGUpdate
-_Same(_link, 'ShowProgress',
-      _Enumeration(['NotSet',
-                    'LinkVerbose',  # /VERBOSE
-                    'LinkVerboseLib'],  # /VERBOSE:Lib
-                   new=['LinkVerboseICF',  # /VERBOSE:ICF
-                        'LinkVerboseREF',  # /VERBOSE:REF
-                        'LinkVerboseSAFESEH',  # /VERBOSE:SAFESEH
-                        'LinkVerboseCLR']))  # /VERBOSE:CLR
-_Same(_link, 'SubSystem', _subsystem_enumeration)
-_Same(_link, 'TargetMachine', _target_machine_enumeration)
-_Same(_link, 'UACExecutionLevel',
-      _Enumeration(['AsInvoker',  # /level='asInvoker'
-                    'HighestAvailable',  # /level='highestAvailable'
-                    'RequireAdministrator']))  # /level='requireAdministrator'
-
-
-# Options found in MSVS that have been renamed in MSBuild.
-_Renamed(_link, 'ErrorReporting', 'LinkErrorReporting',
-         _Enumeration(['NoErrorReport',  # /ERRORREPORT:NONE
-                       'PromptImmediately',  # /ERRORREPORT:PROMPT
-                       'QueueForNextLogin'],  # /ERRORREPORT:QUEUE
-                      new=['SendErrorReport']))  # /ERRORREPORT:SEND
-_Renamed(_link, 'IgnoreDefaultLibraryNames', 'IgnoreSpecificDefaultLibraries',
-         _file_list)  # /NODEFAULTLIB
-_Renamed(_link, 'ResourceOnlyDLL', 'NoEntryPoint', _boolean)  # /NOENTRY
-_Renamed(_link, 'SwapRunFromNet', 'SwapRunFromNET', _boolean)  # /SWAPRUN:NET
-
-_Moved(_link, 'GenerateManifest', '', _boolean)
-_Moved(_link, 'IgnoreImportLibrary', '', _boolean)
-_Moved(_link, 'LinkIncremental', '', _newly_boolean)
-_Moved(_link, 'LinkLibraryDependencies', 'ProjectReference', _boolean)
-_Moved(_link, 'UseLibraryDependencyInputs', 'ProjectReference', _boolean)
-
-# MSVS options not found in MSBuild.
-_MSVSOnly(_link, 'OptimizeForWindows98', _newly_boolean)
-_MSVSOnly(_link, 'UseUnicodeResponseFiles', _boolean)
-# TODO(jeanluc) I don't think these are genuine settings but byproducts of Gyp.
-_MSVSOnly(_link, 'AdditionalLibraryDirectories_excluded', _folder_list)
-
-# MSBuild options not found in MSVS.
-_MSBuildOnly(_link, 'BuildingInIDE', _boolean)
-_MSBuildOnly(_link, 'ImageHasSafeExceptionHandlers', _boolean)  # /SAFESEH
-_MSBuildOnly(_link, 'LinkDLL', _boolean)  # /DLL Visible='false'
-_MSBuildOnly(_link, 'LinkStatus', _boolean)  # /LTCG:STATUS
-_MSBuildOnly(_link, 'PreventDllBinding', _boolean)  # /ALLOWBIND
-_MSBuildOnly(_link, 'SupportNobindOfDelayLoadedDLL', _boolean)  # /DELAY:NOBIND
-_MSBuildOnly(_link, 'TrackerLogDirectory', _folder_name)
-_MSBuildOnly(_link, 'TreatLinkerWarningAsErrors', _boolean)  # /WX
-_MSBuildOnly(_link, 'MinimumRequiredVersion', _string)
-_MSBuildOnly(_link, 'MSDOSStubFileName', _file_name)  # /STUB Visible='false'
-_MSBuildOnly(_link, 'SectionAlignment', _integer)  # /ALIGN
-_MSBuildOnly(_link, 'SpecifySectionAttributes', _string)  # /SECTION
-_MSBuildOnly(_link, 'ForceFileOutput',
-             _Enumeration([], new=['Enabled',  # /FORCE
-                                   # /FORCE:MULTIPLE
-                                   'MultiplyDefinedSymbolOnly',
-                                   'UndefinedSymbolOnly']))  # /FORCE:UNRESOLVED
-_MSBuildOnly(_link, 'CreateHotPatchableImage',
-             _Enumeration([], new=['Enabled',  # /FUNCTIONPADMIN
-                                   'X86Image',  # /FUNCTIONPADMIN:5
-                                   'X64Image',  # /FUNCTIONPADMIN:6
-                                   'ItaniumImage']))  # /FUNCTIONPADMIN:16
-_MSBuildOnly(_link, 'CLRSupportLastError',
-             _Enumeration([], new=['Enabled',  # /CLRSupportLastError
-                                   'Disabled',  # /CLRSupportLastError:NO
-                                   # /CLRSupportLastError:SYSTEMDLL
-                                   'SystemDlls']))
-
-
-# Directives for converting VCResourceCompilerTool to ResourceCompile.
-# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\rc.xml" for
-# the schema of the MSBuild ResourceCompile settings.
-
-_Same(_rc, 'AdditionalOptions', _string_list)
-_Same(_rc, 'AdditionalIncludeDirectories', _folder_list)  # /I
-_Same(_rc, 'Culture', _Integer(msbuild_base=16))
-_Same(_rc, 'IgnoreStandardIncludePath', _boolean)  # /X
-_Same(_rc, 'PreprocessorDefinitions', _string_list)  # /D
-_Same(_rc, 'ResourceOutputFileName', _string)  # /fo
-_Same(_rc, 'ShowProgress', _boolean)  # /v
-# There is no UI in VisualStudio 2008 to set the following properties.
-# However they are found in CL and other tools.  Include them here for
-# completeness, as they are very likely to have the same usage pattern.
-_Same(_rc, 'SuppressStartupBanner', _boolean)  # /nologo
-_Same(_rc, 'UndefinePreprocessorDefinitions', _string_list)  # /u
-
-# MSBuild options not found in MSVS.
-_MSBuildOnly(_rc, 'NullTerminateStrings', _boolean)  # /n
-_MSBuildOnly(_rc, 'TrackerLogDirectory', _folder_name)
-
-
-# Directives for converting VCMIDLTool to Midl.
-# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\midl.xml" for
-# the schema of the MSBuild Midl settings.
-
-_Same(_midl, 'AdditionalIncludeDirectories', _folder_list)  # /I
-_Same(_midl, 'AdditionalOptions', _string_list)
-_Same(_midl, 'CPreprocessOptions', _string)  # /cpp_opt
-_Same(_midl, 'ErrorCheckAllocations', _boolean)  # /error allocation
-_Same(_midl, 'ErrorCheckBounds', _boolean)  # /error bounds_check
-_Same(_midl, 'ErrorCheckEnumRange', _boolean)  # /error enum
-_Same(_midl, 'ErrorCheckRefPointers', _boolean)  # /error ref
-_Same(_midl, 'ErrorCheckStubData', _boolean)  # /error stub_data
-_Same(_midl, 'GenerateStublessProxies', _boolean)  # /Oicf
-_Same(_midl, 'GenerateTypeLibrary', _boolean)
-_Same(_midl, 'HeaderFileName', _file_name)  # /h
-_Same(_midl, 'IgnoreStandardIncludePath', _boolean)  # /no_def_idir
-_Same(_midl, 'InterfaceIdentifierFileName', _file_name)  # /iid
-_Same(_midl, 'MkTypLibCompatible', _boolean)  # /mktyplib203
-_Same(_midl, 'OutputDirectory', _string)  # /out
-_Same(_midl, 'PreprocessorDefinitions', _string_list)  # /D
-_Same(_midl, 'ProxyFileName', _file_name)  # /proxy
-_Same(_midl, 'RedirectOutputAndErrors', _file_name)  # /o
-_Same(_midl, 'SuppressStartupBanner', _boolean)  # /nologo
-_Same(_midl, 'TypeLibraryName', _file_name)  # /tlb
-_Same(_midl, 'UndefinePreprocessorDefinitions', _string_list)  # /U
-_Same(_midl, 'WarnAsError', _boolean)  # /WX
-
-_Same(_midl, 'DefaultCharType',
-      _Enumeration(['Unsigned',  # /char unsigned
-                    'Signed',  # /char signed
-                    'Ascii']))  # /char ascii7
-_Same(_midl, 'TargetEnvironment',
-      _Enumeration(['NotSet',
-                    'Win32',  # /env win32
-                    'Itanium',  # /env ia64
-                    'X64']))  # /env x64
-_Same(_midl, 'EnableErrorChecks',
-      _Enumeration(['EnableCustom',
-                    'None',  # /error none
-                    'All']))  # /error all
-_Same(_midl, 'StructMemberAlignment',
-      _Enumeration(['NotSet',
-                    '1',  # Zp1
-                    '2',  # Zp2
-                    '4',  # Zp4
-                    '8']))  # Zp8
-_Same(_midl, 'WarningLevel',
-      _Enumeration(['0',  # /W0
-                    '1',  # /W1
-                    '2',  # /W2
-                    '3',  # /W3
-                    '4']))  # /W4
-
-_Renamed(_midl, 'DLLDataFileName', 'DllDataFileName', _file_name)  # /dlldata
-_Renamed(_midl, 'ValidateParameters', 'ValidateAllParameters',
-         _boolean)  # /robust
-
-# MSBuild options not found in MSVS.
-_MSBuildOnly(_midl, 'ApplicationConfigurationMode', _boolean)  # /app_config
-_MSBuildOnly(_midl, 'ClientStubFile', _file_name)  # /cstub
-_MSBuildOnly(_midl, 'GenerateClientFiles',
-             _Enumeration([], new=['Stub',  # /client stub
-                                   'None']))  # /client none
-_MSBuildOnly(_midl, 'GenerateServerFiles',
-             _Enumeration([], new=['Stub',  # /client stub
-                                   'None']))  # /client none
-_MSBuildOnly(_midl, 'LocaleID', _integer)  # /lcid DECIMAL
-_MSBuildOnly(_midl, 'ServerStubFile', _file_name)  # /sstub
-_MSBuildOnly(_midl, 'SuppressCompilerWarnings', _boolean)  # /no_warn
-_MSBuildOnly(_midl, 'TrackerLogDirectory', _folder_name)
-_MSBuildOnly(_midl, 'TypeLibFormat',
-             _Enumeration([], new=['NewFormat',  # /newtlb
-                                   'OldFormat']))  # /oldtlb
-
-
-# Directives for converting VCLibrarianTool to Lib.
-# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\lib.xml" for
-# the schema of the MSBuild Lib settings.
-
-_Same(_lib, 'AdditionalDependencies', _file_list)
-_Same(_lib, 'AdditionalLibraryDirectories', _folder_list)  # /LIBPATH
-_Same(_lib, 'AdditionalOptions', _string_list)
-_Same(_lib, 'ExportNamedFunctions', _string_list)  # /EXPORT
-_Same(_lib, 'ForceSymbolReferences', _string)  # /INCLUDE
-_Same(_lib, 'IgnoreAllDefaultLibraries', _boolean)  # /NODEFAULTLIB
-_Same(_lib, 'IgnoreSpecificDefaultLibraries', _file_list)  # /NODEFAULTLIB
-_Same(_lib, 'ModuleDefinitionFile', _file_name)  # /DEF
-_Same(_lib, 'OutputFile', _file_name)  # /OUT
-_Same(_lib, 'SuppressStartupBanner', _boolean)  # /NOLOGO
-_Same(_lib, 'UseUnicodeResponseFiles', _boolean)
-_Same(_lib, 'LinkTimeCodeGeneration', _boolean)  # /LTCG
-
-# TODO(jeanluc) _link defines the same value that gets moved to
-# ProjectReference.  We may want to validate that they are consistent.
-_Moved(_lib, 'LinkLibraryDependencies', 'ProjectReference', _boolean)
-
-# TODO(jeanluc) I don't think these are genuine settings but byproducts of Gyp.
-_MSVSOnly(_lib, 'AdditionalLibraryDirectories_excluded', _folder_list)
-
-_MSBuildOnly(_lib, 'DisplayLibrary', _string)  # /LIST Visible='false'
-_MSBuildOnly(_lib, 'ErrorReporting',
-             _Enumeration([], new=['PromptImmediately',  # /ERRORREPORT:PROMPT
-                                   'QueueForNextLogin',  # /ERRORREPORT:QUEUE
-                                   'SendErrorReport',  # /ERRORREPORT:SEND
-                                   'NoErrorReport']))  # /ERRORREPORT:NONE
-_MSBuildOnly(_lib, 'MinimumRequiredVersion', _string)
-_MSBuildOnly(_lib, 'Name', _file_name)  # /NAME
-_MSBuildOnly(_lib, 'RemoveObjects', _file_list)  # /REMOVE
-_MSBuildOnly(_lib, 'SubSystem', _subsystem_enumeration)
-_MSBuildOnly(_lib, 'TargetMachine', _target_machine_enumeration)
-_MSBuildOnly(_lib, 'TrackerLogDirectory', _folder_name)
-_MSBuildOnly(_lib, 'TreatLibWarningAsErrors', _boolean)  # /WX
-_MSBuildOnly(_lib, 'Verbose', _boolean)
-
-
-# Directives for converting VCManifestTool to Mt.
-# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\mt.xml" for
-# the schema of the MSBuild Lib settings.
-
-# Options that have the same name in MSVS and MSBuild
-_Same(_manifest, 'AdditionalManifestFiles', _file_list)  # /manifest
-_Same(_manifest, 'AdditionalOptions', _string_list)
-_Same(_manifest, 'AssemblyIdentity', _string)  # /identity:
-_Same(_manifest, 'ComponentFileName', _file_name)  # /dll
-_Same(_manifest, 'GenerateCatalogFiles', _boolean)  # /makecdfs
-_Same(_manifest, 'InputResourceManifests', _string)  # /inputresource
-_Same(_manifest, 'OutputManifestFile', _file_name)  # /out
-_Same(_manifest, 'RegistrarScriptFile', _file_name)  # /rgs
-_Same(_manifest, 'ReplacementsFile', _file_name)  # /replacements
-_Same(_manifest, 'SuppressStartupBanner', _boolean)  # /nologo
-_Same(_manifest, 'TypeLibraryFile', _file_name)  # /tlb:
-_Same(_manifest, 'UpdateFileHashes', _boolean)  # /hashupdate
-_Same(_manifest, 'UpdateFileHashesSearchPath', _file_name)
-_Same(_manifest, 'VerboseOutput', _boolean)  # /verbose
-
-# Options that have moved location.
-_MovedAndRenamed(_manifest, 'ManifestResourceFile',
-                 'ManifestResourceCompile',
-                 'ResourceOutputFileName',
-                 _file_name)
-_Moved(_manifest, 'EmbedManifest', '', _boolean)
-
-# MSVS options not found in MSBuild.
-_MSVSOnly(_manifest, 'DependencyInformationFile', _file_name)
-_MSVSOnly(_manifest, 'UseFAT32Workaround', _boolean)
-_MSVSOnly(_manifest, 'UseUnicodeResponseFiles', _boolean)
-
-# MSBuild options not found in MSVS.
-_MSBuildOnly(_manifest, 'EnableDPIAwareness', _boolean)
-_MSBuildOnly(_manifest, 'GenerateCategoryTags', _boolean)  # /category
-_MSBuildOnly(_manifest, 'ManifestFromManagedAssembly',
-             _file_name)  # /managedassemblyname
-_MSBuildOnly(_manifest, 'OutputResourceManifests', _string)  # /outputresource
-_MSBuildOnly(_manifest, 'SuppressDependencyElement', _boolean)  # /nodependency
-_MSBuildOnly(_manifest, 'TrackerLogDirectory', _folder_name)
diff --git a/tools/gyp/pylib/gyp/MSVSSettings_test.py b/tools/gyp/pylib/gyp/MSVSSettings_test.py
deleted file mode 100755
index 52ff7c3..0000000
--- a/tools/gyp/pylib/gyp/MSVSSettings_test.py
+++ /dev/null
@@ -1,1479 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2012 Google Inc. 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 MSVSSettings.py file."""
-
-import StringIO
-import unittest
-import gyp.MSVSSettings as MSVSSettings
-
-
-class TestSequenceFunctions(unittest.TestCase):
-
-  def setUp(self):
-    self.stderr = StringIO.StringIO()
-
-  def _ExpectedWarnings(self, expected):
-    """Compares recorded lines to expected warnings."""
-    self.stderr.seek(0)
-    actual = self.stderr.read().split('\n')
-    actual = [line for line in actual if line]
-    self.assertEqual(sorted(expected), sorted(actual))
-
-  def testValidateMSVSSettings_tool_names(self):
-    """Tests that only MSVS tool names are allowed."""
-    MSVSSettings.ValidateMSVSSettings(
-        {'VCCLCompilerTool': {},
-         'VCLinkerTool': {},
-         'VCMIDLTool': {},
-         'foo': {},
-         'VCResourceCompilerTool': {},
-         'VCLibrarianTool': {},
-         'VCManifestTool': {},
-         'ClCompile': {}},
-        self.stderr)
-    self._ExpectedWarnings([
-        'Warning: unrecognized tool foo',
-        'Warning: unrecognized tool ClCompile'])
-
-  def testValidateMSVSSettings_settings(self):
-    """Tests that for invalid MSVS settings."""
-    MSVSSettings.ValidateMSVSSettings(
-        {'VCCLCompilerTool': {
-            'AdditionalIncludeDirectories': 'folder1;folder2',
-            'AdditionalOptions': ['string1', 'string2'],
-            'AdditionalUsingDirectories': 'folder1;folder2',
-            'AssemblerListingLocation': 'a_file_name',
-            'AssemblerOutput': '0',
-            'BasicRuntimeChecks': '5',
-            'BrowseInformation': 'fdkslj',
-            'BrowseInformationFile': 'a_file_name',
-            'BufferSecurityCheck': 'true',
-            'CallingConvention': '-1',
-            'CompileAs': '1',
-            'DebugInformationFormat': '2',
-            'DefaultCharIsUnsigned': 'true',
-            'Detect64BitPortabilityProblems': 'true',
-            'DisableLanguageExtensions': 'true',
-            'DisableSpecificWarnings': 'string1;string2',
-            'EnableEnhancedInstructionSet': '1',
-            'EnableFiberSafeOptimizations': 'true',
-            'EnableFunctionLevelLinking': 'true',
-            'EnableIntrinsicFunctions': 'true',
-            'EnablePREfast': 'true',
-            'Enableprefast': 'bogus',
-            'ErrorReporting': '1',
-            'ExceptionHandling': '1',
-            'ExpandAttributedSource': 'true',
-            'FavorSizeOrSpeed': '1',
-            'FloatingPointExceptions': 'true',
-            'FloatingPointModel': '1',
-            'ForceConformanceInForLoopScope': 'true',
-            'ForcedIncludeFiles': 'file1;file2',
-            'ForcedUsingFiles': 'file1;file2',
-            'GeneratePreprocessedFile': '1',
-            'GenerateXMLDocumentationFiles': 'true',
-            'IgnoreStandardIncludePath': 'true',
-            'InlineFunctionExpansion': '1',
-            'KeepComments': 'true',
-            'ObjectFile': 'a_file_name',
-            'OmitDefaultLibName': 'true',
-            'OmitFramePointers': 'true',
-            'OpenMP': 'true',
-            'Optimization': '1',
-            'PrecompiledHeaderFile': 'a_file_name',
-            'PrecompiledHeaderThrough': 'a_file_name',
-            'PreprocessorDefinitions': 'string1;string2',
-            'ProgramDataBaseFileName': 'a_file_name',
-            'RuntimeLibrary': '1',
-            'RuntimeTypeInfo': 'true',
-            'ShowIncludes': 'true',
-            'SmallerTypeCheck': 'true',
-            'StringPooling': 'true',
-            'StructMemberAlignment': '1',
-            'SuppressStartupBanner': 'true',
-            'TreatWChar_tAsBuiltInType': 'true',
-            'UndefineAllPreprocessorDefinitions': 'true',
-            'UndefinePreprocessorDefinitions': 'string1;string2',
-            'UseFullPaths': 'true',
-            'UsePrecompiledHeader': '1',
-            'UseUnicodeResponseFiles': 'true',
-            'WarnAsError': 'true',
-            'WarningLevel': '1',
-            'WholeProgramOptimization': 'true',
-            'XMLDocumentationFileName': 'a_file_name',
-            'ZZXYZ': 'bogus'},
-         'VCLinkerTool': {
-             'AdditionalDependencies': 'file1;file2',
-             'AdditionalLibraryDirectories': 'folder1;folder2',
-             'AdditionalManifestDependencies': 'file1;file2',
-             'AdditionalOptions': 'a string1',
-             'AddModuleNamesToAssembly': 'file1;file2',
-             'AllowIsolation': 'true',
-             'AssemblyDebug': '2',
-             'AssemblyLinkResource': 'file1;file2',
-             'BaseAddress': 'a string1',
-             'CLRImageType': '2',
-             'CLRThreadAttribute': '2',
-             'CLRUnmanagedCodeCheck': 'true',
-             'DataExecutionPrevention': '2',
-             'DelayLoadDLLs': 'file1;file2',
-             'DelaySign': 'true',
-             'Driver': '2',
-             'EmbedManagedResourceFile': 'file1;file2',
-             'EnableCOMDATFolding': '2',
-             'EnableUAC': 'true',
-             'EntryPointSymbol': 'a string1',
-             'ErrorReporting': '2',
-             'FixedBaseAddress': '2',
-             'ForceSymbolReferences': 'file1;file2',
-             'FunctionOrder': 'a_file_name',
-             'GenerateDebugInformation': 'true',
-             'GenerateManifest': 'true',
-             'GenerateMapFile': 'true',
-             'HeapCommitSize': 'a string1',
-             'HeapReserveSize': 'a string1',
-             'IgnoreAllDefaultLibraries': 'true',
-             'IgnoreDefaultLibraryNames': 'file1;file2',
-             'IgnoreEmbeddedIDL': 'true',
-             'IgnoreImportLibrary': 'true',
-             'ImportLibrary': 'a_file_name',
-             'KeyContainer': 'a_file_name',
-             'KeyFile': 'a_file_name',
-             'LargeAddressAware': '2',
-             'LinkIncremental': '2',
-             'LinkLibraryDependencies': 'true',
-             'LinkTimeCodeGeneration': '2',
-             'ManifestFile': 'a_file_name',
-             'MapExports': 'true',
-             'MapFileName': 'a_file_name',
-             'MergedIDLBaseFileName': 'a_file_name',
-             'MergeSections': 'a string1',
-             'MidlCommandFile': 'a_file_name',
-             'ModuleDefinitionFile': 'a_file_name',
-             'OptimizeForWindows98': '1',
-             'OptimizeReferences': '2',
-             'OutputFile': 'a_file_name',
-             'PerUserRedirection': 'true',
-             'Profile': 'true',
-             'ProfileGuidedDatabase': 'a_file_name',
-             'ProgramDatabaseFile': 'a_file_name',
-             'RandomizedBaseAddress': '2',
-             'RegisterOutput': 'true',
-             'ResourceOnlyDLL': 'true',
-             'SetChecksum': 'true',
-             'ShowProgress': '2',
-             'StackCommitSize': 'a string1',
-             'StackReserveSize': 'a string1',
-             'StripPrivateSymbols': 'a_file_name',
-             'SubSystem': '2',
-             'SupportUnloadOfDelayLoadedDLL': 'true',
-             'SuppressStartupBanner': 'true',
-             'SwapRunFromCD': 'true',
-             'SwapRunFromNet': 'true',
-             'TargetMachine': '2',
-             'TerminalServerAware': '2',
-             'TurnOffAssemblyGeneration': 'true',
-             'TypeLibraryFile': 'a_file_name',
-             'TypeLibraryResourceID': '33',
-             'UACExecutionLevel': '2',
-             'UACUIAccess': 'true',
-             'UseLibraryDependencyInputs': 'true',
-             'UseUnicodeResponseFiles': 'true',
-             'Version': 'a string1'},
-         'VCMIDLTool': {
-             'AdditionalIncludeDirectories': 'folder1;folder2',
-             'AdditionalOptions': 'a string1',
-             'CPreprocessOptions': 'a string1',
-             'DefaultCharType': '1',
-             'DLLDataFileName': 'a_file_name',
-             'EnableErrorChecks': '1',
-             'ErrorCheckAllocations': 'true',
-             'ErrorCheckBounds': 'true',
-             'ErrorCheckEnumRange': 'true',
-             'ErrorCheckRefPointers': 'true',
-             'ErrorCheckStubData': 'true',
-             'GenerateStublessProxies': 'true',
-             'GenerateTypeLibrary': 'true',
-             'HeaderFileName': 'a_file_name',
-             'IgnoreStandardIncludePath': 'true',
-             'InterfaceIdentifierFileName': 'a_file_name',
-             'MkTypLibCompatible': 'true',
-             'notgood': 'bogus',
-             'OutputDirectory': 'a string1',
-             'PreprocessorDefinitions': 'string1;string2',
-             'ProxyFileName': 'a_file_name',
-             'RedirectOutputAndErrors': 'a_file_name',
-             'StructMemberAlignment': '1',
-             'SuppressStartupBanner': 'true',
-             'TargetEnvironment': '1',
-             'TypeLibraryName': 'a_file_name',
-             'UndefinePreprocessorDefinitions': 'string1;string2',
-             'ValidateParameters': 'true',
-             'WarnAsError': 'true',
-             'WarningLevel': '1'},
-         'VCResourceCompilerTool': {
-             'AdditionalOptions': 'a string1',
-             'AdditionalIncludeDirectories': 'folder1;folder2',
-             'Culture': '1003',
-             'IgnoreStandardIncludePath': 'true',
-             'notgood2': 'bogus',
-             'PreprocessorDefinitions': 'string1;string2',
-             'ResourceOutputFileName': 'a string1',
-             'ShowProgress': 'true',
-             'SuppressStartupBanner': 'true',
-             'UndefinePreprocessorDefinitions': 'string1;string2'},
-         'VCLibrarianTool': {
-             'AdditionalDependencies': 'file1;file2',
-             'AdditionalLibraryDirectories': 'folder1;folder2',
-             'AdditionalOptions': 'a string1',
-             'ExportNamedFunctions': 'string1;string2',
-             'ForceSymbolReferences': 'a string1',
-             'IgnoreAllDefaultLibraries': 'true',
-             'IgnoreSpecificDefaultLibraries': 'file1;file2',
-             'LinkLibraryDependencies': 'true',
-             'ModuleDefinitionFile': 'a_file_name',
-             'OutputFile': 'a_file_name',
-             'SuppressStartupBanner': 'true',
-             'UseUnicodeResponseFiles': 'true'},
-         'VCManifestTool': {
-             'AdditionalManifestFiles': 'file1;file2',
-             'AdditionalOptions': 'a string1',
-             'AssemblyIdentity': 'a string1',
-             'ComponentFileName': 'a_file_name',
-             'DependencyInformationFile': 'a_file_name',
-             'GenerateCatalogFiles': 'true',
-             'InputResourceManifests': 'a string1',
-             'ManifestResourceFile': 'a_file_name',
-             'OutputManifestFile': 'a_file_name',
-             'RegistrarScriptFile': 'a_file_name',
-             'ReplacementsFile': 'a_file_name',
-             'SuppressStartupBanner': 'true',
-             'TypeLibraryFile': 'a_file_name',
-             'UpdateFileHashes': 'truel',
-             'UpdateFileHashesSearchPath': 'a_file_name',
-             'UseFAT32Workaround': 'true',
-             'UseUnicodeResponseFiles': 'true',
-             'VerboseOutput': 'true'}},
-        self.stderr)
-    self._ExpectedWarnings([
-        'Warning: for VCCLCompilerTool/BasicRuntimeChecks, '
-        'index value (5) not in expected range [0, 4)',
-        'Warning: for VCCLCompilerTool/BrowseInformation, '
-        "invalid literal for int() with base 10: 'fdkslj'",
-        'Warning: for VCCLCompilerTool/CallingConvention, '
-        'index value (-1) not in expected range [0, 3)',
-        'Warning: for VCCLCompilerTool/DebugInformationFormat, '
-        'converted value for 2 not specified.',
-        'Warning: unrecognized setting VCCLCompilerTool/Enableprefast',
-        'Warning: unrecognized setting VCCLCompilerTool/ZZXYZ',
-        'Warning: for VCLinkerTool/TargetMachine, '
-        'converted value for 2 not specified.',
-        'Warning: unrecognized setting VCMIDLTool/notgood',
-        'Warning: unrecognized setting VCResourceCompilerTool/notgood2',
-        'Warning: for VCManifestTool/UpdateFileHashes, '
-        "expected bool; got 'truel'"
-        ''])
-
-  def testValidateMSBuildSettings_settings(self):
-    """Tests that for invalid MSBuild settings."""
-    MSVSSettings.ValidateMSBuildSettings(
-        {'ClCompile': {
-            'AdditionalIncludeDirectories': 'folder1;folder2',
-            'AdditionalOptions': ['string1', 'string2'],
-            'AdditionalUsingDirectories': 'folder1;folder2',
-            'AssemblerListingLocation': 'a_file_name',
-            'AssemblerOutput': 'NoListing',
-            'BasicRuntimeChecks': 'StackFrameRuntimeCheck',
-            'BrowseInformation': 'false',
-            'BrowseInformationFile': 'a_file_name',
-            'BufferSecurityCheck': 'true',
-            'BuildingInIDE': 'true',
-            'CallingConvention': 'Cdecl',
-            'CompileAs': 'CompileAsC',
-            'CompileAsManaged': 'Pure',
-            'CreateHotpatchableImage': 'true',
-            'DebugInformationFormat': 'ProgramDatabase',
-            'DisableLanguageExtensions': 'true',
-            'DisableSpecificWarnings': 'string1;string2',
-            'EnableEnhancedInstructionSet': 'StreamingSIMDExtensions',
-            'EnableFiberSafeOptimizations': 'true',
-            'EnablePREfast': 'true',
-            'Enableprefast': 'bogus',
-            'ErrorReporting': 'Prompt',
-            'ExceptionHandling': 'SyncCThrow',
-            'ExpandAttributedSource': 'true',
-            'FavorSizeOrSpeed': 'Neither',
-            'FloatingPointExceptions': 'true',
-            'FloatingPointModel': 'Precise',
-            'ForceConformanceInForLoopScope': 'true',
-            'ForcedIncludeFiles': 'file1;file2',
-            'ForcedUsingFiles': 'file1;file2',
-            'FunctionLevelLinking': 'false',
-            'GenerateXMLDocumentationFiles': 'true',
-            'IgnoreStandardIncludePath': 'true',
-            'InlineFunctionExpansion': 'OnlyExplicitInline',
-            'IntrinsicFunctions': 'false',
-            'MultiProcessorCompilation': 'true',
-            'ObjectFileName': 'a_file_name',
-            'OmitDefaultLibName': 'true',
-            'OmitFramePointers': 'true',
-            'OpenMPSupport': 'true',
-            'Optimization': 'Disabled',
-            'PrecompiledHeader': 'NotUsing',
-            'PrecompiledHeaderFile': 'a_file_name',
-            'PrecompiledHeaderOutputFile': 'a_file_name',
-            'PreprocessKeepComments': 'true',
-            'PreprocessorDefinitions': 'string1;string2',
-            'PreprocessOutputPath': 'a string1',
-            'PreprocessSuppressLineNumbers': 'false',
-            'PreprocessToFile': 'false',
-            'ProcessorNumber': '33',
-            'ProgramDataBaseFileName': 'a_file_name',
-            'RuntimeLibrary': 'MultiThreaded',
-            'RuntimeTypeInfo': 'true',
-            'ShowIncludes': 'true',
-            'SmallerTypeCheck': 'true',
-            'StringPooling': 'true',
-            'StructMemberAlignment': '1Byte',
-            'SuppressStartupBanner': 'true',
-            'TrackerLogDirectory': 'a_folder',
-            'TreatSpecificWarningsAsErrors': 'string1;string2',
-            'TreatWarningAsError': 'true',
-            'TreatWChar_tAsBuiltInType': 'true',
-            'UndefineAllPreprocessorDefinitions': 'true',
-            'UndefinePreprocessorDefinitions': 'string1;string2',
-            'UseFullPaths': 'true',
-            'UseUnicodeForAssemblerListing': 'true',
-            'WarningLevel': 'TurnOffAllWarnings',
-            'WholeProgramOptimization': 'true',
-            'XMLDocumentationFileName': 'a_file_name',
-            'ZZXYZ': 'bogus'},
-         'Link': {
-             'AdditionalDependencies': 'file1;file2',
-             'AdditionalLibraryDirectories': 'folder1;folder2',
-             'AdditionalManifestDependencies': 'file1;file2',
-             'AdditionalOptions': 'a string1',
-             'AddModuleNamesToAssembly': 'file1;file2',
-             'AllowIsolation': 'true',
-             'AssemblyDebug': '',
-             'AssemblyLinkResource': 'file1;file2',
-             'BaseAddress': 'a string1',
-             'BuildingInIDE': 'true',
-             'CLRImageType': 'ForceIJWImage',
-             'CLRSupportLastError': 'Enabled',
-             'CLRThreadAttribute': 'MTAThreadingAttribute',
-             'CLRUnmanagedCodeCheck': 'true',
-             'CreateHotPatchableImage': 'X86Image',
-             'DataExecutionPrevention': 'false',
-             'DelayLoadDLLs': 'file1;file2',
-             'DelaySign': 'true',
-             'Driver': 'NotSet',
-             'EmbedManagedResourceFile': 'file1;file2',
-             'EnableCOMDATFolding': 'false',
-             'EnableUAC': 'true',
-             'EntryPointSymbol': 'a string1',
-             'FixedBaseAddress': 'false',
-             'ForceFileOutput': 'Enabled',
-             'ForceSymbolReferences': 'file1;file2',
-             'FunctionOrder': 'a_file_name',
-             'GenerateDebugInformation': 'true',
-             'GenerateMapFile': 'true',
-             'HeapCommitSize': 'a string1',
-             'HeapReserveSize': 'a string1',
-             'IgnoreAllDefaultLibraries': 'true',
-             'IgnoreEmbeddedIDL': 'true',
-             'IgnoreSpecificDefaultLibraries': 'a_file_list',
-             'ImageHasSafeExceptionHandlers': 'true',
-             'ImportLibrary': 'a_file_name',
-             'KeyContainer': 'a_file_name',
-             'KeyFile': 'a_file_name',
-             'LargeAddressAware': 'false',
-             'LinkDLL': 'true',
-             'LinkErrorReporting': 'SendErrorReport',
-             'LinkStatus': 'true',
-             'LinkTimeCodeGeneration': 'UseLinkTimeCodeGeneration',
-             'ManifestFile': 'a_file_name',
-             'MapExports': 'true',
-             'MapFileName': 'a_file_name',
-             'MergedIDLBaseFileName': 'a_file_name',
-             'MergeSections': 'a string1',
-             'MidlCommandFile': 'a_file_name',
-             'MinimumRequiredVersion': 'a string1',
-             'ModuleDefinitionFile': 'a_file_name',
-             'MSDOSStubFileName': 'a_file_name',
-             'NoEntryPoint': 'true',
-             'OptimizeReferences': 'false',
-             'OutputFile': 'a_file_name',
-             'PerUserRedirection': 'true',
-             'PreventDllBinding': 'true',
-             'Profile': 'true',
-             'ProfileGuidedDatabase': 'a_file_name',
-             'ProgramDatabaseFile': 'a_file_name',
-             'RandomizedBaseAddress': 'false',
-             'RegisterOutput': 'true',
-             'SectionAlignment': '33',
-             'SetChecksum': 'true',
-             'ShowProgress': 'LinkVerboseREF',
-             'SpecifySectionAttributes': 'a string1',
-             'StackCommitSize': 'a string1',
-             'StackReserveSize': 'a string1',
-             'StripPrivateSymbols': 'a_file_name',
-             'SubSystem': 'Console',
-             'SupportNobindOfDelayLoadedDLL': 'true',
-             'SupportUnloadOfDelayLoadedDLL': 'true',
-             'SuppressStartupBanner': 'true',
-             'SwapRunFromCD': 'true',
-             'SwapRunFromNET': 'true',
-             'TargetMachine': 'MachineX86',
-             'TerminalServerAware': 'false',
-             'TrackerLogDirectory': 'a_folder',
-             'TreatLinkerWarningAsErrors': 'true',
-             'TurnOffAssemblyGeneration': 'true',
-             'TypeLibraryFile': 'a_file_name',
-             'TypeLibraryResourceID': '33',
-             'UACExecutionLevel': 'AsInvoker',
-             'UACUIAccess': 'true',
-             'Version': 'a string1'},
-         'ResourceCompile': {
-             'AdditionalIncludeDirectories': 'folder1;folder2',
-             'AdditionalOptions': 'a string1',
-             'Culture': '0x236',
-             'IgnoreStandardIncludePath': 'true',
-             'NullTerminateStrings': 'true',
-             'PreprocessorDefinitions': 'string1;string2',
-             'ResourceOutputFileName': 'a string1',
-             'ShowProgress': 'true',
-             'SuppressStartupBanner': 'true',
-             'TrackerLogDirectory': 'a_folder',
-             'UndefinePreprocessorDefinitions': 'string1;string2'},
-         'Midl': {
-             'AdditionalIncludeDirectories': 'folder1;folder2',
-             'AdditionalOptions': 'a string1',
-             'ApplicationConfigurationMode': 'true',
-             'ClientStubFile': 'a_file_name',
-             'CPreprocessOptions': 'a string1',
-             'DefaultCharType': 'Signed',
-             'DllDataFileName': 'a_file_name',
-             'EnableErrorChecks': 'EnableCustom',
-             'ErrorCheckAllocations': 'true',
-             'ErrorCheckBounds': 'true',
-             'ErrorCheckEnumRange': 'true',
-             'ErrorCheckRefPointers': 'true',
-             'ErrorCheckStubData': 'true',
-             'GenerateClientFiles': 'Stub',
-             'GenerateServerFiles': 'None',
-             'GenerateStublessProxies': 'true',
-             'GenerateTypeLibrary': 'true',
-             'HeaderFileName': 'a_file_name',
-             'IgnoreStandardIncludePath': 'true',
-             'InterfaceIdentifierFileName': 'a_file_name',
-             'LocaleID': '33',
-             'MkTypLibCompatible': 'true',
-             'OutputDirectory': 'a string1',
-             'PreprocessorDefinitions': 'string1;string2',
-             'ProxyFileName': 'a_file_name',
-             'RedirectOutputAndErrors': 'a_file_name',
-             'ServerStubFile': 'a_file_name',
-             'StructMemberAlignment': 'NotSet',
-             'SuppressCompilerWarnings': 'true',
-             'SuppressStartupBanner': 'true',
-             'TargetEnvironment': 'Itanium',
-             'TrackerLogDirectory': 'a_folder',
-             'TypeLibFormat': 'NewFormat',
-             'TypeLibraryName': 'a_file_name',
-             'UndefinePreprocessorDefinitions': 'string1;string2',
-             'ValidateAllParameters': 'true',
-             'WarnAsError': 'true',
-             'WarningLevel': '1'},
-         'Lib': {
-             'AdditionalDependencies': 'file1;file2',
-             'AdditionalLibraryDirectories': 'folder1;folder2',
-             'AdditionalOptions': 'a string1',
-             'DisplayLibrary': 'a string1',
-             'ErrorReporting': 'PromptImmediately',
-             'ExportNamedFunctions': 'string1;string2',
-             'ForceSymbolReferences': 'a string1',
-             'IgnoreAllDefaultLibraries': 'true',
-             'IgnoreSpecificDefaultLibraries': 'file1;file2',
-             'LinkTimeCodeGeneration': 'true',
-             'MinimumRequiredVersion': 'a string1',
-             'ModuleDefinitionFile': 'a_file_name',
-             'Name': 'a_file_name',
-             'OutputFile': 'a_file_name',
-             'RemoveObjects': 'file1;file2',
-             'SubSystem': 'Console',
-             'SuppressStartupBanner': 'true',
-             'TargetMachine': 'MachineX86i',
-             'TrackerLogDirectory': 'a_folder',
-             'TreatLibWarningAsErrors': 'true',
-             'UseUnicodeResponseFiles': 'true',
-             'Verbose': 'true'},
-         'Manifest': {
-             'AdditionalManifestFiles': 'file1;file2',
-             'AdditionalOptions': 'a string1',
-             'AssemblyIdentity': 'a string1',
-             'ComponentFileName': 'a_file_name',
-             'EnableDPIAwareness': 'fal',
-             'GenerateCatalogFiles': 'truel',
-             'GenerateCategoryTags': 'true',
-             'InputResourceManifests': 'a string1',
-             'ManifestFromManagedAssembly': 'a_file_name',
-             'notgood3': 'bogus',
-             'OutputManifestFile': 'a_file_name',
-             'OutputResourceManifests': 'a string1',
-             'RegistrarScriptFile': 'a_file_name',
-             'ReplacementsFile': 'a_file_name',
-             'SuppressDependencyElement': 'true',
-             'SuppressStartupBanner': 'true',
-             'TrackerLogDirectory': 'a_folder',
-             'TypeLibraryFile': 'a_file_name',
-             'UpdateFileHashes': 'true',
-             'UpdateFileHashesSearchPath': 'a_file_name',
-             'VerboseOutput': 'true'},
-         'ProjectReference': {
-             'LinkLibraryDependencies': 'true',
-             'UseLibraryDependencyInputs': 'true'},
-         'ManifestResourceCompile': {
-             'ResourceOutputFileName': 'a_file_name'},
-         '': {
-             'EmbedManifest': 'true',
-             'GenerateManifest': 'true',
-             'IgnoreImportLibrary': 'true',
-             'LinkIncremental': 'false'}},
-        self.stderr)
-    self._ExpectedWarnings([
-        'Warning: unrecognized setting ClCompile/Enableprefast',
-        'Warning: unrecognized setting ClCompile/ZZXYZ',
-        'Warning: unrecognized setting Manifest/notgood3',
-        'Warning: for Manifest/GenerateCatalogFiles, '
-        "expected bool; got 'truel'",
-        'Warning: for Lib/TargetMachine, unrecognized enumerated value '
-        'MachineX86i',
-        "Warning: for Manifest/EnableDPIAwareness, expected bool; got 'fal'"])
-
-  def testConvertToMSBuildSettings_empty(self):
-    """Tests an empty conversion."""
-    msvs_settings = {}
-    expected_msbuild_settings = {}
-    actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
-        msvs_settings,
-        self.stderr)
-    self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
-    self._ExpectedWarnings([])
-
-  def testConvertToMSBuildSettings_minimal(self):
-    """Tests a minimal conversion."""
-    msvs_settings = {
-        'VCCLCompilerTool': {
-            'AdditionalIncludeDirectories': 'dir1',
-            'AdditionalOptions': '/foo',
-            'BasicRuntimeChecks': '0',
-            },
-        'VCLinkerTool': {
-            'LinkTimeCodeGeneration': '1',
-            'ErrorReporting': '1',
-            'DataExecutionPrevention': '2',
-            },
-        }
-    expected_msbuild_settings = {
-        'ClCompile': {
-            'AdditionalIncludeDirectories': 'dir1',
-            'AdditionalOptions': '/foo',
-            'BasicRuntimeChecks': 'Default',
-            },
-        'Link': {
-            'LinkTimeCodeGeneration': 'UseLinkTimeCodeGeneration',
-            'LinkErrorReporting': 'PromptImmediately',
-            'DataExecutionPrevention': 'true',
-            },
-        }
-    actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
-        msvs_settings,
-        self.stderr)
-    self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
-    self._ExpectedWarnings([])
-
-  def testConvertToMSBuildSettings_warnings(self):
-    """Tests conversion that generates warnings."""
-    msvs_settings = {
-        'VCCLCompilerTool': {
-            'AdditionalIncludeDirectories': '1',
-            'AdditionalOptions': '2',
-            # These are incorrect values:
-            'BasicRuntimeChecks': '12',
-            'BrowseInformation': '21',
-            'UsePrecompiledHeader': '13',
-            'GeneratePreprocessedFile': '14'},
-        'VCLinkerTool': {
-            # These are incorrect values:
-            'Driver': '10',
-            'LinkTimeCodeGeneration': '31',
-            'ErrorReporting': '21',
-            'FixedBaseAddress': '6'},
-        'VCResourceCompilerTool': {
-            # Custom
-            'Culture': '1003'}}
-    expected_msbuild_settings = {
-        'ClCompile': {
-            'AdditionalIncludeDirectories': '1',
-            'AdditionalOptions': '2'},
-        'Link': {},
-        'ResourceCompile': {
-            # Custom
-            'Culture': '0x03eb'}}
-    actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
-        msvs_settings,
-        self.stderr)
-    self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
-    self._ExpectedWarnings([
-        'Warning: while converting VCCLCompilerTool/BasicRuntimeChecks to '
-        'MSBuild, index value (12) not in expected range [0, 4)',
-        'Warning: while converting VCCLCompilerTool/BrowseInformation to '
-        'MSBuild, index value (21) not in expected range [0, 3)',
-        'Warning: while converting VCCLCompilerTool/UsePrecompiledHeader to '
-        'MSBuild, index value (13) not in expected range [0, 3)',
-        'Warning: while converting VCCLCompilerTool/GeneratePreprocessedFile to '
-        'MSBuild, value must be one of [0, 1, 2]; got 14',
-
-        'Warning: while converting VCLinkerTool/Driver to '
-        'MSBuild, index value (10) not in expected range [0, 4)',
-        'Warning: while converting VCLinkerTool/LinkTimeCodeGeneration to '
-        'MSBuild, index value (31) not in expected range [0, 5)',
-        'Warning: while converting VCLinkerTool/ErrorReporting to '
-        'MSBuild, index value (21) not in expected range [0, 3)',
-        'Warning: while converting VCLinkerTool/FixedBaseAddress to '
-        'MSBuild, index value (6) not in expected range [0, 3)',
-        ])
-
-  def testConvertToMSBuildSettings_full_synthetic(self):
-    """Tests conversion of all the MSBuild settings."""
-    msvs_settings = {
-        'VCCLCompilerTool': {
-            'AdditionalIncludeDirectories': 'folder1;folder2;folder3',
-            'AdditionalOptions': 'a_string',
-            'AdditionalUsingDirectories': 'folder1;folder2;folder3',
-            'AssemblerListingLocation': 'a_file_name',
-            'AssemblerOutput': '0',
-            'BasicRuntimeChecks': '1',
-            'BrowseInformation': '2',
-            'BrowseInformationFile': 'a_file_name',
-            'BufferSecurityCheck': 'true',
-            'CallingConvention': '0',
-            'CompileAs': '1',
-            'DebugInformationFormat': '4',
-            'DefaultCharIsUnsigned': 'true',
-            'Detect64BitPortabilityProblems': 'true',
-            'DisableLanguageExtensions': 'true',
-            'DisableSpecificWarnings': 'd1;d2;d3',
-            'EnableEnhancedInstructionSet': '0',
-            'EnableFiberSafeOptimizations': 'true',
-            'EnableFunctionLevelLinking': 'true',
-            'EnableIntrinsicFunctions': 'true',
-            'EnablePREfast': 'true',
-            'ErrorReporting': '1',
-            'ExceptionHandling': '2',
-            'ExpandAttributedSource': 'true',
-            'FavorSizeOrSpeed': '0',
-            'FloatingPointExceptions': 'true',
-            'FloatingPointModel': '1',
-            'ForceConformanceInForLoopScope': 'true',
-            'ForcedIncludeFiles': 'file1;file2;file3',
-            'ForcedUsingFiles': 'file1;file2;file3',
-            'GeneratePreprocessedFile': '1',
-            'GenerateXMLDocumentationFiles': 'true',
-            'IgnoreStandardIncludePath': 'true',
-            'InlineFunctionExpansion': '2',
-            'KeepComments': 'true',
-            'ObjectFile': 'a_file_name',
-            'OmitDefaultLibName': 'true',
-            'OmitFramePointers': 'true',
-            'OpenMP': 'true',
-            'Optimization': '3',
-            'PrecompiledHeaderFile': 'a_file_name',
-            'PrecompiledHeaderThrough': 'a_file_name',
-            'PreprocessorDefinitions': 'd1;d2;d3',
-            'ProgramDataBaseFileName': 'a_file_name',
-            'RuntimeLibrary': '0',
-            'RuntimeTypeInfo': 'true',
-            'ShowIncludes': 'true',
-            'SmallerTypeCheck': 'true',
-            'StringPooling': 'true',
-            'StructMemberAlignment': '1',
-            'SuppressStartupBanner': 'true',
-            'TreatWChar_tAsBuiltInType': 'true',
-            'UndefineAllPreprocessorDefinitions': 'true',
-            'UndefinePreprocessorDefinitions': 'd1;d2;d3',
-            'UseFullPaths': 'true',
-            'UsePrecompiledHeader': '1',
-            'UseUnicodeResponseFiles': 'true',
-            'WarnAsError': 'true',
-            'WarningLevel': '2',
-            'WholeProgramOptimization': 'true',
-            'XMLDocumentationFileName': 'a_file_name'},
-        'VCLinkerTool': {
-            'AdditionalDependencies': 'file1;file2;file3',
-            'AdditionalLibraryDirectories': 'folder1;folder2;folder3',
-            'AdditionalLibraryDirectories_excluded': 'folder1;folder2;folder3',
-            'AdditionalManifestDependencies': 'file1;file2;file3',
-            'AdditionalOptions': 'a_string',
-            'AddModuleNamesToAssembly': 'file1;file2;file3',
-            'AllowIsolation': 'true',
-            'AssemblyDebug': '0',
-            'AssemblyLinkResource': 'file1;file2;file3',
-            'BaseAddress': 'a_string',
-            'CLRImageType': '1',
-            'CLRThreadAttribute': '2',
-            'CLRUnmanagedCodeCheck': 'true',
-            'DataExecutionPrevention': '0',
-            'DelayLoadDLLs': 'file1;file2;file3',
-            'DelaySign': 'true',
-            'Driver': '1',
-            'EmbedManagedResourceFile': 'file1;file2;file3',
-            'EnableCOMDATFolding': '0',
-            'EnableUAC': 'true',
-            'EntryPointSymbol': 'a_string',
-            'ErrorReporting': '0',
-            'FixedBaseAddress': '1',
-            'ForceSymbolReferences': 'file1;file2;file3',
-            'FunctionOrder': 'a_file_name',
-            'GenerateDebugInformation': 'true',
-            'GenerateManifest': 'true',
-            'GenerateMapFile': 'true',
-            'HeapCommitSize': 'a_string',
-            'HeapReserveSize': 'a_string',
-            'IgnoreAllDefaultLibraries': 'true',
-            'IgnoreDefaultLibraryNames': 'file1;file2;file3',
-            'IgnoreEmbeddedIDL': 'true',
-            'IgnoreImportLibrary': 'true',
-            'ImportLibrary': 'a_file_name',
-            'KeyContainer': 'a_file_name',
-            'KeyFile': 'a_file_name',
-            'LargeAddressAware': '2',
-            'LinkIncremental': '1',
-            'LinkLibraryDependencies': 'true',
-            'LinkTimeCodeGeneration': '2',
-            'ManifestFile': 'a_file_name',
-            'MapExports': 'true',
-            'MapFileName': 'a_file_name',
-            'MergedIDLBaseFileName': 'a_file_name',
-            'MergeSections': 'a_string',
-            'MidlCommandFile': 'a_file_name',
-            'ModuleDefinitionFile': 'a_file_name',
-            'OptimizeForWindows98': '1',
-            'OptimizeReferences': '0',
-            'OutputFile': 'a_file_name',
-            'PerUserRedirection': 'true',
-            'Profile': 'true',
-            'ProfileGuidedDatabase': 'a_file_name',
-            'ProgramDatabaseFile': 'a_file_name',
-            'RandomizedBaseAddress': '1',
-            'RegisterOutput': 'true',
-            'ResourceOnlyDLL': 'true',
-            'SetChecksum': 'true',
-            'ShowProgress': '0',
-            'StackCommitSize': 'a_string',
-            'StackReserveSize': 'a_string',
-            'StripPrivateSymbols': 'a_file_name',
-            'SubSystem': '2',
-            'SupportUnloadOfDelayLoadedDLL': 'true',
-            'SuppressStartupBanner': 'true',
-            'SwapRunFromCD': 'true',
-            'SwapRunFromNet': 'true',
-            'TargetMachine': '3',
-            'TerminalServerAware': '2',
-            'TurnOffAssemblyGeneration': 'true',
-            'TypeLibraryFile': 'a_file_name',
-            'TypeLibraryResourceID': '33',
-            'UACExecutionLevel': '1',
-            'UACUIAccess': 'true',
-            'UseLibraryDependencyInputs': 'false',
-            'UseUnicodeResponseFiles': 'true',
-            'Version': 'a_string'},
-        'VCResourceCompilerTool': {
-            'AdditionalIncludeDirectories': 'folder1;folder2;folder3',
-            'AdditionalOptions': 'a_string',
-            'Culture': '1003',
-            'IgnoreStandardIncludePath': 'true',
-            'PreprocessorDefinitions': 'd1;d2;d3',
-            'ResourceOutputFileName': 'a_string',
-            'ShowProgress': 'true',
-            'SuppressStartupBanner': 'true',
-            'UndefinePreprocessorDefinitions': 'd1;d2;d3'},
-        'VCMIDLTool': {
-            'AdditionalIncludeDirectories': 'folder1;folder2;folder3',
-            'AdditionalOptions': 'a_string',
-            'CPreprocessOptions': 'a_string',
-            'DefaultCharType': '0',
-            'DLLDataFileName': 'a_file_name',
-            'EnableErrorChecks': '2',
-            'ErrorCheckAllocations': 'true',
-            'ErrorCheckBounds': 'true',
-            'ErrorCheckEnumRange': 'true',
-            'ErrorCheckRefPointers': 'true',
-            'ErrorCheckStubData': 'true',
-            'GenerateStublessProxies': 'true',
-            'GenerateTypeLibrary': 'true',
-            'HeaderFileName': 'a_file_name',
-            'IgnoreStandardIncludePath': 'true',
-            'InterfaceIdentifierFileName': 'a_file_name',
-            'MkTypLibCompatible': 'true',
-            'OutputDirectory': 'a_string',
-            'PreprocessorDefinitions': 'd1;d2;d3',
-            'ProxyFileName': 'a_file_name',
-            'RedirectOutputAndErrors': 'a_file_name',
-            'StructMemberAlignment': '3',
-            'SuppressStartupBanner': 'true',
-            'TargetEnvironment': '1',
-            'TypeLibraryName': 'a_file_name',
-            'UndefinePreprocessorDefinitions': 'd1;d2;d3',
-            'ValidateParameters': 'true',
-            'WarnAsError': 'true',
-            'WarningLevel': '4'},
-        'VCLibrarianTool': {
-            'AdditionalDependencies': 'file1;file2;file3',
-            'AdditionalLibraryDirectories': 'folder1;folder2;folder3',
-            'AdditionalLibraryDirectories_excluded': 'folder1;folder2;folder3',
-            'AdditionalOptions': 'a_string',
-            'ExportNamedFunctions': 'd1;d2;d3',
-            'ForceSymbolReferences': 'a_string',
-            'IgnoreAllDefaultLibraries': 'true',
-            'IgnoreSpecificDefaultLibraries': 'file1;file2;file3',
-            'LinkLibraryDependencies': 'true',
-            'ModuleDefinitionFile': 'a_file_name',
-            'OutputFile': 'a_file_name',
-            'SuppressStartupBanner': 'true',
-            'UseUnicodeResponseFiles': 'true'},
-        'VCManifestTool': {
-            'AdditionalManifestFiles': 'file1;file2;file3',
-            'AdditionalOptions': 'a_string',
-            'AssemblyIdentity': 'a_string',
-            'ComponentFileName': 'a_file_name',
-            'DependencyInformationFile': 'a_file_name',
-            'EmbedManifest': 'true',
-            'GenerateCatalogFiles': 'true',
-            'InputResourceManifests': 'a_string',
-            'ManifestResourceFile': 'my_name',
-            'OutputManifestFile': 'a_file_name',
-            'RegistrarScriptFile': 'a_file_name',
-            'ReplacementsFile': 'a_file_name',
-            'SuppressStartupBanner': 'true',
-            'TypeLibraryFile': 'a_file_name',
-            'UpdateFileHashes': 'true',
-            'UpdateFileHashesSearchPath': 'a_file_name',
-            'UseFAT32Workaround': 'true',
-            'UseUnicodeResponseFiles': 'true',
-            'VerboseOutput': 'true'}}
-    expected_msbuild_settings = {
-        'ClCompile': {
-            'AdditionalIncludeDirectories': 'folder1;folder2;folder3',
-            'AdditionalOptions': 'a_string /J',
-            'AdditionalUsingDirectories': 'folder1;folder2;folder3',
-            'AssemblerListingLocation': 'a_file_name',
-            'AssemblerOutput': 'NoListing',
-            'BasicRuntimeChecks': 'StackFrameRuntimeCheck',
-            'BrowseInformation': 'true',
-            'BrowseInformationFile': 'a_file_name',
-            'BufferSecurityCheck': 'true',
-            'CallingConvention': 'Cdecl',
-            'CompileAs': 'CompileAsC',
-            'DebugInformationFormat': 'EditAndContinue',
-            'DisableLanguageExtensions': 'true',
-            'DisableSpecificWarnings': 'd1;d2;d3',
-            'EnableEnhancedInstructionSet': 'NotSet',
-            'EnableFiberSafeOptimizations': 'true',
-            'EnablePREfast': 'true',
-            'ErrorReporting': 'Prompt',
-            'ExceptionHandling': 'Async',
-            'ExpandAttributedSource': 'true',
-            'FavorSizeOrSpeed': 'Neither',
-            'FloatingPointExceptions': 'true',
-            'FloatingPointModel': 'Strict',
-            'ForceConformanceInForLoopScope': 'true',
-            'ForcedIncludeFiles': 'file1;file2;file3',
-            'ForcedUsingFiles': 'file1;file2;file3',
-            'FunctionLevelLinking': 'true',
-            'GenerateXMLDocumentationFiles': 'true',
-            'IgnoreStandardIncludePath': 'true',
-            'InlineFunctionExpansion': 'AnySuitable',
-            'IntrinsicFunctions': 'true',
-            'MinimalRebuild': 'true',
-            'ObjectFileName': 'a_file_name',
-            'OmitDefaultLibName': 'true',
-            'OmitFramePointers': 'true',
-            'OpenMPSupport': 'true',
-            'Optimization': 'Full',
-            'PrecompiledHeader': 'Create',
-            'PrecompiledHeaderFile': 'a_file_name',
-            'PrecompiledHeaderOutputFile': 'a_file_name',
-            'PreprocessKeepComments': 'true',
-            'PreprocessorDefinitions': 'd1;d2;d3',
-            'PreprocessSuppressLineNumbers': 'false',
-            'PreprocessToFile': 'true',
-            'ProgramDataBaseFileName': 'a_file_name',
-            'RuntimeLibrary': 'MultiThreaded',
-            'RuntimeTypeInfo': 'true',
-            'ShowIncludes': 'true',
-            'SmallerTypeCheck': 'true',
-            'StringPooling': 'true',
-            'StructMemberAlignment': '1Byte',
-            'SuppressStartupBanner': 'true',
-            'TreatWarningAsError': 'true',
-            'TreatWChar_tAsBuiltInType': 'true',
-            'UndefineAllPreprocessorDefinitions': 'true',
-            'UndefinePreprocessorDefinitions': 'd1;d2;d3',
-            'UseFullPaths': 'true',
-            'WarningLevel': 'Level2',
-            'WholeProgramOptimization': 'true',
-            'XMLDocumentationFileName': 'a_file_name'},
-        'Link': {
-            'AdditionalDependencies': 'file1;file2;file3',
-            'AdditionalLibraryDirectories': 'folder1;folder2;folder3',
-            'AdditionalManifestDependencies': 'file1;file2;file3',
-            'AdditionalOptions': 'a_string',
-            'AddModuleNamesToAssembly': 'file1;file2;file3',
-            'AllowIsolation': 'true',
-            'AssemblyDebug': '',
-            'AssemblyLinkResource': 'file1;file2;file3',
-            'BaseAddress': 'a_string',
-            'CLRImageType': 'ForceIJWImage',
-            'CLRThreadAttribute': 'STAThreadingAttribute',
-            'CLRUnmanagedCodeCheck': 'true',
-            'DataExecutionPrevention': '',
-            'DelayLoadDLLs': 'file1;file2;file3',
-            'DelaySign': 'true',
-            'Driver': 'Driver',
-            'EmbedManagedResourceFile': 'file1;file2;file3',
-            'EnableCOMDATFolding': '',
-            'EnableUAC': 'true',
-            'EntryPointSymbol': 'a_string',
-            'FixedBaseAddress': 'false',
-            'ForceSymbolReferences': 'file1;file2;file3',
-            'FunctionOrder': 'a_file_name',
-            'GenerateDebugInformation': 'true',
-            'GenerateMapFile': 'true',
-            'HeapCommitSize': 'a_string',
-            'HeapReserveSize': 'a_string',
-            'IgnoreAllDefaultLibraries': 'true',
-            'IgnoreEmbeddedIDL': 'true',
-            'IgnoreSpecificDefaultLibraries': 'file1;file2;file3',
-            'ImportLibrary': 'a_file_name',
-            'KeyContainer': 'a_file_name',
-            'KeyFile': 'a_file_name',
-            'LargeAddressAware': 'true',
-            'LinkErrorReporting': 'NoErrorReport',
-            'LinkTimeCodeGeneration': 'PGInstrument',
-            'ManifestFile': 'a_file_name',
-            'MapExports': 'true',
-            'MapFileName': 'a_file_name',
-            'MergedIDLBaseFileName': 'a_file_name',
-            'MergeSections': 'a_string',
-            'MidlCommandFile': 'a_file_name',
-            'ModuleDefinitionFile': 'a_file_name',
-            'NoEntryPoint': 'true',
-            'OptimizeReferences': '',
-            'OutputFile': 'a_file_name',
-            'PerUserRedirection': 'true',
-            'Profile': 'true',
-            'ProfileGuidedDatabase': 'a_file_name',
-            'ProgramDatabaseFile': 'a_file_name',
-            'RandomizedBaseAddress': 'false',
-            'RegisterOutput': 'true',
-            'SetChecksum': 'true',
-            'ShowProgress': 'NotSet',
-            'StackCommitSize': 'a_string',
-            'StackReserveSize': 'a_string',
-            'StripPrivateSymbols': 'a_file_name',
-            'SubSystem': 'Windows',
-            'SupportUnloadOfDelayLoadedDLL': 'true',
-            'SuppressStartupBanner': 'true',
-            'SwapRunFromCD': 'true',
-            'SwapRunFromNET': 'true',
-            'TargetMachine': 'MachineARM',
-            'TerminalServerAware': 'true',
-            'TurnOffAssemblyGeneration': 'true',
-            'TypeLibraryFile': 'a_file_name',
-            'TypeLibraryResourceID': '33',
-            'UACExecutionLevel': 'HighestAvailable',
-            'UACUIAccess': 'true',
-            'Version': 'a_string'},
-        'ResourceCompile': {
-            'AdditionalIncludeDirectories': 'folder1;folder2;folder3',
-            'AdditionalOptions': 'a_string',
-            'Culture': '0x03eb',
-            'IgnoreStandardIncludePath': 'true',
-            'PreprocessorDefinitions': 'd1;d2;d3',
-            'ResourceOutputFileName': 'a_string',
-            'ShowProgress': 'true',
-            'SuppressStartupBanner': 'true',
-            'UndefinePreprocessorDefinitions': 'd1;d2;d3'},
-        'Midl': {
-            'AdditionalIncludeDirectories': 'folder1;folder2;folder3',
-            'AdditionalOptions': 'a_string',
-            'CPreprocessOptions': 'a_string',
-            'DefaultCharType': 'Unsigned',
-            'DllDataFileName': 'a_file_name',
-            'EnableErrorChecks': 'All',
-            'ErrorCheckAllocations': 'true',
-            'ErrorCheckBounds': 'true',
-            'ErrorCheckEnumRange': 'true',
-            'ErrorCheckRefPointers': 'true',
-            'ErrorCheckStubData': 'true',
-            'GenerateStublessProxies': 'true',
-            'GenerateTypeLibrary': 'true',
-            'HeaderFileName': 'a_file_name',
-            'IgnoreStandardIncludePath': 'true',
-            'InterfaceIdentifierFileName': 'a_file_name',
-            'MkTypLibCompatible': 'true',
-            'OutputDirectory': 'a_string',
-            'PreprocessorDefinitions': 'd1;d2;d3',
-            'ProxyFileName': 'a_file_name',
-            'RedirectOutputAndErrors': 'a_file_name',
-            'StructMemberAlignment': '4',
-            'SuppressStartupBanner': 'true',
-            'TargetEnvironment': 'Win32',
-            'TypeLibraryName': 'a_file_name',
-            'UndefinePreprocessorDefinitions': 'd1;d2;d3',
-            'ValidateAllParameters': 'true',
-            'WarnAsError': 'true',
-            'WarningLevel': '4'},
-        'Lib': {
-            'AdditionalDependencies': 'file1;file2;file3',
-            'AdditionalLibraryDirectories': 'folder1;folder2;folder3',
-            'AdditionalOptions': 'a_string',
-            'ExportNamedFunctions': 'd1;d2;d3',
-            'ForceSymbolReferences': 'a_string',
-            'IgnoreAllDefaultLibraries': 'true',
-            'IgnoreSpecificDefaultLibraries': 'file1;file2;file3',
-            'ModuleDefinitionFile': 'a_file_name',
-            'OutputFile': 'a_file_name',
-            'SuppressStartupBanner': 'true',
-            'UseUnicodeResponseFiles': 'true'},
-        'Manifest': {
-            'AdditionalManifestFiles': 'file1;file2;file3',
-            'AdditionalOptions': 'a_string',
-            'AssemblyIdentity': 'a_string',
-            'ComponentFileName': 'a_file_name',
-            'GenerateCatalogFiles': 'true',
-            'InputResourceManifests': 'a_string',
-            'OutputManifestFile': 'a_file_name',
-            'RegistrarScriptFile': 'a_file_name',
-            'ReplacementsFile': 'a_file_name',
-            'SuppressStartupBanner': 'true',
-            'TypeLibraryFile': 'a_file_name',
-            'UpdateFileHashes': 'true',
-            'UpdateFileHashesSearchPath': 'a_file_name',
-            'VerboseOutput': 'true'},
-        'ManifestResourceCompile': {
-            'ResourceOutputFileName': 'my_name'},
-        'ProjectReference': {
-            'LinkLibraryDependencies': 'true',
-            'UseLibraryDependencyInputs': 'false'},
-        '': {
-            'EmbedManifest': 'true',
-            'GenerateManifest': 'true',
-            'IgnoreImportLibrary': 'true',
-            'LinkIncremental': 'false'}}
-    actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
-        msvs_settings,
-        self.stderr)
-    self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
-    self._ExpectedWarnings([])
-
-  def testConvertToMSBuildSettings_actual(self):
-    """Tests the conversion of an actual project.
-
-    A VS2008 project with most of the options defined was created through the
-    VS2008 IDE.  It was then converted to VS2010.  The tool settings found in
-    the .vcproj and .vcxproj files were converted to the two dictionaries
-    msvs_settings and expected_msbuild_settings.
-
-    Note that for many settings, the VS2010 converter adds macros like
-    %(AdditionalIncludeDirectories) to make sure than inherited values are
-    included.  Since the Gyp projects we generate do not use inheritance,
-    we removed these macros.  They were:
-        ClCompile:
-            AdditionalIncludeDirectories:  ';%(AdditionalIncludeDirectories)'
-            AdditionalOptions:  ' %(AdditionalOptions)'
-            AdditionalUsingDirectories:  ';%(AdditionalUsingDirectories)'
-            DisableSpecificWarnings: ';%(DisableSpecificWarnings)',
-            ForcedIncludeFiles:  ';%(ForcedIncludeFiles)',
-            ForcedUsingFiles:  ';%(ForcedUsingFiles)',
-            PreprocessorDefinitions:  ';%(PreprocessorDefinitions)',
-            UndefinePreprocessorDefinitions:
-                ';%(UndefinePreprocessorDefinitions)',
-        Link:
-            AdditionalDependencies:  ';%(AdditionalDependencies)',
-            AdditionalLibraryDirectories:  ';%(AdditionalLibraryDirectories)',
-            AdditionalManifestDependencies:
-                ';%(AdditionalManifestDependencies)',
-            AdditionalOptions:  ' %(AdditionalOptions)',
-            AddModuleNamesToAssembly:  ';%(AddModuleNamesToAssembly)',
-            AssemblyLinkResource:  ';%(AssemblyLinkResource)',
-            DelayLoadDLLs:  ';%(DelayLoadDLLs)',
-            EmbedManagedResourceFile:  ';%(EmbedManagedResourceFile)',
-            ForceSymbolReferences:  ';%(ForceSymbolReferences)',
-            IgnoreSpecificDefaultLibraries:
-                ';%(IgnoreSpecificDefaultLibraries)',
-        ResourceCompile:
-            AdditionalIncludeDirectories:  ';%(AdditionalIncludeDirectories)',
-            AdditionalOptions:  ' %(AdditionalOptions)',
-            PreprocessorDefinitions:  ';%(PreprocessorDefinitions)',
-        Manifest:
-            AdditionalManifestFiles:  ';%(AdditionalManifestFiles)',
-            AdditionalOptions:  ' %(AdditionalOptions)',
-            InputResourceManifests:  ';%(InputResourceManifests)',
-    """
-    msvs_settings = {
-        'VCCLCompilerTool': {
-            'AdditionalIncludeDirectories': 'dir1',
-            'AdditionalOptions': '/more',
-            'AdditionalUsingDirectories': 'test',
-            'AssemblerListingLocation': '$(IntDir)\\a',
-            'AssemblerOutput': '1',
-            'BasicRuntimeChecks': '3',
-            'BrowseInformation': '1',
-            'BrowseInformationFile': '$(IntDir)\\e',
-            'BufferSecurityCheck': 'false',
-            'CallingConvention': '1',
-            'CompileAs': '1',
-            'DebugInformationFormat': '4',
-            'DefaultCharIsUnsigned': 'true',
-            'Detect64BitPortabilityProblems': 'true',
-            'DisableLanguageExtensions': 'true',
-            'DisableSpecificWarnings': 'abc',
-            'EnableEnhancedInstructionSet': '1',
-            'EnableFiberSafeOptimizations': 'true',
-            'EnableFunctionLevelLinking': 'true',
-            'EnableIntrinsicFunctions': 'true',
-            'EnablePREfast': 'true',
-            'ErrorReporting': '2',
-            'ExceptionHandling': '2',
-            'ExpandAttributedSource': 'true',
-            'FavorSizeOrSpeed': '2',
-            'FloatingPointExceptions': 'true',
-            'FloatingPointModel': '1',
-            'ForceConformanceInForLoopScope': 'false',
-            'ForcedIncludeFiles': 'def',
-            'ForcedUsingFiles': 'ge',
-            'GeneratePreprocessedFile': '2',
-            'GenerateXMLDocumentationFiles': 'true',
-            'IgnoreStandardIncludePath': 'true',
-            'InlineFunctionExpansion': '1',
-            'KeepComments': 'true',
-            'MinimalRebuild': 'true',
-            'ObjectFile': '$(IntDir)\\b',
-            'OmitDefaultLibName': 'true',
-            'OmitFramePointers': 'true',
-            'OpenMP': 'true',
-            'Optimization': '3',
-            'PrecompiledHeaderFile': '$(IntDir)\\$(TargetName).pche',
-            'PrecompiledHeaderThrough': 'StdAfx.hd',
-            'PreprocessorDefinitions': 'WIN32;_DEBUG;_CONSOLE',
-            'ProgramDataBaseFileName': '$(IntDir)\\vc90b.pdb',
-            'RuntimeLibrary': '3',
-            'RuntimeTypeInfo': 'false',
-            'ShowIncludes': 'true',
-            'SmallerTypeCheck': 'true',
-            'StringPooling': 'true',
-            'StructMemberAlignment': '3',
-            'SuppressStartupBanner': 'false',
-            'TreatWChar_tAsBuiltInType': 'false',
-            'UndefineAllPreprocessorDefinitions': 'true',
-            'UndefinePreprocessorDefinitions': 'wer',
-            'UseFullPaths': 'true',
-            'UsePrecompiledHeader': '0',
-            'UseUnicodeResponseFiles': 'false',
-            'WarnAsError': 'true',
-            'WarningLevel': '3',
-            'WholeProgramOptimization': 'true',
-            'XMLDocumentationFileName': '$(IntDir)\\c'},
-        'VCLinkerTool': {
-            'AdditionalDependencies': 'zx',
-            'AdditionalLibraryDirectories': 'asd',
-            'AdditionalManifestDependencies': 's2',
-            'AdditionalOptions': '/mor2',
-            'AddModuleNamesToAssembly': 'd1',
-            'AllowIsolation': 'false',
-            'AssemblyDebug': '1',
-            'AssemblyLinkResource': 'd5',
-            'BaseAddress': '23423',
-            'CLRImageType': '3',
-            'CLRThreadAttribute': '1',
-            'CLRUnmanagedCodeCheck': 'true',
-            'DataExecutionPrevention': '0',
-            'DelayLoadDLLs': 'd4',
-            'DelaySign': 'true',
-            'Driver': '2',
-            'EmbedManagedResourceFile': 'd2',
-            'EnableCOMDATFolding': '1',
-            'EnableUAC': 'false',
-            'EntryPointSymbol': 'f5',
-            'ErrorReporting': '2',
-            'FixedBaseAddress': '1',
-            'ForceSymbolReferences': 'd3',
-            'FunctionOrder': 'fssdfsd',
-            'GenerateDebugInformation': 'true',
-            'GenerateManifest': 'false',
-            'GenerateMapFile': 'true',
-            'HeapCommitSize': '13',
-            'HeapReserveSize': '12',
-            'IgnoreAllDefaultLibraries': 'true',
-            'IgnoreDefaultLibraryNames': 'flob;flok',
-            'IgnoreEmbeddedIDL': 'true',
-            'IgnoreImportLibrary': 'true',
-            'ImportLibrary': 'f4',
-            'KeyContainer': 'f7',
-            'KeyFile': 'f6',
-            'LargeAddressAware': '2',
-            'LinkIncremental': '0',
-            'LinkLibraryDependencies': 'false',
-            'LinkTimeCodeGeneration': '1',
-            'ManifestFile':
-            '$(IntDir)\\$(TargetFileName).2intermediate.manifest',
-            'MapExports': 'true',
-            'MapFileName': 'd5',
-            'MergedIDLBaseFileName': 'f2',
-            'MergeSections': 'f5',
-            'MidlCommandFile': 'f1',
-            'ModuleDefinitionFile': 'sdsd',
-            'OptimizeForWindows98': '2',
-            'OptimizeReferences': '2',
-            'OutputFile': '$(OutDir)\\$(ProjectName)2.exe',
-            'PerUserRedirection': 'true',
-            'Profile': 'true',
-            'ProfileGuidedDatabase': '$(TargetDir)$(TargetName).pgdd',
-            'ProgramDatabaseFile': 'Flob.pdb',
-            'RandomizedBaseAddress': '1',
-            'RegisterOutput': 'true',
-            'ResourceOnlyDLL': 'true',
-            'SetChecksum': 'false',
-            'ShowProgress': '1',
-            'StackCommitSize': '15',
-            'StackReserveSize': '14',
-            'StripPrivateSymbols': 'd3',
-            'SubSystem': '1',
-            'SupportUnloadOfDelayLoadedDLL': 'true',
-            'SuppressStartupBanner': 'false',
-            'SwapRunFromCD': 'true',
-            'SwapRunFromNet': 'true',
-            'TargetMachine': '1',
-            'TerminalServerAware': '1',
-            'TurnOffAssemblyGeneration': 'true',
-            'TypeLibraryFile': 'f3',
-            'TypeLibraryResourceID': '12',
-            'UACExecutionLevel': '2',
-            'UACUIAccess': 'true',
-            'UseLibraryDependencyInputs': 'true',
-            'UseUnicodeResponseFiles': 'false',
-            'Version': '333'},
-        'VCResourceCompilerTool': {
-            'AdditionalIncludeDirectories': 'f3',
-            'AdditionalOptions': '/more3',
-            'Culture': '3084',
-            'IgnoreStandardIncludePath': 'true',
-            'PreprocessorDefinitions': '_UNICODE;UNICODE2',
-            'ResourceOutputFileName': '$(IntDir)/$(InputName)3.res',
-            'ShowProgress': 'true'},
-        'VCManifestTool': {
-            'AdditionalManifestFiles': 'sfsdfsd',
-            'AdditionalOptions': 'afdsdafsd',
-            'AssemblyIdentity': 'sddfdsadfsa',
-            'ComponentFileName': 'fsdfds',
-            'DependencyInformationFile': '$(IntDir)\\mt.depdfd',
-            'EmbedManifest': 'false',
-            'GenerateCatalogFiles': 'true',
-            'InputResourceManifests': 'asfsfdafs',
-            'ManifestResourceFile':
-            '$(IntDir)\\$(TargetFileName).embed.manifest.resfdsf',
-            'OutputManifestFile': '$(TargetPath).manifestdfs',
-            'RegistrarScriptFile': 'sdfsfd',
-            'ReplacementsFile': 'sdffsd',
-            'SuppressStartupBanner': 'false',
-            'TypeLibraryFile': 'sfsd',
-            'UpdateFileHashes': 'true',
-            'UpdateFileHashesSearchPath': 'sfsd',
-            'UseFAT32Workaround': 'true',
-            'UseUnicodeResponseFiles': 'false',
-            'VerboseOutput': 'true'}}
-    expected_msbuild_settings = {
-        'ClCompile': {
-            'AdditionalIncludeDirectories': 'dir1',
-            'AdditionalOptions': '/more /J',
-            'AdditionalUsingDirectories': 'test',
-            'AssemblerListingLocation': '$(IntDir)a',
-            'AssemblerOutput': 'AssemblyCode',
-            'BasicRuntimeChecks': 'EnableFastChecks',
-            'BrowseInformation': 'true',
-            'BrowseInformationFile': '$(IntDir)e',
-            'BufferSecurityCheck': 'false',
-            'CallingConvention': 'FastCall',
-            'CompileAs': 'CompileAsC',
-            'DebugInformationFormat': 'EditAndContinue',
-            'DisableLanguageExtensions': 'true',
-            'DisableSpecificWarnings': 'abc',
-            'EnableEnhancedInstructionSet': 'StreamingSIMDExtensions',
-            'EnableFiberSafeOptimizations': 'true',
-            'EnablePREfast': 'true',
-            'ErrorReporting': 'Queue',
-            'ExceptionHandling': 'Async',
-            'ExpandAttributedSource': 'true',
-            'FavorSizeOrSpeed': 'Size',
-            'FloatingPointExceptions': 'true',
-            'FloatingPointModel': 'Strict',
-            'ForceConformanceInForLoopScope': 'false',
-            'ForcedIncludeFiles': 'def',
-            'ForcedUsingFiles': 'ge',
-            'FunctionLevelLinking': 'true',
-            'GenerateXMLDocumentationFiles': 'true',
-            'IgnoreStandardIncludePath': 'true',
-            'InlineFunctionExpansion': 'OnlyExplicitInline',
-            'IntrinsicFunctions': 'true',
-            'MinimalRebuild': 'true',
-            'ObjectFileName': '$(IntDir)b',
-            'OmitDefaultLibName': 'true',
-            'OmitFramePointers': 'true',
-            'OpenMPSupport': 'true',
-            'Optimization': 'Full',
-            'PrecompiledHeader': 'NotUsing',  # Actual conversion gives ''
-            'PrecompiledHeaderFile': 'StdAfx.hd',
-            'PrecompiledHeaderOutputFile': '$(IntDir)$(TargetName).pche',
-            'PreprocessKeepComments': 'true',
-            'PreprocessorDefinitions': 'WIN32;_DEBUG;_CONSOLE',
-            'PreprocessSuppressLineNumbers': 'true',
-            'PreprocessToFile': 'true',
-            'ProgramDataBaseFileName': '$(IntDir)vc90b.pdb',
-            'RuntimeLibrary': 'MultiThreadedDebugDLL',
-            'RuntimeTypeInfo': 'false',
-            'ShowIncludes': 'true',
-            'SmallerTypeCheck': 'true',
-            'StringPooling': 'true',
-            'StructMemberAlignment': '4Bytes',
-            'SuppressStartupBanner': 'false',
-            'TreatWarningAsError': 'true',
-            'TreatWChar_tAsBuiltInType': 'false',
-            'UndefineAllPreprocessorDefinitions': 'true',
-            'UndefinePreprocessorDefinitions': 'wer',
-            'UseFullPaths': 'true',
-            'WarningLevel': 'Level3',
-            'WholeProgramOptimization': 'true',
-            'XMLDocumentationFileName': '$(IntDir)c'},
-        'Link': {
-            'AdditionalDependencies': 'zx',
-            'AdditionalLibraryDirectories': 'asd',
-            'AdditionalManifestDependencies': 's2',
-            'AdditionalOptions': '/mor2',
-            'AddModuleNamesToAssembly': 'd1',
-            'AllowIsolation': 'false',
-            'AssemblyDebug': 'true',
-            'AssemblyLinkResource': 'd5',
-            'BaseAddress': '23423',
-            'CLRImageType': 'ForceSafeILImage',
-            'CLRThreadAttribute': 'MTAThreadingAttribute',
-            'CLRUnmanagedCodeCheck': 'true',
-            'DataExecutionPrevention': '',
-            'DelayLoadDLLs': 'd4',
-            'DelaySign': 'true',
-            'Driver': 'UpOnly',
-            'EmbedManagedResourceFile': 'd2',
-            'EnableCOMDATFolding': 'false',
-            'EnableUAC': 'false',
-            'EntryPointSymbol': 'f5',
-            'FixedBaseAddress': 'false',
-            'ForceSymbolReferences': 'd3',
-            'FunctionOrder': 'fssdfsd',
-            'GenerateDebugInformation': 'true',
-            'GenerateMapFile': 'true',
-            'HeapCommitSize': '13',
-            'HeapReserveSize': '12',
-            'IgnoreAllDefaultLibraries': 'true',
-            'IgnoreEmbeddedIDL': 'true',
-            'IgnoreSpecificDefaultLibraries': 'flob;flok',
-            'ImportLibrary': 'f4',
-            'KeyContainer': 'f7',
-            'KeyFile': 'f6',
-            'LargeAddressAware': 'true',
-            'LinkErrorReporting': 'QueueForNextLogin',
-            'LinkTimeCodeGeneration': 'UseLinkTimeCodeGeneration',
-            'ManifestFile': '$(IntDir)$(TargetFileName).2intermediate.manifest',
-            'MapExports': 'true',
-            'MapFileName': 'd5',
-            'MergedIDLBaseFileName': 'f2',
-            'MergeSections': 'f5',
-            'MidlCommandFile': 'f1',
-            'ModuleDefinitionFile': 'sdsd',
-            'NoEntryPoint': 'true',
-            'OptimizeReferences': 'true',
-            'OutputFile': '$(OutDir)$(ProjectName)2.exe',
-            'PerUserRedirection': 'true',
-            'Profile': 'true',
-            'ProfileGuidedDatabase': '$(TargetDir)$(TargetName).pgdd',
-            'ProgramDatabaseFile': 'Flob.pdb',
-            'RandomizedBaseAddress': 'false',
-            'RegisterOutput': 'true',
-            'SetChecksum': 'false',
-            'ShowProgress': 'LinkVerbose',
-            'StackCommitSize': '15',
-            'StackReserveSize': '14',
-            'StripPrivateSymbols': 'd3',
-            'SubSystem': 'Console',
-            'SupportUnloadOfDelayLoadedDLL': 'true',
-            'SuppressStartupBanner': 'false',
-            'SwapRunFromCD': 'true',
-            'SwapRunFromNET': 'true',
-            'TargetMachine': 'MachineX86',
-            'TerminalServerAware': 'false',
-            'TurnOffAssemblyGeneration': 'true',
-            'TypeLibraryFile': 'f3',
-            'TypeLibraryResourceID': '12',
-            'UACExecutionLevel': 'RequireAdministrator',
-            'UACUIAccess': 'true',
-            'Version': '333'},
-        'ResourceCompile': {
-            'AdditionalIncludeDirectories': 'f3',
-            'AdditionalOptions': '/more3',
-            'Culture': '0x0c0c',
-            'IgnoreStandardIncludePath': 'true',
-            'PreprocessorDefinitions': '_UNICODE;UNICODE2',
-            'ResourceOutputFileName': '$(IntDir)%(Filename)3.res',
-            'ShowProgress': 'true'},
-        'Manifest': {
-            'AdditionalManifestFiles': 'sfsdfsd',
-            'AdditionalOptions': 'afdsdafsd',
-            'AssemblyIdentity': 'sddfdsadfsa',
-            'ComponentFileName': 'fsdfds',
-            'GenerateCatalogFiles': 'true',
-            'InputResourceManifests': 'asfsfdafs',
-            'OutputManifestFile': '$(TargetPath).manifestdfs',
-            'RegistrarScriptFile': 'sdfsfd',
-            'ReplacementsFile': 'sdffsd',
-            'SuppressStartupBanner': 'false',
-            'TypeLibraryFile': 'sfsd',
-            'UpdateFileHashes': 'true',
-            'UpdateFileHashesSearchPath': 'sfsd',
-            'VerboseOutput': 'true'},
-        'ProjectReference': {
-            'LinkLibraryDependencies': 'false',
-            'UseLibraryDependencyInputs': 'true'},
-        '': {
-            'EmbedManifest': 'false',
-            'GenerateManifest': 'false',
-            'IgnoreImportLibrary': 'true',
-            'LinkIncremental': ''
-            },
-        'ManifestResourceCompile': {
-            'ResourceOutputFileName':
-            '$(IntDir)$(TargetFileName).embed.manifest.resfdsf'}
-        }
-    actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
-        msvs_settings,
-        self.stderr)
-    self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
-    self._ExpectedWarnings([])
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/tools/gyp/pylib/gyp/MSVSToolFile.py b/tools/gyp/pylib/gyp/MSVSToolFile.py
deleted file mode 100644
index 74e529a..0000000
--- a/tools/gyp/pylib/gyp/MSVSToolFile.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Visual Studio project reader/writer."""
-
-import gyp.common
-import gyp.easy_xml as easy_xml
-
-
-class Writer(object):
-  """Visual Studio XML tool file writer."""
-
-  def __init__(self, tool_file_path, name):
-    """Initializes the tool file.
-
-    Args:
-      tool_file_path: Path to the tool file.
-      name: Name of the tool file.
-    """
-    self.tool_file_path = tool_file_path
-    self.name = name
-    self.rules_section = ['Rules']
-
-  def AddCustomBuildRule(self, name, cmd, description,
-                         additional_dependencies,
-                         outputs, extensions):
-    """Adds a rule to the tool file.
-
-    Args:
-      name: Name of the rule.
-      description: Description of the rule.
-      cmd: Command line of the rule.
-      additional_dependencies: other files which may trigger the rule.
-      outputs: outputs of the rule.
-      extensions: extensions handled by the rule.
-    """
-    rule = ['CustomBuildRule',
-            {'Name': name,
-             'ExecutionDescription': description,
-             'CommandLine': cmd,
-             'Outputs': ';'.join(outputs),
-             'FileExtensions': ';'.join(extensions),
-             'AdditionalDependencies':
-                 ';'.join(additional_dependencies)
-            }]
-    self.rules_section.append(rule)
-
-  def WriteIfChanged(self):
-    """Writes the tool file."""
-    content = ['VisualStudioToolFile',
-               {'Version': '8.00',
-                'Name': self.name
-               },
-               self.rules_section
-               ]
-    easy_xml.WriteXmlIfChanged(content, self.tool_file_path,
-                               encoding="Windows-1252")
diff --git a/tools/gyp/pylib/gyp/MSVSUserFile.py b/tools/gyp/pylib/gyp/MSVSUserFile.py
deleted file mode 100644
index 6c07e9a..0000000
--- a/tools/gyp/pylib/gyp/MSVSUserFile.py
+++ /dev/null
@@ -1,147 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Visual Studio user preferences file writer."""
-
-import os
-import re
-import socket # for gethostname
-
-import gyp.common
-import gyp.easy_xml as easy_xml
-
-
-#------------------------------------------------------------------------------
-
-def _FindCommandInPath(command):
-  """If there are no slashes in the command given, this function
-     searches the PATH env to find the given command, and converts it
-     to an absolute path.  We have to do this because MSVS is looking
-     for an actual file to launch a debugger on, not just a command
-     line.  Note that this happens at GYP time, so anything needing to
-     be built needs to have a full path."""
-  if '/' in command or '\\' in command:
-    # If the command already has path elements (either relative or
-    # absolute), then assume it is constructed properly.
-    return command
-  else:
-    # Search through the path list and find an existing file that
-    # we can access.
-    paths = os.environ.get('PATH','').split(os.pathsep)
-    for path in paths:
-      item = os.path.join(path, command)
-      if os.path.isfile(item) and os.access(item, os.X_OK):
-        return item
-  return command
-
-def _QuoteWin32CommandLineArgs(args):
-  new_args = []
-  for arg in args:
-    # Replace all double-quotes with double-double-quotes to escape
-    # them for cmd shell, and then quote the whole thing if there
-    # are any.
-    if arg.find('"') != -1:
-      arg = '""'.join(arg.split('"'))
-      arg = '"%s"' % arg
-
-    # Otherwise, if there are any spaces, quote the whole arg.
-    elif re.search(r'[ \t\n]', arg):
-      arg = '"%s"' % arg
-    new_args.append(arg)
-  return new_args
-
-class Writer(object):
-  """Visual Studio XML user user file writer."""
-
-  def __init__(self, user_file_path, version, name):
-    """Initializes the user file.
-
-    Args:
-      user_file_path: Path to the user file.
-      version: Version info.
-      name: Name of the user file.
-    """
-    self.user_file_path = user_file_path
-    self.version = version
-    self.name = name
-    self.configurations = {}
-
-  def AddConfig(self, name):
-    """Adds a configuration to the project.
-
-    Args:
-      name: Configuration name.
-    """
-    self.configurations[name] = ['Configuration', {'Name': name}]
-
-  def AddDebugSettings(self, config_name, command, environment = {},
-                       working_directory=""):
-    """Adds a DebugSettings node to the user file for a particular config.
-
-    Args:
-      command: command line to run.  First element in the list is the
-        executable.  All elements of the command will be quoted if
-        necessary.
-      working_directory: other files which may trigger the rule. (optional)
-    """
-    command = _QuoteWin32CommandLineArgs(command)
-
-    abs_command = _FindCommandInPath(command[0])
-
-    if environment and isinstance(environment, dict):
-      env_list = ['%s="%s"' % (key, val)
-                  for (key,val) in environment.iteritems()]
-      environment = ' '.join(env_list)
-    else:
-      environment = ''
-
-    n_cmd = ['DebugSettings',
-             {'Command': abs_command,
-              'WorkingDirectory': working_directory,
-              'CommandArguments': " ".join(command[1:]),
-              'RemoteMachine': socket.gethostname(),
-              'Environment': environment,
-              'EnvironmentMerge': 'true',
-              # Currently these are all "dummy" values that we're just setting
-              # in the default manner that MSVS does it.  We could use some of
-              # these to add additional capabilities, I suppose, but they might
-              # not have parity with other platforms then.
-              'Attach': 'false',
-              'DebuggerType': '3',  # 'auto' debugger
-              'Remote': '1',
-              'RemoteCommand': '',
-              'HttpUrl': '',
-              'PDBPath': '',
-              'SQLDebugging': '',
-              'DebuggerFlavor': '0',
-              'MPIRunCommand': '',
-              'MPIRunArguments': '',
-              'MPIRunWorkingDirectory': '',
-              'ApplicationCommand': '',
-              'ApplicationArguments': '',
-              'ShimCommand': '',
-              'MPIAcceptMode': '',
-              'MPIAcceptFilter': ''
-             }]
-
-    # Find the config, and add it if it doesn't exist.
-    if config_name not in self.configurations:
-      self.AddConfig(config_name)
-
-    # Add the DebugSettings onto the appropriate config.
-    self.configurations[config_name].append(n_cmd)
-
-  def WriteIfChanged(self):
-    """Writes the user file."""
-    configs = ['Configurations']
-    for config, spec in sorted(self.configurations.iteritems()):
-      configs.append(spec)
-
-    content = ['VisualStudioUserFile',
-               {'Version': self.version.ProjectVersion(),
-                'Name': self.name
-               },
-               configs]
-    easy_xml.WriteXmlIfChanged(content, self.user_file_path,
-                               encoding="Windows-1252")
diff --git a/tools/gyp/pylib/gyp/MSVSUtil.py b/tools/gyp/pylib/gyp/MSVSUtil.py
deleted file mode 100644
index 41d7ab2..0000000
--- a/tools/gyp/pylib/gyp/MSVSUtil.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright (c) 2013 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Utility functions shared amongst the Windows generators."""
-
-import copy
-
-def _ShardName(name, number):
-  """Add a shard number to the end of a target.
-
-  Arguments:
-    name: name of the target (foo#target)
-    number: shard number
-  Returns:
-    Target name with shard added (foo_1#target)
-  """
-  parts = name.rsplit('#', 1)
-  parts[0] = '%s_%d' % (parts[0], number)
-  return '#'.join(parts)
-
-
-def ShardTargets(target_list, target_dicts):
-  """Shard some targets apart to work around the linkers limits.
-
-  Arguments:
-    target_list: List of target pairs: 'base/base.gyp:base'.
-    target_dicts: Dict of target properties keyed on target pair.
-  Returns:
-    Tuple of the new sharded versions of the inputs.
-  """
-  # Gather the targets to shard, and how many pieces.
-  targets_to_shard = {}
-  for t in target_dicts:
-    shards = int(target_dicts[t].get('msvs_shard', 0))
-    if shards:
-      targets_to_shard[t] = shards
-  # Shard target_list.
-  new_target_list = []
-  for t in target_list:
-    if t in targets_to_shard:
-      for i in range(targets_to_shard[t]):
-        new_target_list.append(_ShardName(t, i))
-    else:
-      new_target_list.append(t)
-  # Shard target_dict.
-  new_target_dicts = {}
-  for t in target_dicts:
-    if t in targets_to_shard:
-      for i in range(targets_to_shard[t]):
-        name = _ShardName(t, i)
-        new_target_dicts[name] = copy.copy(target_dicts[t])
-        new_target_dicts[name]['target_name'] = _ShardName(
-             new_target_dicts[name]['target_name'], i)
-        sources = new_target_dicts[name].get('sources', [])
-        new_sources = []
-        for pos in range(i, len(sources), targets_to_shard[t]):
-          new_sources.append(sources[pos])
-        new_target_dicts[name]['sources'] = new_sources
-    else:
-      new_target_dicts[t] = target_dicts[t]
-  # Shard dependencies.
-  for t in new_target_dicts:
-    dependencies = copy.copy(new_target_dicts[t].get('dependencies', []))
-    new_dependencies = []
-    for d in dependencies:
-      if d in targets_to_shard:
-        for i in range(targets_to_shard[d]):
-          new_dependencies.append(_ShardName(d, i))
-      else:
-        new_dependencies.append(d)
-    new_target_dicts[t]['dependencies'] = new_dependencies
-
-  return (new_target_list, new_target_dicts)
diff --git a/tools/gyp/pylib/gyp/MSVSVersion.py b/tools/gyp/pylib/gyp/MSVSVersion.py
deleted file mode 100644
index 6478510..0000000
--- a/tools/gyp/pylib/gyp/MSVSVersion.py
+++ /dev/null
@@ -1,410 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Handle version information related to Visual Stuio."""
-
-import errno
-import os
-import re
-import subprocess
-import sys
-import gyp
-
-
-class VisualStudioVersion(object):
-  """Information regarding a version of Visual Studio."""
-
-  def __init__(self, short_name, description,
-               solution_version, project_version, flat_sln, uses_vcxproj,
-               path, sdk_based, default_toolset=None):
-    self.short_name = short_name
-    self.description = description
-    self.solution_version = solution_version
-    self.project_version = project_version
-    self.flat_sln = flat_sln
-    self.uses_vcxproj = uses_vcxproj
-    self.path = path
-    self.sdk_based = sdk_based
-    self.default_toolset = default_toolset
-
-  def ShortName(self):
-    return self.short_name
-
-  def Description(self):
-    """Get the full description of the version."""
-    return self.description
-
-  def SolutionVersion(self):
-    """Get the version number of the sln files."""
-    return self.solution_version
-
-  def ProjectVersion(self):
-    """Get the version number of the vcproj or vcxproj files."""
-    return self.project_version
-
-  def FlatSolution(self):
-    return self.flat_sln
-
-  def UsesVcxproj(self):
-    """Returns true if this version uses a vcxproj file."""
-    return self.uses_vcxproj
-
-  def ProjectExtension(self):
-    """Returns the file extension for the project."""
-    return self.uses_vcxproj and '.vcxproj' or '.vcproj'
-
-  def Path(self):
-    """Returns the path to Visual Studio installation."""
-    return self.path
-
-  def ToolPath(self, tool):
-    """Returns the path to a given compiler tool. """
-    return os.path.normpath(os.path.join(self.path, "VC/bin", tool))
-
-  def DefaultToolset(self):
-    """Returns the msbuild toolset version that will be used in the absence
-    of a user override."""
-    return self.default_toolset
-
-  def SetupScript(self, target_arch):
-    """Returns a command (with arguments) to be used to set up the
-    environment."""
-    # Check if we are running in the SDK command line environment and use
-    # the setup script from the SDK if so. |target_arch| should be either
-    # 'x86' or 'x64'.
-    assert target_arch in ('x86', 'x64')
-    sdk_dir = os.environ.get('WindowsSDKDir')
-    if self.sdk_based and sdk_dir:
-      return [os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.Cmd')),
-              '/' + target_arch]
-    else:
-      # For VS2012: We don't use VC/vcvarsall.bat for x86 because vcvarsall calls
-      # vcvars32, which it can only find if VS??COMNTOOLS is set, which it
-      # isn't always.
-      # Starting from VS2017 the tools layout was changed and we need
-      # to account for that.
-      if target_arch == 'x86':
-        batCandidate = os.path.normpath(
-          os.path.join(self.path, 'Common7/Tools/vsvars32.bat'))
-        if not os.path.exists(batCandidate):
-          batCandidate = os.path.normpath(
-          os.path.join(self.path, 'VC/Auxiliary/Build/vcvars32.bat'))
-        return [batCandidate]
-      else:
-        assert target_arch == 'x64'
-        arg = 'x86_amd64'
-        if (os.environ.get('PROCESSOR_ARCHITECTURE') == 'AMD64' or
-            os.environ.get('PROCESSOR_ARCHITEW6432') == 'AMD64'):
-          # Use the 64-on-64 compiler if we can.
-          arg = 'amd64'
-        batCandidate = os.path.normpath(
-            os.path.join(self.path, 'VC/vcvarsall.bat'))
-        if not os.path.exists(batCandidate):
-          batCandidate = os.path.normpath(
-            os.path.join(self.path, 'VC/Auxiliary/Build/vcvarsall.bat'))
-        return [batCandidate, arg]
-
-
-def _RegistryQueryBase(sysdir, key, value):
-  """Use reg.exe to read a particular key.
-
-  While ideally we might use the win32 module, we would like gyp to be
-  python neutral, so for instance cygwin python lacks this module.
-
-  Arguments:
-    sysdir: The system subdirectory to attempt to launch reg.exe from.
-    key: The registry key to read from.
-    value: The particular value to read.
-  Return:
-    stdout from reg.exe, or None for failure.
-  """
-  # Skip if not on Windows or Python Win32 setup issue
-  if sys.platform not in ('win32', 'cygwin'):
-    return None
-  # Setup params to pass to and attempt to launch reg.exe
-  cmd = [os.path.join(os.environ.get('WINDIR', ''), sysdir, 'reg.exe'),
-         'query', key]
-  if value:
-    cmd.extend(['/v', value])
-  p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  # Obtain the stdout from reg.exe, reading to the end so p.returncode is valid
-  # Note that the error text may be in [1] in some cases
-  text = p.communicate()[0]
-  # Check return code from reg.exe; officially 0==success and 1==error
-  if p.returncode:
-    return None
-  return text
-
-
-def _RegistryQuery(key, value=None):
-  """Use reg.exe to read a particular key through _RegistryQueryBase.
-
-  First tries to launch from %WinDir%\Sysnative to avoid WoW64 redirection. If
-  that fails, it falls back to System32.  Sysnative is available on Vista and
-  up and available on Windows Server 2003 and XP through KB patch 942589. Note
-  that Sysnative will always fail if using 64-bit python due to it being a
-  virtual directory and System32 will work correctly in the first place.
-
-  KB 942589 - http://support.microsoft.com/kb/942589/en-us.
-
-  Arguments:
-    key: The registry key.
-    value: The particular registry value to read (optional).
-  Return:
-    stdout from reg.exe, or None for failure.
-  """
-  text = None
-  try:
-    text = _RegistryQueryBase('Sysnative', key, value)
-  except OSError, e:
-    if e.errno == errno.ENOENT:
-      text = _RegistryQueryBase('System32', key, value)
-    else:
-      raise
-  return text
-
-
-def _RegistryGetValue(key, value):
-  """Use reg.exe to obtain the value of a registry key.
-
-  Args:
-    key: The registry key.
-    value: The particular registry value to read.
-  Return:
-    contents of the registry key's value, or None on failure.
-  """
-  text = _RegistryQuery(key, value)
-  if not text:
-    return None
-  # Extract value.
-  match = re.search(r'REG_\w+\s+([^\r]+)\r\n', text)
-  if not match:
-    return None
-  return match.group(1)
-
-
-def _RegistryKeyExists(key):
-  """Use reg.exe to see if a key exists.
-
-  Args:
-    key: The registry key to check.
-  Return:
-    True if the key exists
-  """
-  if not _RegistryQuery(key):
-    return False
-  return True
-
-
-def _CreateVersion(name, path, sdk_based=False):
-  """Sets up MSVS project generation.
-
-  Setup is based off the GYP_MSVS_VERSION environment variable or whatever is
-  autodetected if GYP_MSVS_VERSION is not explicitly specified. If a version is
-  passed in that doesn't match a value in versions python will throw a error.
-  """
-  if path:
-    path = os.path.normpath(path)
-  versions = {
-      '2017': VisualStudioVersion('2017',
-                                  'Visual Studio 2017',
-                                  solution_version='12.0',
-                                  project_version='14.0',
-                                  flat_sln=False,
-                                  uses_vcxproj=True,
-                                  path=path,
-                                  sdk_based=sdk_based,
-                                  default_toolset='v141'),
-      '2012': VisualStudioVersion('2012',
-                                  'Visual Studio 2012',
-                                  solution_version='12.00',
-                                  project_version='4.0',
-                                  flat_sln=False,
-                                  uses_vcxproj=True,
-                                  path=path,
-                                  sdk_based=sdk_based,
-                                  default_toolset='v110'),
-      '2012e': VisualStudioVersion('2012e',
-                                   'Visual Studio 2012',
-                                   solution_version='12.00',
-                                   project_version='4.0',
-                                   flat_sln=True,
-                                   uses_vcxproj=True,
-                                   path=path,
-                                   sdk_based=sdk_based,
-                                   default_toolset='v110'),
-      '2010': VisualStudioVersion('2010',
-                                  'Visual Studio 2010',
-                                  solution_version='11.00',
-                                  project_version='4.0',
-                                  flat_sln=False,
-                                  uses_vcxproj=True,
-                                  path=path,
-                                  sdk_based=sdk_based),
-      '2010e': VisualStudioVersion('2010e',
-                                   'Visual Studio 2010',
-                                   solution_version='11.00',
-                                   project_version='4.0',
-                                   flat_sln=True,
-                                   uses_vcxproj=True,
-                                   path=path,
-                                   sdk_based=sdk_based),
-      '2008': VisualStudioVersion('2008',
-                                  'Visual Studio 2008',
-                                  solution_version='10.00',
-                                  project_version='9.00',
-                                  flat_sln=False,
-                                  uses_vcxproj=False,
-                                  path=path,
-                                  sdk_based=sdk_based),
-      '2008e': VisualStudioVersion('2008e',
-                                   'Visual Studio 2008',
-                                   solution_version='10.00',
-                                   project_version='9.00',
-                                   flat_sln=True,
-                                   uses_vcxproj=False,
-                                   path=path,
-                                   sdk_based=sdk_based),
-      '2005': VisualStudioVersion('2005',
-                                  'Visual Studio 2005',
-                                  solution_version='9.00',
-                                  project_version='8.00',
-                                  flat_sln=False,
-                                  uses_vcxproj=False,
-                                  path=path,
-                                  sdk_based=sdk_based),
-      '2005e': VisualStudioVersion('2005e',
-                                   'Visual Studio 2005',
-                                   solution_version='9.00',
-                                   project_version='8.00',
-                                   flat_sln=True,
-                                   uses_vcxproj=False,
-                                   path=path,
-                                   sdk_based=sdk_based),
-  }
-  return versions[str(name)]
-
-
-def _ConvertToCygpath(path):
-  """Convert to cygwin path if we are using cygwin."""
-  if sys.platform == 'cygwin':
-    p = subprocess.Popen(['cygpath', path], stdout=subprocess.PIPE)
-    path = p.communicate()[0].strip()
-  return path
-
-
-def _DetectVisualStudioVersions(versions_to_check, force_express,
-                                vs_install_dir=None):
-  """Collect the list of installed visual studio versions.
-
-  Returns:
-    A list of visual studio versions installed in descending order of
-    usage preference.
-    Base this on the registry and a quick check if devenv.exe exists.
-    Only versions 8-10 are considered.
-    Possibilities are:
-      2005(e) - Visual Studio 2005 (8)
-      2008(e) - Visual Studio 2008 (9)
-      2010(e) - Visual Studio 2010 (10)
-      2012(e) - Visual Studio 2012 (11)
-    Where (e) is e for express editions of MSVS and blank otherwise.
-  """
-  version_to_year = {
-      '8.0': '2005', '9.0': '2008', '10.0': '2010', '11.0': '2012',
-      '14.0': '2015', '15.0': '2017'}
-  versions = []
-  for version in versions_to_check:
-    if version == '15.0':
-      # Version 15 does not include registry entries.
-      if vs_install_dir:
-        path = os.path.join(vs_install_dir, r'Common7\IDE')
-      else:
-        path = r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE'
-        if not os.path.exists(path):
-          path = r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE'
-      path = _ConvertToCygpath(path)
-      devenv_path = os.path.join(path, 'devenv.exe')
-      devenv_ini_path = os.path.join(path, 'devenv.isolation.ini')
-      if (os.path.exists(devenv_path) or os.path.exists(devenv_ini_path)) and version in version_to_year:
-        versions.append(_CreateVersion(version_to_year[version],
-            os.path.join(path, '..', '..')))
-      else:
-          print('_DetectVisualStudioVersion() did not find Visual Studio 2017 (v15.0)')
-      continue
-    # Old method of searching for which VS version is installed
-    # We don't use the 2010-encouraged-way because we also want to get the
-    # path to the binaries, which it doesn't offer.
-    keys = [r'HKLM\Software\Microsoft\VisualStudio\%s' % version,
-            r'HKLM\Software\Wow6432Node\Microsoft\VisualStudio\%s' % version,
-            r'HKLM\Software\Microsoft\VCExpress\%s' % version,
-            r'HKLM\Software\Wow6432Node\Microsoft\VCExpress\%s' % version]
-    for index in range(len(keys)):
-      path = _RegistryGetValue(keys[index], 'InstallDir')
-      if not path:
-        continue
-      path = _ConvertToCygpath(path)
-      # Check for full.
-      full_path = os.path.join(path, 'devenv.exe')
-      express_path = os.path.join(path, 'vcexpress.exe')
-      if (not force_express and os.path.exists(full_path) and
-          version in version_to_year):
-        # Add this one.
-        versions.append(_CreateVersion(version_to_year[version],
-            os.path.join(path, '..', '..')))
-      # Check for express.
-      elif os.path.exists(express_path) and version in version_to_year:
-        # Add this one.
-        versions.append(_CreateVersion(version_to_year[version] + 'e',
-            os.path.join(path, '..', '..')))
-
-    # The old method above does not work when only SDK is installed.
-    keys = [r'HKLM\Software\Microsoft\VisualStudio\SxS\VC7',
-            r'HKLM\Software\Wow6432Node\Microsoft\VisualStudio\SxS\VC7']
-    for index in range(len(keys)):
-      path = _RegistryGetValue(keys[index], version)
-      if not path:
-        continue
-      path = _ConvertToCygpath(path)
-      if version in version_to_year:
-        versions.append(_CreateVersion(version_to_year[version] + 'e',
-            os.path.join(path, '..'), sdk_based=True))
-  return versions
-
-
-def SelectVisualStudioVersion(version='auto'):
-  """Select which version of Visual Studio projects to generate.
-
-  Arguments:
-    version: Hook to allow caller to force a particular version (vs auto).
-  Returns:
-    An object representing a visual studio project format version.
-  """
-  # In auto mode, check environment variable for override.
-  if version == 'auto':
-    version = os.environ.get('GYP_MSVS_VERSION', 'auto')
-  version_map = {
-    'auto': ('10.0', '9.0', '8.0', '11.0', '12.0'),
-    '2005': ('8.0',),
-    '2005e': ('8.0',),
-    '2008': ('9.0',),
-    '2008e': ('9.0',),
-    '2010': ('10.0',),
-    '2010e': ('10.0',),
-    '2012': ('11.0',),
-    '2012e': ('11.0',),
-    '2017': ('15.0',),
-  }
-
-  version = str(version)
-  vs_install_dir = os.environ.get('VS_INSTALL_DIR')
-  versions = _DetectVisualStudioVersions(version_map[version], 'e' in version,
-                                         vs_install_dir)
-
-  if not versions:
-    if version == 'auto':
-      # Default to 2005 if we couldn't find anything
-      return _CreateVersion('2005', None)
-    else:
-      return _CreateVersion(version, path=vs_install_dir)
-  return versions[0]
diff --git a/tools/gyp/pylib/gyp/SCons.py b/tools/gyp/pylib/gyp/SCons.py
deleted file mode 100644
index 42d845e..0000000
--- a/tools/gyp/pylib/gyp/SCons.py
+++ /dev/null
@@ -1,199 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-SCons generator.
-
-This contains class definitions and supporting functions for generating
-pieces of SCons files for the different types of GYP targets.
-"""
-
-import os
-
-
-def WriteList(fp, list, prefix='',
-                        separator=',\n    ',
-                        preamble=None,
-                        postamble=None):
-  fp.write(preamble or '')
-  fp.write((separator or ' ').join([prefix + l for l in list]))
-  fp.write(postamble or '')
-
-
-class TargetBase(object):
-  """
-  Base class for a SCons representation of a GYP target.
-  """
-  is_ignored = False
-  target_prefix = ''
-  target_suffix = ''
-  def __init__(self, spec):
-    self.spec = spec
-  def full_product_name(self):
-    """
-    Returns the full name of the product being built:
-
-      * Uses 'product_name' if it's set, else prefix + 'target_name'.
-      * Prepends 'product_dir' if set.
-      * Appends SCons suffix variables for the target type (or
-        product_extension).
-    """
-    suffix = self.target_suffix
-    product_extension = self.spec.get('product_extension')
-    if product_extension:
-      suffix = '.' + product_extension
-    prefix = self.spec.get('product_prefix', self.target_prefix)
-    name = self.spec['target_name']
-    name = prefix + self.spec.get('product_name', name) + suffix
-    product_dir = self.spec.get('product_dir')
-    if product_dir:
-      name = os.path.join(product_dir, name)
-    else:
-      name = os.path.join(self.out_dir, name)
-    return name
-
-  def write_input_files(self, fp):
-    """
-    Writes the definition of the input files (sources).
-    """
-    sources = self.spec.get('sources')
-    if not sources:
-      fp.write('\ninput_files = []\n')
-      return
-    preamble = '\ninput_files = [\n    '
-    postamble = ',\n]\n'
-    WriteList(fp, map(repr, sources), preamble=preamble, postamble=postamble)
-
-  def builder_call(self):
-    """
-    Returns the actual SCons builder call to build this target.
-    """
-    name = self.full_product_name()
-    return 'env.%s(env.File(%r), input_files)' % (self.builder_name, name)
-  def write_target(self, fp, src_dir='', pre=''):
-    """
-    Writes the lines necessary to build this target.
-    """
-    fp.write('\n' + pre)
-    fp.write('_outputs = %s\n' % self.builder_call())
-    fp.write('target_files.extend(_outputs)\n')
-
-
-class NoneTarget(TargetBase):
-  """
-  A GYP target type of 'none', implicitly or explicitly.
-  """
-  def write_target(self, fp, src_dir='', pre=''):
-    fp.write('\ntarget_files.extend(input_files)\n')
-
-
-class SettingsTarget(TargetBase):
-  """
-  A GYP target type of 'settings'.
-  """
-  is_ignored = True
-
-
-compilable_sources_template = """
-_result = []
-for infile in input_files:
-  if env.compilable(infile):
-    if (type(infile) == type('')
-        and (infile.startswith(%(src_dir)r)
-             or not os.path.isabs(env.subst(infile)))):
-      # Force files below the build directory by replacing all '..'
-      # elements in the path with '__':
-      base, ext = os.path.splitext(os.path.normpath(infile))
-      base = [d == '..' and '__' or d for d in base.split('/')]
-      base = os.path.join(*base)
-      object = '${OBJ_DIR}/${COMPONENT_NAME}/${TARGET_NAME}/' + base
-      if not infile.startswith(%(src_dir)r):
-        infile = %(src_dir)r + infile
-      infile = env.%(name)s(object, infile)[0]
-    else:
-      infile = env.%(name)s(infile)[0]
-  _result.append(infile)
-input_files = _result
-"""
-
-class CompilableSourcesTargetBase(TargetBase):
-  """
-  An abstract base class for targets that compile their source files.
-
-  We explicitly transform compilable files into object files,
-  even though SCons could infer that for us, because we want
-  to control where the object file ends up.  (The implicit rules
-  in SCons always put the object file next to the source file.)
-  """
-  intermediate_builder_name = None
-  def write_target(self, fp, src_dir='', pre=''):
-    if self.intermediate_builder_name is None:
-      raise NotImplementedError
-    if src_dir and not src_dir.endswith('/'):
-      src_dir += '/'
-    variables = {
-        'src_dir': src_dir,
-        'name': self.intermediate_builder_name,
-    }
-    fp.write(compilable_sources_template % variables)
-    super(CompilableSourcesTargetBase, self).write_target(fp)
-
-
-class ProgramTarget(CompilableSourcesTargetBase):
-  """
-  A GYP target type of 'executable'.
-  """
-  builder_name = 'GypProgram'
-  intermediate_builder_name = 'StaticObject'
-  target_prefix = '${PROGPREFIX}'
-  target_suffix = '${PROGSUFFIX}'
-  out_dir = '${TOP_BUILDDIR}'
-
-
-class StaticLibraryTarget(CompilableSourcesTargetBase):
-  """
-  A GYP target type of 'static_library'.
-  """
-  builder_name = 'GypStaticLibrary'
-  intermediate_builder_name = 'StaticObject'
-  target_prefix = '${LIBPREFIX}'
-  target_suffix = '${LIBSUFFIX}'
-  out_dir = '${LIB_DIR}'
-
-
-class SharedLibraryTarget(CompilableSourcesTargetBase):
-  """
-  A GYP target type of 'shared_library'.
-  """
-  builder_name = 'GypSharedLibrary'
-  intermediate_builder_name = 'SharedObject'
-  target_prefix = '${SHLIBPREFIX}'
-  target_suffix = '${SHLIBSUFFIX}'
-  out_dir = '${LIB_DIR}'
-
-
-class LoadableModuleTarget(CompilableSourcesTargetBase):
-  """
-  A GYP target type of 'loadable_module'.
-  """
-  builder_name = 'GypLoadableModule'
-  intermediate_builder_name = 'SharedObject'
-  target_prefix = '${SHLIBPREFIX}'
-  target_suffix = '${SHLIBSUFFIX}'
-  out_dir = '${TOP_BUILDDIR}'
-
-
-TargetMap = {
-  None : NoneTarget,
-  'none' : NoneTarget,
-  'settings' : SettingsTarget,
-  'executable' : ProgramTarget,
-  'static_library' : StaticLibraryTarget,
-  'shared_library' : SharedLibraryTarget,
-  'loadable_module' : LoadableModuleTarget,
-}
-
-
-def Target(spec):
-  return TargetMap[spec.get('type')](spec)
diff --git a/tools/gyp/pylib/gyp/__init__.py b/tools/gyp/pylib/gyp/__init__.py
deleted file mode 100755
index 06c107f..0000000
--- a/tools/gyp/pylib/gyp/__init__.py
+++ /dev/null
@@ -1,549 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import copy
-import gyp.input
-import optparse
-import os.path
-import re
-import shlex
-import sys
-import traceback
-from gyp.common import GypError
-
-if sys.platform == 'cygwin':
-  import cygpath
-
-# Default debug modes for GYP
-debug = {}
-
-# List of "official" debug modes, but you can use anything you like.
-DEBUG_GENERAL = 'general'
-DEBUG_VARIABLES = 'variables'
-DEBUG_INCLUDES = 'includes'
-DEBUG_DEPENDENCIES = 'dependencies'
-
-
-def DebugOutput(mode, message):
-  if 'all' in gyp.debug.keys() or mode in gyp.debug.keys():
-    ctx = ('unknown', 0, 'unknown')
-    try:
-      f = traceback.extract_stack(limit=2)
-      if f:
-        ctx = f[0][:3]
-    except:
-      pass
-    print '%s:%s:%d:%s %s' % (mode.upper(), os.path.basename(ctx[0]),
-                              ctx[1], ctx[2], message)
-
-def FindBuildFiles():
-  extension = '.gyp'
-  files = os.listdir(os.getcwd())
-  build_files = []
-  for file in files:
-    if file.endswith(extension):
-      build_files.append(file)
-  return build_files
-
-
-def Load(build_files, format, default_variables={},
-         includes=[], depth='.', params=None, check=False,
-         circular_check=True):
-  """
-  Loads one or more specified build files.
-  default_variables and includes will be copied before use.
-  Returns the generator for the specified format and the
-  data returned by loading the specified build files.
-  """
-  if params is None:
-    params = {}
-
-  flavor = None
-  if '-' in format:
-    format, params['flavor'] = format.split('-', 1)
-
-  generators = []
-  formats = format.split(',')
-
-  for format_name in formats:
-    # Format can be a custom python file, or by default the name of a module
-    # within gyp.generator.
-    if format_name.endswith('.py'):
-      generator_name = os.path.splitext(format_name)[0]
-      path, generator_name = os.path.split(generator_name)
-
-      # Make sure the path to the custom generator is in sys.path
-      # Don't worry about removing it once we are done.  Keeping the path
-      # to each generator that is used in sys.path is likely harmless and
-      # arguably a good idea.
-      path = os.path.abspath(path)
-      if path not in sys.path:
-        sys.path.insert(0, path)
-    else:
-      generator_name = 'gyp.generator.' + format_name
-
-    # These parameters are passed in order (as opposed to by key)
-    # because ActivePython cannot handle key parameters to __import__.
-    generators.append(
-        __import__(generator_name, globals(), locals(), generator_name))
-
-  # Treat the first generator as the main generator and use its settings
-  # to load generator input
-  generator = generators[0]
-
-  default_variables = copy.copy(default_variables)
-
-  # Default variables provided by this program and its modules should be
-  # named WITH_CAPITAL_LETTERS to provide a distinct "best practice" namespace,
-  # avoiding collisions with user and automatic variables.
-  default_variables['GENERATOR'] = formats[0]
-
-  for (key, val) in generator.GetGeneratorVariables(params['flavor']).items():
-    default_variables.setdefault(key, val)
-
-  # Give the generator the opportunity to set additional variables based on
-  # the params it will receive in the output phase.
-  if getattr(generator, 'CalculateVariables', None):
-    generator.CalculateVariables(default_variables, params)
-
-  # Give the generator the opportunity to set generator_input_info based on
-  # the params it will receive in the output phase.
-  if getattr(generator, 'CalculateGeneratorInputInfo', None):
-    generator.CalculateGeneratorInputInfo(params)
-
-  # Fetch the generator specific info that gets fed to input, we use getattr
-  # so we can default things and the generators only have to provide what
-  # they need.
-  generator_input_info = {
-    'generator_wants_absolute_build_file_paths':
-        getattr(generator, 'generator_wants_absolute_build_file_paths', False),
-    'generator_handles_variants':
-        getattr(generator, 'generator_handles_variants', False),
-    'non_configuration_keys':
-        getattr(generator, 'generator_additional_non_configuration_keys', []),
-    'path_sections':
-        getattr(generator, 'generator_additional_path_sections', []),
-    'extra_sources_for_rules':
-        getattr(generator, 'generator_extra_sources_for_rules', []),
-    'generator_supports_multiple_toolsets':
-        getattr(generator, 'generator_supports_multiple_toolsets', False),
-    'generator_wants_static_library_dependencies_adjusted':
-        getattr(generator,
-                'generator_wants_static_library_dependencies_adjusted', True),
-    'generator_wants_sorted_dependencies':
-        getattr(generator, 'generator_wants_sorted_dependencies', False),
-    'generator_filelist_paths':
-        getattr(generator, 'generator_filelist_paths', None),
-  }
-
-  # Process the input specific to this generator.
-  result = gyp.input.Load(build_files, default_variables, includes[:],
-                          depth, generator_input_info, check, circular_check,
-                          params['parallel'])
-  return [generators] + result
-
-def NameValueListToDict(name_value_list):
-  """
-  Takes an array of strings of the form 'NAME=VALUE' and creates a dictionary
-  of the pairs.  If a string is simply NAME, then the value in the dictionary
-  is set to True.  If VALUE can be converted to an integer, it is.
-  """
-  result = { }
-  for item in name_value_list:
-    tokens = item.split('=', 1)
-    if len(tokens) == 2:
-      # If we can make it an int, use that, otherwise, use the string.
-      try:
-        token_value = int(tokens[1])
-      except ValueError:
-        token_value = tokens[1]
-      # Set the variable to the supplied value.
-      result[tokens[0]] = token_value
-    else:
-      # No value supplied, treat it as a boolean and set it.
-      result[tokens[0]] = True
-  return result
-
-def ShlexEnv(env_name):
-  flags = os.environ.get(env_name, [])
-  if flags:
-    flags = shlex.split(flags)
-  return flags
-
-def FormatOpt(opt, value):
-  if opt.startswith('--'):
-    return '%s=%s' % (opt, value)
-  return opt + value
-
-def RegenerateAppendFlag(flag, values, predicate, env_name, options):
-  """Regenerate a list of command line flags, for an option of action='append'.
-
-  The |env_name|, if given, is checked in the environment and used to generate
-  an initial list of options, then the options that were specified on the
-  command line (given in |values|) are appended.  This matches the handling of
-  environment variables and command line flags where command line flags override
-  the environment, while not requiring the environment to be set when the flags
-  are used again.
-  """
-  flags = []
-  if options.use_environment and env_name:
-    for flag_value in ShlexEnv(env_name):
-      value = FormatOpt(flag, predicate(flag_value))
-      if value in flags:
-        flags.remove(value)
-      flags.append(value)
-  if values:
-    for flag_value in values:
-      flags.append(FormatOpt(flag, predicate(flag_value)))
-  return flags
-
-def RegenerateFlags(options):
-  """Given a parsed options object, and taking the environment variables into
-  account, returns a list of flags that should regenerate an equivalent options
-  object (even in the absence of the environment variables.)
-
-  Any path options will be normalized relative to depth.
-
-  The format flag is not included, as it is assumed the calling generator will
-  set that as appropriate.
-  """
-  def FixPath(path):
-    path = gyp.common.FixIfRelativePath(path, options.depth)
-    if not path:
-      return os.path.curdir
-    return path
-
-  def Noop(value):
-    return value
-
-  # We always want to ignore the environment when regenerating, to avoid
-  # duplicate or changed flags in the environment at the time of regeneration.
-  flags = ['--ignore-environment']
-  for name, metadata in options._regeneration_metadata.iteritems():
-    opt = metadata['opt']
-    value = getattr(options, name)
-    value_predicate = metadata['type'] == 'path' and FixPath or Noop
-    action = metadata['action']
-    env_name = metadata['env_name']
-    if action == 'append':
-      flags.extend(RegenerateAppendFlag(opt, value, value_predicate,
-                                        env_name, options))
-    elif action in ('store', None):  # None is a synonym for 'store'.
-      if value:
-        flags.append(FormatOpt(opt, value_predicate(value)))
-      elif options.use_environment and env_name and os.environ.get(env_name):
-        flags.append(FormatOpt(opt, value_predicate(os.environ.get(env_name))))
-    elif action in ('store_true', 'store_false'):
-      if ((action == 'store_true' and value) or
-          (action == 'store_false' and not value)):
-        flags.append(opt)
-      elif options.use_environment and env_name:
-        print >>sys.stderr, ('Warning: environment regeneration unimplemented '
-                             'for %s flag %r env_name %r' % (action, opt,
-                                                             env_name))
-    else:
-      print >>sys.stderr, ('Warning: regeneration unimplemented for action %r '
-                           'flag %r' % (action, opt))
-
-  return flags
-
-class RegeneratableOptionParser(optparse.OptionParser):
-  def __init__(self):
-    self.__regeneratable_options = {}
-    optparse.OptionParser.__init__(self)
-
-  def add_option(self, *args, **kw):
-    """Add an option to the parser.
-
-    This accepts the same arguments as OptionParser.add_option, plus the
-    following:
-      regenerate: can be set to False to prevent this option from being included
-                  in regeneration.
-      env_name: name of environment variable that additional values for this
-                option come from.
-      type: adds type='path', to tell the regenerator that the values of
-            this option need to be made relative to options.depth
-    """
-    env_name = kw.pop('env_name', None)
-    if 'dest' in kw and kw.pop('regenerate', True):
-      dest = kw['dest']
-
-      # The path type is needed for regenerating, for optparse we can just treat
-      # it as a string.
-      type = kw.get('type')
-      if type == 'path':
-        kw['type'] = 'string'
-
-      self.__regeneratable_options[dest] = {
-          'action': kw.get('action'),
-          'type': type,
-          'env_name': env_name,
-          'opt': args[0],
-        }
-
-    optparse.OptionParser.add_option(self, *args, **kw)
-
-  def parse_args(self, *args):
-    values, args = optparse.OptionParser.parse_args(self, *args)
-    values._regeneration_metadata = self.__regeneratable_options
-    return values, args
-
-def gyp_main(args):
-  my_name = os.path.basename(sys.argv[0])
-
-  parser = RegeneratableOptionParser()
-  usage = 'usage: %s [options ...] [build_file ...]'
-  parser.set_usage(usage.replace('%s', '%prog'))
-  parser.add_option('-D', dest='defines', action='append', metavar='VAR=VAL',
-                    env_name='GYP_DEFINES',
-                    help='sets variable VAR to value VAL')
-  parser.add_option('-f', '--format', dest='formats', action='append',
-                    env_name='GYP_GENERATORS', regenerate=False,
-                    help='output formats to generate')
-  parser.add_option('--msvs-version', dest='msvs_version',
-                    regenerate=False,
-                    help='Deprecated; use -G msvs_version=MSVS_VERSION instead')
-  parser.add_option('-I', '--include', dest='includes', action='append',
-                    metavar='INCLUDE', type='path',
-                    help='files to include in all loaded .gyp files')
-  parser.add_option('--depth', dest='depth', metavar='PATH', type='path',
-                    help='set DEPTH gyp variable to a relative path to PATH')
-  parser.add_option('-d', '--debug', dest='debug', metavar='DEBUGMODE',
-                    action='append', default=[], help='turn on a debugging '
-                    'mode for debugging GYP.  Supported modes are "variables", '
-                    '"includes", "dependencies", and "general" or "all" for '
-                    'all of them.')
-  parser.add_option('-S', '--suffix', dest='suffix', default='',
-                    help='suffix to add to generated files')
-  parser.add_option('-G', dest='generator_flags', action='append', default=[],
-                    metavar='FLAG=VAL', env_name='GYP_GENERATOR_FLAGS',
-                    help='sets generator flag FLAG to VAL')
-  parser.add_option('--generator-output', dest='generator_output',
-                    action='store', default=None, metavar='DIR', type='path',
-                    env_name='GYP_GENERATOR_OUTPUT',
-                    help='puts generated build files under DIR')
-  parser.add_option('--ignore-environment', dest='use_environment',
-                    action='store_false', default=True, regenerate=False,
-                    help='do not read options from environment variables')
-  parser.add_option('--check', dest='check', action='store_true',
-                    help='check format of gyp files')
-  parser.add_option('--parallel', action='store_true',
-                    env_name='GYP_PARALLEL',
-                    help='Use multiprocessing for speed (experimental)')
-  parser.add_option('--toplevel-dir', dest='toplevel_dir', action='store',
-                    default=None, metavar='DIR', type='path',
-                    help='directory to use as the root of the source tree')
-  parser.add_option('--build', dest='configs', action='append',
-                    help='configuration for build after project generation')
-  # --no-circular-check disables the check for circular relationships between
-  # .gyp files.  These relationships should not exist, but they've only been
-  # observed to be harmful with the Xcode generator.  Chromium's .gyp files
-  # currently have some circular relationships on non-Mac platforms, so this
-  # option allows the strict behavior to be used on Macs and the lenient
-  # behavior to be used elsewhere.
-  # TODO(mark): Remove this option when http://crbug.com/35878 is fixed.
-  parser.add_option('--no-circular-check', dest='circular_check',
-                    action='store_false', default=True, regenerate=False,
-                    help="don't check for circular relationships between files")
-
-  # We read a few things from ~/.gyp, so set up a var for that.
-  home_vars = ['HOME']
-  if sys.platform in ('cygwin', 'win32'):
-    home_vars.append('USERPROFILE')
-  home = None
-  home_dot_gyp = None
-  for home_var in home_vars:
-    home = os.getenv(home_var)
-    if sys.platform == 'cygwin':
-      home = cygpath.to_mixed(home)
-    if home != None:
-      home_dot_gyp = os.path.join(home, '.gyp')
-      if not os.path.exists(home_dot_gyp):
-        home_dot_gyp = None
-      else:
-        break
-
-  # TODO(thomasvl): add support for ~/.gyp/defaults
-
-  options, build_files_arg = parser.parse_args(args)
-  build_files = build_files_arg
-
-  if not options.formats:
-    # If no format was given on the command line, then check the env variable.
-    generate_formats = []
-    if options.use_environment:
-      generate_formats = os.environ.get('GYP_GENERATORS', [])
-    if generate_formats:
-      generate_formats = re.split('[\s,]', generate_formats)
-    if generate_formats:
-      options.formats = generate_formats
-    else:
-      # Nothing in the variable, default based on platform.
-      if sys.platform == 'darwin':
-        options.formats = ['xcode']
-      elif sys.platform in ('win32', 'cygwin'):
-        options.formats = ['msvs']
-      else:
-        options.formats = ['make']
-
-  if not options.generator_output and options.use_environment:
-    g_o = os.environ.get('GYP_GENERATOR_OUTPUT')
-    if g_o:
-      options.generator_output = g_o
-
-  if not options.parallel and options.use_environment:
-    options.parallel = bool(os.environ.get('GYP_PARALLEL'))
-
-  for mode in options.debug:
-    gyp.debug[mode] = 1
-
-  # Do an extra check to avoid work when we're not debugging.
-  if DEBUG_GENERAL in gyp.debug.keys():
-    DebugOutput(DEBUG_GENERAL, 'running with these options:')
-    for option, value in sorted(options.__dict__.items()):
-      if option[0] == '_':
-        continue
-      if isinstance(value, basestring):
-        DebugOutput(DEBUG_GENERAL, "  %s: '%s'" % (option, value))
-      else:
-        DebugOutput(DEBUG_GENERAL, "  %s: %s" % (option, str(value)))
-
-  if not build_files:
-    build_files = FindBuildFiles()
-  if not build_files:
-    raise GypError((usage + '\n\n%s: error: no build_file') %
-                   (my_name, my_name))
-
-  # TODO(mark): Chromium-specific hack!
-  # For Chromium, the gyp "depth" variable should always be a relative path
-  # to Chromium's top-level "src" directory.  If no depth variable was set
-  # on the command line, try to find a "src" directory by looking at the
-  # absolute path to each build file's directory.  The first "src" component
-  # found will be treated as though it were the path used for --depth.
-  if not options.depth:
-    for build_file in build_files:
-      build_file_dir = os.path.abspath(os.path.dirname(build_file))
-      build_file_dir_components = build_file_dir.split(os.path.sep)
-      components_len = len(build_file_dir_components)
-      for index in xrange(components_len - 1, -1, -1):
-        if build_file_dir_components[index] == 'src':
-          options.depth = os.path.sep.join(build_file_dir_components)
-          break
-        del build_file_dir_components[index]
-
-      # If the inner loop found something, break without advancing to another
-      # build file.
-      if options.depth:
-        break
-
-    if not options.depth:
-      raise GypError('Could not automatically locate src directory.  This is'
-                     'a temporary Chromium feature that will be removed.  Use'
-                     '--depth as a workaround.')
-
-  # If toplevel-dir is not set, we assume that depth is the root of our source
-  # tree.
-  if not options.toplevel_dir:
-    options.toplevel_dir = options.depth
-
-  # -D on the command line sets variable defaults - D isn't just for define,
-  # it's for default.  Perhaps there should be a way to force (-F?) a
-  # variable's value so that it can't be overridden by anything else.
-  cmdline_default_variables = {}
-  defines = []
-  if options.use_environment:
-    defines += ShlexEnv('GYP_DEFINES')
-  if options.defines:
-    defines += options.defines
-  cmdline_default_variables = NameValueListToDict(defines)
-  if DEBUG_GENERAL in gyp.debug.keys():
-    DebugOutput(DEBUG_GENERAL,
-                "cmdline_default_variables: %s" % cmdline_default_variables)
-
-  # Set up includes.
-  includes = []
-
-  # If ~/.gyp/include.gypi exists, it'll be forcibly included into every
-  # .gyp file that's loaded, before anything else is included.
-  if home_dot_gyp != None:
-    default_include = os.path.join(home_dot_gyp, 'include.gypi')
-    if os.path.exists(default_include):
-      print 'Using overrides found in ' + default_include
-      includes.append(default_include)
-
-  # Command-line --include files come after the default include.
-  if options.includes:
-    includes.extend(options.includes)
-
-  # Generator flags should be prefixed with the target generator since they
-  # are global across all generator runs.
-  gen_flags = []
-  if options.use_environment:
-    gen_flags += ShlexEnv('GYP_GENERATOR_FLAGS')
-  if options.generator_flags:
-    gen_flags += options.generator_flags
-  generator_flags = NameValueListToDict(gen_flags)
-  if DEBUG_GENERAL in gyp.debug.keys():
-    DebugOutput(DEBUG_GENERAL, "generator_flags: %s" % generator_flags)
-
-  # TODO: Remove this and the option after we've gotten folks to move to the
-  # generator flag.
-  if options.msvs_version:
-    print >>sys.stderr, \
-      'DEPRECATED: Use generator flag (-G msvs_version=' + \
-      options.msvs_version + ') instead of --msvs-version=' + \
-      options.msvs_version
-    generator_flags['msvs_version'] = options.msvs_version
-
-  # Generate all requested formats (use a set in case we got one format request
-  # twice)
-  for format in set(options.formats):
-    params = {'options': options,
-              'build_files': build_files,
-              'generator_flags': generator_flags,
-              'cwd': os.getcwd(),
-              'build_files_arg': build_files_arg,
-              'gyp_binary': sys.argv[0],
-              'home_dot_gyp': home_dot_gyp,
-              'parallel': options.parallel}
-
-    # Start with the default variables from the command line.
-    [generators, flat_list, targets, data] = Load(build_files, format,
-                                                 cmdline_default_variables,
-                                                 includes, options.depth,
-                                                 params, options.check,
-                                                 options.circular_check)
-
-    # TODO(mark): Pass |data| for now because the generator needs a list of
-    # build files that came in.  In the future, maybe it should just accept
-    # a list, and not the whole data dict.
-    # NOTE: flat_list is the flattened dependency graph specifying the order
-    # that targets may be built.  Build systems that operate serially or that
-    # need to have dependencies defined before dependents reference them should
-    # generate targets in the order specified in flat_list.
-    for generator in generators:
-      generator.GenerateOutput(flat_list, targets, data, params)
-
-      if options.configs:
-        valid_configs = targets[flat_list[0]]['configurations'].keys()
-        for conf in options.configs:
-          if conf not in valid_configs:
-            raise GypError('Invalid config specified via --build: %s' % conf)
-        generator.PerformBuild(data, options.configs, params)
-
-  # Done
-  return 0
-
-
-def main(args):
-  try:
-    return gyp_main(args)
-  except GypError, e:
-    sys.stderr.write("gyp: %s\n" % e)
-    return 1
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/tools/gyp/pylib/gyp/common.py b/tools/gyp/pylib/gyp/common.py
deleted file mode 100644
index f4b2db5..0000000
--- a/tools/gyp/pylib/gyp/common.py
+++ /dev/null
@@ -1,487 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import with_statement
-
-import errno
-import filecmp
-import os.path
-import re
-import tempfile
-import sys
-
-
-# A minimal memoizing decorator. It'll blow up if the args aren't immutable,
-# among other "problems".
-class memoize(object):
-  def __init__(self, func):
-    self.func = func
-    self.cache = {}
-  def __call__(self, *args):
-    try:
-      return self.cache[args]
-    except KeyError:
-      result = self.func(*args)
-      self.cache[args] = result
-      return result
-
-
-class GypError(Exception):
-  """Error class representing an error, which is to be presented
-  to the user.  The main entry point will catch and display this.
-  """
-  pass
-
-
-def ExceptionAppend(e, msg):
-  """Append a message to the given exception's message."""
-  if not e.args:
-    e.args = (msg,)
-  elif len(e.args) == 1:
-    e.args = (str(e.args[0]) + ' ' + msg,)
-  else:
-    e.args = (str(e.args[0]) + ' ' + msg,) + e.args[1:]
-
-
-def ParseQualifiedTarget(target):
-  # Splits a qualified target into a build file, target name and toolset.
-
-  # NOTE: rsplit is used to disambiguate the Windows drive letter separator.
-  target_split = target.rsplit(':', 1)
-  if len(target_split) == 2:
-    [build_file, target] = target_split
-  else:
-    build_file = None
-
-  target_split = target.rsplit('#', 1)
-  if len(target_split) == 2:
-    [target, toolset] = target_split
-  else:
-    toolset = None
-
-  return [build_file, target, toolset]
-
-
-def ResolveTarget(build_file, target, toolset):
-  # This function resolves a target into a canonical form:
-  # - a fully defined build file, either absolute or relative to the current
-  # directory
-  # - a target name
-  # - a toolset
-  #
-  # build_file is the file relative to which 'target' is defined.
-  # target is the qualified target.
-  # toolset is the default toolset for that target.
-  [parsed_build_file, target, parsed_toolset] = ParseQualifiedTarget(target)
-
-  if parsed_build_file:
-    if build_file:
-      # If a relative path, parsed_build_file is relative to the directory
-      # containing build_file.  If build_file is not in the current directory,
-      # parsed_build_file is not a usable path as-is.  Resolve it by
-      # interpreting it as relative to build_file.  If parsed_build_file is
-      # absolute, it is usable as a path regardless of the current directory,
-      # and os.path.join will return it as-is.
-      build_file = os.path.normpath(os.path.join(os.path.dirname(build_file),
-                                                 parsed_build_file))
-      # Further (to handle cases like ../cwd), make it relative to cwd)
-      if not os.path.isabs(build_file):
-        build_file = RelativePath(build_file, '.')
-    else:
-      build_file = parsed_build_file
-
-  if parsed_toolset:
-    toolset = parsed_toolset
-
-  return [build_file, target, toolset]
-
-
-def BuildFile(fully_qualified_target):
-  # Extracts the build file from the fully qualified target.
-  return ParseQualifiedTarget(fully_qualified_target)[0]
-
-
-def GetEnvironFallback(var_list, default):
-  """Look up a key in the environment, with fallback to secondary keys
-  and finally falling back to a default value."""
-  for var in var_list:
-    if var in os.environ:
-      return os.environ[var]
-  return default
-
-
-def QualifiedTarget(build_file, target, toolset):
-  # "Qualified" means the file that a target was defined in and the target
-  # name, separated by a colon, suffixed by a # and the toolset name:
-  # /path/to/file.gyp:target_name#toolset
-  fully_qualified = build_file + ':' + target
-  if toolset:
-    fully_qualified = fully_qualified + '#' + toolset
-  return fully_qualified
-
-
-@memoize
-def RelativePath(path, relative_to):
-  # Assuming both |path| and |relative_to| are relative to the current
-  # directory, returns a relative path that identifies path relative to
-  # relative_to.
-
-  # Convert to absolute (and therefore normalized paths).
-  path = os.path.abspath(path)
-  relative_to = os.path.abspath(relative_to)
-
-  # Split the paths into components.
-  path_split = path.split(os.path.sep)
-  relative_to_split = relative_to.split(os.path.sep)
-
-  # Determine how much of the prefix the two paths share.
-  prefix_len = len(os.path.commonprefix([path_split, relative_to_split]))
-
-  # Put enough ".." components to back up out of relative_to to the common
-  # prefix, and then append the part of path_split after the common prefix.
-  relative_split = [os.path.pardir] * (len(relative_to_split) - prefix_len) + \
-                   path_split[prefix_len:]
-
-  if len(relative_split) == 0:
-    # The paths were the same.
-    return ''
-
-  # Turn it back into a string and we're done.
-  return os.path.join(*relative_split)
-
-
-def FixIfRelativePath(path, relative_to):
-  # Like RelativePath but returns |path| unchanged if it is absolute.
-  if os.path.isabs(path):
-    return path
-  return RelativePath(path, relative_to)
-
-
-def UnrelativePath(path, relative_to):
-  # Assuming that |relative_to| is relative to the current directory, and |path|
-  # is a path relative to the dirname of |relative_to|, returns a path that
-  # identifies |path| relative to the current directory.
-  rel_dir = os.path.dirname(relative_to)
-  return os.path.normpath(os.path.join(rel_dir, path))
-
-
-# re objects used by EncodePOSIXShellArgument.  See IEEE 1003.1 XCU.2.2 at
-# http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_02
-# and the documentation for various shells.
-
-# _quote is a pattern that should match any argument that needs to be quoted
-# with double-quotes by EncodePOSIXShellArgument.  It matches the following
-# characters appearing anywhere in an argument:
-#   \t, \n, space  parameter separators
-#   #              comments
-#   $              expansions (quoted to always expand within one argument)
-#   %              called out by IEEE 1003.1 XCU.2.2
-#   &              job control
-#   '              quoting
-#   (, )           subshell execution
-#   *, ?, [        pathname expansion
-#   ;              command delimiter
-#   <, >, |        redirection
-#   =              assignment
-#   {, }           brace expansion (bash)
-#   ~              tilde expansion
-# It also matches the empty string, because "" (or '') is the only way to
-# represent an empty string literal argument to a POSIX shell.
-#
-# This does not match the characters in _escape, because those need to be
-# backslash-escaped regardless of whether they appear in a double-quoted
-# string.
-_quote = re.compile('[\t\n #$%&\'()*;<=>?[{|}~]|^$')
-
-# _escape is a pattern that should match any character that needs to be
-# escaped with a backslash, whether or not the argument matched the _quote
-# pattern.  _escape is used with re.sub to backslash anything in _escape's
-# first match group, hence the (parentheses) in the regular expression.
-#
-# _escape matches the following characters appearing anywhere in an argument:
-#   "  to prevent POSIX shells from interpreting this character for quoting
-#   \  to prevent POSIX shells from interpreting this character for escaping
-#   `  to prevent POSIX shells from interpreting this character for command
-#      substitution
-# Missing from this list is $, because the desired behavior of
-# EncodePOSIXShellArgument is to permit parameter (variable) expansion.
-#
-# Also missing from this list is !, which bash will interpret as the history
-# expansion character when history is enabled.  bash does not enable history
-# by default in non-interactive shells, so this is not thought to be a problem.
-# ! was omitted from this list because bash interprets "\!" as a literal string
-# including the backslash character (avoiding history expansion but retaining
-# the backslash), which would not be correct for argument encoding.  Handling
-# this case properly would also be problematic because bash allows the history
-# character to be changed with the histchars shell variable.  Fortunately,
-# as history is not enabled in non-interactive shells and
-# EncodePOSIXShellArgument is only expected to encode for non-interactive
-# shells, there is no room for error here by ignoring !.
-_escape = re.compile(r'(["\\`])')
-
-def EncodePOSIXShellArgument(argument):
-  """Encodes |argument| suitably for consumption by POSIX shells.
-
-  argument may be quoted and escaped as necessary to ensure that POSIX shells
-  treat the returned value as a literal representing the argument passed to
-  this function.  Parameter (variable) expansions beginning with $ are allowed
-  to remain intact without escaping the $, to allow the argument to contain
-  references to variables to be expanded by the shell.
-  """
-
-  if not isinstance(argument, str):
-    argument = str(argument)
-
-  if _quote.search(argument):
-    quote = '"'
-  else:
-    quote = ''
-
-  encoded = quote + re.sub(_escape, r'\\\1', argument) + quote
-
-  return encoded
-
-
-def EncodePOSIXShellList(list):
-  """Encodes |list| suitably for consumption by POSIX shells.
-
-  Returns EncodePOSIXShellArgument for each item in list, and joins them
-  together using the space character as an argument separator.
-  """
-
-  encoded_arguments = []
-  for argument in list:
-    encoded_arguments.append(EncodePOSIXShellArgument(argument))
-  return ' '.join(encoded_arguments)
-
-
-def DeepDependencyTargets(target_dicts, roots):
-  """Returns the recursive list of target dependencies."""
-  dependencies = set()
-  pending = set(roots)
-  while pending:
-    # Pluck out one.
-    r = pending.pop()
-    # Skip if visited already.
-    if r in dependencies:
-      continue
-    # Add it.
-    dependencies.add(r)
-    # Add its children.
-    spec = target_dicts[r]
-    pending.update(set(spec.get('dependencies', [])))
-    pending.update(set(spec.get('dependencies_original', [])))
-  return list(dependencies - set(roots))
-
-
-def BuildFileTargets(target_list, build_file):
-  """From a target_list, returns the subset from the specified build_file.
-  """
-  return [p for p in target_list if BuildFile(p) == build_file]
-
-
-def AllTargets(target_list, target_dicts, build_file):
-  """Returns all targets (direct and dependencies) for the specified build_file.
-  """
-  bftargets = BuildFileTargets(target_list, build_file)
-  deptargets = DeepDependencyTargets(target_dicts, bftargets)
-  return bftargets + deptargets
-
-
-def WriteOnDiff(filename):
-  """Write to a file only if the new contents differ.
-
-  Arguments:
-    filename: name of the file to potentially write to.
-  Returns:
-    A file like object which will write to temporary file and only overwrite
-    the target if it differs (on close).
-  """
-
-  class Writer:
-    """Wrapper around file which only covers the target if it differs."""
-    def __init__(self):
-      # Pick temporary file.
-      tmp_fd, self.tmp_path = tempfile.mkstemp(
-          suffix='.tmp',
-          prefix=os.path.split(filename)[1] + '.gyp.',
-          dir=os.path.split(filename)[0])
-      try:
-        self.tmp_file = os.fdopen(tmp_fd, 'wb')
-      except Exception:
-        # Don't leave turds behind.
-        os.unlink(self.tmp_path)
-        raise
-
-    def __getattr__(self, attrname):
-      # Delegate everything else to self.tmp_file
-      return getattr(self.tmp_file, attrname)
-
-    def close(self):
-      try:
-        # Close tmp file.
-        self.tmp_file.close()
-        # Determine if different.
-        same = False
-        try:
-          same = filecmp.cmp(self.tmp_path, filename, False)
-        except OSError, e:
-          if e.errno != errno.ENOENT:
-            raise
-
-        if same:
-          # The new file is identical to the old one, just get rid of the new
-          # one.
-          os.unlink(self.tmp_path)
-        else:
-          # The new file is different from the old one, or there is no old one.
-          # Rename the new file to the permanent name.
-          #
-          # tempfile.mkstemp uses an overly restrictive mode, resulting in a
-          # file that can only be read by the owner, regardless of the umask.
-          # There's no reason to not respect the umask here, which means that
-          # an extra hoop is required to fetch it and reset the new file's mode.
-          #
-          # No way to get the umask without setting a new one?  Set a safe one
-          # and then set it back to the old value.
-          umask = os.umask(077)
-          os.umask(umask)
-          os.chmod(self.tmp_path, 0666 & ~umask)
-          if sys.platform == 'win32' and os.path.exists(filename):
-            # NOTE: on windows (but not cygwin) rename will not replace an
-            # existing file, so it must be preceded with a remove. Sadly there
-            # is no way to make the switch atomic.
-            os.remove(filename)
-          os.rename(self.tmp_path, filename)
-      except Exception:
-        # Don't leave turds behind.
-        os.unlink(self.tmp_path)
-        raise
-
-  return Writer()
-
-
-def EnsureDirExists(path):
-  """Make sure the directory for |path| exists."""
-  try:
-    os.makedirs(os.path.dirname(path))
-  except OSError:
-    pass
-
-
-def GetFlavor(params):
-  """Returns |params.flavor| if it's set, the system's default flavor else."""
-  flavors = {
-    'cygwin': 'win',
-    'win32': 'win',
-    'darwin': 'mac',
-  }
-
-  if 'flavor' in params:
-    return params['flavor']
-  if sys.platform in flavors:
-    return flavors[sys.platform]
-  if sys.platform.startswith('sunos'):
-    return 'solaris'
-  if sys.platform.startswith('freebsd'):
-    return 'freebsd'
-
-  return 'linux'
-
-def CopyToolFile(prefix, out_path):
-  # Slurp input file.
-  source_path = os.path.join(
-      os.path.dirname(os.path.abspath(__file__)), '%s_tool.py' % prefix)
-  with open(source_path) as source_file:
-    source = source_file.readlines()
-
-  # Add header and write it out.
-  tool_path = os.path.join(out_path, 'gyp-%s-tool' % prefix)
-  with open(tool_path, 'w') as tool_file:
-    tool_file.write(
-        ''.join([source[0], '# Generated by gyp. Do not edit.\n'] + source[1:]))
-
-  # Make file executable.
-  os.chmod(tool_path, 0755)
-
-
-def CopyTool(flavor, out_path):
-  """Finds (mac|sun|win|wiiu)_tool.gyp in the gyp directory and copies it
-  to |out_path|."""
-
-  # win_tool contains some useful helpers.
-  if sys.platform in ['cygwin', 'win32']:
-    CopyToolFile('win', out_path)
-
-  prefix = { 'solaris': 'sun', 'mac': 'mac', 'win': 'win', 'wiiu': 'wiiu'}.get(flavor, None)
-  if prefix:
-    CopyToolFile(prefix, out_path)
-
-
-# From Alex Martelli,
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
-# ASPN: Python Cookbook: Remove duplicates from a sequence
-# First comment, dated 2001/10/13.
-# (Also in the printed Python Cookbook.)
-
-def uniquer(seq, idfun=None):
-    if idfun is None:
-        idfun = lambda x: x
-    seen = {}
-    result = []
-    for item in seq:
-        marker = idfun(item)
-        if marker in seen: continue
-        seen[marker] = 1
-        result.append(item)
-    return result
-
-
-class CycleError(Exception):
-  """An exception raised when an unexpected cycle is detected."""
-  def __init__(self, nodes):
-    self.nodes = nodes
-  def __str__(self):
-    return 'CycleError: cycle involving: ' + str(self.nodes)
-
-
-def TopologicallySorted(graph, get_edges):
-  """Topologically sort based on a user provided edge definition.
-
-  Args:
-    graph: A list of node names.
-    get_edges: A function mapping from node name to a hashable collection
-               of node names which this node has outgoing edges to.
-  Returns:
-    A list containing all of the node in graph in topological order.
-    It is assumed that calling get_edges once for each node and caching is
-    cheaper than repeatedly calling get_edges.
-  Raises:
-    CycleError in the event of a cycle.
-  Example:
-    graph = {'a': '$(b) $(c)', 'b': 'hi', 'c': '$(b)'}
-    def GetEdges(node):
-      return re.findall(r'\$\(([^))]\)', graph[node])
-    print TopologicallySorted(graph.keys(), GetEdges)
-    ==>
-    ['a', 'c', b']
-  """
-  get_edges = memoize(get_edges)
-  visited = set()
-  visiting = set()
-  ordered_nodes = []
-  def Visit(node):
-    if node in visiting:
-      raise CycleError(visiting)
-    if node in visited:
-      return
-    visited.add(node)
-    visiting.add(node)
-    for neighbor in get_edges(node):
-      Visit(neighbor)
-    visiting.remove(node)
-    ordered_nodes.insert(0, node)
-  for node in sorted(graph):
-    Visit(node)
-  return ordered_nodes
diff --git a/tools/gyp/pylib/gyp/common_test.py b/tools/gyp/pylib/gyp/common_test.py
deleted file mode 100755
index dac2969..0000000
--- a/tools/gyp/pylib/gyp/common_test.py
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2012 Google Inc. 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 common.py file."""
-
-import gyp.common
-import unittest
-import sys
-
-
-class TestTopologicallySorted(unittest.TestCase):
-  def test_Valid(self):
-    """Test that sorting works on a valid graph with one possible order."""
-    graph = {
-        'a': ['b', 'c'],
-        'b': [],
-        'c': ['d'],
-        'd': ['b'],
-        }
-    def GetEdge(node):
-      return tuple(graph[node])
-    self.assertEqual(
-      gyp.common.TopologicallySorted(graph.keys(), GetEdge),
-      ['a', 'c', 'd', 'b'])
-
-  def test_Cycle(self):
-    """Test that an exception is thrown on a cyclic graph."""
-    graph = {
-        'a': ['b'],
-        'b': ['c'],
-        'c': ['d'],
-        'd': ['a'],
-        }
-    def GetEdge(node):
-      return tuple(graph[node])
-    self.assertRaises(
-      gyp.common.CycleError, gyp.common.TopologicallySorted,
-      graph.keys(), GetEdge)
-
-
-class TestGetFlavor(unittest.TestCase):
-  """Test that gyp.common.GetFlavor works as intended"""
-  original_platform = ''
-
-  def setUp(self):
-    self.original_platform = sys.platform
-
-  def tearDown(self):
-    sys.platform = self.original_platform
-
-  def assertFlavor(self, expected, argument, param):
-    sys.platform = argument
-    self.assertEqual(expected, gyp.common.GetFlavor(param))
-
-  def test_platform_default(self):
-    self.assertFlavor('freebsd', 'freebsd9' , {})
-    self.assertFlavor('freebsd', 'freebsd10', {})
-    self.assertFlavor('solaris', 'sunos5'   , {});
-    self.assertFlavor('solaris', 'sunos'    , {});
-    self.assertFlavor('linux'  , 'linux2'   , {});
-    self.assertFlavor('linux'  , 'linux3'   , {});
-
-  def test_param(self):
-    self.assertFlavor('foobar', 'linux2' , {'flavor': 'foobar'})
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/tools/gyp/pylib/gyp/easy_xml.py b/tools/gyp/pylib/gyp/easy_xml.py
deleted file mode 100644
index bf949b6..0000000
--- a/tools/gyp/pylib/gyp/easy_xml.py
+++ /dev/null
@@ -1,157 +0,0 @@
-# Copyright (c) 2011 Google Inc. 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 os
-
-
-def XmlToString(content, encoding='utf-8', pretty=False):
-  """ Writes the XML content to disk, touching the file only if it has changed.
-
-  Visual Studio files have a lot of pre-defined structures.  This function makes
-  it easy to represent these structures as Python data structures, instead of
-  having to create a lot of function calls.
-
-  Each XML element of the content is represented as a list composed of:
-  1. The name of the element, a string,
-  2. The attributes of the element, a dictionary (optional), and
-  3+. The content of the element, if any.  Strings are simple text nodes and
-      lists are child elements.
-
-  Example 1:
-      <test/>
-  becomes
-      ['test']
-
-  Example 2:
-      <myelement a='value1' b='value2'>
-         <childtype>This is</childtype>
-         <childtype>it!</childtype>
-      </myelement>
-
-  becomes
-      ['myelement', {'a':'value1', 'b':'value2'},
-         ['childtype', 'This is'],
-         ['childtype', 'it!'],
-      ]
-
-  Args:
-    content:  The structured content to be converted.
-    encoding: The encoding to report on the first XML line.
-    pretty: True if we want pretty printing with indents and new lines.
-
-  Returns:
-    The XML content as a string.
-  """
-  # We create a huge list of all the elements of the file.
-  xml_parts = ['<?xml version="1.0" encoding="%s"?>' % encoding]
-  if pretty:
-    xml_parts.append('\n')
-  _ConstructContentList(xml_parts, content, pretty)
-
-  # Convert it to a string
-  return ''.join(xml_parts)
-
-
-def _ConstructContentList(xml_parts, specification, pretty, level=0):
-  """ Appends the XML parts corresponding to the specification.
-
-  Args:
-    xml_parts: A list of XML parts to be appended to.
-    specification:  The specification of the element.  See EasyXml docs.
-    pretty: True if we want pretty printing with indents and new lines.
-    level: Indentation level.
-  """
-  # The first item in a specification is the name of the element.
-  if pretty:
-    indentation = '  ' * level
-    new_line = '\n'
-  else:
-    indentation = ''
-    new_line = ''
-  name = specification[0]
-  if not isinstance(name, str):
-    raise Exception('The first item of an EasyXml specification should be '
-                    'a string.  Specification was ' + str(specification))
-  xml_parts.append(indentation + '<' + name)
-
-  # Optionally in second position is a dictionary of the attributes.
-  rest = specification[1:]
-  if rest and isinstance(rest[0], dict):
-    for at, val in sorted(rest[0].iteritems()):
-      xml_parts.append(' %s="%s"' % (at, _XmlEscape(val, attr=True)))
-    rest = rest[1:]
-  if rest:
-    xml_parts.append('>')
-    all_strings = reduce(lambda x, y: x and isinstance(y, str), rest, True)
-    multi_line = not all_strings
-    if multi_line and new_line:
-      xml_parts.append(new_line)
-    for child_spec in rest:
-      # If it's a string, append a text node.
-      # Otherwise recurse over that child definition
-      if isinstance(child_spec, str):
-       xml_parts.append(_XmlEscape(child_spec))
-      else:
-        _ConstructContentList(xml_parts, child_spec, pretty, level + 1)
-    if multi_line and indentation:
-      xml_parts.append(indentation)
-    xml_parts.append('</%s>%s' % (name, new_line))
-  else:
-    xml_parts.append('/>%s' % new_line)
-
-
-def WriteXmlIfChanged(content, path, encoding='utf-8', pretty=False,
-                      win32=False):
-  """ Writes the XML content to disk, touching the file only if it has changed.
-
-  Args:
-    content:  The structured content to be written.
-    path: Location of the file.
-    encoding: The encoding to report on the first line of the XML file.
-    pretty: True if we want pretty printing with indents and new lines.
-  """
-  xml_string = XmlToString(content, encoding, pretty)
-  if win32 and os.linesep != '\r\n':
-    xml_string = xml_string.replace('\n', '\r\n')
-
-  # Get the old content
-  try:
-    f = open(path, 'r')
-    existing = f.read()
-    f.close()
-  except:
-    existing = None
-
-  # It has changed, write it
-  if existing != xml_string:
-    f = open(path, 'w')
-    f.write(xml_string)
-    f.close()
-
-
-_xml_escape_map = {
-    '"': '&quot;',
-    "'": '&apos;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '&': '&amp;',
-    '\n': '&#xA;',
-    '\r': '&#xD;',
-}
-
-
-_xml_escape_re = re.compile(
-    "(%s)" % "|".join(map(re.escape, _xml_escape_map.keys())))
-
-
-def _XmlEscape(value, attr=False):
-  """ Escape a string for inclusion in XML."""
-  def replace(match):
-    m = match.string[match.start() : match.end()]
-    # don't replace single quotes in attrs
-    if attr and m == "'":
-      return m
-    return _xml_escape_map[m]
-  return _xml_escape_re.sub(replace, value)
diff --git a/tools/gyp/pylib/gyp/easy_xml_test.py b/tools/gyp/pylib/gyp/easy_xml_test.py
deleted file mode 100755
index df64354..0000000
--- a/tools/gyp/pylib/gyp/easy_xml_test.py
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2011 Google Inc. 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 easy_xml.py file. """
-
-import gyp.easy_xml as easy_xml
-import unittest
-import StringIO
-
-
-class TestSequenceFunctions(unittest.TestCase):
-
-  def setUp(self):
-    self.stderr = StringIO.StringIO()
-
-  def test_EasyXml_simple(self):
-    self.assertEqual(
-      easy_xml.XmlToString(['test']),
-      '<?xml version="1.0" encoding="utf-8"?><test/>')
-
-    self.assertEqual(
-      easy_xml.XmlToString(['test'], encoding='Windows-1252'),
-      '<?xml version="1.0" encoding="Windows-1252"?><test/>')
-
-  def test_EasyXml_simple_with_attributes(self):
-    self.assertEqual(
-      easy_xml.XmlToString(['test2', {'a': 'value1', 'b': 'value2'}]),
-      '<?xml version="1.0" encoding="utf-8"?><test2 a="value1" b="value2"/>')
-
-  def test_EasyXml_escaping(self):
-    original = '<test>\'"\r&\nfoo'
-    converted = '&lt;test&gt;\'&quot;&#xD;&amp;&#xA;foo'
-    converted_apos = converted.replace("'", '&apos;')
-    self.assertEqual(
-      easy_xml.XmlToString(['test3', {'a': original}, original]),
-      '<?xml version="1.0" encoding="utf-8"?><test3 a="%s">%s</test3>' %
-      (converted, converted_apos))
-
-  def test_EasyXml_pretty(self):
-    self.assertEqual(
-      easy_xml.XmlToString(
-          ['test3',
-            ['GrandParent',
-              ['Parent1',
-                ['Child']
-              ],
-              ['Parent2']
-            ]
-          ],
-          pretty=True),
-      '<?xml version="1.0" encoding="utf-8"?>\n'
-      '<test3>\n'
-      '  <GrandParent>\n'
-      '    <Parent1>\n'
-      '      <Child/>\n'
-      '    </Parent1>\n'
-      '    <Parent2/>\n'
-      '  </GrandParent>\n'
-      '</test3>\n')
-
-
-  def test_EasyXml_complex(self):
-    # We want to create:
-    target = (
-      '<?xml version="1.0" encoding="utf-8"?>'
-      '<Project>'
-        '<PropertyGroup Label="Globals">'
-          '<ProjectGuid>{D2250C20-3A94-4FB9-AF73-11BC5B73884B}</ProjectGuid>'
-          '<Keyword>Win32Proj</Keyword>'
-          '<RootNamespace>automated_ui_tests</RootNamespace>'
-        '</PropertyGroup>'
-        '<Import Project="$(VCTargetsPath)\\Microsoft.Cpp.props"/>'
-        '<PropertyGroup '
-            'Condition="\'$(Configuration)|$(Platform)\'=='
-                       '\'Debug|Win32\'" Label="Configuration">'
-          '<ConfigurationType>Application</ConfigurationType>'
-          '<CharacterSet>Unicode</CharacterSet>'
-        '</PropertyGroup>'
-      '</Project>')
-
-    xml = easy_xml.XmlToString(
-        ['Project',
-          ['PropertyGroup', {'Label': 'Globals'},
-            ['ProjectGuid', '{D2250C20-3A94-4FB9-AF73-11BC5B73884B}'],
-            ['Keyword', 'Win32Proj'],
-            ['RootNamespace', 'automated_ui_tests']
-          ],
-          ['Import', {'Project': '$(VCTargetsPath)\\Microsoft.Cpp.props'}],
-          ['PropertyGroup',
-            {'Condition': "'$(Configuration)|$(Platform)'=='Debug|Win32'",
-             'Label': 'Configuration'},
-            ['ConfigurationType', 'Application'],
-            ['CharacterSet', 'Unicode']
-          ]
-        ])
-    self.assertEqual(xml, target)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/tools/gyp/pylib/gyp/generator/__init__.py b/tools/gyp/pylib/gyp/generator/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/tools/gyp/pylib/gyp/generator/__init__.py
+++ /dev/null
diff --git a/tools/gyp/pylib/gyp/generator/android.py b/tools/gyp/pylib/gyp/generator/android.py
deleted file mode 100644
index 872ec84..0000000
--- a/tools/gyp/pylib/gyp/generator/android.py
+++ /dev/null
@@ -1,1092 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Notes:
-#
-# This generates makefiles suitable for inclusion into the Android build system
-# via an Android.mk file. It is based on make.py, the standard makefile
-# generator.
-#
-# The code below generates a separate .mk file for each target, but
-# all are sourced by the top-level GypAndroid.mk.  This means that all
-# variables in .mk-files clobber one another, and furthermore that any
-# variables set potentially clash with other Android build system variables.
-# Try to avoid setting global variables where possible.
-
-import gyp
-import gyp.common
-import gyp.generator.make as make  # Reuse global functions from make backend.
-import os
-import re
-
-generator_default_variables = {
-  'OS': 'android',
-  'EXECUTABLE_PREFIX': '',
-  'EXECUTABLE_SUFFIX': '',
-  'STATIC_LIB_PREFIX': 'lib',
-  'SHARED_LIB_PREFIX': 'lib',
-  'STATIC_LIB_SUFFIX': '.a',
-  'SHARED_LIB_SUFFIX': '.so',
-  'INTERMEDIATE_DIR': '$(gyp_intermediate_dir)',
-  'SHARED_INTERMEDIATE_DIR': '$(gyp_shared_intermediate_dir)',
-  'PRODUCT_DIR': '$(gyp_shared_intermediate_dir)',
-  'SHARED_LIB_DIR': '$(builddir)/lib.$(TOOLSET)',
-  'LIB_DIR': '$(obj).$(TOOLSET)',
-  'RULE_INPUT_ROOT': '%(INPUT_ROOT)s',  # This gets expanded by Python.
-  'RULE_INPUT_DIRNAME': '%(INPUT_DIRNAME)s',  # This gets expanded by Python.
-  'RULE_INPUT_PATH': '$(RULE_SOURCES)',
-  'RULE_INPUT_EXT': '$(suffix $<)',
-  'RULE_INPUT_NAME': '$(notdir $<)',
-  'CONFIGURATION_NAME': 'NOT_USED_ON_ANDROID',
-}
-
-# Make supports multiple toolsets
-generator_supports_multiple_toolsets = True
-
-
-# Generator-specific gyp specs.
-generator_additional_non_configuration_keys = [
-    # Boolean to declare that this target does not want its name mangled.
-    'android_unmangled_name',
-]
-generator_additional_path_sections = []
-generator_extra_sources_for_rules = []
-
-
-SHARED_FOOTER = """\
-# "gyp_all_modules" is a concatenation of the "gyp_all_modules" targets from
-# all the included sub-makefiles. This is just here to clarify.
-gyp_all_modules:
-"""
-
-header = """\
-# This file is generated by gyp; do not edit.
-
-"""
-
-android_standard_include_paths = set([
-    # JNI_H_INCLUDE in build/core/binary.mk
-    'dalvik/libnativehelper/include/nativehelper',
-    # from SRC_HEADERS in build/core/config.mk
-    'system/core/include',
-    'hardware/libhardware/include',
-    'hardware/libhardware_legacy/include',
-    'hardware/ril/include',
-    'dalvik/libnativehelper/include',
-    'frameworks/native/include',
-    'frameworks/native/opengl/include',
-    'frameworks/base/include',
-    'frameworks/base/opengl/include',
-    'frameworks/base/native/include',
-    'external/skia/include',
-    # TARGET_C_INCLUDES in build/core/combo/TARGET_linux-arm.mk
-    'bionic/libc/arch-arm/include',
-    'bionic/libc/include',
-    'bionic/libstdc++/include',
-    'bionic/libc/kernel/common',
-    'bionic/libc/kernel/arch-arm',
-    'bionic/libm/include',
-    'bionic/libm/include/arm',
-    'bionic/libthread_db/include',
-    ])
-
-
-# Map gyp target types to Android module classes.
-MODULE_CLASSES = {
-    'static_library': 'STATIC_LIBRARIES',
-    'shared_library': 'SHARED_LIBRARIES',
-    'executable': 'EXECUTABLES',
-}
-
-
-def IsCPPExtension(ext):
-  return make.COMPILABLE_EXTENSIONS.get(ext) == 'cxx'
-
-
-def Sourceify(path):
-  """Convert a path to its source directory form. The Android backend does not
-     support options.generator_output, so this function is a noop."""
-  return path
-
-
-# Map from qualified target to path to output.
-# For Android, the target of these maps is a tuple ('static', 'modulename'),
-# ('dynamic', 'modulename'), or ('path', 'some/path') instead of a string,
-# since we link by module.
-target_outputs = {}
-# Map from qualified target to any linkable output.  A subset
-# of target_outputs.  E.g. when mybinary depends on liba, we want to
-# include liba in the linker line; when otherbinary depends on
-# mybinary, we just want to build mybinary first.
-target_link_deps = {}
-
-
-class AndroidMkWriter(object):
-  """AndroidMkWriter packages up the writing of one target-specific Android.mk.
-
-  Its only real entry point is Write(), and is mostly used for namespacing.
-  """
-
-  def __init__(self, android_top_dir):
-    self.android_top_dir = android_top_dir
-
-  def Write(self, qualified_target, base_path, output_filename, spec, configs,
-            part_of_all):
-    """The main entry point: writes a .mk file for a single target.
-
-    Arguments:
-      qualified_target: target we're generating
-      base_path: path relative to source root we're building in, used to resolve
-                 target-relative paths
-      output_filename: output .mk file name to write
-      spec, configs: gyp info
-      part_of_all: flag indicating this target is part of 'all'
-    """
-    make.ensure_directory_exists(output_filename)
-
-    self.fp = open(output_filename, 'w')
-
-    self.fp.write(header)
-
-    self.qualified_target = qualified_target
-    self.path = base_path
-    self.target = spec['target_name']
-    self.type = spec['type']
-    self.toolset = spec['toolset']
-
-    deps, link_deps = self.ComputeDeps(spec)
-
-    # Some of the generation below can add extra output, sources, or
-    # link dependencies.  All of the out params of the functions that
-    # follow use names like extra_foo.
-    extra_outputs = []
-    extra_sources = []
-
-    self.android_class = MODULE_CLASSES.get(self.type, 'GYP')
-    self.android_module = self.ComputeAndroidModule(spec)
-    (self.android_stem, self.android_suffix) = self.ComputeOutputParts(spec)
-    self.output = self.output_binary = self.ComputeOutput(spec)
-
-    # Standard header.
-    self.WriteLn('include $(CLEAR_VARS)\n')
-
-    # Module class and name.
-    self.WriteLn('LOCAL_MODULE_CLASS := ' + self.android_class)
-    self.WriteLn('LOCAL_MODULE := ' + self.android_module)
-    # Only emit LOCAL_MODULE_STEM if it's different to LOCAL_MODULE.
-    # The library module classes fail if the stem is set. ComputeOutputParts
-    # makes sure that stem == modulename in these cases.
-    if self.android_stem != self.android_module:
-      self.WriteLn('LOCAL_MODULE_STEM := ' + self.android_stem)
-    self.WriteLn('LOCAL_MODULE_SUFFIX := ' + self.android_suffix)
-    self.WriteLn('LOCAL_MODULE_TAGS := optional')
-    if self.toolset == 'host':
-      self.WriteLn('LOCAL_IS_HOST_MODULE := true')
-
-    # Grab output directories; needed for Actions and Rules.
-    self.WriteLn('gyp_intermediate_dir := $(call local-intermediates-dir)')
-    self.WriteLn('gyp_shared_intermediate_dir := '
-                 '$(call intermediates-dir-for,GYP,shared)')
-    self.WriteLn()
-
-    # List files this target depends on so that actions/rules/copies/sources
-    # can depend on the list.
-    # TODO: doesn't pull in things through transitive link deps; needed?
-    target_dependencies = [x[1] for x in deps if x[0] == 'path']
-    self.WriteLn('# Make sure our deps are built first.')
-    self.WriteList(target_dependencies, 'GYP_TARGET_DEPENDENCIES',
-                   local_pathify=True)
-
-    # Actions must come first, since they can generate more OBJs for use below.
-    if 'actions' in spec:
-      self.WriteActions(spec['actions'], extra_sources, extra_outputs)
-
-    # Rules must be early like actions.
-    if 'rules' in spec:
-      self.WriteRules(spec['rules'], extra_sources, extra_outputs)
-
-    if 'copies' in spec:
-      self.WriteCopies(spec['copies'], extra_outputs)
-
-    # GYP generated outputs.
-    self.WriteList(extra_outputs, 'GYP_GENERATED_OUTPUTS', local_pathify=True)
-
-    # Set LOCAL_ADDITIONAL_DEPENDENCIES so that Android's build rules depend
-    # on both our dependency targets and our generated files.
-    self.WriteLn('# Make sure our deps and generated files are built first.')
-    self.WriteLn('LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) '
-                 '$(GYP_GENERATED_OUTPUTS)')
-    self.WriteLn()
-
-    # Sources.
-    if spec.get('sources', []) or extra_sources:
-      self.WriteSources(spec, configs, extra_sources)
-
-    self.WriteTarget(spec, configs, deps, link_deps, part_of_all)
-
-    # Update global list of target outputs, used in dependency tracking.
-    target_outputs[qualified_target] = ('path', self.output_binary)
-
-    # Update global list of link dependencies.
-    if self.type == 'static_library':
-      target_link_deps[qualified_target] = ('static', self.android_module)
-    elif self.type == 'shared_library':
-      target_link_deps[qualified_target] = ('shared', self.android_module)
-
-    self.fp.close()
-    return self.android_module
-
-
-  def WriteActions(self, actions, extra_sources, extra_outputs):
-    """Write Makefile code for any 'actions' from the gyp input.
-
-    extra_sources: a list that will be filled in with newly generated source
-                   files, if any
-    extra_outputs: a list that will be filled in with any outputs of these
-                   actions (used to make other pieces dependent on these
-                   actions)
-    """
-    for action in actions:
-      name = make.StringToMakefileVariable('%s_%s' % (self.qualified_target,
-                                                      action['action_name']))
-      self.WriteLn('### Rules for action "%s":' % action['action_name'])
-      inputs = action['inputs']
-      outputs = action['outputs']
-
-      # Build up a list of outputs.
-      # Collect the output dirs we'll need.
-      dirs = set()
-      for out in outputs:
-        if not out.startswith('$'):
-          print ('WARNING: Action for target "%s" writes output to local path '
-                 '"%s".' % (self.target, out))
-        dir = os.path.split(out)[0]
-        if dir:
-          dirs.add(dir)
-      if int(action.get('process_outputs_as_sources', False)):
-        extra_sources += outputs
-
-      # Prepare the actual command.
-      command = gyp.common.EncodePOSIXShellList(action['action'])
-      if 'message' in action:
-        quiet_cmd = 'Gyp action: %s ($@)' % action['message']
-      else:
-        quiet_cmd = 'Gyp action: %s ($@)' % name
-      if len(dirs) > 0:
-        command = 'mkdir -p %s' % ' '.join(dirs) + '; ' + command
-
-      cd_action = 'cd $(gyp_local_path)/%s; ' % self.path
-      command = cd_action + command
-
-      # The makefile rules are all relative to the top dir, but the gyp actions
-      # are defined relative to their containing dir.  This replaces the gyp_*
-      # variables for the action rule with an absolute version so that the
-      # output goes in the right place.
-      # Only write the gyp_* rules for the "primary" output (:1);
-      # it's superfluous for the "extra outputs", and this avoids accidentally
-      # writing duplicate dummy rules for those outputs.
-      main_output = make.QuoteSpaces(self.LocalPathify(outputs[0]))
-      self.WriteLn('%s: gyp_local_path := $(LOCAL_PATH)' % main_output)
-      self.WriteLn('%s: gyp_intermediate_dir := '
-                   '$(GYP_ABS_ANDROID_TOP_DIR)/$(gyp_intermediate_dir)' %
-                   main_output)
-      self.WriteLn('%s: gyp_shared_intermediate_dir := '
-                   '$(GYP_ABS_ANDROID_TOP_DIR)/$(gyp_shared_intermediate_dir)' %
-                   main_output)
-
-      for input in inputs:
-        assert ' ' not in input, (
-            "Spaces in action input filenames not supported (%s)"  % input)
-      for output in outputs:
-        assert ' ' not in output, (
-            "Spaces in action output filenames not supported (%s)"  % output)
-
-      self.WriteLn('%s: %s $(GYP_TARGET_DEPENDENCIES)' %
-                   (main_output, ' '.join(map(self.LocalPathify, inputs))))
-      self.WriteLn('\t@echo "%s"' % quiet_cmd)
-      self.WriteLn('\t$(hide)%s\n' % command)
-      for output in outputs[1:]:
-        # Make each output depend on the main output, with an empty command
-        # to force make to notice that the mtime has changed.
-        self.WriteLn('%s: %s ;' % (self.LocalPathify(output), main_output))
-
-      extra_outputs += outputs
-      self.WriteLn()
-
-    self.WriteLn()
-
-
-  def WriteRules(self, rules, extra_sources, extra_outputs):
-    """Write Makefile code for any 'rules' from the gyp input.
-
-    extra_sources: a list that will be filled in with newly generated source
-                   files, if any
-    extra_outputs: a list that will be filled in with any outputs of these
-                   rules (used to make other pieces dependent on these rules)
-    """
-    if len(rules) == 0:
-      return
-    rule_trigger = '%s_rule_trigger' % self.android_module
-
-    did_write_rule = False
-    for rule in rules:
-      if len(rule.get('rule_sources', [])) == 0:
-        continue
-      did_write_rule = True
-      name = make.StringToMakefileVariable('%s_%s' % (self.qualified_target,
-                                                      rule['rule_name']))
-      self.WriteLn('\n### Generated for rule "%s":' % name)
-      self.WriteLn('# "%s":' % rule)
-
-      inputs = rule.get('inputs')
-      for rule_source in rule.get('rule_sources', []):
-        (rule_source_dirname, rule_source_basename) = os.path.split(rule_source)
-        (rule_source_root, rule_source_ext) = \
-            os.path.splitext(rule_source_basename)
-
-        outputs = [self.ExpandInputRoot(out, rule_source_root,
-                                        rule_source_dirname)
-                   for out in rule['outputs']]
-
-        dirs = set()
-        for out in outputs:
-          if not out.startswith('$'):
-            print ('WARNING: Rule for target %s writes output to local path %s'
-                   % (self.target, out))
-          dir = os.path.dirname(out)
-          if dir:
-            dirs.add(dir)
-        extra_outputs += outputs
-        if int(rule.get('process_outputs_as_sources', False)):
-          extra_sources.extend(outputs)
-
-        components = []
-        for component in rule['action']:
-          component = self.ExpandInputRoot(component, rule_source_root,
-                                           rule_source_dirname)
-          if '$(RULE_SOURCES)' in component:
-            component = component.replace('$(RULE_SOURCES)',
-                                          rule_source)
-          components.append(component)
-
-        command = gyp.common.EncodePOSIXShellList(components)
-        cd_action = 'cd $(gyp_local_path)/%s; ' % self.path
-        command = cd_action + command
-        if dirs:
-          command = 'mkdir -p %s' % ' '.join(dirs) + '; ' + command
-
-        # We set up a rule to build the first output, and then set up
-        # a rule for each additional output to depend on the first.
-        outputs = map(self.LocalPathify, outputs)
-        main_output = outputs[0]
-        self.WriteLn('%s: gyp_local_path := $(LOCAL_PATH)' % main_output)
-        self.WriteLn('%s: gyp_intermediate_dir := '
-                     '$(GYP_ABS_ANDROID_TOP_DIR)/$(gyp_intermediate_dir)'
-                     % main_output)
-        self.WriteLn('%s: gyp_shared_intermediate_dir := '
-                     '$(GYP_ABS_ANDROID_TOP_DIR)/$(gyp_shared_intermediate_dir)'
-                     % main_output)
-
-        main_output_deps = self.LocalPathify(rule_source)
-        if inputs:
-          main_output_deps += ' '
-          main_output_deps += ' '.join([self.LocalPathify(f) for f in inputs])
-
-        self.WriteLn('%s: %s $(GYP_TARGET_DEPENDENCIES)' %
-                     (main_output, main_output_deps))
-        self.WriteLn('\t%s\n' % command)
-        for output in outputs[1:]:
-          self.WriteLn('%s: %s' % (output, main_output))
-        self.WriteLn('.PHONY: %s' % (rule_trigger))
-        self.WriteLn('%s: %s' % (rule_trigger, main_output))
-        self.WriteLn('')
-    if did_write_rule:
-      extra_sources.append(rule_trigger)  # Force all rules to run.
-      self.WriteLn('### Finished generating for all rules')
-      self.WriteLn('')
-
-
-  def WriteCopies(self, copies, extra_outputs):
-    """Write Makefile code for any 'copies' from the gyp input.
-
-    extra_outputs: a list that will be filled in with any outputs of this action
-                   (used to make other pieces dependent on this action)
-    """
-    self.WriteLn('### Generated for copy rule.')
-
-    variable = make.StringToMakefileVariable(self.qualified_target + '_copies')
-    outputs = []
-    for copy in copies:
-      for path in copy['files']:
-        # The Android build system does not allow generation of files into the
-        # source tree. The destination should start with a variable, which will
-        # typically be $(gyp_intermediate_dir) or
-        # $(gyp_shared_intermediate_dir). Note that we can't use an assertion
-        # because some of the gyp tests depend on this.
-        if not copy['destination'].startswith('$'):
-          print ('WARNING: Copy rule for target %s writes output to '
-                 'local path %s' % (self.target, copy['destination']))
-
-        # LocalPathify() calls normpath, stripping trailing slashes.
-        path = Sourceify(self.LocalPathify(path))
-        filename = os.path.split(path)[1]
-        output = Sourceify(self.LocalPathify(os.path.join(copy['destination'],
-                                                          filename)))
-
-        self.WriteLn('%s: %s $(GYP_TARGET_DEPENDENCIES) | $(ACP)' %
-                     (output, path))
-        self.WriteLn('\t@echo Copying: $@')
-        self.WriteLn('\t$(hide) mkdir -p $(dir $@)')
-        self.WriteLn('\t$(hide) $(ACP) -r $< $@')
-        self.WriteLn()
-        outputs.append(output)
-    self.WriteLn('%s = %s' % (variable,
-                              ' '.join(map(make.QuoteSpaces, outputs))))
-    extra_outputs.append('$(%s)' % variable)
-    self.WriteLn()
-
-
-  def WriteSourceFlags(self, spec, configs):
-    """Write out the flags and include paths used to compile source files for
-    the current target.
-
-    Args:
-      spec, configs: input from gyp.
-    """
-    config = configs[spec['default_configuration']]
-    extracted_includes = []
-
-    self.WriteLn('\n# Flags passed to both C and C++ files.')
-    cflags, includes_from_cflags = self.ExtractIncludesFromCFlags(
-        config.get('cflags'))
-    extracted_includes.extend(includes_from_cflags)
-    self.WriteList(cflags, 'MY_CFLAGS')
-
-    cflags_c, includes_from_cflags_c = self.ExtractIncludesFromCFlags(
-        config.get('cflags_c'))
-    extracted_includes.extend(includes_from_cflags_c)
-    self.WriteList(cflags_c, 'MY_CFLAGS_C')
-
-    self.WriteList(config.get('defines'), 'MY_DEFS', prefix='-D',
-                   quoter=make.EscapeCppDefine)
-    self.WriteLn('LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)')
-
-    # Undefine ANDROID for host modules
-    # TODO: the source code should not use macro ANDROID to tell if it's host or
-    # target module.
-    if self.toolset == 'host':
-      self.WriteLn('# Undefine ANDROID for host modules')
-      self.WriteLn('LOCAL_CFLAGS += -UANDROID')
-
-    self.WriteLn('\n# Include paths placed before CFLAGS/CPPFLAGS')
-    includes = list(config.get('include_dirs', []))
-    includes.extend(extracted_includes)
-    includes = map(Sourceify, map(self.LocalPathify, includes))
-    includes = self.NormalizeIncludePaths(includes)
-    self.WriteList(includes, 'LOCAL_C_INCLUDES')
-    self.WriteLn('LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) '
-                                     '$(LOCAL_C_INCLUDES)')
-
-    self.WriteLn('\n# Flags passed to only C++ (and not C) files.')
-    self.WriteList(config.get('cflags_cc'), 'LOCAL_CPPFLAGS')
-
-
-  def WriteSources(self, spec, configs, extra_sources):
-    """Write Makefile code for any 'sources' from the gyp input.
-    These are source files necessary to build the current target.
-    We need to handle shared_intermediate directory source files as
-    a special case by copying them to the intermediate directory and
-    treating them as a genereated sources. Otherwise the Android build
-    rules won't pick them up.
-
-    Args:
-      spec, configs: input from gyp.
-      extra_sources: Sources generated from Actions or Rules.
-    """
-    sources = filter(make.Compilable, spec.get('sources', []))
-    generated_not_sources = [x for x in extra_sources if not make.Compilable(x)]
-    extra_sources = filter(make.Compilable, extra_sources)
-
-    # Determine and output the C++ extension used by these sources.
-    # We simply find the first C++ file and use that extension.
-    all_sources = sources + extra_sources
-    local_cpp_extension = '.cpp'
-    for source in all_sources:
-      (root, ext) = os.path.splitext(source)
-      if IsCPPExtension(ext):
-        local_cpp_extension = ext
-        break
-    if local_cpp_extension != '.cpp':
-      self.WriteLn('LOCAL_CPP_EXTENSION := %s' % local_cpp_extension)
-
-    # We need to move any non-generated sources that are coming from the
-    # shared intermediate directory out of LOCAL_SRC_FILES and put them
-    # into LOCAL_GENERATED_SOURCES. We also need to move over any C++ files
-    # that don't match our local_cpp_extension, since Android will only
-    # generate Makefile rules for a single LOCAL_CPP_EXTENSION.
-    local_files = []
-    for source in sources:
-      (root, ext) = os.path.splitext(source)
-      if '$(gyp_shared_intermediate_dir)' in source:
-        extra_sources.append(source)
-      elif '$(gyp_intermediate_dir)' in source:
-        extra_sources.append(source)
-      elif IsCPPExtension(ext) and ext != local_cpp_extension:
-        extra_sources.append(source)
-      else:
-        local_files.append(os.path.normpath(os.path.join(self.path, source)))
-
-    # For any generated source, if it is coming from the shared intermediate
-    # directory then we add a Make rule to copy them to the local intermediate
-    # directory first. This is because the Android LOCAL_GENERATED_SOURCES
-    # must be in the local module intermediate directory for the compile rules
-    # to work properly. If the file has the wrong C++ extension, then we add
-    # a rule to copy that to intermediates and use the new version.
-    final_generated_sources = []
-    # If a source file gets copied, we still need to add the orginal source
-    # directory as header search path, for GCC searches headers in the
-    # directory that contains the source file by default.
-    origin_src_dirs = []
-    for source in extra_sources:
-      local_file = source
-      if not '$(gyp_intermediate_dir)/' in local_file:
-        basename = os.path.basename(local_file)
-        local_file = '$(gyp_intermediate_dir)/' + basename
-      (root, ext) = os.path.splitext(local_file)
-      if IsCPPExtension(ext) and ext != local_cpp_extension:
-        local_file = root + local_cpp_extension
-      if local_file != source:
-        self.WriteLn('%s: %s' % (local_file, self.LocalPathify(source)))
-        self.WriteLn('\tmkdir -p $(@D); cp $< $@')
-        origin_src_dirs.append(os.path.dirname(source))
-      final_generated_sources.append(local_file)
-
-    # We add back in all of the non-compilable stuff to make sure that the
-    # make rules have dependencies on them.
-    final_generated_sources.extend(generated_not_sources)
-    self.WriteList(final_generated_sources, 'LOCAL_GENERATED_SOURCES')
-
-    origin_src_dirs = gyp.common.uniquer(origin_src_dirs)
-    origin_src_dirs = map(Sourceify, map(self.LocalPathify, origin_src_dirs))
-    self.WriteList(origin_src_dirs, 'GYP_COPIED_SOURCE_ORIGIN_DIRS')
-
-    self.WriteList(local_files, 'LOCAL_SRC_FILES')
-
-    # Write out the flags used to compile the source; this must be done last
-    # so that GYP_COPIED_SOURCE_ORIGIN_DIRS can be used as an include path.
-    self.WriteSourceFlags(spec, configs)
-
-
-  def ComputeAndroidModule(self, spec):
-    """Return the Android module name used for a gyp spec.
-
-    We use the complete qualified target name to avoid collisions between
-    duplicate targets in different directories. We also add a suffix to
-    distinguish gyp-generated module names.
-    """
-
-    if int(spec.get('android_unmangled_name', 0)):
-      assert self.type != 'shared_library' or self.target.startswith('lib')
-      return self.target
-
-    if self.type == 'shared_library':
-      # For reasons of convention, the Android build system requires that all
-      # shared library modules are named 'libfoo' when generating -l flags.
-      prefix = 'lib_'
-    else:
-      prefix = ''
-
-    if spec['toolset'] == 'host':
-      suffix = '_host_gyp'
-    else:
-      suffix = '_gyp'
-
-    if self.path:
-      name = '%s%s_%s%s' % (prefix, self.path, self.target, suffix)
-    else:
-      name = '%s%s%s' % (prefix, self.target, suffix)
-
-    return make.StringToMakefileVariable(name)
-
-
-  def ComputeOutputParts(self, spec):
-    """Return the 'output basename' of a gyp spec, split into filename + ext.
-
-    Android libraries must be named the same thing as their module name,
-    otherwise the linker can't find them, so product_name and so on must be
-    ignored if we are building a library, and the "lib" prepending is
-    not done for Android.
-    """
-    assert self.type != 'loadable_module' # TODO: not supported?
-
-    target = spec['target_name']
-    target_prefix = ''
-    target_ext = ''
-    if self.type == 'static_library':
-      target = self.ComputeAndroidModule(spec)
-      target_ext = '.a'
-    elif self.type == 'shared_library':
-      target = self.ComputeAndroidModule(spec)
-      target_ext = '.so'
-    elif self.type == 'none':
-      target_ext = '.stamp'
-    elif self.type != 'executable':
-      print ("ERROR: What output file should be generated?",
-             "type", self.type, "target", target)
-
-    if self.type != 'static_library' and self.type != 'shared_library':
-      target_prefix = spec.get('product_prefix', target_prefix)
-      target = spec.get('product_name', target)
-      product_ext = spec.get('product_extension')
-      if product_ext:
-        target_ext = '.' + product_ext
-
-    target_stem = target_prefix + target
-    return (target_stem, target_ext)
-
-
-  def ComputeOutputBasename(self, spec):
-    """Return the 'output basename' of a gyp spec.
-
-    E.g., the loadable module 'foobar' in directory 'baz' will produce
-      'libfoobar.so'
-    """
-    return ''.join(self.ComputeOutputParts(spec))
-
-
-  def ComputeOutput(self, spec):
-    """Return the 'output' (full output path) of a gyp spec.
-
-    E.g., the loadable module 'foobar' in directory 'baz' will produce
-      '$(obj)/baz/libfoobar.so'
-    """
-    if self.type == 'executable' and self.toolset == 'host':
-      # We install host executables into shared_intermediate_dir so they can be
-      # run by gyp rules that refer to PRODUCT_DIR.
-      path = '$(gyp_shared_intermediate_dir)'
-    elif self.type == 'shared_library':
-      if self.toolset == 'host':
-        path = '$(HOST_OUT_INTERMEDIATE_LIBRARIES)'
-      else:
-        path = '$(TARGET_OUT_INTERMEDIATE_LIBRARIES)'
-    else:
-      # Other targets just get built into their intermediate dir.
-      if self.toolset == 'host':
-        path = '$(call intermediates-dir-for,%s,%s,true)' % (self.android_class,
-                                                            self.android_module)
-      else:
-        path = '$(call intermediates-dir-for,%s,%s)' % (self.android_class,
-                                                        self.android_module)
-
-    assert spec.get('product_dir') is None # TODO: not supported?
-    return os.path.join(path, self.ComputeOutputBasename(spec))
-
-
-  def NormalizeLdFlags(self, ld_flags):
-    """ Clean up ldflags from gyp file.
-    Remove any ldflags that contain android_top_dir.
-
-    Args:
-      ld_flags: ldflags from gyp files.
-
-    Returns:
-      clean ldflags
-    """
-    clean_ldflags = []
-    for flag in ld_flags:
-      if self.android_top_dir in flag:
-        continue
-      clean_ldflags.append(flag)
-    return clean_ldflags
-
-  def NormalizeIncludePaths(self, include_paths):
-    """ Normalize include_paths.
-    Convert absolute paths to relative to the Android top directory;
-    filter out include paths that are already brought in by the Android build
-    system.
-
-    Args:
-      include_paths: A list of unprocessed include paths.
-    Returns:
-      A list of normalized include paths.
-    """
-    normalized = []
-    for path in include_paths:
-      if path[0] == '/':
-        path = gyp.common.RelativePath(path, self.android_top_dir)
-
-      # Filter out the Android standard search path.
-      if path not in android_standard_include_paths:
-        normalized.append(path)
-    return normalized
-
-  def ExtractIncludesFromCFlags(self, cflags):
-    """Extract includes "-I..." out from cflags
-
-    Args:
-      cflags: A list of compiler flags, which may be mixed with "-I.."
-    Returns:
-      A tuple of lists: (clean_clfags, include_paths). "-I.." is trimmed.
-    """
-    clean_cflags = []
-    include_paths = []
-    if cflags:
-      for flag in cflags:
-        if flag.startswith('-I'):
-          include_paths.append(flag[2:])
-        else:
-          clean_cflags.append(flag)
-
-    return (clean_cflags, include_paths)
-
-  def ComputeAndroidLibraryModuleNames(self, libraries):
-    """Compute the Android module names from libraries, ie spec.get('libraries')
-
-    Args:
-      libraries: the value of spec.get('libraries')
-    Returns:
-      A tuple (static_lib_modules, dynamic_lib_modules)
-    """
-    static_lib_modules = []
-    dynamic_lib_modules = []
-    for libs in libraries:
-      # Libs can have multiple words.
-      for lib in libs.split():
-        # Filter the system libraries, which are added by default by the Android
-        # build system.
-        if (lib == '-lc' or lib == '-lstdc++' or lib == '-lm' or
-            lib.endswith('libgcc.a')):
-          continue
-        match = re.search(r'([^/]+)\.a$', lib)
-        if match:
-          static_lib_modules.append(match.group(1))
-          continue
-        match = re.search(r'([^/]+)\.so$', lib)
-        if match:
-          dynamic_lib_modules.append(match.group(1))
-          continue
-        # "-lstlport" -> libstlport
-        if lib.startswith('-l'):
-          if lib.endswith('_static'):
-            static_lib_modules.append('lib' + lib[2:])
-          else:
-            dynamic_lib_modules.append('lib' + lib[2:])
-    return (static_lib_modules, dynamic_lib_modules)
-
-
-  def ComputeDeps(self, spec):
-    """Compute the dependencies of a gyp spec.
-
-    Returns a tuple (deps, link_deps), where each is a list of
-    filenames that will need to be put in front of make for either
-    building (deps) or linking (link_deps).
-    """
-    deps = []
-    link_deps = []
-    if 'dependencies' in spec:
-      deps.extend([target_outputs[dep] for dep in spec['dependencies']
-                   if target_outputs[dep]])
-      for dep in spec['dependencies']:
-        if dep in target_link_deps:
-          link_deps.append(target_link_deps[dep])
-      deps.extend(link_deps)
-    return (gyp.common.uniquer(deps), gyp.common.uniquer(link_deps))
-
-
-  def WriteTargetFlags(self, spec, configs, link_deps):
-    """Write Makefile code to specify the link flags and library dependencies.
-
-    spec, configs: input from gyp.
-    link_deps: link dependency list; see ComputeDeps()
-    """
-    config = configs[spec['default_configuration']]
-
-    # LDFLAGS
-    ldflags = list(config.get('ldflags', []))
-    static_flags, dynamic_flags = self.ComputeAndroidLibraryModuleNames(
-        ldflags)
-    self.WriteLn('')
-    self.WriteList(self.NormalizeLdFlags(ldflags), 'LOCAL_LDFLAGS')
-
-    # Libraries (i.e. -lfoo)
-    libraries = gyp.common.uniquer(spec.get('libraries', []))
-    static_libs, dynamic_libs = self.ComputeAndroidLibraryModuleNames(
-        libraries)
-
-    # Link dependencies (i.e. libfoo.a, libfoo.so)
-    static_link_deps = [x[1] for x in link_deps if x[0] == 'static']
-    shared_link_deps = [x[1] for x in link_deps if x[0] == 'shared']
-    self.WriteLn('')
-    self.WriteList(static_flags + static_libs + static_link_deps,
-                   'LOCAL_STATIC_LIBRARIES')
-    self.WriteLn('# Enable grouping to fix circular references')
-    self.WriteLn('LOCAL_GROUP_STATIC_LIBRARIES := true')
-    self.WriteLn('')
-    self.WriteList(dynamic_flags + dynamic_libs + shared_link_deps,
-                   'LOCAL_SHARED_LIBRARIES')
-
-
-  def WriteTarget(self, spec, configs, deps, link_deps, part_of_all):
-    """Write Makefile code to produce the final target of the gyp spec.
-
-    spec, configs: input from gyp.
-    deps, link_deps: dependency lists; see ComputeDeps()
-    part_of_all: flag indicating this target is part of 'all'
-    """
-    self.WriteLn('### Rules for final target.')
-
-    if self.type != 'none':
-      self.WriteTargetFlags(spec, configs, link_deps)
-
-    # Add to the set of targets which represent the gyp 'all' target. We use the
-    # name 'gyp_all_modules' as the Android build system doesn't allow the use
-    # of the Make target 'all' and because 'all_modules' is the equivalent of
-    # the Make target 'all' on Android.
-    if part_of_all:
-      self.WriteLn('# Add target alias to "gyp_all_modules" target.')
-      self.WriteLn('.PHONY: gyp_all_modules')
-      self.WriteLn('gyp_all_modules: %s' % self.android_module)
-      self.WriteLn('')
-
-    # Add an alias from the gyp target name to the Android module name. This
-    # simplifies manual builds of the target, and is required by the test
-    # framework.
-    if self.target != self.android_module:
-      self.WriteLn('# Alias gyp target name.')
-      self.WriteLn('.PHONY: %s' % self.target)
-      self.WriteLn('%s: %s' % (self.target, self.android_module))
-      self.WriteLn('')
-
-    # Add the command to trigger build of the target type depending
-    # on the toolset. Ex: BUILD_STATIC_LIBRARY vs. BUILD_HOST_STATIC_LIBRARY
-    # NOTE: This has to come last!
-    modifier = ''
-    if self.toolset == 'host':
-      modifier = 'HOST_'
-    if self.type == 'static_library':
-      self.WriteLn('include $(BUILD_%sSTATIC_LIBRARY)' % modifier)
-    elif self.type == 'shared_library':
-      self.WriteLn('LOCAL_PRELINK_MODULE := false')
-      self.WriteLn('include $(BUILD_%sSHARED_LIBRARY)' % modifier)
-    elif self.type == 'executable':
-      if self.toolset == 'host':
-        self.WriteLn('LOCAL_MODULE_PATH := $(gyp_shared_intermediate_dir)')
-      else:
-        # Don't install target executables for now, as it results in them being
-        # included in ROM. This can be revisited if there's a reason to install
-        # them later.
-        self.WriteLn('LOCAL_UNINSTALLABLE_MODULE := true')
-      self.WriteLn('include $(BUILD_%sEXECUTABLE)' % modifier)
-    else:
-      self.WriteLn('LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp')
-      self.WriteLn('LOCAL_UNINSTALLABLE_MODULE := true')
-      self.WriteLn()
-      self.WriteLn('include $(BUILD_SYSTEM)/base_rules.mk')
-      self.WriteLn()
-      self.WriteLn('$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)')
-      self.WriteLn('\t$(hide) echo "Gyp timestamp: $@"')
-      self.WriteLn('\t$(hide) mkdir -p $(dir $@)')
-      self.WriteLn('\t$(hide) touch $@')
-
-
-  def WriteList(self, value_list, variable=None, prefix='',
-                quoter=make.QuoteIfNecessary, local_pathify=False):
-    """Write a variable definition that is a list of values.
-
-    E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out
-         foo = blaha blahb
-    but in a pretty-printed style.
-    """
-    values = ''
-    if value_list:
-      value_list = [quoter(prefix + l) for l in value_list]
-      if local_pathify:
-        value_list = [self.LocalPathify(l) for l in value_list]
-      values = ' \\\n\t' + ' \\\n\t'.join(value_list)
-    self.fp.write('%s :=%s\n\n' % (variable, values))
-
-
-  def WriteLn(self, text=''):
-    self.fp.write(text + '\n')
-
-
-  def LocalPathify(self, path):
-    """Convert a subdirectory-relative path into a normalized path which starts
-    with the make variable $(LOCAL_PATH) (i.e. the top of the project tree).
-    Absolute paths, or paths that contain variables, are just normalized."""
-    if '$(' in path or os.path.isabs(path):
-      # path is not a file in the project tree in this case, but calling
-      # normpath is still important for trimming trailing slashes.
-      return os.path.normpath(path)
-    local_path = os.path.join('$(LOCAL_PATH)', self.path, path)
-    local_path = os.path.normpath(local_path)
-    # Check that normalizing the path didn't ../ itself out of $(LOCAL_PATH)
-    # - i.e. that the resulting path is still inside the project tree. The
-    # path may legitimately have ended up containing just $(LOCAL_PATH), though,
-    # so we don't look for a slash.
-    assert local_path.startswith('$(LOCAL_PATH)'), (
-           'Path %s attempts to escape from gyp path %s !)' % (path, self.path))
-    return local_path
-
-
-  def ExpandInputRoot(self, template, expansion, dirname):
-    if '%(INPUT_ROOT)s' not in template and '%(INPUT_DIRNAME)s' not in template:
-      return template
-    path = template % {
-        'INPUT_ROOT': expansion,
-        'INPUT_DIRNAME': dirname,
-        }
-    return path
-
-
-def WriteAutoRegenerationRule(params, root_makefile, makefile_name,
-                              build_files):
-  """Write the target to regenerate the Makefile."""
-  options = params['options']
-  # Sort to avoid non-functional changes to makefile.
-  build_files = sorted([os.path.join('$(LOCAL_PATH)', f) for f in build_files])
-  build_files_args = [gyp.common.RelativePath(filename, options.toplevel_dir)
-                      for filename in params['build_files_arg']]
-  build_files_args = [os.path.join('$(PRIVATE_LOCAL_PATH)', f)
-                      for f in build_files_args]
-  gyp_binary = gyp.common.FixIfRelativePath(params['gyp_binary'],
-                                            options.toplevel_dir)
-  makefile_path = os.path.join('$(LOCAL_PATH)', makefile_name)
-  if not gyp_binary.startswith(os.sep):
-    gyp_binary = os.path.join('.', gyp_binary)
-  root_makefile.write('GYP_FILES := \\\n  %s\n\n' %
-                      '\\\n  '.join(map(Sourceify, build_files)))
-  root_makefile.write('%s: PRIVATE_LOCAL_PATH := $(LOCAL_PATH)\n' %
-                      makefile_path)
-  root_makefile.write('%s: $(GYP_FILES)\n' % makefile_path)
-  root_makefile.write('\techo ACTION Regenerating $@\n\t%s\n\n' %
-      gyp.common.EncodePOSIXShellList([gyp_binary, '-fandroid'] +
-                                      gyp.RegenerateFlags(options) +
-                                      build_files_args))
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  options = params['options']
-  generator_flags = params.get('generator_flags', {})
-  builddir_name = generator_flags.get('output_dir', 'out')
-  limit_to_target_all = generator_flags.get('limit_to_target_all', False)
-  android_top_dir = os.environ.get('ANDROID_BUILD_TOP')
-  assert android_top_dir, '$ANDROID_BUILD_TOP not set; you need to run lunch.'
-
-  def CalculateMakefilePath(build_file, base_name):
-    """Determine where to write a Makefile for a given gyp file."""
-    # Paths in gyp files are relative to the .gyp file, but we want
-    # paths relative to the source root for the master makefile.  Grab
-    # the path of the .gyp file as the base to relativize against.
-    # E.g. "foo/bar" when we're constructing targets for "foo/bar/baz.gyp".
-    base_path = gyp.common.RelativePath(os.path.dirname(build_file),
-                                        options.depth)
-    # We write the file in the base_path directory.
-    output_file = os.path.join(options.depth, base_path, base_name)
-    assert not options.generator_output, (
-        'The Android backend does not support options.generator_output.')
-    base_path = gyp.common.RelativePath(os.path.dirname(build_file),
-                                        options.toplevel_dir)
-    return base_path, output_file
-
-  # TODO:  search for the first non-'Default' target.  This can go
-  # away when we add verification that all targets have the
-  # necessary configurations.
-  default_configuration = None
-  toolsets = set([target_dicts[target]['toolset'] for target in target_list])
-  for target in target_list:
-    spec = target_dicts[target]
-    if spec['default_configuration'] != 'Default':
-      default_configuration = spec['default_configuration']
-      break
-  if not default_configuration:
-    default_configuration = 'Default'
-
-  srcdir = '.'
-  makefile_name = 'GypAndroid' + options.suffix + '.mk'
-  makefile_path = os.path.join(options.toplevel_dir, makefile_name)
-  assert not options.generator_output, (
-      'The Android backend does not support options.generator_output.')
-  make.ensure_directory_exists(makefile_path)
-  root_makefile = open(makefile_path, 'w')
-
-  root_makefile.write(header)
-
-  # We set LOCAL_PATH just once, here, to the top of the project tree. This
-  # allows all the other paths we use to be relative to the Android.mk file,
-  # as the Android build system expects.
-  root_makefile.write('\nLOCAL_PATH := $(call my-dir)\n')
-
-  # Find the list of targets that derive from the gyp file(s) being built.
-  needed_targets = set()
-  for build_file in params['build_files']:
-    for target in gyp.common.AllTargets(target_list, target_dicts, build_file):
-      needed_targets.add(target)
-
-  build_files = set()
-  include_list = set()
-  android_modules = {}
-  for qualified_target in target_list:
-    build_file, target, toolset = gyp.common.ParseQualifiedTarget(
-        qualified_target)
-    build_files.add(gyp.common.RelativePath(build_file, options.toplevel_dir))
-    included_files = data[build_file]['included_files']
-    for included_file in included_files:
-      # The included_files entries are relative to the dir of the build file
-      # that included them, so we have to undo that and then make them relative
-      # to the root dir.
-      relative_include_file = gyp.common.RelativePath(
-          gyp.common.UnrelativePath(included_file, build_file),
-          options.toplevel_dir)
-      abs_include_file = os.path.abspath(relative_include_file)
-      # If the include file is from the ~/.gyp dir, we should use absolute path
-      # so that relocating the src dir doesn't break the path.
-      if (params['home_dot_gyp'] and
-          abs_include_file.startswith(params['home_dot_gyp'])):
-        build_files.add(abs_include_file)
-      else:
-        build_files.add(relative_include_file)
-
-    base_path, output_file = CalculateMakefilePath(build_file,
-        target + '.' + toolset + options.suffix + '.mk')
-
-    spec = target_dicts[qualified_target]
-    configs = spec['configurations']
-
-    part_of_all = (qualified_target in needed_targets and
-                   not int(spec.get('suppress_wildcard', False)))
-    if limit_to_target_all and not part_of_all:
-      continue
-    writer = AndroidMkWriter(android_top_dir)
-    android_module = writer.Write(qualified_target, base_path, output_file,
-                                  spec, configs, part_of_all=part_of_all)
-    if android_module in android_modules:
-      print ('ERROR: Android module names must be unique. The following '
-             'targets both generate Android module name %s.\n  %s\n  %s' %
-             (android_module, android_modules[android_module],
-              qualified_target))
-      return
-    android_modules[android_module] = qualified_target
-
-    # Our root_makefile lives at the source root.  Compute the relative path
-    # from there to the output_file for including.
-    mkfile_rel_path = gyp.common.RelativePath(output_file,
-                                              os.path.dirname(makefile_path))
-    include_list.add(mkfile_rel_path)
-
-  # Some tools need to know the absolute path of the top directory.
-  root_makefile.write('GYP_ABS_ANDROID_TOP_DIR := $(shell pwd)\n')
-
-  # Write out the sorted list of includes.
-  root_makefile.write('\n')
-  for include_file in sorted(include_list):
-    root_makefile.write('include $(LOCAL_PATH)/' + include_file + '\n')
-  root_makefile.write('\n')
-
-  if generator_flags.get('auto_regeneration', True):
-    WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files)
-
-  root_makefile.write(SHARED_FOOTER)
-
-  root_makefile.close()
diff --git a/tools/gyp/pylib/gyp/generator/dump_dependency_json.py b/tools/gyp/pylib/gyp/generator/dump_dependency_json.py
deleted file mode 100644
index f8480dd..0000000
--- a/tools/gyp/pylib/gyp/generator/dump_dependency_json.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright (c) 2012 Google Inc. 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
-import os
-import gyp
-import gyp.common
-import gyp.msvs_emulation
-import json
-import sys
-
-generator_supports_multiple_toolsets = True
-
-generator_wants_static_library_dependencies_adjusted = False
-
-generator_default_variables = {
-}
-for dirname in ['INTERMEDIATE_DIR', 'SHARED_INTERMEDIATE_DIR', 'PRODUCT_DIR',
-                'LIB_DIR', 'SHARED_LIB_DIR']:
-  # Some gyp steps fail if these are empty(!).
-  generator_default_variables[dirname] = 'dir'
-for unused in ['RULE_INPUT_PATH', 'RULE_INPUT_ROOT', 'RULE_INPUT_NAME',
-               'RULE_INPUT_DIRNAME', 'RULE_INPUT_EXT',
-               'EXECUTABLE_PREFIX', 'EXECUTABLE_SUFFIX',
-               'STATIC_LIB_PREFIX', 'STATIC_LIB_SUFFIX',
-               'SHARED_LIB_PREFIX', 'SHARED_LIB_SUFFIX',
-               'CONFIGURATION_NAME']:
-  generator_default_variables[unused] = ''
-
-
-def CalculateVariables(default_variables, params):
-  generator_flags = params.get('generator_flags', {})
-  for key, val in generator_flags.items():
-    default_variables.setdefault(key, val)
-  default_variables.setdefault('OS', gyp.common.GetFlavor(params))
-
-  flavor = gyp.common.GetFlavor(params)
-  if flavor =='win':
-    # Copy additional generator configuration data from VS, which is shared
-    # by the Windows Ninja generator.
-    import gyp.generator.msvs as msvs_generator
-    generator_additional_non_configuration_keys = getattr(msvs_generator,
-        'generator_additional_non_configuration_keys', [])
-    generator_additional_path_sections = getattr(msvs_generator,
-        'generator_additional_path_sections', [])
-
-    # Set a variable so conditions can be based on msvs_version.
-    msvs_version = gyp.msvs_emulation.GetVSVersion(generator_flags)
-    default_variables['MSVS_VERSION'] = msvs_version.ShortName()
-
-    # To determine processor word size on Windows, in addition to checking
-    # PROCESSOR_ARCHITECTURE (which reflects the word size of the current
-    # process), it is also necessary to check PROCESSOR_ARCHITEW6432 (which
-    # contains the actual word size of the system when running thru WOW64).
-    if ('64' in os.environ.get('PROCESSOR_ARCHITECTURE', '') or
-        '64' in os.environ.get('PROCESSOR_ARCHITEW6432', '')):
-      default_variables['MSVS_OS_BITS'] = 64
-    else:
-      default_variables['MSVS_OS_BITS'] = 32
-
-
-def CalculateGeneratorInputInfo(params):
-  """Calculate the generator specific info that gets fed to input (called by
-  gyp)."""
-  generator_flags = params.get('generator_flags', {})
-  if generator_flags.get('adjust_static_libraries', False):
-    global generator_wants_static_library_dependencies_adjusted
-    generator_wants_static_library_dependencies_adjusted = True
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  # Map of target -> list of targets it depends on.
-  edges = {}
-
-  # Queue of targets to visit.
-  targets_to_visit = target_list[:]
-
-  while len(targets_to_visit) > 0:
-    target = targets_to_visit.pop()
-    if target in edges:
-      continue
-    edges[target] = []
-
-    for dep in target_dicts[target].get('dependencies', []):
-      edges[target].append(dep)
-      targets_to_visit.append(dep)
-
-  filename = 'dump.json'
-  f = open(filename, 'w')
-  json.dump(edges, f)
-  f.close()
-  print 'Wrote json to %s.' % filename
diff --git a/tools/gyp/pylib/gyp/generator/eclipse.py b/tools/gyp/pylib/gyp/generator/eclipse.py
deleted file mode 100644
index 0f90b5e..0000000
--- a/tools/gyp/pylib/gyp/generator/eclipse.py
+++ /dev/null
@@ -1,273 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""GYP backend that generates Eclipse CDT settings files.
-
-This backend DOES NOT generate Eclipse CDT projects. Instead, it generates XML
-files that can be imported into an Eclipse CDT project. The XML file contains a
-list of include paths and symbols (i.e. defines).
-
-Because a full .cproject definition is not created by this generator, it's not
-possible to properly define the include dirs and symbols for each file
-individually.  Instead, one set of includes/symbols is generated for the entire
-project.  This works fairly well (and is a vast improvement in general), but may
-still result in a few indexer issues here and there.
-
-This generator has no automated tests, so expect it to be broken.
-"""
-
-from xml.sax.saxutils import escape
-import os.path
-import subprocess
-import gyp
-import gyp.common
-import shlex
-
-generator_wants_static_library_dependencies_adjusted = False
-
-generator_default_variables = {
-}
-
-for dirname in ['INTERMEDIATE_DIR', 'PRODUCT_DIR', 'LIB_DIR', 'SHARED_LIB_DIR']:
-  # Some gyp steps fail if these are empty(!).
-  generator_default_variables[dirname] = 'dir'
-
-for unused in ['RULE_INPUT_PATH', 'RULE_INPUT_ROOT', 'RULE_INPUT_NAME',
-               'RULE_INPUT_DIRNAME', 'RULE_INPUT_EXT',
-               'EXECUTABLE_PREFIX', 'EXECUTABLE_SUFFIX',
-               'STATIC_LIB_PREFIX', 'STATIC_LIB_SUFFIX',
-               'SHARED_LIB_PREFIX', 'SHARED_LIB_SUFFIX',
-               'CONFIGURATION_NAME']:
-  generator_default_variables[unused] = ''
-
-# Include dirs will occasionaly use the SHARED_INTERMEDIATE_DIR variable as
-# part of the path when dealing with generated headers.  This value will be
-# replaced dynamically for each configuration.
-generator_default_variables['SHARED_INTERMEDIATE_DIR'] = \
-    '$SHARED_INTERMEDIATES_DIR'
-
-
-def CalculateVariables(default_variables, params):
-  generator_flags = params.get('generator_flags', {})
-  for key, val in generator_flags.items():
-    default_variables.setdefault(key, val)
-  default_variables.setdefault('OS', gyp.common.GetFlavor(params))
-
-
-def CalculateGeneratorInputInfo(params):
-  """Calculate the generator specific info that gets fed to input (called by
-  gyp)."""
-  generator_flags = params.get('generator_flags', {})
-  if generator_flags.get('adjust_static_libraries', False):
-    global generator_wants_static_library_dependencies_adjusted
-    generator_wants_static_library_dependencies_adjusted = True
-
-
-def GetAllIncludeDirectories(target_list, target_dicts,
-                             shared_intermediates_dir, config_name):
-  """Calculate the set of include directories to be used.
-
-  Returns:
-    A list including all the include_dir's specified for every target followed
-    by any include directories that were added as cflag compiler options.
-  """
-
-  gyp_includes_set = set()
-  compiler_includes_list = []
-
-  for target_name in target_list:
-    target = target_dicts[target_name]
-    if config_name in target['configurations']:
-      config = target['configurations'][config_name]
-
-      # Look for any include dirs that were explicitly added via cflags. This
-      # may be done in gyp files to force certain includes to come at the end.
-      # TODO(jgreenwald): Change the gyp files to not abuse cflags for this, and
-      # remove this.
-      cflags = config['cflags']
-      for cflag in cflags:
-        include_dir = ''
-        if cflag.startswith('-I'):
-          include_dir = cflag[2:]
-        if include_dir and not include_dir in compiler_includes_list:
-          compiler_includes_list.append(include_dir)
-
-      # Find standard gyp include dirs.
-      if config.has_key('include_dirs'):
-        include_dirs = config['include_dirs']
-        for include_dir in include_dirs:
-          include_dir = include_dir.replace('$SHARED_INTERMEDIATES_DIR',
-                                            shared_intermediates_dir)
-          if not os.path.isabs(include_dir):
-            base_dir = os.path.dirname(target_name)
-
-            include_dir = base_dir + '/' + include_dir
-            include_dir = os.path.abspath(include_dir)
-
-          if not include_dir in gyp_includes_set:
-            gyp_includes_set.add(include_dir)
-
-
-  # Generate a list that has all the include dirs.
-  all_includes_list = list(gyp_includes_set)
-  all_includes_list.sort()
-  for compiler_include in compiler_includes_list:
-    if not compiler_include in gyp_includes_set:
-      all_includes_list.append(compiler_include)
-
-  # All done.
-  return all_includes_list
-
-
-def GetCompilerPath(target_list, target_dicts, data):
-  """Determine a command that can be used to invoke the compiler.
-
-  Returns:
-    If this is a gyp project that has explicit make settings, try to determine
-    the compiler from that.  Otherwise, see if a compiler was specified via the
-    CC_target environment variable.
-  """
-
-  # First, see if the compiler is configured in make's settings.
-  build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
-  make_global_settings_dict = data[build_file].get('make_global_settings', {})
-  for key, value in make_global_settings_dict:
-    if key in ['CC', 'CXX']:
-      return value
-
-  # Check to see if the compiler was specified as an environment variable.
-  for key in ['CC_target', 'CC', 'CXX']:
-    compiler = os.environ.get(key)
-    if compiler:
-      return compiler
-
-  return 'gcc'
-
-
-def GetAllDefines(target_list, target_dicts, data, config_name):
-  """Calculate the defines for a project.
-
-  Returns:
-    A dict that includes explict defines declared in gyp files along with all of
-    the default defines that the compiler uses.
-  """
-
-  # Get defines declared in the gyp files.
-  all_defines = {}
-  for target_name in target_list:
-    target = target_dicts[target_name]
-
-    if config_name in target['configurations']:
-      config = target['configurations'][config_name]
-      for define in config['defines']:
-        split_define = define.split('=', 1)
-        if len(split_define) == 1:
-          split_define.append('1')
-        if split_define[0].strip() in all_defines:
-          # Already defined
-          continue
-
-        all_defines[split_define[0].strip()] = split_define[1].strip()
-
-  # Get default compiler defines (if possible).
-  cc_target = GetCompilerPath(target_list, target_dicts, data)
-  if cc_target:
-    command = shlex.split(cc_target)
-    command.extend(['-E', '-dM', '-'])
-    cpp_proc = subprocess.Popen(args=command, cwd='.',
-                                stdin=subprocess.PIPE, stdout=subprocess.PIPE)
-    cpp_output = cpp_proc.communicate()[0]
-    cpp_lines = cpp_output.split('\n')
-    for cpp_line in cpp_lines:
-      if not cpp_line.strip():
-        continue
-      cpp_line_parts = cpp_line.split(' ', 2)
-      key = cpp_line_parts[1]
-      if len(cpp_line_parts) >= 3:
-        val = cpp_line_parts[2]
-      else:
-        val = '1'
-      all_defines[key] = val
-
-  return all_defines
-
-
-def WriteIncludePaths(out, eclipse_langs, include_dirs):
-  """Write the includes section of a CDT settings export file."""
-
-  out.write('  <section name="org.eclipse.cdt.internal.ui.wizards.' \
-            'settingswizards.IncludePaths">\n')
-  out.write('    <language name="holder for library settings"></language>\n')
-  for lang in eclipse_langs:
-    out.write('    <language name="%s">\n' % lang)
-    for include_dir in include_dirs:
-      out.write('      <includepath workspace_path="false">%s</includepath>\n' %
-                include_dir)
-    out.write('    </language>\n')
-  out.write('  </section>\n')
-
-
-def WriteMacros(out, eclipse_langs, defines):
-  """Write the macros section of a CDT settings export file."""
-
-  out.write('  <section name="org.eclipse.cdt.internal.ui.wizards.' \
-            'settingswizards.Macros">\n')
-  out.write('    <language name="holder for library settings"></language>\n')
-  for lang in eclipse_langs:
-    out.write('    <language name="%s">\n' % lang)
-    for key in sorted(defines.iterkeys()):
-      out.write('      <macro><name>%s</name><value>%s</value></macro>\n' %
-                (escape(key), escape(defines[key])))
-    out.write('    </language>\n')
-  out.write('  </section>\n')
-
-
-def GenerateOutputForConfig(target_list, target_dicts, data, params,
-                            config_name):
-  options = params['options']
-  generator_flags = params.get('generator_flags', {})
-
-  # build_dir: relative path from source root to our output files.
-  # e.g. "out/Debug"
-  build_dir = os.path.join(generator_flags.get('output_dir', 'out'),
-                           config_name)
-
-  toplevel_build = os.path.join(options.toplevel_dir, build_dir)
-  shared_intermediate_dir = os.path.join(toplevel_build, 'obj', 'gen')
-
-  if not os.path.exists(toplevel_build):
-    os.makedirs(toplevel_build)
-  out = open(os.path.join(toplevel_build, 'eclipse-cdt-settings.xml'), 'w')
-
-  out.write('<?xml version="1.0" encoding="UTF-8"?>\n')
-  out.write('<cdtprojectproperties>\n')
-
-  eclipse_langs = ['C++ Source File', 'C Source File', 'Assembly Source File',
-                   'GNU C++', 'GNU C', 'Assembly']
-  include_dirs = GetAllIncludeDirectories(target_list, target_dicts,
-                                          shared_intermediate_dir, config_name)
-  WriteIncludePaths(out, eclipse_langs, include_dirs)
-  defines = GetAllDefines(target_list, target_dicts, data, config_name)
-  WriteMacros(out, eclipse_langs, defines)
-
-  out.write('</cdtprojectproperties>\n')
-  out.close()
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  """Generate an XML settings file that can be imported into a CDT project."""
-
-  if params['options'].generator_output:
-    raise NotImplementedError, "--generator_output not implemented for eclipse"
-
-  user_config = params.get('generator_flags', {}).get('config', None)
-  if user_config:
-    GenerateOutputForConfig(target_list, target_dicts, data, params,
-                            user_config)
-  else:
-    config_names = target_dicts[target_list[0]]['configurations'].keys()
-    for config_name in config_names:
-      GenerateOutputForConfig(target_list, target_dicts, data, params,
-                              config_name)
-
diff --git a/tools/gyp/pylib/gyp/generator/gypd.py b/tools/gyp/pylib/gyp/generator/gypd.py
deleted file mode 100644
index 22ef57f..0000000
--- a/tools/gyp/pylib/gyp/generator/gypd.py
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright (c) 2011 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""gypd output module
-
-This module produces gyp input as its output.  Output files are given the
-.gypd extension to avoid overwriting the .gyp files that they are generated
-from.  Internal references to .gyp files (such as those found in
-"dependencies" sections) are not adjusted to point to .gypd files instead;
-unlike other paths, which are relative to the .gyp or .gypd file, such paths
-are relative to the directory from which gyp was run to create the .gypd file.
-
-This generator module is intended to be a sample and a debugging aid, hence
-the "d" for "debug" in .gypd.  It is useful to inspect the results of the
-various merges, expansions, and conditional evaluations performed by gyp
-and to see a representation of what would be fed to a generator module.
-
-It's not advisable to rename .gypd files produced by this module to .gyp,
-because they will have all merges, expansions, and evaluations already
-performed and the relevant constructs not present in the output; paths to
-dependencies may be wrong; and various sections that do not belong in .gyp
-files such as such as "included_files" and "*_excluded" will be present.
-Output will also be stripped of comments.  This is not intended to be a
-general-purpose gyp pretty-printer; for that, you probably just want to
-run "pprint.pprint(eval(open('source.gyp').read()))", which will still strip
-comments but won't do all of the other things done to this module's output.
-
-The specific formatting of the output generated by this module is subject
-to change.
-"""
-
-
-import gyp.common
-import errno
-import os
-import pprint
-
-
-# These variables should just be spit back out as variable references.
-_generator_identity_variables = [
-  'EXECUTABLE_PREFIX',
-  'EXECUTABLE_SUFFIX',
-  'INTERMEDIATE_DIR',
-  'PRODUCT_DIR',
-  'RULE_INPUT_ROOT',
-  'RULE_INPUT_DIRNAME',
-  'RULE_INPUT_EXT',
-  'RULE_INPUT_NAME',
-  'RULE_INPUT_PATH',
-  'SHARED_INTERMEDIATE_DIR',
-]
-
-# gypd doesn't define a default value for OS like many other generator
-# modules.  Specify "-D OS=whatever" on the command line to provide a value.
-generator_default_variables = {
-}
-
-# gypd supports multiple toolsets
-generator_supports_multiple_toolsets = True
-
-# TODO(mark): This always uses <, which isn't right.  The input module should
-# notify the generator to tell it which phase it is operating in, and this
-# module should use < for the early phase and then switch to > for the late
-# phase.  Bonus points for carrying @ back into the output too.
-for v in _generator_identity_variables:
-  generator_default_variables[v] = '<(%s)' % v
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  output_files = {}
-  for qualified_target in target_list:
-    [input_file, target] = \
-        gyp.common.ParseQualifiedTarget(qualified_target)[0:2]
-
-    if input_file[-4:] != '.gyp':
-      continue
-    input_file_stem = input_file[:-4]
-    output_file = input_file_stem + params['options'].suffix + '.gypd'
-
-    if not output_file in output_files:
-      output_files[output_file] = input_file
-
-  for output_file, input_file in output_files.iteritems():
-    output = open(output_file, 'w')
-    pprint.pprint(data[input_file], output)
-    output.close()
diff --git a/tools/gyp/pylib/gyp/generator/gypsh.py b/tools/gyp/pylib/gyp/generator/gypsh.py
deleted file mode 100644
index bd405f4..0000000
--- a/tools/gyp/pylib/gyp/generator/gypsh.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright (c) 2011 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""gypsh output module
-
-gypsh is a GYP shell.  It's not really a generator per se.  All it does is
-fire up an interactive Python session with a few local variables set to the
-variables passed to the generator.  Like gypd, it's intended as a debugging
-aid, to facilitate the exploration of .gyp structures after being processed
-by the input module.
-
-The expected usage is "gyp -f gypsh -D OS=desired_os".
-"""
-
-
-import code
-import sys
-
-
-# All of this stuff about generator variables was lovingly ripped from gypd.py.
-# That module has a much better description of what's going on and why.
-_generator_identity_variables = [
-  'EXECUTABLE_PREFIX',
-  'EXECUTABLE_SUFFIX',
-  'INTERMEDIATE_DIR',
-  'PRODUCT_DIR',
-  'RULE_INPUT_ROOT',
-  'RULE_INPUT_DIRNAME',
-  'RULE_INPUT_EXT',
-  'RULE_INPUT_NAME',
-  'RULE_INPUT_PATH',
-  'SHARED_INTERMEDIATE_DIR',
-]
-
-generator_default_variables = {
-}
-
-for v in _generator_identity_variables:
-  generator_default_variables[v] = '<(%s)' % v
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  locals = {
-        'target_list':  target_list,
-        'target_dicts': target_dicts,
-        'data':         data,
-      }
-
-  # Use a banner that looks like the stock Python one and like what
-  # code.interact uses by default, but tack on something to indicate what
-  # locals are available, and identify gypsh.
-  banner='Python %s on %s\nlocals.keys() = %s\ngypsh' % \
-         (sys.version, sys.platform, repr(sorted(locals.keys())))
-
-  code.interact(banner, local=locals)
diff --git a/tools/gyp/pylib/gyp/generator/make.py b/tools/gyp/pylib/gyp/generator/make.py
deleted file mode 100644
index eb045d8..0000000
--- a/tools/gyp/pylib/gyp/generator/make.py
+++ /dev/null
@@ -1,2153 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Notes:
-#
-# This is all roughly based on the Makefile system used by the Linux
-# kernel, but is a non-recursive make -- we put the entire dependency
-# graph in front of make and let it figure it out.
-#
-# The code below generates a separate .mk file for each target, but
-# all are sourced by the top-level Makefile.  This means that all
-# variables in .mk-files clobber one another.  Be careful to use :=
-# where appropriate for immediate evaluation, and similarly to watch
-# that you're not relying on a variable value to last beween different
-# .mk files.
-#
-# TODOs:
-#
-# Global settings and utility functions are currently stuffed in the
-# toplevel Makefile.  It may make sense to generate some .mk files on
-# the side to keep the the files readable.
-
-import os
-import re
-import sys
-import subprocess
-import gyp
-import gyp.common
-import gyp.xcode_emulation
-from gyp.common import GetEnvironFallback
-
-generator_default_variables = {
-  'EXECUTABLE_PREFIX': '',
-  'EXECUTABLE_SUFFIX': '',
-  'STATIC_LIB_PREFIX': 'lib',
-  'SHARED_LIB_PREFIX': 'lib',
-  'STATIC_LIB_SUFFIX': '.a',
-  'INTERMEDIATE_DIR': '$(obj).$(TOOLSET)/$(TARGET)/geni',
-  'SHARED_INTERMEDIATE_DIR': '$(obj)/gen',
-  'PRODUCT_DIR': '$(builddir)',
-  'RULE_INPUT_ROOT': '%(INPUT_ROOT)s',  # This gets expanded by Python.
-  'RULE_INPUT_DIRNAME': '%(INPUT_DIRNAME)s',  # This gets expanded by Python.
-  'RULE_INPUT_PATH': '$(abspath $<)',
-  'RULE_INPUT_EXT': '$(suffix $<)',
-  'RULE_INPUT_NAME': '$(notdir $<)',
-  'CONFIGURATION_NAME': '$(BUILDTYPE)',
-}
-
-# Make supports multiple toolsets
-generator_supports_multiple_toolsets = True
-
-# Request sorted dependencies in the order from dependents to dependencies.
-generator_wants_sorted_dependencies = False
-
-# Placates pylint.
-generator_additional_non_configuration_keys = []
-generator_additional_path_sections = []
-generator_extra_sources_for_rules = []
-
-
-def CalculateVariables(default_variables, params):
-  """Calculate additional variables for use in the build (called by gyp)."""
-  flavor = gyp.common.GetFlavor(params)
-  if flavor == 'mac':
-    default_variables.setdefault('OS', 'mac')
-    default_variables.setdefault('SHARED_LIB_SUFFIX', '.dylib')
-    default_variables.setdefault('SHARED_LIB_DIR',
-                                 generator_default_variables['PRODUCT_DIR'])
-    default_variables.setdefault('LIB_DIR',
-                                 generator_default_variables['PRODUCT_DIR'])
-
-    # Copy additional generator configuration data from Xcode, which is shared
-    # by the Mac Make generator.
-    import gyp.generator.xcode as xcode_generator
-    global generator_additional_non_configuration_keys
-    generator_additional_non_configuration_keys = getattr(xcode_generator,
-        'generator_additional_non_configuration_keys', [])
-    global generator_additional_path_sections
-    generator_additional_path_sections = getattr(xcode_generator,
-        'generator_additional_path_sections', [])
-    global generator_extra_sources_for_rules
-    generator_extra_sources_for_rules = getattr(xcode_generator,
-        'generator_extra_sources_for_rules', [])
-    COMPILABLE_EXTENSIONS.update({'.m': 'objc', '.mm' : 'objcxx'})
-  else:
-    operating_system = flavor
-    if flavor == 'android':
-      operating_system = 'linux'  # Keep this legacy behavior for now.
-    default_variables.setdefault('OS', operating_system)
-    default_variables.setdefault('SHARED_LIB_SUFFIX', '.so')
-    default_variables.setdefault('SHARED_LIB_DIR','$(builddir)/lib.$(TOOLSET)')
-    default_variables.setdefault('LIB_DIR', '$(obj).$(TOOLSET)')
-
-
-def CalculateGeneratorInputInfo(params):
-  """Calculate the generator specific info that gets fed to input (called by
-  gyp)."""
-  generator_flags = params.get('generator_flags', {})
-  android_ndk_version = generator_flags.get('android_ndk_version', None)
-  # Android NDK requires a strict link order.
-  if android_ndk_version:
-    global generator_wants_sorted_dependencies
-    generator_wants_sorted_dependencies = True
-
-
-def ensure_directory_exists(path):
-  dir = os.path.dirname(path)
-  if dir and not os.path.exists(dir):
-    os.makedirs(dir)
-
-
-# The .d checking code below uses these functions:
-# wildcard, sort, foreach, shell, wordlist
-# wildcard can handle spaces, the rest can't.
-# Since I could find no way to make foreach work with spaces in filenames
-# correctly, the .d files have spaces replaced with another character. The .d
-# file for
-#     Chromium\ Framework.framework/foo
-# is for example
-#     out/Release/.deps/out/Release/Chromium?Framework.framework/foo
-# This is the replacement character.
-SPACE_REPLACEMENT = '?'
-
-
-LINK_COMMANDS_LINUX = """\
-quiet_cmd_alink = AR($(TOOLSET)) $@
-cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)
-
-quiet_cmd_alink_thin = AR($(TOOLSET)) $@
-cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^)
-
-# Due to circular dependencies between libraries :(, we wrap the
-# special "figure out circular dependencies" flags around the entire
-# input list during linking.
-quiet_cmd_link = LINK($(TOOLSET)) $@
-cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--start-group $(LD_INPUTS) -Wl,--end-group $(LIBS)
-
-# We support two kinds of shared objects (.so):
-# 1) shared_library, which is just bundling together many dependent libraries
-# into a link line.
-# 2) loadable_module, which is generating a module intended for dlopen().
-#
-# They differ only slightly:
-# In the former case, we want to package all dependent code into the .so.
-# In the latter case, we want to package just the API exposed by the
-# outermost module.
-# This means shared_library uses --whole-archive, while loadable_module doesn't.
-# (Note that --whole-archive is incompatible with the --start-group used in
-# normal linking.)
-
-# Other shared-object link notes:
-# - Set SONAME to the library filename so our binaries don't reference
-# the local, absolute paths used on the link command-line.
-quiet_cmd_solink = SOLINK($(TOOLSET)) $@
-cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--whole-archive $(LD_INPUTS) -Wl,--no-whole-archive $(LIBS)
-
-quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
-cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--start-group $(filter-out FORCE_DO_CMD, $^) -Wl,--end-group $(LIBS)
-"""
-
-LINK_COMMANDS_MAC = """\
-quiet_cmd_alink = LIBTOOL-STATIC $@
-cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %.o,$^)
-
-quiet_cmd_link = LINK($(TOOLSET)) $@
-cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS)
-
-# TODO(thakis): Find out and document the difference between shared_library and
-# loadable_module on mac.
-quiet_cmd_solink = SOLINK($(TOOLSET)) $@
-cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS)
-
-# TODO(thakis): The solink_module rule is likely wrong. Xcode seems to pass
-# -bundle -single_module here (for osmesa.so).
-quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
-cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
-"""
-
-LINK_COMMANDS_ANDROID = """\
-quiet_cmd_alink = AR($(TOOLSET)) $@
-cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)
-
-quiet_cmd_alink_thin = AR($(TOOLSET)) $@
-cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^)
-
-# Due to circular dependencies between libraries :(, we wrap the
-# special "figure out circular dependencies" flags around the entire
-# input list during linking.
-quiet_cmd_link = LINK($(TOOLSET)) $@
-quiet_cmd_link_host = LINK($(TOOLSET)) $@
-cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--start-group $(LD_INPUTS) -Wl,--end-group $(LIBS)
-cmd_link_host = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
-
-# Other shared-object link notes:
-# - Set SONAME to the library filename so our binaries don't reference
-# the local, absolute paths used on the link command-line.
-quiet_cmd_solink = SOLINK($(TOOLSET)) $@
-cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--whole-archive $(LD_INPUTS) -Wl,--no-whole-archive $(LIBS)
-
-quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
-cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--start-group $(filter-out FORCE_DO_CMD, $^) -Wl,--end-group $(LIBS)
-quiet_cmd_solink_module_host = SOLINK_MODULE($(TOOLSET)) $@
-cmd_solink_module_host = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
-"""
-
-
-# Header of toplevel Makefile.
-# This should go into the build tree, but it's easier to keep it here for now.
-SHARED_HEADER = ("""\
-# We borrow heavily from the kernel build setup, though we are simpler since
-# we don't have Kconfig tweaking settings on us.
-
-# The implicit make rules have it looking for RCS files, among other things.
-# We instead explicitly write all the rules we care about.
-# It's even quicker (saves ~200ms) to pass -r on the command line.
-MAKEFLAGS=-r
-
-# The source directory tree.
-srcdir := %(srcdir)s
-abs_srcdir := $(abspath $(srcdir))
-
-# The name of the builddir.
-builddir_name ?= %(builddir)s
-
-# The V=1 flag on command line makes us verbosely print command lines.
-ifdef V
-  quiet=
-else
-  quiet=quiet_
-endif
-
-# Specify BUILDTYPE=Release on the command line for a release build.
-BUILDTYPE ?= %(default_configuration)s
-
-# Directory all our build output goes into.
-# Note that this must be two directories beneath src/ for unit tests to pass,
-# as they reach into the src/ directory for data with relative paths.
-builddir ?= $(builddir_name)/$(BUILDTYPE)
-abs_builddir := $(abspath $(builddir))
-depsdir := $(builddir)/.deps
-
-# Object output directory.
-obj := $(builddir)/obj
-abs_obj := $(abspath $(obj))
-
-# We build up a list of every single one of the targets so we can slurp in the
-# generated dependency rule Makefiles in one pass.
-all_deps :=
-
-%(make_global_settings)s
-
-# C++ apps need to be linked with g++.
-#
-# Note: flock is used to seralize linking. Linking is a memory-intensive
-# process so running parallel links can often lead to thrashing.  To disable
-# the serialization, override LINK via an envrionment variable as follows:
-#
-#   export LINK=g++
-#
-# This will allow make to invoke N linker processes as specified in -jN.
-LINK ?= %(flock)s $(builddir)/linker.lock $(CXX)
-
-CC.target ?= %(CC.target)s
-CFLAGS.target ?= $(CFLAGS)
-CXX.target ?= %(CXX.target)s
-CXXFLAGS.target ?= $(CXXFLAGS)
-LINK.target ?= %(LINK.target)s
-LDFLAGS.target ?= $(LDFLAGS)
-AR.target ?= $(AR)
-
-# TODO(evan): move all cross-compilation logic to gyp-time so we don't need
-# to replicate this environment fallback in make as well.
-CC.host ?= %(CC.host)s
-CFLAGS.host ?=
-CXX.host ?= %(CXX.host)s
-CXXFLAGS.host ?=
-LINK.host ?= %(LINK.host)s
-LDFLAGS.host ?=
-AR.host ?= %(AR.host)s
-
-# Define a dir function that can handle spaces.
-# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions
-# "leading spaces cannot appear in the text of the first argument as written.
-# These characters can be put into the argument value by variable substitution."
-empty :=
-space := $(empty) $(empty)
-
-# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces
-replace_spaces = $(subst $(space),""" + SPACE_REPLACEMENT + """,$1)
-unreplace_spaces = $(subst """ + SPACE_REPLACEMENT + """,$(space),$1)
-dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1)))
-
-# Flags to make gcc output dependency info.  Note that you need to be
-# careful here to use the flags that ccache and distcc can understand.
-# We write to a dep file on the side first and then rename at the end
-# so we can't end up with a broken dep file.
-depfile = $(depsdir)/$(call replace_spaces,$@).d
-DEPFLAGS = -MMD -MF $(depfile).raw
-
-# We have to fixup the deps output in a few ways.
-# (1) the file output should mention the proper .o file.
-# ccache or distcc lose the path to the target, so we convert a rule of
-# the form:
-#   foobar.o: DEP1 DEP2
-# into
-#   path/to/foobar.o: DEP1 DEP2
-# (2) we want missing files not to cause us to fail to build.
-# We want to rewrite
-#   foobar.o: DEP1 DEP2 \\
-#               DEP3
-# to
-#   DEP1:
-#   DEP2:
-#   DEP3:
-# so if the files are missing, they're just considered phony rules.
-# We have to do some pretty insane escaping to get those backslashes
-# and dollar signs past make, the shell, and sed at the same time.
-# Doesn't work with spaces, but that's fine: .d files have spaces in
-# their names replaced with other characters."""
-r"""
-define fixup_dep
-# The depfile may not exist if the input file didn't have any #includes.
-touch $(depfile).raw
-# Fixup path as in (1).
-sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile)
-# Add extra rules as in (2).
-# We remove slashes and replace spaces with new lines;
-# remove blank lines;
-# delete the first line and append a colon to the remaining lines.
-sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\
-  grep -v '^$$'                             |\
-  sed -e 1d -e 's|$$|:|'                     \
-    >> $(depfile)
-rm $(depfile).raw
-endef
-"""
-"""
-# Command definitions:
-# - cmd_foo is the actual command to run;
-# - quiet_cmd_foo is the brief-output summary of the command.
-
-quiet_cmd_cc = CC($(TOOLSET)) $@
-cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $<
-
-quiet_cmd_cxx = CXX($(TOOLSET)) $@
-cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $<
-%(extra_commands)s
-quiet_cmd_touch = TOUCH $@
-cmd_touch = touch $@
-
-quiet_cmd_copy = COPY $@
-# send stderr to /dev/null to ignore messages when linking directories.
-cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@")
-
-%(link_commands)s
-"""
-
-r"""
-# Define an escape_quotes function to escape single quotes.
-# This allows us to handle quotes properly as long as we always use
-# use single quotes and escape_quotes.
-escape_quotes = $(subst ','\'',$(1))
-# This comment is here just to include a ' to unconfuse syntax highlighting.
-# Define an escape_vars function to escape '$' variable syntax.
-# This allows us to read/write command lines with shell variables (e.g.
-# $LD_LIBRARY_PATH), without triggering make substitution.
-escape_vars = $(subst $$,$$$$,$(1))
-# Helper that expands to a shell command to echo a string exactly as it is in
-# make. This uses printf instead of echo because printf's behaviour with respect
-# to escape sequences is more portable than echo's across different shells
-# (e.g., dash, bash).
-exact_echo = printf '%%s\n' '$(call escape_quotes,$(1))'
-"""
-"""
-# Helper to compare the command we're about to run against the command
-# we logged the last time we ran the command.  Produces an empty
-# string (false) when the commands match.
-# Tricky point: Make has no string-equality test function.
-# The kernel uses the following, but it seems like it would have false
-# positives, where one string reordered its arguments.
-#   arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \\
-#                       $(filter-out $(cmd_$@), $(cmd_$(1))))
-# We instead substitute each for the empty string into the other, and
-# say they're equal if both substitutions produce the empty string.
-# .d files contain """ + SPACE_REPLACEMENT + \
-                   """ instead of spaces, take that into account.
-command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\\
-                       $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1))))
-
-# Helper that is non-empty when a prerequisite changes.
-# Normally make does this implicitly, but we force rules to always run
-# so we can check their command lines.
-#   $? -- new prerequisites
-#   $| -- order-only dependencies
-prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?))
-
-# Helper that executes all postbuilds, and deletes the output file when done
-# if any of the postbuilds failed.
-define do_postbuilds
-  @E=0;\\
-  for p in $(POSTBUILDS); do\\
-    eval $$p;\\
-    F=$$?;\\
-    if [ $$F -ne 0 ]; then\\
-      E=$$F;\\
-    fi;\\
-  done;\\
-  if [ $$E -ne 0 ]; then\\
-    rm -rf "$@";\\
-    exit $$E;\\
-  fi
-endef
-
-# do_cmd: run a command via the above cmd_foo names, if necessary.
-# Should always run for a given target to handle command-line changes.
-# Second argument, if non-zero, makes it do asm/C/C++ dependency munging.
-# Third argument, if non-zero, makes it do POSTBUILDS processing.
-# Note: We intentionally do NOT call dirx for depfile, since it contains """ + \
-                                                     SPACE_REPLACEMENT + """ for
-# spaces already and dirx strips the """ + SPACE_REPLACEMENT + \
-                                     """ characters.
-define do_cmd
-$(if $(or $(command_changed),$(prereq_changed)),
-  @$(call exact_echo,  $($(quiet)cmd_$(1)))
-  @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))"
-  $(if $(findstring flock,$(word %(flock_index)d,$(cmd_$1))),
-    @$(cmd_$(1))
-    @echo "  $(quiet_cmd_$(1)): Finished",
-    @$(cmd_$(1))
-  )
-  @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile)
-  @$(if $(2),$(fixup_dep))
-  $(if $(and $(3), $(POSTBUILDS)),
-    $(call do_postbuilds)
-  )
-)
-endef
-
-# Declare the "%(default_target)s" target first so it is the default,
-# even though we don't have the deps yet.
-.PHONY: %(default_target)s
-%(default_target)s:
-
-# make looks for ways to re-generate included makefiles, but in our case, we
-# don't have a direct way. Explicitly telling make that it has nothing to do
-# for them makes it go faster.
-%%.d: ;
-
-# Use FORCE_DO_CMD to force a target to run.  Should be coupled with
-# do_cmd.
-.PHONY: FORCE_DO_CMD
-FORCE_DO_CMD:
-
-""")
-
-SHARED_HEADER_MAC_COMMANDS = """
-quiet_cmd_objc = CXX($(TOOLSET)) $@
-cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $<
-
-quiet_cmd_objcxx = CXX($(TOOLSET)) $@
-cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $<
-
-# Commands for precompiled header files.
-quiet_cmd_pch_c = CXX($(TOOLSET)) $@
-cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $<
-quiet_cmd_pch_cc = CXX($(TOOLSET)) $@
-cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $<
-quiet_cmd_pch_m = CXX($(TOOLSET)) $@
-cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $<
-quiet_cmd_pch_mm = CXX($(TOOLSET)) $@
-cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $<
-
-# gyp-mac-tool is written next to the root Makefile by gyp.
-# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd
-# already.
-quiet_cmd_mac_tool = MACTOOL $(4) $<
-cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@"
-
-quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@
-cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4)
-
-quiet_cmd_infoplist = INFOPLIST $@
-cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@"
-"""
-
-SHARED_HEADER_SUN_COMMANDS = """
-# gyp-sun-tool is written next to the root Makefile by gyp.
-# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd
-# already.
-quiet_cmd_sun_tool = SUNTOOL $(4) $<
-cmd_sun_tool = ./gyp-sun-tool $(4) $< "$@"
-"""
-
-
-def WriteRootHeaderSuffixRules(writer):
-  extensions = sorted(COMPILABLE_EXTENSIONS.keys(), key=str.lower)
-
-  writer.write('# Suffix rules, putting all outputs into $(obj).\n')
-  for ext in extensions:
-    writer.write('$(obj).$(TOOLSET)/%%.o: $(srcdir)/%%%s FORCE_DO_CMD\n' % ext)
-    writer.write('\t@$(call do_cmd,%s,1)\n' % COMPILABLE_EXTENSIONS[ext])
-
-  writer.write('\n# Try building from generated source, too.\n')
-  for ext in extensions:
-    writer.write(
-        '$(obj).$(TOOLSET)/%%.o: $(obj).$(TOOLSET)/%%%s FORCE_DO_CMD\n' % ext)
-    writer.write('\t@$(call do_cmd,%s,1)\n' % COMPILABLE_EXTENSIONS[ext])
-  writer.write('\n')
-  for ext in extensions:
-    writer.write('$(obj).$(TOOLSET)/%%.o: $(obj)/%%%s FORCE_DO_CMD\n' % ext)
-    writer.write('\t@$(call do_cmd,%s,1)\n' % COMPILABLE_EXTENSIONS[ext])
-  writer.write('\n')
-
-
-SHARED_HEADER_SUFFIX_RULES_COMMENT1 = ("""\
-# Suffix rules, putting all outputs into $(obj).
-""")
-
-
-SHARED_HEADER_SUFFIX_RULES_COMMENT2 = ("""\
-# Try building from generated source, too.
-""")
-
-
-SHARED_FOOTER = """\
-# "all" is a concatenation of the "all" targets from all the included
-# sub-makefiles. This is just here to clarify.
-all:
-
-# Add in dependency-tracking rules.  $(all_deps) is the list of every single
-# target in our tree. Only consider the ones with .d (dependency) info:
-d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d))
-ifneq ($(d_files),)
-  include $(d_files)
-endif
-"""
-
-header = """\
-# This file is generated by gyp; do not edit.
-
-"""
-
-# Maps every compilable file extension to the do_cmd that compiles it.
-COMPILABLE_EXTENSIONS = {
-  '.c': 'cc',
-  '.cc': 'cxx',
-  '.cpp': 'cxx',
-  '.cxx': 'cxx',
-  '.s': 'cc',
-  '.S': 'cc',
-}
-
-def Compilable(filename):
-  """Return true if the file is compilable (should be in OBJS)."""
-  for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS):
-    if res:
-      return True
-  return False
-
-
-def Linkable(filename):
-  """Return true if the file is linkable (should be on the link line)."""
-  return filename.endswith('.o')
-
-
-def Target(filename):
-  """Translate a compilable filename to its .o target."""
-  return os.path.splitext(filename)[0] + '.o'
-
-
-def EscapeShellArgument(s):
-  """Quotes an argument so that it will be interpreted literally by a POSIX
-     shell. Taken from
-     http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-ossystem-calls-in-python
-     """
-  return "'" + s.replace("'", "'\\''") + "'"
-
-
-def EscapeMakeVariableExpansion(s):
-  """Make has its own variable expansion syntax using $. We must escape it for
-     string to be interpreted literally."""
-  return s.replace('$', '$$')
-
-
-def EscapeCppDefine(s):
-  """Escapes a CPP define so that it will reach the compiler unaltered."""
-  s = EscapeShellArgument(s)
-  s = EscapeMakeVariableExpansion(s)
-  # '#' characters must be escaped even embedded in a string, else Make will
-  # treat it as the start of a comment.
-  return s.replace('#', r'\#')
-
-
-def QuoteIfNecessary(string):
-  """TODO: Should this ideally be replaced with one or more of the above
-     functions?"""
-  if '"' in string:
-    string = '"' + string.replace('"', '\\"') + '"'
-  return string
-
-
-def StringToMakefileVariable(string):
-  """Convert a string to a value that is acceptable as a make variable name."""
-  return re.sub('[^a-zA-Z0-9_]', '_', string)
-
-
-srcdir_prefix = ''
-def Sourceify(path):
-  """Convert a path to its source directory form."""
-  if '$(' in path:
-    return path
-  if os.path.isabs(path):
-    return path
-  return srcdir_prefix + path
-
-
-def QuoteSpaces(s, quote=r'\ '):
-  return s.replace(' ', quote)
-
-
-def InvertRelativePath(path):
-  """Given a relative path like foo/bar, return the inverse relative path:
-  the path from the relative path back to the origin dir.
-
-  E.g. os.path.normpath(os.path.join(path, InvertRelativePath(path)))
-  should always produce the empty string."""
-
-  if not path:
-    return path
-  # Only need to handle relative paths into subdirectories for now.
-  assert '..' not in path, path
-  depth = len(path.split(os.path.sep))
-  return os.path.sep.join(['..'] * depth)
-
-
-# Map from qualified target to path to output.
-target_outputs = {}
-# Map from qualified target to any linkable output.  A subset
-# of target_outputs.  E.g. when mybinary depends on liba, we want to
-# include liba in the linker line; when otherbinary depends on
-# mybinary, we just want to build mybinary first.
-target_link_deps = {}
-
-
-class MakefileWriter:
-  """MakefileWriter packages up the writing of one target-specific foobar.mk.
-
-  Its only real entry point is Write(), and is mostly used for namespacing.
-  """
-
-  def __init__(self, generator_flags, flavor):
-    self.generator_flags = generator_flags
-    self.flavor = flavor
-
-    self.suffix_rules_srcdir = {}
-    self.suffix_rules_objdir1 = {}
-    self.suffix_rules_objdir2 = {}
-
-    # Generate suffix rules for all compilable extensions.
-    for ext in COMPILABLE_EXTENSIONS.keys():
-      # Suffix rules for source folder.
-      self.suffix_rules_srcdir.update({ext: ("""\
-$(obj).$(TOOLSET)/$(TARGET)/%%.o: $(srcdir)/%%%s FORCE_DO_CMD
-	@$(call do_cmd,%s,1)
-""" % (ext, COMPILABLE_EXTENSIONS[ext]))})
-
-      # Suffix rules for generated source files.
-      self.suffix_rules_objdir1.update({ext: ("""\
-$(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj).$(TOOLSET)/%%%s FORCE_DO_CMD
-	@$(call do_cmd,%s,1)
-""" % (ext, COMPILABLE_EXTENSIONS[ext]))})
-      self.suffix_rules_objdir2.update({ext: ("""\
-$(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
-	@$(call do_cmd,%s,1)
-""" % (ext, COMPILABLE_EXTENSIONS[ext]))})
-
-
-  def Write(self, qualified_target, base_path, output_filename, spec, configs,
-            part_of_all):
-    """The main entry point: writes a .mk file for a single target.
-
-    Arguments:
-      qualified_target: target we're generating
-      base_path: path relative to source root we're building in, used to resolve
-                 target-relative paths
-      output_filename: output .mk file name to write
-      spec, configs: gyp info
-      part_of_all: flag indicating this target is part of 'all'
-    """
-    ensure_directory_exists(output_filename)
-
-    self.fp = open(output_filename, 'w')
-
-    self.fp.write(header)
-
-    self.qualified_target = qualified_target
-    self.path = base_path
-    self.target = spec['target_name']
-    self.type = spec['type']
-    self.toolset = spec['toolset']
-
-    self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec)
-    if self.flavor == 'mac':
-      self.xcode_settings = gyp.xcode_emulation.XcodeSettings(spec)
-    else:
-      self.xcode_settings = None
-
-    deps, link_deps = self.ComputeDeps(spec)
-
-    # Some of the generation below can add extra output, sources, or
-    # link dependencies.  All of the out params of the functions that
-    # follow use names like extra_foo.
-    extra_outputs = []
-    extra_sources = []
-    extra_link_deps = []
-    extra_mac_bundle_resources = []
-    mac_bundle_deps = []
-
-    if self.is_mac_bundle:
-      self.output = self.ComputeMacBundleOutput(spec)
-      self.output_binary = self.ComputeMacBundleBinaryOutput(spec)
-    else:
-      self.output = self.output_binary = self.ComputeOutput(spec)
-
-    self.is_standalone_static_library = bool(
-        spec.get('standalone_static_library', 0))
-    self._INSTALLABLE_TARGETS = ('executable', 'loadable_module',
-                                 'shared_library')
-    if (self.is_standalone_static_library or
-        self.type in self._INSTALLABLE_TARGETS):
-      self.alias = os.path.basename(self.output)
-      install_path = self._InstallableTargetInstallPath()
-    else:
-      self.alias = self.output
-      install_path = self.output
-
-    self.WriteLn("TOOLSET := " + self.toolset)
-    self.WriteLn("TARGET := " + self.target)
-
-    # Actions must come first, since they can generate more OBJs for use below.
-    if 'actions' in spec:
-      self.WriteActions(spec['actions'], extra_sources, extra_outputs,
-                        extra_mac_bundle_resources, part_of_all)
-
-    # Rules must be early like actions.
-    if 'rules' in spec:
-      self.WriteRules(spec['rules'], extra_sources, extra_outputs,
-                      extra_mac_bundle_resources, part_of_all)
-
-    if 'copies' in spec:
-      self.WriteCopies(spec['copies'], extra_outputs, part_of_all)
-
-    # Bundle resources.
-    if self.is_mac_bundle:
-      all_mac_bundle_resources = (
-          spec.get('mac_bundle_resources', []) + extra_mac_bundle_resources)
-      self.WriteMacBundleResources(all_mac_bundle_resources, mac_bundle_deps)
-      self.WriteMacInfoPlist(mac_bundle_deps)
-
-    # Sources.
-    all_sources = spec.get('sources', []) + extra_sources
-    if all_sources:
-      self.WriteSources(
-          configs, deps, all_sources, extra_outputs,
-          extra_link_deps, part_of_all,
-          gyp.xcode_emulation.MacPrefixHeader(
-              self.xcode_settings, lambda p: Sourceify(self.Absolutify(p)),
-              self.Pchify))
-      sources = filter(Compilable, all_sources)
-      if sources:
-        self.WriteLn(SHARED_HEADER_SUFFIX_RULES_COMMENT1)
-        extensions = set([os.path.splitext(s)[1] for s in sources])
-        for ext in extensions:
-          if ext in self.suffix_rules_srcdir:
-            self.WriteLn(self.suffix_rules_srcdir[ext])
-        self.WriteLn(SHARED_HEADER_SUFFIX_RULES_COMMENT2)
-        for ext in extensions:
-          if ext in self.suffix_rules_objdir1:
-            self.WriteLn(self.suffix_rules_objdir1[ext])
-        for ext in extensions:
-          if ext in self.suffix_rules_objdir2:
-            self.WriteLn(self.suffix_rules_objdir2[ext])
-        self.WriteLn('# End of this set of suffix rules')
-
-        # Add dependency from bundle to bundle binary.
-        if self.is_mac_bundle:
-          mac_bundle_deps.append(self.output_binary)
-
-    self.WriteTarget(spec, configs, deps, extra_link_deps + link_deps,
-                     mac_bundle_deps, extra_outputs, part_of_all)
-
-    # Update global list of target outputs, used in dependency tracking.
-    target_outputs[qualified_target] = install_path
-
-    # Update global list of link dependencies.
-    if self.type in ('static_library', 'shared_library'):
-      target_link_deps[qualified_target] = self.output_binary
-
-    # Currently any versions have the same effect, but in future the behavior
-    # could be different.
-    if self.generator_flags.get('android_ndk_version', None):
-      self.WriteAndroidNdkModuleRule(self.target, all_sources, link_deps)
-
-    self.fp.close()
-
-
-  def WriteSubMake(self, output_filename, makefile_path, targets, build_dir):
-    """Write a "sub-project" Makefile.
-
-    This is a small, wrapper Makefile that calls the top-level Makefile to build
-    the targets from a single gyp file (i.e. a sub-project).
-
-    Arguments:
-      output_filename: sub-project Makefile name to write
-      makefile_path: path to the top-level Makefile
-      targets: list of "all" targets for this sub-project
-      build_dir: build output directory, relative to the sub-project
-    """
-    ensure_directory_exists(output_filename)
-    self.fp = open(output_filename, 'w')
-    self.fp.write(header)
-    # For consistency with other builders, put sub-project build output in the
-    # sub-project dir (see test/subdirectory/gyptest-subdir-all.py).
-    self.WriteLn('export builddir_name ?= %s' %
-                 os.path.join(os.path.dirname(output_filename), build_dir))
-    self.WriteLn('.PHONY: all')
-    self.WriteLn('all:')
-    if makefile_path:
-      makefile_path = ' -C ' + makefile_path
-    self.WriteLn('\t$(MAKE)%s %s' % (makefile_path, ' '.join(targets)))
-    self.fp.close()
-
-
-  def WriteActions(self, actions, extra_sources, extra_outputs,
-                   extra_mac_bundle_resources, part_of_all):
-    """Write Makefile code for any 'actions' from the gyp input.
-
-    extra_sources: a list that will be filled in with newly generated source
-                   files, if any
-    extra_outputs: a list that will be filled in with any outputs of these
-                   actions (used to make other pieces dependent on these
-                   actions)
-    part_of_all: flag indicating this target is part of 'all'
-    """
-    env = self.GetSortedXcodeEnv()
-    for action in actions:
-      name = StringToMakefileVariable('%s_%s' % (self.qualified_target,
-                                                 action['action_name']))
-      self.WriteLn('### Rules for action "%s":' % action['action_name'])
-      inputs = action['inputs']
-      outputs = action['outputs']
-
-      # Build up a list of outputs.
-      # Collect the output dirs we'll need.
-      dirs = set()
-      for out in outputs:
-        dir = os.path.split(out)[0]
-        if dir:
-          dirs.add(dir)
-      if int(action.get('process_outputs_as_sources', False)):
-        extra_sources += outputs
-      if int(action.get('process_outputs_as_mac_bundle_resources', False)):
-        extra_mac_bundle_resources += outputs
-
-      # Write the actual command.
-      action_commands = action['action']
-      if self.flavor == 'mac':
-        action_commands = [gyp.xcode_emulation.ExpandEnvVars(command, env)
-                          for command in action_commands]
-      command = gyp.common.EncodePOSIXShellList(action_commands)
-      if 'message' in action:
-        self.WriteLn('quiet_cmd_%s = ACTION %s $@' % (name, action['message']))
-      else:
-        self.WriteLn('quiet_cmd_%s = ACTION %s $@' % (name, name))
-      if len(dirs) > 0:
-        command = 'mkdir -p %s' % ' '.join(dirs) + '; ' + command
-
-      cd_action = 'cd %s; ' % Sourceify(self.path or '.')
-
-      # command and cd_action get written to a toplevel variable called
-      # cmd_foo. Toplevel variables can't handle things that change per
-      # makefile like $(TARGET), so hardcode the target.
-      command = command.replace('$(TARGET)', self.target)
-      cd_action = cd_action.replace('$(TARGET)', self.target)
-
-      # Set LD_LIBRARY_PATH in case the action runs an executable from this
-      # build which links to shared libs from this build.
-      # actions run on the host, so they should in theory only use host
-      # libraries, but until everything is made cross-compile safe, also use
-      # target libraries.
-      # TODO(piman): when everything is cross-compile safe, remove lib.target
-      self.WriteLn('cmd_%s = LD_LIBRARY_PATH=$(builddir)/lib.host:'
-                   '$(builddir)/lib.target:$$LD_LIBRARY_PATH; '
-                   'export LD_LIBRARY_PATH; '
-                   '%s%s'
-                   % (name, cd_action, command))
-      self.WriteLn()
-      outputs = map(self.Absolutify, outputs)
-      # The makefile rules are all relative to the top dir, but the gyp actions
-      # are defined relative to their containing dir.  This replaces the obj
-      # variable for the action rule with an absolute version so that the output
-      # goes in the right place.
-      # Only write the 'obj' and 'builddir' rules for the "primary" output (:1);
-      # it's superfluous for the "extra outputs", and this avoids accidentally
-      # writing duplicate dummy rules for those outputs.
-      # Same for environment.
-      self.WriteLn("%s: obj := $(abs_obj)" % QuoteSpaces(outputs[0]))
-      self.WriteLn("%s: builddir := $(abs_builddir)" % QuoteSpaces(outputs[0]))
-      self.WriteSortedXcodeEnv(outputs[0], self.GetSortedXcodeEnv())
-
-      for input in inputs:
-        assert ' ' not in input, (
-            "Spaces in action input filenames not supported (%s)"  % input)
-      for output in outputs:
-        assert ' ' not in output, (
-            "Spaces in action output filenames not supported (%s)"  % output)
-
-      # See the comment in WriteCopies about expanding env vars.
-      outputs = [gyp.xcode_emulation.ExpandEnvVars(o, env) for o in outputs]
-      inputs = [gyp.xcode_emulation.ExpandEnvVars(i, env) for i in inputs]
-
-      self.WriteDoCmd(outputs, map(Sourceify, map(self.Absolutify, inputs)),
-                      part_of_all=part_of_all, command=name)
-
-      # Stuff the outputs in a variable so we can refer to them later.
-      outputs_variable = 'action_%s_outputs' % name
-      self.WriteLn('%s := %s' % (outputs_variable, ' '.join(outputs)))
-      extra_outputs.append('$(%s)' % outputs_variable)
-      self.WriteLn()
-
-    self.WriteLn()
-
-
-  def WriteRules(self, rules, extra_sources, extra_outputs,
-                 extra_mac_bundle_resources, part_of_all):
-    """Write Makefile code for any 'rules' from the gyp input.
-
-    extra_sources: a list that will be filled in with newly generated source
-                   files, if any
-    extra_outputs: a list that will be filled in with any outputs of these
-                   rules (used to make other pieces dependent on these rules)
-    part_of_all: flag indicating this target is part of 'all'
-    """
-    env = self.GetSortedXcodeEnv()
-    for rule in rules:
-      name = StringToMakefileVariable('%s_%s' % (self.qualified_target,
-                                                 rule['rule_name']))
-      count = 0
-      self.WriteLn('### Generated for rule %s:' % name)
-
-      all_outputs = []
-
-      for rule_source in rule.get('rule_sources', []):
-        dirs = set()
-        (rule_source_dirname, rule_source_basename) = os.path.split(rule_source)
-        (rule_source_root, rule_source_ext) = \
-            os.path.splitext(rule_source_basename)
-
-        outputs = [self.ExpandInputRoot(out, rule_source_root,
-                                        rule_source_dirname)
-                   for out in rule['outputs']]
-
-        for out in outputs:
-          dir = os.path.dirname(out)
-          if dir:
-            dirs.add(dir)
-        if int(rule.get('process_outputs_as_sources', False)):
-          extra_sources += outputs
-        if int(rule.get('process_outputs_as_mac_bundle_resources', False)):
-          extra_mac_bundle_resources += outputs
-        inputs = map(Sourceify, map(self.Absolutify, [rule_source] +
-                                    rule.get('inputs', [])))
-        actions = ['$(call do_cmd,%s_%d)' % (name, count)]
-
-        if name == 'resources_grit':
-          # HACK: This is ugly.  Grit intentionally doesn't touch the
-          # timestamp of its output file when the file doesn't change,
-          # which is fine in hash-based dependency systems like scons
-          # and forge, but not kosher in the make world.  After some
-          # discussion, hacking around it here seems like the least
-          # amount of pain.
-          actions += ['@touch --no-create $@']
-
-        # See the comment in WriteCopies about expanding env vars.
-        outputs = [gyp.xcode_emulation.ExpandEnvVars(o, env) for o in outputs]
-        inputs = [gyp.xcode_emulation.ExpandEnvVars(i, env) for i in inputs]
-
-        outputs = map(self.Absolutify, outputs)
-        all_outputs += outputs
-        # Only write the 'obj' and 'builddir' rules for the "primary" output
-        # (:1); it's superfluous for the "extra outputs", and this avoids
-        # accidentally writing duplicate dummy rules for those outputs.
-        self.WriteLn('%s: obj := $(abs_obj)' % outputs[0])
-        self.WriteLn('%s: builddir := $(abs_builddir)' % outputs[0])
-        self.WriteMakeRule(outputs, inputs + ['FORCE_DO_CMD'], actions)
-        for output in outputs:
-          assert ' ' not in output, (
-              "Spaces in rule filenames not yet supported (%s)"  % output)
-        self.WriteLn('all_deps += %s' % ' '.join(outputs))
-
-        action = [self.ExpandInputRoot(ac, rule_source_root,
-                                       rule_source_dirname)
-                  for ac in rule['action']]
-        mkdirs = ''
-        if len(dirs) > 0:
-          mkdirs = 'mkdir -p %s; ' % ' '.join(dirs)
-        cd_action = 'cd %s; ' % Sourceify(self.path or '.')
-
-        # action, cd_action, and mkdirs get written to a toplevel variable
-        # called cmd_foo. Toplevel variables can't handle things that change
-        # per makefile like $(TARGET), so hardcode the target.
-        if self.flavor == 'mac':
-          action = [gyp.xcode_emulation.ExpandEnvVars(command, env)
-                    for command in action]
-        action = gyp.common.EncodePOSIXShellList(action)
-        action = action.replace('$(TARGET)', self.target)
-        cd_action = cd_action.replace('$(TARGET)', self.target)
-        mkdirs = mkdirs.replace('$(TARGET)', self.target)
-
-        # Set LD_LIBRARY_PATH in case the rule runs an executable from this
-        # build which links to shared libs from this build.
-        # rules run on the host, so they should in theory only use host
-        # libraries, but until everything is made cross-compile safe, also use
-        # target libraries.
-        # TODO(piman): when everything is cross-compile safe, remove lib.target
-        self.WriteLn(
-            "cmd_%(name)s_%(count)d = LD_LIBRARY_PATH="
-              "$(builddir)/lib.host:$(builddir)/lib.target:$$LD_LIBRARY_PATH; "
-              "export LD_LIBRARY_PATH; "
-              "%(cd_action)s%(mkdirs)s%(action)s" % {
-          'action': action,
-          'cd_action': cd_action,
-          'count': count,
-          'mkdirs': mkdirs,
-          'name': name,
-        })
-        self.WriteLn(
-            'quiet_cmd_%(name)s_%(count)d = RULE %(name)s_%(count)d $@' % {
-          'count': count,
-          'name': name,
-        })
-        self.WriteLn()
-        count += 1
-
-      outputs_variable = 'rule_%s_outputs' % name
-      self.WriteList(all_outputs, outputs_variable)
-      extra_outputs.append('$(%s)' % outputs_variable)
-
-      self.WriteLn('### Finished generating for rule: %s' % name)
-      self.WriteLn()
-    self.WriteLn('### Finished generating for all rules')
-    self.WriteLn('')
-
-
-  def WriteCopies(self, copies, extra_outputs, part_of_all):
-    """Write Makefile code for any 'copies' from the gyp input.
-
-    extra_outputs: a list that will be filled in with any outputs of this action
-                   (used to make other pieces dependent on this action)
-    part_of_all: flag indicating this target is part of 'all'
-    """
-    self.WriteLn('### Generated for copy rule.')
-
-    variable = StringToMakefileVariable(self.qualified_target + '_copies')
-    outputs = []
-    for copy in copies:
-      for path in copy['files']:
-        # Absolutify() may call normpath, and will strip trailing slashes.
-        path = Sourceify(self.Absolutify(path))
-        filename = os.path.split(path)[1]
-        output = Sourceify(self.Absolutify(os.path.join(copy['destination'],
-                                                        filename)))
-
-        # If the output path has variables in it, which happens in practice for
-        # 'copies', writing the environment as target-local doesn't work,
-        # because the variables are already needed for the target name.
-        # Copying the environment variables into global make variables doesn't
-        # work either, because then the .d files will potentially contain spaces
-        # after variable expansion, and .d file handling cannot handle spaces.
-        # As a workaround, manually expand variables at gyp time. Since 'copies'
-        # can't run scripts, there's no need to write the env then.
-        # WriteDoCmd() will escape spaces for .d files.
-        env = self.GetSortedXcodeEnv()
-        output = gyp.xcode_emulation.ExpandEnvVars(output, env)
-        path = gyp.xcode_emulation.ExpandEnvVars(path, env)
-        self.WriteDoCmd([output], [path], 'copy', part_of_all)
-        outputs.append(output)
-    self.WriteLn('%s = %s' % (variable, ' '.join(map(QuoteSpaces, outputs))))
-    extra_outputs.append('$(%s)' % variable)
-    self.WriteLn()
-
-
-  def WriteMacBundleResources(self, resources, bundle_deps):
-    """Writes Makefile code for 'mac_bundle_resources'."""
-    self.WriteLn('### Generated for mac_bundle_resources')
-
-    for output, res in gyp.xcode_emulation.GetMacBundleResources(
-        generator_default_variables['PRODUCT_DIR'], self.xcode_settings,
-        map(Sourceify, map(self.Absolutify, resources))):
-      self.WriteDoCmd([output], [res], 'mac_tool,,,copy-bundle-resource',
-                      part_of_all=True)
-      bundle_deps.append(output)
-
-
-  def WriteMacInfoPlist(self, bundle_deps):
-    """Write Makefile code for bundle Info.plist files."""
-    info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist(
-        generator_default_variables['PRODUCT_DIR'], self.xcode_settings,
-        lambda p: Sourceify(self.Absolutify(p)))
-    if not info_plist:
-      return
-    if defines:
-      # Create an intermediate file to store preprocessed results.
-      intermediate_plist = ('$(obj).$(TOOLSET)/$(TARGET)/' +
-          os.path.basename(info_plist))
-      self.WriteList(defines, intermediate_plist + ': INFOPLIST_DEFINES', '-D',
-          quoter=EscapeCppDefine)
-      self.WriteMakeRule([intermediate_plist], [info_plist],
-          ['$(call do_cmd,infoplist)',
-           # "Convert" the plist so that any weird whitespace changes from the
-           # preprocessor do not affect the XML parser in mac_tool.
-           '@plutil -convert xml1 $@ $@'])
-      info_plist = intermediate_plist
-    # plists can contain envvars and substitute them into the file.
-    self.WriteSortedXcodeEnv(
-        out, self.GetSortedXcodeEnv(additional_settings=extra_env))
-    self.WriteDoCmd([out], [info_plist], 'mac_tool,,,copy-info-plist',
-                    part_of_all=True)
-    bundle_deps.append(out)
-
-
-  def WriteSources(self, configs, deps, sources,
-                   extra_outputs, extra_link_deps,
-                   part_of_all, precompiled_header):
-    """Write Makefile code for any 'sources' from the gyp input.
-    These are source files necessary to build the current target.
-
-    configs, deps, sources: input from gyp.
-    extra_outputs: a list of extra outputs this action should be dependent on;
-                   used to serialize action/rules before compilation
-    extra_link_deps: a list that will be filled in with any outputs of
-                     compilation (to be used in link lines)
-    part_of_all: flag indicating this target is part of 'all'
-    """
-
-    # Write configuration-specific variables for CFLAGS, etc.
-    for configname in sorted(configs.keys()):
-      config = configs[configname]
-      self.WriteList(config.get('defines'), 'DEFS_%s' % configname, prefix='-D',
-          quoter=EscapeCppDefine)
-
-      if self.flavor == 'mac':
-        cflags = self.xcode_settings.GetCflags(configname)
-        cflags_c = self.xcode_settings.GetCflagsC(configname)
-        cflags_cc = self.xcode_settings.GetCflagsCC(configname)
-        cflags_objc = self.xcode_settings.GetCflagsObjC(configname)
-        cflags_objcc = self.xcode_settings.GetCflagsObjCC(configname)
-      else:
-        cflags = config.get('cflags')
-        cflags_c = config.get('cflags_c')
-        cflags_cc = config.get('cflags_cc')
-
-      self.WriteLn("# Flags passed to all source files.");
-      self.WriteList(cflags, 'CFLAGS_%s' % configname)
-      self.WriteLn("# Flags passed to only C files.");
-      self.WriteList(cflags_c, 'CFLAGS_C_%s' % configname)
-      self.WriteLn("# Flags passed to only C++ files.");
-      self.WriteList(cflags_cc, 'CFLAGS_CC_%s' % configname)
-      if self.flavor == 'mac':
-        self.WriteLn("# Flags passed to only ObjC files.");
-        self.WriteList(cflags_objc, 'CFLAGS_OBJC_%s' % configname)
-        self.WriteLn("# Flags passed to only ObjC++ files.");
-        self.WriteList(cflags_objcc, 'CFLAGS_OBJCC_%s' % configname)
-      includes = config.get('include_dirs')
-      if includes:
-        includes = map(Sourceify, map(self.Absolutify, includes))
-      self.WriteList(includes, 'INCS_%s' % configname, prefix='-I')
-
-    compilable = filter(Compilable, sources)
-    objs = map(self.Objectify, map(self.Absolutify, map(Target, compilable)))
-    self.WriteList(objs, 'OBJS')
-
-    for obj in objs:
-      assert ' ' not in obj, (
-          "Spaces in object filenames not supported (%s)"  % obj)
-    self.WriteLn('# Add to the list of files we specially track '
-                 'dependencies for.')
-    self.WriteLn('all_deps += $(OBJS)')
-    self.WriteLn()
-
-    # Make sure our dependencies are built first.
-    if deps:
-      self.WriteMakeRule(['$(OBJS)'], deps,
-                         comment = 'Make sure our dependencies are built '
-                                   'before any of us.',
-                         order_only = True)
-
-    # Make sure the actions and rules run first.
-    # If they generate any extra headers etc., the per-.o file dep tracking
-    # will catch the proper rebuilds, so order only is still ok here.
-    if extra_outputs:
-      self.WriteMakeRule(['$(OBJS)'], extra_outputs,
-                         comment = 'Make sure our actions/rules run '
-                                   'before any of us.',
-                         order_only = True)
-
-    pchdeps = precompiled_header.GetObjDependencies(compilable, objs )
-    if pchdeps:
-      self.WriteLn('# Dependencies from obj files to their precompiled headers')
-      for source, obj, gch in pchdeps:
-        self.WriteLn('%s: %s' % (obj, gch))
-      self.WriteLn('# End precompiled header dependencies')
-
-    if objs:
-      extra_link_deps.append('$(OBJS)')
-      self.WriteLn("""\
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.""")
-      self.WriteLn("$(OBJS): TOOLSET := $(TOOLSET)")
-      self.WriteLn("$(OBJS): GYP_CFLAGS := "
-                   "$(DEFS_$(BUILDTYPE)) "
-                   "$(INCS_$(BUILDTYPE)) "
-                   "%s " % precompiled_header.GetInclude('c') +
-                   "$(CFLAGS_$(BUILDTYPE)) "
-                   "$(CFLAGS_C_$(BUILDTYPE))")
-      self.WriteLn("$(OBJS): GYP_CXXFLAGS := "
-                   "$(DEFS_$(BUILDTYPE)) "
-                   "$(INCS_$(BUILDTYPE)) "
-                   "%s " % precompiled_header.GetInclude('cc') +
-                   "$(CFLAGS_$(BUILDTYPE)) "
-                   "$(CFLAGS_CC_$(BUILDTYPE))")
-      if self.flavor == 'mac':
-        self.WriteLn("$(OBJS): GYP_OBJCFLAGS := "
-                     "$(DEFS_$(BUILDTYPE)) "
-                     "$(INCS_$(BUILDTYPE)) "
-                     "%s " % precompiled_header.GetInclude('m') +
-                     "$(CFLAGS_$(BUILDTYPE)) "
-                     "$(CFLAGS_C_$(BUILDTYPE)) "
-                     "$(CFLAGS_OBJC_$(BUILDTYPE))")
-        self.WriteLn("$(OBJS): GYP_OBJCXXFLAGS := "
-                     "$(DEFS_$(BUILDTYPE)) "
-                     "$(INCS_$(BUILDTYPE)) "
-                     "%s " % precompiled_header.GetInclude('mm') +
-                     "$(CFLAGS_$(BUILDTYPE)) "
-                     "$(CFLAGS_CC_$(BUILDTYPE)) "
-                     "$(CFLAGS_OBJCC_$(BUILDTYPE))")
-
-    self.WritePchTargets(precompiled_header.GetPchBuildCommands())
-
-    # If there are any object files in our input file list, link them into our
-    # output.
-    extra_link_deps += filter(Linkable, sources)
-
-    self.WriteLn()
-
-  def WritePchTargets(self, pch_commands):
-    """Writes make rules to compile prefix headers."""
-    if not pch_commands:
-      return
-
-    for gch, lang_flag, lang, input in pch_commands:
-      extra_flags = {
-        'c': '$(CFLAGS_C_$(BUILDTYPE))',
-        'cc': '$(CFLAGS_CC_$(BUILDTYPE))',
-        'm': '$(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE))',
-        'mm': '$(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE))',
-      }[lang]
-      var_name = {
-        'c': 'GYP_PCH_CFLAGS',
-        'cc': 'GYP_PCH_CXXFLAGS',
-        'm': 'GYP_PCH_OBJCFLAGS',
-        'mm': 'GYP_PCH_OBJCXXFLAGS',
-      }[lang]
-      self.WriteLn("%s: %s := %s " % (gch, var_name, lang_flag) +
-                   "$(DEFS_$(BUILDTYPE)) "
-                   "$(INCS_$(BUILDTYPE)) "
-                   "$(CFLAGS_$(BUILDTYPE)) " +
-                   extra_flags)
-
-      self.WriteLn('%s: %s FORCE_DO_CMD' % (gch, input))
-      self.WriteLn('\t@$(call do_cmd,pch_%s,1)' % lang)
-      self.WriteLn('')
-      assert ' ' not in gch, (
-          "Spaces in gch filenames not supported (%s)"  % gch)
-      self.WriteLn('all_deps += %s' % gch)
-      self.WriteLn('')
-
-
-  def ComputeOutputBasename(self, spec):
-    """Return the 'output basename' of a gyp spec.
-
-    E.g., the loadable module 'foobar' in directory 'baz' will produce
-      'libfoobar.so'
-    """
-    assert not self.is_mac_bundle
-
-    if self.flavor == 'mac' and self.type in (
-        'static_library', 'executable', 'shared_library', 'loadable_module'):
-      return self.xcode_settings.GetExecutablePath()
-
-    target = spec['target_name']
-    target_prefix = ''
-    target_ext = ''
-    if self.type == 'static_library':
-      if target[:3] == 'lib':
-        target = target[3:]
-      target_prefix = 'lib'
-      target_ext = '.a'
-    elif self.type in ('loadable_module', 'shared_library'):
-      if target[:3] == 'lib':
-        target = target[3:]
-      target_prefix = 'lib'
-      target_ext = '.so'
-    elif self.type == 'none':
-      target = '%s.stamp' % target
-    elif self.type != 'executable':
-      print ("ERROR: What output file should be generated?",
-             "type", self.type, "target", target)
-
-    target_prefix = spec.get('product_prefix', target_prefix)
-    target = spec.get('product_name', target)
-    product_ext = spec.get('product_extension')
-    if product_ext:
-      target_ext = '.' + product_ext
-
-    return target_prefix + target + target_ext
-
-
-  def _InstallImmediately(self):
-    return self.toolset == 'target' and self.flavor == 'mac' and self.type in (
-          'static_library', 'executable', 'shared_library', 'loadable_module')
-
-
-  def ComputeOutput(self, spec):
-    """Return the 'output' (full output path) of a gyp spec.
-
-    E.g., the loadable module 'foobar' in directory 'baz' will produce
-      '$(obj)/baz/libfoobar.so'
-    """
-    assert not self.is_mac_bundle
-
-    path = os.path.join('$(obj).' + self.toolset, self.path)
-    if self.type == 'executable' or self._InstallImmediately():
-      path = '$(builddir)'
-    path = spec.get('product_dir', path)
-    return os.path.join(path, self.ComputeOutputBasename(spec))
-
-
-  def ComputeMacBundleOutput(self, spec):
-    """Return the 'output' (full output path) to a bundle output directory."""
-    assert self.is_mac_bundle
-    path = generator_default_variables['PRODUCT_DIR']
-    return os.path.join(path, self.xcode_settings.GetWrapperName())
-
-
-  def ComputeMacBundleBinaryOutput(self, spec):
-    """Return the 'output' (full output path) to the binary in a bundle."""
-    path = generator_default_variables['PRODUCT_DIR']
-    return os.path.join(path, self.xcode_settings.GetExecutablePath())
-
-
-  def ComputeDeps(self, spec):
-    """Compute the dependencies of a gyp spec.
-
-    Returns a tuple (deps, link_deps), where each is a list of
-    filenames that will need to be put in front of make for either
-    building (deps) or linking (link_deps).
-    """
-    deps = []
-    link_deps = []
-    if 'dependencies' in spec:
-      deps.extend([target_outputs[dep] for dep in spec['dependencies']
-                   if target_outputs[dep]])
-      for dep in spec['dependencies']:
-        if dep in target_link_deps:
-          link_deps.append(target_link_deps[dep])
-      deps.extend(link_deps)
-      # TODO: It seems we need to transitively link in libraries (e.g. -lfoo)?
-      # This hack makes it work:
-      # link_deps.extend(spec.get('libraries', []))
-    return (gyp.common.uniquer(deps), gyp.common.uniquer(link_deps))
-
-
-  def WriteDependencyOnExtraOutputs(self, target, extra_outputs):
-    self.WriteMakeRule([self.output_binary], extra_outputs,
-                       comment = 'Build our special outputs first.',
-                       order_only = True)
-
-
-  def WriteTarget(self, spec, configs, deps, link_deps, bundle_deps,
-                  extra_outputs, part_of_all):
-    """Write Makefile code to produce the final target of the gyp spec.
-
-    spec, configs: input from gyp.
-    deps, link_deps: dependency lists; see ComputeDeps()
-    extra_outputs: any extra outputs that our target should depend on
-    part_of_all: flag indicating this target is part of 'all'
-    """
-
-    self.WriteLn('### Rules for final target.')
-
-    if extra_outputs:
-      self.WriteDependencyOnExtraOutputs(self.output_binary, extra_outputs)
-      self.WriteMakeRule(extra_outputs, deps,
-                         comment=('Preserve order dependency of '
-                                  'special output on deps.'),
-                         order_only = True)
-
-    target_postbuilds = {}
-    if self.type != 'none':
-      for configname in sorted(configs.keys()):
-        config = configs[configname]
-        if self.flavor == 'mac':
-          ldflags = self.xcode_settings.GetLdflags(configname,
-              generator_default_variables['PRODUCT_DIR'],
-              lambda p: Sourceify(self.Absolutify(p)))
-
-          # TARGET_POSTBUILDS_$(BUILDTYPE) is added to postbuilds later on.
-          gyp_to_build = InvertRelativePath(self.path)
-          target_postbuild = self.xcode_settings.GetTargetPostbuilds(
-              configname,
-              QuoteSpaces(os.path.normpath(os.path.join(gyp_to_build,
-                                                        self.output))),
-              QuoteSpaces(os.path.normpath(os.path.join(gyp_to_build,
-                                                        self.output_binary))))
-          if target_postbuild:
-            target_postbuilds[configname] = target_postbuild
-        else:
-          ldflags = config.get('ldflags', [])
-          # Compute an rpath for this output if needed.
-          if any(dep.endswith('.so') for dep in deps):
-            # We want to get the literal string "$ORIGIN" into the link command,
-            # so we need lots of escaping.
-            ldflags.append(r'-Wl,-rpath=\$$ORIGIN/lib.%s/' % self.toolset)
-            ldflags.append(r'-Wl,-rpath-link=\$(builddir)/lib.%s/' %
-                           self.toolset)
-        self.WriteList(ldflags, 'LDFLAGS_%s' % configname)
-        if self.flavor == 'mac':
-          self.WriteList(self.xcode_settings.GetLibtoolflags(configname),
-                         'LIBTOOLFLAGS_%s' % configname)
-      libraries = spec.get('libraries')
-      if libraries:
-        # Remove duplicate entries
-        libraries = gyp.common.uniquer(libraries)
-        if self.flavor == 'mac':
-          libraries = self.xcode_settings.AdjustLibraries(libraries)
-      self.WriteList(libraries, 'LIBS')
-      self.WriteLn('%s: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))' %
-          QuoteSpaces(self.output_binary))
-      self.WriteLn('%s: LIBS := $(LIBS)' % QuoteSpaces(self.output_binary))
-
-      if self.flavor == 'mac':
-        self.WriteLn('%s: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE))' %
-            QuoteSpaces(self.output_binary))
-
-    # Postbuild actions. Like actions, but implicitly depend on the target's
-    # output.
-    postbuilds = []
-    if self.flavor == 'mac':
-      if target_postbuilds:
-        postbuilds.append('$(TARGET_POSTBUILDS_$(BUILDTYPE))')
-      postbuilds.extend(
-          gyp.xcode_emulation.GetSpecPostbuildCommands(spec))
-
-    if postbuilds:
-      # Envvars may be referenced by TARGET_POSTBUILDS_$(BUILDTYPE),
-      # so we must output its definition first, since we declare variables
-      # using ":=".
-      self.WriteSortedXcodeEnv(self.output, self.GetSortedXcodePostbuildEnv())
-
-      for configname in target_postbuilds:
-        self.WriteLn('%s: TARGET_POSTBUILDS_%s := %s' %
-            (QuoteSpaces(self.output),
-             configname,
-             gyp.common.EncodePOSIXShellList(target_postbuilds[configname])))
-
-      # Postbuilds expect to be run in the gyp file's directory, so insert an
-      # implicit postbuild to cd to there.
-      postbuilds.insert(0, gyp.common.EncodePOSIXShellList(['cd', self.path]))
-      for i in xrange(len(postbuilds)):
-        if not postbuilds[i].startswith('$'):
-          postbuilds[i] = EscapeShellArgument(postbuilds[i])
-      self.WriteLn('%s: builddir := $(abs_builddir)' % QuoteSpaces(self.output))
-      self.WriteLn('%s: POSTBUILDS := %s' % (
-          QuoteSpaces(self.output), ' '.join(postbuilds)))
-
-    # A bundle directory depends on its dependencies such as bundle resources
-    # and bundle binary. When all dependencies have been built, the bundle
-    # needs to be packaged.
-    if self.is_mac_bundle:
-      # If the framework doesn't contain a binary, then nothing depends
-      # on the actions -- make the framework depend on them directly too.
-      self.WriteDependencyOnExtraOutputs(self.output, extra_outputs)
-
-      # Bundle dependencies. Note that the code below adds actions to this
-      # target, so if you move these two lines, move the lines below as well.
-      self.WriteList(map(QuoteSpaces, bundle_deps), 'BUNDLE_DEPS')
-      self.WriteLn('%s: $(BUNDLE_DEPS)' % QuoteSpaces(self.output))
-
-      # After the framework is built, package it. Needs to happen before
-      # postbuilds, since postbuilds depend on this.
-      if self.type in ('shared_library', 'loadable_module'):
-        self.WriteLn('\t@$(call do_cmd,mac_package_framework,,,%s)' %
-            self.xcode_settings.GetFrameworkVersion())
-
-      # Bundle postbuilds can depend on the whole bundle, so run them after
-      # the bundle is packaged, not already after the bundle binary is done.
-      if postbuilds:
-        self.WriteLn('\t@$(call do_postbuilds)')
-      postbuilds = []  # Don't write postbuilds for target's output.
-
-      # Needed by test/mac/gyptest-rebuild.py.
-      self.WriteLn('\t@true  # No-op, used by tests')
-
-      # Since this target depends on binary and resources which are in
-      # nested subfolders, the framework directory will be older than
-      # its dependencies usually. To prevent this rule from executing
-      # on every build (expensive, especially with postbuilds), expliclity
-      # update the time on the framework directory.
-      self.WriteLn('\t@touch -c %s' % QuoteSpaces(self.output))
-
-    if postbuilds:
-      assert not self.is_mac_bundle, ('Postbuilds for bundles should be done '
-          'on the bundle, not the binary (target \'%s\')' % self.target)
-      assert 'product_dir' not in spec, ('Postbuilds do not work with '
-          'custom product_dir')
-
-    if self.type == 'executable':
-      self.WriteLn('%s: LD_INPUTS := %s' % (
-          QuoteSpaces(self.output_binary),
-          ' '.join(map(QuoteSpaces, link_deps))))
-      if self.toolset == 'host' and self.flavor == 'android':
-        self.WriteDoCmd([self.output_binary], link_deps, 'link_host',
-                        part_of_all, postbuilds=postbuilds)
-      else:
-        self.WriteDoCmd([self.output_binary], link_deps, 'link', part_of_all,
-                        postbuilds=postbuilds)
-
-    elif self.type == 'static_library':
-      for link_dep in link_deps:
-        assert ' ' not in link_dep, (
-            "Spaces in alink input filenames not supported (%s)"  % link_dep)
-      if (self.flavor not in ('mac', 'win') and not
-          self.is_standalone_static_library):
-        self.WriteDoCmd([self.output_binary], link_deps, 'alink_thin',
-                        part_of_all, postbuilds=postbuilds)
-      else:
-        self.WriteDoCmd([self.output_binary], link_deps, 'alink', part_of_all,
-                        postbuilds=postbuilds)
-    elif self.type == 'shared_library':
-      self.WriteLn('%s: LD_INPUTS := %s' % (
-            QuoteSpaces(self.output_binary),
-            ' '.join(map(QuoteSpaces, link_deps))))
-      self.WriteDoCmd([self.output_binary], link_deps, 'solink', part_of_all,
-                      postbuilds=postbuilds)
-    elif self.type == 'loadable_module':
-      for link_dep in link_deps:
-        assert ' ' not in link_dep, (
-            "Spaces in module input filenames not supported (%s)"  % link_dep)
-      if self.toolset == 'host' and self.flavor == 'android':
-        self.WriteDoCmd([self.output_binary], link_deps, 'solink_module_host',
-                        part_of_all, postbuilds=postbuilds)
-      else:
-        self.WriteDoCmd(
-            [self.output_binary], link_deps, 'solink_module', part_of_all,
-            postbuilds=postbuilds)
-    elif self.type == 'none':
-      # Write a stamp line.
-      self.WriteDoCmd([self.output_binary], deps, 'touch', part_of_all,
-                      postbuilds=postbuilds)
-    else:
-      print "WARNING: no output for", self.type, target
-
-    # Add an alias for each target (if there are any outputs).
-    # Installable target aliases are created below.
-    if ((self.output and self.output != self.target) and
-        (self.type not in self._INSTALLABLE_TARGETS)):
-      self.WriteMakeRule([self.target], [self.output],
-                         comment='Add target alias', phony = True)
-      if part_of_all:
-        self.WriteMakeRule(['all'], [self.target],
-                           comment = 'Add target alias to "all" target.',
-                           phony = True)
-
-    # Add special-case rules for our installable targets.
-    # 1) They need to install to the build dir or "product" dir.
-    # 2) They get shortcuts for building (e.g. "make chrome").
-    # 3) They are part of "make all".
-    if (self.type in self._INSTALLABLE_TARGETS or
-        self.is_standalone_static_library):
-      if self.type == 'shared_library':
-        file_desc = 'shared library'
-      elif self.type == 'static_library':
-        file_desc = 'static library'
-      else:
-        file_desc = 'executable'
-      install_path = self._InstallableTargetInstallPath()
-      installable_deps = [self.output]
-      if (self.flavor == 'mac' and not 'product_dir' in spec and
-          self.toolset == 'target'):
-        # On mac, products are created in install_path immediately.
-        assert install_path == self.output, '%s != %s' % (
-            install_path, self.output)
-
-      # Point the target alias to the final binary output.
-      self.WriteMakeRule([self.target], [install_path],
-                         comment='Add target alias', phony = True)
-      if install_path != self.output:
-        assert not self.is_mac_bundle  # See comment a few lines above.
-        self.WriteDoCmd([install_path], [self.output], 'copy',
-                        comment = 'Copy this to the %s output path.' %
-                        file_desc, part_of_all=part_of_all)
-        installable_deps.append(install_path)
-      if self.output != self.alias and self.alias != self.target:
-        self.WriteMakeRule([self.alias], installable_deps,
-                           comment = 'Short alias for building this %s.' %
-                           file_desc, phony = True)
-      if part_of_all:
-        self.WriteMakeRule(['all'], [install_path],
-                           comment = 'Add %s to "all" target.' % file_desc,
-                           phony = True)
-
-
-  def WriteList(self, value_list, variable=None, prefix='',
-                quoter=QuoteIfNecessary):
-    """Write a variable definition that is a list of values.
-
-    E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out
-         foo = blaha blahb
-    but in a pretty-printed style.
-    """
-    values = ''
-    if value_list:
-      value_list = [quoter(prefix + l) for l in value_list]
-      values = ' \\\n\t' + ' \\\n\t'.join(value_list)
-    self.fp.write('%s :=%s\n\n' % (variable, values))
-
-
-  def WriteDoCmd(self, outputs, inputs, command, part_of_all, comment=None,
-                 postbuilds=False):
-    """Write a Makefile rule that uses do_cmd.
-
-    This makes the outputs dependent on the command line that was run,
-    as well as support the V= make command line flag.
-    """
-    suffix = ''
-    if postbuilds:
-      assert ',' not in command
-      suffix = ',,1'  # Tell do_cmd to honor $POSTBUILDS
-    self.WriteMakeRule(outputs, inputs,
-                       actions = ['$(call do_cmd,%s%s)' % (command, suffix)],
-                       comment = comment,
-                       force = True)
-    # Add our outputs to the list of targets we read depfiles from.
-    # all_deps is only used for deps file reading, and for deps files we replace
-    # spaces with ? because escaping doesn't work with make's $(sort) and
-    # other functions.
-    outputs = [QuoteSpaces(o, SPACE_REPLACEMENT) for o in outputs]
-    self.WriteLn('all_deps += %s' % ' '.join(outputs))
-
-
-  def WriteMakeRule(self, outputs, inputs, actions=None, comment=None,
-                    order_only=False, force=False, phony=False):
-    """Write a Makefile rule, with some extra tricks.
-
-    outputs: a list of outputs for the rule (note: this is not directly
-             supported by make; see comments below)
-    inputs: a list of inputs for the rule
-    actions: a list of shell commands to run for the rule
-    comment: a comment to put in the Makefile above the rule (also useful
-             for making this Python script's code self-documenting)
-    order_only: if true, makes the dependency order-only
-    force: if true, include FORCE_DO_CMD as an order-only dep
-    phony: if true, the rule does not actually generate the named output, the
-           output is just a name to run the rule
-    """
-    outputs = map(QuoteSpaces, outputs)
-    inputs = map(QuoteSpaces, inputs)
-
-    if comment:
-      self.WriteLn('# ' + comment)
-    if phony:
-      self.WriteLn('.PHONY: ' + ' '.join(outputs))
-    # TODO(evanm): just make order_only a list of deps instead of these hacks.
-    if order_only:
-      order_insert = '| '
-      pick_output = ' '.join(outputs)
-    else:
-      order_insert = ''
-      pick_output = outputs[0]
-    if force:
-      force_append = ' FORCE_DO_CMD'
-    else:
-      force_append = ''
-    if actions:
-      self.WriteLn("%s: TOOLSET := $(TOOLSET)" % outputs[0])
-    self.WriteLn('%s: %s%s%s' % (pick_output, order_insert, ' '.join(inputs),
-                                 force_append))
-    if actions:
-      for action in actions:
-        self.WriteLn('\t%s' % action)
-    if not order_only and len(outputs) > 1:
-      # If we have more than one output, a rule like
-      #   foo bar: baz
-      # that for *each* output we must run the action, potentially
-      # in parallel.  That is not what we're trying to write -- what
-      # we want is that we run the action once and it generates all
-      # the files.
-      # http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html
-      # discusses this problem and has this solution:
-      # 1) Write the naive rule that would produce parallel runs of
-      # the action.
-      # 2) Make the outputs seralized on each other, so we won't start
-      # a parallel run until the first run finishes, at which point
-      # we'll have generated all the outputs and we're done.
-      self.WriteLn('%s: %s' % (' '.join(outputs[1:]), outputs[0]))
-      # Add a dummy command to the "extra outputs" rule, otherwise make seems to
-      # think these outputs haven't (couldn't have?) changed, and thus doesn't
-      # flag them as changed (i.e. include in '$?') when evaluating dependent
-      # rules, which in turn causes do_cmd() to skip running dependent commands.
-      self.WriteLn('%s: ;' % (' '.join(outputs[1:])))
-    self.WriteLn()
-
-
-  def WriteAndroidNdkModuleRule(self, module_name, all_sources, link_deps):
-    """Write a set of LOCAL_XXX definitions for Android NDK.
-
-    These variable definitions will be used by Android NDK but do nothing for
-    non-Android applications.
-
-    Arguments:
-      module_name: Android NDK module name, which must be unique among all
-          module names.
-      all_sources: A list of source files (will be filtered by Compilable).
-      link_deps: A list of link dependencies, which must be sorted in
-          the order from dependencies to dependents.
-    """
-    if self.type not in ('executable', 'shared_library', 'static_library'):
-      return
-
-    self.WriteLn('# Variable definitions for Android applications')
-    self.WriteLn('include $(CLEAR_VARS)')
-    self.WriteLn('LOCAL_MODULE := ' + module_name)
-    self.WriteLn('LOCAL_CFLAGS := $(CFLAGS_$(BUILDTYPE)) '
-                 '$(DEFS_$(BUILDTYPE)) '
-                 # LOCAL_CFLAGS is applied to both of C and C++.  There is
-                 # no way to specify $(CFLAGS_C_$(BUILDTYPE)) only for C
-                 # sources.
-                 '$(CFLAGS_C_$(BUILDTYPE)) '
-                 # $(INCS_$(BUILDTYPE)) includes the prefix '-I' while
-                 # LOCAL_C_INCLUDES does not expect it.  So put it in
-                 # LOCAL_CFLAGS.
-                 '$(INCS_$(BUILDTYPE))')
-    # LOCAL_CXXFLAGS is obsolete and LOCAL_CPPFLAGS is preferred.
-    self.WriteLn('LOCAL_CPPFLAGS := $(CFLAGS_CC_$(BUILDTYPE))')
-    self.WriteLn('LOCAL_C_INCLUDES :=')
-    self.WriteLn('LOCAL_LDLIBS := $(LDFLAGS_$(BUILDTYPE)) $(LIBS)')
-
-    # Detect the C++ extension.
-    cpp_ext = {'.cc': 0, '.cpp': 0, '.cxx': 0}
-    default_cpp_ext = '.cpp'
-    for filename in all_sources:
-      ext = os.path.splitext(filename)[1]
-      if ext in cpp_ext:
-        cpp_ext[ext] += 1
-        if cpp_ext[ext] > cpp_ext[default_cpp_ext]:
-          default_cpp_ext = ext
-    self.WriteLn('LOCAL_CPP_EXTENSION := ' + default_cpp_ext)
-
-    self.WriteList(map(self.Absolutify, filter(Compilable, all_sources)),
-                   'LOCAL_SRC_FILES')
-
-    # Filter out those which do not match prefix and suffix and produce
-    # the resulting list without prefix and suffix.
-    def DepsToModules(deps, prefix, suffix):
-      modules = []
-      for filepath in deps:
-        filename = os.path.basename(filepath)
-        if filename.startswith(prefix) and filename.endswith(suffix):
-          modules.append(filename[len(prefix):-len(suffix)])
-      return modules
-
-    # Retrieve the default value of 'SHARED_LIB_SUFFIX'
-    params = {'flavor': 'linux'}
-    default_variables = {}
-    CalculateVariables(default_variables, params)
-
-    self.WriteList(
-        DepsToModules(link_deps,
-                      generator_default_variables['SHARED_LIB_PREFIX'],
-                      default_variables['SHARED_LIB_SUFFIX']),
-        'LOCAL_SHARED_LIBRARIES')
-    self.WriteList(
-        DepsToModules(link_deps,
-                      generator_default_variables['STATIC_LIB_PREFIX'],
-                      generator_default_variables['STATIC_LIB_SUFFIX']),
-        'LOCAL_STATIC_LIBRARIES')
-
-    if self.type == 'executable':
-      self.WriteLn('include $(BUILD_EXECUTABLE)')
-    elif self.type == 'shared_library':
-      self.WriteLn('include $(BUILD_SHARED_LIBRARY)')
-    elif self.type == 'static_library':
-      self.WriteLn('include $(BUILD_STATIC_LIBRARY)')
-    self.WriteLn()
-
-
-  def WriteLn(self, text=''):
-    self.fp.write(text + '\n')
-
-
-  def GetSortedXcodeEnv(self, additional_settings=None):
-    return gyp.xcode_emulation.GetSortedXcodeEnv(
-        self.xcode_settings, "$(abs_builddir)",
-        os.path.join("$(abs_srcdir)", self.path), "$(BUILDTYPE)",
-        additional_settings)
-
-
-  def GetSortedXcodePostbuildEnv(self):
-    # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack.
-    # TODO(thakis): It would be nice to have some general mechanism instead.
-    strip_save_file = self.xcode_settings.GetPerTargetSetting(
-        'CHROMIUM_STRIP_SAVE_FILE', '')
-    # Even if strip_save_file is empty, explicitly write it. Else a postbuild
-    # might pick up an export from an earlier target.
-    return self.GetSortedXcodeEnv(
-        additional_settings={'CHROMIUM_STRIP_SAVE_FILE': strip_save_file})
-
-
-  def WriteSortedXcodeEnv(self, target, env):
-    for k, v in env:
-      # For
-      #  foo := a\ b
-      # the escaped space does the right thing. For
-      #  export foo := a\ b
-      # it does not -- the backslash is written to the env as literal character.
-      # So don't escape spaces in |env[k]|.
-      self.WriteLn('%s: export %s := %s' % (QuoteSpaces(target), k, v))
-
-
-  def Objectify(self, path):
-    """Convert a path to its output directory form."""
-    if '$(' in path:
-      path = path.replace('$(obj)/', '$(obj).%s/$(TARGET)/' % self.toolset)
-    if not '$(obj)' in path:
-      path = '$(obj).%s/$(TARGET)/%s' % (self.toolset, path)
-    return path
-
-
-  def Pchify(self, path, lang):
-    """Convert a prefix header path to its output directory form."""
-    path = self.Absolutify(path)
-    if '$(' in path:
-      path = path.replace('$(obj)/', '$(obj).%s/$(TARGET)/pch-%s' %
-                          (self.toolset, lang))
-      return path
-    return '$(obj).%s/$(TARGET)/pch-%s/%s' % (self.toolset, lang, path)
-
-
-  def Absolutify(self, path):
-    """Convert a subdirectory-relative path into a base-relative path.
-    Skips over paths that contain variables."""
-    if '$(' in path:
-      # Don't call normpath in this case, as it might collapse the
-      # path too aggressively if it features '..'. However it's still
-      # important to strip trailing slashes.
-      return path.rstrip('/')
-    return os.path.normpath(os.path.join(self.path, path))
-
-
-  def ExpandInputRoot(self, template, expansion, dirname):
-    if '%(INPUT_ROOT)s' not in template and '%(INPUT_DIRNAME)s' not in template:
-      return template
-    path = template % {
-        'INPUT_ROOT': expansion,
-        'INPUT_DIRNAME': dirname,
-        }
-    return path
-
-
-  def _InstallableTargetInstallPath(self):
-    """Returns the location of the final output for an installable target."""
-    # Xcode puts shared_library results into PRODUCT_DIR, and some gyp files
-    # rely on this. Emulate this behavior for mac.
-    if (self.type == 'shared_library' and
-        (self.flavor != 'mac' or self.toolset != 'target')):
-      # Install all shared libs into a common directory (per toolset) for
-      # convenient access with LD_LIBRARY_PATH.
-      return '$(builddir)/lib.%s/%s' % (self.toolset, self.alias)
-    return '$(builddir)/' + self.alias
-
-
-def WriteAutoRegenerationRule(params, root_makefile, makefile_name,
-                              build_files):
-  """Write the target to regenerate the Makefile."""
-  options = params['options']
-  build_files_args = [gyp.common.RelativePath(filename, options.toplevel_dir)
-                      for filename in params['build_files_arg']]
-  gyp_binary = gyp.common.FixIfRelativePath(params['gyp_binary'],
-                                            options.toplevel_dir)
-  if not gyp_binary.startswith(os.sep):
-    gyp_binary = os.path.join('.', gyp_binary)
-  root_makefile.write(
-      "quiet_cmd_regen_makefile = ACTION Regenerating $@\n"
-      "cmd_regen_makefile = %(cmd)s\n"
-      "%(makefile_name)s: %(deps)s\n"
-      "\t$(call do_cmd,regen_makefile)\n\n" % {
-          'makefile_name': makefile_name,
-          'deps': ' '.join(map(Sourceify, build_files)),
-          'cmd': gyp.common.EncodePOSIXShellList(
-                     [gyp_binary, '-fmake'] +
-                     gyp.RegenerateFlags(options) +
-                     build_files_args)})
-
-
-def PerformBuild(data, configurations, params):
-  options = params['options']
-  for config in configurations:
-    arguments = ['make']
-    if options.toplevel_dir and options.toplevel_dir != '.':
-      arguments += '-C', options.toplevel_dir
-    arguments.append('BUILDTYPE=' + config)
-    print 'Building [%s]: %s' % (config, arguments)
-    subprocess.check_call(arguments)
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  options = params['options']
-  flavor = gyp.common.GetFlavor(params)
-  generator_flags = params.get('generator_flags', {})
-  builddir_name = generator_flags.get('output_dir', 'out')
-  android_ndk_version = generator_flags.get('android_ndk_version', None)
-  default_target = generator_flags.get('default_target', 'all')
-
-  def CalculateMakefilePath(build_file, base_name):
-    """Determine where to write a Makefile for a given gyp file."""
-    # Paths in gyp files are relative to the .gyp file, but we want
-    # paths relative to the source root for the master makefile.  Grab
-    # the path of the .gyp file as the base to relativize against.
-    # E.g. "foo/bar" when we're constructing targets for "foo/bar/baz.gyp".
-    base_path = gyp.common.RelativePath(os.path.dirname(build_file),
-                                        options.depth)
-    # We write the file in the base_path directory.
-    output_file = os.path.join(options.depth, base_path, base_name)
-    if options.generator_output:
-      output_file = os.path.join(options.generator_output, output_file)
-    base_path = gyp.common.RelativePath(os.path.dirname(build_file),
-                                        options.toplevel_dir)
-    return base_path, output_file
-
-  # TODO:  search for the first non-'Default' target.  This can go
-  # away when we add verification that all targets have the
-  # necessary configurations.
-  default_configuration = None
-  toolsets = set([target_dicts[target]['toolset'] for target in target_list])
-  for target in target_list:
-    spec = target_dicts[target]
-    if spec['default_configuration'] != 'Default':
-      default_configuration = spec['default_configuration']
-      break
-  if not default_configuration:
-    default_configuration = 'Default'
-
-  srcdir = '.'
-  makefile_name = 'Makefile' + options.suffix
-  makefile_path = os.path.join(options.toplevel_dir, makefile_name)
-  if options.generator_output:
-    global srcdir_prefix
-    makefile_path = os.path.join(options.generator_output, makefile_path)
-    srcdir = gyp.common.RelativePath(srcdir, options.generator_output)
-    srcdir_prefix = '$(srcdir)/'
-
-  flock_command= 'flock'
-  header_params = {
-      'default_target': default_target,
-      'builddir': builddir_name,
-      'default_configuration': default_configuration,
-      'flock': flock_command,
-      'flock_index': 1,
-      'link_commands': LINK_COMMANDS_LINUX,
-      'extra_commands': '',
-      'srcdir': srcdir,
-    }
-  if flavor == 'mac':
-    flock_command = './gyp-mac-tool flock'
-    header_params.update({
-        'flock': flock_command,
-        'flock_index': 2,
-        'link_commands': LINK_COMMANDS_MAC,
-        'extra_commands': SHARED_HEADER_MAC_COMMANDS,
-    })
-  elif flavor == 'android':
-    header_params.update({
-        'link_commands': LINK_COMMANDS_ANDROID,
-    })
-  elif flavor == 'solaris':
-    header_params.update({
-        'flock': './gyp-sun-tool flock',
-        'flock_index': 2,
-        'extra_commands': SHARED_HEADER_SUN_COMMANDS,
-    })
-  elif flavor == 'freebsd':
-    header_params.update({
-        'flock': 'lockf',
-    })
-
-  header_params.update({
-    'CC.target':   GetEnvironFallback(('CC_target', 'CC'), '$(CC)'),
-    'AR.target':   GetEnvironFallback(('AR_target', 'AR'), '$(AR)'),
-    'CXX.target':  GetEnvironFallback(('CXX_target', 'CXX'), '$(CXX)'),
-    'LINK.target': GetEnvironFallback(('LD_target', 'LD'), '$(LINK)'),
-    'CC.host':     GetEnvironFallback(('CC_host',), 'gcc'),
-    'AR.host':     GetEnvironFallback(('AR_host',), 'ar'),
-    'CXX.host':    GetEnvironFallback(('CXX_host',), 'g++'),
-    'LINK.host':   GetEnvironFallback(('LD_host',), 'g++'),
-  })
-
-  build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
-  make_global_settings_array = data[build_file].get('make_global_settings', [])
-  make_global_settings = ''
-  for key, value in make_global_settings_array:
-    if value[0] != '$':
-      value = '$(abspath %s)' % value
-    if key == 'LINK':
-      make_global_settings += ('%s ?= %s $(builddir)/linker.lock %s\n' %
-                               (key, flock_command, value))
-    elif key in ('CC', 'CC.host', 'CXX', 'CXX.host'):
-      make_global_settings += (
-          'ifneq (,$(filter $(origin %s), undefined default))\n' % key)
-      # Let gyp-time envvars win over global settings.
-      if key in os.environ:
-        value = os.environ[key]
-      make_global_settings += '  %s = %s\n' % (key, value)
-      make_global_settings += 'endif\n'
-    else:
-      make_global_settings += '%s ?= %s\n' % (key, value)
-  header_params['make_global_settings'] = make_global_settings
-
-  ensure_directory_exists(makefile_path)
-  root_makefile = open(makefile_path, 'w')
-  root_makefile.write(SHARED_HEADER % header_params)
-  # Currently any versions have the same effect, but in future the behavior
-  # could be different.
-  if android_ndk_version:
-    root_makefile.write(
-        '# Define LOCAL_PATH for build of Android applications.\n'
-        'LOCAL_PATH := $(call my-dir)\n'
-        '\n')
-  for toolset in toolsets:
-    root_makefile.write('TOOLSET := %s\n' % toolset)
-    WriteRootHeaderSuffixRules(root_makefile)
-
-  # Put build-time support tools next to the root Makefile.
-  dest_path = os.path.dirname(makefile_path)
-  gyp.common.CopyTool(flavor, dest_path)
-
-  # Find the list of targets that derive from the gyp file(s) being built.
-  needed_targets = set()
-  for build_file in params['build_files']:
-    for target in gyp.common.AllTargets(target_list, target_dicts, build_file):
-      needed_targets.add(target)
-
-  build_files = set()
-  include_list = set()
-  for qualified_target in target_list:
-    build_file, target, toolset = gyp.common.ParseQualifiedTarget(
-        qualified_target)
-
-    this_make_global_settings = data[build_file].get('make_global_settings', [])
-    assert make_global_settings_array == this_make_global_settings, (
-        "make_global_settings needs to be the same for all targets.")
-
-    build_files.add(gyp.common.RelativePath(build_file, options.toplevel_dir))
-    included_files = data[build_file]['included_files']
-    for included_file in included_files:
-      # The included_files entries are relative to the dir of the build file
-      # that included them, so we have to undo that and then make them relative
-      # to the root dir.
-      relative_include_file = gyp.common.RelativePath(
-          gyp.common.UnrelativePath(included_file, build_file),
-          options.toplevel_dir)
-      abs_include_file = os.path.abspath(relative_include_file)
-      # If the include file is from the ~/.gyp dir, we should use absolute path
-      # so that relocating the src dir doesn't break the path.
-      if (params['home_dot_gyp'] and
-          abs_include_file.startswith(params['home_dot_gyp'])):
-        build_files.add(abs_include_file)
-      else:
-        build_files.add(relative_include_file)
-
-    base_path, output_file = CalculateMakefilePath(build_file,
-        target + '.' + toolset + options.suffix + '.mk')
-
-    spec = target_dicts[qualified_target]
-    configs = spec['configurations']
-
-    if flavor == 'mac':
-      gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec)
-
-    writer = MakefileWriter(generator_flags, flavor)
-    writer.Write(qualified_target, base_path, output_file, spec, configs,
-                 part_of_all=qualified_target in needed_targets)
-
-    # Our root_makefile lives at the source root.  Compute the relative path
-    # from there to the output_file for including.
-    mkfile_rel_path = gyp.common.RelativePath(output_file,
-                                              os.path.dirname(makefile_path))
-    include_list.add(mkfile_rel_path)
-
-  # Write out per-gyp (sub-project) Makefiles.
-  depth_rel_path = gyp.common.RelativePath(options.depth, os.getcwd())
-  for build_file in build_files:
-    # The paths in build_files were relativized above, so undo that before
-    # testing against the non-relativized items in target_list and before
-    # calculating the Makefile path.
-    build_file = os.path.join(depth_rel_path, build_file)
-    gyp_targets = [target_dicts[target]['target_name'] for target in target_list
-                   if target.startswith(build_file) and
-                   target in needed_targets]
-    # Only generate Makefiles for gyp files with targets.
-    if not gyp_targets:
-      continue
-    base_path, output_file = CalculateMakefilePath(build_file,
-        os.path.splitext(os.path.basename(build_file))[0] + '.Makefile')
-    makefile_rel_path = gyp.common.RelativePath(os.path.dirname(makefile_path),
-                                                os.path.dirname(output_file))
-    writer.WriteSubMake(output_file, makefile_rel_path, gyp_targets,
-                        builddir_name)
-
-
-  # Write out the sorted list of includes.
-  root_makefile.write('\n')
-  for include_file in sorted(include_list):
-    # We wrap each .mk include in an if statement so users can tell make to
-    # not load a file by setting NO_LOAD.  The below make code says, only
-    # load the .mk file if the .mk filename doesn't start with a token in
-    # NO_LOAD.
-    root_makefile.write(
-        "ifeq ($(strip $(foreach prefix,$(NO_LOAD),\\\n"
-        "    $(findstring $(join ^,$(prefix)),\\\n"
-        "                 $(join ^," + include_file + ")))),)\n")
-    root_makefile.write("  include " + include_file + "\n")
-    root_makefile.write("endif\n")
-  root_makefile.write('\n')
-
-  if (not generator_flags.get('standalone')
-      and generator_flags.get('auto_regeneration', True)):
-    WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files)
-
-  root_makefile.write(SHARED_FOOTER)
-
-  root_makefile.close()
diff --git a/tools/gyp/pylib/gyp/generator/msvs.py b/tools/gyp/pylib/gyp/generator/msvs.py
deleted file mode 100644
index ad4f685..0000000
--- a/tools/gyp/pylib/gyp/generator/msvs.py
+++ /dev/null
@@ -1,3102 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import copy
-import ntpath
-import os
-import posixpath
-import re
-import subprocess
-import sys
-
-import gyp.common
-import gyp.easy_xml as easy_xml
-import gyp.MSVSNew as MSVSNew
-import gyp.MSVSProject as MSVSProject
-import gyp.MSVSSettings as MSVSSettings
-import gyp.MSVSToolFile as MSVSToolFile
-import gyp.MSVSUserFile as MSVSUserFile
-import gyp.MSVSUtil as MSVSUtil
-import gyp.MSVSVersion as MSVSVersion
-from gyp.common import GypError
-
-
-# Regular expression for validating Visual Studio GUIDs.  If the GUID
-# contains lowercase hex letters, MSVS will be fine. However,
-# IncrediBuild BuildConsole will parse the solution file, but then
-# silently skip building the target causing hard to track down errors.
-# Note that this only happens with the BuildConsole, and does not occur
-# if IncrediBuild is executed from inside Visual Studio.  This regex
-# validates that the string looks like a GUID with all uppercase hex
-# letters.
-VALID_MSVS_GUID_CHARS = re.compile('^[A-F0-9\-]+$')
-
-
-generator_default_variables = {
-    'EXECUTABLE_PREFIX': '',
-    'EXECUTABLE_SUFFIX': '.exe',
-    'STATIC_LIB_PREFIX': '',
-    'SHARED_LIB_PREFIX': '',
-    'STATIC_LIB_SUFFIX': '.lib',
-    'SHARED_LIB_SUFFIX': '.dll',
-    'INTERMEDIATE_DIR': '$(IntDir)',
-    'SHARED_INTERMEDIATE_DIR': '$(OutDir)obj/global_intermediate',
-    'OS': 'win',
-    'PRODUCT_DIR': '$(OutDir)',
-    'LIB_DIR': '$(OutDir)lib',
-    'RULE_INPUT_ROOT': '$(InputName)',
-    'RULE_INPUT_DIRNAME': '$(InputDir)',
-    'RULE_INPUT_EXT': '$(InputExt)',
-    'RULE_INPUT_NAME': '$(InputFileName)',
-    'RULE_INPUT_PATH': '$(InputPath)',
-    'CONFIGURATION_NAME': '$(ConfigurationName)',
-}
-
-
-# The msvs specific sections that hold paths
-generator_additional_path_sections = [
-    'msvs_cygwin_dirs',
-    'msvs_props',
-]
-
-
-generator_additional_non_configuration_keys = [
-    'msvs_cygwin_dirs',
-    'msvs_cygwin_shell',
-    'msvs_shard',
-]
-
-
-# List of precompiled header related keys.
-precomp_keys = [
-    'msvs_precompiled_header',
-    'msvs_precompiled_source',
-]
-
-
-cached_username = None
-
-
-cached_domain = None
-
-
-# TODO(gspencer): Switch the os.environ calls to be
-# win32api.GetDomainName() and win32api.GetUserName() once the
-# python version in depot_tools has been updated to work on Vista
-# 64-bit.
-def _GetDomainAndUserName():
-  if sys.platform not in ('win32', 'cygwin'):
-    return ('DOMAIN', 'USERNAME')
-  global cached_username
-  global cached_domain
-  if not cached_domain or not cached_username:
-    domain = os.environ.get('USERDOMAIN')
-    username = os.environ.get('USERNAME')
-    if not domain or not username:
-      call = subprocess.Popen(['net', 'config', 'Workstation'],
-                              stdout=subprocess.PIPE)
-      config = call.communicate()[0]
-      username_re = re.compile('^User name\s+(\S+)', re.MULTILINE)
-      username_match = username_re.search(config)
-      if username_match:
-        username = username_match.group(1)
-      domain_re = re.compile('^Logon domain\s+(\S+)', re.MULTILINE)
-      domain_match = domain_re.search(config)
-      if domain_match:
-        domain = domain_match.group(1)
-    cached_domain = domain
-    cached_username = username
-  return (cached_domain, cached_username)
-
-fixpath_prefix = None
-
-
-def _NormalizedSource(source):
-  """Normalize the path.
-
-  But not if that gets rid of a variable, as this may expand to something
-  larger than one directory.
-
-  Arguments:
-      source: The path to be normalize.d
-
-  Returns:
-      The normalized path.
-  """
-  normalized = os.path.normpath(source)
-  if source.count('$') == normalized.count('$'):
-    source = normalized
-  return source
-
-
-def _FixPath(path):
-  """Convert paths to a form that will make sense in a vcproj file.
-
-  Arguments:
-    path: The path to convert, may contain / etc.
-  Returns:
-    The path with all slashes made into backslashes.
-  """
-  if fixpath_prefix and path and not os.path.isabs(path) and not path[0] == '$':
-    path = os.path.join(fixpath_prefix, path)
-  path = path.replace('/', '\\')
-  path = _NormalizedSource(path)
-  if path and path[-1] == '\\':
-    path = path[:-1]
-  return path
-
-
-def _FixPaths(paths):
-  """Fix each of the paths of the list."""
-  return [_FixPath(i) for i in paths]
-
-
-def _ConvertSourcesToFilterHierarchy(sources, prefix=None, excluded=None,
-                                     list_excluded=True):
-  """Converts a list split source file paths into a vcproj folder hierarchy.
-
-  Arguments:
-    sources: A list of source file paths split.
-    prefix: A list of source file path layers meant to apply to each of sources.
-    excluded: A set of excluded files.
-
-  Returns:
-    A hierarchy of filenames and MSVSProject.Filter objects that matches the
-    layout of the source tree.
-    For example:
-    _ConvertSourcesToFilterHierarchy([['a', 'bob1.c'], ['b', 'bob2.c']],
-                                     prefix=['joe'])
-    -->
-    [MSVSProject.Filter('a', contents=['joe\\a\\bob1.c']),
-     MSVSProject.Filter('b', contents=['joe\\b\\bob2.c'])]
-  """
-  if not prefix: prefix = []
-  result = []
-  excluded_result = []
-  folders = dict()
-  # Gather files into the final result, excluded, or folders.
-  for s in sources:
-    if len(s) == 1:
-      filename = _NormalizedSource('\\'.join(prefix + s))
-      if filename in excluded:
-        excluded_result.append(filename)
-      else:
-        result.append(filename)
-    else:
-      if not folders.get(s[0]):
-        folders[s[0]] = []
-      folders[s[0]].append(s[1:])
-  # Add a folder for excluded files.
-  if excluded_result and list_excluded:
-    excluded_folder = MSVSProject.Filter('_excluded_files',
-                                         contents=excluded_result)
-    result.append(excluded_folder)
-  # Populate all the folders.
-  for f in folders:
-    contents = _ConvertSourcesToFilterHierarchy(folders[f], prefix=prefix + [f],
-                                                excluded=excluded,
-                                                list_excluded=list_excluded)
-    contents = MSVSProject.Filter(f, contents=contents)
-    result.append(contents)
-
-  return result
-
-
-def _ToolAppend(tools, tool_name, setting, value, only_if_unset=False):
-  if not value: return
-  # TODO(bradnelson): ugly hack, fix this more generally!!!
-  if 'Directories' in setting or 'Dependencies' in setting:
-    if type(value) == str:
-      value = value.replace('/', '\\')
-    else:
-      value = [i.replace('/', '\\') for i in value]
-  if not tools.get(tool_name):
-    tools[tool_name] = dict()
-  tool = tools[tool_name]
-  if tool.get(setting):
-    if only_if_unset: return
-    if type(tool[setting]) == list:
-      tool[setting] += value
-    else:
-      raise TypeError(
-          'Appending "%s" to a non-list setting "%s" for tool "%s" is '
-          'not allowed, previous value: %s' % (
-              value, setting, tool_name, str(tool[setting])))
-  else:
-    tool[setting] = value
-
-
-def _ConfigPlatform(config_data):
-  return config_data.get('msvs_configuration_platform', 'Win32')
-
-
-def _ConfigBaseName(config_name, platform_name):
-  if config_name.endswith('_' + platform_name):
-    return config_name[0:-len(platform_name)-1]
-  else:
-    return config_name
-
-
-def _ConfigFullName(config_name, config_data):
-  platform_name = _ConfigPlatform(config_data)
-  return '%s|%s' % (_ConfigBaseName(config_name, platform_name), platform_name)
-
-
-def _BuildCommandLineForRuleRaw(spec, cmd, cygwin_shell, has_input_path,
-                                quote_cmd, do_setup_env):
-
-  if [x for x in cmd if '$(InputDir)' in x]:
-    input_dir_preamble = (
-      'set INPUTDIR=$(InputDir)\n'
-      'set INPUTDIR=%INPUTDIR:$(ProjectDir)=%\n'
-      'set INPUTDIR=%INPUTDIR:~0,-1%\n'
-      )
-  else:
-    input_dir_preamble = ''
-
-  if cygwin_shell:
-    # Find path to cygwin.
-    cygwin_dir = _FixPath(spec.get('msvs_cygwin_dirs', ['.'])[0])
-    # Prepare command.
-    direct_cmd = cmd
-    direct_cmd = [i.replace('$(IntDir)',
-                            '`cygpath -m "${INTDIR}"`') for i in direct_cmd]
-    direct_cmd = [i.replace('$(OutDir)',
-                            '`cygpath -m "${OUTDIR}"`') for i in direct_cmd]
-    direct_cmd = [i.replace('$(InputDir)',
-                            '`cygpath -m "${INPUTDIR}"`') for i in direct_cmd]
-    if has_input_path:
-      direct_cmd = [i.replace('$(InputPath)',
-                              '`cygpath -m "${INPUTPATH}"`')
-                    for i in direct_cmd]
-    direct_cmd = ['\\"%s\\"' % i.replace('"', '\\\\\\"') for i in direct_cmd]
-    #direct_cmd = gyp.common.EncodePOSIXShellList(direct_cmd)
-    direct_cmd = ' '.join(direct_cmd)
-    # TODO(quote):  regularize quoting path names throughout the module
-    cmd = ''
-    if do_setup_env:
-      cmd += 'call "$(ProjectDir)%(cygwin_dir)s\\setup_env.bat" && '
-    cmd += 'set CYGWIN=nontsec&& '
-    if direct_cmd.find('NUMBER_OF_PROCESSORS') >= 0:
-      cmd += 'set /a NUMBER_OF_PROCESSORS_PLUS_1=%%NUMBER_OF_PROCESSORS%%+1&& '
-    if direct_cmd.find('INTDIR') >= 0:
-      cmd += 'set INTDIR=$(IntDir)&& '
-    if direct_cmd.find('OUTDIR') >= 0:
-      cmd += 'set OUTDIR=$(OutDir)&& '
-    if has_input_path and direct_cmd.find('INPUTPATH') >= 0:
-      cmd += 'set INPUTPATH=$(InputPath) && '
-    cmd += 'bash -c "%(cmd)s"'
-    cmd = cmd % {'cygwin_dir': cygwin_dir,
-                 'cmd': direct_cmd}
-    return input_dir_preamble + cmd
-  else:
-    # Convert cat --> type to mimic unix.
-    if cmd[0] == 'cat':
-      command = ['type']
-    else:
-      command = [cmd[0].replace('/', '\\')]
-    # Add call before command to ensure that commands can be tied together one
-    # after the other without aborting in Incredibuild, since IB makes a bat
-    # file out of the raw command string, and some commands (like python) are
-    # actually batch files themselves.
-    command.insert(0, 'call')
-    # Fix the paths
-    # TODO(quote): This is a really ugly heuristic, and will miss path fixing
-    #              for arguments like "--arg=path" or "/opt:path".
-    # If the argument starts with a slash or dash, it's probably a command line
-    # switch
-    arguments = [i if (i[:1] in "/-") else _FixPath(i) for i in cmd[1:]]
-    arguments = [i.replace('$(InputDir)','%INPUTDIR%') for i in arguments]
-    arguments = [MSVSSettings.FixVCMacroSlashes(i) for i in arguments]
-    if quote_cmd:
-      # Support a mode for using cmd directly.
-      # Convert any paths to native form (first element is used directly).
-      # TODO(quote):  regularize quoting path names throughout the module
-      arguments = ['"%s"' % i for i in arguments]
-    # Collapse into a single command.
-    return input_dir_preamble + ' '.join(command + arguments)
-
-
-def _BuildCommandLineForRule(spec, rule, has_input_path, do_setup_env):
-  # Currently this weird argument munging is used to duplicate the way a
-  # python script would need to be run as part of the chrome tree.
-  # Eventually we should add some sort of rule_default option to set this
-  # per project. For now the behavior chrome needs is the default.
-  mcs = rule.get('msvs_cygwin_shell')
-  if mcs is None:
-    mcs = int(spec.get('msvs_cygwin_shell', 0))
-  elif isinstance(mcs, str):
-    mcs = int(mcs)
-  quote_cmd = int(rule.get('msvs_quote_cmd', 1))
-  return _BuildCommandLineForRuleRaw(spec, rule['action'], mcs, has_input_path,
-                                     quote_cmd, do_setup_env=do_setup_env)
-
-
-def _AddActionStep(actions_dict, inputs, outputs, description, command):
-  """Merge action into an existing list of actions.
-
-  Care must be taken so that actions which have overlapping inputs either don't
-  get assigned to the same input, or get collapsed into one.
-
-  Arguments:
-    actions_dict: dictionary keyed on input name, which maps to a list of
-      dicts describing the actions attached to that input file.
-    inputs: list of inputs
-    outputs: list of outputs
-    description: description of the action
-    command: command line to execute
-  """
-  # Require there to be at least one input (call sites will ensure this).
-  assert inputs
-
-  action = {
-      'inputs': inputs,
-      'outputs': outputs,
-      'description': description,
-      'command': command,
-  }
-
-  # Pick where to stick this action.
-  # While less than optimal in terms of build time, attach them to the first
-  # input for now.
-  chosen_input = inputs[0]
-
-  # Add it there.
-  if chosen_input not in actions_dict:
-    actions_dict[chosen_input] = []
-  actions_dict[chosen_input].append(action)
-
-
-def _AddCustomBuildToolForMSVS(p, spec, primary_input,
-                               inputs, outputs, description, cmd):
-  """Add a custom build tool to execute something.
-
-  Arguments:
-    p: the target project
-    spec: the target project dict
-    primary_input: input file to attach the build tool to
-    inputs: list of inputs
-    outputs: list of outputs
-    description: description of the action
-    cmd: command line to execute
-  """
-  inputs = _FixPaths(inputs)
-  outputs = _FixPaths(outputs)
-  tool = MSVSProject.Tool(
-      'VCCustomBuildTool',
-      {'Description': description,
-       'AdditionalDependencies': ';'.join(inputs),
-       'Outputs': ';'.join(outputs),
-       'CommandLine': cmd,
-      })
-  # Add to the properties of primary input for each config.
-  for config_name, c_data in spec['configurations'].iteritems():
-    p.AddFileConfig(_FixPath(primary_input),
-                    _ConfigFullName(config_name, c_data), tools=[tool])
-
-
-def _AddAccumulatedActionsToMSVS(p, spec, actions_dict):
-  """Add actions accumulated into an actions_dict, merging as needed.
-
-  Arguments:
-    p: the target project
-    spec: the target project dict
-    actions_dict: dictionary keyed on input name, which maps to a list of
-        dicts describing the actions attached to that input file.
-  """
-  for primary_input in actions_dict:
-    inputs = set()
-    outputs = set()
-    descriptions = []
-    commands = []
-    for action in actions_dict[primary_input]:
-      inputs.update(set(action['inputs']))
-      outputs.update(set(action['outputs']))
-      descriptions.append(action['description'])
-      commands.append(action['command'])
-    # Add the custom build step for one input file.
-    description = ', and also '.join(descriptions)
-    command = '\r\n'.join(commands)
-    _AddCustomBuildToolForMSVS(p, spec,
-                               primary_input=primary_input,
-                               inputs=inputs,
-                               outputs=outputs,
-                               description=description,
-                               cmd=command)
-
-
-def _RuleExpandPath(path, input_file):
-  """Given the input file to which a rule applied, string substitute a path.
-
-  Arguments:
-    path: a path to string expand
-    input_file: the file to which the rule applied.
-  Returns:
-    The string substituted path.
-  """
-  path = path.replace('$(InputName)',
-                      os.path.splitext(os.path.split(input_file)[1])[0])
-  path = path.replace('$(InputDir)', os.path.dirname(input_file))
-  path = path.replace('$(InputExt)',
-                      os.path.splitext(os.path.split(input_file)[1])[1])
-  path = path.replace('$(InputFileName)', os.path.split(input_file)[1])
-  path = path.replace('$(InputPath)', input_file)
-  return path
-
-
-def _FindRuleTriggerFiles(rule, sources):
-  """Find the list of files which a particular rule applies to.
-
-  Arguments:
-    rule: the rule in question
-    sources: the set of all known source files for this project
-  Returns:
-    The list of sources that trigger a particular rule.
-  """
-  rule_ext = rule['extension']
-  return [s for s in sources if s.endswith('.' + rule_ext)]
-
-
-def _RuleInputsAndOutputs(rule, trigger_file):
-  """Find the inputs and outputs generated by a rule.
-
-  Arguments:
-    rule: the rule in question.
-    trigger_file: the main trigger for this rule.
-  Returns:
-    The pair of (inputs, outputs) involved in this rule.
-  """
-  raw_inputs = _FixPaths(rule.get('inputs', []))
-  raw_outputs = _FixPaths(rule.get('outputs', []))
-  inputs = set()
-  outputs = set()
-  inputs.add(trigger_file)
-  for i in raw_inputs:
-    inputs.add(_RuleExpandPath(i, trigger_file))
-  for o in raw_outputs:
-    outputs.add(_RuleExpandPath(o, trigger_file))
-  return (inputs, outputs)
-
-
-def _GenerateNativeRulesForMSVS(p, rules, output_dir, spec, options):
-  """Generate a native rules file.
-
-  Arguments:
-    p: the target project
-    rules: the set of rules to include
-    output_dir: the directory in which the project/gyp resides
-    spec: the project dict
-    options: global generator options
-  """
-  rules_filename = '%s%s.rules' % (spec['target_name'],
-                                   options.suffix)
-  rules_file = MSVSToolFile.Writer(os.path.join(output_dir, rules_filename),
-                                   spec['target_name'])
-  # Add each rule.
-  for r in rules:
-    rule_name = r['rule_name']
-    rule_ext = r['extension']
-    inputs = _FixPaths(r.get('inputs', []))
-    outputs = _FixPaths(r.get('outputs', []))
-    # Skip a rule with no action and no inputs.
-    if 'action' not in r and not r.get('rule_sources', []):
-      continue
-    cmd = _BuildCommandLineForRule(spec, r, has_input_path=True,
-                                   do_setup_env=True)
-    rules_file.AddCustomBuildRule(name=rule_name,
-                                  description=r.get('message', rule_name),
-                                  extensions=[rule_ext],
-                                  additional_dependencies=inputs,
-                                  outputs=outputs,
-                                  cmd=cmd)
-  # Write out rules file.
-  rules_file.WriteIfChanged()
-
-  # Add rules file to project.
-  p.AddToolFile(rules_filename)
-
-
-def _Cygwinify(path):
-  path = path.replace('$(OutDir)', '$(OutDirCygwin)')
-  path = path.replace('$(IntDir)', '$(IntDirCygwin)')
-  return path
-
-
-def _GenerateExternalRules(rules, output_dir, spec,
-                           sources, options, actions_to_add):
-  """Generate an external makefile to do a set of rules.
-
-  Arguments:
-    rules: the list of rules to include
-    output_dir: path containing project and gyp files
-    spec: project specification data
-    sources: set of sources known
-    options: global generator options
-    actions_to_add: The list of actions we will add to.
-  """
-  filename = '%s_rules%s.mk' % (spec['target_name'], options.suffix)
-  mk_file = gyp.common.WriteOnDiff(os.path.join(output_dir, filename))
-  # Find cygwin style versions of some paths.
-  mk_file.write('OutDirCygwin:=$(shell cygpath -u "$(OutDir)")\n')
-  mk_file.write('IntDirCygwin:=$(shell cygpath -u "$(IntDir)")\n')
-  # Gather stuff needed to emit all: target.
-  all_inputs = set()
-  all_outputs = set()
-  all_output_dirs = set()
-  first_outputs = []
-  for rule in rules:
-    trigger_files = _FindRuleTriggerFiles(rule, sources)
-    for tf in trigger_files:
-      inputs, outputs = _RuleInputsAndOutputs(rule, tf)
-      all_inputs.update(set(inputs))
-      all_outputs.update(set(outputs))
-      # Only use one target from each rule as the dependency for
-      # 'all' so we don't try to build each rule multiple times.
-      first_outputs.append(list(outputs)[0])
-      # Get the unique output directories for this rule.
-      output_dirs = [os.path.split(i)[0] for i in outputs]
-      for od in output_dirs:
-        all_output_dirs.add(od)
-  first_outputs_cyg = [_Cygwinify(i) for i in first_outputs]
-  # Write out all: target, including mkdir for each output directory.
-  mk_file.write('all: %s\n' % ' '.join(first_outputs_cyg))
-  for od in all_output_dirs:
-    if od:
-      mk_file.write('\tmkdir -p `cygpath -u "%s"`\n' % od)
-  mk_file.write('\n')
-  # Define how each output is generated.
-  for rule in rules:
-    trigger_files = _FindRuleTriggerFiles(rule, sources)
-    for tf in trigger_files:
-      # Get all the inputs and outputs for this rule for this trigger file.
-      inputs, outputs = _RuleInputsAndOutputs(rule, tf)
-      inputs = [_Cygwinify(i) for i in inputs]
-      outputs = [_Cygwinify(i) for i in outputs]
-      # Prepare the command line for this rule.
-      cmd = [_RuleExpandPath(c, tf) for c in rule['action']]
-      cmd = ['"%s"' % i for i in cmd]
-      cmd = ' '.join(cmd)
-      # Add it to the makefile.
-      mk_file.write('%s: %s\n' % (' '.join(outputs), ' '.join(inputs)))
-      mk_file.write('\t%s\n\n' % cmd)
-  # Close up the file.
-  mk_file.close()
-
-  # Add makefile to list of sources.
-  sources.add(filename)
-  # Add a build action to call makefile.
-  cmd = ['make',
-         'OutDir=$(OutDir)',
-         'IntDir=$(IntDir)',
-         '-j', '${NUMBER_OF_PROCESSORS_PLUS_1}',
-         '-f', filename]
-  cmd = _BuildCommandLineForRuleRaw(spec, cmd, True, False, True, True)
-  # Insert makefile as 0'th input, so it gets the action attached there,
-  # as this is easier to understand from in the IDE.
-  all_inputs = list(all_inputs)
-  all_inputs.insert(0, filename)
-  _AddActionStep(actions_to_add,
-                 inputs=_FixPaths(all_inputs),
-                 outputs=_FixPaths(all_outputs),
-                 description='Running external rules for %s' %
-                     spec['target_name'],
-                 command=cmd)
-
-
-def _EscapeEnvironmentVariableExpansion(s):
-  """Escapes % characters.
-
-  Escapes any % characters so that Windows-style environment variable
-  expansions will leave them alone.
-  See http://connect.microsoft.com/VisualStudio/feedback/details/106127/cl-d-name-text-containing-percentage-characters-doesnt-compile
-  to understand why we have to do this.
-
-  Args:
-      s: The string to be escaped.
-
-  Returns:
-      The escaped string.
-  """
-  s = s.replace('%', '%%')
-  return s
-
-
-quote_replacer_regex = re.compile(r'(\\*)"')
-
-
-def _EscapeCommandLineArgumentForMSVS(s):
-  """Escapes a Windows command-line argument.
-
-  So that the Win32 CommandLineToArgv function will turn the escaped result back
-  into the original string.
-  See http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
-  ("Parsing C++ Command-Line Arguments") to understand why we have to do
-  this.
-
-  Args:
-      s: the string to be escaped.
-  Returns:
-      the escaped string.
-  """
-
-  def _Replace(match):
-    # For a literal quote, CommandLineToArgv requires an odd number of
-    # backslashes preceding it, and it produces half as many literal backslashes
-    # (rounded down). So we need to produce 2n+1 backslashes.
-    return 2 * match.group(1) + '\\"'
-
-  # Escape all quotes so that they are interpreted literally.
-  s = quote_replacer_regex.sub(_Replace, s)
-  # Now add unescaped quotes so that any whitespace is interpreted literally.
-  s = '"' + s + '"'
-  return s
-
-
-delimiters_replacer_regex = re.compile(r'(\\*)([,;]+)')
-
-
-def _EscapeVCProjCommandLineArgListItem(s):
-  """Escapes command line arguments for MSVS.
-
-  The VCProj format stores string lists in a single string using commas and
-  semi-colons as separators, which must be quoted if they are to be
-  interpreted literally. However, command-line arguments may already have
-  quotes, and the VCProj parser is ignorant of the backslash escaping
-  convention used by CommandLineToArgv, so the command-line quotes and the
-  VCProj quotes may not be the same quotes. So to store a general
-  command-line argument in a VCProj list, we need to parse the existing
-  quoting according to VCProj's convention and quote any delimiters that are
-  not already quoted by that convention. The quotes that we add will also be
-  seen by CommandLineToArgv, so if backslashes precede them then we also have
-  to escape those backslashes according to the CommandLineToArgv
-  convention.
-
-  Args:
-      s: the string to be escaped.
-  Returns:
-      the escaped string.
-  """
-
-  def _Replace(match):
-    # For a non-literal quote, CommandLineToArgv requires an even number of
-    # backslashes preceding it, and it produces half as many literal
-    # backslashes. So we need to produce 2n backslashes.
-    return 2 * match.group(1) + '"' + match.group(2) + '"'
-
-  segments = s.split('"')
-  # The unquoted segments are at the even-numbered indices.
-  for i in range(0, len(segments), 2):
-    segments[i] = delimiters_replacer_regex.sub(_Replace, segments[i])
-  # Concatenate back into a single string
-  s = '"'.join(segments)
-  if len(segments) % 2 == 0:
-    # String ends while still quoted according to VCProj's convention. This
-    # means the delimiter and the next list item that follow this one in the
-    # .vcproj file will be misinterpreted as part of this item. There is nothing
-    # we can do about this. Adding an extra quote would correct the problem in
-    # the VCProj but cause the same problem on the final command-line. Moving
-    # the item to the end of the list does works, but that's only possible if
-    # there's only one such item. Let's just warn the user.
-    print >> sys.stderr, ('Warning: MSVS may misinterpret the odd number of ' +
-                          'quotes in ' + s)
-  return s
-
-
-def _EscapeCppDefineForMSVS(s):
-  """Escapes a CPP define so that it will reach the compiler unaltered."""
-  s = _EscapeEnvironmentVariableExpansion(s)
-  s = _EscapeCommandLineArgumentForMSVS(s)
-  s = _EscapeVCProjCommandLineArgListItem(s)
-  # cl.exe replaces literal # characters with = in preprocesor definitions for
-  # some reason. Octal-encode to work around that.
-  s = s.replace('#', '\\%03o' % ord('#'))
-  return s
-
-
-quote_replacer_regex2 = re.compile(r'(\\+)"')
-
-
-def _EscapeCommandLineArgumentForMSBuild(s):
-  """Escapes a Windows command-line argument for use by MSBuild."""
-
-  def _Replace(match):
-    return (len(match.group(1))/2*4)*'\\' + '\\"'
-
-  # Escape all quotes so that they are interpreted literally.
-  s = quote_replacer_regex2.sub(_Replace, s)
-  return s
-
-
-def _EscapeMSBuildSpecialCharacters(s):
-  escape_dictionary = {
-      '%': '%25',
-      '$': '%24',
-      '@': '%40',
-      "'": '%27',
-      ';': '%3B',
-      '?': '%3F',
-      '*': '%2A'
-      }
-  result = ''.join([escape_dictionary.get(c, c) for c in s])
-  return result
-
-
-def _EscapeCppDefineForMSBuild(s):
-  """Escapes a CPP define so that it will reach the compiler unaltered."""
-  s = _EscapeEnvironmentVariableExpansion(s)
-  s = _EscapeCommandLineArgumentForMSBuild(s)
-  s = _EscapeMSBuildSpecialCharacters(s)
-  # cl.exe replaces literal # characters with = in preprocesor definitions for
-  # some reason. Octal-encode to work around that.
-  s = s.replace('#', '\\%03o' % ord('#'))
-  return s
-
-
-def _GenerateRulesForMSVS(p, output_dir, options, spec,
-                          sources, excluded_sources,
-                          actions_to_add):
-  """Generate all the rules for a particular project.
-
-  Arguments:
-    p: the project
-    output_dir: directory to emit rules to
-    options: global options passed to the generator
-    spec: the specification for this project
-    sources: the set of all known source files in this project
-    excluded_sources: the set of sources excluded from normal processing
-    actions_to_add: deferred list of actions to add in
-  """
-  rules = spec.get('rules', [])
-  rules_native = [r for r in rules if not int(r.get('msvs_external_rule', 0))]
-  rules_external = [r for r in rules if int(r.get('msvs_external_rule', 0))]
-
-  # Handle rules that use a native rules file.
-  if rules_native:
-    _GenerateNativeRulesForMSVS(p, rules_native, output_dir, spec, options)
-
-  # Handle external rules (non-native rules).
-  if rules_external:
-    _GenerateExternalRules(rules_external, output_dir, spec,
-                           sources, options, actions_to_add)
-  _AdjustSourcesForRules(rules, sources, excluded_sources)
-
-
-def _AdjustSourcesForRules(rules, sources, excluded_sources):
-  # Add outputs generated by each rule (if applicable).
-  for rule in rules:
-    # Done if not processing outputs as sources.
-    if int(rule.get('process_outputs_as_sources', False)):
-      # Add in the outputs from this rule.
-      trigger_files = _FindRuleTriggerFiles(rule, sources)
-      for trigger_file in trigger_files:
-        inputs, outputs = _RuleInputsAndOutputs(rule, trigger_file)
-        inputs = set(_FixPaths(inputs))
-        outputs = set(_FixPaths(outputs))
-        inputs.remove(_FixPath(trigger_file))
-        sources.update(inputs)
-        excluded_sources.update(inputs)
-        sources.update(outputs)
-
-
-def _FilterActionsFromExcluded(excluded_sources, actions_to_add):
-  """Take inputs with actions attached out of the list of exclusions.
-
-  Arguments:
-    excluded_sources: list of source files not to be built.
-    actions_to_add: dict of actions keyed on source file they're attached to.
-  Returns:
-    excluded_sources with files that have actions attached removed.
-  """
-  must_keep = set(_FixPaths(actions_to_add.keys()))
-  return [s for s in excluded_sources if s not in must_keep]
-
-
-def _GetDefaultConfiguration(spec):
-  return spec['configurations'][spec['default_configuration']]
-
-
-def _GetGuidOfProject(proj_path, spec):
-  """Get the guid for the project.
-
-  Arguments:
-    proj_path: Path of the vcproj or vcxproj file to generate.
-    spec: The target dictionary containing the properties of the target.
-  Returns:
-    the guid.
-  Raises:
-    ValueError: if the specified GUID is invalid.
-  """
-  # Pluck out the default configuration.
-  default_config = _GetDefaultConfiguration(spec)
-  # Decide the guid of the project.
-  guid = default_config.get('msvs_guid')
-  if guid:
-    if VALID_MSVS_GUID_CHARS.match(guid) is None:
-      raise ValueError('Invalid MSVS guid: "%s".  Must match regex: "%s".' %
-                       (guid, VALID_MSVS_GUID_CHARS.pattern))
-    guid = '{%s}' % guid
-  guid = guid or MSVSNew.MakeGuid(proj_path)
-  return guid
-
-
-def _GetMsbuildToolsetOfProject(proj_path, spec, version):
-  """Get the platform toolset for the project.
-
-  Arguments:
-    proj_path: Path of the vcproj or vcxproj file to generate.
-    spec: The target dictionary containing the properties of the target.
-    version: The MSVSVersion object.
-  Returns:
-    the platform toolset string or None.
-  """
-  # Pluck out the default configuration.
-  default_config = _GetDefaultConfiguration(spec)
-  toolset = default_config.get('msbuild_toolset')
-  if not toolset and version.DefaultToolset():
-    toolset = version.DefaultToolset()
-  return toolset
-
-
-def _GenerateProject(project, options, version, generator_flags):
-  """Generates a vcproj file.
-
-  Arguments:
-    project: the MSVSProject object.
-    options: global generator options.
-    version: the MSVSVersion object.
-    generator_flags: dict of generator-specific flags.
-  Returns:
-    A list of source files that cannot be found on disk.
-  """
-  default_config = _GetDefaultConfiguration(project.spec)
-
-  # Skip emitting anything if told to with msvs_existing_vcproj option.
-  if default_config.get('msvs_existing_vcproj'):
-    return []
-
-  if version.UsesVcxproj():
-    return _GenerateMSBuildProject(project, options, version, generator_flags)
-  else:
-    return _GenerateMSVSProject(project, options, version, generator_flags)
-
-
-def _GenerateMSVSProject(project, options, version, generator_flags):
-  """Generates a .vcproj file.  It may create .rules and .user files too.
-
-  Arguments:
-    project: The project object we will generate the file for.
-    options: Global options passed to the generator.
-    version: The VisualStudioVersion object.
-    generator_flags: dict of generator-specific flags.
-  """
-  spec = project.spec
-  vcproj_dir = os.path.dirname(project.path)
-  if vcproj_dir and not os.path.exists(vcproj_dir):
-    os.makedirs(vcproj_dir)
-
-  platforms = _GetUniquePlatforms(spec)
-  p = MSVSProject.Writer(project.path, version, spec['target_name'],
-                         project.guid, platforms)
-
-  # Get directory project file is in.
-  project_dir = os.path.split(project.path)[0]
-  gyp_path = _NormalizedSource(project.build_file)
-  relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir)
-
-  config_type = _GetMSVSConfigurationType(spec, project.build_file)
-  for config_name, config in spec['configurations'].iteritems():
-    _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config)
-
-  # Prepare list of sources and excluded sources.
-  gyp_file = os.path.split(project.build_file)[1]
-  sources, excluded_sources = _PrepareListOfSources(spec, generator_flags,
-                                                    gyp_file)
-
-  # Add rules.
-  actions_to_add = {}
-  _GenerateRulesForMSVS(p, project_dir, options, spec,
-                        sources, excluded_sources,
-                        actions_to_add)
-  list_excluded = generator_flags.get('msvs_list_excluded_files', True)
-  sources, excluded_sources, excluded_idl = (
-      _AdjustSourcesAndConvertToFilterHierarchy(
-          spec, options, project_dir, sources, excluded_sources, list_excluded))
-
-  # Add in files.
-  missing_sources = _VerifySourcesExist(sources, project_dir)
-  p.AddFiles(sources)
-
-  _AddToolFilesToMSVS(p, spec)
-  _HandlePreCompiledHeaders(p, sources, spec)
-  _AddActions(actions_to_add, spec, relative_path_of_gyp_file)
-  _AddCopies(actions_to_add, spec)
-  _WriteMSVSUserFile(project.path, version, spec)
-
-  # NOTE: this stanza must appear after all actions have been decided.
-  # Don't excluded sources with actions attached, or they won't run.
-  excluded_sources = _FilterActionsFromExcluded(
-      excluded_sources, actions_to_add)
-  _ExcludeFilesFromBeingBuilt(p, spec, excluded_sources, excluded_idl,
-                              list_excluded)
-  _AddAccumulatedActionsToMSVS(p, spec, actions_to_add)
-
-  # Write it out.
-  p.WriteIfChanged()
-
-  return missing_sources
-
-
-def _GetUniquePlatforms(spec):
-  """Returns the list of unique platforms for this spec, e.g ['win32', ...].
-
-  Arguments:
-    spec: The target dictionary containing the properties of the target.
-  Returns:
-    The MSVSUserFile object created.
-  """
-  # Gather list of unique platforms.
-  platforms = set()
-  for configuration in spec['configurations']:
-    platforms.add(_ConfigPlatform(spec['configurations'][configuration]))
-  platforms = list(platforms)
-  return platforms
-
-
-def _CreateMSVSUserFile(proj_path, version, spec):
-  """Generates a .user file for the user running this Gyp program.
-
-  Arguments:
-    proj_path: The path of the project file being created.  The .user file
-               shares the same path (with an appropriate suffix).
-    version: The VisualStudioVersion object.
-    spec: The target dictionary containing the properties of the target.
-  Returns:
-    The MSVSUserFile object created.
-  """
-  (domain, username) = _GetDomainAndUserName()
-  vcuser_filename = '.'.join([proj_path, domain, username, 'user'])
-  user_file = MSVSUserFile.Writer(vcuser_filename, version,
-                                  spec['target_name'])
-  return user_file
-
-
-def _GetMSVSConfigurationType(spec, build_file):
-  """Returns the configuration type for this project.
-
-  It's a number defined by Microsoft.  May raise an exception.
-
-  Args:
-      spec: The target dictionary containing the properties of the target.
-      build_file: The path of the gyp file.
-  Returns:
-      An integer, the configuration type.
-  """
-  try:
-    config_type = {
-        'executable': '1',  # .exe
-        'shared_library': '2',  # .dll
-        'loadable_module': '2',  # .dll
-        'static_library': '4',  # .lib
-        'none': '10',  # Utility type
-        }[spec['type']]
-  except KeyError:
-    if spec.get('type'):
-      raise Exception('Target type %s is not a valid target type for '
-                      'target %s in %s.' %
-                      (spec['type'], spec['target_name'], build_file))
-    else:
-      raise Exception('Missing type field for target %s in %s.' %
-                      (spec['target_name'], build_file))
-  return config_type
-
-
-def _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config):
-  """Adds a configuration to the MSVS project.
-
-  Many settings in a vcproj file are specific to a configuration.  This
-  function the main part of the vcproj file that's configuration specific.
-
-  Arguments:
-    p: The target project being generated.
-    spec: The target dictionary containing the properties of the target.
-    config_type: The configuration type, a number as defined by Microsoft.
-    config_name: The name of the configuration.
-    config: The dictionnary that defines the special processing to be done
-            for this configuration.
-  """
-  # Get the information for this configuration
-  include_dirs, resource_include_dirs = _GetIncludeDirs(config)
-  libraries = _GetLibraries(spec)
-  out_file, vc_tool, _ = _GetOutputFilePathAndTool(spec, msbuild=False)
-  defines = _GetDefines(config)
-  defines = [_EscapeCppDefineForMSVS(d) for d in defines]
-  disabled_warnings = _GetDisabledWarnings(config)
-  prebuild = config.get('msvs_prebuild')
-  postbuild = config.get('msvs_postbuild')
-  def_file = _GetModuleDefinition(spec)
-  precompiled_header = config.get('msvs_precompiled_header')
-
-  # Prepare the list of tools as a dictionary.
-  tools = dict()
-  # Add in user specified msvs_settings.
-  msvs_settings = config.get('msvs_settings', {})
-  MSVSSettings.ValidateMSVSSettings(msvs_settings)
-  for tool in msvs_settings:
-    settings = config['msvs_settings'][tool]
-    for setting in settings:
-      _ToolAppend(tools, tool, setting, settings[setting])
-  # Add the information to the appropriate tool
-  _ToolAppend(tools, 'VCCLCompilerTool',
-              'AdditionalIncludeDirectories', include_dirs)
-  _ToolAppend(tools, 'VCResourceCompilerTool',
-              'AdditionalIncludeDirectories', resource_include_dirs)
-  # Add in libraries.
-  _ToolAppend(tools, 'VCLinkerTool', 'AdditionalDependencies', libraries)
-  if out_file:
-    _ToolAppend(tools, vc_tool, 'OutputFile', out_file, only_if_unset=True)
-  # Add defines.
-  _ToolAppend(tools, 'VCCLCompilerTool', 'PreprocessorDefinitions', defines)
-  _ToolAppend(tools, 'VCResourceCompilerTool', 'PreprocessorDefinitions',
-              defines)
-  # Change program database directory to prevent collisions.
-  _ToolAppend(tools, 'VCCLCompilerTool', 'ProgramDataBaseFileName',
-              '$(IntDir)$(ProjectName)\\vc80.pdb', only_if_unset=True)
-  # Add disabled warnings.
-  _ToolAppend(tools, 'VCCLCompilerTool',
-              'DisableSpecificWarnings', disabled_warnings)
-  # Add Pre-build.
-  _ToolAppend(tools, 'VCPreBuildEventTool', 'CommandLine', prebuild)
-  # Add Post-build.
-  _ToolAppend(tools, 'VCPostBuildEventTool', 'CommandLine', postbuild)
-  # Turn on precompiled headers if appropriate.
-  if precompiled_header:
-    precompiled_header = os.path.split(precompiled_header)[1]
-    _ToolAppend(tools, 'VCCLCompilerTool', 'UsePrecompiledHeader', '2')
-    _ToolAppend(tools, 'VCCLCompilerTool',
-                'PrecompiledHeaderThrough', precompiled_header)
-    _ToolAppend(tools, 'VCCLCompilerTool',
-                'ForcedIncludeFiles', precompiled_header)
-  # Loadable modules don't generate import libraries;
-  # tell dependent projects to not expect one.
-  if spec['type'] == 'loadable_module':
-    _ToolAppend(tools, 'VCLinkerTool', 'IgnoreImportLibrary', 'true')
-  # Set the module definition file if any.
-  if def_file:
-    _ToolAppend(tools, 'VCLinkerTool', 'ModuleDefinitionFile', def_file)
-
-  _AddConfigurationToMSVS(p, spec, tools, config, config_type, config_name)
-
-
-def _GetIncludeDirs(config):
-  """Returns the list of directories to be used for #include directives.
-
-  Arguments:
-    config: The dictionnary that defines the special processing to be done
-            for this configuration.
-  Returns:
-    The list of directory paths.
-  """
-  # TODO(bradnelson): include_dirs should really be flexible enough not to
-  #                   require this sort of thing.
-  include_dirs = (
-      config.get('include_dirs', []) +
-      config.get('msvs_system_include_dirs', []))
-  resource_include_dirs = config.get('resource_include_dirs', include_dirs)
-  include_dirs = _FixPaths(include_dirs)
-  resource_include_dirs = _FixPaths(resource_include_dirs)
-  return include_dirs, resource_include_dirs
-
-
-def _GetLibraries(spec):
-  """Returns the list of libraries for this configuration.
-
-  Arguments:
-    spec: The target dictionary containing the properties of the target.
-  Returns:
-    The list of directory paths.
-  """
-  libraries = spec.get('libraries', [])
-  # Strip out -l, as it is not used on windows (but is needed so we can pass
-  # in libraries that are assumed to be in the default library path).
-  # Also remove duplicate entries, leaving only the last duplicate, while
-  # preserving order.
-  found = set()
-  unique_libraries_list = []
-  for entry in reversed(libraries):
-    library = re.sub('^\-l', '', entry)
-    if not os.path.splitext(library)[1]:
-      library += '.lib'
-    if library not in found:
-      found.add(library)
-      unique_libraries_list.append(library)
-  unique_libraries_list.reverse()
-  return unique_libraries_list
-
-
-def _GetOutputFilePathAndTool(spec, msbuild):
-  """Returns the path and tool to use for this target.
-
-  Figures out the path of the file this spec will create and the name of
-  the VC tool that will create it.
-
-  Arguments:
-    spec: The target dictionary containing the properties of the target.
-  Returns:
-    A triple of (file path, name of the vc tool, name of the msbuild tool)
-  """
-  # Select a name for the output file.
-  out_file = ''
-  vc_tool = ''
-  msbuild_tool = ''
-  output_file_map = {
-      'executable': ('VCLinkerTool', 'Link', '$(OutDir)', '.exe'),
-      'shared_library': ('VCLinkerTool', 'Link', '$(OutDir)', '.dll'),
-      'loadable_module': ('VCLinkerTool', 'Link', '$(OutDir)', '.dll'),
-      'static_library': ('VCLibrarianTool', 'Lib', '$(OutDir)lib\\', '.lib'),
-  }
-  output_file_props = output_file_map.get(spec['type'])
-  if output_file_props and int(spec.get('msvs_auto_output_file', 1)):
-    vc_tool, msbuild_tool, out_dir, suffix = output_file_props
-    if spec.get('standalone_static_library', 0):
-      out_dir = '$(OutDir)'
-    out_dir = spec.get('product_dir', out_dir)
-    product_extension = spec.get('product_extension')
-    if product_extension:
-      suffix = '.' + product_extension
-    elif msbuild:
-      suffix = '$(TargetExt)'
-    prefix = spec.get('product_prefix', '')
-    product_name = spec.get('product_name', '$(ProjectName)')
-    out_file = ntpath.join(out_dir, prefix + product_name + suffix)
-  return out_file, vc_tool, msbuild_tool
-
-
-def _GetDefines(config):
-  """Returns the list of preprocessor definitions for this configuation.
-
-  Arguments:
-    config: The dictionnary that defines the special processing to be done
-            for this configuration.
-  Returns:
-    The list of preprocessor definitions.
-  """
-  defines = []
-  for d in config.get('defines', []):
-    if type(d) == list:
-      fd = '='.join([str(dpart) for dpart in d])
-    else:
-      fd = str(d)
-    defines.append(fd)
-  return defines
-
-
-def _GetDisabledWarnings(config):
-  return [str(i) for i in config.get('msvs_disabled_warnings', [])]
-
-
-def _GetModuleDefinition(spec):
-  def_file = ''
-  if spec['type'] in ['shared_library', 'loadable_module', 'executable']:
-    def_files = [s for s in spec.get('sources', []) if s.endswith('.def')]
-    if len(def_files) == 1:
-      def_file = _FixPath(def_files[0])
-    elif def_files:
-      raise ValueError(
-          'Multiple module definition files in one target, target %s lists '
-          'multiple .def files: %s' % (
-              spec['target_name'], ' '.join(def_files)))
-  return def_file
-
-
-def _ConvertToolsToExpectedForm(tools):
-  """Convert tools to a form expected by Visual Studio.
-
-  Arguments:
-    tools: A dictionnary of settings; the tool name is the key.
-  Returns:
-    A list of Tool objects.
-  """
-  tool_list = []
-  for tool, settings in tools.iteritems():
-    # Collapse settings with lists.
-    settings_fixed = {}
-    for setting, value in settings.iteritems():
-      if type(value) == list:
-        if ((tool == 'VCLinkerTool' and
-             setting == 'AdditionalDependencies') or
-            setting == 'AdditionalOptions'):
-          settings_fixed[setting] = ' '.join(value)
-        else:
-          settings_fixed[setting] = ';'.join(value)
-      else:
-        settings_fixed[setting] = value
-    # Add in this tool.
-    tool_list.append(MSVSProject.Tool(tool, settings_fixed))
-  return tool_list
-
-
-def _AddConfigurationToMSVS(p, spec, tools, config, config_type, config_name):
-  """Add to the project file the configuration specified by config.
-
-  Arguments:
-    p: The target project being generated.
-    spec: the target project dict.
-    tools: A dictionnary of settings; the tool name is the key.
-    config: The dictionnary that defines the special processing to be done
-            for this configuration.
-    config_type: The configuration type, a number as defined by Microsoft.
-    config_name: The name of the configuration.
-  """
-  attributes = _GetMSVSAttributes(spec, config, config_type)
-  # Add in this configuration.
-  tool_list = _ConvertToolsToExpectedForm(tools)
-  p.AddConfig(_ConfigFullName(config_name, config),
-              attrs=attributes, tools=tool_list)
-
-
-def _GetMSVSAttributes(spec, config, config_type):
-  # Prepare configuration attributes.
-  prepared_attrs = {}
-  source_attrs = config.get('msvs_configuration_attributes', {})
-  for a in source_attrs:
-    prepared_attrs[a] = source_attrs[a]
-  # Add props files.
-  vsprops_dirs = config.get('msvs_props', [])
-  vsprops_dirs = _FixPaths(vsprops_dirs)
-  if vsprops_dirs:
-    prepared_attrs['InheritedPropertySheets'] = ';'.join(vsprops_dirs)
-  # Set configuration type.
-  prepared_attrs['ConfigurationType'] = config_type
-  output_dir = prepared_attrs.get('OutputDirectory',
-                                  '$(SolutionDir)$(ConfigurationName)')
-  prepared_attrs['OutputDirectory'] = _FixPath(output_dir) + '\\'
-  if 'IntermediateDirectory' not in prepared_attrs:
-    intermediate = '$(ConfigurationName)\\obj\\$(ProjectName)'
-    prepared_attrs['IntermediateDirectory'] = _FixPath(intermediate) + '\\'
-  else:
-    intermediate = _FixPath(prepared_attrs['IntermediateDirectory']) + '\\'
-    intermediate = MSVSSettings.FixVCMacroSlashes(intermediate)
-    prepared_attrs['IntermediateDirectory'] = intermediate
-  return prepared_attrs
-
-
-def _AddNormalizedSources(sources_set, sources_array):
-  sources = [_NormalizedSource(s) for s in sources_array]
-  sources_set.update(set(sources))
-
-
-def _PrepareListOfSources(spec, generator_flags, gyp_file):
-  """Prepare list of sources and excluded sources.
-
-  Besides the sources specified directly in the spec, adds the gyp file so
-  that a change to it will cause a re-compile. Also adds appropriate sources
-  for actions and copies. Assumes later stage will un-exclude files which
-  have custom build steps attached.
-
-  Arguments:
-    spec: The target dictionary containing the properties of the target.
-    gyp_file: The name of the gyp file.
-  Returns:
-    A pair of (list of sources, list of excluded sources).
-    The sources will be relative to the gyp file.
-  """
-  sources = set()
-  _AddNormalizedSources(sources, spec.get('sources', []))
-  excluded_sources = set()
-  # Add in the gyp file.
-  if not generator_flags.get('standalone'):
-    sources.add(gyp_file)
-
-  # Add in 'action' inputs and outputs.
-  for a in spec.get('actions', []):
-    inputs = a['inputs']
-    inputs = [_NormalizedSource(i) for i in inputs]
-    # Add all inputs to sources and excluded sources.
-    inputs = set(inputs)
-    sources.update(inputs)
-    excluded_sources.update(inputs)
-    if int(a.get('process_outputs_as_sources', False)):
-      _AddNormalizedSources(sources, a.get('outputs', []))
-  # Add in 'copies' inputs and outputs.
-  for cpy in spec.get('copies', []):
-    _AddNormalizedSources(sources, cpy.get('files', []))
-  return (sources, excluded_sources)
-
-
-def _AdjustSourcesAndConvertToFilterHierarchy(
-    spec, options, gyp_dir, sources, excluded_sources, list_excluded):
-  """Adjusts the list of sources and excluded sources.
-
-  Also converts the sets to lists.
-
-  Arguments:
-    spec: The target dictionary containing the properties of the target.
-    options: Global generator options.
-    gyp_dir: The path to the gyp file being processed.
-    sources: A set of sources to be included for this project.
-    excluded_sources: A set of sources to be excluded for this project.
-  Returns:
-    A trio of (list of sources, list of excluded sources,
-               path of excluded IDL file)
-  """
-  # Exclude excluded sources coming into the generator.
-  excluded_sources.update(set(spec.get('sources_excluded', [])))
-  # Add excluded sources into sources for good measure.
-  sources.update(excluded_sources)
-  # Convert to proper windows form.
-  # NOTE: sources goes from being a set to a list here.
-  # NOTE: excluded_sources goes from being a set to a list here.
-  sources = _FixPaths(sources)
-  # Convert to proper windows form.
-  excluded_sources = _FixPaths(excluded_sources)
-
-  excluded_idl = _IdlFilesHandledNonNatively(spec, sources)
-
-  precompiled_related = _GetPrecompileRelatedFiles(spec)
-  # Find the excluded ones, minus the precompiled header related ones.
-  fully_excluded = [i for i in excluded_sources if i not in precompiled_related]
-
-  # Convert to folders and the right slashes.
-  sources = [i.split('\\') for i in sources]
-  sources = _ConvertSourcesToFilterHierarchy(sources, excluded=fully_excluded,
-                                             list_excluded=list_excluded)
-
-  return sources, excluded_sources, excluded_idl
-
-
-def _IdlFilesHandledNonNatively(spec, sources):
-  # If any non-native rules use 'idl' as an extension exclude idl files.
-  # Gather a list here to use later.
-  using_idl = False
-  for rule in spec.get('rules', []):
-    if rule['extension'] == 'idl' and int(rule.get('msvs_external_rule', 0)):
-      using_idl = True
-      break
-  if using_idl:
-    excluded_idl = [i for i in sources if i.endswith('.idl')]
-  else:
-    excluded_idl = []
-  return excluded_idl
-
-
-def _GetPrecompileRelatedFiles(spec):
-  # Gather a list of precompiled header related sources.
-  precompiled_related = []
-  for _, config in spec['configurations'].iteritems():
-    for k in precomp_keys:
-      f = config.get(k)
-      if f:
-        precompiled_related.append(_FixPath(f))
-  return precompiled_related
-
-
-def _ExcludeFilesFromBeingBuilt(p, spec, excluded_sources, excluded_idl,
-                                list_excluded):
-  exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl)
-  for file_name, excluded_configs in exclusions.iteritems():
-    if (not list_excluded and
-            len(excluded_configs) == len(spec['configurations'])):
-      # If we're not listing excluded files, then they won't appear in the
-      # project, so don't try to configure them to be excluded.
-      pass
-    else:
-      for config_name, config in excluded_configs:
-        p.AddFileConfig(file_name, _ConfigFullName(config_name, config),
-                        {'ExcludedFromBuild': 'true'})
-
-
-def _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl):
-  exclusions = {}
-  # Exclude excluded sources from being built.
-  for f in excluded_sources:
-    excluded_configs = []
-    for config_name, config in spec['configurations'].iteritems():
-      precomped = [_FixPath(config.get(i, '')) for i in precomp_keys]
-      # Don't do this for ones that are precompiled header related.
-      if f not in precomped:
-        excluded_configs.append((config_name, config))
-    exclusions[f] = excluded_configs
-  # If any non-native rules use 'idl' as an extension exclude idl files.
-  # Exclude them now.
-  for f in excluded_idl:
-    excluded_configs = []
-    for config_name, config in spec['configurations'].iteritems():
-      excluded_configs.append((config_name, config))
-    exclusions[f] = excluded_configs
-  return exclusions
-
-
-def _AddToolFilesToMSVS(p, spec):
-  # Add in tool files (rules).
-  tool_files = set()
-  for _, config in spec['configurations'].iteritems():
-    for f in config.get('msvs_tool_files', []):
-      tool_files.add(f)
-  for f in tool_files:
-    p.AddToolFile(f)
-
-
-def _HandlePreCompiledHeaders(p, sources, spec):
-  # Pre-compiled header source stubs need a different compiler flag
-  # (generate precompiled header) and any source file not of the same
-  # kind (i.e. C vs. C++) as the precompiled header source stub needs
-  # to have use of precompiled headers disabled.
-  extensions_excluded_from_precompile = []
-  for config_name, config in spec['configurations'].iteritems():
-    source = config.get('msvs_precompiled_source')
-    if source:
-      source = _FixPath(source)
-      # UsePrecompiledHeader=1 for if using precompiled headers.
-      tool = MSVSProject.Tool('VCCLCompilerTool',
-                              {'UsePrecompiledHeader': '1'})
-      p.AddFileConfig(source, _ConfigFullName(config_name, config),
-                      {}, tools=[tool])
-      basename, extension = os.path.splitext(source)
-      if extension == '.c':
-        extensions_excluded_from_precompile = ['.cc', '.cpp', '.cxx']
-      else:
-        extensions_excluded_from_precompile = ['.c']
-  def DisableForSourceTree(source_tree):
-    for source in source_tree:
-      if isinstance(source, MSVSProject.Filter):
-        DisableForSourceTree(source.contents)
-      else:
-        basename, extension = os.path.splitext(source)
-        if extension in extensions_excluded_from_precompile:
-          for config_name, config in spec['configurations'].iteritems():
-            tool = MSVSProject.Tool('VCCLCompilerTool',
-                                    {'UsePrecompiledHeader': '0',
-                                     'ForcedIncludeFiles': '$(NOINHERIT)'})
-            p.AddFileConfig(_FixPath(source),
-                            _ConfigFullName(config_name, config),
-                            {}, tools=[tool])
-  # Do nothing if there was no precompiled source.
-  if extensions_excluded_from_precompile:
-    DisableForSourceTree(sources)
-
-
-def _AddActions(actions_to_add, spec, relative_path_of_gyp_file):
-  # Add actions.
-  actions = spec.get('actions', [])
-  # Don't setup_env every time. When all the actions are run together in one
-  # batch file in VS, the PATH will grow too long.
-  # Membership in this set means that the cygwin environment has been set up,
-  # and does not need to be set up again.
-  have_setup_env = set()
-  for a in actions:
-    # Attach actions to the gyp file if nothing else is there.
-    inputs = a.get('inputs') or [relative_path_of_gyp_file]
-    attached_to = inputs[0]
-    need_setup_env = attached_to not in have_setup_env
-    cmd = _BuildCommandLineForRule(spec, a, has_input_path=False,
-                                   do_setup_env=need_setup_env)
-    have_setup_env.add(attached_to)
-    # Add the action.
-    _AddActionStep(actions_to_add,
-                   inputs=inputs,
-                   outputs=a.get('outputs', []),
-                   description=a.get('message', a['action_name']),
-                   command=cmd)
-
-
-def _WriteMSVSUserFile(project_path, version, spec):
-  # Add run_as and test targets.
-  if 'run_as' in spec:
-    run_as = spec['run_as']
-    action = run_as.get('action', [])
-    environment = run_as.get('environment', [])
-    working_directory = run_as.get('working_directory', '.')
-  elif int(spec.get('test', 0)):
-    action = ['$(TargetPath)', '--gtest_print_time']
-    environment = []
-    working_directory = '.'
-  else:
-    return  # Nothing to add
-  # Write out the user file.
-  user_file = _CreateMSVSUserFile(project_path, version, spec)
-  for config_name, c_data in spec['configurations'].iteritems():
-    user_file.AddDebugSettings(_ConfigFullName(config_name, c_data),
-                               action, environment, working_directory)
-  user_file.WriteIfChanged()
-
-
-def _AddCopies(actions_to_add, spec):
-  copies = _GetCopies(spec)
-  for inputs, outputs, cmd, description in copies:
-    _AddActionStep(actions_to_add, inputs=inputs, outputs=outputs,
-                   description=description, command=cmd)
-
-
-def _GetCopies(spec):
-  copies = []
-  # Add copies.
-  for cpy in spec.get('copies', []):
-    for src in cpy.get('files', []):
-      dst = os.path.join(cpy['destination'], os.path.basename(src))
-      # _AddCustomBuildToolForMSVS() will call _FixPath() on the inputs and
-      # outputs, so do the same for our generated command line.
-      if src.endswith('/'):
-        src_bare = src[:-1]
-        base_dir = posixpath.split(src_bare)[0]
-        outer_dir = posixpath.split(src_bare)[1]
-        cmd = 'cd "%s" && xcopy /e /f /y "%s" "%s\\%s\\"' % (
-            _FixPath(base_dir), outer_dir, _FixPath(dst), outer_dir)
-        copies.append(([src], ['dummy_copies', dst], cmd,
-                       'Copying %s to %s' % (src, dst)))
-      else:
-        cmd = 'mkdir "%s" 2>nul & set ERRORLEVEL=0 & copy /Y "%s" "%s"' % (
-            _FixPath(cpy['destination']), _FixPath(src), _FixPath(dst))
-        copies.append(([src], [dst], cmd, 'Copying %s to %s' % (src, dst)))
-  return copies
-
-
-def _GetPathDict(root, path):
-  # |path| will eventually be empty (in the recursive calls) if it was initially
-  # relative; otherwise it will eventually end up as '\', 'D:\', etc.
-  if not path or path.endswith(os.sep):
-    return root
-  parent, folder = os.path.split(path)
-  parent_dict = _GetPathDict(root, parent)
-  if folder not in parent_dict:
-    parent_dict[folder] = dict()
-  return parent_dict[folder]
-
-
-def _DictsToFolders(base_path, bucket, flat):
-  # Convert to folders recursively.
-  children = []
-  for folder, contents in bucket.iteritems():
-    if type(contents) == dict:
-      folder_children = _DictsToFolders(os.path.join(base_path, folder),
-                                        contents, flat)
-      if flat:
-        children += folder_children
-      else:
-        folder_children = MSVSNew.MSVSFolder(os.path.join(base_path, folder),
-                                             name='(' + folder + ')',
-                                             entries=folder_children)
-        children.append(folder_children)
-    else:
-      children.append(contents)
-  return children
-
-
-def _CollapseSingles(parent, node):
-  # Recursively explorer the tree of dicts looking for projects which are
-  # the sole item in a folder which has the same name as the project. Bring
-  # such projects up one level.
-  if (type(node) == dict and
-      len(node) == 1 and
-      node.keys()[0] == parent + '.vcproj'):
-    return node[node.keys()[0]]
-  if type(node) != dict:
-    return node
-  for child in node:
-    node[child] = _CollapseSingles(child, node[child])
-  return node
-
-
-def _GatherSolutionFolders(sln_projects, project_objects, flat):
-  root = {}
-  # Convert into a tree of dicts on path.
-  for p in sln_projects:
-    gyp_file, target = gyp.common.ParseQualifiedTarget(p)[0:2]
-    gyp_dir = os.path.dirname(gyp_file)
-    path_dict = _GetPathDict(root, gyp_dir)
-    path_dict[target + '.vcproj'] = project_objects[p]
-  # Walk down from the top until we hit a folder that has more than one entry.
-  # In practice, this strips the top-level "src/" dir from the hierarchy in
-  # the solution.
-  while len(root) == 1 and type(root[root.keys()[0]]) == dict:
-    root = root[root.keys()[0]]
-  # Collapse singles.
-  root = _CollapseSingles('', root)
-  # Merge buckets until everything is a root entry.
-  return _DictsToFolders('', root, flat)
-
-
-def _GetPathOfProject(qualified_target, spec, options, msvs_version):
-  default_config = _GetDefaultConfiguration(spec)
-  proj_filename = default_config.get('msvs_existing_vcproj')
-  if not proj_filename:
-    proj_filename = (spec['target_name'] + options.suffix +
-                     msvs_version.ProjectExtension())
-
-  build_file = gyp.common.BuildFile(qualified_target)
-  proj_path = os.path.join(os.path.dirname(build_file), proj_filename)
-  fix_prefix = None
-  if options.generator_output:
-    project_dir_path = os.path.dirname(os.path.abspath(proj_path))
-    proj_path = os.path.join(options.generator_output, proj_path)
-    fix_prefix = gyp.common.RelativePath(project_dir_path,
-                                         os.path.dirname(proj_path))
-  return proj_path, fix_prefix
-
-
-def _GetPlatformOverridesOfProject(spec):
-  # Prepare a dict indicating which project configurations are used for which
-  # solution configurations for this target.
-  config_platform_overrides = {}
-  for config_name, c in spec['configurations'].iteritems():
-    config_fullname = _ConfigFullName(config_name, c)
-    platform = c.get('msvs_target_platform', _ConfigPlatform(c))
-    fixed_config_fullname = '%s|%s' % (
-        _ConfigBaseName(config_name, _ConfigPlatform(c)), platform)
-    config_platform_overrides[config_fullname] = fixed_config_fullname
-  return config_platform_overrides
-
-
-def _CreateProjectObjects(target_list, target_dicts, options, msvs_version):
-  """Create a MSVSProject object for the targets found in target list.
-
-  Arguments:
-    target_list: the list of targets to generate project objects for.
-    target_dicts: the dictionary of specifications.
-    options: global generator options.
-    msvs_version: the MSVSVersion object.
-  Returns:
-    A set of created projects, keyed by target.
-  """
-  global fixpath_prefix
-  # Generate each project.
-  projects = {}
-  for qualified_target in target_list:
-    spec = target_dicts[qualified_target]
-    if spec['toolset'] != 'target':
-      raise Exception(
-          'Multiple toolsets not supported in msvs build (target %s)' %
-          qualified_target)
-    proj_path, fixpath_prefix = _GetPathOfProject(qualified_target, spec,
-                                                  options, msvs_version)
-    guid = _GetGuidOfProject(proj_path, spec)
-    overrides = _GetPlatformOverridesOfProject(spec)
-    build_file = gyp.common.BuildFile(qualified_target)
-    # Create object for this project.
-    obj = MSVSNew.MSVSProject(
-        proj_path,
-        name=spec['target_name'],
-        guid=guid,
-        spec=spec,
-        build_file=build_file,
-        config_platform_overrides=overrides,
-        fixpath_prefix=fixpath_prefix)
-    # Set project toolset if any (MS build only)
-    if msvs_version.UsesVcxproj():
-      obj.set_msbuild_toolset(
-          _GetMsbuildToolsetOfProject(proj_path, spec, msvs_version))
-    projects[qualified_target] = obj
-  # Set all the dependencies
-  for project in projects.values():
-    deps = project.spec.get('dependencies', [])
-    deps = [projects[d] for d in deps]
-    project.set_dependencies(deps)
-  return projects
-
-
-def CalculateVariables(default_variables, params):
-  """Generated variables that require params to be known."""
-
-  generator_flags = params.get('generator_flags', {})
-
-  # Select project file format version (if unset, default to auto detecting).
-  msvs_version = MSVSVersion.SelectVisualStudioVersion(
-      generator_flags.get('msvs_version', 'auto'))
-  # Stash msvs_version for later (so we don't have to probe the system twice).
-  params['msvs_version'] = msvs_version
-
-  # Set a variable so conditions can be based on msvs_version.
-  default_variables['MSVS_VERSION'] = msvs_version.ShortName()
-
-  # To determine processor word size on Windows, in addition to checking
-  # PROCESSOR_ARCHITECTURE (which reflects the word size of the current
-  # process), it is also necessary to check PROCESSOR_ARCITEW6432 (which
-  # contains the actual word size of the system when running thru WOW64).
-  if (os.environ.get('PROCESSOR_ARCHITECTURE', '').find('64') >= 0 or
-      os.environ.get('PROCESSOR_ARCHITEW6432', '').find('64') >= 0):
-    default_variables['MSVS_OS_BITS'] = 64
-  else:
-    default_variables['MSVS_OS_BITS'] = 32
-
-
-def PerformBuild(data, configurations, params):
-  options = params['options']
-  msvs_version = params['msvs_version']
-  devenv = os.path.join(msvs_version.path, 'Common7', 'IDE', 'devenv.com')
-
-  for build_file, build_file_dict in data.iteritems():
-    (build_file_root, build_file_ext) = os.path.splitext(build_file)
-    if build_file_ext != '.gyp':
-      continue
-    sln_path = build_file_root + options.suffix + '.sln'
-    if options.generator_output:
-      sln_path = os.path.join(options.generator_output, sln_path)
-
-  for config in configurations:
-    arguments = [devenv, sln_path, '/Build', config]
-    print 'Building [%s]: %s' % (config, arguments)
-    rtn = subprocess.check_call(arguments)
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  """Generate .sln and .vcproj files.
-
-  This is the entry point for this generator.
-  Arguments:
-    target_list: List of target pairs: 'base/base.gyp:base'.
-    target_dicts: Dict of target properties keyed on target pair.
-    data: Dictionary containing per .gyp data.
-  """
-  global fixpath_prefix
-
-  options = params['options']
-
-  # Get the project file format version back out of where we stashed it in
-  # GeneratorCalculatedVariables.
-  msvs_version = params['msvs_version']
-
-  generator_flags = params.get('generator_flags', {})
-
-  # Optionally shard targets marked with 'msvs_shard': SHARD_COUNT.
-  (target_list, target_dicts) = MSVSUtil.ShardTargets(target_list, target_dicts)
-
-  # Prepare the set of configurations.
-  configs = set()
-  for qualified_target in target_list:
-    spec = target_dicts[qualified_target]
-    for config_name, config in spec['configurations'].iteritems():
-      configs.add(_ConfigFullName(config_name, config))
-  configs = list(configs)
-
-  # Figure out all the projects that will be generated and their guids
-  project_objects = _CreateProjectObjects(target_list, target_dicts, options,
-                                          msvs_version)
-
-  # Generate each project.
-  missing_sources = []
-  for project in project_objects.values():
-    fixpath_prefix = project.fixpath_prefix
-    missing_sources.extend(_GenerateProject(project, options, msvs_version,
-                                            generator_flags))
-  fixpath_prefix = None
-
-  for build_file in data:
-    # Validate build_file extension
-    if not build_file.endswith('.gyp'):
-      continue
-    sln_path = os.path.splitext(build_file)[0] + options.suffix + '.sln'
-    if options.generator_output:
-      sln_path = os.path.join(options.generator_output, sln_path)
-    # Get projects in the solution, and their dependents.
-    sln_projects = gyp.common.BuildFileTargets(target_list, build_file)
-    sln_projects += gyp.common.DeepDependencyTargets(target_dicts, sln_projects)
-    # Create folder hierarchy.
-    root_entries = _GatherSolutionFolders(
-        sln_projects, project_objects, flat=msvs_version.FlatSolution())
-    # Create solution.
-    sln = MSVSNew.MSVSSolution(sln_path,
-                               entries=root_entries,
-                               variants=configs,
-                               websiteProperties=False,
-                               version=msvs_version)
-    sln.Write()
-
-  if missing_sources:
-    error_message = "Missing input files:\n" + \
-                    '\n'.join(set(missing_sources))
-    if generator_flags.get('msvs_error_on_missing_sources', False):
-      raise Exception(error_message)
-    else:
-      print >>sys.stdout, "Warning: " + error_message
-
-
-def _GenerateMSBuildFiltersFile(filters_path, source_files,
-                                extension_to_rule_name):
-  """Generate the filters file.
-
-  This file is used by Visual Studio to organize the presentation of source
-  files into folders.
-
-  Arguments:
-      filters_path: The path of the file to be created.
-      source_files: The hierarchical structure of all the sources.
-      extension_to_rule_name: A dictionary mapping file extensions to rules.
-  """
-  filter_group = []
-  source_group = []
-  _AppendFiltersForMSBuild('', source_files, extension_to_rule_name,
-                           filter_group, source_group)
-  if filter_group:
-    content = ['Project',
-               {'ToolsVersion': '4.0',
-                'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003'
-               },
-               ['ItemGroup'] + filter_group,
-               ['ItemGroup'] + source_group
-              ]
-    easy_xml.WriteXmlIfChanged(content, filters_path, pretty=True, win32=True)
-  elif os.path.exists(filters_path):
-    # We don't need this filter anymore.  Delete the old filter file.
-    os.unlink(filters_path)
-
-
-def _AppendFiltersForMSBuild(parent_filter_name, sources,
-                             extension_to_rule_name,
-                             filter_group, source_group):
-  """Creates the list of filters and sources to be added in the filter file.
-
-  Args:
-      parent_filter_name: The name of the filter under which the sources are
-          found.
-      sources: The hierarchy of filters and sources to process.
-      extension_to_rule_name: A dictionary mapping file extensions to rules.
-      filter_group: The list to which filter entries will be appended.
-      source_group: The list to which source entries will be appeneded.
-  """
-  for source in sources:
-    if isinstance(source, MSVSProject.Filter):
-      # We have a sub-filter.  Create the name of that sub-filter.
-      if not parent_filter_name:
-        filter_name = source.name
-      else:
-        filter_name = '%s\\%s' % (parent_filter_name, source.name)
-      # Add the filter to the group.
-      filter_group.append(
-          ['Filter', {'Include': filter_name},
-           ['UniqueIdentifier', MSVSNew.MakeGuid(source.name)]])
-      # Recurse and add its dependents.
-      _AppendFiltersForMSBuild(filter_name, source.contents,
-                               extension_to_rule_name,
-                               filter_group, source_group)
-    else:
-      # It's a source.  Create a source entry.
-      _, element = _MapFileToMsBuildSourceType(source, extension_to_rule_name)
-      source_entry = [element, {'Include': source}]
-      # Specify the filter it is part of, if any.
-      if parent_filter_name:
-        source_entry.append(['Filter', parent_filter_name])
-      source_group.append(source_entry)
-
-
-def _MapFileToMsBuildSourceType(source, extension_to_rule_name):
-  """Returns the group and element type of the source file.
-
-  Arguments:
-      source: The source file name.
-      extension_to_rule_name: A dictionary mapping file extensions to rules.
-
-  Returns:
-      A pair of (group this file should be part of, the label of element)
-  """
-  _, ext = os.path.splitext(source)
-  if ext in extension_to_rule_name:
-    group = 'rule'
-    element = extension_to_rule_name[ext]
-  elif ext in ['.cc', '.cpp', '.c', '.cxx']:
-    group = 'compile'
-    element = 'ClCompile'
-  elif ext in ['.h', '.hxx']:
-    group = 'include'
-    element = 'ClInclude'
-  elif ext == '.rc':
-    group = 'resource'
-    element = 'ResourceCompile'
-  elif ext == '.idl':
-    group = 'midl'
-    element = 'Midl'
-  else:
-    group = 'none'
-    element = 'None'
-  return (group, element)
-
-
-def _GenerateRulesForMSBuild(output_dir, options, spec,
-                             sources, excluded_sources,
-                             props_files_of_rules, targets_files_of_rules,
-                             actions_to_add, extension_to_rule_name):
-  # MSBuild rules are implemented using three files: an XML file, a .targets
-  # file and a .props file.
-  # See http://blogs.msdn.com/b/vcblog/archive/2010/04/21/quick-help-on-vs2010-custom-build-rule.aspx
-  # for more details.
-  rules = spec.get('rules', [])
-  rules_native = [r for r in rules if not int(r.get('msvs_external_rule', 0))]
-  rules_external = [r for r in rules if int(r.get('msvs_external_rule', 0))]
-
-  msbuild_rules = []
-  for rule in rules_native:
-    # Skip a rule with no action and no inputs.
-    if 'action' not in rule and not rule.get('rule_sources', []):
-      continue
-    msbuild_rule = MSBuildRule(rule, spec)
-    msbuild_rules.append(msbuild_rule)
-    extension_to_rule_name[msbuild_rule.extension] = msbuild_rule.rule_name
-  if msbuild_rules:
-    base = spec['target_name'] + options.suffix
-    props_name = base + '.props'
-    targets_name = base + '.targets'
-    xml_name = base + '.xml'
-
-    props_files_of_rules.add(props_name)
-    targets_files_of_rules.add(targets_name)
-
-    props_path = os.path.join(output_dir, props_name)
-    targets_path = os.path.join(output_dir, targets_name)
-    xml_path = os.path.join(output_dir, xml_name)
-
-    _GenerateMSBuildRulePropsFile(props_path, msbuild_rules)
-    _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules)
-    _GenerateMSBuildRuleXmlFile(xml_path, msbuild_rules)
-
-  if rules_external:
-    _GenerateExternalRules(rules_external, output_dir, spec,
-                           sources, options, actions_to_add)
-  _AdjustSourcesForRules(rules, sources, excluded_sources)
-
-
-class MSBuildRule(object):
-  """Used to store information used to generate an MSBuild rule.
-
-  Attributes:
-    rule_name: The rule name, sanitized to use in XML.
-    target_name: The name of the target.
-    after_targets: The name of the AfterTargets element.
-    before_targets: The name of the BeforeTargets element.
-    depends_on: The name of the DependsOn element.
-    compute_output: The name of the ComputeOutput element.
-    dirs_to_make: The name of the DirsToMake element.
-    inputs: The name of the _inputs element.
-    tlog: The name of the _tlog element.
-    extension: The extension this rule applies to.
-    description: The message displayed when this rule is invoked.
-    additional_dependencies: A string listing additional dependencies.
-    outputs: The outputs of this rule.
-    command: The command used to run the rule.
-  """
-
-  def __init__(self, rule, spec):
-    self.display_name = rule['rule_name']
-    # Assure that the rule name is only characters and numbers
-    self.rule_name = re.sub(r'\W', '_', self.display_name)
-    # Create the various element names, following the example set by the
-    # Visual Studio 2008 to 2010 conversion.  I don't know if VS2010
-    # is sensitive to the exact names.
-    self.target_name = '_' + self.rule_name
-    self.after_targets = self.rule_name + 'AfterTargets'
-    self.before_targets = self.rule_name + 'BeforeTargets'
-    self.depends_on = self.rule_name + 'DependsOn'
-    self.compute_output = 'Compute%sOutput' % self.rule_name
-    self.dirs_to_make = self.rule_name + 'DirsToMake'
-    self.inputs = self.rule_name + '_inputs'
-    self.tlog = self.rule_name + '_tlog'
-    self.extension = rule['extension']
-    if not self.extension.startswith('.'):
-      self.extension = '.' + self.extension
-
-    self.description = MSVSSettings.ConvertVCMacrosToMSBuild(
-        rule.get('message', self.rule_name))
-    old_additional_dependencies = _FixPaths(rule.get('inputs', []))
-    self.additional_dependencies = (
-        ';'.join([MSVSSettings.ConvertVCMacrosToMSBuild(i)
-                  for i in old_additional_dependencies]))
-    old_outputs = _FixPaths(rule.get('outputs', []))
-    self.outputs = ';'.join([MSVSSettings.ConvertVCMacrosToMSBuild(i)
-                             for i in old_outputs])
-    old_command = _BuildCommandLineForRule(spec, rule, has_input_path=True,
-                                           do_setup_env=True)
-    self.command = MSVSSettings.ConvertVCMacrosToMSBuild(old_command)
-
-
-def _GenerateMSBuildRulePropsFile(props_path, msbuild_rules):
-  """Generate the .props file."""
-  content = ['Project',
-             {'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003'}]
-  for rule in msbuild_rules:
-    content.extend([
-        ['PropertyGroup',
-         {'Condition': "'$(%s)' == '' and '$(%s)' == '' and "
-          "'$(ConfigurationType)' != 'Makefile'" % (rule.before_targets,
-                                                    rule.after_targets)
-         },
-         [rule.before_targets, 'Midl'],
-         [rule.after_targets, 'CustomBuild'],
-        ],
-        ['PropertyGroup',
-         [rule.depends_on,
-          {'Condition': "'$(ConfigurationType)' != 'Makefile'"},
-          '_SelectedFiles;$(%s)' % rule.depends_on
-         ],
-        ],
-        ['ItemDefinitionGroup',
-         [rule.rule_name,
-          ['CommandLineTemplate', rule.command],
-          ['Outputs', rule.outputs],
-          ['ExecutionDescription', rule.description],
-          ['AdditionalDependencies', rule.additional_dependencies],
-         ],
-        ]
-    ])
-  easy_xml.WriteXmlIfChanged(content, props_path, pretty=True, win32=True)
-
-
-def _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules):
-  """Generate the .targets file."""
-  content = ['Project',
-             {'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003'
-             }
-            ]
-  item_group = [
-      'ItemGroup',
-      ['PropertyPageSchema',
-       {'Include': '$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml'}
-      ]
-    ]
-  for rule in msbuild_rules:
-    item_group.append(
-        ['AvailableItemName',
-         {'Include': rule.rule_name},
-         ['Targets', rule.target_name],
-        ])
-  content.append(item_group)
-
-  for rule in msbuild_rules:
-    content.append(
-        ['UsingTask',
-         {'TaskName': rule.rule_name,
-          'TaskFactory': 'XamlTaskFactory',
-          'AssemblyName': 'Microsoft.Build.Tasks.v4.0'
-         },
-         ['Task', '$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml'],
-        ])
-  for rule in msbuild_rules:
-    rule_name = rule.rule_name
-    target_outputs = '%%(%s.Outputs)' % rule_name
-    target_inputs = ('%%(%s.Identity);%%(%s.AdditionalDependencies);'
-                     '$(MSBuildProjectFile)') % (rule_name, rule_name)
-    rule_inputs = '%%(%s.Identity)' % rule_name
-    extension_condition = ("'%(Extension)'=='.obj' or "
-                           "'%(Extension)'=='.res' or "
-                           "'%(Extension)'=='.rsc' or "
-                           "'%(Extension)'=='.lib'")
-    remove_section = [
-        'ItemGroup',
-        {'Condition': "'@(SelectedFiles)' != ''"},
-        [rule_name,
-         {'Remove': '@(%s)' % rule_name,
-          'Condition': "'%(Identity)' != '@(SelectedFiles)'"
-         }
-        ]
-    ]
-    inputs_section = [
-        'ItemGroup',
-        [rule.inputs, {'Include': '%%(%s.AdditionalDependencies)' % rule_name}]
-    ]
-    logging_section = [
-        'ItemGroup',
-        [rule.tlog,
-         {'Include': '%%(%s.Outputs)' % rule_name,
-          'Condition': ("'%%(%s.Outputs)' != '' and "
-                        "'%%(%s.ExcludedFromBuild)' != 'true'" %
-                        (rule_name, rule_name))
-         },
-         ['Source', "@(%s, '|')" % rule_name],
-         ['Inputs', "@(%s -> '%%(Fullpath)', ';')" % rule.inputs],
-        ],
-    ]
-    message_section = [
-        'Message',
-        {'Importance': 'High',
-         'Text': '%%(%s.ExecutionDescription)' % rule_name
-        }
-    ]
-    write_tlog_section = [
-        'WriteLinesToFile',
-        {'Condition': "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
-         "'true'" % (rule.tlog, rule.tlog),
-         'File': '$(IntDir)$(ProjectName).write.1.tlog',
-         'Lines': "^%%(%s.Source);@(%s->'%%(Fullpath)')" % (rule.tlog,
-                                                            rule.tlog)
-        }
-    ]
-    read_tlog_section = [
-        'WriteLinesToFile',
-        {'Condition': "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
-         "'true'" % (rule.tlog, rule.tlog),
-         'File': '$(IntDir)$(ProjectName).read.1.tlog',
-         'Lines': "^%%(%s.Source);%%(%s.Inputs)" % (rule.tlog, rule.tlog)
-        }
-    ]
-    command_and_input_section = [
-        rule_name,
-        {'Condition': "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
-         "'true'" % (rule_name, rule_name),
-         'CommandLineTemplate': '%%(%s.CommandLineTemplate)' % rule_name,
-         'AdditionalOptions': '%%(%s.AdditionalOptions)' % rule_name,
-         'Inputs': rule_inputs
-        }
-    ]
-    content.extend([
-        ['Target',
-         {'Name': rule.target_name,
-          'BeforeTargets': '$(%s)' % rule.before_targets,
-          'AfterTargets': '$(%s)' % rule.after_targets,
-          'Condition': "'@(%s)' != ''" % rule_name,
-          'DependsOnTargets': '$(%s);%s' % (rule.depends_on,
-                                            rule.compute_output),
-          'Outputs': target_outputs,
-          'Inputs': target_inputs
-         },
-         remove_section,
-         inputs_section,
-         logging_section,
-         message_section,
-         write_tlog_section,
-         read_tlog_section,
-         command_and_input_section,
-        ],
-        ['PropertyGroup',
-         ['ComputeLinkInputsTargets',
-          '$(ComputeLinkInputsTargets);',
-          '%s;' % rule.compute_output
-         ],
-         ['ComputeLibInputsTargets',
-          '$(ComputeLibInputsTargets);',
-          '%s;' % rule.compute_output
-         ],
-        ],
-        ['Target',
-         {'Name': rule.compute_output,
-          'Condition': "'@(%s)' != ''" % rule_name
-         },
-         ['ItemGroup',
-          [rule.dirs_to_make,
-           {'Condition': "'@(%s)' != '' and "
-            "'%%(%s.ExcludedFromBuild)' != 'true'" % (rule_name, rule_name),
-            'Include': '%%(%s.Outputs)' % rule_name
-           }
-          ],
-          ['Link',
-           {'Include': '%%(%s.Identity)' % rule.dirs_to_make,
-            'Condition': extension_condition
-           }
-          ],
-          ['Lib',
-           {'Include': '%%(%s.Identity)' % rule.dirs_to_make,
-            'Condition': extension_condition
-           }
-          ],
-          ['ImpLib',
-           {'Include': '%%(%s.Identity)' % rule.dirs_to_make,
-            'Condition': extension_condition
-           }
-          ],
-         ],
-         ['MakeDir',
-          {'Directories': ("@(%s->'%%(RootDir)%%(Directory)')" %
-                           rule.dirs_to_make)
-          }
-         ]
-        ],
-    ])
-  easy_xml.WriteXmlIfChanged(content, targets_path, pretty=True, win32=True)
-
-
-def _GenerateMSBuildRuleXmlFile(xml_path, msbuild_rules):
-  # Generate the .xml file
-  content = [
-      'ProjectSchemaDefinitions',
-      {'xmlns': ('clr-namespace:Microsoft.Build.Framework.XamlTypes;'
-                 'assembly=Microsoft.Build.Framework'),
-       'xmlns:x': 'http://schemas.microsoft.com/winfx/2006/xaml',
-       'xmlns:sys': 'clr-namespace:System;assembly=mscorlib',
-       'xmlns:transformCallback':
-       'Microsoft.Cpp.Dev10.ConvertPropertyCallback'
-      }
-  ]
-  for rule in msbuild_rules:
-    content.extend([
-        ['Rule',
-         {'Name': rule.rule_name,
-          'PageTemplate': 'tool',
-          'DisplayName': rule.display_name,
-          'Order': '200'
-         },
-         ['Rule.DataSource',
-          ['DataSource',
-           {'Persistence': 'ProjectFile',
-            'ItemType': rule.rule_name
-           }
-          ]
-         ],
-         ['Rule.Categories',
-          ['Category',
-           {'Name': 'General'},
-           ['Category.DisplayName',
-            ['sys:String', 'General'],
-           ],
-          ],
-          ['Category',
-           {'Name': 'Command Line',
-            'Subtype': 'CommandLine'
-           },
-           ['Category.DisplayName',
-            ['sys:String', 'Command Line'],
-           ],
-          ],
-         ],
-         ['StringListProperty',
-          {'Name': 'Inputs',
-           'Category': 'Command Line',
-           'IsRequired': 'true',
-           'Switch': ' '
-          },
-          ['StringListProperty.DataSource',
-           ['DataSource',
-            {'Persistence': 'ProjectFile',
-             'ItemType': rule.rule_name,
-             'SourceType': 'Item'
-            }
-           ]
-          ],
-         ],
-         ['StringProperty',
-          {'Name': 'CommandLineTemplate',
-           'DisplayName': 'Command Line',
-           'Visible': 'False',
-           'IncludeInCommandLine': 'False'
-          }
-         ],
-         ['DynamicEnumProperty',
-          {'Name': rule.before_targets,
-           'Category': 'General',
-           'EnumProvider': 'Targets',
-           'IncludeInCommandLine': 'False'
-          },
-          ['DynamicEnumProperty.DisplayName',
-           ['sys:String', 'Execute Before'],
-          ],
-          ['DynamicEnumProperty.Description',
-           ['sys:String', 'Specifies the targets for the build customization'
-            ' to run before.'
-           ],
-          ],
-          ['DynamicEnumProperty.ProviderSettings',
-           ['NameValuePair',
-            {'Name': 'Exclude',
-             'Value': '^%s|^Compute' % rule.before_targets
-            }
-           ]
-          ],
-          ['DynamicEnumProperty.DataSource',
-           ['DataSource',
-            {'Persistence': 'ProjectFile',
-             'HasConfigurationCondition': 'true'
-            }
-           ]
-          ],
-         ],
-         ['DynamicEnumProperty',
-          {'Name': rule.after_targets,
-           'Category': 'General',
-           'EnumProvider': 'Targets',
-           'IncludeInCommandLine': 'False'
-          },
-          ['DynamicEnumProperty.DisplayName',
-           ['sys:String', 'Execute After'],
-          ],
-          ['DynamicEnumProperty.Description',
-           ['sys:String', ('Specifies the targets for the build customization'
-                           ' to run after.')
-           ],
-          ],
-          ['DynamicEnumProperty.ProviderSettings',
-           ['NameValuePair',
-            {'Name': 'Exclude',
-             'Value': '^%s|^Compute' % rule.after_targets
-            }
-           ]
-          ],
-          ['DynamicEnumProperty.DataSource',
-           ['DataSource',
-            {'Persistence': 'ProjectFile',
-             'ItemType': '',
-             'HasConfigurationCondition': 'true'
-            }
-           ]
-          ],
-         ],
-         ['StringListProperty',
-          {'Name': 'Outputs',
-           'DisplayName': 'Outputs',
-           'Visible': 'False',
-           'IncludeInCommandLine': 'False'
-          }
-         ],
-         ['StringProperty',
-          {'Name': 'ExecutionDescription',
-           'DisplayName': 'Execution Description',
-           'Visible': 'False',
-           'IncludeInCommandLine': 'False'
-          }
-         ],
-         ['StringListProperty',
-          {'Name': 'AdditionalDependencies',
-           'DisplayName': 'Additional Dependencies',
-           'IncludeInCommandLine': 'False',
-           'Visible': 'false'
-          }
-         ],
-         ['StringProperty',
-          {'Subtype': 'AdditionalOptions',
-           'Name': 'AdditionalOptions',
-           'Category': 'Command Line'
-          },
-          ['StringProperty.DisplayName',
-           ['sys:String', 'Additional Options'],
-          ],
-          ['StringProperty.Description',
-           ['sys:String', 'Additional Options'],
-          ],
-         ],
-        ],
-        ['ItemType',
-         {'Name': rule.rule_name,
-          'DisplayName': rule.display_name
-         }
-        ],
-        ['FileExtension',
-         {'Name': '*' + rule.extension,
-          'ContentType': rule.rule_name
-         }
-        ],
-        ['ContentType',
-         {'Name': rule.rule_name,
-          'DisplayName': '',
-          'ItemType': rule.rule_name
-         }
-        ]
-    ])
-  easy_xml.WriteXmlIfChanged(content, xml_path, pretty=True, win32=True)
-
-
-def _GetConfigurationAndPlatform(name, settings):
-  configuration = name.rsplit('_', 1)[0]
-  platform = settings.get('msvs_configuration_platform', 'Win32')
-  return (configuration, platform)
-
-
-def _GetConfigurationCondition(name, settings):
-  return (r"'$(Configuration)|$(Platform)'=='%s|%s'" %
-          _GetConfigurationAndPlatform(name, settings))
-
-
-def _GetMSBuildProjectConfigurations(configurations):
-  group = ['ItemGroup', {'Label': 'ProjectConfigurations'}]
-  for (name, settings) in sorted(configurations.iteritems()):
-    configuration, platform = _GetConfigurationAndPlatform(name, settings)
-    designation = '%s|%s' % (configuration, platform)
-    group.append(
-        ['ProjectConfiguration', {'Include': designation},
-         ['Configuration', configuration],
-         ['Platform', platform]])
-  return [group]
-
-
-def _GetMSBuildGlobalProperties(spec, guid, gyp_file_name):
-  namespace = os.path.splitext(gyp_file_name)[0]
-  return [
-      ['PropertyGroup', {'Label': 'Globals'},
-       ['ProjectGuid', guid],
-       ['Keyword', 'Win32Proj'],
-       ['RootNamespace', namespace],
-      ]
-  ]
-
-
-def _GetMSBuildConfigurationDetails(spec, build_file):
-  properties = {}
-  for name, settings in spec['configurations'].iteritems():
-    msbuild_attributes = _GetMSBuildAttributes(spec, settings, build_file)
-    condition = _GetConfigurationCondition(name, settings)
-    character_set = msbuild_attributes.get('CharacterSet')
-    _AddConditionalProperty(properties, condition, 'ConfigurationType',
-                            msbuild_attributes['ConfigurationType'])
-    if character_set:
-      _AddConditionalProperty(properties, condition, 'CharacterSet',
-                              character_set)
-  return _GetMSBuildPropertyGroup(spec, 'Configuration', properties)
-
-
-def _GetMSBuildLocalProperties(msbuild_toolset):
-  # Currently the only local property we support is PlatformToolset
-  properties = {}
-  if msbuild_toolset:
-    properties = [
-        ['PropertyGroup', {'Label': 'Locals'},
-          ['PlatformToolset', msbuild_toolset],
-        ]
-      ]
-  return properties
-
-
-def _GetMSBuildPropertySheets(configurations):
-  user_props = r'$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props'
-  additional_props = {}
-  props_specified = False
-  for name, settings in sorted(configurations.iteritems()):
-    configuration = _GetConfigurationCondition(name, settings)
-    if settings.has_key('msbuild_props'):
-      additional_props[configuration] = _FixPaths(settings['msbuild_props'])
-      props_specified = True
-    else:
-     additional_props[configuration] = ''
-
-  if not props_specified:
-    return [
-        ['ImportGroup',
-         {'Label': 'PropertySheets'},
-         ['Import',
-          {'Project': user_props,
-           'Condition': "exists('%s')" % user_props,
-           'Label': 'LocalAppDataPlatform'
-          }
-         ]
-        ]
-    ]
-  else:
-    sheets = []
-    for condition, props in additional_props.iteritems():
-      import_group = [
-        'ImportGroup',
-        {'Label': 'PropertySheets',
-         'Condition': condition
-        },
-        ['Import',
-         {'Project': user_props,
-          'Condition': "exists('%s')" % user_props,
-          'Label': 'LocalAppDataPlatform'
-         }
-        ]
-      ]
-      for props_file in props:
-        import_group.append(['Import', {'Project':props_file}])
-      sheets.append(import_group)
-    return sheets
-
-def _ConvertMSVSBuildAttributes(spec, config, build_file):
-  config_type = _GetMSVSConfigurationType(spec, build_file)
-  msvs_attributes = _GetMSVSAttributes(spec, config, config_type)
-  msbuild_attributes = {}
-  for a in msvs_attributes:
-    if a in ['IntermediateDirectory', 'OutputDirectory']:
-      directory = MSVSSettings.ConvertVCMacrosToMSBuild(msvs_attributes[a])
-      if not directory.endswith('\\'):
-        directory += '\\'
-      msbuild_attributes[a] = directory
-    elif a == 'CharacterSet':
-      msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a])
-    elif a == 'ConfigurationType':
-      msbuild_attributes[a] = _ConvertMSVSConfigurationType(msvs_attributes[a])
-    else:
-      print 'Warning: Do not know how to convert MSVS attribute ' + a
-  return msbuild_attributes
-
-
-def _ConvertMSVSCharacterSet(char_set):
-  if char_set.isdigit():
-    char_set = {
-        '0': 'MultiByte',
-        '1': 'Unicode',
-        '2': 'MultiByte',
-    }[char_set]
-  return char_set
-
-
-def _ConvertMSVSConfigurationType(config_type):
-  if config_type.isdigit():
-    config_type = {
-        '1': 'Application',
-        '2': 'DynamicLibrary',
-        '4': 'StaticLibrary',
-        '10': 'Utility'
-    }[config_type]
-  return config_type
-
-
-def _GetMSBuildAttributes(spec, config, build_file):
-  if 'msbuild_configuration_attributes' not in config:
-    msbuild_attributes = _ConvertMSVSBuildAttributes(spec, config, build_file)
-
-  else:
-    config_type = _GetMSVSConfigurationType(spec, build_file)
-    config_type = _ConvertMSVSConfigurationType(config_type)
-    msbuild_attributes = config.get('msbuild_configuration_attributes', {})
-    msbuild_attributes.setdefault('ConfigurationType', config_type)
-    output_dir = msbuild_attributes.get('OutputDirectory',
-                                      '$(SolutionDir)$(Configuration)')
-    msbuild_attributes['OutputDirectory'] = _FixPath(output_dir) + '\\'
-    if 'IntermediateDirectory' not in msbuild_attributes:
-      intermediate = _FixPath('$(Configuration)') + '\\'
-      msbuild_attributes['IntermediateDirectory'] = intermediate
-    if 'CharacterSet' in msbuild_attributes:
-      msbuild_attributes['CharacterSet'] = _ConvertMSVSCharacterSet(
-          msbuild_attributes['CharacterSet'])
-  if 'TargetName' not in msbuild_attributes:
-    prefix = spec.get('product_prefix', '')
-    product_name = spec.get('product_name', '$(ProjectName)')
-    target_name = prefix + product_name
-    msbuild_attributes['TargetName'] = target_name
-
-  # Make sure that 'TargetPath' matches 'Lib.OutputFile' or 'Link.OutputFile'
-  # (depending on the tool used) to avoid MSB8012 warning.
-  msbuild_tool_map = {
-      'executable': 'Link',
-      'shared_library': 'Link',
-      'loadable_module': 'Link',
-      'static_library': 'Lib',
-  }
-  msbuild_tool = msbuild_tool_map.get(spec['type'])
-  if msbuild_tool:
-    msbuild_settings = config['finalized_msbuild_settings']
-    out_file = msbuild_settings[msbuild_tool].get('OutputFile')
-    if out_file:
-      msbuild_attributes['TargetPath'] = _FixPath(out_file)
-
-  return msbuild_attributes
-
-
-def _GetMSBuildConfigurationGlobalProperties(spec, configurations, build_file):
-  # TODO(jeanluc) We could optimize out the following and do it only if
-  # there are actions.
-  # TODO(jeanluc) Handle the equivalent of setting 'CYGWIN=nontsec'.
-  new_paths = []
-  cygwin_dirs = spec.get('msvs_cygwin_dirs', ['.'])[0]
-  if cygwin_dirs:
-    cyg_path = '$(MSBuildProjectDirectory)\\%s\\bin\\' % _FixPath(cygwin_dirs)
-    new_paths.append(cyg_path)
-    # TODO(jeanluc) Change the convention to have both a cygwin_dir and a
-    # python_dir.
-    python_path = cyg_path.replace('cygwin\\bin', 'python_26')
-    new_paths.append(python_path)
-    if new_paths:
-      new_paths = '$(ExecutablePath);' + ';'.join(new_paths)
-
-  properties = {}
-  for (name, configuration) in sorted(configurations.iteritems()):
-    condition = _GetConfigurationCondition(name, configuration)
-    attributes = _GetMSBuildAttributes(spec, configuration, build_file)
-    msbuild_settings = configuration['finalized_msbuild_settings']
-    _AddConditionalProperty(properties, condition, 'IntDir',
-                            attributes['IntermediateDirectory'])
-    _AddConditionalProperty(properties, condition, 'OutDir',
-                            attributes['OutputDirectory'])
-    _AddConditionalProperty(properties, condition, 'TargetName',
-                            attributes['TargetName'])
-
-    if attributes.get('TargetPath'):
-      _AddConditionalProperty(properties, condition, 'TargetPath',
-                              attributes['TargetPath'])
-
-    if new_paths:
-      _AddConditionalProperty(properties, condition, 'ExecutablePath',
-                              new_paths)
-    tool_settings = msbuild_settings.get('', {})
-    for name, value in sorted(tool_settings.iteritems()):
-      formatted_value = _GetValueFormattedForMSBuild('', name, value)
-      _AddConditionalProperty(properties, condition, name, formatted_value)
-  return _GetMSBuildPropertyGroup(spec, None, properties)
-
-
-def _AddConditionalProperty(properties, condition, name, value):
-  """Adds a property / conditional value pair to a dictionary.
-
-  Arguments:
-    properties: The dictionary to be modified.  The key is the name of the
-        property.  The value is itself a dictionary; its key is the value and
-        the value a list of condition for which this value is true.
-    condition: The condition under which the named property has the value.
-    name: The name of the property.
-    value: The value of the property.
-  """
-  if name not in properties:
-    properties[name] = {}
-  values = properties[name]
-  if value not in values:
-    values[value] = []
-  conditions = values[value]
-  conditions.append(condition)
-
-
-# Regex for msvs variable references ( i.e. $(FOO) ).
-MSVS_VARIABLE_REFERENCE = re.compile('\$\(([a-zA-Z_][a-zA-Z0-9_]*)\)')
-
-
-def _GetMSBuildPropertyGroup(spec, label, properties):
-  """Returns a PropertyGroup definition for the specified properties.
-
-  Arguments:
-    spec: The target project dict.
-    label: An optional label for the PropertyGroup.
-    properties: The dictionary to be converted.  The key is the name of the
-        property.  The value is itself a dictionary; its key is the value and
-        the value a list of condition for which this value is true.
-  """
-  group = ['PropertyGroup']
-  if label:
-    group.append({'Label': label})
-  num_configurations = len(spec['configurations'])
-  def GetEdges(node):
-    # Use a definition of edges such that user_of_variable -> used_varible.
-    # This happens to be easier in this case, since a variable's
-    # definition contains all variables it references in a single string.
-    edges = set()
-    for value in sorted(properties[node].keys()):
-      # Add to edges all $(...) references to variables.
-      #
-      # Variable references that refer to names not in properties are excluded
-      # These can exist for instance to refer built in definitions like
-      # $(SolutionDir).
-      #
-      # Self references are ignored. Self reference is used in a few places to
-      # append to the default value. I.e. PATH=$(PATH);other_path
-      edges.update(set([v for v in MSVS_VARIABLE_REFERENCE.findall(value)
-                        if v in properties and v != node]))
-    return edges
-  properties_ordered = gyp.common.TopologicallySorted(
-      properties.keys(), GetEdges)
-  # Walk properties in the reverse of a topological sort on
-  # user_of_variable -> used_variable as this ensures variables are
-  # defined before they are used.
-  # NOTE: reverse(topsort(DAG)) = topsort(reverse_edges(DAG))
-  for name in reversed(properties_ordered):
-    values = properties[name]
-    for value, conditions in sorted(values.iteritems()):
-      if len(conditions) == num_configurations:
-        # If the value is the same all configurations,
-        # just add one unconditional entry.
-        group.append([name, value])
-      else:
-        for condition in conditions:
-          group.append([name, {'Condition': condition}, value])
-  return [group]
-
-
-def _GetMSBuildToolSettingsSections(spec, configurations):
-  groups = []
-  for (name, configuration) in sorted(configurations.iteritems()):
-    msbuild_settings = configuration['finalized_msbuild_settings']
-    group = ['ItemDefinitionGroup',
-             {'Condition': _GetConfigurationCondition(name, configuration)}
-            ]
-    for tool_name, tool_settings in sorted(msbuild_settings.iteritems()):
-      # Skip the tool named '' which is a holder of global settings handled
-      # by _GetMSBuildConfigurationGlobalProperties.
-      if tool_name:
-        if tool_settings:
-          tool = [tool_name]
-          for name, value in sorted(tool_settings.iteritems()):
-            formatted_value = _GetValueFormattedForMSBuild(tool_name, name,
-                                                           value)
-            tool.append([name, formatted_value])
-          group.append(tool)
-    groups.append(group)
-  return groups
-
-
-def _FinalizeMSBuildSettings(spec, configuration):
-  if 'msbuild_settings' in configuration:
-    converted = False
-    msbuild_settings = configuration['msbuild_settings']
-    MSVSSettings.ValidateMSBuildSettings(msbuild_settings)
-  else:
-    converted = True
-    msvs_settings = configuration.get('msvs_settings', {})
-    msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(msvs_settings)
-  include_dirs, resource_include_dirs = _GetIncludeDirs(configuration)
-  libraries = _GetLibraries(spec)
-  out_file, _, msbuild_tool = _GetOutputFilePathAndTool(spec, msbuild=True)
-  defines = _GetDefines(configuration)
-  if converted:
-    # Visual Studio 2010 has TR1
-    defines = [d for d in defines if d != '_HAS_TR1=0']
-    # Warn of ignored settings
-    ignored_settings = ['msvs_prebuild', 'msvs_postbuild', 'msvs_tool_files']
-    for ignored_setting in ignored_settings:
-      value = configuration.get(ignored_setting)
-      if value:
-        print ('Warning: The automatic conversion to MSBuild does not handle '
-               '%s.  Ignoring setting of %s' % (ignored_setting, str(value)))
-
-  defines = [_EscapeCppDefineForMSBuild(d) for d in defines]
-  disabled_warnings = _GetDisabledWarnings(configuration)
-  # TODO(jeanluc) Validate & warn that we don't translate
-  # prebuild = configuration.get('msvs_prebuild')
-  # postbuild = configuration.get('msvs_postbuild')
-  def_file = _GetModuleDefinition(spec)
-  precompiled_header = configuration.get('msvs_precompiled_header')
-
-  # Add the information to the appropriate tool
-  # TODO(jeanluc) We could optimize and generate these settings only if
-  # the corresponding files are found, e.g. don't generate ResourceCompile
-  # if you don't have any resources.
-  _ToolAppend(msbuild_settings, 'ClCompile',
-              'AdditionalIncludeDirectories', include_dirs)
-  _ToolAppend(msbuild_settings, 'ResourceCompile',
-              'AdditionalIncludeDirectories', resource_include_dirs)
-  # Add in libraries.
-  _ToolAppend(msbuild_settings, 'Link', 'AdditionalDependencies', libraries)
-  if out_file:
-    _ToolAppend(msbuild_settings, msbuild_tool, 'OutputFile', out_file,
-                only_if_unset=True)
-  # Add defines.
-  _ToolAppend(msbuild_settings, 'ClCompile',
-              'PreprocessorDefinitions', defines)
-  _ToolAppend(msbuild_settings, 'ResourceCompile',
-              'PreprocessorDefinitions', defines)
-  # Add disabled warnings.
-  _ToolAppend(msbuild_settings, 'ClCompile',
-              'DisableSpecificWarnings', disabled_warnings)
-  # Turn on precompiled headers if appropriate.
-  if precompiled_header:
-    precompiled_header = os.path.split(precompiled_header)[1]
-    _ToolAppend(msbuild_settings, 'ClCompile', 'PrecompiledHeader', 'Use')
-    _ToolAppend(msbuild_settings, 'ClCompile',
-                'PrecompiledHeaderFile', precompiled_header)
-    _ToolAppend(msbuild_settings, 'ClCompile',
-                'ForcedIncludeFiles', precompiled_header)
-  # Loadable modules don't generate import libraries;
-  # tell dependent projects to not expect one.
-  if spec['type'] == 'loadable_module':
-    _ToolAppend(msbuild_settings, '', 'IgnoreImportLibrary', 'true')
-  # Set the module definition file if any.
-  if def_file:
-    _ToolAppend(msbuild_settings, 'Link', 'ModuleDefinitionFile', def_file)
-  configuration['finalized_msbuild_settings'] = msbuild_settings
-
-
-def _GetValueFormattedForMSBuild(tool_name, name, value):
-  if type(value) == list:
-    # For some settings, VS2010 does not automatically extends the settings
-    # TODO(jeanluc) Is this what we want?
-    if name in ['AdditionalDependencies',
-                'AdditionalIncludeDirectories',
-                'AdditionalLibraryDirectories',
-                'AdditionalOptions',
-                'DelayLoadDLLs',
-                'DisableSpecificWarnings',
-                'PreprocessorDefinitions']:
-      value.append('%%(%s)' % name)
-    # For most tools, entries in a list should be separated with ';' but some
-    # settings use a space.  Check for those first.
-    exceptions = {
-        'ClCompile': ['AdditionalOptions'],
-        'Link': ['AdditionalOptions'],
-        'Lib': ['AdditionalOptions']}
-    if tool_name in exceptions and name in exceptions[tool_name]:
-      char = ' '
-    else:
-      char = ';'
-    formatted_value = char.join(
-        [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in value])
-  else:
-    formatted_value = MSVSSettings.ConvertVCMacrosToMSBuild(value)
-  return formatted_value
-
-
-def _VerifySourcesExist(sources, root_dir):
-  """Verifies that all source files exist on disk.
-
-  Checks that all regular source files, i.e. not created at run time,
-  exist on disk.  Missing files cause needless recompilation but no otherwise
-  visible errors.
-
-  Arguments:
-    sources: A recursive list of Filter/file names.
-    root_dir: The root directory for the relative path names.
-  Returns:
-    A list of source files that cannot be found on disk.
-  """
-  missing_sources = []
-  for source in sources:
-    if isinstance(source, MSVSProject.Filter):
-      missing_sources.extend(_VerifySourcesExist(source.contents, root_dir))
-    else:
-      if '$' not in source:
-        full_path = os.path.join(root_dir, source)
-        if not os.path.exists(full_path):
-          missing_sources.append(full_path)
-  return missing_sources
-
-
-def _GetMSBuildSources(spec, sources, exclusions, extension_to_rule_name,
-                       actions_spec, sources_handled_by_action, list_excluded):
-  groups = ['none', 'midl', 'include', 'compile', 'resource', 'rule']
-  grouped_sources = {}
-  for g in groups:
-    grouped_sources[g] = []
-
-  _AddSources2(spec, sources, exclusions, grouped_sources,
-               extension_to_rule_name, sources_handled_by_action, list_excluded)
-  sources = []
-  for g in groups:
-    if grouped_sources[g]:
-      sources.append(['ItemGroup'] + grouped_sources[g])
-  if actions_spec:
-    sources.append(['ItemGroup'] + actions_spec)
-  return sources
-
-
-def _AddSources2(spec, sources, exclusions, grouped_sources,
-                 extension_to_rule_name, sources_handled_by_action,
-                 list_excluded):
-  extensions_excluded_from_precompile = []
-  for source in sources:
-    if isinstance(source, MSVSProject.Filter):
-      _AddSources2(spec, source.contents, exclusions, grouped_sources,
-                   extension_to_rule_name, sources_handled_by_action,
-                   list_excluded)
-    else:
-      if not source in sources_handled_by_action:
-        detail = []
-        excluded_configurations = exclusions.get(source, [])
-        if len(excluded_configurations) == len(spec['configurations']):
-          detail.append(['ExcludedFromBuild', 'true'])
-        else:
-          for config_name, configuration in sorted(excluded_configurations):
-            condition = _GetConfigurationCondition(config_name, configuration)
-            detail.append(['ExcludedFromBuild',
-                           {'Condition': condition},
-                           'true'])
-        # Add precompile if needed
-        for config_name, configuration in spec['configurations'].iteritems():
-          precompiled_source = configuration.get('msvs_precompiled_source', '')
-          if precompiled_source != '':
-            precompiled_source = _FixPath(precompiled_source)
-            if not extensions_excluded_from_precompile:
-              # If the precompiled header is generated by a C source, we must
-              # not try to use it for C++ sources, and vice versa.
-              basename, extension = os.path.splitext(precompiled_source)
-              if extension == '.c':
-                extensions_excluded_from_precompile = ['.cc', '.cpp', '.cxx']
-              else:
-                extensions_excluded_from_precompile = ['.c']
-
-          if precompiled_source == source:
-            condition = _GetConfigurationCondition(config_name, configuration)
-            detail.append(['PrecompiledHeader',
-                           {'Condition': condition},
-                           'Create'
-                          ])
-          else:
-            # Turn off precompiled header usage for source files of a
-            # different type than the file that generated the
-            # precompiled header.
-            for extension in extensions_excluded_from_precompile:
-              if source.endswith(extension):
-                detail.append(['PrecompiledHeader', ''])
-                detail.append(['ForcedIncludeFiles', ''])
-
-        group, element = _MapFileToMsBuildSourceType(source,
-                                                     extension_to_rule_name)
-        grouped_sources[group].append([element, {'Include': source}] + detail)
-
-
-def _GetMSBuildProjectReferences(project):
-  references = []
-  if project.dependencies:
-    group = ['ItemGroup']
-    for dependency in project.dependencies:
-      guid = dependency.guid
-      project_dir = os.path.split(project.path)[0]
-      relative_path = gyp.common.RelativePath(dependency.path, project_dir)
-      project_ref = ['ProjectReference',
-          {'Include': relative_path},
-          ['Project', guid],
-          ['ReferenceOutputAssembly', 'false']
-          ]
-      for config in dependency.spec.get('configurations', {}).itervalues():
-        # If it's disabled in any config, turn it off in the reference.
-        if config.get('msvs_2010_disable_uldi_when_referenced', 0):
-          project_ref.append(['UseLibraryDependencyInputs', 'false'])
-          break
-      group.append(project_ref)
-    references.append(group)
-  return references
-
-
-def _GenerateMSBuildProject(project, options, version, generator_flags):
-  spec = project.spec
-  configurations = spec['configurations']
-  project_dir, project_file_name = os.path.split(project.path)
-  msbuildproj_dir = os.path.dirname(project.path)
-  if msbuildproj_dir and not os.path.exists(msbuildproj_dir):
-    os.makedirs(msbuildproj_dir)
-  # Prepare list of sources and excluded sources.
-  gyp_path = _NormalizedSource(project.build_file)
-  relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir)
-
-  gyp_file = os.path.split(project.build_file)[1]
-  sources, excluded_sources = _PrepareListOfSources(spec, generator_flags,
-                                                    gyp_file)
-  # Add rules.
-  actions_to_add = {}
-  props_files_of_rules = set()
-  targets_files_of_rules = set()
-  extension_to_rule_name = {}
-  list_excluded = generator_flags.get('msvs_list_excluded_files', True)
-  _GenerateRulesForMSBuild(project_dir, options, spec,
-                           sources, excluded_sources,
-                           props_files_of_rules, targets_files_of_rules,
-                           actions_to_add, extension_to_rule_name)
-  sources, excluded_sources, excluded_idl = (
-      _AdjustSourcesAndConvertToFilterHierarchy(spec, options,
-                                                project_dir, sources,
-                                                excluded_sources,
-                                                list_excluded))
-  _AddActions(actions_to_add, spec, project.build_file)
-  _AddCopies(actions_to_add, spec)
-
-  # NOTE: this stanza must appear after all actions have been decided.
-  # Don't excluded sources with actions attached, or they won't run.
-  excluded_sources = _FilterActionsFromExcluded(
-      excluded_sources, actions_to_add)
-
-  exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl)
-  actions_spec, sources_handled_by_action = _GenerateActionsForMSBuild(
-      spec, actions_to_add)
-
-  _GenerateMSBuildFiltersFile(project.path + '.filters', sources,
-                              extension_to_rule_name)
-  missing_sources = _VerifySourcesExist(sources, project_dir)
-
-  for configuration in configurations.itervalues():
-    _FinalizeMSBuildSettings(spec, configuration)
-
-  # Add attributes to root element
-
-  import_default_section = [
-      ['Import', {'Project': r'$(VCTargetsPath)\Microsoft.Cpp.Default.props'}]]
-  import_cpp_props_section = [
-      ['Import', {'Project': r'$(VCTargetsPath)\Microsoft.Cpp.props'}]]
-  import_cpp_targets_section = [
-      ['Import', {'Project': r'$(VCTargetsPath)\Microsoft.Cpp.targets'}]]
-  macro_section = [['PropertyGroup', {'Label': 'UserMacros'}]]
-
-  content = [
-      'Project',
-      {'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003',
-       'ToolsVersion': version.ProjectVersion(),
-       'DefaultTargets': 'Build'
-      }]
-
-  content += _GetMSBuildProjectConfigurations(configurations)
-  content += _GetMSBuildGlobalProperties(spec, project.guid, project_file_name)
-  content += import_default_section
-  content += _GetMSBuildConfigurationDetails(spec, project.build_file)
-  content += _GetMSBuildLocalProperties(project.msbuild_toolset)
-  content += import_cpp_props_section
-  content += _GetMSBuildExtensions(props_files_of_rules)
-  content += _GetMSBuildPropertySheets(configurations)
-  content += macro_section
-  content += _GetMSBuildConfigurationGlobalProperties(spec, configurations,
-                                                      project.build_file)
-  content += _GetMSBuildToolSettingsSections(spec, configurations)
-  content += _GetMSBuildSources(
-      spec, sources, exclusions, extension_to_rule_name, actions_spec,
-      sources_handled_by_action, list_excluded)
-  content += _GetMSBuildProjectReferences(project)
-  content += import_cpp_targets_section
-  content += _GetMSBuildExtensionTargets(targets_files_of_rules)
-
-  # TODO(jeanluc) File a bug to get rid of runas.  We had in MSVS:
-  # has_run_as = _WriteMSVSUserFile(project.path, version, spec)
-
-  easy_xml.WriteXmlIfChanged(content, project.path, pretty=True, win32=True)
-
-  return missing_sources
-
-
-def _GetMSBuildExtensions(props_files_of_rules):
-  extensions = ['ImportGroup', {'Label': 'ExtensionSettings'}]
-  for props_file in props_files_of_rules:
-    extensions.append(['Import', {'Project': props_file}])
-  return [extensions]
-
-
-def _GetMSBuildExtensionTargets(targets_files_of_rules):
-  targets_node = ['ImportGroup', {'Label': 'ExtensionTargets'}]
-  for targets_file in sorted(targets_files_of_rules):
-    targets_node.append(['Import', {'Project': targets_file}])
-  return [targets_node]
-
-
-def _GenerateActionsForMSBuild(spec, actions_to_add):
-  """Add actions accumulated into an actions_to_add, merging as needed.
-
-  Arguments:
-    spec: the target project dict
-    actions_to_add: dictionary keyed on input name, which maps to a list of
-        dicts describing the actions attached to that input file.
-
-  Returns:
-    A pair of (action specification, the sources handled by this action).
-  """
-  sources_handled_by_action = set()
-  actions_spec = []
-  for primary_input, actions in actions_to_add.iteritems():
-    inputs = set()
-    outputs = set()
-    descriptions = []
-    commands = []
-    for action in actions:
-      inputs.update(set(action['inputs']))
-      outputs.update(set(action['outputs']))
-      descriptions.append(action['description'])
-      cmd = action['command']
-      # For most actions, add 'call' so that actions that invoke batch files
-      # return and continue executing.  msbuild_use_call provides a way to
-      # disable this but I have not seen any adverse effect from doing that
-      # for everything.
-      if action.get('msbuild_use_call', True):
-        cmd = 'call ' + cmd
-      commands.append(cmd)
-    # Add the custom build action for one input file.
-    description = ', and also '.join(descriptions)
-
-    # We can't join the commands simply with && because the command line will
-    # get too long. See also _AddActions: cygwin's setup_env mustn't be called
-    # for every invocation or the command that sets the PATH will grow too
-    # long.
-    command = (
-        '\r\nif %errorlevel% neq 0 exit /b %errorlevel%\r\n'.join(commands))
-    _AddMSBuildAction(spec,
-                      primary_input,
-                      inputs,
-                      outputs,
-                      command,
-                      description,
-                      sources_handled_by_action,
-                      actions_spec)
-  return actions_spec, sources_handled_by_action
-
-
-def _AddMSBuildAction(spec, primary_input, inputs, outputs, cmd, description,
-                      sources_handled_by_action, actions_spec):
-  command = MSVSSettings.ConvertVCMacrosToMSBuild(cmd)
-  primary_input = _FixPath(primary_input)
-  inputs_array = _FixPaths(inputs)
-  outputs_array = _FixPaths(outputs)
-  additional_inputs = ';'.join([i for i in inputs_array
-                                if i != primary_input])
-  outputs = ';'.join(outputs_array)
-  sources_handled_by_action.add(primary_input)
-  action_spec = ['CustomBuild', {'Include': primary_input}]
-  action_spec.extend(
-      # TODO(jeanluc) 'Document' for all or just if as_sources?
-      [['FileType', 'Document'],
-       ['Command', command],
-       ['Message', description],
-       ['Outputs', outputs]
-      ])
-  if additional_inputs:
-    action_spec.append(['AdditionalInputs', additional_inputs])
-  actions_spec.append(action_spec)
diff --git a/tools/gyp/pylib/gyp/generator/msvs_test.py b/tools/gyp/pylib/gyp/generator/msvs_test.py
deleted file mode 100755
index c0b021d..0000000
--- a/tools/gyp/pylib/gyp/generator/msvs_test.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 Google Inc. 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 msvs.py file. """
-
-import gyp.generator.msvs as msvs
-import unittest
-import StringIO
-
-
-class TestSequenceFunctions(unittest.TestCase):
-
-  def setUp(self):
-    self.stderr = StringIO.StringIO()
-
-  def test_GetLibraries(self):
-    self.assertEqual(
-      msvs._GetLibraries({}),
-      [])
-    self.assertEqual(
-      msvs._GetLibraries({'libraries': []}),
-      [])
-    self.assertEqual(
-      msvs._GetLibraries({'other':'foo', 'libraries': ['a.lib']}),
-      ['a.lib'])
-    self.assertEqual(
-      msvs._GetLibraries({'libraries': ['-la']}),
-      ['a.lib'])
-    self.assertEqual(
-      msvs._GetLibraries({'libraries': ['a.lib', 'b.lib', 'c.lib', '-lb.lib',
-                                   '-lb.lib', 'd.lib', 'a.lib']}),
-      ['c.lib', 'b.lib', 'd.lib', 'a.lib'])
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/tools/gyp/pylib/gyp/generator/ninja.py b/tools/gyp/pylib/gyp/generator/ninja.py
deleted file mode 100755
index 85480fe..0000000
--- a/tools/gyp/pylib/gyp/generator/ninja.py
+++ /dev/null
@@ -1,1822 +0,0 @@
-#!/usr/bin/env python2
-# Copyright (c) 2013 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import copy
-import hashlib
-import multiprocessing
-import os.path
-import pipes
-import platform
-import re
-import signal
-import subprocess
-import sys
-
-from cobalt.build import config
-
-import gyp
-import gyp.common
-
-# TODO: These should be replaced with calls to the abstract tool chain, when it
-# is implemented on all supported platforms.
-from gyp.msvs_emulation import EncodeRspFileList
-from gyp.msvs_emulation import GenerateEnvironmentFiles
-from gyp.msvs_emulation import MsvsSettings
-import gyp.MSVSUtil as MSVSUtil
-import gyp.xcode_emulation
-
-import gyp.ninja_syntax as ninja_syntax
-
-if sys.platform == 'cygwin':
-  import cygpath
-
-from starboard.tools.toolchain import abstract
-
-generator_default_variables = {
-    'EXECUTABLE_PREFIX': '',
-    'EXECUTABLE_SUFFIX': '',
-    'STATIC_LIB_PREFIX': 'lib',
-    'STATIC_LIB_SUFFIX': '.a',
-    'SHARED_LIB_PREFIX': 'lib',
-
-    # Gyp expects the following variables to be expandable by the build
-    # system to the appropriate locations.  Ninja prefers paths to be
-    # known at gyp time.  To resolve this, introduce special
-    # variables starting with $! and $| (which begin with a $ so gyp knows it
-    # should be treated specially, but is otherwise an invalid
-    # ninja/shell variable) that are passed to gyp here but expanded
-    # before writing out into the target .ninja files; see
-    # ExpandSpecial.
-    # $! is used for variables that represent a path and that can only appear at
-    # the start of a string, while $| is used for variables that can appear
-    # anywhere in a string.
-    'INTERMEDIATE_DIR': '$!INTERMEDIATE_DIR',
-    'SHARED_INTERMEDIATE_DIR': '$!PRODUCT_DIR/gen',
-    'PRODUCT_DIR': '$!PRODUCT_DIR',
-    'CONFIGURATION_NAME': '$|CONFIGURATION_NAME',
-
-    # Special variables that may be used by gyp 'rule' targets.
-    # We generate definitions for these variables on the fly when processing a
-    # rule.
-    'RULE_INPUT_ROOT': '${root}',
-    'RULE_INPUT_DIRNAME': '${dirname}',
-    'RULE_INPUT_PATH': '${source}',
-    'RULE_INPUT_EXT': '${ext}',
-    'RULE_INPUT_NAME': '${name}',
-}
-
-# Placates pylint.
-generator_additional_non_configuration_keys = []
-generator_additional_path_sections = []
-generator_extra_sources_for_rules = []
-
-generator_supports_multiple_toolsets = True
-
-is_linux = platform.system() == 'Linux'
-is_windows = platform.system() == 'Windows'
-
-microsoft_flavors = [
-    'win',
-    'win-win32',
-    'win-win32-lib',
-]
-sony_flavors = []
-nintendo_flavors = []
-
-try:
-  import private_ninja_flavors
-  microsoft_flavors += private_ninja_flavors.PrivateMicrosoftFlavors()
-  sony_flavors += private_ninja_flavors.PrivateSonyFlavors()
-  nintendo_flavors += private_ninja_flavors.PrivateNintendoFlavors()
-except ImportError:
-  pass
-
-windows_host_flavors = microsoft_flavors + sony_flavors + nintendo_flavors
-
-
-def GetToolchainOrNone(flavor):
-  return config.GetPlatformConfig(flavor).GetToolchain()
-
-
-def GetTargetToolchain(flavor, **kwargs):
-  return config.GetPlatformConfig(flavor).GetTargetToolchain(**kwargs)
-
-
-def GetHostToolchain(flavor, **kwargs):
-  return config.GetPlatformConfig(flavor).GetHostToolchain(**kwargs)
-
-
-def FindFirstInstanceOf(type, instances):
-  try:
-    return (instance for instance in instances
-            if isinstance(instance, type)).next()
-  except StopIteration:
-    return None
-
-
-def GetShell(flavor):
-  shell = FindFirstInstanceOf(abstract.Shell, GetHostToolchain(flavor))
-  assert shell, 'The host toolchain must provide a shell.'
-  return shell
-
-
-def GetNinjaRuleName(tool, toolset):
-  if tool.IsPlatformAgnostic() or toolset == 'target':
-    return tool.GetRuleName()
-  return '{0}_{1}'.format(tool.GetRuleName(), toolset)
-
-
-def GetConfigFlags(config, toolset, keyword):
-  flags = config.get(keyword, [])
-  if toolset == 'host':
-    flags = config.get('{0}_host'.format(keyword), flags)
-  return [flag.replace('$', '$$') for flag in flags]
-
-
-def StripPrefix(arg, prefix):
-  if arg.startswith(prefix):
-    return arg[len(prefix):]
-  return arg
-
-
-def GetGeneratorVariables(flavor):
-  generator_variables = copy.copy(generator_default_variables)
-  if GetToolchainOrNone(flavor):
-    GetToolchainOrNone(flavor).SetAdditionalGypVariables(generator_variables)
-  else:
-    CalculateVariables(generator_variables, {'flavor': flavor})
-  return generator_variables
-
-
-def QuoteShellArgument(arg, flavor):
-  """Quote a string such that it will be interpreted as a single argument
-  by the shell."""
-  # Rather than attempting to enumerate the bad shell characters, just
-  # whitelist common OK ones and quote anything else.
-  if re.match(r'^[a-zA-Z0-9_=.\\/-]+$', arg):
-    return arg  # No quoting necessary.
-  if GetToolchainOrNone(flavor):
-    return GetToolchainOrNone(flavor).QuoteForRspFile(arg)
-  elif flavor in sony_flavors or flavor in nintendo_flavors:
-    # Escape double quotes.
-    return '"' + arg.replace('\"', '\\\"') + '"'
-  return "'" + arg.replace("'", "'" + '"\'"' + "'") + "'"
-
-
-def Define(d, flavor):
-  """Takes a preprocessor define and returns a -D parameter that's ninja- and
-
-  shell-escaped.
-  """
-
-  return QuoteShellArgument(ninja_syntax.escape('-D' + d), flavor)
-
-
-def InvertRelativePath(path):
-  """Given a relative path like foo/bar, return the inverse relative path:
-
-  the path from the relative path back to the origin dir.
-
-  E.g. os.path.normpath(os.path.join(path, InvertRelativePath(path)))
-  should always produce the empty string.
-  """
-
-  if not path:
-    return path
-  # Only need to handle relative paths into subdirectories for now.
-  assert '..' not in path, path
-  depth = len(path.split(os.path.sep))
-  return os.path.sep.join(['..'] * depth)
-
-
-class Target:
-  """Target represents the paths used within a single gyp target.
-
-  Conceptually, building a single target A is a series of steps:
-
-  1) actions/rules/copies  generates source/resources/etc.
-  2) compiles              generates .o files
-  3) link                  generates a binary (library/executable)
-  4) bundle                merges the above in a mac bundle
-
-  (Any of these steps can be optional.)
-
-  From a build ordering perspective, a dependent target B could just
-  depend on the last output of this series of steps.
-
-  But some dependent commands sometimes need to reach inside the box.
-  For example, when linking B it needs to get the path to the static
-  library generated by A.
-
-  This object stores those paths.  To keep things simple, member
-  variables only store concrete paths to single files, while methods
-  compute derived values like "the last output of the target".
-  """
-
-  def __init__(self, type):
-    # Gyp type ("static_library", etc.) of this target.
-    self.type = type
-    # File representing whether any input dependencies necessary for
-    # dependent actions have completed.
-    self.preaction_stamp = None
-    # File representing whether any input dependencies necessary for
-    # dependent compiles have completed.
-    self.precompile_stamp = None
-    # File representing the completion of actions/rules/copies, if any.
-    self.actions_stamp = None
-    # Path to the output of the link step, if any.
-    self.binary = None
-    # Path to the file representing the completion of building the bundle,
-    # if any.
-    self.bundle = None
-    # On Windows, incremental linking requires linking against all the .objs
-    # that compose a .lib (rather than the .lib itself). That list is stored
-    # here.
-    self.component_objs = None
-    # Windows only. The import .lib is the output of a build step, but
-    # because dependents only link against the lib (not both the lib and the
-    # dll) we keep track of the import library here.
-    self.import_lib = None
-
-  def Linkable(self):
-    """Return true if this is a target that can be linked against."""
-    return self.type in ('static_library', 'shared_library')
-
-  def PreActionInput(self, flavor):
-    """Return the path, if any, that should be used as a dependency of
-
-    any dependent action step.
-    """
-    return self.FinalOutput() or self.preaction_stamp
-
-  def PreCompileInput(self):
-    """Return the path, if any, that should be used as a dependency of
-
-    any dependent compile step.
-    """
-    return self.actions_stamp or self.precompile_stamp
-
-  def FinalOutput(self):
-    """Return the last output of the target, which depends on all prior
-
-    steps.
-    """
-    return self.bundle or self.binary or self.actions_stamp
-
-
-# A small discourse on paths as used within the Ninja build:
-# All files we produce (both at gyp and at build time) appear in the
-# build directory (e.g. out/Debug).
-#
-# Paths within a given .gyp file are always relative to the directory
-# containing the .gyp file.  Call these "gyp paths".  This includes
-# sources as well as the starting directory a given gyp rule/action
-# expects to be run from.  We call the path from the source root to
-# the gyp file the "base directory" within the per-.gyp-file
-# NinjaWriter code.
-#
-# All paths as written into the .ninja files are relative to the build
-# directory.  Call these paths "ninja paths".
-#
-# We translate between these two notions of paths with two helper
-# functions:
-#
-# - GypPathToNinja translates a gyp path (i.e. relative to the .gyp file)
-#   into the equivalent ninja path.
-#
-# - GypPathToUniqueOutput translates a gyp path into a ninja path to write
-#   an output file; the result can be namespaced such that it is unique
-#   to the input file name as well as the output target name.
-
-
-class NinjaWriter:
-
-  def __init__(self,
-               qualified_target,
-               target_outputs,
-               base_dir,
-               build_dir,
-               output_file,
-               flavor,
-               case_sensitive_filesystem,
-               abs_build_dir=None):
-    """base_dir: path from source root to directory containing this gyp file,
-
-              by gyp semantics, all input paths are relative to this
-    build_dir: path from source root to build output
-    abs_build_dir: absolute path to the build directory
-    """
-    self.case_sensitive_filesystem = case_sensitive_filesystem
-    self.qualified_target = qualified_target
-    self.target_outputs = target_outputs
-    self.base_dir = base_dir
-    self.build_dir = build_dir
-    self.abs_build_dir = abs_build_dir
-    self.ninja = ninja_syntax.Writer(output_file)
-    self.flavor = flavor
-    self.path_module = os.path
-
-    self.abs_build_dir = abs_build_dir
-    self.obj_ext = '.obj' if flavor == 'win' else '.o'
-    if flavor in windows_host_flavors:
-      # See docstring of msvs_emulation.GenerateEnvironmentFiles().
-      self.win_env = {}
-      for arch in ('x86', 'x64'):
-        self.win_env[arch] = 'environment.' + arch
-
-    # Relative path from build output dir to base dir.
-    self.build_to_base = os.path.join(InvertRelativePath(build_dir), base_dir)
-    # Relative path from base dir to build dir.
-    self.base_to_build = os.path.join(InvertRelativePath(base_dir), build_dir)
-
-  def ExpandSpecial(self, path, product_dir=None):
-    """Expand specials like $!PRODUCT_DIR in |path|.
-
-    If |product_dir| is None, assumes the cwd is already the product
-    dir.  Otherwise, |product_dir| is the relative path to the product
-    dir.
-    """
-
-    PRODUCT_DIR = '$!PRODUCT_DIR'
-    if PRODUCT_DIR in path:
-      if product_dir:
-        path = path.replace(PRODUCT_DIR, product_dir)
-      else:
-        path = path.replace(PRODUCT_DIR + '/', '')
-        path = path.replace(PRODUCT_DIR + '\\', '')
-        path = path.replace(PRODUCT_DIR, '.')
-
-    INTERMEDIATE_DIR = '$!INTERMEDIATE_DIR'
-    if INTERMEDIATE_DIR in path:
-      int_dir = self.GypPathToUniqueOutput('gen')
-      # GypPathToUniqueOutput generates a path relative to the product dir,
-      # so insert product_dir in front if it is provided.
-      path = path.replace(INTERMEDIATE_DIR,
-                          os.path.join(product_dir or '', int_dir))
-
-    CONFIGURATION_NAME = '$|CONFIGURATION_NAME'
-    path = path.replace(CONFIGURATION_NAME, self.config_name)
-
-    return path
-
-  def ExpandRuleVariables(self, path, root, dirname, source, ext, name):
-    if self.flavor == 'win':
-      path = GetToolchainOrNone(
-          self.flavor).GetCompilerSettings().ConvertVSMacros(
-              path, config=self.config_name)
-    path = path.replace(generator_default_variables['RULE_INPUT_ROOT'], root)
-    path = path.replace(generator_default_variables['RULE_INPUT_DIRNAME'],
-                        dirname)
-    path = path.replace(generator_default_variables['RULE_INPUT_PATH'], source)
-    path = path.replace(generator_default_variables['RULE_INPUT_EXT'], ext)
-    path = path.replace(generator_default_variables['RULE_INPUT_NAME'], name)
-    return path
-
-  def GypPathCaseCorrection(self, path):
-    # Ninja's depfile handling gets confused when the case of a filename
-    # changes on a case-insensitive file system. To work around that, always
-    # convert filenames to lowercase on such file systems. See
-    # https://github.com/martine/ninja/issues/402 for details.
-    if self.case_sensitive_filesystem:
-      return path
-    else:
-      return path.lower()
-
-  def GypPathToNinja(self, path, env=None):
-    """Translate a gyp path to a ninja path, optionally expanding environment
-
-    variable references in |path| with |env|.
-
-    See the above discourse on path conversions.
-    """
-    if env:
-      if self.flavor == 'mac':
-        path = gyp.xcode_emulation.ExpandEnvVars(path, env)
-      elif GetToolchainOrNone(self.flavor):
-        path = GetToolchainOrNone(self.flavor).ExpandEnvVars(path, env)
-    if path.startswith('$!'):
-      expanded = self.ExpandSpecial(path)
-      if self.flavor == 'win':
-        expanded = os.path.normpath(expanded)
-      else:
-        expanded = self.path_module.normpath(expanded)
-      return self.GypPathCaseCorrection(expanded)
-    if '$|' in path:
-      path = self.ExpandSpecial(path)
-    assert '$' not in path, path
-
-    # TODO: this needs a proper fix.
-    is_absolute = path.startswith('C:') or path.startswith(
-        'c:') or path.startswith('/')
-    if not is_absolute:
-      path = self.path_module.normpath(os.path.join(self.build_to_base, path))
-
-    return self.GypPathCaseCorrection(path)
-
-  def GypPathToUniqueOutput(self, path, qualified=True):
-    """Translate a gyp path to a ninja path for writing output.
-
-    If qualified is True, qualify the resulting filename with the name
-    of the target.  This is necessary when e.g. compiling the same
-    path twice for two separate output targets.
-
-    See the above discourse on path conversions.
-    """
-
-    path = self.ExpandSpecial(path)
-    assert not path.startswith('$'), path
-
-    # Translate the path following this scheme:
-    #   Input: foo/bar.gyp, target targ, references baz/out.o
-    #   Output: obj/foo/baz/targ.out.o (if qualified)
-    #           obj/foo/baz/out.o (otherwise)
-    #     (and obj.host instead of obj for cross-compiles)
-    #
-    # Why this scheme and not some other one?
-    # 1) for a given input, you can compute all derived outputs by matching
-    #    its path, even if the input is brought via a gyp file with '..'.
-    # 2) simple files like libraries and stamps have a simple filename.
-
-    obj = 'obj'
-    if self.toolset != 'target':
-      obj += '.' + self.toolset
-
-    path_dir, path_basename = os.path.split(path)
-    if qualified:
-      path_basename = self.name + '.' + path_basename
-    path = self.path_module.normpath(
-        os.path.join(obj, self.base_dir, path_dir, path_basename))
-
-    return self.GypPathCaseCorrection(path)
-
-  def WriteCollapsedDependencies(self, name, targets):
-    """Given a list of targets, return a path for a single file
-
-    representing the result of building all the targets or None.
-
-    Uses a stamp file if necessary.
-    """
-
-    assert targets == filter(None, targets), targets
-    if len(targets) == 0:
-      return None
-    if len(targets) == 1:
-      return targets[0]
-
-    assert FindFirstInstanceOf(abstract.Stamp, GetHostToolchain(
-        self.flavor)), 'Host toolchain must provide stamp tool.'
-
-    stamp_output = self.GypPathToUniqueOutput(name + '.stamp')
-    self.ninja.build(stamp_output, 'stamp', targets)
-    self.ninja.newline()
-    return stamp_output
-
-  def WriteSpec(self, spec, config_name, generator_flags):
-    """The main entry point for NinjaWriter: write the build rules for a spec.
-
-    Returns a Target object, which represents the output paths for this spec.
-    Returns None if there are no outputs (e.g. a settings-only 'none' type
-    target).
-    """
-
-    self.config_name = config_name
-    self.name = spec['target_name']
-    self.toolset = spec['toolset']
-    config = spec['configurations'][config_name]
-    self.target = Target(spec['type'])
-    self.is_standalone_static_library = bool(
-        spec.get('standalone_static_library', 0))
-
-    self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec)
-    self.xcode_settings = None
-    if self.flavor == 'mac':
-      self.xcode_settings = gyp.xcode_emulation.XcodeSettings(spec)
-    if (self.flavor in windows_host_flavors and is_windows):
-      if self.flavor in sony_flavors or self.flavor in nintendo_flavors:
-        self.msvs_settings = gyp.msvs_emulation.MsvsSettings(
-            spec, generator_flags)
-        arch = self.msvs_settings.GetArch(config_name)
-      else:
-        GetToolchainOrNone(self.flavor).InitCompilerSettings(
-            spec, **{'generator_flags': generator_flags})
-        arch = GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().GetArch(config_name)
-      self.ninja.variable('arch', self.win_env[arch])
-      None
-
-    # Compute predepends for all rules.
-    # actions_depends is the dependencies this target depends on before running
-    # any of its action/rule/copy steps.
-    # compile_depends is the dependencies this target depends on before running
-    # any of its compile steps.
-    actions_depends = []
-    compile_depends = []
-    # TODO(evan): it is rather confusing which things are lists and which
-    # are strings.  Fix these.
-    if 'dependencies' in spec:
-      for dep in spec['dependencies']:
-        if dep in self.target_outputs:
-          target = self.target_outputs[dep]
-          actions_depends.append(target.PreActionInput(self.flavor))
-          compile_depends.append(target.PreCompileInput())
-      actions_depends = filter(None, actions_depends)
-      compile_depends = filter(None, compile_depends)
-      actions_depends = self.WriteCollapsedDependencies('actions_depends',
-                                                        actions_depends)
-      compile_depends = self.WriteCollapsedDependencies('compile_depends',
-                                                        compile_depends)
-      self.target.preaction_stamp = actions_depends
-      self.target.precompile_stamp = compile_depends
-
-    # Write out actions, rules, and copies.  These must happen before we
-    # compile any sources, so compute a list of predependencies for sources
-    # while we do it.
-    extra_sources = []
-    mac_bundle_depends = []
-    self.target.actions_stamp = self.WriteActionsRulesCopies(
-        spec, extra_sources, actions_depends, mac_bundle_depends)
-
-    # If we have actions/rules/copies, we depend directly on those, but
-    # otherwise we depend on dependent target's actions/rules/copies etc.
-    # We never need to explicitly depend on previous target's link steps,
-    # because no compile ever depends on them.
-    compile_depends_stamp = (self.target.actions_stamp or compile_depends)
-
-    # Write out the compilation steps, if any.
-    link_deps = []
-    sources = spec.get('sources', []) + extra_sources
-    if sources:
-      pch = None
-      if GetToolchainOrNone(self.flavor):
-        GetToolchainOrNone(self.flavor).VerifyMissingSources(
-            sources, **{
-                'build_dir': self.abs_build_dir,
-                'generator_flags': generator_flags,
-                'gyp_path_to_ninja': self.GypPathToNinja
-            })
-        pch = GetToolchainOrNone(self.flavor).GetPrecompiledHeader(
-            **{
-                'settings':
-                    GetToolchainOrNone(self.flavor).GetCompilerSettings(),
-                'config':
-                    config_name,
-                'gyp_path_to_ninja':
-                    self.GypPathToNinja,
-                'gyp_path_to_unique_output':
-                    self.GypPathToUniqueOutput,
-                'obj_ext':
-                    self.obj_ext
-            })
-      else:
-        pch = gyp.xcode_emulation.MacPrefixHeader(
-            self.xcode_settings, self.GypPathToNinja,
-            lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang))
-      link_deps = self.WriteSources(config_name, config, sources,
-                                    compile_depends_stamp, pch, spec)
-      # Some actions/rules output 'sources' that are already object files.
-      link_deps += [
-          self.GypPathToNinja(f) for f in sources if f.endswith(self.obj_ext)
-      ]
-
-    if (self.flavor in microsoft_flavors and
-        self.target.type == 'static_library'):
-      self.target.component_objs = link_deps
-
-    # Write out a link step, if needed.
-    output = None
-    if link_deps or self.target.actions_stamp or actions_depends:
-      output = self.WriteTarget(spec, config_name, config, link_deps,
-                                self.target.actions_stamp or actions_depends)
-      if self.is_mac_bundle:
-        mac_bundle_depends.append(output)
-
-    # Bundle all of the above together, if needed.
-    if self.is_mac_bundle:
-      output = self.WriteMacBundle(spec, mac_bundle_depends)
-
-    if not output:
-      return None
-
-    assert self.target.FinalOutput(), output
-    return self.target
-
-  def _WinIdlRule(self, source, prebuild, outputs):
-    """Handle the implicit VS .idl rule for one source file.
-
-    Fills |outputs|
-    with files that are generated.
-    """
-    outdir, output, vars, flags = GetToolchainOrNone(
-        self.flavor).GetCompilerSettings().GetIdlBuildData(
-            source, self.config_name)
-    outdir = self.GypPathToNinja(outdir)
-
-    def fix_path(path, rel=None):
-      path = os.path.join(outdir, path)
-      dirname, basename = os.path.split(source)
-      root, ext = os.path.splitext(basename)
-      path = self.ExpandRuleVariables(path, root, dirname, source, ext,
-                                      basename)
-      if rel:
-        path = os.path.relpath(path, rel)
-      return path
-
-    vars = [(name, fix_path(value, outdir)) for name, value in vars]
-    output = [fix_path(p) for p in output]
-    vars.append(('outdir', outdir))
-    vars.append(('idlflags', flags))
-    input = self.GypPathToNinja(source)
-    self.ninja.build(output, 'idl', input, variables=vars, order_only=prebuild)
-    outputs.extend(output)
-
-  def WriteWinIdlFiles(self, spec, prebuild):
-    """Writes rules to match MSVS's implicit idl handling."""
-    assert GetToolchainOrNone(self.flavor)
-    if GetToolchainOrNone(
-        self.flavor).GetCompilerSettings().HasExplicitIdlRules(spec):
-      return []
-    outputs = []
-    for source in filter(lambda x: x.endswith('.idl'), spec['sources']):
-      self._WinIdlRule(source, prebuild, outputs)
-    return outputs
-
-  def WriteActionsRulesCopies(self, spec, extra_sources, prebuild,
-                              mac_bundle_depends):
-    """Write out the Actions, Rules, and Copies steps.
-
-    Return a path
-    representing the outputs of these steps.
-    """
-    outputs = []
-    extra_mac_bundle_resources = []
-
-    if 'actions' in spec:
-      outputs += self.WriteActions(spec['actions'], extra_sources, prebuild,
-                                   extra_mac_bundle_resources)
-    if 'rules' in spec:
-      outputs += self.WriteRules(spec['rules'], extra_sources, prebuild,
-                                 extra_mac_bundle_resources)
-    if 'copies' in spec:
-      outputs += self.WriteCopies(spec['copies'], prebuild, mac_bundle_depends)
-
-    stamp = self.WriteCollapsedDependencies('actions_rules_copies', outputs)
-
-    if self.is_mac_bundle:
-      mac_bundle_resources = spec.get('mac_bundle_resources', []) + \
-                             extra_mac_bundle_resources
-      self.WriteMacBundleResources(mac_bundle_resources, mac_bundle_depends)
-      self.WriteMacInfoPlist(mac_bundle_depends)
-
-    return stamp
-
-  def GenerateDescription(self, verb, message, fallback):
-    """Generate and return a description of a build step.
-
-    |verb| is the short summary, e.g. ACTION or RULE.
-    |message| is a hand-written description, or None if not available.
-    |fallback| is the gyp-level name of the step, usable as a fallback.
-    """
-    if self.toolset != 'target':
-      verb += '(%s)' % self.toolset
-    if message:
-      return '%s %s' % (verb, self.ExpandSpecial(message))
-    else:
-      return '%s %s: %s' % (verb, self.name, fallback)
-
-  def IsCygwinRule(self, action):
-    if self.flavor in sony_flavors or self.flavor in nintendo_flavors:
-      value = str(action.get('msvs_cygwin_shell', 0)) != '0'
-      if value:
-        raise Exception('Cygwin usage is no longer allowed in Cobalt Gyp')
-    return False
-
-  def WriteActions(self, actions, extra_sources, prebuild,
-                   extra_mac_bundle_resources):
-    # Actions cd into the base directory.
-    env = self.GetSortedXcodeEnv()
-    if self.flavor == 'win':
-      env = GetToolchainOrNone(self.flavor).GetCompilerSettings().GetVSMacroEnv(
-          '$!PRODUCT_DIR', config=self.config_name)
-    all_outputs = []
-    for action in actions:
-      # First write out a rule for the action.
-      name = '%s_%s' % (action['action_name'], hashlib.md5(
-          self.qualified_target).hexdigest())
-      description = self.GenerateDescription('ACTION',
-                                             action.get('message', None), name)
-      is_cygwin = self.IsCygwinRule(action)
-      args = action['action']
-      rule_name, _ = self.WriteNewNinjaRule(
-          name, args, description, is_cygwin, env=env)
-
-      inputs = [self.GypPathToNinja(i, env) for i in action['inputs']]
-      if int(action.get('process_outputs_as_sources', False)):
-        extra_sources += action['outputs']
-      if int(action.get('process_outputs_as_mac_bundle_resources', False)):
-        extra_mac_bundle_resources += action['outputs']
-      outputs = [self.GypPathToNinja(o, env) for o in action['outputs']]
-
-      # Then write out an edge using the rule.
-      self.ninja.build(outputs, rule_name, inputs, order_only=prebuild)
-      all_outputs += outputs
-
-      self.ninja.newline()
-
-    return all_outputs
-
-  def WriteRules(self, rules, extra_sources, prebuild,
-                 extra_mac_bundle_resources):
-    env = self.GetSortedXcodeEnv()
-    all_outputs = []
-    for rule in rules:
-      # First write out a rule for the rule action.
-      name = '%s_%s' % (rule['rule_name'], hashlib.md5(
-          self.qualified_target).hexdigest())
-      # Skip a rule with no action and no inputs.
-      if 'action' not in rule and not rule.get('rule_sources', []):
-        continue
-      args = rule['action']
-      description = self.GenerateDescription(
-          'RULE', rule.get('message', None),
-          ('%s ' + generator_default_variables['RULE_INPUT_PATH']) % name)
-      is_cygwin = self.IsCygwinRule(rule)
-      rule_name, args = self.WriteNewNinjaRule(
-          name, args, description, is_cygwin, env=env)
-
-      # TODO: if the command references the outputs directly, we should
-      # simplify it to just use $out.
-
-      # Rules can potentially make use of some special variables which
-      # must vary per source file.
-      # Compute the list of variables we'll need to provide.
-      special_locals = ('source', 'root', 'dirname', 'ext', 'name')
-      needed_variables = set(['source'])
-      for argument in args:
-        for var in special_locals:
-          if ('${%s}' % var) in argument:
-            needed_variables.add(var)
-
-      def cygwin_munge(path):
-        if is_cygwin:
-          return path.replace('\\', '/')
-        return path
-
-      # For each source file, write an edge that generates all the outputs.
-      for source in rule.get('rule_sources', []):
-        dirname, basename = os.path.split(source)
-        root, ext = os.path.splitext(basename)
-
-        # Gather the list of inputs and outputs, expanding $vars if possible.
-        outputs = [
-            self.ExpandRuleVariables(o, root, dirname, source, ext, basename)
-            for o in rule['outputs']
-        ]
-        inputs = [
-            self.ExpandRuleVariables(i, root, dirname, source, ext, basename)
-            for i in rule.get('inputs', [])
-        ]
-
-        if int(rule.get('process_outputs_as_sources', False)):
-          extra_sources += outputs
-        if int(rule.get('process_outputs_as_mac_bundle_resources', False)):
-          extra_mac_bundle_resources += outputs
-
-        extra_bindings = []
-        for var in needed_variables:
-          if var == 'root':
-            extra_bindings.append(('root', cygwin_munge(root)))
-          elif var == 'dirname':
-            extra_bindings.append(('dirname', cygwin_munge(dirname)))
-          elif var == 'source':
-            # '$source' is a parameter to the rule action, which means
-            # it shouldn't be converted to a Ninja path.  But we don't
-            # want $!PRODUCT_DIR in there either.
-            source_expanded = self.ExpandSpecial(source, self.base_to_build)
-            extra_bindings.append(('source', cygwin_munge(source_expanded)))
-          elif var == 'ext':
-            extra_bindings.append(('ext', ext))
-          elif var == 'name':
-            extra_bindings.append(('name', cygwin_munge(basename)))
-          else:
-            assert var == None, repr(var)
-
-        inputs = [self.GypPathToNinja(i, env) for i in inputs]
-        outputs = [self.GypPathToNinja(o, env) for o in outputs]
-        extra_bindings.append(
-            ('unique_name', hashlib.md5(outputs[0]).hexdigest()))
-        self.ninja.build(
-            outputs,
-            rule_name,
-            self.GypPathToNinja(source),
-            implicit=inputs,
-            order_only=prebuild,
-            variables=extra_bindings)
-
-        all_outputs.extend(outputs)
-
-    return all_outputs
-
-  def WriteCopy(self, src, dst, prebuild, env, mac_bundle_depends):
-    assert FindFirstInstanceOf(abstract.Copy, GetHostToolchain(
-        self.flavor)), 'Host toolchain must provide copy tool.'
-
-    dst = self.GypPathToNinja(dst, env)
-    # Renormalize with the separator character of the os on which ninja will run
-    dst = self.path_module.normpath(dst)
-
-    self.ninja.build(dst, 'copy', src, order_only=prebuild)
-    if self.is_mac_bundle:
-      # gyp has mac_bundle_resources to copy things into a bundle's
-      # Resources folder, but there's no built-in way to copy files to other
-      # places in the bundle. Hence, some targets use copies for this. Check
-      # if this file is copied into the current bundle, and if so add it to
-      # the bundle depends so that dependent targets get rebuilt if the copy
-      # input changes.
-      if dst.startswith(self.xcode_settings.GetBundleContentsFolderPath()):
-        mac_bundle_depends.append(dst)
-    return [dst]
-
-  def WriteCopies(self, copies, prebuild, mac_bundle_depends):
-    outputs = []
-    env = self.GetSortedXcodeEnv()
-    for copy in copies:
-      for path in copy['files']:
-        # Normalize the path so trailing slashes don't confuse us.
-        path = os.path.normpath(path)
-        destination = copy['destination']
-        basename = os.path.split(path)[1]
-
-        # call GypPathToNinja() to resolve any special GYP $ tokens in src.
-        # And figure out where this directory actually is on disk.
-        ninja_path = self.GypPathToNinja(path)
-        joined_path = os.path.join(self.abs_build_dir, ninja_path)
-        joined_path = os.path.normpath(joined_path)
-
-        # If src is a directory, expand it recursively,
-        # so we have a build rule for every file.
-        if os.path.isdir(joined_path):
-          for root, dirs, files in os.walk(joined_path):
-            rel_root = os.path.relpath(root, self.abs_build_dir)
-
-            for f in files:
-              src = self.GypPathToNinja(os.path.join(rel_root, f), env)
-              common_prefix = os.path.commonprefix([joined_path, root])
-              subdir = root[len(common_prefix) + 1:]
-
-              dst = os.path.join(destination, basename, subdir, f)
-              outputs += self.WriteCopy(src, dst, prebuild, env,
-                                        mac_bundle_depends)
-        else:
-          src = self.GypPathToNinja(path, env)
-          dst = os.path.join(destination, basename)
-          outputs += self.WriteCopy(src, dst, prebuild, env, mac_bundle_depends)
-
-    return outputs
-
-  def WriteMacBundleResources(self, resources, bundle_depends):
-    """Writes ninja edges for 'mac_bundle_resources'."""
-    for output, res in gyp.xcode_emulation.GetMacBundleResources(
-        self.ExpandSpecial(generator_default_variables['PRODUCT_DIR']),
-        self.xcode_settings, map(self.GypPathToNinja, resources)):
-      self.ninja.build(
-          output,
-          'mac_tool',
-          res,
-          variables=[('mactool_cmd', 'copy-bundle-resource')])
-      bundle_depends.append(output)
-
-  def WriteMacInfoPlist(self, bundle_depends):
-    """Write build rules for bundle Info.plist files."""
-    info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist(
-        self.ExpandSpecial(generator_default_variables['PRODUCT_DIR']),
-        self.xcode_settings, self.GypPathToNinja)
-    if not info_plist:
-      return
-    if defines:
-      # Create an intermediate file to store preprocessed results.
-      intermediate_plist = self.GypPathToUniqueOutput(
-          os.path.basename(info_plist))
-      defines = ' '.join([Define(d, self.flavor) for d in defines])
-      info_plist = self.ninja.build(
-          intermediate_plist,
-          'infoplist',
-          info_plist,
-          variables=[('defines', defines)])
-
-    env = self.GetSortedXcodeEnv(additional_settings=extra_env)
-    env = self.ComputeExportEnvString(env)
-
-    self.ninja.build(
-        out,
-        'mac_tool',
-        info_plist,
-        variables=[('mactool_cmd', 'copy-info-plist'), ('env', env)])
-    bundle_depends.append(out)
-
-  def WriteSources(self, config_name, config, sources, predepends,
-                   precompiled_header, spec):
-    """Write build rules to compile all of |sources|."""
-    shell = GetShell(self.flavor)
-
-    if self.toolset == 'target':
-      toolchain = GetTargetToolchain(
-          self.flavor, spec=spec, config_name=config_name)
-    else:
-      toolchain = GetHostToolchain(
-          self.flavor, spec=spec, config_name=config_name)
-
-    defines = config.get('defines', [])
-    include_dirs = [
-        self.GypPathToNinja(include_dir)
-        for include_dir in config.get('include_dirs', [])
-    ]
-
-    # TODO: This code emulates legacy toolchain behavior. We need to migrate
-    #       to single-responsibility, toolchain-independent GYP keywords as
-    #       per abstract toolchain design doc.
-    cflags = GetConfigFlags(config, self.toolset, 'cflags')
-    cflags_c = GetConfigFlags(config, self.toolset, 'cflags_c')
-    cflags_cc = GetConfigFlags(config, self.toolset, 'cflags_cc')
-    cflags_mm = GetConfigFlags(config, self.toolset, 'cflags_mm')
-    obj = 'obj'
-    if self.toolset != 'target':
-      obj += '.' + self.toolset
-    pdbpath = os.path.normpath(
-        os.path.join(obj, self.base_dir, self.name + '.pdb'))
-    self.WriteVariableList('pdbname', [pdbpath])
-
-    c_compiler = FindFirstInstanceOf(abstract.CCompiler, toolchain)
-    if c_compiler:
-      c_compiler_flags = c_compiler.GetFlags(defines, include_dirs,
-                                             cflags + cflags_c)
-      self.ninja.variable(
-          '{0}_flags'.format(GetNinjaRuleName(c_compiler, self.toolset)),
-          shell.Join(c_compiler_flags))
-
-    cxx_compiler = FindFirstInstanceOf(abstract.CxxCompiler, toolchain)
-    if cxx_compiler:
-      cxx_compiler_flags = cxx_compiler.GetFlags(defines, include_dirs,
-                                                 cflags + cflags_cc)
-      self.ninja.variable(
-          '{0}_flags'.format(GetNinjaRuleName(cxx_compiler, self.toolset)),
-          shell.Join(cxx_compiler_flags))
-
-    objcxx_compiler = FindFirstInstanceOf(abstract.ObjectiveCxxCompiler,
-                                          toolchain)
-    if objcxx_compiler:
-      objcxx_compiler_flags = objcxx_compiler.GetFlags(
-          defines, include_dirs, cflags + cflags_cc + cflags_mm)
-      self.ninja.variable(
-          '{0}_flags'.format(GetNinjaRuleName(objcxx_compiler, self.toolset)),
-          shell.Join(objcxx_compiler_flags))
-
-    assembler = FindFirstInstanceOf(abstract.AssemblerWithCPreprocessor,
-                                    toolchain)
-    if assembler:
-      assembler_flags = assembler.GetFlags(defines, include_dirs,
-                                           cflags + cflags_c)
-      self.ninja.variable(
-          '{0}_flags'.format(GetNinjaRuleName(assembler, self.toolset)),
-          shell.Join(assembler_flags))
-
-    self.ninja.newline()
-
-    outputs = []
-    for source in sources:
-      _, extension = os.path.splitext(source)
-      if extension in ['.c']:
-        assert c_compiler, ('Toolchain must provide C compiler in order to '
-                            'build {0} for {1} platform.').format(
-                                source, self.toolset)
-        rule_name = GetNinjaRuleName(c_compiler, self.toolset)
-      elif extension in ['.cc', '.cpp', '.cxx']:
-        assert cxx_compiler, ('Toolchain must provide C++ compiler in order '
-                              'to build {0} for {1} platform.').format(
-                                  source, self.toolset)
-        rule_name = GetNinjaRuleName(cxx_compiler, self.toolset)
-      elif extension in ['.mm']:
-        assert objcxx_compiler, ('Toolchain must provide Objective-C++ '
-                                 'compiler in order to build {0} for {1} '
-                                 'platform.').format(source, self.toolset)
-        rule_name = GetNinjaRuleName(objcxx_compiler, self.toolset)
-      elif extension in ['.S', '.s']:
-        assert assembler, ('Toolchain must provide assembler in order to '
-                           'build {0} for {1} platform.').format(
-                               source, self.toolset)
-        rule_name = GetNinjaRuleName(assembler, self.toolset)
-      else:
-        rule_name = None
-
-      if rule_name:
-        input = self.GypPathToNinja(source)
-        output = '{0}.o'.format(self.GypPathToUniqueOutput(source))
-        self.ninja.build(
-            output,
-            rule_name,
-            input,
-            implicit=None,  # TODO: Implemenet precompiled headers.
-            order_only=predepends)
-        outputs.append(output)
-
-    self.ninja.newline()
-    return outputs
-
-  def WriteLink(self, spec, config_name, config, link_deps):
-    """Write out a link step. Fills out target.binary. """
-    if self.toolset == 'target':
-      toolchain = GetTargetToolchain(
-          self.flavor,
-          spec=spec,
-          config_name=config_name,
-          gyp_path_to_ninja=self.GypPathToNinja,
-          expand_special=self.ExpandSpecial,
-          gyp_path_to_unique_output=self.GypPathToUniqueOutput,
-          compute_output_file_name=self.ComputeOutputFileName)
-    else:
-      toolchain = GetHostToolchain(
-          self.flavor,
-          spec=spec,
-          config_name=config_name,
-          gyp_path_to_ninja=self.GypPathToNinja,
-          expand_special=self.ExpandSpecial,
-          gyp_path_to_unique_output=self.GypPathToUniqueOutput,
-          compute_output_file_name=self.ComputeOutputFileName)
-
-    shell = GetShell(self.flavor)
-    extra_bindings = []
-    target_type = spec['type']
-    if target_type == 'executable':
-      executable_linker = FindFirstInstanceOf(abstract.ExecutableLinker,
-                                              toolchain)
-      assert executable_linker, ('Toolchain must provide executable linker '
-                                 'for {0} platform.').format(self.toolset)
-
-      rule_name = GetNinjaRuleName(executable_linker, self.toolset)
-
-      # TODO: This code emulates legacy toolchain behavior. We need to migrate
-      #       to single-responsibility, toolchain-independent GYP keywords as
-      #       per abstract toolchain design doc.
-      libraries_keyword = 'libraries{0}'.format('_host' if self.toolset ==
-                                                'host' else '')
-      libraries = spec.get(libraries_keyword, []) + config.get(
-          libraries_keyword, [])
-
-      ldflags_executable = GetConfigFlags(config, self.toolset,
-                                          'ldflags_executable')
-      if not ldflags_executable:
-        ldflags_executable = GetConfigFlags(config, self.toolset, 'ldflags')
-
-      ldflags = gyp.common.uniquer(
-          map(self.ExpandSpecial, ldflags_executable + libraries))
-
-      executable_linker_flags = executable_linker.GetFlags(ldflags)
-      self.ninja.variable('{0}_flags'.format(rule_name),
-                          shell.Join(executable_linker_flags))
-    elif target_type == 'shared_library':
-      shared_library_linker = FindFirstInstanceOf(abstract.SharedLibraryLinker,
-                                                  toolchain)
-      assert shared_library_linker, (
-          'Toolchain must provide shared library linker '
-          'for {0} platform.').format(self.toolset)
-
-      rule_name = GetNinjaRuleName(shared_library_linker, self.toolset)
-
-      # TODO: This code emulates legacy toolchain behavior. We need to migrate
-      #       to single-responsibility, toolchain-independent GYP keywords as
-      #       per abstract toolchain design doc.
-      libraries_keyword = 'libraries{0}'.format('_host' if self.toolset ==
-                                                'host' else '')
-      libraries = spec.get(libraries_keyword, []) + config.get(
-          libraries_keyword, [])
-
-      ldflags_shared = GetConfigFlags(config, self.toolset, 'ldflags_shared')
-      if not ldflags_shared:
-        ldflags_shared = GetConfigFlags(config, self.toolset, 'ldflags')
-
-      ldflags = gyp.common.uniquer(
-          map(self.ExpandSpecial, ldflags_shared + libraries))
-
-      shared_library_linker_flags = shared_library_linker.GetFlags(ldflags)
-      self.ninja.variable('{0}_flags'.format(rule_name),
-                          shell.Join(shared_library_linker_flags))
-      output = self.ComputeOutput(spec)
-      extra_bindings.append(('soname', os.path.split(output)[1]))
-      extra_bindings.append(('dll', output))
-      if '/NOENTRY' not in shared_library_linker_flags:
-        extra_bindings.append(('implibflag', '/IMPLIB:%s' % output + '.lib'))
-
-    else:
-      raise Exception('Target type {0} is not supported for target {1}.'.format(
-          target_type, spec['target_name']))
-
-    order_only_deps = set()
-
-    if 'dependencies' in spec:
-      # Two kinds of dependencies:
-      # - Linkable dependencies (like a .a or a .so): add them to the link
-      #   line.
-      # - Non-linkable dependencies (like a rule that generates a file
-      #   and writes a stamp file): add them to implicit_deps or
-      #   order_only_deps
-      extra_link_deps = []
-      for dep in spec['dependencies']:
-        target = self.target_outputs.get(dep)
-        if not target:
-          continue
-        linkable = target.Linkable()
-        if linkable:
-          extra_link_deps.append(target.binary)
-
-        final_output = target.FinalOutput()
-        if not linkable or final_output != target.binary:
-          order_only_deps.add(final_output)
-
-      # dedup the extra link deps while preserving order
-      seen = set()
-      extra_link_deps = [
-          x for x in extra_link_deps if x not in seen and not seen.add(x)
-      ]
-
-      link_deps.extend(extra_link_deps)
-
-    tail_deps = GetConfigFlags(config, self.toolset, 'TailDependencies')
-    if tail_deps:
-      link_deps.extend(map(self.ExpandSpecial, tail_deps))
-
-    output = self.ComputeOutput(spec)
-    self.target.binary = output
-
-    self.ninja.build(
-        output,
-        rule_name,
-        link_deps,
-        order_only=list(order_only_deps),
-        variables=extra_bindings)
-
-  def WriteTarget(self, spec, config_name, config, link_deps, compile_deps):
-    if spec['type'] == 'none':
-      # TODO(evan): don't call this function for 'none' target types, as
-      # it doesn't do anything, and we fake out a 'binary' with a stamp file.
-      self.target.binary = compile_deps
-    elif spec['type'] == 'static_library':
-      self.target.binary = self.ComputeOutput(spec)
-      variables = []
-
-      if self.toolset == 'target':
-        toolchain = GetTargetToolchain(
-            self.flavor,
-            spec=spec,
-            config_name=config_name,
-            gyp_path_to_ninja=self.GypPathToNinja)
-      else:
-        toolchain = GetHostToolchain(
-            self.flavor,
-            spec=spec,
-            config_name=config_name,
-            gyp_path_to_ninja=self.GypPathToNinja)
-
-      shell = GetShell(self.flavor)
-      static_linker = FindFirstInstanceOf(abstract.StaticLinker, toolchain)
-      if not self.is_standalone_static_library:
-        static_thin_linker = FindFirstInstanceOf(abstract.StaticThinLinker,
-                                                 toolchain)
-        if static_thin_linker:
-          static_linker = static_thin_linker
-      assert static_linker, ('Toolchain must provide static linker in order '
-                             'to build {0} for {1} platform.').format(
-                                 self.target.binary, self.toolset)
-
-      rule_name = GetNinjaRuleName(static_linker, self.toolset)
-
-      static_linker_flags = static_linker.GetFlags()
-      self.ninja.variable('{0}_flags'.format(rule_name),
-                          shell.Join(static_linker_flags))
-
-      self.ninja.build(
-          self.target.binary,
-          rule_name,
-          link_deps,
-          order_only=compile_deps,
-          variables=variables)
-    else:
-      self.WriteLink(spec, config_name, config, link_deps)
-    return self.target.binary
-
-  def WriteMacBundle(self, spec, mac_bundle_depends):
-    assert self.is_mac_bundle
-    package_framework = spec['type'] in ('shared_library', 'loadable_module')
-    output = self.ComputeMacBundleOutput()
-    postbuild = self.GetPostbuildCommand(
-        spec,
-        output,
-        self.target.binary,
-        is_command_start=not package_framework)
-    variables = []
-    if postbuild:
-      variables.append(('postbuilds', postbuild))
-    if package_framework:
-      variables.append(('version', self.xcode_settings.GetFrameworkVersion()))
-      self.ninja.build(
-          output, 'package_framework', mac_bundle_depends, variables=variables)
-    else:
-      self.ninja.build(output, 'stamp', mac_bundle_depends, variables=variables)
-    self.target.bundle = output
-    return output
-
-  def GetSortedXcodeEnv(self, additional_settings=None):
-    """Returns the variables Xcode would set for build steps."""
-    assert self.abs_build_dir
-    abs_build_dir = self.abs_build_dir
-    return gyp.xcode_emulation.GetSortedXcodeEnv(
-        self.xcode_settings, abs_build_dir,
-        os.path.join(abs_build_dir, self.build_to_base), self.config_name,
-        additional_settings)
-
-  def GetSortedXcodePostbuildEnv(self):
-    """Returns the variables Xcode would set for postbuild steps."""
-    postbuild_settings = {}
-    # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack.
-    # TODO(thakis): It would be nice to have some general mechanism instead.
-    strip_save_file = self.xcode_settings.GetPerTargetSetting(
-        'CHROMIUM_STRIP_SAVE_FILE')
-    if strip_save_file:
-      postbuild_settings['CHROMIUM_STRIP_SAVE_FILE'] = strip_save_file
-    return self.GetSortedXcodeEnv(additional_settings=postbuild_settings)
-
-  def GetPostbuildCommand(self,
-                          spec,
-                          output,
-                          output_binary,
-                          is_command_start=False):
-    """Returns a shell command that runs all the postbuilds, and removes
-
-    |output| if any of them fails. If |is_command_start| is False, then the
-    returned string will start with ' && '.
-    """
-    if not self.xcode_settings or spec['type'] == 'none' or not output:
-      return ''
-    output = QuoteShellArgument(output, self.flavor)
-    target_postbuilds = self.xcode_settings.GetTargetPostbuilds(
-        self.config_name,
-        os.path.normpath(os.path.join(self.base_to_build, output)),
-        QuoteShellArgument(
-            os.path.normpath(os.path.join(self.base_to_build, output_binary)),
-            self.flavor),
-        quiet=True)
-    postbuilds = gyp.xcode_emulation.GetSpecPostbuildCommands(spec, quiet=True)
-    postbuilds = target_postbuilds + postbuilds
-    if not postbuilds:
-      return ''
-    # Postbuilds expect to be run in the gyp file's directory, so insert an
-    # implicit postbuild to cd to there.
-    postbuilds.insert(
-        0, gyp.common.EncodePOSIXShellList(['cd', self.build_to_base]))
-    env = self.ComputeExportEnvString(self.GetSortedXcodePostbuildEnv())
-    # G will be non-null if any postbuild fails. Run all postbuilds in a
-    # subshell.
-    commands = env + ' (F=0; ' + \
-        ' '.join([ninja_syntax.escape(command) + ' || F=$$?;'
-                                 for command in postbuilds])
-    command_string = (
-        commands + ' exit $$F); G=$$?; '
-        # Remove the final output if any postbuild failed.
-        '((exit $$G) || rm -rf %s) ' % output + '&& exit $$G)')
-    if is_command_start:
-      return '(' + command_string + ' && '
-    else:
-      return '$ && (' + command_string
-
-  def ComputeExportEnvString(self, env):
-    """Given an environment, returns a string looking like
-
-        'export FOO=foo; export BAR="${FOO} bar;'
-    that exports |env| to the shell.
-    """
-    export_str = []
-    for k, v in env:
-      export_str.append(
-          'export %s=%s;' %
-          (k, ninja_syntax.escape(gyp.common.EncodePOSIXShellArgument(v))))
-    return ' '.join(export_str)
-
-  def ComputeMacBundleOutput(self):
-    """Return the 'output' (full output path) to a bundle output directory."""
-    assert self.is_mac_bundle
-    path = self.ExpandSpecial(generator_default_variables['PRODUCT_DIR'])
-    return os.path.join(path, self.xcode_settings.GetWrapperName())
-
-  def ComputeOutputFileName(self, spec, type=None):
-    """Compute the filename of the final output for the current target."""
-    if not type:
-      type = spec['type']
-
-    default_variables = GetGeneratorVariables(self.flavor)
-
-    # Compute filename prefix: the product prefix, or a default for
-    # the product type.
-    DEFAULT_PREFIX = {
-        'loadable_module': default_variables['SHARED_LIB_PREFIX'],
-        'shared_library': default_variables['SHARED_LIB_PREFIX'],
-        'static_library': default_variables['STATIC_LIB_PREFIX'],
-        'executable': default_variables['EXECUTABLE_PREFIX'],
-    }
-    prefix = spec.get('product_prefix', DEFAULT_PREFIX.get(type, ''))
-
-    # Compute filename extension: the product extension, or a default
-    # for the product type.
-    DEFAULT_EXTENSION = {
-        'loadable_module': default_variables['SHARED_LIB_SUFFIX'],
-        'shared_library': default_variables['SHARED_LIB_SUFFIX'],
-        'static_library': default_variables['STATIC_LIB_SUFFIX'],
-        'executable': default_variables['EXECUTABLE_SUFFIX'],
-    }
-    extension = spec.get('product_extension')
-    if extension:
-      extension = '.' + extension
-    elif self.toolset == 'host':
-      # TODO: Based on a type of target, ask a corresponding
-      #       tool from a toolchain to compute the file name.
-      if is_windows:
-        extension = '.exe'
-      else:
-        extension = ''
-    else:
-      extension = DEFAULT_EXTENSION.get(type, '')
-
-    if 'product_name' in spec:
-      # If we were given an explicit name, use that.
-      target = spec['product_name']
-    else:
-      # Otherwise, derive a name from the target name.
-      target = spec['target_name']
-      if prefix == 'lib':
-        # Snip out an extra 'lib' from libs if appropriate.
-        target = StripPrefix(target, 'lib')
-
-    if type in ('static_library', 'loadable_module', 'shared_library',
-                'executable'):
-      return '%s%s%s' % (prefix, target, extension)
-    elif type == 'none':
-      return '%s.stamp' % target
-    else:
-      raise Exception('Unhandled output type %s' % type)
-
-  def ComputeOutput(self, spec, type=None):
-    """Compute the path for the final output of the spec."""
-    assert not self.is_mac_bundle or type
-
-    if not type:
-      type = spec['type']
-
-    if self.flavor == 'win':
-      override = GetToolchainOrNone(
-          self.flavor).GetCompilerSettings().GetOutputName(
-              self.config_name, self.ExpandSpecial)
-      if override:
-        return override
-
-    if self.flavor == 'mac' and type in ('static_library', 'executable',
-                                         'shared_library', 'loadable_module'):
-      filename = self.xcode_settings.GetExecutablePath()
-    else:
-      filename = self.ComputeOutputFileName(spec, type)
-
-    if 'product_dir' in spec:
-      path = os.path.join(spec['product_dir'], filename)
-      return self.ExpandSpecial(path)
-
-    # Some products go into the output root, libraries go into shared library
-    # dir, and everything else goes into the normal place.
-    type_in_output_root = ['executable', 'loadable_module']
-    if self.flavor == 'mac' and self.toolset == 'target':
-      type_in_output_root += ['shared_library', 'static_library']
-    elif self.flavor == 'win' and self.toolset == 'target':
-      type_in_output_root += ['shared_library']
-
-    if type in type_in_output_root or self.is_standalone_static_library:
-      return filename
-    elif type == 'shared_library':
-      libdir = 'lib'
-      if self.toolset != 'target':
-        libdir = os.path.join('lib', '%s' % self.toolset)
-      return os.path.join(libdir, filename)
-    else:
-      return self.GypPathToUniqueOutput(filename, qualified=False)
-
-  def WriteVariableList(self, var, values):
-    assert not isinstance(values, str)
-    if values is None:
-      values = []
-    self.ninja.variable(var, ' '.join(values))
-
-  def WriteNewNinjaRule(self, name, args, description, is_cygwin, env):
-    """Write out a new ninja "rule" statement for a given command.
-
-    Returns the name of the new rule, and a copy of |args| with variables
-    expanded.
-    """
-
-    if self.flavor == 'win':
-      args = [
-          GetToolchainOrNone(self.flavor).GetCompilerSettings().ConvertVSMacros(
-              arg, self.base_to_build, config=self.config_name) for arg in args
-      ]
-      description = GetToolchainOrNone(
-          self.flavor).GetCompilerSettings().ConvertVSMacros(
-              description, config=self.config_name)
-    elif self.flavor == 'mac':
-      # |env| is an empty list on non-mac.
-      args = [gyp.xcode_emulation.ExpandEnvVars(arg, env) for arg in args]
-      description = gyp.xcode_emulation.ExpandEnvVars(description, env)
-
-    # TODO: we shouldn't need to qualify names; we do it because
-    # currently the ninja rule namespace is global, but it really
-    # should be scoped to the subninja.
-    rule_name = self.name
-    if self.toolset == 'target':
-      rule_name += '.' + self.toolset
-    rule_name += '.' + name
-    rule_name = re.sub('[^a-zA-Z0-9_]', '_', rule_name)
-
-    # Remove variable references, but not if they refer to the magic rule
-    # variables.  This is not quite right, as it also protects these for
-    # actions, not just for rules where they are valid. Good enough.
-    protect = ['${root}', '${dirname}', '${source}', '${ext}', '${name}']
-    protect = '(?!' + '|'.join(map(re.escape, protect)) + ')'
-    description = re.sub(protect + r'\$', '_', description)
-
-    # gyp dictates that commands are run from the base directory.
-    # cd into the directory before running, and adjust paths in
-    # the arguments to point to the proper locations.
-    rspfile = None
-    rspfile_content = None
-    args = [self.ExpandSpecial(arg, self.base_to_build) for arg in args]
-    if (self.flavor in windows_host_flavors and is_windows):
-      rspfile = rule_name + '.$unique_name.rsp'
-      # The cygwin case handles this inside the bash sub-shell.
-      run_in = ' ' + self.build_to_base
-      if self.flavor in sony_flavors or self.flavor in nintendo_flavors:
-        rspfile_content = gyp.msvs_emulation.EncodeRspFileList(args)
-      else:
-        rspfile_content = GetToolchainOrNone(
-            self.flavor).EncodeRspFileList(args)
-
-      command = ('%s gyp-win-tool action-wrapper $arch ' % sys.executable +
-                 rspfile + run_in)
-    else:
-      env = self.ComputeExportEnvString(env)
-      command = gyp.common.EncodePOSIXShellList(args)
-      command = 'cd %s; ' % self.build_to_base + env + command
-
-    # GYP rules/actions express being no-ops by not touching their outputs.
-    # Avoid executing downstream dependencies in this case by specifying
-    # restat=1 to ninja.
-    self.ninja.rule(
-        rule_name,
-        command,
-        description,
-        restat=True,
-        rspfile=rspfile,
-        rspfile_content=rspfile_content)
-    self.ninja.newline()
-
-    return rule_name, args
-
-
-def CalculateVariables(default_variables, params):
-  """Calculate additional variables for use in the build (called by gyp)."""
-  global generator_additional_non_configuration_keys
-  global generator_additional_path_sections
-  flavor = gyp.common.GetFlavor(params)
-  if flavor == 'mac':
-    default_variables.setdefault('OS', 'mac')
-    default_variables.setdefault('SHARED_LIB_SUFFIX', '.dylib')
-    default_variables.setdefault('SHARED_LIB_DIR',
-                                 generator_default_variables['PRODUCT_DIR'])
-    default_variables.setdefault('LIB_DIR',
-                                 generator_default_variables['PRODUCT_DIR'])
-
-    # Copy additional generator configuration data from Xcode, which is shared
-    # by the Mac Ninja generator.
-    import gyp.generator.xcode as xcode_generator
-    generator_additional_non_configuration_keys = getattr(
-        xcode_generator, 'generator_additional_non_configuration_keys', [])
-    generator_additional_path_sections = getattr(
-        xcode_generator, 'generator_additional_path_sections', [])
-    global generator_extra_sources_for_rules
-    generator_extra_sources_for_rules = getattr(
-        xcode_generator, 'generator_extra_sources_for_rules', [])
-  elif flavor in sony_flavors or flavor in nintendo_flavors:
-    if flavor in sony_flavors:
-      default_variables['EXECUTABLE_SUFFIX'] = '.elf'
-    else:
-      default_variables['EXECUTABLE_SUFFIX'] = '.exe'
-    default_variables['SHARED_LIB_PREFIX'] = 'lib'
-    default_variables['SHARED_LIB_SUFFIX'] = '.so'
-    # Copy additional generator configuration data from VS, which is shared
-    # by the Windows Ninja generator.
-    import gyp.generator.msvs as msvs_generator
-    generator_additional_non_configuration_keys = getattr(
-        msvs_generator, 'generator_additional_non_configuration_keys', [])
-    generator_additional_path_sections = getattr(
-        msvs_generator, 'generator_additional_path_sections', [])
-  else:
-    operating_system = flavor
-    if flavor == 'android':
-      operating_system = 'linux'  # Keep this legacy behavior for now.
-    default_variables.setdefault('OS', operating_system)
-    default_variables.setdefault('SHARED_LIB_SUFFIX', '.so')
-    default_variables.setdefault('SHARED_LIB_DIR',
-                                 os.path.join('$!PRODUCT_DIR', 'lib'))
-    default_variables.setdefault('LIB_DIR',
-                                 os.path.join('$!PRODUCT_DIR', 'obj'))
-
-
-def ComputeOutputDir(params):
-  """Returns the path from the toplevel_dir to the build output directory."""
-  # generator_dir: relative path from pwd to where make puts build files.
-  # Makes migrating from make to ninja easier, ninja doesn't put anything here.
-  generator_dir = os.path.relpath(params['options'].generator_output or '.')
-
-  # output_dir: relative path from generator_dir to the build directory.
-  output_dir = params.get('generator_flags', {}).get('output_dir', 'out')
-
-  # Relative path from source root to our output files.  e.g. "out"
-  return os.path.normpath(os.path.join(generator_dir, output_dir))
-
-
-def CalculateGeneratorInputInfo(params):
-  """Called by __init__ to initialize generator values based on params."""
-  user_config = params.get('generator_flags', {}).get('config', None)
-  toplevel = params['options'].toplevel_dir
-  qualified_out_dir = os.path.normpath(
-      os.path.join(toplevel, ComputeOutputDir(params), user_config, 'gypfiles'))
-
-  global generator_filelist_paths
-  generator_filelist_paths = {
-      'toplevel': toplevel,
-      'qualified_out_dir': qualified_out_dir,
-  }
-
-
-def OpenOutput(path, mode='w'):
-  """Open |path| for writing, creating directories if necessary."""
-  try:
-    os.makedirs(os.path.dirname(path))
-  except OSError:
-    pass
-  return open(path, mode)
-
-
-def MaybeWritePathVariable(ninja, tool, toolset):
-  if tool.GetPath():
-    ninja.variable('{0}_path'.format(GetNinjaRuleName(tool, toolset)),
-                   tool.GetPath())
-
-
-def MaybeWriteExtraFlagsVariable(ninja, tool, toolset, shell):
-  if tool.GetExtraFlags():
-    ninja.variable('{0}_extra_flags'.format(GetNinjaRuleName(tool, toolset)),
-                   shell.Join(tool.GetExtraFlags()))
-
-
-def MaybeWritePool(ninja, tool, toolset):
-  if tool.GetMaxConcurrentProcesses():
-    ninja.pool(
-        '{0}_pool'.format(GetNinjaRuleName(tool, toolset)),
-        depth=tool.GetMaxConcurrentProcesses())
-
-
-def MaybeWriteRule(ninja, tool, toolset, shell):
-  if tool.GetRuleName():
-    name = GetNinjaRuleName(tool, toolset)
-
-    path = '${0}_path'.format(name)
-    extra_flags = '${0}_extra_flags'.format(name)
-    flags = '${0}_flags'.format(name)
-    pool = '{0}_pool'.format(name) if tool.GetMaxConcurrentProcesses() else None
-
-    ninja.rule(
-        name,
-        tool.GetCommand(path, extra_flags, flags, shell),
-        description=tool.GetDescription(),
-        depfile=tool.GetHeaderDependenciesFilePath(),
-        deps=tool.GetHeaderDependenciesFormat(),
-        pool=pool,
-        rspfile=tool.GetRspFilePath(),
-        rspfile_content=tool.GetRspFileContent(),
-        restat=tool.GetRestat())
-
-
-def GenerateOutputForConfig(target_list, target_dicts, data, params,
-                            config_name):
-  options = params['options']
-  flavor = gyp.common.GetFlavor(params)
-
-  generator_flags = params.get('generator_flags', {})
-
-  # build_dir: relative path from source root to our output files.
-  # e.g. "out/Debug"
-  build_dir = os.path.normpath(
-      os.path.join(ComputeOutputDir(params), config_name))
-
-  toplevel_build = os.path.join(options.toplevel_dir, build_dir)
-
-  master_ninja = ninja_syntax.Writer(
-      OpenOutput(os.path.join(toplevel_build, 'build.ninja')), width=120)
-  case_sensitive_filesystem = True
-
-  build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
-  make_global_settings = data[build_file].get('make_global_settings', [])
-
-  # To avoid duplication, platform-agnostic tools (such as stamp and copy)
-  # will be processed only in the host toolchain.
-  target_toolchain = [
-      target_tool for target_tool in GetTargetToolchain(flavor)
-      if not target_tool.IsPlatformAgnostic()
-  ]
-  host_toolchain = GetHostToolchain(flavor)
-
-  shell = GetShell(flavor)
-
-  for target_tool in target_toolchain:
-    MaybeWritePathVariable(master_ninja, target_tool, 'target')
-  for host_tool in host_toolchain:
-    MaybeWritePathVariable(master_ninja, host_tool, 'host')
-  master_ninja.newline()
-
-  for target_tool in target_toolchain:
-    MaybeWriteExtraFlagsVariable(master_ninja, target_tool, 'target', shell)
-  for host_tool in host_toolchain:
-    MaybeWriteExtraFlagsVariable(master_ninja, host_tool, 'host', shell)
-  master_ninja.newline()
-
-  for target_tool in target_toolchain:
-    MaybeWritePool(master_ninja, target_tool, 'target')
-  for host_tool in host_toolchain:
-    MaybeWritePool(master_ninja, host_tool, 'host')
-  master_ninja.newline()
-
-  for target_tool in target_toolchain:
-    MaybeWriteRule(master_ninja, target_tool, 'target', shell)
-  for host_tool in host_toolchain:
-    MaybeWriteRule(master_ninja, host_tool, 'host', shell)
-  master_ninja.newline()
-
-  # Copy the gyp-win-tool to the toplevel_build.
-  # Also write python to the master_ninja.
-  if is_windows:
-    gyp.common.CopyTool(flavor, toplevel_build)
-    if GetToolchainOrNone(flavor):
-      GetToolchainOrNone(flavor).GenerateEnvironmentFiles(
-          toplevel_build, generator_flags, OpenOutput)
-    else:
-      gyp.msvs_emulation.GenerateEnvironmentFiles(toplevel_build,
-                                                  generator_flags, OpenOutput)
-
-  # Write python executables to the master ninja.
-  # Let 'python' resolve to what environment is active.
-  # Assume this file is executed using python2.
-  master_ninja.variable('python2', sys.executable)
-  master_ninja.newline()
-
-  # Don't write python3 exectuable until we ensure it's in docker containers.
-  #
-  # python3_executable = 'py -3' if is_windows else 'python3'
-  # cmd = ('{} -c "import os; import sys; '
-  #        'print(os.path.dirname(sys.executable))"').format(python3_executable)
-  # python3_location = subprocess.check_output(cmd, shell=True).strip()
-  # master_ninja.variable('python3', python3_location)
-  # master_ninja.newline()
-
-  all_targets = set()
-  for build_file in params['build_files']:
-    for target in gyp.common.AllTargets(target_list, target_dicts,
-                                        os.path.normpath(build_file)):
-      all_targets.add(target)
-  all_outputs = set()
-
-  # target_outputs is a map from qualified target name to a Target object.
-  target_outputs = {}
-  # target_short_names is a map from target short name to a list of Target
-  # objects.
-  target_short_names = {}
-  default_project = None
-  for qualified_target in target_list:
-    # qualified_target is like: third_party/icu/icu.gyp:icui18n#target
-    build_file, name, toolset = \
-        gyp.common.ParseQualifiedTarget(qualified_target)
-
-    this_make_global_settings = data[build_file].get('make_global_settings', [])
-    assert make_global_settings == this_make_global_settings, (
-        'make_global_settings needs to be the same for all targets.')
-
-    spec = target_dicts[qualified_target]
-
-    if spec.get('default_project', 0):
-      if default_project is None or default_project == name:
-        default_project = name
-      else:
-        raise Exception('More than one default_project specified.'
-                        'First in {0} and now in {1}'.format(
-                            default_project, name))
-
-    if flavor == 'mac':
-      gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec)
-
-    build_file = gyp.common.RelativePath(build_file, options.toplevel_dir)
-
-    base_path = os.path.dirname(build_file)
-    obj = 'obj'
-    if toolset != 'target':
-      obj += '.' + toolset
-    output_file = os.path.join(obj, base_path, name + '.ninja')
-
-    abs_build_dir = os.path.abspath(toplevel_build)
-    writer = NinjaWriter(
-        qualified_target,
-        target_outputs,
-        base_path,
-        build_dir,
-        OpenOutput(os.path.join(toplevel_build, output_file)),
-        flavor,
-        case_sensitive_filesystem,
-        abs_build_dir=abs_build_dir)
-    master_ninja.subninja(output_file)
-
-    target = writer.WriteSpec(spec, config_name, generator_flags)
-    if target:
-      if name != target.FinalOutput():
-        out_name = name
-        if toolset != 'target':
-          out_name = out_name + '.' + toolset
-        target_short_names.setdefault(out_name, []).append(target)
-      target_outputs[qualified_target] = target
-      if qualified_target in all_targets:
-        all_outputs.add(target.FinalOutput())
-
-  if target_short_names:
-    # Write a short name to build this target.  This benefits both the
-    # "build chrome" case as well as the gyp tests, which expect to be
-    # able to run actions and build libraries by their short name.
-    master_ninja.newline()
-    master_ninja.comment('Short names for targets.')
-    for short_name in target_short_names:
-      master_ninja.build(
-          short_name, 'phony',
-          [x.FinalOutput() for x in target_short_names[short_name]])
-
-  if all_outputs:
-    master_ninja.newline()
-    master_ninja.build('all', 'phony', list(all_outputs))
-    if default_project:
-      master_ninja.default(default_project)
-    else:
-      master_ninja.default('all')
-
-
-def PerformBuild(data, configurations, params):
-  options = params['options']
-  for config in configurations:
-    builddir = os.path.join(options.toplevel_dir, 'out', config)
-    arguments = ['ninja', '-C', builddir]
-    print('Building [%s]: %s' % (config, arguments))
-    subprocess.check_call(arguments)
-
-
-def CallGenerateOutputForConfig(arglist):
-  # Ignore the interrupt signal so that the parent process catches it and
-  # kills all multiprocessing children.
-  signal.signal(signal.SIGINT, signal.SIG_IGN)
-
-  (target_list, target_dicts, data, params, config_name) = arglist
-  GenerateOutputForConfig(target_list, target_dicts, data, params, config_name)
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  user_config = params.get('generator_flags', {}).get('config', None)
-  # TODO: Replace MSVSUtil with calls to abstract toolchain.
-  if gyp.common.GetFlavor(params) in microsoft_flavors:
-    target_list, target_dicts = MSVSUtil.ShardTargets(target_list, target_dicts)
-  if user_config:
-    GenerateOutputForConfig(target_list, target_dicts, data, params,
-                            user_config)
-  else:
-    config_names = target_dicts[target_list[0]]['configurations'].keys()
-    if params['parallel']:
-      try:
-        pool = multiprocessing.Pool(len(config_names))
-        arglists = []
-        for config_name in config_names:
-          arglists.append(
-              (target_list, target_dicts, data, params, config_name))
-          pool.map(CallGenerateOutputForConfig, arglists)
-      except KeyboardInterrupt as e:
-        pool.terminate()
-        raise e
-    else:
-      for config_name in config_names:
-        GenerateOutputForConfig(target_list, target_dicts, data, params,
-                                config_name)
diff --git a/tools/gyp/pylib/gyp/generator/ninja_test.py b/tools/gyp/pylib/gyp/generator/ninja_test.py
deleted file mode 100644
index 90dd153..0000000
--- a/tools/gyp/pylib/gyp/generator/ninja_test.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2012 Google Inc. 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 ninja.py file. """
-
-import gyp.generator.ninja as ninja
-import unittest
-import StringIO
-import sys
-import TestCommon
-
-
-class TestPrefixesAndSuffixes(unittest.TestCase):
-  if sys.platform in ('win32', 'cygwin'):
-    def test_BinaryNamesWindows(self):
-      writer = ninja.NinjaWriter('foo', 'wee', '.', '.', 'ninja.build', 'win')
-      spec = { 'target_name': 'wee' }
-      self.assertTrue(writer.ComputeOutputFileName(spec, 'executable').
-          endswith('.exe'))
-      self.assertTrue(writer.ComputeOutputFileName(spec, 'shared_library').
-          endswith('.dll'))
-      self.assertTrue(writer.ComputeOutputFileName(spec, 'static_library').
-          endswith('.lib'))
-
-  if sys.platform == 'linux2':
-    def test_BinaryNamesLinux(self):
-      writer = ninja.NinjaWriter('foo', 'wee', '.', '.', 'ninja.build', 'linux')
-      spec = { 'target_name': 'wee' }
-      self.assertTrue('.' not in writer.ComputeOutputFileName(spec,
-                                                              'executable'))
-      self.assertTrue(writer.ComputeOutputFileName(spec, 'shared_library').
-          startswith('lib'))
-      self.assertTrue(writer.ComputeOutputFileName(spec, 'static_library').
-          startswith('lib'))
-      self.assertTrue(writer.ComputeOutputFileName(spec, 'shared_library').
-          endswith('.so'))
-      self.assertTrue(writer.ComputeOutputFileName(spec, 'static_library').
-          endswith('.a'))
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/tools/gyp/pylib/gyp/generator/qtcreator_ninja.py b/tools/gyp/pylib/gyp/generator/qtcreator_ninja.py
deleted file mode 100644
index 24c0990..0000000
--- a/tools/gyp/pylib/gyp/generator/qtcreator_ninja.py
+++ /dev/null
@@ -1,364 +0,0 @@
-# Copyright 2015 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Gyp generator for QT Creator projects that invoke ninja."""
-
-import os
-import re
-
-PROJECT_DIR_RELATIVE_TO_OUTPUT_DIR = 'qtcreator_projects'
-
-
-def RebaseRelativePaths(file_set, original_base, new_base):
-  ret = set()
-  for item in file_set:
-    # TODO: For now, ignore special vars like $PRODUCT_DIR.
-    if '$' in item:
-      continue
-    ret.add(os.path.relpath(os.path.join(original_base, item), new_base))
-  return ret
-
-
-def SplitAssignmentDefine(line):
-  matched = re.match(r'([^=\b]+)=(.*)', line)
-  if matched:
-    return matched.group(1) + ' ' + matched.group(2)
-  else:
-    return line
-
-
-def GenProject(project_def, proj_dir):
-  """Generates QT Creator project (.creator) and supporting files.
-
-  Args:
-    project_def: Dictionary of parameters defining the project that will be
-                 generated.
-    proj_dir: The directory the generated project file will be placed into.
-  """
-
-  if not os.path.exists(proj_dir):
-    os.makedirs(proj_dir)
-
-  configuration = project_def['configuration']
-  current_config = configuration['out_dir']
-
-  if not os.path.exists(proj_dir):
-    os.makedirs(proj_dir)
-
-  basefilename = os.path.join(
-      proj_dir, current_config + '_' + project_def['session_name_prefix'])
-  with open(basefilename + '.creator', 'w') as f:
-    f.write('[General]')
-
-  with open(basefilename + '.config', 'w') as f:
-    for define in configuration['defines']:
-      f.write('#define %s\n' % SplitAssignmentDefine(define))
-
-  with open(basefilename + '.files', 'w') as f:
-    for source in project_def['sources']:
-      f.write('%s\n' % source)
-
-  with open(basefilename + '.includes', 'w') as f:
-    for include_path in configuration['include_paths']:
-      f.write('%s\n' % include_path)
-
-  # TODO: Use Jinja2 template engine to generate the project files.
-  with open(basefilename + '.creator.shared', 'w') as f:
-    f.write("""<!DOCTYPE QtCreatorProject>
-      <qtcreator>
-       <data>
-        <variable>ProjectExplorer.Project.EditorSettings</variable>
-        <valuemap type="QVariantMap">
-         <value type="bool" key="EditorConfiguration.AutoIndent">false</value>
-         <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">true</value>
-         <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
-         <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
-          <value type="QString" key="language">Cpp</value>
-         </valuemap>
-         <value type="int" key="EditorConfiguration.CodeStyle.Count">1</value>
-         <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
-         <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
-         <value type="int" key="EditorConfiguration.IndentSize">2</value>
-         <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
-         <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
-         <value type="int" key="EditorConfiguration.PaddingMode">1</value>
-         <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
-         <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
-         <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
-         <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
-         <value type="int" key="EditorConfiguration.TabSize">2</value>
-         <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
-         <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
-         <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
-         <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
-         <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
-         <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
-        </valuemap>
-       </data>
-    """)
-    f.write("""
-       <data>
-        <variable>ProjectExplorer.Project.Target.0</variable>
-        <valuemap type="QVariantMap">
-         <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString">Default Name</value>
-         <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Display Name</value>
-         <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">GenericProjectManager.GenericTarget</value>
-    """)
-
-    project_number = 0
-    for (project_name, project_target) in project_def['projects']:
-      f.write("""
-         <valuemap key="ProjectExplorer.Target.BuildConfiguration.%(project_number)d" type="QVariantMap">
-          <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">GenericProjectManager.GenericBuildConfiguration</value>
-          <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">%(project_name)s:%(project_target)s</value>
-          <value key="GenericProjectManager.GenericBuildConfiguration.BuildDirectory" type="QString">%(out_dir)s</value>
-          <value key="ProjectExplorer.BuildConfiguration.ToolChain" type="QString">INVALID</value>
-
-          <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.0" type="QVariantMap">
-           <valuelist key="GenericProjectManager.GenericMakeStep.BuildTargets" type="QVariantList"/>
-           <valuelist key="GenericProjectManager.GenericMakeStep.MakeArguments" type="QVariantList">
-            <value type="QString">%(project_target)s</value>
-           </valuelist>
-           <value key="GenericProjectManager.GenericMakeStep.MakeCommand" type="QString">ninja</value>
-           <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Ninja</value>
-           <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">GenericProjectManager.GenericMakeStep</value>
-          </valuemap>
-
-          <value key="ProjectExplorer.BuildConfiguration.BuildStepsCount" type="int">1</value>
-
-          <valuemap key="ProjectExplorer.BuildConfiguration.CleanStep.0" type="QVariantMap">
-           <valuelist key="GenericProjectManager.GenericMakeStep.BuildTargets" type="QVariantList"/>
-           <valuelist key="GenericProjectManager.GenericMakeStep.MakeArguments" type="QVariantList">
-            <value type="QString">-tclean</value>
-           </valuelist>
-           <value key="GenericProjectManager.GenericMakeStep.MakeCommand" type="QString">ninja</value>
-           <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Ninja</value>
-           <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">GenericProjectManager.GenericMakeStep</value>
-          </valuemap>
-          <value key="ProjectExplorer.BuildConfiguration.CleanStepsCount" type="int">1</value>
-          <value key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment" type="bool">false</value>
-          <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges">
-           <value type="QString">TARGET=%(project_target)s</value>
-          </valuelist>
-         </valuemap>
-      """ % {
-          'project_number': project_number,
-          'project_name': project_name,
-          'project_target': project_target,
-          'out_dir': project_def['out_dir'],
-      })
-      project_number += 1
-
-    f.write("""
-         <value key="ProjectExplorer.Target.BuildConfigurationCount" type="int">%d</value>
-    """ % project_number)
-
-    f.write("""
-         <valuemap key="ProjectExplorer.Target.RunConfiguration.0" type="QVariantMap">
-          <valuelist key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments" type="QVariantList"/>
-          <value key="ProjectExplorer.CustomExecutableRunConfiguration.BaseEnvironmentBase" type="int">2</value>
-          <value key="ProjectExplorer.CustomExecutableRunConfiguration.Executable" type="QString">./$TARGET</value>
-          <value key="ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal" type="bool">false</value>
-          <value key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory" type="QString">$BUILDDIR</value>
-          <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Run Target</value>
-          <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">ProjectExplorer.CustomExecutableRunConfiguration</value>
-          <value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
-          <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">false</value>
-         </valuemap>
-
-         <valuemap key="ProjectExplorer.Target.RunConfiguration.1" type="QVariantMap">
-          <valuelist key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments" type="QVariantList"/>
-          <value key="ProjectExplorer.CustomExecutableRunConfiguration.BaseEnvironmentBase" type="int">2</value>
-          <value key="ProjectExplorer.CustomExecutableRunConfiguration.Executable" type="QString">valgrind ./$TARGET</value>
-          <value key="ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal" type="bool">false</value>
-          <value key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory" type="QString">$BUILDDIR</value>
-          <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Valgrind Target</value>
-          <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">ProjectExplorer.CustomExecutableRunConfiguration</value>
-          <value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
-          <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">false</value>
-         </valuemap>
-
-         <value key="ProjectExplorer.Target.RunConfigurationCount" type="int">2</value>
-    """)
-
-    f.write("""
-        </valuemap>
-       </data>
-    """)
-    f.write("""
-       <data>
-        <variable>ProjectExplorer.Project.TargetCount</variable>
-        <value type="int">1</value>
-       </data>
-       <data>
-        <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
-        <value type="int">6</value>
-       </data>
-      </qtcreator>
-      """)
-
-
-def GenerateProjects(definition):
-  """Generates a solution and all corresponding projects.
-
-  Args:
-    definition: A dictionary specifying all solution and project parameters.
-  Raises:
-    RuntimeError: if the specified repo directory cannot be found.
-  """
-
-  repo_dir = os.path.abspath(definition['repo_dir'])
-  projects_dir = os.path.abspath(definition['projects_dir'])
-
-  if not os.path.exists(repo_dir):
-    raise RuntimeError('Repo directory not found: {}'.format(repo_dir))
-
-  # Generate project files
-  for proj in definition['projects']:
-    GenProject(proj, projects_dir)
-
-
-def GetProjectsDirectory(output_dir):
-  return os.path.join(output_dir, PROJECT_DIR_RELATIVE_TO_OUTPUT_DIR)
-
-
-def GetValue(dictionary, path, default=None):
-  """Returns a value from a nest dictionaries.
-
-  Example: d = { 'base': { 'child': 1 } }
-           GetValue(d, 'base/child') == 1
-           GetValue(d, 'base/not_found', 6) == 6
-
-  Args:
-    dictionary: The dictionary of dictionaries to traverse.
-    path: A string indicating the value we want to extract from dictionary.
-    default: A string to use if the specified value can't be found.
-  Returns:
-    Returns the value from dictionary specified by path.
-  """
-
-  path = path.split('/')
-  for p in path[:-1]:
-    dictionary = dictionary.get(p, {})
-  return dictionary.get(path[-1], default)
-
-
-def GetSet(dictionary, value):
-  return set(dictionary.get(value, []))
-
-
-def GenerateQTCreatorFiles(target_dicts, params):
-  """Transforms GYP data into a more suitable form and feed it to the generator.
-
-  The function will collapse individual targets into a single data set which
-  is broken down by configuration types.
-
-  Args:
-    target_dicts: Dictionaries specifying targets as provided by Gyp.
-    params: Parameters used for the current Gyp build.
-  Raises:
-    RuntimeError: Thrown if assumptions on the input parameters are not met.
-  """
-
-  generator_flags = params['generator_flags']
-  current_config = generator_flags['config']
-  repo_dir = params['options'].toplevel_dir
-
-  session_name_prefix = generator_flags['qtcreator_session_name_prefix']
-  project_list = set()
-  sources = set()
-
-  configuration = {'include_paths': set(), 'defines': set()}
-
-  if len(params['build_files']) != 1:
-    raise RuntimeError('Expected only a single Gyp build file.')
-
-  output_dir = os.path.join(repo_dir, generator_flags['output_dir'])
-  projects_dir = GetProjectsDirectory(output_dir)
-  configuration['out_dir'] = current_config
-
-  # At the moment we are not tracking which dependencies were actually used
-  # to construct each executable target and instead pretend that all of them
-  # are needed for each executable target
-  for target_name, target in target_dicts.iteritems():
-    gyp_abspath = os.path.abspath(target_name[:target_name.rfind(':')])
-    gyp_dirname = os.path.dirname(gyp_abspath)
-
-    config = target['configurations'][current_config]
-    configuration['defines'] |= (
-        GetSet(config, 'defines') - GetSet(config, 'defines_excluded'))
-    configuration['include_paths'] |= RebaseRelativePaths(
-        (GetSet(config, 'include_dirs')
-         | GetSet(config, 'include_dirs_target')), gyp_dirname, projects_dir)
-
-    sources |= RebaseRelativePaths(
-        (GetSet(target, 'sources') - GetSet(target, 'sources_excluded')),
-        gyp_dirname, projects_dir)
-    sources |= set([os.path.relpath(gyp_abspath, projects_dir)])
-    # Generate projects for targets with the ide_deploy_target variable set.
-    if GetValue(target, 'variables/ide_deploy_target', 0):
-      executable_target = GetValue(target, 'variables/executable_name')
-      assert executable_target
-      executable_folder = os.path.relpath(gyp_dirname, repo_dir)
-      project_list.add((executable_folder, executable_target))
-
-  projects = [{
-      'session_name_prefix': session_name_prefix,
-      'out_dir': os.path.join(output_dir, current_config),
-      'name': current_config,
-      'sources': sources,
-      'configuration': configuration,
-      'projects': project_list,
-  }]
-
-  definition = {
-      'name': current_config,
-      'projects_dir': projects_dir,
-      'repo_dir': repo_dir,
-      'projects': projects,
-  }
-
-  GenerateProjects(definition)
-
-
-#
-# GYP generator external functions
-#
-def PerformBuild(data, configurations, params):  # pylint: disable=unused-argument
-  # Not used by this generator
-  pass
-
-
-def GenerateOutput(target_list, target_dicts, data, params):  # pylint: disable=unused-argument
-  """Generates QT Creator project files for Linux.
-
-  A BuildConfiguration will be generated for each executable target that
-  contains a deploy step.
-  Example:
-    {
-      'target_name': 'project_name_deploy',
-      'variables': {
-        'executable_name': 'project_name',
-      },
-    },
-
-  A project file with all targets will be generated for each configuration
-  (ex. Debug, Devel, etc..).
-
-  Args:
-    target_list: Unused.
-    target_dicts: List of dictionaries specifying Gyp targets.
-    data: Unused.
-    params: Gyp parameters.
-  """
-  GenerateQTCreatorFiles(target_dicts, params)
diff --git a/tools/gyp/pylib/gyp/generator/scons.py b/tools/gyp/pylib/gyp/generator/scons.py
deleted file mode 100644
index fe7cb58..0000000
--- a/tools/gyp/pylib/gyp/generator/scons.py
+++ /dev/null
@@ -1,1072 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import gyp
-import gyp.common
-import gyp.SCons as SCons
-import os.path
-import pprint
-import re
-import subprocess
-
-
-# TODO:  remove when we delete the last WriteList() call in this module
-WriteList = SCons.WriteList
-
-
-generator_default_variables = {
-    'EXECUTABLE_PREFIX': '',
-    'EXECUTABLE_SUFFIX': '',
-    'STATIC_LIB_PREFIX': '${LIBPREFIX}',
-    'SHARED_LIB_PREFIX': '${SHLIBPREFIX}',
-    'STATIC_LIB_SUFFIX': '${LIBSUFFIX}',
-    'SHARED_LIB_SUFFIX': '${SHLIBSUFFIX}',
-    'INTERMEDIATE_DIR': '${INTERMEDIATE_DIR}',
-    'SHARED_INTERMEDIATE_DIR': '${SHARED_INTERMEDIATE_DIR}',
-    'OS': 'linux',
-    'PRODUCT_DIR': '$TOP_BUILDDIR',
-    'SHARED_LIB_DIR': '$LIB_DIR',
-    'LIB_DIR': '$LIB_DIR',
-    'RULE_INPUT_ROOT': '${SOURCE.filebase}',
-    'RULE_INPUT_DIRNAME': '${SOURCE.dir}',
-    'RULE_INPUT_EXT': '${SOURCE.suffix}',
-    'RULE_INPUT_NAME': '${SOURCE.file}',
-    'RULE_INPUT_PATH': '${SOURCE.abspath}',
-    'CONFIGURATION_NAME': '${CONFIG_NAME}',
-}
-
-# Tell GYP how to process the input for us.
-generator_handles_variants = True
-generator_wants_absolute_build_file_paths = True
-
-
-def FixPath(path, prefix):
-  if not os.path.isabs(path) and not path[0] == '$':
-    path = prefix + path
-  return path
-
-
-header = """\
-# This file is generated; do not edit.
-"""
-
-
-_alias_template = """
-if GetOption('verbose'):
-  _action = Action([%(action)s])
-else:
-  _action = Action([%(action)s], %(message)s)
-_outputs = env.Alias(
-  ['_%(target_name)s_action'],
-  %(inputs)s,
-  _action
-)
-env.AlwaysBuild(_outputs)
-"""
-
-_run_as_template = """
-if GetOption('verbose'):
-  _action = Action([%(action)s])
-else:
-  _action = Action([%(action)s], %(message)s)
-"""
-
-_run_as_template_suffix = """
-_run_as_target = env.Alias('run_%(target_name)s', target_files, _action)
-env.Requires(_run_as_target, [
-    Alias('%(target_name)s'),
-])
-env.AlwaysBuild(_run_as_target)
-"""
-
-_command_template = """
-if GetOption('verbose'):
-  _action = Action([%(action)s])
-else:
-  _action = Action([%(action)s], %(message)s)
-_outputs = env.Command(
-  %(outputs)s,
-  %(inputs)s,
-  _action
-)
-"""
-
-# This is copied from the default SCons action, updated to handle symlinks.
-_copy_action_template = """
-import shutil
-import SCons.Action
-
-def _copy_files_or_dirs_or_symlinks(dest, src):
-  SCons.Node.FS.invalidate_node_memos(dest)
-  if SCons.Util.is_List(src) and os.path.isdir(dest):
-    for file in src:
-      shutil.copy2(file, dest)
-    return 0
-  elif os.path.islink(src):
-    linkto = os.readlink(src)
-    os.symlink(linkto, dest)
-    return 0
-  elif os.path.isfile(src):
-    return shutil.copy2(src, dest)
-  else:
-    return shutil.copytree(src, dest, 1)
-
-def _copy_files_or_dirs_or_symlinks_str(dest, src):
-  return 'Copying %s to %s ...' % (src, dest)
-
-GYPCopy = SCons.Action.ActionFactory(_copy_files_or_dirs_or_symlinks,
-                                     _copy_files_or_dirs_or_symlinks_str,
-                                     convert=str)
-"""
-
-_rule_template = """
-%(name)s_additional_inputs = %(inputs)s
-%(name)s_outputs = %(outputs)s
-def %(name)s_emitter(target, source, env):
-  return (%(name)s_outputs, source + %(name)s_additional_inputs)
-if GetOption('verbose'):
-  %(name)s_action = Action([%(action)s])
-else:
-  %(name)s_action = Action([%(action)s], %(message)s)
-env['BUILDERS']['%(name)s'] = Builder(action=%(name)s_action,
-                                      emitter=%(name)s_emitter)
-
-_outputs = []
-_processed_input_files = []
-for infile in input_files:
-  if (type(infile) == type('')
-      and not os.path.isabs(infile)
-      and not infile[0] == '$'):
-    infile = %(src_dir)r + infile
-  if str(infile).endswith('.%(extension)s'):
-    _generated = env.%(name)s(infile)
-    env.Precious(_generated)
-    _outputs.append(_generated)
-    %(process_outputs_as_sources_line)s
-  else:
-    _processed_input_files.append(infile)
-prerequisites.extend(_outputs)
-input_files = _processed_input_files
-"""
-
-_spawn_hack = """
-import re
-import SCons.Platform.posix
-needs_shell = re.compile('["\\'><!^&]')
-def gyp_spawn(sh, escape, cmd, args, env):
-  def strip_scons_quotes(arg):
-    if arg[0] == '"' and arg[-1] == '"':
-      return arg[1:-1]
-    return arg
-  stripped_args = [strip_scons_quotes(a) for a in args]
-  if needs_shell.search(' '.join(stripped_args)):
-    return SCons.Platform.posix.exec_spawnvpe([sh, '-c', ' '.join(args)], env)
-  else:
-    return SCons.Platform.posix.exec_spawnvpe(stripped_args, env)
-"""
-
-
-def EscapeShellArgument(s):
-  """Quotes an argument so that it will be interpreted literally by a POSIX
-     shell. Taken from
-     http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-ossystem-calls-in-python
-     """
-  return "'" + s.replace("'", "'\\''") + "'"
-
-
-def InvertNaiveSConsQuoting(s):
-  """SCons tries to "help" with quoting by naively putting double-quotes around
-     command-line arguments containing space or tab, which is broken for all
-     but trivial cases, so we undo it. (See quote_spaces() in Subst.py)"""
-  if ' ' in s or '\t' in s:
-    # Then SCons will put double-quotes around this, so add our own quotes
-    # to close its quotes at the beginning and end.
-    s = '"' + s + '"'
-  return s
-
-
-def EscapeSConsVariableExpansion(s):
-  """SCons has its own variable expansion syntax using $. We must escape it for
-    strings to be interpreted literally. For some reason this requires four
-    dollar signs, not two, even without the shell involved."""
-  return s.replace('$', '$$$$')
-
-
-def EscapeCppDefine(s):
-  """Escapes a CPP define so that it will reach the compiler unaltered."""
-  s = EscapeShellArgument(s)
-  s = InvertNaiveSConsQuoting(s)
-  s = EscapeSConsVariableExpansion(s)
-  return s
-
-
-def GenerateConfig(fp, config, indent='', src_dir=''):
-  """
-  Generates SCons dictionary items for a gyp configuration.
-
-  This provides the main translation between the (lower-case) gyp settings
-  keywords and the (upper-case) SCons construction variables.
-  """
-  var_mapping = {
-      'ASFLAGS' : 'asflags',
-      'CCFLAGS' : 'cflags',
-      'CFLAGS' : 'cflags_c',
-      'CXXFLAGS' : 'cflags_cc',
-      'CPPDEFINES' : 'defines',
-      'CPPPATH' : 'include_dirs',
-      # Add the ldflags value to $LINKFLAGS, but not $SHLINKFLAGS.
-      # SCons defines $SHLINKFLAGS to incorporate $LINKFLAGS, so
-      # listing both here would case 'ldflags' to get appended to
-      # both, and then have it show up twice on the command line.
-      'LINKFLAGS' : 'ldflags',
-  }
-  postamble='\n%s],\n' % indent
-  for scons_var in sorted(var_mapping.keys()):
-      gyp_var = var_mapping[scons_var]
-      value = config.get(gyp_var)
-      if value:
-        if gyp_var in ('defines',):
-          value = [EscapeCppDefine(v) for v in value]
-        if gyp_var in ('include_dirs',):
-          if src_dir and not src_dir.endswith('/'):
-            src_dir += '/'
-          result = []
-          for v in value:
-            v = FixPath(v, src_dir)
-            # Force SCons to evaluate the CPPPATH directories at
-            # SConscript-read time, so delayed evaluation of $SRC_DIR
-            # doesn't point it to the --generator-output= directory.
-            result.append('env.Dir(%r)' % v)
-          value = result
-        else:
-          value = map(repr, value)
-        WriteList(fp,
-                  value,
-                  prefix=indent,
-                  preamble='%s%s = [\n    ' % (indent, scons_var),
-                  postamble=postamble)
-
-
-def GenerateSConscript(output_filename, spec, build_file, build_file_data):
-  """
-  Generates a SConscript file for a specific target.
-
-  This generates a SConscript file suitable for building any or all of
-  the target's configurations.
-
-  A SConscript file may be called multiple times to generate targets for
-  multiple configurations.  Consequently, it needs to be ready to build
-  the target for any requested configuration, and therefore contains
-  information about the settings for all configurations (generated into
-  the SConscript file at gyp configuration time) as well as logic for
-  selecting (at SCons build time) the specific configuration being built.
-
-  The general outline of a generated SConscript file is:
-
-    --  Header
-
-    --  Import 'env'.  This contains a $CONFIG_NAME construction
-        variable that specifies what configuration to build
-        (e.g. Debug, Release).
-
-    --  Configurations.  This is a dictionary with settings for
-        the different configurations (Debug, Release) under which this
-        target can be built.  The values in the dictionary are themselves
-        dictionaries specifying what construction variables should added
-        to the local copy of the imported construction environment
-        (Append), should be removed (FilterOut), and should outright
-        replace the imported values (Replace).
-
-    --  Clone the imported construction environment and update
-        with the proper configuration settings.
-
-    --  Initialize the lists of the targets' input files and prerequisites.
-
-    --  Target-specific actions and rules.  These come after the
-        input file and prerequisite initializations because the
-        outputs of the actions and rules may affect the input file
-        list (process_outputs_as_sources) and get added to the list of
-        prerequisites (so that they're guaranteed to be executed before
-        building the target).
-
-    --  Call the Builder for the target itself.
-
-    --  Arrange for any copies to be made into installation directories.
-
-    --  Set up the {name} Alias (phony Node) for the target as the
-        primary handle for building all of the target's pieces.
-
-    --  Use env.Require() to make sure the prerequisites (explicitly
-        specified, but also including the actions and rules) are built
-        before the target itself.
-
-    --  Return the {name} Alias to the calling SConstruct file
-        so it can be added to the list of default targets.
-  """
-  scons_target = SCons.Target(spec)
-
-  gyp_dir = os.path.dirname(output_filename)
-  if not gyp_dir:
-      gyp_dir = '.'
-  gyp_dir = os.path.abspath(gyp_dir)
-
-  output_dir = os.path.dirname(output_filename)
-  src_dir = build_file_data['_DEPTH']
-  src_dir_rel = gyp.common.RelativePath(src_dir, output_dir)
-  subdir = gyp.common.RelativePath(os.path.dirname(build_file), src_dir)
-  src_subdir = '$SRC_DIR/' + subdir
-  src_subdir_ = src_subdir + '/'
-
-  component_name = os.path.splitext(os.path.basename(build_file))[0]
-  target_name = spec['target_name']
-
-  if not os.path.exists(gyp_dir):
-    os.makedirs(gyp_dir)
-  fp = open(output_filename, 'w')
-  fp.write(header)
-
-  fp.write('\nimport os\n')
-  fp.write('\nImport("env")\n')
-
-  #
-  fp.write('\n')
-  fp.write('env = env.Clone(COMPONENT_NAME=%s,\n' % repr(component_name))
-  fp.write('                TARGET_NAME=%s)\n' % repr(target_name))
-
-  #
-  for config in spec['configurations'].itervalues():
-    if config.get('scons_line_length'):
-      fp.write(_spawn_hack)
-      break
-
-  #
-  indent = ' ' * 12
-  fp.write('\n')
-  fp.write('configurations = {\n')
-  for config_name, config in spec['configurations'].iteritems():
-    fp.write('    \'%s\' : {\n' % config_name)
-
-    fp.write('        \'Append\' : dict(\n')
-    GenerateConfig(fp, config, indent, src_subdir)
-    libraries = spec.get('libraries')
-    if libraries:
-      WriteList(fp,
-                map(repr, libraries),
-                prefix=indent,
-                preamble='%sLIBS = [\n    ' % indent,
-                postamble='\n%s],\n' % indent)
-    fp.write('        ),\n')
-
-    fp.write('        \'FilterOut\' : dict(\n' )
-    for key, var in config.get('scons_remove', {}).iteritems():
-      fp.write('             %s = %s,\n' % (key, repr(var)))
-    fp.write('        ),\n')
-
-    fp.write('        \'Replace\' : dict(\n' )
-    scons_settings = config.get('scons_variable_settings', {})
-    for key in sorted(scons_settings.keys()):
-      val = pprint.pformat(scons_settings[key])
-      fp.write('             %s = %s,\n' % (key, val))
-    if 'c++' in spec.get('link_languages', []):
-      fp.write('             %s = %s,\n' % ('LINK', repr('$CXX')))
-    if config.get('scons_line_length'):
-      fp.write('             SPAWN = gyp_spawn,\n')
-    fp.write('        ),\n')
-
-    fp.write('        \'ImportExternal\' : [\n' )
-    for var in config.get('scons_import_variables', []):
-      fp.write('             %s,\n' % repr(var))
-    fp.write('        ],\n')
-
-    fp.write('        \'PropagateExternal\' : [\n' )
-    for var in config.get('scons_propagate_variables', []):
-      fp.write('             %s,\n' % repr(var))
-    fp.write('        ],\n')
-
-    fp.write('    },\n')
-  fp.write('}\n')
-
-  fp.write('\n'
-           'config = configurations[env[\'CONFIG_NAME\']]\n'
-           'env.Append(**config[\'Append\'])\n'
-           'env.FilterOut(**config[\'FilterOut\'])\n'
-           'env.Replace(**config[\'Replace\'])\n')
-
-  fp.write('\n'
-           '# Scons forces -fPIC for SHCCFLAGS on some platforms.\n'
-           '# Disable that so we can control it from cflags in gyp.\n'
-           '# Note that Scons itself is inconsistent with its -fPIC\n'
-           '# setting. SHCCFLAGS forces -fPIC, and SHCFLAGS does not.\n'
-           '# This will make SHCCFLAGS consistent with SHCFLAGS.\n'
-           'env[\'SHCCFLAGS\'] = [\'$CCFLAGS\']\n')
-
-  fp.write('\n'
-           'for _var in config[\'ImportExternal\']:\n'
-           '  if _var in ARGUMENTS:\n'
-           '    env[_var] = ARGUMENTS[_var]\n'
-           '  elif _var in os.environ:\n'
-           '    env[_var] = os.environ[_var]\n'
-           'for _var in config[\'PropagateExternal\']:\n'
-           '  if _var in ARGUMENTS:\n'
-           '    env[_var] = ARGUMENTS[_var]\n'
-           '  elif _var in os.environ:\n'
-           '    env[\'ENV\'][_var] = os.environ[_var]\n')
-
-  fp.write('\n'
-           "env['ENV']['LD_LIBRARY_PATH'] = env.subst('$LIB_DIR')\n")
-
-  #
-  #fp.write("\nif env.has_key('CPPPATH'):\n")
-  #fp.write("  env['CPPPATH'] = map(env.Dir, env['CPPPATH'])\n")
-
-  variants = spec.get('variants', {})
-  for setting in sorted(variants.keys()):
-    if_fmt = 'if ARGUMENTS.get(%s) not in (None, \'0\'):\n'
-    fp.write('\n')
-    fp.write(if_fmt % repr(setting.upper()))
-    fp.write('  env.AppendUnique(\n')
-    GenerateConfig(fp, variants[setting], indent, src_subdir)
-    fp.write('  )\n')
-
-  #
-  scons_target.write_input_files(fp)
-
-  fp.write('\n')
-  fp.write('target_files = []\n')
-  prerequisites = spec.get('scons_prerequisites', [])
-  fp.write('prerequisites = %s\n' % pprint.pformat(prerequisites))
-
-  actions = spec.get('actions', [])
-  for action in actions:
-    a = ['cd', src_subdir, '&&'] + action['action']
-    message = action.get('message')
-    if message:
-      message = repr(message)
-    inputs = [FixPath(f, src_subdir_) for f in action.get('inputs', [])]
-    outputs = [FixPath(f, src_subdir_) for f in action.get('outputs', [])]
-    if outputs:
-      template = _command_template
-    else:
-      template = _alias_template
-    fp.write(template % {
-                 'inputs' : pprint.pformat(inputs),
-                 'outputs' : pprint.pformat(outputs),
-                 'action' : pprint.pformat(a),
-                 'message' : message,
-                 'target_name': target_name,
-             })
-    if int(action.get('process_outputs_as_sources', 0)):
-      fp.write('input_files.extend(_outputs)\n')
-    fp.write('prerequisites.extend(_outputs)\n')
-    fp.write('target_files.extend(_outputs)\n')
-
-  rules = spec.get('rules', [])
-  for rule in rules:
-    name = re.sub('[^a-zA-Z0-9_]', '_', rule['rule_name'])
-    message = rule.get('message')
-    if message:
-        message = repr(message)
-    if int(rule.get('process_outputs_as_sources', 0)):
-      poas_line = '_processed_input_files.extend(_generated)'
-    else:
-      poas_line = '_processed_input_files.append(infile)'
-    inputs = [FixPath(f, src_subdir_) for f in rule.get('inputs', [])]
-    outputs = [FixPath(f, src_subdir_) for f in rule.get('outputs', [])]
-    # Skip a rule with no action and no inputs.
-    if 'action' not in rule and not rule.get('rule_sources', []):
-      continue
-    a = ['cd', src_subdir, '&&'] + rule['action']
-    fp.write(_rule_template % {
-                 'inputs' : pprint.pformat(inputs),
-                 'outputs' : pprint.pformat(outputs),
-                 'action' : pprint.pformat(a),
-                 'extension' : rule['extension'],
-                 'name' : name,
-                 'message' : message,
-                 'process_outputs_as_sources_line' : poas_line,
-                 'src_dir' : src_subdir_,
-             })
-
-  scons_target.write_target(fp, src_subdir)
-
-  copies = spec.get('copies', [])
-  if copies:
-    fp.write(_copy_action_template)
-  for copy in copies:
-    destdir = None
-    files = None
-    try:
-      destdir = copy['destination']
-    except KeyError, e:
-      gyp.common.ExceptionAppend(
-        e,
-        "Required 'destination' key missing for 'copies' in %s." % build_file)
-      raise
-    try:
-      files = copy['files']
-    except KeyError, e:
-      gyp.common.ExceptionAppend(
-        e, "Required 'files' key missing for 'copies' in %s." % build_file)
-      raise
-    if not files:
-      # TODO:  should probably add a (suppressible) warning;
-      # a null file list may be unintentional.
-      continue
-    if not destdir:
-      raise Exception(
-        "Required 'destination' key is empty for 'copies' in %s." % build_file)
-
-    fmt = ('\n'
-           '_outputs = env.Command(%s,\n'
-           '    %s,\n'
-           '    GYPCopy(\'$TARGET\', \'$SOURCE\'))\n')
-    for f in copy['files']:
-      # Remove trailing separators so basename() acts like Unix basename and
-      # always returns the last element, whether a file or dir. Without this,
-      # only the contents, not the directory itself, are copied (and nothing
-      # might be copied if dest already exists, since scons thinks nothing needs
-      # to be done).
-      dest = os.path.join(destdir, os.path.basename(f.rstrip(os.sep)))
-      f = FixPath(f, src_subdir_)
-      dest = FixPath(dest, src_subdir_)
-      fp.write(fmt % (repr(dest), repr(f)))
-      fp.write('target_files.extend(_outputs)\n')
-
-  run_as = spec.get('run_as')
-  if run_as:
-    action = run_as.get('action', [])
-    working_directory = run_as.get('working_directory')
-    if not working_directory:
-      working_directory = gyp_dir
-    else:
-      if not os.path.isabs(working_directory):
-        working_directory = os.path.normpath(os.path.join(gyp_dir,
-                                                          working_directory))
-    if run_as.get('environment'):
-      for (key, val) in run_as.get('environment').iteritems():
-        action = ['%s="%s"' % (key, val)] + action
-    action = ['cd', '"%s"' % working_directory, '&&'] + action
-    fp.write(_run_as_template % {
-      'action' : pprint.pformat(action),
-      'message' : run_as.get('message', ''),
-    })
-
-  fmt = "\ngyp_target = env.Alias('%s', target_files)\n"
-  fp.write(fmt % target_name)
-
-  dependencies = spec.get('scons_dependencies', [])
-  if dependencies:
-    WriteList(fp, dependencies, preamble='dependencies = [\n    ',
-                                postamble='\n]\n')
-    fp.write('env.Requires(target_files, dependencies)\n')
-    fp.write('env.Requires(gyp_target, dependencies)\n')
-    fp.write('for prerequisite in prerequisites:\n')
-    fp.write('  env.Requires(prerequisite, dependencies)\n')
-  fp.write('env.Requires(gyp_target, prerequisites)\n')
-
-  if run_as:
-    fp.write(_run_as_template_suffix % {
-      'target_name': target_name,
-    })
-
-  fp.write('Return("gyp_target")\n')
-
-  fp.close()
-
-
-#############################################################################
-# TEMPLATE BEGIN
-
-_wrapper_template = """\
-
-__doc__ = '''
-Wrapper configuration for building this entire "solution,"
-including all the specific targets in various *.scons files.
-'''
-
-import os
-import sys
-
-import SCons.Environment
-import SCons.Util
-
-def GetProcessorCount():
-  '''
-  Detects the number of CPUs on the system. Adapted form:
-  http://codeliberates.blogspot.com/2008/05/detecting-cpuscores-in-python.html
-  '''
-  # Linux, Unix and Mac OS X:
-  if hasattr(os, 'sysconf'):
-    if os.sysconf_names.has_key('SC_NPROCESSORS_ONLN'):
-      # Linux and Unix or Mac OS X with python >= 2.5:
-      return os.sysconf('SC_NPROCESSORS_ONLN')
-    else:  # Mac OS X with Python < 2.5:
-      return int(os.popen2("sysctl -n hw.ncpu")[1].read())
-  # Windows:
-  if os.environ.has_key('NUMBER_OF_PROCESSORS'):
-    return max(int(os.environ.get('NUMBER_OF_PROCESSORS', '1')), 1)
-  return 1  # Default
-
-# Support PROGRESS= to show progress in different ways.
-p = ARGUMENTS.get('PROGRESS')
-if p == 'spinner':
-  Progress(['/\\r', '|\\r', '\\\\\\r', '-\\r'],
-           interval=5,
-           file=open('/dev/tty', 'w'))
-elif p == 'name':
-  Progress('$TARGET\\r', overwrite=True, file=open('/dev/tty', 'w'))
-
-# Set the default -j value based on the number of processors.
-SetOption('num_jobs', GetProcessorCount() + 1)
-
-# Have SCons use its cached dependency information.
-SetOption('implicit_cache', 1)
-
-# Only re-calculate MD5 checksums if a timestamp has changed.
-Decider('MD5-timestamp')
-
-# Since we set the -j value by default, suppress SCons warnings about being
-# unable to support parallel build on versions of Python with no threading.
-default_warnings = ['no-no-parallel-support']
-SetOption('warn', default_warnings + GetOption('warn'))
-
-AddOption('--mode', nargs=1, dest='conf_list', default=[],
-          action='append', help='Configuration to build.')
-
-AddOption('--verbose', dest='verbose', default=False,
-          action='store_true', help='Verbose command-line output.')
-
-
-#
-sconscript_file_map = %(sconscript_files)s
-
-class LoadTarget:
-  '''
-  Class for deciding if a given target sconscript is to be included
-  based on a list of included target names, optionally prefixed with '-'
-  to exclude a target name.
-  '''
-  def __init__(self, load):
-    '''
-    Initialize a class with a list of names for possible loading.
-
-    Arguments:
-      load:  list of elements in the LOAD= specification
-    '''
-    self.included = set([c for c in load if not c.startswith('-')])
-    self.excluded = set([c[1:] for c in load if c.startswith('-')])
-
-    if not self.included:
-      self.included = set(['all'])
-
-  def __call__(self, target):
-    '''
-    Returns True if the specified target's sconscript file should be
-    loaded, based on the initialized included and excluded lists.
-    '''
-    return (target in self.included or
-            ('all' in self.included and not target in self.excluded))
-
-if 'LOAD' in ARGUMENTS:
-  load = ARGUMENTS['LOAD'].split(',')
-else:
-  load = []
-load_target = LoadTarget(load)
-
-sconscript_files = []
-for target, sconscript in sconscript_file_map.iteritems():
-  if load_target(target):
-    sconscript_files.append(sconscript)
-
-
-target_alias_list= []
-
-conf_list = GetOption('conf_list')
-if conf_list:
-    # In case the same --mode= value was specified multiple times.
-    conf_list = list(set(conf_list))
-else:
-    conf_list = [%(default_configuration)r]
-
-sconsbuild_dir = Dir(%(sconsbuild_dir)s)
-
-
-def FilterOut(self, **kw):
-  kw = SCons.Environment.copy_non_reserved_keywords(kw)
-  for key, val in kw.items():
-    envval = self.get(key, None)
-    if envval is None:
-      # No existing variable in the environment, so nothing to delete.
-      continue
-
-    for vremove in val:
-      # Use while not if, so we can handle duplicates.
-      while vremove in envval:
-        envval.remove(vremove)
-
-    self[key] = envval
-
-    # TODO(sgk): SCons.Environment.Append() has much more logic to deal
-    # with various types of values.  We should handle all those cases in here
-    # too.  (If variable is a dict, etc.)
-
-
-non_compilable_suffixes = {
-    'LINUX' : set([
-        '.bdic',
-        '.css',
-        '.dat',
-        '.fragment',
-        '.gperf',
-        '.h',
-        '.hh',
-        '.hpp',
-        '.html',
-        '.hxx',
-        '.idl',
-        '.in',
-        '.in0',
-        '.in1',
-        '.js',
-        '.mk',
-        '.rc',
-        '.sigs',
-        '',
-    ]),
-    'WINDOWS' : set([
-        '.h',
-        '.hh',
-        '.hpp',
-        '.dat',
-        '.idl',
-        '.in',
-        '.in0',
-        '.in1',
-    ]),
-}
-
-def compilable(env, file):
-  base, ext = os.path.splitext(str(file))
-  if ext in non_compilable_suffixes[env['TARGET_PLATFORM']]:
-    return False
-  return True
-
-def compilable_files(env, sources):
-  return [x for x in sources if compilable(env, x)]
-
-def GypProgram(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.Program(target, source, *args, **kw)
-  if env.get('INCREMENTAL'):
-    env.Precious(result)
-  return result
-
-def GypTestProgram(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.Program(target, source, *args, **kw)
-  if env.get('INCREMENTAL'):
-    env.Precious(*result)
-  return result
-
-def GypLibrary(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.Library(target, source, *args, **kw)
-  return result
-
-def GypLoadableModule(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.LoadableModule(target, source, *args, **kw)
-  return result
-
-def GypStaticLibrary(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.StaticLibrary(target, source, *args, **kw)
-  return result
-
-def GypSharedLibrary(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.SharedLibrary(target, source, *args, **kw)
-  if env.get('INCREMENTAL'):
-    env.Precious(result)
-  return result
-
-def add_gyp_methods(env):
-  env.AddMethod(GypProgram)
-  env.AddMethod(GypTestProgram)
-  env.AddMethod(GypLibrary)
-  env.AddMethod(GypLoadableModule)
-  env.AddMethod(GypStaticLibrary)
-  env.AddMethod(GypSharedLibrary)
-
-  env.AddMethod(FilterOut)
-
-  env.AddMethod(compilable)
-
-
-base_env = Environment(
-    tools = %(scons_tools)s,
-    INTERMEDIATE_DIR='$OBJ_DIR/${COMPONENT_NAME}/_${TARGET_NAME}_intermediate',
-    LIB_DIR='$TOP_BUILDDIR/lib',
-    OBJ_DIR='$TOP_BUILDDIR/obj',
-    SCONSBUILD_DIR=sconsbuild_dir.abspath,
-    SHARED_INTERMEDIATE_DIR='$OBJ_DIR/_global_intermediate',
-    SRC_DIR=Dir(%(src_dir)r),
-    TARGET_PLATFORM='LINUX',
-    TOP_BUILDDIR='$SCONSBUILD_DIR/$CONFIG_NAME',
-    LIBPATH=['$LIB_DIR'],
-)
-
-if not GetOption('verbose'):
-  base_env.SetDefault(
-      ARCOMSTR='Creating library $TARGET',
-      ASCOMSTR='Assembling $TARGET',
-      CCCOMSTR='Compiling $TARGET',
-      CONCATSOURCECOMSTR='ConcatSource $TARGET',
-      CXXCOMSTR='Compiling $TARGET',
-      LDMODULECOMSTR='Building loadable module $TARGET',
-      LINKCOMSTR='Linking $TARGET',
-      MANIFESTCOMSTR='Updating manifest for $TARGET',
-      MIDLCOMSTR='Compiling IDL $TARGET',
-      PCHCOMSTR='Precompiling $TARGET',
-      RANLIBCOMSTR='Indexing $TARGET',
-      RCCOMSTR='Compiling resource $TARGET',
-      SHCCCOMSTR='Compiling $TARGET',
-      SHCXXCOMSTR='Compiling $TARGET',
-      SHLINKCOMSTR='Linking $TARGET',
-      SHMANIFESTCOMSTR='Updating manifest for $TARGET',
-  )
-
-add_gyp_methods(base_env)
-
-for conf in conf_list:
-  env = base_env.Clone(CONFIG_NAME=conf)
-  SConsignFile(env.File('$TOP_BUILDDIR/.sconsign').abspath)
-  for sconscript in sconscript_files:
-    target_alias = env.SConscript(sconscript, exports=['env'])
-    if target_alias:
-      target_alias_list.extend(target_alias)
-
-Default(Alias('all', target_alias_list))
-
-help_fmt = '''
-Usage: hammer [SCONS_OPTIONS] [VARIABLES] [TARGET] ...
-
-Local command-line build options:
-  --mode=CONFIG             Configuration to build:
-                              --mode=Debug [default]
-                              --mode=Release
-  --verbose                 Print actual executed command lines.
-
-Supported command-line build variables:
-  LOAD=[module,...]         Comma-separated list of components to load in the
-                              dependency graph ('-' prefix excludes)
-  PROGRESS=type             Display a progress indicator:
-                              name:  print each evaluated target name
-                              spinner:  print a spinner every 5 targets
-
-The following TARGET names can also be used as LOAD= module names:
-
-%%s
-'''
-
-if GetOption('help'):
-  def columnar_text(items, width=78, indent=2, sep=2):
-    result = []
-    colwidth = max(map(len, items)) + sep
-    cols = (width - indent) / colwidth
-    if cols < 1:
-      cols = 1
-    rows = (len(items) + cols - 1) / cols
-    indent = '%%*s' %% (indent, '')
-    sep = indent
-    for row in xrange(0, rows):
-      result.append(sep)
-      for i in xrange(row, len(items), rows):
-        result.append('%%-*s' %% (colwidth, items[i]))
-      sep = '\\n' + indent
-    result.append('\\n')
-    return ''.join(result)
-
-  load_list = set(sconscript_file_map.keys())
-  target_aliases = set(map(str, target_alias_list))
-
-  common = load_list and target_aliases
-  load_only = load_list - common
-  target_only = target_aliases - common
-  help_text = [help_fmt %% columnar_text(sorted(list(common)))]
-  if target_only:
-    fmt = "The following are additional TARGET names:\\n\\n%%s\\n"
-    help_text.append(fmt %% columnar_text(sorted(list(target_only))))
-  if load_only:
-    fmt = "The following are additional LOAD= module names:\\n\\n%%s\\n"
-    help_text.append(fmt %% columnar_text(sorted(list(load_only))))
-  Help(''.join(help_text))
-"""
-
-# TEMPLATE END
-#############################################################################
-
-
-def GenerateSConscriptWrapper(build_file, build_file_data, name,
-                              output_filename, sconscript_files,
-                              default_configuration):
-  """
-  Generates the "wrapper" SConscript file (analogous to the Visual Studio
-  solution) that calls all the individual target SConscript files.
-  """
-  output_dir = os.path.dirname(output_filename)
-  src_dir = build_file_data['_DEPTH']
-  src_dir_rel = gyp.common.RelativePath(src_dir, output_dir)
-  if not src_dir_rel:
-    src_dir_rel = '.'
-  scons_settings = build_file_data.get('scons_settings', {})
-  sconsbuild_dir = scons_settings.get('sconsbuild_dir', '#')
-  scons_tools = scons_settings.get('tools', ['default'])
-
-  sconscript_file_lines = ['dict(']
-  for target in sorted(sconscript_files.keys()):
-    sconscript = sconscript_files[target]
-    sconscript_file_lines.append('    %s = %r,' % (target, sconscript))
-  sconscript_file_lines.append(')')
-
-  fp = open(output_filename, 'w')
-  fp.write(header)
-  fp.write(_wrapper_template % {
-               'default_configuration' : default_configuration,
-               'name' : name,
-               'scons_tools' : repr(scons_tools),
-               'sconsbuild_dir' : repr(sconsbuild_dir),
-               'sconscript_files' : '\n'.join(sconscript_file_lines),
-               'src_dir' : src_dir_rel,
-           })
-  fp.close()
-
-  # Generate the SConstruct file that invokes the wrapper SConscript.
-  dir, fname = os.path.split(output_filename)
-  SConstruct = os.path.join(dir, 'SConstruct')
-  fp = open(SConstruct, 'w')
-  fp.write(header)
-  fp.write('SConscript(%s)\n' % repr(fname))
-  fp.close()
-
-
-def TargetFilename(target, build_file=None, output_suffix=''):
-  """Returns the .scons file name for the specified target.
-  """
-  if build_file is None:
-    build_file, target = gyp.common.ParseQualifiedTarget(target)[:2]
-  output_file = os.path.join(os.path.dirname(build_file),
-                             target + output_suffix + '.scons')
-  return output_file
-
-
-def PerformBuild(data, configurations, params):
-  options = params['options']
-
-  # Due to the way we test gyp on the chromium typbots
-  # we need to look for 'scons.py' as well as the more common 'scons'
-  # TODO(sbc): update the trybots to have a more normal install
-  # of scons.
-  scons = 'scons'
-  paths = os.environ['PATH'].split(os.pathsep)
-  for scons_name in ['scons', 'scons.py']:
-    for path in paths:
-      test_scons = os.path.join(path, scons_name)
-      print 'looking for: %s' % test_scons
-      if os.path.exists(test_scons):
-        print "found scons: %s" % scons
-        scons = test_scons
-        break
-
-  for config in configurations:
-    arguments = [scons, '-C', options.toplevel_dir, '--mode=%s' % config]
-    print "Building [%s]: %s" % (config, arguments)
-    subprocess.check_call(arguments)
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  """
-  Generates all the output files for the specified targets.
-  """
-  options = params['options']
-
-  if options.generator_output:
-    def output_path(filename):
-      return filename.replace(params['cwd'], options.generator_output)
-  else:
-    def output_path(filename):
-      return filename
-
-  default_configuration = None
-
-  for qualified_target in target_list:
-    spec = target_dicts[qualified_target]
-    if spec['toolset'] != 'target':
-      raise Exception(
-          'Multiple toolsets not supported in scons build (target %s)' %
-          qualified_target)
-    scons_target = SCons.Target(spec)
-    if scons_target.is_ignored:
-      continue
-
-    # TODO:  assumes the default_configuration of the first target
-    # non-Default target is the correct default for all targets.
-    # Need a better model for handle variation between targets.
-    if (not default_configuration and
-        spec['default_configuration'] != 'Default'):
-      default_configuration = spec['default_configuration']
-
-    build_file, target = gyp.common.ParseQualifiedTarget(qualified_target)[:2]
-    output_file = TargetFilename(target, build_file, options.suffix)
-    if options.generator_output:
-      output_file = output_path(output_file)
-
-    if not spec.has_key('libraries'):
-      spec['libraries'] = []
-
-    # Add dependent static library targets to the 'libraries' value.
-    deps = spec.get('dependencies', [])
-    spec['scons_dependencies'] = []
-    for d in deps:
-      td = target_dicts[d]
-      target_name = td['target_name']
-      spec['scons_dependencies'].append("Alias('%s')" % target_name)
-      if td['type'] in ('static_library', 'shared_library'):
-        libname = td.get('product_name', target_name)
-        spec['libraries'].append('lib' + libname)
-      if td['type'] == 'loadable_module':
-        prereqs = spec.get('scons_prerequisites', [])
-        # TODO:  parameterize with <(SHARED_LIBRARY_*) variables?
-        td_target = SCons.Target(td)
-        td_target.target_prefix = '${SHLIBPREFIX}'
-        td_target.target_suffix = '${SHLIBSUFFIX}'
-
-    GenerateSConscript(output_file, spec, build_file, data[build_file])
-
-  if not default_configuration:
-    default_configuration = 'Default'
-
-  for build_file in sorted(data.keys()):
-    path, ext = os.path.splitext(build_file)
-    if ext != '.gyp':
-      continue
-    output_dir, basename = os.path.split(path)
-    output_filename  = path + '_main' + options.suffix + '.scons'
-
-    all_targets = gyp.common.AllTargets(target_list, target_dicts, build_file)
-    sconscript_files = {}
-    for t in all_targets:
-      scons_target = SCons.Target(target_dicts[t])
-      if scons_target.is_ignored:
-        continue
-      bf, target = gyp.common.ParseQualifiedTarget(t)[:2]
-      target_filename = TargetFilename(target, bf, options.suffix)
-      tpath = gyp.common.RelativePath(target_filename, output_dir)
-      sconscript_files[target] = tpath
-
-    output_filename = output_path(output_filename)
-    if sconscript_files:
-      GenerateSConscriptWrapper(build_file, data[build_file], basename,
-                                output_filename, sconscript_files,
-                                default_configuration)
diff --git a/tools/gyp/pylib/gyp/generator/xcode.py b/tools/gyp/pylib/gyp/generator/xcode.py
deleted file mode 100644
index 7b21bae..0000000
--- a/tools/gyp/pylib/gyp/generator/xcode.py
+++ /dev/null
@@ -1,1230 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import filecmp
-import gyp.common
-import gyp.xcodeproj_file
-import errno
-import os
-import sys
-import posixpath
-import re
-import shutil
-import subprocess
-import tempfile
-
-
-# Project files generated by this module will use _intermediate_var as a
-# custom Xcode setting whose value is a DerivedSources-like directory that's
-# project-specific and configuration-specific.  The normal choice,
-# DERIVED_FILE_DIR, is target-specific, which is thought to be too restrictive
-# as it is likely that multiple targets within a single project file will want
-# to access the same set of generated files.  The other option,
-# PROJECT_DERIVED_FILE_DIR, is unsuitable because while it is project-specific,
-# it is not configuration-specific.  INTERMEDIATE_DIR is defined as
-# $(PROJECT_DERIVED_FILE_DIR)/$(CONFIGURATION).
-_intermediate_var = 'INTERMEDIATE_DIR'
-
-# SHARED_INTERMEDIATE_DIR is the same, except that it is shared among all
-# targets that share the same BUILT_PRODUCTS_DIR.
-_shared_intermediate_var = 'SHARED_INTERMEDIATE_DIR'
-
-_library_search_paths_var = 'LIBRARY_SEARCH_PATHS'
-
-generator_default_variables = {
-  'EXECUTABLE_PREFIX': '',
-  'EXECUTABLE_SUFFIX': '',
-  'STATIC_LIB_PREFIX': 'lib',
-  'SHARED_LIB_PREFIX': 'lib',
-  'STATIC_LIB_SUFFIX': '.a',
-  'SHARED_LIB_SUFFIX': '.dylib',
-  # INTERMEDIATE_DIR is a place for targets to build up intermediate products.
-  # It is specific to each build environment.  It is only guaranteed to exist
-  # and be constant within the context of a project, corresponding to a single
-  # input file.  Some build environments may allow their intermediate directory
-  # to be shared on a wider scale, but this is not guaranteed.
-  'INTERMEDIATE_DIR': '$(%s)' % _intermediate_var,
-  'OS': 'mac',
-  'PRODUCT_DIR': '$(BUILT_PRODUCTS_DIR)',
-  'LIB_DIR': '$(BUILT_PRODUCTS_DIR)',
-  'RULE_INPUT_ROOT': '$(INPUT_FILE_BASE)',
-  'RULE_INPUT_EXT': '$(INPUT_FILE_SUFFIX)',
-  'RULE_INPUT_NAME': '$(INPUT_FILE_NAME)',
-  'RULE_INPUT_PATH': '$(INPUT_FILE_PATH)',
-  'RULE_INPUT_DIRNAME': '$(INPUT_FILE_DIRNAME)',
-  'SHARED_INTERMEDIATE_DIR': '$(%s)' % _shared_intermediate_var,
-  'CONFIGURATION_NAME': '$(CONFIGURATION)',
-}
-
-# The Xcode-specific sections that hold paths.
-generator_additional_path_sections = [
-  'mac_bundle_resources',
-  'mac_framework_headers',
-  'mac_framework_private_headers',
-  # 'mac_framework_dirs', input already handles _dirs endings.
-]
-
-# The Xcode-specific keys that exist on targets and aren't moved down to
-# configurations.
-generator_additional_non_configuration_keys = [
-  'mac_bundle',
-  'mac_bundle_resources',
-  'mac_framework_headers',
-  'mac_framework_private_headers',
-  'xcode_create_dependents_test_runner',
-]
-
-# We want to let any rules apply to files that are resources also.
-generator_extra_sources_for_rules = [
-  'mac_bundle_resources',
-  'mac_framework_headers',
-  'mac_framework_private_headers',
-]
-
-# Xcode's standard set of library directories, which don't need to be duplicated
-# in LIBRARY_SEARCH_PATHS. This list is not exhaustive, but that's okay.
-xcode_standard_library_dirs = frozenset([
-  '$(SDKROOT)/usr/lib',
-  '$(SDKROOT)/usr/local/lib',
-])
-
-def CreateXCConfigurationList(configuration_names):
-  xccl = gyp.xcodeproj_file.XCConfigurationList({'buildConfigurations': []})
-  if len(configuration_names) == 0:
-    configuration_names = ['Default']
-  for configuration_name in configuration_names:
-    xcbc = gyp.xcodeproj_file.XCBuildConfiguration({
-        'name': configuration_name})
-    xccl.AppendProperty('buildConfigurations', xcbc)
-  xccl.SetProperty('defaultConfigurationName', configuration_names[0])
-  return xccl
-
-
-class XcodeProject(object):
-  def __init__(self, gyp_path, path, build_file_dict):
-    self.gyp_path = gyp_path
-    self.path = path
-    self.project = gyp.xcodeproj_file.PBXProject(path=path)
-    projectDirPath = gyp.common.RelativePath(
-                         os.path.dirname(os.path.abspath(self.gyp_path)),
-                         os.path.dirname(path) or '.')
-    self.project.SetProperty('projectDirPath', projectDirPath)
-    self.project_file = \
-        gyp.xcodeproj_file.XCProjectFile({'rootObject': self.project})
-    self.build_file_dict = build_file_dict
-
-    # TODO(mark): add destructor that cleans up self.path if created_dir is
-    # True and things didn't complete successfully.  Or do something even
-    # better with "try"?
-    self.created_dir = False
-    try:
-      os.makedirs(self.path)
-      self.created_dir = True
-    except OSError, e:
-      if e.errno != errno.EEXIST:
-        raise
-
-  def Finalize1(self, xcode_targets, serialize_all_tests):
-    # Collect a list of all of the build configuration names used by the
-    # various targets in the file.  It is very heavily advised to keep each
-    # target in an entire project (even across multiple project files) using
-    # the same set of configuration names.
-    configurations = []
-    for xct in self.project.GetProperty('targets'):
-      xccl = xct.GetProperty('buildConfigurationList')
-      xcbcs = xccl.GetProperty('buildConfigurations')
-      for xcbc in xcbcs:
-        name = xcbc.GetProperty('name')
-        if name not in configurations:
-          configurations.append(name)
-
-    # Replace the XCConfigurationList attached to the PBXProject object with
-    # a new one specifying all of the configuration names used by the various
-    # targets.
-    try:
-      xccl = CreateXCConfigurationList(configurations)
-      self.project.SetProperty('buildConfigurationList', xccl)
-    except:
-      sys.stderr.write("Problem with gyp file %s\n" % self.gyp_path)
-      raise
-
-    # The need for this setting is explained above where _intermediate_var is
-    # defined.  The comments below about wanting to avoid project-wide build
-    # settings apply here too, but this needs to be set on a project-wide basis
-    # so that files relative to the _intermediate_var setting can be displayed
-    # properly in the Xcode UI.
-    #
-    # Note that for configuration-relative files such as anything relative to
-    # _intermediate_var, for the purposes of UI tree view display, Xcode will
-    # only resolve the configuration name once, when the project file is
-    # opened.  If the active build configuration is changed, the project file
-    # must be closed and reopened if it is desired for the tree view to update.
-    # This is filed as Apple radar 6588391.
-    xccl.SetBuildSetting(_intermediate_var,
-                         '$(PROJECT_DERIVED_FILE_DIR)/$(CONFIGURATION)')
-    xccl.SetBuildSetting(_shared_intermediate_var,
-                         '$(SYMROOT)/DerivedSources/$(CONFIGURATION)')
-
-    # Set user-specified project-wide build settings and config files.  This
-    # is intended to be used very sparingly.  Really, almost everything should
-    # go into target-specific build settings sections.  The project-wide
-    # settings are only intended to be used in cases where Xcode attempts to
-    # resolve variable references in a project context as opposed to a target
-    # context, such as when resolving sourceTree references while building up
-    # the tree tree view for UI display.
-    # Any values set globally are applied to all configurations, then any
-    # per-configuration values are applied.
-    for xck, xcv in self.build_file_dict.get('xcode_settings', {}).iteritems():
-      xccl.SetBuildSetting(xck, xcv)
-    if 'xcode_config_file' in self.build_file_dict:
-      config_ref = self.project.AddOrGetFileInRootGroup(
-          self.build_file_dict['xcode_config_file'])
-      xccl.SetBaseConfiguration(config_ref)
-    build_file_configurations = self.build_file_dict.get('configurations', {})
-    if build_file_configurations:
-      for config_name in configurations:
-        build_file_configuration_named = \
-            build_file_configurations.get(config_name, {})
-        if build_file_configuration_named:
-          xcc = xccl.ConfigurationNamed(config_name)
-          for xck, xcv in build_file_configuration_named.get('xcode_settings',
-                                                             {}).iteritems():
-            xcc.SetBuildSetting(xck, xcv)
-          if 'xcode_config_file' in build_file_configuration_named:
-            config_ref = self.project.AddOrGetFileInRootGroup(
-                build_file_configurations[config_name]['xcode_config_file'])
-            xcc.SetBaseConfiguration(config_ref)
-
-    # Sort the targets based on how they appeared in the input.
-    # TODO(mark): Like a lot of other things here, this assumes internal
-    # knowledge of PBXProject - in this case, of its "targets" property.
-
-    # ordinary_targets are ordinary targets that are already in the project
-    # file. run_test_targets are the targets that run unittests and should be
-    # used for the Run All Tests target.  support_targets are the action/rule
-    # targets used by GYP file targets, just kept for the assert check.
-    ordinary_targets = []
-    run_test_targets = []
-    support_targets = []
-
-    # targets is full list of targets in the project.
-    targets = []
-
-    # does the it define it's own "all"?
-    has_custom_all = False
-
-    # targets_for_all is the list of ordinary_targets that should be listed
-    # in this project's "All" target.  It includes each non_runtest_target
-    # that does not have suppress_wildcard set.
-    targets_for_all = []
-
-    for target in self.build_file_dict['targets']:
-      target_name = target['target_name']
-      toolset = target['toolset']
-      qualified_target = gyp.common.QualifiedTarget(self.gyp_path, target_name,
-                                                    toolset)
-      xcode_target = xcode_targets[qualified_target]
-      # Make sure that the target being added to the sorted list is already in
-      # the unsorted list.
-      assert xcode_target in self.project._properties['targets']
-      targets.append(xcode_target)
-      ordinary_targets.append(xcode_target)
-      if xcode_target.support_target:
-        support_targets.append(xcode_target.support_target)
-        targets.append(xcode_target.support_target)
-
-      if not int(target.get('suppress_wildcard', False)):
-        targets_for_all.append(xcode_target)
-
-      if target_name.lower() == 'all':
-        has_custom_all = True;
-
-      # If this target has a 'run_as' attribute, add its target to the
-      # targets, and add it to the test targets.
-      if target.get('run_as'):
-        # Make a target to run something.  It should have one
-        # dependency, the parent xcode target.
-        xccl = CreateXCConfigurationList(configurations)
-        run_target = gyp.xcodeproj_file.PBXAggregateTarget({
-              'name':                   'Run ' + target_name,
-              'productName':            xcode_target.GetProperty('productName'),
-              'buildConfigurationList': xccl,
-            },
-            parent=self.project)
-        run_target.AddDependency(xcode_target)
-
-        command = target['run_as']
-        script = ''
-        if command.get('working_directory'):
-          script = script + 'cd "%s"\n' % \
-                   gyp.xcodeproj_file.ConvertVariablesToShellSyntax(
-                       command.get('working_directory'))
-
-        if command.get('environment'):
-          script = script + "\n".join(
-            ['export %s="%s"' %
-             (key, gyp.xcodeproj_file.ConvertVariablesToShellSyntax(val))
-             for (key, val) in command.get('environment').iteritems()]) + "\n"
-
-        # Some test end up using sockets, files on disk, etc. and can get
-        # confused if more then one test runs at a time.  The generator
-        # flag 'xcode_serialize_all_test_runs' controls the forcing of all
-        # tests serially.  It defaults to True.  To get serial runs this
-        # little bit of python does the same as the linux flock utility to
-        # make sure only one runs at a time.
-        command_prefix = ''
-        if serialize_all_tests:
-          command_prefix = \
-"""python -c "import fcntl, subprocess, sys
-file = open('$TMPDIR/GYP_serialize_test_runs', 'a')
-fcntl.flock(file.fileno(), fcntl.LOCK_EX)
-sys.exit(subprocess.call(sys.argv[1:]))" """
-
-        # If we were unable to exec for some reason, we want to exit
-        # with an error, and fixup variable references to be shell
-        # syntax instead of xcode syntax.
-        script = script + 'exec ' + command_prefix + '%s\nexit 1\n' % \
-                 gyp.xcodeproj_file.ConvertVariablesToShellSyntax(
-                     gyp.common.EncodePOSIXShellList(command.get('action')))
-
-        ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase({
-              'shellScript':      script,
-              'showEnvVarsInLog': 0,
-            })
-        run_target.AppendProperty('buildPhases', ssbp)
-
-        # Add the run target to the project file.
-        targets.append(run_target)
-        run_test_targets.append(run_target)
-        xcode_target.test_runner = run_target
-
-
-    # Make sure that the list of targets being replaced is the same length as
-    # the one replacing it, but allow for the added test runner targets.
-    assert len(self.project._properties['targets']) == \
-      len(ordinary_targets) + len(support_targets)
-
-    self.project._properties['targets'] = targets
-
-    # Get rid of unnecessary levels of depth in groups like the Source group.
-    self.project.RootGroupsTakeOverOnlyChildren(True)
-
-    # Sort the groups nicely.  Do this after sorting the targets, because the
-    # Products group is sorted based on the order of the targets.
-    self.project.SortGroups()
-
-    # Create an "All" target if there's more than one target in this project
-    # file and the project didn't define its own "All" target.  Put a generated
-    # "All" target first so that people opening up the project for the first
-    # time will build everything by default.
-    if len(targets_for_all) > 1 and not has_custom_all:
-      xccl = CreateXCConfigurationList(configurations)
-      all_target = gyp.xcodeproj_file.PBXAggregateTarget(
-          {
-            'buildConfigurationList': xccl,
-            'name':                   'All',
-          },
-          parent=self.project)
-
-      for target in targets_for_all:
-        all_target.AddDependency(target)
-
-      # TODO(mark): This is evil because it relies on internal knowledge of
-      # PBXProject._properties.  It's important to get the "All" target first,
-      # though.
-      self.project._properties['targets'].insert(0, all_target)
-
-    # The same, but for run_test_targets.
-    if len(run_test_targets) > 1:
-      xccl = CreateXCConfigurationList(configurations)
-      run_all_tests_target = gyp.xcodeproj_file.PBXAggregateTarget(
-          {
-            'buildConfigurationList': xccl,
-            'name':                   'Run All Tests',
-          },
-          parent=self.project)
-      for run_test_target in run_test_targets:
-        run_all_tests_target.AddDependency(run_test_target)
-
-      # Insert after the "All" target, which must exist if there is more than
-      # one run_test_target.
-      self.project._properties['targets'].insert(1, run_all_tests_target)
-
-  def Finalize2(self, xcode_targets, xcode_target_to_target_dict):
-    # Finalize2 needs to happen in a separate step because the process of
-    # updating references to other projects depends on the ordering of targets
-    # within remote project files.  Finalize1 is responsible for sorting duty,
-    # and once all project files are sorted, Finalize2 can come in and update
-    # these references.
-
-    # To support making a "test runner" target that will run all the tests
-    # that are direct dependents of any given target, we look for
-    # xcode_create_dependents_test_runner being set on an Aggregate target,
-    # and generate a second target that will run the tests runners found under
-    # the marked target.
-    for bf_tgt in self.build_file_dict['targets']:
-      if int(bf_tgt.get('xcode_create_dependents_test_runner', 0)):
-        tgt_name = bf_tgt['target_name']
-        toolset = bf_tgt['toolset']
-        qualified_target = gyp.common.QualifiedTarget(self.gyp_path,
-                                                      tgt_name, toolset)
-        xcode_target = xcode_targets[qualified_target]
-        if isinstance(xcode_target, gyp.xcodeproj_file.PBXAggregateTarget):
-          # Collect all the run test targets.
-          all_run_tests = []
-          pbxtds = xcode_target.GetProperty('dependencies')
-          for pbxtd in pbxtds:
-            pbxcip = pbxtd.GetProperty('targetProxy')
-            dependency_xct = pbxcip.GetProperty('remoteGlobalIDString')
-            if hasattr(dependency_xct, 'test_runner'):
-              all_run_tests.append(dependency_xct.test_runner)
-
-          # Directly depend on all the runners as they depend on the target
-          # that builds them.
-          if len(all_run_tests) > 0:
-            run_all_target = gyp.xcodeproj_file.PBXAggregateTarget({
-                  'name':        'Run %s Tests' % tgt_name,
-                  'productName': tgt_name,
-                },
-                parent=self.project)
-            for run_test_target in all_run_tests:
-              run_all_target.AddDependency(run_test_target)
-
-            # Insert the test runner after the related target.
-            idx = self.project._properties['targets'].index(xcode_target)
-            self.project._properties['targets'].insert(idx + 1, run_all_target)
-
-    # Update all references to other projects, to make sure that the lists of
-    # remote products are complete.  Otherwise, Xcode will fill them in when
-    # it opens the project file, which will result in unnecessary diffs.
-    # TODO(mark): This is evil because it relies on internal knowledge of
-    # PBXProject._other_pbxprojects.
-    for other_pbxproject in self.project._other_pbxprojects.keys():
-      self.project.AddOrGetProjectReference(other_pbxproject)
-
-    self.project.SortRemoteProductReferences()
-
-    # Give everything an ID.
-    self.project_file.ComputeIDs()
-
-    # Make sure that no two objects in the project file have the same ID.  If
-    # multiple objects wind up with the same ID, upon loading the file, Xcode
-    # will only recognize one object (the last one in the file?) and the
-    # results are unpredictable.
-    self.project_file.EnsureNoIDCollisions()
-
-  def Write(self):
-    # Write the project file to a temporary location first.  Xcode watches for
-    # changes to the project file and presents a UI sheet offering to reload
-    # the project when it does change.  However, in some cases, especially when
-    # multiple projects are open or when Xcode is busy, things don't work so
-    # seamlessly.  Sometimes, Xcode is able to detect that a project file has
-    # changed but can't unload it because something else is referencing it.
-    # To mitigate this problem, and to avoid even having Xcode present the UI
-    # sheet when an open project is rewritten for inconsequential changes, the
-    # project file is written to a temporary file in the xcodeproj directory
-    # first.  The new temporary file is then compared to the existing project
-    # file, if any.  If they differ, the new file replaces the old; otherwise,
-    # the new project file is simply deleted.  Xcode properly detects a file
-    # being renamed over an open project file as a change and so it remains
-    # able to present the "project file changed" sheet under this system.
-    # Writing to a temporary file first also avoids the possible problem of
-    # Xcode rereading an incomplete project file.
-    (output_fd, new_pbxproj_path) = \
-        tempfile.mkstemp(suffix='.tmp', prefix='project.pbxproj.gyp.',
-                         dir=self.path)
-
-    try:
-      output_file = os.fdopen(output_fd, 'wb')
-
-      self.project_file.Print(output_file)
-      output_file.close()
-
-      pbxproj_path = os.path.join(self.path, 'project.pbxproj')
-
-      same = False
-      try:
-        same = filecmp.cmp(pbxproj_path, new_pbxproj_path, False)
-      except OSError, e:
-        if e.errno != errno.ENOENT:
-          raise
-
-      if same:
-        # The new file is identical to the old one, just get rid of the new
-        # one.
-        os.unlink(new_pbxproj_path)
-      else:
-        # The new file is different from the old one, or there is no old one.
-        # Rename the new file to the permanent name.
-        #
-        # tempfile.mkstemp uses an overly restrictive mode, resulting in a
-        # file that can only be read by the owner, regardless of the umask.
-        # There's no reason to not respect the umask here, which means that
-        # an extra hoop is required to fetch it and reset the new file's mode.
-        #
-        # No way to get the umask without setting a new one?  Set a safe one
-        # and then set it back to the old value.
-        umask = os.umask(077)
-        os.umask(umask)
-
-        os.chmod(new_pbxproj_path, 0666 & ~umask)
-        os.rename(new_pbxproj_path, pbxproj_path)
-
-    except Exception:
-      # Don't leave turds behind.  In fact, if this code was responsible for
-      # creating the xcodeproj directory, get rid of that too.
-      os.unlink(new_pbxproj_path)
-      if self.created_dir:
-        shutil.rmtree(self.path, True)
-      raise
-
-
-cached_xcode_version = None
-def InstalledXcodeVersion():
-  """Fetches the installed version of Xcode, returns empty string if it is
-  unable to figure it out."""
-
-  global cached_xcode_version
-  if not cached_xcode_version is None:
-    return cached_xcode_version
-
-  # Default to an empty string
-  cached_xcode_version = ''
-
-  # Collect the xcodebuild's version information.
-  try:
-    import subprocess
-    cmd = ['/usr/bin/xcodebuild', '-version']
-    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-    xcodebuild_version_info = proc.communicate()[0]
-    # Any error, return empty string
-    if proc.returncode:
-      xcodebuild_version_info = ''
-  except OSError:
-    # We failed to launch the tool
-    xcodebuild_version_info = ''
-
-  # Pull out the Xcode version itself.
-  match_line = re.search('^Xcode (.*)$', xcodebuild_version_info, re.MULTILINE)
-  if match_line:
-    cached_xcode_version = match_line.group(1)
-  # Done!
-  return cached_xcode_version
-
-
-def AddSourceToTarget(source, type, pbxp, xct):
-  # TODO(mark): Perhaps source_extensions and library_extensions can be made a
-  # little bit fancier.
-  source_extensions = ['c', 'cc', 'cpp', 'cxx', 'm', 'mm', 's']
-
-  # .o is conceptually more of a "source" than a "library," but Xcode thinks
-  # of "sources" as things to compile and "libraries" (or "frameworks") as
-  # things to link with. Adding an object file to an Xcode target's frameworks
-  # phase works properly.
-  library_extensions = ['a', 'dylib', 'framework', 'o']
-
-  basename = posixpath.basename(source)
-  (root, ext) = posixpath.splitext(basename)
-  if ext:
-    ext = ext[1:].lower()
-
-  if ext in source_extensions and type != 'none':
-    xct.SourcesPhase().AddFile(source)
-  elif ext in library_extensions and type != 'none':
-    xct.FrameworksPhase().AddFile(source)
-  else:
-    # Files that aren't added to a sources or frameworks build phase can still
-    # go into the project file, just not as part of a build phase.
-    pbxp.AddOrGetFileInRootGroup(source)
-
-
-def AddResourceToTarget(resource, pbxp, xct):
-  # TODO(mark): Combine with AddSourceToTarget above?  Or just inline this call
-  # where it's used.
-  xct.ResourcesPhase().AddFile(resource)
-
-
-def AddHeaderToTarget(header, pbxp, xct, is_public):
-  # TODO(mark): Combine with AddSourceToTarget above?  Or just inline this call
-  # where it's used.
-  settings = '{ATTRIBUTES = (%s, ); }' % ('Private', 'Public')[is_public]
-  xct.HeadersPhase().AddFile(header, settings)
-
-
-_xcode_variable_re = re.compile('(\$\((.*?)\))')
-def ExpandXcodeVariables(string, expansions):
-  """Expands Xcode-style $(VARIABLES) in string per the expansions dict.
-
-  In some rare cases, it is appropriate to expand Xcode variables when a
-  project file is generated.  For any substring $(VAR) in string, if VAR is a
-  key in the expansions dict, $(VAR) will be replaced with expansions[VAR].
-  Any $(VAR) substring in string for which VAR is not a key in the expansions
-  dict will remain in the returned string.
-  """
-
-  matches = _xcode_variable_re.findall(string)
-  if matches == None:
-    return string
-
-  matches.reverse()
-  for match in matches:
-    (to_replace, variable) = match
-    if not variable in expansions:
-      continue
-
-    replacement = expansions[variable]
-    string = re.sub(re.escape(to_replace), replacement, string)
-
-  return string
-
-
-def EscapeXCodeArgument(s):
-  """We must escape the arguments that we give to XCode so that it knows not to
-     split on spaces and to respect backslash and quote literals."""
-  s = s.replace('\\', '\\\\')
-  s = s.replace('"', '\\"')
-  return '"' + s + '"'
-
-
-
-def PerformBuild(data, configurations, params):
-  options = params['options']
-
-  for build_file, build_file_dict in data.iteritems():
-    (build_file_root, build_file_ext) = os.path.splitext(build_file)
-    if build_file_ext != '.gyp':
-      continue
-    xcodeproj_path = build_file_root + options.suffix + '.xcodeproj'
-    if options.generator_output:
-      xcodeproj_path = os.path.join(options.generator_output, xcodeproj_path)
-
-  for config in configurations:
-    arguments = ['xcodebuild', '-project', xcodeproj_path]
-    arguments += ['-configuration', config]
-    print "Building [%s]: %s" % (config, arguments)
-    subprocess.check_call(arguments)
-
-
-def GenerateOutput(target_list, target_dicts, data, params):
-  options = params['options']
-  generator_flags = params.get('generator_flags', {})
-  parallel_builds = generator_flags.get('xcode_parallel_builds', True)
-  serialize_all_tests = \
-      generator_flags.get('xcode_serialize_all_test_runs', True)
-  project_version = generator_flags.get('xcode_project_version', None)
-  skip_excluded_files = \
-      not generator_flags.get('xcode_list_excluded_files', True)
-  xcode_projects = {}
-  for build_file, build_file_dict in data.iteritems():
-    (build_file_root, build_file_ext) = os.path.splitext(build_file)
-    if build_file_ext != '.gyp':
-      continue
-    xcodeproj_path = build_file_root + options.suffix + '.xcodeproj'
-    if options.generator_output:
-      xcodeproj_path = os.path.join(options.generator_output, xcodeproj_path)
-    xcp = XcodeProject(build_file, xcodeproj_path, build_file_dict)
-    xcode_projects[build_file] = xcp
-    pbxp = xcp.project
-
-    if parallel_builds:
-      pbxp.SetProperty('attributes',
-                       {'BuildIndependentTargetsInParallel': 'YES'})
-    if project_version:
-      xcp.project_file.SetXcodeVersion(project_version)
-
-    # Add gyp/gypi files to project
-    if not generator_flags.get('standalone'):
-      main_group = pbxp.GetProperty('mainGroup')
-      build_group = gyp.xcodeproj_file.PBXGroup({'name': 'Build'})
-      main_group.AppendChild(build_group)
-      for included_file in build_file_dict['included_files']:
-        build_group.AddOrGetFileByPath(included_file, False)
-
-  xcode_targets = {}
-  xcode_target_to_target_dict = {}
-  for qualified_target in target_list:
-    [build_file, target_name, toolset] = \
-        gyp.common.ParseQualifiedTarget(qualified_target)
-
-    spec = target_dicts[qualified_target]
-    if spec['toolset'] != 'target':
-      raise Exception(
-          'Multiple toolsets not supported in xcode build (target %s)' %
-          qualified_target)
-    configuration_names = [spec['default_configuration']]
-    for configuration_name in sorted(spec['configurations'].keys()):
-      if configuration_name not in configuration_names:
-        configuration_names.append(configuration_name)
-    xcp = xcode_projects[build_file]
-    pbxp = xcp.project
-
-    # Set up the configurations for the target according to the list of names
-    # supplied.
-    xccl = CreateXCConfigurationList(configuration_names)
-
-    # Create an XCTarget subclass object for the target. The type with
-    # "+bundle" appended will be used if the target has "mac_bundle" set.
-    # loadable_modules not in a mac_bundle are mapped to
-    # com.googlecode.gyp.xcode.bundle, a pseudo-type that xcode.py interprets
-    # to create a single-file mh_bundle.
-    _types = {
-      'executable':             'com.apple.product-type.tool',
-      'loadable_module':        'com.googlecode.gyp.xcode.bundle',
-      'shared_library':         'com.apple.product-type.library.dynamic',
-      'static_library':         'com.apple.product-type.library.static',
-      'executable+bundle':      'com.apple.product-type.application',
-      'loadable_module+bundle': 'com.apple.product-type.bundle',
-      'shared_library+bundle':  'com.apple.product-type.framework',
-    }
-
-    target_properties = {
-      'buildConfigurationList': xccl,
-      'name':                   target_name,
-    }
-
-    type = spec['type']
-    is_bundle = int(spec.get('mac_bundle', 0))
-    if type != 'none':
-      type_bundle_key = type
-      if is_bundle:
-        type_bundle_key += '+bundle'
-      xctarget_type = gyp.xcodeproj_file.PBXNativeTarget
-      try:
-        target_properties['productType'] = _types[type_bundle_key]
-      except KeyError, e:
-        gyp.common.ExceptionAppend(e, "-- unknown product type while "
-                                   "writing target %s" % target_name)
-        raise
-    else:
-      xctarget_type = gyp.xcodeproj_file.PBXAggregateTarget
-      assert not is_bundle, (
-          'mac_bundle targets cannot have type none (target "%s")' %
-          target_name)
-
-    target_product_name = spec.get('product_name')
-    if target_product_name is not None:
-      target_properties['productName'] = target_product_name
-
-    xct = xctarget_type(target_properties, parent=pbxp,
-                        force_outdir=spec.get('product_dir'),
-                        force_prefix=spec.get('product_prefix'),
-                        force_extension=spec.get('product_extension'))
-    pbxp.AppendProperty('targets', xct)
-    xcode_targets[qualified_target] = xct
-    xcode_target_to_target_dict[xct] = spec
-
-    spec_actions = spec.get('actions', [])
-    spec_rules = spec.get('rules', [])
-
-    # Xcode has some "issues" with checking dependencies for the "Compile
-    # sources" step with any source files/headers generated by actions/rules.
-    # To work around this, if a target is building anything directly (not
-    # type "none"), then a second target is used to run the GYP actions/rules
-    # and is made a dependency of this target.  This way the work is done
-    # before the dependency checks for what should be recompiled.
-    support_xct = None
-    if type != 'none' and (spec_actions or spec_rules):
-      support_xccl = CreateXCConfigurationList(configuration_names);
-      support_target_properties = {
-        'buildConfigurationList': support_xccl,
-        'name':                   target_name + ' Support',
-      }
-      if target_product_name:
-        support_target_properties['productName'] = \
-            target_product_name + ' Support'
-      support_xct = \
-          gyp.xcodeproj_file.PBXAggregateTarget(support_target_properties,
-                                                parent=pbxp)
-      pbxp.AppendProperty('targets', support_xct)
-      xct.AddDependency(support_xct)
-    # Hang the support target off the main target so it can be tested/found
-    # by the generator during Finalize.
-    xct.support_target = support_xct
-
-    prebuild_index = 0
-
-    # Add custom shell script phases for "actions" sections.
-    for action in spec_actions:
-      # There's no need to write anything into the script to ensure that the
-      # output directories already exist, because Xcode will look at the
-      # declared outputs and automatically ensure that they exist for us.
-
-      # Do we have a message to print when this action runs?
-      message = action.get('message')
-      if message:
-        message = 'echo note: ' + gyp.common.EncodePOSIXShellArgument(message)
-      else:
-        message = ''
-
-      # Turn the list into a string that can be passed to a shell.
-      action_string = gyp.common.EncodePOSIXShellList(action['action'])
-
-      # Convert Xcode-type variable references to sh-compatible environment
-      # variable references.
-      message_sh = gyp.xcodeproj_file.ConvertVariablesToShellSyntax(message)
-      action_string_sh = gyp.xcodeproj_file.ConvertVariablesToShellSyntax(
-        action_string)
-
-      script = ''
-      # Include the optional message
-      if message_sh:
-        script += message_sh + '\n'
-      # Be sure the script runs in exec, and that if exec fails, the script
-      # exits signalling an error.
-      script += 'exec ' + action_string_sh + '\nexit 1\n'
-      ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase({
-            'inputPaths': action['inputs'],
-            'name': 'Action "' + action['action_name'] + '"',
-            'outputPaths': action['outputs'],
-            'shellScript': script,
-            'showEnvVarsInLog': 0,
-          })
-
-      if support_xct:
-        support_xct.AppendProperty('buildPhases', ssbp)
-      else:
-        # TODO(mark): this assumes too much knowledge of the internals of
-        # xcodeproj_file; some of these smarts should move into xcodeproj_file
-        # itself.
-        xct._properties['buildPhases'].insert(prebuild_index, ssbp)
-        prebuild_index = prebuild_index + 1
-
-      # TODO(mark): Should verify that at most one of these is specified.
-      if int(action.get('process_outputs_as_sources', False)):
-        for output in action['outputs']:
-          AddSourceToTarget(output, type, pbxp, xct)
-
-      if int(action.get('process_outputs_as_mac_bundle_resources', False)):
-        for output in action['outputs']:
-          AddResourceToTarget(output, pbxp, xct)
-
-    # tgt_mac_bundle_resources holds the list of bundle resources so
-    # the rule processing can check against it.
-    if is_bundle:
-      tgt_mac_bundle_resources = spec.get('mac_bundle_resources', [])
-    else:
-      tgt_mac_bundle_resources = []
-
-    # Add custom shell script phases driving "make" for "rules" sections.
-    #
-    # Xcode's built-in rule support is almost powerful enough to use directly,
-    # but there are a few significant deficiencies that render them unusable.
-    # There are workarounds for some of its inadequacies, but in aggregate,
-    # the workarounds added complexity to the generator, and some workarounds
-    # actually require input files to be crafted more carefully than I'd like.
-    # Consequently, until Xcode rules are made more capable, "rules" input
-    # sections will be handled in Xcode output by shell script build phases
-    # performed prior to the compilation phase.
-    #
-    # The following problems with Xcode rules were found.  The numbers are
-    # Apple radar IDs.  I hope that these shortcomings are addressed, I really
-    # liked having the rules handled directly in Xcode during the period that
-    # I was prototyping this.
-    #
-    # 6588600 Xcode compiles custom script rule outputs too soon, compilation
-    #         fails.  This occurs when rule outputs from distinct inputs are
-    #         interdependent.  The only workaround is to put rules and their
-    #         inputs in a separate target from the one that compiles the rule
-    #         outputs.  This requires input file cooperation and it means that
-    #         process_outputs_as_sources is unusable.
-    # 6584932 Need to declare that custom rule outputs should be excluded from
-    #         compilation.  A possible workaround is to lie to Xcode about a
-    #         rule's output, giving it a dummy file it doesn't know how to
-    #         compile.  The rule action script would need to touch the dummy.
-    # 6584839 I need a way to declare additional inputs to a custom rule.
-    #         A possible workaround is a shell script phase prior to
-    #         compilation that touches a rule's primary input files if any
-    #         would-be additional inputs are newer than the output.  Modifying
-    #         the source tree - even just modification times - feels dirty.
-    # 6564240 Xcode "custom script" build rules always dump all environment
-    #         variables.  This is a low-prioroty problem and is not a
-    #         show-stopper.
-    rules_by_ext = {}
-    for rule in spec_rules:
-      rules_by_ext[rule['extension']] = rule
-
-      # First, some definitions:
-      #
-      # A "rule source" is a file that was listed in a target's "sources"
-      # list and will have a rule applied to it on the basis of matching the
-      # rule's "extensions" attribute.  Rule sources are direct inputs to
-      # rules.
-      #
-      # Rule definitions may specify additional inputs in their "inputs"
-      # attribute.  These additional inputs are used for dependency tracking
-      # purposes.
-      #
-      # A "concrete output" is a rule output with input-dependent variables
-      # resolved.  For example, given a rule with:
-      #   'extension': 'ext', 'outputs': ['$(INPUT_FILE_BASE).cc'],
-      # if the target's "sources" list contained "one.ext" and "two.ext",
-      # the "concrete output" for rule input "two.ext" would be "two.cc".  If
-      # a rule specifies multiple outputs, each input file that the rule is
-      # applied to will have the same number of concrete outputs.
-      #
-      # If any concrete outputs are outdated or missing relative to their
-      # corresponding rule_source or to any specified additional input, the
-      # rule action must be performed to generate the concrete outputs.
-
-      # concrete_outputs_by_rule_source will have an item at the same index
-      # as the rule['rule_sources'] that it corresponds to.  Each item is a
-      # list of all of the concrete outputs for the rule_source.
-      concrete_outputs_by_rule_source = []
-
-      # concrete_outputs_all is a flat list of all concrete outputs that this
-      # rule is able to produce, given the known set of input files
-      # (rule_sources) that apply to it.
-      concrete_outputs_all = []
-
-      # messages & actions are keyed by the same indices as rule['rule_sources']
-      # and concrete_outputs_by_rule_source.  They contain the message and
-      # action to perform after resolving input-dependent variables.  The
-      # message is optional, in which case None is stored for each rule source.
-      messages = []
-      actions = []
-
-      for rule_source in rule.get('rule_sources', []):
-        rule_source_dirname, rule_source_basename = \
-            posixpath.split(rule_source)
-        (rule_source_root, rule_source_ext) = \
-            posixpath.splitext(rule_source_basename)
-
-        # These are the same variable names that Xcode uses for its own native
-        # rule support.  Because Xcode's rule engine is not being used, they
-        # need to be expanded as they are written to the makefile.
-        rule_input_dict = {
-          'INPUT_FILE_BASE':   rule_source_root,
-          'INPUT_FILE_SUFFIX': rule_source_ext,
-          'INPUT_FILE_NAME':   rule_source_basename,
-          'INPUT_FILE_PATH':   rule_source,
-          'INPUT_FILE_DIRNAME': rule_source_dirname,
-        }
-
-        concrete_outputs_for_this_rule_source = []
-        for output in rule.get('outputs', []):
-          # Fortunately, Xcode and make both use $(VAR) format for their
-          # variables, so the expansion is the only transformation necessary.
-          # Any remaning $(VAR)-type variables in the string can be given
-          # directly to make, which will pick up the correct settings from
-          # what Xcode puts into the environment.
-          concrete_output = ExpandXcodeVariables(output, rule_input_dict)
-          concrete_outputs_for_this_rule_source.append(concrete_output)
-
-          # Add all concrete outputs to the project.
-          pbxp.AddOrGetFileInRootGroup(concrete_output)
-
-        concrete_outputs_by_rule_source.append( \
-            concrete_outputs_for_this_rule_source)
-        concrete_outputs_all.extend(concrete_outputs_for_this_rule_source)
-
-        # TODO(mark): Should verify that at most one of these is specified.
-        if int(rule.get('process_outputs_as_sources', False)):
-          for output in concrete_outputs_for_this_rule_source:
-            AddSourceToTarget(output, type, pbxp, xct)
-
-        # If the file came from the mac_bundle_resources list or if the rule
-        # is marked to process outputs as bundle resource, do so.
-        was_mac_bundle_resource = rule_source in tgt_mac_bundle_resources
-        if was_mac_bundle_resource or \
-            int(rule.get('process_outputs_as_mac_bundle_resources', False)):
-          for output in concrete_outputs_for_this_rule_source:
-            AddResourceToTarget(output, pbxp, xct)
-
-        # Do we have a message to print when this rule runs?
-        message = rule.get('message')
-        if message:
-          message = gyp.common.EncodePOSIXShellArgument(message)
-          message = ExpandXcodeVariables(message, rule_input_dict)
-        messages.append(message)
-
-        # Turn the list into a string that can be passed to a shell.
-        action_string = gyp.common.EncodePOSIXShellList(rule['action'])
-
-        action = ExpandXcodeVariables(action_string, rule_input_dict)
-        actions.append(action)
-
-      if len(concrete_outputs_all) > 0:
-        # TODO(mark): There's a possibilty for collision here.  Consider
-        # target "t" rule "A_r" and target "t_A" rule "r".
-        makefile_name = '%s.make' % re.sub(
-            '[^a-zA-Z0-9_]', '_' , '%s_%s' % (target_name, rule['rule_name']))
-        makefile_path = os.path.join(xcode_projects[build_file].path,
-                                     makefile_name)
-        # TODO(mark): try/close?  Write to a temporary file and swap it only
-        # if it's got changes?
-        makefile = open(makefile_path, 'wb')
-
-        # make will build the first target in the makefile by default.  By
-        # convention, it's called "all".  List all (or at least one)
-        # concrete output for each rule source as a prerequisite of the "all"
-        # target.
-        makefile.write('all: \\\n')
-        for concrete_output_index in \
-            xrange(0, len(concrete_outputs_by_rule_source)):
-          # Only list the first (index [0]) concrete output of each input
-          # in the "all" target.  Otherwise, a parallel make (-j > 1) would
-          # attempt to process each input multiple times simultaneously.
-          # Otherwise, "all" could just contain the entire list of
-          # concrete_outputs_all.
-          concrete_output = \
-              concrete_outputs_by_rule_source[concrete_output_index][0]
-          if concrete_output_index == len(concrete_outputs_by_rule_source) - 1:
-            eol = ''
-          else:
-            eol = ' \\'
-          makefile.write('    %s%s\n' % (concrete_output, eol))
-
-        for (rule_source, concrete_outputs, message, action) in \
-            zip(rule['rule_sources'], concrete_outputs_by_rule_source,
-                messages, actions):
-          makefile.write('\n')
-
-          # Add a rule that declares it can build each concrete output of a
-          # rule source.  Collect the names of the directories that are
-          # required.
-          concrete_output_dirs = []
-          for concrete_output_index in xrange(0, len(concrete_outputs)):
-            concrete_output = concrete_outputs[concrete_output_index]
-            if concrete_output_index == 0:
-              bol = ''
-            else:
-              bol = '    '
-            makefile.write('%s%s \\\n' % (bol, concrete_output))
-
-            concrete_output_dir = posixpath.dirname(concrete_output)
-            if (concrete_output_dir and
-                concrete_output_dir not in concrete_output_dirs):
-              concrete_output_dirs.append(concrete_output_dir)
-
-          makefile.write('    : \\\n')
-
-          # The prerequisites for this rule are the rule source itself and
-          # the set of additional rule inputs, if any.
-          prerequisites = [rule_source]
-          prerequisites.extend(rule.get('inputs', []))
-          for prerequisite_index in xrange(0, len(prerequisites)):
-            prerequisite = prerequisites[prerequisite_index]
-            if prerequisite_index == len(prerequisites) - 1:
-              eol = ''
-            else:
-              eol = ' \\'
-            makefile.write('    %s%s\n' % (prerequisite, eol))
-
-          # Make sure that output directories exist before executing the rule
-          # action.
-          if len(concrete_output_dirs) > 0:
-            makefile.write('\t@mkdir -p "%s"\n' %
-                           '" "'.join(concrete_output_dirs))
-
-          # The rule message and action have already had the necessary variable
-          # substitutions performed.
-          if message:
-            # Mark it with note: so Xcode picks it up in build output.
-            makefile.write('\t@echo note: %s\n' % message)
-          makefile.write('\t%s\n' % action)
-
-        makefile.close()
-
-        # It might be nice to ensure that needed output directories exist
-        # here rather than in each target in the Makefile, but that wouldn't
-        # work if there ever was a concrete output that had an input-dependent
-        # variable anywhere other than in the leaf position.
-
-        # Don't declare any inputPaths or outputPaths.  If they're present,
-        # Xcode will provide a slight optimization by only running the script
-        # phase if any output is missing or outdated relative to any input.
-        # Unfortunately, it will also assume that all outputs are touched by
-        # the script, and if the outputs serve as files in a compilation
-        # phase, they will be unconditionally rebuilt.  Since make might not
-        # rebuild everything that could be declared here as an output, this
-        # extra compilation activity is unnecessary.  With inputPaths and
-        # outputPaths not supplied, make will always be called, but it knows
-        # enough to not do anything when everything is up-to-date.
-
-        # To help speed things up, pass -j COUNT to make so it does some work
-        # in parallel.  Don't use ncpus because Xcode will build ncpus targets
-        # in parallel and if each target happens to have a rules step, there
-        # would be ncpus^2 things going.  With a machine that has 2 quad-core
-        # Xeons, a build can quickly run out of processes based on
-        # scheduling/other tasks, and randomly failing builds are no good.
-        script = \
-"""JOB_COUNT="$(/usr/sbin/sysctl -n hw.ncpu)"
-if [ "${JOB_COUNT}" -gt 4 ]; then
-  JOB_COUNT=4
-fi
-exec "${DEVELOPER_BIN_DIR}/make" -f "${PROJECT_FILE_PATH}/%s" -j "${JOB_COUNT}"
-exit 1
-""" % makefile_name
-        ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase({
-              'name': 'Rule "' + rule['rule_name'] + '"',
-              'shellScript': script,
-              'showEnvVarsInLog': 0,
-            })
-
-        if support_xct:
-          support_xct.AppendProperty('buildPhases', ssbp)
-        else:
-          # TODO(mark): this assumes too much knowledge of the internals of
-          # xcodeproj_file; some of these smarts should move into xcodeproj_file
-          # itself.
-          xct._properties['buildPhases'].insert(prebuild_index, ssbp)
-          prebuild_index = prebuild_index + 1
-
-      # Extra rule inputs also go into the project file.  Concrete outputs were
-      # already added when they were computed.
-      groups = ['inputs', 'inputs_excluded']
-      if skip_excluded_files:
-        groups = [x for x in groups if not x.endswith('_excluded')]
-      for group in groups:
-        for item in rule.get(group, []):
-          pbxp.AddOrGetFileInRootGroup(item)
-
-    # Add "sources".
-    for source in spec.get('sources', []):
-      (source_root, source_extension) = posixpath.splitext(source)
-      if source_extension[1:] not in rules_by_ext:
-        # AddSourceToTarget will add the file to a root group if it's not
-        # already there.
-        AddSourceToTarget(source, type, pbxp, xct)
-      else:
-        pbxp.AddOrGetFileInRootGroup(source)
-
-    # Add "mac_bundle_resources" and "mac_framework_private_headers" if
-    # it's a bundle of any type.
-    if is_bundle:
-      for resource in tgt_mac_bundle_resources:
-        (resource_root, resource_extension) = posixpath.splitext(resource)
-        if resource_extension[1:] not in rules_by_ext:
-          AddResourceToTarget(resource, pbxp, xct)
-        else:
-          pbxp.AddOrGetFileInRootGroup(resource)
-
-      for header in spec.get('mac_framework_private_headers', []):
-        AddHeaderToTarget(header, pbxp, xct, False)
-
-    # Add "mac_framework_headers". These can be valid for both frameworks
-    # and static libraries.
-    if is_bundle or type == 'static_library':
-      for header in spec.get('mac_framework_headers', []):
-        AddHeaderToTarget(header, pbxp, xct, True)
-
-    # Add "copies".
-    for copy_group in spec.get('copies', []):
-      pbxcp = gyp.xcodeproj_file.PBXCopyFilesBuildPhase({
-            'name': 'Copy to ' + copy_group['destination']
-          },
-          parent=xct)
-      dest = copy_group['destination']
-      if dest[0] not in ('/', '$'):
-        # Relative paths are relative to $(SRCROOT).
-        dest = '$(SRCROOT)/' + dest
-      pbxcp.SetDestination(dest)
-
-      # TODO(mark): The usual comment about this knowing too much about
-      # gyp.xcodeproj_file internals applies.
-      xct._properties['buildPhases'].insert(prebuild_index, pbxcp)
-
-      for file in copy_group['files']:
-        pbxcp.AddFile(file)
-
-    # Excluded files can also go into the project file.
-    if not skip_excluded_files:
-      for key in ['sources', 'mac_bundle_resources', 'mac_framework_headers',
-                  'mac_framework_private_headers']:
-        excluded_key = key + '_excluded'
-        for item in spec.get(excluded_key, []):
-          pbxp.AddOrGetFileInRootGroup(item)
-
-    # So can "inputs" and "outputs" sections of "actions" groups.
-    groups = ['inputs', 'inputs_excluded', 'outputs', 'outputs_excluded']
-    if skip_excluded_files:
-      groups = [x for x in groups if not x.endswith('_excluded')]
-    for action in spec.get('actions', []):
-      for group in groups:
-        for item in action.get(group, []):
-          # Exclude anything in BUILT_PRODUCTS_DIR.  They're products, not
-          # sources.
-          if not item.startswith('$(BUILT_PRODUCTS_DIR)/'):
-            pbxp.AddOrGetFileInRootGroup(item)
-
-    for postbuild in spec.get('postbuilds', []):
-      action_string_sh = gyp.common.EncodePOSIXShellList(postbuild['action'])
-      script = 'exec ' + action_string_sh + '\nexit 1\n'
-
-      # Make the postbuild step depend on the output of ld or ar from this
-      # target. Apparently putting the script step after the link step isn't
-      # sufficient to ensure proper ordering in all cases. With an input
-      # declared but no outputs, the script step should run every time, as
-      # desired.
-      ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase({
-            'inputPaths': ['$(BUILT_PRODUCTS_DIR)/$(EXECUTABLE_PATH)'],
-            'name': 'Postbuild "' + postbuild['postbuild_name'] + '"',
-            'shellScript': script,
-            'showEnvVarsInLog': 0,
-          })
-      xct.AppendProperty('buildPhases', ssbp)
-
-    # Add dependencies before libraries, because adding a dependency may imply
-    # adding a library.  It's preferable to keep dependencies listed first
-    # during a link phase so that they can override symbols that would
-    # otherwise be provided by libraries, which will usually include system
-    # libraries.  On some systems, ld is finicky and even requires the
-    # libraries to be ordered in such a way that unresolved symbols in
-    # earlier-listed libraries may only be resolved by later-listed libraries.
-    # The Mac linker doesn't work that way, but other platforms do, and so
-    # their linker invocations need to be constructed in this way.  There's
-    # no compelling reason for Xcode's linker invocations to differ.
-
-    if 'dependencies' in spec:
-      for dependency in spec['dependencies']:
-        xct.AddDependency(xcode_targets[dependency])
-        # The support project also gets the dependencies (in case they are
-        # needed for the actions/rules to work).
-        if support_xct:
-          support_xct.AddDependency(xcode_targets[dependency])
-
-    if 'libraries' in spec:
-      for library in spec['libraries']:
-        xct.FrameworksPhase().AddFile(library)
-        # Add the library's directory to LIBRARY_SEARCH_PATHS if necessary.
-        # I wish Xcode handled this automatically.
-        library_dir = posixpath.dirname(library)
-        if library_dir not in xcode_standard_library_dirs and (
-            not xct.HasBuildSetting(_library_search_paths_var) or
-            library_dir not in xct.GetBuildSetting(_library_search_paths_var)):
-          xct.AppendBuildSetting(_library_search_paths_var, library_dir)
-
-    for configuration_name in configuration_names:
-      configuration = spec['configurations'][configuration_name]
-      xcbc = xct.ConfigurationNamed(configuration_name)
-      for include_dir in configuration.get('mac_framework_dirs', []):
-        xcbc.AppendBuildSetting('FRAMEWORK_SEARCH_PATHS', include_dir)
-      for include_dir in configuration.get('include_dirs', []):
-        xcbc.AppendBuildSetting('HEADER_SEARCH_PATHS', include_dir)
-      if 'defines' in configuration:
-        for define in configuration['defines']:
-          set_define = EscapeXCodeArgument(define)
-          xcbc.AppendBuildSetting('GCC_PREPROCESSOR_DEFINITIONS', set_define)
-      if 'xcode_settings' in configuration:
-        for xck, xcv in configuration['xcode_settings'].iteritems():
-          xcbc.SetBuildSetting(xck, xcv)
-      if 'xcode_config_file' in configuration:
-        config_ref = pbxp.AddOrGetFileInRootGroup(
-            configuration['xcode_config_file'])
-        xcbc.SetBaseConfiguration(config_ref)
-
-  build_files = []
-  for build_file, build_file_dict in data.iteritems():
-    if build_file.endswith('.gyp'):
-      build_files.append(build_file)
-
-  for build_file in build_files:
-    xcode_projects[build_file].Finalize1(xcode_targets, serialize_all_tests)
-
-  for build_file in build_files:
-    xcode_projects[build_file].Finalize2(xcode_targets,
-                                         xcode_target_to_target_dict)
-
-  for build_file in build_files:
-    xcode_projects[build_file].Write()
diff --git a/tools/gyp/pylib/gyp/input.py b/tools/gyp/pylib/gyp/input.py
deleted file mode 100755
index aa7fc31..0000000
--- a/tools/gyp/pylib/gyp/input.py
+++ /dev/null
@@ -1,2755 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from compiler.ast import Const
-from compiler.ast import Dict
-from compiler.ast import Discard
-from compiler.ast import List
-from compiler.ast import Module
-from compiler.ast import Node
-from compiler.ast import Stmt
-import compiler
-import copy
-import gyp.common
-import multiprocessing
-import optparse
-import os.path
-import re
-import shlex
-import signal
-import subprocess
-import sys
-import threading
-import time
-from gyp.common import GypError
-
-
-_DEBUG_DEPTH = False
-
-
-# A list of types that are treated as linkable.
-linkable_types = ['executable', 'shared_library', 'loadable_module']
-
-# A list of sections that contain links to other targets.
-dependency_sections = ['dependencies', 'export_dependent_settings']
-
-# base_path_sections is a list of sections defined by GYP that contain
-# pathnames.  The generators can provide more keys, the two lists are merged
-# into path_sections, but you should call IsPathSection instead of using either
-# list directly.
-base_path_sections = [
-  'destination',
-  'files',
-  'include_dirs',
-  'include_dirs_target',
-  'include_dirs_host',
-  'inputs',
-  'libraries',
-  'outputs',
-  'sources',
-]
-path_sections = []
-
-
-def IsPathSection(section):
-  # If section ends in one of these characters, it's applied to a section
-  # without the trailing characters.  '/' is notably absent from this list,
-  # because there's no way for a regular expression to be treated as a path.
-  while section[-1:] in ('=', '+', '?', '!'):
-    section = section[0:-1]
-
-  if section in path_sections or \
-     section.endswith('_dir') or section.endswith('_dirs') or \
-     section.endswith('_file') or section.endswith('_files') or \
-     section.endswith('_path') or section.endswith('_paths'):
-    return True
-  return False
-
-
-# base_non_configuraiton_keys is a list of key names that belong in the target
-# itself and should not be propagated into its configurations.  It is merged
-# with a list that can come from the generator to
-# create non_configuration_keys.
-base_non_configuration_keys = [
-  # Sections that must exist inside targets and not configurations.
-  'actions',
-  'configurations',
-  'copies',
-  'default_configuration',
-  'default_project',
-  'dependencies',
-  'dependencies_original',
-  'link_languages',
-  'libraries',
-  'postbuilds',
-  'product_dir',
-  'product_extension',
-  'product_name',
-  'product_prefix',
-  'rules',
-  'run_as',
-  'sources',
-  'standalone_static_library',
-  'suppress_wildcard',
-  'target_name',
-  'toolset',
-  'toolsets',
-  'type',
-  'variants',
-
-  # Sections that can be found inside targets or configurations, but that
-  # should not be propagated from targets into their configurations.
-  'variables',
-]
-non_configuration_keys = []
-
-# Keys that do not belong inside a configuration dictionary.
-invalid_configuration_keys = [
-  'actions',
-  'all_dependent_settings',
-  'configurations',
-  'dependencies',
-  'direct_dependent_settings',
-  'link_settings',
-  'sources',
-  'standalone_static_library',
-  'target_name',
-  'type',
-]
-
-# Controls how the generator want the build file paths.
-absolute_build_file_paths = False
-
-# Controls whether or not the generator supports multiple toolsets.
-multiple_toolsets = False
-
-# Paths for converting filelist paths to output paths: {
-#   toplevel,
-#   qualified_output_dir,
-# }
-generator_filelist_paths = None
-
-def GetIncludedBuildFiles(build_file_path, aux_data, included=None):
-  """Return a list of all build files included into build_file_path.
-
-  The returned list will contain build_file_path as well as all other files
-  that it included, either directly or indirectly.  Note that the list may
-  contain files that were included into a conditional section that evaluated
-  to false and was not merged into build_file_path's dict.
-
-  aux_data is a dict containing a key for each build file or included build
-  file.  Those keys provide access to dicts whose "included" keys contain
-  lists of all other files included by the build file.
-
-  included should be left at its default None value by external callers.  It
-  is used for recursion.
-
-  The returned list will not contain any duplicate entries.  Each build file
-  in the list will be relative to the current directory.
-  """
-
-  if included == None:
-    included = []
-
-  if build_file_path in included:
-    return included
-
-  included.append(build_file_path)
-
-  for included_build_file in aux_data[build_file_path].get('included', []):
-    GetIncludedBuildFiles(included_build_file, aux_data, included)
-
-  return included
-
-
-def CheckedEval(file_contents):
-  """Return the eval of a gyp file.
-
-  The gyp file is restricted to dictionaries and lists only, and
-  repeated keys are not allowed.
-
-  Note that this is slower than eval() is.
-  """
-
-  ast = compiler.parse(file_contents)
-  assert isinstance(ast, Module)
-  c1 = ast.getChildren()
-  assert c1[0] is None
-  assert isinstance(c1[1], Stmt)
-  c2 = c1[1].getChildren()
-  assert isinstance(c2[0], Discard)
-  c3 = c2[0].getChildren()
-  assert len(c3) == 1
-  return CheckNode(c3[0], [])
-
-
-def CheckNode(node, keypath):
-  if isinstance(node, Dict):
-    c = node.getChildren()
-    dict = {}
-    for n in range(0, len(c), 2):
-      assert isinstance(c[n], Const)
-      key = c[n].getChildren()[0]
-      if key in dict:
-        raise GypError("Key '" + key + "' repeated at level " +
-              repr(len(keypath) + 1) + " with key path '" +
-              '.'.join(keypath) + "'")
-      kp = list(keypath)  # Make a copy of the list for descending this node.
-      kp.append(key)
-      dict[key] = CheckNode(c[n + 1], kp)
-    return dict
-  elif isinstance(node, List):
-    c = node.getChildren()
-    children = []
-    for index, child in enumerate(c):
-      kp = list(keypath)  # Copy list.
-      kp.append(repr(index))
-      children.append(CheckNode(child, kp))
-    return children
-  elif isinstance(node, Const):
-    return node.getChildren()[0]
-  else:
-    raise TypeError, "Unknown AST node at key path '" + '.'.join(keypath) + \
-         "': " + repr(node)
-
-
-def LoadOneBuildFile(build_file_path, data, aux_data, variables, includes,
-                     is_target, depth, check):
-  if build_file_path in data:
-    return data[build_file_path]
-
-  if os.path.exists(build_file_path):
-    build_file_contents = open(build_file_path).read()
-  else:
-    raise GypError("%s not found (cwd: %s)" % (build_file_path, os.getcwd()))
-
-  build_file_data = None
-  try:
-    if check:
-      build_file_data = CheckedEval(build_file_contents)
-    else:
-      build_file_data = eval(build_file_contents, {'__builtins__': None},
-                             None)
-  except SyntaxError, e:
-    e.filename = build_file_path
-    raise
-  except Exception, e:
-    gyp.common.ExceptionAppend(e, 'while reading ' + build_file_path)
-    raise
-
-  data[build_file_path] = build_file_data
-  aux_data[build_file_path] = {}
-
-  # Scan for includes and merge them in.
-  try:
-    if is_target:
-      LoadBuildFileIncludesIntoDict(build_file_data, build_file_path, data,
-                                    aux_data, variables, includes, depth, check)
-    else:
-      LoadBuildFileIncludesIntoDict(build_file_data, build_file_path, data,
-                                    aux_data, variables, None, depth, check)
-  except Exception, e:
-    gyp.common.ExceptionAppend(e,
-                               'while reading includes of ' + build_file_path)
-    raise
-
-  return build_file_data
-
-
-def LoadBuildFileIncludesIntoDict(subdict, subdict_path, data, aux_data,
-                                  variables, includes, depth, check):
-  includes_list = []
-  if includes != None:
-    includes_list.extend(includes)
-  if 'includes' in subdict:
-    for include in subdict['includes']:
-      # expand environment & command line variables in include path.
-      include = ExpandVariables(include, False, variables, subdict_path)
-      # "include" is specified relative to subdict_path, so compute the real
-      # path to include by appending the provided "include" to the directory
-      # in which subdict_path resides.
-      relative_include = \
-          os.path.normpath(os.path.join(os.path.dirname(subdict_path), include))
-      includes_list.append(relative_include)
-    # Unhook the includes list, it's no longer needed.
-    del subdict['includes']
-
-  # Merge in the included files.
-  for include in includes_list:
-    if not 'included' in aux_data[subdict_path]:
-      aux_data[subdict_path]['included'] = []
-    aux_data[subdict_path]['included'].append(include)
-
-    gyp.DebugOutput(gyp.DEBUG_INCLUDES, "Loading Included File: '%s'" % include)
-
-    old_depth_source = variables['__DEPTH_SOURCE__']
-    _UpdateDepth(depth, include, variables)
-    MergeDicts(subdict,
-               LoadOneBuildFile(include, data, aux_data, variables,
-                                None, False, depth, check),
-               subdict_path, include)
-    _UpdateDepth(depth, old_depth_source, variables)
-
-  # Recurse into subdictionaries.
-  for k, v in subdict.iteritems():
-    if v.__class__ == dict:
-      LoadBuildFileIncludesIntoDict(v, subdict_path, data, aux_data, variables,
-                                    None, depth, check)
-    elif v.__class__ == list:
-      LoadBuildFileIncludesIntoList(v, subdict_path, data, aux_data, variables,
-                                    depth, check)
-
-
-# This recurses into lists so that it can look for dicts.
-def LoadBuildFileIncludesIntoList(sublist, sublist_path, data, aux_data,
-                                  variables, depth, check):
-  for item in sublist:
-    if item.__class__ == dict:
-      LoadBuildFileIncludesIntoDict(item, sublist_path, data, aux_data,
-                                    variables, None, depth, check)
-    elif item.__class__ == list:
-      LoadBuildFileIncludesIntoList(item, sublist_path, data, aux_data,
-                                    variables, depth, check)
-
-# Processes toolsets in all the targets. This recurses into condition entries
-# since they can contain toolsets as well.
-def ProcessToolsetsInDict(data):
-  if 'targets' in data:
-    target_list = data['targets']
-    new_target_list = []
-    for target in target_list:
-      # If this target already has an explicit 'toolset', and no 'toolsets'
-      # list, don't modify it further.
-      if 'toolset' in target and 'toolsets' not in target:
-        new_target_list.append(target)
-        continue
-      if multiple_toolsets:
-        toolsets = target.get('toolsets', ['target'])
-      else:
-        toolsets = ['target']
-      # Make sure this 'toolsets' definition is only processed once.
-      if 'toolsets' in target:
-        del target['toolsets']
-      if len(toolsets) > 0:
-        # Optimization: only do copies if more than one toolset is specified.
-        for build in toolsets[1:]:
-          new_target = copy.deepcopy(target)
-          new_target['toolset'] = build
-          new_target_list.append(new_target)
-        target['toolset'] = toolsets[0]
-        new_target_list.append(target)
-    data['targets'] = new_target_list
-  if 'conditions' in data:
-    for condition in data['conditions']:
-      if isinstance(condition, list):
-        for condition_dict in condition[1:]:
-          ProcessToolsetsInDict(condition_dict)
-
-
-def _UpdateDepth(depth, build_file_path, variables):
-  # If depth is set, predefine the DEPTH variable to be a relative path from
-  # this build file's directory to the directory identified by depth.
-  if depth:
-    # TODO(dglazkov) The backslash/forward-slash replacement at the end is a
-    # temporary measure. This should really be addressed by keeping all paths
-    # in POSIX until actual project generation.
-    d = gyp.common.RelativePath(depth, os.path.dirname(build_file_path))
-    if d == '':
-      variables['DEPTH'] = '.'
-    else:
-      variables['DEPTH'] = d.replace('\\', '/')
-    variables['__DEPTH_SOURCE__'] = build_file_path
-    if _DEBUG_DEPTH:
-      print '%s: %s -> DEPTH, %s -> __DEPTH_SOURCE__' % (
-          os.path.basename(build_file_path),
-          variables['DEPTH'],
-          os.path.basename(variables['__DEPTH_SOURCE__']))
-
-
-# TODO(mark): I don't love this name.  It just means that it's going to load
-# a build file that contains targets and is expected to provide a targets dict
-# that contains the targets...
-def LoadTargetBuildFile(build_file_path, data, aux_data, variables, includes,
-                        depth, check, load_dependencies):
-  _UpdateDepth(depth, build_file_path, variables)
-
-  # If the generator needs absolue paths, then do so.
-  if absolute_build_file_paths:
-    build_file_path = os.path.abspath(build_file_path)
-
-  if build_file_path in data['target_build_files']:
-    # Already loaded.
-    return False
-  data['target_build_files'].add(build_file_path)
-
-  gyp.DebugOutput(gyp.DEBUG_INCLUDES,
-                  "Loading Target Build File '%s'" % build_file_path)
-
-  build_file_data = LoadOneBuildFile(build_file_path, data, aux_data, variables,
-                                     includes, True, depth, check)
-
-  # Store DEPTH for later use in generators.
-  build_file_data['_DEPTH'] = depth
-
-  # Set up the included_files key indicating which .gyp files contributed to
-  # this target dict.
-  if 'included_files' in build_file_data:
-    raise GypError(build_file_path + ' must not contain included_files key')
-
-  included = GetIncludedBuildFiles(build_file_path, aux_data)
-  build_file_data['included_files'] = []
-  for included_file in included:
-    # included_file is relative to the current directory, but it needs to
-    # be made relative to build_file_path's directory.
-    included_relative = \
-        gyp.common.RelativePath(included_file,
-                                os.path.dirname(build_file_path))
-    build_file_data['included_files'].append(included_relative)
-
-  # Do a first round of toolsets expansion so that conditions can be defined
-  # per toolset.
-  ProcessToolsetsInDict(build_file_data)
-
-  # Apply "pre"/"early" variable expansions and condition evaluations.
-  ProcessVariablesAndConditionsInDict(
-      build_file_data, PHASE_EARLY, variables, build_file_path)
-
-  # Since some toolsets might have been defined conditionally, perform
-  # a second round of toolsets expansion now.
-  ProcessToolsetsInDict(build_file_data)
-
-  # Look at each project's target_defaults dict, and merge settings into
-  # targets.
-  if 'target_defaults' in build_file_data:
-    if 'targets' not in build_file_data:
-      raise GypError("Unable to find targets in build file %s" %
-                     build_file_path)
-
-    index = 0
-    while index < len(build_file_data['targets']):
-      # This procedure needs to give the impression that target_defaults is
-      # used as defaults, and the individual targets inherit from that.
-      # The individual targets need to be merged into the defaults.  Make
-      # a deep copy of the defaults for each target, merge the target dict
-      # as found in the input file into that copy, and then hook up the
-      # copy with the target-specific data merged into it as the replacement
-      # target dict.
-      old_target_dict = build_file_data['targets'][index]
-      new_target_dict = copy.deepcopy(build_file_data['target_defaults'])
-      MergeDicts(new_target_dict, old_target_dict,
-                 build_file_path, build_file_path)
-      build_file_data['targets'][index] = new_target_dict
-      index += 1
-
-    # No longer needed.
-    del build_file_data['target_defaults']
-
-  # Look for dependencies.  This means that dependency resolution occurs
-  # after "pre" conditionals and variable expansion, but before "post" -
-  # in other words, you can't put a "dependencies" section inside a "post"
-  # conditional within a target.
-
-  dependencies = []
-  if 'targets' in build_file_data:
-    for target_dict in build_file_data['targets']:
-      if 'dependencies' not in target_dict:
-        continue
-      for dependency in target_dict['dependencies']:
-        dependencies.append(
-            gyp.common.ResolveTarget(build_file_path, dependency, None)[0])
-
-  if load_dependencies:
-    for dependency in dependencies:
-      try:
-        LoadTargetBuildFile(dependency, data, aux_data, variables,
-                            includes, depth, check, load_dependencies)
-      except Exception, e:
-        gyp.common.ExceptionAppend(
-          e, 'while loading dependencies of %s' % build_file_path)
-        raise
-  else:
-    return (build_file_path, dependencies)
-
-
-def CallLoadTargetBuildFile(global_flags,
-                            build_file_path, data,
-                            aux_data, variables,
-                            includes, depth, check):
-  """Wrapper around LoadTargetBuildFile for parallel processing.
-
-     This wrapper is used when LoadTargetBuildFile is executed in
-     a worker process.
-  """
-
-  try:
-    signal.signal(signal.SIGINT, signal.SIG_IGN)
-
-    # Apply globals so that the worker process behaves the same.
-    for key, value in global_flags.iteritems():
-      globals()[key] = value
-
-    # Save the keys so we can return data that changed.
-    data_keys = set(data)
-    aux_data_keys = set(aux_data)
-
-    result = LoadTargetBuildFile(build_file_path, data,
-                                 aux_data, variables,
-                                 includes, depth, check, False)
-    if not result:
-      return result
-
-    (build_file_path, dependencies) = result
-
-    data_out = {}
-    for key in data:
-      if key == 'target_build_files':
-        continue
-      if key not in data_keys:
-        data_out[key] = data[key]
-    aux_data_out = {}
-    for key in aux_data:
-      if key not in aux_data_keys:
-        aux_data_out[key] = aux_data[key]
-
-    # This gets serialized and sent back to the main process via a pipe.
-    # It's handled in LoadTargetBuildFileCallback.
-    return (build_file_path,
-            data_out,
-            aux_data_out,
-            dependencies)
-  except Exception, e:
-    print "Exception: ", e
-    return None
-
-
-class ParallelProcessingError(Exception):
-  pass
-
-
-class ParallelState(object):
-  """Class to keep track of state when processing input files in parallel.
-
-  If build files are loaded in parallel, use this to keep track of
-  state during farming out and processing parallel jobs. It's stored
-  in a global so that the callback function can have access to it.
-  """
-
-  def __init__(self):
-    # The multiprocessing pool.
-    self.pool = None
-    # The condition variable used to protect this object and notify
-    # the main loop when there might be more data to process.
-    self.condition = None
-    # The "data" dict that was passed to LoadTargetBuildFileParallel
-    self.data = None
-    # The "aux_data" dict that was passed to LoadTargetBuildFileParallel
-    self.aux_data = None
-    # The number of parallel calls outstanding; decremented when a response
-    # was received.
-    self.pending = 0
-    # The set of all build files that have been scheduled, so we don't
-    # schedule the same one twice.
-    self.scheduled = set()
-    # A list of dependency build file paths that haven't been scheduled yet.
-    self.dependencies = []
-    # Flag to indicate if there was an error in a child process.
-    self.error = False
-
-  def LoadTargetBuildFileCallback(self, result):
-    """Handle the results of running LoadTargetBuildFile in another process.
-    """
-    self.condition.acquire()
-    if not result:
-      self.error = True
-      self.condition.notify()
-      self.condition.release()
-      return
-    (build_file_path0, data0, aux_data0, dependencies0) = result
-    self.data['target_build_files'].add(build_file_path0)
-    for key in data0:
-      self.data[key] = data0[key]
-    for key in aux_data0:
-      self.aux_data[key] = aux_data0[key]
-    for new_dependency in dependencies0:
-      if new_dependency not in self.scheduled:
-        self.scheduled.add(new_dependency)
-        self.dependencies.append(new_dependency)
-    self.pending -= 1
-    self.condition.notify()
-    self.condition.release()
-
-
-def LoadTargetBuildFileParallel(build_file_path, data, aux_data,
-                                variables, includes, depth, check):
-  parallel_state = ParallelState()
-  parallel_state.condition = threading.Condition()
-  parallel_state.dependencies = [build_file_path]
-  parallel_state.scheduled = set([build_file_path])
-  parallel_state.pending = 0
-  parallel_state.data = data
-  parallel_state.aux_data = aux_data
-
-  try:
-    parallel_state.condition.acquire()
-    while parallel_state.dependencies or parallel_state.pending:
-      if parallel_state.error:
-        break
-      if not parallel_state.dependencies:
-        parallel_state.condition.wait()
-        continue
-
-      dependency = parallel_state.dependencies.pop()
-
-      parallel_state.pending += 1
-      data_in = {}
-      data_in['target_build_files'] = data['target_build_files']
-      aux_data_in = {}
-      global_flags = {
-        'path_sections': globals()['path_sections'],
-        'non_configuration_keys': globals()['non_configuration_keys'],
-        'absolute_build_file_paths': globals()['absolute_build_file_paths'],
-        'multiple_toolsets': globals()['multiple_toolsets']}
-
-      if not parallel_state.pool:
-        parallel_state.pool = multiprocessing.Pool(8)
-      parallel_state.pool.apply_async(
-          CallLoadTargetBuildFile,
-          args = (global_flags, dependency,
-                  data_in, aux_data_in,
-                  variables, includes, depth, check),
-          callback = parallel_state.LoadTargetBuildFileCallback)
-  except KeyboardInterrupt, e:
-    parallel_state.pool.terminate()
-    raise e
-
-  parallel_state.condition.release()
-  if parallel_state.error:
-    sys.exit()
-
-
-# Look for the bracket that matches the first bracket seen in a
-# string, and return the start and end as a tuple.  For example, if
-# the input is something like "<(foo <(bar)) blah", then it would
-# return (1, 13), indicating the entire string except for the leading
-# "<" and trailing " blah".
-def FindEnclosingBracketGroup(input):
-  brackets = { '}': '{',
-               ']': '[',
-               ')': '(', }
-  stack = []
-  count = 0
-  start = -1
-  for char in input:
-    if char in brackets.values():
-      stack.append(char)
-      if start == -1:
-        start = count
-    if char in brackets.keys():
-      try:
-        last_bracket = stack.pop()
-      except IndexError:
-        return (-1, -1)
-      if last_bracket != brackets[char]:
-        return (-1, -1)
-      if len(stack) == 0:
-        return (start, count + 1)
-    count = count + 1
-  return (-1, -1)
-
-
-canonical_int_re = re.compile('^(0|-?[1-9][0-9]*)$')
-
-
-def IsStrCanonicalInt(string):
-  """Returns True if |string| is in its canonical integer form.
-
-  The canonical form is such that str(int(string)) == string.
-  """
-  if not isinstance(string, str) or not canonical_int_re.match(string):
-    return False
-
-  return True
-
-
-# This matches things like "<(asdf)", "<!(cmd)", "<!@(cmd)", "<|(list)",
-# "<!interpreter(arguments)", "<([list])", and even "<([)" and "<(<())".
-# In the last case, the inner "<()" is captured in match['content'].
-early_variable_re = re.compile(
-    '(?P<replace>(?P<type><(?:(?:!?@?)|\|)?)'
-    '(?P<command_string>[-a-zA-Z0-9_.]+)?'
-    '\((?P<is_array>\s*\[?)'
-    '(?P<content>.*?)(\]?)\))')
-
-# This matches the same as early_variable_re, but with '>' instead of '<'.
-late_variable_re = re.compile(
-    '(?P<replace>(?P<type>>(?:(?:!?@?)|\|)?)'
-    '(?P<command_string>[-a-zA-Z0-9_.]+)?'
-    '\((?P<is_array>\s*\[?)'
-    '(?P<content>.*?)(\]?)\))')
-
-# This matches the same as early_variable_re, but with '^' instead of '<'.
-latelate_variable_re = re.compile(
-    '(?P<replace>(?P<type>[\^](?:(?:!?@?)|\|)?)'
-    '(?P<command_string>[-a-zA-Z0-9_.]+)?'
-    '\((?P<is_array>\s*\[?)'
-    '(?P<content>.*?)(\]?)\))')
-
-# Global cache of results from running commands so they don't have to be run
-# more then once.
-cached_command_results = {}
-
-
-def FixupPlatformCommand(cmd):
-  if sys.platform == 'win32':
-    if type(cmd) == list:
-      cmd = [re.sub('^cat ', 'type ', cmd[0])] + cmd[1:]
-    else:
-      cmd = re.sub('^cat ', 'type ', cmd)
-  return cmd
-
-
-PHASE_EARLY = 0
-PHASE_LATE = 1
-PHASE_LATELATE = 2
-
-
-def ExpandVariables(input, phase, variables, build_file):
-  # Look for the pattern that gets expanded into variables
-  if phase == PHASE_EARLY:
-    variable_re = early_variable_re
-    expansion_symbol = '<'
-  elif phase == PHASE_LATE:
-    variable_re = late_variable_re
-    expansion_symbol = '>'
-  elif phase == PHASE_LATELATE:
-    variable_re = latelate_variable_re
-    expansion_symbol = '^'
-  else:
-    assert False
-
-  input_str = str(input)
-  if IsStrCanonicalInt(input_str):
-    return int(input_str)
-
-  # Do a quick scan to determine if an expensive regex search is warranted.
-  if expansion_symbol not in input_str:
-    return input_str
-
-  # Get the entire list of matches as a list of MatchObject instances.
-  # (using findall here would return strings instead of MatchObjects).
-  matches = [match for match in variable_re.finditer(input_str)]
-  if not matches:
-    return input_str
-
-  output = input_str
-  # Reverse the list of matches so that replacements are done right-to-left.
-  # That ensures that earlier replacements won't mess up the string in a
-  # way that causes later calls to find the earlier substituted text instead
-  # of what's intended for replacement.
-  matches.reverse()
-  for match_group in matches:
-    match = match_group.groupdict()
-    gyp.DebugOutput(gyp.DEBUG_VARIABLES,
-                    "Matches: %s" % repr(match))
-    # match['replace'] is the substring to look for, match['type']
-    # is the character code for the replacement type (< > <! >! <| >| <@
-    # >@ <!@ >!@), match['is_array'] contains a '[' for command
-    # arrays, and match['content'] is the name of the variable (< >)
-    # or command to run (<! >!). match['command_string'] is an optional
-    # command string. Currently, only 'pymod_do_main' is supported.
-
-    # run_command is true if a ! variant is used.
-    run_command = '!' in match['type']
-    command_string = match['command_string']
-
-    # file_list is true if a | variant is used.
-    file_list = '|' in match['type']
-
-    # Capture these now so we can adjust them later.
-    replace_start = match_group.start('replace')
-    replace_end = match_group.end('replace')
-
-    # Find the ending paren, and re-evaluate the contained string.
-    (c_start, c_end) = FindEnclosingBracketGroup(input_str[replace_start:])
-
-    # Adjust the replacement range to match the entire command
-    # found by FindEnclosingBracketGroup (since the variable_re
-    # probably doesn't match the entire command if it contained
-    # nested variables).
-    replace_end = replace_start + c_end
-
-    # Find the "real" replacement, matching the appropriate closing
-    # paren, and adjust the replacement start and end.
-    replacement = input_str[replace_start:replace_end]
-
-    # Figure out what the contents of the variable parens are.
-    contents_start = replace_start + c_start + 1
-    contents_end = replace_end - 1
-    contents = input_str[contents_start:contents_end]
-
-    # Do filter substitution now for <|().
-    # Admittedly, this is different than the evaluation order in other
-    # contexts. However, since filtration has no chance to run on <|(),
-    # this seems like the only obvious way to give them access to filters.
-    if file_list:
-      processed_variables = copy.deepcopy(variables)
-      ProcessListFiltersInDict(contents, processed_variables)
-      # Recurse to expand variables in the contents
-      contents = ExpandVariables(contents, phase,
-                                 processed_variables, build_file)
-    else:
-      # Recurse to expand variables in the contents
-      contents = ExpandVariables(contents, phase, variables, build_file)
-
-    # Strip off leading/trailing whitespace so that variable matches are
-    # simpler below (and because they are rarely needed).
-    contents = contents.strip()
-
-    # expand_to_list is true if an @ variant is used.  In that case,
-    # the expansion should result in a list.  Note that the caller
-    # is to be expecting a list in return, and not all callers do
-    # because not all are working in list context.  Also, for list
-    # expansions, there can be no other text besides the variable
-    # expansion in the input string.
-    expand_to_list = '@' in match['type'] and input_str == replacement
-
-    if run_command or file_list:
-      # Find the build file's directory, so commands can be run or file lists
-      # generated relative to it.
-      build_file_dir = os.path.dirname(build_file)
-      if build_file_dir == '':
-        # If build_file is just a leaf filename indicating a file in the
-        # current directory, build_file_dir might be an empty string.  Set
-        # it to None to signal to subprocess.Popen that it should run the
-        # command in the current directory.
-        build_file_dir = None
-
-    # Support <|(listfile.txt ...) which generates a file
-    # containing items from a gyp list, generated at gyp time.
-    # This works around actions/rules which have more inputs than will
-    # fit on the command line.
-    if file_list:
-      if type(contents) is list:
-        contents_list = contents
-      else:
-        contents_list = contents.split(' ')
-      replacement = contents_list[0]
-      if os.path.isabs(replacement):
-        raise GypError('| cannot handle absolute paths, got "%s"' % replacement)
-
-      if not generator_filelist_paths:
-        path = os.path.join(build_file_dir, replacement)
-      else:
-        if os.path.isabs(build_file_dir):
-          toplevel = generator_filelist_paths['toplevel']
-          rel_build_file_dir = gyp.common.RelativePath(build_file_dir, toplevel)
-        else:
-          rel_build_file_dir = build_file_dir
-        qualified_out_dir = generator_filelist_paths['qualified_out_dir']
-        path = os.path.join(qualified_out_dir, rel_build_file_dir, replacement)
-        gyp.common.EnsureDirExists(path)
-
-      replacement = gyp.common.RelativePath(path, build_file_dir)
-      f = gyp.common.WriteOnDiff(path)
-      for i in contents_list[1:]:
-        f.write('%s\n' % i)
-      f.close()
-
-    elif run_command:
-      use_shell = True
-      if match['is_array']:
-        contents = eval(contents)
-        use_shell = False
-
-      # Check for a cached value to avoid executing commands, or generating
-      # file lists more than once.
-      # TODO(http://code.google.com/p/gyp/issues/detail?id=112): It is
-      # possible that the command being invoked depends on the current
-      # directory. For that case the syntax needs to be extended so that the
-      # directory is also used in cache_key (it becomes a tuple).
-      # TODO(http://code.google.com/p/gyp/issues/detail?id=111): In theory,
-      # someone could author a set of GYP files where each time the command
-      # is invoked it produces different output by design. When the need
-      # arises, the syntax should be extended to support no caching off a
-      # command's output so it is run every time.
-      cache_key = str(contents)
-      cached_value = cached_command_results.get(cache_key, None)
-      if cached_value is None:
-        gyp.DebugOutput(gyp.DEBUG_VARIABLES,
-                        "Executing command '%s' in directory '%s'" %
-                        (contents,build_file_dir))
-
-        replacement = ''
-
-        if command_string == 'pymod_do_main':
-          # <!pymod_do_main(modulename param eters) loads |modulename| as a
-          # python module and then calls that module's DoMain() function,
-          # passing ["param", "eters"] as a single list argument. For modules
-          # that don't load quickly, this can be faster than
-          # <!(python modulename param eters). Do this in |build_file_dir|.
-          oldwd = os.getcwd()  # Python doesn't like os.open('.'): no fchdir.
-          if build_file_dir:
-            os.chdir(build_file_dir)
-
-          parsed_contents = shlex.split(contents)
-
-          # Import only imports the root package specified in the parameter,
-          # even though all packages will be imported.  For example, if
-          # 'foo.bar.gum' is passed in to __import__(), 'foo', 'foo.bar', and
-          # 'foo.bar.gum' are all imported, but only 'foo' is returned.  To
-          # get access to the package we specified to __import__(), we instead
-          # pull it out of sys.modules after it has been imported.
-          __import__(parsed_contents[0])
-          py_module = sys.modules[parsed_contents[0]]
-
-          replacement = str(py_module.DoMain(parsed_contents[1:])).rstrip()
-
-          os.chdir(oldwd)
-          assert replacement != None
-        elif command_string:
-          raise GypError("Unknown command string '%s' in '%s'." %
-                         (command_string, contents))
-        else:
-          # Fix up command with platform specific workarounds.
-          contents = FixupPlatformCommand(contents)
-          p = subprocess.Popen(contents, shell=use_shell,
-                               stdout=subprocess.PIPE,
-                               stderr=subprocess.PIPE,
-                               stdin=subprocess.PIPE,
-                               cwd=build_file_dir)
-
-          p_stdout, p_stderr = p.communicate('')
-
-          if p.wait() != 0 or p_stderr:
-            sys.stderr.write(p_stderr)
-            # Simulate check_call behavior, since check_call only exists
-            # in python 2.5 and later.
-            raise GypError("Call to '%s' returned exit status %d." %
-                           (contents, p.returncode))
-          replacement = p_stdout.rstrip()
-
-        cached_command_results[cache_key] = replacement
-      else:
-        gyp.DebugOutput(gyp.DEBUG_VARIABLES,
-                        "Had cache value for command '%s' in directory '%s'" %
-                        (contents,build_file_dir))
-        replacement = cached_value
-
-    else:
-      if not contents in variables:
-        if contents[-1] in ['!', '/']:
-          # In order to allow cross-compiles (nacl) to happen more naturally,
-          # we will allow references to >(sources/) etc. to resolve to
-          # and empty list if undefined. This allows actions to:
-          # 'action!': [
-          #   '>@(_sources!)',
-          # ],
-          # 'action/': [
-          #   '>@(_sources/)',
-          # ],
-          replacement = []
-        else:
-          raise GypError('Undefined variable ' + contents +
-                         ' in ' + build_file)
-      else:
-        replacement = variables[contents]
-    if _DEBUG_DEPTH:
-      if build_file != variables['__DEPTH_SOURCE__']:
-        print '%s != %s' % (build_file, variables['__DEPTH_SOURCE__'])
-      print '%s(%s): %s -> %s' % (
-          os.path.basename(build_file),
-          os.path.basename(variables['__DEPTH_SOURCE__']),
-          contents,
-          replacement)
-    if isinstance(replacement, list):
-      for item in replacement:
-        if (not contents[-1] == '/' and
-            not isinstance(item, str) and not isinstance(item, int)):
-          raise GypError('Variable ' + contents +
-                         ' must expand to a string or list of strings; ' +
-                         'list contains a ' +
-                         item.__class__.__name__)
-      # Run through the list and handle variable expansions in it.  Since
-      # the list is guaranteed not to contain dicts, this won't do anything
-      # with conditions sections.
-      ProcessVariablesAndConditionsInList(replacement, phase, variables,
-                                          build_file)
-    elif not isinstance(replacement, str) and \
-         not isinstance(replacement, int):
-          raise GypError('Variable ' + contents +
-                         ' must expand to a string or list of strings; ' +
-                         'found a ' + replacement.__class__.__name__)
-
-    if expand_to_list:
-      # Expanding in list context.  It's guaranteed that there's only one
-      # replacement to do in |input_str| and that it's this replacement.  See
-      # above.
-      if isinstance(replacement, list):
-        # If it's already a list, make a copy.
-        output = replacement[:]
-      else:
-        # Split it the same way sh would split arguments.
-        output = shlex.split(str(replacement))
-    else:
-      # Expanding in string context.
-      encoded_replacement = ''
-      if isinstance(replacement, list):
-        # When expanding a list into string context, turn the list items
-        # into a string in a way that will work with a subprocess call.
-        #
-        # TODO(mark): This isn't completely correct.  This should
-        # call a generator-provided function that observes the
-        # proper list-to-argument quoting rules on a specific
-        # platform instead of just calling the POSIX encoding
-        # routine.
-        encoded_replacement = gyp.common.EncodePOSIXShellList(replacement)
-      else:
-        encoded_replacement = replacement
-
-      output = output[:replace_start] + str(encoded_replacement) + \
-               output[replace_end:]
-    # Prepare for the next match iteration.
-    input_str = output
-
-  # Look for more matches now that we've replaced some, to deal with
-  # expanding local variables (variables defined in the same
-  # variables block as this one).
-  gyp.DebugOutput(gyp.DEBUG_VARIABLES,
-                  "Found output %s, recursing." % repr(output))
-  if isinstance(output, list):
-    if output and isinstance(output[0], list):
-      # Leave output alone if it's a list of lists.
-      # We don't want such lists to be stringified.
-      pass
-    else:
-      new_output = []
-      for item in output:
-        new_output.append(
-            ExpandVariables(item, phase, variables, build_file))
-      output = new_output
-  else:
-    output = ExpandVariables(output, phase, variables, build_file)
-
-  # Convert all strings that are canonically-represented integers into integers.
-  if isinstance(output, list):
-    for index in xrange(0, len(output)):
-      if IsStrCanonicalInt(output[index]):
-        output[index] = int(output[index])
-  elif IsStrCanonicalInt(output):
-    output = int(output)
-
-  return output
-
-
-def ProcessConditionsInDict(the_dict, phase, variables, build_file):
-  # Process a 'conditions' or 'target_conditions' section in the_dict,
-  # depending on phase.
-  # early -> conditions
-  # late -> target_conditions
-  # latelate -> no conditions
-  #
-  # Each item in a conditions list consists of cond_expr, a string expression
-  # evaluated as the condition, and true_dict, a dict that will be merged into
-  # the_dict if cond_expr evaluates to true.  Optionally, a third item,
-  # false_dict, may be present.  false_dict is merged into the_dict if
-  # cond_expr evaluates to false.
-  #
-  # Any dict merged into the_dict will be recursively processed for nested
-  # conditionals and other expansions, also according to phase, immediately
-  # prior to being merged.
-
-  if phase == PHASE_EARLY:
-    conditions_key = 'conditions'
-  elif phase == PHASE_LATE:
-    conditions_key = 'target_conditions'
-  elif phase == PHASE_LATELATE:
-    return
-  else:
-    assert False
-
-  if not conditions_key in the_dict:
-    return
-
-  conditions_list = the_dict[conditions_key]
-  # Unhook the conditions list, it's no longer needed.
-  del the_dict[conditions_key]
-
-  for condition in conditions_list:
-    if not isinstance(condition, list):
-      raise GypError(conditions_key + ' must be a list')
-    if len(condition) != 2 and len(condition) != 3:
-      # It's possible that condition[0] won't work in which case this
-      # attempt will raise its own IndexError.  That's probably fine.
-      raise GypError(conditions_key + ' ' + condition[0] +
-                     ' must be length 2 or 3, not ' + str(len(condition)))
-
-    [cond_expr, true_dict] = condition[0:2]
-    false_dict = None
-    if len(condition) == 3:
-      false_dict = condition[2]
-
-    # Do expansions on the condition itself.  Since the conditon can naturally
-    # contain variable references without needing to resort to GYP expansion
-    # syntax, this is of dubious value for variables, but someone might want to
-    # use a command expansion directly inside a condition.
-    cond_expr_expanded = ExpandVariables(cond_expr, phase, variables,
-                                         build_file)
-    if not isinstance(cond_expr_expanded, str) and \
-       not isinstance(cond_expr_expanded, int):
-      raise ValueError, \
-            'Variable expansion in this context permits str and int ' + \
-            'only, found ' + expanded.__class__.__name__
-
-    try:
-      ast_code = compile(cond_expr_expanded, '<string>', 'eval')
-
-      if eval(ast_code, {'__builtins__': None}, variables):
-        merge_dict = true_dict
-      else:
-        merge_dict = false_dict
-    except SyntaxError, e:
-      syntax_error = SyntaxError('%s while evaluating condition \'%s\' in %s '
-                                 'at character %d.' %
-                                 (str(e.args[0]), e.text, build_file, e.offset),
-                                 e.filename, e.lineno, e.offset, e.text)
-      raise syntax_error
-    except NameError, e:
-      gyp.common.ExceptionAppend(e, 'while evaluating condition \'%s\' in %s' %
-                                 (cond_expr_expanded, build_file))
-      raise
-
-    if merge_dict != None:
-      # Expand variables and nested conditinals in the merge_dict before
-      # merging it.
-      ProcessVariablesAndConditionsInDict(merge_dict, phase,
-                                          variables, build_file)
-
-      MergeDicts(the_dict, merge_dict, build_file, build_file)
-
-
-def LoadAutomaticVariablesFromDict(variables, the_dict):
-  # Any keys with plain string values in the_dict become automatic variables.
-  # The variable name is the key name with a "_" character prepended.
-  for key, value in the_dict.iteritems():
-    if isinstance(value, str) or isinstance(value, int) or \
-       isinstance(value, list):
-      variables['_' + key] = value
-
-
-def LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key):
-  # Any keys in the_dict's "variables" dict, if it has one, becomes a
-  # variable.  The variable name is the key name in the "variables" dict.
-  # Variables that end with the % character are set only if they are unset in
-  # the variables dict.  the_dict_key is the name of the key that accesses
-  # the_dict in the_dict's parent dict.  If the_dict's parent is not a dict
-  # (it could be a list or it could be parentless because it is a root dict),
-  # the_dict_key will be None.
-  for key, value in the_dict.get('variables', {}).iteritems():
-    if not isinstance(value, str) and not isinstance(value, int) and \
-       not isinstance(value, list):
-      continue
-
-    if key.endswith('%'):
-      variable_name = key[:-1]
-      if variable_name in variables:
-        # If the variable is already set, don't set it.
-        continue
-      if the_dict_key is 'variables' and variable_name in the_dict:
-        # If the variable is set without a % in the_dict, and the_dict is a
-        # variables dict (making |variables| a varaibles sub-dict of a
-        # variables dict), use the_dict's definition.
-        value = the_dict[variable_name]
-    elif key.endswith('!'):
-      variable_name = key[:-1]
-      if variable_name not in variables:
-        # If the variable is not already set, we can't remove anything from it.
-        continue
-      remove_these = value
-      filter_fn = lambda t: t not in remove_these
-      # Remove these values from the original variable
-      value = filter(filter_fn, variables[variable_name])
-      # Remove these values from any copy of that variable we're about to process :)
-      the_dict['variables'][variable_name] = filter(filter_fn, the_dict['variables'][variable_name])
-    else:
-      variable_name = key
-
-    variables[variable_name] = value
-
-
-def ProcessVariablesAndConditionsInDict(the_dict, phase, variables_in,
-                                        build_file, the_dict_key=None):
-  """Handle all variable and command expansion and conditional evaluation.
-
-  This function is the public entry point for all variable expansions and
-  conditional evaluations.  The variables_in dictionary will not be modified
-  by this function.
-  """
-
-  # Make a copy of the variables_in dict that can be modified during the
-  # loading of automatics and the loading of the variables dict.
-  variables = variables_in.copy()
-  LoadAutomaticVariablesFromDict(variables, the_dict)
-
-  if 'variables' in the_dict:
-    # Make sure all the local variables are added to the variables
-    # list before we process them so that you can reference one
-    # variable from another.  They will be fully expanded by recursion
-    # in ExpandVariables.
-    for key, value in the_dict['variables'].iteritems():
-      variables[key] = value
-
-    # Handle the associated variables dict first, so that any variable
-    # references within can be resolved prior to using them as variables.
-    # Pass a copy of the variables dict to avoid having it be tainted.
-    # Otherwise, it would have extra automatics added for everything that
-    # should just be an ordinary variable in this scope.
-    ProcessVariablesAndConditionsInDict(the_dict['variables'], phase,
-                                        variables, build_file, 'variables')
-
-  LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key)
-
-  for key, value in the_dict.iteritems():
-    # Skip "variables", which was already processed if present.
-    if key != 'variables' and isinstance(value, str):
-      expanded = ExpandVariables(value, phase, variables, build_file)
-      if not isinstance(expanded, str) and not isinstance(expanded, int):
-        raise ValueError, \
-              'Variable expansion in this context permits str and int ' + \
-              'only, found ' + expanded.__class__.__name__ + ' for ' + key
-      the_dict[key] = expanded
-
-  # Variable expansion may have resulted in changes to automatics.  Reload.
-  # TODO(mark): Optimization: only reload if no changes were made.
-  variables = variables_in.copy()
-  LoadAutomaticVariablesFromDict(variables, the_dict)
-  LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key)
-
-  # Process conditions in this dict.  This is done after variable expansion
-  # so that conditions may take advantage of expanded variables.  For example,
-  # if the_dict contains:
-  #   {'type':       '<(library_type)',
-  #    'conditions': [['_type=="static_library"', { ... }]]},
-  # _type, as used in the condition, will only be set to the value of
-  # library_type if variable expansion is performed before condition
-  # processing.  However, condition processing should occur prior to recursion
-  # so that variables (both automatic and "variables" dict type) may be
-  # adjusted by conditions sections, merged into the_dict, and have the
-  # intended impact on contained dicts.
-  #
-  # This arrangement means that a "conditions" section containing a "variables"
-  # section will only have those variables effective in subdicts, not in
-  # the_dict.  The workaround is to put a "conditions" section within a
-  # "variables" section.  For example:
-  #   {'conditions': [['os=="mac"', {'variables': {'define': 'IS_MAC'}}]],
-  #    'defines':    ['<(define)'],
-  #    'my_subdict': {'defines': ['<(define)']}},
-  # will not result in "IS_MAC" being appended to the "defines" list in the
-  # current scope but would result in it being appended to the "defines" list
-  # within "my_subdict".  By comparison:
-  #   {'variables': {'conditions': [['os=="mac"', {'define': 'IS_MAC'}]]},
-  #    'defines':    ['<(define)'],
-  #    'my_subdict': {'defines': ['<(define)']}},
-  # will append "IS_MAC" to both "defines" lists.
-
-  # Evaluate conditions sections, allowing variable expansions within them
-  # as well as nested conditionals.  This will process a 'conditions' or
-  # 'target_conditions' section, perform appropriate merging and recursive
-  # conditional and variable processing, and then remove the conditions section
-  # from the_dict if it is present.
-  ProcessConditionsInDict(the_dict, phase, variables, build_file)
-
-  # Conditional processing may have resulted in changes to automatics or the
-  # variables dict.  Reload.
-  variables = variables_in.copy()
-  LoadAutomaticVariablesFromDict(variables, the_dict)
-  LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key)
-
-  # Recurse into child dicts, or process child lists which may result in
-  # further recursion into descendant dicts.
-  for key, value in the_dict.iteritems():
-    # Skip "variables" and string values, which were already processed if
-    # present.
-    if key == 'variables' or isinstance(value, str):
-      continue
-    if isinstance(value, dict):
-      # Pass a copy of the variables dict so that subdicts can't influence
-      # parents.
-      ProcessVariablesAndConditionsInDict(value, phase, variables,
-                                          build_file, key)
-    elif isinstance(value, list):
-      # The list itself can't influence the variables dict, and
-      # ProcessVariablesAndConditionsInList will make copies of the variables
-      # dict if it needs to pass it to something that can influence it.  No
-      # copy is necessary here.
-      ProcessVariablesAndConditionsInList(value, phase, variables,
-                                          build_file)
-    elif not isinstance(value, int):
-      raise TypeError, 'Unknown type ' + value.__class__.__name__ + \
-                       ' for ' + key
-
-
-def ProcessVariablesAndConditionsInList(the_list, phase, variables,
-                                        build_file):
-  # Iterate using an index so that new values can be assigned into the_list.
-  index = 0
-  while index < len(the_list):
-    item = the_list[index]
-    if isinstance(item, dict):
-      # Make a copy of the variables dict so that it won't influence anything
-      # outside of its own scope.
-      ProcessVariablesAndConditionsInDict(item, phase, variables, build_file)
-    elif isinstance(item, list):
-      ProcessVariablesAndConditionsInList(item, phase, variables, build_file)
-    elif isinstance(item, str):
-      expanded = ExpandVariables(item, phase, variables, build_file)
-      if isinstance(expanded, str) or isinstance(expanded, int):
-        the_list[index] = expanded
-      elif isinstance(expanded, list):
-        the_list[index:index+1] = expanded
-        index += len(expanded)
-
-        # index now identifies the next item to examine.  Continue right now
-        # without falling into the index increment below.
-        continue
-      else:
-        raise ValueError, \
-              'Variable expansion in this context permits strings and ' + \
-              'lists only, found ' + expanded.__class__.__name__ + ' at ' + \
-              index
-    elif not isinstance(item, int):
-      raise TypeError, 'Unknown type ' + item.__class__.__name__ + \
-                       ' at index ' + index
-    index = index + 1
-
-
-def BuildTargetsDict(data):
-  """Builds a dict mapping fully-qualified target names to their target dicts.
-
-  |data| is a dict mapping loaded build files by pathname relative to the
-  current directory.  Values in |data| are build file contents.  For each
-  |data| value with a "targets" key, the value of the "targets" key is taken
-  as a list containing target dicts.  Each target's fully-qualified name is
-  constructed from the pathname of the build file (|data| key) and its
-  "target_name" property.  These fully-qualified names are used as the keys
-  in the returned dict.  These keys provide access to the target dicts,
-  the dicts in the "targets" lists.
-  """
-
-  targets = {}
-  for build_file in data['target_build_files']:
-    for target in data[build_file].get('targets', []):
-      target_name = gyp.common.QualifiedTarget(build_file,
-                                               target['target_name'],
-                                               target['toolset'])
-      if target_name in targets:
-        raise GypError('Duplicate target definitions for ' + target_name)
-      targets[target_name] = target
-
-  return targets
-
-
-def QualifyDependencies(targets):
-  """Make dependency links fully-qualified relative to the current directory.
-
-  |targets| is a dict mapping fully-qualified target names to their target
-  dicts.  For each target in this dict, keys known to contain dependency
-  links are examined, and any dependencies referenced will be rewritten
-  so that they are fully-qualified and relative to the current directory.
-  All rewritten dependencies are suitable for use as keys to |targets| or a
-  similar dict.
-  """
-
-  all_dependency_sections = [dep + op
-                             for dep in dependency_sections
-                             for op in ('', '!', '/')]
-
-  for target, target_dict in targets.iteritems():
-    target_build_file = gyp.common.BuildFile(target)
-    toolset = target_dict['toolset']
-    for dependency_key in all_dependency_sections:
-      dependencies = target_dict.get(dependency_key, [])
-      for index in xrange(0, len(dependencies)):
-        dep_file, dep_target, dep_toolset = gyp.common.ResolveTarget(
-            target_build_file, dependencies[index], toolset)
-        if not multiple_toolsets:
-          # Ignore toolset specification in the dependency if it is specified.
-          dep_toolset = toolset
-        dependency = gyp.common.QualifiedTarget(dep_file,
-                                                dep_target,
-                                                dep_toolset)
-        dependencies[index] = dependency
-
-        # Make sure anything appearing in a list other than "dependencies" also
-        # appears in the "dependencies" list.
-        if dependency_key != 'dependencies' and \
-           dependency not in target_dict['dependencies']:
-          raise GypError('Found ' + dependency + ' in ' + dependency_key +
-                         ' of ' + target + ', but not in dependencies')
-
-
-def ExpandWildcardDependencies(targets, data):
-  """Expands dependencies specified as build_file:*.
-
-  For each target in |targets|, examines sections containing links to other
-  targets.  If any such section contains a link of the form build_file:*, it
-  is taken as a wildcard link, and is expanded to list each target in
-  build_file.  The |data| dict provides access to build file dicts.
-
-  Any target that does not wish to be included by wildcard can provide an
-  optional "suppress_wildcard" key in its target dict.  When present and
-  true, a wildcard dependency link will not include such targets.
-
-  All dependency names, including the keys to |targets| and the values in each
-  dependency list, must be qualified when this function is called.
-  """
-
-  for target, target_dict in targets.iteritems():
-    toolset = target_dict['toolset']
-    target_build_file = gyp.common.BuildFile(target)
-    for dependency_key in dependency_sections:
-      dependencies = target_dict.get(dependency_key, [])
-
-      # Loop this way instead of "for dependency in" or "for index in xrange"
-      # because the dependencies list will be modified within the loop body.
-      index = 0
-      while index < len(dependencies):
-        (dependency_build_file, dependency_target, dependency_toolset) = \
-            gyp.common.ParseQualifiedTarget(dependencies[index])
-        if dependency_target != '*' and dependency_toolset != '*':
-          # Not a wildcard.  Keep it moving.
-          index = index + 1
-          continue
-
-        if dependency_build_file == target_build_file:
-          # It's an error for a target to depend on all other targets in
-          # the same file, because a target cannot depend on itself.
-          raise GypError('Found wildcard in ' + dependency_key + ' of ' +
-                         target + ' referring to same build file')
-
-        # Take the wildcard out and adjust the index so that the next
-        # dependency in the list will be processed the next time through the
-        # loop.
-        del dependencies[index]
-        index = index - 1
-
-        # Loop through the targets in the other build file, adding them to
-        # this target's list of dependencies in place of the removed
-        # wildcard.
-        dependency_target_dicts = data[dependency_build_file]['targets']
-        for dependency_target_dict in dependency_target_dicts:
-          if int(dependency_target_dict.get('suppress_wildcard', False)):
-            continue
-          dependency_target_name = dependency_target_dict['target_name']
-          if (dependency_target != '*' and
-              dependency_target != dependency_target_name):
-            continue
-          dependency_target_toolset = dependency_target_dict['toolset']
-          if (dependency_toolset != '*' and
-              dependency_toolset != dependency_target_toolset):
-            continue
-          dependency = gyp.common.QualifiedTarget(dependency_build_file,
-                                                  dependency_target_name,
-                                                  dependency_target_toolset)
-          index = index + 1
-          dependencies.insert(index, dependency)
-
-        index = index + 1
-
-
-def Unify(l):
-  """Removes duplicate elements from l, keeping the first element."""
-  seen = {}
-  return [seen.setdefault(e, e) for e in l if e not in seen]
-
-
-def RemoveDuplicateDependencies(targets):
-  """Makes sure every dependency appears only once in all targets's dependency
-  lists."""
-  for target_name, target_dict in targets.iteritems():
-    for dependency_key in dependency_sections:
-      dependencies = target_dict.get(dependency_key, [])
-      if dependencies:
-        target_dict[dependency_key] = Unify(dependencies)
-
-
-class DependencyGraphNode(object):
-  """
-
-  Attributes:
-    ref: A reference to an object that this DependencyGraphNode represents.
-    dependencies: List of DependencyGraphNodes on which this one depends.
-    dependents: List of DependencyGraphNodes that depend on this one.
-  """
-
-  class CircularException(GypError):
-    pass
-
-  def __init__(self, ref):
-    self.ref = ref
-    self.dependencies = []
-    self.dependents = []
-
-  def FlattenToList(self):
-    # flat_list is the sorted list of dependencies - actually, the list items
-    # are the "ref" attributes of DependencyGraphNodes.  Every target will
-    # appear in flat_list after all of its dependencies, and before all of its
-    # dependents.
-    flat_list = []
-
-    # in_degree_zeros is the list of DependencyGraphNodes that have no
-    # dependencies not in flat_list.  Initially, it is a copy of the children
-    # of this node, because when the graph was built, nodes with no
-    # dependencies were made implicit dependents of the root node.
-    in_degree_zeros = set(self.dependents[:])
-
-    while in_degree_zeros:
-      # Nodes in in_degree_zeros have no dependencies not in flat_list, so they
-      # can be appended to flat_list.  Take these nodes out of in_degree_zeros
-      # as work progresses, so that the next node to process from the list can
-      # always be accessed at a consistent position.
-      node = in_degree_zeros.pop()
-      flat_list.append(node.ref)
-
-      # Look at dependents of the node just added to flat_list.  Some of them
-      # may now belong in in_degree_zeros.
-      for node_dependent in node.dependents:
-        is_in_degree_zero = True
-        for node_dependent_dependency in node_dependent.dependencies:
-          if not node_dependent_dependency.ref in flat_list:
-            # The dependent one or more dependencies not in flat_list.  There
-            # will be more chances to add it to flat_list when examining
-            # it again as a dependent of those other dependencies, provided
-            # that there are no cycles.
-            is_in_degree_zero = False
-            break
-
-        if is_in_degree_zero:
-          # All of the dependent's dependencies are already in flat_list.  Add
-          # it to in_degree_zeros where it will be processed in a future
-          # iteration of the outer loop.
-          in_degree_zeros.add(node_dependent)
-
-    return flat_list
-
-  def DirectDependencies(self, dependencies=None):
-    """Returns a list of just direct dependencies."""
-    if dependencies == None:
-      dependencies = []
-
-    for dependency in self.dependencies:
-      # Check for None, corresponding to the root node.
-      if dependency.ref != None and dependency.ref not in dependencies:
-        dependencies.append(dependency.ref)
-
-    return dependencies
-
-  def _AddImportedDependencies(self, targets, dependencies=None):
-    """Given a list of direct dependencies, adds indirect dependencies that
-    other dependencies have declared to export their settings.
-
-    This method does not operate on self.  Rather, it operates on the list
-    of dependencies in the |dependencies| argument.  For each dependency in
-    that list, if any declares that it exports the settings of one of its
-    own dependencies, those dependencies whose settings are "passed through"
-    are added to the list.  As new items are added to the list, they too will
-    be processed, so it is possible to import settings through multiple levels
-    of dependencies.
-
-    This method is not terribly useful on its own, it depends on being
-    "primed" with a list of direct dependencies such as one provided by
-    DirectDependencies.  DirectAndImportedDependencies is intended to be the
-    public entry point.
-    """
-
-    if dependencies == None:
-      dependencies = []
-
-    index = 0
-    while index < len(dependencies):
-      dependency = dependencies[index]
-      dependency_dict = targets[dependency]
-      # Add any dependencies whose settings should be imported to the list
-      # if not already present.  Newly-added items will be checked for
-      # their own imports when the list iteration reaches them.
-      # Rather than simply appending new items, insert them after the
-      # dependency that exported them.  This is done to more closely match
-      # the depth-first method used by DeepDependencies.
-      add_index = 1
-      for imported_dependency in \
-          dependency_dict.get('export_dependent_settings', []):
-        if imported_dependency not in dependencies:
-          dependencies.insert(index + add_index, imported_dependency)
-          add_index = add_index + 1
-      index = index + 1
-
-    return dependencies
-
-  def DirectAndImportedDependencies(self, targets, dependencies=None):
-    """Returns a list of a target's direct dependencies and all indirect
-    dependencies that a dependency has advertised settings should be exported
-    through the dependency for.
-    """
-
-    dependencies = self.DirectDependencies(dependencies)
-    return self._AddImportedDependencies(targets, dependencies)
-
-  def DeepDependencies(self, dependencies=None):
-    """Returns a list of all of a target's dependencies, recursively."""
-    if dependencies == None:
-      dependencies = []
-
-    for dependency in self.dependencies:
-      # Check for None, corresponding to the root node.
-      if dependency.ref != None and dependency.ref not in dependencies:
-        dependencies.append(dependency.ref)
-        dependency.DeepDependencies(dependencies)
-
-    return dependencies
-
-  def LinkDependencies(self, targets, dependencies=None, initial=True):
-    """Returns a list of dependency targets that are linked into this target.
-
-    This function has a split personality, depending on the setting of
-    |initial|.  Outside callers should always leave |initial| at its default
-    setting.
-
-    When adding a target to the list of dependencies, this function will
-    recurse into itself with |initial| set to False, to collect dependencies
-    that are linked into the linkable target for which the list is being built.
-    """
-    if dependencies == None:
-      dependencies = []
-
-    # Check for None, corresponding to the root node.
-    if self.ref == None:
-      return dependencies
-
-    # It's kind of sucky that |targets| has to be passed into this function,
-    # but that's presently the easiest way to access the target dicts so that
-    # this function can find target types.
-
-    if 'target_name' not in targets[self.ref]:
-      raise GypError("Missing 'target_name' field in target.")
-
-    if 'type' not in targets[self.ref]:
-      raise GypError("Missing 'type' field in target %s" %
-                     targets[self.ref]['target_name'])
-
-    target_type = targets[self.ref]['type']
-
-    is_linkable = target_type in linkable_types
-
-    if initial and not is_linkable:
-      # If this is the first target being examined and it's not linkable,
-      # return an empty list of link dependencies, because the link
-      # dependencies are intended to apply to the target itself (initial is
-      # True) and this target won't be linked.
-      return dependencies
-
-    # Don't traverse 'none' targets if explicitly excluded.
-    if (target_type == 'none' and
-        not targets[self.ref].get('dependencies_traverse', True)):
-      if self.ref not in dependencies:
-        dependencies.append(self.ref)
-      return dependencies
-
-    # Executables and loadable modules are already fully and finally linked.
-    # Nothing else can be a link dependency of them, there can only be
-    # dependencies in the sense that a dependent target might run an
-    # executable or load the loadable_module.
-    if not initial and target_type in ('executable', 'loadable_module'):
-      return dependencies
-
-    # The target is linkable, add it to the list of link dependencies.
-    if self.ref not in dependencies:
-      dependencies.append(self.ref)
-      if initial or not is_linkable:
-        # If this is a subsequent target and it's linkable, don't look any
-        # further for linkable dependencies, as they'll already be linked into
-        # this target linkable.  Always look at dependencies of the initial
-        # target, and always look at dependencies of non-linkables.
-        for dependency in self.dependencies:
-          dependency.LinkDependencies(targets, dependencies, False)
-
-    return dependencies
-
-
-def BuildDependencyList(targets):
-  # Create a DependencyGraphNode for each target.  Put it into a dict for easy
-  # access.
-  dependency_nodes = {}
-  for target, spec in targets.iteritems():
-    if target not in dependency_nodes:
-      dependency_nodes[target] = DependencyGraphNode(target)
-
-  # Set up the dependency links.  Targets that have no dependencies are treated
-  # as dependent on root_node.
-  root_node = DependencyGraphNode(None)
-  for target, spec in targets.iteritems():
-    target_node = dependency_nodes[target]
-    target_build_file = gyp.common.BuildFile(target)
-    dependencies = spec.get('dependencies')
-    if not dependencies:
-      target_node.dependencies = [root_node]
-      root_node.dependents.append(target_node)
-    else:
-      for dependency in dependencies:
-        dependency_node = dependency_nodes.get(dependency)
-        if not dependency_node:
-          raise GypError("Dependency '%s' not found while "
-                         "trying to load target %s" % (dependency, target))
-        target_node.dependencies.append(dependency_node)
-        dependency_node.dependents.append(target_node)
-
-  flat_list = root_node.FlattenToList()
-
-  # If there's anything left unvisited, there must be a circular dependency
-  # (cycle).  If you need to figure out what's wrong, look for elements of
-  # targets that are not in flat_list.
-  if len(flat_list) != len(targets):
-    raise DependencyGraphNode.CircularException(
-        'Some targets not reachable, cycle in dependency graph detected: ' +
-        ' '.join(set(flat_list) ^ set(targets)))
-
-  return [dependency_nodes, flat_list]
-
-
-def VerifyNoGYPFileCircularDependencies(targets):
-  # Create a DependencyGraphNode for each gyp file containing a target.  Put
-  # it into a dict for easy access.
-  dependency_nodes = {}
-  for target in targets.iterkeys():
-    build_file = gyp.common.BuildFile(target)
-    if not build_file in dependency_nodes:
-      dependency_nodes[build_file] = DependencyGraphNode(build_file)
-
-  # Set up the dependency links.
-  for target, spec in targets.iteritems():
-    build_file = gyp.common.BuildFile(target)
-    build_file_node = dependency_nodes[build_file]
-    target_dependencies = spec.get('dependencies', [])
-    for dependency in target_dependencies:
-      try:
-        dependency_build_file = gyp.common.BuildFile(dependency)
-      except GypError, e:
-        gyp.common.ExceptionAppend(
-            e, 'while computing dependencies of .gyp file %s' % build_file)
-        raise
-
-      if dependency_build_file == build_file:
-        # A .gyp file is allowed to refer back to itself.
-        continue
-      dependency_node = dependency_nodes.get(dependency_build_file)
-      if not dependency_node:
-        raise GypError("Dependancy '%s' not found" % dependency_build_file)
-      if dependency_node not in build_file_node.dependencies:
-        build_file_node.dependencies.append(dependency_node)
-        dependency_node.dependents.append(build_file_node)
-
-
-  # Files that have no dependencies are treated as dependent on root_node.
-  root_node = DependencyGraphNode(None)
-  for build_file_node in dependency_nodes.itervalues():
-    if len(build_file_node.dependencies) == 0:
-      build_file_node.dependencies.append(root_node)
-      root_node.dependents.append(build_file_node)
-
-  flat_list = root_node.FlattenToList()
-
-  # If there's anything left unvisited, there must be a circular dependency
-  # (cycle).
-  if len(flat_list) != len(dependency_nodes):
-    bad_files = []
-    for file in dependency_nodes.iterkeys():
-      if not file in flat_list:
-        bad_files.append(file)
-    raise DependencyGraphNode.CircularException, \
-        'Some files not reachable, cycle in .gyp file dependency graph ' + \
-        'detected involving some or all of: ' + \
-        ' '.join(bad_files)
-
-
-def DoDependentSettings(key, flat_list, targets, dependency_nodes):
-  # key should be one of all_dependent_settings, direct_dependent_settings,
-  # or link_settings.
-
-  for target in flat_list:
-    target_dict = targets[target]
-    build_file = gyp.common.BuildFile(target)
-
-    if key == 'all_dependent_settings':
-      dependencies = dependency_nodes[target].DeepDependencies()
-    elif key == 'direct_dependent_settings':
-      dependencies = \
-          dependency_nodes[target].DirectAndImportedDependencies(targets)
-    elif key == 'link_settings':
-      dependencies = dependency_nodes[target].LinkDependencies(targets)
-    else:
-      raise GypError("DoDependentSettings doesn't know how to determine "
-                      'dependencies for ' + key)
-
-    for dependency in dependencies:
-      dependency_dict = targets[dependency]
-      if not key in dependency_dict:
-        continue
-      dependency_build_file = gyp.common.BuildFile(dependency)
-      MergeDicts(target_dict, dependency_dict[key],
-                 build_file, dependency_build_file)
-
-
-def AdjustStaticLibraryDependencies(flat_list, targets, dependency_nodes,
-                                    sort_dependencies):
-  # Recompute target "dependencies" properties.  For each static library
-  # target, remove "dependencies" entries referring to other static libraries,
-  # unless the dependency has the "hard_dependency" attribute set.  For each
-  # linkable target, add a "dependencies" entry referring to all of the
-  # target's computed list of link dependencies (including static libraries
-  # if no such entry is already present.
-  for target in flat_list:
-    target_dict = targets[target]
-    target_type = target_dict['type']
-
-    if target_type == 'static_library':
-      if not 'dependencies' in target_dict:
-        continue
-
-      target_dict['dependencies_original'] = target_dict.get(
-          'dependencies', [])[:]
-
-      # A static library should not depend on another static library unless
-      # the dependency relationship is "hard," which should only be done when
-      # a dependent relies on some side effect other than just the build
-      # product, like a rule or action output. Further, if a target has a
-      # non-hard dependency, but that dependency exports a hard dependency,
-      # the non-hard dependency can safely be removed, but the exported hard
-      # dependency must be added to the target to keep the same dependency
-      # ordering.
-      dependencies = \
-          dependency_nodes[target].DirectAndImportedDependencies(targets)
-      index = 0
-      while index < len(dependencies):
-        dependency = dependencies[index]
-        dependency_dict = targets[dependency]
-
-        # Remove every non-hard static library dependency and remove every
-        # non-static library dependency that isn't a direct dependency.
-        if (dependency_dict['type'] == 'static_library' and \
-            not dependency_dict.get('hard_dependency', False)) or \
-           (dependency_dict['type'] != 'static_library' and \
-            not dependency in target_dict['dependencies']):
-          # Take the dependency out of the list, and don't increment index
-          # because the next dependency to analyze will shift into the index
-          # formerly occupied by the one being removed.
-          del dependencies[index]
-        else:
-          index = index + 1
-
-      # Update the dependencies. If the dependencies list is empty, it's not
-      # needed, so unhook it.
-      if len(dependencies) > 0:
-        target_dict['dependencies'] = dependencies
-      else:
-        del target_dict['dependencies']
-
-    elif target_type in linkable_types:
-      # Get a list of dependency targets that should be linked into this
-      # target.  Add them to the dependencies list if they're not already
-      # present.
-
-      link_dependencies = dependency_nodes[target].LinkDependencies(targets)
-      for dependency in link_dependencies:
-        if dependency == target:
-          continue
-        if not 'dependencies' in target_dict:
-          target_dict['dependencies'] = []
-        if not dependency in target_dict['dependencies']:
-          target_dict['dependencies'].append(dependency)
-      # Sort the dependencies list in the order from dependents to dependencies.
-      # e.g. If A and B depend on C and C depends on D, sort them in A, B, C, D.
-      # Note: flat_list is already sorted in the order from dependencies to
-      # dependents.
-      if sort_dependencies and 'dependencies' in target_dict:
-        target_dict['dependencies'] = [dep for dep in reversed(flat_list)
-                                       if dep in target_dict['dependencies']]
-
-
-# Initialize this here to speed up MakePathRelative.
-exception_re = re.compile(r'''["']?[-/$<>^]''')
-
-
-def MakePathRelative(to_file, fro_file, item):
-  # If item is a relative path, it's relative to the build file dict that it's
-  # coming from.  Fix it up to make it relative to the build file dict that
-  # it's going into.
-  # Exception: any |item| that begins with these special characters is
-  # returned without modification.
-  #   /   Used when a path is already absolute (shortcut optimization;
-  #       such paths would be returned as absolute anyway)
-  #   $   Used for build environment variables
-  #   -   Used for some build environment flags (such as -lapr-1 in a
-  #       "libraries" section)
-  #   <   Used for our own variable and command expansions (see ExpandVariables)
-  #   >   Used for our own variable and command expansions (see ExpandVariables)
-  #   ^   Used for our own variable and command expansions (see ExpandVariables)
-  #
-  #   "/' Used when a value is quoted.  If these are present, then we
-  #       check the second character instead.
-  #
-  if to_file == fro_file or exception_re.match(item):
-    return item
-  else:
-    # TODO(dglazkov) The backslash/forward-slash replacement at the end is a
-    # temporary measure. This should really be addressed by keeping all paths
-    # in POSIX until actual project generation.
-    ret = os.path.normpath(os.path.join(
-        gyp.common.RelativePath(os.path.dirname(fro_file),
-                                os.path.dirname(to_file)),
-                                item)).replace('\\', '/')
-    if item[-1] == '/':
-      ret += '/'
-    return ret
-
-def MergeLists(to, fro, to_file, fro_file, is_paths=False, append=True):
-  def is_hashable(x):
-    try:
-      hash(x)
-    except TypeError:
-      return False
-    return True
-  # If x is hashable, returns whether x is in s. Else returns whether x is in l.
-  def is_in_set_or_list(x, s, l):
-    if is_hashable(x):
-      return x in s
-    return x in l
-
-  prepend_index = 0
-
-  # Make membership testing of hashables in |to| (in particular, strings)
-  # faster.
-  hashable_to_set = set([x for x in to if is_hashable(x)])
-
-  for item in fro:
-    singleton = False
-    if isinstance(item, str) or isinstance(item, int):
-      # The cheap and easy case.
-      if is_paths:
-        to_item = MakePathRelative(to_file, fro_file, item)
-      else:
-        to_item = item
-
-      if not isinstance(item, str) or not item.startswith('-'):
-        # Any string that doesn't begin with a "-" is a singleton - it can
-        # only appear once in a list, to be enforced by the list merge append
-        # or prepend.
-        singleton = True
-    elif isinstance(item, dict):
-      # Make a copy of the dictionary, continuing to look for paths to fix.
-      # The other intelligent aspects of merge processing won't apply because
-      # item is being merged into an empty dict.
-      to_item = {}
-      MergeDicts(to_item, item, to_file, fro_file)
-    elif isinstance(item, list):
-      # Recurse, making a copy of the list.  If the list contains any
-      # descendant dicts, path fixing will occur.  Note that here, custom
-      # values for is_paths and append are dropped; those are only to be
-      # applied to |to| and |fro|, not sublists of |fro|.  append shouldn't
-      # matter anyway because the new |to_item| list is empty.
-      to_item = []
-      MergeLists(to_item, item, to_file, fro_file)
-    else:
-      raise TypeError, \
-          'Attempt to merge list item of unsupported type ' + \
-          item.__class__.__name__
-
-    if append:
-      # If appending a singleton that's already in the list, don't append.
-      # This ensures that the earliest occurrence of the item will stay put.
-      if not singleton or not is_in_set_or_list(to_item, hashable_to_set, to):
-        to.append(to_item)
-        if is_hashable(to_item):
-          hashable_to_set.add(to_item)
-    else:
-      # If prepending a singleton that's already in the list, remove the
-      # existing instance and proceed with the prepend.  This ensures that the
-      # item appears at the earliest possible position in the list.
-      while singleton and to_item in to:
-        to.remove(to_item)
-
-      # Don't just insert everything at index 0.  That would prepend the new
-      # items to the list in reverse order, which would be an unwelcome
-      # surprise.
-      to.insert(prepend_index, to_item)
-      if is_hashable(to_item):
-        hashable_to_set.add(to_item)
-      prepend_index = prepend_index + 1
-
-
-def MergeDicts(to, fro, to_file, fro_file):
-  # I wanted to name the parameter "from" but it's a Python keyword...
-  for k, v in fro.iteritems():
-    # It would be nice to do "if not k in to: to[k] = v" but that wouldn't give
-    # copy semantics.  Something else may want to merge from the |fro| dict
-    # later, and having the same dict ref pointed to twice in the tree isn't
-    # what anyone wants considering that the dicts may subsequently be
-    # modified.
-    if k in to:
-      bad_merge = False
-      if isinstance(v, str) or isinstance(v, int):
-        if not (isinstance(to[k], str) or isinstance(to[k], int)):
-          bad_merge = True
-      elif v.__class__ != to[k].__class__:
-        bad_merge = True
-
-      if bad_merge:
-        raise TypeError, \
-            'Attempt to merge dict value of type ' + v.__class__.__name__ + \
-            ' into incompatible type ' + to[k].__class__.__name__ + \
-            ' for key ' + k
-    if isinstance(v, str) or isinstance(v, int):
-      # Overwrite the existing value, if any.  Cheap and easy.
-      is_path = IsPathSection(k)
-      if is_path:
-        to[k] = MakePathRelative(to_file, fro_file, v)
-      else:
-        to[k] = v
-    elif isinstance(v, dict):
-      # Recurse, guaranteeing copies will be made of objects that require it.
-      if not k in to:
-        to[k] = {}
-      MergeDicts(to[k], v, to_file, fro_file)
-    elif isinstance(v, list):
-      # Lists in dicts can be merged with different policies, depending on
-      # how the key in the "from" dict (k, the from-key) is written.
-      #
-      # If the from-key has          ...the to-list will have this action
-      # this character appended:...     applied when receiving the from-list:
-      #                           =  replace
-      #                           +  prepend
-      #                           ?  set, only if to-list does not yet exist
-      #                      (none)  append
-      #
-      # This logic is list-specific, but since it relies on the associated
-      # dict key, it's checked in this dict-oriented function.
-      ext = k[-1]
-      append = True
-      if ext == '=':
-        list_base = k[:-1]
-        lists_incompatible = [list_base, list_base + '?']
-        to[list_base] = []
-      elif ext == '+':
-        list_base = k[:-1]
-        lists_incompatible = [list_base + '=', list_base + '?']
-        append = False
-      elif ext == '?':
-        list_base = k[:-1]
-        lists_incompatible = [list_base, list_base + '=', list_base + '+']
-      else:
-        list_base = k
-        lists_incompatible = [list_base + '=', list_base + '?']
-
-      # Some combinations of merge policies appearing together are meaningless.
-      # It's stupid to replace and append simultaneously, for example.  Append
-      # and prepend are the only policies that can coexist.
-      for list_incompatible in lists_incompatible:
-        if list_incompatible in fro:
-          raise GypError('Incompatible list policies ' + k + ' and ' +
-                         list_incompatible)
-
-      if list_base in to:
-        if ext == '?':
-          # If the key ends in "?", the list will only be merged if it doesn't
-          # already exist.
-          continue
-        if not isinstance(to[list_base], list):
-          # This may not have been checked above if merging in a list with an
-          # extension character.
-          raise TypeError, \
-              'Attempt to merge dict value of type ' + v.__class__.__name__ + \
-              ' into incompatible type ' + to[list_base].__class__.__name__ + \
-              ' for key ' + list_base + '(' + k + ')'
-      else:
-        to[list_base] = []
-
-      # Call MergeLists, which will make copies of objects that require it.
-      # MergeLists can recurse back into MergeDicts, although this will be
-      # to make copies of dicts (with paths fixed), there will be no
-      # subsequent dict "merging" once entering a list because lists are
-      # always replaced, appended to, or prepended to.
-      is_paths = IsPathSection(list_base)
-      MergeLists(to[list_base], v, to_file, fro_file, is_paths, append)
-    else:
-      raise TypeError, \
-          'Attempt to merge dict value of unsupported type ' + \
-          v.__class__.__name__ + ' for key ' + k
-
-
-def MergeConfigWithInheritance(new_configuration_dict, build_file,
-                               target_dict, configuration, visited):
-  # Skip if previously visted.
-  if configuration in visited:
-    return
-
-  # Look at this configuration.
-  configuration_dict = target_dict['configurations'][configuration]
-
-  # Merge in parents.
-  for parent in configuration_dict.get('inherit_from', []):
-    MergeConfigWithInheritance(new_configuration_dict, build_file,
-                               target_dict, parent, visited + [configuration])
-
-  # Merge it into the new config.
-  MergeDicts(new_configuration_dict, configuration_dict,
-             build_file, build_file)
-
-  # Drop abstract.
-  if 'abstract' in new_configuration_dict:
-    del new_configuration_dict['abstract']
-
-
-def SetUpConfigurations(target, target_dict):
-  # key_suffixes is a list of key suffixes that might appear on key names.
-  # These suffixes are handled in conditional evaluations (for =, +, and ?)
-  # and rules/exclude processing (for ! and /).  Keys with these suffixes
-  # should be treated the same as keys without.
-  key_suffixes = ['=', '+', '?', '!', '/']
-
-  build_file = gyp.common.BuildFile(target)
-
-  # Provide a single configuration by default if none exists.
-  # TODO(mark): Signal an error if default_configurations exists but
-  # configurations does not.
-  if not 'configurations' in target_dict:
-    target_dict['configurations'] = {'Default': {}}
-  if not 'default_configuration' in target_dict:
-    concrete = [i for i in target_dict['configurations'].keys()
-                if not target_dict['configurations'][i].get('abstract')]
-    target_dict['default_configuration'] = sorted(concrete)[0]
-
-  for configuration in target_dict['configurations'].keys():
-    old_configuration_dict = target_dict['configurations'][configuration]
-    # Skip abstract configurations (saves work only).
-    if old_configuration_dict.get('abstract'):
-      continue
-    # Configurations inherit (most) settings from the enclosing target scope.
-    # Get the inheritance relationship right by making a copy of the target
-    # dict.
-    new_configuration_dict = copy.deepcopy(target_dict)
-
-    # Take out the bits that don't belong in a "configurations" section.
-    # Since configuration setup is done before conditional, exclude, and rules
-    # processing, be careful with handling of the suffix characters used in
-    # those phases.
-    delete_keys = []
-    for key in new_configuration_dict:
-      key_ext = key[-1:]
-      if key_ext in key_suffixes:
-        key_base = key[:-1]
-      else:
-        key_base = key
-      if key_base in non_configuration_keys:
-        delete_keys.append(key)
-
-    for key in delete_keys:
-      del new_configuration_dict[key]
-
-    # Merge in configuration (with all its parents first).
-    MergeConfigWithInheritance(new_configuration_dict, build_file,
-                               target_dict, configuration, [])
-
-    # Put the new result back into the target dict as a configuration.
-    target_dict['configurations'][configuration] = new_configuration_dict
-
-  # Now drop all the abstract ones.
-  for configuration in target_dict['configurations'].keys():
-    old_configuration_dict = target_dict['configurations'][configuration]
-    if old_configuration_dict.get('abstract'):
-      del target_dict['configurations'][configuration]
-
-  # Now that all of the target's configurations have been built, go through
-  # the target dict's keys and remove everything that's been moved into a
-  # "configurations" section.
-  delete_keys = []
-  for key in target_dict:
-    key_ext = key[-1:]
-    if key_ext in key_suffixes:
-      key_base = key[:-1]
-    else:
-      key_base = key
-    if not key_base in non_configuration_keys:
-      delete_keys.append(key)
-  for key in delete_keys:
-    del target_dict[key]
-
-  # Check the configurations to see if they contain invalid keys.
-  for configuration in target_dict['configurations'].keys():
-    configuration_dict = target_dict['configurations'][configuration]
-    for key in configuration_dict.keys():
-      if key in invalid_configuration_keys:
-        raise GypError('%s not allowed in the %s configuration, found in '
-                       'target %s' % (key, configuration, target))
-
-
-
-def ProcessListFiltersInDict(name, the_dict):
-  """Process regular expression and exclusion-based filters on lists.
-
-  An exclusion list is in a dict key named with a trailing "!", like
-  "sources!".  Every item in such a list is removed from the associated
-  main list, which in this example, would be "sources".  Removed items are
-  placed into a "sources_excluded" list in the dict.
-
-  Regular expression (regex) filters are contained in dict keys named with a
-  trailing "/", such as "sources/" to operate on the "sources" list.  Regex
-  filters in a dict take the form:
-    'sources/': [ ['exclude', '_(linux|mac|win)\\.cc$'],
-                  ['include', '_mac\\.cc$'] ],
-  The first filter says to exclude all files ending in _linux.cc, _mac.cc, and
-  _win.cc.  The second filter then includes all files ending in _mac.cc that
-  are now or were once in the "sources" list.  Items matching an "exclude"
-  filter are subject to the same processing as would occur if they were listed
-  by name in an exclusion list (ending in "!").  Items matching an "include"
-  filter are brought back into the main list if previously excluded by an
-  exclusion list or exclusion regex filter.  Subsequent matching "exclude"
-  patterns can still cause items to be excluded after matching an "include".
-  """
-
-  # Look through the dictionary for any lists whose keys end in "!" or "/".
-  # These are lists that will be treated as exclude lists and regular
-  # expression-based exclude/include lists.  Collect the lists that are
-  # needed first, looking for the lists that they operate on, and assemble
-  # then into |lists|.  This is done in a separate loop up front, because
-  # the _included and _excluded keys need to be added to the_dict, and that
-  # can't be done while iterating through it.
-
-  lists = []
-  del_lists = []
-  for key, value in the_dict.iteritems():
-    operation = key[-1]
-    if operation != '!' and operation != '/':
-      continue
-
-    if not isinstance(value, list):
-      raise ValueError, name + ' key ' + key + ' must be list, not ' + \
-                        value.__class__.__name__
-
-    list_key = key[:-1]
-    if list_key not in the_dict:
-      # This happens when there's a list like "sources!" but no corresponding
-      # "sources" list.  Since there's nothing for it to operate on, queue up
-      # the "sources!" list for deletion now.
-      del_lists.append(key)
-      continue
-
-    if not isinstance(the_dict[list_key], list):
-      raise ValueError, name + ' key ' + list_key + \
-                        ' must be list, not ' + \
-                        value.__class__.__name__ + ' when applying ' + \
-                        {'!': 'exclusion', '/': 'regex'}[operation]
-
-    if not list_key in lists:
-      lists.append(list_key)
-
-  # Delete the lists that are known to be unneeded at this point.
-  for del_list in del_lists:
-    del the_dict[del_list]
-
-  for list_key in lists:
-    the_list = the_dict[list_key]
-
-    # Initialize the list_actions list, which is parallel to the_list.  Each
-    # item in list_actions identifies whether the corresponding item in
-    # the_list should be excluded, unconditionally preserved (included), or
-    # whether no exclusion or inclusion has been applied.  Items for which
-    # no exclusion or inclusion has been applied (yet) have value -1, items
-    # excluded have value 0, and items included have value 1.  Includes and
-    # excludes override previous actions.  All items in list_actions are
-    # initialized to -1 because no excludes or includes have been processed
-    # yet.
-    list_actions = list((-1,) * len(the_list))
-
-    exclude_key = list_key + '!'
-    if exclude_key in the_dict:
-      for exclude_item in the_dict[exclude_key]:
-        for index in xrange(0, len(the_list)):
-          if exclude_item == the_list[index]:
-            # This item matches the exclude_item, so set its action to 0
-            # (exclude).
-            list_actions[index] = 0
-
-      # The "whatever!" list is no longer needed, dump it.
-      del the_dict[exclude_key]
-
-    regex_key = list_key + '/'
-    if regex_key in the_dict:
-      for regex_item in the_dict[regex_key]:
-        [action, pattern] = regex_item
-        pattern_re = re.compile(pattern)
-
-        if action == 'exclude':
-          # This item matches an exclude regex, so set its value to 0 (exclude).
-          action_value = 0
-        elif action == 'include':
-          # This item matches an include regex, so set its value to 1 (include).
-          action_value = 1
-        else:
-          # This is an action that doesn't make any sense.
-          raise ValueError, 'Unrecognized action ' + action + ' in ' + name + \
-                            ' key ' + regex_key
-
-        for index in xrange(0, len(the_list)):
-          list_item = the_list[index]
-          if list_actions[index] == action_value:
-            # Even if the regex matches, nothing will change so continue (regex
-            # searches are expensive).
-            continue
-          if pattern_re.search(list_item):
-            # Regular expression match.
-            list_actions[index] = action_value
-
-      # The "whatever/" list is no longer needed, dump it.
-      del the_dict[regex_key]
-
-    # Add excluded items to the excluded list.
-    #
-    # Note that exclude_key ("sources!") is different from excluded_key
-    # ("sources_excluded").  The exclude_key list is input and it was already
-    # processed and deleted; the excluded_key list is output and it's about
-    # to be created.
-    excluded_key = list_key + '_excluded'
-    if excluded_key in the_dict:
-      raise GypError(name + ' key ' + excluded_key +
-                     ' must not be present prior '
-                     ' to applying exclusion/regex filters for ' + list_key)
-
-    excluded_list = []
-
-    # Go backwards through the list_actions list so that as items are deleted,
-    # the indices of items that haven't been seen yet don't shift.  That means
-    # that things need to be prepended to excluded_list to maintain them in the
-    # same order that they existed in the_list.
-    for index in xrange(len(list_actions) - 1, -1, -1):
-      if list_actions[index] == 0:
-        # Dump anything with action 0 (exclude).  Keep anything with action 1
-        # (include) or -1 (no include or exclude seen for the item).
-        excluded_list.insert(0, the_list[index])
-        del the_list[index]
-
-    # If anything was excluded, put the excluded list into the_dict at
-    # excluded_key.
-    if len(excluded_list) > 0:
-      the_dict[excluded_key] = excluded_list
-
-  # Now recurse into subdicts and lists that may contain dicts.
-  for key, value in the_dict.iteritems():
-    if isinstance(value, dict):
-      ProcessListFiltersInDict(key, value)
-    elif isinstance(value, list):
-      ProcessListFiltersInList(key, value)
-
-
-def ProcessListFiltersInList(name, the_list):
-  for item in the_list:
-    if isinstance(item, dict):
-      ProcessListFiltersInDict(name, item)
-    elif isinstance(item, list):
-      ProcessListFiltersInList(name, item)
-
-
-def ValidateTargetType(target, target_dict):
-  """Ensures the 'type' field on the target is one of the known types.
-
-  Arguments:
-    target: string, name of target.
-    target_dict: dict, target spec.
-
-  Raises an exception on error.
-  """
-  VALID_TARGET_TYPES = ('executable', 'loadable_module',
-                        'static_library', 'shared_library',
-                        'none')
-  target_type = target_dict.get('type', None)
-  if target_type not in VALID_TARGET_TYPES:
-    raise GypError("Target %s has an invalid target type '%s'.  "
-                   "Must be one of %s." %
-                   (target, target_type, '/'.join(VALID_TARGET_TYPES)))
-  if (target_dict.get('standalone_static_library', 0) and
-      not target_type == 'static_library'):
-    raise GypError('Target %s has type %s but standalone_static_library flag is'
-                   ' only valid for static_library type.' % (target,
-                                                             target_type))
-
-
-def ValidateSourcesInTarget(target, target_dict, build_file):
-  # TODO: Check if MSVC allows this for loadable_module targets.
-  if target_dict.get('type', None) not in ('static_library', 'shared_library'):
-    return
-  sources = target_dict.get('sources', [])
-  basenames = {}
-  for source in sources:
-    name, ext = os.path.splitext(source)
-    is_compiled_file = ext in [
-        '.c', '.cc', '.cpp', '.cxx', '.m', '.mm', '.s', '.S']
-    if not is_compiled_file:
-      continue
-    basename = os.path.basename(name)  # Don't include extension.
-    basenames.setdefault(basename, []).append(source)
-
-  error = ''
-  for basename, files in basenames.iteritems():
-    if len(files) > 1:
-      error += '  %s: %s\n' % (basename, ' '.join(files))
-
-#  Duplicate basenames are not supported in MSVC08 and libtool on Mac, both of
-#  which Cobalt does not depend on, Chrome removed this gyp check back in the
-#  following CL: https://codereview.chromium.org/344573002/
-
-#  if error:
-#    print('static library %s has several files with the same basename:\n' %
-#          target + error + 'Some build systems, e.g. MSVC08, '
-#          'cannot handle that.')
-#    raise GypError('Duplicate basenames in sources section, see list above')
-
-
-def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules):
-  """Ensures that the rules sections in target_dict are valid and consistent,
-  and determines which sources they apply to.
-
-  Arguments:
-    target: string, name of target.
-    target_dict: dict, target spec containing "rules" and "sources" lists.
-    extra_sources_for_rules: a list of keys to scan for rule matches in
-        addition to 'sources'.
-  """
-
-  # Dicts to map between values found in rules' 'rule_name' and 'extension'
-  # keys and the rule dicts themselves.
-  rule_names = {}
-  rule_extensions = {}
-
-  rules = target_dict.get('rules', [])
-  for rule in rules:
-    # Make sure that there's no conflict among rule names and extensions.
-    rule_name = rule['rule_name']
-    if rule_name in rule_names:
-      raise GypError('rule %s exists in duplicate, target %s' %
-                     (rule_name, target))
-    rule_names[rule_name] = rule
-
-    rule_extension = rule['extension']
-    if rule_extension in rule_extensions:
-      raise GypError(('extension %s associated with multiple rules, ' +
-                      'target %s rules %s and %s') %
-                     (rule_extension, target,
-                      rule_extensions[rule_extension]['rule_name'],
-                      rule_name))
-    rule_extensions[rule_extension] = rule
-
-    # Make sure rule_sources isn't already there.  It's going to be
-    # created below if needed.
-    if 'rule_sources' in rule:
-      raise GypError(
-            'rule_sources must not exist in input, target %s rule %s' %
-            (target, rule_name))
-    extension = rule['extension']
-
-    rule_sources = []
-    source_keys = ['sources']
-    source_keys.extend(extra_sources_for_rules)
-    for source_key in source_keys:
-      for source in target_dict.get(source_key, []):
-        (source_root, source_extension) = os.path.splitext(source)
-        if source_extension.startswith('.'):
-          source_extension = source_extension[1:]
-        if source_extension == extension:
-          rule_sources.append(source)
-
-    if len(rule_sources) > 0:
-      rule['rule_sources'] = rule_sources
-
-
-def ValidateRunAsInTarget(target, target_dict, build_file):
-  target_name = target_dict.get('target_name')
-  run_as = target_dict.get('run_as')
-  if not run_as:
-    return
-  if not isinstance(run_as, dict):
-    raise GypError("The 'run_as' in target %s from file %s should be a "
-                   "dictionary." %
-                   (target_name, build_file))
-  action = run_as.get('action')
-  if not action:
-    raise GypError("The 'run_as' in target %s from file %s must have an "
-                   "'action' section." %
-                   (target_name, build_file))
-  if not isinstance(action, list):
-    raise GypError("The 'action' for 'run_as' in target %s from file %s "
-                   "must be a list." %
-                   (target_name, build_file))
-  working_directory = run_as.get('working_directory')
-  if working_directory and not isinstance(working_directory, str):
-    raise GypError("The 'working_directory' for 'run_as' in target %s "
-                   "in file %s should be a string." %
-                   (target_name, build_file))
-  environment = run_as.get('environment')
-  if environment and not isinstance(environment, dict):
-    raise GypError("The 'environment' for 'run_as' in target %s "
-                   "in file %s should be a dictionary." %
-                   (target_name, build_file))
-
-
-def ValidateActionsInTarget(target, target_dict, build_file):
-  '''Validates the inputs to the actions in a target.'''
-  target_name = target_dict.get('target_name')
-  actions = target_dict.get('actions', [])
-  for action in actions:
-    action_name = action.get('action_name')
-    if not action_name:
-      raise GypError("Anonymous action in target %s.  "
-                     "An action must have an 'action_name' field." %
-                     target_name)
-    inputs = action.get('inputs', None)
-    if inputs is None:
-      raise GypError('Action in target %s has no inputs.' % target_name)
-    action_command = action.get('action')
-    if action_command and not action_command[0]:
-      raise GypError("Empty action as command in target %s." % target_name)
-
-
-def TurnIntIntoStrInDict(the_dict):
-  """Given dict the_dict, recursively converts all integers into strings.
-  """
-  # Use items instead of iteritems because there's no need to try to look at
-  # reinserted keys and their associated values.
-  for k, v in the_dict.items():
-    if isinstance(v, int):
-      v = str(v)
-      the_dict[k] = v
-    elif isinstance(v, dict):
-      TurnIntIntoStrInDict(v)
-    elif isinstance(v, list):
-      TurnIntIntoStrInList(v)
-
-    if isinstance(k, int):
-      the_dict[str(k)] = v
-      del the_dict[k]
-
-
-def TurnIntIntoStrInList(the_list):
-  """Given list the_list, recursively converts all integers into strings.
-  """
-  for index in xrange(0, len(the_list)):
-    item = the_list[index]
-    if isinstance(item, int):
-      the_list[index] = str(item)
-    elif isinstance(item, dict):
-      TurnIntIntoStrInDict(item)
-    elif isinstance(item, list):
-      TurnIntIntoStrInList(item)
-
-
-def VerifyNoCollidingTargets(targets):
-  """Verify that no two targets in the same directory share the same name.
-
-  Arguments:
-    targets: A list of targets in the form 'path/to/file.gyp:target_name'.
-  """
-  # Keep a dict going from 'subdirectory:target_name' to 'foo.gyp'.
-  used = {}
-  for target in targets:
-    # Separate out 'path/to/file.gyp, 'target_name' from
-    # 'path/to/file.gyp:target_name'.
-    path, name = target.rsplit(':', 1)
-    # Separate out 'path/to', 'file.gyp' from 'path/to/file.gyp'.
-    subdir, gyp = os.path.split(path)
-    # Use '.' for the current directory '', so that the error messages make
-    # more sense.
-    if not subdir:
-      subdir = '.'
-    # Prepare a key like 'path/to:target_name'.
-    key = subdir + ':' + name
-    if key in used:
-      # Complain if this target is already used.
-      raise GypError('Duplicate target name "%s" in directory "%s" used both '
-                     'in "%s" and "%s".' % (name, subdir, gyp, used[key]))
-    used[key] = gyp
-
-
-def Load(build_files, variables, includes, depth, generator_input_info, check,
-         circular_check, parallel):
-  global generator_filelist_paths
-  generator_filelist_paths = generator_input_info['generator_filelist_paths']
-
-  # Set up path_sections and non_configuration_keys with the default data plus
-  # the generator-specifc data.
-  global path_sections
-  path_sections = base_path_sections[:]
-  path_sections.extend(generator_input_info['path_sections'])
-
-  global non_configuration_keys
-  non_configuration_keys = base_non_configuration_keys[:]
-  non_configuration_keys.extend(generator_input_info['non_configuration_keys'])
-
-  # TODO(mark) handle variants if the generator doesn't want them directly.
-  generator_handles_variants = \
-      generator_input_info['generator_handles_variants']
-
-  global absolute_build_file_paths
-  absolute_build_file_paths = \
-      generator_input_info['generator_wants_absolute_build_file_paths']
-
-  global multiple_toolsets
-  multiple_toolsets = generator_input_info[
-      'generator_supports_multiple_toolsets']
-
-  # A generator can have other lists (in addition to sources) be processed
-  # for rules.
-  extra_sources_for_rules = generator_input_info['extra_sources_for_rules']
-
-  # Load build files.  This loads every target-containing build file into
-  # the |data| dictionary such that the keys to |data| are build file names,
-  # and the values are the entire build file contents after "early" or "pre"
-  # processing has been done and includes have been resolved.
-  # NOTE: data contains both "target" files (.gyp) and "includes" (.gypi), as
-  # well as meta-data (e.g. 'included_files' key). 'target_build_files' keeps
-  # track of the keys corresponding to "target" files.
-  data = {'target_build_files': set()}
-  aux_data = {}
-  for build_file in build_files:
-    # Normalize paths everywhere.  This is important because paths will be
-    # used as keys to the data dict and for references between input files.
-    build_file = os.path.normpath(build_file)
-    try:
-      if parallel:
-        print >>sys.stderr, 'Using parallel processing (experimental).'
-        LoadTargetBuildFileParallel(build_file, data, aux_data,
-                                    variables, includes, depth, check)
-      else:
-        LoadTargetBuildFile(build_file, data, aux_data,
-                            variables, includes, depth, check, True)
-    except Exception, e:
-      gyp.common.ExceptionAppend(e, 'while trying to load %s' % build_file)
-      raise
-
-  # Build a dict to access each target's subdict by qualified name.
-  targets = BuildTargetsDict(data)
-
-  # Fully qualify all dependency links.
-  QualifyDependencies(targets)
-
-  # Expand dependencies specified as build_file:*.
-  ExpandWildcardDependencies(targets, data)
-
-  # Apply exclude (!) and regex (/) list filters only for dependency_sections.
-  for target_name, target_dict in targets.iteritems():
-    tmp_dict = {}
-    for key_base in dependency_sections:
-      for op in ('', '!', '/'):
-        key = key_base + op
-        if key in target_dict:
-          tmp_dict[key] = target_dict[key]
-          del target_dict[key]
-    ProcessListFiltersInDict(target_name, tmp_dict)
-    # Write the results back to |target_dict|.
-    for key in tmp_dict:
-      target_dict[key] = tmp_dict[key]
-
-  # Make sure every dependency appears at most once.
-  RemoveDuplicateDependencies(targets)
-
-  if circular_check:
-    # Make sure that any targets in a.gyp don't contain dependencies in other
-    # .gyp files that further depend on a.gyp.
-    VerifyNoGYPFileCircularDependencies(targets)
-
-  [dependency_nodes, flat_list] = BuildDependencyList(targets)
-
-  # Check that no two targets in the same directory have the same name.
-  VerifyNoCollidingTargets(flat_list)
-
-  # now that we have the entire dependency graph we can print it if asked
-  # we print it to stdout in completely dry python dictionary syntax
-  # each key in the dictionary is a target, the value is a list of direct
-  # dependencies that target has
-  if gyp.DEBUG_DEPENDENCIES in gyp.debug.keys():
-    depends_dict = {}
-    def clean_node_name(node_name):
-      # remove the '#target' suffix from all names
-      # and add the product_name
-      colon = node_name.index(':')
-      target_name = node_name[colon+1:-len('#target')]
-      gyp_path = node_name[:colon]
-      product_name = targets[node_name].get('product_name', target_name)
-      return gyp_path + ':' + target_name + ':' + product_name
-    for node_name, node in dependency_nodes.iteritems():
-      cleaned_list = [clean_node_name(i) for i in node.DirectDependencies()]
-      depends_dict[clean_node_name(node_name)] = cleaned_list
-    print 'depends_dict = %s' % depends_dict
-
-  # Handle dependent settings of various types.
-  for settings_type in ['all_dependent_settings',
-                        'direct_dependent_settings',
-                        'link_settings']:
-    DoDependentSettings(settings_type, flat_list, targets, dependency_nodes)
-
-    # Take out the dependent settings now that they've been published to all
-    # of the targets that require them.
-    for target in flat_list:
-      if settings_type in targets[target]:
-        del targets[target][settings_type]
-
-  # Make sure static libraries don't declare dependencies on other static
-  # libraries, but that linkables depend on all unlinked static libraries
-  # that they need so that their link steps will be correct.
-  gii = generator_input_info
-  if gii['generator_wants_static_library_dependencies_adjusted']:
-    AdjustStaticLibraryDependencies(flat_list, targets, dependency_nodes,
-                                    gii['generator_wants_sorted_dependencies'])
-
-  # Apply "post"/"late"/"target" variable expansions and condition evaluations.
-  for target in flat_list:
-    target_dict = targets[target]
-    build_file = gyp.common.BuildFile(target)
-    ProcessVariablesAndConditionsInDict(
-        target_dict, PHASE_LATE, variables, build_file)
-
-  # Move everything that can go into a "configurations" section into one.
-  for target in flat_list:
-    target_dict = targets[target]
-    SetUpConfigurations(target, target_dict)
-
-  # Apply exclude (!) and regex (/) list filters.
-  for target in flat_list:
-    target_dict = targets[target]
-    ProcessListFiltersInDict(target, target_dict)
-
-  # Apply "latelate" variable expansions and condition evaluations.
-  for target in flat_list:
-    target_dict = targets[target]
-    build_file = gyp.common.BuildFile(target)
-    ProcessVariablesAndConditionsInDict(
-        target_dict, PHASE_LATELATE, variables, build_file)
-
-  # Make sure that the rules make sense, and build up rule_sources lists as
-  # needed.  Not all generators will need to use the rule_sources lists, but
-  # some may, and it seems best to build the list in a common spot.
-  # Also validate actions and run_as elements in targets.
-  for target in flat_list:
-    target_dict = targets[target]
-    build_file = gyp.common.BuildFile(target)
-    ValidateTargetType(target, target_dict)
-    # TODO(thakis): Get vpx_scale/arm/scalesystemdependent.c to be renamed to
-    #               scalesystemdependent_arm_additions.c or similar.
-    if 'arm' not in variables.get('target_arch', ''):
-      ValidateSourcesInTarget(target, target_dict, build_file)
-    ValidateRulesInTarget(target, target_dict, extra_sources_for_rules)
-    ValidateRunAsInTarget(target, target_dict, build_file)
-    ValidateActionsInTarget(target, target_dict, build_file)
-
-  # Generators might not expect ints.  Turn them into strs.
-  TurnIntIntoStrInDict(data)
-
-  # TODO(mark): Return |data| for now because the generator needs a list of
-  # build files that came in.  In the future, maybe it should just accept
-  # a list, and not the whole data dict.
-  return [flat_list, targets, data]
diff --git a/tools/gyp/pylib/gyp/mac_tool.py b/tools/gyp/pylib/gyp/mac_tool.py
deleted file mode 100755
index 6926769..0000000
--- a/tools/gyp/pylib/gyp/mac_tool.py
+++ /dev/null
@@ -1,210 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Utility functions to perform Xcode-style build steps.
-
-These functions are executed via gyp-mac-tool when using the Makefile generator.
-"""
-
-import fcntl
-import os
-import plistlib
-import re
-import shutil
-import string
-import subprocess
-import sys
-
-
-def main(args):
-  executor = MacTool()
-  exit_code = executor.Dispatch(args)
-  if exit_code is not None:
-    sys.exit(exit_code)
-
-
-class MacTool(object):
-  """This class performs all the Mac tooling steps. The methods can either be
-  executed directly, or dispatched from an argument list."""
-
-  def Dispatch(self, args):
-    """Dispatches a string command to a method."""
-    if len(args) < 1:
-      raise Exception("Not enough arguments")
-
-    method = "Exec%s" % self._CommandifyName(args[0])
-    return getattr(self, method)(*args[1:])
-
-  def _CommandifyName(self, name_string):
-    """Transforms a tool name like copy-info-plist to CopyInfoPlist"""
-    return name_string.title().replace('-', '')
-
-  def ExecCopyBundleResource(self, source, dest):
-    """Copies a resource file to the bundle/Resources directory, performing any
-    necessary compilation on each resource."""
-    extension = os.path.splitext(source)[1].lower()
-    if os.path.isdir(source):
-      # Copy tree.
-      if os.path.exists(dest):
-        shutil.rmtree(dest)
-      shutil.copytree(source, dest)
-    elif extension == '.xib':
-      return self._CopyXIBFile(source, dest)
-    elif extension == '.strings':
-      self._CopyStringsFile(source, dest)
-    else:
-      shutil.copyfile(source, dest)
-
-  def _CopyXIBFile(self, source, dest):
-    """Compiles a XIB file with ibtool into a binary plist in the bundle."""
-    tools_dir = os.environ.get('DEVELOPER_BIN_DIR', '/usr/bin')
-    args = [os.path.join(tools_dir, 'ibtool'), '--errors', '--warnings',
-        '--notices', '--output-format', 'human-readable-text', '--compile',
-        dest, source]
-    ibtool_section_re = re.compile(r'/\*.*\*/')
-    ibtool_re = re.compile(r'.*note:.*is clipping its content')
-    ibtoolout = subprocess.Popen(args, stdout=subprocess.PIPE)
-    current_section_header = None
-    for line in ibtoolout.stdout:
-      if ibtool_section_re.match(line):
-        current_section_header = line
-      elif not ibtool_re.match(line):
-        if current_section_header:
-          sys.stdout.write(current_section_header)
-          current_section_header = None
-        sys.stdout.write(line)
-    return ibtoolout.returncode
-
-  def _CopyStringsFile(self, source, dest):
-    """Copies a .strings file using iconv to reconvert the input into UTF-16."""
-    input_code = self._DetectInputEncoding(source) or "UTF-8"
-    fp = open(dest, 'w')
-    args = ['/usr/bin/iconv', '--from-code', input_code, '--to-code',
-        'UTF-16', source]
-    subprocess.call(args, stdout=fp)
-    fp.close()
-
-  def _DetectInputEncoding(self, file_name):
-    """Reads the first few bytes from file_name and tries to guess the text
-    encoding. Returns None as a guess if it can't detect it."""
-    fp = open(file_name, 'rb')
-    try:
-      header = fp.read(3)
-    except e:
-      fp.close()
-      return None
-    fp.close()
-    if header.startswith("\xFE\xFF"):
-      return "UTF-16BE"
-    elif header.startswith("\xFF\xFE"):
-      return "UTF-16LE"
-    elif header.startswith("\xEF\xBB\xBF"):
-      return "UTF-8"
-    else:
-      return None
-
-  def ExecCopyInfoPlist(self, source, dest):
-    """Copies the |source| Info.plist to the destination directory |dest|."""
-    # Read the source Info.plist into memory.
-    fd = open(source, 'r')
-    lines = fd.read()
-    fd.close()
-
-    # Go through all the environment variables and replace them as variables in
-    # the file.
-    for key in os.environ:
-      if key.startswith('_'):
-        continue
-      evar = '${%s}' % key
-      lines = string.replace(lines, evar, os.environ[key])
-
-    # Write out the file with variables replaced.
-    fd = open(dest, 'w')
-    fd.write(lines)
-    fd.close()
-
-    # Now write out PkgInfo file now that the Info.plist file has been
-    # "compiled".
-    self._WritePkgInfo(dest)
-
-  def _WritePkgInfo(self, info_plist):
-    """This writes the PkgInfo file from the data stored in Info.plist."""
-    plist = plistlib.readPlist(info_plist)
-    if not plist:
-      return
-
-    # Only create PkgInfo for executable types.
-    package_type = plist['CFBundlePackageType']
-    if package_type != 'APPL':
-      return
-
-    # The format of PkgInfo is eight characters, representing the bundle type
-    # and bundle signature, each four characters. If that is missing, four
-    # '?' characters are used instead.
-    signature_code = plist.get('CFBundleSignature', '????')
-    if len(signature_code) != 4:  # Wrong length resets everything, too.
-      signature_code = '?' * 4
-
-    dest = os.path.join(os.path.dirname(info_plist), 'PkgInfo')
-    fp = open(dest, 'w')
-    fp.write('%s%s' % (package_type, signature_code))
-    fp.close()
-
-  def ExecFlock(self, lockfile, *cmd_list):
-    """Emulates the most basic behavior of Linux's flock(1)."""
-    # Rely on exception handling to report errors.
-    fd = os.open(lockfile, os.O_RDONLY|os.O_NOCTTY|os.O_CREAT, 0o666)
-    fcntl.flock(fd, fcntl.LOCK_EX)
-    return subprocess.call(cmd_list)
-
-  def ExecFilterLibtool(self, *cmd_list):
-    """Calls libtool and filters out 'libtool: file: foo.o has no symbols'."""
-    libtool_re = re.compile(r'^libtool: file: .* has no symbols$')
-    libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE)
-    _, err = libtoolout.communicate()
-    for line in err.splitlines():
-      if not libtool_re.match(line):
-        print >>sys.stderr, line
-    return libtoolout.returncode
-
-  def ExecPackageFramework(self, framework, version):
-    """Takes a path to Something.framework and the Current version of that and
-    sets up all the symlinks."""
-    # Find the name of the binary based on the part before the ".framework".
-    binary = os.path.basename(framework).split('.')[0]
-
-    CURRENT = 'Current'
-    RESOURCES = 'Resources'
-    VERSIONS = 'Versions'
-
-    if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)):
-      # Binary-less frameworks don't seem to contain symlinks (see e.g.
-      # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle).
-      return
-
-    # Move into the framework directory to set the symlinks correctly.
-    pwd = os.getcwd()
-    os.chdir(framework)
-
-    # Set up the Current version.
-    self._Relink(version, os.path.join(VERSIONS, CURRENT))
-
-    # Set up the root symlinks.
-    self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary)
-    self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES)
-
-    # Back to where we were before!
-    os.chdir(pwd)
-
-  def _Relink(self, dest, link):
-    """Creates a symlink to |dest| named |link|. If |link| already exists,
-    it is overwritten."""
-    if os.path.lexists(link):
-      os.remove(link)
-    os.symlink(dest, link)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/tools/gyp/pylib/gyp/msvs_emulation.py b/tools/gyp/pylib/gyp/msvs_emulation.py
deleted file mode 100755
index ba2812c..0000000
--- a/tools/gyp/pylib/gyp/msvs_emulation.py
+++ /dev/null
@@ -1,884 +0,0 @@
-# Copyright (c) 2012 Google Inc. 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 helps emulate Visual Studio 2008 behavior on top of other
-build systems, primarily ninja.
-"""
-
-from difflib import get_close_matches
-import os
-import re
-import subprocess
-import sys
-
-if sys.platform in ['cygwin']:
-  import cygpath
-
-import gyp.MSVSVersion
-
-windows_quoter_regex = re.compile(r'(\\*)"')
-
-def QuoteForRspFile(arg):
-  """Quote a command line argument so that it appears as one argument when
-  processed via cmd.exe and parsed by CommandLineToArgvW (as is typical for
-  Windows programs)."""
-  # See http://goo.gl/cuFbX and http://goo.gl/dhPnp including the comment
-  # threads. This is actually the quoting rules for CommandLineToArgvW, not
-  # for the shell, because the shell doesn't do anything in Windows. This
-  # works more or less because most programs (including the compiler, etc.)
-  # use that function to handle command line arguments.
-
-  # For a literal quote, CommandLineToArgvW requires 2n+1 backslashes
-  # preceding it, and results in n backslashes + the quote. So we substitute
-  # in 2* what we match, +1 more, plus the quote.
-  arg = windows_quoter_regex.sub(lambda mo: 2 * mo.group(1) + '\\"', arg)
-
-  # %'s also need to be doubled otherwise they're interpreted as batch
-  # positional arguments. Also make sure to escape the % so that they're
-  # passed literally through escaping so they can be singled to just the
-  # original %. Otherwise, trying to pass the literal representation that
-  # looks like an environment variable to the shell (e.g. %PATH%) would fail.
-  arg = arg.replace('%', '%%')
-
-  # These commands are used in rsp files, so no escaping for the shell (via ^)
-  # is necessary.
-
-  # Finally, wrap the whole thing in quotes so that the above quote rule
-  # applies and whitespace isn't a word break.
-  return '"' + arg + '"'
-
-
-def EncodeRspFileList(args):
-  """Process a list of arguments using QuoteCmdExeArgument."""
-  # Note that the first argument is assumed to be the command. Don't add
-  # quotes around it because then built-ins like 'echo', etc. won't work.
-  # Take care to normpath only the path in the case of 'call ../x.bat' because
-  # otherwise the whole thing is incorrectly interpreted as a path and not
-  # normalized correctly.
-  if not args: return ''
-  if args[0].startswith('call '):
-    call, program = args[0].split(' ', 1)
-    program = call + ' ' + os.path.normpath(program)
-  else:
-    program = os.path.normpath(args[0])
-  return program + ' ' + ' '.join(QuoteForRspFile(arg) for arg in args[1:])
-
-
-def _GenericRetrieve(root, default, path):
-  """Given a list of dictionary keys |path| and a tree of dicts |root|, find
-  value at path, or return |default| if any of the path doesn't exist."""
-  if not root:
-    return default
-  if not path:
-    return root
-  return _GenericRetrieve(root.get(path[0]), default, path[1:])
-
-
-def _AddPrefix(element, prefix):
-  """Add |prefix| to |element| or each subelement if element is iterable."""
-  if element is None:
-    return element
-  # Note, not Iterable because we don't want to handle strings like that.
-  if isinstance(element, list) or isinstance(element, tuple):
-    return [prefix + e for e in element]
-  else:
-    return prefix + element
-
-
-def _CallMap(map, element):
-  e = map(element)
-  if e is None:
-    raise Exception('Invalid element %s' % element)
-  return e
-
-def _DoRemapping(element, map):
-  """If |element| then remap it through |map|. If |element| is iterable then
-  each item will be remapped. Any elements not found will be removed."""
-  if map is not None and element is not None:
-    if not callable(map):
-      map = map.get # Assume it's a dict, otherwise a callable to do the remap.
-    if isinstance(element, list) or isinstance(element, tuple):
-      element = [_CallMap(map, elem) for elem in element]
-    else:
-      element = _CallMap(map, element)
-
-  return element
-
-
-def _AppendOrReturn(append, element):
-  """If |append| is None, simply return |element|. If |append| is not None,
-  then add |element| to it, adding each item in |element| if it's a list or
-  tuple."""
-  if append is not None and element is not None:
-    if isinstance(element, list) or isinstance(element, tuple):
-      append.extend(element)
-    else:
-      append.append(element)
-  else:
-    return element
-
-
-def _FindDirectXInstallation():
-  """Try to find an installation location for the DirectX SDK. Check for the
-  standard environment variable, and if that doesn't exist, try to find
-  via the registry. May return None if not found in either location."""
-  # Return previously calculated value, if there is one
-  if hasattr(_FindDirectXInstallation, 'dxsdk_dir'):
-    return _FindDirectXInstallation.dxsdk_dir
-
-  dxsdk_dir = os.environ.get('DXSDK_DIR')
-  if not dxsdk_dir:
-    # Setup params to pass to and attempt to launch reg.exe.
-    cmd = ['reg.exe', 'query', r'HKLM\Software\Microsoft\DirectX', '/s']
-    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    for line in p.communicate()[0].splitlines():
-      if 'InstallPath' in line:
-        dxsdk_dir = line.split('    ')[3] + "\\"
-
-  # Cache return value
-  _FindDirectXInstallation.dxsdk_dir = dxsdk_dir
-  return dxsdk_dir
-
-
-class MsvsSettings(object):
-  """A class that understands the gyp 'msvs_...' values (especially the
-  msvs_settings field). They largely correpond to the VS2008 IDE DOM. This
-  class helps map those settings to command line options."""
-
-  def __init__(self, spec, generator_flags):
-    self.spec = spec
-    self.vs_version = GetVSVersion(generator_flags)
-    self.dxsdk_dir = _FindDirectXInstallation()
-
-    # Try to find an installation location for the Windows DDK by checking
-    # the WDK_DIR environment variable, may be None.
-    self.wdk_dir = os.environ.get('WDK_DIR')
-
-    supported_fields = [
-        ('msvs_configuration_attributes', dict),
-        ('msvs_settings', dict),
-        ('msvs_system_include_dirs', list),
-        ('msvs_disabled_warnings', list),
-        ('msvs_precompiled_header', str),
-        ('msvs_precompiled_source', str),
-        ('msvs_configuration_platform', str),
-        ('msvs_target_platform', str),
-        ]
-    validators = {
-        'msvs_settings': self._SettingsValidator,
-    }
-    configs = spec['configurations']
-    for field, default in supported_fields:
-      setattr(self, field, {})
-      for configname, config in configs.iteritems():
-        getattr(self, field)[configname] = config.get(field, default())
-        if field in validators:
-            validators[field](configname)
-
-    self.msvs_cygwin_dirs = spec.get('msvs_cygwin_dirs', ['.'])
-
-  def GetVSMacroEnv(self, base_to_build=None, config=None):
-    """Get a dict of variables mapping internal VS macro names to their gyp
-    equivalents."""
-    vs_path = self.vs_version.Path()
-    # Absolute paths in cygwin the path will start with /cygdrive/c/
-    # The MS compiler tools need
-    # TODO: this is getting generated from the vs install path
-    # need to pass this in, or fix earlier in generation
-    if sys.platform == 'cygwin':
-      vs_path = cygpath.to_nt(vs_path)
-
-    target_platform = 'Win32' if self.GetArch(config) == 'x86' else 'x64'
-
-    replacements = {
-        '$(VSInstallDir)': vs_path,
-        '$(VCInstallDir)': os.path.join(vs_path, 'VC') + '\\',
-        '$(OutDir)\\': base_to_build + '\\' if base_to_build else '',
-        '$(IntDir)': '$!INTERMEDIATE_DIR',
-        '$(InputPath)': '${source}',
-        '$(InputName)': '${root}',
-        '$(ProjectName)': self.spec['target_name'],
-        '$(PlatformName)': target_platform,
-        '$(ProjectDir)\\': '',
-    }
-
-    # Chromium uses DXSDK_DIR in include/lib paths, but it may or may not be
-    # set. This happens when the SDK is sync'd via src-internal, rather than
-    # by typical end-user installation of the SDK. If it's not set, we don't
-    # want to leave the unexpanded variable in the path, so simply strip it.
-    replacements['$(DXSDK_DIR)'] = self.dxsdk_dir if self.dxsdk_dir else ''
-    replacements['$(WDK_DIR)'] = self.wdk_dir if self.wdk_dir else ''
-    return replacements
-
-  def ConvertVSMacros(self, s, base_to_build=None, config=None):
-    """Convert from VS macro names to something equivalent."""
-    env = self.GetVSMacroEnv(base_to_build, config=config)
-    return ExpandMacros(s, env)
-
-  def AdjustLibraries(self, libraries):
-    """Strip -l from library if it's specified with that."""
-    return [lib[2:] if lib.startswith('-l') else lib for lib in libraries]
-
-  def _GetAndMunge(self, field, path, default, prefix, append, map):
-    """Retrieve a value from |field| at |path| or return |default|. If
-    |append| is specified, and the item is found, it will be appended to that
-    object instead of returned. If |map| is specified, results will be
-    remapped through |map| before being returned or appended."""
-    result = _GenericRetrieve(field, default, path)
-    result = _DoRemapping(result, map)
-    result = _AddPrefix(result, prefix)
-    return _AppendOrReturn(append, result)
-
-  class _GetWrapper(object):
-    def __init__(self, parent, field, base_path, append=None):
-      self.parent = parent
-      self.field = field
-      self.base_path = [base_path]
-      self.append = append
-    def __call__(self, name, map=None, prefix='', default=None):
-      return self.parent._GetAndMunge(self.field, self.base_path + [name],
-          default=default, prefix=prefix, append=self.append, map=map)
-
-  def GetArch(self, config):
-    """Get architecture based on msvs_configuration_platform and
-    msvs_target_platform. Returns either 'x86' or 'x64'."""
-    configuration_platform = self.msvs_configuration_platform.get(config, '')
-    platform = self.msvs_target_platform.get(config, '')
-    if not platform: # If no specific override, use the configuration's.
-      platform = configuration_platform
-    # Map from platform to architecture.
-    return {'Win32': 'x86', 'x64': 'x64'}.get(platform, 'x86')
-
-  def _TargetConfig(self, config):
-    """Returns the target-specific configuration."""
-    # On Cobalt, we're not using any suffix on config names like Win_Debug_x64.
-    # Cobalt on Windows is x64 only.
-    return config
-
-  def _Setting(self, path, config,
-              default=None, prefix='', append=None, map=None):
-    """_GetAndMunge for msvs_settings."""
-    return self._GetAndMunge(
-        self.msvs_settings[config], path, default, prefix, append, map)
-
-  def _SettingsValidator(self, configname):
-    """Validate msvs_settings."""
-    valid_fields = [
-        'VCCLCompilerTool',
-        'VCLinkerTool',
-        'VCLibrarianTool',
-        'VCMIDLTool',
-        'VCResourceCompilerTool',
-        'VCManifestTool',
-    ]
-    for field in self.msvs_settings[configname]:
-      if field not in valid_fields:
-        message = ('Invalid msvs_settings field: "%s", '
-                   'config: "%s"' % (field, configname))
-        close_match = get_close_matches(field, valid_fields, 1)
-        if close_match:
-          message += '\nDid you mean %s?' %  tuple(close_match)
-        raise Exception(message)
-
-  def _ConfigAttrib(self, path, config,
-                   default=None, prefix='', append=None, map=None):
-    """_GetAndMunge for msvs_configuration_attributes."""
-    return self._GetAndMunge(
-        self.msvs_configuration_attributes[config],
-        path, default, prefix, append, map)
-
-  def AdjustIncludeDirs(self, include_dirs, config):
-    """Updates include_dirs to expand VS specific paths, and adds the system
-    include dirs used for platform SDK and similar."""
-    config = self._TargetConfig(config)
-    includes = include_dirs + self.msvs_system_include_dirs[config]
-    includes.extend(self._Setting(
-      ('VCCLCompilerTool', 'AdditionalIncludeDirectories'), config, default=[]))
-    return [self.ConvertVSMacros(p, config=config) for p in includes]
-
-  def GetComputedDefines(self, config):
-    """Returns the set of defines that are injected to the defines list based
-    on other VS settings."""
-    config = self._TargetConfig(config)
-    defines = []
-    if self._ConfigAttrib(['CharacterSet'], config) == '1':
-      defines.extend(('_UNICODE', 'UNICODE'))
-    if self._ConfigAttrib(['CharacterSet'], config) == '2':
-      defines.append('_MBCS')
-    defines.extend(self._Setting(
-        ('VCCLCompilerTool', 'PreprocessorDefinitions'), config, default=[]))
-    return defines
-
-  def GetOutputName(self, config, expand_special):
-    """Gets the explicitly overridden output name for a target or returns None
-    if it's not overridden."""
-    config = self._TargetConfig(config)
-    type = self.spec['type']
-    root = 'VCLibrarianTool' if type == 'static_library' else 'VCLinkerTool'
-    # TODO(scottmg): Handle OutputDirectory without OutputFile.
-    output_file = self._Setting((root, 'OutputFile'), config)
-    if output_file:
-      output_file = expand_special(self.ConvertVSMacros(
-          output_file, config=config))
-    return output_file
-
-  def GetPDBName(self, config, expand_special):
-    """Gets the explicitly overridden pdb name for a target or returns None
-    if it's not overridden."""
-    config = self._TargetConfig(config)
-    output_file = self._Setting(('VCLinkerTool', 'ProgramDatabaseFile'), config)
-    if output_file:
-      output_file = expand_special(self.ConvertVSMacros(
-          output_file, config=config))
-    return output_file
-
-  def GetCflags(self, config):
-    """Returns the flags that need to be added to .c and .cc compilations."""
-    config = self._TargetConfig(config)
-    cflags = []
-    cflags.extend(['/wd' + w for w in self.msvs_disabled_warnings[config]])
-    cl = self._GetWrapper(self, self.msvs_settings[config],
-                          'VCCLCompilerTool', append=cflags)
-    cl('Optimization',
-       map={'0': 'd', '1': '1', '2': '2', '3': 'x'}, prefix='/O')
-    cl('InlineFunctionExpansion', prefix='/Ob')
-    cl('OmitFramePointers', map={'false': '-', 'true': ''}, prefix='/Oy')
-    cl('FavorSizeOrSpeed', map={'1': 't', '2': 's'}, prefix='/O')
-    cl('WholeProgramOptimization', map={'true': '/GL'})
-    cl('WarningLevel', prefix='/W')
-    cl('WarnAsError', map={'false': '', 'true': '/WX'})
-    cl('DebugInformationFormat',
-        map={'1': '7', '3': 'i', '4': 'I'}, prefix='/Z')
-    cl('RuntimeTypeInfo', map={'true': '/GR', 'false': '/GR-'})
-    cl('EnableFunctionLevelLinking', map={'true': '/Gy', 'false': '/Gy-'})
-    cl('MinimalRebuild', map={'true': '/Gm', 'false': '/Gm-'})
-    cl('BufferSecurityCheck', map={'true': '/GS', 'false': '/GS-'})
-    cl('BasicRuntimeChecks', map={'1': 's', '2': 'u', '3': '1'}, prefix='/RTC')
-    cl('RuntimeLibrary',
-        map={'0': 'T', '1': 'Td', '2': 'D', '3': 'Dd'}, prefix='/M')
-    cl('ExceptionHandling', map={'1': 'sc','2': 'a'}, prefix='/EH')
-    cl('EnablePREfast', map={'true': '/analyze'})
-    cl('AdditionalOptions', prefix='')
-    cflags.extend(['/FI' + f for f in self._Setting(
-        ('VCCLCompilerTool', 'ForcedIncludeFiles'), config, default=[])])
-    cflags.extend(['/Zc:' + f for f in self._Setting(
-        ('VCCLCompilerTool', 'Conformance'), config, default=[])])
-
-    # ninja handles parallelism by itself, don't have the compiler do it too.
-    cflags = filter(lambda x: not x.startswith('/MP'), cflags)
-    return cflags
-
-  def GetPrecompiledHeader(self, config, gyp_to_build_path):
-    """Returns an object that handles the generation of precompiled header
-    build steps."""
-    config = self._TargetConfig(config)
-    return _PchHelper(self, config, gyp_to_build_path)
-
-  def _GetPchFlags(self, config, extension):
-    """Get the flags to be added to the cflags for precompiled header support.
-    """
-    config = self._TargetConfig(config)
-    # The PCH is only built once by a particular source file. Usage of PCH must
-    # only be for the same language (i.e. C vs. C++), so only include the pch
-    # flags when the language matches.
-    if self.msvs_precompiled_header[config]:
-      source_ext = os.path.splitext(self.msvs_precompiled_source[config])[1]
-      if _LanguageMatchesForPch(source_ext, extension):
-        pch = os.path.split(self.msvs_precompiled_header[config])[1]
-        return ['/Yu' + pch, '/FI' + pch, '/Fp${pchprefix}.' + pch + '.pch']
-    return  []
-
-  def UsesComponentExtensions(self, config):
-    return self._Setting(
-        ('VCCLCompilerTool', 'ComponentExtensions'), config, default=[])
-
-  def GetCflagsC(self, config):
-    """Returns the flags that need to be added to .c compilations."""
-    config = self._TargetConfig(config)
-    return self._GetPchFlags(config, '.c')
-
-  def GetCflagsCC(self, config):
-    """Returns the flags that need to be added to .cc compilations."""
-    config = self._TargetConfig(config)
-    ccflags = []
-    cl = self._GetWrapper(self, self.msvs_settings[config],
-                          'VCCLCompilerTool', append=ccflags)
-    cl('ComponentExtensions', map={'true': '/ZW'})
-
-    if self.UsesComponentExtensions(config):
-      # Disable PCH for libs compiled with /ZW, even if it was requested.
-      # Causes a fatal compiler error.
-      return ['/TP'] + ccflags
-    else:
-      return ['/TP'] + self._GetPchFlags(config, '.cc') + ccflags
-
-  def _GetAdditionalLibraryDirectories(self, root, config, gyp_to_build_path):
-    """Get and normalize the list of paths in AdditionalLibraryDirectories
-    setting."""
-    config = self._TargetConfig(config)
-    libpaths = self._Setting((root, 'AdditionalLibraryDirectories'),
-                             config, default=[])
-    libpaths = [os.path.normpath(
-                    gyp_to_build_path(self.ConvertVSMacros(p, config=config)))
-                for p in libpaths]
-    return ['/LIBPATH:"' + p + '"' for p in libpaths]
-
-  def GetLibFlags(self, config, gyp_to_build_path):
-    """Returns the flags that need to be added to lib commands."""
-    config = self._TargetConfig(config)
-    libflags = []
-    lib = self._GetWrapper(self, self.msvs_settings[config],
-                          'VCLibrarianTool', append=libflags)
-    libflags.extend(self._GetAdditionalLibraryDirectories(
-        'VCLibrarianTool', config, gyp_to_build_path))
-    lib('AdditionalOptions')
-    return libflags
-
-  def _GetDefFileAsLdflags(self, spec, ldflags, gyp_to_build_path):
-    """.def files get implicitly converted to a ModuleDefinitionFile for the
-    linker in the VS generator. Emulate that behaviour here."""
-    def_file = ''
-    if spec['type'] in ('shared_library', 'loadable_module', 'executable'):
-      def_files = [s for s in spec.get('sources', []) if s.endswith('.def')]
-      if len(def_files) == 1:
-        ldflags.append('/DEF:"%s"' % gyp_to_build_path(def_files[0]))
-      elif len(def_files) > 1:
-        raise Exception("Multiple .def files")
-
-  def GetLdflags(self, config, gyp_to_build_path, expand_special,
-                 manifest_base_name, is_executable):
-    """Returns the flags that need to be added to link commands, and the
-    manifest files."""
-    config = self._TargetConfig(config)
-    ldflags = []
-    ld = self._GetWrapper(self, self.msvs_settings[config],
-                          'VCLinkerTool', append=ldflags)
-    self._GetDefFileAsLdflags(self.spec, ldflags, gyp_to_build_path)
-    ld('GenerateDebugInformation', map={'true': '/DEBUG'})
-    ld('TargetMachine', map={'1': 'X86', '17': 'X64'}, prefix='/MACHINE:')
-    ldflags.extend(self._GetAdditionalLibraryDirectories(
-        'VCLinkerTool', config, gyp_to_build_path))
-    ld('DelayLoadDLLs', prefix='/DELAYLOAD:')
-    out = self.GetOutputName(config, expand_special)
-    if out:
-      ldflags.append('/OUT:' + out)
-    pdb = self.GetPDBName(config, expand_special)
-    if pdb:
-      ldflags.append('/PDB:' + pdb)
-    ld('AdditionalOptions', prefix='')
-    ld('SubSystem', map={'1': 'CONSOLE', '2': 'WINDOWS'}, prefix='/SUBSYSTEM:')
-    ld('LinkIncremental', map={'1': ':NO', '2': ''}, prefix='/INCREMENTAL')
-    ld('FixedBaseAddress', map={'1': ':NO', '2': ''}, prefix='/FIXED')
-    ld('RandomizedBaseAddress',
-        map={'1': ':NO', '2': ''}, prefix='/DYNAMICBASE')
-    ld('DataExecutionPrevention',
-        map={'1': ':NO', '2': ''}, prefix='/NXCOMPAT')
-    ld('OptimizeReferences', map={'1': 'NOREF', '2': 'REF'}, prefix='/OPT:')
-    ld('EnableCOMDATFolding', map={'1': 'NOICF', '2': 'ICF'}, prefix='/OPT:')
-    ld('LinkTimeCodeGeneration', map={'1': '/LTCG'})
-    ld('IgnoreDefaultLibraryNames', prefix='/NODEFAULTLIB:')
-    ld('ResourceOnlyDLL', map={'true': '/NOENTRY'})
-    ld('EntryPointSymbol', prefix='/ENTRY:')
-    ld('Profile', map={ 'true': '/PROFILE'})
-    # TODO(scottmg): This should sort of be somewhere else (not really a flag).
-    ld('AdditionalDependencies', prefix='')
-
-    if not config.startswith('XB360'):
-      # If the base address is not specifically controlled, DYNAMICBASE should
-      # be on by default.
-      base_flags = filter(lambda x: 'DYNAMICBASE' in x or x == '/FIXED',
-                          ldflags)
-      if not base_flags:
-        ldflags.append('/DYNAMICBASE')
-
-      # If the NXCOMPAT flag has not been specified, default to on. Despite the
-      # documentation that says this only defaults to on when the subsystem is
-      # Vista or greater (which applies to the linker), the IDE defaults it on
-      # unless it's explicitly off.
-      if not filter(lambda x: 'NXCOMPAT' in x, ldflags):
-        ldflags.append('/NXCOMPAT')
-
-    have_def_file = filter(lambda x: x.startswith('/DEF:'), ldflags)
-    manifest_flags, intermediate_manifest_file = self._GetLdManifestFlags(
-        config, manifest_base_name, is_executable and not have_def_file)
-    ldflags.extend(manifest_flags)
-    manifest_files = self._GetAdditionalManifestFiles(config, gyp_to_build_path)
-    manifest_files.append(intermediate_manifest_file)
-
-    return ldflags, manifest_files
-
-  def _GetLdManifestFlags(self, config, name, allow_isolation):
-    """Returns the set of flags that need to be added to the link to generate
-    a default manifest, as well as the name of the generated file."""
-    output_name = name + '.intermediate.manifest'
-    # Manifests are off for UWP. If needed by another target,
-    # please find a way to configure them per target.
-    flags = [
-      '/MANIFEST:NO',
-    ]
-    return flags, output_name
-
-  def _GetAdditionalManifestFiles(self, config, gyp_to_build_path):
-    """Gets additional manifest files that are added to the default one
-    generated by the linker."""
-    files = self._Setting(('VCManifestTool', 'AdditionalManifestFiles'), config,
-                          default=[])
-    if (self._Setting(
-        ('VCManifestTool', 'EmbedManifest'), config, default='') == 'true'):
-      print 'gyp/msvs_emulation.py: "EmbedManifest: true" not yet supported.'
-    if isinstance(files, str):
-      files = files.split(';')
-    return [os.path.normpath(
-                gyp_to_build_path(self.ConvertVSMacros(f, config=config)))
-            for f in files]
-
-  def IsUseLibraryDependencyInputs(self, config):
-    """Returns whether the target should be linked via Use Library Dependency
-    Inputs (using component .objs of a given .lib)."""
-    config = self._TargetConfig(config)
-    uldi = self._Setting(('VCLinkerTool', 'UseLibraryDependencyInputs'), config)
-    return uldi == 'true'
-
-  def GetRcflags(self, config, gyp_to_ninja_path):
-    """Returns the flags that need to be added to invocations of the resource
-    compiler."""
-    config = self._TargetConfig(config)
-    rcflags = []
-    rc = self._GetWrapper(self, self.msvs_settings[config],
-        'VCResourceCompilerTool', append=rcflags)
-    rc('AdditionalIncludeDirectories', map=gyp_to_ninja_path, prefix='/I')
-    rcflags.append('/I' + gyp_to_ninja_path('.'))
-    rc('PreprocessorDefinitions', prefix='/d')
-    # /l arg must be in hex without leading '0x'
-    rc('Culture', prefix='/l', map=lambda x: hex(int(x))[2:])
-    return rcflags
-
-  def BuildCygwinBashCommandLine(self, args, path_to_base):
-    """Build a command line that runs args via cygwin bash. We assume that all
-    incoming paths are in Windows normpath'd form, so they need to be
-    converted to posix style for the part of the command line that's passed to
-    bash. We also have to do some Visual Studio macro emulation here because
-    various rules use magic VS names for things. Also note that rules that
-    contain ninja variables cannot be fixed here (for example ${source}), so
-    the outer generator needs to make sure that the paths that are written out
-    are in posix style, if the command line will be used here."""
-    cygwin_dir = os.path.normpath(
-        os.path.join(path_to_base, self.msvs_cygwin_dirs[0]))
-    cd = ('cd %s' % path_to_base).replace('\\', '/')
-    args = [a.replace('\\', '/').replace('"', '\\"') for a in args]
-    args = ["'%s'" % a.replace("'", "'\\''") for a in args]
-    bash_cmd = ' '.join(args)
-    cmd = (
-        'call "%s\\setup_env.bat" && set CYGWIN=nontsec && ' % cygwin_dir +
-        'bash -c "%s ; %s"' % (cd, bash_cmd))
-    return cmd
-
-  def IsRuleRunUnderCygwin(self, rule):
-    """Determine if an action should be run under cygwin. If the variable is
-    unset, or set to 1 we use cygwin."""
-    value = int(rule.get('msvs_cygwin_shell',
-                        self.spec.get('msvs_cygwin_shell', 0))) != 0
-    if value:
-      raise Exception("Cygwin usage is no longer allowed in Cobalt Gyp")
-    return False
-
-  def _HasExplicitRuleForExtension(self, spec, extension):
-    """Determine if there's an explicit rule for a particular extension."""
-    for rule in spec.get('rules', []):
-      if rule['extension'] == extension:
-        return True
-    return False
-
-  def HasExplicitIdlRules(self, spec):
-    """Determine if there's an explicit rule for idl files. When there isn't we
-    need to generate implicit rules to build MIDL .idl files."""
-    return self._HasExplicitRuleForExtension(spec, 'idl')
-
-  def HasExplicitAsmRules(self, spec):
-    """Determine if there's an explicit rule for asm files. When there isn't we
-    need to generate implicit rules to assemble .asm files."""
-    return self._HasExplicitRuleForExtension(spec, 'asm')
-
-  def GetIdlBuildData(self, source, config):
-    """Determine the implicit outputs for an idl file. Returns output
-    directory, outputs, and variables and flags that are required."""
-    config = self._TargetConfig(config)
-    midl_get = self._GetWrapper(self, self.msvs_settings[config], 'VCMIDLTool')
-    def midl(name, default=None):
-      return self.ConvertVSMacros(midl_get(name, default=default),
-                                  config=config)
-    if config.startswith('xb1'):
-      tlb = ''
-      header = midl('HeaderFileName', default='${root}.h')
-      dlldata = ''
-      iid = ''
-      proxy = ''
-      outdir = midl('OutputDirectory', default='')
-    else:
-      tlb = midl('TypeLibraryName', default='${root}.tlb')
-      header = midl('HeaderFileName', default='${root}.h')
-      dlldata = midl('DLLDataFileName', default='dlldata.c')
-      iid = midl('InterfaceIdentifierFileName', default='${root}_i.c')
-      proxy = midl('ProxyFileName', default='${root}_p.c')
-      # Note that .tlb is not included in the outputs as it is not always
-      # generated depending on the content of the input idl file.
-      outdir = midl('OutputDirectory', default='')
-    if config.startswith('xb1'):
-      output = [header]
-    else:
-      output = [header, dlldata, iid, proxy]
-    variables = [('tlb', tlb),
-                 ('h', header),
-                 ('dlldata', dlldata),
-                 ('iid', iid),
-                 ('proxy', proxy)]
-    if config.startswith('xb1'):
-      metadata_dir = '"%s%s"' % ('C:\\Program Files (x86)\\Windows Kits\\10\\',
-                                 'UnionMetadata')
-      flags = ['/env', 'x64', '/W1', '/char', 'signed', '/enum_class',
-               '/metadata_dir', metadata_dir, '/notlb', '/winrt']
-    else:
-      # TODO(scottmg): Are there configuration settings to set these flags?
-      flags = ['/char', 'signed', '/env', 'win32', '/Oicf']
-    return outdir, output, variables, flags
-
-
-def _LanguageMatchesForPch(source_ext, pch_source_ext):
-  c_exts = ('.c',)
-  cc_exts = ('.cc', '.cxx', '.cpp')
-  return ((source_ext in c_exts and pch_source_ext in c_exts) or
-          (source_ext in cc_exts and pch_source_ext in cc_exts))
-
-
-class PrecompiledHeader(object):
-  """Helper to generate dependencies and build rules to handle generation of
-  precompiled headers. Interface matches the GCH handler in xcode_emulation.py.
-  """
-  def __init__(
-      self, settings, config, gyp_to_build_path, gyp_to_unique_output, obj_ext):
-    self.settings = settings
-    self.config = config
-    pch_source = self.settings.msvs_precompiled_source[self.config]
-    self.pch_source = gyp_to_build_path(pch_source)
-    filename, _ = os.path.splitext(pch_source)
-    self.output_obj = gyp_to_unique_output(filename + obj_ext).lower()
-
-  def _PchHeader(self):
-    """Get the header that will appear in an #include line for all source
-    files."""
-    return os.path.split(self.settings.msvs_precompiled_header[self.config])[1]
-
-  def GetObjDependencies(self, sources, objs):
-    """Given a list of sources files and the corresponding object files,
-    returns a list of the pch files that should be depended upon. The
-    additional wrapping in the return value is for interface compatability
-    with make.py on Mac, and xcode_emulation.py."""
-    if not self._PchHeader():
-      return []
-    pch_ext = os.path.splitext(self.pch_source)[1]
-    for source in sources:
-      if _LanguageMatchesForPch(os.path.splitext(source)[1], pch_ext):
-        return [(None, None, self.output_obj)]
-    return []
-
-  def GetPchBuildCommands(self):
-    """Not used on Windows as there are no additional build steps required
-    (instead, existing steps are modified in GetFlagsModifications below)."""
-    return []
-
-  def GetFlagsModifications(self, input, output, implicit, command,
-                            cflags_c, cflags_cc, expand_special):
-    """Get the modified cflags and implicit dependencies that should be used
-    for the pch compilation step."""
-
-    if self.settings.UsesComponentExtensions(self.config):
-      # No-op if component extensions are used.
-      return [], output, []
-
-    if input == self.pch_source:
-      pch_output = ['/Yc' + self._PchHeader()]
-      if command == 'cxx':
-        return ([('cflags_cc', map(expand_special, cflags_cc + pch_output))],
-                self.output_obj, [])
-      elif command == 'cc':
-        return ([('cflags_c', map(expand_special, cflags_c + pch_output))],
-                self.output_obj, [])
-    return [], output, implicit
-
-
-vs_version = None
-def GetVSVersion(generator_flags):
-  global vs_version
-  if not vs_version:
-    vs_version = gyp.MSVSVersion.SelectVisualStudioVersion(
-        generator_flags.get('msvs_version', 'auto'))
-  return vs_version
-
-def _GetVsvarsSetupArgs(generator_flags, arch):
-  vs = GetVSVersion(generator_flags)
-  return vs.SetupScript()
-
-def ExpandMacros(string, expansions):
-  """Expand $(Variable) per expansions dict. See MsvsSettings.GetVSMacroEnv
-  for the canonical way to retrieve a suitable dict."""
-  if '$' in string:
-    for old, new in expansions.iteritems():
-      assert '$(' not in new, new
-      string = string.replace(old, new)
-  return string
-
-def _ExtractImportantEnvironment(output_of_set):
-  """Extracts environment variables required for the toolchain to run from
-  a textual dump output by the cmd.exe 'set' command."""
-  envvars_to_save = (
-      'durangoxdk',
-      'goma_.*', # TODO(scottmg): This is ugly, but needed for goma.
-      'include',
-      'lib',
-      'libpath',
-      'path',
-      'pathext',
-      'systemroot',
-      'temp',
-      'tmp',
-      'xedk',
-      'cell_.*',
-      'sn_.*',
-      'sce_.*',
-      'is_docker', # needed for ninja to invoke docker-specific logic
-      'is_ci',     # needed for ninja to exlcude some logic on GKE
-  )
-  env = {}
-  for line in output_of_set.splitlines():
-    for envvar in envvars_to_save:
-      if re.match(envvar + '=', line.lower()):
-        var, setting = line.split('=', 1)
-        if envvar == 'path':
-          # Our own rules (for running gyp-win-tool) and other actions in
-          # Chromium rely on python being in the path. Add the path to this
-          # python here so that if it's not in the path when ninja is run
-          # later, python will still be found.
-          setting = os.path.dirname(sys.executable) + ';' + setting
-        env[var.upper()] = setting
-        break
-  for required in ('SYSTEMROOT', 'TEMP', 'TMP'):
-    if required not in env:
-      raise Exception('Environment variable "%s" '
-                      'required to be set to valid path' % required)
-  return env
-
-def _FormatAsEnvironmentBlock(envvar_dict):
-  """Format as an 'environment block' directly suitable for CreateProcess.
-  Briefly this is a list of key=value\0, terminated by an additional \0. See
-  CreateProcess documentation for more details."""
-  block = ''
-  nul = '\0'
-  for key, value in envvar_dict.iteritems():
-    block += key + '=' + value + nul
-  block += nul
-  return block
-
-def GenerateEnvironmentFiles(toplevel_build_dir, generator_flags, open_out):
-  """It's not sufficient to have the absolute path to the compiler, linker,
-  etc. on Windows, as those tools rely on .dlls being in the PATH. We also
-  need to support both x86 and x64 compilers within the same build (to support
-  msvs_target_platform hackery). Different architectures require a different
-  compiler binary, and different supporting environment variables (INCLUDE,
-  LIB, LIBPATH). So, we extract the environment here, wrap all invocations
-  of compiler tools (cl, link, lib, rc, midl, etc.) via win_tool.py which
-  sets up the environment, and then we do not prefix the compiler with
-  an absolute path, instead preferring something like "cl.exe" in the rule
-  which will then run whichever the environment setup has put in the path."""
-  vs = GetVSVersion(generator_flags)
-  for arch in ('x86', 'x64'):
-    args = vs.SetupScript(arch)
-    args.extend(('&&', 'set'))
-    popen = subprocess.Popen(
-        args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    variables, _ = popen.communicate()
-    env = _ExtractImportantEnvironment(variables)
-    env_block = _FormatAsEnvironmentBlock(env)
-    f = open_out(os.path.join(toplevel_build_dir, 'environment.' + arch), 'wb')
-    f.write(env_block)
-    f.close()
-
-def GenerateXB1EnvironmentFiles(toplevel_build_dir, generator_flags, open_out):
-  """It's not sufficient to have the absolute path to the compiler, linker,
-  etc. on Windows, as those tools rely on .dlls being in the PATH. Different
-  architectures require a different compiler binary, and different supporting
-  environment variables (INCLUDE, LIB, LIBPATH). So, we extract the environment
-  here, wrap all invocations of compiler tools (cl, link, lib, rc, midl, etc.)
-  via win_tool.py which sets up the environment, and then we do not prefix the
-  compiler with an absolute path, instead preferring something like "cl.exe" in
-  the rule which will then run whichever the environment setup has put in the
-  path."""
-  arch = 'x64'
-
-  # Get the dos environment via set:
-  # Use cmd /c to execute under native windows command
-  args  = 'set'
-
-  popen = subprocess.Popen(
-      args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-  variables, _ = popen.communicate()
-  env = _ExtractImportantEnvironment(variables)
-  env_block = _FormatAsEnvironmentBlock(env)
-  f = open_out(os.path.join(toplevel_build_dir, 'environment.' + arch), 'wb')
-  f.write(env_block)
-  f.close()
-
-def GenerateXB360EnvironmentFiles(toplevel_build_dir, generator_flags, open_out):
-  """It's not sufficient to have the absolute path to the compiler, linker,
-  etc. on Windows, as those tools rely on .dlls being in the PATH. Different
-  architectures require a different compiler binary, and different supporting
-  environment variables (INCLUDE, LIB, LIBPATH). So, we extract the environment
-  here, wrap all invocations of compiler tools (cl, link, lib, rc, midl, etc.)
-  via win_tool.py which sets up the environment, and then we do not prefix the
-  compiler with an absolute path, instead preferring something like "cl.exe" in
-  the rule which will then run whichever the environment setup has put in the
-  path."""
-  # TODO: Switch to 'ppc' and hope havoc is not precipitated.
-  arch = 'x86'
-
-  vs_args = [
-      os.path.join(
-          os.path.dirname(__file__), '..', '..', '..', '..', '..',
-          'lbshell', 'build', 'platforms', 'xboxadkvars.cmd'),
-  ]
-  # Using cygwin python so there is a bit of wrapping done to get the
-  # dos environment via set:
-  # Use cmd /c to execute under native windows command
-  args_cmd  = 'cmd /c '
-  # Convert the cygwin path i.e. /cygdrive/c .. to C:\ ..
-  args_bat  = '\"`cygpath -d \'' + vs_args[0] + '\'` '
-  # Create a list of the remaining arguments to the bat file
-  args_args = ' '.join(vs_args[1:])
-  args_set  = ' && set\"'
-
-  args = args_cmd + args_bat + args_args + args_set
-  popen = subprocess.Popen(
-      args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-  variables, _ = popen.communicate()
-  env = _ExtractImportantEnvironment(variables)
-  env_block = _FormatAsEnvironmentBlock(env)
-  f = open_out(os.path.join(toplevel_build_dir, 'environment.' + arch), 'wb')
-  f.write(env_block)
-  f.close()
-
-def VerifyMissingSources(sources, build_dir, generator_flags, gyp_to_ninja):
-  """Emulate behavior of msvs_error_on_missing_sources present in the msvs
-  generator: Check that all regular source files, i.e. not created at run time,
-  exist on disk. Missing files cause needless recompilation when building via
-  VS, and we want this check to match for people/bots that build using ninja,
-  so they're not surprised when the VS build fails."""
-  if int(generator_flags.get('msvs_error_on_missing_sources', 0)):
-    no_specials = filter(lambda x: '$' not in x, sources)
-    relative = [os.path.join(build_dir, gyp_to_ninja(s)) for s in no_specials]
-    missing = filter(lambda x: not os.path.exists(x), relative)
-    if missing:
-      # They'll look like out\Release\..\..\stuff\things.cc, so normalize the
-      # path for a slightly less crazy looking output.
-      cleaned_up = [os.path.normpath(x) for x in missing]
-      raise Exception('Missing input files:\n%s' % '\n'.join(cleaned_up))
diff --git a/tools/gyp/pylib/gyp/ninja_syntax.py b/tools/gyp/pylib/gyp/ninja_syntax.py
deleted file mode 100644
index d438e35..0000000
--- a/tools/gyp/pylib/gyp/ninja_syntax.py
+++ /dev/null
@@ -1,163 +0,0 @@
-# This file comes from
-#   https://github.com/martine/ninja/blob/master/misc/ninja_syntax.py
-# Do not edit!  Edit the upstream one instead.
-
-"""Python module for generating .ninja files.
-
-Note that this is emphatically not a required piece of Ninja; it's
-just a helpful utility for build-file-generation systems that already
-use Python.
-"""
-
-import textwrap
-import re
-
-def escape_path(word):
-    return word.replace('$ ','$$ ').replace(' ','$ ').replace(':', '$:')
-
-class Writer(object):
-    def __init__(self, output, width=78):
-        self.output = output
-        self.width = width
-
-    def newline(self):
-        self.output.write('\n')
-
-    def comment(self, text):
-        for line in textwrap.wrap(text, self.width - 2):
-            self.output.write('# ' + line + '\n')
-
-    def variable(self, key, value, indent=0):
-        if value is None:
-            return
-        if isinstance(value, list):
-            value = ' '.join(filter(None, value))  # Filter out empty strings.
-        self._line('%s = %s' % (key, value), indent)
-
-    def pool(self, name, depth):
-        self._line('pool %s' % name)
-        self.variable('depth', depth, indent=1)
-
-    def rule(self, name, command, description=None, depfile=None,
-             depformat=None, generator=False, pool=None,
-             restat=False, rspfile=None, rspfile_content=None,
-             deps=None):
-        self._line('rule %s' % name)
-        self.variable('command', command, indent=1)
-        if description:
-            self.variable('description', description, indent=1)
-        if depfile:
-            self.variable('depfile', depfile, indent=1)
-        if depformat:
-            self.variable('depformat', depformat, indent=1)
-        if generator:
-            self.variable('generator', '1', indent=1)
-        if pool:
-            self.variable('pool', pool, indent=1)
-        if restat:
-            self.variable('restat', '1', indent=1)
-        if rspfile:
-            self.variable('rspfile', rspfile, indent=1)
-        if rspfile_content:
-            self.variable('rspfile_content', rspfile_content, indent=1)
-        if deps:
-            self.variable('deps', deps, indent=1)
-
-    def build(self, outputs, rule, inputs=None, implicit=None, order_only=None,
-              variables=None):
-        outputs = self._as_list(outputs)
-        all_inputs = self._as_list(inputs)[:]
-        out_outputs = list(map(escape_path, outputs))
-        all_inputs = list(map(escape_path, all_inputs))
-
-        if implicit:
-            implicit = map(escape_path, self._as_list(implicit))
-            all_inputs.append('|')
-            all_inputs.extend(implicit)
-        if order_only:
-            order_only = map(escape_path, self._as_list(order_only))
-            all_inputs.append('||')
-            all_inputs.extend(order_only)
-
-        self._line('build %s: %s' % (' '.join(out_outputs),
-                                        ' '.join([rule] + all_inputs)))
-
-        if variables:
-            if isinstance(variables, dict):
-                iterator = iter(variables.items())
-            else:
-                iterator = iter(variables)
-
-            for key, val in iterator:
-                self.variable(key, val, indent=1)
-
-        return outputs
-
-    def include(self, path):
-        self._line('include %s' % path)
-
-    def subninja(self, path):
-        self._line('subninja %s' % path)
-
-    def default(self, paths):
-        self._line('default %s' % ' '.join(self._as_list(paths)))
-
-    def _count_dollars_before_index(self, s, i):
-      """Returns the number of '$' characters right in front of s[i]."""
-      dollar_count = 0
-      dollar_index = i - 1
-      while dollar_index > 0 and s[dollar_index] == '$':
-        dollar_count += 1
-        dollar_index -= 1
-      return dollar_count
-
-    def _line(self, text, indent=0):
-        """Write 'text' word-wrapped at self.width characters."""
-        leading_space = '  ' * indent
-        while len(leading_space) + len(text) > self.width:
-            # The text is too wide; wrap if possible.
-
-            # Find the rightmost space that would obey our width constraint and
-            # that's not an escaped space.
-            available_space = self.width - len(leading_space) - len(' $')
-            space = available_space
-            while True:
-              space = text.rfind(' ', 0, space)
-              if space < 0 or \
-                 self._count_dollars_before_index(text, space) % 2 == 0:
-                break
-
-            if space < 0:
-                # No such space; just use the first unescaped space we can find.
-                space = available_space - 1
-                while True:
-                  space = text.find(' ', space + 1)
-                  if space < 0 or \
-                     self._count_dollars_before_index(text, space) % 2 == 0:
-                    break
-            if space < 0:
-                # Give up on breaking.
-                break
-
-            self.output.write(leading_space + text[0:space] + ' $\n')
-            text = text[space+1:]
-
-            # Subsequent lines are continuations, so indent them.
-            leading_space = '  ' * (indent+2)
-
-        self.output.write(leading_space + text + '\n')
-
-    def _as_list(self, input):
-        if input is None:
-            return []
-        if isinstance(input, list):
-            return input
-        return [input]
-
-
-def escape(string):
-    """Escape a string such that it can be embedded into a Ninja file without
-    further interpretation."""
-    assert '\n' not in string, 'Ninja syntax does not allow newlines'
-    # We only have one special metacharacter: '$'.
-    return string.replace('$', '$$')
diff --git a/tools/gyp/pylib/gyp/sun_tool.py b/tools/gyp/pylib/gyp/sun_tool.py
deleted file mode 100755
index 90d59c8..0000000
--- a/tools/gyp/pylib/gyp/sun_tool.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2011 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""These functions are executed via gyp-sun-tool when using the Makefile
-generator."""
-
-import fcntl
-import os
-import struct
-import subprocess
-import sys
-
-
-def main(args):
-  executor = SunTool()
-  executor.Dispatch(args)
-
-
-class SunTool(object):
-  """This class performs all the SunOS tooling steps. The methods can either be
-  executed directly, or dispatched from an argument list."""
-
-  def Dispatch(self, args):
-    """Dispatches a string command to a method."""
-    if len(args) < 1:
-      raise Exception("Not enough arguments")
-
-    method = "Exec%s" % self._CommandifyName(args[0])
-    getattr(self, method)(*args[1:])
-
-  def _CommandifyName(self, name_string):
-    """Transforms a tool name like copy-info-plist to CopyInfoPlist"""
-    return name_string.title().replace('-', '')
-
-  def ExecFlock(self, lockfile, *cmd_list):
-    """Emulates the most basic behavior of Linux's flock(1)."""
-    # Rely on exception handling to report errors.
-    # Note that the stock python on SunOS has a bug
-    # where fcntl.flock(fd, LOCK_EX) always fails
-    # with EBADF, that's why we use this F_SETLK
-    # hack instead.
-    fd = os.open(lockfile, os.O_WRONLY|os.O_NOCTTY|os.O_CREAT, 0666)
-    op = struct.pack('hhllhhl', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0)
-    fcntl.fcntl(fd, fcntl.F_SETLK, op)
-    return subprocess.call(cmd_list)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/tools/gyp/pylib/gyp/win_tool.py b/tools/gyp/pylib/gyp/win_tool.py
deleted file mode 100755
index 0ce753b..0000000
--- a/tools/gyp/pylib/gyp/win_tool.py
+++ /dev/null
@@ -1,213 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Utility functions for Windows builds.
-
-These functions are executed via gyp-win-tool when using the ninja generator.
-"""
-
-import os
-import shutil
-import subprocess
-import sys
-import platform
-
-BASE_DIR = os.path.dirname(os.path.abspath(__file__))
-
-
-def main(args):
-  executor = WinTool()
-  exit_code = executor.Dispatch(args)
-  if exit_code is not None:
-    if exit_code != 0:
-      print("Abnormal exit (" + str(exit_code) + ") code while executing " \
-            + str(args))
-    sys.exit(exit_code)
-
-
-class WinTool(object):
-  """This class performs all the Windows tooling steps. The methods can either
-  be executed directly, or dispatched from an argument list."""
-
-  def Dispatch(self, args):
-    """Dispatches a string command to a method."""
-    if len(args) < 1:
-      raise Exception("Not enough arguments")
-
-    method = "Exec%s" % self._CommandifyName(args[0])
-    return getattr(self, method)(*args[1:])
-
-  def _CommandifyName(self, name_string):
-    """Transforms a tool name like recursive-mirror to RecursiveMirror."""
-    return name_string.title().replace('-', '')
-
-  def _GetEnv(self, arch):
-    """Gets the saved environment from a file for a given architecture."""
-    # The environment is saved as an "environment block" (see CreateProcess
-    # and msvs_emulation for details). We convert to a dict here.
-    # Drop last 2 NULs, one for list terminator, one for trailing vs. separator.
-    pairs = open(arch).read()[:-2].split('\0')
-    kvs = [item.split('=', 1) for item in pairs]
-    return dict(kvs)
-
-  def ExecStamp(self, path):
-    """Simple stamp command."""
-    open(path, 'w').close()
-
-  def ExecRecursiveMirror(self, source, dest):
-    """Emulation of rm -rf out && cp -af in out."""
-    if os.path.exists(dest):
-      if os.path.isdir(dest):
-        shutil.rmtree(dest)
-      else:
-        os.unlink(dest)
-    if os.path.isdir(source):
-      # Ignore .git directory.
-      shutil.copytree(source, dest, ignore=shutil.ignore_patterns(r'.git'))
-    else:
-      shutil.copy2(source, dest)
-      # Hack to make target look 2 seconds newer, to prevent ninja erroneously re-trigger
-      # copy rules on nanosecond differences. Risk of getting stale content files due to this
-      # is almost non-existent
-      OFFSET_SECONDS = 2
-      stat = os.stat(source)
-      mtime = stat.st_mtime + OFFSET_SECONDS
-      atime = stat.st_atime + OFFSET_SECONDS
-      os.utime(dest, (atime, mtime))
-
-  if platform.system() == 'Windows':
-    def ExecLinkWrapper(self, arch, *args):
-      """Filter diagnostic output from link that looks like:
-      '   Creating library ui.dll.lib and object ui.dll.exp'
-      This happens when there are exports from the dll or exe.
-      """
-      env = self._GetEnv(arch)
-      popen = subprocess.Popen(args, shell=True, env=env,
-                               stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
-                               universal_newlines=True)
-      out, _ = popen.communicate()
-      for line in out.splitlines():
-        if not line.startswith('   Creating library '):
-          print line
-      return popen.returncode
-
-  def ExecManifestWrapper(self, arch, *args):
-    """Run manifest tool with environment set. Strip out undesirable warning
-    (some XML blocks are recognized by the OS loader, but not the manifest
-    tool)."""
-    env = self._GetEnv(arch)
-    popen = subprocess.Popen(args, shell=True, env=env,
-                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
-                             universal_newlines=True)
-    out, _ = popen.communicate()
-    for line in out.splitlines():
-      if line and 'manifest authoring warning 81010002' not in line:
-        print line
-    return popen.returncode
-
-  def ExecMidlWrapper(self, arch, outdir, tlb, h, dlldata, iid, proxy, idl,
-                      *flags):
-    """Filter noisy filenames output from MIDL compile step that isn't
-    quietable via command line flags.
-    """
-    env = self._GetEnv(arch)
-    args = ['midl', '/nologo'] + list(flags) + [
-          '/out', outdir,
-          '/h', h,
-          idl]
-    popen = subprocess.Popen(args, shell=True, env=env,
-                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
-                             universal_newlines=True)
-    out, _ = popen.communicate()
-    # Filter junk out of stdout, and write filtered versions. Output we want
-    # to filter is pairs of lines that look like this:
-    # Processing C:\Program Files (x86)\Microsoft SDKs\...\include\objidl.idl
-    # objidl.idl
-    lines = out.splitlines()
-    prefixes = ['Processing ', '64 bit Processing ', '64 bit MIDLRT Processing ']
-    processing = set()
-    for prefix in prefixes:
-      processing = processing.union(set(os.path.basename(x) for x in lines if x.startswith(prefix)))
-    for line in lines:
-      if line in processing:
-        continue
-      if reduce(lambda x, y : x or y,
-                [line.startswith(prefix) for prefix in prefixes]):
-        continue
-      print line
-    return popen.returncode
-
-  def ExecAsmWrapper(self, arch, *args):
-    """Filter logo banner from invocations of asm.exe."""
-    env = self._GetEnv(arch)
-    popen = subprocess.Popen(args, shell=True, env=env,
-                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
-                             universal_newlines=True)
-    out, _ = popen.communicate()
-    for line in out.splitlines():
-      if (not line.startswith('Copyright (C) Microsoft Corporation') and
-          not line.startswith('Microsoft (R) Macro Assembler') and
-          not line.startswith(' Assembling: ') and
-          line):
-        print line
-    return popen.returncode
-
-  def ExecRcWrapper(self, arch, *args):
-    """Filter logo banner from invocations of rc.exe. Older versions of RC
-    don't support the /nologo flag."""
-    env = self._GetEnv(arch)
-    popen = subprocess.Popen(args, shell=True, env=env,
-                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
-                             universal_newlines=True)
-    out, _ = popen.communicate()
-    for line in out.splitlines():
-      if (not line.startswith('Microsoft (R) Windows (R) Resource Compiler') and
-          not line.startswith('Copyright (C) Microsoft Corporation') and
-          line):
-        print line
-    return popen.returncode
-
-  def ExecActionWrapper(self, arch, rspfile, *dir):
-    """Runs an action command line from a response file using the environment
-    for |arch|. If |dir| is supplied, use that as the working directory."""
-    env = self._GetEnv(arch)
-    args = open(rspfile).read()
-    dir = dir[0] if dir else None
-    # Local functions bind to outmost function arguments.
-    def RunCmd():
-      popen = subprocess.Popen(args, shell=True, env=env, cwd=dir,
-                               stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-                               universal_newlines=True)
-      stdout_str, stderr_str = popen.communicate()
-      return popen.returncode, stdout_str, stderr_str
-    def BuildErrorMessage(err_code, stdout, stderr):
-      dir_str = os.path.abspath('.') if dir is None else os.path.abspath(dir)
-      msg = 'ERROR while executing\n' + str(args) + '\ncwd=' + dir_str \
-           + '\n' + 'Error code: ' + str(err_code) + '\n'
-      if stdout:
-        msg += 'STDOUT:\n' + str(stdout) + '\n'
-      if stderr:
-        msg += 'STDERR:\n' + str(stderr) + '\n'
-      msg += '\n'
-      return msg
-    # Note that some commands on windows appears flaky. Therefore commands
-    # will retry once to make the builds more reliable, and if the cmd fails
-    # twice then the error will be written out to the command line.
-    err_code, stdout, stderr = RunCmd()
-    if err_code == 0:
-      sys.stdout.write(stdout)
-      sys.stderr.write(stderr)
-      return err_code
-    sys.stdout.write(
-        BuildErrorMessage(err_code, stdout, stderr) + ' retrying...\n')
-    err_code, stdout, stderr = RunCmd()
-    if err_code != 0:
-      sys.stdout.write(BuildErrorMessage(err_code, stdout, stderr))
-    return err_code
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/tools/gyp/pylib/gyp/xcode_emulation.py b/tools/gyp/pylib/gyp/xcode_emulation.py
deleted file mode 100644
index ef5b460..0000000
--- a/tools/gyp/pylib/gyp/xcode_emulation.py
+++ /dev/null
@@ -1,1065 +0,0 @@
-# Copyright (c) 2012 Google Inc. 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 contains classes that help to emulate xcodebuild behavior on top of
-other build systems, such as make and ninja.
-"""
-
-import gyp.common
-import os.path
-import re
-import shlex
-
-class XcodeSettings(object):
-  """A class that understands the gyp 'xcode_settings' object."""
-
-  # Computed lazily by _GetSdkBaseDir(). Shared by all XcodeSettings, so cached
-  # at class-level for efficiency.
-  _sdk_base_dir = None
-
-  def __init__(self, spec):
-    self.spec = spec
-
-    # Per-target 'xcode_settings' are pushed down into configs earlier by gyp.
-    # This means self.xcode_settings[config] always contains all settings
-    # for that config -- the per-target settings as well. Settings that are
-    # the same for all configs are implicitly per-target settings.
-    self.xcode_settings = {}
-    configs = spec['configurations']
-    for configname, config in configs.iteritems():
-      self.xcode_settings[configname] = config.get('xcode_settings', {})
-
-    # This is only non-None temporarily during the execution of some methods.
-    self.configname = None
-
-    # Used by _AdjustLibrary to match .a and .dylib entries in libraries.
-    self.library_re = re.compile(r'^lib([^/]+)\.(a|dylib)$')
-
-  def _Settings(self):
-    assert self.configname
-    return self.xcode_settings[self.configname]
-
-  def _Test(self, test_key, cond_key, default):
-    return self._Settings().get(test_key, default) == cond_key
-
-  def _Appendf(self, lst, test_key, format_str, default=None):
-    if test_key in self._Settings():
-      lst.append(format_str % str(self._Settings()[test_key]))
-    elif default:
-      lst.append(format_str % str(default))
-
-  def _WarnUnimplemented(self, test_key):
-    if test_key in self._Settings():
-      print 'Warning: Ignoring not yet implemented key "%s".' % test_key
-
-  def _IsBundle(self):
-    return int(self.spec.get('mac_bundle', 0)) != 0
-
-  def GetFrameworkVersion(self):
-    """Returns the framework version of the current target. Only valid for
-    bundles."""
-    assert self._IsBundle()
-    return self.GetPerTargetSetting('FRAMEWORK_VERSION', default='A')
-
-  def GetWrapperExtension(self):
-    """Returns the bundle extension (.app, .framework, .plugin, etc).  Only
-    valid for bundles."""
-    assert self._IsBundle()
-    if self.spec['type'] in ('loadable_module', 'shared_library'):
-      default_wrapper_extension = {
-        'loadable_module': 'bundle',
-        'shared_library': 'framework',
-      }[self.spec['type']]
-      wrapper_extension = self.GetPerTargetSetting(
-          'WRAPPER_EXTENSION', default=default_wrapper_extension)
-      return '.' + self.spec.get('product_extension', wrapper_extension)
-    elif self.spec['type'] == 'executable':
-      return '.app'
-    else:
-      assert False, "Don't know extension for '%s', target '%s'" % (
-          self.spec['type'], self.spec['target_name'])
-
-  def GetProductName(self):
-    """Returns PRODUCT_NAME."""
-    return self.spec.get('product_name', self.spec['target_name'])
-
-  def GetFullProductName(self):
-    """Returns FULL_PRODUCT_NAME."""
-    if self._IsBundle():
-      return self.GetWrapperName()
-    else:
-      return self._GetStandaloneBinaryPath()
-
-  def GetWrapperName(self):
-    """Returns the directory name of the bundle represented by this target.
-    Only valid for bundles."""
-    assert self._IsBundle()
-    return self.GetProductName() + self.GetWrapperExtension()
-
-  def GetBundleContentsFolderPath(self):
-    """Returns the qualified path to the bundle's contents folder. E.g.
-    Chromium.app/Contents or Foo.bundle/Versions/A. Only valid for bundles."""
-    assert self._IsBundle()
-    if self.spec['type'] == 'shared_library':
-      return os.path.join(
-          self.GetWrapperName(), 'Versions', self.GetFrameworkVersion())
-    else:
-      # loadable_modules have a 'Contents' folder like executables.
-      return os.path.join(self.GetWrapperName(), 'Contents')
-
-  def GetBundleResourceFolder(self):
-    """Returns the qualified path to the bundle's resource folder. E.g.
-    Chromium.app/Contents/Resources. Only valid for bundles."""
-    assert self._IsBundle()
-    return os.path.join(self.GetBundleContentsFolderPath(), 'Resources')
-
-  def GetBundlePlistPath(self):
-    """Returns the qualified path to the bundle's plist file. E.g.
-    Chromium.app/Contents/Info.plist. Only valid for bundles."""
-    assert self._IsBundle()
-    if self.spec['type'] in ('executable', 'loadable_module'):
-      return os.path.join(self.GetBundleContentsFolderPath(), 'Info.plist')
-    else:
-      return os.path.join(self.GetBundleContentsFolderPath(),
-                          'Resources', 'Info.plist')
-
-  def GetProductType(self):
-    """Returns the PRODUCT_TYPE of this target."""
-    if self._IsBundle():
-      return {
-        'executable': 'com.apple.product-type.application',
-        'loadable_module': 'com.apple.product-type.bundle',
-        'shared_library': 'com.apple.product-type.framework',
-      }[self.spec['type']]
-    else:
-      return {
-        'executable': 'com.apple.product-type.tool',
-        'loadable_module': 'com.apple.product-type.library.dynamic',
-        'shared_library': 'com.apple.product-type.library.dynamic',
-        'static_library': 'com.apple.product-type.library.static',
-      }[self.spec['type']]
-
-  def GetMachOType(self):
-    """Returns the MACH_O_TYPE of this target."""
-    # Weird, but matches Xcode.
-    if not self._IsBundle() and self.spec['type'] == 'executable':
-      return ''
-    return {
-      'executable': 'mh_execute',
-      'static_library': 'staticlib',
-      'shared_library': 'mh_dylib',
-      'loadable_module': 'mh_bundle',
-    }[self.spec['type']]
-
-  def _GetBundleBinaryPath(self):
-    """Returns the name of the bundle binary of by this target.
-    E.g. Chromium.app/Contents/MacOS/Chromium. Only valid for bundles."""
-    assert self._IsBundle()
-    if self.spec['type'] in ('shared_library'):
-      path = self.GetBundleContentsFolderPath()
-    elif self.spec['type'] in ('executable', 'loadable_module'):
-      path = os.path.join(self.GetBundleContentsFolderPath(), 'MacOS')
-    return os.path.join(path, self.GetExecutableName())
-
-  def _GetStandaloneExecutableSuffix(self):
-    if 'product_extension' in self.spec:
-      return '.' + self.spec['product_extension']
-    return {
-      'executable': '',
-      'static_library': '.a',
-      'shared_library': '.dylib',
-      'loadable_module': '.so',
-    }[self.spec['type']]
-
-  def _GetStandaloneExecutablePrefix(self):
-    return self.spec.get('product_prefix', {
-      'executable': '',
-      'static_library': 'lib',
-      'shared_library': 'lib',
-      # Non-bundled loadable_modules are called foo.so for some reason
-      # (that is, .so and no prefix) with the xcode build -- match that.
-      'loadable_module': '',
-    }[self.spec['type']])
-
-  def _GetStandaloneBinaryPath(self):
-    """Returns the name of the non-bundle binary represented by this target.
-    E.g. hello_world. Only valid for non-bundles."""
-    assert not self._IsBundle()
-    assert self.spec['type'] in (
-        'executable', 'shared_library', 'static_library', 'loadable_module'), (
-        'Unexpected type %s' % self.spec['type'])
-    target = self.spec['target_name']
-    if self.spec['type'] == 'static_library':
-      if target[:3] == 'lib':
-        target = target[3:]
-    elif self.spec['type'] in ('loadable_module', 'shared_library'):
-      if target[:3] == 'lib':
-        target = target[3:]
-
-    target_prefix = self._GetStandaloneExecutablePrefix()
-    target = self.spec.get('product_name', target)
-    target_ext = self._GetStandaloneExecutableSuffix()
-    return target_prefix + target + target_ext
-
-  def GetExecutableName(self):
-    """Returns the executable name of the bundle represented by this target.
-    E.g. Chromium."""
-    if self._IsBundle():
-      return self.spec.get('product_name', self.spec['target_name'])
-    else:
-      return self._GetStandaloneBinaryPath()
-
-  def GetExecutablePath(self):
-    """Returns the directory name of the bundle represented by this target. E.g.
-    Chromium.app/Contents/MacOS/Chromium."""
-    if self._IsBundle():
-      return self._GetBundleBinaryPath()
-    else:
-      return self._GetStandaloneBinaryPath()
-
-  def _GetSdkBaseDir(self):
-    """Returns the root of the 'Developer' directory. On Xcode 4.2 and prior,
-    this is usually just /Developer. Xcode 4.3 moved that folder into the Xcode
-    bundle."""
-    if not XcodeSettings._sdk_base_dir:
-      import subprocess
-      job = subprocess.Popen(['xcode-select', '-print-path'],
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.STDOUT)
-      out, err = job.communicate()
-      if job.returncode != 0:
-        print out
-        raise Exception('Error %d running xcode-select' % job.returncode)
-      # The Developer folder moved in Xcode 4.3.
-      xcode43_sdk_path = os.path.join(
-          out.rstrip(), 'Platforms/MacOSX.platform/Developer/SDKs')
-      if os.path.isdir(xcode43_sdk_path):
-        XcodeSettings._sdk_base_dir = xcode43_sdk_path
-      else:
-        XcodeSettings._sdk_base_dir = os.path.join(out.rstrip(), 'SDKs')
-    return XcodeSettings._sdk_base_dir
-
-  def _SdkPath(self):
-    sdk_root = self.GetPerTargetSetting('SDKROOT', default='macosx10.5')
-    if sdk_root.startswith('macosx'):
-      return os.path.join(self._GetSdkBaseDir(),
-                          'MacOSX' + sdk_root[len('macosx'):] + '.sdk')
-    return sdk_root
-
-  def GetCflags(self, configname):
-    """Returns flags that need to be added to .c, .cc, .m, and .mm
-    compilations."""
-    # This functions (and the similar ones below) do not offer complete
-    # emulation of all xcode_settings keys. They're implemented on demand.
-
-    self.configname = configname
-    cflags = []
-
-    sdk_root = self._SdkPath()
-    if 'SDKROOT' in self._Settings():
-      cflags.append('-isysroot %s' % sdk_root)
-
-    if self._Test('GCC_CHAR_IS_UNSIGNED_CHAR', 'YES', default='NO'):
-      cflags.append('-funsigned-char')
-
-    if self._Test('GCC_CW_ASM_SYNTAX', 'YES', default='YES'):
-      cflags.append('-fasm-blocks')
-
-    if 'GCC_DYNAMIC_NO_PIC' in self._Settings():
-      if self._Settings()['GCC_DYNAMIC_NO_PIC'] == 'YES':
-        cflags.append('-mdynamic-no-pic')
-    else:
-      pass
-      # TODO: In this case, it depends on the target. xcode passes
-      # mdynamic-no-pic by default for executable and possibly static lib
-      # according to mento
-
-    if self._Test('GCC_ENABLE_PASCAL_STRINGS', 'YES', default='YES'):
-      cflags.append('-mpascal-strings')
-
-    self._Appendf(cflags, 'GCC_OPTIMIZATION_LEVEL', '-O%s', default='s')
-
-    if self._Test('GCC_GENERATE_DEBUGGING_SYMBOLS', 'YES', default='YES'):
-      dbg_format = self._Settings().get('DEBUG_INFORMATION_FORMAT', 'dwarf')
-      if dbg_format == 'dwarf':
-        cflags.append('-gdwarf-2')
-      elif dbg_format == 'stabs':
-        raise NotImplementedError('stabs debug format is not supported yet.')
-      elif dbg_format == 'dwarf-with-dsym':
-        cflags.append('-gdwarf-2')
-      else:
-        raise NotImplementedError('Unknown debug format %s' % dbg_format)
-
-    if self._Test('GCC_SYMBOLS_PRIVATE_EXTERN', 'YES', default='NO'):
-      cflags.append('-fvisibility=hidden')
-
-    if self._Test('GCC_TREAT_WARNINGS_AS_ERRORS', 'YES', default='NO'):
-      cflags.append('-Werror')
-
-    if self._Test('GCC_WARN_ABOUT_MISSING_NEWLINE', 'YES', default='NO'):
-      cflags.append('-Wnewline-eof')
-
-    self._Appendf(cflags, 'MACOSX_DEPLOYMENT_TARGET', '-mmacosx-version-min=%s')
-
-    # TODO:
-    if self._Test('COPY_PHASE_STRIP', 'YES', default='NO'):
-      self._WarnUnimplemented('COPY_PHASE_STRIP')
-    self._WarnUnimplemented('GCC_DEBUGGING_SYMBOLS')
-    self._WarnUnimplemented('GCC_ENABLE_OBJC_EXCEPTIONS')
-
-    # TODO: This is exported correctly, but assigning to it is not supported.
-    self._WarnUnimplemented('MACH_O_TYPE')
-    self._WarnUnimplemented('PRODUCT_TYPE')
-
-    archs = self._Settings().get('ARCHS', ['i386'])
-    if len(archs) != 1:
-      # TODO: Supporting fat binaries will be annoying.
-      self._WarnUnimplemented('ARCHS')
-      archs = ['i386']
-    cflags.append('-arch ' + archs[0])
-
-    if archs[0] in ('i386', 'x86_64'):
-      if self._Test('GCC_ENABLE_SSE3_EXTENSIONS', 'YES', default='NO'):
-        cflags.append('-msse3')
-      if self._Test('GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS', 'YES',
-                    default='NO'):
-        cflags.append('-mssse3')  # Note 3rd 's'.
-      if self._Test('GCC_ENABLE_SSE41_EXTENSIONS', 'YES', default='NO'):
-        cflags.append('-msse4.1')
-      if self._Test('GCC_ENABLE_SSE42_EXTENSIONS', 'YES', default='NO'):
-        cflags.append('-msse4.2')
-
-    cflags += self._Settings().get('WARNING_CFLAGS', [])
-
-    config = self.spec['configurations'][self.configname]
-    framework_dirs = config.get('mac_framework_dirs', [])
-    for directory in framework_dirs:
-      cflags.append('-F' + directory.replace('$(SDKROOT)', sdk_root))
-
-    self.configname = None
-    return cflags
-
-  def GetCflagsC(self, configname):
-    """Returns flags that need to be added to .c, and .m compilations."""
-    self.configname = configname
-    cflags_c = []
-    self._Appendf(cflags_c, 'GCC_C_LANGUAGE_STANDARD', '-std=%s')
-    cflags_c += self._Settings().get('OTHER_CFLAGS', [])
-    self.configname = None
-    return cflags_c
-
-  def GetCflagsCC(self, configname):
-    """Returns flags that need to be added to .cc, and .mm compilations."""
-    self.configname = configname
-    cflags_cc = []
-    if self._Test('GCC_ENABLE_CPP_RTTI', 'NO', default='YES'):
-      cflags_cc.append('-fno-rtti')
-    if self._Test('GCC_ENABLE_CPP_EXCEPTIONS', 'NO', default='YES'):
-      cflags_cc.append('-fno-exceptions')
-    if self._Test('GCC_INLINES_ARE_PRIVATE_EXTERN', 'YES', default='NO'):
-      cflags_cc.append('-fvisibility-inlines-hidden')
-    if self._Test('GCC_THREADSAFE_STATICS', 'NO', default='YES'):
-      cflags_cc.append('-fno-threadsafe-statics')
-    if self._Test('GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO', 'NO', default='YES'):
-      cflags_cc.append('-Wno-invalid-offsetof')
-
-    other_ccflags = []
-
-    for flag in self._Settings().get('OTHER_CPLUSPLUSFLAGS', ['$(inherited)']):
-      # TODO: More general variable expansion. Missing in many other places too.
-      if flag in ('$inherited', '$(inherited)', '${inherited}'):
-        flag = '$OTHER_CFLAGS'
-      if flag in ('$OTHER_CFLAGS', '$(OTHER_CFLAGS)', '${OTHER_CFLAGS}'):
-        other_ccflags += self._Settings().get('OTHER_CFLAGS', [])
-      else:
-        other_ccflags.append(flag)
-    cflags_cc += other_ccflags
-
-    self.configname = None
-    return cflags_cc
-
-  def _AddObjectiveCGarbageCollectionFlags(self, flags):
-    gc_policy = self._Settings().get('GCC_ENABLE_OBJC_GC', 'unsupported')
-    if gc_policy == 'supported':
-      flags.append('-fobjc-gc')
-    elif gc_policy == 'required':
-      flags.append('-fobjc-gc-only')
-
-  def GetCflagsObjC(self, configname):
-    """Returns flags that need to be added to .m compilations."""
-    self.configname = configname
-    cflags_objc = []
-
-    self._AddObjectiveCGarbageCollectionFlags(cflags_objc)
-
-    self.configname = None
-    return cflags_objc
-
-  def GetCflagsObjCC(self, configname):
-    """Returns flags that need to be added to .mm compilations."""
-    self.configname = configname
-    cflags_objcc = []
-    self._AddObjectiveCGarbageCollectionFlags(cflags_objcc)
-    if self._Test('GCC_OBJC_CALL_CXX_CDTORS', 'YES', default='NO'):
-      cflags_objcc.append('-fobjc-call-cxx-cdtors')
-    self.configname = None
-    return cflags_objcc
-
-  def GetInstallNameBase(self):
-    """Return DYLIB_INSTALL_NAME_BASE for this target."""
-    # Xcode sets this for shared_libraries, and for nonbundled loadable_modules.
-    if (self.spec['type'] != 'shared_library' and
-        (self.spec['type'] != 'loadable_module' or self._IsBundle())):
-      return None
-    install_base = self.GetPerTargetSetting(
-        'DYLIB_INSTALL_NAME_BASE',
-        default='/Library/Frameworks' if self._IsBundle() else '/usr/local/lib')
-    return install_base
-
-  def _StandardizePath(self, path):
-    """Do :standardizepath processing for path."""
-    # I'm not quite sure what :standardizepath does. Just call normpath(),
-    # but don't let @executable_path/../foo collapse to foo.
-    if '/' in path:
-      prefix, rest = '', path
-      if path.startswith('@'):
-        prefix, rest = path.split('/', 1)
-      rest = os.path.normpath(rest)  # :standardizepath
-      path = os.path.join(prefix, rest)
-    return path
-
-  def GetInstallName(self):
-    """Return LD_DYLIB_INSTALL_NAME for this target."""
-    # Xcode sets this for shared_libraries, and for nonbundled loadable_modules.
-    if (self.spec['type'] != 'shared_library' and
-        (self.spec['type'] != 'loadable_module' or self._IsBundle())):
-      return None
-
-    default_install_name = \
-        '$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)'
-    install_name = self.GetPerTargetSetting(
-        'LD_DYLIB_INSTALL_NAME', default=default_install_name)
-
-    # Hardcode support for the variables used in chromium for now, to
-    # unblock people using the make build.
-    if '$' in install_name:
-      assert install_name in ('$(DYLIB_INSTALL_NAME_BASE:standardizepath)/'
-          '$(WRAPPER_NAME)/$(PRODUCT_NAME)', default_install_name), (
-          'Variables in LD_DYLIB_INSTALL_NAME are not generally supported '
-          'yet in target \'%s\' (got \'%s\')' %
-              (self.spec['target_name'], install_name))
-
-      install_name = install_name.replace(
-          '$(DYLIB_INSTALL_NAME_BASE:standardizepath)',
-          self._StandardizePath(self.GetInstallNameBase()))
-      if self._IsBundle():
-        # These are only valid for bundles, hence the |if|.
-        install_name = install_name.replace(
-            '$(WRAPPER_NAME)', self.GetWrapperName())
-        install_name = install_name.replace(
-            '$(PRODUCT_NAME)', self.GetProductName())
-      else:
-        assert '$(WRAPPER_NAME)' not in install_name
-        assert '$(PRODUCT_NAME)' not in install_name
-
-      install_name = install_name.replace(
-          '$(EXECUTABLE_PATH)', self.GetExecutablePath())
-    return install_name
-
-  def _MapLinkerFlagFilename(self, ldflag, gyp_to_build_path):
-    """Checks if ldflag contains a filename and if so remaps it from
-    gyp-directory-relative to build-directory-relative."""
-    # This list is expanded on demand.
-    # They get matched as:
-    #   -exported_symbols_list file
-    #   -Wl,exported_symbols_list file
-    #   -Wl,exported_symbols_list,file
-    LINKER_FILE = '(\S+)'
-    WORD = '\S+'
-    linker_flags = [
-      ['-exported_symbols_list', LINKER_FILE],    # Needed for NaCl.
-      ['-unexported_symbols_list', LINKER_FILE],
-      ['-reexported_symbols_list', LINKER_FILE],
-      ['-sectcreate', WORD, WORD, LINKER_FILE],   # Needed for remoting.
-    ]
-    for flag_pattern in linker_flags:
-      regex = re.compile('(?:-Wl,)?' + '[ ,]'.join(flag_pattern))
-      m = regex.match(ldflag)
-      if m:
-        ldflag = ldflag[:m.start(1)] + gyp_to_build_path(m.group(1)) + \
-                 ldflag[m.end(1):]
-    # Required for ffmpeg (no idea why they don't use LIBRARY_SEARCH_PATHS,
-    # TODO(thakis): Update ffmpeg.gyp):
-    if ldflag.startswith('-L'):
-      ldflag = '-L' + gyp_to_build_path(ldflag[len('-L'):])
-    return ldflag
-
-  def GetLdflags(self, configname, product_dir, gyp_to_build_path):
-    """Returns flags that need to be passed to the linker.
-
-    Args:
-        configname: The name of the configuration to get ld flags for.
-        product_dir: The directory where products such static and dynamic
-            libraries are placed. This is added to the library search path.
-        gyp_to_build_path: A function that converts paths relative to the
-            current gyp file to paths relative to the build direcotry.
-    """
-    self.configname = configname
-    ldflags = []
-
-    # The xcode build is relative to a gyp file's directory, and OTHER_LDFLAGS
-    # can contain entries that depend on this. Explicitly absolutify these.
-    for ldflag in self._Settings().get('OTHER_LDFLAGS', []):
-      ldflags.append(self._MapLinkerFlagFilename(ldflag, gyp_to_build_path))
-
-    if self._Test('DEAD_CODE_STRIPPING', 'YES', default='NO'):
-      ldflags.append('-Wl,-dead_strip')
-
-    if self._Test('PREBINDING', 'YES', default='NO'):
-      ldflags.append('-Wl,-prebind')
-
-    self._Appendf(
-        ldflags, 'DYLIB_COMPATIBILITY_VERSION', '-compatibility_version %s')
-    self._Appendf(
-        ldflags, 'DYLIB_CURRENT_VERSION', '-current_version %s')
-    self._Appendf(
-        ldflags, 'MACOSX_DEPLOYMENT_TARGET', '-mmacosx-version-min=%s')
-    if 'SDKROOT' in self._Settings():
-      ldflags.append('-isysroot ' + self._SdkPath())
-
-    for library_path in self._Settings().get('LIBRARY_SEARCH_PATHS', []):
-      ldflags.append('-L' + gyp_to_build_path(library_path))
-
-    if 'ORDER_FILE' in self._Settings():
-      ldflags.append('-Wl,-order_file ' +
-                     '-Wl,' + gyp_to_build_path(
-                                  self._Settings()['ORDER_FILE']))
-
-    archs = self._Settings().get('ARCHS', ['i386'])
-    if len(archs) != 1:
-      # TODO: Supporting fat binaries will be annoying.
-      self._WarnUnimplemented('ARCHS')
-      archs = ['i386']
-    ldflags.append('-arch ' + archs[0])
-
-    # Xcode adds the product directory by default.
-    ldflags.append('-L' + product_dir)
-
-    install_name = self.GetInstallName()
-    if install_name:
-      ldflags.append('-install_name ' + install_name.replace(' ', r'\ '))
-
-    for rpath in self._Settings().get('LD_RUNPATH_SEARCH_PATHS', []):
-      ldflags.append('-Wl,-rpath,' + rpath)
-
-    config = self.spec['configurations'][self.configname]
-    framework_dirs = config.get('mac_framework_dirs', [])
-    for directory in framework_dirs:
-      ldflags.append('-F' + directory.replace('$(SDKROOT)', self._SdkPath()))
-
-    self.configname = None
-    return ldflags
-
-  def GetLibtoolflags(self, configname):
-    """Returns flags that need to be passed to the static linker.
-
-    Args:
-        configname: The name of the configuration to get ld flags for.
-    """
-    self.configname = configname
-    libtoolflags = []
-
-    for libtoolflag in self._Settings().get('OTHER_LDFLAGS', []):
-      libtoolflags.append(libtoolflag)
-    # TODO(thakis): ARCHS?
-
-    self.configname = None
-    return libtoolflags
-
-  def GetPerTargetSettings(self):
-    """Gets a list of all the per-target settings. This will only fetch keys
-    whose values are the same across all configurations."""
-    first_pass = True
-    result = {}
-    for configname in sorted(self.xcode_settings.keys()):
-      if first_pass:
-        result = dict(self.xcode_settings[configname])
-        first_pass = False
-      else:
-        for key, value in self.xcode_settings[configname].iteritems():
-          if key not in result:
-            continue
-          elif result[key] != value:
-            del result[key]
-    return result
-
-  def GetPerTargetSetting(self, setting, default=None):
-    """Tries to get xcode_settings.setting from spec. Assumes that the setting
-       has the same value in all configurations and throws otherwise."""
-    first_pass = True
-    result = None
-    for configname in sorted(self.xcode_settings.keys()):
-      if first_pass:
-        result = self.xcode_settings[configname].get(setting, None)
-        first_pass = False
-      else:
-        assert result == self.xcode_settings[configname].get(setting, None), (
-            "Expected per-target setting for '%s', got per-config setting "
-            "(target %s)" % (setting, spec['target_name']))
-    if result is None:
-      return default
-    return result
-
-  def _GetStripPostbuilds(self, configname, output_binary, quiet):
-    """Returns a list of shell commands that contain the shell commands
-    neccessary to strip this target's binary. These should be run as postbuilds
-    before the actual postbuilds run."""
-    self.configname = configname
-
-    result = []
-    if (self._Test('DEPLOYMENT_POSTPROCESSING', 'YES', default='NO') and
-        self._Test('STRIP_INSTALLED_PRODUCT', 'YES', default='NO')):
-
-      default_strip_style = 'debugging'
-      if self._IsBundle():
-        default_strip_style = 'non-global'
-      elif self.spec['type'] == 'executable':
-        default_strip_style = 'all'
-
-      strip_style = self._Settings().get('STRIP_STYLE', default_strip_style)
-      strip_flags = {
-        'all': '',
-        'non-global': '-x',
-        'debugging': '-S',
-      }[strip_style]
-
-      explicit_strip_flags = self._Settings().get('STRIPFLAGS', '')
-      if explicit_strip_flags:
-        strip_flags += ' ' + _NormalizeEnvVarReferences(explicit_strip_flags)
-
-      if not quiet:
-        result.append('echo STRIP\\(%s\\)' % self.spec['target_name'])
-      result.append('strip %s %s' % (strip_flags, output_binary))
-
-    self.configname = None
-    return result
-
-  def _GetDebugInfoPostbuilds(self, configname, output, output_binary, quiet):
-    """Returns a list of shell commands that contain the shell commands
-    neccessary to massage this target's debug information. These should be run
-    as postbuilds before the actual postbuilds run."""
-    self.configname = configname
-
-    # For static libraries, no dSYMs are created.
-    result = []
-    if (self._Test('GCC_GENERATE_DEBUGGING_SYMBOLS', 'YES', default='YES') and
-        self._Test(
-            'DEBUG_INFORMATION_FORMAT', 'dwarf-with-dsym', default='dwarf') and
-        self.spec['type'] != 'static_library'):
-      if not quiet:
-        result.append('echo DSYMUTIL\\(%s\\)' % self.spec['target_name'])
-      result.append('dsymutil %s -o %s' % (output_binary, output + '.dSYM'))
-
-    self.configname = None
-    return result
-
-  def GetTargetPostbuilds(self, configname, output, output_binary, quiet=False):
-    """Returns a list of shell commands that contain the shell commands
-    to run as postbuilds for this target, before the actual postbuilds."""
-    # dSYMs need to build before stripping happens.
-    return (
-        self._GetDebugInfoPostbuilds(configname, output, output_binary, quiet) +
-        self._GetStripPostbuilds(configname, output_binary, quiet))
-
-  def _AdjustLibrary(self, library):
-    if library.endswith('.framework'):
-      l = '-framework ' + os.path.splitext(os.path.basename(library))[0]
-    else:
-      m = self.library_re.match(library)
-      if m:
-        l = '-l' + m.group(1)
-      else:
-        l = library
-    return l.replace('$(SDKROOT)', self._SdkPath())
-
-  def AdjustLibraries(self, libraries):
-    """Transforms entries like 'Cocoa.framework' in libraries into entries like
-    '-framework Cocoa', 'libcrypto.dylib' into '-lcrypto', etc.
-    """
-    libraries = [ self._AdjustLibrary(library) for library in libraries]
-    return libraries
-
-
-class MacPrefixHeader(object):
-  """A class that helps with emulating Xcode's GCC_PREFIX_HEADER feature.
-
-  This feature consists of several pieces:
-  * If GCC_PREFIX_HEADER is present, all compilations in that project get an
-    additional |-include path_to_prefix_header| cflag.
-  * If GCC_PRECOMPILE_PREFIX_HEADER is present too, then the prefix header is
-    instead compiled, and all other compilations in the project get an
-    additional |-include path_to_compiled_header| instead.
-    + Compiled prefix headers have the extension gch. There is one gch file for
-      every language used in the project (c, cc, m, mm), since gch files for
-      different languages aren't compatible.
-    + gch files themselves are built with the target's normal cflags, but they
-      obviously don't get the |-include| flag. Instead, they need a -x flag that
-      describes their language.
-    + All o files in the target need to depend on the gch file, to make sure
-      it's built before any o file is built.
-
-  This class helps with some of these tasks, but it needs help from the build
-  system for writing dependencies to the gch files, for writing build commands
-  for the gch files, and for figuring out the location of the gch files.
-  """
-  def __init__(self, xcode_settings,
-               gyp_path_to_build_path, gyp_path_to_build_output):
-    """If xcode_settings is None, all methods on this class are no-ops.
-
-    Args:
-        gyp_path_to_build_path: A function that takes a gyp-relative path,
-            and returns a path relative to the build directory.
-        gyp_path_to_build_output: A function that takes a gyp-relative path and
-            a language code ('c', 'cc', 'm', or 'mm'), and that returns a path
-            to where the output of precompiling that path for that language
-            should be placed (without the trailing '.gch').
-    """
-    # This doesn't support per-configuration prefix headers. Good enough
-    # for now.
-    self.header = None
-    self.compile_headers = False
-    if xcode_settings:
-      self.header = xcode_settings.GetPerTargetSetting('GCC_PREFIX_HEADER')
-      self.compile_headers = xcode_settings.GetPerTargetSetting(
-          'GCC_PRECOMPILE_PREFIX_HEADER', default='NO') != 'NO'
-    self.compiled_headers = {}
-    if self.header:
-      if self.compile_headers:
-        for lang in ['c', 'cc', 'm', 'mm']:
-          self.compiled_headers[lang] = gyp_path_to_build_output(
-              self.header, lang)
-      self.header = gyp_path_to_build_path(self.header)
-
-  def GetInclude(self, lang):
-    """Gets the cflags to include the prefix header for language |lang|."""
-    if self.compile_headers and lang in self.compiled_headers:
-      return '-include %s' % self.compiled_headers[lang]
-    elif self.header:
-      return '-include %s' % self.header
-    else:
-      return ''
-
-  def _Gch(self, lang):
-    """Returns the actual file name of the prefix header for language |lang|."""
-    assert self.compile_headers
-    return self.compiled_headers[lang] + '.gch'
-
-  def GetObjDependencies(self, sources, objs):
-    """Given a list of source files and the corresponding object files, returns
-    a list of (source, object, gch) tuples, where |gch| is the build-directory
-    relative path to the gch file each object file depends on.  |compilable[i]|
-    has to be the source file belonging to |objs[i]|."""
-    if not self.header or not self.compile_headers:
-      return []
-
-    result = []
-    for source, obj in zip(sources, objs):
-      ext = os.path.splitext(source)[1]
-      lang = {
-        '.c': 'c',
-        '.cpp': 'cc', '.cc': 'cc', '.cxx': 'cc',
-        '.m': 'm',
-        '.mm': 'mm',
-      }.get(ext, None)
-      if lang:
-        result.append((source, obj, self._Gch(lang)))
-    return result
-
-  def GetPchBuildCommands(self):
-    """Returns [(path_to_gch, language_flag, language, header)].
-    |path_to_gch| and |header| are relative to the build directory.
-    """
-    if not self.header or not self.compile_headers:
-      return []
-    return [
-      (self._Gch('c'), '-x c-header', 'c', self.header),
-      (self._Gch('cc'), '-x c++-header', 'cc', self.header),
-      (self._Gch('m'), '-x objective-c-header', 'm', self.header),
-      (self._Gch('mm'), '-x objective-c++-header', 'mm', self.header),
-    ]
-
-
-def MergeGlobalXcodeSettingsToSpec(global_dict, spec):
-  """Merges the global xcode_settings dictionary into each configuration of the
-  target represented by spec. For keys that are both in the global and the local
-  xcode_settings dict, the local key gets precendence.
-  """
-  # The xcode generator special-cases global xcode_settings and does something
-  # that amounts to merging in the global xcode_settings into each local
-  # xcode_settings dict.
-  global_xcode_settings = global_dict.get('xcode_settings', {})
-  for config in spec['configurations'].values():
-    if 'xcode_settings' in config:
-      new_settings = global_xcode_settings.copy()
-      new_settings.update(config['xcode_settings'])
-      config['xcode_settings'] = new_settings
-
-
-def IsMacBundle(flavor, spec):
-  """Returns if |spec| should be treated as a bundle.
-
-  Bundles are directories with a certain subdirectory structure, instead of
-  just a single file. Bundle rules do not produce a binary but also package
-  resources into that directory."""
-  is_mac_bundle = (int(spec.get('mac_bundle', 0)) != 0 and flavor == 'mac')
-  if is_mac_bundle:
-    assert spec['type'] != 'none', (
-        'mac_bundle targets cannot have type none (target "%s")' %
-        spec['target_name'])
-  return is_mac_bundle
-
-
-def GetMacBundleResources(product_dir, xcode_settings, resources):
-  """Yields (output, resource) pairs for every resource in |resources|.
-  Only call this for mac bundle targets.
-
-  Args:
-      product_dir: Path to the directory containing the output bundle,
-          relative to the build directory.
-      xcode_settings: The XcodeSettings of the current target.
-      resources: A list of bundle resources, relative to the build directory.
-  """
-  dest = os.path.join(product_dir,
-                      xcode_settings.GetBundleResourceFolder())
-  for res in resources:
-    output = dest
-
-    # The make generator doesn't support it, so forbid it everywhere
-    # to keep the generators more interchangable.
-    assert ' ' not in res, (
-      "Spaces in resource filenames not supported (%s)"  % res)
-
-    # Split into (path,file).
-    res_parts = os.path.split(res)
-
-    # Now split the path into (prefix,maybe.lproj).
-    lproj_parts = os.path.split(res_parts[0])
-    # If the resource lives in a .lproj bundle, add that to the destination.
-    if lproj_parts[1].endswith('.lproj'):
-      output = os.path.join(output, lproj_parts[1])
-
-    output = os.path.join(output, res_parts[1])
-    # Compiled XIB files are referred to by .nib.
-    if output.endswith('.xib'):
-      output = output[0:-3] + 'nib'
-
-    yield output, res
-
-
-def GetMacInfoPlist(product_dir, xcode_settings, gyp_path_to_build_path):
-  """Returns (info_plist, dest_plist, defines, extra_env), where:
-  * |info_plist| is the sourc plist path, relative to the
-    build directory,
-  * |dest_plist| is the destination plist path, relative to the
-    build directory,
-  * |defines| is a list of preprocessor defines (empty if the plist
-    shouldn't be preprocessed,
-  * |extra_env| is a dict of env variables that should be exported when
-    invoking |mac_tool copy-info-plist|.
-
-  Only call this for mac bundle targets.
-
-  Args:
-      product_dir: Path to the directory containing the output bundle,
-          relative to the build directory.
-      xcode_settings: The XcodeSettings of the current target.
-      gyp_to_build_path: A function that converts paths relative to the
-          current gyp file to paths relative to the build direcotry.
-  """
-  info_plist = xcode_settings.GetPerTargetSetting('INFOPLIST_FILE')
-  if not info_plist:
-    return None, None, [], {}
-
-  # The make generator doesn't support it, so forbid it everywhere
-  # to keep the generators more interchangable.
-  assert ' ' not in info_plist, (
-    "Spaces in Info.plist filenames not supported (%s)"  % info_plist)
-
-  info_plist = gyp_path_to_build_path(info_plist)
-
-  # If explicitly set to preprocess the plist, invoke the C preprocessor and
-  # specify any defines as -D flags.
-  if xcode_settings.GetPerTargetSetting(
-      'INFOPLIST_PREPROCESS', default='NO') == 'YES':
-    # Create an intermediate file based on the path.
-    defines = shlex.split(xcode_settings.GetPerTargetSetting(
-        'INFOPLIST_PREPROCESSOR_DEFINITIONS', default=''))
-  else:
-    defines = []
-
-  dest_plist = os.path.join(product_dir, xcode_settings.GetBundlePlistPath())
-  extra_env = xcode_settings.GetPerTargetSettings()
-
-  return info_plist, dest_plist, defines, extra_env
-
-
-def _GetXcodeEnv(xcode_settings, built_products_dir, srcroot, configuration,
-                additional_settings=None):
-  """Return the environment variables that Xcode would set. See
-  http://developer.apple.com/library/mac/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//apple_ref/doc/uid/TP40003931-CH3-SW153
-  for a full list.
-
-  Args:
-      xcode_settings: An XcodeSettings object. If this is None, this function
-          returns an empty dict.
-      built_products_dir: Absolute path to the built products dir.
-      srcroot: Absolute path to the source root.
-      configuration: The build configuration name.
-      additional_settings: An optional dict with more values to add to the
-          result.
-  """
-  if not xcode_settings: return {}
-
-  # This function is considered a friend of XcodeSettings, so let it reach into
-  # its implementation details.
-  spec = xcode_settings.spec
-
-  # These are filled in on a as-needed basis.
-  env = {
-    'BUILT_PRODUCTS_DIR' : built_products_dir,
-    'CONFIGURATION' : configuration,
-    'PRODUCT_NAME' : xcode_settings.GetProductName(),
-    # See /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX\ Product\ Types.xcspec for FULL_PRODUCT_NAME
-    'SRCROOT' : srcroot,
-    'SOURCE_ROOT': '${SRCROOT}',
-    # This is not true for static libraries, but currently the env is only
-    # written for bundles:
-    'TARGET_BUILD_DIR' : built_products_dir,
-    'TEMP_DIR' : '${TMPDIR}',
-  }
-  if xcode_settings.GetPerTargetSetting('SDKROOT'):
-    env['SDKROOT'] = xcode_settings._SdkPath()
-  else:
-    env['SDKROOT'] = ''
-
-  if spec['type'] in (
-      'executable', 'static_library', 'shared_library', 'loadable_module'):
-    env['EXECUTABLE_NAME'] = xcode_settings.GetExecutableName()
-    env['EXECUTABLE_PATH'] = xcode_settings.GetExecutablePath()
-    env['FULL_PRODUCT_NAME'] = xcode_settings.GetFullProductName()
-    mach_o_type = xcode_settings.GetMachOType()
-    if mach_o_type:
-      env['MACH_O_TYPE'] = mach_o_type
-    env['PRODUCT_TYPE'] = xcode_settings.GetProductType()
-  if xcode_settings._IsBundle():
-    env['CONTENTS_FOLDER_PATH'] = \
-      xcode_settings.GetBundleContentsFolderPath()
-    env['UNLOCALIZED_RESOURCES_FOLDER_PATH'] = \
-        xcode_settings.GetBundleResourceFolder()
-    env['INFOPLIST_PATH'] = xcode_settings.GetBundlePlistPath()
-    env['WRAPPER_NAME'] = xcode_settings.GetWrapperName()
-
-  install_name = xcode_settings.GetInstallName()
-  if install_name:
-    env['LD_DYLIB_INSTALL_NAME'] = install_name
-  install_name_base = xcode_settings.GetInstallNameBase()
-  if install_name_base:
-    env['DYLIB_INSTALL_NAME_BASE'] = install_name_base
-
-  if not additional_settings:
-    additional_settings = {}
-  else:
-    # Flatten lists to strings.
-    for k in additional_settings:
-      if not isinstance(additional_settings[k], str):
-        additional_settings[k] = ' '.join(additional_settings[k])
-  additional_settings.update(env)
-
-  for k in additional_settings:
-    additional_settings[k] = _NormalizeEnvVarReferences(additional_settings[k])
-
-  return additional_settings
-
-
-def _NormalizeEnvVarReferences(str):
-  """Takes a string containing variable references in the form ${FOO}, $(FOO),
-  or $FOO, and returns a string with all variable references in the form ${FOO}.
-  """
-  # $FOO -> ${FOO}
-  str = re.sub(r'\$([a-zA-Z_][a-zA-Z0-9_]*)', r'${\1}', str)
-
-  # $(FOO) -> ${FOO}
-  matches = re.findall(r'(\$\(([a-zA-Z0-9\-_]+)\))', str)
-  for match in matches:
-    to_replace, variable = match
-    assert '$(' not in match, '$($(FOO)) variables not supported: ' + match
-    str = str.replace(to_replace, '${' + variable + '}')
-
-  return str
-
-
-def ExpandEnvVars(string, expansions):
-  """Expands ${VARIABLES}, $(VARIABLES), and $VARIABLES in string per the
-  expansions list. If the variable expands to something that references
-  another variable, this variable is expanded as well if it's in env --
-  until no variables present in env are left."""
-  for k, v in reversed(expansions):
-    string = string.replace('${' + k + '}', v)
-    string = string.replace('$(' + k + ')', v)
-    string = string.replace('$' + k, v)
-  return string
-
-
-def _TopologicallySortedEnvVarKeys(env):
-  """Takes a dict |env| whose values are strings that can refer to other keys,
-  for example env['foo'] = '$(bar) and $(baz)'. Returns a list L of all keys of
-  env such that key2 is after key1 in L if env[key2] refers to env[key1].
-
-  Throws an Exception in case of dependency cycles.
-  """
-  # Since environment variables can refer to other variables, the evaluation
-  # order is important. Below is the logic to compute the dependency graph
-  # and sort it.
-  regex = re.compile(r'\$\{([a-zA-Z0-9\-_]+)\}')
-  def GetEdges(node):
-    # Use a definition of edges such that user_of_variable -> used_varible.
-    # This happens to be easier in this case, since a variable's
-    # definition contains all variables it references in a single string.
-    # We can then reverse the result of the topological sort at the end.
-    # Since: reverse(topsort(DAG)) = topsort(reverse_edges(DAG))
-    matches = set([v for v in regex.findall(env[node]) if v in env])
-    for dependee in matches:
-      assert '${' not in dependee, 'Nested variables not supported: ' + dependee
-    return matches
-
-  try:
-    # Topologically sort, and then reverse, because we used an edge definition
-    # that's inverted from the expected result of this function (see comment
-    # above).
-    order = gyp.common.TopologicallySorted(env.keys(), GetEdges)
-    order.reverse()
-    return order
-  except gyp.common.CycleError, e:
-    raise Exception(
-        'Xcode environment variables are cyclically dependent: ' + str(e.nodes))
-
-
-def GetSortedXcodeEnv(xcode_settings, built_products_dir, srcroot,
-                      configuration, additional_settings=None):
-  env = _GetXcodeEnv(xcode_settings, built_products_dir, srcroot, configuration,
-                    additional_settings)
-  return [(key, env[key]) for key in _TopologicallySortedEnvVarKeys(env)]
-
-
-def GetSpecPostbuildCommands(spec, quiet=False):
-  """Returns the list of postbuilds explicitly defined on |spec|, in a form
-  executable by a shell."""
-  postbuilds = []
-  for postbuild in spec.get('postbuilds', []):
-    if not quiet:
-      postbuilds.append('echo POSTBUILD\\(%s\\) %s' % (
-            spec['target_name'], postbuild['postbuild_name']))
-    postbuilds.append(gyp.common.EncodePOSIXShellList(postbuild['action']))
-  return postbuilds
diff --git a/tools/gyp/pylib/gyp/xcodeproj_file.py b/tools/gyp/pylib/gyp/xcodeproj_file.py
deleted file mode 100644
index ec4cb96..0000000
--- a/tools/gyp/pylib/gyp/xcodeproj_file.py
+++ /dev/null
@@ -1,2869 +0,0 @@
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Xcode project file generator.
-
-This module is both an Xcode project file generator and a documentation of the
-Xcode project file format.  Knowledge of the project file format was gained
-based on extensive experience with Xcode, and by making changes to projects in
-Xcode.app and observing the resultant changes in the associated project files.
-
-XCODE PROJECT FILES
-
-The generator targets the file format as written by Xcode 3.2 (specifically,
-3.2.6), but past experience has taught that the format has not changed
-significantly in the past several years, and future versions of Xcode are able
-to read older project files.
-
-Xcode project files are "bundled": the project "file" from an end-user's
-perspective is actually a directory with an ".xcodeproj" extension.  The
-project file from this module's perspective is actually a file inside this
-directory, always named "project.pbxproj".  This file contains a complete
-description of the project and is all that is needed to use the xcodeproj.
-Other files contained in the xcodeproj directory are simply used to store
-per-user settings, such as the state of various UI elements in the Xcode
-application.
-
-The project.pbxproj file is a property list, stored in a format almost
-identical to the NeXTstep property list format.  The file is able to carry
-Unicode data, and is encoded in UTF-8.  The root element in the property list
-is a dictionary that contains several properties of minimal interest, and two
-properties of immense interest.  The most important property is a dictionary
-named "objects".  The entire structure of the project is represented by the
-children of this property.  The objects dictionary is keyed by unique 96-bit
-values represented by 24 uppercase hexadecimal characters.  Each value in the
-objects dictionary is itself a dictionary, describing an individual object.
-
-Each object in the dictionary is a member of a class, which is identified by
-the "isa" property of each object.  A variety of classes are represented in a
-project file.  Objects can refer to other objects by ID, using the 24-character
-hexadecimal object key.  A project's objects form a tree, with a root object
-of class PBXProject at the root.  As an example, the PBXProject object serves
-as parent to an XCConfigurationList object defining the build configurations
-used in the project, a PBXGroup object serving as a container for all files
-referenced in the project, and a list of target objects, each of which defines
-a target in the project.  There are several different types of target object,
-such as PBXNativeTarget and PBXAggregateTarget.  In this module, this
-relationship is expressed by having each target type derive from an abstract
-base named XCTarget.
-
-The project.pbxproj file's root dictionary also contains a property, sibling to
-the "objects" dictionary, named "rootObject".  The value of rootObject is a
-24-character object key referring to the root PBXProject object in the
-objects dictionary.
-
-In Xcode, every file used as input to a target or produced as a final product
-of a target must appear somewhere in the hierarchy rooted at the PBXGroup
-object referenced by the PBXProject's mainGroup property.  A PBXGroup is
-generally represented as a folder in the Xcode application.  PBXGroups can
-contain other PBXGroups as well as PBXFileReferences, which are pointers to
-actual files.
-
-Each XCTarget contains a list of build phases, represented in this module by
-the abstract base XCBuildPhase.  Examples of concrete XCBuildPhase derivations
-are PBXSourcesBuildPhase and PBXFrameworksBuildPhase, which correspond to the
-"Compile Sources" and "Link Binary With Libraries" phases displayed in the
-Xcode application.  Files used as input to these phases (for example, source
-files in the former case and libraries and frameworks in the latter) are
-represented by PBXBuildFile objects, referenced by elements of "files" lists
-in XCTarget objects.  Each PBXBuildFile object refers to a PBXBuildFile
-object as a "weak" reference: it does not "own" the PBXBuildFile, which is
-owned by the root object's mainGroup or a descendant group.  In most cases, the
-layer of indirection between an XCBuildPhase and a PBXFileReference via a
-PBXBuildFile appears extraneous, but there's actually one reason for this:
-file-specific compiler flags are added to the PBXBuildFile object so as to
-allow a single file to be a member of multiple targets while having distinct
-compiler flags for each.  These flags can be modified in the Xcode applciation
-in the "Build" tab of a File Info window.
-
-When a project is open in the Xcode application, Xcode will rewrite it.  As
-such, this module is careful to adhere to the formatting used by Xcode, to
-avoid insignificant changes appearing in the file when it is used in the
-Xcode application.  This will keep version control repositories happy, and
-makes it possible to compare a project file used in Xcode to one generated by
-this module to determine if any significant changes were made in the
-application.
-
-Xcode has its own way of assigning 24-character identifiers to each object,
-which is not duplicated here.  Because the identifier only is only generated
-once, when an object is created, and is then left unchanged, there is no need
-to attempt to duplicate Xcode's behavior in this area.  The generator is free
-to select any identifier, even at random, to refer to the objects it creates,
-and Xcode will retain those identifiers and use them when subsequently
-rewriting the project file.  However, the generator would choose new random
-identifiers each time the project files are generated, leading to difficulties
-comparing "used" project files to "pristine" ones produced by this module,
-and causing the appearance of changes as every object identifier is changed
-when updated projects are checked in to a version control repository.  To
-mitigate this problem, this module chooses identifiers in a more deterministic
-way, by hashing a description of each object as well as its parent and ancestor
-objects.  This strategy should result in minimal "shift" in IDs as successive
-generations of project files are produced.
-
-THIS MODULE
-
-This module introduces several classes, all derived from the XCObject class.
-Nearly all of the "brains" are built into the XCObject class, which understands
-how to create and modify objects, maintain the proper tree structure, compute
-identifiers, and print objects.  For the most part, classes derived from
-XCObject need only provide a _schema class object, a dictionary that
-expresses what properties objects of the class may contain.
-
-Given this structure, it's possible to build a minimal project file by creating
-objects of the appropriate types and making the proper connections:
-
-  config_list = XCConfigurationList()
-  group = PBXGroup()
-  project = PBXProject({'buildConfigurationList': config_list,
-                        'mainGroup': group})
-
-With the project object set up, it can be added to an XCProjectFile object.
-XCProjectFile is a pseudo-class in the sense that it is a concrete XCObject
-subclass that does not actually correspond to a class type found in a project
-file.  Rather, it is used to represent the project file's root dictionary.
-Printing an XCProjectFile will print the entire project file, including the
-full "objects" dictionary.
-
-  project_file = XCProjectFile({'rootObject': project})
-  project_file.ComputeIDs()
-  project_file.Print()
-
-Xcode project files are always encoded in UTF-8.  This module will accept
-strings of either the str class or the unicode class.  Strings of class str
-are assumed to already be encoded in UTF-8.  Obviously, if you're just using
-ASCII, you won't encounter difficulties because ASCII is a UTF-8 subset.
-Strings of class unicode are handled properly and encoded in UTF-8 when
-a project file is output.
-"""
-
-import gyp.common
-import posixpath
-import re
-import struct
-import sys
-
-# hashlib is supplied as of Python 2.5 as the replacement interface for sha
-# and other secure hashes.  In 2.6, sha is deprecated.  Import hashlib if
-# available, avoiding a deprecation warning under 2.6.  Import sha otherwise,
-# preserving 2.4 compatibility.
-try:
-  import hashlib
-  _new_sha1 = hashlib.sha1
-except ImportError:
-  import sha
-  _new_sha1 = sha.new
-
-
-# See XCObject._EncodeString.  This pattern is used to determine when a string
-# can be printed unquoted.  Strings that match this pattern may be printed
-# unquoted.  Strings that do not match must be quoted and may be further
-# transformed to be properly encoded.  Note that this expression matches the
-# characters listed with "+", for 1 or more occurrences: if a string is empty,
-# it must not match this pattern, because it needs to be encoded as "".
-_unquoted = re.compile('^[A-Za-z0-9$./_]+$')
-
-# Strings that match this pattern are quoted regardless of what _unquoted says.
-# Oddly, Xcode will quote any string with a run of three or more underscores.
-_quoted = re.compile('___')
-
-# This pattern should match any character that needs to be escaped by
-# XCObject._EncodeString.  See that function.
-_escaped = re.compile('[\\\\"]|[^ -~]')
-
-
-# Used by SourceTreeAndPathFromPath
-_path_leading_variable = re.compile('^\$\((.*?)\)(/(.*))?$')
-
-def SourceTreeAndPathFromPath(input_path):
-  """Given input_path, returns a tuple with sourceTree and path values.
-
-  Examples:
-    input_path     (source_tree, output_path)
-    '$(VAR)/path'  ('VAR', 'path')
-    '$(VAR)'       ('VAR', None)
-    'path'         (None, 'path')
-  """
-
-  source_group_match = _path_leading_variable.match(input_path)
-  if source_group_match:
-    source_tree = source_group_match.group(1)
-    output_path = source_group_match.group(3)  # This may be None.
-  else:
-    source_tree = None
-    output_path = input_path
-
-  return (source_tree, output_path)
-
-def ConvertVariablesToShellSyntax(input_string):
-  return re.sub('\$\((.*?)\)', '${\\1}', input_string)
-
-class XCObject(object):
-  """The abstract base of all class types used in Xcode project files.
-
-  Class variables:
-    _schema: A dictionary defining the properties of this class.  The keys to
-             _schema are string property keys as used in project files.  Values
-             are a list of four or five elements:
-             [ is_list, property_type, is_strong, is_required, default ]
-             is_list: True if the property described is a list, as opposed
-                      to a single element.
-             property_type: The type to use as the value of the property,
-                            or if is_list is True, the type to use for each
-                            element of the value's list.  property_type must
-                            be an XCObject subclass, or one of the built-in
-                            types str, int, or dict.
-             is_strong: If property_type is an XCObject subclass, is_strong
-                        is True to assert that this class "owns," or serves
-                        as parent, to the property value (or, if is_list is
-                        True, values).  is_strong must be False if
-                        property_type is not an XCObject subclass.
-             is_required: True if the property is required for the class.
-                          Note that is_required being True does not preclude
-                          an empty string ("", in the case of property_type
-                          str) or list ([], in the case of is_list True) from
-                          being set for the property.
-             default: Optional.  If is_requried is True, default may be set
-                      to provide a default value for objects that do not supply
-                      their own value.  If is_required is True and default
-                      is not provided, users of the class must supply their own
-                      value for the property.
-             Note that although the values of the array are expressed in
-             boolean terms, subclasses provide values as integers to conserve
-             horizontal space.
-    _should_print_single_line: False in XCObject.  Subclasses whose objects
-                               should be written to the project file in the
-                               alternate single-line format, such as
-                               PBXFileReference and PBXBuildFile, should
-                               set this to True.
-    _encode_transforms: Used by _EncodeString to encode unprintable characters.
-                        The index into this list is the ordinal of the
-                        character to transform; each value is a string
-                        used to represent the character in the output.  XCObject
-                        provides an _encode_transforms list suitable for most
-                        XCObject subclasses.
-    _alternate_encode_transforms: Provided for subclasses that wish to use
-                                  the alternate encoding rules.  Xcode seems
-                                  to use these rules when printing objects in
-                                  single-line format.  Subclasses that desire
-                                  this behavior should set _encode_transforms
-                                  to _alternate_encode_transforms.
-    _hashables: A list of XCObject subclasses that can be hashed by ComputeIDs
-                to construct this object's ID.  Most classes that need custom
-                hashing behavior should do it by overriding Hashables,
-                but in some cases an object's parent may wish to push a
-                hashable value into its child, and it can do so by appending
-                to _hashables.
-  Attributes:
-    id: The object's identifier, a 24-character uppercase hexadecimal string.
-        Usually, objects being created should not set id until the entire
-        project file structure is built.  At that point, UpdateIDs() should
-        be called on the root object to assign deterministic values for id to
-        each object in the tree.
-    parent: The object's parent.  This is set by a parent XCObject when a child
-            object is added to it.
-    _properties: The object's property dictionary.  An object's properties are
-                 described by its class' _schema variable.
-  """
-
-  _schema = {}
-  _should_print_single_line = False
-
-  # See _EncodeString.
-  _encode_transforms = []
-  i = 0
-  while i < ord(' '):
-    _encode_transforms.append('\\U%04x' % i)
-    i = i + 1
-  _encode_transforms[7] = '\\a'
-  _encode_transforms[8] = '\\b'
-  _encode_transforms[9] = '\\t'
-  _encode_transforms[10] = '\\n'
-  _encode_transforms[11] = '\\v'
-  _encode_transforms[12] = '\\f'
-  _encode_transforms[13] = '\\n'
-
-  _alternate_encode_transforms = list(_encode_transforms)
-  _alternate_encode_transforms[9] = chr(9)
-  _alternate_encode_transforms[10] = chr(10)
-  _alternate_encode_transforms[11] = chr(11)
-
-  def __init__(self, properties=None, id=None, parent=None):
-    self.id = id
-    self.parent = parent
-    self._properties = {}
-    self._hashables = []
-    self._SetDefaultsFromSchema()
-    self.UpdateProperties(properties)
-
-  def __repr__(self):
-    try:
-      name = self.Name()
-    except NotImplementedError:
-      return '<%s at 0x%x>' % (self.__class__.__name__, id(self))
-    return '<%s %r at 0x%x>' % (self.__class__.__name__, name, id(self))
-
-  def Copy(self):
-    """Make a copy of this object.
-
-    The new object will have its own copy of lists and dicts.  Any XCObject
-    objects owned by this object (marked "strong") will be copied in the
-    new object, even those found in lists.  If this object has any weak
-    references to other XCObjects, the same references are added to the new
-    object without making a copy.
-    """
-
-    that = self.__class__(id=self.id, parent=self.parent)
-    for key, value in self._properties.iteritems():
-      is_strong = self._schema[key][2]
-
-      if isinstance(value, XCObject):
-        if is_strong:
-          new_value = value.Copy()
-          new_value.parent = that
-          that._properties[key] = new_value
-        else:
-          that._properties[key] = value
-      elif isinstance(value, str) or isinstance(value, unicode) or \
-           isinstance(value, int):
-        that._properties[key] = value
-      elif isinstance(value, list):
-        if is_strong:
-          # If is_strong is True, each element is an XCObject, so it's safe to
-          # call Copy.
-          that._properties[key] = []
-          for item in value:
-            new_item = item.Copy()
-            new_item.parent = that
-            that._properties[key].append(new_item)
-        else:
-          that._properties[key] = value[:]
-      elif isinstance(value, dict):
-        # dicts are never strong.
-        if is_strong:
-          raise TypeError, 'Strong dict for key ' + key + ' in ' + \
-                           self.__class__.__name__
-        else:
-          that._properties[key] = value.copy()
-      else:
-        raise TypeError, 'Unexpected type ' + value.__class__.__name__ + \
-                         ' for key ' + key + ' in ' + self.__class__.__name__
-
-    return that
-
-  def Name(self):
-    """Return the name corresponding to an object.
-
-    Not all objects necessarily need to be nameable, and not all that do have
-    a "name" property.  Override as needed.
-    """
-
-    # If the schema indicates that "name" is required, try to access the
-    # property even if it doesn't exist.  This will result in a KeyError
-    # being raised for the property that should be present, which seems more
-    # appropriate than NotImplementedError in this case.
-    if 'name' in self._properties or \
-        ('name' in self._schema and self._schema['name'][3]):
-      return self._properties['name']
-
-    raise NotImplementedError, \
-          self.__class__.__name__ + ' must implement Name'
-
-  def Comment(self):
-    """Return a comment string for the object.
-
-    Most objects just use their name as the comment, but PBXProject uses
-    different values.
-
-    The returned comment is not escaped and does not have any comment marker
-    strings applied to it.
-    """
-
-    return self.Name()
-
-  def Hashables(self):
-    hashables = [self.__class__.__name__]
-
-    name = self.Name()
-    if name != None:
-      hashables.append(name)
-
-    hashables.extend(self._hashables)
-
-    return hashables
-
-  def HashablesForChild(self):
-    return None
-
-  def ComputeIDs(self, recursive=True, overwrite=True, seed_hash=None):
-    """Set "id" properties deterministically.
-
-    An object's "id" property is set based on a hash of its class type and
-    name, as well as the class type and name of all ancestor objects.  As
-    such, it is only advisable to call ComputeIDs once an entire project file
-    tree is built.
-
-    If recursive is True, recurse into all descendant objects and update their
-    hashes.
-
-    If overwrite is True, any existing value set in the "id" property will be
-    replaced.
-    """
-
-    def _HashUpdate(hash, data):
-      """Update hash with data's length and contents.
-
-      If the hash were updated only with the value of data, it would be
-      possible for clowns to induce collisions by manipulating the names of
-      their objects.  By adding the length, it's exceedingly less likely that
-      ID collisions will be encountered, intentionally or not.
-      """
-
-      hash.update(struct.pack('>i', len(data)))
-      hash.update(data)
-
-    if seed_hash is None:
-      seed_hash = _new_sha1()
-
-    hash = seed_hash.copy()
-
-    hashables = self.Hashables()
-    assert len(hashables) > 0
-    for hashable in hashables:
-      _HashUpdate(hash, hashable)
-
-    if recursive:
-      hashables_for_child = self.HashablesForChild()
-      if hashables_for_child is None:
-        child_hash = hash
-      else:
-        assert len(hashables_for_child) > 0
-        child_hash = seed_hash.copy()
-        for hashable in hashables_for_child:
-          _HashUpdate(child_hash, hashable)
-
-      for child in self.Children():
-        child.ComputeIDs(recursive, overwrite, child_hash)
-
-    if overwrite or self.id is None:
-      # Xcode IDs are only 96 bits (24 hex characters), but a SHA-1 digest is
-      # is 160 bits.  Instead of throwing out 64 bits of the digest, xor them
-      # into the portion that gets used.
-      assert hash.digest_size % 4 == 0
-      digest_int_count = hash.digest_size / 4
-      digest_ints = struct.unpack('>' + 'I' * digest_int_count, hash.digest())
-      id_ints = [0, 0, 0]
-      for index in xrange(0, digest_int_count):
-        id_ints[index % 3] ^= digest_ints[index]
-      self.id = '%08X%08X%08X' % tuple(id_ints)
-
-  def EnsureNoIDCollisions(self):
-    """Verifies that no two objects have the same ID.  Checks all descendants.
-    """
-
-    ids = {}
-    descendants = self.Descendants()
-    for descendant in descendants:
-      if descendant.id in ids:
-        other = ids[descendant.id]
-        raise KeyError, \
-              'Duplicate ID %s, objects "%s" and "%s" in "%s"' % \
-              (descendant.id, str(descendant._properties),
-               str(other._properties), self._properties['rootObject'].Name())
-      ids[descendant.id] = descendant
-
-  def Children(self):
-    """Returns a list of all of this object's owned (strong) children."""
-
-    children = []
-    for property, attributes in self._schema.iteritems():
-      (is_list, property_type, is_strong) = attributes[0:3]
-      if is_strong and property in self._properties:
-        if not is_list:
-          children.append(self._properties[property])
-        else:
-          children.extend(self._properties[property])
-    return children
-
-  def Descendants(self):
-    """Returns a list of all of this object's descendants, including this
-    object.
-    """
-
-    children = self.Children()
-    descendants = [self]
-    for child in children:
-      descendants.extend(child.Descendants())
-    return descendants
-
-  def PBXProjectAncestor(self):
-    # The base case for recursion is defined at PBXProject.PBXProjectAncestor.
-    if self.parent:
-      return self.parent.PBXProjectAncestor()
-    return None
-
-  def _EncodeComment(self, comment):
-    """Encodes a comment to be placed in the project file output, mimicing
-    Xcode behavior.
-    """
-
-    # This mimics Xcode behavior by wrapping the comment in "/*" and "*/".  If
-    # the string already contains a "*/", it is turned into "(*)/".  This keeps
-    # the file writer from outputting something that would be treated as the
-    # end of a comment in the middle of something intended to be entirely a
-    # comment.
-
-    return '/* ' + comment.replace('*/', '(*)/') + ' */'
-
-  def _EncodeTransform(self, match):
-    # This function works closely with _EncodeString.  It will only be called
-    # by re.sub with match.group(0) containing a character matched by the
-    # the _escaped expression.
-    char = match.group(0)
-
-    # Backslashes (\) and quotation marks (") are always replaced with a
-    # backslash-escaped version of the same.  Everything else gets its
-    # replacement from the class' _encode_transforms array.
-    if char == '\\':
-      return '\\\\'
-    if char == '"':
-      return '\\"'
-    return self._encode_transforms[ord(char)]
-
-  def _EncodeString(self, value):
-    """Encodes a string to be placed in the project file output, mimicing
-    Xcode behavior.
-    """
-
-    # Use quotation marks when any character outside of the range A-Z, a-z, 0-9,
-    # $ (dollar sign), . (period), and _ (underscore) is present.  Also use
-    # quotation marks to represent empty strings.
-    #
-    # Escape " (double-quote) and \ (backslash) by preceding them with a
-    # backslash.
-    #
-    # Some characters below the printable ASCII range are encoded specially:
-    #     7 ^G BEL is encoded as "\a"
-    #     8 ^H BS  is encoded as "\b"
-    #    11 ^K VT  is encoded as "\v"
-    #    12 ^L NP  is encoded as "\f"
-    #   127 ^? DEL is passed through as-is without escaping
-    #  - In PBXFileReference and PBXBuildFile objects:
-    #     9 ^I HT  is passed through as-is without escaping
-    #    10 ^J NL  is passed through as-is without escaping
-    #    13 ^M CR  is passed through as-is without escaping
-    #  - In other objects:
-    #     9 ^I HT  is encoded as "\t"
-    #    10 ^J NL  is encoded as "\n"
-    #    13 ^M CR  is encoded as "\n" rendering it indistinguishable from
-    #              10 ^J NL
-    # All other nonprintable characters within the ASCII range (0 through 127
-    # inclusive) are encoded as "\U001f" referring to the Unicode code point in
-    # hexadecimal.  For example, character 14 (^N SO) is encoded as "\U000e".
-    # Characters above the ASCII range are passed through to the output encoded
-    # as UTF-8 without any escaping.  These mappings are contained in the
-    # class' _encode_transforms list.
-
-    if _unquoted.search(value) and not _quoted.search(value):
-      return value
-
-    return '"' + _escaped.sub(self._EncodeTransform, value) + '"'
-
-  def _XCPrint(self, file, tabs, line):
-    file.write('\t' * tabs + line)
-
-  def _XCPrintableValue(self, tabs, value, flatten_list=False):
-    """Returns a representation of value that may be printed in a project file,
-    mimicing Xcode's behavior.
-
-    _XCPrintableValue can handle str and int values, XCObjects (which are
-    made printable by returning their id property), and list and dict objects
-    composed of any of the above types.  When printing a list or dict, and
-    _should_print_single_line is False, the tabs parameter is used to determine
-    how much to indent the lines corresponding to the items in the list or
-    dict.
-
-    If flatten_list is True, single-element lists will be transformed into
-    strings.
-    """
-
-    printable = ''
-    comment = None
-
-    if self._should_print_single_line:
-      sep = ' '
-      element_tabs = ''
-      end_tabs = ''
-    else:
-      sep = '\n'
-      element_tabs = '\t' * (tabs + 1)
-      end_tabs = '\t' * tabs
-
-    if isinstance(value, XCObject):
-      printable += value.id
-      comment = value.Comment()
-    elif isinstance(value, str):
-      printable += self._EncodeString(value)
-    elif isinstance(value, unicode):
-      printable += self._EncodeString(value.encode('utf-8'))
-    elif isinstance(value, int):
-      printable += str(value)
-    elif isinstance(value, list):
-      if flatten_list and len(value) <= 1:
-        if len(value) == 0:
-          printable += self._EncodeString('')
-        else:
-          printable += self._EncodeString(value[0])
-      else:
-        printable = '(' + sep
-        for item in value:
-          printable += element_tabs + \
-                       self._XCPrintableValue(tabs + 1, item, flatten_list) + \
-                       ',' + sep
-        printable += end_tabs + ')'
-    elif isinstance(value, dict):
-      printable = '{' + sep
-      for item_key, item_value in sorted(value.iteritems()):
-        printable += element_tabs + \
-            self._XCPrintableValue(tabs + 1, item_key, flatten_list) + ' = ' + \
-            self._XCPrintableValue(tabs + 1, item_value, flatten_list) + ';' + \
-            sep
-      printable += end_tabs + '}'
-    else:
-      raise TypeError, "Can't make " + value.__class__.__name__ + ' printable'
-
-    if comment != None:
-      printable += ' ' + self._EncodeComment(comment)
-
-    return printable
-
-  def _XCKVPrint(self, file, tabs, key, value):
-    """Prints a key and value, members of an XCObject's _properties dictionary,
-    to file.
-
-    tabs is an int identifying the indentation level.  If the class'
-    _should_print_single_line variable is True, tabs is ignored and the
-    key-value pair will be followed by a space insead of a newline.
-    """
-
-    if self._should_print_single_line:
-      printable = ''
-      after_kv = ' '
-    else:
-      printable = '\t' * tabs
-      after_kv = '\n'
-
-    # Xcode usually prints remoteGlobalIDString values in PBXContainerItemProxy
-    # objects without comments.  Sometimes it prints them with comments, but
-    # the majority of the time, it doesn't.  To avoid unnecessary changes to
-    # the project file after Xcode opens it, don't write comments for
-    # remoteGlobalIDString.  This is a sucky hack and it would certainly be
-    # cleaner to extend the schema to indicate whether or not a comment should
-    # be printed, but since this is the only case where the problem occurs and
-    # Xcode itself can't seem to make up its mind, the hack will suffice.
-    #
-    # Also see PBXContainerItemProxy._schema['remoteGlobalIDString'].
-    if key == 'remoteGlobalIDString' and isinstance(self,
-                                                    PBXContainerItemProxy):
-      value_to_print = value.id
-    else:
-      value_to_print = value
-
-    # PBXBuildFile's settings property is represented in the output as a dict,
-    # but a hack here has it represented as a string. Arrange to strip off the
-    # quotes so that it shows up in the output as expected.
-    if key == 'settings' and isinstance(self, PBXBuildFile):
-      strip_value_quotes = True
-    else:
-      strip_value_quotes = False
-
-    # In another one-off, let's set flatten_list on buildSettings properties
-    # of XCBuildConfiguration objects, because that's how Xcode treats them.
-    if key == 'buildSettings' and isinstance(self, XCBuildConfiguration):
-      flatten_list = True
-    else:
-      flatten_list = False
-
-    try:
-      printable_key = self._XCPrintableValue(tabs, key, flatten_list)
-      printable_value = self._XCPrintableValue(tabs, value_to_print,
-                                               flatten_list)
-      if strip_value_quotes and len(printable_value) > 1 and \
-          printable_value[0] == '"' and printable_value[-1] == '"':
-        printable_value = printable_value[1:-1]
-      printable += printable_key + ' = ' + printable_value + ';' + after_kv
-    except TypeError, e:
-      gyp.common.ExceptionAppend(e,
-                                 'while printing key "%s"' % key)
-      raise
-
-    self._XCPrint(file, 0, printable)
-
-  def Print(self, file=sys.stdout):
-    """Prints a reprentation of this object to file, adhering to Xcode output
-    formatting.
-    """
-
-    self.VerifyHasRequiredProperties()
-
-    if self._should_print_single_line:
-      # When printing an object in a single line, Xcode doesn't put any space
-      # between the beginning of a dictionary (or presumably a list) and the
-      # first contained item, so you wind up with snippets like
-      #   ...CDEF = {isa = PBXFileReference; fileRef = 0123...
-      # If it were me, I would have put a space in there after the opening
-      # curly, but I guess this is just another one of those inconsistencies
-      # between how Xcode prints PBXFileReference and PBXBuildFile objects as
-      # compared to other objects.  Mimic Xcode's behavior here by using an
-      # empty string for sep.
-      sep = ''
-      end_tabs = 0
-    else:
-      sep = '\n'
-      end_tabs = 2
-
-    # Start the object.  For example, '\t\tPBXProject = {\n'.
-    self._XCPrint(file, 2, self._XCPrintableValue(2, self) + ' = {' + sep)
-
-    # "isa" isn't in the _properties dictionary, it's an intrinsic property
-    # of the class which the object belongs to.  Xcode always outputs "isa"
-    # as the first element of an object dictionary.
-    self._XCKVPrint(file, 3, 'isa', self.__class__.__name__)
-
-    # The remaining elements of an object dictionary are sorted alphabetically.
-    for property, value in sorted(self._properties.iteritems()):
-      self._XCKVPrint(file, 3, property, value)
-
-    # End the object.
-    self._XCPrint(file, end_tabs, '};\n')
-
-  def UpdateProperties(self, properties, do_copy=False):
-    """Merge the supplied properties into the _properties dictionary.
-
-    The input properties must adhere to the class schema or a KeyError or
-    TypeError exception will be raised.  If adding an object of an XCObject
-    subclass and the schema indicates a strong relationship, the object's
-    parent will be set to this object.
-
-    If do_copy is True, then lists, dicts, strong-owned XCObjects, and
-    strong-owned XCObjects in lists will be copied instead of having their
-    references added.
-    """
-
-    if properties is None:
-      return
-
-    for property, value in properties.iteritems():
-      # Make sure the property is in the schema.
-      if not property in self._schema:
-        raise KeyError, property + ' not in ' + self.__class__.__name__
-
-      # Make sure the property conforms to the schema.
-      (is_list, property_type, is_strong) = self._schema[property][0:3]
-      if is_list:
-        if value.__class__ != list:
-          raise TypeError, \
-                property + ' of ' + self.__class__.__name__ + \
-                ' must be list, not ' + value.__class__.__name__
-        for item in value:
-          if not isinstance(item, property_type) and \
-             not (item.__class__ == unicode and property_type == str):
-            # Accept unicode where str is specified.  str is treated as
-            # UTF-8-encoded.
-            raise TypeError, \
-                  'item of ' + property + ' of ' + self.__class__.__name__ + \
-                  ' must be ' + property_type.__name__ + ', not ' + \
-                  item.__class__.__name__
-      elif not isinstance(value, property_type) and \
-           not (value.__class__ == unicode and property_type == str):
-        # Accept unicode where str is specified.  str is treated as
-        # UTF-8-encoded.
-        raise TypeError, \
-              property + ' of ' + self.__class__.__name__ + ' must be ' + \
-              property_type.__name__ + ', not ' + value.__class__.__name__
-
-      # Checks passed, perform the assignment.
-      if do_copy:
-        if isinstance(value, XCObject):
-          if is_strong:
-            self._properties[property] = value.Copy()
-          else:
-            self._properties[property] = value
-        elif isinstance(value, str) or isinstance(value, unicode) or \
-             isinstance(value, int):
-          self._properties[property] = value
-        elif isinstance(value, list):
-          if is_strong:
-            # If is_strong is True, each element is an XCObject, so it's safe
-            # to call Copy.
-            self._properties[property] = []
-            for item in value:
-              self._properties[property].append(item.Copy())
-          else:
-            self._properties[property] = value[:]
-        elif isinstance(value, dict):
-          self._properties[property] = value.copy()
-        else:
-          raise TypeError, "Don't know how to copy a " + \
-                           value.__class__.__name__ + ' object for ' + \
-                           property + ' in ' + self.__class__.__name__
-      else:
-        self._properties[property] = value
-
-      # Set up the child's back-reference to this object.  Don't use |value|
-      # any more because it may not be right if do_copy is true.
-      if is_strong:
-        if not is_list:
-          self._properties[property].parent = self
-        else:
-          for item in self._properties[property]:
-            item.parent = self
-
-  def HasProperty(self, key):
-    return key in self._properties
-
-  def GetProperty(self, key):
-    return self._properties[key]
-
-  def SetProperty(self, key, value):
-    self.UpdateProperties({key: value})
-
-  def DelProperty(self, key):
-    if key in self._properties:
-      del self._properties[key]
-
-  def AppendProperty(self, key, value):
-    # TODO(mark): Support ExtendProperty too (and make this call that)?
-
-    # Schema validation.
-    if not key in self._schema:
-      raise KeyError, key + ' not in ' + self.__class__.__name__
-
-    (is_list, property_type, is_strong) = self._schema[key][0:3]
-    if not is_list:
-      raise TypeError, key + ' of ' + self.__class__.__name__ + ' must be list'
-    if not isinstance(value, property_type):
-      raise TypeError, 'item of ' + key + ' of ' + self.__class__.__name__ + \
-                       ' must be ' + property_type.__name__ + ', not ' + \
-                       value.__class__.__name__
-
-    # If the property doesn't exist yet, create a new empty list to receive the
-    # item.
-    if not key in self._properties:
-      self._properties[key] = []
-
-    # Set up the ownership link.
-    if is_strong:
-      value.parent = self
-
-    # Store the item.
-    self._properties[key].append(value)
-
-  def VerifyHasRequiredProperties(self):
-    """Ensure that all properties identified as required by the schema are
-    set.
-    """
-
-    # TODO(mark): A stronger verification mechanism is needed.  Some
-    # subclasses need to perform validation beyond what the schema can enforce.
-    for property, attributes in self._schema.iteritems():
-      (is_list, property_type, is_strong, is_required) = attributes[0:4]
-      if is_required and not property in self._properties:
-        raise KeyError, self.__class__.__name__ + ' requires ' + property
-
-  def _SetDefaultsFromSchema(self):
-    """Assign object default values according to the schema.  This will not
-    overwrite properties that have already been set."""
-
-    defaults = {}
-    for property, attributes in self._schema.iteritems():
-      (is_list, property_type, is_strong, is_required) = attributes[0:4]
-      if is_required and len(attributes) >= 5 and \
-          not property in self._properties:
-        default = attributes[4]
-
-        defaults[property] = default
-
-    if len(defaults) > 0:
-      # Use do_copy=True so that each new object gets its own copy of strong
-      # objects, lists, and dicts.
-      self.UpdateProperties(defaults, do_copy=True)
-
-
-class XCHierarchicalElement(XCObject):
-  """Abstract base for PBXGroup and PBXFileReference.  Not represented in a
-  project file."""
-
-  # TODO(mark): Do name and path belong here?  Probably so.
-  # If path is set and name is not, name may have a default value.  Name will
-  # be set to the basename of path, if the basename of path is different from
-  # the full value of path.  If path is already just a leaf name, name will
-  # not be set.
-  _schema = XCObject._schema.copy()
-  _schema.update({
-    'comments':       [0, str, 0, 0],
-    'fileEncoding':   [0, str, 0, 0],
-    'includeInIndex': [0, int, 0, 0],
-    'indentWidth':    [0, int, 0, 0],
-    'lineEnding':     [0, int, 0, 0],
-    'sourceTree':     [0, str, 0, 1, '<group>'],
-    'tabWidth':       [0, int, 0, 0],
-    'usesTabs':       [0, int, 0, 0],
-    'wrapsLines':     [0, int, 0, 0],
-  })
-
-  def __init__(self, properties=None, id=None, parent=None):
-    # super
-    XCObject.__init__(self, properties, id, parent)
-    if 'path' in self._properties and not 'name' in self._properties:
-      path = self._properties['path']
-      name = posixpath.basename(path)
-      if name != '' and path != name:
-        self.SetProperty('name', name)
-
-    if 'path' in self._properties and \
-        (not 'sourceTree' in self._properties or \
-         self._properties['sourceTree'] == '<group>'):
-      # If the pathname begins with an Xcode variable like "$(SDKROOT)/", take
-      # the variable out and make the path be relative to that variable by
-      # assigning the variable name as the sourceTree.
-      (source_tree, path) = SourceTreeAndPathFromPath(self._properties['path'])
-      if source_tree != None:
-        self._properties['sourceTree'] = source_tree
-      if path != None:
-        self._properties['path'] = path
-      if source_tree != None and path is None and \
-         not 'name' in self._properties:
-        # The path was of the form "$(SDKROOT)" with no path following it.
-        # This object is now relative to that variable, so it has no path
-        # attribute of its own.  It does, however, keep a name.
-        del self._properties['path']
-        self._properties['name'] = source_tree
-
-  def Name(self):
-    if 'name' in self._properties:
-      return self._properties['name']
-    elif 'path' in self._properties:
-      return self._properties['path']
-    else:
-      # This happens in the case of the root PBXGroup.
-      return None
-
-  def Hashables(self):
-    """Custom hashables for XCHierarchicalElements.
-
-    XCHierarchicalElements are special.  Generally, their hashes shouldn't
-    change if the paths don't change.  The normal XCObject implementation of
-    Hashables adds a hashable for each object, which means that if
-    the hierarchical structure changes (possibly due to changes caused when
-    TakeOverOnlyChild runs and encounters slight changes in the hierarchy),
-    the hashes will change.  For example, if a project file initially contains
-    a/b/f1 and a/b becomes collapsed into a/b, f1 will have a single parent
-    a/b.  If someone later adds a/f2 to the project file, a/b can no longer be
-    collapsed, and f1 winds up with parent b and grandparent a.  That would
-    be sufficient to change f1's hash.
-
-    To counteract this problem, hashables for all XCHierarchicalElements except
-    for the main group (which has neither a name nor a path) are taken to be
-    just the set of path components.  Because hashables are inherited from
-    parents, this provides assurance that a/b/f1 has the same set of hashables
-    whether its parent is b or a/b.
-
-    The main group is a special case.  As it is permitted to have no name or
-    path, it is permitted to use the standard XCObject hash mechanism.  This
-    is not considered a problem because there can be only one main group.
-    """
-
-    if self == self.PBXProjectAncestor()._properties['mainGroup']:
-      # super
-      return XCObject.Hashables(self)
-
-    hashables = []
-
-    # Put the name in first, ensuring that if TakeOverOnlyChild collapses
-    # children into a top-level group like "Source", the name always goes
-    # into the list of hashables without interfering with path components.
-    if 'name' in self._properties:
-      # Make it less likely for people to manipulate hashes by following the
-      # pattern of always pushing an object type value onto the list first.
-      hashables.append(self.__class__.__name__ + '.name')
-      hashables.append(self._properties['name'])
-
-    # NOTE: This still has the problem that if an absolute path is encountered,
-    # including paths with a sourceTree, they'll still inherit their parents'
-    # hashables, even though the paths aren't relative to their parents.  This
-    # is not expected to be much of a problem in practice.
-    path = self.PathFromSourceTreeAndPath()
-    if path != None:
-      components = path.split(posixpath.sep)
-      for component in components:
-        hashables.append(self.__class__.__name__ + '.path')
-        hashables.append(component)
-
-    hashables.extend(self._hashables)
-
-    return hashables
-
-  def Compare(self, other):
-    # Allow comparison of these types.  PBXGroup has the highest sort rank;
-    # PBXVariantGroup is treated as equal to PBXFileReference.
-    valid_class_types = {
-      PBXFileReference: 'file',
-      PBXGroup:         'group',
-      PBXVariantGroup:  'file',
-    }
-    self_type = valid_class_types[self.__class__]
-    other_type = valid_class_types[other.__class__]
-
-    if self_type == other_type:
-      # If the two objects are of the same sort rank, compare their names.
-      return cmp(self.Name(), other.Name())
-
-    # Otherwise, sort groups before everything else.
-    if self_type == 'group':
-      return -1
-    return 1
-
-  def CompareRootGroup(self, other):
-    # This function should be used only to compare direct children of the
-    # containing PBXProject's mainGroup.  These groups should appear in the
-    # listed order.
-    # TODO(mark): "Build" is used by gyp.generator.xcode, perhaps the
-    # generator should have a way of influencing this list rather than having
-    # to hardcode for the generator here.
-    order = ['Source', 'Intermediates', 'Projects', 'Frameworks', 'Products',
-             'Build']
-
-    # If the groups aren't in the listed order, do a name comparison.
-    # Otherwise, groups in the listed order should come before those that
-    # aren't.
-    self_name = self.Name()
-    other_name = other.Name()
-    self_in = isinstance(self, PBXGroup) and self_name in order
-    other_in = isinstance(self, PBXGroup) and other_name in order
-    if not self_in and not other_in:
-      return self.Compare(other)
-    if self_name in order and not other_name in order:
-      return -1
-    if other_name in order and not self_name in order:
-      return 1
-
-    # If both groups are in the listed order, go by the defined order.
-    self_index = order.index(self_name)
-    other_index = order.index(other_name)
-    if self_index < other_index:
-      return -1
-    if self_index > other_index:
-      return 1
-    return 0
-
-  def PathFromSourceTreeAndPath(self):
-    # Turn the object's sourceTree and path properties into a single flat
-    # string of a form comparable to the path parameter.  If there's a
-    # sourceTree property other than "<group>", wrap it in $(...) for the
-    # comparison.
-    components = []
-    if self._properties['sourceTree'] != '<group>':
-      components.append('$(' + self._properties['sourceTree'] + ')')
-    if 'path' in self._properties:
-      components.append(self._properties['path'])
-
-    if len(components) > 0:
-      return posixpath.join(*components)
-
-    return None
-
-  def FullPath(self):
-    # Returns a full path to self relative to the project file, or relative
-    # to some other source tree.  Start with self, and walk up the chain of
-    # parents prepending their paths, if any, until no more parents are
-    # available (project-relative path) or until a path relative to some
-    # source tree is found.
-    xche = self
-    path = None
-    while isinstance(xche, XCHierarchicalElement) and \
-          (path is None or \
-           (not path.startswith('/') and not path.startswith('$'))):
-      this_path = xche.PathFromSourceTreeAndPath()
-      if this_path != None and path != None:
-        path = posixpath.join(this_path, path)
-      elif this_path != None:
-        path = this_path
-      xche = xche.parent
-
-    return path
-
-
-class PBXGroup(XCHierarchicalElement):
-  """
-  Attributes:
-    _children_by_path: Maps pathnames of children of this PBXGroup to the
-      actual child XCHierarchicalElement objects.
-    _variant_children_by_name_and_path: Maps (name, path) tuples of
-      PBXVariantGroup children to the actual child PBXVariantGroup objects.
-  """
-
-  _schema = XCHierarchicalElement._schema.copy()
-  _schema.update({
-    'children': [1, XCHierarchicalElement, 1, 1, []],
-    'name':     [0, str,                   0, 0],
-    'path':     [0, str,                   0, 0],
-  })
-
-  def __init__(self, properties=None, id=None, parent=None):
-    # super
-    XCHierarchicalElement.__init__(self, properties, id, parent)
-    self._children_by_path = {}
-    self._variant_children_by_name_and_path = {}
-    for child in self._properties.get('children', []):
-      self._AddChildToDicts(child)
-
-  def Hashables(self):
-    # super
-    hashables = XCHierarchicalElement.Hashables(self)
-
-    # It is not sufficient to just rely on name and parent to build a unique
-    # hashable : a node could have two child PBXGroup sharing a common name.
-    # To add entropy the hashable is enhanced with the names of all its
-    # children.
-    for child in self._properties.get('children', []):
-      child_name = child.Name()
-      if child_name != None:
-        hashables.append(child_name)
-
-    return hashables
-
-  def HashablesForChild(self):
-    # To avoid a circular reference the hashables used to compute a child id do
-    # not include the child names.
-    return XCHierarchicalElement.Hashables(self)
-
-  def _AddChildToDicts(self, child):
-    # Sets up this PBXGroup object's dicts to reference the child properly.
-    child_path = child.PathFromSourceTreeAndPath()
-    if child_path:
-      if child_path in self._children_by_path:
-        raise ValueError, 'Found multiple children with path ' + child_path
-      self._children_by_path[child_path] = child
-
-    if isinstance(child, PBXVariantGroup):
-      child_name = child._properties.get('name', None)
-      key = (child_name, child_path)
-      if key in self._variant_children_by_name_and_path:
-        raise ValueError, 'Found multiple PBXVariantGroup children with ' + \
-                          'name ' + str(child_name) + ' and path ' + \
-                          str(child_path)
-      self._variant_children_by_name_and_path[key] = child
-
-  def AppendChild(self, child):
-    # Callers should use this instead of calling
-    # AppendProperty('children', child) directly because this function
-    # maintains the group's dicts.
-    self.AppendProperty('children', child)
-    self._AddChildToDicts(child)
-
-  def GetChildByName(self, name):
-    # This is not currently optimized with a dict as GetChildByPath is because
-    # it has few callers.  Most callers probably want GetChildByPath.  This
-    # function is only useful to get children that have names but no paths,
-    # which is rare.  The children of the main group ("Source", "Products",
-    # etc.) is pretty much the only case where this likely to come up.
-    #
-    # TODO(mark): Maybe this should raise an error if more than one child is
-    # present with the same name.
-    if not 'children' in self._properties:
-      return None
-
-    for child in self._properties['children']:
-      if child.Name() == name:
-        return child
-
-    return None
-
-  def GetChildByPath(self, path):
-    if not path:
-      return None
-
-    if path in self._children_by_path:
-      return self._children_by_path[path]
-
-    return None
-
-  def GetChildByRemoteObject(self, remote_object):
-    # This method is a little bit esoteric.  Given a remote_object, which
-    # should be a PBXFileReference in another project file, this method will
-    # return this group's PBXReferenceProxy object serving as a local proxy
-    # for the remote PBXFileReference.
-    #
-    # This function might benefit from a dict optimization as GetChildByPath
-    # for some workloads, but profiling shows that it's not currently a
-    # problem.
-    if not 'children' in self._properties:
-      return None
-
-    for child in self._properties['children']:
-      if not isinstance(child, PBXReferenceProxy):
-        continue
-
-      container_proxy = child._properties['remoteRef']
-      if container_proxy._properties['remoteGlobalIDString'] == remote_object:
-        return child
-
-    return None
-
-  def AddOrGetFileByPath(self, path, hierarchical):
-    """Returns an existing or new file reference corresponding to path.
-
-    If hierarchical is True, this method will create or use the necessary
-    hierarchical group structure corresponding to path.  Otherwise, it will
-    look in and create an item in the current group only.
-
-    If an existing matching reference is found, it is returned, otherwise, a
-    new one will be created, added to the correct group, and returned.
-
-    If path identifies a directory by virtue of carrying a trailing slash,
-    this method returns a PBXFileReference of "folder" type.  If path
-    identifies a variant, by virtue of it identifying a file inside a directory
-    with an ".lproj" extension, this method returns a PBXVariantGroup
-    containing the variant named by path, and possibly other variants.  For
-    all other paths, a "normal" PBXFileReference will be returned.
-    """
-
-    # Adding or getting a directory?  Directories end with a trailing slash.
-    is_dir = False
-    if path.endswith('/'):
-      is_dir = True
-    path = posixpath.normpath(path)
-    if is_dir:
-      path = path + '/'
-
-    # Adding or getting a variant?  Variants are files inside directories
-    # with an ".lproj" extension.  Xcode uses variants for localization.  For
-    # a variant path/to/Language.lproj/MainMenu.nib, put a variant group named
-    # MainMenu.nib inside path/to, and give it a variant named Language.  In
-    # this example, grandparent would be set to path/to and parent_root would
-    # be set to Language.
-    variant_name = None
-    parent = posixpath.dirname(path)
-    grandparent = posixpath.dirname(parent)
-    parent_basename = posixpath.basename(parent)
-    (parent_root, parent_ext) = posixpath.splitext(parent_basename)
-    if parent_ext == '.lproj':
-      variant_name = parent_root
-    if grandparent == '':
-      grandparent = None
-
-    # Putting a directory inside a variant group is not currently supported.
-    assert not is_dir or variant_name is None
-
-    path_split = path.split(posixpath.sep)
-    if len(path_split) == 1 or \
-       ((is_dir or variant_name != None) and len(path_split) == 2) or \
-       not hierarchical:
-      # The PBXFileReference or PBXVariantGroup will be added to or gotten from
-      # this PBXGroup, no recursion necessary.
-      if variant_name is None:
-        # Add or get a PBXFileReference.
-        file_ref = self.GetChildByPath(path)
-        if file_ref != None:
-          assert file_ref.__class__ == PBXFileReference
-        else:
-          file_ref = PBXFileReference({'path': path})
-          self.AppendChild(file_ref)
-      else:
-        # Add or get a PBXVariantGroup.  The variant group name is the same
-        # as the basename (MainMenu.nib in the example above).  grandparent
-        # specifies the path to the variant group itself, and path_split[-2:]
-        # is the path of the specific variant relative to its group.
-        variant_group_name = posixpath.basename(path)
-        variant_group_ref = self.AddOrGetVariantGroupByNameAndPath(
-            variant_group_name, grandparent)
-        variant_path = posixpath.sep.join(path_split[-2:])
-        variant_ref = variant_group_ref.GetChildByPath(variant_path)
-        if variant_ref != None:
-          assert variant_ref.__class__ == PBXFileReference
-        else:
-          variant_ref = PBXFileReference({'name': variant_name,
-                                          'path': variant_path})
-          variant_group_ref.AppendChild(variant_ref)
-        # The caller is interested in the variant group, not the specific
-        # variant file.
-        file_ref = variant_group_ref
-      return file_ref
-    else:
-      # Hierarchical recursion.  Add or get a PBXGroup corresponding to the
-      # outermost path component, and then recurse into it, chopping off that
-      # path component.
-      next_dir = path_split[0]
-      group_ref = self.GetChildByPath(next_dir)
-      if group_ref != None:
-        assert group_ref.__class__ == PBXGroup
-      else:
-        group_ref = PBXGroup({'path': next_dir})
-        self.AppendChild(group_ref)
-      return group_ref.AddOrGetFileByPath(posixpath.sep.join(path_split[1:]),
-                                          hierarchical)
-
-  def AddOrGetVariantGroupByNameAndPath(self, name, path):
-    """Returns an existing or new PBXVariantGroup for name and path.
-
-    If a PBXVariantGroup identified by the name and path arguments is already
-    present as a child of this object, it is returned.  Otherwise, a new
-    PBXVariantGroup with the correct properties is created, added as a child,
-    and returned.
-
-    This method will generally be called by AddOrGetFileByPath, which knows
-    when to create a variant group based on the structure of the pathnames
-    passed to it.
-    """
-
-    key = (name, path)
-    if key in self._variant_children_by_name_and_path:
-      variant_group_ref = self._variant_children_by_name_and_path[key]
-      assert variant_group_ref.__class__ == PBXVariantGroup
-      return variant_group_ref
-
-    variant_group_properties = {'name': name}
-    if path != None:
-      variant_group_properties['path'] = path
-    variant_group_ref = PBXVariantGroup(variant_group_properties)
-    self.AppendChild(variant_group_ref)
-
-    return variant_group_ref
-
-  def TakeOverOnlyChild(self, recurse=False):
-    """If this PBXGroup has only one child and it's also a PBXGroup, take
-    it over by making all of its children this object's children.
-
-    This function will continue to take over only children when those children
-    are groups.  If there are three PBXGroups representing a, b, and c, with
-    c inside b and b inside a, and a and b have no other children, this will
-    result in a taking over both b and c, forming a PBXGroup for a/b/c.
-
-    If recurse is True, this function will recurse into children and ask them
-    to collapse themselves by taking over only children as well.  Assuming
-    an example hierarchy with files at a/b/c/d1, a/b/c/d2, and a/b/c/d3/e/f
-    (d1, d2, and f are files, the rest are groups), recursion will result in
-    a group for a/b/c containing a group for d3/e.
-    """
-
-    # At this stage, check that child class types are PBXGroup exactly,
-    # instead of using isinstance.  The only subclass of PBXGroup,
-    # PBXVariantGroup, should not participate in reparenting in the same way:
-    # reparenting by merging different object types would be wrong.
-    while len(self._properties['children']) == 1 and \
-          self._properties['children'][0].__class__ == PBXGroup:
-      # Loop to take over the innermost only-child group possible.
-
-      child = self._properties['children'][0]
-
-      # Assume the child's properties, including its children.  Save a copy
-      # of this object's old properties, because they'll still be needed.
-      # This object retains its existing id and parent attributes.
-      old_properties = self._properties
-      self._properties = child._properties
-      self._children_by_path = child._children_by_path
-
-      if not 'sourceTree' in self._properties or \
-         self._properties['sourceTree'] == '<group>':
-        # The child was relative to its parent.  Fix up the path.  Note that
-        # children with a sourceTree other than "<group>" are not relative to
-        # their parents, so no path fix-up is needed in that case.
-        if 'path' in old_properties:
-          if 'path' in self._properties:
-            # Both the original parent and child have paths set.
-            self._properties['path'] = posixpath.join(old_properties['path'],
-                                                      self._properties['path'])
-          else:
-            # Only the original parent has a path, use it.
-            self._properties['path'] = old_properties['path']
-        if 'sourceTree' in old_properties:
-          # The original parent had a sourceTree set, use it.
-          self._properties['sourceTree'] = old_properties['sourceTree']
-
-      # If the original parent had a name set, keep using it.  If the original
-      # parent didn't have a name but the child did, let the child's name
-      # live on.  If the name attribute seems unnecessary now, get rid of it.
-      if 'name' in old_properties and old_properties['name'] != None and \
-         old_properties['name'] != self.Name():
-        self._properties['name'] = old_properties['name']
-      if 'name' in self._properties and 'path' in self._properties and \
-         self._properties['name'] == self._properties['path']:
-        del self._properties['name']
-
-      # Notify all children of their new parent.
-      for child in self._properties['children']:
-        child.parent = self
-
-    # If asked to recurse, recurse.
-    if recurse:
-      for child in self._properties['children']:
-        if child.__class__ == PBXGroup:
-          child.TakeOverOnlyChild(recurse)
-
-  def SortGroup(self):
-    self._properties['children'] = \
-        sorted(self._properties['children'], cmp=lambda x,y: x.Compare(y))
-
-    # Recurse.
-    for child in self._properties['children']:
-      if isinstance(child, PBXGroup):
-        child.SortGroup()
-
-
-class XCFileLikeElement(XCHierarchicalElement):
-  # Abstract base for objects that can be used as the fileRef property of
-  # PBXBuildFile.
-
-  def PathHashables(self):
-    # A PBXBuildFile that refers to this object will call this method to
-    # obtain additional hashables specific to this XCFileLikeElement.  Don't
-    # just use this object's hashables, they're not specific and unique enough
-    # on their own (without access to the parent hashables.)  Instead, provide
-    # hashables that identify this object by path by getting its hashables as
-    # well as the hashables of ancestor XCHierarchicalElement objects.
-
-    hashables = []
-    xche = self
-    while xche != None and isinstance(xche, XCHierarchicalElement):
-      xche_hashables = xche.Hashables()
-      for index in xrange(0, len(xche_hashables)):
-        hashables.insert(index, xche_hashables[index])
-      xche = xche.parent
-    return hashables
-
-
-class XCContainerPortal(XCObject):
-  # Abstract base for objects that can be used as the containerPortal property
-  # of PBXContainerItemProxy.
-  pass
-
-
-class XCRemoteObject(XCObject):
-  # Abstract base for objects that can be used as the remoteGlobalIDString
-  # property of PBXContainerItemProxy.
-  pass
-
-
-class PBXFileReference(XCFileLikeElement, XCContainerPortal, XCRemoteObject):
-  _schema = XCFileLikeElement._schema.copy()
-  _schema.update({
-    'explicitFileType':  [0, str, 0, 0],
-    'lastKnownFileType': [0, str, 0, 0],
-    'name':              [0, str, 0, 0],
-    'path':              [0, str, 0, 1],
-  })
-
-  # Weird output rules for PBXFileReference.
-  _should_print_single_line = True
-  # super
-  _encode_transforms = XCFileLikeElement._alternate_encode_transforms
-
-  def __init__(self, properties=None, id=None, parent=None):
-    # super
-    XCFileLikeElement.__init__(self, properties, id, parent)
-    if 'path' in self._properties and self._properties['path'].endswith('/'):
-      self._properties['path'] = self._properties['path'][:-1]
-      is_dir = True
-    else:
-      is_dir = False
-
-    if 'path' in self._properties and \
-        not 'lastKnownFileType' in self._properties and \
-        not 'explicitFileType' in self._properties:
-      # TODO(mark): This is the replacement for a replacement for a quick hack.
-      # It is no longer incredibly sucky, but this list needs to be extended.
-      extension_map = {
-        'a':           'archive.ar',
-        'app':         'wrapper.application',
-        'bdic':        'file',
-        'bundle':      'wrapper.cfbundle',
-        'c':           'sourcecode.c.c',
-        'cc':          'sourcecode.cpp.cpp',
-        'cpp':         'sourcecode.cpp.cpp',
-        'css':         'text.css',
-        'cxx':         'sourcecode.cpp.cpp',
-        'dylib':       'compiled.mach-o.dylib',
-        'framework':   'wrapper.framework',
-        'h':           'sourcecode.c.h',
-        'hxx':         'sourcecode.cpp.h',
-        'icns':        'image.icns',
-        'java':        'sourcecode.java',
-        'js':          'sourcecode.javascript',
-        'm':           'sourcecode.c.objc',
-        'mm':          'sourcecode.cpp.objcpp',
-        'nib':         'wrapper.nib',
-        'o':           'compiled.mach-o.objfile',
-        'pdf':         'image.pdf',
-        'pl':          'text.script.perl',
-        'plist':       'text.plist.xml',
-        'pm':          'text.script.perl',
-        'png':         'image.png',
-        'py':          'text.script.python',
-        'r':           'sourcecode.rez',
-        'rez':         'sourcecode.rez',
-        's':           'sourcecode.asm',
-        'strings':     'text.plist.strings',
-        'ttf':         'file',
-        'xcconfig':    'text.xcconfig',
-        'xcdatamodel': 'wrapper.xcdatamodel',
-        'xib':         'file.xib',
-        'y':           'sourcecode.yacc',
-      }
-
-      if is_dir:
-        file_type = 'folder'
-      else:
-        basename = posixpath.basename(self._properties['path'])
-        (root, ext) = posixpath.splitext(basename)
-        # Check the map using a lowercase extension.
-        # TODO(mark): Maybe it should try with the original case first and fall
-        # back to lowercase, in case there are any instances where case
-        # matters.  There currently aren't.
-        if ext != '':
-          ext = ext[1:].lower()
-
-        # TODO(mark): "text" is the default value, but "file" is appropriate
-        # for unrecognized files not containing text.  Xcode seems to choose
-        # based on content.
-        file_type = extension_map.get(ext, 'text')
-
-      self._properties['lastKnownFileType'] = file_type
-
-
-class PBXVariantGroup(PBXGroup, XCFileLikeElement):
-  """PBXVariantGroup is used by Xcode to represent localizations."""
-  # No additions to the schema relative to PBXGroup.
-  pass
-
-
-# PBXReferenceProxy is also an XCFileLikeElement subclass.  It is defined below
-# because it uses PBXContainerItemProxy, defined below.
-
-
-class XCBuildConfiguration(XCObject):
-  _schema = XCObject._schema.copy()
-  _schema.update({
-    'baseConfigurationReference': [0, PBXFileReference, 0, 0],
-    'buildSettings':              [0, dict, 0, 1, {}],
-    'name':                       [0, str,  0, 1],
-  })
-
-  def HasBuildSetting(self, key):
-    return key in self._properties['buildSettings']
-
-  def GetBuildSetting(self, key):
-    return self._properties['buildSettings'][key]
-
-  def SetBuildSetting(self, key, value):
-    # TODO(mark): If a list, copy?
-    self._properties['buildSettings'][key] = value
-
-  def AppendBuildSetting(self, key, value):
-    if not key in self._properties['buildSettings']:
-      self._properties['buildSettings'][key] = []
-    self._properties['buildSettings'][key].append(value)
-
-  def DelBuildSetting(self, key):
-    if key in self._properties['buildSettings']:
-      del self._properties['buildSettings'][key]
-
-  def SetBaseConfiguration(self, value):
-    self._properties['baseConfigurationReference'] = value
-
-class XCConfigurationList(XCObject):
-  # _configs is the default list of configurations.
-  _configs = [ XCBuildConfiguration({'name': 'Debug'}),
-               XCBuildConfiguration({'name': 'Release'}) ]
-
-  _schema = XCObject._schema.copy()
-  _schema.update({
-    'buildConfigurations':           [1, XCBuildConfiguration, 1, 1, _configs],
-    'defaultConfigurationIsVisible': [0, int,                  0, 1, 1],
-    'defaultConfigurationName':      [0, str,                  0, 1, 'Release'],
-  })
-
-  def Name(self):
-    return 'Build configuration list for ' + \
-           self.parent.__class__.__name__ + ' "' + self.parent.Name() + '"'
-
-  def ConfigurationNamed(self, name):
-    """Convenience accessor to obtain an XCBuildConfiguration by name."""
-    for configuration in self._properties['buildConfigurations']:
-      if configuration._properties['name'] == name:
-        return configuration
-
-    raise KeyError, name
-
-  def DefaultConfiguration(self):
-    """Convenience accessor to obtain the default XCBuildConfiguration."""
-    return self.ConfigurationNamed(self._properties['defaultConfigurationName'])
-
-  def HasBuildSetting(self, key):
-    """Determines the state of a build setting in all XCBuildConfiguration
-    child objects.
-
-    If all child objects have key in their build settings, and the value is the
-    same in all child objects, returns 1.
-
-    If no child objects have the key in their build settings, returns 0.
-
-    If some, but not all, child objects have the key in their build settings,
-    or if any children have different values for the key, returns -1.
-    """
-
-    has = None
-    value = None
-    for configuration in self._properties['buildConfigurations']:
-      configuration_has = configuration.HasBuildSetting(key)
-      if has is None:
-        has = configuration_has
-      elif has != configuration_has:
-        return -1
-
-      if configuration_has:
-        configuration_value = configuration.GetBuildSetting(key)
-        if value is None:
-          value = configuration_value
-        elif value != configuration_value:
-          return -1
-
-    if not has:
-      return 0
-
-    return 1
-
-  def GetBuildSetting(self, key):
-    """Gets the build setting for key.
-
-    All child XCConfiguration objects must have the same value set for the
-    setting, or a ValueError will be raised.
-    """
-
-    # TODO(mark): This is wrong for build settings that are lists.  The list
-    # contents should be compared (and a list copy returned?)
-
-    value = None
-    for configuration in self._properties['buildConfigurations']:
-      configuration_value = configuration.GetBuildSetting(key)
-      if value is None:
-        value = configuration_value
-      else:
-        if value != configuration_value:
-          raise ValueError, 'Variant values for ' + key
-
-    return value
-
-  def SetBuildSetting(self, key, value):
-    """Sets the build setting for key to value in all child
-    XCBuildConfiguration objects.
-    """
-
-    for configuration in self._properties['buildConfigurations']:
-      configuration.SetBuildSetting(key, value)
-
-  def AppendBuildSetting(self, key, value):
-    """Appends value to the build setting for key, which is treated as a list,
-    in all child XCBuildConfiguration objects.
-    """
-
-    for configuration in self._properties['buildConfigurations']:
-      configuration.AppendBuildSetting(key, value)
-
-  def DelBuildSetting(self, key):
-    """Deletes the build setting key from all child XCBuildConfiguration
-    objects.
-    """
-
-    for configuration in self._properties['buildConfigurations']:
-      configuration.DelBuildSetting(key)
-
-  def SetBaseConfiguration(self, value):
-    """Sets the build configuration in all child XCBuildConfiguration objects.
-    """
-
-    for configuration in self._properties['buildConfigurations']:
-      configuration.SetBaseConfiguration(value)
-
-
-class PBXBuildFile(XCObject):
-  _schema = XCObject._schema.copy()
-  _schema.update({
-    'fileRef':  [0, XCFileLikeElement, 0, 1],
-    'settings': [0, str,               0, 0],  # hack, it's a dict
-  })
-
-  # Weird output rules for PBXBuildFile.
-  _should_print_single_line = True
-  _encode_transforms = XCObject._alternate_encode_transforms
-
-  def Name(self):
-    # Example: "main.cc in Sources"
-    return self._properties['fileRef'].Name() + ' in ' + self.parent.Name()
-
-  def Hashables(self):
-    # super
-    hashables = XCObject.Hashables(self)
-
-    # It is not sufficient to just rely on Name() to get the
-    # XCFileLikeElement's name, because that is not a complete pathname.
-    # PathHashables returns hashables unique enough that no two
-    # PBXBuildFiles should wind up with the same set of hashables, unless
-    # someone adds the same file multiple times to the same target.  That
-    # would be considered invalid anyway.
-    hashables.extend(self._properties['fileRef'].PathHashables())
-
-    return hashables
-
-
-class XCBuildPhase(XCObject):
-  """Abstract base for build phase classes.  Not represented in a project
-  file.
-
-  Attributes:
-    _files_by_path: A dict mapping each path of a child in the files list by
-      path (keys) to the corresponding PBXBuildFile children (values).
-    _files_by_xcfilelikeelement: A dict mapping each XCFileLikeElement (keys)
-      to the corresponding PBXBuildFile children (values).
-  """
-
-  # TODO(mark): Some build phase types, like PBXShellScriptBuildPhase, don't
-  # actually have a "files" list.  XCBuildPhase should not have "files" but
-  # another abstract subclass of it should provide this, and concrete build
-  # phase types that do have "files" lists should be derived from that new
-  # abstract subclass.  XCBuildPhase should only provide buildActionMask and
-  # runOnlyForDeploymentPostprocessing, and not files or the various
-  # file-related methods and attributes.
-
-  _schema = XCObject._schema.copy()
-  _schema.update({
-    'buildActionMask':                    [0, int,          0, 1, 0x7fffffff],
-    'files':                              [1, PBXBuildFile, 1, 1, []],
-    'runOnlyForDeploymentPostprocessing': [0, int,          0, 1, 0],
-  })
-
-  def __init__(self, properties=None, id=None, parent=None):
-    # super
-    XCObject.__init__(self, properties, id, parent)
-
-    self._files_by_path = {}
-    self._files_by_xcfilelikeelement = {}
-    for pbxbuildfile in self._properties.get('files', []):
-      self._AddBuildFileToDicts(pbxbuildfile)
-
-  def FileGroup(self, path):
-    # Subclasses must override this by returning a two-element tuple.  The
-    # first item in the tuple should be the PBXGroup to which "path" should be
-    # added, either as a child or deeper descendant.  The second item should
-    # be a boolean indicating whether files should be added into hierarchical
-    # groups or one single flat group.
-    raise NotImplementedError, \
-          self.__class__.__name__ + ' must implement FileGroup'
-
-  def _AddPathToDict(self, pbxbuildfile, path):
-    """Adds path to the dict tracking paths belonging to this build phase.
-
-    If the path is already a member of this build phase, raises an exception.
-    """
-
-    if path in self._files_by_path:
-      raise ValueError, 'Found multiple build files with path ' + path
-    self._files_by_path[path] = pbxbuildfile
-
-  def _AddBuildFileToDicts(self, pbxbuildfile, path=None):
-    """Maintains the _files_by_path and _files_by_xcfilelikeelement dicts.
-
-    If path is specified, then it is the path that is being added to the
-    phase, and pbxbuildfile must contain either a PBXFileReference directly
-    referencing that path, or it must contain a PBXVariantGroup that itself
-    contains a PBXFileReference referencing the path.
-
-    If path is not specified, either the PBXFileReference's path or the paths
-    of all children of the PBXVariantGroup are taken as being added to the
-    phase.
-
-    If the path is already present in the phase, raises an exception.
-
-    If the PBXFileReference or PBXVariantGroup referenced by pbxbuildfile
-    are already present in the phase, referenced by a different PBXBuildFile
-    object, raises an exception.  This does not raise an exception when
-    a PBXFileReference or PBXVariantGroup reappear and are referenced by the
-    same PBXBuildFile that has already introduced them, because in the case
-    of PBXVariantGroup objects, they may correspond to multiple paths that are
-    not all added simultaneously.  When this situation occurs, the path needs
-    to be added to _files_by_path, but nothing needs to change in
-    _files_by_xcfilelikeelement, and the caller should have avoided adding
-    the PBXBuildFile if it is already present in the list of children.
-    """
-
-    xcfilelikeelement = pbxbuildfile._properties['fileRef']
-
-    paths = []
-    if path != None:
-      # It's best when the caller provides the path.
-      if isinstance(xcfilelikeelement, PBXVariantGroup):
-        paths.append(path)
-    else:
-      # If the caller didn't provide a path, there can be either multiple
-      # paths (PBXVariantGroup) or one.
-      if isinstance(xcfilelikeelement, PBXVariantGroup):
-        for variant in xcfilelikeelement._properties['children']:
-          paths.append(variant.FullPath())
-      else:
-        paths.append(xcfilelikeelement.FullPath())
-
-    # Add the paths first, because if something's going to raise, the
-    # messages provided by _AddPathToDict are more useful owing to its
-    # having access to a real pathname and not just an object's Name().
-    for a_path in paths:
-      self._AddPathToDict(pbxbuildfile, a_path)
-
-    # If another PBXBuildFile references this XCFileLikeElement, there's a
-    # problem.
-    if xcfilelikeelement in self._files_by_xcfilelikeelement and \
-       self._files_by_xcfilelikeelement[xcfilelikeelement] != pbxbuildfile:
-      raise ValueError, 'Found multiple build files for ' + \
-                        xcfilelikeelement.Name()
-    self._files_by_xcfilelikeelement[xcfilelikeelement] = pbxbuildfile
-
-  def AppendBuildFile(self, pbxbuildfile, path=None):
-    # Callers should use this instead of calling
-    # AppendProperty('files', pbxbuildfile) directly because this function
-    # maintains the object's dicts.  Better yet, callers can just call AddFile
-    # with a pathname and not worry about building their own PBXBuildFile
-    # objects.
-    self.AppendProperty('files', pbxbuildfile)
-    self._AddBuildFileToDicts(pbxbuildfile, path)
-
-  def AddFile(self, path, settings=None):
-    (file_group, hierarchical) = self.FileGroup(path)
-    file_ref = file_group.AddOrGetFileByPath(path, hierarchical)
-
-    if file_ref in self._files_by_xcfilelikeelement and \
-       isinstance(file_ref, PBXVariantGroup):
-      # There's already a PBXBuildFile in this phase corresponding to the
-      # PBXVariantGroup.  path just provides a new variant that belongs to
-      # the group.  Add the path to the dict.
-      pbxbuildfile = self._files_by_xcfilelikeelement[file_ref]
-      self._AddBuildFileToDicts(pbxbuildfile, path)
-    else:
-      # Add a new PBXBuildFile to get file_ref into the phase.
-      if settings is None:
-        pbxbuildfile = PBXBuildFile({'fileRef': file_ref})
-      else:
-        pbxbuildfile = PBXBuildFile({'fileRef': file_ref, 'settings': settings})
-      self.AppendBuildFile(pbxbuildfile, path)
-
-
-class PBXHeadersBuildPhase(XCBuildPhase):
-  # No additions to the schema relative to XCBuildPhase.
-
-  def Name(self):
-    return 'Headers'
-
-  def FileGroup(self, path):
-    return self.PBXProjectAncestor().RootGroupForPath(path)
-
-
-class PBXResourcesBuildPhase(XCBuildPhase):
-  # No additions to the schema relative to XCBuildPhase.
-
-  def Name(self):
-    return 'Resources'
-
-  def FileGroup(self, path):
-    return self.PBXProjectAncestor().RootGroupForPath(path)
-
-
-class PBXSourcesBuildPhase(XCBuildPhase):
-  # No additions to the schema relative to XCBuildPhase.
-
-  def Name(self):
-    return 'Sources'
-
-  def FileGroup(self, path):
-    return self.PBXProjectAncestor().RootGroupForPath(path)
-
-
-class PBXFrameworksBuildPhase(XCBuildPhase):
-  # No additions to the schema relative to XCBuildPhase.
-
-  def Name(self):
-    return 'Frameworks'
-
-  def FileGroup(self, path):
-    (root, ext) = posixpath.splitext(path)
-    if ext != '':
-      ext = ext[1:].lower()
-    if ext == 'o':
-      # .o files are added to Xcode Frameworks phases, but conceptually aren't
-      # frameworks, they're more like sources or intermediates. Redirect them
-      # to show up in one of those other groups.
-      return self.PBXProjectAncestor().RootGroupForPath(path)
-    else:
-      return (self.PBXProjectAncestor().FrameworksGroup(), False)
-
-
-class PBXShellScriptBuildPhase(XCBuildPhase):
-  _schema = XCBuildPhase._schema.copy()
-  _schema.update({
-    'inputPaths':       [1, str, 0, 1, []],
-    'name':             [0, str, 0, 0],
-    'outputPaths':      [1, str, 0, 1, []],
-    'shellPath':        [0, str, 0, 1, '/bin/sh'],
-    'shellScript':      [0, str, 0, 1],
-    'showEnvVarsInLog': [0, int, 0, 0],
-  })
-
-  def Name(self):
-    if 'name' in self._properties:
-      return self._properties['name']
-
-    return 'ShellScript'
-
-
-class PBXCopyFilesBuildPhase(XCBuildPhase):
-  _schema = XCBuildPhase._schema.copy()
-  _schema.update({
-    'dstPath':          [0, str, 0, 1],
-    'dstSubfolderSpec': [0, int, 0, 1],
-    'name':             [0, str, 0, 0],
-  })
-
-  # path_tree_re matches "$(DIR)/path" or just "$(DIR)".  Match group 1 is
-  # "DIR", match group 3 is "path" or None.
-  path_tree_re = re.compile('^\\$\\((.*)\\)(/(.*)|)$')
-
-  # path_tree_to_subfolder maps names of Xcode variables to the associated
-  # dstSubfolderSpec property value used in a PBXCopyFilesBuildPhase object.
-  path_tree_to_subfolder = {
-    'BUILT_PRODUCTS_DIR': 16,  # Products Directory
-    # Other types that can be chosen via the Xcode UI.
-    # TODO(mark): Map Xcode variable names to these.
-    # : 1,  # Wrapper
-    # : 6,  # Executables: 6
-    # : 7,  # Resources
-    # : 15,  # Java Resources
-    # : 10,  # Frameworks
-    # : 11,  # Shared Frameworks
-    # : 12,  # Shared Support
-    # : 13,  # PlugIns
-  }
-
-  def Name(self):
-    if 'name' in self._properties:
-      return self._properties['name']
-
-    return 'CopyFiles'
-
-  def FileGroup(self, path):
-    return self.PBXProjectAncestor().RootGroupForPath(path)
-
-  def SetDestination(self, path):
-    """Set the dstSubfolderSpec and dstPath properties from path.
-
-    path may be specified in the same notation used for XCHierarchicalElements,
-    specifically, "$(DIR)/path".
-    """
-
-    path_tree_match = self.path_tree_re.search(path)
-    if path_tree_match:
-      # Everything else needs to be relative to an Xcode variable.
-      path_tree = path_tree_match.group(1)
-      relative_path = path_tree_match.group(3)
-
-      if path_tree in self.path_tree_to_subfolder:
-        subfolder = self.path_tree_to_subfolder[path_tree]
-        if relative_path is None:
-          relative_path = ''
-      else:
-        # The path starts with an unrecognized Xcode variable
-        # name like $(SRCROOT).  Xcode will still handle this
-        # as an "absolute path" that starts with the variable.
-        subfolder = 0
-        relative_path = path
-    elif path.startswith('/'):
-      # Special case.  Absolute paths are in dstSubfolderSpec 0.
-      subfolder = 0
-      relative_path = path[1:]
-    else:
-      raise ValueError, 'Can\'t use path %s in a %s' % \
-                        (path, self.__class__.__name__)
-
-    self._properties['dstPath'] = relative_path
-    self._properties['dstSubfolderSpec'] = subfolder
-
-
-class PBXBuildRule(XCObject):
-  _schema = XCObject._schema.copy()
-  _schema.update({
-    'compilerSpec': [0, str, 0, 1],
-    'filePatterns': [0, str, 0, 0],
-    'fileType':     [0, str, 0, 1],
-    'isEditable':   [0, int, 0, 1, 1],
-    'outputFiles':  [1, str, 0, 1, []],
-    'script':       [0, str, 0, 0],
-  })
-
-  def Name(self):
-    # Not very inspired, but it's what Xcode uses.
-    return self.__class__.__name__
-
-  def Hashables(self):
-    # super
-    hashables = XCObject.Hashables(self)
-
-    # Use the hashables of the weak objects that this object refers to.
-    hashables.append(self._properties['fileType'])
-    if 'filePatterns' in self._properties:
-      hashables.append(self._properties['filePatterns'])
-    return hashables
-
-
-class PBXContainerItemProxy(XCObject):
-  # When referencing an item in this project file, containerPortal is the
-  # PBXProject root object of this project file.  When referencing an item in
-  # another project file, containerPortal is a PBXFileReference identifying
-  # the other project file.
-  #
-  # When serving as a proxy to an XCTarget (in this project file or another),
-  # proxyType is 1.  When serving as a proxy to a PBXFileReference (in another
-  # project file), proxyType is 2.  Type 2 is used for references to the
-  # producs of the other project file's targets.
-  #
-  # Xcode is weird about remoteGlobalIDString.  Usually, it's printed without
-  # a comment, indicating that it's tracked internally simply as a string, but
-  # sometimes it's printed with a comment (usually when the object is initially
-  # created), indicating that it's tracked as a project file object at least
-  # sometimes.  This module always tracks it as an object, but contains a hack
-  # to prevent it from printing the comment in the project file output.  See
-  # _XCKVPrint.
-  _schema = XCObject._schema.copy()
-  _schema.update({
-    'containerPortal':      [0, XCContainerPortal, 0, 1],
-    'proxyType':            [0, int,               0, 1],
-    'remoteGlobalIDString': [0, XCRemoteObject,    0, 1],
-    'remoteInfo':           [0, str,               0, 1],
-  })
-
-  def __repr__(self):
-    props = self._properties
-    name = '%s.gyp:%s' % (props['containerPortal'].Name(), props['remoteInfo'])
-    return '<%s %r at 0x%x>' % (self.__class__.__name__, name, id(self))
-
-  def Name(self):
-    # Admittedly not the best name, but it's what Xcode uses.
-    return self.__class__.__name__
-
-  def Hashables(self):
-    # super
-    hashables = XCObject.Hashables(self)
-
-    # Use the hashables of the weak objects that this object refers to.
-    hashables.extend(self._properties['containerPortal'].Hashables())
-    hashables.extend(self._properties['remoteGlobalIDString'].Hashables())
-    return hashables
-
-
-class PBXTargetDependency(XCObject):
-  # The "target" property accepts an XCTarget object, and obviously not
-  # NoneType.  But XCTarget is defined below, so it can't be put into the
-  # schema yet.  The definition of PBXTargetDependency can't be moved below
-  # XCTarget because XCTarget's own schema references PBXTargetDependency.
-  # Python doesn't deal well with this circular relationship, and doesn't have
-  # a real way to do forward declarations.  To work around, the type of
-  # the "target" property is reset below, after XCTarget is defined.
-  #
-  # At least one of "name" and "target" is required.
-  _schema = XCObject._schema.copy()
-  _schema.update({
-    'name':        [0, str,                   0, 0],
-    'target':      [0, None.__class__,        0, 0],
-    'targetProxy': [0, PBXContainerItemProxy, 1, 1],
-  })
-
-  def __repr__(self):
-    name = self._properties.get('name') or self._properties['target'].Name()
-    return '<%s %r at 0x%x>' % (self.__class__.__name__, name, id(self))
-
-  def Name(self):
-    # Admittedly not the best name, but it's what Xcode uses.
-    return self.__class__.__name__
-
-  def Hashables(self):
-    # super
-    hashables = XCObject.Hashables(self)
-
-    # Use the hashables of the weak objects that this object refers to.
-    hashables.extend(self._properties['targetProxy'].Hashables())
-    return hashables
-
-
-class PBXReferenceProxy(XCFileLikeElement):
-  _schema = XCFileLikeElement._schema.copy()
-  _schema.update({
-    'fileType':  [0, str,                   0, 1],
-    'path':      [0, str,                   0, 1],
-    'remoteRef': [0, PBXContainerItemProxy, 1, 1],
-  })
-
-
-class XCTarget(XCRemoteObject):
-  # An XCTarget is really just an XCObject, the XCRemoteObject thing is just
-  # to allow PBXProject to be used in the remoteGlobalIDString property of
-  # PBXContainerItemProxy.
-  #
-  # Setting a "name" property at instantiation may also affect "productName",
-  # which may in turn affect the "PRODUCT_NAME" build setting in children of
-  # "buildConfigurationList".  See __init__ below.
-  _schema = XCRemoteObject._schema.copy()
-  _schema.update({
-    'buildConfigurationList': [0, XCConfigurationList, 1, 1,
-                               XCConfigurationList()],
-    'buildPhases':            [1, XCBuildPhase,        1, 1, []],
-    'dependencies':           [1, PBXTargetDependency, 1, 1, []],
-    'name':                   [0, str,                 0, 1],
-    'productName':            [0, str,                 0, 1],
-  })
-
-  def __init__(self, properties=None, id=None, parent=None,
-               force_outdir=None, force_prefix=None, force_extension=None):
-    # super
-    XCRemoteObject.__init__(self, properties, id, parent)
-
-    # Set up additional defaults not expressed in the schema.  If a "name"
-    # property was supplied, set "productName" if it is not present.  Also set
-    # the "PRODUCT_NAME" build setting in each configuration, but only if
-    # the setting is not present in any build configuration.
-    if 'name' in self._properties:
-      if not 'productName' in self._properties:
-        self.SetProperty('productName', self._properties['name'])
-
-    if 'productName' in self._properties:
-      if 'buildConfigurationList' in self._properties:
-        configs = self._properties['buildConfigurationList']
-        if configs.HasBuildSetting('PRODUCT_NAME') == 0:
-          configs.SetBuildSetting('PRODUCT_NAME',
-                                  self._properties['productName'])
-
-  def AddDependency(self, other):
-    pbxproject = self.PBXProjectAncestor()
-    other_pbxproject = other.PBXProjectAncestor()
-    if pbxproject == other_pbxproject:
-      # Add a dependency to another target in the same project file.
-      container = PBXContainerItemProxy({'containerPortal':      pbxproject,
-                                         'proxyType':            1,
-                                         'remoteGlobalIDString': other,
-                                         'remoteInfo':           other.Name()})
-      dependency = PBXTargetDependency({'target':      other,
-                                        'targetProxy': container})
-      self.AppendProperty('dependencies', dependency)
-    else:
-      # Add a dependency to a target in a different project file.
-      other_project_ref = \
-          pbxproject.AddOrGetProjectReference(other_pbxproject)[1]
-      container = PBXContainerItemProxy({
-            'containerPortal':      other_project_ref,
-            'proxyType':            1,
-            'remoteGlobalIDString': other,
-            'remoteInfo':           other.Name(),
-          })
-      dependency = PBXTargetDependency({'name':        other.Name(),
-                                        'targetProxy': container})
-      self.AppendProperty('dependencies', dependency)
-
-  # Proxy all of these through to the build configuration list.
-
-  def ConfigurationNamed(self, name):
-    return self._properties['buildConfigurationList'].ConfigurationNamed(name)
-
-  def DefaultConfiguration(self):
-    return self._properties['buildConfigurationList'].DefaultConfiguration()
-
-  def HasBuildSetting(self, key):
-    return self._properties['buildConfigurationList'].HasBuildSetting(key)
-
-  def GetBuildSetting(self, key):
-    return self._properties['buildConfigurationList'].GetBuildSetting(key)
-
-  def SetBuildSetting(self, key, value):
-    return self._properties['buildConfigurationList'].SetBuildSetting(key, \
-                                                                      value)
-
-  def AppendBuildSetting(self, key, value):
-    return self._properties['buildConfigurationList'].AppendBuildSetting(key, \
-                                                                         value)
-
-  def DelBuildSetting(self, key):
-    return self._properties['buildConfigurationList'].DelBuildSetting(key)
-
-
-# Redefine the type of the "target" property.  See PBXTargetDependency._schema
-# above.
-PBXTargetDependency._schema['target'][1] = XCTarget
-
-
-class PBXNativeTarget(XCTarget):
-  # buildPhases is overridden in the schema to be able to set defaults.
-  #
-  # NOTE: Contrary to most objects, it is advisable to set parent when
-  # constructing PBXNativeTarget.  A parent of an XCTarget must be a PBXProject
-  # object.  A parent reference is required for a PBXNativeTarget during
-  # construction to be able to set up the target defaults for productReference,
-  # because a PBXBuildFile object must be created for the target and it must
-  # be added to the PBXProject's mainGroup hierarchy.
-  _schema = XCTarget._schema.copy()
-  _schema.update({
-    'buildPhases':      [1, XCBuildPhase,     1, 1,
-                         [PBXSourcesBuildPhase(), PBXFrameworksBuildPhase()]],
-    'buildRules':       [1, PBXBuildRule,     1, 1, []],
-    'productReference': [0, PBXFileReference, 0, 1],
-    'productType':      [0, str,              0, 1],
-  })
-
-  # Mapping from Xcode product-types to settings.  The settings are:
-  #  filetype : used for explicitFileType in the project file
-  #  prefix : the prefix for the file name
-  #  suffix : the suffix for the filen ame
-  _product_filetypes = {
-    'com.apple.product-type.application':     ['wrapper.application',
-                                               '', '.app'],
-    'com.apple.product-type.bundle':          ['wrapper.cfbundle',
-                                               '', '.bundle'],
-    'com.apple.product-type.framework':       ['wrapper.framework',
-                                               '', '.framework'],
-    'com.apple.product-type.library.dynamic': ['compiled.mach-o.dylib',
-                                               'lib', '.dylib'],
-    'com.apple.product-type.library.static':  ['archive.ar',
-                                               'lib', '.a'],
-    'com.apple.product-type.tool':            ['compiled.mach-o.executable',
-                                               '', ''],
-    'com.googlecode.gyp.xcode.bundle':        ['compiled.mach-o.dylib',
-                                               '', '.so'],
-  }
-
-  def __init__(self, properties=None, id=None, parent=None,
-               force_outdir=None, force_prefix=None, force_extension=None):
-    # super
-    XCTarget.__init__(self, properties, id, parent)
-
-    if 'productName' in self._properties and \
-       'productType' in self._properties and \
-       not 'productReference' in self._properties and \
-       self._properties['productType'] in self._product_filetypes:
-      products_group = None
-      pbxproject = self.PBXProjectAncestor()
-      if pbxproject != None:
-        products_group = pbxproject.ProductsGroup()
-
-      if products_group != None:
-        (filetype, prefix, suffix) = \
-            self._product_filetypes[self._properties['productType']]
-        # Xcode does not have a distinct type for loadable modules that are
-        # pure BSD targets (not in a bundle wrapper). GYP allows such modules
-        # to be specified by setting a target type to loadable_module without
-        # having mac_bundle set. These are mapped to the pseudo-product type
-        # com.googlecode.gyp.xcode.bundle.
-        #
-        # By picking up this special type and converting it to a dynamic
-        # library (com.apple.product-type.library.dynamic) with fix-ups,
-        # single-file loadable modules can be produced.
-        #
-        # MACH_O_TYPE is changed to mh_bundle to produce the proper file type
-        # (as opposed to mh_dylib). In order for linking to succeed,
-        # DYLIB_CURRENT_VERSION and DYLIB_COMPATIBILITY_VERSION must be
-        # cleared. They are meaningless for type mh_bundle.
-        #
-        # Finally, the .so extension is forcibly applied over the default
-        # (.dylib), unless another forced extension is already selected.
-        # .dylib is plainly wrong, and .bundle is used by loadable_modules in
-        # bundle wrappers (com.apple.product-type.bundle). .so seems an odd
-        # choice because it's used as the extension on many other systems that
-        # don't distinguish between linkable shared libraries and non-linkable
-        # loadable modules, but there's precedent: Python loadable modules on
-        # Mac OS X use an .so extension.
-        if self._properties['productType'] == 'com.googlecode.gyp.xcode.bundle':
-          self._properties['productType'] = \
-              'com.apple.product-type.library.dynamic'
-          self.SetBuildSetting('MACH_O_TYPE', 'mh_bundle')
-          self.SetBuildSetting('DYLIB_CURRENT_VERSION', '')
-          self.SetBuildSetting('DYLIB_COMPATIBILITY_VERSION', '')
-          if force_extension is None:
-            force_extension = suffix[1:]
-
-        if force_extension is not None:
-          # If it's a wrapper (bundle), set WRAPPER_EXTENSION.
-          if filetype.startswith('wrapper.'):
-            self.SetBuildSetting('WRAPPER_EXTENSION', force_extension)
-          else:
-            # Extension override.
-            suffix = '.' + force_extension
-            self.SetBuildSetting('EXECUTABLE_EXTENSION', force_extension)
-
-          if filetype.startswith('compiled.mach-o.executable'):
-            product_name = self._properties['productName']
-            product_name += suffix
-            suffix = ''
-            self.SetProperty('productName', product_name)
-            self.SetBuildSetting('PRODUCT_NAME', product_name)
-
-        # Xcode handles most prefixes based on the target type, however there
-        # are exceptions.  If a "BSD Dynamic Library" target is added in the
-        # Xcode UI, Xcode sets EXECUTABLE_PREFIX.  This check duplicates that
-        # behavior.
-        if force_prefix is not None:
-          prefix = force_prefix
-        if filetype.startswith('wrapper.'):
-          self.SetBuildSetting('WRAPPER_PREFIX', prefix)
-        else:
-          self.SetBuildSetting('EXECUTABLE_PREFIX', prefix)
-
-        if force_outdir is not None:
-          self.SetBuildSetting('TARGET_BUILD_DIR', force_outdir)
-
-        # TODO(tvl): Remove the below hack.
-        #    http://code.google.com/p/gyp/issues/detail?id=122
-
-        # Some targets include the prefix in the target_name.  These targets
-        # really should just add a product_name setting that doesn't include
-        # the prefix.  For example:
-        #  target_name = 'libevent', product_name = 'event'
-        # This check cleans up for them.
-        product_name = self._properties['productName']
-        prefix_len = len(prefix)
-        if prefix_len and (product_name[:prefix_len] == prefix):
-          product_name = product_name[prefix_len:]
-          self.SetProperty('productName', product_name)
-          self.SetBuildSetting('PRODUCT_NAME', product_name)
-
-        ref_props = {
-          'explicitFileType': filetype,
-          'includeInIndex':   0,
-          'path':             prefix + product_name + suffix,
-          'sourceTree':       'BUILT_PRODUCTS_DIR',
-        }
-        file_ref = PBXFileReference(ref_props)
-        products_group.AppendChild(file_ref)
-        self.SetProperty('productReference', file_ref)
-
-  def GetBuildPhaseByType(self, type):
-    if not 'buildPhases' in self._properties:
-      return None
-
-    the_phase = None
-    for phase in self._properties['buildPhases']:
-      if isinstance(phase, type):
-        # Some phases may be present in multiples in a well-formed project file,
-        # but phases like PBXSourcesBuildPhase may only be present singly, and
-        # this function is intended as an aid to GetBuildPhaseByType.  Loop
-        # over the entire list of phases and assert if more than one of the
-        # desired type is found.
-        assert the_phase is None
-        the_phase = phase
-
-    return the_phase
-
-  def HeadersPhase(self):
-    headers_phase = self.GetBuildPhaseByType(PBXHeadersBuildPhase)
-    if headers_phase is None:
-      headers_phase = PBXHeadersBuildPhase()
-
-      # The headers phase should come before the resources, sources, and
-      # frameworks phases, if any.
-      insert_at = len(self._properties['buildPhases'])
-      for index in xrange(0, len(self._properties['buildPhases'])):
-        phase = self._properties['buildPhases'][index]
-        if isinstance(phase, PBXResourcesBuildPhase) or \
-           isinstance(phase, PBXSourcesBuildPhase) or \
-           isinstance(phase, PBXFrameworksBuildPhase):
-          insert_at = index
-          break
-
-      self._properties['buildPhases'].insert(insert_at, headers_phase)
-      headers_phase.parent = self
-
-    return headers_phase
-
-  def ResourcesPhase(self):
-    resources_phase = self.GetBuildPhaseByType(PBXResourcesBuildPhase)
-    if resources_phase is None:
-      resources_phase = PBXResourcesBuildPhase()
-
-      # The resources phase should come before the sources and frameworks
-      # phases, if any.
-      insert_at = len(self._properties['buildPhases'])
-      for index in xrange(0, len(self._properties['buildPhases'])):
-        phase = self._properties['buildPhases'][index]
-        if isinstance(phase, PBXSourcesBuildPhase) or \
-           isinstance(phase, PBXFrameworksBuildPhase):
-          insert_at = index
-          break
-
-      self._properties['buildPhases'].insert(insert_at, resources_phase)
-      resources_phase.parent = self
-
-    return resources_phase
-
-  def SourcesPhase(self):
-    sources_phase = self.GetBuildPhaseByType(PBXSourcesBuildPhase)
-    if sources_phase is None:
-      sources_phase = PBXSourcesBuildPhase()
-      self.AppendProperty('buildPhases', sources_phase)
-
-    return sources_phase
-
-  def FrameworksPhase(self):
-    frameworks_phase = self.GetBuildPhaseByType(PBXFrameworksBuildPhase)
-    if frameworks_phase is None:
-      frameworks_phase = PBXFrameworksBuildPhase()
-      self.AppendProperty('buildPhases', frameworks_phase)
-
-    return frameworks_phase
-
-  def AddDependency(self, other):
-    # super
-    XCTarget.AddDependency(self, other)
-
-    static_library_type = 'com.apple.product-type.library.static'
-    shared_library_type = 'com.apple.product-type.library.dynamic'
-    framework_type = 'com.apple.product-type.framework'
-    if isinstance(other, PBXNativeTarget) and \
-       'productType' in self._properties and \
-       self._properties['productType'] != static_library_type and \
-       'productType' in other._properties and \
-       (other._properties['productType'] == static_library_type or \
-        ((other._properties['productType'] == shared_library_type or \
-          other._properties['productType'] == framework_type) and \
-         ((not other.HasBuildSetting('MACH_O_TYPE')) or
-          other.GetBuildSetting('MACH_O_TYPE') != 'mh_bundle'))):
-
-      file_ref = other.GetProperty('productReference')
-
-      pbxproject = self.PBXProjectAncestor()
-      other_pbxproject = other.PBXProjectAncestor()
-      if pbxproject != other_pbxproject:
-        other_project_product_group = \
-            pbxproject.AddOrGetProjectReference(other_pbxproject)[0]
-        file_ref = other_project_product_group.GetChildByRemoteObject(file_ref)
-
-      self.FrameworksPhase().AppendProperty('files',
-                                            PBXBuildFile({'fileRef': file_ref}))
-
-
-class PBXAggregateTarget(XCTarget):
-  pass
-
-
-class PBXProject(XCContainerPortal):
-  # A PBXProject is really just an XCObject, the XCContainerPortal thing is
-  # just to allow PBXProject to be used in the containerPortal property of
-  # PBXContainerItemProxy.
-  """
-
-  Attributes:
-    path: "sample.xcodeproj".  TODO(mark) Document me!
-    _other_pbxprojects: A dictionary, keyed by other PBXProject objects.  Each
-                        value is a reference to the dict in the
-                        projectReferences list associated with the keyed
-                        PBXProject.
-  """
-
-  _schema = XCContainerPortal._schema.copy()
-  _schema.update({
-    'attributes':             [0, dict,                0, 0],
-    'buildConfigurationList': [0, XCConfigurationList, 1, 1,
-                               XCConfigurationList()],
-    'compatibilityVersion':   [0, str,                 0, 1, 'Xcode 3.2'],
-    'hasScannedForEncodings': [0, int,                 0, 1, 1],
-    'mainGroup':              [0, PBXGroup,            1, 1, PBXGroup()],
-    'projectDirPath':         [0, str,                 0, 1, ''],
-    'projectReferences':      [1, dict,                0, 0],
-    'projectRoot':            [0, str,                 0, 1, ''],
-    'targets':                [1, XCTarget,            1, 1, []],
-  })
-
-  def __init__(self, properties=None, id=None, parent=None, path=None):
-    self.path = path
-    self._other_pbxprojects = {}
-    # super
-    return XCContainerPortal.__init__(self, properties, id, parent)
-
-  def Name(self):
-    name = self.path
-    if name[-10:] == '.xcodeproj':
-      name = name[:-10]
-    return posixpath.basename(name)
-
-  def Path(self):
-    return self.path
-
-  def Comment(self):
-    return 'Project object'
-
-  def Children(self):
-    # super
-    children = XCContainerPortal.Children(self)
-
-    # Add children that the schema doesn't know about.  Maybe there's a more
-    # elegant way around this, but this is the only case where we need to own
-    # objects in a dictionary (that is itself in a list), and three lines for
-    # a one-off isn't that big a deal.
-    if 'projectReferences' in self._properties:
-      for reference in self._properties['projectReferences']:
-        children.append(reference['ProductGroup'])
-
-    return children
-
-  def PBXProjectAncestor(self):
-    return self
-
-  def _GroupByName(self, name):
-    if not 'mainGroup' in self._properties:
-      self.SetProperty('mainGroup', PBXGroup())
-
-    main_group = self._properties['mainGroup']
-    group = main_group.GetChildByName(name)
-    if group is None:
-      group = PBXGroup({'name': name})
-      main_group.AppendChild(group)
-
-    return group
-
-  # SourceGroup and ProductsGroup are created by default in Xcode's own
-  # templates.
-  def SourceGroup(self):
-    return self._GroupByName('Source')
-
-  def ProductsGroup(self):
-    return self._GroupByName('Products')
-
-  # IntermediatesGroup is used to collect source-like files that are generated
-  # by rules or script phases and are placed in intermediate directories such
-  # as DerivedSources.
-  def IntermediatesGroup(self):
-    return self._GroupByName('Intermediates')
-
-  # FrameworksGroup and ProjectsGroup are top-level groups used to collect
-  # frameworks and projects.
-  def FrameworksGroup(self):
-    return self._GroupByName('Frameworks')
-
-  def ProjectsGroup(self):
-    return self._GroupByName('Projects')
-
-  def RootGroupForPath(self, path):
-    """Returns a PBXGroup child of this object to which path should be added.
-
-    This method is intended to choose between SourceGroup and
-    IntermediatesGroup on the basis of whether path is present in a source
-    directory or an intermediates directory.  For the purposes of this
-    determination, any path located within a derived file directory such as
-    PROJECT_DERIVED_FILE_DIR is treated as being in an intermediates
-    directory.
-
-    The returned value is a two-element tuple.  The first element is the
-    PBXGroup, and the second element specifies whether that group should be
-    organized hierarchically (True) or as a single flat list (False).
-    """
-
-    # TODO(mark): make this a class variable and bind to self on call?
-    # Also, this list is nowhere near exhaustive.
-    # INTERMEDIATE_DIR and SHARED_INTERMEDIATE_DIR are used by
-    # gyp.generator.xcode.  There should probably be some way for that module
-    # to push the names in, rather than having to hard-code them here.
-    source_tree_groups = {
-      'DERIVED_FILE_DIR':         (self.IntermediatesGroup, True),
-      'INTERMEDIATE_DIR':         (self.IntermediatesGroup, True),
-      'PROJECT_DERIVED_FILE_DIR': (self.IntermediatesGroup, True),
-      'SHARED_INTERMEDIATE_DIR':  (self.IntermediatesGroup, True),
-    }
-
-    (source_tree, path) = SourceTreeAndPathFromPath(path)
-    if source_tree != None and source_tree in source_tree_groups:
-      (group_func, hierarchical) = source_tree_groups[source_tree]
-      group = group_func()
-      return (group, hierarchical)
-
-    # TODO(mark): make additional choices based on file extension.
-
-    return (self.SourceGroup(), True)
-
-  def AddOrGetFileInRootGroup(self, path):
-    """Returns a PBXFileReference corresponding to path in the correct group
-    according to RootGroupForPath's heuristics.
-
-    If an existing PBXFileReference for path exists, it will be returned.
-    Otherwise, one will be created and returned.
-    """
-
-    (group, hierarchical) = self.RootGroupForPath(path)
-    return group.AddOrGetFileByPath(path, hierarchical)
-
-  def RootGroupsTakeOverOnlyChildren(self, recurse=False):
-    """Calls TakeOverOnlyChild for all groups in the main group."""
-
-    for group in self._properties['mainGroup']._properties['children']:
-      if isinstance(group, PBXGroup):
-        group.TakeOverOnlyChild(recurse)
-
-  def SortGroups(self):
-    # Sort the children of the mainGroup (like "Source" and "Products")
-    # according to their defined order.
-    self._properties['mainGroup']._properties['children'] = \
-        sorted(self._properties['mainGroup']._properties['children'],
-               cmp=lambda x,y: x.CompareRootGroup(y))
-
-    # Sort everything else by putting group before files, and going
-    # alphabetically by name within sections of groups and files.  SortGroup
-    # is recursive.
-    for group in self._properties['mainGroup']._properties['children']:
-      if not isinstance(group, PBXGroup):
-        continue
-
-      if group.Name() == 'Products':
-        # The Products group is a special case.  Instead of sorting
-        # alphabetically, sort things in the order of the targets that
-        # produce the products.  To do this, just build up a new list of
-        # products based on the targets.
-        products = []
-        for target in self._properties['targets']:
-          if not isinstance(target, PBXNativeTarget):
-            continue
-          product = target._properties['productReference']
-          # Make sure that the product is already in the products group.
-          assert product in group._properties['children']
-          products.append(product)
-
-        # Make sure that this process doesn't miss anything that was already
-        # in the products group.
-        assert len(products) == len(group._properties['children'])
-        group._properties['children'] = products
-      else:
-        group.SortGroup()
-
-  def AddOrGetProjectReference(self, other_pbxproject):
-    """Add a reference to another project file (via PBXProject object) to this
-    one.
-
-    Returns [ProductGroup, ProjectRef].  ProductGroup is a PBXGroup object in
-    this project file that contains a PBXReferenceProxy object for each
-    product of each PBXNativeTarget in the other project file.  ProjectRef is
-    a PBXFileReference to the other project file.
-
-    If this project file already references the other project file, the
-    existing ProductGroup and ProjectRef are returned.  The ProductGroup will
-    still be updated if necessary.
-    """
-
-    if not 'projectReferences' in self._properties:
-      self._properties['projectReferences'] = []
-
-    product_group = None
-    project_ref = None
-
-    if not other_pbxproject in self._other_pbxprojects:
-      # This project file isn't yet linked to the other one.  Establish the
-      # link.
-      product_group = PBXGroup({'name': 'Products'})
-
-      # ProductGroup is strong.
-      product_group.parent = self
-
-      # There's nothing unique about this PBXGroup, and if left alone, it will
-      # wind up with the same set of hashables as all other PBXGroup objects
-      # owned by the projectReferences list.  Add the hashables of the
-      # remote PBXProject that it's related to.
-      product_group._hashables.extend(other_pbxproject.Hashables())
-
-      # The other project reports its path as relative to the same directory
-      # that this project's path is relative to.  The other project's path
-      # is not necessarily already relative to this project.  Figure out the
-      # pathname that this project needs to use to refer to the other one.
-      this_path = posixpath.dirname(self.Path())
-      projectDirPath = self.GetProperty('projectDirPath')
-      if projectDirPath:
-        if posixpath.isabs(projectDirPath[0]):
-          this_path = projectDirPath
-        else:
-          this_path = posixpath.join(this_path, projectDirPath)
-      other_path = gyp.common.RelativePath(other_pbxproject.Path(), this_path)
-
-      # ProjectRef is weak (it's owned by the mainGroup hierarchy).
-      project_ref = PBXFileReference({
-            'lastKnownFileType': 'wrapper.pb-project',
-            'path':              other_path,
-            'sourceTree':        'SOURCE_ROOT',
-          })
-      self.ProjectsGroup().AppendChild(project_ref)
-
-      ref_dict = {'ProductGroup': product_group, 'ProjectRef': project_ref}
-      self._other_pbxprojects[other_pbxproject] = ref_dict
-      self.AppendProperty('projectReferences', ref_dict)
-
-      # Xcode seems to sort this list case-insensitively
-      self._properties['projectReferences'] = \
-          sorted(self._properties['projectReferences'], cmp=lambda x,y:
-                 cmp(x['ProjectRef'].Name().lower(),
-                     y['ProjectRef'].Name().lower()))
-    else:
-      # The link already exists.  Pull out the relevnt data.
-      project_ref_dict = self._other_pbxprojects[other_pbxproject]
-      product_group = project_ref_dict['ProductGroup']
-      project_ref = project_ref_dict['ProjectRef']
-
-    self._SetUpProductReferences(other_pbxproject, product_group, project_ref)
-
-    return [product_group, project_ref]
-
-  def _SetUpProductReferences(self, other_pbxproject, product_group,
-                              project_ref):
-    # TODO(mark): This only adds references to products in other_pbxproject
-    # when they don't exist in this pbxproject.  Perhaps it should also
-    # remove references from this pbxproject that are no longer present in
-    # other_pbxproject.  Perhaps it should update various properties if they
-    # change.
-    for target in other_pbxproject._properties['targets']:
-      if not isinstance(target, PBXNativeTarget):
-        continue
-
-      other_fileref = target._properties['productReference']
-      if product_group.GetChildByRemoteObject(other_fileref) is None:
-        # Xcode sets remoteInfo to the name of the target and not the name
-        # of its product, despite this proxy being a reference to the product.
-        container_item = PBXContainerItemProxy({
-              'containerPortal':      project_ref,
-              'proxyType':            2,
-              'remoteGlobalIDString': other_fileref,
-              'remoteInfo':           target.Name()
-            })
-        # TODO(mark): Does sourceTree get copied straight over from the other
-        # project?  Can the other project ever have lastKnownFileType here
-        # instead of explicitFileType?  (Use it if so?)  Can path ever be
-        # unset?  (I don't think so.)  Can other_fileref have name set, and
-        # does it impact the PBXReferenceProxy if so?  These are the questions
-        # that perhaps will be answered one day.
-        reference_proxy = PBXReferenceProxy({
-              'fileType':   other_fileref._properties['explicitFileType'],
-              'path':       other_fileref._properties['path'],
-              'sourceTree': other_fileref._properties['sourceTree'],
-              'remoteRef':  container_item,
-            })
-
-        product_group.AppendChild(reference_proxy)
-
-  def SortRemoteProductReferences(self):
-    # For each remote project file, sort the associated ProductGroup in the
-    # same order that the targets are sorted in the remote project file.  This
-    # is the sort order used by Xcode.
-
-    def CompareProducts(x, y, remote_products):
-      # x and y are PBXReferenceProxy objects.  Go through their associated
-      # PBXContainerItem to get the remote PBXFileReference, which will be
-      # present in the remote_products list.
-      x_remote = x._properties['remoteRef']._properties['remoteGlobalIDString']
-      y_remote = y._properties['remoteRef']._properties['remoteGlobalIDString']
-      x_index = remote_products.index(x_remote)
-      y_index = remote_products.index(y_remote)
-
-      # Use the order of each remote PBXFileReference in remote_products to
-      # determine the sort order.
-      return cmp(x_index, y_index)
-
-    for other_pbxproject, ref_dict in self._other_pbxprojects.iteritems():
-      # Build up a list of products in the remote project file, ordered the
-      # same as the targets that produce them.
-      remote_products = []
-      for target in other_pbxproject._properties['targets']:
-        if not isinstance(target, PBXNativeTarget):
-          continue
-        remote_products.append(target._properties['productReference'])
-
-      # Sort the PBXReferenceProxy children according to the list of remote
-      # products.
-      product_group = ref_dict['ProductGroup']
-      product_group._properties['children'] = sorted(
-          product_group._properties['children'],
-          cmp=lambda x, y: CompareProducts(x, y, remote_products))
-
-
-class XCProjectFile(XCObject):
-  _schema = XCObject._schema.copy()
-  _schema.update({
-    'archiveVersion': [0, int,        0, 1, 1],
-    'classes':        [0, dict,       0, 1, {}],
-    'objectVersion':  [0, int,        0, 1, 45],
-    'rootObject':     [0, PBXProject, 1, 1],
-  })
-
-  def SetXcodeVersion(self, version):
-    version_to_object_version = {
-      '2.4': 45,
-      '3.0': 45,
-      '3.1': 45,
-      '3.2': 46,
-    }
-    if not version in version_to_object_version:
-      supported_str = ', '.join(sorted(version_to_object_version.keys()))
-      raise Exception(
-          'Unsupported Xcode version %s (supported: %s)' %
-          ( version, supported_str ) )
-    compatibility_version = 'Xcode %s' % version
-    self._properties['rootObject'].SetProperty('compatibilityVersion',
-                                               compatibility_version)
-    self.SetProperty('objectVersion', version_to_object_version[version]);
-
-  def ComputeIDs(self, recursive=True, overwrite=True, hash=None):
-    # Although XCProjectFile is implemented here as an XCObject, it's not a
-    # proper object in the Xcode sense, and it certainly doesn't have its own
-    # ID.  Pass through an attempt to update IDs to the real root object.
-    if recursive:
-      self._properties['rootObject'].ComputeIDs(recursive, overwrite, hash)
-
-  def Print(self, file=sys.stdout):
-    self.VerifyHasRequiredProperties()
-
-    # Add the special "objects" property, which will be caught and handled
-    # separately during printing.  This structure allows a fairly standard
-    # loop do the normal printing.
-    self._properties['objects'] = {}
-    self._XCPrint(file, 0, '// !$*UTF8*$!\n')
-    if self._should_print_single_line:
-      self._XCPrint(file, 0, '{ ')
-    else:
-      self._XCPrint(file, 0, '{\n')
-    for property, value in sorted(self._properties.iteritems(),
-                                  cmp=lambda x, y: cmp(x, y)):
-      if property == 'objects':
-        self._PrintObjects(file)
-      else:
-        self._XCKVPrint(file, 1, property, value)
-    self._XCPrint(file, 0, '}\n')
-    del self._properties['objects']
-
-  def _PrintObjects(self, file):
-    if self._should_print_single_line:
-      self._XCPrint(file, 0, 'objects = {')
-    else:
-      self._XCPrint(file, 1, 'objects = {\n')
-
-    objects_by_class = {}
-    for object in self.Descendants():
-      if object == self:
-        continue
-      class_name = object.__class__.__name__
-      if not class_name in objects_by_class:
-        objects_by_class[class_name] = []
-      objects_by_class[class_name].append(object)
-
-    for class_name in sorted(objects_by_class):
-      self._XCPrint(file, 0, '\n')
-      self._XCPrint(file, 0, '/* Begin ' + class_name + ' section */\n')
-      for object in sorted(objects_by_class[class_name],
-                           cmp=lambda x, y: cmp(x.id, y.id)):
-        object.Print(file)
-      self._XCPrint(file, 0, '/* End ' + class_name + ' section */\n')
-
-    if self._should_print_single_line:
-      self._XCPrint(file, 0, '}; ')
-    else:
-      self._XCPrint(file, 1, '};\n')
diff --git a/tools/gyp/pylib/gyp/xml_fix.py b/tools/gyp/pylib/gyp/xml_fix.py
deleted file mode 100644
index 5de8481..0000000
--- a/tools/gyp/pylib/gyp/xml_fix.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright (c) 2011 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Applies a fix to CR LF TAB handling in xml.dom.
-
-Fixes this: http://code.google.com/p/chromium/issues/detail?id=76293
-Working around this: http://bugs.python.org/issue5752
-TODO(bradnelson): Consider dropping this when we drop XP support.
-"""
-
-
-import xml.dom.minidom
-
-
-def _Replacement_write_data(writer, data, is_attrib=False):
-  """Writes datachars to writer."""
-  data = data.replace("&", "&amp;").replace("<", "&lt;")
-  data = data.replace("\"", "&quot;").replace(">", "&gt;")
-  if is_attrib:
-    data = data.replace(
-        "\r", "&#xD;").replace(
-        "\n", "&#xA;").replace(
-        "\t", "&#x9;")
-  writer.write(data)
-
-
-def _Replacement_writexml(self, writer, indent="", addindent="", newl=""):
-  # indent = current indentation
-  # addindent = indentation to add to higher levels
-  # newl = newline string
-  writer.write(indent+"<" + self.tagName)
-
-  attrs = self._get_attributes()
-  a_names = attrs.keys()
-  a_names.sort()
-
-  for a_name in a_names:
-    writer.write(" %s=\"" % a_name)
-    _Replacement_write_data(writer, attrs[a_name].value, is_attrib=True)
-    writer.write("\"")
-  if self.childNodes:
-    writer.write(">%s" % newl)
-    for node in self.childNodes:
-      node.writexml(writer, indent + addindent, addindent, newl)
-    writer.write("%s</%s>%s" % (indent, self.tagName, newl))
-  else:
-    writer.write("/>%s" % newl)
-
-
-class XmlFix(object):
-  """Object to manage temporary patching of xml.dom.minidom."""
-
-  def __init__(self):
-    # Preserve current xml.dom.minidom functions.
-    self.write_data = xml.dom.minidom._write_data
-    self.writexml = xml.dom.minidom.Element.writexml
-    # Inject replacement versions of a function and a method.
-    xml.dom.minidom._write_data = _Replacement_write_data
-    xml.dom.minidom.Element.writexml = _Replacement_writexml
-
-  def Cleanup(self):
-    if self.write_data:
-      xml.dom.minidom._write_data = self.write_data
-      xml.dom.minidom.Element.writexml = self.writexml
-      self.write_data = None
-
-  def __del__(self):
-    self.Cleanup()
diff --git a/tools/gyp/pylintrc b/tools/gyp/pylintrc
deleted file mode 100644
index d7c23d2..0000000
--- a/tools/gyp/pylintrc
+++ /dev/null
@@ -1,307 +0,0 @@
-[MASTER]
-
-# Specify a configuration file.
-#rcfile=
-
-# Python code to execute, usually for sys.path manipulation such as
-# pygtk.require().
-#init-hook=
-
-# Profiled execution.
-profile=no
-
-# Add files or directories to the blacklist. They should be base names, not
-# paths.
-ignore=CVS
-
-# Pickle collected data for later comparisons.
-persistent=yes
-
-# List of plugins (as comma separated values of python modules names) to load,
-# usually to register additional checkers.
-load-plugins=
-
-
-[MESSAGES CONTROL]
-
-# Enable the message, report, category or checker with the given id(s). You can
-# either give multiple identifier separated by comma (,) or put this option
-# multiple time.
-#enable=
-
-# Disable the message, report, category or checker with the given id(s). You
-# can either give multiple identifier separated by comma (,) or put this option
-# multiple time (only on the command line, not in the configuration file where
-# it should appear only once).
-# C0103: Invalid name "NN" (should match [a-z_][a-z0-9_]{2,30}$)
-# C0111: Missing docstring
-# C0302: Too many lines in module (NN)
-# R0902: Too many instance attributes (N/7)
-# R0903: Too few public methods (N/2)
-# R0904: Too many public methods (NN/20)
-# R0912: Too many branches (NN/12)
-# R0913: Too many arguments (N/5)
-# R0914: Too many local variables (NN/15)
-# R0915: Too many statements (NN/50)
-# W0141: Used builtin function 'map'
-# W0142: Used * or ** magic
-# W0232: Class has no __init__ method
-# W0511: TODO
-# W0603: Using the global statement
-#
-# These should be enabled eventually:
-# C0112: Empty docstring
-# C0301: Line too long (NN/80)
-# C0321: More than one statement on single line
-# C0322: Operator not preceded by a space
-# C0323: Operator not followed by a space
-# C0324: Comma not followed by a space
-# E0101: Explicit return in __init__
-# E0102: function already defined line NN
-# E1002: Use of super on an old style class
-# E1101: Instance of 'XX' has no 'YY' member
-# E1103: Instance of 'XX' has no 'XX' member (but some types could not be inferred)
-# E0602: Undefined variable 'XX'
-# F0401: Unable to import 'XX'
-# R0201: Method could be a function
-# R0801: Similar lines in N files
-# W0102: Dangerous default value {} as argument
-# W0104: Statement seems to have no effect
-# W0105: String statement has no effect
-# W0108: Lambda may not be necessary
-# W0201: Attribute 'XX' defined outside __init__
-# W0212: Access to a protected member XX of a client class
-# W0221: Arguments number differs from overridden method
-# W0223: Method 'XX' is abstract in class 'YY' but is not overridden
-# W0231: __init__ method from base class 'XX' is not called
-# W0301: Unnecessary semicolon
-# W0311: Bad indentation. Found NN spaces, expected NN
-# W0401: Wildcard import XX
-# W0402: Uses of a deprecated module 'string'
-# W0403: Relative import 'XX', should be 'YY.XX'
-# W0404: Reimport 'XX' (imported line NN)
-# W0601: Global variable 'XX' undefined at the module level
-# W0602: Using global for 'XX' but no assignment is done
-# W0611: Unused import pprint
-# W0612: Unused variable 'XX'
-# W0613: Unused argument 'XX'
-# W0614: Unused import XX from wildcard import
-# W0621: Redefining name 'XX' from outer scope (line NN)
-# W0622: Redefining built-in 'NN'
-# W0631: Using possibly undefined loop variable 'XX'
-# W0701: Raising a string exception
-# W0702: No exception type(s) specified
-disable=C0103,C0111,C0302,R0902,R0903,R0904,R0912,R0913,R0914,R0915,W0141,W0142,W0232,W0511,W0603,C0112,C0301,C0321,C0322,C0323,C0324,E0101,E0102,E1002,E1101,E1103,E0602,F0401,R0201,R0801,W0102,W0104,W0105,W0108,W0201,W0212,W0221,W0223,W0231,W0301,W0311,W0401,W0402,W0403,W0404,W0601,W0602,W0611,W0612,W0613,W0614,W0621,W0622,W0631,W0701,W0702
-
-
-[REPORTS]
-
-# Set the output format. Available formats are text, parseable, colorized, msvs
-# (visual studio) and html
-output-format=text
-
-# Include message's id in output
-include-ids=yes
-
-# Put messages in a separate file for each module / package specified on the
-# command line instead of printing them on stdout. Reports (if any) will be
-# written in a file name "pylint_global.[txt|html]".
-files-output=no
-
-# Tells whether to display a full report or only the messages
-reports=no
-
-# Python expression which should return a note less than 10 (10 is the highest
-# note). You have access to the variables errors warning, statement which
-# respectively contain the number of errors / warnings messages and the total
-# number of statements analyzed. This is used by the global evaluation report
-# (RP0004).
-evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
-
-# Add a comment according to your evaluation note. This is used by the global
-# evaluation report (RP0004).
-comment=no
-
-
-[VARIABLES]
-
-# Tells whether we should check for unused import in __init__ files.
-init-import=no
-
-# A regular expression matching the beginning of the name of dummy variables
-# (i.e. not used).
-dummy-variables-rgx=_|dummy
-
-# List of additional names supposed to be defined in builtins. Remember that
-# you should avoid to define new builtins when possible.
-additional-builtins=
-
-
-[TYPECHECK]
-
-# Tells whether 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
-
-# List of classes names for which member attributes should not be checked
-# (useful for classes with attributes dynamically set).
-ignored-classes=SQLObject
-
-# When zope mode is activated, add a predefined set of Zope acquired attributes
-# to generated-members.
-zope=no
-
-# List of members which are set dynamically and missed by pylint inference
-# system, and so shouldn't trigger E0201 when accessed. Python regular
-# expressions are accepted.
-generated-members=REQUEST,acl_users,aq_parent
-
-
-[MISCELLANEOUS]
-
-# List of note tags to take in consideration, separated by a comma.
-notes=FIXME,XXX,TODO
-
-
-[SIMILARITIES]
-
-# Minimum lines number of a similarity.
-min-similarity-lines=4
-
-# Ignore comments when computing similarities.
-ignore-comments=yes
-
-# Ignore docstrings when computing similarities.
-ignore-docstrings=yes
-
-
-[FORMAT]
-
-# Maximum number of characters on a single line.
-max-line-length=80
-
-# Maximum number of lines in a module
-max-module-lines=1000
-
-# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
-# tab).
-indent-string='  '
-
-
-[BASIC]
-
-# Required attributes for module, separated by a comma
-required-attributes=
-
-# List of builtins function names that should not be used, separated by a comma
-bad-functions=map,filter,apply,input
-
-# Regular expression which should only match correct module names
-module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
-
-# Regular expression which should only match correct module level names
-const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
-
-# Regular expression which should only match correct class names
-class-rgx=[A-Z_][a-zA-Z0-9]+$
-
-# Regular expression which should only match correct function names
-function-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression which should only match correct method names
-method-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression which should only match correct instance attribute names
-attr-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression which should only match correct argument names
-argument-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression which should only match correct variable names
-variable-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression which should only match correct list comprehension /
-# generator expression variable names
-inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
-
-# Good variable names which should always be accepted, separated by a comma
-good-names=i,j,k,ex,Run,_
-
-# Bad variable names which should always be refused, separated by a comma
-bad-names=foo,bar,baz,toto,tutu,tata
-
-# Regular expression which should only match functions or classes name which do
-# not require a docstring
-no-docstring-rgx=__.*__
-
-
-[DESIGN]
-
-# Maximum number of arguments for function / method
-max-args=5
-
-# Argument names that match this expression will be ignored. Default to name
-# with leading underscore
-ignored-argument-names=_.*
-
-# Maximum number of locals for function / method body
-max-locals=15
-
-# Maximum number of return / yield for function / method body
-max-returns=6
-
-# Maximum number of branch for function / method body
-max-branchs=12
-
-# Maximum number of statements in function / method body
-max-statements=50
-
-# Maximum number of parents for a class (see R0901).
-max-parents=7
-
-# Maximum number of attributes for a class (see R0902).
-max-attributes=7
-
-# Minimum number of public methods for a class (see R0903).
-min-public-methods=2
-
-# Maximum number of public methods for a class (see R0904).
-max-public-methods=20
-
-
-[CLASSES]
-
-# List of interface methods to ignore, separated by a comma. This is used for
-# instance to not check methods defines in Zope's Interface base class.
-ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
-
-# List of method names used to declare (i.e. assign) instance attributes.
-defining-attr-methods=__init__,__new__,setUp
-
-# List of valid names for the first argument in a class method.
-valid-classmethod-first-arg=cls
-
-
-[IMPORTS]
-
-# Deprecated modules which should not be used, separated by a comma
-deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
-
-# Create a graph of every (i.e. internal and external) dependencies in the
-# given file (report RP0402 must not be disabled)
-import-graph=
-
-# Create a graph of external dependencies in the given file (report RP0402 must
-# not be disabled)
-ext-import-graph=
-
-# Create a graph of internal dependencies in the given file (report RP0402 must
-# not be disabled)
-int-import-graph=
-
-
-[EXCEPTIONS]
-
-# Exceptions that will emit a warning when being caught. Defaults to
-# "Exception"
-overgeneral-exceptions=Exception
diff --git a/tools/gyp/samples/samples b/tools/gyp/samples/samples
deleted file mode 100755
index 804b618..0000000
--- a/tools/gyp/samples/samples
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2009 Google Inc. 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
-import shutil
-import sys
-
-
-gyps = [
-    'app/app.gyp',
-    'base/base.gyp',
-    'build/temp_gyp/googleurl.gyp',
-    'build/all.gyp',
-    'build/common.gypi',
-    'build/external_code.gypi',
-    'chrome/test/security_tests/security_tests.gyp',
-    'chrome/third_party/hunspell/hunspell.gyp',
-    'chrome/chrome.gyp',
-    'media/media.gyp',
-    'net/net.gyp',
-    'printing/printing.gyp',
-    'sdch/sdch.gyp',
-    'skia/skia.gyp',
-    'testing/gmock.gyp',
-    'testing/gtest.gyp',
-    'third_party/bzip2/bzip2.gyp',
-    'third_party/icu38/icu38.gyp',
-    'third_party/libevent/libevent.gyp',
-    'third_party/libjpeg/libjpeg.gyp',
-    'third_party/libpng/libpng.gyp',
-    'third_party/libxml/libxml.gyp',
-    'third_party/libxslt/libxslt.gyp',
-    'third_party/lzma_sdk/lzma_sdk.gyp',
-    'third_party/modp_b64/modp_b64.gyp',
-    'third_party/npapi/npapi.gyp',
-    'third_party/sqlite/sqlite.gyp',
-    'third_party/zlib/zlib.gyp',
-    'v8/tools/gyp/v8.gyp',
-    'webkit/activex_shim/activex_shim.gyp',
-    'webkit/activex_shim_dll/activex_shim_dll.gyp',
-    'webkit/build/action_csspropertynames.py',
-    'webkit/build/action_cssvaluekeywords.py',
-    'webkit/build/action_jsconfig.py',
-    'webkit/build/action_makenames.py',
-    'webkit/build/action_maketokenizer.py',
-    'webkit/build/action_useragentstylesheets.py',
-    'webkit/build/rule_binding.py',
-    'webkit/build/rule_bison.py',
-    'webkit/build/rule_gperf.py',
-    'webkit/tools/test_shell/test_shell.gyp',
-    'webkit/webkit.gyp',
-]
-
-
-def Main(argv):
-  if len(argv) != 3 or argv[1] not in ['push', 'pull']:
-    print 'Usage: %s push/pull PATH_TO_CHROME' % argv[0]
-    return 1
-
-  path_to_chrome = argv[2]
-
-  for g in gyps:
-    chrome_file = os.path.join(path_to_chrome, g)
-    local_file = os.path.join(os.path.dirname(argv[0]), os.path.split(g)[1])
-    if argv[1] == 'push':
-      print 'Copying %s to %s' % (local_file, chrome_file)
-      shutil.copyfile(local_file, chrome_file)
-    elif argv[1] == 'pull':
-      print 'Copying %s to %s' % (chrome_file, local_file)
-      shutil.copyfile(chrome_file, local_file)
-    else:
-      assert False
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
diff --git a/tools/gyp/samples/samples.bat b/tools/gyp/samples/samples.bat
deleted file mode 100644
index 778d9c9..0000000
--- a/tools/gyp/samples/samples.bat
+++ /dev/null
@@ -1,5 +0,0 @@
-@rem Copyright (c) 2009 Google Inc. All rights reserved.

-@rem Use of this source code is governed by a BSD-style license that can be

-@rem found in the LICENSE file.

-

-@python %~dp0/samples %*

diff --git a/tools/gyp/setup.py b/tools/gyp/setup.py
deleted file mode 100755
index ed2b41a..0000000
--- a/tools/gyp/setup.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2009 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from distutils.core import setup
-from distutils.command.install import install
-from distutils.command.install_lib import install_lib
-from distutils.command.install_scripts import install_scripts
-
-setup(
-  name='gyp',
-  version='0.1',
-  description='Generate Your Projects',
-  author='Chromium Authors',
-  author_email='chromium-dev@googlegroups.com',
-  url='http://code.google.com/p/gyp',
-  package_dir = {'': 'pylib'},
-  packages=['gyp', 'gyp.generator'],
-
-  scripts = ['gyp'],
-  cmdclass = {'install': install,
-              'install_lib': install_lib,
-              'install_scripts': install_scripts},
-)
diff --git a/tools/gyp/tools/README b/tools/gyp/tools/README
deleted file mode 100644
index 712e4ef..0000000
--- a/tools/gyp/tools/README
+++ /dev/null
@@ -1,15 +0,0 @@
-pretty_vcproj:
-  Usage: pretty_vcproj.py "c:\path\to\vcproj.vcproj" [key1=value1] [key2=value2]
-
-  They key/value pair are used to resolve vsprops name.
-
-  For example, if I want to diff the base.vcproj project:
-
-  pretty_vcproj.py z:\dev\src-chrome\src\base\build\base.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > orignal.txt
-  pretty_vcproj.py z:\dev\src-chrome\src\base\base_gyp.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > gyp.txt
-
-  And you can use your favorite diff tool to see the changes.
-
-  Note: In the case of base.vcproj, the original vcproj is one level up the generated one.
-        I suggest you do a search and replace for '"..\' and replace it with '"' in original.txt
-        before you perform the diff.
\ No newline at end of file
diff --git a/tools/gyp/tools/Xcode/README b/tools/gyp/tools/Xcode/README
deleted file mode 100644
index 2492a2c..0000000
--- a/tools/gyp/tools/Xcode/README
+++ /dev/null
@@ -1,5 +0,0 @@
-Specifications contains syntax formatters for Xcode 3. These do not appear to be supported yet on Xcode 4. To use these with Xcode 3 please install both the gyp.pbfilespec and gyp.xclangspec files in
-
-~/Library/Application Support/Developer/Shared/Xcode/Specifications/
-
-and restart Xcode.
\ No newline at end of file
diff --git a/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec b/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec
deleted file mode 100644
index 85e2e26..0000000
--- a/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-	gyp.pbfilespec
-	GYP source file spec for Xcode 3
-
-	There is not much documentation available regarding the format
-	of .pbfilespec files. As a starting point, see for instance the
-	outdated documentation at:
-	http://maxao.free.fr/xcode-plugin-interface/specifications.html
-	and the files in:
-	/Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/
-
-	Place this file in directory:
-	~/Library/Application Support/Developer/Shared/Xcode/Specifications/
-*/
-
-(
-	{
-		Identifier = sourcecode.gyp;
-		BasedOn = sourcecode;
-		Name = "GYP Files";
-		Extensions = ("gyp", "gypi");
-		MIMETypes = ("text/gyp");
-		Language = "xcode.lang.gyp";
-		IsTextFile = YES;
-		IsSourceFile = YES;
-	}
-)
diff --git a/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec b/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec
deleted file mode 100644
index 3b3506d..0000000
--- a/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
-	Copyright (c) 2011 Google Inc. All rights reserved.
-	Use of this source code is governed by a BSD-style license that can be
-	found in the LICENSE file.
-	
-	gyp.xclangspec
-	GYP language specification for Xcode 3
-
-	There is not much documentation available regarding the format
-	of .xclangspec files. As a starting point, see for instance the
-	outdated documentation at:
-	http://maxao.free.fr/xcode-plugin-interface/specifications.html
-	and the files in:
-	/Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/
-
-	Place this file in directory:
-	~/Library/Application Support/Developer/Shared/Xcode/Specifications/
-*/
-
-(
-
-    {
-        Identifier = "xcode.lang.gyp.keyword";
-        Syntax = {
-            Words = (
-                "and",
-                "or",
-                "<!",
-                "<",
-             );
-            Type = "xcode.syntax.keyword";
-        };
-    },
-
-    {
-        Identifier = "xcode.lang.gyp.target.declarator";
-        Syntax = {
-        	Words = (
-        		"'target_name'",
-        	);
-            Type = "xcode.syntax.identifier.type";
-        };
-    },
-
-	{
-		Identifier = "xcode.lang.gyp.string.singlequote";
-		Syntax = {
-			IncludeRules = (
-				"xcode.lang.string",
-				"xcode.lang.gyp.keyword",
-				"xcode.lang.number",
-			);
-			Start = "'";
-			End = "'";
-		};
-	},
-	
-	{
-		Identifier = "xcode.lang.gyp.comma";
-		Syntax = {
-			Words = ( ",", );
-			
-		};
-	},
-
-	{
-		Identifier = "xcode.lang.gyp";
-		Description = "GYP Coloring";
-		BasedOn = "xcode.lang.simpleColoring";
-		IncludeInMenu = YES;
-		Name = "GYP";
-		Syntax = {
-			Tokenizer = "xcode.lang.gyp.lexer.toplevel";
-			IncludeRules = (
-				"xcode.lang.gyp.dictionary",
-			);
-			Type = "xcode.syntax.plain";
-		};
-	},
-
-	// The following rule returns tokens to the other rules
-	{
-		Identifier = "xcode.lang.gyp.lexer";
-		Syntax = {
-			IncludeRules = (
-				"xcode.lang.gyp.comment",
-				"xcode.lang.string",
-				'xcode.lang.gyp.targetname.declarator',
-				"xcode.lang.gyp.string.singlequote",
-				"xcode.lang.number",
-				"xcode.lang.gyp.comma",
-			);
-		};
-	},
-
-	{
-		Identifier = "xcode.lang.gyp.lexer.toplevel";
-		Syntax = {
-			IncludeRules = (
-				"xcode.lang.gyp.comment",
-			);
-		};
-	},
-
-	{
-        Identifier = "xcode.lang.gyp.assignment";
-        Syntax = {
-            Tokenizer = "xcode.lang.gyp.lexer";
-            Rules = (
-            	"xcode.lang.gyp.assignment.lhs",
-            	":",
-                "xcode.lang.gyp.assignment.rhs",
-            );
-        };
-       
-    },
-    
-    {
-        Identifier = "xcode.lang.gyp.target.declaration";
-        Syntax = {
-            Tokenizer = "xcode.lang.gyp.lexer";
-            Rules = (
-                "xcode.lang.gyp.target.declarator",
-                ":",
-                "xcode.lang.gyp.target.name",
-            );
-        };
-   },
-   
-   {
-        Identifier = "xcode.lang.gyp.target.name";
-        Syntax = {
-            Tokenizer = "xcode.lang.gyp.lexer";
-            Rules = (
-                "xcode.lang.gyp.string.singlequote",
-            );
-        	Type = "xcode.syntax.definition.function";
-        };
-    },
-    
-	{
-        Identifier = "xcode.lang.gyp.assignment.lhs";
-        Syntax = {
-            Tokenizer = "xcode.lang.gyp.lexer";
-            Rules = (
-            	"xcode.lang.gyp.string.singlequote",
-            );
-         	Type = "xcode.syntax.identifier.type";
-        };
-    },
-    
-    {
-        Identifier = "xcode.lang.gyp.assignment.rhs";
-        Syntax = {
-        	Tokenizer = "xcode.lang.gyp.lexer";
-            Rules = (
-            	"xcode.lang.gyp.string.singlequote?",
-                "xcode.lang.gyp.array?",
-				"xcode.lang.gyp.dictionary?",
-				"xcode.lang.number?",
-            );
-        };
-    },
-
-	{
-		Identifier = "xcode.lang.gyp.dictionary";
-		Syntax = {
-			Tokenizer = "xcode.lang.gyp.lexer";
-			Start = "{";
-			End = "}";
-			Foldable = YES;
-			Recursive = YES;
-			IncludeRules = (
-				"xcode.lang.gyp.target.declaration",
-				"xcode.lang.gyp.assignment",
-			);
-		};
-	},
-
-	{
-		Identifier = "xcode.lang.gyp.array";
-		Syntax = {
-			Tokenizer = "xcode.lang.gyp.lexer";
-			Start = "[";
-			End = "]";
-			Foldable = YES;
-			Recursive = YES;
-			IncludeRules = (
-				"xcode.lang.gyp.array",
-				"xcode.lang.gyp.dictionary",
-				"xcode.lang.gyp.string.singlequote",
-			);
-		};
-	},
-
-    {
-        Identifier = "xcode.lang.gyp.todo.mark";
-        Syntax = {
-            StartChars = "T";
-            Match = (
-                "^\(TODO\(.*\):[ \t]+.*\)$",       // include "TODO: " in the markers list
-            );
-            // This is the order of captures. All of the match strings above need the same order.
-            CaptureTypes = (
-                "xcode.syntax.mark"
-            );
-            Type = "xcode.syntax.comment";
-        };
-    },
-
-	{
-		Identifier = "xcode.lang.gyp.comment";
-		BasedOn = "xcode.lang.comment"; // for text macros
-		Syntax = {
-			Start = "#";
-			End = "\n";
-			IncludeRules = (
-				"xcode.lang.url",
-				"xcode.lang.url.mail",
-				"xcode.lang.comment.mark",
-				"xcode.lang.gyp.todo.mark",
-			);
-			Type = "xcode.syntax.comment";
-		};
-	},
-)
diff --git a/tools/gyp/tools/emacs/README b/tools/gyp/tools/emacs/README
deleted file mode 100644
index eeef39f..0000000
--- a/tools/gyp/tools/emacs/README
+++ /dev/null
@@ -1,12 +0,0 @@
-How to install gyp-mode for emacs:
-
-Add the following to your ~/.emacs (replace ... with the path to your gyp
-checkout).
-
-(setq load-path (cons ".../tools/emacs" load-path))
-(require 'gyp)
-
-Restart emacs (or eval-region the added lines) and you should be all set.
-
-Please note that ert is required for running the tests, which is included in
-Emacs 24, or available separately from https://github.com/ohler/ert
diff --git a/tools/gyp/tools/emacs/gyp-tests.el b/tools/gyp/tools/emacs/gyp-tests.el
deleted file mode 100644
index e988a35..0000000
--- a/tools/gyp/tools/emacs/gyp-tests.el
+++ /dev/null
@@ -1,54 +0,0 @@
-;;; gyp-tests.el - unit tests for gyp-mode.
-
-;; Copyright (c) 2012 Google Inc. All rights reserved.
-;; Use of this source code is governed by a BSD-style license that can be
-;; found in the LICENSE file.
-
-;; The recommended way to run these tests is to run them from the command-line,
-;; with the run-unit-tests.sh script.
-
-(require 'cl)
-(require 'ert)
-(require 'gyp)
-
-(defconst samples (directory-files "testdata" t ".gyp$")
-  "List of golden samples to check")
-
-(defun fontify (filename)
-  (with-temp-buffer
-    (insert-file-contents-literally filename)
-    (gyp-mode)
-    (font-lock-fontify-buffer)
-    (buffer-string)))
-
-(defun read-golden-sample (filename)
-  (with-temp-buffer
-    (insert-file-contents-literally (concat filename ".fontified"))
-    (read (current-buffer))))
-
-(defun text-face-properties (s)
-  "Extract the text properties from s"
-  (let ((result (list t)))
-    (dotimes (i (length s))
-      (setq result (cons (get-text-property i 'face s) result)))
-    (nreverse result)))
-
-(ert-deftest test-golden-samples ()
-  "Check that fontification produces the same results as the golden samples"
-  (dolist (sample samples)
-    (let ((golden (read-golden-sample sample))
-          (fontified (fontify sample)))
-      (should (equal golden fontified))
-      (should (equal (text-face-properties golden)
-                     (text-face-properties fontified))))))
-
-(defun create-golden-sample (filename)
-  "Create a golden sample by fontifying filename and writing out the printable
-   representation of the fontified buffer (with text properties) to the
-   FILENAME.fontified"
-  (with-temp-file (concat filename ".fontified")
-    (print (fontify filename) (current-buffer))))
-
-(defun create-golden-samples ()
-  "Recreate the golden samples"
-  (dolist (sample samples) (create-golden-sample sample)))
diff --git a/tools/gyp/tools/emacs/gyp.el b/tools/gyp/tools/emacs/gyp.el
deleted file mode 100644
index c20fc8d..0000000
--- a/tools/gyp/tools/emacs/gyp.el
+++ /dev/null
@@ -1,251 +0,0 @@
-;;; gyp.el - font-lock-mode support for gyp files.
-
-;; Copyright (c) 2012 Google Inc. All rights reserved.
-;; Use of this source code is governed by a BSD-style license that can be
-;; found in the LICENSE file.
-
-;; Put this somewhere in your load-path and
-;; (require 'gyp)
-
-(require 'python)
-(require 'cl)
-
-(when (string-match "python-mode.el" (symbol-file 'python-mode 'defun))
-  (error (concat "python-mode must be loaded from python.el (bundled with "
-                 "recent emacsen), not from the older and less maintained "
-                 "python-mode.el")))
-
-(defadvice python-calculate-indentation (after ami-outdent-closing-parens
-                                               activate)
-  "De-indent closing parens, braces, and brackets in gyp-mode."
-  (if (and (eq major-mode 'gyp-mode)
-           (string-match "^ *[])}][],)}]* *$"
-                         (buffer-substring-no-properties
-                          (line-beginning-position) (line-end-position))))
-      (setq ad-return-value (- ad-return-value 2))))
-
-(define-derived-mode gyp-mode python-mode "Gyp"
-  "Major mode for editing .gyp files. See http://code.google.com/p/gyp/"
-  ;; gyp-parse-history is a stack of (POSITION . PARSE-STATE) tuples,
-  ;; with greater positions at the top of the stack. PARSE-STATE
-  ;; is a list of section symbols (see gyp-section-name and gyp-parse-to)
-  ;; with most nested section symbol at the front of the list.
-  (set (make-local-variable 'gyp-parse-history) '((1 . (list))))
-  (gyp-add-font-lock-keywords))
-
-(defun gyp-set-indentation ()
-  "Hook function to configure python indentation to suit gyp mode."
-  (setq python-continuation-offset 2
-        python-indent 2
-        python-guess-indent nil))
-
-(add-hook 'gyp-mode-hook 'gyp-set-indentation)
-
-(add-to-list 'auto-mode-alist '("\\.gyp\\'" . gyp-mode))
-(add-to-list 'auto-mode-alist '("\\.gypi\\'" . gyp-mode))
-
-;;; Font-lock support
-
-(defconst gyp-dependencies-regexp
-  (regexp-opt (list "dependencies" "export_dependent_settings"))
-  "Regular expression to introduce 'dependencies' section")
-
-(defconst gyp-sources-regexp
-  (regexp-opt (list "action" "files" "include_dirs" "includes" "inputs"
-                    "libraries" "outputs" "sources"))
-  "Regular expression to introduce 'sources' sections")
-
-(defconst gyp-conditions-regexp
-  (regexp-opt (list "conditions" "target_conditions"))
-  "Regular expression to introduce conditions sections")
-
-(defconst gyp-variables-regexp
-  "^variables"
-  "Regular expression to introduce variables sections")
-
-(defconst gyp-defines-regexp
-  "^defines"
-  "Regular expression to introduce 'defines' sections")
-
-(defconst gyp-targets-regexp
-  "^targets"
-  "Regular expression to introduce 'targets' sections")
-
-(defun gyp-section-name (section)
-  "Map the sections we are interested in from SECTION to symbol.
-
-   SECTION is a string from the buffer that introduces a section.  The result is
-   a symbol representing the kind of section.
-
-   This allows us to treat (for the purposes of font-lock) several different
-   section names as the same kind of section. For example, a 'sources section
-   can be introduced by the 'sources', 'inputs', 'outputs' keyword.
-
-   'other is the default section kind when a more specific match is not made."
-  (cond ((string-match-p gyp-dependencies-regexp section) 'dependencies)
-        ((string-match-p gyp-sources-regexp section) 'sources)
-        ((string-match-p gyp-variables-regexp section) 'variables)
-        ((string-match-p gyp-conditions-regexp section) 'conditions)
-        ((string-match-p gyp-targets-regexp section) 'targets)
-        ((string-match-p gyp-defines-regexp section) 'defines)
-        (t 'other)))
-
-(defun gyp-invalidate-parse-states-after (target-point)
-  "Erase any parse information after target-point."
-  (while (> (caar gyp-parse-history) target-point)
-    (setq gyp-parse-history (cdr gyp-parse-history))))
-
-(defun gyp-parse-point ()
-  "The point of the last parse state added by gyp-parse-to."
-  (caar gyp-parse-history))
-
-(defun gyp-parse-sections ()
-  "A list of section symbols holding at the last parse state point."
-  (cdar gyp-parse-history))
-
-(defun gyp-inside-dictionary-p ()
-  "Predicate returning true if the parser is inside a dictionary."
-  (not (eq (cadar gyp-parse-history) 'list)))
-
-(defun gyp-add-parse-history (point sections)
-  "Add parse state SECTIONS to the parse history at POINT so that parsing can be
-   resumed instantly."
-  (while (>= (caar gyp-parse-history) point)
-    (setq gyp-parse-history (cdr gyp-parse-history)))
-  (setq gyp-parse-history (cons (cons point sections) gyp-parse-history)))
-
-(defun gyp-parse-to (target-point)
-  "Parses from (point) to TARGET-POINT adding the parse state information to
-   gyp-parse-state-history. Parsing stops if TARGET-POINT is reached or if a
-   string literal has been parsed. Returns nil if no further parsing can be
-   done, otherwise returns the position of the start of a parsed string, leaving
-   the point at the end of the string."
-  (let ((parsing t)
-        string-start)
-    (while parsing
-      (setq string-start nil)
-      ;; Parse up to a character that starts a sexp, or if the nesting
-      ;; level decreases.
-      (let ((state (parse-partial-sexp (gyp-parse-point)
-                                       target-point
-                                       -1
-                                       t))
-            (sections (gyp-parse-sections)))
-        (if (= (nth 0 state) -1)
-            (setq sections (cdr sections)) ; pop out a level
-          (cond ((looking-at-p "['\"]") ; a string
-                 (setq string-start (point))
-                 (forward-sexp 1)
-                 (if (gyp-inside-dictionary-p)
-                     ;; Look for sections inside a dictionary
-                     (let ((section (gyp-section-name
-                                     (buffer-substring-no-properties
-                                      (+ 1 string-start)
-                                      (- (point) 1)))))
-                       (setq sections (cons section (cdr sections)))))
-                 ;; Stop after the string so it can be fontified.
-                 (setq target-point (point)))
-                ((looking-at-p "{")
-                 ;; Inside a dictionary. Increase nesting.
-                 (forward-char 1)
-                 (setq sections (cons 'unknown sections)))
-                ((looking-at-p "\\[")
-                 ;; Inside a list. Increase nesting
-                 (forward-char 1)
-                 (setq sections (cons 'list sections)))
-                ((not (eobp))
-                 ;; other
-                 (forward-char 1))))
-        (gyp-add-parse-history (point) sections)
-        (setq parsing (< (point) target-point))))
-    string-start))
-
-(defun gyp-section-at-point ()
-  "Transform the last parse state, which is a list of nested sections and return
-   the section symbol that should be used to determine font-lock information for
-   the string. Can return nil indicating the string should not have any attached
-   section."
-  (let ((sections (gyp-parse-sections)))
-    (cond
-     ((eq (car sections) 'conditions)
-      ;; conditions can occur in a variables section, but we still want to
-      ;; highlight it as a keyword.
-      nil)
-     ((and (eq (car sections) 'list)
-           (eq (cadr sections) 'list))
-      ;; conditions and sources can have items in [[ ]]
-      (caddr sections))
-     (t (cadr sections)))))
-
-(defun gyp-section-match (limit)
-  "Parse from (point) to LIMIT returning by means of match data what was
-   matched. The group of the match indicates what style font-lock should apply.
-   See also `gyp-add-font-lock-keywords'."
-  (gyp-invalidate-parse-states-after (point))
-  (let ((group nil)
-        (string-start t))
-    (while (and (< (point) limit)
-                (not group)
-                string-start)
-      (setq string-start (gyp-parse-to limit))
-      (if string-start
-          (setq group (case (gyp-section-at-point)
-                        ('dependencies 1)
-                        ('variables 2)
-                        ('conditions 2)
-                        ('sources 3)
-                        ('defines 4)
-                        (nil nil)))))
-    (if group
-        (progn
-          ;; Set the match data to indicate to the font-lock mechanism the
-          ;; highlighting to be performed.
-          (set-match-data (append (list string-start (point))
-                                  (make-list (* (1- group) 2) nil)
-                                  (list (1+ string-start) (1- (point)))))
-          t))))
-
-;;; Please see http://code.google.com/p/gyp/wiki/GypLanguageSpecification for
-;;; canonical list of keywords.
-(defun gyp-add-font-lock-keywords ()
-  "Add gyp-mode keywords to font-lock mechanism."
-  ;; TODO(jknotten): Move all the keyword highlighting into gyp-section-match
-  ;; so that we can do the font-locking in a single font-lock pass.
-  (font-lock-add-keywords
-   nil
-   (list
-    ;; Top-level keywords
-    (list (concat "['\"]\\("
-              (regexp-opt (list "action" "action_name" "actions" "cflags"
-                                "conditions" "configurations" "copies" "defines"
-                                "dependencies" "destination"
-                                "direct_dependent_settings"
-                                "export_dependent_settings" "extension" "files"
-                                "include_dirs" "includes" "inputs" "libraries"
-                                "link_settings" "mac_bundle" "message"
-                                "msvs_external_rule" "outputs" "product_name"
-                                "process_outputs_as_sources" "rules" "rule_name"
-                                "sources" "suppress_wildcard"
-                                "target_conditions" "target_defaults"
-                                "target_defines" "target_name" "toolsets"
-                                "targets" "type" "variables" "xcode_settings"))
-              "[!/+=]?\\)") 1 'font-lock-keyword-face t)
-    ;; Type of target
-    (list (concat "['\"]\\("
-              (regexp-opt (list "loadable_module" "static_library"
-                                "shared_library" "executable" "none"))
-              "\\)") 1 'font-lock-type-face t)
-    (list "\\(?:target\\|action\\)_name['\"]\\s-*:\\s-*['\"]\\([^ '\"]*\\)" 1
-          'font-lock-function-name-face t)
-    (list 'gyp-section-match
-          (list 1 'font-lock-function-name-face t t) ; dependencies
-          (list 2 'font-lock-variable-name-face t t) ; variables, conditions
-          (list 3 'font-lock-constant-face t t) ; sources
-          (list 4 'font-lock-preprocessor-face t t)) ; preprocessor
-    ;; Variable expansion
-    (list "<@?(\\([^\n )]+\\))" 1 'font-lock-variable-name-face t)
-    ;; Command expansion
-    (list "<!@?(\\([^\n )]+\\))" 1 'font-lock-variable-name-face t)
-    )))
-
-(provide 'gyp)
diff --git a/tools/gyp/tools/emacs/run-unit-tests.sh b/tools/gyp/tools/emacs/run-unit-tests.sh
deleted file mode 100755
index 6e62b9b..0000000
--- a/tools/gyp/tools/emacs/run-unit-tests.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-emacs --no-site-file --no-init-file --batch \
-      --load ert.el --load gyp.el --load gyp-tests.el \
-      -f ert-run-tests-batch-and-exit
diff --git a/tools/gyp/tools/emacs/testdata/media.gyp b/tools/gyp/tools/emacs/testdata/media.gyp
deleted file mode 100644
index 29300fe..0000000
--- a/tools/gyp/tools/emacs/testdata/media.gyp
+++ /dev/null
@@ -1,1105 +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.
-
-{
-  'variables': {
-    'chromium_code': 1,
-    # Override to dynamically link the PulseAudio library.
-    'use_pulseaudio%': 0,
-    # Override to dynamically link the cras (ChromeOS audio) library.
-    'use_cras%': 0,
-  },
-  'targets': [
-    {
-      'target_name': 'media',
-      'type': '<(component)',
-      'dependencies': [
-        'yuv_convert',
-        '../base/base.gyp:base',
-        '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-        '../build/temp_gyp/googleurl.gyp:googleurl',
-        '../crypto/crypto.gyp:crypto',
-        '../third_party/openmax/openmax.gyp:il',
-        '../ui/ui.gyp:ui',
-      ],
-      'defines': [
-        'MEDIA_IMPLEMENTATION',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'audio/android/audio_manager_android.cc',
-        'audio/android/audio_manager_android.h',
-        'audio/android/audio_track_output_android.cc',
-        'audio/android/audio_track_output_android.h',
-        'audio/android/opensles_input.cc',
-        'audio/android/opensles_input.h',
-        'audio/android/opensles_output.cc',
-        'audio/android/opensles_output.h',
-        'audio/async_socket_io_handler.h',
-        'audio/async_socket_io_handler_posix.cc',
-        'audio/async_socket_io_handler_win.cc',
-        'audio/audio_buffers_state.cc',
-        'audio/audio_buffers_state.h',
-        'audio/audio_io.h',
-        'audio/audio_input_controller.cc',
-        'audio/audio_input_controller.h',
-        'audio/audio_input_stream_impl.cc',
-        'audio/audio_input_stream_impl.h',
-        'audio/audio_device_name.cc',
-        'audio/audio_device_name.h',
-        'audio/audio_manager.cc',
-        'audio/audio_manager.h',
-        'audio/audio_manager_base.cc',
-        'audio/audio_manager_base.h',
-        'audio/audio_output_controller.cc',
-        'audio/audio_output_controller.h',
-        'audio/audio_output_dispatcher.cc',
-        'audio/audio_output_dispatcher.h',
-        'audio/audio_output_dispatcher_impl.cc',
-        'audio/audio_output_dispatcher_impl.h',
-        'audio/audio_output_mixer.cc',
-        'audio/audio_output_mixer.h',
-        'audio/audio_output_proxy.cc',
-        'audio/audio_output_proxy.h',
-        'audio/audio_parameters.cc',
-        'audio/audio_parameters.h',
-        'audio/audio_util.cc',
-        'audio/audio_util.h',
-        'audio/cross_process_notification.cc',
-        'audio/cross_process_notification.h',
-        'audio/cross_process_notification_win.cc',
-        'audio/cross_process_notification_posix.cc',
-        'audio/fake_audio_input_stream.cc',
-        'audio/fake_audio_input_stream.h',
-        'audio/fake_audio_output_stream.cc',
-        'audio/fake_audio_output_stream.h',
-        'audio/linux/audio_manager_linux.cc',
-        'audio/linux/audio_manager_linux.h',
-        'audio/linux/alsa_input.cc',
-        'audio/linux/alsa_input.h',
-        'audio/linux/alsa_output.cc',
-        'audio/linux/alsa_output.h',
-        'audio/linux/alsa_util.cc',
-        'audio/linux/alsa_util.h',
-        'audio/linux/alsa_wrapper.cc',
-        'audio/linux/alsa_wrapper.h',
-        'audio/linux/cras_output.cc',
-        'audio/linux/cras_output.h',
-        'audio/openbsd/audio_manager_openbsd.cc',
-        'audio/openbsd/audio_manager_openbsd.h',
-        'audio/mac/audio_input_mac.cc',
-        'audio/mac/audio_input_mac.h',
-        'audio/mac/audio_low_latency_input_mac.cc',
-        'audio/mac/audio_low_latency_input_mac.h',
-        'audio/mac/audio_low_latency_output_mac.cc',
-        'audio/mac/audio_low_latency_output_mac.h',
-        'audio/mac/audio_manager_mac.cc',
-        'audio/mac/audio_manager_mac.h',
-        'audio/mac/audio_output_mac.cc',
-        'audio/mac/audio_output_mac.h',
-        'audio/null_audio_sink.cc',
-        'audio/null_audio_sink.h',
-        'audio/pulse/pulse_output.cc',
-        'audio/pulse/pulse_output.h',
-        'audio/sample_rates.cc',
-        'audio/sample_rates.h',
-        'audio/simple_sources.cc',
-        'audio/simple_sources.h',
-        'audio/win/audio_low_latency_input_win.cc',
-        'audio/win/audio_low_latency_input_win.h',
-        'audio/win/audio_low_latency_output_win.cc',
-        'audio/win/audio_low_latency_output_win.h',
-        'audio/win/audio_manager_win.cc',
-        'audio/win/audio_manager_win.h',
-        'audio/win/avrt_wrapper_win.cc',
-        'audio/win/avrt_wrapper_win.h',
-        'audio/win/device_enumeration_win.cc',
-        'audio/win/device_enumeration_win.h',
-        'audio/win/wavein_input_win.cc',
-        'audio/win/wavein_input_win.h',
-        'audio/win/waveout_output_win.cc',
-        'audio/win/waveout_output_win.h',
-        'base/android/media_jni_registrar.cc',
-        'base/android/media_jni_registrar.h',
-        'base/audio_decoder.cc',
-        'base/audio_decoder.h',
-        'base/audio_decoder_config.cc',
-        'base/audio_decoder_config.h',
-        'base/audio_renderer.h',
-        'base/audio_renderer_mixer.cc',
-        'base/audio_renderer_mixer.h',
-        'base/audio_renderer_mixer_input.cc',
-        'base/audio_renderer_mixer_input.h',
-        'base/bitstream_buffer.h',
-        'base/buffers.cc',
-        'base/buffers.h',
-        'base/byte_queue.cc',
-        'base/byte_queue.h',
-        'base/channel_layout.cc',
-        'base/channel_layout.h',
-        'base/clock.cc',
-        'base/clock.h',
-        'base/composite_filter.cc',
-        'base/composite_filter.h',
-        'base/data_buffer.cc',
-        'base/data_buffer.h',
-        'base/data_source.cc',
-        'base/data_source.h',
-        'base/decoder_buffer.cc',
-        'base/decoder_buffer.h',
-        'base/decrypt_config.cc',
-        'base/decrypt_config.h',
-        'base/decryptor.h',
-        'base/decryptor_client.h',
-        'base/demuxer.cc',
-        'base/demuxer.h',
-        'base/demuxer_stream.cc',
-        'base/demuxer_stream.h',
-        'base/djb2.cc',
-        'base/djb2.h',
-        'base/filter_collection.cc',
-        'base/filter_collection.h',
-        'base/filter_host.h',
-        'base/filters.cc',
-        'base/filters.h',
-        'base/h264_bitstream_converter.cc',
-        'base/h264_bitstream_converter.h',
-        'base/media.h',
-        'base/media_android.cc',
-        'base/media_export.h',
-        'base/media_log.cc',
-        'base/media_log.h',
-        'base/media_log_event.h',
-        'base/media_posix.cc',
-        'base/media_switches.cc',
-        'base/media_switches.h',
-        'base/media_win.cc',
-        'base/message_loop_factory.cc',
-        'base/message_loop_factory.h',
-        'base/pipeline.cc',
-        'base/pipeline.h',
-        'base/pipeline_status.cc',
-        'base/pipeline_status.h',
-        'base/ranges.cc',
-        'base/ranges.h',
-        'base/seekable_buffer.cc',
-        'base/seekable_buffer.h',
-        'base/state_matrix.cc',
-        'base/state_matrix.h',
-        'base/stream_parser.cc',
-        'base/stream_parser.h',
-        'base/stream_parser_buffer.cc',
-        'base/stream_parser_buffer.h',
-        'base/video_decoder.cc',
-        'base/video_decoder.h',
-        'base/video_decoder_config.cc',
-        'base/video_decoder_config.h',
-        'base/video_frame.cc',
-        'base/video_frame.h',
-        'base/video_renderer.h',
-        'base/video_util.cc',
-        'base/video_util.h',
-        'crypto/aes_decryptor.cc',
-        'crypto/aes_decryptor.h',
-        'ffmpeg/ffmpeg_common.cc',
-        'ffmpeg/ffmpeg_common.h',
-        'ffmpeg/file_protocol.cc',
-        'ffmpeg/file_protocol.h',
-        'filters/audio_file_reader.cc',
-        'filters/audio_file_reader.h',
-        'filters/audio_renderer_algorithm.cc',
-        'filters/audio_renderer_algorithm.h',
-        'filters/audio_renderer_impl.cc',
-        'filters/audio_renderer_impl.h',
-        'filters/bitstream_converter.cc',
-        'filters/bitstream_converter.h',
-        'filters/chunk_demuxer.cc',
-        'filters/chunk_demuxer.h',
-        'filters/chunk_demuxer_client.h',
-        'filters/dummy_demuxer.cc',
-        'filters/dummy_demuxer.h',
-        'filters/ffmpeg_audio_decoder.cc',
-        'filters/ffmpeg_audio_decoder.h',
-        'filters/ffmpeg_demuxer.cc',
-        'filters/ffmpeg_demuxer.h',
-        'filters/ffmpeg_h264_bitstream_converter.cc',
-        'filters/ffmpeg_h264_bitstream_converter.h',
-        'filters/ffmpeg_glue.cc',
-        'filters/ffmpeg_glue.h',
-        'filters/ffmpeg_video_decoder.cc',
-        'filters/ffmpeg_video_decoder.h',
-        'filters/file_data_source.cc',
-        'filters/file_data_source.h',
-        'filters/gpu_video_decoder.cc',
-        'filters/gpu_video_decoder.h',
-        'filters/in_memory_url_protocol.cc',
-        'filters/in_memory_url_protocol.h',
-        'filters/source_buffer_stream.cc',
-        'filters/source_buffer_stream.h',
-        'filters/video_frame_generator.cc',
-        'filters/video_frame_generator.h',
-        'filters/video_renderer_base.cc',
-        'filters/video_renderer_base.h',
-        'video/capture/fake_video_capture_device.cc',
-        'video/capture/fake_video_capture_device.h',
-        'video/capture/linux/video_capture_device_linux.cc',
-        'video/capture/linux/video_capture_device_linux.h',
-        'video/capture/mac/video_capture_device_mac.h',
-        'video/capture/mac/video_capture_device_mac.mm',
-        'video/capture/mac/video_capture_device_qtkit_mac.h',
-        'video/capture/mac/video_capture_device_qtkit_mac.mm',
-        'video/capture/video_capture.h',
-        'video/capture/video_capture_device.h',
-        'video/capture/video_capture_device_dummy.cc',
-        'video/capture/video_capture_device_dummy.h',
-        'video/capture/video_capture_proxy.cc',
-        'video/capture/video_capture_proxy.h',
-        'video/capture/video_capture_types.h',
-        'video/capture/win/filter_base_win.cc',
-        'video/capture/win/filter_base_win.h',
-        'video/capture/win/pin_base_win.cc',
-        'video/capture/win/pin_base_win.h',
-        'video/capture/win/sink_filter_observer_win.h',
-        'video/capture/win/sink_filter_win.cc',
-        'video/capture/win/sink_filter_win.h',
-        'video/capture/win/sink_input_pin_win.cc',
-        'video/capture/win/sink_input_pin_win.h',
-        'video/capture/win/video_capture_device_win.cc',
-        'video/capture/win/video_capture_device_win.h',
-        'video/picture.cc',
-        'video/picture.h',
-        'video/video_decode_accelerator.cc',
-        'video/video_decode_accelerator.h',
-        'webm/webm_constants.h',
-        'webm/webm_cluster_parser.cc',
-        'webm/webm_cluster_parser.h',
-        'webm/webm_content_encodings.cc',
-        'webm/webm_content_encodings.h',
-        'webm/webm_content_encodings_client.cc',
-        'webm/webm_content_encodings_client.h',
-        'webm/webm_info_parser.cc',
-        'webm/webm_info_parser.h',
-        'webm/webm_parser.cc',
-        'webm/webm_parser.h',
-        'webm/webm_stream_parser.cc',
-        'webm/webm_stream_parser.h',
-        'webm/webm_tracks_parser.cc',
-        'webm/webm_tracks_parser.h',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '..',
-        ],
-      },
-      'conditions': [
-        # Android doesn't use ffmpeg, so make the dependency conditional
-        # and exclude the sources which depend on ffmpeg.
-        ['OS != "android"', {
-          'dependencies': [
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-        }],
-        ['OS == "android"', {
-          'sources!': [
-            'base/media_posix.cc',
-            'ffmpeg/ffmpeg_common.cc',
-            'ffmpeg/ffmpeg_common.h',
-            'ffmpeg/file_protocol.cc',
-            'ffmpeg/file_protocol.h',
-            'filters/audio_file_reader.cc',
-            'filters/audio_file_reader.h',
-            'filters/bitstream_converter.cc',
-            'filters/bitstream_converter.h',
-            'filters/chunk_demuxer.cc',
-            'filters/chunk_demuxer.h',
-            'filters/chunk_demuxer_client.h',
-            'filters/ffmpeg_audio_decoder.cc',
-            'filters/ffmpeg_audio_decoder.h',
-            'filters/ffmpeg_demuxer.cc',
-            'filters/ffmpeg_demuxer.h',
-            'filters/ffmpeg_h264_bitstream_converter.cc',
-            'filters/ffmpeg_h264_bitstream_converter.h',
-            'filters/ffmpeg_glue.cc',
-            'filters/ffmpeg_glue.h',
-            'filters/ffmpeg_video_decoder.cc',
-            'filters/ffmpeg_video_decoder.h',
-            'filters/gpu_video_decoder.cc',
-            'filters/gpu_video_decoder.h',
-            'webm/webm_cluster_parser.cc',
-            'webm/webm_cluster_parser.h',
-            'webm/webm_stream_parser.cc',
-            'webm/webm_stream_parser.h',
-          ],
-        }],
-        # The below 'android' condition were added temporarily and should be
-        # removed in downstream, because there is no Java environment setup in
-        # upstream yet.
-        ['OS == "android"', {
-          'sources!':[
-            'audio/android/audio_track_output_android.cc',
-          ],
-          'sources':[
-            'audio/android/audio_track_output_stub_android.cc',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-lOpenSLES',
-            ],
-          },
-        }],
-        ['OS=="linux" or OS=="freebsd" or OS=="solaris"', {
-          'link_settings': {
-            'libraries': [
-              '-lasound',
-            ],
-          },
-        }],
-        ['OS=="openbsd"', {
-          'sources/': [ ['exclude', '/alsa_' ],
-                        ['exclude', '/audio_manager_linux' ] ],
-          'link_settings': {
-            'libraries': [
-            ],
-          },
-        }],
-        ['OS!="openbsd"', {
-          'sources!': [
-            'audio/openbsd/audio_manager_openbsd.cc',
-            'audio/openbsd/audio_manager_openbsd.h',
-          ],
-        }],
-        ['OS=="linux"', {
-          'variables': {
-            'conditions': [
-              ['sysroot!=""', {
-                'pkg-config': '../build/linux/pkg-config-wrapper "<(sysroot)" "<(target_arch)"',
-              }, {
-                'pkg-config': 'pkg-config'
-              }],
-            ],
-          },
-          'conditions': [
-            ['use_cras == 1', {
-              'cflags': [
-                '<!@(<(pkg-config) --cflags libcras)',
-              ],
-              'link_settings': {
-                'libraries': [
-                  '<!@(<(pkg-config) --libs libcras)',
-                ],
-              },
-              'defines': [
-                'USE_CRAS',
-              ],
-            }, {  # else: use_cras == 0
-              'sources!': [
-                'audio/linux/cras_output.cc',
-                'audio/linux/cras_output.h',
-              ],
-            }],
-          ],
-        }],
-        ['os_posix == 1', {
-          'conditions': [
-            ['use_pulseaudio == 1', {
-              'cflags': [
-                '<!@(pkg-config --cflags libpulse)',
-              ],
-              'link_settings': {
-                'libraries': [
-                  '<!@(pkg-config --libs-only-l libpulse)',
-                ],
-              },
-              'defines': [
-                'USE_PULSEAUDIO',
-              ],
-            }, {  # else: use_pulseaudio == 0
-              'sources!': [
-                'audio/pulse/pulse_output.cc',
-                'audio/pulse/pulse_output.h',
-              ],
-            }],
-          ],
-        }],
-        ['os_posix == 1 and OS != "android"', {
-          # Video capture isn't supported in Android yet.
-          'sources!': [
-            'video/capture/video_capture_device_dummy.cc',
-            'video/capture/video_capture_device_dummy.h',
-          ],
-        }],
-        ['OS=="mac"', {
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/AudioUnit.framework',
-              '$(SDKROOT)/System/Library/Frameworks/AudioToolbox.framework',
-              '$(SDKROOT)/System/Library/Frameworks/CoreAudio.framework',
-              '$(SDKROOT)/System/Library/Frameworks/CoreVideo.framework',
-              '$(SDKROOT)/System/Library/Frameworks/QTKit.framework',
-            ],
-          },
-        }],
-        ['OS=="win"', {
-          'sources!': [
-            'audio/pulse/pulse_output.cc',
-            'audio/pulse/pulse_output.h',
-            'video/capture/video_capture_device_dummy.cc',
-            'video/capture/video_capture_device_dummy.h',
-          ],
-        }],
-        ['proprietary_codecs==1 or branding=="Chrome"', {
-          'sources': [
-            'mp4/avc.cc',
-            'mp4/avc.h',
-            'mp4/box_definitions.cc',
-            'mp4/box_definitions.h',
-            'mp4/box_reader.cc',
-            'mp4/box_reader.h',
-            'mp4/cenc.cc',
-            'mp4/cenc.h',
-            'mp4/mp4_stream_parser.cc',
-            'mp4/mp4_stream_parser.h',
-            'mp4/offset_byte_queue.cc',
-            'mp4/offset_byte_queue.h',
-            'mp4/track_run_iterator.cc',
-            'mp4/track_run_iterator.h',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'yuv_convert',
-      'type': 'static_library',
-      'include_dirs': [
-        '..',
-      ],
-      'conditions': [
-        ['order_profiling != 0', {
-          'target_conditions' : [
-            ['_toolset=="target"', {
-              'cflags!': [ '-finstrument-functions' ],
-            }],
-          ],
-        }],
-        [ 'target_arch == "ia32" or target_arch == "x64"', {
-          'dependencies': [
-            'yuv_convert_simd_x86',
-          ],
-        }],
-        [ 'target_arch == "arm"', {
-          'dependencies': [
-            'yuv_convert_simd_arm',
-          ],
-        }],
-      ],
-      'sources': [
-        'base/yuv_convert.cc',
-        'base/yuv_convert.h',
-      ],
-    },
-    {
-      'target_name': 'yuv_convert_simd_x86',
-      'type': 'static_library',
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'base/simd/convert_rgb_to_yuv_c.cc',
-        'base/simd/convert_rgb_to_yuv_sse2.cc',
-        'base/simd/convert_rgb_to_yuv_ssse3.asm',
-        'base/simd/convert_rgb_to_yuv_ssse3.cc',
-        'base/simd/convert_rgb_to_yuv_ssse3.inc',
-        'base/simd/convert_yuv_to_rgb_c.cc',
-        'base/simd/convert_yuv_to_rgb_x86.cc',
-        'base/simd/convert_yuv_to_rgb_mmx.asm',
-        'base/simd/convert_yuv_to_rgb_mmx.inc',
-        'base/simd/convert_yuv_to_rgb_sse.asm',
-        'base/simd/filter_yuv.h',
-        'base/simd/filter_yuv_c.cc',
-        'base/simd/filter_yuv_mmx.cc',
-        'base/simd/filter_yuv_sse2.cc',
-        'base/simd/linear_scale_yuv_to_rgb_mmx.asm',
-        'base/simd/linear_scale_yuv_to_rgb_mmx.inc',
-        'base/simd/linear_scale_yuv_to_rgb_sse.asm',
-        'base/simd/scale_yuv_to_rgb_mmx.asm',
-        'base/simd/scale_yuv_to_rgb_mmx.inc',
-        'base/simd/scale_yuv_to_rgb_sse.asm',
-        'base/simd/yuv_to_rgb_table.cc',
-        'base/simd/yuv_to_rgb_table.h',
-      ],
-      'conditions': [
-        ['order_profiling != 0', {
-          'target_conditions' : [
-            ['_toolset=="target"', {
-              'cflags!': [ '-finstrument-functions' ],
-            }],
-          ],
-        }],
-        [ 'target_arch == "x64"', {
-          # Source files optimized for X64 systems.
-          'sources': [
-            'base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm',
-            'base/simd/scale_yuv_to_rgb_sse2_x64.asm',
-          ],
-        }],
-        [ 'os_posix == 1 and OS != "mac" and OS != "android"', {
-          'cflags': [
-            '-msse2',
-          ],
-        }],
-        [ 'OS == "mac"', {
-          'configurations': {
-            'Debug': {
-              'xcode_settings': {
-                # gcc on the mac builds horribly unoptimized sse code in debug
-                # mode. Since this is rarely going to be debugged, run with full
-                # optimizations in Debug as well as Release.
-                'GCC_OPTIMIZATION_LEVEL': '3',  # -O3
-               },
-             },
-          },
-        }],
-        [ 'OS=="win"', {
-          'variables': {
-            'yasm_flags': [
-              '-DWIN32',
-              '-DMSVC',
-              '-DCHROMIUM',
-              '-Isimd',
-            ],
-          },
-        }],
-        [ 'OS=="mac"', {
-          'variables': {
-            'yasm_flags': [
-              '-DPREFIX',
-              '-DMACHO',
-              '-DCHROMIUM',
-              '-Isimd',
-            ],
-          },
-        }],
-        [ 'os_posix==1 and OS!="mac"', {
-          'variables': {
-            'conditions': [
-              [ 'target_arch=="ia32"', {
-                'yasm_flags': [
-                  '-DX86_32',
-                  '-DELF',
-                  '-DCHROMIUM',
-                  '-Isimd',
-                ],
-              }, {
-                'yasm_flags': [
-                  '-DARCH_X86_64',
-                  '-DELF',
-                  '-DPIC',
-                  '-DCHROMIUM',
-                  '-Isimd',
-                ],
-              }],
-            ],
-          },
-        }],
-      ],
-      'variables': {
-        'yasm_output_path': '<(SHARED_INTERMEDIATE_DIR)/media',
-      },
-      'msvs_2010_disable_uldi_when_referenced': 1,
-      'includes': [
-        '../third_party/yasm/yasm_compile.gypi',
-      ],
-    },
-    {
-      'target_name': 'yuv_convert_simd_arm',
-      'type': 'static_library',
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'base/simd/convert_rgb_to_yuv_c.cc',
-        'base/simd/convert_rgb_to_yuv.h',
-        'base/simd/convert_yuv_to_rgb_c.cc',
-        'base/simd/convert_yuv_to_rgb.h',
-        'base/simd/filter_yuv.h',
-        'base/simd/filter_yuv_c.cc',
-        'base/simd/yuv_to_rgb_table.cc',
-        'base/simd/yuv_to_rgb_table.h',
-      ],
-    },
-    {
-      'target_name': 'media_unittests',
-      'type': 'executable',
-      'dependencies': [
-        'media',
-        'media_test_support',
-        'yuv_convert',
-        '../base/base.gyp:base',
-        '../base/base.gyp:base_i18n',
-        '../base/base.gyp:test_support_base',
-        '../testing/gmock.gyp:gmock',
-        '../testing/gtest.gyp:gtest',
-        '../ui/ui.gyp:ui',
-      ],
-      'sources': [
-        'audio/async_socket_io_handler_unittest.cc',
-        'audio/audio_input_controller_unittest.cc',
-        'audio/audio_input_device_unittest.cc',
-        'audio/audio_input_unittest.cc',
-        'audio/audio_input_volume_unittest.cc',
-        'audio/audio_low_latency_input_output_unittest.cc',
-        'audio/audio_output_controller_unittest.cc',
-        'audio/audio_output_proxy_unittest.cc',
-        'audio/audio_parameters_unittest.cc',
-        'audio/audio_util_unittest.cc',
-        'audio/cross_process_notification_unittest.cc',
-        'audio/linux/alsa_output_unittest.cc',
-        'audio/mac/audio_low_latency_input_mac_unittest.cc',
-        'audio/mac/audio_output_mac_unittest.cc',
-        'audio/simple_sources_unittest.cc',
-        'audio/win/audio_low_latency_input_win_unittest.cc',
-        'audio/win/audio_low_latency_output_win_unittest.cc',
-        'audio/win/audio_output_win_unittest.cc',
-        'base/audio_renderer_mixer_unittest.cc',
-        'base/audio_renderer_mixer_input_unittest.cc',
-        'base/buffers_unittest.cc',
-        'base/clock_unittest.cc',
-        'base/composite_filter_unittest.cc',
-        'base/data_buffer_unittest.cc',
-        'base/decoder_buffer_unittest.cc',
-        'base/djb2_unittest.cc',
-        'base/fake_audio_render_callback.cc',
-        'base/fake_audio_render_callback.h',
-        'base/filter_collection_unittest.cc',
-        'base/h264_bitstream_converter_unittest.cc',
-        'base/pipeline_unittest.cc',
-        'base/ranges_unittest.cc',
-        'base/run_all_unittests.cc',
-        'base/seekable_buffer_unittest.cc',
-        'base/state_matrix_unittest.cc',
-        'base/test_data_util.cc',
-        'base/test_data_util.h',
-        'base/video_frame_unittest.cc',
-        'base/video_util_unittest.cc',
-        'base/yuv_convert_unittest.cc',
-        'crypto/aes_decryptor_unittest.cc',
-        'ffmpeg/ffmpeg_common_unittest.cc',
-        'filters/audio_renderer_algorithm_unittest.cc',
-        'filters/audio_renderer_impl_unittest.cc',
-        'filters/bitstream_converter_unittest.cc',
-        'filters/chunk_demuxer_unittest.cc',
-        'filters/ffmpeg_audio_decoder_unittest.cc',
-        'filters/ffmpeg_decoder_unittest.h',
-        'filters/ffmpeg_demuxer_unittest.cc',
-        'filters/ffmpeg_glue_unittest.cc',
-        'filters/ffmpeg_h264_bitstream_converter_unittest.cc',
-        'filters/ffmpeg_video_decoder_unittest.cc',
-        'filters/file_data_source_unittest.cc',
-        'filters/pipeline_integration_test.cc',
-        'filters/pipeline_integration_test_base.cc',
-        'filters/source_buffer_stream_unittest.cc',
-        'filters/video_renderer_base_unittest.cc',
-        'video/capture/video_capture_device_unittest.cc',
-        'webm/cluster_builder.cc',
-        'webm/cluster_builder.h',
-        'webm/webm_cluster_parser_unittest.cc',
-        'webm/webm_content_encodings_client_unittest.cc',
-        'webm/webm_parser_unittest.cc',
-      ],
-      'conditions': [
-        ['os_posix==1 and OS!="mac"', {
-          'conditions': [
-            ['linux_use_tcmalloc==1', {
-              'dependencies': [
-                '../base/allocator/allocator.gyp:allocator',
-              ],
-            }],
-          ],
-        }],
-        ['OS != "android"', {
-          'dependencies': [
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-        }],
-        ['OS == "android"', {
-          'sources!': [
-            'audio/audio_input_volume_unittest.cc',
-            'base/test_data_util.cc',
-            'base/test_data_util.h',
-            'ffmpeg/ffmpeg_common_unittest.cc',
-            'filters/ffmpeg_audio_decoder_unittest.cc',
-            'filters/bitstream_converter_unittest.cc',
-            'filters/chunk_demuxer_unittest.cc',
-            'filters/ffmpeg_demuxer_unittest.cc',
-            'filters/ffmpeg_glue_unittest.cc',
-            'filters/ffmpeg_h264_bitstream_converter_unittest.cc',
-            'filters/ffmpeg_video_decoder_unittest.cc',
-            'filters/pipeline_integration_test.cc',
-            'filters/pipeline_integration_test_base.cc',
-            'mp4/mp4_stream_parser_unittest.cc',
-            'webm/webm_cluster_parser_unittest.cc',
-          ],
-        }],
-        ['OS == "linux"', {
-          'conditions': [
-            ['use_cras == 1', {
-              'sources': [
-                'audio/linux/cras_output_unittest.cc',
-              ],
-              'defines': [
-                'USE_CRAS',
-              ],
-            }],
-          ],
-        }],
-        [ 'target_arch=="ia32" or target_arch=="x64"', {
-          'sources': [
-            'base/simd/convert_rgb_to_yuv_unittest.cc',
-          ],
-        }],
-        ['proprietary_codecs==1 or branding=="Chrome"', {
-          'sources': [
-            'mp4/avc_unittest.cc',
-            'mp4/box_reader_unittest.cc',
-            'mp4/mp4_stream_parser_unittest.cc',
-            'mp4/offset_byte_queue_unittest.cc',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'media_test_support',
-      'type': 'static_library',
-      'dependencies': [
-        'media',
-        '../base/base.gyp:base',
-        '../testing/gmock.gyp:gmock',
-        '../testing/gtest.gyp:gtest',
-      ],
-      'sources': [
-        'audio/test_audio_input_controller_factory.cc',
-        'audio/test_audio_input_controller_factory.h',
-        'base/mock_callback.cc',
-        'base/mock_callback.h',
-        'base/mock_data_source_host.cc',
-        'base/mock_data_source_host.h',
-        'base/mock_demuxer_host.cc',
-        'base/mock_demuxer_host.h',
-        'base/mock_filter_host.cc',
-        'base/mock_filter_host.h',
-        'base/mock_filters.cc',
-        'base/mock_filters.h',
-      ],
-    },
-    {
-      'target_name': 'scaler_bench',
-      'type': 'executable',
-      'dependencies': [
-        'media',
-        'yuv_convert',
-        '../base/base.gyp:base',
-        '../skia/skia.gyp:skia',
-      ],
-      'sources': [
-        'tools/scaler_bench/scaler_bench.cc',
-      ],
-    },
-    {
-      'target_name': 'qt_faststart',
-      'type': 'executable',
-      'sources': [
-        'tools/qt_faststart/qt_faststart.c'
-      ],
-    },
-    {
-      'target_name': 'seek_tester',
-      'type': 'executable',
-      'dependencies': [
-        'media',
-        '../base/base.gyp:base',
-      ],
-      'sources': [
-        'tools/seek_tester/seek_tester.cc',
-      ],
-    },
-  ],
-  'conditions': [
-    ['OS=="win"', {
-      'targets': [
-        {
-          'target_name': 'player_wtl',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'yuv_convert',
-            '../base/base.gyp:base',
-            '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-            '../ui/ui.gyp:ui',
-          ],
-          'include_dirs': [
-            '<(DEPTH)/third_party/wtl/include',
-          ],
-          'sources': [
-            'tools/player_wtl/list.h',
-            'tools/player_wtl/mainfrm.h',
-            'tools/player_wtl/movie.cc',
-            'tools/player_wtl/movie.h',
-            'tools/player_wtl/player_wtl.cc',
-            'tools/player_wtl/player_wtl.rc',
-            'tools/player_wtl/props.h',
-            'tools/player_wtl/seek.h',
-            'tools/player_wtl/resource.h',
-            'tools/player_wtl/view.h',
-          ],
-          'msvs_settings': {
-            'VCLinkerTool': {
-              'SubSystem': '2',         # Set /SUBSYSTEM:WINDOWS
-            },
-          },
-          'defines': [
-            '_CRT_SECURE_NO_WARNINGS=1',
-          ],
-        },
-      ],
-    }],
-    ['OS == "win" or toolkit_uses_gtk == 1', {
-      'targets': [
-        {
-          'target_name': 'shader_bench',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'yuv_convert',
-            '../base/base.gyp:base',
-            '../ui/gl/gl.gyp:gl',
-          ],
-          'sources': [
-            'tools/shader_bench/shader_bench.cc',
-            'tools/shader_bench/cpu_color_painter.cc',
-            'tools/shader_bench/cpu_color_painter.h',
-            'tools/shader_bench/gpu_color_painter.cc',
-            'tools/shader_bench/gpu_color_painter.h',
-            'tools/shader_bench/gpu_painter.cc',
-            'tools/shader_bench/gpu_painter.h',
-            'tools/shader_bench/painter.cc',
-            'tools/shader_bench/painter.h',
-            'tools/shader_bench/window.cc',
-            'tools/shader_bench/window.h',
-          ],
-          'conditions': [
-            ['toolkit_uses_gtk == 1', {
-              'dependencies': [
-                '../build/linux/system.gyp:gtk',
-              ],
-              'sources': [
-                'tools/shader_bench/window_linux.cc',
-              ],
-            }],
-            ['OS=="win"', {
-              'dependencies': [
-                '../third_party/angle/src/build_angle.gyp:libEGL',
-                '../third_party/angle/src/build_angle.gyp:libGLESv2',
-              ],
-              'sources': [
-                'tools/shader_bench/window_win.cc',
-              ],
-            }],
-          ],
-        },
-      ],
-    }],
-    ['OS == "linux" and target_arch != "arm"', {
-      'targets': [
-        {
-          'target_name': 'tile_render_bench',
-          'type': 'executable',
-          'dependencies': [
-            '../base/base.gyp:base',
-            '../ui/gl/gl.gyp:gl',
-          ],
-          'libraries': [
-            '-lGL',
-            '-ldl',
-          ],
-          'sources': [
-            'tools/tile_render_bench/tile_render_bench.cc',
-          ],
-        },
-      ],
-    }],
-    ['os_posix == 1 and OS != "mac" and OS != "android"', {
-      'targets': [
-        {
-          'target_name': 'player_x11',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'yuv_convert',
-            '../base/base.gyp:base',
-            '../ui/gl/gl.gyp:gl',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-ldl',
-              '-lX11',
-              '-lXrender',
-              '-lXext',
-            ],
-          },
-          'sources': [
-            'tools/player_x11/data_source_logger.cc',
-            'tools/player_x11/data_source_logger.h',
-            'tools/player_x11/gl_video_renderer.cc',
-            'tools/player_x11/gl_video_renderer.h',
-            'tools/player_x11/player_x11.cc',
-            'tools/player_x11/x11_video_renderer.cc',
-            'tools/player_x11/x11_video_renderer.h',
-          ],
-        },
-      ],
-    }],
-    ['OS == "android"', {
-      'targets': [
-        {
-          'target_name': 'player_android',
-          'type': 'static_library',
-          'sources': [
-            'base/android/media_player_bridge.cc',
-            'base/android/media_player_bridge.h',
-          ],
-          'dependencies': [
-            '../base/base.gyp:base',
-          ],
-          'include_dirs': [
-            '<(SHARED_INTERMEDIATE_DIR)/media',
-          ],
-          'actions': [
-            {
-              'action_name': 'generate-jni-headers',
-              'inputs': [
-                '../base/android/jni_generator/jni_generator.py',
-                'base/android/java/src/org/chromium/media/MediaPlayerListener.java',
-              ],
-              'outputs': [
-                '<(SHARED_INTERMEDIATE_DIR)/media/jni/media_player_listener_jni.h',
-              ],
-              'action': [
-                'python',
-                '<(DEPTH)/base/android/jni_generator/jni_generator.py',
-                '-o',
-                '<@(_inputs)',
-                '<@(_outputs)',
-              ],
-            },
-          ],
-        },
-        {
-          'target_name': 'media_java',
-          'type': 'none',
-          'dependencies': [ '../base/base.gyp:base_java' ],
-          'variables': {
-            'package_name': 'media',
-            'java_in_dir': 'base/android/java',
-          },
-          'includes': [ '../build/java.gypi' ],
-        },
-
-      ],
-    }, { # OS != "android"'
-      # Android does not use ffmpeg, so disable the targets which require it.
-      'targets': [
-        {
-          'target_name': 'ffmpeg_unittests',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'media_test_support',
-            '../base/base.gyp:base',
-            '../base/base.gyp:base_i18n',
-            '../base/base.gyp:test_support_base',
-            '../base/base.gyp:test_support_perf',
-            '../testing/gtest.gyp:gtest',
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-          'sources': [
-            'ffmpeg/ffmpeg_unittest.cc',
-          ],
-          'conditions': [
-            ['toolkit_uses_gtk == 1', {
-              'dependencies': [
-                # Needed for the following #include chain:
-                #   base/run_all_unittests.cc
-                #   ../base/test_suite.h
-                #   gtk/gtk.h
-                '../build/linux/system.gyp:gtk',
-              ],
-              'conditions': [
-                ['linux_use_tcmalloc==1', {
-                  'dependencies': [
-                    '../base/allocator/allocator.gyp:allocator',
-                  ],
-                }],
-              ],
-            }],
-          ],
-        },
-        {
-          'target_name': 'ffmpeg_regression_tests',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'media_test_support',
-            '../base/base.gyp:test_support_base',
-            '../testing/gmock.gyp:gmock',
-            '../testing/gtest.gyp:gtest',
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-          'sources': [
-            'base/test_data_util.cc',
-            'base/run_all_unittests.cc',
-            'ffmpeg/ffmpeg_regression_tests.cc',
-            'filters/pipeline_integration_test_base.cc',
-          ],
-          'conditions': [
-            ['os_posix==1 and OS!="mac"', {
-              'conditions': [
-                ['linux_use_tcmalloc==1', {
-                  'dependencies': [
-                    '../base/allocator/allocator.gyp:allocator',
-                  ],
-                }],
-              ],
-            }],
-          ],
-        },
-        {
-          'target_name': 'ffmpeg_tests',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            '../base/base.gyp:base',
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-          'sources': [
-            'test/ffmpeg_tests/ffmpeg_tests.cc',
-          ],
-        },
-        {
-          'target_name': 'media_bench',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            '../base/base.gyp:base',
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-          'sources': [
-            'tools/media_bench/media_bench.cc',
-          ],
-        },
-      ],
-    }]
-  ],
-}
diff --git a/tools/gyp/tools/emacs/testdata/media.gyp.fontified b/tools/gyp/tools/emacs/testdata/media.gyp.fontified
deleted file mode 100644
index 962b7b2..0000000
--- a/tools/gyp/tools/emacs/testdata/media.gyp.fontified
+++ /dev/null
@@ -1,1107 +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.
-
-{
-  'variables': {
-    'chromium_code': 1,
-    # Override to dynamically link the PulseAudio library.
-    'use_pulseaudio%': 0,
-    # Override to dynamically link the cras (ChromeOS audio) library.
-    'use_cras%': 0,
-  },
-  'targets': [
-    {
-      'target_name': 'media',
-      'type': '<(component)',
-      'dependencies': [
-        'yuv_convert',
-        '../base/base.gyp:base',
-        '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-        '../build/temp_gyp/googleurl.gyp:googleurl',
-        '../crypto/crypto.gyp:crypto',
-        '../third_party/openmax/openmax.gyp:il',
-        '../ui/ui.gyp:ui',
-      ],
-      'defines': [
-        'MEDIA_IMPLEMENTATION',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'audio/android/audio_manager_android.cc',
-        'audio/android/audio_manager_android.h',
-        'audio/android/audio_track_output_android.cc',
-        'audio/android/audio_track_output_android.h',
-        'audio/android/opensles_input.cc',
-        'audio/android/opensles_input.h',
-        'audio/android/opensles_output.cc',
-        'audio/android/opensles_output.h',
-        'audio/async_socket_io_handler.h',
-        'audio/async_socket_io_handler_posix.cc',
-        'audio/async_socket_io_handler_win.cc',
-        'audio/audio_buffers_state.cc',
-        'audio/audio_buffers_state.h',
-        'audio/audio_io.h',
-        'audio/audio_input_controller.cc',
-        'audio/audio_input_controller.h',
-        'audio/audio_input_stream_impl.cc',
-        'audio/audio_input_stream_impl.h',
-        'audio/audio_device_name.cc',
-        'audio/audio_device_name.h',
-        'audio/audio_manager.cc',
-        'audio/audio_manager.h',
-        'audio/audio_manager_base.cc',
-        'audio/audio_manager_base.h',
-        'audio/audio_output_controller.cc',
-        'audio/audio_output_controller.h',
-        'audio/audio_output_dispatcher.cc',
-        'audio/audio_output_dispatcher.h',
-        'audio/audio_output_dispatcher_impl.cc',
-        'audio/audio_output_dispatcher_impl.h',
-        'audio/audio_output_mixer.cc',
-        'audio/audio_output_mixer.h',
-        'audio/audio_output_proxy.cc',
-        'audio/audio_output_proxy.h',
-        'audio/audio_parameters.cc',
-        'audio/audio_parameters.h',
-        'audio/audio_util.cc',
-        'audio/audio_util.h',
-        'audio/cross_process_notification.cc',
-        'audio/cross_process_notification.h',
-        'audio/cross_process_notification_win.cc',
-        'audio/cross_process_notification_posix.cc',
-        'audio/fake_audio_input_stream.cc',
-        'audio/fake_audio_input_stream.h',
-        'audio/fake_audio_output_stream.cc',
-        'audio/fake_audio_output_stream.h',
-        'audio/linux/audio_manager_linux.cc',
-        'audio/linux/audio_manager_linux.h',
-        'audio/linux/alsa_input.cc',
-        'audio/linux/alsa_input.h',
-        'audio/linux/alsa_output.cc',
-        'audio/linux/alsa_output.h',
-        'audio/linux/alsa_util.cc',
-        'audio/linux/alsa_util.h',
-        'audio/linux/alsa_wrapper.cc',
-        'audio/linux/alsa_wrapper.h',
-        'audio/linux/cras_output.cc',
-        'audio/linux/cras_output.h',
-        'audio/openbsd/audio_manager_openbsd.cc',
-        'audio/openbsd/audio_manager_openbsd.h',
-        'audio/mac/audio_input_mac.cc',
-        'audio/mac/audio_input_mac.h',
-        'audio/mac/audio_low_latency_input_mac.cc',
-        'audio/mac/audio_low_latency_input_mac.h',
-        'audio/mac/audio_low_latency_output_mac.cc',
-        'audio/mac/audio_low_latency_output_mac.h',
-        'audio/mac/audio_manager_mac.cc',
-        'audio/mac/audio_manager_mac.h',
-        'audio/mac/audio_output_mac.cc',
-        'audio/mac/audio_output_mac.h',
-        'audio/null_audio_sink.cc',
-        'audio/null_audio_sink.h',
-        'audio/pulse/pulse_output.cc',
-        'audio/pulse/pulse_output.h',
-        'audio/sample_rates.cc',
-        'audio/sample_rates.h',
-        'audio/simple_sources.cc',
-        'audio/simple_sources.h',
-        'audio/win/audio_low_latency_input_win.cc',
-        'audio/win/audio_low_latency_input_win.h',
-        'audio/win/audio_low_latency_output_win.cc',
-        'audio/win/audio_low_latency_output_win.h',
-        'audio/win/audio_manager_win.cc',
-        'audio/win/audio_manager_win.h',
-        'audio/win/avrt_wrapper_win.cc',
-        'audio/win/avrt_wrapper_win.h',
-        'audio/win/device_enumeration_win.cc',
-        'audio/win/device_enumeration_win.h',
-        'audio/win/wavein_input_win.cc',
-        'audio/win/wavein_input_win.h',
-        'audio/win/waveout_output_win.cc',
-        'audio/win/waveout_output_win.h',
-        'base/android/media_jni_registrar.cc',
-        'base/android/media_jni_registrar.h',
-        'base/audio_decoder.cc',
-        'base/audio_decoder.h',
-        'base/audio_decoder_config.cc',
-        'base/audio_decoder_config.h',
-        'base/audio_renderer.h',
-        'base/audio_renderer_mixer.cc',
-        'base/audio_renderer_mixer.h',
-        'base/audio_renderer_mixer_input.cc',
-        'base/audio_renderer_mixer_input.h',
-        'base/bitstream_buffer.h',
-        'base/buffers.cc',
-        'base/buffers.h',
-        'base/byte_queue.cc',
-        'base/byte_queue.h',
-        'base/channel_layout.cc',
-        'base/channel_layout.h',
-        'base/clock.cc',
-        'base/clock.h',
-        'base/composite_filter.cc',
-        'base/composite_filter.h',
-        'base/data_buffer.cc',
-        'base/data_buffer.h',
-        'base/data_source.cc',
-        'base/data_source.h',
-        'base/decoder_buffer.cc',
-        'base/decoder_buffer.h',
-        'base/decrypt_config.cc',
-        'base/decrypt_config.h',
-        'base/decryptor.h',
-        'base/decryptor_client.h',
-        'base/demuxer.cc',
-        'base/demuxer.h',
-        'base/demuxer_stream.cc',
-        'base/demuxer_stream.h',
-        'base/djb2.cc',
-        'base/djb2.h',
-        'base/filter_collection.cc',
-        'base/filter_collection.h',
-        'base/filter_host.h',
-        'base/filters.cc',
-        'base/filters.h',
-        'base/h264_bitstream_converter.cc',
-        'base/h264_bitstream_converter.h',
-        'base/media.h',
-        'base/media_android.cc',
-        'base/media_export.h',
-        'base/media_log.cc',
-        'base/media_log.h',
-        'base/media_log_event.h',
-        'base/media_posix.cc',
-        'base/media_switches.cc',
-        'base/media_switches.h',
-        'base/media_win.cc',
-        'base/message_loop_factory.cc',
-        'base/message_loop_factory.h',
-        'base/pipeline.cc',
-        'base/pipeline.h',
-        'base/pipeline_status.cc',
-        'base/pipeline_status.h',
-        'base/ranges.cc',
-        'base/ranges.h',
-        'base/seekable_buffer.cc',
-        'base/seekable_buffer.h',
-        'base/state_matrix.cc',
-        'base/state_matrix.h',
-        'base/stream_parser.cc',
-        'base/stream_parser.h',
-        'base/stream_parser_buffer.cc',
-        'base/stream_parser_buffer.h',
-        'base/video_decoder.cc',
-        'base/video_decoder.h',
-        'base/video_decoder_config.cc',
-        'base/video_decoder_config.h',
-        'base/video_frame.cc',
-        'base/video_frame.h',
-        'base/video_renderer.h',
-        'base/video_util.cc',
-        'base/video_util.h',
-        'crypto/aes_decryptor.cc',
-        'crypto/aes_decryptor.h',
-        'ffmpeg/ffmpeg_common.cc',
-        'ffmpeg/ffmpeg_common.h',
-        'ffmpeg/file_protocol.cc',
-        'ffmpeg/file_protocol.h',
-        'filters/audio_file_reader.cc',
-        'filters/audio_file_reader.h',
-        'filters/audio_renderer_algorithm.cc',
-        'filters/audio_renderer_algorithm.h',
-        'filters/audio_renderer_impl.cc',
-        'filters/audio_renderer_impl.h',
-        'filters/bitstream_converter.cc',
-        'filters/bitstream_converter.h',
-        'filters/chunk_demuxer.cc',
-        'filters/chunk_demuxer.h',
-        'filters/chunk_demuxer_client.h',
-        'filters/dummy_demuxer.cc',
-        'filters/dummy_demuxer.h',
-        'filters/ffmpeg_audio_decoder.cc',
-        'filters/ffmpeg_audio_decoder.h',
-        'filters/ffmpeg_demuxer.cc',
-        'filters/ffmpeg_demuxer.h',
-        'filters/ffmpeg_h264_bitstream_converter.cc',
-        'filters/ffmpeg_h264_bitstream_converter.h',
-        'filters/ffmpeg_glue.cc',
-        'filters/ffmpeg_glue.h',
-        'filters/ffmpeg_video_decoder.cc',
-        'filters/ffmpeg_video_decoder.h',
-        'filters/file_data_source.cc',
-        'filters/file_data_source.h',
-        'filters/gpu_video_decoder.cc',
-        'filters/gpu_video_decoder.h',
-        'filters/in_memory_url_protocol.cc',
-        'filters/in_memory_url_protocol.h',
-        'filters/source_buffer_stream.cc',
-        'filters/source_buffer_stream.h',
-        'filters/video_frame_generator.cc',
-        'filters/video_frame_generator.h',
-        'filters/video_renderer_base.cc',
-        'filters/video_renderer_base.h',
-        'video/capture/fake_video_capture_device.cc',
-        'video/capture/fake_video_capture_device.h',
-        'video/capture/linux/video_capture_device_linux.cc',
-        'video/capture/linux/video_capture_device_linux.h',
-        'video/capture/mac/video_capture_device_mac.h',
-        'video/capture/mac/video_capture_device_mac.mm',
-        'video/capture/mac/video_capture_device_qtkit_mac.h',
-        'video/capture/mac/video_capture_device_qtkit_mac.mm',
-        'video/capture/video_capture.h',
-        'video/capture/video_capture_device.h',
-        'video/capture/video_capture_device_dummy.cc',
-        'video/capture/video_capture_device_dummy.h',
-        'video/capture/video_capture_proxy.cc',
-        'video/capture/video_capture_proxy.h',
-        'video/capture/video_capture_types.h',
-        'video/capture/win/filter_base_win.cc',
-        'video/capture/win/filter_base_win.h',
-        'video/capture/win/pin_base_win.cc',
-        'video/capture/win/pin_base_win.h',
-        'video/capture/win/sink_filter_observer_win.h',
-        'video/capture/win/sink_filter_win.cc',
-        'video/capture/win/sink_filter_win.h',
-        'video/capture/win/sink_input_pin_win.cc',
-        'video/capture/win/sink_input_pin_win.h',
-        'video/capture/win/video_capture_device_win.cc',
-        'video/capture/win/video_capture_device_win.h',
-        'video/picture.cc',
-        'video/picture.h',
-        'video/video_decode_accelerator.cc',
-        'video/video_decode_accelerator.h',
-        'webm/webm_constants.h',
-        'webm/webm_cluster_parser.cc',
-        'webm/webm_cluster_parser.h',
-        'webm/webm_content_encodings.cc',
-        'webm/webm_content_encodings.h',
-        'webm/webm_content_encodings_client.cc',
-        'webm/webm_content_encodings_client.h',
-        'webm/webm_info_parser.cc',
-        'webm/webm_info_parser.h',
-        'webm/webm_parser.cc',
-        'webm/webm_parser.h',
-        'webm/webm_stream_parser.cc',
-        'webm/webm_stream_parser.h',
-        'webm/webm_tracks_parser.cc',
-        'webm/webm_tracks_parser.h',
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '..',
-        ],
-      },
-      'conditions': [
-        # Android doesn't use ffmpeg, so make the dependency conditional
-        # and exclude the sources which depend on ffmpeg.
-        ['OS != \"android\"', {
-          'dependencies': [
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-        }],
-        ['OS == \"android\"', {
-          'sources!': [
-            'base/media_posix.cc',
-            'ffmpeg/ffmpeg_common.cc',
-            'ffmpeg/ffmpeg_common.h',
-            'ffmpeg/file_protocol.cc',
-            'ffmpeg/file_protocol.h',
-            'filters/audio_file_reader.cc',
-            'filters/audio_file_reader.h',
-            'filters/bitstream_converter.cc',
-            'filters/bitstream_converter.h',
-            'filters/chunk_demuxer.cc',
-            'filters/chunk_demuxer.h',
-            'filters/chunk_demuxer_client.h',
-            'filters/ffmpeg_audio_decoder.cc',
-            'filters/ffmpeg_audio_decoder.h',
-            'filters/ffmpeg_demuxer.cc',
-            'filters/ffmpeg_demuxer.h',
-            'filters/ffmpeg_h264_bitstream_converter.cc',
-            'filters/ffmpeg_h264_bitstream_converter.h',
-            'filters/ffmpeg_glue.cc',
-            'filters/ffmpeg_glue.h',
-            'filters/ffmpeg_video_decoder.cc',
-            'filters/ffmpeg_video_decoder.h',
-            'filters/gpu_video_decoder.cc',
-            'filters/gpu_video_decoder.h',
-            'webm/webm_cluster_parser.cc',
-            'webm/webm_cluster_parser.h',
-            'webm/webm_stream_parser.cc',
-            'webm/webm_stream_parser.h',
-          ],
-        }],
-        # The below 'android' condition were added temporarily and should be
-        # removed in downstream, because there is no Java environment setup in
-        # upstream yet.
-        ['OS == \"android\"', {
-          'sources!':[
-            'audio/android/audio_track_output_android.cc',
-          ],
-          'sources':[
-            'audio/android/audio_track_output_stub_android.cc',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-lOpenSLES',
-            ],
-          },
-        }],
-        ['OS==\"linux\" or OS==\"freebsd\" or OS==\"solaris\"', {
-          'link_settings': {
-            'libraries': [
-              '-lasound',
-            ],
-          },
-        }],
-        ['OS==\"openbsd\"', {
-          'sources/': [ ['exclude', '/alsa_' ],
-                        ['exclude', '/audio_manager_linux' ] ],
-          'link_settings': {
-            'libraries': [
-            ],
-          },
-        }],
-        ['OS!=\"openbsd\"', {
-          'sources!': [
-            'audio/openbsd/audio_manager_openbsd.cc',
-            'audio/openbsd/audio_manager_openbsd.h',
-          ],
-        }],
-        ['OS==\"linux\"', {
-          'variables': {
-            'conditions': [
-              ['sysroot!=\"\"', {
-                'pkg-config': '../build/linux/pkg-config-wrapper \"<(sysroot)\" \"<(target_arch)\"',
-              }, {
-                'pkg-config': 'pkg-config'
-              }],
-            ],
-          },
-          'conditions': [
-            ['use_cras == 1', {
-              'cflags': [
-                '<!@(<(pkg-config) --cflags libcras)',
-              ],
-              'link_settings': {
-                'libraries': [
-                  '<!@(<(pkg-config) --libs libcras)',
-                ],
-              },
-              'defines': [
-                'USE_CRAS',
-              ],
-            }, {  # else: use_cras == 0
-              'sources!': [
-                'audio/linux/cras_output.cc',
-                'audio/linux/cras_output.h',
-              ],
-            }],
-          ],
-        }],
-        ['os_posix == 1', {
-          'conditions': [
-            ['use_pulseaudio == 1', {
-              'cflags': [
-                '<!@(pkg-config --cflags libpulse)',
-              ],
-              'link_settings': {
-                'libraries': [
-                  '<!@(pkg-config --libs-only-l libpulse)',
-                ],
-              },
-              'defines': [
-                'USE_PULSEAUDIO',
-              ],
-            }, {  # else: use_pulseaudio == 0
-              'sources!': [
-                'audio/pulse/pulse_output.cc',
-                'audio/pulse/pulse_output.h',
-              ],
-            }],
-          ],
-        }],
-        ['os_posix == 1 and OS != \"android\"', {
-          # Video capture isn't supported in Android yet.
-          'sources!': [
-            'video/capture/video_capture_device_dummy.cc',
-            'video/capture/video_capture_device_dummy.h',
-          ],
-        }],
-        ['OS==\"mac\"', {
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/AudioUnit.framework',
-              '$(SDKROOT)/System/Library/Frameworks/AudioToolbox.framework',
-              '$(SDKROOT)/System/Library/Frameworks/CoreAudio.framework',
-              '$(SDKROOT)/System/Library/Frameworks/CoreVideo.framework',
-              '$(SDKROOT)/System/Library/Frameworks/QTKit.framework',
-            ],
-          },
-        }],
-        ['OS==\"win\"', {
-          'sources!': [
-            'audio/pulse/pulse_output.cc',
-            'audio/pulse/pulse_output.h',
-            'video/capture/video_capture_device_dummy.cc',
-            'video/capture/video_capture_device_dummy.h',
-          ],
-        }],
-        ['proprietary_codecs==1 or branding==\"Chrome\"', {
-          'sources': [
-            'mp4/avc.cc',
-            'mp4/avc.h',
-            'mp4/box_definitions.cc',
-            'mp4/box_definitions.h',
-            'mp4/box_reader.cc',
-            'mp4/box_reader.h',
-            'mp4/cenc.cc',
-            'mp4/cenc.h',
-            'mp4/mp4_stream_parser.cc',
-            'mp4/mp4_stream_parser.h',
-            'mp4/offset_byte_queue.cc',
-            'mp4/offset_byte_queue.h',
-            'mp4/track_run_iterator.cc',
-            'mp4/track_run_iterator.h',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'yuv_convert',
-      'type': 'static_library',
-      'include_dirs': [
-        '..',
-      ],
-      'conditions': [
-        ['order_profiling != 0', {
-          'target_conditions' : [
-            ['_toolset==\"target\"', {
-              'cflags!': [ '-finstrument-functions' ],
-            }],
-          ],
-        }],
-        [ 'target_arch == \"ia32\" or target_arch == \"x64\"', {
-          'dependencies': [
-            'yuv_convert_simd_x86',
-          ],
-        }],
-        [ 'target_arch == \"arm\"', {
-          'dependencies': [
-            'yuv_convert_simd_arm',
-          ],
-        }],
-      ],
-      'sources': [
-        'base/yuv_convert.cc',
-        'base/yuv_convert.h',
-      ],
-    },
-    {
-      'target_name': 'yuv_convert_simd_x86',
-      'type': 'static_library',
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'base/simd/convert_rgb_to_yuv_c.cc',
-        'base/simd/convert_rgb_to_yuv_sse2.cc',
-        'base/simd/convert_rgb_to_yuv_ssse3.asm',
-        'base/simd/convert_rgb_to_yuv_ssse3.cc',
-        'base/simd/convert_rgb_to_yuv_ssse3.inc',
-        'base/simd/convert_yuv_to_rgb_c.cc',
-        'base/simd/convert_yuv_to_rgb_x86.cc',
-        'base/simd/convert_yuv_to_rgb_mmx.asm',
-        'base/simd/convert_yuv_to_rgb_mmx.inc',
-        'base/simd/convert_yuv_to_rgb_sse.asm',
-        'base/simd/filter_yuv.h',
-        'base/simd/filter_yuv_c.cc',
-        'base/simd/filter_yuv_mmx.cc',
-        'base/simd/filter_yuv_sse2.cc',
-        'base/simd/linear_scale_yuv_to_rgb_mmx.asm',
-        'base/simd/linear_scale_yuv_to_rgb_mmx.inc',
-        'base/simd/linear_scale_yuv_to_rgb_sse.asm',
-        'base/simd/scale_yuv_to_rgb_mmx.asm',
-        'base/simd/scale_yuv_to_rgb_mmx.inc',
-        'base/simd/scale_yuv_to_rgb_sse.asm',
-        'base/simd/yuv_to_rgb_table.cc',
-        'base/simd/yuv_to_rgb_table.h',
-      ],
-      'conditions': [
-        ['order_profiling != 0', {
-          'target_conditions' : [
-            ['_toolset==\"target\"', {
-              'cflags!': [ '-finstrument-functions' ],
-            }],
-          ],
-        }],
-        [ 'target_arch == \"x64\"', {
-          # Source files optimized for X64 systems.
-          'sources': [
-            'base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm',
-            'base/simd/scale_yuv_to_rgb_sse2_x64.asm',
-          ],
-        }],
-        [ 'os_posix == 1 and OS != \"mac\" and OS != \"android\"', {
-          'cflags': [
-            '-msse2',
-          ],
-        }],
-        [ 'OS == \"mac\"', {
-          'configurations': {
-            'Debug': {
-              'xcode_settings': {
-                # gcc on the mac builds horribly unoptimized sse code in debug
-                # mode. Since this is rarely going to be debugged, run with full
-                # optimizations in Debug as well as Release.
-                'GCC_OPTIMIZATION_LEVEL': '3',  # -O3
-               },
-             },
-          },
-        }],
-        [ 'OS==\"win\"', {
-          'variables': {
-            'yasm_flags': [
-              '-DWIN32',
-              '-DMSVC',
-              '-DCHROMIUM',
-              '-Isimd',
-            ],
-          },
-        }],
-        [ 'OS==\"mac\"', {
-          'variables': {
-            'yasm_flags': [
-              '-DPREFIX',
-              '-DMACHO',
-              '-DCHROMIUM',
-              '-Isimd',
-            ],
-          },
-        }],
-        [ 'os_posix==1 and OS!=\"mac\"', {
-          'variables': {
-            'conditions': [
-              [ 'target_arch==\"ia32\"', {
-                'yasm_flags': [
-                  '-DX86_32',
-                  '-DELF',
-                  '-DCHROMIUM',
-                  '-Isimd',
-                ],
-              }, {
-                'yasm_flags': [
-                  '-DARCH_X86_64',
-                  '-DELF',
-                  '-DPIC',
-                  '-DCHROMIUM',
-                  '-Isimd',
-                ],
-              }],
-            ],
-          },
-        }],
-      ],
-      'variables': {
-        'yasm_output_path': '<(SHARED_INTERMEDIATE_DIR)/media',
-      },
-      'msvs_2010_disable_uldi_when_referenced': 1,
-      'includes': [
-        '../third_party/yasm/yasm_compile.gypi',
-      ],
-    },
-    {
-      'target_name': 'yuv_convert_simd_arm',
-      'type': 'static_library',
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'base/simd/convert_rgb_to_yuv_c.cc',
-        'base/simd/convert_rgb_to_yuv.h',
-        'base/simd/convert_yuv_to_rgb_c.cc',
-        'base/simd/convert_yuv_to_rgb.h',
-        'base/simd/filter_yuv.h',
-        'base/simd/filter_yuv_c.cc',
-        'base/simd/yuv_to_rgb_table.cc',
-        'base/simd/yuv_to_rgb_table.h',
-      ],
-    },
-    {
-      'target_name': 'media_unittests',
-      'type': 'executable',
-      'dependencies': [
-        'media',
-        'media_test_support',
-        'yuv_convert',
-        '../base/base.gyp:base',
-        '../base/base.gyp:base_i18n',
-        '../base/base.gyp:test_support_base',
-        '../testing/gmock.gyp:gmock',
-        '../testing/gtest.gyp:gtest',
-        '../ui/ui.gyp:ui',
-      ],
-      'sources': [
-        'audio/async_socket_io_handler_unittest.cc',
-        'audio/audio_input_controller_unittest.cc',
-        'audio/audio_input_device_unittest.cc',
-        'audio/audio_input_unittest.cc',
-        'audio/audio_input_volume_unittest.cc',
-        'audio/audio_low_latency_input_output_unittest.cc',
-        'audio/audio_output_controller_unittest.cc',
-        'audio/audio_output_proxy_unittest.cc',
-        'audio/audio_parameters_unittest.cc',
-        'audio/audio_util_unittest.cc',
-        'audio/cross_process_notification_unittest.cc',
-        'audio/linux/alsa_output_unittest.cc',
-        'audio/mac/audio_low_latency_input_mac_unittest.cc',
-        'audio/mac/audio_output_mac_unittest.cc',
-        'audio/simple_sources_unittest.cc',
-        'audio/win/audio_low_latency_input_win_unittest.cc',
-        'audio/win/audio_low_latency_output_win_unittest.cc',
-        'audio/win/audio_output_win_unittest.cc',
-        'base/audio_renderer_mixer_unittest.cc',
-        'base/audio_renderer_mixer_input_unittest.cc',
-        'base/buffers_unittest.cc',
-        'base/clock_unittest.cc',
-        'base/composite_filter_unittest.cc',
-        'base/data_buffer_unittest.cc',
-        'base/decoder_buffer_unittest.cc',
-        'base/djb2_unittest.cc',
-        'base/fake_audio_render_callback.cc',
-        'base/fake_audio_render_callback.h',
-        'base/filter_collection_unittest.cc',
-        'base/h264_bitstream_converter_unittest.cc',
-        'base/pipeline_unittest.cc',
-        'base/ranges_unittest.cc',
-        'base/run_all_unittests.cc',
-        'base/seekable_buffer_unittest.cc',
-        'base/state_matrix_unittest.cc',
-        'base/test_data_util.cc',
-        'base/test_data_util.h',
-        'base/video_frame_unittest.cc',
-        'base/video_util_unittest.cc',
-        'base/yuv_convert_unittest.cc',
-        'crypto/aes_decryptor_unittest.cc',
-        'ffmpeg/ffmpeg_common_unittest.cc',
-        'filters/audio_renderer_algorithm_unittest.cc',
-        'filters/audio_renderer_impl_unittest.cc',
-        'filters/bitstream_converter_unittest.cc',
-        'filters/chunk_demuxer_unittest.cc',
-        'filters/ffmpeg_audio_decoder_unittest.cc',
-        'filters/ffmpeg_decoder_unittest.h',
-        'filters/ffmpeg_demuxer_unittest.cc',
-        'filters/ffmpeg_glue_unittest.cc',
-        'filters/ffmpeg_h264_bitstream_converter_unittest.cc',
-        'filters/ffmpeg_video_decoder_unittest.cc',
-        'filters/file_data_source_unittest.cc',
-        'filters/pipeline_integration_test.cc',
-        'filters/pipeline_integration_test_base.cc',
-        'filters/source_buffer_stream_unittest.cc',
-        'filters/video_renderer_base_unittest.cc',
-        'video/capture/video_capture_device_unittest.cc',
-        'webm/cluster_builder.cc',
-        'webm/cluster_builder.h',
-        'webm/webm_cluster_parser_unittest.cc',
-        'webm/webm_content_encodings_client_unittest.cc',
-        'webm/webm_parser_unittest.cc',
-      ],
-      'conditions': [
-        ['os_posix==1 and OS!=\"mac\"', {
-          'conditions': [
-            ['linux_use_tcmalloc==1', {
-              'dependencies': [
-                '../base/allocator/allocator.gyp:allocator',
-              ],
-            }],
-          ],
-        }],
-        ['OS != \"android\"', {
-          'dependencies': [
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-        }],
-        ['OS == \"android\"', {
-          'sources!': [
-            'audio/audio_input_volume_unittest.cc',
-            'base/test_data_util.cc',
-            'base/test_data_util.h',
-            'ffmpeg/ffmpeg_common_unittest.cc',
-            'filters/ffmpeg_audio_decoder_unittest.cc',
-            'filters/bitstream_converter_unittest.cc',
-            'filters/chunk_demuxer_unittest.cc',
-            'filters/ffmpeg_demuxer_unittest.cc',
-            'filters/ffmpeg_glue_unittest.cc',
-            'filters/ffmpeg_h264_bitstream_converter_unittest.cc',
-            'filters/ffmpeg_video_decoder_unittest.cc',
-            'filters/pipeline_integration_test.cc',
-            'filters/pipeline_integration_test_base.cc',
-            'mp4/mp4_stream_parser_unittest.cc',
-            'webm/webm_cluster_parser_unittest.cc',
-          ],
-        }],
-        ['OS == \"linux\"', {
-          'conditions': [
-            ['use_cras == 1', {
-              'sources': [
-                'audio/linux/cras_output_unittest.cc',
-              ],
-              'defines': [
-                'USE_CRAS',
-              ],
-            }],
-          ],
-        }],
-        [ 'target_arch==\"ia32\" or target_arch==\"x64\"', {
-          'sources': [
-            'base/simd/convert_rgb_to_yuv_unittest.cc',
-          ],
-        }],
-        ['proprietary_codecs==1 or branding==\"Chrome\"', {
-          'sources': [
-            'mp4/avc_unittest.cc',
-            'mp4/box_reader_unittest.cc',
-            'mp4/mp4_stream_parser_unittest.cc',
-            'mp4/offset_byte_queue_unittest.cc',
-          ],
-        }],
-      ],
-    },
-    {
-      'target_name': 'media_test_support',
-      'type': 'static_library',
-      'dependencies': [
-        'media',
-        '../base/base.gyp:base',
-        '../testing/gmock.gyp:gmock',
-        '../testing/gtest.gyp:gtest',
-      ],
-      'sources': [
-        'audio/test_audio_input_controller_factory.cc',
-        'audio/test_audio_input_controller_factory.h',
-        'base/mock_callback.cc',
-        'base/mock_callback.h',
-        'base/mock_data_source_host.cc',
-        'base/mock_data_source_host.h',
-        'base/mock_demuxer_host.cc',
-        'base/mock_demuxer_host.h',
-        'base/mock_filter_host.cc',
-        'base/mock_filter_host.h',
-        'base/mock_filters.cc',
-        'base/mock_filters.h',
-      ],
-    },
-    {
-      'target_name': 'scaler_bench',
-      'type': 'executable',
-      'dependencies': [
-        'media',
-        'yuv_convert',
-        '../base/base.gyp:base',
-        '../skia/skia.gyp:skia',
-      ],
-      'sources': [
-        'tools/scaler_bench/scaler_bench.cc',
-      ],
-    },
-    {
-      'target_name': 'qt_faststart',
-      'type': 'executable',
-      'sources': [
-        'tools/qt_faststart/qt_faststart.c'
-      ],
-    },
-    {
-      'target_name': 'seek_tester',
-      'type': 'executable',
-      'dependencies': [
-        'media',
-        '../base/base.gyp:base',
-      ],
-      'sources': [
-        'tools/seek_tester/seek_tester.cc',
-      ],
-    },
-  ],
-  'conditions': [
-    ['OS==\"win\"', {
-      'targets': [
-        {
-          'target_name': 'player_wtl',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'yuv_convert',
-            '../base/base.gyp:base',
-            '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-            '../ui/ui.gyp:ui',
-          ],
-          'include_dirs': [
-            '<(DEPTH)/third_party/wtl/include',
-          ],
-          'sources': [
-            'tools/player_wtl/list.h',
-            'tools/player_wtl/mainfrm.h',
-            'tools/player_wtl/movie.cc',
-            'tools/player_wtl/movie.h',
-            'tools/player_wtl/player_wtl.cc',
-            'tools/player_wtl/player_wtl.rc',
-            'tools/player_wtl/props.h',
-            'tools/player_wtl/seek.h',
-            'tools/player_wtl/resource.h',
-            'tools/player_wtl/view.h',
-          ],
-          'msvs_settings': {
-            'VCLinkerTool': {
-              'SubSystem': '2',         # Set /SUBSYSTEM:WINDOWS
-            },
-          },
-          'defines': [
-            '_CRT_SECURE_NO_WARNINGS=1',
-          ],
-        },
-      ],
-    }],
-    ['OS == \"win\" or toolkit_uses_gtk == 1', {
-      'targets': [
-        {
-          'target_name': 'shader_bench',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'yuv_convert',
-            '../base/base.gyp:base',
-            '../ui/gl/gl.gyp:gl',
-          ],
-          'sources': [
-            'tools/shader_bench/shader_bench.cc',
-            'tools/shader_bench/cpu_color_painter.cc',
-            'tools/shader_bench/cpu_color_painter.h',
-            'tools/shader_bench/gpu_color_painter.cc',
-            'tools/shader_bench/gpu_color_painter.h',
-            'tools/shader_bench/gpu_painter.cc',
-            'tools/shader_bench/gpu_painter.h',
-            'tools/shader_bench/painter.cc',
-            'tools/shader_bench/painter.h',
-            'tools/shader_bench/window.cc',
-            'tools/shader_bench/window.h',
-          ],
-          'conditions': [
-            ['toolkit_uses_gtk == 1', {
-              'dependencies': [
-                '../build/linux/system.gyp:gtk',
-              ],
-              'sources': [
-                'tools/shader_bench/window_linux.cc',
-              ],
-            }],
-            ['OS==\"win\"', {
-              'dependencies': [
-                '../third_party/angle/src/build_angle.gyp:libEGL',
-                '../third_party/angle/src/build_angle.gyp:libGLESv2',
-              ],
-              'sources': [
-                'tools/shader_bench/window_win.cc',
-              ],
-            }],
-          ],
-        },
-      ],
-    }],
-    ['OS == \"linux\" and target_arch != \"arm\"', {
-      'targets': [
-        {
-          'target_name': 'tile_render_bench',
-          'type': 'executable',
-          'dependencies': [
-            '../base/base.gyp:base',
-            '../ui/gl/gl.gyp:gl',
-          ],
-          'libraries': [
-            '-lGL',
-            '-ldl',
-          ],
-          'sources': [
-            'tools/tile_render_bench/tile_render_bench.cc',
-          ],
-        },
-      ],
-    }],
-    ['os_posix == 1 and OS != \"mac\" and OS != \"android\"', {
-      'targets': [
-        {
-          'target_name': 'player_x11',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'yuv_convert',
-            '../base/base.gyp:base',
-            '../ui/gl/gl.gyp:gl',
-          ],
-          'link_settings': {
-            'libraries': [
-              '-ldl',
-              '-lX11',
-              '-lXrender',
-              '-lXext',
-            ],
-          },
-          'sources': [
-            'tools/player_x11/data_source_logger.cc',
-            'tools/player_x11/data_source_logger.h',
-            'tools/player_x11/gl_video_renderer.cc',
-            'tools/player_x11/gl_video_renderer.h',
-            'tools/player_x11/player_x11.cc',
-            'tools/player_x11/x11_video_renderer.cc',
-            'tools/player_x11/x11_video_renderer.h',
-          ],
-        },
-      ],
-    }],
-    ['OS == \"android\"', {
-      'targets': [
-        {
-          'target_name': 'player_android',
-          'type': 'static_library',
-          'sources': [
-            'base/android/media_player_bridge.cc',
-            'base/android/media_player_bridge.h',
-          ],
-          'dependencies': [
-            '../base/base.gyp:base',
-          ],
-          'include_dirs': [
-            '<(SHARED_INTERMEDIATE_DIR)/media',
-          ],
-          'actions': [
-            {
-              'action_name': 'generate-jni-headers',
-              'inputs': [
-                '../base/android/jni_generator/jni_generator.py',
-                'base/android/java/src/org/chromium/media/MediaPlayerListener.java',
-              ],
-              'outputs': [
-                '<(SHARED_INTERMEDIATE_DIR)/media/jni/media_player_listener_jni.h',
-              ],
-              'action': [
-                'python',
-                '<(DEPTH)/base/android/jni_generator/jni_generator.py',
-                '-o',
-                '<@(_inputs)',
-                '<@(_outputs)',
-              ],
-            },
-          ],
-        },
-        {
-          'target_name': 'media_java',
-          'type': 'none',
-          'dependencies': [ '../base/base.gyp:base_java' ],
-          'variables': {
-            'package_name': 'media',
-            'java_in_dir': 'base/android/java',
-          },
-          'includes': [ '../build/java.gypi' ],
-        },
-
-      ],
-    }, { # OS != \"android\"'
-      # Android does not use ffmpeg, so disable the targets which require it.
-      'targets': [
-        {
-          'target_name': 'ffmpeg_unittests',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'media_test_support',
-            '../base/base.gyp:base',
-            '../base/base.gyp:base_i18n',
-            '../base/base.gyp:test_support_base',
-            '../base/base.gyp:test_support_perf',
-            '../testing/gtest.gyp:gtest',
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-          'sources': [
-            'ffmpeg/ffmpeg_unittest.cc',
-          ],
-          'conditions': [
-            ['toolkit_uses_gtk == 1', {
-              'dependencies': [
-                # Needed for the following #include chain:
-                #   base/run_all_unittests.cc
-                #   ../base/test_suite.h
-                #   gtk/gtk.h
-                '../build/linux/system.gyp:gtk',
-              ],
-              'conditions': [
-                ['linux_use_tcmalloc==1', {
-                  'dependencies': [
-                    '../base/allocator/allocator.gyp:allocator',
-                  ],
-                }],
-              ],
-            }],
-          ],
-        },
-        {
-          'target_name': 'ffmpeg_regression_tests',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            'media_test_support',
-            '../base/base.gyp:test_support_base',
-            '../testing/gmock.gyp:gmock',
-            '../testing/gtest.gyp:gtest',
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-          'sources': [
-            'base/test_data_util.cc',
-            'base/run_all_unittests.cc',
-            'ffmpeg/ffmpeg_regression_tests.cc',
-            'filters/pipeline_integration_test_base.cc',
-          ],
-          'conditions': [
-            ['os_posix==1 and OS!=\"mac\"', {
-              'conditions': [
-                ['linux_use_tcmalloc==1', {
-                  'dependencies': [
-                    '../base/allocator/allocator.gyp:allocator',
-                  ],
-                }],
-              ],
-            }],
-          ],
-        },
-        {
-          'target_name': 'ffmpeg_tests',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            '../base/base.gyp:base',
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-          'sources': [
-            'test/ffmpeg_tests/ffmpeg_tests.cc',
-          ],
-        },
-        {
-          'target_name': 'media_bench',
-          'type': 'executable',
-          'dependencies': [
-            'media',
-            '../base/base.gyp:base',
-            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
-          ],
-          'sources': [
-            'tools/media_bench/media_bench.cc',
-          ],
-        },
-      ],
-    }]
-  ],
-}
-" 0 64 (face font-lock-comment-face) 64 137 (face font-lock-comment-face) 137 166 (face font-lock-comment-face) 166 171 nil 171 172 (face font-lock-string-face) 172 181 (face font-lock-keyword-face) 181 182 (face font-lock-string-face) 182 190 nil 190 191 (face font-lock-string-face) 191 204 (face font-lock-variable-name-face) 204 205 (face font-lock-string-face) 205 214 nil 214 269 (face font-lock-comment-face) 269 273 nil 273 274 (face font-lock-string-face) 274 289 (face font-lock-variable-name-face) 289 290 (face font-lock-string-face) 290 299 nil 299 365 (face font-lock-comment-face) 365 369 nil 369 370 (face font-lock-string-face) 370 379 (face font-lock-variable-name-face) 379 380 (face font-lock-string-face) 380 392 nil 392 393 (face font-lock-string-face) 393 400 (face font-lock-keyword-face) 400 401 (face font-lock-string-face) 401 417 nil 417 418 (face font-lock-string-face) 418 429 (face font-lock-keyword-face) 429 430 (face font-lock-string-face) 430 432 nil 432 433 (face font-lock-string-face) 433 438 (face font-lock-function-name-face) 438 439 (face font-lock-string-face) 439 447 nil 447 448 (face font-lock-string-face) 448 452 (face font-lock-keyword-face) 452 453 (face font-lock-string-face) 453 455 nil 455 458 (face font-lock-string-face) 458 467 (face font-lock-variable-name-face) 467 469 (face font-lock-string-face) 469 477 nil 477 478 (face font-lock-string-face) 478 490 (face font-lock-keyword-face) 490 491 (face font-lock-string-face) 491 503 nil 503 504 (face font-lock-string-face) 504 515 (face font-lock-function-name-face) 515 516 (face font-lock-string-face) 516 526 nil 526 527 (face font-lock-string-face) 527 548 (face font-lock-function-name-face) 548 549 (face font-lock-string-face) 549 559 nil 559 560 (face font-lock-string-face) 560 643 (face font-lock-function-name-face) 643 644 (face font-lock-string-face) 644 654 nil 654 655 (face font-lock-string-face) 655 696 (face font-lock-function-name-face) 696 697 (face font-lock-string-face) 697 707 nil 707 708 (face font-lock-string-face) 708 735 (face font-lock-function-name-face) 735 736 (face font-lock-string-face) 736 746 nil 746 747 (face font-lock-string-face) 747 784 (face font-lock-function-name-face) 784 785 (face font-lock-string-face) 785 795 nil 795 796 (face font-lock-string-face) 796 811 (face font-lock-function-name-face) 811 812 (face font-lock-string-face) 812 829 nil 829 830 (face font-lock-string-face) 830 837 (face font-lock-keyword-face) 837 838 (face font-lock-string-face) 838 850 nil 850 851 (face font-lock-string-face) 851 871 (face font-lock-preprocessor-face) 871 872 (face font-lock-string-face) 872 889 nil 889 890 (face font-lock-string-face) 890 902 (face font-lock-keyword-face) 902 903 (face font-lock-string-face) 903 915 nil 915 916 (face font-lock-string-face) 916 918 (face font-lock-constant-face) 918 919 (face font-lock-string-face) 919 936 nil 936 937 (face font-lock-string-face) 937 944 (face font-lock-keyword-face) 944 945 (face font-lock-string-face) 945 957 nil 957 958 (face font-lock-string-face) 958 996 (face font-lock-constant-face) 996 997 (face font-lock-string-face) 997 1007 nil 1007 1008 (face font-lock-string-face) 1008 1045 (face font-lock-constant-face) 1045 1046 (face font-lock-string-face) 1046 1056 nil 1056 1057 (face font-lock-string-face) 1057 1100 (face font-lock-constant-face) 1100 1101 (face font-lock-string-face) 1101 1111 nil 1111 1112 (face font-lock-string-face) 1112 1154 (face font-lock-constant-face) 1154 1155 (face font-lock-string-face) 1155 1165 nil 1165 1166 (face font-lock-string-face) 1166 1197 (face font-lock-constant-face) 1197 1198 (face font-lock-string-face) 1198 1208 nil 1208 1209 (face font-lock-string-face) 1209 1239 (face font-lock-constant-face) 1239 1240 (face font-lock-string-face) 1240 1250 nil 1250 1251 (face font-lock-string-face) 1251 1283 (face font-lock-constant-face) 1283 1284 (face font-lock-string-face) 1284 1294 nil 1294 1295 (face font-lock-string-face) 1295 1326 (face font-lock-constant-face) 1326 1327 (face font-lock-string-face) 1327 1337 nil 1337 1338 (face font-lock-string-face) 1338 1369 (face font-lock-constant-face) 1369 1370 (face font-lock-string-face) 1370 1380 nil 1380 1381 (face font-lock-string-face) 1381 1419 (face font-lock-constant-face) 1419 1420 (face font-lock-string-face) 1420 1430 nil 1430 1431 (face font-lock-string-face) 1431 1467 (face font-lock-constant-face) 1467 1468 (face font-lock-string-face) 1468 1478 nil 1478 1479 (face font-lock-string-face) 1479 1507 (face font-lock-constant-face) 1507 1508 (face font-lock-string-face) 1508 1518 nil 1518 1519 (face font-lock-string-face) 1519 1546 (face font-lock-constant-face) 1546 1547 (face font-lock-string-face) 1547 1557 nil 1557 1558 (face font-lock-string-face) 1558 1574 (face font-lock-constant-face) 1574 1575 (face font-lock-string-face) 1575 1585 nil 1585 1586 (face font-lock-string-face) 1586 1617 (face font-lock-constant-face) 1617 1618 (face font-lock-string-face) 1618 1628 nil 1628 1629 (face font-lock-string-face) 1629 1659 (face font-lock-constant-face) 1659 1660 (face font-lock-string-face) 1660 1670 nil 1670 1671 (face font-lock-string-face) 1671 1703 (face font-lock-constant-face) 1703 1704 (face font-lock-string-face) 1704 1714 nil 1714 1715 (face font-lock-string-face) 1715 1746 (face font-lock-constant-face) 1746 1747 (face font-lock-string-face) 1747 1757 nil 1757 1758 (face font-lock-string-face) 1758 1784 (face font-lock-constant-face) 1784 1785 (face font-lock-string-face) 1785 1795 nil 1795 1796 (face font-lock-string-face) 1796 1821 (face font-lock-constant-face) 1821 1822 (face font-lock-string-face) 1822 1832 nil 1832 1833 (face font-lock-string-face) 1833 1855 (face font-lock-constant-face) 1855 1856 (face font-lock-string-face) 1856 1866 nil 1866 1867 (face font-lock-string-face) 1867 1888 (face font-lock-constant-face) 1888 1889 (face font-lock-string-face) 1889 1899 nil 1899 1900 (face font-lock-string-face) 1900 1927 (face font-lock-constant-face) 1927 1928 (face font-lock-string-face) 1928 1938 nil 1938 1939 (face font-lock-string-face) 1939 1965 (face font-lock-constant-face) 1965 1966 (face font-lock-string-face) 1966 1976 nil 1976 1977 (face font-lock-string-face) 1977 2009 (face font-lock-constant-face) 2009 2010 (face font-lock-string-face) 2010 2020 nil 2020 2021 (face font-lock-string-face) 2021 2052 (face font-lock-constant-face) 2052 2053 (face font-lock-string-face) 2053 2063 nil 2063 2064 (face font-lock-string-face) 2064 2096 (face font-lock-constant-face) 2096 2097 (face font-lock-string-face) 2097 2107 nil 2107 2108 (face font-lock-string-face) 2108 2139 (face font-lock-constant-face) 2139 2140 (face font-lock-string-face) 2140 2150 nil 2150 2151 (face font-lock-string-face) 2151 2188 (face font-lock-constant-face) 2188 2189 (face font-lock-string-face) 2189 2199 nil 2199 2200 (face font-lock-string-face) 2200 2236 (face font-lock-constant-face) 2236 2237 (face font-lock-string-face) 2237 2247 nil 2247 2248 (face font-lock-string-face) 2248 2275 (face font-lock-constant-face) 2275 2276 (face font-lock-string-face) 2276 2286 nil 2286 2287 (face font-lock-string-face) 2287 2313 (face font-lock-constant-face) 2313 2314 (face font-lock-string-face) 2314 2324 nil 2324 2325 (face font-lock-string-face) 2325 2352 (face font-lock-constant-face) 2352 2353 (face font-lock-string-face) 2353 2363 nil 2363 2364 (face font-lock-string-face) 2364 2390 (face font-lock-constant-face) 2390 2391 (face font-lock-string-face) 2391 2401 nil 2401 2402 (face font-lock-string-face) 2402 2427 (face font-lock-constant-face) 2427 2428 (face font-lock-string-face) 2428 2438 nil 2438 2439 (face font-lock-string-face) 2439 2463 (face font-lock-constant-face) 2463 2464 (face font-lock-string-face) 2464 2474 nil 2474 2475 (face font-lock-string-face) 2475 2494 (face font-lock-constant-face) 2494 2495 (face font-lock-string-face) 2495 2505 nil 2505 2506 (face font-lock-string-face) 2506 2524 (face font-lock-constant-face) 2524 2525 (face font-lock-string-face) 2525 2535 nil 2535 2536 (face font-lock-string-face) 2536 2571 (face font-lock-constant-face) 2571 2572 (face font-lock-string-face) 2572 2582 nil 2582 2583 (face font-lock-string-face) 2583 2617 (face font-lock-constant-face) 2617 2618 (face font-lock-string-face) 2618 2628 nil 2628 2629 (face font-lock-string-face) 2629 2668 (face font-lock-constant-face) 2668 2669 (face font-lock-string-face) 2669 2679 nil 2679 2680 (face font-lock-string-face) 2680 2721 (face font-lock-constant-face) 2721 2722 (face font-lock-string-face) 2722 2732 nil 2732 2733 (face font-lock-string-face) 2733 2765 (face font-lock-constant-face) 2765 2766 (face font-lock-string-face) 2766 2776 nil 2776 2777 (face font-lock-string-face) 2777 2808 (face font-lock-constant-face) 2808 2809 (face font-lock-string-face) 2809 2819 nil 2819 2820 (face font-lock-string-face) 2820 2853 (face font-lock-constant-face) 2853 2854 (face font-lock-string-face) 2854 2864 nil 2864 2865 (face font-lock-string-face) 2865 2897 (face font-lock-constant-face) 2897 2898 (face font-lock-string-face) 2898 2908 nil 2908 2909 (face font-lock-string-face) 2909 2943 (face font-lock-constant-face) 2943 2944 (face font-lock-string-face) 2944 2954 nil 2954 2955 (face font-lock-string-face) 2955 2988 (face font-lock-constant-face) 2988 2989 (face font-lock-string-face) 2989 2999 nil 2999 3000 (face font-lock-string-face) 3000 3025 (face font-lock-constant-face) 3025 3026 (face font-lock-string-face) 3026 3036 nil 3036 3037 (face font-lock-string-face) 3037 3061 (face font-lock-constant-face) 3061 3062 (face font-lock-string-face) 3062 3072 nil 3072 3073 (face font-lock-string-face) 3073 3099 (face font-lock-constant-face) 3099 3100 (face font-lock-string-face) 3100 3110 nil 3110 3111 (face font-lock-string-face) 3111 3136 (face font-lock-constant-face) 3136 3137 (face font-lock-string-face) 3137 3147 nil 3147 3148 (face font-lock-string-face) 3148 3172 (face font-lock-constant-face) 3172 3173 (face font-lock-string-face) 3173 3183 nil 3183 3184 (face font-lock-string-face) 3184 3207 (face font-lock-constant-face) 3207 3208 (face font-lock-string-face) 3208 3218 nil 3218 3219 (face font-lock-string-face) 3219 3246 (face font-lock-constant-face) 3246 3247 (face font-lock-string-face) 3247 3257 nil 3257 3258 (face font-lock-string-face) 3258 3284 (face font-lock-constant-face) 3284 3285 (face font-lock-string-face) 3285 3295 nil 3295 3296 (face font-lock-string-face) 3296 3322 (face font-lock-constant-face) 3322 3323 (face font-lock-string-face) 3323 3333 nil 3333 3334 (face font-lock-string-face) 3334 3359 (face font-lock-constant-face) 3359 3360 (face font-lock-string-face) 3360 3370 nil 3370 3371 (face font-lock-string-face) 3371 3409 (face font-lock-constant-face) 3409 3410 (face font-lock-string-face) 3410 3420 nil 3420 3421 (face font-lock-string-face) 3421 3458 (face font-lock-constant-face) 3458 3459 (face font-lock-string-face) 3459 3469 nil 3469 3470 (face font-lock-string-face) 3470 3498 (face font-lock-constant-face) 3498 3499 (face font-lock-string-face) 3499 3509 nil 3509 3510 (face font-lock-string-face) 3510 3537 (face font-lock-constant-face) 3537 3538 (face font-lock-string-face) 3538 3548 nil 3548 3549 (face font-lock-string-face) 3549 3589 (face font-lock-constant-face) 3589 3590 (face font-lock-string-face) 3590 3600 nil 3600 3601 (face font-lock-string-face) 3601 3640 (face font-lock-constant-face) 3640 3641 (face font-lock-string-face) 3641 3651 nil 3651 3652 (face font-lock-string-face) 3652 3693 (face font-lock-constant-face) 3693 3694 (face font-lock-string-face) 3694 3704 nil 3704 3705 (face font-lock-string-face) 3705 3745 (face font-lock-constant-face) 3745 3746 (face font-lock-string-face) 3746 3756 nil 3756 3757 (face font-lock-string-face) 3757 3787 (face font-lock-constant-face) 3787 3788 (face font-lock-string-face) 3788 3798 nil 3798 3799 (face font-lock-string-face) 3799 3828 (face font-lock-constant-face) 3828 3829 (face font-lock-string-face) 3829 3839 nil 3839 3840 (face font-lock-string-face) 3840 3869 (face font-lock-constant-face) 3869 3870 (face font-lock-string-face) 3870 3880 nil 3880 3881 (face font-lock-string-face) 3881 3909 (face font-lock-constant-face) 3909 3910 (face font-lock-string-face) 3910 3920 nil 3920 3921 (face font-lock-string-face) 3921 3945 (face font-lock-constant-face) 3945 3946 (face font-lock-string-face) 3946 3956 nil 3956 3957 (face font-lock-string-face) 3957 3980 (face font-lock-constant-face) 3980 3981 (face font-lock-string-face) 3981 3991 nil 3991 3992 (face font-lock-string-face) 3992 4019 (face font-lock-constant-face) 4019 4020 (face font-lock-string-face) 4020 4030 nil 4030 4031 (face font-lock-string-face) 4031 4057 (face font-lock-constant-face) 4057 4058 (face font-lock-string-face) 4058 4068 nil 4068 4069 (face font-lock-string-face) 4069 4090 (face font-lock-constant-face) 4090 4091 (face font-lock-string-face) 4091 4101 nil 4101 4102 (face font-lock-string-face) 4102 4122 (face font-lock-constant-face) 4122 4123 (face font-lock-string-face) 4123 4133 nil 4133 4134 (face font-lock-string-face) 4134 4157 (face font-lock-constant-face) 4157 4158 (face font-lock-string-face) 4158 4168 nil 4168 4169 (face font-lock-string-face) 4169 4191 (face font-lock-constant-face) 4191 4192 (face font-lock-string-face) 4192 4202 nil 4202 4203 (face font-lock-string-face) 4203 4243 (face font-lock-constant-face) 4243 4244 (face font-lock-string-face) 4244 4254 nil 4254 4255 (face font-lock-string-face) 4255 4294 (face font-lock-constant-face) 4294 4295 (face font-lock-string-face) 4295 4305 nil 4305 4306 (face font-lock-string-face) 4306 4347 (face font-lock-constant-face) 4347 4348 (face font-lock-string-face) 4348 4358 nil 4358 4359 (face font-lock-string-face) 4359 4399 (face font-lock-constant-face) 4399 4400 (face font-lock-string-face) 4400 4410 nil 4410 4411 (face font-lock-string-face) 4411 4441 (face font-lock-constant-face) 4441 4442 (face font-lock-string-face) 4442 4452 nil 4452 4453 (face font-lock-string-face) 4453 4482 (face font-lock-constant-face) 4482 4483 (face font-lock-string-face) 4483 4493 nil 4493 4494 (face font-lock-string-face) 4494 4523 (face font-lock-constant-face) 4523 4524 (face font-lock-string-face) 4524 4534 nil 4534 4535 (face font-lock-string-face) 4535 4563 (face font-lock-constant-face) 4563 4564 (face font-lock-string-face) 4564 4574 nil 4574 4575 (face font-lock-string-face) 4575 4610 (face font-lock-constant-face) 4610 4611 (face font-lock-string-face) 4611 4621 nil 4621 4622 (face font-lock-string-face) 4622 4656 (face font-lock-constant-face) 4656 4657 (face font-lock-string-face) 4657 4667 nil 4667 4668 (face font-lock-string-face) 4668 4697 (face font-lock-constant-face) 4697 4698 (face font-lock-string-face) 4698 4708 nil 4708 4709 (face font-lock-string-face) 4709 4737 (face font-lock-constant-face) 4737 4738 (face font-lock-string-face) 4738 4748 nil 4748 4749 (face font-lock-string-face) 4749 4780 (face font-lock-constant-face) 4780 4781 (face font-lock-string-face) 4781 4791 nil 4791 4792 (face font-lock-string-face) 4792 4822 (face font-lock-constant-face) 4822 4823 (face font-lock-string-face) 4823 4833 nil 4833 4834 (face font-lock-string-face) 4834 4869 (face font-lock-constant-face) 4869 4870 (face font-lock-string-face) 4870 4880 nil 4880 4881 (face font-lock-string-face) 4881 4915 (face font-lock-constant-face) 4915 4916 (face font-lock-string-face) 4916 4926 nil 4926 4927 (face font-lock-string-face) 4927 4948 (face font-lock-constant-face) 4948 4949 (face font-lock-string-face) 4949 4959 nil 4959 4960 (face font-lock-string-face) 4960 4980 (face font-lock-constant-face) 4980 4981 (face font-lock-string-face) 4981 4991 nil 4991 4992 (face font-lock-string-face) 4992 5020 (face font-lock-constant-face) 5020 5021 (face font-lock-string-face) 5021 5031 nil 5031 5032 (face font-lock-string-face) 5032 5059 (face font-lock-constant-face) 5059 5060 (face font-lock-string-face) 5060 5070 nil 5070 5071 (face font-lock-string-face) 5071 5092 (face font-lock-constant-face) 5092 5093 (face font-lock-string-face) 5093 5103 nil 5103 5104 (face font-lock-string-face) 5104 5132 (face font-lock-constant-face) 5132 5133 (face font-lock-string-face) 5133 5143 nil 5143 5144 (face font-lock-string-face) 5144 5171 (face font-lock-constant-face) 5171 5172 (face font-lock-string-face) 5172 5182 nil 5182 5183 (face font-lock-string-face) 5183 5217 (face font-lock-constant-face) 5217 5218 (face font-lock-string-face) 5218 5228 nil 5228 5229 (face font-lock-string-face) 5229 5262 (face font-lock-constant-face) 5262 5263 (face font-lock-string-face) 5263 5273 nil 5273 5274 (face font-lock-string-face) 5274 5297 (face font-lock-constant-face) 5297 5298 (face font-lock-string-face) 5298 5308 nil 5308 5309 (face font-lock-string-face) 5309 5324 (face font-lock-constant-face) 5324 5325 (face font-lock-string-face) 5325 5335 nil 5335 5336 (face font-lock-string-face) 5336 5350 (face font-lock-constant-face) 5350 5351 (face font-lock-string-face) 5351 5361 nil 5361 5362 (face font-lock-string-face) 5362 5380 (face font-lock-constant-face) 5380 5381 (face font-lock-string-face) 5381 5391 nil 5391 5392 (face font-lock-string-face) 5392 5409 (face font-lock-constant-face) 5409 5410 (face font-lock-string-face) 5410 5420 nil 5420 5421 (face font-lock-string-face) 5421 5443 (face font-lock-constant-face) 5443 5444 (face font-lock-string-face) 5444 5454 nil 5454 5455 (face font-lock-string-face) 5455 5476 (face font-lock-constant-face) 5476 5477 (face font-lock-string-face) 5477 5487 nil 5487 5488 (face font-lock-string-face) 5488 5501 (face font-lock-constant-face) 5501 5502 (face font-lock-string-face) 5502 5512 nil 5512 5513 (face font-lock-string-face) 5513 5525 (face font-lock-constant-face) 5525 5526 (face font-lock-string-face) 5526 5536 nil 5536 5537 (face font-lock-string-face) 5537 5561 (face font-lock-constant-face) 5561 5562 (face font-lock-string-face) 5562 5572 nil 5572 5573 (face font-lock-string-face) 5573 5596 (face font-lock-constant-face) 5596 5597 (face font-lock-string-face) 5597 5607 nil 5607 5608 (face font-lock-string-face) 5608 5627 (face font-lock-constant-face) 5627 5628 (face font-lock-string-face) 5628 5638 nil 5638 5639 (face font-lock-string-face) 5639 5657 (face font-lock-constant-face) 5657 5658 (face font-lock-string-face) 5658 5668 nil 5668 5669 (face font-lock-string-face) 5669 5688 (face font-lock-constant-face) 5688 5689 (face font-lock-string-face) 5689 5699 nil 5699 5700 (face font-lock-string-face) 5700 5718 (face font-lock-constant-face) 5718 5719 (face font-lock-string-face) 5719 5729 nil 5729 5730 (face font-lock-string-face) 5730 5752 (face font-lock-constant-face) 5752 5753 (face font-lock-string-face) 5753 5763 nil 5763 5764 (face font-lock-string-face) 5764 5785 (face font-lock-constant-face) 5785 5786 (face font-lock-string-face) 5786 5796 nil 5796 5797 (face font-lock-string-face) 5797 5819 (face font-lock-constant-face) 5819 5820 (face font-lock-string-face) 5820 5830 nil 5830 5831 (face font-lock-string-face) 5831 5852 (face font-lock-constant-face) 5852 5853 (face font-lock-string-face) 5853 5863 nil 5863 5864 (face font-lock-string-face) 5864 5880 (face font-lock-constant-face) 5880 5881 (face font-lock-string-face) 5881 5891 nil 5891 5892 (face font-lock-string-face) 5892 5915 (face font-lock-constant-face) 5915 5916 (face font-lock-string-face) 5916 5926 nil 5926 5927 (face font-lock-string-face) 5927 5942 (face font-lock-constant-face) 5942 5943 (face font-lock-string-face) 5943 5953 nil 5953 5954 (face font-lock-string-face) 5954 5968 (face font-lock-constant-face) 5968 5969 (face font-lock-string-face) 5969 5979 nil 5979 5980 (face font-lock-string-face) 5980 6002 (face font-lock-constant-face) 6002 6003 (face font-lock-string-face) 6003 6013 nil 6013 6014 (face font-lock-string-face) 6014 6035 (face font-lock-constant-face) 6035 6036 (face font-lock-string-face) 6036 6046 nil 6046 6047 (face font-lock-string-face) 6047 6059 (face font-lock-constant-face) 6059 6060 (face font-lock-string-face) 6060 6070 nil 6070 6071 (face font-lock-string-face) 6071 6082 (face font-lock-constant-face) 6082 6083 (face font-lock-string-face) 6083 6093 nil 6093 6094 (face font-lock-string-face) 6094 6119 (face font-lock-constant-face) 6119 6120 (face font-lock-string-face) 6120 6130 nil 6130 6131 (face font-lock-string-face) 6131 6155 (face font-lock-constant-face) 6155 6156 (face font-lock-string-face) 6156 6166 nil 6166 6167 (face font-lock-string-face) 6167 6185 (face font-lock-constant-face) 6185 6186 (face font-lock-string-face) 6186 6196 nil 6196 6197 (face font-lock-string-face) 6197 6212 (face font-lock-constant-face) 6212 6213 (face font-lock-string-face) 6213 6223 nil 6223 6224 (face font-lock-string-face) 6224 6238 (face font-lock-constant-face) 6238 6239 (face font-lock-string-face) 6239 6249 nil 6249 6250 (face font-lock-string-face) 6250 6282 (face font-lock-constant-face) 6282 6283 (face font-lock-string-face) 6283 6293 nil 6293 6294 (face font-lock-string-face) 6294 6325 (face font-lock-constant-face) 6325 6326 (face font-lock-string-face) 6326 6336 nil 6336 6337 (face font-lock-string-face) 6337 6349 (face font-lock-constant-face) 6349 6350 (face font-lock-string-face) 6350 6360 nil 6360 6361 (face font-lock-string-face) 6361 6382 (face font-lock-constant-face) 6382 6383 (face font-lock-string-face) 6383 6393 nil 6393 6394 (face font-lock-string-face) 6394 6413 (face font-lock-constant-face) 6413 6414 (face font-lock-string-face) 6414 6424 nil 6424 6425 (face font-lock-string-face) 6425 6442 (face font-lock-constant-face) 6442 6443 (face font-lock-string-face) 6443 6453 nil 6453 6454 (face font-lock-string-face) 6454 6470 (face font-lock-constant-face) 6470 6471 (face font-lock-string-face) 6471 6481 nil 6481 6482 (face font-lock-string-face) 6482 6504 (face font-lock-constant-face) 6504 6505 (face font-lock-string-face) 6505 6515 nil 6515 6516 (face font-lock-string-face) 6516 6535 (face font-lock-constant-face) 6535 6536 (face font-lock-string-face) 6536 6546 nil 6546 6547 (face font-lock-string-face) 6547 6569 (face font-lock-constant-face) 6569 6570 (face font-lock-string-face) 6570 6580 nil 6580 6581 (face font-lock-string-face) 6581 6602 (face font-lock-constant-face) 6602 6603 (face font-lock-string-face) 6603 6613 nil 6613 6614 (face font-lock-string-face) 6614 6631 (face font-lock-constant-face) 6631 6632 (face font-lock-string-face) 6632 6642 nil 6642 6643 (face font-lock-string-face) 6643 6671 (face font-lock-constant-face) 6671 6672 (face font-lock-string-face) 6672 6682 nil 6682 6683 (face font-lock-string-face) 6683 6710 (face font-lock-constant-face) 6710 6711 (face font-lock-string-face) 6711 6721 nil 6721 6722 (face font-lock-string-face) 6722 6738 (face font-lock-constant-face) 6738 6739 (face font-lock-string-face) 6739 6749 nil 6749 6750 (face font-lock-string-face) 6750 6765 (face font-lock-constant-face) 6765 6766 (face font-lock-string-face) 6766 6776 nil 6776 6777 (face font-lock-string-face) 6777 6800 (face font-lock-constant-face) 6800 6801 (face font-lock-string-face) 6801 6811 nil 6811 6812 (face font-lock-string-face) 6812 6834 (face font-lock-constant-face) 6834 6835 (face font-lock-string-face) 6835 6845 nil 6845 6846 (face font-lock-string-face) 6846 6860 (face font-lock-constant-face) 6860 6861 (face font-lock-string-face) 6861 6871 nil 6871 6872 (face font-lock-string-face) 6872 6885 (face font-lock-constant-face) 6885 6886 (face font-lock-string-face) 6886 6896 nil 6896 6897 (face font-lock-string-face) 6897 6920 (face font-lock-constant-face) 6920 6921 (face font-lock-string-face) 6921 6931 nil 6931 6932 (face font-lock-string-face) 6932 6954 (face font-lock-constant-face) 6954 6955 (face font-lock-string-face) 6955 6965 nil 6965 6966 (face font-lock-string-face) 6966 6986 (face font-lock-constant-face) 6986 6987 (face font-lock-string-face) 6987 6997 nil 6997 6998 (face font-lock-string-face) 6998 7017 (face font-lock-constant-face) 7017 7018 (face font-lock-string-face) 7018 7028 nil 7028 7029 (face font-lock-string-face) 7029 7050 (face font-lock-constant-face) 7050 7051 (face font-lock-string-face) 7051 7061 nil 7061 7062 (face font-lock-string-face) 7062 7082 (face font-lock-constant-face) 7082 7083 (face font-lock-string-face) 7083 7093 nil 7093 7094 (face font-lock-string-face) 7094 7122 (face font-lock-constant-face) 7122 7123 (face font-lock-string-face) 7123 7133 nil 7133 7134 (face font-lock-string-face) 7134 7161 (face font-lock-constant-face) 7161 7162 (face font-lock-string-face) 7162 7172 nil 7172 7173 (face font-lock-string-face) 7173 7194 (face font-lock-constant-face) 7194 7195 (face font-lock-string-face) 7195 7205 nil 7205 7206 (face font-lock-string-face) 7206 7226 (face font-lock-constant-face) 7226 7227 (face font-lock-string-face) 7227 7237 nil 7237 7238 (face font-lock-string-face) 7238 7266 (face font-lock-constant-face) 7266 7267 (face font-lock-string-face) 7267 7277 nil 7277 7278 (face font-lock-string-face) 7278 7305 (face font-lock-constant-face) 7305 7306 (face font-lock-string-face) 7306 7316 nil 7316 7317 (face font-lock-string-face) 7317 7336 (face font-lock-constant-face) 7336 7337 (face font-lock-string-face) 7337 7347 nil 7347 7348 (face font-lock-string-face) 7348 7366 (face font-lock-constant-face) 7366 7367 (face font-lock-string-face) 7367 7377 nil 7377 7378 (face font-lock-string-face) 7378 7399 (face font-lock-constant-face) 7399 7400 (face font-lock-string-face) 7400 7410 nil 7410 7411 (face font-lock-string-face) 7411 7429 (face font-lock-constant-face) 7429 7430 (face font-lock-string-face) 7430 7440 nil 7440 7441 (face font-lock-string-face) 7441 7458 (face font-lock-constant-face) 7458 7459 (face font-lock-string-face) 7459 7469 nil 7469 7470 (face font-lock-string-face) 7470 7493 (face font-lock-constant-face) 7493 7494 (face font-lock-string-face) 7494 7504 nil 7504 7505 (face font-lock-string-face) 7505 7527 (face font-lock-constant-face) 7527 7528 (face font-lock-string-face) 7528 7538 nil 7538 7539 (face font-lock-string-face) 7539 7562 (face font-lock-constant-face) 7562 7563 (face font-lock-string-face) 7563 7573 nil 7573 7574 (face font-lock-string-face) 7574 7596 (face font-lock-constant-face) 7596 7597 (face font-lock-string-face) 7597 7607 nil 7607 7608 (face font-lock-string-face) 7608 7631 (face font-lock-constant-face) 7631 7632 (face font-lock-string-face) 7632 7642 nil 7642 7643 (face font-lock-string-face) 7643 7665 (face font-lock-constant-face) 7665 7666 (face font-lock-string-face) 7666 7676 nil 7676 7677 (face font-lock-string-face) 7677 7705 (face font-lock-constant-face) 7705 7706 (face font-lock-string-face) 7706 7716 nil 7716 7717 (face font-lock-string-face) 7717 7744 (face font-lock-constant-face) 7744 7745 (face font-lock-string-face) 7745 7755 nil 7755 7756 (face font-lock-string-face) 7756 7791 (face font-lock-constant-face) 7791 7792 (face font-lock-string-face) 7792 7802 nil 7802 7803 (face font-lock-string-face) 7803 7837 (face font-lock-constant-face) 7837 7838 (face font-lock-string-face) 7838 7848 nil 7848 7849 (face font-lock-string-face) 7849 7879 (face font-lock-constant-face) 7879 7880 (face font-lock-string-face) 7880 7890 nil 7890 7891 (face font-lock-string-face) 7891 7920 (face font-lock-constant-face) 7920 7921 (face font-lock-string-face) 7921 7931 nil 7931 7932 (face font-lock-string-face) 7932 7962 (face font-lock-constant-face) 7962 7963 (face font-lock-string-face) 7963 7973 nil 7973 7974 (face font-lock-string-face) 7974 8003 (face font-lock-constant-face) 8003 8004 (face font-lock-string-face) 8004 8014 nil 8014 8015 (face font-lock-string-face) 8015 8039 (face font-lock-constant-face) 8039 8040 (face font-lock-string-face) 8040 8050 nil 8050 8051 (face font-lock-string-face) 8051 8074 (face font-lock-constant-face) 8074 8075 (face font-lock-string-face) 8075 8085 nil 8085 8086 (face font-lock-string-face) 8086 8116 (face font-lock-constant-face) 8116 8117 (face font-lock-string-face) 8117 8127 nil 8127 8128 (face font-lock-string-face) 8128 8152 (face font-lock-constant-face) 8152 8153 (face font-lock-string-face) 8153 8163 nil 8163 8164 (face font-lock-string-face) 8164 8187 (face font-lock-constant-face) 8187 8188 (face font-lock-string-face) 8188 8198 nil 8198 8199 (face font-lock-string-face) 8199 8230 (face font-lock-constant-face) 8230 8231 (face font-lock-string-face) 8231 8241 nil 8241 8242 (face font-lock-string-face) 8242 8272 (face font-lock-constant-face) 8272 8273 (face font-lock-string-face) 8273 8283 nil 8283 8284 (face font-lock-string-face) 8284 8309 (face font-lock-constant-face) 8309 8310 (face font-lock-string-face) 8310 8320 nil 8320 8321 (face font-lock-string-face) 8321 8345 (face font-lock-constant-face) 8345 8346 (face font-lock-string-face) 8346 8356 nil 8356 8357 (face font-lock-string-face) 8357 8399 (face font-lock-constant-face) 8399 8400 (face font-lock-string-face) 8400 8410 nil 8410 8411 (face font-lock-string-face) 8411 8452 (face font-lock-constant-face) 8452 8453 (face font-lock-string-face) 8453 8463 nil 8463 8464 (face font-lock-string-face) 8464 8486 (face font-lock-constant-face) 8486 8487 (face font-lock-string-face) 8487 8497 nil 8497 8498 (face font-lock-string-face) 8498 8519 (face font-lock-constant-face) 8519 8520 (face font-lock-string-face) 8520 8530 nil 8530 8531 (face font-lock-string-face) 8531 8562 (face font-lock-constant-face) 8562 8563 (face font-lock-string-face) 8563 8573 nil 8573 8574 (face font-lock-string-face) 8574 8604 (face font-lock-constant-face) 8604 8605 (face font-lock-string-face) 8605 8615 nil 8615 8616 (face font-lock-string-face) 8616 8643 (face font-lock-constant-face) 8643 8644 (face font-lock-string-face) 8644 8654 nil 8654 8655 (face font-lock-string-face) 8655 8681 (face font-lock-constant-face) 8681 8682 (face font-lock-string-face) 8682 8692 nil 8692 8693 (face font-lock-string-face) 8693 8721 (face font-lock-constant-face) 8721 8722 (face font-lock-string-face) 8722 8732 nil 8732 8733 (face font-lock-string-face) 8733 8760 (face font-lock-constant-face) 8760 8761 (face font-lock-string-face) 8761 8771 nil 8771 8772 (face font-lock-string-face) 8772 8805 (face font-lock-constant-face) 8805 8806 (face font-lock-string-face) 8806 8816 nil 8816 8817 (face font-lock-string-face) 8817 8849 (face font-lock-constant-face) 8849 8850 (face font-lock-string-face) 8850 8860 nil 8860 8861 (face font-lock-string-face) 8861 8892 (face font-lock-constant-face) 8892 8893 (face font-lock-string-face) 8893 8903 nil 8903 8904 (face font-lock-string-face) 8904 8934 (face font-lock-constant-face) 8934 8935 (face font-lock-string-face) 8935 8945 nil 8945 8946 (face font-lock-string-face) 8946 8978 (face font-lock-constant-face) 8978 8979 (face font-lock-string-face) 8979 8989 nil 8989 8990 (face font-lock-string-face) 8990 9021 (face font-lock-constant-face) 9021 9022 (face font-lock-string-face) 9022 9032 nil 9032 9033 (face font-lock-string-face) 9033 9063 (face font-lock-constant-face) 9063 9064 (face font-lock-string-face) 9064 9074 nil 9074 9075 (face font-lock-string-face) 9075 9104 (face font-lock-constant-face) 9104 9105 (face font-lock-string-face) 9105 9115 nil 9115 9116 (face font-lock-string-face) 9116 9158 (face font-lock-constant-face) 9158 9159 (face font-lock-string-face) 9159 9169 nil 9169 9170 (face font-lock-string-face) 9170 9211 (face font-lock-constant-face) 9211 9212 (face font-lock-string-face) 9212 9222 nil 9222 9223 (face font-lock-string-face) 9223 9272 (face font-lock-constant-face) 9272 9273 (face font-lock-string-face) 9273 9283 nil 9283 9284 (face font-lock-string-face) 9284 9332 (face font-lock-constant-face) 9332 9333 (face font-lock-string-face) 9333 9343 nil 9343 9344 (face font-lock-string-face) 9344 9388 (face font-lock-constant-face) 9388 9389 (face font-lock-string-face) 9389 9399 nil 9399 9400 (face font-lock-string-face) 9400 9445 (face font-lock-constant-face) 9445 9446 (face font-lock-string-face) 9446 9456 nil 9456 9457 (face font-lock-string-face) 9457 9507 (face font-lock-constant-face) 9507 9508 (face font-lock-string-face) 9508 9518 nil 9518 9519 (face font-lock-string-face) 9519 9570 (face font-lock-constant-face) 9570 9571 (face font-lock-string-face) 9571 9581 nil 9581 9582 (face font-lock-string-face) 9582 9611 (face font-lock-constant-face) 9611 9612 (face font-lock-string-face) 9612 9622 nil 9622 9623 (face font-lock-string-face) 9623 9659 (face font-lock-constant-face) 9659 9660 (face font-lock-string-face) 9660 9670 nil 9670 9671 (face font-lock-string-face) 9671 9714 (face font-lock-constant-face) 9714 9715 (face font-lock-string-face) 9715 9725 nil 9725 9726 (face font-lock-string-face) 9726 9768 (face font-lock-constant-face) 9768 9769 (face font-lock-string-face) 9769 9779 nil 9779 9780 (face font-lock-string-face) 9780 9816 (face font-lock-constant-face) 9816 9817 (face font-lock-string-face) 9817 9827 nil 9827 9828 (face font-lock-string-face) 9828 9863 (face font-lock-constant-face) 9863 9864 (face font-lock-string-face) 9864 9874 nil 9874 9875 (face font-lock-string-face) 9875 9910 (face font-lock-constant-face) 9910 9911 (face font-lock-string-face) 9911 9921 nil 9921 9922 (face font-lock-string-face) 9922 9958 (face font-lock-constant-face) 9958 9959 (face font-lock-string-face) 9959 9969 nil 9969 9970 (face font-lock-string-face) 9970 10005 (face font-lock-constant-face) 10005 10006 (face font-lock-string-face) 10006 10016 nil 10016 10017 (face font-lock-string-face) 10017 10050 (face font-lock-constant-face) 10050 10051 (face font-lock-string-face) 10051 10061 nil 10061 10062 (face font-lock-string-face) 10062 10094 (face font-lock-constant-face) 10094 10095 (face font-lock-string-face) 10095 10105 nil 10105 10106 (face font-lock-string-face) 10106 10150 (face font-lock-constant-face) 10150 10151 (face font-lock-string-face) 10151 10161 nil 10161 10162 (face font-lock-string-face) 10162 10198 (face font-lock-constant-face) 10198 10199 (face font-lock-string-face) 10199 10209 nil 10209 10210 (face font-lock-string-face) 10210 10245 (face font-lock-constant-face) 10245 10246 (face font-lock-string-face) 10246 10256 nil 10256 10257 (face font-lock-string-face) 10257 10296 (face font-lock-constant-face) 10296 10297 (face font-lock-string-face) 10297 10307 nil 10307 10308 (face font-lock-string-face) 10308 10346 (face font-lock-constant-face) 10346 10347 (face font-lock-string-face) 10347 10357 nil 10357 10358 (face font-lock-string-face) 10358 10403 (face font-lock-constant-face) 10403 10404 (face font-lock-string-face) 10404 10414 nil 10414 10415 (face font-lock-string-face) 10415 10459 (face font-lock-constant-face) 10459 10460 (face font-lock-string-face) 10460 10470 nil 10470 10471 (face font-lock-string-face) 10471 10487 (face font-lock-constant-face) 10487 10488 (face font-lock-string-face) 10488 10498 nil 10498 10499 (face font-lock-string-face) 10499 10514 (face font-lock-constant-face) 10514 10515 (face font-lock-string-face) 10515 10525 nil 10525 10526 (face font-lock-string-face) 10526 10559 (face font-lock-constant-face) 10559 10560 (face font-lock-string-face) 10560 10570 nil 10570 10571 (face font-lock-string-face) 10571 10603 (face font-lock-constant-face) 10603 10604 (face font-lock-string-face) 10604 10614 nil 10614 10615 (face font-lock-string-face) 10615 10636 (face font-lock-constant-face) 10636 10637 (face font-lock-string-face) 10637 10647 nil 10647 10648 (face font-lock-string-face) 10648 10675 (face font-lock-constant-face) 10675 10676 (face font-lock-string-face) 10676 10686 nil 10686 10687 (face font-lock-string-face) 10687 10713 (face font-lock-constant-face) 10713 10714 (face font-lock-string-face) 10714 10724 nil 10724 10725 (face font-lock-string-face) 10725 10755 (face font-lock-constant-face) 10755 10756 (face font-lock-string-face) 10756 10766 nil 10766 10767 (face font-lock-string-face) 10767 10796 (face font-lock-constant-face) 10796 10797 (face font-lock-string-face) 10797 10807 nil 10807 10808 (face font-lock-string-face) 10808 10845 (face font-lock-constant-face) 10845 10846 (face font-lock-string-face) 10846 10856 nil 10856 10857 (face font-lock-string-face) 10857 10893 (face font-lock-constant-face) 10893 10894 (face font-lock-string-face) 10894 10904 nil 10904 10905 (face font-lock-string-face) 10905 10929 (face font-lock-constant-face) 10929 10930 (face font-lock-string-face) 10930 10940 nil 10940 10941 (face font-lock-string-face) 10941 10964 (face font-lock-constant-face) 10964 10965 (face font-lock-string-face) 10965 10975 nil 10975 10976 (face font-lock-string-face) 10976 10995 (face font-lock-constant-face) 10995 10996 (face font-lock-string-face) 10996 11006 nil 11006 11007 (face font-lock-string-face) 11007 11025 (face font-lock-constant-face) 11025 11026 (face font-lock-string-face) 11026 11036 nil 11036 11037 (face font-lock-string-face) 11037 11063 (face font-lock-constant-face) 11063 11064 (face font-lock-string-face) 11064 11074 nil 11074 11075 (face font-lock-string-face) 11075 11100 (face font-lock-constant-face) 11100 11101 (face font-lock-string-face) 11101 11111 nil 11111 11112 (face font-lock-string-face) 11112 11138 (face font-lock-constant-face) 11138 11139 (face font-lock-string-face) 11139 11149 nil 11149 11150 (face font-lock-string-face) 11150 11175 (face font-lock-constant-face) 11175 11176 (face font-lock-string-face) 11176 11193 nil 11193 11194 (face font-lock-string-face) 11194 11219 (face font-lock-keyword-face) 11219 11220 (face font-lock-string-face) 11220 11232 nil 11232 11233 (face font-lock-string-face) 11233 11245 (face font-lock-keyword-face) 11245 11246 (face font-lock-string-face) 11246 11260 nil 11260 11261 (face font-lock-string-face) 11261 11263 (face font-lock-constant-face) 11263 11264 (face font-lock-string-face) 11264 11292 nil 11292 11293 (face font-lock-string-face) 11293 11303 (face font-lock-keyword-face) 11303 11304 (face font-lock-string-face) 11304 11316 nil 11316 11381 (face font-lock-comment-face) 11381 11389 nil 11389 11439 (face font-lock-comment-face) 11439 11448 nil 11448 11449 (face font-lock-string-face) 11449 11464 (face font-lock-variable-name-face) 11464 11465 (face font-lock-string-face) 11465 11479 nil 11479 11480 (face font-lock-string-face) 11480 11492 (face font-lock-keyword-face) 11492 11493 (face font-lock-string-face) 11493 11509 nil 11509 11510 (face font-lock-string-face) 11510 11549 (face font-lock-function-name-face) 11549 11550 (face font-lock-string-face) 11550 11586 nil 11586 11587 (face font-lock-string-face) 11587 11602 (face font-lock-variable-name-face) 11602 11603 (face font-lock-string-face) 11603 11617 nil 11617 11618 (face font-lock-string-face) 11618 11626 (face font-lock-keyword-face) 11626 11627 (face font-lock-string-face) 11627 11643 nil 11643 11644 (face font-lock-string-face) 11644 11663 (face font-lock-constant-face) 11663 11664 (face font-lock-string-face) 11664 11678 nil 11678 11679 (face font-lock-string-face) 11679 11702 (face font-lock-constant-face) 11702 11703 (face font-lock-string-face) 11703 11717 nil 11717 11718 (face font-lock-string-face) 11718 11740 (face font-lock-constant-face) 11740 11741 (face font-lock-string-face) 11741 11755 nil 11755 11756 (face font-lock-string-face) 11756 11779 (face font-lock-constant-face) 11779 11780 (face font-lock-string-face) 11780 11794 nil 11794 11795 (face font-lock-string-face) 11795 11817 (face font-lock-constant-face) 11817 11818 (face font-lock-string-face) 11818 11832 nil 11832 11833 (face font-lock-string-face) 11833 11861 (face font-lock-constant-face) 11861 11862 (face font-lock-string-face) 11862 11876 nil 11876 11877 (face font-lock-string-face) 11877 11904 (face font-lock-constant-face) 11904 11905 (face font-lock-string-face) 11905 11919 nil 11919 11920 (face font-lock-string-face) 11920 11950 (face font-lock-constant-face) 11950 11951 (face font-lock-string-face) 11951 11965 nil 11965 11966 (face font-lock-string-face) 11966 11995 (face font-lock-constant-face) 11995 11996 (face font-lock-string-face) 11996 12010 nil 12010 12011 (face font-lock-string-face) 12011 12035 (face font-lock-constant-face) 12035 12036 (face font-lock-string-face) 12036 12050 nil 12050 12051 (face font-lock-string-face) 12051 12074 (face font-lock-constant-face) 12074 12075 (face font-lock-string-face) 12075 12089 nil 12089 12090 (face font-lock-string-face) 12090 12120 (face font-lock-constant-face) 12120 12121 (face font-lock-string-face) 12121 12135 nil 12135 12136 (face font-lock-string-face) 12136 12167 (face font-lock-constant-face) 12167 12168 (face font-lock-string-face) 12168 12182 nil 12182 12183 (face font-lock-string-face) 12183 12213 (face font-lock-constant-face) 12213 12214 (face font-lock-string-face) 12214 12228 nil 12228 12229 (face font-lock-string-face) 12229 12254 (face font-lock-constant-face) 12254 12255 (face font-lock-string-face) 12255 12269 nil 12269 12270 (face font-lock-string-face) 12270 12294 (face font-lock-constant-face) 12294 12295 (face font-lock-string-face) 12295 12309 nil 12309 12310 (face font-lock-string-face) 12310 12352 (face font-lock-constant-face) 12352 12353 (face font-lock-string-face) 12353 12367 nil 12367 12368 (face font-lock-string-face) 12368 12409 (face font-lock-constant-face) 12409 12410 (face font-lock-string-face) 12410 12424 nil 12424 12425 (face font-lock-string-face) 12425 12447 (face font-lock-constant-face) 12447 12448 (face font-lock-string-face) 12448 12462 nil 12462 12463 (face font-lock-string-face) 12463 12484 (face font-lock-constant-face) 12484 12485 (face font-lock-string-face) 12485 12499 nil 12499 12500 (face font-lock-string-face) 12500 12531 (face font-lock-constant-face) 12531 12532 (face font-lock-string-face) 12532 12546 nil 12546 12547 (face font-lock-string-face) 12547 12577 (face font-lock-constant-face) 12577 12578 (face font-lock-string-face) 12578 12592 nil 12592 12593 (face font-lock-string-face) 12593 12621 (face font-lock-constant-face) 12621 12622 (face font-lock-string-face) 12622 12636 nil 12636 12637 (face font-lock-string-face) 12637 12664 (face font-lock-constant-face) 12664 12665 (face font-lock-string-face) 12665 12679 nil 12679 12680 (face font-lock-string-face) 12680 12707 (face font-lock-constant-face) 12707 12708 (face font-lock-string-face) 12708 12722 nil 12722 12723 (face font-lock-string-face) 12723 12749 (face font-lock-constant-face) 12749 12750 (face font-lock-string-face) 12750 12764 nil 12764 12765 (face font-lock-string-face) 12765 12791 (face font-lock-constant-face) 12791 12792 (face font-lock-string-face) 12792 12806 nil 12806 12807 (face font-lock-string-face) 12807 12832 (face font-lock-constant-face) 12832 12833 (face font-lock-string-face) 12833 12868 nil 12868 12937 (face font-lock-comment-face) 12937 12945 nil 12945 13016 (face font-lock-comment-face) 13016 13024 nil 13024 13040 (face font-lock-comment-face) 13040 13049 nil 13049 13050 (face font-lock-string-face) 13050 13065 (face font-lock-variable-name-face) 13065 13066 (face font-lock-string-face) 13066 13080 nil 13080 13081 (face font-lock-string-face) 13081 13089 (face font-lock-keyword-face) 13089 13090 (face font-lock-string-face) 13090 13105 nil 13105 13106 (face font-lock-string-face) 13106 13149 (face font-lock-constant-face) 13149 13150 (face font-lock-string-face) 13150 13175 nil 13175 13176 (face font-lock-string-face) 13176 13183 (face font-lock-keyword-face) 13183 13184 (face font-lock-string-face) 13184 13199 nil 13199 13200 (face font-lock-string-face) 13200 13248 (face font-lock-constant-face) 13248 13249 (face font-lock-string-face) 13249 13274 nil 13274 13275 (face font-lock-string-face) 13275 13288 (face font-lock-keyword-face) 13288 13289 (face font-lock-string-face) 13289 13305 nil 13305 13306 (face font-lock-string-face) 13306 13315 (face font-lock-keyword-face) 13315 13316 (face font-lock-string-face) 13316 13334 nil 13334 13335 (face font-lock-string-face) 13335 13345 (face font-lock-constant-face) 13345 13346 (face font-lock-string-face) 13346 13397 nil 13397 13398 (face font-lock-string-face) 13398 13443 (face font-lock-variable-name-face) 13443 13444 (face font-lock-string-face) 13444 13458 nil 13458 13459 (face font-lock-string-face) 13459 13472 (face font-lock-keyword-face) 13472 13473 (face font-lock-string-face) 13473 13489 nil 13489 13490 (face font-lock-string-face) 13490 13499 (face font-lock-keyword-face) 13499 13500 (face font-lock-string-face) 13500 13518 nil 13518 13519 (face font-lock-string-face) 13519 13527 (face font-lock-constant-face) 13527 13528 (face font-lock-string-face) 13528 13579 nil 13579 13580 (face font-lock-string-face) 13580 13593 (face font-lock-variable-name-face) 13593 13594 (face font-lock-string-face) 13594 13608 nil 13608 13609 (face font-lock-string-face) 13609 13617 (face font-lock-keyword-face) 13617 13618 (face font-lock-string-face) 13618 13623 nil 13623 13624 (face font-lock-string-face) 13624 13631 (face font-lock-constant-face) 13631 13632 (face font-lock-string-face) 13632 13634 nil 13634 13635 (face font-lock-string-face) 13635 13641 (face font-lock-constant-face) 13641 13642 (face font-lock-string-face) 13642 13671 nil 13671 13672 (face font-lock-string-face) 13672 13679 (face font-lock-constant-face) 13679 13680 (face font-lock-string-face) 13680 13682 nil 13682 13683 (face font-lock-string-face) 13683 13703 (face font-lock-constant-face) 13703 13704 (face font-lock-string-face) 13704 13720 nil 13720 13721 (face font-lock-string-face) 13721 13734 (face font-lock-keyword-face) 13734 13735 (face font-lock-string-face) 13735 13751 nil 13751 13752 (face font-lock-string-face) 13752 13761 (face font-lock-keyword-face) 13761 13762 (face font-lock-string-face) 13762 13815 nil 13815 13816 (face font-lock-string-face) 13816 13829 (face font-lock-variable-name-face) 13829 13830 (face font-lock-string-face) 13830 13844 nil 13844 13845 (face font-lock-string-face) 13845 13853 (face font-lock-keyword-face) 13853 13854 (face font-lock-string-face) 13854 13870 nil 13870 13871 (face font-lock-string-face) 13871 13909 (face font-lock-constant-face) 13909 13910 (face font-lock-string-face) 13910 13924 nil 13924 13925 (face font-lock-string-face) 13925 13962 (face font-lock-constant-face) 13962 13963 (face font-lock-string-face) 13963 13999 nil 13999 14000 (face font-lock-string-face) 14000 14011 (face font-lock-variable-name-face) 14011 14012 (face font-lock-string-face) 14012 14026 nil 14026 14027 (face font-lock-string-face) 14027 14036 (face font-lock-keyword-face) 14036 14037 (face font-lock-string-face) 14037 14053 nil 14053 14054 (face font-lock-string-face) 14054 14064 (face font-lock-keyword-face) 14064 14065 (face font-lock-string-face) 14065 14084 nil 14084 14085 (face font-lock-string-face) 14085 14096 (face font-lock-variable-name-face) 14096 14097 (face font-lock-string-face) 14097 14117 nil 14117 14129 (face font-lock-string-face) 14129 14131 nil 14131 14169 (face font-lock-string-face) 14169 14176 (face font-lock-variable-name-face) 14176 14182 (face font-lock-string-face) 14182 14193 (face font-lock-variable-name-face) 14193 14196 (face font-lock-string-face) 14196 14233 nil 14233 14245 (face font-lock-string-face) 14245 14247 nil 14247 14259 (face font-lock-string-face) 14259 14316 nil 14316 14317 (face font-lock-string-face) 14317 14327 (face font-lock-keyword-face) 14327 14328 (face font-lock-string-face) 14328 14345 nil 14345 14346 (face font-lock-string-face) 14346 14359 (face font-lock-variable-name-face) 14359 14360 (face font-lock-string-face) 14360 14378 nil 14378 14379 (face font-lock-string-face) 14379 14385 (face font-lock-keyword-face) 14385 14386 (face font-lock-string-face) 14386 14406 nil 14406 14411 (face font-lock-string-face) 14411 14413 (face font-lock-variable-name-face) 14413 14423 (face font-lock-variable-name-face) 14423 14443 (face font-lock-string-face) 14443 14476 nil 14476 14477 (face font-lock-string-face) 14477 14490 (face font-lock-keyword-face) 14490 14491 (face font-lock-string-face) 14491 14511 nil 14511 14512 (face font-lock-string-face) 14512 14521 (face font-lock-keyword-face) 14521 14522 (face font-lock-string-face) 14522 14544 nil 14544 14545 (face font-lock-string-face) 14545 14549 (face font-lock-constant-face) 14549 14551 (face font-lock-variable-name-face) 14551 14561 (face font-lock-variable-name-face) 14561 14578 (face font-lock-constant-face) 14578 14579 (face font-lock-string-face) 14579 14631 nil 14631 14632 (face font-lock-string-face) 14632 14639 (face font-lock-keyword-face) 14639 14640 (face font-lock-string-face) 14640 14660 nil 14660 14661 (face font-lock-string-face) 14661 14669 (face font-lock-preprocessor-face) 14669 14670 (face font-lock-string-face) 14670 14707 nil 14707 14729 (face font-lock-comment-face) 14729 14743 nil 14743 14744 (face font-lock-string-face) 14744 14752 (face font-lock-keyword-face) 14752 14753 (face font-lock-string-face) 14753 14773 nil 14773 14774 (face font-lock-string-face) 14774 14800 (face font-lock-constant-face) 14800 14801 (face font-lock-string-face) 14801 14819 nil 14819 14820 (face font-lock-string-face) 14820 14845 (face font-lock-constant-face) 14845 14846 (face font-lock-string-face) 14846 14915 nil 14915 14916 (face font-lock-string-face) 14916 14929 (face font-lock-variable-name-face) 14929 14930 (face font-lock-string-face) 14930 14944 nil 14944 14945 (face font-lock-string-face) 14945 14955 (face font-lock-keyword-face) 14955 14956 (face font-lock-string-face) 14956 14973 nil 14973 14974 (face font-lock-string-face) 14974 14993 (face font-lock-variable-name-face) 14993 14994 (face font-lock-string-face) 14994 15012 nil 15012 15013 (face font-lock-string-face) 15013 15019 (face font-lock-keyword-face) 15019 15020 (face font-lock-string-face) 15020 15040 nil 15040 15075 (face font-lock-string-face) 15075 15108 nil 15108 15109 (face font-lock-string-face) 15109 15122 (face font-lock-keyword-face) 15122 15123 (face font-lock-string-face) 15123 15143 nil 15143 15144 (face font-lock-string-face) 15144 15153 (face font-lock-keyword-face) 15153 15154 (face font-lock-string-face) 15154 15176 nil 15176 15177 (face font-lock-string-face) 15177 15215 (face font-lock-constant-face) 15215 15216 (face font-lock-string-face) 15216 15268 nil 15268 15269 (face font-lock-string-face) 15269 15276 (face font-lock-keyword-face) 15276 15277 (face font-lock-string-face) 15277 15297 nil 15297 15298 (face font-lock-string-face) 15298 15312 (face font-lock-preprocessor-face) 15312 15313 (face font-lock-string-face) 15313 15350 nil 15350 15378 (face font-lock-comment-face) 15378 15392 nil 15392 15393 (face font-lock-string-face) 15393 15401 (face font-lock-keyword-face) 15401 15402 (face font-lock-string-face) 15402 15422 nil 15422 15423 (face font-lock-string-face) 15423 15450 (face font-lock-constant-face) 15450 15451 (face font-lock-string-face) 15451 15469 nil 15469 15470 (face font-lock-string-face) 15470 15496 (face font-lock-constant-face) 15496 15497 (face font-lock-string-face) 15497 15566 nil 15566 15567 (face font-lock-string-face) 15567 15600 (face font-lock-variable-name-face) 15600 15601 (face font-lock-string-face) 15601 15615 nil 15615 15663 (face font-lock-comment-face) 15663 15673 nil 15673 15674 (face font-lock-string-face) 15674 15682 (face font-lock-keyword-face) 15682 15683 (face font-lock-string-face) 15683 15699 nil 15699 15700 (face font-lock-string-face) 15700 15743 (face font-lock-constant-face) 15743 15744 (face font-lock-string-face) 15744 15758 nil 15758 15759 (face font-lock-string-face) 15759 15801 (face font-lock-constant-face) 15801 15802 (face font-lock-string-face) 15802 15838 nil 15838 15839 (face font-lock-string-face) 15839 15848 (face font-lock-variable-name-face) 15848 15849 (face font-lock-string-face) 15849 15863 nil 15863 15864 (face font-lock-string-face) 15864 15877 (face font-lock-keyword-face) 15877 15878 (face font-lock-string-face) 15878 15894 nil 15894 15895 (face font-lock-string-face) 15895 15904 (face font-lock-keyword-face) 15904 15905 (face font-lock-string-face) 15905 15923 nil 15923 15924 (face font-lock-string-face) 15924 15980 (face font-lock-constant-face) 15980 15981 (face font-lock-string-face) 15981 15997 nil 15997 15998 (face font-lock-string-face) 15998 16057 (face font-lock-constant-face) 16057 16058 (face font-lock-string-face) 16058 16074 nil 16074 16075 (face font-lock-string-face) 16075 16131 (face font-lock-constant-face) 16131 16132 (face font-lock-string-face) 16132 16148 nil 16148 16149 (face font-lock-string-face) 16149 16205 (face font-lock-constant-face) 16205 16206 (face font-lock-string-face) 16206 16222 nil 16222 16223 (face font-lock-string-face) 16223 16275 (face font-lock-constant-face) 16275 16276 (face font-lock-string-face) 16276 16327 nil 16327 16328 (face font-lock-string-face) 16328 16337 (face font-lock-variable-name-face) 16337 16338 (face font-lock-string-face) 16338 16352 nil 16352 16353 (face font-lock-string-face) 16353 16361 (face font-lock-keyword-face) 16361 16362 (face font-lock-string-face) 16362 16378 nil 16378 16379 (face font-lock-string-face) 16379 16406 (face font-lock-constant-face) 16406 16407 (face font-lock-string-face) 16407 16421 nil 16421 16422 (face font-lock-string-face) 16422 16448 (face font-lock-constant-face) 16448 16449 (face font-lock-string-face) 16449 16463 nil 16463 16464 (face font-lock-string-face) 16464 16507 (face font-lock-constant-face) 16507 16508 (face font-lock-string-face) 16508 16522 nil 16522 16523 (face font-lock-string-face) 16523 16565 (face font-lock-constant-face) 16565 16566 (face font-lock-string-face) 16566 16602 nil 16602 16603 (face font-lock-string-face) 16603 16646 (face font-lock-variable-name-face) 16646 16647 (face font-lock-string-face) 16647 16661 nil 16661 16662 (face font-lock-string-face) 16662 16669 (face font-lock-keyword-face) 16669 16670 (face font-lock-string-face) 16670 16686 nil 16686 16687 (face font-lock-string-face) 16687 16697 (face font-lock-constant-face) 16697 16698 (face font-lock-string-face) 16698 16712 nil 16712 16713 (face font-lock-string-face) 16713 16722 (face font-lock-constant-face) 16722 16723 (face font-lock-string-face) 16723 16737 nil 16737 16738 (face font-lock-string-face) 16738 16760 (face font-lock-constant-face) 16760 16761 (face font-lock-string-face) 16761 16775 nil 16775 16776 (face font-lock-string-face) 16776 16797 (face font-lock-constant-face) 16797 16798 (face font-lock-string-face) 16798 16812 nil 16812 16813 (face font-lock-string-face) 16813 16830 (face font-lock-constant-face) 16830 16831 (face font-lock-string-face) 16831 16845 nil 16845 16846 (face font-lock-string-face) 16846 16862 (face font-lock-constant-face) 16862 16863 (face font-lock-string-face) 16863 16877 nil 16877 16878 (face font-lock-string-face) 16878 16889 (face font-lock-constant-face) 16889 16890 (face font-lock-string-face) 16890 16904 nil 16904 16905 (face font-lock-string-face) 16905 16915 (face font-lock-constant-face) 16915 16916 (face font-lock-string-face) 16916 16930 nil 16930 16931 (face font-lock-string-face) 16931 16955 (face font-lock-constant-face) 16955 16956 (face font-lock-string-face) 16956 16970 nil 16970 16971 (face font-lock-string-face) 16971 16994 (face font-lock-constant-face) 16994 16995 (face font-lock-string-face) 16995 17009 nil 17009 17010 (face font-lock-string-face) 17010 17034 (face font-lock-constant-face) 17034 17035 (face font-lock-string-face) 17035 17049 nil 17049 17050 (face font-lock-string-face) 17050 17073 (face font-lock-constant-face) 17073 17074 (face font-lock-string-face) 17074 17088 nil 17088 17089 (face font-lock-string-face) 17089 17114 (face font-lock-constant-face) 17114 17115 (face font-lock-string-face) 17115 17129 nil 17129 17130 (face font-lock-string-face) 17130 17154 (face font-lock-constant-face) 17154 17155 (face font-lock-string-face) 17155 17210 nil 17210 17211 (face font-lock-string-face) 17211 17222 (face font-lock-keyword-face) 17222 17223 (face font-lock-string-face) 17223 17225 nil 17225 17226 (face font-lock-string-face) 17226 17237 (face font-lock-function-name-face) 17237 17238 (face font-lock-string-face) 17238 17246 nil 17246 17247 (face font-lock-string-face) 17247 17251 (face font-lock-keyword-face) 17251 17252 (face font-lock-string-face) 17252 17254 nil 17254 17255 (face font-lock-string-face) 17255 17269 (face font-lock-type-face) 17269 17270 (face font-lock-string-face) 17270 17278 nil 17278 17279 (face font-lock-string-face) 17279 17291 (face font-lock-keyword-face) 17291 17292 (face font-lock-string-face) 17292 17304 nil 17304 17305 (face font-lock-string-face) 17305 17307 (face font-lock-constant-face) 17307 17308 (face font-lock-string-face) 17308 17325 nil 17325 17326 (face font-lock-string-face) 17326 17336 (face font-lock-keyword-face) 17336 17337 (face font-lock-string-face) 17337 17350 nil 17350 17351 (face font-lock-string-face) 17351 17371 (face font-lock-variable-name-face) 17371 17372 (face font-lock-string-face) 17372 17386 nil 17386 17387 (face font-lock-string-face) 17387 17404 (face font-lock-keyword-face) 17404 17405 (face font-lock-string-face) 17405 17423 nil 17423 17424 (face font-lock-string-face) 17424 17442 (face font-lock-variable-name-face) 17442 17443 (face font-lock-string-face) 17443 17461 nil 17461 17462 (face font-lock-string-face) 17462 17469 (face font-lock-keyword-face) 17469 17470 (face font-lock-string-face) 17470 17474 nil 17474 17498 (face font-lock-string-face) 17498 17553 nil 17553 17554 (face font-lock-string-face) 17554 17599 (face font-lock-variable-name-face) 17599 17600 (face font-lock-string-face) 17600 17614 nil 17614 17615 (face font-lock-string-face) 17615 17627 (face font-lock-keyword-face) 17627 17628 (face font-lock-string-face) 17628 17644 nil 17644 17645 (face font-lock-string-face) 17645 17665 (face font-lock-function-name-face) 17665 17666 (face font-lock-string-face) 17666 17703 nil 17703 17704 (face font-lock-string-face) 17704 17724 (face font-lock-variable-name-face) 17724 17725 (face font-lock-string-face) 17725 17739 nil 17739 17740 (face font-lock-string-face) 17740 17752 (face font-lock-keyword-face) 17752 17753 (face font-lock-string-face) 17753 17769 nil 17769 17770 (face font-lock-string-face) 17770 17790 (face font-lock-function-name-face) 17790 17791 (face font-lock-string-face) 17791 17833 nil 17833 17834 (face font-lock-string-face) 17834 17841 (face font-lock-keyword-face) 17841 17842 (face font-lock-string-face) 17842 17854 nil 17854 17855 (face font-lock-string-face) 17855 17874 (face font-lock-constant-face) 17874 17875 (face font-lock-string-face) 17875 17885 nil 17885 17886 (face font-lock-string-face) 17886 17904 (face font-lock-constant-face) 17904 17905 (face font-lock-string-face) 17905 17935 nil 17935 17936 (face font-lock-string-face) 17936 17947 (face font-lock-keyword-face) 17947 17948 (face font-lock-string-face) 17948 17950 nil 17950 17951 (face font-lock-string-face) 17951 17971 (face font-lock-function-name-face) 17971 17972 (face font-lock-string-face) 17972 17980 nil 17980 17981 (face font-lock-string-face) 17981 17985 (face font-lock-keyword-face) 17985 17986 (face font-lock-string-face) 17986 17988 nil 17988 17989 (face font-lock-string-face) 17989 18003 (face font-lock-type-face) 18003 18004 (face font-lock-string-face) 18004 18012 nil 18012 18013 (face font-lock-string-face) 18013 18025 (face font-lock-keyword-face) 18025 18026 (face font-lock-string-face) 18026 18038 nil 18038 18039 (face font-lock-string-face) 18039 18041 (face font-lock-constant-face) 18041 18042 (face font-lock-string-face) 18042 18059 nil 18059 18060 (face font-lock-string-face) 18060 18067 (face font-lock-keyword-face) 18067 18068 (face font-lock-string-face) 18068 18080 nil 18080 18081 (face font-lock-string-face) 18081 18114 (face font-lock-constant-face) 18114 18115 (face font-lock-string-face) 18115 18125 nil 18125 18126 (face font-lock-string-face) 18126 18162 (face font-lock-constant-face) 18162 18163 (face font-lock-string-face) 18163 18173 nil 18173 18174 (face font-lock-string-face) 18174 18212 (face font-lock-constant-face) 18212 18213 (face font-lock-string-face) 18213 18223 nil 18223 18224 (face font-lock-string-face) 18224 18261 (face font-lock-constant-face) 18261 18262 (face font-lock-string-face) 18262 18272 nil 18272 18273 (face font-lock-string-face) 18273 18311 (face font-lock-constant-face) 18311 18312 (face font-lock-string-face) 18312 18322 nil 18322 18323 (face font-lock-string-face) 18323 18356 (face font-lock-constant-face) 18356 18357 (face font-lock-string-face) 18357 18367 nil 18367 18368 (face font-lock-string-face) 18368 18403 (face font-lock-constant-face) 18403 18404 (face font-lock-string-face) 18404 18414 nil 18414 18415 (face font-lock-string-face) 18415 18451 (face font-lock-constant-face) 18451 18452 (face font-lock-string-face) 18452 18462 nil 18462 18463 (face font-lock-string-face) 18463 18499 (face font-lock-constant-face) 18499 18500 (face font-lock-string-face) 18500 18510 nil 18510 18511 (face font-lock-string-face) 18511 18547 (face font-lock-constant-face) 18547 18548 (face font-lock-string-face) 18548 18558 nil 18558 18559 (face font-lock-string-face) 18559 18581 (face font-lock-constant-face) 18581 18582 (face font-lock-string-face) 18582 18592 nil 18592 18593 (face font-lock-string-face) 18593 18618 (face font-lock-constant-face) 18618 18619 (face font-lock-string-face) 18619 18629 nil 18629 18630 (face font-lock-string-face) 18630 18657 (face font-lock-constant-face) 18657 18658 (face font-lock-string-face) 18658 18668 nil 18668 18669 (face font-lock-string-face) 18669 18697 (face font-lock-constant-face) 18697 18698 (face font-lock-string-face) 18698 18708 nil 18708 18709 (face font-lock-string-face) 18709 18750 (face font-lock-constant-face) 18750 18751 (face font-lock-string-face) 18751 18761 nil 18761 18762 (face font-lock-string-face) 18762 18803 (face font-lock-constant-face) 18803 18804 (face font-lock-string-face) 18804 18814 nil 18814 18815 (face font-lock-string-face) 18815 18856 (face font-lock-constant-face) 18856 18857 (face font-lock-string-face) 18857 18867 nil 18867 18868 (face font-lock-string-face) 18868 18902 (face font-lock-constant-face) 18902 18903 (face font-lock-string-face) 18903 18913 nil 18913 18914 (face font-lock-string-face) 18914 18948 (face font-lock-constant-face) 18948 18949 (face font-lock-string-face) 18949 18959 nil 18959 18960 (face font-lock-string-face) 18960 18994 (face font-lock-constant-face) 18994 18995 (face font-lock-string-face) 18995 19005 nil 19005 19006 (face font-lock-string-face) 19006 19035 (face font-lock-constant-face) 19035 19036 (face font-lock-string-face) 19036 19046 nil 19046 19047 (face font-lock-string-face) 19047 19075 (face font-lock-constant-face) 19075 19076 (face font-lock-string-face) 19076 19093 nil 19093 19094 (face font-lock-string-face) 19094 19104 (face font-lock-keyword-face) 19104 19105 (face font-lock-string-face) 19105 19118 nil 19118 19119 (face font-lock-string-face) 19119 19139 (face font-lock-variable-name-face) 19139 19140 (face font-lock-string-face) 19140 19154 nil 19154 19155 (face font-lock-string-face) 19155 19172 (face font-lock-keyword-face) 19172 19173 (face font-lock-string-face) 19173 19191 nil 19191 19192 (face font-lock-string-face) 19192 19210 (face font-lock-variable-name-face) 19210 19211 (face font-lock-string-face) 19211 19229 nil 19229 19230 (face font-lock-string-face) 19230 19237 (face font-lock-keyword-face) 19237 19238 (face font-lock-string-face) 19238 19242 nil 19242 19266 (face font-lock-string-face) 19266 19321 nil 19321 19322 (face font-lock-string-face) 19322 19342 (face font-lock-variable-name-face) 19342 19343 (face font-lock-string-face) 19343 19357 nil 19357 19399 (face font-lock-comment-face) 19399 19409 nil 19409 19410 (face font-lock-string-face) 19410 19417 (face font-lock-keyword-face) 19417 19418 (face font-lock-string-face) 19418 19434 nil 19434 19435 (face font-lock-string-face) 19435 19480 (face font-lock-constant-face) 19480 19481 (face font-lock-string-face) 19481 19495 nil 19495 19496 (face font-lock-string-face) 19496 19535 (face font-lock-constant-face) 19535 19536 (face font-lock-string-face) 19536 19573 nil 19573 19574 (face font-lock-string-face) 19574 19623 (face font-lock-variable-name-face) 19623 19624 (face font-lock-string-face) 19624 19638 nil 19638 19639 (face font-lock-string-face) 19639 19645 (face font-lock-keyword-face) 19645 19646 (face font-lock-string-face) 19646 19662 nil 19662 19670 (face font-lock-string-face) 19670 19707 nil 19707 19708 (face font-lock-string-face) 19708 19719 (face font-lock-variable-name-face) 19719 19720 (face font-lock-string-face) 19720 19734 nil 19734 19735 (face font-lock-string-face) 19735 19749 (face font-lock-keyword-face) 19749 19750 (face font-lock-string-face) 19750 19766 nil 19766 19773 (face font-lock-string-face) 19773 19791 nil 19791 19792 (face font-lock-string-face) 19792 19806 (face font-lock-keyword-face) 19806 19807 (face font-lock-string-face) 19807 19827 nil 19827 19890 (face font-lock-comment-face) 19890 19906 nil 19906 19971 (face font-lock-comment-face) 19971 19987 nil 19987 20032 (face font-lock-comment-face) 20032 20048 nil 20048 20072 (face font-lock-string-face) 20072 20074 nil 20074 20077 (face font-lock-string-face) 20077 20080 nil 20080 20086 (face font-lock-comment-face) 20086 20155 nil 20155 20156 (face font-lock-string-face) 20156 20165 (face font-lock-variable-name-face) 20165 20166 (face font-lock-string-face) 20166 20180 nil 20180 20181 (face font-lock-string-face) 20181 20190 (face font-lock-keyword-face) 20190 20191 (face font-lock-string-face) 20191 20207 nil 20207 20208 (face font-lock-string-face) 20208 20218 (face font-lock-variable-name-face) 20218 20219 (face font-lock-string-face) 20219 20237 nil 20237 20246 (face font-lock-string-face) 20246 20262 nil 20262 20270 (face font-lock-string-face) 20270 20286 nil 20286 20298 (face font-lock-string-face) 20298 20314 nil 20314 20322 (face font-lock-string-face) 20322 20374 nil 20374 20375 (face font-lock-string-face) 20375 20384 (face font-lock-variable-name-face) 20384 20385 (face font-lock-string-face) 20385 20399 nil 20399 20400 (face font-lock-string-face) 20400 20409 (face font-lock-keyword-face) 20409 20410 (face font-lock-string-face) 20410 20426 nil 20426 20427 (face font-lock-string-face) 20427 20437 (face font-lock-variable-name-face) 20437 20438 (face font-lock-string-face) 20438 20456 nil 20456 20466 (face font-lock-string-face) 20466 20482 nil 20482 20491 (face font-lock-string-face) 20491 20507 nil 20507 20519 (face font-lock-string-face) 20519 20535 nil 20535 20543 (face font-lock-string-face) 20543 20595 nil 20595 20596 (face font-lock-string-face) 20596 20621 (face font-lock-variable-name-face) 20621 20622 (face font-lock-string-face) 20622 20636 nil 20636 20637 (face font-lock-string-face) 20637 20646 (face font-lock-keyword-face) 20646 20647 (face font-lock-string-face) 20647 20663 nil 20663 20664 (face font-lock-string-face) 20664 20674 (face font-lock-keyword-face) 20674 20675 (face font-lock-string-face) 20675 20695 nil 20695 20696 (face font-lock-string-face) 20696 20715 (face font-lock-variable-name-face) 20715 20716 (face font-lock-string-face) 20716 20736 nil 20736 20748 (face font-lock-string-face) 20748 20770 nil 20770 20780 (face font-lock-string-face) 20780 20800 nil 20800 20807 (face font-lock-string-face) 20807 20827 nil 20827 20839 (face font-lock-string-face) 20839 20859 nil 20859 20867 (face font-lock-string-face) 20867 20923 nil 20923 20935 (face font-lock-string-face) 20935 20957 nil 20957 20972 (face font-lock-string-face) 20972 20992 nil 20992 20999 (face font-lock-string-face) 20999 21019 nil 21019 21026 (face font-lock-string-face) 21026 21046 nil 21046 21058 (face font-lock-string-face) 21058 21078 nil 21078 21086 (face font-lock-string-face) 21086 21180 nil 21180 21181 (face font-lock-string-face) 21181 21190 (face font-lock-keyword-face) 21190 21191 (face font-lock-string-face) 21191 21203 nil 21203 21204 (face font-lock-string-face) 21204 21220 (face font-lock-variable-name-face) 21220 21221 (face font-lock-string-face) 21221 21223 nil 21223 21224 (face font-lock-string-face) 21224 21256 (face font-lock-variable-name-face) 21256 21257 (face font-lock-string-face) 21257 21274 nil 21274 21314 (face font-lock-string-face) 21314 21325 nil 21325 21326 (face font-lock-string-face) 21326 21334 (face font-lock-keyword-face) 21334 21335 (face font-lock-string-face) 21335 21347 nil 21347 21348 (face font-lock-string-face) 21348 21385 (face font-lock-constant-face) 21385 21386 (face font-lock-string-face) 21386 21416 nil 21416 21417 (face font-lock-string-face) 21417 21428 (face font-lock-keyword-face) 21428 21429 (face font-lock-string-face) 21429 21431 nil 21431 21432 (face font-lock-string-face) 21432 21452 (face font-lock-function-name-face) 21452 21453 (face font-lock-string-face) 21453 21461 nil 21461 21462 (face font-lock-string-face) 21462 21466 (face font-lock-keyword-face) 21466 21467 (face font-lock-string-face) 21467 21469 nil 21469 21470 (face font-lock-string-face) 21470 21484 (face font-lock-type-face) 21484 21485 (face font-lock-string-face) 21485 21493 nil 21493 21494 (face font-lock-string-face) 21494 21506 (face font-lock-keyword-face) 21506 21507 (face font-lock-string-face) 21507 21519 nil 21519 21520 (face font-lock-string-face) 21520 21522 (face font-lock-constant-face) 21522 21523 (face font-lock-string-face) 21523 21540 nil 21540 21541 (face font-lock-string-face) 21541 21548 (face font-lock-keyword-face) 21548 21549 (face font-lock-string-face) 21549 21561 nil 21561 21562 (face font-lock-string-face) 21562 21595 (face font-lock-constant-face) 21595 21596 (face font-lock-string-face) 21596 21606 nil 21606 21607 (face font-lock-string-face) 21607 21637 (face font-lock-constant-face) 21637 21638 (face font-lock-string-face) 21638 21648 nil 21648 21649 (face font-lock-string-face) 21649 21682 (face font-lock-constant-face) 21682 21683 (face font-lock-string-face) 21683 21693 nil 21693 21694 (face font-lock-string-face) 21694 21724 (face font-lock-constant-face) 21724 21725 (face font-lock-string-face) 21725 21735 nil 21735 21736 (face font-lock-string-face) 21736 21758 (face font-lock-constant-face) 21758 21759 (face font-lock-string-face) 21759 21769 nil 21769 21770 (face font-lock-string-face) 21770 21795 (face font-lock-constant-face) 21795 21796 (face font-lock-string-face) 21796 21806 nil 21806 21807 (face font-lock-string-face) 21807 21836 (face font-lock-constant-face) 21836 21837 (face font-lock-string-face) 21837 21847 nil 21847 21848 (face font-lock-string-face) 21848 21876 (face font-lock-constant-face) 21876 21877 (face font-lock-string-face) 21877 21907 nil 21907 21908 (face font-lock-string-face) 21908 21919 (face font-lock-keyword-face) 21919 21920 (face font-lock-string-face) 21920 21922 nil 21922 21923 (face font-lock-string-face) 21923 21938 (face font-lock-function-name-face) 21938 21939 (face font-lock-string-face) 21939 21947 nil 21947 21948 (face font-lock-string-face) 21948 21952 (face font-lock-keyword-face) 21952 21953 (face font-lock-string-face) 21953 21955 nil 21955 21956 (face font-lock-string-face) 21956 21966 (face font-lock-type-face) 21966 21967 (face font-lock-string-face) 21967 21975 nil 21975 21976 (face font-lock-string-face) 21976 21988 (face font-lock-keyword-face) 21988 21989 (face font-lock-string-face) 21989 22001 nil 22001 22002 (face font-lock-string-face) 22002 22007 (face font-lock-function-name-face) 22007 22008 (face font-lock-string-face) 22008 22018 nil 22018 22019 (face font-lock-string-face) 22019 22037 (face font-lock-function-name-face) 22037 22038 (face font-lock-string-face) 22038 22048 nil 22048 22049 (face font-lock-string-face) 22049 22060 (face font-lock-function-name-face) 22060 22061 (face font-lock-string-face) 22061 22071 nil 22071 22072 (face font-lock-string-face) 22072 22093 (face font-lock-function-name-face) 22093 22094 (face font-lock-string-face) 22094 22104 nil 22104 22105 (face font-lock-string-face) 22105 22131 (face font-lock-function-name-face) 22131 22132 (face font-lock-string-face) 22132 22142 nil 22142 22143 (face font-lock-string-face) 22143 22177 (face font-lock-function-name-face) 22177 22178 (face font-lock-string-face) 22178 22188 nil 22188 22189 (face font-lock-string-face) 22189 22215 (face font-lock-function-name-face) 22215 22216 (face font-lock-string-face) 22216 22226 nil 22226 22227 (face font-lock-string-face) 22227 22253 (face font-lock-function-name-face) 22253 22254 (face font-lock-string-face) 22254 22264 nil 22264 22265 (face font-lock-string-face) 22265 22280 (face font-lock-function-name-face) 22280 22281 (face font-lock-string-face) 22281 22298 nil 22298 22299 (face font-lock-string-face) 22299 22306 (face font-lock-keyword-face) 22306 22307 (face font-lock-string-face) 22307 22319 nil 22319 22320 (face font-lock-string-face) 22320 22361 (face font-lock-constant-face) 22361 22362 (face font-lock-string-face) 22362 22372 nil 22372 22373 (face font-lock-string-face) 22373 22413 (face font-lock-constant-face) 22413 22414 (face font-lock-string-face) 22414 22424 nil 22424 22425 (face font-lock-string-face) 22425 22461 (face font-lock-constant-face) 22461 22462 (face font-lock-string-face) 22462 22472 nil 22472 22473 (face font-lock-string-face) 22473 22502 (face font-lock-constant-face) 22502 22503 (face font-lock-string-face) 22503 22513 nil 22513 22514 (face font-lock-string-face) 22514 22550 (face font-lock-constant-face) 22550 22551 (face font-lock-string-face) 22551 22561 nil 22561 22562 (face font-lock-string-face) 22562 22610 (face font-lock-constant-face) 22610 22611 (face font-lock-string-face) 22611 22621 nil 22621 22622 (face font-lock-string-face) 22622 22663 (face font-lock-constant-face) 22663 22664 (face font-lock-string-face) 22664 22674 nil 22674 22675 (face font-lock-string-face) 22675 22711 (face font-lock-constant-face) 22711 22712 (face font-lock-string-face) 22712 22722 nil 22722 22723 (face font-lock-string-face) 22723 22757 (face font-lock-constant-face) 22757 22758 (face font-lock-string-face) 22758 22768 nil 22768 22769 (face font-lock-string-face) 22769 22797 (face font-lock-constant-face) 22797 22798 (face font-lock-string-face) 22798 22808 nil 22808 22809 (face font-lock-string-face) 22809 22853 (face font-lock-constant-face) 22853 22854 (face font-lock-string-face) 22854 22864 nil 22864 22865 (face font-lock-string-face) 22865 22900 (face font-lock-constant-face) 22900 22901 (face font-lock-string-face) 22901 22911 nil 22911 22912 (face font-lock-string-face) 22912 22961 (face font-lock-constant-face) 22961 22962 (face font-lock-string-face) 22962 22972 nil 22972 22973 (face font-lock-string-face) 22973 23011 (face font-lock-constant-face) 23011 23012 (face font-lock-string-face) 23012 23022 nil 23022 23023 (face font-lock-string-face) 23023 23055 (face font-lock-constant-face) 23055 23056 (face font-lock-string-face) 23056 23066 nil 23066 23067 (face font-lock-string-face) 23067 23116 (face font-lock-constant-face) 23116 23117 (face font-lock-string-face) 23117 23127 nil 23127 23128 (face font-lock-string-face) 23128 23178 (face font-lock-constant-face) 23178 23179 (face font-lock-string-face) 23179 23189 nil 23189 23190 (face font-lock-string-face) 23190 23228 (face font-lock-constant-face) 23228 23229 (face font-lock-string-face) 23229 23239 nil 23239 23240 (face font-lock-string-face) 23240 23277 (face font-lock-constant-face) 23277 23278 (face font-lock-string-face) 23278 23288 nil 23288 23289 (face font-lock-string-face) 23289 23332 (face font-lock-constant-face) 23332 23333 (face font-lock-string-face) 23333 23343 nil 23343 23344 (face font-lock-string-face) 23344 23368 (face font-lock-constant-face) 23368 23369 (face font-lock-string-face) 23369 23379 nil 23379 23380 (face font-lock-string-face) 23380 23402 (face font-lock-constant-face) 23402 23403 (face font-lock-string-face) 23403 23413 nil 23413 23414 (face font-lock-string-face) 23414 23447 (face font-lock-constant-face) 23447 23448 (face font-lock-string-face) 23448 23458 nil 23458 23459 (face font-lock-string-face) 23459 23487 (face font-lock-constant-face) 23487 23488 (face font-lock-string-face) 23488 23498 nil 23498 23499 (face font-lock-string-face) 23499 23530 (face font-lock-constant-face) 23530 23531 (face font-lock-string-face) 23531 23541 nil 23541 23542 (face font-lock-string-face) 23542 23563 (face font-lock-constant-face) 23563 23564 (face font-lock-string-face) 23564 23574 nil 23574 23575 (face font-lock-string-face) 23575 23609 (face font-lock-constant-face) 23609 23610 (face font-lock-string-face) 23610 23620 nil 23620 23621 (face font-lock-string-face) 23621 23654 (face font-lock-constant-face) 23654 23655 (face font-lock-string-face) 23655 23665 nil 23665 23666 (face font-lock-string-face) 23666 23700 (face font-lock-constant-face) 23700 23701 (face font-lock-string-face) 23701 23711 nil 23711 23712 (face font-lock-string-face) 23712 23753 (face font-lock-constant-face) 23753 23754 (face font-lock-string-face) 23754 23764 nil 23764 23765 (face font-lock-string-face) 23765 23790 (face font-lock-constant-face) 23790 23791 (face font-lock-string-face) 23791 23801 nil 23801 23802 (face font-lock-string-face) 23802 23825 (face font-lock-constant-face) 23825 23826 (face font-lock-string-face) 23826 23836 nil 23836 23837 (face font-lock-string-face) 23837 23862 (face font-lock-constant-face) 23862 23863 (face font-lock-string-face) 23863 23873 nil 23873 23874 (face font-lock-string-face) 23874 23906 (face font-lock-constant-face) 23906 23907 (face font-lock-string-face) 23907 23917 nil 23917 23918 (face font-lock-string-face) 23918 23947 (face font-lock-constant-face) 23947 23948 (face font-lock-string-face) 23948 23958 nil 23958 23959 (face font-lock-string-face) 23959 23981 (face font-lock-constant-face) 23981 23982 (face font-lock-string-face) 23982 23992 nil 23992 23993 (face font-lock-string-face) 23993 24014 (face font-lock-constant-face) 24014 24015 (face font-lock-string-face) 24015 24025 nil 24025 24026 (face font-lock-string-face) 24026 24054 (face font-lock-constant-face) 24054 24055 (face font-lock-string-face) 24055 24065 nil 24065 24066 (face font-lock-string-face) 24066 24093 (face font-lock-constant-face) 24093 24094 (face font-lock-string-face) 24094 24104 nil 24104 24105 (face font-lock-string-face) 24105 24133 (face font-lock-constant-face) 24133 24134 (face font-lock-string-face) 24134 24144 nil 24144 24145 (face font-lock-string-face) 24145 24177 (face font-lock-constant-face) 24177 24178 (face font-lock-string-face) 24178 24188 nil 24188 24189 (face font-lock-string-face) 24189 24221 (face font-lock-constant-face) 24221 24222 (face font-lock-string-face) 24222 24232 nil 24232 24233 (face font-lock-string-face) 24233 24277 (face font-lock-constant-face) 24277 24278 (face font-lock-string-face) 24278 24288 nil 24288 24289 (face font-lock-string-face) 24289 24328 (face font-lock-constant-face) 24328 24329 (face font-lock-string-face) 24329 24339 nil 24339 24340 (face font-lock-string-face) 24340 24379 (face font-lock-constant-face) 24379 24380 (face font-lock-string-face) 24380 24390 nil 24390 24391 (face font-lock-string-face) 24391 24424 (face font-lock-constant-face) 24424 24425 (face font-lock-string-face) 24425 24435 nil 24435 24436 (face font-lock-string-face) 24436 24476 (face font-lock-constant-face) 24476 24477 (face font-lock-string-face) 24477 24487 nil 24487 24488 (face font-lock-string-face) 24488 24521 (face font-lock-constant-face) 24521 24522 (face font-lock-string-face) 24522 24532 nil 24532 24533 (face font-lock-string-face) 24533 24567 (face font-lock-constant-face) 24567 24568 (face font-lock-string-face) 24568 24578 nil 24578 24579 (face font-lock-string-face) 24579 24610 (face font-lock-constant-face) 24610 24611 (face font-lock-string-face) 24611 24621 nil 24621 24622 (face font-lock-string-face) 24622 24673 (face font-lock-constant-face) 24673 24674 (face font-lock-string-face) 24674 24684 nil 24684 24685 (face font-lock-string-face) 24685 24725 (face font-lock-constant-face) 24725 24726 (face font-lock-string-face) 24726 24736 nil 24736 24737 (face font-lock-string-face) 24737 24773 (face font-lock-constant-face) 24773 24774 (face font-lock-string-face) 24774 24784 nil 24784 24785 (face font-lock-string-face) 24785 24821 (face font-lock-constant-face) 24821 24822 (face font-lock-string-face) 24822 24832 nil 24832 24833 (face font-lock-string-face) 24833 24874 (face font-lock-constant-face) 24874 24875 (face font-lock-string-face) 24875 24885 nil 24885 24886 (face font-lock-string-face) 24886 24926 (face font-lock-constant-face) 24926 24927 (face font-lock-string-face) 24927 24937 nil 24937 24938 (face font-lock-string-face) 24938 24977 (face font-lock-constant-face) 24977 24978 (face font-lock-string-face) 24978 24988 nil 24988 24989 (face font-lock-string-face) 24989 25035 (face font-lock-constant-face) 25035 25036 (face font-lock-string-face) 25036 25046 nil 25046 25047 (face font-lock-string-face) 25047 25070 (face font-lock-constant-face) 25070 25071 (face font-lock-string-face) 25071 25081 nil 25081 25082 (face font-lock-string-face) 25082 25104 (face font-lock-constant-face) 25104 25105 (face font-lock-string-face) 25105 25115 nil 25115 25116 (face font-lock-string-face) 25116 25152 (face font-lock-constant-face) 25152 25153 (face font-lock-string-face) 25153 25163 nil 25163 25164 (face font-lock-string-face) 25164 25210 (face font-lock-constant-face) 25210 25211 (face font-lock-string-face) 25211 25221 nil 25221 25222 (face font-lock-string-face) 25222 25250 (face font-lock-constant-face) 25250 25251 (face font-lock-string-face) 25251 25268 nil 25268 25269 (face font-lock-string-face) 25269 25279 (face font-lock-keyword-face) 25279 25280 (face font-lock-string-face) 25280 25293 nil 25293 25294 (face font-lock-string-face) 25294 25319 (face font-lock-variable-name-face) 25319 25320 (face font-lock-string-face) 25320 25334 nil 25334 25335 (face font-lock-string-face) 25335 25345 (face font-lock-keyword-face) 25345 25346 (face font-lock-string-face) 25346 25363 nil 25363 25364 (face font-lock-string-face) 25364 25385 (face font-lock-variable-name-face) 25385 25386 (face font-lock-string-face) 25386 25404 nil 25404 25405 (face font-lock-string-face) 25405 25417 (face font-lock-keyword-face) 25417 25418 (face font-lock-string-face) 25418 25438 nil 25438 25439 (face font-lock-string-face) 25439 25480 (face font-lock-function-name-face) 25480 25481 (face font-lock-string-face) 25481 25550 nil 25550 25551 (face font-lock-string-face) 25551 25566 (face font-lock-variable-name-face) 25566 25567 (face font-lock-string-face) 25567 25581 nil 25581 25582 (face font-lock-string-face) 25582 25594 (face font-lock-keyword-face) 25594 25595 (face font-lock-string-face) 25595 25611 nil 25611 25612 (face font-lock-string-face) 25612 25651 (face font-lock-function-name-face) 25651 25652 (face font-lock-string-face) 25652 25688 nil 25688 25689 (face font-lock-string-face) 25689 25704 (face font-lock-variable-name-face) 25704 25705 (face font-lock-string-face) 25705 25719 nil 25719 25720 (face font-lock-string-face) 25720 25728 (face font-lock-keyword-face) 25728 25729 (face font-lock-string-face) 25729 25745 nil 25745 25746 (face font-lock-string-face) 25746 25782 (face font-lock-constant-face) 25782 25783 (face font-lock-string-face) 25783 25797 nil 25797 25798 (face font-lock-string-face) 25798 25820 (face font-lock-constant-face) 25820 25821 (face font-lock-string-face) 25821 25835 nil 25835 25836 (face font-lock-string-face) 25836 25857 (face font-lock-constant-face) 25857 25858 (face font-lock-string-face) 25858 25872 nil 25872 25873 (face font-lock-string-face) 25873 25905 (face font-lock-constant-face) 25905 25906 (face font-lock-string-face) 25906 25920 nil 25920 25921 (face font-lock-string-face) 25921 25961 (face font-lock-constant-face) 25961 25962 (face font-lock-string-face) 25962 25976 nil 25976 25977 (face font-lock-string-face) 25977 26016 (face font-lock-constant-face) 26016 26017 (face font-lock-string-face) 26017 26031 nil 26031 26032 (face font-lock-string-face) 26032 26065 (face font-lock-constant-face) 26065 26066 (face font-lock-string-face) 26066 26080 nil 26080 26081 (face font-lock-string-face) 26081 26115 (face font-lock-constant-face) 26115 26116 (face font-lock-string-face) 26116 26130 nil 26130 26131 (face font-lock-string-face) 26131 26162 (face font-lock-constant-face) 26162 26163 (face font-lock-string-face) 26163 26177 nil 26177 26178 (face font-lock-string-face) 26178 26229 (face font-lock-constant-face) 26229 26230 (face font-lock-string-face) 26230 26244 nil 26244 26245 (face font-lock-string-face) 26245 26285 (face font-lock-constant-face) 26285 26286 (face font-lock-string-face) 26286 26300 nil 26300 26301 (face font-lock-string-face) 26301 26337 (face font-lock-constant-face) 26337 26338 (face font-lock-string-face) 26338 26352 nil 26352 26353 (face font-lock-string-face) 26353 26394 (face font-lock-constant-face) 26394 26395 (face font-lock-string-face) 26395 26409 nil 26409 26410 (face font-lock-string-face) 26410 26443 (face font-lock-constant-face) 26443 26444 (face font-lock-string-face) 26444 26458 nil 26458 26459 (face font-lock-string-face) 26459 26495 (face font-lock-constant-face) 26495 26496 (face font-lock-string-face) 26496 26532 nil 26532 26533 (face font-lock-string-face) 26533 26546 (face font-lock-variable-name-face) 26546 26547 (face font-lock-string-face) 26547 26561 nil 26561 26562 (face font-lock-string-face) 26562 26572 (face font-lock-keyword-face) 26572 26573 (face font-lock-string-face) 26573 26590 nil 26590 26591 (face font-lock-string-face) 26591 26604 (face font-lock-variable-name-face) 26604 26605 (face font-lock-string-face) 26605 26623 nil 26623 26624 (face font-lock-string-face) 26624 26631 (face font-lock-keyword-face) 26631 26632 (face font-lock-string-face) 26632 26652 nil 26652 26653 (face font-lock-string-face) 26653 26688 (face font-lock-constant-face) 26688 26689 (face font-lock-string-face) 26689 26722 nil 26722 26723 (face font-lock-string-face) 26723 26730 (face font-lock-keyword-face) 26730 26731 (face font-lock-string-face) 26731 26751 nil 26751 26752 (face font-lock-string-face) 26752 26760 (face font-lock-preprocessor-face) 26760 26761 (face font-lock-string-face) 26761 26831 nil 26831 26832 (face font-lock-string-face) 26832 26873 (face font-lock-variable-name-face) 26873 26874 (face font-lock-string-face) 26874 26888 nil 26888 26889 (face font-lock-string-face) 26889 26896 (face font-lock-keyword-face) 26896 26897 (face font-lock-string-face) 26897 26913 nil 26913 26914 (face font-lock-string-face) 26914 26954 (face font-lock-constant-face) 26954 26955 (face font-lock-string-face) 26955 26991 nil 26991 26992 (face font-lock-string-face) 26992 27035 (face font-lock-variable-name-face) 27035 27036 (face font-lock-string-face) 27036 27050 nil 27050 27051 (face font-lock-string-face) 27051 27058 (face font-lock-keyword-face) 27058 27059 (face font-lock-string-face) 27059 27075 nil 27075 27076 (face font-lock-string-face) 27076 27095 (face font-lock-constant-face) 27095 27096 (face font-lock-string-face) 27096 27110 nil 27110 27111 (face font-lock-string-face) 27111 27137 (face font-lock-constant-face) 27137 27138 (face font-lock-string-face) 27138 27152 nil 27152 27153 (face font-lock-string-face) 27153 27186 (face font-lock-constant-face) 27186 27187 (face font-lock-string-face) 27187 27201 nil 27201 27202 (face font-lock-string-face) 27202 27235 (face font-lock-constant-face) 27235 27236 (face font-lock-string-face) 27236 27291 nil 27291 27292 (face font-lock-string-face) 27292 27303 (face font-lock-keyword-face) 27303 27304 (face font-lock-string-face) 27304 27306 nil 27306 27307 (face font-lock-string-face) 27307 27325 (face font-lock-function-name-face) 27325 27326 (face font-lock-string-face) 27326 27334 nil 27334 27335 (face font-lock-string-face) 27335 27339 (face font-lock-keyword-face) 27339 27340 (face font-lock-string-face) 27340 27342 nil 27342 27343 (face font-lock-string-face) 27343 27357 (face font-lock-type-face) 27357 27358 (face font-lock-string-face) 27358 27366 nil 27366 27367 (face font-lock-string-face) 27367 27379 (face font-lock-keyword-face) 27379 27380 (face font-lock-string-face) 27380 27392 nil 27392 27393 (face font-lock-string-face) 27393 27398 (face font-lock-function-name-face) 27398 27399 (face font-lock-string-face) 27399 27409 nil 27409 27410 (face font-lock-string-face) 27410 27431 (face font-lock-function-name-face) 27431 27432 (face font-lock-string-face) 27432 27442 nil 27442 27443 (face font-lock-string-face) 27443 27469 (face font-lock-function-name-face) 27469 27470 (face font-lock-string-face) 27470 27480 nil 27480 27481 (face font-lock-string-face) 27481 27507 (face font-lock-function-name-face) 27507 27508 (face font-lock-string-face) 27508 27525 nil 27525 27526 (face font-lock-string-face) 27526 27533 (face font-lock-keyword-face) 27533 27534 (face font-lock-string-face) 27534 27546 nil 27546 27547 (face font-lock-string-face) 27547 27591 (face font-lock-constant-face) 27591 27592 (face font-lock-string-face) 27592 27602 nil 27602 27603 (face font-lock-string-face) 27603 27646 (face font-lock-constant-face) 27646 27647 (face font-lock-string-face) 27647 27657 nil 27657 27658 (face font-lock-string-face) 27658 27679 (face font-lock-constant-face) 27679 27680 (face font-lock-string-face) 27680 27690 nil 27690 27691 (face font-lock-string-face) 27691 27711 (face font-lock-constant-face) 27711 27712 (face font-lock-string-face) 27712 27722 nil 27722 27723 (face font-lock-string-face) 27723 27752 (face font-lock-constant-face) 27752 27753 (face font-lock-string-face) 27753 27763 nil 27763 27764 (face font-lock-string-face) 27764 27792 (face font-lock-constant-face) 27792 27793 (face font-lock-string-face) 27793 27803 nil 27803 27804 (face font-lock-string-face) 27804 27829 (face font-lock-constant-face) 27829 27830 (face font-lock-string-face) 27830 27840 nil 27840 27841 (face font-lock-string-face) 27841 27865 (face font-lock-constant-face) 27865 27866 (face font-lock-string-face) 27866 27876 nil 27876 27877 (face font-lock-string-face) 27877 27901 (face font-lock-constant-face) 27901 27902 (face font-lock-string-face) 27902 27912 nil 27912 27913 (face font-lock-string-face) 27913 27936 (face font-lock-constant-face) 27936 27937 (face font-lock-string-face) 27937 27947 nil 27947 27948 (face font-lock-string-face) 27948 27968 (face font-lock-constant-face) 27968 27969 (face font-lock-string-face) 27969 27979 nil 27979 27980 (face font-lock-string-face) 27980 27999 (face font-lock-constant-face) 27999 28000 (face font-lock-string-face) 28000 28030 nil 28030 28031 (face font-lock-string-face) 28031 28042 (face font-lock-keyword-face) 28042 28043 (face font-lock-string-face) 28043 28045 nil 28045 28046 (face font-lock-string-face) 28046 28058 (face font-lock-function-name-face) 28058 28059 (face font-lock-string-face) 28059 28067 nil 28067 28068 (face font-lock-string-face) 28068 28072 (face font-lock-keyword-face) 28072 28073 (face font-lock-string-face) 28073 28075 nil 28075 28076 (face font-lock-string-face) 28076 28086 (face font-lock-type-face) 28086 28087 (face font-lock-string-face) 28087 28095 nil 28095 28096 (face font-lock-string-face) 28096 28108 (face font-lock-keyword-face) 28108 28109 (face font-lock-string-face) 28109 28121 nil 28121 28122 (face font-lock-string-face) 28122 28127 (face font-lock-function-name-face) 28127 28128 (face font-lock-string-face) 28128 28138 nil 28138 28139 (face font-lock-string-face) 28139 28150 (face font-lock-function-name-face) 28150 28151 (face font-lock-string-face) 28151 28161 nil 28161 28162 (face font-lock-string-face) 28162 28183 (face font-lock-function-name-face) 28183 28184 (face font-lock-string-face) 28184 28194 nil 28194 28195 (face font-lock-string-face) 28195 28216 (face font-lock-function-name-face) 28216 28217 (face font-lock-string-face) 28217 28234 nil 28234 28235 (face font-lock-string-face) 28235 28242 (face font-lock-keyword-face) 28242 28243 (face font-lock-string-face) 28243 28255 nil 28255 28256 (face font-lock-string-face) 28256 28290 (face font-lock-constant-face) 28290 28291 (face font-lock-string-face) 28291 28321 nil 28321 28322 (face font-lock-string-face) 28322 28333 (face font-lock-keyword-face) 28333 28334 (face font-lock-string-face) 28334 28336 nil 28336 28337 (face font-lock-string-face) 28337 28349 (face font-lock-function-name-face) 28349 28350 (face font-lock-string-face) 28350 28358 nil 28358 28359 (face font-lock-string-face) 28359 28363 (face font-lock-keyword-face) 28363 28364 (face font-lock-string-face) 28364 28366 nil 28366 28367 (face font-lock-string-face) 28367 28377 (face font-lock-type-face) 28377 28378 (face font-lock-string-face) 28378 28386 nil 28386 28387 (face font-lock-string-face) 28387 28394 (face font-lock-keyword-face) 28394 28395 (face font-lock-string-face) 28395 28407 nil 28407 28408 (face font-lock-string-face) 28408 28441 (face font-lock-constant-face) 28441 28442 (face font-lock-string-face) 28442 28471 nil 28471 28472 (face font-lock-string-face) 28472 28483 (face font-lock-keyword-face) 28483 28484 (face font-lock-string-face) 28484 28486 nil 28486 28487 (face font-lock-string-face) 28487 28498 (face font-lock-function-name-face) 28498 28499 (face font-lock-string-face) 28499 28507 nil 28507 28508 (face font-lock-string-face) 28508 28512 (face font-lock-keyword-face) 28512 28513 (face font-lock-string-face) 28513 28515 nil 28515 28516 (face font-lock-string-face) 28516 28526 (face font-lock-type-face) 28526 28527 (face font-lock-string-face) 28527 28535 nil 28535 28536 (face font-lock-string-face) 28536 28548 (face font-lock-keyword-face) 28548 28549 (face font-lock-string-face) 28549 28561 nil 28561 28562 (face font-lock-string-face) 28562 28567 (face font-lock-function-name-face) 28567 28568 (face font-lock-string-face) 28568 28578 nil 28578 28579 (face font-lock-string-face) 28579 28600 (face font-lock-function-name-face) 28600 28601 (face font-lock-string-face) 28601 28618 nil 28618 28619 (face font-lock-string-face) 28619 28626 (face font-lock-keyword-face) 28626 28627 (face font-lock-string-face) 28627 28639 nil 28639 28640 (face font-lock-string-face) 28640 28672 (face font-lock-constant-face) 28672 28673 (face font-lock-string-face) 28673 28698 nil 28698 28699 (face font-lock-string-face) 28699 28709 (face font-lock-keyword-face) 28709 28710 (face font-lock-string-face) 28710 28719 nil 28719 28720 (face font-lock-string-face) 28720 28729 (face font-lock-variable-name-face) 28729 28730 (face font-lock-string-face) 28730 28740 nil 28740 28741 (face font-lock-string-face) 28741 28748 (face font-lock-keyword-face) 28748 28749 (face font-lock-string-face) 28749 28773 nil 28773 28774 (face font-lock-string-face) 28774 28785 (face font-lock-keyword-face) 28785 28786 (face font-lock-string-face) 28786 28788 nil 28788 28789 (face font-lock-string-face) 28789 28799 (face font-lock-function-name-face) 28799 28800 (face font-lock-string-face) 28800 28812 nil 28812 28813 (face font-lock-string-face) 28813 28817 (face font-lock-keyword-face) 28817 28818 (face font-lock-string-face) 28818 28820 nil 28820 28821 (face font-lock-string-face) 28821 28831 (face font-lock-type-face) 28831 28832 (face font-lock-string-face) 28832 28844 nil 28844 28845 (face font-lock-string-face) 28845 28857 (face font-lock-keyword-face) 28857 28858 (face font-lock-string-face) 28858 28874 nil 28874 28875 (face font-lock-string-face) 28875 28880 (face font-lock-function-name-face) 28880 28881 (face font-lock-string-face) 28881 28895 nil 28895 28896 (face font-lock-string-face) 28896 28907 (face font-lock-function-name-face) 28907 28908 (face font-lock-string-face) 28908 28922 nil 28922 28923 (face font-lock-string-face) 28923 28944 (face font-lock-function-name-face) 28944 28945 (face font-lock-string-face) 28945 28959 nil 28959 28960 (face font-lock-string-face) 28960 29043 (face font-lock-function-name-face) 29043 29044 (face font-lock-string-face) 29044 29058 nil 29058 29059 (face font-lock-string-face) 29059 29074 (face font-lock-function-name-face) 29074 29075 (face font-lock-string-face) 29075 29100 nil 29100 29101 (face font-lock-string-face) 29101 29113 (face font-lock-keyword-face) 29113 29114 (face font-lock-string-face) 29114 29130 nil 29130 29131 (face font-lock-string-face) 29131 29133 (face font-lock-constant-face) 29133 29138 (face font-lock-variable-name-face) 29138 29163 (face font-lock-constant-face) 29163 29164 (face font-lock-string-face) 29164 29189 nil 29189 29190 (face font-lock-string-face) 29190 29197 (face font-lock-keyword-face) 29197 29198 (face font-lock-string-face) 29198 29214 nil 29214 29215 (face font-lock-string-face) 29215 29238 (face font-lock-constant-face) 29238 29239 (face font-lock-string-face) 29239 29253 nil 29253 29254 (face font-lock-string-face) 29254 29280 (face font-lock-constant-face) 29280 29281 (face font-lock-string-face) 29281 29295 nil 29295 29296 (face font-lock-string-face) 29296 29321 (face font-lock-constant-face) 29321 29322 (face font-lock-string-face) 29322 29336 nil 29336 29337 (face font-lock-string-face) 29337 29361 (face font-lock-constant-face) 29361 29362 (face font-lock-string-face) 29362 29376 nil 29376 29377 (face font-lock-string-face) 29377 29407 (face font-lock-constant-face) 29407 29408 (face font-lock-string-face) 29408 29422 nil 29422 29423 (face font-lock-string-face) 29423 29453 (face font-lock-constant-face) 29453 29454 (face font-lock-string-face) 29454 29468 nil 29468 29469 (face font-lock-string-face) 29469 29493 (face font-lock-constant-face) 29493 29494 (face font-lock-string-face) 29494 29508 nil 29508 29509 (face font-lock-string-face) 29509 29532 (face font-lock-constant-face) 29532 29533 (face font-lock-string-face) 29533 29547 nil 29547 29548 (face font-lock-string-face) 29548 29575 (face font-lock-constant-face) 29575 29576 (face font-lock-string-face) 29576 29590 nil 29590 29591 (face font-lock-string-face) 29591 29614 (face font-lock-constant-face) 29614 29615 (face font-lock-string-face) 29615 29640 nil 29640 29655 (face font-lock-string-face) 29655 29671 nil 29671 29685 (face font-lock-string-face) 29685 29703 nil 29703 29714 (face font-lock-string-face) 29714 29716 nil 29716 29719 (face font-lock-string-face) 29719 29729 nil 29729 29754 (face font-lock-comment-face) 29754 29792 nil 29792 29793 (face font-lock-string-face) 29793 29800 (face font-lock-keyword-face) 29800 29801 (face font-lock-string-face) 29801 29817 nil 29817 29818 (face font-lock-string-face) 29818 29843 (face font-lock-preprocessor-face) 29843 29844 (face font-lock-string-face) 29844 29892 nil 29892 29893 (face font-lock-string-face) 29893 29929 (face font-lock-variable-name-face) 29929 29930 (face font-lock-string-face) 29930 29940 nil 29940 29941 (face font-lock-string-face) 29941 29948 (face font-lock-keyword-face) 29948 29949 (face font-lock-string-face) 29949 29973 nil 29973 29974 (face font-lock-string-face) 29974 29985 (face font-lock-keyword-face) 29985 29986 (face font-lock-string-face) 29986 29988 nil 29988 29989 (face font-lock-string-face) 29989 30001 (face font-lock-function-name-face) 30001 30002 (face font-lock-string-face) 30002 30014 nil 30014 30015 (face font-lock-string-face) 30015 30019 (face font-lock-keyword-face) 30019 30020 (face font-lock-string-face) 30020 30022 nil 30022 30023 (face font-lock-string-face) 30023 30033 (face font-lock-type-face) 30033 30034 (face font-lock-string-face) 30034 30046 nil 30046 30047 (face font-lock-string-face) 30047 30059 (face font-lock-keyword-face) 30059 30060 (face font-lock-string-face) 30060 30076 nil 30076 30077 (face font-lock-string-face) 30077 30082 (face font-lock-function-name-face) 30082 30083 (face font-lock-string-face) 30083 30097 nil 30097 30098 (face font-lock-string-face) 30098 30109 (face font-lock-function-name-face) 30109 30110 (face font-lock-string-face) 30110 30124 nil 30124 30125 (face font-lock-string-face) 30125 30146 (face font-lock-function-name-face) 30146 30147 (face font-lock-string-face) 30147 30161 nil 30161 30162 (face font-lock-string-face) 30162 30180 (face font-lock-function-name-face) 30180 30181 (face font-lock-string-face) 30181 30206 nil 30206 30207 (face font-lock-string-face) 30207 30214 (face font-lock-keyword-face) 30214 30215 (face font-lock-string-face) 30215 30231 nil 30231 30232 (face font-lock-string-face) 30232 30266 (face font-lock-constant-face) 30266 30267 (face font-lock-string-face) 30267 30281 nil 30281 30282 (face font-lock-string-face) 30282 30321 (face font-lock-constant-face) 30321 30322 (face font-lock-string-face) 30322 30336 nil 30336 30337 (face font-lock-string-face) 30337 30375 (face font-lock-constant-face) 30375 30376 (face font-lock-string-face) 30376 30390 nil 30390 30391 (face font-lock-string-face) 30391 30430 (face font-lock-constant-face) 30430 30431 (face font-lock-string-face) 30431 30445 nil 30445 30446 (face font-lock-string-face) 30446 30484 (face font-lock-constant-face) 30484 30485 (face font-lock-string-face) 30485 30499 nil 30499 30500 (face font-lock-string-face) 30500 30533 (face font-lock-constant-face) 30533 30534 (face font-lock-string-face) 30534 30548 nil 30548 30549 (face font-lock-string-face) 30549 30581 (face font-lock-constant-face) 30581 30582 (face font-lock-string-face) 30582 30596 nil 30596 30597 (face font-lock-string-face) 30597 30626 (face font-lock-constant-face) 30626 30627 (face font-lock-string-face) 30627 30641 nil 30641 30642 (face font-lock-string-face) 30642 30670 (face font-lock-constant-face) 30670 30671 (face font-lock-string-face) 30671 30685 nil 30685 30686 (face font-lock-string-face) 30686 30714 (face font-lock-constant-face) 30714 30715 (face font-lock-string-face) 30715 30729 nil 30729 30730 (face font-lock-string-face) 30730 30757 (face font-lock-constant-face) 30757 30758 (face font-lock-string-face) 30758 30783 nil 30783 30784 (face font-lock-string-face) 30784 30794 (face font-lock-keyword-face) 30794 30795 (face font-lock-string-face) 30795 30812 nil 30812 30813 (face font-lock-string-face) 30813 30834 (face font-lock-variable-name-face) 30834 30835 (face font-lock-string-face) 30835 30853 nil 30853 30854 (face font-lock-string-face) 30854 30866 (face font-lock-keyword-face) 30866 30867 (face font-lock-string-face) 30867 30887 nil 30887 30888 (face font-lock-string-face) 30888 30917 (face font-lock-function-name-face) 30917 30918 (face font-lock-string-face) 30918 30951 nil 30951 30952 (face font-lock-string-face) 30952 30959 (face font-lock-keyword-face) 30959 30960 (face font-lock-string-face) 30960 30980 nil 30980 30981 (face font-lock-string-face) 30981 31015 (face font-lock-constant-face) 31015 31016 (face font-lock-string-face) 31016 31064 nil 31064 31065 (face font-lock-string-face) 31065 31074 (face font-lock-variable-name-face) 31074 31075 (face font-lock-string-face) 31075 31093 nil 31093 31094 (face font-lock-string-face) 31094 31106 (face font-lock-keyword-face) 31106 31107 (face font-lock-string-face) 31107 31127 nil 31127 31128 (face font-lock-string-face) 31128 31175 (face font-lock-function-name-face) 31175 31176 (face font-lock-string-face) 31176 31194 nil 31194 31195 (face font-lock-string-face) 31195 31245 (face font-lock-function-name-face) 31245 31246 (face font-lock-string-face) 31246 31279 nil 31279 31280 (face font-lock-string-face) 31280 31287 (face font-lock-keyword-face) 31287 31288 (face font-lock-string-face) 31288 31308 nil 31308 31309 (face font-lock-string-face) 31309 31341 (face font-lock-constant-face) 31341 31342 (face font-lock-string-face) 31342 31423 nil 31423 31424 (face font-lock-string-face) 31424 31462 (face font-lock-variable-name-face) 31462 31463 (face font-lock-string-face) 31463 31473 nil 31473 31474 (face font-lock-string-face) 31474 31481 (face font-lock-keyword-face) 31481 31482 (face font-lock-string-face) 31482 31506 nil 31506 31507 (face font-lock-string-face) 31507 31518 (face font-lock-keyword-face) 31518 31519 (face font-lock-string-face) 31519 31521 nil 31521 31522 (face font-lock-string-face) 31522 31539 (face font-lock-function-name-face) 31539 31540 (face font-lock-string-face) 31540 31552 nil 31552 31553 (face font-lock-string-face) 31553 31557 (face font-lock-keyword-face) 31557 31558 (face font-lock-string-face) 31558 31560 nil 31560 31561 (face font-lock-string-face) 31561 31571 (face font-lock-type-face) 31571 31572 (face font-lock-string-face) 31572 31584 nil 31584 31585 (face font-lock-string-face) 31585 31597 (face font-lock-keyword-face) 31597 31598 (face font-lock-string-face) 31598 31614 nil 31614 31615 (face font-lock-string-face) 31615 31636 (face font-lock-function-name-face) 31636 31637 (face font-lock-string-face) 31637 31651 nil 31651 31652 (face font-lock-string-face) 31652 31670 (face font-lock-function-name-face) 31670 31671 (face font-lock-string-face) 31671 31696 nil 31696 31697 (face font-lock-string-face) 31697 31706 (face font-lock-keyword-face) 31706 31707 (face font-lock-string-face) 31707 31723 nil 31723 31724 (face font-lock-string-face) 31724 31728 (face font-lock-constant-face) 31728 31729 (face font-lock-string-face) 31729 31743 nil 31743 31744 (face font-lock-string-face) 31744 31748 (face font-lock-constant-face) 31748 31749 (face font-lock-string-face) 31749 31774 nil 31774 31775 (face font-lock-string-face) 31775 31782 (face font-lock-keyword-face) 31782 31783 (face font-lock-string-face) 31783 31799 nil 31799 31800 (face font-lock-string-face) 31800 31844 (face font-lock-constant-face) 31844 31845 (face font-lock-string-face) 31845 31893 nil 31893 31894 (face font-lock-string-face) 31894 31943 (face font-lock-variable-name-face) 31943 31944 (face font-lock-string-face) 31944 31954 nil 31954 31955 (face font-lock-string-face) 31955 31962 (face font-lock-keyword-face) 31962 31963 (face font-lock-string-face) 31963 31987 nil 31987 31988 (face font-lock-string-face) 31988 31999 (face font-lock-keyword-face) 31999 32000 (face font-lock-string-face) 32000 32002 nil 32002 32003 (face font-lock-string-face) 32003 32013 (face font-lock-function-name-face) 32013 32014 (face font-lock-string-face) 32014 32026 nil 32026 32027 (face font-lock-string-face) 32027 32031 (face font-lock-keyword-face) 32031 32032 (face font-lock-string-face) 32032 32034 nil 32034 32035 (face font-lock-string-face) 32035 32045 (face font-lock-type-face) 32045 32046 (face font-lock-string-face) 32046 32058 nil 32058 32059 (face font-lock-string-face) 32059 32071 (face font-lock-keyword-face) 32071 32072 (face font-lock-string-face) 32072 32088 nil 32088 32089 (face font-lock-string-face) 32089 32094 (face font-lock-function-name-face) 32094 32095 (face font-lock-string-face) 32095 32109 nil 32109 32110 (face font-lock-string-face) 32110 32121 (face font-lock-function-name-face) 32121 32122 (face font-lock-string-face) 32122 32136 nil 32136 32137 (face font-lock-string-face) 32137 32158 (face font-lock-function-name-face) 32158 32159 (face font-lock-string-face) 32159 32173 nil 32173 32174 (face font-lock-string-face) 32174 32192 (face font-lock-function-name-face) 32192 32193 (face font-lock-string-face) 32193 32218 nil 32218 32219 (face font-lock-string-face) 32219 32232 (face font-lock-keyword-face) 32232 32233 (face font-lock-string-face) 32233 32249 nil 32249 32250 (face font-lock-string-face) 32250 32259 (face font-lock-keyword-face) 32259 32260 (face font-lock-string-face) 32260 32278 nil 32278 32279 (face font-lock-string-face) 32279 32283 (face font-lock-constant-face) 32283 32284 (face font-lock-string-face) 32284 32300 nil 32300 32301 (face font-lock-string-face) 32301 32306 (face font-lock-constant-face) 32306 32307 (face font-lock-string-face) 32307 32323 nil 32323 32324 (face font-lock-string-face) 32324 32333 (face font-lock-constant-face) 32333 32334 (face font-lock-string-face) 32334 32350 nil 32350 32351 (face font-lock-string-face) 32351 32357 (face font-lock-constant-face) 32357 32358 (face font-lock-string-face) 32358 32398 nil 32398 32399 (face font-lock-string-face) 32399 32406 (face font-lock-keyword-face) 32406 32407 (face font-lock-string-face) 32407 32423 nil 32423 32424 (face font-lock-string-face) 32424 32462 (face font-lock-constant-face) 32462 32463 (face font-lock-string-face) 32463 32477 nil 32477 32478 (face font-lock-string-face) 32478 32515 (face font-lock-constant-face) 32515 32516 (face font-lock-string-face) 32516 32530 nil 32530 32531 (face font-lock-string-face) 32531 32568 (face font-lock-constant-face) 32568 32569 (face font-lock-string-face) 32569 32583 nil 32583 32584 (face font-lock-string-face) 32584 32620 (face font-lock-constant-face) 32620 32621 (face font-lock-string-face) 32621 32635 nil 32635 32636 (face font-lock-string-face) 32636 32666 (face font-lock-constant-face) 32666 32667 (face font-lock-string-face) 32667 32681 nil 32681 32682 (face font-lock-string-face) 32682 32720 (face font-lock-constant-face) 32720 32721 (face font-lock-string-face) 32721 32735 nil 32735 32736 (face font-lock-string-face) 32736 32773 (face font-lock-constant-face) 32773 32774 (face font-lock-string-face) 32774 32822 nil 32822 32823 (face font-lock-string-face) 32823 32838 (face font-lock-variable-name-face) 32838 32839 (face font-lock-string-face) 32839 32849 nil 32849 32850 (face font-lock-string-face) 32850 32857 (face font-lock-keyword-face) 32857 32858 (face font-lock-string-face) 32858 32882 nil 32882 32883 (face font-lock-string-face) 32883 32894 (face font-lock-keyword-face) 32894 32895 (face font-lock-string-face) 32895 32897 nil 32897 32898 (face font-lock-string-face) 32898 32912 (face font-lock-function-name-face) 32912 32913 (face font-lock-string-face) 32913 32925 nil 32925 32926 (face font-lock-string-face) 32926 32930 (face font-lock-keyword-face) 32930 32931 (face font-lock-string-face) 32931 32933 nil 32933 32934 (face font-lock-string-face) 32934 32948 (face font-lock-type-face) 32948 32949 (face font-lock-string-face) 32949 32961 nil 32961 32962 (face font-lock-string-face) 32962 32969 (face font-lock-keyword-face) 32969 32970 (face font-lock-string-face) 32970 32986 nil 32986 32987 (face font-lock-string-face) 32987 33022 (face font-lock-constant-face) 33022 33023 (face font-lock-string-face) 33023 33037 nil 33037 33038 (face font-lock-string-face) 33038 33072 (face font-lock-constant-face) 33072 33073 (face font-lock-string-face) 33073 33098 nil 33098 33099 (face font-lock-string-face) 33099 33111 (face font-lock-keyword-face) 33111 33112 (face font-lock-string-face) 33112 33128 nil 33128 33129 (face font-lock-string-face) 33129 33150 (face font-lock-function-name-face) 33150 33151 (face font-lock-string-face) 33151 33176 nil 33176 33177 (face font-lock-string-face) 33177 33189 (face font-lock-keyword-face) 33189 33190 (face font-lock-string-face) 33190 33206 nil 33206 33207 (face font-lock-string-face) 33207 33209 (face font-lock-constant-face) 33209 33232 (face font-lock-variable-name-face) 33232 33239 (face font-lock-constant-face) 33239 33240 (face font-lock-string-face) 33240 33265 nil 33265 33266 (face font-lock-string-face) 33266 33273 (face font-lock-keyword-face) 33273 33274 (face font-lock-string-face) 33274 33306 nil 33306 33307 (face font-lock-string-face) 33307 33318 (face font-lock-keyword-face) 33318 33319 (face font-lock-string-face) 33319 33321 nil 33321 33322 (face font-lock-string-face) 33322 33342 (face font-lock-function-name-face) 33342 33343 (face font-lock-string-face) 33343 33359 nil 33359 33360 (face font-lock-string-face) 33360 33366 (face font-lock-keyword-face) 33366 33367 (face font-lock-string-face) 33367 33387 nil 33387 33388 (face font-lock-string-face) 33388 33434 (face font-lock-constant-face) 33434 33435 (face font-lock-string-face) 33435 33453 nil 33453 33454 (face font-lock-string-face) 33454 33519 (face font-lock-constant-face) 33519 33520 (face font-lock-string-face) 33520 33553 nil 33553 33554 (face font-lock-string-face) 33554 33561 (face font-lock-keyword-face) 33561 33562 (face font-lock-string-face) 33562 33582 nil 33582 33583 (face font-lock-string-face) 33583 33585 (face font-lock-constant-face) 33585 33608 (face font-lock-variable-name-face) 33608 33647 (face font-lock-constant-face) 33647 33648 (face font-lock-string-face) 33648 33681 nil 33681 33682 (face font-lock-string-face) 33682 33688 (face font-lock-keyword-face) 33688 33689 (face font-lock-string-face) 33689 33709 nil 33709 33710 (face font-lock-string-face) 33710 33716 (face font-lock-constant-face) 33716 33717 (face font-lock-string-face) 33717 33735 nil 33735 33736 (face font-lock-string-face) 33736 33738 (face font-lock-constant-face) 33738 33743 (face font-lock-variable-name-face) 33743 33788 (face font-lock-constant-face) 33788 33789 (face font-lock-string-face) 33789 33807 nil 33807 33808 (face font-lock-string-face) 33808 33810 (face font-lock-constant-face) 33810 33811 (face font-lock-string-face) 33811 33829 nil 33829 33830 (face font-lock-string-face) 33830 33833 (face font-lock-constant-face) 33833 33840 (face font-lock-variable-name-face) 33840 33841 (face font-lock-constant-face) 33841 33842 (face font-lock-string-face) 33842 33860 nil 33860 33861 (face font-lock-string-face) 33861 33864 (face font-lock-constant-face) 33864 33872 (face font-lock-variable-name-face) 33872 33873 (face font-lock-constant-face) 33873 33874 (face font-lock-string-face) 33874 33952 nil 33952 33953 (face font-lock-string-face) 33953 33964 (face font-lock-keyword-face) 33964 33965 (face font-lock-string-face) 33965 33967 nil 33967 33968 (face font-lock-string-face) 33968 33978 (face font-lock-function-name-face) 33978 33979 (face font-lock-string-face) 33979 33991 nil 33991 33992 (face font-lock-string-face) 33992 33996 (face font-lock-keyword-face) 33996 33997 (face font-lock-string-face) 33997 33999 nil 33999 34000 (face font-lock-string-face) 34000 34004 (face font-lock-type-face) 34004 34005 (face font-lock-string-face) 34005 34017 nil 34017 34018 (face font-lock-string-face) 34018 34030 (face font-lock-keyword-face) 34030 34031 (face font-lock-string-face) 34031 34035 nil 34035 34036 (face font-lock-string-face) 34036 34062 (face font-lock-function-name-face) 34062 34063 (face font-lock-string-face) 34063 34077 nil 34077 34078 (face font-lock-string-face) 34078 34087 (face font-lock-keyword-face) 34087 34088 (face font-lock-string-face) 34088 34104 nil 34104 34105 (face font-lock-string-face) 34105 34117 (face font-lock-variable-name-face) 34117 34118 (face font-lock-string-face) 34118 34120 nil 34120 34121 (face font-lock-string-face) 34121 34126 (face font-lock-variable-name-face) 34126 34127 (face font-lock-string-face) 34127 34141 nil 34141 34142 (face font-lock-string-face) 34142 34153 (face font-lock-variable-name-face) 34153 34154 (face font-lock-string-face) 34154 34156 nil 34156 34157 (face font-lock-string-face) 34157 34174 (face font-lock-variable-name-face) 34174 34175 (face font-lock-string-face) 34175 34200 nil 34200 34201 (face font-lock-string-face) 34201 34209 (face font-lock-keyword-face) 34209 34210 (face font-lock-string-face) 34210 34214 nil 34214 34215 (face font-lock-string-face) 34215 34233 (face font-lock-constant-face) 34233 34234 (face font-lock-string-face) 34234 34268 nil 34268 34287 (face font-lock-comment-face) 34287 34293 nil 34293 34365 (face font-lock-comment-face) 34365 34371 nil 34371 34372 (face font-lock-string-face) 34372 34379 (face font-lock-keyword-face) 34379 34380 (face font-lock-string-face) 34380 34404 nil 34404 34405 (face font-lock-string-face) 34405 34416 (face font-lock-keyword-face) 34416 34417 (face font-lock-string-face) 34417 34419 nil 34419 34420 (face font-lock-string-face) 34420 34436 (face font-lock-function-name-face) 34436 34437 (face font-lock-string-face) 34437 34449 nil 34449 34450 (face font-lock-string-face) 34450 34454 (face font-lock-keyword-face) 34454 34455 (face font-lock-string-face) 34455 34457 nil 34457 34458 (face font-lock-string-face) 34458 34468 (face font-lock-type-face) 34468 34469 (face font-lock-string-face) 34469 34481 nil 34481 34482 (face font-lock-string-face) 34482 34494 (face font-lock-keyword-face) 34494 34495 (face font-lock-string-face) 34495 34511 nil 34511 34512 (face font-lock-string-face) 34512 34517 (face font-lock-function-name-face) 34517 34518 (face font-lock-string-face) 34518 34532 nil 34532 34533 (face font-lock-string-face) 34533 34551 (face font-lock-function-name-face) 34551 34552 (face font-lock-string-face) 34552 34566 nil 34566 34567 (face font-lock-string-face) 34567 34588 (face font-lock-function-name-face) 34588 34589 (face font-lock-string-face) 34589 34603 nil 34603 34604 (face font-lock-string-face) 34604 34630 (face font-lock-function-name-face) 34630 34631 (face font-lock-string-face) 34631 34645 nil 34645 34646 (face font-lock-string-face) 34646 34680 (face font-lock-function-name-face) 34680 34681 (face font-lock-string-face) 34681 34695 nil 34695 34696 (face font-lock-string-face) 34696 34730 (face font-lock-function-name-face) 34730 34731 (face font-lock-string-face) 34731 34745 nil 34745 34746 (face font-lock-string-face) 34746 34772 (face font-lock-function-name-face) 34772 34773 (face font-lock-string-face) 34773 34787 nil 34787 34788 (face font-lock-string-face) 34788 34827 (face font-lock-function-name-face) 34827 34828 (face font-lock-string-face) 34828 34853 nil 34853 34854 (face font-lock-string-face) 34854 34861 (face font-lock-keyword-face) 34861 34862 (face font-lock-string-face) 34862 34878 nil 34878 34879 (face font-lock-string-face) 34879 34904 (face font-lock-constant-face) 34904 34905 (face font-lock-string-face) 34905 34930 nil 34930 34931 (face font-lock-string-face) 34931 34941 (face font-lock-keyword-face) 34941 34942 (face font-lock-string-face) 34942 34959 nil 34959 34960 (face font-lock-string-face) 34960 34981 (face font-lock-variable-name-face) 34981 34982 (face font-lock-string-face) 34982 35000 nil 35000 35001 (face font-lock-string-face) 35001 35013 (face font-lock-keyword-face) 35013 35014 (face font-lock-string-face) 35014 35034 nil 35034 35077 (face font-lock-comment-face) 35077 35093 nil 35093 35123 (face font-lock-comment-face) 35123 35139 nil 35139 35164 (face font-lock-comment-face) 35164 35180 nil 35180 35194 (face font-lock-comment-face) 35194 35210 nil 35210 35211 (face font-lock-string-face) 35211 35240 (face font-lock-function-name-face) 35240 35241 (face font-lock-string-face) 35241 35274 nil 35274 35275 (face font-lock-string-face) 35275 35285 (face font-lock-keyword-face) 35285 35286 (face font-lock-string-face) 35286 35307 nil 35307 35308 (face font-lock-string-face) 35308 35329 (face font-lock-variable-name-face) 35329 35330 (face font-lock-string-face) 35330 35352 nil 35352 35353 (face font-lock-string-face) 35353 35365 (face font-lock-keyword-face) 35365 35366 (face font-lock-string-face) 35366 35390 nil 35390 35391 (face font-lock-string-face) 35391 35432 (face font-lock-function-name-face) 35432 35433 (face font-lock-string-face) 35433 35553 nil 35553 35554 (face font-lock-string-face) 35554 35565 (face font-lock-keyword-face) 35565 35566 (face font-lock-string-face) 35566 35568 nil 35568 35569 (face font-lock-string-face) 35569 35592 (face font-lock-function-name-face) 35592 35593 (face font-lock-string-face) 35593 35605 nil 35605 35606 (face font-lock-string-face) 35606 35610 (face font-lock-keyword-face) 35610 35611 (face font-lock-string-face) 35611 35613 nil 35613 35614 (face font-lock-string-face) 35614 35624 (face font-lock-type-face) 35624 35625 (face font-lock-string-face) 35625 35637 nil 35637 35638 (face font-lock-string-face) 35638 35650 (face font-lock-keyword-face) 35650 35651 (face font-lock-string-face) 35651 35667 nil 35667 35668 (face font-lock-string-face) 35668 35673 (face font-lock-function-name-face) 35673 35674 (face font-lock-string-face) 35674 35688 nil 35688 35689 (face font-lock-string-face) 35689 35707 (face font-lock-function-name-face) 35707 35708 (face font-lock-string-face) 35708 35722 nil 35722 35723 (face font-lock-string-face) 35723 35757 (face font-lock-function-name-face) 35757 35758 (face font-lock-string-face) 35758 35772 nil 35772 35773 (face font-lock-string-face) 35773 35799 (face font-lock-function-name-face) 35799 35800 (face font-lock-string-face) 35800 35814 nil 35814 35815 (face font-lock-string-face) 35815 35841 (face font-lock-function-name-face) 35841 35842 (face font-lock-string-face) 35842 35856 nil 35856 35857 (face font-lock-string-face) 35857 35896 (face font-lock-function-name-face) 35896 35897 (face font-lock-string-face) 35897 35922 nil 35922 35923 (face font-lock-string-face) 35923 35930 (face font-lock-keyword-face) 35930 35931 (face font-lock-string-face) 35931 35947 nil 35947 35948 (face font-lock-string-face) 35948 35970 (face font-lock-constant-face) 35970 35971 (face font-lock-string-face) 35971 35985 nil 35985 35986 (face font-lock-string-face) 35986 36011 (face font-lock-constant-face) 36011 36012 (face font-lock-string-face) 36012 36026 nil 36026 36027 (face font-lock-string-face) 36027 36060 (face font-lock-constant-face) 36060 36061 (face font-lock-string-face) 36061 36075 nil 36075 36076 (face font-lock-string-face) 36076 36117 (face font-lock-constant-face) 36117 36118 (face font-lock-string-face) 36118 36143 nil 36143 36144 (face font-lock-string-face) 36144 36154 (face font-lock-keyword-face) 36154 36155 (face font-lock-string-face) 36155 36172 nil 36172 36173 (face font-lock-string-face) 36173 36198 (face font-lock-variable-name-face) 36198 36199 (face font-lock-string-face) 36199 36217 nil 36217 36218 (face font-lock-string-face) 36218 36228 (face font-lock-keyword-face) 36228 36229 (face font-lock-string-face) 36229 36250 nil 36250 36251 (face font-lock-string-face) 36251 36272 (face font-lock-variable-name-face) 36272 36273 (face font-lock-string-face) 36273 36295 nil 36295 36296 (face font-lock-string-face) 36296 36308 (face font-lock-keyword-face) 36308 36309 (face font-lock-string-face) 36309 36333 nil 36333 36334 (face font-lock-string-face) 36334 36375 (face font-lock-function-name-face) 36375 36376 (face font-lock-string-face) 36376 36496 nil 36496 36497 (face font-lock-string-face) 36497 36508 (face font-lock-keyword-face) 36508 36509 (face font-lock-string-face) 36509 36511 nil 36511 36512 (face font-lock-string-face) 36512 36524 (face font-lock-function-name-face) 36524 36525 (face font-lock-string-face) 36525 36537 nil 36537 36538 (face font-lock-string-face) 36538 36542 (face font-lock-keyword-face) 36542 36543 (face font-lock-string-face) 36543 36545 nil 36545 36546 (face font-lock-string-face) 36546 36556 (face font-lock-type-face) 36556 36557 (face font-lock-string-face) 36557 36569 nil 36569 36570 (face font-lock-string-face) 36570 36582 (face font-lock-keyword-face) 36582 36583 (face font-lock-string-face) 36583 36599 nil 36599 36600 (face font-lock-string-face) 36600 36605 (face font-lock-function-name-face) 36605 36606 (face font-lock-string-face) 36606 36620 nil 36620 36621 (face font-lock-string-face) 36621 36642 (face font-lock-function-name-face) 36642 36643 (face font-lock-string-face) 36643 36657 nil 36657 36658 (face font-lock-string-face) 36658 36697 (face font-lock-function-name-face) 36697 36698 (face font-lock-string-face) 36698 36723 nil 36723 36724 (face font-lock-string-face) 36724 36731 (face font-lock-keyword-face) 36731 36732 (face font-lock-string-face) 36732 36748 nil 36748 36749 (face font-lock-string-face) 36749 36782 (face font-lock-constant-face) 36782 36783 (face font-lock-string-face) 36783 36829 nil 36829 36830 (face font-lock-string-face) 36830 36841 (face font-lock-keyword-face) 36841 36842 (face font-lock-string-face) 36842 36844 nil 36844 36845 (face font-lock-string-face) 36845 36856 (face font-lock-function-name-face) 36856 36857 (face font-lock-string-face) 36857 36869 nil 36869 36870 (face font-lock-string-face) 36870 36874 (face font-lock-keyword-face) 36874 36875 (face font-lock-string-face) 36875 36877 nil 36877 36878 (face font-lock-string-face) 36878 36888 (face font-lock-type-face) 36888 36889 (face font-lock-string-face) 36889 36901 nil 36901 36902 (face font-lock-string-face) 36902 36914 (face font-lock-keyword-face) 36914 36915 (face font-lock-string-face) 36915 36931 nil 36931 36932 (face font-lock-string-face) 36932 36937 (face font-lock-function-name-face) 36937 36938 (face font-lock-string-face) 36938 36952 nil 36952 36953 (face font-lock-string-face) 36953 36974 (face font-lock-function-name-face) 36974 36975 (face font-lock-string-face) 36975 36989 nil 36989 36990 (face font-lock-string-face) 36990 37029 (face font-lock-function-name-face) 37029 37030 (face font-lock-string-face) 37030 37055 nil 37055 37056 (face font-lock-string-face) 37056 37063 (face font-lock-keyword-face) 37063 37064 (face font-lock-string-face) 37064 37080 nil 37080 37081 (face font-lock-string-face) 37081 37113 (face font-lock-constant-face) 37113 37114 (face font-lock-string-face) 37114 37163 nil)
diff --git a/tools/gyp/tools/fixup_dep.py b/tools/gyp/tools/fixup_dep.py
deleted file mode 100755
index 4782dc2..0000000
--- a/tools/gyp/tools/fixup_dep.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/usr/bin/python -S
-# Copyright 2012 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# We have to fixup the deps output in a few ways.
-# (1) the file output should mention the proper .o file.
-# ccache or distcc lose the path to the target, so we convert a rule of
-# the form:
-#   foobar.o: DEP1 DEP2
-# into
-#   path/to/foobar.o: DEP1 DEP2
-# (2) we want missing files not to cause us to fail to build.
-# We want to rewrite
-#   foobar.o: DEP1 DEP2 \\
-#               DEP3
-# to
-#   DEP1:
-#   DEP2:
-#   DEP3:
-# so if the files are missing, they're just considered phony rules.
-# We have to do some pretty insane escaping to get those backslashes
-# and dollar signs past make, the shell, and sed at the same time.
-# Doesn't work with spaces, but that's fine: .d files have spaces in
-# their names replaced with other characters.
-
-# Additionally, this is done in Python to increase flexibility and to
-# speed up the process on cygwin, where fork() is very slow and one
-# script can be much faster than many small utilities chained together.
-
-import platform
-import os
-import re
-import sys
-
-if sys.platform == 'cygwin':
-  import cygpath
-  import ntpath
-
-def main(raw_depfile_path, processed_depfile_path, target_path):
-  # it's okay if it doesn't exist.
-  # maybe there were no #include directives.
-  if not os.path.exists(raw_depfile_path):
-    return
-
-  raw_deps = file(raw_depfile_path).readlines()
-  cwd = os.path.realpath(os.getcwd())
-  processed_deps = fixup_dep(raw_deps, target_path, cwd)
-
-  f = file(processed_depfile_path, 'w')
-  f.write(processed_deps)
-  f.close()
-
-  # remove the raw file
-  os.unlink(raw_depfile_path)
-
-def cygwin_fix_dep_path(path, cwd):
-  # fixes dependency paths so that they can be tracked by our system
-  # makes absolute paths into relative paths if they are descendants of cwd.
-  assert(sys.platform == 'cygwin')
-  
-  path = cygpath.to_unix(path)
-  if path[:len(cwd)] == cwd:
-    path = path[len(cwd)+1:]
-
-  # Ninja targets have '\'s on Cygwin, not '/'s.
-  path = ntpath.normpath(path).replace('\\', '\\\\')
-
-  return path
-
-def linux_fix_dep_path(p):
-  return p.replace('\\', '/')
-
-def fixup_dep(contents, target_path, cwd):
-  # contents is an array of lines of text from the raw dep file.
-  # we will return the processed dep file.
-
-  # Some compilers generate each dependency on a separate line,
-  # e.g.
-  # target: dep0
-  # target: dep1
-  # So detect that.
-
-  if len(contents) > 1 and contents[1].find(':') != -1:
-    is_separate_lines = 1
-  else:
-    is_separate_lines = 0
-
-  if is_separate_lines:
-    first_obj, first_dep = contents[0].split(':', 1)
-    deps = [first_dep.rstrip()]
-    for l in contents:
-      obj, dep = l.split(':', 1)
-
-      # For now assume every target is the same.
-      # If it's not, we'll have to fix this script.
-      if obj != first_obj:
-        raise Exception('Unexpected target {0}'.format(obj))
-
-      deps.extend([dep.rstrip()])
-  else:
-    # strip newlines
-    contents = [ i.rstrip() for i in contents ]
-
-    # break the contents down into the object and its dependencies
-    obj, first_dep = contents[0].split(':', 1)
-    deps = [ first_dep ]
-    deps.extend(contents[1:])
-
-  # these deps still have spaces at the front and
-  # (potentially) backslashes at the end
-  deps = [ i.strip(' \t\\') for i in deps ]
-
-  # some compilers cannot distinguish between system includes and local
-  # includes specified with #include <...>, so we will make that call
-  # based on the paths.  any absolute paths will be assumed to be system
-  # includes and will be filtered out.
-  deps = filter(lambda i: len(i) and i[0] != '/', deps)
-
-  if sys.platform == 'cygwin':
-    # some compilers will generate dependencies with Windows paths, which
-    # cygwin's make doesn't like.  the colons confuse it.
-    # Also, we need the listed dep files to match the format of paths
-    # output by ninja.GypPathToNinja() so that dependency target names match up
-    # between gyp/ninja and those in the dep file.
-    deps = [ cygwin_fix_dep_path(i, cwd) for i in deps ]
-  else:
-    # This is only needed for cross-compilers that might generate
-    # Windows-style paths.
-    # ninja expects forwards slashes.
-    deps = [ linux_fix_dep_path(i) for i in deps ]
-
-  # now that the data is pre-processed, the formatting is easy.
-  # use the target path (full) instead of what the compiler gave us in "obj",
-  # which may be only the basename
-  return "%s: \\\n" % target_path + \
-      " \\\n".join([ " %s" % i for i in deps ]) + "\n" + \
-      ":\n".join(deps) + ":\n"
-
-main(sys.argv[1], sys.argv[2], sys.argv[3])
-
diff --git a/tools/gyp/tools/graphviz.py b/tools/gyp/tools/graphviz.py
deleted file mode 100755
index 326ae22..0000000
--- a/tools/gyp/tools/graphviz.py
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2011 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Using the JSON dumped by the dump-dependency-json generator,
-generate input suitable for graphviz to render a dependency graph of
-targets."""
-
-import collections
-import json
-import sys
-
-
-def ParseTarget(target):
-  target, _, suffix = target.partition('#')
-  filename, _, target = target.partition(':')
-  return filename, target, suffix
-
-
-def LoadEdges(filename, targets):
-  """Load the edges map from the dump file, and filter it to only
-  show targets in |targets| and their depedendents."""
-
-  file = open('dump.json')
-  edges = json.load(file)
-  file.close()
-
-  # Copy out only the edges we're interested in from the full edge list.
-  target_edges = {}
-  to_visit = targets[:]
-  while to_visit:
-    src = to_visit.pop()
-    if src in target_edges:
-      continue
-    target_edges[src] = edges[src]
-    to_visit.extend(edges[src])
-
-  return target_edges
-
-
-def WriteGraph(edges):
-  """Print a graphviz graph to stdout.
-  |edges| is a map of target to a list of other targets it depends on."""
-
-  # Bucket targets by file.
-  files = collections.defaultdict(list)
-  for src, dst in edges.items():
-    build_file, target_name, toolset = ParseTarget(src)
-    files[build_file].append(src)
-
-  print 'digraph D {'
-  print '  fontsize=8'  # Used by subgraphs.
-  print '  node [fontsize=8]'
-
-  # Output nodes by file.  We must first write out each node within
-  # its file grouping before writing out any edges that may refer
-  # to those nodes.
-  for filename, targets in files.items():
-    if len(targets) == 1:
-      # If there's only one node for this file, simplify
-      # the display by making it a box without an internal node.
-      target = targets[0]
-      build_file, target_name, toolset = ParseTarget(target)
-      print '  "%s" [shape=box, label="%s\\n%s"]' % (target, filename,
-                                                     target_name)
-    else:
-      # Group multiple nodes together in a subgraph.
-      print '  subgraph "cluster_%s" {' % filename
-      print '    label = "%s"' % filename
-      for target in targets:
-        build_file, target_name, toolset = ParseTarget(target)
-        print '    "%s" [label="%s"]' % (target, target_name)
-      print '  }'
-
-  # Now that we've placed all the nodes within subgraphs, output all
-  # the edges between nodes.
-  for src, dsts in edges.items():
-    for dst in dsts:
-      print '  "%s" -> "%s"' % (src, dst)
-
-  print '}'
-
-
-def main():
-  if len(sys.argv) < 2:
-    print >>sys.stderr, __doc__
-    print >>sys.stderr
-    print >>sys.stderr, 'usage: %s target1 target2...' % (sys.argv[0])
-    return 1
-
-  edges = LoadEdges('dump.json', sys.argv[1:])
-
-  WriteGraph(edges)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/tools/gyp/tools/pretty_gyp.py b/tools/gyp/tools/pretty_gyp.py
deleted file mode 100755
index c51d358..0000000
--- a/tools/gyp/tools/pretty_gyp.py
+++ /dev/null
@@ -1,155 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Pretty-prints the contents of a GYP file."""
-
-import sys
-import re
-
-
-# Regex to remove comments when we're counting braces.
-COMMENT_RE = re.compile(r'\s*#.*')
-
-# Regex to remove quoted strings when we're counting braces.
-# It takes into account quoted quotes, and makes sure that the quotes match.
-# NOTE: It does not handle quotes that span more than one line, or
-# cases where an escaped quote is preceeded by an escaped backslash.
-QUOTE_RE_STR = r'(?P<q>[\'"])(.*?)(?<![^\\][\\])(?P=q)'
-QUOTE_RE = re.compile(QUOTE_RE_STR)
-
-
-def comment_replace(matchobj):
-  return matchobj.group(1) + matchobj.group(2) + '#' * len(matchobj.group(3))
-
-
-def mask_comments(input):
-  """Mask the quoted strings so we skip braces inside quoted strings."""
-  search_re = re.compile(r'(.*?)(#)(.*)')
-  return [search_re.sub(comment_replace, line) for line in input]
-
-
-def quote_replace(matchobj):
-  return "%s%s%s%s" % (matchobj.group(1),
-                       matchobj.group(2),
-                       'x'*len(matchobj.group(3)),
-                       matchobj.group(2))
-
-
-def mask_quotes(input):
-  """Mask the quoted strings so we skip braces inside quoted strings."""
-  search_re = re.compile(r'(.*?)' + QUOTE_RE_STR)
-  return [search_re.sub(quote_replace, line) for line in input]
-
-
-def do_split(input, masked_input, search_re):
-  output = []
-  mask_output = []
-  for (line, masked_line) in zip(input, masked_input):
-    m = search_re.match(masked_line)
-    while m:
-      split = len(m.group(1))
-      line = line[:split] + r'\n' + line[split:]
-      masked_line = masked_line[:split] + r'\n' + masked_line[split:]
-      m = search_re.match(masked_line)
-    output.extend(line.split(r'\n'))
-    mask_output.extend(masked_line.split(r'\n'))
-  return (output, mask_output)
-
-
-def split_double_braces(input):
-  """Masks out the quotes and comments, and then splits appropriate
-  lines (lines that matche the double_*_brace re's above) before
-  indenting them below.
-
-  These are used to split lines which have multiple braces on them, so
-  that the indentation looks prettier when all laid out (e.g. closing
-  braces make a nice diagonal line).
-  """
-  double_open_brace_re = re.compile(r'(.*?[\[\{\(,])(\s*)([\[\{\(])')
-  double_close_brace_re = re.compile(r'(.*?[\]\}\)],?)(\s*)([\]\}\)])')
-
-  masked_input = mask_quotes(input)
-  masked_input = mask_comments(masked_input)
-
-  (output, mask_output) = do_split(input, masked_input, double_open_brace_re)
-  (output, mask_output) = do_split(output, mask_output, double_close_brace_re)
-
-  return output
-
-
-def count_braces(line):
-  """keeps track of the number of braces on a given line and returns the result.
-
-  It starts at zero and subtracts for closed braces, and adds for open braces.
-  """
-  open_braces = ['[', '(', '{']
-  close_braces = [']', ')', '}']
-  closing_prefix_re = re.compile(r'(.*?[^\s\]\}\)]+.*?)([\]\}\)],?)\s*$')
-  cnt = 0
-  stripline = COMMENT_RE.sub(r'', line)
-  stripline = QUOTE_RE.sub(r"''", stripline)
-  for char in stripline:
-    for brace in open_braces:
-      if char == brace:
-        cnt += 1
-    for brace in close_braces:
-      if char == brace:
-        cnt -= 1
-
-  after = False
-  if cnt > 0:
-    after = True
-
-  # This catches the special case of a closing brace having something
-  # other than just whitespace ahead of it -- we don't want to
-  # unindent that until after this line is printed so it stays with
-  # the previous indentation level.
-  if cnt < 0 and closing_prefix_re.match(stripline):
-    after = True
-  return (cnt, after)
-
-
-def prettyprint_input(lines):
-  """Does the main work of indenting the input based on the brace counts."""
-  indent = 0
-  basic_offset = 2
-  last_line = ""
-  for line in lines:
-    if COMMENT_RE.match(line):
-      print line
-    else:
-      line = line.strip('\r\n\t ')  # Otherwise doesn't strip \r on Unix.
-      if len(line) > 0:
-        (brace_diff, after) = count_braces(line)
-        if brace_diff != 0:
-          if after:
-            print " " * (basic_offset * indent) + line
-            indent += brace_diff
-          else:
-            indent += brace_diff
-            print " " * (basic_offset * indent) + line
-        else:
-          print " " * (basic_offset * indent) + line
-      else:
-        print ""
-      last_line = line
-
-
-def main():
-  if len(sys.argv) > 1:
-    data = open(sys.argv[1]).read().splitlines()
-  else:
-    data = sys.stdin.read().splitlines()
-  # Split up the double braces.
-  lines = split_double_braces(data)
-
-  # Indent and print the output.
-  prettyprint_input(lines)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/tools/gyp/tools/pretty_sln.py b/tools/gyp/tools/pretty_sln.py
deleted file mode 100755
index 3195d85..0000000
--- a/tools/gyp/tools/pretty_sln.py
+++ /dev/null
@@ -1,168 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Prints the information in a sln file in a diffable way.
-
-   It first outputs each projects in alphabetical order with their
-   dependencies.
-
-   Then it outputs a possible build order.
-"""
-
-__author__ = 'nsylvain (Nicolas Sylvain)'
-
-import os
-import re
-import sys
-import pretty_vcproj
-
-def BuildProject(project, built, projects, deps):
-  # if all dependencies are done, we can build it, otherwise we try to build the
-  # dependency.
-  # This is not infinite-recursion proof.
-  for dep in deps[project]:
-    if dep not in built:
-      BuildProject(dep, built, projects, deps)
-  print project
-  built.append(project)
-
-def ParseSolution(solution_file):
-  # All projects, their clsid and paths.
-  projects = dict()
-
-  # A list of dependencies associated with a project.
-  dependencies = dict()
-
-  # Regular expressions that matches the SLN format.
-  # The first line of a project definition.
-  begin_project = re.compile(('^Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942'
-                              '}"\) = "(.*)", "(.*)", "(.*)"$'))
-  # The last line of a project definition.
-  end_project = re.compile('^EndProject$')
-  # The first line of a dependency list.
-  begin_dep = re.compile('ProjectSection\(ProjectDependencies\) = postProject$')
-  # The last line of a dependency list.
-  end_dep = re.compile('EndProjectSection$')
-  # A line describing a dependency.
-  dep_line = re.compile(' *({.*}) = ({.*})$')
-
-  in_deps = False
-  solution = open(solution_file)
-  for line in solution:
-    results = begin_project.search(line)
-    if results:
-      # Hack to remove icu because the diff is too different.
-      if results.group(1).find('icu') != -1:
-        continue
-      # We remove "_gyp" from the names because it helps to diff them.
-      current_project = results.group(1).replace('_gyp', '')
-      projects[current_project] = [results.group(2).replace('_gyp', ''),
-                                   results.group(3),
-                                   results.group(2)]
-      dependencies[current_project] = []
-      continue
-
-    results = end_project.search(line)
-    if results:
-      current_project = None
-      continue
-
-    results = begin_dep.search(line)
-    if results:
-      in_deps = True
-      continue
-
-    results = end_dep.search(line)
-    if results:
-      in_deps = False
-      continue
-
-    results = dep_line.search(line)
-    if results and in_deps and current_project:
-      dependencies[current_project].append(results.group(1))
-      continue
-
-  # Change all dependencies clsid to name instead.
-  for project in dependencies:
-    # For each dependencies in this project
-    new_dep_array = []
-    for dep in dependencies[project]:
-      # Look for the project name matching this cldis
-      for project_info in projects:
-        if projects[project_info][1] == dep:
-          new_dep_array.append(project_info)
-    dependencies[project] = sorted(new_dep_array)
-
-  return (projects, dependencies)
-
-def PrintDependencies(projects, deps):
-  print "---------------------------------------"
-  print "Dependencies for all projects"
-  print "---------------------------------------"
-  print "--                                   --"
-
-  for (project, dep_list) in sorted(deps.items()):
-    print "Project : %s" % project
-    print "Path : %s" % projects[project][0]
-    if dep_list:
-      for dep in dep_list:
-        print "  - %s" % dep
-    print ""
-
-  print "--                                   --"
-
-def PrintBuildOrder(projects, deps):
-  print "---------------------------------------"
-  print "Build order                            "
-  print "---------------------------------------"
-  print "--                                   --"
-
-  built = []
-  for (project, _) in sorted(deps.items()):
-    if project not in built:
-      BuildProject(project, built, projects, deps)
-
-  print "--                                   --"
-
-def PrintVCProj(projects):
-
-  for project in projects:
-    print "-------------------------------------"
-    print "-------------------------------------"
-    print project
-    print project
-    print project
-    print "-------------------------------------"
-    print "-------------------------------------"
-
-    project_path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[1]),
-                                                projects[project][2]))
-
-    pretty = pretty_vcproj
-    argv = [ '',
-             project_path,
-             '$(SolutionDir)=%s\\' % os.path.dirname(sys.argv[1]),
-           ]
-    argv.extend(sys.argv[3:])
-    pretty.main(argv)
-
-def main():
-  # check if we have exactly 1 parameter.
-  if len(sys.argv) < 2:
-    print 'Usage: %s "c:\\path\\to\\project.sln"' % sys.argv[0]
-    return 1
-
-  (projects, deps) = ParseSolution(sys.argv[1])
-  PrintDependencies(projects, deps)
-  PrintBuildOrder(projects, deps)
-
-  if '--recursive' in sys.argv:
-    PrintVCProj(projects)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/tools/gyp/tools/pretty_vcproj.py b/tools/gyp/tools/pretty_vcproj.py
deleted file mode 100755
index 6099bd7..0000000
--- a/tools/gyp/tools/pretty_vcproj.py
+++ /dev/null
@@ -1,329 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Make the format of a vcproj really pretty.
-
-   This script normalize and sort an xml. It also fetches all the properties
-   inside linked vsprops and include them explicitly in the vcproj.
-
-   It outputs the resulting xml to stdout.
-"""
-
-__author__ = 'nsylvain (Nicolas Sylvain)'
-
-import os
-import sys
-
-from xml.dom.minidom import parse
-from xml.dom.minidom import Node
-
-REPLACEMENTS = dict()
-ARGUMENTS = None
-
-
-class CmpTuple(object):
-  """Compare function between 2 tuple."""
-  def __call__(self, x, y):
-    return cmp(x[0], y[0])
-
-
-class CmpNode(object):
-  """Compare function between 2 xml nodes."""
-
-  def __call__(self, x, y):
-    def get_string(node):
-      node_string = "node"
-      node_string += node.nodeName
-      if node.nodeValue:
-        node_string += node.nodeValue
-
-      if node.attributes:
-        # We first sort by name, if present.
-        node_string += node.getAttribute("Name")
-
-        all_nodes = []
-        for (name, value) in node.attributes.items():
-          all_nodes.append((name, value))
-
-        all_nodes.sort(CmpTuple())
-        for (name, value) in all_nodes:
-          node_string += name
-          node_string += value
-
-      return node_string
-
-    return cmp(get_string(x), get_string(y))
-
-
-def PrettyPrintNode(node, indent=0):
-  if node.nodeType == Node.TEXT_NODE:
-    if node.data.strip():
-      print '%s%s' % (' '*indent, node.data.strip())
-    return
-
-  if node.childNodes:
-    node.normalize()
-  # Get the number of attributes
-  attr_count = 0
-  if node.attributes:
-    attr_count = node.attributes.length
-
-  # Print the main tag
-  if attr_count == 0:
-    print '%s<%s>' % (' '*indent, node.nodeName)
-  else:
-    print '%s<%s' % (' '*indent, node.nodeName)
-
-    all_attributes = []
-    for (name, value) in node.attributes.items():
-      all_attributes.append((name, value))
-      all_attributes.sort(CmpTuple())
-    for (name, value) in all_attributes:
-      print '%s  %s="%s"' % (' '*indent, name, value)
-    print '%s>' % (' '*indent)
-  if node.nodeValue:
-    print '%s  %s' % (' '*indent, node.nodeValue)
-
-  for sub_node in node.childNodes:
-    PrettyPrintNode(sub_node, indent=indent+2)
-  print '%s</%s>' % (' '*indent, node.nodeName)
-
-
-def FlattenFilter(node):
-  """Returns a list of all the node and sub nodes."""
-  node_list = []
-
-  if (node.attributes and
-      node.getAttribute('Name') == '_excluded_files'):
-      # We don't add the "_excluded_files" filter.
-    return []
-
-  for current in node.childNodes:
-    if current.nodeName == 'Filter':
-      node_list.extend(FlattenFilter(current))
-    else:
-      node_list.append(current)
-
-  return node_list
-
-
-def FixFilenames(filenames, current_directory):
-  new_list = []
-  for filename in filenames:
-    if filename:
-      for key in REPLACEMENTS:
-        filename = filename.replace(key, REPLACEMENTS[key])
-      os.chdir(current_directory)
-      filename = filename.strip('"\' ')
-      if filename.startswith('$'):
-        new_list.append(filename)
-      else:
-        new_list.append(os.path.abspath(filename))
-  return new_list
-
-
-def AbsoluteNode(node):
-  """Makes all the properties we know about in this node absolute."""
-  if node.attributes:
-    for (name, value) in node.attributes.items():
-      if name in ['InheritedPropertySheets', 'RelativePath',
-                  'AdditionalIncludeDirectories',
-                  'IntermediateDirectory', 'OutputDirectory',
-                  'AdditionalLibraryDirectories']:
-        # We want to fix up these paths
-        path_list = value.split(';')
-        new_list = FixFilenames(path_list, os.path.dirname(ARGUMENTS[1]))
-        node.setAttribute(name, ';'.join(new_list))
-      if not value:
-        node.removeAttribute(name)
-
-
-def CleanupVcproj(node):
-  """For each sub node, we call recursively this function."""
-  for sub_node in node.childNodes:
-    AbsoluteNode(sub_node)
-    CleanupVcproj(sub_node)
-
-  # Normalize the node, and remove all extranous whitespaces.
-  for sub_node in node.childNodes:
-    if sub_node.nodeType == Node.TEXT_NODE:
-      sub_node.data = sub_node.data.replace("\r", "")
-      sub_node.data = sub_node.data.replace("\n", "")
-      sub_node.data = sub_node.data.rstrip()
-
-  # Fix all the semicolon separated attributes to be sorted, and we also
-  # remove the dups.
-  if node.attributes:
-    for (name, value) in node.attributes.items():
-      sorted_list = sorted(value.split(';'))
-      unique_list = []
-      for i in sorted_list:
-        if not unique_list.count(i):
-          unique_list.append(i)
-      node.setAttribute(name, ';'.join(unique_list))
-      if not value:
-        node.removeAttribute(name)
-
-  if node.childNodes:
-    node.normalize()
-
-  # For each node, take a copy, and remove it from the list.
-  node_array = []
-  while node.childNodes and node.childNodes[0]:
-    # Take a copy of the node and remove it from the list.
-    current = node.childNodes[0]
-    node.removeChild(current)
-
-    # If the child is a filter, we want to append all its children
-    # to this same list.
-    if current.nodeName == 'Filter':
-      node_array.extend(FlattenFilter(current))
-    else:
-      node_array.append(current)
-
-
-  # Sort the list.
-  node_array.sort(CmpNode())
-
-  # Insert the nodes in the correct order.
-  for new_node in node_array:
-    # But don't append empty tool node.
-    if new_node.nodeName == 'Tool':
-      if new_node.attributes and new_node.attributes.length == 1:
-        # This one was empty.
-        continue
-    if new_node.nodeName == 'UserMacro':
-      continue
-    node.appendChild(new_node)
-
-
-def GetConfiguationNodes(vcproj):
-  #TODO(nsylvain): Find a better way to navigate the xml.
-  nodes = []
-  for node in vcproj.childNodes:
-    if node.nodeName == "Configurations":
-      for sub_node in node.childNodes:
-        if sub_node.nodeName == "Configuration":
-          nodes.append(sub_node)
-
-  return nodes
-
-
-def GetChildrenVsprops(filename):
-  dom = parse(filename)
-  if dom.documentElement.attributes:
-    vsprops = dom.documentElement.getAttribute('InheritedPropertySheets')
-    return FixFilenames(vsprops.split(';'), os.path.dirname(filename))
-  return []
-
-def SeekToNode(node1, child2):
-  # A text node does not have properties.
-  if child2.nodeType == Node.TEXT_NODE:
-    return None
-
-  # Get the name of the current node.
-  current_name = child2.getAttribute("Name")
-  if not current_name:
-    # There is no name. We don't know how to merge.
-    return None
-
-  # Look through all the nodes to find a match.
-  for sub_node in node1.childNodes:
-    if sub_node.nodeName == child2.nodeName:
-      name = sub_node.getAttribute("Name")
-      if name == current_name:
-        return sub_node
-
-  # No match. We give up.
-  return None
-
-
-def MergeAttributes(node1, node2):
-  # No attributes to merge?
-  if not node2.attributes:
-    return
-
-  for (name, value2) in node2.attributes.items():
-    # Don't merge the 'Name' attribute.
-    if name == 'Name':
-      continue
-    value1 = node1.getAttribute(name)
-    if value1:
-      # The attribute exist in the main node. If it's equal, we leave it
-      # untouched, otherwise we concatenate it.
-      if value1 != value2:
-        node1.setAttribute(name, ';'.join([value1, value2]))
-    else:
-      # The attribute does nto exist in the main node. We append this one.
-      node1.setAttribute(name, value2)
-
-    # If the attribute was a property sheet attributes, we remove it, since
-    # they are useless.
-    if name == 'InheritedPropertySheets':
-      node1.removeAttribute(name)
-
-
-def MergeProperties(node1, node2):
-  MergeAttributes(node1, node2)
-  for child2 in node2.childNodes:
-    child1 = SeekToNode(node1, child2)
-    if child1:
-      MergeProperties(child1, child2)
-    else:
-      node1.appendChild(child2.cloneNode(True))
-
-
-def main(argv):
-  """Main function of this vcproj prettifier."""
-  global ARGUMENTS
-  ARGUMENTS = argv
-
-  # check if we have exactly 1 parameter.
-  if len(argv) < 2:
-    print ('Usage: %s "c:\\path\\to\\vcproj.vcproj" [key1=value1] '
-           '[key2=value2]' % argv[0])
-    return 1
-
-  # Parse the keys
-  for i in range(2, len(argv)):
-    (key, value) = argv[i].split('=')
-    REPLACEMENTS[key] = value
-
-  # Open the vcproj and parse the xml.
-  dom = parse(argv[1])
-
-  # First thing we need to do is find the Configuration Node and merge them
-  # with the vsprops they include.
-  for configuration_node in GetConfiguationNodes(dom.documentElement):
-    # Get the property sheets associated with this configuration.
-    vsprops = configuration_node.getAttribute('InheritedPropertySheets')
-
-    # Fix the filenames to be absolute.
-    vsprops_list = FixFilenames(vsprops.strip().split(';'),
-                                os.path.dirname(argv[1]))
-
-    # Extend the list of vsprops with all vsprops contained in the current
-    # vsprops.
-    for current_vsprops in vsprops_list:
-      vsprops_list.extend(GetChildrenVsprops(current_vsprops))
-
-    # Now that we have all the vsprops, we need to merge them.
-    for current_vsprops in vsprops_list:
-      MergeProperties(configuration_node,
-                      parse(current_vsprops).documentElement)
-
-  # Now that everything is merged, we need to cleanup the xml.
-  CleanupVcproj(dom.documentElement)
-
-  # Finally, we use the prett xml function to print the vcproj back to the
-  # user.
-  #print dom.toprettyxml(newl="\n")
-  PrettyPrintNode(dom.documentElement)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/tools/idl_parser/idl_parser.py b/tools/idl_parser/idl_parser.py
index 2a3dd61..28aa1e2 100755
--- a/tools/idl_parser/idl_parser.py
+++ b/tools/idl_parser/idl_parser.py
@@ -2,7 +2,6 @@
 # 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.
-
 """ Parser for PPAPI IDL """
 
 #
@@ -29,6 +28,8 @@
 # pylint: disable=R0201
 # pylint: disable=C0301
 
+# pylint: disable=unidiomatic-typecheck,invalid-name
+
 import os.path
 import sys
 import time
@@ -38,9 +39,8 @@
 
 SRC_DIR = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)
 sys.path.insert(0, os.path.join(SRC_DIR, 'third_party'))
-from ply import lex
-from ply import yacc
-
+from ply import lex  # pylint:disable=wrong-import-position
+from ply import yacc  # pylint:disable=wrong-import-position
 
 #
 # ERROR_REMAP
@@ -48,14 +48,14 @@
 # Maps the standard error formula into a more friendly error message.
 #
 ERROR_REMAP = {
-  'Unexpected ")" after "(".' : 'Empty argument list.',
-  'Unexpected ")" after ",".' : 'Missing argument.',
-  'Unexpected "}" after ",".' : 'Trailing comma in block.',
-  'Unexpected "}" after "{".' : 'Unexpected empty block.',
-  'Unexpected comment after "}".' : 'Unexpected trailing comment.',
-  'Unexpected "{" after keyword "enum".' : 'Enum missing name.',
-  'Unexpected "{" after keyword "struct".' : 'Struct missing name.',
-  'Unexpected "{" after keyword "interface".' : 'Interface missing name.',
+    'Unexpected ")" after "(".': 'Empty argument list.',
+    'Unexpected ")" after ",".': 'Missing argument.',
+    'Unexpected "}" after ",".': 'Trailing comma in block.',
+    'Unexpected "}" after "{".': 'Unexpected empty block.',
+    'Unexpected comment after "}".': 'Unexpected trailing comment.',
+    'Unexpected "{" after keyword "enum".': 'Enum missing name.',
+    'Unexpected "{" after keyword "struct".': 'Struct missing name.',
+    'Unexpected "{" after keyword "interface".': 'Interface missing name.',
 }
 
 
@@ -79,6 +79,7 @@
 
   return itemsout
 
+
 def ExpandProduction(p):
   if type(p) == list:
     return '[' + ', '.join([ExpandProduction(x) for x in p]) + ']'
@@ -90,6 +91,7 @@
     return 'str:' + p
   return '%s:%s' % (p.__class__.__name__, str(p))
 
+
 # TokenTypeName
 #
 # Generate a string which has the type and value of the token.
@@ -99,9 +101,9 @@
     return 'symbol %s' % t.value
   if t.type in ['HEX', 'INT', 'OCT', 'FLOAT']:
     return 'value %s' % t.value
-  if t.type == 'string' :
+  if t.type == 'string':
     return 'string "%s"' % t.value
-  if t.type == 'COMMENT' :
+  if t.type == 'COMMENT':
     return 'comment'
   if t.type == t.value:
     return '"%s"' % t.value
@@ -117,8 +119,8 @@
 #
 # The Parser inherits the from the Lexer to provide PLY with the tokenizing
 # definitions.  Parsing patterns are encoded as functions where p_<name> is
-# is called any time a patern matching the function documentation is found.
-# Paterns are expressed in the form of:
+# is called any time a pattern matching the function documentation is found.
+# Patterns are expressed in the form of:
 # """ <new item> : <item> ....
 #                | <item> ...."""
 #
@@ -143,12 +145,12 @@
 #
 
 
-class IDLParser(object):
-#
-# We force all input files to start with two comments.  The first comment is a
-# Copyright notice followed by a file comment and finally by file level
-# productions.
-#
+class IDLParser(object):  # pylint: disable=missing-class-docstring
+  #
+  # We force all input files to start with two comments.  The first comment is a
+  # Copyright notice followed by a file comment and finally by file level
+  # productions.
+  #
   # [0] Insert a TOP definition for Copyright and Comments
   def p_Top(self, p):
     """Top : COMMENT COMMENT Definitions"""
@@ -169,11 +171,10 @@
     if len(p) > 1:
       p[0] = ListFromConcat(self.BuildComment('Comment', p, 1), p[2])
 
-
-#
-#The parser is based on the WebIDL standard.  See:
-# http://heycam.github.io/webidl/#idl-grammar
-#
+  #
+  # The parser is based on the WebIDL standard.  See:
+  # http://heycam.github.io/webidl/#idl-grammar
+  #
   # [1]
   def p_Definitions(self, p):
     """Definitions : ExtendedAttributeList Definition Definitions
@@ -343,11 +344,13 @@
                     | string
                     | '[' ']'"""
     if len(p) == 3:
-      p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'sequence'),
-                            self.BuildAttribute('VALUE', '[]'))
+      p[0] = ListFromConcat(
+          self.BuildAttribute('TYPE', 'sequence'),
+          self.BuildAttribute('VALUE', '[]'))
     elif type(p[1]) == str:
-      p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'DOMString'),
-                            self.BuildAttribute('NAME', p[1]))
+      p[0] = ListFromConcat(
+          self.BuildAttribute('TYPE', 'DOMString'),
+          self.BuildAttribute('NAME', p[1]))
     else:
       p[0] = p[1]
 
@@ -430,7 +433,7 @@
     p[0] = self.BuildNamed('Implements', p, 1, name)
 
   # [26]
-  def p_Const(self,  p):
+  def p_Const(self, p):
     """Const : CONST ConstType identifier '=' ConstValue ';'"""
     value = self.BuildProduction('Value', p, 5, p[5])
     p[0] = self.BuildNamed('Const', p, 3, ListFromConcat(p[2], value))
@@ -442,16 +445,18 @@
                   | integer
                   | null"""
     if type(p[1]) == str:
-      p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'integer'),
-                            self.BuildAttribute('NAME', p[1]))
+      p[0] = ListFromConcat(
+          self.BuildAttribute('TYPE', 'integer'),
+          self.BuildAttribute('NAME', p[1]))
     else:
       p[0] = p[1]
 
   # [27.1] Add definition for NULL
   def p_null(self, p):
     """null : NULL"""
-    p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'NULL'),
-                          self.BuildAttribute('NAME', 'NULL'))
+    p[0] = ListFromConcat(
+        self.BuildAttribute('TYPE', 'NULL'),
+        self.BuildAttribute('NAME', 'NULL'))
 
   # [28]
   def p_BooleanLiteral(self, p):
@@ -470,8 +475,8 @@
       val = '-Infinity'
     else:
       val = p[1]
-    p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'float'),
-                          self.BuildAttribute('VALUE', val))
+    p[0] = ListFromConcat(
+        self.BuildAttribute('TYPE', 'float'), self.BuildAttribute('VALUE', val))
 
   # [30]
   def p_Serializer(self, p):
@@ -918,7 +923,7 @@
   # [79] NOT IMPLEMENTED (BufferRelatedType)
 
   # [80]
-  def p_ConstType(self,  p):
+  def p_ConstType(self, p):
     """ConstType : PrimitiveType Null
                  | identifier Null"""
     if type(p[1]) == str:
@@ -927,7 +932,6 @@
       p[1].AddChildren(p[2])
       p[0] = p[1]
 
-
   # [81] Added StringType, OBJECT, DATE, REGEXP
   def p_PrimitiveType(self, p):
     """PrimitiveType : UnsignedIntegerType
@@ -944,7 +948,6 @@
     else:
       p[0] = p[1]
 
-
   # [82]
   def p_UnrestrictedFloatType(self, p):
     """UnrestrictedFloatType : UNRESTRICTED FloatType
@@ -956,7 +959,6 @@
       typeref.AddChildren(self.BuildTrue('UNRESTRICTED'))
     p[0] = typeref
 
-
   # [83]
   def p_FloatType(self, p):
     """FloatType : FLOAT
@@ -1019,7 +1021,6 @@
     if len(p) == 3:
       p[0] = ListFromConcat(self.BuildTrue('NULLABLE'), p[2])
 
-
   # [89]
   def p_TypeSuffixStartingWithArray(self, p):
     """TypeSuffixStartingWithArray : '[' ']' TypeSuffix
@@ -1112,26 +1113,26 @@
 # p_<type>_error functions defined above are called.  This allows the parser
 # to continue so as to capture more than one error per file.
 #
+
   def p_error(self, t):
     if t:
       lineno = t.lineno
       pos = t.lexpos
       prev = self.yaccobj.symstack[-1]
       if type(prev) == lex.LexToken:
-        msg = "Unexpected %s after %s." % (
-            TokenTypeName(t), TokenTypeName(prev))
+        msg = 'Unexpected %s after %s.' % (TokenTypeName(t),
+                                           TokenTypeName(prev))
       else:
-        msg = "Unexpected %s." % (t.value)
+        msg = 'Unexpected %s.' % (t.value)
     else:
       last = self.LastToken()
       lineno = last.lineno
       pos = last.lexpos
-      msg = "Unexpected end of file after %s." % TokenTypeName(last)
+      msg = 'Unexpected end of file after %s.' % TokenTypeName(last)
       self.yaccobj.restart()
 
     # Attempt to remap the error to a friendlier form
-    if msg in ERROR_REMAP:
-      msg = ERROR_REMAP[msg]
+    msg = ERROR_REMAP.get(msg, msg)
 
     self._last_error_msg = msg
     self._last_error_lineno = lineno
@@ -1147,8 +1148,8 @@
   def __init__(self, lexer, verbose=False, debug=False, mute_error=False):
     self.lexer = lexer
     self.tokens = lexer.KnownTokens()
-    self.yaccobj = yacc.yacc(module=self, tabmodule=None, debug=debug,
-                             optimize=0, write_tables=0)
+    self.yaccobj = yacc.yacc(
+        module=self, tabmodule=None, debug=debug, optimize=0, write_tables=0)
     self.parse_debug = debug
     self.verbose = verbose
     self.mute_error = mute_error
@@ -1158,17 +1159,17 @@
     self._last_error_lineno = 0
     self._last_error_pos = 0
 
-
 #
 # BuildProduction
 #
 # Production is the set of items sent to a grammar rule resulting in a new
 # item being returned.
 #
-# cls - The type of item being producted
+# cls - The type of item being produced
 # p - Is the Yacc production object containing the stack of items
 # index - Index into the production of the name for the item being produced.
 # childlist - The children of the new item
+
   def BuildProduction(self, cls, p, index, childlist=None):
     try:
       if not childlist:
@@ -1180,11 +1181,11 @@
       out = IDLNode(cls, filename, lineno, pos, childlist)
       return out
     except:
-      print 'Exception while parsing:'
+      print('Exception while parsing:')
       for num, item in enumerate(p):
-        print '  [%d] %s' % (num, ExpandProduction(item))
+        print('  [%d] %s' % (num, ExpandProduction(item)))
       if self.LastToken():
-        print 'Last token: %s' % str(self.LastToken())
+        print('Last token: %s' % str(self.LastToken()))
       raise
 
   def BuildNamed(self, cls, p, index, childlist=None):
@@ -1203,7 +1204,7 @@
       form = 'cc'
       for line in name.split('\n'):
         start = line.find('//')
-        lines.append(line[start+2:])
+        lines.append(line[start + 2:])
     else:
       # For C style, remove ending '*/''
       form = 'c'
@@ -1217,16 +1218,19 @@
           line = ''
         lines.append(line)
     name = '\n'.join(lines)
-    childlist = [self.BuildAttribute('NAME', name),
-                 self.BuildAttribute('FORM', form)]
+    childlist = [
+        self.BuildAttribute('NAME', name),
+        self.BuildAttribute('FORM', form)
+    ]
     return self.BuildProduction(cls, p, index, childlist)
 
 #
 # BuildError
 #
-# Build and Errror node as part of the recovery process.
+# Build and Error node as part of the recovery process.
 #
 #
+
   def BuildError(self, p, prod):
     self._parse_errors += 1
     name = self.BuildAttribute('NAME', self._last_error_msg)
@@ -1248,6 +1252,7 @@
 # which is applied to the adjacent item.  Attributes have no children and
 # instead represent key/value pairs.
 #
+
   def BuildAttribute(self, key, val):
     return IDLAttribute(key, val)
 
@@ -1262,11 +1267,13 @@
     # pylint: disable=W0212
     return self._parse_errors + self.lexer._lex_errors
 
+
 #
 # ParseData
 #
 # Attempts to parse the current data loaded in the lexer.
 #
+
   def ParseText(self, filename, data):
     self._parse_errors = 0
     self._parse_warnings = 0
@@ -1285,7 +1292,6 @@
     return None
 
 
-
 def ParseFile(parser, filename):
   """Parse a file and return a File type of node."""
   with open(filename) as fileobject:
@@ -1295,10 +1301,10 @@
       out.SetProperty('ERRORS', parser.GetErrors())
       return out
 
-    except Exception as e:
+    except Exception as e:  # pylint: disable=broad-except
       last = parser.LastToken()
-      sys.stderr.write('%s(%d) : Internal parsing error\n\t%s.\n' % (
-                       filename, last.lineno, str(e)))
+      sys.stderr.write('%s(%d) : Internal parsing error\n\t%s.\n' %
+                       (filename, last.lineno, str(e)))
 
 
 def main(argv):
@@ -1307,15 +1313,15 @@
   errors = 0
   for filename in argv:
     filenode = ParseFile(parser, filename)
-    if (filenode):
+    if filenode:
       errors += filenode.GetProperty('ERRORS')
       nodes.append(filenode)
 
   ast = IDLNode('AST', '__AST__', 0, 0, nodes)
 
-  print '\n'.join(ast.Tree(accept_props=['PROD']))
+  print('\n'.join(ast.Tree(accept_props=['PROD'])))
   if errors:
-    print '\nFound %d errors.\n' % errors
+    print('\nFound %d errors.\n' % errors)
 
   return errors
 
diff --git a/url/url.gyp b/url/url.gyp
deleted file mode 100644
index f83135b..0000000
--- a/url/url.gyp
+++ /dev/null
@@ -1,110 +0,0 @@
-# Copyright 2018 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-{
-  'variables': {
-    'chromium_code': 1,
-  },
-  'targets': [
-    {
-      'target_name': 'url',
-      'type': '<(component)',
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/starboard/starboard.gyp:starboard',
-        '<(DEPTH)/third_party/icu/icu.gyp:icudata',
-        '<(DEPTH)/third_party/icu/icu.gyp:icui18n',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-      ],
-      'sources': [
-        'gurl.cc',
-        'gurl.h',
-        'origin.cc',
-        'origin.h',
-        'scheme_host_port.cc',
-        'scheme_host_port.h',
-        'third_party/mozilla/url_parse.cc',
-        'third_party/mozilla/url_parse.h',
-        'url_canon.cc',
-        'url_canon.h',
-        'url_canon_etc.cc',
-        'url_canon_filesystemurl.cc',
-        'url_canon_fileurl.cc',
-        'url_canon_host.cc',
-        'url_canon_icu.cc',
-        'url_canon_icu.h',
-        'url_canon_internal.cc',
-        'url_canon_internal.h',
-        'url_canon_internal_file.h',
-        'url_canon_ip.cc',
-        'url_canon_ip.h',
-        'url_canon_mailtourl.cc',
-        'url_canon_path.cc',
-        'url_canon_pathurl.cc',
-        'url_canon_query.cc',
-        'url_canon_relative.cc',
-        'url_canon_stdstring.cc',
-        'url_canon_stdstring.h',
-        'url_canon_stdurl.cc',
-        'url_constants.cc',
-        'url_constants.h',
-        'url_export.h',
-        'url_file.h',
-        'url_idna_icu.cc',
-        'url_parse_file.cc',
-        'url_parse_internal.h',
-        'url_util.cc',
-        'url_util.h',
-        'url_util_internal.h',
-      ],
-      'conditions': [
-        ['component=="shared_library"', {
-          'defines': [
-            'GURL_DLL',
-            'GURL_IMPLEMENTATION=1',
-          ],
-          'direct_dependent_settings': {
-            'defines': [
-              'GURL_DLL',
-            ],
-          },
-        }],
-      ],
-    },
-    {
-      'target_name': 'url_unittests',
-      'type': '<(gtest_target_type)',
-      'dependencies': [
-        '<(DEPTH)/base/base.gyp:base',
-        '<(DEPTH)/base/base.gyp:base_i18n',
-        '<(DEPTH)/base/base.gyp:test_support_base',
-        '<(DEPTH)/testing/gmock.gyp:gmock',
-        '<(DEPTH)/testing/gtest.gyp:gtest',
-        '<(DEPTH)/third_party/icu/icu.gyp:icuuc',
-        'url',
-      ],
-      'sources': [
-        'gurl_unittest.cc',
-        'origin_unittest.cc',
-        'run_all_unittests.cc',
-        'scheme_host_port_unittest.cc',
-        'url_canon_icu_unittest.cc',
-        'url_canon_unittest.cc',
-        'url_parse_unittest.cc',
-        'url_test_utils.h',
-        'url_util_unittest.cc',
-      ],
-    },
-  ],
-}